ATLAS Offline Software
Loading...
Searching...
No Matches
MissingETComponentMap_v1.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2021 CERN for the benefit of the ATLAS collaboration
3*/
4
5
8
10
12
14#include "xAODBase/ObjectType.h"
15
16#include <iterator>
17#include <cstdio>
18
19using namespace xAOD;
20
22// Constructors and destructor //
24
31
40
43
45// Finders //
47
49{
50 const_iterator fCont(this->begin());
51 const_iterator lCont(this->end());
52 while ( fCont != lCont && (*fCont)->metObject() != pMET ) { ++fCont; }
53 return fCont;
54}
55
57{
58 iterator fCont(this->begin());
59 iterator lCont(this->end());
60 while ( fCont != lCont && (*fCont)->metObject() != pMET ) { ++fCont; }
61 return fCont;
62}
63
65{
66 const_iterator fCont(this->begin());
67 const_iterator lCont(this->end());
68 while (fCont != lCont && (*fCont)->metObject()->name() != name ) { ++fCont; }
69 return fCont;
70}
71
73{
74 iterator fCont(this->begin());
75 iterator lCont(this->end());
76 while ( fCont != lCont && (*fCont)->metObject()->name() != name ) { ++fCont; }
77 return fCont;
78}
79
81{
82 const_iterator fCont(this->begin());
83 const_iterator lCont(this->end());
84 while ( fCont != lCont && (*fCont)->metObject()->source() != src ) { ++fCont; }
85 return fCont;
86}
87
89{
90 iterator fCont(this->begin());
91 iterator lCont(this->end());
92 while ( fCont != lCont && (*fCont)->metObject()->source() != src ) { ++fCont; }
93 return fCont;
94}
95
97{
98 const_iterator fCont(this->begin());
99 const_iterator lCont(this->end());
100 while ( fCont != lCont && (*fCont)->metObject() != pMET ) { ++fCont; }
101 if ( fCont != lCont ) return (size_t)std::distance<const_iterator>(this->begin(),fCont);
103}
104
105size_t MissingETComponentMap_v1::findIndex(const std::string& name) const
106{
107 const_iterator fCont(this->begin());
108 const_iterator lCont(this->end());
109 while ( fCont != lCont && (*fCont)->metObject()->name() != name ) { ++fCont; }
110 if ( fCont != lCont ) return (size_t)std::distance<const_iterator>(this->begin(),fCont);
112}
113
115{
116 const_iterator fCont(this->begin());
117 const_iterator lCont(this->end());
118 while ( fCont != lCont && (*fCont)->metObject()->source() != src ) { ++fCont; }
119 if ( fCont != lCont ) return (size_t)std::distance<const_iterator>(this->begin(),fCont);
121}
122
124// Retrieve MET object //
126
128{
129 const_iterator fCont(this->begin());
130 const_iterator lCont(this->end());
131 while ( fCont != lCont && (*fCont)->metObject()->name() != name ) { ++fCont; }
132 if ( fCont != lCont ) return (*fCont)->metObject();
133 return nullptr;
134}
135
138
141
143// Internal MET object retrieval //
145
147{
148 const_iterator fCont(this->begin());
149 const_iterator lCont(this->end());
150 while ( fCont != lCont && (*fCont)->metObject()->source() != src ) { ++fCont; }
151 if ( fCont != lCont ) return (*fCont)->metObject();
152 return nullptr;
153}
154
156{
157 const_iterator fCont(this->begin());
158 const_iterator lCont(this->end());
159 while ( fCont != lCont && ( (*fCont)->metObject()->source() != src || (*fCont)->statusWord() != sw ) ) { ++fCont; }
160 if ( fCont != lCont ) return (*fCont)->metObject();
161 return nullptr;
162}
163
165{
166 const_iterator fCont(this->begin());
167 const_iterator lCont(this->end());
168 while ( fCont != lCont && !MissingETBase::Source::hasPattern((*fCont)->metObject()->source(),src) ) { ++fCont; }
169 if ( fCont != lCont ) return (*fCont)->metObject();
170 return nullptr;
171}
172
174{
175 const_iterator fCont(this->begin());
176 const_iterator lCont(this->end());
177 while ( fCont != lCont && ( !MissingETBase::Source::hasPattern((*fCont)->metObject()->source(),src) ||
178 !MissingETBase::Status::Tags::hasPattern((*fCont)->statusWord(),sw) ) ) { ++fCont; }
179 if ( fCont != lCont ) return (*fCont)->metObject();
180 return nullptr;
181}
182
184// Object usage management //
186
188{ MissingETBase::Types::object_vector_t objects; objects.push_back(pPart); return this->checkUsage(objects,p); }
189
191{
192 bool retVal(false);
193 switch ( p )
194 {
196 { if ( f_extractSignal<xAOD::Type::CaloCluster>(signals) ) { retVal = this->f_checkObjectUsage(signals,m_clusterLinks); } break; }
198 { if ( f_extractSignal<xAOD::Type::TrackParticle>(signals) ) { retVal = this->f_checkObjectUsage(signals,m_trackLinks); } break; }
200 {
201 MissingETBase::Types::object_vector_t ins(signals.begin(),signals.end());
202 size_t nSig(0);
204 { nSig = signals.size(); this->f_checkObjectUsage(signals,m_clusterLinks); }
206 { nSig += ins.size(); this->f_checkObjectUsage(ins,m_trackLinks); }
207 signals.insert(signals.end(),ins.begin(),ins.end());
208 retVal = signals.size() == nSig;
209 break;
210 }
212 { retVal = this->f_checkObjectUsage(signals,m_particleLinks); break; }
213 default:
214 { break; }
215 } // switch
216 return retVal;
217}
218
220{
221 if ( signals.empty() || signalLinks.empty() ) return false;
222 // loop on signals
223 size_t oldSize(signals.size());
224 MissingETBase::Types::object_vector_t::iterator fSig(signals.begin());
225 while ( fSig != signals.end() )
226 {
227 size_t fIdx((*fSig)->index());
228 if( fIdx >= signalLinks.size() ) {
229 // if invalid, something probably went wrong in reconstruction, so complain
230 // this should raise an out-of-range exception
231 printf("MissingETComponentMap::f_checkObjectUsage(...) - ERROR - searching for a signal with index (%zu) beyond signal container range (%zu).", fIdx, signalLinks.size());
232 printf("MissingETComponentMap::f_checkObjectUsage(...) - ERROR - this may indicate an inconsistency in the signal containers.");
233 }
234 // signal already used
235 if ( signalLinks.at(fIdx) != MissingETBase::Numerical::invalidLink() ) { fSig = signals.erase(fSig); }
236 // signal not yet used
237 else { ++fSig; }
238 } // loop on signals
239 return oldSize != signals.size();
240}
241
243{
244 if ( objects.empty() ) { return false; }
245 //
246 size_t oldSize(objects.size());
247 MissingETBase::Types::object_vector_t::iterator fObj(objects.begin());
248 while ( fObj != objects.end() )
249 { if ( physicsLinks.find(*fObj) != physicsLinks.end() ) { fObj = objects.erase(fObj); } else { ++fObj; } }
250 return objects.size() != oldSize;
251}
252
254// Add objects //
256
258{
259 bool flag(false);
260 switch ( p )
261 {
263 { flag = this->setClusters(pMET,pPart,signalList); break; }
265 { flag = this->setTracks(pMET,pPart,signalList); break; }
267 { bool cFlg(this->setClusters(pMET,pPart,signalList)); bool tFlg(this->setTracks(pMET,pPart,signalList)); flag = cFlg || tFlg; break; }
269 { flag = this->setObjects(pMET,pPart,signalList); break; }
270 default:
271 { break; }
272 }
273 return flag;
274}
275
277{
278 // find all clusters
279 // check input: MissingET object pointer
280 size_t cIdx(this->findIndex(pMET)); if ( cIdx == MissingETBase::Numerical::invalidIndex() ) { return false; }
281 // check input: contributing particle pointer
282 size_t pIdx(this->at(cIdx)->findIndex(pPart)); if ( pIdx == MissingETBase::Numerical::invalidIndex() ) { return false; }
283 indexedlink_t ld(cIdx,pIdx);
284 // make sure cache is not cleared
285 bool firstCluster = true;
286 MissingETBase::Types::object_vector_t::const_iterator fSig(signalList.begin());
287 MissingETBase::Types::object_vector_t::const_iterator lSig(signalList.end());
288 for ( ; fSig != lSig; ++fSig ) {
289 if((*fSig)->type()==xAOD::Type::CaloCluster) {
290 if(firstCluster) {
291 firstCluster = false;
292 if ( m_clusterLinks.empty() ) {
293 const IParticleContainer* pCont(static_cast<const IParticleContainer*>((*fSig)->container()));
294 // if ( pCont == 0 )
295 // { printf("MissingETComponentMap::setClusters(...) - WARNING - cannot access cluster container (invalid NULL pointer), use %i words\n",(int)nClus); }
296 // else
298 } // empty cluster link list
299 } //first cluster
300 // all clusters refer to the same MET contribution
301 m_clusterLinks[(*fSig)->index()] = ld;
302 } // extract CaloClusters
303 } // loop over signal list
304
305 return !firstCluster; // true if we processed any clusters
306}
307
309{
310 // find all clusters
311 // check input: MissingET object pointer
312 size_t cIdx(this->findIndex(pMET)); if ( cIdx == MissingETBase::Numerical::invalidIndex() ) { return false; }
313 // check input: contributing particle pointer
314 size_t pIdx(this->at(cIdx)->findIndex(pPart)); if ( pIdx == MissingETBase::Numerical::invalidIndex() ) { return false; }
315 indexedlink_t ld(cIdx,pIdx);
316 // make sure cache is not cleared
317 bool firstTrack = true;
318 MissingETBase::Types::object_vector_t::const_iterator fSig(signalList.begin());
319 MissingETBase::Types::object_vector_t::const_iterator lSig(signalList.end());
320 for ( ; fSig != lSig; ++fSig ) {
321 if((*fSig)->type()==xAOD::Type::TrackParticle) {
322 if(firstTrack) {
323 firstTrack = false;
324 if ( m_trackLinks.empty() ) {
325 const IParticleContainer* pCont(static_cast<const IParticleContainer*>((*fSig)->container()));
326 // if ( pCont == 0 )
327 // { printf("MissingETComponentMap::setTracks(...) - WARNING - cannot access track container (invalid NULL pointer), use %i words\n",(int)nTrack); }
328 // else
330 } // empty track link list
331 } // first track
332 // all tracks refer to the same MET contribution
333 m_trackLinks[(*fSig)->index()] = ld;
334 } // extract TrackParticles
335 } // loop over signal list
336
337 return !firstTrack; // true if we processed any clusters
338}
339
341{
342 // check input: MissingET object pointer
343 size_t cIdx(this->findIndex(pMET)); if ( cIdx == MissingETBase::Numerical::invalidIndex() ) { return false; }
344 // loop input objects
345 size_t oldSize(m_particleLinks.size());
346 MissingETBase::Types::object_vector_t::const_iterator fObj(objects.begin());
347 MissingETBase::Types::object_vector_t::const_iterator lObj(objects.end());
348 for ( ; fObj != lObj; ++fObj ) { size_t pIdx(this->at(cIdx)->findIndex(pPart)); m_particleLinks[*fObj] = indexedlink_t(cIdx,pIdx); }
349 //
350 return oldSize < m_particleLinks.size();
351}
352
354// Cache handlers //
356
358{ signalLinks.clear(); if ( reserve > 0 ) { signalLinks.reserve(reserve); } }
359
362
367
368size_t MissingETComponentMap_v1::getComponentIndex(const IParticle* pPart) const { return f_getIndex<0>(pPart); }
369size_t MissingETComponentMap_v1::getObjectIndex(const IParticle* pPart) const { return f_getIndex<1>(pPart); }
370// {
371// // check on cluster signal
372// const CaloCluster* pClus(dynamic_cast<const CaloCluster*>(pPart));
373// if ( pClus != 0 ) { return pClus->index() < m_clusterLinks.size() ? m_clusterLinks.at(pClus->index()).get<1>() : MissingETBase::Numerical::invalidIndex(); }
374// // check on track index
375// const TrackParticle* pTrk(dynamic_cast<const TrackParticle*>(pPart));
376// if ( pTrk != 0 ) { return pTrk->index() < m_trackLinks.size() ? m_trackLinks.at(pTrk->index()).get<1>() : MissingETBase::Numerical::invalidIndex(); }
377// // check on physics objects
378// particle_map_t::const_iterator fPart(m_particleLinks.find(pPart));
379// return fPart != m_particleLinks.end() ? (fPart->second).get<1>() : MissingETBase::Numerical::invalidIndex();
380// }
381
382//bool MissingETComponent_v1::addLink(const IParticle* pPart,MissingETComponent* pContrib,MissingETBase::Types::bitmask_t status)
383//{
384 // check if cluster signal object
385 // CaloCluster* pClus = dynamic_cast<const CaloCluster*>(pPart);
386 // if ( pClus != 0 ) return this->addCluster(pClus,pContrib,status);
387 // check if track signal object
388 // TrackParticle* pTrk = dynamic_cast<const TrackParticle*>(pPart);
389 // if ( pTrk != 0 ) return this->addTrack(pTrk,pContrib,status);
390 // build link key and data
391// particle_key_t key(pPart,status);
392// contrib_idx_t idx = pContrib->index();
393 // add to map
394// particle_map_t::iterator fLnk(m_partMETLookup.find(key));
395// if ( fLnk == m_partMETLookup.end() ) { m_partMETLookup.insert(particle_map_t::value_type(key,idx)); }
396// else { fLnk->second = idx; }
397// return true;
398//}
399
400//bool MissingETComponent_v1::addCluster(const CaloCluster* pClus,MissingETComponent* pContrib,MissingETBase::Types::bitmask_t /* status */)
401//{
402// if ( m_clusterIndices.empty() ) { m_clusterIndices.resize(pClus->container()->size(),size_t(-1)); }
403 //
404// if ( !this->checkCluster(pClus) ) { m_clusterIndices[pClus->index()] = pContrib->index(); return true; }
405// else { return false; }
406//}
407
408//bool MissingETComponent_v1::addTrack(const TrackParticle* pTrack,MissingETComponent* pContrib,MissingETBase::Types::bitmask_ty /* status */ )
409//{
410// if ( m_trackIndices.empty() ) { m_trackIndices.resize(pTrack->container()->size(),size_t(-1)); }
411 //
412// if ( !this->checkTrack(pTrack) ) { m_trackIndices[pTrack->index()] = pContrib->index(); return true; }
413// else { return false; }
414//}
415
416//bool MissingETComponent_v1::checkCluster(const CaloCluster* pClus) const
417//{ return pClus->index() < m_clusterIndices.size() && m_clusterIndices.at(pClus->index()) != size_t(-1); }
418
419//bool MissingETComponenty_v1::checkTrack(const TrackParticle* pTrk) const
420//{ return pTrk->index() < m_trackIndices.size() && m_trackIndices.at(pTrk->index()) != size_t(-1); }
DataModel_detail::const_iterator< DataVector > const_iterator
Definition DataVector.h:838
const MissingETComponent_v1 * at(size_type n) const
DataModel_detail::iterator< DataVector > iterator
Definition DataVector.h:842
DataVector(SG::OwnershipPolicy ownPolicy=SG::OWN_ELEMENTS, SG::IndexTrackingPolicy trackIndices=SG::DEFAULT_TRACK_INDICES)
const_iterator end() const noexcept
const_iterator begin() const noexcept
size_type size() const noexcept
Returns the number of elements in the collection.
Class providing the definition of the 4-vector interface.
bool checkUsage(const IParticle *pPart, MissingETBase::UsageHandler::Policy p=MissingETBase::UsageHandler::OnlyCluster) const
Check if a given object is already used in MET.
particle_map_t m_particleLinks
Store for linked physics object information lookup.
const MissingET * retrieveMissingET(const std::string &name) const
Retrieve MissingET object by name.
bool setTracks(const MissingET *pMET, const IParticle *pPart, const MissingETBase::Types::object_vector_t &signalList)
void f_setupLookupCache(signal_vector_t &signalLinks, size_t reserve)
Set up the signal object lookup.
bool f_checkObjectUsage(MissingETBase::Types::object_vector_t &sig, const signal_vector_t &signalLinks) const
Check signal object usage.
bool addObjects(const MissingET *pMET, const IParticle *pPart, const MissingETBase::Types::object_vector_t &signalList, MissingETBase::UsageHandler::Policy p=MissingETBase::UsageHandler::OnlyCluster)
signal_vector_t m_clusterLinks
Store for linked cluuster signal information lookup.
MissingETComponentMap_v1(SG::OwnershipPolicy own=SG::OWN_ELEMENTS, SG::IndexTrackingPolicy trackIndices=SG::DEFAULT_TRACK_INDICES)
Default constructor.
std::vector< indexedlink_t > signal_vector_t
Indexed list type for signal object link locations.
bool setClusters(const MissingET *pMET, const IParticle *pPart, const MissingETBase::Types::object_vector_t &signalList)
signal_vector_t m_trackLinks
Store for linked track signal information lookup.
void f_clearLookupCache()
Clear the lookup cache.
const_iterator find(const MissingET *pMET) const
Find MET object referenced by pointer.
bool f_extractSignal(MissingETBase::Types::object_vector_t &sig) const
Signal type extractor.
size_t getObjectIndex(const IParticle *pPart) const
size_t getComponentIndex(const IParticle *pPart) const
const MissingET * f_retrieveMissingETIncl(MissingETBase::Types::bitmask_t src) const
void f_fillLookupCache()
Fill the lookup cache from the composition map data content.
size_t findIndex(const MissingET *pMET) const
MissingETBase::Types::indexedlink_t indexedlink_t
Type for the description of the link locations.
bool setObjects(const MissingET *pMET, const IParticle *pPart, const MissingETBase::Types::object_vector_t &objectList)
const MissingET * f_retrieveMissingETExcl(MissingETBase::Types::bitmask_t src) const
virtual ~MissingETComponentMap_v1()
Base class destructor.
size_t f_getIndex(const IParticle *pPart) const
std::map< particle_key_t, indexedlink_t > particle_map_t
Map type for physics object.
MET component descriptor contains object links and corresponding parameters.
std::vector< const xAOD::IParticle * > object_vector_t
Vector of object type.
uint64_t bitmask_t
Type for status word bit mask.
@ OnlyCluster
CaloCluster based only.
@ TrackCluster
Both cluster and track based.
OwnershipPolicy
@ TrackParticle
The object is a charged track particle.
Definition ObjectType.h:43
@ CaloCluster
The object is a calorimeter cluster.
Definition ObjectType.h:39
ICaloAffectedTool is abstract interface for tools checking if 4 mom is in calo affected region.
MissingET_v1 MissingET
Version control by type defintion.
DataVector< IParticle > IParticleContainer
Simple convenience declaration of IParticleContainer.
static size_t invalidIndex()
Access invalid index indicator.
static Types::indexedlink_t invalidLink()
Access invaalid link tag.
static bool hasPattern(E bits, F mask)
Generic check for given pattern.
static bool hasPattern(Types::bitmask_t sw, T pat)