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

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

Updated the display of the "beam center finder" to better display the panels with an appropriate aspect ratio for the pixels.

Made the number of pixels (x,y) on each of the panels as globals, plus access functions. Large panels were coded for 256, but will likely be 128 pixels in reality. Make global for easy changes. Made sure that exsting functions used the global and were not hard-wired.

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