ATLAS Offline Software
Loading...
Searching...
No Matches
EnhancedBiasWeighter Class Reference

Tool to calculate data-driven rates using EnhancedBias datasets. More...

#include <EnhancedBiasWeighter.h>

Inheritance diagram for EnhancedBiasWeighter:

Public Member Functions

 EnhancedBiasWeighter (const std::string &name)
virtual StatusCode initialize () override
 Initialize is required by AsgTool base class.
virtual StatusCode finalize () override
virtual StatusCode addBranches (const EventContext &ctx) const override
 Decorate the AOD with EnhancedBias weighting quantities such that no CVMFS or DB access is required on subsequent passes through the dAOD to perform rates.
virtual double getEBWeight (const xAOD::EventInfo *eventInfo) const override
virtual double getEBWeight (const EventContext &context) const override
virtual double getBunchCrossingRate () const override
virtual double getEBLiveTime (const xAOD::EventInfo *eventInfo) const override
virtual double getEBLiveTime (const EventContext &context) const override
virtual double getLBLength (const xAOD::EventInfo *eventInfo) const override
virtual double getLBLength (const EventContext &context) const override
virtual double getLBLumi (const xAOD::EventInfo *eventInfo) const override
virtual double getLBLumi (const EventContext &context) const override
virtual double getAverageLumi () const override
virtual double getAverageMu () const override
virtual double getDeadtime (const int lumiblock=-1) const override
virtual uint32_t getPairedBunches () const override
virtual StatusCode getDistanceIntoTrain (const xAOD::EventInfo *eventInfo, uint32_t &distance, const EventContext &ctx) const override
virtual uint32_t getRunNumber () const override
virtual bool isUnbiasedEvent (const xAOD::EventInfo *eventInfo) const override
virtual bool isGoodLB (const xAOD::EventInfo *eventInfo) const override
virtual bool isGoodLB (const EventContext &context) const override
virtual bool isMC () const override
virtual std::unordered_map< std::string, ChainDetailparsePrescaleXML (const std::string &prescaleXML) const override
 Parse a presscale XML and return a ordered summary of its content To make most use of the XML parsing available already in this class.
virtual const std::vector< int32_t > & getBunchGroups () const override
virtual void print () const
 Print the state of the tool.
ServiceHandle< StoreGateSvc > & evtStore ()
 The standard StoreGateSvc (event store) Returns (kind of) a pointer to the StoreGateSvc.
const ServiceHandle< StoreGateSvc > & detStore () const
 The standard StoreGateSvc/DetectorStore Returns (kind of) a pointer to the StoreGateSvc.
virtual StatusCode sysInitialize () override
 Perform system initialization for an algorithm.
virtual StatusCode sysStart () override
 Handle START transition.
virtual std::vector< Gaudi::DataHandle * > inputHandles () const override
 Return this algorithm's input handles.
virtual std::vector< Gaudi::DataHandle * > outputHandles () const override
 Return this algorithm's output handles.
Gaudi::Details::PropertyBase & declareProperty (Gaudi::Property< T, V, H > &t)
void updateVHKA (Gaudi::Details::PropertyBase &)
MsgStream & msg () const
bool msgLvl (const MSG::Level lvl) const
 DeclareInterfaceID (IAugmentationTool, 1, 0)
Additional helper functions, not directly mimicking Athena
template<class T>
const T * getProperty (const std::string &name) const
 Get one of the tool's properties.
const std::string & msg_level_name () const __attribute__((deprecated))
 A deprecated function for getting the message level's name.
const std::string & getName (const void *ptr) const
 Get the name of an object that is / should be in the event store.
SG::sgkey_t getKey (const void *ptr) const
 Get the (hashed) key of an object that is in the event store.

Static Public Attributes

static constexpr double LHC_FREQUENCY = 11245.5
static constexpr uint32_t FULL_RING = 2738
 Number of bunches in a full ring.

Protected Member Functions

void renounceArray (SG::VarHandleKeyArray &handlesArray)
 remove all handles from I/O resolution
std::enable_if_t< std::is_void_v< std::result_of_t< decltype(&T::renounce)(T)> > &&!std::is_base_of_v< SG::VarHandleKeyArray, T > &&std::is_base_of_v< Gaudi::DataHandle, T >, void > renounce (T &h)
void extraDeps_update_handler (Gaudi::Details::PropertyBase &ExtraDeps)
 Add StoreName to extra input/output deps as needed.

Private Types

typedef ServiceHandle< StoreGateSvcStoreGateSvc_t

Private Member Functions

StatusCode loadWeights ()
 Read into memory from XML event weights for this EnhancedBias run.
StatusCode loadLumi ()
 Read into memory this EnhancedBias run's XML.
StatusCode trackAverages (const xAOD::EventInfo *eventInfo) const
 Internal function to keep track of the mean instantaneous lumi & mean pileup of the EB/MC sample being processed.
StatusCode trackAverages (const EventContext &context) const
int32_t getEventEBID (const xAOD::EventInfo *eventInfo) const
int32_t getEventEBID (const EventContext &context) const
std::string findLocalFile (const std::string &fileName) const
Gaudi::Details::PropertyBase & declareGaudiProperty (Gaudi::Property< T, V, H > &hndl, const SG::VarHandleKeyType &)
 specialization for handling Gaudi::Property<SG::VarHandleKey>

Private Attributes

SG::ReadCondHandleKey< BunchCrossingCondDatam_bunchCrossingKey {this, "BunchCrossingKey", "BunchCrossingData", "Key BunchCrossing CDO" }
 Tool to get distance into bunch train.
Gaudi::Property< uint32_t > m_runNumber {this, "RunNumber", 0, "Run we're processing (if data), needed at initialize to locate and read in extra configuration."}
Gaudi::Property< bool > m_errorOnMissingEBWeights {this, "ErrorOnMissingEBWeights", false, "If true, Throws error if EB weights are missing."}
Gaudi::Property< bool > m_enforceEBGRL {this, "EnforceEBGRL", true, "Each Enhanced Bias run has a 'good run list' style veto on some LB. If this flag is true, events in these LB get weight 0"}
Gaudi::Property< bool > m_useBunchCrossingData {this, "UseBunchCrossingData", true, "BunchCrossing data requires CONDBR2 access. Can be disabled here if this is a problem."}
Gaudi::Property< bool > m_isMC {this, "IsMC", false, "MC mode? If so we need a cross section and filter efficiency"}
Gaudi::Property< double > m_mcCrossSection {this, "MCCrossSection", 0.0, "If running over MC. The process cross section in nb (AMI gives thins in nb)"}
Gaudi::Property< double > m_mcFilterEfficiency {this, "MCFilterEfficiency", 1.0, "If running over MC. The process filter efficiency (0.0-1.0)"}
Gaudi::Property< double > m_mcKFactor {this, "MCKFactor", 1.0, "If running over MC. The process filter efficiency (0.0-1.0)"}
Gaudi::Property< bool > m_mcIgnoreGeneratorWeights {this, "MCIgnoreGeneratorWeights", false, "If running over MC. Flag to ignore the generator weight."}
Gaudi::Property< double > m_inelasticCrossSection {this, "InelasticCrossSection", 8e-26, "Inelastic cross section in units cm^2. Default 80 mb at 13 TeV."}
Gaudi::Property< std::string > m_weightsDirectory {this, "EBWeightsDirectory", "", "Path to directory with EB XML weights files, if empty they will be read from calibration area"}
Gaudi::Property< bool > m_doMultiSliceDiJet {this, "DoMultiSliceDiJet", false, "Enable the HS-softer-than-PU (HSTP) filter; reweight the Slices according to Jet/ETMiss procedure; recommended by PMG for di-jet slices."}
Gaudi::Property< double > m_targetLumi {this, "TargetLuminosity", 2e34, "Targer inst. luminosity, assuming full ring."}
double m_deadtime
 Online deadtime to correct for in rate prediction.
uint32_t m_pairedBunches
 Online number of paired bunches.
double m_mcModifiedCrossSection
 Product of xsec, filter & kfactor.
std::unordered_map< uint64_t, int32_t > m_eventNumberToIdMap
 Map event number to a weighting ID.
std::unordered_map< uint32_t, float > m_eventLivetime ATLAS_THREAD_SAFE
 Cache of per-event livetime as a function of LB [LB -> effective walltime per event].
std::mutex m_mutex
 Protection for above map.
Gaudi::Accumulators::AveragingCounter< double > m_lumiAverage ATLAS_THREAD_SAFE
 The average instantaneous lumionosity over all events.
Gaudi::Accumulators::AveragingCounter< double > m_muAverage ATLAS_THREAD_SAFE
 The average mu over all events.
std::unordered_map< int32_t, double > m_idToWeightMap
 Map a weighting ID to a Enhanced Bias event weight.
std::unordered_map< int32_t, uint8_t > m_idToUnbiasedMap
 Map a weighting ID to a flag if this weight is from an unbiased (RD) trigger online.
std::unordered_map< uint32_t, uint32_t > m_eventsPerLB
 Map of how many EnhancedBias events were recorded per LB.
std::unordered_map< uint32_t, double > m_lumiPerLB
 Map of instantaneous luminosity per LB.
std::unordered_map< uint32_t, uint8_t > m_goodLB
 Like a Good Run List flag for EnhancedBias runs.
std::unordered_map< uint32_t, double > m_deadtimePerLB
 Map of average deadtime per LB.
std::vector< int32_t > m_bunches
 Number of BCIDs in each bunch group.
