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

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

minor changes to prefix functions with "V_" to avoid conflicts with non-VSANS functions.

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