Go to the documentation of this file.00001 #include "CommonTools/CandUtils/interface/AddFourMomenta.h"
00002 #include "TopQuarkAnalysis/TopJetCombination/interface/TtFullHadHypothesis.h"
00003
00005 TtFullHadHypothesis::TtFullHadHypothesis(const edm::ParameterSet& cfg):
00006 jets_(cfg.getParameter<edm::InputTag>("jets")),
00007 lightQ_(0), lightQBar_(0), b_(0), bBar_(0), lightP_(0), lightPBar_(0)
00008 {
00009 getMatch_ = false;
00010 if( cfg.exists("match") ) {
00011 getMatch_ = true;
00012 match_ = cfg.getParameter<edm::InputTag>("match");
00013 }
00014 if( cfg.exists("jetCorrectionLevel") ) {
00015 jetCorrectionLevel_ = cfg.getParameter<std::string>("jetCorrectionLevel");
00016 }
00017 produces<std::vector<std::pair<reco::CompositeCandidate, std::vector<int> > > >();
00018 produces<int>("Key");
00019 }
00020
00022 TtFullHadHypothesis::~TtFullHadHypothesis()
00023 {
00024 if( lightQ_ ) delete lightQ_;
00025 if( lightQBar_ ) delete lightQBar_;
00026 if( b_ ) delete b_;
00027 if( bBar_ ) delete bBar_;
00028 if( lightP_ ) delete lightP_;
00029 if( lightPBar_ ) delete lightPBar_;
00030 }
00031
00033 void
00034 TtFullHadHypothesis::produce(edm::Event& evt, const edm::EventSetup& setup)
00035 {
00036 edm::Handle<std::vector<pat::Jet> > jets;
00037 evt.getByLabel(jets_, jets);
00038
00039 std::vector<std::vector<int> > matchVec;
00040 if( getMatch_ ) {
00041 edm::Handle<std::vector<std::vector<int> > > matchHandle;
00042 evt.getByLabel(match_, matchHandle);
00043 matchVec = *matchHandle;
00044 }
00045 else {
00046 std::vector<int> dummyMatch;
00047 for(unsigned int i = 0; i < 4; ++i)
00048 dummyMatch.push_back( -1 );
00049 matchVec.push_back( dummyMatch );
00050 }
00051
00052
00053 std::auto_ptr<std::vector<std::pair<reco::CompositeCandidate, std::vector<int> > > >
00054 pOut( new std::vector<std::pair<reco::CompositeCandidate, std::vector<int> > > );
00055 std::auto_ptr<int> pKey(new int);
00056
00057
00058 unsigned int idMatch = 0;
00059 typedef std::vector<std::vector<int> >::iterator MatchVecIterator;
00060 for(MatchVecIterator match = matchVec.begin(); match != matchVec.end(); ++match) {
00061
00062 resetCandidates();
00063
00064 buildHypo(evt, jets, *match, idMatch++);
00065 pOut->push_back( std::make_pair(hypo(), *match) );
00066 }
00067
00068 evt.put(pOut);
00069
00070
00071 buildKey();
00072 *pKey=key();
00073 evt.put(pKey, "Key");
00074 }
00075
00077 void
00078 TtFullHadHypothesis::resetCandidates()
00079 {
00080 lightQ_ = 0;
00081 lightQBar_ = 0;
00082 b_ = 0;
00083 bBar_ = 0;
00084 lightP_ = 0;
00085 lightPBar_ = 0;
00086 }
00087
00089 reco::CompositeCandidate
00090 TtFullHadHypothesis::hypo()
00091 {
00092
00093 if( !lightQ_ || !lightQBar_ || !b_ ||
00094 !bBar_ || !lightP_ || !lightPBar_ )
00095 return reco::CompositeCandidate();
00096
00097
00098 reco::CompositeCandidate hyp, top, w, topBar, wBar;
00099
00100 AddFourMomenta addFourMomenta;
00101
00102 wBar .addDaughter(*lightP_, TtFullHadDaughter::LightP );
00103 wBar .addDaughter(*lightPBar_, TtFullHadDaughter::LightPBar );
00104 addFourMomenta.set( wBar );
00105 topBar.addDaughter( wBar, TtFullHadDaughter::WMinus );
00106 topBar.addDaughter(*bBar_, TtFullHadDaughter::BBar );
00107 addFourMomenta.set( topBar );
00108
00109
00110 w .addDaughter(*lightQ_, TtFullHadDaughter::LightQ );
00111 w .addDaughter(*lightQBar_, TtFullHadDaughter::LightQBar );
00112 addFourMomenta.set( w );
00113 top.addDaughter( w, TtFullHadDaughter::WPlus );
00114 top.addDaughter(*b_, TtFullHadDaughter::B );
00115 addFourMomenta.set( top );
00116
00117
00118 hyp.addDaughter( topBar, TtFullHadDaughter::TopBar );
00119 hyp.addDaughter( top, TtFullHadDaughter::Top );
00120 addFourMomenta.set( hyp );
00121
00122 return hyp;
00123 }
00124
00126 std::string
00127 TtFullHadHypothesis::jetCorrectionLevel(const std::string& quarkType)
00128 {
00129
00130 if(jetCorrectionLevel_.empty())
00131 throw cms::Exception("Configuration")
00132 << "Unconfigured jetCorrectionLevel. Please use an appropriate, non-empty string.\n";
00133
00134
00135 if( !(quarkType=="wQuarkMix" ||
00136 quarkType=="udsQuark" ||
00137 quarkType=="cQuark" ||
00138 quarkType=="bQuark") )
00139 throw cms::Exception("Configuration")
00140 << quarkType << " is unknown as a quarkType for the jetCorrectionLevel.\n";
00141
00142
00143
00144
00145
00146 std::string level=jetCorrectionLevel_+":";
00147 if( level=="had:" || level=="ue:" || level=="part:" ){
00148 if(quarkType=="wQuarkMix"){level+="wMix";}
00149 if(quarkType=="udsQuark" ){level+="uds";}
00150 if(quarkType=="cQuark" ){level+="charm";}
00151 if(quarkType=="bQuark" ){level+="bottom";}
00152 }
00153 else{
00154 level+="none";
00155 }
00156 return level;
00157 }
00158
00160 void
00161 TtFullHadHypothesis::setCandidate(const edm::Handle<std::vector<pat::Jet> >& handle, const int& idx,
00162 reco::ShallowClonePtrCandidate*& clone, const std::string& correctionLevel)
00163 {
00164 edm::Ptr<pat::Jet> ptr = edm::Ptr<pat::Jet>(handle, idx);
00165
00166
00167 std::string step = correctionLevel.substr(0,correctionLevel.find(":"));
00168 std::string flavor = correctionLevel.substr(1+correctionLevel.find(":"));
00169 float corrFactor = 1.;
00170 if(flavor=="wMix")
00171 corrFactor = 0.75*ptr->jecFactor(step, "uds") + 0.25*ptr->jecFactor(step, "charm");
00172 else
00173 corrFactor = ptr->jecFactor(step, flavor);
00174 clone = new reco::ShallowClonePtrCandidate( ptr, ptr->charge(), ptr->p4()*corrFactor, ptr->vertex() );
00175 }