ATLAS Offline Software
UFOTrackParticleThinning.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2022 CERN for the benefit of the ATLAS collaboration
3 */
4 
6 // UFOTrackParticleThinning.cxx, (c) ATLAS Detector software
8 
10 
12 
13 // Constructor
15  const std::string& n,
16  const IInterface* p ) :
17 base_class(t,n,p)
18 {
19 }
20 
21 // Destructor
23 
24 // Athena initialize and finalize
26 {
27  // Decide which collections need to be checked for ID TrackParticles
28  ATH_MSG_VERBOSE("initialize() ...");
29  ATH_CHECK( m_inDetSGKey.initialize(m_streamName) );
30  ATH_MSG_INFO("Using " << m_inDetSGKey.key() << " as the source collection for inner detector track particles");
31 
32  m_PFOChargedSGKey = m_PFOSGKey+"ChargedParticleFlowObjects";
33  m_PFONeutralSGKey = m_PFOSGKey+"NeutralParticleFlowObjects";
34  ATH_CHECK( m_PFONeutralSGKey.initialize(m_streamName));
35  ATH_CHECK( m_PFOChargedSGKey.initialize(m_streamName));
36  ATH_MSG_INFO("Using " << m_PFONeutralSGKey.key() << "and " << m_PFOChargedSGKey.key() << " as the source collection for the PFlow collection");
37 
38  for(unsigned int i = 0; i < m_addPFOSGKey.size(); i++){
39  m_tmpAddPFOChargedSGKey = m_addPFOSGKey[i]+"ChargedParticleFlowObjects";
40  ATH_CHECK( m_tmpAddPFOChargedSGKey.initialize(m_streamName) );
41  m_addPFOChargedSGKey.push_back(m_tmpAddPFOChargedSGKey);
42  m_tmpAddPFONeutralSGKey = m_addPFOSGKey[i]+"NeutralParticleFlowObjects";
43  ATH_CHECK( m_tmpAddPFONeutralSGKey.initialize(m_streamName) );
44  m_addPFONeutralSGKey.push_back(m_tmpAddPFONeutralSGKey);
45  }
46 
47  ATH_CHECK( m_ufoSGKey.initialize(m_streamName));
48  ATH_MSG_INFO("Using " << m_ufoSGKey.key()<< " as the source collection for UFOs");
49 
50  ATH_CHECK( m_jetSGKey.initialize());
51  ATH_MSG_INFO("Using " << m_jetSGKey.key() << " as the source collection for UFOs");
52 
53  if (!m_selectionString.empty()){
54  // order must match enum order EJetTrPThinningParser
55  ATH_CHECK( initializeParser( m_selectionString ));
56  }
57 
58  return StatusCode::SUCCESS;
59 }
60 
62 {
63  return StatusCode::SUCCESS;
64 }
65 
66 // The thinning itself
68 {
69 
70  const EventContext& ctx = Gaudi::Hive::currentContext();
71 
72  // Retrieve main TrackParticle collection
73  SG::ThinningHandle<xAOD::TrackParticleContainer> importedTrackParticles(m_inDetSGKey, ctx);
74 
75  // Retrieve PFO collection if required
76  SG::ThinningHandle<xAOD::FlowElementContainer> importedPFONeutral(m_PFONeutralSGKey, ctx);
77  SG::ThinningHandle<xAOD::FlowElementContainer> importedPFOCharged(m_PFOChargedSGKey, ctx);
78 
79  // Retrieve main jet collection
80  SG::ReadHandle<xAOD::JetContainer> importedJets(m_jetSGKey);
81  unsigned int nJets(importedJets->size());
82  std::vector<const xAOD::Jet*> jetToCheck; jetToCheck.clear();
83 
84  // Check the event contains tracks
85  unsigned int nTracks = importedTrackParticles->size();
86  // Check the event contains calo clusters
87  const size_t nPFONeutral = importedPFONeutral->size();
88  const size_t nPFOCharged = importedPFOCharged->size() ;
89  unsigned int nPFOs = nPFOCharged + nPFONeutral;
90  if (nPFOs==0 && nTracks==0) return StatusCode::SUCCESS;
91 
92  // Set up a mask with the same entries as the full TrackParticle collection
93  std::vector<bool> maskTracks;
94  maskTracks.assign(nTracks,false); // default: don't keep any tracks
95 
96  // Set up a mask with the same entries as the full PFO collection(s)
97  std::vector< bool > pfomaskNeutral( nPFONeutral, false );
98  std::vector< bool > pfomaskCharged( nPFOCharged, false );
99 
100  // Retrieve containers
101  // ... UFOs
102  SG::ThinningHandle<xAOD::FlowElementContainer> importedUFOs(m_ufoSGKey, ctx);
103  unsigned int nUFOs(importedUFOs->size());
104 
105  // Set up a mask with the same entries as the full CaloCluster collection
106  std::vector<bool> maskUFOs;
107  maskUFOs.assign(nUFOs,false); // default: don't keep any tracks
108 
109  // Execute the text parser if requested
110  if (m_selectionString!="") {
111  std::vector<int> entries = m_parser->evaluateAsVector();
112  unsigned int nEntries = entries.size();
113  // check the sizes are compatible
114  if (nJets != nEntries ) {
115  ATH_MSG_ERROR("Sizes incompatible! Are you sure your selection string used jets??");
116  return StatusCode::FAILURE;
117  } else {
118  // identify which jets to keep for the thinning check
119  for (unsigned int i=0; i<nJets; ++i) if (entries[i]==1) jetToCheck.push_back((*importedJets)[i]);
120  }
121  }
122 
123  if (m_selectionString=="") { // check all jets as user didn't provide a selection string
124  for(const auto *jet : *importedJets){
125  for( size_t j = 0; j < jet->numConstituents(); ++j ) {
126  auto ufo = jet->constituentLinks().at(j);
127  int index = ufo.index();
128  maskUFOs[index] = true;
129  const xAOD::FlowElement* ufoO = dynamic_cast<const xAOD::FlowElement*>(*ufo);
130  if(!ufoO) continue;
131 
132  // Retrieve the track if UFO is charged or combined object
134  int index_trk = ufoO->chargedObject(0)->index();
135  if(index_trk>=0) {
136  maskTracks[index_trk] = true;
137  }
138  }
139 
140  // Loop over charged and neutral PFOs
141  for (size_t n = 0; n < ufoO->otherObjects().size(); ++n) {
142  int index_pfo = ufoO->otherObject(n)->index();
143  if(index_pfo<0) continue;
144 
145  const xAOD::FlowElement* fe = dynamic_cast<const xAOD::FlowElement*>(ufoO->otherObject(n));
146 
147  if(fe->signalType()==xAOD::FlowElement::SignalType::ChargedPFlow){
148  pfomaskCharged.at( index_pfo ) = true;
149  }
150  else if(fe->signalType()==xAOD::FlowElement::SignalType::NeutralPFlow){
151  pfomaskNeutral.at( index_pfo ) = true;
152  }
153  }
154  }
155  }
156 
157  } else {
158 
159  for (auto & jetIt : jetToCheck) {
160  for( size_t j = 0; j < jetIt->numConstituents(); ++j ) {
161  auto ufo = jetIt->constituentLinks().at(j);
162  int index = ufo.index();
163  maskUFOs[index] = true;
164 
165  const xAOD::FlowElement* ufoO = dynamic_cast<const xAOD::FlowElement*>(*ufo);
166  if(!ufoO) continue;
167 
169  int index_trk = ufoO->chargedObject(0)->index();
170  if(index_trk>=0) {
171  maskTracks[index_trk] = true;
172  }
173  }
174 
175  for (size_t n = 0; n < ufoO->otherObjects().size(); ++n) {
176  int index_pfo = ufoO->otherObject(n)->index();
177  if(index_pfo<0) continue;
178 
179  const xAOD::FlowElement* fe = dynamic_cast<const xAOD::FlowElement*>(ufoO->otherObject(n));
180 
181  if(fe->signalType()==xAOD::FlowElement::SignalType::ChargedPFlow){
182  pfomaskCharged.at( index_pfo ) = true;
183  }
184  else if(fe->signalType()==xAOD::FlowElement::SignalType::NeutralPFlow){
185  pfomaskNeutral.at( index_pfo ) = true;
186  }
187  }
188  }
189  }
190  }
191 
192  // Execute the thinning service based on the mask. Finish.
193  if(m_thinTracks){
194  importedTrackParticles.keep (maskTracks);
195  }
196  importedPFONeutral.keep (pfomaskNeutral);
197  importedPFOCharged.keep (pfomaskCharged);
198  importedUFOs.keep (maskUFOs);
199 
200  for(unsigned int i = 0; i < m_addPFOChargedSGKey.size(); i++){
201  SG::ThinningHandle<xAOD::FlowElementContainer> tempPFOCharged(m_addPFOChargedSGKey[i], ctx);
202  SG::ThinningHandle<xAOD::FlowElementContainer> tempPFONeutral(m_addPFONeutralSGKey[i], ctx);
203 
204  tempPFOCharged.keep(pfomaskCharged);
205  tempPFONeutral.keep(pfomaskNeutral);
206  }
207 
208  return StatusCode::SUCCESS;
209 }
210 
DerivationFramework::UFOTrackParticleThinning::finalize
virtual StatusCode finalize() override
Definition: UFOTrackParticleThinning.cxx:61
python.PerfMonSerializer.p
def p
Definition: PerfMonSerializer.py:743
ATH_MSG_INFO
#define ATH_MSG_INFO(x)
Definition: AthMsgStreamMacros.h:31
ThinningHandle.h
Handle for requesting thinning for a data object.
SG::ReadHandle
Definition: StoreGate/StoreGate/ReadHandle.h:70
index
Definition: index.py:1
DerivationFramework::UFOTrackParticleThinning::doThinning
virtual StatusCode doThinning() const override
Definition: UFOTrackParticleThinning.cxx:67
read_hist_ntuple.t
t
Definition: read_hist_ntuple.py:5
ATH_MSG_VERBOSE
#define ATH_MSG_VERBOSE(x)
Definition: AthMsgStreamMacros.h:28
DerivationFramework::UFOTrackParticleThinning::UFOTrackParticleThinning
UFOTrackParticleThinning(const std::string &t, const std::string &n, const IInterface *p)
Definition: UFOTrackParticleThinning.cxx:14
SG::ThinningHandle
Handle for requesting thinning for a data object.
Definition: ThinningHandle.h:84
PUClassification.Charged
Charged
Definition: PUClassification.py:16
python.setupRTTAlg.size
int size
Definition: setupRTTAlg.py:39
DerivationFramework::UFOTrackParticleThinning::initialize
virtual StatusCode initialize() override
Definition: UFOTrackParticleThinning.cxx:25
SG::ThinningHandleBase::keep
void keep(size_t ndx)
Mark that index ndx in the container should be kept (not thinned away).
Definition: ThinningHandleBase.cxx:68
jet
Definition: JetCalibTools_PlotJESFactors.cxx:23
ATH_MSG_ERROR
#define ATH_MSG_ERROR(x)
Definition: AthMsgStreamMacros.h:33
lumiFormat.i
int i
Definition: lumiFormat.py:92
beamspotman.n
n
Definition: beamspotman.py:731
EL::StatusCode
::StatusCode StatusCode
StatusCode definition for legacy code.
Definition: PhysicsAnalysis/D3PDTools/EventLoop/EventLoop/StatusCode.h:22
xAOD::FlowElement_v1::signalType
signal_t signalType() const
ATH_CHECK
#define ATH_CHECK
Definition: AthCheckMacros.h:40
SG::AuxElement::index
size_t index() const
Return the index of this element within its container.
Trk::Combined
@ Combined
Definition: TrackSummaryTool.h:32
xAOD::FlowElement_v1::chargedObject
const xAOD::IParticle * chargedObject(std::size_t i) const
Definition: FlowElement_v1.cxx:127
UFOTrackParticleThinning.h
DeMoScan.index
string index
Definition: DeMoScan.py:362
xAOD::FlowElement_v1::otherObject
const xAOD::IParticle * otherObject(std::size_t i) const
Definition: FlowElement_v1.cxx:196
entries
double entries
Definition: listroot.cxx:49
dqBeamSpot.nEntries
int nEntries
Definition: dqBeamSpot.py:73
DerivationFramework::UFOTrackParticleThinning::~UFOTrackParticleThinning
virtual ~UFOTrackParticleThinning()
DataVector::size
size_type size() const noexcept
Returns the number of elements in the collection.
xAOD::FlowElement_v1::otherObjects
std::vector< const xAOD::IParticle * > otherObjects() const
Definition: FlowElement_v1.cxx:163
xAOD::FlowElement_v1
A detector object made of other lower level object(s)
Definition: FlowElement_v1.h:25