00001 #include "TopQuarkAnalysis/TopEventSelection/interface/TtDilepLRSignalSelObservables.h"
00002 #include "DataFormats/PatCandidates/interface/Jet.h"
00003 #include "DataFormats/Math/interface/deltaR.h"
00004 #include "DataFormats/Math/interface/deltaPhi.h"
00005 #include "DataFormats/Common/interface/Handle.h"
00006 #include "AnalysisDataFormats/TopObjects/interface/TtGenEvent.h"
00007
00008
00009
00010
00011 TtDilepLRSignalSelObservables::TtDilepLRSignalSelObservables(){
00012 count1=0; count2=0; count3=0;
00013 count4=0; count5=0; count3=0;
00014 }
00015
00016
00017 TtDilepLRSignalSelObservables::~TtDilepLRSignalSelObservables(){
00018 }
00019
00020 std::vector< TtDilepLRSignalSelObservables::IntBoolPair >
00021 TtDilepLRSignalSelObservables::operator() (TtDilepEvtSolution &solution,
00022 const edm::Event & iEvent, bool matchOnly)
00023 {
00024 evtselectVarVal.clear();
00025 evtselectVarMatch.clear();
00026
00027
00028 bool matchB1 = false;
00029 bool matchB2 = false;
00030 bool matchB = false;
00031 bool matchBbar = false;
00032 bool matchLeptPos = false;
00033 bool matchLeptNeg = false;
00034
00035 edm::Handle<TtGenEvent> genEvent;
00036 iEvent.getByLabel ("genEvt",genEvent);
00037
00038 if (!genEvent.failedToGet() && genEvent.isValid()) {
00039
00040 double dr, dr1, dr2;
00041
00042 if (genEvent->isFullLeptonic()) {
00043
00044 dr = DeltaR<reco::Particle, reco::GenParticle>()(solution.getLeptPos(), *(solution.getGenLepp()));
00045 matchLeptPos = (
00046 ( ((solution.getWpDecay()=="electron")&&(std::abs(solution.getGenLepp()->pdgId())==11))
00047 || ((solution.getWpDecay()=="muon")&&(std::abs(solution.getGenLepp()->pdgId())==13)) )
00048 && (dr < 0.1) );
00049
00050 dr = DeltaR<reco::Particle, reco::GenParticle>()(solution.getLeptNeg(), *(solution.getGenLepm()));
00051 matchLeptNeg = (
00052 ( ((solution.getWmDecay()=="electron")&&(std::abs(solution.getGenLepm()->pdgId())==11))
00053 || ((solution.getWmDecay()=="muon")&&(std::abs(solution.getGenLepm()->pdgId())==13)) )
00054 && (dr < 0.1) );
00055 }
00056
00057 if (genEvent->isSemiLeptonic()) {
00058 int id = genEvent->singleLepton()->pdgId();
00059
00060 if (id>0) {
00061 dr = DeltaR<reco::Particle, reco::GenParticle>()(solution.getLeptNeg(), *(genEvent->singleLepton()));
00062 matchLeptNeg = (
00063 ( ((solution.getWmDecay()=="electron") && (id==11))
00064 || ((solution.getWmDecay()=="muon") && (id==13)) )
00065 && (dr < 0.1) );
00066 } else {
00067 dr = DeltaR<reco::Particle, reco::GenParticle>()(solution.getLeptPos(), *(genEvent->singleLepton()));
00068 matchLeptPos = (
00069 ( ((solution.getWpDecay()=="electron")&& (id==-11))
00070 || ((solution.getWpDecay()=="muon") && (id==-13)) )
00071 && (dr < 0.1) );
00072 }
00073 }
00074
00075 if (genEvent->isTtBar() && genEvent->numberOfBQuarks()>1) {
00076 if (solution.getJetB().partonFlavour()==5) ++count1;
00077 if (solution.getJetBbar().partonFlavour()==5) ++count1;
00078
00079 dr1 = DeltaR<pat::Jet, reco::GenParticle>()(solution.getCalJetB(), *(genEvent->b()));
00080 dr2 = DeltaR<pat::Jet, reco::GenParticle>()(solution.getCalJetB(), *(genEvent->bBar()));
00081
00082 matchB1= ( (dr1<0.4) || (dr2<0.4));
00083 matchB = ( (solution.getJetB().partonFlavour()==5) && (dr1<0.4) );
00084 if (matchB) ++count3;
00085 matchB = ( (dr1<0.4) );
00086 if (dr1<0.5) ++count2;
00087 if (dr1<0.4) ++count4;
00088 if (dr1<0.3) ++count5;
00089
00090 dr1 = DeltaR<pat::Jet, reco::GenParticle>()(solution.getCalJetBbar(), *(genEvent->b()));
00091 dr2 = DeltaR<pat::Jet, reco::GenParticle>()(solution.getCalJetBbar(), *(genEvent->bBar()));
00092
00093 matchBbar = ( (solution.getJetBbar().partonFlavour()==5) && (dr2<0.4) );
00094 if (matchBbar) ++count3;
00095 matchBbar = ( (dr2<0.4) );
00096 matchB2 = ( (dr1<0.4) || (dr2<0.4));
00097 if (dr2<0.5) ++count2;
00098 if (dr2<0.4) ++count4;
00099 if (dr2<0.3) ++count5;
00100 }
00101
00102 }
00103
00104 edm::Handle<std::vector<pat::Jet> > jets;
00105 iEvent.getByLabel(jetSource_, jets);
00106
00107
00108
00109 double v1 = std::abs( solution.getJetB().p4().theta() - M_PI/2 );
00110 double v2 = std::abs( solution.getJetBbar().p4().theta() - M_PI/2 ) ;
00111 fillMinMax(v1, v2, 1, evtselectVarVal, matchB1, matchB2, evtselectVarMatch);
00112
00113
00114
00115 double pt1 = solution.getJetB().p4().pt();
00116 double pt2 = solution.getJetBbar().p4().pt();
00117 fillMinMax(pt1, pt2, 3, evtselectVarVal, matchB1, matchB2, evtselectVarMatch);
00118
00119
00120
00121 pt1 = solution.getLeptPos().p4().pt();
00122 pt2 = solution.getLeptNeg().p4().pt();
00123 fillMinMax(pt1, pt2, 5, evtselectVarVal, matchLeptPos, matchLeptNeg, evtselectVarMatch);
00124
00125
00126
00127 double deltaPhi = std::abs( delta(solution.getJetB().p4().phi(),
00128 solution.getJetBbar().p4().phi()) );
00129
00130 evtselectVarVal.push_back(IntDblPair(7, deltaPhi));
00131 evtselectVarMatch.push_back(IntBoolPair(7, matchB1&&matchB2));
00132
00133
00134
00135 double deltaTheta = std::abs( delta (solution.getJetBbar().p4().theta(),
00136 solution.getJetB().p4().theta() ) );
00137
00138 evtselectVarVal.push_back(IntDblPair(8, deltaTheta));
00139 evtselectVarMatch.push_back(IntBoolPair(8, matchB1&&matchB2));
00140
00141
00142
00143 double deltaPhi1 = std::abs ( delta( solution.getJetB().p4().phi(),
00144 solution.getLeptPos().p4().phi() ) );
00145 double deltaPhi2 = std::abs ( delta( solution.getJetBbar().p4().phi(),
00146 solution.getLeptNeg().p4().phi() ) );
00147
00148 fillMinMax(deltaPhi1, deltaPhi2, 9, evtselectVarVal,
00149 matchB&&matchLeptPos, matchBbar&&matchLeptNeg, evtselectVarMatch);
00150
00151
00152
00153 double deltaTheta1 = std::abs( solution.getJetB().p4().theta() -
00154 solution.getLeptPos().p4().theta() );
00155 double deltaTheta2 = std::abs( solution.getJetBbar().p4().theta() -
00156 solution.getLeptNeg().p4().theta() );
00157 fillMinMax(deltaTheta1, deltaTheta2, 11, evtselectVarVal,
00158 matchB&&matchLeptPos, matchBbar&&matchLeptNeg, evtselectVarMatch);
00159
00160
00161
00162 math::XYZTLorentzVector pp = solution.getLeptPos().p4() + solution.getLeptNeg().p4();
00163 double mass = pp.mass();
00164 evtselectVarVal.push_back(IntDblPair(13, mass));
00165 evtselectVarMatch.push_back(IntBoolPair(13, matchLeptNeg&&matchLeptPos));
00166
00167 evtselectVarVal.push_back(IntDblPair(13, mass));
00168 evtselectVarMatch.push_back(IntBoolPair(13, matchLeptNeg&&matchLeptPos));
00169
00170 std::vector <pat::Jet> jet3;
00171 for (int i=0;i<(int)jets->size();++i) {
00172 if ( ((*jets)[i].et()<solution.getJetB().et()) && ((*jets)[i].et()<solution.getJetBbar().et())) {jet3.push_back((*jets)[i]);
00173 }}
00174 double jet1Ratio = 0., jet2Ratio = 0.;
00175 if (jet3.size()>0) {
00176 jet1Ratio = jet3[0].et()/solution.getJetB().et();
00177 jet2Ratio = jet3[0].et()/solution.getJetBbar().et();
00178 }
00179 fillMinMax(jet1Ratio, jet2Ratio, 14, evtselectVarVal,
00180 matchB1, matchB2, evtselectVarMatch);
00181
00182 evtselectVarVal.push_back(IntDblPair(16, jets->size()));
00183 evtselectVarMatch.push_back(IntBoolPair(16, matchB&&matchBbar));
00184
00185
00186 if (!matchOnly) solution.setLRSignalEvtObservables(evtselectVarVal);
00187 return evtselectVarMatch;
00188 }
00189
00190 void TtDilepLRSignalSelObservables::fillMinMax
00191 (double v1, double v2, int obsNbr, std::vector< IntDblPair > & varList,
00192 bool match1, bool match2, std::vector< IntBoolPair > & matchList)
00193 {
00194 if (v1<v2) {
00195 varList.push_back(IntDblPair(obsNbr, v1));
00196 varList.push_back(IntDblPair(obsNbr+1, v2));
00197 matchList.push_back(IntBoolPair(obsNbr, match1));
00198 matchList.push_back(IntBoolPair(obsNbr+1, match2));
00199
00200 } else {
00201 varList.push_back(IntDblPair(obsNbr, v2));
00202 varList.push_back(IntDblPair(obsNbr+1, v1));
00203 matchList.push_back(IntBoolPair(obsNbr, match2));
00204 matchList.push_back(IntBoolPair(obsNbr+1, match1));
00205 }
00206 }
00207
00208 double TtDilepLRSignalSelObservables::delta(double phi1, double phi2)
00209 {
00210 double deltaPhi = phi1 - phi2;
00211 while (deltaPhi > M_PI) deltaPhi -= 2*M_PI;
00212 while (deltaPhi <= -M_PI) deltaPhi += 2*M_PI;
00213 return deltaPhi;
00214 }