00001 #ifndef ERRORSANALYZER_CC
00002 #define ERRORSANALYZER_CC
00003
00004 #include "ErrorsAnalyzer.h"
00005
00006 ErrorsAnalyzer::ErrorsAnalyzer(const edm::ParameterSet& iConfig) :
00007 treeFileName_( iConfig.getParameter<std::string>("InputFileName") ),
00008 resolFitType_( iConfig.getParameter<int>("ResolFitType") ),
00009 maxEvents_( iConfig.getParameter<int>("MaxEvents") ),
00010 outputFileName_( iConfig.getParameter<std::string>("OutputFileName") ),
00011 ptBins_( iConfig.getParameter<int>("PtBins") ),
00012 ptMin_( iConfig.getParameter<double>("PtMin") ),
00013 ptMax_( iConfig.getParameter<double>("PtMax") ),
00014 etaBins_( iConfig.getParameter<int>("EtaBins") ),
00015 etaMin_( iConfig.getParameter<double>("EtaMin") ),
00016 etaMax_( iConfig.getParameter<double>("EtaMax") ),
00017 debug_( iConfig.getParameter<bool>("Debug") )
00018 {
00019 parameters_ = iConfig.getParameter<std::vector<double> >("Parameters");
00020 errors_ = iConfig.getParameter<std::vector<double> >("Errors");
00021 errorFactors_ = iConfig.getParameter<std::vector<int> >("ErrorFactors");
00022
00023 if( (parameters_.size() != errors_.size()) || (parameters_.size() != errorFactors_.size()) ) {
00024 std::cout << "Error: parameters and errors have different number of values" << std::endl;
00025 exit(1);
00026 }
00027
00028 fillValueError();
00029
00030 sigmaPtVsPt_ = new TProfile("sigmaPtVsPtProfile", "sigmaPtVsPt", ptBins_, ptMin_, ptMax_);
00031 sigmaPtVsPtPlusErr_ = new TProfile("sigmaPtVsPtPlusErrProfile", "sigmaPtVsPtPlusErr", ptBins_, ptMin_, ptMax_);
00032 sigmaPtVsPtMinusErr_ = new TProfile("sigmaPtVsPtMinusErrProfile", "sigmaPtVsPtMinusErr", ptBins_, ptMin_, ptMax_);
00033
00034 sigmaPtVsEta_ = new TProfile("sigmaPtVsEtaProfile", "sigmaPtVsEta", etaBins_, etaMin_, etaMax_);
00035 sigmaPtVsEtaPlusErr_ = new TProfile("sigmaPtVsEtaPlusErrProfile", "sigmaPtVsEtaPlusErr", etaBins_, etaMin_, etaMax_);
00036 sigmaPtVsEtaMinusErr_ = new TProfile("sigmaPtVsEtaMinusErrProfile", "sigmaPtVsEtaMinusErr", etaBins_, etaMin_, etaMax_);
00037
00038 sigmaMassVsPt_ = new TProfile("sigmaMassVsPtProfile", "sigmaMassVsPt", ptBins_, ptMin_, ptMax_);
00039 sigmaMassVsPtPlusErr_ = new TProfile("sigmaMassVsPtPlusErrProfile", "sigmaMassVsPtPlusErr", ptBins_, ptMin_, ptMax_);
00040 sigmaMassVsPtMinusErr_ = new TProfile("sigmaMassVsPtMinusErrProfile", "sigmaMassVsPtMinusErr", ptBins_, ptMin_, ptMax_);
00041
00042 sigmaMassVsEta_ = new TProfile("sigmaMassVsEtaProfile", "sigmaMassVsEta", etaBins_, etaMin_, etaMax_);
00043 sigmaMassVsEtaPlusErr_ = new TProfile("sigmaMassVsEtaPlusErrProfile", "sigmaMassVsEtaPlusErr", etaBins_, etaMin_, etaMax_);
00044 sigmaMassVsEtaMinusErr_ = new TProfile("sigmaMassVsEtaMinusErrProfile", "sigmaMassVsEtaMinusErr", etaBins_, etaMin_, etaMax_);
00045 }
00046
00047 void ErrorsAnalyzer::fillValueError()
00048 {
00049 valuePlusError_.resize(parameters_.size());
00050 valueMinusError_.resize(parameters_.size());
00051
00052 std::vector<double>::const_iterator parIt = parameters_.begin();
00053 std::vector<double>::const_iterator errIt = errors_.begin();
00054 std::vector<int>::const_iterator errFactorIt = errorFactors_.begin();
00055 int i=0;
00056 for( ; parIt != parameters_.end(); ++parIt, ++errIt, ++errFactorIt, ++i ) {
00057 valuePlusError_[i] = *parIt + (*errIt)*(*errFactorIt);
00058 valueMinusError_[i] = *parIt - (*errIt)*(*errFactorIt);
00059 }
00060 }
00061
00062 ErrorsAnalyzer::~ErrorsAnalyzer()
00063 {
00064 gROOT->SetStyle("Plain");
00065
00066 fillHistograms();
00067
00068 TFile * outputFile = new TFile(outputFileName_, "RECREATE");
00069
00070 drawHistograms(sigmaPtVsEta_, sigmaPtVsEtaPlusErr_, sigmaPtVsEtaMinusErr_, "sigmaPtVsEta");
00071 drawHistograms(sigmaPtVsPt_, sigmaPtVsPtPlusErr_, sigmaPtVsPtMinusErr_, "sigmaPtVsPt");
00072
00073 drawHistograms(sigmaMassVsEta_, sigmaMassVsEtaPlusErr_, sigmaMassVsEtaMinusErr_, "sigmaMassVsEta");
00074 drawHistograms(sigmaMassVsPt_, sigmaMassVsPtPlusErr_, sigmaMassVsPtMinusErr_, "sigmaMassVsPt");
00075
00076 outputFile->Write();
00077 outputFile->Close();
00078 }
00079
00080 void ErrorsAnalyzer::drawHistograms(const TProfile * histo, const TProfile * histoPlusErr,
00081 const TProfile * histoMinusErr, const TString & type)
00082 {
00083 TH1D * sigmaPtVsEtaTH1D = new TH1D(type, type, histo->GetNbinsX(),
00084 histo->GetXaxis()->GetXmin(), histo->GetXaxis()->GetXmax());
00085 TH1D * sigmaPtVsEtaPlusErrTH1D = new TH1D(type+"PlusErr", type+"PlusErr", histo->GetNbinsX(),
00086 histo->GetXaxis()->GetXmin(), histo->GetXaxis()->GetXmax());
00087 TH1D * sigmaPtVsEtaMinusErrTH1D = new TH1D(type+"MinusErr", type+"MinusErr", histo->GetNbinsX(),
00088 histo->GetXaxis()->GetXmin(), histo->GetXaxis()->GetXmax());
00089
00090 TH1D * sigmaMassVsEtaTH1D = new TH1D(type, type, histo->GetNbinsX(),
00091 histo->GetXaxis()->GetXmin(), histo->GetXaxis()->GetXmax());
00092 TH1D * sigmaMassVsEtaPlusErrTH1D = new TH1D(type+"PlusErr", type+"PlusErr", histo->GetNbinsX(),
00093 histo->GetXaxis()->GetXmin(), histo->GetXaxis()->GetXmax());
00094 TH1D * sigmaMassVsEtaMinusErrTH1D = new TH1D(type+"MinusErr", type+"MinusErr", histo->GetNbinsX(),
00095 histo->GetXaxis()->GetXmin(), histo->GetXaxis()->GetXmax());
00096
00097 TCanvas * canvas = new TCanvas("canvas"+type, "canvas"+type, 1000, 800);
00098 for( int iBin = 1; iBin <= histo->GetNbinsX(); ++iBin ) {
00099 sigmaPtVsEtaTH1D->SetBinContent(iBin, histo->GetBinContent(iBin));
00100 sigmaPtVsEtaPlusErrTH1D->SetBinContent(iBin, histoPlusErr->GetBinContent(iBin));
00101 sigmaPtVsEtaMinusErrTH1D->SetBinContent(iBin, histoMinusErr->GetBinContent(iBin));
00102 }
00103 int numBins = sigmaPtVsEtaTH1D->GetNbinsX();
00104
00105 Double_t * values = sigmaPtVsEtaTH1D->GetArray();
00106 Double_t * valuesPlus = sigmaPtVsEtaPlusErrTH1D->GetArray();
00107 Double_t * valuesMinus = sigmaPtVsEtaMinusErrTH1D->GetArray();
00108 double * posErrors = new double[numBins];
00109 double * negErrors = new double[numBins];
00110
00111 TGraphAsymmErrors * graphAsymmErrors = new TGraphAsymmErrors(sigmaPtVsEtaTH1D);
00112 TGraph * graph = new TGraph(sigmaPtVsEtaTH1D);
00113
00114 for( int i=1; i<=numBins; ++i ) {
00115
00116 posErrors[i-1] = valuesPlus[i] - values[i];
00117 if( valuesMinus[i] < 0 ) negErrors[i-1] = values[i];
00118 else negErrors[i-1] = values[i] - valuesMinus[i];
00119
00120 graphAsymmErrors->SetPointEYlow(i-1, negErrors[i-1]);
00121 graphAsymmErrors->SetPointEYhigh(i-1, posErrors[i-1]);
00122 }
00123
00124 canvas->Draw();
00125
00126 graphAsymmErrors->SetTitle("");
00127 graphAsymmErrors->SetFillColor(kGray);
00128 graphAsymmErrors->Draw("A2");
00129 TString title(type);
00130 if( type == "Eta" ) title = "#eta";
00131 graphAsymmErrors->GetXaxis()->SetTitle(title);
00132 graphAsymmErrors->GetYaxis()->SetTitle("#sigmaPt/Pt");
00133 graph->Draw();
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153 sigmaPtVsEtaPlusErrTH1D->Write();
00154 sigmaPtVsEtaTH1D->Write();
00155 sigmaPtVsEtaMinusErrTH1D->Write();
00156
00157 sigmaPtVsEtaPlusErr_->Write();
00158 sigmaPtVsEta_->Write();
00159 sigmaPtVsEtaMinusErr_->Write();
00160
00161
00162 sigmaMassVsEtaPlusErrTH1D->Write();
00163 sigmaMassVsEtaTH1D->Write();
00164 sigmaMassVsEtaMinusErrTH1D->Write();
00165
00166 sigmaMassVsEtaPlusErr_->Write();
00167 sigmaMassVsEta_->Write();
00168 sigmaMassVsEtaMinusErr_->Write();
00169
00170 canvas->Write();
00171 }
00172
00173
00174 void ErrorsAnalyzer::analyze(const edm::Event& iEvent, const edm::EventSetup& iSetup)
00175 {
00176 }
00177
00178 void ErrorsAnalyzer::fillHistograms()
00179 {
00180 std::cout << "Reading muon pairs from Root Tree in " << treeFileName_ << std::endl;
00181 RootTreeHandler rootTreeHandler;
00182
00183 typedef std::vector<std::pair<lorentzVector,lorentzVector> > MuonPairVector;
00184 MuonPairVector savedPair;
00185 rootTreeHandler.readTree(maxEvents_, treeFileName_, &savedPair, 0);
00186
00187
00188 resolutionFunctionBase<std::vector<double> > * resolutionFunctionForVec = resolutionFunctionVecService( resolFitType_ );
00189 MuScleFitUtils::resolutionFunction = resolutionFunctionService( resolFitType_ );
00190 MuScleFitUtils::debugMassResol_ = false;
00191 MuScleFitUtils::debug = 0;
00192 MuScleFitUtils::resfind = std::vector<int>(6, 0);
00193
00194
00195 unsigned int i = 0;
00196 MuonPairVector::iterator it = savedPair.begin();
00197 std::cout << "Starting loop on " << savedPair.size() << " muons" << std::endl;
00198 for( ; it != savedPair.end(); ++it, ++i ) {
00199 double pt1 = it->first.pt();
00200 double eta1 = it->first.eta();
00201 double pt2 = it->second.pt();
00202 double eta2 = it->second.eta();
00203
00204 if( debug_ ) {
00205 std::cout << "pt1 = " << pt1 << ", eta1 = " << eta1 << ", pt2 = " << pt2 << ", eta2 = " << eta2 << std::endl;
00206 }
00207
00208 if( pt1 == 0 && pt2 == 0 && eta1 == 0 && eta2 == 0 ) continue;
00209
00210 double sigmaPt1 = resolutionFunctionForVec->sigmaPt( pt1,eta1,parameters_ );
00211 double sigmaPt2 = resolutionFunctionForVec->sigmaPt( pt2,eta2,parameters_ );
00212 double sigmaPtPlusErr1 = resolutionFunctionForVec->sigmaPt( pt1,eta1,valuePlusError_ );
00213 double sigmaPtPlusErr2 = resolutionFunctionForVec->sigmaPt( pt2,eta2,valuePlusError_ );
00214 double sigmaPtMinusErr1 = resolutionFunctionForVec->sigmaPt( pt1,eta1,valueMinusError_ );
00215 double sigmaPtMinusErr2 = resolutionFunctionForVec->sigmaPt( pt2,eta2,valueMinusError_ );
00216
00217 double sigmaMass = MuScleFitUtils::massResolution( it->first, it->second, parameters_ );
00218 double sigmaMassPlusErr = MuScleFitUtils::massResolution( it->first, it->second, valuePlusError_ );
00219 double sigmaMassMinusErr = MuScleFitUtils::massResolution( it->first, it->second, valueMinusError_ );
00220
00221 if( debug_ ) {
00222 std::cout << "sigmaPt1 = " << sigmaPt1 << " + " << sigmaPtPlusErr1 << " - " << sigmaPtMinusErr1 << std::endl;
00223 std::cout << "sigmaPt2 = " << sigmaPt2 << " + " << sigmaPtPlusErr2 << " - " << sigmaPtMinusErr2 << std::endl;
00224 std::cout << "sigmaMass = " << sigmaMass << " + " << sigmaMassPlusErr << " - " << sigmaMassMinusErr << std::endl;
00225 }
00226
00227
00228 if( pt1 != pt1 ) continue;
00229 if( pt2 != pt2 ) continue;
00230 if( eta1 != eta1 ) continue;
00231 if( eta2 != eta2 ) continue;
00232 if( sigmaPt1 != sigmaPt1 ) continue;
00233 if( sigmaPt2 != sigmaPt2 ) continue;
00234 if( sigmaPtPlusErr1 != sigmaPtPlusErr1 ) continue;
00235 if( sigmaPtPlusErr2 != sigmaPtPlusErr2 ) continue;
00236 if( sigmaPtMinusErr1 != sigmaPtMinusErr1 ) continue;
00237 if( sigmaPtMinusErr2 != sigmaPtMinusErr2 ) continue;
00238 if( sigmaMass != sigmaMass ) continue;
00239 if( sigmaMassPlusErr != sigmaMassPlusErr ) continue;
00240 if( sigmaMassMinusErr != sigmaMassMinusErr ) continue;
00241
00242 std::cout << "Muon pair number " << i << std::endl;
00243
00244
00245
00246
00247
00248 sigmaPtVsPt_->Fill(pt1, sigmaPt1);
00249 sigmaPtVsPt_->Fill(pt2, sigmaPt2);
00250 sigmaPtVsPtPlusErr_->Fill(pt1, sigmaPtPlusErr1);
00251 sigmaPtVsPtPlusErr_->Fill(pt2, sigmaPtPlusErr2);
00252 sigmaPtVsPtMinusErr_->Fill(pt1, sigmaPtMinusErr1);
00253 sigmaPtVsPtMinusErr_->Fill(pt2, sigmaPtMinusErr2);
00254
00255 sigmaPtVsEta_->Fill(eta1, sigmaPt1);
00256 sigmaPtVsEta_->Fill(eta2, sigmaPt2);
00257 sigmaPtVsEtaPlusErr_->Fill(eta1, sigmaPtPlusErr1);
00258 sigmaPtVsEtaPlusErr_->Fill(eta2, sigmaPtPlusErr2);
00259 sigmaPtVsEtaMinusErr_->Fill(eta1, sigmaPtMinusErr1);
00260 sigmaPtVsEtaMinusErr_->Fill(eta2, sigmaPtMinusErr2);
00261
00262
00263 sigmaMassVsPt_->Fill(pt1, sigmaMass);
00264 sigmaMassVsPt_->Fill(pt2, sigmaMass);
00265 sigmaMassVsPtPlusErr_->Fill(pt1, sigmaMassPlusErr);
00266 sigmaMassVsPtPlusErr_->Fill(pt2, sigmaMassPlusErr);
00267 sigmaMassVsPtMinusErr_->Fill(pt1, sigmaMassMinusErr);
00268 sigmaMassVsPtMinusErr_->Fill(pt2, sigmaMassMinusErr);
00269
00270 sigmaMassVsEta_->Fill(eta1, sigmaMass);
00271 sigmaMassVsEta_->Fill(eta2, sigmaMass);
00272 sigmaMassVsEtaPlusErr_->Fill(eta1, sigmaMassPlusErr);
00273 sigmaMassVsEtaPlusErr_->Fill(eta2, sigmaMassPlusErr);
00274 sigmaMassVsEtaMinusErr_->Fill(eta1, sigmaMassMinusErr);
00275 sigmaMassVsEtaMinusErr_->Fill(eta2, sigmaMassMinusErr);
00276 }
00277 }
00278
00279
00280 DEFINE_FWK_MODULE(ErrorsAnalyzer);
00281
00282 #endif