source: sans/Dev/trunk/NCNR_User_Procedures/Reduction/VSANS/V_Transmission.ipf @ 1083

Last change on this file since 1083 was 1083, checked in by srkline, 4 years ago

minor changes to allow patching of more incorrect metadata

added simple way to estimate beam centers from a single measurement (stiil to be thoroughly verified!)

File size: 14.2 KB
Line 
1#pragma TextEncoding = "MacRoman"
2#pragma rtGlobals=3             // Use modern global access method and strict wave access.
3
4
5
6// TODO
7// -- initialization
8// x- link to main panel
9//
10// ?? redesign the panel based on the CATALOG?
11// -- refresh the catalog, then work with those waves?
12//
13// -- this still seems to be very awkward to use. Come up with something better
14//
15// -- need more checks - be sure that the files match
16// -- SDD, wavelength, beam on proper panel, etc.
17//
18// -- need popups (transmission, open) to respond to popup changes and
19//   update their fields, since they may be auto-located incorrectly.
20//
21
22// TODO
23// -- currently, the initialization does nothing.
24Function V_InitTransmissionPanel()
25       
26        DoWindow/F V_TransmissionPanel
27        if(V_Flag == 0)
28                Execute "V_TransmissionPanel()"
29        endif
30End
31
32
33Window V_TransmissionPanel() : Panel
34        PauseUpdate; Silent 1           // building window...
35        NewPanel /W=(1286,328,1764,952)
36        ModifyPanel cbRGB=(32896,16448,0,19621)
37        DoWindow/C V_TransmissionPanel
38
39//      ShowTools/A
40        PopupMenu popup_0,pos={19.00,55.00},size={86.00,23.00},proc=V_TSamFilePopMenuProc,title="Sample"
41        PopupMenu popup_0,mode=1,value= V_getFilePurposeList("SCATTERING",0)//+V_getFileIntentList("EMPTY CELL",0)
42        PopupMenu popup_1,pos={102,248},size={72.00,23.00},proc=V_TTransmFilePopMenuProc,title="Transmission"
43        PopupMenu popup_1,mode=1,value= V_getFilePurposeList("TRANSMISSION",0)
44        PopupMenu popup_2,pos={164,353},size={72.00,23.00},proc=V_TEmpBeamPopMenuProc,title="Open Beam"
45//      PopupMenu popup_2,mode=1,value= V_getFileIntentList("EMPTY BEAM",0)
46        PopupMenu popup_2,mode=1,value= V_getFileIntentList("OPEN BEAM",0)
47        Button button_0,pos={37,193},size={100.00,20.00},proc=V_CalcTransmButtonProc,title="Calculate"
48//      Button button_1,pos={23.00,491.00},size={100.00,20.00},proc=V_WriteTransmButtonProc,title="Write"
49        Button button_2,pos={349.00,13.00},size={30.00,20.00},proc=V_HelpTransmButtonProc,title="?"
50        Button button_3,pos={410.00,13.00},size={50.00,20.00},proc=V_DoneTransmButtonProc,title="Done"
51        SetVariable setvar_0,pos={21.00,86.00},size={300.00,14.00},title="Label:"
52        SetVariable setvar_0,limits={-inf,inf,0},value= _STR:"file label"
53        SetVariable setvar_1,pos={21.00,113.00},size={300.00,14.00},title="Group ID:"
54        SetVariable setvar_1,limits={-inf,inf,0},value= VSANS_RED_VERSION
55        SetVariable setvar_2,pos={105,276.00},size={300.00,14.00},title="Label:"
56        SetVariable setvar_2,limits={-inf,inf,0},value= _STR:"file label"
57        SetVariable setvar_3,pos={104,302},size={300.00,14.00},title="Group ID:"
58        SetVariable setvar_3,limits={-inf,inf,0},value= VSANS_RED_VERSION
59        SetVariable setvar_4,pos={165,382},size={300.00,14.00},title="Label:"
60        SetVariable setvar_4,limits={-inf,inf,0},value= _STR:"file label"
61        SetVariable setvar_5,pos={165,406},size={300.00,14.00},title="XY Box:"
62        SetVariable setvar_5,limits={-inf,inf,0},value= _STR:"dummy"
63        SetVariable setvar_6,pos={165,431},size={300.00,14.00},title="Panel:"
64        SetVariable setvar_6,limits={-inf,inf,0},value= _STR:"dummy"
65        SetVariable setvar_7,pos={21,138},size={300.00,14.00},title="Transmission:"
66        SetVariable setvar_7,limits={-inf,inf,0},value= VSANS_RED_VERSION
67        SetVariable setvar_8,pos={21,163},size={300.00,14.00},title="Error:"
68        SetVariable setvar_8,limits={-inf,inf,0},value= VSANS_RED_VERSION
69EndMacro
70
71// TODO
72// -- fill in the details
73// -- currently, I pick these from the Catalog, for speed
74// -- ? is the catalog current?
75// -- T error is not part of the Catalog - is that OK?
76//
77// when the SAM file menu is popped:
78//  fill in the fields:
79// x- label
80// x- group id
81// x- transmission
82// -- T error
83//
84Function V_TSamFilePopMenuProc(pa) : PopupMenuControl
85        STRUCT WMPopupAction &pa
86
87        switch( pa.eventCode )
88                case 2: // mouse up
89                        Variable popNum = pa.popNum
90                        String popStr = pa.popStr
91                       
92                        Variable ii,np
93                       
94                        WAVE/T fileNameW = root:Packages:NIST:VSANS:CatVSHeaderInfo:Filenames
95                        WAVE/T labelW = root:Packages:NIST:VSANS:CatVSHeaderInfo:Labels
96                        WAVE groupIDW = root:Packages:NIST:VSANS:CatVSHeaderInfo:Group_ID
97                        WAVE transmW = root:Packages:NIST:VSANS:CatVSHeaderInfo:Transmission
98                        WAVE/T intentW = root:Packages:NIST:VSANS:CatVSHeaderInfo:Intent
99                       
100                        // TODO
101                        // I don't have a wave for the transmission error value, so it's not displayed here
102                        // -- do I read it in, or just ignore it...     
103                        np = numpnts(labelW)            //fileNameW is LONGER - so don't use numpnts(fileWave)
104                        for(ii=0;ii<np;ii+=1)
105                                if(cmpstr(fileNameW[ii],popStr)==0)
106                               
107                                        SetVariable setvar_0,value=labelW[ii]
108                                        SetVariable setvar_1,value=groupIDW[ii]
109                                        SetVariable setvar_7,value=transmW[ii]
110                                        break           //found, get out
111                                endif           
112                        endfor
113               
114                // loop back through to find the transmission file with the matching group id
115                // TODO x- set the popup string to the matching name on exit
116                        Variable targetID = groupIDW[ii]
117//                      String list = V_getFilePurposeList("TRANSMISSION",0)
118                        String list = V_getFileIntentPurposeList("SAMPLE","TRANSMISSION",0)
119                       
120                        WAVE/T purposeW = root:Packages:NIST:VSANS:CatVSHeaderInfo:Purpose
121                        for(ii=0;ii<np;ii+=1)
122                                if(cmpstr(purposeW[ii],"TRANSMISSION")==0 && cmpstr(intentW[ii],"SAMPLE")==0 && groupIDW[ii] == targetID)
123                                        Print "transmission file match at ",filenameW[ii]
124                                        SetVariable setvar_2,value=labelW[ii]
125                                        SetVariable setvar_3,value=groupIDW[ii]
126                                        PopupMenu popup_1,mode=WhichListItem(fileNameW[ii], list )+1,popValue=fileNameW[ii]
127                                        break
128                                endif           
129                        endfor
130
131                // now loop back through to find the empty beam file
132                // TODO
133                // x- fill in the XY box
134                // x-  Detector Panel field is hard-wired for "B"
135                // -- do I use "EMPTY BEAM", "OPEN BEAM" or both?? I think "OPEN BEAM" is what NICE will use in a drop-down menu
136                //     
137//                      list = V_getFileIntentList("EMPTY BEAM",0)
138                        list = V_getFileIntentList("OPEN BEAM",0)
139                       
140                        for(ii=0;ii<np;ii+=1)
141                                if(cmpstr(intentW[ii],"OPEN BEAM")==0)
142                                        Print "Open beam match at ",filenameW[ii]
143                                        SetVariable setvar_4,value=labelW[ii]
144                                        PopupMenu popup_2,mode=WhichListItem(fileNameW[ii], list )+1,popValue=fileNameW[ii]
145                                       
146//                                      SetVariable setvar_6,value =_STR:"ML"
147
148                                        WAVE boxCoord = V_getBoxCoordinates(filenameW[ii])
149                                        Print boxCoord
150                                        SetVariable setvar_5,value=_STR:V_NumWave2List(boxCoord,";")
151
152                                       
153                                        break
154                                endif           
155                        endfor
156                                                               
157                        break
158                case -1: // control being killed
159                        break
160        endswitch
161
162        return 0
163End
164
165// TODO
166//
167// Given the group ID of the sample, try to locate a (the) matching transmission file
168// by locating a matching ID in the list of transmission (intent) files
169//
170// then pop the menu
171//
172//
173Function V_TTransmFilePopMenuProc(pa) : PopupMenuControl
174        STRUCT WMPopupAction &pa
175
176        switch( pa.eventCode )
177                case 2: // mouse up
178                        Variable popNum = pa.popNum
179                        String popStr = pa.popStr
180                       
181                       
182                       
183                        break
184                case -1: // control being killed
185                        break
186        endswitch
187
188        return 0
189End
190
191
192Function V_TEmpBeamPopMenuProc(pa) : PopupMenuControl
193        STRUCT WMPopupAction &pa
194
195        switch( pa.eventCode )
196                case 2: // mouse up
197                        Variable popNum = pa.popNum
198                        String popStr = pa.popStr
199                       
200                        Print "empty beam match at ",popStr
201                        SetVariable setvar_4,value=_STR:V_getSampleDescription(popStr)
202                       
203//                      SetVariable setvar_6,value =_STR:"ML"
204
205                        WAVE boxCoord = V_getBoxCoordinates(popStr)
206                        Print boxCoord
207                        SetVariable setvar_5,value=_STR:V_NumWave2List(boxCoord,";")
208                       
209                       
210                        break
211                case -1: // control being killed
212                        break
213        endswitch
214
215        return 0
216End
217
218
219// NOTE: DIV is not needed for the transmission calculation, since it's a ratio
220// and the DIV simply drops out. (DIV is needed for ABS scaling calculation of Kappa, since
221// that is not a ratio)
222//
223// TODO
224// -- figure out which detector corrections are necessary to do on loading
225// data for calculation. Then set/reset preferences accordingly
226// (see V_isoCorrectButtonProc() for example of how to do this)
227//
228//  -- DIV (turn off)
229// -- NonLinear (turn off ?)
230// -- solid angle (turn off ?)
231// -- dead time (keep on?)
232//
233// -- once calculated, update the Transmission panel
234// -- update the data file
235// -- update the CATALOG (and/or delete the RawVSANS to force a re-read)
236//
237Function V_CalcTransmButtonProc(ba) : ButtonControl
238        STRUCT WMButtonAction &ba
239
240        switch( ba.eventCode )
241                case 2: // mouse up
242                        // click code here
243                       
244                        Variable trans,trans_err
245                        Variable emptyCts,empty_ct_err,samCts,sam_ct_err
246                        String fileName,samFileName,emptyFileName
247                        String detStr
248                       
249                       
250                        // save preferences for file loading
251                        Variable savDivPref,savSAPref
252                        NVAR gDoDIVCor = root:Packages:NIST:VSANS:Globals:gDoDIVCor
253                        savDivPref = gDoDIVCor
254                        NVAR gDoSolidAngleCor = root:Packages:NIST:VSANS:Globals:gDoSolidAngleCor
255                        savSAPref = gDoSolidAngleCor
256                       
257                        // set local preferences
258                        gDoDIVCor = 0
259                        gDoSolidAngleCor = 0
260                       
261                        // check for sample transmission + error
262                        // if present -- exit
263                        ControlInfo/W=V_TransmissionPanel popup_0
264                        fileName = S_Value
265                        trans = V_getSampleTransmission(fileName)
266                        trans_err = V_getSampleTransError(fileName)
267//                      // TODO
268//                      // -- this criteria is rather crude. think it through better
269//                      // -- or should I simply let it overwrite? What is the harm in that?
270//                      if(trans != 0 && trans < 1 && trans_err != 0)
271//                              Printf "Sample transmission, error = %g +/- %g   already exists, nothing calculated\r",trans,trans_err
272//                              break
273//                      endif
274                       
275                // for empty beam
276
277                        ControlInfo/W=V_TransmissionPanel popup_2
278                        emptyFileName = S_Value                 
279                       
280                        emptyCts = V_getBoxCounts(emptyFileName)
281                        empty_ct_err = V_getBoxCountsError(emptyFileName)
282                        WAVE xyBoxW = V_getBoxCoordinates(emptyFileName)
283                        // TODO
284                        // x- need to get the panel string for the sum.
285                        // x- the detector string is currently hard-wired
286                        ControlInfo setvar_6
287                        detStr = S_Value                //this was hard-wired to "B", but no read from the panel
288                       
289                        // check for box count + error values
290                        // if present, proceed
291                        // TODO
292                        // -- this criteria is rather crude. think it through better
293                        if(emptyCts > 1 && empty_ct_err != 0)
294                                Printf "Empty beam box counts, error = %g +/- %g   already exists, box counts not re-calculated\r",emptyCts,empty_ct_err
295                               
296                        else
297                                // else the counts have not been determined
298                                // read in the data file
299                                V_LoadAndPlotRAW_wName(emptyFileName)
300                                // convert raw->SAM
301                                V_Raw_to_work("SAM")
302                                V_UpdateDisplayInformation("SAM")       
303                               
304                                // and determine box sum and error
305                                // store these locally
306                                emptyCts = V_SumCountsInBox(xyBoxW[0],xyBoxW[1],xyBoxW[2],xyBoxW[3],empty_ct_err,"SAM",detStr)
307               
308                                Print "empty counts = ",emptyCts
309                                Print "empty err/counts = ",empty_ct_err/emptyCts
310                               
311                                // TODO
312                                // write these back to the file
313                                // (write locally?)
314                               
315                        endif
316
317                // for Sample Transmission File
318                       
319                        ControlInfo/W=V_TransmissionPanel popup_1
320                        samFileName = S_Value
321                        // check for box count + error values
322                        samCts = V_getBoxCounts(samFileName)
323                        sam_ct_err = V_getBoxCountsError(samFileName)
324                        // if present, proceed
325                        // TODO
326                        // -- this criteria is rather crude. think it through better
327                        if(samCts > 1 && sam_ct_err != 0)
328                                Printf "Sam Trans box counts, error = %g +/- %g   already exists, nothing calculated\r",samCts,sam_ct_err
329                               
330                        else
331                                // else
332                                // read in the data file
333                                V_LoadAndPlotRAW_wName(samFileName)
334                                // convert raw->SAM
335                                V_Raw_to_work("SAM")
336                                V_UpdateDisplayInformation("SAM")       
337                               
338                                // get the box coordinates
339                                // and determine box sum and error
340                               
341                                // store these locally
342                                samCts = V_SumCountsInBox(xyBoxW[0],xyBoxW[1],xyBoxW[2],xyBoxW[3],sam_ct_err,"SAM",detStr)
343               
344                                Print "sam counts = ",samCts
345                                Print "sam err/counts = ",sam_ct_err/samCts
346                               
347                                // TODO
348                                // write these back to the file
349                                // (write locally?)     
350                        endif
351                       
352                //then calculate the transmission
353                        Variable empAttenFactor,emp_atten_err,samAttenFactor,sam_atten_err,attenRatio
354                       
355                        // get the attenuation factor for the empty beam
356                        empAttenFactor = V_getAttenuator_transmission(emptyFileName)
357                        emp_atten_err = V_getAttenuator_trans_err(emptyFileName)
358                        // get the attenuation factor for the sample transmission
359                        samAttenFactor = V_getAttenuator_transmission(samFileName)
360                        sam_atten_err = V_getAttenuator_trans_err(samFileName) 
361                        AttenRatio = empAttenFactor/samAttenFactor             
362                        // calculate the transmission
363                        // calculate the transmission error
364                        trans = samCts/emptyCts * AttenRatio
365                                               
366                        // squared, relative error
367                        if(AttenRatio == 1)
368                                trans_err = (sam_ct_err/samCts)^2 + (empty_ct_err/emptyCts)^2           //same atten, att_err drops out
369                        else
370                                trans_err = (sam_ct_err/samCts)^2 + (empty_ct_err/emptyCts)^2 + (sam_atten_err/samAttenFactor)^2 + (emp_atten_err/empAttenFactor)^2
371                        endif
372                        trans_err = sqrt(trans_err)
373                        trans_err *= trans              // now, one std deviation
374                       
375                        //write out counts and transmission to history window, showing the attenuator ratio, if it is not unity
376                        If(attenRatio==1)
377                                Printf "%s\t\tTrans Counts = %g\tTrans = %g +/- %g\r",fileName, samCts,trans,trans_err
378                        else
379                                Printf "%s\t\tTrans Counts = %g\tTrans = %g +/- %g\tAttenuatorRatio = %g\r",fileName, samCts,trans,trans_err,attenRatio
380                        endif
381                       
382                        // write both out to the sample *scattering* file on disk
383                        V_writeSampleTransmission(fileName,trans)
384                        V_writeSampleTransError(fileName,trans_err)     
385                       
386                        // TODO
387                        // -- update the value displayed in the panel
388                        // -- update the local value in the file catalog
389                        // -- delete the file from RawVSANS to force a re-read?
390//                      SetVariable setvar_7,value= trans
391//                      SetVariable setvar_8,value= trans_err
392//                      DoUpdate/W=V_TransmissionPanel
393                       
394                       
395                        // done
396                        break
397                case -1: // control being killed
398                        break
399        endswitch
400
401        // restore preferences on exit
402        gDoDIVCor = savDivPref
403        gDoSolidAngleCor = savSAPref
404
405
406        return 0
407End
408
409Function V_WriteTransmButtonProc(ba) : ButtonControl
410        STRUCT WMButtonAction &ba
411
412        switch( ba.eventCode )
413                case 2: // mouse up
414                        // click code here
415                        break
416                case -1: // control being killed
417                        break
418        endswitch
419
420        return 0
421End
422
423Function V_HelpTransmButtonProc(ba) : ButtonControl
424        STRUCT WMButtonAction &ba
425
426        switch( ba.eventCode )
427                case 2: // mouse up
428                        // click code here
429                       
430                        DoAlert 0,"Transmission Help not written yet"
431                       
432                        break
433                case -1: // control being killed
434                        break
435        endswitch
436
437        return 0
438End
439
440Function V_DoneTransmButtonProc(ba) : ButtonControl
441        STRUCT WMButtonAction &ba
442
443        switch( ba.eventCode )
444                case 2: // mouse up
445                        // click code here
446                        DoWindow/K V_TransmissionPanel
447                        break
448                case -1: // control being killed
449                        break
450        endswitch
451
452        return 0
453End
454
Note: See TracBrowser for help on using the repository browser.