1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232
|
/*******************************************************************************
* Instrument: SOLEIL_PX2a
*
* %Identification
* Written by: M. Savko and E. Farhi
* Date: 2022-03-23
* Origin: Synchrotron SOLEIL
* %INSTRUMENT_SITE: SOLEIL
*
* The PROXIMA-2a MX beam-line at Synchrotron SOLEIL.
*
* %Description
* PROXIMA 2A (PX2-A) is a microfocus beamline dedicated to biological
* crystallography and innovative micro-beam methodologies. Opened to the
* scientific community since 2013, the topics treated on the beamline go beyond
* standard protein crystallography and include drug discovery, membrane proteins,
* virus crystallography, small molecule crystallography, powder diffraction and
* even crystalluria. The beamline is highly automated and designed to help
* scientists tackle the most challenging structural targets and biological
* systems. The X-ray energy is rapidly tunable over a wide range (6-18 keV) making
* the most commonly used absorption edges accessible for anomalous diffraction
* experiments. The end station is equipped with a high capacity sample-changing
* system (148 SPINE pins), a high performance micro-diffractometer with a
* mini-kappa (MD2), an X-ray fluorescence detector (KETEK), and a fast, low-noise,
* photon-counting, area detector - the EIGER X 9M (238 fps in 9M mode, 750 fps in
* 4M mode).
*
* This is a simplified model with an Undulator, mirrors, a double crystal
* monochromator, a sample stage and a detector.
*
* %Example: E0=12.65 sample="Mo.lau" Detector: Eiger9M_I=3e+11
* %Example: E0=12.65 Detector: Eiger9M_I=1.5e+15
*
* %Parameters
* E0: [keV] Energy selected at the Undulator.
* hfm_radius: [m] horizontally focusing mirror radius
* vfm_radius: [m] vertically focusing mirror radius
* mirror_grazing_angle: [deg] Tilt angle of the mirrors.
* sample:[str] Sample structure file, LAU/CIF format.
* rotX: [deg] Sample rotation around X
* rotY: [deg] Sample rotation around Y
* rotZ: [deg] Sample rotation around Z
*
* %Link
* https://www.synchrotron-soleil.fr/en/beamlines/proxima-2a
*
* %End
*******************************************************************************/
DEFINE INSTRUMENT SOLEIL_PX2a(
E0=12.65, hfm_radius=495, vfm_radius=859,
mirror_grazing_angle=4e-3,
string sample="adrenaline.lau",
rotX=0, rotY=0, rotZ=0)
DECLARE
%{
double calculated_angle;
%}
USERVARS %{
int flag_hfm;
int flag_vfm;
%}
INITIALIZE
%{
double arg= 12398.42*sqrt(3)/(2*5.4309*E0*1e3);
if (fabs(arg) > 1)
exit(fprintf(stderr, "ERROR: Monochromator can not reach this energy (arg=%g > 1)\n",
arg));
calculated_angle = RAD2DEG*asin(arg);
%}
TRACE
COMPONENT Origin = Progress_bar()
AT (0,0,0) ABSOLUTE
// Undulator U24
COMPONENT undulator = Undulator(
E0=E0,
dE=.1,
Ee=2.75,
dEe=0.001,
Ie=0.5,
K=1.788,
Nper=80,
lu=2.4e-2,
sigey=9.8e-6,
sigex=219.1e-6,
sigepx=31.6e-6,
sigepy=3.7e-6,
dist=29.5,
E1st=12.400)
AT (0, 0, 0) RELATIVE PREVIOUS
// Channel_cut Si(111) ---------------------------------------------------------
// gap 6 mm
COMPONENT bragg_crystal_location = Arm()
AT (0,0,29.5) RELATIVE PREVIOUS
COMPONENT bragg_crystal = Bragg_crystal(
crystal_type=2)
AT (0, 0, 0) RELATIVE PREVIOUS
ROTATED (-calculated_angle, 0, 0) RELATIVE PREVIOUS
COMPONENT arm = Arm()
AT (0, 0, 0) RELATIVE PREVIOUS
ROTATED (-calculated_angle, 0, 0) RELATIVE PREVIOUS
COMPONENT bragg_crystal_two = Bragg_crystal(
crystal_type=2)
AT (0, 0.006, calculated_angle ? 0.006/tan(calculated_angle*DEG2RAD) : 0) RELATIVE bragg_crystal
ROTATED (calculated_angle, 0, 0) RELATIVE PREVIOUS
COMPONENT arm_two = Arm()
AT (0, 0, 0) RELATIVE bragg_crystal_two
ROTATED (calculated_angle, 0, 0) RELATIVE bragg_crystal_two
COMPONENT bragg_crystal_out = E_monitor(Emin=E0-.1, Emax=E0+.1, nE=512,
xwidth=0.1, yheight=0.1)
AT(0,0,0.2) RELATIVE PREVIOUS
// horizontal pre-focusing curved mirror (XZ -> YZ plane) ----------------------
COMPONENT hpm_location = Arm()
AT (0,0,32.1-29.5-0.05) RELATIVE arm_two
COMPONENT hpm_in_yz_plane = Arm()
AT (0,0,0) RELATIVE hpm_location
ROTATED (0,0,90) RELATIVE hpm_location
COMPONENT hpm = Mirror_toroid(
coating = "Ir.dat", //This needs to be Rh.dat, will need to generate the file with xraydb
zdepth = 150e-3,
xwidth = 15e-3,
radius = 495,
radius_o = 1000)
AT (0,0,0) RELATIVE hpm_in_yz_plane
ROTATED (mirror_grazing_angle, 0, 0) RELATIVE hpm_in_yz_plane
COMPONENT hpm_takeoff = Arm()
AT (0,0,0) RELATIVE hpm_location
ROTATED (0, 2*mirror_grazing_angle, 0) RELATIVE hpm_location
// KB pair ---------------------------------------------------------------------
// could use Mirror_elliptic
// incidence angle 4 mrad
// KB 1st mirror (XZ plane) at 1.6m from sample
// must be shifted by -2 mm on Y else beam flies underneath the mirror.
COMPONENT vfm_location = Monitor_nD(xwidth=0.01, yheight=0.01, options="x y", bins=100)
AT (0,0,33.9-32.1) RELATIVE hpm_takeoff
COMPONENT vfm_in_xz_plane = Arm()
AT (0,0,0) RELATIVE vfm_location
ROTATED(0,0,-90) RELATIVE vfm_location // YZ -> XZ
COMPONENT vfm = Mirror_curved(
coating="Rh.txt",
length=450e-3,
width=0.1,
radius=vfm_radius)
AT (0,0,0) RELATIVE vfm_location
ROTATED(0,-mirror_grazing_angle,0) RELATIVE vfm_in_xz_plane
EXTEND %{
flag_vfm=SCATTERED;
%}
COMPONENT vfm_takeoff = COPY(vfm_location)
AT (0,0,0) RELATIVE vfm_in_xz_plane
ROTATED (-2*mirror_grazing_angle, 0, 0) RELATIVE vfm_location
// KB 2nd mirror (YZ) at 1m from sample, shift height=4.8 mm
COMPONENT hfm_location = COPY(vfm_location)
AT (0,0,34.5-33.9) RELATIVE vfm_takeoff
// 859 m tangential; sagital > 1 km, in YZ plane
COMPONENT hfm = Mirror_curved(
coating="Rh.txt",
length=450e-3,
width=0.1,
radius=hfm_radius)
AT (0,0,0) RELATIVE hfm_location
ROTATED (0,-mirror_grazing_angle,0) RELATIVE hfm_location
EXTEND %{
flag_hfm=SCATTERED;
%}
COMPONENT hfm_takeoff = COPY(vfm_location)
AT (0,0,0) RELATIVE hfm_location
ROTATED (0,-2*mirror_grazing_angle,0) RELATIVE hfm_location
// Sample ----------------------------------------------------------------------
// we centre the beam after the KB.
COMPONENT sample_stage = Arm()
AT (1e-3,-1.1e-3,1) RELATIVE hfm_takeoff
EXTEND %{
if (!flag_hfm || !flag_vfm) ABSORB;
%}
COMPONENT sample_monitor = Monitor_nD(
xwidth = 0.01, yheight = 0.01,
options = "x y", bins=100)
AT (0, 0, 0) RELATIVE sample_stage
SPLIT COMPONENT sample = Single_crystal(reflections=sample, material_datafile="NULL",
radius = .5e-4, yheight = 5e-3, p_transmit = 0, mosaic=0.1)
AT (0, 0, 0) RELATIVE sample_stage
ROTATED (rotX,rotY,rotZ) RELATIVE sample_stage
EXTEND %{
if (!SCATTERED) ABSORB;
%}
COMPONENT psd4pi = PSD_monitor_4PI(
nx = 180, ny = 180, filename = "psd4pi", radius = 0.1, restore_xray = 1)
AT (0, 0, 0) RELATIVE sample
// Detector
COMPONENT Eiger9M = PSD_monitor(
nx=3108, ny=3262,
xwidth = 233.1e-3,
yheight= 244.7e-3,
filename="Eiger9M.dat"
)
AT (0,0,0.12) RELATIVE sample_stage
END
|