ATLAS Offline Software
Loading...
Searching...
No Matches
TrackParticleCellAssociationAlg.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
3*/
4
6
7
11
12TrackParticleCellAssociationAlg::TrackParticleCellAssociationAlg(const std::string& name, ISvcLocator* pSvcLocator):
13 AthReentrantAlgorithm(name,pSvcLocator),
14 m_caloCellAssociationTool("Rec::ParticleCaloCellAssociationTool/ParticleCaloCellAssociationTool", this) {
15
16 declareProperty("ParticleCaloCellAssociationTool",m_caloCellAssociationTool);
17 declareProperty("PtCut", m_ptCut = 10000. );
18}
19
21
23{
25
29 ATH_CHECK(m_clusterCellLinkName.initialize());
30 return StatusCode::SUCCESS;
31}
32
33StatusCode TrackParticleCellAssociationAlg::execute(const EventContext& ctx) const
34{
35 // get track particles
37
38 // Create the xAOD container and its auxiliary store:
41
42
44 ATH_CHECK(xaoda.record (std::make_unique<xAOD::TrackParticleClusterAssociationContainer>(),
45 std::make_unique<xAOD::TrackParticleClusterAssociationAuxContainer>()));
46
47
48
49 unsigned int ntracks = 0;
50 for( unsigned int i=0;i<trackParticles->size();++i ){
51
52 // slect track
53 const xAOD::TrackParticle* tp = (*trackParticles)[i];
54 if( tp->pt() < m_ptCut ) continue;
55
56 // get ParticleCellAssociation
57 ATH_MSG_DEBUG(" Selected track: pt " << tp->pt() << " eta " << tp->eta() << " phi " << tp->phi() );
58 std::unique_ptr<const Rec::ParticleCellAssociation> association
59 =m_caloCellAssociationTool->particleCellAssociation(*tp,0.1);
60 if(!association){
61 ATH_MSG_DEBUG("failed to obtain the ParticleCellAssociation");
62 continue;
63 }
64
65 // require container as it should be there
66 if( !association->container() ){
67 ATH_MSG_WARNING("Failed to obtain CaloCellContainer from ParticleCellAssociation");
68 continue;
69 }
70
71 // create cell from ParticleCellAssociation
73 *association->container(),
74 *clusColl );
75 if( !cluster ){
76 ATH_MSG_WARNING("Failed to create cluster from ParticleCellAssociation");
77 continue;
78 }else{
79 ATH_MSG_DEBUG(" New cluster: eta " << cluster->eta() << " phi " << cluster->phi() << " cells " << cluster->size() << " nclusters " << clusColl->size() );
80 }
81
82 // create element links
84 ElementLink< xAOD::CaloClusterContainer > clusterLink(m_clusterContainerName.key(),clusColl->size()-1);
85
86 // if valid create TrackParticleClusterAssociation
87 if( trackLink.isValid() && clusterLink.isValid() ){
89 xaoda->push_back(trackAssociation);
90 trackAssociation->setTrackParticleLink( trackLink );
91 std::vector< ElementLink< xAOD::CaloClusterContainer > > caloClusterLinks;
92 caloClusterLinks.push_back( clusterLink );
93 trackAssociation->setCaloClusterLinks(caloClusterLinks);
94 ATH_MSG_DEBUG("added association");
95 ++ntracks;
96 }else{
97 if( !trackLink.isValid() ) ATH_MSG_WARNING("Failed to create track ElementLink ");
98 if( !clusterLink.isValid() ) ATH_MSG_WARNING("Failed to create cluster ElementLink ");
99 }
100 }
101
102 ATH_MSG_DEBUG(" Total number of selected tracks: " << ntracks );
103
106 clusColl.ptr()));
107 return StatusCode::SUCCESS;
108}
109
110
112{
113 return StatusCode::SUCCESS;
114}
#define ATH_CHECK
Evaluate an expression and check for errors.
#define ATH_MSG_WARNING(x)
#define ATH_MSG_DEBUG(x)
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T, V, H > &t)
An algorithm that can be simultaneously executed in multiple threads.
static StatusCode AddContainerWriteHandle(SG::WriteHandle< xAOD::CaloClusterContainer > &clusColl)
Creates a new xAOD::CaloClusterContainer in the given WriteHandle + CaloClusterAuxContainer and recor...
static StatusCode finalizeClusters(SG::WriteHandle< CaloClusterCellLinkContainer > &h, xAOD::CaloClusterContainer *pClusterColl)
Finalize clusters (move CaloClusterCellLink to a separate container).
static xAOD::CaloCluster * crossedCells(const Rec::ParticleCellAssociation &association, const CaloCellContainer &cellContainer, xAOD::CaloClusterContainer &clusterContainer)
StatusCode record(std::unique_ptr< T > data)
Record a const object to the store.
pointer_type ptr()
Dereference the pointer.
StatusCode execute(const EventContext &ctx) const override
SG::WriteHandleKey< xAOD::TrackParticleClusterAssociationContainer > m_associationContainerName
SG::WriteHandleKey< xAOD::CaloClusterContainer > m_clusterContainerName
SG::WriteHandleKey< CaloClusterCellLinkContainer > m_clusterCellLinkName
ToolHandle< Rec::IParticleCaloCellAssociationTool > m_caloCellAssociationTool
SG::ReadHandleKey< xAOD::TrackParticleContainer > m_trackParticleCollectionName
TrackParticleCellAssociationAlg(const std::string &name, ISvcLocator *pSvcLocator)
virtual double eta() const
The pseudorapidity ( ) of the particle.
size_t size() const
size method (forwarded from CaloClusterCellLink obj)
virtual double phi() const
The azimuthal angle ( ) of the particle.
void setTrackParticleLink(const ElementLink< TrackParticleContainer > &trackParticleLink)
Sets.
void setCaloClusterLinks(const std::vector< ElementLink< CaloClusterContainer > > &caloClusterLinks)
Sets.
TrackParticleClusterAssociation_v1 TrackParticleClusterAssociation
Reference the current persistent version:
CaloCluster_v1 CaloCluster
Define the latest version of the calorimeter cluster class.
TrackParticle_v1 TrackParticle
Reference the current persistent version: