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

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

LOTS of changes to accommodate the beam center being reported in cm rather than pixels. Required a lot of changes to VCALC (to fill in simulated data), and in the reading and interpreting of data for display, and most importantly, the calculation of q.

There may still be a few residual bugs with this. I am still re-testing with new sample data sets.

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