void Generate() { TFile * f = TFile::Open( "test.root", "recreate" ); TTree * t_reco = new TTree( "reco", "reco"); TTree * t_truth = new TTree( "truth", "truth"); int eventNumber = 0; float pt_truth, pt_reco; float eff_truth = 0.9, eff_reco = 0.5, eff_truth_fill = 0.95, eff_reco_fill = 0.7; int passed_reco = 0, passed_truth = 0; t_reco->Branch( "eventNumber", &eventNumber ); t_reco->Branch( "pt", &pt_reco ); t_reco->Branch( "passed", &passed_reco ); t_truth->Branch( "eventNumber", &eventNumber ); t_truth->Branch( "pt", &pt_truth ); t_truth->Branch( "passed", &passed_truth ); for( eventNumber = 0; eventNumber < 1000000; ++eventNumber ) { pt_truth = gRandom->Exp( 200 ); pt_reco = gRandom->Gaus( pt_truth, pt_truth / 10); if( gRandom->Uniform( 0, 1 ) < eff_truth_fill ) { passed_truth = gRandom->Uniform( 0, 1 ) < eff_truth; t_truth->Fill(); } if( gRandom->Uniform( 0, 1 ) < eff_reco_fill ) { passed_reco = gRandom->Uniform( 0, 1 ) < eff_reco; t_reco->Fill(); } } cout << "end loop\n"; f->Write(); f->Close(); // delete t_reco; // delete t_truth; delete f; } void ReadTree() { TFile * f = TFile::Open( "test.root" ); TTree * t_reco = (TTree *) f->Get( "reco" ); TTree * t_truth = (TTree *) f->Get( "truth" ); // t_reco->AddFriend( t_truth ); t_reco->BuildIndex( "eventNumber" ); t_truth->BuildIndex( "eventNumber" ); t_reco->AddFriend( t_truth ); TH2D * h_pt = new TH2D( "pt_tree", "pt", 10, 0, 400, 10, 0, 400 ); gStyle->SetPalette( 1 ); TCanvas * c = new TCanvas(); t_reco->Project( "pt_tree", "pt:truth.pt","passed && truth.passed" ); h_pt->Draw( "colz text" ); c->Print( "c_tree.png" ); delete c; f->Close(); delete f; } void ReadChain() { TChain * t_reco = new TChain( "reco", "reco" ); TChain * t_truth = new TChain( "truth", "truth" ); t_reco->Add( "test.root" ); t_truth->Add( "test.root" ); t_reco->BuildIndex( "eventNumber" ); t_truth->BuildIndex( "eventNumber" ); t_reco->AddFriend( t_truth ); TH2D * h_pt = new TH2D( "pt_chain", "pt", 10, 0, 400, 10, 0, 400 ); gStyle->SetPalette( 1 ); TCanvas * c = new TCanvas(); t_reco->Project( "pt_chain", "pt:truth.pt", "passed && truth.passed" ); h_pt->Draw( "colz text" ); c->Print( "c_chain.png" ); delete c; delete t_reco; delete t_truth; }