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 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258
|
/*******************************************************************************
* Instrument: SOLEIL_SIXS
*
* %Identification
* Written by: E. Farhi, A. Resta, A. Coati
* Date: 2023
* Origin: SOLEIL
* Version: 0.1
* %INSTRUMENT_SITE: SOLEIL
*
* A simple model for the SIXS beam-line at SOLEIL (surface diffraction).
*
* %Description
*
* SixS (Surface Interface X-ray Scattering) is a beamline dedicated to the study
* of X-ray scattering from surfaces and interfaces of hard and soft matter in
* various environments in the 5-20 keV energy range. To be sensitive to the
* surface all the studies are performed in grazing-incidence geometry. The
* beamline is equipped with two experimental hutches, which ae dedicated to the
* study of surfaces, interfaces and nano-objets prepared:
*
* - in-situ under UHV (Ultra High Vacuum, i.e. 10-10 mbar) conditions. A
* diffractometer allows to measure X-ray scattering from samples under UHV;
* - in various environments (catalysis chambers, soft matter, electrochemical
* cells). A diffractometer coupled with exchangeable chambers will be able to
* measure X-ray scattering from sample surfaces both in vertical or horizontal
* geometries.
*
* Grazing Incidence X-ray Diffraction (GIXD), Grazing Incidence Small Angle
* X-ray Scattering (GISAXS), anomalous surface X-ray scattering, X-Ray
* Reflectivity (XRR), magnetic surface X-ray scattering and coherent scattering
* experiments are performed on both the facilities.
*
* In this implementation, the multipurpose diffractometer is used, with a thin
* single crystal layer on top of a Si bulk.
*
* Position | Element
* ---------|--------------------------------------------------------------------
* 0 | the U20 undulator
* 15 | Slit S1 2x0.7 mm^2
* 16.5 | a Si(111) DCM, 40x40x10 mm^3 E0=5-20 keV
* 26 | Mirror M1 Si coated with Pd, elliptically vertical focusing 20x350x20 mm^3 Incident angle 0.175 deg (3 mrad)
* 28 | Mirror M2 at 20x550x20mm^3. (tilted 45 deg exchange horz/vert components for UHV)
* 33 | multipurpose diffractometer
* 42 | UHV diffractometer (not modelled here)
*
* Example: E0=10 Detector: mon_spl_fluo_I=3.66859e+14
*
* %Parameters
* E0: [keV] Nominal energy at the Wiggler.
* dE: [keV] Energy half-bandwidth at the Wiggler
* dcm_theta: [deg] Rotation angle of the DCM. 0=set from energy E0
* M1_angle: [mrad] Rotation angle of M1/M2 mirrors. When left as 0, it is set automatically from E0.
* M1_radius: [m] Curvature radius of M1 mirror (Rh, 1300x100) longitudinal. Positive=mirror is focusing. 0=flat.
* M2_radius: [m] Curvature radius of M2 mirror (Rh, 1300x100) sagittal. Positive=mirror is focusing. 0=flat.
* sample_coating: [str] Reflection/structure data file for the single crystal thin layer coating
* sample_bulk: [str] Reflection/structure data file for the single crystal bulk
* sample_thickness: [m] The single crystal thin layer coating thickness
* sample_angle: [deg] The sample tilt angle (around X axis)
*
* %Link
* https://www.synchrotron-soleil.fr/en/beamlines/sixs
*
* %End
*******************************************************************************/
DEFINE INSTRUMENT SOLEIL_SIXS(E0=13, dE=0.1, dcm_theta=0,
M1_angle=3, M1_radius=1400, M2_radius=1400,
string sample_coating="Mo.lau", string sample_bulk="Si.lau",
sample_thickness=50e-10, sample_angle=0.175)
DECLARE
%{
double dcm_gap;
%}
USERVARS
%{
int flag_scatt;
%}
INITIALIZE
%{
double DM= 5.4909; // Si d-spacing for the Monochromator
double d = DM/sqrt(3); // <111> reflection |<111>|=3
dcm_gap = 0.02; // gap between the 2 monochromator crystals
if (!dcm_theta && E0) {
// n.lambda = 2 d sin(dcm_theta) = 2*PI/E2K / E0 with n=ORDER=1
double sin_theta = 2*PI/E2K/E0 / 2 / d;
if (fabs(sin_theta) < 1)
dcm_theta = asin(sin_theta)*RAD2DEG;
} else if (dcm_theta && !E0)
E0 = 2*PI/E2K / (2*d*sin(dcm_theta*DEG2RAD));
if (!dcm_theta || !E0 || dE <=0)
exit(fprintf(stderr, "%s: ERROR: Monochromator can not reflect E0=%g +/- %g [keV]. Aborting.\n", NAME_INSTRUMENT, E0, dE));
MPI_MASTER(
printf("%s: E0=%g [keV] Monochromator dcm_theta=%g [deg] \n", NAME_INSTRUMENT, E0, dcm_theta);
);
if (fabs(dE/E0)>0.1) dE = 3e-2*E0;
M1_angle *= RAD2DEG/1000;
%}
TRACE
COMPONENT origin = Progress_bar()
AT (0, 0, 0) RELATIVE ABSOLUTE
// the photon source -----------------------------------------------------------
COMPONENT Source_U20 = Undulator(
E0 = E0,
dE = dE,
Ee = 2.75,
Ie = 0.5,
K = 5,
sigex = 388e-6,
sigey = 8.1e-6,
sigepx = 14.5e-6,
sigepy = 4.61e-6)
AT (0,0,0) RELATIVE origin
COMPONENT mon_src_xy = Monitor_nD(
options="x y", xwidth=2e-3, yheight=2e-3, bins=128)
AT (0,0,14.9) RELATIVE Source_U20
COMPONENT mon_src_e = Monitor_nD(options="energy", xwidth=2e-3, yheight=2e-3, bins=128,
min=E0-dE*1.1, max=E0+dE*1.1)
AT (0,0,0) RELATIVE PREVIOUS
COMPONENT slit = Slit(xwidth=2e-3, yheight=0.7e-3)
AT (0,0,0.1) RELATIVE PREVIOUS
COMPONENT slit_mon_xy = COPY(mon_src_xy)
AT (0,0,0) RELATIVE PREVIOUS
// The double monochromator ----------------------------------------------------
COMPONENT DCM_location = Arm()
AT (0,0,16.5) RELATIVE Source_U20
COMPONENT dcm_xtal0 = Bragg_crystal(
length=0.04, width=0.04,
h=1, k=1, l=1, material="Si.txt", V=160.1826)
AT(0,0,0) RELATIVE PREVIOUS
ROTATED (-dcm_theta,0,0) RELATIVE PREVIOUS
EXTEND %{
if (!SCATTERED) ABSORB;
%}
COMPONENT dcm0 = Arm()
AT(0,0,0) RELATIVE PREVIOUS
ROTATED (-dcm_theta,0,0) RELATIVE PREVIOUS
COMPONENT dcm_xtal1 = COPY(dcm_xtal0)
AT(0,dcm_gap, dcm_theta ? dcm_gap/tan(dcm_theta*DEG2RAD) : 0) RELATIVE dcm_xtal0
ROTATED (dcm_theta,0,0) RELATIVE PREVIOUS
EXTEND %{
if (!SCATTERED) ABSORB;
%}
COMPONENT dcm1 = Arm()
AT(0,0,0) RELATIVE PREVIOUS
ROTATED (dcm_theta,0,0) RELATIVE PREVIOUS
COMPONENT mon_dcm_e = COPY(mon_src_e)
AT (0,0,0.5) RELATIVE PREVIOUS
COMPONENT mon_dcm_xy = COPY(mon_src_xy)
AT (0,0,0) RELATIVE PREVIOUS
// M1 location -----------------------------------------------------------------
COMPONENT M1_location = Arm()
AT(0,0,26-16.5-0.5) RELATIVE mon_dcm_e
COMPONENT M1_rotated = Arm() // rotation of the mirror
AT(0,0,0) RELATIVE M1_location
ROTATED (-M1_angle,0,0) RELATIVE M1_location
// should image the slit to get a parallel beam.
COMPONENT M1 = Mirror_curved( // 90 deg brings it from YZ (vert) to XZ (horiz)
length=.350, width=0.2,
coating="Pd.txt", radius=M1_radius)
AT(0,0,0) RELATIVE M1_rotated
ROTATED (0, 0, 90) RELATIVE M1_rotated
EXTEND %{
if (!SCATTERED) ABSORB;
%}
COMPONENT M1_out = Arm() // 2-theta direction
AT(0,0,0) RELATIVE M1_rotated
ROTATED (-M1_angle,0,0) RELATIVE M1_rotated
// M2 mirror -------------------------------------------------------------------
COMPONENT M2_location = Arm()
AT (0,0,28-26) RELATIVE M1_out
COMPONENT M2_rotated = Arm() // rotation of the mirror
AT(0,0,0) RELATIVE M2_location
ROTATED (M1_angle,0,0) RELATIVE M2_location
COMPONENT M2 = Mirror_curved( // bring it from YZ to XZ (horiz)
length=0.550, width=.2,
coating="Pd.txt", radius=M2_radius)
AT(0,0,0) RELATIVE M2_rotated
ROTATED (0, 0, -90) RELATIVE M2_rotated
EXTEND %{
if (!SCATTERED) ABSORB;
%}
COMPONENT M2_out = Arm() // 2-theta direction
AT(0,0,0) RELATIVE M2_rotated
ROTATED (M1_angle,0,0) RELATIVE M2_rotated
// The sample area -------------------------------------------------------------
// align surface so that the beam hits its centre (shift along Y axis)
SPLIT 10 COMPONENT sample_stage = COPY(mon_src_xy)
AT (0,0,33-28) RELATIVE PREVIOUS
EXTEND %{
flag_scatt = 0;
%}
COMPONENT sx_layer = Single_crystal(
reflections=sample_coating, xwidth=2e-3, yheight=sample_thickness, zdepth=0.01,
surf_size=-1, mosaic=1e-4, sigma_inc=0, p_transmit = 0.1)
AT (0,-sample_thickness/2,0) RELATIVE sample_stage
ROTATED (sample_angle,0,0) RELATIVE sample_stage
EXTEND %{
if (SCATTERED) flag_scatt++;
%}
COMPONENT sx_bulk = Single_crystal(
reflections=sample_bulk, xwidth=2e-3, yheight=1e-3, zdepth=0.01,
surf_size=-1, mosaic=1e-4, sigma_inc=0)
AT (0,-1e-3/2,0) RELATIVE PREVIOUS /* just below the thin layer */
EXTEND %{
if (SCATTERED) flag_scatt += 2;
%}
COMPONENT sample_out = Arm()
AT (0,0,0) RELATIVE sample_stage
EXTEND %{
if (!flag_scatt) ABSORB;
%}
COMPONENT det4pi = Monitor_nD(radius=1, options="theta phi", bins=2048)
AT (0,0,0) RELATIVE sample_stage
COMPONENT detector_layer = COPY(det4pi)
WHEN (flag_scatt == 1 || flag_scatt == 3)
AT (0,0,0) RELATIVE sample_stage
COMPONENT detector_bulk = COPY(det4pi)
WHEN (flag_scatt > 1)
AT (0,0,0) RELATIVE sample_stage
END
|