Ignore:
Timestamp:
Feb 2, 2017 9:52:47 AM (6 years ago)
Author:
srkline
Message:

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:
1 edited

Legend:

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

    r1021 r1022  
    1414// 
    1515/////////////////////////////// 
    16  
    17 // 
    18 // Updated for use with VSANS (in process) 
    19 // -- currently very crude, and needs to be changed to accomodate the  
    20 //   large number of parameters in the file that may/will need to be patched. 
    21 // -- if this turns out to be too crude or too difficult to work with for what  
    22 //   VSANS needs, I may ditch the entire procedure and start fresh 
    23 // 
    24 // June 2016 SRK 
    25 // 
    2616 
    2717// TODOs have been inserted to comment out all of the calls that don't compile and need to be replaced 
     
    4131//               different, and this may lead to different interface choices 
    4232// 
     33// -- need to add some mechanism (new panel?) to enter: 
     34//    -- box coordinates 
     35//    -- ABS parameters 
     36//    -- averaging options -- these will have new options versus SANS (binning panels, slit mode, etc.) 
    4337// 
    4438 
    4539 
    4640//************************** 
    47 // Vers. 1.2 092101 
    48 // 
    49 //procedures required to allow patching of raw SANS data headers 
    50 //only a limited number of fields are allowable for changes, although the list could 
    51 //be enhanced quite easily, at the expense of a larger, more complex panel 
     41// 
     42//procedures required to allow patching of raw vSANS data headers 
    5243//information for the Patch Panel is stored in the root:Packages:NIST:VSANS:Globals:Patch subfolder 
    5344// 
     
    7263 
    7364//initialization of the panel, creating the necessary data folder and global 
    74 //variables if necessary - simultaneously initialize the globals for the Trans 
    75 //panel at this time, to make sure they all exist 
     65//variables if necessary -  
    7666// 
    7767// root:Packages:NIST:VSANS:Globals: 
     
    9181        //ok, create the globals 
    9282        String/G root:Packages:NIST:VSANS:Globals:Patch:gPatchMatchStr = "*" 
     83        String/G root:Packages:NIST:VSANS:Globals:Patch:gPatchCurLabel = "no file selected" 
     84         
    9385        PathInfo catPathName 
    9486        If(V_flag==1) 
     
    9991        endif 
    10092        String/G root:Packages:NIST:VSANS:Globals:Patch:gPatchList = "none" 
    101 //      String/G root:Packages:NIST:VSANS:Globals:Patch:gPS1 = "no file selected" 
    102 //      String/G root:Packages:NIST:VSANS:Globals:Patch:gPS2 = "no file selected" 
    103 //      String/G root:Packages:NIST:VSANS:Globals:Patch:gPS3 = "no box selected" 
    104 //      String/G root:Packages:NIST:VSANS:Globals:Patch:gPS4 = "no file selected" 
    105 //      String/G root:Packages:NIST:VSANS:Globals:Patch:gPS5 = "no file selected" 
    106 //      String/G root:Packages:NIST:VSANS:Globals:Patch:gPS6 = "no file selected" 
    107 //      Variable/G root:Packages:NIST:VSANS:Globals:Patch:gPV1 =0 
    108 //      Variable/G root:Packages:NIST:VSANS:Globals:Patch:gPV2 = 0 
    109 //      Variable/G root:Packages:NIST:VSANS:Globals:Patch:gPV3 = 0 
    110 //      Variable/G root:Packages:NIST:VSANS:Globals:Patch:gPV4 = 0 
    111 //      Variable/G root:Packages:NIST:VSANS:Globals:Patch:gPV5 = 0 
    112 //      Variable/G root:Packages:NIST:VSANS:Globals:Patch:gPV6 = 0 
    113 //      Variable/G root:Packages:NIST:VSANS:Globals:Patch:gPV7 = 0 
    114 //      Variable/G root:Packages:NIST:VSANS:Globals:Patch:gPV8 = 0 
    115 //      Variable/G root:Packages:NIST:VSANS:Globals:Patch:gPV9 = 0 
    116 //      Variable/G root:Packages:NIST:VSANS:Globals:Patch:gPV10 = 0 
    117 //      Variable/G root:Packages:NIST:VSANS:Globals:Patch:gPV11 = 0 
    118 //      Variable/G root:Packages:NIST:VSANS:Globals:Patch:gPV12 = 0 
    119 //      Variable/G root:Packages:NIST:VSANS:Globals:Patch:gPV13 = 0 
    120 //      Variable/G root:Packages:NIST:VSANS:Globals:Patch:gPV14 = 0 
    121 //      Variable/G root:Packages:NIST:VSANS:Globals:Patch:gPV15 = 0 
    122 //      Variable/G root:Packages:NIST:VSANS:Globals:Patch:gPV16 = 0 
    123 //      Variable/G root:Packages:NIST:VSANS:Globals:Patch:gPV17 = 0 
    124 //      Variable/G root:Packages:NIST:VSANS:Globals:Patch:gPV18 = 0 
    125 //      Variable/G root:Packages:NIST:VSANS:Globals:Patch:gPV19 = 0 
    126 //      Variable/G root:Packages:NIST:VSANS:Globals:Patch:gTransCts = 0 
     93 
    12794        Variable/G root:Packages:NIST:VSANS:Globals:Patch:gRadioVal = 1 
    12895         
     
    171138        PopupMenu PatchPopup,help={"The displayed file is the one that will be edited. The entire list will be edited if \"Change All..\" is selected. \r If no items, or the wrong items appear, click on the popup to refresh. \r List items are selected from the file based on MatchString"} 
    172139        PopupMenu PatchPopup,mode=1,popvalue="none",value= #"root:Packages:NIST:VSANS:Globals:Patch:gPatchList" 
    173 //      Button SHButton,pos={324,37},size={100,20},proc=ShowHeaderButtonProc,title="Show Header" 
    174 //      Button SHButton,help={"This will display the header of the file indicated in the popup menu."} 
     140 
    175141        Button CHButton,pos={314,37},size={110,20},proc=V_ChangeHeaderButtonProc,title="Change Header" 
    176142        Button CHButton,help={"This will change the checked values (ONLY) in the single file selected in the popup."} 
     
    181147        Button ChAllButton,pos={245,60},size={180,20},proc=V_ChAllHeadersButtonProc,title="Change All Headers in List" 
    182148        Button ChAllButton,help={"This will change the checked values (ONLY) in ALL of the files in the popup list, not just the top file. If the \"change\" checkbox for the item is not checked, nothing will be changed for that item."} 
    183         Button DoneButton,pos={314,85},size={110,20},proc=V_DoneButtonProc,title="Done Patching" 
     149        Button DoneButton,pos={450,60},size={110,20},proc=V_DoneButtonProc,title="Done Patching" 
    184150        Button DoneButton,help={"When done Patching files, this will close this control panel."} 
    185151        CheckBox check0,pos={18,80},size={40,15},title="Run #",value= 1,mode=1,proc=V_MatchCheckProc 
    186152        CheckBox check1,pos={78,80},size={40,15},title="Text",value= 0,mode=1,proc=V_MatchCheckProc 
    187         CheckBox check2,pos={138,80},size={40,15},title="SDD",value= 0,mode=1,proc=V_MatchCheckProc 
    188  
    189         PopupMenu popup_0,pos={450,85},size={109,20},title="Detector Panel",proc=V_PatchPopMenuProc 
     153        CheckBox check2,pos={138,80},size={40,15},title="Group_ID",value= 0,mode=1,proc=V_MatchCheckProc 
     154 
     155        SetVariable curStr,pos={50,112},size={350,20},title="File Label:" 
     156        SetVariable curStr,help={"Label of current file in popup list"} 
     157        SetVariable curStr,font="Courier",fSize=10 
     158        SetVariable curStr,limits={-Inf,Inf,0},value= root:Packages:NIST:VSANS:Globals:Patch:gPatchCurLabel 
     159         
     160        PopupMenu popup_0,pos={450,112},size={109,20},title="Detector Panel",proc=V_PatchPopMenuProc 
    190161        PopupMenu popup_0,mode=1,popvalue="FL",value= #"\"FL;FR;FT;FB;ML;MR;MT;MB;B;\"" 
    191162 
    192163 
    193         TabControl PatchTab,pos={20,120},size={570,400} 
     164        TabControl PatchTab,pos={20,140},size={570,380} 
    194165        TabControl PatchTab,tabLabel(0)="Control",tabLabel(1)="Reduction",tabLabel(2)="Sample" 
    195166        TabControl PatchTab,tabLabel(3)="Instrument",tabLabel(4)="Detectors",tabLabel(5)="PolSANS" 
     
    197168 
    198169 
    199         ListBox list0,pos={30,150.00},size={550.00,350},proc=V_PatchListBoxProc,frame=1 
     170        ListBox list0,pos={30,170.00},size={550.00,330},proc=V_PatchListBoxProc,frame=1 
    200171        ListBox list0,fSize=10,userColumnResize= 1,listWave=PP_ListWave,selWave=PP_SelWave,titleWave=PP_TitleWave 
    201172        ListBox list0,mode=2,widths={30,200} 
     
    236207        switch(tab)      
    237208                case 0:  
    238                         //Print "tab 0" 
     209                        //Print "tab 0 = CONTROL" 
    239210                         
    240211                        V_FillListBox0(PP_ListWave,PP_SelWave) 
    241212                        break            
    242213                case 1:  
    243                         //Print "tab 1" 
     214                        //Print "tab 1 = REDUCTION" 
    244215                         
    245216                        V_FillListBox1(PP_ListWave,PP_SelWave) 
    246217                        break 
    247218                case 2:  
    248                         //Print "tab 2" 
     219                        //Print "tab 2 = SAMPLE" 
    249220                         
    250221                        V_FillListBox2(PP_ListWave,PP_SelWave) 
    251222                        break 
    252223                case 3:  
    253                         //Print "tab 3" 
     224                        //Print "tab 3 = INSTRUMENT" 
    254225                         
    255226                        V_FillListBox3(PP_ListWave,PP_SelWave) 
    256227                        break 
    257228                case 4:  
    258                         //Print "tab 4" 
     229                        //Print "tab 4 = DETECTORS" 
    259230                         
    260231                        V_FillListBox4(PP_ListWave,PP_SelWave) 
    261232                        break 
    262233                case 5:  
    263                         //Print "tab 5" 
     234                        //Print "tab 5 = POL_SANS" 
    264235 
    265236                        V_FillListBox5(PP_ListWave,PP_SelWave) 
     
    276247 
    277248// fill list boxes based on the tab 
     249// 
     250// *** if the number of elements is changed, then be sure that the variable nRows is updated 
     251//    * this is the same procedure for all of the tabs 
     252//    * then be sure that the new listWave assignments are properly indexed 
    278253// 
    279254// CONTROL 
     
    320295// fill list boxes based on the tab 
    321296// 
    322 // Reduction items 
     297// REDUCTION items 
    323298// 
    324299Function V_FillListBox1(listWave,selWave) 
     
    495470// fill list boxes based on the tab 
    496471// 
    497 // TODO -- 
     472// TODO -- is this all of the fields that I want to edit? 
     473// 
    498474// DETECTORS 
    499475// 
     
    574550// fill list boxes based on the tab 
    575551// 
    576 // TODO -- 
     552// TODO -- this all needs to be filled in, once I figure out what is needed 
     553// 
    577554// PolSANS 
    578555// 
     
    610587 
    611588 
    612 // TODO - determine if I really need this --- I don't  
     589// TODO -- determine if I really need this --- I don't  
    613590//  think I really have any reason to respond to events from list box actions 
    614 // or edits. the final action of patching is done with the button 
     591//  or edits. the final action of patching is done with the button 
    615592// 
    616593Function V_PatchListBoxProc(lba) : ListBoxControl 
     
    649626 
    650627//button action procedure to select the local path to the folder that 
    651 //contains the SANS data 
     628//contains the vSANS data 
    652629//sets catPathName, updates the path display and the popup of files (in that folder) 
    653630// 
     
    655632        String PathButton 
    656633         
     634        // call the main procedure to set the data path 
     635        V_PickPath() 
     636         
    657637        //set the global string to the selected pathname 
    658         V_PickPath() 
    659638        //set a local copy of the path for Patch 
    660639        PathInfo/S catPathName 
    661         String dum = S_path 
     640   String dum = S_path 
    662641        if (V_flag == 0) 
    663642                //path does not exist - no folder selected 
     
    675654        V_SetMatchStrProc("",0,"*","")          //this is equivalent to finding everything, typical startup case 
    676655 
    677 End 
    678  
    679  
     656        return(0) 
     657End 
     658 
     659// 
    680660//returns a list of valid files (raw data, no version numbers, no averaged files) 
    681661//that is semicolon delimited, and is suitable for display in a popup menu 
     
    706686End 
    707687 
     688 
     689 
     690// 
     691// TODO: 
     692// -- test all of the filters to be sure they actually work properly. 
     693//   Run # filter works 
     694//   Text filter works 
     695// 
     696// -- SDD filter does not apply -- what is a better filter choice? 
     697// -- can I filter intent? group_id? 
     698// -- can't just search for "sample" - this returns everything 
     699// 
     700// 
     701// 
     702// 
     703// 
    708704//returns a list of valid files (raw data, no version numbers, no averaged files) 
    709705//that is semicolon delimited, and is suitable for display in a popup menu 
     
    751747         
    752748        String list="",item="",fname,runList="",numStr="" 
    753         Variable ii,num=ItemsInList(newList),val,sdd 
     749        Variable ii,num=ItemsInList(newList),val,group_id 
    754750        NVAR gRadioVal= root:Packages:NIST:VSANS:Globals:Patch:gRadioVal 
    755751         
     
    786782        endif 
    787783         
    788         // SDD 
     784        // group_id 
     785        // replace this with: V_getSample_GroupID(fname) 
    789786        Variable pos 
    790         String SDDStr="" 
     787        String IDStr="" 
    791788        if(gRadioVal == 3) 
    792789                pos = strsearch(match, "*", 0) 
     
    801798                        item=StringFromList(ii, newList , ";") 
    802799                        fname = path + item 
    803 // TODO -- replace call -- this is hard-wired for "FL" 
    804                         sdd = V_getDet_ActualDistance(fname,"FL") 
    805                         if(pos == -1) 
    806                                 //no wildcard 
    807                                 if(abs(val - sdd) < 0.01        )               //if numerically within 0.01 meter, they're the same 
    808                                         list += item + ";" 
    809                                 endif 
    810                         else 
    811                                 //yes, wildcard, try a string match? 
    812                                 // string match doesn't work -- 1* returns 1m and 13m data 
    813                                 // round the value (or truncate?) 
    814                                  
    815                                 //SDDStr = num2str(sdd) 
    816                                 //if(strsearch(SDDStr,match[0,pos-1],0) != -1) 
    817                                 //      list += item + ";" 
    818                                 //endif 
    819                                  
    820                                 if(abs(val - round(sdd)) < 0.01 )               //if numerically within 0.01 meter, they're the same 
    821                                         list += item + ";" 
    822                                 endif 
    823          
     800                        group_id = V_getSample_GroupID(fname) 
     801                        if(group_id == val) 
     802                                list += item + ";" 
    824803                        endif 
     804         
    825805                endfor 
    826806                 
     
    847827        String popStr 
    848828 
    849         //change the contents of gPatchList that is displayed 
    850         //based on selected Path, match str, and 
    851         //further trim list to include only RAW SANS files 
    852829         
    853830//      String/G root:Packages:NIST:VSANS:Globals:Patch:gPatchList = list 
    854831//      ControlUpdate PatchPopup 
    855832        V_ShowHeaderButtonProc("SHButton") 
     833         
     834        return(0) 
    856835End 
    857836 
     
    881860                V_ShowHeaderButtonProc("SHButton") 
    882861        endif 
     862        return(0) 
    883863End 
    884864 
     
    927907        ControlUpdate/A/W=V_Patch_Panel 
    928908         
     909        // no matter what tab is selected, show the file label 
     910        SVAR fileLabel = root:Packages:NIST:VSANS:Globals:Patch:gPatchCurLabel 
     911        fileLabel = V_getSampleDescription(tempName) 
     912         
     913        return(0) 
    929914End 
    930915 
     
    10521037         
    10531038 
    1054 // 
    1055 //      ControlInfo checkPS1            //change the sample label ? 
    1056 //      if(V_Value == 1) 
    1057 //              SVAR gPS1 = root:Packages:NIST:VSANS:Globals:Patch:gPS1 
    1058 //              V_writeSampleDescription(fname,gPS1) 
    1059 //      endif 
    1060 //       
    1061 //      ControlInfo checkPV1 
    1062 //      if(V_Value == 1)                //sample transmission 
    1063 //              ControlInfo PV1 
    1064 //              V_writeSampleTransmission(fname,V_value) 
    1065 //      Endif 
    1066 //       
    1067 //      ControlInfo checkPV2 
    1068 //      if(V_Value == 1)                //sample thickness 
    1069 //              ControlInfo PV2 
    1070 //              V_writeSampleThickness(fname,V_Value) 
    1071 //      Endif 
    1072 //       
    1073 //      ControlInfo checkPV5 
    1074 //      if(V_Value == 1)                //attenuator number 
    1075 //              ControlInfo PV5 
    1076 //              V_writeAttenThickness(fname,V_value) 
    1077 //      Endif 
    1078 // 
    1079 //      ControlInfo checkPV6            // count time 
    1080 //      if(V_Value == 1) 
    1081 //              ControlInfo PV6 
    1082 //              V_writeCount_time(fname,V_Value) 
    1083 //      Endif 
    1084 // 
    1085 //      ControlInfo checkPV7     
    1086 //      if(V_Value == 1)    //monitor count 
    1087 //              ControlInfo PV7  
    1088 //              V_writeMonitorCount(fname,V_Value) 
    1089 //      Endif 
    1090 // 
    1091 //      ControlInfo checkPV10    
    1092 //      if(V_Value == 1)      //wavelength 
    1093 //              ControlInfo PV10 
    1094 //              V_writeWavelength(fname,V_Value) 
    1095 //      Endif 
    1096 // 
    1097 //      ControlInfo checkPV11            
    1098 //      if(V_Value == 1)      //wavelength spread 
    1099 //              ControlInfo PV11 
    1100 //              V_writeWavelength_spread(fname,V_Value) 
    1101 //      Endif    
    1102 // 
    1103 //      ControlInfo checkPV14            
    1104 //      if(V_Value == 1)      //source aperture 
    1105 //              ControlInfo PV14 
    1106 //              textStr = num2str(V_Value) 
    1107 //              V_writeSourceAp_size(fname,textStr)             //this is expecting a string 
    1108 //      Endif 
    1109 //       
    1110 //      ControlInfo checkPV15            
    1111 //      if(V_Value == 1)      //sample aperture 
    1112 //              ControlInfo PV15 
    1113 //              V_writeSampleAp2_size(fname,V_Value)            //TODO -- not sure if this is correct call 
    1114 //      Endif 
    1115 // 
    1116 //      ControlInfo checkPV16 
    1117 //      if(V_Value == 1)      //source-sam dist 
    1118 //              ControlInfo PV16 
    1119 //// TODO -- replace call 
    1120 ////            WriteSrcToSamDistToHeader(fname,num) 
    1121 //      Endif 
    1122 // 
    1123 //      ControlInfo checkPV18 
    1124 //      if(V_Value == 1)      //beamstop diam 
    1125 //              ControlInfo PV18 
    1126 //              V_writeBeamStopC2_size(fname,V_Value)                   //TODO depends on which det carriage I'm working with (2) or (3) 
    1127 //      Endif    
    1128 // 
    1129 //      ControlInfo checkPS2            //change the DIV file name? 
    1130 //      if(V_Value == 1) 
    1131 //              SVAR gPS2 = root:Packages:NIST:VSANS:Globals:Patch:gPS2 
    1132 //              V_writeSensitivityFileName(fname,gPS2) 
    1133 //      endif    
    1134 //       
    1135 //      ControlInfo checkPS3            //change the sample intent? 
    1136 //      if(V_Value == 1) 
    1137 //              SVAR gPS3 = root:Packages:NIST:VSANS:Globals:Patch:gPS3 
    1138 //              V_writeReductionIntent(fname,gPS3) 
    1139 //      endif    
    1140 // 
    1141 //       
    1142 //// individual detector values  
    1143 //      ControlInfo checkPV3 
    1144 //      if(V_Value == 1)                //pixel X 
    1145 //              ControlInfo PV3 
    1146 //              V_writeDet_beam_center_x(fname,detStr,V_Value)   
    1147 //      Endif 
    1148 //       
    1149 //      ControlInfo checkPV4 
    1150 //      if(V_Value == 1)                // pixel Y 
    1151 //              ControlInfo PV4 
    1152 //              V_writeDet_beam_center_y(fname,detStr,V_Value)   
    1153 //      Endif 
    1154 //       
    1155 //      ControlInfo checkPV17 
    1156 //      if(V_Value == 1)      //det offset 
    1157 //              ControlInfo PV17 
    1158 //              V_writeDet_LateralOffset(fname,detStr,V_Value)          // TODO lateral or vertical offset, based on detStr 
    1159 //      Endif 
    1160 // 
    1161 //      ControlInfo checkPV19 
    1162 //      if(V_Value == 1)     //SDD 
    1163 //              ControlInfo PV19 
    1164 //              V_writeDet_distance(fname,detStr,V_Value)         
    1165 //      Endif 
    1166 // 
    1167 //      ControlInfo checkPV8     
    1168 //      if(V_Value == 1)     //total detector count 
    1169 //              ControlInfo PV8 
    1170 //              V_writeDet_IntegratedCount(fname,detStr,V_value)                 
    1171 //      Endif 
    11721039 
    11731040 
     
    12301097        if ((selWave[8][0] & 2^4) != 0)         //"group_id (sample)" 
    12311098                val = str2num(listWave[8][2]) 
    1232                 err = V_writeReduction_group_ID(fname,val) 
     1099                err = V_writeSample_GroupID(fname,val) 
    12331100        endif    
    12341101         
     
    14581325//This function will read only the selected values editable in the patch panel 
    14591326// 
    1460 // -- TODO -- 
    1461 // re-write this to be tab-aware. ShowHeaderForPatch() calls this, but does nothing 
    1462 // to update the tab content. Figure out which function is in charge, and update the content. 
     1327// DONE 
     1328// x- re-write this to be tab-aware. ShowHeaderForPatch() calls this, but does nothing 
     1329//    to update the tab content. Figure out which function is in charge, and update the content. 
    14631330// 
    14641331Function V_ReadHeaderForPatch(fname) 
     
    14791346                DoAlert 0,"The VSANS Data Reduction Tutorial Help file could not be found" 
    14801347//      endif 
     1348        return(0) 
    14811349End 
    14821350 
     
    15901458/////////////// 
    15911459// 
    1592 // this is a block to patch waves to the file headers, and can patch multiple files 
     1460// this is a block to patch DEADTIME waves to the file headers, and can patch multiple files 
    15931461//  
    15941462// uses a simple panel to show what the table of values is. 
     
    15991467//        trigger a cleanout. 
    16001468// 
    1601 // TODO - link this to a panel somewhere - a button? menu item? will there be a lot more of these little panels? 
     1469// TODO -- link this to a panel somewhere - a button? menu item? will there be a lot more of these little panels? 
     1470// 
     1471// TODO -- currently, this does not patch the deadtime for the back "B" detector. it is a single 
     1472//        value, not a wave see V_WritePerfectDeadTime(filename) for how the perfect (fake) values is written. 
     1473// 
    16021474// 
    16031475Proc V_PatchDetectorDeadtime(firstFile,lastFile,detStr,deadtimeStr) 
     
    16141486         
    16151487        V_fReadDetectorDeadtime(firstFile,lastFile,detStr) 
     1488         
    16161489End 
    16171490 
    16181491// simple utility to patch the detector deadtime in the file headers 
    1619 // pass in the account name as a string 
    16201492// lo is the first file number 
    16211493// hi is the last file number (inclusive) 
     
    16281500        Variable ii 
    16291501        String fname 
     1502         
     1503        // check the dimensions of the deadtimeW/N=48 
     1504        if (DimSize(deadtimeW, 0) != 48 ) 
     1505                Abort "dead time wave is not of proper dimension (48)" 
     1506        endif 
    16301507         
    16311508        //loop over all files 
     
    16671544 
    16681545Proc V_PatchDetectorDeadtimePanel() 
    1669         DoWindow/F Patch_Deadtime 
     1546        DoWindow/F DeadtimePanel 
    16701547        if(V_flag==0) 
    16711548         
     
    16811558 
    16821559 
    1683 // 
    1684 // TODO - needs some minor adjustment to be of practical use, but a proof of concept 
     1560// TODO: 
     1561// x- add method for generating "perfect" dead time to write 
     1562// x- check deadtime wave dimension before writing (check for bad paste operation) 
     1563// -- load from file? different ways to import? 
     1564// -- Dead time constants for "B" are different, and not handled here (yet) 
     1565// -- add help button/file 
     1566// -- add done button 
     1567// -- adjust after user testing 
    16851568// 
    16861569Proc V_DeadtimePatchPanel() : Panel 
     
    16881571 
    16891572 
    1690         NewPanel /W=(600,400,1000,1000)/N=DeadtimePanel/K=1 
     1573        NewPanel /W=(600,400,1000,1000)/N=DeadtimePanel /K=1 
    16911574//      ShowTools/A 
    1692          
    1693         PopupMenu popup_0,pos={20,20},size={109,20},title="Detector Panel" 
     1575        ModifyPanel cbRGB=(16266,47753,2552,23355) 
     1576 
     1577        SetDrawLayer UserBack 
     1578        DrawText 85,99,"Current Values" 
     1579        DrawText 21,258,"Write to all files (inlcusive)" 
     1580        SetDrawEnv fsize= 14,fstyle= 1 
     1581        DrawText 209,30,"Dead Time Constants" 
     1582        DrawText 20,133,"Run Number(s)" 
     1583         
     1584        PopupMenu popup_0,pos={20,40},size={109,20},title="Detector Panel" 
    16941585        PopupMenu popup_0,mode=1,popvalue="FL",value= #"\"FL;FR;FT;FB;ML;MR;MT;MB;\"" 
    16951586         
    1696         Button button0,pos={22.00,62.00},size={50.00,20.00},proc=V_ReadDTButtonProc,title="Read" 
    1697         Button button0_1,pos={95.00,62.00},size={50.00,20.00},proc=V_WriteDTButtonProc,title="Write" 
    1698         SetVariable setvar0,pos={19.00,128.00},size={100.00,14.00},title="first" 
     1587        Button button0,pos={20,81},size={50.00,20.00},proc=V_ReadDTButtonProc,title="Read" 
     1588        Button button0_1,pos={20,220},size={50.00,20.00},proc=V_WriteDTButtonProc,title="Write" 
     1589        Button button0_2,pos={18.00,336.00},size={140.00,20.00},proc=V_GeneratePerfDTButton,title="Perfect Dead Time" 
     1590         
     1591        SetVariable setvar0,pos={20,141},size={100.00,14.00},title="first" 
    16991592        SetVariable setvar0,value= K0 
    1700         SetVariable setvar1,pos={20.00,154.00},size={100.00,14.00},title="last" 
     1593        SetVariable setvar1,pos={20.00,167},size={100.00,14.00},title="last" 
    17011594        SetVariable setvar1,value= K1 
    17021595 
    1703          
    17041596 
    17051597// display the wave      
    17061598        Edit/W=(180,40,380,550)/HOST=#  root:Packages:NIST:VSANS:Globals:Patch:deadTimeWave 
    1707         ModifyTable width(Point)=0 
     1599        ModifyTable width(Point)=40 
    17081600        ModifyTable width(root:Packages:NIST:VSANS:Globals:Patch:deadTimeWave)=120 
    17091601        RenameWindow #,T0 
     
    17121604         
    17131605EndMacro 
     1606 
     1607 
     1608 
     1609Function V_GeneratePerfDTButton(ba) : ButtonControl 
     1610        STRUCT WMButtonAction &ba 
     1611 
     1612        switch( ba.eventCode ) 
     1613                case 2: // mouse up 
     1614                        // click code here 
     1615 
     1616                        WAVE deadTimeWave = root:Packages:NIST:VSANS:Globals:Patch:deadTimeWave 
     1617                        ControlInfo popup_0 
     1618                        strswitch(S_Value) 
     1619                                case "FR": 
     1620                                case "FL": 
     1621                                case "MR": 
     1622                                case "ML": 
     1623                                case "FT": 
     1624                                case "FB": 
     1625                                case "MT": 
     1626                                case "MB": 
     1627                                        deadTimeWave = 1e-18 
     1628 
     1629                                        break 
     1630                                default: 
     1631                                        Print "Det type not found: V_GeneratePerfDTButton()" 
     1632                        endswitch 
     1633                         
     1634                        break 
     1635                case -1: // control being killed 
     1636                        break 
     1637        endswitch 
     1638 
     1639        return 0 
     1640End 
     1641 
     1642 
    17141643 
    17151644 
     
    17641693////////////////////////////////////////////////////////////////////////////////////////////////// 
    17651694////////////////////////////////////////////////////////////////////////////////////////////////// 
     1695// this is a block to patch CALIBRATION waves to the file headers, and can patch multiple files 
     1696//  
     1697// uses a simple panel to show what the table of values is. 
     1698// "read" will read only the first run number contents. 
     1699// 
     1700// TODO -- need to clear out the contents from RawVSANS, or else re-reading to check the values 
     1701//        will read locally, and it will look like nothing was written. Executing "save" will also  
     1702//        trigger a cleanout. 
     1703// 
     1704// TODO -- link this to a panel somewhere - a button? menu item? will there be a lot more of these little panels? 
     1705// 
     1706// TODO -- currently this does not handle the back detector "B". see V_WritePerfectSpatialCalib(filename) 
     1707//         for how fake data is written to the files 
     1708// 
     1709// TODO -- verify that the calibration waves are not transposed 
     1710// 
     1711Proc V_PatchDetectorCalibration(firstFile,lastFile,detStr,calibStr) 
     1712        Variable firstFile=1,lastFile=100 
     1713        String detStr = "FL",calibStr="calibrationWave" 
     1714 
     1715        V_fPatchDetectorCalibration(firstFile,lastFile,detStr,$calibStr) 
     1716 
     1717End 
     1718 
     1719Proc V_ReadDetectorCalibration(firstFile,lastFile,detStr) 
     1720        Variable firstFile=1,lastFile=100 
     1721        String detStr = "FL" 
     1722         
     1723        V_fReadDetectorCalibration(firstFile,lastFile,detStr) 
     1724End 
     1725 
     1726// simple utility to patch the detector calibration wave in the file headers 
     1727// lo is the first file number 
     1728// hi is the last file number (inclusive) 
     1729// 
     1730Function V_fPatchDetectorCalibration(lo,hi,detStr,calibW) 
     1731        Variable lo,hi 
     1732        String detStr 
     1733        Wave calibW 
     1734         
     1735        Variable ii 
     1736        String fname 
     1737         
     1738        // check the dimensions of the calibW (3,48) 
     1739        if (DimSize(calibW, 0) != 3 || DimSize(calibW, 1) != 48 ) 
     1740                Abort "Calibration wave is not of proper dimension (3,48)" 
     1741        endif 
     1742         
     1743        //loop over all files 
     1744        for(ii=lo;ii<=hi;ii+=1) 
     1745                fname = V_FindFileFromRunNumber(ii) 
     1746                if(strlen(fname) != 0) 
     1747                        V_writeDetTube_spatialCalib(fname,detStr,calibW)                         
     1748                else 
     1749                        printf "run number %d not found\r",ii 
     1750                endif 
     1751        endfor 
     1752         
     1753        return(0) 
     1754End 
     1755 
     1756// simple utility to read the detector deadtime stored in the file header 
     1757Function V_fReadDetectorCalibration(lo,hi,detStr) 
     1758        Variable lo,hi 
     1759        String detStr 
     1760         
     1761        String fname 
     1762        Variable ii 
     1763         
     1764        for(ii=lo;ii<=hi;ii+=1) 
     1765                fname = V_FindFileFromRunNumber(ii) 
     1766                if(strlen(fname) != 0) 
     1767                        Wave calibW = V_getDetTube_spatialCalib(fname,detStr) 
     1768                        Duplicate/O calibW root:Packages:NIST:VSANS:Globals:Patch:calibrationWave 
     1769                else 
     1770                        printf "run number %d not found\r",ii 
     1771                endif 
     1772        endfor 
     1773         
     1774        return(0) 
     1775End 
     1776 
     1777 
     1778Proc V_PatchDetectorCalibrationPanel() 
     1779        DoWindow/F CalibrationPanel 
     1780        if(V_flag==0) 
     1781         
     1782                NewDataFolder/O/S root:Packages:NIST:VSANS:Globals:Patch 
     1783 
     1784                Make/O/D/N=(3,48) calibrationWave 
     1785                 
     1786                SetDataFolder root: 
     1787                 
     1788                Execute "V_CalibrationPatchPanel()" 
     1789        endif 
     1790End 
     1791 
     1792 
     1793// 
     1794// TODO: 
     1795// x- add method for generating "perfect" calibration to write 
     1796// x- check Nx3 dimension before writing (check for bad paste operation) 
     1797// -- load from file? different ways to import? 
     1798// -- calibration constants for "B" are different, and not handled here (yet) 
     1799// -- add help button/file 
     1800// -- add done button 
     1801// -- adjust after user testing 
     1802// 
     1803Proc V_CalibrationPatchPanel() : Panel 
     1804        PauseUpdate; Silent 1           // building window... 
     1805 
     1806 
     1807        NewPanel /W=(600,400,1200,1000)/N=CalibrationPanel /K=1 
     1808//      ShowTools/A 
     1809        ModifyPanel cbRGB=(16266,47753,2552,23355) 
     1810 
     1811        SetDrawLayer UserBack 
     1812        DrawText 85,99,"Current Values" 
     1813        DrawText 21,258,"Write to all files (inlcusive)" 
     1814        SetDrawEnv fsize= 14,fstyle= 1 
     1815        DrawText 227,28,"Quadratic Calibration Constants per Tube" 
     1816        DrawText 20,133,"Run Number(s)" 
     1817                 
     1818        PopupMenu popup_0,pos={20,40},size={109,20},title="Detector Panel" 
     1819        PopupMenu popup_0,mode=1,popvalue="FL",value= #"\"FL;FR;FT;FB;ML;MR;MT;MB;\"" 
     1820         
     1821        Button button0,pos={20,81},size={50.00,20.00},proc=V_ReadCalibButtonProc,title="Read" 
     1822        Button button0_1,pos={20,220},size={50.00,20.00},proc=V_WriteCalibButtonProc,title="Write" 
     1823        Button button0_2,pos={18.00,336.00},size={140.00,20.00},proc=V_GeneratePerfCalibButton,title="Perfect Calibration" 
     1824                 
     1825        SetVariable setvar0,pos={20,141},size={100.00,14.00},title="first" 
     1826        SetVariable setvar0,value= K0 
     1827        SetVariable setvar1,pos={20.00,167},size={100.00,14.00},title="last" 
     1828        SetVariable setvar1,value= K1 
     1829 
     1830 
     1831// display the wave      
     1832        Edit/W=(180,40,580,550)/HOST=#  root:Packages:NIST:VSANS:Globals:Patch:calibrationWave 
     1833        ModifyTable width(Point)=40 
     1834        ModifyTable width(root:Packages:NIST:VSANS:Globals:Patch:calibrationWave)=110 
     1835        // the elements() command transposes the view in the table, but does not transpose the wave 
     1836        ModifyTable elements(root:Packages:NIST:VSANS:Globals:Patch:calibrationWave) = (-3, -2) 
     1837        RenameWindow #,T0 
     1838        SetActiveSubwindow ## 
     1839 
     1840         
     1841EndMacro 
     1842 
     1843 
     1844 
     1845//      // and for the back detector "B" 
     1846//      Make/O/D/N=3 tmpCalib 
     1847//      tmpCalib[0] = 1 
     1848//      tmpCalib[1] = 1 
     1849//      tmpcalib[2] = 10000 
     1850//      V_writeDet_cal_x(filename,"B",tmpCalib) 
     1851//      V_writeDet_cal_y(filename,"B",tmpCalib) 
     1852// 
     1853Function V_GeneratePerfCalibButton(ba) : ButtonControl 
     1854        STRUCT WMButtonAction &ba 
     1855 
     1856        switch( ba.eventCode ) 
     1857                case 2: // mouse up 
     1858                        // click code here 
     1859 
     1860                        WAVE calibrationWave = root:Packages:NIST:VSANS:Globals:Patch:calibrationWave 
     1861                        ControlInfo popup_0 
     1862                        strswitch(S_Value) 
     1863                                case "FR": 
     1864                                case "FL": 
     1865                                case "MR": 
     1866                                case "ML": 
     1867                                        //      // for the "tall" L/R banks 
     1868                                        calibrationWave[0][] = -512 
     1869                                        calibrationWave[1][] = 8 
     1870                                        calibrationWave[2][] = 0 
     1871                                        break 
     1872                                case "FT": 
     1873                                case "FB": 
     1874                                case "MT": 
     1875                                case "MB": 
     1876                                        //      // for the "short" T/B banks 
     1877                                        calibrationWave[0][] = -256 
     1878                                        calibrationWave[1][] = 4 
     1879                                        calibrationWave[2][] = 0 
     1880 
     1881                                        break 
     1882                                default: 
     1883                                        Print "Det type not found: V_GeneratePerfCalibButton()" 
     1884                        endswitch 
     1885 
     1886 
     1887                         
     1888                        break 
     1889                case -1: // control being killed 
     1890                        break 
     1891        endswitch 
     1892 
     1893        return 0 
     1894End 
     1895 
     1896 
     1897Function V_ReadCalibButtonProc(ba) : ButtonControl 
     1898        STRUCT WMButtonAction &ba 
     1899 
     1900        switch( ba.eventCode ) 
     1901                case 2: // mouse up 
     1902                        // click code here 
     1903                         
     1904                        ControlInfo popup_0 
     1905                        String detStr = S_Value 
     1906                        ControlInfo setvar0 
     1907                        Variable lo=V_Value 
     1908                        Variable hi=lo 
     1909                         
     1910                        V_fReadDetectorCalibration(lo,hi,detStr) 
     1911                         
     1912                        break 
     1913                case -1: // control being killed 
     1914                        break 
     1915        endswitch 
     1916 
     1917        return 0 
     1918End 
     1919 
     1920Function V_WriteCalibButtonProc(ba) : ButtonControl 
     1921        STRUCT WMButtonAction &ba 
     1922 
     1923        switch( ba.eventCode ) 
     1924                case 2: // mouse up 
     1925                        // click code here 
     1926                         
     1927                        ControlInfo popup_0 
     1928                        String detStr = S_Value 
     1929                        ControlInfo setvar0 
     1930                        Variable lo=V_Value 
     1931                        ControlInfo setvar1 
     1932                        Variable hi=V_Value 
     1933                        Wave calibW = root:Packages:NIST:VSANS:Globals:Patch:calibrationWave 
     1934                         
     1935                        V_fPatchDetectorCalibration(lo,hi,detStr,calibW) 
     1936                         
     1937                        break 
     1938                case -1: // control being killed 
     1939                        break 
     1940        endswitch 
     1941 
     1942        return 0 
     1943End 
     1944 
     1945 
     1946 
     1947////////////////////////////////////////////////////////////////////////////////////////////////// 
     1948////////////////////////////////////////////////////////////////////////////////////////////////// 
     1949 
    17661950 
    17671951 
     
    18121996        Wave yCtr_pix = root:Packages:NIST:VSANS:Globals:Patch:yCtr_pix 
    18131997        Wave/T panelW = root:Packages:NIST:VSANS:Globals:Patch:panelW 
    1814                  
     1998         
     1999        // check the dimensions of the waves (9) 
     2000        if (DimSize(xCtr_pix, 0) != 9 || DimSize(yCtr_pix, 0) != 9 || DimSize(panelW, 0) != 9) 
     2001                Abort "waves are not of proper dimension (9)" 
     2002        endif 
     2003         
    18152004        //loop over all files 
    18162005        for(jj=lo;jj<=hi;jj+=1) 
     
    18692058 
    18702059Proc V_PatchDet_xyCenters_Panel() 
    1871         DoWindow/F Patch_Deadtime 
     2060        DoWindow/F Patch_XY_Panel 
    18722061        if(V_flag==0) 
    18732062         
     
    18842073 
    18852074 
    1886 // 
    1887 // TODO - document, make setVar controls larger, make cleaner 
    1888 // 
    1889 // TODO - link to main panel? link to Patch Panel? 
     2075// TODO: 
     2076// -- add method to read (import) from beam center panel 
     2077// x- check wave dimensions before writing (check for bad paste operation) 
     2078// -- load from file? different ways to import? 
     2079// -- add help button/file 
     2080// -- add done button 
     2081// -- adjust after user testing 
    18902082// 
    18912083Proc V_Patch_xyCtr_Panel() : Panel 
     
    18932085 
    18942086 
    1895         NewPanel /W=(600,400,1150,800)/N=Patch_XY_Panel/K=1 
     2087        NewPanel /W=(600,400,1150,800)/N=Patch_XY_Panel /K=1 
    18962088//      ShowTools/A 
    18972089         
    1898 //      PopupMenu popup_0,pos={20,20},size={109,20},title="Detector Panel" 
    1899 //      PopupMenu popup_0,mode=1,popvalue="FL",value= #"\"FL;FR;FT;FB;ML;MR;MT;MB;B;\"" 
    1900          
    1901         Button button0,pos={22.00,62.00},size={50.00,20.00},proc=V_ReadXYButtonProc,title="Read" 
    1902         Button button0_1,pos={95.00,62.00},size={50.00,20.00},proc=V_WriteXYButtonProc,title="Write" 
    1903         SetVariable setvar0,pos={19.00,128.00},size={100.00,14.00},title="first" 
     2090        ModifyPanel cbRGB=(16266,47753,2552,23355) 
     2091 
     2092        SetDrawLayer UserBack 
     2093        DrawText 85,99,"Current Values" 
     2094        DrawText 21,258,"Write to all files (inlcusive)" 
     2095        SetDrawEnv fsize= 14,fstyle= 1 
     2096        DrawText 262,30,"Beam Center (pixels)" 
     2097        DrawText 20,133,"Run Number(s)" 
     2098         
     2099        Button button0,pos={20,81},size={50.00,20.00},proc=V_ReadXYButtonProc,title="Read" 
     2100        Button button0_1,pos={20,220},size={50.00,20.00},proc=V_WriteXYButtonProc,title="Write" 
     2101        SetVariable setvar0,pos={20,141},size={100.00,14.00},title="first" 
    19042102        SetVariable setvar0,value= K0 
    1905         SetVariable setvar1,pos={20.00,154.00},size={100.00,14.00},title="last" 
     2103        SetVariable setvar1,pos={20.00,167},size={100.00,14.00},title="last" 
    19062104        SetVariable setvar1,value= K1 
    19072105 
     
    19092107        SetDataFolder root:Packages:NIST:VSANS:Globals:Patch 
    19102108// display the wave      
    1911         Edit/W=(180,40,480,350)/HOST=#  panelW,xCtr_pix,yCtr_pix 
     2109        Edit/W=(180,40,500,370)/HOST=#  panelW,xCtr_pix,yCtr_pix 
    19122110        ModifyTable width(Point)=0 
    19132111        ModifyTable width(panelW)=80 
Note: See TracChangeset for help on using the changeset viewer.