diff --git a/cal_tools/cal_tools/dssclib.py b/cal_tools/cal_tools/dssclib.py index 8eabb3f42e4b3ae7be67ea39941ee38c5c408186..fb365023fb4da2f7fb58521fbde6cbd5e9d70e7e 100644 --- a/cal_tools/cal_tools/dssclib.py +++ b/cal_tools/cal_tools/dssclib.py @@ -14,7 +14,7 @@ def get_pulseid_checksum(fname, h5path, h5path_idx): with h5py.File(fname, "r") as infile: count = np.squeeze(infile[f"{h5path_idx}/count"]) first = np.squeeze(infile[f"{h5path_idx}/first"]) - last_index = int(first[count != 0][-1]+count[count != 0][-1]) + last_index = int(first[count != 0][-1] + count[count != 0][-1]) first_index = int(first[count != 0][0]) pulseids = infile[f"{h5path}/pulseId"][first_index: int(first[count != 0][1])] @@ -26,7 +26,7 @@ def get_pulseid_checksum(fname, h5path, h5path_idx): def _extr_gainparam_conffilename(fileName: str) -> Tuple[int]: """extracts target gain from config filename, if provided.""" - vals = re.search(".*_TG(?P<TG>\d+.?\d+)", fileName) + vals = re.search(".*_TG(?P<TG>\\d+.?\\d+)", fileName) if vals: return vals.group('TG') @@ -55,7 +55,7 @@ def get_dssc_ctrl_data(in_folder, slow_data_pattern, encodedGainAll = {} operatingFreqAll = {} for i in range(16): - qm = 'Q{}M{}'.format(i//4+1, i % 4+1) + qm = 'Q{}M{}'.format(i // 4 + 1, i % 4 + 1) targetGainAll[qm] = None encodedGainAll[qm] = None operatingFreqAll[qm] = None @@ -67,59 +67,78 @@ def get_dssc_ctrl_data(in_folder, slow_data_pattern, f = os.path.join(in_folder, quad_sd_pattern) if os.path.exists(f): - ctrlDataFiles[quadrant+1] = f + ctrlDataFiles[quadrant + 1] = f if len(ctrlDataFiles) == 0: - print("No Control Slow Data found!") + print("ERROR: no Slow Control Data found!") return targetGainAll, encodedGainAll, operatingFreqAll - ctrlloc = h5py.File(next(iter(ctrlDataFiles.values())), 'r')[ - '/METADATA/dataSources/deviceId'][0] + daq_format = None + + ctrlloc = None + filename = next(iter(ctrlDataFiles.values())) + with h5py.File(filename, 'r') as ctlrh5file: + if '/METADATA/dataSources/deviceId' in ctlrh5file: + ctrlloc = ctlrh5file['/METADATA/dataSources/deviceId'][0] + daq_format = ctlrh5file['/METADATA/dataFormatVersion'][0].decode( + "utf-8") + elif '/METADATA/deviceId' in ctlrh5file: + ctrlloc = ctlrh5file['/METADATA/deviceId'][0] + else: + print("ERROR: no Slow Control Data found in files!") + return targetGainAll, encodedGainAll, operatingFreqAll + ctrlloc = ctrlloc.decode("utf-8") ctrlloc = ctrlloc[:ctrlloc.find('/')] tGain = {} encodedGain = {} operatingFreqs = {} - for quadrant, file in ctrlDataFiles.items(): - if len(file): - h5file = h5py.File(file) - if not f'/RUN/{ctrlloc}/FPGA/PPT_Q{quadrant}/epcRegisterFilePath/value' in h5file: - print(f"Slow control data file {file} is not usable") - continue - epcConfig = h5file[f'/RUN/{ctrlloc}/FPGA/PPT_Q{quadrant}/epcRegisterFilePath/value'][0]\ - .decode("utf-8") - epcConfig = epcConfig[epcConfig.rfind('/') + 1:] - - print(f"EPC configuration: {epcConfig}") - - targGain = _extr_gainparam_conffilename(epcConfig) - - tGain[quadrant] = float(targGain) if targGain is not None else 0.0 - # 0.0 is default value for TG - - gainSettingsMap = {} - for coarseParam in ['fcfEnCap', 'csaFbCap', 'csaResistor']: - gainSettingsMap[coarseParam] = int( - h5file[f'/RUN/{ctrlloc}/FPGA/PPT_Q{quadrant}/gain/{coarseParam}/value'][0]) - - irampSettings = h5file[f'/RUN/{ctrlloc}/FPGA/PPT_Q{quadrant}/gain/irampFineTrm/value'][0]\ - .decode("utf-8") - - gainSettingsMap['trimmed'] = np.int64( - 1) if irampSettings == "Various" else np.int64(0) - - encodedGain[quadrant] = _get_gain_encoded_val(gainSettingsMap) - - opFreq = h5file[f'/RUN/{ctrlloc}/FPGA/PPT_Q{quadrant}/sequencer/cycleLength/value'][0] - # The Operating Frequency of the detector should be in MHz. - # Here the karabo operation mode is converted to acquisition rate: - # 22 corresponds to 4.5 MHz, 44 to 2.25 MHz, etc. - operatingFreqs[quadrant] = 4.5 * (22.0 / opFreq) + for quadrant in range(1,5): + if quadrant in ctrlDataFiles.keys(): + file = ctrlDataFiles[quadrant] + with h5py.File(file) as h5file: + iramp_path = f"/RUN/{ctrlloc}/FPGA/PPT_Q{quadrant}/gain/irampFineTrm/value" + if not daq_format: + tGain[quadrant] = 0.0 # 0.0 is default value for TG + + if iramp_path in h5file: + irampSettings = h5file[iramp_path][0] + else: + irampSettings = "Various" + else: + epcConfig = h5file[f'/RUN/{ctrlloc}/FPGA/PPT_Q{quadrant}/epcRegisterFilePath/value'][0]\ + .decode("utf-8") + epcConfig = epcConfig[epcConfig.rfind('/') + 1:] + + print(f"EPC configuration: {epcConfig}") + targGain = _extr_gainparam_conffilename(epcConfig) + tGain[quadrant] = float( + targGain) if targGain is not None else 0.0 + irampSettings = h5file[iramp_path][0].decode("utf-8") + + gainSettingsMap = {} + for coarseParam in ['fcfEnCap', 'csaFbCap', 'csaResistor']: + gainSettingsMap[coarseParam] = int( + h5file[f'/RUN/{ctrlloc}/FPGA/PPT_Q{quadrant}/gain/{coarseParam}/value'][0]) + + gainSettingsMap['trimmed'] = np.int64( + 1) if irampSettings == "Various" else np.int64(0) + + encodedGain[quadrant] = _get_gain_encoded_val(gainSettingsMap) + + opFreq = h5file[f'/RUN/{ctrlloc}/FPGA/PPT_Q{quadrant}/sequencer/cycleLength/value'][0] + # The Operating Frequency of the detector should be in MHz. + # Here the karabo operation mode is converted to acquisition rate: + # 22 corresponds to 4.5 MHz, 44 to 2.25 MHz, etc. + operatingFreqs[quadrant] = 4.5 * (22.0 / opFreq) else: - print(f"no slow data for quadrant {quadrant} is found") + print(f"ERROR: no slow data for quadrant {quadrant} is found") - for varpair in [(targetGainAll, tGain), (encodedGainAll, encodedGain), (operatingFreqAll, operatingFreqs)]: + for varpair in [ + (targetGainAll, tGain), + (encodedGainAll, encodedGain), + (operatingFreqAll, operatingFreqs)]: for quadrant, value in varpair[1].items(): for module in range(1, 5): qm = f'Q{quadrant}M{module}'