File: Test_grating_reflect.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 (120 lines) | stat: -rw-r--r-- 3,509 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
/*******************************************************************************
*         McXtrace instrument definition URL=http://www.mcxtrace.org
*
* Instrument: Test_grating_reflect
*
* %Identification
* Written by: Stephane Bac, Antoine Padovani
* Date: Jul 21st 2022
* Origin: Synchrotron Soleil
* %INSTRUMENT_SITE: Tests_optics
*
* Unit-test instrument for the Grating reflect component.
*
* %Description
*
* Simply a bending magnet illuminating a reflection grating.
*
* %Example: E0=1 Detector: psd_monitor_I=3.79378e+06
*
* %Parameters
* E0: [keV] Source's center of emitted energy spectrum
* dE: [keV] Source's half-width of emitted energy spectrum
* angle_grating_norm: [deg.] Angle between the norm of the grating and the incident ray
* number_lines_per_mm: Number of lines pr mm of the grating
* order: The target order of the grating 
* dphi: [deg.] Range of diffraction angle that is to be simulated -d_phi/2 ; d_phi/2
*
* %End
*******************************************************************************/
//n=1e8 rays is good for default values
//Only for the trace viewer, (because one would need to change the monitors dimensions,dphi for a simulation to see the different orders) one can also try an angle_grating_norm of 8.6833 and -8.6833 with E0=0.00248, dE=0, number_lines_per_mm=1200, and order = 0, 1 or -1. These values are relevant for the czerny_turner monochromator
DEFINE INSTRUMENT Test_grating_reflect(E0=1, dE=0.1, angle_grating_norm=88, number_lines_per_mm=100, order=0, dphi=1)

DECLARE
%{

double period;
double angle_order_grating;
double sign;
double angle_grating_norm_pos;

%}

INITIALIZE
%{

sign=1; //sign is here to take into account the ray arriving on the other side of the norm. Test angle_grating_norm=-88 for example.

period = 1/(1e3*number_lines_per_mm);
fprintf(stdout,"Grating period: %g \n", period);

angle_grating_norm_pos = angle_grating_norm;

if(angle_grating_norm<0){
  angle_grating_norm_pos = -angle_grating_norm;
  sign=-1;
}

angle_order_grating = RAD2DEG*asin(-(12.39842/(E0))/1e10*order/period+sin(DEG2RAD*angle_grating_norm_pos));
fprintf(stdout,"Angle for order %g is %g degrees \n", order, angle_order_grating);

%}

TRACE

COMPONENT origin = Progress_bar()
AT (0, 0, 0) RELATIVE ABSOLUTE

COMPONENT Source = Bending_magnet(
    E0=E0,   
    dE = dE,
    B=1.72,
    Ee=2.75
    )
AT (0, 0, 0) RELATIVE origin

COMPONENT Grating_position = Arm()
AT (0, 0, 844e-3) RELATIVE PREVIOUS	

COMPONENT Grating_rotation = Arm()
AT (0, 0, 0) RELATIVE PREVIOUS	
ROTATED (-(90-angle_grating_norm), 0, 0) RELATIVE PREVIOUS	

COMPONENT reflective_grating = Grating_reflect(
    d_phi=dphi,order=order,
    rho_l=number_lines_per_mm,
    zdepth=102e-3,xwidth=102e-3)    
AT (0, 0, 0) RELATIVE PREVIOUS
ROTATED (0, 0, 0) RELATIVE PREVIOUS

//4PI monitor for debugging purposes
/*COMPONENT psd_monitor_4pi = PSD_monitor_4PI(
filename="3D.dat",restore_xray=1)
AT (0, 0, 0) RELATIVE PREVIOUS*/

COMPONENT Mgrating_arm_back = Arm()
AT (0,0,0) RELATIVE PREVIOUS
ROTATED (sign*angle_order_grating, 0, 0) RELATIVE PREVIOUS

COMPONENT Monitor_location = Arm()
AT (0,749.1e-3,0) RELATIVE PREVIOUS
ROTATED (90, 0, 0) RELATIVE PREVIOUS

COMPONENT psd_monitor = PSD_monitor(
    filename="psd", 
    xwidth=0.02, yheight=0.02,         
    nx=100,
    ny=100,
    restore_xray = 1
    )
AT (0, 0, 0) RELATIVE PREVIOUS

COMPONENT psd_giant = PSD_monitor(xwidth=0.02, yheight=0.02, filename="psd_giant",ny=2000,nx=1)
AT(0,0,0) RELATIVE PREVIOUS

FINALLY
%{
%}

END