ReadLumiBlock m_readLumiBlock
 Cache lumi block lengths.
StoreGateSvc_t m_evtStore
 Pointer to StoreGate (event store by default)
StoreGateSvc_t m_detStore
 Pointer to StoreGate (detector store by default)
std::vector< SG::VarHandleKeyArray * > m_vhka
bool m_varHandleArraysDeclared

Detailed Description

Tool to calculate data-driven rates using EnhancedBias datasets.

Definition at line 47 of file EnhancedBiasWeighter.h.

Member Typedef Documentation

◆ StoreGateSvc_t

typedef ServiceHandle<StoreGateSvc> AthCommonDataStore< AthCommonMsg< AlgTool > >::StoreGateSvc_t
privateinherited

Definition at line 388 of file AthCommonDataStore.h.

Constructor & Destructor Documentation

◆ EnhancedBiasWeighter()

EnhancedBiasWeighter::EnhancedBiasWeighter ( const std::string & name)

Definition at line 29 of file EnhancedBiasWeighter.cxx.

30 : asg::AsgTool( name ),
31 m_deadtime(1.),
34{}
uint32_t m_pairedBunches
Online number of paired bunches.
double m_deadtime
Online deadtime to correct for in rate prediction.
double m_mcModifiedCrossSection
Product of xsec, filter & kfactor.

Member Function Documentation

◆ addBranches()

StatusCode EnhancedBiasWeighter::addBranches ( const EventContext & ctx) const
overridevirtual

Decorate the AOD with EnhancedBias weighting quantities such that no CVMFS or DB access is required on subsequent passes through the dAOD to perform rates.

addBranches is required by DerivationFramework::AugmentationTool

Implements DerivationFramework::IAugmentationTool.

Definition at line 722 of file EnhancedBiasWeighter.cxx.

723{
724 // Set up the decorator
725 SG::AuxElement::Decorator< double > decoratorEBWeight("EnhancedBiasWeight");
726 SG::AuxElement::Decorator< double > decoratorEBLivetime("EnhancedBiasLivetime");
727 SG::AuxElement::Decorator< double > decoratorLBLumi("LBLumi");
728 SG::AuxElement::Decorator< double > decoratorDeadtime("Deadtime");
729 SG::AuxElement::Decorator< uint32_t > decoratorBCIDDistanceFromFront("BCIDDistanceFromFront");
730 SG::AuxElement::Decorator< char > decoratorUnbiasedFlag("IsUnbiasedEventFlag");
731 SG::AuxElement::Decorator< char > decoratorGoodLBFlag("IsGoodLBFlag");
732
733 const xAOD::EventInfo* eventInfo(nullptr);
734 uint32_t distance = 0;
735 ATH_CHECK( evtStore()->retrieve(eventInfo, "EventInfo") ); // FIXME Use Handles
736 ATH_CHECK( getDistanceIntoTrain(eventInfo, distance, ctx) );
737
738 decoratorEBWeight(*eventInfo) = getEBWeight(eventInfo);
739 decoratorEBLivetime(*eventInfo) = getEBLiveTime(eventInfo);
740 decoratorLBLumi(*eventInfo) = getLBLumi(eventInfo);
741 decoratorUnbiasedFlag(*eventInfo) = isUnbiasedEvent(eventInfo);
742 decoratorGoodLBFlag(*eventInfo) = isGoodLB(eventInfo);
743 decoratorDeadtime(*eventInfo) = getDeadtime(eventInfo->lumiBlock());
744 decoratorBCIDDistanceFromFront(*eventInfo) = distance;
745
746 return StatusCode::SUCCESS;
747}
#define ATH_CHECK
Evaluate an expression and check for errors.
ServiceHandle< StoreGateSvc > & evtStore()
virtual StatusCode getDistanceIntoTrain(const xAOD::EventInfo *eventInfo, uint32_t &distance, const EventContext &ctx) const override
virtual double getEBWeight(const xAOD::EventInfo *eventInfo) const override
virtual bool isUnbiasedEvent(const xAOD::EventInfo *eventInfo) const override
virtual double getDeadtime(const int lumiblock=-1) const override
virtual double getEBLiveTime(const xAOD::EventInfo *eventInfo) const override
virtual double getLBLumi(const xAOD::EventInfo *eventInfo) const override
virtual bool isGoodLB(const xAOD::EventInfo *eventInfo) const override
SG::Decorator< T, ALLOC > Decorator
Definition AuxElement.h:575
float distance(const Amg::Vector3D &p1, const Amg::Vector3D &p2)
calculates the distance between two point in 3D space
retrieve(aClass, aKey=None)
Definition PyKernel.py:110
EventInfo_v1 EventInfo
Definition of the latest event info version.
setEventNumber uint32_t

◆ declareGaudiProperty()

Gaudi::Details::PropertyBase & AthCommonDataStore< AthCommonMsg< AlgTool > >::declareGaudiProperty ( Gaudi::Property< T, V, H > & hndl,
const SG::VarHandleKeyType &  )
inlineprivateinherited

specialization for handling Gaudi::Property<SG::VarHandleKey>

Definition at line 156 of file AthCommonDataStore.h.

158 {
160 hndl.value(),
161 hndl.documentation());
162
163 }
Gaudi::Details::PropertyBase & declareProperty(Gaudi::Property< T, V, H > &t)

◆ DeclareInterfaceID()

DerivationFramework::IAugmentationTool::DeclareInterfaceID ( IAugmentationTool ,
1 ,
0  )
inherited

◆ declareProperty()

Gaudi::Details::PropertyBase & AthCommonDataStore< AthCommonMsg< AlgTool > >::declareProperty ( Gaudi::Property< T, V, H > & t)
inlineinherited

Definition at line 145 of file AthCommonDataStore.h.

145 {
146 typedef typename SG::HandleClassifier<T>::type htype;
148 }
Gaudi::Details::PropertyBase & declareGaudiProperty(Gaudi::Property< T, V, H > &hndl, const SG::VarHandleKeyType &)
specialization for handling Gaudi::Property<SG::VarHandleKey>

◆ detStore()

const ServiceHandle< StoreGateSvc > & AthCommonDataStore< AthCommonMsg< AlgTool > >::detStore ( ) const
inlineinherited

The standard StoreGateSvc/DetectorStore Returns (kind of) a pointer to the StoreGateSvc.

Definition at line 95 of file AthCommonDataStore.h.

◆ evtStore()

ServiceHandle< StoreGateSvc > & AthCommonDataStore< AthCommonMsg< AlgTool > >::evtStore ( )
inlineinherited

The standard StoreGateSvc (event store) Returns (kind of) a pointer to the StoreGateSvc.

Definition at line 85 of file AthCommonDataStore.h.

◆ extraDeps_update_handler()

void AthCommonDataStore< AthCommonMsg< AlgTool > >::extraDeps_update_handler ( Gaudi::Details::PropertyBase & ExtraDeps)
protectedinherited

Add StoreName to extra input/output deps as needed.

use the logic of the VarHandleKey to parse the DataObjID keys supplied via the ExtraInputs and ExtraOuputs Properties to add the StoreName if it's not explicitly given

◆ finalize()

StatusCode EnhancedBiasWeighter::finalize ( )
overridevirtual

Definition at line 69 of file EnhancedBiasWeighter.cxx.

70{
71 ATH_MSG_DEBUG ("Finalizing " << name() << "...");
72 return StatusCode::SUCCESS;
73}
#define ATH_MSG_DEBUG(x)

◆ findLocalFile()

std::string EnhancedBiasWeighter::findLocalFile ( const std::string & fileName) const
private

Definition at line 750 of file EnhancedBiasWeighter.cxx.

750 {
751
752 if (m_weightsDirectory.empty()) {
753 ATH_MSG_ERROR("Local directory for EB xml not set!");
754 return "";
755 }
756
757 std::string fullName = m_weightsDirectory+ "/" + fileName;
758
759 if (!std::filesystem::exists(fullName)) {
760 ATH_MSG_ERROR("File " << fullName << " not found!");
761 return "";
762 }
763
764 return fullName;
765}
#define ATH_MSG_ERROR(x)
Gaudi::Property< std::string > m_weightsDirectory

◆ getAverageLumi()

double EnhancedBiasWeighter::getAverageLumi ( ) const
overridevirtual
Returns
The mean luminosity of all events seen

Implements IEnhancedBiasWeighter.

Definition at line 711 of file EnhancedBiasWeighter.cxx.

712{
713 return m_lumiAverage.mean();
714}

◆ getAverageMu()

double EnhancedBiasWeighter::getAverageMu ( ) const
overridevirtual
Returns
<mu> over all events seen

Implements IEnhancedBiasWeighter.

Definition at line 716 of file EnhancedBiasWeighter.cxx.

717{
718 return m_muAverage.mean();
719}

◆ getBunchCrossingRate()

double EnhancedBiasWeighter::getBunchCrossingRate ( ) const
overridevirtual
Returns
The bunch crossing rate

Implements IEnhancedBiasWeighter.

Definition at line 470 of file EnhancedBiasWeighter.cxx.

470 {
472}
static constexpr double LHC_FREQUENCY

◆ getBunchGroups()

virtual const std::vector< int32_t > & EnhancedBiasWeighter::getBunchGroups ( ) const
inlineoverridevirtual
Returns
The number of BCIDs in each bunch group

Implements IEnhancedBiasWeighter.

Definition at line 174 of file EnhancedBiasWeighter.h.

