source: sans/Dev/trunk/NCNR_User_Procedures/Common/Packages/PlotManager/PlotUtilsMacro_v40.ipf @ 1091

Last change on this file since 1091 was 1091, checked in by srkline, 4 years ago

a number of changes, mostly to allow everything to compile.

added conditional compile to ensure that XML code would not be compiled if VSANS was present, since it's not XML-aware.

modified V_MainPanel to avoid conflicts with the SANS version. There still may be some functions hidden in procedures that do not have the V_ prefix yet, but these are either for functions that should point to a common file, or procedures that have been hidden from the VSANS panel

modified saving of VSANS mask files so that they can still be saved from teh deom version where home path is not defined.

File size: 74.4 KB
Line 
1#pragma rtGlobals=1             // Use modern global access method.
2#pragma version=4.00
3#pragma IgorVersion=6.1
4
5// This is to be used with the Analysis packages ONLY
6// there are a number of utility procedures here for loading
7// data and generating valid lists of data files that are
8// directly copied from the Reduction package
9// -- There WILL be name conflicts if you mix the two...
10//
11// 16 DEC 05 SRK
12// prepended function names with A_ to tag them for the
13// "A"nalysis parckage, though nearly all are duplicate procedures
14// so there will be no overlap with the reduction package
15//
16//
17// these extra procedures are used by:
18// Linearized fits (duplicated in Reduction - will need to handle gently)
19// Invariant (no overlap with reduction)
20//
21// SRK MAR 2005
22
23// create a KW=string; of model=coef correspondence as the models are plotted, rather than
24// some other hard-wired solution
25Function AddModelToStrings(funcStr,coefStr,paramStr,suffix)
26        String funcStr,coefStr,paramStr,suffix
27       
28        if(exists("root:Packages:NIST:paramKWStr")==0)
29                String/G root:Packages:NIST:coefKWStr=""
30                String/G root:Packages:NIST:paramKWStr=""
31                String/G root:Packages:NIST:suffixKWStr=""
32        endif
33        SVAR coefKWStr = root:Packages:NIST:coefKWStr
34        SVAR paramKWStr = root:Packages:NIST:paramKWStr
35        SVAR suffixKWStr = root:Packages:NIST:suffixKWStr
36        coefKWStr += funcStr+"="+coefStr+";"
37        paramKWStr += funcStr+"="+paramStr+";"
38        suffixKWStr += funcStr+"="+suffix+";"
39end
40
41// always pass this the function string
42//
43// this is new in the 2009 release, so make sure that it generates itself as needed.
44// Two options: (1) search and construct as needed, ask for intervention if I need it.
45// (2) since I'm passed the function, try to replot it to re-run the function
46// to fill in the strings. (Being sure to save the coefficients)
47//
48// using method (1) to fill in what I need with no intervention
49//
50Function/S getFunctionParams(funcStr)
51        String funcStr
52
53        String paramStr=""
54        SVAR/Z listStr=root:Packages:NIST:paramKWStr
55
56        if(SVAR_Exists(listStr))
57                paramStr = StringByKey(funcStr, listStr  ,"=",";",0)
58                if(strlen(paramStr)!=0)                 //will drop out of loop if string can't be found
59                        return(paramStr)
60                endif
61        else    //global string does not exist, create it and fill it in
62                Variable/G root:Pacakges:NIST:gReconstructStrings = 1                   //coefficients old style and must be rebuilt too
63                String/G root:Packages:NIST:paramKWStr=""
64                SVAR/Z listStr=root:Packages:NIST:paramKWStr
65        endif   
66       
67        // find everything to rebuild only if the model has been plotted (if so, coefficients will exist)
68        String coef = getFunctionCoef(funcStr)
69        if(strlen(coef)==0)
70                //model not plotted, don't reconstruct, return null string
71                return(paramStr)
72        endif
73       
74        ///// NEED TO BE IN PROPER DATA FOLDER FOR SMEARED FUNCTIONS
75        // FUNCTION POP MENU WILL LOOK IN ROOT OTHERWISE
76        ControlInfo/W=WrapperPanel popup_0
77        String folderStr=S_Value
78        // this if/else/endif should not ever return an error alert     
79        // it should simply set the data folder properly       
80        if(Stringmatch(funcStr,"Smear*"))               //simple test for smeared function
81                if(DataFolderExists("root:"+folderStr))
82                        SetDataFolder $("root:"+folderStr)
83                else
84                        SetDataFolder root:
85                endif
86        else
87                SetDataFolder root:
88        endif
89       
90        // model was plotted, find the suffix to fill in the parameter wave
91        SVAR suffListStr=root:Packages:NIST:suffixKWStr
92        String suffix = StringByKey(coef, suffListStr  ,"=",";",0)
93       
94        String paramWave = WaveList("*par*"+suffix,"","TEXT:1")         //should be one wave name, no trailing semicolon
95        listStr += funcStr+"="+paramWave+";"
96
97        //now look it up again
98        paramStr = StringByKey(funcStr, listStr  ,"=",";",0)
99
100        return(paramStr)
101End
102
103// always pass this the function string
104//
105Function/S getFunctionCoef(funcStr)
106        String funcStr
107
108        SVAR listStr=root:Packages:NIST:coefKWStr
109        String coefStr = StringByKey(funcStr, listStr  ,"=",";",0)
110
111        return(coefStr)
112End
113
114// always pass this the Function string
115//
116// does NOT return the leading "_" as part of the suffix
117// may need to set the string correctly - so lost of messing around for back-compatibility
118Function/S getModelSuffix(funcStr)
119        String funcStr
120
121        SVAR listStr=root:Packages:NIST:suffixKWStr
122        String suffixStr = StringByKey(funcStr, listStr  ,"=",";",0)
123
124        if(strlen(suffixStr) !=0)               //found it, get out
125                return(suffixStr)
126        endif
127       
128        // was the model plotted?
129        String coef = getFunctionCoef(funcStr)
130        if(strlen(coef)==0)             
131                //nothing plotted
132                return("")
133        else
134                //plotted, find the coeff
135                String suffix = StringByKey(coef, ListStr  ,"=",";",0)
136       
137                // add to the suffix list in the new style, if it was found
138                if(strlen(suffix) !=0)
139                        listStr += funcStr+"="+suffix+";"
140                endif
141                return(suffix)
142        endif
143       
144        return("")
145End
146
147
148/////////////////////////////
149
150
151
152
153// loads a 1-d (ascii) datafile and plots the data
154// will overwrite existing data if user is OK with this
155// - multiple datasets can be automatically plotted on the same graph
156//
157//substantially easier to write this as a Proc rather than a function...
158
159//
160Proc A_LoadOneDData()
161        A_LoadOneDDataWithName("",1)            //will prompt for file and plot data
162End
163
164// load the data specified by fileStr (a full path:name)
165// and plots if doPlot==1
166// if fileStr is null, a dialog is presented to select the file
167//
168// 3 cases (if)
169// - 3 columns = QIS, no resolution
170// - 6 columns = QSIG, SANS w/resolution
171// - 5 columns = old-style desmeared USANS data (from VAX)
172//
173// This loader replaces the A_LoadOneDData() which was almost completely duplicated code
174//
175//new version, 19JUN07 that loads each data set into a separate data folder
176// the data folder is given the "base name" of the data file as it's loaded
177//
178
179Proc A_LoadOneDDataWithName(fileStr,doPlot)
180        String fileStr
181        Variable doPlot
182       
183        A_LoadOneDDataToName(fileStr,"",doPlot,0)
184
185End
186
187
188///Function that takes output name as well as input
189Proc A_LoadOneDDataToName(fileStr,outStr,doPlot,forceOverwrite)
190        String fileStr, outstr
191        Variable doPlot,forceOverwrite
192       
193        Variable rr,gg,bb,refnum,dQv
194        String w0,w1,w2,n0,n1,n2
195        String w3,w4,w5,n3,n4,n5                        //3 extra waves to load
196        SetDataFolder root:             //build sub-folders for each data set under root
197
198// I can't see that we need to find dQv here.   
199//      if (exists("root:Packages:NIST:USANS:Globals:MainPanel:gDQv"))
200//              //Running from USANS reduction
201//              Variable dQv = root:Packages:NIST:USANS:Globals:MainPanel:gDQv
202//      endif
203//      if(exists("root:Packages:NIST:USANS_dQv"))
204//              //Running from SANS Analysis
205//              Variable dQv = root:Packages:NIST:USANS_dQv
206//      else
207//              //running from somewhere else, probably SANS Reduction, which uses common loaders
208//              Variable/G root:Packages:NIST:USANS_dQv = 0.117
209//      endif
210        String angst = StrVarOrDefault("root:Packages:NIST:gAngstStr", "A" )
211
212        // if no fileStr passed in, display dialog now
213        if (cmpStr(fileStr,"") == 0)
214                fileStr = DoOpenFileDialog("Select a data file to load")
215                if (cmpstr(fileStr,"") == 0)
216                        String/G root:Packages:NIST:gLastFileName = ""
217                        return          //get out if no file selected
218                endif
219        endif
220
221        if (isXML(fileStr) == 1)
222                LoadNISTXMLData(fileStr,outstr,doPlot,forceOverwrite)
223        else           
224                //Load the waves, using default waveX names
225                //if no path or file is specified for LoadWave, the default Mac open dialog will appear
226                LoadWave/G/D/A/Q fileStr
227                String fileNamePath = S_Path+S_fileName
228//              String basestr = ParseFilePath(3,ParseFilePath(5,fileNamePath,":",0,0),":",0,0)
229
230                String basestr
231                if (!cmpstr(outstr, ""))                //Outstr = "", cmpstr returns 0
232//                      enforce a short enough name here to keep Igor objects < 31 chars
233                        baseStr = ShortFileNameString(CleanupName(S_fileName,0))
234                        baseStr = CleanupName(baseStr,0)                //in case the user added odd characters
235                        //baseStr = CleanupName(S_fileName,0)
236                else
237                        baseStr = outstr                        //for output, hopefully correct length as passed in
238                endif
239       
240//              print "basestr :"+basestr
241                String fileName =  ParseFilePath(0,ParseFilePath(5,filestr,":",0,0),":",1,0)
242//              print "filename :"+filename
243                Variable numCols = V_flag
244               
245                //changes JIL to allow 2-column data to be read in, "faking" a 3rd column of errors
246                if(numCols==2) //no errors
247                        n1 = StringFromList(1, S_waveNames ,";" )
248                        Duplicate/O $("root:"+n1), errorTmp
249                        errorTmp = 0.01*(errorTmp)+ 0.03*sqrt(errorTmp)
250                        S_waveNames+="errorTmp;"
251                        numCols=3
252                endif
253               
254                if(numCols==3)          //simple 3-column data with no resolution information
255                       
256                        // put the names of the three loaded waves into local names
257                        n0 = StringFromList(0, S_waveNames ,";" )
258                        n1 = StringFromList(1, S_waveNames ,";" )
259                        n2 = StringFromList(2, S_waveNames ,";" )
260                       
261                        //remove the semicolon AND period from files from the VAX
262                        w0 = CleanupName((basestr + "_q"),0)
263                        w1 = CleanupName((basestr + "_i"),0)
264                        w2 = CleanupName((basestr + "_s"),0)
265                       
266                        //String baseStr=w1[0,strlen(w1)-3]
267                        if(DataFolderExists("root:"+baseStr))
268                                if (!forceOverwrite)
269                                        DoAlert 1,"The file "+S_filename+" has already been loaded. Do you want to load the new data file, overwriting the data in memory?"
270                                        if(V_flag==2)   //user selected No, don't load the data
271                                                SetDataFolder root:
272                                                KillWaves $n0,$n1,$n2           // kill the default waveX that were loaded
273                                                if(DataFolderExists("root:Packages:NIST"))
274                                                        String/G root:Packages:NIST:gLastFileName = filename
275                                                endif
276                                                return  //quits the macro
277                                        endif
278                                endif
279                                SetDataFolder $("root:"+baseStr)
280                        else
281                                NewDataFolder/S $("root:"+baseStr)
282                        endif
283
284                       
285                        ////overwrite the existing data, if it exists
286                        Duplicate/O $("root:"+n0), $w0
287                        Duplicate/O $("root:"+n1), $w1
288                        Duplicate/O $("root:"+n2), $w2
289       
290                        // no resolution matrix to make
291       
292                        SetScale d,0,0,"1/A",$w0
293                        SetScale d,0,0,"1/cm",$w1
294                       
295                endif           //3-col data
296               
297                if(numCols == 6)                //6-column SANS or USANS data that has resolution information
298                       
299                        // put the names of the (default named) loaded waves into local names
300                        n0 = StringFromList(0, S_waveNames ,";" )
301                        n1 = StringFromList(1, S_waveNames ,";" )
302                        n2 = StringFromList(2, S_waveNames ,";" )
303                        n3 = StringFromList(3, S_waveNames ,";" )
304                        n4 = StringFromList(4, S_waveNames ,";" )
305                        n5 = StringFromList(5, S_waveNames ,";" )
306                       
307                        //remove the semicolon AND period from files from the VAX
308                        w0 = CleanupName((basestr + "_q"),0)
309                        w1 = CleanupName((basestr + "_i"),0)
310                        w2 = CleanupName((basestr + "_s"),0)
311                        w3 = CleanupName((basestr + "sq"),0)
312                        w4 = CleanupName((basestr + "qb"),0)
313                        w5 = CleanupName((basestr + "fs"),0)
314                       
315                        //String baseStr=w1[0,strlen(w1)-3]
316                        if(DataFolderExists("root:"+baseStr))
317                                if(!forceOverwrite)
318                                        DoAlert 1,"The file "+S_filename+" has already been loaded. Do you want to load the new data file, overwriting the data in memory?"
319                                        if(V_flag==2)   //user selected No, don't load the data
320                                                SetDataFolder root:
321                                                KillWaves $n0,$n1,$n2,$n3,$n4,$n5               // kill the default waveX that were loaded
322                                                if(DataFolderExists("root:Packages:NIST"))
323                                                        String/G root:Packages:NIST:gLastFileName = filename
324                                                endif
325                                                return          //quits the macro
326                                        endif
327                                endif
328                                SetDataFolder $("root:"+baseStr)
329                        else
330                                NewDataFolder/S $("root:"+baseStr)
331                        endif
332
333
334
335       
336        ////overwrite the existing data, if it exists
337                        Duplicate/O $("root:"+n0), $w0
338                        Duplicate/O $("root:"+n1), $w1
339                        Duplicate/O $("root:"+n2), $w2
340                        Duplicate/O $("root:"+n3), $w3
341                        Duplicate/O $("root:"+n4), $w4
342                        Duplicate/O $("root:"+n5), $w5
343       
344                        // need to switch based on SANS/USANS
345                        if (isSANSResolution($w3[0]))           //checks to see if the first point of the wave is <0]
346                                // make a resolution matrix for SANS data
347                                Variable np=numpnts($w0)
348                                Make/D/O/N=(np,4) $(baseStr+"_res")
349                               
350                                $(baseStr+"_res")[][0] = $w3[p]         //sigQ
351                                $(baseStr+"_res")[][1] = $w4[p]         //qBar
352                                $(baseStr+"_res")[][2] = $w5[p]         //fShad
353                                $(baseStr+"_res")[][3] = $w0[p]         //Qvalues
354                        else
355                                //the data is USANS data
356                                // marix calculation here, but for now, just copy the waves
357                                //$(baseStr+"_res")[][0] = $w3[p]               //sigQ
358                                //$(baseStr+"_res")[][1] = $w4[p]               //qBar
359                                //$(baseStr+"_res")[][2] = $w5[p]               //fShad
360                                //$(baseStr+"_res")[][3] = $w0[p]               //Qvalues
361                                dQv = -$w3[0]
362
363//TODO: be sure that this works correctly and can be included in either
364// a VSANS reduction experiment, or a standalone analysis package
365// -- since this is a Proc, not a function, #conditional compile does not work,
366// but, since it's a Proc, it is not compiled, so missing functions aren't flagged as a compile error
367                                if (exists("NCNR_VSANS")==6)                    //defined in the main  VSANS #includes file.
368                                                                DoAlert 0,"**Treating data as VSANS data**"
369                                                                Duplicate/O $w3,$(baseStr+"_dQv")                       //save a copy for VSANS
370                                                                $(baseStr+"_dQv") = -$(baseStr+"_dQv")
371                                                                V_USANS_CalcWeights(baseStr,dQv)
372                                else
373                                                                DoAlert 0,"Treating data as USANS (normal slit-smeared data)"
374                                                                USANS_CalcWeights(baseStr,dQv)
375                                endif                           
376
377                               
378                               
379                        endif
380                        Killwaves/Z $w3,$w4,$w5                 //get rid of the resolution waves that are in the matrix
381       
382                        SetScale d,0,0,"1/A",$w0
383                        SetScale d,0,0,"1/cm",$w1
384               
385                endif   //6-col data
386       
387                // Load ORNL data from Heller program
388                if(numCols == 4)                //4-column SANS or USANS data that has resolution information
389                       
390                        // put the names of the (default named) loaded waves into local names
391                        n0 = StringFromList(0, S_waveNames ,";" )
392                        n1 = StringFromList(1, S_waveNames ,";" )
393                        n2 = StringFromList(2, S_waveNames ,";" )
394                        n3 = StringFromList(3, S_waveNames ,";" )
395                       
396                        //remove the semicolon AND period from files from the VAX
397                        w0 = CleanupName((basestr + "_q"),0)
398                        w1 = CleanupName((basestr + "_i"),0)
399                        w2 = CleanupName((basestr + "_s"),0)
400                        w3 = CleanupName((basestr + "sq"),0)
401                        w4 = CleanupName((basestr + "qb"),0)
402                        w5 = CleanupName((basestr + "fs"),0)
403       
404                       
405                        //String baseStr=w1[0,strlen(w1)-3]
406                        if(DataFolderExists("root:"+baseStr))
407                                if(!forceOverwrite)
408                                        DoAlert 1,"The file "+S_filename+" has already been loaded. Do you want to load the new data file, overwriting the data in memory?"
409                                        if(V_flag==2)   //user selected No, don't load the data
410                                                SetDataFolder root:
411                                                KillWaves $n0,$n1,$n2,$n3               // kill the default waveX that were loaded
412                                                if(DataFolderExists("root:Packages:NIST"))
413                                                        String/G root:Packages:NIST:gLastFileName = filename
414                                                endif
415                                                return          //quits the macro
416                                        endif
417                                endif
418                                SetDataFolder $("root:"+baseStr)
419                        else
420                                NewDataFolder/S $("root:"+baseStr)
421                        endif
422       
423
424
425       
426        ////overwrite the existing data, if it exists
427                        Duplicate/O $("root:"+n0), $w0
428                        Duplicate/O $("root:"+n1), $w1
429                        Duplicate/O $("root:"+n2), $w2
430                        Duplicate/O $("root:"+n3), $w3
431                        Duplicate/O $("root:"+n0), $w4 // Set qb wave to nominal measured Q values
432                        Duplicate/O $("root:"+n0), $w5 // Make wave of appropriate length
433                        $w4 = $w0
434                        $w5 = 1                                           //  Set all shadowfactor to 1
435       
436                        // need to switch based on SANS/USANS
437                        if (isSANSResolution($w3[0]))           //checks to see if the first point of the wave is <0]
438                                // make a resolution matrix for SANS data
439                                Variable np=numpnts($w0)
440                                Make/D/O/N=(np,4) $(baseStr+"_res")
441                               
442                                $(baseStr+"_res")[][0] = $w3[p]         //sigQ
443                                $(baseStr+"_res")[][1] = $w4[p]         //qBar
444                                $(baseStr+"_res")[][2] = $w5[p]         //fShad
445                                $(baseStr+"_res")[][3] = $w0[p]         //Qvalues
446                        else
447                                //the data is USANS data
448                                // marix calculation here, but for now, just copy the waves
449                                //$(baseStr+"_res")[][0] = $w3[p]               //sigQ
450                                //$(baseStr+"_res")[][1] = $w4[p]               //qBar
451                                //$(baseStr+"_res")[][2] = $w5[p]               //fShad
452                                //$(baseStr+"_res")[][3] = $w0[p]               //Qvalues
453                                dQv = -$w3[0]
454                               
455                                USANS_CalcWeights(baseStr,dQv)
456                               
457                        endif
458                        Killwaves/Z $w3,$w4,$w5                 //get rid of the resolution waves that are in the matrix
459       
460                        SetScale d,0,0,"1/A",$w0
461                        SetScale d,0,0,"1/cm",$w1
462               
463                endif   //4-col data
464       
465       
466                if(numCols==5)          //this is the "old-style" VAX desmeared data format
467                       
468                        // put the names of the three loaded waves into local names
469                        n0 = StringFromList(0, S_waveNames ,";" )
470                        n1 = StringFromList(1, S_waveNames ,";" )
471                        n2 = StringFromList(2, S_waveNames ,";" )
472                        n3 = StringFromList(3, S_waveNames ,";" )
473                        n4 = StringFromList(4, S_waveNames ,";" )
474                       
475                       
476                        //remove the semicolon AND period from files from the VAX
477                        w0 = CleanupName((basestr+"_q"),0)
478                        w1 = CleanupName((basestr+"_i"),0)
479                        w2 = CleanupName((basestr+"_s"),0)
480                        w3 = CleanupName((basestr+"_ism"),0)
481                        w4 = CleanupName((basestr+"_fit_ism"),0)
482                       
483                        //String baseStr=w1[0,strlen(w1)-3]
484                        if(DataFolderExists("root:"+baseStr))
485                                if(!forceOverwrite)
486                                        DoAlert 1,"The file "+S_filename+" has already been loaded. Do you want to load the new data file, overwriting the data in memory?"
487                                        if(V_flag==2)   //user selected No, don't load the data
488                                                KillWaves $n0,$n1,$n2,$n3,$n4,$n5               // kill the default waveX that were loaded
489                                                if(DataFolderExists("root:Packages:NIST"))
490                                                        String/G root:Packages:NIST:gLastFileName = filename
491                                                endif           //set the last file loaded to the one NOT loaded
492                                                return          //quits the macro
493                                        endif
494                                endif
495                                SetDataFolder $("root:"+baseStr)
496                        else
497                                NewDataFolder/S $("root:"+baseStr)
498                        endif
499                       
500                        ////overwrite the existing data, if it exists   
501                        Duplicate/O $("root:"+n0), $w0
502                        Duplicate/O $("root:"+n1), $w1
503                        Duplicate/O $("root:"+n2), $w2
504                        Duplicate/O $("root:"+n3), $w3
505                        Duplicate/O $("root:"+n4), $w4
506                       
507                        // no resolution matrix
508                endif           //5-col data
509
510                //////
511                if(DataFolderExists("root:Packages:NIST"))
512                        String/G root:Packages:NIST:gLastFileName = filename
513                endif
514       
515               
516                //plot if desired
517                if(doPlot)
518                        Print GetDataFolder(1)
519                       
520                        // assign colors randomly
521                        rr = abs(trunc(enoise(65535)))
522                        gg = abs(trunc(enoise(65535)))
523                        bb = abs(trunc(enoise(65535)))
524                       
525                        // if target window is a graph, and user wants to append, do so
526                   DoWindow/B Plot_Manager
527                        if(WinType("") == 1)
528                                DoAlert 1,"Do you want to append this data to the current graph?"
529                               
530                               
531                                if(V_Flag == 1)
532                                        AppendToGraph $w1 vs $w0
533                                        ModifyGraph mode($w1)=3,marker($w1)=19,msize($w1)=2,rgb($w1) =(rr,gg,bb),tickUnit=1
534                                        ErrorBars/T=0 $w1 Y,wave=($w2,$w2)
535                                        ModifyGraph tickUnit(left)=1
536                                else
537                                //new graph
538                                        SetDataFolder $("root:"+baseStr)                //sometimes I end up back in root: here, and I can't figure out why!
539                                        Display $w1 vs $w0
540                                        ModifyGraph log=1,mode($w1)=3,marker($w1)=19,msize($w1)=2,rgb($w1)=(rr,gg,bb),tickUnit=1
541                                        ModifyGraph grid=1,mirror=2,standoff=0
542                                        ErrorBars/T=0 $w1 Y,wave=($w2,$w2)
543                                        ModifyGraph tickUnit(left)=1
544                                        Label left "I(q)"
545                                        Label bottom "q ("+angst+"\\S-1\\M)"
546                                        Legend
547                                endif
548                        else
549                        // graph window was not target, make new one
550                                Display $w1 vs $w0
551                                ModifyGraph log=1,mode($w1)=3,marker($w1)=19,msize($w1)=2,rgb($w1)=(rr,gg,bb),tickUnit=1
552                                ModifyGraph grid=1,mirror=2,standoff=0
553                                ErrorBars/T=0 $w1 Y,wave=($w2,$w2)
554                                ModifyGraph tickUnit(left)=1
555                                Label left "I(q)"
556                                Label bottom "q ("+angst+"\\S-1\\M)"
557                                Legend
558                        endif
559                endif
560                       
561                //go back to the root folder and clean up before leaving
562                SetDataFolder root:
563                KillWaves/Z $n0,$n1,$n2,$n3,$n4,$n5
564               
565        endif
566End
567
568
569//procedure for loading NSE data in the format (4-columns)
570// qvals - time - I(q,t) - dI(q,t)
571//
572//
573// this does NOT load the data into separate folders...
574//
575Proc A_LoadNSEData()
576        A_LoadNSEDataWithName("",1)
577End
578
579Proc A_LoadNSEDataWithName(fileStr,doPlot)
580
581        //Load the waves, using default waveX names
582        //if no path or file is specified for LoadWave, the default Mac open dialog will appear
583        LoadWave/G/D/A  fileStr
584        String filename = S_fileName
585       
586        String w0,w1,w2,n0,n1,n2,wt,w3,n3
587        Variable rr,gg,bb
588       
589        // put the names of the three loaded waves into local names
590        n0 = StringFromList(0, S_waveNames ,";" )
591        n1 = StringFromList(1, S_waveNames ,";" )
592        n2 = StringFromList(2, S_waveNames ,";" )
593        n3 = StringFromList(3, S_waveNames ,";" )
594       
595       
596        //remove the semicolon AND period from files from the VAX
597        w0 = CleanupName(("qvals_"+S_fileName),0)
598        w1 = CleanupName(("time_"+S_fileName),0)
599        w2 = CleanupName(("iqt_"+S_fileName),0)
600        w3 = CleanupName(("iqterr_"+S_fileName),0)
601       
602        if(exists(w0) !=0)
603                DoAlert 0,"This file has already been loaded. Use Append to Graph..."
604                KillWaves $n0,$n1,$n2           // kill the default waveX that were loaded
605                return
606        endif
607       
608        // Rename to give nice names
609        Rename $n0, $w0
610        Rename $n1, $w1
611        Rename $n2, $w2
612        Rename $n3, $w3
613               
614        if(doPlot)
615                // assign colors randomly
616                rr = abs(trunc(enoise(65535)))
617                gg = abs(trunc(enoise(65535)))
618                bb = abs(trunc(enoise(65535)))
619               
620                // if target window is a graph, and user wants to append, do so
621                if(WinType("") == 1)
622                        DoAlert 1,"Do you want to append this data to the current graph?"
623                        if(V_Flag == 1)
624                                AppendToGraph $w2 vs $w1
625                                ModifyGraph mode($w2)=3,marker($w2)=29,msize($w2)=2,rgb($w2) =(rr,gg,bb),grid=1,mirror=2,tickUnit=1
626                                ErrorBars/T=0 $w2 Y,wave=($w3,$w3)
627                        else
628                        //new graph
629                                Display $w2 vs $w1
630                                ModifyGraph standoff=0,mode($w2)=3,marker($w2)=29,msize($w2)=2,rgb($w2)=(rr,gg,bb),grid=1,mirror=2,tickUnit=1
631                                ErrorBars/T=0 $w2 Y,wave=($w3,$w3)
632                                Legend
633                        endif
634                else
635                // graph window was not target, make new one
636                        Display $w2 vs $w1
637                        ModifyGraph standoff=0,mode($w2)=3,marker($w2)=29,msize($w2)=2,rgb($w2)=(rr,gg,bb),grid=1,mirror=2,tickUnit=1
638                        ErrorBars/T=0 $w2 Y,wave=($w3,$w3)
639                        Legend
640                endif
641        endif //doPlot         
642
643End
644
645//procedure for loading desmeared USANS data in the format (5-columns)
646// qvals - I(q) - sig I - Ism(q) - fitted Ism(q)
647//no weighting wave is created (not needed in IGOR 4)
648//
649// not really ever used...
650//
651Proc A_LoadUSANSData()
652
653        //Load the waves, using default waveX names
654        //if no path or file is specified for LoadWave, the default Mac open dialog will appear
655        LoadWave/G/D/A
656   String filename = S_fileName
657       
658        String w0,w1,w2,n0,n1,n2,w3,n3,w4,n4
659        Variable rr,gg,bb
660       
661        // put the names of the three loaded waves into local names
662        n0 = StringFromList(0, S_waveNames ,";" )
663        n1 = StringFromList(1, S_waveNames ,";" )
664        n2 = StringFromList(2, S_waveNames ,";" )
665        n3 = StringFromList(3, S_waveNames ,";" )
666        n4 = StringFromList(4, S_waveNames ,";" )
667       
668       
669        //remove the semicolon AND period from files from the VAX
670        w0 = CleanupName((S_fileName+"_q"),0)
671        w1 = CleanupName((S_fileName+"_i"),0)
672        w2 = CleanupName((S_fileName+"_s"),0)
673        w3 = CleanupName((S_fileName+"_ism"),0)
674        w4 = CleanupName((S_fileName+"_fit_ism"),0)
675       
676        if(exists(w0) !=0)              //the wave already exists
677                DoAlert 1,"This file "+S_filename+" has already been loaded. Do you want to load the new data file, overwriting the data in memory?"
678                if(V_flag==2)   //user selected No
679                        KillWaves $n0,$n1,$n2,$n3,$n4           // kill the default waveX that were loaded
680                        if(DataFolderExists("root:Packages:NIST"))
681                                String/G root:Packages:NIST:gLastFileName = filename
682                        endif           //set the last file loaded to the one NOT loaded
683                        return          //quits the macro
684                endif
685        endif
686       
687        ////overwrite the existing data, if it exists
688        Duplicate/O $n0, $w0
689        Duplicate/O $n1, $w1
690        Duplicate/O $n2, $w2
691        Duplicate/O $n3, $w3
692        Duplicate/O $n4, $w4
693        KillWaves $n0,$n1,$n2,$n3,$n4
694       
695        if(DataFolderExists("root:Packages:NIST"))
696                String/G root:Packages:NIST:gLastFileName = filename
697        endif
698               
699        // assign colors randomly
700        rr = abs(trunc(enoise(65535)))
701        gg = abs(trunc(enoise(65535)))
702        bb = abs(trunc(enoise(65535)))
703       
704                // if target window is a graph, and user wants to append, do so
705        if(WinType("") == 1)
706                DoAlert 1,"Do you want to append this data to the current graph?"
707                if(V_Flag == 1)
708                        AppendToGraph $w1 vs $w0
709                        ModifyGraph mode=3,marker=29,msize=2,rgb ($w1) =(rr,gg,bb),tickUnit=1,grid=1,mirror=2
710                        ErrorBars/T=0 $w1 Y,wave=($w2,$w2)
711                else
712                //new graph
713                        Display $w1 vs $w0
714                        ModifyGraph log=1,mode=3,marker=29,msize=2,rgb=(rr,gg,bb),tickUnit=1,grid=1,mirror=2
715                        ErrorBars/T=0 $w1 Y,wave=($w2,$w2)
716                        Legend
717                endif
718        else
719        // graph window was not target, make new one
720                Display $w1 vs $w0
721                ModifyGraph log=1,mode=3,marker=29,msize=2,rgb=(rr,gg,bb),tickUnit=1,grid=1,mirror=2
722                ErrorBars/T=0 $w1 Y,wave=($w2,$w2)
723                Legend
724        endif
725               
726End
727
728
729//// Extra "Utility Procedures"
730// to pick path, get a list of data files, and make sure that a valid filename
731// is passed to LoadOneDDataWithName()
732//
733
734//prompts user to choose the local folder that contains the SANS Data
735//only one folder can be used, and its path is catPathName (and is a NAME, not a string)
736//this will overwrite the path selection
737//returns 1 if no path selected as error condition
738Function A_PickPath()
739       
740        //set the global string to the selected pathname
741        NewPath/O/M="pick the SANS data folder" catPathName
742        PathInfo/S catPathName
743        String dum = S_path
744        String alertStr = ""
745        alertStr = "You must set the path to Charlotte through a Mapped Network Drive, not through the Network Neighborhood"
746        //alertStr += "  Please see the manual for details."
747        if (V_flag == 0)
748                //path does not exist - no folder selected
749                String/G root:Packages:NIST:gCatPathStr = "no folder selected"
750                return(1)
751        else
752                //set the global to the path (as a string)
753                // need 4 \ since it is the escape character
754
755// SRK 2016, for windows 10, try to eliminate this restriction         
756//              print igorinfo(3)
757//              if(cmpstr("\\\\",dum[0,1])==0)  //Windoze user going through network neighborhood
758//                      DoAlert 0,alertStr
759//                      KillPath catPathName
760//                      return(1)
761//              endif
762               
763                String/G root:Packages:NIST:gCatPathStr = dum
764                return(0)               //no error
765        endif
766End
767
768//Function attempts to find valid filename from partial name that has been stripped of
769//the VAX version number. The partial name is tried first
770//*** the PATH is hard-wired to catPathName (which is assumed to exist)
771//version numers up to ;10 are tried
772//only the "name;vers" is returned. the path is not prepended, hence the return string
773//is not a complete specification of the file
774//
775// added 11/99 - uppercase and lowercase versions of the file are tried, if necessary
776// since from marquee, the filename field (textread[0]) must be used, and can be a mix of               // 02JUL13
777// upper/lowercase letters, while the filename on the server (should) be all caps
778// now makes repeated calls to ValidFileString()
779//
780Function/S A_FindValidFilename(partialName)
781        String PartialName
782       
783        String retStr=""
784       
785        //try name with no changes - to allow for ABS files that have spaces in the names 12APR04
786        retStr = A_ValidFileString(partialName)
787        if(cmpstr(retStr,"") !=0)
788                //non-null return
789                return(retStr)
790        Endif
791       
792        //if the partial name is derived from the file header, there can be spaces at the beginning
793        //or in the middle of the filename - depending on the prefix and initials used
794        //
795        //remove any leading spaces from the name before starting
796        partialName = A_RemoveAllSpaces(partialName)
797       
798        //try name with no spaces
799        retStr = A_ValidFileString(partialName)
800        if(cmpstr(retStr,"") !=0)
801                //non-null return
802                return(retStr)
803        Endif
804       
805        //try all UPPERCASE
806        partialName = UpperStr(partialName)
807        retStr = A_ValidFileString(partialName)
808        if(cmpstr(retStr,"") !=0)
809                //non-null return
810                return(retStr)
811        Endif
812       
813        //try all lowercase (ret null if failure)
814        partialName = LowerStr(partialName)
815        retStr = A_ValidFileString(partialName)
816        if(cmpstr(retStr,"") !=0)
817                //non-null return
818                return(retStr)
819        else
820                return(retStr)
821        Endif
822End
823
824//function to test a binary file to see if it is a RAW binary SANS file
825//first checks the total bytes in the file (which for raw data is 33316 bytes)
826//**note that the "DIV" file will also show up as a raw file by the run field
827//should be listed in CAT/SHORT and in patch windows
828//
829//Function then checks the file fname (full path:file) for "RAW" run.type field
830//if not found, the data is not raw data and zero is returned
831Function A_CheckIfRawData(fname)
832        String fname
833       
834        Variable refnum,totalBytes
835        String testStr=""
836       
837        Open/R/T="????TEXT" refNum as fname
838        //get the total number of bytes in the file, to avoid moving past EOF
839        FStatus refNum
840        totalBytes = V_logEOF
841        //Print totalBytes
842        if(totalBytes!=33316)
843                //can't possibly be a raw data file
844                Close refnum
845                return(0)               //not a raw SANS file
846        Endif
847        FSetPos refNum,75
848        FReadLine/N=3 refNum,testStr
849        Close refNum
850       
851        if(cmpstr(testStr,"RAW")==0)
852                //true, is raw data file
853                Return(1)
854        else
855                //some other file
856                Return(0)
857        Endif
858End
859
860//list (input) is a list, typically returned from IndexedFile()
861//which is semicolon-delimited, and may contain filesnames from the VAX
862//that contain version numbers, where the version number appears as a separate list item
863//(and also as a non-existent file)
864//these numbers must be purged from the list, especially for display in a popup
865//or list processing of filenames
866//the function returns the list, cleaned of version numbers (up to 11)
867//raw data files will typically never have a version number other than 1.
868Function/S A_RemoveVersNumsFromList(list)
869        String list
870       
871        //get rid of version numbers first (up to 11)
872        Variable ii,num
873        String item
874        num = ItemsInList(list,";")
875        ii=1
876        do
877                item = num2str(ii)
878                list = RemoveFromList(item, list ,";" )
879                ii+=1
880        while(ii<12)
881       
882        return (list)
883End
884
885//Function attempts to find valid filename from partial name that has been stripped of
886//the VAX version number. The partial name is tried first
887//*** the PATH is hard-wired to catPathName (which is assumed to exist)
888//version numers up to ;10 are tried
889//only the "name;vers" is returned. the path is not prepended, hence the return string
890//is not a complete specification of the file
891//
892Function/S A_ValidFileString(partialName)
893        String partialName
894       
895        String tempName = "",msg=""
896        Variable ii,refnum
897       
898        ii=0
899        do
900                if(ii==0)
901                        //first pass, try the partialName
902                        tempName = partialName
903                        Open/Z/R/T="????TEXT"/P=catPathName refnum tempName     //Does open file (/Z flag)
904                        if(V_flag == 0)
905                                //file exists
906                                Close refnum            //YES needed,
907                                break
908                        endif
909                else
910                        tempName = partialName + ";" + num2str(ii)
911                        Open/Z/R/T="????TEXT"/P=catPathName refnum tempName
912                        if(V_flag == 0)
913                                //file exists
914                                Close refnum
915                                break
916                        endif
917                Endif
918                ii+=1
919                //print "ii=",ii
920        while(ii<11)
921        //go get the selected bits of information, using tempName, which exists
922        if(ii>=11)
923                //msg = partialName + " not found. is version number > 11?"
924                //DoAlert 0, msg
925                //PathInfo catPathName
926                //Print S_Path
927                Return ("")             //use null string as error condition
928        Endif
929       
930        Return (tempName)
931End
932
933//function to remove all spaces from names when searching for filenames
934//the filename (as saved) will never have interior spaces (TTTTTnnn_AB _Bnnn)
935//but the text field in the header WILL, if less than 3 characters were used for the
936//user's initials, and can have leading spaces if prefix was less than 5 characters
937//
938//returns a string identical to the original string, except with the interior spaces removed
939//
940Function/S A_RemoveAllSpaces(str)
941        String str
942       
943        String tempstr = str
944        Variable ii,spc,len             //should never be more than 2 or 3 trailing spaces in a filename
945        ii=0
946        do
947                len = strlen(tempStr)
948                spc = strsearch(tempStr," ",0)          //is the last character a space?
949                if (spc == -1)
950                        break           //no more spaces found, get out
951                endif
952                str = tempstr
953                tempStr = str[0,(spc-1)] + str[(spc+1),(len-1)] //remove the space from the string
954        While(1)        //should never be more than 2 or 3
955       
956        If(strlen(tempStr) < 1)
957                tempStr = ""            //be sure to return a null string if problem found
958        Endif
959       
960        //Print strlen(tempstr)
961       
962        Return(tempStr)
963               
964End
965
966//AJJ Oct 2008
967//Moved from GaussUtils - makes more sense to have it here
968
969// utility used in the "PlotSmeared...() macros to get a list of data folders
970//
971//1:    Waves.
972//2:    Numeric variables.
973//3:    String variables.
974//4:    Data folders.
975Function/S GetAList(type)
976        Variable type
977       
978        SetDataFolder root:
979       
980        String objName,str=""
981        Variable index = 0
982        do
983                objName = GetIndexedObjName(":", type, index)
984                if (strlen(objName) == 0)
985                        break
986                endif
987                //Print objName
988                str += objName + ";"
989                index += 1
990        while(1)
991       
992        // remove myGlobals, Packages, etc. from the folder list
993        if(type==4)
994                str = RemoveFromList("myGlobals", str , ";" )
995                str = RemoveFromList("Packages", str, ";")
996                str = RemoveFromList("AutoFit", str, ";")
997                str = RemoveFromList("TISANE", str, ";")
998                str = RemoveFromList("HayPenMSA", str, ";")
999                str = RemoveFromList("SAS", str, ";")                   //from Irena
1000                str = RemoveFromList("USAXS", str, ";")
1001                str = RemoveFromList("RAW;SAM;EMP;BGD;DIV;MSK;ABS;CAL;COR;STO;SUB;DRK;SAS;", str  ,";")                 //root level folders present in old reduction experiments
1002                str = RemoveFromList("ToTrim", str , ";" )              //from VSANS
1003        endif
1004       
1005        return(str)
1006End
1007
1008
1009//returns the path to the file, or null if cancel
1010//
1011// either the T="????" or the /F flags work to set the filter to "all files"
1012// but the T is essentially obsolete, /F is new for Igor 6.1 and recommended
1013Function/S DoOpenFileDialog(msg)
1014        String msg
1015       
1016        Variable refNum
1017//      String message = "Select a file"
1018        String outputPath
1019       
1020        String fileFilters = "All Files:.*;"
1021               
1022//      Open/D/R/T="????"/M=msg refNum
1023        Open/D/R/F=fileFilters/M=msg refNum
1024        outputPath = S_fileName
1025       
1026        return outputPath
1027End
1028
1029// returns the path to the file, or null if the user cancelled
1030// fancy use of optional parameters
1031//
1032// enforce short file names (25 characters)
1033Function/S DoSaveFileDialog(msg,[fname,suffix])
1034        String msg,fname,suffix
1035        Variable refNum
1036//      String message = "Save the file as"
1037
1038        if(ParamIsDefault(fname))
1039//              Print "fname not supplied"
1040                fname = ""
1041        endif
1042        if(ParamIsDefault(suffix))
1043//              Print "suffix not supplied"
1044                suffix = ""
1045        endif
1046       
1047        String outputPath,tmpName,testStr
1048        Variable badLength=0,maxLength=25,l1,l2
1049       
1050       
1051        tmpName = fname + suffix
1052       
1053        do
1054                badLength=0
1055                Open/D/M=msg/T="????" refNum as tmpName         //OS will allow 255 characters, but then I can't read it back in!
1056                outputPath = S_fileName
1057               
1058                testStr = ParseFilePath(0, outputPath, ":", 1, 0)               //just the filename
1059                if(strlen(testStr)==0)
1060                        break           //cancel, allow exit
1061                endif
1062                if(strlen(testStr) > maxLength)
1063                        badlength = 1
1064                        DoAlert 2,"File name is too long. Is\r"+testStr[0,maxLength-1]+"\rOK?"
1065                        if(V_flag==3)
1066                                outputPath = ""
1067                                break
1068                        endif
1069                        if(V_flag==1)                   //my suggested name is OK, so trim the output
1070                                badlength=0
1071                                l1 = strlen(testStr)            //too long length
1072                                l1 = l1-maxLength               //number to trim
1073                                //Print outputPath
1074                                l2=strlen(outputPath)
1075                                outputPath = outputPath[0,l2-1-l1]
1076                                //Print "modified  ",outputPath
1077                        endif
1078                        //if(V_flag==2)  do nothing, let it go around again
1079                endif
1080               
1081        while(badLength)
1082       
1083        return outputPath
1084End
1085
1086// returns a shortened file name (26 characters max) so that the loader
1087// won't try to create Igor objects that have names that are longer than 31
1088//
1089Function/S ShortFileNameString(inStr)
1090        String inStr
1091
1092        String outStr=""
1093        Variable maxLength=25
1094        Variable nameTooLong=0
1095        String/G root:Packages:NIST:gShortNameStr = inStr[0,maxLength-1]
1096        SVAR newStr = root:Packages:NIST:gShortNameStr
1097
1098        if(strlen(inStr) <= maxLength)
1099                return (inStr)          //length OK
1100        else
1101                do
1102                        nameTooLong = 0
1103                       
1104                        DoAlert 1,"File name is too long. Is\r"+inStr[0,maxLength-1]+"\rOK?"
1105                        if(V_flag==1)                   //my suggested name is OK, so trim the output
1106                                outStr = inStr[0,maxLength-1]
1107                                //Print "modified  ",outStr
1108                                newStr=outStr
1109                                return(outStr)
1110                        endif
1111       
1112       
1113                        if(V_flag == 2)         //not OK, do something about it
1114                               
1115                                DoWindow/F ShorterNameInput             //it really shouldn't exist...
1116                                if(V_flag==0)
1117                               
1118                                        NewPanel /W=(166,90,666,230) as "Enter a Shorter Name"
1119                                        DoWindow/C ShorterNameInput
1120                                        SetDrawLayer UserBack
1121                                        TitleBox title0,pos={35,8},size={261,20},title=" Enter a shorter file name. It must be 25 characters or less "
1122                                        TitleBox title0,fSize=12,fStyle=1
1123                                        SetVariable setvar0,pos={21,52},size={300,15},title="New name",value= _STR:newStr
1124                                        SetVariable setvar0,proc=ShorterNameSetVarProc,fsize=12
1125                                        SetVariable setvar0 valueBackColor=(65535,49151,49151)
1126                                        Button button0,pos={259,87},size={60,20},title="Done"
1127                                        Button button0,proc=ShorterNameDoneButtonProc
1128                               
1129                                endif
1130                               
1131                                PauseForUser ShorterNameInput
1132                               
1133                                // this really should force a good name, but there could be errors that I'm not catching
1134//                              Print newStr, strlen(newStr)
1135                                nameTooLong = 0
1136                        endif
1137               
1138                while (nameTooLong)
1139               
1140                return(newStr)
1141               
1142        endif
1143               
1144End
1145
1146
1147// for the ShortFileNameString() - PauseForUser to get a shorter file name
1148Function ShorterNameSetVarProc(sva) : SetVariableControl
1149        STRUCT WMSetVariableAction &sva
1150               
1151        switch( sva.eventCode )
1152                case 1: // mouse up
1153                case 2: // Enter key
1154                case 3: // Live update
1155                                String sv = sva.sval
1156                                if( strlen(sv) > 25 )
1157                                        sv= sv[0,24]
1158                                        SetVariable  $(sva.ctrlName),win=$(sva.win),value=_STR:sv
1159                                        SetVariable setvar0 valueBackColor=(65535,49151,49151)
1160                                        Beep
1161                                else
1162                                        SetVariable setvar0 valueBackColor=(65535,65535,65535)
1163                                endif
1164                                break
1165                endswitch
1166        return 0
1167End
1168
1169// for the ShortFileNameString() - PauseForUser to get a shorter file name
1170Function ShorterNameDoneButtonProc(ba) : ButtonControl
1171        STRUCT WMButtonAction &ba
1172       
1173        String win = ba.win
1174
1175        switch (ba.eventCode)
1176                case 2:
1177                        SVAR newStr = root:Packages:NIST:gShortNameStr
1178                        ControlInfo setvar0
1179                        newStr = S_value
1180                        DoWindow/K ShorterNameInput
1181                       
1182                        break
1183        endswitch
1184
1185        return 0
1186End
1187
1188
1189// a function common to many panels, so put the basic version here that simply
1190// returns null string if no functions are present. Calling procedures can
1191// add to the list to customize as needed.
1192// show the available models
1193// not the f*(cw,xw) point calculations
1194// not the *X(cw,xw) XOPS
1195//
1196// KIND:10 should show only user-defined curve fitting functions
1197// - not XOPs
1198// - not other user-defined functions
1199Function/S User_FunctionPopupList()
1200        String list,tmp
1201        list = FunctionList("*",";","KIND:10")          //get every user defined curve fit function
1202
1203        //now start to remove everything the user doesn't need to see...
1204
1205        tmp = FunctionList("*_proto",";","KIND:10")             //prototypes
1206        list = RemoveFromList(tmp, list  ,";")
1207
1208
1209        //prototypes that show up if GF is loaded
1210        list = RemoveFromList("GFFitFuncTemplate", list)
1211        list = RemoveFromList("GFFitAllAtOnceTemplate", list)
1212        list = RemoveFromList("NewGlblFitFunc", list)
1213        list = RemoveFromList("NewGlblFitFuncAllAtOnce", list)
1214        list = RemoveFromList("GlobalFitFunc", list)
1215        list = RemoveFromList("GlobalFitAllAtOnce", list)
1216        list = RemoveFromList("GFFitAAOStructTemplate", list)
1217        list = RemoveFromList("NewGF_SetXWaveInList", list)
1218        list = RemoveFromList("NewGlblFitFuncAAOStruct", list)
1219       
1220        // more to remove as a result of 2D/Gizmo
1221        list = RemoveFromList("A_WMRunLessThanDelta", list)
1222        list = RemoveFromList("WMFindNaNValue", list)
1223        list = RemoveFromList("WM_Make3DBarChartParametricWave", list)
1224        list = RemoveFromList("UpdateQxQy2Mat", list)
1225        list = RemoveFromList("MakeBSMask", list)
1226       
1227        // MOTOFIT/GenFit bits
1228        tmp = "GEN_allatoncefitfunc;GEN_fitfunc;GetCheckBoxesState;MOTO_GFFitAllAtOnceTemplate;MOTO_GFFitFuncTemplate;MOTO_NewGF_SetXWaveInList;MOTO_NewGlblFitFunc;MOTO_NewGlblFitFuncAllAtOnce;GeneticFit_UnSmearedModel;GeneticFit_SmearedModel;"
1229        list = RemoveFromList(tmp, list  ,";")
1230
1231        // SANS Reduction bits
1232        tmp = "ASStandardFunction;Ann_1D_Graph;Avg_1D_Graph;BStandardFunction;CStandardFunction;Draw_Plot1D;MyMat2XYZ;"
1233        list = RemoveFromList(tmp, list  ,";")
1234        tmp = "NewDirection;SANSModelAAO_MCproto;Monte_SANS_Threaded;Monte_SANS_NotThreaded;Monte_SANS_W1;Monte_SANS_W2;Monte_SANS_W3;Monte_SANS_W4;Monte_SANS;FractionReachingDetector;TwoLevel_EC;SmearedTwoLevel_EC;"
1235        list = RemoveFromList(tmp, list  ,";")
1236
1237
1238        // USANS Reduction bits
1239        tmp = "DSM_Guinier_Fit;RemoveMaskedPoints;"
1240        list = RemoveFromList(tmp, list  ,";")
1241
1242        //more functions from analysis models (2008)
1243        tmp = "Barbell_Inner;Barbell_Outer;Barbell_integrand;BCC_Integrand;Integrand_BCC_Inner;Integrand_BCC_Outer;"
1244        list = RemoveFromList(tmp, list  ,";")
1245        tmp = "CapCyl;CapCyl_Inner;CapCyl_Outer;ConvLens;ConvLens_Inner;ConvLens_Outer;"
1246        list = RemoveFromList(tmp, list  ,";")
1247        tmp = "Dumb;Dumb_Inner;Dumb_Outer;FCC_Integrand;Integrand_FCC_Inner;Integrand_FCC_Outer;"
1248        list = RemoveFromList(tmp, list  ,";")
1249        tmp = "Integrand_SC_Inner;Integrand_SC_Outer;SC_Integrand;SphCyl;SphCyl_Inner;SphCyl_Outer;"
1250        list = RemoveFromList(tmp, list  ,";")
1251        tmp = "CSPP_Outer;CSPP_Inner;PP_Outer;PP_Inner;"
1252        list = RemoveFromList(tmp, list  ,";")
1253        tmp = "Guinier_Fit;"
1254        list = RemoveFromList(tmp, list  ,";")
1255
1256        tmp = FunctionList("f*",";","NPARAMS:2")                //point calculations
1257        list = RemoveFromList(tmp, list  ,";")
1258       
1259        tmp = FunctionList("fSmear*",";","NPARAMS:3")           //smeared dependency calculations
1260        list = RemoveFromList(tmp, list  ,";")
1261       
1262        // anything that might be included in Irena
1263        tmp = FunctionList("GEN_*",";","KIND:10")
1264        list = RemoveFromList(tmp, list  ,";")
1265        tmp = FunctionList("IN2G_*",";","KIND:10")
1266        list = RemoveFromList(tmp, list  ,";")
1267        tmp = FunctionList("IR1A_*",";","KIND:10")
1268        list = RemoveFromList(tmp, list  ,";")
1269        tmp = FunctionList("IR1B_*",";","KIND:10")
1270        list = RemoveFromList(tmp, list  ,";")
1271        tmp = FunctionList("IR1U_*",";","KIND:10")
1272        list = RemoveFromList(tmp, list  ,";")
1273        tmp = FunctionList("IR1V_*",";","KIND:10")
1274        list = RemoveFromList(tmp, list  ,";")
1275        tmp = FunctionList("IR1_*",";","KIND:10")
1276        list = RemoveFromList(tmp, list  ,";")
1277        tmp = FunctionList("IR2D_*",";","KIND:10")
1278        list = RemoveFromList(tmp, list  ,";")
1279
1280        tmp = FunctionList("IR2D_*",";","KIND:10")
1281        list = RemoveFromList(tmp, list  ,";")
1282        tmp = FunctionList("IR2H_*",";","KIND:10")
1283        list = RemoveFromList(tmp, list  ,";") 
1284        tmp = FunctionList("IR2L_*",";","KIND:10")
1285        list = RemoveFromList(tmp, list  ,";")
1286        tmp = FunctionList("IR2Pr_*",";","KIND:10")
1287        list = RemoveFromList(tmp, list  ,";")
1288        tmp = FunctionList("IR2R_*",";","KIND:10")
1289        list = RemoveFromList(tmp, list  ,";")
1290        tmp = FunctionList("IR2S_*",";","KIND:10")
1291        list = RemoveFromList(tmp, list  ,";")
1292        tmp = FunctionList("IR2_*",";","KIND:10")
1293        list = RemoveFromList(tmp, list  ,";")
1294        tmp = FunctionList("*LogLog",";","KIND:10")
1295        list = RemoveFromList(tmp, list  ,";")
1296       
1297        //functions included in Nika
1298        tmp = FunctionList("NI1*",";","KIND:10")
1299        list = RemoveFromList(tmp, list  ,";")
1300        tmp = FunctionList("TransAx_*",";","KIND:10")
1301        list = RemoveFromList(tmp, list  ,";")
1302        tmp = FunctionList("TransformAxis*",";","KIND:10")
1303        list = RemoveFromList(tmp, list  ,";")
1304        tmp = FunctionList("erfForNormal*",";","KIND:10")
1305        list = RemoveFromList(tmp, list  ,";")
1306
1307        // functions in Indra (USAXS)
1308        tmp = FunctionList("IN2Q_*",";","KIND:10")
1309        list = RemoveFromList(tmp, list  ,";")
1310        tmp = FunctionList("IN3_*",";","KIND:10")
1311        list = RemoveFromList(tmp, list  ,";")
1312       
1313//      tmp = FunctionList("*X",";","KIND:4")           //XOPs, but these shouldn't show up if KIND:10 is used initially
1314//      Print "X* = ",tmp
1315//      print " "
1316//      list = RemoveFromList(tmp, list  ,";")
1317       
1318        //non-fit functions that I can't seem to filter out
1319        list = RemoveFromList("BinaryHS_PSF11;BinaryHS_PSF12;BinaryHS_PSF22;EllipCyl_Integrand;PP_Inner;PP_Outer;Phi_EC;TaE_Inner;TaE_Outer;",list,";")
1320
1321        // from 2010 model functions
1322        list = RemoveFromList("fTwoYukawa;DoBoxGraph;Gauss2D_theta;",list,";")
1323       
1324        // from Debye Sphere method
1325        list = RemoveFromList("CalcIQRfromMat;ConnectPoints2D;ConnectPoints3D;ConnectPoints3D_old;ConnectedRodFill;ConvertXYZto3N;CylindersAtPoints;",list,";")
1326        list = RemoveFromList("FillSphere;FillSphere3;FillSphereRadius;FillSphereRadiusNoOverlap;FillXCylinder;FillXYCircle;FillXZCircle;FillYCylinder;",list,";")
1327        list = RemoveFromList("FillYZCircle;FillZCylinder;PadMatrix;RandomFill3DMat;RandomPoints2D;SobolFill3DMat;SphereAtEachPoint;UnConnectedRodFill;XYZV_toByteVoxels;",list,";")
1328        list = RemoveFromList("MakeTriplet;SobolPoints2D;X_CylindersAtPoints;X_CylindersHexagonalGrid;X_CylindersSquareGrid;maxDistance_Threaded;KR_MultiCylinder;KR_MultiCylinder_Units;",list,";")
1329        list = RemoveFromList("X_CoreShellCylinderHexGrid;FillPlaneHexagonal;FillPlaneSquareGrid;FillSphereRadiusPeriodic;",list,";")
1330        list = RemoveFromList("Setup_Ur;M_energy;DoRotation;Copy_xyz_to_xyz3d;MultiCyl_Loop;",list,";")
1331
1332// from Polarization
1333        list = RemoveFromList("ParseDecayRow;ParseFlipperRow;",list,";")
1334
1335// from 2012 models
1336        list = RemoveFromList("cng_integ;",list,";")
1337
1338// from 2012 Event Mode Processing
1339        list = RemoveFromList("CleanupTimes;IndexForHistogram;JointHistogram;MakeFibonacciWave;Osc_ProcessEvents;SetFibonacciBins;SetLinearBins;SetLogBins;Stream_ProcessEvents;",list,";")
1340
1341// from 2013 Simulation
1342//      list = RemoveFromList("EC_Empirical;SmearedEC_Empirical;",list,";")
1343        list = RemoveFromList("SAS_XS_Sphere;Generate_UofR;Setup_Ur_HS;",list,";")
1344
1345
1346// from 2014 Automation of reduction
1347        list = RemoveFromList("DoAnnulusGraph;DoArcGraph;",list,";")
1348       
1349// from 2017-2018 VSANS reduction
1350        list = RemoveFromList("V_BroadPeak_Pix2D;V_BroadPeak_Pix2D_noThread;V_CleanupTimes;V_I_BroadPeak_Pix2D;V_IndexForHistogram;V_MakeFibonacciWave;V_UpdatePix2Mat;xJointHistogram;",list,";")
1351
1352        tmp = FunctionList("*X_",";","KIND:10")         // dummy functions with "X_" at the end, for vsans (2018)
1353        list = RemoveFromList(tmp, list  ,";")
1354       
1355        list = RemoveFromList("Integrate_BuiltIn;intgrnd;V_WB_testKernel;",list,";")
1356
1357                               
1358        list = SortList(list)
1359        return(list)
1360End
1361
1362
1363///////////////////////////////////////////////////
1364// old SANSPreferences have been moved here to a common place and renamed to "NCNR Preferences" so that they
1365// are common to all of the packages (and will appear on all of the menus)
1366//
1367// globals moved to root:Packages:NIST: since this is generated by all packages.
1368//
1369///////////////////////////
1370// user preferences
1371//
1372// globals are created in initialize.ipf
1373//
1374// this panel allows for user modification
1375///////////////////////////
1376Proc Show_Preferences_Panel()
1377
1378        DoWindow/F Pref_Panel
1379        if(V_flag==0)
1380                // only re-initialize if the variables don't exist, so you don't overwrite what users have changed
1381                if( exists("root:Packages:NIST:gXML_Write") != 2 )              //if the global variable does not exist, initialize
1382                        Initialize_Preferences()
1383                endif
1384                Pref_Panel()
1385        Endif
1386//      Print "Preferences Panel stub"
1387End
1388
1389Proc Initialize_Preferences()
1390        // create the globals here if they are not already present
1391       
1392        // each package initialization should call this to repeat the initialization
1393        // without overwriting what was already set
1394       
1395        Variable val
1396       
1397        ///// items for SANS reduction
1398        val = NumVarOrDefault("root:Packages:NIST:gLogScalingAsDefault", 1 )
1399        Variable/G root:Packages:NIST:gLogScalingAsDefault=val
1400       
1401        val = NumVarOrDefault("root:Packages:NIST:gAllowDRK", 0 )
1402        Variable/G root:Packages:NIST:gAllowDRK=val                     //don't show DRK as default
1403       
1404        val = NumVarOrDefault("root:Packages:NIST:gDoTransCheck", 1 )
1405        Variable/G root:Packages:NIST:gDoTransCheck=val
1406       
1407        val = NumVarOrDefault("root:Packages:NIST:gBinWidth", 1 )
1408        Variable/G root:Packages:NIST:gBinWidth=val
1409       
1410        val = NumVarOrDefault("root:Packages:NIST:gNPhiSteps", 72 )
1411        Variable/G root:Packages:NIST:gNPhiSteps=val
1412       
1413        // flags to turn detector corrections on/off for testing (you should leave these ON)
1414        val = NumVarOrDefault("root:Packages:NIST:gDoDetectorEffCorr", 1 )
1415        Variable/G root:Packages:NIST:gDoDetectorEffCorr = 1
1416       
1417        val = NumVarOrDefault("root:Packages:NIST:gDoTransmissionCorr", 1 )
1418        Variable/G root:Packages:NIST:gDoTransmissionCorr = 1
1419
1420// flag to allow adding raw data files with different attenuation (normally not done)   
1421        val = NumVarOrDefault("root:Packages:NIST:gDoAdjustRAW_Atten",0)
1422        Variable/G root:Packages:NIST:gDoAdjustRAW_Atten=val
1423       
1424        /// items for SANS Analysis
1425       
1426       
1427        /// items for USANS Reduction
1428       
1429       
1430        /// items for everyone
1431        val = NumVarOrDefault("root:Packages:NIST:gXML_Write", 0 )
1432        Variable/G root:Packages:NIST:gXML_Write = val
1433       
1434       
1435end
1436
1437Function LogScalePrefCheck(ctrlName,checked) : CheckBoxControl
1438        String ctrlName
1439        Variable checked
1440       
1441        NVAR gLog = root:Packages:NIST:gLogScalingAsDefault
1442        glog=checked
1443        //print "log pref checked = ",checked
1444End
1445
1446Function DRKProtocolPref(ctrlName,checked) : CheckBoxControl
1447        String ctrlName
1448        Variable checked
1449       
1450        NVAR gDRK = root:Packages:NIST:gAllowDRK
1451        gDRK = checked
1452        //Print "DRK preference = ",checked
1453End
1454
1455Function UnityTransPref(ctrlName,checked) : CheckBoxControl
1456        String ctrlName
1457        Variable checked
1458       
1459        NVAR gVal = root:Packages:NIST:gDoTransCheck
1460        gVal = checked
1461End
1462
1463Function XMLWritePref(ctrlName,checked) : CheckBoxControl
1464        String ctrlName
1465        Variable checked
1466       
1467        NVAR gVal = root:Packages:NIST:gXML_Write
1468        gVal = checked
1469End
1470
1471Function DoTransCorrPref(ctrlName,checked) : CheckBoxControl
1472        String ctrlName
1473        Variable checked
1474       
1475        NVAR gVal = root:Packages:NIST:gDoTransmissionCorr
1476        gVal = checked
1477End
1478
1479Function DoEfficiencyCorrPref(ctrlName,checked) : CheckBoxControl
1480        String ctrlName
1481        Variable checked
1482       
1483        NVAR gVal = root:Packages:NIST:gDoDetectorEffCorr
1484        gVal = checked
1485End
1486
1487Function DoRawAttenAdjPref(ctrlName,checked) : CheckBoxControl
1488        String ctrlName
1489        Variable checked
1490       
1491        NVAR gVal = root:Packages:NIST:gDoAdjustRAW_Atten
1492        gVal = checked
1493End
1494
1495Function PrefDoneButtonProc(ctrlName) : ButtonControl
1496        String ctrlName
1497       
1498        DoWindow/K pref_panel
1499End
1500
1501Proc Pref_Panel()
1502        PauseUpdate; Silent 1           // building window...
1503        NewPanel /W=(646,208,1070,468)/K=2 as "NCNR Preference Panel"
1504        DoWindow/C pref_panel
1505        ModifyPanel cbRGB=(49694,61514,27679)
1506        SetDrawLayer UserBack
1507        ModifyPanel fixedSize=1
1508//////
1509//on main portion of panel, always visible
1510        Button PrefPanelButtonA,pos={354,12},size={50,20},proc=PrefDoneButtonProc,title="Done"
1511
1512        TabControl PrefTab,pos={7,49},size={410,202},tabLabel(0)="General",proc=PrefTabProc
1513        TabControl PrefTab,tabLabel(1)="SANS",tabLabel(2)="USANS",tabLabel(3)="Analysis"
1514        TabControl PrefTab,value=0
1515        TabControl PrefTab labelBack=(49694,61514,27679)
1516       
1517//on tab(0) - General - initially visible
1518        CheckBox PrefCtrl_0a,pos={21,96},size={124,14},proc=XMLWritePref,title="Use canSAS XML Output"
1519        CheckBox PrefCtrl_0a,help={"Checking this will set the default output format to be canSAS XML rather than NIST 6 column"}
1520        CheckBox PrefCtrl_0a,value= root:Packages:NIST:gXML_Write
1521
1522//on tab(1) - SANS
1523        CheckBox PrefCtrl_1a,pos={21,100},size={171,14},proc=LogScalePrefCheck,title="Use Log scaling for 2D data display"
1524        CheckBox PrefCtrl_1a,help={"Checking this will display 2D SANS data with a logarithmic color scale of neutron counts. If not checked, the color mapping will be linear."}
1525        CheckBox PrefCtrl_1a,value= root:Packages:NIST:gLogScalingAsDefault
1526        CheckBox PrefCtrl_1b,pos={21,120},size={163,14},proc=DRKProtocolPref,title="Allow DRK correction in protocols"
1527        CheckBox PrefCtrl_1b,help={"Checking this will allow DRK correction to be used in reduction protocols. You will need to re-draw the protocol panel for this change to be visible."}
1528        CheckBox PrefCtrl_1b,value= root:Packages:NIST:gAllowDRK
1529        CheckBox PrefCtrl_1c,pos={21,140},size={137,14},proc=UnityTransPref,title="Check for Transmission = 1"
1530        CheckBox PrefCtrl_1c,help={"Checking this will check for SAM or EMP Trans = 1 during data correction"}
1531        CheckBox PrefCtrl_1c,value= root:Packages:NIST:gDoTransCheck
1532        SetVariable PrefCtrl_1d,pos={21,170},size={200,15},title="Averaging Bin Width (pixels)"
1533        SetVariable PrefCtrl_1d,limits={1,100,1},value= root:Packages:NIST:gBinWidth
1534        SetVariable PrefCtrl_1e,pos={21,195},size={200,15},title="# Phi Steps (annular avg)"
1535        SetVariable PrefCtrl_1e,limits={1,360,1},value= root:Packages:NIST:gNPhiSteps
1536        CheckBox PrefCtrl_1f title="Do Transmssion Correction?",size={140,14},value=root:Packages:NIST:gDoTransmissionCorr,proc=DoTransCorrPref
1537        CheckBox PrefCtrl_1f pos={255,100},help={"TURN OFF ONLY FOR DEBUGGING. This corrects the data for angle dependent transmssion."}
1538        CheckBox PrefCtrl_1g title="Do Efficiency Correction?",size={140,14},proc=DoEfficiencyCorrPref
1539        CheckBox PrefCtrl_1g value=root:Packages:NIST:gDoDetectorEffCorr,pos={255,120},help={"TURN OFF ONLY FOR DEBUGGING. This corrects the data for angle dependent detector efficiency."}
1540        CheckBox PrefCtrl_1h title="Adjust RAW attenuation?",size={140,14},proc=DoRawAttenAdjPref
1541        CheckBox PrefCtrl_1h value=root:Packages:NIST:gDoAdjustRAW_Atten,pos={255,140},help={"This is normally not done"}
1542
1543        CheckBox PrefCtrl_1a,disable=1
1544        CheckBox PrefCtrl_1b,disable=1
1545        CheckBox PrefCtrl_1c,disable=1
1546        SetVariable PrefCtrl_1d,disable=1
1547        SetVariable PrefCtrl_1e,disable=1
1548        CheckBox PrefCtrl_1f,disable=1
1549        CheckBox PrefCtrl_1g,disable=1
1550        CheckBox PrefCtrl_1h,disable=1
1551
1552//on tab(2) - USANS
1553        GroupBox PrefCtrl_2a pos={21,100},size={1,1},title="nothing to set",fSize=12
1554
1555        GroupBox PrefCtrl_2a,disable=1
1556
1557
1558//on tab(3) - Analysis
1559        GroupBox PrefCtrl_3a pos={21,100},size={1,1},title="nothing to set",fSize=12
1560       
1561        GroupBox PrefCtrl_3a,disable=1
1562
1563EndMacro
1564
1565// function to control the drawing of controls in the TabControl on the main panel
1566// Naming scheme for the controls MUST be strictly adhered to... else controls will
1567// appear in odd places...
1568// all controls are named PrefCtrl_NA where N is the tab number and A is the letter denoting
1569// the controls position on that particular tab.
1570// in this way, they will always be drawn correctly..
1571//
1572Function PrefTabProc(name,tab)
1573        String name
1574        Variable tab
1575       
1576//      Print "name,number",name,tab
1577        String ctrlList = ControlNameList("",";"),item="",nameStr=""
1578        Variable num = ItemsinList(ctrlList,";"),ii,onTab
1579        for(ii=0;ii<num;ii+=1)
1580                //items all start w/"PrefCtrl_", 9 characters
1581                item=StringFromList(ii, ctrlList ,";")
1582                nameStr=item[0,8]
1583                if(cmpstr(nameStr,"PrefCtrl_")==0)
1584                        onTab = str2num(item[9])                        //[9] is a number
1585                        ControlInfo $item
1586                        switch(abs(V_flag))     
1587                                case 1:
1588                                        Button $item,disable=(tab!=onTab)
1589                                        break
1590                                case 2:
1591                                        CheckBox $item,disable=(tab!=onTab)
1592                                        break
1593                                case 5:
1594                                        SetVariable $item,disable=(tab!=onTab)
1595                                        break
1596                                case 10:       
1597                                        TitleBox $item,disable=(tab!=onTab)
1598                                        break
1599                                case 4:
1600                                        ValDisplay $item,disable=(tab!=onTab)
1601                                        break
1602                                case 9:
1603                                        GroupBox $item,disable=(tab!=onTab)
1604                                        break
1605                                // add more items to the switch if different control types are used
1606                        endswitch
1607                endif
1608        endfor
1609        return(0)
1610End
1611
1612
1613////////////////////////////////////
1614// Modification from Matt Wasbrough to allow rescaling of the
1615// axes while plotting and fitting. allows export of the rescaled
1616// data and of the rescaled model
1617// Nov 2012
1618///
1619
1620Function UseRescaleAxisCheckProc(cba) : CheckBoxControl
1621        STRUCT WMCheckboxAction &cba
1622
1623        switch( cba.eventCode )
1624                case 2: // mouse up
1625                        Variable checked = cba.checked
1626                        if(checked)
1627                                Execute "OpenAxisPanel()"
1628                        else
1629                                if(exists("RescaleAxisPanel") !=0)
1630                                        DoWindow/K RescaleAxisPanel
1631                                endif
1632                        endif
1633                        break
1634        endswitch
1635
1636        return 0
1637End
1638
1639Proc OpenAxisPanel()
1640        If(WinType("RescaleAxisPanel") == 0)
1641                //create the necessary data folder
1642                NewDataFolder/O root:Packages
1643                NewDataFolder/O root:Packages:NIST
1644                NewDataFolder/O root:Packages:NIST:RescaleAxis
1645                //initialize the values
1646                Variable/G root:Packages:NIST:RescaleAxis:gRAExpA = 1
1647                Variable/G root:Packages:NIST:RescaleAxis:gRAExpB = 1
1648                Variable/G root:Packages:NIST:RescaleAxis:gRAExpC = 1
1649                RescaleAxisPanel()
1650        else
1651                //window already exists, just bring to front for update
1652                DoWindow/F RescaleAxisPanel
1653        endif
1654End
1655
1656Window RescaleAxisPanel()
1657        PauseUpdate; Silent 1           // building window...
1658        NewPanel /W=(461,46,735,195)/K=1
1659        ModifyPanel cbRGB=(49360,30954,64507), fixedSize=1
1660        SetDrawLayer UserBack
1661        PopupMenu ymodel,pos={20,10},size={76,19},title="y-axis"
1662        PopupMenu ymodel,help={"This popup selects how the y-axis will be linearized based on the chosen data"}
1663        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)\""
1664        Button GoRescale,pos={50,80},size={70,20},proc=RescalePlot,title="Rescale"
1665        Button GoRescale,help={"This button will rescale the axis using the selections in this panel"}
1666        Button DoneButton,pos={170,80},size={70,20},proc=RADoneButton,title="Done"
1667        Button DoneButton,help={"This button will close the panel"}
1668        Button ExportData, pos={100,110}, size={90,20}, proc=ExportData, title="Export Data"
1669        Button ExportData, help={"This button will export data from the top graph"}
1670        SetVariable expa,pos={13,45},size={80,17},title="pow \"a\""
1671        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"}
1672        SetVariable expa,limits={-2,10,0},value= root:Packages:NIST:RescaleAxis:gRAExpA
1673        SetVariable expb,pos={98,45},size={80,17},title="pow \"b\""
1674        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"}
1675        SetVariable expb,limits={0,10,0},value= root:Packages:NIST:RescaleAxis:gRAExpB
1676        PopupMenu xmodel,pos={155,10},size={79,19},title="x-axis"
1677        PopupMenu xmodel,help={"This popup selects how the x-axis will be linearized given the chosen data"}
1678        PopupMenu xmodel,mode=1,value= #"\"q;log(q);q^2;q^c\""
1679        SetVariable expc,pos={182,45},size={80,17},title="pow \"c\""
1680        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"}
1681        SetVariable expc,limits={-10,10,0},value= root:Packages:NIST:RescaleAxis:gRAExpC
1682        Button RAHelp, pos={220,110}, size={20,20}, proc=RAHelpButtonProc, title="?"
1683EndMacro
1684
1685Proc RADoneButton(ctrlName): ButtonControl
1686        String ctrlName
1687        DoWindow/K RescaleAxisPanel
1688        DoWindow/F WrapperPanel
1689        CheckBox check_8 value=0
1690end
1691
1692Function RAHelpButtonProc(ba) : ButtonControl
1693        STRUCT WMButtonAction &ba
1694
1695        switch( ba.eventCode )
1696                case 2: // mouse up
1697                        // click code here
1698                        DisplayHelpTopic/Z/K=1 "Rescaled Axis"
1699                        if(V_flag !=0)
1700                                DoAlert 0,"The Rescaled Axis Help file could not be found"
1701                        endif
1702                        break
1703        endswitch
1704
1705        return 0
1706End
1707
1708Proc ExportData(ctrlName): ButtonControl
1709        string ctrlName
1710        WriteRescaledData()             
1711End
1712       
1713
1714Function RescalePlot (ctrlName): ButtonControl
1715        String ctrlName
1716        SetDataFolder root:
1717        String topGraph= WinName(0,1)   //this is the topmost graph
1718        if(strlen(topGraph)==0)
1719                Abort "There is no graph"
1720        endif
1721               
1722        DoWindow/F $topGraph
1723        GetWindow/Z $topGraph, wavelist
1724        wave/t W_Wavelist
1725        SetDataFolder root:Packages:NIST:RescaleAxis
1726        if (exists("W_WaveList")==1)
1727                KillWaves/Z root:Packages:NIST:RescaleAxis:W_WaveList
1728        endif
1729        MoveWave root:W_WaveList, root:Packages:NIST:RescaleAxis:W_WaveList
1730        SetDataFolder root:Packages:NIST:RescaleAxis
1731        variable i,j,k
1732        string DF,DF1,temp, temp2, t1
1733        for (i=0; i < numpnts(W_WaveList)/3; i+=1)
1734                temp = W_WaveList[i][1]
1735                if (stringmatch(temp, "*_i") || stringmatch(temp, "*_i_RA"))
1736                        temp = W_WaveList[i][0]
1737                        if(stringmatch(temp, "*_i"))
1738                                temp = removeending(temp, "_i")
1739                        elseif(stringmatch(temp, "*_i_RA"))
1740                                temp = removeending(temp, "_i_RA")
1741                        endif
1742                        Make/T/O $temp/Wave=tempWave
1743                        DF = ReplaceString(W_Wavelist[i][0],W_Wavelist[i][1],"")
1744                        if (strlen(DF) ==0)
1745                                DF = ":"
1746                        endif
1747                        DF1 = "root"+DF
1748                        tempWave[0] = DF1
1749                        k = 1
1750                        for(j=0;j<numpnts(W_WaveList)/3; j+=1)
1751                                if (stringmatch(W_WaveList[j][1], "*"+temp+"*"))
1752                                        tempWave[k] = W_WaveList[j][0]
1753                                        k  = k+1
1754                                endif
1755                        endfor
1756                        redimension/N=(k) tempWave
1757                elseif(stringmatch(temp, "*ywave*"))
1758                        temp = W_WaveList[i][0]
1759                        if(stringmatch(temp, "*_RA"))
1760                                temp = removeending(temp, "_RA")
1761                        endif                   
1762                        Make/T/O $temp/Wave=tempWave
1763                        DF = ReplaceString(W_Wavelist[i][0],W_Wavelist[i][1],"")
1764                        if (strlen(DF) ==0)
1765                                DF = ":"
1766                        endif
1767                        DF1 = "root"+DF
1768                        tempWave[0] = DF1
1769                        temp2 = replacestring("ywave", temp, "")
1770                        k = 1
1771                        for(j=0;j<numpnts(W_WaveList)/3; j+=1)
1772                                t1 = W_Wavelist[j][1]
1773                                if (stringmatch(W_WaveList[j][1], "*wave"+temp2+"*"))
1774                                        tempWave[k] = W_WaveList[j][1]
1775                                        k  = k+1
1776                                endif
1777                        endfor
1778                        redimension/N=(k) tempWave
1779                endif
1780        endfor
1781        KillWaves/Z W_Wavelist
1782        string listWave = Wavelist("*", ";", "TEXT:1")
1783        string WaveToRescale, WaveDataFolder,xwave, ywave, swave
1784       
1785        for (i = 0; i < ItemsInList(listWave,";"); i+=1)
1786                temp = StringFromList(i,listWave,";")
1787                Wave/T WaveString = $temp
1788                for (j=1; j < numpnts(WaveString); j+=1)
1789                         WaveToRescale = Wavestring[j]
1790                         if (stringmatch(WaveToRescale, "*_RA"))
1791                                WaveToRescale = RemoveEnding(WaveToRescale, "_RA")
1792                         endif
1793                WaveDataFolder = WaveString[0]
1794                SetDataFolder $WaveDataFolder
1795                if (stringmatch(WaveToRescale, "*_q"))
1796                xwave = WaveToRescale
1797                XRescale(xwave)
1798                elseif (stringmatch(WaveToRescale, "*_i"))
1799                ywave = WaveToRescale
1800                xwave = RemoveEnding(WaveToRescale, "_i")+"_q"
1801                YRescale(ywave, xwave)
1802                elseif (stringmatch(WaveToRescale, "*_s"))
1803                swave = WaveToRescale
1804                ywave = RemoveEnding(WaveToRescale, "_s")+"_i"
1805                xwave = RemoveEnding(WaveToRescale, "_s")+"_q"
1806                ERescale(swave, ywave, xwave)
1807                elseif (stringmatch(WaveToRescale, "xwave_*"))
1808                xwave=WaveToRescale
1809                XRescale(xwave)
1810                elseif (stringmatch(WaveToRescale, "ywave_*"))
1811                ywave = WaveToRescale
1812                xwave= ReplaceString("ywave", WaveToRescale, "xwave")
1813                YRescale(ywave, xwave)
1814                elseif(stringmatch(WaveToRescale, "*_qvals"))
1815                xwave = WaveToRescale
1816                XRescale(xwave)
1817                elseif(stringmatch(WaveToRescale, "smeared*") && stringmatch(WaveToRescale, "!*_qvals"))
1818                ywave = WaveToRescale
1819                                for (k=1; k < numpnts(WaveString); k+=1)
1820                                        if (stringmatch(Wavestring[k], "*_qvals"))
1821                                                xwave = Wavestring[k]
1822                                        endif
1823                                endfor
1824                YRescale(ywave, xwave)
1825                else
1826                ywave = WaveToRescale
1827                        for (k=1; k < numpnts(WaveString); k+=1)
1828                                if (stringmatch(Wavestring[k], "*_q"))
1829                                        xwave = Wavestring[k]
1830                                endif
1831                        endfor
1832                YRescale(ywave,xwave)
1833                string yAxis = ywave+"_RA"
1834                wave yAxisWave = $yAxis
1835                SetFormula yAxisWave, "YRescale(ywave,xwave)"
1836                endif
1837                SetDataFolder root:Packages:NIST:RescaleAxis
1838                endfor
1839        endfor
1840       
1841        string oldywave, xstr, ystr
1842        for (i = 0; i < ItemsInList(listWave,";"); i+=1)
1843                temp = StringFromList(i,listWave,";")
1844                Wave/T WaveString = $temp
1845                for (j=1; j < numpnts(WaveString); j+=1)
1846                         WaveToRescale = Wavestring[j]
1847                WaveDataFolder = WaveString[0]
1848                SetDataFolder $WaveDataFolder
1849                ControlInfo/W=RescaleAxisPanel yModel
1850                ystr = S_Value
1851                ControlInfo/W=RescaleAxisPanel xModel
1852                xstr = S_Value
1853                        if(cmpstr("I",ystr)==0 && cmpstr("q",xstr)==0)
1854                                if(stringmatch(WaveToRescale, "*_i_RA"))
1855                                        oldywave = WaveToRescale
1856                                        ywave = RemoveEnding(WaveToRescale,"_RA")
1857                                        xwave = RemoveEnding(WaveToRescale, "_i_RA")+"_q"
1858                                        replacewave/Y/W=$topGraph trace=$oldywave, $ywave
1859                                        replacewave/X/W=$topGraph trace=$ywave, $xwave
1860                                        swave = RemoveEnding(WaveToRescale, "_i_RA")+"_s"
1861                                        if(exists(swave)==1)
1862                                                ErrorBars/T=0/W=$topGraph $ywave, Y wave=($swave,$swave)       
1863                                        endif
1864                                elseif (stringmatch(WaveToRescale,  "smeared*"))
1865                                        if(stringmatch(WaveToRescale,"*_RA") && stringmatch(WaveToRescale,"!*_qvals*") )
1866                                                oldywave = WaveToRescale
1867                                                ywave = RemoveEnding(WaveToRescale,"_RA")
1868                                                xwave = "smeared_qvals"
1869                                                replacewave/Y/W=$topGraph trace=$oldywave, $ywave
1870                                                replacewave/X/W=$topGraph trace=$ywave, $xwave
1871                                        endif
1872                                elseif(stringmatch(WaveToRescale,"ywave*") && stringmatch(WaveToRescale,"*_RA"))
1873                                        oldywave = WaveToRescale
1874                                        ywave = RemoveEnding(WaveToRescale,"_RA")
1875                                        xwave = ReplaceString("ywave",ywave,"xwave")
1876                                        replacewave/Y/W=$topGraph trace=$oldywave, $ywave
1877                                        replacewave/X/W=$topGraph trace=$ywave, $xwave                                 
1878                                elseif(stringmatch(WaveToRescale, "*FitYw*") && stringmatch(WaveToRescale, "*_RA"))
1879                                        oldywave = WaveToRescale
1880                                        ywave = RemoveEnding(WaveToRescale,"_RA")
1881                                        for (k=1; k < numpnts(WaveString); k+=1)
1882                                                if (stringmatch(Wavestring[k], "*_q"))
1883                                                        xwave = Wavestring[k]
1884                                                endif
1885                                        endfor
1886                                        replacewave/Y/W=$topGraph trace=$oldywave, $ywave
1887                                        replacewave/X/W=$topGraph trace=$ywave, $xwave 
1888                                endif                   
1889                        elseif(stringmatch(WaveToRescale, "*_RA"))
1890                        elseif (stringmatch(WaveToRescale, "*_i"))
1891                                DoWindow/F topGraph
1892                                oldywave = WaveToRescale
1893                                xwave = RemoveEnding(WaveToRescale, "_i")+"_q_RA"
1894                                ywave = WaveToRescale + "_RA"
1895                                replacewave/Y/W=$topGraph trace=$oldywave, $ywave
1896                                replacewave/X/W=$topGraph trace=$ywave, $xwave
1897                                ModifyGraph log=0
1898                                swave = RemoveEnding(WaveToRescale, "_i")+"_s_RA"
1899                                if(exists(swave)==1)
1900                                        ErrorBars/T=0/W=$topGraph $ywave, Y wave=($swave,$swave)       
1901                                endif
1902                                DoUpdate       
1903                        elseif(stringmatch(WaveToRescale, "smeared*") && stringmatch(WaveToRescale, "!*_qvals"))
1904                                oldywave = WaveToRescale
1905                                ywave = WaveToRescale + "_RA"
1906                                replacewave/Y/W=$topGraph trace=$oldywave, $ywave
1907                                xwave = "smeared_qvals_RA"
1908                                replacewave/X/W=$topGraph trace=$ywave, $xwave 
1909                        elseif(stringmatch(WaveToRescale,"ywave*"))
1910                                oldywave = WaveToRescale
1911                                ywave = WaveToRescale + "_RA"
1912                                xwave = ReplaceString("ywave",ywave,"xwave")
1913                                replacewave/Y/W=$topGraph trace=$oldywave, $ywave
1914                                replacewave/X/W=$topGraph trace=$ywave, $xwave                                 
1915                        elseif(stringmatch(WaveToRescale, "*FitYw*"))
1916                                oldywave = WaveToRescale
1917                                ywave = WaveToRescale+"_RA"
1918                                for (k=1; k < numpnts(WaveString); k+=1)
1919                                        if (stringmatch(Wavestring[k], "*_q"))
1920                                                xwave = Wavestring[k]+"_RA"
1921                                        endif
1922                                endfor
1923                                replacewave/Y/W=$topGraph trace=$oldywave, $ywave
1924                                replacewave/X/W=$topGraph trace=$ywave, $xwave 
1925                        endif
1926                        SetDataFolder root:Packages:NIST:RescaleAxis
1927                        DoUpdate
1928                endfor
1929        endfor
1930        KillWaves/A/Z
1931               
1932        string ylabel, xlabel
1933        ControlInfo/W=RescaleAxisPanel yModel
1934        ystr = S_Value
1935        ControlInfo/W=RescaleAxisPanel xModel
1936        xstr = S_Value
1937       
1938        if(cmpstr("I",ystr)==0 && cmpstr("q",xstr)==0)
1939                modifygraph log=1
1940        else
1941                modifygraph log=0
1942        endif
1943       
1944        Variable pow_a,pow_b,pow_c
1945        ControlInfo/W=RescaleAxisPanel expa
1946        pow_a = V_value
1947        ControlInfo/W=RescaleAxisPanel expb
1948        pow_b = V_value
1949        ControlInfo/W=RescaleAxisPanel expc
1950        pow_c = V_value
1951       
1952        If (cmpstr("I",ystr) == 0)
1953                ylabel = "I(q)"
1954        elseif (cmpstr("ln(I)",ystr) == 0)
1955                ylabel = "ln(I)"
1956        elseif (cmpstr("log(I)",ystr) == 0)
1957                ylabel = "log(I)"
1958        elseif (cmpstr("1/I",ystr) == 0)
1959                ylabel = "1/I"
1960        elseif (cmpstr("I^a",ystr) == 0)
1961                ylabel = "I\S"+num2str(pow_a)+"\M"
1962        elseif (cmpstr("Iq^a",ystr) == 0)
1963                ylabel = "Iq\S"+num2str(pow_a)+"\M"
1964        elseif (cmpstr("I^a q^b",ystr) == 0)
1965                ylabel = "I\S"+num2str(pow_a)+"\Mq\S"+num2str(pow_b)+"\M"
1966        elseif (cmpstr("1/sqrt(I)",ystr) == 0)
1967                ylabel = "1/sqrt(I)"
1968        elseif (cmpstr("ln(Iq)",ystr) == 0)
1969                ylabel = "ln(Iq)"
1970        elseif (cmpstr("ln(Iq^2)",ystr) == 0)
1971                ylabel = "ln(Iq\S2\M)"
1972        endif
1973
1974        If (cmpstr("q",xstr) == 0)
1975                xlabel = "q (A\S-1\M)"
1976        elseif (cmpstr("q^2",xstr) == 0)
1977                xlabel = "q\S2\M"
1978        elseif (cmpstr("log(q)",xstr) == 0)
1979                xlabel = "log(q)"
1980        elseif (cmpstr("q^c",xstr) == 0)
1981                xlabel = "q\S"+num2str(pow_c)+"\M"
1982        endif
1983       
1984        SetAxis/A
1985        Label left ylabel
1986        Label bottom xlabel
1987       
1988        SetDataFolder root:
1989End
1990
1991Function YRescale(ywave, xwave)
1992        String ywave,xwave
1993 
1994        Wave yw = $ywave
1995        Wave xw = $xwave
1996       
1997        //Scaling exponents and background value
1998        Variable pow_a,pow_b,pow_c
1999        ControlInfo/W=RescaleAxisPanel expa
2000        pow_a = V_value
2001        ControlInfo/W=RescaleAxisPanel expb
2002        pow_b = V_value
2003        ControlInfo/W=RescaleAxisPanel expc
2004        pow_c = V_value
2005       
2006        //check for physical limits on exponent values
2007        // if bad values found, alert, and reset to good values so the rescaling can continue
2008        NVAR gA = root:Packages:NIST:RescaleAxis:gRAExpA
2009        NVAR gB = root:Packages:NIST:RescaleAxis:gRAExpB
2010        NVAR gC = root:Packages:NIST:RescaleAxis:gRAExpC
2011        if((pow_a < -2) || (pow_a > 10))
2012                DoAlert 0,"Exponent a must be in the range (-2,10) - the exponent a has been reset to 1"
2013                gA = 1
2014        endif
2015        if((pow_b < 0) || (pow_b > 10))
2016                DoAlert 0,"Exponent b must be in the range (0,10) - the exponent b has been reset to 1"
2017                gB = 1
2018        endif
2019        //if q^c is the x-scaling, c must be be within limits and also non-zero
2020        ControlInfo/W=RescaleAxisPanel xModel
2021        If (cmpstr("q^c",S_Value) == 0)
2022                if(pow_c == 0)
2023                        DoAlert 0,"Exponent c must be non-zero, c has been reset to 1"
2024                        gC = 1
2025                endif
2026                if((pow_c < -10) || (pow_c > 10))
2027                        DoAlert 0,"Exponent c must be in the range (-10,10), c has been reset to 1"
2028                        gC = 1
2029                endif
2030        endif
2031       
2032        //variables set for each model to control look of graph
2033        String ystr, yAxis
2034        //check for proper y-scaling selection, make the necessary waves
2035//      Wave yAxisWave
2036
2037        ControlInfo/W=RescaleAxisPanel yModel
2038        ystr = S_Value
2039       
2040        do
2041                If (cmpstr("I",S_Value) == 0)
2042                        yAxis = ywave+"_RA"
2043                        if (exists(yAxis)== 0)
2044                                Duplicate yw $yAxis
2045                        endif
2046                        SetScale d 0,0,"1/cm",$yAxis
2047                        wave yAxisWave = $yAxis
2048                        yAxisWave = yw
2049                        break   
2050                endif
2051                If (cmpstr("ln(I)",S_Value) == 0)
2052                        yAxis = ywave+"_RA"
2053                        if (exists(yAxis)== 0)
2054                                Duplicate yw $yAxis
2055                        endif
2056                        SetScale d 0,0,"",$yAxis
2057                        wave yAxisWave = $yAxis
2058                        yAxisWave = ln(yw)
2059                        break   
2060                endif
2061                If (cmpstr("log(I)",S_Value) == 0)
2062                        yAxis = ywave+"_RA"
2063                        if (exists(yAxis)== 0)
2064                                Duplicate yw $yAxis
2065                        endif
2066                        SetScale d 0,0,"",$yAxis
2067                        wave yAxisWave = $yAxis
2068                        yAxisWave = log(yw)
2069                        break   
2070                endif
2071                If (cmpstr("1/I",S_Value) == 0)
2072                        yAxis = ywave+"_RA"
2073                        if (exists(yAxis)== 0)
2074                                Duplicate yw $yAxis
2075                        endif
2076                        SetScale d 0,0,"",$yAxis
2077                        wave yAxisWave = $yAxis
2078                        yAxisWave = 1/(yw)
2079                        break
2080                endif
2081                If (cmpstr("I^a",S_Value) == 0)
2082                        yAxis = ywave+"_RA"
2083                        if (exists(yAxis)== 0)
2084                                Duplicate yw $yAxis
2085                        endif
2086                        SetScale d 0,0,"",$yAxis
2087                        wave yAxisWave = $yAxis
2088                        yAxisWave = yw^pow_a
2089                        break
2090                endif
2091                If (cmpstr("Iq^a",S_Value) == 0)
2092                        yAxis = ywave+"_RA"
2093                        if (exists(yAxis)== 0)
2094                                Duplicate yw $yAxis
2095                        endif
2096                        SetScale d 0,0,"",$yAxis
2097                        wave yAxisWave = $yAxis
2098                        yAxisWave = yw*xw^pow_a
2099                        break
2100                endif
2101                If (cmpstr("I^a q^b",S_Value) == 0)
2102                        yAxis = ywave+"_RA"
2103                        if (exists(yAxis)== 0)
2104                                Duplicate yw $yAxis
2105                        endif
2106                        SetScale d 0,0,"",$yAxis
2107                        wave yAxisWave = $yAxis
2108                        yAxisWave = yw^pow_a*xw^pow_b
2109                        break
2110                endif
2111                If (cmpstr("1/sqrt(I)",S_Value) == 0)
2112                        yAxis = ywave+"_RA"
2113                        if (exists(yAxis)== 0)
2114                                Duplicate yw $yAxis
2115                        endif
2116                        SetScale d 0,0,"",$yAxis
2117                        wave yAxisWave = $yAxis
2118                        yAxisWave = 1/sqrt(yw)
2119                        break
2120                endif
2121                If (cmpstr("ln(Iq)",S_Value) == 0)
2122                        yAxis = ywave+"_RA"
2123                        if (exists(yAxis)== 0)
2124                                Duplicate yw $yAxis
2125                        endif
2126                        SetScale d 0,0,"",$yAxis
2127                        wave yAxisWave = $yAxis
2128                        yAxisWave = ln(xw*yw)
2129                        break
2130                endif
2131                If (cmpstr("ln(Iq^2)",S_Value) == 0)
2132                        yAxis = ywave+"_RA"
2133                        if (exists(yAxis)== 0)
2134                                Duplicate yw $yAxis
2135                        endif
2136                        SetScale d 0,0,"",$yAxis
2137                        wave yAxisWave = $yAxis
2138                        yAxisWave = ln(xw*xw*yw)
2139                        break
2140                endif
2141                //more ifs for each case
2142               
2143                // if selection not found, abort
2144                DoAlert 0,"Y-axis scaling incorrect. Aborting"
2145                Abort
2146        while(0)
2147End
2148
2149Function XRescale(xwave)       
2150        String xwave
2151 
2152        Wave xw = $xwave
2153                 
2154        //Scaling exponents and background value
2155        Variable pow_a,pow_b,pow_c
2156        ControlInfo/W=RescaleAxisPanel expa
2157        pow_a = V_value
2158        ControlInfo/W=RescaleAxisPanel expb
2159        pow_b = V_value
2160        ControlInfo/W=RescaleAxisPanel expc
2161        pow_c = V_value
2162       
2163//check for physical limits on exponent values
2164// if bad values found, alert, and reset to good values so the rescaling can continue
2165        NVAR gA = root:Packages:NIST:RescaleAxis:gRAExpA
2166        NVAR gB = root:Packages:NIST:RescaleAxis:gRAExpB
2167        NVAR gC = root:Packages:NIST:RescaleAxis:gRAExpC
2168        if((pow_a < -2) || (pow_a > 10))
2169                DoAlert 0,"Exponent a must be in the range (-2,10) - the exponent a has been reset to 1"
2170                gA = 1
2171        endif
2172        if((pow_b < 0) || (pow_b > 10))
2173                DoAlert 0,"Exponent b must be in the range (0,10) - the exponent b has been reset to 1"
2174                gB = 1
2175        endif
2176        //if q^c is the x-scaling, c must be be within limits and also non-zero
2177        ControlInfo/W=RescaleAxisPanel xModel
2178        If (cmpstr("q^c",S_Value) == 0)
2179                if(pow_c == 0)
2180                        DoAlert 0,"Exponent c must be non-zero, c has been reset to 1"
2181                        gC = 1
2182                endif
2183                if((pow_c < -10) || (pow_c > 10))
2184                        DoAlert 0,"Exponent c must be in the range (-10,10), c has been reset to 1"
2185                        gC = 1
2186                endif
2187        endif
2188       
2189        //variables set for each model to control look of graph
2190        String xstr, xAxis
2191        //check for proper y-scaling selection, make the necessary waves
2192//      Wave xAxisWave
2193
2194        ControlInfo/W=RescaleAxisPanel xModel
2195        xstr = S_Value
2196        do
2197                // make the new yaxis wave
2198                If (cmpstr("q",S_Value) == 0)   
2199                        xAxis = xwave+"_RA"
2200                        if (exists(xAxis)== 0)
2201                                Duplicate xw $xAxis
2202                        endif
2203                        SetScale d 0,0,"A^-1",$xAxis
2204                        wave xAxisWave = $xAxis
2205                        xAxisWave = xw
2206                        break   
2207                endif
2208                If (cmpstr("q^2",S_Value) == 0)
2209                        xAxis = xwave+"_RA"
2210                        if (exists(xAxis)== 0)
2211                                Duplicate xw $xAxis
2212                        endif
2213                        SetScale d 0,0,"A^-2",$xAxis
2214                        wave xAxisWave = $xAxis
2215                        xAxisWave = xw*xw
2216                        break   
2217                endif
2218                If (cmpstr("log(q)",S_Value) == 0)     
2219                        xAxis = xwave+"_RA"
2220                        if (exists(xAxis)== 0)
2221                                Duplicate xw $xAxis
2222                        endif
2223                        SetScale d 0,0,"",$xAxis
2224                        wave xAxisWave = $xAxis
2225                        xAxisWave = log(xw)
2226                        break   
2227                endif
2228                If (cmpstr("q^c",S_Value) == 0)
2229                        xAxis = xwave+"_RA"
2230                        if (exists(xAxis)== 0)
2231                                Duplicate xw $xAxis
2232                        endif
2233                        SetScale d 0,0,"", $xAxis
2234                        wave xAxisWave = $xAxis
2235                        xAxisWave = xw^pow_c
2236                        break
2237                endif
2238       
2239                //more ifs for each case
2240                // if selection not found, abort
2241                DoAlert 0,"X-axis scaling incorrect. Aborting"
2242                Abort
2243        while(0)        //end of "case" statement for x-axis scaling
2244End
2245
2246Function ERescale(swave, ywave, xwave) 
2247        String swave, ywave, xwave
2248 
2249        Wave ew = $swave
2250        Wave yw = $ywave
2251        Wave xw = $xwave
2252                 
2253        //Scaling exponents and background value
2254        Variable pow_a,pow_b,pow_c
2255        ControlInfo/W=RescaleAxisPanel expa
2256        pow_a = V_value
2257        ControlInfo/W=RescaleAxisPanel expb
2258        pow_b = V_value
2259        ControlInfo/W=RescaleAxisPanel expc
2260        pow_c = V_value
2261       
2262//check for physical limits on exponent values
2263// if bad values found, alert, and reset to good values so the rescaling can continue
2264        NVAR gA = root:Packages:NIST:RescaleAxis:gRAExpA
2265        NVAR gB = root:Packages:NIST:RescaleAxis:gRAExpB
2266        NVAR gC = root:Packages:NIST:RescaleAxis:gRAExpC
2267        if((pow_a < -2) || (pow_a > 10))
2268                DoAlert 0,"Exponent a must be in the range (-2,10) - the exponent a has been reset to 1"
2269                gA = 1
2270        endif
2271        if((pow_b < 0) || (pow_b > 10))
2272                DoAlert 0,"Exponent b must be in the range (0,10) - the exponent b has been reset to 1"
2273                gB = 1
2274        endif
2275        //if q^c is the x-scaling, c must be be within limits and also non-zero
2276        ControlInfo/W=RescaleAxisPanel xModel
2277        If (cmpstr("q^c",S_Value) == 0)
2278                if(pow_c == 0)
2279                        DoAlert 0,"Exponent c must be non-zero, c has been reset to 1"
2280                        gC = 1
2281                endif
2282                if((pow_c < -10) || (pow_c > 10))
2283                        DoAlert 0,"Exponent c must be in the range (-10,10), c has been reset to 1"
2284                        gC = 1
2285                endif
2286        endif
2287       
2288        //variables set for each model to control look of graph
2289        String ystr, eWave
2290        //check for proper y-scaling selection, make the necessary waves
2291//      Wave yErrWave
2292
2293        ControlInfo/W=RescaleAxisPanel yModel
2294        ystr = S_Value
2295        do
2296               
2297                If (cmpstr("I",S_Value) == 0)
2298                        eWave = swave+"_RA"
2299                        if (exists(eWave) == 0)
2300                                Duplicate ew $eWave
2301                        endif
2302                        wave yErrWave = $eWave
2303                        yErrWave = ew
2304                        break   
2305                endif
2306                If (cmpstr("ln(I)",S_Value) == 0)
2307                        eWave = swave+"_RA"
2308                        if (exists(eWave) == 0)
2309                                Duplicate ew $eWave
2310                        endif
2311                        wave yErrWave = $eWave
2312                        yErrWave = ew/yw
2313                        break   
2314                endif
2315                If (cmpstr("log(I)",S_Value) == 0)
2316                        eWave = swave+"_RA"
2317                        if (exists(eWave) == 0)
2318                                Duplicate ew $eWave
2319                        endif
2320                        wave yErrWave = $eWave
2321                        yErrWave = ew/(2.30*yw)
2322                        break   
2323                endif
2324                If (cmpstr("1/I",S_Value) == 0)
2325                        eWave = swave+"_RA"
2326                        if (exists(eWave) == 0)
2327                                Duplicate ew $eWave
2328                        endif
2329                        wave yErrWave = $eWave
2330                        yErrWave = ew/(yw^2)
2331                        break
2332                endif
2333                If (cmpstr("I^a",S_Value) == 0)
2334                        eWave = swave+"_RA"
2335                        if (exists(eWave) == 0)
2336                                Duplicate ew $eWave
2337                        endif
2338                        wave yErrWave = $eWave
2339                        yErrWave = ew*abs(pow_a*(yw^(pow_a-1)))
2340                        break
2341                endif
2342                If (cmpstr("Iq^a",S_Value) == 0)
2343                        eWave = swave+"_RA"
2344                        if (exists(eWave) == 0)
2345                                Duplicate ew $eWave
2346                        endif
2347                        wave yErrWave = $eWave
2348                        yErrWave = ew*xw^pow_a
2349                        break
2350                endif
2351                If (cmpstr("I^a q^b",S_Value) == 0)
2352                        eWave = swave+"_RA"
2353                        if (exists(eWave) == 0)
2354                                Duplicate ew $eWave
2355                        endif
2356                        wave yErrWave = $eWave
2357                        yErrWave = ew*abs(pow_a*(yw^(pow_a-1)))*xw^pow_b
2358                        break
2359                endif
2360                If (cmpstr("1/sqrt(I)",S_Value) == 0)
2361                        eWave = swave+"_RA"
2362                        if (exists(eWave) == 0)
2363                                Duplicate ew $eWave
2364                        endif
2365                        wave yErrWave = $eWave
2366                        yErrWave = 0.5*ew*yw^(-1.5)
2367                        break
2368                endif
2369                If (cmpstr("ln(Iq)",S_Value) == 0)
2370                        eWave = swave+"_RA"
2371                        if (exists(eWave) == 0)
2372                                Duplicate ew $eWave
2373                        endif
2374                        wave yErrWave = $eWave
2375                        yErrWave =ew/yw
2376                        break
2377                endif
2378                If (cmpstr("ln(Iq^2)",S_Value) == 0)
2379                        eWave = swave+"_RA"
2380                        if (exists(eWave) == 0)
2381                                Duplicate ew $eWave
2382                        endif
2383                        wave yErrWave = $eWave
2384                        yErrWave = ew/yw
2385                        break
2386                endif
2387                //more ifs for each case
2388               
2389                // if selection not found, abort
2390                DoAlert 0,"Y-axis scaling incorrect. Aborting"
2391                Abort
2392        while(0)        //end of "case" statement for y-axis scaling
2393
2394End
2395
2396///////////////////////////
2397
Note: See TracBrowser for help on using the repository browser.