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

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

changes to a few analysis models to make these Igor 7-ready

adding mask editing utilities

many changes to event mode for easier processing of split lists

updated event mode help file

+ lots more!

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