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>
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)
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) return 0;
181 return 1<<objIndex;
182 }
183
184 [[nodiscard]] std::size_t sizeCal(AssocId assoc) const {
185 return cale(assoc).size();}
186
187 [[nodiscard]] decltype(auto) calkey(AssocId assoc) const {
188 return calkeyAcc(assoc);}
189
190 [[nodiscard]] bitmask_t calkey (AssocId assoc, size_t keyIdx) const {
191 return keyIdx != invalidIndex && keyIdx < calkeyAcc(assoc).size() ? calkeyAcc(assoc)[keyIdx] : invalidIndex; }
192
193 [[nodiscard]] ConstVec calVec(AssocId assoc, const xAOD::IParticle* pPart) const {
194 return calVec(assoc, PartId(*pPart)); }
195 template<ContainerIdConcept CI>
196 [[nodiscard]] ConstVec calVec(AssocId assoc, ObjectId<CI,CM> pPart) const {
197 constvec_t totalvec;
198 for (size_t iKey = 0; iKey < this->sizeCal(assoc); iKey++) {
199 if (this->calkey(assoc, iKey) & getObjMask(this->findIndex(assoc,pPart)))
200 totalvec+=this->calVec(assoc, iKey);
201 }
202 return totalvec;
203 }
204
205 [[nodiscard]] ConstVec calVec(AssocId assoc, std::size_t keyIdx) const {
206 return keyIdx != invalidIndex && keyIdx < this->sizeCal(assoc)
207 ? constvec_t(calpx(assoc)[keyIdx],calpy(assoc)[keyIdx],calpz(assoc)[keyIdx],cale(assoc)[keyIdx],calsumpt(assoc)[keyIdx])
209
210
211 [[nodiscard]] std::size_t sizeTrk (AssocId assoc) const {
212 return trke(assoc).size();}
213
214 [[nodiscard]] decltype(auto) trkkey(AssocId assoc) const {
215 return trkkeyAcc(assoc);}
216
217 [[nodiscard]] bitmask_t trkkey(AssocId assoc, size_t keyIdx) const {
218 return keyIdx != invalidIndex && keyIdx < this->sizeTrk(assoc) ? this->trkkey(assoc)[keyIdx] : invalidIndex; }
219
220 [[nodiscard]] ConstVec trkVec(AssocId assoc, const xAOD::IParticle* pPart) const {
221 return trkVec(assoc, PartId(*pPart)); }
222 template<ContainerIdConcept CI>
223 [[nodiscard]] ConstVec trkVec(AssocId assoc, ObjectId<CI,CM> pPart) const {
224 constvec_t totalvec;
225 for (size_t iKey = 0; iKey < this->sizeTrk(assoc); iKey++) {
226 if (this->trkkey(assoc,iKey) & getObjMask(this->findIndex(assoc,pPart)))
227 totalvec+=this->trkVec(assoc,iKey);
228 }
229 return totalvec; }
230 [[nodiscard]] ConstVec trkVec(AssocId assoc, ObjectLinkType pPart) const {
231 constvec_t totalvec;
232 for (size_t iKey = 0; iKey < this->sizeTrk(assoc); iKey++) {
233 if (this->trkkey(assoc,iKey) & getObjMask(this->findIndex(assoc,pPart)))
234 totalvec+=this->trkVec(assoc,iKey);
235 }
236 return totalvec; }
237
238 [[nodiscard]] ConstVec trkVec(AssocId assoc, size_t keyIdx) const {
239 return keyIdx != invalidIndex && keyIdx < this->sizeTrk(assoc)
240 ? constvec_t(this->trkpx(assoc)[keyIdx],this->trkpy(assoc)[keyIdx],this->trkpz(assoc)[keyIdx],this->trke(assoc)[keyIdx],this->trksumpt(assoc)[keyIdx])
242
243 [[nodiscard]] ConstVec jetTrkVec(AssocId assoc) const {
244 return constvec_t(this->jettrkpx(assoc),this->jettrkpy(assoc),this->jettrkpz(assoc),this->jettrke(assoc),this->jettrksumpt(assoc)); }
245
246 [[nodiscard]] size_t size(AssocId assoc) const {
247 return this->objectLinks(assoc).size(); }
248
249 [[nodiscard]] auto objects(AssocId assoc) const {
250 return this->objectLinks(assoc);}
251
252 [[nodiscard]] auto overlapIndices(AssocId assoc) const {
253 return overlapIndicesAcc(assoc); }
254
255 [[nodiscard]] auto overlapIndices(AssocId assoc,const xAOD::IParticle* pPart) const {
256 return this->overlapIndices(assoc, ParticleId(*pPart)); }
257 [[nodiscard]] auto overlapIndices(AssocId assoc,PartId pPart) const {
258 return this->overlapIndices(assoc, this->findIndex(assoc, pPart)); }
259
260 [[nodiscard]] std::span<const std::size_t> overlapIndices(AssocId assoc,std::size_t objIdx) const {
261 if (objIdx == invalidIndex) return std::span<const std::size_t>();
262 auto indices = overlapIndicesAcc(assoc);
263 return objIdx < indices.size() ? indices[objIdx] : std::span<const std::size_t>(); }
264
265 [[nodiscard]] std::span<const unsigned char> overlapTypes (AssocId assoc, std::size_t objIdx) const {
266 if (objIdx == invalidIndex) return std::span<const unsigned char>();
267 auto types = this->overlapTypesAcc(assoc);
268 return objIdx < types.size() ? types[objIdx] : std::span<const unsigned char>(); }
269
270 [[nodiscard]] std::size_t findIndex(AssocId assoc,const xAOD::IParticle* pPart) const {
271 return findIndex(assoc, ParticleId(*pPart));}
272 template<ContainerIdConcept CI>
273 [[nodiscard]] std::size_t findIndex(AssocId assoc,ObjectId<CI,CM> pPart) const {
274 std::size_t idx = 0;
275 for (auto link : this->objectLinks(assoc)) {
276 if (link == pPart)
277 return idx;
278 ++idx;
279 }
280 return invalidIndex;
281 }
282 [[nodiscard]] std::size_t findIndex(AssocId assoc,ObjectLinkType pPart) const {
283 std::size_t idx = 0;
284 for (auto link : this->objectLinks(assoc)) {
285 if (link == pPart)
286 return idx;
287 ++idx;
288 }
289 return invalidIndex;
290 }
291
292 [[nodiscard]] bool hasAlternateConstVec(AssocId assoc) const {
293 if (isMisc(assoc)) return false;
294 auto refJet = this->refJet(assoc);
295 if (!refJet) return false;
296 return containsPhysics(assoc,refJet.value());}
297
299 xAOD::JetFourMom_t newvec;
300 constvec_t newpt;
301 auto refJet = this->refJet(assoc);
302 size_t newptIndex = refJet ? findIndex(assoc,refJet.value()) : invalidIndex;
303 if (newptIndex == invalidIndex) return newvec;
304 bitmask_t mask = (bitmask_t)1 << newptIndex;
305
306 for (size_t iKey = 0; iKey < sizeCal(assoc); iKey++) if (mask & calkey(assoc)[iKey]) newpt += calVec(assoc,iKey);
307 newvec.SetPxPyPzE(newpt.cpx(),newpt.cpy(),newpt.cpz(),newpt.ce());
308 return newvec;
309 }
310
311 [[nodiscard]] auto refJet(AssocId assoc) const {
312 return this->jetLink(assoc); }
313
314 [[nodiscard]] bool containsPhysics(AssocId assoc,JetId pPhys) const {
315 for(auto link : this->objectLinks(assoc)) {
316 if(link == pPhys) {
317 return true;
318 }
319 }
320 return false;}
321
322
324 // I don't know if it matters, but in the original xAOD code the
325 // iteration is done in reverse order, so I'm doing the same here
326 // as well.
327 for (auto assocIter = map.rbegin(); assocIter != map.rend(); ++assocIter)
328 {
329 if (isMisc(*assocIter))
330 return *assocIter;
331 }
332 // If we reach here, no misc association was found.
333 return OptAssocId{};}
334 };
335
336
337
339 template<typename CM> class MetAssociationHelper final
340 {
343 public:
344
350
354
355 static constexpr bool useMissingETAssociationHelper = std::is_same_v<CM,ColumnarModeXAOD>;
357
358
360 : m_xaodHelper (&val_helper), m_map (*val_helper.map()), m_accessors (&val_accessors)
361 {}
362
366
367
369 if constexpr (useMissingETAssociationHelper)
370 return *m_xaodHelper;
371 else
372 throw std::logic_error ("can't call xAOD function in columnar mode");}
373
374
377 return m_map;}
378
379
382
383 [[nodiscard]] bool objSelected (const xAOD::IParticle* obj) const {
384 return objSelected(PartId(*obj));}
385 template<ContainerIdConcept CI>
386 [[nodiscard]] bool objSelected (ObjectId<CI,CM> obj) const {
387 for (decltype(auto) assoc : getAssociations(obj)) if(objSelected(assoc,obj)) return true;
388 return false;}
389 [[nodiscard]] bool objSelected (ObjectLinkType obj) const {
390 for (decltype(auto) assoc : getAssociations(obj)) if(objSelected(assoc,obj)) return true;
391 return false;}
392 [[nodiscard]] bool objSelected(AssocId assocId, std::size_t objIdx) const {
393 if constexpr (useMissingETAssociationHelper)
394 return m_xaodHelper->objSelected(&assocId.getXAODObject(), objIdx);
395 else {
396 if (objIdx >= sizeof(bitmask_t)*8) return false;
397 return bool(m_accessors->useObjectFlagsAcc(assocId) & (static_cast<MissingETBase::Types::bitmask_t>(1)<<objIdx));
398 }
399 }
400 [[nodiscard]] bool objSelected(AssocId assocId, const xAOD::IParticle* pPart) const {
401 return objSelected(assocId, PartId(*pPart));}
402 template<ContainerIdConcept CI>
403 [[nodiscard]] bool objSelected(AssocId assocId, ObjectId<CI,CM> pPart) const {
404 return objSelected(assocId, m_accessors->findIndex(assocId,pPart));}
405 [[nodiscard]] bool objSelected(AssocId assocId, ObjectLinkType pPart) const {
406 return objSelected(assocId, m_accessors->findIndex(assocId,pPart));}
407
408
409 [[nodiscard]] bitmask_t getObjSelectionFlags(AssocId assocId) const {
410 if constexpr (useMissingETAssociationHelper)
411 return m_xaodHelper->getObjSelectionFlags(&assocId.getXAODObject());
412 else
413 return m_accessors->useObjectFlagsAcc(assocId);
414 }
415
416
417 void setObjSelectionFlag(AssocId assocId, size_t objIdx, bool status) {
418 if constexpr (useMissingETAssociationHelper)
419 m_xaodHelper->setObjSelectionFlag(&assocId.getXAODObject(), objIdx, status);
420 else
421 {
422 if (objIdx >= sizeof(bitmask_t)*8) return;
423 bitmask_t mask = static_cast<bitmask_t>(1) << objIdx;
424 if (status) m_accessors->useObjectFlagsAcc(assocId) |= mask;
425 else m_accessors->useObjectFlagsAcc(assocId) &= ~mask;
426 }
427 }
428 void setObjSelectionFlag(AssocId assocId, const xAOD::IParticle* pPart, bool status) {
429 setObjSelectionFlag(assocId,PartId(*pPart),status);}
430 template<ContainerIdConcept CI>
431 void setObjSelectionFlag(AssocId assocId, ObjectId<CI,CM> pPart, bool status) {
432 setObjSelectionFlag(assocId,m_accessors->findIndex(assocId,pPart),status);}
433 void setObjSelectionFlag(AssocId assocId, const ObjectLinkType& pPart, bool status) {
434 setObjSelectionFlag(assocId,m_accessors->findIndex(assocId,pPart),status);}
435
436
437
440
441 [[nodiscard]] bool hasOverlaps(AssocId assocId, size_t objIdx,MissingETBase::UsageHandler::Policy p) const {
442 if ( objIdx == invalidIndex ) return false;
443 auto indices = m_accessors->overlapIndices(assocId, objIdx);
444 auto types = m_accessors->overlapTypes(assocId, objIdx);
445 for(size_t iOL=0; iOL<indices.size(); ++iOL) {
446 if(objSelected(assocId, indices[iOL])) {
447 // printf("Test object %lu for overlaps: OL type %i\n",indices[iOL],(int)types[iOL]);
448 switch(p) {
450 if((types[iOL] & 1<<xAOD::Type::CaloCluster) || (types[iOL] & 1<<xAOD::Type::TrackParticle)) {break;}
451 else {continue;}
453 if(types[iOL] & 1<<xAOD::Type::CaloCluster) {break;}
454 else {continue;}
456 if(types[iOL] & 1<<xAOD::Type::TrackParticle) {break;}
457 else {continue;}
459 if(types[iOL] & 1<<xAOD::Type::ParticleFlow) {break;}
460 else {continue;}
462 if(types[iOL] & 1) {break;}
463 else {continue;}
465 if(types[iOL] & ~(1<<xAOD::Type::TrackParticle)) {break;}
466 else {continue;}
467 default: continue;
468 }
469 return true;
470 }
471 }
472 return false;
473 }
474
476 return selectIfNoOverlaps(PartId(*obj), p);}
478 auto assocs = getAssociations(obj);
479 bool overlaps(false);
480 for(decltype(auto) assoc : assocs) overlaps |= hasOverlaps(assoc,m_accessors->findIndex(assoc,obj),p);
481 if (overlaps) return false;
482 for(decltype(auto) assoc : assocs) setObjSelectionFlag(assoc,obj,true);
483 return true;}
484
485
486
489
490 [[nodiscard]] OptAssocId getJetAssociation(const xAOD::Jet* pJet) const {
491 return getJetAssociation(JetId(*pJet));}
492 [[nodiscard]] OptAssocId getJetAssociation(JetId pJet) const {
493 // this uses a linear search, which is the same as the original
494 // xAOD code, but was flagged there as potentially inefficient
495 for (auto assoc : m_map) {
496 if (m_accessors->jetLink(assoc) == pJet) {
497 return assoc;
498 }
499 }
500 return std::nullopt;}
501
502 [[nodiscard]] auto getAssociations(const xAOD::IParticle* pPart) const {
503 return getAssociations(PartId(*pPart));}
504 template<ContainerIdConcept CI>
505 [[nodiscard]] auto getAssociations(ObjectId<CI,CM> pPart) const {
506 // In the original xAOD code, this returned a `std::vector` by
507 // value. In columnar code we prefer not to pass vectors by
508 // value, so we return a filtered range instead.
509 return FilterRange (m_map.begin(), m_map.end(),
510 [accessors = m_accessors, pPart] (AssocId assoc) {
511 return (accessors->findIndex(assoc,pPart) != invalidIndex);});}
512
513 [[nodiscard]] auto getMiscAssociation() const {
514 return m_accessors->getMiscAssociation(m_map);}
515
516
519
521 return getConstVec(PartId(*pPart), p);}
523 constvec_t totalvec;
524 for (decltype(auto) assoc : getAssociations(pPart)) {
526 totalvec += m_accessors->trkVec(assoc, pPart);
527 } else {
528 totalvec += m_accessors->calVec(assoc, pPart);
529 }
530 }
531 return totalvec;}
532
533 [[nodiscard]] ConstVec overlapCalVec(AssocId assoc) const {
534 constvec_t calvec;
535 for (size_t iKey = 0; iKey < m_accessors->sizeCal(assoc); iKey++) {
536 bool selector = (getObjSelectionFlags(assoc) & m_accessors->calkey(assoc)[iKey]) ? !m_accessors->isMisc(assoc) : m_accessors->isMisc(assoc);
537 if (selector) calvec+=m_accessors->calVec(assoc,iKey);
538 }
539 return calvec;}
540
541 [[nodiscard]] ConstVec overlapTrkVec(AssocId assoc) const {
542 constvec_t trkvec;
543 for (size_t iKey = 0; iKey < m_accessors->sizeTrk(assoc); iKey++) {
544 bool selector = (getObjSelectionFlags(assoc) & m_accessors->trkkey(assoc)[iKey]) ? !m_accessors->isMisc(assoc) : m_accessors->isMisc(assoc);
545 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]);
546 }
547 return trkvec;
548 }
549
550
551
554 private:
555
559
562
565 };
566
567
568
569 template<typename CM>
575
576 template<typename CM>
582}
583
584#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