source: sans/XOP_Dev/SANSAnalysis/XOP/SANSAnalysis.c @ 592

Last change on this file since 592 was 592, checked in by srkline, 13 years ago

Added new model functions (see ticket #239) to the XOP, also added to the library.

File size: 15.9 KB
Line 
1/*
2 *  SANSAnalysis.c
3 *  SANSAnalysis
4 *
5 *  Created by Andrew Jackson on 4/23/07.
6 *  Copyright 2007 __MyCompanyName__. All rights reserved.
7 *
8 */
9
10
11#include "XOPStandardHeaders.h"                 // Include ANSI headers, Mac headers, IgorXOP.h, XOP.h and XOPSupport.h
12#include "SANSAnalysis.h"
13#include "Cylinder.h"
14#include "Sphere.h"
15#include "TwoPhase.h"
16#include "StructureFactor.h"
17#include "ResolutionSmearing.h"
18#include "Func2D.h"
19
20static long
21RegisterFunction()
22{
23        int funcIndex;
24       
25        funcIndex = GetXOPItem(0);                      // Which function invoked ?
26        switch (funcIndex) {
27                //
28                // Sphere Model Functions
29                //
30                case 0:                                                 // y = MultiShellX(w,x) (curve fitting function).
31                        return((long)MultiShellSphereX);        // This function is called using the direct method.
32                        break;
33                case 1:                                                 // y = PolyMultiShellX(w,x) (curve fitting function).
34                        return((long)PolyMultiShellX);  // This function is called using the direct method.
35                        break;
36                case 2:                                                 // y = SphereFormX(w,x) (curve fitting function).
37                        return((long)SphereFormX);      // This function is called using the direct method.
38                        break;
39                case 3:                                                 // y = CoreShellX(w,x) (curve fitting function).
40                        return((long)CoreShellSphereX); // This function is called using the direct method.
41                        break;
42                case 4:                                                 // y = PolyCoreX(w,x) (curve fitting function).
43                        return((long)PolyCoreFormX);    // This function is called using the direct method.
44                        break;
45                case 5:                                                 // y = PolyCoreShellRatioX(w,x) (curve fitting function).
46                        return((long)PolyCoreShellRatioX);      // This function is called using the direct method.
47                        break;
48                case 6:                                                 // y = Vesicle_ULX(w,x) (curve fitting function).
49                        return((long)VesicleFormX);     // This function is called using the direct method.
50                        break;
51                case 7:                                                 // y = SchulzSpheresX(w,x) (curve fitting function).
52                        return((long)SchulzSpheresX);   // This function is called using the direct method.
53                        break;
54                case 8:                                                 // y = PolyRectSpheresX(w,x) (curve fitting function).
55                        return((long)PolyRectSpheresX); // This function is called using the direct method.
56                        break;
57                case 9:                                                 // y = PolyHardSphereIntensityX(w,x) (curve fitting function).
58                        return((long)PolyHardSpheresX); // This function is called using the direct method.
59                        break;
60                case 10:                                                        // y = BimodalSchulzSpheresX(w,x) (curve fitting function).
61                        return((long)BimodalSchulzSpheresX);    // This function is called using the direct method.
62                        break;
63                case 11:                                                        // y = GaussPolySphereX(w,x) (curve fitting function).
64                        return((long)GaussSpheresX);    // This function is called using the direct method.
65                        break;
66                case 12:                                                        // y = LogNormalPolySphereX(w,x) (curve fitting function).
67                        return((long)LogNormalSphereX); // This function is called using the direct method.
68                        break;
69                case 13:                                                        // y = BinaryHSX(w,x) (curve fitting function).
70                        return((long)BinaryHSX);        // This function is called using the direct method.
71                        break;
72                case 14:                                                        // y = BinaryHS_PSF11X(w,x) (curve fitting function).
73                        return((long)BinaryHS_PSF11X);  // This function is called using the direct method.
74                        break;
75        case 15:                                                        // y = BinaryHS_PSF12X(w,x) (curve fitting function).
76                        return((long)BinaryHS_PSF12X);  // This function is called using the direct method.
77                        break;
78                case 16:                                                        // y = BinaryHS_PSF22X(w,x) (curve fitting function).
79                        return((long)BinaryHS_PSF22X);  // This function is called using the direct method.
80                        break;
81                        //
82                        // Cylinder Model Functions
83                        //
84                case 17:                                                        // y = CylinderFormX(w,x) (curve fitting function).
85                        return((long)CylinderFormX);    // This function is called using the direct method.
86                        break;
87                case 18:                                                        // y = EllipCylFit76X(w,x) (curve fitting function).
88                        return((long)EllipCyl76X);      // This function is called using the direct method.
89                        break;
90                case 19:                                                        // y = EllipCylFit20X(w,x) (curve fitting function).
91                        return((long)EllipticalCylinderX);      // This function is called using the direct method.
92                        break;
93                case 20:                                                        // y = TriaxialEllipsoidX(w,x) (curve fitting function).
94                        return((long)TriaxialEllipsoidX);       // This function is called using the direct method.
95                        break;
96                case 21:                                                        // y = ParallelepipedX(w,x) (curve fitting function).
97                        return((long)ParallelepipedX);  // This function is called using the direct method.
98                        break;
99                case 22:                                                        // y = HollowCylinderX(w,x) (curve fitting function).
100                        return((long)HollowCylinderX);  // This function is called using the direct method.
101                        break;
102                case 23:                                                        // y = EllipsoidFormX(w,x) (curve fitting function).
103                        return((long)EllipsoidFormX);   // This function is called using the direct method.
104                        break;       
105                case 24:                                                        // y = Cyl_PolyRadiusX(w,x) (curve fitting function).
106                        return((long)Cyl_PolyRadiusX);  // This function is called using the direct method.
107                        break; 
108                case 25:                                                        // y = Cyl_PolyLengthX(w,x) (curve fitting function).
109                        return((long)Cyl_PolyLengthX);  // This function is called using the direct method.
110                        break; 
111                case 26:                                                        // y = CoreShellCylinderX(w,x) (curve fitting function).
112                        return((long)CoreShellCylinderX);       // This function is called using the direct method.
113                        break;
114                case 27:                                        // y = OblateFormX(w,x) (curve fitting function).
115                        return((long)OblateFormX);      // This function is called using the direct method.
116                        break;
117                case 28:                                        // y = ProlateFormX(w,x) (curve fitting function).
118                        return((long)ProlateFormX);     // This function is called using the direct method.
119                        break;
120                case 29:                                        // y = FlexExclVolCylX(w,x) (curve fitting function).
121                        return((long)FlexExclVolCylX);  // This function is called using the direct method.
122                        break;                       
123                case 30:                                        // y = FlexCyl_PolyLenX(w,x) (curve fitting function).
124                        return((long)FlexCyl_PolyLenX); // This function is called using the direct method.
125                        break;
126                case 31:                                        // y = FlexCyl_PolyRadX(w,x) (curve fitting function).
127                        return((long)FlexCyl_PolyRadX); // This function is called using the direct method.
128                        break;
129                case 32:                                        // y = FlexCyl_EllipX(w,x) (curve fitting function).
130                        return((long)FlexCyl_EllipX);   // This function is called using the direct method.
131                        break;
132                case 33:                                        // y = PolyCoShCylinderX(w,x) (curve fitting function).
133                        return((long)PolyCoShCylinderX);        // This function is called using the direct method.
134                        break;
135                case 34:                                        // y = StackedDisksX(w,x) (curve fitting function).
136                        return((long)StackedDiscsX);    // This function is called using the direct method.
137                        break;
138                case 35:                                        // y = LamellarFFX(w,x) (curve fitting function).
139                        return((long)LamellarFFX);      // This function is called using the direct method.
140                        break;
141                case 36:                                        // y = LamellarFF_HGX(w,x) (curve fitting function).
142                        return((long)LamellarFF_HGX);   // This function is called using the direct method.
143                        break;
144                case 37:                                        // y = LamellarPSX(w,x) (curve fitting function).
145                        return((long)LamellarPSX);      // This function is called using the direct method.
146                        break;
147                case 38:                                        // y = LamellarPS_HGX(w,x) (curve fitting function).
148                        return((long)LamellarPS_HGX);   // This function is called using the direct method.
149                        break;
150                        //
151                        // Two Phase Model Functions
152                        //
153                case 39:                                                        // y = TeubnerStreyModelX(w,x) (curve fitting function).
154                        return((long)TeubnerStreyModelX);       // This function is called using the direct method.
155                        break;
156                case 40:                                                        // y = Power_Law_ModelX(w,x) (curve fitting function).
157                        return((long)Power_Law_ModelX); // This function is called using the direct method.
158                        break;
159                case 41:                                                        // y = Peak_Lorentz_ModelX(w,x) (curve fitting function).
160                        return((long)Peak_Lorentz_ModelX);      // This function is called using the direct method.
161                        break;
162                case 42:                                                        // y = Peak_Gauss_ModelX(w,x) (curve fitting function).
163                        return((long)Peak_Gauss_ModelX);        // This function is called using the direct method.
164                        break;
165                case 43:                                                        // y = Lorentz_ModelX(w,x) (curve fitting function).
166                        return((long)Lorentz_ModelX);   // This function is called using the direct method.
167                        break;
168                case 44:                                                        // y = FractalX(w,x) (curve fitting function).
169                        return((long)FractalX); // This function is called using the direct method.
170                        break;
171                case 45:                                                        // y = DAB_ModelX(w,x) (curve fitting function).
172                        return((long)DAB_ModelX);       // This function is called using the direct method.
173                        break;
174                case 46:                                                        // y = OneLevelX(w,x) (curve fitting function).
175                        return((long)OneLevelX);        // This function is called using the direct method.
176                        break;
177                case 47:                                                        // y = TwoLevelX(w,x) (curve fitting function).
178                        return((long)TwoLevelX);        // This function is called using the direct method.
179                        break;
180                case 48:                                                        // y = ThreeLevelX(w,x) (curve fitting function).
181                        return((long)ThreeLevelX);      // This function is called using the direct method.
182                        break;
183                case 49:                                                        // y = FourLevelX(w,x) (curve fitting function).
184                        return((long)FourLevelX);       // This function is called using the direct method.
185                        break;
186                        //
187                        // Structure Factor Functions
188                        //
189                case 50:                                                        // y = HardSphereStructX(w,x) (curve fitting function).
190                        return((long)HardSphereStructX);        // This function is called using the direct method.
191                        break;
192                case 51:                                                        // y = SquareWellStructX(w,x) (curve fitting function).
193                        return((long)SquareWellStructX);        // This function is called using the direct method.
194                        break;
195                case 52:                                                        // y = StickyHS_StructX(w,x) (curve fitting function).
196                        return((long)StickyHS_StructX); // This function is called using the direct method.
197                        break;
198                case 53:                                                        // y = HayterPenfoldMSAX(w,x) (curve fitting function).
199                        return((long)HayterPenfoldMSAX);        // This function is called using the direct method.
200                        break;
201                case 54:                                                        // y = DiamCylX(a,b) (utility).
202                        return((long)DiamCylX);                 // This function is called using the direct method.
203                        break;
204                case 55:                                                        // y = DiamEllipX(a,b) (utility).
205                        return((long)DiamEllipX);                       // This function is called using the direct method.
206                        break;
207                        //
208                        // Resolution Smearing Functions
209                case 56:                                                        // y = Smear_Model_20_X (utility).
210                        return((long)Smear_Model_20_X);                 // This function is called using the direct method.
211                        break;
212                case 57:                                                        // y =Smear_Model_76_X (utility).
213                        return((long)Smear_Model_76_X);                 // This function is called using the direct method.
214                        break; 
215                case 58:                                                        // y =Smear_Model_76_X (utility).
216                        return((long)SmearedCyl_PolyRadiusX);                   // This function is called using the direct method.
217                        break;
218// 2D Functions from DANSE
219                case 59:                                                        // y = f(c,y,x)
220                        return((long)Cylinder_2D);                      // This function is called using the direct method.
221                        break;
222                case 60:                                                        // y = f(c,y,x)
223                        return((long)Cylinder_2D_Weight2D);                     // This function is called using the direct method.
224                        break;
225                case 61:                                                        // y = f(c,y,x)
226                        return((long)CoreShellCylinder_2D);                     // This function is called using the direct method.
227                        break;
228                case 62:                                                        // y = f(c,y,x)
229                        return((long)CoreShellCylinder_2D_Weight2D);                    // This function is called using the direct method.
230                        break;
231                case 63:                                                        // y = f(c,y,x)
232                        return((long)Ellipsoid_2D);                     // This function is called using the direct method.
233                        break;
234                case 64:                                                        // y = f(c,y,x)
235                        return((long)Ellipsoid_2D_Weight2D);                    // This function is called using the direct method.
236                        break;
237                case 65:                                                        // y = f(c,y,x)
238                        return((long)EllipticalCylinder_2D);                    // This function is called using the direct method.
239                        break;
240                case 66:                                                        // y = f(c,y,x)
241                        return((long)EllipticalCylinder_2D_Weight2D);                   // This function is called using the direct method.
242                        break;
243                case 67:                                                        // y = f(c,y,x)
244                        return((long)Sphere_2D);                        // This function is called using the direct method.
245                        break;
246/// new models added in 2008
247                case 68:                                                        // y = f(c,y,x)
248                        return((long)SpherocylinderX);                  // This function is called using the direct method.
249                        break;
250                case 69:                                                        // y = f(c,y,x)
251                        return((long)ConvexLensX);                      // This function is called using the direct method.
252                        break;
253                case 70:                                                        // y = f(c,y,x)
254                        return((long)DumbbellX);                        // This function is called using the direct method.
255                        break;
256                case 71:                                                        // y = f(c,y,x)
257                        return((long)CappedCylinderX);                  // This function is called using the direct method.
258                        break;
259                case 72:                                                        // y = f(c,y,x)
260                        return((long)BarbellX);                 // This function is called using the direct method.
261                        break;
262                case 73:                                                        // y = f(c,y,x)
263                        return((long)Lamellar_ParaCrystalX);                    // This function is called using the direct method.
264                        break;
265                        //
266                case 74:                                                        // y = f(c,y,x)
267                        return((long)BCC_ParaCrystalX);                 // This function is called using the direct method.
268                        break;
269                case 75:                                                        // y = f(c,y,x)
270                        return((long)FCC_ParaCrystalX);                 // This function is called using the direct method.
271                        break;
272                case 76:                                                        // y = f(c,y,x)
273                        return((long)SC_ParaCrystalX);                  // This function is called using the direct method.
274                        break;
275                case 77:                                                        // y = f(c,y,x)
276                        return((long)OneShellX);                        // This function is called using the direct method.
277                        break;
278                case 78:                                                        // y = f(c,y,x)
279                        return((long)TwoShellX);                        // This function is called using the direct method.
280                        break;
281                case 79:                                                        // y = f(c,y,x)
282                        return((long)ThreeShellX);                      // This function is called using the direct method.
283                        break;
284                case 80:                                                        // y = f(c,y,x)
285                        return((long)FourShellX);                       // This function is called using the direct method.
286                        break;
287                case 81:                                                        // y = f(c,y,x)
288                        return((long)PolyOneShellX);                    // This function is called using the direct method.
289                        break;
290                case 82:                                                        // y = f(c,y,x)
291                        return((long)PolyTwoShellX);                    // This function is called using the direct method.
292                        break;
293                case 83:                                                        // y = f(c,y,x)
294                        return((long)PolyThreeShellX);                  // This function is called using the direct method.
295                        break;
296                case 84:                                                        // y = f(c,y,x)
297                        return((long)PolyFourShellX);                   // This function is called using the direct method.
298                        break;
299                        //
300                case 85:                                                        // y = f(c,y,x)
301                        return((long)BroadPeakX);                       // This function is called using the direct method.
302                        break;
303                case 86:                                                        // y = f(c,y,x)
304                        return((long)CorrLengthX);                      // This function is called using the direct method.
305                        break;
306                case 87:                                                        // y = f(c,y,x)
307                        return((long)TwoLorentzianX);                   // This function is called using the direct method.
308                        break;
309                case 88:                                                        // y = f(c,y,x)
310                        return((long)TwoPowerLawX);                     // This function is called using the direct method.
311                        break;
312                case 89:                                                        // y = f(c,y,x)
313                        return((long)PolyGaussCoilX);                   // This function is called using the direct method.
314                        break;
315                case 90:                                                        // y = f(c,y,x)
316                        return((long)GaussLorentzGelX);                 // This function is called using the direct method.
317                        break;
318                case 91:                                                        // y = f(c,y,x)
319                        return((long)GaussianShellX);                   // This function is called using the direct method.
320                        break;
321                case 92:                                                        // y = f(c,y,x)
322                        return((long)FuzzySpheresX);                    // This function is called using the direct method.
323                        break;
324                case 93:                                                        // y = f(c,y,x)
325                        return((long)PolyCoreBicelleX);                 // This function is called using the direct method.
326                        break;
327                case 94:                                                        // y = f(c,y,x)
328                        return((long)CSParallelepipedX);                        // This function is called using the direct method.
329                        break;
330
331        }
332        return NIL;
333}
334
335/*      XOPEntry()
336
337This is the entry point from the host application to the XOP for all
338messages after the INIT message.
339*/
340static void
341XOPEntry(void)
342{       
343        long result = 0;
344       
345        switch (GetXOPMessage()) {
346                case FUNCADDRS:
347                        result = RegisterFunction();    // This tells Igor the address of our function.
348                        break;
349        }
350        SetXOPResult(result);
351}
352
353/*      main(ioRecHandle)
354
355This is the initial entry point at which the host application calls XOP.
356The message sent by the host must be INIT.
357main() does any necessary initialization and then sets the XOPEntry field of the
358ioRecHandle to the address to be called for future messages.
359*/
360HOST_IMPORT void
361main(IORecHandle ioRecHandle)
362{       
363        XOPInit(ioRecHandle);                                                   // Do standard XOP initialization.
364        SetXOPEntry(XOPEntry);                                                  // Set entry point for future calls.
365       
366        if (igorVersion < 600) {                                                // checks required for ThreadSafe declarations
367                SetXOPResult(IGOR_OBSOLETE);
368        }
369        else {
370                if (igorVersion >= 700)
371                        SetXOPResult(IGOR_OBSOLETE);
372                else
373                        SetXOPResult(0L);
374        }
375}
376
377
Note: See TracBrowser for help on using the repository browser.