201def DisplacedVertexInferenceAlgCfg(flags, name="DisplacedVertexInferenceAlg", **kwargs):
202 """Configure a runnable event-level DisplacedVertex inference algorithm."""
203 result = ComponentAccumulator()
204 do_calo_tower_build = kwargs.pop("DoCaloTowerBuild", True)
205 do_ml_bucket_filter = kwargs.pop("DoMLBucketFilter", True)
206 bucket_model_path = kwargs.pop("BucketModelPath", None)
207 bucket_threshold = kwargs.pop("BucketThreshold", None)
208 filtered_bucket_key = kwargs.pop("FilteredBucketKey", "FilteredMlBuckets")
209 use_filtered_buckets_for_dv_graph = kwargs.pop("UseFilteredBucketsForDVGraph", False)
210 alg_output_level = kwargs.get("OutputLevel", None)
211 tool_kwargs = {}
212 for key in (
213 "ModelPath",
214 "InputNodeName",
215 "InputEdgeIndexName",
216 "InputEdgeAttrName",
217 "InputNMuonNodesName",
218 "OutputName",
219 "SingleOutputMode",
220 "SegmentKey",
221 "SpacePointKeys",
222 "UseBucketSegmentSelection",
223 "TowerContainerKey",
224 "MinTowerEnergyMeV",
225 "MaxTowerSegmentDR",
226 "CaloRMaxMm",
227 "CaloZMaxMm",
228 "SectorModulo",
229 "RequireEdges",
230 "MaxEdges",
231 "FallbackToAllSegments",
232 "DebugDumpFirstNNodes",
233 "DebugDumpFirstNEdges",
234 "SpacePointKeys",
235 "UseBucketSegmentSelection",
236 "OutputLevel",
237 ):
238 if key in kwargs:
239 tool_kwargs[key] = kwargs.pop(key)
240
241 if isinstance(kwargs.get("InferenceTool"), dict):
242 tool_kwargs.update(kwargs.pop("InferenceTool"))
243
244 tower_key = tool_kwargs.get("TowerContainerKey", "CombinedTower")
245 if do_calo_tower_build and tower_key:
246 result.merge(DisplacedVertexCaloTowerCfg(flags))
247
248 if do_ml_bucket_filter:
249 bucket_filter_kwargs = {
250 "WriteSpacePointKey": filtered_bucket_key,
251 "ReadSpacePoints": "MuonSpacePoints",
252 }
253 if bucket_model_path is not None:
254 bucket_filter_kwargs["ModelPath"] = bucket_model_path
255 if bucket_threshold is not None:
256 bucket_filter_kwargs["ScoreThreshold"] = bucket_threshold
257 bucket_tool = result.popToolsAndMerge(
258 GraphBucketFilterToolCfg(flags, **bucket_filter_kwargs)
259 )
260 result.merge(
261 GraphInferenceAlgCfg(
262 flags,
263 name="DVBucketPrefilterAlg",
264 InferenceTools=[bucket_tool],
265 )
266 )
267 if use_filtered_buckets_for_dv_graph:
268 tool_kwargs.setdefault("SpacePointKeys", [filtered_bucket_key])
269 tool_kwargs.setdefault("UseBucketSegmentSelection", True)
270
271 if "InferenceTool" not in kwargs:
272 kwargs["InferenceTool"] = result.popToolsAndMerge(
273 DisplacedVertexInferenceToolCfg(flags, **tool_kwargs)
274 )
275
276 if alg_output_level is not None:
277 kwargs["OutputLevel"] = alg_output_level
278
279 kwargs.setdefault("ScoreDecoration", "EventInfo.dv_score")
280 kwargs.setdefault("RawOutputDecoration", "EventInfo.dv_rawOutput")
281 kwargs.setdefault("PassDecoration", "EventInfo.dv_pass")
282 kwargs.setdefault("NNodesDecoration", "EventInfo.dv_nNodes")
283 kwargs.setdefault("NEdgesDecoration", "EventInfo.dv_nEdges")
284 alg = CompFactory.MuonML.DVInferenceAlg(name=name, **kwargs)
285 result.addEventAlgo(alg, primary=True)
286 return result