/******************************************************************************* * Instrument: ESS_butterfly_test * * %I * Written by: Peter Willendrup * Date: 2016-08-24 * Origin: ESS * Release: McStas 2.4 * Version: 0.1 * %INSTRUMENT_SITE: ESS * * Test instrument for the updated BF1 butterfly moderator design * * %D * Test instrument for the updated BF1 butterfly moderator design. * * The below example gives a 50-50 (statistics-wise) cold/thermal beam at beamline N10. * Example: mcrun -n1e6 ESS_butterfly_test.instr sector=N beamline=10 cold=0.5 * * Was used to generate MCNP benchmarked output for the ESS_butterfly.comp - see * http://ess_butterfly.mcstas.org * * %P * sector: [str] Defines the 'sector' of your instrument position. Valid values are "N","S","E" and "W" * beamline: [1] Defines the 'beamline number' of your instrument position. Valid values are 1..10 or 1..11 depending on sector * Lmin: [AA] Minimum wavelength simulated * Lmax: [AA] Maximum wavelength simulated * c_performance: [1] Cold brilliance scalar performance multiplicator c_performance > 0 * t_performance: [1] Thermal brilliance scalar performance multiplicator t_performance > 0 * index: [1] Target index for source focusing. Defaults to illuminate the "cold collimated" brilliance monitor, thereby suppressing "dist" * dist: [m] Distance from origin to focusing rectangle; at (0,0,dist) - alternatively use target_index * cold: [1] Defines the statistical fraction of events emitted from the cold part of the moderator * Yheight: [m] Defines the moderator height. Valid values are 0.03 m and 0.06 m * delta: [m] Parameter that allows to scan "collimator" position * * %L * * Benchmarking website available at http://ess_butterfly.mcstas.org * %E *******************************************************************************/ DEFINE INSTRUMENT ESS_butterfly_test(string sector="N",beamline=1,Lmin=0.2,Lmax=20,c_performance=1,t_performance=1,int index=8,dist=0,cold=1,Yheight=0.03,delta=0) DECLARE %{ int IsCold; double SrcX, SrcY, SrcZ; double Theta; double MonTransl; double XW, YH; char options1[256],options2[256],options3[256],options4[256]; char srcdef[128]; double WidthC=0.072,WidthT=0.108; double WL; double lambdamin, lambdamax; double CCold,CThermal; double SurfSign; double TCollmin; double TCollmax; double Emin,Emax; double EminTh=20, EmaxTh=100, EminC=0, EmaxC=20; double Eneutron; %} INITIALIZE %{ lambdamin=Lmin; lambdamax=Lmax; XW=1.05*(WidthC+2*WidthT); YH=1.05*Yheight; sprintf(options1,"user1 bins=201 limits=[-%g,%g]",XW/2,XW/2); sprintf(options4,"user1 bins=201 limits=[-%g,%g]",YH/2,YH/2); sprintf(options2,"user1 bins=201 limits=[-%g,%g], user2 bins=201 limits=[-%g,%g]",XW/2,XW/2,YH/2,YH/2); sprintf(options3,"user1 bins=201 limits=[-%g,%g], user2 bins=201 limits=[-%g,%g]",1.05*(WidthC/2),1.05*(WidthC/2),1.05*Yheight/2,1.05*Yheight/2); sprintf(srcdef,"2015"); if (beamline==1) { TCollmin=0; TCollmax=0.058; } else if (beamline==2) { TCollmin=0; TCollmax=0.06; } else { TCollmin=0.011; TCollmax=0.071; } %} TRACE COMPONENT origin = Progress_bar() AT (0, 0, 0) RELATIVE ABSOLUTE /* Focusing for this use of the source is a little unphysical: 1x1cm @ 1m ~ 1e-4 steradian. To be useful in a "proper" instrument, you should of course illuminate your beamport fully!*/ COMPONENT Source = ESS_butterfly(sector=sector,beamline=beamline,Lmin=Lmin,Lmax=Lmax,c_performance=c_performance,t_performance=t_performance,dist=dist,target_index=index,cold_frac=cold, yheight=Yheight, focus_xw=0.01, focus_yh=0.01) AT (0,0,0) ABSOLUTE EXTEND %{ /* Various logical flags for measuring brilliances etc. below */ IsCold=iscold; SurfSign=surf_sign; SrcX=x;SrcY=y;SrcZ=z; WL=lambda; CCold=cos_cold; CThermal=cos_thermal; Eneutron=VS2E*(vx*vx + vy*vy + vz*vz); if (IsCold) { Emin=EminC;Emax=EmaxC; } else { Emin=EminTh;Emax=EmaxTh; } %} /* These arms are just to ensure we get a good view of the monolith */ COMPONENT Arm1 = Arm() AT (0,0,2) RELATIVE ABSOLUTE COMPONENT Arm2 = Arm() AT (0,0,3.5) RELATIVE ABSOLUTE /* Measures the horizontal emmision coordinate of all neutrons - gives the "apparent width" of the moderators as seen from the beamline */ COMPONENT MonND1 = Monitor_nD(xwidth=XW, yheight=YH, user1=SrcX, username1="Horizontal position / [m]", options=options1, restore_neutron=1) WHEN(Eneutron<=Emax && Eneutron>=Emin) AT (0, 0, 1) RELATIVE Source /* Measures the horizontal emmision coordinate of all neutrons - gives the "apparent width" of the moderators as seen from the beamline */ COMPONENT CWidth = Monitor_nD(xwidth=XW, yheight=YH, user1=SrcX, username1="Horizontal position / [m]", options=options1, restore_neutron=1) WHEN(Eneutron<=EmaxC && Eneutron>=EminC) AT (0, 0, 1) RELATIVE Source /* Measures the horizontal emmision coordinate of all neutrons - gives the "apparent width" of the moderators as seen from the beamline */ COMPONENT TWidth = Monitor_nD(xwidth=XW, yheight=YH, user1=SrcX, username1="Horizontal position / [m]", options=options1, restore_neutron=1) WHEN(Eneutron<=EmaxTh && Eneutron>=EminTh) AT (0, 0, 1) RELATIVE Source /* Measures the vertical emmision coordinate of cold neutrons */ COMPONENT MonND2 = Monitor_nD(xwidth=XW, yheight=YH, user1=SrcY, username1="Vertical position COLD / [m]", options=options4, restore_neutron=1) WHEN(IsCold) AT (0, 0, 1) RELATIVE Source /* Measures the vertical emmision coordinate of thermal neutrons */ COMPONENT MonND2_2 = Monitor_nD(xwidth=XW, yheight=YH, user1=SrcY, username1="Vertical position THERMAL/ [m]", options=options4, restore_neutron=1) WHEN(!IsCold) AT (0, 0, 1) RELATIVE Source /* 2D-plot of emmision coordinates for all neutrons */ COMPONENT MonND3 = Monitor_nD(xwidth=XW, yheight=YH, user1=SrcX, username1="Horizontal position / [m]", user2=SrcY,username2="Vertical position / [m]", options=options2, restore_neutron=1) AT (0, 0, 1) RELATIVE Source /* 2D-plot of (x,z) emmision coordinates for all neutrons */ COMPONENT MonND4 = Monitor_nD(xwidth=XW, yheight=YH, user1=SrcX, username1="Emission position / [m]", user2=SrcZ, username2="Z-component of position / [m]", options="user1 bins=201 limits=[-0.3,0.3], user2 bins=201 limits=[-0.3,0.3]", restore_neutron=1) AT (0, 0, 1) RELATIVE Source /* Measures brilliance of the "full" cold source */ COMPONENT BrillmonCOLD = Brilliance_monitor( nlam = 101, nt = 101, filename = "brillCOLD", t_0 = -1000, t_1 =4e4, lambda_0 = lambdamin, lambda_1 = lambdamax, Freq =14, toflambda=1 ,tofcuts=0, srcarea=(100*0.072*100*Yheight)*MC_GETPAR(Source, cos_cold), restore_neutron=1) WHEN(IsCold) AT (0, 0, 1) RELATIVE Source /* Measures "collimated" brilliance of the cold source over fixed 6 cm wide area x central part vertically. */ /* Used for calibration of performance wrt. MCNP BF1 output, see http://ess_butterfly.mcstas.org */ COMPONENT BrillmonCOLD_COLL = Brilliance_monitor( nlam = 101, nt = 101, filename = "brillCOLD_COLL", t_0 = -1000, t_1 = 4e4, lambda_0 = lambdamin, lambda_1 = lambdamax, Freq =14, toflambda=1,tofcuts=0, srcarea=(100*0.06*100*2*Yheight/2.5), restore_neutron=1) WHEN(SurfSign==-1 && IsCold && fabs(SrcY) (0.011+delta)) AT (0, 0, 1) RELATIVE Source /* Measures brilliance of the "full" thermal source */ COMPONENT BrillmonTHRM = Brilliance_monitor( nlam = 101, nt = 101, filename = "brillTHRM", t_0 = -1000, t_1 =4e4, lambda_0 = lambdamin, lambda_1 = lambdamax, Freq =14, toflambda=1,tofcuts=0, srcarea=(100*0.108*100*Yheight)*MC_GETPAR(Source, cos_thermal), restore_neutron=1) WHEN (!IsCold) AT (0, 0, 1) RELATIVE Source /* Measures "collimated" brilliance of the thermal source over fixed 6 cm wide area (or smaller at beamlines no. 1,2) x central part vertically. */ /* Used for calibration of performance wrt. MCNP BF1 output, see http://ess_butterfly.mcstas.org */ COMPONENT BrillmonTHRM_COLL = Brilliance_monitor( nlam = 101, nt = 101, filename = "brillTHRM_COLL", t_0 = -1000, t_1 =4e4, lambda_0 = lambdamin, lambda_1 = lambdamax, Freq =14, toflambda=1,tofcuts=0, srcarea=(100*0.06*100*2*Yheight/2.5), restore_neutron=1) WHEN (SurfSign==1 && (!IsCold) && fabs(SrcY)(TCollmin+delta) && fabs(SrcX)<(TCollmax+delta)) AT (0, 0, 1) RELATIVE Source /* /\* Uncomment these helper-arms to view "full" monolith *\/ */ /* COMPONENT DummyArm1 = Arm() */ /* AT (6,0,6) ABSOLUTE */ /* COMPONENT DummyArm2 = Arm() */ /* AT (-6,0,6) ABSOLUTE */ /* COMPONENT DummyArm3 = Arm() */ /* AT (-6,0,-6) ABSOLUTE */ /* COMPONENT DummyArm4 = Arm() */ /* AT (6,0,-6) ABSOLUTE */ /* COMPONENT DummyArm5 = Arm() */ /* AT (6,0,6) ABSOLUTE */ FINALLY %{ %} END