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

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

changes to read in new USANS Raw data structure, based on the file creation date.

Some additional changes to sector averaging and viewing the "avg" masks on the detector panels. still not quite complete.

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