source: sans/Dev/trunk/NCNR_User_Procedures/Reduction/VSANS/VC_BeamCenter.ipf @ 981

Last change on this file since 981 was 981, checked in by srkline, 7 years ago

more changes, filling in functionality of the initial data correction

File size: 10.8 KB
Line 
1#pragma rtGlobals=3             // Use modern global access method and strict wave access.
2
3
4// TODO
5// -- adjust the guesses to some better starting conditions
6// -- multiple fit options with different things held
7// x- when selecting the detector, set the x/y pixel sizes
8// -- figure out how to re-plot the images when swapping between LR and TB panels
9// -- Modify to accept mm (real space dimensions) rather than pixels
10//    -- or be able to swap the answer to mm for a more natural definition of the beam center
11// -- add method to be able to write the values to the local folder / or better, to file on disk
12// -- graphically show the beam center / radius of where it is in relation to the panel
13
14
15//
16// TODO - may need to adjust the display for the different pixel dimensions
17//      ModifyGraph width={Plan,1,bottom,left}
18//
19Macro DetectorPanelFit() : Panel
20        PauseUpdate; Silent 1           // building window...
21
22// plot the default model to be sure some data is present
23        if(exists("xwave_PeakPix2D") == 0)
24                PlotBroadPeak_Pix2D()
25        endif
26
27        NewPanel /W=(662,418,1586,960)/N=PanelFit/K=1
28//      ShowTools/A
29               
30        PopupMenu popup_0,pos={20,20},size={109,20},proc=SetDetPanelPopMenuProc,title="Detector Panel"
31        PopupMenu popup_0,mode=1,popvalue="FL",value= #"\"FL;FR;FT;FB;MR;ML;MT;MB;B;\""
32        PopupMenu popup_1,pos={200,20},size={157,20},proc=DetModelPopMenuProc,title="Model Function"
33        PopupMenu popup_1,mode=1,popvalue="BroadPeak",value= #"\"BroadPeak;other;\""
34       
35        Button button_0,pos={486,20},size={80,20},proc=DetFitGuessButtonProc,title="Guess"
36        Button button_1,pos={615,20},size={80,20},proc=DetFitButtonProc,title="Do Fit"
37        Button button_2,pos={744,20},size={80,20},proc=DetFitHelpButtonProc,title="Help"
38
39
40        duplicate/O root:Packages:NIST:VSANS:VCALC:Front:det_FL curDispPanel
41        SetScale/P x 0,1, curDispPanel
42        SetScale/P y 0,1, curDispPanel
43
44
45        // draw the correct images
46        DrawDetPanel("FL")
47
48       
49////draw the detector panel
50//      Display/W=(20,80,200,600)/HOST=#
51//      AppendImage curDispPanel
52//      ModifyImage curDispPanel ctab= {*,*,ColdWarm,0}
53////    ModifyGraph height={Aspect,2.67}               
54//      Label left "Y pixels"
55//      Label bottom "X pixels"
56//      RenameWindow #,DetData
57//      SetActiveSubwindow ##   
58//     
59////draw the model calculation
60//      Display/W=(220,80,400,600)/HOST=#
61//      AppendImage PeakPix2D_mat
62//      ModifyImage PeakPix2D_mat ctab= {*,*,ColdWarm,0}
63////    ModifyGraph height={Aspect,2.67}               
64////    ModifyGraph width={Aspect,0.375}               
65//      Label left "Y pixels"
66//      Label bottom "X pixels"
67//      RenameWindow #,ModelData
68//      SetActiveSubwindow ##           
69
70
71
72
73// edit the fit coefficients   
74        Edit/W=(500,80,880,350)/HOST=#  parameters_PeakPix2D,coef_PeakPix2D
75        ModifyTable width(Point)=0
76        ModifyTable width(parameters_PeakPix2D)=120
77        ModifyTable width(coef_PeakPix2D)=100
78        RenameWindow #,T0
79        SetActiveSubwindow ##
80
81       
82EndMacro
83
84
85
86
87Function SetDetPanelPopMenuProc(pa) : PopupMenuControl
88        STRUCT WMPopupAction &pa
89
90        switch( pa.eventCode )
91                case 2: // mouse up
92                        Variable popNum = pa.popNum
93                        String popStr = pa.popStr
94                                               
95                        // remove the old image (it may not be the right shape)
96                        // -- but make sure it exists first...
97                        String childList = ChildWindowList("PanelFit")
98                        Variable flag
99                       
100                        flag = WhichListItem("DetData", ChildList)              //returns -1 if not in list, 0+ otherwise
101                        if(flag != -1)
102                                KillWindow PanelFit#DetData
103                        endif
104                       
105                        flag = WhichListItem("ModelData", ChildList)
106                        if(flag != -1)
107                                KillWindow PanelFit#ModelData
108                        endif
109       
110                        // draw the correct images
111                        DrawDetPanel(popStr)
112                       
113                        break
114                case -1: // control being killed
115                        break
116        endswitch
117
118        return 0
119End
120
121
122// draw the selected panel and the model calculation, adjusting for the
123// orientation of the panel and the number of pixels, and pixel sizes
124Function DrawDetPanel(str)
125        String str
126       
127        // from the selection, find the path to the data
128        // TODO - currently is hard-wired for the simulation path!
129        //     need to make it more generic, especially for RAW data
130
131        Variable xDim,yDim
132        Variable left,top,right,bottom
133        Variable height, width
134        Variable left2,top2,right2,bottom2
135        Wave dispW=root:curDispPanel
136        Wave cw = root:coef_PeakPix2D
137
138        Wave xwave_PeakPix2D=root:xwave_PeakPix2D
139        Wave ywave_PeakPix2D=root:ywave_PeakPix2D
140        Wave zwave_PeakPix2D=root:zwave_PeakPix2D
141
142        //plot it in the subwindow with the proper aspect and positioning
143        // for 48x256 (8mm x 4mm), aspect = (256/2)/48 = 2.67 (LR panels)
144        // for 128x48 (4mm x 8 mm), aspect = 48/(128/2) = 0.75 (TB panels)
145       
146       
147        // using two switches -- one to set the panel-specific dimensions
148        // and the other to set the "common" values, some of which are based on the panel dimensions
149
150        // panel-specific values
151        strswitch(str)
152                case "FL":
153                        NVAR nPix_X = root:Packages:NIST:VSANS:VCALC:gFront_L_nPix_X
154                        NVAR nPix_Y = root:Packages:NIST:VSANS:VCALC:gFront_L_nPix_Y
155                        NVAR pixSize_X = root:Packages:NIST:VSANS:VCALC:gFront_L_pixelX
156                        NVAR pixSize_Y = root:Packages:NIST:VSANS:VCALC:gFront_L_pixelY
157                        wave newW = $("root:Packages:NIST:VSANS:VCALC:Front:det_"+str)
158                        break
159                case "FR":
160                        NVAR nPix_X = root:Packages:NIST:VSANS:VCALC:gFront_R_nPix_X
161                        NVAR nPix_Y = root:Packages:NIST:VSANS:VCALC:gFront_R_nPix_Y
162                        NVAR pixSize_X = root:Packages:NIST:VSANS:VCALC:gFront_R_pixelX
163                        NVAR pixSize_Y = root:Packages:NIST:VSANS:VCALC:gFront_R_pixelY
164                        wave newW = $("root:Packages:NIST:VSANS:VCALC:Front:det_"+str)
165                        break
166                case "ML":
167                        NVAR nPix_X = root:Packages:NIST:VSANS:VCALC:gMiddle_L_nPix_X
168                        NVAR nPix_Y = root:Packages:NIST:VSANS:VCALC:gMiddle_L_nPix_Y
169                        NVAR pixSize_X = root:Packages:NIST:VSANS:VCALC:gMiddle_L_pixelX
170                        NVAR pixSize_Y = root:Packages:NIST:VSANS:VCALC:gMiddle_L_pixelY
171                        wave newW = $("root:Packages:NIST:VSANS:VCALC:Middle:det_"+str)
172                        break
173                case "MR":
174                        NVAR nPix_X = root:Packages:NIST:VSANS:VCALC:gMiddle_R_nPix_X
175                        NVAR nPix_Y = root:Packages:NIST:VSANS:VCALC:gMiddle_R_nPix_Y
176                        NVAR pixSize_X = root:Packages:NIST:VSANS:VCALC:gMiddle_R_pixelX
177                        NVAR pixSize_Y = root:Packages:NIST:VSANS:VCALC:gMiddle_R_pixelY
178                        wave newW = $("root:Packages:NIST:VSANS:VCALC:Middle:det_"+str)
179                        break   
180
181                case "FT":
182                        NVAR nPix_X = root:Packages:NIST:VSANS:VCALC:gFront_T_nPix_X
183                        NVAR nPix_Y = root:Packages:NIST:VSANS:VCALC:gFront_T_nPix_Y
184                        NVAR pixSize_X = root:Packages:NIST:VSANS:VCALC:gFront_T_pixelX
185                        NVAR pixSize_Y = root:Packages:NIST:VSANS:VCALC:gFront_T_pixelY
186                        wave newW = $("root:Packages:NIST:VSANS:VCALC:Front:det_"+str)
187                        break
188                case "FB":
189                        NVAR nPix_X = root:Packages:NIST:VSANS:VCALC:gFront_B_nPix_X
190                        NVAR nPix_Y = root:Packages:NIST:VSANS:VCALC:gFront_B_nPix_Y
191                        NVAR pixSize_X = root:Packages:NIST:VSANS:VCALC:gFront_B_pixelX
192                        NVAR pixSize_Y = root:Packages:NIST:VSANS:VCALC:gFront_B_pixelY
193                        wave newW = $("root:Packages:NIST:VSANS:VCALC:Front:det_"+str)
194                        break
195                case "MT":
196                        NVAR nPix_X = root:Packages:NIST:VSANS:VCALC:gMiddle_T_nPix_X
197                        NVAR nPix_Y = root:Packages:NIST:VSANS:VCALC:gMiddle_T_nPix_Y
198                        NVAR pixSize_X = root:Packages:NIST:VSANS:VCALC:gMiddle_T_pixelX
199                        NVAR pixSize_Y = root:Packages:NIST:VSANS:VCALC:gMiddle_T_pixelY
200                        wave newW = $("root:Packages:NIST:VSANS:VCALC:Middle:det_"+str)
201                        break
202                case "MB":
203                        NVAR nPix_X = root:Packages:NIST:VSANS:VCALC:gMiddle_B_nPix_X
204                        NVAR nPix_Y = root:Packages:NIST:VSANS:VCALC:gMiddle_B_nPix_Y
205                        NVAR pixSize_X = root:Packages:NIST:VSANS:VCALC:gMiddle_B_pixelX
206                        NVAR pixSize_Y = root:Packages:NIST:VSANS:VCALC:gMiddle_B_pixelY
207                        wave newW = $("root:Packages:NIST:VSANS:VCALC:Middle:det_"+str)
208                        break   
209                       
210                case "B":
211                        return(0)               //just exit
212                        break                                           
213                default:
214                        return(0)               //just exit
215        endswitch
216       
217
218       
219       
220        Variable scale = 5
221       
222        // common values (panel position, etc)
223        strswitch(str)
224                case "FL":
225                case "FR":
226                case "ML":
227                case "MR":
228                        width = trunc(nPix_X*pixSize_X *scale*1.15)                     //48 tubes @ 8 mm
229                        height = trunc(nPix_Y*pixSize_Y *scale*0.8)                     //128 pixels @ 8 mm
230                       
231                        left = 20
232                        top = 80
233                        right = left+width
234                        bottom = top+height
235                       
236                        left2 = right + 20
237                        right2 = left2 + width
238                        top2 = top
239                        bottom2 = bottom
240                       
241                        break                   
242                case "FT":
243                case "FB":
244                case "MT":
245                case "MB":
246                        width = trunc(nPix_X*pixSize_X *scale*1.)                       //128 pix @ 4 mm
247                        height = trunc(nPix_Y*pixSize_Y *scale)                 // 48 tubes @ 8 mm
248                                               
249                        left = 20
250                        top = 80
251                        right = left+width
252                        bottom = top+height
253                       
254                        left2 = left
255                        right2 = right
256                        top2 = top + height + 20
257                        bottom2 = bottom + height + 20
258                       
259                        break
260                case "B":
261                        return(0)               //just exit
262                        break                                           
263                default:
264                        return(0)               //just exit
265        endswitch
266
267        // set from the detector-specific strswitch
268        cw[7] = pixSize_X*10
269        cw[8] = pixSize_Y*10           
270
271        // generate the new panel display
272        duplicate/O newW curDispPanel
273        SetScale/P x 0,1, curDispPanel
274        SetScale/P y 0,1, curDispPanel
275       
276        //draw the detector panel
277        Display/W=(left,top,right,bottom)/HOST=#
278        AppendImage curDispPanel
279        ModifyImage curDispPanel ctab= {*,*,ColdWarm,0}
280        Label left "Y pixels"
281        Label bottom "X pixels"
282        RenameWindow #,DetData
283        SetActiveSubwindow ##   
284       
285               
286        // re-dimension the model calculation to be the proper dimensions       
287        Redimension/N=(nPix_X*nPix_Y) xwave_PeakPix2D, ywave_PeakPix2D,zwave_PeakPix2D 
288        FillPixTriplet(xwave_PeakPix2D, ywave_PeakPix2D,zwave_PeakPix2D,nPix_X,nPix_Y)
289        Make/O/D/N=(nPix_X,nPix_Y) PeakPix2D_mat                // use the point scaling of the matrix (=pixels)
290
291        Duplicate/O $"PeakPix2D_mat",$"PeakPix2D_lin"           //keep a linear-scaled version of the data
292
293        //draw the model calculation
294        Display/W=(left2,top2,right2,bottom2)/HOST=#
295        AppendImage PeakPix2D_mat
296        ModifyImage PeakPix2D_mat ctab= {*,*,ColdWarm,0}
297        Label left "Y pixels"
298        Label bottom "X pixels"
299        RenameWindow #,ModelData
300        SetActiveSubwindow ##   
301               
302        DoUpdate
303       
304        return(0)
305End
306
307
308
309
310
311Function DetModelPopMenuProc(pa) : PopupMenuControl
312        STRUCT WMPopupAction &pa
313
314        switch( pa.eventCode )
315                case 2: // mouse up
316                        Variable popNum = pa.popNum
317                        String popStr = pa.popStr
318                       
319                        Execute "PlotBroadPeak_Pix2D()"
320                       
321                        break
322                case -1: // control being killed
323                        break
324        endswitch
325
326        return 0
327End
328
329
330//
331// TODO - make a better guess (how?)
332//
333Function DetFitGuessButtonProc(ba) : ButtonControl
334        STRUCT WMButtonAction &ba
335
336        switch( ba.eventCode )
337                case 2: // mouse up
338                        // click code here
339                        Wave dispW=root:curDispPanel
340                        Wave coefW=root:coef_PeakPix2D
341                       
342                        WaveStats/Q dispW
343                        coefW[2] = V_max
344                        coefW[0] = 1                   
345                       
346                        break
347                case -1: // control being killed
348                        break
349        endswitch
350
351        return 0
352End
353
354
355
356
357
358Function DetFitButtonProc(ba) : ButtonControl
359        STRUCT WMButtonAction &ba
360
361        switch( ba.eventCode )
362                case 2: // mouse up
363                        // click code here
364                       
365                        Wave dispW=root:curDispPanel
366                        Wave coefW=root:coef_PeakPix2D
367                       
368                        FuncFitMD/H="11000111100"/NTHR=0 BroadPeak_Pix2D coefW  dispW /D                       
369                       
370                        Wave ws=W_sigma
371                        AppendtoTable/W=PanelFit#T0 ws
372                       
373                        break
374                case -1: // control being killed
375                        break
376        endswitch
377
378        return 0
379End
380
381Function DetFitHelpButtonProc(ba) : ButtonControl
382        STRUCT WMButtonAction &ba
383
384        switch( ba.eventCode )
385                case 2: // mouse up
386                        // click code here
387                       
388                        DoAlert 0,"Help file not written yet..."
389                       
390                        break
391                case -1: // control being killed
392                        break
393        endswitch
394
395        return 0
396End
Note: See TracBrowser for help on using the repository browser.