00001 #include "AnalysisDataFormats/TopObjects/interface/TtSemiLepEvtPartons.h"
00002 #include "TopQuarkAnalysis/TopJetCombination/interface/TtSemiLepJetComb.h"
00003
00004 #include "Math/VectorUtil.h"
00005
00006 TtSemiLepJetComb::TtSemiLepJetComb()
00007 {
00008 }
00009
00010 TtSemiLepJetComb::TtSemiLepJetComb(const std::vector<pat::Jet>& jets, const std::vector<int>& combination,
00011 const math::XYZTLorentzVector& lepton, const pat::MET& neutrino)
00012 {
00013
00014
00015 hadQJet_ = jets[ combination[TtSemiLepEvtPartons::LightQ ] ];
00016 hadQBarJet_ = jets[ combination[TtSemiLepEvtPartons::LightQBar] ];
00017 hadBJet_ = jets[ combination[TtSemiLepEvtPartons::HadB ] ];
00018 lepBJet_ = jets[ combination[TtSemiLepEvtPartons::LepB ] ];
00019 lepton_ = lepton;
00020 neutrino_ = neutrino;
00021
00022
00023 deduceMothers();
00024 }
00025
00026 TtSemiLepJetComb::~TtSemiLepJetComb()
00027 {
00028 }
00029
00030 double TtSemiLepJetComb::topVar(JetComb::DecayType decay, JetComb::VarType var) const
00031 {
00032 switch(var){
00033 case JetComb::kMass : return top(decay).mass();
00034 case JetComb::kPt : return top(decay).pt();
00035 case JetComb::kEta : return top(decay).eta();
00036 case JetComb::kPhi : return top(decay).phi();
00037 case JetComb::kTheta : return top(decay).theta();
00038 };
00039 return -9999.;
00040 }
00041
00042 double TtSemiLepJetComb::wBosonVar(JetComb::DecayType decay, JetComb::VarType var) const
00043 {
00044 switch(var){
00045 case JetComb::kMass : return wBoson(decay).mass();
00046 case JetComb::kPt : return wBoson(decay).pt();
00047 case JetComb::kEta : return wBoson(decay).eta();
00048 case JetComb::kPhi : return wBoson(decay).phi();
00049 case JetComb::kTheta : return wBoson(decay).theta();
00050 };
00051 return -9999.;
00052 }
00053
00054 double TtSemiLepJetComb::bQuarkVar(JetComb::DecayType decay, JetComb::VarType var) const
00055 {
00056 switch(var){
00057 case JetComb::kMass : return -9999.;
00058 case JetComb::kPt : return bQuark(decay).p4().pt();
00059 case JetComb::kEta : return bQuark(decay).p4().eta();
00060 case JetComb::kPhi : return bQuark(decay).p4().phi();
00061 case JetComb::kTheta : return bQuark(decay).p4().theta();
00062 };
00063 return -9999.;
00064 }
00065
00066 double TtSemiLepJetComb::lightQVar(bool qbar, JetComb::VarType var) const
00067 {
00068 switch(var){
00069 case JetComb::kMass : return -9999.;
00070 case JetComb::kPt : return lightQ(qbar).p4().pt();
00071 case JetComb::kEta : return lightQ(qbar).p4().eta();
00072 case JetComb::kPhi : return lightQ(qbar).p4().phi();
00073 case JetComb::kTheta : return lightQ(qbar).p4().theta();
00074 };
00075 return -9999.;
00076 }
00077
00078 double TtSemiLepJetComb::leptonVar(JetComb::VarType var) const
00079 {
00080 switch(var){
00081 case JetComb::kMass : return -9999.;
00082 case JetComb::kPt : return lepton_.pt();
00083 case JetComb::kEta : return lepton_.eta();
00084 case JetComb::kPhi : return lepton_.phi();
00085 case JetComb::kTheta : return lepton_.theta();
00086 };
00087 return -9999.;
00088 }
00089
00090 double TtSemiLepJetComb::neutrinoVar(JetComb::VarType var) const
00091 {
00092 switch(var){
00093 case JetComb::kMass : return -9999.;
00094 case JetComb::kPt : return neutrino_.p4().pt();
00095 case JetComb::kEta : return neutrino_.p4().eta();
00096 case JetComb::kPhi : return neutrino_.p4().phi();
00097 case JetComb::kTheta : return neutrino_.p4().theta();
00098 };
00099 return -9999.;
00100 }
00101
00102 double TtSemiLepJetComb::compareHadTopLepTop(JetComb::CompType comp) const
00103 {
00104 switch(comp){
00105 case JetComb::kDeltaM : return top(JetComb::kHad).mass() - top(JetComb::kLep).mass();
00106 case JetComb::kDeltaR : return ROOT::Math::VectorUtil::DeltaR (top(JetComb::kHad), top(JetComb::kLep));
00107 case JetComb::kDeltaPhi : return fabs(ROOT::Math::VectorUtil::DeltaPhi(top(JetComb::kHad), top(JetComb::kLep)));
00108 case JetComb::kDeltaTheta : return ROOT::Math::VectorUtil::Angle (top(JetComb::kHad), top(JetComb::kLep));
00109 };
00110 return -9999.;
00111 }
00112
00113 double TtSemiLepJetComb::compareHadWLepW(JetComb::CompType comp) const
00114 {
00115 switch(comp){
00116 case JetComb::kDeltaM : return wBoson(JetComb::kHad).mass() - wBoson(JetComb::kLep).mass();
00117 case JetComb::kDeltaR : return ROOT::Math::VectorUtil::DeltaR (wBoson(JetComb::kHad), wBoson(JetComb::kLep));
00118 case JetComb::kDeltaPhi : return fabs(ROOT::Math::VectorUtil::DeltaPhi(wBoson(JetComb::kHad), wBoson(JetComb::kLep)));
00119 case JetComb::kDeltaTheta : return ROOT::Math::VectorUtil::Angle (wBoson(JetComb::kHad), wBoson(JetComb::kLep));
00120 };
00121 return -9999.;
00122 }
00123
00124 double TtSemiLepJetComb::compareHadBLepB(JetComb::CompType comp) const
00125 {
00126 switch(comp){
00127 case JetComb::kDeltaM : return -9999.;
00128 case JetComb::kDeltaR : return ROOT::Math::VectorUtil::DeltaR (bQuark(JetComb::kHad).p4(), bQuark(JetComb::kLep).p4());
00129 case JetComb::kDeltaPhi : return fabs(ROOT::Math::VectorUtil::DeltaPhi(bQuark(JetComb::kHad).p4(), bQuark(JetComb::kLep).p4()));
00130 case JetComb::kDeltaTheta : return ROOT::Math::VectorUtil::Angle (bQuark(JetComb::kHad).p4(), bQuark(JetComb::kLep).p4());
00131 };
00132 return -9999.;
00133 }
00134
00135 double TtSemiLepJetComb::compareLightQuarks(JetComb::CompType comp) const
00136 {
00137 switch(comp){
00138 case JetComb::kDeltaM : return -9999.;
00139 case JetComb::kDeltaR : return ROOT::Math::VectorUtil::DeltaR (lightQ().p4(), lightQ(true).p4());
00140 case JetComb::kDeltaPhi : return fabs(ROOT::Math::VectorUtil::DeltaPhi(lightQ().p4(), lightQ(true).p4()));
00141 case JetComb::kDeltaTheta : return ROOT::Math::VectorUtil::Angle (lightQ().p4(), lightQ(true).p4());
00142 };
00143 return -9999.;
00144 }
00145
00146 double TtSemiLepJetComb::compareLeptonNeutrino(JetComb::CompType comp) const
00147 {
00148 switch(comp){
00149 case JetComb::kDeltaM : return -9999.;
00150 case JetComb::kDeltaR : return ROOT::Math::VectorUtil::DeltaR (lepton_, neutrino_.p4());
00151 case JetComb::kDeltaPhi : return fabs(ROOT::Math::VectorUtil::DeltaPhi(lepton_, neutrino_.p4()));
00152 case JetComb::kDeltaTheta : return ROOT::Math::VectorUtil::Angle (lepton_, neutrino_.p4());
00153 };
00154 return -9999.;
00155 }
00156
00157 double TtSemiLepJetComb::compareTopW(JetComb::DecayType dec1, JetComb::DecayType dec2, JetComb::CompType comp) const
00158 {
00159 switch(comp){
00160 case JetComb::kDeltaM : return top(dec1).mass() - wBoson(dec2).mass();
00161 case JetComb::kDeltaR : return ROOT::Math::VectorUtil::DeltaR (top(dec1), wBoson(dec2));
00162 case JetComb::kDeltaPhi : return fabs(ROOT::Math::VectorUtil::DeltaPhi(top(dec1), wBoson(dec2)));
00163 case JetComb::kDeltaTheta : return ROOT::Math::VectorUtil::Angle (top(dec1), wBoson(dec2));
00164 };
00165 return -9999.;
00166 }
00167
00168 double TtSemiLepJetComb::compareTopB(JetComb::DecayType dec1, JetComb::DecayType dec2, JetComb::CompType comp) const
00169 {
00170 switch(comp){
00171 case JetComb::kDeltaM : return -9999.;
00172 case JetComb::kDeltaR : return ROOT::Math::VectorUtil::DeltaR (top(dec1), bQuark(dec2).p4());
00173 case JetComb::kDeltaPhi : return fabs(ROOT::Math::VectorUtil::DeltaPhi(top(dec1), bQuark(dec2).p4()));
00174 case JetComb::kDeltaTheta : return ROOT::Math::VectorUtil::Angle (top(dec1), bQuark(dec2).p4());
00175 };
00176 return -9999.;
00177 }
00178
00179 double TtSemiLepJetComb::compareWB(JetComb::DecayType dec1, JetComb::DecayType dec2, JetComb::CompType comp) const
00180 {
00181 switch(comp){
00182 case JetComb::kDeltaM : return -9999.;
00183 case JetComb::kDeltaR : return ROOT::Math::VectorUtil::DeltaR (wBoson(dec1), bQuark(dec2).p4());
00184 case JetComb::kDeltaPhi : return fabs(ROOT::Math::VectorUtil::DeltaPhi(wBoson(dec1), bQuark(dec2).p4()));
00185 case JetComb::kDeltaTheta : return ROOT::Math::VectorUtil::Angle (wBoson(dec1), bQuark(dec2).p4());
00186 };
00187 return -9999.;
00188 }
00189
00190 double TtSemiLepJetComb::compareTopLepton(JetComb::DecayType decay, JetComb::CompType comp) const
00191 {
00192 switch(comp){
00193 case JetComb::kDeltaM : return -9999.;
00194 case JetComb::kDeltaR : return ROOT::Math::VectorUtil::DeltaR (top(decay), lepton_);
00195 case JetComb::kDeltaPhi : return fabs(ROOT::Math::VectorUtil::DeltaPhi(top(decay), lepton_));
00196 case JetComb::kDeltaTheta : return ROOT::Math::VectorUtil::Angle (top(decay), lepton_);
00197 };
00198 return -9999.;
00199 }
00200
00201 double TtSemiLepJetComb::compareTopNeutrino(JetComb::DecayType decay, JetComb::CompType comp) const
00202 {
00203 switch(comp){
00204 case JetComb::kDeltaM : return -9999.;
00205 case JetComb::kDeltaR : return ROOT::Math::VectorUtil::DeltaR (top(decay), neutrino_.p4());
00206 case JetComb::kDeltaPhi : return fabs(ROOT::Math::VectorUtil::DeltaPhi(top(decay), neutrino_.p4()));
00207 case JetComb::kDeltaTheta : return ROOT::Math::VectorUtil::Angle (top(decay), neutrino_.p4());
00208 };
00209 return -9999.;
00210 }
00211
00212 double TtSemiLepJetComb::compareWLepton(JetComb::DecayType decay, JetComb::CompType comp) const
00213 {
00214 switch(comp){
00215 case JetComb::kDeltaM : return -9999.;
00216 case JetComb::kDeltaR : return ROOT::Math::VectorUtil::DeltaR (wBoson(decay), lepton_);
00217 case JetComb::kDeltaPhi : return fabs(ROOT::Math::VectorUtil::DeltaPhi(wBoson(decay), lepton_));
00218 case JetComb::kDeltaTheta : return ROOT::Math::VectorUtil::Angle (wBoson(decay), lepton_);
00219 };
00220 return -9999.;
00221 }
00222
00223 double TtSemiLepJetComb::compareWNeutrino(JetComb::DecayType decay, JetComb::CompType comp) const
00224 {
00225 switch(comp){
00226 case JetComb::kDeltaM : return -9999.;
00227 case JetComb::kDeltaR : return ROOT::Math::VectorUtil::DeltaR (wBoson(decay), neutrino_.p4());
00228 case JetComb::kDeltaPhi : return fabs(ROOT::Math::VectorUtil::DeltaPhi(wBoson(decay), neutrino_.p4()));
00229 case JetComb::kDeltaTheta : return ROOT::Math::VectorUtil::Angle (wBoson(decay), neutrino_.p4());
00230 };
00231 return -9999.;
00232 }
00233
00234 double TtSemiLepJetComb::compareBLepton(JetComb::DecayType decay, JetComb::CompType comp) const
00235 {
00236 switch(comp){
00237 case JetComb::kDeltaM : return -9999.;
00238 case JetComb::kDeltaR : return ROOT::Math::VectorUtil::DeltaR (bQuark(decay).p4(), lepton_);
00239 case JetComb::kDeltaPhi : return fabs(ROOT::Math::VectorUtil::DeltaPhi(bQuark(decay).p4(), lepton_));
00240 case JetComb::kDeltaTheta : return ROOT::Math::VectorUtil::Angle (bQuark(decay).p4(), lepton_);
00241 };
00242 return -9999.;
00243 }
00244
00245 double TtSemiLepJetComb::compareBNeutrino(JetComb::DecayType decay, JetComb::CompType comp) const
00246 {
00247 switch(comp){
00248 case JetComb::kDeltaM : return -9999.;
00249 case JetComb::kDeltaR : return ROOT::Math::VectorUtil::DeltaR (bQuark(decay).p4(), neutrino_.p4());
00250 case JetComb::kDeltaPhi : return fabs(ROOT::Math::VectorUtil::DeltaPhi(bQuark(decay).p4(), neutrino_.p4()));
00251 case JetComb::kDeltaTheta : return ROOT::Math::VectorUtil::Angle (bQuark(decay).p4(), neutrino_.p4());
00252 };
00253 return -9999.;
00254 }
00255
00256 double TtSemiLepJetComb::relativePtHadronicTop() const
00257 {
00258 return top(JetComb::kHad).pt()/(top(JetComb::kHad).pt() +
00259 (lightQ() .p4()+lightQ(true).p4()+bQuark(JetComb::kLep).p4()).pt() +
00260 (lightQ() .p4()+bQuark(JetComb::kHad).p4()+bQuark(JetComb::kLep).p4()).pt() +
00261 (bQuark(JetComb::kHad).p4()+lightQ(true).p4()+bQuark(JetComb::kLep).p4()).pt()
00262 );
00263 }
00264
00265 double TtSemiLepJetComb::bOverLightQPt() const
00266 {
00267 return (bQuark(JetComb::kHad).p4().pt()+bQuark(JetComb::kLep).p4().pt())/(lightQ().p4().pt()+lightQ(true).p4().pt());
00268 }
00269
00270 double TtSemiLepJetComb::combinedBTags(JetComb::BTagAlgo algo, JetComb::Operator op) const
00271 {
00272 switch(op){
00273 case JetComb::kAdd : return bTag(JetComb::kHad, algo) + bTag(JetComb::kLep, algo);
00274 case JetComb::kMult : return bTag(JetComb::kHad, algo) * bTag(JetComb::kLep, algo);
00275 };
00276 return -9999.;
00277 }
00278
00279 double TtSemiLepJetComb::combinedBTagsForLightQuarks(JetComb::BTagAlgo algo, JetComb::Operator op) const
00280 {
00281 switch(op){
00282 case JetComb::kAdd : return bTag(lightQ(), algo) + bTag(lightQ(true), algo);
00283 case JetComb::kMult : return bTag(lightQ(), algo) * bTag(lightQ(true), algo);
00284 };
00285 return -9999.;
00286 }
00287
00288
00289
00290
00291
00292 void
00293 TtSemiLepJetComb::deduceMothers()
00294 {
00295 hadW_ = hadQJet_.p4() + hadQBarJet_.p4();
00296 lepW_ = lepton_ + neutrino_ .p4();
00297 hadTop_ = hadW_ + hadBJet_ .p4();
00298 lepTop_ = lepW_ + lepBJet_ .p4();
00299 }
00300
00301 double TtSemiLepJetComb::bTag(const pat::Jet& jet, JetComb::BTagAlgo algo) const
00302 {
00303 switch(algo){
00304 case JetComb::kTrackCountHighEff : return jet.bDiscriminator("trackCountingHighEffBJetTags" );
00305 case JetComb::kTrackCountHighPur : return jet.bDiscriminator("trackCountingHighPurBJetTags" );
00306 case JetComb::kSoftMuon : return jet.bDiscriminator("softMuonBJetTags" );
00307 case JetComb::kSoftMuonByPt : return jet.bDiscriminator("softMuonByPtBJetTags" );
00308 case JetComb::kSofMuonByIP3d : return jet.bDiscriminator("softMuonByIP3dBJetTags" );
00309 case JetComb::kSoftElec : return jet.bDiscriminator("softElectronBJetTags" );
00310 case JetComb::kProbability : return jet.bDiscriminator("jetProbabilityBJetTags" );
00311 case JetComb::kBProbability : return jet.bDiscriminator("jetBProbabilityBJetTags" );
00312 case JetComb::kSimpleSecondVtx : return jet.bDiscriminator("simpleSecondaryVertexBJetTags" );
00313 case JetComb::kCombSecondVtx : return jet.bDiscriminator("combinedSecondaryVertexBJetTags" );
00314 case JetComb::kCombSecondVtxMVA : return jet.bDiscriminator("combinedSecondaryVertexMVABJetTags");
00315 };
00316 return -9999.;
00317 }