8 #include "AthLinks/ElementLink.h"
26 #include "fastjet/PseudoJet.hh"
27 #include "fastjet/JetDefinition.hh"
28 #include "fastjet/AreaDefinition.hh"
29 #include "fastjet/ClusterSequenceArea.hh"
30 #include "fastjet/tools/Filter.hh"
31 #include "fastjet/tools/MassDropTagger.hh"
41 DiTauIDVarCalculator::DiTauIDVarCalculator(
const std::string&
name )
43 , m_sDiTauContainerName(
"DiTauJets")
44 , m_eDecayChannel(DecayChannel::
Default)
47 declareProperty(
"DiTauContainerName", m_sDiTauContainerName =
"DiTauJets");
52 DiTauIDVarCalculator::~DiTauIDVarCalculator( )
63 ATH_MSG_ERROR(
"No Valid DecayChannel initialized. Valid options are: HadHad" );
64 return StatusCode::FAILURE;
67 return StatusCode::SUCCESS;
81 case(DecayChannel::HadHad):
85 return StatusCode::FAILURE;
87 return StatusCode::FAILURE;
133 return StatusCode::SUCCESS;
146 while (xDiTau.
subjetPt(nSubjet) > 0. )
157 if (xDiTau.
auxdata<
int>(
"n_subjets") < 2 ) {
168 if (iSubjet < 0 || iSubjet >= xDiTau.
auxdata<
int>(
"n_subjets")) {
172 return xDiTau.
fCore(iSubjet);
179 if (iSubjet < 0 || iSubjet >= xDiTau.
auxdata<
int>(
"n_subjets")) {
183 return xDiTau.
subjetPt(iSubjet) / xDiTau.
pt();
190 if (xDiTau.
auxdata<
int>(
"n_subjets") < 2 ) {
201 if (iSubjet < 0 || iSubjet >= xDiTau.
auxdata<
int>(
"n_subjets")) {
212 TLorentzVector tlvSubjet;
213 tlvSubjet.SetPtEtaPhiE( xDiTau.
subjetPt(iSubjet),
218 TLorentzVector tlvTrack;
219 TLorentzVector tlvLeadTrack;
220 tlvLeadTrack.SetPtEtaPhiE( 0,0,0, 0);
222 for (
const auto &xTrack: xTracks)
229 tlvTrack.SetPtEtaPhiE( (*xTrack)->pt(),
234 if ( tlvSubjet.DeltaR(tlvTrack) < 0.2 )
236 if (tlvLeadTrack.Pt() < tlvTrack.Pt())
238 tlvLeadTrack = tlvTrack;
243 return tlvLeadTrack.Pt() / tlvSubjet.Pt();
250 if (iSubjet < 0 || iSubjet >= xDiTau.
auxdata<
int>(
"n_subjets")) {
256 TLorentzVector tlvSubjet;
257 tlvSubjet.SetPtEtaPhiE( xDiTau.
subjetPt(iSubjet),
262 TLorentzVector tlvTrack;
263 TLorentzVector tlvRmaxTrack;
265 for (
const auto &xTrack: xTracks)
267 tlvTrack.SetPtEtaPhiE( (*xTrack)->pt(),
272 if ( tlvSubjet.DeltaR(tlvTrack) < xDiTau.
auxdata<
float >(
"R_subjet") )
274 if (tlvTrack.DeltaR(tlvSubjet) > Rmax)
276 Rmax = tlvTrack.DeltaR(tlvSubjet);
294 if (iSubjet < 0 || iSubjet >= xDiTau.
auxdata<
int>(
"n_subjets")) {
298 if (!xDiTau.
isAvailable<std::vector<int>>(
"n_tracks"))
300 ATH_MSG_DEBUG(
"n_tracks decoration not available. Try with track links.");
310 TLorentzVector tlvSubjet;
311 tlvSubjet.SetPtEtaPhiE( xDiTau.
subjetPt(iSubjet),
316 TLorentzVector tlvTrack;
318 for (
const auto &xTrack: xTracks)
320 tlvTrack.SetPtEtaPhiE( (*xTrack)->pt(),
324 if ( tlvSubjet.DeltaR(tlvTrack) < 0.2 ) nTracks++;
330 return xDiTau.
auxdata<std::vector<int>>(
"n_tracks").at(iSubjet);
351 if (iSubjet < 0 || iSubjet >= xDiTau.
auxdata<
int>(
"n_subjets")) {
357 TLorentzVector tlvSubjet;
358 tlvSubjet.SetPtEtaPhiE( xDiTau.
subjetPt(iSubjet),
363 TLorentzVector tlvTrack;
365 for (
const auto& xTrack: xTracks)
367 tlvTrack.SetPtEtaPhiE( (*xTrack)->pt(),
372 if ( tlvSubjet.DeltaR(tlvTrack) < 0.2 )
375 R_sum += tlvSubjet.DeltaR(tlvTrack)*tlvTrack.Pt();
398 if (iSubjet < 0 || iSubjet >= xDiTau.
auxdata<
int>(
"n_subjets")) {
404 TLorentzVector tlvSubjet;
405 tlvSubjet.SetPtEtaPhiE( xDiTau.
subjetPt(iSubjet),
410 TLorentzVector tlvTrack;
412 for (
const auto& xTrack: xTracks)
414 tlvTrack.SetPtEtaPhiE( (*xTrack)->pt(),
419 if ( tlvSubjet.DeltaR(tlvTrack) < xDiTau.
auxdata<
float >(
"R_core" ) )
421 R_sum += tlvSubjet.DeltaR(tlvTrack)*tlvTrack.Pt();
444 if (xDiTau.
auxdata<
int>(
"n_subjets") < 2) {
449 for (
int i = 0;
i<=1;
i++)
454 TLorentzVector tlvSubjet;
455 tlvSubjet.SetPtEtaPhiE( xDiTau.
subjetPt(
i),
460 TLorentzVector tlvTrack;
462 for (
const auto& xTrack: xTracks)
464 tlvTrack.SetPtEtaPhiE( (*xTrack)->pt(),
468 if ( tlvSubjet.DeltaR(tlvTrack) < xDiTau.
auxdata<
float >(
"R_core") )
471 R_sum += tlvSubjet.DeltaR(tlvTrack)*tlvTrack.Pt();
494 if (xDiTau.
auxdata<
int>(
"n_subjets") < 2) {
498 for (
int i = 0;
i<=1;
i++)
503 TLorentzVector tlvSubjet;
504 tlvSubjet.SetPtEtaPhiE( xDiTau.
subjetPt(
i),
509 TLorentzVector tlvTrack;
511 for (
const auto& xTrack: xTracks)
513 tlvTrack.SetPtEtaPhiE( (*xTrack)->pt(),
518 if (tlvSubjet.DeltaR(tlvTrack) < 0.2)
520 R_sum += tlvSubjet.DeltaR(tlvTrack)*tlvTrack.Pt();
543 for (
int i = 0;
i<xDiTau.
auxdata<
int>(
"n_subjets");
i++)
548 TLorentzVector tlvSubjet;
549 tlvSubjet.SetPtEtaPhiE( xDiTau.
subjetPt(
i),
554 TLorentzVector tlvTrack;
556 for (
const auto& xTrack: xTracks)
558 tlvTrack.SetPtEtaPhiE( (*xTrack)->pt(),
563 if (tlvSubjet.DeltaR(tlvTrack) <= 0.2)
565 R_sum += tlvSubjet.DeltaR(tlvTrack)*tlvTrack.Pt();
590 if (xDiTau.
auxdata<
int>(
"n_subjets") < 2) {
594 for (
int i = 0;
i<=1;
i++)
599 TLorentzVector tlvSubjet;
600 tlvSubjet.SetPtEtaPhiE( xDiTau.
subjetPt(
i),
605 TLorentzVector tlvIsoTrack;
607 for (
const auto& xIsoTrack: xIsoTracks)
609 tlvIsoTrack.SetPtEtaPhiE( (*xIsoTrack)->pt(),
614 if (tlvSubjet.DeltaR(tlvIsoTrack) < 0.4)
616 R_sum += tlvSubjet.DeltaR(tlvIsoTrack)*tlvIsoTrack.Pt();
617 pt += tlvIsoTrack.Pt();
639 if (xDiTau.
auxdata<
int>(
"n_subjets") < 2) {
643 TLorentzVector tlvallTracks;
645 for (
int i = 0;
i<=1;
i++)
650 TLorentzVector tlvSubjet;
651 tlvSubjet.SetPtEtaPhiE( xDiTau.
subjetPt(
i),
656 TLorentzVector tlvTrack;
658 for (
const auto& xTrack: xTracks)
660 tlvTrack.SetPtEtaPhiE( (*xTrack)->pt(),
664 if ( tlvSubjet.DeltaR(tlvTrack) < xDiTau.
auxdata<
float >(
"R_core") )
667 tlvallTracks += tlvTrack;
671 if (tlvallTracks.M() < 0)
676 return tlvallTracks.M();
688 if ( iSubjet < 0 || iSubjet >= xDiTau.
auxdata<
int>(
"n_subjets")) {
692 TLorentzVector tlvallTracks;
697 TLorentzVector tlvSubjet;
698 tlvSubjet.SetPtEtaPhiE( xDiTau.
subjetPt(iSubjet),
703 TLorentzVector tlvTrack;
705 for (
const auto& xTrack: xTracks)
707 tlvTrack.SetPtEtaPhiE( (*xTrack)->pt(),
711 if ( tlvSubjet.DeltaR(tlvTrack) < xDiTau.
auxdata<
float >(
"R_core") )
714 tlvallTracks += tlvTrack;
718 if (tlvallTracks.M() < 0)
723 return tlvallTracks.M();
735 if ( iSubjet < 0 || iSubjet >= xDiTau.
auxdata<
int>(
"n_subjets")) {
739 TLorentzVector tlvallTracks;
743 TLorentzVector tlvSubjet;
744 tlvSubjet.SetPtEtaPhiE( xDiTau.
subjetPt(iSubjet),
749 TLorentzVector tlvTrack;
751 for (
const auto& xTrack: xTracks)
753 tlvTrack.SetPtEtaPhiE( (*xTrack)->pt(),
757 if ( tlvSubjet.DeltaR(tlvTrack) < 0.2 )
759 tlvallTracks += tlvTrack;
763 if (tlvallTracks.M() < 0)
768 return tlvallTracks.M();
779 TLorentzVector tlvallTracks;
783 TLorentzVector tlvTrack;
785 for (
const auto& xTrack: xTracks)
787 tlvTrack.SetPtEtaPhiE( (*xTrack)->pt(),
792 tlvallTracks += tlvTrack;
795 if (tlvallTracks.M() < 0)
799 return tlvallTracks.M();
810 TLorentzVector tlvallTracks;
814 TLorentzVector tlvTrack;
816 for (
const auto& xTrack: xTracks)
818 tlvTrack.SetPtEtaPhiE( (*xTrack)->pt(),
823 tlvallTracks += tlvTrack;
829 TLorentzVector tlvIsoTrack;
831 for (
const auto& xIsoTrack: xIsoTracks)
833 tlvIsoTrack.SetPtEtaPhiE( (*xIsoTrack)->pt(),
838 tlvallTracks += tlvIsoTrack;
841 if (tlvallTracks.M() < 0)
846 return tlvallTracks.M();
852 if ( iSubjet < 0 || iSubjet >= xDiTau.
auxdata<
int>(
"n_subjets")) {
863 if ( iSubjet < 0 || iSubjet >= xDiTau.
auxdata<
int>(
"n_subjets")) {
872 TLorentzVector tlvLeadSubjet;
873 tlvLeadSubjet.SetPtEtaPhiE( xDiTau.
subjetPt(0),
878 TLorentzVector tlvSubjet;
879 tlvSubjet.SetPtEtaPhiE( xDiTau.
subjetPt(iSubjet),
883 return tlvLeadSubjet.DeltaR(tlvSubjet);
889 double pt_leadtrk = 0;
896 if ( iSubjet < 0 || iSubjet >= xDiTau.
auxdata<
int>(
"n_subjets")) {
900 TLorentzVector tlvSubjet;
901 tlvSubjet.SetPtEtaPhiE( xDiTau.
subjetPt(iSubjet),
908 TLorentzVector tlvTrack;
910 for (
auto &xTrack: xTracks)
912 tlvTrack.SetPtEtaPhiE( (*xTrack)->pt(),
917 if (tlvTrack.DeltaR(tlvSubjet) < xDiTau.
auxdata<
float >(
"R_core"))
919 if (tlvTrack.Pt() > pt_leadtrk)
921 pt_leadtrk = tlvTrack.Pt();
922 d0 = (*xTrack)->d0();
940 TLorentzVector tlvIsoTrack;
942 for (
const auto& xIsoTrack: xIsoTracks)
944 tlvIsoTrack.SetPtEtaPhiE( (*xIsoTrack)->pt(),
949 iso_pt += tlvIsoTrack.Pt();
952 return iso_pt / xDiTau.
pt();
960 Warning(
"decorNtracks()",
"Track links not available.");
961 return StatusCode::FAILURE;
964 int nSubjets = xDiTau.
auxdata<
int>(
"n_subjets");
966 float Rsubjet = xDiTau.
auxdata<
float>(
"R_subjet");
967 std::vector<int> nTracks(nSubjets, 0);
970 for (
const auto &xTrack: xTracks)
975 for (
int i=0;
i<nSubjets; ++
i)
977 TLorentzVector tlvSubjet = TLorentzVector();
978 tlvSubjet.SetPtEtaPhiE(xDiTau.
subjetPt(
i),
982 double dR = tlvSubjet.DeltaR((*xTrack)->p4());
985 if ((dR < Rsubjet) && (dR < dRmin))
991 if (itrmin > -1) nTracks[itrmin]++;
994 xDiTau.
auxdecor< std::vector<int> >(
"n_tracks") = nTracks;
996 return StatusCode::SUCCESS;