GNN4Colliders / validation /make_binary_artifacts.py
ho22joshua's picture
Add binary CP parity validation runners
c93e291
Raw History Blame Contribute Delete
2.49 kB
#!/usr/bin/env python3
"""Combine CP-even and CP-odd artifacts into labeled binary artifacts."""
from __future__ import annotations
import argparse
from pathlib import Path
import numpy as np
from validation.artifacts import ValidationArtifact, load_artifact, save_artifact
def _combine(even: ValidationArtifact, odd: ValidationArtifact) -> ValidationArtifact:
node_shift = len(even.node_features_flat)
edge_shift = len(even.edge_src_flat)
sample_id = np.concatenate(
[
np.char.add("ttH_CP_even:", even.sample_id),
np.char.add("ttH_CP_odd:", odd.sample_id),
]
)
labels = np.concatenate(
[
np.zeros(even.event_count, dtype=np.int64),
np.ones(odd.event_count, dtype=np.int64),
]
)
node_offsets = np.concatenate(
[even.node_offsets, odd.node_offsets[1:] + node_shift]
)
edge_offsets = np.concatenate(
[even.edge_offsets, odd.edge_offsets[1:] + edge_shift]
)
return ValidationArtifact(
sample_id=sample_id,
labels=labels,
folds=np.concatenate([even.folds, odd.folds]),
weights=np.concatenate([even.weights, odd.weights]),
globals=np.concatenate([even.globals, odd.globals]),
node_features_flat=np.concatenate(
[even.node_features_flat, odd.node_features_flat]
),
node_offsets=node_offsets,
edge_src_flat=np.concatenate([even.edge_src_flat, odd.edge_src_flat]),
edge_dst_flat=np.concatenate([even.edge_dst_flat, odd.edge_dst_flat]),
edge_features_flat=np.concatenate(
[even.edge_features_flat, odd.edge_features_flat]
),
edge_offsets=edge_offsets,
manifest={
"task": "ttH_cp_even_vs_cp_odd",
"label_map": {"CP_even": 0, "CP_odd": 1},
"selection": "none",
"sources": {"CP_even": even.manifest, "CP_odd": odd.manifest},
},
)
def main() -> int:
parser = argparse.ArgumentParser()
parser.add_argument("--even", type=Path, required=True)
parser.add_argument("--odd", type=Path, required=True)
parser.add_argument("--output", type=Path, required=True)
args = parser.parse_args()
artifact = _combine(load_artifact(args.even), load_artifact(args.odd))
save_artifact(artifact, args.output)
print(f"wrote {args.output} ({artifact.event_count} events)")
return 0
if __name__ == "__main__":
raise SystemExit(main())