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

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

more changes, filling in functionality of the initial data correction

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