source: sans/Dev/trunk/NCNR_User_Procedures/Reduction/VSANS/V_Protocol_Reduction.ipf @ 1248

Last change on this file since 1248 was 1247, checked in by srkline, 3 years ago

more changes to panel scaling so that they are viewed properly on a small-screen laptop

File size: 108.5 KB
Line 
1#pragma TextEncoding = "MacRoman"
2#pragma rtGlobals=1             // Use modern global access method.
3#pragma version=5.0
4#pragma IgorVersion = 7.00
5
6//************************
7
8//
9//*************************
10//////////////////////////////////
11//
12//              KEYWORD=<value> lists used in protocol definitions
13//
14//              KEYWORDS are ALWAYS capitalized, and yes, it does matter
15//
16//              for ABSOLUTE parameters
17//              (4) possible keywords, all with numerical values
18//              TSTAND=value            transmission of the standard
19//              DSTAND=value            thickness of the standard, in centimeters
20//              IZERO=value             I(q=0) value for the standard, in normalized neutron counts
21//              XSECT=value             calibrated cross-section of the standard sample
22//
23//              For calibration with a transmission file, set TSTAND, DSTAND, and XSECT to 1.0
24//              and set IZERO to KAPPA (defined in Tania's handout, or in documentation of MRED_KAP on VAX)
25//
26//
27//              For AVERAGE and for DRAWING
28//                      DRAWING routines only use a subset of the total list, since saving, naming, etc. don't apply
29//              (10) possible keywords, some numerical, some string values
30//              AVTYPE=string           string from set {Circular,Annular,Rectangular,Sector,2D_ASCII,QxQy_ASCII,PNG_Graphic;Sector_PlusMinus;}
31//              PHI=value                       azimuthal angle (-90,90)
32//              DPHI=value                      +/- angular range around phi for average
33//              WIDTH=value             total width of rectangular section, in pixels
34//              SIDE=string             string from set {left,right,both} **note NOT capitalized
35
36//              QCENTER=value           q-value (1/A) of center of annulus for annular average
37//              QDELTA=value            (+/-) width of annulus centered at QCENTER, in units of q
38//              DETGROUP=value  string with "F" or "M" to name the detector group where the annulus lies.
39
40//              PLOT=string             string from set {Yes,No} = truth of generating plot of averaged data
41//              SAVE=string             string from set {Yes,No} = truth of saving averaged data to disk, now with "Concatenate"  or "Individual"
42//              NAME=string             string from set {Auto,Manual} = Automatic name generation or Manual(dialog)
43//
44//
45//    BINTYPE=string (VSANS binning type) "One;Two;Four;Slit Mode;", as defined by ksBinTypeStr
46//
47//
48//              For work.DRK usage:
49//              **the list is COMMA delimited, separator is =
50//              DRK=none,DRKMODE=0,
51//              DRK=name                        is the name of the file, must be a full name, expected to be raw data
52//              DRKMODE=value           is a numeric value (0 or 10 to add to the Correct(mode) switch (unused?)
53//
54//////////////////////////////////
55
56
57//main entry procedure for initialzing and displaying the protocol panel
58// initilaizes folders and globals as needed
59//
60Proc V_ReductionProtocolPanel()
61        DoWindow/F V_ProtocolPanel
62        if(V_flag==0)
63                V_InitProtocolPanel()
64                V_ProtocolPanel()
65        Endif
66End
67
68//initialization procedure for the protocol panel
69//note that :gAbsStr is also shared (common global) to that used in
70//the questionnare form of the protcol (see protocol.ipf)
71//
72Proc V_InitProtocolPanel()
73
74        if(exists("     root:Packages:NIST:VSANS:CatVSHeaderInfo:Filenames") == 0)
75                Abort "You must generate a file catalog before building protocols"
76        endif
77       
78        //set up the global variables needed for the protocol panel
79        //global strings to put in a temporary protocol textwave
80        Variable ii=0
81        String waveStr="tempProtocol"
82        SetDataFolder root:Packages:NIST:VSANS:Globals:Protocols
83        Make/O/T/N=(kNumProtocolSteps) $"root:Packages:NIST:VSANS:Globals:Protocols:tempProtocol" = ""
84
85        String/G root:Packages:NIST:VSANS:Globals:Protocols:gSAM="ask"
86        String/G root:Packages:NIST:VSANS:Globals:Protocols:gBGD="ask"
87        String/G root:Packages:NIST:VSANS:Globals:Protocols:gEMP="ask"
88        String/G root:Packages:NIST:VSANS:Globals:Protocols:gDIV="ask"
89        String/G root:Packages:NIST:VSANS:Globals:Protocols:gMASK="ask"
90        String/G root:Packages:NIST:VSANS:Globals:Protocols:gAbsStr="ask"
91        String/G root:Packages:NIST:VSANS:Globals:Protocols:gAVE="AVTYPE=Circular;SAVE=Yes - Concatenate;NAME=Auto;PLOT=No;BINTYPE=F4-M4-B;"
92        String/G root:Packages:NIST:VSANS:Globals:Protocols:gDRK="DRK=none,DRKMODE=0,"
93       
94        // global strings for trimming data are initialized in the main VSANS initilization
95        //  in case the trimming is done before the protocol panel is opened
96       
97        SetDataFolder root:
98       
99End
100
101
102//button procedure to reset the panel seletctions/checks...etc...
103//to reflect the choices in a previously saved protocol
104// - parses through the protocol and resets the appropriate global strings and
105//updates the panel display
106//
107Function V_RecallProtocolButton(ctrlName) : ButtonControl
108        String ctrlName
109
110        //will reset panel values based on a previously saved protocol
111        //pick a protocol wave from the Protocols folder
112        //MUST move to Protocols folder to get wavelist
113        SetDataFolder root:Packages:NIST:VSANS:Globals:Protocols
114        Execute "V_PickAProtocol()"
115       
116        //get the selected protocol wave choice through a global string variable
117        SVAR protocolName = root:Packages:NIST:VSANS:Globals:Protocols:gProtoStr
118
119        //If "CreateNew" was selected, ask user to try again
120        if(cmpstr("CreateNew",protocolName) == 0)
121                Abort "CreateNew is for making a new Protocol. Select a previously saved Protocol"
122        Endif
123       
124        //reset the panel based on the protocol textwave (currently a string)
125        V_ResetToSavedProtocol(protocolName)
126       
127        SetDataFolder root:
128        return(0)
129End
130
131//deletes the selected protocol from the list and from memory
132//
133Function V_DeleteProtocolButton(ctrlName) : ButtonControl
134        String ctrlName
135
136        //put up a list of protocols and pick one
137        SetDataFolder root:Packages:NIST:VSANS:Globals:Protocols
138//      Execute "DeleteAProtocol()"
139        String Protocol=""
140        Prompt Protocol "Delete A Protocol",popup, V_DeletableProtocols()
141        DoPrompt "Select protocol to delete",protocol
142        If(V_flag==1)
143                return(0)
144        endif
145
146        //If "CreateNew, Base, DoAll, or tempProtocol" was selected, do nothing
147        strswitch(protocol)
148                case "CreateNew":
149                        break
150                case "DoAll":
151                        break
152                case "Base":
153                        break
154                case "tempProtocol":
155                        break
156                default:
157                        //delete the protocol
158                        KillWaves/Z $protocol
159        endswitch
160       
161        SetDataFolder root:
162        return(0)
163End
164
165//
166//function that actually parses the protocol specified by nameStr
167//which is just the name of the wave, without a datafolder path
168//
169// TODO
170//  -- update this for 12 steps
171//
172Function V_ResetToSavedProtocol(nameStr)
173        String nameStr
174       
175        //allow special cases of Base and DoAll Protocols to be recalled to panel - since they "ask"
176        //and don't need paths
177       
178        String catPathStr
179        PathInfo catPathName
180        catPathStr=S_path
181       
182        //SetDataFolder root:Packages:NIST:VSANS:Globals:Protocols              //on windows, data folder seems to get reset (erratically) to root:
183        Wave/T w=$("root:Packages:NIST:VSANS:Globals:Protocols:" + nameStr)
184       
185        String fullPath="",comma=",",list="",nameList="",PathStr="",item=""
186        Variable ii=0,numItems,checked,specialProtocol
187       
188        if((cmpstr(nameStr,"Base")==0) || (cmpstr(nameStr,"DoAll")==0))
189                specialProtocol = 1
190        else
191                specialProtocol = 0
192        Endif
193       
194        //background
195        checked = 1
196        nameList = w[0]
197        If(cmpstr(nameList,"none") ==0)
198                checked = 0
199        Endif
200
201        //set the global string to display and checkbox
202        String/G root:Packages:NIST:VSANS:Globals:Protocols:gBGD = nameList
203        CheckBox prot_check win=V_ProtocolPanel,value=checked
204       
205        //empty
206        checked = 1
207        nameList = w[1]
208        If(cmpstr(nameList,"none") ==0)
209                checked = 0
210        Endif
211
212        //set the global string to display and checkbox
213        String/G root:Packages:NIST:VSANS:Globals:Protocols:gEMP = nameList
214        CheckBox prot_check_1 win=V_ProtocolPanel,value=checked
215       
216        //DIV file
217        checked = 1
218        nameList = w[2]
219        If(cmpstr(nameList,"none") ==0)
220                checked = 0
221        Endif
222
223        //set the global string to display and checkbox
224        String/G root:Packages:NIST:VSANS:Globals:Protocols:gDIV = nameList
225        CheckBox prot_check_2 win=V_ProtocolPanel,value=checked
226       
227        //Mask file
228        checked = 1
229        nameList = w[3]
230        If(cmpstr(nameList,"none") ==0)
231                checked = 0
232        Endif
233
234        //set the global string to display and checkbox
235        String/G root:Packages:NIST:VSANS:Globals:Protocols:gMASK = nameList
236        CheckBox prot_check_3 win=V_ProtocolPanel,value=checked
237       
238        //4 = abs parameters
239        list = w[4]
240        numItems = ItemsInList(list,";")
241        checked = 1
242//      if(numitems == 4 || numitems == 5)              //allow for protocols with no SDEV list item
243        if(numitems > 1)                //
244                //correct number of parameters, assume ok
245                String/G root:Packages:NIST:VSANS:Globals:Protocols:gAbsStr = list
246                CheckBox prot_check_9 win=V_ProtocolPanel,value=checked
247        else
248                item = StringFromList(0,list,";")
249                if(cmpstr(item,"none")==0)
250                        checked = 0
251                        list = "none"
252                        String/G root:Packages:NIST:VSANS:Globals:Protocols:gAbsStr = list
253                        CheckBox prot_check_9 win=V_ProtocolPanel,value=checked
254                else
255                        //force to "ask"
256                        checked = 1
257                        String/G root:Packages:NIST:VSANS:Globals:Protocols:gAbsStr = "ask"
258                        CheckBox prot_check_9 win=V_ProtocolPanel,value=checked
259                Endif
260        Endif
261       
262        //5 = averaging choices
263        list = w[5]
264        item = StringByKey("AVTYPE",list,"=",";")
265        if(cmpstr(item,"none") == 0)
266                checked = 0
267                String/G root:Packages:NIST:VSANS:Globals:Protocols:gAVE = "none"
268                CheckBox prot_check_5 win=V_ProtocolPanel,value=checked
269        else
270                checked = 1
271                String/G root:Packages:NIST:VSANS:Globals:Protocols:gAVE = list
272                CheckBox prot_check_5 win=V_ProtocolPanel,value=checked
273        Endif
274       
275//      //6 = DRK choice
276//      list = w[6]
277//      item = StringByKey("DRK",list,"=",",")
278//      //print list,item
279//      if(cmpstr(item,"none") == 0)
280//              checked = 0
281//              String/G root:Packages:NIST:VSANS:Globals:Protocols:gDRK = list
282//              CheckBox prot_check_6 win=V_ProtocolPanel,value=checked
283//      else
284//              checked = 1
285//              String/G root:Packages:NIST:VSANS:Globals:Protocols:gDRK = list
286//              CheckBox prot_check_6 win=V_ProtocolPanel,value=checked
287//      Endif
288       
289        //7 = beginning trim points
290        SVAR gBegPtsStr=root:Packages:NIST:VSANS:Globals:Protocols:gBegPtsStr
291        gBegPtsStr = w[7]
292        //8 = end trim points
293        SVAR gEndPtsStr=root:Packages:NIST:VSANS:Globals:Protocols:gEndPtsStr
294        gEndPtsStr = w[8]
295       
296        //9 = unused
297        //10 = unused
298        //11 = unused
299
300
301        //all has been reset, get out
302        Return (0)
303End
304
305//button action procedure that simply closes the panel
306//
307Function V_DoneProtocolButton(ctrlName) : ButtonControl
308        String ctrlName
309
310        //will gracefully close and exit the protocol panel
311       
312        DoWindow/K V_ProtocolPanel
313End
314
315//button action procedure that saves the current choices on the panel
316//as a named protocol, for later recall
317//asks for a valid name, then creates a protocol from the panel choices
318//creates a wave, and sets the current protocol name to this new protocol
319//
320//now allows the user the choice to overwrite a protocol
321//
322Function V_SaveProtocolButton(ctrlName) : ButtonControl
323        String ctrlName
324
325        Variable notDone=1, newProto=1
326        //will prompt for protocol name, and save the protocol as a text wave
327        //prompt for name of new protocol wave to save
328        do
329                Execute "V_AskForName()"
330                SVAR newProtocol = root:Packages:NIST:VSANS:Globals:Protocols:gNewStr
331               
332                //make sure it's a valid IGOR name
333                newProtocol = CleanupName(newProtocol,0)        //strict naming convention
334                String/G root:Packages:NIST:VSANS:Globals:Protocols:gNewStr=newProtocol         //reassign, if changed
335                Print "newProtocol = ",newProtocol
336               
337                SetDataFolder root:Packages:NIST:VSANS:Globals:Protocols
338                if(WaveExists( $("root:Packages:NIST:VSANS:Globals:Protocols:" + newProtocol) ) == 1)
339                        //wave already exists
340                        DoAlert 1,"That name is already in use. Do you wish to overwrite the existing protocol?"
341                        if(V_Flag==1)
342                                notDone = 0
343                                newProto = 0
344                        else
345                                notDone = 1
346                        endif
347                else
348                        //name is good
349                        notDone = 0
350                Endif
351        while(notDone)
352       
353        //current data folder is  root:Packages:NIST:VSANS:Globals:Protocols
354        if(newProto)
355                Make/O/T/N=(kNumProtocolSteps) $("root:Packages:NIST:VSANS:Globals:Protocols:" + newProtocol)
356        Endif
357       
358        Variable err
359        err = V_MakeProtocolFromPanel( $("root:Packages:NIST:VSANS:Globals:Protocols:" + newProtocol) )
360        if(err)
361                DoAlert 0,"BGD and EMP files do not have the same configuration. No protocol saved."
362                KillWaves/Z $("root:Packages:NIST:VSANS:Globals:Protocols:" + newProtocol)
363        else
364                String/G  root:Packages:NIST:VSANS:Globals:Protocols:gProtoStr = newProtocol
365        endif
366        //the data folder WAS changed above, this must be reset to root:
367        SetDatafolder root:
368End
369
370//function that does the guts of reading the panel controls and globals
371//to create the necessary text fields for a protocol
372//Wave/T w (input) is an empty text wave of 8 elements for the protocol
373//on output, w[] is filled with the protocol strings as needed from the panel
374//
375// TODO
376// -- update for 12 points
377//
378// returns error==1 if files (emp, bgd) are not of the same configuration
379//
380Function V_MakeProtocolFromPanel(w)
381        Wave/T w
382       
383        //construct the protocol text wave form the panel
384        //it is to be parsed by ExecuteProtocol() for the actual data reduction
385        PathInfo catPathName                    //this is where the files came from
386        String pathstr=S_path,tempStr,curList
387        Variable checked,ii,numItems
388       
389        //look for checkbox, then take each item in list and prepend the path
390        //w[0] = background
391        ControlInfo/W=V_ProtocolPanel prot_check
392        checked = V_value
393        if(checked)
394                //build the list
395                //just read the global
396                SVAR str=root:Packages:NIST:VSANS:Globals:Protocols:gBGD
397                if(cmpstr(str,"ask")==0)
398                        w[0] = str              //just ask
399                else
400                        tempstr = V_ParseRunNumberList(str)
401                        if(strlen(tempStr)==0)
402                                return(1)                               //error parsing list
403                        else
404                                w[0] = tempstr
405                                str = tempstr           //set the protocol and the global
406                        endif
407                endif
408        else
409                //none used - set textwave (and global?)
410                w[0] = "none"
411                String/G root:Packages:NIST:VSANS:Globals:Protocols:gBGD = "none"
412        endif
413       
414        //w[1] = empty
415        ControlInfo/W=V_ProtocolPanel prot_check_1
416        checked = V_value
417        if(checked)
418                //build the list
419                //just read the global
420                SVAR str=root:Packages:NIST:VSANS:Globals:Protocols:gEMP
421                if(cmpstr(str,"ask")==0)
422                        w[1] = str
423                else
424                        tempstr = V_ParseRunNumberList(str)
425                        if(strlen(tempStr)==0)
426                                return(1)
427                        else
428                                w[1] = tempstr
429                                str=tempStr
430                        endif
431                endif
432        else
433                //none used - set textwave (and global?)
434                w[1] = "none"
435                String/G root:Packages:NIST:VSANS:Globals:Protocols:gEMP = "none"
436        endif
437       
438        //w[2] = div file
439        ControlInfo/W=V_ProtocolPanel prot_check_2
440        checked = V_value
441        if(checked)
442                //build the list
443                //just read the global
444                SVAR str=root:Packages:NIST:VSANS:Globals:Protocols:gDIV
445                if(cmpstr(str,"ask")==0)
446                        w[2] = str
447                else
448//                      Print itemsinlist(str,",")
449                        tempStr = StringFromList(0,str,",")
450//                      tempStr = V_ParseRunNumberList(str)
451                        if(strlen(tempStr)==0)
452                                return(1)
453                        else
454                                w[2] = tempstr
455                                str=tempstr
456                        endif
457                endif
458        else
459                //none used - set textwave (and global?)
460                w[2] = "none"
461                String/G root:Packages:NIST:VSANS:Globals:Protocols:gDIV = "none"
462        endif
463       
464        //w[3] = mask file
465        ControlInfo/W=V_ProtocolPanel prot_check_3
466        checked = V_value
467        if(checked)
468                //build the list
469                //just read the global
470                SVAR str=root:Packages:NIST:VSANS:Globals:Protocols:gMASK
471                if(cmpstr(str,"ask")==0)
472                        w[3] = str
473                else
474                        tempStr = StringFromList(0,str,",")
475//                      tempstr = V_ParseRunNumberList(str)
476                        if(strlen(tempstr)==0)
477                                return(1)
478                        else
479                                w[3] = tempstr
480                                str = tempstr
481                        endif
482                endif
483        else
484                //none used - set textwave (and global?)
485                w[3] = "none"
486                String/G root:Packages:NIST:VSANS:Globals:Protocols:gMASK = "none"
487        endif
488       
489        //w[4] = abs parameters
490        ControlInfo/W=V_ProtocolPanel prot_check_9
491        checked = V_value
492        if(checked)
493                //build the list
494                //just read the global
495                SVAR str=root:Packages:NIST:VSANS:Globals:Protocols:gAbsStr
496                w[4] = str
497        else
498                //none used - set textwave (and global?)
499                w[4] = "none"
500                String/G root:Packages:NIST:VSANS:Globals:Protocols:gAbsStr = "none"
501        endif
502       
503        //w[5] = averaging choices
504        ControlInfo/W=V_ProtocolPanel prot_check_5                      //do the average?
505        checked = V_value
506        if(checked)
507                //just read the global
508                SVAR avestr=root:Packages:NIST:VSANS:Globals:Protocols:gAVE
509                w[5] = avestr
510        else
511                //none used - set textwave
512                w[5] = "AVTYPE=none;"
513        endif
514       
515        //w[6]
516        //work.DRK information
517        SVAR drkStr=root:Packages:NIST:VSANS:Globals:Protocols:gDRK
518        w[6] = drkStr
519       
520        //w[7]
521        // beginning trim points
522        // if null, then write out the default trim string to the protocol so that it will be used if recalled
523        SVAR gBegPtsStr=root:Packages:NIST:VSANS:Globals:Protocols:gBegPtsStr
524        if(strlen(gBegPtsStr)==0)
525                w[7] = ksBinTrimBegDefault
526        else
527                w[7] = gBegPtsStr
528        endif
529       
530        //w[8]
531        // End trim points
532        // if null, then write out the default trim string to the protocol so that it will be used if recalled
533        SVAR gEndPtsStr=root:Packages:NIST:VSANS:Globals:Protocols:gEndPtsStr   
534        if(strlen(gEndPtsStr)==0)
535                w[8] = ksBinTrimEndDefault
536        else
537                w[8] = gEndPtsStr
538        endif
539
540        //w[9]
541        //collimation type (filled in at averaging?)
542        w[9] = ""
543        //w[10]
544        //currently unused
545        w[10] = ""
546        //w[11]
547        //currently unused
548        w[11] = ""
549
550
551//      check that w[0](BGD) and w[1](EMP) are from matching configurations
552        if(cmpstr(w[0],"none")==0 || cmpstr(w[0],"ask")==0)
553                // no file specified for BGD, so no issues
554                return(0)
555        endif
556        if(cmpstr(w[1],"none")==0 || cmpstr(w[1],"ask")==0)
557                // no file specified for EMP, so no issues
558                return(0)
559        endif
560        Variable matchOK
561        // returns 1 for match , 0 if no match
562        matchOK = V_RawFilesMatchConfig(StringFromList(0, w[0], ","),StringFromList(0, w[1], ","))
563       
564        return(!matchOK)
565End
566
567
568//
569Function V_PickSAMButton(ctrlName) : ButtonControl
570        String ctrlName
571
572
573End
574
575
576
577
578//
579// TODO
580// -- identifying "intent" using V_get can be very slow, since it reads in each and every data file.
581//   grep is a lot faster, but there can be a lot of false "hits" unless I do it correctly.
582//
583//
584//      //grep through what text I can find in the VAX binary
585//      // Grep Note: the \\b sequences limit matches to a word boundary before and after
586//      // "boondoggle", so "boondoggles" and "aboondoggle" won't match.
587//      if(gRadioVal == 2)
588//              for(ii=0;ii<num;ii+=1)
589//                      item=StringFromList(ii, newList , ";")
590////                    Grep/P=catPathName/Q/E=("(?i)\\b"+match+"\\b") item
591//                      Grep/P=catPathName/Q/E=("(?i)"+match) item
592//                      if( V_value )   // at least one instance was found
593////                            Print "found ", item,ii
594//                              list += item + ";"
595//                      endif
596//              endfor
597//
598//              newList = list
599//      endif
600
601// match is the string to look for in the search
602// 0 is a flag to tell it to look in the file catalog (the fastest method)
603// Other options are to grep, or to read the intent field in every file
604Function/S V_GetSAMList()
605
606//      String match="SAMPLE"
607//      String list = V_getFileIntentList(match,0)
608
609        String intent = "SAMPLE"
610        String purpose = "SCATTERING"
611        String list = V_getFileIntentPurposeList(intent,purpose,0)
612
613//      Printf "SAM files = %s\r",list 
614        return(list)
615end
616
617
618Function/S V_GetBGDList()
619
620        String intent="BLOCKED BEAM"
621        String purpose="SCATTERING"
622//      String list = V_getFileIntentList(match,0)
623        String list = V_getFileIntentPurposeList(intent,purpose,0)
624       
625//      Printf "BGD files = %s\r",list 
626        return(list)
627end
628
629//
630// V_getFileIntentPurposeList(intent,purpose,method)
631Function/S V_GetEMPList()
632
633        String intent="EMPTY CELL"
634        String purpose="SCATTERING"
635//      String list = V_getFileIntentList(match,0)
636        String list = V_getFileIntentPurposeList(intent,purpose,0)
637
638
639//      Printf "EMP files = %s\r",list 
640        return(list)
641end
642
643
644//
645// TODO
646// -- decide on the way to locate the blocked beam files. Is the enumerated text of the intent
647//    sufficiently unique to locate the file?
648// -- can I use the Data Catalog waves to locate the files  - faster?
649//    (fails if the catalog has not been read in recently enough)
650//
651//
652Function/S V_PickBGDButton(ctrlName) : ButtonControl
653        String ctrlName
654
655        String list="",item="",fname,newList,intent
656        Variable ii,num
657       
658        PathInfo catPathName
659        String path = S_path
660
661        String match="BLOCKED BEAM"
662
663//v_tic()
664// get the list from the file catalog (=0.0007s)
665//     
666        WAVE/T fileNameW = root:Packages:NIST:VSANS:CatVSHeaderInfo:Filenames
667        WAVE/T intentW = root:Packages:NIST:VSANS:CatVSHeaderInfo:Intent
668       
669        Variable np = numpnts(intentW)
670        for(ii=0;ii<np;ii+=1)
671                if(cmpstr(intentW[ii],match)==0)
672                        list += fileNameW[ii] + ";"
673                endif           
674        endfor
675       
676        List = SortList(List,";",0)
677        Printf "BGD files = %s\r",list 
678//v_toc()       
679       
680       
681////v_tic()                     // from grep = 3.3s
682//      newList = V_GetRawDataFileList()
683//      num=ItemsInList(newList)
684//     
685////    for(ii=0;ii<num;ii+=1)
686////            item=StringFromList(ii, newList , ";")
687////            fname = path + item
688////            intent = V_getReduction_intent(fname)
689////            if(cmpstr(intent,"BLOCKED BEAM") == 0)
690////                    list += item + ";"
691////            endif
692////
693////    endfor
694//      list = ""       
695//      for(ii=0;ii<num;ii+=1)
696//              item=StringFromList(ii, newList , ";")
697//              Grep/P=catPathName/Q/E=("(?i)"+match) item
698//              if( V_value )   // at least one instance was found
699////                            Print "found ", item,ii
700//                      list += item + ";"
701//              endif
702//      endfor
703//             
704//             
705//      List = SortList(List,";",0)
706//      Printf "BGD files = %s\r",list
707////v_toc()
708       
709        return(list)
710End
711
712
713//
714Function/S V_PickEMPButton(ctrlName) : ButtonControl
715        String ctrlName
716        String list="",item="",fname,newList,intent
717        Variable ii,num
718       
719        PathInfo catPathName
720        String path = S_path
721
722        String match="EMPTY CELL"
723
724// get the list from the file catalog (=0.0007s)
725//     
726        WAVE/T fileNameW = root:Packages:NIST:VSANS:CatVSHeaderInfo:Filenames
727        WAVE/T intentW = root:Packages:NIST:VSANS:CatVSHeaderInfo:Intent
728       
729        Variable np = numpnts(intentW)
730        for(ii=0;ii<np;ii+=1)
731                if(cmpstr(intentW[ii],match)==0)
732                        list += fileNameW[ii] + ";"
733                endif           
734        endfor
735       
736        List = SortList(List,";",0)
737        Printf "EMP files = %s\r",list 
738
739
740//     
741//      newList = V_GetRawDataFileList()
742//      num=ItemsInList(newList)
743//     
744////    for(ii=0;ii<num;ii+=1)
745////            item=StringFromList(ii, newList , ";")
746////            fname = path + item
747////            intent = V_getReduction_intent(fname)
748////            if(cmpstr(intent,"EMPTY CELL") == 0)
749////                    list += item + ";"
750////            endif
751////
752////    endfor
753//
754//      for(ii=0;ii<num;ii+=1)
755//              item=StringFromList(ii, newList , ";")
756//              Grep/P=catPathName/Q/E=("(?i)"+match) item
757//              if( V_value )   // at least one instance was found
758////                            Print "found ", item,ii
759//                      list += item + ";"
760//              endif
761//
762//      endfor
763//             
764//      List = SortList(List,";",0)
765//      Printf "EMP files = %s\r",list
766       
767        return(list)
768End
769
770
771//
772Function/S V_PickEMPBeamButton(ctrlName) : ButtonControl
773        String ctrlName
774        String list="",item="",fname,newList,intent
775        Variable ii,num
776       
777        PathInfo catPathName
778        String path = S_path
779
780        String match="OPEN BEAM"
781
782// get the list from the file catalog (=0.0007s)
783//     
784        WAVE/T fileNameW = root:Packages:NIST:VSANS:CatVSHeaderInfo:Filenames
785        WAVE/T intentW = root:Packages:NIST:VSANS:CatVSHeaderInfo:Intent
786       
787        Variable np = numpnts(intentW)
788        for(ii=0;ii<np;ii+=1)
789                if(cmpstr(intentW[ii],match)==0)
790                        list += fileNameW[ii] + ";"
791                endif           
792        endfor
793       
794        List = SortList(List,";",0)
795        Printf "EMP Beam files = %s\r",list     
796
797
798       
799        return(list)
800End
801
802
803// TODO
804// -- find proper way to search for these files
805// -- they *may* be written to the file header(reduction block)
806// -- or grep for VSANS_DIV (in the title)
807Function/S V_GetDIVList()
808
809        String list="",item="",fname,newList,intent
810        Variable ii,num,val
811       
812        PathInfo catPathName
813        String path = S_path
814       
815        newList = V_Get_NotRawDataFileList()
816//      newList = V_RemoveEXTFromList(newlist,"hst")            // remove the event files
817//      newList = V_RemoveEXTFromList(newlist,"ave")            // remove the ave files
818//      newList = V_RemoveEXTFromList(newlist,"abs")            // remove the abs files
819//      newList = V_RemoveEXTFromList(newlist,"phi")            // remove the phi files
820//      newList = V_RemoveEXTFromList(newlist,"pxp")            // remove the pxp files
821//      newList = V_RemoveEXTFromList(newlist,"DS_Store")               // remove the DS_Store file (OSX only)
822
823        num=ItemsInList(newList)
824       
825// keep only DIV files in the list
826        num=ItemsInList(newList)
827
828        String matchStr="*DIV*"         // this is part of the title of a VSANS _DIV_ file
829        for(ii=0;ii<num;ii+=1)
830                item=StringFromList(ii, newList , ";")
831                val = stringmatch(item,matchStr)
832                if( val )       // true if the string did match
833                                list += item + ";"
834                endif
835
836        endfor
837
838        List = SortList(List,";",0)
839
840//
841//      String match="DIV"
842//      for(ii=0;ii<num;ii+=1)
843//              item=StringFromList(ii, newList , ";")
844//              Grep/P=catPathName/Q/E=("(?i)\\b"+match+"\\b") item
845////            Grep/P=catPathName/Q/E=("(?i)"+match) item
846//              if( V_value )   // at least one instance was found
847////                            Print "found ", item,ii
848////                    if(strsearch(item,"pxp",0,2) == -1)             //does NOT contain .pxp (the current experiment will be a match)
849//                              list += item + ";"
850////                    endif
851//              endif
852//      endfor
853//             
854
855        return(list)
856end
857
858
859Function/S V_GetMSKList()
860
861        String list="",item="",fname,newList,intent
862        Variable ii,num,val
863       
864        PathInfo catPathName
865        String path = S_path
866       
867        newList = V_Get_NotRawDataFileList()
868//      newList = V_RemoveEXTFromList(newlist,"hst")            // remove the event files
869//      newList = V_RemoveEXTFromList(newlist,"ave")            // remove the ave files
870//      newList = V_RemoveEXTFromList(newlist,"abs")            // remove the abs files
871//      newList = V_RemoveEXTFromList(newlist,"phi")            // remove the phi files
872//      newList = V_RemoveEXTFromList(newlist,"pxp")            // remove the pxp files
873//      newList = V_RemoveEXTFromList(newlist,"png")            // remove the png files
874//      newList = V_RemoveEXTFromList(newlist,"jpg")            // remove the jpg files
875//      newList = V_RemoveEXTFromList(newlist,"DS_Store")               // remove the DS_Store file (OSX only)
876
877// keep only MASK files in the list
878        num=ItemsInList(newList)
879
880        String matchStr="*MASK*"                // this is part of the title of a VSANS _MASK_ file
881        for(ii=0;ii<num;ii+=1)
882                item=StringFromList(ii, newList , ";")
883                val = stringmatch(item,matchStr)
884                if( val )       // true if the string did match
885                                list += item + ";"
886                endif
887
888        endfor
889               
890        List = SortList(List,";",0)
891       
892
893//
894////    String match="MASK"             // this is part of the title of a VSANS MASK file
895//      String match="VSANS_MASK"               // this is part of the title of a VSANS MASK file
896//      for(ii=0;ii<num;ii+=1)
897//              item=StringFromList(ii, newList , ";")
898//              Grep/P=catPathName/Q/E=("(?i)\\b"+match+"\\b") item
899////            Grep/P=catPathName/Q/E=("(?i)"+match) item
900//              if( V_value )   // at least one instance was found
901////                            Print "found ", item,ii
902////                    if(strsearch(item,"pxp",0,2) == -1)             //does NOT contain .pxp (the current experiment will be a match)
903//                              list += item + ";"
904////                    endif
905//              endif
906//
907//      endfor
908//             
909
910
911        List = SortList(List,";",0)
912
913        return(list)
914end
915
916
917//
918// TODO
919// -- find proper way to search for these files
920// -- they *may* be written to the file header(reduction block)
921// -- or grep for VSANS_MASK (in the title)
922Function/S V_PickMASKButton(ctrlName) : ButtonControl
923        String ctrlName
924        String list="",item="",fname,newList,intent
925        Variable ii,num
926       
927        PathInfo catPathName
928        String path = S_path
929       
930        newList = V_Get_NotRawDataFileList()
931        newList = V_RemoveEXTFromList(newlist,"hst")            // remove the event files
932        num=ItemsInList(newList)
933       
934//      for(ii=0;ii<num;ii+=1)
935//              item=StringFromList(ii, newList , ";")
936//              fname = path + item
937//              intent = V_getReduction_intent(fname)
938//              if(cmpstr(intent,"MASK") == 0)
939//                      list += item + ";"
940//              endif
941//
942//      endfor
943
944        String match="MASK"
945        for(ii=0;ii<num;ii+=1)
946                item=StringFromList(ii, newList , ";")
947                Grep/P=catPathName/Q/E=("(?i)\\b"+match+"\\b") item
948//              Grep/P=catPathName/Q/E=("(?i)"+match) item
949                if( V_value )   // at least one instance was found
950//                              Print "found ", item,ii
951                        list += item + ";"
952                endif
953
954        endfor
955               
956        List = SortList(List,";",0)
957        Printf "MASK files = %s\r",list
958       
959        return(list)   
960
961       
962End
963
964//button action function to reduce one file with the information specified on
965//the panel
966//a temporary protocol is created, even if the fields correspond to a named protocol
967//(only the protocol wave values are written to the data header, but the name is written to the
968//schematic - this could cause some unwanted confusion)
969//
970//if a sample file(s) is selected, only that file(s) will be reduced
971//if no file is selected, the user will be prompted with a standard open
972//dialog to select sample data file(s)
973//
974Function V_ReduceOneButton(ctrlName) : ButtonControl
975        String ctrlName
976
977        //parse the information on the panel and assign to tempProtocol wave (in protocol folder)
978        //and execute
979        String temp="root:Packages:NIST:VSANS:Globals:Protocols:tempProtocol"
980        Wave/T w=$temp
981        Variable ii=0,num=12,err
982        do
983                w[ii] = ""
984                ii+=1
985        while(ii<num)
986       
987       
988        err = V_MakeProtocolFromPanel(w)
989        if(err)
990                DoAlert 0,"BGD and EMP files do not have the same configuration."
991                return(0)
992        endif
993       
994        //the "current" protocol is the "tempProtocol" that was parsed from the panel input
995        //set the global, so that the data writing routine can find the protocol wave (fatal otherwise)
996        String/G root:Packages:NIST:VSANS:Globals:Protocols:gProtoStr="tempProtocol"
997       
998        PathInfo catPathName                    //this is where the files came from
999        String pathstr=S_path,samStr
1000       
1001        //take the string from the panel
1002        SVAR tempStr = root:Packages:NIST:VSANS:Globals:Protocols:gSAM
1003       
1004        if( (strlen(tempStr) == 0) || (cmpstr(tempStr,"ask")==0) )
1005                //let user select the files
1006                tempStr="ask"
1007                V_ExecuteProtocol(temp,tempStr)
1008                return(0)
1009        Else
1010                //parse the list of numbers
1011                //send only the filenames, without paths
1012                samStr = V_ParseRunNumberList(tempStr)
1013                If(strlen(samStr)==0)
1014                        DoAlert 0,"The SAM file number cound not be interpreted. Please enter a valid run number or filename"
1015                        return(1)
1016                endif
1017                tempStr=samStr          //reset the global
1018                V_ExecuteProtocol(temp,samStr)
1019                return(0)
1020        endif
1021End
1022
1023
1024//button action function will prompt user for absolute scaling parameters
1025//either from an empty beam file or by manually entering the 4 required values
1026//uses the same function and shared global string as the questionnare form of reduction
1027//in "protocol.ipf" - the string is root:Packages:NIST:VSANS:Globals:Protocols:gAbsStr
1028//
1029Function V_SetABSParamsButton(ctrlName) : ButtonControl
1030        String ctrlName
1031
1032        //will prompt for a list of ABS parameters (4) through a global string variable
1033        if(cmpstr(ctrlName,"pick_ABS_B") == 0)
1034                Execute "V_AskForAbsoluteParams_Quest(1)"
1035        else
1036                Execute "V_AskForAbsoluteParams_Quest(0)"
1037        endif
1038End
1039
1040
1041
1042//the panel recreation macro
1043//
1044Window V_ProtocolPanel()
1045
1046        Variable sc = 1
1047                       
1048        if(root:Packages:NIST:VSANS:Globals:gLaptopMode == 1)
1049                sc = 0.7
1050        endif
1051
1052        PauseUpdate; Silent 1           // building window...
1053        NewPanel /W=(1180*sc,332*sc,1530*sc,932*sc) /K=1 as "VSANS Reduction Protocol"
1054        ModifyPanel cbRGB=(56589,50441,50159)//, fixedSize=1
1055        SetDrawLayer UserBack
1056        DrawLine 3,65*sc,301*sc,65*sc
1057        DrawLine 3,157*sc,301*sc,157*sc
1058        DrawLine 3,208*sc,301*sc,208*sc
1059        DrawLine 3,257*sc,301*sc,257*sc
1060        DrawLine 3,305*sc,301*sc,305*sc
1061        DrawLine 3,350*sc,301*sc,350*sc
1062        DrawLine 3,445*sc,301*sc,445*sc
1063        DrawLine 3,513*sc,301*sc,513*sc
1064        DrawLine 3,396*sc,301*sc,396*sc
1065
1066//
1067        Button button_help,pos={sc*300,2*sc},size={sc*25,20*sc},proc=V_ShowProtoHelp,title="?"
1068        Button button_help,help={"Show the help file for setting up a reduction protocol"}
1069//      Button button_quest,pos={sc*20,2*sc},size={sc*150,20*sc},proc=V_ProtocolQuestionnaire,title="Questions"
1070//      Button button_quest,help={"Run through the questionnaire for setting up a reduction protocol"}
1071//      Button button_quest,disable=2
1072
1073
1074        PopupMenu popup_sam,pos={sc*85,68*sc},size={sc*51,23*sc},proc=V_SAMFilePopMenuProc
1075        PopupMenu popup_sam,mode=1,value= #"V_getSAMList()"     
1076        PopupMenu popup_bkg,pos={sc*85,164*sc},size={sc*51,23*sc},proc=V_BKGFilePopMenuProc
1077        PopupMenu popup_bkg,mode=1,value= #"V_getBGDList()"
1078        PopupMenu popup_emp,pos={sc*85,213*sc},size={sc*51,23*sc},proc=V_EMPFilePopMenuProc
1079        PopupMenu popup_emp,mode=1,value= #"V_getEMPList()"
1080        PopupMenu popup_div,pos={sc*85,263*sc},size={sc*51,23*sc},proc=V_DIVFilePopMenuProc
1081        PopupMenu popup_div,mode=1,value= #"V_getDIVList()"
1082        PopupMenu popup_msk,pos={sc*85,356*sc},size={sc*51,23*sc},proc=V_MSKFilePopMenuProc
1083        PopupMenu popup_msk,mode=1,value= #"V_getMSKList()"     
1084               
1085               
1086        CheckBox prot_check,pos={sc*6,163*sc},size={sc*74,14*sc},title="Background"
1087        CheckBox prot_check,help={"If checked, the specified background file will be included in the data reduction. If the file name is \"ask\", then the user will be prompted for the file"}
1088        CheckBox prot_check,value= 1
1089        CheckBox prot_check_1,pos={sc*6,215*sc},size={sc*71,14*sc},title="Empty Cell"
1090        CheckBox prot_check_1,help={"If checked, the specified empty cell file will be included in the data reduction. If the file name is \"ask\", then the user will be prompted for the file"}
1091        CheckBox prot_check_1,value= 1
1092        CheckBox prot_check_2,pos={sc*6,263*sc},size={sc*72,14*sc},title="Sensitivity"
1093        CheckBox prot_check_2,help={"If checked, the specified detector sensitivity file will be included in the data reduction. If the file name is \"ask\", then the user will be prompted for the file"}
1094        CheckBox prot_check_2,value= 1
1095        CheckBox prot_check_3,pos={sc*6,356*sc},size={sc*43,14*sc},title="Mask"
1096        CheckBox prot_check_3,help={"If checked, the specified mask file will be included in the data reduction. If the file name is \"ask\", then the user will be prompted for the file"}
1097        CheckBox prot_check_3,value= 1
1098        CheckBox prot_check_4,pos={sc*6,70*sc},size={sc*53,14*sc},title="Sample"
1099        CheckBox prot_check_4,help={"If checked, the specified sample file will be included in the data reduction. If the file name is \"ask\", then the user will be prompted for the file"}
1100        CheckBox prot_check_4,value= 1
1101        CheckBox prot_check_5,pos={sc*6,399*sc},size={sc*56,14*sc},title="Average"
1102        CheckBox prot_check_5,help={"If checked, the specified averaging will be performed at the end of the data reduction."}
1103        CheckBox prot_check_5,value= 1 
1104        CheckBox prot_check_9,pos={sc*6,310*sc},size={sc*59,14*sc},title="Absolute"
1105        CheckBox prot_check_9,help={"If checked, absolute calibration will be included in the data reduction. If the parameter list is \"ask\", then the user will be prompted for absolue parameters"}
1106        CheckBox prot_check_9,value= 1
1107       
1108
1109//      Button pick_sam,pos={sc*214,28*sc},size={sc*70,20*sc},proc=V_PickSAMButton,title="set SAM"
1110//      Button pick_sam,help={"This button will set the file selected in the File Catalog table to be the sample file"}
1111//      Button pick_bgd,pos={sc*214,75*sc},size={sc*70,20*sc},proc=V_PickBGDButton,title="set BGD"
1112//      Button pick_bgd,help={"This button will set the file selected in the File Catalog table to be the background file."}
1113//      Button pick_emp,pos={sc*214,125*sc},size={sc*70,20*sc},proc=V_PickEMPButton,title="set EMP"
1114//      Button pick_emp,help={"This button will set the file selected in the File Catalog table to be the empty cell file."}
1115//      Button pick_DIV,pos={sc*214,173*sc},size={sc*70,20*sc},proc=V_PickDIVButton,title="set DIV"
1116//      Button pick_DIV,help={"This button will set the file selected in the File Catalog table to be the sensitivity file."}
1117        Button pick_ABS,pos={sc*264,308*sc},size={sc*80,20*sc},proc=V_SetABSParamsButton,title="set ABS MF"
1118        Button pick_ABS,help={"This button will prompt the user for absolute scaling parameters"}       
1119       
1120        Button pick_ABS_B,pos={sc*264,330*sc},size={sc*80,20*sc},proc=V_SetABSParamsButton,title="set ABS B"
1121        Button pick_ABS_B,help={"This button will prompt the user for absolute scaling parameters"}     
1122//      Button pick_MASK,pos={sc*214,266*sc},size={sc*70,20*sc},proc=V_PickMASKButton,title="set MASK"
1123//      Button pick_MASK,help={"This button will set the file selected in the File Catalog table to be the mask file."}
1124
1125
1126        Button pick_AVE,pos={sc*188,401*sc},size={sc*150,20*sc},proc=V_SetAverageParamsButtonProc,title="set AVERAGE params"
1127        Button pick_AVE,help={"Prompts the user for the type of 1-D averaging to perform, as well as saving options"}
1128
1129       
1130        Button pick_trim,pos={sc*264,454*sc},size={sc*70,20*sc},proc=V_TrimDataProtoButton,title="Trim"
1131        Button pick_trim,help={"This button will prompt the user for trimming parameters"}     
1132       
1133       
1134        SetVariable samStr,pos={sc*6,90*sc},size={sc*250,15*sc},title="file:"
1135        SetVariable samStr,help={"Filename of the sample file(s) to be used in the data reduction"}
1136        SetVariable samStr,limits={-Inf,Inf,0},value= root:Packages:NIST:VSANS:Globals:Protocols:gSAM           
1137        SetVariable bgdStr,pos={sc*7,186*sc},size={sc*250,15*sc},title="file:"
1138        SetVariable bgdStr,help={"Filename of the background file(s) to be used in the data reduction"}
1139        SetVariable bgdStr,limits={-Inf,Inf,0},value= root:Packages:NIST:VSANS:Globals:Protocols:gBGD
1140        SetVariable empStr,pos={sc*8,236*sc},size={sc*250,15*sc},title="file:"
1141        SetVariable empStr,help={"Filename of the empty cell file(s) to be used in the data reduction"}
1142        SetVariable empStr,limits={-Inf,Inf,0},value= root:Packages:NIST:VSANS:Globals:Protocols:gEMP
1143        SetVariable divStr,pos={sc*9,285*sc},size={sc*250,15*sc},title="file:"
1144        SetVariable divStr,help={"Filename of the detector sensitivity file to be used in the data reduction"}
1145        SetVariable divStr,limits={-Inf,Inf,0},value= root:Packages:NIST:VSANS:Globals:Protocols:gDIV
1146        SetVariable maskStr,pos={sc*9,377*sc},size={sc*250,15*sc},title="file:"
1147        SetVariable maskStr,help={"Filename of the mask file to be used in the data reduction"}
1148        SetVariable maskStr,limits={-Inf,Inf,0},value= root:Packages:NIST:VSANS:Globals:Protocols:gMASK
1149        SetVariable absStr,pos={sc*7,331*sc},size={sc*250,15*sc},title="parameters:"
1150        SetVariable absStr,help={"Keyword-string of values necessary for absolute scaling of data. Remaining parameters are taken from the sample file."}
1151        SetVariable absStr,limits={-Inf,Inf,0},value= root:Packages:NIST:VSANS:Globals:Protocols:gAbsStr
1152        SetVariable aveStr,pos={sc*9,424*sc},size={sc*250,15*sc},title="parameters:"
1153        SetVariable aveStr,help={"Keyword-string of choices used for averaging and saving the 1-D data files"}
1154        SetVariable aveStr,limits={-Inf,Inf,0},value= root:Packages:NIST:VSANS:Globals:Protocols:gAVE
1155
1156        SetVariable begStr,pos={sc*9,464*sc},size={sc*250,15*sc},title="Beg Trim:"
1157        SetVariable begStr,help={"Keyword-string of choices used for averaging and saving the 1-D data files"}
1158        SetVariable begStr,limits={-Inf,Inf,0},value= root:Packages:NIST:VSANS:Globals:Protocols:gBegPtsStr
1159        SetVariable endStr,pos={sc*9,484*sc},size={sc*250,15*sc},title="End Trim:"
1160        SetVariable endStr,help={"Keyword-string of choices used for averaging and saving the 1-D data files"}
1161        SetVariable endStr,limits={-Inf,Inf,0},value= root:Packages:NIST:VSANS:Globals:Protocols:gEndPtsStr
1162
1163
1164       
1165        //only show DRK if user wants to see it
1166        //if global = 1,then show => set disable = 0
1167//      CheckBox prot_check_6,pos={sc*6,363*sc},size={sc*113,14*sc},proc=DrkCheckProc,title="Use DRK correction"
1168//      CheckBox prot_check_6,help={"If checked, the selected file will be used for DRK correction. Typically this is NOT checked"}
1169//      CheckBox prot_check_6,value= 0,disable = (!root:Packages:NIST:gAllowDRK)
1170//      SetVariable drkStr,pos={sc*120,363*sc},size={sc*150,15*sc},title="."
1171//      SetVariable drkStr,help={"DRK detector count file"*sc},disable = (!root:Packages:NIST:gAllowDRK)
1172//      SetVariable drkStr,limits={-Inf,Inf,0},value= root:Packages:NIST:VSANS:Globals:Protocols:gDRK
1173
1174
1175        Button export_button, size={sc*120,20*sc},pos={sc*125,540*sc},title="Export to Data",proc=V_ExportFileProtocol
1176        Button export_button, help={"Exports the protocol to data file on disk for Importing into another experiment"}
1177        Button import_button, size={sc*120,20*sc},pos={sc*125,562*sc},title="Import from Data",proc=V_ImportFileProtocol
1178        Button import_button,help={"Imports a protocol from a data file on disk for use in this experiment"}
1179        Button recallProt,pos={sc*7,540*sc},size={sc*107,20*sc},proc=V_RecallProtocolButton,title="Recall Protocol"
1180        Button recallProt,help={"Resets the panel to the file choices in  a previously saved protocol"}
1181        Button del_protocol,pos={sc*7,562*sc},size={sc*110,20*sc},proc=V_DeleteProtocolButton,title="Delete Protocol"
1182        Button del_protocol,help={"Use this to delete a previously saved protocol."}
1183        Button done_protocol,pos={sc*285,562*sc},size={sc*45,20*sc},proc=V_DoneProtocolButton,title="Done"
1184        Button done_protocol,help={"This button will close the panel. The panel can be recalled at any time from the SANS menu."}
1185        Button saveProtocol,pos={sc*7,518*sc},size={sc*100,20*sc},proc=V_SaveProtocolButton,title="Save Protocol"
1186        Button saveProtocol,help={"Saves the cerrent selections in the panel to a protocol which can be later recalled"}
1187        Button ReduceOne,pos={sc*240,518*sc},size={sc*100,20*sc},proc=V_ReduceOneButton,title="Reduce A File"
1188        Button ReduceOne,help={"Using the panel selections, the specified sample file will be reduced. If none is specified, the user will be prompted for a sample file"}
1189
1190EndMacro
1191
1192
1193
1194
1195
1196Function V_SAMFilePopMenuProc(pa) : PopupMenuControl
1197        STRUCT WMPopupAction &pa
1198
1199        switch( pa.eventCode )
1200                case 2: // mouse up
1201                        Variable popNum = pa.popNum
1202                        String popStr = pa.popStr
1203                        SVAR tempStr = root:Packages:NIST:VSANS:Globals:Protocols:gSAM
1204                        tempStr = popStr
1205                        break
1206                case -1: // control being killed
1207                        break
1208        endswitch
1209
1210        return 0
1211End
1212
1213
1214Function V_BKGFilePopMenuProc(pa) : PopupMenuControl
1215        STRUCT WMPopupAction &pa
1216
1217        switch( pa.eventCode )
1218                case 2: // mouse up
1219                        Variable popNum = pa.popNum
1220                        String popStr = pa.popStr
1221                        SVAR tempStr = root:Packages:NIST:VSANS:Globals:Protocols:gBGD
1222                        tempStr = popStr
1223                        break
1224                case -1: // control being killed
1225                        break
1226        endswitch
1227
1228        return 0
1229End
1230
1231Function V_EMPFilePopMenuProc(pa) : PopupMenuControl
1232        STRUCT WMPopupAction &pa
1233
1234        switch( pa.eventCode )
1235                case 2: // mouse up
1236                        Variable popNum = pa.popNum
1237                        String popStr = pa.popStr
1238                        SVAR tempStr = root:Packages:NIST:VSANS:Globals:Protocols:gEMP
1239                        tempStr = popStr
1240                        break
1241                case -1: // control being killed
1242                        break
1243        endswitch
1244
1245        return 0
1246End
1247
1248Function V_DIVFilePopMenuProc(pa) : PopupMenuControl
1249        STRUCT WMPopupAction &pa
1250
1251        switch( pa.eventCode )
1252                case 2: // mouse up
1253                        Variable popNum = pa.popNum
1254                        String popStr = pa.popStr
1255                        SVAR tempStr = root:Packages:NIST:VSANS:Globals:Protocols:gDIV
1256                        tempStr = popStr
1257                        break
1258                case -1: // control being killed
1259                        break
1260        endswitch
1261
1262        return 0
1263End
1264
1265Function V_MSKFilePopMenuProc(pa) : PopupMenuControl
1266        STRUCT WMPopupAction &pa
1267
1268        switch( pa.eventCode )
1269                case 2: // mouse up
1270                        Variable popNum = pa.popNum
1271                        String popStr = pa.popStr
1272                        SVAR tempStr = root:Packages:NIST:VSANS:Globals:Protocols:gMASK
1273                        tempStr = popStr
1274                        break
1275                case -1: // control being killed
1276                        break
1277        endswitch
1278
1279        return 0
1280End
1281
1282////activated when user checks/unchecks the box
1283////either prompts for a file using a standard dialog, or removes the current file
1284//Function V_DrkCheckProc(ctrlName,checked) : CheckBoxControl
1285//      String ctrlName
1286//      Variable checked                //Desired state, not previous state
1287//
1288//      SVAR drkStr=root:Packages:NIST:VSANS:Globals:Protocols:gDRK
1289//      if(checked==1)
1290//              //print "Unchecked on call"
1291//              //this just asks for the filename, doesn't open the file
1292//              String msgStr="Select the DRK file",fullPath="",fileStr=""
1293//              Variable refnum
1294//             
1295//              Open/D/R/T="????"/M=(msgStr)/P=catPathName refNum
1296//              fullPath = S_FileName           //fname is the full path
1297//              if(cmpstr(fullpath,"")==0)
1298//                      //user cancelled
1299//                      CheckBox prot_check_6,value=0           //keep box unchecked
1300//                      return(0)
1301//              Endif
1302//              fileStr=V_GetFileNameFromPathNoSemi(fullPath)
1303//              //Print fileStr
1304//              //update the global string
1305//              drkStr = ReplaceStringByKey("DRK",drkStr,fileStr,"=",",")
1306//              drkStr = ReplaceNumberByKey("DRKMODE", drkStr, 10 ,"=",",")
1307//      else
1308//              //print "checked on call"
1309//              drkStr="DRK=none,DRKMODE=0,"            //change the global
1310//      endif
1311//     
1312//End
1313
1314
1315Function V_ShowProtoHelp(ctrlName) : ButtonControl
1316        String ctrlName
1317        DisplayHelpTopic/Z/K=1 "VSANS Data Reduction Documentation[VSANS Reduction Protocol]"
1318        if(V_flag !=0)
1319                DoAlert 0,"The VSANS Data Reduction Help file could not be found"
1320        endif
1321End
1322
1323
1324
1325// TODO
1326// -- this is a trimmed down version of the "full" set of averaging options
1327//    add to this as needed as I figure out what functionality is appropriate
1328//
1329//
1330//button action procedure to get the type of average requested by the user
1331//presented as a missing parameter dialog, which is really user-UN-friendly
1332//and will need to be re-thought. Defaults of dialog are set for normal
1333//circular average, so typically click "continue" and proceed
1334//
1335Function V_SetAverageParamsButtonProc(ctrlName) : ButtonControl
1336        String ctrlName
1337       
1338        SVAR gAvgInfoStr = root:Packages:NIST:VSANS:Globals:Protocols:gAvgInfoStr
1339       
1340        String av_typ,autoSave,AutoName,binType,side
1341        Variable phi,dphi,width=10,Qctr = 0.01,qDelta=10
1342        String detGroup
1343       
1344        if(strlen(gAvgInfoStr) > 0)
1345//              fill the dialog with the current choice, not resetting to default
1346// can't do this, or it will simply bypass the missing parameter dialog!
1347//      V_GetAvgInfo(av_typ,autoSave,autoName,binType,qCtr,qDelta,detGroup)
1348                av_typ = StringByKey("AVTYPE", gAvgInfoStr  ,"=",";")
1349                autoSave = StringByKey("SAVE", gAvgInfoStr  ,"=",";")
1350                autoName = StringByKey("NAME", gAvgInfoStr  ,"=",";")
1351                binType = StringByKey("BINTYPE", gAvgInfoStr  ,"=",";")
1352                qCtr = NumberByKey("QCENTER", gAvgInfoStr  ,"=",";")
1353                qDelta = NumberByKey("QDELTA", gAvgInfoStr  ,"=",";")
1354                detGroup = StringByKey("DETGROUP", gAvgInfoStr  ,"=",";")
1355                phi = NumberByKey("PHI", gAvgInfoStr  ,"=",";")
1356                dphi = NumberByKey("DPHI", gAvgInfoStr  ,"=",";")
1357
1358//      Execute "V_GetAvgInfo_Full()"
1359//              Execute "V_GetAvgInfo()"
1360        endif
1361
1362
1363//      Prompt av_typ, "Type of Average",popup,"Circular;Sector;Rectangular;Annular;2D_ASCII;QxQy_ASCII;PNG_Graphic;Sector_PlusMinus;"
1364        Prompt av_typ, "Type of Average",popup,"Circular;Narrow_Slit;Annular;Sector;QxQy_ASCII;"
1365
1366// comment out above line in DEMO_MODIFIED version, and uncomment the line below (to disable PNG save)
1367//      Prompt av_typ, "Type of Average",popup,"Circular;Sector;Rectangular;Annular;2D_ASCII;QxQy_ASCII"
1368        Prompt autoSave,"Save files to disk?",popup,"Yes - Concatenate;Yes - Individual;No"
1369        Prompt autoName,"Auto-Name files?",popup,"Auto;Manual"
1370//      Prompt autoPlot,"Plot the averaged Data?",popup,"Yes;No"
1371        Prompt side,"Include detector halves?",popup,"both;right;left"
1372        Prompt phi,"Orientation Angle (-90,90) degrees (Rectangular or Sector)"
1373        Prompt dphi, "Sector range (+/-) degrees (0,90) (Sector only)"
1374//      Prompt width, "Width of Rectangular average (1,128)"
1375        Prompt binType,"Binning Type?",popup,ksBinTypeStr
1376
1377        Prompt Qctr, "q-value of center of annulus"
1378        Prompt Qdelta,"(+/-) q-width of annulus"
1379        Prompt detGroup,"Group for annulus"
1380
1381       
1382        DoPrompt "Enter Averaging Parameters",av_typ,autoSave,autoName,binType,qCtr,qDelta,detGroup,side,phi,dphi
1383        if (V_Flag)
1384                return(0)                                                               // User canceled
1385        endif   
1386       
1387        //assign results of dialog to key=value string, semicolon separated
1388        //do only what is necessary, based on av_typ
1389        //
1390        // reset the string
1391        gAvgInfoStr=""
1392
1393        // TODO:
1394        // hard wired value
1395        String autoPlot = "Yes"
1396       
1397               
1398        // all averages need these values
1399        gAvgInfoStr += "AVTYPE=" + av_typ + ";"
1400        gAvgInfoStr += "SAVE=" + autoSave + ";"
1401        gAvgInfoStr += "NAME=" + autoName + ";"
1402        gAvgInfoStr += "PLOT=" + autoPlot + ";"
1403        gAvgInfoStr += "BINTYPE=" + binType + ";"
1404       
1405        if(cmpstr(av_typ,"Sector")==0 || cmpstr(av_typ,"Sector_PlusMinus")==0)
1406                gAvgInfoStr += "SIDE=" + side + ";"
1407                gAvgInfoStr += "PHI=" + num2str(phi) + ";"
1408                gAvgInfoStr += "DPHI=" + num2str(dphi) + ";"
1409        Endif
1410//     
1411//      if(cmpstr(av_typ,"Rectangular")==0)
1412//              gAvgInfoStr += "SIDE=" + side + ";"
1413//              gAvgInfoStr += "PHI=" + num2str(phi) + ";"
1414//              gAvgInfoStr += "WIDTH=" + num2str(width) + ";"
1415//      Endif
1416//     
1417        if(cmpstr(av_typ,"Annular")==0)
1418                gAvgInfoStr += "QCENTER=" + num2str(QCtr) + ";"
1419                gAvgInfoStr += "QDELTA=" + num2str(QDelta) + ";"
1420                gAvgInfoStr += "DETGROUP=" + detGroup + ";"
1421        Endif
1422               
1423        //set the global string after user choices
1424        String/G root:Packages:NIST:VSANS:Globals:Protocols:gAVE = gAvgInfoStr
1425
1426        return(0)
1427End
1428
1429
1430//
1431// --- To avoid resetting the dialog with default values, the work is done in
1432// V_SetAverageParamsButtonProc --
1433//
1434//
1435//procedure called by protocol panel to ask user for average type choices
1436// somewhat confusing and complex, but may be as good as it gets.
1437//
1438//Proc V_GetAvgInfo(av_typ,autoSave,autoName,autoPlot,side,phi,dphi,width,QCtr,QDelta)
1439//Proc V_GetAvgInfo(av_typ,autoSave,autoName,binType,qCtr,qDelta,detGroup)
1440//      String av_typ,autoSave,AutoName,binType
1441////    Variable phi=0,dphi=10,width=10,Qctr = 0.01,qDelta=10
1442//      Variable Qctr=0.1,qDelta=0.01
1443//      String detGroup="F"
1444//
1445////    Prompt av_typ, "Type of Average",popup,"Circular;Sector;Rectangular;Annular;2D_ASCII;QxQy_ASCII;PNG_Graphic;Sector_PlusMinus;"
1446//      Prompt av_typ, "Type of Average",popup,"Circular;Narrow_Slit;Annular;"
1447//
1448//// comment out above line in DEMO_MODIFIED version, and uncomment the line below (to disable PNG save)
1449////    Prompt av_typ, "Type of Average",popup,"Circular;Sector;Rectangular;Annular;2D_ASCII;QxQy_ASCII"
1450//      Prompt autoSave,"Save files to disk?",popup,"Yes - Concatenate;Yes - Individual;No"
1451//      Prompt autoName,"Auto-Name files?",popup,"Auto;Manual"
1452////    Prompt autoPlot,"Plot the averaged Data?",popup,"Yes;No"
1453////    Prompt side,"Include detector halves?",popup,"both;right;left"
1454////    Prompt phi,"Orientation Angle (-90,90) degrees (Rectangular or Sector)"
1455////    Prompt dphi, "Azimuthal range (0,45) degrees (Sector only)"
1456////    Prompt width, "Width of Rectangular average (1,128)"
1457//      Prompt binType,"Binning Type?",popup,ksBinTypeStr
1458//
1459//      Prompt Qctr, "q-value of center of annulus"
1460//      Prompt Qdelta,"(+/-) q-width of annulus"
1461//      Prompt detGroup,"Group for annulus"
1462//     
1463//      //assign results of dialog to key=value string, semicolon separated
1464//      //do only what is necessary, based on av_typ
1465//      String/G root:Packages:NIST:VSANS:Globals:Protocols:gAvgInfoStr=""
1466//
1467//      // TODO:
1468//      // hard wired value
1469//      String autoPlot = "Yes"
1470//     
1471//             
1472//      // all averages need these values
1473//      root:Packages:NIST:VSANS:Globals:Protocols:gAvgInfoStr += "AVTYPE=" + av_typ + ";"
1474//      root:Packages:NIST:VSANS:Globals:Protocols:gAvgInfoStr += "SAVE=" + autoSave + ";"
1475//      root:Packages:NIST:VSANS:Globals:Protocols:gAvgInfoStr += "NAME=" + autoName + ";"
1476//      root:Packages:NIST:VSANS:Globals:Protocols:gAvgInfoStr += "PLOT=" + autoPlot + ";"
1477//      root:Packages:NIST:VSANS:Globals:Protocols:gAvgInfoStr += "BINTYPE=" + binType + ";"
1478//     
1479////    if(cmpstr(av_typ,"Sector")==0 || cmpstr(av_typ,"Sector_PlusMinus")==0)
1480////            root:Packages:NIST:VSANS:Globals:Protocols:gAvgInfoStr += "SIDE=" + side + ";"
1481////            root:Packages:NIST:VSANS:Globals:Protocols:gAvgInfoStr += "PHI=" + num2str(phi) + ";"
1482////            root:Packages:NIST:VSANS:Globals:Protocols:gAvgInfoStr += "DPHI=" + num2str(dphi) + ";"
1483////    Endif
1484////   
1485////    if(cmpstr(av_typ,"Rectangular")==0)
1486////            root:Packages:NIST:VSANS:Globals:Protocols:gAvgInfoStr += "SIDE=" + side + ";"
1487////            root:Packages:NIST:VSANS:Globals:Protocols:gAvgInfoStr += "PHI=" + num2str(phi) + ";"
1488////            root:Packages:NIST:VSANS:Globals:Protocols:gAvgInfoStr += "WIDTH=" + num2str(width) + ";"
1489////    Endif
1490////   
1491//      if(cmpstr(av_typ,"Annular")==0)
1492//              root:Packages:NIST:VSANS:Globals:Protocols:gAvgInfoStr += "QCENTER=" + num2str(QCtr) + ";"
1493//              root:Packages:NIST:VSANS:Globals:Protocols:gAvgInfoStr += "QDELTA=" + num2str(QDelta) + ";"
1494//              root:Packages:NIST:VSANS:Globals:Protocols:gAvgInfoStr += "DETGROUP=" + detGroup + ";"
1495//      Endif
1496//End
1497
1498
1499// TODO
1500// -- this is the original(SANS) version, and needs to be updated for VSANS as the averaging options are
1501//    worked out
1502// -- there have been changes made to V_GetAvgInfo() above -- so work from that version, NOT this one.
1503//
1504//
1505//procedure called by protocol panel to ask user for average type choices
1506// somewhat confusing and complex, but may be as good as it gets.
1507//
1508Proc V_GetAvgInfo_Full(av_typ,autoSave,autoName,autoPlot,side,phi,dphi,width,QCtr,QDelta)
1509        String av_typ,autoSave,AutoName,autoPlot,side
1510        Variable phi=0,dphi=10,width=10,Qctr = 0.01,qDelta=10
1511        Prompt av_typ, "Type of Average",popup,"Circular;Sector;Rectangular;Annular;2D_ASCII;QxQy_ASCII;PNG_Graphic;Sector_PlusMinus;"
1512// comment out above line in DEMO_MODIFIED version, and uncomment the line below (to disable PNG save)
1513//      Prompt av_typ, "Type of Average",popup,"Circular;Sector;Rectangular;Annular;2D_ASCII;QxQy_ASCII"
1514        Prompt autoSave,"Save files to disk?",popup,"Yes;No"
1515        Prompt autoName,"Auto-Name files?",popup,"Auto;Manual"
1516        Prompt autoPlot,"Plot the averaged Data?",popup,"Yes;No"
1517        Prompt side,"Include detector halves?",popup,"both;right;left"
1518        Prompt phi,"Orientation Angle (-90,90) degrees (Rectangular or Sector)"
1519        Prompt dphi, "Azimuthal range (0,45) degrees (Sector only)"
1520        Prompt width, "Width of Rectangular average (1,128)"
1521        Prompt Qctr, "q-value of center of annulus"
1522        Prompt Qdelta,"Pixel width of annulus"
1523
1524        //assign results of dialog to key=value string, semicolon separated
1525        //do only what is necessary, based on av_typ
1526        String/G root:Packages:NIST:VSANS:Globals:Protocols:gAvgInfoStr=""
1527       
1528        // all averages need these four values
1529        root:Packages:NIST:VSANS:Globals:Protocols:gAvgInfoStr += "AVTYPE=" + av_typ + ";"
1530        root:Packages:NIST:VSANS:Globals:Protocols:gAvgInfoStr += "SAVE=" + autoSave + ";"
1531        root:Packages:NIST:VSANS:Globals:Protocols:gAvgInfoStr += "NAME=" + autoName + ";"
1532        root:Packages:NIST:VSANS:Globals:Protocols:gAvgInfoStr += "PLOT=" + autoPlot + ";"
1533       
1534        if(cmpstr(av_typ,"Sector")==0 || cmpstr(av_typ,"Sector_PlusMinus")==0)
1535                root:Packages:NIST:VSANS:Globals:Protocols:gAvgInfoStr += "SIDE=" + side + ";"
1536                root:Packages:NIST:VSANS:Globals:Protocols:gAvgInfoStr += "PHI=" + num2str(phi) + ";"
1537                root:Packages:NIST:VSANS:Globals:Protocols:gAvgInfoStr += "DPHI=" + num2str(dphi) + ";"
1538        Endif
1539       
1540        if(cmpstr(av_typ,"Rectangular")==0)
1541                root:Packages:NIST:VSANS:Globals:Protocols:gAvgInfoStr += "SIDE=" + side + ";"
1542                root:Packages:NIST:VSANS:Globals:Protocols:gAvgInfoStr += "PHI=" + num2str(phi) + ";"
1543                root:Packages:NIST:VSANS:Globals:Protocols:gAvgInfoStr += "WIDTH=" + num2str(width) + ";"
1544        Endif
1545       
1546        if(cmpstr(av_typ,"Annular")==0)
1547                root:Packages:NIST:VSANS:Globals:Protocols:gAvgInfoStr += "QCENTER=" + num2str(QCtr) + ";"
1548                root:Packages:NIST:VSANS:Globals:Protocols:gAvgInfoStr += "QDELTA=" + num2str(QDelta) + ";"
1549        Endif
1550End
1551
1552
1553//prompts the user to pick a previously created protocol from a popup list
1554//of given the option to create a new protocol
1555//the chosen protocol is passed back to the calling procedure by a global string
1556//the popup is presented as a missing parameter dialog (called with empty parameter list)
1557//
1558// MAXROWS is present to exclude the PanelNameW from appearing as a protocol
1559Proc V_PickAProtocol(protocol)
1560        String Protocol
1561        Prompt Protocol "Pick A Protocol",popup, V_RecallableProtocols()
1562       
1563        String/G  root:Packages:NIST:VSANS:Globals:Protocols:gProtoStr = protocol
1564End
1565
1566Proc V_DeleteAProtocol(protocol)
1567        String Protocol
1568//      Prompt Protocol "Delete A Protocol",popup, WaveList("*",";","TEXT:1")
1569        Prompt Protocol "Delete A Protocol",popup, V_DeletableProtocols()
1570
1571        String/G  root:Packages:NIST:VSANS:Globals:Protocols:gProtoStr = protocol
1572End
1573
1574Function/S V_DeletableProtocols()
1575        String list=WaveList("*",";","TEXT:1,MAXROWS:13")
1576
1577        list= RemoveFromList("Base", list  , ";")
1578        list= RemoveFromList("DoAll", list  , ";")
1579        list= RemoveFromList("CreateNew", list  , ";")
1580        list= RemoveFromList("tempProtocol", list  , ";")
1581        list= RemoveFromList("wTTmpWrite", list  , ";")
1582        if(cmpstr(list,"")==0)
1583                list = "_no_protocols_;"
1584        endif
1585       
1586        return(list)
1587End
1588
1589Function/S V_RecallableProtocols()
1590        String list=WaveList("*",";","TEXT:1,MAXROWS:13")
1591
1592//      list= RemoveFromList("Base", list  , ";")
1593//      list= RemoveFromList("DoAll", list  , ";")
1594        list= RemoveFromList("CreateNew", list  , ";")
1595        list= RemoveFromList("tempProtocol", list  , ";")
1596        list= RemoveFromList("wTTmpWrite", list  , ";")
1597        if(cmpstr(list,"")==0)
1598                list = "_no_protocols_;"
1599        endif
1600       
1601        return(list)
1602End
1603
1604
1605//missing parameter dialog to solicit user for a waveStr for the protocol
1606//about to be created
1607//name is passed back as a global string and calling procedure is responsible for
1608//checking for wave conflicts and valid names
1609//
1610Proc V_AskForName(protocol)
1611        String Protocol
1612        Prompt Protocol "Enter a new name for your protocol (no extension)"
1613       
1614        String/G  root:Packages:NIST:VSANS:Globals:Protocols:gNewStr = protocol
1615End
1616
1617//this is a lengthy procedure for sequentially polling the user about what data
1618//reduction steps they want to be performed during the protocol
1619//ensures that a valid protocol name was chosen, then fills out each "item"
1620//(6 total) needed for reduction
1621//it the user cancels at any point, the partial protocol will be deleted
1622//
1623Function V_ProtocolQuestionnaire(ctrlName)
1624        String ctrlName
1625
1626        String filename,cmd
1627        Variable notDone,refnum
1628       
1629        //prompt for name of new protocol wave to save
1630        do
1631                Execute "V_AskForName()"
1632                SVAR newProtoStr = root:Packages:NIST:VSANS:Globals:Protocols:gNewStr
1633               
1634                //make sure it's a valid IGOR name
1635                newProtoStr = CleanupName(newProtoStr,0)        //strict naming convention
1636                String/G root:Packages:NIST:VSANS:Globals:Protocols:gNewStr=newProtoStr         //reassign, if changed
1637                //Print "newProtoStr = ",newProtoStr
1638               
1639                SetDataFolder root:Packages:NIST:VSANS:Globals:Protocols
1640                if(WaveExists( $("root:Packages:NIST:VSANS:Globals:Protocols:" + newProtoStr) ) == 1)
1641                        //wave already exists
1642                        DoAlert 0,"that name is already in use. Please pick a new name"
1643                        notDone = 1
1644                else
1645                        //name is  good
1646                        notDone = 0
1647                Endif
1648        while(notDone)
1649       
1650        //Print "protocol questionnaire is "+newProtocol
1651       
1652        //make a new text wave (12 points) and fill it in, in response to questions
1653        SetDataFolder root:Packages:NIST:VSANS:Globals:Protocols //(redundant - full wave specs are used)
1654        Make/O/T/N=(kNumProtocolSteps) $("root:Packages:NIST:VSANS:Globals:Protocols:" + newProtoStr)
1655        Wave/T newProtocol = $("root:Packages:NIST:VSANS:Globals:Protocols:" + newProtoStr)
1656        newProtocol = ""
1657       
1658        //ask the questions
1659        /////
1660        //*****Multiple files in these lists are full paths/filenames which may or may not
1661        //have semicolon version numbers in the filename. Therefore, construct the list with
1662        //COMMAS as separators - to avoid messy parsing
1663        ///////
1664       
1665        String fileFilters = "VSANS Data Files (*.ngv,*.h5):.ngv,.h5;"
1666//      fileFilters += "HTML Files (*.htm,*.html):.htm,.html;"
1667        fileFilters += "All Files:.*;"
1668//////////////////////////
1669        String drkStr="",fileStr=""
1670       
1671       
1672//////////////////////////     
1673//      DoAlert 1,"Do you want to correct your data for DRK (beam off) counts?"
1674//      if(V_flag == 1)         //1=yes
1675//              //prompt for DRK  file, but don't actually open it (/D flag)
1676//              Open/D/R/F=fileFilters/M="Select the DRK file"/P=catPathName refnum
1677//              //check for cancel
1678//              if(strlen(S_filename)==0)
1679//                      //user cancelled, abort
1680//                      KillWaves/Z newProtocol
1681//                      SetDataFolder root:
1682//                      Abort "Incomplete protocol has been deleted"
1683//              Endif
1684//              //assign filename (just the name) to [6]
1685//              fileStr = V_GetFileNameFromPathNoSemi(S_filename)
1686//              drkStr = "DRK=none,DRKMODE=0,"
1687//              drkStr = ReplaceStringByKey("DRK",drkStr,fileStr,"=",",")
1688//              drkStr = ReplaceNumberByKey("DRKMODE", drkStr, 10 ,"=",",")     
1689//              newProtocol[6] = drkStr
1690//      else
1691//              //no Work.DRK desired
1692//              newProtocol[6] = "DRK=none,DRKMODE=0,"
1693//      Endif
1694//     
1695////////////
1696       
1697       
1698// TODO:
1699// -- there is a lag in the V_pick() routine as it greps through all of the files. Several seconds even when there
1700//   are 20-ish files. Pre-search for the strings? When to refresh them for new data?   
1701/////////////////
1702        DoAlert 1,"Do you want to subtract background from your data?"
1703        if(V_flag == 1)         //1=yes
1704               
1705                Prompt filename,"BKG File",popup,V_PickBGDButton("")
1706                DoPrompt "Select File",filename
1707                if (V_Flag)
1708                        return 0                                                                        // user canceled
1709                endif
1710//              //assign filename to [0]
1711                newProtocol[0] = V_GetFileNameFromPathNoSemi(fileName)
1712       
1713               
1714// OLD way, using an open file dialog   
1715// and allowing for multiple files to be added together
1716//     
1717//              //prompt for background file, but don't actually open it (/D flag)
1718//              Open/D/R/F=fileFilters/M="Select the Background data file"/P=catPathName refnum
1719//              //check for cancel
1720//              if(strlen(S_filename)==0)
1721//                      //user cancelled, abort
1722//                      KillWaves/Z newProtocol
1723//                      SetDataFolder root:
1724//                      Abort "Incomplete protocol has been deleted"
1725//              Endif
1726//              //assign filename (full path) to [0]
1727//              newProtocol[0] = V_GetFileNameFromPathNoSemi(S_filename)
1728               
1729//              notDone=1
1730//              do
1731//                      //prompt for additional background files
1732//                      DoAlert 1,"Do you want to add another background file?"
1733//                      if(V_flag == 1)         //yes
1734//                              Open/D/R/F=fileFilters/M="Select another Background data file"/P=catPathName refnum
1735//                              //check for cancel
1736//                              if(strlen(S_filename)==0)
1737//                                      //user cancelled, abort ********maybe just break out of the loop here
1738//                                      KillWaves/Z newProtocol
1739//                                      SetDataFolder root:
1740//                                      Abort "Incomplete protocol has been deleted"
1741//                              Endif
1742//                              //assign filename (full path) to [0]
1743//                              newProtocol[0] += "," + V_GetFileNameFromPathNoSemi(S_filename)         //***COMMA separated list
1744//                              notDone = 1             //keep going
1745//                      else
1746//                              notDone = 0                     //no more to add
1747//                      Endif
1748//              While(notDone)
1749//////
1750
1751        else            //no background desired
1752                newProtocol[0] = "none"
1753        Endif
1754       
1755       
1756////////////////////// 
1757        DoAlert 1,"Do you want to subtract empty cell scattering from your data?"
1758        if(V_flag == 1)         //1=yes
1759               
1760                Prompt filename,"EMP File",popup,V_PickEMPButton("")
1761                DoPrompt "Select File",filename
1762                if (V_Flag)
1763                        return 0                                                                        // user canceled
1764                endif
1765//              //assign filename to [1]
1766                newProtocol[1] = V_GetFileNameFromPathNoSemi(fileName)         
1767       
1768
1769               
1770//              //prompt for Empty cell file, but don't actually open it (/D flag)
1771//              Open/D/R/F=fileFilters/M="Select the Empty Cell data file"/P=catPathName refnum
1772//              //check for cancel
1773//              if(strlen(S_filename)==0)
1774//                      //user cancelled, abort
1775//                      KillWaves/Z newProtocol
1776//                      SetDataFolder root:
1777//                      Abort "Incomplete protocol has been deleted"
1778//              Endif
1779//              //assign filename (full path) to [1]
1780//              newProtocol[1] = V_GetFileNameFromPathNoSemi(S_filename)
1781//             
1782//              notDone=1
1783//              do
1784//                      //prompt for additional Empty Cell files
1785//                      DoAlert 1,"Do you want to add another Empty Cell file?"
1786//                      if(V_flag == 1)         //yes
1787//                              Open/D/R/F=fileFilters/M="Select another Empty Cell data file"/P=catPathName refnum
1788//                              //check for cancel
1789//                              if(strlen(S_filename)==0)
1790//                                      //user cancelled, abort ********maybe just break out of the loop here
1791//                                      KillWaves/Z newProtocol
1792//                                      SetDataFolder root:
1793//                                      Abort "Incomplete protocol has been deleted"
1794//                              Endif
1795//                              //assign filename (full path) to [1]
1796//                              newProtocol[1] += "," + V_GetFileNameFromPathNoSemi(S_filename)         //***COMMA separated list
1797//                              notDone = 1             //keep going
1798//                      else
1799//                              notDone = 0                     //no more to add
1800//                      Endif
1801//              While(notDone)
1802
1803
1804        else            //no background desired
1805                newProtocol[1] = "none"
1806        Endif
1807       
1808       
1809//////////////////////////
1810        DoAlert 1,"Do you want to correct your data for detector sensitivity?"
1811       
1812        if(V_flag == 1)         //1=yes
1813               
1814                Prompt filename,"DIV File",popup,V_GetDIVList()
1815                DoPrompt "Select File",filename
1816                if (V_Flag)
1817                        return 0                                                                        // user canceled
1818                endif
1819//              //assign filename to [2]
1820                newProtocol[2] = V_GetFileNameFromPathNoSemi(fileName)
1821               
1822//              //prompt for DIV  file, but don't actually open it (/D flag)
1823//              Open/D/R/F=fileFilters/M="Select the detector sensitivity file"/P=catPathName refnum
1824//              //check for cancel
1825//              if(strlen(S_filename)==0)
1826//                      //user cancelled, abort
1827//                      KillWaves/Z newProtocol
1828//                      SetDataFolder root:
1829//                      Abort "Incomplete protocol has been deleted"
1830//              Endif
1831//              //assign filename (full path) to [2]
1832//              newProtocol[2] = V_GetFileNameFromPathNoSemi(S_filename)
1833               
1834               
1835        else
1836                //no Work.DIV desired
1837                newProtocol[2] = "none"
1838        Endif   
1839//////////////////////////
1840        DoAlert 1,"Do you want to mask your files before averaging?"
1841       
1842        if(V_flag == 1)         //1=yes
1843       
1844                Prompt filename,"MASK File",popup,V_PickMASKButton("")
1845                DoPrompt "Select File",filename
1846                if (V_Flag)
1847                        return 0                                                                        // user canceled
1848                endif
1849//              //assign filename to [3]
1850                newProtocol[3] = V_GetFileNameFromPathNoSemi(fileName)
1851                       
1852//              //prompt for mask  file, but don't actually open it (/D flag)
1853//              Open/D/R/F=fileFilters/M="Select the mask file"/P=catPathName refnum
1854//              //check for cancel
1855//              if(strlen(S_filename)==0)
1856//                      //user cancelled, abort
1857//                      KillWaves/Z newProtocol
1858//                      SetDataFolder root:
1859//                      Abort "Incomplete protocol has been deleted"
1860//              Endif
1861//              //assign filename (full path) to [3]
1862//              newProtocol[3] = V_GetFileNameFromPathNoSemi(S_filename)
1863               
1864               
1865        else
1866                //no MASK desired
1867                newProtocol[3] = "none"
1868        Endif   
1869       
1870        //absolute scaling
1871       
1872        //////////////////////////
1873        //ABS parameters stored as keyword=value string
1874        DoAlert 1,"Do you want absolute scaling?"
1875        if(V_flag == 1)         //1=yes
1876                //missing param - prompt for values, put in semicolon-separated list
1877                Execute "V_AskForAbsoluteParams_Quest()"
1878                SVAR absStr =  root:Packages:NIST:VSANS:Globals:Protocols:gAbsStr
1879                newProtocol[4] = absStr
1880        else
1881                //no absolute scaling desired
1882                newProtocol[4] = "none"
1883        Endif   
1884       
1885        //type of average, plot?, auto/manual naming/saving... put in semicolon separated string
1886        //of KEY=<value> format for easy parsing
1887        //Kewords are: AVTYPE,PHI,DPHI,PLOT,SAVE,NAME,SIDE,WIDTH
1888        //note that AVTYPE,NAME,SIDE have string values, others have numerical values
1889        ///////////////////////
1890        DoAlert 1,"Do you want to average your data to I vs. q?"
1891        if(V_flag == 1)         //1=yes
1892                String/G root:Packages:NIST:VSANS:Globals:Protocols:gAvgInfoStr = ""
1893                Execute "V_GetAvgInfo()"                //will put up missing paramter dialog and do all the work
1894                //:gAvgInfo is reset by the Proc(), copy this string tot he protocol
1895                SVAR tempStr=root:Packages:NIST:VSANS:Globals:Protocols:gAvgInfoStr
1896               
1897                //get a file path for saving files, if desired
1898                /////no - save files to the same data folder as the one with the raw data
1899                //then only one path to manage.
1900                //String yesNo = StringByKey("SAVE", tempStr,"=", ";")
1901                //if(cmpstr("Yes",yesNo) == 0)          //0=yes
1902                        //NewPath/C/M="Select Folder"/O Save_path               //Save_path is the symbolic path
1903                //Endif
1904
1905                newProtocol[5] = tempStr
1906                KillStrings/Z tempStr
1907        else
1908                //no averaging desired
1909                newProtocol[5] = "AVTYPE=none"
1910        Endif
1911       
1912        //returns the name of the newly created (= currently in use) protocol wave through a global
1913        String/G root:Packages:NIST:VSANS:Globals:Protocols:gProtoStr = newProtoStr
1914       
1915        //reset the panel based on the protocol textwave (currently a string)
1916        V_ResetToSavedProtocol(newProtoStr)
1917       
1918        SetDataFolder root:
1919       
1920        return(0)
1921End
1922
1923
1924// TODO
1925// -- this function may not work properly for VSANS, but I haven't tested it yet
1926// -- I'd rather have some sort of display to show the current content of the WORK folders
1927//
1928// -- the global string fileList does not exist, so this will always fail and return zero
1929//
1930//
1931//function to check the work files (to see what's already there)
1932//and compare that with the files that are supposed to be there, according to the
1933//current protocol (to save unnecessary time re-loading files)
1934//
1935//the "type" folder is checked for all files in the list req(ested)Files
1936//note that the list of files is a full path:name;ver, while the
1937//fileList in the folder is just the name (or a list of names)
1938//
1939//returns 0 false, if files are NOT present
1940//or 1 = true, yes, the files are there as requested
1941//
1942Function V_AreFilesThere(type,reqFiles)
1943        String type,reqFiles
1944       
1945        //in general, reqFiles is a list of full paths to files - which MAY include semicolon version numbers
1946        //reqFiles MUST be constructed with COMMAS as list separators, to avoid disaster
1947        //when the version numbers are interpreted as filenames
1948       
1949        //get the number of files requested
1950        Variable nReq,nCur,match,ii
1951        nReq = ItemsInList(reqFiles,",")
1952       
1953        //get the name of the file currently in BGD - in the global fileList
1954        //fileList has NAMES ONLY - since it was derived from the file header
1955        String testStr
1956        testStr = "root:Packages:NIST:"+type+":fileList"
1957        if(Exists(testStr) == 2)                //2 if string variable exists
1958                SVAR curFiles = $testStr
1959        else
1960                //no files currently in type folder, return zero
1961                Return (0)
1962        Endif
1963        //get the number of files already in folder
1964        nCur = ItemsInList(curFiles,";")
1965        If(nCur != nReq)
1966                Return (0)              //quit now, the wrong number of files present
1967        Endif
1968        //right number of files... are the names right...
1969        //check for a match (case-sensitive!!) of each requested file in the curFile string
1970        //need to extract filenames from reqFiles, since they're the full path and name
1971       
1972        ii=0
1973        do
1974                testStr = StringFromList(ii,reqFiles,",")       //testStr is the Nth full path and filename
1975                //testStr = GetFileNameFromPathNoSemi(testStr)  //testStr will now be just the filename
1976                match = stringmatch(curFiles,testStr)
1977                If(!match)
1978                        Return (0)              //req file was not found in curFile list - get out now
1979                Endif
1980                ii+=1
1981        while(ii<nreq)
1982       
1983        Return (1)              //indicate that files are OK, no changes needed
1984End
1985
1986
1987//
1988//will add the files specified in the protocol to the "type" folder
1989//will add multiple files together if more than one file is requested
1990//(list is a comma delimited list of filenames, with NO path information)
1991//
1992// This routine NOW DOES check for the possibility that the filenames may have ";vers" from the
1993// VAX - data should be picked up from Charlotte, where it won't have version numbers.
1994//
1995Function V_AddFilesInList(type,list)
1996        String type,list
1997       
1998        //type is the work folder to put the data into, and list is a COMMA delimited list of paths/names
1999        Variable num,ii,err=0,refNum
2000        String filename,pathStr=""
2001        PathInfo catPathName                    //this is where the files are
2002        pathstr=S_path
2003       
2004        num = ItemsInList(list,",")             // comma delimited list
2005       
2006        ii=0
2007        do
2008                //FindValidFilename only needed in case of vax version numbers
2009                filename = pathStr + V_FindValidFilename(StringFromList(ii,list,","))
2010                Open/Z/R refnum as filename
2011                if(V_flag != 0)         //file not found
2012                        //Print "file not found AddFilesInList()"
2013                        //Print filename
2014                        err = 1
2015                        return(err)
2016                Endif
2017                Close refnum            //file was found and opened, so close it
2018               
2019//              Abort "Find equivalent to ReadHeaderAndData(filename)"
2020//              ReadHeaderAndData(filename)
2021                err = V_LoadHDF5Data(filename,"RAW")   
2022               
2023                if(ii == 0)
2024                        //first pass, wipe out the old contents of the work file
2025                        err =  V_Raw_to_work(type)
2026                else
2027                        err = V_Add_raw_to_work(type)
2028                Endif
2029                ii+=1
2030        while(ii<num)
2031        return(err)
2032End
2033
2034//function will reduce a sample file (or ask for file(s))
2035//using the protocol named as "protoStr" in the Protocols subfolder
2036//samStr is the file(s) or "ask" to force prompt
2037//sequentially proceeds through flowchart, doing reduction steps as needed
2038//show Schematic to debug what steps/values were used
2039//
2040//function is long, but straightforward logic
2041//
2042Function V_ExecuteProtocol(protStr,samStr)
2043        String protStr,samStr
2044        //protStr is the full path to the selected protocol wave
2045        //samStr is either "ask" or the name ONLY ofthe desired sample data file(s) (NO PATH)
2046        WAVE/T prot = $protStr
2047        SetDataFolder root:Packages:NIST:VSANS:Globals:Protocols
2048       
2049        Variable filesOK,err,notDone
2050        String activeType, msgStr, junkStr, pathStr=""
2051        PathInfo catPathName                    //this is where the files are
2052        pathStr=S_path
2053       
2054//      NVAR useXMLOutput = root:Packages:NIST:gXML_Write
2055       
2056        //Parse the instructions in the prot wave
2057        //0 - bkg
2058        //1 - emp
2059        //2 - div
2060        //3 - mask
2061        //4 - abs params c2-c5
2062        //5 - average params
2063        //6 = DRK file (**out of sequence)
2064        //7 = beginning trim points
2065        //8 = end trim points
2066        //9 = collimation type for reduced data
2067        //10 = unused
2068        //11 = unused
2069
2070//////////////////////////////
2071// DIV
2072//////////////////////////////
2073// for VSANS, DIV is used on each data file as it is converted to WORK, so it needs to be
2074//  the first thing in place, before any data or backgrounds are loaded
2075
2076        //check for work.div file (prot[2])
2077        //load in if needed
2078        // no math is done here, DIV is applied as files are converted to WORK (the first operation in VSANS)
2079        //
2080
2081        // save the state of the DIV preference
2082        NVAR gDoDIVCor = root:Packages:NIST:VSANS:Globals:gDoDIVCor
2083        Variable saved_gDoDIVCor = gDoDIVCor
2084       
2085        err = V_Proto_LoadDIV(prot[2])
2086       
2087        if(err)
2088                SetDataFolder root:
2089                Abort "No file selected, data reduction aborted"
2090        endif
2091
2092//////////////////////////////
2093// SAM
2094//////////////////////////////
2095
2096// TODO:
2097// -- currently does not allow adding RAW data files together, so no parsing is done
2098//       -- NOTE detector corrections (including DIV) are done at the V_Raw_to_Work() step
2099//   So if the DIV is not part of the protocol, be sure to set/reset the global preference
2100//
2101        //prompt for sam data => read raw data, add to sam folder
2102        //or parse file(s) from the input paramter string
2103        activeType = "SAM"
2104        msgStr = "Select sample data"
2105       
2106        err = V_Proto_LoadFile(samStr,activeType,msgStr)
2107        if(err)
2108                PathInfo/S catPathName
2109                SetDataFolder root:
2110                Abort "No file selected, data reduction aborted"
2111        endif
2112       
2113        // TODO
2114        // -- this may not be the most reliable way to pass the file name (for naming of the saved file later)
2115        SVAR file_name = root:file_Name
2116        String samFileLoaded = file_name                //keep a copy of the sample file loaded
2117       
2118        SVAR samFiles = root:Packages:NIST:VSANS:Globals:Protocols:gSAM
2119        samFiles = samStr
2120       
2121        //always update
2122        V_UpdateDisplayInformation(ActiveType)
2123
2124
2125// TODO -- the logic here is flawed
2126// check that the SAM file is of the same configuration as BGD or EMP, if they are used
2127// need to be able to handle all of the permutations AND catch the "ask" cases
2128       
2129        Variable filesMatch=1           //assume OK
2130       
2131        if(cmpstr("none",prot[0])==0 || cmpstr("ask",prot[0])==0)
2132                // BGD not identified, try EMP.
2133                if(cmpstr("none",prot[1])==0 || cmpstr("ask",prot[1])==0)
2134                        // EMP not identified either, no mismatch possible
2135                else
2136                        // compare to EMP
2137                        filesMatch = V_RawFilesMatchConfig(samFileLoaded,StringFromList(0,prot[1],","))
2138                endif
2139        else
2140                // BGD is identified, compare
2141                filesMatch = V_RawFilesMatchConfig(samFileLoaded,StringFromList(0,prot[0],","))
2142        endif
2143
2144        if(filesMatch == 0)
2145                Abort "SAM data is not the same configuration as the protocol."
2146                SetDataFolder root:
2147        endif           
2148
2149
2150
2151//////////////////////////////
2152// BGD
2153//////////////////////////////
2154       
2155        //check for BGD file  -- "ask" might not fail - "ask?" will - ? not allowed in VAX filenames
2156        // add if needed
2157        //use a "case" statement
2158        msgStr = "Select background file"
2159        activeType = "BGD"
2160       
2161        err = V_Proto_LoadFile(prot[0],activeType,msgStr)
2162        if(err)
2163                PathInfo/S catPathName
2164                SetDataFolder root:
2165                Abort "No file selected, data reduction aborted"
2166        endif
2167
2168//      //Loader is in charge of updating, since it knows if data was loaded
2169//      V_UpdateDisplayInformation(ActiveType)
2170
2171
2172//////////////////////////////
2173// EMP
2174////////////////////////////// 
2175       
2176        //check for emp file (prot[1])
2177        // add if needed
2178        msgStr = "Select empty cell data"
2179        activeType = "EMP"
2180       
2181        err = V_Proto_LoadFile(prot[1],activeType,msgStr)
2182        if(err)
2183                PathInfo/S catPathName
2184                SetDataFolder root:
2185                Abort "No file selected, data reduction aborted"
2186        endif
2187
2188//      //Loader is in charge of updating, since it knows if data was loaded
2189//      V_UpdateDisplayInformation(ActiveType)
2190
2191
2192//////////////////////////////
2193// CORRECT
2194//////////////////////////////
2195
2196        //do the CORRECT step based on the answers to emp and bkg subtraction
2197        //by setting the proper"mode"
2198        //1 = both emp and bgd subtraction
2199        //2 = only bgd subtraction
2200        //3 = only emp subtraction
2201        //4 = no subtraction
2202        //additional modes 091301
2203        //11 = emp, bgd, drk
2204        //12 = bgd and drk
2205        //13 = emp and drk
2206        //14 = no subtractions
2207        //work.drk is from proto[6]
2208        //
2209        //subtracting just the DRK data is NOT an option - it doesnt' really make any physical sense
2210        // - in this case, DRK is skipped (equivalent to mode==4)
2211        // automatically accounts for attenuators given the lookup tables and the
2212        //desired subtractions
2213        //Attenuator lookup tables are alredy implemented (NG1 = NG7)
2214        //
2215
2216
2217/////// DRK is SKIPPED
2218       
2219//      //read in the DRK data if necessary
2220//      //only one file, assumed to be RAW data
2221//      //
2222//      String fname="",drkStr=""
2223//      drkStr=StringByKey("DRK",prot[6],"=",",")
2224//      if(cmpstr(drkStr,"none") != 0)
2225//              err = ReadHeaderAndData( (pathStr+drkStr) )
2226//              if(err)
2227//                      PathInfo/S catPathName
2228//                      Abort "reduction sequence aborted"
2229//              endif
2230//              err = V_Raw_to_Work_NoNorm("DRK")
2231//      endif
2232
2233        //dispatch to the proper "mode" of Correct()
2234//      V_Dispatch_to_Correct(bgdStr,empStr,drkStr)
2235        V_Dispatch_to_Correct(prot[0],prot[1],prot[6])
2236       
2237        if(err)
2238                PathInfo/S catPathName
2239                SetDataFolder root:
2240                Abort "error in Correct, called from executeprotocol, normal cor"
2241        endif
2242        activeType = "COR"
2243
2244// always update - COR will always be generated
2245        V_UpdateDisplayInformation(ActiveType)         
2246
2247
2248//////////////////////////////
2249//  ABSOLUTE SCALE
2250//////////////////////////////
2251
2252        err = V_Proto_ABS_Scale(prot[4],activeType)             //activeType is pass-by-reference and updated IF ABS is used
2253       
2254        if(err)
2255                SetDataFolder root:
2256                Abort "Error in V_Absolute_Scale(), called from V_ExecuteProtocol"
2257        endif
2258//      activeType = "ABS"
2259
2260
2261//////////////////////////////
2262// MASK
2263//////////////////////////////
2264//
2265// DONE
2266//              x- fill in the "ask" step
2267//  x- none is OK, except if the kill fails for any reason
2268// x- the regular case of the file name specified by the protocol works correctly
2269// x- don't create a null mask if not used, it will handle the error and print out that the mask is missing
2270//
2271//mask data if desired (mask is applied when the data is binned to I(q)) and is
2272//not done explicitly here
2273       
2274        //check for mask
2275        //doesn't change the activeType
2276        V_Proto_ReadMask(prot[3])
2277
2278       
2279//////////////////////////////
2280// AVERAGING
2281//////////////////////////////
2282
2283        // average/save data as specified
2284        //Parse the keyword=<Value> string as needed, based on AVTYPE
2285       
2286        //average/plot first
2287        String av_type = StringByKey("AVTYPE",prot[5],"=",";")
2288        If(cmpstr(av_type,"none") != 0)
2289                If (cmpstr(av_type,"")==0)              //if the key could not be found... (if "ask" the string)
2290                        //get the averaging parameters from the user, as if the set button was hit in the panel
2291                        V_SetAverageParamsButtonProc("dummy")           //from "ProtocolAsPanel"
2292                        SVAR tempAveStr = root:Packages:NIST:VSANS:Globals:Protocols:gAvgInfoStr
2293                        av_type = StringByKey("AVTYPE",tempAveStr,"=",";")
2294                else
2295                        //there is info in the string, use the protocol
2296                        //set the global keyword-string to prot[5]
2297                        String/G root:Packages:NIST:VSANS:Globals:Protocols:gAvgInfoStr = prot[5]
2298                Endif
2299        Endif
2300
2301
2302        String detGroup = StringByKey("DETGROUP",prot[5],"=",";")               //only for annular, null if not present
2303
2304       
2305//convert the folder to linear scale before averaging, then revert by calling the window hook
2306// (not needed for VSANS, data is always linear scale)
2307
2308//
2309// (DONE)
2310// -x this generates a "Bin Type Not Found" error if reducing only to a 2D level (like for DIV)
2311//              because binTypeStr is null
2312        String binTypeStr = StringByKey("BINTYPE",prot[5],"=",";")
2313        // plotting is not really necessary, and the graph may not be open - so skip for now?
2314        Variable binType
2315        // only get the binning type if user asks for averaging
2316        If(cmpstr(av_type,"none") != 0)
2317                binType = V_BinTypeStr2Num(binTypeStr)
2318                if(binType == 0)
2319                                Abort "Binning mode not found in V_QBinAllPanels() "// when no case matches
2320                endif
2321        endif
2322
2323
2324// identify the collimation type
2325// this will be a string used to determine how the resolution information is to be calculated
2326// and written to the reduced data file
2327//
2328// possible values are:
2329//
2330// pinhole
2331// pinhole_whiteBeam
2332// narrowSlit
2333// narrowSlit_whiteBeam
2334// convergingPinholes
2335//
2336
2337        String collimationStr
2338        collimationStr = V_IdentifyCollimation(activeType)
2339       
2340
2341////////////////////////////////////////
2342// DISPATCH TO AVERAGING
2343/////////////////////////////////////////
2344//
2345// TODO:
2346// -- do I calculate the proper resolution here?, YES, I've already decoded the binning type
2347//   and the averaging type has been specified by the protocol.
2348//
2349// so currently, the resolution is calculated every time that the data is averaged (in VC_fDoBinning_QxQy2D)
2350//
2351// -- if I calculate the resolution here, then the Trimming routines must be updated
2352//    to trim the resolution waves also. This will work for the columns present in
2353//    pinhole resolution, but anything using the matrix method - it won't work - and I'll need
2354//    a different solution
2355//
2356
2357        V_Proto_doAverage(prot[5],av_type,activeType,binType,collimationStr)
2358
2359
2360
2361////////////////////////
2362// PLOT THE DATA
2363////////////////////////
2364
2365        V_Proto_doPlot(prot[5],av_type,activeType,binType,detGroup)
2366       
2367       
2368
2369////////////////////   
2370// SAVE THE DATA
2371////////////////////
2372
2373//
2374// x- how do I get the sample file name?
2375//    local variable samFileLoaded is the file name loaded (contains the extension)
2376//
2377// V_Proto_SaveFile(avgStr,activeType,samFileLoaded,av_type,binType,detGroup,trimBegStr,trimEndStr)
2378
2379        prot[9] = collimationStr
2380
2381        V_Proto_SaveFile(prot[5],activeType,samFileLoaded,av_type,binType,detGroup,prot[7],prot[8])
2382       
2383//////////////////////////////
2384// DONE WITH THE PROTOCOL
2385////////////////////////////// 
2386       
2387        // reset any global preferences that I had changed
2388        gDoDIVCor = saved_gDoDIVCor
2389       
2390       
2391        Return(0)
2392End
2393
2394
2395
2396
2397
2398//missing parameter dialog to solicit the 4 absolute intensity parameters
2399//from the user
2400//values are passed back as a global string variable (keyword=value)
2401//
2402Proc V_AskForAbsoluteParams(c2,c3,c4,c5,I_err,back_values)
2403        Variable c2=1,c3=1,c4=1e8,c5=1,I_err=1
2404        String back_values="no"
2405        Prompt c2, "Standard Transmission"
2406        Prompt c3, "Standard Thickness (cm)"
2407        Prompt c4, "I(0) from standard fit (normalized to 1E8 monitor cts)"
2408        Prompt c5, "Standard Cross-Section (cm-1)"
2409        Prompt I_err, "error in I(q=0) (one std dev)"
2410        prompt back_values, "are these values for the back detector (yes/no)?"
2411       
2412        SetDataFolder root:Packages:NIST:VSANS:Globals:Protocols
2413       
2414        if(cmpstr(back_values,"no")==0)
2415                gAbsStr = ReplaceStringByKey("TSTAND",gAbsStr,num2str(c2),"=",";")
2416                gAbsStr = ReplaceStringByKey("DSTAND",gAbsStr,num2str(c3),"=",";")
2417                gAbsStr = ReplaceStringByKey("IZERO",gAbsStr,num2str(c4),"=",";")
2418                gAbsStr = ReplaceStringByKey("XSECT",gAbsStr,num2str(c5),"=",";")
2419                gAbsStr = ReplaceStringByKey("SDEV",gAbsStr,num2str(I_err),"=",";")
2420        else
2421                gAbsStr = ReplaceStringByKey("TSTAND_B",gAbsStr,num2str(c2),"=",";")
2422                gAbsStr = ReplaceStringByKey("DSTAND_B",gAbsStr,num2str(c3),"=",";")
2423                gAbsStr = ReplaceStringByKey("IZERO_B",gAbsStr,num2str(c4),"=",";")
2424                gAbsStr = ReplaceStringByKey("XSECT_B",gAbsStr,num2str(c5),"=",";")
2425                gAbsStr = ReplaceStringByKey("SDEV_B",gAbsStr,num2str(I_err),"=",";")
2426        endif
2427       
2428        gAbsStr = RemoveFromList("ask",gAbsStr)         //now that values are added, remove "ask"
2429
2430        SetDataFolder root:
2431End
2432
2433
2434//
2435// DONE
2436// x- fill in all of the functionality for calculation from direct beam
2437//  and verify that the calculations are numerically correct
2438//
2439//asks the user for absolute scaling information. the user can either
2440//enter the necessary values in manually (missing parameter dialog)
2441//or the user can select an empty beam file from a standard open dialog
2442//if an empty beam file is selected, the "kappa" value is automatically calculated
2443//in either case, the global keyword=value string is set.
2444//
2445//
2446// if isBack == 1, then the values are for the back panel
2447// AND there are different steps that must be done to subtract off
2448//  the read noise of the CCDs
2449//
2450Function V_AskForAbsoluteParams_Quest(isBack)   
2451        Variable isBack
2452       
2453        Variable err,loc,refnum
2454       
2455        Variable ii
2456       
2457        Variable kappa=1
2458        Variable kappa_err
2459               
2460        //get the necessary variables for the calculation of kappa
2461        Variable countTime,monCnt,sdd,pixel_x,pixel_y
2462        String detStr,junkStr,errStr
2463
2464        Variable empAttenFactor,        emp_atten_err
2465       
2466        //get the XY box and files
2467        Variable x1,x2,y1,y2,emptyCts,empty_ct_err
2468        String emptyFileName,tempStr,divFileName,detPanel_toSum
2469               
2470        //ask user if he wants to use a transmision file for absolute scaling
2471        //or if he wants to enter his own information
2472        err = V_UseStdOrEmpForABS()
2473        //DoAlert 1,"<Yes> to enter your own values, <No> to select an empty beam flux file"
2474        If ( err==1 )
2475                //secondary standard selected, prompt for values
2476                Execute "V_AskForAbsoluteParams()"              //missing parameters
2477        else
2478                //empty beam flux file selected, prompt for file, and use this to calculate KAPPA
2479
2480                // DONE
2481                // x- need an empty beam file name
2482                //
2483                Prompt emptyFileName,"Empty Beam File",popup,V_PickEMPBeamButton("")
2484                DoPrompt "Select File",emptyFileName
2485                if (V_Flag)
2486                        return 0                                                                        // user canceled
2487                endif
2488
2489                // DONE
2490                // x- need panel
2491                // x- now, look for the value in the file, if not there, ask
2492               
2493                detPanel_toSum = V_getReduction_BoxPanel(emptyFileName)
2494                if(strlen(detPanel_toSum) > 2)
2495                        // it's the error message
2496                        Prompt detPanel_toSum,"Panel with Direct Beam",popup,ksDetectorListAll
2497                        DoPrompt "Select Panel",detPanel_toSum
2498                        if (V_Flag)
2499                                return 0                                                                        // user canceled
2500                        endif
2501                endif
2502               
2503                //need the detector sensitivity file - make a guess, allow to override
2504                Prompt divFileName,"DIV File",popup,V_GetDIVList()
2505                DoPrompt "Select File",divFileName
2506                if (V_Flag)
2507                        return 0                                                                        // user canceled
2508                endif
2509                V_LoadHDF5Data(divFileName,"DIV")
2510
2511
2512                WAVE xyBoxW = V_getBoxCoordinates(emptyFileName)
2513
2514               
2515                // load in the data, and use all of the corrections, especially DIV
2516                // (be sure the corrections are actually set to "on", don't assume that they are)
2517                // save preferences for file loading
2518                Variable savDivPref,savSAPref
2519                NVAR gDoDIVCor = root:Packages:NIST:VSANS:Globals:gDoDIVCor
2520                savDivPref = gDoDIVCor
2521                NVAR gDoSolidAngleCor = root:Packages:NIST:VSANS:Globals:gDoSolidAngleCor
2522                savSAPref = gDoSolidAngleCor
2523               
2524                // set local preferences
2525                gDoDIVCor = 1
2526                gDoSolidAngleCor = 1
2527               
2528                V_LoadAndPlotRAW_wName(emptyFileName)
2529
2530                V_UpdateDisplayInformation("RAW")       
2531               
2532                // do the DIV correction
2533                if (gDoDIVCor == 1)
2534                        // need extra check here for file existence
2535                        // if not in DIV folder, load.
2536                        // if unable to load, skip correction and report error (Alert?) (Ask to Load?)
2537                        Print "Doing DIV correction"// for "+ detStr
2538                        for(ii=0;ii<ItemsInList(ksDetectorListAll);ii+=1)
2539                                detStr = StringFromList(ii, ksDetectorListAll, ";")
2540                                Wave w = V_getDetectorDataW("RAW",detStr)
2541                                Wave w_err = V_getDetectorDataErrW("RAW",detStr)
2542                               
2543                                V_DIVCorrection(w,w_err,detStr,"RAW")           // do the correction in-place
2544                        endfor
2545                else
2546                        Print "DIV correction NOT DONE"         // not an error since correction was unchecked
2547                endif
2548               
2549                // and determine box sum and error
2550                // store these locally
2551                Variable tmpReadNoiseLevel,tmpReadNoiseLevel_Err
2552
2553        // TODO: change the math to do the filtering and subtraction both here in this step,
2554        // then determine the patch sum and proper error propogation.
2555        //
2556        // just do the median filter now, do the background subtraction later on the patch
2557                if(isBack)
2558                        Wave w = V_getDetectorDataW("RAW","B")
2559                        NVAR gHighResBinning = root:Packages:NIST:VSANS:Globals:gHighResBinning
2560                        switch(gHighResBinning)
2561                                case 1:
2562                                        tmpReadNoiseLevel = kReadNoiseLevel_bin1                // a constant value
2563                                        tmpReadNoiseLevel_Err = kReadNoiseLevel_Err_bin1                // a constant value
2564                                       
2565//                                      MatrixFilter /N=11 /P=1 median w                        //              /P=n flag sets the number of passes (default is 1 pass)                         
2566//                                      Print "*** median noise filter 11x11 applied to the back detector (1 pass) ***"
2567                                        Print "*** 1x1 binning, NO FIlTER ***"
2568                                        break
2569                                case 4:
2570                                        tmpReadNoiseLevel = kReadNoiseLevel_bin4                // a constant value
2571                                        tmpReadNoiseLevel_Err = kReadNoiseLevel_Err_bin4                // a constant value
2572                                                                       
2573//                                      MatrixFilter /N=3 /P=3 median w                 //              /P=n flag sets the number of passes (default is 1 pass)
2574                                       
2575//                                      Print "*** median noise filter 3x3 applied to the back detector (3 passes) ***"
2576                                        Print "*** 4x4 binning, NO FIlTER ***"
2577
2578                                        break
2579                                default:
2580                                        Abort "No binning case matches in V_AskForAbsoluteParams_Quest"
2581                        endswitch
2582                       
2583                endif
2584
2585                emptyCts = V_SumCountsInBox(xyBoxW[0],xyBoxW[1],xyBoxW[2],xyBoxW[3],empty_ct_err,"RAW",detPanel_toSum)
2586
2587                Print "empty counts = ",emptyCts
2588                Print "empty err/counts = ",empty_ct_err/emptyCts
2589
2590                // if it's the back panel, find the read noise to subtract
2591                // shift the marquee to the right to (hopefully) a blank spot
2592                Variable noiseCts,noiseCtsErr,delta,nPixInBox
2593                if(isBack)
2594
2595               
2596//                      delta = xyBoxW[1] - xyBoxW[0]
2597//                      noiseCts = V_SumCountsInBox(xyBoxW[1],xyBoxW[1]+delta,xyBoxW[2],xyBoxW[3],noiseCtsErr,"RAW",detPanel_toSum)
2598//
2599//                      print "average read noise per pixel = ",noiseCts/(xyBoxW[1]-xyBoxW[0])/(xyBoxW[3]-xyBoxW[2])
2600//                      Print "read noise counts = ",noiseCts
2601//                      Print "read noise err/counts = ",noiseCtsErr/noiseCts
2602//                     
2603//                      emptyCts -= noiseCts
2604//                      empty_ct_err = sqrt(empty_ct_err^2 + noiseCtsErr^2)
2605
2606
2607// Instead, use the defined constant values             
2608//              kReadNoiseLevel
2609//              kReadNoiseLevel_Err
2610//
2611                        nPixInBox = (xyBoxW[1] - xyBoxW[0])*(xyBoxW[3]-xyBoxW[2])
2612                        emptyCts -= tmpReadNoiseLevel*nPixInBox
2613                        empty_ct_err = sqrt(empty_ct_err^2 + (tmpReadNoiseLevel_Err*nPixInBox)^2)
2614                                               
2615                        Print "adjusted empty counts = ",emptyCts
2616                        Print "adjusted err/counts = ",empty_ct_err/emptyCts
2617                endif
2618
2619//
2620                // x- get all of the proper values for the calculation
2621                // -x currently the attenuation is incorrect
2622                //   such that kappa_err = 1*kappa
2623                // x- verify the calculation (no solid angle needed??)
2624                               
2625                // get the attenuation factor for the empty beam
2626                //  -- the attenuation is not written by NICE to the file
2627                //  so I need to calculate it myself from the tables
2628                //
2629//              empAttenFactor = V_getAttenuator_transmission(emptyFileName)
2630//              emp_atten_err = V_getAttenuator_trans_err(emptyFileName)
2631                empAttenFactor = V_CalculateAttenuationFactor(emptyFileName)
2632                emp_atten_err = V_CalculateAttenuationError(emptyFileName)
2633                               
2634                countTime = V_getCount_time(emptyFileName)
2635               
2636                // TODO
2637                // -- not sure if this is the correct monitor count to use
2638                monCnt = V_getBeamMonNormData("RAW")
2639               
2640                pixel_x = V_getDet_x_pixel_size("RAW",detPanel_toSum)
2641                pixel_x /= 10           //convert mm to cm, since sdd in cm
2642                pixel_y = V_getDet_y_pixel_size("RAW",detPanel_toSum)
2643                pixel_y /= 10           //convert mm to cm, since sdd in cm
2644                sdd = V_getDet_ActualDistance("RAW",detPanel_toSum)
2645
2646//
2647// ** this kappa is different than for SANS!!
2648//     
2649// don't use the solid angle here -- the data (COR) that this factor is applied to will already be
2650// converted to counts per solid angle per pixel
2651//     
2652//              kappa = emptyCts/countTime/empAttenFactor*1.0e8/(monCnt/countTime)*(pixel_x*pixel_y/sdd^2)
2653                kappa = emptyCts/countTime/empAttenFactor*1.0e8/(monCnt/countTime)
2654               
2655               
2656                kappa_err = (empty_ct_err/emptyCts)^2 + (emp_atten_err/empAttenFactor)^2
2657                kappa_err = sqrt(kappa_err) * kappa
2658               
2659                // x- set the parameters in the global string
2660                junkStr = num2str(kappa)
2661                errStr = num2Str(kappa_err)
2662               
2663                String strToExecute=""
2664               
2665                if(isBack)
2666                        sprintf strToExecute, "V_AskForAbsoluteParams(1,1,%g,1,%g,\"%s\")",kappa,kappa_err,"yes"        //no missing parameters, no dialog
2667                else
2668                        sprintf strToExecute, "V_AskForAbsoluteParams(1,1,%g,1,%g,\"%s\")",kappa,kappa_err,"no" //no missing parameters, no dialog
2669                endif
2670//              print strToExecute
2671                Execute strToExecute
2672
2673                Printf "Kappa was successfully calculated as = %g +/- %g (%g %%)\r",kappa,kappa_err,(kappa_err/kappa)*100
2674       
2675                // restore preferences on exit
2676                gDoDIVCor = savDivPref
2677                gDoSolidAngleCor = savSAPref
2678
2679        Endif
2680       
2681End
2682
2683Function V_UserSelectBox_Continue(ctrlName) :buttonControl
2684        String ctrlName
2685       
2686        DoWindow/K junkWindow           //kill panel
2687end
2688
2689Function V_SelectABS_XYBox(x1,x2,y1,y2)
2690        Variable &x1,&x2,&y1,&y2
2691
2692
2693        Variable sc = 1
2694       
2695        NVAR gLaptopMode = root:Packages:NIST:VSANS:Globals:gLaptopMode
2696               
2697        if(gLaptopMode == 1)
2698                sc = 0.7
2699        endif
2700       
2701        Variable err=0
2702       
2703        Variable/G root:V_marquee=1             //sets the sneaky bit to automatically update marquee coords
2704        Variable/G root:V_left,root:V_right,root:V_bottom,root:V_top    //must be global for auto-update
2705        DoWindow/F SANS_Data
2706        NewPanel/K=2 /W=(139*sc,341*sc,382*sc,432*sc) as "Select the primary beam"
2707        DoWindow/C junkWindow
2708        AutoPositionWindow/E/M=1/R=SANS_Data
2709       
2710        Drawtext 21*sc,20*sc ,"Select the primary beam with the"
2711        DrawText 21*sc,40*sc, "marquee and press continue"
2712        Button button0,pos={sc*80,58*sc},size={sc*92,20*sc},title="Continue"
2713        Button button0,proc=V_UserSelectBox_Continue
2714       
2715        PauseForUser junkWindow,SANS_Data
2716       
2717        DoWindow/F SANS_Data
2718
2719        //GetMarquee left,bottom                        //not needed
2720        NVAR V_left=V_left
2721        NVAR V_right=V_right
2722        NVAR V_bottom=V_bottom
2723        NVAR V_top=V_top
2724       
2725        x1 = V_left
2726        x2 = V_right
2727        y1 = V_bottom
2728        y2 = V_top
2729//      Print "new values,before rounding = ",x1,x2,y1,y2
2730
2731// TODO -- replace this call
2732//      KeepSelectionInBounds(x1,x2,y1,y2)
2733        //Print "new values = ",x1,x2,y1,y2
2734       
2735        KillVariables/Z root:V_Marquee,root:V_left,root:V_right,root:V_bottom,root:V_top
2736        if((x1-x2)==0 || (y1-y2)==0)
2737                err=1
2738        endif
2739        return(err)
2740End
2741
2742Function V_UseStdOrEmpForABS()
2743       
2744        Variable sc = 1
2745       
2746        NVAR gLaptopMode = root:Packages:NIST:VSANS:Globals:gLaptopMode
2747               
2748        if(gLaptopMode == 1)
2749                sc = 0.7
2750        endif   
2751       
2752        NewPanel/K=2 /W=(139*sc,341*sc,402*sc,448*sc) as "Absolute Scaling"
2753        DoWindow/C junkABSWindow
2754        ModifyPanel cbRGB=(57346,65535,49151)
2755        SetDrawLayer UserBack
2756        SetDrawEnv fstyle= 1,fsize=12*sc
2757        DrawText 21*sc,20*sc,"Method of absolute calibration"
2758        Button button0,pos={sc*52,33*sc},size={sc*150,20*sc},proc=V_UserSelectABS_Continue,title="Empty Beam Flux"
2759        Button button1,pos={sc*52,65*sc},size={sc*150,20*sc},proc=V_UserSelectABS_Continue,title="Secondary Standard"
2760       
2761        PauseForUser junkABSWindow
2762        NVAR val = root:Packages:NIST:VSANS:Globals:tmpAbsVal
2763        return(val)
2764End
2765
2766//returns 0 if button0 (empty beam flux)
2767// or 1 if secondary standard
2768Function V_UserSelectABS_Continue(ctrlName) :buttonControl
2769        String ctrlName
2770       
2771        variable val=0
2772        If(cmpstr(ctrlName,"button0")==0)
2773                val=0           
2774        else
2775                val=1
2776        endif
2777//      print "val = ",ctrlName,val
2778        Variable/G root:Packages:NIST:VSANS:Globals:tmpAbsVal = val
2779        DoWindow/K junkABSWindow                //kill panel
2780        return(0)
2781end
2782
2783
2784Function V_TrimDataProtoButton(ctrlName) :buttonControl
2785        String ctrlName
2786       
2787        Execute "V_CombineDataGraph()"
2788        return(0)
2789end
2790
2791//
2792// export protocol to a data file
2793//
2794//
2795Function V_ExportFileProtocol(ctrlName) : ButtonControl
2796        String ctrlName
2797// get a list of protocols
2798        String Protocol=""
2799        SetDataFolder root:Packages:NIST:VSANS:Globals:Protocols
2800        Prompt Protocol "Pick A Protocol",popup, V_DeletableProtocols()
2801        DoPrompt "Pick A Protocol to Export",Protocol
2802        if(V_flag==1)
2803                //Print "user cancel"
2804                SetDatafolder root:
2805                return(1)
2806        endif
2807
2808        String fileName = V_DoSaveFileDialog("pick the file to write to")
2809        print fileName
2810//     
2811        if(strlen(fileName) == 0)
2812                return(0)
2813        endif
2814
2815        V_writeReductionProtocolWave(fileName,$("root:Packages:NIST:VSANS:Globals:Protocols:"+Protocol) )
2816
2817        setDataFolder root:
2818        return(0)
2819
2820End
2821
2822//
2823// imports a protocol from a file on disk into the protocols folder
2824//
2825//
2826Function V_ImportFileProtocol(ctrlName) : ButtonControl
2827        String ctrlName
2828
2829//      SetDataFolder root:Packages:NIST:VSANS:Globals:Protocols
2830
2831        String fullPath,fileName
2832        fullPath = DoOpenFileDialog("Import Protocol from file")
2833        print fullPath
2834//     
2835        if(strlen(fullPath) == 0)
2836                return(0)
2837        endif
2838       
2839        fileName = ParseFilePath(0, fullPath, ":", 1, 0)                        //just the file name at the end of the full path
2840       
2841        Wave/T tmpW = V_getReductionProtocolWave(fileName)
2842        if(numpnts(tmpW) == 0)
2843                DoAlert 0,"No protocol wave has been saved to this data file"
2844                return(0)
2845        endif
2846       
2847        SetDataFolder root:Packages:NIST:VSANS:Globals:Protocols
2848        String newName
2849        newName = CleanupName(fileName,0) + "_proto"
2850        duplicate/o tmpw $newName
2851       
2852       
2853        SetDataFolder root:
2854        return(0)
2855end
2856
2857
2858// currently not used - and not updated to 12 point protocols (5/2017)
2859//
2860//save the protocol as an IGOR text wave (.itx)
2861//
2862//
2863Function V_ExportProtocol(ctrlName) : ButtonControl
2864        String ctrlName
2865// get a list of protocols
2866        String Protocol=""
2867        SetDataFolder root:Packages:NIST:VSANS:Globals:Protocols
2868        Prompt Protocol "Pick A Protocol",popup, WaveList("*",";","")
2869        DoPrompt "Pick A Protocol to Export",Protocol
2870        if(V_flag==1)
2871                //Print "user cancel"
2872                SetDatafolder root:
2873                return(1)
2874        endif
2875//get the selection, or exit
2876        Wave/T pW= $protocol
2877        Make/O/T/N=13 tw
2878// save in the proper format (must write manually, for demo version)
2879        tw[0] = "IGOR"
2880        tw[1] = "WAVES/T \t"+protocol
2881        tw[2] = "BEGIN"
2882        tw[3,10] = "\t\""+pW[p-3]+"\""
2883        tw[11] = "END"
2884        tw[12] = "X SetScale/P x 0,1,\"\","+protocol+"; SetScale y 0,0,\"\","+protocol
2885       
2886        Variable refnum
2887        String fullPath
2888       
2889        PathInfo/S catPathName
2890        fullPath = DoSaveFileDialog("Export Protocol as",fname=Protocol,suffix="")
2891        If(cmpstr(fullPath,"")==0)
2892                //user cancel, don't write out a file
2893                Close/A
2894                Abort "no Protocol file was written"
2895        Endif
2896
2897        //actually open the file
2898        Open refNum as fullpath+".itx"
2899       
2900        wfprintf refnum, "%s\r", tw
2901        Close refnum
2902        //Print "all is well  ",protocol
2903        KillWaves/Z tw
2904        setDataFolder root:
2905        return(0)
2906
2907End
2908
2909
2910// currently not used - and not updated to 12 point protocols (5/2017)
2911//imports a protocol from disk into the protocols folder
2912//
2913// will overwrite existing protocols if necessary
2914//
2915//
2916Function V_ImportProtocol(ctrlName) : ButtonControl
2917        String ctrlName
2918
2919        SetDataFolder root:Packages:NIST:VSANS:Globals:Protocols
2920
2921        String fullPath
2922       
2923        PathInfo/S catPathName
2924        fullPath = DoOpenFileDialog("Import Protocol")
2925        If(cmpstr(fullPath,"")==0)
2926                //user cancel, don't write out a file
2927                Close/A
2928                Abort "no protocol was loaded"
2929        Endif
2930       
2931        LoadWave/O/T fullPath
2932       
2933        SetDataFolder root:
2934        return(0)
2935end
2936
2937
2938///////////////////////////////////////
2939//
2940// individual steps in the protocol
2941//
2942//////////////////////////////////////
2943
2944Function V_Proto_LoadDIV(protStr)
2945        String protStr
2946       
2947        String divFileName = "",junkStr="",pathStr=""
2948        PathInfo catPathName                    //this is where the files are
2949        pathStr=S_path
2950
2951        If(cmpstr("none",protStr)!=0)           // if !0, then there's a file requested
2952                If(cmpstr("ask",protStr) == 0)
2953                        //ask user for file
2954//                       junkStr = PromptForPath("Select the detector sensitivity file")
2955                        Prompt divFileName,"DIV File",popup,V_GetDIVList()
2956                        DoPrompt "Select File",divFileName
2957
2958                        If(strlen(divFileName)==0)
2959                                //
2960                                return(1)               //error
2961//                              SetDataFolder root:
2962//                              Abort "No file selected, data reduction aborted"
2963                        Endif
2964                        V_LoadHDF5Data(divFileName,"DIV")
2965                else
2966                        //assume it's a path, and that the first (and only) item is the path:file
2967                        //list processing is necessary to remove any final comma
2968                        junkStr = pathStr + StringFromList(0, protStr,"," )
2969                        V_LoadHDF5Data(junkStr,"DIV")
2970                Endif
2971       
2972        else
2973        // DIV step is being skipped
2974                NVAR gDoDIVCor = root:Packages:NIST:VSANS:Globals:gDoDIVCor
2975//              Variable saved_gDoDIVCor = gDoDIVCor
2976                gDoDIVCor = 0                   // protocol says to turn it off for now (reset later)
2977        Endif
2978       
2979        return(0)
2980End
2981
2982//
2983// fileStr is the file name (or list of names)
2984// activeType is the target work folder
2985// msgStr is the string for the prompt
2986//
2987Function V_Proto_LoadFile(fileStr,activeType,msgStr)
2988        String fileStr,activeType,msgStr
2989       
2990        Variable err,filesOK,notDone
2991       
2992        //Ask for Type file or parse
2993        do
2994                if((cmpstr(fileStr,"ask") == 0) || (cmpstr(fileStr,"")==0) )            //zero if strings are equal
2995                        err = V_LoadHDF5Data("","RAW")          //will prompt for file
2996                        if(err)
2997                                return(err)     //error
2998                                //PathInfo/S catPathName
2999                                //Abort "reduction sequence aborted"
3000                        endif
3001                        V_UpdateDisplayInformation("RAW")                       //display the new type of data that was loaded
3002                        err =  V_Raw_to_work(activeType)                //this is the first file (default)
3003                        //Ask for another TYPE file
3004                        do
3005                                DoAlert 1,"Do you want to add another "+activeType+" file?"
3006                                if(V_flag == 1)         //yes
3007                                        err = V_LoadHDF5Data("","RAW")          //will prompt for file
3008                                        if(err)
3009                                                return(1)               //error
3010                                                //PathInfo/S catPathName
3011                                                //Abort "reduction sequence aborted"
3012                                        endif
3013                                        V_UpdateDisplayInformation("RAW")                       //display the new type of data that was loaded
3014                                        err = V_Add_raw_to_work(activeType)
3015                                        notDone = 1
3016                                else
3017                                        notDone = 0
3018                                endif
3019                        while(notDone)
3020                        //Loader is in charge of updating, since it knows if data was loaded
3021                        V_UpdateDisplayInformation(ActiveType)
3022                        break
3023                Endif
3024                //"none" is not an option - you always need a sample file - "none" will never return zero
3025                //if not "ask" AND not "none" then try to parse the filenames
3026                If((cmpstr(fileStr,"none") != 0) && (cmpstr(fileStr,"ask") != 0))
3027                        //filesOK = AreFilesThere(activeType,fileStr)           //return 1 if correct files are already there
3028                        filesOK = 0             // Feb 2008, always force a reload of files. Maybe slow, but always correct
3029                        if(!filesOK)
3030                                //add the correct file(s) to Type
3031                               
3032                                // TODO: only one file is allowed currently
3033                                err = V_AddFilesInList(activeType,fileStr)
3034                               
3035                                if(err)
3036                                        //Print "fileStr = ",fileStr
3037                                        DoAlert 0, fileStr + " file not found, reset file"
3038                                        return(err)             //error
3039                                Endif
3040                        Endif
3041                        //Loader is in charge of updating, since it knows if data was loaded
3042                        V_UpdateDisplayInformation(ActiveType)
3043                Endif
3044        While(0)
3045       
3046
3047       
3048        return(0)
3049End
3050
3051Function V_Dispatch_to_Correct(bgdStr,empStr,drkStr)
3052        String bgdStr,empStr,drkStr
3053       
3054        Variable mode=4,val,err
3055       
3056        if( (cmpstr("none",bgdStr) == 0)        && (cmpstr("none",empStr) == 0) )
3057        //no subtraction (mode = 4),
3058                mode = 4
3059        Endif
3060        If((cmpstr(bgdStr,"none") != 0) && (cmpstr(empStr,"none") == 0))
3061                //subtract BGD only
3062                mode=2
3063        Endif
3064        If((cmpstr(bgdStr,"none") == 0) && (cmpstr(empStr,"none") != 0))
3065                //subtract EMP only
3066                mode=3
3067        Endif
3068        If((cmpstr(bgdStr,"none") != 0) && (cmpstr(empStr,"none") != 0))
3069                // bkg and emp subtraction are to be done (BOTH not "none")
3070                mode=1
3071        Endif
3072//      activeType = "COR"
3073        //add in DRK mode (0= not used, 10 = used)
3074        // TODO: DRK has been de-activated for now
3075//      val = NumberByKey("DRKMODE",drkStr,"=","," )
3076//      mode += val
3077
3078//              print "mode = ",mode
3079
3080        err = V_Correct(mode)
3081        if(err)
3082                return(err)
3083//              SetDataFolder root:
3084//              Abort "error in Correct, called from executeprotocol, normal cor"
3085        endif
3086
3087//      //Loader is in charge of updating, since it knows if data was loaded
3088//      V_UpdateDisplayInformation("COR")
3089
3090       
3091        return(0)
3092End
3093
3094
3095
3096
3097Function V_Proto_ABS_Scale(absStr,activeType)
3098        String absStr,&activeType
3099       
3100        Variable c2,c3,c4,c5,kappa_err,err
3101        //do absolute scaling if desired
3102
3103        if(cmpstr("none",absStr)!=0)
3104                if(cmpstr("ask",absStr)==0)
3105//                      //get the params from the user
3106//                      Execute "V_AskForAbsoluteParams_Quest()"
3107//                      //then from the list
3108//                      SVAR junkAbsStr = root:Packages:NIST:VSANS:Globals:Protocols:gAbsStr
3109//                      c2 = NumberByKey("TSTAND", junkAbsStr, "=", ";")        //parse the list of values
3110//                      c3 = NumberByKey("DSTAND", junkAbsStr, "=", ";")
3111//                      c4 = NumberByKey("IZERO", junkAbsStr, "=", ";")
3112//                      c5 = NumberByKey("XSECT", junkAbsStr, "=", ";")
3113//                      kappa_err = NumberByKey("SDEV", junkAbsStr, "=", ";")
3114                else
3115                        //get the parames from the list
3116                        c2 = NumberByKey("TSTAND", absStr, "=", ";")    //parse the list of values
3117                        c3 = NumberByKey("DSTAND", absStr, "=", ";")
3118                        c4 = NumberByKey("IZERO", absStr, "=", ";")
3119                        c5 = NumberByKey("XSECT", absStr, "=", ";")
3120                        kappa_err = NumberByKey("SDEV", absStr, "=", ";")
3121                Endif
3122                //get the sample trans and thickness from the activeType folder
3123//              Variable c0 = V_getSampleTransmission(activeType)               //sample transmission
3124//              Variable c1 = V_getSampleThickness(activeType)          //sample thickness
3125               
3126                err = V_Absolute_Scale(activeType,absStr)
3127                if(err)
3128                        return(err)
3129                        SetDataFolder root:
3130                        Abort "Error in V_Absolute_Scale(), called from V_ExecuteProtocol"
3131                endif
3132                activeType = "ABS"
3133                V_UpdateDisplayInformation(ActiveType)                  //update before breaking from loop
3134        Endif
3135       
3136        return(0)
3137End
3138
3139
3140Function V_Proto_ReadMask(maskStr)
3141        String maskStr
3142       
3143        //check for mask
3144        //doesn't change the activeType
3145        String mskFileName="",pathStr=""
3146        PathInfo catPathName                    //this is where the files are
3147        pathStr=S_path
3148               
3149        if(cmpstr("none",maskStr)!=0)
3150                If(cmpstr("ask",maskStr)==0)
3151                        //get file from user
3152                        // x- fill in the get file prompt, and handle the result
3153                        Prompt mskFileName,"MASK File",popup,V_PickMASKButton("")
3154                        DoPrompt "Select File",mskFileName
3155//                      if (V_Flag)
3156//                              return 0                                                                        // user cancelled
3157//                      endif
3158
3159                        If(strlen(mskFileName)==0)              //use cancelled
3160                                //if none desired, make sure that the old mask is deleted
3161                                KillDataFolder/Z root:Packages:NIST:VSANS:MSK:
3162                                NewDataFolder/O root:Packages:NIST:VSANS:MSK
3163                               
3164                                DoAlert 0,"No Mask file selected, data not masked"
3165                        else
3166                                //read in the file from the selection
3167                                V_LoadHDF5Data(mskFileName,"MSK")
3168                        Endif
3169                else
3170                        //just read it in from the protocol
3171                        //list processing is necessary to remove any final comma
3172                        mskFileName = pathStr + StringFromList(0, maskStr,"," )
3173                        V_LoadHDF5Data(mskFileName,"MSK")
3174                Endif
3175               
3176        else
3177                //if none desired, make sure that the old mask is deleted
3178// TODO
3179// x- clean out the data folder
3180// x- note that V_KillNamedDataFolder() points to RawVSANS, and won't work
3181// -- what happens if the kill fails? need error handling
3182//
3183                KillDataFolder/Z root:Packages:NIST:VSANS:MSK:
3184                NewDataFolder/O root:Packages:NIST:VSANS:MSK
3185
3186        Endif
3187       
3188        return(0)
3189End
3190
3191
3192Function V_Proto_doAverage(avgStr,av_type,activeType,binType,collimationStr)
3193        String avgStr,av_type,activeType
3194        Variable binType
3195        String collimationStr
3196       
3197       
3198        strswitch(av_type)      //dispatch to the proper routine to average to 1D data
3199                case "none":           
3200                        //still do nothing
3201                        // set binType and binTypeStr to bad flags
3202                        String binTypeStr = "none"
3203                        binType = -999999
3204                        break                   
3205
3206                case "Circular":
3207                        V_QBinAllPanels_Circular(activeType,binType,collimationStr)             // this does a default circular average
3208                        break
3209                       
3210                case "Sector":
3211                        String side = StringByKey("SIDE",avgStr,"=",";")
3212                        Variable phi_rad = (Pi/180)*NumberByKey("PHI",avgStr,"=",";")           //in radians
3213                        Variable dphi_rad = (Pi/180)*NumberByKey("DPHI",avgStr,"=",";")
3214                        V_QBinAllPanels_Sector(activeType,binType,collimationStr,side,phi_rad,dphi_rad)
3215                        break
3216                case "Sector_PlusMinus":
3217//                      Sector_PlusMinus1D(activeType)
3218                        break
3219                case "Rectangular":
3220//                      RectangularAverageTo1D(activeType)
3221                        break
3222
3223                case "Annular":
3224                        String detGroup = StringByKey("DETGROUP",avgStr,"=",";")
3225                        Variable qCtr_Ann = NumberByKey("QCENTER",avgStr,"=",";")
3226                        Variable qWidth = NumberByKey("QDELTA",avgStr,"=",";")
3227                        V_QBinAllPanels_Annular(activeType,detGroup,qCtr_Ann,qWidth)
3228                        break
3229
3230                case "Narrow_Slit":
3231                        V_QBinAllPanels_Slit(activeType,binType)                // this does a tall, narrow slit average
3232                        break
3233                       
3234                case "2D_ASCII":       
3235                        //do nothing
3236                        break
3237                case "QxQy_ASCII":
3238                        //do nothing
3239                        break
3240                case "PNG_Graphic":
3241                        //do nothing
3242                        break
3243                default:       
3244                        //do nothing
3245        endswitch
3246
3247       
3248        return(0)
3249End
3250
3251
3252
3253
3254
3255Function V_Proto_doPlot(plotStr,av_type,activeType,binType,detGroup)
3256        String plotStr,av_type,activeType
3257        Variable binType
3258        String detGroup
3259       
3260        String doPlot = StringByKey("PLOT",plotStr,"=",";")
3261       
3262        If( (cmpstr(doPlot,"Yes")==0) && (cmpstr(av_type,"none") != 0) )       
3263               
3264                strswitch(av_type)      //dispatch to the proper routine to PLOT 1D data
3265                        case "none":           
3266                                //still do nothing
3267                                break                   
3268
3269                        case "Circular":
3270                        case "Sector":
3271                                V_PlotData_Panel()              //this brings the plot window to the front, or draws it (ONLY)
3272                                V_Update1D_Graph(activeType,binType)            //update the graph, data was already binned                             
3273                                break
3274                        case "Sector_PlusMinus":
3275        //                      Sector_PlusMinus1D(activeType)
3276                                break
3277                        case "Rectangular":
3278        //                      RectangularAverageTo1D(activeType)
3279                                break
3280
3281                        case "Annular":
3282                                V_Phi_Graph_Proc(activeType,detGroup)
3283                                break
3284
3285                        case "Narrow_Slit":
3286                        // these are the same plotting routines as for standard circular average
3287                                V_PlotData_Panel()              //this brings the plot window to the front, or draws it (ONLY)
3288                                V_Update1D_Graph(activeType,binType)            //update the graph, data was already binned
3289                                break
3290                       
3291                        case "2D_ASCII":       
3292                                //do nothing
3293                                break
3294                        case "QxQy_ASCII":
3295                                //do nothing
3296                                break
3297                        case "PNG_Graphic":
3298                                //do nothing
3299                                break
3300                        default:       
3301                                //do nothing
3302                endswitch
3303
3304        endif           // end of plotting switch
3305       
3306        return(0)
3307end
3308
3309
3310Function V_Proto_SaveFile(avgStr,activeType,samFileLoaded,av_type,binType,detGroup,trimBegStr,trimEndStr)
3311        String avgStr,activeType,samFileLoaded,av_type
3312        Variable binType
3313        String detGroup,trimBegStr,trimEndStr
3314       
3315        String fullpath = "", newfileName=""
3316        String saveType = StringByKey("SAVE",avgStr,"=",";")            //does user want to save data?
3317
3318        NVAR gIgnoreBackDet = root:Packages:NIST:VSANS:Globals:gIgnoreDetB
3319
3320
3321        If( (cmpstr(saveType[0,2],"Yes")==0) && (cmpstr(av_type,"none") != 0) )         
3322                //then save
3323                newFileName = RemoveEnding(samFileLoaded,".nxs.ngv")
3324               
3325                //pick ABS or AVE extension
3326                String exten = activeType
3327                if(cmpstr(exten,"ABS") != 0)
3328                        exten = "AVE"
3329                endif
3330//              if(cmpstr(av_type,"2D_ASCII") == 0)
3331//                      exten = "ASC"
3332//              endif
3333//              if(cmpstr(av_type,"QxQy_ASCII") == 0)
3334//                      exten = "DAT"
3335//              endif
3336               
3337//              // add an "x" to the file extension if the output is XML
3338//              // currently (2010), only for ABS and AVE (1D) output
3339//              if( cmpstr(exten,"ABS") == 0 || cmpstr(exten,"AVE") == 0 )
3340//                      if(useXMLOutput == 1)
3341//                              exten += "x"
3342//                      endif
3343//              endif
3344                               
3345                //Path is catPathName, symbolic path
3346                //if this doesn't exist, a dialog will be presented by setting dialog = 1
3347                //
3348                Variable dialog = 0
3349
3350                PathInfo/S catPathName
3351                String item = StringByKey("NAME",avgStr,"=",";")                //Auto or Manual naming
3352                String autoname = StringByKey("AUTONAME",avgStr,"=",";")                //autoname -  will get empty string if not present
3353                If((cmpstr(item,"Manual")==0) || (cmpstr(newFileName,"") == 0))
3354                        //manual name if requested or if no name can be derived from header
3355                        fullPath = newfileName + "."+ exten //puts possible new name or null string in dialog
3356                        dialog = 1              //force dialog for user to enter name
3357                else
3358                        //auto-generate name and prepend path - won't put up any dialogs since it has all it needs
3359                        //use autoname if present
3360                        if (cmpstr(autoname,"") != 0)
3361                                fullPath = S_Path + autoname + "." +exten
3362                        else
3363                                fullPath = S_Path + newFileName+"." + exten
3364                        endif   
3365                Endif
3366                //
3367                strswitch(av_type)     
3368                        case "Annular":
3369                                V_fWrite1DAnnular("root:Packages:NIST:VSANS:",activeType,detGroup,newFileName+".phi")
3370                                Print "data written to:  "+ newFileName+".phi"
3371
3372                                break
3373
3374                        case "Circular":                //in SANS, this was the default, but is dangerous, so make it explicit here
3375                        case "Sector":          // TODO: this falls through - which luckily works for now...
3376                        case "Rectangular":             // TODO: this falls through - which luckily works for now...
3377                        case "Narrow_Slit":             // TODO: this falls through - which luckily works for now...
3378
3379// no VSANS support of XML output at this point                 
3380//                              if (useXMLOutput == 1)
3381//                                      WriteXMLWaves_W_Protocol(activeType,fullPath,dialog)
3382//                              else
3383//                                      WriteWaves_W_Protocol(activeType,fullpath,dialog)
3384//                              endif
3385//
3386                                if(cmpstr(saveType,"Yes - Concatenate")==0)
3387                                        V_Trim1DDataStr(activeType,binType,trimBegStr,trimEndStr)                       // x- passing null strings uses global or default trim values
3388
3389                                        V_ConcatenateForSave("root:Packages:NIST:VSANS:",activeType,"",binType)         // this removes q=0 point, concatenates, sorts
3390                               
3391                                        V_RemoveDuplicateQvals("root:Packages:NIST:VSANS:",activeType)          // works with the "tmp_x" waves from concatenateForSave
3392//                                      prot[9] = collimationStr
3393                                       
3394                                        V_Write1DData("root:Packages:NIST:VSANS:",activeType,newFileName+"."+exten)             //don't pass the full path, just the name
3395                                        Print "data written to:  "+ newFileName+"."+exten
3396                                endif
3397                               
3398                                if(cmpstr(saveType,"Yes - Individual")==0)
3399                                        // remove the q=0 point from the back detector, if it's there
3400                                        // does not trim any other points from the data
3401                                        if(!gIgnoreBackDet)
3402                                                V_RemoveQ0_B(activeType)
3403                                        endif
3404//                                      V_Write1DData_ITX("root:Packages:NIST:VSANS:",activeType,newFileName,binType)
3405
3406                                        V_Write1DData_Individual("root:Packages:NIST:VSANS:",activeType,newFileName,exten,binType)
3407                                endif
3408
3409                                break
3410       
3411                               
3412                        case "2D_ASCII":
3413//                              Fast2DExport(activeType,fullPath,dialog)
3414                                break
3415                        case "QxQy_ASCII":
3416                                fullPath = S_Path + newFileName  //+".DAT"              add the .DAT and detector panel in the writer, not here
3417                                V_QxQy_Export(activeType,fullPath,newFileName,dialog)
3418                                break
3419                        case "PNG_Graphic":
3420//                              SaveAsPNG(activeType,fullpath,dialog)
3421                                break
3422
3423                        default:
3424                                DoAlert 0, "av_type not found in dispatch to write file"
3425                endswitch
3426               
3427        Endif   
3428        return(0)
3429End
3430
3431
Note: See TracBrowser for help on using the repository browser.