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

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

removed the doubled "entry" field from the VSANS file load.

appears now to work fine with R/W routines and with VCALC.

File size: 29.0 KB
Line 
1#pragma rtGlobals=3             // Use modern global access method and strict wave access.
2#pragma version=1.0
3#pragma IgorVersion=6.1
4
5//
6// this will become the equivalent of "RawWindowHook"
7//
8// Procedures to:
9// display the detector data
10// visualization tools
11// mouse interaction
12// status information necessary to understand the data
13// buttons to more functionality to process data
14
15
16// TODO
17//
18// -- have the status automatically fill in when a new file is loaded, rather than needing a click of the "status" button
19// -- need a place somewhere to show the currently displayed folder
20// -- checkboxes for "active" corrections?
21// -- display of Q, counts, QxQy, X and Y
22// -- do I need a color bar? or is this not used at all? I like it to be there, or the colors are a waste of information
23//              (then... where do I put the color bar?)
24// -- define the "hook" function, and attach it to the panel (or the main detector subwindow?)
25//
26
27
28//
29// call this after loading data to either draw the data display panel or to update the contents
30//
31// TODO
32// -- make sure that the "type" input is correctly used for the updating of the data, values, etc.
33// -- add a procedure to define the global variables for pos, counts, QxQy, etc.
34//
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:instrument:detector_"+detStr+":data_realDistX")
352                                        Wave data_realDistY = $(destPath + ":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: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:instrument:detector_ML")
465                                Wave det_ML=data                               
466                                SetDataFolder $("root:Packages:NIST:VSANS:"+dataType+":entry:instrument:detector_MR")
467                                Wave det_MR=data
468                                SetDataFolder $("root:Packages:NIST:VSANS:"+dataType+":entry:instrument:detector_MT")
469                                Wave det_MT=data
470                                SetDataFolder $("root:Packages:NIST:VSANS:"+dataType+":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:instrument:detector_FL")
512                                Wave det_FL=data
513                                SetDataFolder $("root:Packages:NIST:VSANS:"+dataType+":entry:instrument:detector_FR")
514                                Wave det_FR=data
515                                SetDataFolder $("root:Packages:NIST:VSANS:"+dataType+":entry:instrument:detector_FT")
516                                Wave det_FT=data                               
517                                SetDataFolder $("root:Packages:NIST:VSANS:"+dataType+":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.