ATLAS Offline Software
Loading...
Searching...
No Matches
BootstrapGeneratorAlg.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2023 CERN for the benefit of the ATLAS collaboration
3*/
4
6
10
11std::uint64_t CP::BootstrapGenerator::fnv1a_64(const void *buffer, size_t size, std::uint64_t offset_basis) {
12 std::uint64_t h = offset_basis;
13 const unsigned char *p = static_cast<const unsigned char *>(buffer);
14 for (size_t i = 0; i < size; i++) {
15 h ^= p[i];
16 h *= m_prime;
17 }
18 return h;
19}
20
21std::uint64_t CP::BootstrapGenerator::generateSeed(std::uint64_t eventNumber, std::uint32_t runNumber, std::uint32_t mcChannelNumber)
22{
23 std::uint64_t hash = fnv1a_64(&runNumber, sizeof(runNumber), m_offset);
24 hash = fnv1a_64(&eventNumber, sizeof(eventNumber), hash);
25 hash = fnv1a_64(&mcChannelNumber, sizeof(mcChannelNumber), hash);
26 return hash;
27}
28
29void CP::BootstrapGenerator::setSeed(std::uint64_t eventNumber, std::uint32_t runNumber, std::uint32_t mcChannelNumber)
30{
31 std::uint64_t seed = generateSeed(eventNumber, runNumber, mcChannelNumber);
32 m_rng.SetSeed(seed);
33}
34
36{
37 if (m_nReplicas < 0)
38 {
39 ANA_MSG_ERROR("The number of bootstrapped weights (toys) cannot be negative!");
40 return StatusCode::FAILURE;
41 }
42
43 ANA_CHECK(m_eventInfoKey.initialize());
44 ANA_CHECK(m_decorationKey.initialize());
45
46 return StatusCode::SUCCESS;
47}
48
49StatusCode CP::BootstrapGeneratorAlg::execute(const EventContext& ctx) const
50{
52 ANA_CHECK(evtInfo.isValid());
53
54 // generate a unique seed from runNumber, eventNumber and DSID!
55 BootstrapGenerator bootstrap;
56 bootstrap.setSeed(evtInfo->eventNumber(), evtInfo->runNumber(), m_data ? 0 : evtInfo->mcChannelNumber());
57
58 // and fill it with Poisson(1)
59 std::vector<std::uint8_t> weights(m_nReplicas);
60 for (std::uint8_t& weight : weights)
61 {
62 weight = bootstrap.getBootstrap();
63 }
64
65 // decorate weights onto EventInfo
67 dec(*evtInfo) = std::move(weights);
68
69 return StatusCode::SUCCESS;
70}
Handle class for reading from StoreGate.
Handle class for adding a decoration to an object.
#define ANA_MSG_ERROR(xmsg,...)
Macro printing error messages.
#define ANA_CHECK(EXP)
check whether the given expression was successful
size_t size() const
Number of registered mappings.
Header file for AthHistogramAlgorithm.
SG::WriteDecorHandleKey< xAOD::EventInfo > m_decorationKey
the output decoration
Gaudi::Property< int > m_nReplicas
the number of bootstrap replicas
SG::ReadHandleKey< xAOD::EventInfo > m_eventInfoKey
the EventInfo container
StatusCode execute(const EventContext &ctx) const override
Gaudi::Property< bool > m_data
flag whether we are running on data
a class to generate random numbers with a unique seed
std::uint64_t fnv1a_64(const void *buffer, size_t size, std::uint64_t offset_basis)
implementation of the hash function from https://en.wikipedia.org/wiki/Fowler%E2%80%93Noll%E2%80%93Vo...
void setSeed(std::uint64_t eventNumber, std::uint32_t runNumber, std::uint32_t mcChannelNumber)
set the seed of the random number generator based on event properties
static constexpr std::uint64_t m_offset
constants for seed generation
TRandomRanluxpp m_rng
the random number generator (Ranlux++)
static constexpr std::uint64_t m_prime
std::uint8_t getBootstrap()
get the next bootstrap weight
std::uint64_t generateSeed(std::uint64_t eventNumber, std::uint32_t runNumber, std::uint32_t mcChannelNumber)
generate a unique seed based on event identifiers
virtual bool isValid() override final
Can the handle be successfully dereferenced?
Handle class for adding a decoration to an object.