CMS 3D CMS Logo

TtHadEvtSolutionMaker.cc
Go to the documentation of this file.
1 
12 
13 #include <memory>
14 
17  // configurables
18  jetSrcToken_ = consumes<std::vector<pat::Jet> >(iConfig.getParameter<edm::InputTag>("jetSource"));
19  jetCorrScheme_ = iConfig.getParameter<int>("jetCorrectionScheme");
20  doKinFit_ = iConfig.getParameter<bool>("doKinFit");
21  addLRSignalSel_ = iConfig.getParameter<bool>("addLRSignalSel");
22  lrSignalSelObs_ = iConfig.getParameter<std::vector<int> >("lrSignalSelObs");
23  lrSignalSelFile_ = iConfig.getParameter<std::string>("lrSignalSelFile");
24  addLRJetComb_ = iConfig.getParameter<bool>("addLRJetComb");
25  lrJetCombObs_ = iConfig.getParameter<std::vector<int> >("lrJetCombObs");
26  lrJetCombFile_ = iConfig.getParameter<std::string>("lrJetCombFile");
27  maxNrIter_ = iConfig.getParameter<int>("maxNrIter");
28  maxDeltaS_ = iConfig.getParameter<double>("maxDeltaS");
29  maxF_ = iConfig.getParameter<double>("maxF");
30  jetParam_ = iConfig.getParameter<int>("jetParametrisation");
31  constraints_ = iConfig.getParameter<std::vector<unsigned int> >("constraints");
32  matchToGenEvt_ = iConfig.getParameter<bool>("matchToGenEvt");
33  matchingAlgo_ = iConfig.getParameter<bool>("matchingAlgorithm");
34  useMaxDist_ = iConfig.getParameter<bool>("useMaximalDistance");
35  useDeltaR_ = iConfig.getParameter<bool>("useDeltaR");
36  maxDist_ = iConfig.getParameter<double>("maximalDistance");
37  genEvtToken_ = mayConsume<TtGenEvent>(edm::InputTag("genEvt"));
38 
39  // define kinfitter
40  if (doKinFit_) {
42  }
43 
44  // define jet combinations related calculators
48  if (addLRJetComb_)
50 
51  // instantiate signal selection calculator
52  if (addLRSignalSel_)
54 
55  // define what will be produced
56  produces<std::vector<TtHadEvtSolution> >();
57 }
58 
61  if (doKinFit_) {
62  delete myKinFitter;
63  }
64  delete mySimpleBestJetComb;
67  if (addLRSignalSel_)
68  delete myLRSignalSelCalc;
69  if (addLRJetComb_)
70  delete myLRJetCombCalc;
71 }
72 
74  // TopObject Selection
75  // Select Jets
76 
77  bool jetsFound = false;
79  iEvent.getByToken(jetSrcToken_, jets);
80 
81  if (jets->size() >= 6)
82  jetsFound = true;
83 
84  // Build Event solutions according to the ambiguity in the jet combination
85  // Note, hardcoded to only run through the 6 most energetic jets - could be changed ....
86 
87  std::vector<TtHadEvtSolution>* evtsols = new std::vector<TtHadEvtSolution>();
88  if (jetsFound) {
89  for (unsigned int p = 0; p < 3; p++) { // loop over light jet p
90  for (unsigned int q = p + 1; q < 4; q++) { // loop over light jet q
91  for (unsigned int j = q + 1; j < 5; j++) { // loop over light jet j
92  for (unsigned int k = j + 1; k < 6; k++) { // loop over light jet k
93  for (unsigned int bh = 0; bh != jets->size(); bh++) { //loop over hadronic b-jet1
94  if (!(bh == p || bh == q || bh == j || bh == k)) {
95  for (unsigned int bbarh = 0; bbarh != jets->size(); bbarh++) { //loop over hadronic b-jet2
96  if (!(bbarh == p || bbarh == q || bbarh == j || bbarh == k) && !(bbarh == bh)) {
97  // Make event solutions for all possible combinations of the 4 light
98  // jets and 2 possible b-jets, not including the option of the b's being swapped.
99  // Hadp,Hadq is one pair, Hadj,Hadk the other
100  std::vector<TtHadEvtSolution> asol;
101  asol.resize(3);
102  //[p][q][b] and [j][k][bbar]
103  asol[0].setJetCorrectionScheme(jetCorrScheme_);
104  asol[0].setHadp(jets, p);
105  asol[0].setHadq(jets, q);
106  asol[0].setHadj(jets, j);
107  asol[0].setHadk(jets, k);
108  asol[0].setHadb(jets, bh);
109  asol[0].setHadbbar(jets, bbarh);
110 
111  //[p][j][b] and [q][k][bbar]
112  asol[1].setJetCorrectionScheme(jetCorrScheme_);
113  asol[1].setHadp(jets, p);
114  asol[1].setHadq(jets, j);
115  asol[1].setHadj(jets, q);
116  asol[1].setHadk(jets, k);
117  asol[1].setHadb(jets, bh);
118  asol[1].setHadbbar(jets, bbarh);
119 
120  //[p][k][b] and [j][q][bbar]
121  asol[2].setJetCorrectionScheme(jetCorrScheme_);
122  asol[2].setHadp(jets, p);
123  asol[2].setHadq(jets, k);
124  asol[2].setHadj(jets, j);
125  asol[2].setHadk(jets, q);
126  asol[2].setHadb(jets, bh);
127  asol[2].setHadbbar(jets, bbarh);
128 
129  if (doKinFit_) {
130  for (unsigned int i = 0; i != asol.size(); i++) {
131  asol[i] = myKinFitter->addKinFitInfo(&(asol[i]));
133  }
134 
135  } else {
136  std::cout << "Fitting needed to decide on best solution, enable fitting!" << std::endl;
137  }
138  // these lines calculate the observables to be used in the TtHadSignalSelection LR
139 
140  for (unsigned int i = 0; i != asol.size(); i++) {
141  (*myLRSignalSelObservables)(asol[i]);
142  }
143  // if asked for, calculate with these observable values the LRvalue and
144  // (depending on the configuration) probability this event is signal
145  if (addLRSignalSel_) {
146  for (unsigned int i = 0; i != asol.size(); i++) {
147  (*myLRSignalSelCalc)(asol[i]);
148  }
149  }
150 
151  // these lines calculate the observables to be used in the TtHadJetCombination LR
152  for (unsigned int i = 0; i != asol.size(); i++) {
153  (*myLRJetCombObservables)(asol[i]);
154  }
155  // if asked for, calculate with these observable values the LRvalue and
156  // (depending on the configuration) probability a jet combination is correct
157  if (addLRJetComb_) {
158  for (unsigned int i = 0; i != asol.size(); i++) {
159  (*myLRJetCombCalc)(asol[i]);
160  }
161  }
162  //std::cout<<"SignalSelLRval = "<<asol.getLRSignalEvtLRval()<<" JetCombProb = "<<asol.getLRSignalEvtProb()<<std::endl;
163  //std::cout<<"JetCombLRval = "<<asol.getLRJetCombLRval()<<" JetCombProb = "<<asol.getLRJetCombProb()<<std::endl;
164 
165  // fill solution to vector with all possible solutions
166  for (unsigned int i = 0; i != asol.size(); i++) {
167  evtsols->push_back(asol[i]);
168  }
169  }
170  }
171  }
172  }
173  }
174  }
175  }
176  }
177 
178  // add TtHadSimpleBestJetComb to solutions
179  int simpleBestJetComb = (*mySimpleBestJetComb)(*evtsols);
180 
181  for (size_t s = 0; s < evtsols->size(); s++) {
182  (*evtsols)[s].setSimpleBestJetComb(simpleBestJetComb);
183  // if asked for, match the event solutions to the gen Event
184  if (matchToGenEvt_) {
185  int bestSolution = -999;
186  int bestSolutionChangeW1Q = -999;
187  int bestSolutionChangeW2Q = -999;
189  iEvent.getByToken(genEvtToken_, genEvt);
190  std::vector<const reco::Candidate*> quarks;
191  const reco::Candidate& genp = *(genEvt->daughterQuarkOfWPlus());
192  const reco::Candidate& genq = *(genEvt->daughterQuarkBarOfWPlus());
193  const reco::Candidate& genb = *(genEvt->b());
194  const reco::Candidate& genj = *(genEvt->daughterQuarkOfWMinus());
195  const reco::Candidate& genk = *(genEvt->daughterQuarkBarOfWMinus());
196  const reco::Candidate& genbbar = *(genEvt->bBar());
197  quarks.push_back(&genp);
198  quarks.push_back(&genq);
199  quarks.push_back(&genb);
200  quarks.push_back(&genj);
201  quarks.push_back(&genk);
202  quarks.push_back(&genbbar);
203  std::vector<const reco::Candidate*> jets;
204  for (size_t s = 0; s < evtsols->size(); s++) {
205  jets.clear();
206  const reco::Candidate& jetp = (*evtsols)[s].getRecHadp();
207  const reco::Candidate& jetq = (*evtsols)[s].getRecHadq();
208  const reco::Candidate& jetbh = (*evtsols)[s].getRecHadb();
209  const reco::Candidate& jetj = (*evtsols)[s].getRecHadj();
210  const reco::Candidate& jetk = (*evtsols)[s].getRecHadk();
211  const reco::Candidate& jetbbar = (*evtsols)[s].getRecHadbbar();
212  jets.push_back(&jetp);
213  jets.push_back(&jetq);
214  jets.push_back(&jetbh);
215  jets.push_back(&jetj);
216  jets.push_back(&jetk);
217  jets.push_back(&jetbbar);
219  (*evtsols)[s].setGenEvt(genEvt);
220  (*evtsols)[s].setMCBestSumAngles(aMatch.getSumDistances());
221  (*evtsols)[s].setMCBestAngleHadp(aMatch.getDistanceForParton(0));
222  (*evtsols)[s].setMCBestAngleHadq(aMatch.getDistanceForParton(1));
223  (*evtsols)[s].setMCBestAngleHadb(aMatch.getDistanceForParton(2));
224  (*evtsols)[s].setMCBestAngleHadb(aMatch.getDistanceForParton(2));
225  (*evtsols)[s].setMCBestAngleHadj(aMatch.getDistanceForParton(3));
226  (*evtsols)[s].setMCBestAngleHadk(aMatch.getDistanceForParton(4));
227  (*evtsols)[s].setMCBestAngleHadbbar(aMatch.getDistanceForParton(5));
228 
229  // Check match - checking if two light quarks are swapped wrt matched gen particle
230  if ((aMatch.getMatchForParton(2) == 2 && aMatch.getMatchForParton(5) == 5) ||
231  (aMatch.getMatchForParton(2) == 5 && aMatch.getMatchForParton(5) == 2)) { // check b-jets
232 
233  if (aMatch.getMatchForParton(3) == 3 && aMatch.getMatchForParton(4) == 4) { //check light jets
234  bestSolutionChangeW2Q = 0;
235  if (aMatch.getMatchForParton(0) == 0 && aMatch.getMatchForParton(1) == 1) {
236  bestSolution = s;
237  bestSolutionChangeW1Q = 0;
238  } else {
239  if (aMatch.getMatchForParton(0) == 1 && aMatch.getMatchForParton(1) == 0) {
240  bestSolution = s;
241  bestSolutionChangeW1Q = 1;
242  }
243  }
244  } else {
245  if (aMatch.getMatchForParton(2) == 3 && aMatch.getMatchForParton(3) == 2) { // or check if swapped
246  bestSolutionChangeW2Q = 1;
247  if (aMatch.getMatchForParton(0) == 1 && aMatch.getMatchForParton(1) == 0) {
248  bestSolution = s;
249  bestSolutionChangeW1Q = 1;
250  } else {
251  if (aMatch.getMatchForParton(0) == 0 && aMatch.getMatchForParton(1) == 1) {
252  bestSolution = s;
253  bestSolutionChangeW1Q = 0;
254  }
255  }
256  }
257  if (aMatch.getMatchForParton(2) == 2 && aMatch.getMatchForParton(3) == 3) {
258  bestSolutionChangeW2Q = 0;
259  if (aMatch.getMatchForParton(0) == 0 && aMatch.getMatchForParton(1) == 1) {
260  bestSolution = s;
261  bestSolutionChangeW1Q = 0;
262  } else if (aMatch.getMatchForParton(0) == 1 && aMatch.getMatchForParton(1) == 0) {
263  bestSolution = s;
264  bestSolutionChangeW1Q = 1;
265  }
266  }
267  }
268  }
269  for (size_t s = 0; s < evtsols->size(); s++) {
270  (*evtsols)[s].setMCBestJetComb(bestSolution);
271  (*evtsols)[s].setMCChangeW1Q(bestSolutionChangeW1Q);
272  (*evtsols)[s].setMCChangeW2Q(bestSolutionChangeW2Q);
273  }
274  }
275  } // end matchEvt
276  }
277  //store the vector of solutions to the event
278 
279  std::unique_ptr<std::vector<TtHadEvtSolution> > pOut(evtsols);
280  iEvent.put(std::move(pOut));
281  } else { //end loop jet/MET found
282  std::cout << "No calibrated solutions built, because only " << jets->size() << " were present";
283 
284  std::unique_ptr<std::vector<TtHadEvtSolution> > pOut(evtsols);
285  iEvent.put(std::move(pOut));
286  }
287 }
TtHadEvtSolutionMaker::lrJetCombObs_
std::vector< int > lrJetCombObs_
Definition: TtHadEvtSolutionMaker.h:44
mps_fire.i
i
Definition: mps_fire.py:355
MessageLogger.h
TtHadEvtSolutionMaker::maxDist_
double maxDist_
Definition: TtHadEvtSolutionMaker.h:40
TtFullHadKinFitter::addKinFitInfo
TtHadEvtSolution addKinFitInfo(TtHadEvtSolution *asol)
add kin fit information to the old event solution (in for legacy reasons)
Definition: TtFullHadKinFitter.cc:312
TtHadLRJetCombObservables.h
TtFullHadKinFitter.h
TtHadEvtSolutionMaker::lrJetCombFile_
std::string lrJetCombFile_
Definition: TtHadEvtSolutionMaker.h:36
EgammaValidation_cff.genp
genp
produce generated paricles in acceptance #
Definition: EgammaValidation_cff.py:115
TtHadEvtSolutionMaker::myLRJetCombCalc
TtHadLRJetCombCalc * myLRJetCombCalc
Definition: TtHadEvtSolutionMaker.h:51
TtHadEvtSolutionMaker::maxDeltaS_
double maxDeltaS_
Definition: TtHadEvtSolutionMaker.h:42
JetPartonMatching::getDistanceForParton
double getDistanceForParton(const unsigned int part, const unsigned int comb=0)
Definition: JetPartonMatching.cc:358
TtHadEvtSolutionMaker::myLRSignalSelCalc
TtHadLRSignalSelCalc * myLRSignalSelCalc
Definition: TtHadEvtSolutionMaker.h:53
TtHadLRJetCombObservables
Steering class for the overall hadronic top likelihood.
Definition: TtHadLRJetCombObservables.h:30
TtHadEvtSolutionMaker::mySimpleBestJetComb
TtHadSimpleBestJetComb * mySimpleBestJetComb
Definition: TtHadEvtSolutionMaker.h:49
AlCaHLTBitMon_ParallelJobs.p
p
Definition: AlCaHLTBitMon_ParallelJobs.py:153
gather_cfg.cout
cout
Definition: gather_cfg.py:144
TtHadEvtSolutionMaker::myLRJetCombObservables
TtHadLRJetCombObservables * myLRJetCombObservables
Definition: TtHadEvtSolutionMaker.h:50
TtHadEvtSolution::setJetParametrisation
void setJetParametrisation(int jp)
Definition: TtHadEvtSolution.h:251
TtHadEvtSolutionMaker::jetParam_
int jetParam_
Definition: TtHadEvtSolutionMaker.h:43
data-class-funcs.q
q
Definition: data-class-funcs.py:169
TtHadEvtSolutionMaker::matchingAlgo_
int matchingAlgo_
Definition: TtHadEvtSolutionMaker.h:38
singleTopDQM_cfi.jets
jets
Definition: singleTopDQM_cfi.py:42
TtHadEvtSolutionMaker::useDeltaR_
bool useDeltaR_
Definition: TtHadEvtSolutionMaker.h:39
edm::Handle
Definition: AssociativeIterator.h:50
TtHadEvtSolutionMaker::lrSignalSelFile_
std::string lrSignalSelFile_
Definition: TtHadEvtSolutionMaker.h:36
TtHadEvtSolutionMaker::genEvtToken_
edm::EDGetTokenT< TtGenEvent > genEvtToken_
Definition: TtHadEvtSolutionMaker.h:46
TtHadSimpleBestJetComb.h
TtFullHadKinFitter
Definition: TtFullHadKinFitter.h:29
deltaR.h
alignCSCRings.s
s
Definition: alignCSCRings.py:92
TtHadEvtSolutionMaker::addLRSignalSel_
bool addLRSignalSel_
Definition: TtHadEvtSolutionMaker.h:37
TtHadLRJetCombCalc.h
TtHadEvtSolutionMaker::maxNrIter_
int maxNrIter_
Definition: TtHadEvtSolutionMaker.h:41
TtHadEvtSolutionMaker::jetCorrScheme_
int jetCorrScheme_
Definition: TtHadEvtSolutionMaker.h:35
dqmdumpme.k
k
Definition: dqmdumpme.py:60
TtHadEvtSolutionMaker::maxF_
double maxF_
Definition: TtHadEvtSolutionMaker.h:42
TtHadLRSignalSelObservables
Definition: TtHadLRSignalSelObservables.h:26
TtHadEvtSolutionMaker::lrSignalSelObs_
std::vector< int > lrSignalSelObs_
Definition: TtHadEvtSolutionMaker.h:44
AlCaHLTBitMon_QueryRunRegistry.string
string
Definition: AlCaHLTBitMon_QueryRunRegistry.py:256
JetPartonMatching::getMatchForParton
int getMatchForParton(const unsigned int part, const unsigned int comb=0)
Definition: JetPartonMatching.cc:338
edm::ParameterSet
Definition: ParameterSet.h:36
TtHadEvtSolutionMaker::constraints_
std::vector< unsigned int > constraints_
Definition: TtHadEvtSolutionMaker.h:45
TtHadEvtSolutionMaker::~TtHadEvtSolutionMaker
~TtHadEvtSolutionMaker() override
destructor
Definition: TtHadEvtSolutionMaker.cc:60
TtHadEvtSolutionMaker::myKinFitter
TtFullHadKinFitter * myKinFitter
Definition: TtHadEvtSolutionMaker.h:48
TtHadLRSignalSelObservables.h
TtHadEvtSolutionMaker::jetSrcToken_
edm::EDGetTokenT< std::vector< pat::Jet > > jetSrcToken_
Definition: TtHadEvtSolutionMaker.h:34
TtHadEvtSolutionMaker::addLRJetComb_
bool addLRJetComb_
Definition: TtHadEvtSolutionMaker.h:37
iEvent
int iEvent
Definition: GenABIO.cc:224
TtHadEvtSolutionMaker::produce
void produce(edm::Event &iEvent, const edm::EventSetup &iSetup) override
Definition: TtHadEvtSolutionMaker.cc:73
TtHadSimpleBestJetComb
Based on the TtSemiSimpleBestJetComb.by: Jan Heyninck version: TtSemiSimpleBestJetComb....
Definition: TtHadSimpleBestJetComb.h:21
TtHadEvtSolutionMaker::matchToGenEvt_
bool matchToGenEvt_
Definition: TtHadEvtSolutionMaker.h:37
edm::EventSetup
Definition: EventSetup.h:57
TtHadLRSignalSelCalc
Class to calculate the jet combination LR value and purity from a root-file with fit functions.
Definition: TtHadLRSignalSelCalc.h:28
reco::Candidate
Definition: Candidate.h:27
TtHadLRSignalSelCalc.h
TtHadEvtSolutionMaker::myLRSignalSelObservables
TtHadLRSignalSelObservables * myLRSignalSelObservables
Definition: TtHadEvtSolutionMaker.h:52
edm::ParameterSet::getParameter
T getParameter(std::string const &) const
JetPartonMatching::getSumDistances
double getSumDistances(const unsigned int comb=0)
Definition: JetPartonMatching.cc:365
TtHadEvtSolutionMaker::doKinFit_
bool doKinFit_
Definition: TtHadEvtSolutionMaker.h:37
eostools.move
def move(src, dest)
Definition: eostools.py:511
JetPartonMatching.h
TtHadEvtSolutionMaker::TtHadEvtSolutionMaker
TtHadEvtSolutionMaker(const edm::ParameterSet &iConfig)
constructor
Definition: TtHadEvtSolutionMaker.cc:16
TtHadLRJetCombCalc
Definition: TtHadLRJetCombCalc.h:18
TtHadEvtSolutionMaker.h
dqmiolumiharvest.j
j
Definition: dqmiolumiharvest.py:66
edm::Event
Definition: Event.h:73
JetPartonMatching
Definition: JetPartonMatching.h:11
TtHadEvtSolutionMaker::useMaxDist_
bool useMaxDist_
Definition: TtHadEvtSolutionMaker.h:39
edm::InputTag
Definition: InputTag.h:15
TtGenEvtProducer_cfi.genEvt
genEvt
Definition: TtGenEvtProducer_cfi.py:7