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 
30 void TauValidation::dqmBeginRun(const edm::Run &r, const edm::EventSetup &c) { c.getData(fPDGTable); }
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");
46  TauDecayChannels = dqm.book1dHisto(
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 
75  DecayLength = dqm.book1dHisto(
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 
80  TauSpinEffectsW_X = dqm.book1dHisto(
81  "TauSpinEffectsWX", "X for pion", 50, 0, 1, "X", "Number of #tau#rightarrow#pi#nu from W^{#pm} Bosons");
82  TauSpinEffectsHpm_X = dqm.book1dHisto(
83  "TauSpinEffectsHpmX", "X for pion", 50, 0, 1, "X", "Number of #tau#rightarrow#pi#nu from H^{#pm} Bosons");
84 
85  TauSpinEffectsW_eX = dqm.book1dHisto(
86  "TauSpinEffectsWeX", "X for e", 50, 0, 1, "X", "Number of #tau#rightarrowe#nu#nu from W^{#pm} Bosons");
87  TauSpinEffectsHpm_eX = dqm.book1dHisto(
88  "TauSpinEffectsHpmeX", "X for e", 50, 0, 1, "X", "Number of #tau#rightarrowe#nu#nu from H^{#pm} Bosons");
89 
90  TauSpinEffectsW_muX = dqm.book1dHisto(
91  "TauSpinEffectsWmuX", "X for mu", 50, 0, 1, "X", "Number of #tau#rightarrow#mu#nu#nu from W^{#pm} Bosons");
92  TauSpinEffectsHpm_muX = dqm.book1dHisto(
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 
185  TauSpinEffectsZ_X = dqm.book1dHisto(
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 
223  TauSpinEffectsH_X = dqm.book1dHisto(
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 
256  TauSpinEffectsZ_eX = dqm.book1dHisto(
257  "TauSpinEffectsZeX", "X for e", 50, 0, 1, "X", "Number of #tau#rightarrowe#nu#nu from Gauge Bosons");
258  TauSpinEffectsH_eX = dqm.book1dHisto(
259  "TauSpinEffectsHeX", "X for e", 50, 0, 1, "X", "Number of #tau#rightarrowe#nu#nu from Gauge Bosons");
260 
261  TauSpinEffectsZ_muX = dqm.book1dHisto(
262  "TauSpinEffectsZmuX", "X for mu", 50, 0, 1, "X", "Number of #tau#rightarrow#mu#nu#nu from Gauge Bosons");
263  TauSpinEffectsH_muX = dqm.book1dHisto(
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 
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;
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
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)
681  else if (abs(mother) == 37)
683  } else if (decay == TauDecay::MODE_MUON) {
684  if (abs(mother) == 24)
686  else if (abs(mother) == 37)
688  } else if (decay == TauDecay::MODE_ELECTRON) {
689  if (abs(mother) == 24)
691  else if (abs(mother) == 37)
693  }
694  } else if (decay == TauDecay::MODE_PIPI0) {
695  TLorentzVector rho(0, 0, 0, 0), pi(0, 0, 0, 0);
696  for (unsigned int i = 0; i < part.size(); i++) {
697  TLorentzVector LV(part.at(i)->px(), part.at(i)->py(), part.at(i)->pz(), part.at(i)->energy());
698  if (abs(part.at(i)->pdgId()) == PdtPdgMini::pi_plus) {
699  pi += LV;
700  rho += LV;
701  } else if (abs(part.at(i)->pdgId()) == PdtPdgMini::pi0) {
702  rho += LV;
703  }
704  }
705  if (abs(mother) == 24)
706  TauSpinEffectsW_UpsilonRho->Fill(2 * pi.P() / rho.P() - 1, weight);
707  else if (abs(mother) == 37)
708  TauSpinEffectsHpm_UpsilonRho->Fill(2 * pi.P() / rho.P() - 1, weight);
709  } else if (decay == TauDecay::MODE_3PI || decay == TauDecay::MODE_PI2PI0) { // only for pi2pi0 for now
710  TLorentzVector a1(0, 0, 0, 0), pi_p(0, 0, 0, 0), pi_m(0, 0, 0, 0);
711  int nplus(0), nminus(0);
712  for (unsigned int i = 0; i < part.size(); i++) {
713  TLorentzVector LV(part.at(i)->px(), part.at(i)->py(), part.at(i)->pz(), part.at(i)->energy());
714  if (part.at(i)->pdgId() == PdtPdgMini::pi_plus) {
715  pi_p += LV;
716  a1 += LV;
717  nplus++;
718  } else if (part.at(i)->pdgId() == PdtPdgMini::pi_minus) {
719  pi_m += LV;
720  a1 += LV;
721  nminus++;
722  }
723  }
724  double gamma = 0;
725  if (nplus + nminus == 3 && nplus == 1)
726  gamma = 2 * pi_p.P() / a1.P() - 1;
727  else if (nplus + nminus == 3 && nminus == 1)
728  gamma = 2 * pi_m.P() / a1.P() - 1;
729  else {
730  pi_p += pi_m;
731  gamma = 2 * pi_p.P() / a1.P() - 1;
732  }
733  if (abs(mother) == 24)
735  else if (abs(mother) == 37)
737  }
738 }
739 
741  int ntau(0);
742  for (unsigned int i = 0; i < boson->numberOfDaughters(); i++) {
743  const reco::GenParticle *dau = static_cast<const reco::GenParticle *>(boson->daughter(i));
744  if (ntau == 1 && dau->pdgId() == 15)
745  return;
746  if (boson->pdgId() != 15 && abs(dau->pdgId()) == 15)
747  ntau++;
748  }
749  if (ntau != 2)
750  return;
751  if (abs(boson->pdgId()) == PdtPdgMini::Z0 || abs(boson->pdgId()) == PdtPdgMini::Higgs0) {
752  TLorentzVector tautau(0, 0, 0, 0);
753  TLorentzVector pipi(0, 0, 0, 0);
754  TLorentzVector taum(0, 0, 0, 0);
755  TLorentzVector taup(0, 0, 0, 0);
756  TLorentzVector rho_plus, rho_minus, pi_rhominus, pi0_rhominus, pi_rhoplus, pi0_rhoplus, pi_plus, pi_minus;
757  bool hasrho_minus(false), hasrho_plus(false), haspi_minus(false), haspi_plus(false);
758  int nSinglePionDecays(0), nSingleMuonDecays(0), nSingleElectronDecays(0);
759  double x1(0), x2(0);
760  TLorentzVector Zboson(boson->px(), boson->py(), boson->pz(), boson->energy());
761  for (unsigned int i = 0; i < boson->numberOfDaughters(); i++) {
762  const reco::GenParticle *dau = static_cast<const reco::GenParticle *>(boson->daughter(i));
763  int pid = dau->pdgId();
764  if (abs(findMother(dau)) != 15 && abs(pid) == 15) {
766  unsigned int jak_id, TauBitMask;
767  if (TD.AnalyzeTau(dau, jak_id, TauBitMask, false, false)) {
768  std::vector<const reco::GenParticle *> part = TD.Get_TauDecayProducts();
769  if (jak_id == TauDecay::MODE_PION || jak_id == TauDecay::MODE_MUON || jak_id == TauDecay::MODE_ELECTRON) {
770  if (jak_id == TauDecay::MODE_PION)
771  nSinglePionDecays++;
772  if (jak_id == TauDecay::MODE_MUON)
773  nSingleMuonDecays++;
774  if (jak_id == TauDecay::MODE_ELECTRON)
775  nSingleElectronDecays++;
776  TLorentzVector LVtau(dau->px(), dau->py(), dau->pz(), dau->energy());
777  tautau += LVtau;
778  TLorentzVector LVpi = leadingPionP4(dau);
779  pipi += LVpi;
780  const HepPDT::ParticleData *pd = fPDGTable->particle(dau->pdgId());
781  int charge = (int)pd->charge();
782  LVtau.Boost(-1 * Zboson.BoostVector());
783  LVpi.Boost(-1 * Zboson.BoostVector());
784 
785  if (jak_id == TauDecay::MODE_MUON) {
786  if (abs(boson->pdgId()) == PdtPdgMini::Z0)
787  TauSpinEffectsZ_muX->Fill(LVpi.P() / LVtau.E(), weight);
788  if (abs(boson->pdgId()) == PdtPdgMini::Higgs0)
789  TauSpinEffectsH_muX->Fill(LVpi.P() / LVtau.E(), weight);
790  }
791  if (jak_id == TauDecay::MODE_ELECTRON) {
792  if (abs(boson->pdgId()) == PdtPdgMini::Z0)
793  TauSpinEffectsZ_eX->Fill(LVpi.P() / LVtau.E(), weight);
794  if (abs(boson->pdgId()) == PdtPdgMini::Higgs0)
795  TauSpinEffectsH_eX->Fill(LVpi.P() / LVtau.E(), weight);
796  }
797 
798  if (jak_id == TauDecay::MODE_PION) {
799  if (abs(boson->pdgId()) == PdtPdgMini::Z0) {
800  TauSpinEffectsZ_X->Fill(LVpi.P() / LVtau.E(), weight);
801  if (50.0 < Zboson.M() && Zboson.M() < 75.0)
802  TauSpinEffectsZ_X50to75->Fill(LVpi.P() / LVtau.E(), weight);
803  if (75.0 < Zboson.M() && Zboson.M() < 88.0)
804  TauSpinEffectsZ_X75to88->Fill(LVpi.P() / LVtau.E(), weight);
805  if (88.0 < Zboson.M() && Zboson.M() < 100.0)
806  TauSpinEffectsZ_X88to100->Fill(LVpi.P() / LVtau.E(), weight);
807  if (100.0 < Zboson.M() && Zboson.M() < 120.0)
808  TauSpinEffectsZ_X100to120->Fill(LVpi.P() / LVtau.E(), weight);
809  if (120.0 < Zboson.M())
810  TauSpinEffectsZ_X120UP->Fill(LVpi.P() / LVtau.E(), weight);
811  }
812  if (abs(boson->pdgId()) == PdtPdgMini::Higgs0)
813  TauSpinEffectsH_X->Fill(LVpi.P() / LVtau.E(), weight);
814  }
815  if (charge < 0) {
816  x1 = LVpi.P() / LVtau.E();
817  taum = LVtau;
818  } else {
819  x2 = LVpi.P() / LVtau.E();
820  }
821  }
822  TLorentzVector LVtau(dau->px(), dau->py(), dau->pz(), dau->energy());
823  if (pid == 15)
824  taum = LVtau;
825  if (pid == -15)
826  taup = LVtau;
827  if (jak_id == TauDecay::MODE_PIPI0) {
828  for (unsigned int i = 0; i < part.size(); i++) {
829  int pid_d = part.at(i)->pdgId();
830  if (abs(pid_d) == 211 || abs(pid_d) == 111) {
831  TLorentzVector LV(part.at(i)->px(), part.at(i)->py(), part.at(i)->pz(), part.at(i)->energy());
832  if (pid == 15) {
833  hasrho_minus = true;
834  if (pid_d == -211) {
835  pi_rhominus = LV;
836  }
837  if (abs(pid_d) == 111) {
838  pi0_rhominus = LV;
839  }
840  }
841  if (pid == -15) {
842  hasrho_plus = true;
843  if (pid_d == 211) {
844  pi_rhoplus = LV;
845  }
846  if (abs(pid_d) == 111) {
847  pi0_rhoplus = LV;
848  }
849  }
850  }
851  }
852  }
853  if (jak_id == TauDecay::MODE_PION) {
854  for (unsigned int i = 0; i < part.size(); i++) {
855  int pid_d = part.at(i)->pdgId();
856  if (abs(pid_d) == 211) {
857  TLorentzVector LV(part.at(i)->px(), part.at(i)->py(), part.at(i)->pz(), part.at(i)->energy());
858  if (pid == 15) {
859  haspi_minus = true;
860  if (pid_d == -211) {
861  pi_minus = LV;
862  }
863  }
864  if (pid == -15) {
865  haspi_plus = true;
866  if (pid_d == 211) {
867  pi_plus = LV;
868  }
869  }
870  }
871  }
872  }
873  }
874  }
875  }
876  if (hasrho_minus && hasrho_plus) {
877  //compute rhorho
878  rho_minus = pi_rhominus;
879  rho_minus += pi0_rhominus;
880  rho_plus = pi_rhoplus;
881  rho_plus += pi0_rhoplus;
882  TLorentzVector rhorho = rho_minus;
883  rhorho += rho_plus;
884 
885  // boost to rhorho cm
886  TLorentzVector pi_rhoplusb = pi_rhoplus;
887  pi_rhoplusb.Boost(-1 * rhorho.BoostVector());
888  TLorentzVector pi0_rhoplusb = pi0_rhoplus;
889  pi0_rhoplusb.Boost(-1 * rhorho.BoostVector());
890  TLorentzVector pi_rhominusb = pi_rhominus;
891  pi_rhominusb.Boost(-1 * rhorho.BoostVector());
892  TLorentzVector pi0_rhominusb = pi0_rhominus;
893  pi0_rhominusb.Boost(-1 * rhorho.BoostVector());
894 
895  // compute n+/-
896  TVector3 n_plus = pi_rhoplusb.Vect().Cross(pi0_rhoplusb.Vect());
897  TVector3 n_minus = pi_rhominusb.Vect().Cross(pi0_rhominusb.Vect());
898 
899  // compute the acoplanarity
900  double Acoplanarity = acos(n_plus.Dot(n_minus) / (n_plus.Mag() * n_minus.Mag()));
901  if (pi_rhominusb.Vect().Dot(n_plus) > 0) {
902  Acoplanarity *= -1;
903  Acoplanarity += 2 * TMath::Pi();
904  }
905 
906  // now boost to tau frame
907  pi_rhoplus.Boost(-1 * taup.BoostVector());
908  pi0_rhoplus.Boost(-1 * taup.BoostVector());
909  pi_rhominus.Boost(-1 * taum.BoostVector());
910  pi0_rhominus.Boost(-1 * taum.BoostVector());
911 
912  // compute y1 and y2
913  double y1 = (pi_rhoplus.E() - pi0_rhoplus.E()) / (pi_rhoplus.E() + pi0_rhoplus.E());
914  double y2 = (pi_rhominus.E() - pi0_rhominus.E()) / (pi_rhominus.E() + pi0_rhominus.E());
915 
916  // fill histograms
917  if (abs(boson->pdgId()) == PdtPdgMini::Higgs0 && y1 * y2 < 0)
919  if (abs(boson->pdgId()) == PdtPdgMini::Higgs0 && y1 * y2 > 0)
921  }
922  if (haspi_minus && haspi_plus) {
923  TLorentzVector tauporig = taup;
924  TLorentzVector taumorig = taum;
925 
926  // now boost to Higgs frame
927  pi_plus.Boost(-1 * Zboson.BoostVector());
928  pi_minus.Boost(-1 * Zboson.BoostVector());
929 
930  taup.Boost(-1 * Zboson.BoostVector());
931  taum.Boost(-1 * Zboson.BoostVector());
932 
933  if (abs(boson->pdgId()) == PdtPdgMini::Higgs0) {
935  acos(pi_plus.Vect().Dot(pi_minus.Vect()) / (pi_plus.P() * pi_minus.P())));
937  acos(pi_plus.Vect().Dot(pi_minus.Vect()) / (pi_plus.P() * pi_minus.P())));
938  }
939 
940  double proj_m = taum.Vect().Dot(pi_minus.Vect()) / (taum.P() * taum.P());
941  double proj_p = taup.Vect().Dot(pi_plus.Vect()) / (taup.P() * taup.P());
942  TVector3 Tau_m = taum.Vect();
943  TVector3 Tau_p = taup.Vect();
944  Tau_m *= proj_m;
945  Tau_p *= proj_p;
946  TVector3 Pit_m = pi_minus.Vect() - Tau_m;
947  TVector3 Pit_p = pi_plus.Vect() - Tau_p;
948 
949  double Acoplanarity = acos(Pit_m.Dot(Pit_p) / (Pit_p.Mag() * Pit_m.Mag()));
950  TVector3 n = Pit_p.Cross(Pit_m);
951  if (n.Dot(Tau_m) / Tau_m.Mag() > 0) {
952  Acoplanarity *= -1;
953  Acoplanarity += 2 * TMath::Pi();
954  }
955  // fill histograms
956  if (abs(boson->pdgId()) == PdtPdgMini::Higgs0)
958  taup = tauporig;
959  taum = taumorig;
960  }
961  if (nSinglePionDecays == 2 && tautau.M() != 0) {
962  for (int i = 0; i < zsbins; i++) {
963  double zslow = ((double)i) * (zsmax - zsmin) / ((double)zsbins) + zsmin;
964  double zsup = ((double)i + 1) * (zsmax - zsmin) / ((double)zsbins) + zsmin;
965  double aup = Zstoa(zsup), alow = Zstoa(zslow);
966  if (x2 - x1 > alow && x2 - x1 < aup) {
967  double zs = (zsup + zslow) / 2;
968  if (abs(boson->pdgId()) == PdtPdgMini::Z0)
970  if (abs(boson->pdgId()) == PdtPdgMini::Higgs0)
972  break;
973  }
974  }
975  if (abs(boson->pdgId()) == PdtPdgMini::Z0)
976  TauSpinEffectsZ_MVis->Fill(pipi.M() / tautau.M(), weight);
977  if (abs(boson->pdgId()) == PdtPdgMini::Higgs0)
978  TauSpinEffectsH_MVis->Fill(pipi.M() / tautau.M(), weight);
979 
980  if (x1 != 0) {
981  const std::vector<const reco::GenParticle *> m = GetMothers(boson);
982  int q(0), qbar(0);
983  TLorentzVector Z(0, 0, 0, 0);
984  for (unsigned int i = 0; i < m.size(); i++) {
985  if (m.at(i)->pdgId() == PdtPdgMini::d || m.at(i)->pdgId() == PdtPdgMini::u) {
986  q++;
987  }
988  if (m.at(i)->pdgId() == PdtPdgMini::anti_d || m.at(i)->pdgId() == PdtPdgMini::anti_u) {
989  qbar++;
990  }
991  }
992  if (q == 1 && qbar == 1) { // assume q has largest E (valence vs see quarks)
993  if (taum.Vect().Dot(Zboson.Vect()) / (Zboson.P() * taum.P()) > 0) {
994  if (abs(boson->pdgId()) == PdtPdgMini::Z0)
996  if (abs(boson->pdgId()) == PdtPdgMini::Higgs0)
998  } else {
999  if (abs(boson->pdgId()) == PdtPdgMini::Z0)
1001  if (abs(boson->pdgId()) == PdtPdgMini::Higgs0)
1003  }
1004  }
1005  }
1006  }
1007  }
1008 }
1009 
1010 double TauValidation::Zstoa(double zs) {
1011  double a = 1 - sqrt(fabs(1.0 - 2 * fabs(zs)));
1012  if (zs < 0) {
1013  a *= -1.0;
1014  }
1015  return a;
1016 }
1017 
1019  return leadingPionP4(tau).P();
1020 }
1021 
1023  TLorentzVector p4(0, 0, 0, 0);
1024  for (unsigned int i = 0; i < tau->numberOfDaughters(); i++) {
1025  const reco::GenParticle *dau = static_cast<const reco::GenParticle *>(tau->daughter(i));
1026  int pid = dau->pdgId();
1027  if (abs(pid) == 15)
1028  return leadingPionP4(dau);
1029  if (!(abs(pid) == 211 || abs(pid) == 13 || abs(pid) == 11))
1030  continue;
1031  if (dau->p() > p4.P())
1032  p4 = TLorentzVector(dau->px(), dau->py(), dau->pz(), dau->energy());
1033  }
1034  return p4;
1035 }
1036 
1038  const reco::GenParticle *m = GetMother(tau);
1039  return TLorentzVector(m->px(), m->py(), m->pz(), m->energy());
1040 }
1041 
1043  TLorentzVector p4(tau->px(), tau->py(), tau->pz(), tau->energy());
1044  for (unsigned int i = 0; i < tau->numberOfDaughters(); i++) {
1045  const reco::GenParticle *dau = static_cast<const reco::GenParticle *>(tau->daughter(i));
1046  int pid = dau->pdgId();
1047  if (abs(pid) == 15)
1048  return visibleTauEnergy(dau);
1049  if (abs(pid) == 12 || abs(pid) == 14 || abs(pid) == 16) {
1050  p4 -= TLorentzVector(dau->px(), dau->py(), dau->pz(), dau->energy());
1051  }
1052  }
1053  return p4.E();
1054 }
1055 
1057  // Find First tau in chain
1058  std::vector<const reco::GenParticle *> TauList;
1059  findTauList(tau, TauList);
1060 
1061  // Get List of Gauge Boson to tau(s) FSR and Brem
1062  bool passedW = false;
1063  std::vector<const reco::GenParticle *> ListofFSR;
1064  ListofFSR.clear();
1065  std::vector<const reco::GenParticle *> ListofBrem;
1066  ListofBrem.clear();
1067  std::vector<const reco::GenParticle *> FSR_photos;
1068  FSR_photos.clear();
1069  double BosonScale(1);
1070  if (!TauList.empty()) {
1071  TauValidation::findFSRandBrem(TauList.at(0), passedW, ListofFSR, ListofBrem);
1072  TauValidation::FindPhotosFSR(TauList.at(0), FSR_photos, BosonScale);
1073 
1074  // Add the Tau Brem. information
1075  TauBremPhotonsN->Fill(ListofBrem.size(), weight);
1076  double photonPtSum = 0;
1077  for (unsigned int i = 0; i < ListofBrem.size(); i++) {
1078  photonPtSum += ListofBrem.at(i)->pt();
1079  TauBremPhotonsPt->Fill(ListofBrem.at(i)->pt(), weight);
1080  }
1081  TauBremPhotonsPtSum->Fill(photonPtSum, weight);
1082 
1083  // Now add the Gauge Boson FSR information
1084  if (BosonScale != 0) {
1085  TauFSRPhotonsN->Fill(ListofFSR.size(), weight);
1086  photonPtSum = 0;
1087  for (unsigned int i = 0; i < ListofFSR.size(); i++) {
1088  photonPtSum += ListofFSR.at(i)->pt();
1089  TauFSRPhotonsPt->Fill(ListofFSR.at(i)->pt(), weight);
1090  }
1091  double FSR_photosSum(0);
1092  for (unsigned int i = 0; i < FSR_photos.size(); i++) {
1093  FSR_photosSum += FSR_photos.at(i)->pt();
1094  TauFSRPhotonsPt->Fill(FSR_photos.at(i)->pt() / BosonScale, weight * BosonScale);
1095  }
1096  TauFSRPhotonsPtSum->Fill(photonPtSum + FSR_photosSum / BosonScale, weight);
1097  }
1098  }
1099 }
PdtPdgMini.h
TauValidation::muon
Definition: TauValidation.h:28
TauValidation::TauBremPhotonsPt
MonitorElement * TauBremPhotonsPt
Definition: TauValidation.h:80
TauValidation::tauMother
int tauMother(const reco::GenParticle *, double weight)
Definition: TauValidation.cc:563
TauValidation::zsmin
double zsmin
Definition: TauValidation.h:97
PdtPdgMini::d
Definition: PdtPdgMini.h:7
TauDecay::MODE_PIPI0
Definition: TauDecay.h:94
mps_fire.i
i
Definition: mps_fire.py:428
TauValidation::findTauList
void findTauList(const reco::GenParticle *tau, std::vector< const reco::GenParticle * > &TauList)
Definition: TauValidation.cc:496
TauDecay::MODE_PI2PI0
Definition: TauDecay.h:96
reco::CompositeRefCandidateT::numberOfDaughters
size_t numberOfDaughters() const override
number of daughters
TauValidation::MODEID
MonitorElement * MODEID
Definition: TauValidation.h:93
genParticles2HepMC_cfi.genParticles
genParticles
Definition: genParticles2HepMC_cfi.py:4
dqmiodumpmetadata.n
n
Definition: dqmiodumpmetadata.py:28
TauValidation::TauSpinEffectsW_UpsilonA1
MonitorElement * TauSpinEffectsW_UpsilonA1
Definition: TauValidation.h:80
metsig::tau
Definition: SignAlgoResolutions.h:49
muon
Definition: MuonCocktails.h:17
TauValidation::~TauValidation
~TauValidation() override
Definition: TauValidation.cc:28
reco::GenParticle
Definition: GenParticle.h:21
TauValidation::TauSpinEffectsH_rhorhoAcoplanarityminus
MonitorElement * TauSpinEffectsH_rhorhoAcoplanarityminus
Definition: TauValidation.h:80
PdtPdgMini::pi_plus
Definition: PdtPdgMini.h:56
edm::Run
Definition: Run.h:45
TauValidation::countParticles
void countParticles(const reco::GenParticle *p, int &allCount, int &eCount, int &muCount, int &pi0Count, int &piCount, int &rhoCount, int &a1Count, int &KCount, int &KstarCount)
Definition: TauValidation.cc:636
reco::CompositeRefCandidateT::mother
const Candidate * mother(size_type=0) const override
return mother at a given position, i = 0, ... numberOfMothers() - 1 (read only mode)
edm
HLT enums.
Definition: AlignableModifier.h:19
zMuMuMuonUserData.beta
beta
Definition: zMuMuMuonUserData.py:10
testProducerWithPsetDescEmpty_cfi.x2
x2
Definition: testProducerWithPsetDescEmpty_cfi.py:28
mps_merge.weight
weight
Definition: mps_merge.py:88
AlCaHLTBitMon_ParallelJobs.p
p
Definition: AlCaHLTBitMon_ParallelJobs.py:153
TauValidation::TauSpinEffectsH_pipiAcoplanarity
MonitorElement * TauSpinEffectsH_pipiAcoplanarity
Definition: TauValidation.h:80
TauValidation::findMother
int findMother(const reco::GenParticle *)
Definition: TauValidation.cc:486
TauDecay_GenParticle.h
TauValidation::TauSpinEffectsZ_X100to120
MonitorElement * TauSpinEffectsZ_X100to120
Definition: TauValidation.h:80
PdtPdgMini::K_plus
Definition: PdtPdgMini.h:102
reco::CompositeRefCandidateT::numberOfMothers
size_t numberOfMothers() const override
number of mothers
TauValidation::TauSpinEffectsH_X
MonitorElement * TauSpinEffectsH_X
Definition: TauValidation.h:80
PdtPdgMini::Higgs0
Definition: PdtPdgMini.h:44
PdtPdgMini::nu_mu
Definition: PdtPdgMini.h:30
TauValidation::pi
Definition: TauValidation.h:28
TauValidation::TauSpinEffectsZ_eX
MonitorElement * TauSpinEffectsZ_eX
Definition: TauValidation.h:80
TauValidation::TauSpinEffectsH_Zs
MonitorElement * TauSpinEffectsH_Zs
Definition: TauValidation.h:80
TauValidation::TauPt
MonitorElement * TauPt
Definition: TauValidation.h:80
TauValidation::motherP4
TLorentzVector motherP4(const reco::GenParticle *)
Definition: TauValidation.cc:1037
TauValidation::TauSpinEffectsH_Xf
MonitorElement * TauSpinEffectsH_Xf
Definition: TauValidation.h:80
TauValidation::TauSpinEffectsZ_X
MonitorElement * TauSpinEffectsZ_X
Definition: TauValidation.h:80
TauValidation::TauDecayChannels
MonitorElement * TauDecayChannels
Definition: TauValidation.h:80
TauDecay
Definition: TauDecay.h:21
TauValidation::leadingPionP4
TLorentzVector leadingPionP4(const reco::GenParticle *)
Definition: TauValidation.cc:1022
createJobs.tmp
tmp
align.sh
Definition: createJobs.py:716
edm::Handle< reco::GenParticleCollection >
nanoDQM_cfi.PV
PV
Definition: nanoDQM_cfi.py:520
TauValidation::NMODEID
unsigned int NMODEID
Definition: TauValidation.h:92
TauValidation::TauSpinEffectsZ_muX
MonitorElement * TauSpinEffectsZ_muX
Definition: TauValidation.h:80
TauValidation::tripi
Definition: TauValidation.h:28
TauValidation::bookHistograms
void bookHistograms(DQMStore::IBooker &i, edm::Run const &, edm::EventSetup const &) override
Definition: TauValidation.cc:32
ParticleData
HepPDT::ParticleData ParticleData
Definition: ParticleDataTable.h:9
GenParticle.h
TauValidation::A0
Definition: TauValidation.h:30
TauDecay_GenParticle::AnalyzeTau
bool AnalyzeTau(const reco::GenParticle *Tau, unsigned int &MODE_ID, unsigned int &TauBitMask, bool dores, bool dopi0)
Definition: TauDecay_GenParticle.cc:11
DQMHelper.h
TauValidation::TauSpinEffectsZ_Xf
MonitorElement * TauSpinEffectsZ_Xf
Definition: TauValidation.h:80
testProducerWithPsetDescEmpty_cfi.x1
x1
Definition: testProducerWithPsetDescEmpty_cfi.py:33
TauValidation::TauSpinEffectsZ_X50to75
MonitorElement * TauSpinEffectsZ_X50to75
Definition: TauValidation.h:80
testProducerWithPsetDescEmpty_cfi.y1
y1
Definition: testProducerWithPsetDescEmpty_cfi.py:29
part
part
Definition: HCALResponse.h:20
TauValidation::fPDGTable
edm::ESHandle< HepPDT::ParticleDataTable > fPDGTable
PDT table.
Definition: TauValidation.h:77
PdtPdgMini::u
Definition: PdtPdgMini.h:9
TauValidation::H0
Definition: TauValidation.h:30
reco::LeafCandidate::py
double py() const final
y coordinate of momentum vector
Definition: LeafCandidate.h:142
visualization-live-secondInstance_cfg.m
m
Definition: visualization-live-secondInstance_cfg.py:72
TauValidation::TauSpinEffectsHpm_X
MonitorElement * TauSpinEffectsHpm_X
Definition: TauValidation.h:80
TauValidation::Z
Definition: TauValidation.h:30
mathSSE::sqrt
T sqrt(T t)
Definition: SSEVec.h:19
dqm::impl::MonitorElement::Fill
void Fill(long long x)
Definition: MonitorElement.h:290
GenParticleFwd.h
TauValidation::TauSpinEffectsW_X
MonitorElement * TauSpinEffectsW_X
Definition: TauValidation.h:80
TauValidation::TauSpinEffectsH_eX
MonitorElement * TauSpinEffectsH_eX
Definition: TauValidation.h:80
TauValidation::W
Definition: TauValidation.h:30
TauValidation::genparticleCollection_
edm::InputTag genparticleCollection_
Definition: TauValidation.h:74
HCALHighEnergyHPDFilter_cfi.energy
energy
Definition: HCALHighEnergyHPDFilter_cfi.py:5
TauValidation::tripinpi0
Definition: TauValidation.h:28
TauValidation::LifeTime
MonitorElement * LifeTime
Definition: TauValidation.h:80
TauValidation::TauSpinEffectsZ_MVis
MonitorElement * TauSpinEffectsZ_MVis
Definition: TauValidation.h:80
TauValidation::visibleTauEnergy
double visibleTauEnergy(const reco::GenParticle *)
Definition: TauValidation.cc:1042
TauValidation::nPrimeTaus
MonitorElement * nPrimeTaus
Definition: TauValidation.h:79
TauValidation::genparticleCollectionToken_
edm::EDGetTokenT< reco::GenParticleCollection > genparticleCollectionToken_
Definition: TauValidation.h:99
TauValidation::TauMothers
MonitorElement * TauMothers
Definition: TauValidation.h:80
TauValidation::TauSpinEffectsH_pipiAcollinearityzoom
MonitorElement * TauSpinEffectsH_pipiAcollinearityzoom
Definition: TauValidation.h:80
PdtPdgMini::pi0
Definition: PdtPdgMini.h:55
TauValidation::TauFSRPhotonsN
MonitorElement * TauFSRPhotonsN
Definition: TauValidation.h:80
TauValidation::Kstar
Definition: TauValidation.h:28
TauValidation::zsbins
int zsbins
Definition: TauValidation.h:96
AlCaHLTBitMon_QueryRunRegistry.string
string
Definition: AlCaHLTBitMon_QueryRunRegistry.py:256
TauValidation::HSM
Definition: TauValidation.h:30
PdtPdgMini::pi_minus
Definition: PdtPdgMini.h:57
TauValidation::isLastTauinChain
bool isLastTauinChain(const reco::GenParticle *tau)
Definition: TauValidation.cc:488
ALCARECOTkAlJpsiMuMu_cff.charge
charge
Definition: ALCARECOTkAlJpsiMuMu_cff.py:47
TauValidation::TauSpinEffectsZ_X88to100
MonitorElement * TauSpinEffectsZ_X88to100
Definition: TauValidation.h:80
PdtPdgMini::anti_d
Definition: PdtPdgMini.h:8
testProducerWithPsetDescEmpty_cfi.y2
y2
Definition: testProducerWithPsetDescEmpty_cfi.py:30
TauValidation::GetMother
const reco::GenParticle * GetMother(const reco::GenParticle *tau)
Definition: TauValidation.cc:465
TauDecay::MODE_3PI
Definition: TauDecay.h:95
TauValidation::findFSRandBrem
void findFSRandBrem(const reco::GenParticle *p, bool doBrem, std::vector< const reco::GenParticle * > &ListofFSR, std::vector< const reco::GenParticle * > &ListofBrem)
Definition: TauValidation.cc:506
TauValidation::FindPhotosFSR
void FindPhotosFSR(const reco::GenParticle *p, std::vector< const reco::GenParticle * > &ListofFSR, double &BosonScale)
Definition: TauValidation.cc:533
TauValidation::B
Definition: TauValidation.h:30
TauValidation::TauSpinEffectsW_muX
MonitorElement * TauSpinEffectsW_muX
Definition: TauValidation.h:80
edm::ParameterSet
Definition: ParameterSet.h:47
TauValidation::Hpm
Definition: TauValidation.h:30
a
double a
Definition: hdecay.h:119
TauValidation::TauSpinEffectsH_rhorhoAcoplanarityplus
MonitorElement * TauSpinEffectsH_rhorhoAcoplanarityplus
Definition: TauValidation.h:80
TauValidation::TauSpinEffectsHpm_muX
MonitorElement * TauSpinEffectsHpm_muX
Definition: TauValidation.h:80
TauValidation::TauSpinEffectsH_muX
MonitorElement * TauSpinEffectsH_muX
Definition: TauValidation.h:80
TauValidation::TauSpinEffectsH_pipiAcollinearity
MonitorElement * TauSpinEffectsH_pipiAcollinearity
Definition: TauValidation.h:80
TauValidation::TauSpinEffectsHpm_UpsilonRho
MonitorElement * TauSpinEffectsHpm_UpsilonRho
Definition: TauValidation.h:80
TauValidation::TauProngs
MonitorElement * TauProngs
Definition: TauValidation.h:80
reco::LeafCandidate::pdgId
int pdgId() const final
PDG identifier.
Definition: LeafCandidate.h:176
TauValidation::other
Definition: TauValidation.h:30
TauValidation::TauSpinEffectsHpm_UpsilonA1
MonitorElement * TauSpinEffectsHpm_UpsilonA1
Definition: TauValidation.h:80
TauValidation::TauPhi
MonitorElement * TauPhi
Definition: TauValidation.h:80
TauValidation::spinEffectsWHpm
void spinEffectsWHpm(const reco::GenParticle *, int, int, std::vector< const reco::GenParticle * > &part, double weight)
Definition: TauValidation.cc:670
TauValidation::TauSpinEffectsH_MVis
MonitorElement * TauSpinEffectsH_MVis
Definition: TauValidation.h:80
TauValidation::TauValidation
TauValidation(const edm::ParameterSet &)
Definition: TauValidation.cc:18
TauValidation::analyze
void analyze(edm::Event const &, edm::EventSetup const &) override
Definition: TauValidation.cc:368
nanoDQM_cfi.SV
SV
Definition: nanoDQM_cfi.py:616
LorentzVector.h
TauValidation::stable
Definition: TauValidation.h:28
TauValidation::TauSpinEffectsH_Xb
MonitorElement * TauSpinEffectsH_Xb
Definition: TauValidation.h:80
TauValidation::nTaus
MonitorElement * nTaus
Definition: TauValidation.h:79
TauValidation::TauFSRPhotonsPt
MonitorElement * TauFSRPhotonsPt
Definition: TauValidation.h:80
createfilelist.int
int
Definition: createfilelist.py:10
TauValidation::TauSpinEffectsZ_Xb
MonitorElement * TauSpinEffectsZ_Xb
Definition: TauValidation.h:80
iEvent
int iEvent
Definition: GenABIO.cc:224
TauValidation::DecayLength
MonitorElement * DecayLength
Definition: TauValidation.h:80
TauDecay::isTauFinalStateParticle
bool isTauFinalStateParticle(int pdgid)
Definition: TauDecay.cc:32
p4
double p4[4]
Definition: TauolaWrapper.h:92
dqm::impl::MonitorElement::setBinLabel
virtual 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)
Definition: MonitorElement.cc:771
TauValidation::leadingPionMomentum
double leadingPionMomentum(const reco::GenParticle *, double weight)
Definition: TauValidation.cc:1018
TauValidation::TauSpinEffectsHpm_eX
MonitorElement * TauSpinEffectsHpm_eX
Definition: TauValidation.h:80
TauValidation::spinEffectsZH
void spinEffectsZH(const reco::GenParticle *boson, double weight)
Definition: TauValidation.cc:740
EgammaValidation_cff.pdgId
pdgId
Definition: EgammaValidation_cff.py:118
submitPVResolutionJobs.q
q
Definition: submitPVResolutionJobs.py:84
edm::EventSetup
Definition: EventSetup.h:57
TauValidation::photons
void photons(const reco::GenParticle *, double weight)
Definition: TauValidation.cc:1056
HltBtagPostValidation_cff.c
c
Definition: HltBtagPostValidation_cff.py:31
TauDecay::DecayMode
static std::string DecayMode(unsigned int &MODE_ID)
Definition: TauDecay.cc:393
PdtPdgMini::anti_u
Definition: PdtPdgMini.h:10
PdtPdgMini::Z0
Definition: PdtPdgMini.h:41
TauValidation::Zstoa
double Zstoa(double zs)
Definition: TauValidation.cc:1010
TauValidation::TauSpinEffectsZ_Zs
MonitorElement * TauSpinEffectsZ_Zs
Definition: TauValidation.h:80
TauValidation::K
Definition: TauValidation.h:28
alignCSCRings.r
r
Definition: alignCSCRings.py:93
TauValidation.h
DQMHelper
Definition: DQMHelper.h:15
TauValidation::TauBremPhotonsN
MonitorElement * TauBremPhotonsN
Definition: TauValidation.h:80
PdtPdgMini::nu_e
Definition: PdtPdgMini.h:26
PA_ZEESkim_cff.decay
decay
Definition: PA_ZEESkim_cff.py:26
TauValidation::undetermined
Definition: TauValidation.h:28
TauDecay::MODE_ELECTRON
Definition: TauDecay.h:91
reco::LeafCandidate::p
double p() const final
magnitude of momentum vector
Definition: LeafCandidate.h:123
LV
math::XYZTLorentzVectorD LV
Definition: HLTTauDQMPlotter.h:15
TauDecay_GenParticle::Get_TauDecayProducts
std::vector< const reco::GenParticle * > Get_TauDecayProducts()
Definition: TauDecay_GenParticle.h:31
TauDecay::MODE_KPIPI
Definition: TauDecay.h:110
TauValidation::MODEInvMass
std::vector< std::vector< MonitorElement * > > MODEInvMass
Definition: TauValidation.h:94
TauValidation::zsmax
double zsmax
Definition: TauValidation.h:97
TauValidation::TauSpinEffectsW_eX
MonitorElement * TauSpinEffectsW_eX
Definition: TauValidation.h:80
TauValidation::gamma
Definition: TauValidation.h:30
reco::CompositeRefCandidateT::daughter
const Candidate * daughter(size_type) const override
return daughter at a given position, i = 0, ... numberOfDaughters() - 1 (read only mode)
dqm::implementation::IBooker
Definition: DQMStore.h:43
reco::LeafCandidate::energy
double energy() const final
energy
Definition: LeafCandidate.h:125
TauDecay::MODE_KPIK
Definition: TauDecay.h:106
Pi
const double Pi
Definition: CosmicMuonParameters.h:18
TauValidation::TauSpinEffectsW_UpsilonRho
MonitorElement * TauSpinEffectsW_UpsilonRho
Definition: TauValidation.h:80
dqm
Definition: DQMStore.h:18
funct::abs
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
TauValidation::TauFSRPhotonsPtSum
MonitorElement * TauFSRPhotonsPtSum
Definition: TauValidation.h:80
TauValidation::TauSpinEffectsZ_X75to88
MonitorElement * TauSpinEffectsZ_X75to88
Definition: TauValidation.h:80
TauValidation::electron
Definition: TauValidation.h:28
TauValidation::dqmBeginRun
void dqmBeginRun(const edm::Run &r, const edm::EventSetup &c) override
Definition: TauValidation.cc:30
TauValidation::rho
Definition: TauValidation.h:28
dqmiolumiharvest.j
j
Definition: dqmiolumiharvest.py:66
TauDecay::nProng
unsigned int nProng(unsigned int &TauBitMask)
Definition: TauDecay.cc:331
TauDecay_GenParticle
Definition: TauDecay_GenParticle.h:23
TauDecay::MODE_PION
Definition: TauDecay.h:93
TauValidation::GetMothers
const std::vector< const reco::GenParticle * > GetMothers(const reco::GenParticle *boson)
Definition: TauValidation.cc:475
edm::Event
Definition: Event.h:73
TauValidation::a1
Definition: TauValidation.h:28
TauValidation::TauEta
MonitorElement * TauEta
Definition: TauValidation.h:80
reco::LeafCandidate::px
double px() const final
x coordinate of momentum vector
Definition: LeafCandidate.h:140
TauValidation::pinpi0
Definition: TauValidation.h:28
reco::LeafCandidate::pz
double pz() const final
z coordinate of momentum vector
Definition: LeafCandidate.h:144
edm::InputTag
Definition: InputTag.h:15
label
const char * label
Definition: PFTauDecayModeTools.cc:11
TauValidation::pi1pi0
Definition: TauValidation.h:28
TauValidation::TauSpinEffectsZ_X120UP
MonitorElement * TauSpinEffectsZ_X120UP
Definition: TauValidation.h:80
weight
Definition: weight.py:1
PdtPdgMini::nu_tau
Definition: PdtPdgMini.h:34
TauValidation::D
Definition: TauValidation.h:30
TauDecay::MODE_MUON
Definition: TauDecay.h:92
TauValidation::tauDecayChannel
int tauDecayChannel(const reco::GenParticle *tau, int jak_id, unsigned int TauBitMask, double weight)
Definition: TauValidation.cc:595
TauValidation::TauBremPhotonsPtSum
MonitorElement * TauBremPhotonsPtSum
Definition: TauValidation.h:80