File indexing completed on 2024-04-06 12:22:37
0001 #include <iostream>
0002
0003 #include <TFile.h>
0004 #include <TTree.h>
0005
0006 #include <MuonAnalysis/MomentumScaleCalibration/interface/MuonPair.h>
0007 #include <MuonAnalysis/MomentumScaleCalibration/interface/GenMuonPair.h>
0008 #include <MuonAnalysis/MomentumScaleCalibration/interface/MuScleFitProvenance.h>
0009 #include <TH1F.h>
0010 #include <cstdlib>
0011 #include <vector>
0012
0013 typedef std::vector<std::pair<lorentzVector, lorentzVector> > MuonPairVector;
0014 typedef std::vector<std::pair<MuScleFitMuon, MuScleFitMuon> > MuonPairExtendedVector;
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024 class RootTreeHandler {
0025 public:
0026
0027
0028 void writeTree(const TString& fileName,
0029 const std::vector<MuonPair>* savedPair,
0030 const int muonType = 0,
0031 const std::vector<GenMuonPair>* genPair = nullptr,
0032 const bool saveAll = false) {
0033 lorentzVector emptyLorentzVector(0, 0, 0, 0);
0034 TFile* f1 = new TFile(fileName, "RECREATE");
0035 TTree* tree = new TTree("T", "Muon pairs");
0036 MuonPair* muonPair = new MuonPair;
0037 GenMuonPair* genMuonPair = new GenMuonPair;
0038
0039 tree->Branch("event", "MuonPair", &muonPair);
0040 if (genPair != nullptr) {
0041 tree->Branch("genEvent", "GenMuonPair", &genMuonPair);
0042
0043
0044 if (savedPair->size() != genPair->size()) {
0045 std::cout << "Error: savedPair size (" << savedPair->size() << ") and genPair size (" << genPair->size()
0046 << ") are different. This is severe and I will not write the tree." << std::endl;
0047 exit(1);
0048 }
0049 }
0050 std::cout << "savedPair->size() is " << savedPair->size() << std::endl;
0051 std::vector<MuonPair>::const_iterator muonPairIt = savedPair->begin();
0052 unsigned int iev = 0;
0053 for (; muonPairIt != savedPair->end(); ++muonPairIt, ++iev) {
0054 if (saveAll || ((muonPairIt->mu1.p4() != emptyLorentzVector) && (muonPairIt->mu2.p4() != emptyLorentzVector))) {
0055
0056 muonPair->copy(*muonPairIt);
0057
0058
0059
0060
0061
0062
0063 if (genPair != nullptr) {
0064 genMuonPair->copy((*genPair)[iev]);
0065 }
0066
0067 tree->Fill();
0068 }
0069
0070
0071 }
0072
0073
0074 TH1F muonTypeHisto("MuonType", "MuonType", 40, -20, 20);
0075 muonTypeHisto.Fill(muonType);
0076 muonTypeHisto.Write();
0077 MuScleFitProvenance provenance(muonType);
0078 provenance.Write();
0079
0080 f1->Write();
0081 f1->Close();
0082 }
0083
0084
0085
0086 void readTree(const int maxEvents,
0087 const TString& fileName,
0088 MuonPairVector* savedPair,
0089 const int muonType,
0090 std::vector<std::pair<unsigned int, unsigned long long> >* evtRun,
0091 MuonPairVector* genPair = nullptr) {
0092 TFile* file = TFile::Open(fileName, "READ");
0093 if (file->IsOpen()) {
0094 TTree* tree = (TTree*)file->Get("T");
0095 MuonPair* muonPair = nullptr;
0096 GenMuonPair* genMuonPair = nullptr;
0097
0098 tree->SetBranchAddress("event", &muonPair);
0099 if (genPair != nullptr) {
0100 tree->SetBranchAddress("genEvent", &genMuonPair);
0101 }
0102
0103 Long64_t nentries = tree->GetEntries();
0104 if ((maxEvents != -1) && (nentries > maxEvents))
0105 nentries = maxEvents;
0106 for (Long64_t i = 0; i < nentries; ++i) {
0107 tree->GetEntry(i);
0108
0109 savedPair->push_back(std::make_pair(muonPair->mu1.p4(), muonPair->mu2.p4()));
0110 evtRun->push_back(std::make_pair(muonPair->event.event(), muonPair->event.run()));
0111
0112 if (genPair != nullptr) {
0113 genPair->push_back(std::make_pair(genMuonPair->mu1.p4(), genMuonPair->mu2.p4()));
0114
0115
0116 }
0117 }
0118 } else {
0119 std::cout << "ERROR: no file " << fileName
0120 << " found. Please, correct the file name or specify an empty field in the InputRootTreeFileName "
0121 "parameter to read events from the edm source."
0122 << std::endl;
0123 exit(1);
0124 }
0125 file->Close();
0126 }
0127
0128 void readTree(const int maxEvents,
0129 const TString& fileName,
0130 MuonPairExtendedVector* savedPair,
0131 const int muonType,
0132 std::vector<std::pair<unsigned int, unsigned long long> >* evtRun,
0133 MuonPairExtendedVector* genPair = nullptr) {
0134 TFile* file = TFile::Open(fileName, "READ");
0135 if (file->IsOpen()) {
0136 TTree* tree = (TTree*)file->Get("T");
0137 MuonPair* muonPair = nullptr;
0138 GenMuonPair* genMuonPair = nullptr;
0139 tree->SetBranchAddress("event", &muonPair);
0140 if (genPair != nullptr) {
0141 tree->SetBranchAddress("genEvent", &genMuonPair);
0142 }
0143 Long64_t nentries = tree->GetEntries();
0144 if ((maxEvents != -1) && (nentries > maxEvents))
0145 nentries = maxEvents;
0146 for (Long64_t i = 0; i < nentries; ++i) {
0147 tree->GetEntry(i);
0148
0149 savedPair->push_back(std::make_pair(muonPair->mu1, muonPair->mu2));
0150 evtRun->push_back(std::make_pair(muonPair->event.event(), muonPair->event.run()));
0151
0152 if (genPair != nullptr) {
0153 genPair->push_back(std::make_pair(genMuonPair->mu1, genMuonPair->mu2));
0154
0155
0156 }
0157 }
0158 } else {
0159 std::cout << "ERROR: no file " << fileName
0160 << " found. Please, correct the file name or specify an empty field in the InputRootTreeFileName "
0161 "parameter to read events from the edm source."
0162 << std::endl;
0163 exit(1);
0164 }
0165 file->Close();
0166 }
0167
0168
0169 void readTree(const int maxEvents,
0170 const TString& fileName,
0171 std::vector<MuonPair>* savedPair,
0172 const int muonType,
0173 std::vector<GenMuonPair>* genPair = nullptr) {
0174 TFile* file = TFile::Open(fileName, "READ");
0175 if (file->IsOpen()) {
0176 TTree* tree = (TTree*)file->Get("T");
0177 MuonPair* muonPair = nullptr;
0178 GenMuonPair* genMuonPair = nullptr;
0179 tree->SetBranchAddress("event", &muonPair);
0180 if (genPair != nullptr) {
0181 tree->SetBranchAddress("genEvent", &genMuonPair);
0182 }
0183
0184 Long64_t nentries = tree->GetEntries();
0185 if ((maxEvents != -1) && (nentries > maxEvents))
0186 nentries = maxEvents;
0187 for (Long64_t i = 0; i < nentries; ++i) {
0188 tree->GetEntry(i);
0189 savedPair->push_back(*muonPair);
0190 if (genPair != nullptr) {
0191 genPair->push_back(*genMuonPair);
0192 }
0193 }
0194 } else {
0195 std::cout << "ERROR: no file " << fileName
0196 << " found. Please, correct the file name or specify an empty field in the InputRootTreeFileName "
0197 "parameter to read events from the edm source."
0198 << std::endl;
0199 exit(1);
0200 }
0201 file->Close();
0202 }
0203 };