/*******************************************************************************
*         McStas instrument definition URL=http://mcstas.risoe.dk
*
* Instrument: ILL_H5
*
* %Identification
* Written by: FARHI Emmanuel (farhi@ill.fr)
* Date: May, 2011
* Origin:ILL
* Release: McStas 2.0
* Version: $Revision: 1.0 $
* %INSTRUMENT_SITE: ILL
*
* The full H5 new cold guide at the ILL, with ThALES, D16, Super-Adam, IN15 
* (sample only), D22WASP and CryoEDM
* This is a proposed geometry for major H5 guide hall upgrade (since 2013).
* The exact adopted H5 geometry may be actually different.
*
* %Description
*
* This model decribes the full new H5 cold guide at the ILL, with ThALES, WASP, D16,
* Super-Adam, IN15, D22.
*
* H511:The IN15 Spin-echo spectrometer 
*   is simulated with an incoming polarized beam, but not with a full spin-echo
*   description. Sample is Vanadium
* H512:The D22 Large dynamic range small-angle diffractometer
*   is fully simulated
* H521:The D16 Small momentum transfer diffractometer D16 is realistic
* H521:The SuperADAM reflectometer is used in low angle diffraction mode.
* H522: The WASP Spin-echo spectrometer
*   is simulated with an incoming polarized beam, but not with a full spin-echo
*   description. Sample is Vanadium
* H523:The CryoEDM with its polarized beam
* H53: The ThALES Cold neutron three-axis spectrometer IN14
*
* For each instrument, a sample can be specified (liquid/powder/amorphous), 
* with monitoring of the scattering in angular (diffraction) and energy modes 
* (for spectroscopy).
*
* %Example: lambda=5 Detector: H5_I=1.03234e+14
*
* %Parameters
*      lambda:  central wavelength band for guide illumination [Angs]
*     dlambda:  half width of guide wavelength band [Angs]
* ThALES_lambda:ThALES monochromator setting wavelength. Usual 2.4 and 4.2 [Angs]
* WASP_lambda:  IN16 monochromator setting wavelength. Usual 3.3 and 6.3 [Angs]
*  D16_lambda:  D16  monochromator setting wavelength. Usual 4.7 and 5.6 [Angs]
* SADAM_lambda: SuperADAM monochromator setting wavelength. Usual 4.4 [Angs]
*  IN15_lambda: IN15 velocity selector setting wavelength [Angs]
*   D22_lambda: D22  velocity selector setting wavelength [Angs]
* ThALES_sample:ThALES liquid/powder/amorphous sample [string]
*   D16_sample: D16  liquid/powder/amorphous sample [string]
* SADAM_sample: SuperADAM liquid/powder/amorphous sample [string]
*   D22_sample: D22  liquid/powder/amorphous sample [string]
* D22_collimation: D22 collimation length and sample-detector distance [m]
*
* %Link
* The NoteDPT11 at the ILL
* %L
* The DPT/SMAE 11/070 WASP design report
* %L
* The DPT/SMAE 10/271 H5 design report
* %L
* Daily notes from K. Andersen about the H5 project
* %L
* Mirotron drawing MR-0656-000 for the IN15 V-mirror geometry
* %End
*******************************************************************************/

DEFINE INSTRUMENT ILL_H5_new(lambda=5, dlambda=4.5, 
  ThALES_lambda=4.2, WASP_lambda=6.3, D16_lambda=5.6,   SADAM_lambda=4.4,
  IN15_lambda=6.5,    D22_lambda=4.5,   D22_collimation=2,
  string ThALES_sample="Rb_liq_coh.sqw", string  WASP_sample="Rb_liq_coh.sqw",
  string D16_sample="H2O_liq.qSq",     string SADAM_sample="SiO2_quartza.laz",
  string D22_sample="H2O_liq.qSq",
  ThALES_RMV=-1,D16_RMV=-1,SADAM_RMV=-1,ThALES_RMH=-1)

DECLARE %{
  
  /* HCS (H5) source 'Measured' parameters */
  double sT3=413.5,sI3=10.22e12;
  double sT2=145.8,sI2=3.44e13;
  double sT1=40.1 ,sI1=2.78e13;
  
  /* guide coating parameters */
  double gR0          = 1;
  double gQc          = 0.0216;
  double gAlpha       = 4.07;
  double gW           = 1.0/300.0;
  
  double Al_Thickness = 0.001;
  double gGap         = 0.001;
  
  double ThALES_DM      = 3.355; /* PG002 */
  double ThALES_A1      = 0;
  double ThALES_L       = 2.12;
  
  double WASP_L       = 2.75;
  
  double D16_DM       = 3.355; /* PG002 */
  double D16_A1       = 0;
  double D16_L        = 2.8;
  
  double SADAM_DM     = 3.355; /* PG002 */
  double SADAM_A1     = 0;
  double SADAM_L      = 3.36;
  
  double CryoEDM_L    = 0.3;
    
  double IN15_L       = 3.7;
  double IN15_nu      = 0;
  double  D22_nu      = 0;
  double WASP_nu      = 0;
%}

USERVARS %{
  double flag;
%}

INITIALIZE %{
  double L;
  /* the effective guide divergence is 1.2*0.1*lambda*pi/180 for m=1.2 */
  /* the effective inguide length for focusing is thus 
         (0.12/2)/(1.2*0.1*lambda*PI/180)
  
  /* compute H53 parameters: ThALES */
  ThALES_A1  = asin(ThALES_lambda/2/ThALES_DM)*RAD2DEG;
       L   = 1/(1/ThALES_L+1/( (0.12/2)/(3*0.1*ThALES_lambda*PI/180) ));
  if (ThALES_RMV<0)
  ThALES_RMV = 2*L*sin(DEG2RAD*fabs(ThALES_A1));
  if (ThALES_RMH<0)
  ThALES_RMH = 2*L/sin(DEG2RAD*fabs(ThALES_A1));
  printf("%s: ThALES: A1=%g [deg] RMV=%g [m] RMH=%g [m] lambda=%g [Angs] sample=%s\n", 
    NAME_INSTRUMENT, ThALES_A1, ThALES_RMV, ThALES_RMH, ThALES_lambda, ThALES_sample);
  
  /* compute H521 parameters: D16 */
  D16_A1   = asin(D16_lambda/2/D16_DM)*RAD2DEG;
      L    = 1/(1/D16_L+1/( (0.12/2)/(2*0.1*D16_lambda*PI/180) ));
  if (D16_RMV<0)
  D16_RMV  = 2*L*sin(DEG2RAD*fabs(D16_A1));
  printf("%s: D16:  A1=%g [deg] RMV=%g [m] lambda=%g [Angs] sample=%s\n", 
    NAME_INSTRUMENT, D16_A1, D16_RMV, D16_lambda, D16_sample);
  
  /* compute H521 parameters: SuperADAM */
  SADAM_A1 = asin(SADAM_lambda/2/SADAM_DM)*RAD2DEG;
        L  = 1/(1/SADAM_L+1/( (0.12/2)/(2*0.1*SADAM_lambda*PI/180) ));
  if (SADAM_RMV<0)
  SADAM_RMV= 2*L*sin(DEG2RAD*fabs(SADAM_A1));
  printf("%s: SuperADAM: A1=%g [deg] RMV=%g [m] lambda=%g [Angs] sample=%s\n", 
    NAME_INSTRUMENT, SADAM_A1, SADAM_RMV, SADAM_lambda, SADAM_sample);
  
  /* compute H522 parameters: WASP Velocity Selector */ 
  WASP_nu   = 3956*14.2*DEG2RAD/2/PI/WASP_lambda/0.5;
  printf("%s: WASP:  nu=%g [rpm] lambda=%g [Angs] sample=%s\n", 
    NAME_INSTRUMENT, WASP_nu*60, WASP_lambda, WASP_sample);
  
  /* compute H511 parameters: IN15 Velocity Selector */ 
  IN15_nu  = 3956*64.4*DEG2RAD/2/PI/IN15_lambda/0.3;
  printf("%s: IN15: nu=%g [rmp] lambda=%g [Angs] sample=%s\n", 
    NAME_INSTRUMENT, IN15_nu*60, IN15_lambda, "Vanadium (polarized)");
  
  /* compute H512 parameters: D22 Velocity Selector */ 
  D22_nu   = 3956*48.3*DEG2RAD/2/PI/D22_lambda/0.25;
  printf("%s: D22:  nu=%g [rpm] lambda=%g [Angs] sample=%s\n", 
    NAME_INSTRUMENT, D22_nu*60, D22_lambda, D22_sample);
  
%}


TRACE

/* ================================ H5 common =============================== */

COMPONENT Origin = Progress_bar()
AT(0,0,0) ABSOLUTE

COMPONENT HCS = Source_gen(
  radius   = 0.21/2,
  zdepth   = 0.15,
  dist     = 2.155,
  focus_xw = 0.170,
  focus_yh = 0.120,
  lambda0  = lambda,
  dlambda  = dlambda,
  T1       = sT1,
  I1       = sI1,
  T2       = sT2,
  I2       = sI2,
  T3       = sT3,
  I3       = sI3,
  verbose  = 1)
  AT (0, 0, 0) RELATIVE Origin
  
COMPONENT HCS_Al  = PowderN(
  reflections="Al.laz", xwidth=0.17, yheight=0.12, zdepth=Al_Thickness, p_interact=0.05, p_inc=0.005, p_transmit=0.9450, d_phi=10)
AT (0,0,0.21) RELATIVE HCS

COMPONENT COPY(HCS_Al) = COPY(HCS_Al)
AT (0,0,0.61) RELATIVE HCS

COMPONENT COPY(HCS_Al) = COPY(HCS_Al)
AT (0,0,0.78) RELATIVE HCS

COMPONENT COPY(HCS_Al) = COPY(HCS_Al)
AT (0,0,0.92) RELATIVE HCS

COMPONENT COPY(HCS_Al) = COPY(HCS_Al)
AT (0,0,2.15) RELATIVE HCS

/* m=2 common rectangular large guide. MAY USE left/right as m=0.65 (glass, cheaper) */ 
COMPONENT H5 = Monitor_nD(xwidth=0.17, yheight=0.12,
  options="x y, slit", bins=50)
AT(0,0,2.155) RELATIVE HCS

COMPONENT H5_rect = Guide_gravity(w1=0.170, h1=0.12, l=1.0,
  R0=gR0, Qc=gQc, alpha=gAlpha, m = 2, W=gW)
AT(0,0,2.155) RELATIVE HCS

/* distribute the beam along channels */
COMPONENT H53_origin = Monitor_nD(xwidth=0.06, yheight=0.120, options="dx limits=[-2 2] dy limits=[-2 2]", bins=25, restore_neutron=1)
AT (0.17/2-0.06/2,0,1+gGap)               RELATIVE H5 ROTATED (0,1.5,0) RELATIVE H5
JUMP H53_start WHEN SCATTERED

COMPONENT H52_origin = COPY(H53_origin)(xwidth=0.062)
AT (0.17/2-0.06/2-0.004-0.062,0,1+gGap) RELATIVE H5 ROTATED (0,0,0) RELATIVE H5
JUMP H52_start WHEN SCATTERED

COMPONENT H51_origin = COPY(H53_origin)(xwidth=0.04)
AT (-0.17/2+0.04/2,0,1+gGap)              RELATIVE H5 ROTATED (0,-1.3269,0) RELATIVE H5
JUMP H51_start WHEN SCATTERED

                       /* start of guide sections */

/* ================================ H53 ===================================== */
/* feeds: ThALES */

COMPONENT H53_start = Arm()
AT (0,0,0) RELATIVE H53_origin

COMPONENT H53_inpile = COPY(H5_rect)(w1=0.06, m=3, l=4.930-3.155)
AT (0,0,0) RELATIVE PREVIOUS

COMPONENT H53_Al = COPY(HCS_Al)(xwidth=0.06)
AT (0,0,COMP_GETPAR(PREVIOUS, l)+0.01) RELATIVE PREVIOUS

/* Straight guide H53 m=3 length=14968-4930=10 m */
COMPONENT H53_Obt = COPY(H5_rect)(w1=0.06, m=3, l=3)
AT (0,0,Al_Thickness+0.015) RELATIVE PREVIOUS

COMPONENT COPY(HCS_Al) = COPY(HCS_Al)(xwidth=COMP_GETPAR(PREVIOUS, w1))
AT (0,0,COMP_GETPAR(PREVIOUS, l)+0.01) RELATIVE PREVIOUS

/* Gap 75 mm after BOG (barillet obturateur general): VS */

COMPONENT H53_Obt_Out = COPY(H5)(xwidth=0.06, restore_neutron=1)
AT (0,0,0.04) RELATIVE PREVIOUS

COMPONENT COPY(HCS_Al) = COPY(HCS_Al)(xwidth=0.06)
AT (0,0,0.01) RELATIVE PREVIOUS

COMPONENT H53_VSComC1 = COPY(H53_inpile)(l=7,nelements=7)
AT (0,0,3+0.075) RELATIVE H53_Obt

COMPONENT COPY(HCS_Al) = COPY(HCS_Al)(xwidth=0.06)
AT (0,0,7+0.01) RELATIVE PREVIOUS