174{ return m_bunches; }
std::vector< int32_t > m_bunches
Number of BCIDs in each bunch group.

◆ getDeadtime()

double EnhancedBiasWeighter::getDeadtime ( const int lumiblock = -1) const
overridevirtual
Returns
the fractional deadtime in the event. Reported as function per LB if value is available else a fixed number There is no deadtime in MC, so for MC this will always return 1. Retrieved from CVMFS XML or fetched from TRIG1 dAOD

Implements IEnhancedBiasWeighter.

Definition at line 684 of file EnhancedBiasWeighter.cxx.

685{
686 if (m_isMC) {
687 return 1.;
688 }
689 else if (m_deadtimePerLB.count(lumiblock)) {
690 return m_deadtimePerLB.at(lumiblock);
691 }
692 return m_deadtime;
693}
Gaudi::Property< bool > m_isMC
std::unordered_map< uint32_t, double > m_deadtimePerLB
Map of average deadtime per LB.

◆ getDistanceIntoTrain()

StatusCode EnhancedBiasWeighter::getDistanceIntoTrain ( const xAOD::EventInfo * eventInfo,
uint32_t & distance,
const EventContext & ctx ) const
overridevirtual
Returns
How far into the current train this BCID is. Retrieved from the database using the BunchCrossingCondData or fetched from TRIG1 dAOD

Implements IEnhancedBiasWeighter.

Definition at line 700 of file EnhancedBiasWeighter.cxx.

701{
702 if (!m_useBunchCrossingData) return StatusCode::SUCCESS;
703
704 SG::ReadCondHandle<BunchCrossingCondData> bunchCrossingTool (m_bunchCrossingKey, ctx);
705 ATH_CHECK( bunchCrossingTool.isValid() );
706 distance = bunchCrossingTool->distanceFromFront( eventInfo->bcid(), BunchCrossingCondData::BunchDistanceType::BunchCrossings );
707
708 return StatusCode::SUCCESS;
709}
@ BunchCrossings
Distance in units of 25 nanoseconds.
Gaudi::Property< bool > m_useBunchCrossingData
SG::ReadCondHandleKey< BunchCrossingCondData > m_bunchCrossingKey
Tool to get distance into bunch train.
uint32_t bcid() const
The bunch crossing ID of the event.

◆ getEBLiveTime() [1/2]

double EnhancedBiasWeighter::getEBLiveTime ( const EventContext & context) const
overridevirtual

Implements IEnhancedBiasWeighter.

Definition at line 515 of file EnhancedBiasWeighter.cxx.

516{
517 if (m_isMC) {
518
519 ATH_MSG_ERROR( "Cannot use EventContext based getEBLiveTime with MC. Needs full EventInfo.");
520 return 0.;
521
522 } else {
523
524 uint32_t lumiBlock = context.eventID().lumi_block();
525 std::lock_guard<std::mutex> scopeLock(m_mutex);
526
527 // Check the cache
528 const auto inCacheIterator = m_eventLivetime.find( lumiBlock );
529 if (inCacheIterator != m_eventLivetime.end()) return inCacheIterator->second;
530
531 // Else calculate
532 const auto mapIterator = m_eventsPerLB.find(lumiBlock);
533 if (mapIterator == m_eventsPerLB.end() ) {
535 ATH_MSG_ERROR( "Couldn't find LB info for LB: " << lumiBlock );
536 }
537 return 0.;
538 }
539 const int32_t eventsInThisLB = mapIterator->second;
540 const double lbLength = m_readLumiBlock.getLumiBlockLength(lumiBlock, msg());
541 // This event is one in eventsInThisLB, so has an effective temporal contribution of:
542 double eventLivetime = 0;
543 if (eventsInThisLB > 0 && fabs(lbLength) > 1e-10) eventLivetime = (1. / static_cast<double>(eventsInThisLB)) * lbLength;
544 // Cache this (mutable)
545 m_eventLivetime[lumiBlock] = eventLivetime;
546 return eventLivetime;
547
548 } // isData
549
550}
ReadLumiBlock m_readLumiBlock
Cache lumi block lengths.
std::unordered_map< uint32_t, uint32_t > m_eventsPerLB
Map of how many EnhancedBias events were recorded per LB.
Gaudi::Property< bool > m_errorOnMissingEBWeights
std::mutex m_mutex
Protection for above map.
setTeId lumiBlock
MsgStream & msg
Definition testRead.cxx:32

◆ getEBLiveTime() [2/2]

double EnhancedBiasWeighter::getEBLiveTime ( const xAOD::EventInfo * eventInfo) const
overridevirtual
Returns
The amount of online walltime contributed by this event For data, this is based on the LB length and the number of events in the LB For MC, this is fixed by the sample cross section, the inelastic cross section and the mu of the current event. Retrieved from COOL and CVMFS XML or fetched from TRIG1 dAOD

Implements IEnhancedBiasWeighter.

Definition at line 473 of file EnhancedBiasWeighter.cxx.

474{
475 if (m_isMC) {
476
477 // Probability that a single pp interaction yields this MC process (ratio of xsec)
478 const double probOfProcess = m_mcModifiedCrossSection / m_inelasticCrossSection;
479 // Probability that a single bunch-crossing yeild this MC process. Binomial statistics (1 - Prob(exactly 0 interactions, given mu interactions)).
480 const double probOfBunchCrossing = 1. - std::pow( 1. - probOfProcess, std::ceil(eventInfo->actualInteractionsPerCrossing()) );
481 const double bunchCrossingRate = m_pairedBunches * LHC_FREQUENCY;
482 // How much wall-time does this event represent? This is the reciprocal of the rate, which is the % per crossing scaled by the crossing rate.
483 ATH_MSG_DEBUG("MC livetime debug: probOfProcess:" << probOfProcess << " probOfBunchCrossing:" << probOfBunchCrossing << " bunchCrossingRate:" << bunchCrossingRate << " time:" << (1. / (probOfBunchCrossing * bunchCrossingRate)));
484 return 1. / (probOfBunchCrossing * bunchCrossingRate);
485
486 } else {
487
488 uint32_t lumiBlock = eventInfo->lumiBlock();
489 std::lock_guard<std::mutex> scopeLock(m_mutex);
490
491 // Check the cache
492 const auto inCacheIterator = m_eventLivetime.find( lumiBlock );
493 if (inCacheIterator != m_eventLivetime.end()) return inCacheIterator->second;
494
495 // Else calculate
496 const auto mapIterator = m_eventsPerLB.find(lumiBlock);
497 if (mapIterator == m_eventsPerLB.end() ) {
499 ATH_MSG_ERROR( "Couldn't find LB info for LB: " << lumiBlock );
500 }
501 return 0;
502 }
503 const int32_t eventsInThisLB = mapIterator->second;
504 const double lbLength = m_readLumiBlock.getLumiBlockLength(lumiBlock, msg());
505 // This event is one in eventsInThisLB, so has an effective temporal contribution of:
506 double eventLivetime = 0;
507 if (eventsInThisLB > 0 && fabs(lbLength) > 1e-10) eventLivetime = (1. / static_cast<double>(eventsInThisLB)) * lbLength;
508 // Cache this (mutable)
509 m_eventLivetime[lumiBlock] = eventLivetime;
510 return eventLivetime;
511
512 } // isData
513}
Gaudi::Property< double > m_inelasticCrossSection
uint32_t lumiBlock() const
The current event's luminosity block number.
float actualInteractionsPerCrossing() const
Average interactions per crossing for the current BCID - for in-time pile-up.

◆ getEBWeight() [1/2]

double EnhancedBiasWeighter::getEBWeight ( const EventContext & context) const
overridevirtual

Implements IEnhancedBiasWeighter.

Definition at line 428 of file EnhancedBiasWeighter.cxx.

429{
430
431 if (m_enforceEBGRL && !isGoodLB(context)) {
432 return 0;
433 }
434
435 ATH_CHECK( trackAverages(context), 0 );
436
437 if (m_isMC) {
438
439 ATH_MSG_ERROR( "Cannot use EventContext based getEBWeight with MC. Needs full EventInfo.");
440 return 0.;
441
442 } else { // isData
443
444 int32_t ebID = getEventEBID(context);
445 const auto mapIterator = m_idToWeightMap.find(ebID);
446 if (mapIterator == m_idToWeightMap.end() ) {
447 ATH_MSG_ERROR( "Couldn't find enhanced bias weight for event with ID " << ebID);
448 return 0;
449 }
450 return mapIterator->second;
451
452 } // isData
453}
StatusCode trackAverages(const xAOD::EventInfo *eventInfo) const
Internal function to keep track of the mean instantaneous lumi & mean pileup of the EB/MC sample bein...
std::unordered_map< int32_t, double > m_idToWeightMap
Map a weighting ID to a Enhanced Bias event weight.
int32_t getEventEBID(const xAOD::EventInfo *eventInfo) const
Gaudi::Property< bool > m_enforceEBGRL

◆ getEBWeight() [2/2]

double EnhancedBiasWeighter::getEBWeight ( const xAOD::EventInfo * eventInfo) const
overridevirtual
Returns
The effective number of events this one event represents from online, given EnhancedBias online prescales. For MC, this is the generator weight Retrieved from CVMFS XML, EventInfo (MC) or fetched from TRIG1 dAOD

Implements IEnhancedBiasWeighter.

Definition at line 391 of file EnhancedBiasWeighter.cxx.

