source: sans/Dev/trunk/NCNR_User_Procedures/Reduction/VSANS/V_RAW_Data_Panel.ipf @ 1246

Last change on this file since 1246 was 1246, checked in by srkline, 3 years ago

A large number of changes to the size of panels to enable "Laptop Mode" where all of the panels and controls are scaled down so that they fit on screen and are still in correct proportion. For the laptop I'm using for testing, the resolution is 1920x1080. For this, a scaling of 0.7 seems to work. The on/off of the "laptop Mode" is controlled by a checkbox in the preference panel (under the General tab).

There are still more panels to update in the next commit.

File size: 42.4 KB
Line 
1#pragma rtGlobals=3             // Use modern global access method and strict wave access.
2#pragma version=1.0
3#pragma IgorVersion = 7.00
4
5//
6// this panel and proceudres is the equivalent of "RawWindowHook" for SANS
7//
8// This includes 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// DONE
17//
18// x- have the status automatically fill in when a new file is loaded, rather than needing a click of the "status" button
19// x- need a place somewhere to show the currently displayed folder
20// x- checkboxes for "active" corrections?
21// x- display of Q, counts, QxQy, X and Y
22// x- 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// x- 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// DONE
32// x- make sure that the "type" input is correctly used for the updating of the data, values, etc.
33// x- add a procedure to define the global variables for pos, counts, QxQy, etc.
34//
35Function V_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                Execute "VSANS_DataPanel()"             //draws the panel
45
46        endif
47       
48        // DONE:
49        // faking clicks on the buttons updates the information
50        String/G root:Packages:NIST:VSANS:Globals:gCurDispType = type
51       
52        // fake a click on all three tabs - to populate the data
53        V_FakeTabClick(2)
54        V_FakeTabClick(1)
55        V_FakeTabClick(0)
56
57        V_LogLinDisplayPref()           // resets the display depending on the preference state
58       
59        // either clear the status, or fake a click
60//      root:Packages:NIST:VSANS:Globals:gStatusText = "status info box"
61
62        V_FakeStatusButtonClick()
63
64// NOTE: This is where the beam center is picked up so that the panel array scaling is reset
65// so that the images will automatically display in relation to the beam center
66        V_FakeRestorePanelsButtonClick()                //so the panels display correctly
67
68       
69//      DoWindow/T VSANS_Data,type + " VSANS_Data"
70
71        // get the string with the file name that is in the "type" folder
72        // this string is what goes in the status of the display
73        SVAR gFileForDisplay = root:Packages:NIST:VSANS:Globals:gLastLoadedFile         //for the status of the display
74        SVAR gFileList = $("root:Packages:NIST:VSANS:"+type+":gFileList")
75       
76        gFileForDisplay=gFileList
77       
78
79        String newTitle = "WORK_"+type
80        DoWindow/F VSANS_Data
81        DoWindow/T VSANS_Data, newTitle
82        KillStrings/Z newTitle
83       
84end
85
86Function V_LogLinDisplayPref()
87
88        // get the state of the log/lin button, and make sure preferences are obeyed
89        // log/lin current state is in the S_UserData string (0=linear, 1=log)
90        ControlInfo/W=VSANS_Data button_log
91        Variable curState
92        curState = str2num(S_UserData)
93
94        NVAR gLogScalingAsDefault = root:Packages:NIST:VSANS:Globals:gLogScalingAsDefault
95        if(curState != gLogScalingAsDefault)
96                STRUCT WMButtonAction ba
97                ba.eventCode = 2                //fake mouse click
98                V_LogLinButtonProc(ba)
99        endif
100       
101        return(0)
102end
103
104
105//
106// creates/initializes the globals for display of the data panel
107//
108Function VSANSDataPanelGlobals()
109
110        SetDataFolder root:Packages:NIST:VSANS:Globals
111       
112        Variable/G gXPos=0
113        Variable/G gYPos=0
114        Variable/G gQX=0
115        Variable/G gQY=0
116        Variable/G gQQ=0
117        Variable/G gNCounts=0
118        String/G gCurDispFile = "default string"
119        String/G gCurTitle = ""
120        String/G gCurDispType = ""
121        String/G gStatusText = "status"
122        String/G gLastLoadedFile=""
123       
124        SetDataFolder root:
125End
126
127
128// TODO_MEDIUM
129//
130// -- now that the sliders work, label them and move them to a better location
131// -- logical location for all of the buttons
132// -- add raw data load button, load/draw mask button
133// x- fill in the proper window title in the DoWindow/T command
134// -- add help text for all of the controls
135// -- tab order? can I set this?
136//
137Window VSANS_DataPanel() : Panel
138        PauseUpdate; Silent 1           // building window...
139
140        Variable sc = 1
141                       
142        if(root:Packages:NIST:VSANS:Globals:gLaptopMode == 1)
143                sc = 0.7
144        endif
145       
146        if(root:Packages:NIST:VSANS:Globals:gLaptopMode==1)
147                NewPanel /W=(7,36,700,445) /K=1 /N=VSANS_Data
148        else
149                NewPanel /W=(37,45,1038,719) /K=1 /N=VSANS_Data
150        endif
151       
152
153//      ShowTools/A
154        ModifyPanel cbRGB=(65535,60076,49151)
155
156        String curFolder = root:Packages:NIST:VSANS:Globals:gCurDispType
157        DoWindow/T VSANS_Data,curFolder + " VSANS_Data"
158        SetWindow VSANS_Data,hook(dataHook)=VSANSDataHook,hookevents=2
159       
160        SetDrawLayer UserBack
161        SetDrawEnv linethick= 2,dash= 1,fillpat= 0
162        DrawRect 200*sc,70*sc,310*sc,160*sc
163        SetDrawEnv linethick= 2,dash= 1,fillpat= 0
164        DrawRect 320*sc,70*sc,430*sc,160*sc
165        SetDrawEnv linethick= 2,dash= 1,fillpat= 0
166        DrawRect 440*sc,70*sc,535*sc,160*sc
167       
168        SetDrawEnv fsize= 18
169        DrawText 230*sc,115*sc,"Front"
170        SetDrawEnv fsize= 18
171        DrawText 348*sc,115*sc,"Middle"
172        SetDrawEnv fsize= 18
173        DrawText 476*sc,115*sc,"Back"
174       
175        ToolsGrid visible=1
176
177
178        TabControl tab0,pos={sc*13,41*sc},size={sc*572,617*sc},proc=V_DataTabProc,tabLabel(0)="Front"
179        TabControl tab0,tabLabel(1)="Middle",tabLabel(2)="Back",value= 2,focusRing=0
180        TabControl tab0 labelBack=(63535,56076,45151)
181
182// on the side 
183        Button button_status,pos={sc*607,146*sc},size={sc*70,20*sc},proc=V_StatusButtonProc,title="Status",disable=2
184        Button button_IvsQ,pos={sc*689,113*sc},size={sc*70,20*sc},proc=V_IvsQPanelButtonProc,title="I vs. Q"
185        Button button_file_m,pos={sc*619,55*sc},size={sc*50,20*sc},proc=V_File_minus_ButtonProc,title="File <"
186        Button button_file_p,pos={sc*679,55*sc},size={sc*50,20*sc},proc=V_File_plus_ButtonProc,title="File >"
187        Button button_log,pos={sc*689,146*sc},size={sc*70,20*sc},proc=V_LogLinButtonProc,title="isLin",userData="0"
188        Button button_tab_p,pos={sc*648,81*sc},size={sc*50,20*sc},proc=V_Tab_p_ButtonProc,title="Tab >"
189        Button button_isolate,pos={sc*606,114*sc},size={sc*70,20*sc},proc=V_IsolateButtonProc,title="Isolate"
190        Button button_toWork,pos={sc*770,146*sc},size={sc*90,20*sc},proc=V_ToWorkFileButtonProc,title="to WORK"
191        Button button_annular,pos={sc*770,114*sc},size={sc*90,20*sc},proc=V_annularAvgButtonProc,title="Annular Avg"
192        Button button_SpreadPanels,pos={sc*880,114*sc},size={sc*100,20*sc},proc=V_SpreadPanelButtonProc,title="Spread Panels"
193        Button button_RestorePanels,pos={sc*880,146*sc},size={sc*100,20*sc},proc=V_RestorePanelButtonProc,title="Restore Panels"
194
195        Button button_sensor,pos={sc*607,(146+33)*sc},size={sc*70,20*sc},proc=V_SensorButtonProc,title="Sensors"
196        Button button_mask,pos={sc*689,(146+33)*sc},size={sc*70,20*sc},proc=V_AvgMaskButtonProc,title="Avg Mask"
197
198
199        TitleBox title_file,pos={sc*606,(178+30)*sc},fsize=12*sc,size={sc*76,20*sc},variable= root:Packages:NIST:VSANS:Globals:gLastLoadedFile
200        TitleBox title_dataPresent,pos={sc*606,(210+30)*sc},fsize=12*sc,size={sc*76,20*sc},variable= root:Packages:NIST:VSANS:Globals:gCurDispFile
201        TitleBox title_status,pos={sc*606,(240+30)*sc},size={sc*200,200*sc},fsize=12*sc,variable= root:Packages:NIST:VSANS:Globals:gStatusText
202       
203//      Button button_tagFile,pos={sc*720,412*sc},size={sc*70,20*sc},proc=V_TagFileButtonProc,title="Tag File"
204//      Button button_tagFile,disable=2
205//      Button button_saveIQ,pos={sc*603,412*sc},size={sc*120,20*sc},proc=V_SaveIQ_ButtonProc,title="Save I(Q) as ITX"
206//      Button button_BeamCtr,pos={sc*603,566*sc},size={sc*110,20*sc},proc=V_BeamCtrButtonProc,title="Beam Center",disable=2
207//      Button pick_trim,pos={sc*603,450*sc},size={sc*120,20*sc},proc=V_TrimDataProtoButton,title="Trim I(Q) Data"
208//      Button pick_trim,help={"This button will prompt the user for trimming parameters"}     
209       
210
211// on the tabs, always visible
212        TitleBox title_xy,pos={sc*20,65*sc},fsize=12*sc,size={sc*76,20*sc},variable= root:Packages:NIST:VSANS:Globals:gLastLoadedFile
213        Slider slider_hi,pos={sc*558,224*sc},size={sc*16,80*sc},proc=V_HiMapSliderProc
214        Slider slider_hi,limits={0,1,0*sc},value= 1,ticks= 0
215        Slider slider_lo,pos={sc*558,315*sc},size={sc*16,80*sc},proc=V_LowMapSliderProc
216        Slider slider_lo,limits={0,1,0*sc},value= 0,ticks= 0
217
218        SetVariable xpos,pos={sc*22,97*sc},size={sc*50,17*sc},title="X "
219        SetVariable xpos,limits={-Inf,Inf,0*sc},value= root:Packages:NIST:VSANS:Globals:gXPos
220        SetVariable xpos,help={"x-position on the detector"},frame=0,noedit=1
221        SetVariable ypos,pos={sc*22,121*sc},size={sc*50,17*sc},title="Y "
222        SetVariable ypos,limits={-Inf,Inf,0*sc},value= root:Packages:NIST:VSANS:Globals:gYPos
223        SetVariable ypos,help={"y-position on the detector"},frame=0,noedit=1
224        SetVariable counts,pos={sc*22,151*sc},size={sc*150,17*sc},title="Counts "
225        SetVariable counts,limits={-Inf,Inf,0*sc},value= root:Packages:NIST:VSANS:Globals:gNCounts
226        SetVariable counts,help={"Neutron counts"},frame=0,noedit=1
227        SetVariable qxval,pos={sc*83,94*sc},size={sc*85,17*sc},title="qX"
228        SetVariable qxval,help={"q value in the x-direction on the detector"},frame=0,noedit=1
229        SetVariable qxval,format="%+7.5f",limits={-Inf,Inf,0*sc},value= root:Packages:NIST:VSANS:Globals:gQX
230        SetVariable qyval,pos={sc*83,113*sc},size={sc*85,17*sc},title="qY"
231        SetVariable qyval,help={"q value in the y-direction on the detector"},frame=0,noedit=1
232        SetVariable qyval,format="%+7.5f",limits={-Inf,Inf,0*sc},value= root:Packages:NIST:VSANS:Globals:gQY
233        SetVariable q_pos,pos={sc*83,132*sc},size={sc*85,17*sc},title="q "
234        SetVariable q_pos,help={"q-value on the detector at (x,y)"},format="%+7.5f"
235        SetVariable q_pos,limits={-Inf,Inf,0*sc},value= root:Packages:NIST:VSANS:Globals:gQQ,frame=0,noedit=1
236       
237        Make/O/D tmp_asdf
238        // for back panels (in pixels) 
239//      Display/W=(50,185,545,620)/HOST=# tmp_asdf
240        Display/W=(50*sc,185*sc,517*sc,620*sc)/HOST=# tmp_asdf
241        RenameWindow #,det_panelsB
242        ModifyGraph mode=2              // mode = 2 = dots
243        ModifyGraph marker=19
244        ModifyGraph rgb=(0,0,0)
245        ModifyGraph tick=2,mirror=1
246//      Label left "pixels"                     //don't bother labeling pixels here - it will get redrawn, do it
247//      Label bottom "pixels"                   // when the selected tab is resized to be the focus
248        SetActiveSubwindow ##
249       
250        // for middle panels (in pixels?)       
251        Display/W=(50*sc,185*sc,517*sc,620*sc)/HOST=# tmp_asdf
252        RenameWindow #,det_panelsM
253        ModifyGraph mode=2              // mode = 2 = dots
254        ModifyGraph marker=19
255        ModifyGraph rgb=(0,0,0)
256        ModifyGraph tick=2,mirror=1
257//      Label left "pixels"
258//      Label bottom "pixels"   
259        SetActiveSubwindow ##
260       
261        // for front panels (in pixels?)       
262        Display/W=(50*sc,185*sc,517*sc,620*sc)/HOST=# tmp_asdf
263        RenameWindow #,det_panelsF
264        ModifyGraph mode=2              // mode = 2 = dots
265        ModifyGraph marker=19
266        ModifyGraph rgb=(0,0,0)
267        ModifyGraph tick=2,mirror=1
268//      Label left "pixels"
269//      Label bottom "pixels"   
270        SetActiveSubwindow ##
271       
272EndMacro
273
274//
275// event code 4: mouse moved
276// event code 11: keyboard events
277//
278// mouse moved is the only event that I really care about for the data display.
279//
280// TODO:
281// -- figure out how to respond only to events in the main window
282// -- figure out which is the correct image to respond "from"
283// -- More complete documentation of how the hook is identifying what graph is "under" the mouse
284//    AND what assumptions are behind this identification
285//
286//
287Function VSANSDataHook(s)
288        STRUCT WMWinHookStruct &s
289
290        Variable hookResult = 0
291
292        Variable sc = 1
293       
294        NVAR gLaptopMode = root:Packages:NIST:VSANS:Globals:gLaptopMode
295               
296        if(gLaptopMode == 1)
297                sc = 0.7
298        endif
299
300        switch(s.eventCode)
301                case 0:                         // Activate
302                        // Handle activate
303//                      Print "Activate"
304                        break
305
306                case 1:                         // Deactivate
307                        // Handle deactivate
308                        break
309                       
310                case 3:         //mouse down
311//                      Print "mouse down"
312//
313// TODO (Way in the future -- I could make the small graphs into "buttons" by responding to a "mouse up" (not down)
314//    that hits in one of the small graph areas, and treat that as a click on that tab
315// -- instead of this, I can try to get the focus rectangle to work more easily to move with the TAB,
316//    if I can intercept the keystroke (event 11), see below.
317//
318                        break
319                       
320                case 4:         // mouse moved
321                        NVAR xloc = root:Packages:NIST:VSANS:Globals:gXPos
322                        NVAR yloc = root:Packages:NIST:VSANS:Globals:gYPos
323                        NVAR gQX = root:Packages:NIST:VSANS:Globals:gQX
324                        NVAR gQY = root:Packages:NIST:VSANS:Globals:gQY
325                        NVAR gQQ = root:Packages:NIST:VSANS:Globals:gQQ
326                        NVAR gNCounts = root:Packages:NIST:VSANS:Globals:gNCounts
327                        SVAR gCurDispFile = root:Packages:NIST:VSANS:Globals:gCurDispFile
328                        SVAR gCurDispType = root:Packages:NIST:VSANS:Globals:gCurDispType               //the current folder
329                        Variable xaxval,yaxval,tab
330                       
331                        // is the mouse location within the "main" display window?
332                        // if so, do something, if not, do nothing?
333                        // right now, the "main" display is at (50,185,545,620). its name depends on the active tab
334                       
335//                              xloc = s.mouseLoc.h
336//                              yloc = s.mouseLoc.v
337
338//                      if out of bounds, exit now
339//              TODO - currently the values are hard-wired. eliminate this later if the size of the graph changes
340                        if(s.mouseLoc.h < 50*sc || s.mouseLoc.h > 545*sc || s.mouseLoc.v < 185*sc || s.mouseLoc.v > 620*sc)
341                                break
342                        endif   
343                       
344//                      if(in bounds)
345//                              get the point location
346//                              update the globals --
347//                              but which data instance am I pointing to?
348//                              deduce the carriage and panel, and calculate Q
349//                      endif
350
351                        GetWindow $s.winName activeSW
352                        String activeSubwindow = S_value                // returns something like: "VSANS_Data#det_panelsF"
353                               
354                        xaxval= AxisValFromPixel("","bottom",s.mouseLoc.h)
355                        yaxval= AxisValFromPixel("","left",s.mouseLoc.v)
356//                      xloc = round(xaxval)
357//                      yloc = round(yaxval)
358                        xloc = xaxval
359                        yloc = yaxval
360                       
361                        // which tab is selected? -this is the main graph panel (subwindow may not be the active one!)
362                        ControlInfo/W=VSANS_Data tab0
363                        tab = V_Value
364                        if(tab == 0)
365                                activeSubwindow = "VSANS_Data#det_panelsF"
366                        elseif (tab == 1)
367                                activeSubwindow = "VSANS_Data#det_panelsM"
368                        else
369                                activeSubwindow = "VSANS_Data#det_panelsB"
370                        endif
371                       
372                       
373                        // which images are here?
374                        String detStr="",imStr,carriageStr
375                        String currentImageRef
376                        String imageList = ImageNameList(activeSubwindow,";")
377                        Variable ii,nIm,testX,testY,xctr,yctr,sdd,lam,pixSizeX,pixSizeY
378                        nIm = ItemsInList(imageList,";")
379                        gCurDispFile = imageList
380                        if(nIm==0)
381                                break           //problem, get out
382                        endif
383
384                        // images were added in the order TBLR, so look back through in the order RLBT, checking each to see if
385                        // the xy value is found on that (scaled) array
386                                               
387                        // loop backwards through the list of panels (may only be one if on the back)
388                        for(ii=nIm-1;ii>=0;ii-=1)
389                                Wave w = ImageNameToWaveRef(activeSubwindow,StringFromList(ii, imageList,";"))
390                               
391                                // which, if any image is the mouse xy location on?
392                                // use a multidemensional equivalent to x2pnt: (ScaledDimPos - DimOffset(waveName, dim))/DimDelta(waveName,dim)
393
394                               
395                                testX = ScaleToIndex(w,xloc,0)
396                                testY = ScaleToIndex(w,yloc,1)
397                               
398                                if( (testX >= 0 && testX < DimSize(w,0)) && (testY >= 0 && testY < DimSize(w,1)) )
399                                        // we're in-bounds on this wave
400                                       
401                                        // count value to the global
402                                        gNCounts = w[testX][testY]              //wrong for T/B panels
403
404                                       
405                                        // deduce the detector panel
406                                        currentImageRef = StringFromList(ii, imageList,";")     //the image instance ##
407                                        // string is "data", or "data#2" etc. - so this returns "", "1", "2", or "3"
408                                        imStr = StringFromList(1, currentImageRef,"#")         
409                                        carriageStr = activeSubWindow[strlen(activeSubWindow)-1]
410                                       
411                                        if(cmpstr(carriageStr,"B")==0)
412                                                detStr = carriageStr
413                                        else
414                                                if(strlen(imStr)==0)
415                                                        imStr = "9"                     // a dummy value so I can replace it later
416                                                endif
417                                                detStr = carriageStr+imStr              // "F2" or something similar
418                                                detStr = ReplaceString("9", detStr, "T")        // ASSUMPTION :::: instances 0123 correspond to TBLR
419                                                detStr = ReplaceString("1", detStr, "B")        // ASSUMPTION :::: this is the order that the panels
420                                                detStr = ReplaceString("2", detStr, "L")        // ASSUMPTION :::: are ALWAYS added to the graph
421                                                detStr = ReplaceString("3", detStr, "R")        // ASSUMPTION ::::
422                                        endif
423                                        gCurDispFile = detStr
424
425                                        // now figure out q
426                                        // calculate the q-values, will be different depending on which panel is up (pixel size, geometry, etc.)
427                                        // DONE: !!!! get rid of the hard-wired values
428                                        // DONE: be sure that the units from HDF are what I expect
429                                        // DONE: beam center XY are pixels in the file, expected in the function, but are better suited for mm or cm
430                                        // DONE: units of xy pixel size are likely wrong
431//                                      xctr = V_getDet_beam_center_x(gCurDispType,detStr)              //written in pixels
432//                                      yctr = V_getDet_beam_center_y(gCurDispType,detStr)
433                                        xctr = V_getDet_beam_center_x_mm(gCurDispType,detStr)           //written in mm
434                                        yctr = V_getDet_beam_center_y_mm(gCurDispType,detStr)   
435                                       
436                                        sdd = V_getDet_ActualDistance(gCurDispType,detStr)              //written in cm, pass in [cm]
437                                        lam = V_getWavelength(gCurDispType)             //A
438//                                      pixSizeX = V_getDet_x_pixel_size(gCurDispType,detStr)           // written mm? need mm
439//                                      pixSizeY = V_getDet_y_pixel_size(gCurDispType,detStr)           // written mm? need mm
440//
441
442                                        String destPath = "root:Packages:NIST:VSANS:"+gCurDispType
443                                        Wave data_realDistX = $(destPath + ":entry:instrument:detector_"+detStr+":data_realDistX")
444                                        Wave data_realDistY = $(destPath + ":entry:instrument:detector_"+detStr+":data_realDistY")     
445                                       
446// DONE: figure out what coordinates I need to pass -- xloc, yloc, textX, testY, (+1 on any?)                           
447                                        //gQQ = VC_CalcQval(testX,testY,xctr,yctr,sdd,lam,pixSizeX,pixSizeY)
448                                        //gQX = VC_CalcQX(testX,testY,xctr,yctr,sdd,lam,pixSizeX,pixSizeY)
449                                        //gQY = VC_CalcQY(testX,testY,xctr,yctr,sdd,lam,pixSizeX,pixSizeY)
450                                        gQQ = V_CalcQval(testX,testY,xctr,yctr,sdd,lam,data_realDistX,data_realDistY)
451                                        gQX = V_CalcQX(testX,testY,xctr,yctr,sdd,lam,data_realDistX,data_realDistY)
452                                        gQY = V_CalcQY(testX,testY,xctr,yctr,sdd,lam,data_realDistX,data_realDistY)
453
454                                        ii = -1         //look no further, set ii to bad value to exit the for loop
455                                       
456                                        // TODO
457                                        //  this - it sets the globals to display to the pixel values, unscaled
458                                        xloc = testX
459                                        yloc = testY
460                                       
461                                endif   //end if(mouse is over a detector panel)
462                               
463
464                        endfor          // end loop over list of displayed images
465               
466                        break
467                       
468                        case 11: // keyboard event
469                                // TODO -- figure out why I'm not getting the TAB keystroke
470                                //  -- I want to be able to use the tab to change the focus only between File <.> and Tab > buttons, not everything
471                                // see the help file section "Keyboard Events" for an example and "WMWinHookStruct"
472                               
473                                //Print "key code = ",s.specialKeyCode
474                                //hookresult = 1                //if non-zero, we handled it and Igor will ignore it
475                                break
476                // And so on . . .
477        endswitch
478
479        return hookResult               // 0 if nothing done, else 1
480End
481
482
483// ********
484//
485// this procedure does most of the work for drawing the panels, setting the proper log/lin
486// scaling, the color scale, and the location based on the active tab
487//
488//lots to to here:
489//
490// - 1 - display the appropriate controls for each tab, and hide the others
491// - 2 - display the correct detector data for each tab, and remove the others from the graph
492// -----?? can I draw 3 graphs, and just put the right one on top?? move the other two to the side?
493//
494//
495// TODO_LOW
496//  -- add all of the controls of the VCALC panel (log scaling, adjusting the axes, etc.)
497//  x- get the panel to be correctly populated first, rather than needing to click everywhere to fill in
498//  x- remove the dependency on VCALC being initialized first, and using dummy waves from there...
499//
500//
501Function V_DataTabProc(tca) : TabControl
502        STRUCT WMTabControlAction &tca
503
504
505        Variable sc = 1
506       
507        NVAR gLaptopMode = root:Packages:NIST:VSANS:Globals:gLaptopMode
508               
509        if(gLaptopMode == 1)
510                sc = 0.7
511        endif
512
513        switch( tca.eventCode )
514                case 2: // mouse up
515                        Variable tab = tca.tab
516               
517//                      SetDataFolder root:Packages:NIST:VSANS:VCALC
518                        SetDataFolder root:
519                        RemoveFromGraph/Z /W=VSANS_Data#det_panelsB tmp_asdf
520                        RemoveFromGraph/Z /W=VSANS_Data#det_panelsM tmp_asdf
521                        RemoveFromGraph/Z /W=VSANS_Data#det_panelsF tmp_asdf
522                        SetDataFolder root:
523                       
524                        SVAR dataType = root:Packages:NIST:VSANS:Globals:gCurDispType
525                       
526// make sure log scaling is correct
527                        NVAR state = root:Packages:NIST:VSANS:Globals:gIsLogScale
528                        if(State == 0)
529                                // lookup wave
530                                Wave LookupWave = root:Packages:NIST:VSANS:Globals:linearLookupWave
531                        else
532                                // lookup wave - the linear version
533                                Wave LookupWave = root:Packages:NIST:VSANS:Globals:logLookupWave
534                        endif
535                                               
536                       
537                        //************
538                        // -- can I use "ReplaceWave/W=VSANS_Data#det_panelsB allinCDF" to do this?
539                        // -- only works for "B", since for M and F panels, all 4 data sets are named "data"
540                        // in their respective folders...
541                       
542                       
543                        // get the slider values for the color mapping
544                        Variable lo,hi,lo_B,hi_B
545                        Variable lo_MT,lo_MB,lo_MR,lo_ML
546                        Variable lo_FT,lo_FB,lo_FR,lo_FL
547                        Variable hi_MT,hi_MB,hi_MR,hi_ML
548                        Variable hi_FT,hi_FB,hi_FR,hi_FL
549                        ControlInfo slider_lo
550                        lo = V_Value
551                        ControlInfo slider_hi
552                        hi = V_Value
553                       
554                       
555                        String tmpStr
556                        Variable ii
557                        if(tab==2)
558                                tmpStr = ImageNameList("VSANS_Data#det_panelsB",";")
559                                // for some odd reason, it appears that I need to work from the back of the list
560                                // since the traces get "renumbered" as I take them off !! A do loop may be a better choice
561                                if(ItemsInList(tmpStr) > 0)
562                                        do
563                                                RemoveImage /W=VSANS_Data#det_panelsB $(StringFromList(0,tmpStr,";"))           //get 1st item
564                                                tmpStr = ImageNameList("VSANS_Data#det_panelsB",";")                                                            //refresh list
565                                        while(ItemsInList(tmpStr) > 0)
566                                endif
567                               
568                                SetDataFolder $("root:Packages:NIST:VSANS:"+dataType+":entry:instrument:detector_B")
569                                Wave det_B=data
570                               
571                                CheckDisplayed /W=VSANS_Data#det_panelsB det_B 
572                                if(V_flag == 0)         // 0 == data is not displayed, so append it
573                                        AppendImage/W=VSANS_Data#det_panelsB det_B
574                                        lo_B = lo*(WaveMax(det_B) - WaveMin(det_B)) + WaveMin(det_B)
575                                        hi_B = hi*(WaveMax(det_B) - WaveMin(det_B)) + WaveMin(det_B)
576                                        ModifyImage/W=VSANS_Data#det_panelsB ''#0 ctab= {lo_B,hi_B,ColdWarm,0}          // don't autoscale {*,*,ColdWarm,0}
577                                endif
578                                MoveSubWindow/W=VSANS_Data#det_panelsB fnum=(50*sc,185*sc,517*sc,620*sc)
579                                MoveSubWindow/W=VSANS_Data#det_panelsM fnum=(320*sc,70*sc,430*sc,160*sc)
580                                MoveSubWindow/W=VSANS_Data#det_panelsF fnum=(200*sc,70*sc,310*sc,160*sc)
581
582                                ModifyImage/W=VSANS_Data#det_panelsB ''#0 ctabAutoscale=0,lookup= LookupWave
583                               
584//                              // make the plot square
585//                              ModifyGraph/W=VSANS_Data#det_panelsB width={Aspect,1}
586                                // match the aspect ratio of the data
587                                ModifyGraph/W=VSANS_Data#det_panelsB width={Aspect,0.41}                        //680/1656 = 0.41
588                               
589                                SetActiveSubWindow VSANS_Data#det_panelsB
590                                Label left "pixels"
591                                Label bottom "pixels"
592                                SetDataFolder root:
593                        endif
594       
595                        if(tab==1)
596                                tmpStr = ImageNameList("VSANS_Data#det_panelsM",";")
597                                // for some odd reason, it appears that I need to work from the back of the list
598                                // since the traces get "renumbered" as I take them off !! A do loop may be a better choice
599                                if(ItemsInList(tmpStr) > 0)
600                                        do
601                                                RemoveImage /W=VSANS_Data#det_panelsM $(StringFromList(0,tmpStr,";"))           //get 1st item
602                                                tmpStr = ImageNameList("VSANS_Data#det_panelsM",";")                                                            //refresh list
603                                        while(ItemsInList(tmpStr) > 0)
604                                endif
605
606                                SetDataFolder $("root:Packages:NIST:VSANS:"+dataType+":entry:instrument:detector_ML")
607                                Wave det_ML=data                               
608                                SetDataFolder $("root:Packages:NIST:VSANS:"+dataType+":entry:instrument:detector_MR")
609                                Wave det_MR=data
610                                SetDataFolder $("root:Packages:NIST:VSANS:"+dataType+":entry:instrument:detector_MT")
611                                Wave det_MT=data
612                                SetDataFolder $("root:Packages:NIST:VSANS:"+dataType+":entry:instrument:detector_MB")
613                                Wave det_MB=data
614
615                                CheckDisplayed /W=VSANS_Data#det_panelsM det_MR
616                                if(V_flag == 0)
617                                        AppendImage/W=VSANS_Data#det_panelsM det_MT             //order is important here to get LR on "top" of display
618                                        AppendImage/W=VSANS_Data#det_panelsM det_MB
619                                        AppendImage/W=VSANS_Data#det_panelsM det_ML
620                                        AppendImage/W=VSANS_Data#det_panelsM det_MR
621                                        lo_MT = lo*(WaveMax(det_MT) - WaveMin(det_MT)) + WaveMin(det_MT)
622                                        hi_MT = hi*(WaveMax(det_MT) - WaveMin(det_MT)) + WaveMin(det_MT)
623                                        lo_MB = lo*(WaveMax(det_MB) - WaveMin(det_MB)) + WaveMin(det_MB)
624                                        hi_MB = hi*(WaveMax(det_MB) - WaveMin(det_MB)) + WaveMin(det_MB)
625                                        lo_ML = lo*(WaveMax(det_ML) - WaveMin(det_ML)) + WaveMin(det_ML)
626                                        hi_ML = hi*(WaveMax(det_ML) - WaveMin(det_ML)) + WaveMin(det_ML)
627                                        lo_MR = lo*(WaveMax(det_MR) - WaveMin(det_MR)) + WaveMin(det_MR)
628                                        hi_MR = hi*(WaveMax(det_MR) - WaveMin(det_MR)) + WaveMin(det_MR)
629                                       
630                                        ModifyImage/W=VSANS_Data#det_panelsM ''#0 ctab= {lo_MT,hi_MT,ColdWarm,0}                // ''#n means act on the nth image (there are 4)
631                                        ModifyImage/W=VSANS_Data#det_panelsM ''#1 ctab= {lo_MB,hi_MB,ColdWarm,0}
632                                        ModifyImage/W=VSANS_Data#det_panelsM ''#2 ctab= {lo_ML,hi_ML,ColdWarm,0}
633                                        ModifyImage/W=VSANS_Data#det_panelsM ''#3 ctab= {lo_MR,hi_MR,ColdWarm,0}
634                                endif
635                                MoveSubWindow/W=VSANS_Data#det_panelsM fnum=(50*sc,185*sc,517*sc,620*sc)
636                                MoveSubWindow/W=VSANS_Data#det_panelsB fnum=(440*sc,70*sc,550*sc,160*sc)
637                                MoveSubWindow/W=VSANS_Data#det_panelsF fnum=(200*sc,70*sc,310*sc,160*sc)
638
639                                ModifyImage/W=VSANS_Data#det_panelsM ''#0 ctabAutoscale=0,lookup= LookupWave
640                                ModifyImage/W=VSANS_Data#det_panelsM ''#1 ctabAutoscale=0,lookup= LookupWave
641                                ModifyImage/W=VSANS_Data#det_panelsM ''#2 ctabAutoscale=0,lookup= LookupWave
642                                ModifyImage/W=VSANS_Data#det_panelsM ''#3 ctabAutoscale=0,lookup= LookupWave
643                               
644                                // make the plot square
645                                ModifyGraph/W=VSANS_Data#det_panelsM width={Aspect,1}
646                                                       
647                                SetActiveSubWindow VSANS_Data#det_panelsM
648                                Label left "pixels"
649                                Label bottom "pixels"
650                                SetDataFolder root:
651                        endif
652
653                        if(tab==0)
654                                tmpStr = ImageNameList("VSANS_Data#det_panelsF",";")
655                                // for some odd reason, it appears that I need to work from the back of the list
656                                // since the traces get "renumbered" as I take them off !! A do loop may be a better choice
657                                if(ItemsInList(tmpStr) > 0)
658                                        do
659                                                RemoveImage /W=VSANS_Data#det_panelsF $(StringFromList(0,tmpStr,";"))           //get 1st item
660                                                tmpStr = ImageNameList("VSANS_Data#det_panelsF",";")                                                            //refresh list
661                                        while(ItemsInList(tmpStr) > 0)
662                                endif
663
664                                SetDataFolder $("root:Packages:NIST:VSANS:"+dataType+":entry:instrument:detector_FL")
665                                Wave det_FL=data
666                                SetDataFolder $("root:Packages:NIST:VSANS:"+dataType+":entry:instrument:detector_FR")
667                                Wave det_FR=data
668                                SetDataFolder $("root:Packages:NIST:VSANS:"+dataType+":entry:instrument:detector_FT")
669                                Wave det_FT=data                               
670                                SetDataFolder $("root:Packages:NIST:VSANS:"+dataType+":entry:instrument:detector_FB")
671                                Wave det_FB=data
672                                                               
673                                CheckDisplayed /W=VSANS_Data#det_panelsF det_FL
674                                if(V_flag == 0)
675                                        AppendImage/W=VSANS_Data#det_panelsF det_FT
676                                        AppendImage/W=VSANS_Data#det_panelsF det_FB
677                                        AppendImage/W=VSANS_Data#det_panelsF det_FL
678                                        AppendImage/W=VSANS_Data#det_panelsF det_FR
679                                        lo_FT = lo*(WaveMax(det_FT) - WaveMin(det_FT)) + WaveMin(det_FT)
680                                        hi_FT = hi*(WaveMax(det_FT) - WaveMin(det_FT)) + WaveMin(det_FT)
681                                        lo_FB = lo*(WaveMax(det_FB) - WaveMin(det_FB)) + WaveMin(det_FB)
682                                        hi_FB = hi*(WaveMax(det_FB) - WaveMin(det_FB)) + WaveMin(det_FB)
683                                        lo_FL = lo*(WaveMax(det_FL) - WaveMin(det_FL)) + WaveMin(det_FL)
684                                        hi_FL = hi*(WaveMax(det_FL) - WaveMin(det_FL)) + WaveMin(det_FL)
685                                        lo_FR = lo*(WaveMax(det_FR) - WaveMin(det_FR)) + WaveMin(det_FR)
686                                        hi_FR = hi*(WaveMax(det_FR) - WaveMin(det_FR)) + WaveMin(det_FR)
687                                       
688                                        ModifyImage/W=VSANS_Data#det_panelsF ''#0 ctab= {lo_FT,hi_FT,ColdWarm,0}
689                                        ModifyImage/W=VSANS_Data#det_panelsF ''#1 ctab= {lo_FB,hi_FB,ColdWarm,0}
690                                        ModifyImage/W=VSANS_Data#det_panelsF ''#2 ctab= {lo_FL,hi_FL,ColdWarm,0}
691                                        ModifyImage/W=VSANS_Data#det_panelsF ''#3 ctab= {lo_FR,hi_FR,ColdWarm,0}
692                                endif
693                                MoveSubWindow/W=VSANS_Data#det_panelsF fnum=(50*sc,185*sc,517*sc,620*sc)
694                                MoveSubWindow/W=VSANS_Data#det_panelsB fnum=(440*sc,70*sc,550*sc,160*sc)
695                                MoveSubWindow/W=VSANS_Data#det_panelsM fnum=(320*sc,70*sc,430*sc,160*sc)
696                               
697                                ModifyImage/W=VSANS_Data#det_panelsF ''#0 ctabAutoscale=0,lookup= LookupWave
698                                ModifyImage/W=VSANS_Data#det_panelsF ''#1 ctabAutoscale=0,lookup= LookupWave
699                                ModifyImage/W=VSANS_Data#det_panelsF ''#2 ctabAutoscale=0,lookup= LookupWave
700                                ModifyImage/W=VSANS_Data#det_panelsF ''#3 ctabAutoscale=0,lookup= LookupWave
701
702                                // make the plot square
703                                ModifyGraph/W=VSANS_Data#det_panelsF width={Aspect,1}                           
704       
705                                SetActiveSubWindow VSANS_Data#det_panelsF
706                                Label left "pixels"
707                                Label bottom "pixels"
708                                SetDataFolder root:
709                        endif
710
711                                               
712                        break
713                case -1: // control being killed
714                        break
715        endswitch
716
717
718// update the status when the tab is clicked                   
719        STRUCT WMButtonAction sa
720        sa.eventCode = 2
721        V_StatusButtonProc(sa)
722                       
723                       
724        return 0
725End
726
727
728// fake restore panels button click
729Function V_FakeRestorePanelsButtonClick()
730
731        STRUCT WMButtonAction ba
732        ba.eventCode = 2
733        V_RestorePanelButtonProc(ba)
734       
735        return(0)
736End
737
738
739// fake status button click
740Function V_FakeStatusButtonClick()
741
742        STRUCT WMButtonAction ba
743        ba.eventCode = 2
744        V_StatusButtonProc(ba)
745       
746        return(0)
747End
748
749// fake click on each tab to populate the data
750Function V_FakeTabClick(tab)
751        Variable tab
752       
753        STRUCT WMTabControlAction tca
754
755        tca.eventCode = 2               //fake mouse up
756        tca.tab = tab
757        V_DataTabProc(tca)
758       
759        TabControl tab0,win=VSANS_Data,value= tab               //select the proper tab
760        return(0)
761End
762
763//
764//
765// move one file number back
766//
767Function V_File_minus_ButtonProc(ba) : ButtonControl
768        STRUCT WMButtonAction &ba
769
770        switch( ba.eventCode )
771                case 2: // mouse up
772                        // click code here
773                        V_LoadPlotAndDisplayRAW(-1)
774                       
775                        break
776                case -1: // control being killed
777                        break
778        endswitch
779
780        return 0
781End
782
783//
784//
785// move one file number forward
786//
787Function V_File_plus_ButtonProc(ba) : ButtonControl
788        STRUCT WMButtonAction &ba
789
790        switch( ba.eventCode )
791                case 2: // mouse up
792                        // click code here
793                        V_LoadPlotAndDisplayRAW(1)
794
795                        break
796                case -1: // control being killed
797                        break
798        endswitch
799
800        return 0
801End
802
803//
804// button that mimics a click on the tab, cycling through the tabs 0->1->2->0 etc.
805// only goes one direction
806//
807Function V_Tab_p_ButtonProc(ba) : ButtonControl
808        STRUCT WMButtonAction &ba
809
810        switch( ba.eventCode )
811                case 2: // mouse up
812                        // click code here
813                        ControlInfo/W=VSANS_Data tab0
814                       
815                        V_Value += 1
816                        if(V_Value == 3)
817                                V_Value = 0             //reset to 0
818                        endif
819                        V_FakeTabClick(V_Value)
820
821// now part of every tab click
822//// update the status when the tab is clicked                 
823                        STRUCT WMButtonAction sa
824                        sa.eventCode = 2
825                        V_StatusButtonProc(sa)
826
827                        break
828                case -1: // control being killed
829                        break
830        endswitch
831
832        return 0
833End
834
835//
836// opens up the graph of the sensors available
837//
838Function V_SensorButtonProc(ba) : ButtonControl
839        STRUCT WMButtonAction &ba
840
841        switch( ba.eventCode )
842                case 2: // mouse up
843                        // click code here
844                        V_InitSensorGraph()
845                        break
846                case -1: // control being killed
847                        break
848        endswitch
849
850        return 0
851End
852
853//
854// opens up the graph of the masking options
855//
856Function V_AvgMaskButtonProc(ba) : ButtonControl
857        STRUCT WMButtonAction &ba
858
859        switch( ba.eventCode )
860                case 2: // mouse up
861                        // click code here
862                        Execute "V_Display_Four_Panels()"
863                        break
864                case -1: // control being killed
865                        break
866        endswitch
867
868        return 0
869End
870
871// See V_Detector_Isolate.ipf
872// isolates a single panel to allow a better view of the details
873// useful for T/B panels which are partially blocked from view
874//
875// will open a separate panel to display the selected detector
876// (more to do here, depending what is necessary for instrument troubleshooting)
877// - like being able to turn corrections on/off and view with different axes (pix, mm, Q)
878//
879Function V_IsolateButtonProc(ba) : ButtonControl
880        STRUCT WMButtonAction &ba
881
882        switch( ba.eventCode )
883                case 2: // mouse up
884                        // click code here
885                        V_DetectorIsolate()
886                        break
887                case -1: // control being killed
888                        break
889        endswitch
890
891        return 0
892End
893
894//
895// if the data display is RAW, convert to the specified WORK data type
896//
897// DONE
898// x- better error checking
899// x- if the data type is not RAW, can I Copy Folder instead?
900//
901Function V_ToWorkFileButtonProc(ba) : ButtonControl
902        STRUCT WMButtonAction &ba
903
904        switch( ba.eventCode )
905                case 2: // mouse up
906                        // click code here
907                       
908                        Execute "V_Convert_to_Workfile()"
909
910                        break
911                case -1: // control being killed
912                        break
913        endswitch
914
915        return 0
916End
917
918
919//
920//
921// opens a separate panel with the I(q) representation of the data
922//  controls on the panel select how the data is processed/grouped, etc.
923//
924//
925Function V_IvsQPanelButtonProc(ba) : ButtonControl
926        STRUCT WMButtonAction &ba
927
928        switch( ba.eventCode )
929                case 2: // mouse up
930                        // click code here
931                       
932                        V_PlotData_Panel()              //-9999 requests a read from the popup on the panel
933                        Variable binType = V_GetBinningPopMode()
934                        ControlInfo/W=V_1D_Data popup0
935                        V_BinningModePopup("",binType,S_Value)          // does binning of current popString and updates the graph
936                       
937                        break
938                case -1: // control being killed
939                        break
940        endswitch
941
942        return 0
943End
944
945
946//
947// DONE:
948// x- simply calls the missing parameter dialog to do the average.
949//  see the file V_IQ_Annular.ipf for all of the features yet to be added.
950//
951// x- currently just the graph, no controls
952//
953Function V_annularAvgButtonProc(ba) : ButtonControl
954        STRUCT WMButtonAction &ba
955
956        switch( ba.eventCode )
957                case 2: // mouse up
958                        // click code here
959                       
960                        Execute "V_Annular_Binning()"                   
961
962                        break
963                case -1: // control being killed
964                        break
965        endswitch
966
967        return 0
968End
969
970//
971//
972// gets the status of the currently displayed file and dumps it to the panel (not the cmd window)
973// - lots to decide here about what is the important stuff to display. There's a lot more information for VSANS
974//
975Function V_StatusButtonProc(ba) : ButtonControl
976        STRUCT WMButtonAction &ba
977
978        switch( ba.eventCode )
979                case 2: // mouse up
980                        // click code here
981                       
982                        // figure out wether to display per carraige, or the whole file
983                        SVAR str = root:Packages:NIST:VSANS:Globals:gStatusText
984                        SVAR type = root:Packages:NIST:VSANS:Globals:gCurDispType               //what folder
985                        // which tab active
986                        ControlInfo/W=VSANS_Data tab0
987                        Variable curTab = V_value
988                       
989//                      // fake this, since if the tab was clicked, it hasn't been updated yet and we're off by one
990//                      if(ba.eventCode == 3)
991//                              curTab += 1
992//                              if(curTab == 3)
993//                                      curTab = 0
994//                              endif
995//                      endif
996                       
997                        //
998                        str = "Current data is from "+ type + "\r"
999                        str += "Description = "+V_getSampleDescription(type) + "\r"
1000                        str += "Wavelength is "+num2str(V_getWavelength(type)) + " A \r"
1001                        if(curTab == 2)
1002                                str += "SDD B = "+num2str(V_getDet_ActualDistance(type,"B")) + " cm \r"         //V_getDet_distance(fname,detStr)
1003                        endif
1004                        if(curTab == 1)
1005                                str += "SDD ML = "+num2str(V_getDet_ActualDistance(type,"ML")) + " cm   "
1006                                str += "offset = "+num2str(V_getDet_LateralOffset(type,"ML")) + " cm \r"
1007                                str += "SDD MR = "+num2str(V_getDet_ActualDistance(type,"MR")) + " cm   "
1008                                str += "offset = "+num2str(V_getDet_LateralOffset(type,"MR")) + " cm \r"
1009                                str += "SDD MT = "+num2str(V_getDet_ActualDistance(type,"MT")) + " cm   "
1010                                str += "offset = "+num2str(V_getDet_VerticalOffset(type,"MT")) + " cm \r"
1011                                str += "SDD MB = "+num2str(V_getDet_ActualDistance(type,"MB")) + " cm   "
1012                                str += "offset = "+num2str(V_getDet_VerticalOffset(type,"MB")) + " cm \r"
1013                        endif
1014                        if(curTab == 0)
1015                                str += "SDD FL = "+num2str(V_getDet_ActualDistance(type,"FL")) + " cm   "
1016                                str += "offset = "+num2str(V_getDet_LateralOffset(type,"FL")) + " cm \r"
1017                                str += "SDD FR = "+num2str(V_getDet_ActualDistance(type,"FR")) + " cm   "
1018                                str += "offset = "+num2str(V_getDet_LateralOffset(type,"FR")) + " cm \r"
1019                                str += "SDD FT = "+num2str(V_getDet_ActualDistance(type,"FT")) + " cm   "
1020                                str += "offset = "+num2str(V_getDet_VerticalOffset(type,"FT")) + " cm \r"
1021                                str += "SDD FB = "+num2str(V_getDet_ActualDistance(type,"FB")) + " cm   "
1022                                str += "offset = "+num2str(V_getDet_VerticalOffset(type,"FB")) + " cm \r"
1023                        endif
1024                       
1025                       
1026                       
1027                       
1028                       
1029                        break
1030                case -1: // control being killed
1031                        break
1032        endswitch
1033
1034        return 0
1035End
1036
1037
1038// TODO_VERIFY:
1039// x- link this to the preferences for the display. this is done in UpdateDisplayInformation (the main call) so that
1040//     the panels are rescaled only once, rather than toggled three times (F, M, B) if I call from the tabProc
1041// -- come up with a better definition of the log lookup wave (> 1000 pts, what is the first point)
1042// -- make an equivalent linear wave
1043// -- hard wire it in so it is created at initialization and stored someplace safe
1044// -- catch the error if it doesn't exist (re-make the wave as needed)
1045//
1046// Using the ModifyImage log=1 keyword fails for values of zero in the data, which is a common
1047// occurrence with count data. the display just goes all gray, so that's not an option. Use the lookup wave instead
1048//
1049// toggle the (z) value of the display log/lin
1050//
1051Function V_LogLinButtonProc(ba) : ButtonControl
1052        STRUCT WMButtonAction &ba
1053
1054        switch( ba.eventCode )
1055                case 2: // mouse up
1056                        // click code here
1057                       
1058                        // which tab is active? does it matter - or do I log-scale everything?
1059                        // log/lin current state is in the S_UserData string (0=linear, 1=log)
1060                        ControlInfo/W=VSANS_Data button_log
1061                        Variable curState,newState
1062                        String newStateStr,newTitleStr
1063                       
1064                       
1065                        curState = str2num(S_UserData)
1066                       
1067                        if(curState == 0)
1068                                newState = 1
1069                                newStateStr="1"
1070                                newTitleStr = "isLog"
1071                                // lookup wave
1072                                Wave LookupWave = root:Packages:NIST:VSANS:Globals:logLookupWave
1073                        else
1074                                newState = 0
1075                                newStateStr="0"
1076                                newTitleStr = "isLin"
1077                                // lookup wave - the linear version
1078                                Wave LookupWave = root:Packages:NIST:VSANS:Globals:linearLookupWave
1079                        endif
1080                       
1081                        // update the button and the global value
1082                        Button button_log,userData=newStateStr,title=newTitleStr
1083                        NVAR state = root:Packages:NIST:VSANS:Globals:gIsLogScale
1084                        state = newState
1085                       
1086                        // on the front:                       
1087                        ModifyImage/W=VSANS_Data#det_panelsF ''#0 ctabAutoscale=0,lookup= LookupWave
1088                        ModifyImage/W=VSANS_Data#det_panelsF ''#1 ctabAutoscale=0,lookup= LookupWave
1089                        ModifyImage/W=VSANS_Data#det_panelsF ''#2 ctabAutoscale=0,lookup= LookupWave
1090                        ModifyImage/W=VSANS_Data#det_panelsF ''#3 ctabAutoscale=0,lookup= LookupWave
1091                        //on the middle:
1092//                      ModifyImage/W=VSANS_Data#det_panelsM ''#0 log=newState
1093//                      ModifyImage/W=VSANS_Data#det_panelsM ''#1 log=newState
1094//                      ModifyImage/W=VSANS_Data#det_panelsM ''#2 log=newState
1095//                      ModifyImage/W=VSANS_Data#det_panelsM ''#3 log=newState
1096                               
1097                        ModifyImage/W=VSANS_Data#det_panelsM ''#0 ctabAutoscale=0,lookup= LookupWave
1098                        ModifyImage/W=VSANS_Data#det_panelsM ''#1 ctabAutoscale=0,lookup= LookupWave
1099                        ModifyImage/W=VSANS_Data#det_panelsM ''#2 ctabAutoscale=0,lookup= LookupWave
1100                        ModifyImage/W=VSANS_Data#det_panelsM ''#3 ctabAutoscale=0,lookup= LookupWave
1101
1102
1103                        // on the back:
1104                        ModifyImage/W=VSANS_Data#det_panelsB ''#0 ctabAutoscale=0,lookup= LookupWave
1105
1106                        break
1107                case -1: // control being killed
1108                        break
1109        endswitch
1110
1111        return 0
1112End
1113
1114// TODO_LOW
1115// -- possibly use this function to "tag" files right here in the disaply with things
1116// like their intent, or other values that reduction will need, kind of like a "quick patch"
1117// with limited functionality (since full function would be a nightmare!)
1118Function V_TagFileButtonProc(ba) : ButtonControl
1119        STRUCT WMButtonAction &ba
1120
1121        switch( ba.eventCode )
1122                case 2: // mouse up
1123                        // click code here
1124                        DoAlert 0, "TagFileButtonProc(ba) unfinished - this may be used to 'tag' a file as scatter, trans, emp, bkg, etc."
1125                       
1126                               
1127                        break
1128                case -1: // control being killed
1129                        break
1130        endswitch
1131
1132        return 0
1133End
1134
1135// TODO_LOW
1136// -- currently this button is NOT visible on the RAW data display. Any saving of data
1137//    must go through a protocol (RAW can't be saved)
1138// -- fill in more functionality
1139// -- currently a straight concatentation of all data, no options
1140// -- maybe allow save of single panels?
1141// -- any other options?
1142Function V_SaveIQ_ButtonProc(ba) : ButtonControl
1143        STRUCT WMButtonAction &ba
1144
1145        switch( ba.eventCode )
1146                case 2: // mouse up
1147                        // click code here
1148
1149//                      V_SimpleSave1DData("root:Packages:NIST:VSANS:","","","")       
1150
1151// this is the same as clicking the I(q) button. Ensures that the current file has been averaged,
1152// and the data being saved is not "stale"
1153
1154                        V_PlotData_Panel()              //
1155                        Variable binType = V_GetBinningPopMode()
1156                        ControlInfo/W=V_1D_Data popup0
1157                        V_BinningModePopup("",binType,S_Value)          // does default circular binning and updates the graph
1158       
1159                        SVAR type = root:Packages:NIST:VSANS:Globals:gCurDispType               //what folder
1160
1161                        // look for the binning type
1162//                      Variable binType
1163//                      ControlInfo/W=V_1D_Data popup0
1164//                      binType = (V_flag == 0) ? 1 : V_flag            // if binType not defined, set binType == 1
1165
1166                        String saveName="",exten=""
1167                // write out the data set to a file
1168                        if(strlen(saveName)==0)
1169                                Execute "V_GetNameForSave()"
1170                                SVAR newName = root:saveName
1171                                saveName = newName
1172                        endif
1173                       
1174//                      V_Write1DData_ITX("root:Packages:NIST:VSANS:",type,saveName,binType)
1175
1176                        V_Write1DData_Individual("root:Packages:NIST:VSANS:",type,saveName,exten,binType)
1177       
1178                        Print "Saved file: "    +       saveName + ".itx"       
1179                        break
1180                case -1: // control being killed
1181                        break
1182        endswitch
1183
1184        return 0
1185End
1186
1187//TODO_LOW
1188//
1189//link this to the beam center finding panel
1190//
1191Function V_BeamCtrButtonProc(ba) : ButtonControl
1192        STRUCT WMButtonAction &ba
1193
1194        switch( ba.eventCode )
1195                case 2: // mouse up
1196                        // click code here
1197                        DoAlert 0,"Beam Center panel is under construction..."
1198//                      V_FindBeamCenter()
1199                        break
1200                case -1: // control being killed
1201                        break
1202        endswitch
1203
1204        return 0
1205End
1206
1207//
1208//
1209// this "spreads" the display of panels to a nominal separation for easier viewing
1210//
1211Function V_SpreadPanelButtonProc(ba) : ButtonControl
1212        STRUCT WMButtonAction &ba
1213
1214        switch( ba.eventCode )
1215                case 2: // mouse up
1216                        // click code here
1217                        V_SpreadOutPanels()
1218                       
1219                        break
1220                case -1: // control being killed
1221                        break
1222        endswitch
1223
1224        return 0
1225End
1226
1227//
1228//
1229// this "restores" the display of panels to their actual position based on the apparent beam center
1230//
1231Function V_RestorePanelButtonProc(ba) : ButtonControl
1232        STRUCT WMButtonAction &ba
1233
1234        switch( ba.eventCode )
1235                case 2: // mouse up
1236                        // click code here
1237                        V_RestorePanels()
1238                               
1239                        break
1240                case -1: // control being killed
1241                        break
1242        endswitch
1243
1244        return 0
1245End
1246
1247// TODO
1248//
1249// link this slider to the "high" end of the color mapping for whatever is currently displayed
1250//
1251// -- see Buttons.ipf for the old SANS implementation
1252//
1253Function V_HiMapSliderProc(sa) : SliderControl
1254        STRUCT WMSliderAction &sa
1255
1256        switch( sa.eventCode )
1257                case -1: // control being killed
1258                        break
1259                default:
1260                        if( sa.eventCode & 1 ) // value set
1261                                Variable curval = sa.curval
1262                                ControlInfo tab0
1263                                V_FakeTabClick(V_Value)
1264                               
1265//                              ControlInfo slider_lo
1266//                              V_MakeImageLookupTables(10000,V_Value,curval)
1267                        endif
1268                        break
1269        endswitch
1270
1271        return 0
1272End
1273
1274// TODO
1275//
1276// link this slider to the "low" end of the color mapping for whatever is currently displayed
1277//
1278// -- see Buttons.ipf for the old SANS implementation
1279//
1280Function V_LowMapSliderProc(sa) : SliderControl
1281        STRUCT WMSliderAction &sa
1282
1283        switch( sa.eventCode )
1284                case -1: // control being killed
1285                        break
1286                default:
1287                        if( sa.eventCode & 1 ) // value set
1288                                Variable curval = sa.curval
1289                                ControlInfo tab0
1290                                V_FakeTabClick(V_Value)
1291
1292//                              ControlInfo slider_hi
1293//                              V_MakeImageLookupTables(10000,curval,V_Value)
1294                        endif
1295                        break
1296        endswitch
1297
1298        return 0
1299End
1300
1301
Note: See TracBrowser for help on using the repository browser.