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

Last change on this file since 1012 was 1012, checked in by srkline, 6 years ago

Updating the patch panel for the VSANS variables, a first pass at including the essential values, and a section that has per-detector values.

Still needs to be fully stress tested to be sure that it does all of read/write operations correctly.

adjusted the "last file loaded" global variable that is displayed on the data display to only update when a file is loaded for display, not when any file is loaded for the catalog, or for the patch panel.

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