source: sans/Dev/branches/nxcansas_writer/NCNR_User_Procedures/Common/Packages/PlotManager/PlotUtilsMacro_v40.ipf @ 1189

Last change on this file since 1189 was 1189, checked in by krzywon, 3 years ago

Incorporate suggested changes for cleaner separation of VSANS, USANS, and SANS reduction methods. Plus fixes.

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