File indexing completed on 2024-04-06 12:31:24
0001
0002 #include <memory>
0003 #include <string>
0004
0005
0006 #include "FWCore/Framework/interface/Frameworkfwd.h"
0007 #include "FWCore/Framework/interface/one/EDAnalyzer.h"
0008
0009 #include "FWCore/Framework/interface/Event.h"
0010 #include "FWCore/Framework/interface/MakerMacros.h"
0011
0012 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0013
0014 #include "CommonTools/UtilAlgos/interface/TFileService.h"
0015 #include "FWCore/ServiceRegistry/interface/Service.h"
0016
0017 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0018
0019 #include "AnalysisDataFormats/TopObjects/interface/TtGenEvent.h"
0020
0021 #include "DataFormats/PatCandidates/interface/Muon.h"
0022 #include "DataFormats/PatCandidates/interface/Jet.h"
0023 #include "DataFormats/PatCandidates/interface/MET.h"
0024 #include "DataFormats/PatCandidates/interface/Tau.h"
0025 #include "DataFormats/PatCandidates/interface/Electron.h"
0026
0027 #include "TDirectory.h"
0028 #include "TH1F.h"
0029 #include "TF1.h"
0030 #include "TTree.h"
0031
0032 #include <Math/VectorUtil.h>
0033
0034
0035
0036
0037
0038 class ResolutionCreator : public edm::one::EDAnalyzer<edm::one::SharedResources> {
0039 public:
0040 explicit ResolutionCreator(const edm::ParameterSet &);
0041
0042 private:
0043 void beginJob() override;
0044 void analyze(const edm::Event &, const edm::EventSetup &) override;
0045 void endJob() override;
0046
0047
0048 edm::EDGetTokenT<TtGenEvent> genEvtToken_;
0049 std::string objectType_, labelName_;
0050 edm::EDGetTokenT<std::vector<pat::Electron> > electronsToken_;
0051 edm::EDGetTokenT<std::vector<pat::Muon> > muonsToken_;
0052 edm::EDGetTokenT<std::vector<pat::Jet> > jetsToken_;
0053 edm::EDGetTokenT<std::vector<pat::MET> > metsToken_;
0054 edm::EDGetTokenT<std::vector<pat::Tau> > tausToken_;
0055 std::vector<double> etabinVals_, pTbinVals_;
0056 double minDR_;
0057 int matchingAlgo_;
0058 bool useMaxDist_;
0059 bool useDeltaR_;
0060 double maxDist_;
0061 int ptnrbins, etanrbins;
0062 int nrFilled;
0063
0064
0065 TF1 *fResPtEtaBin[10][20][20];
0066 TF1 *fResEtaBin[10][20];
0067 TH1F *hResPtEtaBin[10][20][20];
0068 TH1F *hResEtaBin[10][20];
0069 TTree *tResVar;
0070 };
0071
0072
0073
0074
0075 ResolutionCreator::ResolutionCreator(const edm::ParameterSet &iConfig) {
0076 usesResource("TFileService");
0077
0078
0079 genEvtToken_ = consumes<TtGenEvent>(edm::InputTag("genEvt"));
0080 objectType_ = iConfig.getParameter<std::string>("object");
0081 labelName_ = iConfig.getParameter<std::string>("label");
0082 if (objectType_ == "electron")
0083 electronsToken_ = consumes<std::vector<pat::Electron> >(edm::InputTag(labelName_));
0084 else if (objectType_ == "muon")
0085 muonsToken_ = consumes<std::vector<pat::Muon> >(edm::InputTag(labelName_));
0086 else if (objectType_ == "lJets" || objectType_ == "bJets")
0087 jetsToken_ = consumes<std::vector<pat::Jet> >(edm::InputTag(labelName_));
0088 else if (objectType_ == "met")
0089 metsToken_ = consumes<std::vector<pat::MET> >(edm::InputTag(labelName_));
0090 else if (objectType_ == "tau")
0091 tausToken_ = consumes<std::vector<pat::Tau> >(edm::InputTag(labelName_));
0092 if (objectType_ != "met") {
0093 etabinVals_ = iConfig.getParameter<std::vector<double> >("etabinValues");
0094 }
0095 pTbinVals_ = iConfig.getParameter<std::vector<double> >("pTbinValues");
0096 minDR_ = iConfig.getParameter<double>("minMatchingDR");
0097
0098 nrFilled = 0;
0099 }
0100
0101
0102
0103
0104
0105
0106 void ResolutionCreator::analyze(const edm::Event &iEvent, const edm::EventSetup &iSetup) {
0107
0108 std::vector<reco::Particle *> p4gen, p4rec;
0109
0110 edm::Handle<TtGenEvent> genEvt;
0111 iEvent.getByToken(genEvtToken_, genEvt);
0112
0113 if (genEvt->particles().size() < 10)
0114 return;
0115
0116 if (objectType_ == "electron") {
0117 edm::Handle<std::vector<pat::Electron> >
0118 electrons;
0119 iEvent.getByToken(electronsToken_, electrons);
0120 for (size_t e = 0; e < electrons->size(); e++) {
0121 for (size_t p = 0; p < genEvt->particles().size(); p++) {
0122 if ((std::abs(genEvt->particles()[p].pdgId()) == 11) &&
0123 (ROOT::Math::VectorUtil::DeltaR(genEvt->particles()[p].p4(), (*electrons)[e].p4()) < minDR_)) {
0124
0125
0126 }
0127 }
0128 }
0129 } else if (objectType_ == "muon") {
0130 edm::Handle<std::vector<pat::Muon> > muons;
0131 iEvent.getByToken(muonsToken_, muons);
0132 for (size_t m = 0; m < muons->size(); m++) {
0133 for (size_t p = 0; p < genEvt->particles().size(); p++) {
0134 if ((std::abs(genEvt->particles()[p].pdgId()) == 13) &&
0135 (ROOT::Math::VectorUtil::DeltaR(genEvt->particles()[p].p4(), (*muons)[m].p4()) < minDR_)) {
0136
0137
0138 }
0139 }
0140 }
0141 } else if (objectType_ == "lJets") {
0142 edm::Handle<std::vector<pat::Jet> > jets;
0143 iEvent.getByToken(jetsToken_, jets);
0144 if (jets->size() >= 4) {
0145 for (unsigned int j = 0; j < 4; j++) {
0146 for (size_t p = 0; p < genEvt->particles().size(); p++) {
0147 if ((std::abs(genEvt->particles()[p].pdgId()) < 5) &&
0148 (ROOT::Math::VectorUtil::DeltaR(genEvt->particles()[p].p4(), (*jets)[j].p4()) < minDR_)) {
0149
0150
0151 }
0152 }
0153 }
0154 }
0155 } else if (objectType_ == "bJets") {
0156 edm::Handle<std::vector<pat::Jet> > jets;
0157 iEvent.getByToken(jetsToken_, jets);
0158 if (jets->size() >= 4) {
0159 for (unsigned int j = 0; j < 4; j++) {
0160 for (size_t p = 0; p < genEvt->particles().size(); p++) {
0161 if ((std::abs(genEvt->particles()[p].pdgId()) == 5) &&
0162 (ROOT::Math::VectorUtil::DeltaR(genEvt->particles()[p].p4(), (*jets)[j].p4()) < minDR_)) {
0163
0164
0165 }
0166 }
0167 }
0168 }
0169 } else if (objectType_ == "met") {
0170 edm::Handle<std::vector<pat::MET> > mets;
0171 iEvent.getByToken(metsToken_, mets);
0172 if (!mets->empty()) {
0173 if (genEvt->isSemiLeptonic() && genEvt->singleNeutrino() != nullptr &&
0174 ROOT::Math::VectorUtil::DeltaR(genEvt->singleNeutrino()->p4(), (*mets)[0].p4()) < minDR_) {
0175
0176
0177 }
0178 }
0179 } else if (objectType_ == "tau") {
0180 edm::Handle<std::vector<pat::Tau> > taus;
0181 iEvent.getByToken(tausToken_, taus);
0182 for (std::vector<pat::Tau>::const_iterator tau = taus->begin(); tau != taus->end(); ++tau) {
0183
0184 reco::GenParticle genLepton = *(tau->genLepton());
0185 if (std::abs(genLepton.pdgId()) == 15 && genLepton.status() == 2 && genLepton.numberOfMothers() > 0 &&
0186 std::abs(genLepton.mother(0)->pdgId()) == 15 && genLepton.mother(0)->numberOfMothers() > 0 &&
0187 std::abs(genLepton.mother(0)->mother(0)->pdgId()) == 24 &&
0188 ROOT::Math::VectorUtil::DeltaR(genLepton.p4(), tau->p4()) < minDR_) {
0189 }
0190
0191
0192 }
0193 }
0194
0195 for (unsigned m = 0; m < p4gen.size(); m++) {
0196 double Egen = p4gen[m]->energy();
0197 double Thetagen = p4gen[m]->theta();
0198 double Phigen = p4gen[m]->phi();
0199 double Etgen = p4gen[m]->et();
0200 double Etagen = p4gen[m]->eta();
0201 double Ecal = p4rec[m]->energy();
0202 double Thetacal = p4rec[m]->theta();
0203 double Phical = p4rec[m]->phi();
0204 double Etcal = p4rec[m]->et();
0205 double Etacal = p4rec[m]->eta();
0206 double phidiff = Phical - Phigen;
0207 if (phidiff > 3.14159)
0208 phidiff = 2. * 3.14159 - phidiff;
0209 if (phidiff < -3.14159)
0210 phidiff = -phidiff - 2. * 3.14159;
0211
0212
0213 int etabin = 0;
0214 if (etanrbins > 1) {
0215 for (unsigned int b = 0; b < etabinVals_.size() - 1; b++) {
0216 if (fabs(Etacal) > etabinVals_[b])
0217 etabin = b;
0218 }
0219 }
0220
0221 int ptbin = 0;
0222 for (unsigned int b = 0; b < pTbinVals_.size() - 1; b++) {
0223 if (p4rec[m]->pt() > pTbinVals_[b])
0224 ptbin = b;
0225 }
0226
0227
0228
0229
0230
0231
0232
0233
0234
0235
0236
0237
0238 ROOT::Math::SVector<double, 3> pcalvec(p4rec[m]->px(), p4rec[m]->py(), p4rec[m]->pz());
0239 ROOT::Math::SVector<double, 3> pgenvec(p4gen[m]->px(), p4gen[m]->py(), p4gen[m]->pz());
0240
0241 ROOT::Math::SVector<double, 3> u_z(0, 0, 1);
0242 ROOT::Math::SVector<double, 3> u_1 = ROOT::Math::Unit(pcalvec);
0243 ROOT::Math::SVector<double, 3> u_3 = ROOT::Math::Cross(u_z, u_1) / ROOT::Math::Mag(ROOT::Math::Cross(u_z, u_1));
0244 ROOT::Math::SVector<double, 3> u_2 = ROOT::Math::Cross(u_1, u_3) / ROOT::Math::Mag(ROOT::Math::Cross(u_1, u_3));
0245 double acal = 1.;
0246 double bcal = 0.;
0247 double ccal = 0.;
0248 double dcal = 1.;
0249 double agen = ROOT::Math::Dot(pgenvec, u_1) / ROOT::Math::Mag(pcalvec);
0250 double bgen = ROOT::Math::Dot(pgenvec, u_2);
0251 double cgen = ROOT::Math::Dot(pgenvec, u_3);
0252 double dgen = Egen / Ecal;
0253
0254
0255 ++nrFilled;
0256 hResPtEtaBin[0][etabin][ptbin]->Fill(acal - agen);
0257 hResPtEtaBin[1][etabin][ptbin]->Fill(bcal - bgen);
0258 hResPtEtaBin[2][etabin][ptbin]->Fill(ccal - cgen);
0259 hResPtEtaBin[3][etabin][ptbin]->Fill(dcal - dgen);
0260 hResPtEtaBin[4][etabin][ptbin]->Fill(Thetacal - Thetagen);
0261 hResPtEtaBin[5][etabin][ptbin]->Fill(phidiff);
0262 hResPtEtaBin[6][etabin][ptbin]->Fill(Etcal - Etgen);
0263 hResPtEtaBin[7][etabin][ptbin]->Fill(Etacal - Etagen);
0264
0265 delete p4gen[m];
0266 delete p4rec[m];
0267 }
0268 }
0269
0270
0271 void ResolutionCreator::beginJob() {
0272 edm::Service<TFileService> fs;
0273 if (!fs)
0274 throw edm::Exception(edm::errors::Configuration, "TFileService missing from configuration!");
0275
0276
0277 TString resObsName[8] = {"_ares", "_bres", "_cres", "_dres", "_thres", "_phres", "_etres", "_etares"};
0278 int resObsNrBins = 120;
0279 if ((objectType_ == "muon") || (objectType_ == "electron"))
0280 resObsNrBins = 80;
0281 std::vector<double> resObsMin, resObsMax;
0282 if (objectType_ == "electron") {
0283 resObsMin.push_back(-0.15);
0284 resObsMin.push_back(-0.2);
0285 resObsMin.push_back(-0.1);
0286 resObsMin.push_back(-0.15);
0287 resObsMin.push_back(-0.0012);
0288 resObsMin.push_back(-0.009);
0289 resObsMin.push_back(-16);
0290 resObsMin.push_back(-0.0012);
0291 resObsMax.push_back(0.15);
0292 resObsMax.push_back(0.2);
0293 resObsMax.push_back(0.1);
0294 resObsMax.push_back(0.15);
0295 resObsMax.push_back(0.0012);
0296 resObsMax.push_back(0.009);
0297 resObsMax.push_back(16);
0298 resObsMax.push_back(0.0012);
0299 } else if (objectType_ == "muon") {
0300 resObsMin.push_back(-0.15);
0301 resObsMin.push_back(-0.1);
0302 resObsMin.push_back(-0.05);
0303 resObsMin.push_back(-0.15);
0304 resObsMin.push_back(-0.004);
0305 resObsMin.push_back(-0.003);
0306 resObsMin.push_back(-8);
0307 resObsMin.push_back(-0.004);
0308 resObsMax.push_back(0.15);
0309 resObsMax.push_back(0.1);
0310 resObsMax.push_back(0.05);
0311 resObsMax.push_back(0.15);
0312 resObsMax.push_back(0.004);
0313 resObsMax.push_back(0.003);
0314 resObsMax.push_back(8);
0315 resObsMax.push_back(0.004);
0316 } else if (objectType_ == "tau") {
0317 resObsMin.push_back(-1.);
0318 resObsMin.push_back(-10.);
0319 resObsMin.push_back(-10);
0320 resObsMin.push_back(-1.);
0321 resObsMin.push_back(-0.1);
0322 resObsMin.push_back(-0.1);
0323 resObsMin.push_back(-80);
0324 resObsMin.push_back(-0.1);
0325 resObsMax.push_back(1.);
0326 resObsMax.push_back(10.);
0327 resObsMax.push_back(10);
0328 resObsMax.push_back(1.);
0329 resObsMax.push_back(0.1);
0330 resObsMax.push_back(0.1);
0331 resObsMax.push_back(50);
0332 resObsMax.push_back(0.1);
0333 } else if (objectType_ == "lJets" || objectType_ == "bJets") {
0334 resObsMin.push_back(-1.);
0335 resObsMin.push_back(-10.);
0336 resObsMin.push_back(-10.);
0337 resObsMin.push_back(-1.);
0338 resObsMin.push_back(-0.4);
0339 resObsMin.push_back(-0.6);
0340 resObsMin.push_back(-80);
0341 resObsMin.push_back(-0.6);
0342 resObsMax.push_back(1.);
0343 resObsMax.push_back(10.);
0344 resObsMax.push_back(10.);
0345 resObsMax.push_back(1.);
0346 resObsMax.push_back(0.4);
0347 resObsMax.push_back(0.6);
0348 resObsMax.push_back(80);
0349 resObsMax.push_back(0.6);
0350 } else {
0351 resObsMin.push_back(-2.);
0352 resObsMin.push_back(-150.);
0353 resObsMin.push_back(-150.);
0354 resObsMin.push_back(-2.);
0355 resObsMin.push_back(-6);
0356 resObsMin.push_back(-6);
0357 resObsMin.push_back(-180);
0358 resObsMin.push_back(-6);
0359 resObsMax.push_back(3.);
0360 resObsMax.push_back(150.);
0361 resObsMax.push_back(150.);
0362 resObsMax.push_back(3.);
0363 resObsMax.push_back(6);
0364 resObsMax.push_back(6);
0365 resObsMax.push_back(180);
0366 resObsMax.push_back(6);
0367 }
0368
0369 const char *resObsVsPtFit[8] = {"[0]+[1]*exp(-[2]*x)",
0370 "[0]+[1]*exp(-[2]*x)",
0371 "[0]+[1]*exp(-[2]*x)",
0372 "[0]+[1]*exp(-[2]*x)",
0373 "[0]+[1]*exp(-[2]*x)",
0374 "[0]+[1]*exp(-[2]*x)",
0375 "pol1",
0376 "[0]+[1]*exp(-[2]*x)"};
0377
0378 ptnrbins = pTbinVals_.size() - 1;
0379 double *ptbins = new double[pTbinVals_.size()];
0380 for (unsigned int b = 0; b < pTbinVals_.size(); b++)
0381 ptbins[b] = pTbinVals_[b];
0382 double *etabins;
0383 if (objectType_ != "met") {
0384 etanrbins = etabinVals_.size() - 1;
0385 etabins = new double[etabinVals_.size()];
0386 for (unsigned int b = 0; b < etabinVals_.size(); b++)
0387 etabins[b] = etabinVals_[b];
0388 } else {
0389 etanrbins = 1;
0390 etabins = new double[2];
0391 etabins[0] = 0;
0392 etabins[1] = 5.;
0393 }
0394
0395
0396 for (Int_t ro = 0; ro < 8; ro++) {
0397 for (Int_t etab = 0; etab < etanrbins; etab++) {
0398 for (Int_t ptb = 0; ptb < ptnrbins; ptb++) {
0399 TString obsName = objectType_;
0400 obsName += resObsName[ro];
0401 obsName += "_etabin";
0402 obsName += etab;
0403 obsName += "_ptbin";
0404 obsName += ptb;
0405 hResPtEtaBin[ro][etab][ptb] = fs->make<TH1F>(obsName, obsName, resObsNrBins, resObsMin[ro], resObsMax[ro]);
0406 fResPtEtaBin[ro][etab][ptb] = fs->make<TF1>("F_" + obsName, "gaus");
0407 }
0408 TString obsName2 = objectType_;
0409 obsName2 += resObsName[ro];
0410 obsName2 += "_etabin";
0411 obsName2 += etab;
0412 hResEtaBin[ro][etab] = fs->make<TH1F>(obsName2, obsName2, ptnrbins, ptbins);
0413 fResEtaBin[ro][etab] =
0414 fs->make<TF1>("F_" + obsName2, resObsVsPtFit[ro], pTbinVals_[0], pTbinVals_[pTbinVals_.size() - 1]);
0415 }
0416 }
0417 tResVar = fs->make<TTree>("tResVar", "Resolution tree");
0418
0419 delete[] etabins;
0420 delete[] ptbins;
0421 }
0422
0423
0424 void ResolutionCreator::endJob() {
0425 TString resObsName2[8] = {"a", "b", "c", "d", "theta", "phi", "et", "eta"};
0426 Int_t ro = 0;
0427 Double_t pt = 0.;
0428 Double_t eta = 0.;
0429 Double_t value, error;
0430
0431 tResVar->Branch("Pt", &pt, "Pt/D");
0432 tResVar->Branch("Eta", &eta, "Eta/D");
0433 tResVar->Branch("ro", &ro, "ro/I");
0434 tResVar->Branch("value", &value, "value/D");
0435 tResVar->Branch("error", &error, "error/D");
0436
0437 for (ro = 0; ro < 8; ro++) {
0438 for (int etab = 0; etab < etanrbins; etab++) {
0439
0440 eta = etanrbins > 1 ? (etabinVals_[etab] + etabinVals_[etab + 1]) / 2. : 2.5;
0441 for (int ptb = 0; ptb < ptnrbins; ptb++) {
0442
0443 pt = (pTbinVals_[ptb] + pTbinVals_[ptb + 1]) / 2.;
0444 double maxcontent = 0.;
0445 int maxbin = 0;
0446 for (int nb = 1; nb < hResPtEtaBin[ro][etab][ptb]->GetNbinsX(); nb++) {
0447 if (hResPtEtaBin[ro][etab][ptb]->GetBinContent(nb) > maxcontent) {
0448 maxcontent = hResPtEtaBin[ro][etab][ptb]->GetBinContent(nb);
0449 maxbin = nb;
0450 }
0451 }
0452 int range = (int)(hResPtEtaBin[ro][etab][ptb]->GetNbinsX() / 6);
0453 fResPtEtaBin[ro][etab][ptb]->SetRange(hResPtEtaBin[ro][etab][ptb]->GetBinCenter(maxbin - range),
0454 hResPtEtaBin[ro][etab][ptb]->GetBinCenter(maxbin + range));
0455 fResPtEtaBin[ro][etab][ptb]->SetParameters(hResPtEtaBin[ro][etab][ptb]->GetMaximum(),
0456 hResPtEtaBin[ro][etab][ptb]->GetMean(),
0457 hResPtEtaBin[ro][etab][ptb]->GetRMS());
0458 hResPtEtaBin[ro][etab][ptb]->Fit(fResPtEtaBin[ro][etab][ptb]->GetName(), "RQ SERIAL");
0459 hResEtaBin[ro][etab]->SetBinContent(ptb + 1, fResPtEtaBin[ro][etab][ptb]->GetParameter(2));
0460 hResEtaBin[ro][etab]->SetBinError(ptb + 1, fResPtEtaBin[ro][etab][ptb]->GetParError(2));
0461
0462 value = fResPtEtaBin[ro][etab][ptb]->GetParameter(2);
0463 error = fResPtEtaBin[ro][etab][ptb]->GetParError(2);
0464 tResVar->Fill();
0465 }
0466
0467
0468 pt = 0.;
0469 value = ((pTbinVals_[0] + pTbinVals_[1]) / 2.) *
0470 (fResPtEtaBin[ro][etab][0]->GetParameter(2) - fResPtEtaBin[ro][etab][1]->GetParameter(2)) /
0471 ((pTbinVals_[2] - pTbinVals_[0]) / 2.) +
0472 fResPtEtaBin[ro][etab][0]->GetParameter(2);
0473 error = fResPtEtaBin[ro][etab][0]->GetParError(2) + fResPtEtaBin[ro][etab][1]->GetParError(2);
0474 tResVar->Fill();
0475
0476 hResEtaBin[ro][etab]->Fit(fResEtaBin[ro][etab]->GetName(), "RQ SERIAL");
0477 }
0478 }
0479 if (objectType_ == "lJets" && nrFilled == 0)
0480 edm::LogProblem("SummaryError") << "No plots filled for light jets \n";
0481 if (objectType_ == "bJets" && nrFilled == 0)
0482 edm::LogProblem("SummaryError") << "No plots filled for bjets \n";
0483 if (objectType_ == "muon" && nrFilled == 0)
0484 edm::LogProblem("SummaryError") << "No plots filled for muons \n";
0485 if (objectType_ == "electron" && nrFilled == 0)
0486 edm::LogProblem("SummaryError") << "No plots filled for electrons \n";
0487 if (objectType_ == "tau" && nrFilled == 0)
0488 edm::LogProblem("SummaryError") << "No plots filled for taus \n";
0489 if (objectType_ == "met" && nrFilled == 0)
0490 edm::LogProblem("SummaryError") << "No plots filled for met \n";
0491
0492 edm::LogVerbatim("MainResults") << " \n\n";
0493 edm::LogVerbatim("MainResults") << " ----------------------------------------------";
0494 edm::LogVerbatim("MainResults") << " ----------------------------------------------";
0495 edm::LogVerbatim("MainResults") << " Resolutions on " << objectType_ << " with nrfilled: " << nrFilled;
0496 edm::LogVerbatim("MainResults") << " ----------------------------------------------";
0497 edm::LogVerbatim("MainResults") << " ----------------------------------------------";
0498 if (nrFilled != 0 && objectType_ != "met") {
0499 for (ro = 0; ro < 8; ro++) {
0500 edm::LogVerbatim("MainResults") << "-------------------- ";
0501 edm::LogVerbatim("MainResults") << "\n Resolutions on " << resObsName2[ro] << "\n";
0502 edm::LogVerbatim("MainResults") << "-------------------- ";
0503 for (int etab = 0; etab < etanrbins; etab++) {
0504 if (nrFilled != 0 && ro != 6) {
0505 if (etab == 0) {
0506 edm::LogVerbatim("MainResults")
0507 << "if(fabs(eta)<" << etabinVals_[etab + 1] << ") res = " << fResEtaBin[ro][etab]->GetParameter(0)
0508 << "+" << fResEtaBin[ro][etab]->GetParameter(1) << "*exp(-(" << fResEtaBin[ro][etab]->GetParameter(2)
0509 << "*pt));";
0510 } else {
0511 edm::LogVerbatim("MainResults")
0512 << "else if(fabs(eta)<" << etabinVals_[etab + 1] << ") res = " << fResEtaBin[ro][etab]->GetParameter(0)
0513 << "+" << fResEtaBin[ro][etab]->GetParameter(1) << "*exp(-(" << fResEtaBin[ro][etab]->GetParameter(2)
0514 << "*pt));";
0515 }
0516 } else if (nrFilled != 0 && ro == 6) {
0517 if (etab == 0) {
0518 edm::LogVerbatim("MainResults")
0519 << "if(fabs(eta)<" << etabinVals_[etab + 1] << ") res = " << fResEtaBin[ro][etab]->GetParameter(0)
0520 << "+" << fResEtaBin[ro][etab]->GetParameter(1) << "*pt;";
0521 } else {
0522 edm::LogVerbatim("MainResults")
0523 << "else if(fabs(eta)<" << etabinVals_[etab + 1] << ") res = " << fResEtaBin[ro][etab]->GetParameter(0)
0524 << "+" << fResEtaBin[ro][etab]->GetParameter(1) << "*pt;";
0525 }
0526 }
0527 }
0528 }
0529 } else if (nrFilled != 0 && objectType_ == "met") {
0530 for (ro = 0; ro < 8; ro++) {
0531 edm::LogVerbatim("MainResults") << "-------------------- ";
0532 edm::LogVerbatim("MainResults") << "\n Resolutions on " << resObsName2[ro] << "\n";
0533 edm::LogVerbatim("MainResults") << "-------------------- ";
0534 if (nrFilled != 0 && ro != 6) {
0535 edm::LogVerbatim("MainResults") << "res = " << fResEtaBin[ro][0]->GetParameter(0) << "+"
0536 << fResEtaBin[ro][0]->GetParameter(1) << "*exp(-("
0537 << fResEtaBin[ro][0]->GetParameter(2) << "*pt));";
0538 } else if (nrFilled != 0 && ro == 6) {
0539 edm::LogVerbatim("MainResults") << "res = " << fResEtaBin[ro][0]->GetParameter(0) << "+"
0540 << fResEtaBin[ro][0]->GetParameter(1) << "*pt;";
0541 }
0542 }
0543 }
0544 }
0545
0546
0547 DEFINE_FWK_MODULE(ResolutionCreator);