/* Parabolic taper 60x120 -> 30x120 m=3 */
COMPONENT H53_Nose = Guide_tapering(
     w1 = 0.06, h1=0.12,
     linw = 0.0, loutw = 0.7, l=2.0, linh=0.0,
     louth = 0.0, option="parabolical", R0 = gR0, 
     Qcx = gQc, Qcy = gQc,alphax = gAlpha, 
     alphay = gAlpha, W = gW,
     mx = 3, my = 3, segno=20)
AT (0,0,0.01) RELATIVE PREVIOUS

COMPONENT COPY(HCS_Al) = COPY(HCS_Al)(xwidth=0.04)
AT (0,0,2+0.01) RELATIVE PREVIOUS

/* Monochromator at 18998-16698=2.3 m from nose exit window */
COMPONENT H53_ThALES_Monochromator_Cradle = COPY(H5)(options="x y", restore_neutron=1)
AT (0,0,2+2.3) RELATIVE H53_Nose
EXTEND %{
  flag=0;
%}

/* ThALES monochromator PG002 w15*h12 7 blades vertically focusing. Sample at 2.12 m */
COMPONENT H53_ThALES_Monochromator = Monochromator_curved(
  width  = 0.15, height = 0.12, NH=7, NV=7,
  RV=ThALES_RMV, RH=ThALES_RMH, DM=ThALES_DM, mosaich = 30, mosaicv = 30,
  r0 = 1, reflect="HOPG.rfl", transmit="HOPG.trm")
AT      (0,0,0)       RELATIVE H53_ThALES_Monochromator_Cradle
ROTATED (0,ThALES_A1,0) RELATIVE H53_ThALES_Monochromator_Cradle
EXTEND %{
  flag=SCATTERED;
%}

COMPONENT H53_ThALES_Monochromator_Jumper = Arm()
AT       (0,0,0)       RELATIVE H53_ThALES_Monochromator_Cradle
JUMP H53_ThALES_Transmit WHEN !flag

COMPONENT H53_ThALES_Monochromator_Out = Arm()
AT      (0,0,0)         RELATIVE H53_ThALES_Monochromator_Cradle
ROTATED (0,2*ThALES_A1,0) RELATIVE H53_ThALES_Monochromator_Cradle

COMPONENT H53_ThALES_Sample_Div = Monitor_nD(xwidth=0.05, yheight=0.05,
  options="dx limits=[-2 2], dy limits=[-2 2]", bins=50, restore_neutron=1)
AT (0,0,ThALES_L) RELATIVE H53_ThALES_Monochromator_Out

COMPONENT H53_ThALES_Sample_XY = Monitor_nD(xwidth=0.10, yheight=0.10,
  options="x y", bins=50, restore_neutron=1)
AT (0,0,ThALES_L) RELATIVE H53_ThALES_Monochromator_Out

COMPONENT H53_ThALES_Sample_L = Monitor_nD(xwidth=0.10, yheight=0.10,
  options="lambda limits=[1 10]", bins=50, restore_neutron=1)
AT (0,0,ThALES_L) RELATIVE H53_ThALES_Monochromator_Out

COMPONENT H53_ThALES_Sample = Isotropic_Sqw(radius=0.005,yheight=0.05, 
  Sqw_coh=ThALES_sample, Sqw_inc=NULL, d_phi=30)
AT (0,0,ThALES_L) RELATIVE H53_ThALES_Monochromator_Out
EXTEND %{
  if (!SCATTERED) ABSORB;
%}

COMPONENT H53_ThALES_Spectrometer = Monitor_nD(radius=0.5, yheight=0.3,
  options="angle limits=[-150 150] bins=50, energy limits=[0 30], banana", restore_neutron=1)
AT (0,0,0) RELATIVE H53_ThALES_Sample

COMPONENT H53_ThALES_Diffractometer = Monitor_nD(radius=1, yheight=0.3,options="theta bins=100 limits=[-150 150], y, banana")
AT (0,0,0) RELATIVE H53_ThALES_Sample
EXTEND %{
  ABSORB; /* neutron ends on the ThALES sample */
%}

/* For fun we add the ThALES 2nd spectrometer */
COMPONENT Sample_Out = Arm() /*        this is the sample-ana axis */
  AT (0,0,0) RELATIVE H53_ThALES_Sample
  ROTATED (0, -42, 0) RELATIVE H53_ThALES_Monochromator_Out

COMPONENT SC3 =Collimator_linear(
  xmin =-0.06/2, ymin =-0.12/2,
  xmax = 0.06/2, ymax = 0.12/2,
  length = 0.40)
AT (0, 0, 0.5) RELATIVE Sample_Out

COMPONENT Ana_Cradle = Arm()
  AT (0, 0, 1.37) RELATIVE Sample_Out

COMPONENT PG2Xtal = Monochromator_curved(
  width  = .2, height = .1,
  NH=11, NV=1, RV=0, RH=0,
  DM=3.355, mosaich = 30, mosaicv = 30, r0 = 0.7)
AT (0, 0, 0) RELATIVE Ana_Cradle
ROTATED (0, 21, 0) RELATIVE Ana_Cradle

COMPONENT Ana_Out = Arm() /*        this is the sample-ana axis */
  AT (0,0,0) RELATIVE Ana_Cradle
  ROTATED (0, 42, 0) RELATIVE Ana_Cradle

COMPONENT SC4 =Collimator_linear(
  xmin =-0.06/2, ymin =-0.12/2,
  xmax = 0.06/2, ymax = 0.12/2,
  length = 0.24)  
AT (0, 0, 0.25) RELATIVE Ana_Out

/* vertical 3He Detector */
COMPONENT He3H = Monitor(
  xmin = -0.025400, xmax = 0.025400,
  ymin = -0.042850, ymax = 0.042850)
AT (0, 0, 0.7) RELATIVE Ana_Out

                             /* end of ThALES */
                             
COMPONENT H53_ThALES_Transmit = Arm()
AT (0,0,0) RELATIVE H53_ThALES_Monochromator_Cradle

COMPONENT H53_ThALES_TransmitXY = Monitor_nD(
  xwidth=0.06, yheight=0.12, options="x lambda limits=[1 10]", bins=50)
AT (0,0,0.2) RELATIVE H53_ThALES_Monochromator_Cradle
EXTEND %{
  ABSORB;
%}

/* ================================ H52 ===================================== */
/* feeds: H523:CryoEDM, H521: D16, Super-Adam, H522: Wasp */

COMPONENT H52_start = Arm()
AT (0,0,0) RELATIVE H52_origin

COMPONENT H52_inpile = COPY(H5_rect)(w1=0.062, m=3, l=4.930-3.155, w2=0.068, h2=0.132)
AT (0,0,0) RELATIVE PREVIOUS

/* divergent section 60x120 -> w120 x h240 length = 20998-4930=16.068 m R=4000 m */
COMPONENT H52_Common = COPY(H52_inpile)(
  w1=COMP_GETPAR(PREVIOUS, w2),          h1=COMP_GETPAR(PREVIOUS, h2), 
  w2=COMP_GETPAR(PREVIOUS, w2)+0.052/16, h2=COMP_GETPAR(PREVIOUS, h2)+0.108/16, l=16.068/16)
AT (0,0,COMP_GETPAR(PREVIOUS, l)+gGap) RELATIVE PREVIOUS
ROTATED (0,16.068/16/4000*RAD2DEG,0) RELATIVE PREVIOUS

/* in the copy, the parameters are passed as is, 
   and the PREVIOUS in the cexp is not updated */
COMPONENT COPY(H52_Common) = COPY(PREVIOUS)(
  w1=COMP_GETPAR(PREVIOUS, w2),          h1=COMP_GETPAR(PREVIOUS, h2), 
  w2=COMP_GETPAR(PREVIOUS, w2)+0.052/16, h2=COMP_GETPAR(PREVIOUS, h2)+0.108/16)
AT (0,0,COMP_GETPAR(PREVIOUS, l)+gGap) RELATIVE PREVIOUS
ROTATED (0,16.068/16/4000*RAD2DEG,0) RELATIVE PREVIOUS

COMPONENT H52_Common_3 = COPY(PREVIOUS)(
  w1=COMP_GETPAR(PREVIOUS, w2),          h1=COMP_GETPAR(PREVIOUS, h2), 
  w2=COMP_GETPAR(PREVIOUS, w2)+0.052/16, h2=COMP_GETPAR(PREVIOUS, h2)+0.108/16)
AT (0,0,COMP_GETPAR(PREVIOUS, l)+gGap) RELATIVE PREVIOUS
ROTATED (0,16.068/16/4000*RAD2DEG,0) RELATIVE PREVIOUS

COMPONENT COPY(HCS_Al) = COPY(HCS_Al)(xwidth=COMP_GETPAR(H52_Common_3, w2))
AT (0,0,COMP_GETPAR(H52_Common_3, l)+0.01) RELATIVE PREVIOUS

/* Gap 75 mm after BOG (barillet obturateur general): VS */

COMPONENT H52_Obt_Out = COPY(H5)(xwidth=COMP_GETPAR(H52_Common_3, w2), restore_neutron=1)
AT (0,0,0.04) RELATIVE PREVIOUS

COMPONENT COPY(HCS_Al) = COPY(HCS_Al)(xwidth=COMP_GETPAR(H52_Common_3, w2))
AT (0,0,0.01) RELATIVE PREVIOUS

COMPONENT COPY(H52_Common) = COPY(H52_Common_3)(
  w1=COMP_GETPAR(H52_Common_3, w2),          h1=COMP_GETPAR(H52_Common_3, h2), 
  w2=COMP_GETPAR(H52_Common_3, w2)+0.052/16, h2=COMP_GETPAR(H52_Common_3, h2)+0.108/16, 
  l=16.068/16)
AT (0,0,COMP_GETPAR(H52_Common_3, l)+gGap+0.075) RELATIVE H52_Common_3
ROTATED (0,16.068/16/4000*RAD2DEG,0) RELATIVE PREVIOUS

COMPONENT COPY(H52_Common) = COPY(PREVIOUS)(
  w1=COMP_GETPAR(PREVIOUS, w2),          h1=COMP_GETPAR(PREVIOUS, h2), 
  w2=COMP_GETPAR(PREVIOUS, w2)+0.052/16, h2=COMP_GETPAR(PREVIOUS, h2)+0.108/16)
AT (0,0,COMP_GETPAR(PREVIOUS, l)+gGap) RELATIVE PREVIOUS
ROTATED (0,16.068/16/4000*RAD2DEG,0) RELATIVE PREVIOUS

COMPONENT COPY(H52_Common) = COPY(PREVIOUS)(
  w1=COMP_GETPAR(PREVIOUS, w2),          h1=COMP_GETPAR(PREVIOUS, h2), 
  w2=COMP_GETPAR(PREVIOUS, w2)+0.052/16, h2=COMP_GETPAR(PREVIOUS, h2)+0.108/16)
AT (0,0,COMP_GETPAR(PREVIOUS, l)+gGap) RELATIVE PREVIOUS
ROTATED (0,16.068/16/4000*RAD2DEG,0) RELATIVE PREVIOUS

COMPONENT COPY(H52_Common) = COPY(PREVIOUS)(
  w1=COMP_GETPAR(PREVIOUS, w2),          h1=COMP_GETPAR(PREVIOUS, h2), 
  w2=COMP_GETPAR(PREVIOUS, w2)+0.052/16, h2=COMP_GETPAR(PREVIOUS, h2)+0.108/16)
AT (0,0,COMP_GETPAR(PREVIOUS, l)+gGap) RELATIVE PREVIOUS
ROTATED (0,16.068/16/4000*RAD2DEG,0) RELATIVE PREVIOUS

COMPONENT COPY(H52_Common) = COPY(PREVIOUS)(
  w1=COMP_GETPAR(PREVIOUS, w2),          h1=COMP_GETPAR(PREVIOUS, h2), 
  w2=COMP_GETPAR(PREVIOUS, w2)+0.052/16, h2=COMP_GETPAR(PREVIOUS, h2)+0.108/16)
AT (0,0,COMP_GETPAR(PREVIOUS, l)+gGap) RELATIVE PREVIOUS
ROTATED (0,16.068/16/4000*RAD2DEG,0) RELATIVE PREVIOUS

COMPONENT COPY(H52_Common) = COPY(PREVIOUS)(
  w1=COMP_GETPAR(PREVIOUS, w2),          h1=COMP_GETPAR(PREVIOUS, h2), 
  w2=COMP_GETPAR(PREVIOUS, w2)+0.052/16, h2=COMP_GETPAR(PREVIOUS, h2)+0.108/16)
AT (0,0,COMP_GETPAR(PREVIOUS, l)+gGap) RELATIVE PREVIOUS
ROTATED (0,16.068/16/4000*RAD2DEG,0) RELATIVE PREVIOUS

COMPONENT COPY(H52_Common) = COPY(PREVIOUS)(
  w1=COMP_GETPAR(PREVIOUS, w2),          h1=COMP_GETPAR(PREVIOUS, h2), 
  w2=COMP_GETPAR(PREVIOUS, w2)+0.052/16, h2=COMP_GETPAR(PREVIOUS, h2)+0.108/16)
