File: Grating.py

package info (click to toggle)
python-xrt 1.6.0%2Bds1-1
  • links: PTS, VCS
  • area: main
  • in suites: trixie
  • size: 17,572 kB
  • sloc: python: 59,424; xml: 4,786; lisp: 4,082; sh: 22; javascript: 18; makefile: 17
file content (117 lines) | stat: -rw-r--r-- 4,096 bytes parent folder | download | duplicates (2)
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
# -*- coding: utf-8 -*-
__author__ = "Konstantin Klementiev"
__date__ = "08 Mar 2016"
import os, sys; sys.path.append(os.path.join('..', '..', '..'))  # analysis:ignore
import numpy as np
import xrt.backends.raycing as raycing
import xrt.backends.raycing.sources as rs
#import xrt.backends.raycing.apertures as ra
import xrt.backends.raycing.oes as roe
import xrt.backends.raycing.run as rr
import xrt.backends.raycing.materials as rm
import xrt.plotter as xrtp
import xrt.runner as xrtr
import xrt.backends.raycing.screens as rsc

showIn3D = False

mGold = rm.Material('Au', rho=19.3, kind='grating')

gratingKind = 'y-grating'
if gratingKind == 'x-grating':
    rho, fsm2pos = 3000., 15880.
elif gratingKind == 'y-grating':
    rho, fsm2pos = -100., 25000.
else:
    raise


class Grating(roe.OE):
    def local_g(self, x, y, rho=rho):
        """Must be directed toward the positive oreder direction!"""
        if gratingKind == 'x-grating':
            return rho, 0, 0  # constant line spacing along x
        if gratingKind == 'y-grating':
            return 0, rho, 0


def build_beamline(nrays=raycing.nrays):
    beamLine = raycing.BeamLine(height=0)
    rs.GeometricSource(
        beamLine, 'GeometricSource', (0, 0, 0),
        nrays=nrays, dx=0., dz=0., dxprime=2e-4, dzprime=1e-4,
        distE='lines', energies=(75, 100, 125), polarization='horizontal')
#    beamLine.feFixedMask = ra.RectangularAperture(beamLine,
#      'FEFixedMask', 0, 10000,
#      ('left', 'right', 'bottom', 'top'), [-3., 3., -1., 1.])
    beamLine.fsm1 = rsc.Screen(beamLine, 'DiamondFSM1', (0., 10001., 0.))
    beamLine.grating = Grating(beamLine, 'PlaneGrating', [0., 15000., 0.],
                               pitch=np.radians(10), material=mGold)
    beamLine.grating.order = np.arange(-2, 3)
    beamLine.fsm2 = rsc.Screen(beamLine, 'DiamondFSM2', (0., fsm2pos, 0.))
    return beamLine


def run_process(beamLine, shineOnly1stSource=False):
    beamSource = beamLine.sources[0].shine()
#    beamLine.feFixedMask.propagate(beamSource)
    beamFSM1 = beamLine.fsm1.expose(beamSource)
    beamGratingGlobal, beamGratingLocal = beamLine.grating.reflect(beamSource)
    beamFSM2 = beamLine.fsm2.expose(beamGratingGlobal)
    outDict = {'beamSource': beamSource, 'beamFSM1': beamFSM1,
               'beamGratingGlobal': beamGratingGlobal,
               'beamGratingLocal': beamGratingLocal,
               'beamFSM2': beamFSM2}
    if showIn3D:
        beamLine.prepare_flow()
    return outDict
rr.run_process = run_process


def define_plots(beamLine):
    fwhmFormatStrE = None
    plots = []

    plot1 = xrtp.XYCPlot(
        'beamFSM1', (1,), xaxis=xrtp.XYCAxis(r'$x$', 'mm'),
        yaxis=xrtp.XYCAxis(r'$z$', 'mm'), title='FSM1_E')
    plot1.caxis.fwhmFormatStr = None
    plot1.caxis.limits = [70, 130]
    plots.append(plot1)

    plot2 = xrtp.XYCPlot(
        'beamFSM2', (1,), aspect='auto',
        xaxis=xrtp.XYCAxis(r'$x$', 'mm', limits='symmetric'),
        yaxis=xrtp.XYCAxis(r'$z$', 'mm'),
        caxis=xrtp.XYCAxis('energy', 'eV', bins=64, ppb=4, limits=[70, 130]),
        title='FSM2_Es')
    plot2.caxis.fwhmFormatStr = fwhmFormatStrE
#    plot2.fluxFormatStr = '%.2e'
    plot2.saveName = gratingKind + 'E.png'
    plots.append(plot2)

    plot3 = xrtp.XYCPlot(
        'beamFSM2', (1,), aspect='auto',
        xaxis=xrtp.XYCAxis(r'$x$', 'mm', limits='symmetric'),
        yaxis=xrtp.XYCAxis(r'$z$', 'mm'),
        caxis=xrtp.XYCAxis('diffraction order', '', bins=32, ppb=8),
        title='FSM2_Es')
    plot3.caxis.fwhmFormatStr = None
    plot3.caxis.limits = [-2.1, 2.1]
#    plot2.fluxFormatStr = '%.2e'
    plot3.saveName = gratingKind + 'Order.png'
    plots.append(plot3)
    return plots


def main():
    beamLine = build_beamline()
    if showIn3D:
        beamLine.glow(scale=[300, 3, 10], centerAt='PlaneGrating')
    plots = define_plots(beamLine)
    xrtr.run_ray_tracing(plots, repeats=1, beamLine=beamLine)

#this is necessary to use multiprocessing in Windows, otherwise the new Python
#contexts cannot be initialized:
if __name__ == '__main__':
    main()