Go to the documentation of this file.00001 #include "AnalysisDataFormats/TopObjects/interface/TtSemiLepEvtPartons.h"
00002 #include "TopQuarkAnalysis/TopJetCombination/plugins/TtSemiLepHypWMassDeltaTopMass.h"
00003
00004 TtSemiLepHypWMassDeltaTopMass::TtSemiLepHypWMassDeltaTopMass(const edm::ParameterSet& cfg):
00005 TtSemiLepHypothesis( cfg ),
00006 maxNJets_ (cfg.getParameter<int> ("maxNJets" )),
00007 wMass_ (cfg.getParameter<double> ("wMass" )),
00008 useBTagging_ (cfg.getParameter<bool> ("useBTagging" )),
00009 bTagAlgorithm_ (cfg.getParameter<std::string>("bTagAlgorithm" )),
00010 minBDiscBJets_ (cfg.getParameter<double> ("minBDiscBJets" )),
00011 maxBDiscLightJets_ (cfg.getParameter<double> ("maxBDiscLightJets" )),
00012 neutrinoSolutionType_(cfg.getParameter<int> ("neutrinoSolutionType"))
00013 {
00014 if(maxNJets_<4 && maxNJets_!=-1)
00015 throw cms::Exception("WrongConfig")
00016 << "Parameter maxNJets can not be set to " << maxNJets_ << ". \n"
00017 << "It has to be larger than 4 or can be set to -1 to take all jets.";
00018 }
00019
00020 TtSemiLepHypWMassDeltaTopMass::~TtSemiLepHypWMassDeltaTopMass() { }
00021
00022 void
00023 TtSemiLepHypWMassDeltaTopMass::buildHypo(edm::Event& evt,
00024 const edm::Handle<edm::View<reco::RecoCandidate> >& leps,
00025 const edm::Handle<std::vector<pat::MET> >& mets,
00026 const edm::Handle<std::vector<pat::Jet> >& jets,
00027 std::vector<int>& match, const unsigned int iComb)
00028 {
00029 if(leps->empty() || mets->empty() || jets->size()<4){
00030
00031 return;
00032 }
00033
00034 int maxNJets = maxNJets_;
00035 if(maxNJets_ == -1 || (int)jets->size() < maxNJets_) maxNJets = jets->size();
00036
00037 std::vector<bool> isBJet;
00038 std::vector<bool> isLJet;
00039 int cntBJets = 0;
00040 if(useBTagging_) {
00041 for(int idx=0; idx<maxNJets; ++idx) {
00042 isBJet.push_back( ((*jets)[idx].bDiscriminator(bTagAlgorithm_) > minBDiscBJets_ ) );
00043 isLJet.push_back( ((*jets)[idx].bDiscriminator(bTagAlgorithm_) < maxBDiscLightJets_) );
00044 if((*jets)[idx].bDiscriminator(bTagAlgorithm_) > minBDiscBJets_ )cntBJets++;
00045 }
00046 }
00047
00048 match.clear();
00049 for(unsigned int i=0; i<5; ++i)
00050 match.push_back(-1);
00051
00052
00053
00054
00055 setCandidate(leps, 0, lepton_);
00056 match[TtSemiLepEvtPartons::Lepton] = 0;
00057
00058
00059
00060
00061 if(neutrinoSolutionType_ == -1)
00062 setCandidate(mets, 0, neutrino_);
00063 else
00064 setNeutrino(mets, leps, 0, neutrinoSolutionType_);
00065
00066
00067
00068
00069
00070 double wDist =-1.;
00071 std::vector<int> closestToWMassIndices;
00072 closestToWMassIndices.push_back(-1);
00073 closestToWMassIndices.push_back(-1);
00074 for(int idx=0; idx<maxNJets; ++idx){
00075 if(useBTagging_ && (!isLJet[idx] || (cntBJets<=2 && isBJet[idx]))) continue;
00076 for(int jdx=(idx+1); jdx<maxNJets; ++jdx){
00077 if(useBTagging_ && (!isLJet[jdx] || (cntBJets<=2 && isBJet[jdx]) || (cntBJets==3 && isBJet[idx] && isBJet[jdx]))) continue;
00078 reco::Particle::LorentzVector sum =
00079 (*jets)[idx].p4()+
00080 (*jets)[jdx].p4();
00081 if( wDist<0. || wDist>fabs(sum.mass()-wMass_) ){
00082 wDist=fabs(sum.mass()-wMass_);
00083 closestToWMassIndices.clear();
00084 closestToWMassIndices.push_back(idx);
00085 closestToWMassIndices.push_back(jdx);
00086 }
00087 }
00088 }
00089
00090
00091
00092
00093
00094
00095 double deltaTop=-1.;
00096 int hadB=-1;
00097 int lepB=-1;
00098 if( isValid(closestToWMassIndices[0], jets) && isValid(closestToWMassIndices[1], jets)) {
00099 reco::Particle::LorentzVector lepW = neutrino_->p4() + lepton_->p4();
00100 reco::Particle::LorentzVector hadW =
00101 (*jets)[closestToWMassIndices[0]].p4()+
00102 (*jets)[closestToWMassIndices[1]].p4();
00103
00104 for(int idx=0; idx<maxNJets; ++idx){
00105 if(useBTagging_ && !isBJet[idx]) continue;
00106
00107 if( idx!=closestToWMassIndices[0] && idx!=closestToWMassIndices[1] ){
00108 reco::Particle::LorentzVector hadTop = hadW + (*jets)[idx].p4();
00109
00110 for(int jdx=0; jdx<maxNJets; ++jdx){
00111 if(useBTagging_ && !isBJet[jdx]) continue;
00112
00113 if( jdx!=closestToWMassIndices[0] && jdx!=closestToWMassIndices[1] && jdx!=idx ){
00114 reco::Particle::LorentzVector lepTop = lepW + (*jets)[jdx].p4();
00115 if( deltaTop<0. || deltaTop>fabs(hadTop.mass()-lepTop.mass()) ){
00116 deltaTop=fabs(hadTop.mass()-lepTop.mass());
00117 hadB=idx;
00118 lepB=jdx;
00119 }
00120 }
00121 }
00122 }
00123 }
00124 }
00125
00126
00127
00128
00129 if( isValid(closestToWMassIndices[0], jets) ){
00130 setCandidate(jets, closestToWMassIndices[0], lightQ_, jetCorrectionLevel("wQuarkMix"));
00131 match[TtSemiLepEvtPartons::LightQ] = closestToWMassIndices[0];
00132 }
00133
00134 if( isValid(closestToWMassIndices[1], jets) ){
00135 setCandidate(jets, closestToWMassIndices[1], lightQBar_, jetCorrectionLevel("wQuarkMix"));
00136 match[TtSemiLepEvtPartons::LightQBar] = closestToWMassIndices[1];
00137 }
00138
00139 if( isValid(hadB, jets) ){
00140 setCandidate(jets, hadB, hadronicB_, jetCorrectionLevel("bQuark"));
00141 match[TtSemiLepEvtPartons::HadB] = hadB;
00142 }
00143
00144 if( isValid(lepB, jets) ){
00145 setCandidate(jets, lepB, leptonicB_, jetCorrectionLevel("bQuark"));
00146 match[TtSemiLepEvtPartons::LepB] = lepB;
00147 }
00148
00149 }