Skip to content

Commit 7a2e637

Browse files
authored
Dplms updates, add psp for dplms and merge in channel functionality (#143)
* add merge in channel rules * add in channel merging methods, add dplms for psp * Update pygama and legend-dataflow-scripts versions * Update pygama and legend-dataflow-scripts versions * Update legend_metadata_version to v1.4.0 * fix tests
1 parent 7dba013 commit 7a2e637

20 files changed

Lines changed: 953 additions & 93 deletions

dataflow-config.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
legend_metadata_version: v1.2.2
1+
legend_metadata_version: v1.4.0
22
allow_none_par: false
33
build_file_dbs: true
44
check_log_files: true

pyproject.toml

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,12 +52,12 @@ dynamic = ["version"]
5252
dependencies = [
5353
"colorlog",
5454
"dbetto==1.2.4",
55-
"pygama==2.3.8a1",
55+
"pygama==2.3.8",
5656
"dspeed==2.1.2",
5757
"pylegendmeta==1.3.1",
5858
"legend-pydataobj==1.17.2",
5959
"legend-daq2lh5==1.6.3",
60-
"legend-dataflow-scripts==0.3.0a3",
60+
"legend-dataflow-scripts==0.3.0",
6161
"pip",
6262
"snakemake-logger-plugin-rich",
6363
"snakemake-logger-plugin-snkmt",
@@ -96,6 +96,7 @@ docs = [
9696
[project.scripts]
9797
create-chankeylist = "legenddataflow.scripts.create_chankeylist:create_chankeylist"
9898
merge-channels = "legenddataflow.scripts.flow.merge_channels:merge_channels"
99+
merge-in-channels = "legenddataflow.scripts.flow.merge_in_channel:merge_in_channel"
99100
build-tier-evt = "legenddataflow.scripts.tier.evt:build_tier_evt"
100101
build-tier-raw-blind = "legenddataflow.scripts.tier.raw_blind:build_tier_raw_blind"
101102
build-tier-raw-fcio = "legenddataflow.scripts.tier.raw_fcio:build_tier_raw_fcio"
@@ -108,6 +109,7 @@ par-geds-pht-fast = "legenddataflow.scripts.par.geds.pht.fast:par_geds_pht
108109
par-geds-pht-qc-phy = "legenddataflow.scripts.par.geds.pht.qc_phy:par_geds_pht_qc_phy"
109110
par-geds-pht-qc = "legenddataflow.scripts.par.geds.pht.qc:par_geds_pht_qc"
110111
par-geds-psp-average = "legenddataflow.scripts.par.geds.psp.average:par_geds_psp_average"
112+
par-geds-psp-dplms = "legenddataflow.scripts.par.geds.psp.dplms:par_geds_psp_dplms"
111113
par-geds-raw-blindcal = "legenddataflow.scripts.par.geds.raw.blindcal:par_geds_raw_blindcal"
112114
par-geds-raw-blindcheck = "legenddataflow.scripts.par.geds.raw.blindcheck:par_geds_raw_blindcheck"
113115
par-geds-tcm-pulser = "legenddataflow.scripts.par.geds.tcm.pulser:par_geds_tcm_pulser"

tests/runprod/test-argon-char-dataprod.sh

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ rawfiles=(
1717
anp/p13/r002/l200-p13-r002-anp-20241217T094846Z-tier_raw.lh5
1818
anc/p13/r006/l200-p13-r006-anc-20241221T150249Z-tier_raw.lh5
1919
acs/p13/r006/l200-p13-r006-acs-20241221T150307Z-tier_raw.lh5
20+
cal/p03/r000/l200-p03-r000-cal-20230311T235840Z-tier_raw.lh5
21+
cal/p16/r000/l200-p16-r000-cal-20260101T000000Z-tier_raw.lh5
2022
)
2123

2224
(

tests/runprod/test-evt.sh

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ rawfiles=(
2424
cal/p03/r001/l200-p03-r001-cal-20230317T211819Z-tier_raw.lh5
2525
cal/p03/r000/l200-p03-r000-cal-20230311T235840Z-tier_raw.lh5
2626
cal/p03/r002/l200-p03-r002-cal-20230324T161401Z-tier_raw.lh5
27+
cal/p16/r000/l200-p16-r000-cal-20260101T000000Z-tier_raw.lh5
2728
)
2829

2930
(

workflow/Snakefile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@ wildcard_constraints:
7373

7474

7575
include: "rules/channel_merge.smk"
76+
include: "rules/merge_in_channel.smk"
7677
include: "rules/common.smk"
7778
include: "rules/main.smk"
7879
include: "rules/tcm.smk"

workflow/profiles/lngs/config.yaml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
cores: 90
2-
restart-times: 2
2+
restart-times: 0
33
resources:
44
- mem_swap=3500
55
configfile: dataflow-config.yaml

workflow/rules/common.smk

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,6 @@ def get_table_name(metadata, config, datatype, timestamp, detector, tier):
142142
)
143143
if isinstance(detector, tuple):
144144
if detector[0] == "default":
145-
print(detector)
146145
return config.table_format[tier].format(
147146
ch=chmap[detector[1].channel].daq.rawid
148147
)

workflow/rules/dsp_pars_geds.smk

Lines changed: 46 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
Snakemake rules for building dsp pars for HPGes, before running build_dsp()
33
- extraction of pole zero constant(s) for each channel from cal data
44
- extraction of energy filter parameters and charge trapping correction for each channel from cal data
5+
6+
Outputs should be dsp_pars, dsp_plots, dsp_pars_lh5 and dsp_objects, to be fed into merge rules
57
"""
68

79
from legenddataflow.methods import ParsKeyResolve
@@ -32,8 +34,8 @@ rule build_pars_dsp_pz_geds:
3234
),
3335
pulser=get_pattern_pars_tmp_channel(config, "tcm", "pulser_ids"),
3436
output:
35-
decay_const=temp(get_pattern_pars_tmp_channel(config, "dsp", "decay_constant")),
36-
plots=temp(get_pattern_plts_tmp_channel(config, "dsp", "decay_constant")),
37+
dsp_pars=temp(get_pattern_pars_tmp_channel(config, "dsp", "decay_constant")),
38+
dsp_plots=temp(get_pattern_plts_tmp_channel(config, "dsp", "decay_constant")),
3739
log:
3840
get_pattern_log_channel(config, "par_dsp_decay_constant", time),
3941
group:
@@ -78,8 +80,8 @@ rule build_pars_dsp_pz_geds:
7880
"--config-file {params.config_file} "
7981
"--processing-chain {params.processing_chain} "
8082
"--raw-table-name {params.raw_table_name} "
81-
"--plot-path {output.plots} "
82-
"--output-file {output.decay_const} "
83+
"--plot-path {output.dsp_plots} "
84+
"--output-file {output.dsp_pars} "
8385
"--pulser-file {input.pulser} "
8486
"--raw-files {input.files} "
8587
"--pz-files {input.pz_files}"
@@ -91,7 +93,7 @@ rule build_pars_evtsel_geds:
9193
filelist_path(config), "all-{experiment}-{period}-{run}-cal-raw.filelist"
9294
),
9395
pulser_file=get_pattern_pars_tmp_channel(config, "tcm", "pulser_ids"),
94-
database=rules.build_pars_dsp_pz_geds.output.decay_const,
96+
database=rules.build_pars_dsp_pz_geds.output.dsp_pars,
9597
raw_cal_curve=get_blinding_curve_file,
9698
output:
9799
peak_file=temp(
@@ -157,13 +159,13 @@ rule build_pars_dsp_nopt_geds:
157159
files=os.path.join(
158160
filelist_path(config), "all-{experiment}-{period}-{run}-fft-raw.filelist"
159161
),
160-
database=rules.build_pars_dsp_pz_geds.output.decay_const,
161-
inplots=rules.build_pars_dsp_pz_geds.output.plots,
162+
database=rules.build_pars_dsp_pz_geds.output.dsp_pars,
163+
inplots=rules.build_pars_dsp_pz_geds.output.dsp_plots,
162164
output:
163-
dsp_pars_nopt=temp(
164-
get_pattern_pars_tmp_channel(config, "dsp", "noise_optimization")
165+
dsp_pars=temp(get_pattern_pars_tmp_channel(config, "dsp", "noise_optimization")),
166+
dsp_plots=temp(
167+
get_pattern_plts_tmp_channel(config, "dsp", "noise_optimization")
165168
),
166-
plots=temp(get_pattern_plts_tmp_channel(config, "dsp", "noise_optimization")),
167169
log:
168170
get_pattern_log_channel(config, "par_dsp_noise_optimization", time),
169171
group:
@@ -210,8 +212,8 @@ rule build_pars_dsp_nopt_geds:
210212
"--processing-chain {params.processing_chain} "
211213
"--raw-table-name {params.raw_table_name} "
212214
"--inplots {input.inplots} "
213-
"--plot-path {output.plots} "
214-
"--dsp-pars {output.dsp_pars_nopt} "
215+
"--plot-path {output.dsp_plots} "
216+
"--dsp-pars {output.dsp_pars} "
215217
"--raw-filelist {input.files}"
216218

217219

@@ -222,12 +224,14 @@ rule build_pars_dsp_dplms_geds:
222224
filelist_path(config), "all-{experiment}-{period}-{run}-fft-raw.filelist"
223225
),
224226
peak_file=rules.build_pars_evtsel_geds.output.peak_file,
225-
database=rules.build_pars_dsp_nopt_geds.output.dsp_pars_nopt,
226-
inplots=rules.build_pars_dsp_nopt_geds.output.plots,
227+
dsp_pars=rules.build_pars_dsp_pz_geds.output.dsp_pars,
228+
inplots=rules.build_pars_dsp_pz_geds.output.dsp_plots,
227229
output:
228230
dsp_pars=temp(get_pattern_pars_tmp_channel(config, "dsp", "dplms")),
229-
lh5_path=temp(get_pattern_pars_tmp_channel(config, "dsp", extension="lh5")),
230-
plots=temp(get_pattern_plts_tmp_channel(config, "dsp", "dplms")),
231+
dsp_pars_lh5=temp(
232+
get_pattern_pars_tmp_channel(config, "dsp", "dplms", extension="lh5")
233+
),
234+
dsp_plots=temp(get_pattern_plts_tmp_channel(config, "dsp", "dplms")),
231235
log:
232236
get_pattern_log_channel(config, "pars_dsp_dplms", time),
233237
group:
@@ -270,7 +274,7 @@ rule build_pars_dsp_dplms_geds:
270274
shell:
271275
execenv_pyexe(config, "par-geds-dsp-dplms") + "--peak-file {input.peak_file} "
272276
"--fft-raw-filelist {input.fft_files} "
273-
"--database {input.database} "
277+
"--database {input.dsp_pars} "
274278
"--inplots {input.inplots} "
275279
"--log {log} "
276280
"--log-config {params.log_config} "
@@ -279,22 +283,24 @@ rule build_pars_dsp_dplms_geds:
279283
"--processing-chain {params.processing_chain} "
280284
"--raw-table-name {params.raw_table_name} "
281285
"--dsp-pars {output.dsp_pars} "
282-
"--lh5-path {output.lh5_path} "
283-
"--plot-path {output.plots} "
286+
"--lh5-path {output.dsp_pars_lh5} "
287+
"--plot-path {output.dsp_plots} "
284288

285289

286290
# This rule builds the optimal energy filter parameters for the dsp using calibration dsp files
287291
rule build_pars_dsp_eopt_geds:
288292
input:
289293
peak_file=rules.build_pars_evtsel_geds.output.peak_file,
290-
decay_const=rules.build_pars_dsp_dplms_geds.output.dsp_pars,
291-
inplots=rules.build_pars_dsp_dplms_geds.output.plots,
294+
dsp_pars=rules.build_pars_dsp_pz_geds.output.dsp_pars,
295+
inplots=rules.build_pars_dsp_pz_geds.output.dsp_plots,
292296
output:
293297
dsp_pars=temp(get_pattern_pars_tmp_channel(config, "dsp_eopt")),
294-
qbb_grid=temp(
295-
get_pattern_pars_tmp_channel(config, "dsp", "objects", extension="pkl")
298+
dsp_objects=temp(
299+
get_pattern_pars_tmp_channel(
300+
config, "dsp", "eopt_objects", extension="pkl"
301+
)
296302
),
297-
plots=temp(get_pattern_plts_tmp_channel(config, "dsp")),
303+
dsp_plots=temp(get_pattern_plts_tmp_channel(config, "dsp", "eopt")),
298304
log:
299305
get_pattern_log_channel(config, "pars_dsp_eopt", time),
300306
group:
@@ -340,9 +346,9 @@ rule build_pars_dsp_eopt_geds:
340346
"--raw-table-name {params.raw_table_name} "
341347
"--peak-file {input.peak_file} "
342348
"--inplots {input.inplots} "
343-
"--decay-const {input.decay_const} "
344-
"--plot-path {output.plots} "
345-
"--qbb-grid-path {output.qbb_grid} "
349+
"--decay-const {input.dsp_pars} "
350+
"--plot-path {output.dsp_plots} "
351+
"--qbb-grid-path {output.dsp_objects} "
346352
"--final-dsp-pars {output.dsp_pars}"
347353

348354

@@ -400,10 +406,9 @@ rule build_svm_dsp_geds:
400406

401407
rule build_pars_dsp_svm_geds:
402408
input:
403-
dsp_pars=rules.build_pars_dsp_eopt_geds.output.dsp_pars,
404409
svm_file=rules.build_svm_dsp_geds.output.dsp_pars,
405410
output:
406-
dsp_pars=temp(get_pattern_pars_tmp_channel(config, "dsp")),
411+
dsp_pars=temp(get_pattern_pars_tmp_channel(config, "dsp", "svm")),
407412
log:
408413
get_pattern_log_channel(config, "pars_dsp_svm", time),
409414
group:
@@ -412,6 +417,17 @@ rule build_pars_dsp_svm_geds:
412417
runtime=300,
413418
shell:
414419
execenv_pyexe(config, "par-geds-dsp-svm") + "--log {log} "
415-
"--input-file {input.dsp_pars} "
420+
# "--input-file {input.dsp_pars} "
416421
"--output-file {output.dsp_pars} "
417422
"--svm-file {input.svm_file}"
423+
424+
425+
build_in_channel_merge_rules(
426+
[
427+
rules.build_pars_dsp_eopt_geds,
428+
rules.build_pars_dsp_nopt_geds,
429+
rules.build_pars_dsp_svm_geds,
430+
rules.build_pars_dsp_dplms_geds,
431+
],
432+
"dsp",
433+
)

workflow/rules/evt.smk

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,8 @@ for evt_tier in ("evt", "pet"):
128128
rule:
129129
input:
130130
os.path.join(
131-
filelist_path(config), "all-{experiment}-{period}-{run}-phy-"+f"{evt_tier}.filelist"
131+
filelist_path(config),
132+
"all-{experiment}-{period}-{run}-phy-" + f"{evt_tier}.filelist",
132133
),
133134
output:
134135
get_pattern_tier(
Lines changed: 136 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,136 @@
1+
import inspect
2+
3+
from legenddataflow.methods import patterns
4+
from legenddataflowscripts.workflow import execenv_pyexe, set_last_rule_name
5+
from legenddataflow.scripts.flow.build_chanlist import (
6+
get_plt_chanlist,
7+
get_par_chanlist,
8+
)
9+
10+
11+
def build_in_channel_merge_rules(rules, tier, output_name=None):
12+
13+
input_dsp_pars = []
14+
input_dsp_pars_lh5 = []
15+
input_dsp_objects = []
16+
input_dsp_plots = []
17+
18+
name = f"tier" if output_name is None else f"{tier}_{output_name}"
19+
20+
group_name = f"merge-inchan-{tier}"
21+
if output_name is not None:
22+
group_name += f"_{output_name}"
23+
24+
for r in rules:
25+
if hasattr(r.output, f"{tier}_pars"):
26+
input_dsp_pars.append(r.output.dsp_pars)
27+
if hasattr(r.output, f"{tier}_pars_lh5"):
28+
input_dsp_pars_lh5.append(r.output.dsp_pars_lh5)
29+
if hasattr(r.output, f"{tier}_plots"):
30+
input_dsp_plots.append(r.output.dsp_plots)
31+
if hasattr(r.output, f"{tier}_objects"):
32+
input_dsp_objects.append(r.output.dsp_objects)
33+
34+
rule:
35+
input:
36+
input_dsp_plots,
37+
output:
38+
temp(get_pattern_plts_tmp_channel(config, tier, name=output_name)),
39+
group:
40+
group_name
41+
shell:
42+
execenv_pyexe(config, "merge-in-channels") + "--input {input} "
43+
"--output {output} "
44+
45+
set_last_rule_name(workflow, f"build_plts_inchan_{name}")
46+
47+
object_output_name = "objects"
48+
if output_name is not None:
49+
object_output_name += f"_{output_name}"
50+
51+
rule:
52+
input:
53+
input_dsp_objects,
54+
output:
55+
temp(
56+
get_pattern_pars_tmp_channel(
57+
config, tier, name=object_output_name, extension="pkl"
58+
)
59+
),
60+
group:
61+
group_name
62+
shell:
63+
execenv_pyexe(config, "merge-in-channels") + "--input {input} "
64+
"--output {output} "
65+
66+
set_last_rule_name(workflow, f"build_pars_inchan_{name}_objects")
67+
68+
if len(input_dsp_pars_lh5) > 0:
69+
70+
rule:
71+
input:
72+
input_dsp_pars,
73+
output:
74+
temp(
75+
get_pattern_pars_tmp_channel(
76+
config,
77+
tier,
78+
name=(
79+
output_name + "_tmp" if output_name is not None else "tmp"
80+
),
81+
)
82+
),
83+
group:
84+
group_name
85+
shell:
86+
execenv_pyexe(config, "merge-in-channels") + "--input {input} "
87+
"--output {output} "
88+
89+
set_last_rule_name(workflow, f"build_pars_inchan_{name}_db")
90+
91+
rule:
92+
input:
93+
in_files=(
94+
input_dsp_pars_lh5 if len(input_dsp_pars_lh5) > 0 else input_dsp_pars
95+
),
96+
in_db=(
97+
get_pattern_pars_tmp_channel(
98+
config,
99+
tier,
100+
name=output_name + "_tmp" if output_name is not None else "tmp",
101+
)
102+
if len(input_dsp_pars_lh5) > 0
103+
else []
104+
),
105+
plts=get_pattern_plts_tmp_channel(config, tier, name=output_name),
106+
objects=get_pattern_pars_tmp_channel(
107+
config, tier, name=object_output_name, extension="pkl"
108+
),
109+
output:
110+
out_file=(
111+
temp(
112+
get_pattern_pars_tmp_channel(
113+
config, tier, name=output_name, extension="lh5"
114+
)
115+
)
116+
if len(input_dsp_pars_lh5) > 0
117+
else temp(get_pattern_pars_tmp_channel(config, tier, name=output_name))
118+
),
119+
out_db=(
120+
temp(get_pattern_pars_tmp_channel(config, tier, name=output_name))
121+
if len(input_dsp_pars_lh5) > 0
122+
else []
123+
),
124+
group:
125+
group_name
126+
run:
127+
shell_string = (
128+
execenv_pyexe(config, "merge-in-channels")
129+
+ "--output {output.out_file} "
130+
"--input {input.in_files} "
131+
)
132+
if len(input_dsp_pars_lh5) > 0:
133+
shell_string += "--in-db {input.in_db} " "--out-db {output.out_db} "
134+
shell(shell_string)
135+
136+
set_last_rule_name(workflow, f"build_pars_inchan_{name}")

0 commit comments

Comments
 (0)