source: sans/Analysis/branches/ajj_23APR07/IGOR_Package_Files/Put in User Procedures/SANS_Models_v3.00/Packages/PlotUtils2D.ipf @ 223

Last change on this file since 223 was 200, checked in by srkline, 15 years ago

Changed 2D model calculations to use a FIXED 25 integration points in an effort to get the number of integration points out of the fitting coefficient wave.

Added "Freeze Model" back to the SANS Models menu

Added the 2D model functions to the list on the model picker

Minor tweaks to the wrapper

File size: 25.3 KB
Line 
1#pragma rtGlobals=1             // Use modern global access method.
2#pragma IgorVersion=6.0
3
4//
5// WARNING: there are a lot of assumptions that went into this code at the first pass
6// that will need to be made generic before a release to the wild
7//
8//
9// - some manipulations assume a square matrix
10// - naming schemes are assumed (to be documented)
11//
12//
13
14
15//
16//
17Proc LoadQxQy()
18
19        LoadWave/G/D/W/A
20        String fileName = S_fileName
21        Variable numCols = V_flag
22
23        String w0,w1,w2,n0,n1,n2
24               
25        // put the names of the three loaded waves into local names
26        n0 = StringFromList(0, S_waveNames ,";" )
27        n1 = StringFromList(1, S_waveNames ,";" )
28        n2 = StringFromList(2, S_waveNames ,";" )
29       
30        //remove the semicolon AND period from files from the VAX
31        w0 = CleanupName((S_fileName + "_qx"),0)
32        w1 = CleanupName((S_fileName + "_qy"),0)
33        w2 = CleanupName((S_fileName + "_i"),0)
34       
35        String baseStr=w1[0,strlen(w1)-4]
36        if(DataFolderExists("root:"+baseStr))
37                        DoAlert 1,"The file "+S_filename+" has already been loaded. Do you want to load the new data file, overwriting the data in memory?"
38                        if(V_flag==2)   //user selected No, don't load the data
39                                SetDataFolder root:
40                                KillWaves $n0,$n1,$n2           // kill the default waveX that were loaded
41                                //if(DataFolderExists("root:myGlobals"))
42                                //      String/G root:myGlobals:gLastFileName = filename
43                                //endif
44                                return          //quits the macro
45                        endif
46                        SetDataFolder $("root:"+baseStr)
47        else
48                NewDataFolder/S $("root:"+baseStr)
49        endif
50       
51        ////overwrite the existing data, if it exists
52        Duplicate/O $("root:"+n0), $w0
53        Duplicate/O $("root:"+n1), $w1
54        Duplicate/O $("root:"+n2), $w2
55       
56        Variable/G gIsLogScale = 0
57       
58        Variable num=numpnts($w0)
59        // assume that the Q-grid is "uniform enough" for DISPLAY ONLY
60        // use the 3 original waves for all of the fitting...
61        ConvertQxQy2Mat($w0,$w1,$w2,baseStr+"_mat")
62        Duplicate/O $(baseStr+"_mat"),$(baseStr+"_lin")                 //keep a linear-scaled version of the data
63       
64        PlotQxQy(baseStr)               //this sets the data folder back to root:!!
65       
66        //don't create the triplet - not really of much use
67//      Make/D/O/N=(num,3) $(baseStr+"_tri")
68//      $(baseStr+"_tri")[][0] = $w0[p]         // Qx
69//      $(baseStr+"_tri")[][1] = $w1[p]         // Qy
70//      $(baseStr+"_tri")[][2] = $w2[p]         // Intensity
71
72        //clean up             
73        SetDataFolder root:
74        KillWaves/Z $n0,$n1,$n2
75EndMacro
76
77//does not seem to need to be flipped at all from the standard QxQy output
78//
79// plots the data, as surface0, YellowHot color table
80//
81Proc PlotQxQy(str)
82        String str
83        Prompt str,"Pick the data folder containing 2D data",popup,getAList(4)
84
85        PauseUpdate; Silent 1   // Building Gizmo 6 window...
86
87        // Do nothing if the Gizmo XOP is not available.
88        if(exists("NewGizmo")!=4)
89                DoAlert 0, "Gizmo XOP must be installed"
90                return
91        endif
92
93        String data = "root:"+str+":"+str+"_mat"
94       
95        NewGizmo/N=$str/T=str /W=(169,44,495,359)
96        ModifyGizmo startRecMacro
97        AppendToGizmo Surface=$data,name=surface0
98
99        // for constant color (data is a blue color, lighter on the bottom)
100//      ModifyGizmo ModifyObject=surface0 property={ surfaceColorType,1}
101//      ModifyGizmo ModifyObject=surface0 property={ srcMode,0}
102//      ModifyGizmo ModifyObject=surface0 property={ frontColor,0.749996,0.811093,1,1}
103//      ModifyGizmo ModifyObject=surface0 property={ backColor,0.250019,0.433326,1,1}
104        //e constant color
105       
106        //for color table       
107        ModifyGizmo ModifyObject=surface0 property={ srcMode,0}
108//      ModifyGizmo ModifyObject=surface0 property={ surfaceCTab,Blue}
109        ModifyGizmo ModifyObject=surface0 property={ surfaceCTab,ColdWarm}
110        ModifyGizmo ModifyObject=surface0 property={ SurfaceCTABScaling,4}
111        //e color table
112       
113        AppendToGizmo Axes=boxAxes,name=axes0
114        ModifyGizmo ModifyObject=axes0,property={0,axisRange,-1,-1,-1,1,-1,-1}
115        ModifyGizmo ModifyObject=axes0,property={1,axisRange,-1,-1,-1,-1,1,-1}
116        ModifyGizmo ModifyObject=axes0,property={2,axisRange,-1,-1,-1,-1,-1,1}
117        ModifyGizmo ModifyObject=axes0,property={3,axisRange,-1,1,-1,-1,1,1}
118        ModifyGizmo ModifyObject=axes0,property={4,axisRange,1,1,-1,1,1,1}
119        ModifyGizmo ModifyObject=axes0,property={5,axisRange,1,-1,-1,1,-1,1}
120        ModifyGizmo ModifyObject=axes0,property={6,axisRange,-1,-1,1,-1,1,1}
121        ModifyGizmo ModifyObject=axes0,property={7,axisRange,1,-1,1,1,1,1}
122        ModifyGizmo ModifyObject=axes0,property={8,axisRange,1,-1,-1,1,1,-1}
123        ModifyGizmo ModifyObject=axes0,property={9,axisRange,-1,1,-1,1,1,-1}
124        ModifyGizmo ModifyObject=axes0,property={10,axisRange,-1,1,1,1,1,1}
125        ModifyGizmo ModifyObject=axes0,property={11,axisRange,-1,-1,1,1,-1,1}
126        ModifyGizmo ModifyObject=axes0,property={-1,axisScalingMode,1}
127        ModifyGizmo ModifyObject=axes0,property={-1,axisColor,0,0,0,1}
128        ModifyGizmo ModifyObject=axes0,property={0,ticks,3}
129        ModifyGizmo ModifyObject=axes0,property={1,ticks,3}
130        ModifyGizmo ModifyObject=axes0,property={2,ticks,3}
131        ModifyGizmo ModifyObject=axes0,property={0,fontScaleFactor,1.5}
132        ModifyGizmo ModifyObject=axes0,property={1,fontScaleFactor,1.5}
133        ModifyGizmo ModifyObject=axes0,property={2,fontScaleFactor,1.5}
134        ModifyGizmo setDisplayList=0, opName=clearColor0, operation=clearColor, data={1,0.917,0.75,1}
135        ModifyGizmo setDisplayList=1, object=surface0
136        ModifyGizmo setDisplayList=2, object=axes0
137        ModifyGizmo SETQUATERNION={0.521287,-0.097088,-0.138769,0.836408}
138        ModifyGizmo autoscaling=1
139        ModifyGizmo currentGroupObject=""
140        ModifyGizmo compile
141
142        ModifyGizmo NamedHook={GizmoContours,WMGizmoContoursNamedHook}
143        ModifyGizmo endRecMacro
144       
145// don't bother with the flat image plot right now
146       
147//      Display $yw vs $xw
148//      modifygraph log=0
149//      ModifyGraph mode=3,marker=16,zColor($yw)={$zw,*,*,YellowHot,0}
150//      ModifyGraph standoff=0
151//      ModifyGraph width={Aspect,1}
152//      ModifyGraph lowTrip=0.001
153
154End
155
156Macro FakeQxQy(minQx,maxQx,minQy,maxQy,numPix,dataFolder)
157        Variable minQx=-0.1,maxQx=0.1,minQy=-0.1,maxQy=0.1
158        Variable numPix=64
159        String dataFolder="fake2DData"
160
161        String baseStr=dataFolder
162       
163
164        if(DataFolderExists("root:"+baseStr))
165                        DoAlert 1,"Fake data "+baseStr+" has already been created. Do you want to overwrite this fake data set?"
166                        if(V_flag==2)   //user selected No, don't load the data
167                                SetDataFolder root:
168                                return          //quits the macro
169                        endif
170                        SetDataFolder $("root:"+baseStr)
171        else
172                NewDataFolder/S $("root:"+baseStr)
173        endif
174
175        Make/O/D/N=(numPix*numPix) $(baseStr+"_qx"),$(baseStr+"_qy"),$(baseStr+"_i")
176       
177        $(baseStr+"_i") = 1
178       
179        Make/O/D/N=(numPix) tmpX,tmpY
180       
181        variable delX,delY
182        delX = (maxQx - minQx)/numPix
183        delY = (maxQy - minQy)/numPix
184        tmpX = minQx + x*delX
185        tmpY = minQy + x*delY
186       
187        // get rid of Q=0 values in the waves (may be a bad actor in model calculations)
188        //
189        tmpX = (tmpX == 0) ? 1e-6 : tmpX
190        tmpY = (tmpY == 0) ? 1e-6 : tmpY
191       
192        // X wave varies more rapidly
193        // Y wave is blocks of values
194        Variable ii=0
195        do
196                $(baseStr+"_qy")[ii*numPix,(ii+1)*numPix] = tmpY[ii]
197                ii+=1
198        while(ii<numPix)
199       
200        $(baseStr+"_qx") = tmpX[mod(p,numPix)]
201       
202        Variable/G gIsLogScale = 0
203       
204        // assume that the Q-grid is "uniform enough" for DISPLAY ONLY
205        // use the 3 original waves for all of the fitting...
206        ConvertQxQy2Mat($(baseStr+"_qx"),$(baseStr+"_qy"),$(baseStr+"_i"),baseStr+"_mat")
207        Duplicate/O $(baseStr+"_mat"),$(baseStr+"_lin")                 //keep a linear-scaled version of the data
208       
209        PlotQxQy(baseStr)               //this sets the data folder back to root:!!
210
211        //clean up             
212        SetDataFolder root:
213       
214EndMacro
215
216// this assumes that:
217// --QxQy data was written out in the format specified by the Igor macros, that is the x varies most rapidly
218// --the matrix is square!
219//
220// probably some other stuff...
221//
222Function UpdateQxQy2Mat(Qx,Qy,inten,linMat,mat)
223        Wave Qx,Qy,inten,linMat,mat
224       
225        Variable xrows=DimSize(mat, 0 )                 //assumes square matrix!!
226       
227        String folderStr=GetWavesDataFolder(Qx,1)
228        NVAR gIsLogScale=$(folderStr+"gIsLogScale")
229       
230        linMat = inten[q*xrows+p]
231       
232        if(gIsLogScale)
233                mat = log(linMat)
234        else
235                mat = linMat
236        endif
237       
238        return(0)
239End
240
241// this assumes that:
242// --QxQy data was written out in the format specified by the Igor macros, that is the x varies most rapidly
243// --the matrix is square!
244//
245// probably some other stuff...
246//
247Function ConvertQxQy2Mat(Qx,Qy,inten,matStr)
248        Wave Qx,Qy,inten
249        String matStr
250       
251        String folderStr=GetWavesDataFolder(Qx,1)
252       
253        Variable num=sqrt(numpnts(Qx))          //assumes square matrix, Qx = num x num points long
254        Make/O/D/N=(num,num) $(folderStr + matStr)
255        Wave mat=$matStr
256       
257        WaveStats/Q Qx
258        SetScale/I x, V_min, V_max, "", mat
259        WaveStats/Q Qy
260        SetScale/I y, V_min, V_max, "", mat
261       
262        Variable xrows=num
263       
264        mat = inten[q*xrows+p]
265       
266        return(0)
267End
268
269
270//str is the full path to the surface to append
271Proc AppendSurfaceToGizmo(str)
272        String str
273       
274        PauseUpdate; Silent 1   // Building Gizmo 6 window...
275
276        AppendToGizmo/Z Surface=$str,name=surface1
277       
278        // for a constant color (model is darker on top, lighter on the bottom)
279        //need these two lines, plus a color
280        ModifyGizmo ModifyObject=surface1 property={ surfaceColorType,1}
281        ModifyGizmo ModifyObject=surface1 property={ srcMode,0}
282        //green
283        ModifyGizmo ModifyObject=surface1 property={ frontColor,0.528923,0.882353,0.321584,1}
284        ModifyGizmo ModifyObject=surface1 property={ backColor,0.300221,0.6,1.5259e-05,1}
285        //red
286//      ModifyGizmo ModifyObject=surface1 property={ frontColor,1,0.749996,0.749996,1}
287//      ModifyGizmo ModifyObject=surface1 property={ backColor,1,0.250019,0.250019,1}
288
289        ModifyGizmo ModifyObject=surface1 property={ SurfaceCTABScaling,4}
290       
291        // for a color table (maybe not a good choice for vizualization if data uses a color table)
292//      ModifyGizmo ModifyObject=surface1 property={ srcMode,0}
293//      ModifyGizmo ModifyObject=surface1 property={ surfaceCTab,Red}
294       
295//      ModifyGizmo setDisplayList=0, object=surface0
296//      ModifyGizmo setDisplayList=1, object=axes0
297        ModifyGizmo setDisplayList=3, object=surface1
298        ModifyGizmo SETQUATERNION={0.565517,-0.103105,-0.139134,0.806350}
299//      ModifyGizmo autoscaling=1
300//      ModifyGizmo currentGroupObject=""
301        ModifyGizmo compile
302
303//      ModifyGizmo endRecMacro
304End
305
306// would be nice, but I can't get this to work...
307//
308//Macro AdjustColorTables()
309//
310//      ModifyGizmo ModifyObject=surface1 property={ srcMode,0}
311//      ModifyGizmo ModifyObject=surface1 property={ surfaceCTab,Rainbow}
312//      ModifyGizmo setDisplayList=3, object=surface1
313////    ModifyGizmo SETQUATERNION={0.565517,-0.103105,-0.139134,0.806350}
314//      ModifyGizmo autoscaling=1
315//      ModifyGizmo currentGroupObject=""
316//      ModifyGizmo compile
317//     
318//end
319
320Function LogToggle2DButtonProc(ba) : ButtonControl
321        STRUCT WMButtonAction &ba
322
323        switch( ba.eventCode )
324                case 2: // mouse up
325                        // click code here
326                        String winStr=TopGizmoWindow()
327                        if(strlen(winstr)==0)
328                                Print "no gizmo window"
329                                break
330                        endif
331                        // the winStr is also the data folder
332                        // toggle everything in the data folder
333                        ToggleFolderScaling(winStr)             
334                        break
335        endswitch
336
337        return 0
338End
339
340Function Plot2DButtonProc(ba) : ButtonControl
341        STRUCT WMButtonAction &ba
342
343        switch( ba.eventCode )
344                case 2: // mouse up
345                        // click code here
346                        Execute "PlotQxQy()"
347                        break
348        endswitch
349
350        return 0
351End
352
353Function Append2DModelButtonProc(ba) : ButtonControl
354        STRUCT WMButtonAction &ba
355
356        switch( ba.eventCode )
357                case 2: // mouse up
358                        // click code here
359                        //str is the full path to the surface to append
360                        String DF=TopGizmoWindow()
361                        String str,funcStr,suffix
362                        ControlInfo/W=WrapperPanel popup_1
363                        funcStr = S_Value
364                        suffix = getModelSuffix(getFunctionCoef(funcStr))
365                        str = "root:"+DF+":"+suffix+"_mat"
366                       
367                        Execute "AppendSurfaceToGizmo(\""+str+"\")"
368//                      Print str
369                        break
370        endswitch
371
372        return 0
373End
374
375// toggle the scaling of every matrix in the folder
376Function ToggleFolderScaling(DF)
377        String DF
378
379        // look for waves DF+"_mat" (the data)
380        // and models prefix + "_mat"
381        SetDataFolder $("root:"+DF)
382        //check the global to see the state of the data
383        NVAR gIsLogScale = gIsLogScale
384       
385        String matrixList=WaveList("*_mat",";",""),item
386        Variable ii=0,num=itemsinlist(matrixlist,";"),len
387       
388        for(ii=0;ii<num;ii+=1)
389                        item = StringFromList(ii,matrixList,";")
390                        len = strlen(item)
391                        Wave w = $item
392                        Wave linW = $(item[0,len-5]+"_lin")
393                        if(gisLogScale)
394                                //make linear
395                                w=linW
396                        else   
397                                //make log scale
398                                w=log(linW)
399                        endif
400        endfor 
401       
402        // toggle the global
403        gIsLogScale = !gIsLogScale
404       
405        SetDataFolder root:
406        return(0)
407End
408
409
410Function Load2DDataButtonProc(ba) : ButtonControl
411        STRUCT WMButtonAction &ba
412
413        switch( ba.eventCode )
414                case 2: // mouse up
415                        // click code here
416                        Execute "LoadQxQy()"
417                        break
418        endswitch
419
420        return 0
421End
422
423
424// dispatch the fit
425Function Do2DFitButtonProc(ba) : ButtonControl
426        STRUCT WMButtonAction &ba
427
428        String folderStr,funcStr,coefStr
429        Variable useCursors,useEps,useConstr
430       
431        switch( ba.eventCode )
432                case 2: // mouse up
433                        ControlInfo/W=WrapperPanel popup_0
434                        folderStr=S_Value
435                       
436                        ControlInfo/W=WrapperPanel popup_1
437                        funcStr=S_Value
438                       
439                        ControlInfo/W=WrapperPanel popup_2
440                        coefStr=S_Value
441                       
442                        ControlInfo/W=WrapperPanel check_0
443                        useCursors=V_Value
444                        //
445                        // NO CURSORS for 2D waves - force to zero
446                        //
447                        useCursors = 0
448                        //
449                        ControlInfo/W=WrapperPanel check_1
450                        useEps=V_Value
451                        ControlInfo/W=WrapperPanel check_2
452                        useConstr=V_Value
453                       
454                        if(!CheckFunctionAndCoef(funcStr,coefStr))
455                                DoAlert 0,"The coefficients and function type do not match. Please correct the selections in the popup menus."
456                                break
457                        endif
458                       
459                        FitWrapper2D(folderStr,funcStr,coefStr,useCursors,useEps,useConstr)
460                       
461                        //      DoUpdate (does not work!)
462                        //?? why do I need to force an update ??
463                        if(!exists("root:"+folderStr+":"+coefStr))
464                                Wave w=$coefStr
465                        else
466                                Wave w=$("root:"+folderStr+":"+coefStr) //smeared coefs in data folder
467                        endif
468                        w[0] += 1e-6
469                        w[0] -= 1e-6
470       
471                        break
472        endswitch
473
474        return 0
475End
476
477// wrapper to do the desired fit, pretty much a clone of FitWrapper, the 1D version
478//
479// folderStr is the data folder for the desired data set
480//
481// Currently the limitations are:
482// - I have no error waves for the intensity
483// - There is no smeared model
484// - Cursors can't be used
485// - the report *probably* won't work
486Function FitWrapper2D(folderStr,funcStr,coefStr,useCursors,useEps,useConstr)
487        String folderStr,funcStr,coefStr
488        Variable useCursors,useEps,useConstr
489
490        String suffix=getModelSuffix(coefStr)
491       
492        SetDataFolder $("root:"+folderStr)
493        if(!exists(coefStr))
494                // must be unsmeared model, work in the root folder
495                SetDataFolder root:                             
496                if(!exists(coefStr))            //this should be fine if the coef filter is working, but check anyhow
497                        DoAlert 0,"the coefficient and data sets do not match"
498                        return 0
499                endif
500        endif
501               
502        WAVE cw=$(coefStr)     
503        Wave hold=$("Hold_"+suffix)
504        Wave/T lolim=$("LoLim_"+suffix)
505        Wave/T hilim=$("HiLim_"+suffix)
506        Wave eps=$("epsilon_"+suffix)
507       
508// fill a struct instance whether I need one or not
509        String DF="root:"+folderStr+":"
510       
511        Struct ResSmearAAOStruct fs
512//      WAVE resW = $(DF+folderStr+"_res")             
513//      WAVE fs.resW =  resW
514        WAVE inten=$(DF+folderStr+"_i")
515        WAVE Qx=$(DF+folderStr+"_qx")
516        WAVE Qy=$(DF+folderStr+"_qy")
517//      Wave fs.coefW = cw
518//      Wave fs.yW = yw
519//      Wave fs.xW = xw
520       
521        // generate my own error wave for I(qx,qy)
522        Duplicate/O inten sw
523        sw = sqrt(sw)           //assumes Poisson statistics for each cell (counter)
524//      sw = 0.05*sw            // uniform 5% error? tends to favor the low intensity too strongly
525
526        // generate my own mask wave - as a matrix first, then redimension to N*N vector
527        // default mask is two pixels all the way around, (0 is excluded, 1 is included)
528        WAVE DataMat=$(DF+folderStr+"_lin")
529        if(exists(DF+"mask") == 0)
530                Duplicate/O dataMat mask
531                Variable bsRadius=8             //pixels?
532                MakeBSMask(mask,bsRadius)
533        Endif
534       
535
536       
537//      Duplicate/O yw $(DF+"FitYw")
538//      WAVE fitYw = $(DF+"FitYw")
539//      fitYw = NaN
540
541        //for now, use res will always be 0 for 2D functions   
542        Variable useRes=0
543        if(stringmatch(funcStr, "Smear*"))              // if it's a smeared function, need a struct
544                useRes=1
545        endif
546       
547        // do not construct constraints for any of the coefficients that are being held
548        // -- this will generate an "unknown error" from the curve fitting
549        Make/O/T/N=0 constr
550        if(useConstr)
551                String constraintExpression
552                Variable i, nPnts=DimSize(lolim, 0),nextRow=0
553                for (i=0; i < nPnts; i += 1)
554                        if (strlen(lolim[i]) > 0 && hold[i] == 0)
555                                InsertPoints nextRow, 1, constr
556                                sprintf constraintExpression, "K%d > %s", i, lolim[i]
557                                constr[nextRow] = constraintExpression
558                                nextRow += 1
559                        endif
560                        if (strlen(hilim[i]) > 0 && hold[i] == 0)
561                                InsertPoints nextRow, 1, constr
562                                sprintf constraintExpression, "K%d < %s", i, hilim[i]
563                                constr[nextRow] = constraintExpression
564                                nextRow += 1
565                        endif
566                endfor
567        endif
568
569///// NO CURSORS for 2D waves
570        //if useCursors, and the data is USANS, need to feed a (reassigned) trimmed matrix to the fit
571//      Variable pt1,pt2,newN
572//      if(useCursors && (dimsize(resW,1) > 4) )
573//              if(pcsr(A) > pcsr(B))
574//                      pt1 = pcsr(B)
575//                      pt2 = pcsr(A)
576//              else
577//                      pt1 = pcsr(A)
578//                      pt2 = pcsr(B)
579//              endif
580//              newN = pt2 - pt1 + 1            // +1 includes both cursors in the fit
581//              Make/O/D/N=(newN,newN) $(DF+"crsrResW")
582//              WAVE crsrResW = $(DF+"crsrResW")
583//              crsrResW = resW[p+pt1][q+pt1]
584//              //assign to the struct
585//              WAVE fs.resW =  crsrResW               
586//      endif
587
588// create these variables so that FuncFit will set them on exit
589        Variable/G V_FitError=0                         //0=no err, 1=error,(2^1+2^0)=3=singular matrix
590        Variable/G V_FitQuitReason=0            //0=ok,1=maxiter,2=user stop,3=no chisq decrease
591       
592// don't use the auto-destination with no flag, it doesn't appear to work correctly
593// dispatch the fit
594        //      FuncFit/H="11110111111"/NTHR=0 Cylinder2D_D :cyl2d_c_txt:coef_Cyl2D_D  :cyl2d_c_txt:cyl2d_c_txt_i /X={:cyl2d_c_txt:cyl2d_c_txt_qy,:cyl2d_c_txt:cyl2d_c_txt_qx} /W=:cyl2d_c_txt:sw /I=1 /M=:cyl2d_c_txt:mask /D
595
596        do
597                if(useRes && useEps && useCursors && useConstr)         //do it all
598                        FuncFit/H=getHStr(hold) /NTHR=0 $funcStr cw, inten[pcsr(A),pcsr(B)] /X={Qx,Qy} /M=mask /W=sw /I=1 /D /E=eps /C=constr
599                        break
600                endif
601               
602                if(useRes && useEps && useCursors)              //no constr
603                        FuncFit/H=getHStr(hold) /NTHR=0 $funcStr cw, inten[pcsr(A),pcsr(B)] /X={Qx,Qy} /M=mask /W=sw /I=1 /D /E=eps
604                        break
605                endif
606               
607                if(useRes && useEps && useConstr)               //no crsr
608                        FuncFit/H=getHStr(hold) /NTHR=0 $funcStr cw, inten /X={Qx,Qy} /M=mask /W=sw /I=1 /D /E=eps /C=constr
609                        break
610                endif
611               
612                if(useRes && useCursors && useConstr)           //no eps
613                        FuncFit/H=getHStr(hold) /NTHR=0 $funcStr cw, inten[pcsr(A),pcsr(B)] /X={Qx,Qy} /M=mask /W=sw /I=1 /D /C=constr
614                        break
615                endif
616               
617                if(useRes && useCursors)                //no eps, no constr
618                        FuncFit/H=getHStr(hold) /NTHR=0 $funcStr cw, inten[pcsr(A),pcsr(B)] /X={Qx,Qy} /M=mask /W=sw /I=1 /D
619                        break
620                endif
621               
622                if(useRes && useEps)            //no crsr, no constr
623                        FuncFit/H=getHStr(hold) /NTHR=0 $funcStr cw, inten /X={Qx,Qy} /M=mask /W=sw /I=1 /D /E=eps
624                        break
625                endif
626       
627                if(useRes && useConstr)         //no crsr, no eps
628                        FuncFit/H=getHStr(hold) /NTHR=0 $funcStr cw, inten /X={Qx,Qy} /M=mask /W=sw /I=1 /D /C=constr
629                        break
630                endif
631               
632                if(useRes)              //just res
633                        FuncFit/H=getHStr(hold) /NTHR=0 $funcStr cw, inten /X={Qx,Qy} /M=mask /W=sw /I=1 /D
634                        break
635                endif
636               
637/////   same as above, but all without useRes (no /STRC flag)
638                if(useEps && useCursors && useConstr)           //do it all
639                        FuncFit/H=getHStr(hold) /NTHR=0 $funcStr cw, inten[pcsr(A),pcsr(B)] /X={Qx,Qy} /M=mask /W=sw /I=1 /D /E=eps /C=constr
640                        break
641                endif
642               
643                if(useEps && useCursors)                //no constr
644                        FuncFit/H=getHStr(hold) /NTHR=0 $funcStr cw, inten[pcsr(A),pcsr(B)] /X={Qx,Qy} /M=mask /W=sw /I=1 /D /E=eps
645                        break
646                endif
647               
648               
649                if(useEps && useConstr)         //no crsr
650                        FuncFit/H=getHStr(hold) /NTHR=0 $funcStr cw, inten /X={Qx,Qy} /M=mask /W=sw /I=1 /D /E=eps /C=constr
651                        break
652                endif
653               
654                if(useCursors && useConstr)             //no eps
655                        FuncFit/H=getHStr(hold) /NTHR=0 $funcStr cw, inten[pcsr(A),pcsr(B)] /X={Qx,Qy} /M=mask /W=sw /I=1 /D /C=constr
656                        break
657                endif
658               
659                if(useCursors)          //no eps, no constr
660                        FuncFit/H=getHStr(hold) /NTHR=0 $funcStr cw, inten[pcsr(A),pcsr(B)] /X={Qx,Qy} /M=mask /W=sw /I=1 /D
661                        break
662                endif
663               
664                if(useEps)              //no crsr, no constr
665                        FuncFit/H=getHStr(hold) /NTHR=0 $funcStr cw, inten /X={Qx,Qy} /M=mask /W=sw /I=1 /D /E=eps
666                        break
667                endif
668       
669                if(useConstr)           //no crsr, no eps
670                        FuncFit/H=getHStr(hold) /NTHR=0 $funcStr cw, inten /X={Qx,Qy} /M=mask /W=sw /I=1 /D /C=constr
671                        break
672                endif
673               
674                //just a plain vanilla fit
675                        FuncFit/H=getHStr(hold) /NTHR=0 $funcStr cw, inten /X={Qx,Qy} /M=mask /W=sw /I=1 /D
676       
677        while(0)
678       
679        // append the fit
680        // need to manage duplicate copies
681        // Don't plot the full curve if cursors were used (set fitYw to NaN on entry...)
682//      String traces=TraceNameList("", ";", 1 )                //"" as first parameter == look on the target graph
683//      if(strsearch(traces,"FitYw",0) == -1)
684//              AppendToGraph FitYw vs xw
685//      else
686//              RemoveFromGraph FitYw
687//              AppendToGraph FitYw vs xw
688//      endif
689//      ModifyGraph lsize(FitYw)=2,rgb(FitYw)=(0,0,0)
690       
691//      DoUpdate                //force update of table and graph with fitted values (why doesn't this work? - the table still does not update)
692       
693        // report the results (to the panel?)
694        print "V_chisq = ",V_chisq
695        print cw
696        WAVE w_sigma
697        print w_sigma
698        String resultStr=""
699               
700        //now re-write the results
701        sprintf resultStr,"Chi^2 = %g  Sqrt(X^2/N) = %g",V_chisq,sqrt(V_chisq/V_Npnts)
702        resultStr = PadString(resultStr,63,0x20)
703        GroupBox grpBox_2 title=resultStr
704        ControlUpdate/W=WrapperPanel grpBox_2
705        sprintf resultStr,"FitErr = %s : FitQuit = %s",W_ErrorMessage(V_FitError),W_QuitMessage(V_FitQuitReason)
706        resultStr = PadString(resultStr,63,0x20)
707        GroupBox grpBox_3 title=resultStr
708        ControlUpdate/W=WrapperPanel grpBox_3
709       
710        Variable yesSave=0,yesReport=0
711        ControlInfo/W=WrapperPanel check_4
712        yesReport = V_Value
713        ControlInfo/W=WrapperPanel check_5
714        yesSave = V_Value
715       
716       
717        if(yesReport)
718                String parStr=GetWavesDataFolder(cw,1)+ WaveList("*param*"+suffix, "", "TEXT:1," )              //this is *hopefully* one wave
719                String topGraph= TopGizmoWindow()       //this is the topmost Gizmo (XOP) window
720               
721                DoUpdate                //force an update of the graph before making a copy of it for the report
722       
723                W_GenerateReport(funcStr,folderStr,$parStr,cw,yesSave,V_chisq,W_sigma,V_npnts,V_FitError,V_FitQuitReason,V_startRow,V_endRow,topGraph)
724        endif
725       
726        SetDataFolder root:
727        return(0)
728End
729
730
731// right now, there are only unsmeared models, but I want experimental points
732// for the QxQy of the calculation - so get the folder string
733Function Plot2DFunctionButtonProc(ba) : ButtonControl
734        STRUCT WMButtonAction &ba
735
736        String folderStr,funcStr,coefStr,cmdStr=""
737       
738        Variable killWhat=0             //kill nothing as default
739
740        switch( ba.eventCode )
741                case 2: // mouse up
742                        ControlInfo/W=WrapperPanel popup_0
743                        folderStr=S_Value
744                       
745                        ControlInfo/W=WrapperPanel popup_1
746                        funcStr=S_Value
747                       
748                        // check for smeared or smeared function
749//                      if(stringmatch(funcStr, "Smear*" )==1)
750                                //it's a smeared model
751                                // check for the special case of RPA that has an extra parameter
752//                              if(strsearch(funcStr, "RPAForm", 0 ,0) == -1)
753                                        sprintf cmdStr, "Plot%s(\"%s\")",funcStr,folderStr              //not RPA
754//                              else
755//                                      sprintf cmdStr, "Plot%s(\"%s\",)",funcStr,folderStr             //yes RPA, leave a comma for input
756//                              endif
757//                      else
758//                              // it's not,                   
759//                              sprintf cmdStr, "Plot%s()",funcStr
760//                      endif
761                       
762                        //Print cmdStr
763                        Execute cmdStr
764                       
765                        //pop the function menu to set the proper coefficients
766                        DoWindow/F WrapperPanel
767                        STRUCT WMPopupAction pa
768                        pa.popStr = funcStr
769                        pa.eventcode = 2
770                        Function_PopMenuProc(pa)
771       
772                        KillWhat = 2            //kill just the table, leave the 2d visible for now
773                        KillTopGraphAndTable(killWhat)          // crude
774
775                        break
776        endswitch
777
778        return 0
779End
780
781// unused - all of this functionality has been added to the Wrapper Panel
782Window Plot_2D_Controls() : Panel
783        PauseUpdate; Silent 1           // building window...
784        NewPanel /W=(950,44,1250,244)
785        Button button0,pos={172,37},size={70,20},proc=LogToggle2DButtonProc,title="Log/Lin"
786        Button button1,pos={146,9},size={100,20},proc=Plot2DButtonProc,title="Plot 2D Data"
787        Button button2,pos={164,118},size={120,20},proc=Append2DModelButtonProc,title="Append Model"
788        PopupMenu popup_1,pos={9,84},size={132,20},proc=Function_PopMenuProc,title="Function"
789        PopupMenu popup_1,mode=1,popvalue="Cylinder2D",value= #"W_FunctionPopupList()"
790        Button button3,pos={11,9},size={100,20},proc=Load2DDataButtonProc,title="Load 2D Data"
791        Button button4,pos={164,161},size={120,20},proc=Do2DFitButtonProc,title="Do 2D Fit"
792        Button button5,pos={164,85},size={120,20},proc=Plot2DFunctionButtonProc,title="Plot 2D Function"
793EndMacro
794
795
796Function/S TopGizmoWindow()
797        Return(StringFromList(0,WinList("*",";","WIN:4096")))
798end
799
800////
801//
802Macro Plot2DVsPointNumber(str)
803        String str
804        Prompt str,"Pick the data folder containing 2D data",popup,getAList(4)
805
806        PauseUpdate; Silent 1           // building window...
807        String fldrSav0= GetDataFolder(1)
808        SetDataFolder $("root:"+str)
809        Display /W=(241,352,810,842) $(str+"_i")
810        SetDataFolder fldrSav0
811        ModifyGraph mode=3
812        ModifyGraph marker=19
813        ModifyGraph lSize=2
814        ModifyGraph rgb($(str+"_i"))=(0,0,0)
815        ModifyGraph msize=1
816        ModifyGraph grid=1
817        ModifyGraph log(left)=1
818        ModifyGraph mirror=2
819        if(exists("root:"+str+":sw"))
820                ErrorBars/T=0 $(str+"_i") Y,wave=($("root:"+str+":sw"),$("root:"+str+":sw"))
821        endif
822        SetDataFolder fldrSav0
823EndMacro
824
825//Macro CalculateChiSquared(str)
826//      String str
827//      Prompt str,"Pick the data folder containing 2D data",popup,getAList(4)
828//
829//
830//      String fldrSav0= GetDataFolder(1)
831//      SetDataFolder $("root:"+str)
832//
833//      Duplicate/O $(str+"_i") chi
834//      chi = ((zwave_cyl2D_D - $(str+"_i"))/sw )^2
835//     
836//      chi = (mask == 1) ? chi : 0
837//     
838//      Print sum(chi,-inf,inf)
839//     
840//      SetDataFolder fldrSav0
841//EndMacro
842
843
844Function MakeBSMask(mask,rad)
845        Wave mask
846        Variable rad
847
848
849// find the center based on the wave scaling
850        Variable xCtr,yCtr,Qzero=0
851        xCtr = (Qzero - DimOffset(Mask, 0))/DimDelta(Mask,0)
852        yCtr = (Qzero - DimOffset(Mask, 1))/DimDelta(Mask,1)
853
854        Print xctr,yctr
855
856//      Variable center = sqrt(numpnts(mask))/2 -0.5
857
858        mask = (sqrt((p-xCtr)^2+(q-yCtr)^2) < rad) ? 0 : 1
859
860        Variable xDim, yDim
861        xDim = DimSize(mask,0)
862        yDim = DimSize(mask,1)
863        mask[][0] = 0
864        mask[][1] = 0
865        mask[][yDim-2] = 0
866        mask[][yDim-1] = 0
867        mask[0][] = 0
868        mask[1][] = 0
869        mask[xDim-2][] = 0
870        mask[xDim-1][] = 0
871       
872        Redimension/N=(xDim*yDim) mask          //now 1D
873       
874       
875End
Note: See TracBrowser for help on using the repository browser.