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