/******************************************************************************* * * McStas, neutron ray-tracing package * Copyright 1997-2002, All rights reserved * Risoe National Laboratory, Roskilde, Denmark * Institut Laue Langevin, Grenoble, France * * Component: Slit * * %I * Written by: Kim Lefmann and Henrik M. Roennow * Date: June 16, 1997 * Version: $Revision: 1.21 $ * Origin: Risoe * Release: McStas 1.6 * * Rectangular/circular slit with optional insignificance cut * * %D * A simple rectangular or circular slit. You may either * specify the radius (circular shape), or the rectangular bounds. * No transmission around the slit is allowed. * If cutting option is used, low-weight neutron rays are ABSORBED * * Example: Slit(xmin=-0.01, xmax=0.01, ymin=-0.01, ymax=0.01) * Slit(radius=0.01, cut=1e-10) * * %P * INPUT PARAMETERS * * radius: Radius of slit in the z=0 plane, centered at Origo (m) * xmin: Lower x bound (m) * xmax: Upper x bound (m) * ymin: Lower y bound (m) * ymax: Upper y bound (m) * * Optional parameters: * cut: Lower limit for allowed weight (1) * * %E *******************************************************************************/ DEFINE COMPONENT Slit DEFINITION PARAMETERS () SETTING PARAMETERS (xmin=0, xmax=0, ymin=0, ymax=0, radius=0, cut=0) STATE PARAMETERS (x,y,z,vx,vy,vz,t,s1,s2,p) INITIALIZE %{ if (xmin == 0 && xmax == 0 && ymin == 0 && ymax == 0 && radius == 0) { fprintf(stderr,"Slit: %s: Error: give geometry\n", NAME_CURRENT_COMP); exit(-1); } %} TRACE %{ PROP_Z0; if (((radius == 0) && (xxmax || yymax)) || ((radius != 0) && (x*x + y*y > radius*radius))) ABSORB; else if (p < cut) ABSORB; else SCATTER; %} MCDISPLAY %{ double xw, yh; magnify("xy"); xw = (xmax - xmin)/2.0; yh = (ymax - ymin)/2.0; multiline(3, xmin-xw, (double)ymax, 0.0, (double)xmin, (double)ymax, 0.0, (double)xmin, ymax+yh, 0.0); multiline(3, xmax+xw, (double)ymax, 0.0, (double)xmax, (double)ymax, 0.0, (double)xmax, ymax+yh, 0.0); multiline(3, xmin-xw, (double)ymin, 0.0, (double)xmin, (double)ymin, 0.0, (double)xmin, ymin-yh, 0.0); multiline(3, xmax+xw, (double)ymin, 0.0, (double)xmax, (double)ymin, 0.0, (double)xmax, ymin-yh, 0.0); %} END