12 #include <dqm/analysis/modules/DQMHistAnalysisOutputMonObj.h>
13 #include <framework/dataobjects/EventMetaData.h>
14 #include <framework/datastore/DataStore.h>
15 #include <framework/datastore/StoreObjPtr.h>
38 addParam(
"Filename", m_filename,
"Output root filename (if not set mon_e{exp}r{run}.root is used", std::string(
""));
39 addParam(
"TreeFile", m_treeFile,
"If set, entry to run summary TTree from TreeFile is made", std::string(
""));
40 addParam(
"ProcID", m_procID,
"Processing id (online,proc10, etc.)", std::string(
"online"));
41 addParam(
"run", m_run,
"Run number", 0);
42 addParam(
"exp", m_exp,
"Experiment number", 0);
43 addParam(
"nevt", m_nevt,
"Number of events", 0);
44 addParam(
"runtype", m_runtype,
"Run type", std::string(
""));
46 B2DEBUG(20,
"DQMHistAnalysisOutputMonObj: Constructor done.");
50 DQMHistAnalysisOutputMonObjModule::~DQMHistAnalysisOutputMonObjModule() { }
52 void DQMHistAnalysisOutputMonObjModule::initialize()
54 B2DEBUG(20,
"DQMHistAnalysisOutputMonObj: initialized.");
57 m_metaData->setProcessingID(m_procID);
61 void DQMHistAnalysisOutputMonObjModule::beginRun()
63 B2DEBUG(20,
"DQMHistAnalysisOutputMonObj: beginRun called.");
67 void DQMHistAnalysisOutputMonObjModule::event()
69 B2DEBUG(20,
"DQMHistAnalysisOutputMonObj: event called.");
72 void DQMHistAnalysisOutputMonObjModule::endRun()
74 B2INFO(
"DQMHistAnalysisOutputMonObj: endRun called");
79 TH1* hrun = findHist(
"DQMInfo/runno");
80 TH1* hexp = findHist(
"DQMInfo/expno");
82 int run = hrun ? std::stoi(hrun->GetTitle()) : m_run;
83 int exp = hexp ? std::stoi(hexp->GetTitle()) : m_exp;
85 if (m_filename.length()) fname = m_filename;
86 else fname = TString::Format(
"mon_e%04dr%06d_%s.root", exp, run, m_procID.c_str());
88 TH1* runtype = findHist(
"DQMInfo/rtype");
89 if (runtype) m_metaData->setRunType(std::string(runtype->GetTitle()));
90 else m_metaData->setRunType(m_runtype);
91 TH1* hnevt = findHist(
"DAQ/Nevent");
92 if (hnevt) m_metaData->setNEvents(hnevt->GetEntries());
93 else m_metaData->setNEvents(m_nevt);
95 TFile f(fname,
"NEW");
98 B2WARNING(
"File " <<
LogVar(
"MonitoringObject file",
99 fname) <<
" already exists and it will not be rewritten. If desired please delete file and re-run.");
105 m_metaData->setExperimentRun(exp, run);
106 time_t ts = lastEvtMeta->getTime() / 1e9;
108 timeinfo = localtime(&ts);
109 m_metaData->setRunDate(asctime(timeinfo));
115 for (
const auto& obj : objts)(obj.second)->Write();
119 if (m_treeFile.length() > 0) addTreeEntry();
123 void DQMHistAnalysisOutputMonObjModule::addTreeEntry()
126 TFile* treeFile =
new TFile(m_treeFile.c_str(),
"update");
127 auto* tree = (TTree*)treeFile->Get(
"tree");
129 if (tree == NULL) tree =
new TTree(
"tree",
"tree");
131 int run = m_metaData->getRun();
132 int expe = m_metaData->getExperiment();
133 int nevt = m_metaData->getNEvents();
136 char* rel =
const_cast<char*
>(m_metaData->getRelease().c_str());
137 char* db =
const_cast<char*
>(m_metaData->getDatabaseGlobalTag().c_str());
138 char* datee =
const_cast<char*
>(m_metaData->getRunDate().c_str());
139 char* rtype =
const_cast<char*
>(m_metaData->getRunType().c_str());
140 char* procID =
const_cast<char*
>(m_metaData->getProcessingID().c_str());
142 auto b_run = tree->GetBranch(
"run");
143 auto b_exp = tree->GetBranch(
"exp");
144 auto b_release = tree->GetBranch(
"release");
145 auto b_gt = tree->GetBranch(
"gt");
146 auto b_datetime = tree->GetBranch(
"datetime");
147 auto b_rtype = tree->GetBranch(
"rtype");
148 auto b_procID = tree->GetBranch(
"procID");
149 auto b_nevt = tree->GetBranch(
"nevt");
165 if (!b_run) tree->Branch(
"run", &run,
"run/I");
166 else b_run->SetAddress(&run);
167 if (!b_exp) tree->Branch(
"exp", &expe,
"exp/I");
168 else b_exp->SetAddress(&expe);
169 if (!b_nevt) tree->Branch(
"nevt", &nevt,
"nevt/I");
170 else b_nevt->SetAddress(&nevt);
171 if (!b_release) tree->Branch(
"release", rel,
"release/C");
172 else b_release->SetAddress(rel);
173 if (!b_gt) tree->Branch(
"gt", db,
"gt/C");
174 else b_gt->SetAddress(db);
175 if (!b_datetime) tree->Branch(
"datetime", datee,
"datetime/C");
176 else b_datetime->SetAddress(datee);
177 if (!b_rtype) tree->Branch(
"rtype", rtype,
"rtype/C");
178 else b_rtype->SetAddress(rtype);
179 if (!b_procID) tree->Branch(
"procID", procID,
"procID/C");
180 else b_procID->SetAddress(procID);
185 for (
const auto& obj : objts) {
186 std::map<std::string, float>& vars =
const_cast<std::map<std::string, float>&
>((obj.second)->getVariables());
187 std::map<std::string, float>& upErr =
const_cast<std::map<std::string, float>&
>((obj.second)->getUpError());
188 std::map<std::string, float>& lowErr =
const_cast<std::map<std::string, float>&
>((obj.second)->getLowError());
190 const std::vector<std::pair<std::string, std::string>>& strVars = (obj.second)->getStringVariables();
192 for (
auto& var : vars) {
193 std::string brname = obj.first +
"_" + var.first;
194 auto branch = tree->GetBranch((brname).c_str());
196 branch = tree->Branch((brname).c_str(), &(var.second));
198 }
else branch->SetAddress(&(var.second));
200 auto vvE1 = upErr.find(var.first);
201 auto vvE2 = lowErr.find(var.first);
203 if (vvE1 != upErr.end() && vvE2 == lowErr.end()) {
204 auto errBranch = tree->GetBranch((brname).c_str() + TString(
"_err"));
206 errBranch = tree->Branch((brname).c_str() + TString(
"_err"), &(vvE1->second));
207 fillBranch(errBranch);
208 }
else errBranch->SetAddress(&(vvE1->second));
211 if (vvE1 != upErr.end() && vvE2 != lowErr.end()) {
212 auto errBranch1 = tree->GetBranch((brname).c_str() + TString(
"_upErr"));
214 errBranch1 = tree->Branch((brname).c_str() + TString(
"_upErr"), &(vvE1->second));
215 fillBranch(errBranch1);
216 }
else errBranch1->SetAddress(&(vvE1->second));
218 auto errBranch2 = tree->GetBranch((brname).c_str() + TString(
"_dwErr"));
220 errBranch2 = tree->Branch((brname).c_str() + TString(
"_dwErr"), &(vvE2->second));
221 fillBranch(errBranch2);
222 }
else errBranch2->SetAddress(&(vvE2->second));
227 for (
auto& var : strVars) {
228 std::string brname = obj.first +
"_" + var.first;
229 char* cc =
const_cast<char*
>((var.second).c_str());
230 auto branch = tree->GetBranch((brname).c_str());
232 std::string ty = brname +
"/C";
233 branch = tree->Branch((brname).c_str(), cc, ty.c_str());
235 }
else branch->SetAddress(cc);
240 tree->Write(0, TObject::kWriteDelete, 0);
245 void DQMHistAnalysisOutputMonObjModule::fillBranch(TBranch* branch)
247 TTree* tree = (TTree*)branch->GetTree();
248 int nentr = tree->GetEntries();
249 for (
int i = 0; i < nentr; i++) {
257 void DQMHistAnalysisOutputMonObjModule::terminate()
259 B2INFO(
"DQMHistAnalysisOutputMonObj: terminate called");