mxcubecore 1.329.0__py3-none-any.whl → 1.330.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- mxcubecore/HardwareObjects/ESRF/ESRFXRFSpectrum.py +75 -54
- mxcubecore/HardwareObjects/ESRFLIMS.py +7 -5
- mxcubecore/HardwareObjects/ICATLIMS.py +104 -34
- mxcubecore/HardwareObjects/abstract/AbstractXRFSpectrum.py +43 -35
- mxcubecore/queue_entry/xrf_spectrum.py +6 -6
- {mxcubecore-1.329.0.dist-info → mxcubecore-1.330.0.dist-info}/METADATA +1 -1
- {mxcubecore-1.329.0.dist-info → mxcubecore-1.330.0.dist-info}/RECORD +10 -10
- {mxcubecore-1.329.0.dist-info → mxcubecore-1.330.0.dist-info}/COPYING +0 -0
- {mxcubecore-1.329.0.dist-info → mxcubecore-1.330.0.dist-info}/COPYING.LESSER +0 -0
- {mxcubecore-1.329.0.dist-info → mxcubecore-1.330.0.dist-info}/WHEEL +0 -0
|
@@ -38,12 +38,13 @@ __copyright__ = """ Copyright © by the MXCuBE collaboration """
|
|
|
38
38
|
__license__ = "LGPLv3+"
|
|
39
39
|
|
|
40
40
|
import logging
|
|
41
|
-
import os.path
|
|
42
41
|
from ast import literal_eval
|
|
42
|
+
from pathlib import Path
|
|
43
|
+
from shutil import copy2
|
|
43
44
|
from unittest.mock import MagicMock
|
|
44
45
|
from warnings import warn
|
|
45
46
|
|
|
46
|
-
import numpy
|
|
47
|
+
import numpy as np
|
|
47
48
|
from PyMca5.PyMca import (
|
|
48
49
|
ClassMcaTheory,
|
|
49
50
|
ConfigDict,
|
|
@@ -62,7 +63,7 @@ class ESRFXRFSpectrum(AbstractXRFSpectrum):
|
|
|
62
63
|
def __init__(self, name):
|
|
63
64
|
super().__init__(name)
|
|
64
65
|
self.cfgfile = None
|
|
65
|
-
self.
|
|
66
|
+
self.config = None
|
|
66
67
|
self.ctrl_hwobj = None
|
|
67
68
|
self.mcafit = None
|
|
68
69
|
self.default_erange = None
|
|
@@ -73,15 +74,16 @@ class ESRFXRFSpectrum(AbstractXRFSpectrum):
|
|
|
73
74
|
super().init()
|
|
74
75
|
self.ctrl_hwobj = self.get_object_by_role("controller")
|
|
75
76
|
self.cfgfile = self.get_property(
|
|
76
|
-
"cfgfile",
|
|
77
|
+
"cfgfile",
|
|
78
|
+
"/users/blissadm/local/beamline_configuration/misc/15keV.cfg",
|
|
77
79
|
)
|
|
78
|
-
self.
|
|
80
|
+
self.config = ConfigDict.ConfigDict()
|
|
79
81
|
self.mcafit = ClassMcaTheory.McaTheory(self.cfgfile)
|
|
80
82
|
self.default_erange = literal_eval(
|
|
81
|
-
self.get_property("default_energy_range", "[2.0, 15.0]")
|
|
83
|
+
self.get_property("default_energy_range", "[2.0, 15.0]"),
|
|
82
84
|
)
|
|
83
85
|
self.cfg_energies = literal_eval(
|
|
84
|
-
self.get_property("cfg_energies", "[7, 9, 12, 15]")
|
|
86
|
+
self.get_property("cfg_energies", "[7, 9, 12, 15]"),
|
|
85
87
|
)
|
|
86
88
|
|
|
87
89
|
def _doSpectrum(self, ctime, filename):
|
|
@@ -92,14 +94,18 @@ class ESRFXRFSpectrum(AbstractXRFSpectrum):
|
|
|
92
94
|
)
|
|
93
95
|
return self._execute_spectrum(ctime, filename)
|
|
94
96
|
|
|
95
|
-
def _execute_spectrum(
|
|
97
|
+
def _execute_spectrum(
|
|
98
|
+
self,
|
|
99
|
+
integration_time: float | None = None,
|
|
100
|
+
filename: str | None = None,
|
|
101
|
+
) -> bool:
|
|
96
102
|
"""Local XRF spectrum sequence.
|
|
97
103
|
|
|
98
104
|
Args:
|
|
99
|
-
integration_time
|
|
100
|
-
filename
|
|
105
|
+
integration_time: MCA integration time [s].
|
|
106
|
+
filename: Data file (full path).
|
|
101
107
|
Returns:
|
|
102
|
-
|
|
108
|
+
Procedure executed correctly (True) or error (False)
|
|
103
109
|
"""
|
|
104
110
|
filename = filename or self.spectrum_info_dict["filename"]
|
|
105
111
|
integration_time = integration_time or self.default_integration_time
|
|
@@ -124,13 +130,13 @@ class ESRFXRFSpectrum(AbstractXRFSpectrum):
|
|
|
124
130
|
|
|
125
131
|
# Next methods are for fitting the data with pymca
|
|
126
132
|
|
|
127
|
-
def mcafit_configuration(self, config=None):
|
|
133
|
+
def mcafit_configuration(self, config: dict | None = None):
|
|
128
134
|
"""Configure the fitting parameters. The procedure is time consuming.
|
|
129
135
|
It is only executed if the last configuration file is not the same.
|
|
130
136
|
|
|
131
137
|
Args:
|
|
132
|
-
config
|
|
133
|
-
|
|
138
|
+
config: Configuration dictionary, containing among others the
|
|
139
|
+
configuration file name.
|
|
134
140
|
"""
|
|
135
141
|
change = False
|
|
136
142
|
if not config or "file" not in config:
|
|
@@ -141,33 +147,36 @@ class ESRFXRFSpectrum(AbstractXRFSpectrum):
|
|
|
141
147
|
if self.cfgfile != cfgfile:
|
|
142
148
|
self.cfgfile = cfgfile
|
|
143
149
|
change = True
|
|
144
|
-
self.
|
|
145
|
-
if "concentrations" not in self.
|
|
146
|
-
self.
|
|
150
|
+
self.config.read(self.cfgfile)
|
|
151
|
+
if "concentrations" not in self.config:
|
|
152
|
+
self.config["concentrations"] = {}
|
|
147
153
|
change = True
|
|
148
|
-
if "attenuators" not in self.
|
|
149
|
-
self.
|
|
150
|
-
"Matrix": [1, "Water", 1.0, 0.01, 45.0, 45.0]
|
|
151
|
-
}
|
|
154
|
+
if "attenuators" not in self.config:
|
|
155
|
+
self.config["attenuators"] = {"Matrix": [1, "Water", 1.0, 0.01, 45.0, 45.0]}
|
|
152
156
|
change = True
|
|
153
157
|
if "flux" in config:
|
|
154
|
-
self.
|
|
158
|
+
self.config["concentrations"]["flux"] = float(config["flux"])
|
|
155
159
|
change = True
|
|
156
160
|
if "time" in config:
|
|
157
|
-
self.
|
|
161
|
+
self.config["concentrations"]["time"] = float(config["time"])
|
|
158
162
|
change = True
|
|
159
163
|
|
|
160
164
|
if change:
|
|
161
|
-
self.mcafit.configure(self.
|
|
162
|
-
|
|
163
|
-
def spectrum_analyse(
|
|
165
|
+
self.mcafit.configure(self.config)
|
|
166
|
+
|
|
167
|
+
def spectrum_analyse(
|
|
168
|
+
self,
|
|
169
|
+
data: list | None = None,
|
|
170
|
+
calib: list | None = None,
|
|
171
|
+
config: dict | None = None,
|
|
172
|
+
) -> bool:
|
|
164
173
|
"""Execute the fitting. Write the fitted data files to the archive
|
|
165
174
|
directory.
|
|
166
175
|
|
|
167
176
|
Args:
|
|
168
|
-
data
|
|
169
|
-
calib
|
|
170
|
-
config
|
|
177
|
+
data: The raw data.
|
|
178
|
+
calib: The mca calibration.
|
|
179
|
+
config: The configuration dictionary.
|
|
171
180
|
"""
|
|
172
181
|
|
|
173
182
|
if not config:
|
|
@@ -177,9 +186,9 @@ class ESRFXRFSpectrum(AbstractXRFSpectrum):
|
|
|
177
186
|
"bsX": self.spectrum_info_dict["beamSizeHorizontal"],
|
|
178
187
|
"bsY": self.spectrum_info_dict["beamSizeVertical"],
|
|
179
188
|
"legend": self.spectrum_info_dict["annotatedPymcaXfeSpectrum"],
|
|
180
|
-
"htmldir":
|
|
181
|
-
self.spectrum_info_dict["annotatedPymcaXfeSpectrum"]
|
|
182
|
-
)
|
|
189
|
+
"htmldir": Path(
|
|
190
|
+
self.spectrum_info_dict["annotatedPymcaXfeSpectrum"],
|
|
191
|
+
).parent,
|
|
183
192
|
}
|
|
184
193
|
|
|
185
194
|
self.mcafit_configuration(config)
|
|
@@ -191,15 +200,15 @@ class ESRFXRFSpectrum(AbstractXRFSpectrum):
|
|
|
191
200
|
|
|
192
201
|
try:
|
|
193
202
|
if data[0].size == 2:
|
|
194
|
-
xdata =
|
|
195
|
-
ydata =
|
|
203
|
+
xdata = np.array(data[:, 0]) * 1.0
|
|
204
|
+
ydata = np.array(data[:, 1])
|
|
196
205
|
else:
|
|
197
206
|
xdata = data[0] * 1.0
|
|
198
207
|
ydata = data[1]
|
|
199
208
|
|
|
200
209
|
try:
|
|
201
|
-
xmin = self.
|
|
202
|
-
xmax = self.
|
|
210
|
+
xmin = self.config["fit"]["xmin"]
|
|
211
|
+
xmax = self.config["fit"]["xmax"]
|
|
203
212
|
except KeyError:
|
|
204
213
|
xmin = data[0][0]
|
|
205
214
|
xmax = data[0][-1]
|
|
@@ -211,19 +220,26 @@ class ESRFXRFSpectrum(AbstractXRFSpectrum):
|
|
|
211
220
|
if fitresult:
|
|
212
221
|
fitresult = {"fitresult": fitresult[0], "result": fitresult[1]}
|
|
213
222
|
|
|
214
|
-
#
|
|
223
|
+
# create the gallery directory
|
|
224
|
+
new_dir = Path(self.spectrum_info_dict["filename"]).parent / "gallery"
|
|
225
|
+
if not self.create_directory(new_dir):
|
|
226
|
+
self.update_state(self.STATES.FAULT)
|
|
227
|
+
return False
|
|
228
|
+
|
|
229
|
+
# write the csv file to pyarch and gallery
|
|
215
230
|
csvname = self.spectrum_info_dict["fittedDataFileFullPath"]
|
|
216
231
|
self._write_csv_file(fitresult["result"], csvname)
|
|
232
|
+
copy2(csvname, new_dir / Path(csvname).name)
|
|
217
233
|
|
|
218
234
|
# write html report to pyarch
|
|
219
|
-
fname =
|
|
235
|
+
fname = Path(self.spectrum_info_dict["filename"]).name
|
|
220
236
|
outfile = fname.split(".")[0]
|
|
221
|
-
outdir =
|
|
222
|
-
self.spectrum_info_dict["annotatedPymcaXfeSpectrum"]
|
|
223
|
-
)
|
|
237
|
+
outdir = Path(
|
|
238
|
+
self.spectrum_info_dict["annotatedPymcaXfeSpectrum"],
|
|
239
|
+
).parent
|
|
224
240
|
|
|
225
241
|
_kw = {
|
|
226
|
-
"outdir": outdir,
|
|
242
|
+
"outdir": str(outdir),
|
|
227
243
|
"outfile": outfile,
|
|
228
244
|
"fitresult": fitresult,
|
|
229
245
|
"plotdict": {"logy": False},
|
|
@@ -232,6 +248,13 @@ class ESRFXRFSpectrum(AbstractXRFSpectrum):
|
|
|
232
248
|
report = QtMcaAdvancedFitReport.QtMcaAdvancedFitReport(**_kw)
|
|
233
249
|
text = report.getText()
|
|
234
250
|
report.writeReport(text=text)
|
|
251
|
+
|
|
252
|
+
# copy png file to galery
|
|
253
|
+
copy2(
|
|
254
|
+
self.spectrum_info_dict["jpegScanFileFullPath"],
|
|
255
|
+
new_dir,
|
|
256
|
+
)
|
|
257
|
+
|
|
235
258
|
return True
|
|
236
259
|
return False
|
|
237
260
|
except Exception as exp:
|
|
@@ -241,17 +264,17 @@ class ESRFXRFSpectrum(AbstractXRFSpectrum):
|
|
|
241
264
|
self.spectrum_command_failed()
|
|
242
265
|
return False
|
|
243
266
|
|
|
244
|
-
def _write_csv_file(self, fitresult, fname=None):
|
|
267
|
+
def _write_csv_file(self, fitresult: dict, fname: str | None = None):
|
|
245
268
|
"""Write fitted data to a csv file.
|
|
246
269
|
|
|
247
270
|
Args:
|
|
248
|
-
fitresult
|
|
271
|
+
fitresult: Data as dictionary.
|
|
249
272
|
Kwargs:
|
|
250
|
-
fname
|
|
273
|
+
fname: Filename to write to (full path).
|
|
251
274
|
"""
|
|
252
275
|
fname = fname or self.spectrum_info_dict["fittedDataFileFullPath"]
|
|
253
|
-
if
|
|
254
|
-
|
|
276
|
+
if Path(fname).exists():
|
|
277
|
+
Path(fname).unlink()
|
|
255
278
|
|
|
256
279
|
# get the significant peaks
|
|
257
280
|
peaks_dict = {}
|
|
@@ -283,7 +306,7 @@ class ESRFXRFSpectrum(AbstractXRFSpectrum):
|
|
|
283
306
|
header += delimiter + f'"{key}"'
|
|
284
307
|
|
|
285
308
|
# logging.getLogger("user_level_log").info("Writing %s" % fname)
|
|
286
|
-
with open(
|
|
309
|
+
with Path(fname).open("w") as csv_fd:
|
|
287
310
|
csv_fd.write(header)
|
|
288
311
|
csv_fd.write("\n")
|
|
289
312
|
for i in range(fitresult["xdata"].size):
|
|
@@ -301,23 +324,21 @@ class ESRFXRFSpectrum(AbstractXRFSpectrum):
|
|
|
301
324
|
fitresult["continuum"][i],
|
|
302
325
|
delimiter,
|
|
303
326
|
fitresult["pileup"][i],
|
|
304
|
-
)
|
|
327
|
+
),
|
|
305
328
|
)
|
|
306
329
|
for val in peaks_dict.values():
|
|
307
330
|
csv_fd.write(f"{delimiter}{val[i]:.7g}")
|
|
308
331
|
|
|
309
332
|
csv_fd.write("\n")
|
|
310
333
|
|
|
311
|
-
def _get_cfgfile(self, energy):
|
|
334
|
+
def _get_cfgfile(self, energy: float) -> str:
|
|
312
335
|
"""Get the correct configuration file.
|
|
313
336
|
|
|
314
337
|
Args:
|
|
315
338
|
energy(float): The energy to choose which configuration file.
|
|
316
339
|
"""
|
|
317
340
|
self.cfg_energies.sort()
|
|
318
|
-
|
|
319
|
-
cfg_path = os.path.split(self.cfgfile)[0]
|
|
320
341
|
for egy in self.cfg_energies:
|
|
321
342
|
if egy > energy:
|
|
322
|
-
return
|
|
323
|
-
return self.cfgfile
|
|
343
|
+
return str(Path(self.cfgfile).parent / f"{egy}keV.cfg")
|
|
344
|
+
return str(self.cfgfile)
|
|
@@ -24,7 +24,7 @@ class ESRFLIMS(AbstractLims):
|
|
|
24
24
|
self.ispyb = self.get_object_by_role("ispyb")
|
|
25
25
|
|
|
26
26
|
self.is_local_host = False
|
|
27
|
-
self.active_lims = self.drac.get_lims_name()
|
|
27
|
+
self.active_lims = self.drac.get_lims_name()[0]
|
|
28
28
|
|
|
29
29
|
def get_lims_name(self) -> List[Lims]:
|
|
30
30
|
return self.drac.get_lims_name() + self.ispyb.get_lims_name()
|
|
@@ -225,8 +225,8 @@ class ESRFLIMS(AbstractLims):
|
|
|
225
225
|
def allow_session(self, session: Session):
|
|
226
226
|
return self.drac.allow_session(session)
|
|
227
227
|
|
|
228
|
-
def get_session_by_id(self,
|
|
229
|
-
return self.drac.get_session_by_id(
|
|
228
|
+
def get_session_by_id(self, sid: str):
|
|
229
|
+
return self.drac.get_session_by_id(sid)
|
|
230
230
|
|
|
231
231
|
def get_user_name(self):
|
|
232
232
|
return self.drac.get_user_name()
|
|
@@ -252,11 +252,13 @@ class ESRFLIMS(AbstractLims):
|
|
|
252
252
|
|
|
253
253
|
def store_energy_scan(self, energyscan_dict):
|
|
254
254
|
energyscan_dict["sessionId"] = self.ispyb.get_session_id()
|
|
255
|
-
|
|
255
|
+
self.drac.store_energy_scan(energyscan_dict)
|
|
256
|
+
return self.ispyb.store_energy_scan(self._clean_sample_id(energyscan_dict))
|
|
256
257
|
|
|
257
258
|
def store_xfe_spectrum(self, xfespectrum_dict):
|
|
258
259
|
xfespectrum_dict["sessionId"] = self.ispyb.get_session_id()
|
|
259
|
-
|
|
260
|
+
self.drac.store_xfe_spectrum(xfespectrum_dict)
|
|
261
|
+
return self.ispyb.store_xfe_spectrum(self._clean_sample_id(xfespectrum_dict))
|
|
260
262
|
|
|
261
263
|
def store_workflow(self, *args, **kwargs):
|
|
262
264
|
pass
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import json
|
|
2
2
|
import logging
|
|
3
|
-
import pathlib
|
|
4
3
|
import shutil
|
|
5
4
|
from collections import defaultdict
|
|
6
5
|
from datetime import datetime, timedelta
|
|
6
|
+
from pathlib import Path
|
|
7
7
|
from typing import List, Optional
|
|
8
8
|
from zoneinfo import ZoneInfo
|
|
9
9
|
|
|
@@ -82,7 +82,8 @@ class ICATLIMS(AbstractLims):
|
|
|
82
82
|
sessions = self.to_sessions(self.__get_all_investigations())
|
|
83
83
|
|
|
84
84
|
if len(sessions) == 0:
|
|
85
|
-
|
|
85
|
+
msg = f"No sessions available for user {user_name}"
|
|
86
|
+
raise RuntimeError(msg)
|
|
86
87
|
|
|
87
88
|
logger.debug("Successfully retrieved %s sessions" % (len(sessions)))
|
|
88
89
|
|
|
@@ -101,7 +102,7 @@ class ICATLIMS(AbstractLims):
|
|
|
101
102
|
break
|
|
102
103
|
|
|
103
104
|
if not session_found:
|
|
104
|
-
raise
|
|
105
|
+
raise RuntimeError(
|
|
105
106
|
"Current session in-use (with id %s) not avaialble to user %s"
|
|
106
107
|
% (self.session_manager.active_session.session_id, user_name)
|
|
107
108
|
)
|
|
@@ -291,13 +292,13 @@ class ICATLIMS(AbstractLims):
|
|
|
291
292
|
# id to the sample sheet declared in the user portal
|
|
292
293
|
sample_sheet_id = tracking_sample.get("sampleId")
|
|
293
294
|
# identifier that points to the sample tracking
|
|
294
|
-
|
|
295
|
+
tracking_sample_id = tracking_sample.get("_id")
|
|
295
296
|
|
|
296
297
|
logger.debug(
|
|
297
|
-
"[ICATClient] Sample ids sample_id=%s sample_sheet_id=%s
|
|
298
|
+
"[ICATClient] Sample ids sample_id=%s sample_sheet_id=%s tracking_sample_id=%s",
|
|
298
299
|
sample_id,
|
|
299
300
|
sample_sheet_id,
|
|
300
|
-
|
|
301
|
+
tracking_sample_id,
|
|
301
302
|
)
|
|
302
303
|
|
|
303
304
|
sample_location = tracking_sample.get("sampleContainerPosition")
|
|
@@ -352,7 +353,7 @@ class ICATLIMS(AbstractLims):
|
|
|
352
353
|
processing_plan, downloads
|
|
353
354
|
)
|
|
354
355
|
except RuntimeError:
|
|
355
|
-
logger.
|
|
356
|
+
logger.exception(
|
|
356
357
|
"Failed __add_download_path_to_processing_plan"
|
|
357
358
|
)
|
|
358
359
|
|
|
@@ -369,7 +370,7 @@ class ICATLIMS(AbstractLims):
|
|
|
369
370
|
"sampleName": sample_name,
|
|
370
371
|
"sampleId": sample_id,
|
|
371
372
|
"sample_sheet_id": sample_sheet_id,
|
|
372
|
-
"trackingSampleId":
|
|
373
|
+
"trackingSampleId": tracking_sample_id,
|
|
373
374
|
"proteinAcronym": protein_acronym,
|
|
374
375
|
"sampleLocation": sample_location,
|
|
375
376
|
"containerCode": puck_name,
|
|
@@ -410,11 +411,13 @@ class ICATLIMS(AbstractLims):
|
|
|
410
411
|
pass
|
|
411
412
|
|
|
412
413
|
@property
|
|
413
|
-
def only_staff_session_selection(self):
|
|
414
|
-
return bool(
|
|
414
|
+
def only_staff_session_selection(self) -> bool:
|
|
415
|
+
return bool(
|
|
416
|
+
self.get_property("only_staff_session_selection", default_value=False)
|
|
417
|
+
)
|
|
415
418
|
|
|
416
419
|
def store_robot_action(self, proposal_id: str):
|
|
417
|
-
raise
|
|
420
|
+
raise NotImplementedError
|
|
418
421
|
|
|
419
422
|
@property
|
|
420
423
|
def filter(self):
|
|
@@ -452,11 +455,11 @@ class ICATLIMS(AbstractLims):
|
|
|
452
455
|
def after_offset_days(self):
|
|
453
456
|
return self.get_property("after_offset_days", "1")
|
|
454
457
|
|
|
455
|
-
def _string_to_format_date(self, date: str,
|
|
458
|
+
def _string_to_format_date(self, date: str, fmt: str) -> str:
|
|
456
459
|
if date is not None:
|
|
457
460
|
date_time = self._tz_aware_fromisoformat(date)
|
|
458
461
|
if date_time is not None:
|
|
459
|
-
return date_time.strftime(
|
|
462
|
+
return date_time.strftime(fmt)
|
|
460
463
|
return ""
|
|
461
464
|
|
|
462
465
|
def _string_to_date(self, date: str) -> str:
|
|
@@ -468,7 +471,7 @@ class ICATLIMS(AbstractLims):
|
|
|
468
471
|
def _tz_aware_fromisoformat(self, date: str) -> datetime:
|
|
469
472
|
try:
|
|
470
473
|
return datetime.fromisoformat(date).astimezone()
|
|
471
|
-
except
|
|
474
|
+
except (TypeError, ValueError):
|
|
472
475
|
return None
|
|
473
476
|
|
|
474
477
|
def set_active_session_by_id(self, session_id: str) -> Session:
|
|
@@ -483,7 +486,7 @@ class ICATLIMS(AbstractLims):
|
|
|
483
486
|
|
|
484
487
|
if len(sessions) == 0:
|
|
485
488
|
logger.warning("Session list is empty. No session candidates")
|
|
486
|
-
raise
|
|
489
|
+
raise RuntimeError("No sessions available")
|
|
487
490
|
|
|
488
491
|
if len(sessions) == 1:
|
|
489
492
|
self.session_manager.active_session = sessions[0]
|
|
@@ -495,7 +498,7 @@ class ICATLIMS(AbstractLims):
|
|
|
495
498
|
|
|
496
499
|
session_list = [obj for obj in sessions if obj.session_id == session_id]
|
|
497
500
|
if len(session_list) != 1:
|
|
498
|
-
raise
|
|
501
|
+
raise RuntimeError(
|
|
499
502
|
"Session not found in the local list of sessions. session_id="
|
|
500
503
|
+ session_id
|
|
501
504
|
)
|
|
@@ -507,19 +510,19 @@ class ICATLIMS(AbstractLims):
|
|
|
507
510
|
logger.debug("allow_session investigationId=%s", session.session_id)
|
|
508
511
|
self.icatClient.reschedule_investigation(session.session_id)
|
|
509
512
|
|
|
510
|
-
def get_session_by_id(self,
|
|
513
|
+
def get_session_by_id(self, sid: str):
|
|
511
514
|
logger.debug(
|
|
512
515
|
"get_session_by_id investigationId=%s investigations=%s",
|
|
513
|
-
|
|
516
|
+
sid,
|
|
514
517
|
str(len(self.investigations)),
|
|
515
518
|
)
|
|
516
|
-
investigation_list = list(filter(lambda p: p["id"] ==
|
|
519
|
+
investigation_list = list(filter(lambda p: p["id"] == sid, self.investigations))
|
|
517
520
|
if len(investigation_list) == 1:
|
|
518
521
|
self.investigation = investigation_list[0]
|
|
519
522
|
return self.__to_session(investigation_list[0])
|
|
520
523
|
logger.warn(
|
|
521
524
|
"No investigation found. get_session_by_id investigationId=%s investigations=%s",
|
|
522
|
-
|
|
525
|
+
sid,
|
|
523
526
|
str(len(self.investigations)),
|
|
524
527
|
)
|
|
525
528
|
return None
|
|
@@ -802,11 +805,11 @@ class ICATLIMS(AbstractLims):
|
|
|
802
805
|
try:
|
|
803
806
|
if cell is not None and puck is not None:
|
|
804
807
|
position = int(cell * 3) + int(puck)
|
|
805
|
-
except Exception
|
|
806
|
-
logger.exception(
|
|
808
|
+
except Exception:
|
|
809
|
+
logger.exception()
|
|
807
810
|
return position, sample_position
|
|
808
|
-
except Exception
|
|
809
|
-
logger.exception(
|
|
811
|
+
except Exception:
|
|
812
|
+
logger.exception()
|
|
810
813
|
|
|
811
814
|
def store_beamline_setup(self, session_id: str, bl_config_dict: dict):
|
|
812
815
|
pass
|
|
@@ -817,8 +820,76 @@ class ICATLIMS(AbstractLims):
|
|
|
817
820
|
def store_energy_scan(self, energyscan_dict: dict):
|
|
818
821
|
pass
|
|
819
822
|
|
|
820
|
-
def store_xfe_spectrum(self,
|
|
821
|
-
|
|
823
|
+
def store_xfe_spectrum(self, collection_parameters: dict):
|
|
824
|
+
status = {"xfeFluorescenceSpectrumId": -1}
|
|
825
|
+
try:
|
|
826
|
+
try:
|
|
827
|
+
beamline = self._get_scheduled_beamline()
|
|
828
|
+
msg = f"Dataset Beamline={beamline} "
|
|
829
|
+
msg += f"Current Beamline={HWR.beamline.session.beamline_name}"
|
|
830
|
+
logging.getLogger("HWR").info(msg)
|
|
831
|
+
except Exception:
|
|
832
|
+
logging.getLogger("HWR").exception(
|
|
833
|
+
"Failed to get _get_scheduled_beamline",
|
|
834
|
+
)
|
|
835
|
+
_session = HWR.beamline.session
|
|
836
|
+
proposal = f"{_session.proposal_code}{_session.proposal_number}"
|
|
837
|
+
|
|
838
|
+
try:
|
|
839
|
+
dt_aware = datetime.strptime(
|
|
840
|
+
collection_parameters.get("startTime"),
|
|
841
|
+
"%Y-%m-%d %H:%M:%S",
|
|
842
|
+
).replace(tzinfo=ZoneInfo("Europe/Paris"))
|
|
843
|
+
dt_aware_end = datetime.strptime(
|
|
844
|
+
collection_parameters.get("endTime"),
|
|
845
|
+
"%Y-%m-%d %H:%M:%S",
|
|
846
|
+
).replace(tzinfo=ZoneInfo("Europe/Paris"))
|
|
847
|
+
|
|
848
|
+
start_time = dt_aware.isoformat(timespec="microseconds")
|
|
849
|
+
end_time = dt_aware_end.isoformat(timespec="microseconds")
|
|
850
|
+
except TypeError:
|
|
851
|
+
logging.getLogger("HWR").exception("Failed to parse start and end time")
|
|
852
|
+
|
|
853
|
+
directory = Path(collection_parameters["filename"]).parent
|
|
854
|
+
|
|
855
|
+
msg = f"SampleId is: {collection_parameters.get('blSampleId')}"
|
|
856
|
+
logging.getLogger("HWR").debug(msg)
|
|
857
|
+
try:
|
|
858
|
+
sample = HWR.beamline.lims.find_sample_by_sample_id(
|
|
859
|
+
collection_parameters.get("blSampleId")
|
|
860
|
+
)
|
|
861
|
+
sample_name = sample["sampleName"]
|
|
862
|
+
except (AttributeError, TypeError):
|
|
863
|
+
sample_name = "unknown"
|
|
864
|
+
msg = f"Sample not found {collection_parameters.get('blSampleId')}"
|
|
865
|
+
logging.getLogger("HWR").debug(msg)
|
|
866
|
+
|
|
867
|
+
metadata = {
|
|
868
|
+
"sampleId": collection_parameters.get("blSampleId"),
|
|
869
|
+
"MX_beamSizeAtSampleX": collection_parameters.get("beamSizeHorizontal"),
|
|
870
|
+
"MX_beamSizeAtSampleY": collection_parameters.get("beamSizeVertical"),
|
|
871
|
+
"MX_directory": str(directory),
|
|
872
|
+
"MX_exposureTime": collection_parameters.get("exposureTime"),
|
|
873
|
+
"MX_flux": collection_parameters.get("flux"),
|
|
874
|
+
"scanType": "xrf",
|
|
875
|
+
"MX_transmission": collection_parameters.get("beamTransmission"),
|
|
876
|
+
"Sample_name": sample_name,
|
|
877
|
+
"InstrumentMonochromator_energy": collection_parameters.get("energy"),
|
|
878
|
+
"startDate": start_time,
|
|
879
|
+
"endDate": end_time,
|
|
880
|
+
}
|
|
881
|
+
|
|
882
|
+
self.icatClient.store_dataset(
|
|
883
|
+
beamline=beamline,
|
|
884
|
+
proposal=proposal,
|
|
885
|
+
dataset=str(directory.name),
|
|
886
|
+
path=str(directory),
|
|
887
|
+
metadata=metadata,
|
|
888
|
+
)
|
|
889
|
+
except Exception:
|
|
890
|
+
logging.getLogger("ispyb_client").exception()
|
|
891
|
+
|
|
892
|
+
return status
|
|
822
893
|
|
|
823
894
|
def store_workflow(self, workflow_dict: dict):
|
|
824
895
|
pass
|
|
@@ -871,7 +942,7 @@ class ICATLIMS(AbstractLims):
|
|
|
871
942
|
else:
|
|
872
943
|
logger.exception("HTTP error for sample %s", sample_id)
|
|
873
944
|
|
|
874
|
-
except requests.exceptions.RequestException
|
|
945
|
+
except requests.exceptions.RequestException:
|
|
875
946
|
logger.exception("Request error for sample %s", sample_id)
|
|
876
947
|
return None
|
|
877
948
|
|
|
@@ -883,15 +954,15 @@ class ICATLIMS(AbstractLims):
|
|
|
883
954
|
|
|
884
955
|
Parameters:
|
|
885
956
|
sample (str): Sample identifier.
|
|
886
|
-
output_folder (str): Directory where
|
|
957
|
+
output_folder (str): Directory where storefiles will be saved.
|
|
887
958
|
|
|
888
959
|
Returns:
|
|
889
960
|
dict: A dictionary containing the paths of the downloaded files.
|
|
890
961
|
"""
|
|
891
962
|
downloaded_files: List[Download] = []
|
|
892
963
|
for resource in resources:
|
|
893
|
-
resource_folder =
|
|
894
|
-
resource_folder =
|
|
964
|
+
resource_folder = Path(output_folder) / sample_name
|
|
965
|
+
resource_folder = Path(resource_folder) / (
|
|
895
966
|
resource.groupName if resource.groupName else ""
|
|
896
967
|
)
|
|
897
968
|
resource_folder.mkdir(
|
|
@@ -931,7 +1002,7 @@ class ICATLIMS(AbstractLims):
|
|
|
931
1002
|
|
|
932
1003
|
try:
|
|
933
1004
|
fileinfo = collection_parameters["fileinfo"]
|
|
934
|
-
directory =
|
|
1005
|
+
directory = Path(fileinfo["directory"])
|
|
935
1006
|
dataset_name = directory.name
|
|
936
1007
|
# Determine the scan type
|
|
937
1008
|
if dataset_name.endswith("mesh"):
|
|
@@ -1086,7 +1157,7 @@ class ICATLIMS(AbstractLims):
|
|
|
1086
1157
|
except RuntimeError:
|
|
1087
1158
|
logger.warning("Failed to get MX_axis_end")
|
|
1088
1159
|
|
|
1089
|
-
icat_metadata_path =
|
|
1160
|
+
icat_metadata_path = Path(directory) / "metadata.json"
|
|
1090
1161
|
with open(icat_metadata_path, "w") as f:
|
|
1091
1162
|
# We add the processing and experiment plan only in the metadata.json
|
|
1092
1163
|
# it will not work thought pyicat-plus
|
|
@@ -1107,7 +1178,7 @@ class ICATLIMS(AbstractLims):
|
|
|
1107
1178
|
for snapshot_index in range(1, 5):
|
|
1108
1179
|
key = f"xtalSnapshotFullPath{snapshot_index}"
|
|
1109
1180
|
if key in collection_parameters:
|
|
1110
|
-
snapshot_path =
|
|
1181
|
+
snapshot_path = Path(collection_parameters[key])
|
|
1111
1182
|
if snapshot_path.exists():
|
|
1112
1183
|
logger.debug(
|
|
1113
1184
|
f"Copying snapshot index {snapshot_index} to gallery"
|
|
@@ -1167,4 +1238,3 @@ class ICATLIMS(AbstractLims):
|
|
|
1167
1238
|
:param sample_dict: A dictionary with the properties for the entry.
|
|
1168
1239
|
:type sample_dict: dict
|
|
1169
1240
|
"""
|
|
1170
|
-
pass
|
|
@@ -22,8 +22,8 @@
|
|
|
22
22
|
|
|
23
23
|
import abc
|
|
24
24
|
import logging
|
|
25
|
-
import os
|
|
26
25
|
import time
|
|
26
|
+
from pathlib import Path
|
|
27
27
|
|
|
28
28
|
import gevent
|
|
29
29
|
|
|
@@ -73,29 +73,31 @@ class AbstractXRFSpectrum(HardwareObject):
|
|
|
73
73
|
|
|
74
74
|
def start_spectrum(
|
|
75
75
|
self,
|
|
76
|
-
integration_time=None,
|
|
77
|
-
data_dir=None,
|
|
78
|
-
prefix=None,
|
|
79
|
-
archive_dir=None,
|
|
80
|
-
session_id=None,
|
|
81
|
-
blsample_id=None,
|
|
82
|
-
cpos=None,
|
|
76
|
+
integration_time: float | None = None,
|
|
77
|
+
data_dir: str | None = None,
|
|
78
|
+
prefix: str | None = None,
|
|
79
|
+
archive_dir: str | None = None,
|
|
80
|
+
session_id: int | None = None,
|
|
81
|
+
blsample_id: int | None = None,
|
|
82
|
+
cpos: dict | None = None,
|
|
83
83
|
):
|
|
84
84
|
"""Start the procedure. Called by the queue_model.
|
|
85
85
|
|
|
86
86
|
Args:
|
|
87
|
-
integration_time
|
|
88
|
-
data_dir
|
|
89
|
-
archive_dir
|
|
90
|
-
prefix
|
|
91
|
-
session_id
|
|
92
|
-
blsample_id
|
|
87
|
+
integration_time: Inregration time [s].
|
|
88
|
+
data_dir: Directory to save the data (full path).
|
|
89
|
+
archive_dir: Directory to save the archive data (full path).
|
|
90
|
+
prefix: File prefix
|
|
91
|
+
session_id: Session ID number (from ISpyB)
|
|
92
|
+
blsample_id: Sample ID number (from ISpyB)
|
|
93
|
+
cpos: The centred position motors and their values.
|
|
93
94
|
"""
|
|
94
95
|
self.cpos = cpos
|
|
95
96
|
self.spectrum_info_dict = {"sessionId": session_id, "blSampleId": blsample_id}
|
|
96
97
|
integration_time = integration_time or self.default_integration_time
|
|
97
98
|
self.spectrum_info_dict["exposureTime"] = integration_time
|
|
98
99
|
self.spectrum_info_dict["filename"] = ""
|
|
100
|
+
|
|
99
101
|
# Create the data and the archive directory (if needed) and files
|
|
100
102
|
if data_dir:
|
|
101
103
|
if not self.create_directory(data_dir):
|
|
@@ -125,12 +127,16 @@ class AbstractXRFSpectrum(HardwareObject):
|
|
|
125
127
|
)
|
|
126
128
|
return True
|
|
127
129
|
|
|
128
|
-
def execute_spectrum(
|
|
130
|
+
def execute_spectrum(
|
|
131
|
+
self,
|
|
132
|
+
integration_time: float | None = None,
|
|
133
|
+
filename: str | None = None,
|
|
134
|
+
):
|
|
129
135
|
"""Do the acquisition.
|
|
130
136
|
|
|
131
137
|
Args:
|
|
132
|
-
integration_time
|
|
133
|
-
filename
|
|
138
|
+
integration_time: MCA integration time [s].
|
|
139
|
+
filename: Data file (full path).
|
|
134
140
|
Raises:
|
|
135
141
|
RuntimeError: Cannot acquire data.
|
|
136
142
|
"""
|
|
@@ -149,23 +155,27 @@ class AbstractXRFSpectrum(HardwareObject):
|
|
|
149
155
|
self.update_state(self.STATES.FAULT)
|
|
150
156
|
|
|
151
157
|
@abc.abstractmethod
|
|
152
|
-
def _execute_spectrum(
|
|
158
|
+
def _execute_spectrum(
|
|
159
|
+
self,
|
|
160
|
+
integration_time: float | None = None,
|
|
161
|
+
filename: str | None = None,
|
|
162
|
+
) -> bool:
|
|
153
163
|
"""Specific XRF acquisition procedure"""
|
|
154
164
|
return True
|
|
155
165
|
|
|
156
|
-
def create_directory(self, directory):
|
|
166
|
+
def create_directory(self, directory: str) -> bool:
|
|
157
167
|
"""Create a directory, if needed.
|
|
158
168
|
Args:
|
|
159
|
-
directory
|
|
169
|
+
directory: Directory to save the data (full path).
|
|
160
170
|
Returns:
|
|
161
|
-
|
|
171
|
+
``True`` if directory created or already exists, ``False`` if error.
|
|
162
172
|
"""
|
|
163
|
-
if not
|
|
173
|
+
if not Path(directory).is_dir():
|
|
164
174
|
msg = f"XRFSpectrum: directory creating {directory}"
|
|
165
175
|
try:
|
|
166
|
-
if not
|
|
176
|
+
if not Path(directory).exists():
|
|
167
177
|
logging.getLogger("user_level_log").debug(msg)
|
|
168
|
-
|
|
178
|
+
Path(directory).mkdir(parents=True)
|
|
169
179
|
return True
|
|
170
180
|
except OSError as err:
|
|
171
181
|
msg += f": {err}"
|
|
@@ -175,7 +185,7 @@ class AbstractXRFSpectrum(HardwareObject):
|
|
|
175
185
|
return False
|
|
176
186
|
return True
|
|
177
187
|
|
|
178
|
-
def get_filename(self, directory, prefix):
|
|
188
|
+
def get_filename(self, directory: str, prefix: str) -> str:
|
|
179
189
|
"""Create file template.
|
|
180
190
|
Args:
|
|
181
191
|
directory(str): directory name (full path)
|
|
@@ -183,19 +193,16 @@ class AbstractXRFSpectrum(HardwareObject):
|
|
|
183
193
|
(str): File template
|
|
184
194
|
"""
|
|
185
195
|
_pattern = f"{prefix}_{time.strftime('%d_%b_%Y')}_%02d_xrf"
|
|
186
|
-
|
|
187
|
-
filename = filename_pattern % 1
|
|
188
|
-
# fileprefix = _pattern % 1
|
|
196
|
+
filename = Path(directory) / (_pattern % 1)
|
|
189
197
|
|
|
190
198
|
i = 2
|
|
191
|
-
while
|
|
192
|
-
filename =
|
|
193
|
-
|
|
194
|
-
i = i + 1
|
|
199
|
+
while Path(filename).is_file():
|
|
200
|
+
filename = Path(directory) / (_pattern % i)
|
|
201
|
+
i += 1
|
|
195
202
|
|
|
196
|
-
return filename
|
|
203
|
+
return str(filename)
|
|
197
204
|
|
|
198
|
-
def spectrum_status_change(self, status_msg):
|
|
205
|
+
def spectrum_status_change(self, status_msg: str):
|
|
199
206
|
"""Emit the signal xrfSpectrumStatusChanged with appropriate message.
|
|
200
207
|
Args:
|
|
201
208
|
status_msg(str): Message to send.
|
|
@@ -224,7 +231,8 @@ class AbstractXRFSpectrum(HardwareObject):
|
|
|
224
231
|
|
|
225
232
|
def spectrum_analyse(self):
|
|
226
233
|
"""Get the spectrum data. Do analysis and save fitted data.
|
|
227
|
-
The method has to be implemented as specific for each site
|
|
234
|
+
The method has to be implemented as specific for each site, but
|
|
235
|
+
is only optional.
|
|
228
236
|
"""
|
|
229
237
|
|
|
230
238
|
def spectrum_command_aborted(self):
|
|
@@ -43,12 +43,12 @@ class XrfSpectrumQueueEntry(BaseQueueEntry):
|
|
|
43
43
|
super().__init__(view, data_model)
|
|
44
44
|
self._failed = False
|
|
45
45
|
|
|
46
|
-
def __getstate__(self):
|
|
46
|
+
def __getstate__(self) -> dict:
|
|
47
47
|
d = dict(self.__dict__)
|
|
48
48
|
d["xrf_spectrum_task"] = None
|
|
49
49
|
return d
|
|
50
50
|
|
|
51
|
-
def __setstate__(self, d):
|
|
51
|
+
def __setstate__(self, d: dict):
|
|
52
52
|
self.__dict__.update(d)
|
|
53
53
|
|
|
54
54
|
def execute(self):
|
|
@@ -67,7 +67,7 @@ class XrfSpectrumQueueEntry(BaseQueueEntry):
|
|
|
67
67
|
archive_dir=xrf_spectrum.path_template.get_archive_directory(),
|
|
68
68
|
prefix=f"{path_template.get_prefix()}_{path_template.run_number}",
|
|
69
69
|
session_id=HWR.beamline.session.session_id,
|
|
70
|
-
blsample_id=xrf_spectrum.
|
|
70
|
+
blsample_id=xrf_spectrum.sample.lims_id,
|
|
71
71
|
cpos=xrf_spectrum.centred_position,
|
|
72
72
|
)
|
|
73
73
|
HWR.beamline.xrf_spectrum._ready_event.wait()
|
|
@@ -108,10 +108,10 @@ class XrfSpectrumQueueEntry(BaseQueueEntry):
|
|
|
108
108
|
self.get_view().set_checkable(False)
|
|
109
109
|
super().post_execute()
|
|
110
110
|
|
|
111
|
-
def xrf_spectrum_status_changed(self, msg):
|
|
111
|
+
def xrf_spectrum_status_changed(self, msg: str):
|
|
112
112
|
"""xrfSpectrumStatusChanged handler.
|
|
113
113
|
Args:
|
|
114
|
-
msg
|
|
114
|
+
msg: Message when ``xrfSpectrumStatusChanged`` emitted.
|
|
115
115
|
"""
|
|
116
116
|
logging.getLogger("user_level_log").info(msg)
|
|
117
117
|
|
|
@@ -136,5 +136,5 @@ class XrfSpectrumQueueEntry(BaseQueueEntry):
|
|
|
136
136
|
logging.getLogger("user_level_log").error("XRF spectrum failed.")
|
|
137
137
|
raise QueueExecutionException("XRF spectrum failed", self)
|
|
138
138
|
|
|
139
|
-
def get_type_str(self):
|
|
139
|
+
def get_type_str(self) -> str:
|
|
140
140
|
return "XRF spectrum"
|
|
@@ -149,7 +149,7 @@ mxcubecore/HardwareObjects/ESRF/ESRFPhotonFlux.py,sha256=QIjglmsilHkeLUZXLqR6Ykm
|
|
|
149
149
|
mxcubecore/HardwareObjects/ESRF/ESRFSC3.py,sha256=Mw2Lj_0w7TapaCesDxhRWSAY1PRG4DJCoLWgYdP_qV4,9545
|
|
150
150
|
mxcubecore/HardwareObjects/ESRF/ESRFSession.py,sha256=iIcJUM0cVlwJdqNZo-L7IY_S2KYHQXPQPupbv4JoAkk,4323
|
|
151
151
|
mxcubecore/HardwareObjects/ESRF/ESRFSmallXrayCentring.py,sha256=YJFMtb3VxHchxTWi_pqrEz3ML1YunoYLkAseDZqF1JA,3617
|
|
152
|
-
mxcubecore/HardwareObjects/ESRF/ESRFXRFSpectrum.py,sha256=
|
|
152
|
+
mxcubecore/HardwareObjects/ESRF/ESRFXRFSpectrum.py,sha256=KS6DicwZQPHLK6rFR6F5pkvjEDsSPYFsPISWe0o-83A,12212
|
|
153
153
|
mxcubecore/HardwareObjects/ESRF/ID231EnergyScan.py,sha256=f6Loqqgl5E64-xACuK-6nF2sH9ftpwa7e1It0C1e-s4,1144
|
|
154
154
|
mxcubecore/HardwareObjects/ESRF/ID232BeamDefiner.py,sha256=jnHe7HgEDbV69PegYCdxv-85jWHHWYhEae9WinNE3HY,5073
|
|
155
155
|
mxcubecore/HardwareObjects/ESRF/ID29EnergyScan.py,sha256=9Nscojz8KonwWZltpIcRwH06RC2AtZKZGu-oEbMqLLg,2778
|
|
@@ -174,7 +174,7 @@ mxcubecore/HardwareObjects/ESRF/queue_entry/ssx_laser_hare_collection.py,sha256=
|
|
|
174
174
|
mxcubecore/HardwareObjects/ESRF/queue_entry/ssx_laser_injector_collection.py,sha256=6nz9gsoJWA2Douuw00-y4pkH_DCwJ4jzIH7xpXVKKas,4417
|
|
175
175
|
mxcubecore/HardwareObjects/ESRF/queue_entry/ssx_line_scan_collection.py,sha256=iy-ozL1GTl8Hv8hM0qvhlBCQVWrku2SNzC3R6rVzC-U,5404
|
|
176
176
|
mxcubecore/HardwareObjects/ESRF/queue_entry/test_collection.py,sha256=DbZkkHdsAnjEhEuA8Y9SF2di-TEewKG-kFLHCYIm9Kk,2571
|
|
177
|
-
mxcubecore/HardwareObjects/ESRFLIMS.py,sha256=
|
|
177
|
+
mxcubecore/HardwareObjects/ESRFLIMS.py,sha256=pZzy4yC_QZytWFSGTzsR5zxkBoj8WkIgUWwRlhXPp2s,9838
|
|
178
178
|
mxcubecore/HardwareObjects/EdnaWorkflow.py,sha256=zuNVFWXHcnKRZPRnY3yjW__yRjnl_FWR_OrFLF2qESc,8741
|
|
179
179
|
mxcubecore/HardwareObjects/Energy.py,sha256=iZyLDPPrmx38SlpeP7V82DY32AT2NovuslONB5aYGPU,6496
|
|
180
180
|
mxcubecore/HardwareObjects/ExporterMotor.py,sha256=661WJnSs56b95H-H5BV-3SSpLe_ak2VGj1sAvNzY3D4,8666
|
|
@@ -197,7 +197,7 @@ mxcubecore/HardwareObjects/GrobMotor.py,sha256=wbk7x0J2YeEeEoNdhNj7k4jN4nPBTAnHG
|
|
|
197
197
|
mxcubecore/HardwareObjects/GrobSampleChanger.py,sha256=LMetcL45fWrwP4C8rtENrEDNydelLpJ77SD1JC5C3go,8113
|
|
198
198
|
mxcubecore/HardwareObjects/Harvester.py,sha256=kmPE_-6HXwP89xa_TJZ079vvwsbSVzvtPlAKBc7XE_k,26519
|
|
199
199
|
mxcubecore/HardwareObjects/HarvesterMaintenance.py,sha256=76745tEMHBlJKBISkloiKz9yWVwehclHRDs3rNaq0qE,9400
|
|
200
|
-
mxcubecore/HardwareObjects/ICATLIMS.py,sha256=
|
|
200
|
+
mxcubecore/HardwareObjects/ICATLIMS.py,sha256=Jdzs6KWQDvlzqauuIOeeaEkgS9Vs11zDqLJDgxv3sS4,51016
|
|
201
201
|
mxcubecore/HardwareObjects/ISARAMaint.py,sha256=RSHx_eTZoFQTy1Ix98GkMQh9Nz1W0sk5PTGqOtBwcT4,8549
|
|
202
202
|
mxcubecore/HardwareObjects/LNLS/EPICSActuator.py,sha256=L5vhJnLjx0cawBeAQbTtZ39nVIHp30hqKCBfIaIKRds,2601
|
|
203
203
|
mxcubecore/HardwareObjects/LNLS/EPICSMotor.py,sha256=lRTc1t32rJKNTIcnKCECrqo2m9BhlYvLq9NWg4Y0w0Q,3576
|
|
@@ -364,7 +364,7 @@ mxcubecore/HardwareObjects/abstract/AbstractShutter.py,sha256=8YQqnli9zzy42e3vLZ
|
|
|
364
364
|
mxcubecore/HardwareObjects/abstract/AbstractSlits.py,sha256=u3WRuGYPJP_xoxJ_Qt6K5IlBCmYzq6t3VFN8frtG5AM,3834
|
|
365
365
|
mxcubecore/HardwareObjects/abstract/AbstractTransmission.py,sha256=5BdJz16kYM13lvnKeGNG-i7qIhH7Lrz1csWk-rnhaB0,1405
|
|
366
366
|
mxcubecore/HardwareObjects/abstract/AbstractVideoDevice.py,sha256=8FIwnoFOQegZPdpBXpG-u3JrRr9j7yMF5m8DpwnqjME,14785
|
|
367
|
-
mxcubecore/HardwareObjects/abstract/AbstractXRFSpectrum.py,sha256=
|
|
367
|
+
mxcubecore/HardwareObjects/abstract/AbstractXRFSpectrum.py,sha256=VIUpuKHbWqiFCKWTNwPm9doMqMEsxfcBSCuj1W5Ilog,9192
|
|
368
368
|
mxcubecore/HardwareObjects/abstract/AbstractXrayCentring.py,sha256=jVO3VjuRKyzTk_ZAsSkjA7e-sauDc5IAf-Bd98yUwAY,3513
|
|
369
369
|
mxcubecore/HardwareObjects/abstract/ISPyBAbstractLims.py,sha256=LqU0ehzl-lvAV5p4auvaIYDSnbLFn1tZwtN7R76CJIE,9011
|
|
370
370
|
mxcubecore/HardwareObjects/abstract/ISPyBDataAdapter.py,sha256=1Uk3ZDty1kth-hI4UdwpBxyjtxNxuhzCHyYZMwWFn8g,27319
|
|
@@ -459,14 +459,14 @@ mxcubecore/queue_entry/sample_centring.py,sha256=zV9pMwR4L8q6lnpFZgATlORcWR545T7
|
|
|
459
459
|
mxcubecore/queue_entry/test_collection.py,sha256=KidatI31KJ11FGrBNxG9SOvDEdLYaoCaE4VKmPDSuPs,2725
|
|
460
460
|
mxcubecore/queue_entry/xray_centering.py,sha256=01-TX9bsArMHxUJ3L58Vh-ShpkcHfUjIsHQO7AtCT7M,4145
|
|
461
461
|
mxcubecore/queue_entry/xray_centering2.py,sha256=P--C2mg04GVazLgwMHSX9CxM7jfbeVoMMhYfn1PHbow,2971
|
|
462
|
-
mxcubecore/queue_entry/xrf_spectrum.py,sha256=
|
|
462
|
+
mxcubecore/queue_entry/xrf_spectrum.py,sha256=cfIQacnvMNjSYhxKAvpLcoUxYvForJcpXxw3CmwzVy8,5293
|
|
463
463
|
mxcubecore/saferef.py,sha256=lbUbzojjg1XM6gKtGKug48CD_LeuQXpZ7R3r1fMjCKw,7164
|
|
464
464
|
mxcubecore/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
465
465
|
mxcubecore/utils/conversion.py,sha256=G1bk2Mi2ZwGbZa5pEeiFaKWxhSVXVGqu1L9_SioyUOk,4513
|
|
466
466
|
mxcubecore/utils/qt_import.py,sha256=hQkBVZLUDZtktX7DSyoH88GAK_mK9Ghlsj4k9pFJeAQ,14415
|
|
467
467
|
mxcubecore/utils/units.py,sha256=2D1QlTwe8eSs2UYRm4VVxSTosZZHeM-Pfw9KlcLbDAg,1251
|
|
468
|
-
mxcubecore-1.
|
|
469
|
-
mxcubecore-1.
|
|
470
|
-
mxcubecore-1.
|
|
471
|
-
mxcubecore-1.
|
|
472
|
-
mxcubecore-1.
|
|
468
|
+
mxcubecore-1.330.0.dist-info/COPYING,sha256=46mU2C5kSwOnkqkw9XQAJlhBL2JAf1_uCD8lVcXyMRg,7652
|
|
469
|
+
mxcubecore-1.330.0.dist-info/COPYING.LESSER,sha256=46mU2C5kSwOnkqkw9XQAJlhBL2JAf1_uCD8lVcXyMRg,7652
|
|
470
|
+
mxcubecore-1.330.0.dist-info/METADATA,sha256=nAxkGPkZ-KEPDq2Tny80vULusJGyXvIpj3pN5klb22M,4262
|
|
471
|
+
mxcubecore-1.330.0.dist-info/WHEEL,sha256=b4K_helf-jlQoXBBETfwnf4B04YC67LOev0jo4fX5m8,88
|
|
472
|
+
mxcubecore-1.330.0.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|