Go to the documentation of this file.00001 #include "DQM/Physics/interface/TopDQMHelpers.h"
00002
00003 Calculate::Calculate(int maxNJets, double wMass):
00004 failed_(false), maxNJets_(maxNJets), wMass_(wMass), massWBoson_(-1.), massTopQuark_(-1.)
00005 {
00006 }
00007
00008 double
00009 Calculate::massWBoson(const std::vector<reco::Jet>& jets)
00010 {
00011 if(!failed_&& massWBoson_<0) operator()(jets); return massWBoson_;
00012 }
00013
00014 double
00015 Calculate::massTopQuark(const std::vector<reco::Jet>& jets)
00016 {
00017 if(!failed_&& massTopQuark_<0) operator()(jets); return massTopQuark_;
00018 }
00019
00020 void
00021 Calculate::operator()(const std::vector<reco::Jet>& jets)
00022 {
00023 if(maxNJets_<0) maxNJets_=jets.size();
00024 failed_= jets.size()<(unsigned int) maxNJets_;
00025 if( failed_){ return; }
00026
00027
00028
00029 double maxPt=-1.;
00030 std::vector<int> maxPtIndices;
00031 maxPtIndices.push_back(-1);
00032 maxPtIndices.push_back(-1);
00033 maxPtIndices.push_back(-1);
00034 for(int idx=0; idx<maxNJets_; ++idx){
00035 for(int jdx=0; jdx<maxNJets_; ++jdx){ if(jdx<=idx) continue;
00036 for(int kdx=0; kdx<maxNJets_; ++kdx){ if(kdx==idx || kdx==jdx) continue;
00037 reco::Particle::LorentzVector sum = jets[idx].p4()+jets[jdx].p4()+jets[kdx].p4();
00038 if( maxPt<0. || maxPt<sum.pt() ){
00039 maxPt=sum.pt();
00040 maxPtIndices.clear();
00041 maxPtIndices.push_back(idx);
00042 maxPtIndices.push_back(jdx);
00043 maxPtIndices.push_back(kdx);
00044 }
00045 }
00046 }
00047 }
00048 massTopQuark_= (jets[maxPtIndices[0]].p4()+
00049 jets[maxPtIndices[1]].p4()+
00050 jets[maxPtIndices[2]].p4()).mass();
00051
00052
00053
00054 double wDist =-1.;
00055 std::vector<int> wMassIndices;
00056 wMassIndices.push_back(-1);
00057 wMassIndices.push_back(-1);
00058 for(unsigned idx=0; idx<maxPtIndices.size(); ++idx){
00059 for(unsigned jdx=0; jdx<maxPtIndices.size(); ++jdx){
00060 if( jdx==idx || maxPtIndices[idx]>maxPtIndices[jdx] ) continue;
00061 reco::Particle::LorentzVector sum = jets[maxPtIndices[idx]].p4()+jets[maxPtIndices[jdx]].p4();
00062 if( wDist<0. || wDist>fabs(sum.mass()-wMass_) ){
00063 wDist=fabs(sum.mass()-wMass_);
00064 wMassIndices.clear();
00065 wMassIndices.push_back(maxPtIndices[idx]);
00066 wMassIndices.push_back(maxPtIndices[jdx]);
00067 }
00068 }
00069 }
00070 massWBoson_= (jets[wMassIndices[0]].p4()+
00071 jets[wMassIndices[1]].p4()).mass();
00072 }