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

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

a few changes to update the calculation of transmission values from the tables, and updating the correct units in a few places. Also updated how a transmission file is matched with a scattering file.

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