source: sans/Dev/trunk/NCNR_User_Procedures/Reduction/VSANS/V_Test_RAW_Panel.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: 25.8 KB
Line 
1#pragma rtGlobals=3             // Use modern global access method and strict wave access.
2#pragma version=1.0
3#pragma IgorVersion=6.1
4
5//
6// this will become the equivalent of "RawWindowHook"
7//
8// Procedures to:
9// display the detector data
10// visualization tools
11// mouse interaction
12// status information necessary to understand the data
13// buttons to more functionality to process data
14
15
16// TODO
17//
18// -- have the status automatically fill in when a new file is loaded, rather than needing a click of the "status" button
19// -- need a place somewhere to show the currently displayed folder
20// -- checkboxes for "active" corrections?
21// -- display of Q, counts, QxQy, X and Y
22// -- do I need a color bar? or is this not used at all? I like it to be there, or the colors are a waste of information
23//              (then... where do I put the color bar?)
24// -- define the "hook" function, and attach it to the panel (or the main detector subwindow?)
25//
26
27
28//
29// call this after loading data to either draw the data display panel or to update the contents
30//
31// TODO
32// -- make sure that the "type" input is correctly used for the updating of the data, values, etc.
33// -- add a procedure to define the global variables for pos, counts, QxQy, etc.
34//
35Proc UpdateDisplayInformation(type)
36        String type
37       
38        DoWindow/F VSANS_Data
39//      Print V_flag
40        if(V_flag==0)
41       
42                VSANSDataPanelGlobals()
43               
44                VSANS_DataPanel()               //draws the panel
45
46        endif
47       
48        // TODO: update the information here  - in either case
49        // what isn't automatically picked up? What is "stale" on the display?
50        String/G root:Packages:NIST:VSANS:Globals:gCurDispType = type
51       
52        // fake a click on all three tabs - to populate the data
53        FakeTabClick(2)
54        FakeTabClick(1)
55        FakeTabClick(0)
56//      DoWindow/T VSANS_Data,type + " VSANS_Data"
57
58        String newTitle = "WORK_"+type
59        DoWindow/F VSANS_Data
60        DoWindow/T VSANS_Data, newTitle
61        KillStrings/Z newTitle
62       
63end
64
65//
66// creates/initializes the globals for display of the data panel
67//
68Function VSANSDataPanelGlobals()
69
70        SetDataFolder root:Packages:NIST:VSANS:Globals
71       
72        Variable/G gXPos=0
73        Variable/G gYPos=0
74        Variable/G gQX=0
75        Variable/G gQY=0
76        Variable/G gQQ=0
77        Variable/G gNCounts=0
78        String/G gCurDispFile = "default string"
79        String/G gCurTitle = ""
80        String/G gCurDispType = ""
81       
82        SetDataFolder root:
83End
84
85// TODO
86//
87// -- fill in the proper window title in the DoWindow/T command
88// -- add help text for all of the controls
89//
90Window VSANS_DataPanel() : Panel
91        PauseUpdate; Silent 1           // building window...
92        NewPanel /W=(37,45,1038,719) /N=VSANS_Data
93//      ShowTools/A
94        ModifyPanel cbRGB=(65535,60076,49151)
95
96        String curFolder = root:Packages:NIST:VSANS:Globals:gCurDispType
97        DoWindow/T VSANS_Data,curFolder + " VSANS_Data"
98        SetWindow VSANS_Data,hook(dataHook)=VSANSDataHook,hookevents=2
99       
100        SetDrawLayer UserBack
101        SetDrawEnv linethick= 2,dash= 1,fillpat= 0
102        DrawRect 200,70,310,160
103        SetDrawEnv linethick= 2,dash= 1,fillpat= 0
104        DrawRect 320,70,430,160
105        SetDrawEnv linethick= 2,dash= 1,fillpat= 0
106        DrawRect 440,70,550,160
107       
108        SetDrawEnv fsize= 18
109        DrawText 230,115,"Front"
110        SetDrawEnv fsize= 18
111        DrawText 348,115,"Middle"
112        SetDrawEnv fsize= 18
113        DrawText 476,115,"Back"
114       
115        ToolsGrid visible=1
116
117
118        TabControl tab0,pos={13,41},size={572,617},proc=VDataTabProc,tabLabel(0)="Front"
119        TabControl tab0,tabLabel(1)="Middle",tabLabel(2)="Back",value= 2
120
121// on the side 
122        Button button_status,pos={607,146},size={70,20},proc=StatusButtonProc,title="Status"
123        Button button_IvsQ,pos={689,113},size={70,20},proc=IvsQPanelButtonProc,title="I vs. Q"
124        Button button_file_m,pos={619,55},size={50,20},proc=File_m_ButtonProc,title="File <"
125        Button button_file_p,pos={679,55},size={50,20},proc=File_p_ButtonProc,title="File >"
126        Button button_log,pos={689,146},size={70,20},proc=LogLinButtonProc,title="isLin",userData="0"
127        Button button_tab_p,pos={648,81},size={50,20},proc=Tab_p_ButtonProc,title="Tab >"
128        Button button_isolate,pos={606,114},size={70,20},proc=IsolateButtonProc,title="Isolate"
129
130        TitleBox title_file,pos={606,178},size={76,20},variable= file_name
131        TitleBox title_status,pos={606,210},size={76,20},variable= root:Packages:NIST:VSANS:Globals:gCurDispFile
132       
133        Button button_tagFile,pos={603,412},size={70,20},proc=TagFileButtonProc,title="Tag File"
134        Button button_BeamCtr,pos={603,450},size={70,20},proc=BeamCtrButtonProc,title="Beam Ctr"
135
136// on the tabs, always visible
137        TitleBox title_xy,pos={24,71},size={76,20},variable= file_name
138        Slider slider_hi,pos={558,224},size={16,80},proc=HiMapSliderProc
139        Slider slider_hi,limits={0,1,0},value= 1,ticks= 0
140        Slider slider_lo,pos={558,315},size={16,80},proc=LowMapSliderProc
141        Slider slider_lo,limits={0,1,0},value= 0,ticks= 0
142
143        SetVariable xpos,pos={22,97},size={50,17},title="X "
144        SetVariable xpos,limits={-Inf,Inf,0},value= root:Packages:NIST:VSANS:Globals:gXPos
145        SetVariable xpos,help={"x-position on the detector"},frame=0,noedit=1
146        SetVariable ypos,pos={22,121},size={50,17},title="Y "
147        SetVariable ypos,limits={-Inf,Inf,0},value= root:Packages:NIST:VSANS:Globals:gYPos
148        SetVariable ypos,help={"y-position on the detector"},frame=0,noedit=1
149        SetVariable counts,pos={22,151},size={150,17},title="Counts "
150        SetVariable counts,limits={-Inf,Inf,0},value= root:Packages:NIST:VSANS:Globals:gNCounts
151        SetVariable counts,help={"Neutron counts"},frame=0,noedit=1
152        SetVariable qxval,pos={83,94},size={85,17},title="qX"
153        SetVariable qxval,help={"q value in the x-direction on the detector"},frame=0,noedit=1
154        SetVariable qxval,format="%+7.5f",limits={-Inf,Inf,0},value= root:Packages:NIST:VSANS:Globals:gQX
155        SetVariable qyval,pos={83,113},size={85,17},title="qY"
156        SetVariable qyval,help={"q value in the y-direction on the detector"},frame=0,noedit=1
157        SetVariable qyval,format="%+7.5f",limits={-Inf,Inf,0},value= root:Packages:NIST:VSANS:Globals:gQY
158        SetVariable q_pos,pos={83,132},size={85,17},title="q "
159        SetVariable q_pos,help={"q-value on the detector at (x,y)"},format="%+7.5f"
160        SetVariable q_pos,limits={-Inf,Inf,0},value= root:Packages:NIST:VSANS:Globals:gQQ,frame=0,noedit=1
161       
162        Make/O/D tmp_asdf
163        // for back panels (in pixels?)
164        Display/W=(50,185,545,620)/HOST=# tmp_asdf
165        RenameWindow #,det_panelsB
166        ModifyGraph mode=2              // mode = 2 = dots
167        ModifyGraph marker=19
168        ModifyGraph rgb=(0,0,0)
169        ModifyGraph tick=2,mirror=1
170        Label left "pixels"
171        Label bottom "pixels"   
172        SetActiveSubwindow ##
173       
174        // for middle panels (in pixels?)       
175        Display/W=(50,185,545,620)/HOST=# tmp_asdf
176        RenameWindow #,det_panelsM
177        ModifyGraph mode=2              // mode = 2 = dots
178        ModifyGraph marker=19
179        ModifyGraph rgb=(0,0,0)
180        ModifyGraph tick=2,mirror=1
181        Label left "pixels"
182        Label bottom "pixels"   
183        SetActiveSubwindow ##
184       
185        // for front panels (in pixels?)       
186        Display/W=(50,185,545,620)/HOST=# tmp_asdf
187        RenameWindow #,det_panelsF
188        ModifyGraph mode=2              // mode = 2 = dots
189        ModifyGraph marker=19
190        ModifyGraph rgb=(0,0,0)
191        ModifyGraph tick=2,mirror=1
192        Label left "pixels"
193        Label bottom "pixels"   
194        SetActiveSubwindow ##
195       
196EndMacro
197
198//
199// event code 4 = mouse moved
200//
201// mouse moved is the only event that I really care about for the data display.
202//
203// TODO
204// -- figure out how to respond only to events in the main window
205// -- figure out which is the correct image to respond "from"
206//
207Function VSANSDataHook(s)
208        STRUCT WMWinHookStruct &s
209
210        Variable hookResult = 0
211
212        switch(s.eventCode)
213                case 0:                         // Activate
214                        // Handle activate
215//                      Print "Activate"
216                        break
217
218                case 1:                         // Deactivate
219                        // Handle deactivate
220                        break
221                       
222                case 3:         //mouse down
223//                      Print "mouse down"
224//
225// TODO (Way in the future -- I could make the small graphs into "buttons" by responding to a "mouse up" (not down)
226//    that hits in one of the small graph areas, and treat that as a click on that tab
227//
228                        break
229                       
230                case 4:         // mouse moved
231                        NVAR xloc = root:Packages:NIST:VSANS:Globals:gXPos
232                        NVAR yloc = root:Packages:NIST:VSANS:Globals:gYPos
233                        NVAR gQX = root:Packages:NIST:VSANS:Globals:gQX
234                        NVAR gQY = root:Packages:NIST:VSANS:Globals:gQY
235                        NVAR gQQ = root:Packages:NIST:VSANS:Globals:gQQ
236                        NVAR gNCounts = root:Packages:NIST:VSANS:Globals:gNCounts
237                        SVAR gCurDispFile = root:Packages:NIST:VSANS:Globals:gCurDispFile
238                        SVAR gCurDispType = root:Packages:NIST:VSANS:Globals:gCurDispType               //the current folder
239                        Variable xaxval,yaxval,tab
240                       
241                        // is the mouse location within the "main" display window?
242                        // if so, do something, if not, do nothing?
243                        // right now, the "main" display is at (50,185,545,620). its name depends on the active tab
244                       
245//                              xloc = s.mouseLoc.h
246//                              yloc = s.mouseLoc.v
247
248//                      if out of bounds, exit now
249//              TODO - currently the values are hard-wired. eliminate this later if the size of the graph changes
250                        if(s.mouseLoc.h < 50 || s.mouseLoc.h > 545 || s.mouseLoc.v < 185 || s.mouseLoc.v > 620)
251                                break
252                        endif   
253                       
254//                      if(in bounds)
255//                              get the point location
256//                              update the globals --
257//                              but which data instance am I pointing to?
258//                              deduce the carriage and panel, and calculate Q
259//                      endif
260
261                        GetWindow $s.winName activeSW
262                        String activeSubwindow = S_value                // returns something like: "VSANS_Data#det_panelsF"
263                               
264                        xaxval= AxisValFromPixel("","bottom",s.mouseLoc.h)
265                        yaxval= AxisValFromPixel("","left",s.mouseLoc.v)
266                        xloc = round(xaxval)
267                        yloc = round(yaxval)
268                       
269                        // which tab is selected? -this is the main graph panel (subwindow may not be the active one!)
270                        ControlInfo/W=VSANS_Data tab0
271                        tab = V_Value
272                        if(tab == 0)
273                                activeSubwindow = "VSANS_Data#det_panelsF"
274                        elseif (tab == 1)
275                                activeSubwindow = "VSANS_Data#det_panelsM"
276                        else
277                                activeSubwindow = "VSANS_Data#det_panelsB"
278                        endif
279                       
280                        // which images are here?
281                        String detStr="",imStr,carriageStr
282                        String currentImageRef
283                        String imageList = ImageNameList(activeSubwindow,";")
284                        Variable ii,nIm,testX,testY,xctr,yctr,sdd,lam,pixSizeX,pixSizeY
285                        nIm = ItemsInList(imageList,";")
286                        gCurDispFile = imageList
287                        if(nIm==0)
288                                break           //problem, get out
289                        endif
290
291                        // images were added in the order TBLR, so look back through in the order RLBT, checking each to see if
292                        // the xy value is found on that (scaled) array
293                                               
294                        // loop backwards through the list of panels (may only be one if on the back)
295                        for(ii=nIm-1;ii>=0;ii-=1)
296                                Wave w = ImageNameToWaveRef(activeSubwindow,StringFromList(ii, imageList,";"))
297                               
298                                // which, if any image is the mouse xy location on?
299                                // use a multidemensional equivalent to x2pnt: (ScaledDimPos - DimOffset(waveName, dim))/DimDelta(waveName,dim)
300                                testX = trunc( (xloc - DimOffset(w,0))/DimDelta(w,0) )
301                                testY = trunc( (yloc - DimOffset(w,1))/DimDelta(w,1) )
302                               
303                                if( (testX > 0 && testX < DimSize(w,0)) && (testY > 0 && testY < DimSize(w,1)) )
304                                        // we're in-bounds on this wave
305                                       
306                                        // count value to the global
307                                        gNCounts = w[testX][testY]
308                                       
309                                        // deduce the detector panel
310                                        currentImageRef = StringFromList(ii, imageList,";")     //the image instance ##
311                                        // string is "data", or "data#2" etc. - so this returns "", "1", "2", or "3"
312                                        imStr = StringFromList(1, currentImageRef,"#")         
313                                        carriageStr = activeSubWindow[strlen(activeSubWindow)-1]
314                                       
315                                        if(cmpstr(carriageStr,"B")==0)
316                                                detStr = carriageStr
317                                        else
318                                                if(strlen(imStr)==0)
319                                                        imStr = "9"                     // a dummy value so I can replace it later
320                                                endif
321                                                detStr = carriageStr+imStr              // "F2" or something similar
322                                                detStr = ReplaceString("9", detStr, "T")        // ASSUMPTION :::: instances 0123 correspond to TBLR
323                                                detStr = ReplaceString("1", detStr, "B")        // ASSUMPTION :::: this is the order that the panels
324                                                detStr = ReplaceString("2", detStr, "L")        // ASSUMPTION :::: are ALWAYS added to the graph
325                                                detStr = ReplaceString("3", detStr, "R")        // ASSUMPTION ::::
326                                        endif
327                                        gCurDispFile = detStr
328
329                                        // now figure out q
330                                        // calculate the q-values, will be different depending on which panel is up (pixel size, geometry, etc.)
331                                        // TODO: !!!! get rid of the hard-wired values
332                                        // TODO: be sure that the units from HDF are what I expect
333                                        // TODO: beam center XY are pixels in the file, expected in the function, but are better suited for mm or cm
334                                        // TODO: units of xy pixel size are likely wrong
335                                        xctr = V_getDet_beam_center_x(gCurDispType,detStr)              //written in pixels
336                                        yctr = V_getDet_beam_center_y(gCurDispType,detStr)
337                                        sdd = V_getDet_distance(gCurDispType,detStr)    / 100   //written in cm, pass in meters
338                                        lam = V_getVSWavelength(gCurDispType)           //A
339                                        pixSizeX = V_getDet_x_pixel_size(gCurDispType,detStr)/10                // written mm? need cm
340                                        pixSizeY = V_getDet_y_pixel_size(gCurDispType,detStr)/10                // written mm? need cm
341//
342// TODO: these q-values ignore the non-linear corrections!!!
343// -- What can I do about this?                                 
344                                        gQQ = VC_CalcQval(xaxval+1,yaxval+1,xctr,yctr,sdd,lam,pixSizeX,pixSizeY)
345                                        gQX = VC_CalcQX(xaxval+1,yaxval+1,xctr,yctr,sdd,lam,pixSizeX,pixSizeY)
346                                        gQY = VC_CalcQY(xaxval+1,yaxval+1,xctr,yctr,sdd,lam,pixSizeX,pixSizeY)
347
348                                        ii = -1         //look no further, set ii to bad value to exit the for loop
349                                endif   //end if(mouse is over a detector panel)
350                        endfor          // end loop over list of displayed images
351               
352                        break
353                       
354                // And so on . . .
355        endswitch
356
357        return hookResult               // 0 if nothing done, else 1
358End
359
360//
361//lots to to here:
362//
363// - 1 - display the appropriate controls for each tab, and hide the others
364// - 2 - display the correct detector data for each tab, and remove the others from the graph
365// -----?? can I draw 3 graphs, and just put the right one on top?? move the other two to the side?
366//
367//
368// TODO
369//  -- add all of the controls of the VCALC panel (log scaling, adjusting the axes, etc.)
370//  x- get the panel to be correctly populated first, rather than needing to click everywhere to fill in
371//  x- remove the dependency on VCALC being initialized first, and using dummy waves from there...
372//
373// -- can I use "ReplaceWave" to do this?
374Function VDataTabProc(tca) : TabControl
375        STRUCT WMTabControlAction &tca
376
377        switch( tca.eventCode )
378                case 2: // mouse up
379                        Variable tab = tca.tab
380               
381//                      SetDataFolder root:Packages:NIST:VSANS:VCALC
382                        SetDataFolder root:
383                        RemoveFromGraph/Z /W=VSANS_Data#det_panelsB tmp_asdf
384                        RemoveFromGraph/Z /W=VSANS_Data#det_panelsM tmp_asdf
385                        RemoveFromGraph/Z /W=VSANS_Data#det_panelsF tmp_asdf
386                        SetDataFolder root:
387                       
388                        SVAR dataType = root:Packages:NIST:VSANS:Globals:gCurDispType
389// make sure log scaling is correct                     
390                        NVAR state = root:Packages:NIST:VSANS:Globals:gIsLogScale
391                       
392                       
393                        //************
394                        // -- can I use "ReplaceWave/W=VSANS_Data#det_panelsB allinCDF" to do this?
395                        // -- only works for "B", since for M and F panels, all 4 data sets are named "data"
396                        // in their respective folders...
397
398                        String tmpStr
399                        Variable ii
400                        if(tab==2)
401                                tmpStr = ImageNameList("VSANS_Data#det_panelsB",";")
402                                // for some odd reason, it appears that I need to work from the back of the list
403                                // since the traces get "renumbered" as I take them off !! A do loop may be a better choice
404                                if(ItemsInList(tmpStr) > 0)
405                                        do
406                                                RemoveImage /W=VSANS_Data#det_panelsB $(StringFromList(0,tmpStr,";"))           //get 1st item
407                                                tmpStr = ImageNameList("VSANS_Data#det_panelsB",";")                                                            //refresh list
408                                        while(ItemsInList(tmpStr) > 0)
409                                endif
410                               
411                                SetDataFolder $("root:Packages:NIST:VSANS:"+dataType+":entry:entry:instrument:detector_B")
412                                Wave det_B=data
413                               
414                                CheckDisplayed /W=VSANS_Data#det_panelsB det_B 
415                                if(V_flag == 0)         // 0 == data is not displayed, so append it
416                                        AppendImage/W=VSANS_Data#det_panelsB det_B
417                                        ModifyImage/W=VSANS_Data#det_panelsB ''#0 ctab= {*,*,ColdWarm,0}
418                                endif
419                                MoveSubWindow/W=VSANS_Data#det_panelsB fnum=(50,185,545,620)
420                                MoveSubWindow/W=VSANS_Data#det_panelsM fnum=(320,70,430,160)
421                                MoveSubWindow/W=VSANS_Data#det_panelsF fnum=(200,70,310,160)
422
423                                ModifyImage/W=VSANS_Data#det_panelsB ''#0 log=State
424                               
425                                // make the plot square
426                                ModifyGraph/W=VSANS_Data#det_panelsB width={Aspect,1}
427                               
428                                SetActiveSubWindow VSANS_Data#det_panelsB
429                                SetDataFolder root:
430                        endif
431       
432                        if(tab==1)
433                                tmpStr = ImageNameList("VSANS_Data#det_panelsM",";")
434                                // for some odd reason, it appears that I need to work from the back of the list
435                                // since the traces get "renumbered" as I take them off !! A do loop may be a better choice
436                                if(ItemsInList(tmpStr) > 0)
437                                        do
438                                                RemoveImage /W=VSANS_Data#det_panelsM $(StringFromList(0,tmpStr,";"))           //get 1st item
439                                                tmpStr = ImageNameList("VSANS_Data#det_panelsM",";")                                                            //refresh list
440                                        while(ItemsInList(tmpStr) > 0)
441                                endif
442
443                                SetDataFolder $("root:Packages:NIST:VSANS:"+dataType+":entry:entry:instrument:detector_ML")
444                                Wave det_ML=data                               
445                                SetDataFolder $("root:Packages:NIST:VSANS:"+dataType+":entry:entry:instrument:detector_MR")
446                                Wave det_MR=data
447                                SetDataFolder $("root:Packages:NIST:VSANS:"+dataType+":entry:entry:instrument:detector_MT")
448                                Wave det_MT=data
449                                SetDataFolder $("root:Packages:NIST:VSANS:"+dataType+":entry:entry:instrument:detector_MB")
450                                Wave det_MB=data
451
452                                CheckDisplayed /W=VSANS_Data#det_panelsM det_MR
453                                if(V_flag == 0)
454                                        AppendImage/W=VSANS_Data#det_panelsM det_MT             //order is important here to get LR on "top" of display
455                                        AppendImage/W=VSANS_Data#det_panelsM det_MB
456                                        AppendImage/W=VSANS_Data#det_panelsM det_ML
457                                        AppendImage/W=VSANS_Data#det_panelsM det_MR
458                                        ModifyImage/W=VSANS_Data#det_panelsM ''#0 ctab= {*,*,ColdWarm,0}                // ''#n means act on the nth image (there are 4)
459                                        ModifyImage/W=VSANS_Data#det_panelsM ''#1 ctab= {*,*,ColdWarm,0}
460                                        ModifyImage/W=VSANS_Data#det_panelsM ''#2 ctab= {*,*,ColdWarm,0}
461                                        ModifyImage/W=VSANS_Data#det_panelsM ''#3 ctab= {*,*,ColdWarm,0}
462                                endif
463                                MoveSubWindow/W=VSANS_Data#det_panelsM fnum=(50,185,545,620)
464                                MoveSubWindow/W=VSANS_Data#det_panelsB fnum=(440,70,550,160)
465                                MoveSubWindow/W=VSANS_Data#det_panelsF fnum=(200,70,310,160)
466
467                                ModifyImage/W=VSANS_Data#det_panelsM ''#0 log=State
468                                ModifyImage/W=VSANS_Data#det_panelsM ''#1 log=State
469                                ModifyImage/W=VSANS_Data#det_panelsM ''#2 log=State
470                                ModifyImage/W=VSANS_Data#det_panelsM ''#3 log=State
471                               
472                                // make the plot square
473                                ModifyGraph/W=VSANS_Data#det_panelsM width={Aspect,1}
474                                                       
475                                SetActiveSubWindow VSANS_Data#det_panelsM
476                                SetDataFolder root:
477                        endif
478
479                        if(tab==0)
480                                tmpStr = ImageNameList("VSANS_Data#det_panelsF",";")
481                                // for some odd reason, it appears that I need to work from the back of the list
482                                // since the traces get "renumbered" as I take them off !! A do loop may be a better choice
483                                if(ItemsInList(tmpStr) > 0)
484                                        do
485                                                RemoveImage /W=VSANS_Data#det_panelsF $(StringFromList(0,tmpStr,";"))           //get 1st item
486                                                tmpStr = ImageNameList("VSANS_Data#det_panelsF",";")                                                            //refresh list
487                                        while(ItemsInList(tmpStr) > 0)
488                                endif
489
490                                SetDataFolder $("root:Packages:NIST:VSANS:"+dataType+":entry:entry:instrument:detector_FL")
491                                Wave det_FL=data
492                                SetDataFolder $("root:Packages:NIST:VSANS:"+dataType+":entry:entry:instrument:detector_FR")
493                                Wave det_FR=data
494                                SetDataFolder $("root:Packages:NIST:VSANS:"+dataType+":entry:entry:instrument:detector_FT")
495                                Wave det_FT=data                               
496                                SetDataFolder $("root:Packages:NIST:VSANS:"+dataType+":entry:entry:instrument:detector_FB")
497                                Wave det_FB=data
498                                                               
499                                CheckDisplayed /W=VSANS_Data#det_panelsF det_FL
500                                if(V_flag == 0)
501                                        AppendImage/W=VSANS_Data#det_panelsF det_FT
502                                        AppendImage/W=VSANS_Data#det_panelsF det_FB
503                                        AppendImage/W=VSANS_Data#det_panelsF det_FL
504                                        AppendImage/W=VSANS_Data#det_panelsF det_FR
505                                        ModifyImage/W=VSANS_Data#det_panelsF ''#0 ctab= {*,*,ColdWarm,0}
506                                        ModifyImage/W=VSANS_Data#det_panelsF ''#1 ctab= {*,*,ColdWarm,0}
507                                        ModifyImage/W=VSANS_Data#det_panelsF ''#2 ctab= {*,*,ColdWarm,0}
508                                        ModifyImage/W=VSANS_Data#det_panelsF ''#3 ctab= {*,*,ColdWarm,0}
509                                endif
510                                MoveSubWindow/W=VSANS_Data#det_panelsF fnum=(50,185,545,620)
511                                MoveSubWindow/W=VSANS_Data#det_panelsB fnum=(440,70,550,160)
512                                MoveSubWindow/W=VSANS_Data#det_panelsM fnum=(320,70,430,160)
513                               
514                                ModifyImage/W=VSANS_Data#det_panelsF ''#0 log=State
515                                ModifyImage/W=VSANS_Data#det_panelsF ''#1 log=State
516                                ModifyImage/W=VSANS_Data#det_panelsF ''#2 log=State
517                                ModifyImage/W=VSANS_Data#det_panelsF ''#3 log=State
518
519                                // make the plot square
520                                ModifyGraph/W=VSANS_Data#det_panelsF width={Aspect,1}                           
521       
522                                SetActiveSubWindow VSANS_Data#det_panelsF
523                                SetDataFolder root:
524                        endif
525
526                                               
527                        break
528                case -1: // control being killed
529                        break
530        endswitch
531
532        return 0
533End
534
535
536// fake click on each tab to populate the data
537Function FakeTabClick(tab)
538        Variable tab
539       
540        STRUCT WMTabControlAction tca
541
542        tca.eventCode = 2               //fake mouse up
543        tca.tab = tab
544        VDataTabProc(tca)
545       
546        TabControl tab0,win=VSANS_Data,value= tab               //select the proper tab
547        return(0)
548End
549
550// TODO
551//
552// move one file number back
553//
554Function File_m_ButtonProc(ba) : ButtonControl
555        STRUCT WMButtonAction &ba
556
557        switch( ba.eventCode )
558                case 2: // mouse up
559                        // click code here
560                        break
561                case -1: // control being killed
562                        break
563        endswitch
564
565        return 0
566End
567
568// TODO
569//
570// move one file number forward
571//
572Function File_p_ButtonProc(ba) : ButtonControl
573        STRUCT WMButtonAction &ba
574
575        switch( ba.eventCode )
576                case 2: // mouse up
577                        // click code here
578                        break
579                case -1: // control being killed
580                        break
581        endswitch
582
583        return 0
584End
585
586//
587// button that mimics a click on the tab, cycling through the tabs 0->1->2->0 etc.
588// only goes one direction
589//
590Function Tab_p_ButtonProc(ba) : ButtonControl
591        STRUCT WMButtonAction &ba
592
593        switch( ba.eventCode )
594                case 2: // mouse up
595                        // click code here
596                        ControlInfo/W=VSANS_Data tab0
597                       
598                        V_Value += 1
599                        if(V_Value == 3)
600                                V_Value = 0             //reset to 0
601                        endif
602                        FakeTabClick(V_Value)
603                        break
604                case -1: // control being killed
605                        break
606        endswitch
607
608        return 0
609End
610
611// TODO
612//
613// isolates a single panel to allow a better view of the details
614// useful for T/B panels which are partially blocked from view
615//
616// will open a separate graph or panel to display the selected detector
617// (lots to do here, depending what is necessary for instrument troubleshooting)
618// - like being able to turn corrections on/off and view with different axes (pix, mm, Q)
619//
620Function IsolateButtonProc(ba) : ButtonControl
621        STRUCT WMButtonAction &ba
622
623        switch( ba.eventCode )
624                case 2: // mouse up
625                        // click code here
626                        break
627                case -1: // control being killed
628                        break
629        endswitch
630
631        return 0
632End
633
634// TODO
635//
636// opens a separate panel with the I(q) representation of the data
637// ? controls here to select how the data is processed/grouped/saved, etc.
638//
639Function IvsQPanelButtonProc(ba) : ButtonControl
640        STRUCT WMButtonAction &ba
641
642        switch( ba.eventCode )
643                case 2: // mouse up
644                        // click code here
645                       
646                        V_PlotData_Panel()
647                       
648                        break
649                case -1: // control being killed
650                        break
651        endswitch
652
653        return 0
654End
655
656// TODO
657//
658// gets the status of the currently displayed file and dumps it to the panel (not the cmd window)
659// - lots to decide here about what is the important stuff to display. There's a lot more information now
660//
661Function StatusButtonProc(ba) : ButtonControl
662        STRUCT WMButtonAction &ba
663
664        switch( ba.eventCode )
665                case 2: // mouse up
666                        // click code here
667                        break
668                case -1: // control being killed
669                        break
670        endswitch
671
672        return 0
673End
674
675
676// TODO -- this appears to be complete...
677// toggle the (z) value of the display log/lin
678//
679Function LogLinButtonProc(ba) : ButtonControl
680        STRUCT WMButtonAction &ba
681
682        switch( ba.eventCode )
683                case 2: // mouse up
684                        // click code here
685                       
686                        // which tab is active? does it matter - or do I log-scale everything?
687                        // log/lin current state is in the S_UserData string (0=linear, 1=log)
688                        ControlInfo/W=VSANS_Data button_log
689                        Variable curState,newState
690                        String newStateStr,newTitleStr
691                       
692                        curState = str2num(S_UserData)
693                       
694                        if(curState == 0)
695                                newState = 1
696                                newStateStr="1"
697                                newTitleStr = "isLog"
698                        else
699                                newState = 0
700                                newStateStr="0"
701                                newTitleStr = "isLin"
702                        endif
703                       
704                        // update the button and the global value
705                        Button button_log,userData=newStateStr,title=newTitleStr
706                        NVAR state = root:Packages:NIST:VSANS:Globals:gIsLogScale
707                        state = newState
708                       
709                        // on the front:                       
710                        ModifyImage/W=VSANS_Data#det_panelsF ''#0 log=newState
711                        ModifyImage/W=VSANS_Data#det_panelsF ''#1 log=newState
712                        ModifyImage/W=VSANS_Data#det_panelsF ''#2 log=newState
713                        ModifyImage/W=VSANS_Data#det_panelsF ''#3 log=newState
714                        //on the middle:
715                        ModifyImage/W=VSANS_Data#det_panelsM ''#0 log=newState
716                        ModifyImage/W=VSANS_Data#det_panelsM ''#1 log=newState
717                        ModifyImage/W=VSANS_Data#det_panelsM ''#2 log=newState
718                        ModifyImage/W=VSANS_Data#det_panelsM ''#3 log=newState
719                        // on the back:
720                        ModifyImage/W=VSANS_Data#det_panelsB ''#0 log=newState
721
722                        break
723                case -1: // control being killed
724                        break
725        endswitch
726
727        return 0
728End
729
730// TODO
731// possibly function to "tag" files right here in the disaply with things
732// like their intent, or other values that reduction will need, kind of like a "quick patch"
733// with limited functionality (since full function would be a nightmare!)
734Function TagFileButtonProc(ba) : ButtonControl
735        STRUCT WMButtonAction &ba
736
737        switch( ba.eventCode )
738                case 2: // mouse up
739                        // click code here
740                        DoAlert 0, "TagFileButtonProc(ba) unfinished"
741                       
742                               
743                        break
744                case -1: // control being killed
745                        break
746        endswitch
747
748        return 0
749End
750
751//TODO
752//
753//link this to the beam center finding panel
754//
755Function BeamCtrButtonProc(ba) : ButtonControl
756        STRUCT WMButtonAction &ba
757
758        switch( ba.eventCode )
759                case 2: // mouse up
760                        // click code here
761                        V_FindBeamCenter()
762                        break
763                case -1: // control being killed
764                        break
765        endswitch
766
767        return 0
768End
769
770// TODO
771//
772// link this slider to the "high" end of the color mapping for whatever is currently displayed
773//
774// -- see Buttons.ipf for the old SANS implementation
775//
776Function HiMapSliderProc(sa) : SliderControl
777        STRUCT WMSliderAction &sa
778
779        switch( sa.eventCode )
780                case -1: // control being killed
781                        break
782                default:
783                        if( sa.eventCode & 1 ) // value set
784                                Variable curval = sa.curval
785                        endif
786                        break
787        endswitch
788
789        return 0
790End
791
792// TODO
793//
794// link this slider to the "low" end of the color mapping for whatever is currently displayed
795//
796// -- see Buttons.ipf for the old SANS implementation
797//
798Function LowMapSliderProc(sa) : SliderControl
799        STRUCT WMSliderAction &sa
800
801        switch( sa.eventCode )
802                case -1: // control being killed
803                        break
804                default:
805                        if( sa.eventCode & 1 ) // value set
806                                Variable curval = sa.curval
807                        endif
808                        break
809        endswitch
810
811        return 0
812End
813
814
Note: See TracBrowser for help on using the repository browser.