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

Last change on this file since 1154 was 1150, checked in by srkline, 4 years ago

added button for avg mask on main display panel

added more aperture fields to the patch panel

added time comparisons for potential use in aperture dimension change done in NICE in May shutdown

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