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