Ignore:
Timestamp:
Feb 25, 2019 3:17:03 PM (4 years ago)
Author:
srkline
Message:

multiple changes to improve the functionality of VCALC

more values are reported, and the IQ plot now accounts for a beam stop shadowing the low q region. Qmin and qmax values are reported for each panel. the beam intensity value is more realistic, with correct SSD values.

File:
1 edited

Legend:

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

    r1109 r1128  
    1919 
    2020 
    21 // returns the nominal SDD from the panel -- value is [cm] 
    22 // Does NOT include the setback of the T/B panels. This is a separate value 
    23 Function VCALC_getSDD(type) 
    24         String type 
    25          
    26         Variable sdd 
    27          
    28         strswitch(type)  
    29                 case "FL": 
    30                 case "FR":               
    31                         ControlInfo/W=VCALC VCALCCtrl_2d 
    32                         SDD = V_Value 
    33                         break 
    34                 case "FT": 
    35                 case "FB":               
    36                         ControlInfo/W=VCALC VCALCCtrl_2d 
    37                         SDD = V_Value    
    38                         break 
    39  
    40                 case "ML": 
    41                 case "MR":               
    42                         ControlInfo/W=VCALC VCALCCtrl_3d 
    43                         SDD = V_Value 
    44                         break 
    45                 case "MT": 
    46                 case "MB": 
    47                         ControlInfo/W=VCALC VCALCCtrl_3d 
    48                         SDD = V_Value 
    49                         break    
    50                                                  
    51                 case "B":                
    52                         ControlInfo/W=VCALC VCALCCtrl_4b 
    53                         SDD = V_Value 
    54                         break 
    55                          
    56                 default: 
    57                         Print "Error -- type not found in        V_getSDD(type)"                                         
    58                         sdd = NaN               //no match for type              
    59         endswitch 
    60          
    61         return(sdd) 
    62 end 
     21 
    6322 
    6423// returns the panel separation [cm] 
     
    12584end 
    12685 
     86// returns the wavelength spread from the panel -- value is fraction 
     87Function VCALC_getWavelengthSpread() 
     88         
     89        ControlInfo/W=VCALC VCALCCtrl_0d 
     90 
     91        return(V_Value) 
     92end 
     93 
    12794// returns the number of neutrons on the sample 
    12895Function VCALC_getImon() 
     
    153120        Variable pixSizeX = V_getDet_x_pixel_size("VCALC",type) 
    154121 
    155 //      SetDataFolder root:Packages:NIST:VSANS:VCALC 
    156 //                       
    157 //      strswitch(type)  
    158 //              case "FL": 
    159 //                      NVAR pixSizeX = gFront_L_pixelX 
    160 //                      break 
    161 //              case "FR":               
    162 //                      NVAR pixSizeX = gFront_R_pixelX 
    163 //                      break 
    164 //              case "FT": 
    165 //                      NVAR pixSizeX = gFront_T_pixelX 
    166 //                      break    
    167 //              case "FB":               
    168 //                      NVAR pixSizeX = gFront_B_pixelX 
    169 //                      break 
    170 //                       
    171 //              case "ML": 
    172 //                      NVAR pixSizeX = gMiddle_L_pixelX 
    173 //                      break 
    174 //              case "MR":               
    175 //                      NVAR pixSizeX = gMiddle_R_pixelX 
    176 //                      break 
    177 //              case "MT": 
    178 //                      NVAR pixSizeX = gMiddle_T_pixelX 
    179 //                      break    
    180 //              case "MB":               
    181 //                      NVAR pixSizeX = gMiddle_B_pixelX 
    182 //                      break 
    183 //                                               
    184 //              case "B":                
    185 //                      NVAR pixSizeX = gBack_pixelX 
    186 //                      break 
    187 //                       
    188 //              default:                                                         
    189 //                      Print "Detector type mismatch in        V_getPixSizeX(type)" 
    190 //                      setDataFolder root: 
    191 //                      return(NaN) 
    192 //      endswitch 
    193 // 
    194 //      setDataFolder root: 
    195                  
    196122        return(pixSizeX) 
    197123end 
     
    203129        Variable pixSizeY = V_getDet_y_pixel_size("VCALC",type) 
    204130         
    205 //      SetDataFolder root:Packages:NIST:VSANS:VCALC 
    206 //                       
    207 //      strswitch(type)  
    208 //              case "FL": 
    209 //                      NVAR pixSizeY = gFront_L_pixelY 
    210 //                      break 
    211 //              case "FR":               
    212 //                      NVAR pixSizeY = gFront_R_pixelY 
    213 //                      break 
    214 //              case "FT": 
    215 //                      NVAR pixSizeY = gFront_T_pixelY 
    216 //                      break    
    217 //              case "FB":               
    218 //                      NVAR pixSizeY = gFront_B_pixelY 
    219 //                      break 
    220 //                       
    221 //              case "ML": 
    222 //                      NVAR pixSizeY = gMiddle_L_pixelY 
    223 //                      break 
    224 //              case "MR":               
    225 //                      NVAR pixSizeY = gMiddle_R_pixelY 
    226 //                      break 
    227 //              case "MT": 
    228 //                      NVAR pixSizeY = gMiddle_T_pixelY 
    229 //                      break    
    230 //              case "MB":               
    231 //                      NVAR pixSizeY = gMiddle_B_pixelY 
    232 //                      break 
    233 //                                               
    234 //              case "B":                
    235 //                      NVAR pixSizeY = gBack_pixelY 
    236 //                      break 
    237 //                       
    238 //              default:                                                         
    239 //                      Print "Detector type mismatch in        V_getPixSizeY(type)" 
    240 //                      SetDataFolder root: 
    241 //                      return(NaN) 
    242 //      endswitch 
    243 // 
    244 //      setDatafolder root: 
    245                  
    246131        return(pixSizeY) 
    247132end 
     
    254139        Variable nPix = V_getDet_pixel_num_x("VCALC",type) 
    255140         
    256 //      SetDataFolder root:Packages:NIST:VSANS:VCALC 
    257 //                       
    258 //      strswitch(type)  
    259 //              case "FL": 
    260 //                      NVAR nPix = gFront_L_nPix_X 
    261 //                      break 
    262 //              case "FR":               
    263 //                      NVAR nPix = gFront_R_nPix_X 
    264 //                      break 
    265 //              case "FT": 
    266 //                      NVAR nPix = gFront_T_nPix_X 
    267 //                      break    
    268 //              case "FB":               
    269 //                      NVAR nPix = gFront_B_nPix_X 
    270 //                      break 
    271 //                       
    272 //              case "ML": 
    273 //                      NVAR nPix = gMiddle_L_nPix_X 
    274 //                      break 
    275 //              case "MR":               
    276 //                      NVAR nPix = gMiddle_R_nPix_X 
    277 //                      break 
    278 //              case "MT": 
    279 //                      NVAR nPix = gMiddle_T_nPix_X 
    280 //                      break    
    281 //              case "MB":               
    282 //                      NVAR nPix = gMiddle_B_nPix_X 
    283 //                      break 
    284 //                                               
    285 //              case "B":                
    286 //                      NVAR nPix = gBack_nPix_X 
    287 //                      break 
    288 //                       
    289 //              default:                                                         
    290 //                      Print "Detector type mismatch in        VCALC_get_nPix_X(type)" 
    291 //                      SetDataFolder root: 
    292 //                      return(NaN) 
    293 //      endswitch 
    294 // 
    295 //      setDataFolder root: 
    296                  
    297141        return(nPix) 
    298142end 
     
    304148        Variable nPix = V_getDet_pixel_num_y("VCALC",type) 
    305149 
    306 //      SetDataFolder root:Packages:NIST:VSANS:VCALC 
    307 //                       
    308 //      strswitch(type)  
    309 //              case "FL": 
    310 //                      NVAR nPix = gFront_L_nPix_Y 
    311 //                      break 
    312 //              case "FR":               
    313 //                      NVAR nPix = gFront_R_nPix_Y 
    314 //                      break 
    315 //              case "FT": 
    316 //                      NVAR nPix = gFront_T_nPix_Y 
    317 //                      break    
    318 //              case "FB":               
    319 //                      NVAR nPix = gFront_B_nPix_Y 
    320 //                      break 
    321 //                       
    322 //              case "ML": 
    323 //                      NVAR nPix = gMiddle_L_nPix_Y 
    324 //                      break 
    325 //              case "MR":               
    326 //                      NVAR nPix = gMiddle_R_nPix_Y 
    327 //                      break 
    328 //              case "MT": 
    329 //                      NVAR nPix = gMiddle_T_nPix_Y 
    330 //                      break    
    331 //              case "MB":               
    332 //                      NVAR nPix = gMiddle_B_nPix_Y 
    333 //                      break 
    334 //                                               
    335 //              case "B":                
    336 //                      NVAR nPix = gBack_nPix_Y 
    337 //                      break 
    338 //                       
    339 //              default:                                                         
    340 //                      Print "Detector type mismatch in        VCALC_get_nPix_Y(type)" 
    341 //                      SetDataFolder root: 
    342 //                      return(NaN) 
    343 //      endswitch 
    344 // 
    345 //      SetDataFolder root: 
    346                  
    347150        return(nPix) 
    348151end 
     
    380183                                                 
    381184                case "B": 
     185                case "B ": 
    382186                        SetDataFolder root: 
    383187                        return(0) 
     
    402206////////////////////////////////// 
    403207 
    404 // read the number of guides from the slider 
    405 // return the Source to Sample Distance in [cm] 
     208// get the sourceAperture_to_GateValve distance from the table 
     209// 
     210// correct for the sampleAperture_to_GateValve distance 
     211// 
     212// return the SourceAp to SampleAp Distance in [cm] 
    406213Function VC_calcSSD() 
    407214 
    408         Variable ng,ssd 
    409         ControlInfo VCALCCtrl_0a 
     215        Variable ng,ssd,samAp_to_GV 
     216        ControlInfo/W=VCALC VCALCCtrl_0a 
    410217        ng = V_Value 
    411          
    412         ssd = 2388 - ng*200 
    413         print "SSD (cm) = ",ssd 
     218 
     219        ControlInfo/W=VCALC VCALCCtrl_1d 
     220        samAp_to_GV = V_Value           // [cm] 
     221         
     222        switch(ng) 
     223                case 0: 
     224                                ssd = 2441 
     225                        break 
     226                case 1: 
     227                                ssd = 2157 
     228                        break 
     229                case 2: 
     230                                ssd = 1976 
     231                        break 
     232                case 3: 
     233                                ssd = 1782 
     234                        break                    
     235                case 4: 
     236                                ssd = 1582 
     237                        break                    
     238                case 5: 
     239                                ssd = 1381 
     240                        break                    
     241                case 6: 
     242                                ssd = 1181 
     243                        break                    
     244                case 7: 
     245                                ssd = 980 
     246                        break                    
     247                case 8: 
     248                                ssd = 780 
     249                        break                    
     250                case 9: 
     251                                ssd = 579 
     252                        break                    
     253                default: 
     254                        Print "Error - using default SSD value" 
     255                        ssd = 2441 
     256        endswitch 
     257        ssd -= samAp_to_GV 
     258         
     259//      print "SSD (cm) = ",ssd 
    414260        return(ssd) 
    415261End 
     
    422268 
    423269        Variable ng,a1 
    424         ControlInfo VCALCCtrl_0a 
     270        ControlInfo/W=VCALC VCALCCtrl_0a 
    425271        ng = V_Value 
    426          
    427         a1 = 6          // 60 mm diameter 
    428  
    429         Print "Source Ap diam (cm) = ",a1 
     272 
     273        ControlInfo/W=VCALC VCALCCtrl_0f 
     274        String apStr = S_Value 
     275         
     276 
     277        if(ng > 0)       
     278                a1 = 6          // 60 mm diameter 
     279        else 
     280                sscanf apStr, "%g cm", a1 
     281        endif 
     282 
     283//      Print "Source Ap diam (cm) = ",a1 
    430284        return(a1) 
    431285End 
    432286 
    433  
    434  
     287// reports tha value in [cm] 
     288Function VC_sampleApertureDiam() 
     289 
     290        ControlInfo/W=VCALC VCALCCtrl_1c 
     291        Variable val = str2num(S_Value) 
     292 
     293        return(val) 
     294End 
    435295/////////////////// 
    436296// 
     
    468328 
    469329        // middle carriage 
    470         SetVariable VCALCCtrl_3a,value=_NUM:0           //Left offset 
    471         SetVariable VCALCCtrl_3aa,value=_NUM:0          //Right offset 
     330        SetVariable VCALCCtrl_3a,value=_NUM:-10         //Left offset 
     331        SetVariable VCALCCtrl_3aa,value=_NUM:-10                //Right offset 
    472332        SetVariable VCALCCtrl_3b,value=_NUM:4                   //Top offset (doesn't matter) 
    473333        SetVariable VCALCCtrl_3bb,value=_NUM:-4         //Bottom offset (doesn't matter) 
     
    570430end 
    571431 
     432// calculates L2, the sample aperture to detector distance 
     433Function VC_calc_L2(detStr) 
     434        String detStr 
     435 
     436        Variable a2_to_GV,sam_to_GV,sdd,l2 
     437        sdd = VC_getSDD(detStr)                 //sample pos to detector 
     438        ControlInfo VCALCCtrl_1d 
     439        a2_to_GV = V_Value 
     440        ControlInfo VCALCCtrl_1e 
     441        sam_to_GV = V_Value 
     442        l2 = sdd - sam_to_GV + a2_to_GV 
     443         
     444        return(l2) 
     445End 
    572446 
    573447// 
     
    578452// 
    579453// returns a value in [cm] 
    580 Function VC_beamDiameter(direction,carrNum) 
     454Function VC_beamDiameter(direction,detStr) 
    581455        String direction 
    582         Variable carrNum 
     456        String detStr 
    583457 
    584458//      NVAR lens = root:Packages:NIST:SAS:gUsingLenses 
     
    591465        Variable lambda,lambda_width,bs_factor 
    592466     
    593 //    NVAR L2diff = root:Packages:NIST:SAS:L2diff 
    594  
    595 // TODO: proper value for l2Diff, bs_factor 
    596         l2Diff = 0 
     467// TODO: proper value for bs_factor 
    597468        bs_factor = 1.05 
    598469         
    599470        l1 = VC_calcSSD() 
    600471        lambda = VCALC_getWavelength() 
    601         ControlInfo VCALCCtrl_0d 
    602         lambda_width = str2num(S_Value) 
    603          
    604          
    605         l2 = VC_getSDD(carrNum) + L2diff 
    606      
     472        lambda_width = VCALC_getWavelengthSpread() 
     473         
     474         
     475        Variable a2_to_GV,sam_to_GV,sdd 
     476        sdd = VC_getSDD(detStr)                 //sample pos to detector 
     477        ControlInfo VCALCCtrl_1d 
     478        a2_to_GV = V_Value 
     479        ControlInfo VCALCCtrl_1e 
     480        sam_to_GV = V_Value 
     481        l2 = sdd - sam_to_GV + a2_to_GV 
     482    
     483    
    607484    // TODO verify that these values are in cm 
    608485        a1 = VC_sourceApertureDiam() 
     
    642519// 3=back 
    643520// return value is in cm 
    644 Function VC_getSDD(carrNum) 
    645         Variable carrNum 
    646          
    647         if(carrNum == 1) 
    648                 ControlInfo VCALCCtrl_2d 
    649         endif 
    650         if(carrNum == 2) 
    651                 ControlInfo VCALCCtrl_3d 
    652         endif 
    653         if(carrNum == 3) 
    654                 ControlInfo VCALCCtrl_4b 
    655         endif 
    656          
    657         return(V_Value) 
    658 end 
    659          
    660  
    661 // these are numbers from NG3, when it was a SANS instrument 
    662 //       
    663 // updated with new flux numbers from John Barker 
    664 // NG3 - Feb 2009 
    665 // NG7 - July 2009 
    666 // 
    667 // guide loss has been changed to 0.95 rather than the old value of 0.95 
    668 // 
    669 // other values are changed in the initialization routines 
     521// actual Sample position to detector distance is reported 
     522// Top/Bottom setback is included 
     523Function VC_getSDD(detStr) 
     524        String detStr 
     525         
     526        Variable sdd 
     527 
     528        strswitch(detstr) 
     529                case "B": 
     530                case "B ": 
     531                        ControlInfo VCALCCtrl_4b 
     532                        break 
     533                case "ML": 
     534                case "MR": 
     535                case "MT": 
     536                case "MB": 
     537                        ControlInfo VCALCCtrl_3d 
     538                        break 
     539                case "FL": 
     540                case "FR": 
     541                case "FT": 
     542                case "FB": 
     543                        ControlInfo VCALCCtrl_2d 
     544                        break            
     545                default: 
     546                        Print "no case matched in VC_getSDD()" 
     547        endswitch 
     548 
     549        // this is gate valve to detector distance 
     550        sdd = V_Value 
     551         
     552        sdd += VCALC_getTopBottomSDDSetback(detStr) 
     553         
     554        // VCALCCtrl_1e is Sample Pos to Gate Valve (cm) 
     555        ControlInfo VCALCCtrl_1e 
     556        sdd += V_Value 
     557         
     558        return(sdd) 
     559end 
     560         
     561 
     562// TODO 
     563// -- verify all of the numbers, constants, and "empirical" transmission corrections 
     564// -- 
    670565// 
    671566Function V_beamIntensity() 
    672567 
    673         Variable alpha,f,t,t4,t5,t6,as,solid_angle,l1,d2_phi 
     568        Variable as,solid_angle,l1,d2_phi 
    674569        Variable a1,a2,retVal 
    675         Variable l_gap,guide_width,ng 
    676         Variable lambda_t,b,c 
    677         Variable lambda,t1,t2,t3,phi_0 
     570        Variable ng 
     571        Variable lambda_t 
     572        Variable lambda,phi_0 
    678573        Variable lambda_width 
    679         Variable guide_loss 
     574        Variable guide_loss,t_guide,t_filter,t_total,t_special 
    680575 
    681576        NVAR gBeamInten = root:Packages:NIST:VSANS:VCALC:gBeamIntensity 
    682  
    683577  
    684578// TODO 
    685 // these are numbers from NG3, when it was a SANS instrument 
    686          
    687         lambda_t = 5.50 
    688  
    689         t1 = 0.63 
    690         t2 = 1.0 
    691         t3 = 0.75 
    692         l_gap = 100.0 
    693         guide_width = 6.0 
    694   
    695         //new values, from 11/2009 --- BeamFluxReport_2009.ifn 
    696         phi_0 = 2.42e13 
    697         b = 0.0 
    698         c = -0.0243 
    699         guide_loss = 0.924 
    700           
    701           
    702           
     579// -- verify these numbers 
     580        lambda_t = 6.20 
     581        phi_0 = 1.82e13 
     582        guide_loss = 0.97 
     583        t_special = 1 
     584 
    703585        ControlInfo VCALCCtrl_0a 
    704586        ng = V_Value 
    705587  
    706588        lambda = VCALC_getWavelength() 
    707         ControlInfo VCALCCtrl_0d 
    708         lambda_width = str2num(S_Value) 
    709   
    710      
     589        lambda_width = VCALC_getWavelengthSpread() 
    711590        l1 = VC_calcSSD() 
    712591     
     
    718597        a2 = V_Value 
    719598     
    720      
    721         alpha = (a1+a2)/(2*l1)  //angular divergence of beam 
    722         f = l_gap*alpha/(2*guide_width) 
    723         t4 = (1-f)*(1-f) 
    724         t5 = exp(ng*ln(guide_loss))     // trans losses of guides in pre-sample flight 
    725         t6 = 1 - lambda*(b-(ng/8)*(b-c))                //experimental correction factor 
    726         t = t1*t2*t3*t4*t5*t6 
     599//      alpha = (a1+a2)/(2*l1)  //angular divergence of beam 
     600//      f = l_gap*alpha/(2*guide_width) 
     601//      t4 = (1-f)*(1-f) 
     602//      t6 = 1 - lambda*(b-(ng/8)*(b-c))                //experimental correction factor 
     603 
     604        t_guide = exp(ng*ln(guide_loss))        // trans losses of guides in pre-sample flight 
     605        t_filter = exp(-0.371 - 0.0305*lambda - 0.00352*lambda*lambda) 
     606        t_total = t_special*t_guide*t_filter 
     607 
    727608     
    728609        as = pi/4*a2*a2         //area of sample in the beam 
     
    733614        solid_angle = pi/4* (a1/l1)*(a1/l1) 
    734615 
    735         retVal = as * d2_phi * lambda_width * solid_angle * t 
     616        retVal = as * d2_phi * lambda_width * solid_angle * t_total 
    736617 
    737618        // set the global for display 
    738619        gBeamInten = retVal 
     620         
    739621        return (retVal) 
    740622end 
     
    750632 
    751633// return a beamstop diameter (cm) larger than maximum beam dimension 
    752 Function VC_beamstopDiam(carrNum) 
    753         Variable carrNum 
     634Function VC_beamstopDiam(detStr) 
     635        String detStr 
    754636         
    755637        Variable bm=0 
     
    761643                bs = 1                                                          //force the diameter to 1" 
    762644        else 
    763                 bm = VC_beamDiameter("maximum",carrNum) 
     645                bm = VC_beamDiameter("maximum",detStr) 
    764646                do 
    765647                bs += 1 
     
    770652End 
    771653 
    772  
     654// multiply the appropriate IQ data by the beamstop shadow factor for display 
     655// 
     656Function V_IQ_BeamstopShadow() 
     657 
     658        String popStr 
     659        Variable binType 
     660         
     661        ControlInfo/W=VCALC popup_b 
     662        popStr = S_Value         
     663 
     664        binType = V_BinTypeStr2Num(popStr)       
     665         
     666        String folderStr = "root:Packages:NIST:VSANS:VCALC:" 
     667         
     668 
     669        String extStr ="" 
     670         
     671        switch(binType) 
     672                case 1: 
     673                        extStr = ksBinType1              
     674 
     675                        break 
     676                case 2: 
     677                        extStr = ksBinType2              
     678 
     679                        break 
     680                case 3: 
     681                        extStr = ksBinType3      
     682                         
     683                        break 
     684                case 4:                         /// this is for a tall, narrow slit mode         
     685                        extStr = ksBinType4 
     686 
     687                        break 
     688                case 5: 
     689                        extStr = ksBinType5      
     690                 
     691                        break 
     692                case 6: 
     693                        extStr = ksBinType6      
     694                 
     695                        break 
     696                case 7: 
     697                        extStr = ksBinType7      
     698                 
     699                        break 
     700                         
     701                default: 
     702                        Abort "Binning mode not found in V_IQ_BeamstopShadow"// when no case matches     
     703        endswitch 
     704 
     705 
     706//      root:Packages:NIST:VSANS:VCALC:fSubS_qxqy_MLR 
     707//      root:Packages:NIST:VSANS:VCALC:iBin_qxqy_MLR 
     708         
     709        Variable ii 
     710        String ext 
     711//      loop over all of the types of data 
     712        for(ii=0;ii<ItemsInList(extStr);ii+=1) 
     713                ext = StringFromList(ii, extStr, ";") 
     714                Wave iq = $(folderStr+"iBin_qxqy_"+ext) 
     715                Wave fs = $(folderStr+"fSubS_qxqy_"+ext) 
     716                iq = (fs < 0.1) ? iq*0.1 : iq*fs 
     717//              iq *= fs 
     718        endfor   
     719         
     720        return(0) 
     721end 
Note: See TracChangeset for help on using the changeset viewer.