Belle II Software development
DQMHistReferenceModule.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 <dqm/analysis/modules/DQMHistReferenceModule.h>
10#include <TROOT.h>
11#include <TStyle.h>
12#include <TKey.h>
13
14using namespace std;
15using namespace Belle2;
16
17//-----------------------------------------------------------------
18// Register the Module
19//-----------------------------------------------------------------
20REG_MODULE(DQMHistReference);
21
22//-----------------------------------------------------------------
23// Implementation
24//-----------------------------------------------------------------
25
27{
28 //Parameter definition
29 addParam("ReferenceFile", m_referenceFileName, "Name of the reference histrogram files", string(""));
30 B2DEBUG(1, "DQMHistReference: Constructor done.");
31}
32
33
35
37{
38 B2DEBUG(1, "DQMHistReference: initialized.");
39}
40
42{
43 B2DEBUG(1, "DQMHistReference: beginRun called.");
44
46}
47
49{
50 TH1::AddDirectory(false); // do not store any histograms
51
52 B2DEBUG(1, "DQMHistReference: reading references from input root file");
53
54 string run_type = getRunType();
55 if (run_type == "") run_type = "default";
56
57 B2INFO("DQMHistReference: run_type " << run_type);
58
59 TFile* refFile = new TFile(m_referenceFileName.c_str(), "READ");
60
61 if (refFile->IsZombie()) {
62 B2INFO("DQMHistReference: reference file " << m_referenceFileName << " does not exist. No references will be used!");
63 refFile->Close();
64 delete refFile;
65 return;
66 }
67
68 B2INFO("DQMHistReference: use reference file " << m_referenceFileName);
69
70 TIter nextRefDirKey(refFile->GetListOfKeys());
71 TKey* refDirKey;
72 while ((refDirKey = (TKey*)nextRefDirKey())) {
73 if (refDirKey->IsFolder() && string(refDirKey->GetName()) == string("ref")) {
74 TDirectory* refDir = (TDirectory*)refDirKey->ReadObj(); // ReadObj -> I own it, delete later
75 TIter nextDetDirKey(refDir->GetListOfKeys());
76 TKey* detDirKey;
77 // detector folders
78 while ((detDirKey = (TKey*)nextDetDirKey())) {
79 if (!detDirKey->IsFolder()) continue;
80 TDirectory* detDir = ((TDirectory*)detDirKey->ReadObj());
81 TIter nextRunTypeDirKey(detDir->GetListOfKeys()); // ReadObj -> Now I own this, so delete later
82 TKey* runtypeDirKey;
83 TDirectory* runtypeDir = nullptr;
84 // run type folders (get the run type corresponding folder or use default one)
85 while ((runtypeDirKey = (TKey*)nextRunTypeDirKey())) {
86 if (!runtypeDirKey->IsFolder()) continue;
87 if (string(runtypeDirKey->GetName()) == run_type) {
88 if (runtypeDir) delete runtypeDir; // if default was loaded before
89 runtypeDir = (TDirectory*)runtypeDirKey->ReadObj(); // ReadObj -> I own it, delete later
90 break; // break directly, otherwise "default" could overwrite it
91 }
92 // else we would check if default, which we load as backup
93 if (string(runtypeDirKey->GetName()) == "default") runtypeDir = (TDirectory*)runtypeDirKey->ReadObj(); // ReadObj -> I own it
94 }
95 string detName = detDir->GetName();
96 // Attention, runtypeDir and runtypeDirKey could be zero here
97 if (!runtypeDir) {
98 B2INFO("No run type specific or default references available for " << detName);
99 } else {
100 B2INFO("Reading reference histograms for " << detName << " from run type folder: " << runtypeDir->GetName());
101
102 TIter nextHistkey(runtypeDir->GetListOfKeys());
103 TKey* histKey;
104 // now read histograms
105 while ((histKey = (TKey*)nextHistkey())) {
106 if (histKey->IsFolder()) continue;
107 if (gROOT->GetClass(histKey->GetClassName())->InheritsFrom("TH1")) {
108 addRefHist(detName, (TH1*)histKey->ReadObj()); // ReadObj -> I own it, tranfer ownership to function
109 }
110 }
111 delete runtypeDir; // always non-zero as checked above ... runtype or "default"
112 }
113 delete detDir; // always non-zero ... detector subdir name
114 }
115 delete refDir; // always non-zero ... "ref" folder
116 }
117 }
118
119 B2INFO("DQMHistReference: read references done");
120 refFile->Close();
121 delete refFile;
122}
123
125{
126 B2DEBUG(1, "DQMHistReference: event called");
127}
128
130{
131 B2DEBUG(1, "DQMHistReference: endRun called");
132}
133
135{
136 B2DEBUG(1, "DQMHistReference: terminate called");
137}
138
void addRefHist(const std::string &dirname, TH1 *hist)
Add reference histogram.
static const std::string & getRunType(void)
Get the list of the reference histograms.
DQMHistAnalysisModule()
Constructor / Destructor.
void initialize() override final
Initializer.
void loadReferenceHistos()
Reads reference histograms from input root file.
void terminate() override final
This method is called at the end of the event processing.
void event() override final
This method is called for each event.
void endRun() override final
This method is called if the current run ends.
void beginRun() override final
Called when entering a new run.
std::string m_referenceFileName
Reference Histogram Root file name.
void addParam(const std::string &name, T &paramVariable, const std::string &description, const T &defaultValue)
Adds a new parameter to the module.
Definition Module.h:559
#define REG_MODULE(moduleName)
Register the given module (without 'Module' suffix) with the framework.
Definition Module.h:649
Abstract base class for different kinds of events.
STL namespace.