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

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

Added the angle dependent transmission correction to the data correction in the raw_to_work step, in 2D

added a testing file that can generate fake event data, read, write, and decode it. Read is based on GBLoadWave. Hoepfully I'll not need to write an XOP. manipulation of the 64 bit words are done with simple bit shifts and logic.

also added are a number of error checking routines to improve behavior when wave, folders, etc. are missing.

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