/*******************************************************************************
*
* McStas, neutron ray-tracing package
* Copyright (C) 1997-2008, All rights reserved
* Risoe National Laboratory, Roskilde, Denmark
* Institut Laue Langevin, Grenoble, France
*
* Instrument: HZB_NEAT (1995)
*
* %Identification
* Written by: Emmanuel Farhi and R. Lechner
* Date: 2011
* Origin: ILL (France)/BENSC (Germany)
* %INSTRUMENT_SITE: HZB
*
* V3 Time-of-Flight-Spectrometer (NEAT) at BENSC, 1995 version.
*
* %Description
*
* In time-of-flight spectrometers neutron pulses are created by us-
* ing mechanical chopper devices, realised on NEAT by fast rotating
* discs with speeds up to 20000 RPM. The discs are coated with neu-
* tron absorbing materials except for the narrow windows. Phased to
* each other according to the flight time of neutrons between them,
* the choppers „cut out” pulses of neutrons with a desired wave-
* length from the white beam. An interaction with moving atoms in
* the sample changes the velocities of the scattered neutrons and
* this is detected by the secondary part of the spectrometer on the
* basis of the time of flight between the sample and the neutron de-
* tectors at 2.5 m distance. The secondary spectrometer of NEAT
* contains an array of 388 3He 60 cm2 area single counter detectors
* (SD) for the large-angle scattering.
*
* The NL 2 (upper part) guide is modelled.
* This model only contains the first and last choppers, and has only a single
* pulse (no frame overlap). The sample is a 2mm thick plate rotated by 45 degrees,
* which material can be any powder/liquid/amorphous sample.
*
* %Example: lambda=6 Detector: Detector_I=2900
* %Example: lambda=6 coh=Y2O3.laz inc=NULL Detector: Detector_I=1080
*
* %Parameters
* lambda: [Angs] incident wavelength on sample
* dlambda: [Angs] wavelength spread shot from the source
* rpm: [rpm] disk chopper rotation speed, setting the resolution, Hz=rpm/60.
* coh: [str] sample coherent S(q,w) file name. Use LAZ/LAU or SQW file
* inc: [str] sample incoherent S(q,w) file name. Use NULL to scatter incoherently
*
* %Link
* NEAT at HZB/BENSC
* %End
*******************************************************************************/
DEFINE INSTRUMENT HZB_NEAT(lambda=6, dlambda=0.05, rpm=10000, string coh="Rb_liq_coh.sqw", string inc="Rb_liq_inc.sqw", tmin=0.01806, tmax=0.01826)
DECLARE %{
double time_elastic;
char detector_options[128];
char lmon_options[128];
char tmon_options[128];
%}
INITIALIZE %{
double Chopper2Detector = 11.97+2.143+0.165;
double KI, Vi, EI;
double Emin, Emax, Vmin, Vmax, Tmin, Tmax;
KI= 2*PI/lambda;
Vi = K2V*fabs(KI);
EI = VS2E*Vi*Vi;
printf("%s: Detailed NEAT/TOF configuration\n", NAME_CURRENT_COMP);
printf("* Incoming beam: lambda=%.4g [Angs] EI=%.4g [meV] KI=%.4g [Angs-1] Vi=%g [m/s]\n",
lambda, EI, KI, Vi);
time_elastic = 252.78*Chopper2Detector*lambda*1e-6; /* time from Chopper1 to reach Detector */
printf(" Sample: coh=%s inc=%s\n", coh, inc);
printf(" Elastic line time: %g [us]\n", time_elastic*1e6);
/* compute a +/- 20 meV */
Emin = EI-20; if (Emin < EI/3) Emin=EI/3;
Emax = EI+20;
Vmin = sqrt(Emin/VS2E);
Vmax = sqrt(Emax/VS2E);
Tmin = 2.5/Vmax;
Tmax = 2.5/Vmin;
sprintf(detector_options,
"banana, abs angle limits=[13 136] bins=300, time limits=[%g %g] bins=256",
time_elastic+Tmin, time_elastic+Tmax);
sprintf(lmon_options,"lambda limits=[%g %g] bins=100",lambda-dlambda/2.0,lambda+dlambda/2.0);
sprintf(tmon_options,"tof limits=[%g %g] bins=100",tmin,tmax);
%}
TRACE
COMPONENT PG = Progress_bar()
AT (0,0,0) ABSOLUTE
COMPONENT Source = Source_gen(T1=43.7 ,I1=1.4e12, T2=137.2,I2=2.08e12,radius=.155,
lambda0=lambda, dlambda=dlambda,
focus_xw=0.03, focus_yh=0.055)
AT (0,0,0) ABSOLUTE
COMPONENT Guide0 = Guide_gravity(w1=0.03, h1=0.055, l=2, m=1.2)
AT (0,0,2) RELATIVE Source
COMPONENT COPY(Guide0) = COPY(Guide0)
AT (0,0,2+1e-4) RELATIVE PREVIOUS ROTATED (0, 2.0/2500*RAD2DEG, 0) RELATIVE PREVIOUS
COMPONENT COPY(Guide0) = COPY(Guide0)
AT (0,0,2+1e-4) RELATIVE PREVIOUS ROTATED (0, 2.0/2500*RAD2DEG, 0) RELATIVE PREVIOUS
COMPONENT COPY(Guide0) = COPY(Guide0)
AT (0,0,2+1e-4) RELATIVE PREVIOUS ROTATED (0, 2.0/2500*RAD2DEG, 0) RELATIVE PREVIOUS
COMPONENT COPY(Guide0) = COPY(Guide0)
AT (0,0,2+1e-4) RELATIVE PREVIOUS ROTATED (0, 2.0/2500*RAD2DEG, 0) RELATIVE PREVIOUS
COMPONENT COPY(Guide0) = COPY(Guide0)
AT (0,0,2+1e-4) RELATIVE PREVIOUS ROTATED (0, 2.0/2500*RAD2DEG, 0) RELATIVE PREVIOUS
COMPONENT COPY(Guide0) = COPY(Guide0)
AT (0,0,2+1e-4) RELATIVE PREVIOUS ROTATED (0, 2.0/2500*RAD2DEG, 0) RELATIVE PREVIOUS
COMPONENT COPY(Guide0) = COPY(Guide0)
AT (0,0,2+1e-4) RELATIVE PREVIOUS ROTATED (0, 2.0/2500*RAD2DEG, 0) RELATIVE PREVIOUS
COMPONENT COPY(Guide0) = COPY(Guide0)
AT (0,0,2+1e-4) RELATIVE PREVIOUS ROTATED (0, 2.0/2500*RAD2DEG, 0) RELATIVE PREVIOUS
COMPONENT COPY(Guide0) = COPY(Guide0)
AT (0,0,2+1e-4) RELATIVE PREVIOUS ROTATED (0, 2.0/2500*RAD2DEG, 0) RELATIVE PREVIOUS
COMPONENT COPY(Guide0) = COPY(Guide0)
AT (0,0,2+1e-4) RELATIVE PREVIOUS ROTATED (0, 2.0/2500*RAD2DEG, 0) RELATIVE PREVIOUS
COMPONENT COPY(Guide0) = COPY(Guide0)
AT (0,0,2+1e-4) RELATIVE PREVIOUS ROTATED (0, 2.0/2500*RAD2DEG, 0) RELATIVE PREVIOUS
COMPONENT COPY(Guide0) = COPY(Guide0)
AT (0,0,2+1e-4) RELATIVE PREVIOUS ROTATED (0, 2.0/2500*RAD2DEG, 0) RELATIVE PREVIOUS
COMPONENT COPY(Guide0) = COPY(Guide0)
AT (0,0,2+1e-4) RELATIVE PREVIOUS ROTATED (0, 2.0/2500*RAD2DEG, 0) RELATIVE PREVIOUS
COMPONENT COPY(Guide0) = COPY(Guide0)
AT (0,0,2+1e-4) RELATIVE PREVIOUS ROTATED (0, 2.0/2500*RAD2DEG, 0) RELATIVE PREVIOUS
COMPONENT COPY(Guide0) = COPY(Guide0)
AT (0,0,2+1e-4) RELATIVE PREVIOUS ROTATED (0, 2.0/2500*RAD2DEG, 0) RELATIVE PREVIOUS
COMPONENT COPY(Guide0) = COPY(Guide0)
AT (0,0,2+1e-4) RELATIVE PREVIOUS ROTATED (0, 2.0/2500*RAD2DEG, 0) RELATIVE PREVIOUS
COMPONENT Guide_PSD = Monitor_nD(xwidth=0.03, yheight=0.055, options="y x")
AT (0,0,2+1e-4) RELATIVE PREVIOUS
COMPONENT Guide_Lambda = Monitor_nD(xwidth=0.03, yheight=0.055, options=lmon_options)
AT (0,0, 1e-4) RELATIVE PREVIOUS
/* time set here */
COMPONENT Chopper1 = DiskChopper(radius=0.24,
yheight=0.06, xwidth=0.03, nu=rpm/60, isfirst=1)
AT (0,0, 1.2e-2/2) RELATIVE Guide_Lambda
COMPONENT Guide_SGS1 = COPY(Guide0)(l=2.41-2*6e-3)
AT (0,0, 1.2e-2) RELATIVE Guide_Lambda
COMPONENT Guide_SGS2 = COPY(Guide0)(l=5.065-2*6e-3)
AT (0,0, 2.41) RELATIVE Guide_SGS1
COMPONENT Guide_SGS3 = COPY(Guide0)(l=2.352-2*6e-3)
AT (0,0, 5.065) RELATIVE Guide_SGS2
COMPONENT Guide_CGS = COPY(Guide0)(l=2.143-2*6e-3, w2=0.015, m=2.4)
AT (0,0, 2.352) RELATIVE Guide_SGS3
COMPONENT Guide2_PSD = Monitor_nD(xwidth=0.03, yheight=0.055, options="x y")
AT (0,0,2.143-2*6e-3+1e-4) RELATIVE PREVIOUS
COMPONENT Guide2_Lambda = Monitor_nD(xwidth=0.03, yheight=0.055, options=lmon_options)
AT (0,0, 1e-4) RELATIVE PREVIOUS
COMPONENT Guide2_dXY = Monitor_nD(xwidth=0.03, yheight=0.055, options="dx dy")
AT (0,0, 1e-4) RELATIVE PREVIOUS
/* distance 11.970 from Chopper 1 */
COMPONENT Chopper6 = DiskChopper(radius=0.24,
yheight=0.06, xwidth=0.03, nu=rpm/60, delay=252.78*11.97*lambda*1e-6)
AT (0,0, 1.2e-2/2) RELATIVE Guide2_dXY
COMPONENT Guide_time = COPY(Guide_PSD)(options=tmon_options)
AT (0,0, 1.2e-2/2) RELATIVE Chopper6
COMPONENT Guide_DGS = COPY(Guide0)(w1=0.015, l=1.0-2*6e-3, w2=0.023, m=2.4)
AT (0,0, 2.143) RELATIVE Guide_CGS
COMPONENT Sample_pos = Arm()
AT (0,0,2.143+0.165)RELATIVE Guide_DGS
/* sample at 2.143+0.165 m from Chopper 6 */
SPLIT COMPONENT Sample = Isotropic_Sqw(
Sqw_coh=coh, Sqw_inc=inc, p_interact=0.99,
xwidth=0.05, yheight=0.06, zdepth=0.002)
AT (0,0,0) RELATIVE Sample_pos ROTATED (0,45,0) RELATIVE Sample_pos
EXTEND %{
if (!SCATTERED) ABSORB;
%}
/* detector at 2.5 m from sample */
COMPONENT Ideal_Det= Monitor_nD(radius=2.5, yheight=2,
options=detector_options, restore_neutron=1)
AT (0,0,0) RELATIVE Sample_pos
/* total distance from Chopper1: 16.778 */
COMPONENT Detector = PSD_Detector(angle=136-13, yheight=2.0, nx=640, ny=256,
radius=2.5, zdepth=0.01, dc=0, threshold=100,
borderx=-1, bordery=-1,
PressureConv=8, PressureStop=1,
FN_Conv="Gas_tables/He3inHe.table", FN_Stop="Gas_tables/He3inCF4.table",
xChDivRelSigma=0, yChDivRelSigma=0.0037,
filename="NEAT.psd")
AT (0,0,0) RELATIVE Sample_pos ROTATED (0,(136-13)/2+13, 0) RELATIVE Sample_pos
END