AT (0,0,COMP_GETPAR(PREVIOUS, l)+gGap) RELATIVE PREVIOUS
ROTATED (0,16.068/16/4000*RAD2DEG,0) RELATIVE PREVIOUS

COMPONENT COPY(H52_Common) = COPY(PREVIOUS)(
  w1=COMP_GETPAR(PREVIOUS, w2),          h1=COMP_GETPAR(PREVIOUS, h2), 
  w2=COMP_GETPAR(PREVIOUS, w2)+0.052/16, h2=COMP_GETPAR(PREVIOUS, h2)+0.108/16)
AT (0,0,COMP_GETPAR(PREVIOUS, l)+gGap) RELATIVE PREVIOUS
ROTATED (0,16.068/16/4000*RAD2DEG,0) RELATIVE PREVIOUS

COMPONENT COPY(H52_Common) = COPY(PREVIOUS)(
  w1=COMP_GETPAR(PREVIOUS, w2),          h1=COMP_GETPAR(PREVIOUS, h2), 
  w2=COMP_GETPAR(PREVIOUS, w2)+0.052/16, h2=COMP_GETPAR(PREVIOUS, h2)+0.108/16)
AT (0,0,COMP_GETPAR(PREVIOUS, l)+gGap) RELATIVE PREVIOUS
ROTATED (0,16.068/16/4000*RAD2DEG,0) RELATIVE PREVIOUS

COMPONENT COPY(H52_Common) = COPY(PREVIOUS)(
  w1=COMP_GETPAR(PREVIOUS, w2),          h1=COMP_GETPAR(PREVIOUS, h2), 
  w2=COMP_GETPAR(PREVIOUS, w2)+0.052/16, h2=COMP_GETPAR(PREVIOUS, h2)+0.108/16)
AT (0,0,COMP_GETPAR(PREVIOUS, l)+gGap) RELATIVE PREVIOUS
ROTATED (0,16.068/16/4000*RAD2DEG,0) RELATIVE PREVIOUS

COMPONENT COPY(H52_Common) = COPY(PREVIOUS)(
  w1=COMP_GETPAR(PREVIOUS, w2),          h1=COMP_GETPAR(PREVIOUS, h2), 
  w2=COMP_GETPAR(PREVIOUS, w2)+0.052/16, h2=COMP_GETPAR(PREVIOUS, h2)+0.108/16)
AT (0,0,COMP_GETPAR(PREVIOUS, l)+gGap) RELATIVE PREVIOUS
ROTATED (0,16.068/16/4000*RAD2DEG,0) RELATIVE PREVIOUS

COMPONENT COPY(H52_Common) = COPY(PREVIOUS)(
  w1=COMP_GETPAR(PREVIOUS, w2),          h1=COMP_GETPAR(PREVIOUS, h2), 
  w2=COMP_GETPAR(PREVIOUS, w2)+0.052/16, h2=COMP_GETPAR(PREVIOUS, h2)+0.108/16)
AT (0,0,COMP_GETPAR(PREVIOUS, l)+gGap) RELATIVE PREVIOUS
ROTATED (0,16.068/16/4000*RAD2DEG,0) RELATIVE PREVIOUS

COMPONENT COPY(H52_Common) = COPY(PREVIOUS)(
  w1=COMP_GETPAR(PREVIOUS, w2),          h1=COMP_GETPAR(PREVIOUS, h2), 
  w2=COMP_GETPAR(PREVIOUS, w2)+0.052/16, h2=COMP_GETPAR(PREVIOUS, h2)+0.108/16)
AT (0,0,COMP_GETPAR(PREVIOUS, l)+gGap) RELATIVE PREVIOUS
ROTATED (0,16.068/16/4000*RAD2DEG,0) RELATIVE PREVIOUS

COMPONENT COPY(HCS_Al) = COPY(HCS_Al)(xwidth=0.12,yheight=0.24)
AT (0,0,COMP_GETPAR(PREVIOUS, l)+gGap) RELATIVE PREVIOUS

COMPONENT H52_Common_Out = Monitor_nD(xwidth=0.120, yheight=0.240)
AT (0,0,0.01+gGap) RELATIVE PREVIOUS

/* distribute the H52 beam along channels 1 2 3 */
COMPONENT H523_origin = Monitor_nD(xwidth=0.06, yheight=0.120, options="dx limits=[-2 2] dy limits=[-2 2] ", bins=25, restore_neutron=1)
AT (0.03,-.06,0)   RELATIVE H52_Common_Out
JUMP H523_start WHEN SCATTERED

COMPONENT H521_origin = COPY(H523_origin)
AT (-0.03,-.06,0) RELATIVE H52_Common_Out 
JUMP H521_start WHEN SCATTERED

COMPONENT H522_origin = COPY(H53_origin)(xwidth=0.12,yheight=0.12)
AT (0,0.06,0)     RELATIVE H52_Common_Out
JUMP H522_start WHEN SCATTERED

/* ================================ H521 ==================================== */
/* bottom right (closer to H5 axis)                                           */
/* feeds: D16 and Super-ADAM                                                  */
/* rotated downwards by 0.05 deg for 17 m to get 15 mm separation and avoid   */
/* collision with H522                                                        */
COMPONENT H521_start = Arm()
AT (0,0,0) RELATIVE H521_origin

/* curved m=2/2.5 R=1500 m l=56000-20998=35 m 60x120->60x150 */
COMPONENT H521_Curved = COPY(H5_rect)(w1=0.06, h1=0.12, w2=0.06, h2=0.12+0.03/35, 
  l=35.0/35.0, m=2, mright=2.5)
AT (0,0,gGap) RELATIVE PREVIOUS
ROTATED (0.05,35.0/35.0/1500*RAD2DEG,0) RELATIVE PREVIOUS /* downwards */

COMPONENT COPY(H521_Curved) = COPY(PREVIOUS)(
  h1=COMP_GETPAR(PREVIOUS, h2), h2=COMP_GETPAR(PREVIOUS, h2)+0.03/35, l=35.0/35.0)
AT (0,0,COMP_GETPAR(PREVIOUS, l)+gGap) RELATIVE PREVIOUS
ROTATED (0,35.0/35.0/1500*RAD2DEG,0) RELATIVE PREVIOUS

COMPONENT COPY(H521_Curved) = COPY(PREVIOUS)(
  h1=COMP_GETPAR(PREVIOUS, h2), h2=COMP_GETPAR(PREVIOUS, h2)+0.03/35)
AT (0,0,COMP_GETPAR(PREVIOUS, l)+gGap) RELATIVE PREVIOUS
ROTATED (0,35.0/35.0/1500*RAD2DEG,0) RELATIVE PREVIOUS

COMPONENT COPY(H521_Curved) = COPY(PREVIOUS)(
  h1=COMP_GETPAR(PREVIOUS, h2), h2=COMP_GETPAR(PREVIOUS, h2)+0.03/35)
AT (0,0,COMP_GETPAR(PREVIOUS, l)+gGap) RELATIVE PREVIOUS
ROTATED (0,35.0/35.0/1500*RAD2DEG,0) RELATIVE PREVIOUS

COMPONENT COPY(H521_Curved) = COPY(PREVIOUS)(
  h1=COMP_GETPAR(PREVIOUS, h2), h2=COMP_GETPAR(PREVIOUS, h2)+0.03/35)
AT (0,0,COMP_GETPAR(PREVIOUS, l)+gGap) RELATIVE PREVIOUS
ROTATED (0,35.0/35.0/1500*RAD2DEG,0) RELATIVE PREVIOUS

COMPONENT COPY(H521_Curved) = COPY(PREVIOUS)(
  h1=COMP_GETPAR(PREVIOUS, h2), h2=COMP_GETPAR(PREVIOUS, h2)+0.03/35)
AT (0,0,COMP_GETPAR(PREVIOUS, l)+gGap) RELATIVE PREVIOUS
ROTATED (0,35.0/35.0/1500*RAD2DEG,0) RELATIVE PREVIOUS

COMPONENT COPY(H521_Curved) = COPY(PREVIOUS)(
  h1=COMP_GETPAR(PREVIOUS, h2), h2=COMP_GETPAR(PREVIOUS, h2)+0.03/35)
AT (0,0,COMP_GETPAR(PREVIOUS, l)+gGap) RELATIVE PREVIOUS
ROTATED (0,35.0/35.0/1500*RAD2DEG,0) RELATIVE PREVIOUS

COMPONENT COPY(H521_Curved) = COPY(PREVIOUS)(
  h1=COMP_GETPAR(PREVIOUS, h2), h2=COMP_GETPAR(PREVIOUS, h2)+0.03/35)
AT (0,0,COMP_GETPAR(PREVIOUS, l)+gGap) RELATIVE PREVIOUS
ROTATED (0,35.0/35.0/1500*RAD2DEG,0) RELATIVE PREVIOUS

COMPONENT COPY(H521_Curved) = COPY(PREVIOUS)(
  h1=COMP_GETPAR(PREVIOUS, h2), h2=COMP_GETPAR(PREVIOUS, h2)+0.03/35)
AT (0,0,COMP_GETPAR(PREVIOUS, l)+gGap) RELATIVE PREVIOUS
ROTATED (0,35.0/35.0/1500*RAD2DEG,0) RELATIVE PREVIOUS

COMPONENT COPY(H521_Curved) = COPY(PREVIOUS)(
  h1=COMP_GETPAR(PREVIOUS, h2), h2=COMP_GETPAR(PREVIOUS, h2)+0.03/35)
AT (0,0,COMP_GETPAR(PREVIOUS, l)+gGap) RELATIVE PREVIOUS
ROTATED (0,35.0/35.0/1500*RAD2DEG,0) RELATIVE PREVIOUS

COMPONENT COPY(H521_Curved) = COPY(PREVIOUS)(
  h1=COMP_GETPAR(PREVIOUS, h2), h2=COMP_GETPAR(PREVIOUS, h2)+0.03/35)
AT (0,0,COMP_GETPAR(PREVIOUS, l)+gGap) RELATIVE PREVIOUS
ROTATED (0,35.0/35.0/1500*RAD2DEG,0) RELATIVE PREVIOUS

COMPONENT H521_Curved_preVTE = COPY(PREVIOUS)(
  h1=COMP_GETPAR(PREVIOUS, h2), h2=COMP_GETPAR(PREVIOUS, h2)+0.03/35)
AT (0,0,COMP_GETPAR(PREVIOUS, l)+gGap) RELATIVE PREVIOUS
ROTATED (0,35.0/35.0/1500*RAD2DEG,0) RELATIVE PREVIOUS

COMPONENT COPY(HCS_Al) = COPY(HCS_Al)(xwidth=0.06,yheight=0.15)
AT (0,0,COMP_GETPAR(PREVIOUS, l)+gGap+0.001) RELATIVE PREVIOUS

/* VTE space+OT H53: 108 mm + 2 mm Al window */

COMPONENT H521_VTE = COPY(H5)(xwidth=0.06, yheight=0.15, restore_neutron=1)
AT (0,0,0.108/2-0.001) RELATIVE PREVIOUS

COMPONENT COPY(HCS_Al) = COPY(HCS_Al)(zdepth=0.002,xwidth=0.06,yheight=0.15)
AT (0,0,0.108/2-0.05) RELATIVE PREVIOUS

COMPONENT COPY(H521_Curved) = COPY(H521_Curved_preVTE)(
  h1=COMP_GETPAR(H521_Curved_preVTE, h2), h2=COMP_GETPAR(H521_Curved_preVTE, h2)+0.03/35, l=35.0/35.0)
AT (0,0,0.003+gGap) RELATIVE PREVIOUS
ROTATED (0,35.0/35.0/1500*RAD2DEG,0) RELATIVE PREVIOUS

COMPONENT COPY(H521_Curved) = COPY(PREVIOUS)(
  h1=COMP_GETPAR(PREVIOUS, h2), h2=COMP_GETPAR(PREVIOUS, h2)+0.03/35)
AT (0,0,COMP_GETPAR(PREVIOUS, l)+gGap) RELATIVE PREVIOUS
ROTATED (0,35.0/35.0/1500*RAD2DEG,0) RELATIVE PREVIOUS

COMPONENT COPY(H521_Curved) = COPY(PREVIOUS)(
  h1=COMP_GETPAR(PREVIOUS, h2), h2=COMP_GETPAR(PREVIOUS, h2)+0.03/35)
AT (0,0,COMP_GETPAR(PREVIOUS, l)+gGap) RELATIVE PREVIOUS
ROTATED (0,35.0/35.0/1500*RAD2DEG,0) RELATIVE PREVIOUS

COMPONENT COPY(H521_Curved) = COPY(PREVIOUS)(
  h1=COMP_GETPAR(PREVIOUS, h2), h2=COMP_GETPAR(PREVIOUS, h2)+0.03/35)
AT (0,0,COMP_GETPAR(PREVIOUS, l)+gGap) RELATIVE PREVIOUS
ROTATED (0,35.0/35.0/1500*RAD2DEG,0) RELATIVE PREVIOUS

