/*******************************************************************************
*
* McStas, neutron ray-tracing package
* Copyright 1997-2002, 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
* Version: $Revision: 1.23 $
* Origin: Risoe
* Release: McStas 1.6
*
* 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: Radius of detector (m)
* nx: Number of pixel columns (1)
* ny: Number of pixel rows (1)
* filename: Name of file in which to store the detector image (text)
*
* OUTPUT PARAMETERS:
*
* PSD_N: Array of neutron counts
* PSD_p: Array of neutron weight counts
* PSD_p2: Array of second moments
*
* %L
* Test
* results (not up-to-date).
*
* %E
*******************************************************************************/
DEFINE COMPONENT PSD_monitor_4PI
DEFINITION PARAMETERS (nx=90, ny=90, filename)
SETTING PARAMETERS (radius)
OUTPUT PARAMETERS (PSD_N, PSD_p, PSD_p2)
STATE PARAMETERS (x,y,z,vx,vy,vz,t,s1,s2,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 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)));
if(i >= nx)
i = nx-1; /* Special case for phi = PI. */
else if(i < 0)
i = 0;
j = floor(ny*(y/(2*radius)));
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;
}
%}
SAVE
%{
DETECTOR_OUT_2D(
"4PI PSD monitor",
"Longitude [deg]",
"Lattitude [deg]",
-180, 180, -90, 90,
nx, ny,
&PSD_N[0][0],&PSD_p[0][0],&PSD_p2[0][0],
filename);
%}
MCDISPLAY
%{
magnify("");
circle("xy",0,0,0,radius);
circle("xz",0,0,0,radius);
circle("yz",0,0,0,radius);
%}
END