source: sans/Dev/trunk/NCNR_User_Procedures/Analysis/Packages/Wrapper_v40.ipf @ 430

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

Added a new template "TotalTemplate?.pxt" that includes the package loader as part of the macros menu. from there, everything can be loaded (but nothing unloaded).

Many changes to SASCALC and MultiScatter? to make them correct, and play nice together. An XOP version is functional, but has not yet been added, and won't be until the MC simulation is checked for correctness. Without incoherent scattering, it looks good.

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