392{
393 if (m_enforceEBGRL && !isGoodLB(eventInfo)) {
394 return 0;
395 }
396
397 ATH_CHECK( trackAverages(eventInfo), 0 );
398
400 return static_cast<double>(eventInfo->mcEventWeight(0)) * m_mcModifiedCrossSection * m_targetLumi;
401
402 } else if (m_isMC) {
403
405 return 1.;
406 }
407
408 const std::vector<float> weights = eventInfo->mcEventWeights();
409 if (weights.size() > 0) {
410 return weights[0];
411 }
412 return 1.;
413
414 } else { // isData
415
416 int32_t ebID = getEventEBID(eventInfo);
417 const auto mapIterator = m_idToWeightMap.find(ebID);
418 if (mapIterator == m_idToWeightMap.end() ) {
419 ATH_MSG_ERROR( "Couldn't find enhanced bias weight for event with ID " << ebID);
420 return 0;
421 }
422 return mapIterator->second;
423
424 } // isData
425}
Gaudi::Property< bool > m_mcIgnoreGeneratorWeights
Gaudi::Property< bool > m_doMultiSliceDiJet
Gaudi::Property< double > m_targetLumi
const std::vector< float > & mcEventWeights() const
The weights of all the MC events used in the simulation.
float mcEventWeight(size_t i=0) const
The weight of one specific MC event used in the simulation.

◆ getEventEBID() [1/2]

int32_t EnhancedBiasWeighter::getEventEBID ( const EventContext & context) const
private

Definition at line 372 of file EnhancedBiasWeighter.cxx.

373{
374 const uint64_t eventNumber = context.eventID().event_number();
375
376 const auto mapIterator = m_eventNumberToIdMap.find(eventNumber);
377 if (mapIterator != m_eventNumberToIdMap.end()) {
378 return mapIterator->second;
379 }
380 // Unfortunately, earlier weighting XMLs have 32 bit signed event number. Hence we also have to try this option
381 const int32_t eventNumber32 = static_cast<int32_t>(eventNumber);
382 const auto mapIterator32 = m_eventNumberToIdMap.find(eventNumber32);
383 if (mapIterator32 != m_eventNumberToIdMap.end()) {
384 return mapIterator32->second;
385 } else {
386 ATH_MSG_ERROR( "Couldn't find enhanced bias info for event " << eventNumber);
387 return -1;
388 }
389}
std::unordered_map< uint64_t, int32_t > m_eventNumberToIdMap
Map event number to a weighting ID.

◆ getEventEBID() [2/2]

int32_t EnhancedBiasWeighter::getEventEBID ( const xAOD::EventInfo * eventInfo) const
private
Returns
Internal mapping of an event number to a weight ID. Retrieved from CVMFS XML or fetched from TRIG1 dAOD

Definition at line 353 of file EnhancedBiasWeighter.cxx.

354{
355 const uint64_t eventNumber = eventInfo->eventNumber();
356
357 const auto mapIterator = m_eventNumberToIdMap.find(eventNumber);
358 if (mapIterator != m_eventNumberToIdMap.end()) {
359 return mapIterator->second;
360 }
361 // Unfortunately, earlier weighting XMLs have 32 bit signed event number. Hence we also have to try this option
362 const int32_t eventNumber32 = static_cast<int32_t>(eventNumber);
363 const auto mapIterator32 = m_eventNumberToIdMap.find(eventNumber32);
364 if (mapIterator32 != m_eventNumberToIdMap.end()) {
365 return mapIterator32->second;
366 } else {
367 ATH_MSG_ERROR( "Couldn't find enhanced bias info for event " << eventNumber);
368 return -1;
369 }
370}
uint64_t eventNumber() const
The current event's event number.

◆ getKey()

SG::sgkey_t asg::AsgTool::getKey ( const void * ptr) const
inherited

Get the (hashed) key of an object that is in the event store.

This is a bit of a special one. StoreGateSvc and xAOD::TEvent both provide ways for getting the SG::sgkey_t key for an object that is in the store, based on a bare pointer. But they provide different interfaces for doing so.

In order to allow tools to efficiently perform this operation, they can use this helper function.

See also
asg::AsgTool::getName
Parameters
ptrThe bare pointer to the object that the event store should know about
Returns
The hashed key of the object in the store. If not found, an invalid (zero) key.

Definition at line 119 of file AsgTool.cxx.

119 {
120
121#ifdef XAOD_STANDALONE
122 // In case we use @c xAOD::TEvent, we have a direct function call
123 // for this.
124 return evtStore()->event()->getKey( ptr );
125#else
126 const SG::DataProxy* proxy = evtStore()->proxy( ptr );
127 return ( proxy == nullptr ? 0 : proxy->sgkey() );
128#endif // XAOD_STANDALONE
129 }

◆ getLBLength() [1/2]

double EnhancedBiasWeighter::getLBLength ( const EventContext & context) const
overridevirtual

Implements IEnhancedBiasWeighter.

Definition at line 565 of file EnhancedBiasWeighter.cxx.

565 {
566 if (m_isMC) {
567 ATH_MSG_ERROR( "getLBLength Does not work for MC.");
568 return 0.;
569 } else {
570 uint32_t lumiBlock = context.eventID().lumi_block();
571 const double lbLength = m_readLumiBlock.getLumiBlockLength(lumiBlock, msg());
572 return lbLength;
573 } // isData
574}

◆ getLBLength() [2/2]

double EnhancedBiasWeighter::getLBLength ( const xAOD::EventInfo * eventInfo) const
overridevirtual
Returns
The length of the current LB in seconds. Only for data Retrieved from COOL, only for data

Implements IEnhancedBiasWeighter.

Definition at line 552 of file EnhancedBiasWeighter.cxx.

552 {
553 if (m_isMC) {
554 ATH_MSG_ERROR( "getLBLength Does not work for MC.");
555 return 0.;
556 } else {
557 uint32_t lumiBlock = eventInfo->lumiBlock();
558 const double lbLength = m_readLumiBlock.getLumiBlockLength(lumiBlock, msg());
559 return lbLength;
560 } // isData
561}

◆ getLBLumi() [1/2]

double EnhancedBiasWeighter::getLBLumi ( const EventContext & context) const
overridevirtual

Implements IEnhancedBiasWeighter.

Definition at line 664 of file EnhancedBiasWeighter.cxx.

665{
666 if (m_isMC) {
667
668 ATH_MSG_ERROR( "Cannot use EventContext based getLBLumi with MC. Needs full EventInfo.");
669 return 0.;
670
671 } else { // isData
672
673 uint32_t lumiBlock = context.eventID().lumi_block();
674 const auto mapIterator = m_lumiPerLB.find(lumiBlock);
675 if (mapIterator == m_lumiPerLB.end() ) {
676 ATH_MSG_ERROR( "Couldn't find lumi info for LB: " << lumiBlock );
677 return 0.;
678 }
679 return mapIterator->second;
680
681 } // isData
682}
std::unordered_map< uint32_t, double > m_lumiPerLB
Map of instantaneous luminosity per LB.

◆ getLBLumi() [2/2]

double EnhancedBiasWeighter::getLBLumi ( const xAOD::EventInfo * eventInfo) const
overridevirtual
Returns
the instantaneous luminosity for the current event in units of cm-2s-1. For data, based on the current LB For MC, based on the event mu Retrieved from CVMFS XML or fetched from TRIG1 dAOD

Implements IEnhancedBiasWeighter.

Definition at line 644 of file EnhancedBiasWeighter.cxx.

645{
646 if (m_isMC) {
647
648 const double mu = std::ceil( eventInfo->actualInteractionsPerCrossing() );
650
651 } else { // isData
652
653 uint32_t lumiBlock = eventInfo->lumiBlock();
654 const auto mapIterator = m_lumiPerLB.find(lumiBlock);
655 if (mapIterator == m_lumiPerLB.end() ) {
656 ATH_MSG_ERROR( "Couldn't find lumi info for LB: " << lumiBlock );
657 return 0.;
658 }
659 return mapIterator->second;
660
661 } // isData
662}

◆ getName()

const std::string & asg::AsgTool::getName ( const void * ptr) const
inherited

Get the name of an object that is / should be in the event store.

This is a bit of a special one. StoreGateSvc and xAOD::TEvent both provide ways for getting the std::string name for an object that is in the store, based on a bare pointer. But they provide different interfaces for doing so.

In order to allow tools to efficiently perform this operation, they can use this helper function.

See also
asg::AsgTool::getKey
Parameters
ptrThe bare pointer to the object that the event store should know about
Returns
The string name of the object in the store. If not found, an empty string.

Definition at line 106 of file AsgTool.cxx.

106 {
107
108#ifdef XAOD_STANDALONE
109 // In case we use @c xAOD::TEvent, we have a direct function call
110 // for this.
111 return evtStore()->event()->getName( ptr );
112#else
113 const SG::DataProxy* proxy = evtStore()->proxy( ptr );
114 static const std::string dummy = "";
115 return ( proxy == nullptr ? dummy : proxy->name() );
116#endif // XAOD_STANDALONE
117 }

◆ getPairedBunches()

uint32_t EnhancedBiasWeighter::getPairedBunches ( ) const
overridevirtual
Returns
The number of colliding bunches in the Enhanced Bias run being used. For MC this will return the number of bunches which corresponds to a full-ring. Retrieved from CVMFS XML or fetched from TRIG1 dAOD

Implements IEnhancedBiasWeighter.

Definition at line 695 of file EnhancedBiasWeighter.cxx.

696{
697 return m_pairedBunches;
698}

◆ getProperty()

