/***************************************************************************
*         McStas instrument definition URL=http://www.mcstas.org
*
* Instrument: Test_Magnetic_Constant
*
* %Identification
* Written by: Peter Christiansen and Peter Willendrup
* Date: August 2006
* Origin: RISOE
* %INSTRUMENT_SITE: Tests_polarization
*
* This instrument demonstrates how to use the Pol_Bfield
* component with a constant field.
*
* %Description
* This instrument demonstrates how to use the component
* Pol_Bfield with a constant field to make a Mezei Spin flipper.
*
* This instrument matches the example: Test_Pol_MSF (under tests)
* made with the old component: Pol_constBfield
*
* %Example: ROT_ANGLE=180 Detector: pollambdaMonitor2z_I=0.0768972
* %Example: ROT_ANGLE=180 ONOFF=1 Detector: pollambdaMonitor2z_I=0.0768972
* %Example: ROT_ANGLE=180 ONOFF=2 Detector: pollambdaMonitor2z_I=0.0768972
* %Example: ROT_ANGLE=180 ONOFF=3 Detector: pollambdaMonitor2z_I=0.0768972
*
* %Parameters
* ROT_ANGLE: [deg]  Angle that the spin of a 5AA neutron rotates in the 0.2 m magnet
* ONOFF: [ ]        Should we use a window description (with a _stop comp) to turn the field on and off.
* %Link
*
* %End
****************************************************************************/
DEFINE INSTRUMENT Test_Magnetic_Constant(ROT_ANGLE=180, ONOFF=0)

/* The DECLARE section allows us to declare variables or  small      */
/* functions in C syntax. These may be used in the whole instrument. */
DECLARE
%{
  const double LAMBDA       = 5.0; // AA
  const double DLAMBDA      = 4.9; // AA
  const double MAGNETLENGTH = 0.2; // m
  double BVALUE;
%}

/* The INITIALIZE section is executed when the simulation starts     */
/* (C code). You may use them as component parameter values.         */
INITIALIZE
%{
  BVALUE = GetConstantField(MAGNETLENGTH, LAMBDA, ROT_ANGLE);
  printf("By should be %f T, to be able to rotate a %f AA neutron\n"
	 " %f degrees over a length of %f m\n",
	 BVALUE, LAMBDA, ROT_ANGLE, MAGNETLENGTH);
%}

/* Here comes the TRACE section, where the actual      */
/* instrument is defined as a sequence of components.  */
TRACE

/* The Arm() class component defines reference points and orientations  */
/* in 3D space. Every component instance must have a unique name. Here, */
/* Origin is used. This Arm() component is set to define the origin of  */
/* our global coordinate system (AT (0,0,0) ABSOLUTE). It may be used   */
/* for further RELATIVE reference, Other useful keywords are : ROTATED  */
/* EXTEND GROUP PREVIOUS. Also think about adding a neutron source !    */
/* Progress_bar is an Arm displaying simulation progress.               */
COMPONENT Origin = Progress_bar()
  AT (0,0,0) ABSOLUTE

COMPONENT source =
Source_simple(radius = 0.01, dist = 1.0, focus_xw = 0.05, focus_yh = 0.05,
	      lambda0 = LAMBDA, dlambda = DLAMBDA, flux = 1)
     AT (0, 0, 0) RELATIVE Origin

COMPONENT polSetter =
Set_pol(px=1)
     AT (0, 0, 0.5) RELATIVE Origin

COMPONENT pollambdaMonitor1x =
PolLambda_monitor(xwidth=0.1, yheight=0.1,
		  nL=100, Lmin = 0.0, Lmax = 10.0, npol=21,
		  mx=1, my=0, mz=0, filename="pollambdaMon1x.data")
     AT (0, 0, 0.7) RELATIVE Origin

COMPONENT pollambdaMonitor1y =
PolLambda_monitor(xwidth=0.1, yheight=0.1,
		  nL=100, Lmin = 0.0, Lmax = 10.0, npol=21,
		  mx=0, my=1, mz=0, filename="pollambdaMon1y.data")
     AT (0, 0, 0.75) RELATIVE Origin

COMPONENT pollambdaMonitor1z =
PolLambda_monitor(xwidth=0.1, yheight=0.1,
		  nL=100, Lmin = 0.0, Lmax = 10.0, npol=21,
		  mx=0, my=0, mz=1, filename="pollambdaMon1z.data")
     AT (0, 0, 0.8) RELATIVE Origin

