71 B2INFO(
"DQMHistAnalysisOutputMonObj: endRun called");
76 TH1* hrun =
findHist(
"DQMInfo/runno");
77 TH1* hexp =
findHist(
"DQMInfo/expno");
79 int run = hrun ? std::stoi(hrun->GetTitle()) :
m_run;
80 int exp = hexp ? std::stoi(hexp->GetTitle()) :
m_exp;
83 else fname = TString::Format(
"mon_e%04dr%06d_%s.root", exp, run,
m_procID.c_str());
85 TH1* runtype =
findHist(
"DQMInfo/rtype");
86 if (runtype)
m_metaData->setRunType(std::string(runtype->GetTitle()));
89 if (hnevt)
m_metaData->setNEvents(hnevt->GetEntries());
92 TFile* f =
new TFile(fname,
"NEW");
95 B2WARNING(
"File " <<
LogVar(
"MonitoringObject file",
96 fname) <<
" already exists additional data will be appended! previous metadata is kept.");
97 f =
new TFile(fname,
"UPDATE");
104 time_t ts = lastEvtMeta->getTime() / 1e9;
106 timeinfo = localtime(&ts);
108 m_metaData->setRunDate(asctime_r(timeinfo, buf));
115 for (
const auto& obj : objts) {
117 if (exist) f->Delete(obj.second.GetName() + TString(
";*"));
129 TFile* treeFile =
new TFile(
m_treeFile.c_str(),
"update");
130 auto* tree = (TTree*)treeFile->Get(
"tree");
132 if (tree == NULL) tree =
new TTree(
"tree",
"tree");
139 char* rel =
const_cast<char*
>(
m_metaData->getRelease().c_str());
140 char* db =
const_cast<char*
>(
m_metaData->getDatabaseGlobalTag().c_str());
141 char* date =
const_cast<char*
>(
m_metaData->getRunDate().c_str());
142 char* rtype =
const_cast<char*
>(
m_metaData->getRunType().c_str());
143 char* procID =
const_cast<char*
>(
m_metaData->getProcessingID().c_str());
145 auto b_run = tree->GetBranch(
"run");
146 auto b_exp = tree->GetBranch(
"exp");
147 auto b_release = tree->GetBranch(
"release");
148 auto b_gt = tree->GetBranch(
"gt");
149 auto b_datetime = tree->GetBranch(
"datetime");
150 auto b_rtype = tree->GetBranch(
"rtype");
151 auto b_procID = tree->GetBranch(
"procID");
152 auto b_nevt = tree->GetBranch(
"nevt");
168 if (!b_run) tree->Branch(
"run", &run,
"run/I");
169 else b_run->SetAddress(&run);
170 if (!b_exp) tree->Branch(
"exp", &expe,
"exp/I");
171 else b_exp->SetAddress(&expe);
172 if (!b_nevt) tree->Branch(
"nevt", &nevt,
"nevt/I");
173 else b_nevt->SetAddress(&nevt);
174 if (!b_release) tree->Branch(
"release", rel,
"release/C");
175 else b_release->SetAddress(rel);
176 if (!b_gt) tree->Branch(
"gt", db,
"gt/C");
177 else b_gt->SetAddress(db);
178 if (!b_datetime) tree->Branch(
"datetime", date,
"datetime/C");
179 else b_datetime->SetAddress(date);
180 if (!b_rtype) tree->Branch(
"rtype", rtype,
"rtype/C");
181 else b_rtype->SetAddress(rtype);
182 if (!b_procID) tree->Branch(
"procID", procID,
"procID/C");
183 else b_procID->SetAddress(procID);
188 for (
auto& obj : objts) {
189 auto& vars =
const_cast<std::map<std::string, float>&
>(obj.second.getVariables());
190 auto& upErr =
const_cast<std::map<std::string, float>&
>(obj.second.getUpError());
191 auto& lowErr =
const_cast<std::map<std::string, float>&
>(obj.second.getLowError());
192 auto& strVars = obj.second.getStringVariables();
194 for (
auto& var : vars) {
195 std::string brname = obj.first +
"_" + var.first;
196 auto branch = tree->GetBranch((brname).c_str());
198 branch = tree->Branch((brname).c_str(), &(var.second));
200 }
else branch->SetAddress(&(var.second));
202 auto vvE1 = upErr.find(var.first);
203 auto vvE2 = lowErr.find(var.first);
205 if (vvE1 != upErr.end() && vvE2 == lowErr.end()) {
206 auto errBranch = tree->GetBranch((brname).c_str() + TString(
"_err"));
208 errBranch = tree->Branch((brname).c_str() + TString(
"_err"), &(vvE1->second));
210 }
else errBranch->SetAddress(&(vvE1->second));
213 if (vvE1 != upErr.end() && vvE2 != lowErr.end()) {
214 auto errBranch1 = tree->GetBranch((brname).c_str() + TString(
"_upErr"));
216 errBranch1 = tree->Branch((brname).c_str() + TString(
"_upErr"), &(vvE1->second));
218 }
else errBranch1->SetAddress(&(vvE1->second));
220 auto errBranch2 = tree->GetBranch((brname).c_str() + TString(
"_dwErr"));
222 errBranch2 = tree->Branch((brname).c_str() + TString(
"_dwErr"), &(vvE2->second));
224 }
else errBranch2->SetAddress(&(vvE2->second));
229 for (
auto& var : strVars) {
230 std::string brname = obj.first +
"_" + var.first;
231 char* cc =
const_cast<char*
>((var.second).c_str());
232 auto branch = tree->GetBranch((brname).c_str());
234 std::string ty = brname +
"/C";
235 branch = tree->Branch((brname).c_str(), cc, ty.c_str());
237 }
else branch->SetAddress(cc);
242 tree->Write(0, TObject::kWriteDelete, 0);