Belle II Software development
BackgroundInfo.cc
1/**************************************************************************
2 * basf2 (Belle II Analysis Software Framework) *
3 * Author: The Belle II Collaboration *
4 * *
5 * See git log for contributors and copyright holders. *
6 * This file is licensed under LGPL-3.0, see LICENSE.md. *
7 **************************************************************************/
8
9#include <framework/dataobjects/BackgroundInfo.h>
10#include <framework/logging/Logger.h>
11#include <iostream>
12#include <unordered_set>
13
14using namespace std;
15using namespace Belle2;
16
17
19{
20
21 if (otherObj->getMethod() != m_method) {
22 B2ERROR("BackgroundInfo: objects cannot be merged (different method)");
23 return false;
24 }
25
26 std::unordered_set<int> bgThis;
27 for (const auto& bg : m_backgrounds) {
28 int key = bg.tag * 16 + bg.fileType;
29 bgThis.emplace(key);
30 }
31 std::unordered_set<int> bgOther;
32 for (const auto& bg : otherObj->getBackgrounds()) {
33 int key = bg.tag * 16 + bg.fileType;
34 bgOther.emplace(key);
35 }
36 if (bgOther != bgThis) {
37 B2ERROR("BackgroundInfo: objects cannot be merged (different backgrounds)");
38 return false;
39 }
40
41 auto compThis = m_components;
42 std::sort(compThis.begin(), compThis.end());
43 auto compOther = otherObj->getComponents();
44 std::sort(compOther.begin(), compOther.end());
45 if (compOther != compThis) {
46 B2ERROR("BackgroundInfo: objects cannot be merged (different components)");
47 return false;
48 }
49
50 if (otherObj->getMinTime() != m_minTime) {
51 B2ERROR("BackgroundInfo: objects cannot be merged (different minTime)");
52 return false;
53 }
54
55 if (otherObj->getMaxTime() != m_maxTime) {
56 B2ERROR("BackgroundInfo: objects cannot be merged (different maxTime)");
57 return false;
58 }
59
60 if (otherObj->getMinTimeECL() != m_minTimeECL) {
61 B2ERROR("BackgroundInfo: objects cannot be merged (different minTimeECL)");
62 return false;
63 }
64
65 if (otherObj->getMaxTimeECL() != m_maxTimeECL) {
66 B2ERROR("BackgroundInfo: objects cannot be merged (different maxTimeECL)");
67 return false;
68 }
69
70 if (otherObj->getMinTimePXD() != m_minTimePXD) {
71 B2ERROR("BackgroundInfo: objects cannot be merged (different minTimePXD)");
72 return false;
73 }
74
75 if (otherObj->getMaxTimePXD() != m_maxTimePXD) {
76 B2ERROR("BackgroundInfo: objects cannot be merged (different maxTimePXD)");
77 return false;
78 }
79
80 if (otherObj->getWrapAround() != m_wrapAround) {
81 B2ERROR("BackgroundInfo: objects cannot be merged (different wrapAround)");
82 return false;
83 }
84
85 if (otherObj->getMaxEdepECL() != m_maxEdepECL) {
86 B2ERROR("BackgroundInfo: objects cannot be merged (different maxEdepECL)");
87 return false;
88 }
89
90 return true;
91}
92
93
95{
96
97 auto otherObj = static_cast<const BackgroundInfo*>(other);
98
99 if (otherObj->getMethod() == c_Unknown and otherObj->getBackgrounds().empty())
100 return; // no merge for empty object
101
102 if (m_method == c_Unknown and m_backgrounds.empty()) { // empty, replace it with other
103 *this = *otherObj;
104 return;
105 }
106
107 if (!canBeMerged(otherObj)) throw BackgroundInfoNotMergeable();
108
109 for (const auto& otherBg : otherObj->getBackgrounds()) {
110 bool added{false};
111 for (auto& bg : m_backgrounds) {
112 if (otherBg.tag != bg.tag) continue;
113 if (otherBg.fileType != bg.fileType) continue;
114 if (otherBg.runNumber != bg.runNumber) continue;
115 if (otherBg.fileNames == bg.fileNames) {
116 if (otherBg.scaleFactor != bg.scaleFactor) {
117 B2ERROR("BackgroundInfo: objects cannot be merged (different scaleFactor)");
118 throw BackgroundInfoNotMergeable();
119 }
120 bg.reused += otherBg.reused;
121 added = true;
122 break;
123 }
124 }
125 if (!added) m_backgrounds.push_back(otherBg);
126 }
127
128}
129
131{
132
133 for (auto& bg : m_backgrounds) {
134 bg.reused = 0;
135 }
136
137}
138
139
141{
142 switch (m_method) {
143 case c_Mixing:
144 cout << "Method: BG mixing" << endl;
146 break;
147 case c_Overlay:
148 cout << "Method: BG overlay" << endl;
150 break;
151 default:
152 cout << "Method: unknown" << endl;
154 }
155}
156
157
159{
160 cout << "Components: ";
161 if (m_components.empty()) {
162 cout << "all ";
163 } else {
164 for (const auto& component : m_components) cout << component << " ";
165 }
166 cout << endl;
167
168 cout << "Time window: ";
169 cout << "PXD [" << m_minTimePXD << ", " << m_maxTimePXD << "] ns, ";
170 cout << "ECL [" << m_minTimeECL << ", " << m_maxTimeECL << "] ns, ";
171 cout << "other components [" << m_minTime << ", " << m_maxTime << "] ns";
172 cout << endl;
173
174 cout << "Wrapping around: ";
175 if (m_wrapAround) {
176 cout << "enabled";
177 } else {
178 cout << "disabled";
179 }
180 cout << endl;
181
182 cout << "ECL deposited energy cut: " << m_maxEdepECL << " GeV" << endl;
183
184 cout << "Samples: " << endl;
185 for (const auto& bkg : m_backgrounds) {
186 cout << " " << bkg.type << endl;
187 cout << " equivalent time: " << bkg.realTime / 1000000 << " ms";
188 cout << ", events: " << bkg.numEvents;
189 cout << ", scale factor: " << bkg.scaleFactor;
190 cout << ", rate: " << bkg.rate << " GHz";
191 cout << ", re-used: " << bkg.reused << " times";
192 cout << endl;
193
194 for (const auto& fileName : bkg.fileNames) cout << " " << fileName << endl;
195 cout << endl;
196
197 }
198
199}
200
202{
203 cout << "Components: ";
204 if (m_components.empty()) {
205 cout << "all ";
206 } else {
207 for (const auto& component : m_components) cout << component << " ";
208 }
209 cout << endl;
210
211 cout << "Samples: " << endl;
212 for (const auto& bkg : m_backgrounds) {
213 cout << " " << bkg.type << endl;
214 cout << " run number: " << bkg.runNumber << endl;
215 cout << " events: " << bkg.numEvents;
216 cout << ", re-used: " << bkg.reused << " times";
217 cout << endl;
218
219 for (const auto& fileName : bkg.fileNames) cout << " " << fileName << endl;
220 cout << endl;
221 }
222}
223
This class stores the information about what background was mixed or overlayed.
double m_maxEdepECL
maximal allowed deposited energy in ECL
double m_maxTimeECL
maximal time shift of background event for ECL
std::vector< std::string > m_components
detector components included
double getMaxTime() const
Returns upper edge of the narrow time window.
void printForOverlay() const
Print info when BG overlay is used.
double m_minTimePXD
minimal time shift of background event for PXD
double getMaxTimeECL() const
Returns upper edge of ECL time window.
std::vector< BackgroundDescr > m_backgrounds
background descriptions
double getMaxEdepECL() const
Returns maximal alowed energy deposited in ECL to use BG events.
EMethod getMethod() const
Returns method enum used to add BG.
double m_maxTime
maximal time shift of background event
bool getWrapAround() const
Returns wrap-around flag.
double m_minTime
minimal time shift of background event
bool m_wrapAround
wrap around events in the tail after maxTime
double getMaxTimePXD() const
Returns upper edge of PXD time window.
double m_maxTimePXD
maximal time shift of background event for PXD
void printForMixing() const
Print info when BG mixing is used.
double getMinTimePXD() const
Returns lower edge of PXD time window.
virtual void merge(const Mergeable *other) override
Implementation of abstract class function.
const std::vector< std::string > & getComponents() const
Returns included components.
bool canBeMerged(const BackgroundInfo *other)
Checks if other object can be merged with this object.
const std::vector< BackgroundDescr > & getBackgrounds() const
Returns background descriptions.
void print() const
Print the info.
double getMinTimeECL() const
Returns lower edge of ECL time window.
double m_minTimeECL
minimal time shift of background event for ECL
virtual void clear() override
Implementation of abstract class function.
double getMinTime() const
Returns lower edge of the narrow time window.
Abstract base class for objects that can be merged.
Definition: Mergeable.h:31
Abstract base class for different kinds of events.
STL namespace.