diff --git a/Load.py b/Load.py index 4aa5d18a52054171a1fc8667c4d290bce79a6b07..52f86df33934e887841076497b9be2b19a546a50 100644 --- a/Load.py +++ b/Load.py @@ -11,47 +11,160 @@ 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] + # Machine + "sase3": {'source':'SCS_RR_UTC/MDL/BUNCH_DECODER', + 'key':'sase3.pulseIds.value', + 'dim':['bunchId']}, + "sase2": {'source':'SCS_RR_UTC/MDL/BUNCH_DECODER', + 'key':'sase2.pulseIds.value', + 'dim':['bunchId']}, + "sase1": {'source':'SCS_RR_UTC/MDL/BUNCH_DECODER', + 'key':'sase1.pulseIds.value', + 'dim':['bunchId']}, + "maindump": {'source':'SCS_RR_UTC/MDL/BUNCH_DECODER', + 'key':'maindump.pulseIds.value', + 'dim':['bunchId']}, + "bunchpattern": {'source':'SCS_RR_UTC/TSYS/TIMESERVER', + 'key':'readBunchPatternTable.value', + 'dim':None}, + "npulses_sase3": {'source':'SCS_RR_UTC/MDL/BUNCH_DECODER', + 'key':'sase3.nPulses.value', + 'dim':None}, + "npulses_sase1": {'source':'SCS_RR_UTC/MDL/BUNCH_DECODER', + 'key':'sase1.nPulses.value', + 'dim':None}, + # SA3 + "nrj": {'source':'SA3_XTD10_MONO/MDL/PHOTON_ENERGY', + 'key':'actualEnergy.value', + 'dim':None}, + + "M2BEND": {'source': 'SA3_XTD10_MIRR-2/MOTOR/BENDER', + 'key': 'actualPosition.value', + 'dim':None}, + "VSLIT": {'source':'SA3_XTD10_VSLIT/MDL/BLADE', + 'key':'actualGap.value', + 'dim':None}, + "ESLIT": {'source':'SCS_XTD10_ESLIT/MDL/MAIN', + 'key':'actualGap.value', + 'dim':None}, + "HSLIT": {'source':'SCS_XTD10_HSLIT/MDL/BLADE', + 'key':'actualGap.value', + 'dim':None}, + "transmission": {'source':'SA3_XTD10_GATT/MDL/GATT_TRANSMISSION_MONITOR', + 'key':'Estimated_Tr.value', + 'dim':None}, + "GATT_pressure": {'source':'P_GATT', + 'key':'value.value', + 'dim':None}, + + # XGMs + "SA3_XGM": {'source':'SA3_XTD10_XGM/XGM/DOOCS:output', + 'key':'data.intensityTD', + 'dim':['XGMbunchId']}, + "SA3_XGM_SLOW": {'source':'SA3_XTD10_XGM/XGM/DOOCS', + 'key':'pulseEnergy.photonFlux.value', + 'dim':None}, + "SCS_XGM": {'source':'SCS_BLU_XGM/XGM/DOOCS:output', + 'key':'data.intensityTD', + 'dim':['XGMbunchId']}, + "SCS_XGM_SLOW": {'source':'SCS_BLU_XGM/XGM/DOOCS', + 'key':'pulseEnergy.photonFlux.value', + 'dim':None}, + + # KBS + "HFM_CAPB": {'source':'SCS_KBS_HFM/ASENS/CAPB', + 'key':'value.value', + 'dim':None}, + "HFM_CAPF": {'source':'SCS_KBS_HFM/ASENS/CAPF', + 'key':'value.value', + 'dim':None}, + "HFM_CAPM": {'source':'SCS_KBS_HFM/ASENS/CAPM', + 'key':'value.value', + 'dim':None}, + "HFM_BENDERB": {'source':'SCS_KBS_HFM/MOTOR/BENDERB', + 'key':'encoderPosition.value', + 'dim':None}, + "HFM_BENDERF": {'source':'SCS_KBS_HFM/MOTOR/BENDERF', + 'key':'encoderPosition.value', + 'dim':None}, + "VFM_CAPB": {'source':'SCS_KBS_VFM/ASENS/CAPB', + 'key':'value.value', + 'dim':None}, + "VFM_CAPF": {'source':'SCS_KBS_VFM/ASENS/CAPF', + 'key':'value.value', + 'dim':None}, + "VFM_CAPM": {'source':'SCS_KBS_VFM/ASENS/CAPM', + 'key':'value.value', + 'dim':None}, + "VFM_BENDERB": {'source':'SCS_KBS_VFM/MOTOR/BENDERB', + 'key':'encoderPosition.value', + 'dim':None}, + "VFM_BENDERF": {'source':'SCS_KBS_VFM/MOTOR/BENDERF', + 'key':'encoderPosition.value', + 'dim':None}, + + # FFT + "scannerX": {'source':'SCS_CDIFFT_SAM/LMOTOR/SCANNERX', + 'key':'actualPosition.value', + 'dim':None}, + "scannerY": {'source':'SCS_CDIFFT_SAM/MOTOR/SCANNERY', + 'key':'actualPosition.value', + 'dim':None}, + "scannerY_enc": {'source':'SCS_CDIFFT_SAM/ENC/SCANNERY', + 'key':'value.value', + 'dim':None}, + "SAM-Z": {'source':'SCS_CDIFFT_MOV/ENC/SAM_Z', + 'key':'value.value', + 'dim':None}, + "magnet": {'source':'SCS_CDIFFT_MAG/SUPPLY/CURRENT', + 'key':'actual_current.value', + 'dim':None}, + + # FastCCD + "fastccd": {'source':'SCS_CDIDET_FCCD2M/DAQ/FCCD:daqOutput', + 'key':'data.image.pixels', + 'dim':['x', 'y']}, + + # TIM + "MCP1apd": {'source':'SCS_UTC1_ADQ/ADC/1:network', + 'key':'digitizers.channel_1_D.apd.pulseIntegral', + 'dim':['apdId']}, + "MCP1raw": {'source':'SCS_UTC1_ADQ/ADC/1:network', + 'key':'digitizers.channel_1_D.raw.samples', + 'dim':['samplesId']}, + "MCP2apd": {'source':'SCS_UTC1_ADQ/ADC/1:network', + 'key':'digitizers.channel_1_C.apd.pulseIntegral', + 'dim':['apdId']}, + "MCP2raw": {'source':'SCS_UTC1_ADQ/ADC/1:network', + 'key':'digitizers.channel_1_D.raw.samples', + 'dim':['samplesId']}, + "MCP3apd": {'source':'SCS_UTC1_ADQ/ADC/1:network', + 'key':'digitizers.channel_1_B.apd.pulseIntegral', + 'dim':['apdId']}, + "MCP3raw": {'source':'SCS_UTC1_ADQ/ADC/1:network', + 'key':'digitizers.channel_1_D.raw.samples', + 'dim':['samplesId']}, + "MCP4apd": {'source':'SCS_UTC1_ADQ/ADC/1:network', + 'key':'digitizers.channel_1_A.apd.pulseIntegral', + 'dim':['apdId']}, + "MCP4raw": {'source':'SCS_UTC1_ADQ/ADC/1:network', + 'key':'digitizers.channel_1_D.raw.samples', + 'dim': ['samplesId']} } -def load(fields, runNB, proposalNB, semesterNB, topic='SCS', display=False): - """ Load a run and extract the data. Output is record array +def load(fields, runNB, proposalNB, semesterNB, topic='SCS', display=False, validate=False): + """ Load a run and extract the data. Output is an xarray with aligned trainIds 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]} + or dictionnaries defining a custom mnemonic such as + {"extra": {'SCS_CDIFFT_MAG/SUPPLY/CURRENT', 'actual_current.value', None}} 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 + validate: boolean, whether to run karabo-data-validate or not Outputs: res: an xarray DataSet with aligned trainIds @@ -59,48 +172,48 @@ def load(fields, runNB, proposalNB, semesterNB, topic='SCS', display=False): runFolder = '/gpfs/exfel/exp/{}/{}/{}/raw/r{:04d}/'.format(topic, semesterNB, proposalNB, runNB) run = RunDirectory(runFolder) - get_ipython().system('karabo-data-validate ' + runFolder) + + if validate: + 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) + if len(f.keys()) > 1: + print('Loading only one "on-the-spot" mnemonic at a time, skipping all others !') + k = list(f.keys())[0] + v = f[k] else: + # extracting mnemomic from the table 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) + v = mnemonics[f] + k = f else: print('Unknow mnemonic "{}". Skipping!'.format(f)) + if k in keys: + continue # already loaded, skip + + if display: + print('Loading {}'.format(k)) + + if v['source'] not in run.all_sources: + print('Source {} not found in run. Skipping!'.format(v['source'])) + continue + + vals.append(run.get_array(v['source'], v['key'], extra_dims=v['dim'])) + + keys.append(k) + aligned_vals = xr.align(*vals, join='inner') result = dict(zip(keys, aligned_vals)) return xr.Dataset(result)