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

Last change on this file since 948 was 948, checked in by srkline, 8 years ago

Correcting the search in the patch panel for certain cases where multiple run numbers could be returned if they matched the year.

Adding routines and preferences to be able to add together raw data files with different attenuation. Not sure why this was not possible in the past. There must be a good reason for this. This is toggled on/off with a SANS preference checkbox. Default is OFF

Adding to Transmission "guessing" to show buttons to bump the guess to one more or one fewer character, rather than forcing an exit if the match is not correct.

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