/***********************************************************************
*
* McStas, version 1.2 released February 2000
* Maintained by Kristian Nielsen and Kim Lefmann,
* Risoe National Laboratory, Roskilde, Denmark
*
* %IDENTIFICATION
*
* Author: Thomas C Hansen
* Date: 07 March 2000
* Version: $Revision: 1.12 $
* Origin: ILL (Dif/D20) (Obsolete)
* Modified by: EF, 2004. Obsoleted as it is not stable/working
*
* Entry window of a curved linear gaschamber PSD
*
* %DESCRIPTION
*
* Aluminium entry window for a curved linear position sensitive detector (PSD),
* as used in constant wavelength neutron powder diffraction (ILL Grenoble: D20).
* Normally, this component is always used in front of a PSD_curved component.
* OBSOLETE: rather use monitors/Monitor_nD with options="... banana ..."
*
*
* %PARAMETERS
*
* INPUT PARAMETERS:
*
* radius: (m) Outer radius of detector entry window (=radius-gap in PSD_curved) (1.418)
* height: (m) Height of detector (=height in PSD_curved) (0.15)
* nd: (1) Number of cells (=nd in PSD_curved) (1536)
* pitch: (deg) angular pitch (=pitch in PSD_curved) (0.1)
* gap: (m) Thickness of entry window (0.007)
* tt0: (deg) detection angle of first cell (=tt0 in PSD_curved) (0)
* pack: (1) Packing density of window material
* Vc: (AA**3) Unit cell volume of window material
* sigma_a: (barn) Absorption cross section
* q: (1/AA) Wavevector
* j: (1) Multiplicity
* F2: (fm**2) Structure factor
* DW: (1/AA**2) Debye-Waller factor
* period: (1) Number of cells on one MSGC plate (=period in PSD_curved) (32)
* sign: (1) Chirality of 1st diffractometer axis=sign[takeoff of d20adapt.instr] (-1)
*
* OUTPUT PARAMETERS:
*
* my_s_v2: (m/s**2) Attenuation factor due to elastic coherent scattering, multiplied by neutron velocity**2
* my_a_v: (1/s) Attenuation factor due to absorption, multiplied by neutron velocity
* q_v: (m/s) Corresponding velocity of wavevector Q
*
* %LINKS
* Source code of d20adapt.instr, where this component is used
* %LINKS
* The corresponding detector PSD_curved.comp
*
* %END
*
***********************************************************************/
DEFINE COMPONENT PSD_entry
DEFINITION PARAMETERS(radius,height,nd,pitch,gap,tt0,pack,Vc,sigma_a,q,j,F2,DW,period,sign)
SETTING PARAMETERS ()
OUTPUT PARAMETERS (my_s_v2, my_a_v, q_v)
STATE PARAMETERS (x,y,z,vx,vy,vz,t,s1,s2,p)
DECLARE
%{
double my_s_v2, my_a_v, q_v;
%}
INITIALIZE
%{
my_a_v = sigma_a/Vc*2200; /* Is not yet divided by v */
my_s_v2 = PI*PI*PI*pack*j*F2*DW/(Vc*Vc*V2K*V2K*q);
q_v = q*K2V;
%}
TRACE
%{
double t0, t1, t2, t3, twotheta, d_phi, phi,eff,p_transmission;
double my, l_full, dt, aim_x, aim_y, aim_z, axis_x, axis_y, axis_z;
double l, tmp_vx, tmp_vy, tmp_vz, vout_x, vout_y, vout_z,v;
int i;
if(cylinder_intersect(&t0, &t1, x, y, z, vx, vy, vz, radius-gap, height) && t1 > 0)
{
if(t0 < 0) t0 = t1;
PROP_DT(t0);
/*SCATTER;*/
twotheta = -atan2(x,z);
/*printf("%lf\n",twotheta);*/
if (((double)sign*twotheta>=tt0-pitch/2.0) && ((double)sign*twotheta<=tt0+(double)nd*pitch+pitch/2.0))
{
/*SCATTER;*/
cylinder_intersect(&t2, &t3, x, y, z, vx, vy, vz, radius, height);
if(t2 < 0) t2 = t3;
v = sqrt(vx*vx + vy*vy + vz*vz);
l_full = v * (t2); /* Length of full path through PSD entry window of Al */
my=my_s_v2/v/v+my_a_v/v;
p_transmission=exp(-my*l_full);
if (rand01() > p_transmission)
{
eff=1.0-exp(-my_s_v2/v/v*l_full);
dt =(t2)*-log(rand01()*(eff)+1.0-eff);
PROP_DT(dt); /* Point of diffraction */
l = v*dt; /* Penetration in entry window */
p*=(eff)/(1-p_transmission); /* a not detected (=captured) neutron may continue the flightpath!) */
d_phi = 360.0*DEG2RAD/2.0*randpm1();
twotheta = 2.0*asin(q_v/(2.0*v)); /* Bragg scattering law */
aim_x = sin(twotheta)-x; /* Vector pointing at target (anal./det.) */
aim_y = -y ;/* + PSD_h/2*randpm1() ; doppelt wg. d_phi?*/
aim_z = cos(twotheta)-z;
vec_prod(axis_x, axis_y, axis_z, vx, vy, vz, aim_x, aim_y, aim_z);
rotate(tmp_vx, tmp_vy, tmp_vz, vx, vy, vz, twotheta, axis_x, axis_y, axis_z);
rotate(vout_x, vout_y, vout_z, tmp_vx, tmp_vy, tmp_vz, d_phi, vx, vy, vz);
vx = vout_x;
vy = vout_y;
vz = vout_z;
}
else
{
PROP_DT(t2);
/*SCATTER;*/
}
}
else ABSORB;
}
else ABSORB;
/* Yes, ABSORB is a good idea for non-detectedable neutrons, as they do not interest anymore, and to use Check_adapt afterwards! */
%}
FINALLY
%{
%}
MCDISPLAY
%{
double R2, twotheta,x0,z0,x1,z1;
int cell;
magnify("xyz");
R2=radius-gap;
twotheta=(tt0-pitch/2.0)*PI/180.0;
z0=cos(twotheta)*R2;
x0=sin(twotheta)*R2;
line(x0, -height/2.0,z0,x0, height/2.0,z0);
for (cell=1;cell<=ceil((double)nd/(double)period)*period;cell++)
{
twotheta=(tt0-pitch/2.0+pitch*cell)*PI/180.0;
z1=cos(twotheta)*R2;
x1=sin(twotheta)*R2;
line(x0, -height/2.0,z0,x1, -height/2.0,z1);
line(x0, height/2.0,z0,x1, height/2.0,z1);
x0=x1; z0=z1;
}
line(x0, -height/2.0,z0,x0, height/2.0,z0);
/* Circles are too roughly drawn for curved detector presentations */
/*
circle("xz", 0, height/2.0, 0, radius);
circle("xz", 0, -height/2.0, 0, radius);
line(-radius, -height/2.0, 0, -radius, +height/2.0, 0);
line(+radius, -height/2.0, 0, +radius, +height/2.0, 0);
line(0, -height/2.0, -radius, 0, +height/2.0, -radius);
line(0, -height/2.0, +radius, 0, +height/2.0, +radius);
circle("xz", 0, height/2.0, 0, (radius-gap));
circle("xz", 0, -height/2.0, 0, (radius-gap));
line(-(radius-gap), -height/2.0, 0, -(radius-gap), +height/2.0, 0);
line(+(radius-gap), -height/2.0, 0, +(radius-gap), +height/2.0, 0);
line(0, -height/2.0, -(radius-gap), 0, +height/2.0, -(radius-gap));
line(0, -height/2.0, +(radius-gap), 0, +height/2.0, +(radius-gap));
*/
%}
END