/******************************************************************************* * * McStas, neutron ray-tracing package * Copyright 1997-2002, All rights reserved * Risoe National Laboratory, Roskilde, Denmark * Institut Laue Langevin, Grenoble, France * * Instrument: Prisma2 * * %Identification * Written by: Kristian Nielsen and Mark Hagen * Date: August 1998. * Origin: ISIS/Risoe * Release: McStas 1.1 * Version: $Revision: 1.6 $ * %INSTRUMENT_SITE: ISIS * * Simple simulation of PRISMA2 with RITA-style analyser backend. * * %Description * Demonstrates how the standard components from the component library * may be easily modified for special purposes; in this case to have * the individual analyser blades paint a "color" on the neutrons to * differentiate them in the detector. * * Output is in the file "prisma2.tof". The format is ASCII; each * line consists of the time-of-flight in microseconds followed by seven * intensities of neutrons from each individual analyser blade. * * Example: mcrun prisma2.instr TT=-30 * * %Parameters * INPUT PARAMETERS: * TT: (deg) Take-off angle at the sample position, aka A4 * PHA: (deg) Analyzer group rotation angle, aka A5 * PHA1:(deg) Analyzer 1 tilt angle * PHA2:(deg) Analyzer 2 tilt angle * PHA3:(deg) Analyzer 3 tilt angle * PHA4:(deg) Analyzer 4 tilt angle * PHA5:(deg) Analyzer 5 tilt angle * PHA6:(deg) Analyzer 6 tilt angle * PHA7:(deg) Analyzer 7 tilt angle * TTA: (deg) Take-off angle at the analyzer position, aka A6 * * %Link * The McStas User manual * PRISMA * * %End *******************************************************************************/ /* Modified from Monochromator.comp to paint a "color" on the neutron if it is scattered. */ DEFINE COMPONENT Monochromator_color DEFINITION PARAMETERS (zmin, zmax, ymin, ymax, mosaich, mosaicv, r0, Q, color) SETTING PARAMETERS () STATE PARAMETERS (x,y,z,vx,vy,vz,t,s1,s2,p) DECLARE %{ #define DIV_CUTOFF 2 /* ~ 10^-5 cutoff. */ %} TRACE %{ double dphi,tmp1,tmp2,tmp3,vratio,phi,theta0,theta,v,cs,sn; double old_x = x, old_y = y, old_z = z, old_t = t; double dt; if(vx != 0.0 && (dt = -x/vx) >= 0.0) { y += vy*dt; z += vz*dt; t += dt; x = 0.0; if (z>zmin && zymin && y DIV_CUTOFF) { x = old_x; y = old_y; z = old_z; t = old_t; } else { p *= r0*exp(-tmp3*tmp3*4*log(2)); /* Use mosaics */ tmp1 = 2*theta; cs = cos(tmp1); sn = sin(tmp1); tmp2 = cs*vx - sn*vz; vy = vy; vz = cs*vz + sn*vx; vx = tmp2; /* Second: scatering out of plane. Approximation is that Debye-Scherrer cone is a plane */ phi = atan2(vy,vz); /* out-of plane angle */ dphi = (MIN2RAD*mosaicv)/(2*sqrt(2*log(2)))*randnorm(); /* MC choice: */ /* Vertical angle of the crystallite */ vy = vz*tan(phi+2*dphi*sin(theta)); vratio = v/sqrt(vx*vx+vy*vy+vz*vz); vz = vz*vratio; vy = vy*vratio; /* Renormalize v */ vx = vx*vratio; neu_color = color; } } else { x = old_x; y = old_y; z = old_z; t = old_t; } } %} MCDISPLAY %{ magnify("zy"); multiline(5, 0.0, (double)ymin, (double)zmin, 0.0, (double)ymax, (double)zmin, 0.0, (double)ymax, (double)zmax, 0.0, (double)ymin, (double)zmax, 0.0, (double)ymin, (double)zmin); %} END /* Modified from TOF_monitor.comp to bin neutrons according to their "color". */ DEFINE COMPONENT TOF_monitor_color DEFINITION PARAMETERS (xmin, xmax, ymin, ymax, nchan, dt, filename, maxcolor) SETTING PARAMETERS () OUTPUT PARAMETERS (TOF_N, TOF_p, TOF_p2) STATE PARAMETERS (x,y,z,vx,vy,vz,t,s1,s2,p) DECLARE %{ #ifdef MCSTAS_VERSION double TOF_N[maxcolor+1][nchan]; #else int TOF_N[maxcolor+1][nchan]; #endif double TOF_p[maxcolor+1][nchan]; double TOF_p2[maxcolor+1][nchan]; %} INITIALIZE %{ int i,c; for (i=0; ixmin && xymin && y= nchan) i = nchan; if(i < 0) { printf("FATAL ERROR: negative time-of-flight.\n"); exit(1); } if(neu_color < 0 || neu_color > maxcolor) { printf("FATAL ERROR: wrong color neutron.\n"); exit(1); } TOF_N[neu_color][i]++; TOF_p[neu_color][i] += p; TOF_p2[neu_color][i] += p*p; } %} FINALLY %{ printf("writing TOF color\n"); DETECTOR_OUT_2D( "Time-of-flight monitor", "Neutron color", "Time-of-flight [us]", 0, maxcolor+1, 0, nchan*10, maxcolor+1, nchan, &TOF_N[0][0],&TOF_p[0][0],&TOF_p2[0][0], filename); %} MCDISPLAY %{ magnify("xy"); multiline(5, (double)xmin, (double)ymin, 0.0, (double)xmax, (double)ymin, 0.0, (double)xmax, (double)ymax, 0.0, (double)xmin, (double)ymax, 0.0, (double)xmin, (double)ymin, 0.0); %} END DEFINE INSTRUMENT prisma2(TT=-30,PHA=22,PHA1=-3,PHA2=-2,PHA3=-1, PHA4=0,PHA5=1,PHA6=2,PHA7=3,TTA=4) DECLARE %{ int neu_color; /* "Color" of current neutron */ /* 30' mosaicity used on analysator */ double prisma_ana_mosaic = 30; /* Q vector for bragg scattering with monochromator and analysator */ double prisma_ana_q = 1.87325; double prisma_ana_r0 = 0.6; double focus_x,focus_z; double apos1, apos2, apos3, apos4, apos5, apos6, apos7; %} INITIALIZE %{ focus_x = 0.52 * sin(TT*DEG2RAD); focus_z = 0.52 * cos(TT*DEG2RAD); /* Rita-style analyser. */ { double l = 0.0125; apos1 = -3*l; apos2 = -2*l; apos3 = -1*l; apos4 = 0*l; apos5 = 1*l; apos6 = 2*l; apos7 = 3*l; } %} TRACE COMPONENT mod = Moderator( radius = 0.0707, dist = 9.035, xw = 0.021, yh = 0.021, E0 = 10, E1 = 15, Ec = 9.0, t0 = 37.15, gam = 39.1) AT (0,0,0) ABSOLUTE /* Use a slit to get the effect of a rectangular source. */ COMPONENT modslit = Slit(xmin = -0.05, xmax = 0.05, ymin = -0.05, ymax = 0.05) AT(0,0,0.000001) RELATIVE mod COMPONENT tof_test = TOF_monitor(xmin = -0.05, xmax = 0.05, ymin = -0.05, ymax = 0.05, nchan = 500, dt = 1, filename = "prisma2.mon") AT (0,0,0.005) RELATIVE mod COMPONENT mon1 = Monitor(xmin = -0.1, xmax = 0.1, ymin = -0.1, ymax = 0.1) AT(0,0,0.01) RELATIVE mod ROTATED (0,0,0) RELATIVE mod COMPONENT slit1 = Slit(xmin = -0.05, xmax = 0.05, ymin = -0.05, ymax = 0.05) AT(0,0,1.7) RELATIVE mod COMPONENT slit2 = Slit(xmin = -0.02, xmax = 0.02, ymin = -0.03, ymax = 0.03) AT(0,0,7) RELATIVE slit1 COMPONENT mon2 = Monitor(xmin = -0.1, xmax = 0.1, ymin = -0.1, ymax = 0.1) AT(0,0,9) RELATIVE mod COMPONENT sample = V_sample( radius_i = 0.00001, radius_o = 0.01, h = 0.02, focus_r = 0.03, pack = 1, target_x = focus_x, target_y = 0, target_z = focus_z) AT (0, 0, 9.035) RELATIVE mod COMPONENT a2 = Arm() AT (0,0,0) RELATIVE sample ROTATED (0,TT,0) RELATIVE sample COMPONENT mon3 = Monitor(xmin = -0.1, xmax = 0.1, ymin = -0.1, ymax = 0.1) AT(0,0,0.39) RELATIVE a2 COMPONENT coll2 = Soller(xmin = -0.015, xmax = 0.015, ymin = -0.025, ymax = 0.025, len = 0.12, divergence = 120) AT(0,0,0.40) RELATIVE a2 COMPONENT mon4 = Monitor(xmin = -0.1, xmax = 0.1, ymin = -0.1, ymax = 0.1) AT(0,0,0.521) RELATIVE a2 COMPONENT rita_ana = Arm() AT(0, 0, 0.58) relative a2 ROTATED (0, PHA, 0) RELATIVE a2 COMPONENT ana1 = Monochromator_color( ymin=-0.0375,ymax=0.0375,zmin=-0.006,zmax=0.006, mosaich=prisma_ana_mosaic,mosaicv=prisma_ana_mosaic, r0=prisma_ana_r0, Q=prisma_ana_q, color = 0) AT (0, 0, apos1) RELATIVE rita_ana ROTATED (0, PHA1, 0) RELATIVE rita_ana COMPONENT ana2 = Monochromator_color( ymin=-0.0375,ymax=0.0375,zmin=-0.006,zmax=0.006, mosaich=prisma_ana_mosaic,mosaicv=prisma_ana_mosaic, r0=prisma_ana_r0, Q=prisma_ana_q, color = 1) AT (0, 0, apos2) RELATIVE rita_ana ROTATED (0, PHA2, 0) RELATIVE rita_ana COMPONENT ana3 = Monochromator_color( ymin=-0.0375,ymax=0.0375,zmin=-0.006,zmax=0.006, mosaich=prisma_ana_mosaic,mosaicv=prisma_ana_mosaic, r0=prisma_ana_r0, Q=prisma_ana_q, color = 2) AT (0, 0, apos3) RELATIVE rita_ana ROTATED (0, PHA3, 0) RELATIVE rita_ana COMPONENT ana4 = Monochromator_color( ymin=-0.0375,ymax=0.0375,zmin=-0.006,zmax=0.006, mosaich=prisma_ana_mosaic,mosaicv=prisma_ana_mosaic, r0=prisma_ana_r0, Q=prisma_ana_q, color = 3) AT (0, 0, apos4) RELATIVE rita_ana ROTATED (0, PHA4, 0) RELATIVE rita_ana COMPONENT ana5 = Monochromator_color( ymin=-0.0375,ymax=0.0375,zmin=-0.006,zmax=0.006, mosaich=prisma_ana_mosaic,mosaicv=prisma_ana_mosaic, r0=prisma_ana_r0, Q=prisma_ana_q, color = 4) AT (0, 0, apos5) RELATIVE rita_ana ROTATED (0, PHA5, 0) RELATIVE rita_ana COMPONENT ana6 = Monochromator_color( ymin=-0.0375,ymax=0.0375,zmin=-0.006,zmax=0.006, mosaich=prisma_ana_mosaic,mosaicv=prisma_ana_mosaic, r0=prisma_ana_r0, Q=prisma_ana_q, color = 5) AT (0, 0, apos6) RELATIVE rita_ana ROTATED (0, PHA6, 0) RELATIVE rita_ana COMPONENT ana7 = Monochromator_color( ymin=-0.0375,ymax=0.0375,zmin=-0.006,zmax=0.006, mosaich=prisma_ana_mosaic,mosaicv=prisma_ana_mosaic, r0=prisma_ana_r0, Q=prisma_ana_q, color = 6) AT (0, 0, apos7) RELATIVE rita_ana ROTATED (0, PHA7, 0) RELATIVE rita_ana COMPONENT a3 = Arm() AT (0,0,0) relative rita_ana ROTATED (0,TTA,0) RELATIVE a2 COMPONENT mon5 = Monitor(xmin = -0.05, xmax = 0.05, ymin = -0.05, ymax = 0.05) AT(0,0,0.06) RELATIVE a3 COMPONENT mon6 = Monitor(xmin = -0.1, xmax = 0.1, ymin = -0.1, ymax = 0.1) AT(0,0,0.161) RELATIVE a3 COMPONENT psd = PSD_monitor(xmin = -0.05, xmax = 0.05, ymin = -0.05, ymax = 0.05, nx = 100, ny = 100, filename = "prisma2.psd") AT(0,0,0.20) RELATIVE a3 COMPONENT detector = TOF_monitor_color(xmin = -0.05, xmax = 0.05, ymin = -0.05, ymax = 0.05, nchan = 10000, dt = 10, maxcolor = 6, filename = "prisma2.tof") AT (0,0,0.20) RELATIVE a3 COMPONENT mon9 = Monitor(xmin = -0.1, xmax = 0.1, ymin = -0.1, ymax = 0.1) AT(0,0,0.01) RELATIVE detector END