File: MAXII_811.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 (343 lines) | stat: -rw-r--r-- 10,539 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
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
/*******************************************************************************
*         McXtrace instrument definition URL=http://www.mcxtrace.org
*
* Instrument: MAXII_811
*
* %Identification
* Written by: Erik B Knudsen (erkn@fysik.dtu.dk)
* Date: Jan 23, 2011
* Origin: DTU Physics
* Version: 1.0
* %INSTRUMENT_SITE: MAXII
*
* XAFS and surface diffraction, Materials Science Beamline 811 at MAX-lab.
*
* %Description
* Fed by a wiggler, this beamline operates in monochromatic mode with an
* operational energy tunable between 2.3 – 20 keV (0.6 - 5.3 AA).
* The wavelength is chosen by a double monochromator crystal setup where either
* Si 111 or Si 311 may be chosen. Furthermore a double mirror
* setup may be used to to focus the beam onto a sample. The rotation of the
* first mirror defines the position of the second which is computed automatically.
* If mirrors are in the monochromators are automatically reposistioned to
* accomadate the deflected beam. 
*
* %Example: MAXII_811.instr M1=1 M2=1 M1_pitch=1 M2_pitch=1 theta=14.226   Detector: sphere_psd_I=1.7e+08
* %Example: MAXII_811.instr M1=0 M2=0 theta=14.226    Detector: hutch_E2_I=2.25761e+11
*
* %Parameters
* Emin:    [keV] Minmium energy of radiation emitted from wiggler.
* Emax:    [keV] Maxmium energy of radiation emitted from wiggler.
* prim_h:  [m]   Horizontal opening of primary slits.
* prim_v:  [m]   Vertical opening of primary slits.
* M1:      [ ]   Is mirror 1 in the beam?
* M1_R:    [m]   Radius of curvature of mirror 1.
* M1_pitch: [deg] Central glancing angle of mirror 1.
* M2:      [ ]   Is mirror 2 in the beam?
* M2_R:    [m]   Radius of curvature of mirror 2.
* M2_pitch: [deg] Central glancing angle of mirror 2.
* theta:   [deg] Scattering angle of monochromators
* TTH:     [deg] Angle at which to put the surface diffraction detector
* ATT1:    [ ]   Should attenuation filter 1 be in the beam?
* ATT2:    [ ]   Should attenuation filter 2 be in the beam?
* ATT3:    [ ]   Should attenuation filter 3 be in the beam?
* XAFS:    [ ]   Flag to activate/inactivate the XAFS station
* xafs_h:  [m]   XAFS station horizontal slit opening
* xafs_v:  [m]   XAFS station vertical   slit opening

* %Link
* http://www.maxlab.lu.se/beamlines/bli811/
* %End
*******************************************************************************/

/* Change name of instrument and input parameters with default values */
DEFINE INSTRUMENT MAXII_811(
    Emin=1e-3,Emax=12,
    prim_h=.40e-3,prim_v=0.6e-3,
    xafs_h=3e-3,xafs_v=3e-3,
    M1=0,M1_R=2000,M1_pitch=0,M2=0,M2_R=800,M2_pitch=0,
    theta=14.226,TTH=0,
    ATT1=0,ATT2=0,ATT3=0,
    XAFS=0
)

/* The DECLARE section allows us to declare variables or  small      */
/* functions in C syntax. These may be used in the whole instrument. */
DECLARE
%{
  const double prim_slit_L=6.4;
  const double ap2_L=6;
  const double ap3_L=7;

  const double att_filter1_L=16;
  const double c_filter_L=17;

  double mono1_y;
  double mono2_z;
  double mono2_y;

  const double Delta_y=25e-3;

  double mirror1_angle;
  double mirror2_angle;
  const double M2_L=20;

  double Lmin;
  double Lmax;
%}

