383def CaloTopoClusterCfg(flags, cellsname="AllCalo", clustersname=None, clustersnapname="CaloTopoClusters"):
384 """
385 Configures topo clustering
386
387 If output writing is enabled (ESD,AOD) the topo clusters are added to them
388 """
389 doLCCalib = flags.Calo.TopoCluster.doTopoClusterLocalCalib
390 if clustersname is None:
391 clustersname = "CaloCalTopoClusters" if doLCCalib else "CaloTopoClusters"
392
393
394 if clustersname=="CaloTopoClusters" and doLCCalib is True:
395 raise RuntimeError("Inconsistent arguments: Name must not be 'CaloTopoClusters' if doLCCalib is True")
396
397 result=ComponentAccumulator()
398
399 from LArGeoAlgsNV.LArGMConfig import LArGMCfg
400 from TileGeoModel.TileGMConfig import TileGMCfg
401 from CaloTools.CaloNoiseCondAlgConfig import CaloNoiseCondAlgCfg
402
403 result.merge(CaloNoiseCondAlgCfg(flags,"totalNoise"))
404
405 result.merge(CaloNoiseCondAlgCfg(flags,"electronicNoise"))
406
407 CaloClusterMaker, CaloClusterSnapshot=CompFactory.getComps("CaloClusterMaker","CaloClusterSnapshot",)
408
409 result.merge(LArGMCfg(flags))
410
411 result.merge(TileGMCfg(flags))
412
413 TopoMaker = result.popToolsAndMerge( CaloTopoClusterToolCfg(flags, cellsname=cellsname))
414 TopoSplitter = result.popToolsAndMerge( CaloTopoClusterSplitterToolCfg(flags) )
415
416
417
418
419
420
421
422
424 CaloTopoCluster.ClustersOutputName=clustersname
425
426 CaloTopoCluster.ClusterMakerTools = [TopoMaker, TopoSplitter]
427
428 from CaloBadChannelTool.CaloBadChanToolConfig import CaloBadChanToolCfg
429 caloBadChanTool = result.popToolsAndMerge( CaloBadChanToolCfg(flags) )
430 CaloClusterBadChannelList=CompFactory.CaloClusterBadChannelList
432 CaloTopoCluster.ClusterCorrectionTools += [BadChannelListCorr]
433
434 momentsMaker=result.popToolsAndMerge(getTopoMoments(flags))
435 CaloTopoCluster.ClusterCorrectionTools += [momentsMaker]
436
437
438 if flags.Calo.TopoCluster.doCalibHitMoments:
439 calibHitsMomentsMaker=getTopoCalibMoments(flags)
440 CaloTopoCluster.ClusterCorrectionTools += [calibHitsMomentsMaker]
441 if clustersname == "CaloTopoClusters":
443 caloCalibDecorator = CaloCalibHitDecoratorTool(flags)
444 caloCalibDecoratorFullEnergy = CaloCalibHitDecoratorFullEnergyTool(flags)
445 caloCalibDecoratorOOC = CaloCalibHitDecoratorToolOOC(flags)
446 CaloTopoCluster.ClusterCorrectionTools += [caloCalibTruthMapMaker, caloCalibDecorator, caloCalibDecoratorFullEnergy,caloCalibDecoratorOOC]
447
448
449
450 if doLCCalib:
451 theCaloClusterSnapshot=
CaloClusterSnapshot(OutputName=clustersnapname,SetCrossLinks=
True,FinalClusterContainerName=clustersname)
452 CaloTopoCluster.ClusterCorrectionTools += [theCaloClusterSnapshot]
453
454 CaloTopoCluster.ClusterCorrectionTools += getTopoClusterLocalCalibTools(flags)
455
456 from CaloRec.CaloTopoClusterConfig import caloTopoCoolFolderCfg
457 result.merge(caloTopoCoolFolderCfg(flags))
458
459
460 result.addEventAlgo(CaloTopoCluster,primary=True)
461
462 if CaloTopoCluster.ClustersOutputName in flags.Calo.TopoCluster.skipWriteList:
463
464 return result
465
466
467
468 AODMoments=[ "SECOND_R"
469 ,"SECOND_LAMBDA"
470 ,"CENTER_MAG"
471 ,"CENTER_LAMBDA"
472 ,"FIRST_ENG_DENS"
473 ,"ENG_FRAC_MAX"
474 ,"ISOLATION"
475 ,"ENG_BAD_CELLS"
476 ,"N_BAD_CELLS"
477 ,"BADLARQ_FRAC"
478 ,"ENG_POS"
479 ,"SIGNIFICANCE"
480 ,"AVG_LAR_Q"
481 ,"AVG_TILE_Q"
482 ,"EM_PROBABILITY"
483 ,"BadChannelList"
484 ,"SECOND_TIME"
485 ,"NCELL_SAMPLING"]
486
487 if flags.Calo.TopoCluster.writeExtendedClusterMoments:
488 AODMoments += ["LATERAL"
489 ,"LONGITUDINAL"
490 ,"CELL_SIGNIFICANCE"
491 ,"PTD"
492 ,"MASS"]
493
494 if flags.Reco.EnableHI:
495 AODMoments += ["CELL_SIG_SAMPLING"]
496
497 if flags.Calo.TopoCluster.writeCalibHitClusterMoments:
498 AODMoments += ["ENG_CALIB_TOT"
499 ,"ENG_CALIB_OUT_L"
500 ,"ENG_CALIB_OUT_T"
501 ,"ENG_CALIB_EMB0"
502 ,"ENG_CALIB_EME0"
503 ,"ENG_CALIB_TILEG3"
504 ,"ENG_CALIB_DEAD_TOT"
505 ,"ENG_CALIB_DEAD_EMB0"
506 ,"ENG_CALIB_DEAD_TILE0"
507 ,"ENG_CALIB_DEAD_TILEG3"
508 ,"ENG_CALIB_DEAD_EME0"
509 ,"ENG_CALIB_DEAD_HEC0"
510 ,"ENG_CALIB_DEAD_FCAL"
511 ,"ENG_CALIB_DEAD_LEAKAGE"
512 ,"ENG_CALIB_DEAD_UNCLASS"
513 ,"ENG_CALIB_FRAC_EM"
514 ,"ENG_CALIB_FRAC_HAD"
515 ,"ENG_CALIB_FRAC_REST"]
516
517
518 from OutputStreamAthenaPool.OutputStreamConfig import addToAOD, addToESD
519 toESD = [f"xAOD::CaloClusterContainer#{CaloTopoCluster.ClustersOutputName}",
520 f"xAOD::CaloClusterAuxContainer#{CaloTopoCluster.ClustersOutputName}Aux.-sigmaWidth",
521 f"CaloClusterCellLinkContainer#{CaloTopoCluster.ClustersOutputName}_links"]
522 toAOD = [f"xAOD::CaloClusterContainer#{CaloTopoCluster.ClustersOutputName}",
523 f"CaloClusterCellLinkContainer#{CaloTopoCluster.ClustersOutputName}_links"]
524
525 AODMoments.append("CellLink")
526 if flags.Calo.TopoCluster.addCalibrationHitDecoration:
527 AODMoments.append(flags.Calo.TopoCluster.CalibrationHitDecorationName)
528
529 if flags.Calo.TopoCluster.addCPData:
530 AODMoments += ["ClusterWidthEta","ClusterWidthPhi"]
531
532 auxItems = f"xAOD::CaloClusterAuxContainer#{CaloTopoCluster.ClustersOutputName}Aux."
533 auxItems+= ".".join(AODMoments)
534
535 toAOD.append(auxItems)
536
537 result.merge(addToESD(flags, toESD))
538 result.merge(addToAOD(flags, toAOD))
539
540 return result
541
Top algorithm to reconstruct CaloCluster objects from CaloCell objects.