Source code for km3dq_common.lw_db_signoff_library

#! /usr/bin/env python
###############################################################################
import re
import urllib.request

from km3dq_common.common_library import create_ttree_from_qaqc

from km3dq_common.config_library import configure_dataquality_tag
from km3dq_common.config_library import configure_defect

from km3dq_common.lw_db_library import decode_defect_diag_byte


###############################################################################
[docs] def get_unsignedoff_runs(det, dq_tag_name="default"): """ Return the unsignedoff PHYS runs based on the defect files stored on SFTP ("signoff" defect type) === Arguments === - det : detector name - [string] - Ex: "D0ARCA021", "D0ORCA018"... - dq_tag_name : data quality tag name - [string] - Ex: "default", "neutrino2024" === Output === - Dictionnary with def_[defect] as keys and a value for each affected run. This value will be decoded by the decode_defect_diag_byte function. Ex: {'def_daq': {}, 'def_operation': {16501: 1, 16503: 2}...} """ # The DQ tag is needed as the signoff depends on the QAQC file that # depends itself on the DQ tag dq_tag = configure_dataquality_tag(dq_tag_name) defects0 = configure_defect() if "ORCA" in det: site = "ORCA" else: site = "ARCA" (tree_qaqc, _) = create_ttree_from_qaqc(det, ["run"], "qaqc_sftp", dq_tag) re_line = re.compile(r"\s*([0-9]+)\s*\|.*") entries = tree_qaqc.GetEntriesFast() res = {} # Initialize the output for all runs as not yet signed off for irun in range(entries): # One entry per run tree_qaqc.GetEntry(irun) # Load event res[tree_qaqc.run] = [] for i_diag in defects0['bit']["signoff"].keys(): res[tree_qaqc.run].append(i_diag) # Now scan the defect files and removed the run signed off for i_diag in defects0['bit']["signoff"].keys(): lines = [] defect_url = ("https://sftp.km3net.de/data/km3dq_lw_db/" f"{site}/{det}/Defects/{dq_tag['def_tag']}/" f"signoff_{i_diag}.txt") try: with urllib.request.urlopen(defect_url) as def_file: tmp = ((def_file.read()).split(b"\n")) for i_line in tmp: if i_line != "": lines.append(i_line.decode("utf-8")) except urllib.error.URLError: # No defect file found continue for i_line in lines: r_m = re_line.match(i_line) if r_m is not None: run_nb = int(r_m.group(1)) # Run signed off not (yet?) in QAQC if run_nb not in res.keys(): continue signoff_nature_bit = 1 << \ defects0['bit']["signoff"][i_diag] signoff_nature = decode_defect_diag_byte(signoff_nature_bit, "signoff") for i_nature in signoff_nature.split(" / "): if i_nature != "": res[run_nb].remove(i_nature) if len(res[run_nb]) == 0: res.pop(run_nb) return res