source: sans/Dev/trunk/NCNR_User_Procedures/SANS/Analysis/Models/Packages/Wrapper_v40.ipf @ 393

Last change on this file since 393 was 393, checked in by srkline, 14 years ago

DoSaveFileDialog? now takes two optional parameters, fname and suffix that can speed file save/rename, especially when used with the subtract1D operation.

Invariant now has a new macro to solve for the volume fraction.

PNGs are used wherever possible for reports. Gizmo window are still the oddball, and are limited to native platform formats.

File size: 37.3 KB
Line 
1#pragma rtGlobals=1             // Use modern global access method.
2#pragma version=4.00
3#pragma IgorVersion=6.0
4
5//
6// need a way of importing more functions into the experiment
7// ? call the picker panel from the panel?
8//
9//
10
11//Macro OpenWrapperPanel()
12//      Init_WrapperPanel()
13//End
14
15Function Init_WrapperPanel()
16        //make sure that folders exist - this is the first initialization to be called
17        NewDataFolder/O root:Packages
18        NewDataFolder/O root:Packages:NIST
19
20        //Create useful globals
21        Variable/G root:Packages:NIST:SANS_ANA_VERSION=4.00
22        String/G root:Packages:NIST:SANS_ANA_EXTENSION="_v40"
23        //Set this variable to 1 to force use of trapezoidal integration routine for USANS smearing
24        Variable/G root:Packages:NIST:USANSUseTrap = 0
25        Variable/G root:Packages:NIST:USANS_dQv = 0.117
26       
27        DoWindow/F WrapperPanel
28        if(V_flag==0)
29                if(exists("root:Packages:NIST:coefKWStr")==0)
30                        String/G root:Packages:NIST:coefKWStr=""
31                endif
32                if(exists("root:Packages:NIST:suffixKWStr")==0)
33                        String/G root:Packages:NIST:suffixKWStr=""
34                endif
35                Execute "WrapperPanel()"
36        endif
37End
38
39////////
40//
41// if model is Smeared, search the DF for coefficients
42// if new DF chosen, need to reset
43// if new model function, need to reset table
44//
45// create hold_mod (0/1), constr_low_mod, constr_hi_mod
46// in either DF (smeared) or in root: (normal)
47// and put these in the table as needed
48//
49Window WrapperPanel()
50        PauseUpdate; Silent 1           // building window...
51        NewPanel /W=(459,44,1113,499)/N=wrapperPanel/K=1 as "Curve Fit Setup"
52        ModifyPanel fixedSize=1
53       
54        GroupBox grpBox_0,pos={18,11},size={390,113}
55        GroupBox grpBox_1,pos={426,10},size={207,113}
56        GroupBox grpBox_2 title="No Fit",pos={10,130},size={0,0},frame=1,fSize=10,fstyle=1,fColor=(39321,1,1)
57        GroupBox grpBox_3 title="",pos={10,150},size={0,0},frame=1,fSize=10,fstyle=1,fColor=(39321,1,1)
58
59        Button button_1,pos={280,57},size={120,20},proc=PlotModelFunction,title="Plot 1D Function"
60        Button button_2,pos={300,93},size={100,20},proc=AppendModelToTarget,title="Append 1D"
61        Button button_3,pos={300,20},size={100,20},proc=W_LoadDataButtonProc,title="Load 1D Data"
62        PopupMenu popup_0,pos={30,21},size={218,20},title="Data Set",proc=DataSet_PopMenuProc
63        PopupMenu popup_0,mode=1,value= #"W_DataSetPopupList()"
64        PopupMenu popup_1,pos={30,57},size={136,20},title="Function"
65        PopupMenu popup_1,mode=1,value= #"W_FunctionPopupList()",proc=Function_PopMenuProc
66        PopupMenu popup_2,pos={30,93},size={123,20},title="Coefficients"
67        PopupMenu popup_2,mode=1,value= #"W_CoefPopupList()",proc=Coef_PopMenuProc
68        CheckBox check_0,pos={440,19},size={79,14},title="Use Cursors?",value= 0
69        CheckBox check_0,proc=UseCursorsWrapperProc
70        CheckBox check_1,pos={440,42},size={74,14},title="Use Epsilon?",value= 0
71        CheckBox check_2,pos={440,65},size={95,14},title="Use Constraints?",value= 0
72        CheckBox check_3,pos={530,18},size={72,14},title="2D Functions?",value= 0
73        CheckBox check_3 proc=Toggle2DControlsCheckProc
74        CheckBox check_4,pos={440,85},size={72,14},title="Report?",value= 0
75        CheckBox check_5,pos={454,103},size={72,14},title="Save it?",value= 0
76        //change draw order to put button over text of checkbox
77        Button button_0,pos={520,93},size={100,20},proc=DoTheFitButton,title="Do 1D Fit"
78        Button button_4,pos={520,126},size={100,20},proc=FeedbackButtonProc,title="Feedback"
79        Button button_5,pos={520,150},size={100,20},proc=FitHelpButtonProc,title="Help"
80
81        Edit/W=(20,174,634,435)/HOST=# 
82        ModifyTable width(Point)=0
83        RenameWindow #,T0
84        SetActiveSubwindow ##
85EndMacro
86
87//open the Help file for the Fit Manager
88Function FitHelpButtonProc(ba) : ButtonControl
89        STRUCT WMButtonAction &ba
90
91        switch( ba.eventCode )
92                case 2: // mouse up
93                        // click code here
94                        DisplayHelpTopic/Z/K=1 "Fit Manager"
95                        if(V_flag !=0)
96                                DoAlert 0,"The Fit Manager Help file could not be found"
97                        endif
98                        break
99        endswitch
100
101        return 0
102End
103
104
105//open the trac page for feedback
106Function FeedbackButtonProc(ba) : ButtonControl
107        STRUCT WMButtonAction &ba
108
109        switch( ba.eventCode )
110                case 2: // mouse up
111                        // click code here
112                        OpenTracTicketPage()
113                        break
114        endswitch
115
116        return 0
117End
118
119
120//obvious use, now finds the most recent data loaded, finds the folder, and pops the menu with that selection...
121//
122Function W_LoadDataButtonProc(ba) : ButtonControl
123        STRUCT WMButtonAction &ba
124
125        switch( ba.eventCode )
126                case 2: // mouse up
127                        // click code here
128                        String  topGraph= WinName(0,1)
129                        if(strlen(topGraph) != 0)
130                                DoWindow/F $topGraph                    //so that the panel is not on top
131                        endif
132                        Execute "A_LoadOneDData()"
133                       
134                        ControlUpdate/W=WrapperPanel popup_0
135                        //instead of a simple controlUpdate, better to pop the menu to make sure that the other menus follow
136                        // convoluted method to find the right item and pop the menu.
137
138                        // data is plotted, so get the "new" top graph
139                        topGraph= WinName(0,1)  //this is the topmost graph, and should exist, but...
140                        if(cmpstr(topGraph,"")==0)
141                                return(0)
142                        endif
143                        String list,folderStr
144                        Variable num
145                        list = TraceNameList(topGraph,";",1)            //want the last item in the list
146                        num= ItemsInList(list)
147                        FolderStr = StringFromList(num-1,list,";")
148                        folderStr = folderStr[0,strlen(folderStr)-3]            //remove the "_i" that the loader enforced
149                        list = W_DataSetPopupList()
150                        num=WhichListItem(folderStr,list,";",0,0)
151                        if(num != -1)
152                                PopupMenu popup_0,mode=num+1,win=WrapperPanel
153                                ControlUpdate/W=WrapperPanel popup_0
154                               
155                                // fake mouse up
156                                Struct WMPopupAction ps
157                                ps.eventCode = 2                //fake mouse up
158        //                      ps.popStr = str
159                                DataSet_PopMenuProc(ps)
160                               
161                                // new data set has been selected, always uncheck the "use cursors", other checkboxes are benign.
162                                CheckBox check_0,win=WrapperPanel,value=0
163                        endif
164                        break
165        endswitch
166
167
168        return 0
169End
170
171
172// is there a simpler way to do this?
173Function/S W_DataSetPopupList()
174
175        String str=GetAList(4),tmp="",onTargetStr=""
176        Variable ii
177//      ControlInfo/W=WrapperPanel check_3
178//      if(V_Value==1)          //if "from target" checked
179//              //ther must be a better way to do this
180//              onTargetStr = TraceNameList("",";",1)
181//              onTargetStr = ReplaceString("_i",onTargetStr,"")                //get rid of the "_i"
182//              for(ii=0;ii<ItemsInList(onTargetStr);ii+=1)
183//                      if(WhichListItem(StringFromList(ii,onTargetStr,";"), str  , ";") != -1)
184//                              tmp = Addlistitem(StringFromList(ii,onTargetStr,";"),tmp)               //only keep the matches w/data folder listing
185//                      endif
186//              endfor
187//              return(tmp)
188//      endif
189
190        if(strlen(str)==0)
191                str = "No data loaded"
192        endif
193        str = SortList(str)
194       
195        return(str)
196End
197
198
199// show the available models
200// not the f*(cw,xw) point calculations
201// not the *X(cw,xw) XOPS
202//
203// KIND:10 should show only user-defined curve fitting functions
204// - not XOPs
205// - not other user-defined functions
206Function/S W_FunctionPopupList()
207        String list,tmp
208        list = FunctionList("*",";","KIND:10")          //get every user defined curve fit function
209
210        //now start to remove everything the user doesn't need to see...
211               
212        tmp = FunctionList("*_proto",";","KIND:10")             //prototypes
213        list = RemoveFromList(tmp, list  ,";")
214        //prototypes that show up if GF is loaded
215        list = RemoveFromList("GFFitFuncTemplate", list)
216        list = RemoveFromList("GFFitAllAtOnceTemplate", list)
217        list = RemoveFromList("NewGlblFitFunc", list)
218        list = RemoveFromList("NewGlblFitFuncAllAtOnce", list)
219        list = RemoveFromList("GlobalFitFunc", list)
220        list = RemoveFromList("GlobalFitAllAtOnce", list)
221        list = RemoveFromList("GFFitAAOStructTemplate", list)
222        list = RemoveFromList("NewGF_SetXWaveInList", list)
223        list = RemoveFromList("NewGlblFitFuncAAOStruct", list)
224       
225        // more to remove as a result of 2D/Gizmo
226        list = RemoveFromList("A_WMRunLessThanDelta", list)
227        list = RemoveFromList("WMFindNaNValue", list)
228        list = RemoveFromList("WM_Make3DBarChartParametricWave", list)
229        list = RemoveFromList("UpdateQxQy2Mat", list)
230        list = RemoveFromList("MakeBSMask", list)
231       
232
233        tmp = FunctionList("f*",";","NPARAMS:2")                //point calculations
234        list = RemoveFromList(tmp, list  ,";")
235       
236        tmp = FunctionList("fSmear*",";","NPARAMS:3")           //smeared dependency calculations
237        list = RemoveFromList(tmp, list  ,";")
238       
239//      tmp = FunctionList("*X",";","KIND:4")           //XOPs, but these shouldn't show up if KIND:10 is used initially
240//      Print "X* = ",tmp
241//      print " "
242//      list = RemoveFromList(tmp, list  ,";")
243       
244        //non-fit functions that I can't seem to filter out
245        list = RemoveFromList("BinaryHS_PSF11;BinaryHS_PSF12;BinaryHS_PSF22;EllipCyl_Integrand;PP_Inner;PP_Outer;Phi_EC;TaE_Inner;TaE_Outer;",list,";")
246
247        if(strlen(list)==0)
248                list = "No functions plotted"
249        endif
250       
251        list = SortList(list)
252        return(list)
253End
254
255
256// show all the appropriate coefficient waves
257//
258// also need to search the folder listed in "data set" popup
259// for smeared coefs
260//
261// - or - restrict the coefficient list based on the model function
262// - new way, filter the possible values based on the data folder and function
263Function/S W_CoefPopupList()
264
265        String notPlotted="Please plot the function"
266        ControlInfo/W=wrapperpanel popup_1
267        String funcStr=S_Value
268        String coefStr=getFunctionCoef(funcStr)
269       
270        if(cmpstr(coefStr,"")==0)               //no correspondence in the KW string
271                return(notPlotted)
272        endif
273       
274       
275        //found a coefficient wave - only two places to look
276        // is it in the root folder?
277        if(exists("root:"+coefStr) != 0)
278                return(coefStr)
279        endif
280       
281        // is it in the data folder?
282        ControlInfo/W=wrapperpanel popup_0
283        String folderStr=S_Value
284        if(exists("root:"+folderStr+":"+coefStr) != 0)
285                return(coefStr)
286        endif
287
288        return(notPlotted)
289End
290
291// show all the appropriate coefficient waves
292//
293// also need to search the folder listed in "data set" popup
294// for smeared coefs
295//
296// - or - restrict the coefficient list based on the model function
297//
298// --old way
299//Function/S W_CoefPopupList()
300//      String list
301//      setDataFolder root:
302//      list = WaveList("coef*",";","")
303//     
304//      ControlInfo/W=wrapperpanel popup_0
305//      if(V_Value != 0)                //0== no items in menu
306//              if(DataFolderExists("root:"+S_Value))
307//                      SetDataFolder $("root:"+S_Value)
308//                      list += WaveList("*coef*",";","")
309//              endif
310//      endif
311//     
312//      // tmp coefficients that aren't being cleaned up from somewhere...
313//      list = RemoveFromList("temp_coef_1;temp_coef_2;", list  ,";")
314//
315//      if(strlen(list)==0)
316//              list = "No functions plotted"
317//      endif
318//      list = SortList(list)
319//     
320////    Print itemsinlist(list,";")
321//     
322//      setDataFolder root:
323//      return(list)
324//End
325
326// if the coefficients are changed, then update the table
327//
328//update the table
329// may be easier to just kill the subwindow (table) and create a new one
330// need to set/reset all of the waves in the table
331//
332// !! only respond to mouse up
333//
334Function Coef_PopMenuProc(pa) : PopupMenuControl
335        STRUCT WMPopupAction &pa
336
337        switch( pa.eventCode )
338                case 2: // mouse up
339                        Variable popNum = pa.popNum
340                        String popStr = pa.popStr
341                        String suffix = getModelSuffix(popStr)
342                        ControlInfo/W=WrapperPanel popup_0
343                        String folderStr=S_Value
344                       
345                        if(cmpstr(popStr,"Please plot the function")==0)
346//                              Print "function not plotted"
347                                return(0)
348                        endif
349
350// this if/else/endif should not ever return an error alert     
351// it should simply set the data folder properly       
352                        if(DataFolderExists("root:"+folderStr))
353                                SetDataFolder $("root:"+folderStr)
354                                if(!exists(popStr))
355                                        // must be unsmeared model, work in the root folder
356                                        SetDataFolder root:                             
357                                        if(!exists(popStr))             //this should be fine if the coef filter is working, but check anyhow
358                                                DoAlert 0,"the coefficient and data sets do not match (1)"
359                                                return 0
360                                        endif
361                                endif
362                        else
363                                // must be unsmeared model, work in the root folder
364                                SetDataFolder root:     
365                                if(!exists(popStr))             //this should be fine if the coef filter is working, but check anyhow
366                                        DoAlert 0,"the coefficient and data sets do not match (2)"
367                                        return 0
368                                endif
369                        endif
370                       
371                        // farm the work out to another function?
372                        Variable num=numpnts($popStr)
373                        // make the necessary waves if they don't exist already
374                        if(exists("Hold_"+suffix) == 0)
375                                Make/O/D/N=(num) $("epsilon_"+suffix),$("Hold_"+suffix)
376                                Make/O/T/N=(num) $("LoLim_"+suffix),$("HiLim_"+suffix)
377                                Wave eps = $("epsilon_"+suffix)
378                                Wave coef=$popStr
379                                if(eps[0] == 0)         //if eps already if filled, don't change it
380                                        eps = abs(coef*1e-4) + 1e-10                    //default eps is proportional to the coefficients
381                                endif
382                        endif
383                        // default epsilon values, sometimes needed for the fit
384                       
385
386                        WAVE/T LoLim = $("LoLim_"+suffix)
387                        WAVE/T HiLim = $("HiLim_"+suffix)
388                       
389                        // clear the table (a subwindow)
390                        DoWindow/F WrapperPanel                         // ?? had to add this in during all of the cursor meddling...
391                        KillWindow wrapperPanel#T0
392                        Edit/W=(20,174,634,435)/HOST=#
393                        RenameWindow #,T0
394                        // get them onto the table
395                        // how do I get the parameter name?
396                        String param = WaveList("*parameters_"+suffix, "", "TEXT:1," )          //this is *hopefully* one wave
397                        AppendtoTable/W=wrapperPanel#T0 $param,$(popStr)
398                        AppendToTable/W=wrapperPanel#T0 $("Hold_"+suffix),$("LoLim_"+suffix),$("HiLim_"+suffix),$("epsilon_"+suffix)
399                        ModifyTable width(Point)=0
400                       
401                        SetDataFolder root:
402                        break
403        endswitch
404
405        return 0
406End
407
408// if the Function is changed, then update the coef popup (if possible) and then the table (if possible)
409//
410// !! only respond to mouse up
411//
412Function Function_PopMenuProc(pa) : PopupMenuControl
413        STRUCT WMPopupAction &pa
414
415        switch( pa.eventCode )
416                case 2: // mouse up
417                        Variable popNum = pa.popNum
418                        String funcStr = pa.popStr
419                        String coefStr = W_CoefPopupList()
420                       
421//                      Print "coefStr = ",coefStr
422                       
423                        ControlInfo/W=WrapperPanel popup_0
424                        String folderStr=S_Value
425                       
426                        String listStr = W_CoefPopupList()
427                        Variable num=WhichListItem(coefStr, listStr, ";")
428                        String str=StringFromList(num, listStr  ,";")
429//                      print "str = ",str
430                        //set the item in the coef popup, and pop it
431                        PopupMenu popup_2 win=WrapperPanel,mode=(num+1)
432                       
433                        Struct WMPopupAction ps
434                        ps.eventCode = 2                //fake mouse up
435                        ps.popStr = str
436                        Coef_PopMenuProc(ps)
437                       
438                        SetDataFolder root:
439                        break
440        endswitch
441
442        return 0
443End
444
445// if the Data Set is changed, then update the function (if possible)
446// and the coef popup (if possible) and then the table (if possible)
447//
448// !! only respond to mouse up here, and simply send a fake mouse up
449// to the function pop, which will do what it can do
450//
451Function DataSet_PopMenuProc(pa) : PopupMenuControl
452        STRUCT WMPopupAction &pa
453
454        switch( pa.eventCode )
455                case 2: // mouse up
456                // make sure that the cursors are on/off appropriately
457                // check to make sure there really is a "topmost" graph         
458//                      String topGraph= WinName(0,1)   //this is the topmost graph
459//                      if(cmpstr(topGraph,"")==0)      //no graphs, uncheck and exit
460//                              CheckBox check_0,value=0
461//                      else
462//                              String ciStr = CsrInfo(A , topGraph)
463//                             
464//                              ControlInfo/W=wrapperpanel popup_0
465//                              String folderStr=S_Value
466//                              String traceList = TraceNameList(topGraph, ";", 1 )             
467//                     
468//                      endif
469                                               
470                        // then cascade the function/coefficient popups
471                        Struct WMPopupAction ps
472                        ps.eventCode = 2                //fake mouse up
473                        Function_PopMenuProc(ps)
474                       
475                        SetDataFolder root:
476                        break
477        endswitch
478
479        return 0
480End
481
482
483
484// always pass this the coefficient string
485//
486// either "coef_"
487// or "smear_coef_"
488//
489Function/S getFunctionCoef(funcStr)
490        String funcStr
491
492        SVAR listStr=root:Packages:NIST:coefKWStr
493        String coefStr = StringByKey(funcStr, listStr  ,"=",";",0)
494
495        return(coefStr)
496End
497
498// always pass this the coefficient string
499//
500// either "coef_"
501// or "smear_coef_"
502//
503// does NOT return the leading "_" as part of the suffix
504Function/S getModelSuffix(coefStr)
505        String coefStr
506
507        SVAR listStr=root:Packages:NIST:suffixKWStr
508        String suffixStr = StringByKey(coefStr, listStr  ,"=",";",0)
509
510        return(suffixStr)
511//      Variable pos,start=0
512
513//      if(stringmatch(coefStr,"smear_*") == 1)
514//              start=7 //look forwards to find "_", skipping "smear_coe" if necessary
515//      endif
516//      pos=Strsearch(coefStr,"_",start,0)
517        //Print start, pos
518//      return(coefStr[pos,strlen(coefStr)-1])
519End
520
521
522
523// - this is based on stringent "PlotNNN" naming requirements
524//
525//  ???
526// - how to kill the generated table and graph, that are not needed now
527//
528Function PlotModelFunction(ba) : ButtonControl
529        STRUCT WMButtonAction &ba
530
531        String folderStr,funcStr,coefStr,cmdStr=""
532        Variable useCursors,useEps,useConstr
533       
534        Variable killWhat=0             //kill nothing as default
535       
536        switch( ba.eventCode )
537                case 2: // mouse up
538                        ControlInfo/W=WrapperPanel popup_0
539                        folderStr=S_Value
540                       
541                        ControlInfo/W=WrapperPanel popup_1
542                        funcStr=S_Value
543                       
544                        // maybe nothing has been loaded yet...
545                        if(cmpstr(funcStr,"No functions plotted") == 0)
546                                break
547                        endif
548                       
549                        // check for smeared or smeared function
550                        if(stringmatch(funcStr, "Smear*" )==1)
551                                //it's a smeared model
552                                // check for the special case of RPA that has an extra parameter
553                                if(strsearch(funcStr, "RPAForm", 0 ,0) == -1)
554                                        sprintf cmdStr, "Plot%s(\"%s\")",funcStr,folderStr              //not RPA
555                                else
556                                        sprintf cmdStr, "Plot%s(\"%s\",)",funcStr,folderStr             //yes RPA, leave a comma for input
557                                endif
558                                killWhat = 1
559                        else
560                                // it's not,    don't kill the graph, just the table           
561                                sprintf cmdStr, "Plot%s()",funcStr
562                                killWhat = 2
563                        endif
564                       
565                        //Print cmdStr
566                        Execute cmdStr
567                       
568                        //pop the function menu to set the proper coefficients
569                        DoWindow/F WrapperPanel
570                        STRUCT WMPopupAction pa
571                        pa.popStr = funcStr
572                        pa.eventcode = 2
573                        Function_PopMenuProc(pa)
574       
575                        KillTopGraphAndTable(killWhat)          // crude
576       
577                        break
578        endswitch
579       
580        return 0
581End
582
583// passing 0 kills nothing
584// passing 1 kills the top graph and table
585// passing 2 kills the top table only
586//
587Function KillTopGraphAndTable(killwhat)
588        Variable killWhat
589       
590        String topGraph= WinName(0,1)   //this is the topmost graph     
591        String topTable= WinName(0,2)   //this is the topmost table
592
593        if(killWhat == 0)
594                return(0)
595        endif
596       
597        if(killWhat == 1)
598                KillWindow $topGraph
599                KillWindow $topTable
600        endif
601       
602        if(killWhat == 2)
603                KillWindow $topTable
604        endif
605       
606        return(0)
607End
608
609// How to bypass the step of plot and append?
610//
611// do it in two separate events
612//
613Function AppendModelToTarget(ba) : ButtonControl
614        STRUCT WMButtonAction &ba
615
616        String coefStr,suffix,yWStr,xWStr,folderStr
617       
618        switch( ba.eventCode )
619                case 2: // mouse up                     
620                        ControlInfo/W=WrapperPanel popup_2
621                        coefStr=S_Value
622                        suffix = getModelSuffix(coefStr)
623                       
624                        // check for smeared or smeared function
625                        if(stringmatch(coefStr, "smear*" )==1)
626                                //it's a smeared model
627                                ControlInfo/W=WrapperPanel popup_0
628                                folderStr=S_Value
629                                xWStr = "root:"+folderStr+":smeared_qvals"
630                                ywStr = "root:"+folderStr+":smeared_"+suffix
631                        else
632                                // it's not, so it's in the root folder
633                                xWStr = "xwave_"+suffix
634                                yWStr = "ywave_"+suffix
635                        endif
636                       
637                        Wave/Z yw = $yWStr
638                        Wave/Z xw = $xWStr
639                        if(WaveExists(yw) && WaveExists(xw))
640                                AppendtoGraph yw vs xw
641                        else
642                                DoAlert 0,"The selected model has not been plotted for the selected data set."
643                        endif
644                        break
645        endswitch
646       
647        return 0
648End
649
650
651// this should parse the panel and call the FitWrapper() function
652Function DoTheFitButton(ba) : ButtonControl
653        STRUCT WMButtonAction &ba
654
655        String folderStr,funcStr,coefStr
656        Variable useCursors,useEps,useConstr
657       
658        switch( ba.eventCode )
659                case 2: // mouse up
660                        ControlInfo/W=WrapperPanel popup_0
661                        folderStr=S_Value
662                       
663                        ControlInfo/W=WrapperPanel popup_1
664                        funcStr=S_Value
665                       
666                        ControlInfo/W=WrapperPanel popup_2
667                        coefStr=S_Value
668                       
669                        ControlInfo/W=WrapperPanel check_0
670                        useCursors=V_Value
671                        ControlInfo/W=WrapperPanel check_1
672                        useEps=V_Value
673                        ControlInfo/W=WrapperPanel check_2
674                        useConstr=V_Value
675                       
676                        if(!CheckFunctionAndCoef(funcStr,coefStr))
677                                DoAlert 0,"The coefficients and function type do not match. Please correct the selections in the popup menus."
678                                break
679                        endif
680                       
681                        FitWrapper(folderStr,funcStr,coefStr,useCursors,useEps,useConstr)
682                       
683                        //      DoUpdate (does not work!)
684                        //?? why do I need to force an update ??
685                        if(!exists("root:"+folderStr+":"+coefStr))
686                                Wave w=$coefStr
687                        else
688                                Wave w=$("root:"+folderStr+":"+coefStr) //smeared coefs in data folder
689                        endif
690                        w[0] += 1e-6
691                        w[0] -= 1e-6
692       
693                        break
694        endswitch
695       
696        return 0
697End
698
699Function CheckFunctionAndCoef(funcStr,coefStr)
700        String funcStr,coefStr
701       
702        SVAR listStr=root:Packages:NIST:coefKWStr
703        String properCoefStr = StringByKey(funcStr, listStr  ,"=",";",0)
704        if(cmpstr(coefStr,properCoefStr)==0)
705                return(1)               //true, the coef is the correct match
706        endif
707        return(0)                       //false, wrong coef
708End
709
710/////////////////////////////////
711
712// wrapper to do the desired fit
713//
714// folderStr is the data folder for the desired data set
715//
716//
717Function FitWrapper(folderStr,funcStr,coefStr,useCursors,useEps,useConstr)
718        String folderStr,funcStr,coefStr
719        Variable useCursors,useEps,useConstr
720
721        String suffix=getModelSuffix(coefStr)
722       
723        SetDataFolder $("root:"+folderStr)
724        if(!exists(coefStr))
725                // must be unsmeared model, work in the root folder
726                SetDataFolder root:                             
727                if(!exists(coefStr))            //this should be fine if the coef filter is working, but check anyhow
728                        DoAlert 0,"the coefficient and data sets do not match"
729                        return 0
730                endif
731        endif
732               
733        WAVE cw=$(coefStr)     
734        Wave hold=$("Hold_"+suffix)
735        Wave/T lolim=$("LoLim_"+suffix)
736        Wave/T hilim=$("HiLim_"+suffix)
737        Wave eps=$("epsilon_"+suffix)
738       
739// fill a struct instance whether I need one or not
740        String DF="root:"+folderStr+":"
741       
742        Struct ResSmearAAOStruct fs
743        WAVE/Z resW = $(DF+folderStr+"_res")                    //these may not exist, if 3-column data is used
744        WAVE/Z fs.resW =  resW
745        WAVE yw=$(DF+folderStr+"_i")
746        WAVE xw=$(DF+folderStr+"_q")
747        WAVE sw=$(DF+folderStr+"_s")
748        Wave fs.coefW = cw
749        Wave fs.yW = yw
750        Wave fs.xW = xw
751       
752        Duplicate/O yw $(DF+"FitYw")
753        WAVE fitYw = $(DF+"FitYw")
754        fitYw = NaN
755       
756        Variable useRes=0
757        if(stringmatch(funcStr, "Smear*"))              // if it's a smeared function, need a struct
758                useRes=1
759        endif
760       
761        // do not construct constraints for any of the coefficients that are being held
762        // -- this will generate an "unknown error" from the curve fitting
763        Make/O/T/N=0 constr
764        if(useConstr)
765                String constraintExpression
766                Variable i, nPnts=DimSize(lolim, 0),nextRow=0
767                for (i=0; i < nPnts; i += 1)
768                        if (strlen(lolim[i]) > 0 && hold[i] == 0)
769                                InsertPoints nextRow, 1, constr
770                                sprintf constraintExpression, "K%d > %s", i, lolim[i]
771                                constr[nextRow] = constraintExpression
772                                nextRow += 1
773                        endif
774                        if (strlen(hilim[i]) > 0 && hold[i] == 0)
775                                InsertPoints nextRow, 1, constr
776                                sprintf constraintExpression, "K%d < %s", i, hilim[i]
777                                constr[nextRow] = constraintExpression
778                                nextRow += 1
779                        endif
780                endfor
781        endif
782
783        // 20JUN if useCursors is true, and there are no cursors on the specified data set, uncheck and set to false
784        if(useCursors)
785                useCursors = AreCursorsCorrect(folderStr)
786        endif
787        //if useCursors, and the data is USANS, need to recalculate the matrix if the range is new
788        Variable pt1,pt2,newN,mPt1,mPt2
789        String noteStr
790        if(useCursors && (dimsize(resW,1) > 4) )
791                //where are the cursors, and what is the status of the current matrix?
792                if(pcsr(A) > pcsr(B))
793                        pt1 = pcsr(B)
794                        pt2 = pcsr(A)
795                else
796                        pt1 = pcsr(A)
797                        pt2 = pcsr(B)
798                endif
799               
800                noteStr = note(resW)
801                mPt1 = NumberByKey("P1",noteStr,"=",";")
802                mPt2 = NumberByKey("P2",noteStr,"=",";")
803                if((mPt1 != pt1) || (mPt2 != pt2) )
804                        // need to recalculate
805                        USANS_RE_CalcWeights(folderStr,pt1,pt2)
806                endif
807                Wave trimResW=$(DF+folderStr+"_res"+"t")        //put the trimmed resW in the struct for the fit!
808                Wave fs.resW=trimResW
809               
810                Print "Done recalculating the matrix"
811//////WRONG WAY
812//              Make/O/D/N=(newN,newN) $(DF+"crsrResW")
813//              WAVE crsrResW = $(DF+"crsrResW")
814//              crsrResW = resW[p+pt1][q+pt1]
815//              //assign to the struct
816//              WAVE fs.resW =  crsrResW               
817/////////////
818        endif
819       
820        if(!useCursors && (dimsize(resW,1) > 4) )
821                // avoid an odd sequence of y/n cursors that can lead to a truncated res matrix, but useCursors is not selected
822                if(waveExists($("root:"+folderStr+":weights_save")))
823                        Duplicate/O $("root:"+folderStr+":weights_save"), $("root:"+folderStr+":"+folderStr+"_res")
824                endif
825        endif
826       
827// create these variables so that FuncFit will set them on exit
828        Variable/G V_FitError=0                         //0=no err, 1=error,(2^1+2^0)=3=singular matrix
829        Variable/G V_FitQuitReason=0            //0=ok,1=maxiter,2=user stop,3=no chisq decrease
830       
831// don't use the auto-destination with no flag, it doesn't appear to work correctly
832// dispatch the fit
833        do
834                if(useRes && useEps && useCursors && useConstr)         //do it all
835                        FuncFit/H=getHStr(hold) /NTHR=0 $funcStr cw, yw[pcsr(A),pcsr(B)] /X=xw /W=sw /I=1 /E=eps /D=fitYw /C=constr /STRC=fs
836                        break
837                endif
838               
839                if(useRes && useEps && useCursors)              //no constr
840                        FuncFit/H=getHStr(hold) /NTHR=0 $funcStr cw, yw[pcsr(A),pcsr(B)] /X=xw /W=sw /I=1 /E=eps /D=fitYw /STRC=fs
841                        break
842                endif
843               
844                if(useRes && useEps && useConstr)               //no crsr
845                        FuncFit/H=getHStr(hold) /NTHR=0 $funcStr cw, yw /X=xw /W=sw /I=1 /E=eps /D=fitYw /C=constr /STRC=fs
846                        break
847                endif
848               
849                if(useRes && useCursors && useConstr)           //no eps
850                        FuncFit/H=getHStr(hold) /NTHR=0 $funcStr cw, yw[pcsr(A),pcsr(B)] /X=xw /W=sw /I=1 /D=fitYw /C=constr /STRC=fs
851                        break
852                endif
853               
854                if(useRes && useCursors)                //no eps, no constr
855                        FuncFit/H=getHStr(hold) /NTHR=0 $funcStr cw, yw[pcsr(A),pcsr(B)] /X=xw /W=sw /I=1 /D=fitYw /STRC=fs
856                        break
857                endif
858               
859                if(useRes && useEps)            //no crsr, no constr
860//                      Print "timing test for Cylinder_PolyRadius --- the supposedly threaded version ---"
861//                      Variable t0 = stopMStimer(-2)
862                        FuncFit/H=getHStr(hold) /NTHR=0 $funcStr cw, yw /X=xw /W=sw /I=1 /E=eps /D=fitYw /STRC=fs
863//                      t0 = (stopMSTimer(-2) - t0)*1e-6
864//                      Printf  "CylPolyRad fit time using res and eps and /NTHR=0 time = %g seconds\r\r",t0
865                       
866//                      cw[0] = .01
867//                      cw[1] = 20
868//                      cw[2] = 400
869//                      cw[3] = 0.2
870//                      cw[4] = 3e-6
871//                      cw[5] = 0.0
872//                     
873//                      t0 = stopMSTimer(-2)
874//                      FuncFit/H=getHStr(hold) $funcStr cw, yw /X=xw /W=sw /I=1 /E=eps /D=fitYw /STRC=fs
875//                      t0 = (stopMSTimer(-2) - t0)*1e-6
876//                      Printf  "CylPolyRad fit time using res and eps and NO THREADING time = %g seconds\r\r",t0
877                        break
878                endif
879       
880                if(useRes && useConstr)         //no crsr, no eps
881                        FuncFit/H=getHStr(hold) /NTHR=0 $funcStr cw, yw /X=xw /W=sw /I=1 /D=fitYw /C=constr /STRC=fs
882                        break
883                endif
884               
885                if(useRes)              //just res
886                        FuncFit/H=getHStr(hold) /NTHR=0 $funcStr cw, yw /X=xw /W=sw /I=1 /D=fitYw /STRC=fs
887                        break
888                endif
889               
890/////   same as above, but all without useRes (no /STRC flag)
891                if(useEps && useCursors && useConstr)           //do it all
892                        FuncFit/H=getHStr(hold) /NTHR=0 $funcStr cw, yw[pcsr(A),pcsr(B)] /X=xw /W=sw /I=1 /E=eps /D=fitYw /C=constr
893                        break
894                endif
895               
896                if(useEps && useCursors)                //no constr
897                        FuncFit/H=getHStr(hold) /NTHR=0 $funcStr cw, yw[pcsr(A),pcsr(B)] /X=xw /W=sw /I=1 /E=eps /D=fitYw
898                        break
899                endif
900               
901                if(useEps && useConstr)         //no crsr
902                        FuncFit/H=getHStr(hold) /NTHR=0 $funcStr cw, yw /X=xw /W=sw /I=1 /E=eps /D=fitYw /C=constr
903                        break
904                endif
905               
906                if(useCursors && useConstr)             //no eps
907                        FuncFit/H=getHStr(hold) /NTHR=0 $funcStr cw, yw[pcsr(A),pcsr(B)] /X=xw /W=sw /I=1 /D=fitYw /C=constr
908                        break
909                endif
910               
911                if(useCursors)          //no eps, no constr
912                        FuncFit/H=getHStr(hold) /NTHR=0 $funcStr cw, yw[pcsr(A),pcsr(B)] /X=xw /W=sw /I=1 /D=fitYw
913                        break
914                endif
915               
916                if(useEps)              //no crsr, no constr
917                        FuncFit/H=getHStr(hold) /NTHR=0 $funcStr cw, yw /X=xw /W=sw /I=1 /E=eps /D=fitYw
918                        break
919                endif
920       
921                if(useConstr)           //no crsr, no eps
922                        FuncFit/H=getHStr(hold) /NTHR=0 $funcStr cw, yw /X=xw /W=sw /I=1 /D=fitYw /C=constr
923                        break
924                endif
925               
926                //just a plain vanilla fit
927                FuncFit/H=getHStr(hold) /NTHR=0 $funcStr cw, yw /X=xw /W=sw /I=1 /D=fitYw
928       
929        while(0)
930       
931        // append the fit
932        // need to manage duplicate copies
933        // Don't plot the full curve if cursors were used (set fitYw to NaN on entry...)
934        String traces=TraceNameList("", ";", 1 )                //"" as first parameter == look on the target graph
935        if(strsearch(traces,"FitYw",0) == -1)
936                AppendToGraph FitYw vs xw
937        else
938                RemoveFromGraph FitYw
939                AppendToGraph FitYw vs xw
940        endif
941        ModifyGraph lsize(FitYw)=2,rgb(FitYw)=(0,0,0)
942       
943        DoUpdate                //force update of table and graph with fitted values (why doesn't this work? - the table still does not update)
944       
945        // report the results (to the panel?)
946        print "V_chisq = ",V_chisq
947        print cw
948        WAVE/Z w_sigma
949        print w_sigma
950        String resultStr=""
951               
952        //now re-write the results
953        sprintf resultStr,"Chi^2 = %g  Sqrt(X^2/N) = %g",V_chisq,sqrt(V_chisq/V_Npnts)
954        resultStr = PadString(resultStr,63,0x20)
955        GroupBox grpBox_2 title=resultStr
956        ControlUpdate/W=WrapperPanel grpBox_2
957        sprintf resultStr,"FitErr = %s : FitQuit = %s",W_ErrorMessage(V_FitError),W_QuitMessage(V_FitQuitReason)
958        resultStr = PadString(resultStr,63,0x20)
959        GroupBox grpBox_3 title=resultStr
960        ControlUpdate/W=WrapperPanel grpBox_3
961       
962        Variable yesSave=0,yesReport=0
963        ControlInfo/W=WrapperPanel check_4
964        yesReport = V_Value
965        ControlInfo/W=WrapperPanel check_5
966        yesSave = V_Value
967       
968       
969        if(yesReport)
970                String parStr=GetWavesDataFolder(cw,1)+ WaveList("*param*"+suffix, "", "TEXT:1," )              //this is *hopefully* one wave
971                String topGraph= WinName(0,1)   //this is the topmost graph
972       
973                DoUpdate                //force an update of the graph before making a copy of it for the report
974
975                W_GenerateReport(funcStr,folderStr,$parStr,cw,yesSave,V_chisq,W_sigma,V_npnts,V_FitError,V_FitQuitReason,V_startRow,V_endRow,topGraph)
976        endif
977       
978        SetDataFolder root:
979        return(0)
980End
981
982// parse something off of a table, or ?
983Function/S getHStr(hold)
984        Wave hold
985       
986        String str=""
987        Variable ii
988        for(ii=0;ii<numpnts(hold);ii+=1)
989                str += num2str(hold[ii])
990        endfor
991
992//      print str
993        if(strsearch(str, "1", 0) == -1)
994                return ("")
995        else
996                return(str)
997        endif
998End
999
1000//taken from SRK Auto_Fit, and modified to work better with FitWrapper
1001//must have AutoGraph as the name of the graph window (any size)
1002// func is the name of the function (for print only)
1003//par and coef are the exact names of the waves
1004//yesSave==1 will save the file(name=func+time)
1005//
1006Function W_GenerateReport(func,dataname,param,ans,yesSave,chiSq,sigWave,npts,fitErr,fitQuit,fitStart,fitEnd,topGraph)
1007        String func,dataname
1008        Wave/T param
1009        Wave ans
1010        Variable yesSave,chiSq
1011        Wave sigWave
1012        Variable npts,fitErr,fitQuit,fitStart,fitEnd
1013        String topGraph
1014       
1015        String str,pictStr="P_"
1016        String nb="Report"
1017               
1018        // bring report up
1019        DoWindow/F Report
1020        if (V_flag == 0)                // Report notebook doesn't exist ?
1021                NewNotebook/W=(10,45,550,620)/F=1/N=Report as "Report"
1022        endif
1023        // delete old stuff
1024        Notebook $nb selection={startOfFile, endOfFile}, text="\r", selection={startOfFile, startOfFile}
1025       
1026        //setup
1027        Notebook $nb defaultTab=36, statusWidth=252, pageMargins={72,72,72,72}
1028        Notebook $nb showRuler=1, rulerUnits=1, updating={1, 60}
1029        Notebook $nb newRuler=Normal, justification=0, margins={0,0,468}, spacing={0,0,0}, tabs={}, rulerDefaults={"Geneva",10,0,(0,0,0)}
1030//     
1031        // insert title
1032        Notebook $nb newRuler=Title, justification=1, rulerDefaults={"Times", 16, 1, (0, 0, 0)}
1033        sprintf str, "Fit to %s, %s, %s\r\r", func,Secs2Date(datetime, 0), time()
1034        Notebook $nb ruler=Title, text=str
1035       
1036        // insert fit results
1037        Variable num=numpnts(ans),ii=0
1038        Notebook $nb ruler=Normal
1039        Notebook $nb  margins={18,18,504}, tabs={63 + 3*8192}
1040        str = "Data file: " + dataname + "\r\r"
1041        Notebook $nb text=str
1042        Notebook $nb ruler=Normal
1043        Notebook $nb margins={18,18,504}, tabs={144,234,252}
1044        do
1045                sprintf str, "%s = \t%g\t±\t%g\r", param[ii],ans[ii],sigwave[ii]
1046                Notebook $nb text=str
1047                ii+=1
1048        while(ii<num)
1049       
1050        //
1051        // no "fitted range" for 2D data, so make sure that this exists before using it
1052        Wave/Z dataXw = $("root:"+dataname+":"+dataname+"_q")   
1053        //
1054        Notebook $nb ruler=Normal
1055        Notebook $nb  margins={18,18,504}, tabs={63+3*8192}, fStyle=1, textRGB=(65000,0,0)
1056       
1057        sprintf str,"chisq = %g\r",chisq
1058        Notebook $nb textRGB=(65000,0,0),fstyle=1,text=str
1059        sprintf str,"Npnts = %g \t\t Sqrt(X^2/N) = %g\r",npts,sqrt(chiSq/npts)
1060        Notebook $nb textRGB=(0,0,0),fstyle=0, text=str
1061        if(WaveExists(dataXw))
1062                sprintf str "Fitted range = [%d,%d] = %g < Q < %g\r",fitStart,fitEnd,dataXw(fitStart),dataXw(fitEnd)
1063                Notebook $nb textRGB=(0,0,0),fstyle=0, text=str
1064        endif
1065        sprintf str,"FitError = %s\t\tFitQuitReason = %s\r",W_ErrorMessage(FitErr),W_QuitMessage(FitQuit)
1066        Notebook $nb textRGB=(65000,0,0),fstyle=1,text=str
1067        Notebook $nb ruler=Normal
1068       
1069        // insert graphs
1070        if(WaveExists(dataXw))
1071                Notebook $nb picture={$topGraph(0, 0, 400, 300), -5, 1}, text="\r"
1072        //
1073        else            //must be 2D Gizmo
1074                Execute "ExportGizmo Clip"                      //this ALWAYS is a PICT or BMP. Gizmo windows are different...
1075                LoadPict/Q/O "Clipboard",tmp_Gizmo
1076                Notebook $nb picture={tmp_Gizmo(0, 0, 400, 300), 0, 1}, text="\r"
1077        endif
1078        //Notebook Report picture={Table1, 0, 0}, text="\r"
1079       
1080        // show the top of the report
1081        Notebook $nb  selection= {startOfFile, startOfFile},  findText={"", 1}
1082       
1083        //save the notebook and the graphic file
1084        if(yesSave)
1085                String nameStr=CleanupName(func,0)
1086                nameStr = nameStr[0,8]  //shorten the name
1087                nameStr += "_"+dataname
1088                //make sure the name is no more than 31 characters
1089                namestr = namestr[0,30]         //if shorter than 31, this will NOT pad to 31 characters
1090                Print "file saved as ",nameStr
1091                SaveNotebook /O/P=home/S=2 $nb as nameStr
1092                //save the graph separately as a PICT file, 2x screen
1093                pictStr += nameStr
1094                pictStr = pictStr[0,28]         //need a shorter name - why?
1095//              DoWindow/F $topGraph
1096                // E=-5 is png @screen resolution
1097                // E=2 is PICT @2x screen resolution
1098///             SavePICT /E=-5/O/P=home /I/W=(0,0,3,3) as pictStr
1099                if(WaveExists(dataXw))
1100                        SavePICT /E=-5/O/P=home/WIN=$topGraph /W=(0,0,400,300) as pictStr
1101                else
1102                        Execute "ExportGizmo /P=home as \""+pictStr+"\""
1103                        //SavePICT /E=-5/O/P=home/WIN=$topGraph /W=(0,0,400,300) as pictStr
1104                endif
1105        Endif
1106       
1107        // ???maybe print the notebook too?
1108End
1109
1110Function/S W_ErrorMessage(code)
1111        Variable code
1112       
1113        switch (code)
1114                case 0:
1115                        return "No Error"
1116                        break
1117                case 3: //2^0 + 2^1
1118                        return "Singular Matrix"
1119                        break
1120                case 5:         //(2^0 + 2^2)
1121                        return "Out of Memory"
1122                        break
1123                case 9:         //(2^0 + 2^3)
1124                        return "Func= NaN or Inf"
1125                        break
1126                default:
1127                        return "Unknown error code "+num2str(code)
1128        endswitch
1129end
1130
1131Function/S W_QuitMessage(code)
1132        Variable code
1133       
1134        switch (code)
1135                case 0:
1136                        return "No Error"
1137                        break
1138                case 1:
1139                        return "Max iterations - re-run fit"
1140                        break
1141                case 2:
1142                        return "User terminated fit"
1143                        break
1144                case 3:
1145                        return "No decrease in chi-squared"
1146                        break
1147                default:
1148                        return "Unknown Quit code "+num2str(code)
1149        endswitch
1150end
1151
1152Function Toggle2DControlsCheckProc(cba) : CheckBoxControl
1153        STRUCT WMCheckboxAction &cba
1154
1155        switch( cba.eventCode )
1156                case 2: // mouse up
1157                        Variable checked = cba.checked
1158                        if(checked)
1159                                //print "change the buttons to 2D"
1160                                Button button_0,proc=Do2DFitButtonProc,title="Do 2D Fit"
1161                                Button button_1,size={120,20},proc=Plot2DFunctionButtonProc,title="Plot 2D Function"
1162                                Button button_2,size={100,20},proc=Append2DModelButtonProc,title="Append 2D"
1163                                Button button_3,size={100,20},proc=Load2DDataButtonProc,title="Load 2D Data"
1164                               
1165                                Button button_2D_0,pos={550,60},size={70,20},proc=LogToggle2DButtonProc,title="Log/Lin"
1166                                Button button_2D_1,pos={520,37},size={100,20},proc=Plot2DButtonProc,title="Plot 2D Data"
1167                               
1168                                Button button_2D_0,disable=0            //visible again, and enabled
1169                                Button button_2D_1,disable=0
1170                        else
1171                                //print "unchecked, change them back to 1D"
1172                                Button button_0,pos={520,93},size={100,20},proc=DoTheFitButton,title="Do 1D Fit"
1173                                Button button_1,pos={280,57},size={120,20},proc=PlotModelFunction,title="Plot 1D Function"
1174                                Button button_2,pos={300,93},size={100,20},proc=AppendModelToTarget,title="Append 1D"
1175                                Button button_3,pos={300,20},size={100,20},proc=W_LoadDataButtonProc,title="Load 1D Data"
1176                               
1177                                Button button_2D_0,disable=3    //hide the extra 2D buttons, and disable
1178                                Button button_2D_1,disable=3
1179                        endif
1180                        break
1181        endswitch
1182
1183        return 0
1184End
1185
1186// function to either add or remove the cursors from the topmost graph, as needed
1187
1188Function UseCursorsWrapperProc(cba) : CheckBoxControl
1189        STRUCT WMCheckboxAction &cba
1190
1191
1192        switch( cba.eventCode )
1193                case 2: // mouse up
1194                        // check to make sure there really is a "topmost" graph         
1195                        String topGraph= WinName(0,1)   //this is the topmost graph
1196                        if(cmpstr(topGraph,"")==0)      //no graphs, uncheck and exit
1197                                CheckBox check_0,value=0
1198                                return(0)
1199                        endif
1200                               
1201                        String ciStr = CsrInfo(A , topGraph)
1202                       
1203                        ControlInfo/W=wrapperpanel popup_0
1204                        String folderStr=S_Value
1205                        String traceList = TraceNameList(topGraph, ";", 1 )             
1206               
1207                        Variable checked = cba.checked
1208                       
1209                        if(checked)
1210                                //print "add the cursors to the topmost graph, if the data set is there, or move them"
1211                                if(strlen(ciStr)==0 && strsearch(traceList, folderStr, 0) != -1 )               //no cursors && data is there
1212                                        ShowInfo
1213                                        Wave yw=$("root:"+folderStr+":"+folderStr+"_i")
1214                                        Cursor/P/W=$topGraph A, $(folderStr+"_i"),0
1215                                        Cursor/P/W=$topGraph/A=0 B, $(folderStr+"_i"),numpnts(yw)-1                     //deactivate the one at the high Q end
1216                                        DoUpdate
1217//                              else            //if (strlen(ciStr)!=0 && strsearch(traceList, folderStr, 0) != -1 ) //cursors present, but on wrong data
1218//                                      Wave yw=$("root:"+folderStr+":"+folderStr+"_i")
1219//                                      Cursor/P/W=$topGraph A, $(folderStr+"_i"),0                                                             //move the cursors
1220//                                      Cursor/P/W=$topGraph/A=0 B, $(folderStr+"_i"),numpnts(yw)-1
1221//                                      DoUpdate
1222                                endif
1223                       
1224                        else
1225                                //print "unchecked, remove the cursors"
1226                                // go back to the full matrix for the resolution calculation (not if SANS data...)
1227                                if(waveExists($("root:"+folderStr+":weights_save")))
1228                                        Duplicate/O $("root:"+folderStr+":weights_save"), $("root:"+folderStr+":"+folderStr+"_res")
1229                                endif
1230                                HideInfo
1231                                Cursor/K A
1232                                Cursor/K B
1233                        endif
1234                        break
1235        endswitch
1236
1237        return 0
1238End
1239
1240// returns 1 if the specified data is on the top graph && has cursors on it
1241// returns 0 and unchecks the box if anything is wrong
1242//
1243// only call this function if the cursor box is checked, to uncheck it as needed
1244// if the box is unchecked, leave it be.
1245//
1246Function AreCursorsCorrect(folderStr)
1247        String folderStr
1248       
1249        String topGraph= WinName(0,1)   //this is the topmost graph
1250        if(cmpstr(topGraph,"")==0)      //no graphs, uncheck and exit
1251                CheckBox check_0,win=wrapperpanel,value=0
1252                return(0)
1253        endif
1254               
1255        String traceAisOn = CsrWave(A , "", 0)
1256        if(     strsearch(traceAisOn, folderStr, 0) == -1)              //data and cursors don't match
1257                CheckBox check_0,win=wrapperpanel,value=0
1258                return(0)
1259        endif
1260       
1261        return(1)
1262End
Note: See TracBrowser for help on using the repository browser.