ATLAS Offline Software
Loading...
Searching...
No Matches
MetAssociation.h
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2026 CERN for the benefit of the ATLAS collaboration
3*/
4
6
7
8#ifndef COLUMNAR_MET_MET_ASSOCIATION_H
9#define COLUMNAR_MET_MET_ASSOCIATION_H
10
13#include <ColumnarJet/JetDef.h>
20
21namespace columnar
22{
28 template<typename IteratorType,class FunctionType>
29 class FilterRange;
30
31 template<typename IteratorType,class FunctionType>
33 {
34 IteratorType m_iterator;
36 public:
37 FilterRangeIterator (const IteratorType& val_iterator, const FilterRange<IteratorType,FunctionType> *val_range) noexcept
38 : m_iterator (val_iterator), m_range (val_range)
39 {}
40
41 auto operator * () const noexcept {
42 return *m_iterator;}
43
45 ++ m_iterator;
46 while (m_range && m_iterator != m_range->m_end && !m_range->m_filter (*m_iterator))
47 ++m_iterator;
48 return *this;
49 }
50
51 bool operator == (const FilterRangeIterator& that) const noexcept {
52 return m_iterator == that.m_iterator;}
53 bool operator != (const FilterRangeIterator& that) const noexcept {
54 return m_iterator != that.m_iterator;}
55 };
56
57 template<typename IteratorType,class FunctionType>
58 class FilterRange final
59 {
60 friend class FilterRangeIterator<IteratorType,FunctionType>;
61 IteratorType m_begin;
62 IteratorType m_end;
63 FunctionType m_filter;
64
65 public:
66 FilterRange (IteratorType begin, IteratorType end, FunctionType&& filter)
67 : m_begin (begin), m_end (end), m_filter (std::move (filter))
68 {
69 while (m_begin != m_end && !m_filter (*m_begin))
70 ++m_begin;
71 }
72 FilterRange (FilterRange&&) = default;
73 FilterRange (const FilterRange&) = default;
76
79 bool empty () const noexcept { return m_begin == m_end; }
80 };
81
82
83
84 template<typename CM = ColumnarModeDefault> class MetAssociationHelper;
85
86
87
90 template<typename CM = ColumnarModeDefault> class MetAssocationAccessors final
91 {
94 public:
95
99 static constexpr bool useMissingETAssociationHelper = std::is_same_v<CM,ColumnarModeXAOD>;
100
104
106
108 : calpx (columnarBase, "calpx"),
109 calpy (columnarBase, "calpy"),
110 calpz (columnarBase, "calpz"),
111 cale (columnarBase, "cale"),
112 calsumpt (columnarBase, "calsumpt"),
113 calkeyAcc (columnarBase, "calkey"),
114 trkpx (columnarBase, "trkpx"),
115 trkpy (columnarBase, "trkpy"),
116 trkpz (columnarBase, "trkpz"),
117 trke (columnarBase, "trke"),
118 trksumpt (columnarBase, "trksumpt"),
119 trkkeyAcc (columnarBase, "trkkey"),
120 jettrkpx (columnarBase, "jettrkpx"),
121 jettrkpy (columnarBase, "jettrkpy"),
122 jettrkpz (columnarBase, "jettrkpz"),
123 jettrke (columnarBase, "jettrke"),
124 jettrksumpt (columnarBase, "jettrksumpt"),
125 objectLinks (columnarBase, "objectLinks"),
126 jetLink (columnarBase, "jetLink"),
127 isMisc (columnarBase, "isMisc"),
128 overlapIndicesAcc (columnarBase, "overlapIndices"),
129 overlapTypesAcc (columnarBase, "overlapTypes"),
130 objectTypeAcc (columnarBase, "objectType")
131 {
132 if constexpr (!useMissingETAssociationHelper)
133 useObjectFlagsAcc = ColumnUpdater<MetAssociationDef,bitmask_t,CM> (columnarBase, "useObjectFlags");
134 }
135
138
145
152
158
162
164
166
169
171
173
174
175
178
179 [[nodiscard]] static bitmask_t getObjMask(size_t objIndex) {
180 if (objIndex == invalidIndex || objIndex >= 64) {
181 return bitmask_t{0};
182 }
183 return bitmask_t{1} << objIndex;
184 }
185
186 [[nodiscard]] std::size_t sizeCal(AssocId assoc) const {
187 return cale(assoc).size();}
188
189 [[nodiscard]] decltype(auto) calkey(AssocId assoc) const {
190 return calkeyAcc(assoc);}
191
192 [[nodiscard]] bitmask_t calkey (AssocId assoc, size_t keyIdx) const {
193 return keyIdx != invalidIndex && keyIdx < calkeyAcc(assoc).size() ? calkeyAcc(assoc)[keyIdx] : invalidIndex; }
194
195 [[nodiscard]] ConstVec calVec(AssocId assoc, const xAOD::IParticle* pPart) const {
196 return calVec(assoc, PartId(*pPart)); }
197 template<ContainerIdConcept CI>
198 [[nodiscard]] ConstVec calVec(AssocId assoc, ObjectId<CI,CM> pPart) const {
199 constvec_t totalvec;
200 for (size_t iKey = 0; iKey < this->sizeCal(assoc); iKey++) {
201 if (this->calkey(assoc, iKey) & getObjMask(this->findIndex(assoc,pPart)))
202 totalvec+=this->calVec(assoc, iKey);
203 }
204 return totalvec;
205 }
206
207 [[nodiscard]] ConstVec calVec(AssocId assoc, std::size_t keyIdx) const {
208 return keyIdx != invalidIndex && keyIdx < this->sizeCal(assoc)
209 ? constvec_t(calpx(assoc)[keyIdx],calpy(assoc)[keyIdx],calpz(assoc)[keyIdx],cale(assoc)[keyIdx],calsumpt(assoc)[keyIdx])
211
212
213 [[nodiscard]] std::size_t sizeTrk (AssocId assoc) const {
214 return trke(assoc).size();}
215
216 [[nodiscard]] decltype(auto) trkkey(AssocId assoc) const {
217 return trkkeyAcc(assoc);}
218
219 [[nodiscard]] bitmask_t trkkey(AssocId assoc, size_t keyIdx) const {
220 return keyIdx != invalidIndex && keyIdx < this->sizeTrk(assoc) ? this->trkkey(assoc)[keyIdx] : invalidIndex; }
221
222 [[nodiscard]] ConstVec trkVec(AssocId assoc, const xAOD::IParticle* pPart) const {
223 return trkVec(assoc, PartId(*pPart)); }
224 template<ContainerIdConcept CI>
225 [[nodiscard]] ConstVec trkVec(AssocId assoc, ObjectId<CI,CM> pPart) const {
226 constvec_t totalvec;
227 for (size_t iKey = 0; iKey < this->sizeTrk(assoc); iKey++) {
228 if (this->trkkey(assoc,iKey) & getObjMask(this->findIndex(assoc,pPart)))
229 totalvec+=this->trkVec(assoc,iKey);
230 }
231 return totalvec; }
232 [[nodiscard]] ConstVec trkVec(AssocId assoc, ObjectLinkType pPart) const {
233 constvec_t totalvec;
234 for (size_t iKey = 0; iKey < this->sizeTrk(assoc); iKey++) {
235 if (this->trkkey(assoc,iKey) & getObjMask(this->findIndex(assoc,pPart)))
236 totalvec+=this->trkVec(assoc,iKey);
237 }
238 return totalvec; }
239
240 [[nodiscard]] ConstVec trkVec(AssocId assoc, size_t keyIdx) const {
241 return keyIdx != invalidIndex && keyIdx < this->sizeTrk(assoc)
242 ? constvec_t(this->trkpx(assoc)[keyIdx],this->trkpy(assoc)[keyIdx],this->trkpz(assoc)[keyIdx],this->trke(assoc)[keyIdx],this->trksumpt(assoc)[keyIdx])
244
245 [[nodiscard]] ConstVec jetTrkVec(AssocId assoc) const {
246 return constvec_t(this->jettrkpx(assoc),this->jettrkpy(assoc),this->jettrkpz(assoc),this->jettrke(assoc),this->jettrksumpt(assoc)); }
247
248 [[nodiscard]] size_t size(AssocId assoc) const {
249 return this->objectLinks(assoc).size(); }
250
251 [[nodiscard]] auto objects(AssocId assoc) const {
252 return this->objectLinks(assoc);}
253
254 [[nodiscard]] auto overlapIndices(AssocId assoc) const {
255 return overlapIndicesAcc(assoc); }
256
257 [[nodiscard]] auto overlapIndices(AssocId assoc,const xAOD::IParticle* pPart) const {
258 return this->overlapIndices(assoc, ParticleId(*pPart)); }
259 [[nodiscard]] auto overlapIndices(AssocId assoc,PartId pPart) const {
260 return this->overlapIndices(assoc, this->findIndex(assoc, pPart)); }
261
262 [[nodiscard]] std::span<const std::size_t> overlapIndices(AssocId assoc,std::size_t objIdx) const {
263 if (objIdx == invalidIndex) return std::span<const std::size_t>();
264 auto indices = overlapIndicesAcc(assoc);
265 return objIdx < indices.size() ? indices[objIdx] : std::span<const std::size_t>(); }
266
267 [[nodiscard]] std::span<const unsigned char> overlapTypes (AssocId assoc, std::size_t objIdx) const {
268 if (objIdx == invalidIndex) return std::span<const unsigned char>();
269 auto types = this->overlapTypesAcc(assoc);
270 return objIdx < types.size() ? types[objIdx] : std::span<const unsigned char>(); }
271
272 [[nodiscard]] std::size_t findIndex(AssocId assoc,const xAOD::IParticle* pPart) const {
273 return findIndex(assoc, ParticleId(*pPart));}
274 template<ContainerIdConcept CI>
275 [[nodiscard]] std::size_t findIndex(AssocId assoc,ObjectId<CI,CM> pPart) const {
276 std::size_t idx = 0;
277 for (auto link : this->objectLinks(assoc)) {
278 if (link == pPart)
279 return idx;
280 ++idx;
281 }
282 return invalidIndex;
283 }
284 [[nodiscard]] std::size_t findIndex(AssocId assoc,ObjectLinkType pPart) const {
285 std::size_t idx = 0;
286 for (auto link : this->objectLinks(assoc)) {
287 if (link == pPart)
288 return idx;
289 ++idx;
290 }
291 return invalidIndex;
292 }
293
294 [[nodiscard]] bool hasAlternateConstVec(AssocId assoc) const {
295 if (isMisc(assoc)) return false;
296 auto refJet = this->refJet(assoc);
297 if (!refJet) return false;
298 return containsPhysics(assoc,refJet.value());}
299
301 xAOD::JetFourMom_t newvec;
302 constvec_t newpt;
303 auto refJet = this->refJet(assoc);
304 size_t newptIndex = refJet ? findIndex(assoc,refJet.value()) : invalidIndex;
305 if (newptIndex == invalidIndex) return newvec;
306 bitmask_t mask = (bitmask_t)1 << newptIndex;
307
308 for (size_t iKey = 0; iKey < sizeCal(assoc); iKey++) if (mask & calkey(assoc)[iKey]) newpt += calVec(assoc,iKey);
309 newvec.SetPxPyPzE(newpt.cpx(),newpt.cpy(),newpt.cpz(),newpt.ce());
310 return newvec;
311 }
312
313 [[nodiscard]] auto refJet(AssocId assoc) const {
314 return this->jetLink(assoc); }
315
316 [[nodiscard]] bool containsPhysics(AssocId assoc,JetId pPhys) const {
317 for(auto link : this->objectLinks(assoc)) {
318 if(link == pPhys) {
319 return true;
320 }
321 }
322 return false;}
323
324
326 // I don't know if it matters, but in the original xAOD code the
327 // iteration is done in reverse order, so I'm doing the same here
328 // as well.
329 for (auto assocIter = map.rbegin(); assocIter != map.rend(); ++assocIter)
330 {
331 if (isMisc(*assocIter))
332 return *assocIter;
333 }
334 // If we reach here, no misc association was found.
335 return OptAssocId{};}
336 };
337
338
339
341 template<typename CM> class MetAssociationHelper final
342 {
345 public:
346
352
356
357 static constexpr bool useMissingETAssociationHelper = std::is_same_v<CM,ColumnarModeXAOD>;
359
360
362 : m_xaodHelper (&val_helper), m_map (*val_helper.map()), m_accessors (&val_accessors)
363 {}
364
368
369
371 if constexpr (useMissingETAssociationHelper)
372 return *m_xaodHelper;
373 else
374 throw std::logic_error ("can't call xAOD function in columnar mode");}
375
376
378 [[nodiscard]] ObjectRange<MetAssociationDef,CM> map () const noexcept {
379 return m_map;}
380
381
384
385 [[nodiscard]] bool objSelected (const xAOD::IParticle* obj) const {
386 return objSelected(PartId(*obj));}
387 template<ContainerIdConcept CI>
388 [[nodiscard]] bool objSelected (ObjectId<CI,CM> obj) const {
389 for (decltype(auto) assoc : getAssociations(obj)) if(objSelected(assoc,obj)) return true;
390 return false;}
391 [[nodiscard]] bool objSelected (ObjectLinkType obj) const {
392 for (decltype(auto) assoc : getAssociations(obj)) if(objSelected(assoc,obj)) return true;
393 return false;}
394 [[nodiscard]] bool objSelected(AssocId assocId, std::size_t objIdx) const {
395 if constexpr (useMissingETAssociationHelper)
396 return m_xaodHelper->objSelected(&assocId.getXAODObject(), objIdx);
397 else {
398 if (objIdx >= sizeof(bitmask_t)*8) return false;
399 return bool(m_accessors->useObjectFlagsAcc(assocId) & (static_cast<MissingETBase::Types::bitmask_t>(1)<<objIdx));
400 }
401 }
402 [[nodiscard]] bool objSelected(AssocId assocId, const xAOD::IParticle* pPart) const {
403 return objSelected(assocId, PartId(*pPart));}
404 template<ContainerIdConcept CI>
405 [[nodiscard]] bool objSelected(AssocId assocId, ObjectId<CI,CM> pPart) const {
406 return objSelected(assocId, m_accessors->findIndex(assocId,pPart));}
407 [[nodiscard]] bool objSelected(AssocId assocId, ObjectLinkType pPart) const {
408 return objSelected(assocId, m_accessors->findIndex(assocId,pPart));}
409
410
411 [[nodiscard]] bitmask_t getObjSelectionFlags(AssocId assocId) const {
412 if constexpr (useMissingETAssociationHelper)
413 return m_xaodHelper->getObjSelectionFlags(&assocId.getXAODObject());
414 else
415 return m_accessors->useObjectFlagsAcc(assocId);
416 }
417
418
419 void setObjSelectionFlag(AssocId assocId, size_t objIdx, bool status) {
420 if constexpr (useMissingETAssociationHelper)
421 m_xaodHelper->setObjSelectionFlag(&assocId.getXAODObject(), objIdx, status);
422 else
423 {
424 if (objIdx >= sizeof(bitmask_t)*8) return;
425 bitmask_t mask = static_cast<bitmask_t>(1) << objIdx;
426 if (status) m_accessors->useObjectFlagsAcc(assocId) |= mask;
427 else m_accessors->useObjectFlagsAcc(assocId) &= ~mask;
428 }
429 }
430 void setObjSelectionFlag(AssocId assocId, const xAOD::IParticle* pPart, bool status) {
431 setObjSelectionFlag(assocId,PartId(*pPart),status);}
432 template<ContainerIdConcept CI>
433 void setObjSelectionFlag(AssocId assocId, ObjectId<CI,CM> pPart, bool status) {
434 setObjSelectionFlag(assocId,m_accessors->findIndex(assocId,pPart),status);}
435 void setObjSelectionFlag(AssocId assocId, const ObjectLinkType& pPart, bool status) {
436 setObjSelectionFlag(assocId,m_accessors->findIndex(assocId,pPart),status);}
437
438
439
442
443 [[nodiscard]] bool hasOverlaps(AssocId assocId, size_t objIdx,MissingETBase::UsageHandler::Policy p) const {
444 if ( objIdx == invalidIndex ) return false;
445 auto indices = m_accessors->overlapIndices(assocId, objIdx);
446 auto types = m_accessors->overlapTypes(assocId, objIdx);
447 for(size_t iOL=0; iOL<indices.size(); ++iOL) {
448 if(objSelected(assocId, indices[iOL])) {
449 // printf("Test object %lu for overlaps: OL type %i\n",indices[iOL],(int)types[iOL]);
450 switch(p) {
452 if((types[iOL] & 1<<xAOD::Type::CaloCluster) || (types[iOL] & 1<<xAOD::Type::TrackParticle)) {break;}
453 else {continue;}
455 if(types[iOL] & 1<<xAOD::Type::CaloCluster) {break;}
456 else {continue;}
458 if(types[iOL] & 1<<xAOD::Type::TrackParticle) {break;}
459 else {continue;}
461 if(types[iOL] & 1<<xAOD::Type::ParticleFlow) {break;}
462 else {continue;}
464 if(types[iOL] & 1) {break;}
465 else {continue;}
467 if(types[iOL] & ~(1<<xAOD::Type::TrackParticle)) {break;}
468 else {continue;}
469 default: continue;
470 }
471 return true;
472 }
473 }
474 return false;
475 }
476
478 return selectIfNoOverlaps(PartId(*obj), p);}
480 auto assocs = getAssociations(obj);
481 bool overlaps(false);
482 for(decltype(auto) assoc : assocs) overlaps |= hasOverlaps(assoc,m_accessors->findIndex(assoc,obj),p);
483 if (overlaps) return false;
484 for(decltype(auto) assoc : assocs) setObjSelectionFlag(assoc,obj,true);
485 return true;}
486
487
488
491
492 [[nodiscard]] OptAssocId getJetAssociation(const xAOD::Jet* pJet) const {
493 return getJetAssociation(JetId(*pJet));}
494 [[nodiscard]] OptAssocId getJetAssociation(JetId pJet) const {
495 // this uses a linear search, which is the same as the original
496 // xAOD code, but was flagged there as potentially inefficient
497 for (auto assoc : m_map) {
498 if (m_accessors->jetLink(assoc) == pJet) {
499 return assoc;
500 }
501 }
502 return std::nullopt;}
503
504 [[nodiscard]] auto getAssociations(const xAOD::IParticle* pPart) const {
505 return getAssociations(PartId(*pPart));}
506 template<ContainerIdConcept CI>
507 [[nodiscard]] auto getAssociations(ObjectId<CI,CM> pPart) const {
508 // In the original xAOD code, this returned a `std::vector` by
509 // value. In columnar code we prefer not to pass vectors by
510 // value, so we return a filtered range instead.
511 return FilterRange (m_map.begin(), m_map.end(),
512 [accessors = m_accessors, pPart] (AssocId assoc) {
513 return (accessors->findIndex(assoc,pPart) != invalidIndex);});}
514
515 [[nodiscard]] auto getMiscAssociation() const {
516 return m_accessors->getMiscAssociation(m_map);}
517
518
521
523 return getConstVec(PartId(*pPart), p);}
525 constvec_t totalvec;
526 for (decltype(auto) assoc : getAssociations(pPart)) {
528 totalvec += m_accessors->trkVec(assoc, pPart);
529 } else {
530 totalvec += m_accessors->calVec(assoc, pPart);
531 }
532 }
533 return totalvec;}
534
535 [[nodiscard]] ConstVec overlapCalVec(AssocId assoc) const {
536 constvec_t calvec;
537 for (size_t iKey = 0; iKey < m_accessors->sizeCal(assoc); iKey++) {
538 bool selector = (getObjSelectionFlags(assoc) & m_accessors->calkey(assoc)[iKey]) ? !m_accessors->isMisc(assoc) : m_accessors->isMisc(assoc);
539 if (selector) calvec+=m_accessors->calVec(assoc,iKey);
540 }
541 return calvec;}
542
543 [[nodiscard]] ConstVec overlapTrkVec(AssocId assoc) const {
544 constvec_t trkvec;
545 for (size_t iKey = 0; iKey < m_accessors->sizeTrk(assoc); iKey++) {
546 bool selector = (getObjSelectionFlags(assoc) & m_accessors->trkkey(assoc)[iKey]) ? !m_accessors->isMisc(assoc) : m_accessors->isMisc(assoc);
547 if (selector) trkvec+=ConstVec(m_accessors->trkpx(assoc)[iKey],m_accessors->trkpy(assoc)[iKey],m_accessors->trkpz(assoc)[iKey],m_accessors->trke(assoc)[iKey],m_accessors->trksumpt(assoc)[iKey]);
548 }
549 return trkvec;
550 }
551
552
553
556 private:
557
561
564
567 };
568
569
570
571 template<typename CM>
577
578 template<typename CM>
584}
585
586#endif
std::vector< std::vector< int64_t > > indices
static const std::vector< std::string > types
the base class for all columnar components
FilterRangeIterator & operator++() noexcept
bool operator==(const FilterRangeIterator &that) const noexcept
FilterRangeIterator(const IteratorType &val_iterator, const FilterRange< IteratorType, FunctionType > *val_range) noexcept
const FilterRange< IteratorType, FunctionType > * m_range
bool operator!=(const FilterRangeIterator &that) const noexcept
auto operator*() const noexcept
a simple range adaptor that filters the elements of a range
FilterRange & operator=(FilterRange &&)=default
FilterRange(IteratorType begin, IteratorType end, FunctionType &&filter)
auto begin() const noexcept
FilterRange(FilterRange &&)=default
friend class FilterRangeIterator< IteratorType, FunctionType >
auto end() const noexcept
FilterRange(const FilterRange &)=default
bool empty() const noexcept
the accessors MetAssociationHelper needs to implement its operations
auto refJet(AssocId assoc) const
ColumnAccessor< MetAssociationDef, std::vector< float >, CM > calpy
MissingETBase::Types::bitmask_t bitmask_t
ColumnAccessor< MetAssociationDef, std::vector< float >, CM > trke
auto objects(AssocId assoc) const
std::span< const unsigned char > overlapTypes(AssocId assoc, std::size_t objIdx) const
ColumnAccessor< MetAssociationDef, float, CM > jettrkpy
std::size_t sizeCal(AssocId assoc) const
ColumnAccessor< MetAssociationDef, std::vector< float >, CM > trkpz
ColumnAccessor< MetAssociationDef, char, CM > isMisc
OptAssocId getMiscAssociation(MetAssociationRange map) const
ConstVec trkVec(AssocId assoc, ObjectLinkType pPart) const
ColumnAccessor< MetAssociationDef, float, CM > jettrkpz
bitmask_t trkkey(AssocId assoc, size_t keyIdx) const
MetAssociationHelper< CM > operator()(xAOD::MissingETAssociationHelper &helper) const
ColumnAccessor< MetAssociationDef, std::vector< std::vector< std::size_t > >, CM > overlapIndicesAcc
ColumnAccessor< MetAssociationDef, std::vector< float >, CM > trkpy
xAOD::JetFourMom_t getAlternateConstVec(AssocId assoc) const
xAOD::MissingETAssociation::ConstVec ConstVec
bitmask_t calkey(AssocId assoc, size_t keyIdx) const
decltype(auto) trkkey(AssocId assoc) const
ColumnAccessor< MetAssociationDef, float, CM > jettrkpx
ColumnAccessor< MetAssociationDef, std::vector< float >, CM > calpx
ColumnAccessor< MetAssociationDef, std::vector< bitmask_t >, CM > trkkeyAcc
std::size_t findIndex(AssocId assoc, const xAOD::IParticle *pPart) const
ColumnAccessor< MetAssociationDef, std::vector< float >, CM > calpz
ColumnAccessor< MetAssociationDef, float, CM > jettrksumpt
std::size_t findIndex(AssocId assoc, ObjectLinkType pPart) const
ConstVec calVec(AssocId assoc, const xAOD::IParticle *pPart) const
static bitmask_t getObjMask(size_t objIndex)
ConstVec calVec(AssocId assoc, std::size_t keyIdx) const
bool hasAlternateConstVec(AssocId assoc) const
static constexpr bool useMissingETAssociationHelper
ConstVec jetTrkVec(AssocId assoc) const
ConstVec calVec(AssocId assoc, ObjectId< CI, CM > pPart) const
ObjectLink< ObjectLinkCI, CM > ObjectLinkType
ColumnUpdater< MetAssociationDef, bitmask_t, CM > useObjectFlagsAcc
MetHelpers::ObjectTypeAccessor< ParticleDef > objectTypeAcc
MissingETBase::Types::constvec_t constvec_t
std::span< const std::size_t > overlapIndices(AssocId assoc, std::size_t objIdx) const
ColumnAccessor< MetAssociationDef, std::vector< float >, CM > calsumpt
ConstVec trkVec(AssocId assoc, size_t keyIdx) const
std::size_t sizeTrk(AssocId assoc) const
ColumnAccessor< MetAssociationDef, std::vector< float >, CM > trksumpt
auto overlapIndices(AssocId assoc) const
MetAssocationAccessors(ColumnarTool< CM > &columnarBase)
ColumnAccessor< MetAssociationDef, float, CM > jettrke
ColumnAccessor< MetAssociationDef, std::vector< float >, CM > trkpx
ColumnAccessor< MetAssociationDef, std::vector< std::vector< unsigned char > >, CM > overlapTypesAcc
decltype(auto) calkey(AssocId assoc) const
ConstVec trkVec(AssocId assoc, ObjectId< CI, CM > pPart) const
ObjectId< ParticleDef, CM > PartId
ConstVec trkVec(AssocId assoc, const xAOD::IParticle *pPart) const
ColumnAccessor< MetAssociationDef, std::vector< ObjectLinkType >, CM > objectLinks
std::size_t findIndex(AssocId assoc, ObjectId< CI, CM > pPart) const
size_t size(AssocId assoc) const
ColumnAccessor< MetAssociationDef, std::vector< bitmask_t >, CM > calkeyAcc
ObjectId< MetAssociationDef, CM > AssocId
static constexpr std::size_t invalidIndex
VariantContainerId< ParticleDef, ParticleDef, JetDef, ElectronDef, PhotonDef, MuonDef > ObjectLinkCI
ColumnAccessor< MetAssociationDef, std::vector< float >, CM > cale
OptObjectId< MetAssociationDef, CM > OptAssocId
bool containsPhysics(AssocId assoc, JetId pPhys) const
ColumnAccessor< MetAssociationDef, LinkCastColumn< JetDef, xAOD::JetContainer >, CM > jetLink
auto overlapIndices(AssocId assoc, PartId pPart) const
auto overlapIndices(AssocId assoc, const xAOD::IParticle *pPart) const
a columnar version of xAOD::MissingETAssociationHelper
MetAssociationHelper(ObjectRange< MetAssociationDef, CM > map, const columnar::MetAssocationAccessors< CM > &val_accessors)
MissingETBase::Types::bitmask_t bitmask_t
MissingETBase::Types::constvec_t constvec_t
bool objSelected(AssocId assocId, ObjectLinkType pPart) const
auto getAssociations(ObjectId< CI, CM > pPart) const
MetAssociationHelper(xAOD::MissingETAssociationHelper &val_helper, const columnar::MetAssocationAccessors< CM > &val_accessors)
void setObjSelectionFlag(AssocId assocId, ObjectId< CI, CM > pPart, bool status)
bool objSelected(const xAOD::IParticle *obj) const
ObjectId< ParticleDef, CM > PartId
bool objSelected(AssocId assocId, const xAOD::IParticle *pPart) const
constvec_t getConstVec(PartId pPart, MissingETBase::UsageHandler::Policy p) const
bool objSelected(ObjectId< CI, CM > obj) const
void setObjSelectionFlag(AssocId assocId, const ObjectLinkType &pPart, bool status)
ObjectId< MetAssociationDef, CM > AssocId
const MetAssocationAccessors< CM > * m_accessors
the accessors for the members of the MET association map
constvec_t getConstVec(const xAOD::IParticle *pPart, MissingETBase::UsageHandler::Policy p) const
bool objSelected(AssocId assocId, std::size_t objIdx) const
static constexpr bool useMissingETAssociationHelper
OptObjectId< MetAssociationDef, CM > OptAssocId
xAOD::MissingETAssociation::ConstVec ConstVec
bool selectIfNoOverlaps(PartId obj, MissingETBase::UsageHandler::Policy p)
bitmask_t getObjSelectionFlags(AssocId assocId) const
ConstVec overlapCalVec(AssocId assoc) const
bool objSelected(AssocId assocId, ObjectId< CI, CM > pPart) const
bool selectIfNoOverlaps(const xAOD::IParticle *obj, MissingETBase::UsageHandler::Policy p)
ObjectRange< MetAssociationDef, CM > map() const noexcept
the underlying association map
auto getAssociations(const xAOD::IParticle *pPart) const
bool hasOverlaps(AssocId assocId, size_t objIdx, MissingETBase::UsageHandler::Policy p) const
ObjectId< JetDef, CM > JetId
xAOD::MissingETAssociationHelper & getXAODObject() const
bool objSelected(ObjectLinkType obj) const
ConstVec overlapTrkVec(AssocId assoc) const
void setObjSelectionFlag(AssocId assocId, size_t objIdx, bool status)
MetAssocationAccessors< CM >::ObjectLinkType ObjectLinkType
OptAssocId getJetAssociation(const xAOD::Jet *pJet) const
ObjectRange< MetAssociationDef, CM > m_map
the underlying MET association map
static constexpr std::size_t invalidIndex
void setObjSelectionFlag(AssocId assocId, const xAOD::IParticle *pPart, bool status)
xAOD::MissingETAssociationHelper * m_xaodHelper
the xAOD helper object, only used in xAOD mode, but its easier to define it in both modes regardless
OptAssocId getJetAssociation(JetId pJet) const
a class representing a single object (electron, muons, etc.)
a class representing a continuous sequence of objects (a.k.a. a container)
a class representing a single optional object (electron, muons, etc.)
STL class.
Class providing the definition of the 4-vector interface.
Vector sum of constituents for subtractive overlap removal.
static constexpr size_t invalidIndex
Invalid index indicator.
xAOD::MissingETAssociation_v1::ConstVec constvec_t
Type for constituent vector.
uint64_t bitmask_t
Type for status word bit mask.
@ AllCalo
Inclusive except tracks.
@ OnlyCluster
CaloCluster based only.
@ ParticleFlow
Particle Flow Object based.
@ TrackCluster
Both cluster and track based.
AccessorTemplate< CI, CT, ColumnAccessMode::input, CM > ColumnAccessor
ObjectId< JetDef > JetId
Definition JetDef.h:23
ObjectRange< MetAssociationDef > MetAssociationRange
Definition MetDef.h:70
ObjectId< ParticleDef > ParticleId
Definition ParticleDef.h:33
AccessorTemplate< CI, CT, ColumnAccessMode::update, CM > ColumnUpdater
STL namespace.
@ TrackParticle
The object is a charged track particle.
Definition ObjectType.h:43
@ ParticleFlow
The object is a particle-flow object.
Definition ObjectType.h:41
@ CaloCluster
The object is a calorimeter cluster.
Definition ObjectType.h:39
Jet_v1 Jet
Definition of the current "jet version".
ROOT::Math::LorentzVector< ROOT::Math::PtEtaPhiM4D< double > > JetFourMom_t
Base 4 Momentum type for Jet.
Definition JetTypes.h:17
static double cpyError()
Access error return value for constituent vector .
static double cpxError()
Access error return value for constituent vector .
static double ceError()
Access error return value for constituent vector .
static double cpzError()
Access error return value for constituent vector .
static double sumptError()
Access error return value for constituent vector sumpt.
an accessor that allows to access the xAOD object type of an input object
Definition MetInput.h:169
a "variant" ContainerId
Definition VariantDef.h:98