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

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

A few more tweaks for the panel layout on small screens

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,480) /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.