ATLAS Offline Software
Loading...
Searching...
No Matches
PileUpHashHelper.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2022 CERN for the benefit of the ATLAS collaboration
3*/
4
6
7#include <CxxUtils/MD5.h>
8
10
11void PileUpHashHelper::addToHashSource(const std::string &string)
12{
14}
15
17{
18 const std::vector<xAOD::EventInfo::SubEvent> &subEventsSource = eventInfo->subEvents();
19 std::vector<std::reference_wrapper<const xAOD::EventInfo::SubEvent>> subEvents(subEventsSource.begin(), subEventsSource.end());
20
21 std::stable_sort(subEvents.begin(), subEvents.end(), [](const xAOD::EventInfo::SubEvent &a, const xAOD::EventInfo::SubEvent &b) {
22 return (a.ptr()->bcid() < b.ptr()->bcid()) ||
23 ((a.ptr()->bcid() == b.ptr()->bcid()) && (a.type() < b.type())) ||
24 ((a.ptr()->bcid() == b.ptr()->bcid()) && (a.type() == b.type()) && (a.ptr()->eventNumber() < b.ptr()->eventNumber()));
25 });
26
27 // Generate subevents info string
28 bool first = true;
29 for (const xAOD::EventInfo::SubEvent &subevent : subEvents) {
30 if (subevent.type() == xAOD::EventInfo::Signal) {
31 continue;
32 }
33
34 if (first) {
35 first = false;
36 } else {
37 m_stream << ";";
38 }
39
40 m_stream << (static_cast<int32_t>(subevent.ptr()->bcid()) - static_cast<int32_t>(eventInfo->bcid())) << "_" << subevent.type() << "_" << subevent.ptr()->eventNumber();
41 }
42}
43
45{
46 m_stream.str(std::string());
47}
48
49void PileUpHashHelper::calculateHash(uuid_t &hash) const
50{
51 std::string sourceStr = m_stream.str();
52
53 MD5 md5Hash(sourceStr);
54 md5Hash.uuid_digest(hash);
55}
56
58{
60
61 for (uint16_t i = 0; i < PILEUP_SIZE_BYTES; i++) {
62 mixture.lowBits |= (static_cast<unsigned long long>(hash[i]) << (i * sizeof(unsigned char) * CHAR_BIT));
63 mixture.highBits |= (static_cast<unsigned long long>(hash[i + PILEUP_SIZE_BYTES]) << (i * sizeof(unsigned char) * CHAR_BIT));
64 }
65
66 return mixture;
67}
68
70 uuid_t &hash)
71{
72 for (uint16_t i = 0; i < PILEUP_SIZE_BYTES; i++) {
73 hash[i] |= (mixture.lowBits >> (i * sizeof(unsigned char) * CHAR_BIT));
74 hash[i + PILEUP_SIZE_BYTES] |= (mixture.highBits >> (i * sizeof(unsigned char) * CHAR_BIT));
75 }
76}
static Double_t a
solar's public-domain MD5, wrapped for C++.
A helper class to compute a hash of pile-up events.
Definition MD5.h:20
void uuid_digest(uuid_t &uuid) const
Definition MD5.cxx:88
void clearHashSource()
Clear the stream.
std::stringstream m_stream
void addToHashSource(const std::string &string)
Add a plain string to the stream.
void calculateHash(uuid_t &hash) const
Calculate the hash.
static void pileUpMixtureIdToUuid(const xAOD::EventInfo::PileUpMixtureID &mixture, uuid_t &hash)
xAOD::EventInfo::PileUpMixtureID to uuid_t
static xAOD::EventInfo::PileUpMixtureID uuidToPileUpMixtureId(const uuid_t &hash)
Convert uuid_t to xAOD::EventInfo::PileUpMixtureID.
static const uint16_t PILEUP_SIZE_BYTES
Size of individual low/high bits in bytes.
STL class.
Class describing the properties of one pileup sub-event.
uint32_t bcid() const
The bunch crossing ID of the event.
const std::vector< SubEvent > & subEvents() const
Get the pileup events that were used in the simulation.
@ Signal
The signal event.
void stable_sort(DataModel_detail::iterator< DVL > beg, DataModel_detail::iterator< DVL > end)
Specialization of stable_sort for DataVector/List.
EventInfo_v1 EventInfo
Definition of the latest event info version.
Unique pile-up mixture identifier definition.