source: sans/Dev/trunk/NCNR_User_Procedures/Reduction/VSANS/V_Test_RAW_Panel.ipf @ 987

Last change on this file since 987 was 987, checked in by srkline, 7 years ago

lots of changes to how VCALC simulations can be written to Nexus files to effectively make test data with different callues before the virtual machine is ready. many changes for visualization to effectively handle zeros in log scaled images

File size: 29.1 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//
35Proc 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                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        FakeTabClick(2)
54        FakeTabClick(1)
55        FakeTabClick(0)
56//      DoWindow/T VSANS_Data,type + " VSANS_Data"
57
58        String newTitle = "WORK_"+type
59        DoWindow/F VSANS_Data
60        DoWindow/T VSANS_Data, newTitle
61        KillStrings/Z newTitle
62       
63end
64
65//
66// creates/initializes the globals for display of the data panel
67//
68Function VSANSDataPanelGlobals()
69
70        SetDataFolder root:Packages:NIST:VSANS:Globals
71       
72        Variable/G gXPos=0
73        Variable/G gYPos=0
74        Variable/G gQX=0
75        Variable/G gQY=0
76        Variable/G gQQ=0
77        Variable/G gNCounts=0
78        String/G gCurDispFile = "default string"
79        String/G gCurTitle = ""
80        String/G gCurDispType = ""
81       
82        SetDataFolder root:
83End
84
85// TODO
86//
87// -- fill in the proper window title in the DoWindow/T command
88// -- add help text for all of the controls
89//
90Window VSANS_DataPanel() : Panel
91        PauseUpdate; Silent 1           // building window...
92        NewPanel /W=(37,45,1038,719) /N=VSANS_Data
93//      ShowTools/A
94        ModifyPanel cbRGB=(65535,60076,49151)
95
96        String curFolder = root:Packages:NIST:VSANS:Globals:gCurDispType
97        DoWindow/T VSANS_Data,curFolder + " VSANS_Data"
98        SetWindow VSANS_Data,hook(dataHook)=VSANSDataHook,hookevents=2
99       
100        SetDrawLayer UserBack
101        SetDrawEnv linethick= 2,dash= 1,fillpat= 0
102        DrawRect 200,70,310,160
103        SetDrawEnv linethick= 2,dash= 1,fillpat= 0
104        DrawRect 320,70,430,160
105        SetDrawEnv linethick= 2,dash= 1,fillpat= 0
106        DrawRect 440,70,550,160
107       
108        SetDrawEnv fsize= 18
109        DrawText 230,115,"Front"
110        SetDrawEnv fsize= 18
111        DrawText 348,115,"Middle"
112        SetDrawEnv fsize= 18
113        DrawText 476,115,"Back"
114       
115        ToolsGrid visible=1
116
117
118        TabControl tab0,pos={13,41},size={572,617},proc=VDataTabProc,tabLabel(0)="Front"
119        TabControl tab0,tabLabel(1)="Middle",tabLabel(2)="Back",value= 2
120
121// on the side 
122        Button button_status,pos={607,146},size={70,20},proc=StatusButtonProc,title="Status"
123        Button button_IvsQ,pos={689,113},size={70,20},proc=IvsQPanelButtonProc,title="I vs. Q"
124        Button button_file_m,pos={619,55},size={50,20},proc=File_m_ButtonProc,title="File <"
125        Button button_file_p,pos={679,55},size={50,20},proc=File_p_ButtonProc,title="File >"
126        Button button_log,pos={689,146},size={70,20},proc=LogLinButtonProc,title="isLin",userData="0"
127        Button button_tab_p,pos={648,81},size={50,20},proc=Tab_p_ButtonProc,title="Tab >"
128        Button button_isolate,pos={606,114},size={70,20},proc=IsolateButtonProc,title="Isolate"
129
130        TitleBox title_file,pos={606,178},size={76,20},variable= file_name
131        TitleBox title_status,pos={606,210},size={76,20},variable= root:Packages:NIST:VSANS:Globals:gCurDispFile
132       
133        Button button_tagFile,pos={603,412},size={70,20},proc=TagFileButtonProc,title="Tag File"
134        Button button_BeamCtr,pos={603,450},size={70,20},proc=BeamCtrButtonProc,title="Beam Ctr"
135        Button button_SpreadPanels,pos={603,488},size={100,20},proc=SpreadPanelButtonProc,title="Spread Panels"
136        Button button_RestorePanels,pos={603,526},size={100,20},proc=RestorePanelButtonProc,title="Restore Panels"
137
138// on the tabs, always visible
139        TitleBox title_xy,pos={24,71},size={76,20},variable= file_name
140        Slider slider_hi,pos={558,224},size={16,80},proc=HiMapSliderProc
141        Slider slider_hi,limits={0,1,0},value= 1,ticks= 0
142        Slider slider_lo,pos={558,315},size={16,80},proc=LowMapSliderProc
143        Slider slider_lo,limits={0,1,0},value= 0,ticks= 0
144
145        SetVariable xpos,pos={22,97},size={50,17},title="X "
146        SetVariable xpos,limits={-Inf,Inf,0},value= root:Packages:NIST:VSANS:Globals:gXPos
147        SetVariable xpos,help={"x-position on the detector"},frame=0,noedit=1
148        SetVariable ypos,pos={22,121},size={50,17},title="Y "
149        SetVariable ypos,limits={-Inf,Inf,0},value= root:Packages:NIST:VSANS:Globals:gYPos
150        SetVariable ypos,help={"y-position on the detector"},frame=0,noedit=1
151        SetVariable counts,pos={22,151},size={150,17},title="Counts "
152        SetVariable counts,limits={-Inf,Inf,0},value= root:Packages:NIST:VSANS:Globals:gNCounts
153        SetVariable counts,help={"Neutron counts"},frame=0,noedit=1
154        SetVariable qxval,pos={83,94},size={85,17},title="qX"
155        SetVariable qxval,help={"q value in the x-direction on the detector"},frame=0,noedit=1
156        SetVariable qxval,format="%+7.5f",limits={-Inf,Inf,0},value= root:Packages:NIST:VSANS:Globals:gQX
157        SetVariable qyval,pos={83,113},size={85,17},title="qY"
158        SetVariable qyval,help={"q value in the y-direction on the detector"},frame=0,noedit=1
159        SetVariable qyval,format="%+7.5f",limits={-Inf,Inf,0},value= root:Packages:NIST:VSANS:Globals:gQY
160        SetVariable q_pos,pos={83,132},size={85,17},title="q "
161        SetVariable q_pos,help={"q-value on the detector at (x,y)"},format="%+7.5f"
162        SetVariable q_pos,limits={-Inf,Inf,0},value= root:Packages:NIST:VSANS:Globals:gQQ,frame=0,noedit=1
163       
164        Make/O/D tmp_asdf
165        // for back panels (in pixels?)
166//      Display/W=(50,185,545,620)/HOST=# tmp_asdf
167        Display/W=(50,185,517,620)/HOST=# tmp_asdf
168        RenameWindow #,det_panelsB
169        ModifyGraph mode=2              // mode = 2 = dots
170        ModifyGraph marker=19
171        ModifyGraph rgb=(0,0,0)
172        ModifyGraph tick=2,mirror=1
173        Label left "pixels"
174        Label bottom "pixels"   
175        SetActiveSubwindow ##
176       
177        // for middle panels (in pixels?)       
178        Display/W=(50,185,517,620)/HOST=# tmp_asdf
179        RenameWindow #,det_panelsM
180        ModifyGraph mode=2              // mode = 2 = dots
181        ModifyGraph marker=19
182        ModifyGraph rgb=(0,0,0)
183        ModifyGraph tick=2,mirror=1
184        Label left "pixels"
185        Label bottom "pixels"   
186        SetActiveSubwindow ##
187       
188        // for front panels (in pixels?)       
189        Display/W=(50,185,517,620)/HOST=# tmp_asdf
190        RenameWindow #,det_panelsF
191        ModifyGraph mode=2              // mode = 2 = dots
192        ModifyGraph marker=19
193        ModifyGraph rgb=(0,0,0)
194        ModifyGraph tick=2,mirror=1
195        Label left "pixels"
196        Label bottom "pixels"   
197        SetActiveSubwindow ##
198       
199EndMacro
200
201//
202// event code 4 = mouse moved
203//
204// mouse moved is the only event that I really care about for the data display.
205//
206// TODO
207// -- figure out how to respond only to events in the main window
208// -- figure out which is the correct image to respond "from"
209//
210Function VSANSDataHook(s)
211        STRUCT WMWinHookStruct &s
212
213        Variable hookResult = 0
214
215        switch(s.eventCode)
216                case 0:                         // Activate
217                        // Handle activate
218//                      Print "Activate"
219                        break
220
221                case 1:                         // Deactivate
222                        // Handle deactivate
223                        break
224                       
225                case 3:         //mouse down
226//                      Print "mouse down"
227//
228// TODO (Way in the future -- I could make the small graphs into "buttons" by responding to a "mouse up" (not down)
229//    that hits in one of the small graph areas, and treat that as a click on that tab
230//
231                        break
232                       
233                case 4:         // mouse moved
234                        NVAR xloc = root:Packages:NIST:VSANS:Globals:gXPos
235                        NVAR yloc = root:Packages:NIST:VSANS:Globals:gYPos
236                        NVAR gQX = root:Packages:NIST:VSANS:Globals:gQX
237                        NVAR gQY = root:Packages:NIST:VSANS:Globals:gQY
238                        NVAR gQQ = root:Packages:NIST:VSANS:Globals:gQQ
239                        NVAR gNCounts = root:Packages:NIST:VSANS:Globals:gNCounts
240                        SVAR gCurDispFile = root:Packages:NIST:VSANS:Globals:gCurDispFile
241                        SVAR gCurDispType = root:Packages:NIST:VSANS:Globals:gCurDispType               //the current folder
242                        Variable xaxval,yaxval,tab
243                       
244                        // is the mouse location within the "main" display window?
245                        // if so, do something, if not, do nothing?
246                        // right now, the "main" display is at (50,185,545,620). its name depends on the active tab
247                       
248//                              xloc = s.mouseLoc.h
249//                              yloc = s.mouseLoc.v
250
251//                      if out of bounds, exit now
252//              TODO - currently the values are hard-wired. eliminate this later if the size of the graph changes
253                        if(s.mouseLoc.h < 50 || s.mouseLoc.h > 545 || s.mouseLoc.v < 185 || s.mouseLoc.v > 620)
254                                break
255                        endif   
256                       
257//                      if(in bounds)
258//                              get the point location
259//                              update the globals --
260//                              but which data instance am I pointing to?
261//                              deduce the carriage and panel, and calculate Q
262//                      endif
263
264                        GetWindow $s.winName activeSW
265                        String activeSubwindow = S_value                // returns something like: "VSANS_Data#det_panelsF"
266                               
267                        xaxval= AxisValFromPixel("","bottom",s.mouseLoc.h)
268                        yaxval= AxisValFromPixel("","left",s.mouseLoc.v)
269                        xloc = round(xaxval)
270                        yloc = round(yaxval)
271                       
272                        // which tab is selected? -this is the main graph panel (subwindow may not be the active one!)
273                        ControlInfo/W=VSANS_Data tab0
274                        tab = V_Value
275                        if(tab == 0)
276                                activeSubwindow = "VSANS_Data#det_panelsF"
277                        elseif (tab == 1)
278                                activeSubwindow = "VSANS_Data#det_panelsM"
279                        else
280                                activeSubwindow = "VSANS_Data#det_panelsB"
281                        endif
282                       
283                        // which images are here?
284                        String detStr="",imStr,carriageStr
285                        String currentImageRef
286                        String imageList = ImageNameList(activeSubwindow,";")
287                        Variable ii,nIm,testX,testY,xctr,yctr,sdd,lam,pixSizeX,pixSizeY
288                        nIm = ItemsInList(imageList,";")
289                        gCurDispFile = imageList
290                        if(nIm==0)
291                                break           //problem, get out
292                        endif
293
294                        // images were added in the order TBLR, so look back through in the order RLBT, checking each to see if
295                        // the xy value is found on that (scaled) array
296                                               
297                        // loop backwards through the list of panels (may only be one if on the back)
298                        for(ii=nIm-1;ii>=0;ii-=1)
299                                Wave w = ImageNameToWaveRef(activeSubwindow,StringFromList(ii, imageList,";"))
300                               
301                                // which, if any image is the mouse xy location on?
302                                // use a multidemensional equivalent to x2pnt: (ScaledDimPos - DimOffset(waveName, dim))/DimDelta(waveName,dim)
303                                testX = trunc( (xloc - DimOffset(w,0))/DimDelta(w,0) )
304                                testY = trunc( (yloc - DimOffset(w,1))/DimDelta(w,1) )
305                               
306                                if( (testX > 0 && testX < DimSize(w,0)) && (testY > 0 && testY < DimSize(w,1)) )
307                                        // we're in-bounds on this wave
308                                       
309                                        // count value to the global
310                                        gNCounts = w[testX][testY]
311                                       
312                                        // deduce the detector panel
313                                        currentImageRef = StringFromList(ii, imageList,";")     //the image instance ##
314                                        // string is "data", or "data#2" etc. - so this returns "", "1", "2", or "3"
315                                        imStr = StringFromList(1, currentImageRef,"#")         
316                                        carriageStr = activeSubWindow[strlen(activeSubWindow)-1]
317                                       
318                                        if(cmpstr(carriageStr,"B")==0)
319                                                detStr = carriageStr
320                                        else
321                                                if(strlen(imStr)==0)
322                                                        imStr = "9"                     // a dummy value so I can replace it later
323                                                endif
324                                                detStr = carriageStr+imStr              // "F2" or something similar
325                                                detStr = ReplaceString("9", detStr, "T")        // ASSUMPTION :::: instances 0123 correspond to TBLR
326                                                detStr = ReplaceString("1", detStr, "B")        // ASSUMPTION :::: this is the order that the panels
327                                                detStr = ReplaceString("2", detStr, "L")        // ASSUMPTION :::: are ALWAYS added to the graph
328                                                detStr = ReplaceString("3", detStr, "R")        // ASSUMPTION ::::
329                                        endif
330                                        gCurDispFile = detStr
331
332                                        // now figure out q
333                                        // calculate the q-values, will be different depending on which panel is up (pixel size, geometry, etc.)
334                                        // TODO: !!!! get rid of the hard-wired values
335                                        // TODO: be sure that the units from HDF are what I expect
336                                        // TODO: beam center XY are pixels in the file, expected in the function, but are better suited for mm or cm
337                                        // TODO: units of xy pixel size are likely wrong
338//                                      xctr = V_getDet_beam_center_x(gCurDispType,detStr)              //written in pixels
339//                                      yctr = V_getDet_beam_center_y(gCurDispType,detStr)
340                                        xctr = V_getDet_beam_center_x_mm(gCurDispType,detStr)           //written in mm
341                                        yctr = V_getDet_beam_center_y_mm(gCurDispType,detStr)   
342                                       
343                                        sdd = V_getDet_distance(gCurDispType,detStr)    / 100   //written in cm, pass in meters
344                                        lam = V_getVSWavelength(gCurDispType)           //A
345//                                      pixSizeX = V_getDet_x_pixel_size(gCurDispType,detStr)           // written mm? need mm
346//                                      pixSizeY = V_getDet_y_pixel_size(gCurDispType,detStr)           // written mm? need mm
347//
348// TODO: these q-values ignore the non-linear corrections!!!
349// -- What can I do about this?
350                                        String destPath = "root:Packages:NIST:VSANS:"+gCurDispType
351                                        Wave data_realDistX = $(destPath + ":entry:entry:instrument:detector_"+detStr+":data_realDistX")
352                                        Wave data_realDistY = $(destPath + ":entry:entry:instrument:detector_"+detStr+":data_realDistY")       
353                                       
354// TODO: figure out what coordinates I need to pass -- xloc, yloc, textX, testY, (+1 on any?)                           
355                                        //gQQ = VC_CalcQval(testX,testY,xctr,yctr,sdd,lam,pixSizeX,pixSizeY)
356                                        //gQX = VC_CalcQX(testX,testY,xctr,yctr,sdd,lam,pixSizeX,pixSizeY)
357                                        //gQY = VC_CalcQY(testX,testY,xctr,yctr,sdd,lam,pixSizeX,pixSizeY)
358                                        gQQ = V_CalcQval(testX,testY,xctr,yctr,sdd,lam,data_realDistX,data_realDistY)
359                                        gQX = V_CalcQX(testX,testY,xctr,yctr,sdd,lam,data_realDistX,data_realDistY)
360                                        gQY = V_CalcQY(testX,testY,xctr,yctr,sdd,lam,data_realDistX,data_realDistY)
361
362                                        ii = -1         //look no further, set ii to bad value to exit the for loop
363                                endif   //end if(mouse is over a detector panel)
364                        endfor          // end loop over list of displayed images
365               
366                        break
367                       
368                // And so on . . .
369        endswitch
370
371        return hookResult               // 0 if nothing done, else 1
372End
373
374//
375//lots to to here:
376//
377// - 1 - display the appropriate controls for each tab, and hide the others
378// - 2 - display the correct detector data for each tab, and remove the others from the graph
379// -----?? can I draw 3 graphs, and just put the right one on top?? move the other two to the side?
380//
381//
382// TODO
383//  -- add all of the controls of the VCALC panel (log scaling, adjusting the axes, etc.)
384//  x- get the panel to be correctly populated first, rather than needing to click everywhere to fill in
385//  x- remove the dependency on VCALC being initialized first, and using dummy waves from there...
386//
387// -- can I use "ReplaceWave" to do this?
388Function VDataTabProc(tca) : TabControl
389        STRUCT WMTabControlAction &tca
390
391        switch( tca.eventCode )
392                case 2: // mouse up
393                        Variable tab = tca.tab
394               
395//                      SetDataFolder root:Packages:NIST:VSANS:VCALC
396                        SetDataFolder root:
397                        RemoveFromGraph/Z /W=VSANS_Data#det_panelsB tmp_asdf
398                        RemoveFromGraph/Z /W=VSANS_Data#det_panelsM tmp_asdf
399                        RemoveFromGraph/Z /W=VSANS_Data#det_panelsF tmp_asdf
400                        SetDataFolder root:
401                       
402                        SVAR dataType = root:Packages:NIST:VSANS:Globals:gCurDispType
403// make sure log scaling is correct                     
404                        NVAR state = root:Packages:NIST:VSANS:Globals:gIsLogScale
405                        if(State == 0)
406                                // lookup wave
407                                Wave LookupWave = root:Packages:NIST:VSANS:Globals:linearLookupWave
408                        else
409                                // lookup wave - the linear version
410                                Wave LookupWave = root:Packages:NIST:VSANS:Globals:logLookupWave
411                        endif
412                                               
413                       
414                        //************
415                        // -- can I use "ReplaceWave/W=VSANS_Data#det_panelsB allinCDF" to do this?
416                        // -- only works for "B", since for M and F panels, all 4 data sets are named "data"
417                        // in their respective folders...
418
419                        String tmpStr
420                        Variable ii
421                        if(tab==2)
422                                tmpStr = ImageNameList("VSANS_Data#det_panelsB",";")
423                                // for some odd reason, it appears that I need to work from the back of the list
424                                // since the traces get "renumbered" as I take them off !! A do loop may be a better choice
425                                if(ItemsInList(tmpStr) > 0)
426                                        do
427                                                RemoveImage /W=VSANS_Data#det_panelsB $(StringFromList(0,tmpStr,";"))           //get 1st item
428                                                tmpStr = ImageNameList("VSANS_Data#det_panelsB",";")                                                            //refresh list
429                                        while(ItemsInList(tmpStr) > 0)
430                                endif
431                               
432                                SetDataFolder $("root:Packages:NIST:VSANS:"+dataType+":entry:entry:instrument:detector_B")
433                                Wave det_B=data
434                               
435                                CheckDisplayed /W=VSANS_Data#det_panelsB det_B 
436                                if(V_flag == 0)         // 0 == data is not displayed, so append it
437                                        AppendImage/W=VSANS_Data#det_panelsB det_B
438                                        ModifyImage/W=VSANS_Data#det_panelsB ''#0 ctab= {*,*,ColdWarm,0}
439                                endif
440                                MoveSubWindow/W=VSANS_Data#det_panelsB fnum=(50,185,517,620)
441                                MoveSubWindow/W=VSANS_Data#det_panelsM fnum=(320,70,430,160)
442                                MoveSubWindow/W=VSANS_Data#det_panelsF fnum=(200,70,310,160)
443
444                                ModifyImage/W=VSANS_Data#det_panelsB ''#0 ctabAutoscale=0,lookup= LookupWave
445                               
446                                // make the plot square
447                                ModifyGraph/W=VSANS_Data#det_panelsB width={Aspect,1}
448                               
449                                SetActiveSubWindow VSANS_Data#det_panelsB
450                                SetDataFolder root:
451                        endif
452       
453                        if(tab==1)
454                                tmpStr = ImageNameList("VSANS_Data#det_panelsM",";")
455                                // for some odd reason, it appears that I need to work from the back of the list
456                                // since the traces get "renumbered" as I take them off !! A do loop may be a better choice
457                                if(ItemsInList(tmpStr) > 0)
458                                        do
459                                                RemoveImage /W=VSANS_Data#det_panelsM $(StringFromList(0,tmpStr,";"))           //get 1st item
460                                                tmpStr = ImageNameList("VSANS_Data#det_panelsM",";")                                                            //refresh list
461                                        while(ItemsInList(tmpStr) > 0)
462                                endif
463
464                                SetDataFolder $("root:Packages:NIST:VSANS:"+dataType+":entry:entry:instrument:detector_ML")
465                                Wave det_ML=data                               
466                                SetDataFolder $("root:Packages:NIST:VSANS:"+dataType+":entry:entry:instrument:detector_MR")
467                                Wave det_MR=data
468                                SetDataFolder $("root:Packages:NIST:VSANS:"+dataType+":entry:entry:instrument:detector_MT")
469                                Wave det_MT=data
470                                SetDataFolder $("root:Packages:NIST:VSANS:"+dataType+":entry:entry:instrument:detector_MB")
471                                Wave det_MB=data
472
473                                CheckDisplayed /W=VSANS_Data#det_panelsM det_MR
474                                if(V_flag == 0)
475                                        AppendImage/W=VSANS_Data#det_panelsM det_MT             //order is important here to get LR on "top" of display
476                                        AppendImage/W=VSANS_Data#det_panelsM det_MB
477                                        AppendImage/W=VSANS_Data#det_panelsM det_ML
478                                        AppendImage/W=VSANS_Data#det_panelsM det_MR
479                                        ModifyImage/W=VSANS_Data#det_panelsM ''#0 ctab= {*,*,ColdWarm,0}                // ''#n means act on the nth image (there are 4)
480                                        ModifyImage/W=VSANS_Data#det_panelsM ''#1 ctab= {*,*,ColdWarm,0}
481                                        ModifyImage/W=VSANS_Data#det_panelsM ''#2 ctab= {*,*,ColdWarm,0}
482                                        ModifyImage/W=VSANS_Data#det_panelsM ''#3 ctab= {*,*,ColdWarm,0}
483                                endif
484                                MoveSubWindow/W=VSANS_Data#det_panelsM fnum=(50,185,517,620)
485                                MoveSubWindow/W=VSANS_Data#det_panelsB fnum=(440,70,550,160)
486                                MoveSubWindow/W=VSANS_Data#det_panelsF fnum=(200,70,310,160)
487
488                                ModifyImage/W=VSANS_Data#det_panelsM ''#0 ctabAutoscale=0,lookup= LookupWave
489                                ModifyImage/W=VSANS_Data#det_panelsM ''#1 ctabAutoscale=0,lookup= LookupWave
490                                ModifyImage/W=VSANS_Data#det_panelsM ''#2 ctabAutoscale=0,lookup= LookupWave
491                                ModifyImage/W=VSANS_Data#det_panelsM ''#3 ctabAutoscale=0,lookup= LookupWave
492                               
493                                // make the plot square
494                                ModifyGraph/W=VSANS_Data#det_panelsM width={Aspect,1}
495                                                       
496                                SetActiveSubWindow VSANS_Data#det_panelsM
497                                SetDataFolder root:
498                        endif
499
500                        if(tab==0)
501                                tmpStr = ImageNameList("VSANS_Data#det_panelsF",";")
502                                // for some odd reason, it appears that I need to work from the back of the list
503                                // since the traces get "renumbered" as I take them off !! A do loop may be a better choice
504                                if(ItemsInList(tmpStr) > 0)
505                                        do
506                                                RemoveImage /W=VSANS_Data#det_panelsF $(StringFromList(0,tmpStr,";"))           //get 1st item
507                                                tmpStr = ImageNameList("VSANS_Data#det_panelsF",";")                                                            //refresh list
508                                        while(ItemsInList(tmpStr) > 0)
509                                endif
510
511                                SetDataFolder $("root:Packages:NIST:VSANS:"+dataType+":entry:entry:instrument:detector_FL")
512                                Wave det_FL=data
513                                SetDataFolder $("root:Packages:NIST:VSANS:"+dataType+":entry:entry:instrument:detector_FR")
514                                Wave det_FR=data
515                                SetDataFolder $("root:Packages:NIST:VSANS:"+dataType+":entry:entry:instrument:detector_FT")
516                                Wave det_FT=data                               
517                                SetDataFolder $("root:Packages:NIST:VSANS:"+dataType+":entry:entry:instrument:detector_FB")
518                                Wave det_FB=data
519                                                               
520                                CheckDisplayed /W=VSANS_Data#det_panelsF det_FL
521                                if(V_flag == 0)
522                                        AppendImage/W=VSANS_Data#det_panelsF det_FT
523                                        AppendImage/W=VSANS_Data#det_panelsF det_FB
524                                        AppendImage/W=VSANS_Data#det_panelsF det_FL
525                                        AppendImage/W=VSANS_Data#det_panelsF det_FR
526                                        ModifyImage/W=VSANS_Data#det_panelsF ''#0 ctab= {*,*,ColdWarm,0}
527                                        ModifyImage/W=VSANS_Data#det_panelsF ''#1 ctab= {*,*,ColdWarm,0}
528                                        ModifyImage/W=VSANS_Data#det_panelsF ''#2 ctab= {*,*,ColdWarm,0}
529                                        ModifyImage/W=VSANS_Data#det_panelsF ''#3 ctab= {*,*,ColdWarm,0}
530                                endif
531                                MoveSubWindow/W=VSANS_Data#det_panelsF fnum=(50,185,517,620)
532                                MoveSubWindow/W=VSANS_Data#det_panelsB fnum=(440,70,550,160)
533                                MoveSubWindow/W=VSANS_Data#det_panelsM fnum=(320,70,430,160)
534                               
535                                ModifyImage/W=VSANS_Data#det_panelsF ''#0 ctabAutoscale=0,lookup= LookupWave
536                                ModifyImage/W=VSANS_Data#det_panelsF ''#1 ctabAutoscale=0,lookup= LookupWave
537                                ModifyImage/W=VSANS_Data#det_panelsF ''#2 ctabAutoscale=0,lookup= LookupWave
538                                ModifyImage/W=VSANS_Data#det_panelsF ''#3 ctabAutoscale=0,lookup= LookupWave
539
540                                // make the plot square
541                                ModifyGraph/W=VSANS_Data#det_panelsF width={Aspect,1}                           
542       
543                                SetActiveSubWindow VSANS_Data#det_panelsF
544                                SetDataFolder root:
545                        endif
546
547                                               
548                        break
549                case -1: // control being killed
550                        break
551        endswitch
552
553        return 0
554End
555
556
557// fake click on each tab to populate the data
558Function FakeTabClick(tab)
559        Variable tab
560       
561        STRUCT WMTabControlAction tca
562
563        tca.eventCode = 2               //fake mouse up
564        tca.tab = tab
565        VDataTabProc(tca)
566       
567        TabControl tab0,win=VSANS_Data,value= tab               //select the proper tab
568        return(0)
569End
570
571// TODO
572//
573// move one file number back
574//
575Function File_m_ButtonProc(ba) : ButtonControl
576        STRUCT WMButtonAction &ba
577
578        switch( ba.eventCode )
579                case 2: // mouse up
580                        // click code here
581                        break
582                case -1: // control being killed
583                        break
584        endswitch
585
586        return 0
587End
588
589// TODO
590//
591// move one file number forward
592//
593Function File_p_ButtonProc(ba) : ButtonControl
594        STRUCT WMButtonAction &ba
595
596        switch( ba.eventCode )
597                case 2: // mouse up
598                        // click code here
599                        break
600                case -1: // control being killed
601                        break
602        endswitch
603
604        return 0
605End
606
607//
608// button that mimics a click on the tab, cycling through the tabs 0->1->2->0 etc.
609// only goes one direction
610//
611Function Tab_p_ButtonProc(ba) : ButtonControl
612        STRUCT WMButtonAction &ba
613
614        switch( ba.eventCode )
615                case 2: // mouse up
616                        // click code here
617                        ControlInfo/W=VSANS_Data tab0
618                       
619                        V_Value += 1
620                        if(V_Value == 3)
621                                V_Value = 0             //reset to 0
622                        endif
623                        FakeTabClick(V_Value)
624                        break
625                case -1: // control being killed
626                        break
627        endswitch
628
629        return 0
630End
631
632// TODO
633//
634// isolates a single panel to allow a better view of the details
635// useful for T/B panels which are partially blocked from view
636//
637// will open a separate graph or panel to display the selected detector
638// (lots to do here, depending what is necessary for instrument troubleshooting)
639// - like being able to turn corrections on/off and view with different axes (pix, mm, Q)
640//
641Function IsolateButtonProc(ba) : ButtonControl
642        STRUCT WMButtonAction &ba
643
644        switch( ba.eventCode )
645                case 2: // mouse up
646                        // click code here
647                        break
648                case -1: // control being killed
649                        break
650        endswitch
651
652        return 0
653End
654
655// TODO
656//
657// opens a separate panel with the I(q) representation of the data
658// ? controls here to select how the data is processed/grouped/saved, etc.
659//
660Function IvsQPanelButtonProc(ba) : ButtonControl
661        STRUCT WMButtonAction &ba
662
663        switch( ba.eventCode )
664                case 2: // mouse up
665                        // click code here
666                       
667                        V_PlotData_Panel()
668                       
669                        break
670                case -1: // control being killed
671                        break
672        endswitch
673
674        return 0
675End
676
677// TODO
678//
679// gets the status of the currently displayed file and dumps it to the panel (not the cmd window)
680// - lots to decide here about what is the important stuff to display. There's a lot more information now
681//
682Function StatusButtonProc(ba) : ButtonControl
683        STRUCT WMButtonAction &ba
684
685        switch( ba.eventCode )
686                case 2: // mouse up
687                        // click code here
688                        break
689                case -1: // control being killed
690                        break
691        endswitch
692
693        return 0
694End
695
696
697// TODO:
698// -- come up with a better definition of the log lookup wave (> 1000 pts, what is the first point)
699// -- make an equivalent linear wave
700// -- hard wire it in so it is created at initialization and stored someplace safe
701// -- catch the error if it doesn't exist (re-make the wave as needed)
702//
703// Using the ModifyImage log=1 keyword fails for values of zero in the data, which is a common
704// occurrence with count data. the display just goes all gray, so that's not an option. Use the lookup wave instead
705//
706// toggle the (z) value of the display log/lin
707//
708Function LogLinButtonProc(ba) : ButtonControl
709        STRUCT WMButtonAction &ba
710
711        switch( ba.eventCode )
712                case 2: // mouse up
713                        // click code here
714                       
715                        // which tab is active? does it matter - or do I log-scale everything?
716                        // log/lin current state is in the S_UserData string (0=linear, 1=log)
717                        ControlInfo/W=VSANS_Data button_log
718                        Variable curState,newState
719                        String newStateStr,newTitleStr
720                       
721                       
722                        curState = str2num(S_UserData)
723                       
724                        if(curState == 0)
725                                newState = 1
726                                newStateStr="1"
727                                newTitleStr = "isLog"
728                                // lookup wave
729                                Wave LookupWave = root:Packages:NIST:VSANS:Globals:logLookupWave
730                        else
731                                newState = 0
732                                newStateStr="0"
733                                newTitleStr = "isLin"
734                                // lookup wave - the linear version
735                                Wave LookupWave = root:Packages:NIST:VSANS:Globals:linearLookupWave
736                        endif
737                       
738                        // update the button and the global value
739                        Button button_log,userData=newStateStr,title=newTitleStr
740                        NVAR state = root:Packages:NIST:VSANS:Globals:gIsLogScale
741                        state = newState
742                       
743                        // on the front:                       
744                        ModifyImage/W=VSANS_Data#det_panelsF ''#0 ctabAutoscale=0,lookup= LookupWave
745                        ModifyImage/W=VSANS_Data#det_panelsF ''#1 ctabAutoscale=0,lookup= LookupWave
746                        ModifyImage/W=VSANS_Data#det_panelsF ''#2 ctabAutoscale=0,lookup= LookupWave
747                        ModifyImage/W=VSANS_Data#det_panelsF ''#3 ctabAutoscale=0,lookup= LookupWave
748                        //on the middle:
749//                      ModifyImage/W=VSANS_Data#det_panelsM ''#0 log=newState
750//                      ModifyImage/W=VSANS_Data#det_panelsM ''#1 log=newState
751//                      ModifyImage/W=VSANS_Data#det_panelsM ''#2 log=newState
752//                      ModifyImage/W=VSANS_Data#det_panelsM ''#3 log=newState
753                               
754                        ModifyImage/W=VSANS_Data#det_panelsM ''#0 ctabAutoscale=0,lookup= LookupWave
755                        ModifyImage/W=VSANS_Data#det_panelsM ''#1 ctabAutoscale=0,lookup= LookupWave
756                        ModifyImage/W=VSANS_Data#det_panelsM ''#2 ctabAutoscale=0,lookup= LookupWave
757                        ModifyImage/W=VSANS_Data#det_panelsM ''#3 ctabAutoscale=0,lookup= LookupWave
758
759
760                        // on the back:
761                        ModifyImage/W=VSANS_Data#det_panelsB ''#0 ctabAutoscale=0,lookup= LookupWave
762
763                        break
764                case -1: // control being killed
765                        break
766        endswitch
767
768        return 0
769End
770
771// TODO
772// possibly function to "tag" files right here in the disaply with things
773// like their intent, or other values that reduction will need, kind of like a "quick patch"
774// with limited functionality (since full function would be a nightmare!)
775Function TagFileButtonProc(ba) : ButtonControl
776        STRUCT WMButtonAction &ba
777
778        switch( ba.eventCode )
779                case 2: // mouse up
780                        // click code here
781                        DoAlert 0, "TagFileButtonProc(ba) unfinished"
782                       
783                               
784                        break
785                case -1: // control being killed
786                        break
787        endswitch
788
789        return 0
790End
791
792//TODO
793//
794//link this to the beam center finding panel
795//
796Function BeamCtrButtonProc(ba) : ButtonControl
797        STRUCT WMButtonAction &ba
798
799        switch( ba.eventCode )
800                case 2: // mouse up
801                        // click code here
802                        V_FindBeamCenter()
803                        break
804                case -1: // control being killed
805                        break
806        endswitch
807
808        return 0
809End
810
811//TODO
812//
813// this "spreads" the display of panels to a nominal separation for easier viewing
814//
815Function SpreadPanelButtonProc(ba) : ButtonControl
816        STRUCT WMButtonAction &ba
817
818        switch( ba.eventCode )
819                case 2: // mouse up
820                        // click code here
821                        V_SpreadOutPanels()
822                        break
823                case -1: // control being killed
824                        break
825        endswitch
826
827        return 0
828End
829
830//TODO
831//
832// this "restores" the display of panels to their actual position based on the apparent beam center
833//
834Function RestorePanelButtonProc(ba) : ButtonControl
835        STRUCT WMButtonAction &ba
836
837        switch( ba.eventCode )
838                case 2: // mouse up
839                        // click code here
840                        V_RestorePanels()
841                        break
842                case -1: // control being killed
843                        break
844        endswitch
845
846        return 0
847End
848
849// TODO
850//
851// link this slider to the "high" end of the color mapping for whatever is currently displayed
852//
853// -- see Buttons.ipf for the old SANS implementation
854//
855Function HiMapSliderProc(sa) : SliderControl
856        STRUCT WMSliderAction &sa
857
858        switch( sa.eventCode )
859                case -1: // control being killed
860                        break
861                default:
862                        if( sa.eventCode & 1 ) // value set
863                                Variable curval = sa.curval
864                        endif
865                        break
866        endswitch
867
868        return 0
869End
870
871// TODO
872//
873// link this slider to the "low" end of the color mapping for whatever is currently displayed
874//
875// -- see Buttons.ipf for the old SANS implementation
876//
877Function LowMapSliderProc(sa) : SliderControl
878        STRUCT WMSliderAction &sa
879
880        switch( sa.eventCode )
881                case -1: // control being killed
882                        break
883                default:
884                        if( sa.eventCode & 1 ) // value set
885                                Variable curval = sa.curval
886                        endif
887                        break
888        endswitch
889
890        return 0
891End
892
893
Note: See TracBrowser for help on using the repository browser.