std::string generateCodeFromStreamers(std::string url, std::string treeLocation, std::vector<std::string> &classNames, std::string &errorMessage) { TFile *tfile = TFile::Open(url.c_str()); if (tfile == nullptr || !tfile->IsOpen()) { errorMessage = std::string("File not found: ") + url; return std::string(); } if (tfile->IsZombie()) { errorMessage = std::string("Not a ROOT file: ") + url; return std::string(); } TTreeReader reader(treeLocation.c_str(), tfile); if (reader.IsZombie()) { errorMessage = std::string("Not a TTree: ") + treeLocation.c_str() + std::string(" in file: ") + url; return std::string(); } TTree *ttree = reader.GetTree(); std::set<std::string> includes; std::vector<ClassStructure> classes; TIter listOfBranches = ttree->GetListOfBranches(); for (TBranch *tbranch = (TBranch*)listOfBranches.Next(); tbranch != nullptr; tbranch = (TBranch*)listOfBranches.Next()) { TClass *tclass = TClass::GetClass(tbranch->GetClassName()); if (tclass != nullptr && tbranch->GetListOfBranches()->GetEntries() > 0) classesFromBranch(tbranch, tclass, classes, 0, includes); } for (int i = 0; i < classes.size(); i++) classNames.push_back(classes[i].fullName); tfile->Close(); std::string out; for (std::set<std::string>::iterator iter = includes.begin(); iter != includes.end(); ++iter) out += *iter + "\n"; out += "\n"; for (std::vector<ClassStructure>::iterator iter = classes.begin(); iter != classes.end(); ++iter) { int i = 0; for (; i < iter->splitName.size() - 1; i++) out += std::string(i * 2, ' ') + "namespace " + iter->splitName[i] + " {\n"; out += std::string(i * 2, ' ') + "class " + iter->splitName.back() + ";\n"; i--; for (; i >= 0; i--) out += std::string(i * 2, ' ') + "}\n"; } out += "\n"; for (std::vector<ClassStructure>::iterator iter = classes.begin(); iter != classes.end(); ++iter) { int i = 0; for (; i < iter->splitName.size() - 1; i++) out += std::string(i * 2, ' ') + "namespace " + iter->splitName[i] + " {\n"; out += iter->cpp(i * 2) + "\n"; i--; for (; i >= 0; i--) out += std::string(i * 2, ' ') + "}\n"; } for (std::vector<ClassStructure>::iterator iter = classes.begin(); iter != classes.end(); ++iter) { int i = 0; for (; i < iter->splitName.size() - 1; i++) out += std::string(i * 2, ' ') + "namespace " + iter->splitName[i] + " {\n"; out += std::string(i * 2, ' ') + "ClassImp(" + iter->splitName.back() + ")\n"; i--; for (; i >= 0; i--) out += std::string(i * 2, ' ') + "}\n"; } return out; }