24 default:
throw std::logic_error(
"undefined flip config");
33 default:
throw std::logic_error(
"undefined flip config");
39 return "IP2D" + negString(
f);
42 return "IP3D" + negString(
f);
45 return "JetFitter" + flipString(
f);
48 return "SV1" + flipString(
f);
51 return "JetFitterSecondaryVertex" + flipString(
f);
54 return "JetFitterDMeson" + flipString(
f);
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"),
123 std::set<std::string>
keys;
124 for (
const auto& auxid: {
157 keys.insert(type_registry.getName(auxid));
164 std::set<std::string>
keys;
165 for (
const auto& auxid: {
167 keys.insert(type_registry.getName(auxid));
192 if( std::isnan(p_up) ){
196 if(std::isnan(p_down) ){
200 if(p_down < 0.0000000000000000000001 && p_up > p_down){
204 if(p_up < 0.0000000000000000000001){
226 if (!uncalib_link.isValid()) {
227 throw std::runtime_error(
"missing jetLink");
229 const xAOD::Jet& uncalib_jet = **uncalib_link;
272 TVector3 flightDir(NAN, NAN, NAN);
274 float jf_theta = NAN;
276 int secondary_jf_vtx_index = -1;
277 int secondaryVtx_track_number = -1;
278 float secondaryVtx_charge = 0;
279 double secondaryVtx_track_flightDirRelEta_total = NAN;
280 float min_jf_vtx_L3d = NAN;
285 flightDir.SetMagThetaPhi(1, jf_theta, jf_phi);
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;
299 if (secondary_jf_vtx_index >= 0) {
300 secondaryVtx_track_number = 0;
301 secondaryVtx_track_flightDirRelEta_total = 0;
311 min_jf_vtx_L3d=-1*min_jf_vtx_L3d;
318 const float track_mass = 139.57;
319 const float track_kaon = 493.677;
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;
328 TLorentzVector secondaryVtx_4momentum_total;
329 TLorentzVector secondaryVtx_4momentum_Dmeson;
332 std::vector<TLorentzVector> secondaryVtx_4momentum_vector;
333 std::vector<float> secondaryVtx_charge_vector;
335 double secondaryVtx_min_track_flightDirRelEta = NAN;
336 double secondaryVtx_max_track_flightDirRelEta = NAN;
347 if (!rc)
throw std::runtime_error(
348 "track summary values are missing, can't compute b-tagging variables");
351 track_pt_total += track_particle.
pt();
353 if (n_pixel_hits + n_sct_hits < 2)
continue;
355 track_E_total += track_particle.
e();
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();
366 track_flightDirRelEta_total += track_flightDirRelEta;
367 if(std::isnan(min_track_flightDirRelEta) || track_flightDirRelEta < min_track_flightDirRelEta){
368 min_track_flightDirRelEta = track_flightDirRelEta;
370 if (std::isnan(max_track_flightDirRelEta) || track_flightDirRelEta > max_track_flightDirRelEta) {
371 max_track_flightDirRelEta = track_flightDirRelEta;
373 if (secondary_jf_vtx_index >= 0) {
375 if (*vertex_track_particle == &track_particle) {
376 secondaryVtx_charge+=track_particle.
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;
387 if (std::isnan(secondaryVtx_max_track_flightDirRelEta) || track_flightDirRelEta > secondaryVtx_max_track_flightDirRelEta) {
388 secondaryVtx_max_track_flightDirRelEta = track_flightDirRelEta;
404 if (secondaryVtx_track_number >= 0) {
405 m = secondaryVtx_4momentum_total.M();
406 E = secondaryVtx_4momentum_total.E();
407 EFrac =
E / track_E_total;
415 double tempM_forDmeson =
getDmesonMass(secondaryVtx_track_number, secondaryVtx_charge, secondaryVtx_4momentum_vector,secondaryVtx_charge_vector, track_mass, track_kaon);
417 if(tempM_forDmeson>-98){
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;
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;
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 {
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;
466 if(secondaryVtx_track_number == 3 && abs(secondaryVtx_charge) == 1){
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);
475 track_fourVector_new.SetVectM((*secondaryVtx_4momentum_Iter).Vect(), track_mass);
477 secondaryVtx_4momentum_Dmeson += track_fourVector_new;
478 ++secondaryVtx_4momentum_Iter;
480 if(secondaryVtx_4momentum_Dmeson.M()>Dmeson_lower && secondaryVtx_4momentum_Dmeson.M()<Dmeson_upper){
481 DmesonMass = secondaryVtx_4momentum_Dmeson.M();
483 }
else if(secondaryVtx_track_number == 2 && secondaryVtx_charge == 0){
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);
492 track_fourVector_new.SetVectM((*secondaryVtx_4momentum_Iter).Vect(), track_mass);
494 secondaryVtx_4momentum_Dmeson += track_fourVector_new;
495 ++secondaryVtx_4momentum_Iter;
497 if(secondaryVtx_4momentum_Dmeson.M()>Dmeson_lower && secondaryVtx_4momentum_Dmeson.M()<Dmeson_upper){
498 DmesonMass = secondaryVtx_4momentum_Dmeson.M();
500 }
else if(secondaryVtx_track_number == 4 && secondaryVtx_charge == 0){
501 std::vector<TLorentzVector>::const_iterator secondaryVtx_4momentum_Iter = secondaryVtx_4momentum_vector.begin();
502 bool KaonFlag =
false;
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);
511 track_fourVector_new.SetVectM((*secondaryVtx_4momentum_Iter).Vect(), track_mass);
513 secondaryVtx_4momentum_Dmeson += track_fourVector_new;
514 ++secondaryVtx_4momentum_Iter;
516 double mDmeson_1 = secondaryVtx_4momentum_Dmeson.M();
517 secondaryVtx_4momentum_Iter = secondaryVtx_4momentum_vector.begin();
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){
526 }
else if ((*secondaryVtx_charge_Iter)==-1 && KaonFlag ==
true){
527 track_fourVector_new2.SetVectM((*secondaryVtx_4momentum_Iter).Vect(), track_kaon);
529 track_fourVector_new2.SetVectM((*secondaryVtx_4momentum_Iter).Vect(), track_mass);
531 secondaryVtx_4momentum_Dmeson_new += track_fourVector_new2;
532 ++secondaryVtx_4momentum_Iter;
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;
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;