template<class T>
const T * asg::AsgTool::getProperty ( const std::string & name) const
inherited

Get one of the tool's properties.

◆ getRunNumber()

uint32_t EnhancedBiasWeighter::getRunNumber ( ) const
overridevirtual
Returns
the RunNumber.

Implements IEnhancedBiasWeighter.

Definition at line 640 of file EnhancedBiasWeighter.cxx.

640 {
641 return m_runNumber;
642}
Gaudi::Property< uint32_t > m_runNumber

◆ initialize()

StatusCode EnhancedBiasWeighter::initialize ( void )
overridevirtual

Initialize is required by AsgTool base class.

Check if we're MC or data, and if data check if we're to load the weighting info or read it from the input file

Reimplemented from asg::AsgTool.

Definition at line 36 of file EnhancedBiasWeighter.cxx.

37{
38 ATH_MSG_DEBUG ("Initializing " << name() << "...");
40
41 if (m_isMC) {
42
43 if (m_mcCrossSection == 0 || m_mcFilterEfficiency == 0) {
44 ATH_MSG_FATAL("For MC rates, a cross section and filter efficiency must be supplied.");
45 return StatusCode::FAILURE;
46 }
47 m_deadtime = 1.; // No deadtime for MC
48 m_pairedBunches = FULL_RING; // Assume full-ring
49 const double mcCrossSectionInSqCm = 1e-33 * m_mcCrossSection; // Convert nb -> cm^2
51 ATH_MSG_INFO ("Running over MC with xsec:" << m_mcCrossSection << " nb, filter efficiency:" << m_mcFilterEfficiency << ", k-factor:" << m_mcKFactor);
52
53 } else { // isData
54
55 if (m_runNumber == 0u) {
56 ATH_MSG_FATAL("calculateWeightingData is TRUE, but the RunNumber property has not been set. This must be set such that we can read in the correct data.");
57 return StatusCode::FAILURE;
58 }
59 ATH_MSG_INFO ("calculateWeightingData is TRUE. This job will read in EnhancedBias weighting data from CVMFS and COOL.");
62
63 } // end isData
64
65
66 return StatusCode::SUCCESS;
67}
#define ATH_MSG_FATAL(x)
#define ATH_MSG_INFO(x)
static constexpr uint32_t FULL_RING
Number of bunches in a full ring.
StatusCode loadWeights()
Read into memory from XML event weights for this EnhancedBias run.
Gaudi::Property< double > m_mcCrossSection
Gaudi::Property< double > m_mcKFactor
StatusCode loadLumi()
Read into memory this EnhancedBias run's XML.
Gaudi::Property< double > m_mcFilterEfficiency

◆ inputHandles()

virtual std::vector< Gaudi::DataHandle * > AthCommonDataStore< AthCommonMsg< AlgTool > >::inputHandles ( ) const
overridevirtualinherited

Return this algorithm's input handles.

We override this to include handle instances from key arrays if they have not yet been declared. See comments on updateVHKA.

◆ isGoodLB() [1/2]

bool EnhancedBiasWeighter::isGoodLB ( const EventContext & context) const
overridevirtual

Implements IEnhancedBiasWeighter.

Definition at line 616 of file EnhancedBiasWeighter.cxx.

617{
618 if (m_isMC) {
619
620 return true;
621
622 } else { // isData
623
624 uint32_t lumiBlock = context.eventID().lumi_block();
625
626 const auto mapIterator = m_goodLB.find(lumiBlock);
627 if (mapIterator == m_goodLB.end() ) {
628 ATH_MSG_ERROR( "Couldn't find LB good/bad info for LB: " << lumiBlock );
629 return false;
630 }
631 return static_cast<bool>(mapIterator->second);
632
633 } // isData
634}
std::unordered_map< uint32_t, uint8_t > m_goodLB
Like a Good Run List flag for EnhancedBias runs.

◆ isGoodLB() [2/2]

bool EnhancedBiasWeighter::isGoodLB ( const xAOD::EventInfo * eventInfo) const
overridevirtual
Returns
If the current lumi block should be used for rates or vetoed due to online deadtime Not a concern for MC Retrieved from CVMFS XML or fetched from TRIG1 dAOD

Implements IEnhancedBiasWeighter.

Definition at line 596 of file EnhancedBiasWeighter.cxx.

597{
598 if (m_isMC) {
599
600 return true;
601
602 } else { // isData
603
604 uint32_t lumiBlock = eventInfo->lumiBlock();
605
606 const auto mapIterator = m_goodLB.find(lumiBlock);
607 if (mapIterator == m_goodLB.end() ) {
608 ATH_MSG_ERROR( "Couldn't find LB good/bad info for LB: " << lumiBlock );
609 return false;
610 }
611 return static_cast<bool>(mapIterator->second);
612
613 } // isData
614}

◆ isMC()

bool EnhancedBiasWeighter::isMC ( ) const
overridevirtual
Returns
If the tool is configured to process MC

Implements IEnhancedBiasWeighter.

Definition at line 636 of file EnhancedBiasWeighter.cxx.

636 {
637 return m_isMC;
638}

◆ isUnbiasedEvent()

bool EnhancedBiasWeighter::isUnbiasedEvent ( const xAOD::EventInfo * eventInfo) const
overridevirtual
Returns
If the current event was selected online by a fully unbiased trigger for MC we cannot play such games and return True so that every trigger is queried. the user is expected to know that a j0 trigger running on a ttbar MC is going to underestimate the rate of the j0 trigger running on MinBias. Retrieved from CVMFS XML or fetched from TRIG1 dAOD

Implements IEnhancedBiasWeighter.

Definition at line 577 of file EnhancedBiasWeighter.cxx.

578{
579 if (m_isMC) {
580
581 return true;
582
583 } else { //isData
584
585 int32_t ebID = getEventEBID(eventInfo);
586 const auto mapIterator = m_idToUnbiasedMap.find(ebID);
587 if (mapIterator == m_idToUnbiasedMap.end() ) {
588 ATH_MSG_ERROR("Couldn't find isUnbiased information for event with ID " << ebID);
589 return false;
590 }
591 return mapIterator->second;
592
593 } // isData
594}
std::unordered_map< int32_t, uint8_t > m_idToUnbiasedMap
Map a weighting ID to a flag if this weight is from an unbiased (RD) trigger online.

◆ loadLumi()

StatusCode EnhancedBiasWeighter::loadLumi ( )
private

Read into memory this EnhancedBias run's XML.

Definition at line 146 of file EnhancedBiasWeighter.cxx.

147{
148 // Fetch LB time from COOL for this run
150 if (m_readLumiBlock.updateLumiBlocks(runNumber, msg()) == false) {
151 ATH_MSG_FATAL("Unable to load this runs luminosity values from COOL.");
152 return StatusCode::FAILURE;
153 }
154
155 // Read in number of events to expect
156 // Construct name
157 std::stringstream fileName;
158 fileName << "enhanced_bias_run_" << runNumber << ".xml";
159 std::string runFile = (!m_weightsDirectory.empty()) ? findLocalFile(fileName.str()) : PathResolverFindCalibFile("TrigCostRootAnalysis/" + fileName.str() ); // Check standard area
160
161 ATH_MSG_DEBUG("Using run file " << runFile);
162 if (runFile == "") {
163 msg() << (m_errorOnMissingEBWeights ? MSG::ERROR : MSG::WARNING) << "Could not retrieve " << fileName.str() << ", cannot perform enhanced bias weighting." << endmsg;
164 return (m_errorOnMissingEBWeights ? StatusCode::FAILURE : StatusCode::SUCCESS);
165 }
166
167 std::unique_ptr<TXMLEngine> xml(new TXMLEngine());
168 const XMLDocPointer_t xmlDoc = xml->ParseFile( runFile.c_str() );
169
170 if (xmlDoc == nullptr) {
171 ATH_MSG_FATAL ("Could not parse " << fileName.str() << ", cannot perform enhanced bias weighting.");
172 return StatusCode::FAILURE;
173 }
174
175 const XMLNodePointer_t mainNode = xml->DocGetRootElement(xmlDoc);
176 if ( xml->GetNodeName(mainNode) != std::string("trigger") ) {
177 ATH_MSG_ERROR ("Canot parse XML. Expected 'trigger' node, got " << xml->GetNodeName(mainNode));
178 return StatusCode::FAILURE;
179 }
180 XMLNodePointer_t listNode = xml->GetChild( mainNode );
181
182 while ( listNode != 0 ) { // Loop over all menu elements
183 const std::string listName = xml->GetNodeName(listNode);
184
185 if (listName == "lb_list") {
186
187 XMLNodePointer_t node = xml->GetChild( listNode );
188 while( node != 0) {
189 if ( xml->GetNodeName(node) != std::string("lb") ) {
190 ATH_MSG_ERROR ("Canot parse XML. Expected 'lb' node, got " << xml->GetNodeName(node));
191 return StatusCode::FAILURE;
192 }
193 const uint32_t lb = std::atoi( xml->GetAttr(node, "id") );
194 const double lumi = std::atof( xml->GetAttr(node, "lumi") );
195 const uint32_t nEvents = std::atoi( xml->GetNodeContent(node) );
196 const std::string flag = xml->HasAttr(node, "flag") ? xml->GetAttr(node, "flag") : "";
197
199 m_goodLB[lb] = (flag == "bad" ? 0 : 1);
200 m_lumiPerLB[lb] = lumi < 1e10 ? 1e30 * lumi : lumi;
201
202 if (xml->HasAttr(node, "deadtime")) {
203 // Deadtime is a weight factor, the weight will be multiplied by deadtime + 1
204 m_deadtimePerLB[lb] = 1. + std::atof( xml->GetAttr(node, "deadtime") );
205 }
206
207 node = xml->GetNext(node);
208 }
209
210 } else if (listName == "lumivalues") {
211
212 XMLNodePointer_t node = xml->GetChild( listNode );
213 while( node != 0) {
214 if ( xml->GetNodeName(node) == std::string("deadtime") ) {
215 m_deadtime = 1. + std::atof( xml->GetNodeContent(node) );
216 }
217 node = xml->GetNext(node);
218 }
219
220 } else if (listName == "bunchgroups") {
221
222 XMLNodePointer_t node = xml->GetChild( listNode );
223 while( node != 0) {
224 m_bunches.push_back( std::atoi( xml->GetNodeContent(node) ) );
225 if ( xml->GetNodeName(node) == std::string("bunchgroup") && xml->HasAttr(node, "name") &&
226 (std::string(xml->GetAttr(node, "name")) == "Paired" || std::string(xml->GetAttr(node, "name")) == "Filled")) {
227 m_pairedBunches = std::atoi( xml->GetNodeContent(node) );
228 }
229 node = xml->GetNext(node);
230 }
231
232 } else if (listName == "filters") {
233
234 ATH_MSG_DEBUG("Found filters section of enhanced bias XML. Unused by this application.");
235
236 } else {
237
238 ATH_MSG_INFO("Encountered unknown element in enhanced bias XML: " << listName << " ignoring it.");
239
240 }
241
242 listNode = xml->GetNext(listNode);
243 }
244
245 ATH_MSG_INFO ("Loaded " << m_eventsPerLB.size() << " EnhancedBias lumi block's info for run " << runNumber);
246 return StatusCode::SUCCESS;
247}
#define endmsg
std::string PathResolverFindCalibFile(const std::string &logical_file_name)
MsgStream & msg() const
std::string findLocalFile(const std::string &fileName) const
const int nEvents
int lb
Definition globals.cxx:23
bool flag
Definition master.py:29

