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

Last change on this file since 1074 was 1074, checked in by srkline, 5 years ago

Important change -- re-worked the calculation of how the detector panel "gap" is treated. It is now split equally between the panels rather than assigned to one panel. Makes no difference in the q calculation, simply a philosophical change that should make the measured beam centers make a little more sense, as they will be symmetric.

Changed the appearance and function of the panel to select the "trim" values for the combined 1D data sets. Data no longer needs to be saved as ITX and re-read into the panel. Simply uses the data binning popup and the current data.

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