Ignore:
Timestamp:
Jun 21, 2018 9:42:24 AM (4 years ago)
Author:
srkline
Message:

changes mostly to VCALC to add in what bits of information I have about the instrument dimensions. Added in stubs (based on NG3 SANS) for the beam intensity. Added in a preset condition for Front+Middle. Still need a more uniform way to do this.

File:
1 edited

Legend:

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

    r1081 r1108  
    395395 
    396396 
    397 /////////// procedure to concatenate I(q) files into a single file 
    398 // 
    399 // currently, no rescaling is done, no trimming is done, just crude concatentate and sort 
    400 // 
     397 
     398////////////////////////////////// 
     399// 
     400// Actions for the VCALC controls 
     401// 
     402////////////////////////////////// 
     403 
     404// read the number of guides from the slider 
     405// return the Source to Sample Distance in [cm] 
     406Function VC_calcSSD() 
     407 
     408        Variable ng,ssd 
     409        ControlInfo VCALCCtrl_0a 
     410        ng = V_Value 
     411         
     412        ssd = 2388 - ng*200 
     413        print "SSD (cm) = ",ssd 
     414        return(ssd) 
     415End 
     416 
     417 
     418// read the number of guides from the slider 
     419// return the Source aperture diameter [cm] 
     420// TODO - needs a case statement since a1 can depend on Ng 
     421Function VC_sourceApertureDiam() 
     422 
     423        Variable ng,a1 
     424        ControlInfo VCALCCtrl_0a 
     425        ng = V_Value 
     426         
     427        a1 = 6          // 60 mm diameter 
     428 
     429        Print "Source Ap diam (cm) = ",a1 
     430        return(a1) 
     431End 
     432 
     433 
     434 
     435/////////////////// 
     436// 
     437// Presets 
     438// 
     439/////////////////// 
     440 
     441 
     442// for Front+Middle Only 
     443// x F SDD=120 
     444// x (L=-20, R=20) (T=4, B=-4) 
     445// 
     446// x M SDD = 1900 
     447// x (L=0, R=0) 
     448// 
     449// x Velocity selector 
     450// x Ng = 0 
     451// x Lam = 8 
     452// x delLam = 0.12 
     453// source ap = ? (circular) 
     454// 
     455// ignore back detector 
     456// x set plot type to F2-M2xTB-B 
     457// 
     458//  
     459Function VC_FrontMiddlePreset() 
     460 
     461        // front carriage 
     462        SetVariable VCALCCtrl_2a,value=_NUM:-20         //Left offset 
     463        SetVariable VCALCCtrl_2aa,value=_NUM:20         //Right offset 
     464        SetVariable VCALCCtrl_2b,value=_NUM:4                   //Top offset 
     465        SetVariable VCALCCtrl_2bb,value=_NUM:-4         //Bottom offset 
     466 
     467        SetVariable VCALCCtrl_2d,value=_NUM:120         //SDD 
     468 
     469        // middle carriage 
     470        SetVariable VCALCCtrl_3a,value=_NUM:0           //Left offset 
     471        SetVariable VCALCCtrl_3aa,value=_NUM:0          //Right offset 
     472        SetVariable VCALCCtrl_3b,value=_NUM:4                   //Top offset (doesn't matter) 
     473        SetVariable VCALCCtrl_3bb,value=_NUM:-4         //Bottom offset (doesn't matter) 
     474 
     475        SetVariable VCALCCtrl_3d,value=_NUM:1900                //SDD 
     476         
     477         
     478        // monochromator 
     479        PopupMenu VCALCCtrl_0c,mode=1,popvalue="Velocity Selector" 
     480         
     481        // wavelength spread 
     482        SVAR DLStr = root:Packages:NIST:VSANS:VCALC:gDeltaLambda 
     483        DLStr = "0.12;" 
     484        PopupMenu VCALCCtrl_0d,mode=1,popvalue="0.12",value= root:Packages:NIST:VSANS:VCALC:gDeltaLambda 
     485         
     486        // wavelength 
     487        SetVariable VCALCCtrl_0b,value=_NUM:8,disable=0 ,noedit=0       // allow user editing again 
     488 
     489        //number of guides 
     490        Slider VCALCCtrl_0a,value= 0 
     491 
     492 
     493// binning mode 
     494        PopupMenu popup_b,mode=1,popValue="F2-M2xTB-B" 
     495 
     496 
     497        return(0) 
     498End 
     499 
     500// 
     501//direction = one of "vertical;horizontal;maximum;" 
     502// all of this is bypassed if the lenses are in 
     503// 
     504// carrNum = 1,2,3 for F,M,B 
     505// 
     506// returns a value in [cm] 
     507Function VC_beamDiameter(direction,carrNum) 
     508        String direction 
     509        Variable carrNum 
     510 
     511//      NVAR lens = root:Packages:NIST:SAS:gUsingLenses 
     512//      if(lens) 
     513//              return sourceApertureDiam() 
     514//      endif 
     515         
     516        Variable l1,l2,l2Diff 
     517        Variable d1,d2,bh,bv,bm,umbra,a1,a2 
     518        Variable lambda,lambda_width,bs_factor 
     519     
     520//    NVAR L2diff = root:Packages:NIST:SAS:L2diff 
     521 
     522// TODO: proper value for l2Diff, bs_factor 
     523        l2Diff = 0 
     524        bs_factor = 1.05 
     525         
     526        l1 = VC_calcSSD() 
     527        lambda = VCALC_getWavelength() 
     528        ControlInfo VCALCCtrl_0d 
     529        lambda_width = str2num(S_Value) 
     530         
     531         
     532        l2 = VC_getSDD(carrNum) + L2diff 
     533     
     534    // TODO verify that these values are in cm 
     535        a1 = VC_sourceApertureDiam() 
     536     
     537        // sample aperture diam [cm] 
     538        ControlInfo VCALCCtrl_1c 
     539        a2 = V_Value 
     540     
     541    d1 = a1*l2/l1 
     542    d2 = a2*(l1+l2)/l1 
     543    bh = d1+d2          //beam size in horizontal direction 
     544    umbra = abs(d1-d2) 
     545    //vertical spreading due to gravity 
     546    bv = bh + 1.25e-8*(l1+l2)*l2*lambda*lambda*lambda_width 
     547    bm = (bs_factor*bh > bv) ? bs_factor*bh : bv //use the larger of horiz*safety or vertical 
     548     
     549    strswitch(direction)        // string switch 
     550        case "vertical":                // execute if case matches expression 
     551                return(bv) 
     552                break                                           // exit from switch 
     553        case "horizontal":              // execute if case matches expression 
     554                return(bh) 
     555                break 
     556        case "maximum":         // execute if case matches expression 
     557                return(bm) 
     558                break 
     559        default:                                                        // optional default expression executed 
     560                return(bm)                                              // when no case matches 
     561    endswitch 
     562     
     563    return(0) 
     564     
     565End 
     566 
     567// 1=front 
     568// 2=middle 
     569// 3=back 
     570// return value is in cm 
     571Function VC_getSDD(carrNum) 
     572        Variable carrNum 
     573         
     574        if(carrNum == 1) 
     575                ControlInfo VCALCCtrl_2d 
     576        endif 
     577        if(carrNum == 2) 
     578                ControlInfo VCALCCtrl_3d 
     579        endif 
     580        if(carrNum == 3) 
     581                ControlInfo VCALCCtrl_4b 
     582        endif 
     583         
     584        return(V_Value) 
     585end 
     586         
     587 
     588// these are numbers from NG3, when it was a SANS instrument 
     589//       
     590// updated with new flux numbers from John Barker 
     591// NG3 - Feb 2009 
     592// NG7 - July 2009 
     593// 
     594// guide loss has been changed to 0.95 rather than the old value of 0.95 
     595// 
     596// other values are changed in the initialization routines 
     597// 
     598Function beamIntensity() 
     599 
     600        Variable alpha,f,t,t4,t5,t6,as,solid_angle,l1,d2_phi 
     601        Variable a1,a2,retVal 
     602        Variable l_gap,guide_width,ng 
     603        Variable lambda_t,b,c 
     604        Variable lambda,t1,t2,t3,phi_0 
     605        Variable lambda_width 
     606        Variable guide_loss 
     607 
     608        NVAR gBeamInten = root:Packages:NIST:VSANS:VCALC:gBeamIntensity 
     609 
     610  
    401611// TODO 
    402 // -- all of this needs to be done. There's nothing here... 
    403 // 
    404  
    405  
    406  
    407  
     612// these are numbers from NG3, when it was a SANS instrument 
     613         
     614        lambda_t = 5.50 
     615 
     616        t1 = 0.63 
     617        t2 = 1.0 
     618        t3 = 0.75 
     619        l_gap = 100.0 
     620        guide_width = 6.0 
     621  
     622        //new values, from 11/2009 --- BeamFluxReport_2009.ifn 
     623        phi_0 = 2.42e13 
     624        b = 0.0 
     625        c = -0.0243 
     626        guide_loss = 0.924 
     627          
     628          
     629          
     630        ControlInfo VCALCCtrl_0a 
     631        ng = V_Value 
     632  
     633        lambda = VCALC_getWavelength() 
     634        ControlInfo VCALCCtrl_0d 
     635        lambda_width = str2num(S_Value) 
     636  
     637     
     638        l1 = VC_calcSSD() 
     639     
     640    // TODO verify that these values are in cm 
     641        a1 = VC_sourceApertureDiam() 
     642     
     643        // sample aperture diam [cm] 
     644        ControlInfo VCALCCtrl_1c 
     645        a2 = V_Value 
     646     
     647     
     648        alpha = (a1+a2)/(2*l1)  //angular divergence of beam 
     649        f = l_gap*alpha/(2*guide_width) 
     650        t4 = (1-f)*(1-f) 
     651        t5 = exp(ng*ln(guide_loss))     // trans losses of guides in pre-sample flight 
     652        t6 = 1 - lambda*(b-(ng/8)*(b-c))                //experimental correction factor 
     653        t = t1*t2*t3*t4*t5*t6 
     654     
     655        as = pi/4*a2*a2         //area of sample in the beam 
     656        d2_phi = phi_0/(2*pi) 
     657        d2_phi *= exp(4*ln(lambda_t/lambda)) 
     658        d2_phi *= exp(-1*(lambda_t*lambda_t/lambda/lambda)) 
     659 
     660        solid_angle = pi/4* (a1/l1)*(a1/l1) 
     661 
     662        retVal = as * d2_phi * lambda_width * solid_angle * t 
     663 
     664        // set the global for display 
     665        gBeamInten = retVal 
     666        return (retVal) 
     667end 
     668 
     669// 
     670Function VC_figureOfMerit() 
     671 
     672        Variable bi = beamIntensity() 
     673        Variable lambda = VCALC_getWavelength() 
     674         
     675   return (lambda*lambda*bi) 
     676End 
     677 
     678// return a beamstop diameter (cm) larger than maximum beam dimension 
     679Function VC_beamstopDiam(carrNum) 
     680        Variable carrNum 
     681         
     682        Variable bm=0 
     683        Variable bs=0.0 
     684   Variable yesLens=0 
     685    
     686        if(yesLens) 
     687                //bm = sourceApertureDiam()             //ideal result, not needed 
     688                bs = 1                                                          //force the diameter to 1" 
     689        else 
     690                bm = VC_beamDiameter("maximum",carrNum) 
     691                do 
     692                bs += 1 
     693           while ( (bs*2.54 < bm) || (bs > 30.0))                       //30 = ridiculous limit to avoid inf loop 
     694        endif 
     695 
     696        return (bs*2.54)                //return diameter in cm, not inches for txt 
     697End 
     698 
     699 
Note: See TracChangeset for help on using the changeset viewer.