◆ loadWeights()

StatusCode EnhancedBiasWeighter::loadWeights ( )
private

Read into memory from XML event weights for this EnhancedBias run.

Definition at line 75 of file EnhancedBiasWeighter.cxx.

76{
77 // Construct name
78 std::stringstream fileName;
79 const uint32_t runNumber = m_runNumber; // This is because Gaudi::Properties have special behaviour with the << operator
80 fileName << "EnhancedBiasWeights_" << runNumber << ".xml";
81 std::string weightingFile = (!m_weightsDirectory.empty()) ? findLocalFile(fileName.str()) : PathResolverFindCalibFile("TrigCostRootAnalysis/" + fileName.str() ); // Check standard area
82
83 ATH_MSG_DEBUG("Using weighting file " << weightingFile);
84
85 if (weightingFile == "") {
86 msg() << (m_errorOnMissingEBWeights ? MSG::ERROR : MSG::WARNING) << "Could not retrieve " << fileName.str() << ", cannot perform enhanced bias weighting." << endmsg;
87 return (m_errorOnMissingEBWeights ? StatusCode::FAILURE : StatusCode::SUCCESS);
88 }
89
90 std::unique_ptr<TXMLEngine> xml(new TXMLEngine() );
91 XMLDocPointer_t xmlDoc = xml->ParseFile( weightingFile.c_str() );
92
93 if (xmlDoc == nullptr) {
94 ATH_MSG_WARNING ("Could not parse " << fileName.str() << ", cannot perform enhanced bias weighting.");
95 return StatusCode::FAILURE;
96 }
97
98 // Navigate XML
99 const XMLNodePointer_t mainNode = xml->DocGetRootElement(xmlDoc);
100 if ( xml->GetNodeName(mainNode) != std::string("run") ) {
101 ATH_MSG_ERROR ("Canot parse XML. Expected 'run' node, got " << xml->GetNodeName(mainNode));
102 return StatusCode::FAILURE;
103 }
104 const XMLNodePointer_t weightsNode = xml->GetChild( mainNode );
105 const XMLNodePointer_t eventsNode = xml->GetNext( weightsNode );
106
107 XMLNodePointer_t weightNode = xml->GetChild( weightsNode );
108 XMLNodePointer_t eventNode = xml->GetChild( eventsNode );
109
110 while ( weightNode != 0 ) { // Loop over all weight elements
111 if ( xml->GetNodeName(weightNode) != std::string("weight") ) {
112 ATH_MSG_ERROR ("Canot parse XML. Expected 'weight' node, got " << xml->GetNodeName(weightNode));
113 return StatusCode::FAILURE;
114 }
115
116 const int32_t id = std::atoi(xml->GetAttr(weightNode, "id") );
117 const double weight = std::atof(xml->GetAttr(weightNode, "value") );
118 int32_t unbiased = 0;
119 if ( xml->HasAttr(weightNode, "unbiased") == true ) {
120 unbiased = std::atoi(xml->GetAttr(weightNode, "unbiased"));
121 }
122
124 m_idToUnbiasedMap[id] = unbiased;
125
126 weightNode = xml->GetNext(weightNode);
127 }
128
129 while ( eventNode != 0 ) { // Loop over all event elements
130 if ( xml->GetNodeName(eventNode) != std::string("e") ) {
131 ATH_MSG_ERROR ("Canot parse XML. Expected 'e' (event) node, got " << xml->GetNodeName(eventNode));
132 return StatusCode::FAILURE;
133 }
134 const uint64_t eventNumber = std::strtoll(xml->GetAttr(eventNode, "n"), nullptr, 10); //Number
135 const int32_t eventWeightID = std::stoi(xml->GetAttr(eventNode, "w") ); //Weight ID
136
137 m_eventNumberToIdMap[eventNumber] = eventWeightID;
138
139 eventNode = xml->GetNext(eventNode);
140 }
141
142 ATH_MSG_INFO ("Loaded " << m_eventNumberToIdMap.size() << " event weights for run " << runNumber);
143 return StatusCode::SUCCESS;
144}
#define ATH_MSG_WARNING(x)

◆ msg()

MsgStream & AthCommonMsg< AlgTool >::msg ( ) const
inlineinherited

Definition at line 24 of file AthCommonMsg.h.

24 {
25 return this->msgStream();
26 }

◆ msg_level_name()

const std::string & asg::AsgTool::msg_level_name ( ) const
inherited

A deprecated function for getting the message level's name.

Instead of using this, weirdly named function, user code should get the string name of the current minimum message level (in case they really need it...), with:

MSG::name( msg().level() )

This function's name doesn't follow the ATLAS coding rules, and as such will be removed in the not too distant future.

Returns
The string name of the current minimum message level that's printed

Definition at line 101 of file AsgTool.cxx.

101 {
102
103 return MSG::name( msg().level() );
104 }
const std::string & name(Level lvl)
Convenience function for translating message levels to strings.
Definition MsgLevel.cxx:19

◆ msgLvl()

bool AthCommonMsg< AlgTool >::msgLvl ( const MSG::Level lvl) const
inlineinherited

Definition at line 30 of file AthCommonMsg.h.

30 {
31 return this->msgLevel(lvl);
32 }

◆ outputHandles()

virtual std::vector< Gaudi::DataHandle * > AthCommonDataStore< AthCommonMsg< AlgTool > >::outputHandles ( ) const
overridevirtualinherited

Return this algorithm's output handles.

We override this to include handle instances from key arrays if they have not yet been declared. See comments on updateVHKA.

◆ parsePrescaleXML()

std::unordered_map< std::string, ChainDetail > EnhancedBiasWeighter::parsePrescaleXML ( const std::string & prescaleXML) const
overridevirtual

Parse a presscale XML and return a ordered summary of its content To make most use of the XML parsing available already in this class.

Parameters
prescaleXMLFile name of a prescales file as generated by the RuleBook
Returns
Set of L1 or HLT chain names mapped to their desired prescale

Implements IEnhancedBiasWeighter.

Definition at line 249 of file EnhancedBiasWeighter.cxx.

