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

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

added utilities to allow saving of I(q) data sets either individual or concatenated. At this point, it simply trims a nominal number of points from the beginning and end of each set before concatenation (and then sorting).

These operations will need to be augmented in the future.

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