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

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

more changes and additons to display VSANS data

adding functions for IvsQ plotting

coverted much of VCALC to have similar folder structure as HDF to allow re-use of the Q-binning procedures from VCALC with real data in work files.

re-working the beam center finder to get it to work with work file data rather then only VCALC.

new plotting routines for the panels to rescale to the beam center (still in pixels, though)

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