00001 #include "tmb_tree/TMBJet.hpp"
00002 #include <iostream>
00003 #include "TRandom.h"
00004 #include "TTree.h"
00005 #include "TBranch.h"
00006
00007 ClassImp(TMBJet);
00008
00009 TMBJet::TMBJet()
00010 {
00011 }
00012
00013 TMBJet::TMBJet (Float_t E, Float_t pT, Float_t phi, Float_t eta)
00014 {
00015 Set0 (E, pT, phi, eta);
00016 }
00017
00018 TMBJet::~TMBJet()
00019 {
00020 }
00021
00022 void TMBJet::Set0 (Float_t E, Float_t pT, Float_t phi, Float_t eta)
00023 {
00024
00025 SetPtEtaPhiE(pT, eta, phi, E);
00026
00027
00028 _jes_C=0.0;
00029 _jesMU_C=0.0;
00030 _jes_dC_stat=0.0;
00031 _jesMU_dC_stat=0.0;
00032 _jes_dC_stat_up=0.0;
00033 _jesMU_dC_stat_up=0.0;
00034 _jes_dC_stat_down=0.0;
00035 _jesMU_dC_stat_down=0.0;
00036 _jes_dC_sys=0.0;
00037 _jesMU_dC_sys=0.0;
00038 _jes_dC_sys_up=0.0;
00039 _jesMU_dC_sys_up=0.0;
00040 _jes_dC_sys_down=0.0;
00041 _jesMU_dC_sys_down=0.0;
00042 _jes_metC=0.0;
00043 _jesMU_metC=0.0;
00044 _jes_metdC_stat=0.0;
00045 _jesMU_metdC_stat=0.0;
00046 _jes_metdC_sys=0.0;
00047 _jesMU_metdC_sys=0.0;
00048 _smear_coeff = 1.0;
00049 _smear_coeffMU = 1.0;
00050 _isGood = 1;
00051 _isL1Conf = 0;
00052 _isBad = 0;
00053 _isNoise = 0;
00054 _isEM = 0;
00055 _hasMU = 0;
00056 _isSmeared = 0;
00057 _isSmearedMU = 0;
00058 _actas = 0;
00059
00060 ClearAllBTags();
00061 }
00062
00063 void TMBJet::ActAsUnCorrected() const
00064 {
00065 if (_actas==kUnCorrected) return;
00066 const_cast<TMBJet&>(*this).SetPtEtaPhiE(_uncorrected.Pt(), _uncorrected.Eta(), _uncorrected.Phi(), _uncorrected.E());
00067 _actas = kUnCorrected;
00068 return;
00069 }
00070
00071 void TMBJet::ActAsJESCorrected() const
00072 {
00073 if (_actas==kJESCorrected) return;
00074 const_cast<TMBJet&>(*this).SetPEtaPhiE(_uncorrected.P()*_jes_C, _uncorrected.Eta(), _uncorrected.Phi(), _uncorrected.E()*_jes_C);
00075 _actas = kJESCorrected;
00076 return;
00077 }
00078
00079 void TMBJet::ActAsJESCorrectedShiftedPlus() const
00080 {
00081 if (_actas==kJESCorrectedShiftedPlus) return;
00082 const_cast<TMBJet&>(*this).SetPEtaPhiE(_uncorrected.P()*(_jes_C+sqrt(_jes_dC_sys_up*_jes_dC_sys_up+_jes_dC_stat_up*_jes_dC_stat_up)),
00083 _uncorrected.Eta(), _uncorrected.Phi(),
00084 _uncorrected.E()*(_jes_C+sqrt(_jes_dC_sys_up*_jes_dC_sys_up+_jes_dC_stat_up*_jes_dC_stat_up)));
00085 _actas = kJESCorrectedShiftedPlus;
00086 return;
00087 }
00088
00089 void TMBJet::ActAsJESCorrectedShiftedMinus() const
00090 {
00091 if (_actas==kJESCorrectedShiftedMinus) return;
00092 const_cast<TMBJet&>(*this).SetPEtaPhiE(_uncorrected.P()*(_jes_C-sqrt(_jes_dC_sys_down*_jes_dC_sys_down+_jes_dC_stat_down*_jes_dC_stat_down)),
00093 _uncorrected.Eta(), _uncorrected.Phi(),
00094 _uncorrected.E()*(_jes_C-sqrt(_jes_dC_sys_down*_jes_dC_sys_down+_jes_dC_stat_down*_jes_dC_stat_down)));
00095 _actas = kJESCorrectedShiftedMinus;
00096 return;
00097 }
00098
00099 void TMBJet::ActAsJESMUCorrected() const
00100 {
00101 if (_actas==kJESMUCorrected) return;
00102 const_cast<TMBJet&>(*this).SetPEtaPhiE(_uncorrected.P()*_jesMU_C, _uncorrected.Eta(), _uncorrected.Phi(), _uncorrected.E()*_jesMU_C);
00103 _actas = kJESMUCorrected;
00104 return;
00105 }
00106
00107 void TMBJet::ActAsJESMUCorrectedShiftedPlus() const
00108 {
00109 if (_actas==kJESMUCorrectedShiftedPlus) return;
00110 const_cast<TMBJet&>(*this).SetPEtaPhiE(_uncorrected.P()*(_jesMU_C+sqrt(_jesMU_dC_sys_up*_jesMU_dC_sys_up+_jesMU_dC_stat_up*_jesMU_dC_stat_up)),
00111 _uncorrected.Eta(), _uncorrected.Phi(),
00112 _uncorrected.E()*(_jesMU_C+sqrt(_jesMU_dC_sys_up*_jesMU_dC_sys_up+_jesMU_dC_stat_up*_jesMU_dC_stat_up)));
00113 _actas = kJESMUCorrectedShiftedPlus;
00114 return;
00115 }
00116
00117 void TMBJet::ActAsJESMUCorrectedShiftedMinus() const
00118 {
00119 if (_actas==kJESMUCorrectedShiftedMinus) return;
00120 const_cast<TMBJet&>(*this).SetPEtaPhiE(_uncorrected.P()*(_jesMU_C-sqrt(_jesMU_dC_sys_down*_jesMU_dC_sys_down+_jesMU_dC_stat_down*_jesMU_dC_stat_down)),
00121 _uncorrected.Eta(), _uncorrected.Phi(),
00122 _uncorrected.E()*(_jesMU_C-sqrt(_jesMU_dC_sys_down*_jesMU_dC_sys_down+_jesMU_dC_stat_down*_jesMU_dC_stat_down)));
00123 _actas = kJESMUCorrectedShiftedMinus;
00124 return;
00125 }
00126
00127 void TMBJet::ActAsSmeared() const
00128 {
00129 if (_actas==kSmeared) return;
00130 const_cast<TMBJet&>(*this).SetPEtaPhiE(_uncorrected.P()*_smear_coeff, _uncorrected.Eta(), _uncorrected.Phi(), _uncorrected.E()*_smear_coeff);
00131 _actas = kSmeared;
00132 return;
00133 }
00134
00135 void TMBJet::ActAsSmearedMU() const
00136 {
00137 if (_actas==kSmearedMU) return;
00138 const_cast<TMBJet&>(*this).SetPEtaPhiE(_uncorrected.P()*_smear_coeffMU, _uncorrected.Eta(), _uncorrected.Phi(), _uncorrected.E()*_smear_coeffMU);
00139 _actas = kSmearedMU;
00140 return;
00141 }
00142
00143 void TMBJet::Set1 (Float_t q, Float_t dphi, Float_t deta,
00144 Float_t emf, Float_t em1f, Float_t em2f, Float_t em3f,
00145 Float_t ccmg, Float_t icdf, Float_t ecmg, Float_t icrf,
00146 Float_t fh1f, Float_t fh2f, Float_t fh3f, Float_t chf,
00147 Float_t emcc, Float_t hadcc,Float_t emec, Float_t hadec,
00148 Float_t hot, Float_t mxET,
00149 Float_t cpsE, Float_t etaW, Float_t phiW,
00150 Float_t sET, Float_t vPT, Float_t iPT, Float_t seedET,
00151 Float_t pxCH, Float_t pyCH, Float_t pzCH)
00152 {
00153 _q = q;
00154 _dphi = dphi;
00155 _deta = deta;
00156 _emf = emf;
00157 _em1f = em1f;
00158 _em2f = em2f;
00159 _em3f = em3f;
00160 _ccmg = ccmg;
00161 _icdf = icdf;
00162 _ecmg = ecmg;
00163 _icrf = icrf;
00164 _fh1f = fh1f;
00165 _fh2f = fh2f;
00166 _fh3f = fh3f;
00167 _emcc = emcc;
00168 _hadcc = hadcc;
00169 _emec = emec;
00170 _hadec = hadec;
00171 _chf = chf;
00172 _hot = hot;
00173 _mxET = mxET;
00174 _cpsE = cpsE;
00175 _etaW = etaW;
00176 _phiW = phiW;
00177 _sET = sET;
00178 _vPT = vPT;
00179 _iPT = iPT;
00180 _seedET= seedET;
00181 _pxCH = pxCH;
00182 _pyCH = pyCH;
00183 _pzCH = pzCH;
00184 }
00185
00186
00187 void TMBJet::Set2 (Int_t ntrk, Int_t nps, Int_t Nitems,
00188 Int_t n90, Int_t split_merge_word,
00189 const char *algoname, const TRefArray *tracks, TRef vtxref)
00190 {
00191 _ntrk = ntrk;
00192 _nps = nps;
00193 _Nitems= Nitems;
00194 _n90 = n90;
00195 _split_merge_word = split_merge_word;
00196 _algoname = algoname;
00197 _vtxref = vtxref;
00198
00199 _tracks.Clear();
00200 if (tracks) {
00201 for (Int_t i=0; i<tracks->GetLast()+1; i++) {
00202 _tracks.Add( tracks->At(i) );
00203 }
00204 }
00205 }
00206
00207 void TMBJet::SetJetShapes(const std::vector<std::pair<Char_t, UChar_t> >& jetTowers,
00208 const std::vector<Float_t>& jetShapes)
00209 {
00210 _jetTowers=jetTowers;
00211 _jetShapes=jetShapes;
00212 }
00213
00214 void TMBJet::SetL1(Float_t l1set, Float_t l1pt, Float_t l1em)
00215 {
00216 _l1set = l1set;
00217 _l1pt = l1pt;
00218 _l1em = l1em;
00219 }
00220
00221 void TMBJet::SetCorr (Float_t jes_C, Float_t jes_dC_stat, Float_t jes_dC_sys,
00222 Float_t jes_metC, Float_t jes_metdC_stat, Float_t jes_metdC_sys)
00223 {
00224 _jes_C=jes_C;
00225 _jes_dC_stat=jes_dC_stat;
00226 _jes_dC_sys=jes_dC_sys;
00227 _jes_metC=jes_metC;
00228 _jes_metdC_stat=jes_metdC_stat;
00229 _jes_metdC_sys=jes_metdC_sys;
00230
00231
00232 switch(_actas) {
00233 case kJESCorrected:
00234 _actas = kUnCorrected;
00235 ActAsJESCorrected();
00236 break;
00237 case kJESCorrectedShiftedPlus:
00238 _actas = kUnCorrected;
00239 ActAsJESCorrectedShiftedPlus();
00240 break;
00241 case kJESCorrectedShiftedMinus:
00242 _actas = kUnCorrected;
00243 ActAsJESCorrectedShiftedMinus();
00244 break;
00245 default:
00246 break;
00247 }
00248 }
00249
00250 void TMBJet::SetCorr (Float_t jes_C, Float_t jes_dC_stat_up, Float_t jes_dC_sys_up, Float_t jes_dC_stat_down, Float_t jes_dC_sys_down,
00251 Float_t jes_metC, Float_t jes_metdC_stat, Float_t jes_metdC_sys)
00252 {
00253 _jes_C=jes_C;
00254 _jes_dC_stat_down=jes_dC_stat_down;
00255 _jes_dC_sys_down=jes_dC_sys_down;
00256 _jes_dC_stat_up=jes_dC_stat_up;
00257 _jes_dC_sys_up=jes_dC_sys_up;
00258 _jes_dC_stat = _jes_dC_stat_up >= _jes_dC_stat_down ? _jes_dC_stat_up : _jes_dC_stat_down ;
00259 _jes_dC_sys = _jes_dC_sys_up >= _jes_dC_sys_down ? _jes_dC_sys_up : _jes_dC_sys_down ;
00260 _jes_metC=jes_metC;
00261 _jes_metdC_stat=jes_metdC_stat;
00262 _jes_metdC_sys=jes_metdC_sys;
00263
00264 switch(_actas) {
00265 case kJESCorrected:
00266 _actas = kUnCorrected;
00267 ActAsJESCorrected();
00268 break;
00269 case kJESCorrectedShiftedPlus:
00270 _actas = kUnCorrected;
00271 ActAsJESCorrectedShiftedPlus();
00272 break;
00273 case kJESCorrectedShiftedMinus:
00274 _actas = kUnCorrected;
00275 ActAsJESCorrectedShiftedMinus();
00276 break;
00277 default:
00278 break;
00279 }
00280
00281 }
00282
00283 void TMBJet::SetCorrMU(Float_t jes_C, Float_t jes_dC_stat, Float_t jes_dC_sys,
00284 Float_t jes_metC, Float_t jes_metdC_stat, Float_t jes_metdC_sys)
00285 {
00286 _jesMU_C=jes_C;
00287 _jesMU_dC_stat=jes_dC_stat;
00288 _jesMU_dC_sys=jes_dC_sys;
00289 _jesMU_metC=jes_metC;
00290 _jesMU_metdC_stat=jes_metdC_stat;
00291 _jesMU_metdC_sys=jes_metdC_sys;
00292
00293
00294 switch(_actas) {
00295 case kJESMUCorrected:
00296 _actas = kUnCorrected;
00297 ActAsJESMUCorrected();
00298 break;
00299 case kJESMUCorrectedShiftedPlus:
00300 _actas = kUnCorrected;
00301 ActAsJESMUCorrectedShiftedPlus();
00302 break;
00303 case kJESMUCorrectedShiftedMinus:
00304 _actas = kUnCorrected;
00305 ActAsJESMUCorrectedShiftedMinus();
00306 break;
00307 default:
00308 break;
00309 }
00310 }
00311
00312 void TMBJet::SetCorrMU(Float_t jes_C, Float_t jes_dC_stat_up, Float_t jes_dC_sys_up, Float_t jes_dC_stat_down, Float_t jes_dC_sys_down,
00313 Float_t jes_metC, Float_t jes_metdC_stat, Float_t jes_metdC_sys)
00314 {
00315 _jesMU_C=jes_C;
00316 _jesMU_dC_stat_up=jes_dC_stat_up;
00317 _jesMU_dC_sys_up=jes_dC_sys_up;
00318 _jesMU_dC_stat_down=jes_dC_stat_down;
00319 _jesMU_dC_sys_down=jes_dC_sys_down;
00320 _jesMU_dC_stat = _jesMU_dC_stat_up >= _jesMU_dC_stat_down ? _jesMU_dC_stat_up : _jesMU_dC_stat_down ;
00321 _jesMU_dC_sys = _jesMU_dC_sys_up >= _jesMU_dC_sys_down ? _jesMU_dC_sys_up : _jesMU_dC_sys_down ;
00322 _jesMU_metC=jes_metC;
00323 _jesMU_metdC_stat=jes_metdC_stat;
00324 _jesMU_metdC_sys=jes_metdC_sys;
00325
00326
00327 switch(_actas) {
00328 case kJESMUCorrected:
00329 _actas = kUnCorrected;
00330 ActAsJESMUCorrected();
00331 break;
00332 case kJESMUCorrectedShiftedPlus:
00333 _actas = kUnCorrected;
00334 ActAsJESMUCorrectedShiftedPlus();
00335 break;
00336 case kJESMUCorrectedShiftedMinus:
00337 _actas = kUnCorrected;
00338 ActAsJESMUCorrectedShiftedMinus();
00339 break;
00340 default:
00341 break;
00342 }
00343 }
00344
00345 void TMBJet::SetFlag(Int_t isGood, Int_t isL1Conf, Int_t isBad, Int_t isNoise, Int_t isEM, Int_t hasMU, Int_t isSmeared, Int_t isSmearedMU)
00346 {
00347 _isGood = isGood;
00348 _isL1Conf = isL1Conf;
00349 _isBad = isBad;
00350 _isNoise = isNoise;
00351 _isEM = isEM;
00352 _hasMU = hasMU;
00353 _isSmeared = isSmeared;
00354 _isSmearedMU = isSmearedMU;
00355
00356 }
00357
00358 void TMBJet::SetUnCorr(Float_t p, Float_t eta, Float_t phi, Float_t E)
00359 {
00360 TMBLorentzVector temp(p,eta,phi,E,kPEtaPhiE);
00361 _uncorrected = temp;
00362 }
00363
00364 void TMBJet::SetSmearCoeff(Float_t coeff, Float_t coeffMU)
00365 {
00366 _smear_coeff = coeff;
00367 _smear_coeffMU = coeffMU;
00368
00369 switch(_actas) {
00370 case kSmeared:
00371 _actas = kUnCorrected;
00372 ActAsSmeared();
00373 break;
00374 case kSmearedMU:
00375 _actas = kUnCorrected;
00376 ActAsSmearedMU();
00377 break;
00378 default:
00379 break;
00380 }
00381 }
00382
00383 void TMBJet::SetJetID(Float_t cpf0, Float_t cpf, Int_t ntrkMultiplicity0,
00384 Int_t ntrkMultiplicity, TRef cpfvtxref)
00385 {
00386 _cpf0 = cpf0;
00387 _cpf = cpf;
00388 _ntrkMultiplicity0 = ntrkMultiplicity0;
00389 _ntrkMultiplicity = ntrkMultiplicity;
00390 _cpfvtxref = cpfvtxref;
00391 }
00392
00393 namespace {
00394
00395
00396 bool ReadBTagBranch(const TString& algo, const TString& bname){
00397 TTree *tree = (TTree*)gROOT->FindObject("TMBTree");
00398 if (tree){
00399 Long64_t current = tree->GetReadEntry();
00400
00401 TBranch *b =tree->GetBranch("BTag_corr"+algo+"_"+bname);
00402 if (current>=0 && b) {
00403 Long64_t other_current = b->GetReadEntry();
00404
00405 if (other_current!=current) {
00406
00407 b->GetEntry(current);
00408 }
00409 }
00410 return true;
00411 }
00412 return false;
00413 }
00414 }
00415
00419
00420
00421
00422
00423
00424
00425
00426 const TMBBTag* TMBJet::GetBTag(const TString &type, const TString &cut) const {
00427 TString typecut(type+"_"+cut);
00428 return GetBTag(typecut);
00429 }
00430
00431 const TMBBTag* TMBJet::GetBTag(const TString &typecut) const {
00432
00433 if (_isEM || _isBad) return 0;
00434
00435
00436
00437 int check = -1;
00438 std::map< TString, int >::const_iterator c = _btagdictcheck.find(typecut);
00439 if (_btagdictcheck.end()!=c) {
00440 check = c->second;
00441 }
00442
00443 std::map< TString, TRef >::const_iterator i = _btagdict.find(typecut);
00444 if (_btagdict.end()!=i && i->second.IsValid()) {
00445
00446
00447 ReadBTagBranch(_algoname, i->first);
00448
00449 const TMBBTag* tag = (const TMBBTag*)(i->second.GetObject());
00450 if (!tag) std::cout<<"WARNING! In GetBTag(), GetObject returned 0"<<std::endl;
00451 else if (tag->GetId()!=check){
00452 std::cout<<"WARNING! ID check failed in GetBTag!"<<std::endl;
00453 }
00454 return tag;
00455 }
00456 else {
00457 return 0;
00458 }
00459 }
00460
00467 const TMBBTag* TMBJet::GetBTag(const char *type, const char *cut) const
00468 {
00469 return GetBTag (TString (type), TString (cut));
00470 }
00471
00472
00473
00474 const TMBBTag* TMBJet::GetFirstBTag() const
00475 {
00476 std::map< TString, TRef >::const_iterator i = _btagdict.begin();
00477 if (_btagdict.end()!=i) return GetBTag(i->first);
00478 else return 0;
00479 }
00480
00481
00482 bool TMBJet::btag_print() const
00483 {
00484 std::cout<<"btags for this jet:";
00485 if (_isEM) std::cout<<" isEM ";
00486 if (_isBad) std::cout<<" isBad ";
00487 bool ret=true;
00488 std::map< TString, TRef >::const_iterator i = _btagdict.begin();
00489 while (_btagdict.end()!=i) {
00490
00491
00492 ReadBTagBranch(_algoname, i->first);
00493
00494 std::cout<<" "<<i->first;
00495 if (!i->second.IsValid()) {std::cout<<"-invalid! "; ret=false;}
00496
00497 const TMBBTag* tag = (const TMBBTag*)(i->second.GetObject());
00498 if (!tag) {std::cout<<" <-tag==0!"; ret=false;}
00499 else {
00500
00501
00502 std::cout<<" "<<tag->GetId()<<"="<<btagdictcheck(i->first);
00503 if (tag->GetId()!=btagdictcheck(i->first)) {std::cout<<" <-mismatch!"; ret=false;}
00504
00505
00506 const TMBJet* jet = tag->GetJet();
00507 if (!jet) std::cout<<" bad jet ref";
00508 else {
00509
00510
00511 std::cout<<" "<<jet->Pt()<<"="<<this->Pt();
00512 if (jet->Pt()!=this->Pt()) {std::cout<<" <-mismatch!"; ret=false;}
00513
00514
00515 std::cout<<" "<<tag->GetId()<<"="<<jet->btagdictcheck(i->first);
00516 if (tag->GetId()!=jet->btagdictcheck(i->first)) {std::cout<<" <-mismatch!"; ret=false;}
00517
00518 }
00519
00520 }
00521 ++i;
00522 }
00523 std::cout<<std::endl;
00524 return ret;
00525 }
00526
00534 void TMBJet::AddBTag(const TString &type, const TString &cut, TMBBTag* btag)
00535 {
00536 TString typecut(type+"_"+cut);
00537
00538
00539
00540 int r = gRandom->Integer(1000000000);
00541 btag->SetId(r);
00542 _btagdictcheck[typecut] = r;
00543
00544
00545 _btagdict[typecut] = btag;
00546 }
00547
00551 void TMBJet::ClearAllBTags()
00552 {
00553 _btagdict.clear();
00554 _btagdictcheck.clear();
00555 }
00556
00562 void TMBJet::ClearBTag (const TString &type, const TString &cut)
00563 {
00564 std::map<TString, TRef>::iterator itr = _btagdict.find(type+"_"+cut);
00565 if (itr != _btagdict.end()) {
00566 _btagdict.erase(itr);
00567
00568 }
00569 std::map<TString, int>::iterator itr2 = _btagdictcheck.find(type+"_"+cut);
00570 if (itr2 != _btagdictcheck.end()) {
00571 _btagdictcheck.erase(itr2);
00572
00573 }
00574 }
00575
00576 int TMBJet::btagdictcheck(const char* t) const
00577 {
00578 if (_btagdictcheck.size()==0) return -2;
00579 TString s(t);
00580
00581 std::map< TString, int >::const_iterator i = _btagdictcheck.find(s);
00582 if (i!=_btagdictcheck.end()) return i->second;
00583
00584
00585 for (i=_btagdictcheck.begin(); i!=_btagdictcheck.end(); ++i){
00586 if (s.EndsWith(i->first)) return i->second;
00587 }
00588
00589
00590 return -1;
00591 }
00592
00593 int TMBJet::taggable() const
00594 {
00595 const TMBBTag* svt = GetFirstBTag();
00596 if (svt) return svt->is_taggable();
00597 else return -1;
00598 }
00599
00600 int TMBJet::mc_flavor() const
00601 {
00602 const TMBBTag* svt = GetFirstBTag();
00603 if (svt) return svt->mc_flavor();
00604 else return -1;
00605 }
00606