Skip to content

Commit b26a39e

Browse files
authored
Merge pull request #37 from legend-exp/dev
Updates for production cycle `v1.1`
2 parents a61804a + 90a38fa commit b26a39e

39 files changed

+4633
-1087
lines changed

Snakefile

+54-37
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ This includes:
1010
- the same for partition level tiers
1111
"""
1212

13-
import pathlib, os, json, sys
13+
import pathlib, os, json, sys, glob
1414
import scripts.util as ds
1515
from scripts.util.pars_loading import pars_catalog
1616
from scripts.util.patterns import get_pattern_tier_raw
@@ -21,6 +21,8 @@ from scripts.util.utils import (
2121
chan_map_path,
2222
filelist_path,
2323
metadata_path,
24+
tmp_log_path,
25+
pars_path,
2426
)
2527
from datetime import datetime
2628
from collections import OrderedDict
@@ -41,68 +43,59 @@ part = ds.dataset_file(setup, os.path.join(configs, "partitions.json"))
4143
basedir = workflow.basedir
4244

4345

44-
include: "rules/common.smk"
45-
include: "rules/main.smk"
46-
47-
48-
localrules:
49-
gen_filelist,
50-
autogen_output,
51-
52-
53-
ds.pars_key_resolve.write_par_catalog(
54-
["-*-*-*-cal"],
55-
os.path.join(pars_path(setup), "pht", "validity.jsonl"),
56-
get_pattern_tier_raw(setup),
57-
{"cal": ["par_pht"], "lar": ["par_pht"]},
58-
)
46+
wildcard_constraints:
47+
experiment="\w+",
48+
period="p\d{2}",
49+
run="r\d{3}",
50+
datatype="\w{3}",
51+
timestamp="\d{8}T\d{6}Z",
5952

6053

54+
include: "rules/common.smk"
55+
include: "rules/main.smk"
6156
include: "rules/tcm.smk"
6257
include: "rules/dsp.smk"
58+
include: "rules/psp.smk"
6359
include: "rules/hit.smk"
6460
include: "rules/pht.smk"
6561
include: "rules/evt.smk"
6662
include: "rules/skm.smk"
6763
include: "rules/blinding_calibration.smk"
64+
include: "rules/qc_phy.smk"
65+
66+
67+
localrules:
68+
gen_filelist,
69+
autogen_output,
6870

6971

7072
onstart:
7173
print("Starting workflow")
72-
shell(f"rm {pars_path(setup)}/dsp/validity.jsonl || true")
73-
shell(f"rm {pars_path(setup)}/hit/validity.jsonl || true")
74-
shell(f"rm {pars_path(setup)}/pht/validity.jsonl || true")
75-
shell(f"rm {pars_path(setup)}/raw/validity.jsonl || true")
76-
ds.pars_key_resolve.write_par_catalog(
77-
["-*-*-*-cal"],
78-
os.path.join(pars_path(setup), "raw", "validity.jsonl"),
79-
get_pattern_tier_raw(setup),
80-
{"cal": ["par_raw"]},
81-
)
82-
ds.pars_key_resolve.write_par_catalog(
83-
["-*-*-*-cal"],
84-
os.path.join(pars_path(setup), "dsp", "validity.jsonl"),
85-
get_pattern_tier_raw(setup),
86-
{"cal": ["par_dsp"], "lar": ["par_dsp"]},
87-
)
74+
if os.path.isfile(os.path.join(pars_path(setup), "hit", "validity.jsonl")):
75+
os.remove(os.path.join(pars_path(setup), "hit", "validity.jsonl"))
76+
77+
8878
ds.pars_key_resolve.write_par_catalog(
8979
["-*-*-*-cal"],
9080
os.path.join(pars_path(setup), "hit", "validity.jsonl"),
9181
get_pattern_tier_raw(setup),
9282
{"cal": ["par_hit"], "lar": ["par_hit"]},
9383
)
84+
85+
if os.path.isfile(os.path.join(pars_path(setup), "dsp", "validity.jsonl")):
86+
os.remove(os.path.join(pars_path(setup), "dsp", "validity.jsonl"))
9487
ds.pars_key_resolve.write_par_catalog(
9588
["-*-*-*-cal"],
96-
os.path.join(pars_path(setup), "pht", "validity.jsonl"),
89+
os.path.join(pars_path(setup), "dsp", "validity.jsonl"),
9790
get_pattern_tier_raw(setup),
98-
{"cal": ["par_pht"], "lar": ["par_pht"]},
91+
{"cal": ["par_dsp"], "lar": ["par_dsp"]},
9992
)
10093

10194

10295
onsuccess:
10396
from snakemake.report import auto_report
10497

105-
rep_dir = f"{log_path(setup)}/report-{datetime.strftime(datetime.utcnow(), '%Y%m%dT%H%M%SZ')}"
98+
rep_dir = f"{log_path(setup)}/report-{datetime.strftime(datetime.utcnow() , '%Y%m%dT%H%M%SZ')}"
10699
pathlib.Path(rep_dir).mkdir(parents=True, exist_ok=True)
107100
# auto_report(workflow.persistence.dag, f"{rep_dir}/report.html")
108101
with open(os.path.join(rep_dir, "dag.txt"), "w") as f:
@@ -112,8 +105,32 @@ onsuccess:
112105
f.writelines(str(workflow.persistence.dag.rule_dot()))
113106
# shell(f"cat {rep_dir}/rg.txt | dot -Tpdf > {rep_dir}/rg.pdf")
114107
print("Workflow finished, no error")
115-
shell("rm *.gen || true")
116-
shell(f"rm {filelist_path(setup)}/* || true")
108+
109+
# remove .gen files
110+
files = glob.glob("*.gen")
111+
for file in files:
112+
if os.path.isfile(file):
113+
os.remove(file)
114+
115+
# remove filelists
116+
files = glob.glob(os.path.join(filelist_path(setup), "*"))
117+
for file in files:
118+
if os.path.isfile(file):
119+
os.remove(file)
120+
if os.path.exists(filelist_path(setup)):
121+
os.rmdir(filelist_path(setup))
122+
123+
# remove logs
124+
files = glob.glob(os.path.join(tmp_log_path(setup), "*", "*.log"))
125+
for file in files:
126+
if os.path.isfile(file):
127+
os.remove(file)
128+
dirs = glob.glob(os.path.join(tmp_log_path(setup), "*"))
129+
for d in dirs:
130+
if os.path.isdir(d):
131+
os.rmdir(d)
132+
if os.path.exists(tmp_log_path(setup)):
133+
os.rmdir(tmp_log_path(setup))
117134

118135

119136
# Placeholder, can email or maybe put message in slack

Snakefile-build-raw

+8
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,14 @@ meta = metadata_path(setup)
4040
basedir = workflow.basedir
4141

4242

43+
wildcard_constraints:
44+
experiment="\w+",
45+
period="p\d{2}",
46+
run="r\d{3}",
47+
datatype="\w{3}",
48+
timestamp="\d{8}T\d{6}Z",
49+
50+
4351
localrules:
4452
gen_filelist,
4553
autogen_output,

rules/common.smk

+70
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ from scripts.util.patterns import (
1111
get_pattern_tier_raw,
1212
get_pattern_plts_tmp_channel,
1313
)
14+
from scripts.util import ProcessingFileKey
1415

1516

1617
def read_filelist(wildcards):
@@ -39,6 +40,15 @@ def read_filelist_cal(wildcards, tier):
3940
return files
4041

4142

43+
def read_filelist_fft(wildcards, tier):
44+
label = f"all-{wildcards.experiment}-{wildcards.period}-{wildcards.run}-fft"
45+
with checkpoints.gen_filelist.get(label=label, tier=tier, extension="file").output[
46+
0
47+
].open() as f:
48+
files = f.read().splitlines()
49+
return files
50+
51+
4252
def read_filelist_pars_cal_channel(wildcards, tier):
4353
"""
4454
This function will read the filelist of the channels and return a list of dsp files one for each channel
@@ -99,3 +109,63 @@ def get_pattern(tier):
99109
return get_pattern_tier_daq(setup)
100110
else:
101111
return get_pattern_tier_raw(setup)
112+
113+
114+
def set_last_rule_name(workflow, new_name):
115+
"""Sets the name of the most recently created rule to be `new_name`.
116+
Useful when creating rules dynamically (i.e. unnamed).
117+
118+
Warning
119+
-------
120+
This could mess up the workflow. Use at your own risk.
121+
"""
122+
rules = workflow._rules
123+
last_key = next(reversed(rules))
124+
assert last_key == rules[last_key].name
125+
126+
rules[new_name] = rules.pop(last_key)
127+
rules[new_name].name = new_name
128+
129+
if workflow.default_target == last_key:
130+
workflow.default_target = new_name
131+
132+
if last_key in workflow._localrules:
133+
workflow._localrules.remove(last_key)
134+
workflow._localrules.add(new_name)
135+
136+
workflow.check_localrules()
137+
138+
139+
def get_svm_file(wildcards, tier, name):
140+
par_overwrite_file = os.path.join(par_overwrite_path(setup), tier, "validity.jsonl")
141+
pars_files_overwrite = pars_catalog.get_calib_files(
142+
par_overwrite_file, wildcards.timestamp
143+
)
144+
for pars_file in pars_files_overwrite:
145+
if name in pars_file:
146+
return os.path.join(par_overwrite_path(setup), tier, pars_file)
147+
raise ValueError(f"Could not find model in {pars_files_overwrite}")
148+
149+
150+
def get_overwrite_file(tier, wildcards=None, timestamp=None, name=None):
151+
par_overwrite_file = os.path.join(par_overwrite_path(setup), tier, "validity.jsonl")
152+
if timestamp is not None:
153+
pars_files_overwrite = pars_catalog.get_calib_files(
154+
par_overwrite_file, timestamp
155+
)
156+
else:
157+
pars_files_overwrite = pars_catalog.get_calib_files(
158+
par_overwrite_file, wildcards.timestamp
159+
)
160+
if name is None:
161+
fullname = f"{tier}-overwrite.json"
162+
else:
163+
fullname = f"{tier}_{name}-overwrite.json"
164+
out_files = []
165+
for pars_file in pars_files_overwrite:
166+
if fullname in pars_file:
167+
out_files.append(os.path.join(par_overwrite_path(setup), tier, pars_file))
168+
if len(out_files) == 0:
169+
raise ValueError(f"Could not find name in {pars_files_overwrite}")
170+
else:
171+
return out_files

0 commit comments

Comments
 (0)