ATLAS Offline Software
BTagJetAugmenter.cxx
Go to the documentation of this file.
1 /*
2  Copyright (C) 2002-2022 CERN for the benefit of the ATLAS collaboration
3 */
4 
6 
7 #include <cmath>
8 #include <cstddef>
9 #include <vector>
10 
11 #include "xAODJet/Jet.h"
13 
14 #include "TVector3.h"
15 
16 namespace {
17  // grab names based on configuration
18  std::string negString(FlavorTagDiscriminants::FlipTagConfig f) {
19  using namespace FlavorTagDiscriminants;
20  switch(f) {
21  case FlipTagConfig::STANDARD: return "";
22  case FlipTagConfig::FLIP_SIGN: // intentional fall-through
23  case FlipTagConfig::NEGATIVE_IP_ONLY: return "Neg";
24  default: throw std::logic_error("undefined flip config");
25  }
26  }
27  std::string flipString(FlavorTagDiscriminants::FlipTagConfig f) {
28  using namespace FlavorTagDiscriminants;
29  switch(f) {
30  case FlipTagConfig::STANDARD: return "";
31  case FlipTagConfig::FLIP_SIGN: // intentional fall-through
32  case FlipTagConfig::NEGATIVE_IP_ONLY: return "Flip";
33  default: throw std::logic_error("undefined flip config");
34  }
35  }
36 
37  // the taggers
38  std::string ip2(FlavorTagDiscriminants::FlipTagConfig f) {
39  return "IP2D" + negString(f);
40  }
41  std::string ip3(FlavorTagDiscriminants::FlipTagConfig f) {
42  return "IP3D" + negString(f);
43  }
45  return "JetFitter" + flipString(f);
46  }
48  return "SV1" + flipString(f);
49  }
50  std::string jfSvNew(FlavorTagDiscriminants::FlipTagConfig f) {
51  return "JetFitterSecondaryVertex" + flipString(f);
52  }
53  std::string jfDMeson(FlavorTagDiscriminants::FlipTagConfig f){
54  return "JetFitterDMeson" + flipString(f);
55  }
56 
57 }
58 
59 
60 BTagJetAugmenter::BTagJetAugmenter(const std::string& associator,
62  bool useIpxd):
63  m_jetLink("jetLink"),
64  m_pt_uncalib("pt_btagJes"),
65  m_eta_uncalib("eta_btagJes"),
66  m_abs_eta_uncalib("absEta_btagJes"),
67  m_scalarSumTrackPt("scalarSumTrackPt"),
68  m_ip2d_weightBOfTracks(ip2(f) + "_weightBofTracks"),
69  m_ip2d_nTrks(ip2(f) + "_nTrks"),
70  m_ip2d_pu(ip2(f) + "_pu"),
71  m_ip2d_pc(ip2(f) + "_pc"),
72  m_ip2d_pb(ip2(f) + "_pb"),
73  m_ip2d_isDefaults(ip2(f) + "_isDefaults"),
74  m_ip2d_cu(ip2(f) + "_cu"),
75  m_ip2d_bu(ip2(f) + "_bu"),
76  m_ip2d_bc(ip2(f) + "_bc"),
77  m_ip3d_weightBOfTracks(ip3(f) + "_weightBofTracks"),
78  m_ip3d_nTrks(ip3(f) + "_nTrks"),
79  m_ip3d_pu(ip3(f) + "_pu"),
80  m_ip3d_pc(ip3(f) + "_pc"),
81  m_ip3d_pb(ip3(f) + "_pb"),
82  m_ip3d_isDefaults(ip3(f) + "_isDefaults"),
83  m_ip3d_cu(ip3(f) + "_cu"),
84  m_ip3d_bu(ip3(f) + "_bu"),
85  m_ip3d_bc(ip3(f) + "_bc"),
86  m_jf_deltaEta(jf(f) + "_deltaeta"),
87  m_jf_deltaPhi(jf(f) + "_deltaphi"),
88  m_jf_fittedPosition(jf(f) + "_fittedPosition"),
89  m_jf_vertices(jf(f) + "_JFvertices"),
90  m_jf_nVtx(jf(f) + "_nVTX"),
91  m_jf_nSingleTracks(jf(f) + "_nSingleTracks"),
92  m_jf_isDefaults(jf(f) + "_isDefaults"),
93  m_jf_deltaR(jf(f) + "_deltaR"),
94  m_sv1_vertices(sv(f) + "_vertices"),
95  m_sv1_nVtx(sv(f) + "_nVtx"),
96  m_sv1_isDefaults(sv(f) + "_isDefaults"),
97  m_jet_track_links(associator),
98  m_secondaryVtx_isDefaults(jfSvNew(f) + "_isDefaults"),
99  m_secondaryVtx_nTrks(jfSvNew(f) + "_nTracks"),
100  m_secondaryVtx_m(jfSvNew(f) + "_mass"),
101  m_secondaryVtx_E(jfSvNew(f) + "_energy"),
102  m_secondaryVtx_EFrac(jfSvNew(f) + "_energyFraction"),
103  m_secondaryVtx_L3d(jfSvNew(f) + "_displacement3d"),
104  m_secondaryVtx_Lxy(jfSvNew(f) + "_displacement2d"),
105  m_secondaryVtx_min_trk_flightDirRelEta(jfSvNew(f) + "_minimumTrackRelativeEta"),
106  m_secondaryVtx_max_trk_flightDirRelEta(jfSvNew(f) + "_maximumTrackRelativeEta"),
107  m_secondaryVtx_avg_trk_flightDirRelEta(jfSvNew(f) + "_averageTrackRelativeEta"),
108  m_DMeson_m(jfDMeson(f) + "_mass"),
109  m_DMeson_isDefaults(jfDMeson(f) + "_isDefaults"),
110  m_min_trk_flightDirRelEta(jfSvNew(f) + "_minimumAllJetTrackRelativeEta"),
111  m_max_trk_flightDirRelEta(jfSvNew(f) + "_maximumAllJetTrackRelativeEta"),
112  m_avg_trk_flightDirRelEta(jfSvNew(f) + "_averageAllJetTrackRelativeEta"),
113  m_flipConfig(f),
114  m_useIpxd(useIpxd)
115 {
116 }
117 
118 
120 
121 std::set<std::string> BTagJetAugmenter::getDecoratorKeys() const {
122  const auto& type_registry = SG::AuxTypeRegistry::instance();
123  std::set<std::string> keys;
124  for (const auto& auxid: {
125  m_pt_uncalib.auxid(),
126  m_eta_uncalib.auxid(),
127  m_abs_eta_uncalib.auxid(),
128  m_scalarSumTrackPt.auxid(),
129  m_ip2d_nTrks.auxid(),
130  m_ip2d_isDefaults.auxid(),
131  m_ip2d_cu.auxid(),
132  m_ip2d_bu.auxid(),
133  m_ip2d_bc.auxid(),
134  m_ip3d_nTrks.auxid(),
135  m_ip3d_isDefaults.auxid(),
136  m_ip3d_cu.auxid(),
137  m_ip3d_bu.auxid(),
138  m_ip3d_bc.auxid(),
139  m_jf_isDefaults.auxid(),
140  m_jf_deltaR.auxid(),
141  m_sv1_isDefaults.auxid(),
143  m_secondaryVtx_nTrks.auxid(),
144  m_secondaryVtx_m.auxid(),
145  m_secondaryVtx_E.auxid(),
146  m_secondaryVtx_EFrac.auxid(),
147  m_secondaryVtx_L3d.auxid(),
148  m_secondaryVtx_Lxy.auxid(),
152  m_DMeson_m.auxid(),
153  m_DMeson_isDefaults.auxid(),
156  m_avg_trk_flightDirRelEta.auxid()}) {
157  keys.insert(type_registry.getName(auxid));
158  }
159  return keys;
160 }
161 
162 std::set<std::string> BTagJetAugmenter::getAuxInputKeys() const {
163  const auto& type_registry = SG::AuxTypeRegistry::instance();
164  std::set<std::string> keys;
165  for (const auto& auxid: {
166  m_jetLink.auxid()}) {
167  keys.insert(type_registry.getName(auxid));
168  }
169  return keys;
170 }
171 
173  const xAOD::BTagging &uncalibrated_jet) const {
174 
175  augmentBtagJes(jet, uncalibrated_jet);
176 
177  // pass off to calibrated jet function
178  augment(jet);
179 }
180 
182  if (jfIsDefaults(btag)) {
183  m_jf_deltaR(btag) = NAN;
184  } else {
185  m_jf_deltaR(btag) = std::hypot(m_jf_deltaEta(btag), m_jf_deltaPhi(btag));
186  }
187 }
188 
189 
190 float BTagJetAugmenter::safelog_prob(float p_up, float p_down) const {
191 
192  if( std::isnan(p_up) ){
193  return -1000.0;
194  }
195 
196  if(std::isnan(p_down) ){
197  return -1000.0;
198  }
199 
200  if(p_down < 0.0000000000000000000001 && p_up > p_down){
201  return 1000.0;
202  }
203 
204  if(p_up < 0.0000000000000000000001){
205  return -1000.0;
206  }
207 
208  return std::log(p_up /p_down);
209 }
210 
212 
213  m_ip2d_cu(btag) = safelog_prob(m_ip2d_pc(btag) , m_ip2d_pu(btag));
214  m_ip2d_bu(btag) = safelog_prob(m_ip2d_pb(btag) , m_ip2d_pu(btag));
215  m_ip2d_bc(btag) = safelog_prob(m_ip2d_pb(btag) , m_ip2d_pc(btag));
216 
217  m_ip3d_cu(btag) = safelog_prob(m_ip3d_pc(btag) , m_ip3d_pu(btag));
218  m_ip3d_bu(btag) = safelog_prob(m_ip3d_pb(btag) , m_ip3d_pu(btag));
219  m_ip3d_bc(btag) = safelog_prob(m_ip3d_pb(btag) , m_ip3d_pc(btag));
220 
221 }
222 
224  const xAOD::BTagging &uncalib) const {
225  auto uncalib_link = m_jetLink(uncalib);
226  if (!uncalib_link.isValid()) {
227  throw std::runtime_error("missing jetLink");
228  }
229  const xAOD::Jet& uncalib_jet = **uncalib_link;
230 
231  m_pt_uncalib(target) = uncalib_jet.pt();
232  m_eta_uncalib(target) = uncalib_jet.eta();
233  m_abs_eta_uncalib(target) = std::abs(uncalib_jet.eta());
234 }
235 
237  const xAOD::Jet &uncalib) const {
238  m_pt_uncalib(target) = uncalib.pt();
239  m_eta_uncalib(target) = uncalib.eta();
240  m_abs_eta_uncalib(target) = std::abs(uncalib.eta());
241 }
242 
243 void BTagJetAugmenter::augment(const xAOD::BTagging &btag) const {
244 
245  if (m_useIpxd) {
246  if (m_ip2d_weightBOfTracks(btag).size() > 0) {
247  m_ip2d_isDefaults(btag) = 0;
248  } else {
249  m_ip2d_isDefaults(btag) = 1;
250  }
251  m_ip2d_nTrks(btag) = m_ip2d_weightBOfTracks(btag).size();
252 
253  if (m_ip3d_weightBOfTracks(btag).size() > 0) {
254  m_ip3d_isDefaults(btag) = 0;
255  } else {
256  m_ip3d_isDefaults(btag) = 1;
257  }
258 
259  m_ip3d_nTrks(btag) = m_ip3d_weightBOfTracks(btag).size();
260  augmentIpRatios(btag);
261  }
262 
263  m_jf_isDefaults(btag) = jfIsDefaults(btag);
264  augmentJfDr(btag);
265 
266  if (m_sv1_vertices(btag).size() > 0) {
267  m_sv1_isDefaults(btag) = 0;
268  } else {
269  m_sv1_isDefaults(btag) = 1;
270  }
271 
272  TVector3 flightDir(NAN, NAN, NAN);
273  float jf_phi = NAN;
274  float jf_theta = NAN;
275 
276  int secondary_jf_vtx_index = -1;
277  int secondaryVtx_track_number = -1;
278  float secondaryVtx_charge = 0; // SV charge!!!
279  double secondaryVtx_track_flightDirRelEta_total = NAN;
280  float min_jf_vtx_L3d = NAN;
281 
282  if (m_jf_fittedPosition(btag).size() > 4) {
283  jf_phi = m_jf_fittedPosition(btag).at(3);
284  jf_theta = m_jf_fittedPosition(btag).at(4);
285  flightDir.SetMagThetaPhi(1, jf_theta, jf_phi);
286 
287  for (std::size_t jf_vtx_index = 0; jf_vtx_index < m_jf_vertices(btag).size() && jf_vtx_index < m_jf_fittedPosition(btag).size() - 5; jf_vtx_index++) {
288  float jf_vtx_L3d = m_jf_fittedPosition(btag).at(jf_vtx_index + 5);
289  if ((m_flipConfig==FlipTagConfig::STANDARD and jf_vtx_L3d > 0) ||
290  (m_flipConfig!=FlipTagConfig::STANDARD and jf_vtx_L3d < 0)){
291  if(std::isnan(min_jf_vtx_L3d) || ( std::abs(jf_vtx_L3d) < std::abs(min_jf_vtx_L3d) ) ){
292  secondary_jf_vtx_index = jf_vtx_index;
293  min_jf_vtx_L3d = jf_vtx_L3d;
294 
295  }
296  }
297  }
298 
299  if (secondary_jf_vtx_index >= 0) {
300  secondaryVtx_track_number = 0;
301  secondaryVtx_track_flightDirRelEta_total = 0;
302  m_secondaryVtx_isDefaults(btag) = 0;
303  } else {
304  m_secondaryVtx_isDefaults(btag) = 1;
305  }
306  } else {
307  m_secondaryVtx_isDefaults(btag) = 1;
308  }
309 
310  if (m_flipConfig!=FlipTagConfig::STANDARD and !std::isnan(min_jf_vtx_L3d) ) {
311  min_jf_vtx_L3d=-1*min_jf_vtx_L3d;
312  }
313 
314 
315  m_secondaryVtx_L3d(btag) = min_jf_vtx_L3d;
316  m_secondaryVtx_Lxy(btag) = min_jf_vtx_L3d * sinf(jf_theta);
317 
318  const float track_mass = 139.57; // assume pion mass for all tracks
319  const float track_kaon = 493.677; // kaon mass
320 
321  unsigned track_number = 0;
322  double track_E_total = 0;
323  float track_pt_total = 0;
324  double min_track_flightDirRelEta = NAN;
325  double max_track_flightDirRelEta = NAN;
326  double track_flightDirRelEta_total = 0;
327 
328  TLorentzVector secondaryVtx_4momentum_total;
329  TLorentzVector secondaryVtx_4momentum_Dmeson;
330 
331  // try to record
332  std::vector<TLorentzVector> secondaryVtx_4momentum_vector;
333  std::vector<float> secondaryVtx_charge_vector;
334 
335  double secondaryVtx_min_track_flightDirRelEta = NAN;
336  double secondaryVtx_max_track_flightDirRelEta = NAN;
337 
338  // Loop over tracks in the jet
339  for (const auto &jet_track_link : m_jet_track_links(btag)) {
340  const xAOD::TrackParticle &track_particle = **jet_track_link;
341 
342  uint8_t n_pixel_hits;
343  uint8_t n_sct_hits;
344  bool rc = true;
345  rc &= track_particle.summaryValue(n_pixel_hits, xAOD::numberOfPixelHits);
346  rc &= track_particle.summaryValue(n_sct_hits, xAOD::numberOfSCTHits);
347  if (!rc) throw std::runtime_error(
348  "track summary values are missing, can't compute b-tagging variables");
349 
350  // compute scalar track pt sum with all tracks, ignoring the requirement on pixel and SCT hits
351  track_pt_total += track_particle.pt();
352 
353  if (n_pixel_hits + n_sct_hits < 2) continue;
354  track_number++;
355  track_E_total += track_particle.e();
356 
357  double track_flightDirRelEta = NAN;
358  if (!std::isnan(jf_phi)) {
359  TVector3 track_flightDirRelVect = track_particle.p4().Vect();
360  if (track_flightDirRelVect.Perp()) {
361  track_flightDirRelVect.SetTheta(track_flightDirRelVect.Angle(flightDir));
362  track_flightDirRelEta = track_flightDirRelVect.PseudoRapidity();
363  }
364  }
365 
366  track_flightDirRelEta_total += track_flightDirRelEta;
367  if(std::isnan(min_track_flightDirRelEta) || track_flightDirRelEta < min_track_flightDirRelEta){
368  min_track_flightDirRelEta = track_flightDirRelEta;
369  }
370  if (std::isnan(max_track_flightDirRelEta) || track_flightDirRelEta > max_track_flightDirRelEta) {
371  max_track_flightDirRelEta = track_flightDirRelEta;
372  }
373  if (secondary_jf_vtx_index >= 0) {
374  for (const ElementLink<xAOD::TrackParticleContainer>& vertex_track_particle : (**m_jf_vertices(btag).at(secondary_jf_vtx_index)).track_links()) {
375  if (*vertex_track_particle == &track_particle) {
376  secondaryVtx_charge+=track_particle.charge(); // calculate the total charge
377  secondaryVtx_track_number++;
378  TLorentzVector track_fourVector;
379  track_fourVector.SetVectM(track_particle.p4().Vect(), track_mass);
380  secondaryVtx_4momentum_total += track_fourVector;
381  secondaryVtx_4momentum_vector.push_back(track_fourVector);
382  secondaryVtx_charge_vector.push_back(track_particle.charge());
383  secondaryVtx_track_flightDirRelEta_total += track_flightDirRelEta;
384  if (std::isnan(secondaryVtx_min_track_flightDirRelEta) || track_flightDirRelEta < secondaryVtx_min_track_flightDirRelEta) {
385  secondaryVtx_min_track_flightDirRelEta = track_flightDirRelEta;
386  }
387  if (std::isnan(secondaryVtx_max_track_flightDirRelEta) || track_flightDirRelEta > secondaryVtx_max_track_flightDirRelEta) {
388  secondaryVtx_max_track_flightDirRelEta = track_flightDirRelEta;
389  }
390  }
391  }
392  }
393  }
394  m_scalarSumTrackPt(btag) = track_pt_total;
395  m_secondaryVtx_nTrks(btag) = secondaryVtx_track_number;
396 
397  // Here begins a few blocks where the decoration depends on the
398  // schema. I would like to move a number of values that were
399  // previously stored as double to float.
400  {
401  double m = NAN;
402  double E = NAN;
403  double EFrac = NAN;
404  if (secondaryVtx_track_number >= 0) {
405  m = secondaryVtx_4momentum_total.M();
406  E = secondaryVtx_4momentum_total.E();
407  EFrac = E / track_E_total;
408  }
409  m_secondaryVtx_m(btag) = m;
410  m_secondaryVtx_E(btag) = E;
411  m_secondaryVtx_EFrac(btag) = EFrac;
412  // D meson reconstruction
413  m_DMeson_m(btag) = m;
414  m_DMeson_isDefaults(btag) = 1; // 1 for failing reconstruction; 0 for passing reconstruction
415  double tempM_forDmeson = getDmesonMass(secondaryVtx_track_number, secondaryVtx_charge, secondaryVtx_4momentum_vector,secondaryVtx_charge_vector, track_mass, track_kaon);
416 
417  if(tempM_forDmeson>-98){
418  m_DMeson_m(btag) = tempM_forDmeson;
419  m_DMeson_isDefaults(btag) = 0;
420  }else{
421  m_DMeson_isDefaults(btag) = 1;
422  }
423 
424  }
425  if(secondaryVtx_track_number > 0){
426  double min = secondaryVtx_min_track_flightDirRelEta;
427  double max = secondaryVtx_max_track_flightDirRelEta;
428  double avg = secondaryVtx_track_flightDirRelEta_total / secondaryVtx_track_number;
432  }else{
436  }
437  if(track_number > 0){
438  double min = min_track_flightDirRelEta;
439  double max = max_track_flightDirRelEta;
440  double avg = track_flightDirRelEta_total / track_number;
444  }else{
445  m_min_trk_flightDirRelEta(btag) = NAN;
446  m_max_trk_flightDirRelEta(btag) = NAN;
447  m_avg_trk_flightDirRelEta(btag) = NAN;
448  }
449 
450 }
451 
452 
454  return !(m_jf_vertices(btag).size() > 0 && (m_jf_nVtx(btag) > 0 || m_jf_nSingleTracks(btag) > 0));
455 }
456 
457 double BTagJetAugmenter::getDmesonMass(int secondaryVtx_track_number, float secondaryVtx_charge, std::vector<TLorentzVector> secondaryVtx_4momentum_vector, std::vector<float> secondaryVtx_charge_vector, const float track_mass, const float track_kaon) const {
458 
459  double DmesonMass = -99.0;
460  const float Dmeson_reference = 1864.83;
461  const float Dmeson_upper = 2200.0;
462  const float Dmeson_lower = 1000.0;
463  TLorentzVector secondaryVtx_4momentum_Dmeson;
464 
465  // now reconstruct D mesons
466  if(secondaryVtx_track_number == 3 && abs(secondaryVtx_charge) == 1){ // D+ -> K- pi+ pi+, and charge conjugate
467  std::vector<TLorentzVector>::const_iterator secondaryVtx_4momentum_Iter = secondaryVtx_4momentum_vector.begin();
468  for (std::vector<float>::const_iterator secondaryVtx_charge_Iter = secondaryVtx_charge_vector.begin();
469  secondaryVtx_charge_Iter != secondaryVtx_charge_vector.end();
470  ++secondaryVtx_charge_Iter) {
471  TLorentzVector track_fourVector_new;
472  if((secondaryVtx_charge==1 && (*secondaryVtx_charge_Iter)==-1) || (secondaryVtx_charge==-1 && (*secondaryVtx_charge_Iter)==1)){
473  track_fourVector_new.SetVectM((*secondaryVtx_4momentum_Iter).Vect(), track_kaon);
474  } else {
475  track_fourVector_new.SetVectM((*secondaryVtx_4momentum_Iter).Vect(), track_mass);
476  }
477  secondaryVtx_4momentum_Dmeson += track_fourVector_new;
478  ++secondaryVtx_4momentum_Iter;
479  }
480  if(secondaryVtx_4momentum_Dmeson.M()>Dmeson_lower && secondaryVtx_4momentum_Dmeson.M()<Dmeson_upper){
481  DmesonMass = secondaryVtx_4momentum_Dmeson.M();
482  }
483  } else if(secondaryVtx_track_number == 2 && secondaryVtx_charge == 0){ // D0 -> K- pi+
484  std::vector<TLorentzVector>::const_iterator secondaryVtx_4momentum_Iter = secondaryVtx_4momentum_vector.begin();
485  for (std::vector<float>::const_iterator secondaryVtx_charge_Iter = secondaryVtx_charge_vector.begin();
486  secondaryVtx_charge_Iter != secondaryVtx_charge_vector.end();
487  ++secondaryVtx_charge_Iter) {
488  TLorentzVector track_fourVector_new;
489  if((*secondaryVtx_charge_Iter)==-1){
490  track_fourVector_new.SetVectM((*secondaryVtx_4momentum_Iter).Vect(), track_kaon);
491  } else {
492  track_fourVector_new.SetVectM((*secondaryVtx_4momentum_Iter).Vect(), track_mass);
493  }
494  secondaryVtx_4momentum_Dmeson += track_fourVector_new;
495  ++secondaryVtx_4momentum_Iter;
496  }
497  if(secondaryVtx_4momentum_Dmeson.M()>Dmeson_lower && secondaryVtx_4momentum_Dmeson.M()<Dmeson_upper){
498  DmesonMass = secondaryVtx_4momentum_Dmeson.M();
499  }
500  } else if(secondaryVtx_track_number == 4 && secondaryVtx_charge == 0){ // D0 -> K- pi+ pi- pi+
501  std::vector<TLorentzVector>::const_iterator secondaryVtx_4momentum_Iter = secondaryVtx_4momentum_vector.begin();
502  bool KaonFlag = false; //if Kaon is already taken: KaonFlag = true
503  for (std::vector<float>::const_iterator secondaryVtx_charge_Iter = secondaryVtx_charge_vector.begin();
504  secondaryVtx_charge_Iter != secondaryVtx_charge_vector.end();
505  ++secondaryVtx_charge_Iter) {
506  TLorentzVector track_fourVector_new;
507  if((*secondaryVtx_charge_Iter)==-1 && KaonFlag == false){
508  track_fourVector_new.SetVectM((*secondaryVtx_4momentum_Iter).Vect(), track_kaon);
509  KaonFlag=true;
510  } else {
511  track_fourVector_new.SetVectM((*secondaryVtx_4momentum_Iter).Vect(), track_mass);
512  }
513  secondaryVtx_4momentum_Dmeson += track_fourVector_new;
514  ++secondaryVtx_4momentum_Iter;
515  }
516  double mDmeson_1 = secondaryVtx_4momentum_Dmeson.M();
517  secondaryVtx_4momentum_Iter = secondaryVtx_4momentum_vector.begin();
518  KaonFlag = false;
519  TLorentzVector secondaryVtx_4momentum_Dmeson_new;
520  for(std::vector<float>::const_iterator secondaryVtx_charge_Iter = secondaryVtx_charge_vector.begin();
521  secondaryVtx_charge_Iter != secondaryVtx_charge_vector.end();
522  ++secondaryVtx_charge_Iter) {
523  TLorentzVector track_fourVector_new2;
524  if((*secondaryVtx_charge_Iter)==-1 && KaonFlag == false){
525  KaonFlag=true;
526  } else if ((*secondaryVtx_charge_Iter)==-1 && KaonFlag == true){
527  track_fourVector_new2.SetVectM((*secondaryVtx_4momentum_Iter).Vect(), track_kaon);
528  } else{
529  track_fourVector_new2.SetVectM((*secondaryVtx_4momentum_Iter).Vect(), track_mass);
530  }
531  secondaryVtx_4momentum_Dmeson_new += track_fourVector_new2;
532  ++secondaryVtx_4momentum_Iter;
533  }
534  double mDmeson_2 = secondaryVtx_4momentum_Dmeson_new.M();
535  if (std::abs(mDmeson_1 - Dmeson_reference)<=std::abs(mDmeson_2 - Dmeson_reference) && mDmeson_1>Dmeson_lower && mDmeson_1<Dmeson_upper){
536  DmesonMass=mDmeson_1;
537  }
538  else if(std::abs(mDmeson_2 - Dmeson_reference)<=std::abs(mDmeson_1 - Dmeson_reference) && mDmeson_2>Dmeson_lower && mDmeson_2<Dmeson_upper){
539  DmesonMass=mDmeson_2;
540  }
541  }
542 
543  return DmesonMass;
544 }
BTagJetAugmenter::m_min_trk_flightDirRelEta
AE::Decorator< float > m_min_trk_flightDirRelEta
Definition: BTagJetAugmenter.h:104
xAOD::TrackParticle_v1::pt
virtual double pt() const override final
The transverse momentum ( ) of the particle.
Definition: TrackParticle_v1.cxx:73
BTagJetAugmenter.h
BTaggingUtilities.h
BTagJetAugmenter::m_abs_eta_uncalib
AE::Decorator< float > m_abs_eta_uncalib
Definition: BTagJetAugmenter.h:52
python.CaloRecoConfig.f
f
Definition: CaloRecoConfig.py:127
Jet.h
BTagJetAugmenter::m_eta_uncalib
AE::Decorator< float > m_eta_uncalib
Definition: BTagJetAugmenter.h:51
python.SystemOfUnits.m
int m
Definition: SystemOfUnits.py:91
max
#define max(a, b)
Definition: cfImp.cxx:41
FlavorTagDiscriminants::FlipTagConfig::STANDARD
@ STANDARD
BTagJetAugmenter::m_jf_deltaR
AE::Decorator< float > m_jf_deltaR
Definition: BTagJetAugmenter.h:83
BTagJetAugmenter::m_ip2d_bc
AE::Decorator< float > m_ip2d_bc
Definition: BTagJetAugmenter.h:64
BTagJetAugmenter::m_ip3d_nTrks
AE::Decorator< int > m_ip3d_nTrks
Definition: BTagJetAugmenter.h:67
BTagJetAugmenter::m_sv1_vertices
AE::ConstAccessor< std::vector< ElementLink< xAOD::VertexContainer > > > m_sv1_vertices
Definition: BTagJetAugmenter.h:85
xAOD::uint8_t
uint8_t
Definition: Muon_v1.cxx:575
FlavorTagDiscriminants
This file contains "getter" functions used for accessing tagger inputs from the EDM.
Definition: AssociationEnums.h:11
BTagJetAugmenter::m_ip2d_pu
AE::ConstAccessor< float > m_ip2d_pu
Definition: BTagJetAugmenter.h:58
SG::AuxTypeRegistry::instance
static AuxTypeRegistry & instance()
Return the singleton registry instance.
Definition: AuxTypeRegistry.cxx:49
xAOD::TrackParticle_v1::charge
float charge() const
Returns the charge.
Definition: TrackParticle_v1.cxx:150
BTagJetAugmenter::m_ip3d_isDefaults
AE::Decorator< char > m_ip3d_isDefaults
Definition: BTagJetAugmenter.h:71
BTagJetAugmenter
Definition: BTagJetAugmenter.h:16
BTagJetAugmenter::getDmesonMass
double getDmesonMass(int secondaryVtx_track_number, float secondaryVtx_charge, std::vector< TLorentzVector > secondaryVtx_4momentum_vector, std::vector< float > secondaryVtx_charge_vector, const float track_mass, const float track_kaon) const
Definition: BTagJetAugmenter.cxx:457
BTagJetAugmenter::m_jet_track_links
AE::ConstAccessor< std::vector< ElementLink< xAOD::TrackParticleContainer > > > m_jet_track_links
Definition: BTagJetAugmenter.h:89
BTagJetAugmenter::augmentBtagJes
void augmentBtagJes(const xAOD::BTagging &target, const xAOD::BTagging &uncalib) const
Definition: BTagJetAugmenter.cxx:223
xAOD::TrackParticle_v1::summaryValue
bool summaryValue(uint8_t &value, const SummaryType &information) const
Accessor for TrackSummary values.
Definition: TrackParticle_v1.cxx:736
FlavorTagDiscriminants::FlipTagConfig::NEGATIVE_IP_ONLY
@ NEGATIVE_IP_ONLY
BTagJetAugmenter::m_jf_nVtx
AE::ConstAccessor< int > m_jf_nVtx
Definition: BTagJetAugmenter.h:80
BTagJetAugmenter::m_ip2d_cu
AE::Decorator< float > m_ip2d_cu
Definition: BTagJetAugmenter.h:62
BTagJetAugmenter::m_ip2d_pc
AE::ConstAccessor< float > m_ip2d_pc
Definition: BTagJetAugmenter.h:59
xAOD::numberOfPixelHits
@ numberOfPixelHits
these are the pixel hits, including the b-layer [unit8_t].
Definition: TrackingPrimitives.h:259
BTagJetAugmenter::jfIsDefaults
bool jfIsDefaults(const xAOD::BTagging &btag) const
Definition: BTagJetAugmenter.cxx:453
BTagJetAugmenter::augment
void augment(const xAOD::BTagging &btag) const
Definition: BTagJetAugmenter.cxx:243
BTagJetAugmenter::augmentIpRatios
void augmentIpRatios(const xAOD::BTagging &btag) const
Definition: BTagJetAugmenter.cxx:211
BTagJetAugmenter::BTagJetAugmenter
BTagJetAugmenter(const std::string &associator="BTagTrackToJetAssociator", FlipTagConfig flip=FlipTagConfig::STANDARD, bool useIpxd=false)
Definition: BTagJetAugmenter.cxx:60
BTagJetAugmenter::m_ip3d_pu
AE::ConstAccessor< float > m_ip3d_pu
Definition: BTagJetAugmenter.h:68
BTagJetAugmenter::m_ip3d_bu
AE::Decorator< float > m_ip3d_bu
Definition: BTagJetAugmenter.h:73
BTagJetAugmenter::getAuxInputKeys
std::set< std::string > getAuxInputKeys() const
Definition: BTagJetAugmenter.cxx:162
python.setupRTTAlg.size
int size
Definition: setupRTTAlg.py:39
BTagJetAugmenter::m_ip2d_bu
AE::Decorator< float > m_ip2d_bu
Definition: BTagJetAugmenter.h:63
xAOD::TrackParticle_v1::p4
virtual FourMom_t p4() const override final
The full 4-momentum of the particle.
Definition: TrackParticle_v1.cxx:129
BTagJetAugmenter::m_secondaryVtx_m
AE::Decorator< float > m_secondaryVtx_m
Definition: BTagJetAugmenter.h:92
BTagJetAugmenter::m_ip2d_weightBOfTracks
AE::ConstAccessor< std::vector< float > > m_ip2d_weightBOfTracks
Definition: BTagJetAugmenter.h:56
jet
Definition: JetCalibTools_PlotJESFactors.cxx:23
BTagJetAugmenter::m_ip2d_isDefaults
AE::Decorator< char > m_ip2d_isDefaults
Definition: BTagJetAugmenter.h:61
BTagJetAugmenter::m_jf_vertices
AE::ConstAccessor< std::vector< ElementLink< xAOD::BTagVertexContainer > > > m_jf_vertices
Definition: BTagJetAugmenter.h:79
BTagJetAugmenter::m_jf_nSingleTracks
AE::ConstAccessor< int > m_jf_nSingleTracks
Definition: BTagJetAugmenter.h:81
BTagJetAugmenter::augmentJfDr
void augmentJfDr(const xAOD::BTagging &btag) const
Definition: BTagJetAugmenter.cxx:181
BTagJetAugmenter::m_ip3d_bc
AE::Decorator< float > m_ip3d_bc
Definition: BTagJetAugmenter.h:74
FlavorTagDiscriminants::FlipTagConfig::FLIP_SIGN
@ FLIP_SIGN
BTagJetAugmenter::m_ip3d_pb
AE::ConstAccessor< float > m_ip3d_pb
Definition: BTagJetAugmenter.h:70
Recovery.avg
def avg(a, b)
Definition: Recovery.py:79
BTagJetAugmenter::m_jf_deltaEta
AE::ConstAccessor< float > m_jf_deltaEta
Definition: BTagJetAugmenter.h:76
BTagJetAugmenter::m_secondaryVtx_L3d
AE::Decorator< float > m_secondaryVtx_L3d
Definition: BTagJetAugmenter.h:95
BTagJetAugmenter::getDecoratorKeys
std::set< std::string > getDecoratorKeys() const
Definition: BTagJetAugmenter.cxx:121
BTagJetAugmenter::m_secondaryVtx_avg_trk_flightDirRelEta
AE::Decorator< float > m_secondaryVtx_avg_trk_flightDirRelEta
Definition: BTagJetAugmenter.h:99
BTagJetAugmenter::m_scalarSumTrackPt
AE::Decorator< float > m_scalarSumTrackPt
Definition: BTagJetAugmenter.h:54
xAOD::BTagging_v1
Definition: BTagging_v1.h:39
BTagJetAugmenter::m_secondaryVtx_Lxy
AE::Decorator< float > m_secondaryVtx_Lxy
Definition: BTagJetAugmenter.h:96
BTagJetAugmenter::m_ip3d_pc
AE::ConstAccessor< float > m_ip3d_pc
Definition: BTagJetAugmenter.h:69
BTagJetAugmenter::m_pt_uncalib
AE::Decorator< float > m_pt_uncalib
Definition: BTagJetAugmenter.h:50
xAOD::Jet_v1::eta
virtual double eta() const
The pseudorapidity ( ) of the particle.
Definition: Jet_v1.cxx:49
min
#define min(a, b)
Definition: cfImp.cxx:40
BTagJetAugmenter::m_ip2d_nTrks
AE::Decorator< int > m_ip2d_nTrks
Definition: BTagJetAugmenter.h:57
BTagJetAugmenter::m_secondaryVtx_min_trk_flightDirRelEta
AE::Decorator< float > m_secondaryVtx_min_trk_flightDirRelEta
Definition: BTagJetAugmenter.h:97
BTagJetAugmenter::m_ip2d_pb
AE::ConstAccessor< float > m_ip2d_pb
Definition: BTagJetAugmenter.h:60
BTagJetAugmenter::m_secondaryVtx_nTrks
AE::Decorator< int > m_secondaryVtx_nTrks
Definition: BTagJetAugmenter.h:91
VP1PartSpect::E
@ E
Definition: VP1PartSpectFlags.h:21
BTagJetAugmenter::m_secondaryVtx_E
AE::Decorator< float > m_secondaryVtx_E
Definition: BTagJetAugmenter.h:93
xAOD::TrackParticle_v1::e
virtual double e() const override final
The total energy of the particle.
Definition: TrackParticle_v1.cxx:109
BTagJetAugmenter::m_ip3d_weightBOfTracks
AE::ConstAccessor< std::vector< float > > m_ip3d_weightBOfTracks
Definition: BTagJetAugmenter.h:66
BTagJetAugmenter::m_secondaryVtx_isDefaults
AE::Decorator< char > m_secondaryVtx_isDefaults
Definition: BTagJetAugmenter.h:90
xAOD::Jet_v1
Class describing a jet.
Definition: Jet_v1.h:57
BTagJetAugmenter::m_DMeson_m
AE::Decorator< float > m_DMeson_m
Definition: BTagJetAugmenter.h:101
BTagJetAugmenter::m_flipConfig
FlipTagConfig m_flipConfig
Definition: BTagJetAugmenter.h:108
BTagJetAugmenter::m_ip3d_cu
AE::Decorator< float > m_ip3d_cu
Definition: BTagJetAugmenter.h:72
LArCellConditions.sv
bool sv
Definition: LArCellConditions.py:45
python.CaloCondTools.log
log
Definition: CaloCondTools.py:20
xAOD::numberOfSCTHits
@ numberOfSCTHits
number of hits in SCT [unit8_t].
Definition: TrackingPrimitives.h:268
BTagJetAugmenter::m_jf_isDefaults
AE::Decorator< char > m_jf_isDefaults
Definition: BTagJetAugmenter.h:82
BTagJetAugmenter::m_sv1_isDefaults
AE::Decorator< char > m_sv1_isDefaults
Definition: BTagJetAugmenter.h:87
python.Bindings.keys
keys
Definition: Control/AthenaPython/python/Bindings.py:790
xAOD::TrackParticle_v1
Class describing a TrackParticle.
Definition: TrackParticle_v1.h:43
BTagJetAugmenter::m_secondaryVtx_max_trk_flightDirRelEta
AE::Decorator< float > m_secondaryVtx_max_trk_flightDirRelEta
Definition: BTagJetAugmenter.h:98
COOLRates.target
target
Definition: COOLRates.py:1106
BTagJetAugmenter::m_secondaryVtx_EFrac
AE::Decorator< float > m_secondaryVtx_EFrac
Definition: BTagJetAugmenter.h:94
BTagJetAugmenter::m_max_trk_flightDirRelEta
AE::Decorator< float > m_max_trk_flightDirRelEta
Definition: BTagJetAugmenter.h:105
FlavorTagDiscriminants::FlipTagConfig
FlipTagConfig
Definition: FlipTagEnums.h:14
xAOD::Jet_v1::pt
virtual double pt() const
The transverse momentum ( ) of the particle.
Definition: Jet_v1.cxx:44
BTagJetAugmenter::safelog_prob
float safelog_prob(float p_up, float p_down) const
Definition: BTagJetAugmenter.cxx:190
BTagJetAugmenter::m_DMeson_isDefaults
AE::Decorator< char > m_DMeson_isDefaults
Definition: BTagJetAugmenter.h:102
BTagJetAugmenter::m_jf_deltaPhi
AE::ConstAccessor< float > m_jf_deltaPhi
Definition: BTagJetAugmenter.h:77
BTagJetAugmenter::m_jetLink
AE::ConstAccessor< ElementLink< xAOD::JetContainer > > m_jetLink
Definition: BTagJetAugmenter.h:48
BTagJetAugmenter::m_jf_fittedPosition
AE::ConstAccessor< std::vector< float > > m_jf_fittedPosition
Definition: BTagJetAugmenter.h:78
BTagJetAugmenter::m_useIpxd
bool m_useIpxd
Definition: BTagJetAugmenter.h:109
BTagJetAugmenter::m_avg_trk_flightDirRelEta
AE::Decorator< float > m_avg_trk_flightDirRelEta
Definition: BTagJetAugmenter.h:106