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

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

many additions.

Moved unused igor/nexus testing files to Vx_ prefix since they're garbage. Pulled out the useful bits for mask and div R/W and moved those to theire appropriate procedures.

Testing the simple correction of data, only tested basic subtraction. All of it still needs to be verified since I don't have any real header numbers and units yet.

Adjusted the columns on the file catalog to be more appropriate, and added a hook to allow loading of raw data files directly from the table and a popup contextual menu. May add more functionality to it later.

Corrected how the 1D data is plotted so that it correctly uses the binning type. I(q) save now also uses the binning as specified.

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 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        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        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 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                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=VDataTabProc,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=StatusButtonProc,title="Status"
158        Button button_IvsQ,pos={689,113},size={70,20},proc=IvsQPanelButtonProc,title="I vs. Q"
159        Button button_file_m,pos={619,55},size={50,20},proc=File_minus_ButtonProc,title="File <"
160        Button button_file_p,pos={679,55},size={50,20},proc=File_plus_ButtonProc,title="File >"
161        Button button_log,pos={689,146},size={70,20},proc=LogLinButtonProc,title="isLin",userData="0"
162        Button button_tab_p,pos={648,81},size={50,20},proc=Tab_p_ButtonProc,title="Tab >"
163        Button button_isolate,pos={606,114},size={70,20},proc=IsolateButtonProc,title="Isolate"
164        Button button_toWork,pos={770,113},size={70,20},proc=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=TagFileButtonProc,title="Tag File"
171        Button button_tagFile,disable=2
172        Button button_saveIQ,pos={720,412},size={70,20},proc=SaveIQ_ButtonProc,title="Save I(Q)"
173        Button button_BeamCtr,pos={603,450},size={70,20},proc=BeamCtrButtonProc,title="Beam Ctr"
174        Button button_SpreadPanels,pos={603,488},size={100,20},proc=SpreadPanelButtonProc,title="Spread Panels"
175        Button button_RestorePanels,pos={603,526},size={100,20},proc=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=HiMapSliderProc
181        Slider slider_hi,limits={0,1,0},value= 1,ticks= 0
182        Slider slider_lo,pos={558,315},size={16,80},proc=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 VDataTabProc(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 FakeRestorePanelsButtonClick()
651
652        STRUCT WMButtonAction ba
653        ba.eventCode = 2
654        RestorePanelButtonProc(ba)
655       
656        return(0)
657End
658
659
660// fake status button click
661Function FakeStatusButtonClick()
662
663        STRUCT WMButtonAction ba
664        ba.eventCode = 2
665        StatusButtonProc(ba)
666       
667        return(0)
668End
669
670// fake click on each tab to populate the data
671Function FakeTabClick(tab)
672        Variable tab
673       
674        STRUCT WMTabControlAction tca
675
676        tca.eventCode = 2               //fake mouse up
677        tca.tab = tab
678        VDataTabProc(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 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 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 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                        FakeTabClick(V_Value)
741
742// update the status when the tab is clicked                   
743                        STRUCT WMButtonAction sa
744                        sa.eventCode = 2
745                        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 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 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 "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 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 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 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 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 - thes 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 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 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 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 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 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                                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 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                                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.