COMPONENT COPY(H521_Curved) = COPY(PREVIOUS)(
  h1=COMP_GETPAR(PREVIOUS, h2), h2=COMP_GETPAR(PREVIOUS, h2)+0.03/35)
AT (0,0,COMP_GETPAR(PREVIOUS, l)+gGap) RELATIVE PREVIOUS
ROTATED (0,35.0/35.0/1500*RAD2DEG,0) RELATIVE PREVIOUS

COMPONENT COPY(H521_Curved) = COPY(PREVIOUS)  /* back to horizontal */
AT (0,0,COMP_GETPAR(PREVIOUS, l)+gGap) RELATIVE PREVIOUS
ROTATED (-0.05,35.0/35.0/1500*RAD2DEG,0) RELATIVE PREVIOUS

COMPONENT COPY(H521_Curved) = COPY(PREVIOUS)(
  h1=COMP_GETPAR(PREVIOUS, h2), h2=COMP_GETPAR(PREVIOUS, h2)+0.03/35)
AT (0,0,COMP_GETPAR(PREVIOUS, l)+gGap) RELATIVE PREVIOUS
ROTATED (0.05,35.0/35.0/1500*RAD2DEG,0) RELATIVE PREVIOUS

COMPONENT COPY(H521_Curved) = COPY(PREVIOUS)(
  h1=COMP_GETPAR(PREVIOUS, h2), h2=COMP_GETPAR(PREVIOUS, h2)+0.03/35)
AT (0,0,COMP_GETPAR(PREVIOUS, l)+gGap) RELATIVE PREVIOUS
ROTATED (0,35.0/35.0/1500*RAD2DEG,0) RELATIVE PREVIOUS

COMPONENT COPY(H521_Curved) = COPY(PREVIOUS)(
  h1=COMP_GETPAR(PREVIOUS, h2), h2=COMP_GETPAR(PREVIOUS, h2)+0.03/35)
AT (0,0,COMP_GETPAR(PREVIOUS, l)+gGap) RELATIVE PREVIOUS
ROTATED (0,35.0/35.0/1500*RAD2DEG,0) RELATIVE PREVIOUS

COMPONENT COPY(H521_Curved) = COPY(PREVIOUS)(
  h1=COMP_GETPAR(PREVIOUS, h2), h2=COMP_GETPAR(PREVIOUS, h2)+0.03/35)
AT (0,0,COMP_GETPAR(PREVIOUS, l)+gGap) RELATIVE PREVIOUS
ROTATED (0,35.0/35.0/1500*RAD2DEG,0) RELATIVE PREVIOUS

COMPONENT COPY(H521_Curved) = COPY(PREVIOUS)(
  h1=COMP_GETPAR(PREVIOUS, h2), h2=COMP_GETPAR(PREVIOUS, h2)+0.03/35)
AT (0,0,COMP_GETPAR(PREVIOUS, l)+gGap) RELATIVE PREVIOUS
ROTATED (0,35.0/35.0/1500*RAD2DEG,0) RELATIVE PREVIOUS

COMPONENT COPY(H521_Curved) = COPY(PREVIOUS)(
  h1=COMP_GETPAR(PREVIOUS, h2), h2=COMP_GETPAR(PREVIOUS, h2)+0.03/35)
AT (0,0,COMP_GETPAR(PREVIOUS, l)+gGap) RELATIVE PREVIOUS
ROTATED (0,35.0/35.0/1500*RAD2DEG,0) RELATIVE PREVIOUS

COMPONENT COPY(H521_Curved) = COPY(PREVIOUS)(
  h1=COMP_GETPAR(PREVIOUS, h2), h2=COMP_GETPAR(PREVIOUS, h2)+0.03/35)
AT (0,0,COMP_GETPAR(PREVIOUS, l)+gGap) RELATIVE PREVIOUS
ROTATED (0,35.0/35.0/1500*RAD2DEG,0) RELATIVE PREVIOUS

COMPONENT COPY(H521_Curved) = COPY(PREVIOUS)(
  h1=COMP_GETPAR(PREVIOUS, h2), h2=COMP_GETPAR(PREVIOUS, h2)+0.03/35)
AT (0,0,COMP_GETPAR(PREVIOUS, l)+gGap) RELATIVE PREVIOUS
ROTATED (0,35.0/35.0/1500*RAD2DEG,0) RELATIVE PREVIOUS

COMPONENT COPY(H521_Curved) = COPY(PREVIOUS)(
  h1=COMP_GETPAR(PREVIOUS, h2), h2=COMP_GETPAR(PREVIOUS, h2)+0.03/35)
AT (0,0,COMP_GETPAR(PREVIOUS, l)+gGap) RELATIVE PREVIOUS
ROTATED (0,35.0/35.0/1500*RAD2DEG,0) RELATIVE PREVIOUS

COMPONENT COPY(H521_Curved) = COPY(PREVIOUS)(
  h1=COMP_GETPAR(PREVIOUS, h2), h2=COMP_GETPAR(PREVIOUS, h2)+0.03/35)
AT (0,0,COMP_GETPAR(PREVIOUS, l)+gGap) RELATIVE PREVIOUS
ROTATED (0,35.0/35.0/1500*RAD2DEG,0) RELATIVE PREVIOUS

COMPONENT COPY(H521_Curved) = COPY(PREVIOUS)(
  h1=COMP_GETPAR(PREVIOUS, h2), h2=COMP_GETPAR(PREVIOUS, h2)+0.03/35)
AT (0,0,COMP_GETPAR(PREVIOUS, l)+gGap) RELATIVE PREVIOUS
ROTATED (0,35.0/35.0/1500*RAD2DEG,0) RELATIVE PREVIOUS

COMPONENT COPY(H521_Curved) = COPY(PREVIOUS)(
  h1=COMP_GETPAR(PREVIOUS, h2), h2=COMP_GETPAR(PREVIOUS, h2)+0.03/35)
AT (0,0,COMP_GETPAR(PREVIOUS, l)+gGap) RELATIVE PREVIOUS
ROTATED (0,35.0/35.0/1500*RAD2DEG,0) RELATIVE PREVIOUS

COMPONENT COPY(H521_Curved) = COPY(PREVIOUS)(
  h1=COMP_GETPAR(PREVIOUS, h2), h2=COMP_GETPAR(PREVIOUS, h2)+0.03/35)
AT (0,0,COMP_GETPAR(PREVIOUS, l)+gGap) RELATIVE PREVIOUS
ROTATED (0,35.0/35.0/1500*RAD2DEG,0) RELATIVE PREVIOUS

COMPONENT COPY(H521_Curved) = COPY(PREVIOUS)(
  h1=COMP_GETPAR(PREVIOUS, h2), h2=COMP_GETPAR(PREVIOUS, h2)+0.03/35)
AT (0,0,COMP_GETPAR(PREVIOUS, l)+gGap) RELATIVE PREVIOUS
ROTATED (0,35.0/35.0/1500*RAD2DEG,0) RELATIVE PREVIOUS

COMPONENT COPY(H521_Curved) = COPY(PREVIOUS)(
  h1=COMP_GETPAR(PREVIOUS, h2), h2=COMP_GETPAR(PREVIOUS, h2)+0.03/35)
AT (0,0,COMP_GETPAR(PREVIOUS, l)+gGap) RELATIVE PREVIOUS
ROTATED (0,35.0/35.0/1500*RAD2DEG,0) RELATIVE PREVIOUS

COMPONENT COPY(H521_Curved) = COPY(PREVIOUS)(
  h1=COMP_GETPAR(PREVIOUS, h2), h2=COMP_GETPAR(PREVIOUS, h2)+0.03/35)
AT (0,0,COMP_GETPAR(PREVIOUS, l)+gGap) RELATIVE PREVIOUS
ROTATED (0,35.0/35.0/1500*RAD2DEG,0) RELATIVE PREVIOUS

COMPONENT COPY(H521_Curved) = COPY(PREVIOUS)(
  h1=COMP_GETPAR(PREVIOUS, h2), h2=COMP_GETPAR(PREVIOUS, h2)+0.03/35)
AT (0,0,COMP_GETPAR(PREVIOUS, l)+gGap) RELATIVE PREVIOUS
ROTATED (0,35.0/35.0/1500*RAD2DEG,0) RELATIVE PREVIOUS

COMPONENT COPY(HCS_Al) = COPY(HCS_Al)(xwidth=0.06,yheight=0.15)
AT (0,0,COMP_GETPAR(PREVIOUS, l)+gGap) RELATIVE PREVIOUS

COMPONENT H521_Curved_Out = Monitor_nD(xwidth=0.06,yheight=0.15,options="x y")
AT (0,0,0.01+gGap) RELATIVE PREVIOUS

/* straight m=2 l=4 m 60x150 */

COMPONENT H521_Straight = Guide_gravity(w1=0.06, h1=0.15,m=2, l=4,nelements=4)
AT (0,0,gGap) RELATIVE PREVIOUS

COMPONENT H521_Straight_Out = Monitor_nD(xwidth=0.06,yheight=0.15,options="x y")
AT (0,0,COMP_GETPAR(PREVIOUS, l)+gGap) RELATIVE PREVIOUS

COMPONENT COPY(HCS_Al) = COPY(HCS_Al)(xwidth=0.06,yheight=0.15)
AT (0,0,gGap+0.001) RELATIVE PREVIOUS


                              /* D16 */
                              
COMPONENT H521_D16_Monochromator_Cradle = COPY(H5)(xwidth=0.06, restore_neutron=1)
AT (0,0,0.200/2-0.001) RELATIVE PREVIOUS
EXTEND %{
  flag=0;
%}

/* D16 Monochromator PG002 w6*h12 7 blades vertically focusing. 'Sample' at 2.8 m */
COMPONENT H521_D16_Monochromator = Monochromator_curved(
  width  = 0.06, height = 0.12, NH=1, NV=7,
  RV=D16_RMV, RH=0, DM=D16_DM, mosaich = 40, mosaicv = 40,
  r0 = 1, reflect="HOPG.rfl")
AT      (0,0,0)      RELATIVE H521_D16_Monochromator_Cradle
ROTATED (0,D16_A1,0) RELATIVE H521_D16_Monochromator_Cradle
EXTEND %{
  flag=SCATTERED;
%}

COMPONENT H521_D16_Monochromator_Jumper = Arm()
AT       (0,0,0)       RELATIVE H521_D16_Monochromator_Cradle
JUMP H521_D16_Transmit WHEN !flag

COMPONENT H521_D16_Monochromator_Out = Arm()
AT      (0,0,0)        RELATIVE H521_D16_Monochromator_Cradle
ROTATED (0,2*D16_A1,0) RELATIVE H521_D16_Monochromator_Cradle

COMPONENT H521_D16_Sample_Div = Monitor_nD(xwidth=0.05, yheight=0.05,
  options="dx limits=[-2 2], dy limits=[-2 2]", bins=50, restore_neutron=1)
AT (0,0,D16_L) RELATIVE H521_D16_Monochromator_Out

COMPONENT H521_D16_Sample_XY = Monitor_nD(xwidth=0.1, yheight=0.1,
  options="x y", bins=50, restore_neutron=1)
AT (0,0,D16_L) RELATIVE H521_D16_Monochromator_Out

COMPONENT H521_D16_Sample_L = Monitor_nD(xwidth=0.1, yheight=0.1,
  options="lambda limits=[1 10]", bins=50, restore_neutron=1)
AT (0,0,D16_L) RELATIVE H521_D16_Monochromator_Out

COMPONENT H521_D16_Sample = Isotropic_Sqw(radius=0.005,yheight=0.05, 
  Sqw_coh=D16_sample, Sqw_inc=NULL, d_phi=30)
AT (0,0,D16_L) RELATIVE H521_D16_Monochromator_Out
EXTEND %{
  if (!SCATTERED) ABSORB;
%}

COMPONENT H521_D16_Detector = Monitor_nD(
  xwidth=0.32, yheight=0.32, options="x y", bins=50, restore_neutron=1)
AT (0,0,1.1) RELATIVE H521_D16_Sample

COMPONENT H521_D16_Spectrometer = Monitor_nD(radius=0.5, yheight=0.3,
  options="angle limits=[-150 150] bins=50, energy limits=[0 30], banana", restore_neutron=1)
AT (0,0,0) RELATIVE H521_D16_Sample

COMPONENT H521_D16_Diffractometer = Monitor_nD(radius=1, yheight=0.3,options="theta bins=100 limits=[-150 150], y, banana")
AT (0,0,0) RELATIVE H521_D16_Sample
EXTEND %{
  ABSORB; /* neutron ends on the D16 sample position */
%}

COMPONENT H521_D16_Transmit = Arm()
AT (0,0,0) RELATIVE H521_D16_Monochromator_Cradle

COMPONENT COPY(HCS_Al) = COPY(HCS_Al)(xwidth=0.06,yheight=0.15)
AT (0,0,0.200/2-0.01) RELATIVE H521_D16_Transmit

COMPONENT H521_P6_Start = Arm()
AT (0,0,0.200/2)      RELATIVE H521_D16_Transmit

/* Carter Poutre 6                                                           */
COMPONENT H521_P6 = COPY(H53_inpile)(l=19.321, m=3,w1=0.06,h1=0.15,h2=0.12)
AT (0,0,0)            RELATIVE H521_P6_Start

