#include "TROOT.h" #include "TSystem.h" #include #include #include #include "TTree.h" #include "TString.h" #include "TClonesArray.h" #include int merge() { std::string firstfilename= "pp_2j_LO_H_T_35GeV.root"; std::string filename2= "pp_4j_LO_H_T_2_35GeV.root"; std::string output_filename= "pp_2j_LO_w_4j_as_friend.root"; std::string output_filename2= "friend.root"; std::string treename="LHEF"; std::unique_ptr first{TFile::Open(firstfilename.c_str())}; TTree * first_tree= (TTree*)first->Get(treename.c_str()); TFile* output_file= TFile::Open( output_filename.c_str(), "RECREATE" ); TTree *output_tree = first_tree->CloneTree(0); std::unique_ptr second{TFile::Open(filename2.c_str())} ; TTree *second_tree = (TTree*)second->Get(treename.c_str()); TFile* output_file2= TFile::Open( output_filename2.c_str(), "RECREATE" ); TTree *output_friend = second_tree->CloneTree(0); auto nentries = first_tree->GetEntriesFast(); for(Long64_t e = 0; e < nentries; e++) { first_tree->GetEntry(e); output_tree->Fill(); second_tree->GetEntry(e); output_friend->Fill(); } output_tree->AddFriend(output_friend); output_file->Write(); // first->Close(); // second->Close(); // output_file->Close(); // output_file2->Close(); auto append_func_call=[](ROOT::VecOps::RVec inputArray1,ROOT::VecOps::RVec inputArray2){ const auto size = inputArray2.size(); for (size_t i = 0; i < size; i++) inputArray1.emplace_back(inputArray2[i]); return inputArray1;}; auto append_func_call_int=[](ROOT::VecOps::RVec inputArray1,ROOT::VecOps::RVec inputArray2){ const auto size = inputArray2.size(); for (size_t i = 0; i < size; i++) inputArray1.emplace_back(inputArray2[i]); return inputArray1;}; auto append_func_call_uint=[](ROOT::VecOps::RVec inputArray1,ROOT::VecOps::RVec inputArray2){ const auto size = inputArray2.size(); for (size_t i = 0; i < size; i++) inputArray1.emplace_back(inputArray2[i]); return inputArray1;}; auto append_func_call_long=[](ROOT::VecOps::RVec inputArray1,ROOT::VecOps::RVec inputArray2){ const auto size = inputArray2.size(); for (size_t i = 0; i < size; i++) inputArray1.emplace_back(inputArray2[i]); return inputArray1;}; auto add_func_call_uint=[](ROOT::VecOps::RVec inputArray1,ROOT::VecOps::RVec inputArray2){ auto Array3 = inputArray1+inputArray2; return Array3;}; auto add_func_call_int=[](ROOT::VecOps::RVec inputArray1,ROOT::VecOps::RVec inputArray2){ auto Array3 = inputArray1+inputArray2; return Array3;}; auto add_func_call_fBit=[](ROOT::VecOps::RVec inputArray1,ROOT::VecOps::RVec inputArray2){ auto Array3 = (ROOT::VecOps::RVec) inputArray1+(ROOT::VecOps::RVec) inputArray2; return Array3;}; auto df = ROOT::RDataFrame("LHEF", "pp_2j_LO_w_4j_as_friend.root"); auto df2=df.Redefine("Particle.fUniqueID",append_func_call_uint,{"Particle.fUniqueID","LHEF.Particle.fUniqueID"}) .Redefine("Particle.fBits",append_func_call_uint,{"Particle.fBits","LHEF.Particle.fBits"}) .Redefine("Particle.PID",append_func_call_int,{"Particle.PID","LHEF.Particle.PID"}) .Redefine("Particle.Status",append_func_call_int,{"Particle.Status","LHEF.Particle.Status"}) .Redefine("Particle.Mother1",append_func_call_int,{"Particle.Mother1","LHEF.Particle.Mother1"}) .Redefine("Particle.Mother2",append_func_call_int,{"Particle.Mother2","LHEF.Particle.Mother2"}) .Redefine("Particle.ColorLine1",append_func_call_int,{"Particle.ColorLine1","LHEF.Particle.ColorLine1"}) .Redefine("Particle.ColorLine2",append_func_call_int,{"Particle.ColorLine2","LHEF.Particle.ColorLine2"}) .Redefine("Particle.Px",append_func_call,{"Particle.Px","LHEF.Particle.Px"}) .Redefine("Particle.Py",append_func_call,{"Particle.Py","LHEF.Particle.Py"}) .Redefine("Particle.Pz",append_func_call,{"Particle.Pz","LHEF.Particle.Pz"}) .Redefine("Particle.E",append_func_call,{"Particle.E","LHEF.Particle.E"}) .Redefine("Particle.M",append_func_call,{"Particle.M","LHEF.Particle.M"}) .Redefine("Particle.PT",append_func_call,{"Particle.PT","LHEF.Particle.PT"}) .Redefine("Particle.Eta",append_func_call,{"Particle.Eta","LHEF.Particle.Eta"}) .Redefine("Particle.Phi",append_func_call,{"Particle.Phi","LHEF.Particle.Phi"}) .Redefine("Particle.Rapidity",append_func_call,{"Particle.Rapidity","LHEF.Particle.Rapidity"}) .Redefine("Particle.LifeTime",append_func_call,{"Particle.LifeTime","LHEF.Particle.LifeTime"}) .Redefine("Particle.Spin",append_func_call,{"Particle.Spin","LHEF.Particle.Spin"}) .Redefine("Particle_size",append_func_call_int,{"Particle_size","LHEF.Particle_size"}) .Redefine("Event.fUniqueID",append_func_call_uint,{"Event.fUniqueID","LHEF.Event.fUniqueID"}) .Redefine("Event.Nparticles",add_func_call_int,{"Event.Nparticles","LHEF.Event.Nparticles"}) .Redefine("Event.ProcessID",append_func_call_int,{"Event.fBits","LHEF.Event.fBits"}) .Redefine("Event.Weight",append_func_call,{"Event.Weight","LHEF.Event.Weight"}) .Redefine("Event.ScalePDF",append_func_call,{"Event.ScalePDF","LHEF.Event.ScalePDF"}) .Redefine("Event.CouplingQED",append_func_call,{"Event.CouplingQED","LHEF.Event.CouplingQED"}) .Redefine("Event.CouplingQCD",append_func_call,{"Event.CouplingQCD","LHEF.Event.CouplingQCD"}) .Redefine("Event_size","Event_size+LHEF.Event_size") .Redefine("Rwgt.fUniqueID",append_func_call_uint,{"Rwgt.fUniqueID","LHEF.Rwgt.fUniqueID"}) .Redefine("Rwgt.fBits",append_func_call_uint,{"Rwgt.fBits","LHEF.Rwgt.fBits"}) .Redefine("Rwgt.Weight",append_func_call,{"Rwgt.Weight","LHEF.Rwgt.Weight"}) .Redefine("Rwgt_size",add_func_call_int,{"Rwgt_size","LHEF.Rwgt_size"}); // .Redefine("Event.fBits",add_func_call_fBit,{"Event.fBits","LHEF.Event.fBits"}) ; // .Redefine("Event.Number",append_func_call_long,{"Event.Number","LHEF.Event.Number"}) auto defColNames = df2.GetColumnNames(); // Print columns' names for (auto &&defColName : defColNames) std::cout << defColName << std::endl; // auto d=df2.Describe();//formado de columnas amigo -> "LHEF.Event.Nparticles" // d.Print(); auto d2=df2.Display("Particle.Px"); d2->Print(); df2.Snapshot("LHEF", "merged_snapshot.root");// ; return 0; }