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

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

many minor changes after real VSANS data collected.

additional procedures added to allow easy correction of the incorrect header information from NICE.

Most notable addition is the pinhole resolution added to the calculation and the I(q) output. White beam is also treated (incorrectly) as a gaussian distrivution, but the results of smeared fitting look to be quite good.

Trimming and sorting routines are now (pinhole) resolution aware.

File identification routines have been updated to use the proper definitions of "purpose" and "intent". Both fields are now in the catalog, to allow for better sorting.

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