COMPONENT COPY(HCS_Al) = COPY(HCS_Al)(xwidth=0.06,yheight=0.12)
AT (0,0,19.321+0.001) RELATIVE PREVIOUS

                  /* Gap 524 mm: SuperADAM Monochromator */

                              /* SuperADAM */
                              
COMPONENT H521_SADAM_Monochromator_Cradle = COPY(H5)(xwidth=0.06, restore_neutron=1)
AT (0,0,0.524/2-0.001) RELATIVE PREVIOUS
EXTEND %{
  flag=0;
%}

/* D16 Monochromator PG002 w6*h12 7 blades vertically focusing. 'Sample' at 2.8 m */
COMPONENT H521_SADAM_Monochromator = Monochromator_curved(
  width  = 0.06, height = 0.12, NH=1, NV=7,
  RV=SADAM_RMV, RH=0, DM=SADAM_DM, mosaich = 40, mosaicv = 40,
  r0 = 1, reflect="HOPG.rfl")
AT      (0,0,0)      RELATIVE H521_SADAM_Monochromator_Cradle
ROTATED (0,SADAM_A1,0) RELATIVE H521_SADAM_Monochromator_Cradle
EXTEND %{
  if (!SCATTERED) ABSORB;
%}

COMPONENT H521_SADAM_Monochromator_Out = Arm()
AT      (0,0,0)        RELATIVE H521_SADAM_Monochromator_Cradle
ROTATED (0,2*SADAM_A1,0) RELATIVE H521_SADAM_Monochromator_Cradle

COMPONENT H521_SADAM_Sample_Div = Monitor_nD(xwidth=0.05, yheight=0.05,
  options="dx limits=[-2 2], dy limits=[-2 2]", bins=50, restore_neutron=1)
AT (0,0,SADAM_L) RELATIVE H521_SADAM_Monochromator_Out

COMPONENT H521_SADAM_Sample_XY = Monitor_nD(xwidth=0.1, yheight=0.1,
  options="x y", bins=50, restore_neutron=1)
AT (0,0,SADAM_L) RELATIVE H521_SADAM_Monochromator_Out

COMPONENT H521_SADAM_Sample_L = Monitor_nD(xwidth=0.1, yheight=0.1,
  options="lambda limits=[1 10]", bins=50, restore_neutron=1)
AT (0,0,SADAM_L) RELATIVE H521_SADAM_Monochromator_Out

COMPONENT H521_SADAM_Sample = Isotropic_Sqw(radius=0.005,yheight=0.05, 
  Sqw_coh=SADAM_sample, Sqw_inc=NULL, d_phi=30)
AT (0,0,SADAM_L) RELATIVE H521_SADAM_Monochromator_Out
EXTEND %{
  if (!SCATTERED) ABSORB;
%}

COMPONENT H521_SADAM_Detector = Monitor_nD(
  xwidth=0.32, yheight=0.32, options="x y", bins=50, restore_neutron=1)
AT (0,0,1.1) RELATIVE H521_SADAM_Sample

COMPONENT H521_SADAM_Spectrometer = Monitor_nD(radius=0.5, yheight=0.3,
  options="angle limits=[-150 150] bins=50, energy limits=[0 30], banana", restore_neutron=1)
AT (0,0,0) RELATIVE H521_SADAM_Sample

COMPONENT H521_SADAM_Diffractometer = Monitor_nD(radius=1, yheight=0.3,options="theta bins=100 limits=[-150 150], y, banana")
AT (0,0,0) RELATIVE H521_SADAM_Sample
EXTEND %{
  ABSORB; /* neutron ends on the SuperADAM sample position */
%}

/* ================================ H522 ==================================== */
/* feeds: WASP                                                                */
COMPONENT H522_start = Arm()
AT (0,0,0) RELATIVE H522_origin

/* curved m=2 R=400 m l=35 m 120x120 */
COMPONENT H522_Curved = COPY(H5_rect)(w1=0.12, h1=0.12,l=35.0/35, m=2)
AT (0,0,gGap) RELATIVE PREVIOUS
ROTATED (0,35.0/35/4000*RAD2DEG,0) RELATIVE PREVIOUS

COMPONENT COPY(H522_Curved) = COPY(PREVIOUS)
AT (0,0,COMP_GETPAR(PREVIOUS, l)+gGap) RELATIVE PREVIOUS
ROTATED (0,35.0/35/4000*RAD2DEG,0) RELATIVE PREVIOUS

COMPONENT COPY(H522_Curved) = COPY(PREVIOUS)
AT (0,0,COMP_GETPAR(PREVIOUS, l)+gGap) RELATIVE PREVIOUS
ROTATED (0,35.0/35/4000*RAD2DEG,0) RELATIVE PREVIOUS

COMPONENT COPY(H522_Curved) = COPY(PREVIOUS)
AT (0,0,COMP_GETPAR(PREVIOUS, l)+gGap) RELATIVE PREVIOUS
ROTATED (0,35.0/35/4000*RAD2DEG,0) RELATIVE PREVIOUS

COMPONENT COPY(H522_Curved) = COPY(PREVIOUS)
AT (0,0,COMP_GETPAR(PREVIOUS, l)+gGap) RELATIVE PREVIOUS
ROTATED (0,35.0/35/4000*RAD2DEG,0) RELATIVE PREVIOUS

COMPONENT COPY(H522_Curved) = COPY(PREVIOUS)
AT (0,0,COMP_GETPAR(PREVIOUS, l)+gGap) RELATIVE PREVIOUS
ROTATED (0,35.0/35/4000*RAD2DEG,0) RELATIVE PREVIOUS

COMPONENT COPY(H522_Curved) = COPY(PREVIOUS)
AT (0,0,COMP_GETPAR(PREVIOUS, l)+gGap) RELATIVE PREVIOUS
ROTATED (0,35.0/35/4000*RAD2DEG,0) RELATIVE PREVIOUS

COMPONENT COPY(H522_Curved) = COPY(PREVIOUS)
AT (0,0,COMP_GETPAR(PREVIOUS, l)+gGap) RELATIVE PREVIOUS
ROTATED (0,35.0/35/4000*RAD2DEG,0) RELATIVE PREVIOUS

COMPONENT COPY(H522_Curved) = COPY(PREVIOUS)
AT (0,0,COMP_GETPAR(PREVIOUS, l)+gGap) RELATIVE PREVIOUS
ROTATED (0,35.0/35/4000*RAD2DEG,0) RELATIVE PREVIOUS

COMPONENT COPY(H522_Curved) = COPY(PREVIOUS)
AT (0,0,COMP_GETPAR(PREVIOUS, l)+gGap) RELATIVE PREVIOUS
ROTATED (0,35.0/35/4000*RAD2DEG,0) RELATIVE PREVIOUS

COMPONENT COPY(HCS_Al) = COPY(HCS_Al)(xwidth=0.12,yheight=0.12)
AT (0,0,COMP_GETPAR(PREVIOUS, l)+gGap+0.001) RELATIVE PREVIOUS

/* VTE space+OT H53: 108 mm + 2 mm Al window */

COMPONENT H522_VTE = COPY(H5)(xwidth=0.12, restore_neutron=1)
AT (0,0,0.108/2-0.001) RELATIVE PREVIOUS

COMPONENT COPY(HCS_Al) = COPY(HCS_Al)(zdepth=0.002,xwidth=0.12,yheight=0.12)
AT (0,0,0.108/2-0.05) RELATIVE PREVIOUS

COMPONENT COPY(H523_Curved) = COPY(H5_rect)(w1=0.12, h1=0.12,l=35.0/35, m=2)
AT (0,0,0.003+gGap) RELATIVE PREVIOUS
ROTATED (0,35.0/35/4000*RAD2DEG,0) RELATIVE PREVIOUS

COMPONENT COPY(H523_Curved) = COPY(PREVIOUS)
AT (0,0,COMP_GETPAR(PREVIOUS, l)+gGap) RELATIVE PREVIOUS
ROTATED (0,35.0/35/4000*RAD2DEG,0) RELATIVE PREVIOUS

COMPONENT COPY(H523_Curved) = COPY(PREVIOUS)
AT (0,0,COMP_GETPAR(PREVIOUS, l)+gGap) RELATIVE PREVIOUS
ROTATED (0,35.0/35/4000*RAD2DEG,0) RELATIVE PREVIOUS

COMPONENT COPY(H523_Curved) = COPY(PREVIOUS)
AT (0,0,COMP_GETPAR(PREVIOUS, l)+gGap) RELATIVE PREVIOUS
ROTATED (0,35.0/35/4000*RAD2DEG,0) RELATIVE PREVIOUS

COMPONENT COPY(H523_Curved) = COPY(PREVIOUS)
AT (0,0,COMP_GETPAR(PREVIOUS, l)+gGap) RELATIVE PREVIOUS
ROTATED (0,35.0/35/4000*RAD2DEG,0) RELATIVE PREVIOUS

COMPONENT COPY(H522_Curved) = COPY(PREVIOUS)
AT (0,0,COMP_GETPAR(PREVIOUS, l)+gGap) RELATIVE PREVIOUS
ROTATED (0,35.0/35/4000*RAD2DEG,0) RELATIVE PREVIOUS

COMPONENT COPY(H522_Curved) = COPY(PREVIOUS)
AT (0,0,COMP_GETPAR(PREVIOUS, l)+gGap) RELATIVE PREVIOUS
ROTATED (0,35.0/35/4000*RAD2DEG,0) RELATIVE PREVIOUS

COMPONENT COPY(H522_Curved) = COPY(PREVIOUS)
AT (0,0,COMP_GETPAR(PREVIOUS, l)+gGap) RELATIVE PREVIOUS
ROTATED (0,35.0/35/4000*RAD2DEG,0) RELATIVE PREVIOUS

COMPONENT COPY(H522_Curved) = COPY(PREVIOUS)
AT (0,0,COMP_GETPAR(PREVIOUS, l)+gGap) RELATIVE PREVIOUS
ROTATED (0,35.0/35/4000*RAD2DEG,0) RELATIVE PREVIOUS

COMPONENT COPY(H522_Curved) = COPY(PREVIOUS)
AT (0,0,COMP_GETPAR(PREVIOUS, l)+gGap) RELATIVE PREVIOUS
ROTATED (0,35.0/35/4000*RAD2DEG,0) RELATIVE PREVIOUS

COMPONENT COPY(H522_Curved) = COPY(PREVIOUS)
AT (0,0,COMP_GETPAR(PREVIOUS, l)+gGap) RELATIVE PREVIOUS
ROTATED (0,35.0/35/4000*RAD2DEG,0) RELATIVE PREVIOUS

COMPONENT COPY(H522_Curved) = COPY(PREVIOUS)
AT (0,0,COMP_GETPAR(PREVIOUS, l)+gGap) RELATIVE PREVIOUS
ROTATED (0,35.0/35/4000*RAD2DEG,0) RELATIVE PREVIOUS

COMPONENT COPY(H522_Curved) = COPY(PREVIOUS)
AT (0,0,COMP_GETPAR(PREVIOUS, l)+gGap) RELATIVE PREVIOUS
ROTATED (0,35.0/35/4000*RAD2DEG,0) RELATIVE PREVIOUS

COMPONENT COPY(H522_Curved) = COPY(PREVIOUS)
AT (0,0,COMP_GETPAR(PREVIOUS, l)+gGap) RELATIVE PREVIOUS
ROTATED (0,35.0/35/4000*RAD2DEG,0) RELATIVE PREVIOUS

COMPONENT COPY(H522_Curved) = COPY(PREVIOUS)
AT (0,0,COMP_GETPAR(PREVIOUS, l)+gGap) RELATIVE PREVIOUS
ROTATED (0,35.0/35/4000*RAD2DEG,0) RELATIVE PREVIOUS

COMPONENT COPY(H522_Curved) = COPY(PREVIOUS)
AT (0,0,COMP_GETPAR(PREVIOUS, l)+gGap) RELATIVE PREVIOUS
ROTATED (0,35.0/35/4000*RAD2DEG,0) RELATIVE PREVIOUS

COMPONENT COPY(H522_Curved) = COPY(PREVIOUS)
AT (0,0,COMP_GETPAR(PREVIOUS, l)+gGap) RELATIVE PREVIOUS
ROTATED (0,35.0/35/4000*RAD2DEG,0) RELATIVE PREVIOUS

COMPONENT COPY(H522_Curved) = COPY(PREVIOUS)
AT (0,0,COMP_GETPAR(PREVIOUS, l)+gGap) RELATIVE PREVIOUS
ROTATED (0,35.0/35/4000*RAD2DEG,0) RELATIVE PREVIOUS

COMPONENT COPY(H522_Curved) = COPY(PREVIOUS)
AT (0,0,COMP_GETPAR(PREVIOUS, l)+gGap) RELATIVE PREVIOUS
ROTATED (0,35.0/35/4000*RAD2DEG,0) RELATIVE PREVIOUS

COMPONENT COPY(H522_Curved) = COPY(PREVIOUS)
AT (0,0,COMP_GETPAR(PREVIOUS, l)+gGap) RELATIVE PREVIOUS
ROTATED (0,35.0/35/4000*RAD2DEG,0) RELATIVE PREVIOUS

