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

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

more changes, lots of files.

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