318def CaloTopoClusterCfg(flags, cellsname="AllCalo", clustersname=None, clustersnapname="CaloTopoClusters"):
319 """
320 Configures topo clustering
321
322 If output writing is enabled (ESD,AOD) the topo clusters are added to them
323 """
324
325 doLCCalib = flags.Calo.TopoCluster.doTopoClusterLocalCalib
326
327 if clustersname is None:
328 clustersname = "CaloCalTopoClusters" if doLCCalib else "CaloTopoClusters"
329
330
331 if clustersname=="CaloTopoClusters" and doLCCalib is True:
332 raise RuntimeError("Inconsistent arguments: Name must not be 'CaloTopoClusters' if doLCCalib is True")
333
334 result=ComponentAccumulator()
335
336 from LArGeoAlgsNV.LArGMConfig import LArGMCfg
337 from TileGeoModel.TileGMConfig import TileGMCfg
338 from CaloTools.CaloNoiseCondAlgConfig import CaloNoiseCondAlgCfg
339
340 result.merge(CaloNoiseCondAlgCfg(flags,"totalNoise"))
341
342 result.merge(CaloNoiseCondAlgCfg(flags,"electronicNoise"))
343
344 CaloClusterMaker, CaloClusterSnapshot=CompFactory.getComps("CaloClusterMaker","CaloClusterSnapshot",)
345
346 result.merge(LArGMCfg(flags))
347
348 result.merge(TileGMCfg(flags))
349
350 TopoMaker = result.popToolsAndMerge( CaloTopoClusterToolCfg(flags, cellsname=cellsname))
351 TopoSplitter = result.popToolsAndMerge( CaloTopoClusterSplitterToolCfg(flags) )
352
353
354
355
356
357
358
359
361 CaloTopoCluster.ClustersOutputName=clustersname
362
363 CaloTopoCluster.ClusterMakerTools = [TopoMaker, TopoSplitter]
364
365 from CaloBadChannelTool.CaloBadChanToolConfig import CaloBadChanToolCfg
366 caloBadChanTool = result.popToolsAndMerge( CaloBadChanToolCfg(flags) )
367 CaloClusterBadChannelList=CompFactory.CaloClusterBadChannelList
369 CaloTopoCluster.ClusterCorrectionTools += [BadChannelListCorr]
370
371 momentsMaker=result.popToolsAndMerge(getTopoMoments(flags))
372 CaloTopoCluster.ClusterCorrectionTools += [momentsMaker]
373
374 if flags.Calo.TopoCluster.doCalibHitMoments:
375 calibHitsMomentsMaker=getTopoCalibMoments(flags)
376 CaloTopoCluster.ClusterCorrectionTools += [calibHitsMomentsMaker]
377
378 if doLCCalib:
379 theCaloClusterSnapshot=
CaloClusterSnapshot(OutputName=clustersnapname,SetCrossLinks=
True,FinalClusterContainerName=clustersname)
380 CaloTopoCluster.ClusterCorrectionTools += [theCaloClusterSnapshot]
381
382 CaloTopoCluster.ClusterCorrectionTools += getTopoClusterLocalCalibTools(flags)
383
384 from CaloRec.CaloTopoClusterConfig import caloTopoCoolFolderCfg
385 result.merge(caloTopoCoolFolderCfg(flags))
386
387
388 result.addEventAlgo(CaloTopoCluster,primary=True)
389
390 if CaloTopoCluster.ClustersOutputName in flags.Calo.TopoCluster.skipWriteList:
391
392 return result
393
394
395
396 AODMoments=[ "SECOND_R"
397 ,"SECOND_LAMBDA"
398 ,"CENTER_MAG"
399 ,"CENTER_LAMBDA"
400 ,"FIRST_ENG_DENS"
401 ,"ENG_FRAC_MAX"
402 ,"ISOLATION"
403 ,"ENG_BAD_CELLS"
404 ,"N_BAD_CELLS"
405 ,"BADLARQ_FRAC"
406 ,"ENG_POS"
407 ,"SIGNIFICANCE"
408 ,"AVG_LAR_Q"
409 ,"AVG_TILE_Q"
410 ,"EM_PROBABILITY"
411 ,"BadChannelList"
412 ,"SECOND_TIME"
413 ,"NCELL_SAMPLING"]
414
415 if flags.Calo.TopoCluster.writeExtendedClusterMoments:
416 AODMoments += ["LATERAL"
417 ,"LONGITUDINAL"
418 ,"CELL_SIGNIFICANCE"
419 ,"PTD"
420 ,"MASS"]
421
422 if flags.Reco.EnableHI:
423 AODMoments += ["CELL_SIG_SAMPLING"]
424
425 if flags.Calo.TopoCluster.writeCalibHitClusterMoments:
426 AODMoments += ["ENG_CALIB_TOT"
427 ,"ENG_CALIB_OUT_L"
428 ,"ENG_CALIB_OUT_T"
429 ,"ENG_CALIB_EMB0"
430 ,"ENG_CALIB_EME0"
431 ,"ENG_CALIB_TILEG3"
432 ,"ENG_CALIB_DEAD_TOT"
433 ,"ENG_CALIB_DEAD_EMB0"
434 ,"ENG_CALIB_DEAD_TILE0"
435 ,"ENG_CALIB_DEAD_TILEG3"
436 ,"ENG_CALIB_DEAD_EME0"
437 ,"ENG_CALIB_DEAD_HEC0"
438 ,"ENG_CALIB_DEAD_FCAL"
439 ,"ENG_CALIB_DEAD_LEAKAGE"
440 ,"ENG_CALIB_DEAD_UNCLASS"
441 ,"ENG_CALIB_FRAC_EM"
442 ,"ENG_CALIB_FRAC_HAD"
443 ,"ENG_CALIB_FRAC_REST"]
444
445
446 from OutputStreamAthenaPool.OutputStreamConfig import addToAOD, addToESD
447 toESD = [f"xAOD::CaloClusterContainer#{CaloTopoCluster.ClustersOutputName}",
448 f"xAOD::CaloClusterAuxContainer#{CaloTopoCluster.ClustersOutputName}Aux.-sigmaWidth",
449 f"CaloClusterCellLinkContainer#{CaloTopoCluster.ClustersOutputName}_links"]
450 toAOD = [f"xAOD::CaloClusterContainer#{CaloTopoCluster.ClustersOutputName}",
451 f"CaloClusterCellLinkContainer#{CaloTopoCluster.ClustersOutputName}_links"]
452
453 AODMoments.append("CellLink")
454 if flags.Calo.TopoCluster.addCalibrationHitDecoration:
455 AODMoments.append(flags.Calo.TopoCluster.CalibrationHitDecorationName)
456
457 if flags.Calo.TopoCluster.addCPData:
458 AODMoments += ["ClusterWidthEta","ClusterWidthPhi"]
459
460 auxItems = f"xAOD::CaloClusterAuxContainer#{CaloTopoCluster.ClustersOutputName}Aux."
461 auxItems+= ".".join(AODMoments)
462
463 toAOD.append(auxItems)
464
465 result.merge(addToESD(flags, toESD))
466 result.merge(addToAOD(flags, toAOD))
467
468 return result
469
Top algorithm to reconstruct CaloCluster objects from CaloCell objects.