COMPONENT COPY(H522_Curved) = COPY(PREVIOUS)
AT (0,0,COMP_GETPAR(PREVIOUS, l)+gGap) RELATIVE PREVIOUS
ROTATED (0,35.0/35/4000*RAD2DEG,0) RELATIVE PREVIOUS

COMPONENT COPY(H522_Curved) = COPY(PREVIOUS)
AT (0,0,COMP_GETPAR(PREVIOUS, l)+gGap) RELATIVE PREVIOUS
ROTATED (0,35.0/35/4000*RAD2DEG,0) RELATIVE PREVIOUS

COMPONENT COPY(H522_Curved) = COPY(PREVIOUS)
AT (0,0,COMP_GETPAR(PREVIOUS, l)+gGap) RELATIVE PREVIOUS
ROTATED (0,35.0/35/4000*RAD2DEG,0) RELATIVE PREVIOUS

COMPONENT COPY(H522_Curved) = COPY(PREVIOUS)
AT (0,0,COMP_GETPAR(PREVIOUS, l)+gGap) RELATIVE PREVIOUS
ROTATED (0,35.0/35/4000*RAD2DEG,0) RELATIVE PREVIOUS

COMPONENT COPY(H522_Curved) = COPY(PREVIOUS)
AT (0,0,COMP_GETPAR(PREVIOUS, l)+gGap) RELATIVE PREVIOUS
ROTATED (0,35.0/35/4000*RAD2DEG,0) RELATIVE PREVIOUS

COMPONENT COPY(HCS_Al) = COPY(HCS_Al)(xwidth=0.12,yheight=0.12)
AT (0,0,COMP_GETPAR(PREVIOUS, l)+gGap+0.001) RELATIVE PREVIOUS

COMPONENT H522_Curved_Out_XY = Monitor_nD(xwidth=0.12,yheight=0.12,options="x y", restore_neutron=1)
AT (0,0,0.01+gGap) RELATIVE PREVIOUS

COMPONENT H522_Curved_Out_XL = COPY(PREVIOUS)(options="x, lambda limits=[1 10]", bins=50)
AT (0,0,0) RELATIVE PREVIOUS

/* WASP Velocity Selector: NVS 030 in 60 cm gap */
COMPONENT WASP_Vselector = V_selector(xwidth=0.12, yheight=0.085, zdepth=0.60, radius=0.43/2, 
  alpha=14.2, length=0.5, d=0.0004, nu=WASP_nu, nslit=144)
AT (0,0,0.31) RELATIVE H522_Curved_Out_XL ROTATED (0,0,-90) RELATIVE H522_Curved_Out_XL

COMPONENT COPY(HCS_Al) = COPY(HCS_Al)(xwidth=0.12,yheight=0.12)
AT (0,0,0.62) RELATIVE H522_Curved_Out_XL

/* straight section l=25.77 m=2, including polariser+Vpol */
COMPONENT H522_Straight = Guide_gravity(w1=0.075,h1=0.12,l=25.77)
AT (0,0,0.01) RELATIVE PREVIOUS

COMPONENT COPY(HCS_Al) = COPY(HCS_Al)(xwidth=0.075,yheight=0.12)
AT (0,0,25.77) RELATIVE PREVIOUS

COMPONENT H522_Vsel_L = Monitor_nD(xwidth=0.075, yheight=0.12, options="slit lambda limits=[1 10]", bins=50)
AT (0,0,0.01) RELATIVE PREVIOUS

/* WASP polariser l=4.8 m */
COMPONENT H522_mirror_centre = Arm()
AT (0,0,4.8/2) RELATIVE PREVIOUS
EXTEND %{
  flag=0;
%}

/* polarising splitter: an iterating assembly of polarising */
/* The single polariser is enough and simpler to handle. We ignore the surrouding m=2 guide */
COMPONENT WASP_polariser = Pol_mirror(zwidth = 4.8, yheight = 0.12, 
  rUpPar  ={1.0, 0.0219, 4.07, 3.2, 0.003},
  rDownPar={0.1, 0.0219, 4.07, 3.2, 0.003}, p_reflect=0.95)
AT (0, 0, 0) RELATIVE H522_mirror_centre ROTATED (0, -0.89, 0) RELATIVE H522_mirror_centre
EXTEND %{
  flag=SCATTERED;
%}

COMPONENT H522_mirror_outdir = Arm()
AT (0,0,0) RELATIVE H522_mirror_centre ROTATED (0, -0.89*2, 0) RELATIVE H522_mirror_centre

COMPONENT H522_mirror_ReflectXY = Monitor_nD(xwidth=0.075, restore_neutron=1, yheight=0.12, bins=50)
WHEN flag==1
AT (0,0,4.8/2)                  RELATIVE H522_mirror_outdir

COMPONENT H522_mirror_TransmitXY = COPY(H522_mirror_ReflectXY)
WHEN flag==2
AT (0,0,4.8/2)                  RELATIVE H522_mirror_centre
EXTEND %{
  if (flag == 2) ABSORB;
%}

COMPONENT H522_mirror_outdXY = COPY(H522_mirror_ReflectXY)(options="dx limits=[-2 2], dy limits=[-2 2]")
AT (0,0,0)                      RELATIVE H522_mirror_ReflectXY

/* WASP polarising V-mirror                                       */
COMPONENT WASP_Vpolariser = Pol_guide_vmirror(xwidth = 0.075, yheight = 0.12, 
		  length = 1.210, 		  
		  rPar    ={1, 2.0*0.0219, 4.07, 1, 0.003},
		  rUpPar  ={1, 3.2*0.0219, 4.07, 1, 0.003},
		  rDownPar={1, 0.4*0.0219, 4.07, 1, 0.003})
AT (0,0,0.01) RELATIVE PREVIOUS

/* last straight section 1.76 m */
COMPONENT H522_Straight_Last = Guide_gravity(w1=0.075,h1=0.12,l=1.76)
AT (0,0,1.21+0.01) RELATIVE PREVIOUS

/* sample at 2.75 m */
COMPONENT H522_WASP_Sample_Div = Monitor_nD(xwidth=0.02, yheight=0.05,
  options="dx limits=[-2 2], dy limits=[-2 2]", bins=100, restore_neutron=1)
AT (0,0,WASP_L+1.76) RELATIVE H522_Straight_Last

COMPONENT H522_WASP_Sample_XY = Monitor_nD(xwidth=0.02, yheight=0.05,
  options="x y", bins=50, restore_neutron=1)
AT (0,0,WASP_L+1.76) RELATIVE H522_Straight_Last

COMPONENT H522_WASP_Sample_L = Monitor_nD(xwidth=0.02, yheight=0.05,
  options="wavelength limits=[1 10]", bins=50, restore_neutron=1)
AT (0,0,WASP_L+1.76) RELATIVE H522_Straight_Last

COMPONENT H522_WASP_Sample = Incoherent(radius=0.02,yheight=0.04, 
  focus_aw=180, focus_ah=30, target_index=+1)
AT (0,0,WASP_L+1.76) RELATIVE H522_Straight_Last
EXTEND %{
  if (!SCATTERED) ABSORB;
%}

COMPONENT H522_WASP_Detector = Monitor_nD(xwidth=0.32, yheight=0.32,
  options="x y", restore_neutron=1, bins=32)
AT (0,0,4.6) RELATIVE H522_WASP_Sample

COMPONENT H522_WASP_Spectrometer = Monitor_nD(radius=3, yheight=0.3,
  options="angle limits=[-170 170] bins=50, energy limits=[0 5], banana", restore_neutron=1)
AT (0,0,0) RELATIVE H522_WASP_Sample

COMPONENT H522_WASP_Diffractometer = Monitor_nD(radius=3.5,yheight=0.3, options="theta bins=100 limits=[-170 170], y, banana")
AT (0,0,0) RELATIVE H522_WASP_Sample
EXTEND %{
  ABSORB; /* neutron ends on the SuperADAM sample position */
%}


/* ================================ H523 ==================================== */
/* feeds: Cryo-EDM                                                            */
COMPONENT H523_start = Arm()
AT (0,0,0) RELATIVE H523_origin

/* curved m=2/2.5 R=800 m l=50 m 60x120 */
COMPONENT H523_Curved = COPY(H5_rect)(w1=0.06, h1=0.12,l=50.0/25, m=1.2, mright=1.5)
AT (0,0,gGap) RELATIVE PREVIOUS
ROTATED (0,50.0/25.0/800*RAD2DEG,0) RELATIVE PREVIOUS

COMPONENT COPY(H523_Curved) = COPY(PREVIOUS)
AT (0,0,COMP_GETPAR(PREVIOUS, l)+gGap) RELATIVE PREVIOUS
ROTATED (0,50.0/25.0/800*RAD2DEG,0) RELATIVE PREVIOUS

COMPONENT COPY(H523_Curved) = COPY(PREVIOUS)
AT (0,0,COMP_GETPAR(PREVIOUS, l)+gGap) RELATIVE PREVIOUS
ROTATED (0,50.0/25.0/800*RAD2DEG,0) RELATIVE PREVIOUS

COMPONENT COPY(H523_Curved) = COPY(PREVIOUS)
AT (0,0,COMP_GETPAR(PREVIOUS, l)+gGap) RELATIVE PREVIOUS
ROTATED (0,50.0/25.0/800*RAD2DEG,0) RELATIVE PREVIOUS

COMPONENT COPY(H523_Curved) = COPY(PREVIOUS)
AT (0,0,COMP_GETPAR(PREVIOUS, l)+gGap) RELATIVE PREVIOUS
ROTATED (0,50.0/25.0/800*RAD2DEG,0) RELATIVE PREVIOUS

COMPONENT COPY(HCS_Al) = COPY(HCS_Al)(xwidth=0.06,yheight=0.12)
AT (0,0,COMP_GETPAR(PREVIOUS, l)+gGap+0.001) RELATIVE PREVIOUS

/* VTE space+OT H53: 108 mm + 2 mm Al window */

COMPONENT H523_VTE = COPY(H5)(xwidth=0.06, restore_neutron=1)
AT (0,0,0.108/2-0.001) RELATIVE PREVIOUS

COMPONENT COPY(HCS_Al) = COPY(HCS_Al)(zdepth=0.002,xwidth=0.06,yheight=0.12)
AT (0,0,0.108/2-0.05) RELATIVE PREVIOUS

COMPONENT COPY(H523_Curved) = COPY(H5_rect)(w1=0.06, h1=0.12,l=50.0/25, m=1.2, mright=1.5)
AT (0,0,0.003+gGap) RELATIVE PREVIOUS
ROTATED (0,50.0/25.0/800*RAD2DEG,0) RELATIVE PREVIOUS

COMPONENT COPY(H523_Curved) = COPY(PREVIOUS)
AT (0,0,COMP_GETPAR(PREVIOUS, l)+gGap) RELATIVE PREVIOUS
ROTATED (0,50.0/25.0/800*RAD2DEG,0) RELATIVE PREVIOUS

COMPONENT COPY(H523_Curved) = COPY(PREVIOUS)
AT (0,0,COMP_GETPAR(PREVIOUS, l)+gGap) RELATIVE PREVIOUS
ROTATED (0,50.0/25.0/800*RAD2DEG,0) RELATIVE PREVIOUS

COMPONENT COPY(H523_Curved) = COPY(PREVIOUS)
AT (0,0,COMP_GETPAR(PREVIOUS, l)+gGap) RELATIVE PREVIOUS
ROTATED (0,50.0/25.0/800*RAD2DEG,0) RELATIVE PREVIOUS

COMPONENT COPY(H523_Curved) = COPY(PREVIOUS)
AT (0,0,COMP_GETPAR(PREVIOUS, l)+gGap) RELATIVE PREVIOUS
ROTATED (0,50.0/25.0/800*RAD2DEG,0) RELATIVE PREVIOUS

COMPONENT COPY(H523_Curved) = COPY(PREVIOUS)
AT (0,0,COMP_GETPAR(PREVIOUS, l)+gGap) RELATIVE PREVIOUS
ROTATED (0,50.0/25.0/800*RAD2DEG,0) RELATIVE PREVIOUS

COMPONENT COPY(H523_Curved) = COPY(PREVIOUS)
AT (0,0,COMP_GETPAR(PREVIOUS, l)+gGap) RELATIVE PREVIOUS
ROTATED (0,50.0/25.0/800*RAD2DEG,0) RELATIVE PREVIOUS

COMPONENT COPY(H523_Curved) = COPY(PREVIOUS)
AT (0,0,COMP_GETPAR(PREVIOUS, l)+gGap) RELATIVE PREVIOUS
ROTATED (0,50.0/25.0/800*RAD2DEG,0) RELATIVE PREVIOUS

COMPONENT COPY(H523_Curved) = COPY(PREVIOUS)
AT (0,0,COMP_GETPAR(PREVIOUS, l)+gGap) RELATIVE PREVIOUS
ROTATED (0,50.0/25.0/800*RAD2DEG,0) RELATIVE PREVIOUS

