CMS 3D CMS Logo

TauValidation.cc
Go to the documentation of this file.
1 /*class TauValidation
2  *
3  * Class to fill dqm monitor elements from existing EDM file
4  *
5  */
7 #include "CLHEP/Units/defs.h"
8 #include "CLHEP/Units/PhysicalConstants.h"
14 #include <iostream>
16 using namespace edm;
17 
19  : // wmanager_(iPSet,consumesCollector())
20  genparticleCollection_(iPSet.getParameter<edm::InputTag>("genparticleCollection")),
21  NMODEID(TauDecay::NMODEID - 1), // fortran to C++ index
22  zsbins(20),
23  zsmin(-0.5),
24  zsmax(0.5) {
25  genparticleCollectionToken_ = consumes<reco::GenParticleCollection>(genparticleCollection_);
26 }
27 
29 
31 
34  DQMHelper dqm(&i);
35  i.setCurrentFolder("Generator/Tau");
36  // Number of analyzed events
37  nTaus = dqm.book1dHisto("nTaus", "n analyzed Taus", 1, 0., 1., "bin", "Number of #tau's found");
38  nPrimeTaus =
39  dqm.book1dHisto("nPrimeTaus", "n analyzed prime Taus", 1, 0., 1., "bin", "Number of #tau's from Gauge Bosons");
40 
41  //Kinematics
42  TauPt = dqm.book1dHisto("TauPt", "Tau pT", 100, 0, 100, "P_{T}^{#tau}", "Number of #tau's from Gauge Bosons");
43  TauEta = dqm.book1dHisto("TauEta", "Tau eta", 100, -2.5, 2.5, "#eta^{#tau}", "Number of #tau's from Gauge Bosons");
44  TauPhi = dqm.book1dHisto("TauPhi", "Tau phi", 100, -3.14, 3.14, "#phi^{#tau}", "Number of #tau's from Gauge Bosons");
45  TauProngs = dqm.book1dHisto("TauProngs", "Tau n prongs", 7, 0, 7, "N_{prongs}", "Number of #tau's from Gauge Bosons");
47  "TauDecayChannels", "Tau decay channels", 13, 0, 13, "Tau POG Decay Mode", "Number of #tau's from Gauge Bosons");
50  TauDecayChannels->setBinLabel(1 + muon, "mu");
51  TauDecayChannels->setBinLabel(1 + pi, "#pi^{#pm}");
52  TauDecayChannels->setBinLabel(1 + rho, "#rho^{#pm}");
53  TauDecayChannels->setBinLabel(1 + a1, "a_{1}^{#pm}");
54  TauDecayChannels->setBinLabel(1 + pi1pi0, "#pi^{#pm}#pi^{0}");
55  TauDecayChannels->setBinLabel(1 + pinpi0, "#pi^{#pm}n#pi^{0}");
56  TauDecayChannels->setBinLabel(1 + tripi, "3#pi^{#pm}");
57  TauDecayChannels->setBinLabel(1 + tripinpi0, "3#pi^{#pm}n#pi^{0}");
58  TauDecayChannels->setBinLabel(1 + K, "K");
59  TauDecayChannels->setBinLabel(1 + Kstar, "K^{*}");
60  TauDecayChannels->setBinLabel(1 + stable, "Stable");
61 
62  TauMothers = dqm.book1dHisto("TauMothers", "Tau mother particles", 10, 0, 10, "Mother of #tau", "Number of #tau's");
63 
64  TauMothers->setBinLabel(1 + other, "?");
65  TauMothers->setBinLabel(1 + B, "B Decays");
66  TauMothers->setBinLabel(1 + D, "D Decays");
67  TauMothers->setBinLabel(1 + gamma, "#gamma");
68  TauMothers->setBinLabel(1 + Z, "Z");
69  TauMothers->setBinLabel(1 + W, "W");
70  TauMothers->setBinLabel(1 + HSM, "H_{SM}/h^{0}");
71  TauMothers->setBinLabel(1 + H0, "H^{0}");
72  TauMothers->setBinLabel(1 + A0, "A^{0}");
73  TauMothers->setBinLabel(1 + Hpm, "H^{#pm}");
74 
76  "DecayLength", "#tau Decay Length", 100, -20, 20, "L_{#tau} (cm)", "Number of #tau's from Gauge Bosons");
77  LifeTime = dqm.book1dHisto(
78  "LifeTime", "#tau LifeTime ", 500, 0, 10000E-15, "#tau_{#tau} (s)", "Number of #tau's from Gauge Bosons");
79 
81  "TauSpinEffectsWX", "X for pion", 50, 0, 1, "X", "Number of #tau#rightarrow#pi#nu from W^{#pm} Bosons");
83  "TauSpinEffectsHpmX", "X for pion", 50, 0, 1, "X", "Number of #tau#rightarrow#pi#nu from H^{#pm} Bosons");
84 
86  "TauSpinEffectsWeX", "X for e", 50, 0, 1, "X", "Number of #tau#rightarrowe#nu#nu from W^{#pm} Bosons");
88  "TauSpinEffectsHpmeX", "X for e", 50, 0, 1, "X", "Number of #tau#rightarrowe#nu#nu from H^{#pm} Bosons");
89 
91  "TauSpinEffectsWmuX", "X for mu", 50, 0, 1, "X", "Number of #tau#rightarrow#mu#nu#nu from W^{#pm} Bosons");
93  "TauSpinEffectsHpmmuX", "X for mue", 50, 0, 1, "X", "Number of #tau#rightarrow#mu#nu#nu from H^{#pm} Bosons");
94 
95  TauSpinEffectsW_UpsilonRho = dqm.book1dHisto("TauSpinEffectsWUpsilonRho",
96  "#Upsilon for #rho",
97  50,
98  -1,
99  1,
100  "#Upsilon",
101  "Number of #tau#rightarrow#rho#nu from Gauge Bosons");
102  TauSpinEffectsHpm_UpsilonRho = dqm.book1dHisto("TauSpinEffectsHpmUpsilonRho",
103  "#Upsilon for #rho",
104  50,
105  -1,
106  1,
107  "#Upsilon",
108  "Number of #tau#rightarrow#rho#nu from Gauge Bosons");
109 
110  TauSpinEffectsW_UpsilonA1 = dqm.book1dHisto("TauSpinEffectsWUpsilonA1",
111  "#Upsilon for a1",
112  50,
113  -1,
114  1,
115  "#Upsilon",
116  "Number of #tau#rightarrow#pi#pi#pi#nu from Gauge Bosons");
117  TauSpinEffectsHpm_UpsilonA1 = dqm.book1dHisto("TauSpinEffectsHpmUpsilonA1",
118  "#Upsilon for a1",
119  50,
120  -1,
121  1,
122  "#Upsilon",
123  "Number of #tau#rightarrow#pi#pi#pi#nu from Gauge Bosons");
124 
126  dqm.book1dHisto("TauSpinEffectsH_pipiAcoplanarity",
127  "H Acoplanarity for #pi^{-}#pi^{+}",
128  50,
129  0,
130  2 * TMath::Pi(),
131  "Acoplanarity",
132  "Number of H#rightarrow#tau^{-}(#rightarrow#pi^{-}#nu)#tau^{+}(#rightarrow#pi^{+}#nu) Events");
133 
135  dqm.book1dHisto("TauSpinEffectsH_pipiAcollinearity",
136  "H Acollinearity for #pi^{-}#pi^{+}",
137  50,
138  0,
139  TMath::Pi(),
140  "Acollinearity",
141  "Number of H#rightarrow#tau^{-}(#rightarrow#pi^{-}#nu)#tau^{+}(#rightarrow#pi^{+}#nu) Events");
143  dqm.book1dHisto("TauSpinEffectsH_pipiAcollinearityzoom",
144  "H Acollinearity for #pi^{-}#pi^{+}",
145  50,
146  3,
147  TMath::Pi(),
148  "Acollinearity",
149  "Number of H#rightarrow#tau^{-}(#rightarrow#pi^{-}#nu)#tau^{+}(#rightarrow#pi^{+}#nu) Events");
150 
152  dqm.book1dHisto("TauSpinEffectsZMVis",
153  "Mass of pi+ pi-",
154  25,
155  0,
156  1.1,
157  "M_{#pi^{+}#pi^{-}} (GeV)",
158  "Number of Z#rightarrow#tau^{-}(#rightarrow#pi^{-}#nu)#tau^{+}(#rightarrow#pi^{+}#nu) Events");
160  dqm.book1dHisto("TauSpinEffectsHMVis",
161  "Mass of pi+ pi-",
162  25,
163  0,
164  1.1,
165  "M_{#pi^{+}#pi^{-}} (GeV)",
166  "Number of H#rightarrow#tau^{-}(#rightarrow#pi^{-}#nu)#tau^{+}(#rightarrow#pi^{+}#nu) Events");
167 
169  dqm.book1dHisto("TauSpinEffectsZZs",
170  "Z_{s}",
171  zsbins,
172  zsmin,
173  zsmax,
174  "Z_{s}",
175  "Number of Z#rightarrow#tau^{-}(#rightarrow#pi^{-}#nu)#tau^{+}(#rightarrow#pi^{+}#nu Events");
177  dqm.book1dHisto("TauSpinEffectsHZs",
178  "Z_{s}",
179  zsbins,
180  zsmin,
181  zsmax,
182  "Z_{s}",
183  "Number of H#rightarrow#tau^{-}(#rightarrow#pi^{-}#nu)#tau^{+}(#rightarrow#pi^{+}#nu Events");
184 
186  "TauSpinEffectsZX", "X for pion of #tau^{-}", 25, 0, 1.0, "X", "Number of #tau#rightarrow#pi#nu from Z Bosons");
187  TauSpinEffectsZ_X50to75 = dqm.book1dHisto("TauSpinEffectsZX50to75",
188  "X for pion of #tau^{-} (50GeV-75GeV)",
189  10,
190  0,
191  1.0,
192  "X",
193  "Number of #tau#rightarrow#pi#nu from Z(50GeV<M<75GeV) Bosons");
194  TauSpinEffectsZ_X75to88 = dqm.book1dHisto("TauSpinEffectsZX75to88",
195  "X for pion of #tau^{-} (75GeV-88GeV)",
196  10,
197  0,
198  1.0,
199  "X",
200  "Number of #tau#rightarrow#pi#nu from Z(75GeV<M<88GeV) Bosons");
201  TauSpinEffectsZ_X88to100 = dqm.book1dHisto("TauSpinEffectsZX88to100",
202  "X for pion of #tau^{-} (88GeV-100GeV)",
203  10,
204  0,
205  1.0,
206  "X",
207  "Number of #tau#rightarrow#pi#nu from Z(88GeV<M<100GeV) Bosons");
208  TauSpinEffectsZ_X100to120 = dqm.book1dHisto("TauSpinEffectsZX100to120",
209  "X for pion of #tau^{-} (100GeV-120GeV)",
210  10,
211  0,
212  1.0,
213  "X",
214  "Number of #tau#rightarrow#pi#nu from Z(100GeV<M<120GeV) Bosons");
215  TauSpinEffectsZ_X120UP = dqm.book1dHisto("TauSpinEffectsZX120UP",
216  "X for pion of #tau^{-} (>120GeV)",
217  10,
218  0,
219  1.0,
220  "X",
221  "Number of #tau#rightarrow#pi#nu from Z(120GeV<MGeV) Bosons");
222 
224  "TauSpinEffectsH_X", "X for pion of #tau^{-}", 25, 0, 1.0, "X", "Number of #tau#rightarrow#pi#nu from H Bosons");
225 
226  TauSpinEffectsZ_Xf = dqm.book1dHisto("TauSpinEffectsZXf",
227  "X for pion of forward emitted #tau^{-}",
228  25,
229  0,
230  1.0,
231  "X_{f}",
232  "Number of #tau#rightarrow#pi#nu from Z Bosons");
233  TauSpinEffectsH_Xf = dqm.book1dHisto("TauSpinEffectsHXf",
234  "X for pion of forward emitted #tau^{-}",
235  25,
236  0,
237  1.0,
238  "X_{f}",
239  "Number of #tau#rightarrow#pi#nu from H Bosons");
240 
241  TauSpinEffectsZ_Xb = dqm.book1dHisto("TauSpinEffectsZXb",
242  "X for pion of backward emitted #tau^{-}",
243  25,
244  0,
245  1.0,
246  "X_{b}",
247  "Number of #tau#rightarrow#pi#nu from Z Bosons");
248  TauSpinEffectsH_Xb = dqm.book1dHisto("TauSpinEffectsHXb",
249  "X for pion of backward emitted #tau^{-}",
250  25,
251  0,
252  1.0,
253  "X_{b}",
254  "Number of #tau#rightarrow#pi#nu from H Bosons");
255 
257  "TauSpinEffectsZeX", "X for e", 50, 0, 1, "X", "Number of #tau#rightarrowe#nu#nu from Gauge Bosons");
259  "TauSpinEffectsHeX", "X for e", 50, 0, 1, "X", "Number of #tau#rightarrowe#nu#nu from Gauge Bosons");
260 
262  "TauSpinEffectsZmuX", "X for mu", 50, 0, 1, "X", "Number of #tau#rightarrow#mu#nu#nu from Gauge Bosons");
264  "TauSpinEffectsHmuX", "X for mu", 50, 0, 1, "X", "Number of #tau#rightarrow#mu#nu#nu from Gauge Bosons");
265 
267  dqm.book1dHisto("TauSpinEffectsH_rhorhoAcoplanarityminus",
268  "#phi^{*-} (acoplanarity) for Higgs #rightarrow #rho-#rho (y_{1}*y_{2}<0)",
269  32,
270  0,
271  2 * TMath::Pi(),
272  "#phi^{*-} (Acoplanarity)",
273  "Number of H#rightarrow#tau^{-}(#rightarrow#rho^{-}#nu)#tau^{+}(#rightarrow#rho^{+}#nu) Events");
275  dqm.book1dHisto("TauSpinEffectsH_rhorhoAcoplanarityplus",
276  "#phi^{*+} (acoplanarity) for Higgs #rightarrow #rho-#rho (y_{1}*y_{2}>0)",
277  32,
278  0,
279  2 * TMath::Pi(),
280  "#phi^{*+} (Acoplanarity)",
281  "Number of H#rightarrow#tau^{-}(#rightarrow#rho^{-}#nu)#tau^{+}(#rightarrow#rho^{+}#nu) Events");
282 
283  TauFSRPhotonsN = dqm.book1dHisto("TauFSRPhotonsN",
284  "FSR Photons radiating from/with tau (Gauge Boson)",
285  5,
286  -0.5,
287  4.5,
288  "N^{FSR Photons radiating from/with #tau}",
289  "Number of #tau's from Gauge Bosons");
290  TauFSRPhotonsPt = dqm.book1dHisto("TauFSRPhotonsPt",
291  "Pt of FSR Photons radiating from/with tau (Gauge Boson)",
292  100,
293  0,
294  100,
295  "P_{t}^{FSR Photons radiating from/with #tau [per #tau]} (GeV)",
296  "Number of #tau's from Gauge Bosons");
297  TauFSRPhotonsPtSum = dqm.book1dHisto("TauFSRPhotonsPtSum",
298  "Pt of FSR Photons radiating from/with tau (Gauge Boson)",
299  100,
300  0,
301  100,
302  "P_{t}^{FSR Photons radiating from/with #tau [per #tau]} (GeV)",
303  "Number of #tau's from Gauge Bosons");
304 
305  TauBremPhotonsN = dqm.book1dHisto("TauBremPhotonsN",
306  "Brem. Photons radiating in tau decay",
307  5,
308  -0.5,
309  4.5,
310  "N FSR Photons radiating from/with tau",
311  "Number of #tau's from Gauge Bosons");
312  TauBremPhotonsPt = dqm.book1dHisto("TauBremPhotonsPt",
313  "Sum Brem Pt ",
314  100,
315  0,
316  100,
317  "P_{t}^{Brem. Photons radiating in tau decay} (GeV)",
318  "Number of #tau's from Gauge Bosons");
319  TauBremPhotonsPtSum = dqm.book1dHisto("TauBremPhotonsPtSum",
320  "Sum of Brem Pt ",
321  100,
322  0,
323  100,
324  "Sum P_{t}^{Brem. Photons radiating in tau decay} (GeV)",
325  "Number of #tau's from Gauge Bosons");
326 
327  MODEID = dqm.book1dHisto("JAKID", "JAK ID", NMODEID + 1, -0.5, NMODEID + 0.5);
328  for (unsigned int j = 0; j < NMODEID + 1; j++) {
329  MODEInvMass.push_back(std::vector<MonitorElement *>());
330  std::string tmp = "JAKID";
331  tmp += std::to_string(j);
332  MODEInvMass.at(j).push_back(dqm.book1dHisto("M" + tmp,
333  "M_{" + TauDecay::DecayMode(j) + "} (GeV)",
334  80,
335  0,
336  2.0,
337  "M_{" + TauDecay::DecayMode(j) + "} (GeV)",
338  "Number of #tau's from Gauge Bosons"));
341  j == TauDecay::MODE_KPIPI) {
342  MODEInvMass.at(j).push_back(dqm.book1dHisto("M13" + tmp,
343  "M_{13," + TauDecay::DecayMode(j) + "} (GeV)",
344  80,
345  0,
346  2.0,
347  "M_{13," + TauDecay::DecayMode(j) + "} (GeV)",
348  "Number of #tau's from Gauge Bosons"));
349  MODEInvMass.at(j).push_back(dqm.book1dHisto("M23" + tmp,
350  "M_{23," + TauDecay::DecayMode(j) + "} (GeV)",
351  80,
352  0,
353  2.0,
354  "M_{23," + TauDecay::DecayMode(j) + "} (GeV)",
355  "Number of #tau's from Gauge Bosons"));
356  MODEInvMass.at(j).push_back(dqm.book1dHisto("M12" + tmp,
357  "M_{12," + TauDecay::DecayMode(j) + "} (GeV)",
358  80,
359  0,
360  2.0,
361  "M_{12," + TauDecay::DecayMode(j) + "} (GeV)",
362  "Number of #tau's from Gauge Bosons"));
363  }
364  }
365  return;
366 }
367 
371  iEvent.getByToken(genparticleCollectionToken_, genParticles);
372 
373  double weight = 1.0; //= wmanager_.weight(iEvent);
375  // find taus
376  for (reco::GenParticleCollection::const_iterator iter = genParticles->begin(); iter != genParticles->end(); ++iter) {
377  if (abs(iter->pdgId()) == PdtPdgMini::Z0 || abs(iter->pdgId()) == PdtPdgMini::Higgs0) {
378  spinEffectsZH(&(*iter), weight);
379  }
380  if (abs(iter->pdgId()) == 15) {
381  if (isLastTauinChain(&(*iter))) {
382  nTaus->Fill(0.5, weight);
383  int mother = tauMother(&(*iter), weight);
384  if (mother > -1) { // exclude B, D and other non-signal decay modes
385  nPrimeTaus->Fill(0.5, weight);
386  TauPt->Fill(iter->pt(), weight);
387  TauEta->Fill(iter->eta(), weight);
388  TauPhi->Fill(iter->phi(), weight);
389  photons(&(*iter), weight);
391  // Adding MODEID and Mass information
393  unsigned int jak_id, TauBitMask;
394  if (TD.AnalyzeTau(&(*iter), jak_id, TauBitMask, false, false)) {
395  MODEID->Fill(jak_id, weight);
396  TauProngs->Fill(TD.nProng(TauBitMask), weight);
397  tauDecayChannel(&(*iter), jak_id, TauBitMask, weight);
398  if (jak_id <= NMODEID) {
399  int tcharge = iter->pdgId() / abs(iter->pdgId());
400  std::vector<const reco::GenParticle *> part = TD.Get_TauDecayProducts();
401  spinEffectsWHpm(&(*iter), mother, jak_id, part, weight);
402  TLorentzVector LVQ(0, 0, 0, 0);
403  TLorentzVector LVS12(0, 0, 0, 0);
404  TLorentzVector LVS13(0, 0, 0, 0);
405  TLorentzVector LVS23(0, 0, 0, 0);
406  bool haspart1 = false;
407  TVector3 PV, SV;
408  bool hasDL(false);
409  for (unsigned int i = 0; i < part.size(); i++) {
410  if (abs(part.at(i)->pdgId()) != PdtPdgMini::nu_tau && TD.isTauFinalStateParticle(part.at(i)->pdgId()) &&
411  !hasDL) {
412  hasDL = true;
413  TLorentzVector tlv(iter->px(), iter->py(), iter->pz(), iter->energy());
414  PV = TVector3(iter->vx(), iter->vy(), iter->vz());
415  SV = TVector3(part.at(i)->vx(), part.at(i)->vy(), part.at(i)->vz());
416  TVector3 DL = SV - PV;
417  DecayLength->Fill(DL.Dot(tlv.Vect()) / tlv.P(), weight);
418  double c(2.99792458E8), Ltau(DL.Mag() / 100) /*cm->m*/, beta(iter->p() / iter->mass());
419  LifeTime->Fill(Ltau / (c * beta), weight);
420  }
421 
422  if (TD.isTauFinalStateParticle(part.at(i)->pdgId()) && abs(part.at(i)->pdgId()) != PdtPdgMini::nu_e &&
423  abs(part.at(i)->pdgId()) != PdtPdgMini::nu_mu && abs(part.at(i)->pdgId()) != PdtPdgMini::nu_tau) {
424  TLorentzVector LV(part.at(i)->px(), part.at(i)->py(), part.at(i)->pz(), part.at(i)->energy());
425  LVQ += LV;
426  if (jak_id == TauDecay::MODE_3PI || jak_id == TauDecay::MODE_PI2PI0 ||
427  jak_id == TauDecay::MODE_KPIK || jak_id == TauDecay::MODE_KPIPI) {
428  if ((tcharge == part.at(i)->pdgId() / abs(part.at(i)->pdgId()) && TD.nProng(TauBitMask) == 3) ||
429  ((jak_id == TauDecay::MODE_3PI || jak_id == TauDecay::MODE_PI2PI0) &&
430  TD.nProng(TauBitMask) == 1 && abs(part.at(i)->pdgId()) == PdtPdgMini::pi_plus)) {
431  LVS13 += LV;
432  LVS23 += LV;
433  } else {
434  LVS12 += LV;
435  if (!haspart1 && ((jak_id == TauDecay::MODE_3PI || jak_id == TauDecay::MODE_PI2PI0) ||
436  ((jak_id != TauDecay::MODE_3PI || jak_id == TauDecay::MODE_PI2PI0) &&
437  abs(part.at(i)->pdgId()) == PdtPdgMini::K_plus))) {
438  LVS13 += LV;
439  haspart1 = true;
440  } else {
441  LVS23 += LV;
442  }
443  }
444  }
445  }
446  }
447  part.clear();
448  MODEInvMass.at(jak_id).at(0)->Fill(LVQ.M(), weight);
449  if (jak_id == TauDecay::MODE_3PI || jak_id == TauDecay::MODE_PI2PI0 || jak_id == TauDecay::MODE_KPIK ||
450  jak_id == TauDecay::MODE_KPIPI) {
451  MODEInvMass.at(jak_id).at(1)->Fill(LVS13.M(), weight);
452  MODEInvMass.at(jak_id).at(2)->Fill(LVS23.M(), weight);
453  MODEInvMass.at(jak_id).at(3)->Fill(LVS12.M(), weight);
454  }
455  }
456  } else {
457  MODEID->Fill(jak_id, weight);
458  }
459  }
460  }
461  }
462  }
463 } //analyze
464 
466  for (unsigned int i = 0; i < tau->numberOfMothers(); i++) {
467  const reco::GenParticle *mother = static_cast<const reco::GenParticle *>(tau->mother(i));
468  if (mother->pdgId() == tau->pdgId())
469  return GetMother(mother);
470  return mother;
471  }
472  return tau;
473 }
474 
475 const std::vector<const reco::GenParticle *> TauValidation::GetMothers(const reco::GenParticle *boson) {
476  std::vector<const reco::GenParticle *> mothers;
477  for (unsigned int i = 0; i < boson->numberOfMothers(); i++) {
478  const reco::GenParticle *mother = static_cast<const reco::GenParticle *>(boson->mother(i));
479  if (mother->pdgId() == boson->pdgId())
480  return GetMothers(mother);
481  mothers.push_back(mother);
482  }
483  return mothers;
484 }
485 
487 
489  for (unsigned int i = 0; i < tau->numberOfDaughters(); i++) {
490  if (tau->daughter(i)->pdgId() == tau->pdgId())
491  return false;
492  }
493  return true;
494 }
495 
496 void TauValidation::findTauList(const reco::GenParticle *tau, std::vector<const reco::GenParticle *> &TauList) {
497  TauList.insert(TauList.begin(), tau);
498  for (unsigned int i = 0; i < tau->numberOfMothers(); i++) {
499  const reco::GenParticle *mother = static_cast<const reco::GenParticle *>(tau->mother(i));
500  if (mother->pdgId() == tau->pdgId()) {
501  findTauList(mother, TauList);
502  }
503  }
504 }
505 
507  bool doBrem,
508  std::vector<const reco::GenParticle *> &ListofFSR,
509  std::vector<const reco::GenParticle *> &ListofBrem) {
510  // note this code split the FSR and Brem based one if the tau decays into a tau+photon or not with the Fortran Tauola Interface, this is not 100% correct because photos puts the tau with the regular tau decay products.
511  if (abs(p->pdgId()) == 15) {
512  if (isLastTauinChain(p)) {
513  doBrem = true;
514  } else {
515  doBrem = false;
516  }
517  }
518  int photo_ID = 22;
519  for (unsigned int i = 0; i < p->numberOfDaughters(); i++) {
520  const reco::GenParticle *dau = static_cast<const reco::GenParticle *>(p->daughter(i));
521  if (abs((dau)->pdgId()) == abs(photo_ID) && !doBrem) {
522  ListofFSR.push_back(dau);
523  }
524  if (abs((dau)->pdgId()) == abs(photo_ID) && doBrem) {
525  ListofBrem.push_back(dau);
526  }
527  if (abs((dau)->pdgId()) != 111 && abs((dau)->pdgId()) != 221) { // remove pi0 and eta decays
528  findFSRandBrem(dau, doBrem, ListofFSR, ListofBrem);
529  }
530  }
531 }
532 
534  std::vector<const reco::GenParticle *> &ListofFSR,
535  double &BosonScale) {
536  BosonScale = 0.0;
537  const reco::GenParticle *m = GetMother(p);
538  int mother_pid = m->pdgId();
539  if (m->pdgId() != p->pdgId()) {
540  for (unsigned int i = 0; i < m->numberOfDaughters(); i++) {
541  const reco::GenParticle *dau = static_cast<const reco::GenParticle *>(m->daughter(i));
542  if (abs(dau->pdgId()) == 22) {
543  ListofFSR.push_back(dau);
544  }
545  }
546  }
547  if (abs(mother_pid) == 24)
548  BosonScale = 1.0; // W
549  if (abs(mother_pid) == 23)
550  BosonScale = 2.0; // Z;
551  if (abs(mother_pid) == 22)
552  BosonScale = 2.0; // gamma;
553  if (abs(mother_pid) == 25)
554  BosonScale = 2.0; // HSM;
555  if (abs(mother_pid) == 35)
556  BosonScale = 2.0; // H0;
557  if (abs(mother_pid) == 36)
558  BosonScale = 2.0; // A0;
559  if (abs(mother_pid) == 37)
560  BosonScale = 1.0; //Hpm;
561 }
562 
564  if (abs(tau->pdgId()) != 15)
565  return -3;
566  int mother_pid = findMother(tau);
567  if (mother_pid == -2)
568  return -2;
569  int label = other;
570  if (abs(mother_pid) == 24)
571  label = W;
572  if (abs(mother_pid) == 23)
573  label = Z;
574  if (abs(mother_pid) == 22)
575  label = gamma;
576  if (abs(mother_pid) == 25)
577  label = HSM;
578  if (abs(mother_pid) == 35)
579  label = H0;
580  if (abs(mother_pid) == 36)
581  label = A0;
582  if (abs(mother_pid) == 37)
583  label = Hpm;
584  int mother_shortpid = (abs(mother_pid) % 10000);
585  if (mother_shortpid > 500 && mother_shortpid < 600)
586  label = B;
587  if (mother_shortpid > 400 && mother_shortpid < 500)
588  label = D;
589  TauMothers->Fill(label, weight);
590  if (label == B || label == D || label == other)
591  return -1;
592  return mother_pid;
593 }
594 
595 int TauValidation::tauDecayChannel(const reco::GenParticle *tau, int jak_id, unsigned int TauBitMask, double weight) {
596  int channel = undetermined;
597  if (tau->status() == 1)
598  channel = stable;
599  int allCount = 0, eCount = 0, muCount = 0, pi0Count = 0, piCount = 0, rhoCount = 0, a1Count = 0, KCount = 0,
600  KstarCount = 0;
601 
602  countParticles(tau, allCount, eCount, muCount, pi0Count, piCount, rhoCount, a1Count, KCount, KstarCount);
603 
604  // resonances
605  if (KCount >= 1)
606  channel = K;
607  if (KstarCount >= 1)
608  channel = Kstar;
609  if (a1Count >= 1)
610  channel = a1;
611  if (rhoCount >= 1)
612  channel = rho;
613  if (channel != undetermined && weight != 0.0)
614  TauDecayChannels->Fill(channel, weight);
615 
616  // final state products
617  if (piCount == 1 && pi0Count == 0)
618  channel = pi;
619  if (piCount == 1 && pi0Count == 1)
620  channel = pi1pi0;
621  if (piCount == 1 && pi0Count > 1)
622  channel = pinpi0;
623  if (piCount == 3 && pi0Count == 0)
624  channel = tripi;
625  if (piCount == 3 && pi0Count > 0)
626  channel = tripinpi0;
627  if (eCount == 1)
628  channel = electron;
629  if (muCount == 1)
630  channel = muon;
631  if (weight != 0.0)
632  TauDecayChannels->Fill(channel, weight);
633  return channel;
634 }
635 
637  int &allCount,
638  int &eCount,
639  int &muCount,
640  int &pi0Count,
641  int &piCount,
642  int &rhoCount,
643  int &a1Count,
644  int &KCount,
645  int &KstarCount) {
646  for (unsigned int i = 0; i < p->numberOfDaughters(); i++) {
647  const reco::GenParticle *dau = static_cast<const reco::GenParticle *>(p->daughter(i));
648  int pid = dau->pdgId();
649  allCount++;
650  if (abs(pid) == 11)
651  eCount++;
652  else if (abs(pid) == 13)
653  muCount++;
654  else if (abs(pid) == 111)
655  pi0Count++;
656  else if (abs(pid) == 211)
657  piCount++;
658  else if (abs(pid) == 213)
659  rhoCount++;
660  else if (abs(pid) == 20213)
661  a1Count++;
662  else if (abs(pid) == 321)
663  KCount++;
664  else if (abs(pid) == 323)
665  KstarCount++;
666  countParticles(dau, allCount, eCount, muCount, pi0Count, piCount, rhoCount, a1Count, KCount, KstarCount);
667  }
668 }
669 
671  const reco::GenParticle *tau, int mother, int decay, std::vector<const reco::GenParticle *> &part, double weight) {
672  // polarization only for 1-prong hadronic taus with no neutral pions
673  if (decay == TauDecay::MODE_PION || decay == TauDecay::MODE_MUON || decay == TauDecay::MODE_ELECTRON) {
674  TLorentzVector momP4 = motherP4(tau);
675  TLorentzVector pionP4 = leadingPionP4(tau);
676  pionP4.Boost(-1 * momP4.BoostVector());
677  double energy = pionP4.E() / (momP4.M() / 2);
678  if (decay == TauDecay::MODE_PION) {
679  if (abs(mother) == 24)
680  TauSpinEffectsW_X->Fill(energy, weight);
681  else if (abs(mother) == 37)
682  TauSpinEffectsHpm_X->Fill(energy, weight);
683  }
684  else if (decay == TauDecay::MODE_MUON) {
685  if (abs(mother) == 24)
686  TauSpinEffectsW_muX->Fill(energy, weight);
687  else if (abs(mother) == 37)
688  TauSpinEffectsHpm_muX->Fill(energy, weight);
689  }
690  else if (decay == TauDecay::MODE_ELECTRON) {
691  if (abs(mother) == 24)
692  TauSpinEffectsW_eX->Fill(energy, weight);
693  else if (abs(mother) == 37)
694  TauSpinEffectsHpm_eX->Fill(energy, weight);
695  }
696  } else if (decay == TauDecay::MODE_PIPI0) {
697  TLorentzVector rho(0, 0, 0, 0), pi(0, 0, 0, 0);
698  for (unsigned int i = 0; i < part.size(); i++) {
699  TLorentzVector LV(part.at(i)->px(), part.at(i)->py(), part.at(i)->pz(), part.at(i)->energy());
700  if (abs(part.at(i)->pdgId()) == PdtPdgMini::pi_plus) {
701  pi += LV;
702  rho += LV;
703  }
704  else if (abs(part.at(i)->pdgId()) == PdtPdgMini::pi0) {
705  rho += LV;
706  }
707  }
708  if (abs(mother) == 24)
709  TauSpinEffectsW_UpsilonRho->Fill(2 * pi.P() / rho.P() - 1, weight);
710  else if (abs(mother) == 37)
711  TauSpinEffectsHpm_UpsilonRho->Fill(2 * pi.P() / rho.P() - 1, weight);
712  } else if (decay == TauDecay::MODE_3PI || decay == TauDecay::MODE_PI2PI0) { // only for pi2pi0 for now
713  TLorentzVector a1(0, 0, 0, 0), pi_p(0, 0, 0, 0), pi_m(0, 0, 0, 0);
714  int nplus(0), nminus(0);
715  for (unsigned int i = 0; i < part.size(); i++) {
716  TLorentzVector LV(part.at(i)->px(), part.at(i)->py(), part.at(i)->pz(), part.at(i)->energy());
717  if (part.at(i)->pdgId() == PdtPdgMini::pi_plus) {
718  pi_p += LV;
719  a1 += LV;
720  nplus++;
721  }
722  else if (part.at(i)->pdgId() == PdtPdgMini::pi_minus) {
723  pi_m += LV;
724  a1 += LV;
725  nminus++;
726  }
727  }
728  double gamma = 0;
729  if (nplus + nminus == 3 && nplus == 1)
730  gamma = 2 * pi_p.P() / a1.P() - 1;
731  else if (nplus + nminus == 3 && nminus == 1)
732  gamma = 2 * pi_m.P() / a1.P() - 1;
733  else {
734  pi_p += pi_m;
735  gamma = 2 * pi_p.P() / a1.P() - 1;
736  }
737  if (abs(mother) == 24)
738  TauSpinEffectsW_UpsilonA1->Fill(gamma, weight);
739  else if (abs(mother) == 37)
740  TauSpinEffectsHpm_UpsilonA1->Fill(gamma, weight);
741  }
742 }
743 
745  int ntau(0);
746  for (unsigned int i = 0; i < boson->numberOfDaughters(); i++) {
747  const reco::GenParticle *dau = static_cast<const reco::GenParticle *>(boson->daughter(i));
748  if (ntau == 1 && dau->pdgId() == 15)
749  return;
750  if (boson->pdgId() != 15 && abs(dau->pdgId()) == 15)
751  ntau++;
752  }
753  if (ntau != 2)
754  return;
755  if (abs(boson->pdgId()) == PdtPdgMini::Z0 || abs(boson->pdgId()) == PdtPdgMini::Higgs0) {
756  TLorentzVector tautau(0, 0, 0, 0);
757  TLorentzVector pipi(0, 0, 0, 0);
758  TLorentzVector taum(0, 0, 0, 0);
759  TLorentzVector taup(0, 0, 0, 0);
760  TLorentzVector rho_plus, rho_minus, pi_rhominus, pi0_rhominus, pi_rhoplus, pi0_rhoplus, pi_plus, pi_minus;
761  bool hasrho_minus(false), hasrho_plus(false), haspi_minus(false), haspi_plus(false);
762  int nSinglePionDecays(0), nSingleMuonDecays(0), nSingleElectronDecays(0);
763  double x1(0), x2(0);
764  TLorentzVector Zboson(boson->px(), boson->py(), boson->pz(), boson->energy());
765  for (unsigned int i = 0; i < boson->numberOfDaughters(); i++) {
766  const reco::GenParticle *dau = static_cast<const reco::GenParticle *>(boson->daughter(i));
767  int pid = dau->pdgId();
768  if (abs(findMother(dau)) != 15 && abs(pid) == 15) {
770  unsigned int jak_id, TauBitMask;
771  if (TD.AnalyzeTau(dau, jak_id, TauBitMask, false, false)) {
772  std::vector<const reco::GenParticle *> part = TD.Get_TauDecayProducts();
773  if (jak_id == TauDecay::MODE_PION || jak_id == TauDecay::MODE_MUON || jak_id == TauDecay::MODE_ELECTRON) {
774  if (jak_id == TauDecay::MODE_PION)
775  nSinglePionDecays++;
776  if (jak_id == TauDecay::MODE_MUON)
777  nSingleMuonDecays++;
778  if (jak_id == TauDecay::MODE_ELECTRON)
779  nSingleElectronDecays++;
780  TLorentzVector LVtau(dau->px(), dau->py(), dau->pz(), dau->energy());
781  tautau += LVtau;
782  TLorentzVector LVpi = leadingPionP4(dau);
783  pipi += LVpi;
784  const HepPDT::ParticleData *pd = fPDGTable->particle(dau->pdgId());
785  int charge = (int)pd->charge();
786  LVtau.Boost(-1 * Zboson.BoostVector());
787  LVpi.Boost(-1 * Zboson.BoostVector());
788 
789  if (jak_id == TauDecay::MODE_MUON) {
790  if (abs(boson->pdgId()) == PdtPdgMini::Z0)
791  TauSpinEffectsZ_muX->Fill(LVpi.P() / LVtau.E(), weight);
792  if (abs(boson->pdgId()) == PdtPdgMini::Higgs0)
793  TauSpinEffectsH_muX->Fill(LVpi.P() / LVtau.E(), weight);
794  }
795  if (jak_id == TauDecay::MODE_ELECTRON) {
796  if (abs(boson->pdgId()) == PdtPdgMini::Z0)
797  TauSpinEffectsZ_eX->Fill(LVpi.P() / LVtau.E(), weight);
798  if (abs(boson->pdgId()) == PdtPdgMini::Higgs0)
799  TauSpinEffectsH_eX->Fill(LVpi.P() / LVtau.E(), weight);
800  }
801 
802  if (jak_id == TauDecay::MODE_PION) {
803  if (abs(boson->pdgId()) == PdtPdgMini::Z0) {
804  TauSpinEffectsZ_X->Fill(LVpi.P() / LVtau.E(), weight);
805  if (50.0 < Zboson.M() && Zboson.M() < 75.0)
806  TauSpinEffectsZ_X50to75->Fill(LVpi.P() / LVtau.E(), weight);
807  if (75.0 < Zboson.M() && Zboson.M() < 88.0)
808  TauSpinEffectsZ_X75to88->Fill(LVpi.P() / LVtau.E(), weight);
809  if (88.0 < Zboson.M() && Zboson.M() < 100.0)
810  TauSpinEffectsZ_X88to100->Fill(LVpi.P() / LVtau.E(), weight);
811  if (100.0 < Zboson.M() && Zboson.M() < 120.0)
812  TauSpinEffectsZ_X100to120->Fill(LVpi.P() / LVtau.E(), weight);
813  if (120.0 < Zboson.M())
814  TauSpinEffectsZ_X120UP->Fill(LVpi.P() / LVtau.E(), weight);
815  }
816  if (abs(boson->pdgId()) == PdtPdgMini::Higgs0)
817  TauSpinEffectsH_X->Fill(LVpi.P() / LVtau.E(), weight);
818  }
819  if (charge < 0) {
820  x1 = LVpi.P() / LVtau.E();
821  taum = LVtau;
822  } else {
823  x2 = LVpi.P() / LVtau.E();
824  }
825  }
826  TLorentzVector LVtau(dau->px(), dau->py(), dau->pz(), dau->energy());
827  if (pid == 15)
828  taum = LVtau;
829  if (pid == -15)
830  taup = LVtau;
831  if (jak_id == TauDecay::MODE_PIPI0) {
832  for (unsigned int i = 0; i < part.size(); i++) {
833  int pid_d = part.at(i)->pdgId();
834  if (abs(pid_d) == 211 || abs(pid_d) == 111) {
835  TLorentzVector LV(part.at(i)->px(), part.at(i)->py(), part.at(i)->pz(), part.at(i)->energy());
836  if (pid == 15) {
837  hasrho_minus = true;
838  if (pid_d == -211) {
839  pi_rhominus = LV;
840  }
841  if (abs(pid_d) == 111) {
842  pi0_rhominus = LV;
843  }
844  }
845  if (pid == -15) {
846  hasrho_plus = true;
847  if (pid_d == 211) {
848  pi_rhoplus = LV;
849  }
850  if (abs(pid_d) == 111) {
851  pi0_rhoplus = LV;
852  }
853  }
854  }
855  }
856  }
857  if (jak_id == TauDecay::MODE_PION) {
858  for (unsigned int i = 0; i < part.size(); i++) {
859  int pid_d = part.at(i)->pdgId();
860  if (abs(pid_d) == 211) {
861  TLorentzVector LV(part.at(i)->px(), part.at(i)->py(), part.at(i)->pz(), part.at(i)->energy());
862  if (pid == 15) {
863  haspi_minus = true;
864  if (pid_d == -211) {
865  pi_minus = LV;
866  }
867  }
868  if (pid == -15) {
869  haspi_plus = true;
870  if (pid_d == 211) {
871  pi_plus = LV;
872  }
873  }
874  }
875  }
876  }
877  }
878  }
879  }
880  if (hasrho_minus && hasrho_plus) {
881  //compute rhorho
882  rho_minus = pi_rhominus;
883  rho_minus += pi0_rhominus;
884  rho_plus = pi_rhoplus;
885  rho_plus += pi0_rhoplus;
886  TLorentzVector rhorho = rho_minus;
887  rhorho += rho_plus;
888 
889  // boost to rhorho cm
890  TLorentzVector pi_rhoplusb = pi_rhoplus;
891  pi_rhoplusb.Boost(-1 * rhorho.BoostVector());
892  TLorentzVector pi0_rhoplusb = pi0_rhoplus;
893  pi0_rhoplusb.Boost(-1 * rhorho.BoostVector());
894  TLorentzVector pi_rhominusb = pi_rhominus;
895  pi_rhominusb.Boost(-1 * rhorho.BoostVector());
896  TLorentzVector pi0_rhominusb = pi0_rhominus;
897  pi0_rhominusb.Boost(-1 * rhorho.BoostVector());
898 
899  // compute n+/-
900  TVector3 n_plus = pi_rhoplusb.Vect().Cross(pi0_rhoplusb.Vect());
901  TVector3 n_minus = pi_rhominusb.Vect().Cross(pi0_rhominusb.Vect());
902 
903  // compute the acoplanarity
904  double Acoplanarity = acos(n_plus.Dot(n_minus) / (n_plus.Mag() * n_minus.Mag()));
905  if (pi_rhominusb.Vect().Dot(n_plus) > 0) {
906  Acoplanarity *= -1;
907  Acoplanarity += 2 * TMath::Pi();
908  }
909 
910  // now boost to tau frame
911  pi_rhoplus.Boost(-1 * taup.BoostVector());
912  pi0_rhoplus.Boost(-1 * taup.BoostVector());
913  pi_rhominus.Boost(-1 * taum.BoostVector());
914  pi0_rhominus.Boost(-1 * taum.BoostVector());
915 
916  // compute y1 and y2
917  double y1 = (pi_rhoplus.E() - pi0_rhoplus.E()) / (pi_rhoplus.E() + pi0_rhoplus.E());
918  double y2 = (pi_rhominus.E() - pi0_rhominus.E()) / (pi_rhominus.E() + pi0_rhominus.E());
919 
920  // fill histograms
921  if (abs(boson->pdgId()) == PdtPdgMini::Higgs0 && y1 * y2 < 0)
922  TauSpinEffectsH_rhorhoAcoplanarityminus->Fill(Acoplanarity, weight);
923  if (abs(boson->pdgId()) == PdtPdgMini::Higgs0 && y1 * y2 > 0)
924  TauSpinEffectsH_rhorhoAcoplanarityplus->Fill(Acoplanarity, weight);
925  }
926  if (haspi_minus && haspi_plus) {
927  TLorentzVector tauporig = taup;
928  TLorentzVector taumorig = taum;
929 
930  // now boost to Higgs frame
931  pi_plus.Boost(-1 * Zboson.BoostVector());
932  pi_minus.Boost(-1 * Zboson.BoostVector());
933 
934  taup.Boost(-1 * Zboson.BoostVector());
935  taum.Boost(-1 * Zboson.BoostVector());
936 
937  if (abs(boson->pdgId()) == PdtPdgMini::Higgs0) {
939  acos(pi_plus.Vect().Dot(pi_minus.Vect()) / (pi_plus.P() * pi_minus.P())));
941  acos(pi_plus.Vect().Dot(pi_minus.Vect()) / (pi_plus.P() * pi_minus.P())));
942  }
943 
944  double proj_m = taum.Vect().Dot(pi_minus.Vect()) / (taum.P() * taum.P());
945  double proj_p = taup.Vect().Dot(pi_plus.Vect()) / (taup.P() * taup.P());
946  TVector3 Tau_m = taum.Vect();
947  TVector3 Tau_p = taup.Vect();
948  Tau_m *= proj_m;
949  Tau_p *= proj_p;
950  TVector3 Pit_m = pi_minus.Vect() - Tau_m;
951  TVector3 Pit_p = pi_plus.Vect() - Tau_p;
952 
953  double Acoplanarity = acos(Pit_m.Dot(Pit_p) / (Pit_p.Mag() * Pit_m.Mag()));
954  TVector3 n = Pit_p.Cross(Pit_m);
955  if (n.Dot(Tau_m) / Tau_m.Mag() > 0) {
956  Acoplanarity *= -1;
957  Acoplanarity += 2 * TMath::Pi();
958  }
959  // fill histograms
960  if (abs(boson->pdgId()) == PdtPdgMini::Higgs0)
961  TauSpinEffectsH_pipiAcoplanarity->Fill(Acoplanarity, weight);
962  taup = tauporig;
963  taum = taumorig;
964  }
965  if (nSinglePionDecays == 2 && tautau.M() != 0) {
966  for (int i = 0; i < zsbins; i++) {
967  double zslow = ((double)i) * (zsmax - zsmin) / ((double)zsbins) + zsmin;
968  double zsup = ((double)i + 1) * (zsmax - zsmin) / ((double)zsbins) + zsmin;
969  double aup = Zstoa(zsup), alow = Zstoa(zslow);
970  if (x2 - x1 > alow && x2 - x1 < aup) {
971  double zs = (zsup + zslow) / 2;
972  if (abs(boson->pdgId()) == PdtPdgMini::Z0)
973  TauSpinEffectsZ_Zs->Fill(zs, weight);
974  if (abs(boson->pdgId()) == PdtPdgMini::Higgs0)
975  TauSpinEffectsH_Zs->Fill(zs, weight);
976  break;
977  }
978  }
979  if (abs(boson->pdgId()) == PdtPdgMini::Z0)
980  TauSpinEffectsZ_MVis->Fill(pipi.M() / tautau.M(), weight);
981  if (abs(boson->pdgId()) == PdtPdgMini::Higgs0)
982  TauSpinEffectsH_MVis->Fill(pipi.M() / tautau.M(), weight);
983 
984  if (x1 != 0) {
985  const std::vector<const reco::GenParticle *> m = GetMothers(boson);
986  int q(0), qbar(0);
987  TLorentzVector Z(0, 0, 0, 0);
988  for (unsigned int i = 0; i < m.size(); i++) {
989  if (m.at(i)->pdgId() == PdtPdgMini::d || m.at(i)->pdgId() == PdtPdgMini::u) {
990  q++;
991  }
992  if (m.at(i)->pdgId() == PdtPdgMini::anti_d || m.at(i)->pdgId() == PdtPdgMini::anti_u) {
993  qbar++;
994  }
995  }
996  if (q == 1 && qbar == 1) { // assume q has largest E (valence vs see quarks)
997  if (taum.Vect().Dot(Zboson.Vect()) / (Zboson.P() * taum.P()) > 0) {
998  if (abs(boson->pdgId()) == PdtPdgMini::Z0)
999  TauSpinEffectsZ_Xf->Fill(x1, weight);
1000  if (abs(boson->pdgId()) == PdtPdgMini::Higgs0)
1001  TauSpinEffectsH_Xf->Fill(x1, weight);
1002  } else {
1003  if (abs(boson->pdgId()) == PdtPdgMini::Z0)
1004  TauSpinEffectsZ_Xb->Fill(x1, weight);
1005  if (abs(boson->pdgId()) == PdtPdgMini::Higgs0)
1006  TauSpinEffectsH_Xb->Fill(x1, weight);
1007  }
1008  }
1009  }
1010  }
1011  }
1012 }
1013 
1014 double TauValidation::Zstoa(double zs) {
1015  double a = 1 - sqrt(fabs(1.0 - 2 * fabs(zs)));
1016  if (zs < 0) {
1017  a *= -1.0;
1018  }
1019  return a;
1020 }
1021 
1023  return leadingPionP4(tau).P();
1024 }
1025 
1027  TLorentzVector p4(0, 0, 0, 0);
1028  for (unsigned int i = 0; i < tau->numberOfDaughters(); i++) {
1029  const reco::GenParticle *dau = static_cast<const reco::GenParticle *>(tau->daughter(i));
1030  int pid = dau->pdgId();
1031  if (abs(pid) == 15)
1032  return leadingPionP4(dau);
1033  if (!(abs(pid) == 211 || abs(pid) == 13 || abs(pid) == 11))
1034  continue;
1035  if (dau->p() > p4.P())
1036  p4 = TLorentzVector(dau->px(), dau->py(), dau->pz(), dau->energy());
1037  }
1038  return p4;
1039 }
1040 
1042  const reco::GenParticle *m = GetMother(tau);
1043  return TLorentzVector(m->px(), m->py(), m->pz(), m->energy());
1044 }
1045 
1047  TLorentzVector p4(tau->px(), tau->py(), tau->pz(), tau->energy());
1048  for (unsigned int i = 0; i < tau->numberOfDaughters(); i++) {
1049  const reco::GenParticle *dau = static_cast<const reco::GenParticle *>(tau->daughter(i));
1050  int pid = dau->pdgId();
1051  if (abs(pid) == 15)
1052  return visibleTauEnergy(dau);
1053  if (abs(pid) == 12 || abs(pid) == 14 || abs(pid) == 16) {
1054  p4 -= TLorentzVector(dau->px(), dau->py(), dau->pz(), dau->energy());
1055  }
1056  }
1057  return p4.E();
1058 }
1059 
1061  // Find First tau in chain
1062  std::vector<const reco::GenParticle *> TauList;
1063  findTauList(tau, TauList);
1064 
1065  // Get List of Gauge Boson to tau(s) FSR and Brem
1066  bool passedW = false;
1067  std::vector<const reco::GenParticle *> ListofFSR;
1068  ListofFSR.clear();
1069  std::vector<const reco::GenParticle *> ListofBrem;
1070  ListofBrem.clear();
1071  std::vector<const reco::GenParticle *> FSR_photos;
1072  FSR_photos.clear();
1073  double BosonScale(1);
1074  if (!TauList.empty()) {
1075  TauValidation::findFSRandBrem(TauList.at(0), passedW, ListofFSR, ListofBrem);
1076  TauValidation::FindPhotosFSR(TauList.at(0), FSR_photos, BosonScale);
1077 
1078  // Add the Tau Brem. information
1079  TauBremPhotonsN->Fill(ListofBrem.size(), weight);
1080  double photonPtSum = 0;
1081  for (unsigned int i = 0; i < ListofBrem.size(); i++) {
1082  photonPtSum += ListofBrem.at(i)->pt();
1083  TauBremPhotonsPt->Fill(ListofBrem.at(i)->pt(), weight);
1084  }
1085  TauBremPhotonsPtSum->Fill(photonPtSum, weight);
1086 
1087  // Now add the Gauge Boson FSR information
1088  if (BosonScale != 0) {
1089  TauFSRPhotonsN->Fill(ListofFSR.size(), weight);
1090  photonPtSum = 0;
1091  for (unsigned int i = 0; i < ListofFSR.size(); i++) {
1092  photonPtSum += ListofFSR.at(i)->pt();
1093  TauFSRPhotonsPt->Fill(ListofFSR.at(i)->pt(), weight);
1094  }
1095  double FSR_photosSum(0);
1096  for (unsigned int i = 0; i < FSR_photos.size(); i++) {
1097  FSR_photosSum += FSR_photos.at(i)->pt();
1098  TauFSRPhotonsPt->Fill(FSR_photos.at(i)->pt() / BosonScale, weight * BosonScale);
1099  }
1100  TauFSRPhotonsPtSum->Fill(photonPtSum + FSR_photosSum / BosonScale, weight);
1101  }
1102  }
1103 }
MonitorElement * TauFSRPhotonsN
Definition: TauValidation.h:92
const double Pi
int pdgId() const final
PDG identifier.
const Candidate * daughter(size_type) const override
return daughter at a given position, i = 0, ... numberOfDaughters() - 1 (read only mode) ...
int findMother(const reco::GenParticle *)
MonitorElement * TauSpinEffectsH_rhorhoAcoplanarityplus
Definition: TauValidation.h:92
MonitorElement * TauPhi
Definition: TauValidation.h:92
MonitorElement * TauSpinEffectsW_X
Definition: TauValidation.h:92
MonitorElement * TauSpinEffectsHpm_UpsilonA1
Definition: TauValidation.h:92
MonitorElement * MODEID
MonitorElement * TauSpinEffectsZ_Xb
Definition: TauValidation.h:92
MonitorElement * nTaus
Definition: TauValidation.h:91
MonitorElement * DecayLength
Definition: TauValidation.h:92
std::vector< std::vector< MonitorElement * > > MODEInvMass
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:517
math::XYZTLorentzVectorD LV
TauValidation(const edm::ParameterSet &)
MonitorElement * TauPt
Definition: TauValidation.h:92
~TauValidation() override
MonitorElement * TauSpinEffectsH_MVis
Definition: TauValidation.h:92
MonitorElement * TauMothers
Definition: TauValidation.h:92
double px() const final
x coordinate of momentum vector
size_t numberOfMothers() const override
number of mothers
MonitorElement * TauSpinEffectsHpm_eX
Definition: TauValidation.h:92
MonitorElement * TauSpinEffectsZ_X100to120
Definition: TauValidation.h:92
void FindPhotosFSR(const reco::GenParticle *p, std::vector< const reco::GenParticle * > &ListofFSR, double &BosonScale)
MonitorElement * TauSpinEffectsW_muX
Definition: TauValidation.h:92
MonitorElement * TauBremPhotonsN
Definition: TauValidation.h:92
void spinEffectsWHpm(const reco::GenParticle *, int, int, std::vector< const reco::GenParticle * > &part, double weight)
void setBinLabel(int bin, const std::string &label, int axis=1)
set bin label for x, y or z axis (axis=1, 2, 3 respectively)
MonitorElement * TauSpinEffectsZ_Xf
Definition: TauValidation.h:92
bool isLastTauinChain(const reco::GenParticle *tau)
Definition: weight.py:1
MonitorElement * TauBremPhotonsPtSum
Definition: TauValidation.h:92
MonitorElement * TauSpinEffectsH_pipiAcoplanarity
Definition: TauValidation.h:92
MonitorElement * TauSpinEffectsHpm_UpsilonRho
Definition: TauValidation.h:92
MonitorElement * book1dHisto(std::string name, std::string title, int n, double xmin, double xmax, std::string xaxis, std::string yaxis)
Definition: DQMHelper.cc:12
double leadingPionMomentum(const reco::GenParticle *, double weight)
MonitorElement * TauSpinEffectsZ_eX
Definition: TauValidation.h:92
void Fill(long long x)
MonitorElement * TauProngs
Definition: TauValidation.h:92
TLorentzVector motherP4(const reco::GenParticle *)
bool isTauFinalStateParticle(int pdgid)
Definition: TauDecay.cc:36
void dqmBeginRun(const edm::Run &r, const edm::EventSetup &c) override
MonitorElement * TauSpinEffectsH_pipiAcollinearityzoom
Definition: TauValidation.h:92
bool getData(T &iHolder) const
Definition: EventSetup.h:111
char const * label
void photons(const reco::GenParticle *, double weight)
int iEvent
Definition: GenABIO.cc:224
MonitorElement * TauSpinEffectsW_UpsilonRho
Definition: TauValidation.h:92
const reco::GenParticle * GetMother(const reco::GenParticle *tau)
MonitorElement * TauSpinEffectsZ_X88to100
Definition: TauValidation.h:92
void setCurrentFolder(std::string const &fullpath)
Definition: DQMStore.cc:268
MonitorElement * TauSpinEffectsH_rhorhoAcoplanarityminus
Definition: TauValidation.h:92
double pz() const final
z coordinate of momentum vector
void analyze(edm::Event const &, edm::EventSetup const &) override
virtual int pdgId() const =0
PDG identifier.
MonitorElement * TauSpinEffectsZ_X50to75
Definition: TauValidation.h:92
T sqrt(T t)
Definition: SSEVec.h:18
double p4[4]
Definition: TauolaWrapper.h:92
MonitorElement * TauSpinEffectsH_Xf
Definition: TauValidation.h:92
double energy() const final
energy
MonitorElement * TauFSRPhotonsPt
Definition: TauValidation.h:92
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
MonitorElement * TauSpinEffectsZ_muX
Definition: TauValidation.h:92
MonitorElement * TauDecayChannels
Definition: TauValidation.h:92
MonitorElement * TauSpinEffectsH_Zs
Definition: TauValidation.h:92
unsigned int NMODEID
MonitorElement * TauFSRPhotonsPtSum
Definition: TauValidation.h:92
HepPDT::ParticleData ParticleData
int tauMother(const reco::GenParticle *, double weight)
void bookHistograms(DQMStore::IBooker &i, edm::Run const &, edm::EventSetup const &) override
std::vector< const reco::GenParticle * > Get_TauDecayProducts()
const std::vector< const reco::GenParticle * > GetMothers(const reco::GenParticle *boson)
MonitorElement * TauSpinEffectsZ_MVis
Definition: TauValidation.h:92
MonitorElement * TauSpinEffectsZ_X75to88
Definition: TauValidation.h:92
double visibleTauEnergy(const reco::GenParticle *)
static std::string DecayMode(unsigned int &MODE_ID)
Definition: TauDecay.cc:258
double p() const final
magnitude of momentum vector
int tauDecayChannel(const reco::GenParticle *tau, int jak_id, unsigned int TauBitMask, double weight)
MonitorElement * TauSpinEffectsH_pipiAcollinearity
Definition: TauValidation.h:92
part
Definition: HCALResponse.h:20
size_t numberOfDaughters() const override
number of daughters
MonitorElement * TauSpinEffectsZ_X
Definition: TauValidation.h:92
double py() const final
y coordinate of momentum vector
edm::ESHandle< HepPDT::ParticleDataTable > fPDGTable
PDT table.
Definition: TauValidation.h:89
MonitorElement * TauSpinEffectsH_eX
Definition: TauValidation.h:92
MonitorElement * TauSpinEffectsW_eX
Definition: TauValidation.h:92
std::vector< std::vector< double > > tmp
Definition: MVATrainer.cc:100
edm::EDGetTokenT< reco::GenParticleCollection > genparticleCollectionToken_
double Zstoa(double zs)
void findTauList(const reco::GenParticle *tau, std::vector< const reco::GenParticle * > &TauList)
void findFSRandBrem(const reco::GenParticle *p, bool doBrem, std::vector< const reco::GenParticle * > &ListofFSR, std::vector< const reco::GenParticle * > &ListofBrem)
MonitorElement * LifeTime
Definition: TauValidation.h:92
HLT enums.
MonitorElement * TauSpinEffectsH_muX
Definition: TauValidation.h:92
MonitorElement * TauSpinEffectsW_UpsilonA1
Definition: TauValidation.h:92
double a
Definition: hdecay.h:121
void countParticles(const reco::GenParticle *p, int &allCount, int &eCount, int &muCount, int &pi0Count, int &piCount, int &rhoCount, int &a1Count, int &KCount, int &KstarCount)
MonitorElement * TauEta
Definition: TauValidation.h:92
int status() const final
status word
edm::InputTag genparticleCollection_
Definition: TauValidation.h:86
MonitorElement * TauSpinEffectsZ_Zs
Definition: TauValidation.h:92
MonitorElement * TauSpinEffectsHpm_X
Definition: TauValidation.h:92
MonitorElement * TauSpinEffectsHpm_muX
Definition: TauValidation.h:92
bool AnalyzeTau(const reco::GenParticle *Tau, unsigned int &MODE_ID, unsigned int &TauBitMask, bool dores, bool dopi0)
MonitorElement * TauSpinEffectsZ_X120UP
Definition: TauValidation.h:92
MonitorElement * TauSpinEffectsH_Xb
Definition: TauValidation.h:92
MonitorElement * nPrimeTaus
Definition: TauValidation.h:91
MonitorElement * TauBremPhotonsPt
Definition: TauValidation.h:92
void spinEffectsZH(const reco::GenParticle *boson, double weight)
const Candidate * mother(size_type=0) const override
return mother at a given position, i = 0, ... numberOfMothers() - 1 (read only mode) ...
Definition: Run.h:45
unsigned int nProng(unsigned int &TauBitMask)
Definition: TauDecay.cc:218
MonitorElement * TauSpinEffectsH_X
Definition: TauValidation.h:92
TLorentzVector leadingPionP4(const reco::GenParticle *)