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

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

Adding utilities to calculate transmission. Added V_Transmission.ipf file. Getting the functionality to work, user interface or incorporation into the data reduction protocol is still to be decided.

File size: 12.4 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// -- 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=(823,45,1301,669)
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)
32        PopupMenu popup_1,pos={98.00,166.00},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={160.00,271.00},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={22.00,397.00},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={101.00,194.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={100.00,220.00},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={161.00,300.00},size={300.00,14.00},title="Label:"
49        SetVariable setvar_4,limits={-inf,inf,0},value= _STR:"file label"
50        SetVariable setvar_5,pos={161.00,324.00},size={300.00,14.00},title="XY Box:"
51        SetVariable setvar_5,limits={-inf,inf,0},value= _STR:"dummy"
52        SetVariable setvar_6,pos={159.00,349.00},size={300.00,14.00},title="Panel:"
53        SetVariable setvar_6,limits={-inf,inf,0},value= _STR:"dummy"
54        SetVariable setvar_7,pos={24.00,426.00},size={300.00,14.00},title="Transmission:"
55        SetVariable setvar_7,limits={-inf,inf,0},value= VSANS_RED_VERSION
56        SetVariable setvar_8,pos={25.00,448.00},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                        np = numpnts(labelW)            //fileNameW is LONGER - so don't use numpnts(fileWave)
88                        for(ii=0;ii<np;ii+=1)
89                                if(cmpstr(fileNameW[ii],popStr)==0)
90                               
91                                        SetVariable setvar_0,value=labelW[ii]
92                                        SetVariable setvar_1,value=groupIDW[ii]
93                                        SetVariable setvar_7,value=transmW[ii]
94                                        break           //found, get out
95                                endif           
96                        endfor
97               
98                // loop back through to find the transmission file with the matching group id
99                // TODO x- set the popup string to the matching name on exit
100                        Variable targetID = groupIDW[ii]
101                        String list = V_getFileIntentList("TRANSMISSION",0)
102                        WAVE/T intentW = root:Packages:NIST:VSANS:CatVSHeaderInfo:Intent
103                        for(ii=0;ii<np;ii+=1)
104                                if(cmpstr(intentW[ii],"TRANSMISSION")==0 && groupIDW[ii] == targetID)
105                                        Print "transmission file match at ",filenameW[ii]
106                                        SetVariable setvar_2,value=labelW[ii]
107                                        SetVariable setvar_3,value=groupIDW[ii]
108                                        PopupMenu popup_1,mode=WhichListItem(fileNameW[ii], list )+1
109                                        break
110                                endif           
111                        endfor
112
113                // now loop back through to find the empty beam file
114                // TODO x- fill in the XY box
115                // --  Panel field is hard wired...
116                //     
117                        WAVE/T intentW = root:Packages:NIST:VSANS:CatVSHeaderInfo:Intent
118                        list = V_getFileIntentList("EMPTY BEAM",0)
119                       
120                        for(ii=0;ii<np;ii+=1)
121                                if(cmpstr(intentW[ii],"EMPTY BEAM")==0)
122                                        Print "empty beam match at ",filenameW[ii]
123                                        SetVariable setvar_4,value=labelW[ii]
124                                        PopupMenu popup_2,mode=WhichListItem(fileNameW[ii], list )+1
125                                       
126                                        SetVariable setvar_6,value =_STR:"B"
127
128                                        WAVE boxCoord = V_getBoxCoordinates(filenameW[ii])
129                                        Print boxCoord
130                                        SetVariable setvar_5,value=_STR:V_NumWave2List(boxCoord,";")
131
132                                       
133                                        break
134                                endif           
135                        endfor
136                                                               
137                        break
138                case -1: // control being killed
139                        break
140        endswitch
141
142        return 0
143End
144
145// TODO
146//
147// Given the group ID of the sample, try to locate a (the) matching transmission file
148// by locating a matching ID in the list of transmission (intent) files
149//
150// then pop the menu
151//
152//
153Function V_TTransmFilePopMenuProc(pa) : PopupMenuControl
154        STRUCT WMPopupAction &pa
155
156        switch( pa.eventCode )
157                case 2: // mouse up
158                        Variable popNum = pa.popNum
159                        String popStr = pa.popStr
160                       
161                       
162                       
163                        break
164                case -1: // control being killed
165                        break
166        endswitch
167
168        return 0
169End
170
171
172Function V_TEmpBeamPopMenuProc(pa) : PopupMenuControl
173        STRUCT WMPopupAction &pa
174
175        switch( pa.eventCode )
176                case 2: // mouse up
177                        Variable popNum = pa.popNum
178                        String popStr = pa.popStr
179                        break
180                case -1: // control being killed
181                        break
182        endswitch
183
184        return 0
185End
186
187
188// NOTE: DIV is not needed for the transmission calculation, since it's a ratio
189// and the DIV simply drops out. (DIV is needed for ABS scaling calculation of Kappa, since
190// that is not a ratio)
191//
192// TODO
193// -- figure out which detector corrections are necessary to do on loading
194// data for calcualtion. Then set/reset preferences accordingly
195// (see V_isoCorrectButtonProc() for example of how to do this)
196//
197//  -- DIV (turn off)
198// -- NonLinear (turn off ?)
199// -- solid angle (turn off ?)
200// -- dead time (keep on?)
201//
202Function V_CalcTransmButtonProc(ba) : ButtonControl
203        STRUCT WMButtonAction &ba
204
205        switch( ba.eventCode )
206                case 2: // mouse up
207                        // click code here
208                       
209                        Variable trans,trans_err
210                        Variable emptyCts,empty_ct_err,samCts,sam_ct_err
211                        String fileName,samFileName,emptyFileName
212                        String detStr
213                       
214                       
215                        // save preferences for file loading
216                        Variable savDivPref,savSAPref
217                        NVAR gDoDIVCor = root:Packages:NIST:VSANS:Globals:gDoDIVCor
218                        savDivPref = gDoDIVCor
219                        NVAR gDoSolidAngleCor = root:Packages:NIST:VSANS:Globals:gDoSolidAngleCor
220                        savSAPref = gDoSolidAngleCor
221                       
222                        // set local preferences
223                        gDoDIVCor = 0
224                        gDoSolidAngleCor = 0
225                       
226                        // check for sample transmission + error
227                        // if present -- exit
228                        ControlInfo/W=V_TransmissionPanel popup_0
229                        fileName = S_Value
230                        trans = V_getSampleTransmission(fileName)
231                        trans_err = V_getSampleTransError(fileName)
232                        // TODO
233                        // -- this criteria is rather crude. think it through better
234                        if(trans != 0 && trans < 1 && trans_err != 0)
235                                Printf "Sample transmission, error = %g +/- %g   already exists, nothing calculated\r",trans,trans_err
236                                break
237                        endif
238                       
239                // for empty beam
240
241                        ControlInfo/W=V_TransmissionPanel popup_2
242                        emptyFileName = S_Value                 
243                       
244                        emptyCts = V_getBoxCounts(emptyFileName)
245                        empty_ct_err = V_getBoxCountsError(emptyFileName)
246                        WAVE xyBoxW = V_getBoxCoordinates(emptyFileName)
247                        // TODO
248                        // -- need to get the panel string for the sum.
249                        // -- the detector string is currently hard-wired
250                        detStr = "B"
251                       
252                        // check for box count + error values
253                        // if present, proceed
254                        // TODO
255                        // -- this criteria is rather crude. think it through better
256                        if(emptyCts > 1 && empty_ct_err != 0)
257                                Printf "Empty beam box counts, error = %g +/- %g   already exists, nothing calculated\r",emptyCts,empty_ct_err
258                               
259                        else
260                                // else the counts have not been determined
261                                // read in the data file
262                                V_LoadAndPlotRAW_wName(emptyFileName)
263                                // convert raw->SAM
264                                V_Raw_to_work("SAM")
265                                V_UpdateDisplayInformation("SAM")       
266                               
267                                // and determine box sum and error
268                                // store these locally
269                                emptyCts = V_SumCountsInBox(xyBoxW[0],xyBoxW[1],xyBoxW[2],xyBoxW[3],empty_ct_err,"SAM",detStr)
270               
271                                Print "empty counts = ",emptyCts
272                                Print "empty err/counts = ",empty_ct_err/emptyCts
273                               
274                                // TODO
275                                // write these back to the file
276                                // (write locally?)
277                               
278                        endif
279
280                // for Sample Transmission File
281                       
282                        ControlInfo/W=V_TransmissionPanel popup_1
283                        samFileName = S_Value
284                        // check for box count + error values
285                        samCts = V_getBoxCounts(samFileName)
286                        sam_ct_err = V_getBoxCountsError(samFileName)
287                        // if present, proceed
288                        // TODO
289                        // -- this criteria is rather crude. think it through better
290                        if(samCts > 1 && sam_ct_err != 0)
291                                Printf "Sam Trans box counts, error = %g +/- %g   already exists, nothing calculated\r",samCts,sam_ct_err
292                               
293                        else
294                                // else
295                                // read in the data file
296                                V_LoadAndPlotRAW_wName(samFileName)
297                                // convert raw->SAM
298                                V_Raw_to_work("SAM")
299                                V_UpdateDisplayInformation("SAM")       
300                               
301                                // get the box coordinates
302                                // and determine box sum and error
303                               
304                                // store these locally
305                                samCts = V_SumCountsInBox(xyBoxW[0],xyBoxW[1],xyBoxW[2],xyBoxW[3],sam_ct_err,"SAM",detStr)
306               
307                                Print "sam counts = ",samCts
308                                Print "sam err/counts = ",sam_ct_err/samCts
309                               
310                                // TODO
311                                // write these back to the file
312                                // (write locally?)     
313                        endif
314                       
315                //then calculate the transmission
316                        Variable empAttenFactor,emp_atten_err,samAttenFactor,sam_atten_err,attenRatio
317                       
318                        // get the attenuation factor for the empty beam
319                        empAttenFactor = V_getAttenuator_transmission(emptyFileName)
320                        emp_atten_err = V_getAttenuator_trans_err(emptyFileName)
321                        // get the attenuation factor for the sample transmission
322                        samAttenFactor = V_getAttenuator_transmission(samFileName)
323                        sam_atten_err = V_getAttenuator_trans_err(samFileName) 
324                        AttenRatio = empAttenFactor/samAttenFactor             
325                        // calculate the transmission
326                        // calculate the transmission error
327                        trans = samCts/emptyCts * AttenRatio
328                                               
329                        // squared, relative error
330                        if(AttenRatio == 1)
331                                trans_err = (sam_ct_err/samCts)^2 + (empty_ct_err/emptyCts)^2           //same atten, att_err drops out
332                        else
333                                trans_err = (sam_ct_err/samCts)^2 + (empty_ct_err/emptyCts)^2 + (sam_atten_err/samAttenFactor)^2 + (emp_atten_err/empAttenFactor)^2
334                        endif
335                        trans_err = sqrt(trans_err)
336                        trans_err *= trans              // now, one std deviation
337                       
338                        //write out counts and transmission to history window, showing the attenuator ratio, if it is not unity
339                        If(attenRatio==1)
340                                Printf "%s\t\tTrans Counts = %g\tTrans = %g +/- %g\r",fileName, samCts,trans,trans_err
341                        else
342                                Printf "%s\t\tTrans Counts = %g\tTrans = %g +/- %g\tAttenuatorRatio = %g\r",fileName, samCts,trans,trans_err,attenRatio
343                        endif
344                       
345                        // write both out to the sample *scattering* file on disk
346                        V_writeSampleTransmission(fileName,trans)
347                        V_writeSampleTransError(fileName,trans_err)     
348                       
349                        // TODO
350                        // (update the value displayed in the table?)
351                        // (update the local value?)
352                       
353                       
354                        // done
355                        break
356                case -1: // control being killed
357                        break
358        endswitch
359
360        // restore preferences on exit
361        gDoDIVCor = savDivPref
362        gDoSolidAngleCor = savSAPref
363
364
365        return 0
366End
367
368Function V_WriteTransmButtonProc(ba) : ButtonControl
369        STRUCT WMButtonAction &ba
370
371        switch( ba.eventCode )
372                case 2: // mouse up
373                        // click code here
374                        break
375                case -1: // control being killed
376                        break
377        endswitch
378
379        return 0
380End
381
382Function V_HelpTransmButtonProc(ba) : ButtonControl
383        STRUCT WMButtonAction &ba
384
385        switch( ba.eventCode )
386                case 2: // mouse up
387                        // click code here
388                       
389                        DoAlert 0,"Transmission Help not written yet"
390                       
391                        break
392                case -1: // control being killed
393                        break
394        endswitch
395
396        return 0
397End
398
399Function V_DoneTransmButtonProc(ba) : ButtonControl
400        STRUCT WMButtonAction &ba
401
402        switch( ba.eventCode )
403                case 2: // mouse up
404                        // click code here
405                        DoWindow/K V_TransmissionPanel
406                        break
407                case -1: // control being killed
408                        break
409        endswitch
410
411        return 0
412End
413
Note: See TracBrowser for help on using the repository browser.