COMPONENT COPY(H523_Curved) = COPY(PREVIOUS)
AT (0,0,COMP_GETPAR(PREVIOUS, l)+gGap) RELATIVE PREVIOUS
ROTATED (0,50.0/25.0/800*RAD2DEG,0) RELATIVE PREVIOUS

COMPONENT COPY(H523_Curved) = COPY(PREVIOUS)
AT (0,0,COMP_GETPAR(PREVIOUS, l)+gGap) RELATIVE PREVIOUS
ROTATED (0,50.0/25.0/800*RAD2DEG,0) RELATIVE PREVIOUS

COMPONENT COPY(H523_Curved) = COPY(PREVIOUS)
AT (0,0,COMP_GETPAR(PREVIOUS, l)+gGap) RELATIVE PREVIOUS
ROTATED (0,50.0/25.0/800*RAD2DEG,0) RELATIVE PREVIOUS

COMPONENT COPY(H523_Curved) = COPY(PREVIOUS)
AT (0,0,COMP_GETPAR(PREVIOUS, l)+gGap) RELATIVE PREVIOUS
ROTATED (0,50.0/25.0/800*RAD2DEG,0) RELATIVE PREVIOUS

COMPONENT COPY(H523_Curved) = COPY(PREVIOUS)
AT (0,0,COMP_GETPAR(PREVIOUS, l)+gGap) RELATIVE PREVIOUS
ROTATED (0,50.0/25.0/800*RAD2DEG,0) RELATIVE PREVIOUS

COMPONENT COPY(H523_Curved) = COPY(PREVIOUS)
AT (0,0,COMP_GETPAR(PREVIOUS, l)+gGap) RELATIVE PREVIOUS
ROTATED (0,50.0/25.0/800*RAD2DEG,0) RELATIVE PREVIOUS

COMPONENT COPY(H523_Curved) = COPY(PREVIOUS)
AT (0,0,COMP_GETPAR(PREVIOUS, l)+gGap) RELATIVE PREVIOUS
ROTATED (0,50.0/25.0/800*RAD2DEG,0) RELATIVE PREVIOUS

COMPONENT COPY(H523_Curved) = COPY(PREVIOUS)
AT (0,0,COMP_GETPAR(PREVIOUS, l)+gGap) RELATIVE PREVIOUS
ROTATED (0,50.0/25.0/800*RAD2DEG,0) RELATIVE PREVIOUS

COMPONENT COPY(H523_Curved) = COPY(PREVIOUS)
AT (0,0,COMP_GETPAR(PREVIOUS, l)+gGap) RELATIVE PREVIOUS
ROTATED (0,50.0/25.0/800*RAD2DEG,0) RELATIVE PREVIOUS

COMPONENT COPY(H523_Curved) = COPY(PREVIOUS)
AT (0,0,COMP_GETPAR(PREVIOUS, l)+gGap) RELATIVE PREVIOUS
ROTATED (0,50.0/25.0/800*RAD2DEG,0) RELATIVE PREVIOUS

COMPONENT COPY(H523_Curved) = COPY(PREVIOUS)
AT (0,0,COMP_GETPAR(PREVIOUS, l)+gGap) RELATIVE PREVIOUS
ROTATED (0,50.0/25.0/800*RAD2DEG,0) RELATIVE PREVIOUS

COMPONENT COPY(HCS_Al) = COPY(HCS_Al)(xwidth=0.06,yheight=0.12)
AT (0,0,COMP_GETPAR(PREVIOUS, l)+gGap) RELATIVE PREVIOUS

                              /* Cryo-EDM */
                              
COMPONENT H523_CryoEDM_In = Arm()
AT (0,0,CryoEDM_L)         RELATIVE PREVIOUS

COMPONENT H523_CryoEDM_In_L = Monitor_nD(xwidth=0.06, yheight=0.12,
  options="lambda limits=[1 10]", bins=100, restore_neutron=1)
AT (0,0,0) RELATIVE H523_CryoEDM_In

COMPONENT H523_CryoEDM_mirror_center = Arm()
AT (0,0,2.45/2) RELATIVE H523_CryoEDM_In

COMPONENT H523_CryoEDM_polariser = Pol_mirror(zwidth = 2.45, yheight = 0.055, 
  rUpPar  ={1.0, 0.0219, 4.07, 3.2, 0.003},
  rDownPar={0.1, 0.0219, 4.07, 3.2, 0.003}, p_reflect=0.95)
AT (0, 0, 0) RELATIVE H523_CryoEDM_mirror_center
ROTATED (0, 2, 0) RELATIVE H523_CryoEDM_mirror_center
EXTEND %{
  flag=SCATTERED;
%}

COMPONENT H523_CryoEDM_mirror_outdir = Arm()
AT (0,0,0) RELATIVE H523_CryoEDM_mirror_center
ROTATED (0, 4, 0) RELATIVE H523_CryoEDM_mirror_center

COMPONENT H523_CryoEDM_mirror_ReflectXY = Monitor_nD(xwidth=0.04, restore_neutron=1, yheight=0.055, bins=50)
WHEN flag==1
AT (0,0,2.5/2)                  RELATIVE H523_CryoEDM_mirror_outdir

COMPONENT H523_CryoEDM_mirror_TransmitXY = COPY(H523_CryoEDM_mirror_ReflectXY)
WHEN flag==2
AT (0,0,2.5/2)                  RELATIVE H523_CryoEDM_mirror_center
EXTEND %{
  if (flag == 2) ABSORB;
%}

COMPONENT H523_CryoEDM_Sample_L = Monitor_nD(xwidth=0.06, yheight=0.12,
  options="lambda limits=[1 10]", bins=100, restore_neutron=1)
AT (0,0,2.45/2+0.2) RELATIVE H523_CryoEDM_mirror_outdir
                              
COMPONENT H523_CryoEDM_Sample_Div = COPY(H523_CryoEDM_Sample_L)(options="dx limits=[-2 2], dy limits=[-2 2]")
AT (0,0,0) RELATIVE H523_CryoEDM_Sample_L

COMPONENT H523_CryoEDM_Sample_XY = COPY(H523_CryoEDM_Sample_L)(options="x y")
AT (0,0,0) RELATIVE H523_CryoEDM_Sample_L
EXTEND %{
  ABSORB; /* end of H53 */
%}

/* ================================ H51 ===================================== */
/* feeds: IN15, D22 */

COMPONENT H51_start = Arm()
AT (0,0,0) RELATIVE H51_origin

COMPONENT H51_inpile = COPY(H5_rect)(w1=0.04, m=1.2, l=4.930-3.155)
AT (0,0,0) RELATIVE PREVIOUS

COMPONENT H51_Obt_1 = COPY(PREVIOUS)(l=0.863)
AT (0,0,4.930-3.155+0.025) RELATIVE PREVIOUS

COMPONENT H51_Obt_2 = COPY(PREVIOUS)(l=1.433)
AT (0,0,0.863+0.012) RELATIVE PREVIOUS

COMPONENT H51_Obt_3 = COPY(PREVIOUS)(l=0.745)
AT (0,0,1.433+0.012) RELATIVE PREVIOUS

COMPONENT COPY(HCS_Al) = COPY(HCS_Al)(xwidth=0.04)
AT (0,0,0.745+0.01) RELATIVE PREVIOUS

/* Gap 75 mm after BOG (barillet obturateur general): VS */

COMPONENT H51_Obt_Out = COPY(H5)(xwidth=0.04, restore_neutron=1)
AT (0,0,0.06) RELATIVE PREVIOUS

COMPONENT COPY(HCS_Al) = COPY(HCS_Al)(xwidth=0.04)
AT (0,0,0) RELATIVE PREVIOUS

/* Sections 2,3 in NoteDPT11/H51 - curved R=3000 m. Length=2.5 m down to splitter */
/* Carter VS+Movable+Common                                                   */

COMPONENT H51_S2 = COPY(H53_inpile)(w1=0.04, l=2.5/3, m=1.2)
AT (0,0,0.05)                      RELATIVE PREVIOUS

COMPONENT COPY(H51_S2) = COPY(H51_S2)
AT (0,0,2.5/3)                    RELATIVE PREVIOUS
ROTATED (0,-2.5/3/3000*RAD2DEG,0) RELATIVE PREVIOUS

COMPONENT COPY(H51_S2) = COPY(H51_S2)
AT (0,0,2.5/3)                    RELATIVE PREVIOUS
ROTATED (0,-2.5/3/3000*RAD2DEG,0) RELATIVE PREVIOUS

COMPONENT HCS_Al_H51 = COPY(HCS_Al)(xwidth=0.04)
AT (0,0,2.5/3+0.01) RELATIVE PREVIOUS

/* Splitter (polarising "Deviateur") H511/H512 L=1.5                          */
/* D22 in transmission, IN15 in reflection: 79.70-76.45 = 3.25 deg angle      */
/* bottom   part direct to d22 height=55mm                                    */
/* top part part in reflection to in15 height=55mm: transmitted part lost     */

/* split the beam to either D22 or IN15  (monitors)                           */
COMPONENT H51_S2_Out = COPY(H5)(xwidth=0.04, yheight=0.12)
AT (0,0,0.05) RELATIVE PREVIOUS

COMPONENT H51_split_2 = COPY(H5)(xwidth=0.04, restore_neutron=1, yheight=0.055)
AT (0,0.12/2-0.055/2,0)  RELATIVE H51_S2_Out
JUMP H512_Start WHEN SCATTERED

COMPONENT H51_split_1 = COPY(H5)(xwidth=0.04, restore_neutron=1, yheight=0.055)
AT (0,-0.12/2+0.055/2,0)  RELATIVE H51_S2_Out
JUMP H511_Start WHEN SCATTERED

/* H511 bottom to IN15 ====================================================== */
COMPONENT H511_Start = Arm()
AT (0,0,0) RELATIVE H51_split_1

COMPONENT H511_mirror_centre = Arm()
AT (0,0,0.75) RELATIVE H511_Start
EXTEND %{
  flag=0;
%}

/* polarising splitter: an iterating assembly of polarising */
/* The single polariser is enough and simpler to handle. We ignore the surrouding m=1.2 guide */
COMPONENT IN15_polariser = Pol_mirror(zwidth = 1.5, yheight = 0.055, 
  rUpPar  ={1.0, 0.0219, 4.07, 3.2, 0.003},
  rDownPar={0.1, 0.0219, 4.07, 3.2, 0.003}, p_reflect=0.95)
AT (0, 0, 0) RELATIVE H511_mirror_centre ROTATED (0, -1.5, 0) RELATIVE H511_mirror_centre
EXTEND %{
  flag=SCATTERED;
%}

COMPONENT H511_mirror_outdir = Arm()
AT (0,0,0) RELATIVE H511_mirror_centre ROTATED (0, -3, 0) RELATIVE H511_mirror_centre

COMPONENT H511_mirror_ReflectXY = Monitor_nD(xwidth=0.04, restore_neutron=1, yheight=0.055, bins=50)
WHEN flag==1
AT (0,0,0.755)                  RELATIVE H511_mirror_outdir

COMPONENT H511_mirror_TransmitXY = COPY(H511_mirror_ReflectXY)
WHEN flag==2
AT (0,0,0.755)                  RELATIVE H511_mirror_centre
EXTEND %{
  if (flag == 2) ABSORB;
%}

COMPONENT H511_mirror_outdXY = COPY(H511_mirror_ReflectXY)(options="dx limits=[-2 2], dy limits=[-2 2]")
AT (0,0,0)                      RELATIVE H511_mirror_ReflectXY

COMPONENT H511_S3 = COPY(H51_S2)(l=3, nelements=2, h1=0.055)
AT (0,0,0.755)                      RELATIVE H511_mirror_outdir

COMPONENT H511_S9 = COPY(H51_S2)(l=16.483-0.05, nelements=13, m=1, h1=0.055)
AT (0,0,3.005)                      RELATIVE PREVIOUS

COMPONENT COPY(HCS_Al) = COPY(HCS_Al)(xwidth=0.04)
AT (0,0,16.483+0.001-0.05) RELATIVE PREVIOUS

/* VTE space+OT H511: 108 mm + 2 mm Al window */

COMPONENT H511_VTE = COPY(H5)(xwidth=0.06, restore_neutron=1)
AT (0,0,0.108/2-0.001) RELATIVE PREVIOUS

COMPONENT COPY(HCS_Al) = COPY(HCS_Al)(thickness=0.002,xwidth=0.04)
AT (0,0,0.108/2-0.05) RELATIVE PREVIOUS

COMPONENT H511_S10 = COPY(H51_S2)(l=1, m=1, h1=0.055)
AT (0,0,0.05) RELATIVE PREVIOUS

/* IN15 Velocity Selector EADS/Astrium NVS 024 in 60 cm gap */
COMPONENT IN15_Vselector = V_selector(xwidth=0.04, yheight=0.055, zdepth=0.30, radius=0.12, 
  alpha=64.4, length=0.25, d=0.0004, nu=IN15_nu, nslit=36)
AT (0,0,1+0.3) RELATIVE H511_S10

/* H511/IN15 guide L=9.5 m, m=1 */
COMPONENT H511_BeforeV = COPY(H511_S10)(l=9.5,nelements=6)
AT (0,0,0.3) RELATIVE PREVIOUS

