CMS 3D CMS Logo

TtSemiLepHypothesis.cc
Go to the documentation of this file.
6 
8 
11  : jetsToken_(consumes<std::vector<pat::Jet> >(cfg.getParameter<edm::InputTag>("jets"))),
12  lepsToken_(consumes<edm::View<reco::RecoCandidate> >(cfg.getParameter<edm::InputTag>("leps"))),
13  metsToken_(consumes<std::vector<pat::MET> >(cfg.getParameter<edm::InputTag>("mets"))),
14  nJetsConsideredToken_(consumes<int>(cfg.getParameter<edm::InputTag>("nJetsConsidered"))),
15  numberOfRealNeutrinoSolutions_(-1),
16  lightQ_(nullptr),
17  lightQBar_(nullptr),
18  hadronicB_(nullptr),
19  leptonicB_(nullptr),
20  neutrino_(nullptr),
21  lepton_(nullptr) {
22  getMatch_ = false;
23  if (cfg.exists("match")) {
24  getMatch_ = true;
25  matchToken_ = consumes<std::vector<std::vector<int> > >(cfg.getParameter<edm::InputTag>("match"));
26  }
27  if (cfg.exists("neutrinoSolutionType"))
28  neutrinoSolutionType_ = cfg.getParameter<int>("neutrinoSolutionType");
29  else
31  if (cfg.exists("jetCorrectionLevel")) {
32  jetCorrectionLevel_ = cfg.getParameter<std::string>("jetCorrectionLevel");
33  }
34  produces<std::vector<std::pair<reco::CompositeCandidate, std::vector<int> > > >();
35  produces<int>("Key");
36  produces<int>("NumberOfRealNeutrinoSolutions");
37  produces<int>("NumberOfConsideredJets");
38 }
39 
42  if (lightQ_)
43  delete lightQ_;
44  if (lightQBar_)
45  delete lightQBar_;
46  if (hadronicB_)
47  delete hadronicB_;
48  if (leptonicB_)
49  delete leptonicB_;
50  if (neutrino_)
51  delete neutrino_;
52  if (lepton_)
53  delete lepton_;
54 }
55 
60 
63 
66 
69 
70  std::vector<std::vector<int> > matchVec;
71  if (getMatch_) {
73  evt.getByToken(matchToken_, matchHandle);
74  matchVec = *matchHandle;
75  } else {
76  std::vector<int> dummyMatch;
77  for (unsigned int i = 0; i < 4; ++i)
78  dummyMatch.push_back(-1);
79  matchVec.push_back(dummyMatch);
80  }
81 
82  // declare unique_ptr for products
83  std::unique_ptr<std::vector<std::pair<reco::CompositeCandidate, std::vector<int> > > > pOut(
84  new std::vector<std::pair<reco::CompositeCandidate, std::vector<int> > >);
85  std::unique_ptr<int> pKey(new int);
86  std::unique_ptr<int> pNeutrinoSolutions(new int);
87  std::unique_ptr<int> pJetsConsidered(new int);
88 
89  // go through given vector of jet combinations
90  unsigned int idMatch = 0;
91  typedef std::vector<std::vector<int> >::iterator MatchVecIterator;
92  for (MatchVecIterator match = matchVec.begin(); match != matchVec.end(); ++match) {
93  // reset pointers
95  // build hypothesis
96  buildHypo(evt, leps, mets, jets, *match, idMatch++);
97  pOut->push_back(std::make_pair(hypo(), *match));
98  }
99  // feed out hyps and matches
100  evt.put(std::move(pOut));
101 
102  // build and feed out key
103  buildKey();
104  *pKey = key();
105  evt.put(std::move(pKey), "Key");
106 
107  // feed out number of real neutrino solutions
108  *pNeutrinoSolutions = numberOfRealNeutrinoSolutions_;
109  evt.put(std::move(pNeutrinoSolutions), "NumberOfRealNeutrinoSolutions");
110 
111  // feed out number of considered jets
112  *pJetsConsidered = *nJetsConsidered;
113  evt.put(std::move(pJetsConsidered), "NumberOfConsideredJets");
114 }
115 
119  lightQ_ = nullptr;
120  lightQBar_ = nullptr;
121  hadronicB_ = nullptr;
122  leptonicB_ = nullptr;
123  neutrino_ = nullptr;
124  lepton_ = nullptr;
125 }
126 
129  // check for sanity of the hypothesis
130  if (!lightQ_ || !lightQBar_ || !hadronicB_ || !leptonicB_ || !neutrino_ || !lepton_)
131  return reco::CompositeCandidate();
132 
133  // setup transient references
134  reco::CompositeCandidate hyp, hadTop, hadW, lepTop, lepW;
135 
136  AddFourMomenta addFourMomenta;
137  // build up the top branch that decays leptonically
140  addFourMomenta.set(lepW);
141  lepTop.addDaughter(lepW, TtSemiLepDaughter::LepW);
143  addFourMomenta.set(lepTop);
144 
145  // build up the top branch that decays hadronically
148  addFourMomenta.set(hadW);
149  hadTop.addDaughter(hadW, TtSemiLepDaughter::HadW);
151  addFourMomenta.set(hadTop);
152 
153  // build ttbar hypotheses
156  addFourMomenta.set(hyp);
157 
158  return hyp;
159 }
160 
163  // check whetherwe are dealing with a reco muon or a reco electron
165  if (dynamic_cast<const reco::Muon*>(cand)) {
167  } else if (dynamic_cast<const reco::GsfElectron*>(cand)) {
169  }
170  return type;
171 }
172 
175  // jetCorrectionLevel was not configured
176  if (jetCorrectionLevel_.empty())
177  throw cms::Exception("Configuration")
178  << "Unconfigured jetCorrectionLevel. Please use an appropriate, non-empty string.\n";
179 
180  // quarkType is unknown
181  if (!(quarkType == "wQuarkMix" || quarkType == "udsQuark" || quarkType == "cQuark" || quarkType == "bQuark"))
182  throw cms::Exception("Configuration") << quarkType << " is unknown as a quarkType for the jetCorrectionLevel.\n";
183 
184  // combine correction level; start with a ':' even if
185  // there is no flavor tag to be added, as it is needed
186  // by setCandidate to disentangle the correction tag
187  // from a potential flavor tag, which can be empty
189  if (level == "L5Flavor:" || level == "L6UE:" || level == "L7Parton:") {
190  if (quarkType == "wQuarkMix") {
191  level += "wMix";
192  }
193  if (quarkType == "udsQuark") {
194  level += "uds";
195  }
196  if (quarkType == "cQuark") {
197  level += "charm";
198  }
199  if (quarkType == "bQuark") {
200  level += "bottom";
201  }
202  } else {
203  level += "none";
204  }
205  return level;
206 }
207 
209 void TtSemiLepHypothesis::setCandidate(const edm::Handle<std::vector<pat::Jet> >& handle,
210  const int& idx,
212  const std::string& correctionLevel) {
214  // disentangle the correction from the potential flavor tag
215  // by the separating ':'; the flavor tag can be empty though
216  std::string step = correctionLevel.substr(0, correctionLevel.find(":"));
217  std::string flavor = correctionLevel.substr(1 + correctionLevel.find(":"));
218  float corrFactor = 1.;
219  if (flavor == "wMix")
220  corrFactor = 0.75 * ptr->jecFactor(step, "uds") + 0.25 * ptr->jecFactor(step, "charm");
221  else
222  corrFactor = ptr->jecFactor(step, flavor);
223  clone = new reco::ShallowClonePtrCandidate(ptr, ptr->charge(), ptr->p4() * corrFactor, ptr->vertex());
224 }
225 
227 void TtSemiLepHypothesis::setNeutrino(const edm::Handle<std::vector<pat::MET> >& met,
229  const int& idx,
230  const int& type) {
232  MEzCalculator mez;
233  mez.SetMET(*(met->begin()));
234  if (leptonType(&(leps->front())) == WDecay::kMuon)
235  mez.SetLepton((*leps)[idx], true);
236  else if (leptonType(&(leps->front())) == WDecay::kElec)
237  mez.SetLepton((*leps)[idx], false);
238  else
239  throw cms::Exception("UnimplementedFeature")
240  << "Type of lepton given together with MET for solving neutrino kinematics is neither muon nor electron.\n";
241  double pz = mez.Calculate(type);
244  ptr->px(), ptr->py(), pz, sqrt(ptr->px() * ptr->px() + ptr->py() * ptr->py() + pz * pz));
245  neutrino_ = new reco::ShallowClonePtrCandidate(ptr, ptr->charge(), p4, ptr->vertex());
246 }
247 
250  const edm::Handle<std::vector<pat::MET> >& mets,
251  const edm::Handle<std::vector<pat::Jet> >& jets,
252  std::vector<int>& match) {
253  // -----------------------------------------------------
254  // add jets
255  // -----------------------------------------------------
256  for (unsigned idx = 0; idx < match.size(); ++idx) {
257  if (isValid(match[idx], jets)) {
258  switch (idx) {
261  break;
264  break;
267  break;
270  break;
271  }
272  }
273  }
274 
275  // -----------------------------------------------------
276  // add lepton
277  // -----------------------------------------------------
278  if (leps->empty())
279  return;
281  match.push_back(0);
282 
283  // -----------------------------------------------------
284  // add neutrino
285  // -----------------------------------------------------
286  if (mets->empty())
287  return;
288  if (neutrinoSolutionType_ == -1)
290  else
292 }
personalPlayback.level
level
Definition: personalPlayback.py:22
TtSemiLepDaughter::LepW
static const std::string LepW
Definition: TtSemiLeptonicEvent.h:9
TtSemiLepDaughter::Nu
static const std::string Nu
Definition: TtSemiLeptonicEvent.h:9
mps_fire.i
i
Definition: mps_fire.py:355
TtSemiLepHypothesis::jetsToken_
edm::EDGetTokenT< std::vector< pat::Jet > > jetsToken_
input label for all necessary collections
Definition: TtSemiLepHypothesis.h:95
TtSemiLepEvtPartons::LightQBar
Definition: TtSemiLepEvtPartons.h:25
TtSemiLepHypothesis::hypo
reco::CompositeCandidate hypo()
return event hypothesis
Definition: TtSemiLepHypothesis.cc:128
step
step
Definition: StallMonitor.cc:94
sistrip::View
View
Definition: ConstantsForView.h:26
TtSemiLepEvtPartons::LepB
Definition: TtSemiLepEvtPartons.h:25
patZpeak.handle
handle
Definition: patZpeak.py:23
edm
HLT enums.
Definition: AlignableModifier.h:19
Muon.h
TtSemiLepDaughter::Lep
static const std::string Lep
Definition: TtSemiLeptonicEvent.h:9
TtSemiLepHypothesis::neutrinoSolutionType_
int neutrinoSolutionType_
algorithm used to calculate neutrino solutions (see cfi for further details)
Definition: TtSemiLepHypothesis.h:106
TtSemiLepHypothesis::buildKey
virtual void buildKey()=0
build the event hypothesis key
singleTopDQM_cfi.jets
jets
Definition: singleTopDQM_cfi.py:42
reco
fixed size matrix
Definition: AlignmentAlgorithmBase.h:45
singleTopDQM_cfi.mets
mets
Definition: singleTopDQM_cfi.py:43
TtSemiLepEvtPartons.h
MEzCalculator
Definition: MEzCalculator.h:18
edm::Handle
Definition: AssociativeIterator.h:50
training_settings.idx
idx
Definition: training_settings.py:16
TtSemiLepHypothesis::getMatch_
bool getMatch_
Definition: TtSemiLepHypothesis.h:93
TtSemiLepHypothesis::setNeutrino
void setNeutrino(const edm::Handle< std::vector< pat::MET > > &met, const edm::Handle< edm::View< reco::RecoCandidate > > &leps, const int &idx, const int &type)
set neutrino, using mW = 80.4 to calculate the neutrino pz
Definition: TtSemiLepHypothesis.cc:227
singleTopDQM_cfi.setup
setup
Definition: singleTopDQM_cfi.py:37
TtSemiLepHypothesis::setCandidate
void setCandidate(const edm::Handle< C > &handle, const int &idx, reco::ShallowClonePtrCandidate *&clone)
use one object in a collection to set a ShallowClonePtrCandidate
Definition: TtSemiLepHypothesis.h:123
BTaggingMonitor_cfi.met
met
Definition: BTaggingMonitor_cfi.py:84
TtSemiLepHitFitProducer_Electrons_cfi.leps
leps
Definition: TtSemiLepHitFitProducer_Electrons_cfi.py:5
TtSemiLepDaughter::HadP
static const std::string HadP
Definition: TtSemiLeptonicEvent.h:10
TtSemiLepDaughter::HadQ
static const std::string HadQ
Definition: TtSemiLeptonicEvent.h:10
Jet
Definition: Jet.py:1
clone
TEveGeoShape * clone(const TEveElement *element, TEveElement *parent)
Definition: eve_macros.cc:135
reco::LeafCandidate::py
double py() const final
y coordinate of momentum vector
Definition: LeafCandidate.h:142
mathSSE::sqrt
T sqrt(T t)
Definition: SSEVec.h:19
MEzCalculator.h
MEzCalculator::SetLepton
void SetLepton(const pat::Particle &lepton, bool isMuon=true)
Set lepton.
Definition: MEzCalculator.h:31
edm::Event::getByToken
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:528
TtSemiLepHypothesis::leptonicB_
reco::ShallowClonePtrCandidate * leptonicB_
Definition: TtSemiLepHypothesis.h:115
MEzCalculator::IsComplex
bool IsComplex() const
check for complex root
Definition: MEzCalculator.h:51
reco::CompositeCandidate::addDaughter
void addDaughter(const Candidate &, const std::string &s="")
add a clone of the passed candidate as daughter
Definition: CompositeCandidate.cc:108
TtSemiLepDaughter::LepTop
static const std::string LepTop
Definition: TtSemiLeptonicEvent.h:9
AlCaHLTBitMon_QueryRunRegistry.string
string
Definition: AlCaHLTBitMon_QueryRunRegistry.py:256
TtSemiLepHypothesis::lepsToken_
edm::EDGetTokenT< edm::View< reco::RecoCandidate > > lepsToken_
Definition: TtSemiLepHypothesis.h:96
TtSemiLepHypothesis::lightQBar_
reco::ShallowClonePtrCandidate * lightQBar_
Definition: TtSemiLepHypothesis.h:113
edm::View
Definition: CaloClusterFwd.h:14
HLT_2018_cff.InputTag
InputTag
Definition: HLT_2018_cff.py:79016
edm::ParameterSet
Definition: ParameterSet.h:36
TtSemiLepHypothesis::matchToken_
edm::EDGetTokenT< std::vector< std::vector< int > > > matchToken_
Definition: TtSemiLepHypothesis.h:98
MEzCalculator::Calculate
double Calculate(int type=1)
member functions
Definition: MEzCalculator.cc:14
TtSemiLepEvtPartons::HadB
Definition: TtSemiLepEvtPartons.h:25
TtSemiLepHypothesis::produce
void produce(edm::Event &, const edm::EventSetup &) override
produce the event hypothesis as CompositeCandidate and Key
Definition: TtSemiLepHypothesis.cc:57
match
std::pair< typename Association::data_type::first_type, double > match(Reference key, Association association, bool bestMatchByMaxValue)
Generic matching function.
Definition: Utils.h:10
cand
Definition: decayParser.h:34
AddFourMomenta.h
TtSemiLepEvtPartons::LightQ
Definition: TtSemiLepEvtPartons.h:25
createfilelist.int
int
Definition: createfilelist.py:10
TtSemiLepHypothesis::lightQ_
reco::ShallowClonePtrCandidate * lightQ_
Definition: TtSemiLepHypothesis.h:112
reco::LeafCandidate::p4
const LorentzVector & p4() const final
four-momentum Lorentz vector
Definition: LeafCandidate.h:114
p4
double p4[4]
Definition: TauolaWrapper.h:92
edm::Event::put
OrphanHandle< PROD > put(std::unique_ptr< PROD > product)
Put a new product.
Definition: Event.h:132
TtSemiLepHypothesis::~TtSemiLepHypothesis
~TtSemiLepHypothesis() override
default destructor
Definition: TtSemiLepHypothesis.cc:41
reco::LeafCandidate::charge
int charge() const final
electric charge
Definition: LeafCandidate.h:106
TtSemiLepHypothesis::jetCorrectionLevel
std::string jetCorrectionLevel(const std::string &quarkType)
helper function to construct the proper correction level string for corresponding quarkType
Definition: TtSemiLepHypothesis.cc:174
edm::EventSetup
Definition: EventSetup.h:57
pat
Definition: HeavyIon.h:7
reco::RecoCandidate
Definition: RecoCandidate.h:20
TtSemiLepDaughter::HadW
static const std::string HadW
Definition: TtSemiLeptonicEvent.h:10
TtSemiLepHypothesis::jetCorrectionLevel_
std::string jetCorrectionLevel_
Definition: TtSemiLepHypothesis.h:102
reco::LeafCandidate::vertex
const Point & vertex() const override
vertex position (overwritten by PF...)
Definition: LeafCandidate.h:165
edm::Ptr< pat::Jet >
looper.cfg
cfg
Definition: looper.py:297
TtSemiLepHypGenMatch_cfi.nJetsConsidered
nJetsConsidered
number of considered jets
Definition: TtSemiLepHypGenMatch_cfi.py:16
WDecay::LeptonType
LeptonType
Definition: TopGenEvent.h:27
MEzCalculator::SetMET
void SetMET(const pat::MET &MET)
Set MET.
Definition: MEzCalculator.h:25
TtSemiLepHypothesis::hadronicB_
reco::ShallowClonePtrCandidate * hadronicB_
Definition: TtSemiLepHypothesis.h:114
WDecay::kNone
Definition: TopGenEvent.h:27
TtSemiLepDaughter::LepB
static const std::string LepB
Definition: TtSemiLeptonicEvent.h:9
type
type
Definition: HCALResponse.h:21
eostools.move
def move(src, dest)
Definition: eostools.py:511
std
Definition: JetResolutionObject.h:76
TtSemiLepDaughter::HadTop
static const std::string HadTop
Definition: TtSemiLeptonicEvent.h:10
WDecay::kMuon
Definition: TopGenEvent.h:27
math::XYZTLorentzVector
XYZTLorentzVectorD XYZTLorentzVector
Lorentz vector with cylindrical internal representation using pseudorapidity.
Definition: LorentzVector.h:29
TtSemiLepHypothesis::key
int key() const
Definition: TtSemiLepHypothesis.h:65
Exception
Definition: hltDiff.cc:246
AddFourMomenta::set
void set(reco::Candidate &c) const
set up a candidate
Definition: AddFourMomenta.cc:6
MET
TtSemiLepHypothesis::metsToken_
edm::EDGetTokenT< std::vector< pat::MET > > metsToken_
Definition: TtSemiLepHypothesis.h:97
Electron.h
TtSemiLepHypothesis::lepton_
reco::ShallowClonePtrCandidate * lepton_
Definition: TtSemiLepHypothesis.h:117
cms::Exception
Definition: Exception.h:70
AddFourMomenta
Definition: AddFourMomenta.h:18
TtSemiLepHypothesis::nJetsConsideredToken_
edm::EDGetTokenT< int > nJetsConsideredToken_
Definition: TtSemiLepHypothesis.h:99
reco::ShallowClonePtrCandidate
Definition: ShallowClonePtrCandidate.h:15
TtSemiLepHypothesis::TtSemiLepHypothesis
TtSemiLepHypothesis(const edm::ParameterSet &)
default constructor
Definition: TtSemiLepHypothesis.cc:10
WDecay::kElec
Definition: TopGenEvent.h:27
edm::Event
Definition: Event.h:73
TtSemiLepDaughter::HadB
static const std::string HadB
Definition: TtSemiLeptonicEvent.h:10
reco::LeafCandidate::px
double px() const final
x coordinate of momentum vector
Definition: LeafCandidate.h:140
TtSemiLepHypothesis::neutrino_
reco::ShallowClonePtrCandidate * neutrino_
Definition: TtSemiLepHypothesis.h:116
edm::InputTag
Definition: InputTag.h:15
TtSemiLepHypothesis::numberOfRealNeutrinoSolutions_
int numberOfRealNeutrinoSolutions_
Definition: TtSemiLepHypothesis.h:109
TtSemiLepHypothesis::buildHypo
void buildHypo(const edm::Handle< edm::View< reco::RecoCandidate > > &leps, const edm::Handle< std::vector< pat::MET > > &mets, const edm::Handle< std::vector< pat::Jet > > &jets, std::vector< int > &jetPartonAssociation)
minimalistic build function for simple hypotheses
Definition: TtSemiLepHypothesis.cc:249
pat::Jet::jecFactor
float jecFactor(const std::string &level, const std::string &flavor="none", const std::string &set="") const
TtSemiLepHypothesis.h
reco::CompositeCandidate
Definition: CompositeCandidate.h:21
TtSemiLepHypothesis::resetCandidates
void resetCandidates()
reset candidate pointers before hypo build process
Definition: TtSemiLepHypothesis.cc:117
TtSemiLepHypothesis::leptonType
WDecay::LeptonType leptonType(const reco::RecoCandidate *cand)
determine lepton type of reco candidate and return a corresponding WDecay::LeptonType; the type is kN...
Definition: TtSemiLepHypothesis.cc:162
TtSemiLepHypothesis::isValid
bool isValid(const int &idx, const edm::Handle< std::vector< pat::Jet > > &jets)
check if index is in valid range of selected jets
Definition: TtSemiLepHypothesis.h:69