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

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

ADDED:

included common NCNR procedures for the PlotManager?, to allow plotting of 1D data sets using a familiar interface

greatly expanded Patch functionality to include input in the multiple sections of the Nexus file, including separate panels to handle patching of waves to the file - needed for non-linear coefficients, dead time, and XY beam centers. All patch operations are expandable as more fields become necessary to patch.

removed bug of group_id being defined in /reduction and in /sample (removed R/W that referenced /reduction)

added panel to "isolate" a single detector panel, allowing the corrections to be applied/removed/recalculated as needed to directly see their effects.

linked new procedures to their appropriate action buttons

Added more data fields (label, intent, etc.) to the VCALC to Nexus data writer to get more realistic values into the fake data files for testing

Added VCALC simulation functions with EMP and BGD in anticipation of testing the CORRECT step

more little bug and documentation fixes which I can't remember, but they are all important...

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