ATLAS Offline Software
PFChargedFlowElementCreatorAlgorithm.cxx
Go to the documentation of this file.
1 //eflowRec includes
6 
7 //EDM includes
11 #include "xAODPFlow/PFODefs.h"
13 
15 
17 
19 
20  return StatusCode::SUCCESS;
21 }
22 
24 
25  ATH_MSG_DEBUG("Starting PFOChargedCreatorAlgorithm::execute");
26 
28  ATH_CHECK(chargedFlowElementContainerWriteHandle.record(std::make_unique<xAOD::FlowElementContainer>(),std::make_unique<xAOD::FlowElementAuxContainer>()));
29 
30  /* Create Charged FlowElements from all eflowCaloObjects */
32  for (const auto *const thisEflowCaloObject : *eflowCaloObjectContainerReadHandle) createChargedFlowElements(*thisEflowCaloObject,true,chargedFlowElementContainerWriteHandle);
33 
34  std::sort(chargedFlowElementContainerWriteHandle->begin(), chargedFlowElementContainerWriteHandle->end(), [] (const xAOD::FlowElement* flowElement1, const xAOD::FlowElement* flowElement2) {return flowElement1->pt()>flowElement2->pt();});
35 
36  return StatusCode::SUCCESS;
37 
38 }
39 
40 void PFChargedFlowElementCreatorAlgorithm::createChargedFlowElements(const eflowCaloObject& energyFlowCaloObject, bool addClusters, SG::WriteHandle<xAOD::FlowElementContainer>& chargedFlowElementContainerWriteHandle) const {
41 
42  /* Loop over all tracks in the eflowCaloObject */
43  for (unsigned int iTrack = 0; iTrack < energyFlowCaloObject.nTracks(); ++iTrack) {
44 
45  const eflowRecTrack* efRecTrack = energyFlowCaloObject.efRecTrack(iTrack);
46 
47  /* Skip tracks that haven't been subtracted */
48  if (!m_eOverPMode && !efRecTrack->isSubtracted()){continue;}
49 
50  /* Create new xAOD::FlowElement and set the type to charged PFlow */
51  xAOD::FlowElement* thisFE = new xAOD::FlowElement();
52  chargedFlowElementContainerWriteHandle->push_back(thisFE);
53  thisFE->setSignalType(xAOD::FlowElement::SignalType::ChargedPFlow);
54 
55  /* Get the track elementLink and add it to the xAOD:FE.
56  Note we first have to convert it to an IParticle ElementLink. */
58  ElementLink< xAOD::IParticleContainer > theIParticleTrackLink (theTrackLink);
59  std::vector<ElementLink<xAOD::IParticleContainer> > vecIParticleTrackLinkContainer;
60  vecIParticleTrackLinkContainer.push_back(theIParticleTrackLink);
61  thisFE->setChargedObjectLinks(vecIParticleTrackLinkContainer);
62 
63  //Now set the charge
64  thisFE->setCharge(efRecTrack->getTrack()->charge());
66 
67  std::pair<double,double> etaPhi(0.0,0.0);
68 
69  if (m_eOverPMode){
70  /* In EOverPMode want charged eflowObjects to have extrapolated eta,phi as coordinates
71  * (needed for analysis of EOverP Data) */
72  etaPhi = efRecTrack->getTrackCaloPoints().getEM2etaPhi();
73 
74  /*add information to xAOD*/
75  const static SG::AuxElement::Accessor<int> accLHED("LayerHED");
76  accLHED(*thisFE) = efRecTrack->getLayerHED();
77 
78  const static SG::AuxElement::Accessor<std::vector<int> > accCellOrderVector("LayerVectorCellOrdering");
79  accCellOrderVector(*thisFE) = efRecTrack->getLayerCellOrderVector();
80 
81  const static SG::AuxElement::Accessor<std::vector<float> > accRadiusCellOrderVector("RadiusVectorCellOrdering");
82  accRadiusCellOrderVector(*thisFE) = efRecTrack->getRadiusCellOrderVector();
83 
84  const static SG::AuxElement::Accessor<std::vector<float> > accAvgEDensityCellOrderVector("AvgEdensityVectorCellOrdering");
85  accAvgEDensityCellOrderVector(*thisFE) = efRecTrack->getAvgEDensityCellOrderVector();
86  } else {
87  /* In normal mode we want the track eta,phi at the perigee */
88  etaPhi.first = efRecTrack->getTrack()->eta();
89  etaPhi.second = efRecTrack->getTrack()->phi();
90  }
91 
92  /* Set the 4-vector of the xAOD::PFO */
93  thisFE->setP4(efRecTrack->getTrack()->pt(), etaPhi.first, etaPhi.second, efRecTrack->getTrack()->m());
94 
95  ATH_MSG_DEBUG("Created charged PFO with E, pt, eta and phi of " << thisFE->e() << ", " << thisFE->pt() << ", " << thisFE->eta() << " and " << thisFE->phi());
96 
97  /* Add the amount of energy the track was expected to deposit in the calorimeter - this is needed to calculate the charged weight in the jet finding */
98  const static SG::AuxElement::Accessor<float> accTracksExpectedEnergyDeposit("TracksExpectedEnergyDeposit");
99  accTracksExpectedEnergyDeposit(*thisFE) = efRecTrack->getEExpect();
100  ATH_MSG_DEBUG("Have set that PFO's expected energy deposit to be " << efRecTrack->getEExpect());
101 
102  /* Flag if this track was in a dense environment for later checking */
103  //There is an issue using bools - when written to disk they convert to chars. So lets store the bool as an int.
104  const static SG::AuxElement::Accessor<int> accIsInDenseEnvironment("IsInDenseEnvironment");
105  accIsInDenseEnvironment(*thisFE) = efRecTrack->isInDenseEnvironment();
106 
107  /* Optionally we add the links to clusters to the xAOD::PFO */
108  if (addClusters){
109 
110  std::vector<std::pair<eflowTrackClusterLink*,std::pair<float,float> > > trackClusterLinkPairs = energyFlowCaloObject.efRecLink();
111 
112  ATH_MSG_DEBUG("Have got " << trackClusterLinkPairs.size() << " trackClusterLinkPairs");
113 
114  std::vector<eflowTrackClusterLink*> thisTracks_trackClusterLinks = efRecTrack->getClusterMatches();
115 
116  ATH_MSG_DEBUG("Have got " << thisTracks_trackClusterLinks.size() << " cluster matches");
117 
122  std::vector<eflowTrackClusterLink*> thisTracks_trackClusterLinksSubtracted;
123 
124  //Create vector of pairs which map each CaloCluster to the asbolute value of its unstracted energy
125  std::vector<std::pair<ElementLink<xAOD::CaloClusterContainer>, double> > vectorClusterToSubtractedEnergies;
126 
127  for (auto& trackClusterLink : thisTracks_trackClusterLinks){
128  for (auto& trackClusterLinkPair : trackClusterLinkPairs){
129  //If either of trackClusterLinkPair.second.first or trackClusterLinkPair.second.second is NAN, then no charegd shower
130  //subraction occurred and hence we don't want to save information about that.
131  if (!m_eOverPMode && trackClusterLinkPair.first == trackClusterLink && !std::isnan(trackClusterLinkPair.second.first)) {
132  thisTracks_trackClusterLinksSubtracted.push_back(trackClusterLink);
133  eflowRecCluster* efRecCluster = trackClusterLinkPair.first->getCluster();
134  ElementLink<xAOD::CaloClusterContainer> theOriginalClusterLink = efRecCluster->getOriginalClusElementLink();
135  ElementLink<xAOD::CaloClusterContainer> theSisterClusterLink = (*theOriginalClusterLink)->getSisterClusterLink();
136  ATH_MSG_DEBUG("Will add cluster with E, ratio and absolute subtracted energy " << (*theOriginalClusterLink)->e() << ", " << trackClusterLinkPair.second.first << ", " << trackClusterLinkPair.second.second);
137  if (theSisterClusterLink.isValid()) vectorClusterToSubtractedEnergies.emplace_back(std::pair(theSisterClusterLink,trackClusterLinkPair.second.second));
138  else vectorClusterToSubtractedEnergies.emplace_back(std::pair(theOriginalClusterLink,trackClusterLinkPair.second.second));
139  }
140  else if (m_eOverPMode && trackClusterLinkPair.first == trackClusterLink){
141  thisTracks_trackClusterLinksSubtracted.push_back(trackClusterLink);
142  eflowRecCluster* efRecCluster = trackClusterLinkPair.first->getCluster();
143  ElementLink<xAOD::CaloClusterContainer> theOriginalClusterLink = efRecCluster->getOriginalClusElementLink();
144  ElementLink<xAOD::CaloClusterContainer> theSisterClusterLink = (*theOriginalClusterLink)->getSisterClusterLink();
145  ATH_MSG_DEBUG("Will add cluster with E, ratio and absolute subtracted energy " << (*theOriginalClusterLink)->e() << ", " << 1.0 << ", " << 0.0);
146  if (theSisterClusterLink.isValid()) vectorClusterToSubtractedEnergies.emplace_back(theSisterClusterLink,0.0);
147  else vectorClusterToSubtractedEnergies.emplace_back(theOriginalClusterLink,0.0);
148  }
149  }
150  }
151 
152  //sort the vectorClusterToSubtractedEnergies in order of subtracted energy from high (most subtracted) to low (least subtracted)
153  std::sort(vectorClusterToSubtractedEnergies.begin(),vectorClusterToSubtractedEnergies.end(), [](auto const& a, auto const&b){return a.second > b.second;});
154  //now split this into two vectors, ready to be used by the FlowElement
155  std::vector<ElementLink<xAOD::IParticleContainer> > theClusters;
156  std::vector<float> theClusterWeights;
157  for (auto thePair : vectorClusterToSubtractedEnergies){
158  ElementLink< xAOD::IParticleContainer > theIParticleTrackLink(thePair.first);
159  theClusters.push_back(theIParticleTrackLink);
160  theClusterWeights.push_back(thePair.second);
161  }
162 
163  //Set the vector of clusters and vector of corresponding energies.
164  thisFE->setOtherObjectLinks(theClusters,theClusterWeights);
165 
166  }//if we add clusters
167 
168  //Add detailed CP data
169  if (m_addCPData){
170  const static SG::AuxElement::Accessor<float> accEtaEM2("EtaEM2");
171  accEtaEM2(*thisFE) = efRecTrack->getTrackCaloPoints().getEM2etaPhi().first;
172 
173  const static SG::AuxElement::Accessor<float> accPhiEM2("PhiEM2");
174  accPhiEM2(*thisFE) = efRecTrack->getTrackCaloPoints().getEM2etaPhi().second;
175 
176  const static SG::AuxElement::Accessor<char> accIsRecovered("isRecovered");
177  accIsRecovered(*thisFE) = efRecTrack->isRecovered();
178 
179  const static SG::AuxElement::Accessor<unsigned int> accNumMatchedClusters("numMatchedClusters");
180  accNumMatchedClusters(*thisFE) = efRecTrack->getClusterMatches().size();
181 
182  const static SG::AuxElement::Accessor<std::vector<float> > accDRPrimes("dRPrimes");
183  accDRPrimes(*thisFE) = efRecTrack->getDRPrimes();
184 
185  const static SG::AuxElement::Accessor<float > accPull15("Pull15");
186  accPull15(*thisFE) = efRecTrack->getpull15();
187 
188  const static SG::AuxElement::Accessor<std::vector<std::pair<ElementLink<CaloCellContainer>, double> > > accSubtractedCaloCells("SubtractedCaloCells");
189  accSubtractedCaloCells(*thisFE) = efRecTrack->getSubtractedCaloCells();
190  }
191 
192  }//loop over eflowRecTracks
193 
194 }
eflowRecCluster
This class extends the information about a xAOD::CaloCluster.
Definition: eflowRecCluster.h:40
xAOD::TrackParticle_v1::pt
virtual double pt() const override final
The transverse momentum ( ) of the particle.
Definition: TrackParticle_v1.cxx:73
xAOD::TrackParticle_v1::m
virtual double m() const override final
The invariant mass of the particle..
Definition: TrackParticle_v1.cxx:83
eflowRecTrack::isRecovered
bool isRecovered() const
Definition: eflowRecTrack.h:106
eflowCaloObject::efRecLink
const std::vector< std::pair< eflowTrackClusterLink *, std::pair< float, float > > > & efRecLink() const
Definition: eflowCaloObject.h:65
PFChargedFlowElementCreatorAlgorithm.h
eflowRecTrack::getRadiusCellOrderVector
const std::vector< float > & getRadiusCellOrderVector() const
Definition: eflowRecTrack.h:96
SG::Accessor
Helper class to provide type-safe access to aux data.
Definition: Control/AthContainers/AthContainers/Accessor.h:68
AuxStoreAccessorMacros.h
eflowRecTrack::isInDenseEnvironment
bool isInDenseEnvironment() const
Definition: eflowRecTrack.h:103
xAOD::TrackParticle_v1::charge
float charge() const
Returns the charge.
Definition: TrackParticle_v1.cxx:150
SG::ReadHandle
Definition: StoreGate/StoreGate/ReadHandle.h:70
xAOD::TrackParticle_v1::eta
virtual double eta() const override final
The pseudorapidity ( ) of the particle.
Definition: TrackParticle_v1.cxx:77
xAOD::FlowElement_v1::setSignalType
void setSignalType(signal_t t)
eflowRecTrack::getTrackElemLink
ElementLink< xAOD::TrackParticleContainer > getTrackElemLink() const
Definition: eflowRecTrack.h:58
xAOD::FlowElement_v1::phi
virtual double phi() const override
The azimuthal angle ( ) of the particle.
xAOD::FlowElement_v1::pt
virtual double pt() const override
eflowCaloObject
An internal EDM object which stores information about systems of associated tracks and calorimeter cl...
Definition: eflowCaloObject.h:34
PFChargedFlowElementCreatorAlgorithm::m_chargedFlowElementContainerWriteHandleKey
SG::WriteHandleKey< xAOD::FlowElementContainer > m_chargedFlowElementContainerWriteHandleKey
WriteHandleKey for charged PFO.
Definition: PFChargedFlowElementCreatorAlgorithm.h:37
xAOD::FlowElement_v1::setOtherObjectLinks
void setOtherObjectLinks(const std::vector< ElementLink< IParticleContainer >> &elV)
PFChargedFlowElementCreatorAlgorithm::initialize
StatusCode initialize()
Definition: PFChargedFlowElementCreatorAlgorithm.cxx:14
eflowRecTrack::getLayerHED
int getLayerHED() const
Definition: eflowRecTrack.h:90
eflowRecTrack::getDRPrimes
const std::vector< float > & getDRPrimes() const
Definition: eflowRecTrack.h:68
PFChargedFlowElementCreatorAlgorithm::m_eflowCaloObjectContainerReadHandleKey
SG::ReadHandleKey< eflowCaloObjectContainer > m_eflowCaloObjectContainerReadHandleKey
ReadHandleKey for eflowCaloObjectContainer.
Definition: PFChargedFlowElementCreatorAlgorithm.h:34
xAOD::FlowElement_v1::setCharge
void setCharge(float c)
eflowRecTrack
This class extends the information about a xAOD::Track.
Definition: eflowRecTrack.h:46
eflowRecTrack::getClusterMatches
const std::vector< eflowTrackClusterLink * > & getClusterMatches() const
Definition: eflowRecTrack.h:67
eflowRecTrack.h
PFChargedFlowElementCreatorAlgorithm::m_addCPData
Gaudi::Property< bool > m_addCPData
Toggle whether to decorate FlowElements with addutional data for Combined Performance studies.
Definition: PFChargedFlowElementCreatorAlgorithm.h:31
eflowCaloObject::efRecTrack
const eflowRecTrack * efRecTrack(int i) const
Definition: eflowCaloObject.h:52
FlowElementAuxContainer.h
PFChargedFlowElementCreatorAlgorithm::createChargedFlowElements
void createChargedFlowElements(const eflowCaloObject &energyFlowCaloObject, bool addClusters, SG::WriteHandle< xAOD::FlowElementContainer > &chargedFlowElementContainerWriteHandle) const
Create the charged PFO.
Definition: PFChargedFlowElementCreatorAlgorithm.cxx:40
eflowRecTrack::getAvgEDensityCellOrderVector
const std::vector< float > & getAvgEDensityCellOrderVector() const
Definition: eflowRecTrack.h:99
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
eflowRecTrack::isSubtracted
bool isSubtracted() const
Definition: eflowRecTrack.h:80
eflowRecTrack::getpull15
double getpull15() const
Definition: eflowRecTrack.h:110
ATH_MSG_DEBUG
#define ATH_MSG_DEBUG(x)
Definition: AthMsgStreamMacros.h:29
IParticleContainer.h
xAOD::FlowElement
FlowElement_v1 FlowElement
Definition of the current "pfo version".
Definition: FlowElement.h:16
eflowRecTrack::getEExpect
double getEExpect() const
Definition: eflowRecTrack.h:84
xAOD::FlowElement_v1::ChargedPFlow
@ ChargedPFlow
Definition: FlowElement_v1.h:47
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
eflowRecCluster::getCluster
xAOD::CaloCluster * getCluster()
Definition: eflowRecCluster.h:49
eflowRecCluster::getOriginalClusElementLink
ElementLink< xAOD::CaloClusterContainer > getOriginalClusElementLink() const
Definition: eflowRecCluster.h:58
eflowCaloObject::nTracks
unsigned nTracks() const
Definition: eflowCaloObject.h:54
SG::VarHandleKey::initialize
StatusCode initialize(bool used=true)
If this object is used as a property, then this should be called during the initialize phase.
Definition: AthToolSupport/AsgDataHandles/Root/VarHandleKey.cxx:103
eflowRecCluster.h
eflowRecTrack::getSubtractedCaloCells
const std::vector< std::pair< ElementLink< CaloCellContainer >, double > > & getSubtractedCaloCells() const
Definition: eflowRecTrack.h:116
PFChargedFlowElementCreatorAlgorithm::execute
StatusCode execute(const EventContext &) const
Definition: PFChargedFlowElementCreatorAlgorithm.cxx:23
eflowRecTrack::getTrack
const xAOD::TrackParticle * getTrack() const
Definition: eflowRecTrack.h:54
xAOD::FlowElement_v1::setChargedObjectLinks
void setChargedObjectLinks(const std::vector< ElementLink< IParticleContainer >> &elV)
eflowTrackCaloPoints::getEM2etaPhi
const std::pair< float, float > getEM2etaPhi() const
Definition: eflowTrackCaloPoints.h:49
plotBeamSpotMon.b
b
Definition: plotBeamSpotMon.py:77
xAOD::FlowElement_v1::e
virtual double e() const override
The total energy of the particle.
Definition: FlowElement_v1.cxx:25
PFChargedFlowElementCreatorAlgorithm::m_eOverPMode
Gaudi::Property< bool > m_eOverPMode
Toggle EOverP algorithm mode, whereby no charged shower subtraction is performed.
Definition: PFChargedFlowElementCreatorAlgorithm.h:28
DataVector::push_back
value_type push_back(value_type pElem)
Add an element to the end of the collection.
eflowRecTrack::getTrackCaloPoints
const eflowTrackCaloPoints & getTrackCaloPoints() const
Definition: eflowRecTrack.h:56
DataVector::end
const_iterator end() const noexcept
Return a const_iterator pointing past the end of the collection.
SG::WriteHandle
Definition: StoreGate/StoreGate/WriteHandle.h:76
xAOD::FlowElement_v1::eta
virtual double eta() const override
The pseudorapidity ( ) of the particle.
a
TList * a
Definition: liststreamerinfos.cxx:10
SG::WriteHandle::record
StatusCode record(std::unique_ptr< T > data)
Record a const object to the store.
CaloClusterContainer.h
PFODefs.h
xAOD::FlowElement_v1::setP4
void setP4(float pt, float eta, float phi, float m)
Definition: FlowElement_v1.cxx:39
eflowRecTrack::getLayerCellOrderVector
const std::vector< int > & getLayerCellOrderVector() const
Definition: eflowRecTrack.h:93
DataVector::begin
const_iterator begin() const noexcept
Return a const_iterator pointing at the beginning of the collection.
xAOD::TrackParticle_v1::phi
virtual double phi() const override final
The azimuthal angle ( ) of the particle (has range to .)
xAOD::FlowElement_v1
A detector object made of other lower level object(s)
Definition: FlowElement_v1.h:25