249 {
250 std::unordered_map<std::string, ChainDetail> result;
251
252 std::string xmlFile = PathResolverFindDataFile( prescaleXML );
253 if (xmlFile == "") {
254 ATH_MSG_ERROR ("Could not retrieve " << prescaleXML << ", place it somewhere PathResolver can find it (such as the current directory).");
255 return result;
256 }
257
258 std::unique_ptr<TXMLEngine> xml(new TXMLEngine());
259 const XMLDocPointer_t xmlDoc = xml->ParseFile( xmlFile.c_str() );
260
261 if (xmlDoc == nullptr) {
262 ATH_MSG_WARNING ("Could not parse " << prescaleXML << ", please check that it is valid XML.");
263 return result;
264 }
265
266 // Get access to main node
267 XMLNodePointer_t mainNode = xml->DocGetRootElement(xmlDoc);
268 if ( xml->GetNodeName(mainNode) != std::string("trigger") ) {
269 ATH_MSG_ERROR ("Canot parse XML. Expected 'trigger' node, got " << xml->GetNodeName(mainNode));
270 return result;
271 }
272 XMLNodePointer_t listNode = xml->GetChild( mainNode );
273
274
275 while ( listNode != nullptr) { // Loop over all menu elements
276 const std::string listName = xml->GetNodeName(listNode);
277
278 // if (_listName == "PredictionLumi") {
279 // Float_t predictionLumi = stringToFloat( xml->GetNodeContent(listNode) );
280 // }
281 if (listName != "level") { // Find the "level" item
282 listNode = xml->GetNext(listNode);
283 continue;
284 }
285
286 XMLNodePointer_t sigNode = xml->GetChild( listNode );
287 while( sigNode != nullptr) {
288 if (xml->GetNodeName(sigNode) != std::string("signature")) { // Find the "signature" items
289 sigNode = xml->GetNext(sigNode);
290 continue;
291 }
292
293 XMLNodePointer_t sigDetailsNode = xml->GetChild( sigNode );
294 std::string chainName;
295 while( sigDetailsNode != nullptr) {
296
297 if (xml->GetNodeContent(sigDetailsNode) == nullptr) {
298 sigDetailsNode = xml->GetNext(sigDetailsNode);
299 continue;
300 }
301
302 const std::string detail = xml->GetNodeName(sigDetailsNode);
303 if (detail == "sig_name") {
304 chainName = xml->GetNodeContent(sigDetailsNode);
305 result[chainName] = ChainDetail();
306 } else if (detail == "sig_counter") {
307 result[chainName].m_counter = std::stoi( xml->GetNodeContent(sigDetailsNode) );
308 } else if (detail == "prescale" || detail == "chain_prescale") { // This is an alternate name
309 result[chainName].m_prescale = std::stod( xml->GetNodeContent(sigDetailsNode) );
310 } else if (detail == "lower_chain_name") {
311 // Later processing here does not expect any spaces, so remove them now. Pure comma separated list
312 std::string lower = xml->GetNodeContent(sigDetailsNode);
313 while (lower.find(" ") != std::string::npos) lower.replace( lower.find(" "), 1, "");
314 result[chainName].m_lowerName = std::move(lower);
315 } else if (detail == "evts_passed") {
316 result[chainName].m_eventsPassed = std::stod( xml->GetNodeContent(sigDetailsNode) );
317 } else if (detail == "evts_passed_weighted") {
318 result[chainName].m_eventsPassedWeighted = std::stod( xml->GetNodeContent(sigDetailsNode) );
319 } else if (detail == "rate") {
320 result[chainName].m_rate = std::stod( xml->GetNodeContent(sigDetailsNode) );
321 } else if (detail == "rate_err") {
322 result[chainName].m_rateErr = std::stod( xml->GetNodeContent(sigDetailsNode) );
323 } else if (detail == "passthrough") {
324 result[chainName].m_passthroughPrescale = std::stod( xml->GetNodeContent(sigDetailsNode) );
325 } else if (detail == "rerun_prescale") {
326 result[chainName].m_rerunPrescale = std::stod( xml->GetNodeContent(sigDetailsNode) );
327 } else if (detail == "express_prescale") {
328 result[chainName].m_expressPrescale = std::stod( xml->GetNodeContent(sigDetailsNode) );
329 } else if (detail == "efficiency") {
330 result[chainName].m_efficiency = std::stod( xml->GetNodeContent(sigDetailsNode) );
331 } else if (detail == "efficiency_err") {
332 result[chainName].m_efficiencyErr = std::stod( xml->GetNodeContent(sigDetailsNode) );
333 } else if (detail == "prescaled_efficiency") {
334 result[chainName].m_prescaledEfficiency = std::stod( xml->GetNodeContent(sigDetailsNode) );
335 } else if (detail == "prescaled_efficiency_error") {
336 result[chainName].m_prescaledEfficiencyErr = std::stod( xml->GetNodeContent(sigDetailsNode) );
337 } else if (detail == "comment") {
338 result[chainName].m_comment = xml->GetNodeContent(sigDetailsNode);
339 } else {
340 ATH_MSG_DEBUG("Input prescales XML contains additional data which cannot be parsed at present:" << detail);
341 }
342
343 sigDetailsNode = xml->GetNext(sigDetailsNode);
344 }
345 sigNode = xml->GetNext(sigNode);
346 }
347 listNode = xml->GetNext(listNode);
348 }
349
350 return result;
351}
std::string PathResolverFindDataFile(const std::string &logical_file_name)

◆ print()

◆ renounce()

std::enable_if_t< std::is_void_v< std::result_of_t< decltype(&T::renounce)(T)> > &&!std::is_base_of_v< SG::VarHandleKeyArray, T > &&std::is_base_of_v< Gaudi::DataHandle, T >, void > AthCommonDataStore< AthCommonMsg< AlgTool > >::renounce ( T & h)
inlineprotectedinherited

Definition at line 380 of file AthCommonDataStore.h.

381 {
382 h.renounce();
384 }
std::enable_if_t< std::is_void_v< std::result_of_t< decltype(&T::renounce)(T)> > &&!std::is_base_of_v< SG::VarHandleKeyArray, T > &&std::is_base_of_v< Gaudi::DataHandle, T >, void > renounce(T &h)

◆ renounceArray()

void AthCommonDataStore< AthCommonMsg< AlgTool > >::renounceArray ( SG::VarHandleKeyArray & handlesArray)
inlineprotectedinherited

remove all handles from I/O resolution

Definition at line 364 of file AthCommonDataStore.h.

364 {
366 }

◆ sysInitialize()

virtual StatusCode AthCommonDataStore< AthCommonMsg< AlgTool > >::sysInitialize ( )
overridevirtualinherited

Perform system initialization for an algorithm.

We override this to declare all the elements of handle key arrays at the end of initialization. See comments on updateVHKA.

Reimplemented in asg::AsgMetadataTool, AthCheckedComponent< AthAlgTool >, AthCheckedComponent<::AthAlgTool >, and DerivationFramework::CfAthAlgTool.

◆ sysStart()

virtual StatusCode AthCommonDataStore< AthCommonMsg< AlgTool > >::sysStart ( )
overridevirtualinherited

Handle START transition.

We override this in order to make sure that conditions handle keys can cache a pointer to the conditions container.

◆ trackAverages() [1/2]

StatusCode EnhancedBiasWeighter::trackAverages ( const EventContext & context) const
private

Definition at line 456 of file EnhancedBiasWeighter.cxx.

457{
458 m_lumiAverage += getLBLumi(context);
459 return StatusCode::SUCCESS;
460}

◆ trackAverages() [2/2]

StatusCode EnhancedBiasWeighter::trackAverages ( const xAOD::EventInfo * eventInfo) const
private

Internal function to keep track of the mean instantaneous lumi & mean pileup of the EB/MC sample being processed.

Definition at line 463 of file EnhancedBiasWeighter.cxx.

464{
465 m_muAverage += std::ceil( eventInfo->actualInteractionsPerCrossing() );
466 m_lumiAverage += getLBLumi(eventInfo);
467 return StatusCode::SUCCESS;
468}

◆ updateVHKA()

void AthCommonDataStore< AthCommonMsg< AlgTool > >::updateVHKA ( Gaudi::Details::PropertyBase & )
inlineinherited

Definition at line 308 of file AthCommonDataStore.h.

308 {
309 // debug() << "updateVHKA for property " << p.name() << " " << p.toString()
310 // << " size: " << m_vhka.size() << endmsg;
311 for (auto &a : m_vhka) {
313 for (auto k : keys) {
314 k->setOwner(this);
315 }
316 }
317 }
std::vector< SG::VarHandleKeyArray * > m_vhka

Member Data Documentation

◆ ATLAS_THREAD_SAFE [1/3]

std::unordered_map<uint32_t, float> m_eventLivetime EnhancedBiasWeighter::ATLAS_THREAD_SAFE
mutableprivate

Cache of per-event livetime as a function of LB [LB -> effective walltime per event].

Definition at line 211 of file EnhancedBiasWeighter.h.

◆ ATLAS_THREAD_SAFE [2/3]

Gaudi::Accumulators::AveragingCounter<double> m_lumiAverage EnhancedBiasWeighter::ATLAS_THREAD_SAFE
mutableprivate

The average instantaneous lumionosity over all events.

Definition at line 213 of file EnhancedBiasWeighter.h.

◆ ATLAS_THREAD_SAFE [3/3]

Gaudi::Accumulators::AveragingCounter<double> m_muAverage EnhancedBiasWeighter::ATLAS_THREAD_SAFE
mutableprivate

The average mu over all events.

Definition at line 214 of file EnhancedBiasWeighter.h.

◆ FULL_RING

uint32_t EnhancedBiasWeighter::FULL_RING = 2738
staticconstexpr

Number of bunches in a full ring.

Definition at line 56 of file EnhancedBiasWeighter.h.

◆ LHC_FREQUENCY

double EnhancedBiasWeighter::LHC_FREQUENCY = 11245.5
staticconstexpr

Definition at line 55 of file EnhancedBiasWeighter.h.

◆ m_bunchCrossingKey

SG::ReadCondHandleKey<BunchCrossingCondData> EnhancedBiasWeighter::m_bunchCrossingKey {this, "BunchCrossingKey", "BunchCrossingData", "Key BunchCrossing CDO" }
private

Tool to get distance into bunch train.

Definition at line 190 of file EnhancedBiasWeighter.h.

190{this, "BunchCrossingKey", "BunchCrossingData", "Key BunchCrossing CDO" };

◆ m_bunches

std::vector<int32_t> EnhancedBiasWeighter::m_bunches
private

Number of BCIDs in each bunch group.

Definition at line 223 of file EnhancedBiasWeighter.h.

◆ m_deadtime

double EnhancedBiasWeighter::m_deadtime
private

Online deadtime to correct for in rate prediction.

Currently a constant for the EB period

Definition at line 206 of file EnhancedBiasWeighter.h.

◆ m_deadtimePerLB

std::unordered_map<uint32_t, double> EnhancedBiasWeighter::m_deadtimePerLB
private

Map of average deadtime per LB.

Definition at line 221 of file EnhancedBiasWeighter.h.

◆ m_detStore

StoreGateSvc_t AthCommonDataStore< AthCommonMsg< AlgTool > >::m_detStore
privateinherited

Pointer to StoreGate (detector store by default)

Definition at line 393 of file AthCommonDataStore.h.

◆ m_doMultiSliceDiJet

Gaudi::Property<bool> EnhancedBiasWeighter::m_doMultiSliceDiJet {this, "DoMultiSliceDiJet", false, "Enable the HS-softer-than-PU (HSTP) filter; reweight the Slices according to Jet/ETMiss procedure; recommended by PMG for di-jet slices."}
private

Definition at line 203 of file EnhancedBiasWeighter.h.

203{this, "DoMultiSliceDiJet", false, "Enable the HS-softer-than-PU (HSTP) filter; reweight the Slices according to Jet/ETMiss procedure; recommended by PMG for di-jet slices."};

◆ m_enforceEBGRL

Gaudi::Property<bool> EnhancedBiasWeighter::m_enforceEBGRL {this, "EnforceEBGRL", true, "Each Enhanced Bias run has a 'good run list' style veto on some LB. If this flag is true, events in these LB get weight 0"}
private

Definition at line 194 of file EnhancedBiasWeighter.h.

194{this, "EnforceEBGRL", true, "Each Enhanced Bias run has a 'good run list' style veto on some LB. If this flag is true, events in these LB get weight 0"};

◆ m_errorOnMissingEBWeights

Gaudi::Property<bool> EnhancedBiasWeighter::m_errorOnMissingEBWeights {this, "ErrorOnMissingEBWeights", false, "If true, Throws error if EB weights are missing."}
private

Definition at line 193 of file EnhancedBiasWeighter.h.

193{this, "ErrorOnMissingEBWeights", false, "If true, Throws error if EB weights are missing."};

◆ m_eventNumberToIdMap

std::unordered_map<uint64_t, int32_t> EnhancedBiasWeighter::m_eventNumberToIdMap
private

Map event number to a weighting ID.

Definition at line 209 of file EnhancedBiasWeighter.h.

◆ m_eventsPerLB

std::unordered_map<uint32_t, uint32_t> EnhancedBiasWeighter::m_eventsPerLB
private

Map of how many EnhancedBias events were recorded per LB.

Definition at line 218 of file EnhancedBiasWeighter.h.

◆ m_evtStore

StoreGateSvc_t AthCommonDataStore< AthCommonMsg< AlgTool > >::m_evtStore
privateinherited

Pointer to StoreGate (event store by default)

Definition at line 390 of file AthCommonDataStore.h.

◆ m_goodLB

std::unordered_map<uint32_t, uint8_t> EnhancedBiasWeighter::m_goodLB
private

Like a Good Run List flag for EnhancedBias runs.

Definition at line 220 of file EnhancedBiasWeighter.h.

◆ m_idToUnbiasedMap

std::unordered_map<int32_t, uint8_t> EnhancedBiasWeighter::m_idToUnbiasedMap
private

Map a weighting ID to a flag if this weight is from an unbiased (RD) trigger online.

Definition at line 217 of file EnhancedBiasWeighter.h.

◆ m_idToWeightMap

std::unordered_map<int32_t, double> EnhancedBiasWeighter::m_idToWeightMap
private

Map a weighting ID to a Enhanced Bias event weight.

Definition at line 216 of file EnhancedBiasWeighter.h.

◆ m_inelasticCrossSection

Gaudi::Property<double> EnhancedBiasWeighter::m_inelasticCrossSection {this, "InelasticCrossSection", 8e-26, "Inelastic cross section in units cm^2. Default 80 mb at 13 TeV."}
private

Definition at line 201 of file EnhancedBiasWeighter.h.

201{this, "InelasticCrossSection", 8e-26, "Inelastic cross section in units cm^2. Default 80 mb at 13 TeV."};

◆ m_isMC

Gaudi::Property<bool> EnhancedBiasWeighter::m_isMC {this, "IsMC", false, "MC mode? If so we need a cross section and filter efficiency"}
private

Definition at line 196 of file EnhancedBiasWeighter.h.

196{this, "IsMC", false, "MC mode? If so we need a cross section and filter efficiency"};

◆ m_lumiPerLB

std::unordered_map<uint32_t, double> EnhancedBiasWeighter::m_lumiPerLB
private

Map of instantaneous luminosity per LB.

Definition at line 219 of file EnhancedBiasWeighter.h.

◆ m_mcCrossSection

Gaudi::Property<double> EnhancedBiasWeighter::m_mcCrossSection {this, "MCCrossSection", 0.0, "If running over MC. The process cross section in nb (AMI gives thins in nb)"}
private

Definition at line 197 of file EnhancedBiasWeighter.h.

197{this, "MCCrossSection", 0.0, "If running over MC. The process cross section in nb (AMI gives thins in nb)"};

◆ m_mcFilterEfficiency

Gaudi::Property<double> EnhancedBiasWeighter::m_mcFilterEfficiency {this, "MCFilterEfficiency", 1.0, "If running over MC. The process filter efficiency (0.0-1.0)"}
private

Definition at line 198 of file EnhancedBiasWeighter.h.

198{this, "MCFilterEfficiency", 1.0, "If running over MC. The process filter efficiency (0.0-1.0)"};

◆ m_mcIgnoreGeneratorWeights

Gaudi::Property<bool> EnhancedBiasWeighter::m_mcIgnoreGeneratorWeights {this, "MCIgnoreGeneratorWeights", false, "If running over MC. Flag to ignore the generator weight."}
private

Definition at line 200 of file EnhancedBiasWeighter.h.

200{this, "MCIgnoreGeneratorWeights", false, "If running over MC. Flag to ignore the generator weight."};

◆ m_mcKFactor

Gaudi::Property<double> EnhancedBiasWeighter::m_mcKFactor {this, "MCKFactor", 1.0, "If running over MC. The process filter efficiency (0.0-1.0)"}
private

Definition at line 199 of file EnhancedBiasWeighter.h.

199{this, "MCKFactor", 1.0, "If running over MC. The process filter efficiency (0.0-1.0)"};

◆ m_mcModifiedCrossSection

double EnhancedBiasWeighter::m_mcModifiedCrossSection
private

Product of xsec, filter & kfactor.

In units of cm

Definition at line 208 of file EnhancedBiasWeighter.h.

◆ m_mutex

std::mutex EnhancedBiasWeighter::m_mutex
mutableprivate

Protection for above map.

Definition at line 212 of file EnhancedBiasWeighter.h.

◆ m_pairedBunches

uint32_t EnhancedBiasWeighter::m_pairedBunches
private

Online number of paired bunches.

Definition at line 207 of file EnhancedBiasWeighter.h.

◆ m_readLumiBlock

ReadLumiBlock EnhancedBiasWeighter::m_readLumiBlock
private

Cache lumi block lengths.

Get this from COOL.

Definition at line 225 of file EnhancedBiasWeighter.h.

◆ m_runNumber

Gaudi::Property<uint32_t> EnhancedBiasWeighter::m_runNumber {this, "RunNumber", 0, "Run we're processing (if data), needed at initialize to locate and read in extra configuration."}
private

Definition at line 192 of file EnhancedBiasWeighter.h.

192{this, "RunNumber", 0, "Run we're processing (if data), needed at initialize to locate and read in extra configuration."};

◆ m_targetLumi

Gaudi::Property<double> EnhancedBiasWeighter::m_targetLumi {this, "TargetLuminosity", 2e34, "Targer inst. luminosity, assuming full ring."}
private

Definition at line 204 of file EnhancedBiasWeighter.h.

204{this, "TargetLuminosity", 2e34, "Targer inst. luminosity, assuming full ring."};

◆ m_useBunchCrossingData

Gaudi::Property<bool> EnhancedBiasWeighter::m_useBunchCrossingData {this, "UseBunchCrossingData", true, "BunchCrossing data requires CONDBR2 access. Can be disabled here if this is a problem."}
private

Definition at line 195 of file EnhancedBiasWeighter.h.

195{this, "UseBunchCrossingData", true, "BunchCrossing data requires CONDBR2 access. Can be disabled here if this is a problem."};

◆ m_varHandleArraysDeclared

bool AthCommonDataStore< AthCommonMsg< AlgTool > >::m_varHandleArraysDeclared
privateinherited

Definition at line 399 of file AthCommonDataStore.h.

◆ m_vhka

std::vector<SG::VarHandleKeyArray*> AthCommonDataStore< AthCommonMsg< AlgTool > >::m_vhka
privateinherited

Definition at line 398 of file AthCommonDataStore.h.

◆ m_weightsDirectory

Gaudi::Property<std::string> EnhancedBiasWeighter::m_weightsDirectory {this, "EBWeightsDirectory", "", "Path to directory with EB XML weights files, if empty they will be read from calibration area"}
private

Definition at line 202 of file EnhancedBiasWeighter.h.

202{this, "EBWeightsDirectory", "", "Path to directory with EB XML weights files, if empty they will be read from calibration area"};

The documentation for this class was generated from the following files: