File: SOLEIL_CASSIOPEE.instr

package info (click to toggle)
mccode 3.5.19%2Bds5-2
  • links: PTS, VCS
  • area: main
  • in suites: sid, trixie
  • size: 1,113,256 kB
  • sloc: ansic: 40,697; python: 25,137; yacc: 8,438; sh: 5,405; javascript: 4,596; lex: 1,632; cpp: 742; perl: 296; lisp: 273; makefile: 226; fortran: 132
file content (291 lines) | stat: -rw-r--r-- 8,664 bytes parent folder | download
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
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
/*******************************************************************************
* Instrument: CASSIOPEE beamline at SOLEIL
*
* %Identification
* Written by: François Bertran
* Date: 11/03/2022
* Origin: SOLEIL
* Version: 0.2
* %INSTRUMENT_SITE: SOLEIL
*
* CASSIOPEE beamline at SOLEIL
*
* %Description
* CASSIOPEE : Combined Angle- and Spin-resolved SpectroscopIes Of PhotoEmitted Electrons
*
* The CASSIOPEE beamline is dedicated to photoemission experiments in the 8 eV -
* 1500 eV photon energy range. The beamline uses two undulators, and the main
* optical elements are the entrance optics and the monochromator. After the
* monochromator, the beamline is divided into two branches, supplying photons to
* two endstations (Spin-resolved Photoemission, and High Resolution Angle-resolved
* Photoemission), both connected to a Molecular Beam Epitaxy chamber.
*
* Position | Element
* ---------|--------------------------------------------------------------------
* 0        | Undulator HU60 / HU256
* 21.83    | Plane mirror M1a
* 22.18    | Spherical mirror M1b
* 28.83    | Plane grating (reflection)
* 29.02    | Plane mirror M2
* 30.83    | Slit
*
* %Example: E0=0 Detector: PSD_M1out_I=2.74309e+15
*
* %Parameters
* E0:              [keV] Undulator emission energy, e.g. 40e-3 or 300e-3 keV. 0=auto
* lambda:          [Ang] Undulator emission wavelength. Used when E0=0.
* dE:              [keV] Undulator energy bandwidth, e.g. 1e-3.
* mirror_material: [str] Mirror M1 coating (e.g. Pt.dat)
* undulator_index: [1-2] Undulator 1=HU60; 2=HU256
* M1_angle:        [deg] M1 mirror angle. 0=auto
* PG_angle:        [deg] Reflective grating monochromator. 0=auto
* PM_angle:        [deg] M2 mirror angle. 0=auto
* beta_mono:       [deg] Monochromator angle. 0=auto
* r_rho:           [/mm] Grating number of lines/mm. 0=auto.
* 
* %L
* https://www.synchrotron-soleil.fr/en/beamlines/cassiopee
* %Link
* https://www.researchgate.net/deref/https%3A%2F%2Ftel.archives-ouvertes.fr%2Ftel-01064523
*
* %E
*******************************************************************************/
DEFINE INSTRUMENT SOLEIL_CASSIOPEE (
  string mirror_material = "Pt.dat", 
  int undulator_index =1, 
  M1_angle = 0,
  PG_angle = 0, 
  PM_angle = 0, 
  E0 = 0, dE=1e-3,
  lambda = 0, 
  beta_mono = 0, 
  r_rho = 0)


INITIALIZE
%{
#define sqr(x) ((x)*(x))

double cos_alpha= 0;
double c        = 0.2;  // Petersen law coefficient sin(b) / sin(a) = c = 0.2 */
double order    = 1;

// source choice
if (!E0 && !lambda) {
  if (undulator_index == 1)      E0 = 300e-3;
  else if (undulator_index == 2) E0 = 40e-3;
}

if (lambda && !E0) E0     = 1.24125e-6/lambda;
else if (!lambda && E0) lambda = 1.24125e-6/E0;

if (!M1_angle) M1_angle = (undulator_index == 1 ? 2.44 : 5.02); // degrees
if (!r_rho)    r_rho    = (undulator_index == 1 ? 1600 : 400 ); // lines/mm

/* grating deviation angles */
cos_alpha = (-r_rho*lambda + sqrt( sqr(c*r_rho*lambda) + sqr(1 - sqr(c)) ))/(1 - sqr(c) );

if (!PG_angle)  // alpha angle = incoming, order = 0
  PG_angle  = RAD2DEG*acos( cos_alpha );
  
if (!beta_mono) // beta angle  = outging,  order = 1
  beta_mono = RAD2DEG*acos( cos_alpha + order*r_rho*lambda );

if (!PM_angle) 
  PM_angle = (PG_angle + beta_mono)/2;

MPI_MASTER(
printf("%s: Undulator %s E0=%g [eV] lambda=%g [Angs] M1_angle=%g [deg] PG_angle=%g [deg] PM_angle=%g [deg]\n", 
  NAME_INSTRUMENT,
  undulator_index == 1 ? "HU60":"HU256",
  E0, lambda, 
  M1_angle, PG_angle, PM_angle);
);

%}


TRACE

COMPONENT Origin = Progress_bar() 
AT (0, 0, 0) ABSOLUTE

/* -------------------------------------------------- Source HU60 */
COMPONENT Source_HU60 = Undulator(
    E0 = E0,
    dE = 1e-3,
    Ee = 2.75,
    Ie = 0.5,
    K = 5,
    sigex = 217.4e-6,
    sigey = 10.6e-6,
    sigepx = 31.4e-6,
    sigepy = 4.2e-6)
WHEN undulator_index == 1
AT (0, 0, 0) RELATIVE Origin



/* -------------------------------------------------- Source HU256 */

COMPONENT Source_HU256 = Undulator(
    E0 = E0,
    dE = 1e-3,
    Ee = 2.75,
    Ie = 0.5,
    K = 5,
    sigex = 214.7e-6,
    sigey = 8.2e-6,
    sigepx = 31.4e-6,
    sigepy = 4.2e-6)
WHEN undulator_index == 2
AT (0, 0, 2.727) RELATIVE Origin

/* -------------------------------------------------- Plane mirror M1a */
/* dimensions 130x25 mm (e=60 mm) */

COMPONENT M1a_location = Arm()
AT (0, 0, 21.83)          RELATIVE Origin

COMPONENT M1a = Mirror_curved( // in YZ plane
  coating = mirror_material,
  zdepth  = 0.130,
  yheight = 0.025,
  radius  = 0                 // flat
)
AT (0, 0, 0)             RELATIVE M1a_location
ROTATED (0, M1_angle, 0) RELATIVE M1a_location

COMPONENT M1a_out = Arm()
AT (0,0,0)                 RELATIVE M1a_location
ROTATED (0, 2*M1_angle, 0) RELATIVE M1a_location

/* -------------------------------------------------- Spherical mirror M1b */
/* dimensions 150x25 mm (e=60 mm) radius 108.4 m */

COMPONENT M1b = Mirror_curved(
    coating = mirror_material,
    radius  = -108.4,
    length  = 0.150,
    width   = 0.025
)    
WHEN undulator_index == 2
AT (0, 0, 0.352)         RELATIVE M1a_out
ROTATED (0, -M1_angle, 0) RELATIVE M1a_out


/* -------------------------------------------------- Spherical mirror M1c */
/* dimensions 160x25 mm (e=60 mm) radius 120 m */

COMPONENT M1c = Mirror_curved(
    coating = mirror_material,
    radius  = -120,
    length  = 0.160,
    width   = 0.025
)  
WHEN undulator_index == 1  
AT (0, 0, 0.352+0.357)   RELATIVE M1a_out
ROTATED (0, -M1_angle, 0) RELATIVE M1a_out

COMPONENT M1bc_out = Arm()
AT (0,0,0) RELATIVE PREVIOUS
ROTATED (0, -M1_angle, 0) RELATIVE PREVIOUS

/* --------------------------------------------------- Grating 1
/* dimensions 95x40 mm, 400 lines/mm, horizontal, 6 m de M1a */

COMPONENT PSD_M1out = Monitor_nD(xwidth=1e-3, yheight=1e-3, bins=512,
  options = "x y")
AT (0,0,3) RELATIVE PREVIOUS

COMPONENT  PG_location = Arm()
AT (0,0, 6 - 0.352 - 0.357) RELATIVE M1bc_out

/* Monochromator grating ---------------------------------------------------- */
/* cos(a) - cos(b) = N.k.lambda ; N=r_rho; k=order; a=incident; b=outgoing    */
/* we use the Petersen law: sin(b) / sin(a) = 0.2                             */
/* beam deviation is alpha+beta                                               */
/* Grating_reflect(d_phi=1,order=0,rho_l=100,zdepth=102e-3,xwidth=102e-3)     */

COMPONENT PG = Grating_reflect(
   zdepth = 0.095,
   xwidth = 0.040,
   d_phi  = 2,
   order  = 1,
   rho_l  = r_rho
)
AT (0,0, 0) RELATIVE PG_location
ROTATED (PG_angle, 0, 0) RELATIVE PG_location



/* --------------------------------------------------- Grating 2
/* dimensions 95x40 mm, 800 lines/mm, horizontal, 6 m from M1a */

/* --------------------------------------------------- Grating 3
/* dimensions 95x40 mm, 1600 lines/mm, horizontal, 6 m from M1a */

/* -------------------------------------------------- Plane mirror M2 */
/* dimensions 320x30 mm (e=60 mm)
 * rotation axis is 10 mm under the grating, 20 mm under the surface mirror
 * (which is face down) and 190 mm before the mirror centre
 * => the beam is deflected by 20 mm upwards
 */

COMPONENT M2_rotation_axis = Monitor_nD(xwidth=1e-2, yheight=1e-2,
  options="x y", bins=512)
AT (0, -0.01, 0) RELATIVE PG_location

COMPONENT M2 = Mirror(
coating = mirror_material,
zdepth = 0.320,
xwidth = 0.030
    )
AT (0, 0.02, .190) RELATIVE M2_rotation_axis
ROTATED (-PM_angle, 0, 0) RELATIVE M2_rotation_axis

COMPONENT PM_takeoff = Arm()
AT (0,0,0) RELATIVE M2
ROTATED (0,0,0) RELATIVE Origin

/* -------------------------------------------------- Horizontal slit */
/* 2 microns aperture at 2 mm
 * located 3 m from the grating, i.e. 9 m from M1a 
 */

COMPONENT slit = Slit(
    )
AT (-0.062, 0, 30.83) RELATIVE Origin	

/* Refocalisation branche 1 */

/* --------------------------------------------------- Toroidal mirror M3 */
/* dimensions 300x35 mm (e=60 mm)
 * located 3 m from the slit  and at 7.5 m from experimental station CX1
 * R = 180 m, r = 0.15 m, déviation 4° 
 */


/* Refocalisation branche 2 */

/* ---------------------------------------------------- Spherical mirror M4 */
/* dimensions 320x35 mm (e=40 mm)
 * located à 7 m after the slit, radius = 94.88 m, deviation 5.8 deg 
 */

COMPONENT M4 = Mirror_curved(
    coating = mirror_material)    
AT (0, 0, 0) RELATIVE PREVIOUS	
ROTATED (0, 0, 0) RELATIVE Origin

/* -------------------------------------------------- Toroidal mirror M5 */
/* dimensions 300x35 mm (e=40 mm)
 * located 0.4 m from M4 and 2 m from experimental station CX2
 * R = 263.65 m, r = 0.165 m, deviation 6 deg 
 */

COMPONENT PSD = Monitor_nD(xwidth=1e-2, yheight=1e-2,
  options = "x y")
AT (0,0,0.5) RELATIVE PREVIOUS

END