Ignore:
Timestamp:
Jun 17, 2016 11:43:46 AM (6 years ago)
Author:
srkline
Message:

main changes here are the addition of a first pass at the file catalog, and patch panel. each of these is based on the old SANS file (for now) and has been updated to at least compile.

Much more work needs to be done to get the functionality to be what VSANS needs, both in what is important to report in the file catalog, and how to best present the patch GUI for different situations

File:
1 edited

Legend:

Unmodified
Added
Removed
  • sans/Dev/trunk/NCNR_User_Procedures/Reduction/VSANS/V_MaskUtils.ipf

    r1000 r1002  
    22#pragma rtGlobals=3             // Use modern global access method and strict wave access. 
    33 
    4  
     4// 
     5// Mask utilities: 
     6// - loader 
     7// - simple editor 
     8// - save mask file 
     9// - assign mask file to data file 
     10// 
     11// 
     12//  this is (at first) to be a very simple editor to generate masks row/column wise, not drawing 
     13//  masks with arbitrary shape.  
     14// 
     15//  
     16// 
     17 
     18///// LOADING 
     19 
     20// TODO - when maks is loaded, need to be sure to clean up the "extra" waves that may be present 
     21//  - the overlay and the currentTube waves since these are not overwritten or killed when new mask  
     22//  data is read in from HDF. need to manually? check for these and delete then, or the data and 
     23//  mask overlay will be out of sync. 
     24// 
     25 
     26 
     27// passing null file string presents a dialog 
     28// called from the Main Button " Read Mask" 
     29Proc LoadFakeMASKData() 
     30        V_LoadHDF5Data("","MSK") 
     31End 
     32 
     33 
     34 
     35//// DRAWING/SAVING 
     36// 
    537// TODO: 
    638// x- CHANGE the mask behavior to a more logical choice - and consistent with SANS 
     
    1143 
    1244 
    13 // also, move the mask generating utilities from VC_HDF5_Utils into this procedure - to keep 
     45// x- move the mask generating utilities from VC_HDF5_Utils into this procedure - to keep 
    1446// all of the mask procedures together 
    1547 
    1648 
    17 // 
    18 // -- this is to be a very simple editor to generate masks row/column wise, not drawing 
    19 // 
     49// TODO -- document the arrow keys moving the tube number and adding/deleting tubes from the mask 
     50//  this is done through a window hook function (LR moves tube number, up/down = add/delete) 
     51// 
     52// TODO -- make the arrow keys Igor 6 compatible - search for specialKeyCode or Keyboard Events in the help file 
     53//     and what needs to be replaced for Igor 6 
     54// TODO -- for L/R panels, the maksing of columns should be sufficient. Tubes are vertical. For the T/B panels 
     55//         the L/R panels cast a vertical shadow (=vertical mask) AND the tubes are horizontal, so the individual 
     56//         tubes will likely need to be masked in a horizontal line too, per tube. ADD this in... 
    2057 
    2158 
    2259//TODO 
    23 // -- draw a mask 
    24 // -- save a mask (all panels) 
    25 // -- be able to save the mask name to the file 
    26 // -- be able to read a mask based on what is in the data file 
     60// x- draw a mask 
     61// x- save a mask (all panels) 
     62// -- be able to save the mask name to the RAW data file 
     63// -- be able to read a mask based on what name is in the data file 
    2764// 
    2865// x- biggest thing now is to re-write the DrawDetPanel() routine from the beamCenter.ipf 
    2966//    to do what this panel needs 
    3067// 
    31 // -- lots to clean up 
    32 // -- add this to the list of includes, move the file to SVN, and add it. 
     68// x- add this to the list of includes, move the file to SVN, and add it. 
    3369// 
    3470// -- for working with VCALC -- maybe have an automatic generator (if val < -2e6, mask = 0) 
     
    3874//    routines need to be aware of this 
    3975 
    40 Macro Edit_a_Mask() 
     76 
     77 
     78// called from the main button "Draw Mask" 
     79Proc Edit_a_Mask() 
    4180        V_EditMask() 
    4281end 
     
    4584        DoWindow/F MaskEditPanel 
    4685        if(V_flag==0) 
     86                Variable/G root:Packages:NIST:VSANS:Globals:gMaskTube = 0 
     87                Variable/G root:Packages:NIST:VSANS:Globals:gMaskMaxIndex = 47 
    4788                Execute "MaskEditorPanel()" 
    4889        endif 
     
    5293// TODO - may need to adjust the display for the different pixel dimensions 
    5394//      ModifyGraph width={Plan,1,bottom,left} 
     95// 
     96// TODO -- need buttons for: 
     97//              -- quit 
     98//    -- help (button is there, fill in the content) 
    5499// 
    55100Proc MaskEditorPanel() : Panel 
     
    64109        PopupMenu popup_2,mode=1,popvalue="RAW",value= #"\"RAW;SAM;VCALC;\"" 
    65110 
    66         SetVariable setvar0,pos={247.00,20.00},size={150.00,14.00},title="tube number" 
    67         SetVariable setvar0,limits={0,128,1},value= _NUM:0 
    68         Button button_0,pos={249.00,46.00},size={50.00,20.00},proc=AddToMaskButtonProc,title="Add" 
    69         Button button_1,pos={309.00,46.00},size={50.00,20.00},proc=RemoveFromMaskButtonProc,title="Del" 
    70         Button button_2,pos={389.00,46.00},size={90.00,20.00},proc=ToggleMaskButtonProc,title="Toggle" 
    71         Button button_3,pos={489.00,46.00},size={80.00,20.00},proc=SaveMaskButtonProc,title="Save" 
    72  
    73 // TODO -- need buttons for save? quit? 
    74 // setVariable to add a row to the mask, column to the mask, toggle the mask on/off to see what's 
    75 //     happening with the data 
    76  
    77  
    78 // TODO - get rid of the hard-wired panel choice 
    79 //      duplicate/O root:Packages:NIST:VSANS:VCALC:entry:instrument:detector_FL:det_FL curDispPanel 
    80         Make/O/D/N=(48,128) curDispPanel                //will this work? 
    81         SetScale/P x 0,1, curDispPanel 
    82         SetScale/P y 0,1, curDispPanel 
     111        SetVariable setvar0,pos={257.00,20.00},size={150.00,14.00},title="tube number" 
     112        SetVariable setvar0,limits={0,127,1},value=root:Packages:NIST:VSANS:Globals:gMaskTube 
     113        Button button_0,pos={257,46.00},size={50.00,20.00},proc=AddToMaskButtonProc,title="Add" 
     114        Button button_1,pos={319.00,46.00},size={50.00,20.00},proc=RemoveFromMaskButtonProc,title="Del" 
     115        Button button_2,pos={409.00,46.00},size={90.00,20.00},proc=ToggleMaskButtonProc,title="Toggle" 
     116        Button button_3,pos={509.00,46.00},size={80.00,20.00},proc=SaveMaskButtonProc,title="Save" 
     117        Button button_4,pos={603.00,10.00},size={20.00,20.00},proc=DrawMaskHelpButtonProc,title="?" 
     118        CheckBox check_0,pos={190.00,23.00},size={37.00,15.00},proc=DrawMaskRadioCheckProc,title="Row" 
     119        CheckBox check_0,value= 0,mode=1 
     120        CheckBox check_1,pos={190.00,46.00},size={32.00,15.00},proc=DrawMaskRadioCheckProc,title="Col" 
     121        CheckBox check_1,value= 1,mode=1 
     122 
     123        SetWindow MaskEditPanel, hook(MyHook)=MaskWindowHook 
    83124 
    84125        // draw the correct images 
     
    88129        // overlay the current mask 
    89130        V_OverlayMask("FT",1) 
    90 //      OverlayMaskPanel("FL") 
    91131 
    92132EndMacro 
    93133 
     134Function DrawMaskHelpButtonProc(ba) : ButtonControl 
     135        STRUCT WMButtonAction &ba 
     136 
     137        switch( ba.eventCode ) 
     138                case 2: // mouse up 
     139                        // click code here 
     140                        DoAlert 0, "Draw Mask Help not written yet..." 
     141                        break 
     142                case -1: // control being killed 
     143                        break 
     144        endswitch 
     145 
     146        return 0 
     147End 
     148 
     149// 
     150//a simple toggle between the two, so the logic is not done in the cleanest way. 
     151// 
     152// update the limits on the tube nubmer based on row/col and the panel (gMaskMaxIndex global) 
     153// 
     154Function DrawMaskRadioCheckProc(cba) : CheckBoxControl 
     155        STRUCT WMCheckboxAction &cba 
     156 
     157        switch( cba.eventCode ) 
     158                case 2: // mouse up 
     159                        Variable checked = cba.checked 
     160                        String name = cba.ctrlName 
     161                         
     162                        //get information to update the limits on the tube number setvar 
     163                        ControlInfo popup_0 
     164                        String str=S_Value 
     165                        wave data = $("root:Packages:NIST:VSANS:MSK:entry:instrument:detector_"+str+":data") 
     166                        Variable val 
     167                         
     168                        // update the radio button status and the setvar limits                  
     169                        if(cmpstr(name,"check_0") == 0)         // ROW is being selected 
     170                                CheckBox check_0,value = 1 
     171                                CheckBox check_1,value = 0 
     172                                val = DimSize(data, 1) -1 
     173                        else 
     174                                // COL is being selected 
     175                                CheckBox check_0,value = 0 
     176                                CheckBox check_1,value = 1 
     177                                val = DimSize(data, 0) -1 
     178                        endif 
     179                         
     180                        SetVariable setvar0,limits={0,val,1} 
     181                        NVAR gVal = root:Packages:NIST:VSANS:Globals:gMaskTube 
     182                        NVAR gMax = root:Packages:NIST:VSANS:Globals:gMaskMaxIndex 
     183                        gMax = val 
     184                        if(gVal > val) 
     185                                gVal = val 
     186                        endif 
     187                         
     188                        break 
     189                case -1: // control being killed 
     190                        break 
     191        endswitch 
     192 
     193        return 0 
     194End 
     195 
     196Function MaskWindowHook(s) 
     197        STRUCT WMWinHookStruct &s 
     198         
     199        Variable hookResult = 0 // 0 if we do not handle event, 1 if we handle it. 
     200         
     201        String message = "" 
     202 
     203        switch(s.eventCode) 
     204                case 11:        // Keyboard event 
     205//                      String keyCodeInfo 
     206//                      sprintf keyCodeInfo, "s.keycode = 0x%04X", s.keycode 
     207//                      if (strlen(message) > 0) 
     208//                              message += "\r" 
     209//                      endif 
     210//                      message +=keyCodeInfo 
     211// 
     212//                      message += "\r" 
     213//                      String specialKeyCodeInfo 
     214//                      sprintf specialKeyCodeInfo, "s.specialKeyCode = %d", s.specialKeyCode 
     215//                      message +=specialKeyCodeInfo 
     216//                      message += "\r" 
     217// 
     218//                      String keyTextInfo 
     219//                      sprintf keyTextInfo, "s.keyText = \"%s\"", s.keyText 
     220//                      message +=keyTextInfo 
     221// 
     222//                      String text = "\\Z24" + message 
     223//                      Textbox /C/N=Message/W=KeyboardEventsGraph/A=MT/X=0/Y=15 text 
     224 
     225                // TODO:  this is all Igor-7 ONLY 
     226 
     227// Note that I need to keep track of the index value since I'm intercepting the  
     228// SetVariable event here. I need to keep the index in range.            
     229                        STRUCT WMButtonAction ba 
     230                        ba.eventCode = 2 
     231                        NVAR tubeVal = root:Packages:NIST:VSANS:Globals:gMaskTube 
     232                        if(s.specialKeyCode == 100) 
     233                                //left arrow 
     234                                tubeVal -= 1 
     235                        endif 
     236                        if(s.specialKeyCode == 101) 
     237                                //right arrow 
     238                                tubeVal += 1 
     239                        endif 
     240                        if(s.specialKeyCode == 102) 
     241                                //up arrow 
     242                                AddToMaskButtonProc(ba) 
     243                        endif 
     244                        if(s.specialKeyCode == 103) 
     245                                //down arrow 
     246                                RemoveFromMaskButtonProc(ba) 
     247                        endif 
     248 
     249// enforce the limits on the setvar 
     250                        NVAR gMax = root:Packages:NIST:VSANS:Globals:gMaskMaxIndex 
     251                        if(tubeVal > gMax) 
     252                                tubeVal = gMax 
     253                        endif 
     254                        if(tubeVal < 0) 
     255                                tubeVal = 0 
     256                        endif 
     257                         
     258// draw the "currentTube" every time 
     259                        ControlInfo popup_0 
     260                        String str=S_Value 
     261                        wave currentTube = $("root:Packages:NIST:VSANS:MSK:entry:instrument:detector_"+str+":currentTube") 
     262 
     263                        // update so that the proper row is displayed on the currentTube 
     264                        currentTube = 0 
     265                         
     266                        ControlInfo check_0             // is it row? 
     267                        Variable isRow = V_value 
     268                        if(isRow) 
     269                                currentTube[][tubeVal] = 1                       
     270                        else 
     271                                currentTube[tubeVal][] = 1 
     272                        endif            
     273 
     274 
     275                        hookResult = 1  // We handled keystroke 
     276                        break 
     277        endswitch 
     278         
     279        return hookResult               // If non-zero, we handled event and Igor will ignore it. 
     280End 
    94281 
    95282Function ToggleMaskButtonProc(ba) : ButtonControl 
     
    130317                         
    131318                        Variable val 
    132                         ControlInfo setvar0 
     319                        ControlInfo setvar0             //get the tube number 
    133320                        val = V_Value 
    134                         maskData[val][] = 1 
     321                         
     322                        ControlInfo check_0             // is it row? 
     323                        Variable isRow = V_value 
     324                        if(isRow) 
     325                                maskData[][val] = 1                      
     326                        else 
     327                                maskData[val][] = 1 
     328                        endif 
    135329                         
    136330                        V_OverlayMask(str,1) 
    137331                         
    138 //                      Print "add tube to mask" 
    139332                        break 
    140333                case -1: // control being killed 
     
    157350                         
    158351                        Variable val 
    159                         ControlInfo setvar0 
     352                        ControlInfo setvar0 // get the tube number 
    160353                        val = V_Value 
    161                         maskData[val][] = 0 
    162                          
    163                         V_OverlayMask(str,1)                     
    164 //                      Print "remove tube from mask" 
     354                         
     355                        ControlInfo check_0             // is it row? 
     356                        Variable isRow = V_value 
     357                        if(isRow) 
     358                                maskData[][val] = 0                      
     359                        else 
     360                                maskData[val][] = 0 
     361                        endif 
     362                         
     363                        V_OverlayMask(str,1)     
     364                                         
    165365                        break 
    166366                case -1: // control being killed 
     
    202402                        //overlay the mask 
    203403                        V_OverlayMask(popStr,1) 
    204 //                      OverlayMaskPanel(popStr) 
    205                          
     404 
    206405                        break 
    207406                case -1: // control being killed 
     
    215414// SEE DrawDetPanel() in the BeamCenter file 
    216415// 
    217 // TODO - currently is hard-wired for the simulation path! 
    218 //     need to make it more generic, especially for RAW data 
     416// TODO 
     417// x- currently is hard-wired for the simulation path!   need to make it more generic, especially for RAW data 
    219418// 
    220419// -- need to adjust the size of the image subwindows to keep the model 
     
    238437 
    239438         
    240         Wave dispW=root:curDispPanel 
     439//      Wave dispW=root:curDispPanel 
    241440 
    242441        //plot it in the subwindow with the proper aspect and positioning 
     
    351550// 
    352551// TODO 
    353 // -- make it work 
    354 // -- remove the old mask first 
    355 // -- make the mask "toggle" to remove it 
    356 // -- go see SANS for color, implementation, etc. 
    357 // -- un-comment the (two) calls 
     552// x- remove the old mask first 
     553// x- make the mask "toggle" to remove it 
     554// x- go see SANS for color, implementation, etc. 
     555// x- un-comment the (two) calls 
    358556// 
    359557// 
     
    362560// 
    363561// if state==1, show the mask, if ==0, hide the mask 
     562// 
     563//** This assumes that if the overlay is/not present on the image display, then the currentTiube is also there/not 
     564// and is not checked 
     565// 
    364566Function V_OverlayMask(str,state) 
    365567        String str 
     
    375577                        Duplicate/O maskW $("root:Packages:NIST:VSANS:MSK:entry:instrument:detector_"+str+":overlay") 
    376578                        wave overlay = $("root:Packages:NIST:VSANS:MSK:entry:instrument:detector_"+str+":overlay") 
    377          
    378                         Redimension/D overlay 
    379                         SetScale/P x 0,1, overlay 
    380                         SetScale/P y 0,1, overlay 
     579                        Duplicate/O maskW $("root:Packages:NIST:VSANS:MSK:entry:instrument:detector_"+str+":currentTube") 
     580                        wave currentTube = $("root:Packages:NIST:VSANS:MSK:entry:instrument:detector_"+str+":currentTube") 
     581 
     582                        Redimension/D overlay,currentTube 
     583                        SetScale/P x 0,1, overlay,currentTube 
     584                        SetScale/P y 0,1, overlay,currentTube 
    381585                 
    382                         String tempStr = "root:Packages:NIST:MSK:overlay" 
    383         //              overlay = (maskW == 1) ? 1 : NaN                        //no need to do this - simply adjust the coloring 
    384          
     586                        //              overlay = (maskW == 1) ? 1 : NaN                        //no need to do this - simply adjust the coloring 
     587 
     588                        // update so that the proper row is displayed on the currentTube 
     589                        currentTube = 0 
     590                                                 
     591                        Variable val 
     592                        ControlInfo setvar0             //get the tube number 
     593                        val = V_Value 
     594                         
     595                        ControlInfo check_0             // is it row? 
     596                        Variable isRow = V_value 
     597                        if(isRow) 
     598                                currentTube[][val] = 1                   
     599                        else 
     600                                currentTube[val][] = 1 
     601                        endif                    
     602                                 
    385603                        CheckDisplayed/W=MaskEditPanel#DetData overlay 
    386604                        if(V_flag==0)           //so the overlay doesn't get appended more than once 
    387605                                AppendImage/W=MaskEditPanel#DetData overlay 
     606                                AppendImage/W=MaskEditPanel#DetData currentTube 
    388607                                ModifyImage/W=MaskEditPanel#DetData overlay ctab= {0.9,1,BlueRedGreen,0}        ,minRGB=NaN,maxRGB=0 
     608                                ModifyImage/W=MaskEditPanel#DetData currentTube ctab= {0.9,1,CyanMagenta,0}     ,minRGB=NaN,maxRGB=0 
    389609                //              ModifyImage/W=MaskEditPanel#DetData overlay ctab= {0,*,BlueRedGreen,0}   
    390610                        endif 
     
    393613                if(state == 0) 
    394614                        wave overlay = $("root:Packages:NIST:VSANS:MSK:entry:instrument:detector_"+str+":overlay") 
     615                        wave currentTube = $("root:Packages:NIST:VSANS:MSK:entry:instrument:detector_"+str+":currentTube") 
     616 
    395617                        CheckDisplayed/W=MaskEditPanel#DetData overlay 
    396618//                      Print "V_flag = ",V_flag 
     
    398620                        If(V_Flag == 1)         //overlay is present 
    399621                                RemoveImage/W=MaskEditPanel#DetData overlay 
     622                                RemoveImage/W=MaskEditPanel#DetData currentTube 
    400623                        endif 
    401624                endif 
     
    538761        Save_VSANS_file("root:VSANS_MASK_file", fileName+".h5") 
    539762         
    540         // read in a data file using the gateway-- reads from the home path 
    541         H_HDF5Gate_Read_Raw(fileName+".h5") 
    542          
    543         // after reading in a "partial" file using the gateway (to generate the xref) 
    544         // Save the xref to disk (for later use) 
    545         Save_HDF5___xref("root:"+fileName,"HDF5___xref") 
    546          
    547         // after you've generated the HDF5___xref, load it in and copy it 
    548         // to the necessary folder location. 
    549         Copy_HDF5___xref("root:VSANS_MASK_file", "HDF5___xref") 
    550          
    551         // writes out the contents of a data folder using the gateway 
    552         H_HDF5Gate_Write_Raw("root:VSANS_MASK_file", fileName+".h5") 
    553  
    554         // re-load the data file using the gateway-- reads from the home path 
    555         // now with attributes 
    556         H_HDF5Gate_Read_Raw(fileName+".h5") 
    557          
    558 End 
     763//      // read in a data file using the gateway-- reads from the home path 
     764//      H_HDF5Gate_Read_Raw(fileName+".h5") 
     765//       
     766//      // after reading in a "partial" file using the gateway (to generate the xref) 
     767//      // Save the xref to disk (for later use) 
     768//      Save_HDF5___xref("root:"+fileName,"HDF5___xref") 
     769//       
     770//      // after you've generated the HDF5___xref, load it in and copy it 
     771//      // to the necessary folder location. 
     772//      Copy_HDF5___xref("root:VSANS_MASK_file", "HDF5___xref") 
     773//       
     774//      // writes out the contents of a data folder using the gateway 
     775//      H_HDF5Gate_Write_Raw("root:VSANS_MASK_file", fileName+".h5") 
     776// 
     777//      // re-load the data file using the gateway-- reads from the home path 
     778//      // now with attributes 
     779//      H_HDF5Gate_Read_Raw(fileName+".h5") 
     780         
     781End 
Note: See TracChangeset for help on using the changeset viewer.