/******************************************************************************* * * McXtrace, X-ray tracing package * Copyright (C), All rights reserved * Risoe National Laboratory, Roskilde, Denmark * Institut Laue Langevin, Grenoble, France * * Component: PSD_monitor_4PI * * %I * Written by: Erik Knudsen * Date: June 23rd, 2009 * Version: $Revision$ * Origin: Risoe * * Spherical position-sensitive detector. * * %D * Based on neutron component by Kim Lefmann and Kristian Nielsen * 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) * restore_xray: If set, the monitor does not influence the xray state (1) * nowritefile: [1] If set, monitor will skip writing to disk * * OUTPUT PARAMETERS: * * PSD_N: Array of xray counts * PSD_p: Array of xray weight counts * PSD_p2: Array of second moments * * %L * * %E *******************************************************************************/ DEFINE COMPONENT PSD_monitor_4PI DEFINITION PARAMETERS (nx=90, ny=90) SETTING PARAMETERS (string filename=0, radius=1, restore_xray=0, int nowritefile=0) OUTPUT PARAMETERS (PSD_N, PSD_p, PSD_p2) /* X-ray parameters: (x,y,z,kx,ky,kz,phi,t,Ex,Ey,Ez,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(l0 < 0) l0 = l1; /* t0 is now time of intersection with the sphere. */ PROP_DL(l0); 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_xray) { RESTORE_XRAY(INDEX_CURRENT_COMP, x, y, z, kx, ky, kz, phi, t, Ex, Ey, Ez, p); } %} SAVE %{ if(!nowritefile){ 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 %{ circle("xy",0,0,0,radius); circle("xz",0,0,0,radius); circle("yz",0,0,0,radius); %} END