Skip to content

Commit 57501b6

Browse files
Use label points for GrapPA input without PPN
1 parent 676d113 commit 57501b6

2 files changed

Lines changed: 67 additions & 7 deletions

File tree

src/spine/model/full_chain.py

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,11 @@
2424
from spine.data import IndexBatch, RunInfo, TensorBatch
2525
from spine.utils.cluster.label import ClusterLabelAdapter
2626
from spine.utils.ghost import ChargeRescaler
27-
from spine.utils.gnn.cluster import form_clusters_batch, get_cluster_label_batch
27+
from spine.utils.gnn.cluster import (
28+
form_clusters_batch,
29+
get_cluster_label_batch,
30+
get_cluster_points_label_batch,
31+
)
2832
from spine.utils.gnn.evaluation import primary_assignment_batch
2933
from spine.utils.logger import logger
3034
from spine.utils.ppn import ParticlePointPredictor
@@ -1248,9 +1252,6 @@ def prepare_grappa_input(
12481252
grappa_input["data"] = data
12491253
grappa_input["clusts"] = clusts
12501254
grappa_input["shapes"] = clust_shapes
1251-
if coord_label is not None:
1252-
grappa_input["coord_label"] = coord_label
1253-
12541255
# Get the particle end points, if requested
12551256
if hasattr(model.node_encoder, "add_points") and model.node_encoder.add_points:
12561257
# Fetch the cluster list to use to get points
@@ -1262,12 +1263,22 @@ def prepare_grappa_input(
12621263
ref_clusts = clust_primaries
12631264

12641265
# Get and store the points
1265-
points = self.point_predictor(
1266-
data, ref_clusts, clust_shapes, self.result["ppn_points"]
1267-
)
1266+
if "ppn_points" in self.result:
1267+
points = self.point_predictor(
1268+
data, ref_clusts, clust_shapes, self.result["ppn_points"]
1269+
)
1270+
else:
1271+
assert coord_label is not None, (
1272+
"Must provide either `ppn_points` or `coord_label` to add "
1273+
"points to the GrapPA input."
1274+
)
1275+
points = get_cluster_points_label_batch(data, coord_label, ref_clusts)
12681276

12691277
grappa_input["points"] = points
12701278

1279+
elif coord_label is not None:
1280+
grappa_input["coord_label"] = coord_label
1281+
12711282
# Get the supplemental information, if requested
12721283
if hasattr(model.node_encoder, "add_value") and (
12731284
model.node_encoder.add_value or model.node_envoder.add_shape

test/test_model/test_full_chain.py

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
1+
from types import SimpleNamespace
2+
13
import numpy as np
24
import torch
35

6+
import spine.model.full_chain as full_chain_mod
47
from spine.constants import GHOST_SHP, GROUP_COL, PRGRP_COL, SHAPE_COL, SHOWR_SHP
58
from spine.data import IndexBatch, TensorBatch
69
from spine.model.full_chain import FullChain, FullChainLoss
@@ -107,3 +110,49 @@ def test_group_labels_accepts_shape_restriction_without_model():
107110
assert np.array_equal(groups.index_list[0], [0, 1])
108111
assert group_shapes.tensor.tolist() == [SHOWR_SHP]
109112
assert group_primaries is groups
113+
114+
115+
def test_prepare_grappa_input_uses_label_points_without_ppn(monkeypatch):
116+
full_chain = object.__new__(FullChain)
117+
full_chain.result = {}
118+
119+
model = SimpleNamespace(node_encoder=SimpleNamespace(add_points=True))
120+
data = TensorBatch(np.zeros((3, 4), dtype=np.float32), counts=np.array([3]))
121+
clusts = IndexBatch(
122+
[np.array([0], dtype=np.int64), np.array([1, 2], dtype=np.int64)],
123+
spans=np.array([3]),
124+
counts=np.array([2]),
125+
single_counts=np.array([1, 2]),
126+
)
127+
primaries = IndexBatch(
128+
[np.array([1], dtype=np.int64), np.array([2], dtype=np.int64)],
129+
spans=np.array([3]),
130+
counts=np.array([2]),
131+
single_counts=np.array([1, 1]),
132+
)
133+
clust_shapes = TensorBatch(np.array([SHOWR_SHP, SHOWR_SHP]), counts=np.array([2]))
134+
coord_label = TensorBatch(np.zeros((2, 9), dtype=np.float32), counts=np.array([2]))
135+
label_points = TensorBatch(np.ones((2, 6), dtype=np.float32), counts=np.array([2]))
136+
calls = []
137+
138+
def fake_label_points(data_arg, coord_label_arg, clusts_arg):
139+
calls.append((data_arg, coord_label_arg, clusts_arg))
140+
return label_points
141+
142+
monkeypatch.setattr(
143+
full_chain_mod, "get_cluster_points_label_batch", fake_label_points
144+
)
145+
146+
grappa_input = full_chain.prepare_grappa_input(
147+
model,
148+
data,
149+
clusts,
150+
clust_shapes,
151+
clust_primaries=primaries,
152+
coord_label=coord_label,
153+
point_use_primaries=True,
154+
)
155+
156+
assert grappa_input["points"] is label_points
157+
assert "coord_label" not in grappa_input
158+
assert calls == [(data, coord_label, primaries)]

0 commit comments

Comments
 (0)