/******************************************************************************* * * McStas, neutron ray-tracing package * Copyright (C) 1997-2008, All rights reserved * Risoe National Laboratory, Roskilde, Denmark * Institut Laue Langevin, Grenoble, France * * Instrument: Template TAS instrument * * %Identification * Written by: Emmanuel Farhi * Date: 2006 * Origin: ILL (France) * %INSTRUMENT_SITE: Templates * * Template RESCAL type triple-axis machine (TAS) * * %Description * This instrument is a simple model of triple-axis spectrometer. * It is directly illuminated by the moderator, * and has curved monochromator and analyzer. * Sample can be specified as a powder, liquid/amorphous or a pure incoherent * scatterer (e.g. vanadium, which is the default). * Sample geometry can be spherical or cylindrical. * For PG002 monochromator/analyzer setting, a reflectivity curve vs. wavelength * is used, else reflectivity is set to 70 %. To suppress collimators, set their * divergence to 0 (ALFn BETn). * Default instrument geometry is from IN20@ILL with PG monochromator/analyzer. * * Monochromator lattice parameter * PG 002 DM=3.355 AA (Highly Oriented Pyrolythic Graphite) * PG 004 DM=1.607 AA * Heusler 111 DM=3.362 AA (Cu2MnAl) * CoFe DM=1.771 AA (Co0.92Fe0.08) * Ge 111 DM=3.266 AA * Ge 311 DM=1.714 AA * Ge 511 DM=1.089 AA * Ge 533 DM=0.863 AA * Si 111 DM=3.135 AA * Cu 111 DM=2.087 AA * Cu 002 DM=1.807 AA * Cu 220 DM=1.278 AA * Cu 111 DM=2.095 AA * * IN22 configuration (at H25 thermal m=2 guide end): * KI=3.84, QM=1.0, EN=0.0, verbose=1, * WM=0.15, HM=0.12, NHM=1, NVM=9, RMV=-1, * WA=0.20, HA=0.10, NHA=11, NVA=3, RAV=-1, RAH=-1, * SM=-1, SS=1, SA=-1, * L1=10.0, L2=1.7, L3=1.0, L4=0.8 * * IN8 Configuration: with Copper optics * KF=5, KI=0, QM=0.5, EN=5, verbose=1 * WM=0.23, HM=0.19, RMH=-1, RMV=-1, DM=1.807, NHM=15, NVM=15, * WA=0.16, HA=0.08, RAH=-1, RAV=-1, DA=2.087, NHA=15, NVA=15, * L1=2.33 * * %Example: QM=1 Sqw_coh=V.lau Detector: D7_SC3_1D_I=3.0e+08 * %Example: QM=1 Sqw_coh=V.lau Detector: He3H_I=260 * * %Parameters * KI: [Angs-1] Incoming neutron wavevector * KF: [Angs-1] Outgoing neutron wavevector * EI: [meV] Incoming neutron energy * EF: [meV] Outgoing neutron energy * QH: [rlu] Measurement QH position in crystal * QK: [rlu] Measurement QK position in crystal * QL: [rlu] Measurement QL position in crystal * EN: [meV] Energy transfer in crystal * QM: [Angs-1] Wavevector transfer in crystal * KFIX: [Angs-1] Fixed KI or KF value for Rescal compatibility * FX: [1:KI,2:KF] Fixed KI or KF type for Rescal compatibility * L1: [m] Source-Monochromator distance. Contains 1st Collimator of length 5.34 * L2: [m] Monochromator-Sample distance. Contains 2nd Collimator of length 0.35 * L3: [m] Sample-Analyzer distance. Contains 3rd Collimator of length 0.40 * L4: [m] Analyzer-detector distance. Contains 4th Collimator of length 0.24 * SM: [1:left, -1:right] Scattering sense of beam from Monochromator * SS: [1:left, -1:right] Scattering sense of beam from Sample * SA: [1:left, -1:right] Scattering sense of beam from Analyzer * DM: [Angs] Monochromator d-spacing * DA: [Angs] Analyzer d-spacing * RMV: [m] Monochromator vertical curvature, 0 for flat, -1 for automatic setting * RMH: [m] Monochromator horizontal curvature, 0 for flat, -1 for automatic setting * RAV: [m] Analyzer vertical curvature, 0 for flat, -1 for automatic setting * RAH: [m] Analyzer horizontal curvature, 0 for flat, -1 for automatic setting * ETAM: [arc min] Monochromator mosaic * ETAA: [arc min] Analyzer mosaic * ALF1: [arc min] Horizontal collimation from Source to Monochromator * ALF2: [arc min] Horizontal collimation from Monochromator to Sample A * ALF3: [arc min] Horizontal collimation from Sample to Analyzer * ALF4: [arc min] Horizontal collimation from Analyzer to Detector * BET1: [arc min] Vertical collimation from Source to Monochromator * BET2: [arc min] Vertical collimation from Monochromator to Sample A * BET3: [arc min] Vertical collimation from Sample to Analyzer * BET4: [arc min] Vertical collimation from Analyzer to Detector * AS: [Angs] Sample lattice parameter A * BS: [Angs] Sample lattice parameter B * CS: [Angs] Sample lattice parameter C * AA: [deg] Angle between lattice vectors B,C * BB: [deg] Angle between lattice vectors C,A * CC: [deg] Angle between lattice vectors A,B * AX: [rlu] First reciprocal lattice vector in scattering plane, X * AY: [rlu] First reciprocal lattice vector in scattering plane, Y * AZ: [rlu] First reciprocal lattice vector in scattering plane, Z * BX: [rlu] Second reciprocal lattice vector in scattering plane, X * BY: [rlu] Second reciprocal lattice vector in scattering plane, Y * BZ: [rlu] Second reciprocal lattice vector in scattering plane, Z * A1: [deg] Monohromator rotation angle * A2: [deg] Monohromator take-off angle * A3: [deg] Sample rotation angle * A4: [deg] Sample take-off angle * A5: [deg] Analyzer rotation angle * A6: [deg] Analyzer take-off angle * verbose: [1] print TAS configuration. 0 to be quiet * * WM: [m] Width of monochromator * HM: [m] Height of monochromator * NVM: [1] Number of vertical slabs composing the monochromator * NHM: [1] Number of horizontal slabs composing the monochromator * WA: [m] Width of analyzer * HA: [m] Height of analyzer * NVA: [1] Number of vertical slabs composing the analyzer * NHA: [1] Number of horizontal slabs composing the analyzer * * Sqw_coh: [str] sample coherent S(q,w) file name. Use LAZ/LAU or SQW file * Sqw_inc: [str] sample incoherent S(q,w) file name. Use NULL to scatter incoherently * radius: [m] outer radius of sample hollow cylinder/sphere * height: [m] sample height. Use 0 for a spherical shape * thickness: [m] thickness of sample hollow cylinder. 0 for bulk * * %Link * Rescal for Matlab at http://www.ill.eu/instruments-support/computing-for-science/cs-software/all-software/matlab-ill/ * %Link * Restrax at http://omega.ujf.cas.cz/restrax/ * %End *******************************************************************************/ DEFINE INSTRUMENT templateTAS( KI=2.662, KF=0, EI=0, EF=0, QH=0, QK=0, QL=0, EN=0, QM=0, KFIX=0, FX=0, L1=9, L2=2.1, L3=1.5, L4=0.7, SM=1, SS=-1, SA=1, DM=3.3539, DA=3.3539, RMV=-1, RMH=0, RAV=0, RAH=-1, ETAM=30, ETAA=30, ALF1=60, ALF2=60, ALF3=60, ALF4=60, BET1=120, BET2=120, BET3=120, BET4=120, AS=6.28, BS=6.28, CS=6.28, AA=90, BB=90, CC=90, AX=1, AY=0, AZ=0, BX=0, BY=1, BZ=0, verbose=1, A1=0,A2=0,A3=0,A4=0,A5=0,A6=0, NHM=1, NVM=9, WM=0.10, HM=0.12, NHA=9, NVA=1, WA=0.10, HA=0.12, string Sqw_coh="NULL", string Sqw_inc="NULL", radius=0.01, thickness=0.005, height=0.05 ) DECLARE %{ char ethmonopts[128]; char lmonopts[128]; /* Monochromator reflectivity file and scalar */ char Mono_refl[128]; double Mono_r0; int OpenACC; #pragma acc declare create(OpenACC) struct sample_struct { double as, bs, cs; double aa, bb, cc; double ax, ay, az; double bx, by, bz; } sample; struct machine_hkl_struct { double dm, da; double l1, l2, l3, l4; double sm, ss, sa; double etam, etaa, kfix, fx; double alf1, alf2, alf3, alf4; double bet1, bet2, bet3, bet4; double ki, kf, ei, ef; double qh, qk, ql, en; } machine_hkl; struct machine_real_struct { double a1,a2,a3,a4,a5,a6; double rmh, rmv, rah, rav; double qm, qs, qt[3]; char message[256]; } machine_real; struct machine_real_struct qhkl2angles( struct sample_struct sample, struct machine_hkl_struct machine_hkl, struct machine_real_struct machine_real) { /* code from TASMAD/t_rlp.F:SETRLP */ double qhkl[3]; double alpha[3]; double a[3]; double aspv[3][2]; double cosa[3], sina[3]; double cosb[3], sinb[3]; double b[3], c[3], s[4][4]; double vv[3][3], bb[3][3]; double arg, cc; int i,j,k,l,m,n; char liquid_case=1; /* transfer parameters to local arrays */ qhkl[0] = machine_hkl.qh; /* HKL target */ qhkl[1] = machine_hkl.qk; qhkl[2] = machine_hkl.ql; alpha[0] = sample.aa; /* cell angles */ alpha[1] = sample.bb; alpha[2] = sample.cc; a[0] = sample.as; /* cell parameters */ a[1] = sample.bs; a[2] = sample.cs; aspv[0][0]= sample.ax; /* cell axis A */ aspv[1][0]= sample.ay; aspv[2][0]= sample.az; aspv[0][1]= sample.bx; /* cell axis B */ aspv[1][1]= sample.by; aspv[2][1]= sample.bz; /* default return values */ strcpy(machine_real.message, ""); machine_real.a3 = machine_real.a4 = 0; machine_real.a1 = machine_real.a5 = 0; /* if using HKL positioning in crystal (QM = 0) */ if (machine_real.qm <= 0) { liquid_case = 0; /* compute reciprocal cell */ for (i=0; i< 3; i++) if (a[i] <=0) sprintf(machine_real.message, "Lattice parameters a[%i]=%g", i, a[i]); else { a[i] /= 2*PI; alpha[i]*= DEG2RAD; cosa[i] = cos(alpha[i]); sina[i] = sin(alpha[i]); } cc = cosa[0]*cosa[0]+cosa[1]*cosa[1]+cosa[2]*cosa[2]; /* norm */ cc = 1 + 2*cosa[0]*cosa[1]*cosa[2] - cc; if (cc <= 0) sprintf(machine_real.message, "Lattice angles (AA,BB,CC) cc=%g", cc); else cc = sqrt(cc); if (strlen(machine_real.message)) return machine_real; /* compute bb */ j=1; k=2; for (i=0; i<3; i++) { b[i] = sina[i]/(a[i]*cc); cosb[i] = (cosa[j]*cosa[k] - cosa[i])/(sina[j]*sina[k]); sinb[i] = sqrt(1 - cosb[i]*cosb[i]); j=k; k=i; } bb[0][0] = b[0]; bb[1][0] = 0; bb[2][0] = 0; bb[0][1] = b[1]*cosb[2]; bb[1][1] = b[1]*sinb[2]; bb[2][1] = 0; bb[0][2] = b[2]*cosb[1]; bb[1][2] =-b[2]*sinb[1]*cosa[0]; bb[2][2] = 1/a[2]; /* compute vv */ for (k=0; k< 3; k++) for (i=0; i< 3; i++) vv[k][i] = 0; for (k=0; k< 2; k++) for (i=0; i< 3; i++) for (j=0; j< 3; j++) vv[k][i] += bb[i][j]*aspv[j][k]; for (m=2; m>=1; m--) for (n=0; n<3; n++) { i = (int)fmod(m+1,3); j= (int)fmod(m+2,3); k = (int)fmod(n+1,3); l= (int)fmod(n+2,3); vv[m][n]=vv[i][k]*vv[j][l]-vv[i][l]*vv[j][k]; } for (i=0; i< 3; i++) { /* compute norm(vv) */ c[i]=0; for (j=0; j< 3; j++) c[i] += vv[i][j]*vv[i][j]; if (c[i]>0) c[i] = sqrt(c[i]); else { sprintf(machine_real.message, "Vectors A and B, c[%i]=%g", i, c[i]); return machine_real; } } for (i=0; i< 3; i++) /* normalize vv */ for (j=0; j< 3; j++) vv[j][i] /= c[j]; for (i=0; i< 3; i++) /* compute S */ for (j=0; j< 3; j++) { s[i][j] = 0; for (k=0; k< 3; k++) s[i][j] += vv[i][k]*bb[k][j]; } s[3][3]=1; for (i=0; i< 3; i++) s[3][i]=s[i][3]=0; /* compute q modulus and transverse component */ machine_real.qs = 0; for (i=0; i< 3; i++) { machine_real.qt[i] = 0; for (j=0; j< 3; j++) machine_real.qt[i] += qhkl[j]*s[i][j]; machine_real.qs += machine_real.qt[i]*machine_real.qt[i]; } if (machine_real.qs > 0) machine_real.qm = sqrt(machine_real.qs); else sprintf(machine_real.message, "Q modulus too small QM^2=%g", machine_real.qs); } else { machine_real.qs = machine_real.qm*machine_real.qm; } /* end if qm <= 0 ********************************************* */ /* positioning of monochromator and analyser */ arg = PI/machine_hkl.dm/machine_hkl.ki; if (fabs(arg > 1)) sprintf(machine_real.message, "Monochromator can not reach this KI. arg=%g", arg); else { if (machine_hkl.dm <= 0 || machine_hkl.ki <= 0) strcpy(machine_real.message, "Monochromator DM=0 or KI=0."); else machine_real.a1 = asin(arg)*RAD2DEG; machine_real.a1 *= machine_hkl.sm; } machine_real.a2=2*machine_real.a1; arg = PI/machine_hkl.da/machine_hkl.kf; if (fabs(arg > 1)) sprintf(machine_real.message, "Analyzer can not reach this KF. arg=%g",arg); else { if (machine_hkl.da <= 0 || machine_hkl.kf <= 0) strcpy(machine_real.message, "Analyzer DA=0 or KF=0."); else machine_real.a5 = asin(arg)*RAD2DEG; machine_real.a5 *= machine_hkl.sa; } machine_real.a6=2*machine_real.a5; if (strlen(machine_real.message)) return machine_real; /* code from TASMAD/t_conv.F:SAM_CASE */ arg = (machine_hkl.ki*machine_hkl.ki + machine_hkl.kf*machine_hkl.kf - machine_real.qs) / (2*machine_hkl.ki*machine_hkl.kf); if (fabs(arg) < 1) machine_real.a4 = RAD2DEG*acos(arg); else sprintf(machine_real.message, "Q modulus too big. Can not close triangle. arg=%g", arg); machine_real.a4 *= machine_hkl.ss; if (!liquid_case) { /* compute a3 in crystals */ machine_real.a3 = -atan2(machine_real.qt[1],machine_real.qt[0]) -acos( (machine_hkl.kf*machine_hkl.kf-machine_real.qs-machine_hkl.ki*machine_hkl.ki) /(-2*machine_real.qm*machine_hkl.ki) ); machine_real.a3 *= RAD2DEG*(machine_real.a4 > 0 ? 1 : -1 ); } return machine_real; } /* qhkl2angles */ %} /* end of DECLARE */ INITIALIZE %{ #ifdef OPENACC OpenACC = 1; #else OpenACC = 0; #endif #pragma acc update device(OpenACC) double Vi, Vf; char anglemode = 0; if (KFIX && FX) { if (FX == 1) KI = KFIX; else if (FX == 2) KF = KFIX; } /* determine neutron energy from input */ if (KI && !EI) { Vi = K2V*fabs(KI); EI = VS2E*Vi*Vi; } if (KF && !EF) { Vf = K2V*fabs(KF); EF = VS2E*Vf*Vf; } machine_real.a1 = A1; machine_real.a2 = A2; machine_real.a3 = A3; machine_real.a4 = A4; machine_real.a5 = A5; machine_real.a6 = A6; if (A1 || A2 || A3 || A4 || A5 || A6) anglemode=1; if (!anglemode) { if (!EI && !EF) exit(fprintf(stderr, "templateTAS: ERROR: neutron beam energy is not defined (EI, EF, KI, KF)\n")); /* energy conservation */ if (EI) EF = EI - EN; else if (EF) EI = EF + EN; /* determine remaining neutron energies */ if (!KI && EI) { Vi = SE2V*sqrt(EI); KI = V2K*Vi; } if (!KF && EF) { Vf = SE2V*sqrt(EF); KF = V2K*Vf; } if (!QM && !QH && !QK && !QL) exit(fprintf(stderr, "templateTAS: ERROR: No Q transfer defined (QM, QH, QK, QL)\n")); } else { /* compute KI, KF if angles are consistent */ if (!KI && fabs(A2-2*A1) < 0.01) { KI = PI/DM/fabs(sin(DEG2RAD*A1*SM)); } if (!KF && fabs(A6-2*A5) < 0.01) { KF = PI/DA/fabs(sin(DEG2RAD*A5*SA)); } double qs=(KI*KI + KF*KF - cos(A4*DEG2RAD*SS)*(2*KI*KF)); if (!QM && qs>=0) QM = sqrt(qs); else fprintf(stderr, "templateTAS: Warning: Can not compute Q-modulus from A4=%g [deg].\n", A4); } /* transfer sample parameters */ sample.aa = AA; sample.bb = BB; sample.cc = CC; sample.as = AS; sample.bs = BS; sample.cs = CS; sample.ax = AX; sample.ay = AY; sample.az = AZ; sample.bx = BX; sample.by = BY; sample.bz = BZ; /* transfer target parameters */ machine_hkl.ki = KI; machine_hkl.kf = KF; machine_hkl.ei = EI; machine_hkl.ef = EF; machine_hkl.qh = QH; machine_hkl.qk = QK; machine_hkl.ql = QL; machine_hkl.en = EN; machine_real.qm = QM; if (verbose) { printf("templateTAS: Detailed TAS configuration\n"); printf("* Incoming beam: EI=%.4g [meV] KI=%.4g [Angs-1] Vi=%g [m/s]\n", EI, KI, Vi); printf("* Outgoing beam: EF=%.4g [meV] KF=%.4g [Angs-1] Vf=%g [m/s]\n", EF, KF, Vf); } /* transfer machine parameters */ machine_hkl.l1 = L1; machine_hkl.l2 = L2; machine_hkl.l3 = L3; machine_hkl.l4 = L4; machine_hkl.sm = SM; machine_hkl.ss = SS; machine_hkl.sa = SA; machine_hkl.dm = DM; machine_hkl.da = DA; machine_real.rmv= RMV; machine_real.rmh= RMH; machine_real.rav= RAV; machine_real.rah= RAH; machine_hkl.etam= ETAM; machine_hkl.etaa= ETAA; machine_hkl.alf1= ALF1; machine_hkl.alf2= ALF2; machine_hkl.alf3= ALF3; machine_hkl.alf4= ALF4; machine_hkl.bet1= BET1; machine_hkl.bet2= BET2; machine_hkl.bet3= BET3; machine_hkl.bet4= BET4; /* geometry tests w/r to collimator lengths */ if (machine_hkl.l1 <= 1) fprintf(stderr, "templateTAS: Warning: L1 too short. Min=1\n"); if (machine_hkl.l2 <= 0.35) exit(fprintf(stderr, "templateTAS: ERROR: L2 too short. Min=0.35\n")); if (machine_hkl.l3 <= 0.40) exit(fprintf(stderr, "templateTAS: ERROR: L3 too short. Min=0.40\n")); if (machine_hkl.l4 <= 0.24) exit(fprintf(stderr, "templateTAS: ERROR: L4 too short. Min=0.24\n")); if (!anglemode) { machine_real = qhkl2angles(sample, machine_hkl, machine_real); if (strlen(machine_real.message)) exit(fprintf(stderr, "templateTAS: ERROR: %s [qhkl2angles]\n", machine_real.message)); } /* compute optimal curvatures */ double L; L = 1/(1/L1+1/L2); if (RMV < 0) machine_real.rmv = fabs(2*L*sin(DEG2RAD*machine_real.a1)); if (RMH < 0) machine_real.rmh = fabs(2*L/sin(DEG2RAD*machine_real.a1)); L = 1/(1/L3+1/L4); if (RAV < 0) machine_real.rav = fabs(2*L*sin(DEG2RAD*machine_real.a5)); if (RAH < 0) machine_real.rah = fabs(2*L/sin(DEG2RAD*machine_real.a5)); if (verbose) { printf("* Transfer: EN=%g [meV] QM=%g [Angs-1]\n", EN, machine_real.qm); printf("Angles: A1=%.4g A2=%.4g A3=%.4g A4=%.4g A5=%.4g A6=%.4g [deg]\n", machine_real.a1, machine_real.a2, machine_real.a3, machine_real.a4, machine_real.a5, machine_real.a6); printf("Monochromator: DM=%.4g [Angs] RMH=%.4g [m] RMV=%.4g [m] %s\n", machine_hkl.dm, machine_real.rmh, machine_real.rmv, (!machine_real.rmh && !machine_real.rmv ? "flat" : "curved")); printf("Analyzer: DA=%.4g [Angs] RAH=%.4g [m] RAV=%.4g [m] %s\n", machine_hkl.da, machine_real.rah, machine_real.rav, (!machine_real.rah && !machine_real.rav ? "flat" : "curved")); printf("Sample: "); if (strcmp(Sqw_coh, "NULL") && !strstr(Sqw_coh, ".laz") && !strstr(Sqw_coh, ".lau")) printf("Isotropic (liquid/polymer) %s\n", Sqw_coh); if (!strcmp(Sqw_coh, "NULL")) printf("Incoherent\n"); if (strstr(Sqw_coh, ".laz") || strstr(Sqw_coh, ".lau")) printf("Powder %s\n", Sqw_coh); } machine_real.rmv = fabs(machine_real.rmv)*machine_hkl.sm; machine_real.rmh = fabs(machine_real.rmh)*machine_hkl.sm; machine_real.rav = fabs(machine_real.rav)*machine_hkl.sa; machine_real.rah = fabs(machine_real.rah)*machine_hkl.sa; sprintf(ethmonopts,"theta limits=[-180 180] energy limits=[%g %g], banana", 0.95*EF, 1.05*EF); sprintf(lmonopts,"lambda limits=[%g %g] cm", 0.95*(2*PI)/fabs(KI), 1.05*(2*PI)/fabs(KI)); /* Based on d-spacing, figure out if we should use HOPG.refl or just use scalar reflectivity: */ if (fabs(machine_hkl.dm-3.355) < 0.2) { sprintf(Mono_refl,"HOPG.rfl"); Mono_r0=1; } else { sprintf(Mono_refl,""); Mono_r0=0.7; } %} /* end of INITIALIZE */ TRACE /* Source description */ REMOVABLE COMPONENT Origin=Progress_bar() AT (0,0,0) ABSOLUTE /* a flat constant source */ REMOVABLE COMPONENT Source = Source_gen( radius = 0.10, dist = machine_hkl.l1, focus_xw = fabs(WM*sin(machine_real.a1*DEG2RAD)), focus_yh = HM, T1 = 683.7, I1 = 0.5874e13, T2 = 257.7, I2 = 2.5094e13, T3 = 16.7, I3 = 0.10343e13, E0 = machine_hkl.ei, dE = machine_hkl.ei*0.09) AT (0,0,0) ABSOLUTE REMOVABLE COMPONENT SC1 = Collimator_linear( xmin =-WM/2, ymin =-HM/2, xmax = WM/2, ymax = HM/2, length = machine_hkl.l1/2, divergence=ALF1, divergenceV=BET1) WHEN (ALF1 && BET1) AT (0, 0, machine_hkl.l1/4) ABSOLUTE REMOVABLE COMPONENT Guide_out=Arm() AT (0, 0, machine_hkl.l1-0.2) ABSOLUTE COMPONENT Mono_Cradle = Arm() AT (0, 0, 0.2) RELATIVE PREVIOUS SPLIT COMPONENT PG1Xtal = Monochromator_curved( width = WM, height = HM, NH=NHM, NV=NVM, RV=machine_real.rmv, RH=machine_real.rmh, DM=machine_hkl.dm, mosaich = machine_hkl.etam, mosaicv = machine_hkl.etam, r0 = Mono_r0, reflect=Mono_refl) AT (0, 0, 0) RELATIVE Mono_Cradle ROTATED (0, machine_real.a1, 0) RELATIVE Mono_Cradle /* on mono, pointing towards sample */ COMPONENT Mono_Out = Arm() AT (0,0,0) RELATIVE Mono_Cradle ROTATED (0, machine_real.a2, 0) RELATIVE Mono_Cradle COMPONENT D4_SC2_1D = Monitor_nD( xmin = -0.0420/2, xmax = 0.0420/2, ymin = -0.1200/2, ymax = 0.1200/2, options=lmonopts,bins=100) AT (0, 0, (machine_hkl.l2-0.35)/3) RELATIVE Mono_Out COMPONENT SC2 = Collimator_linear( xmin =-0.04/2, ymin =-0.07/2, xmax = 0.04/2, ymax = 0.07/2, length = 0.35, divergence=ALF2, divergenceV=BET2) WHEN (ALF2 && BET2) AT (0, 0, (machine_hkl.l2-0.35)/2) RELATIVE Mono_Out SPLIT COMPONENT Sample_Cradle = Monitor_nD(xwidth=0.01, yheight=0.01, options="per cm2", restore_neutron=1) AT (0, 0, machine_hkl.l2) RELATIVE Mono_Out ROTATED (0, machine_real.a3, 0) RELATIVE Mono_Out /* Sqw when Sqw_coh is not NULL/.laz/.lau */ COMPONENT Sample = Isotropic_Sqw( radius = radius, thickness=thickness, yheight = height, Sqw_coh=Sqw_coh, Sqw_inc=Sqw_inc, p_interact=0.95, order=1, d_phi=RAD2DEG*atan2(HA,machine_hkl.l3) ) AT (0,0,0) RELATIVE Sample_Cradle COMPONENT Sample_Out = Arm() /* this is the sample-ana axis */ AT (0,0,0) RELATIVE Sample_Cradle ROTATED (0, machine_real.a4, 0) RELATIVE Mono_Out COMPONENT D7_SC3_1D = Monitor_nD( xwidth = 0.06, yheight = HA, bins=100, restore_neutron=1, options=ethmonopts) AT (0, 0, 0) RELATIVE Sample_Out COMPONENT SC3 =Collimator_linear( xmin =-0.06/2, ymin =-0.12/2, xmax = 0.06/2, ymax = 0.12/2, length = 0.40, divergence=ALF3, divergenceV=BET3) WHEN (ALF3 && BET3) AT (0, 0, (machine_hkl.l3-0.40)/2) RELATIVE Sample_Out COMPONENT Ana_Cradle = Arm() AT (0, 0, machine_hkl.l3) RELATIVE Sample_Out SPLIT COMPONENT PG2Xtal = Monochromator_curved( width = WA, height = HA, NH=NHA, NV=NVA, RV=machine_real.rav, RH=machine_real.rah, DM=machine_hkl.da, mosaich = machine_hkl.etaa, mosaicv = machine_hkl.etaa, r0 = Mono_r0, reflect=Mono_refl) AT (0, 0, 0) RELATIVE Ana_Cradle ROTATED (0, machine_real.a5, 0) RELATIVE Ana_Cradle COMPONENT Ana_Out = Arm() /* this is the sample-ana axis */ AT (0,0,0) RELATIVE Ana_Cradle ROTATED (0, machine_real.a6, 0) RELATIVE Ana_Cradle COMPONENT SC4 =Collimator_linear( xmin =-0.06/2, ymin =-0.12/2, xmax = 0.06/2, ymax = 0.12/2, length = 0.24, divergence=ALF4, divergenceV=BET4) WHEN (ALF4 && BET4) AT (0, 0, (machine_hkl.l4-0.24)/2) RELATIVE Ana_Out /* vertical 3He Detector */ COMPONENT He3H = PSD_monitor( xmin = -0.025400, xmax = 0.025400, ymin = -0.042850, ymax = 0.042850, nx=20, ny=20, filename="He3H.psd") AT (0, 0, machine_hkl.l4) RELATIVE Ana_Out END