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

Last change on this file since 1078 was 1078, checked in by srkline, 5 years ago

more utilities and bug fixes to handle:
(1) generation of DIV files
(2) generation and loading of slit-smeared VSANS data sets

Loading of VSANS data sets and generating the resolution smearing matrix required adding a conditional compile statement to the PlotUtilsMacro? file, to distinguish VSANS data - crudely done now by checking to see that VSANS is defined (which will NOT be the case for a "normal" Analysis experiment. This will need to be revisited in the future.

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