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

Last change on this file since 1242 was 1242, checked in by srkline, 2 years ago

updating the IgorVersion? pragma to v7.0 for all files to be consistent.

File size: 41.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        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_LOW
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// DONE:
918// x- 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 "V_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_VERIFY:
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_LOW
1085// -- possibly use this 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_LOW
1106// -- currently this button is NOT visible on the RAW data display. Any saving of data
1107//    must go through a protocol (RAW can't be saved)
1108// -- fill in more functionality
1109// -- currently a straight concatentation of all data, no options
1110// -- maybe allow save of single panels?
1111// -- any other options?
1112Function V_SaveIQ_ButtonProc(ba) : ButtonControl
1113        STRUCT WMButtonAction &ba
1114
1115        switch( ba.eventCode )
1116                case 2: // mouse up
1117                        // click code here
1118
1119//                      V_SimpleSave1DData("root:Packages:NIST:VSANS:","","","")       
1120
1121// this is the same as clicking the I(q) button. Ensures that the current file has been averaged,
1122// and the data being saved is not "stale"
1123
1124                        V_PlotData_Panel()              //
1125                        Variable binType = V_GetBinningPopMode()
1126                        ControlInfo/W=V_1D_Data popup0
1127                        V_BinningModePopup("",binType,S_Value)          // does default circular binning and updates the graph
1128       
1129                        SVAR type = root:Packages:NIST:VSANS:Globals:gCurDispType               //what folder
1130
1131                        // look for the binning type
1132//                      Variable binType
1133//                      ControlInfo/W=V_1D_Data popup0
1134//                      binType = (V_flag == 0) ? 1 : V_flag            // if binType not defined, set binType == 1
1135
1136                        String saveName="",exten=""
1137                // write out the data set to a file
1138                        if(strlen(saveName)==0)
1139                                Execute "V_GetNameForSave()"
1140                                SVAR newName = root:saveName
1141                                saveName = newName
1142                        endif
1143                       
1144//                      V_Write1DData_ITX("root:Packages:NIST:VSANS:",type,saveName,binType)
1145
1146                        V_Write1DData_Individual("root:Packages:NIST:VSANS:",type,saveName,exten,binType)
1147       
1148                        Print "Saved file: "    +       saveName + ".itx"       
1149                        break
1150                case -1: // control being killed
1151                        break
1152        endswitch
1153
1154        return 0
1155End
1156
1157//TODO_LOW
1158//
1159//link this to the beam center finding panel
1160//
1161Function V_BeamCtrButtonProc(ba) : ButtonControl
1162        STRUCT WMButtonAction &ba
1163
1164        switch( ba.eventCode )
1165                case 2: // mouse up
1166                        // click code here
1167                        DoAlert 0,"Beam Center panel is under construction..."
1168//                      V_FindBeamCenter()
1169                        break
1170                case -1: // control being killed
1171                        break
1172        endswitch
1173
1174        return 0
1175End
1176
1177//
1178//
1179// this "spreads" the display of panels to a nominal separation for easier viewing
1180//
1181Function V_SpreadPanelButtonProc(ba) : ButtonControl
1182        STRUCT WMButtonAction &ba
1183
1184        switch( ba.eventCode )
1185                case 2: // mouse up
1186                        // click code here
1187                        V_SpreadOutPanels()
1188                       
1189                        break
1190                case -1: // control being killed
1191                        break
1192        endswitch
1193
1194        return 0
1195End
1196
1197//
1198//
1199// this "restores" the display of panels to their actual position based on the apparent beam center
1200//
1201Function V_RestorePanelButtonProc(ba) : ButtonControl
1202        STRUCT WMButtonAction &ba
1203
1204        switch( ba.eventCode )
1205                case 2: // mouse up
1206                        // click code here
1207                        V_RestorePanels()
1208                               
1209                        break
1210                case -1: // control being killed
1211                        break
1212        endswitch
1213
1214        return 0
1215End
1216
1217// TODO
1218//
1219// link this slider to the "high" end of the color mapping for whatever is currently displayed
1220//
1221// -- see Buttons.ipf for the old SANS implementation
1222//
1223Function V_HiMapSliderProc(sa) : SliderControl
1224        STRUCT WMSliderAction &sa
1225
1226        switch( sa.eventCode )
1227                case -1: // control being killed
1228                        break
1229                default:
1230                        if( sa.eventCode & 1 ) // value set
1231                                Variable curval = sa.curval
1232                                ControlInfo tab0
1233                                V_FakeTabClick(V_Value)
1234                               
1235//                              ControlInfo slider_lo
1236//                              V_MakeImageLookupTables(10000,V_Value,curval)
1237                        endif
1238                        break
1239        endswitch
1240
1241        return 0
1242End
1243
1244// TODO
1245//
1246// link this slider to the "low" end of the color mapping for whatever is currently displayed
1247//
1248// -- see Buttons.ipf for the old SANS implementation
1249//
1250Function V_LowMapSliderProc(sa) : SliderControl
1251        STRUCT WMSliderAction &sa
1252
1253        switch( sa.eventCode )
1254                case -1: // control being killed
1255                        break
1256                default:
1257                        if( sa.eventCode & 1 ) // value set
1258                                Variable curval = sa.curval
1259                                ControlInfo tab0
1260                                V_FakeTabClick(V_Value)
1261
1262//                              ControlInfo slider_hi
1263//                              V_MakeImageLookupTables(10000,curval,V_Value)
1264                        endif
1265                        break
1266        endswitch
1267
1268        return 0
1269End
1270
1271
Note: See TracBrowser for help on using the repository browser.