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

Last change on this file since 1039 was 1039, checked in by srkline, 6 years ago

changes to incorporate trimming and plotting of data that has been saved as individual detector I(q), as Igor .itx format. This allows the trimming parameters to be set for each detector panel, which can then be used during the reduction protocol to automatically trim and combine the panels. Next step is to incorporate this into the actual protocol definintion by expanding the current definition.

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