ATLAS Offline Software
Loading...
Searching...
No Matches
MetAssociation.h
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2025 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>
21
22namespace columnar
23{
29 template<typename IteratorType,class FunctionType>
30 class FilterRange;
31
32 template<typename IteratorType,class FunctionType>
34 {
35 IteratorType m_iterator;
37 public:
38 FilterRangeIterator (const IteratorType& val_iterator, const FilterRange<IteratorType,FunctionType> *val_range) noexcept
39 : m_iterator (val_iterator), m_range (val_range)
40 {}
41
42 auto operator * () const noexcept {
43 return *m_iterator;}
44
46 ++ m_iterator;
47 while (m_range && m_iterator != m_range->m_end && !m_range->m_filter (*m_iterator))
48 ++m_iterator;
49 return *this;
50 }
51
52 bool operator == (const FilterRangeIterator& that) const noexcept {
53 return m_iterator == that.m_iterator;}
54 bool operator != (const FilterRangeIterator& that) const noexcept {
55 return m_iterator != that.m_iterator;}
56 };
57
58 template<typename IteratorType,class FunctionType>
59 class FilterRange final
60 {
61 friend class FilterRangeIterator<IteratorType,FunctionType>;
62 IteratorType m_begin;
63 IteratorType m_end;
64 FunctionType m_filter;
65
66 public:
67 FilterRange (IteratorType begin, IteratorType end, FunctionType&& filter)
68 : m_begin (begin), m_end (end), m_filter (std::move (filter))
69 {
70 while (m_begin != m_end && !m_filter (*m_begin))
71 ++m_begin;
72 }
73 FilterRange (FilterRange&&) = default;
74 FilterRange (const FilterRange&) = default;
77
80 bool empty () const noexcept { return m_begin == m_end; }
81 };
82
83
84
85 template<typename CM = ColumnarModeDefault> class MetAssociationHelper;
86
87
88
91 template<typename CM = ColumnarModeDefault> class MetAssocationAccessors final
92 {
95 public:
96
100 static constexpr bool useMissingETAssociationHelper = std::is_same_v<CM,ColumnarModeXAOD>;
101
105
107
109 : calpx (columnarBase, "calpx"),
110 calpy (columnarBase, "calpy"),
111 calpz (columnarBase, "calpz"),
112 cale (columnarBase, "cale"),
113 calsumpt (columnarBase, "calsumpt"),
114 calkeyAcc (columnarBase, "calkey"),
115 trkpx (columnarBase, "trkpx"),
116 trkpy (columnarBase, "trkpy"),
117 trkpz (columnarBase, "trkpz"),
118 trke (columnarBase, "trke"),
119 trksumpt (columnarBase, "trksumpt"),
120 trkkeyAcc (columnarBase, "trkkey"),
121 jettrkpx (columnarBase, "jettrkpx"),
122 jettrkpy (columnarBase, "jettrkpy"),
123 jettrkpz (columnarBase, "jettrkpz"),
124 jettrke (columnarBase, "jettrke"),
125 jettrksumpt (columnarBase, "jettrksumpt"),
126 objectLinks (columnarBase, "objectLinks"),
127 jetLink (columnarBase, "jetLink"),
128 isMisc (columnarBase, "isMisc"),
129 overlapIndicesAcc (columnarBase, "overlapIndices"),
130 overlapTypesAcc (columnarBase, "overlapTypes"),
131 objectTypeAcc (columnarBase, "objectType")
132 {
133 if constexpr (!useMissingETAssociationHelper)
135 }
136
139
146
153
159
163
165
167
170
172
174
175
176
179
180 [[nodiscard]] static bitmask_t getObjMask(size_t objIndex) {
181 if(objIndex==invalidIndex) return 0;
182 return 1<<objIndex;
183 }
184
185 [[nodiscard]] std::size_t sizeCal(AssocId assoc) const {
186 return cale(assoc).size();}
187
188 [[nodiscard]] decltype(auto) calkey(AssocId assoc) const {
189 return calkeyAcc(assoc);}
190
191 [[nodiscard]] bitmask_t calkey (AssocId assoc, size_t keyIdx) const {
192 return keyIdx != invalidIndex && keyIdx < calkeyAcc(assoc).size() ? calkeyAcc(assoc)[keyIdx] : invalidIndex; }
193
194 [[nodiscard]] ConstVec calVec(AssocId assoc, const xAOD::IParticle* pPart) const {
195 return calVec(assoc, PartId(*pPart)); }
196 template<ContainerIdConcept CI>
197 [[nodiscard]] ConstVec calVec(AssocId assoc, ObjectId<CI,CM> pPart) const {
198 constvec_t totalvec;
199 for (size_t iKey = 0; iKey < this->sizeCal(assoc); iKey++) {
200 if (this->calkey(assoc, iKey) & getObjMask(this->findIndex(assoc,pPart)))
201 totalvec+=this->calVec(assoc, iKey);
202 }
203 return totalvec;
204 }
205
206 [[nodiscard]] ConstVec calVec(AssocId assoc, std::size_t keyIdx) const {
207 return keyIdx != invalidIndex && keyIdx < this->sizeCal(assoc)
208 ? constvec_t(calpx(assoc)[keyIdx],calpy(assoc)[keyIdx],calpz(assoc)[keyIdx],cale(assoc)[keyIdx],calsumpt(assoc)[keyIdx])
210
211
212 [[nodiscard]] std::size_t sizeTrk (AssocId assoc) const {
213 return trke(assoc).size();}
214
215 [[nodiscard]] decltype(auto) trkkey(AssocId assoc) const {
216 return trkkeyAcc(assoc);}
217
218 [[nodiscard]] bitmask_t trkkey(AssocId assoc, size_t keyIdx) const {
219 return keyIdx != invalidIndex && keyIdx < this->sizeTrk(assoc) ? this->trkkey(assoc)[keyIdx] : invalidIndex; }
220
221 [[nodiscard]] ConstVec trkVec(AssocId assoc, const xAOD::IParticle* pPart) const {
222 return trkVec(assoc, PartId(*pPart)); }
223 template<ContainerIdConcept CI>
224 [[nodiscard]] ConstVec trkVec(AssocId assoc, ObjectId<CI,CM> pPart) const {
225 constvec_t totalvec;
226 for (size_t iKey = 0; iKey < this->sizeTrk(assoc); iKey++) {
227 if (this->trkkey(assoc,iKey) & getObjMask(this->findIndex(assoc,pPart)))
228 totalvec+=this->trkVec(assoc,iKey);
229 }
230 return totalvec; }
231 [[nodiscard]] ConstVec trkVec(AssocId assoc, ObjectLinkType pPart) const {
232 constvec_t totalvec;
233 for (size_t iKey = 0; iKey < this->sizeTrk(assoc); iKey++) {
234 if (this->trkkey(assoc,iKey) & getObjMask(this->findIndex(assoc,pPart)))
235 totalvec+=this->trkVec(assoc,iKey);
236 }
237 return totalvec; }
238
239 [[nodiscard]] ConstVec trkVec(AssocId assoc, size_t keyIdx) const {
240 return keyIdx != invalidIndex && keyIdx < this->sizeTrk(assoc)
241 ? constvec_t(this->trkpx(assoc)[keyIdx],this->trkpy(assoc)[keyIdx],this->trkpz(assoc)[keyIdx],this->trke(assoc)[keyIdx],this->trksumpt(assoc)[keyIdx])
243
244 [[nodiscard]] ConstVec jetTrkVec(AssocId assoc) const {
245 return constvec_t(this->jettrkpx(assoc),this->jettrkpy(assoc),this->jettrkpz(assoc),this->jettrke(assoc),this->jettrksumpt(assoc)); }
246
247 [[nodiscard]] size_t size(AssocId assoc) const {
248 return this->objectLinks(assoc).size(); }
249
250 [[nodiscard]] auto objects(AssocId assoc) const {
251 return this->objectLinks(assoc);}
252
253 [[nodiscard]] auto overlapIndices(AssocId assoc) const {
254 return overlapIndicesAcc(assoc); }
255
256 [[nodiscard]] auto overlapIndices(AssocId assoc,const xAOD::IParticle* pPart) const {
257 return this->overlapIndices(assoc, ParticleId(*pPart)); }
258 [[nodiscard]] auto overlapIndices(AssocId assoc,PartId pPart) const {
259 return this->overlapIndices(assoc, this->findIndex(assoc, pPart)); }
260
261 [[nodiscard]] std::span<const std::size_t> overlapIndices(AssocId assoc,std::size_t objIdx) const {
262 if (objIdx == invalidIndex) return std::span<const std::size_t>();
263 auto indices = overlapIndicesAcc(assoc);
264 return objIdx < indices.size() ? indices[objIdx] : std::span<const std::size_t>(); }
265
266 [[nodiscard]] std::span<const unsigned char> overlapTypes (AssocId assoc, std::size_t objIdx) const {
267 if (objIdx == invalidIndex) return std::span<const unsigned char>();
268 auto types = this->overlapTypesAcc(assoc);
269 return objIdx < types.size() ? types[objIdx] : std::span<const unsigned char>(); }
270
271 [[nodiscard]] std::size_t findIndex(AssocId assoc,const xAOD::IParticle* pPart) const {
272 return findIndex(assoc, ParticleId(*pPart));}
273 template<ContainerIdConcept CI>
274 [[nodiscard]] std::size_t findIndex(AssocId assoc,ObjectId<CI,CM> pPart) const {
275 std::size_t idx = 0;
276 for (auto link : this->objectLinks(assoc)) {
277 if (link == pPart)
278 return idx;
279 ++idx;
280 }
281 return invalidIndex;
282 }
283 [[nodiscard]] std::size_t findIndex(AssocId assoc,ObjectLinkType pPart) const {
284 std::size_t idx = 0;
285 for (auto link : this->objectLinks(assoc)) {
286 if (link == pPart)
287 return idx;
288 ++idx;
289 }
290 return invalidIndex;
291 }
292
293 [[nodiscard]] bool hasAlternateConstVec(AssocId assoc) const {
294 if (isMisc(assoc)) return false;
295 auto refJet = this->refJet(assoc);
296 if (!refJet) return false;
297 return containsPhysics(assoc,refJet.value());}
298
300 xAOD::JetFourMom_t newvec;
301 constvec_t newpt;
302 auto refJet = this->refJet(assoc);
303 size_t newptIndex = refJet ? findIndex(assoc,refJet.value()) : invalidIndex;
304 if (newptIndex == invalidIndex) return newvec;
305 bitmask_t mask = (bitmask_t)1 << newptIndex;
306
307 for (size_t iKey = 0; iKey < sizeCal(assoc); iKey++) if (mask & calkey(assoc)[iKey]) newpt += calVec(assoc,iKey);
308 newvec.SetPxPyPzE(newpt.cpx(),newpt.cpy(),newpt.cpz(),newpt.ce());
309 return newvec;
310 }
311
312 [[nodiscard]] auto refJet(AssocId assoc) const {
313 return this->jetLink(assoc); }
314
315 [[nodiscard]] bool containsPhysics(AssocId assoc,JetId pPhys) const {
316 for(auto link : this->objectLinks(assoc)) {
317 if(link == pPhys) {
318 return true;
319 }
320 }
321 return false;}
322
323
325 // I don't know if it matters, but in the original xAOD code the
326 // iteration is done in reverse order, so I'm doing the same here
327 // as well.
328 for (auto assocIter = map.rbegin(); assocIter != map.rend(); ++assocIter)
329 {
330 if (isMisc(*assocIter))
331 return *assocIter;
332 }
333 // If we reach here, no misc association was found.
334 return OptAssocId{};}
335 };
336
337
338
340 template<typename CM> class MetAssociationHelper final
341 {
344 public:
345
351
355
356 static constexpr bool useMissingETAssociationHelper = std::is_same_v<CM,ColumnarModeXAOD>;
358
359
361 : m_xaodHelper (&val_helper), m_map (*val_helper.map()), m_accessors (&val_accessors)
362 {}
363
367
368
370 if constexpr (useMissingETAssociationHelper)
371 return *m_xaodHelper;
372 else
373 throw std::logic_error ("can't call xAOD function in columnar mode");}
374
375
378 return m_map;}
379
380
383
384 [[nodiscard]] bool objSelected (const xAOD::IParticle* obj) const {
385 return objSelected(PartId(*obj));}
386 template<ContainerIdConcept CI>
387 [[nodiscard]] bool objSelected (ObjectId<CI,CM> obj) const {
388 for (decltype(auto) assoc : getAssociations(obj)) if(objSelected(assoc,obj)) return true;
389 return false;}
390 [[nodiscard]] bool objSelected (ObjectLinkType obj) const {
391 for (decltype(auto) assoc : getAssociations(obj)) if(objSelected(assoc,obj)) return true;
392 return false;}
393 [[nodiscard]] bool objSelected(AssocId assocId, std::size_t objIdx) const {
394 if constexpr (useMissingETAssociationHelper)
395 return m_xaodHelper->objSelected(&assocId.getXAODObject(), objIdx);
396 else {
397 if (objIdx >= sizeof(bitmask_t)*8) return false;
398 return bool(m_accessors->useObjectFlagsAcc(assocId) & (static_cast<MissingETBase::Types::bitmask_t>(1)<<objIdx));
399 }
400 }
401 [[nodiscard]] bool objSelected(AssocId assocId, const xAOD::IParticle* pPart) const {
402 return objSelected(assocId, PartId(*pPart));}
403 template<ContainerIdConcept CI>
404 [[nodiscard]] bool objSelected(AssocId assocId, ObjectId<CI,CM> pPart) const {
405 return objSelected(assocId, m_accessors->findIndex(assocId,pPart));}
406 [[nodiscard]] bool objSelected(AssocId assocId, ObjectLinkType pPart) const {
407 return objSelected(assocId, m_accessors->findIndex(assocId,pPart));}
408
409
410 [[nodiscard]] bitmask_t getObjSelectionFlags(AssocId assocId) const {
411 if constexpr (useMissingETAssociationHelper)
412 return m_xaodHelper->getObjSelectionFlags(&assocId.getXAODObject());
413 else
414 return m_accessors->useObjectFlagsAcc(assocId);
415 }
416
417
418 void setObjSelectionFlag(AssocId assocId, size_t objIdx, bool status) {
419 if constexpr (useMissingETAssociationHelper)
420 m_xaodHelper->setObjSelectionFlag(&assocId.getXAODObject(), objIdx, status);
421 else
422 {
423 if (objIdx >= sizeof(bitmask_t)*8) return;
424 bitmask_t mask = static_cast<bitmask_t>(1) << objIdx;
425 if (status) m_accessors->useObjectFlagsAcc(assocId) |= mask;
426 else m_accessors->useObjectFlagsAcc(assocId) &= ~mask;
427 }
428 }
429 void setObjSelectionFlag(AssocId assocId, const xAOD::IParticle* pPart, bool status) {
430 setObjSelectionFlag(assocId,PartId(*pPart),status);}
431 template<ContainerIdConcept CI>
432 void setObjSelectionFlag(AssocId assocId, ObjectId<CI,CM> pPart, bool status) {
433 setObjSelectionFlag(assocId,m_accessors->findIndex(assocId,pPart),status);}
434 void setObjSelectionFlag(AssocId assocId, const ObjectLinkType& pPart, bool status) {
435 setObjSelectionFlag(assocId,m_accessors->findIndex(assocId,pPart),status);}
436
437
438
441
442 [[nodiscard]] bool hasOverlaps(AssocId assocId, size_t objIdx,MissingETBase::UsageHandler::Policy p) const {
443 if ( objIdx == invalidIndex ) return false;
444 auto indices = m_accessors->overlapIndices(assocId, objIdx);
445 auto types = m_accessors->overlapTypes(assocId, objIdx);
446 for(size_t iOL=0; iOL<indices.size(); ++iOL) {
447 if(objSelected(assocId, indices[iOL])) {
448 // printf("Test object %lu for overlaps: OL type %i\n",indices[iOL],(int)types[iOL]);
449 switch(p) {
451 if((types[iOL] & 1<<xAOD::Type::CaloCluster) || (types[iOL] & 1<<xAOD::Type::TrackParticle)) {break;}
452 else {continue;}
454 if(types[iOL] & 1<<xAOD::Type::CaloCluster) {break;}
455 else {continue;}
457 if(types[iOL] & 1<<xAOD::Type::TrackParticle) {break;}
458 else {continue;}
460 if(types[iOL] & 1<<xAOD::Type::ParticleFlow) {break;}
461 else {continue;}
463 if(types[iOL] & 1) {break;}
464 else {continue;}
466 if(types[iOL] & ~(1<<xAOD::Type::TrackParticle)) {break;}
467 else {continue;}
468 default: continue;
469 }
470 return true;
471 }
472 }
473 return false;
474 }
475
477 return selectIfNoOverlaps(PartId(*obj), p);}
479 auto assocs = getAssociations(obj);
480 bool overlaps(false);
481 for(decltype(auto) assoc : assocs) overlaps |= hasOverlaps(assoc,m_accessors->findIndex(assoc,obj),p);
482 if (overlaps) return false;
483 for(decltype(auto) assoc : assocs) setObjSelectionFlag(assoc,obj,true);
484 return true;}
485
486
487
490
491 [[nodiscard]] OptAssocId getJetAssociation(const xAOD::Jet* pJet) const {
492 return getJetAssociation(JetId(*pJet));}
493 [[nodiscard]] OptAssocId getJetAssociation(JetId pJet) const {
494 // this uses a linear search, which is the same as the original
495 // xAOD code, but was flagged there as potentially inefficient
496 for (auto assoc : m_map) {
497 if (m_accessors->jetLink(assoc) == pJet) {
498 return assoc;
499 }
500 }
501 return std::nullopt;}
502
503 [[nodiscard]] auto getAssociations(const xAOD::IParticle* pPart) const {
504 return getAssociations(PartId(*pPart));}
505 template<ContainerIdConcept CI>
506 [[nodiscard]] auto getAssociations(ObjectId<CI,CM> pPart) const {
507 // In the original xAOD code, this returned a `std::vector` by
508 // value. In columnar code we prefer not to pass vectors by
509 // value, so we return a filtered range instead.
510 return FilterRange (m_map.begin(), m_map.end(),
511 [accessors = m_accessors, pPart] (AssocId assoc) {
512 return (accessors->findIndex(assoc,pPart) != invalidIndex);});}
513
514 [[nodiscard]] auto getMiscAssociation() const {
515 return m_accessors->getMiscAssociation(m_map);}
516
517
520
522 return getConstVec(PartId(*pPart), p);}
524 constvec_t totalvec;
525 for (decltype(auto) assoc : getAssociations(pPart)) {
527 totalvec += m_accessors->trkVec(assoc, pPart);
528 } else {
529 totalvec += m_accessors->calVec(assoc, pPart);
530 }
531 }
532 return totalvec;}
533
534 [[nodiscard]] ConstVec overlapCalVec(AssocId assoc) const {
535 constvec_t calvec;
536 for (size_t iKey = 0; iKey < m_accessors->sizeCal(assoc); iKey++) {
537 bool selector = (getObjSelectionFlags(assoc) & m_accessors->calkey(assoc)[iKey]) ? !m_accessors->isMisc(assoc) : m_accessors->isMisc(assoc);
538 if (selector) calvec+=m_accessors->calVec(assoc,iKey);
539 }
540 return calvec;}
541
542 [[nodiscard]] ConstVec overlapTrkVec(AssocId assoc) const {
543 constvec_t trkvec;
544 for (size_t iKey = 0; iKey < m_accessors->sizeTrk(assoc); iKey++) {
545 bool selector = (getObjSelectionFlags(assoc) & m_accessors->trkkey(assoc)[iKey]) ? !m_accessors->isMisc(assoc) : m_accessors->isMisc(assoc);
546 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]);
547 }
548 return trkvec;
549 }
550
551
552
555 private:
556
560
563
566 };
567
568
569
570 template<typename CM>
576
577 template<typename CM>
583}
584
585#endif
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< ContainerId::metAssociation, char, CM > isMisc
ColumnAccessor< ContainerId::metAssociation, std::vector< float >, CM > trke
MissingETBase::Types::bitmask_t bitmask_t
auto objects(AssocId assoc) const
ColumnAccessor< ContainerId::metAssociation, float, CM > jettrkpz
std::span< const unsigned char > overlapTypes(AssocId assoc, std::size_t objIdx) const
ColumnAccessor< ContainerId::metAssociation, std::vector< bitmask_t >, CM > trkkeyAcc
std::size_t sizeCal(AssocId assoc) const
OptAssocId getMiscAssociation(MetAssociationRange map) const
ConstVec trkVec(AssocId assoc, ObjectLinkType pPart) const
ColumnUpdater< ContainerId::metAssociation, bitmask_t, CM > useObjectFlagsAcc
bitmask_t trkkey(AssocId assoc, size_t keyIdx) const
MetAssociationHelper< CM > operator()(xAOD::MissingETAssociationHelper &helper) const
ColumnAccessor< ContainerId::metAssociation, std::vector< float >, CM > trkpx
ColumnAccessor< ContainerId::metAssociation, std::vector< float >, CM > trksumpt
ColumnAccessor< ContainerId::metAssociation, std::vector< float >, CM > calsumpt
xAOD::JetFourMom_t getAlternateConstVec(AssocId assoc) const
xAOD::MissingETAssociation::ConstVec ConstVec
bitmask_t calkey(AssocId assoc, size_t keyIdx) const
ColumnAccessor< ContainerId::metAssociation, std::vector< float >, CM > cale
ColumnAccessor< ContainerId::metAssociation, std::vector< std::vector< std::size_t > >, CM > overlapIndicesAcc
decltype(auto) trkkey(AssocId assoc) const
ColumnAccessor< ContainerId::metAssociation, std::vector< float >, CM > calpz
ColumnAccessor< ContainerId::metAssociation, std::vector< float >, CM > calpx
std::size_t findIndex(AssocId assoc, const xAOD::IParticle *pPart) const
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
ColumnAccessor< ContainerId::metAssociation, std::vector< std::vector< unsigned char > >, CM > overlapTypesAcc
ObjectId< ContainerId::metAssociation, CM > AssocId
VariantContainerId< ContainerId::particle, ContainerId::particle, ContainerId::jet, ContainerId::electron, ContainerId::photon, ContainerId::muon > ObjectLinkCI
ConstVec calVec(AssocId assoc, ObjectId< CI, CM > pPart) const
ObjectLink< ObjectLinkCI, CM > ObjectLinkType
MissingETBase::Types::constvec_t constvec_t
ColumnAccessor< ContainerId::metAssociation, std::vector< float >, CM > calpy
ObjectId< ContainerId::particle, CM > PartId
std::span< const std::size_t > overlapIndices(AssocId assoc, std::size_t objIdx) const
ConstVec trkVec(AssocId assoc, size_t keyIdx) const
std::size_t sizeTrk(AssocId assoc) const
MetHelpers::ObjectTypeAccessor< ContainerId::particle > objectTypeAcc
auto overlapIndices(AssocId assoc) const
MetAssocationAccessors(ColumnarTool< CM > &columnarBase)
OptObjectId< ContainerId::metAssociation, CM > OptAssocId
decltype(auto) calkey(AssocId assoc) const
ConstVec trkVec(AssocId assoc, ObjectId< CI, CM > pPart) const
ConstVec trkVec(AssocId assoc, const xAOD::IParticle *pPart) const
ColumnAccessor< ContainerId::metAssociation, float, CM > jettrke
ColumnAccessor< ContainerId::metAssociation, float, CM > jettrkpy
ColumnAccessor< ContainerId::metAssociation, float, CM > jettrkpx
ColumnAccessor< ContainerId::metAssociation, std::vector< float >, CM > trkpz
ColumnAccessor< ContainerId::metAssociation, std::vector< float >, CM > trkpy
std::size_t findIndex(AssocId assoc, ObjectId< CI, CM > pPart) const
size_t size(AssocId assoc) const
static constexpr std::size_t invalidIndex
ColumnAccessor< ContainerId::metAssociation, std::vector< bitmask_t >, CM > calkeyAcc
ColumnAccessor< ContainerId::metAssociation, LinkCastColumn< ContainerId::jet, xAOD::JetContainer >, CM > jetLink
bool containsPhysics(AssocId assoc, JetId pPhys) const
ColumnAccessor< ContainerId::metAssociation, std::vector< ObjectLinkType >, CM > objectLinks
ColumnAccessor< ContainerId::metAssociation, float, CM > jettrksumpt
auto overlapIndices(AssocId assoc, PartId pPart) const
auto overlapIndices(AssocId assoc, const xAOD::IParticle *pPart) const
a columnar version of xAOD::MissingETAssociationHelper
MissingETBase::Types::bitmask_t bitmask_t
ObjectId< ContainerId::metAssociation, CM > AssocId
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
ObjectRange< ContainerId::metAssociation, CM > map() const noexcept
the underlying association map
ObjectId< ContainerId::particle, 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)
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
ObjectId< ContainerId::jet, CM > JetId
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)
auto getAssociations(const xAOD::IParticle *pPart) const
bool hasOverlaps(AssocId assocId, size_t objIdx, MissingETBase::UsageHandler::Policy p) const
xAOD::MissingETAssociationHelper & getXAODObject() const
bool objSelected(ObjectLinkType obj) const
ConstVec overlapTrkVec(AssocId assoc) const
MetAssociationHelper(ObjectRange< ContainerId::metAssociation, CM > map, const columnar::MetAssocationAccessors< CM > &val_accessors)
void setObjSelectionFlag(AssocId assocId, size_t objIdx, bool status)
MetAssocationAccessors< CM >::ObjectLinkType ObjectLinkType
ObjectRange< ContainerId::metAssociation, CM > m_map
the underlying MET association map
OptAssocId getJetAssociation(const xAOD::Jet *pJet) const
OptObjectId< ContainerId::metAssociation, CM > OptAssocId
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
ObjectRange< ContainerId::metAssociation > MetAssociationRange
Definition MetDef.h:73
ObjectId< ContainerId::particle > ParticleId
Definition ParticleDef.h:36
AccessorTemplate< CI, CT, ColumnAccessMode::update, CM > ColumnUpdater
ObjectId< ContainerId::jet > JetId
Definition JetDef.h:26
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