/********************************************************************
*
* Instrument: ILL_H16_IN5
*
* %Identification
* Written by: E. Farhi, J. Ollivier, Celia Castan Guerrero
* Date: Jan 2004-2009
* Origin: ILL
*
* %INSTRUMENT_SITE: ILL
*
* The IN5B instrument: chopper system + sample + PSD and tof detector
*
* %Description
*
* The IN5@ILL TOF spectrometer from chopper system to final detector, with sample.
* The detector model includes Fe housing and tube cross talk absorbing masks
* with angle restriction (neutrons that scatter in Fe in front of a tube and
* enter a different tube are absorbed). This model does not include the H16 guide.
*
* %Example: lambda=4.5 Detector: Det_PSD_I=1.3e6
*
* %Parameters
* lambda: [AA] mean incident wavelength
* dlambda: [AA] wavelength half width.
* speed: [rpm] chopper speed (60*frequency)
* ratio: [1] velocity of chopper3 = velocity of chopper1 * ratio
* housing: [string] material used as detector housing. Use 0 or NULL for none.
* radius: [m] radius of sample (outer).
* thickness: [m] thickness of sample. 0=filled
* height: [m] height of sample. 0=sphere
* coh: [string] sample coherent data file or NULL. Use powder LAZ/LAU or SQW file.
* inc: [string] sample incoherent Sqw data file or NULL
* order: [1] order for scattering in sample. O=all, 1=single
* %Link
* The IN5@ILL cold time of flight instrument
*
* %E
************************************************************************/
DEFINE INSTRUMENT ILL_IN5(lambda=4.5,dlambda=0.05,speed=8500, ratio=0.5, string housing="Fe.laz", string coh="Y3Fe5O12_YIG.laz", string inc="NULL", thickness=0, height=0.025, radius=0.005, order=0)
DECLARE
%{
#define ntubes 384
//---Guide (1st part of guide) --------------------------------------
double L_Guide1, L_Guide21;
double L_Guide22, L_Guide23; // gerade dimensions
double L_Guide3, L_Guide41;
double L_Guide42, L_Guide43;
double L_Guide44, L_Guide45;
double L_Collimator, L_CollSample;
double L_gap, disk_gap,mono_gap;
//---Reactor & Krumm Guide coating (2nd part of guide) ------------
double alt_Guide_Qc,alt_Guide_Ro,alt_Guide_alpha,alt_Guide_W;
//---Neue Guide coating--------------------------------------------
double Guide_Qc,Guide_Ro,Guide_alpha,Guide_W;
//---Choppers-------------------------------------------------------
double Ch_mean_R[7]; // = rotation axis - guide axis
double Ch_width[7],Ch_height[7]; // slots widht and height
double Ch_alpha[7]; // angular aperture of choppers
double Ch_phase[7]; // matching (phase) time for choppers
double Ch_phase_angle[7]; // matching (angle) for choppers
double Ch_Ltot[7]; // distance - ref_time chopper
double Ch_Vp[7]; // angular velocity of choppers
double disk_N; // slot number on the disks
//---Sample-by-itself---------------------------------------------------
double L_sample;
//---Detector PSD-------------------------------------------------------
double ang_ini, ang_fin, det_angle;
%}
INITIALIZE
%{
int i;
double v0; // neutron mean velocity
//==========================================================================
// Guide
//==========================================================================
L_gap = 0.2130; // gap VTE+OT-H16
L_Guide1 = 4.3900; // for gerade Guide1
L_Guide21 = 0.6950; // for gerade Guide21
L_Guide22 = 0.1300; // for gerade Guide22
L_Guide23 = 0.69500; // for gerade Guide23
disk_gap = 0.02; // full gap at choppers
L_Guide3 = 5.5125; // for gerade Guide3
L_Guide41 = 0.7425; // for gerade Guide41
L_Guide42 = 0.0350; // for gerade Guide42
L_Guide43 = 0.7500; // for gerade Guide43
L_Guide44 = 0.0350; // for gerade Guide44
L_Guide45 = 0.7900; // for gerade Guide45
mono_gap = 0.0300; // gap for the 1st monitor
L_Collimator= 0.1300; // for gerade Collimator
L_CollSample= 0.2400-0.025; // the sample chamber size & keep
printf("Instrument: %s (IN5 disk chopper time-of-flight spectrometer).\n Wavelength lambda=%g [Angs]\n",
NAME_CURRENT_COMP, lambda);
// Alt Guide coating
alt_Guide_Qc = 0.021745; // for m=1 alpha and W aren't used.
alt_Guide_Ro = 0.995;
alt_Guide_alpha = 6.07;
alt_Guide_W = 0.0023;
// New Guide and super-mirors
Guide_Qc = 0.02275;
Guide_Ro = 0.996;
Guide_alpha = 5.75;
Guide_W = 0.00125;
//==========================================================================
// Choppers
//==========================================================================
Ch_mean_R[0] = 0.285; //
Ch_mean_R[1] = 0.285; //
Ch_mean_R[2] = 0.285; //
Ch_mean_R[3] = 0.299; // = rotation axis - guide axis
Ch_mean_R[4] = 0.299; //
Ch_mean_R[5] = 0.304; //
Ch_mean_R[6] = 0.304; //
Ch_height[0] = 0.2; //
Ch_height[1] = 0.17 ; //
Ch_height[2] = 0.16813; //
Ch_height[3] = 0.081; // Height of the disk which "see" the guide
Ch_height[4] = 0.08031; //
Ch_height[5] = 0.07069; //
Ch_height[6] = 0.0700; //
Ch_alpha[0] = 9.0; //
Ch_alpha[1] = 9.0; //
Ch_alpha[2] = 9.0; //
Ch_alpha[3] = 9.5; // angular apperture of choppers [degrees]
Ch_alpha[4] = 9.5; //
Ch_alpha[5] = 3.25; //
Ch_alpha[6] = 3.25; //
disk_N = 2;
for (i=1;i<=6;i++){
Ch_Vp[i] = 0.0;
Ch_Ltot[i] = 0.0;
//printf("Ch%d: Rmin = %f, alpha = %f\n",i,Ch_mean_R[i],Ch_alpha[i]);
//printf("Alpha_guide at Ch. %d = %f deg\n",i,Gu_alpha[i]*180/PI);
}
if (speed==0){
printf("FATAL ERROR: Chopper speed = 0 !");
exit(-1);
}
// set the choppers speed [rad/s]
Ch_Vp[0] = speed*2*PI/60;
Ch_Vp[1] = speed*2*PI/60;
Ch_Vp[2] = speed*2*PI/60;
Ch_Vp[3] = speed*2*PI/60*ratio;
Ch_Vp[4] = speed*2*PI/60;
Ch_Vp[5] = speed*2*PI/60;
Ch_Vp[6] = speed*2*PI/60;
v0 = 3956.035/lambda;
//----------------------------------------------------------------
// Compute the phases of each choppers
//-------------------------------------
// Zero time at chopper 0
// 1st compute the distance from the zero time position for each chopper
// 2nd compute the phase as distance/velocity, it means, the time delay
//----------------------------------------------------------------
Ch_Ltot[0] = 0;
Ch_Ltot[1] = L_gap+L_Guide1+0.0003+L_Guide21+disk_gap/2.0;
Ch_Ltot[2] = Ch_Ltot[1]+disk_gap+L_Guide22;
Ch_Ltot[3] = Ch_Ltot[2]+disk_gap+L_Guide23+L_Guide3+L_Guide41+2*0.0003;
Ch_Ltot[4] = Ch_Ltot[3]+disk_gap+L_Guide42;
Ch_Ltot[5] = Ch_Ltot[4]+disk_gap+L_Guide43;
Ch_Ltot[6] = Ch_Ltot[5]+disk_gap+L_Guide44;
for (i=0;i<=6;i++)
{
Ch_phase[i] = Ch_Ltot[i]/v0;
printf("Chopper %d: L=%lf [m] V=%lf [rad/s] Phase=%f [mu-sec]"
" op-times(%lf+n*%lf)s +/- %lf\n",
i,Ch_Ltot[i],Ch_Vp[i], Ch_phase[i]*1.0e+6,
Ch_phase[i],PI/Ch_Vp[i],2*PI/Ch_Vp[i]*Ch_alpha[i]/360.0);
}
//========================================
// Actual sample and detector
//========================================
thickness = 0.0125;
radius = 0.015;
height = 0.06;
ang_ini = -11.9175; //angular range of de detector in degrees
ang_fin = 134.8172; //
det_angle = fabs(ang_fin-ang_ini)/2.0 + ang_ini;
%}
//_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_//
TRACE
REMOVABLE COMPONENT arm = Progress_bar()
AT (0,0,0) ABSOLUTE
/*------------------*/
/* SOURCE */
/*------------------*/
REMOVABLE COMPONENT VCS = Source_gen(
yheight = 0.22,
xwidth = 0.14,
focus_xw = 0.038,
focus_yh = 0.2,
lambda0 = lambda,
dlambda = dlambda,
T1=216.8,I1=1.24e+13, /* VCS parameters */
T2=33.9, I2=1.02e+13,
T3=16.7 ,I3=3.0423e+12,
verbose = 1)
AT (0, 0, 0) RELATIVE PREVIOUS
REMOVABLE COMPONENT SourceTarget = Arm()
AT (0,0,2.55) RELATIVE PREVIOUS
/*--------------------------------------------*/
/* In the old version, here was the */
/* reset time for the choppers */
/* (t=0 for the choppers phase calculus) */
/* */
/* Now, t=0 is at Chopper0 */
/*--------------------------------------------*/
/////CHOPPER TIME-RESET/////////////////////////////////////////////////////
COMPONENT Chopper0 = DiskChopper(
theta_0 = 20.222, radius = Ch_mean_R[0], yheight = 0.2,
nu = Ch_Vp[0]/2/PI, nslit = disk_N, delay = Ch_phase[0], isfirst=1)
AT (0,0,0.2) RELATIVE PREVIOUS
///////////////////////////////////////////////////////////////////////////
/*-------------------------*/
/* GERADE Guide */
/*-------------------------*/
COMPONENT Guide1 = Guide_channeled(
w1 = 0.03000, h1 = 0.20000, w2 = 0.03000, h2 = 0.17415, l = L_Guide1,
R0 = Guide_Ro, Qcx = Guide_Qc, Qcy = Guide_Qc,
alphax = Guide_alpha, alphay = Guide_alpha,
mx = 1, my=2 , W = Guide_W)
AT (0,0,L_gap) RELATIVE Chopper0
COMPONENT Guide21 = Guide_channeled(
w1 = 0.03000, h1 = 0.17415, w2 = 0.03000, h2 = 0.17000, l = L_Guide21,
R0 = Guide_Ro, Qcx = Guide_Qc, Qcy = Guide_Qc,
alphax = Guide_alpha, alphay = Guide_alpha,
mx = 1, my = 2 , W = Guide_W)
AT (0,0,L_Guide1+0.0003) RELATIVE Guide1
/*-------------------------------*/
/* CHOPPER - I - */
/*-------------------------------*/
COMPONENT Chopper1 = DiskChopper(
theta_0 = Ch_alpha[1], radius = Ch_mean_R[1], yheight = Ch_height[1],
nu = Ch_Vp[1]/2/PI, nslit = disk_N, delay = Ch_phase[1])
AT (0,0, L_Guide21+disk_gap/2) RELATIVE Guide21
//////GUIDE TO CHOPPER2//////////////////////////////////////////////
COMPONENT Guide22 = Guide_channeled(
w1 = 0.03000, h1 = 0.17000, w2 = 0.03000, h2 = 0.16813, l = L_Guide22,
R0 = Guide_Ro, Qcx = Guide_Qc, Qcy = Guide_Qc,
alphax = Guide_alpha, alphay = Guide_alpha,
mx = 2, my = 3 , W = Guide_W)
AT (0,0,L_Guide21+disk_gap) RELATIVE Guide21
/*-------------------------------*/
/* CHOPPER - II - */
/*-------------------------------*/
COMPONENT Chopper2 = DiskChopper(
theta_0 = Ch_alpha[2], radius = Ch_mean_R[2], yheight = Ch_height[2],
nu = Ch_Vp[2]/2/PI, nslit = disk_N, delay = Ch_phase[2])
AT (0,0, L_Guide22+disk_gap/2) RELATIVE Guide22
/*------------------*/
/* MONOS - EINS- */
/* */
/* mid-way between */
/* Ch2 & L23 */
/*------------------*/
/*
COMPONENT M1 = Monitor_nD(xwidth=0.03, yheight=0.17,
options="auto time")
AT (0,0, disk_gap/4+0.002) RELATIVE Chopper2
*/
/*-------------------------------*/
/* Second guide part */
/* */
/*-------------------------------*/
COMPONENT Guide23 = Guide_channeled(
w1 = 0.03000, h1 = 0.16813, w2 = 0.02856, h2 = 0.15931, l = L_Guide23,
R0 = Guide_Ro, Qcx = Guide_Qc, Qcy = Guide_Qc,
alphax = Guide_alpha, alphay = Guide_alpha,
mx = 2, my = 3 , W = Guide_W)
AT (0,0,L_Guide22+disk_gap) RELATIVE Guide22
COMPONENT Guide3 = Guide_channeled(
w1 = 0.02856, h1 = 0.15931, w2 = 0.01733, h2 = 0.09041, l = L_Guide3,
R0 = Guide_Ro, Qcx = Guide_Qc, Qcy = Guide_Qc,
alphax = Guide_alpha, alphay = Guide_alpha,
mx = 2, my = 3 , W = Guide_W)
AT (0,0,L_Guide23+0.0003) RELATIVE Guide23
COMPONENT Guide41 = Guide_channeled(
w1 = 0.01733, h1 = 0.09041, w2 = 0.01579, h2 = 0.08100, l = L_Guide41,
R0 = Guide_Ro, Qcx = Guide_Qc, alphax = Guide_alpha,
Qcy = Guide_Qc, alphay = Guide_alpha, mx = 2, my = 3 , W = Guide_W)
AT (0,0,L_Guide3+0.0003) RELATIVE Guide3
/*-------------------------------*/
/* CHOPPER - III - */
/*-------------------------------*/
COMPONENT Chopper3 = DiskChopper(
theta_0 = Ch_alpha[3], radius = Ch_mean_R[3], yheight = Ch_height[3],
nu = Ch_Vp[3]/2/PI, nslit = disk_N, delay = Ch_phase[3])
AT (0,0, L_Guide41+disk_gap/2) RELATIVE Guide41
COMPONENT Guide42 = Guide_channeled(
w1 = 0.01577, h1 = 0.08088, w2 = 0.01568, h2 = 0.08031, l = L_Guide42,
R0 = Guide_Ro, Qcx = Guide_Qc, alphax = Guide_alpha,
Qcy = Guide_Qc, alphay = Guide_alpha, mx = 2, my = 3, W = Guide_W)
AT (0,0,L_Guide41+disk_gap) RELATIVE Guide41
/*-------------------------------*/
/* CHOPPER - IV - */
/*-------------------------------*/
COMPONENT Chopper4 = DiskChopper(
theta_0 = Ch_alpha[4], radius = Ch_mean_R[4], yheight = Ch_height[4],
nu = Ch_Vp[4]/2/PI, nslit = disk_N, delay = Ch_phase[4])
AT (0,0, L_Guide42+disk_gap/2) RELATIVE Guide42
COMPONENT Guide43 = Guide_channeled(
w1 = 0.01566, h1 = 0.08019, w2 = 0.01411, h2 = 0.07069, l = L_Guide43,
R0 = Guide_Ro, Qcx = Guide_Qc, alphax = Guide_alpha, mx = 2,
W = Guide_W, Qcy = Guide_Qc, alphay = Guide_alpha, my = 3)
AT (0,0,L_Guide42+disk_gap) RELATIVE Guide42
/*-------------------------------*/
/* CHOPPER - V - */
/*-------------------------------*/
COMPONENT Chopper5 = DiskChopper(
theta_0 = Ch_alpha[5], radius = Ch_mean_R[5], yheight = Ch_height[5],
nu = Ch_Vp[5]/2/PI, nslit = disk_N, delay = Ch_phase[5])
AT (0,0,L_Guide43+disk_gap/2) RELATIVE Guide43
COMPONENT Guide44 = Guide_channeled(
w1 = 0.01413, h1 = 0.07081, w2 = 0.01400, h2 = 0.0700, l = L_Guide44,
R0 = Guide_Ro, Qcx = Guide_Qc, alphax = Guide_alpha, mx = 2,
W = Guide_W, Qcy = Guide_Qc, alphay = Guide_alpha, my = 3)
AT (0,0,L_Guide43+disk_gap) RELATIVE Guide43
/*-------------------------------*/
/* CHOPPER - VI - */
/*-------------------------------*/
COMPONENT Chopper6 = DiskChopper(
theta_0 = Ch_alpha[6], radius = Ch_mean_R[6], yheight = Ch_height[6],
nu = Ch_Vp[6]/2/PI, nslit = disk_N, delay = Ch_phase[6])
AT (0,0,L_Guide44+disk_gap/2) RELATIVE Guide44
COMPONENT Guide45 = Guide_channeled(
w1 = 0.01400, h1 = 0.06983, w2 = 0.01400, h2 = 0.05663, l = L_Guide45,
R0 = Guide_Ro, Qcx = Guide_Qc, alphax = Guide_alpha, mx = 2,
W = Guide_W, Qcy = Guide_Qc, alphay = Guide_alpha, my = 3)
AT (0,0,L_Guide44+disk_gap) RELATIVE Guide44
/*//-----Here the actual 1st monitor*/
/*-----------------------*/
/* KOLLIMATOR Guide */
/*-----------------------*/
COMPONENT Collimator = Guide_channeled(
w1 = 0.01400, h1 = 0.05617, w2 = 0.01400, h2 = 0.05400, l = L_Collimator,
R0 = Guide_Ro, Qcx = Guide_Qc, alphax = Guide_alpha, mx = 2,
W = Guide_W, Qcy = Guide_Qc, alphay = Guide_alpha, my = 3)
AT (0,0,L_Guide45+mono_gap) RELATIVE Guide45
/*----------------------------------------*/
/* MONOS - ZWEI- */
/* */
/* at sample position */
/* */
/*----------------------------------------*/
COMPONENT Det_sample_t = Monitor_nD(xwidth=0.014, yheight=0.054,
options="auto t bins=20", restore_neutron=1)
AT (0,0,L_Collimator+0.0002) RELATIVE Collimator
/*-----------------------*/
/* SAMPLE */
/*-----------------------*/
COMPONENT arm2 = Arm()
AT (0,0,L_Collimator+L_CollSample+0.025) RELATIVE Collimator
ROTATED (0,det_angle,0) RELATIVE Collimator
SPLIT COMPONENT SAMPLE = Isotropic_Sqw(
radius = radius, thickness=thickness, yheight = height,
Sqw_coh=coh, Sqw_inc=inc, p_interact=0.9,
order = order, d_phi = 180/PI*atan(1.5/4)*2, verbose=1)
AT (0,0,0) RELATIVE arm2
ROTATED (0,0,0) RELATIVE arm2
EXTEND
%{
if(!SCATTERED) ABSORB;
%}
/*------------------------------*/
/* DETECTOR AFTER SAMPLE */
/*------------------------------*/
COMPONENT center_det = Arm()
AT (0,0,0) RELATIVE arm2
ROTATED (0,0,0) RELATIVE arm2
//--------------- DETECTOR IDEAL ----------------------------------------
COMPONENT Det_ideal_ay = Monitor_nD(xwidth=(4.0-0.0005-0.00002)*2, yheight=3,
options="banana, theta limits=[-73.36735 73.36765] bins=100, y bins=100")
AT (0,0,0) RELATIVE center_det
//------------ Fe HOUSING------------------------------------------------
COMPONENT hous = PowderN(
reflections=housing, radius = 4.0-0.00001, thickness = 0.0005,
yheight = 3.0,p_transmit=0.8)
WHEN (housing && strcmp(housing,"0") && strcmp(housing,"NULL"))
AT (0,0,0) RELATIVE center_det
ROTATED (0,0,0) RELATIVE center_det
//------------ PSD Detector ---------------------------------------------
COMPONENT Det_PSD = PSD_Detector(
yheight = 3.0, radius = 4.0, zdepth = 0.02600, awidth=(ang_fin-ang_ini)*PI/180*4.0,
nx = ntubes, ny = 128, //type = "events",
PressureConv = 4.75, PressureStop = 1.25, threshold=100,
borderx=-1, bordery=-1, LensOn = 1, filename = "in5det.dat",
FN_Conv="Gas_tables/He3inHe.table", FN_Stop="Gas_tables/He3inCF4.table")
AT (0,0,0) RELATIVE center_det
ROTATED (0,0,0) RELATIVE center_det
COMPONENT in5_t = Monitor_nD(
options="banana, t limits=[0.0206 0.0216] bins=41, parallel, previous")
AT (0,0,0) RELATIVE center_det
ROTATED (0,0,0) RELATIVE center_det
END