/* IN15 polarising V-mirror                                       */
COMPONENT IN15_Vpolariser = Pol_guide_vmirror(xwidth = 0.04, yheight = 0.055, 
		  length = 0.43, 		  
		  rPar    ={1, 1.0*0.0219, 4.07, 1, 0.003},
		  rUpPar  ={1, 3.2*0.0219, 4.07, 1, 0.003},
		  rDownPar={1, 0.4*0.0219, 4.07, 1, 0.003})
AT (0,0,9.5+0.01) RELATIVE PREVIOUS

COMPONENT H511_AfterV = COPY(H511_S10)(l=3, nelements=2)
AT (0,0,0.44) RELATIVE PREVIOUS

/* sample at 3.7 m */
COMPONENT H511_IN15_Sample_Div = Monitor_nD(xwidth=0.02, yheight=0.05,
  options="dx limits=[-2 2], dy limits=[-2 2]", bins=100, restore_neutron=1)
AT (0,0,IN15_L) RELATIVE H511_AfterV

COMPONENT H511_IN15_Sample_XY = Monitor_nD(xwidth=0.02, yheight=0.05,
  options="x y", bins=50, restore_neutron=1)
AT (0,0,IN15_L) RELATIVE H511_AfterV

COMPONENT H511_IN15_Sample_L = Monitor_nD(xwidth=0.02, yheight=0.05,
  options="lambda limits=[1 10]", bins=50, restore_neutron=1)
AT (0,0,IN15_L) RELATIVE H511_AfterV

COMPONENT H511_IN15_Sample = Incoherent(radius=0.005,yheight=0.05, 
  focus_aw=180, focus_ah=30, target_index=+1)
AT (0,0,IN15_L) RELATIVE H511_AfterV
EXTEND %{
  if (!SCATTERED) ABSORB;
%}

COMPONENT H511_IN15_Detector = Monitor_nD(xwidth=0.32, yheight=0.32,
  options="x y", restore_neutron=1, bins=32)
AT (0,0,4.6) RELATIVE H511_IN15_Sample

COMPONENT H511_IN15_Spectrometer = Monitor_nD(radius=0.5, yheight=0.3,
  options="angle limits=[-150 150] bins=50, energy limits=[0 5], banana", restore_neutron=1)
AT (0,0,0) RELATIVE H511_IN15_Sample

COMPONENT H511_IN15_Diffractometer = Monitor_nD(radius=1,yheight=0.3, options="theta bins=100 limits=[-150 150], y, banana")
AT (0,0,0) RELATIVE H511_IN15_Sample
EXTEND %{
  ABSORB; /* neutron ends on the SuperADAM sample position */
%}

/* H512 top to D22 ========================================================== */ 
COMPONENT H512_Start = Arm()
AT (0,0,0) RELATIVE H51_split_2

/* Sections 3,4,5,6 in NoteDPT11/H51 - curved R=3000 m. Length=2.5 m down to VTE */
/* Carter C1-C4                                                               */

COMPONENT H512_S36 = COPY(H53_inpile)(w1=0.04, l=20.85/16, h1=0.055,m=1.2)
AT (0,0,0.0)                      RELATIVE PREVIOUS

COMPONENT COPY(H512_S36) = COPY(H512_S36)
AT (0,0,20.85/16)                    RELATIVE PREVIOUS
ROTATED (0,-20.85/16/3000*RAD2DEG,0) RELATIVE PREVIOUS

COMPONENT COPY(H512_S36) = COPY(H512_S36)
AT (0,0,20.85/16)                    RELATIVE PREVIOUS
ROTATED (0,-20.85/16/3000*RAD2DEG,0) RELATIVE PREVIOUS

COMPONENT COPY(H512_S36) = COPY(H512_S36)
AT (0,0,20.85/16)                    RELATIVE PREVIOUS
ROTATED (0,-20.85/16/3000*RAD2DEG,0) RELATIVE PREVIOUS

COMPONENT COPY(H512_S36) = COPY(H512_S36)
AT (0,0,20.85/16)                    RELATIVE PREVIOUS
ROTATED (0,-20.85/16/3000*RAD2DEG,0) RELATIVE PREVIOUS

COMPONENT COPY(H512_S36) = COPY(H512_S36)
AT (0,0,20.85/16)                    RELATIVE PREVIOUS
ROTATED (0,-20.85/16/3000*RAD2DEG,0) RELATIVE PREVIOUS

COMPONENT COPY(H512_S36) = COPY(H512_S36)
AT (0,0,20.85/16)                    RELATIVE PREVIOUS
ROTATED (0,-20.85/16/3000*RAD2DEG,0) RELATIVE PREVIOUS

COMPONENT COPY(H512_S36) = COPY(H512_S36)
AT (0,0,20.85/16)                    RELATIVE PREVIOUS
ROTATED (0,-20.85/16/3000*RAD2DEG,0) RELATIVE PREVIOUS

COMPONENT COPY(H512_S36) = COPY(H512_S36)
AT (0,0,20.85/16)                    RELATIVE PREVIOUS
ROTATED (0,-20.85/16/3000*RAD2DEG,0) RELATIVE PREVIOUS

COMPONENT COPY(H512_S36) = COPY(H512_S36)
AT (0,0,20.85/16)                    RELATIVE PREVIOUS
ROTATED (0,-20.85/16/3000*RAD2DEG,0) RELATIVE PREVIOUS

COMPONENT COPY(H512_S36) = COPY(H512_S36)
AT (0,0,20.85/16)                    RELATIVE PREVIOUS
ROTATED (0,-20.85/16/3000*RAD2DEG,0) RELATIVE PREVIOUS

COMPONENT COPY(H512_S36) = COPY(H512_S36)
AT (0,0,20.85/16)                    RELATIVE PREVIOUS
ROTATED (0,-20.85/16/3000*RAD2DEG,0) RELATIVE PREVIOUS

COMPONENT COPY(H512_S36) = COPY(H512_S36)
AT (0,0,20.85/16)                    RELATIVE PREVIOUS
ROTATED (0,-20.85/16/3000*RAD2DEG,0) RELATIVE PREVIOUS

COMPONENT COPY(H512_S36) = COPY(H512_S36)
AT (0,0,20.85/16)                    RELATIVE PREVIOUS
ROTATED (0,-20.85/16/3000*RAD2DEG,0) RELATIVE PREVIOUS

COMPONENT COPY(H512_S36) = COPY(H512_S36)
AT (0,0,20.85/16)                    RELATIVE PREVIOUS
ROTATED (0,-20.85/16/3000*RAD2DEG,0) RELATIVE PREVIOUS

COMPONENT COPY(H512_S36) = COPY(H512_S36)
AT (0,0,20.85/16)                    RELATIVE PREVIOUS
ROTATED (0,-20.85/16/3000*RAD2DEG,0) RELATIVE PREVIOUS

COMPONENT HCS_Al_H512 = COPY(HCS_Al)(xwidth=0.04)
AT (0,0,20.85/16+0.01) RELATIVE PREVIOUS

/* VTE space+OT H512: 108 mm + 2 mm Al window */

COMPONENT H512_VTE = COPY(H5)(xwidth=0.06, restore_neutron=1)
AT (0,0,0.108/2-0.001) RELATIVE PREVIOUS

COMPONENT COPY(HCS_Al) = COPY(HCS_Al)(thickness=0.002,xwidth=0.04)
AT (0,0,0.108/2-0.05) RELATIVE PREVIOUS

COMPONENT H51_S78 = COPY(H53_inpile)(w1=0.04, l=6.0/4,h1=0.055,m=1.2)
AT (0,0,0.05)                      RELATIVE PREVIOUS

COMPONENT COPY(H51_S78) = COPY(H51_S78)
AT (0,0,6.0/4)                    RELATIVE PREVIOUS
ROTATED (0,-6.0/4/3000*RAD2DEG,0) RELATIVE PREVIOUS

COMPONENT COPY(H51_S78) = COPY(H51_S78)
AT (0,0,6.0/4)                    RELATIVE PREVIOUS
ROTATED (0,-6.0/4/3000*RAD2DEG,0) RELATIVE PREVIOUS

COMPONENT COPY(H51_S78) = COPY(H51_S78)
AT (0,0,6.0/4)                    RELATIVE PREVIOUS
ROTATED (0,-6.0/4/3000*RAD2DEG,0) RELATIVE PREVIOUS

COMPONENT COPY(HCS_Al) = COPY(HCS_Al)(thickness=0.002, xwidth=0.04)
AT (0,0,6.0/4+0.01) RELATIVE PREVIOUS

/* 3 m to V selector, straight */

COMPONENT H512_S11 = COPY(H53_inpile)(w1=0.04, l=3.0, nelements=2, h1=0.055, m=1.2)
AT (0,0,0.01)                      RELATIVE PREVIOUS

COMPONENT COPY(HCS_Al) = COPY(HCS_Al)(xwidth=0.04)
AT (0,0,3+0.01) RELATIVE PREVIOUS

COMPONENT D22_PreV = Monitor_nD(xwidth=0.04, yheight=0.05,
  options="x y", bins=50, restore_neutron=1)
AT (0,0,0.01) RELATIVE PREVIOUS

/* D22 Velocity Selector: just like D11 EADS/Astrium NVS 023 in 60 cm gap */
COMPONENT D22_Vselector = V_selector(xwidth=0.04, yheight=0.05, zdepth=0.30, radius=0.12, 
  alpha=48.3, length=0.25, d=0.0004, nu=D22_nu, nslit=72)
AT (0,0,3+0.01+0.3+0.01) RELATIVE H512_S11

COMPONENT D22_Collimation = COPY(H53_inpile)(w1=0.04, h1=0.055,
  l=20-D22_collimation, nelements=ceil(D22_collimation/1.5),m=1.2)
AT (0,0,0.3) RELATIVE D22_Vselector

COMPONENT D22_Sample_Pos = Arm()
AT (0,0,20+0.3) RELATIVE D22_Vselector

COMPONENT H51_D22_Sample_Div = Monitor_nD(xwidth=0.02, yheight=0.05,
  options="dx limits=[-2 2], dy limits=[-2 2]", bins=100, restore_neutron=1)
AT (0,0,0) RELATIVE D22_Sample_Pos

COMPONENT H51_D22_Sample_XY = Monitor_nD(xwidth=0.02, yheight=0.05,
  options="x y", bins=50, restore_neutron=1)
AT (0,0,0) RELATIVE D22_Sample_Pos

COMPONENT H51_D22_Sample_L = Monitor_nD(xwidth=0.02, yheight=0.05,
  options="lambda limits=[1 10]", bins=50, restore_neutron=1)
AT (0,0,0) RELATIVE D22_Sample_Pos

COMPONENT H51_D22_Sample = Isotropic_Sqw(radius=0.005,yheight=0.05, 
  Sqw_coh=D22_sample, Sqw_inc=NULL, d_phi=20)
AT (0,0,0) RELATIVE D22_Sample_Pos
EXTEND %{
  if (!SCATTERED) ABSORB;
%}

COMPONENT D22_Detector = Monitor_nD(xwidth=1, yheight=1, options="x y", bins=128)
AT (0,0,D22_collimation) RELATIVE D22_Sample_Pos
EXTEND %{
  ABSORB; /* H512 end here */
%}

COMPONENT D22_Detector_vessel = Shape(radius=1.5, yheight=20)
AT (0,0,11) RELATIVE D22_Sample_Pos ROTATED (90,0,0) RELATIVE D22_Sample_Pos
/* NOTE: wasp 75*120 V selector

/* ========================= end of simulation ============================== */

/* inactive components for rendering purposes */
COMPONENT BOG = Shape(radius=0.735, yheight=0.3)
AT (0,0,6.55) RELATIVE HCS

COMPONENT H53_ThALES_Drum = Shape(radius=0.45, yheight=0.3)
AT (0,0,0) RELATIVE H53_ThALES_Monochromator_Cradle

COMPONENT H521_D16_Drum = Shape(radius=0.2, yheight=0.3)
AT (0,0,0) RELATIVE H521_D16_Monochromator_Cradle

COMPONENT H521_SADAM_Drum = Shape(radius=0.2, yheight=0.3)
AT (0,0,0) RELATIVE H521_SADAM_Monochromator_Cradle

COMPONENT Traversee = Shape(xwidth=2, yheight=0.5)
AT (0,0,31.6) RELATIVE HCS

/* core at 0.7 m, 44.8 deg */
COMPONENT Core_Centre = Arm()
AT (0,0,0) RELATIVE HCS ROTATED (0,44.8+180,0) RELATIVE HCS

/* core radius=0.3 m */
COMPONENT Core = Shape (radius=0.3, yheight=0.7)
AT (0,0,0.7) RELATIVE Core_Centre ROTATED (0,0,0) RELATIVE Origin

/* D2O vessel radius=1.25 m */
COMPONENT D2O_Vessel = Shape (radius=1.25, yheight=1)
AT (0,0,0) RELATIVE Core

/* H2O vessel radius=1.25 m */
COMPONENT H2O_Vessel = Shape (radius=4.9, yheight=1.2)
AT (0,0,0) RELATIVE Core

END

