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

Last change on this file since 891 was 891, checked in by srkline, 10 years ago

Changes so that the simulation in SASCALC will work well together - it makes sure that the analysis package is loaded if the simulation checkbox is selected.

File size: 72.3 KB
Line 
1#pragma rtGlobals=1             // Use modern global access method.
2#pragma version=4.10
3#pragma IgorVersion=6.1
4
5
6// this is the flag for the relative error = W_sigma/coef that will
7// trip the bold/red color of W_sigma in the table.
8//
9Constant kRelErrorTolerance=0.5
10
11//Macro OpenWrapperPanel()
12//      Init_WrapperPanel()
13//End
14
15Function Init_WrapperPanel()
16
17        if(itemsinlist(WinList("SA_includes_v400.ipf", ";","INCLUDE:6"),";") != 0)
18                //must be opening a v4.00 or earlier template
19                DoAlert 0,"This experiment was created with an old version (v4.0) of the macros. I'll try to make this work, but please start new work with a current version"
20        endif
21       
22        //make sure that folders exist - this is the first initialization to be called
23        NewDataFolder/O root:Packages
24        NewDataFolder/O root:Packages:NIST
25
26        //Create useful globals
27        Variable/G root:Packages:NIST:SANS_ANA_VERSION=4.10
28        String/G root:Packages:NIST:SANS_ANA_EXTENSION="_v40"
29        //Set this variable to 1 to force use of trapezoidal integration routine for USANS smearing
30        Variable/G root:Packages:NIST:USANSUseTrap = 0
31        Variable/G root:Packages:NIST:USANS_dQv = 0.117
32        Variable/G root:Packages:NIST:gUseGenCurveFit = 0                       //set to 1 to use genetic optimization
33                       
34        //Ugly. Put this here to make sure things don't break
35        String/G root:Packages:NIST:gXMLLoader_Title
36       
37       
38        //initializes preferences. this includes XML y/n, and SANS Reduction items.
39        // if they already exist, they won't be overwritten
40        Execute "Initialize_Preferences()"             
41       
42        DoWindow/F WrapperPanel
43        if(V_flag==0)
44                if(exists("root:Packages:NIST:coefKWStr")==0)
45                        String/G root:Packages:NIST:coefKWStr=""
46                endif
47                if(exists("root:Packages:NIST:suffixKWStr")==0)
48                        String/G root:Packages:NIST:suffixKWStr=""
49                endif
50                if(exists("root:Packages:NIST:paramKWStr")==0)
51                        String/G root:Packages:NIST:paramKWStr=""
52                endif
53                Execute "WrapperPanel()"
54        endif
55End
56
57////////
58//
59// if model is Smeared, search the DF for coefficients
60// if new DF chosen, need to reset
61// if new model function, need to reset table
62//
63// create hold_mod (0/1), constr_low_mod, constr_hi_mod
64// in either DF (smeared) or in root: (normal)
65// and put these in the table as needed
66//
67Window WrapperPanel()
68        PauseUpdate; Silent 1           // building window...
69        NewPanel /W=(459,44,1113,499)/N=wrapperPanel/K=1 as "Curve Fit Setup"
70        ModifyPanel fixedSize=1
71       
72        GroupBox grpBox_0,pos={18,11},size={390,113}
73        GroupBox grpBox_1,pos={426,10},size={207,113}
74        GroupBox grpBox_2 title="No Fit",pos={10,130},size={0,0},frame=1,fSize=10,fstyle=1,fColor=(39321,1,1)
75        GroupBox grpBox_3 title="",pos={10,150},size={0,0},frame=1,fSize=10,fstyle=1,fColor=(39321,1,1)
76
77        Button button_1,pos={280,57},size={120,20},proc=PlotModelFunction,title="Plot 1D Function"
78        Button button_2,pos={300,93},size={100,20},proc=AppendModelToTarget,title="Append 1D"
79        Button button_3,pos={300,20},size={100,20},proc=W_LoadDataButtonProc,title="Load 1D Data"
80        PopupMenu popup_0,pos={30,21},size={218,20},title="Data Set",proc=DataSet_PopMenuProc
81        PopupMenu popup_0,mode=1,value= #"W_DataSetPopupList()"
82        PopupMenu popup_1,pos={30,57},size={136,20},title="Function"
83        PopupMenu popup_1,mode=1,value= #"W_FunctionPopupList()",proc=Function_PopMenuProc
84        PopupMenu popup_2,pos={30,93},size={123,20},title="Coefficients"
85        PopupMenu popup_2,mode=1,value= #"W_CoefPopupList()",proc=Coef_PopMenuProc
86        CheckBox check_0,pos={430,19},size={79,14},title="Use Cursors?",value= 0
87        CheckBox check_0,proc=UseCursorsWrapperProc
88        CheckBox check_1,pos={430,42},size={74,14},title="Use Epsilon?",value= 0
89        CheckBox check_2,pos={430,65},size={95,14},title="Use Constraints?",value= 0
90        CheckBox check_3,pos={530,18},size={72,14},title="2D Functions?",value= 0
91        CheckBox check_3 proc=Toggle2DControlsCheckProc
92        CheckBox check_4,pos={430,85},size={72,14},title="Report?",value= 0
93        CheckBox check_5,pos={444,103},size={72,14},title="Save it?",value= 0
94        CheckBox check_6,pos={530,38},size={72,14},title="Use Residuals?",value= 0
95        CheckBox check_6,proc=UseResidualsCheckProc
96        CheckBox check_7,pos={530,57},size={72,14},title="Info Box?",value= 0
97        CheckBox check_7,proc=UseInfoTextBoxCheckProc
98        CheckBox check_8, pos={530,75}, size={72,14}, title="Rescale Axis?", value=0
99        CheckBox check_8,proc=UseRescaleAxisCheckProc
100        //change draw order to put button over text of checkbox
101        Button button_0,pos={520,93},size={100,20},proc=DoTheFitButton,title="Do 1D Fit"
102        Button button_4,pos={520,126},size={100,20},proc=FeedbackButtonProc,title="Feedback"
103        Button button_5,pos={520,150},size={100,20},proc=FitHelpButtonProc,title="Help"
104
105        Edit/W=(20,174,634,435)/HOST=# 
106        ModifyTable width(Point)=0
107        RenameWindow #,T0
108        SetActiveSubwindow ##
109EndMacro
110
111//open the Help file for the Fit Manager
112Function FitHelpButtonProc(ba) : ButtonControl
113        STRUCT WMButtonAction &ba
114
115        switch( ba.eventCode )
116                case 2: // mouse up
117                        // click code here
118                        DisplayHelpTopic/Z/K=1 "Fit Manager"
119                        if(V_flag !=0)
120                                DoAlert 0,"The Fit Manager Help file could not be found"
121                        endif
122                        break
123        endswitch
124
125        return 0
126End
127
128
129//open the trac page for feedback
130Function FeedbackButtonProc(ba) : ButtonControl
131        STRUCT WMButtonAction &ba
132
133        switch( ba.eventCode )
134                case 2: // mouse up
135                        // click code here
136                        OpenTracTicketPage()
137                        break
138        endswitch
139
140        return 0
141End
142
143
144//obvious use, now finds the most recent data loaded, finds the folder, and pops the menu with that selection...
145//
146Function W_LoadDataButtonProc(ba) : ButtonControl
147        STRUCT WMButtonAction &ba
148
149        switch( ba.eventCode )
150                case 2: // mouse up
151                        // click code here
152                        String  topGraph= WinName(0,1)
153                        if(strlen(topGraph) != 0)
154                                DoWindow/F $topGraph                    //so that the panel is not on top
155                        endif
156                        Execute "A_LoadOneDData()"
157                       
158                        ControlUpdate/W=WrapperPanel popup_0
159                        //instead of a simple controlUpdate, better to pop the menu to make sure that the other menus follow
160                        // convoluted method to find the right item and pop the menu.
161
162                        // data is plotted, so get the "new" top graph
163                        topGraph= WinName(0,1)  //this is the topmost graph, and should exist, but...
164                        if(cmpstr(topGraph,"")==0)
165                                return(0)
166                        endif
167                        String list,folderStr
168                        Variable num
169                        list = TraceNameList(topGraph,";",1)            //want the last item in the list
170                        num= ItemsInList(list)
171                        FolderStr = StringFromList(num-1,list,";")
172                        folderStr = folderStr[0,strlen(folderStr)-3]            //remove the "_i" that the loader enforced
173                        list = W_DataSetPopupList()
174                        num=WhichListItem(folderStr,list,";",0,0)
175                        if(num != -1)
176                                PopupMenu popup_0,mode=num+1,win=WrapperPanel
177                                ControlUpdate/W=WrapperPanel popup_0
178                               
179                                // fake mouse up to pop the menu
180                                Struct WMPopupAction ps
181                                ps.eventCode = 2                //fake mouse up
182                                DataSet_PopMenuProc(ps)
183                        endif
184                        break
185        endswitch
186       
187        return 0
188End
189
190
191// is there a simpler way to do this? I don't think so.
192Function/S W_DataSetPopupList()
193
194        String str=GetAList(4)
195
196        if(strlen(str)==0)
197                str = "No data loaded"
198        endif
199        str = SortList(str)
200       
201        return(str)
202End
203
204
205// show the available models
206// not the f*(cw,xw) point calculations
207// not the *X(cw,xw) XOPS
208//
209// KIND:10 should show only user-defined curve fitting functions
210// - not XOPs
211// - not other user-defined functions
212Function/S W_FunctionPopupList()
213        String list,tmp
214        //get every user defined curve fit function, remove everything the user doesn't need to see...
215        list = User_FunctionPopupList()         
216
217        if(strlen(list)==0)
218                list = "No functions plotted"
219        endif
220       
221        list = SortList(list)
222        return(list)
223End
224
225
226// show all the appropriate coefficient waves
227//
228// also need to search the folder listed in "data set" popup
229// for smeared coefs
230//
231// - or - restrict the coefficient list based on the model function
232// - new way, filter the possible values based on the data folder and function
233Function/S W_CoefPopupList()
234
235        String notPlotted="Please plot the function"
236        ControlInfo/W=wrapperpanel popup_1
237        String funcStr=S_Value
238        String coefStr=getFunctionCoef(funcStr)
239       
240        if(cmpstr(coefStr,"")==0)               //no correspondence in the KW string
241                return(notPlotted)
242        endif
243       
244       
245        //found a coefficient wave - only two places to look
246        // is it in the root folder?
247        if(exists("root:"+coefStr) != 0)
248                return(coefStr)
249        endif
250       
251        // is it in the data folder?
252        ControlInfo/W=wrapperpanel popup_0
253        String folderStr=S_Value
254        if(exists("root:"+folderStr+":"+coefStr) != 0)
255                return(coefStr)
256        endif
257
258        return(notPlotted)
259End
260
261// show all the appropriate coefficient waves
262//
263// also need to search the folder listed in "data set" popup
264// for smeared coefs
265//
266// - or - restrict the coefficient list based on the model function
267//
268// --old way
269//Function/S W_CoefPopupList()
270//      String list
271//      setDataFolder root:
272//      list = WaveList("coef*",";","")
273//     
274//      ControlInfo/W=wrapperpanel popup_0
275//      if(V_Value != 0)                //0== no items in menu
276//              if(DataFolderExists("root:"+S_Value))
277//                      SetDataFolder $("root:"+S_Value)
278//                      list += WaveList("*coef*",";","")
279//              endif
280//      endif
281//     
282//      // tmp coefficients that aren't being cleaned up from somewhere...
283//      list = RemoveFromList("temp_coef_1;temp_coef_2;", list  ,";")
284//
285//      if(strlen(list)==0)
286//              list = "No functions plotted"
287//      endif
288//      list = SortList(list)
289//     
290////    Print itemsinlist(list,";")
291//     
292//      setDataFolder root:
293//      return(list)
294//End
295
296// if the coefficients are changed, then update the table
297//
298//update the table
299// may be easier to just kill the subwindow (table) and create a new one
300// need to set/reset all of the waves in the table
301//
302// !! only respond to mouse up
303//
304Function Coef_PopMenuProc(pa) : PopupMenuControl
305        STRUCT WMPopupAction &pa
306
307        switch( pa.eventCode )
308                case 2: // mouse up
309                        Variable popNum = pa.popNum
310                        String popStr = pa.popStr
311                        ControlInfo/W=WrapperPanel popup_1
312                        String funcStr=S_Value
313                        String suffix = getModelSuffix(funcStr)
314                        ControlInfo/W=WrapperPanel popup_0
315                        String folderStr=S_Value
316                       
317                        if(cmpstr(popStr,"Please plot the function")==0)
318//                              Print "function not plotted"
319                                return(0)
320                        endif
321
322// this if/else/endif should not ever return an error alert     
323// it should simply set the data folder properly       
324                        if(DataFolderExists("root:"+folderStr))
325                                SetDataFolder $("root:"+folderStr)
326                                if(!exists(popStr))
327                                        // must be unsmeared model, work in the root folder
328                                        SetDataFolder root:                             
329                                        if(!exists(popStr))             //this should be fine if the coef filter is working, but check anyhow
330                                                DoAlert 0,"the coefficient and data sets do not match (1)"
331                                                return 0
332                                        endif
333                                endif
334                        else
335                                // must be unsmeared model, work in the root folder
336                                SetDataFolder root:     
337                                if(!exists(popStr))             //this should be fine if the coef filter is working, but check anyhow
338                                        DoAlert 0,"the coefficient and data sets do not match (2)"
339                                        return 0
340                                endif
341                        endif
342                       
343                        // farm the work out to another function?
344                        Variable num=numpnts($popStr)
345                        // make the necessary waves if they don't exist already
346                        if(exists("Hold_"+suffix) == 0)
347                                Make/O/D/N=(num) $("epsilon_"+suffix),$("Hold_"+suffix)
348                                Make/O/T/N=(num) $("LoLim_"+suffix),$("HiLim_"+suffix)
349                                Wave eps = $("epsilon_"+suffix)
350                                Wave coef=$popStr
351                                if(eps[0] == 0)         //if eps already if filled, don't change it
352                                        eps = abs(coef*1e-4) + 1e-10                    //default eps is proportional to the coefficients
353                                endif
354                        endif
355                        // default epsilon values, sometimes needed for the fit
356                       
357                        WAVE/T LoLim = $("LoLim_"+suffix)
358                        WAVE/T HiLim = $("HiLim_"+suffix)
359                       
360                        // clear the table (a subwindow)
361                        DoWindow/F WrapperPanel                         // ?? had to add this in during all of the cursor meddling...
362                        KillWindow wrapperPanel#T0
363                        Edit/W=(20,174,634,435)/HOST=wrapperPanel
364                        RenameWindow #,T0
365                        // get them onto the table
366                        // how do I get the parameter name?
367                        String param = getFunctionParams(funcStr)
368                        AppendtoTable/W=wrapperPanel#T0 $param,$(popStr)
369                        AppendToTable/W=wrapperPanel#T0 $("Hold_"+suffix),$("LoLim_"+suffix),$("HiLim_"+suffix),$("epsilon_"+suffix)
370                        ModifyTable/W=wrapperPanel#T0 width(Point)=0
371                       
372                        SetDataFolder root:
373                        break
374        endswitch
375
376        return 0
377End
378
379// if the Function is changed, then update the coef popup (if possible) and then the table (if possible)
380//
381// !! only respond to mouse up
382//
383Function Function_PopMenuProc(pa) : PopupMenuControl
384        STRUCT WMPopupAction &pa
385
386        switch( pa.eventCode )
387                case 2: // mouse up
388                        Variable popNum = pa.popNum
389                        String funcStr = pa.popStr
390                        String coefStr = W_CoefPopupList()
391                       
392//                      Print "coefStr = ",coefStr
393                       
394                        ControlInfo/W=WrapperPanel popup_0
395                        String folderStr=S_Value
396                       
397                        String listStr = W_CoefPopupList()
398                        Variable num=WhichListItem(coefStr, listStr, ";")
399                        String str=StringFromList(num, listStr  ,";")
400//                      print "str = ",str
401                        //set the item in the coef popup, and pop it
402                        PopupMenu popup_2 win=WrapperPanel,mode=(num+1)
403                       
404                        Struct WMPopupAction ps
405                        ps.eventCode = 2                //fake mouse up
406                        ps.popStr = str
407                        Coef_PopMenuProc(ps)
408                       
409                        SetDataFolder root:
410                        break
411        endswitch
412
413        return 0
414End
415
416// if the Data Set is changed, then update the function (if possible)
417// and the coef popup (if possible) and then the table (if possible)
418//
419// !! only respond to mouse up here, and simply send a fake mouse up
420// to the function pop, which will do what it can do
421//
422Function DataSet_PopMenuProc(pa) : PopupMenuControl
423        STRUCT WMPopupAction &pa
424       
425        switch( pa.eventCode )
426                case 2: // mouse up
427                        // make sure that the cursors are on/off appropriately
428                        // let the cursors checkbox decide what to do, sending the current state
429                        ControlInfo/W=WrapperPanel check_0
430                        STRUCT WMCheckboxAction cba
431                        cba.eventCode = 2
432                        cba.checked = V_Value
433                        UseCursorsWrapperProc(cba)
434                                       
435                        // then cascade the function/coefficient popups
436                        Struct WMPopupAction ps
437                        ps.eventCode = 2                //fake mouse up
438                        Function_PopMenuProc(ps)
439                       
440                        SetDataFolder root:
441                        break
442        endswitch
443
444        return 0
445End
446
447
448// - this is based on stringent "PlotNNN" naming requirements
449//
450//  ???
451// - how to kill the generated table and graph, that are not needed now
452//
453Function PlotModelFunction(ba) : ButtonControl
454        STRUCT WMButtonAction &ba
455
456        String folderStr,funcStr,coefStr,cmdStr=""
457        Variable useCursors,useEps,useConstr
458       
459        Variable killWhat=0             //kill nothing as default
460       
461        switch( ba.eventCode )
462                case 2: // mouse up
463                        ControlInfo/W=WrapperPanel popup_0
464                        folderStr=S_Value
465                       
466                        ControlInfo/W=WrapperPanel popup_1
467                        funcStr=S_Value
468                       
469                        // maybe nothing has been loaded yet...
470                        if(cmpstr(funcStr,"No functions plotted") == 0)
471                                break
472                        endif
473                       
474                        // check for smeared or smeared function
475                        if(stringmatch(funcStr, "Smear*" )==1)
476                                //it's a smeared model
477                                // check for the special case of RPA that has an extra parameter
478                                if(strsearch(funcStr, "RPAForm", 0 ,0) == -1)
479                                        sprintf cmdStr, "Plot%s(\"%s\")",funcStr,folderStr              //not RPA
480                                else
481                                        sprintf cmdStr, "Plot%s(\"%s\",)",funcStr,folderStr             //yes RPA, leave a comma for input
482                                endif
483                                killWhat = 1
484                        else
485                                // it's not,    don't kill the graph, just the table           
486                                sprintf cmdStr, "Plot%s()",funcStr
487                                killWhat = 2
488                        endif
489                       
490                        //Print cmdStr
491                        Execute cmdStr
492                       
493                        //pop the function menu to set the proper coefficients
494                        DoWindow/F WrapperPanel
495                        STRUCT WMPopupAction pa
496                        pa.popStr = funcStr
497                        pa.eventcode = 2
498                        Function_PopMenuProc(pa)
499       
500                        KillTopGraphAndTable(killWhat)          // crude
501       
502                        break
503        endswitch
504       
505        return 0
506End
507
508// passing 0 kills nothing
509// passing 1 kills the top graph and table
510// passing 2 kills the top table only
511//
512Function KillTopGraphAndTable(killwhat)
513        Variable killWhat
514       
515        String topGraph= WinName(0,1)   //this is the topmost graph     
516        String topTable= WinName(0,2)   //this is the topmost table
517
518        if(killWhat == 0)
519                return(0)
520        endif
521       
522        if(killWhat == 1)
523                KillWindow $topGraph
524                KillWindow $topTable
525        endif
526       
527        if(killWhat == 2)
528                KillWindow $topTable
529        endif
530       
531        return(0)
532End
533
534// How to bypass the step of plot and append?
535//
536// do it in two separate events
537//
538Function AppendModelToTarget(ba) : ButtonControl
539        STRUCT WMButtonAction &ba
540
541        String coefStr,suffix,yWStr,xWStr,folderStr,funcStr
542       
543        switch( ba.eventCode )
544                case 2: // mouse up                     
545                        ControlInfo/W=WrapperPanel popup_2
546                        coefStr=S_Value
547                       
548                        ControlInfo/W=WrapperPanel popup_1
549                        funcStr=S_Value
550                        suffix = getModelSuffix(funcStr)
551                       
552                        // check for smeared or smeared function
553                        if(stringmatch(coefStr, "smear*" )==1)
554                                //it's a smeared model
555                                ControlInfo/W=WrapperPanel popup_0
556                                folderStr=S_Value
557                                xWStr = "root:"+folderStr+":smeared_qvals"
558                                ywStr = "root:"+folderStr+":smeared_"+suffix
559                        else
560                                // it's not, so it's in the root folder
561                                xWStr = "xwave_"+suffix
562                                yWStr = "ywave_"+suffix
563                        endif
564                       
565                        Wave/Z yw = $yWStr
566                        Wave/Z xw = $xWStr
567                        if(WaveExists(yw) && WaveExists(xw))
568                                AppendtoGraph yw vs xw
569                        else
570                                DoAlert 0,"The selected model has not been plotted for the selected data set."
571                        endif
572                        break
573        endswitch
574       
575        return 0
576End
577
578
579// this should parse the panel and call the FitWrapper() function
580Function DoTheFitButton(ba) : ButtonControl
581        STRUCT WMButtonAction &ba
582
583        String folderStr,funcStr,coefStr
584        Variable useCursors,useEps,useConstr,useResiduals,useTextBox, useRescaleAxis
585       
586        switch( ba.eventCode )
587                case 2: // mouse up
588                        ControlInfo/W=WrapperPanel popup_0
589                        folderStr=S_Value
590                       
591                        ControlInfo/W=WrapperPanel popup_1
592                        funcStr=S_Value
593                       
594                        ControlInfo/W=WrapperPanel popup_2
595                        coefStr=S_Value
596                       
597                        ControlInfo/W=WrapperPanel check_0
598                        useCursors=V_Value
599                        ControlInfo/W=WrapperPanel check_1
600                        useEps=V_Value
601                        ControlInfo/W=WrapperPanel check_2
602                        useConstr=V_Value
603                       
604                        ControlInfo/W=WrapperPanel check_6
605                        useResiduals=V_Value
606                       
607                        ControlInfo/W=WrapperPanel check_7
608                        useTextBox = V_Value
609                       
610                        ControlInfo/W=WrapperPanel check_8
611                        useRescaleAxis = V_Value
612                       
613                        if(!CheckFunctionAndCoef(funcStr,coefStr))
614                                DoAlert 0,"The coefficients and function type do not match. Please correct the selections in the popup menus."
615                                break
616                        endif
617                       
618                        FitWrapper(folderStr,funcStr,coefStr,useCursors,useEps,useConstr,useResiduals,useTextBox,useRescaleAxis)
619                       
620                        //      DoUpdate (does not work!)
621                        //?? why do I need to force an update ??
622                        if(!exists("root:"+folderStr+":"+coefStr))
623                                Wave w=$coefStr
624                        else
625                                Wave w=$("root:"+folderStr+":"+coefStr) //smeared coefs in data folder
626                        endif
627                        w[0] += 1e-6
628                        w[0] -= 1e-6
629       
630                        break
631        endswitch
632       
633        return 0
634End
635
636Function CheckFunctionAndCoef(funcStr,coefStr)
637        String funcStr,coefStr
638       
639        SVAR listStr=root:Packages:NIST:coefKWStr
640        String properCoefStr = StringByKey(funcStr, listStr  ,"=",";",0)
641        if(cmpstr("",properCoefStr)==0)
642                return(0)               //false, no match found, so properCoefStr is returned null
643        endif
644        if(cmpstr(coefStr,properCoefStr)==0)
645                return(1)               //true, the coef is the correct match
646        endif
647        return(0)                       //false, wrong coef
648End
649
650/////////////////////////////////
651
652// wrapper to do the desired fit
653//
654// folderStr is the data folder for the desired data set
655//
656//
657Function FitWrapper(folderStr,funcStr,coefStr,useCursors,useEps,useConstr,useResiduals,useTextBox,useRescaleAxis)
658        String folderStr,funcStr,coefStr
659        Variable useCursors,useEps,useConstr,useResiduals,useTextBox,useRescaleAxis
660
661        String suffix=getModelSuffix(funcStr)
662       
663        SetDataFolder $("root:"+folderStr)
664        if(!exists(coefStr))
665                // must be unsmeared model, work in the root folder
666                SetDataFolder root:                             
667                if(!exists(coefStr))            //this should be fine if the coef filter is working, but check anyhow
668                        DoAlert 0,"the coefficient and data sets do not match"
669                        return 0
670                endif
671        endif
672               
673        WAVE cw=$(coefStr)     
674        Wave hold=$("Hold_"+suffix)
675        Wave/T lolim=$("LoLim_"+suffix)
676        Wave/T hilim=$("HiLim_"+suffix)
677       
678        if(useEps)
679                Wave eps=$("epsilon_"+suffix)
680        endif
681// fill a struct instance whether I need one or not
682        String DF="root:"+folderStr+":"
683       
684        Struct ResSmearAAOStruct fs
685        WAVE/Z resW = $(DF+folderStr+"_res")                    //these may not exist, if 3-column data is used
686        WAVE/Z fs.resW =  resW
687        WAVE yw=$(DF+folderStr+"_i")
688        WAVE xw=$(DF+folderStr+"_q")
689        WAVE sw=$(DF+folderStr+"_s")
690        Wave fs.coefW = cw
691        Wave fs.yW = yw
692        Wave fs.xW = xw
693       
694        Duplicate/O yw $(DF+"FitYw")
695        WAVE fitYw = $(DF+"FitYw")
696        fitYw = NaN
697       
698        Variable useResol=0,isUSANS=0,val
699        if(stringmatch(funcStr, "Smear*"))              // if it's a smeared function, need a struct
700                useResol=1
701        endif
702        if(dimsize(resW,1) > 4)
703                isUSANS=1
704        endif
705       
706        // do not construct constraints for any of the coefficients that are being held
707        // -- this will generate an "unknown error" from the curve fitting
708        // -- if constraints are not used, the constr wave is killed. This apparently
709        // confuses the /NWOK flag, since there is not even a null reference present. So generate one.
710        if(useConstr)
711                Make/O/T/N=0 constr
712                String constraintExpression
713                Variable i, nPnts=DimSize(lolim, 0),nextRow=0
714                for (i=0; i < nPnts; i += 1)
715                        if (strlen(lolim[i]) > 0 && hold[i] == 0)
716                                InsertPoints nextRow, 1, constr
717                                sprintf constraintExpression, "K%d > %s", i, lolim[i]
718                                constr[nextRow] = constraintExpression
719                                nextRow += 1
720                        endif
721                        if (strlen(hilim[i]) > 0 && hold[i] == 0)
722                                InsertPoints nextRow, 1, constr
723                                sprintf constraintExpression, "K%d < %s", i, hilim[i]
724                                constr[nextRow] = constraintExpression
725                                nextRow += 1
726                        endif
727                endfor
728        else
729                Wave/T/Z constr = constr
730                KillWaves/Z constr
731                Wave/T/Z constr = constr                //this is intentionally a null reference
732        endif
733
734        // 20JUN if useCursors is true, and there are no cursors on the specified data set, uncheck and set to false
735        // this is a last line of defense, and should never actually do anything...
736        if(useCursors)
737                useCursors = AreCursorsCorrect(folderStr)
738        endif
739        //if useCursors, and the data is USANS, need to recalculate the matrix if the range is new
740        Variable pt1,pt2,newN,mPt1,mPt2
741        String noteStr
742        if(useCursors && isUSANS )
743                //where are the cursors, and what is the status of the current matrix?
744                if(pcsr(A) > pcsr(B))
745                        pt1 = pcsr(B)
746                        pt2 = pcsr(A)
747                else
748                        pt1 = pcsr(A)
749                        pt2 = pcsr(B)
750                endif
751               
752                noteStr = note(resW)
753                mPt1 = NumberByKey("P1",noteStr,"=",";")
754                mPt2 = NumberByKey("P2",noteStr,"=",";")
755                if((mPt1 != pt1) || (mPt2 != pt2) )
756                        // need to recalculate
757                        USANS_RE_CalcWeights(folderStr,pt1,pt2)
758                        Print "Done recalculating the matrix"
759                endif
760               
761                Wave trimResW=$(DF+folderStr+"_res"+"t")        //put the trimmed resW in the struct for the fit!
762                Wave fs.resW=trimResW
763        endif
764        if(useCursors)
765                //find the points so that genetic optimization can use them
766                if(pcsr(A) > pcsr(B))
767                        pt1 = pcsr(B)
768                        pt2 = pcsr(A)
769                else
770                        pt1 = pcsr(A)
771                        pt2 = pcsr(B)
772                endif
773        else
774                //if cursors are not being used, find the first and last points of the data set, and pass them
775                pt1 = 0
776                pt2 = numpnts(yw)-1
777        endif
778               
779// create these variables so that FuncFit will set them on exit
780        Variable/G V_FitError=0                         //0=no err, 1=error,(2^1+2^0)=3=singular matrix
781        Variable/G V_FitQuitReason=0            //0=ok,1=maxiter,2=user stop,3=no chisq decrease
782
783        NVAR useGenCurveFit = root:Packages:NIST:gUseGenCurveFit
784// don't use the auto-destination with no flag, it doesn't appear to work correctly
785// dispatch the fit
786
787// currently, none of the fit functions are defined as threadsafe, so I don't think that the /NTHR flag really
788// does anything. The functions themselves can be threaded since they are AAO, and that is probably enough,
789// since it doesn't make much sense to thread threads. In addition, there is a little-publicized warning
790// in the WM help file that /C=texWave cannot be used to specify constraints for threadsafe functions!
791// The textwave would have to be parsed into a constraint matrix first, then passed as /C={cMat,cVec}.
792// -- just something to watch out for.
793
794// now two more flags... ,useResiduals,useTextBox
795        Variable tb = 1+2+4+8+16+256+512                //See CurveFit docs for bit settings for /TBOX flag
796
797        do
798                Variable t0 = stopMStimer(-2)           // corresponding print is at the end of the do-while loop (outside)
799
800
801                if(useGenCurveFit)
802               
803#if !(exists("GenCurveFit"))
804                        // XOP not available
805                        useGenCurveFit = 0
806                        Abort "Genetic Optimiztion XOP not available. Reverting to normal optimization."       
807#endif
808                        //send everything to a function, to reduce the clutter
809                        // useEps and useConstr are not needed
810                        // pass the structure to get the current waves, including the trimmed USANS matrix
811                        //
812                        // I don't know that GetCurveFit can do residuals, so I'm not passing that flag, or the text box flag
813                        //
814                        Variable chi,pt
815
816                        chi = DoGenCurveFit(useResol,useCursors,sw,fitYw,fs,funcStr,getHStr(hold),val,lolim,hilim,pt1,pt2)
817                        pt = val
818
819                        break
820                       
821                endif
822               
823                // now useCursors, useEps, and useConstr are all handled w/ /NWOK
824                // so there are only three conditions to test == 1 + 3 + 3 + 1 = 8 conditions
825               
826                if(useResol && useResiduals && useTextBox)              //do it all
827                        FuncFit/H=getHStr(hold) /M=2 /NTHR=0 /TBOX=(tb) $funcStr cw, yw[pt1,pt2] /X=xw /W=sw /I=1 /E=eps /D=fitYw /C=constr /STRC=fs /R /NWOK
828                        break
829                endif
830               
831                if(useResol && useResiduals)            //res + resid
832                        FuncFit/H=getHStr(hold) /M=2 /NTHR=0 $funcStr cw, yw[pt1,pt2] /X=xw /W=sw /I=1 /E=eps /D=fitYw /C=constr /STRC=fs /R /NWOK
833                        break
834                endif
835
836               
837                if(useResol && useTextBox)              //res + text
838                        FuncFit/H=getHStr(hold) /M=2 /NTHR=0 /TBOX=(tb) $funcStr cw, yw[pt1,pt2] /X=xw /W=sw /I=1 /E=eps /D=fitYw /C=constr /STRC=fs /NWOK
839                        break
840                endif
841               
842                if(useResol)            //res only
843//                      Print "timing test for Cylinder_PolyRadius---"
844//                      Variable t0 = stopMStimer(-2)
845
846                        FuncFit/H=getHStr(hold) /M=2 /NTHR=0 $funcStr cw, yw[pt1,pt2] /X=xw /W=sw /I=1 /E=eps /D=fitYw /C=constr /STRC=fs /NWOK
847                       
848//                      t0 = (stopMSTimer(-2) - t0)*1e-6
849//                      Printf  "CylPolyRad fit time using res and eps and /NTHR=0 time = %g seconds\r\r",t0
850//                      cw[0] = .01
851//                      cw[1] = 20
852//                      cw[2] = 400
853//                      cw[3] = 0.2
854//                      cw[4] = 3e-6
855//                      cw[5] = 0.0
856//                     
857//                      t0 = stopMSTimer(-2)
858//                      FuncFit/H=getHStr(hold) /NTHR=0 $funcStr cw, yw[pt1,pt2] /X=xw /W=sw /I=1 /E=eps /D=fitYw /C=constr /STRC=fs /NWOK
859//                      t0 = (stopMSTimer(-2) - t0)*1e-6
860//                      Printf  "CylPolyRad fit time using res and eps and NO THREADING time = %g seconds\r\r",t0
861                        break
862                endif
863                       
864               
865               
866/////   same as above, but all without useResol (no /STRC flag)
867                if(useResiduals && useTextBox)          //resid+ text
868                        FuncFit/H=getHStr(hold) /M=2 /NTHR=0 /TBOX=(tb) $funcStr cw, yw[pt1,pt2] /X=xw /W=sw /I=1 /E=eps /D=fitYw /C=constr /R /NWOK
869                        break
870                endif
871               
872                if(useResiduals)                //resid
873                        FuncFit/H=getHStr(hold) /M=2 /NTHR=0 $funcStr cw, yw[pt1,pt2] /X=xw /W=sw /I=1 /E=eps /D=fitYw /C=constr /R /NWOK
874                        break
875                endif
876
877               
878                if(useTextBox)          //text
879                        FuncFit/H=getHStr(hold) /M=2 /NTHR=0 /TBOX=(tb) $funcStr cw, yw[pt1,pt2] /X=xw /W=sw /I=1 /E=eps /D=fitYw /C=constr /NWOK
880                        break
881                endif
882               
883                //just a plain vanilla fit
884
885                FuncFit/H=getHStr(hold) /M=2 /NTHR=0 $funcStr cw, yw[pt1,pt2] /X=xw /W=sw /I=1 /E=eps /D=fitYw /C=constr /NWOK
886               
887        while(0)
888       
889        t0 = (stopMSTimer(-2) - t0)*1e-6
890        Printf  "fit time = %g seconds\r\r",t0
891       
892       
893        // append the fit
894        // need to manage duplicate copies
895        // Don't plot the full curve if cursors were used (set fitYw to NaN on entry...)
896        String traces=TraceNameList("", ";", 1 )                //"" as first parameter == look on the target graph
897        if(strsearch(traces,"FitYw",0) == -1 )
898                if(useGenCurveFit && useCursors)
899                        WAVE trimX = trimX
900                        AppendtoGraph fitYw vs trimX
901                else
902                        AppendToGraph FitYw vs xw
903                endif
904        elseif (strsearch(traces,"FitYw_RA",0) == -1)
905                RemoveFromGraph FitYw
906                if(useGenCurveFit && useCursors)
907                        WAVE trimX = trimX
908                        AppendtoGraph fitYw vs trimX
909                else
910                        AppendToGraph FitYw vs xw
911                endif
912        else
913                RemoveFromGraph FitYw_RA
914                if(useGenCurveFit && useCursors)
915                        WAVE trimX = trimX
916                        AppendtoGraph fitYw vs trimX
917                else
918                        AppendToGraph FitYw vs xw
919                endif
920        endif
921        ModifyGraph lsize(FitYw)=2,rgb(FitYw)=(0,0,0)
922       
923        DoUpdate                //force update of table and graph with fitted values (why doesn't this work? - the table still does not update)
924       
925        // report the results (to the panel?)
926        if(useGenCurveFit)
927                V_chisq = chi
928                V_npnts = pt
929        endif
930        print "V_chisq = ",V_chisq
931        print cw
932        WAVE/Z w_sigma
933        print w_sigma
934        String resultStr=""
935        Variable maxRelError=0
936       
937        if(waveexists(W_sigma))
938                //append it to the table, if it's not already there
939                CheckDisplayed/W=WrapperPanel#T0 W_sigma
940                if(V_flag==0)
941                        //not there, append it
942                        AppendtoTable/W=wrapperPanel#T0 W_sigma
943                else
944                        //remove it, and put it back on to make sure it's the right one (do I need to do this?)
945                        // -- not really, since any switch of the function menu takes W_Sigma off
946                endif
947                // then do I want to color it if the errors are horrible?
948                Duplicate/O cw, relError
949                relError = W_sigma/cw
950                maxRelError = WaveMax(relError)
951                if(maxRelError > kRelErrorTolerance)
952                        ModifyTable/W=wrapperPanel#T0 style(W_sigma)=1,rgb(W_sigma)=(65535,0,0)
953                else
954                        ModifyTable/W=wrapperPanel#T0 style=0,rgb=(0,0,0)
955        endif
956       
957        endif
958       
959        //now re-write the results
960        sprintf resultStr,"Chi^2 = %g  Sqrt(X^2/N) = %g",V_chisq,sqrt(V_chisq/V_Npnts)
961        resultStr = PadString(resultStr,63,0x20)
962        DoWIndow/F WrapperPanel
963        GroupBox grpBox_2 title=resultStr
964        ControlUpdate/W=WrapperPanel grpBox_2
965        sprintf resultStr,"FitErr = %s : FitQuit = %s",W_ErrorMessage(V_FitError),W_QuitMessage(V_FitQuitReason)
966        resultStr = PadString(resultStr,63,0x20)
967        GroupBox grpBox_3 title=resultStr
968        ControlUpdate/W=WrapperPanel grpBox_3
969       
970        Variable yesSave=0,yesReport=0
971        ControlInfo/W=WrapperPanel check_4
972        yesReport = V_Value
973        ControlInfo/W=WrapperPanel check_5
974        yesSave = V_Value
975       
976       
977        if(yesReport)
978                String parStr=GetWavesDataFolder(cw,1)+ WaveList("*param*"+"_"+suffix, "", "TEXT:1," )          // this is *hopefully* one wave
979                String topGraph= WinName(0,1)   //this is the topmost graph
980       
981                DoUpdate                //force an update of the graph before making a copy of it for the report
982
983                //if GenCurveFit used, V_startRow and V_endRow may not exist - so read the cursors? but the cursors may not be used, so
984                // there won't be anything on the graph... but pt1 and pt2 are set and passed!. The V_ variables are more foolproof
985                // so keep these for the "normal" report
986                //
987                if(useGenCurveFit)     
988                        W_GenerateReport(funcStr,folderStr,$parStr,cw,yesSave,V_chisq,W_sigma,V_npnts,V_FitError,V_FitQuitReason,pt1,pt2,topGraph)
989                else
990                        W_GenerateReport(funcStr,folderStr,$parStr,cw,yesSave,V_chisq,W_sigma,V_npnts,V_FitError,V_FitQuitReason,V_startRow,V_endRow,topGraph)
991                endif
992        endif
993       
994        //Rescale the Plot depending on the user choice
995        if(useRescaleAxis)
996                string ctrlName = "GoRescale"
997                RescalePlot(ctrlName)
998        elseif (DataFolderExists("root:Packages:NIST:RescaleAxis"))
999                SetDataFolder root:
1000                String PlotGraph= WinName(0,1)  //this is the topmost graph
1001                DoWindow/F $PlotGraph
1002               
1003                GetWindow/Z $PlotGraph, wavelist
1004                if (V_flag != 0)
1005                        DoPrompt/Help="" "I couldn't find the graph"
1006                        Abort
1007                endif
1008               
1009                wave/t W_Wavelist
1010               
1011                variable j
1012                string temp
1013                SetDataFolder root:Packages:NIST:RescaleAxis
1014                if (exists("W_WaveList")==1)
1015                        KillWaves/Z root:Packages:NIST:RescaleAxis:W_WaveList
1016                endif
1017                MoveWave root:W_WaveList, root:Packages:NIST:RescaleAxis:W_WaveList
1018               
1019                for(i=0; i < numpnts(W_Wavelist)/3; i+=1)
1020                        temp = W_WaveList[i][0]
1021                        if(stringmatch(temp, "*_RA"))
1022               
1023                                string WaveDataFolder, WaveToRescale
1024                                WaveDataFolder = ReplaceString(W_WaveList[i][0], W_WaveList[i][1], "")
1025                                if(strlen(WaveDataFolder)==0)
1026                                        WaveDataFolder = ":"
1027                                endif
1028                                WaveDataFolder = "root"+WaveDataFolder 
1029                                SetDataFolder $WaveDataFolder
1030                                temp = RemoveEnding(temp, "_RA")
1031                               
1032                                string xwave, ywave, oldywave, swave
1033                                if(exists(temp)==1)
1034                                        Wave/T WaveString = $temp
1035                                        WaveToRescale = temp
1036                                        if (stringmatch(WaveToRescale, "*_i"))
1037                                                DoWindow/F PlotGraph
1038                                                oldywave = WaveToRescale+"_RA"
1039                                                ywave = WaveToRescale
1040                                                replacewave/Y/W=$PlotGraph trace=$oldywave, $ywave
1041                                                xwave = RemoveEnding(WaveToRescale, "_i")+"_q"
1042                                                replacewave/X/W=$PlotGraph trace=$ywave, $xwave
1043                                                ModifyGraph log=0
1044                                                swave = RemoveEnding(WaveToRescale, "_i")+"_s"
1045                                                if(exists(swave)==1)
1046                                                        ErrorBars/W=$PlotGraph $ywave, Y wave=($swave,$swave)   
1047                                                endif
1048                                        elseif(stringmatch(WaveToRescale, "smeared*") && stringmatch(WaveToRescale, "!*_qvals"))
1049                                                oldywave = WaveToRescale+"_RA"
1050                                                ywave = WaveToRescale
1051                                                replacewave/Y/W=$PlotGraph trace=$oldywave, $ywave
1052                                                xwave = "smeared_qvals"
1053                                                replacewave/X/W=$PlotGraph trace=$ywave, $xwave
1054                                                ModifyGraph log=0
1055                                        elseif(stringmatch(WaveToRescale,"ywave*"))
1056                                                oldywave = WaveToRescale+"_RA"
1057                                                ywave = WaveToRescale
1058                                                xwave = ReplaceString("ywave",ywave,"xwave")
1059                                                replacewave/Y/W=$PlotGraph trace=$oldywave, $ywave
1060                                                replacewave/X/W=$PlotGraph trace=$ywave, $xwave                                 
1061                                        endif
1062                                SetDataFolder root:Packages:NIST:RescaleAxis
1063                                endif
1064                        endif
1065                endfor
1066                KillWaves/Z W_WaveList
1067                modifygraph log=1
1068                Label left "I(q)"
1069                Label bottom "q (A\S-1\M)"
1070        Endif
1071
1072        SetDataFolder root:
1073        return(0)
1074End
1075
1076// parse something off of a table, or ?
1077Function/S getHStr(hold)
1078        Wave hold
1079       
1080        String str=""
1081        Variable ii
1082        for(ii=0;ii<numpnts(hold);ii+=1)
1083                str += num2str(hold[ii])
1084        endfor
1085
1086//      print str
1087        if(strsearch(str, "1", 0) == -1)
1088                return ("")
1089        else
1090                return(str)
1091        endif
1092End
1093
1094//taken from SRK Auto_Fit, and modified to work better with FitWrapper
1095//must have AutoGraph as the name of the graph window (any size)
1096// func is the name of the function (for print only)
1097//par and coef are the exact names of the waves
1098//yesSave==1 will save the file(name=func+time)
1099//
1100Function W_GenerateReport(func,dataname,param,ans,yesSave,chiSq,sigWave,npts,fitErr,fitQuit,fitStart,fitEnd,topGraph)
1101        String func,dataname
1102        Wave/T param
1103        Wave ans
1104        Variable yesSave,chiSq
1105        Wave sigWave
1106        Variable npts,fitErr,fitQuit,fitStart,fitEnd
1107        String topGraph
1108       
1109        String str,pictStr="P_"
1110        String nb="Report"
1111               
1112        // bring report up
1113        DoWindow/F Report
1114        if (V_flag == 0)                // Report notebook doesn't exist ?
1115                NewNotebook/W=(10,45,550,620)/F=1/N=Report as "Report"
1116        endif
1117        // delete old stuff
1118        Notebook $nb selection={startOfFile, endOfFile}, text="\r", selection={startOfFile, startOfFile}
1119       
1120        //setup
1121        Notebook $nb defaultTab=36, statusWidth=252, pageMargins={72,72,72,72}
1122        Notebook $nb showRuler=1, rulerUnits=1, updating={1, 60}
1123        Notebook $nb newRuler=Normal, justification=0, margins={0,0,468}, spacing={0,0,0}, tabs={}, rulerDefaults={"Geneva",10,0,(0,0,0)}
1124//     
1125        // insert title
1126        Notebook $nb newRuler=Title, justification=1, rulerDefaults={"Times", 16, 1, (0, 0, 0)}
1127        sprintf str, "Fit to %s, %s, %s\r\r", func,Secs2Date(datetime, 0), time()
1128        Notebook $nb ruler=Title, text=str
1129       
1130        // insert fit results
1131        Variable num=numpnts(ans),ii=0
1132        Notebook $nb ruler=Normal
1133        Notebook $nb  margins={18,18,504}, tabs={63 + 3*8192}
1134        str = "Data file: " + dataname + "\r\r"
1135        Notebook $nb text=str
1136        Notebook $nb ruler=Normal
1137        Notebook $nb margins={18,18,504}, tabs={144,234,252}
1138        do
1139                sprintf str, "%s = \t%g\t±\t%g\r", param[ii],ans[ii],sigwave[ii]
1140                Notebook $nb text=str
1141                ii+=1
1142        while(ii<num)
1143       
1144        //
1145        // no "fitted range" for 2D data, so make sure that this exists before using it
1146        Wave/Z dataXw = $("root:"+dataname+":"+dataname+"_q")   
1147        //
1148        Notebook $nb ruler=Normal
1149        Notebook $nb  margins={18,18,504}, tabs={63+3*8192}, fStyle=1, textRGB=(65000,0,0)
1150       
1151        sprintf str,"chisq = %g\r",chisq
1152        Notebook $nb textRGB=(65000,0,0),fstyle=1,text=str
1153        sprintf str,"Npnts = %g \t\t Sqrt(X^2/N) = %g\r",npts,sqrt(chiSq/npts)
1154        Notebook $nb textRGB=(0,0,0),fstyle=0, text=str
1155        if(WaveExists(dataXw))
1156                sprintf str "Fitted range = [%d,%d] = %g < Q < %g\r",fitStart,fitEnd,dataXw(fitStart),dataXw(fitEnd)
1157                Notebook $nb textRGB=(0,0,0),fstyle=0, text=str
1158        endif
1159        sprintf str,"FitError = %s\t\tFitQuitReason = %s\r",W_ErrorMessage(FitErr),W_QuitMessage(FitQuit)
1160        Notebook $nb textRGB=(65000,0,0),fstyle=1,text=str
1161        Notebook $nb ruler=Normal
1162       
1163        // insert graphs
1164        if(WaveExists(dataXw))
1165//              Notebook $nb picture={$topGraph(0, 0, 400, 300), -5, 1}, text="\r"
1166                Notebook $nb scaling={50, 50}, picture={$topGraph(0, 0, 800, 600), -5, 1}, text="\r"
1167        //
1168        else            //must be 2D Gizmo
1169                Execute "ExportGizmo Clip"                      //this ALWAYS is a PICT or BMP. Gizmo windows are different...
1170                LoadPict/Q/O "Clipboard",tmp_Gizmo
1171                Notebook $nb picture={tmp_Gizmo(0, 0, 800, 600), 0, 1}, text="\r"
1172        endif
1173       
1174        // show the top of the report
1175        Notebook $nb  selection= {startOfFile, startOfFile},  findText={"", 1}
1176       
1177        //save the notebook and the graphic file
1178        if(yesSave)
1179                String nameStr=CleanupName(func,0)
1180                nameStr += "_"+dataname
1181                nameStr = ReplaceString("Smeared",nameStr,"Sm_")                //if Smeared function, shorten the name
1182                //make sure the name is no more than 31 characters
1183                namestr = namestr[0,30]         //if shorter than 31, this will NOT pad to 31 characters
1184                Print "file saved as ",nameStr
1185                SaveNotebook /O/P=home/S=2 $nb as nameStr
1186                //save the graph separately as a PNG file, 2x screen
1187                pictStr += nameStr
1188                pictStr = pictStr[0,28]         //need a shorter name - why?
1189//              DoWindow/F $topGraph
1190                // E=-5 is png @screen resolution
1191                // E=2 is PICT @2x screen resolution
1192///             SavePICT /E=-5/O/P=home /I/W=(0,0,3,3) as pictStr
1193                if(WaveExists(dataXw))
1194                        SavePICT /E=-5/O/P=home/WIN=$topGraph /W=(0,0,800,600) as pictStr
1195                else
1196                        Execute "ExportGizmo /P=home as \""+pictStr+"\""                //this won't be of very high quality
1197                        //SavePICT /E=-5/O/P=home/WIN=$topGraph /W=(0,0,400,300) as pictStr
1198                endif
1199        Endif
1200       
1201        // ???maybe print the notebook too?
1202End
1203
1204Function/S W_ErrorMessage(code)
1205        Variable code
1206       
1207        switch (code)
1208                case 0:
1209                        return "No Error"
1210                        break
1211                case 3: //2^0 + 2^1
1212                        return "Singular Matrix"
1213                        break
1214                case 5:         //(2^0 + 2^2)
1215                        return "Out of Memory"
1216                        break
1217                case 9:         //(2^0 + 2^3)
1218                        return "Func= NaN or Inf"
1219                        break
1220                default:
1221                        return "Unknown error code "+num2str(code)
1222        endswitch
1223end
1224
1225Function/S W_QuitMessage(code)
1226        Variable code
1227       
1228        switch (code)
1229                case 0:
1230                        return "No Error"
1231                        break
1232                case 1:
1233                        return "Max iterations - re-run fit"
1234                        break
1235                case 2:
1236                        return "User terminated fit"
1237                        break
1238                case 3:
1239                        return "No decrease in chi-squared"
1240                        break
1241                default:
1242                        return "Unknown Quit code "+num2str(code)
1243        endswitch
1244end
1245
1246Function UseInfoTextBoxCheckProc(cba) : CheckBoxControl
1247        STRUCT WMCheckboxAction &cba
1248
1249        switch( cba.eventCode )
1250                case 2: // mouse up
1251                        Variable checked = cba.checked
1252                        if(checked)
1253                                //print "checked, use textBox in the next fit"
1254                        else
1255                                //print "unchecked, ask to remove TextBox from the graph"
1256                                ControlInfo/W=WrapperPanel popup_0
1257                                RemoveTextBox(S_value)
1258                        endif
1259                        break
1260        endswitch
1261
1262        return 0
1263End
1264
1265//does not report an error if the text box is not there
1266// -- so I'll just be lazy and not check to see if it's there
1267//
1268Function RemoveTextBox(folderStr)
1269        String folderStr
1270       
1271        DoAlert 1,"Remove the TextBox from the graph?"
1272        if(V_flag == 1)
1273                String str = "CF_"+folderStr+"_i"
1274                TextBox/K/N=$str
1275        endif
1276        return(0)
1277End
1278
1279Function UseResidualsCheckProc(cba) : CheckBoxControl
1280        STRUCT WMCheckboxAction &cba
1281
1282        switch( cba.eventCode )
1283                case 2: // mouse up
1284                        Variable checked = cba.checked
1285                        if(checked)
1286                                //print "checked, use them in the next fit"
1287                        else
1288                                //print "unchecked, ask to remove residuals from the graph"
1289                                ControlInfo/W=WrapperPanel popup_0
1290                                RemoveResiduals(S_value)
1291                        endif
1292                        break
1293        endswitch
1294
1295        return 0
1296End
1297
1298// the default name from the /R flag is "Res_" + yWaveName
1299//
1300// better to find the wave that starts with "Res_" and remove that one in case the
1301// wave names get too long
1302//
1303// the difficulty now is that the residual wave ends up in root: and not with the data....
1304// -- not really a problem, but adds to clutter
1305Function RemoveResiduals(folderStr)
1306        String folderStr
1307       
1308        String list="",topWin=""
1309        Variable num,ii
1310        String str
1311
1312        DoAlert 1,"Remove the residuals from the graph?"
1313        if(V_flag == 1)
1314//              String topGraph= WinName(0,1)   //this is the topmost graph
1315                list=TraceNameList("", ";", 1 )         //"" as first parameter == look on the target graph
1316                num=ItemsInList(list)
1317               
1318                for(ii=0;ii<num;ii+=1)
1319                        str = StringFromList(ii, list ,";")
1320                        if(strsearch(str, "Res_", 0) != -1)
1321                                RemoveFromGraph $str
1322                        endif
1323                endfor
1324       
1325                SetDataFolder root:
1326        endif
1327       
1328        return(0)
1329End
1330
1331Function Toggle2DControlsCheckProc(cba) : CheckBoxControl
1332        STRUCT WMCheckboxAction &cba
1333
1334        switch( cba.eventCode )
1335                case 2: // mouse up
1336                        Variable checked = cba.checked
1337                        if(checked)
1338                                //print "change the buttons to 2D"
1339                                Button button_0,proc=Do2DFitButtonProc,title="Do 2D Fit"
1340                                Button button_1,size={120,20},proc=Plot2DFunctionButtonProc,title="Plot 2D Function"
1341                                Button button_2,size={100,20},proc=Append2DModelButtonProc,title="Append 2D"
1342                                Button button_3,size={100,20},proc=Load2DDataButtonProc,title="Load 2D Data"
1343                               
1344                                Button button_2D_0,pos={550,60},size={70,20},proc=LogToggle2DButtonProc,title="Log/Lin"
1345                                Button button_2D_1,pos={520,37},size={100,20},proc=Plot2DButtonProc,title="Plot 2D Data"
1346                               
1347                                Button button_2D_0,disable=0            //visible again, and enabled
1348                                Button button_2D_1,disable=0
1349                               
1350                                CheckBox check_6,disable=1                      //info box and residual check, remove these from view
1351                                CheckBox check_7,disable=1
1352                                CheckBox check_8,disable=1
1353                        else
1354                                //print "unchecked, change them back to 1D"
1355                                Button button_0,pos={520,93},size={100,20},proc=DoTheFitButton,title="Do 1D Fit"
1356                                Button button_1,pos={280,57},size={120,20},proc=PlotModelFunction,title="Plot 1D Function"
1357                                Button button_2,pos={300,93},size={100,20},proc=AppendModelToTarget,title="Append 1D"
1358                                Button button_3,pos={300,20},size={100,20},proc=W_LoadDataButtonProc,title="Load 1D Data"
1359                               
1360                                Button button_2D_0,disable=3    //hide the extra 2D buttons, and disable
1361                                Button button_2D_1,disable=3
1362                               
1363                                CheckBox check_6,disable=0                      //info box and residual check, bring them back
1364                                CheckBox check_7,disable=0
1365                                CheckBox check_8,disable=0
1366                        endif
1367                        break
1368        endswitch
1369
1370        return 0
1371End
1372
1373// function to either add or remove the cursors from the topmost graph, as needed
1374
1375Function UseCursorsWrapperProc(cba) : CheckBoxControl
1376        STRUCT WMCheckboxAction &cba
1377
1378
1379        switch( cba.eventCode )
1380                case 2: // mouse up
1381               
1382                        // check to make sure there really is a "topmost" graph         
1383                        String topGraph= WinName(0,1)   //this is the topmost graph
1384                        if(cmpstr(topGraph,"")==0)      //no graphs, uncheck and exit
1385                                CheckBox check_0,value=0
1386                                return(0)
1387                        endif
1388                       
1389                        //if in 2D mode, just exit
1390                        ControlInfo/W=WrapperPanel check_3
1391                        if(V_Value == 1)
1392                                return (0)
1393                        endif
1394                               
1395                        String ciStr = CsrInfo(A , topGraph)
1396                       
1397                        ControlInfo/W=wrapperpanel popup_0
1398                        String folderStr=S_Value
1399                        String traceList = TraceNameList(topGraph, ";", 1 )             
1400               
1401                        Variable checked = cba.checked
1402                       
1403                        if(checked)
1404                                //print "add the cursors to the topmost graph, if the data set is there, or move them"
1405                                if(strlen(ciStr)==0 && strsearch(traceList, folderStr, 0) != -1 )               //no cursors && data is there
1406                                        ShowInfo
1407                                        Wave yw=$("root:"+folderStr+":"+folderStr+"_i")
1408                                        Cursor/P/W=$topGraph A, $(folderStr+"_i"),0
1409                                        Cursor/P/W=$topGraph/A=0 B, $(folderStr+"_i"),numpnts(yw)-1                     //deactivate the one at the high Q end
1410                                        DoUpdate
1411                                elseif (strlen(ciStr)!=0 && strsearch(traceList, folderStr, 0) != -1 ) //cursors present, but on wrong data
1412                                        Wave yw=$("root:"+folderStr+":"+folderStr+"_i")
1413                                        Cursor/P/W=$topGraph A, $(folderStr+"_i"),0                                                             //move the cursors
1414                                        Cursor/P/W=$topGraph/A=0 B, $(folderStr+"_i"),numpnts(yw)-1
1415                                        DoUpdate
1416                                endif
1417                               
1418                                AreCursorsCorrect(folderStr)
1419                        else
1420                                //print "unchecked, remove the cursors"
1421                                // go back to the full matrix for the resolution calculation (not if SANS data...)
1422                                if(waveExists($("root:"+folderStr+":weights_save")))
1423                                        Duplicate/O $("root:"+folderStr+":weights_save"), $("root:"+folderStr+":"+folderStr+"_res"),$("root:"+folderStr+":"+folderStr+"_rest")
1424                                endif
1425
1426                                HideInfo/W=$topGraph
1427                                Cursor/K A
1428                                Cursor/K B
1429                        endif
1430                        break
1431        endswitch
1432
1433        return 0
1434End
1435
1436// returns 1 if the specified data is on the top graph && has cursors on it
1437// returns 0 and unchecks the box if anything is wrong
1438//
1439// only call this function if the cursor box is checked, to uncheck it as needed
1440// if the box is unchecked, leave it be.
1441//
1442Function AreCursorsCorrect(folderStr)
1443        String folderStr
1444       
1445        String topGraph= WinName(0,1)   //this is the topmost graph
1446        if(cmpstr(topGraph,"")==0)      //no graphs, uncheck and exit
1447                CheckBox check_0,win=wrapperpanel,value=0
1448                return(0)
1449        endif
1450               
1451        String traceAisOn = CsrWave(A , "", 0)
1452        if(     strsearch(traceAisOn, folderStr, 0) == -1)              //data and cursors don't match
1453                CheckBox check_0,win=wrapperpanel,value=0
1454                HideInfo
1455                Cursor/K A
1456                Cursor/K B
1457                return(0)
1458        endif
1459       
1460        return(1)
1461End
1462
1463
1464
1465//////////////////////////////
1466//
1467// displays the covariance matrix for the current data set in the popup
1468// AND whatever was the last fit for that data set. it may not necessarily
1469// be the displayed function...
1470Function DisplayCovarianceMatrix()
1471
1472       
1473
1474        ControlInfo/W=wrapperpanel popup_0
1475        String folderStr=S_Value
1476
1477        ControlInfo/W=WrapperPanel popup_1
1478        String funcStr=S_Value
1479                       
1480        if(Stringmatch(funcStr,"Smear*"))               //simple test for smeared function
1481                if(DataFolderExists("root:"+folderStr))
1482                        SetDataFolder $("root:"+folderStr)
1483                else
1484                        SetDataFolder root:
1485                endif
1486        else
1487                SetDataFolder root:
1488        endif
1489       
1490        Wave M_Covar=M_Covar
1491        Duplicate/O M_Covar, CorMat      // You can use any name instead of CorMat
1492        CorMat = M_Covar[p][q]/sqrt(M_Covar[p][p]*M_Covar[q][q])
1493
1494        // clear the table (a subwindow)
1495        DoWindow/F CorMatPanel                          // ?? had to add this in during all of the cursor meddling...
1496        KillWindow CorMatPanel#T0
1497        Edit/W=(20,74,634,335)/HOST=CorMatPanel
1498        RenameWindow #,T0
1499        // get them onto the table
1500        // how do I get the parameter name?
1501        String param = getFunctionParams(funcStr)
1502        AppendtoTable/W=CorMatPanel#T0 $param
1503        AppendToTable/W=CorMatPanel#T0 CorMat
1504        ModifyTable/W=CorMatPanel#T0 width(Point)=0
1505
1506        GroupBox grpBox_1 title="Data set: "+folderStr
1507        GroupBox grpBox_2 title="Function: "+funcStr
1508
1509
1510        SetDataFolder root:
1511       
1512        return(0)
1513End
1514
1515
1516Window CorMatPanel()
1517        PauseUpdate; Silent 1           // building window...
1518        NewPanel /W=(459,44,1113,399)/N=CorMatPanel/K=1 as "Correlation Matrix"
1519        ModifyPanel fixedSize=1
1520       
1521        GroupBox grpBox_1 title="box 1",pos={10,20},size={0,0},frame=1,fSize=10,fstyle=1,fColor=(39321,1,1)
1522        GroupBox grpBox_2 title="box 2",pos={10,40},size={0,0},frame=1,fSize=10,fstyle=1,fColor=(39321,1,1)
1523
1524        Button button_1,pos={520,30},size={100,20},proc=CorMatHelpButtonProc,title="Help"
1525
1526        Edit/W=(20,74,634,335)/HOST=# 
1527        ModifyTable width(Point)=0
1528        RenameWindow #,T0
1529        SetActiveSubwindow ##
1530EndMacro
1531
1532
1533Proc DisplayCovariance()
1534        DoWindow/F CorMatPanel
1535        if(V_Flag==0)
1536                CorMatPanel()
1537        endif
1538       
1539        DisplayCovarianceMatrix()
1540
1541End
1542
1543//open the Help file for the Fit Manager
1544Function CorMatHelpButtonProc(ba) : ButtonControl
1545        STRUCT WMButtonAction &ba
1546
1547        switch( ba.eventCode )
1548                case 2: // mouse up
1549                        // click code here
1550                        DisplayHelpTopic/Z/K=1 "Covariance Matrix"
1551                        if(V_flag !=0)
1552                                DoAlert 0,"Help for the correlation matrix could not be found"
1553                        endif
1554                        break
1555        endswitch
1556
1557        return 0
1558End
1559
1560
1561//////////////////////////////////
1562// this is a snippet from Andy Nelson, posted at the Igor Exchange web site.
1563//
1564// search area appears to be a percent (so enter 10 to get +/- 10% variation in the parameter)
1565//
1566// TODO:
1567//              x- rename the function for just me
1568//              x- make the edata a mandatory parameter
1569//              x- remove rhs, lhs? or keep these if cursors were used to properly trim the data set
1570//              x- label the graph
1571//              x- make a panel to control this - to either pick a single parameter, or show all of them
1572//              x- have it re-use the same graph, not draw a (new) duplicate one
1573//              x- update it to use the AAO as the input function (new func template -- see Gauss Utils)
1574//              x- the wrapper must be data folder aware, and data set aware like in the Wrapper panel
1575//              x- need a different wrapper for smeared and unsmeared functions
1576//
1577//
1578
1579
1580
1581Proc MapChiSquared(paramNum,percent)
1582        Variable paramNum=0,percent=10
1583        Prompt paramNum, "Enter parameter number: "
1584        Prompt percent, "Enter percent variation +/- : "
1585
1586        fChiMap(paramNum,percent)
1587End
1588
1589
1590// this does the math for a single value of "whichParam"
1591Function chi2gen(funcStr,folderStr,xw,yw,sw,cw,whichParam,searchArea,lhs,rhs,useResol)
1592        String funcStr,folderStr
1593        Wave xw,yw,sw,cw      //        x data, y data, error wave, and coefficient wave
1594        variable whichParam, searchArea  //which of the parameters to you want to vary, how far from the original value do you want to search (%)
1595        variable lhs, rhs    //specify a region of interest in the data using a left hand side and right hand side.
1596        variable useResol               // =1 if smeared used
1597 
1598        variable originalvalue = cw[whichparam]
1599        variable range = originalValue * searchArea/100
1600        variable ii,err
1601 
1602        duplicate/o yw, :theoretical_data, :chi2_data
1603        Wave theoretical_data, chi2_data
1604 
1605        make/o/n=200/d chi2_map
1606        setscale/I x,  originalvalue - range/2, originalvalue + range/2, chi2_map
1607 
1608        String DF="root:"+folderStr+":"
1609        String suffix=getModelSuffix(funcStr)
1610
1611        // fill a struct instance whether it is needed or not
1612        Struct ResSmearAAOStruct fs
1613        WAVE/Z resW = $(DF+folderStr+"_res")                    //these may not exist, if 3-column data is used
1614        WAVE/Z fs.resW =  resW
1615//              WAVE yw=$(DF+folderStr+"_i")
1616//              WAVE xw=$(DF+folderStr+"_q")
1617//              WAVE sw=$(DF+folderStr+"_s")
1618        Wave fs.coefW = cw
1619        Wave fs.yW = theoretical_data
1620        Wave fs.xW = xw
1621 
1622 
1623 
1624        for(ii=0 ; ii < numpnts(chi2_map) ; ii+=1)
1625                cw[whichparam] = pnt2x(chi2_map, ii)
1626 
1627                if(useResol)
1628                        FUNCREF SANSModelSTRUCT_proto func1=$funcStr
1629                        err = func1(fs)
1630                else
1631                        FUNCREF SANSModelAAO_proto func2=$funcStr
1632                        func2(cw,theoretical_data,xw)
1633                endif
1634               
1635                chi2_data = (yw-theoretical_data)^2
1636 
1637                chi2_data /= sw^2
1638
1639                Wavestats/q/R=[lhs, rhs] chi2_data
1640 
1641                chi2_map[ii] = V_avg * V_npnts
1642        endfor
1643 
1644        cw[whichparam] = originalvalue
1645 
1646        DoWindow/F Chi2
1647        if(V_flag==0)
1648                display/K=1/N=Chi2 chi2_map
1649                Label left "Chi^2"
1650        endif
1651
1652        String parStr=GetWavesDataFolder(cw,1)+ WaveList("*param*"+"_"+suffix, "", "TEXT:1," )          // this is *hopefully* one wave
1653        Wave/T parW = $parStr
1654        Label bottom parW[whichParam]
1655       
1656       
1657        killwaves/z theoretical_data, chi2_data
1658End
1659 
1660
1661// this does the setup
1662Function fChiMap(paramNum,percent)
1663        Variable paramNum,percent
1664
1665        String folderStr,funcStr,coefStr
1666        Variable useCursors,useResol=0,pt1,pt2
1667       
1668        ControlInfo/W=WrapperPanel popup_0
1669        folderStr=S_Value
1670       
1671        ControlInfo/W=WrapperPanel popup_1
1672        funcStr=S_Value
1673       
1674        ControlInfo/W=WrapperPanel popup_2
1675        coefStr=S_Value
1676       
1677        ControlInfo/W=WrapperPanel check_0
1678        useCursors=V_Value
1679       
1680       
1681// first, figure out where we are...
1682        String suffix=getModelSuffix(funcStr)
1683       
1684        SetDataFolder $("root:"+folderStr)
1685        if(!exists(coefStr))
1686                // must be unsmeared model, work in the root folder
1687                SetDataFolder root:                             
1688                if(!exists(coefStr))            //this should be fine if the coef filter is working, but check anyhow
1689                        DoAlert 0,"the coefficient and data sets do not match"
1690                        return 0
1691                endif
1692        endif
1693               
1694        WAVE cw=$(coefStr)
1695
1696
1697// test for smeared function
1698        if(stringmatch(funcStr, "Smear*"))              // if it's a smeared function, need a struct
1699                useResol=1
1700        endif
1701       
1702        // fill a struct instance whether I need one or not
1703        String DF="root:"+folderStr+":"
1704       
1705//      Struct ResSmearAAOStruct fs
1706//      WAVE/Z resW = $(DF+folderStr+"_res")                    //these may not exist, if 3-column data is used
1707//      WAVE/Z fs.resW =  resW
1708        WAVE yw=$(DF+folderStr+"_i")
1709        WAVE xw=$(DF+folderStr+"_q")
1710        WAVE sw=$(DF+folderStr+"_s")
1711//      Wave fs.coefW = cw
1712//      Wave fs.yW = yw
1713//      Wave fs.xW = xw
1714       
1715        if(useCursors)
1716                if(pcsr(A) > pcsr(B))
1717                        pt1 = pcsr(B)
1718                        pt2 = pcsr(A)
1719                else
1720                        pt1 = pcsr(A)
1721                        pt2 = pcsr(B)
1722                endif
1723        else
1724                //if cursors are not being used, find the first and last points of the data set, and pass them
1725                pt1 = 0
1726                pt2 = numpnts(yw)-1
1727        endif
1728       
1729               
1730       
1731        chi2gen(funcStr,folderStr,xw,yw,sw,cw,paramNum,percent,pt1,pt2,useResol)
1732       
1733
1734End
1735
1736////////////////////////////////////
1737// Modification from Matt Wasbrough to allow rescaling of the
1738// axes while plotting and fitting. allows export of the rescaled
1739// data and of the rescaled model
1740// Nov 2012
1741///
1742
1743Function UseRescaleAxisCheckProc(cba) : CheckBoxControl
1744        STRUCT WMCheckboxAction &cba
1745
1746        switch( cba.eventCode )
1747                case 2: // mouse up
1748                        Variable checked = cba.checked
1749                        if(checked)
1750                                Execute "OpenAxisPanel()"
1751                        else
1752                                if(exists("RescaleAxisPanel") !=0)
1753                                        DoWindow/K RescaleAxisPanel
1754                                endif
1755                        endif
1756                        break
1757        endswitch
1758
1759        return 0
1760End
1761
1762Proc OpenAxisPanel()
1763        If(WinType("RescaleAxisPanel") == 0)
1764                //create the necessary data folder
1765                NewDataFolder/O root:Packages
1766                NewDataFolder/O root:Packages:NIST
1767                NewDataFolder/O root:Packages:NIST:RescaleAxis
1768                //initialize the values
1769                Variable/G root:Packages:NIST:RescaleAxis:gRAExpA = 1
1770                Variable/G root:Packages:NIST:RescaleAxis:gRAExpB = 1
1771                Variable/G root:Packages:NIST:RescaleAxis:gRAExpC = 1
1772                RescaleAxisPanel()
1773        else
1774                //window already exists, just bring to front for update
1775                DoWindow/F RescaleAxisPanel
1776        endif
1777End
1778
1779Window RescaleAxisPanel()
1780        PauseUpdate; Silent 1           // building window...
1781        NewPanel /W=(461,46,735,195)/K=1
1782        ModifyPanel cbRGB=(49360,30954,64507), fixedSize=1
1783        SetDrawLayer UserBack
1784        PopupMenu ymodel,pos={20,10},size={76,19},title="y-axis"
1785        PopupMenu ymodel,help={"This popup selects how the y-axis will be linearized based on the chosen data"}
1786        PopupMenu ymodel,mode=1,value= #"\"I;log(I);ln(I);1/I;I^a;Iq^a;I^a q^b;1/sqrt(I);ln(Iq);ln(Iq^2)\""
1787        Button GoRescale,pos={50,80},size={70,20},proc=RescalePlot,title="Rescale"
1788        Button GoRescale,help={"This button will rescale the axis using the selections in this panel"}
1789        Button DoneButton,pos={170,80},size={70,20},proc=RADoneButton,title="Done"
1790        Button DoneButton,help={"This button will close the panel"}
1791        Button ExportData, pos={100,110}, size={90,20}, proc=ExportData, title="Export Data"
1792        Button ExportData, help={"This button will export data from the top graph"}
1793        SetVariable expa,pos={13,45},size={80,17},title="pow \"a\""
1794        SetVariable expa,help={"This sets the exponent \"a\" for some y-axis formats. The value is ignored if the model does not use an adjustable exponent"}
1795        SetVariable expa,limits={-2,10,0},value= root:Packages:NIST:RescaleAxis:gRAExpA
1796        SetVariable expb,pos={98,45},size={80,17},title="pow \"b\""
1797        SetVariable expb,help={"This sets the exponent \"b\" for some x-axis formats. The value is ignored if the model does not use an adjustable exponent"}
1798        SetVariable expb,limits={0,10,0},value= root:Packages:NIST:RescaleAxis:gRAExpB
1799        PopupMenu xmodel,pos={155,10},size={79,19},title="x-axis"
1800        PopupMenu xmodel,help={"This popup selects how the x-axis will be linearized given the chosen data"}
1801        PopupMenu xmodel,mode=1,value= #"\"q;log(q);q^2;q^c\""
1802        SetVariable expc,pos={182,45},size={80,17},title="pow \"c\""
1803        SetVariable expc,help={"This sets the exponent \"c\" for some x-axis formats. The value is ignored if the model does not use \"c\" as an adjustable exponent"}
1804        SetVariable expc,limits={-10,10,0},value= root:Packages:NIST:RescaleAxis:gRAExpC
1805        Button RAHelp, pos={220,110}, size={20,20}, proc=RAHelpButtonProc, title="?"
1806EndMacro
1807
1808Proc RADoneButton(ctrlName): ButtonControl
1809        String ctrlName
1810        DoWindow/K RescaleAxisPanel
1811        DoWindow/F WrapperPanel
1812        CheckBox check_8 value=0
1813end
1814
1815Function RAHelpButtonProc(ba) : ButtonControl
1816        STRUCT WMButtonAction &ba
1817
1818        switch( ba.eventCode )
1819                case 2: // mouse up
1820                        // click code here
1821                        DisplayHelpTopic/Z/K=1 "Rescaled Axis"
1822                        if(V_flag !=0)
1823                                DoAlert 0,"The Rescaled Axis Help file could not be found"
1824                        endif
1825                        break
1826        endswitch
1827
1828        return 0
1829End
1830
1831Proc ExportData(ctrlName): ButtonControl
1832        string ctrlName
1833        WriteRescaledData()             
1834End
1835       
1836
1837Function RescalePlot (ctrlName): ButtonControl
1838        String ctrlName
1839        SetDataFolder root:
1840        String topGraph= WinName(0,1)   //this is the topmost graph
1841        if(strlen(topGraph)==0)
1842                Abort "There is no graph"
1843        endif
1844               
1845        DoWindow/F $topGraph
1846        GetWindow/Z $topGraph, wavelist
1847        wave/t W_Wavelist
1848        SetDataFolder root:Packages:NIST:RescaleAxis
1849        if (exists("W_WaveList")==1)
1850                KillWaves/Z root:Packages:NIST:RescaleAxis:W_WaveList
1851        endif
1852        MoveWave root:W_WaveList, root:Packages:NIST:RescaleAxis:W_WaveList
1853        SetDataFolder root:Packages:NIST:RescaleAxis
1854        variable i,j,k
1855        string DF,DF1,temp, temp2, t1
1856        for (i=0; i < numpnts(W_WaveList)/3; i+=1)
1857                temp = W_WaveList[i][1]
1858                if (stringmatch(temp, "*_i") || stringmatch(temp, "*_i_RA"))
1859                        temp = W_WaveList[i][0]
1860                        if(stringmatch(temp, "*_i"))
1861                                temp = removeending(temp, "_i")
1862                        elseif(stringmatch(temp, "*_i_RA"))
1863                                temp = removeending(temp, "_i_RA")
1864                        endif
1865                        Make/T/O $temp/Wave=tempWave
1866                        DF = ReplaceString(W_Wavelist[i][0],W_Wavelist[i][1],"")
1867                        if (strlen(DF) ==0)
1868                                DF = ":"
1869                        endif
1870                        DF1 = "root"+DF
1871                        tempWave[0] = DF1
1872                        k = 1
1873                        for(j=0;j<numpnts(W_WaveList)/3; j+=1)
1874                                if (stringmatch(W_WaveList[j][1], "*"+temp+"*"))
1875                                        tempWave[k] = W_WaveList[j][0]
1876                                        k  = k+1
1877                                endif
1878                        endfor
1879                        redimension/N=(k) tempWave
1880                elseif(stringmatch(temp, "*ywave*"))
1881                        temp = W_WaveList[i][0]
1882                        if(stringmatch(temp, "*_RA"))
1883                                temp = removeending(temp, "_RA")
1884                        endif                   
1885                        Make/T/O $temp/Wave=tempWave
1886                        DF = ReplaceString(W_Wavelist[i][0],W_Wavelist[i][1],"")
1887                        if (strlen(DF) ==0)
1888                                DF = ":"
1889                        endif
1890                        DF1 = "root"+DF
1891                        tempWave[0] = DF1
1892                        temp2 = replacestring("ywave", temp, "")
1893                        k = 1
1894                        for(j=0;j<numpnts(W_WaveList)/3; j+=1)
1895                                t1 = W_Wavelist[j][1]
1896                                if (stringmatch(W_WaveList[j][1], "*wave"+temp2+"*"))
1897                                        tempWave[k] = W_WaveList[j][1]
1898                                        k  = k+1
1899                                endif
1900                        endfor
1901                        redimension/N=(k) tempWave
1902                endif
1903        endfor
1904        KillWaves/Z W_Wavelist
1905        string listWave = Wavelist("*", ";", "TEXT:1")
1906        string WaveToRescale, WaveDataFolder,xwave, ywave, swave
1907       
1908        for (i = 0; i < ItemsInList(listWave,";"); i+=1)
1909                temp = StringFromList(i,listWave,";")
1910                Wave/T WaveString = $temp
1911                for (j=1; j < numpnts(WaveString); j+=1)
1912                         WaveToRescale = Wavestring[j]
1913                         if (stringmatch(WaveToRescale, "*_RA"))
1914                                WaveToRescale = RemoveEnding(WaveToRescale, "_RA")
1915                         endif
1916                WaveDataFolder = WaveString[0]
1917                SetDataFolder $WaveDataFolder
1918                if (stringmatch(WaveToRescale, "*_q"))
1919                xwave = WaveToRescale
1920                XRescale(xwave)
1921                elseif (stringmatch(WaveToRescale, "*_i"))
1922                ywave = WaveToRescale
1923                xwave = RemoveEnding(WaveToRescale, "_i")+"_q"
1924                YRescale(ywave, xwave)
1925                elseif (stringmatch(WaveToRescale, "*_s"))
1926                swave = WaveToRescale
1927                ywave = RemoveEnding(WaveToRescale, "_s")+"_i"
1928                xwave = RemoveEnding(WaveToRescale, "_s")+"_q"
1929                ERescale(swave, ywave, xwave)
1930                elseif (stringmatch(WaveToRescale, "xwave_*"))
1931                xwave=WaveToRescale
1932                XRescale(xwave)
1933                elseif (stringmatch(WaveToRescale, "ywave_*"))
1934                ywave = WaveToRescale
1935                xwave= ReplaceString("ywave", WaveToRescale, "xwave")
1936                YRescale(ywave, xwave)
1937                elseif(stringmatch(WaveToRescale, "*_qvals"))
1938                xwave = WaveToRescale
1939                XRescale(xwave)
1940                elseif(stringmatch(WaveToRescale, "smeared*") && stringmatch(WaveToRescale, "!*_qvals"))
1941                ywave = WaveToRescale
1942                                for (k=1; k < numpnts(WaveString); k+=1)
1943                                        if (stringmatch(Wavestring[k], "*_qvals"))
1944                                                xwave = Wavestring[k]
1945                                        endif
1946                                endfor
1947                YRescale(ywave, xwave)
1948                else
1949                ywave = WaveToRescale
1950                        for (k=1; k < numpnts(WaveString); k+=1)
1951                                if (stringmatch(Wavestring[k], "*_q"))
1952                                        xwave = Wavestring[k]
1953                                endif
1954                        endfor
1955                YRescale(ywave,xwave)
1956                string yAxis = ywave+"_RA"
1957                wave yAxisWave = $yAxis
1958                SetFormula yAxisWave, "YRescale(ywave,xwave)"
1959                endif
1960                SetDataFolder root:Packages:NIST:RescaleAxis
1961                endfor
1962        endfor
1963       
1964        string oldywave, xstr, ystr
1965        for (i = 0; i < ItemsInList(listWave,";"); i+=1)
1966                temp = StringFromList(i,listWave,";")
1967                Wave/T WaveString = $temp
1968                for (j=1; j < numpnts(WaveString); j+=1)
1969                         WaveToRescale = Wavestring[j]
1970                WaveDataFolder = WaveString[0]
1971                SetDataFolder $WaveDataFolder
1972                ControlInfo/W=RescaleAxisPanel yModel
1973                ystr = S_Value
1974                ControlInfo/W=RescaleAxisPanel xModel
1975                xstr = S_Value
1976                        if(cmpstr("I",ystr)==0 && cmpstr("q",xstr)==0)
1977                                if(stringmatch(WaveToRescale, "*_i_RA"))
1978                                        oldywave = WaveToRescale
1979                                        ywave = RemoveEnding(WaveToRescale,"_RA")
1980                                        xwave = RemoveEnding(WaveToRescale, "_i_RA")+"_q"
1981                                        replacewave/Y/W=$topGraph trace=$oldywave, $ywave
1982                                        replacewave/X/W=$topGraph trace=$ywave, $xwave
1983                                        swave = RemoveEnding(WaveToRescale, "_i_RA")+"_s"
1984                                        if(exists(swave)==1)
1985                                                ErrorBars/T=0/W=$topGraph $ywave, Y wave=($swave,$swave)       
1986                                        endif
1987                                elseif (stringmatch(WaveToRescale,  "smeared*"))
1988                                        if(stringmatch(WaveToRescale,"*_RA") && stringmatch(WaveToRescale,"!*_qvals*") )
1989                                                oldywave = WaveToRescale
1990                                                ywave = RemoveEnding(WaveToRescale,"_RA")
1991                                                xwave = "smeared_qvals"
1992                                                replacewave/Y/W=$topGraph trace=$oldywave, $ywave
1993                                                replacewave/X/W=$topGraph trace=$ywave, $xwave
1994                                        endif
1995                                elseif(stringmatch(WaveToRescale,"ywave*") && stringmatch(WaveToRescale,"*_RA"))
1996                                        oldywave = WaveToRescale
1997                                        ywave = RemoveEnding(WaveToRescale,"_RA")
1998                                        xwave = ReplaceString("ywave",ywave,"xwave")
1999                                        replacewave/Y/W=$topGraph trace=$oldywave, $ywave
2000                                        replacewave/X/W=$topGraph trace=$ywave, $xwave                                 
2001                                elseif(stringmatch(WaveToRescale, "*FitYw*") && stringmatch(WaveToRescale, "*_RA"))
2002                                        oldywave = WaveToRescale
2003                                        ywave = RemoveEnding(WaveToRescale,"_RA")
2004                                        for (k=1; k < numpnts(WaveString); k+=1)
2005                                                if (stringmatch(Wavestring[k], "*_q"))
2006                                                        xwave = Wavestring[k]
2007                                                endif
2008                                        endfor
2009                                        replacewave/Y/W=$topGraph trace=$oldywave, $ywave
2010                                        replacewave/X/W=$topGraph trace=$ywave, $xwave 
2011                                endif                   
2012                        elseif(stringmatch(WaveToRescale, "*_RA"))
2013                        elseif (stringmatch(WaveToRescale, "*_i"))
2014                                DoWindow/F topGraph
2015                                oldywave = WaveToRescale
2016                                xwave = RemoveEnding(WaveToRescale, "_i")+"_q_RA"
2017                                ywave = WaveToRescale + "_RA"
2018                                replacewave/Y/W=$topGraph trace=$oldywave, $ywave
2019                                replacewave/X/W=$topGraph trace=$ywave, $xwave
2020                                ModifyGraph log=0
2021                                swave = RemoveEnding(WaveToRescale, "_i")+"_s_RA"
2022                                if(exists(swave)==1)
2023                                        ErrorBars/T=0/W=$topGraph $ywave, Y wave=($swave,$swave)       
2024                                endif
2025                                DoUpdate       
2026                        elseif(stringmatch(WaveToRescale, "smeared*") && stringmatch(WaveToRescale, "!*_qvals"))
2027                                oldywave = WaveToRescale
2028                                ywave = WaveToRescale + "_RA"
2029                                replacewave/Y/W=$topGraph trace=$oldywave, $ywave
2030                                xwave = "smeared_qvals_RA"
2031                                replacewave/X/W=$topGraph trace=$ywave, $xwave 
2032                        elseif(stringmatch(WaveToRescale,"ywave*"))
2033                                oldywave = WaveToRescale
2034                                ywave = WaveToRescale + "_RA"
2035                                xwave = ReplaceString("ywave",ywave,"xwave")
2036                                replacewave/Y/W=$topGraph trace=$oldywave, $ywave
2037                                replacewave/X/W=$topGraph trace=$ywave, $xwave                                 
2038                        elseif(stringmatch(WaveToRescale, "*FitYw*"))
2039                                oldywave = WaveToRescale
2040                                ywave = WaveToRescale+"_RA"
2041                                for (k=1; k < numpnts(WaveString); k+=1)
2042                                        if (stringmatch(Wavestring[k], "*_q"))
2043                                                xwave = Wavestring[k]+"_RA"
2044                                        endif
2045                                endfor
2046                                replacewave/Y/W=$topGraph trace=$oldywave, $ywave
2047                                replacewave/X/W=$topGraph trace=$ywave, $xwave 
2048                        endif
2049                        SetDataFolder root:Packages:NIST:RescaleAxis
2050                        DoUpdate
2051                endfor
2052        endfor
2053        KillWaves/A/Z
2054               
2055        string ylabel, xlabel
2056        ControlInfo/W=RescaleAxisPanel yModel
2057        ystr = S_Value
2058        ControlInfo/W=RescaleAxisPanel xModel
2059        xstr = S_Value
2060       
2061        if(cmpstr("I",ystr)==0 && cmpstr("q",xstr)==0)
2062                modifygraph log=1
2063        else
2064                modifygraph log=0
2065        endif
2066       
2067        Variable pow_a,pow_b,pow_c
2068        ControlInfo/W=RescaleAxisPanel expa
2069        pow_a = V_value
2070        ControlInfo/W=RescaleAxisPanel expb
2071        pow_b = V_value
2072        ControlInfo/W=RescaleAxisPanel expc
2073        pow_c = V_value
2074       
2075        If (cmpstr("I",ystr) == 0)
2076                ylabel = "I(q)"
2077        elseif (cmpstr("ln(I)",ystr) == 0)
2078                ylabel = "ln(I)"
2079        elseif (cmpstr("log(I)",ystr) == 0)
2080                ylabel = "log(I)"
2081        elseif (cmpstr("1/I",ystr) == 0)
2082                ylabel = "1/I"
2083        elseif (cmpstr("I^a",ystr) == 0)
2084                ylabel = "I\S"+num2str(pow_a)+"\M"
2085        elseif (cmpstr("Iq^a",ystr) == 0)
2086                ylabel = "Iq\S"+num2str(pow_a)+"\M"
2087        elseif (cmpstr("I^a q^b",ystr) == 0)
2088                ylabel = "I\S"+num2str(pow_a)+"\Mq\S"+num2str(pow_b)+"\M"
2089        elseif (cmpstr("1/sqrt(I)",ystr) == 0)
2090                ylabel = "1/sqrt(I)"
2091        elseif (cmpstr("ln(Iq)",ystr) == 0)
2092                ylabel = "ln(Iq)"
2093        elseif (cmpstr("ln(Iq^2)",ystr) == 0)
2094                ylabel = "ln(Iq\S2\M)"
2095        endif
2096
2097        If (cmpstr("q",xstr) == 0)
2098                xlabel = "q (A\S-1\M)"
2099        elseif (cmpstr("q^2",xstr) == 0)
2100                xlabel = "q\S2\M"
2101        elseif (cmpstr("log(q)",xstr) == 0)
2102                xlabel = "log(q)"
2103        elseif (cmpstr("q^c",xstr) == 0)
2104                xlabel = "q\S"+num2str(pow_c)+"\M"
2105        endif
2106       
2107        SetAxis/A
2108        Label left ylabel
2109        Label bottom xlabel
2110       
2111        SetDataFolder root:
2112End
2113
2114Function YRescale(ywave, xwave)
2115        String ywave,xwave
2116 
2117        Wave yw = $ywave
2118        Wave xw = $xwave
2119       
2120        //Scaling exponents and background value
2121        Variable pow_a,pow_b,pow_c
2122        ControlInfo/W=RescaleAxisPanel expa
2123        pow_a = V_value
2124        ControlInfo/W=RescaleAxisPanel expb
2125        pow_b = V_value
2126        ControlInfo/W=RescaleAxisPanel expc
2127        pow_c = V_value
2128       
2129        //check for physical limits on exponent values
2130        // if bad values found, alert, and reset to good values so the rescaling can continue
2131        NVAR gA = root:Packages:NIST:RescaleAxis:gRAExpA
2132        NVAR gB = root:Packages:NIST:RescaleAxis:gRAExpB
2133        NVAR gC = root:Packages:NIST:RescaleAxis:gRAExpC
2134        if((pow_a < -2) || (pow_a > 10))
2135                DoAlert 0,"Exponent a must be in the range (-2,10) - the exponent a has been reset to 1"
2136                gA = 1
2137        endif
2138        if((pow_b < 0) || (pow_b > 10))
2139                DoAlert 0,"Exponent b must be in the range (0,10) - the exponent b has been reset to 1"
2140                gB = 1
2141        endif
2142        //if q^c is the x-scaling, c must be be within limits and also non-zero
2143        ControlInfo/W=RescaleAxisPanel xModel
2144        If (cmpstr("q^c",S_Value) == 0)
2145                if(pow_c == 0)
2146                        DoAlert 0,"Exponent c must be non-zero, c has been reset to 1"
2147                        gC = 1
2148                endif
2149                if((pow_c < -10) || (pow_c > 10))
2150                        DoAlert 0,"Exponent c must be in the range (-10,10), c has been reset to 1"
2151                        gC = 1
2152                endif
2153        endif
2154       
2155        //variables set for each model to control look of graph
2156        String ystr, yAxis
2157        //check for proper y-scaling selection, make the necessary waves
2158//      Wave yAxisWave
2159
2160        ControlInfo/W=RescaleAxisPanel yModel
2161        ystr = S_Value
2162       
2163        do
2164                If (cmpstr("I",S_Value) == 0)
2165                        yAxis = ywave+"_RA"
2166                        if (exists(yAxis)== 0)
2167                                Duplicate yw $yAxis
2168                        endif
2169                        SetScale d 0,0,"1/cm",$yAxis
2170                        wave yAxisWave = $yAxis
2171                        yAxisWave = yw
2172                        break   
2173                endif
2174                If (cmpstr("ln(I)",S_Value) == 0)
2175                        yAxis = ywave+"_RA"
2176                        if (exists(yAxis)== 0)
2177                                Duplicate yw $yAxis
2178                        endif
2179                        SetScale d 0,0,"",$yAxis
2180                        wave yAxisWave = $yAxis
2181                        yAxisWave = ln(yw)
2182                        break   
2183                endif
2184                If (cmpstr("log(I)",S_Value) == 0)
2185                        yAxis = ywave+"_RA"
2186                        if (exists(yAxis)== 0)
2187                                Duplicate yw $yAxis
2188                        endif
2189                        SetScale d 0,0,"",$yAxis
2190                        wave yAxisWave = $yAxis
2191                        yAxisWave = log(yw)
2192                        break   
2193                endif
2194                If (cmpstr("1/I",S_Value) == 0)
2195                        yAxis = ywave+"_RA"
2196                        if (exists(yAxis)== 0)
2197                                Duplicate yw $yAxis
2198                        endif
2199                        SetScale d 0,0,"",$yAxis
2200                        wave yAxisWave = $yAxis
2201                        yAxisWave = 1/(yw)
2202                        break
2203                endif
2204                If (cmpstr("I^a",S_Value) == 0)
2205                        yAxis = ywave+"_RA"
2206                        if (exists(yAxis)== 0)
2207                                Duplicate yw $yAxis
2208                        endif
2209                        SetScale d 0,0,"",$yAxis
2210                        wave yAxisWave = $yAxis
2211                        yAxisWave = yw^pow_a
2212                        break
2213                endif
2214                If (cmpstr("Iq^a",S_Value) == 0)
2215                        yAxis = ywave+"_RA"
2216                        if (exists(yAxis)== 0)
2217                                Duplicate yw $yAxis
2218                        endif
2219                        SetScale d 0,0,"",$yAxis
2220                        wave yAxisWave = $yAxis
2221                        yAxisWave = yw*xw^pow_a
2222                        break
2223                endif
2224                If (cmpstr("I^a q^b",S_Value) == 0)
2225                        yAxis = ywave+"_RA"
2226                        if (exists(yAxis)== 0)
2227                                Duplicate yw $yAxis
2228                        endif
2229                        SetScale d 0,0,"",$yAxis
2230                        wave yAxisWave = $yAxis
2231                        yAxisWave = yw^pow_a*xw^pow_b
2232                        break
2233                endif
2234                If (cmpstr("1/sqrt(I)",S_Value) == 0)
2235                        yAxis = ywave+"_RA"
2236                        if (exists(yAxis)== 0)
2237                                Duplicate yw $yAxis
2238                        endif
2239                        SetScale d 0,0,"",$yAxis
2240                        wave yAxisWave = $yAxis
2241                        yAxisWave = 1/sqrt(yw)
2242                        break
2243                endif
2244                If (cmpstr("ln(Iq)",S_Value) == 0)
2245                        yAxis = ywave+"_RA"
2246                        if (exists(yAxis)== 0)
2247                                Duplicate yw $yAxis
2248                        endif
2249                        SetScale d 0,0,"",$yAxis
2250                        wave yAxisWave = $yAxis
2251                        yAxisWave = ln(xw*yw)
2252                        break
2253                endif
2254                If (cmpstr("ln(Iq^2)",S_Value) == 0)
2255                        yAxis = ywave+"_RA"
2256                        if (exists(yAxis)== 0)
2257                                Duplicate yw $yAxis
2258                        endif
2259                        SetScale d 0,0,"",$yAxis
2260                        wave yAxisWave = $yAxis
2261                        yAxisWave = ln(xw*xw*yw)
2262                        break
2263                endif
2264                //more ifs for each case
2265               
2266                // if selection not found, abort
2267                DoAlert 0,"Y-axis scaling incorrect. Aborting"
2268                Abort
2269        while(0)
2270End
2271
2272Function XRescale(xwave)       
2273        String xwave
2274 
2275        Wave xw = $xwave
2276                 
2277        //Scaling exponents and background value
2278        Variable pow_a,pow_b,pow_c
2279        ControlInfo/W=RescaleAxisPanel expa
2280        pow_a = V_value
2281        ControlInfo/W=RescaleAxisPanel expb
2282        pow_b = V_value
2283        ControlInfo/W=RescaleAxisPanel expc
2284        pow_c = V_value
2285       
2286//check for physical limits on exponent values
2287// if bad values found, alert, and reset to good values so the rescaling can continue
2288        NVAR gA = root:Packages:NIST:RescaleAxis:gRAExpA
2289        NVAR gB = root:Packages:NIST:RescaleAxis:gRAExpB
2290        NVAR gC = root:Packages:NIST:RescaleAxis:gRAExpC
2291        if((pow_a < -2) || (pow_a > 10))
2292                DoAlert 0,"Exponent a must be in the range (-2,10) - the exponent a has been reset to 1"
2293                gA = 1
2294        endif
2295        if((pow_b < 0) || (pow_b > 10))
2296                DoAlert 0,"Exponent b must be in the range (0,10) - the exponent b has been reset to 1"
2297                gB = 1
2298        endif
2299        //if q^c is the x-scaling, c must be be within limits and also non-zero
2300        ControlInfo/W=RescaleAxisPanel xModel
2301        If (cmpstr("q^c",S_Value) == 0)
2302                if(pow_c == 0)
2303                        DoAlert 0,"Exponent c must be non-zero, c has been reset to 1"
2304                        gC = 1
2305                endif
2306                if((pow_c < -10) || (pow_c > 10))
2307                        DoAlert 0,"Exponent c must be in the range (-10,10), c has been reset to 1"
2308                        gC = 1
2309                endif
2310        endif
2311       
2312        //variables set for each model to control look of graph
2313        String xstr, xAxis
2314        //check for proper y-scaling selection, make the necessary waves
2315//      Wave xAxisWave
2316
2317        ControlInfo/W=RescaleAxisPanel xModel
2318        xstr = S_Value
2319        do
2320                // make the new yaxis wave
2321                If (cmpstr("q",S_Value) == 0)   
2322                        xAxis = xwave+"_RA"
2323                        if (exists(xAxis)== 0)
2324                                Duplicate xw $xAxis
2325                        endif
2326                        SetScale d 0,0,"A^-1",$xAxis
2327                        wave xAxisWave = $xAxis
2328                        xAxisWave = xw
2329                        break   
2330                endif
2331                If (cmpstr("q^2",S_Value) == 0)
2332                        xAxis = xwave+"_RA"
2333                        if (exists(xAxis)== 0)
2334                                Duplicate xw $xAxis
2335                        endif
2336                        SetScale d 0,0,"A^-2",$xAxis
2337                        wave xAxisWave = $xAxis
2338                        xAxisWave = xw*xw
2339                        break   
2340                endif
2341                If (cmpstr("log(q)",S_Value) == 0)     
2342                        xAxis = xwave+"_RA"
2343                        if (exists(xAxis)== 0)
2344                                Duplicate xw $xAxis
2345                        endif
2346                        SetScale d 0,0,"",$xAxis
2347                        wave xAxisWave = $xAxis
2348                        xAxisWave = log(xw)
2349                        break   
2350                endif
2351                If (cmpstr("q^c",S_Value) == 0)
2352                        xAxis = xwave+"_RA"
2353                        if (exists(xAxis)== 0)
2354                                Duplicate xw $xAxis
2355                        endif
2356                        SetScale d 0,0,"", $xAxis
2357                        wave xAxisWave = $xAxis
2358                        xAxisWave = xw^pow_c
2359                        break
2360                endif
2361       
2362                //more ifs for each case
2363                // if selection not found, abort
2364                DoAlert 0,"X-axis scaling incorrect. Aborting"
2365                Abort
2366        while(0)        //end of "case" statement for x-axis scaling
2367End
2368
2369Function ERescale(swave, ywave, xwave) 
2370        String swave, ywave, xwave
2371 
2372        Wave ew = $swave
2373        Wave yw = $ywave
2374        Wave xw = $xwave
2375                 
2376        //Scaling exponents and background value
2377        Variable pow_a,pow_b,pow_c
2378        ControlInfo/W=RescaleAxisPanel expa
2379        pow_a = V_value
2380        ControlInfo/W=RescaleAxisPanel expb
2381        pow_b = V_value
2382        ControlInfo/W=RescaleAxisPanel expc
2383        pow_c = V_value
2384       
2385//check for physical limits on exponent values
2386// if bad values found, alert, and reset to good values so the rescaling can continue
2387        NVAR gA = root:Packages:NIST:RescaleAxis:gRAExpA
2388        NVAR gB = root:Packages:NIST:RescaleAxis:gRAExpB
2389        NVAR gC = root:Packages:NIST:RescaleAxis:gRAExpC
2390        if((pow_a < -2) || (pow_a > 10))
2391                DoAlert 0,"Exponent a must be in the range (-2,10) - the exponent a has been reset to 1"
2392                gA = 1
2393        endif
2394        if((pow_b < 0) || (pow_b > 10))
2395                DoAlert 0,"Exponent b must be in the range (0,10) - the exponent b has been reset to 1"
2396                gB = 1
2397        endif
2398        //if q^c is the x-scaling, c must be be within limits and also non-zero
2399        ControlInfo/W=RescaleAxisPanel xModel
2400        If (cmpstr("q^c",S_Value) == 0)
2401                if(pow_c == 0)
2402                        DoAlert 0,"Exponent c must be non-zero, c has been reset to 1"
2403                        gC = 1
2404                endif
2405                if((pow_c < -10) || (pow_c > 10))
2406                        DoAlert 0,"Exponent c must be in the range (-10,10), c has been reset to 1"
2407                        gC = 1
2408                endif
2409        endif
2410       
2411        //variables set for each model to control look of graph
2412        String ystr, eWave
2413        //check for proper y-scaling selection, make the necessary waves
2414//      Wave yErrWave
2415
2416        ControlInfo/W=RescaleAxisPanel yModel
2417        ystr = S_Value
2418        do
2419               
2420                If (cmpstr("I",S_Value) == 0)
2421                        eWave = swave+"_RA"
2422                        if (exists(eWave) == 0)
2423                                Duplicate ew $eWave
2424                        endif
2425                        wave yErrWave = $eWave
2426                        yErrWave = ew
2427                        break   
2428                endif
2429                If (cmpstr("ln(I)",S_Value) == 0)
2430                        eWave = swave+"_RA"
2431                        if (exists(eWave) == 0)
2432                                Duplicate ew $eWave
2433                        endif
2434                        wave yErrWave = $eWave
2435                        yErrWave = ew/yw
2436                        break   
2437                endif
2438                If (cmpstr("log(I)",S_Value) == 0)
2439                        eWave = swave+"_RA"
2440                        if (exists(eWave) == 0)
2441                                Duplicate ew $eWave
2442                        endif
2443                        wave yErrWave = $eWave
2444                        yErrWave = ew/(2.30*yw)
2445                        break   
2446                endif
2447                If (cmpstr("1/I",S_Value) == 0)
2448                        eWave = swave+"_RA"
2449                        if (exists(eWave) == 0)
2450                                Duplicate ew $eWave
2451                        endif
2452                        wave yErrWave = $eWave
2453                        yErrWave = ew/(yw^2)
2454                        break
2455                endif
2456                If (cmpstr("I^a",S_Value) == 0)
2457                        eWave = swave+"_RA"
2458                        if (exists(eWave) == 0)
2459                                Duplicate ew $eWave
2460                        endif
2461                        wave yErrWave = $eWave
2462                        yErrWave = ew*abs(pow_a*(yw^(pow_a-1)))
2463                        break
2464                endif
2465                If (cmpstr("Iq^a",S_Value) == 0)
2466                        eWave = swave+"_RA"
2467                        if (exists(eWave) == 0)
2468                                Duplicate ew $eWave
2469                        endif
2470                        wave yErrWave = $eWave
2471                        yErrWave = ew*xw^pow_a
2472                        break
2473                endif
2474                If (cmpstr("I^a q^b",S_Value) == 0)
2475                        eWave = swave+"_RA"
2476                        if (exists(eWave) == 0)
2477                                Duplicate ew $eWave
2478                        endif
2479                        wave yErrWave = $eWave
2480                        yErrWave = ew*abs(pow_a*(yw^(pow_a-1)))*xw^pow_b
2481                        break
2482                endif
2483                If (cmpstr("1/sqrt(I)",S_Value) == 0)
2484                        eWave = swave+"_RA"
2485                        if (exists(eWave) == 0)
2486                                Duplicate ew $eWave
2487                        endif
2488                        wave yErrWave = $eWave
2489                        yErrWave = 0.5*ew*yw^(-1.5)
2490                        break
2491                endif
2492                If (cmpstr("ln(Iq)",S_Value) == 0)
2493                        eWave = swave+"_RA"
2494                        if (exists(eWave) == 0)
2495                                Duplicate ew $eWave
2496                        endif
2497                        wave yErrWave = $eWave
2498                        yErrWave =ew/yw
2499                        break
2500                endif
2501                If (cmpstr("ln(Iq^2)",S_Value) == 0)
2502                        eWave = swave+"_RA"
2503                        if (exists(eWave) == 0)
2504                                Duplicate ew $eWave
2505                        endif
2506                        wave yErrWave = $eWave
2507                        yErrWave = ew/yw
2508                        break
2509                endif
2510                //more ifs for each case
2511               
2512                // if selection not found, abort
2513                DoAlert 0,"Y-axis scaling incorrect. Aborting"
2514                Abort
2515        while(0)        //end of "case" statement for y-axis scaling
2516
2517End
2518
2519///////////////////////////
2520
Note: See TracBrowser for help on using the repository browser.