Belle II Software development
HistDelta.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#include <dqm/core/HistDelta.h>
9#include <dqm/core/DQMHistAnalysis.h>
10#include <string>
11#include <TROOT.h>
12
13using namespace Belle2;
14
15HistDelta::HistDelta(EDeltaType t, int p, unsigned int a) : m_lastHist{nullptr}
16{
17 m_type = t;
18 m_parameter = p;
20 m_lastValue = 0; // implied
21}
22
24{
25 m_lastHist = nullptr;
26 m_deltaHists.clear();
27}
28
29void HistDelta::set(EDeltaType t, int p, unsigned int a)
30{
31 m_type = t;
32 m_parameter = p;
34 m_lastHist = nullptr;
35 m_lastValue = 0;
36 m_deltaHists.clear();
37}
38
39void HistDelta::update(const TH1* currentHist)
40{
41 m_updated = false;
42 if (currentHist == nullptr) return; // this won't make sense
43 gROOT->cd(); // make sure we dont accidentally write the histograms to a open file
44 // cover first update after start
45 if (m_lastHist == nullptr) {
46 m_lastHist = std::unique_ptr<TH1>(static_cast<TH1*>(currentHist->Clone()));
47 m_lastHist->SetName(TString(currentHist->GetName()) + "_last");
48 m_lastHist->Reset();
49 m_updated = true;
50 }
51 // now check if need to update m_deltaHists
52 bool need_update = false;
53 switch (m_type) {
54 case c_Entries:
55 // default case, look at the entries in the histogram
56 need_update = currentHist->GetEntries() - m_lastHist->GetEntries() >= m_parameter;
57 break;
58 case c_Underflow:
59 // here we misuse underflow as event counter in some histograms, e.g. PXD
60 need_update = currentHist->GetBinContent(0) - m_lastHist->GetBinContent(0) >= m_parameter;
61 break;
62 case c_Events:
63 // use event processed counter
65 if (need_update) m_lastValue = DQMHistAnalysisModule::getEventProcessed(); // update last value
66 break;
67 default:
68 // any unsupported types map to case 0(Disabled), and will disable delta for this hist
69 [[fallthrough]];
70 case c_Disabled:
71 break;
72 }
73
74 if (need_update) {
75 m_updated = true;
76 auto delta = static_cast<TH1*>(currentHist->Clone());
77 delta->SetName(TString(delta->GetName()) + "_delta");
78 delta->Add(m_lastHist.get(), -1.);
79
80 // we use this as a fifo, but cannot use queue as we need the random access
81 // maybe use deque?
82 m_deltaHists.emplace(m_deltaHists.begin(), delta);
83 if (m_deltaHists.size() > m_amountDeltas) {
84 // remove (and delete) last element
85 m_deltaHists.erase(m_deltaHists.begin() + m_deltaHists.size() - 1);
86 }
87 m_lastHist->Reset();
88 m_lastHist->Add(currentHist);
89 }
97}
98
100{
101 m_deltaHists.clear();
102 if (m_lastHist) m_lastHist->Reset();
103 m_lastValue = 0;
104}
105
106TH1* HistDelta::getDelta(unsigned int n, bool onlyIfUpdated) const
107{
108 if (onlyIfUpdated && !m_updated) return nullptr;// not updated, but requested
109 if (n >= m_deltaHists.size()) return nullptr;
110 return m_deltaHists.at(n).get();
111}
static int getEventProcessed(void)
Get the number of processed events.
void update(const TH1 *hist)
Check if update of delta histogram is necessary.
Definition HistDelta.cc:39
~HistDelta()
Destructor.
Definition HistDelta.cc:23
EDeltaType m_type
type of delta algo
Definition HistDelta.h:33
void set(EDeltaType t, int p, unsigned int a)
Parameter setter.
Definition HistDelta.cc:29
void reset(void)
Reset histogram and deltas, not the parameters.
Definition HistDelta.cc:99
std::unique_ptr< TH1 > m_lastHist
Pointer to last histogram state for check.
Definition HistDelta.h:36
TH1 * getDelta(unsigned int n=0, bool onlyIfUpdated=true) const
Get Delta Histogram.
Definition HistDelta.cc:106
std::vector< std::unique_ptr< TH1 > > m_deltaHists
vector of histograms (max m_amountDeltas)
Definition HistDelta.h:38
int m_lastValue
last value for comparison, depending on type
Definition HistDelta.h:37
unsigned int m_amountDeltas
amount of past histograms, at least 1
Definition HistDelta.h:35
int m_parameter
parameter depending on algo, e.g.
Definition HistDelta.h:34
HistDelta(EDeltaType t=c_Disabled, int p=0, unsigned int a=0)
Constructor.
Definition HistDelta.cc:15
EDeltaType
enum definition for delta algo Disabled: nothing Entries: use nr histogram entries Underflow: use ent...
Definition HistDelta.h:32
bool m_updated
if any delta was updated in this event
Definition HistDelta.h:39
Abstract base class for different kinds of events.