-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathtest_applications_grating.py
More file actions
137 lines (108 loc) · 5.56 KB
/
Copy pathtest_applications_grating.py
File metadata and controls
137 lines (108 loc) · 5.56 KB
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
from unittest.mock import patch
import pint
import pytest
import numpy as np
import pandas as pd
import xarray as xr
import os
from extra.data import open_run
from extra.applications import Grating2DCalibration, Grating1DCalibration
from extra.components import Scan, XrayPulses
def test_create_grating_2d_calibration():
# instantiates it without doing any calibration, only to check for syntax errors
cal = Grating2DCalibration()
def test_create_grating_1d_calibration():
# instantiates it without doing any calibration, only to check for syntax errors
cal = Grating1DCalibration()
def test_grating_1d_fit():
# instantiates it without doing any calibration, only to check for syntax errors
cal = Grating1DCalibration()
# fake calibration
energies = np.linspace(990, 1010, 10+1)
pix = np.linspace(0, 1000, 1000+1)
true_offset = 990
true_slope = 20/1000
true_pix_to_e = lambda p: true_offset + p*true_slope
true_e_to_pix = lambda e: (e - true_offset)/true_slope
data = np.exp(-0.5*(pix[None, :] - true_e_to_pix(energies)[:,None])**2)
cal.calibration_energies = energies
cal.calibration_data = data
cal.calibration_mask = np.ones(data.shape[0], dtype=bool)
cal.calibration_unc = np.zeros_like(data)
cal.calibration_motor = np.zeros((data.shape[0]))
cal.fit()
import matplotlib as mpl
mpl.use('Agg')
cal.plot()
assert np.isclose(cal.e0, true_offset, atol=1e-2, rtol=1e-2)
assert np.isclose(cal.slope, true_slope, atol=1e-2, rtol=1e-2)
def test_grating_2d_fit():
# instantiates it without doing any calibration, only to check for syntax errors
cal = Grating2DCalibration()
# fake calibration
energies = np.linspace(990, 1010, 10+1)
pix = np.linspace(0, 1000, 1000+1)
true_offset = 990
true_slope = 20/1000
true_pix_to_e = lambda p: true_offset + p*true_slope
true_e_to_pix = lambda e: (e - true_offset)/true_slope
data = np.exp(-0.5*(pix[None, :] - true_e_to_pix(energies)[:,None])**2)
cal.calibration_energies = energies
cal.calibration_data = data
cal.calibration_mask = np.ones(data.shape[0], dtype=bool)
cal.calibration_unc = np.zeros_like(data)
cal.calibration_motor = np.zeros((data.shape[0]))
cal.fit()
import matplotlib as mpl
mpl.use('Agg')
cal.plot()
assert np.isclose(cal.e0, true_offset, atol=1e-2, rtol=1e-2)
assert np.isclose(cal.slope, true_slope, atol=1e-2, rtol=1e-2)
def test_reading_grating2d(mock_sqs_grating_calibration_run, tmp_path):
monochromator_energy = "SA3_XTD10_MONO/MDL/PHOTON_ENERGY"
final_photon_spectrometer = "SQS_DIAG3_BIU/CAM/CAM_6:daqOutput"
monochromator_scan = Scan(mock_sqs_grating_calibration_run[monochromator_energy, "actualEnergy"], resolution=1)
grating_calibration = Grating2DCalibration(angle=0.0)
grating_calibration.setup(mock_sqs_grating_calibration_run[final_photon_spectrometer, "data.image.pixels"],
monochromator_scan,
)
d = tmp_path / "data"
d.mkdir()
fpath = str(d / "grating2d_test.h5")
grating_calibration.to_file(fpath)
grating_calibration = Grating2DCalibration.from_file(fpath)
calibrated = grating_calibration.apply(mock_sqs_grating_calibration_run.select_trains(np.s_[10:20]))
assert np.isclose(grating_calibration.e0, 990.0, atol=1e-2, rtol=1e-2)
assert np.isclose(grating_calibration.slope, 20.0/1000.0, atol=1e-2, rtol=1e-2)
def test_reading_grating1d(mock_sqs_grating_calibration_run, tmp_path):
monochromator_energy = "SA3_XTD10_MONO/MDL/PHOTON_ENERGY"
final_photon_spectrometer = "SQS_EXP_GH2-2/CORR/RECEIVER:daqOutput"
monochromator_scan = Scan(mock_sqs_grating_calibration_run[monochromator_energy, "actualEnergy"], resolution=1)
# fit without motor
grating_calibration = Grating1DCalibration(min_pixel=0, max_pixel=1000)
grating_calibration.setup(mock_sqs_grating_calibration_run[final_photon_spectrometer, "data.adc"],
monochromator_scan,
pulses=XrayPulses(mock_sqs_grating_calibration_run),
grating_mask=mock_sqs_grating_calibration_run[final_photon_spectrometer, "data.mask"],
)
# use motor information
grating_calibration = Grating1DCalibration(min_pixel=0, max_pixel=1000)
grating_calibration.setup(mock_sqs_grating_calibration_run[final_photon_spectrometer, "data.adc"],
monochromator_scan,
pulses=XrayPulses(mock_sqs_grating_calibration_run),
grating_mask=mock_sqs_grating_calibration_run[final_photon_spectrometer, "data.mask"],
grating_motor=mock_sqs_grating_calibration_run[final_photon_spectrometer, "data.motor"]
)
d = tmp_path / "data"
d.mkdir()
fpath = str(d / "grating1d_test.h5")
grating_calibration.to_file(fpath)
grating_calibration = Grating1DCalibration.from_file(fpath)
# with motor
calibrated = grating_calibration.apply(mock_sqs_grating_calibration_run.select_trains(np.s_[10:20]), assume_motor=0.0)
assert np.isclose(grating_calibration.e0, 990.0, atol=1e-2, rtol=1e-2)
assert np.isclose(grating_calibration.slope, 20.0/1000.0, atol=1e-2, rtol=1e-2)
# without motor
calibrated = grating_calibration.apply(mock_sqs_grating_calibration_run.select_trains(np.s_[10:20]))
assert np.isclose(grating_calibration.e0, 990.0, atol=1e-2, rtol=1e-2)
assert np.isclose(grating_calibration.slope, 20.0/1000.0, atol=1e-2, rtol=1e-2)