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

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

CHANGES to SANS:
Now allow 4 files to be combined in one step. This required modification of one routine in NIST_XML to allow an extra file name, and significant addition to the NSORT panel to allow an (optional) 4th data file. behaviors are still the same as before with 2, 3, or 4 sets being allowed. The "combine table" also allows up to 4 files to be combined (can be mixed, 2, 3, 4 all allowed).

More addtions to VSANS present as well, not specific changes, but in-progress changes to the beam center handling and ciombining data to 1D.

File size: 26.9 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                                        sdd = V_getDet_distance(gCurDispType,detStr)    / 100   //written in cm, pass in meters
341                                        lam = V_getVSWavelength(gCurDispType)           //A
342                                        pixSizeX = V_getDet_x_pixel_size(gCurDispType,detStr)/10                // written mm? need cm
343                                        pixSizeY = V_getDet_y_pixel_size(gCurDispType,detStr)/10                // written mm? need cm
344//
345// TODO: these q-values ignore the non-linear corrections!!!
346// -- What can I do about this?
347// TODO: figure out what coordinates I need to pass -- xloc, yloc, textX, testY, (+1 on any?)                           
348                                        gQQ = VC_CalcQval(testX,testY,xctr,yctr,sdd,lam,pixSizeX,pixSizeY)
349                                        gQX = VC_CalcQX(testX,testY,xctr,yctr,sdd,lam,pixSizeX,pixSizeY)
350                                        gQY = VC_CalcQY(testX,testY,xctr,yctr,sdd,lam,pixSizeX,pixSizeY)
351
352                                        ii = -1         //look no further, set ii to bad value to exit the for loop
353                                endif   //end if(mouse is over a detector panel)
354                        endfor          // end loop over list of displayed images
355               
356                        break
357                       
358                // And so on . . .
359        endswitch
360
361        return hookResult               // 0 if nothing done, else 1
362End
363
364//
365//lots to to here:
366//
367// - 1 - display the appropriate controls for each tab, and hide the others
368// - 2 - display the correct detector data for each tab, and remove the others from the graph
369// -----?? can I draw 3 graphs, and just put the right one on top?? move the other two to the side?
370//
371//
372// TODO
373//  -- add all of the controls of the VCALC panel (log scaling, adjusting the axes, etc.)
374//  x- get the panel to be correctly populated first, rather than needing to click everywhere to fill in
375//  x- remove the dependency on VCALC being initialized first, and using dummy waves from there...
376//
377// -- can I use "ReplaceWave" to do this?
378Function VDataTabProc(tca) : TabControl
379        STRUCT WMTabControlAction &tca
380
381        switch( tca.eventCode )
382                case 2: // mouse up
383                        Variable tab = tca.tab
384               
385//                      SetDataFolder root:Packages:NIST:VSANS:VCALC
386                        SetDataFolder root:
387                        RemoveFromGraph/Z /W=VSANS_Data#det_panelsB tmp_asdf
388                        RemoveFromGraph/Z /W=VSANS_Data#det_panelsM tmp_asdf
389                        RemoveFromGraph/Z /W=VSANS_Data#det_panelsF tmp_asdf
390                        SetDataFolder root:
391                       
392                        SVAR dataType = root:Packages:NIST:VSANS:Globals:gCurDispType
393// make sure log scaling is correct                     
394                        NVAR state = root:Packages:NIST:VSANS:Globals:gIsLogScale
395                       
396                       
397                        //************
398                        // -- can I use "ReplaceWave/W=VSANS_Data#det_panelsB allinCDF" to do this?
399                        // -- only works for "B", since for M and F panels, all 4 data sets are named "data"
400                        // in their respective folders...
401
402                        String tmpStr
403                        Variable ii
404                        if(tab==2)
405                                tmpStr = ImageNameList("VSANS_Data#det_panelsB",";")
406                                // for some odd reason, it appears that I need to work from the back of the list
407                                // since the traces get "renumbered" as I take them off !! A do loop may be a better choice
408                                if(ItemsInList(tmpStr) > 0)
409                                        do
410                                                RemoveImage /W=VSANS_Data#det_panelsB $(StringFromList(0,tmpStr,";"))           //get 1st item
411                                                tmpStr = ImageNameList("VSANS_Data#det_panelsB",";")                                                            //refresh list
412                                        while(ItemsInList(tmpStr) > 0)
413                                endif
414                               
415                                SetDataFolder $("root:Packages:NIST:VSANS:"+dataType+":entry:entry:instrument:detector_B")
416                                Wave det_B=data
417                               
418                                CheckDisplayed /W=VSANS_Data#det_panelsB det_B 
419                                if(V_flag == 0)         // 0 == data is not displayed, so append it
420                                        AppendImage/W=VSANS_Data#det_panelsB det_B
421                                        ModifyImage/W=VSANS_Data#det_panelsB ''#0 ctab= {*,*,ColdWarm,0}
422                                endif
423                                MoveSubWindow/W=VSANS_Data#det_panelsB fnum=(50,185,517,620)
424                                MoveSubWindow/W=VSANS_Data#det_panelsM fnum=(320,70,430,160)
425                                MoveSubWindow/W=VSANS_Data#det_panelsF fnum=(200,70,310,160)
426
427                                ModifyImage/W=VSANS_Data#det_panelsB ''#0 log=State
428                               
429                                // make the plot square
430                                ModifyGraph/W=VSANS_Data#det_panelsB width={Aspect,1}
431                               
432                                SetActiveSubWindow VSANS_Data#det_panelsB
433                                SetDataFolder root:
434                        endif
435       
436                        if(tab==1)
437                                tmpStr = ImageNameList("VSANS_Data#det_panelsM",";")
438                                // for some odd reason, it appears that I need to work from the back of the list
439                                // since the traces get "renumbered" as I take them off !! A do loop may be a better choice
440                                if(ItemsInList(tmpStr) > 0)
441                                        do
442                                                RemoveImage /W=VSANS_Data#det_panelsM $(StringFromList(0,tmpStr,";"))           //get 1st item
443                                                tmpStr = ImageNameList("VSANS_Data#det_panelsM",";")                                                            //refresh list
444                                        while(ItemsInList(tmpStr) > 0)
445                                endif
446
447                                SetDataFolder $("root:Packages:NIST:VSANS:"+dataType+":entry:entry:instrument:detector_ML")
448                                Wave det_ML=data                               
449                                SetDataFolder $("root:Packages:NIST:VSANS:"+dataType+":entry:entry:instrument:detector_MR")
450                                Wave det_MR=data
451                                SetDataFolder $("root:Packages:NIST:VSANS:"+dataType+":entry:entry:instrument:detector_MT")
452                                Wave det_MT=data
453                                SetDataFolder $("root:Packages:NIST:VSANS:"+dataType+":entry:entry:instrument:detector_MB")
454                                Wave det_MB=data
455
456                                CheckDisplayed /W=VSANS_Data#det_panelsM det_MR
457                                if(V_flag == 0)
458                                        AppendImage/W=VSANS_Data#det_panelsM det_MT             //order is important here to get LR on "top" of display
459                                        AppendImage/W=VSANS_Data#det_panelsM det_MB
460                                        AppendImage/W=VSANS_Data#det_panelsM det_ML
461                                        AppendImage/W=VSANS_Data#det_panelsM det_MR
462                                        ModifyImage/W=VSANS_Data#det_panelsM ''#0 ctab= {*,*,ColdWarm,0}                // ''#n means act on the nth image (there are 4)
463                                        ModifyImage/W=VSANS_Data#det_panelsM ''#1 ctab= {*,*,ColdWarm,0}
464                                        ModifyImage/W=VSANS_Data#det_panelsM ''#2 ctab= {*,*,ColdWarm,0}
465                                        ModifyImage/W=VSANS_Data#det_panelsM ''#3 ctab= {*,*,ColdWarm,0}
466                                endif
467                                MoveSubWindow/W=VSANS_Data#det_panelsM fnum=(50,185,517,620)
468                                MoveSubWindow/W=VSANS_Data#det_panelsB fnum=(440,70,550,160)
469                                MoveSubWindow/W=VSANS_Data#det_panelsF fnum=(200,70,310,160)
470
471                                ModifyImage/W=VSANS_Data#det_panelsM ''#0 log=State
472                                ModifyImage/W=VSANS_Data#det_panelsM ''#1 log=State
473                                ModifyImage/W=VSANS_Data#det_panelsM ''#2 log=State
474                                ModifyImage/W=VSANS_Data#det_panelsM ''#3 log=State
475                               
476                                // make the plot square
477                                ModifyGraph/W=VSANS_Data#det_panelsM width={Aspect,1}
478                                                       
479                                SetActiveSubWindow VSANS_Data#det_panelsM
480                                SetDataFolder root:
481                        endif
482
483                        if(tab==0)
484                                tmpStr = ImageNameList("VSANS_Data#det_panelsF",";")
485                                // for some odd reason, it appears that I need to work from the back of the list
486                                // since the traces get "renumbered" as I take them off !! A do loop may be a better choice
487                                if(ItemsInList(tmpStr) > 0)
488                                        do
489                                                RemoveImage /W=VSANS_Data#det_panelsF $(StringFromList(0,tmpStr,";"))           //get 1st item
490                                                tmpStr = ImageNameList("VSANS_Data#det_panelsF",";")                                                            //refresh list
491                                        while(ItemsInList(tmpStr) > 0)
492                                endif
493
494                                SetDataFolder $("root:Packages:NIST:VSANS:"+dataType+":entry:entry:instrument:detector_FL")
495                                Wave det_FL=data
496                                SetDataFolder $("root:Packages:NIST:VSANS:"+dataType+":entry:entry:instrument:detector_FR")
497                                Wave det_FR=data
498                                SetDataFolder $("root:Packages:NIST:VSANS:"+dataType+":entry:entry:instrument:detector_FT")
499                                Wave det_FT=data                               
500                                SetDataFolder $("root:Packages:NIST:VSANS:"+dataType+":entry:entry:instrument:detector_FB")
501                                Wave det_FB=data
502                                                               
503                                CheckDisplayed /W=VSANS_Data#det_panelsF det_FL
504                                if(V_flag == 0)
505                                        AppendImage/W=VSANS_Data#det_panelsF det_FT
506                                        AppendImage/W=VSANS_Data#det_panelsF det_FB
507                                        AppendImage/W=VSANS_Data#det_panelsF det_FL
508                                        AppendImage/W=VSANS_Data#det_panelsF det_FR
509                                        ModifyImage/W=VSANS_Data#det_panelsF ''#0 ctab= {*,*,ColdWarm,0}
510                                        ModifyImage/W=VSANS_Data#det_panelsF ''#1 ctab= {*,*,ColdWarm,0}
511                                        ModifyImage/W=VSANS_Data#det_panelsF ''#2 ctab= {*,*,ColdWarm,0}
512                                        ModifyImage/W=VSANS_Data#det_panelsF ''#3 ctab= {*,*,ColdWarm,0}
513                                endif
514                                MoveSubWindow/W=VSANS_Data#det_panelsF fnum=(50,185,517,620)
515                                MoveSubWindow/W=VSANS_Data#det_panelsB fnum=(440,70,550,160)
516                                MoveSubWindow/W=VSANS_Data#det_panelsM fnum=(320,70,430,160)
517                               
518                                ModifyImage/W=VSANS_Data#det_panelsF ''#0 log=State
519                                ModifyImage/W=VSANS_Data#det_panelsF ''#1 log=State
520                                ModifyImage/W=VSANS_Data#det_panelsF ''#2 log=State
521                                ModifyImage/W=VSANS_Data#det_panelsF ''#3 log=State
522
523                                // make the plot square
524                                ModifyGraph/W=VSANS_Data#det_panelsF width={Aspect,1}                           
525       
526                                SetActiveSubWindow VSANS_Data#det_panelsF
527                                SetDataFolder root:
528                        endif
529
530                                               
531                        break
532                case -1: // control being killed
533                        break
534        endswitch
535
536        return 0
537End
538
539
540// fake click on each tab to populate the data
541Function FakeTabClick(tab)
542        Variable tab
543       
544        STRUCT WMTabControlAction tca
545
546        tca.eventCode = 2               //fake mouse up
547        tca.tab = tab
548        VDataTabProc(tca)
549       
550        TabControl tab0,win=VSANS_Data,value= tab               //select the proper tab
551        return(0)
552End
553
554// TODO
555//
556// move one file number back
557//
558Function File_m_ButtonProc(ba) : ButtonControl
559        STRUCT WMButtonAction &ba
560
561        switch( ba.eventCode )
562                case 2: // mouse up
563                        // click code here
564                        break
565                case -1: // control being killed
566                        break
567        endswitch
568
569        return 0
570End
571
572// TODO
573//
574// move one file number forward
575//
576Function File_p_ButtonProc(ba) : ButtonControl
577        STRUCT WMButtonAction &ba
578
579        switch( ba.eventCode )
580                case 2: // mouse up
581                        // click code here
582                        break
583                case -1: // control being killed
584                        break
585        endswitch
586
587        return 0
588End
589
590//
591// button that mimics a click on the tab, cycling through the tabs 0->1->2->0 etc.
592// only goes one direction
593//
594Function Tab_p_ButtonProc(ba) : ButtonControl
595        STRUCT WMButtonAction &ba
596
597        switch( ba.eventCode )
598                case 2: // mouse up
599                        // click code here
600                        ControlInfo/W=VSANS_Data tab0
601                       
602                        V_Value += 1
603                        if(V_Value == 3)
604                                V_Value = 0             //reset to 0
605                        endif
606                        FakeTabClick(V_Value)
607                        break
608                case -1: // control being killed
609                        break
610        endswitch
611
612        return 0
613End
614
615// TODO
616//
617// isolates a single panel to allow a better view of the details
618// useful for T/B panels which are partially blocked from view
619//
620// will open a separate graph or panel to display the selected detector
621// (lots to do here, depending what is necessary for instrument troubleshooting)
622// - like being able to turn corrections on/off and view with different axes (pix, mm, Q)
623//
624Function IsolateButtonProc(ba) : ButtonControl
625        STRUCT WMButtonAction &ba
626
627        switch( ba.eventCode )
628                case 2: // mouse up
629                        // click code here
630                        break
631                case -1: // control being killed
632                        break
633        endswitch
634
635        return 0
636End
637
638// TODO
639//
640// opens a separate panel with the I(q) representation of the data
641// ? controls here to select how the data is processed/grouped/saved, etc.
642//
643Function IvsQPanelButtonProc(ba) : ButtonControl
644        STRUCT WMButtonAction &ba
645
646        switch( ba.eventCode )
647                case 2: // mouse up
648                        // click code here
649                       
650                        V_PlotData_Panel()
651                       
652                        break
653                case -1: // control being killed
654                        break
655        endswitch
656
657        return 0
658End
659
660// TODO
661//
662// gets the status of the currently displayed file and dumps it to the panel (not the cmd window)
663// - lots to decide here about what is the important stuff to display. There's a lot more information now
664//
665Function StatusButtonProc(ba) : ButtonControl
666        STRUCT WMButtonAction &ba
667
668        switch( ba.eventCode )
669                case 2: // mouse up
670                        // click code here
671                        break
672                case -1: // control being killed
673                        break
674        endswitch
675
676        return 0
677End
678
679
680// TODO -- this appears to be complete...
681// toggle the (z) value of the display log/lin
682//
683Function LogLinButtonProc(ba) : ButtonControl
684        STRUCT WMButtonAction &ba
685
686        switch( ba.eventCode )
687                case 2: // mouse up
688                        // click code here
689                       
690                        // which tab is active? does it matter - or do I log-scale everything?
691                        // log/lin current state is in the S_UserData string (0=linear, 1=log)
692                        ControlInfo/W=VSANS_Data button_log
693                        Variable curState,newState
694                        String newStateStr,newTitleStr
695                       
696                        curState = str2num(S_UserData)
697                       
698                        if(curState == 0)
699                                newState = 1
700                                newStateStr="1"
701                                newTitleStr = "isLog"
702                        else
703                                newState = 0
704                                newStateStr="0"
705                                newTitleStr = "isLin"
706                        endif
707                       
708                        // update the button and the global value
709                        Button button_log,userData=newStateStr,title=newTitleStr
710                        NVAR state = root:Packages:NIST:VSANS:Globals:gIsLogScale
711                        state = newState
712                       
713                        // on the front:                       
714                        ModifyImage/W=VSANS_Data#det_panelsF ''#0 log=newState
715                        ModifyImage/W=VSANS_Data#det_panelsF ''#1 log=newState
716                        ModifyImage/W=VSANS_Data#det_panelsF ''#2 log=newState
717                        ModifyImage/W=VSANS_Data#det_panelsF ''#3 log=newState
718                        //on the middle:
719                        ModifyImage/W=VSANS_Data#det_panelsM ''#0 log=newState
720                        ModifyImage/W=VSANS_Data#det_panelsM ''#1 log=newState
721                        ModifyImage/W=VSANS_Data#det_panelsM ''#2 log=newState
722                        ModifyImage/W=VSANS_Data#det_panelsM ''#3 log=newState
723                        // on the back:
724                        ModifyImage/W=VSANS_Data#det_panelsB ''#0 log=newState
725
726                        break
727                case -1: // control being killed
728                        break
729        endswitch
730
731        return 0
732End
733
734// TODO
735// possibly function to "tag" files right here in the disaply with things
736// like their intent, or other values that reduction will need, kind of like a "quick patch"
737// with limited functionality (since full function would be a nightmare!)
738Function TagFileButtonProc(ba) : ButtonControl
739        STRUCT WMButtonAction &ba
740
741        switch( ba.eventCode )
742                case 2: // mouse up
743                        // click code here
744                        DoAlert 0, "TagFileButtonProc(ba) unfinished"
745                       
746                               
747                        break
748                case -1: // control being killed
749                        break
750        endswitch
751
752        return 0
753End
754
755//TODO
756//
757//link this to the beam center finding panel
758//
759Function BeamCtrButtonProc(ba) : ButtonControl
760        STRUCT WMButtonAction &ba
761
762        switch( ba.eventCode )
763                case 2: // mouse up
764                        // click code here
765                        V_FindBeamCenter()
766                        break
767                case -1: // control being killed
768                        break
769        endswitch
770
771        return 0
772End
773
774//TODO
775//
776// this "spreads" the display of panels to a nominal separation for easier viewing
777//
778Function SpreadPanelButtonProc(ba) : ButtonControl
779        STRUCT WMButtonAction &ba
780
781        switch( ba.eventCode )
782                case 2: // mouse up
783                        // click code here
784                        V_SpreadOutPanels()
785                        break
786                case -1: // control being killed
787                        break
788        endswitch
789
790        return 0
791End
792
793//TODO
794//
795// this "restores" the display of panels to their actual position based on the apparent beam center
796//
797Function RestorePanelButtonProc(ba) : ButtonControl
798        STRUCT WMButtonAction &ba
799
800        switch( ba.eventCode )
801                case 2: // mouse up
802                        // click code here
803                        V_RestorePanels()
804                        break
805                case -1: // control being killed
806                        break
807        endswitch
808
809        return 0
810End
811
812// TODO
813//
814// link this slider to the "high" end of the color mapping for whatever is currently displayed
815//
816// -- see Buttons.ipf for the old SANS implementation
817//
818Function HiMapSliderProc(sa) : SliderControl
819        STRUCT WMSliderAction &sa
820
821        switch( sa.eventCode )
822                case -1: // control being killed
823                        break
824                default:
825                        if( sa.eventCode & 1 ) // value set
826                                Variable curval = sa.curval
827                        endif
828                        break
829        endswitch
830
831        return 0
832End
833
834// TODO
835//
836// link this slider to the "low" end of the color mapping for whatever is currently displayed
837//
838// -- see Buttons.ipf for the old SANS implementation
839//
840Function LowMapSliderProc(sa) : SliderControl
841        STRUCT WMSliderAction &sa
842
843        switch( sa.eventCode )
844                case -1: // control being killed
845                        break
846                default:
847                        if( sa.eventCode & 1 ) // value set
848                                Variable curval = sa.curval
849                        endif
850                        break
851        endswitch
852
853        return 0
854End
855
856
Note: See TracBrowser for help on using the repository browser.