// dedicated to convert DABC files to ROOT files // for instance, hierarchy stored in binary file, can be converted to ROOT histograms #include #include #include "dabc/version.h" #include "dabc/Buffer.h" #include "dabc/Hierarchy.h" #include "dabc/BinaryFileIO.h" #include "dabc/Iterator.h" #include "TFile.h" #include "TH1.h" #include "TH2.h" #include "TObjArray.h" #include "TAxis.h" void SetAxisLabels(TAxis *ax, std::string lbls, int nbins) { if (lbls.empty() || !ax) return; TObjArray *lst = TString(lbls.c_str()).Tokenize(","); if (lst && (lst->GetSize() > 0)) for (int n=0;nSetBinLabel(n+1, (n < lst->GetSize()) ? lst->At(n)->GetName() : Form("bin%d",n)); delete lst; } int main(int argc, char* argv[]) { printf("dabc_root utility, v %s\n", DABC_RELEASE); const char *inpfile = nullptr, *outfile = nullptr; bool skipzero = false; for (int n=1;n1) dirname.Append("/"); dirname.Append(prnt->GetName()); } if (lastdir!=dirname) { if ((lastdir.Length() > 0) && (currcnt == 0) && skipzero) { if ((gDirectory->GetList()->GetSize() == 0) && (gDirectory->GetListOfKeys()->GetSize() == 0)) { printf("Deleting empty directory %s\n", lastdir.Data()); f->rmdir(lastdir.Data()); } } if (!f->GetDirectory(dirname.Data())) f->mkdir(dirname.Data()); f->cd(dirname.Data()); currcnt = 0; } lastdir = dirname; if (item.Field("_kind").AsStr() == "ROOT.TH1D") { int nbins = item.Field("nbins").AsInt(); double* bins = item.GetFieldPtr("bins")->GetDoubleArr(); if (skipzero) { bool isany = false; for (int n=0;nGetXaxis(), item.Field("xlabels").AsStr(), nbins); for (int n=0;nSetBinContent(n,bins[3+n]); hist->ResetStats(); // recalculate statistic hist->Write(); cnt++; currcnt++; } else if ((item.Field("_kind").AsStr() == "ROOT.TH2D") || (item.Field("_kind").AsStr() == "ROOT.TH2Poly")) { int nbins1 = item.Field("nbins1").AsInt(); int nbins2 = item.Field("nbins2").AsInt(); double* bins = item.GetFieldPtr("bins")->GetDoubleArr(); if (skipzero) { bool isany = false; for (int n=0;n<(nbins1+2)*(nbins2+2);n++) { if (bins[6+n] != 0.) { isany = true; break; } } if (!isany) { emptycnt++; continue; } } TH2D* hist = new TH2D(item.GetName(), item.Field("_title").AsStr().c_str(), nbins1, item.Field("left1").AsDouble(), item.Field("right1").AsDouble(), nbins2, item.Field("left2").AsDouble(), item.Field("right2").AsDouble()); if (item.HasField("xlabels")) SetAxisLabels(hist->GetXaxis(), item.Field("xlabels").AsStr(), nbins1); if (item.HasField("ylabels")) SetAxisLabels(hist->GetYaxis(), item.Field("ylabels").AsStr(), nbins2); for (int n=0;n<(nbins1+2)*(nbins2+2);n++) hist->SetBinContent(n,bins[6+n]); hist->ResetStats(); // recalculate statistic hist->Write(); cnt++; currcnt++; } } printf("TOTAL %d histograms converted, skipped %d, storing file %s ...\n", cnt, emptycnt, outfile); delete f; printf("File %s stored\n", outfile); return 0; }