1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128
|
/*******************************************************************************
*
* McStas, neutron ray-tracing package
* Copyright (C) 1997-2006, All rights reserved
* Risoe National Laboratory, Roskilde, Denmark
* Institut Laue Langevin, Grenoble, France
*
* Component: PSD_monitor_4PI
*
* %I
* Written by: Kim Lefmann and Kristian Nielsen
* Date: April 17, 1998
* Origin: Risoe
*
* Spherical position-sensitive detector.
*
* %D
* An (n times m) pixel spherical PSD monitor using a cylindrical projection.
* Mostly for test and debugging purposes.
*
* Example: PSD_monitor_4PI(radius=0.1, nx=90, ny=90, filename="Output.psd")
*
* %P
* INPUT PARAMETERS:
*
* radius: [m] Radius of detector
* nx: [1] Number of pixel columns
* ny: [1] Number of pixel rows
* filename: [string] Name of file in which to store the detector image
* restore_neutron: [1] If set, the monitor does not influence the neutron state
* nowritefile: [1] If set, monitor will skip writing to disk
*
* OUTPUT PARAMETERS:
*
* PSD_N: [] Array of neutron counts
* PSD_p: [] Array of neutron weight counts
* PSD_p2: [] Array of second moments
*
* %L
* <A HREF="http://neutron.risoe.dk/mcstas/components/tests/powder/">Test
* results</A> (not up-to-date).
*
* %E
*******************************************************************************/
DEFINE COMPONENT PSD_monitor_4PI
DEFINITION PARAMETERS (nx=90, ny=90)
SETTING PARAMETERS (string filename=0, radius=1, restore_neutron=0, int nowritefile=0)
OUTPUT PARAMETERS (PSD_N, PSD_p, PSD_p2)
/* Neutron parameters: (x,y,z,vx,vy,vz,t,sx,sy,sz,p) */
DECLARE
%{
double PSD_N[nx][ny];
double PSD_p[nx][ny];
double PSD_p2[nx][ny];
%}
INITIALIZE
%{
int i,j;
for (i=0; i<nx; i++)
for (j=0; j<ny; j++)
{
PSD_N[i][j] = 0;
PSD_p[i][j] = 0;
PSD_p2[i][j] = 0;
}
%}
TRACE
%{
double t0, t1, phi, theta;
int i,j;
if(sphere_intersect(&t0, &t1, x, y, z, vx, vy, vz, radius) && t1 > 0)
{
if(t0 < 0)
t0 = t1;
/* t0 is now time of intersection with the sphere. */
PROP_DT(t0);
phi = atan2(x,z);
i = floor(nx*(phi/(2*PI)+0.5));
if(i >= nx)
i = nx-1; /* Special case for phi = PI. */
else if(i < 0)
i = 0;
theta=asin(y/radius);
j = floor(ny*(theta+PI/2)/PI+0.5);
if(j >= ny)
j = ny-1; /* Special case for y = radius. */
else if(j < 0)
j = 0;
PSD_N[i][j]++;
PSD_p[i][j] += p;
PSD_p2[i][j] += p*p;
SCATTER;
}
if (restore_neutron) {
RESTORE_NEUTRON(INDEX_CURRENT_COMP, x, y, z, vx, vy, vz, t, sx, sy, sz, p);
}
%}
SAVE
%{
if (!nowritefile) {
DETECTOR_OUT_2D(
"4PI PSD monitor",
"Longitude [deg]",
"Latitude [deg]",
-180, 180, -90, 90,
nx, ny,
&PSD_N[0][0],&PSD_p[0][0],&PSD_p2[0][0],
filename);
}
%}
MCDISPLAY
%{
circle("xy",0,0,0,radius);
circle("xz",0,0,0,radius);
circle("yz",0,0,0,radius);
%}
END
|