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

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

a lot of little changes:

changed the name of the Raw Data display procedure file (removed test)

lots of bug fixes, moving items from the macros menu to proper locations, getting the file status to display properly, some error checking, and cleaning up a few TODO items.

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