414 ):
415 """
416 Configures topo clustering
417
418 If output writing is enabled (ESD,AOD) the topo clusters are added to them
419 """
420 doLCCalib = flags.Calo.TopoCluster.doTopoClusterLocalCalib
421 if clustersname is None:
422 clustersname = "CaloCalTopoClusters" if doLCCalib else "CaloTopoClusters"
423
424
425 if clustersname=="CaloTopoClusters" and doLCCalib is True:
426 raise RuntimeError("Inconsistent arguments: Name must not be 'CaloTopoClusters' if doLCCalib is True")
427
428 result=ComponentAccumulator()
429
430 from LArGeoAlgsNV.LArGMConfig import LArGMCfg
431 from TileGeoModel.TileGMConfig import TileGMCfg
432 from CaloTools.CaloNoiseCondAlgConfig import CaloNoiseCondAlgCfg
433
434 result.merge(CaloNoiseCondAlgCfg(flags,"totalNoise"))
435
436 result.merge(CaloNoiseCondAlgCfg(flags,"electronicNoise"))
437
438 CaloClusterMaker, CaloClusterSnapshot=CompFactory.getComps("CaloClusterMaker","CaloClusterSnapshot",)
439
440 result.merge(LArGMCfg(flags))
441
442 result.merge(TileGMCfg(flags))
443
444 TopoMaker = result.popToolsAndMerge( CaloTopoClusterToolCfg(flags, cellsname=cellsname, cellthresholds=cellthresholds))
445 TopoSplitter = result.popToolsAndMerge( CaloTopoClusterSplitterToolCfg(flags) )
446
447
448
449
450
451
452
453
455 CaloTopoCluster.ClustersOutputName=clustersname
456
457 CaloTopoCluster.ClusterMakerTools = [TopoMaker, TopoSplitter]
458
459 from CaloBadChannelTool.CaloBadChanToolConfig import CaloBadChanToolCfg
460 caloBadChanTool = result.popToolsAndMerge( CaloBadChanToolCfg(flags) )
461 CaloClusterBadChannelList=CompFactory.CaloClusterBadChannelList
463 CaloTopoCluster.ClusterCorrectionTools += [BadChannelListCorr]
464
465 momentsMaker=result.popToolsAndMerge(getTopoMoments(flags))
466 CaloTopoCluster.ClusterCorrectionTools += [momentsMaker]
467
468
469 if flags.Calo.TopoCluster.doCalibHitMoments:
470 calibHitsMomentsMaker=getTopoCalibMoments(flags)
471 CaloTopoCluster.ClusterCorrectionTools += [calibHitsMomentsMaker]
473 caloCalibDecorator = CaloCalibHitDecoratorTool(flags)
474 caloCalibDecorator.CaloClusterWriteDecorHandleKey_NLeadingTruthParticles = (
475 clustersname + "." + flags.Calo.TopoCluster.CalibrationHitDecorationName + "_Visible"
476 )
477 caloCalibDecoratorFullEnergy = CaloCalibHitDecoratorFullEnergyTool(flags)
478 caloCalibDecoratorFullEnergy.CaloClusterWriteDecorHandleKey_NLeadingTruthParticles = (
479 clustersname + "." + flags.Calo.TopoCluster.CalibrationHitDecorationName + "_Full"
480 )
481 caloCalibDecoratorOOC = CaloCalibHitDecoratorToolOOC(flags)
482 caloCalibDecoratorOOC.CaloClusterWriteDecorHandleKey_NLeadingTruthParticlesL = (
483 clustersname + "." + flags.Calo.TopoCluster.CalibrationHitDecorationName + "_OOC_L"
484 )
485 caloCalibDecoratorOOC.CaloClusterWriteDecorHandleKey_NLeadingTruthParticlesT = (
486 clustersname + "." + flags.Calo.TopoCluster.CalibrationHitDecorationName + "_OOC_T"
487 )
488
489 caloCalibDecoratorDM = CaloCalibHitDecoratorToolDM(flags)
490 caloCalibDecoratorDM.CaloClusterWriteDecorHandleKey_NLeadingTruthParticlesDM = (
491 clustersname + "." + flags.Calo.TopoCluster.CalibrationHitDecorationName + "_DM"
492 )
493
494 CaloTopoCluster.ClusterCorrectionTools += [
495 caloCalibTruthMapMaker,
496 caloCalibDecorator,
497 caloCalibDecoratorFullEnergy,
498 caloCalibDecoratorOOC,
499 caloCalibDecoratorDM,
500 ]
501
502
503
504 if doLCCalib:
505 theCaloClusterSnapshot=
CaloClusterSnapshot(OutputName=clustersnapname,SetCrossLinks=
True,FinalClusterContainerName=clustersname)
506 CaloTopoCluster.ClusterCorrectionTools += [theCaloClusterSnapshot]
507
508 CaloTopoCluster.ClusterCorrectionTools += getTopoClusterLocalCalibTools(flags)
509
510 from CaloRec.CaloTopoClusterConfig import caloTopoCoolFolderCfg
511 result.merge(caloTopoCoolFolderCfg(flags))
512
513
514 result.addEventAlgo(CaloTopoCluster,primary=True)
515
516 if CaloTopoCluster.ClustersOutputName in flags.Calo.TopoCluster.skipWriteList:
517
518 return result
519
520
521
522 AODMoments=[ "SECOND_R"
523 ,"SECOND_LAMBDA"
524 ,"CENTER_MAG"
525 ,"CENTER_LAMBDA"
526 ,"FIRST_ENG_DENS"
527 ,"ENG_FRAC_MAX"
528 ,"ISOLATION"
529 ,"ENG_BAD_CELLS"
530 ,"N_BAD_CELLS"
531 ,"BADLARQ_FRAC"
532 ,"ENG_POS"
533 ,"SIGNIFICANCE"
534 ,"AVG_LAR_Q"
535 ,"AVG_TILE_Q"
536 ,"EM_PROBABILITY"
537 ,"BadChannelList"
538 ,"SECOND_TIME"
539 ,"NCELL_SAMPLING"]
540
541 if flags.Calo.TopoCluster.writeExtendedClusterMoments:
542 AODMoments += ["LATERAL"
543 ,"LONGITUDINAL"
544 ,"CELL_SIGNIFICANCE"
545 ,"PTD"
546 ,"MASS"]
547
548 if flags.Reco.EnableHI:
549 AODMoments += ["CELL_SIG_SAMPLING"]
550
551 if flags.Calo.TopoCluster.writeCalibHitClusterMoments:
552 AODMoments += ["ENG_CALIB_TOT"
553 ,"ENG_CALIB_OUT_L"
554 ,"ENG_CALIB_OUT_T"
555 ,"ENG_CALIB_EMB0"
556 ,"ENG_CALIB_EME0"
557 ,"ENG_CALIB_TILEG3"
558 ,"ENG_CALIB_DEAD_TOT"
559 ,"ENG_CALIB_DEAD_EMB0"
560 ,"ENG_CALIB_DEAD_TILE0"
561 ,"ENG_CALIB_DEAD_TILEG3"
562 ,"ENG_CALIB_DEAD_EME0"
563 ,"ENG_CALIB_DEAD_HEC0"
564 ,"ENG_CALIB_DEAD_FCAL"
565 ,"ENG_CALIB_DEAD_LEAKAGE"
566 ,"ENG_CALIB_DEAD_UNCLASS"
567 ,"ENG_CALIB_FRAC_EM"
568 ,"ENG_CALIB_FRAC_HAD"
569 ,"ENG_CALIB_FRAC_REST"]
570
571
572 from OutputStreamAthenaPool.OutputStreamConfig import addToAOD, addToESD
573 toESD = [f"xAOD::CaloClusterContainer#{CaloTopoCluster.ClustersOutputName}",
574 f"xAOD::CaloClusterAuxContainer#{CaloTopoCluster.ClustersOutputName}Aux.-sigmaWidth",
575 f"CaloClusterCellLinkContainer#{CaloTopoCluster.ClustersOutputName}_links"]
576 toAOD = [f"xAOD::CaloClusterContainer#{CaloTopoCluster.ClustersOutputName}",
577 f"CaloClusterCellLinkContainer#{CaloTopoCluster.ClustersOutputName}_links"]
578
579 AODMoments.append("CellLink")
580 if flags.Calo.TopoCluster.addCalibrationHitDecoration:
581 AODMoments += [
582 flags.Calo.TopoCluster.CalibrationHitDecorationName + "_Visible",
583 flags.Calo.TopoCluster.CalibrationHitDecorationName + "_Full",
584 flags.Calo.TopoCluster.CalibrationHitDecorationName + "_OOC_L",
585 flags.Calo.TopoCluster.CalibrationHitDecorationName + "_OOC_T",
586 flags.Calo.TopoCluster.CalibrationHitDecorationName + "_DM",
587 ]
588
589 if flags.Calo.TopoCluster.addCPData:
590 AODMoments += ["ClusterWidthEta","ClusterWidthPhi"]
591
592 auxItems = f"xAOD::CaloClusterAuxContainer#{CaloTopoCluster.ClustersOutputName}Aux."
593 auxItems+= ".".join(AODMoments)
594
595 toAOD.append(auxItems)
596
597 result.merge(addToESD(flags, toESD))
598 result.merge(addToAOD(flags, toAOD))
599
600 return result
601
Top algorithm to reconstruct CaloCluster objects from CaloCell objects.