/* The INITIALIZE section is executed when the simulation starts     */
/* (C code). You may use them as component parameter values.         */
INITIALIZE
%{

  if (M1 && M1_pitch){
    mirror1_angle=RAD2DEG*1e-3*M1_pitch;
  }else{
    mirror1_angle=0;
  }

  if (M2 && !M2_pitch){
    mirror2_angle=mirror1_angle;
  }else if(M2){
    mirror2_angle=RAD2DEG*1e-3*M2_pitch;
  }else{
    mirror2_angle=0;
  }

  /*the lower monchromator must be displaced to catch the beam from the mirrors*/
  mono1_y=8*sin(2*mirror1_angle*DEG2RAD);
  /*now compute the position of mono2*/
  double beta=DEG2RAD*(2*theta-2*mirror1_angle);
  if (beta<=0){
    fprintf(stderr,"ERROR: (%s): theta (%g) must be larger than mirror 1 deflection angle (%g) to match fixed exit criterion.\n",instrument_name,theta,mirror1_angle);
    exit(-1);
  }

  if (mirror2_angle==0){
    double t=(-mono1_y+Delta_y)/sin(beta);
    mono2_y=mono1_y+t*sin(beta);
    mono2_z=8+t*cos(beta);
  }else{
    double t,s;
    s=( (mono1_y+Delta_y) - tan(beta)*(10-8))/(-sin(2*DEG2RAD*mirror2_angle)-cos( 2*DEG2RAD*mirror2_angle)*tan(beta) );
    mono2_y=(Delta_y)+s*sin(2*DEG2RAD*mirror2_angle);
    mono2_z=10-s*cos(2*DEG2RAD*mirror2_angle);
  }
  Lmin=2*M_PI/(E2K*20);
  Lmax=2*M_PI/(E2K*0.1);

%}

/* Here comes the TRACE section, where the actual      */
/* instrument is defined as a sequence of components.  */
TRACE

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

COMPONENT wiggler = Source_gaussian(
 sigPr_x=7e-6*FWHM2RMS, sigPr_y=0.3e-6*FWHM2RMS,
 sig_x=250e-6*FWHM2RMS, sig_y=50e-6*FWHM2RMS,
 spectrum_file="characteristics_wiggler811.dc0",E0=(Emin+Emax)/2.0,dE=(Emax-Emin)/2.0,
 dist=4.454,dlambda=0)
AT(0,0,0) RELATIVE Origin

COMPONENT source_psd=PSD_monitor(
  nx=100,ny=100,xwidth=1e-3, yheight=1e-3, filename="source.psd")
AT (0,0,1) RELATIVE wiggler 
COMPONENT source_E=E_monitor(
  nE=200,Emin=0.1, Emax=20, xwidth=2e-3, yheight=2e-3,
filename="source.E")
AT (0,0,1e-9) RELATIVE PREVIOUS 
COMPONENT source_L=L_monitor(
  nL=200,Lmin=Lmin, Lmax=Lmax, xwidth=2e-3, yheight=2e-3,
filename="source.L")
AT (0,0,1e-9) RELATIVE PREVIOUS 

COMPONENT ap1 = Slit(
  yheight=4e-3, xwidth=28e-3)
AT(0,0,4.454) RELATIVE wiggler

COMPONENT ap2 = Slit(
  yheight=6.8e-3,xwidth=46e-3)
AT(0,0,6) RELATIVE wiggler

/*Frontend carbon Filter*/
COMPONENT  fe_c_filter= Filter(
  material_datafile="C.txt", xwidth=.1, yheight=.1, zdepth=12e-6)
AT(0,0,6.3) RELATIVE wiggler

/*Primary Slits*/
COMPONENT prim_slitv = Slit(
  xwidth=.1,yheight=prim_v)
AT(0,0,6.4) RELATIVE wiggler
COMPONENT prim_slith = Slit(
  xwidth=prim_h,yheight=.1)
AT(0,0,15e-3) RELATIVE PREVIOUS

COMPONENT ap3 = COPY(ap2)
AT(0,0,7) RELATIVE wiggler

COMPONENT m_entry_psd = COPY(source_psd)(filename="me_psd") 
AT(0,0,9.4) RELATIVE wiggler
COMPONENT m_entry_E=E_monitor(
  nE=200,Emin=0.1, Emax=20, xwidth=2e-3, yheight=2e-3,
  filename="m_entry.E")
AT (0,0,1e-9) RELATIVE PREVIOUS 
COMPONENT m_entry_L=L_monitor(
  nL=200,Lmin=Lmin, Lmax=Lmax, xwidth=2e-3, yheight=2e-3,
  filename="m_entry.L")
AT (0,0,1e-9) RELATIVE PREVIOUS 

/*Frontend Wall is here*/

COMPONENT mirror1_pos = Arm()
AT(0,0,10) RELATIVE wiggler
COMPONENT mirror1_mnt = Arm()
AT (0,0,0) RELATIVE mirror1_pos
ROTATED (0,0,-90) RELATIVE wiggler

COMPONENT mirror1 = Mirror_curved(
    coating="Rh.txt", radius=M1_R, R0=0,length=1,width=60e-3
)
WHEN (M1) AT(0,0,0) RELATIVE mirror1_mnt
ROTATED (0,mirror1_angle,0) RELATIVE mirror1_mnt

COMPONENT mirror1_exit = Arm()
AT(0,0,0) RELATIVE mirror1_mnt
ROTATED(2*mirror1_angle,0,0) RELATIVE wiggler
/*Beam pos monitors*/

/*Beam attenuation filters (3 carbon)*/
COMPONENT att_filter1 = Filter (
  material_datafile="C.txt",xwidth=0.1,yheight=0.1,zdepth=1e-3)
WHEN (ATT1) AT(0,0,att_filter1_L) RELATIVE wiggler

COMPONENT att_filter2= COPY(att_filter1)(zdepth=0.3e-3)
WHEN (ATT2) AT(0,0,2e-3) RELATIVE PREVIOUS  

COMPONENT att_filter3= COPY(att_filter1)(zdepth=0.1e-3)
WHEN (ATT3) AT(0,0,2e-3) RELATIVE PREVIOUS 

/*100 mu carbon filter*/
COMPONENT c_filter =COPY(fe_c_filter)(zdepth=1e-4)
AT(0,0,c_filter_L) RELATIVE wiggler

/*Monochromator crystals*/
COMPONENT mono_lower = Bragg_crystal(
  length=0.05,width=0.02,h=1,k=1,l=1,alpha=0)
AT(0,-mono1_y,8) RELATIVE mirror1_pos
ROTATED(-(theta-2*mirror1_angle),0,0) RELATIVE mirror1_pos 

COMPONENT mono_upper_mnt = Arm()
AT(0,mono2_y,mono2_z) RELATIVE mirror1_pos
ROTATED (0,0,180) RELATIVE wiggler

COMPONENT mono_upper = Bragg_crystal(
  length=0.05, width=0.02,h=1,k=1,l=1,alpha=0)
AT(0,0,0) RELATIVE mono_upper_mnt
ROTATED (theta-2*mirror1_angle,0,0) RELATIVE mono_upper_mnt

COMPONENT mirror2_mnt = Arm()
AT(0,Delta_y,M2_L) RELATIVE wiggler
ROTATED (0,0,90) RELATIVE wiggler

COMPONENT mirror2 = Mirror_curved(
  coating="Rh.txt",radius=M2_R,length=1,width=80e-3,R0=1
)
WHEN (M2) AT(0,0,0) RELATIVE mirror2_mnt
ROTATED (0,-mirror2_angle,0) RELATIVE mirror2_mnt

COMPONENT mirror2_exit = Arm()
AT(0,0,0) RELATIVE mirror2
ROTATED (0,-2*mirror2_angle,0) RELATIVE mirror2_mnt

/*Safety Shutter*/

