/*******************************************************************************
*
* 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
* Test
* results (not up-to-date).
*
* %E
*******************************************************************************/
DEFINE COMPONENT PSD_monitor_4PI
DEFINITION PARAMETERS ()
SETTING PARAMETERS (nx=90, ny=90, string filename=0, int nowritefile=0, radius=1, restore_neutron=0)
OUTPUT PARAMETERS ()
/* Neutron parameters: (x,y,z,vx,vy,vz,t,sx,sy,sz,p) */
DECLARE
%{
DArray2d PSD_N;
DArray2d PSD_p;
DArray2d PSD_p2;
%}
INITIALIZE
%{
int i, j;
PSD_N = create_darr2d(nx, ny);
PSD_p = create_darr2d(nx, ny);
PSD_p2 = create_darr2d(nx, ny);
for (i=0; i 0)
{
if(t0 < 0)
t0 = t1;
/* t0 is now time of intersection with the sphere. */
mcPROP_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;
double p2 = p*p;
#pragma acc atomic
PSD_N[i][j] = PSD_N[i][j]+1;
#pragma acc atomic
PSD_p[i][j] = PSD_p[i][j]+p;
#pragma acc atomic
PSD_p2[i][j] = PSD_p2[i][j] + p2;
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);
}
%}
FINALLY
%{
destroy_darr2d(PSD_N);
destroy_darr2d(PSD_p);
destroy_darr2d(PSD_p2);
%}
MCDISPLAY
%{
circle("xy",0,0,0,radius);
circle("xz",0,0,0,radius);
circle("yz",0,0,0,radius);
%}
END