#! /usr/bin/env python
###############################################################################
import re
import sys
import urllib.request
from km3dq_common.detector_fact_classes import DetectorFact
###############################################################################
[docs]
def read_basic_fact_file(det, fact_type):
"""
Read defect files stored on SFTP. Simply returns lines
=== Arguments ===
- det : detector name - [string] - Ex: "D0ARCA021", "D0ORCA018"...
- fact_type
=== Output ===
- Array of lines
"""
if "ORCA" in det:
site = "ORCA"
else:
site = "ARCA"
lines = []
fact_url = (
"https://sftp.km3net.de/data/km3dq_lw_db/"
f"{site}/{det}/Facts/"
f"{fact_type}.txt"
)
try:
with urllib.request.urlopen(fact_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 fact file found
lines = None
return lines
###############################################################################
[docs]
def read_det_fact_file(site):
"""
Read detector fact files stored on SFTP
=== Arguments ===
- det : detector name - [string] - Ex: "D0ARCA021", "D0ORCA018"...
- def_tag : defect tag - [string]
- type_filter : if not empty, filter on the defect type - If empty, read
all defect files - [array of strings] -
Ex: ["daq", "operation"]
=== Output ===
- raw detector facts
- detector start/end
"""
raw_df = {}
re_line = re.compile(
r"(.*)\|"
r"(.*)\|"
r"(.*)\|"
r"(.*)\|"
r"(.*)\|"
r"(.*)\|"
r"(.*)\|"
r"(.*)\|"
r"(.*)\|"
r"(.*)\|"
r"(.*)"
)
raw_df = []
lines = []
det_fact_url = (
"https://sftp.km3net.de/data/km3dq_lw_db/"
f"{site}//DetectorFacts/"
f"detector_facts.txt"
)
try:
with urllib.request.urlopen(det_fact_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
print("Missing detector-fact file")
sys.exit()
for i_line_index, i_line in enumerate(lines):
if i_line_index == 0:
continue
r_m = re_line.match(i_line)
if r_m:
raw_df.append(DetectorFact())
raw_df[-1].hardware = r_m.group(4).split("-")[0].replace(" ", "")
raw_df[-1].site = site.replace(" ", "")
raw_df[-1].time = r_m.group(1)
raw_df[-1].det = r_m.group(2).replace(" ", "")
raw_df[-1].following_run = int(r_m.group(3))
raw_df[-1].upi = (r_m.group(4).split(f"{raw_df[-1].hardware}-")[1]).replace(
" ", ""
)
raw_df[-1].location = r_m.group(5).replace(" ", "")
# For some unknown reasons, the lines below are mandatory to avoid an
# error: AttributeError: 'DetectorFact' object has no attribute coord_utm
raw_df[-1].coord_utm = {"x": 0.0, "y": 0.0, "z": 0.0}
raw_df[-1].coord_detx = {"x": 0.0, "y": 0.0, "z": 0.0}
raw_df[-1].extract_coord_from_location()
if r_m.group(6).replace(" ", "") != "":
raw_df[-1].position = int(r_m.group(6))
else: # Detector object has no position
raw_df[-1].position = ""
raw_df[-1].status = r_m.group(7).replace(" ", "")
raw_df[-1].comment = r_m.group(8)
if "&" in r_m.group(9): # Waveform with rate definition
raw_df[-1].waveform = r_m.group(9).split("&")[0].replace(" ", "")
raw_df[-1].emission_rate = r_m.group(9).split("&")[1]
else:
raw_df[-1].waveform = r_m.group(9).replace(" ", "")
raw_df[-1].emission_rate = ""
raw_df[-1].documentation = r_m.group(10)
raw_df[-1].author = r_m.group(11)
return raw_df