#include #include #include #include #include #include using ROOT::RDF::RNode; template struct My2DObservablestruct { T values; ROOT::VecOps::RVec categories; }; template My2DObservablestruct Build2DObservable(const T& values, const ROOT::VecOps::RVec &categories) { return My2DObservablestruct{values, categories}; }; template void fillscalar(TH2D &h, const My2DObservablestruct &c) { for (auto cat : c.categories) { h.Fill(c.values,1.); } }; // vector fill template void fillvector(TH2D &h, const My2DObservablestruct &c) { for (auto value : c.values) { for (auto cat : c.categories) { h.Fill(value, cat,1.); } } }; auto add_2Dhistos = [] (TH2D h1, TH2D h2) { h1.Add(&h2); return h1;}; int main(int argc, char **argv) { ROOT::RDataFrame df("tree2","testtree2.root"); //this doesn't work //vecint is vec -> categories //vecfloat - x1 //float x2 //aggregate is fill(x,categories) // ROOT::RDF::TH2DModel *m1 = new ROOT::RDF::TH2DModel("m1","m1",10,-5,5,10,-5,5); ROOT::RDF::TH2DModel *m2 = new ROOT::RDF::TH2DModel("m2","m2",10,-5,5,10,-5,5); std::vector models; models.push_back(m1); models.push_back(m2); std::vector variables; variables.push_back("float"); //x2 variables.push_back("vecfloat"); //x1 std::vector> final2Dhistos; float a=5; auto df2 = df.Define("var_a", [a](){return a;}); auto h1 = df2.Histo1D("var_a"); auto latestDF = std::make_unique(df2); //latestDF = std::make_unique(latestDF->Define("r42",[](){return 42;})); for (int i=0; i final2Dhisto; std::cout <GetColumnType(variables[i])<GetColumnType(variables[i])=="Float_t") { std::cout <<"Define v0 - float"<(latestDF->Define(newname,Build2DObservable,{variables[0],"vecint"}))->Aggregate(fillscalar,add_2Dhistos,newname,*(m1->GetHistogram())); } else if (latestDF->GetColumnType(variables[i])=="ROOT::VecOps::RVec") { std::cout <<"Define v1 - vector"<(latestDF->Define(newname,Build2DObservable>,{variables[1],"vecint"}))->Aggregate(fillvector>,add_2Dhistos,newname,*(m2->GetHistogram())); } if (final2Dhisto) final2Dhistos.push_back(final2Dhisto); } TFile *fout = TFile::Open("output.root","RECREATE"); h1->Write(); int index =0; for (auto histo : final2Dhistos) { histo->Write(); for (int i=1; iGetNbinsY(); i++) { std::string name="proj_"; name+=std::to_string(index); name+="_"; name+=std::to_string(i); TH1D *h = (TH1D*) histo->ProjectionX(name.c_str(),i,i,"e"); h->Write(); } index++; } fout->Close(); ROOT::RDF::SaveGraph(df,"graph1.dot"); return 0; };