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

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

New dimensions added for the back detector. many functions neede to be updated to accomodate these changes. Beam center is handled in the same way (in cm, not pixels) as other panels even though this panel is like the 2D detectors on SANS.

Still missing is the real values for caibration, pixel size, dead time, etc. that are yet to be measured.

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