COMPONENT armMSF = Arm()
     AT (0,0,1) RELATIVE Origin

// The By field is set to rotate the spin 180 degrees for neutrons of wavelenth
// 5 AA

COMPONENT msf =
  Pol_Bfield(field_type=1, xwidth=0.08, yheight=0.08, zdepth=MAGNETLENGTH, Bx=0, By=BVALUE, Bz=0, concentric = 0)
WHEN (!ONOFF) AT (0, 0, 0) RELATIVE armMSF

COMPONENT msf_onoff =
  Pol_Bfield(field_type=1, xwidth=0.08, yheight=0.08, Bx=0, By=BVALUE, Bz=0, concentric = 1)
WHEN (ONOFF==1) AT (0, 0, 0) RELATIVE armMSF

COMPONENT msf_onoff_stop = Pol_Bfield_stop( xwidth=0.08, yheight=0.08)
WHEN (ONOFF==1) AT (0, 0, MAGNETLENGTH) RELATIVE armMSF

COMPONENT msfieldbox =
  Pol_FieldBox(xwidth=0.08, yheight=0.08, zdepth=MAGNETLENGTH, Bx=0, By=BVALUE, Bz=0)
WHEN (ONOFF==2) AT (0, 0, 0) RELATIVE armMSF

COMPONENT msf_onoff2 =
  Pol_Bfield(field_type=1, xwidth=0.18, yheight=0.18, zdepth=MAGNETLENGTH, Bx=0, By=BVALUE, Bz=0, concentric = 1)
WHEN (ONOFF==3) AT (0, 0, MAGNETLENGTH/2.0) RELATIVE armMSF

COMPONENT msf_onoff2_stop = Pol_Bfield_stop( xwidth=0.18, yheight=0.18, zdepth=MAGNETLENGTH)
WHEN (ONOFF==3) AT (0, 0, MAGNETLENGTH/2.0) RELATIVE armMSF
 
COMPONENT pollambdaMonitor2x =
PolLambda_monitor(xwidth=0.1, yheight=0.1,
		  nL=100, Lmin = 0.0, Lmax = 10.0, npol=21,
		  mx=1, my=0, mz=0, filename="pollambdaMon2x.data")
     AT (0, 0, 0.3) RELATIVE armMSF

COMPONENT pollambdaMonitor2y =
PolLambda_monitor(xwidth=0.1, yheight=0.1,
		  nL=100, Lmin = 0.0, Lmax = 10.0, npol=21,
		  mx=0, my=1, mz=0, filename="pollambdaMon2y.data")
     AT (0, 0, 0.3) RELATIVE armMSF

COMPONENT pollambdaMonitor2z =
PolLambda_monitor(xwidth=0.1, yheight=0.1,
		  nL=100, Lmin = 0.0, Lmax = 10.0, npol=21,
		  mx=0, my=0, mz=1, filename="pollambdaMon2z.data")
     AT (0, 0, 0.3) RELATIVE armMSF

COMPONENT mpollambdaMonitor2x =
MeanPolLambda_monitor(xwidth=0.1, yheight=0.1,
		      nL=100, Lmin = 0.0, Lmax = 10.0,
		      mx=1, my=0, mz=0, filename="mpollambdaMon2x.data")
     AT (0, 0, 0.3) RELATIVE armMSF

COMPONENT mpollambdaMonitor2y =
MeanPolLambda_monitor(xwidth=0.1, yheight=0.1,
		      nL=100, Lmin = 0.0, Lmax = 10.0,
		      mx=0, my=1, mz=0, filename="mpollambdaMon2y.data")
     AT (0, 0, 0.3) RELATIVE armMSF

COMPONENT mpollambdaMonitor2z =
MeanPolLambda_monitor(xwidth=0.1, yheight=0.1,
		      nL=100, Lmin = 0.0, Lmax = 10.0,
		      mx=0, my=0, mz=1, filename="mpollambdaMon2z.data")
     AT (0, 0, 0.3) RELATIVE armMSF


/* This section is executed when the simulation ends (C code). Other    */
/* optional sections are : SAVE                                         */
FINALLY
%{
  %}
/* The END token marks the instrument definition end */
END
