183def DisplacedVertexInferenceAlgCfg(flags, name="DisplacedVertexInferenceAlg", **kwargs):
184 """Configure a runnable event-level DisplacedVertex inference algorithm."""
185 result = ComponentAccumulator()
186 do_calo_tower_build = kwargs.pop("DoCaloTowerBuild", True)
187 do_ml_bucket_filter = kwargs.pop("DoMLBucketFilter", True)
188 bucket_model_path = kwargs.pop("BucketModelPath", None)
189 bucket_threshold = kwargs.pop("BucketThreshold", None)
190 filtered_bucket_key = kwargs.pop("FilteredBucketKey", "FilteredMlBuckets")
191 use_filtered_buckets_for_dv_graph = kwargs.pop("UseFilteredBucketsForDVGraph", False)
192 alg_output_level = kwargs.get("OutputLevel", None)
193 tool_kwargs = {}
194 for key in (
195 "ModelPath",
196 "InputNodeName",
197 "InputEdgeIndexName",
198 "InputEdgeAttrName",
199 "InputNMuonNodesName",
200 "OutputName",
201 "SingleOutputMode",
202 "SegmentKey",
203 "SpacePointKeys",
204 "UseBucketSegmentSelection",
205 "TowerContainerKey",
206 "MinTowerEnergyMeV",
207 "MaxTowerSegmentDR",
208 "CaloRMaxMm",
209 "CaloZMaxMm",
210 "SectorModulo",
211 "RequireEdges",
212 "MaxEdges",
213 "FallbackToAllSegments",
214 "DebugDumpFirstNNodes",
215 "DebugDumpFirstNEdges",
216 "OutputLevel",
217 ):
218 if key in kwargs:
219 tool_kwargs[key] = kwargs.pop(key)
220
221 if isinstance(kwargs.get("InferenceTool"), dict):
222 tool_kwargs.update(kwargs.pop("InferenceTool"))
223
224 tower_key = tool_kwargs.get("TowerContainerKey", "CombinedTower")
225 if do_calo_tower_build and tower_key:
226 result.merge(DisplacedVertexCaloTowerCfg(flags))
227
228 if do_ml_bucket_filter:
229 bucket_filter_kwargs = {
230 "WriteSpacePointKey": filtered_bucket_key,
231 "ReadSpacePoints": "MuonSpacePoints",
232 }
233 if bucket_model_path is not None:
234 bucket_filter_kwargs["ModelPath"] = bucket_model_path
235 if bucket_threshold is not None:
236 bucket_filter_kwargs["ScoreThreshold"] = bucket_threshold
237 bucket_tool = result.popToolsAndMerge(
238 GraphBucketFilterToolCfg(flags, **bucket_filter_kwargs)
239 )
240 result.merge(
241 GraphInferenceAlgCfg(
242 flags,
243 name="DVBucketPrefilterAlg",
244 InferenceTools=[bucket_tool],
245 )
246 )
247 if use_filtered_buckets_for_dv_graph:
248 tool_kwargs.setdefault("SpacePointKeys", [filtered_bucket_key])
249 tool_kwargs.setdefault("UseBucketSegmentSelection", True)
250
251 if "InferenceTool" not in kwargs:
252 kwargs["InferenceTool"] = result.popToolsAndMerge(
253 DisplacedVertexInferenceToolCfg(flags, **tool_kwargs)
254 )
255
256 if alg_output_level is not None:
257 kwargs["OutputLevel"] = alg_output_level
258
259 alg = CompFactory.MuonML.DVInferenceAlg(name=name, **kwargs)
260 result.addEventAlgo(alg, primary=True)
261 return result