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

Last change on this file since 1059 was 1059, checked in by srkline, 6 years ago

corrected the behavior of the annular averaging and added a button to the main panel to allow quick access.

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