00001
00002
00003
00004
00005
00006 #include "CondFormats/JetMETObjects/interface/FactorizedJetCorrector.h"
00007 #include "CondFormats/JetMETObjects/interface/SimpleJetCorrector.h"
00008 #include "CondFormats/JetMETObjects/interface/JetCorrectorParameters.h"
00009 #include "CondFormats/JetMETObjects/src/Utilities.cc"
00010 #include "Math/PtEtaPhiE4D.h"
00011 #include "Math/Vector3D.h"
00012 #include "Math/LorentzVector.h"
00013 #include <vector>
00014 #include <string>
00015 #include <sstream>
00016
00017
00018
00019
00020 FactorizedJetCorrector::FactorizedJetCorrector()
00021 {
00022 mJetEta = -9999;
00023 mJetPt = -9999;
00024 mJetPhi = -9999;
00025 mJetE = -9999;
00026 mJetEMF = -9999;
00027 mJetA = -9999;
00028 mRho = -9999;
00029 mLepPx = -9999;
00030 mLepPy = -9999;
00031 mLepPz = -9999;
00032 mNPV = -9999;
00033 mAddLepToJet = false;
00034 mIsNPVset = false;
00035 mIsJetEset = false;
00036 mIsJetPtset = false;
00037 mIsJetPhiset = false;
00038 mIsJetEtaset = false;
00039 mIsJetEMFset = false;
00040 mIsJetAset = false;
00041 mIsRhoset = false;
00042 mIsLepPxset = false;
00043 mIsLepPyset = false;
00044 mIsLepPzset = false;
00045 mIsAddLepToJetset = false;
00046 }
00047
00048
00049
00050 FactorizedJetCorrector::FactorizedJetCorrector(const std::string& fLevels, const std::string& fFiles, const std::string& fOptions)
00051 {
00052 mJetEta = -9999;
00053 mJetPt = -9999;
00054 mJetPhi = -9999;
00055 mJetE = -9999;
00056 mJetEMF = -9999;
00057 mJetA = -9999;
00058 mRho = -9999;
00059 mLepPx = -9999;
00060 mLepPy = -9999;
00061 mLepPz = -9999;
00062 mNPV = -9999;
00063 mAddLepToJet = false;
00064 mIsNPVset = false;
00065 mIsJetEset = false;
00066 mIsJetPtset = false;
00067 mIsJetPhiset = false;
00068 mIsJetEtaset = false;
00069 mIsJetEMFset = false;
00070 mIsJetAset = false;
00071 mIsRhoset = false;
00072 mIsLepPxset = false;
00073 mIsLepPyset = false;
00074 mIsLepPzset = false;
00075 mIsAddLepToJetset = false;
00076 initCorrectors(fLevels, fFiles, fOptions);
00077 }
00078
00079
00080
00081 FactorizedJetCorrector::FactorizedJetCorrector(const std::vector<JetCorrectorParameters>& fParameters)
00082 {
00083 mJetEta = -9999;
00084 mJetPt = -9999;
00085 mJetPhi = -9999;
00086 mJetE = -9999;
00087 mJetEMF = -9999;
00088 mJetA = -9999;
00089 mRho = -9999;
00090 mLepPx = -9999;
00091 mLepPy = -9999;
00092 mLepPz = -9999;
00093 mNPV = -9999;
00094 mAddLepToJet = false;
00095 mIsNPVset = false;
00096 mIsJetEset = false;
00097 mIsJetPtset = false;
00098 mIsJetPhiset = false;
00099 mIsJetEtaset = false;
00100 mIsJetEMFset = false;
00101 mIsJetAset = false;
00102 mIsRhoset = false;
00103 mIsLepPxset = false;
00104 mIsLepPyset = false;
00105 mIsLepPzset = false;
00106 mIsAddLepToJetset = false;
00107 for(unsigned i=0;i<fParameters.size();i++)
00108 {
00109 std::string ss = fParameters[i].definitions().level();
00110 if (ss == "L1Offset")
00111 mLevels.push_back(kL1);
00112 else if (ss == "L1JPTOffset")
00113 mLevels.push_back(kL1);
00114 else if (ss == "L2Relative")
00115 mLevels.push_back(kL2);
00116 else if (ss == "L3Absolute")
00117 mLevels.push_back(kL3);
00118 else if (ss == "L4EMF")
00119 mLevels.push_back(kL4);
00120 else if (ss == "L5Flavor")
00121 mLevels.push_back(kL5);
00122 else if (ss == "L6SLB")
00123 mLevels.push_back(kL6);
00124 else if (ss == "L7Parton")
00125 mLevels.push_back(kL7);
00126 else if (ss == "L1FastJet")
00127 mLevels.push_back(kL1fj);
00128 mCorrectors.push_back(new SimpleJetCorrector(fParameters[i]));
00129 mBinTypes.push_back(mapping(mCorrectors[i]->parameters().definitions().binVar()));
00130 mParTypes.push_back(mapping(mCorrectors[i]->parameters().definitions().parVar()));
00131 }
00132 }
00133
00134
00135
00136
00137 FactorizedJetCorrector::~FactorizedJetCorrector()
00138 {
00139 for(unsigned i=0;i<mCorrectors.size();i++)
00140 delete mCorrectors[i];
00141 }
00142
00143
00144
00145 void FactorizedJetCorrector::initCorrectors(const std::string& fLevels, const std::string& fFiles, const std::string& fOptions)
00146 {
00147
00148 std::vector<std::string> tmp = parseLevels(removeSpaces(fLevels));
00149 for(unsigned i=0;i<tmp.size();i++)
00150 {
00151 if (tmp[i] == "L1Offset")
00152 mLevels.push_back(kL1);
00153 else if (tmp[i] == "L1JPTOffset")
00154 mLevels.push_back(kL1);
00155 else if (tmp[i] == "L2Relative")
00156 mLevels.push_back(kL2);
00157 else if (tmp[i] == "L3Absolute")
00158 mLevels.push_back(kL3);
00159 else if (tmp[i] == "L4EMF")
00160 mLevels.push_back(kL4);
00161 else if (tmp[i] == "L5Flavor")
00162 mLevels.push_back(kL5);
00163 else if (tmp[i] == "L6SLB")
00164 mLevels.push_back(kL6);
00165 else if (tmp[i] == "L7Parton")
00166 mLevels.push_back(kL7);
00167 else if (tmp[i] == "L1FastJet")
00168 mLevels.push_back(kL1fj);
00169 else
00170 {
00171 std::stringstream sserr;
00172 sserr<<"unknown correction level "<<tmp[i];
00173 handleError("FactorizedJetCorrector",sserr.str());
00174 }
00175 }
00176
00177 std::vector<std::string> Files = parseLevels(removeSpaces(fFiles));
00178
00179 std::string FlavorOption = parseOption(removeSpaces(fOptions),"L5Flavor");
00180 std::string PartonOption = parseOption(removeSpaces(fOptions),"L7Parton");
00181
00182 checkConsistency(tmp,Files);
00183
00184 for(unsigned i=0;i<mLevels.size();i++)
00185 {
00186 if (mLevels[i]==kL1 || mLevels[i]==kL2 || mLevels[i]==kL3 || mLevels[i]==kL4 || mLevels[i]==kL6 || mLevels[i]==kL1fj)
00187 mCorrectors.push_back(new SimpleJetCorrector(Files[i]));
00188 else if (mLevels[i]==kL5 && FlavorOption.length()==0)
00189 handleError("FactorizedJetCorrector","must specify flavor option when requesting L5Flavor correction!");
00190 else if (mLevels[i]==kL5 && FlavorOption.length()>0)
00191 mCorrectors.push_back(new SimpleJetCorrector(Files[i],FlavorOption));
00192 else if (mLevels[i]==kL7 && PartonOption.length()==0)
00193 handleError("FactorizedJetCorrector","must specify parton option when requesting L7Parton correction!");
00194 else if (mLevels[i]==kL7 && PartonOption.length()>0)
00195 mCorrectors.push_back(new SimpleJetCorrector(Files[i],PartonOption));
00196 else
00197 {
00198 std::stringstream sserr;
00199 sserr<<"unknown correction level "<<tmp[i];
00200 handleError("FactorizedJetCorrector",sserr.str());
00201 }
00202 mBinTypes.push_back(mapping(mCorrectors[i]->parameters().definitions().binVar()));
00203 mParTypes.push_back(mapping(mCorrectors[i]->parameters().definitions().parVar()));
00204 }
00205 }
00206
00207
00208
00209 std::vector<FactorizedJetCorrector::VarTypes> FactorizedJetCorrector::mapping(const std::vector<std::string>& fNames)
00210 {
00211 std::vector<VarTypes> result;
00212 for(unsigned i=0;i<fNames.size();i++)
00213 {
00214 std::string ss = fNames[i];
00215 if (ss=="JetPt")
00216 result.push_back(kJetPt);
00217 else if (ss=="JetEta")
00218 result.push_back(kJetEta);
00219 else if (ss=="JetPhi")
00220 result.push_back(kJetPhi);
00221 else if (ss=="JetE")
00222 result.push_back(kJetE);
00223 else if (ss=="JetEMF")
00224 result.push_back(kJetEMF);
00225 else if (ss=="RelLepPt")
00226 result.push_back(kRelLepPt);
00227 else if (ss=="PtRel")
00228 result.push_back(kPtRel);
00229 else if (ss=="NPV")
00230 result.push_back(kNPV);
00231 else if (ss=="JetA")
00232 result.push_back(kJetA);
00233 else if (ss=="Rho")
00234 result.push_back(kRho);
00235 else
00236 {
00237 std::stringstream sserr;
00238 sserr<<"unknown parameter name: "<<ss;
00239 handleError("FactorizedJetCorrector",sserr.str());
00240 }
00241 }
00242 return result;
00243 }
00244
00245
00246
00247 void FactorizedJetCorrector::checkConsistency(const std::vector<std::string>& fLevels, const std::vector<std::string>& fTags)
00248 {
00249
00250 if (fLevels.size() != fTags.size())
00251 {
00252 std::stringstream sserr;
00253 sserr<<"number of correction levels: "<<fLevels.size()<<" doesn't match # of tags: "<<fTags.size();
00254 handleError("FactorizedJetCorrector",sserr.str());
00255 }
00256
00257 for(unsigned int i=0;i<fTags.size();i++)
00258 if ((int)fTags[i].find(fLevels[i])<0)
00259 {
00260 std::stringstream sserr;
00261 sserr<<"inconsistent tag: "<<fTags[i]<<" for "<<"the requested correction: "<<fLevels[i];
00262 handleError("FactorizedJetCorrector",sserr.str());
00263 }
00264 }
00265
00266
00267
00268 std::vector<std::string> FactorizedJetCorrector::parseLevels(const std::string& ss)
00269 {
00270 std::vector<std::string> result;
00271 unsigned int pos(0),j,newPos;
00272 int i;
00273 std::string tmp;
00274
00275 while (pos<ss.length())
00276 {
00277 tmp = "";
00278 i = ss.find(":" , pos);
00279 if (i<0 && pos==0)
00280 {
00281 result.push_back(ss);
00282 pos = ss.length();
00283 }
00284 else if (i<0 && pos>0)
00285 {
00286 for(j=pos;j<ss.length();j++)
00287 tmp+=ss[j];
00288 result.push_back(tmp);
00289 pos = ss.length();
00290 }
00291 else
00292 {
00293 newPos = i;
00294 for(j=pos;j<newPos;j++)
00295 tmp+=ss[j];
00296 result.push_back(tmp);
00297 pos = newPos+1;
00298 }
00299 }
00300 return result;
00301 }
00302
00303
00304
00305 std::string FactorizedJetCorrector::parseOption(const std::string& ss, const std::string& type)
00306 {
00307 std::string result;
00308 int pos1(-1),pos2(-1);
00309
00310 pos1 = ss.find(type+":");
00311 if (pos1<0)
00312 result = "";
00313 else
00314 {
00315 pos2 = ss.find("&",pos1+type.length()+1);
00316 if (pos2<0)
00317 result = ss.substr(pos1+type.length()+1,ss.length()-pos1-type.length()-1);
00318 else
00319 result = ss.substr(pos1+type.length()+1,pos2-pos1-type.length()-1);
00320 }
00321 return result;
00322 }
00323
00324
00325
00326 std::string FactorizedJetCorrector::removeSpaces(const std::string& ss)
00327 {
00328 std::string result("");
00329 std::string aChar;
00330 for(unsigned int i=0;i<ss.length();i++)
00331 {
00332 aChar = ss.substr(i,1);
00333 if (aChar != " ")
00334 result+=aChar;
00335 }
00336 return result;
00337 }
00338
00339
00340
00341 float FactorizedJetCorrector::getCorrection()
00342 {
00343 std::vector<float> vv = getSubCorrections();
00344 return vv[vv.size()-1];
00345 }
00346
00347
00348
00349 std::vector<float> FactorizedJetCorrector::getSubCorrections()
00350 {
00351 float scale,factor;
00352 std::vector<float> factors;
00353 std::vector<float> vx,vy;
00354 factor = 1;
00355 for(unsigned int i=0;i<mLevels.size();i++)
00356 {
00357 vx = fillVector(mBinTypes[i]);
00358 vy = fillVector(mParTypes[i]);
00359
00360
00361 scale = mCorrectors[i]->correction(vx,vy);
00362 if (mLevels[i]==kL6 && mAddLepToJet) scale *= 1.0 + getLepPt() / mJetPt;
00363 factor*=scale;
00364 factors.push_back(factor);
00365 mJetE *=scale;
00366 mJetPt*=scale;
00367 }
00368 mIsNPVset = false;
00369 mIsJetEset = false;
00370 mIsJetPtset = false;
00371 mIsJetPhiset = false;
00372 mIsJetEtaset = false;
00373 mIsJetEMFset = false;
00374 mIsJetAset = false;
00375 mIsRhoset = false;
00376 mIsLepPxset = false;
00377 mIsLepPyset = false;
00378 mIsLepPzset = false;
00379 mAddLepToJet = false;
00380 return factors;
00381 }
00382
00383
00384
00385 std::vector<float> FactorizedJetCorrector::fillVector(std::vector<VarTypes> fVarTypes)
00386 {
00387 std::vector<float> result;
00388 for(unsigned i=0;i<fVarTypes.size();i++)
00389 {
00390 if (fVarTypes[i] == kJetEta)
00391 {
00392 if (!mIsJetEtaset)
00393 handleError("FactorizedJetCorrector","jet eta is not set");
00394 result.push_back(mJetEta);
00395 }
00396 else if (fVarTypes[i] == kNPV)
00397 {
00398 if (!mIsNPVset)
00399 handleError("FactorizedJetCorrector","number of primary vertices is not set");
00400 result.push_back(mNPV);
00401 }
00402 else if (fVarTypes[i] == kJetPt)
00403 {
00404 if (!mIsJetPtset)
00405 handleError("FactorizedJetCorrector","jet pt is not set");
00406 result.push_back(mJetPt);
00407 }
00408 else if (fVarTypes[i] == kJetPhi)
00409 {
00410 if (!mIsJetPhiset)
00411 handleError("FactorizedJetCorrector","jet phi is not set");
00412 result.push_back(mJetPhi);
00413 }
00414 else if (fVarTypes[i] == kJetE)
00415 {
00416 if (!mIsJetEset)
00417 handleError("FactorizedJetCorrector","jet E is not set");
00418 result.push_back(mJetE);
00419 }
00420 else if (fVarTypes[i] == kJetEMF)
00421 {
00422 if (!mIsJetEMFset)
00423 handleError("FactorizedJetCorrector","jet EMF is not set");
00424 result.push_back(mJetEMF);
00425 }
00426 else if (fVarTypes[i] == kJetA)
00427 {
00428 if (!mIsJetAset)
00429 handleError("FactorizedJetCorrector","jet area is not set");
00430 result.push_back(mJetA);
00431 }
00432 else if (fVarTypes[i] == kRho)
00433 {
00434 if (!mIsRhoset)
00435 handleError("FactorizedJetCorrector","fastjet density Rho is not set");
00436 result.push_back(mRho);
00437 }
00438 else if (fVarTypes[i] == kRelLepPt)
00439 {
00440 if (!mIsJetPtset||!mIsAddLepToJetset||!mIsLepPxset||!mIsLepPyset)
00441 handleError("FactorizedJetCorrector","can't calculate rel lepton pt");
00442 result.push_back(getRelLepPt());
00443 }
00444 else if (fVarTypes[i] == kPtRel)
00445 {
00446 if (!mIsJetPtset||!mIsJetEtaset||!mIsJetPhiset||!mIsJetEset||
00447 !mIsAddLepToJetset||!mIsLepPxset||!mIsLepPyset||!mIsLepPzset)
00448 handleError("FactorizedJetCorrector","can't calculate ptrel");
00449 result.push_back(getPtRel());
00450 }
00451 else
00452 {
00453 std::stringstream sserr;
00454 sserr<<"unknown parameter "<<fVarTypes[i];
00455 handleError("FactorizedJetCorrector",sserr.str());
00456 }
00457 }
00458 return result;
00459 }
00460
00461
00462
00463 float FactorizedJetCorrector::getLepPt() const
00464 {
00465 return std::sqrt(mLepPx*mLepPx + mLepPy*mLepPy);
00466 }
00467
00468
00469
00470 float FactorizedJetCorrector::getRelLepPt() const
00471 {
00472 float lepPt = getLepPt();
00473 return (mAddLepToJet) ? lepPt/(mJetPt + lepPt) : lepPt/mJetPt;
00474 }
00475
00476
00477
00478 float FactorizedJetCorrector::getPtRel() const
00479 {
00480 typedef ROOT::Math::LorentzVector<ROOT::Math::PtEtaPhiE4D<float> >
00481 PtEtaPhiELorentzVector;
00482 typedef ROOT::Math::DisplacementVector3D<ROOT::Math::Cartesian3D<float> >
00483 XYZVector;
00484 PtEtaPhiELorentzVector jet;
00485 XYZVector lep;
00486 jet.SetPt(mJetPt);
00487 jet.SetEta(mJetEta);
00488 jet.SetPhi(mJetPhi);
00489 jet.SetE(mJetE);
00490 lep.SetXYZ(mLepPx,mLepPy,mLepPz);
00491 float lj_x = (mAddLepToJet) ? lep.X()+jet.Px() : jet.Px();
00492 float lj_y = (mAddLepToJet) ? lep.Y()+jet.Py() : jet.Py();
00493 float lj_z = (mAddLepToJet) ? lep.Z()+jet.Pz() : jet.Pz();
00494
00495 float lj2 = lj_x*lj_x+lj_y*lj_y+lj_z*lj_z;
00496 if (lj2<=0) {
00497 std::stringstream sserr;
00498 sserr<<"lepton+jet momentum sq is not positive: "<<lj2;
00499 handleError("FactorizedJetCorrector",sserr.str());
00500 }
00501 float lep2 = lep.X()*lep.X()+lep.Y()*lep.Y()+lep.Z()*lep.Z();
00502
00503 float lepXlj = lep.X()*lj_x+lep.Y()*lj_y+lep.Z()*lj_z;
00504
00505 float pLrel2 = lepXlj*lepXlj/lj2;
00506
00507 float pTrel2 = lep2-pLrel2;
00508 return (pTrel2 > 0) ? std::sqrt(pTrel2) : 0.0;
00509 }
00510
00511
00512
00513 void FactorizedJetCorrector::setNPV(int fNPV)
00514 {
00515 mNPV = fNPV;
00516 mIsNPVset = true;
00517 }
00518 void FactorizedJetCorrector::setJetEta(float fEta)
00519 {
00520 mJetEta = fEta;
00521 mIsJetEtaset = true;
00522 }
00523
00524 void FactorizedJetCorrector::setJetPt(float fPt)
00525 {
00526 mJetPt = fPt;
00527 mIsJetPtset = true;
00528 }
00529
00530 void FactorizedJetCorrector::setJetPhi(float fPhi)
00531 {
00532 mJetPhi = fPhi;
00533 mIsJetPhiset = true;
00534 }
00535
00536 void FactorizedJetCorrector::setJetE(float fE)
00537 {
00538 mJetE = fE;
00539 mIsJetEset = true;
00540 }
00541
00542 void FactorizedJetCorrector::setJetEMF(float fEMF)
00543 {
00544 mJetEMF = fEMF;
00545 mIsJetEMFset = true;
00546 }
00547
00548 void FactorizedJetCorrector::setJetA(float fA)
00549 {
00550 mJetA = fA;
00551 mIsJetAset = true;
00552 }
00553
00554 void FactorizedJetCorrector::setRho(float fRho)
00555 {
00556 mRho = fRho;
00557 mIsRhoset = true;
00558 }
00559
00560 void FactorizedJetCorrector::setLepPx(float fPx)
00561 {
00562 mLepPx = fPx;
00563 mIsLepPxset = true;
00564 }
00565
00566 void FactorizedJetCorrector::setLepPy(float fPy)
00567 {
00568 mLepPy = fPy;
00569 mIsLepPyset = true;
00570 }
00571
00572 void FactorizedJetCorrector::setLepPz(float fPz)
00573 {
00574 mLepPz = fPz;
00575 mIsLepPzset = true;
00576 }
00577
00578 void FactorizedJetCorrector::setAddLepToJet(bool fAddLepToJet)
00579 {
00580 mAddLepToJet = fAddLepToJet;
00581 mIsAddLepToJetset = true;
00582 }