Go to the documentation of this file.00001 #include <iostream>
00002
00003 #include <TFile.h>
00004 #include <TTree.h>
00005
00006 #include <MuonAnalysis/MomentumScaleCalibration/interface/MuonPair.h>
00007 #include <MuonAnalysis/MomentumScaleCalibration/interface/GenMuonPair.h>
00008 #include <MuonAnalysis/MomentumScaleCalibration/interface/MuScleFitProvenance.h>
00009 #include <TH1F.h>
00010 #include <stdlib.h>
00011
00012 typedef std::vector<std::pair<lorentzVector,lorentzVector> > MuonPairVector;
00013
00022 class RootTreeHandler
00023 {
00024 public:
00025
00026
00027 void writeTree( const TString & fileName, const std::vector<MuonPair> * savedPair, const int muonType = 0,
00028 const std::vector<GenMuonPair> * genPair = 0, const bool saveAll = false )
00029 {
00030 lorentzVector emptyLorentzVector(0,0,0,0);
00031 TFile * f1 = new TFile(fileName, "RECREATE");
00032 TTree * tree = new TTree("T", "Muon pairs");
00033 MuonPair * muonPair = new MuonPair;
00034 GenMuonPair * genMuonPair = new GenMuonPair;
00035
00036 tree->Branch("event", "MuonPair", &muonPair);
00037 if( genPair != 0 ) {
00038 tree->Branch("genEvent", "GenMuonPair", &genMuonPair);
00039
00040
00041 if( savedPair->size() != genPair->size() ) {
00042 std::cout << "Error: savedPair size ("
00043 << savedPair->size() <<") and genPair size ("
00044 << genPair->size() <<") are different. This is severe and I will not write the tree." << std::endl;
00045 exit(1);
00046 }
00047 }
00048
00049 std::vector<MuonPair>::const_iterator muonPairIt = savedPair->begin();
00050 unsigned int iev = 0;
00051 for( ; muonPairIt != savedPair->end(); ++muonPairIt, ++iev ) {
00052
00053 if( saveAll || ( (muonPairIt->mu1 != emptyLorentzVector) && (muonPairIt->mu2 != emptyLorentzVector) ) ) {
00054
00055 muonPair->copy(*muonPairIt);
00056
00057
00058
00059
00060
00061
00062 if( genPair != 0 ) {
00063 genMuonPair->copy((*genPair)[iev]);
00064 }
00065
00066 tree->Fill();
00067 }
00068
00069
00070 }
00071
00072
00073 TH1F muonTypeHisto("MuonType", "MuonType", 40, -20, 20);
00074 muonTypeHisto.Fill(muonType);
00075 muonTypeHisto.Write();
00076 MuScleFitProvenance provenance(muonType);
00077 provenance.Write();
00078
00079 f1->Write();
00080 f1->Close();
00081 }
00082
00083 void readTree( const int maxEvents, const TString & fileName, MuonPairVector * savedPair,
00084 const int muonType, MuonPairVector * genPair = 0 )
00085 {
00086 TFile * file = new TFile(fileName, "READ");
00087 if( file->IsOpen() ) {
00088 TTree * tree = (TTree*)file->Get("T");
00089 MuonPair * muonPair = 0;
00090 GenMuonPair * genMuonPair = 0;
00091
00092 tree->SetBranchAddress("event",&muonPair);
00093 if( genPair != 0 ) {
00094 tree->SetBranchAddress("genEvent",&genMuonPair);
00095 }
00096
00097 Long64_t nentries = tree->GetEntries();
00098 if( (maxEvents != -1) && (nentries > maxEvents) ) nentries = maxEvents;
00099 for( Long64_t i=0; i<nentries; ++i ) {
00100 tree->GetEntry(i);
00101 savedPair->push_back(std::make_pair(muonPair->mu1, muonPair->mu2));
00102
00103 if( genPair != 0 ) {
00104 genPair->push_back(std::make_pair(genMuonPair->mu1, genMuonPair->mu2));
00105
00106 }
00107 }
00108 }
00109 else {
00110 std::cout << "ERROR: no file " << fileName << " found. Please, correct the file name or specify an empty field in the InputRootTreeFileName parameter to read events from the edm source." << std::endl;
00111 exit(1);
00112 }
00113 file->Close();
00114 }
00115
00117 void readTree( const int maxEvents, const TString & fileName, std::vector<MuonPair> * savedPair,
00118 const int muonType, std::vector<GenMuonPair> * genPair = 0 )
00119 {
00120 TFile * file = new TFile(fileName, "READ");
00121 if( file->IsOpen() ) {
00122 TTree * tree = (TTree*)file->Get("T");
00123 MuonPair * muonPair = 0;
00124 GenMuonPair * genMuonPair = 0;
00125 tree->SetBranchAddress("event",&muonPair);
00126 if( genPair != 0 ) {
00127 tree->SetBranchAddress("genEvent",&genMuonPair);
00128 }
00129
00130 Long64_t nentries = tree->GetEntries();
00131 if( (maxEvents != -1) && (nentries > maxEvents) ) nentries = maxEvents;
00132 for( Long64_t i=0; i<nentries; ++i ) {
00133 tree->GetEntry(i);
00134 savedPair->push_back(*muonPair);
00135 if( genPair != 0 ) {
00136 genPair->push_back(*genMuonPair);
00137 }
00138 }
00139 }
00140 else {
00141 std::cout << "ERROR: no file " << fileName << " found. Please, correct the file name or specify an empty field in the InputRootTreeFileName parameter to read events from the edm source." << std::endl;
00142 exit(1);
00143 }
00144 file->Close();
00145 }
00146
00147 };