ATLAS Offline Software
JetPFlowSelectionAlg.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2022 CERN for the benefit of the ATLAS collaboration
3 */
4 
9 
12 
13 #include "xAODEgamma/Electron.h"
15 #include "xAODMuon/Muon.h"
16 #include "xAODPFlow/FlowElement.h"
18 #include "xAODPFlow/FEHelpers.h"
19 
21  ATH_MSG_DEBUG("Initializing " );
22 
27  }
36 
37 
38  return StatusCode::SUCCESS;
39 }
40 
41 StatusCode JetPFlowSelectionAlg::execute(const EventContext& ctx) const {
42  ATH_MSG_DEBUG(" execute() ... ");
43 
44  //Check for invalid combinations of flags
46  ATH_MSG_ERROR("excludeChargedElectronFE and includeChargedMuonFE are mutually exclusive!");
47  return StatusCode::FAILURE;
48  }
49 
51  ATH_MSG_ERROR("excludeChargedElectronFE and includeChargedElectronFE are mutually exclusive!");
52  return StatusCode::FAILURE;
53  }
54 
56  if (! ChargedPFlowObjects.isValid()){
57  ATH_MSG_ERROR("Can't retrieve input container "<< m_ChargedPFlowContainerKey);
58  return StatusCode::FAILURE;
59  }
60 
62  if (! NeutralPFlowObjects.isValid()){
63  ATH_MSG_ERROR("Can't retrieve input container "<< m_NeutralPFlowContainerKey);
64  return StatusCode::FAILURE;
65  }
66 
68  if (!chargedFE_ElectronLinks.isValid()){
69  ATH_MSG_ERROR("Can't retrieve input decoration " << chargedFE_ElectronLinks.key());
70  return StatusCode::FAILURE;
71  }
72 
74  if (!chargedFE_MuonLinks.isValid()){
75  ATH_MSG_ERROR("Can't retrieve input decoration "<< chargedFE_MuonLinks.key());
76  return StatusCode::FAILURE;
77  }
78 
80  if (!neutralFE_ElectronLinks.isValid()){
81  ATH_MSG_ERROR("Can't retrieve input decoration "<< neutralFE_ElectronLinks.key());
82  return StatusCode::FAILURE;
83  }
84 
86  if (!neutralFE_MuonLinks.isValid()){
87  ATH_MSG_ERROR("Can't retrieve input decoration "<< neutralFE_MuonLinks.key());
88  return StatusCode::FAILURE;
89  }
90 
91  auto selectedChargedPFlowObjects = std::make_unique<xAOD::FlowElementContainer>(); // SG::VIEW_ELEMENTS
92  auto selectedChargedPFlowObjectsAux = std::make_unique<xAOD::FlowElementAuxContainer>();
93  selectedChargedPFlowObjects->setStore(selectedChargedPFlowObjectsAux.get());
94 
95  auto selectedNeutralPFlowObjects = std::make_unique<xAOD::FlowElementContainer>();
96  auto selectedNeutralPFlowObjectsAux = std::make_unique<xAOD::FlowElementAuxContainer>();
97  selectedNeutralPFlowObjects->setStore(selectedNeutralPFlowObjectsAux.get());
98 
99  // To store the charged FE objects matched to an electron/muon
100  std::vector< const xAOD::FlowElement* > ChargedPFlowObjects_matched;
101 
102  FEMuonHelper muonHelper;
103  FEElectronHelper electronHelper;
104 
105  // Loop over Charged FE objects
106  for ( const xAOD::FlowElement* fe : *ChargedPFlowObjects ) {
107 
108  bool isMuonToExclude = muonHelper.checkMuonLinks(chargedFE_MuonLinks(*fe), m_muonIDToExclude);
109  bool isMuonToInclude = muonHelper.checkMuonLinks(chargedFE_MuonLinks(*fe), m_muonIDToInclude);
110  bool isElectronToInclude = electronHelper.checkElectronLinks(chargedFE_ElectronLinks(*fe), m_electronIDToInclude);
111  bool isElectronToExclude = electronHelper.checkElectronLinks(chargedFE_ElectronLinks(*fe), m_electronIDToExclude);
112 
113  bool excludeChargedFE = false;
114 
115  //If we have only an exclude list we only need to do:
116  if (m_excludeChargedElectronFE && isElectronToExclude) excludeChargedFE = true;
117  if (m_excludeChargedMuonFE && isMuonToExclude) excludeChargedFE = true;
118 
119  //If we have an include list and the include ID is passed, we keep the FE object
120  //Whilst if it otherwise passes excludeID we exclude it
121  //e.g if we want medium we should only include leptons that pass medium ID,
122  //whilst excluding those that pass loose and NOT medium.
123  if (m_includeChargedElectronFE && isElectronToInclude) excludeChargedFE = false;
124  else if (m_includeChargedElectronFE && isElectronToExclude) excludeChargedFE = true;
125 
126  if (m_includeChargedMuonFE && isMuonToInclude) excludeChargedFE = false;
127  else if (m_includeChargedMuonFE && isMuonToExclude) excludeChargedFE = true;
128 
129  // Select FE object if not matched to an electron or muon, to exclude, via links
130  if ( !excludeChargedFE) {
131  xAOD::FlowElement* selectedFE = new xAOD::FlowElement();
132  selectedChargedPFlowObjects->push_back(selectedFE);
133  *selectedFE = *fe; // copies auxdata
134  }
135  else { // Use the matched object to put back its energy later
136  ChargedPFlowObjects_matched.push_back(fe);
137  }
138 
139  } // End loop over Charged FE Objects
140 
141  // Loop over Neutral FE objects
142  for ( const xAOD::FlowElement* fe : *NeutralPFlowObjects ) {
143 
144  bool isMuonToExclude = muonHelper.checkMuonLinks(neutralFE_MuonLinks(*fe), m_muonIDToExclude);
145  bool isMuonToInclude = muonHelper.checkMuonLinks(neutralFE_MuonLinks(*fe), m_muonIDToInclude);
146  bool isElectronToInclude = electronHelper.checkElectronLinks(neutralFE_ElectronLinks(*fe), m_electronIDToInclude);
147  bool isElectronToExclude = electronHelper.checkElectronLinks(neutralFE_ElectronLinks(*fe), m_electronIDToExclude);
148 
149  //If we specify to exclude, then we exclude if exclude ID is passed
150  //If we specify to include, then we include if include ID is passed - in this case
151  //we might want to e.g include medium electrons, whilst excluding that poass loose ID
152  if (m_excludeNeutralElectronFE && isElectronToExclude) continue;
153  bool vetoElectron_IncludeMode = false;
154  if (m_includeNeutralElectronFE && isElectronToInclude) vetoElectron_IncludeMode = false;
155  else if (m_includeNeutralElectronFE && isElectronToExclude) vetoElectron_IncludeMode = true;
156  if (vetoElectron_IncludeMode) continue;
157 
158  xAOD::FlowElement* selectedFE = new xAOD::FlowElement();
159  selectedNeutralPFlowObjects->push_back(selectedFE);
160  *selectedFE = *fe;
161 
162  bool excludeNeutralMuon = false;
163  //Muons can have both exclude and include lists
164  //Exclude case is the same as electron exclude case
165  if (m_excludeNeutralMuonFE && isMuonToExclude) excludeNeutralMuon = true;
166  //Include case is more complex - if muon passes includeID we keep it
167  //Whilst if it otherwise passes excludeID we exclude it
168  //e.g if we want medium muons we should only include muons that pass medium ID,
169  //whilst excluding those that pass loose and NOT medium.
170  if (m_includeNeutralMuonFE && isMuonToInclude) excludeNeutralMuon = false;
171  else if (m_includeNeutralMuonFE && isMuonToExclude) excludeNeutralMuon = true;
172 
173  if (excludeNeutralMuon) {
174  // If we are excluding muons, we need to adjust the energy of the neutral FE object
175  // by subtracting the muon energy in this calorimeter cluster
177  selectedFE->setP4(muonHelper.adjustNeutralCaloEnergy(clusterMuonEnergyFracs(*fe),*fe));
178  }
179 
180  } // End loop over Neutral FE Objects
181 
182  // Add the energy from removed charged FE clusters to neutral FE object
183  // if shared clusters exist, create the new neutral FE object otherwise
184  for ( const xAOD::FlowElement* chargedFE : ChargedPFlowObjects_matched ){
185 
186  // Get charged FE topoclusters and weights
187  std::vector<std::pair<const xAOD::IParticle*,float> > theOtherPairs_charged = chargedFE->otherObjectsAndWeights();
188  std::vector<ElementLink<xAOD::IParticleContainer>> theOtherLinks_charged = chargedFE->otherObjectLinks();
189 
190  // Loop over charged FE topoclusters
191  for (unsigned int iCluster = 0; iCluster < chargedFE->nOtherObjects(); ++iCluster){
192 
193  bool thisCluster_matched = false;
194 
195  std::pair<const xAOD::IParticle*,float> theOtherPair_charged = theOtherPairs_charged[iCluster];
196  const xAOD::IParticle* theCluster_charged = theOtherPair_charged.first;
197  float theClusterWeight_charged = theOtherPair_charged.second;
198 
199  // Loop over neutral FE objects
200  for ( xAOD::FlowElement* neutralFE : *selectedNeutralPFlowObjects ) {
201  if (thisCluster_matched) continue;
202 
203  // Loop over neutral FE topoclusters
204  std::vector<std::pair<const xAOD::IParticle*,float> > theOtherPairs_neutral = neutralFE->otherObjectsAndWeights();
205  for (auto& [theCluster_neutral, theClusterWeight_neutral] : theOtherPairs_neutral){
206 
207  // If topoclusters are matched, add the energy to the neutral FE object
208  if (theCluster_charged == theCluster_neutral){
209 
210  // Add the energy to the neutral FE object
211  float newEnergy = neutralFE->e() + theClusterWeight_charged;
212  neutralFE->setP4(newEnergy/cosh(neutralFE->eta()),
213  neutralFE->eta(),
214  neutralFE->phi(),
215  neutralFE->m());
216 
217  ATH_MSG_DEBUG("Updated neutral FlowElement with E, pt, eta and phi: "
218  << neutralFE->e() << ", " << neutralFE->pt() << ", "
219  << neutralFE->eta() << " and " << neutralFE->phi());
220 
221  thisCluster_matched = true;
222  }
223 
224  } // End loop over neutral FE clusters
225  } // End loop over neutral FE objects
226 
227  // If a topocluster is left unmatched, create a neutral FE object.
228  // Ignore topoclusters with nullptr
229  if ( !thisCluster_matched && theCluster_charged ){
230 
231  //check if charged cluster belongs to an electron, before we put it back as neutral
232  bool belongsToElectron = false;
234 
235  //get container index of charged cluster and compare to indices of electron topoclusters
236  unsigned int chargedClusterIndex = theCluster_charged->index();
237 
239  if (!electronReadHandle.isValid()){
240  ATH_MSG_ERROR("Can't retrieve electron container "<< m_electronContainerKey.key());
241  return StatusCode::FAILURE;
242  }
243 
244  for (auto thisElectron : *electronReadHandle){
245  const std::vector<const xAOD::CaloCluster*> electronTopoClusters = xAOD::EgammaHelpers::getAssociatedTopoClusters(thisElectron->caloCluster());
246  for (auto thisElectronTopoCluster : electronTopoClusters){
247  if (thisElectronTopoCluster->index() == chargedClusterIndex){
248  belongsToElectron = true;
249  break;
250  }
251  }
252  }
253  }
254 
255  if (belongsToElectron) continue;
256 
257  double muonCaloEnergy = 0.0;
260  std::vector<double> muonCaloEnergies = chargedFE_energy_match_muonReadHandle(*chargedFE);
261  muonCaloEnergy = muonCaloEnergies[iCluster];
262  }
263 
264  xAOD::FlowElement* newFE = new xAOD::FlowElement();
265  selectedNeutralPFlowObjects->push_back(newFE);
266 
267  newFE->setP4((theClusterWeight_charged - muonCaloEnergy) / cosh(theCluster_charged->eta()), // using energy from charged FE weight, not cluster->e()
268  theCluster_charged->eta(),
269  theCluster_charged->phi(),
270  theCluster_charged->m());
271  newFE->setCharge(0);
272  newFE->setSignalType(xAOD::FlowElement::SignalType::NeutralPFlow);
273 
274  ATH_MSG_DEBUG("Created neutral FlowElement with E, pt, eta and phi: "
275  << newFE->e() << ", " << newFE->pt() << ", "
276  << newFE->eta() << " and " << newFE->phi());
277 
278  std::vector<ElementLink<xAOD::IParticleContainer>> theClusters;
280  theIParticleLink.resetWithKeyAndIndex(theOtherLinks_charged[iCluster].persKey(), theOtherLinks_charged[iCluster].persIndex());
281 
282  theClusters.push_back(theIParticleLink);
283  newFE->setOtherObjectLinks(theClusters);
284 
285  //Add Standard data to these new FlowElements
287  const xAOD::CaloCluster* castCluster_charged = dynamic_cast<const xAOD::CaloCluster*>(theCluster_charged);
288  FEFiller.addStandardMoments(*newFE,*castCluster_charged);
289  FEFiller.addStandardSamplingEnergies(*newFE,*castCluster_charged);
290 
291  float layerEnergy_TileBar0 = castCluster_charged->eSample(xAOD::CaloCluster::CaloSample::TileBar0);
292  float layerEnergy_TileExt0 = castCluster_charged->eSample(xAOD::CaloCluster::CaloSample::TileExt0);
293  const static SG::AuxElement::Accessor<float> accFloatTIle0E("LAYERENERGY_TILE0");
294  accFloatTIle0E(*newFE) = layerEnergy_TileBar0 + layerEnergy_TileExt0;
295 
296  const static SG::AuxElement::Accessor<float> accFloatTiming("TIMING");
297  accFloatTiming(*newFE) = castCluster_charged->time();
298  }
299 
300  } // End loop over topoclusters of removed charged FE objects
301  } // End loop over removed charged FE objects
302 
303 
304  auto handle_ChargedPFlow_out = SG::makeHandle(m_outputChargedPFlowHandleKey, ctx);
305  if (!handle_ChargedPFlow_out.record(std::move(selectedChargedPFlowObjects), std::move(selectedChargedPFlowObjectsAux)) ){
306  ATH_MSG_ERROR("Can't record output PFlow container "<< m_outputChargedPFlowHandleKey);
307  return StatusCode::FAILURE;
308  }
309 
310  auto handle_NeutralPFlow_out = SG::makeHandle(m_outputNeutralPFlowHandleKey, ctx);
311  if (!handle_NeutralPFlow_out.record(std::move(selectedNeutralPFlowObjects), std::move(selectedNeutralPFlowObjectsAux)) ){
312  ATH_MSG_ERROR("Can't record output PFlow container "<< m_outputNeutralPFlowHandleKey);
313  return StatusCode::FAILURE;
314  }
315 
316  return StatusCode::SUCCESS;
317 }
JetPFlowSelectionAlg::m_includeNeutralElectronFE
Gaudi::Property< bool > m_includeNeutralElectronFE
Definition: JetPFlowSelectionAlg.h:42
FEMuonHelper::adjustNeutralCaloEnergy
TLorentzVector adjustNeutralCaloEnergy(const std::vector< double > &clusterMuonEnergyFracs, const xAOD::FlowElement &theFE) const
Definition: FEMuonHelper.cxx:30
WriteHandle.h
Handle class for recording to StoreGate.
JetPFlowSelectionAlg::m_electronIDToInclude
Gaudi::Property< std::string > m_electronIDToInclude
Definition: JetPFlowSelectionAlg.h:38
xAOD::CaloCluster_v1::time
flt_t time() const
Access cluster time.
FEHelpers::FillNeutralFlowElements::addStandardSamplingEnergies
void addStandardSamplingEnergies(xAOD::FlowElement &theFE, const xAOD::CaloCluster &theCluster)
Definition: FEHelpers.cxx:246
JetPFlowSelectionAlg::m_chargedFE_energy_match_muonReadHandleKey
SG::ReadDecorHandleKey< xAOD::FlowElementContainer > m_chargedFE_energy_match_muonReadHandleKey
Definition: JetPFlowSelectionAlg.h:69
xAOD::EgammaHelpers::getAssociatedTopoClusters
std::vector< const xAOD::CaloCluster * > getAssociatedTopoClusters(const xAOD::CaloCluster *cluster)
Return a vector of all the topo clusters associated with the egamma cluster.
Definition: EgammaxAODHelpers.cxx:65
FEMuonHelper.h
JetPFlowSelectionAlg::m_excludeNeutralElectronFE
Gaudi::Property< bool > m_excludeNeutralElectronFE
Definition: JetPFlowSelectionAlg.h:41
FEHelpers::FillNeutralFlowElements::addStandardMoments
void addStandardMoments(xAOD::FlowElement &theFE, const xAOD::CaloCluster &theCluster)
Definition: FEHelpers.cxx:213
JetPFlowSelectionAlg::m_chargedFEElectronsReadDecorKey
SG::ReadDecorHandleKey< xAOD::FlowElementContainer > m_chargedFEElectronsReadDecorKey
Definition: JetPFlowSelectionAlg.h:59
SG::Accessor
Helper class to provide type-safe access to aux data.
Definition: Control/AthContainers/AthContainers/Accessor.h:68
Muon.h
SG::ReadHandle
Definition: StoreGate/StoreGate/ReadHandle.h:67
CaloCell_ID_FCS::TileExt0
@ TileExt0
Definition: FastCaloSim_CaloCell_ID.h:37
xAOD::FlowElement_v1::setSignalType
void setSignalType(signal_t t)
JetPFlowSelectionAlg::m_electronContainerKey
SG::ReadHandleKey< xAOD::ElectronContainer > m_electronContainerKey
Definition: JetPFlowSelectionAlg.h:53
JetPFlowSelectionAlg::m_outputNeutralPFlowHandleKey
SG::WriteHandleKey< xAOD::FlowElementContainer > m_outputNeutralPFlowHandleKey
Definition: JetPFlowSelectionAlg.h:57
JetPFlowSelectionAlg::m_ChargedPFlowContainerKey
SG::ReadHandleKey< xAOD::FlowElementContainer > m_ChargedPFlowContainerKey
Definition: JetPFlowSelectionAlg.h:51
xAOD::FlowElement_v1::phi
virtual double phi() const override
The azimuthal angle ( ) of the particle.
xAOD::FlowElement_v1::pt
virtual double pt() const override
SG::VarHandleKey::key
const std::string & key() const
Return the StoreGate ID for the referenced object.
Definition: AthToolSupport/AsgDataHandles/Root/VarHandleKey.cxx:141
xAOD::FlowElement_v1::setOtherObjectLinks
void setOtherObjectLinks(const std::vector< ElementLink< IParticleContainer >> &elV)
SG::VarHandleKey::empty
bool empty() const
Test if the key is blank.
Definition: AthToolSupport/AsgDataHandles/Root/VarHandleKey.cxx:150
xAOD::IParticle
Class providing the definition of the 4-vector interface.
Definition: Event/xAOD/xAODBase/xAODBase/IParticle.h:41
JetPFlowSelectionAlg::m_chargedFEMuonsReadDecorKey
SG::ReadDecorHandleKey< xAOD::FlowElementContainer > m_chargedFEMuonsReadDecorKey
Definition: JetPFlowSelectionAlg.h:60
JetPFlowSelectionAlg::m_outputChargedPFlowHandleKey
SG::WriteHandleKey< xAOD::FlowElementContainer > m_outputChargedPFlowHandleKey
Definition: JetPFlowSelectionAlg.h:56
xAOD::FlowElement_v1::setCharge
void setCharge(float c)
JetPFlowSelectionAlg::m_NeutralPFlowContainerKey
SG::ReadHandleKey< xAOD::FlowElementContainer > m_NeutralPFlowContainerKey
Definition: JetPFlowSelectionAlg.h:52
FEHelpers::FillNeutralFlowElements
Definition: Event/xAOD/xAODPFlow/xAODPFlow/FEHelpers.h:27
SG::makeHandle
SG::ReadCondHandle< T > makeHandle(const SG::ReadCondHandleKey< T > &key, const EventContext &ctx=Gaudi::Hive::currentContext())
Definition: ReadCondHandle.h:274
xAOD::CaloCluster_v1
Description of a calorimeter cluster.
Definition: CaloCluster_v1.h:62
EgammaxAODHelpers.h
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
JetPFlowSelectionAlg::m_excludeChargedElectronFE
Gaudi::Property< bool > m_excludeChargedElectronFE
Definition: JetPFlowSelectionAlg.h:39
FlowElementAuxContainer.h
SG::ReadDecorHandle
Handle class for reading a decoration on an object.
Definition: StoreGate/StoreGate/ReadDecorHandle.h:94
FlowElement.h
JetPFlowSelectionAlg::m_excludeNeutralMuonFE
Gaudi::Property< bool > m_excludeNeutralMuonFE
Definition: JetPFlowSelectionAlg.h:48
JetPFlowSelectionAlg::m_electronIDToExclude
Gaudi::Property< std::string > m_electronIDToExclude
Definition: JetPFlowSelectionAlg.h:37
CaloCell_ID_FCS::TileBar0
@ TileBar0
Definition: FastCaloSim_CaloCell_ID.h:31
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
ATH_MSG_DEBUG
#define ATH_MSG_DEBUG(x)
Definition: AthMsgStreamMacros.h:29
xAOD::FlowElement
FlowElement_v1 FlowElement
Definition of the current "pfo version".
Definition: FlowElement.h:16
JetPFlowSelectionAlg::execute
StatusCode execute(const EventContext &ctx) const override
Definition: JetPFlowSelectionAlg.cxx:41
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
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
SG::AuxElement::index
size_t index() const
Return the index of this element within its container.
FEMuonHelper
Definition: Reconstruction/PFlow/PFlowUtils/PFlowUtils/FEMuonHelper.h:8
SG::ReadHandle::isValid
virtual bool isValid() override final
Can the handle be successfully dereferenced?
JetPFlowSelectionAlg::m_neutralFEMuonsReadDecorKey
SG::ReadDecorHandleKey< xAOD::FlowElementContainer > m_neutralFEMuonsReadDecorKey
Definition: JetPFlowSelectionAlg.h:64
JetPFlowSelectionAlg::m_excludeChargedMuonFE
Gaudi::Property< bool > m_excludeChargedMuonFE
Definition: JetPFlowSelectionAlg.h:46
FEElectronHelper::checkElectronLinks
bool checkElectronLinks(const std::vector< ElementLink< xAOD::ElectronContainer > > &FE_ElectronLinks, const std::string &qualityString) const
Definition: FEElectronHelper.cxx:5
JetPFlowSelectionAlg::m_neutralFEMuons_efrac_match_DecorKey
SG::ReadDecorHandleKey< xAOD::FlowElementContainer > m_neutralFEMuons_efrac_match_DecorKey
Definition: JetPFlowSelectionAlg.h:67
FEHelpers.h
JetPFlowSelectionAlg::m_includeNeutralMuonFE
Gaudi::Property< bool > m_includeNeutralMuonFE
Definition: JetPFlowSelectionAlg.h:49
ReadHandle.h
Handle class for reading from StoreGate.
xAOD::FlowElement_v1::e
virtual double e() const override
The total energy of the particle.
Definition: FlowElement_v1.cxx:25
JetPFlowSelectionAlg::m_neutralFEElectronsReadDecorKey
SG::ReadDecorHandleKey< xAOD::FlowElementContainer > m_neutralFEElectronsReadDecorKey
Definition: JetPFlowSelectionAlg.h:62
JetPFlowSelectionAlg::m_muonIDToInclude
Gaudi::Property< std::string > m_muonIDToInclude
Definition: JetPFlowSelectionAlg.h:45
JetPFlowSelectionAlg::m_includeChargedElectronFE
Gaudi::Property< bool > m_includeChargedElectronFE
Definition: JetPFlowSelectionAlg.h:40
xAOD::FlowElement_v1::eta
virtual double eta() const override
The pseudorapidity ( ) of the particle.
xAOD::CaloCluster_v1::eSample
float eSample(const CaloSample sampling) const
Definition: CaloCluster_v1.cxx:514
FEElectronHelper
Definition: FEElectronHelper.h:7
FEMuonHelper::checkMuonLinks
bool checkMuonLinks(const std::vector< ElementLink< xAOD::MuonContainer > > &FE_MuonLinks, const std::string &qualityString) const
Verify if at least one combined muon in a list passes the relevant quality criteria Details of muon w...
Definition: FEMuonHelper.cxx:5
xAOD::IParticle::eta
virtual double eta() const =0
The pseudorapidity ( ) of the particle.
ReadDecorHandle.h
Handle class for reading a decoration on an object.
JetPFlowSelectionAlg::m_muonIDToExclude
Gaudi::Property< std::string > m_muonIDToExclude
Definition: JetPFlowSelectionAlg.h:44
xAOD::FlowElement_v1::setP4
void setP4(float pt, float eta, float phi, float m)
Definition: FlowElement_v1.cxx:39
Electron.h
xAOD::IParticle::phi
virtual double phi() const =0
The azimuthal angle ( ) of the particle.
FEElectronHelper.h
JetPFlowSelectionAlg.h
JetPFlowSelectionAlg::m_includeChargedMuonFE
Gaudi::Property< bool > m_includeChargedMuonFE
Definition: JetPFlowSelectionAlg.h:47
JetPFlowSelectionAlg::initialize
StatusCode initialize() override
Athena algorithm's Hooks.
Definition: JetPFlowSelectionAlg.cxx:20
xAOD::IParticle::e
virtual double e() const =0
The total energy of the particle.
xAOD::IParticle::m
virtual double m() const =0
The invariant mass of the particle.
xAOD::FlowElement_v1
A detector object made of other lower level object(s)
Definition: FlowElement_v1.h:25