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

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

many changes to the VCALC code and a few changes to the main code to get the units consistent, and centimeters everywhere possible. The real space distance array and the non-linear calibrations are still defined and calculated in mm. This can hopefully be changed in the future. Some constants in the data file will need to be updated to cm, such as the T/B setback, which has been confirmed to be 41.0 cm

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