00001 #include "CommonTools/CandUtils/interface/AddFourMomenta.h"
00002 #include "TopQuarkAnalysis/TopJetCombination/interface/TtFullLepHypothesis.h"
00003
00005 TtFullLepHypothesis::TtFullLepHypothesis(const edm::ParameterSet& cfg):
00006 elecs_(cfg.getParameter<edm::InputTag>("electrons")),
00007 mus_ (cfg.getParameter<edm::InputTag>("muons")),
00008 jets_ (cfg.getParameter<edm::InputTag>("jets")),
00009 mets_ (cfg.getParameter<edm::InputTag>("mets")),
00010
00011 lepton_(0), leptonBar_(0), b_(0),
00012 bBar_(0), neutrino_(0), neutrinoBar_(0)
00013 {
00014 getMatch_ = false;
00015 if( cfg.exists("match") ) {
00016 getMatch_ = true;
00017 match_ = cfg.getParameter<edm::InputTag>("match");
00018 }
00019
00020 jetCorrectionLevel_ = "abs";
00021 if( cfg.exists("jetCorrectionLevel") ) {
00022 jetCorrectionLevel_ = cfg.getParameter<std::string>("jetCorrectionLevel");
00023 }
00024 else{
00025 jetCorrectionLevel_ = "abs";
00026 }
00027 produces<std::vector<std::pair<reco::CompositeCandidate, std::vector<int> > > >();
00028 produces<int>("Key");
00029 }
00030
00032 TtFullLepHypothesis::~TtFullLepHypothesis()
00033 {
00034 if( lepton_ ) delete lepton_;
00035 if( leptonBar_ ) delete leptonBar_;
00036 if( b_ ) delete b_;
00037 if( bBar_ ) delete bBar_;
00038 if( neutrino_ ) delete neutrino_;
00039 if( neutrinoBar_ ) delete neutrinoBar_;
00040
00041 }
00042
00044 void
00045 TtFullLepHypothesis::produce(edm::Event& evt, const edm::EventSetup& setup)
00046 {
00047 edm::Handle<std::vector<pat::Electron> > elecs;
00048 evt.getByLabel(elecs_, elecs);
00049
00050 edm::Handle<std::vector<pat::Muon> > mus;
00051 evt.getByLabel(mus_, mus);
00052
00053 edm::Handle<std::vector<pat::Jet> > jets;
00054 evt.getByLabel(jets_, jets);
00055
00056 edm::Handle<std::vector<pat::MET> > mets;
00057 evt.getByLabel(mets_, mets);
00058
00059 std::vector<std::vector<int> > matchVec;
00060 if( getMatch_ ) {
00061 edm::Handle<std::vector<std::vector<int> > > matchHandle;
00062 evt.getByLabel(match_, matchHandle);;
00063 matchVec = *matchHandle;
00064 }
00065 else {
00066 std::vector<int> dummyMatch;
00067 for(unsigned int i = 0; i < 4; ++i)
00068 dummyMatch.push_back( -1 );
00069 matchVec.push_back( dummyMatch );
00070 }
00071
00072
00073 std::auto_ptr<std::vector<std::pair<reco::CompositeCandidate, std::vector<int> > > >
00074 pOut( new std::vector<std::pair<reco::CompositeCandidate, std::vector<int> > > );
00075 std::auto_ptr<int> pKey(new int);
00076
00077
00078 buildKey();
00079 *pKey=key();
00080 evt.put(pKey, "Key");
00081
00082
00083 unsigned int idMatch = 0;
00084 typedef std::vector<std::vector<int> >::iterator MatchVecIterator;
00085 for(MatchVecIterator match = matchVec.begin(); match != matchVec.end(); ++match) {
00086
00087 resetCandidates();
00088
00089 buildHypo(evt, elecs, mus, jets, mets, *match, idMatch++);
00090 pOut->push_back( std::make_pair(hypo(), *match) );
00091 }
00092
00093 evt.put(pOut);
00094 }
00095
00097 void
00098 TtFullLepHypothesis::resetCandidates()
00099 {
00100 lepton_ = 0;
00101 leptonBar_ = 0;
00102 b_ = 0;
00103 bBar_ = 0;
00104 neutrino_ = 0;
00105 neutrinoBar_= 0;
00106
00107 }
00108
00110 reco::CompositeCandidate
00111 TtFullLepHypothesis::hypo()
00112 {
00113
00114 if( !lepton_ || !leptonBar_ || !b_ || !bBar_ ){
00115 return reco::CompositeCandidate();
00116 }
00117
00118 if( key()==TtFullLeptonicEvent::kGenMatch && (!recNu || !recNuBar) ){
00119 edm::LogWarning("TtFullHypothesis") << "no neutrinos for gen match" << std::endl;
00120 return reco::CompositeCandidate();
00121 }
00122 if( key()==TtFullLeptonicEvent::kKinSolution && (!neutrino_ || !neutrinoBar_) ){
00123 edm::LogWarning("TtFullHypothesis") << "no neutrinos for kin solution" << std::endl;
00124 return reco::CompositeCandidate();
00125 }
00126
00127
00128 reco::CompositeCandidate hyp, Top, WPlus, TopBar, WMinus;
00129
00130 AddFourMomenta addFourMomenta;
00131
00132
00133 WPlus.addDaughter(*leptonBar_, TtFullLepDaughter::LepBar);
00134 if(key()==TtFullLeptonicEvent::kKinSolution)
00135 WPlus.addDaughter(*neutrino_, TtFullLepDaughter::Nu);
00136 else if(key()==TtFullLeptonicEvent::kGenMatch)
00137 WPlus.addDaughter(*recNu, TtFullLepDaughter::Nu);
00138 addFourMomenta.set(WPlus);
00139 Top.addDaughter(WPlus, TtFullLepDaughter::WPlus);
00140 Top.addDaughter(*b_,TtFullLepDaughter::B);
00141 addFourMomenta.set(Top);
00142
00143
00144 WMinus.addDaughter(*lepton_, TtFullLepDaughter::Lep);
00145 if(key()==TtFullLeptonicEvent::kKinSolution)
00146 WMinus.addDaughter(*neutrinoBar_, TtFullLepDaughter::NuBar);
00147 else if(key()==TtFullLeptonicEvent::kGenMatch)
00148 WMinus.addDaughter(*recNuBar, TtFullLepDaughter::NuBar);
00149 addFourMomenta.set(WMinus);
00150 TopBar.addDaughter(WMinus, TtFullLepDaughter::WMinus);
00151 TopBar.addDaughter(*bBar_, TtFullLepDaughter::BBar);
00152 addFourMomenta.set(TopBar);
00153
00154
00155 hyp.addDaughter(Top, TtFullLepDaughter::Top);
00156 hyp.addDaughter(TopBar, TtFullLepDaughter::TopBar);
00157 addFourMomenta.set( hyp );
00158
00159
00160
00161
00162 return hyp;
00163 }
00164
00166 void
00167 TtFullLepHypothesis::setCandidate(const edm::Handle<std::vector<pat::Jet> >& handle, const int& idx, reco::ShallowClonePtrCandidate*& clone, const std::string& correctionLevel)
00168 {
00169 edm::Ptr<pat::Jet> ptr = edm::Ptr<pat::Jet>(handle, idx);
00170 clone = new reco::ShallowClonePtrCandidate( ptr, ptr->charge(), ptr->correctedJet(jetCorrectionLevel_, "bottom").p4(), ptr->vertex() );
00171 }