/*Be window*/
COMPONENT be_window = Filter(
xwidth=0.2, yheight=0.2, zdepth=200e-6)
AT(0,25e-3,22) RELATIVE wiggler 

COMPONENT hutch_psd = COPY(source_psd)(filename="hutch_psd") 
AT(0,0,1e-3) RELATIVE PREVIOUS 
COMPONENT hutch_E=E_monitor(
  nE=100,Emin=8.04, Emax=8.06, xwidth=2e-1, yheight=2e-1, 
  filename="hutch.E")
AT (0,0,1e-9) RELATIVE PREVIOUS 
COMPONENT hutch_E2=COPY(m_entry_E)(
    filename="hutch2.E2")
AT (0,0,1e-9) RELATIVE PREVIOUS 
COMPONENT hucth_L=L_monitor(
  nL=100,Lmin=1.538, Lmax=1.542, xwidth=2e-1, yheight=2e-1, 
  filename="hutch.L")
AT (0,0,1e-9) RELATIVE PREVIOUS 


/*XAFS station*/
COMPONENT xafs_slit = Slit(
  xwidth=xafs_h,yheight=xafs_v)
WHEN (XAFS) AT(0,0,1) RELATIVE PREVIOUS

COMPONENT I0 = Monitor(xwidth=0.1,yheight=0.1)
WHEN(XAFS) AT(0,0,2) RELATIVE be_window

COMPONENT xafs_sample_pos = Arm()
WHEN(XAFS) AT(0,0,2.5) RELATIVE be_window

COMPONENT xafs_sample = Absorption_sample(
  radius_o=0.01,yheight_o=0.04, material_datafile_o="Ag.txt")
WHEN(XAFS) AT(0,0,0) RELATIVE xafs_sample_pos

COMPONENT I1 = Monitor(xwidth=0.1,yheight=0.1)
WHEN(XAFS) AT(0,0,2.7) RELATIVE be_window

COMPONENT xafs_ref_sample_pos = Arm()
WHEN(XAFS) AT(0,0,2.9) RELATIVE be_window

COMPONENT xafs_ref_sample = Filter(
  xwidth=0.1,yheight=0.1,zdepth=1e-4,material_datafile="Fe.txt")
WHEN(XAFS) AT (0,0,0) RELATIVE xafs_ref_sample_pos

COMPONENT I2 = Monitor(xwidth=0.1,yheight=0.1)
WHEN(XAFS) AT(0,0,3.1) RELATIVE be_window

/*Diffraction station*/
COMPONENT diff_sample_pos = Arm()
AT(0,0,4) RELATIVE be_window

COMPONENT  diff_sample_psd = PSD_monitor(
  xwidth=1.2e-3, yheight=1.2e-3,filename="diff_sample_psd",
  restore_xray=1) 
AT(0,0,0) RELATIVE diff_sample_pos

SPLIT COMPONENT si_sample = PowderN(
  reflections = "Si.laz", material="Si.txt", radius = 0.0002,
  yheight = 0.05, d_phi= 0)
AT (0, 0, 0) RELATIVE diff_sample_pos
EXTEND
%{
  if (!SCATTERED) ABSORB;
%}

COMPONENT tth_arm=Arm()
AT(0,0,0) RELATIVE diff_sample_pos
ROTATED (TTH,0,0) RELATIVE diff_sample_pos

COMPONENT sphere_psd=PSD_monitor_4PI(
    radius=0.5,filename="sphere_psd", restore_xray=1)
AT(0,0,0) RELATIVE si_sample

COMPONENT square_psd=PSD_monitor(
    xwidth=0.4,yheight=0.4,nx=201,ny=201,filename="square_psd",restore_xray=1)
AT(0,0,0.2) RELATIVE si_sample

COMPONENT pilatus100k = PSD_monitor(
  nx=487, ny=195, xwidth=83.8e-3, yheight=33.5e-3, filename="pil_diff.psd")
AT(0,0,1.2) RELATIVE tth_arm

END