429 ):
430 """
431 Configures topo clustering
432
433 If output writing is enabled (ESD,AOD) the topo clusters are added to them
434 """
435 doLCCalib = flags.Calo.TopoCluster.doTopoClusterLocalCalib
436 if clustersname is None:
437 clustersname = "CaloCalTopoClusters" if doLCCalib else "CaloTopoClusters"
438
439
440 if clustersname=="CaloTopoClusters" and doLCCalib is True:
441 raise RuntimeError("Inconsistent arguments: Name must not be 'CaloTopoClusters' if doLCCalib is True")
442
443 clustersname_final = clustersname
444 if flags.Calo.TopoCluster.applyClusterTimingCut:
445 clustersname = f"{clustersname}BeforeTimingCut"
446
447 result=ComponentAccumulator()
448
449 from LArGeoAlgsNV.LArGMConfig import LArGMCfg
450 from TileGeoModel.TileGMConfig import TileGMCfg
451 from CaloTools.CaloNoiseCondAlgConfig import CaloNoiseCondAlgCfg
452
453 result.merge(CaloNoiseCondAlgCfg(flags,"totalNoise"))
454
455 result.merge(CaloNoiseCondAlgCfg(flags,"electronicNoise"))
456
457 CaloClusterMaker, CaloClusterSnapshot=CompFactory.getComps("CaloClusterMaker","CaloClusterSnapshot",)
458
459 result.merge(LArGMCfg(flags))
460
461 result.merge(TileGMCfg(flags))
462
463 TopoMaker = result.popToolsAndMerge( CaloTopoClusterToolCfg(flags, cellsname=cellsname, cellthresholds=cellthresholds))
464 TopoSplitter = result.popToolsAndMerge( CaloTopoClusterSplitterToolCfg(flags) )
465
466
467
468
469
470
471
472
474 CaloTopoCluster.ClustersOutputName=clustersname
475
476 CaloTopoCluster.ClusterMakerTools = [TopoMaker, TopoSplitter]
477
478 from CaloBadChannelTool.CaloBadChanToolConfig import CaloBadChanToolCfg
479 caloBadChanTool = result.popToolsAndMerge( CaloBadChanToolCfg(flags) )
480 CaloClusterBadChannelList=CompFactory.CaloClusterBadChannelList
482 CaloTopoCluster.ClusterCorrectionTools += [BadChannelListCorr]
483
484 momentsMaker=result.popToolsAndMerge(getTopoMoments(flags))
485 CaloTopoCluster.ClusterCorrectionTools += [momentsMaker]
486
487
488 if flags.Calo.TopoCluster.doCalibHitMoments:
489 calibHitsMomentsMaker=getTopoCalibMoments(flags)
490 CaloTopoCluster.ClusterCorrectionTools += [calibHitsMomentsMaker]
492 caloCalibDecorator = CaloCalibHitDecoratorTool(flags)
493 caloCalibDecorator.CaloClusterWriteDecorHandleKey_NLeadingTruthParticles = (
494 clustersname + "." + flags.Calo.TopoCluster.CalibrationHitDecorationName + "_Visible"
495 )
496 caloCalibDecoratorFullEnergy = CaloCalibHitDecoratorFullEnergyTool(flags)
497 caloCalibDecoratorFullEnergy.CaloClusterWriteDecorHandleKey_NLeadingTruthParticles = (
498 clustersname + "." + flags.Calo.TopoCluster.CalibrationHitDecorationName + "_Full"
499 )
500 caloCalibDecoratorOOC = CaloCalibHitDecoratorToolOOC(flags)
501 caloCalibDecoratorOOC.CaloClusterWriteDecorHandleKey_NLeadingTruthParticlesL = (
502 clustersname + "." + flags.Calo.TopoCluster.CalibrationHitDecorationName + "_OOC_L"
503 )
504 caloCalibDecoratorOOC.CaloClusterWriteDecorHandleKey_NLeadingTruthParticlesT = (
505 clustersname + "." + flags.Calo.TopoCluster.CalibrationHitDecorationName + "_OOC_T"
506 )
507
508 caloCalibDecoratorDM = CaloCalibHitDecoratorToolDM(flags)
509 caloCalibDecoratorDM.CaloClusterWriteDecorHandleKey_NLeadingTruthParticlesDM = (
510 clustersname + "." + flags.Calo.TopoCluster.CalibrationHitDecorationName + "_DM"
511 )
512
513 CaloTopoCluster.ClusterCorrectionTools += [
514 caloCalibTruthMapMaker,
515 caloCalibDecorator,
516 caloCalibDecoratorFullEnergy,
517 caloCalibDecoratorOOC,
518 caloCalibDecoratorDM,
519 ]
520
521 if flags.Calo.TopoCluster.doDigiHSTruthMoments:
522 truthMomentMaker=getTopoTruthMoments(flags)
523 CaloTopoCluster.ClusterCorrectionTools += [truthMomentMaker]
524
525 if doLCCalib:
526 theCaloClusterSnapshot=
CaloClusterSnapshot(OutputName=clustersnapname,SetCrossLinks=
True,FinalClusterContainerName=clustersname)
527 CaloTopoCluster.ClusterCorrectionTools += [theCaloClusterSnapshot]
528
529 CaloTopoCluster.ClusterCorrectionTools += getTopoClusterLocalCalibTools(flags)
530
531 from CaloRec.CaloTopoClusterConfig import caloTopoCoolFolderCfg
532 result.merge(caloTopoCoolFolderCfg(flags))
533
534
535 result.addEventAlgo(CaloTopoCluster,primary=True)
536
537 if flags.Calo.TopoCluster.applyClusterTimingCut:
538 result.merge(CaloClusterTimingFilterCfg(
539 flags,
540 name = f"{clustersname}Filter",
541 InputClusters = clustersname,
542 OutputClusters = clustersname_final,
543 ))
544
545 if clustersname_final in flags.Calo.TopoCluster.skipWriteList:
546
547 return result
548
549
550
551 AODMoments=[ "SECOND_R"
552 ,"SECOND_LAMBDA"
553 ,"CENTER_MAG"
554 ,"CENTER_LAMBDA"
555 ,"FIRST_ENG_DENS"
556 ,"ENG_FRAC_MAX"
557 ,"ISOLATION"
558 ,"ENG_BAD_CELLS"
559 ,"N_BAD_CELLS"
560 ,"BADLARQ_FRAC"
561 ,"ENG_POS"
562 ,"SIGNIFICANCE"
563 ,"AVG_LAR_Q"
564 ,"AVG_TILE_Q"
565 ,"EM_PROBABILITY"
566 ,"BadChannelList"
567 ,"SECOND_TIME"
568 ,"NCELL_SAMPLING"]
569
570 if flags.Calo.TopoCluster.writeExtendedClusterMoments:
571 AODMoments += ["LATERAL"
572 ,"LONGITUDINAL"
573 ,"CELL_SIGNIFICANCE"
574 ,"PTD"
575 ,"MASS"]
576
577 if flags.Reco.EnableHI:
578 AODMoments += ["CELL_SIG_SAMPLING"]
579
580 if flags.Calo.TopoCluster.writeCalibHitClusterMoments:
581 AODMoments += ["ENG_CALIB_TOT"
582 ,"ENG_CALIB_OUT_L"
583 ,"ENG_CALIB_OUT_T"
584 ,"ENG_CALIB_EMB0"
585 ,"ENG_CALIB_EME0"
586 ,"ENG_CALIB_TILEG3"
587 ,"ENG_CALIB_DEAD_TOT"
588 ,"ENG_CALIB_DEAD_EMB0"
589 ,"ENG_CALIB_DEAD_TILE0"
590 ,"ENG_CALIB_DEAD_TILEG3"
591 ,"ENG_CALIB_DEAD_EME0"
592 ,"ENG_CALIB_DEAD_HEC0"
593 ,"ENG_CALIB_DEAD_FCAL"
594 ,"ENG_CALIB_DEAD_LEAKAGE"
595 ,"ENG_CALIB_DEAD_UNCLASS"
596 ,"ENG_CALIB_FRAC_EM"
597 ,"ENG_CALIB_FRAC_HAD"
598 ,"ENG_CALIB_FRAC_REST"]
599
600 if flags.Calo.TopoCluster.writeDigiHSTruthMoments:
601 AODMoments += ["FIRST_PHI_DigiHSTruth"
602 ,"FIRST_ETA_DigiHSTruth"
603 ,"SECOND_R_DigiHSTruth"
604 ,"SECOND_LAMBDA_DigiHSTruth"
605 ,"DELTA_PHI_DigiHSTruth"
606 ,"DELTA_THETA_DigiHSTruth"
607 ,"DELTA_ALPHA_DigiHSTruth"
608 ,"CENTER_X_DigiHSTruth"
609 ,"CENTER_Y_DigiHSTruth"
610 ,"CENTER_Z_DigiHSTruth"
611 ,"CENTER_MAG_DigiHSTruth"
612 ,"CENTER_LAMBDA_DigiHSTruth"
613 ,"LATERAL_DigiHSTruth"
614 ,"LONGITUDINAL_DigiHSTruth"
615 ,"ENG_FRAC_CORE_DigiHSTruth"
616 ,"FIRST_ENG_DENS_DigiHSTruth"
617 ,"SECOND_ENG_DENS_DigiHSTruth"
618 ,"ISOLATION_DigiHSTruth"
619 ,"BAD_CELLS_CORR_E_DigiHSTruth"
620 ,"ENG_POS_DigiHSTruth"
621 ,"SIGNIFICANCE_DigiHSTruth"
622 ,"CELL_SIGNIFICANCE_DigiHSTruth"
623 ,"CELL_SIG_SAMPLING_DigiHSTruth"
624 ,"AVG_LAR_Q_DigiHSTruth"
625 ,"AVG_TILE_Q_DigiHSTruth"
626 ,"PTD_DigiHSTruth"
627 ,"MASS_DigiHSTruth"
628 ,"SECOND_TIME_DigiHSTruth"
629 ,"ENERGY_DigiHSTruth"
630 ,"PHI_DigiHSTruth"
631 ,"ETA_DigiHSTruth"]
632
633
634 from OutputStreamAthenaPool.OutputStreamConfig import addToAOD, addToESD
635 toESD = [f"xAOD::CaloClusterContainer#{clustersname_final}",
636 f"xAOD::CaloClusterAuxContainer#{clustersname_final}Aux.-sigmaWidth",
637 f"CaloClusterCellLinkContainer#{clustersname_final}_links"]
638 toAOD = [f"xAOD::CaloClusterContainer#{clustersname_final}",
639 f"CaloClusterCellLinkContainer#{clustersname_final}_links"]
640
641 AODMoments.append("CellLink")
642 if flags.Calo.TopoCluster.addCalibrationHitDecoration:
643 AODMoments += [
644 flags.Calo.TopoCluster.CalibrationHitDecorationName + "_Visible",
645 flags.Calo.TopoCluster.CalibrationHitDecorationName + "_Full",
646 flags.Calo.TopoCluster.CalibrationHitDecorationName + "_OOC_L",
647 flags.Calo.TopoCluster.CalibrationHitDecorationName + "_OOC_T",
648 flags.Calo.TopoCluster.CalibrationHitDecorationName + "_DM",
649 ]
650
651 if flags.Calo.TopoCluster.addCPData:
652 AODMoments += ["ClusterWidthEta","ClusterWidthPhi"]
653
654 auxItems = f"xAOD::CaloClusterAuxContainer#{clustersname_final}Aux."
655 auxItems+= ".".join(AODMoments)
656
657 if flags.Calo.TopoCluster.writeDigiHSTruthMoments:
658 toAOD.append("CaloCellContainer#AllCalo_DigiHSTruth")
659 toESD.append("CaloCellContainer#AllCalo_DigiHSTruth")
660
661 toAOD.append(auxItems)
662
663 result.merge(addToESD(flags, toESD))
664 result.merge(addToAOD(flags, toAOD))
665
666 return result
667
Top algorithm to reconstruct CaloCluster objects from CaloCell objects.