Newer
Older

Loïc Le Guyader
committed
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
# -*- coding: utf-8 -*-
""" Toolbox for SCS.
Various utilities function to quickly process data measured at the SCS instruments.
Copyright (2019) SCS Team.
"""
import numpy as np
from karabo_data import RunDirectory
import xarray as xr
mnemonics = {
"SCS_XGM": ['SCS_BLU_XGM/XGM/DOOCS:output', 'data.intensityTD', 1],
"SCS_XGM_SLOW": ['SCS_BLU_XGM/XGM/DOOCS', 'pulseEnergy.photonFlux.value', 0],
"SA3_XGM": ['SA3_XTD10_XGM/XGM/DOOCS:output', 'data.intensityTD', 1],
"SA3_XGM_SLOW": ['SA3_XTD10_XGM/XGM/DOOCS', 'pulseEnergy.photonFlux.value', 0],
"MCP1apd": ['SCS_UTC1_ADQ/ADC/1:network', 'digitizers.channel_1_D.apd.pulseIntegral', 1],
"MCP1raw": ['SCS_UTC1_ADQ/ADC/1:network', 'digitizers.channel_1_D.raw.samples', 1],
"MCP2apd": ['SCS_UTC1_ADQ/ADC/1:network', 'digitizers.channel_1_C.apd.pulseIntegral', 1],
"MCP2raw": ['SCS_UTC1_ADQ/ADC/1:network', 'digitizers.channel_1_D.raw.samples', 1],
"MCP3apd": ['SCS_UTC1_ADQ/ADC/1:network', 'digitizers.channel_1_B.apd.pulseIntegral', 1],
"MCP3raw": ['SCS_UTC1_ADQ/ADC/1:network', 'digitizers.channel_1_D.raw.samples', 1],
"MCP4apd": ['SCS_UTC1_ADQ/ADC/1:network', 'digitizers.channel_1_A.apd.pulseIntegral', 1],
"MCP4raw": ['SCS_UTC1_ADQ/ADC/1:network', 'digitizers.channel_1_D.raw.samples', 1],
"nrj": ['SA3_XTD10_MONO/MDL/PHOTON_ENERGY','actualEnergy.value', 0],
"sase3": ['SCS_RR_UTC/MDL/BUNCH_DECODER','sase3.pulseIds.value', 1],
"sase2": ['SCS_RR_UTC/MDL/BUNCH_DECODER','sase2.pulseIds.value', 1],
"sase1": ['SCS_RR_UTC/MDL/BUNCH_DECODER','sase1.pulseIds.value', 1],
"maindump": ['SCS_RR_UTC/MDL/BUNCH_DECODER','maindump.pulseIds.value', 1],
"bunchpattern": ['SCS_RR_UTC/TSYS/TIMESERVER','readBunchPatternTable.value', 0],
"npulses_sase3": ['SCS_RR_UTC/MDL/BUNCH_DECODER','sase3.nPulses.value',0],
"npulses_sase1": ['SCS_RR_UTC/MDL/BUNCH_DECODER','sase1.nPulses.value',0],
"fastccd": ['SCS_CDIDET_FCCD2M/DAQ/FCCD:daqOutput','data.image.pixels', 0],
"transmission": ['SA3_XTD10_GATT/MDL/GATT_TRANSMISSION_MONITOR', 'Estimated_Tr.value', 0],
"GATT_pressure": ['P_GATT', 'value.value', 0],
"scannerX": ['SCS_CDIFFT_SAM/LMOTOR/SCANNERX', 'actualPosition.value', 0],
"scannerY": ['SCS_CDIFFT_SAM/MOTOR/SCANNERY', 'actualPosition.value', 0],
"scannerY_enc": ['SCS_CDIFFT_SAM/ENC/SCANNERY', 'value.value', 0],
"magnet": ['SCS_CDIFFT_MAG/SUPPLY/CURRENT', 'actual_current.value', 0]
}
def load(fields, runNB, proposalNB, semesterNB, topic='SCS', display=False):
""" Load a run and extract the data. Output is record array
Inputs:
fields: list of mnemonic strings to load specific data such as "fastccd", "SCS_XGM",
or dictionnaries defining a custom mnemonic such as
{"extra": ['SCS_CDIFFT_MAG/SUPPLY/CURRENT', 'actual_current.value', 0]}
runNB: run number as integer
proposalNB: string of the proposal number
semesterNB: string of the semester number where the proposal data are saved
topic: string of the topic
display: boolean, whether to show the run.info or not
Outputs:
res: an xarray DataSet with aligned trainIds
"""
runFolder = '/gpfs/exfel/exp/{}/{}/{}/raw/r{:04d}/'.format(topic, semesterNB, proposalNB, runNB)
run = RunDirectory(runFolder)
get_ipython().system('karabo-data-validate ' + runFolder)
if display:
run.info()
keys = []
vals = []
# always load pulse pattern infos
fields += ["sase1", "sase3", "npulses_sase3", "npulses_sase1"]
for f in fields:
if type(f) == dict:
# extracting mnemomic defined on the spot
for k in f.keys():
if display:
print('Loading {}'.format(f))
if f[k][2]:
vals.append(run.get_array(f[k][0], f[k][1], extra_dims=[k+'_dim',]))
else:
vals.append(run.get_array(f[k][0], f[k][1]))
keys.append(k)
else:
if f in mnemonics:
if f in keys:
continue
if display:
print('Loading {}'.format(f))
if mnemonics[f][0] not in run.all_sources:
print('source {} not found in run. Skipping!'.format(mnemonics[f][0]))
continue
if mnemonics[f][2]:
vals.append(run.get_array(mnemonics[f][0], mnemonics[f][1], extra_dims=[f+'_dim',]))
else:
vals.append(run.get_array(mnemonics[f][0], mnemonics[f][1]))
keys.append(f)
else:
print('Unknow mnemonic "{}". Skipping!'.format(f))
aligned_vals = xr.align(*vals, join='inner')
result = dict(zip(keys, aligned_vals))
return xr.Dataset(result)