ATLAS Offline Software
Loading...
Searching...
No Matches
EventInfo_v1.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2026 CERN for the benefit of the ATLAS collaboration
3*/
4
5// System include(s):
6#include <atomic>
7#include <print>
8#include <format>
9#include <stdexcept>
10
11// EDM include(s):
14#include "CxxUtils/stall.h"
15
16// Local include(s):
20
21#ifndef XAOD_STANDALONE
24#endif
25
27
32 static std::atomic< bool > uninitPileupAccessPrinted = false;
33 if( ! uninitPileupAccessPrinted ) {
34 std::println( "xAOD::EventInfo WARNING Uninitialised pileup value was "
35 "accessed.\n"
36 " Debug it by breaking on "
37 "xAODEventInfoPrivate::pileupUnsetHook function calls!" );
38 uninitPileupAccessPrinted = true;
39 }
40 return;
41 }
42
43 // register attributes' types early (before I/O) for schema evolution
44 static const SG::Accessor< uint64_t > accEvNum( "eventNumber" );
45 static const SG::Accessor< uint64_t > accMcEvNum( "mcEventNumber" );
46 static const SG::Accessor< uint64_t > accLow( "pileUpMixtureIDLowBits" );
47 static const SG::Accessor< uint64_t > accHigh( "pileUpMixtureIDHighBits" );
48
49} // private namespace
50
51namespace xAOD {
52
54 : SG::AuxElement(), m_streamTags(),
55 m_subEvents(), m_evtStore( nullptr ) {
56
57 }
58
60 : SG::AuxElement(parent), m_streamTags(),
62 m_evtStore( parent.m_evtStore ) {
63
64 makePrivateStore( parent );
65 }
66
68
69 if (&rhs != this) {
70 // Clear out the caches:
71 m_streamTags.store (std::vector< StreamTag >());
72 m_streamTags.reset();
73 m_subEvents.store (std::vector< SubEvent >());
74 m_subEvents.reset();
75
76 // Copy the event store pointer:
78
79 // Copy the auxiliary variables:
80 SG::AuxElement::operator=( rhs );
81 }
82
83 // Return this object:
84 return *this;
85 }
86
88 //
89 // Implementation of the basic event properties
90 //
91
93 runNumber, setRunNumber )
95 eventNumber, setEventNumber )
97 lumiBlock, setLumiBlock )
99 timeStamp, setTimeStamp )
101 timeStampNSOffset,
102 setTimeStampNSOffset )
104 bcid, setBCID )
106 detectorMask0, setDetectorMask0 )
108 detectorMask1, setDetectorMask1 )
110 detectorMask2, setDetectorMask2 )
112 detectorMask3, setDetectorMask3 )
113
115
116 return ( ( static_cast< uint64_t >( detectorMask1() ) << 32 ) |
117 detectorMask0() );
118 }
119
121
122 setDetectorMask0( mask0 );
123 setDetectorMask1( mask1 );
124 return;
125 }
126
128
129 setDetectorMask0( static_cast< uint32_t >( mask & 0xffffffff ) );
130 setDetectorMask1( static_cast< uint32_t >( ( mask >> 32 ) &
131 0xffffffff ) );
132 return;
133 }
134
136
137 return ( ( static_cast< uint64_t >( detectorMask3() ) << 32 ) |
138 detectorMask2() );
139 }
140
142
143 setDetectorMask2( mask2 );
145 return;
146 }
147
149
150 setDetectorMask2( static_cast< uint32_t >( mask & 0xffffffff ) );
151 setDetectorMask3( static_cast< uint32_t >( ( mask >> 32 ) &
152 0xffffffff ) );
153 return;
154 }
155
156 //
158
160 //
161 // Implementation of the event type properties
162 //
163
166 detDescrTags, setDetDescrTags )
168 mcChannelNumber, setMCChannelNumber )
170 mcEventNumber, setMCEventNumber )
172 mcEventWeights, setMCEventWeights )
173
174 float EventInfo_v1::mcEventWeight( size_t i ) const {
175
176 // Throw an exception when asked for an impossible index:
177 return mcEventWeights().at( i );
178 }
179
181 eventTypeBitmask, setEventTypeBitmask )
182
184
185 return ( eventTypeBitmask() & static_cast< uint32_t >( type ) );
186 }
187
188 //
190
192 //
193 // Implementation of the trigger related properties
194 //
195
197 statusElement, setStatusElement )
199 extendedLevel1ID, setExtendedLevel1ID )
201 level1TriggerType,
202 setLevel1TriggerType )
203
204 EventInfo_v1::StreamTag::StreamTag( const std::string& name,
205 const std::string& type,
206 bool obeysLumiblock,
207 const std::set< uint32_t >& robs,
208 const std::set< uint32_t >& dets )
209 : m_name( name ), m_type( type ), m_obeysLumiblock( obeysLumiblock ),
210 m_robs( robs ), m_dets( dets ) {
211
212 }
213
214 const std::string& EventInfo_v1::StreamTag::name() const {
215
216 return m_name;
217 }
218
219 const std::string& EventInfo_v1::StreamTag::type() const {
220
221 return m_type;
222 }
223
225
226 return m_obeysLumiblock;
227 }
228
229 const std::set< uint32_t >& EventInfo_v1::StreamTag::robs() const {
230
231 return m_robs;
232 }
233
234 const std::set< uint32_t >& EventInfo_v1::StreamTag::dets() const {
235
236 return m_dets;
237 }
238
239 //
240 // Accessor objects for the stream properties:
241 //
242 static const EventInfo_v1::Accessor< std::vector< std::string > >
243 names( "streamTagNames" );
244 static const EventInfo_v1::Accessor< std::vector< std::string > >
245 types( "streamTagTypes" );
246 static const EventInfo_v1::Accessor< std::vector< char > >
247 olb( "streamTagObeysLumiblock" );
248 static const EventInfo_v1::Accessor< std::vector< std::set< uint32_t > > >
249 robsets( "streamTagRobs" );
250 static const EventInfo_v1::Accessor< std::vector< std::set< uint32_t > > >
251 detsets( "streamTagDets" );
252
253 const std::vector< EventInfo_v1::StreamTag >&
255
256 // Cache the new information if necessary:
257 if( !m_streamTags.isValid() ) {
258 std::vector< StreamTag > tags;
259
260 // A little sanity check:
261 if( ( names( *this ).size() != types( *this ).size() ) ||
262 ( names( *this ).size() != olb( *this ).size() ) ||
263 ( robsets.isAvailable( *this ) &&
264 ( names( *this ).size() != robsets( *this ).size() ) ) ||
265 ( detsets.isAvailable( *this ) &&
266 ( names( *this ).size() != detsets( *this ).size() ) ) ) {
267 std::println( std::cerr, "<xAOD::EventInfo_v1::streamTags> ERROR "
268 "Corrupt information found!" );
269 std::println( std::cerr, " streamTagNames = {}", names( *this ) );
270 std::println( std::cerr, " streamTagTypes = {}", types( *this ) );
271 std::println( std::cerr, " streamTagObeysLumiblock = {}", olb( *this ) );
272 std::print( std::cerr, " streamTagRobs = " );
273 if( robsets.isAvailable( *this ) ) {
274 std::println( std::cerr, "N/A" );
275 } else {
276 std::println( std::cerr, "{}", robsets( *this ) );
277 }
278 std::print( std::cerr, " streamTagDets = " );
279 if( detsets.isAvailable( *this ) ) {
280 std::println( std::cerr, "N/A" );
281 } else {
282 std::println( std::cerr, "{}", detsets( *this ) );
283 }
284 }
285
286 else {
287 // Fill the tags.
288 for( size_t i = 0; i < names( *this ).size(); ++i ) {
289 static const std::set< uint32_t > dummySet;
290 tags.emplace_back( names( *this )[ i ],
291 types( *this )[ i ],
292 olb( *this )[ i ],
293 ( robsets.isAvailable( *this ) ?
294 robsets( *this )[ i ] :
295 dummySet ),
296 ( detsets.isAvailable( *this ) ?
297 detsets( *this )[ i ] :
298 dummySet ) );
299 }
300 }
301
302 // Set the cache.
303 m_streamTags.set (std::move (tags));
304 }
305
306 // Return the cached object:
307 return *m_streamTags.ptr();
308 }
309
310 void EventInfo_v1::setStreamTags( const std::vector< StreamTag >& value ) {
311
312 // Update the cached information:
313 m_streamTags.store (value);
314
315 // Clear the persistent information:
316 names( *this ).clear(); types( *this ).clear(); olb( *this ).clear();
317 robsets( *this ).clear(); detsets( *this ).clear();
318
319 // Fill the persistent information:
320 std::vector< StreamTag >::const_iterator itr = value.begin();
321 std::vector< StreamTag >::const_iterator end = value.end();
322 for( ; itr != end; ++itr ) {
323 names( *this ).push_back( itr->name() );
324 types( *this ).push_back( itr->type() );
325 olb( *this ).push_back( itr->obeysLumiblock() );
326 robsets( *this ).push_back( itr->robs() );
327 detsets( *this ).push_back( itr->dets() );
328 }
329
330 return;
331 }
332
333 //
335
337 //
338 // Implementation of the pileup information functions
339 //
340
342 static const SG::Accessor< float >
343 accActualInteractionsPerCrossing( "actualInteractionsPerCrossing" );
345 static const SG::Accessor< float >
346 accAverageInteractionsPerCrossing( "averageInteractionsPerCrossing" );
347
349
350 // If the value is not available, then return 0.0, but allow users to
351 // find out about this issue.
352 if( ! accActualInteractionsPerCrossing.isAvailable( *this ) ) {
354 return 0.0f;
355 }
356 return accActualInteractionsPerCrossing( *this );
357 }
358
360
361 accActualInteractionsPerCrossing( *this ) = value;
362 return;
363 }
364
366
367 // If the value is not available, then return 0.0, but allow users to
368 // find out about this issue.
369 if( ! accAverageInteractionsPerCrossing.isAvailable( *this ) ) {
371 return 0.0f;
372 }
373 return accAverageInteractionsPerCrossing( *this );
374 }
375
377
378 accAverageInteractionsPerCrossing( *this ) = value;
379 return;
380 }
381
383 pileUpMixtureIDLowBits,
384 setPileUpMixtureIDLowBits )
387 setPileUpMixtureIDHighBits )
388
390
391 PileUpMixtureID id{};
392
393 // We need to check if the values are actually stored
394 if ( xAODEventInfoPrivate::accLow.isAvailable( *this )
395 && xAODEventInfoPrivate::accHigh.isAvailable( *this ) ) {
396 id.lowBits = pileUpMixtureIDLowBits();
397 id.highBits = pileUpMixtureIDHighBits();
398 }
399
400 return id;
401
402 }
403
405
406 setPileUpMixtureIDLowBits( value.lowBits );
407 setPileUpMixtureIDHighBits( value.highBits );
408
409 }
410
411 EventInfo_v1::SubEvent::
414 : m_time( time ), m_index( index ), m_type( type ), m_link( link ) {
415
416 }
417
419
420 return m_time;
421 }
422
424
425 return m_index;
426 }
427
432
433 const std::string& EventInfo_v1::SubEvent::typeName() const {
434
435 // This is a really inefficienct implementation, but didn't
436 // feel like writing a short and efficient implementation for C++11,
437 // and a longer but still efficient version for C++03. This is a
438 // medium-sized, slow implementation that works everywhere... :-P
439 if( m_type == Signal ) {
440 static const std::string name = "Signal";
441 return name;
442 } else if( m_type == MinimumBias ) {
443 static const std::string name = "MinimumBias";
444 return name;
445 } else if( m_type == Cavern ) {
446 static const std::string name = "Cavern";
447 return name;
448 } else if( m_type == HaloGas ) {
449 static const std::string name = "HaloGas";
450 return name;
451 } else if( m_type == HighPtMinimumBias ) {
452 static const std::string name = "HighPtMinimumBias";
453 return name;
454 } else if( m_type == ZeroBias ) {
455 static const std::string name = "ZeroBias";
456 return name;
457 } else {
458 static const std::string name = "Unknown";
459 return name;
460 }
461 }
462
465
466 return m_link;
467 }
468
470
471 if( m_link.isValid() ) {
472 return *m_link;
473 } else {
474 return nullptr;
475 }
476 }
477
478 //
479 // Accessor objects for the sub-event properties:
480 //
482 timeAcc( "subEventTime" );
484 indexAcc( "subEventIndex" );
486 linkAcc( "subEventLink" );
488 typeAcc( "subEventType" );
489
490 std::vector< EventInfo_v1::SubEvent >
492 {
493 std::vector< SubEvent > subEvents;
494
495 // Check if any of the information is available:
496 if( ( ! timeAcc.isAvailable( *this ) ) &&
497 ( ! indexAcc.isAvailable( *this ) ) &&
498 ( ! linkAcc.isAvailable( *this ) ) &&
499 ( ! typeAcc.isAvailable( *this ) ) )
500 {
501 // If not, return right away:
502 return subEvents;
503 }
504 // A little sanity check:
505 size_t size = 0;
506 if( timeAcc.isAvailable( *this ) ) {
507 size = timeAcc( *this ).size();
508 } else if( indexAcc.isAvailable( *this ) ) {
509 size = indexAcc( *this ).size();
510 } else if( linkAcc.isAvailable( *this ) ) {
511 size = linkAcc( *this ).size();
512 } else if( typeAcc.isAvailable( *this ) ) {
513 size = typeAcc( *this ).size();
514 } else {
515 std::println( std::cerr, "xAOD::EventInfo_v1 ERROR Logic error in subEvents()" );
516 return subEvents;
517 }
518 if( ( timeAcc.isAvailable( *this ) &&
519 ( size != timeAcc( *this ).size() ) ) ||
520 ( indexAcc.isAvailable( *this ) &&
521 ( size != indexAcc( *this ).size() ) ) ||
522 ( linkAcc.isAvailable( *this ) &&
523 ( size != linkAcc( *this ).size() ) ) ||
524 ( typeAcc.isAvailable( *this ) &&
525 ( size != typeAcc( *this ).size() ) ) ) {
526 std::println( std::cerr, "xAOD::EventInfo_v1 ERROR Data corruption found in "
527 "the sub-event information" );
528 std::println( std::cerr, "subEventTime = {}",
529 ( timeAcc.isAvailable( *this ) ? timeAcc( *this ) :
530 std::vector< int16_t >() ) );
531 std::println( std::cerr, "subEventIndex = {}",
532 ( indexAcc.isAvailable( *this ) ? indexAcc( *this ) :
533 std::vector< uint16_t >() ) );
534
535 auto format_el = [] (const ElementLink< EventInfoContainer_v1 >& el)
536 {
537 return std::format ("{}:{}", el.dataID(), el.index());
538 };
539 const std::vector< ElementLink< EventInfoContainer_v1 > >& links =
540 linkAcc.isAvailable( *this ) ? linkAcc( *this ) :
541 std::vector< ElementLink< EventInfoContainer_v1 > >();
542 auto linksform = links | std::views::transform (format_el);
543
544 std::println( std::cerr, "subEventLink = {}", linksform );
545 std::println( std::cerr,"subEventType = {}",
546 ( typeAcc.isAvailable( *this ) ? typeAcc( *this ) :
547 std::vector< uint16_t >() ) );
548 return subEvents;
549 }
550 // Fill up the cache:
551 for( size_t i = 0; i < size; ++i ) {
552 const int16_t time =
553 timeAcc.isAvailable( *this ) ? timeAcc( *this )[ i ] : 0;
554 const uint16_t index =
555 indexAcc.isAvailable( *this ) ? indexAcc( *this )[ i ] : 0;
557 linkAcc.isAvailable( *this ) ? linkAcc( *this )[ i ] :
559 const PileUpType type =
560 ( typeAcc.isAvailable( *this ) ?
561 static_cast< PileUpType >( typeAcc( *this )[ i ] ) :
562 Unknown );
563 subEvents.emplace_back( time, index, type, link );
564 }
565
566 return subEvents;
567 }
568
569 const std::vector< EventInfo_v1::SubEvent >&
571
572 // Cache the new information if necessary:
573 if( !m_subEvents.isValid() ) {
575 }
576
577 // Return the cached vector:
578 return *m_subEvents.ptr();
579 }
580
581 void EventInfo_v1::setSubEvents( const std::vector< SubEvent >& value ) {
582
583 // Update the cached information:
584 m_subEvents.store (value);
585
586 // Clear the persistent information:
587 timeAcc( *this ).clear(); indexAcc( *this ).clear();
588 typeAcc( *this ).clear(); linkAcc( *this ).clear();
589
590 // Fill the persistent information:
591 std::vector< SubEvent >::const_iterator itr = value.begin();
592 std::vector< SubEvent >::const_iterator end = value.end();
593 for( ; itr != end; ++itr ) {
594 timeAcc( *this ).push_back( itr->time() );
595 indexAcc( *this ).push_back( itr->index() );
596 typeAcc( *this ).push_back( static_cast< uint16_t >( itr->type() ) );
597 linkAcc( *this ).push_back( itr->link() );
598 }
599
600 return;
601 }
602
603 void EventInfo_v1::addSubEvent( const SubEvent& subEvent ) {
604
605 // First, make sure that the persistent and transient variables are in
606 // sync:
607 subEvents();
608
609 // Now, add the new sub-event:
610 std::vector<SubEvent> subEvents = *m_subEvents.ptr();
611 subEvents.push_back( subEvent );
612 m_subEvents.store (std::move (subEvents));
613 timeAcc( *this ).push_back( subEvent.time() );
614 indexAcc( *this ).push_back( subEvent.index() );
615 typeAcc( *this ).push_back( static_cast< uint16_t >( subEvent.type() ) );
616 linkAcc( *this ).push_back( subEvent.link() );
617
618 return;
619 }
620
622
623 // Clear both the transient and persistent variables:
624 m_subEvents.store (std::vector<SubEvent>());
625 m_subEvents.reset();
626 timeAcc( *this ).clear(); indexAcc( *this ).clear();
627 typeAcc( *this ).clear(); linkAcc( *this ).clear();
628
629 return;
630 }
631
633 {
634 static const std::string typNam[PileUp_NTYPES+1] = {
635 "Unknown" /*99*/,
636 "Signal" /*0*/,
637 "MinimumBias" /*1*/,
638 "Cavern" /*2*/,
639 "HaloGas"/*3*/,
640 "ZeroBias"/*4*/ };
641 int t = (typ==Unknown)? 0: (int)typ+1;
642 assert( t <= PileUp_NTYPES );
643 return typNam[t];
644 }
645
647 {
648 static const PileUpType typEnum[PileUp_NTYPES+1] = {
649 Unknown /*99*/, Signal /*0*/, MinimumBias /*1*/, Cavern /*2*/, HaloGas /*3*/, ZeroBias /*4*/
650 };
651 int t = (typ==99)? 0: (int)typ+1;
652 assert( t <= PileUp_NTYPES );
653 return typEnum[t];
654 }
655
656 //
658
660 //
661 // Implementation of the detector flags
662 //
663
665 static const uint32_t EF_BITS = 0x0FFFFFFF;
667 static const uint32_t EF_ERROR_BITS = 0xF0000000;
669 static const uint32_t EF_ERROR_SHIFT = 28;
670
672
673 return ( ( *eventFlagsConstAccessorsV1( subDet ) )( *this ) &
674 EF_BITS );
675 }
676
678 size_t bit ) const {
679
680 // A little sanity check:
681 if( bit >= EF_ERROR_SHIFT ) {
682 throw std::runtime_error( "EventInfo_v1::isEventFlagBitSet: Asked for "
683 "non-existent bit" );
684 }
685
686 // Get the value of the flags:
687 uint32_t value = ( *eventFlagsConstAccessorsV1( subDet ) )( *this );
688
689 // Dig out the bit we are asking for:
690 return ( ( value >> bit ) & 0x1 );
691 }
692
694
695 // Get the accessor:
697 if( ! acc ) {
698 return false;
699 }
700
701 // Construct the value that we want to store, taking the current error
702 // flags into account:
703 std::atomic<uint32_t>& a = (*acc)(*this);
704 uint32_t orig = a;
705 uint32_t value = ( ( orig & EF_ERROR_BITS ) | ( flags & EF_BITS ) );
706 while (!a.compare_exchange_strong (orig, value)) {
707 CxxUtils::stall();
708 value = ( ( orig & EF_ERROR_BITS ) | ( flags & EF_BITS ) );
709 }
710
711 // Tell the user that we were successful:
712 return true;
713 }
714
715 bool EventInfo_v1::setEventFlagBit( EventFlagSubDet subDet, size_t bit) const
716 {
717 return updateEventFlagBit (subDet, bit);
718 }
719
720 bool EventInfo_v1::updateEventFlagBit( EventFlagSubDet subDet, size_t bit) const
721 {
722 // Check if the bit makes sense:
723 if( bit >= EF_ERROR_SHIFT ) {
724 return false;
725 }
726
727 // Don't try to write if the requested flag is already set.
728 uint32_t existingFlags = (*eventFlagsConstAccessorsV1( subDet ))( *this );
729 if (existingFlags & (1u << bit)) {
730 return true;
731 }
732
733 // Get the accessor:
735 if( ! acc ) {
736 return false;
737 }
738
739 // Set the new value:
740 ( *acc )( *this ) |= ( 1u << bit );
741
742 // Tell the user that we were successful:
743 return true;
744 }
745
747 {
748 // Get the accessor:
750 if( ! acc ) {
751 return false;
752 }
753
754 // Check if the bit makes sense:
755 if( bit >= EF_ERROR_SHIFT ) {
756 return false;
757 }
758
759 // Set the new value:
760 ( *acc )( *this ) &= ~( 1u << bit );
761
762 // Tell the user that we were successful:
763 return true;
764 }
765
767 const uint32_t flags_in) const
768 {
769 uint32_t flags = flags_in & EF_BITS;
770
771 // Don't try to write if all requested flags are already set.
772 uint32_t existingFlags = (*eventFlagsConstAccessorsV1( subDet ))( *this );
773 if ((existingFlags | flags) == existingFlags) {
774 return true;
775 }
776
777 // Get the accessor:
779 if( ! acc ) {
780 return false;
781 }
782
783 // Set the new value:
784 ( *acc )( *this ) |= ( flags & EF_BITS );
785
786 // Tell the user that we were successful:
787 return true;
788 }
789
792
793 // Get the value in one go:
794 return static_cast< EventFlagErrorState >(
795 ( ( *eventFlagsConstAccessorsV1( subDet ) )( *this ) >> EF_ERROR_SHIFT ) &
796 0xF );
797 }
798
800 EventFlagErrorState state ) {
801
802 // Get the accessor:
804 if( ! acc ) {
805 return false;
806 }
807
808 // Check its value:
809 if( ( state != NotSet ) && ( state != Warning ) && ( state != Error ) ) {
810 return false;
811 }
812
813 // Construct the new value:
814 std::atomic<uint32_t>& a = (*acc)(*this);
815 uint32_t orig = a;
816 uint32_t value = ( ( orig & EF_BITS ) |
817 ( static_cast< uint32_t >( state ) <<
818 EF_ERROR_SHIFT ) );
819 while (!a.compare_exchange_strong (orig, value)) {
820 CxxUtils::stall();
821 value = ( ( orig & EF_BITS ) |
822 ( static_cast< uint32_t >( state ) <<
823 EF_ERROR_SHIFT ) );
824 }
825
826 // Tell the user that we were successful:
827 return true;
828 }
829
831 const EventFlagErrorState state ) const
832 {
833 // Check its value:
834 if( ( state != NotSet ) && ( state != Warning ) && ( state != Error ) ) {
835 return false;
836 }
837
838 // Return without trying to write if the desired state is
839 // already set.
840 if (errorState (subDet) == state) {
841 return true;
842 }
843
844 // Get the accessor:
846 if( ! acc ) {
847 return false;
848 }
849
850 // Construct the new value:
851 std::atomic<uint32_t>& a = (*acc)(*this);
852 uint32_t orig = a;
853
854 // Only allow increasing the error state in an update.
855 if (state < ((orig >> EF_ERROR_SHIFT) & 0xf)) {
856 return false;
857 }
858
859 uint32_t value = ( ( orig & EF_BITS ) |
860 ( static_cast< uint32_t >( state ) <<
861 EF_ERROR_SHIFT ) );
862 while (!a.compare_exchange_strong (orig, value)) {
863 if (state < ((orig >> EF_ERROR_SHIFT) & 0xf)) {
864 return false;
865 }
866
867 value = ( ( orig & EF_BITS ) |
868 ( static_cast< uint32_t >( state ) <<
869 EF_ERROR_SHIFT ) );
870
871 CxxUtils::stall();
872 }
873
874 // Tell the user that we were successful:
875 return true;
876 }
877
878 //
880
882 //
883 // Implementation of the beam spot functions
884 //
885
889
890 void EventInfo_v1::setBeamPos( float x, float y, float z ) {
891
892 // The accessor objects:
893 static const Accessor< float > accX( "beamPosX" );
894 static const Accessor< float > accY( "beamPosY" );
895 static const Accessor< float > accZ( "beamPosZ" );
896
897 // Set the variables:
898 accX( *this ) = x;
899 accY( *this ) = y;
900 accZ( *this ) = z;
901
902 return;
903 }
904
908
909 void EventInfo_v1::setBeamPosSigma( float x, float y, float z ) {
910
911 // The accessor objects:
912 static const Accessor< float > accX( "beamPosSigmaX" );
913 static const Accessor< float > accY( "beamPosSigmaY" );
914 static const Accessor< float > accZ( "beamPosSigmaZ" );
915
916 // Set the variables:
917 accX( *this ) = x;
918 accY( *this ) = y;
919 accZ( *this ) = z;
920
921 return;
922 }
923
926
931
934
935
937 static const SG::Accessor< float >
938 accBeamSpotWeight( "beamSpotWeight" );
939
941 return accBeamSpotWeight.isAvailable( *this );
942 }
943
945 // If the value is not available, then return 1.0
946 if( ! hasBeamSpotWeight() ) return 1.0f;
947 return accBeamSpotWeight( *this );
948 }
949
951 accBeamSpotWeight( *this ) = value;
952 return;
953 }
954
955
956 //
958
959 StoreGateSvc* EventInfo_v1::evtStore() const {
960
961 return m_evtStore;
962 }
963
965
966 m_evtStore = svc;
967 return;
968 }
969
971
972 // Check if the ElementLink variable is available, and writable:
973 if( linkAcc.isAvailableWritable( *this ) ) {
974 // Prepare the ElementLink objects for ROOT I/O:
975 std::vector< ElementLink< EventInfoContainer_v1 > >::iterator
976 el_itr = linkAcc( *this ).begin();
977 std::vector< ElementLink< EventInfoContainer_v1 > >::iterator
978 el_end = linkAcc( *this ).end();
979 for( ; el_itr != el_end; ++el_itr ) {
980 el_itr->toPersistent();
981 }
982 }
983
984 return;
985 }
986
993
994 m_streamTags.reset();
995 m_subEvents.reset();
996#ifdef XAOD_STANDALONE
997 m_evtStore = nullptr;
998#else
1000#endif
1001
1002 if( usingStandaloneStore() ) {
1003 setStore( ( SG::IAuxStore* ) nullptr );
1004 }
1005
1006 return;
1007 }
1008
1009 std::string EventInfo_v1::toString() const {
1010 return std::format(
1011 "[Run,Evt,Lumi,Time,BunchCross,DetMask] = [{},{},{},{}:{},{},{:#018x}]",
1012 runNumber(),
1013 eventNumber(),
1014 lumiBlock(),
1015 timeStamp(),
1017 bcid(),
1018 detectorMask() );
1019 }
1020
1054 std::ostream& operator<< ( std::ostream& out,
1055 const xAOD::EventInfo_v1& ei ) {
1056 std::print( out, "{}", ei.toString() );
1057 return out;
1058 }
1059
1067 std::ostream& operator<<( std::ostream &out,
1069 std::print( out, "{}", id );
1070 return out;
1071 }
1072
1082
1083 return a.lowBits == b.lowBits && a.highBits == b.highBits;
1084
1085 }
1086
1087} // namespace xAOD
Access an auxiliary variable atomically.
#define AUXSTORE_PRIMITIVE_GETTER(CL, TYPE, NAME)
Macro creating the reader function for a primitive auxiliary property.
#define AUXSTORE_PRIMITIVE_SETTER_AND_GETTER(CL, TYPE, NAME, SETTER)
Macro creating the accessors of primitive auxiliary properties.
#define AUXSTORE_OBJECT_SETTER_AND_GETTER(CL, TYPE, NAME, SETTER)
Macro creating the accessors of complex auxiliary properties.
static Double_t a
static const std::vector< std::string > types
static const uint32_t mask3
size_t size() const
Number of registered mappings.
#define y
#define x
#define z
This class represents the "type of event" where the type is given by one or more "characteristics".
Definition EventType.h:92
Helper class to provide type-safe access to aux data.
Access an auxiliary variable atomically.
Interface for non-const operations on an auxiliary store.
Definition IAuxStore.h:51
The Athena Transient Store API.
bool obeysLumiblock() const
Get whether the the stream obeys the luminosity block boundaires.
StreamTag(const std::string &name, const std::string &type, bool obeysLumiblock, const std::set< uint32_t > &robs=std::set< uint32_t >(), const std::set< uint32_t > &dets=std::set< uint32_t >())
Constructor giving all relevant information to the object.
const std::set< uint32_t > & dets() const
Get the (optional) list of detector IDs for partial event building.
std::set< uint32_t > m_dets
Optional list of detector IDs for PEB.
bool m_obeysLumiblock
Whether the stream obeys luminosity block boundaries.
const std::string & type() const
Get the type of the stream.
std::string m_type
The type of the stream.
std::string m_name
The name of the stream.
const std::string & name() const
Get the name of the stream.
std::set< uint32_t > m_robs
Optional list of RoB IDs for PEB.
const std::set< uint32_t > & robs() const
Get the (optional) list of RoB IDs for partial event building.
Class describing the properties of one pileup sub-event.
uint16_t m_index
The index of the pileup event.
PileUpType m_type
The type of the pileup event.
ElementLink< EventInfoContainer_v1 > m_link
Link to the EventInfo object in question.
uint16_t index() const
Get the index of the sub-event.
const ElementLink< EventInfoContainer_v1 > & link() const
Get a link to the EventInfo object describing the pileup event.
int16_t m_time
The time wrt. the signal event.
int16_t time() const
Get the time wrt. the signal event (which has time() == 0).
const EventInfo_v1 * ptr() const
Get a pointer to the EventInfo object describing the pileup event.
PileUpType type() const
Get the type of the pileup event.
const std::string & typeName() const
The string name of the type.
Class describing the basic event information.
void setBeamPosSigma(float x, float y, float z)
Set the size of the beam spot.
static const std::string & PileUpType2Name(PileUpType typ)
Convert PileUpType enum value to string.
uint32_t detectorMask3() const
Bit field indicating which TTC zones are present in the event.
void setAverageInteractionsPerCrossing(float value)
Set average interactions per crossing for all BCIDs.
CxxUtils::CachedValue< std::vector< StreamTag > > m_streamTags
Cached stream tag objects.
bool resetEventFlagBit(EventFlagSubDet subDet, size_t bit)
Reset one particular bit of one particular sub-detector.
uint64_t pileUpMixtureIDLowBits() const
Unique pile-up mixture identifier low bits.
float beamPosSigmaY() const
The width of the beam spot in the Y direction.
void setDetectorMask(uint32_t mask0, uint32_t mask1)
Set the bit fields indicating with TTC timezones were present.
uint32_t lumiBlock() const
The current event's luminosity block number.
bool eventType(EventType type) const
Check for one particular bitmask value.
std::vector< EventInfo_v1::SubEvent > makeSubEvents() const
void toPersistent()
Prepare the object for writing.
std::vector< std::pair< std::string, std::string > > DetDescrTags_t
Type of the detector description tags.
uint32_t eventTypeBitmask() const
The event type bitmask.
uint32_t bcid() const
The bunch crossing ID of the event.
EventFlagSubDet
Sub-detector types for which we store event-level flags.
float beamPosX() const
X coordinate of the beam spot position.
void setDetectorMask1(uint32_t value)
Set the bit field indicating with TTC timezones were present.
bool updateEventFlagBit(const EventFlagSubDet subDet, const size_t bit) const
Change detector flags with update semantics.
void setStreamTags(const std::vector< StreamTag > &value)
Set the streams that the event was put in.
void setBeamTiltYZ(float value)
Set the beam's tilt in radians in YZ.
bool setErrorState(EventFlagSubDet subDet, EventFlagErrorState state)
Set the error state for a particular sub-detector.
void clearSubEvents()
Clear all the currently held sub-events.
StoreGateSvc * m_evtStore
Transient pointer to the StoreGateSvc instance associated with the event (Needed for pile-up digitisa...
float beamPosSigmaXY() const
The beam spot shape's X-Y correlation.
float beamSpotWeight() const
Weight for beam spot size reweighting.
void toTransient()
Cleanse the object after being read in.
std::string toString() const
Convert to a string representation.
bool updateEventFlags(const EventFlagSubDet subDet, const uint32_t flags_in) const
Turn on a set of event flags for one particular sub-detector.
void setDetectorMask0(uint32_t value)
Set the bit field indicating with TTC timezones were present.
bool setEventFlags(EventFlagSubDet subDet, uint32_t flags)
Set the event flags for a particular sub-detector.
EventInfo_v1 & operator=(const EventInfo_v1 &rhs)
Assignment operator.
bool isEventFlagBitSet(EventFlagSubDet subDet, size_t bit) const
Check one particular bit of one particular sub-detector.
void setDetectorMaskExt(uint32_t mask2, uint32_t mask3)
Set the bit fields indicating with TTC timezones were present.
void setSubEvents(const std::vector< SubEvent > &value)
Set the pileup events that were used in the simulation.
void setBeamSpotWeight(float value)
Set weight for beam spot size reweighting.
float averageInteractionsPerCrossing() const
Average interactions per crossing for all BCIDs - for out-of-time pile-up.
void setBeamPos(float x, float y, float z)
Set the beam spot position.
EventFlagErrorState
States that a given sub-detector could be in.
@ Warning
The sub-detector issued a warning.
@ NotSet
The flag was not set to anything.
@ Error
The sub-detector issued an error.
float beamTiltYZ() const
The beam's tilt in radians in YZ.
PileUpMixtureID pileUpMixtureID() const
Unique pile-up mixture identifier.
void setBeamPosSigmaXY(float value)
Set the beam spot shape's X-Y correlation.
float actualInteractionsPerCrossing() const
Average interactions per crossing for the current BCID - for in-time pile-up.
CxxUtils::CachedValue< std::vector< SubEvent > > m_subEvents
Cached sub-event objects.
uint32_t timeStamp() const
POSIX time in seconds from 1970. January 1st.
void addSubEvent(const SubEvent &subEvent)
Add one sub-event to the existing list.
void setPileUpMixtureID(const PileUpMixtureID &value)
Set unique pile-up mixture identifier.
void setDetectorMask2(uint32_t value)
Set the bit field indicating with TTC timezones were present.
void setBeamStatus(uint32_t value)
Set the beam spot's status word.
uint32_t eventFlags(EventFlagSubDet subDet) const
Get the event flags for a particular sub-detector.
uint64_t detectorMaskExt() const
Bit field indicating which TTC zones are present in the event.
const std::vector< SubEvent > & subEvents() const
Get the pileup events that were used in the simulation.
const std::vector< StreamTag > & streamTags() const
Get the streams that the event was put in.
void setDetectorMask3(uint32_t value)
Set the bit field indicating with TTC timezones were present.
EventInfo_v1()
Default constructor.
void setEvtStore(StoreGateSvc *svc)
Set the pointer to the event store associated with this event.
float beamPosSigmaX() const
The width of the beam spot in the X direction.
uint32_t detectorMask0() const
Bit field indicating which TTC zones are present in the event.
PileUpType
Enumerator describing the types of pileup events.
@ HaloGas
Halo-gas non-collision background.
@ HighPtMinimumBias
High pT Minimum bias pileup event.
@ MinimumBias
(Low pT) Minimum bias pileup event
@ ZeroBias
Zero bias pileup event.
@ Signal
The signal event.
@ Cavern
Cavern background pileup event.
@ Unknown
Type not known/specified.
void setBeamTiltXZ(float value)
Set the beam's tilt in radians in XZ.
float beamPosZ() const
Z coordinate of the beam spot position.
uint64_t pileUpMixtureIDHighBits() const
Unique pile-up mixture identifier high bits.
bool updateErrorState(const EventFlagSubDet subDet, const EventFlagErrorState state) const
Update the error state for one particular sub-detector.
uint32_t runNumber() const
The current event's run number.
bool hasBeamSpotWeight() const
Check if weight for beam spot size reweighting exists.
void setPileUpMixtureIDHighBits(uint64_t value)
Set unique pile-up mixture identifier high bits.
uint32_t detectorMask2() const
Bit field indicating which TTC zones are present in the event.
uint32_t timeStampNSOffset() const
Nanosecond time offset wrt. the time stamp.
EventFlagErrorState errorState(EventFlagSubDet subDet) const
Get the error state for a particular sub-detector.
uint64_t eventNumber() const
The current event's event number.
float beamPosSigmaZ() const
The length of the beam spot in the Z direction.
float beamPosY() const
Y coordinate of the beam spot position.
float mcEventWeight(size_t i=0) const
The weight of one specific MC event used in the simulation.
bool setEventFlagBit(EventFlagSubDet subDet, size_t bit) const
Set one particular bit of one particular sub-detector.
uint64_t detectorMask() const
Bit field indicating which TTC zones are present in the event.
static PileUpType PileUpInt2Type(unsigned short typ)
Convert int to PileUpType enum value.
void setPileUpMixtureIDLowBits(uint64_t value)
Set unique pile-up mixture identifier low bits.
void setActualInteractionsPerCrossing(float value)
Set average interactions per crossing for the current BCID.
std::vector< std::string > tags
Definition hcg.cxx:107
IProxyDict * proxyDictFromEventContext()
Return the IProxyDict for this thread's current context.
Forward declaration.
Definition index.py:1
STL namespace.
static const SG::Accessor< uint64_t > accMcEvNum("mcEventNumber")
void pileupUnsetHook()
Function that would be possible to use to debug what client is trying to access pileup values from an...
static const SG::Accessor< uint64_t > accHigh("pileUpMixtureIDHighBits")
static const SG::Accessor< uint64_t > accEvNum("eventNumber")
static const SG::Accessor< uint64_t > accLow("pileUpMixtureIDLowBits")
ICaloAffectedTool is abstract interface for tools checking if 4 mom is in calo affected region.
const SG::AtomicDecorator< uint32_t > * eventFlagsAccessorsV1(EventInfo_v1::EventFlagSubDet subDet)
Helper function for accessing event flag variables.
static const EventInfo_v1::Accessor< std::vector< std::set< uint32_t > > > detsets("streamTagDets")
setEventNumber timeStamp
static const EventInfo_v1::Accessor< std::vector< std::set< uint32_t > > > robsets("streamTagRobs")
static const EventInfo_v1::Accessor< std::vector< char > > olb("streamTagObeysLumiblock")
static const SG::Accessor< std::vector< uint16_t > > typeAcc("subEventType")
static const uint32_t EF_ERROR_SHIFT
Shift used to store the sub-detector error states.
setMCChannelNumber mcEventWeights
static const SG::Accessor< std::vector< uint16_t > > indexAcc("subEventIndex")
pileUpMixtureIDHighBits
static const SG::Accessor< float > accActualInteractionsPerCrossing("actualInteractionsPerCrossing")
Accessor for "actualInteractionsPerCrossing".
setRawEt setRawPhi int
static const SG::Accessor< std::vector< std::string > > names("thrNames")
Accessor for the names of the passed thresholds.
setTeId lumiBlock
static const uint32_t EF_BITS
Bits that store the "user defined" detector flags.
bool operator==(const xAOD::EventInfo_v1::PileUpMixtureID &a, const xAOD::EventInfo_v1::PileUpMixtureID &b)
This operator is provided to make it convenient to compare two instances of PileUpMixtureID directly.
static const EventInfo_v1::Accessor< std::vector< std::string > > types("streamTagTypes")
setBeamTiltXZ static setBeamStatus const SG::Accessor< float > accBeamSpotWeight("beamSpotWeight")
Accessor for "BeamSpotWeight".
setScaleOne setStatusOne setSaturated int16_t
static const SG::Accessor< std::vector< ElementLink< EventInfoContainer_v1 > > > linkAcc("subEventLink")
AUXSTORE_PRIMITIVE_SETTER_AND_GETTER(BTagging_v1, float, IP2D_pb, setIP2D_pb) AUXSTORE_PRIMITIVE_SETTER_AND_GETTER(BTagging_v1
static const SG::Accessor< std::vector< int16_t > > timeAcc("subEventTime")
setEventNumber setTimeStamp setBCID setDetectorMask1 detectorMask3
static const uint32_t EF_ERROR_BITS
Bits that store the error state of the sub-detectors.
setEventNumber setTimeStamp bcid
std::ostream & operator<<(std::ostream &out, const std::pair< FIRST, SECOND > &pair)
Helper print operator.
setWord1 uint16_t
JetConstituentVector::iterator iterator
static const SG::Accessor< float > accAverageInteractionsPerCrossing("averageInteractionsPerCrossing")
Accessor for "averageInteractionsPerCrossing".
setBeamTiltXZ beamStatus
AUXSTORE_OBJECT_SETTER_AND_GETTER(CaloRings_v1, RingSetLinks, ringSetLinks, setRingSetLinks) unsigned CaloRings_v1
setEventNumber setTimeStamp setBCID detectorMask1
setEventNumber uint32_t
const SG::AtomicConstAccessor< uint32_t > * eventFlagsConstAccessorsV1(EventInfo_v1::EventFlagSubDet subDet)
Helper function for accessing event flag variables, for const access.
static const SG::Accessor< ElementLink< IParticleContainer > > acc("originalObjectLink")
Object used for setting/getting the dynamic decoration in question.
Some out-of-line helpers for ExtendedEventContext.
Emit stall instruction for use in a spin loop.
Unique pile-up mixture identifier definition.