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

Last change on this file since 1165 was 1165, checked in by krzywon, 4 years ago

Change the data output from a checkbox to a radio button. Tie the writer into base 'Reduce a File' method. Tested and working.

File size: 77.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:gASCII_Write") != 2 || exists("root:Packages:NIST:gXML_Write") != 2 || exists("root:Packages:NIST:gNXcanSAS_Write") != 2)                //if the global variable does not exist, initialize
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// is the data file from NICE and in terms of QValues rather than angle
1431        val = NumVarOrDefault("root:Packages:NIST:gRawUSANSisQvalues", 1 )
1432        Variable/G root:Packages:NIST:gRawUSANSisQvalues=val   
1433       
1434        /// items for everyone
1435        val = NumVarOrDefault("root:Packages:NIST:gASCII_Write", 1 )
1436        if (val == 1)
1437                WritePref("PrefCtrl_0",1)
1438        endif
1439        Variable/G root:Packages:NIST:gASCII_Write = val
1440        val = NumVarOrDefault("root:Packages:NIST:gXML_Write", 0 )
1441        if (val == 1)
1442                WritePref("PrefCtrl_0a",1)
1443        endif
1444        Variable/G root:Packages:NIST:gXML_Write = val
1445        val = NumVarOrDefault("root:Packages:NIST:gNXcanSAS_Write", 0 )
1446        if (val == 1)
1447                WritePref("PrefCtrl_0b",1)
1448        endif
1449        Variable/G root:Packages:NIST:gNXcanSAS_Write = val
1450       
1451end
1452
1453Function LogScalePrefCheck(ctrlName,checked) : CheckBoxControl
1454        String ctrlName
1455        Variable checked
1456       
1457        NVAR gLog = root:Packages:NIST:gLogScalingAsDefault
1458        glog=checked
1459        //print "log pref checked = ",checked
1460End
1461
1462Function DRKProtocolPref(ctrlName,checked) : CheckBoxControl
1463        String ctrlName
1464        Variable checked
1465       
1466        NVAR gDRK = root:Packages:NIST:gAllowDRK
1467        gDRK = checked
1468        //Print "DRK preference = ",checked
1469End
1470
1471Function UnityTransPref(ctrlName,checked) : CheckBoxControl
1472        String ctrlName
1473        Variable checked
1474       
1475        NVAR gVal = root:Packages:NIST:gDoTransCheck
1476        gVal = checked
1477End
1478
1479Function WritePref(ctrlName,checked) : CheckBoxControl
1480        String ctrlName
1481        Variable checked
1482       
1483        NVAR asciiVal = root:Packages:NIST:gASCII_Write
1484        NVAR xmlVal = root:Packages:NIST:gXML_Write
1485        NVAR nxVal = root:Packages:NIST:gNXcanSAS_Write
1486       
1487        strswitch (ctrlName)
1488                case "PrefCtrl_0":
1489                        CheckBox PrefCtrl_0,value=1
1490                        asciiVal = checked
1491                        CheckBox PrefCtrl_0a,value=0
1492                        xmlVal = 0
1493                        CheckBox PrefCtrl_0b,value=0
1494                        nxVal = 0
1495                        break
1496                case "PrefCtrl_0a":
1497                        CheckBox PrefCtrl_0,value=0
1498                        asciiVal = 0
1499                        CheckBox PrefCtrl_0a,value=1
1500                        xmlVal = checked
1501                        CheckBox PrefCtrl_0b,value=0
1502                        nxVal = 0
1503                        break
1504                case "PrefCtrl_0b":
1505                        CheckBox PrefCtrl_0,value=0
1506                        asciiVal = 0
1507                        CheckBox PrefCtrl_0a,value=0
1508                        xmlVal = 0
1509                        CheckBox PrefCtrl_0b,value=1
1510                        nxVal = checked
1511        endswitch
1512End
1513
1514Function DoTransCorrPref(ctrlName,checked) : CheckBoxControl
1515        String ctrlName
1516        Variable checked
1517       
1518        NVAR gVal = root:Packages:NIST:gDoTransmissionCorr
1519        gVal = checked
1520End
1521
1522Function DoEfficiencyCorrPref(ctrlName,checked) : CheckBoxControl
1523        String ctrlName
1524        Variable checked
1525       
1526        NVAR gVal = root:Packages:NIST:gDoDetectorEffCorr
1527        gVal = checked
1528End
1529
1530Function DoRawAttenAdjPref(ctrlName,checked) : CheckBoxControl
1531        String ctrlName
1532        Variable checked
1533       
1534        NVAR gVal = root:Packages:NIST:gDoAdjustRAW_Atten
1535        gVal = checked
1536End
1537
1538//set the angle->Q conversion factor
1539// or set the Q->Q "conversion" factor
1540// this is the same value that is set in Init_USANS_Facility()
1541// Mar 2019
1542Function RawUSANSisQPref(ctrlName,checked) : CheckBoxControl
1543        String ctrlName
1544        Variable checked
1545       
1546        NVAR gVal = root:Packages:NIST:gRawUSANSisQvalues
1547        gVal = checked
1548       
1549        if(checked == 1)
1550                Variable/G root:Packages:NIST:USANS:Globals:MainPanel:deg2QConv = 1             //so that the q-values are unchanged
1551        else
1552                Variable/G root:Packages:NIST:USANS:Globals:MainPanel:deg2QConv=5.55e-5         //JGB -- 2/24/01
1553        endif
1554End
1555
1556
1557
1558Function PrefDoneButtonProc(ctrlName) : ButtonControl
1559        String ctrlName
1560       
1561        DoWindow/K pref_panel
1562End
1563
1564Proc Pref_Panel()
1565        PauseUpdate; Silent 1           // building window...
1566        NewPanel /W=(646,208,1070,468)/K=2 as "NCNR Preference Panel"
1567        DoWindow/C pref_panel
1568        ModifyPanel cbRGB=(49694,61514,27679)
1569        SetDrawLayer UserBack
1570        ModifyPanel fixedSize=1
1571//////
1572//on main portion of panel, always visible
1573        Button PrefPanelButtonA,pos={354,12},size={50,20},proc=PrefDoneButtonProc,title="Done"
1574
1575        TabControl PrefTab,pos={7,49},size={410,202},tabLabel(0)="General",proc=PrefTabProc
1576        TabControl PrefTab,tabLabel(1)="SANS",tabLabel(2)="USANS",tabLabel(3)="Analysis"
1577        TabControl PrefTab,value=0
1578        TabControl PrefTab labelBack=(49694,61514,27679)
1579       
1580//on tab(0) - General - initially visible
1581        CheckBox PrefCtrl_0,pos={21,100},size={124,14},proc=WritePref,title="Use ASCII 6-column Output (default)",mode=1
1582        CheckBox PrefCtrl_0,help={"Checking this will set the default output to the NIST 6 column format"}
1583        CheckBox PrefCtrl_0,value= root:Packages:NIST:gASCII_Write
1584        CheckBox PrefCtrl_0a,pos={21,120},size={124,14},proc=WritePref,title="Use canSAS XML Output",mode=1
1585        CheckBox PrefCtrl_0a,help={"Checking this will set the default output to be canSAS XML format"}
1586        CheckBox PrefCtrl_0a,value= root:Packages:NIST:gXML_Write
1587        CheckBox PrefCtrl_0b,pos={21,140},size={124,14},proc=WritePref,title="Use NXcanSAS HDF5 Output",mode=1
1588        CheckBox PrefCtrl_0b,help={"Checking this will set the default output to be NXcanSAS HDF5 format"}
1589        CheckBox PrefCtrl_0b,value= root:Packages:NIST:gNXcanSAS_Write
1590
1591//on tab(1) - SANS
1592        CheckBox PrefCtrl_1a,pos={21,100},size={171,14},proc=LogScalePrefCheck,title="Use Log scaling for 2D data display"
1593        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."}
1594        CheckBox PrefCtrl_1a,value= root:Packages:NIST:gLogScalingAsDefault
1595        CheckBox PrefCtrl_1b,pos={21,120},size={163,14},proc=DRKProtocolPref,title="Allow DRK correction in protocols"
1596        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."}
1597        CheckBox PrefCtrl_1b,value= root:Packages:NIST:gAllowDRK
1598        CheckBox PrefCtrl_1c,pos={21,140},size={137,14},proc=UnityTransPref,title="Check for Transmission = 1"
1599        CheckBox PrefCtrl_1c,help={"Checking this will check for SAM or EMP Trans = 1 during data correction"}
1600        CheckBox PrefCtrl_1c,value= root:Packages:NIST:gDoTransCheck
1601        SetVariable PrefCtrl_1d,pos={21,170},size={200,15},title="Averaging Bin Width (pixels)"
1602        SetVariable PrefCtrl_1d,limits={1,100,1},value= root:Packages:NIST:gBinWidth
1603        SetVariable PrefCtrl_1e,pos={21,195},size={200,15},title="# Phi Steps (annular avg)"
1604        SetVariable PrefCtrl_1e,limits={1,360,1},value= root:Packages:NIST:gNPhiSteps
1605        CheckBox PrefCtrl_1f title="Do Transmssion Correction?",size={140,14},value=root:Packages:NIST:gDoTransmissionCorr,proc=DoTransCorrPref
1606        CheckBox PrefCtrl_1f pos={255,100},help={"TURN OFF ONLY FOR DEBUGGING. This corrects the data for angle dependent transmssion."}
1607        CheckBox PrefCtrl_1g title="Do Efficiency Correction?",size={140,14},proc=DoEfficiencyCorrPref
1608        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."}
1609        CheckBox PrefCtrl_1h title="Adjust RAW attenuation?",size={140,14},proc=DoRawAttenAdjPref
1610        CheckBox PrefCtrl_1h value=root:Packages:NIST:gDoAdjustRAW_Atten,pos={255,140},help={"This is normally not done"}
1611
1612        CheckBox PrefCtrl_1a,disable=1
1613        CheckBox PrefCtrl_1b,disable=1
1614        CheckBox PrefCtrl_1c,disable=1
1615        SetVariable PrefCtrl_1d,disable=1
1616        SetVariable PrefCtrl_1e,disable=1
1617        CheckBox PrefCtrl_1f,disable=1
1618        CheckBox PrefCtrl_1g,disable=1
1619        CheckBox PrefCtrl_1h,disable=1
1620
1621//on tab(2) - USANS
1622//      GroupBox PrefCtrl_2a pos={21,100},size={1,1},title="nothing to set",fSize=12
1623//      GroupBox PrefCtrl_2a,disable=1
1624        CheckBox PrefCtrl_2a,pos={21,100},size={171,14},proc=RawUSANSisQPref,title="Raw USANS Data is Q-values"
1625        CheckBox PrefCtrl_2a,help={"Check this if raw data was collected using NICE (q-values). If data was collected using ICP (angle), leave this unchecked."}
1626        CheckBox PrefCtrl_2a,value= root:Packages:NIST:gRawUSANSisQvalues
1627
1628
1629        CheckBox PrefCtrl_2a,disable=1
1630
1631
1632
1633//on tab(3) - Analysis
1634        GroupBox PrefCtrl_3a pos={21,100},size={1,1},title="nothing to set",fSize=12
1635       
1636        GroupBox PrefCtrl_3a,disable=1
1637
1638EndMacro
1639
1640// function to control the drawing of controls in the TabControl on the main panel
1641// Naming scheme for the controls MUST be strictly adhered to... else controls will
1642// appear in odd places...
1643// all controls are named PrefCtrl_NA where N is the tab number and A is the letter denoting
1644// the controls position on that particular tab.
1645// in this way, they will always be drawn correctly..
1646//
1647Function PrefTabProc(name,tab)
1648        String name
1649        Variable tab
1650       
1651//      Print "name,number",name,tab
1652        String ctrlList = ControlNameList("",";"),item="",nameStr=""
1653        Variable num = ItemsinList(ctrlList,";"),ii,onTab
1654        for(ii=0;ii<num;ii+=1)
1655                //items all start w/"PrefCtrl_", 9 characters
1656                item=StringFromList(ii, ctrlList ,";")
1657                nameStr=item[0,8]
1658                if(cmpstr(nameStr,"PrefCtrl_")==0)
1659                        onTab = str2num(item[9])                        //[9] is a number
1660                        ControlInfo $item
1661                        switch(abs(V_flag))     
1662                                case 1:
1663                                        Button $item,disable=(tab!=onTab)
1664                                        break
1665                                case 2:
1666                                        CheckBox $item,disable=(tab!=onTab)
1667                                        break
1668                                case 5:
1669                                        SetVariable $item,disable=(tab!=onTab)
1670                                        break
1671                                case 10:       
1672                                        TitleBox $item,disable=(tab!=onTab)
1673                                        break
1674                                case 4:
1675                                        ValDisplay $item,disable=(tab!=onTab)
1676                                        break
1677                                case 9:
1678                                        GroupBox $item,disable=(tab!=onTab)
1679                                        break
1680                                // add more items to the switch if different control types are used
1681                        endswitch
1682                endif
1683        endfor
1684        return(0)
1685End
1686
1687
1688
1689
1690
1691
1692
1693////////////////////////////////////
1694// Modification from Matt Wasbrough to allow rescaling of the
1695// axes while plotting and fitting. allows export of the rescaled
1696// data and of the rescaled model
1697// Nov 2012
1698///
1699
1700Function UseRescaleAxisCheckProc(cba) : CheckBoxControl
1701        STRUCT WMCheckboxAction &cba
1702
1703        switch( cba.eventCode )
1704                case 2: // mouse up
1705                        Variable checked = cba.checked
1706                        if(checked)
1707                                Execute "OpenAxisPanel()"
1708                        else
1709                                if(exists("RescaleAxisPanel") !=0)
1710                                        DoWindow/K RescaleAxisPanel
1711                                endif
1712                        endif
1713                        break
1714        endswitch
1715
1716        return 0
1717End
1718
1719Proc OpenAxisPanel()
1720        If(WinType("RescaleAxisPanel") == 0)
1721                //create the necessary data folder
1722                NewDataFolder/O root:Packages
1723                NewDataFolder/O root:Packages:NIST
1724                NewDataFolder/O root:Packages:NIST:RescaleAxis
1725                //initialize the values
1726                Variable/G root:Packages:NIST:RescaleAxis:gRAExpA = 1
1727                Variable/G root:Packages:NIST:RescaleAxis:gRAExpB = 1
1728                Variable/G root:Packages:NIST:RescaleAxis:gRAExpC = 1
1729                RescaleAxisPanel()
1730        else
1731                //window already exists, just bring to front for update
1732                DoWindow/F RescaleAxisPanel
1733        endif
1734End
1735
1736Window RescaleAxisPanel()
1737        PauseUpdate; Silent 1           // building window...
1738        NewPanel /W=(461,46,735,195)/K=1
1739        ModifyPanel cbRGB=(49360,30954,64507), fixedSize=1
1740        SetDrawLayer UserBack
1741        PopupMenu ymodel,pos={20,10},size={76,19},title="y-axis"
1742        PopupMenu ymodel,help={"This popup selects how the y-axis will be linearized based on the chosen data"}
1743        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)\""
1744        Button GoRescale,pos={50,80},size={70,20},proc=RescalePlot,title="Rescale"
1745        Button GoRescale,help={"This button will rescale the axis using the selections in this panel"}
1746        Button DoneButton,pos={170,80},size={70,20},proc=RADoneButton,title="Done"
1747        Button DoneButton,help={"This button will close the panel"}
1748        Button ExportData, pos={100,110}, size={90,20}, proc=ExportData, title="Export Data"
1749        Button ExportData, help={"This button will export data from the top graph"}
1750        SetVariable expa,pos={13,45},size={80,17},title="pow \"a\""
1751        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"}
1752        SetVariable expa,limits={-2,10,0},value= root:Packages:NIST:RescaleAxis:gRAExpA
1753        SetVariable expb,pos={98,45},size={80,17},title="pow \"b\""
1754        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"}
1755        SetVariable expb,limits={0,10,0},value= root:Packages:NIST:RescaleAxis:gRAExpB
1756        PopupMenu xmodel,pos={155,10},size={79,19},title="x-axis"
1757        PopupMenu xmodel,help={"This popup selects how the x-axis will be linearized given the chosen data"}
1758        PopupMenu xmodel,mode=1,value= #"\"q;log(q);q^2;q^c\""
1759        SetVariable expc,pos={182,45},size={80,17},title="pow \"c\""
1760        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"}
1761        SetVariable expc,limits={-10,10,0},value= root:Packages:NIST:RescaleAxis:gRAExpC
1762        Button RAHelp, pos={220,110}, size={20,20}, proc=RAHelpButtonProc, title="?"
1763EndMacro
1764
1765Proc RADoneButton(ctrlName): ButtonControl
1766        String ctrlName
1767        DoWindow/K RescaleAxisPanel
1768        DoWindow/F WrapperPanel
1769        CheckBox check_8 value=0
1770end
1771
1772Function RAHelpButtonProc(ba) : ButtonControl
1773        STRUCT WMButtonAction &ba
1774
1775        switch( ba.eventCode )
1776                case 2: // mouse up
1777                        // click code here
1778                        DisplayHelpTopic/Z/K=1 "Rescaled Axis"
1779                        if(V_flag !=0)
1780                                DoAlert 0,"The Rescaled Axis Help file could not be found"
1781                        endif
1782                        break
1783        endswitch
1784
1785        return 0
1786End
1787
1788Proc ExportData(ctrlName): ButtonControl
1789        string ctrlName
1790        WriteRescaledData()             
1791End
1792       
1793
1794Function RescalePlot (ctrlName): ButtonControl
1795        String ctrlName
1796        SetDataFolder root:
1797        String topGraph= WinName(0,1)   //this is the topmost graph
1798        if(strlen(topGraph)==0)
1799                Abort "There is no graph"
1800        endif
1801               
1802        DoWindow/F $topGraph
1803        GetWindow/Z $topGraph, wavelist
1804        wave/t W_Wavelist
1805        SetDataFolder root:Packages:NIST:RescaleAxis
1806        if (exists("W_WaveList")==1)
1807                KillWaves/Z root:Packages:NIST:RescaleAxis:W_WaveList
1808        endif
1809        MoveWave root:W_WaveList, root:Packages:NIST:RescaleAxis:W_WaveList
1810        SetDataFolder root:Packages:NIST:RescaleAxis
1811        variable i,j,k
1812        string DF,DF1,temp, temp2, t1
1813        for (i=0; i < numpnts(W_WaveList)/3; i+=1)
1814                temp = W_WaveList[i][1]
1815                if (stringmatch(temp, "*_i") || stringmatch(temp, "*_i_RA"))
1816                        temp = W_WaveList[i][0]
1817                        if(stringmatch(temp, "*_i"))
1818                                temp = removeending(temp, "_i")
1819                        elseif(stringmatch(temp, "*_i_RA"))
1820                                temp = removeending(temp, "_i_RA")
1821                        endif
1822                        Make/T/O $temp/Wave=tempWave
1823                        DF = ReplaceString(W_Wavelist[i][0],W_Wavelist[i][1],"")
1824                        if (strlen(DF) ==0)
1825                                DF = ":"
1826                        endif
1827                        DF1 = "root"+DF
1828                        tempWave[0] = DF1
1829                        k = 1
1830                        for(j=0;j<numpnts(W_WaveList)/3; j+=1)
1831                                if (stringmatch(W_WaveList[j][1], "*"+temp+"*"))
1832                                        tempWave[k] = W_WaveList[j][0]
1833                                        k  = k+1
1834                                endif
1835                        endfor
1836                        redimension/N=(k) tempWave
1837                elseif(stringmatch(temp, "*ywave*"))
1838                        temp = W_WaveList[i][0]
1839                        if(stringmatch(temp, "*_RA"))
1840                                temp = removeending(temp, "_RA")
1841                        endif                   
1842                        Make/T/O $temp/Wave=tempWave
1843                        DF = ReplaceString(W_Wavelist[i][0],W_Wavelist[i][1],"")
1844                        if (strlen(DF) ==0)
1845                                DF = ":"
1846                        endif
1847                        DF1 = "root"+DF
1848                        tempWave[0] = DF1
1849                        temp2 = replacestring("ywave", temp, "")
1850                        k = 1
1851                        for(j=0;j<numpnts(W_WaveList)/3; j+=1)
1852                                t1 = W_Wavelist[j][1]
1853                                if (stringmatch(W_WaveList[j][1], "*wave"+temp2+"*"))
1854                                        tempWave[k] = W_WaveList[j][1]
1855                                        k  = k+1
1856                                endif
1857                        endfor
1858                        redimension/N=(k) tempWave
1859                endif
1860        endfor
1861        KillWaves/Z W_Wavelist
1862        string listWave = Wavelist("*", ";", "TEXT:1")
1863        string WaveToRescale, WaveDataFolder,xwave, ywave, swave
1864       
1865        for (i = 0; i < ItemsInList(listWave,";"); i+=1)
1866                temp = StringFromList(i,listWave,";")
1867                Wave/T WaveString = $temp
1868                for (j=1; j < numpnts(WaveString); j+=1)
1869                         WaveToRescale = Wavestring[j]
1870                         if (stringmatch(WaveToRescale, "*_RA"))
1871                                WaveToRescale = RemoveEnding(WaveToRescale, "_RA")
1872                         endif
1873                WaveDataFolder = WaveString[0]
1874                SetDataFolder $WaveDataFolder
1875                if (stringmatch(WaveToRescale, "*_q"))
1876                xwave = WaveToRescale
1877                XRescale(xwave)
1878                elseif (stringmatch(WaveToRescale, "*_i"))
1879                ywave = WaveToRescale
1880                xwave = RemoveEnding(WaveToRescale, "_i")+"_q"
1881                YRescale(ywave, xwave)
1882                elseif (stringmatch(WaveToRescale, "*_s"))
1883                swave = WaveToRescale
1884                ywave = RemoveEnding(WaveToRescale, "_s")+"_i"
1885                xwave = RemoveEnding(WaveToRescale, "_s")+"_q"
1886                ERescale(swave, ywave, xwave)
1887                elseif (stringmatch(WaveToRescale, "xwave_*"))
1888                xwave=WaveToRescale
1889                XRescale(xwave)
1890                elseif (stringmatch(WaveToRescale, "ywave_*"))
1891                ywave = WaveToRescale
1892                xwave= ReplaceString("ywave", WaveToRescale, "xwave")
1893                YRescale(ywave, xwave)
1894                elseif(stringmatch(WaveToRescale, "*_qvals"))
1895                xwave = WaveToRescale
1896                XRescale(xwave)
1897                elseif(stringmatch(WaveToRescale, "smeared*") && stringmatch(WaveToRescale, "!*_qvals"))
1898                ywave = WaveToRescale
1899                                for (k=1; k < numpnts(WaveString); k+=1)
1900                                        if (stringmatch(Wavestring[k], "*_qvals"))
1901                                                xwave = Wavestring[k]
1902                                        endif
1903                                endfor
1904                YRescale(ywave, xwave)
1905                else
1906                ywave = WaveToRescale
1907                        for (k=1; k < numpnts(WaveString); k+=1)
1908                                if (stringmatch(Wavestring[k], "*_q"))
1909                                        xwave = Wavestring[k]
1910                                endif
1911                        endfor
1912                YRescale(ywave,xwave)
1913                string yAxis = ywave+"_RA"
1914                wave yAxisWave = $yAxis
1915                SetFormula yAxisWave, "YRescale(ywave,xwave)"
1916                endif
1917                SetDataFolder root:Packages:NIST:RescaleAxis
1918                endfor
1919        endfor
1920       
1921        string oldywave, xstr, ystr
1922        for (i = 0; i < ItemsInList(listWave,";"); i+=1)
1923                temp = StringFromList(i,listWave,";")
1924                Wave/T WaveString = $temp
1925                for (j=1; j < numpnts(WaveString); j+=1)
1926                         WaveToRescale = Wavestring[j]
1927                WaveDataFolder = WaveString[0]
1928                SetDataFolder $WaveDataFolder
1929                ControlInfo/W=RescaleAxisPanel yModel
1930                ystr = S_Value
1931                ControlInfo/W=RescaleAxisPanel xModel
1932                xstr = S_Value
1933                        if(cmpstr("I",ystr)==0 && cmpstr("q",xstr)==0)
1934                                if(stringmatch(WaveToRescale, "*_i_RA"))
1935                                        oldywave = WaveToRescale
1936                                        ywave = RemoveEnding(WaveToRescale,"_RA")
1937                                        xwave = RemoveEnding(WaveToRescale, "_i_RA")+"_q"
1938                                        replacewave/Y/W=$topGraph trace=$oldywave, $ywave
1939                                        replacewave/X/W=$topGraph trace=$ywave, $xwave
1940                                        swave = RemoveEnding(WaveToRescale, "_i_RA")+"_s"
1941                                        if(exists(swave)==1)
1942                                                ErrorBars/T=0/W=$topGraph $ywave, Y wave=($swave,$swave)       
1943                                        endif
1944                                elseif (stringmatch(WaveToRescale,  "smeared*"))
1945                                        if(stringmatch(WaveToRescale,"*_RA") && stringmatch(WaveToRescale,"!*_qvals*") )
1946                                                oldywave = WaveToRescale
1947                                                ywave = RemoveEnding(WaveToRescale,"_RA")
1948                                                xwave = "smeared_qvals"
1949                                                replacewave/Y/W=$topGraph trace=$oldywave, $ywave
1950                                                replacewave/X/W=$topGraph trace=$ywave, $xwave
1951                                        endif
1952                                elseif(stringmatch(WaveToRescale,"ywave*") && stringmatch(WaveToRescale,"*_RA"))
1953                                        oldywave = WaveToRescale
1954                                        ywave = RemoveEnding(WaveToRescale,"_RA")
1955                                        xwave = ReplaceString("ywave",ywave,"xwave")
1956                                        replacewave/Y/W=$topGraph trace=$oldywave, $ywave
1957                                        replacewave/X/W=$topGraph trace=$ywave, $xwave                                 
1958                                elseif(stringmatch(WaveToRescale, "*FitYw*") && stringmatch(WaveToRescale, "*_RA"))
1959                                        oldywave = WaveToRescale
1960                                        ywave = RemoveEnding(WaveToRescale,"_RA")
1961                                        for (k=1; k < numpnts(WaveString); k+=1)
1962                                                if (stringmatch(Wavestring[k], "*_q"))
1963                                                        xwave = Wavestring[k]
1964                                                endif
1965                                        endfor
1966                                        replacewave/Y/W=$topGraph trace=$oldywave, $ywave
1967                                        replacewave/X/W=$topGraph trace=$ywave, $xwave 
1968                                endif                   
1969                        elseif(stringmatch(WaveToRescale, "*_RA"))
1970                        elseif (stringmatch(WaveToRescale, "*_i"))
1971                                DoWindow/F topGraph
1972                                oldywave = WaveToRescale
1973                                xwave = RemoveEnding(WaveToRescale, "_i")+"_q_RA"
1974                                ywave = WaveToRescale + "_RA"
1975                                replacewave/Y/W=$topGraph trace=$oldywave, $ywave
1976                                replacewave/X/W=$topGraph trace=$ywave, $xwave
1977                                ModifyGraph log=0
1978                                swave = RemoveEnding(WaveToRescale, "_i")+"_s_RA"
1979                                if(exists(swave)==1)
1980                                        ErrorBars/T=0/W=$topGraph $ywave, Y wave=($swave,$swave)       
1981                                endif
1982                                DoUpdate       
1983                        elseif(stringmatch(WaveToRescale, "smeared*") && stringmatch(WaveToRescale, "!*_qvals"))
1984                                oldywave = WaveToRescale
1985                                ywave = WaveToRescale + "_RA"
1986                                replacewave/Y/W=$topGraph trace=$oldywave, $ywave
1987                                xwave = "smeared_qvals_RA"
1988                                replacewave/X/W=$topGraph trace=$ywave, $xwave 
1989                        elseif(stringmatch(WaveToRescale,"ywave*"))
1990                                oldywave = WaveToRescale
1991                                ywave = WaveToRescale + "_RA"
1992                                xwave = ReplaceString("ywave",ywave,"xwave")
1993                                replacewave/Y/W=$topGraph trace=$oldywave, $ywave
1994                                replacewave/X/W=$topGraph trace=$ywave, $xwave                                 
1995                        elseif(stringmatch(WaveToRescale, "*FitYw*"))
1996                                oldywave = WaveToRescale
1997                                ywave = WaveToRescale+"_RA"
1998                                for (k=1; k < numpnts(WaveString); k+=1)
1999                                        if (stringmatch(Wavestring[k], "*_q"))
2000                                                xwave = Wavestring[k]+"_RA"
2001                                        endif
2002                                endfor
2003                                replacewave/Y/W=$topGraph trace=$oldywave, $ywave
2004                                replacewave/X/W=$topGraph trace=$ywave, $xwave 
2005                        endif
2006                        SetDataFolder root:Packages:NIST:RescaleAxis
2007                        DoUpdate
2008                endfor
2009        endfor
2010        KillWaves/A/Z
2011               
2012        string ylabel, xlabel
2013        ControlInfo/W=RescaleAxisPanel yModel
2014        ystr = S_Value
2015        ControlInfo/W=RescaleAxisPanel xModel
2016        xstr = S_Value
2017       
2018        if(cmpstr("I",ystr)==0 && cmpstr("q",xstr)==0)
2019                modifygraph log=1
2020        else
2021                modifygraph log=0
2022        endif
2023       
2024        Variable pow_a,pow_b,pow_c
2025        ControlInfo/W=RescaleAxisPanel expa
2026        pow_a = V_value
2027        ControlInfo/W=RescaleAxisPanel expb
2028        pow_b = V_value
2029        ControlInfo/W=RescaleAxisPanel expc
2030        pow_c = V_value
2031       
2032        If (cmpstr("I",ystr) == 0)
2033                ylabel = "I(q)"
2034        elseif (cmpstr("ln(I)",ystr) == 0)
2035                ylabel = "ln(I)"
2036        elseif (cmpstr("log(I)",ystr) == 0)
2037                ylabel = "log(I)"
2038        elseif (cmpstr("1/I",ystr) == 0)
2039                ylabel = "1/I"
2040        elseif (cmpstr("I^a",ystr) == 0)
2041                ylabel = "I\S"+num2str(pow_a)+"\M"
2042        elseif (cmpstr("Iq^a",ystr) == 0)
2043                ylabel = "Iq\S"+num2str(pow_a)+"\M"
2044        elseif (cmpstr("I^a q^b",ystr) == 0)
2045                ylabel = "I\S"+num2str(pow_a)+"\Mq\S"+num2str(pow_b)+"\M"
2046        elseif (cmpstr("1/sqrt(I)",ystr) == 0)
2047                ylabel = "1/sqrt(I)"
2048        elseif (cmpstr("ln(Iq)",ystr) == 0)
2049                ylabel = "ln(Iq)"
2050        elseif (cmpstr("ln(Iq^2)",ystr) == 0)
2051                ylabel = "ln(Iq\S2\M)"
2052        endif
2053
2054        If (cmpstr("q",xstr) == 0)
2055                xlabel = "q (A\S-1\M)"
2056        elseif (cmpstr("q^2",xstr) == 0)
2057                xlabel = "q\S2\M"
2058        elseif (cmpstr("log(q)",xstr) == 0)
2059                xlabel = "log(q)"
2060        elseif (cmpstr("q^c",xstr) == 0)
2061                xlabel = "q\S"+num2str(pow_c)+"\M"
2062        endif
2063       
2064        SetAxis/A
2065        Label left ylabel
2066        Label bottom xlabel
2067       
2068        SetDataFolder root:
2069End
2070
2071Function YRescale(ywave, xwave)
2072        String ywave,xwave
2073 
2074        Wave yw = $ywave
2075        Wave xw = $xwave
2076       
2077        //Scaling exponents and background value
2078        Variable pow_a,pow_b,pow_c
2079        ControlInfo/W=RescaleAxisPanel expa
2080        pow_a = V_value
2081        ControlInfo/W=RescaleAxisPanel expb
2082        pow_b = V_value
2083        ControlInfo/W=RescaleAxisPanel expc
2084        pow_c = V_value
2085       
2086        //check for physical limits on exponent values
2087        // if bad values found, alert, and reset to good values so the rescaling can continue
2088        NVAR gA = root:Packages:NIST:RescaleAxis:gRAExpA
2089        NVAR gB = root:Packages:NIST:RescaleAxis:gRAExpB
2090        NVAR gC = root:Packages:NIST:RescaleAxis:gRAExpC
2091        if((pow_a < -2) || (pow_a > 10))
2092                DoAlert 0,"Exponent a must be in the range (-2,10) - the exponent a has been reset to 1"
2093                gA = 1
2094        endif
2095        if((pow_b < 0) || (pow_b > 10))
2096                DoAlert 0,"Exponent b must be in the range (0,10) - the exponent b has been reset to 1"
2097                gB = 1
2098        endif
2099        //if q^c is the x-scaling, c must be be within limits and also non-zero
2100        ControlInfo/W=RescaleAxisPanel xModel
2101        If (cmpstr("q^c",S_Value) == 0)
2102                if(pow_c == 0)
2103                        DoAlert 0,"Exponent c must be non-zero, c has been reset to 1"
2104                        gC = 1
2105                endif
2106                if((pow_c < -10) || (pow_c > 10))
2107                        DoAlert 0,"Exponent c must be in the range (-10,10), c has been reset to 1"
2108                        gC = 1
2109                endif
2110        endif
2111       
2112        //variables set for each model to control look of graph
2113        String ystr, yAxis
2114        //check for proper y-scaling selection, make the necessary waves
2115//      Wave yAxisWave
2116
2117        ControlInfo/W=RescaleAxisPanel yModel
2118        ystr = S_Value
2119       
2120        do
2121                If (cmpstr("I",S_Value) == 0)
2122                        yAxis = ywave+"_RA"
2123                        if (exists(yAxis)== 0)
2124                                Duplicate yw $yAxis
2125                        endif
2126                        SetScale d 0,0,"1/cm",$yAxis
2127                        wave yAxisWave = $yAxis
2128                        yAxisWave = yw
2129                        break   
2130                endif
2131                If (cmpstr("ln(I)",S_Value) == 0)
2132                        yAxis = ywave+"_RA"
2133                        if (exists(yAxis)== 0)
2134                                Duplicate yw $yAxis
2135                        endif
2136                        SetScale d 0,0,"",$yAxis
2137                        wave yAxisWave = $yAxis
2138                        yAxisWave = ln(yw)
2139                        break   
2140                endif
2141                If (cmpstr("log(I)",S_Value) == 0)
2142                        yAxis = ywave+"_RA"
2143                        if (exists(yAxis)== 0)
2144                                Duplicate yw $yAxis
2145                        endif
2146                        SetScale d 0,0,"",$yAxis
2147                        wave yAxisWave = $yAxis
2148                        yAxisWave = log(yw)
2149                        break   
2150                endif
2151                If (cmpstr("1/I",S_Value) == 0)
2152                        yAxis = ywave+"_RA"
2153                        if (exists(yAxis)== 0)
2154                                Duplicate yw $yAxis
2155                        endif
2156                        SetScale d 0,0,"",$yAxis
2157                        wave yAxisWave = $yAxis
2158                        yAxisWave = 1/(yw)
2159                        break
2160                endif
2161                If (cmpstr("I^a",S_Value) == 0)
2162                        yAxis = ywave+"_RA"
2163                        if (exists(yAxis)== 0)
2164                                Duplicate yw $yAxis
2165                        endif
2166                        SetScale d 0,0,"",$yAxis
2167                        wave yAxisWave = $yAxis
2168                        yAxisWave = yw^pow_a
2169                        break
2170                endif
2171                If (cmpstr("Iq^a",S_Value) == 0)
2172                        yAxis = ywave+"_RA"
2173                        if (exists(yAxis)== 0)
2174                                Duplicate yw $yAxis
2175                        endif
2176                        SetScale d 0,0,"",$yAxis
2177                        wave yAxisWave = $yAxis
2178                        yAxisWave = yw*xw^pow_a
2179                        break
2180                endif
2181                If (cmpstr("I^a q^b",S_Value) == 0)
2182                        yAxis = ywave+"_RA"
2183                        if (exists(yAxis)== 0)
2184                                Duplicate yw $yAxis
2185                        endif
2186                        SetScale d 0,0,"",$yAxis
2187                        wave yAxisWave = $yAxis
2188                        yAxisWave = yw^pow_a*xw^pow_b
2189                        break
2190                endif
2191                If (cmpstr("1/sqrt(I)",S_Value) == 0)
2192                        yAxis = ywave+"_RA"
2193                        if (exists(yAxis)== 0)
2194                                Duplicate yw $yAxis
2195                        endif
2196                        SetScale d 0,0,"",$yAxis
2197                        wave yAxisWave = $yAxis
2198                        yAxisWave = 1/sqrt(yw)
2199                        break
2200                endif
2201                If (cmpstr("ln(Iq)",S_Value) == 0)
2202                        yAxis = ywave+"_RA"
2203                        if (exists(yAxis)== 0)
2204                                Duplicate yw $yAxis
2205                        endif
2206                        SetScale d 0,0,"",$yAxis
2207                        wave yAxisWave = $yAxis
2208                        yAxisWave = ln(xw*yw)
2209                        break
2210                endif
2211                If (cmpstr("ln(Iq^2)",S_Value) == 0)
2212                        yAxis = ywave+"_RA"
2213                        if (exists(yAxis)== 0)
2214                                Duplicate yw $yAxis
2215                        endif
2216                        SetScale d 0,0,"",$yAxis
2217                        wave yAxisWave = $yAxis
2218                        yAxisWave = ln(xw*xw*yw)
2219                        break
2220                endif
2221                //more ifs for each case
2222               
2223                // if selection not found, abort
2224                DoAlert 0,"Y-axis scaling incorrect. Aborting"
2225                Abort
2226        while(0)
2227End
2228
2229Function XRescale(xwave)       
2230        String xwave
2231 
2232        Wave xw = $xwave
2233                 
2234        //Scaling exponents and background value
2235        Variable pow_a,pow_b,pow_c
2236        ControlInfo/W=RescaleAxisPanel expa
2237        pow_a = V_value
2238        ControlInfo/W=RescaleAxisPanel expb
2239        pow_b = V_value
2240        ControlInfo/W=RescaleAxisPanel expc
2241        pow_c = V_value
2242       
2243//check for physical limits on exponent values
2244// if bad values found, alert, and reset to good values so the rescaling can continue
2245        NVAR gA = root:Packages:NIST:RescaleAxis:gRAExpA
2246        NVAR gB = root:Packages:NIST:RescaleAxis:gRAExpB
2247        NVAR gC = root:Packages:NIST:RescaleAxis:gRAExpC
2248        if((pow_a < -2) || (pow_a > 10))
2249                DoAlert 0,"Exponent a must be in the range (-2,10) - the exponent a has been reset to 1"
2250                gA = 1
2251        endif
2252        if((pow_b < 0) || (pow_b > 10))
2253                DoAlert 0,"Exponent b must be in the range (0,10) - the exponent b has been reset to 1"
2254                gB = 1
2255        endif
2256        //if q^c is the x-scaling, c must be be within limits and also non-zero
2257        ControlInfo/W=RescaleAxisPanel xModel
2258        If (cmpstr("q^c",S_Value) == 0)
2259                if(pow_c == 0)
2260                        DoAlert 0,"Exponent c must be non-zero, c has been reset to 1"
2261                        gC = 1
2262                endif
2263                if((pow_c < -10) || (pow_c > 10))
2264                        DoAlert 0,"Exponent c must be in the range (-10,10), c has been reset to 1"
2265                        gC = 1
2266                endif
2267        endif
2268       
2269        //variables set for each model to control look of graph
2270        String xstr, xAxis
2271        //check for proper y-scaling selection, make the necessary waves
2272//      Wave xAxisWave
2273
2274        ControlInfo/W=RescaleAxisPanel xModel
2275        xstr = S_Value
2276        do
2277                // make the new yaxis wave
2278                If (cmpstr("q",S_Value) == 0)   
2279                        xAxis = xwave+"_RA"
2280                        if (exists(xAxis)== 0)
2281                                Duplicate xw $xAxis
2282                        endif
2283                        SetScale d 0,0,"A^-1",$xAxis
2284                        wave xAxisWave = $xAxis
2285                        xAxisWave = xw
2286                        break   
2287                endif
2288                If (cmpstr("q^2",S_Value) == 0)
2289                        xAxis = xwave+"_RA"
2290                        if (exists(xAxis)== 0)
2291                                Duplicate xw $xAxis
2292                        endif
2293                        SetScale d 0,0,"A^-2",$xAxis
2294                        wave xAxisWave = $xAxis
2295                        xAxisWave = xw*xw
2296                        break   
2297                endif
2298                If (cmpstr("log(q)",S_Value) == 0)     
2299                        xAxis = xwave+"_RA"
2300                        if (exists(xAxis)== 0)
2301                                Duplicate xw $xAxis
2302                        endif
2303                        SetScale d 0,0,"",$xAxis
2304                        wave xAxisWave = $xAxis
2305                        xAxisWave = log(xw)
2306                        break   
2307                endif
2308                If (cmpstr("q^c",S_Value) == 0)
2309                        xAxis = xwave+"_RA"
2310                        if (exists(xAxis)== 0)
2311                                Duplicate xw $xAxis
2312                        endif
2313                        SetScale d 0,0,"", $xAxis
2314                        wave xAxisWave = $xAxis
2315                        xAxisWave = xw^pow_c
2316                        break
2317                endif
2318       
2319                //more ifs for each case
2320                // if selection not found, abort
2321                DoAlert 0,"X-axis scaling incorrect. Aborting"
2322                Abort
2323        while(0)        //end of "case" statement for x-axis scaling
2324End
2325
2326Function ERescale(swave, ywave, xwave) 
2327        String swave, ywave, xwave
2328 
2329        Wave ew = $swave
2330        Wave yw = $ywave
2331        Wave xw = $xwave
2332                 
2333        //Scaling exponents and background value
2334        Variable pow_a,pow_b,pow_c
2335        ControlInfo/W=RescaleAxisPanel expa
2336        pow_a = V_value
2337        ControlInfo/W=RescaleAxisPanel expb
2338        pow_b = V_value
2339        ControlInfo/W=RescaleAxisPanel expc
2340        pow_c = V_value
2341       
2342//check for physical limits on exponent values
2343// if bad values found, alert, and reset to good values so the rescaling can continue
2344        NVAR gA = root:Packages:NIST:RescaleAxis:gRAExpA
2345        NVAR gB = root:Packages:NIST:RescaleAxis:gRAExpB
2346        NVAR gC = root:Packages:NIST:RescaleAxis:gRAExpC
2347        if((pow_a < -2) || (pow_a > 10))
2348                DoAlert 0,"Exponent a must be in the range (-2,10) - the exponent a has been reset to 1"
2349                gA = 1
2350        endif
2351        if((pow_b < 0) || (pow_b > 10))
2352                DoAlert 0,"Exponent b must be in the range (0,10) - the exponent b has been reset to 1"
2353                gB = 1
2354        endif
2355        //if q^c is the x-scaling, c must be be within limits and also non-zero
2356        ControlInfo/W=RescaleAxisPanel xModel
2357        If (cmpstr("q^c",S_Value) == 0)
2358                if(pow_c == 0)
2359                        DoAlert 0,"Exponent c must be non-zero, c has been reset to 1"
2360                        gC = 1
2361                endif
2362                if((pow_c < -10) || (pow_c > 10))
2363                        DoAlert 0,"Exponent c must be in the range (-10,10), c has been reset to 1"
2364                        gC = 1
2365                endif
2366        endif
2367       
2368        //variables set for each model to control look of graph
2369        String ystr, eWave
2370        //check for proper y-scaling selection, make the necessary waves
2371//      Wave yErrWave
2372
2373        ControlInfo/W=RescaleAxisPanel yModel
2374        ystr = S_Value
2375        do
2376               
2377                If (cmpstr("I",S_Value) == 0)
2378                        eWave = swave+"_RA"
2379                        if (exists(eWave) == 0)
2380                                Duplicate ew $eWave
2381                        endif
2382                        wave yErrWave = $eWave
2383                        yErrWave = ew
2384                        break   
2385                endif
2386                If (cmpstr("ln(I)",S_Value) == 0)
2387                        eWave = swave+"_RA"
2388                        if (exists(eWave) == 0)
2389                                Duplicate ew $eWave
2390                        endif
2391                        wave yErrWave = $eWave
2392                        yErrWave = ew/yw
2393                        break   
2394                endif
2395                If (cmpstr("log(I)",S_Value) == 0)
2396                        eWave = swave+"_RA"
2397                        if (exists(eWave) == 0)
2398                                Duplicate ew $eWave
2399                        endif
2400                        wave yErrWave = $eWave
2401                        yErrWave = ew/(2.30*yw)
2402                        break   
2403                endif
2404                If (cmpstr("1/I",S_Value) == 0)
2405                        eWave = swave+"_RA"
2406                        if (exists(eWave) == 0)
2407                                Duplicate ew $eWave
2408                        endif
2409                        wave yErrWave = $eWave
2410                        yErrWave = ew/(yw^2)
2411                        break
2412                endif
2413                If (cmpstr("I^a",S_Value) == 0)
2414                        eWave = swave+"_RA"
2415                        if (exists(eWave) == 0)
2416                                Duplicate ew $eWave
2417                        endif
2418                        wave yErrWave = $eWave
2419                        yErrWave = ew*abs(pow_a*(yw^(pow_a-1)))
2420                        break
2421                endif
2422                If (cmpstr("Iq^a",S_Value) == 0)
2423                        eWave = swave+"_RA"
2424                        if (exists(eWave) == 0)
2425                                Duplicate ew $eWave
2426                        endif
2427                        wave yErrWave = $eWave
2428                        yErrWave = ew*xw^pow_a
2429                        break
2430                endif
2431                If (cmpstr("I^a q^b",S_Value) == 0)
2432                        eWave = swave+"_RA"
2433                        if (exists(eWave) == 0)
2434                                Duplicate ew $eWave
2435                        endif
2436                        wave yErrWave = $eWave
2437                        yErrWave = ew*abs(pow_a*(yw^(pow_a-1)))*xw^pow_b
2438                        break
2439                endif
2440                If (cmpstr("1/sqrt(I)",S_Value) == 0)
2441                        eWave = swave+"_RA"
2442                        if (exists(eWave) == 0)
2443                                Duplicate ew $eWave
2444                        endif
2445                        wave yErrWave = $eWave
2446                        yErrWave = 0.5*ew*yw^(-1.5)
2447                        break
2448                endif
2449                If (cmpstr("ln(Iq)",S_Value) == 0)
2450                        eWave = swave+"_RA"
2451                        if (exists(eWave) == 0)
2452                                Duplicate ew $eWave
2453                        endif
2454                        wave yErrWave = $eWave
2455                        yErrWave =ew/yw
2456                        break
2457                endif
2458                If (cmpstr("ln(Iq^2)",S_Value) == 0)
2459                        eWave = swave+"_RA"
2460                        if (exists(eWave) == 0)
2461                                Duplicate ew $eWave
2462                        endif
2463                        wave yErrWave = $eWave
2464                        yErrWave = ew/yw
2465                        break
2466                endif
2467                //more ifs for each case
2468               
2469                // if selection not found, abort
2470                DoAlert 0,"Y-axis scaling incorrect. Aborting"
2471                Abort
2472        while(0)        //end of "case" statement for y-axis scaling
2473
2474End
2475
2476///////////////////////////
2477
Note: See TracBrowser for help on using the repository browser.