Skip to content

Commit b52579b

Browse files
authored
[PWGJE] Add cut selection for IP and mass distribution of sv tagging (#7408)
* remote unused parameter * modiciation of track counting * modification of resolution function to add flavour * fix clang-format * fix the calcualtion * Fix clang-format * fix mistake * Processing to update QA of sv * Being updating SV QA * Add distribution of jet pt with flavour when removed by cut selection for efficiency and purity using sv * updating sv * fix prong acceptance * fix bool and TMath value * Urgent fix tagger point for efficiency and purity * Add configuration about searchUpToQuark which is chossen between quark and hadron level for flavour definition * Being developing tagging * Being developing tagging * implement sv tagging jet and cut selection of ip method * fix clang * fix clang of datamodel * Add prong acceptance
1 parent ed559d6 commit b52579b

4 files changed

Lines changed: 451 additions & 237 deletions

File tree

PWGJE/Core/JetTaggingUtilities.h

Lines changed: 215 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -304,7 +304,7 @@ int16_t getJetFlavor(AnyJet const& jet, AllMCParticles const& mcparticles)
304304

305305
if (dR < jet.r() / 100.f) {
306306
if (TMath::Abs(pdgcode) == 5) {
307-
return 2; // Beauty jet
307+
return JetTaggingSpecies::beauty; // Beauty jet
308308
} else {
309309
if (count > arraySize - 1)
310310
return 0;
@@ -317,10 +317,41 @@ int16_t getJetFlavor(AnyJet const& jet, AllMCParticles const& mcparticles)
317317

318318
for (int ij = 0; ij < count; ij++) {
319319
if (TMath::Abs(countpartcode[ij]) == 4)
320-
return 1; // Charm jet
320+
return JetTaggingSpecies::charm; // Charm jet
321321
}
322322

323-
return 0; // Light flavor jet
323+
return JetTaggingSpecies::lightflavour; // Light flavor jet
324+
}
325+
326+
/**
327+
* return acceptance of track about DCA xy and z due to cut for QualityTracks
328+
*/
329+
template <typename T>
330+
bool trackAcceptanceWithDca(T const& track, float trackDcaXYMax, float trackDcaZMax)
331+
{
332+
if (std::abs(track.dcaXY()) > trackDcaXYMax)
333+
return false;
334+
if (std::abs(track.dcaZ()) > trackDcaZMax)
335+
return false;
336+
return true;
337+
}
338+
339+
/**
340+
* retrun acceptance of prong about chi2 and error of decay length due to cut for high quality secondary vertex
341+
*/
342+
template <typename T>
343+
bool prongAcceptance(T const& prong, float prongChi2PCAMax, float prongsigmaLxyMax, bool doXYZ)
344+
{
345+
if (prong.chi2PCA() > prongChi2PCAMax)
346+
return false;
347+
if (!doXYZ) {
348+
if (prong.errorDecayLengthXY() > prongsigmaLxyMax)
349+
return false;
350+
} else {
351+
if (prong.errorDecayLength() > prongsigmaLxyMax)
352+
return false;
353+
}
354+
return true;
324355
}
325356

326357
/**
@@ -350,10 +381,12 @@ int getGeoSign(T const& collision, U const& jet, V const& track)
350381
* in a vector in descending order.
351382
*/
352383
template <typename T, typename U, typename V, typename W, typename Vec = std::vector<float>>
353-
void orderForIPJetTracks(T const& collision, U const& jet, V const& /*jtracks*/, W const& /*tracks*/, Vec& vecSignImpSig)
384+
void orderForIPJetTracks(T const& collision, U const& jet, V const& /*jtracks*/, W const& /*tracks*/, float const& trackDcaXYMax, float const& trackDcaZMax, Vec& vecSignImpSig)
354385
{
355386
for (auto& jtrack : jet.template tracks_as<V>()) {
356387
auto track = jtrack.template track_as<W>();
388+
if (!trackAcceptanceWithDca(track, trackDcaXYMax, trackDcaZMax))
389+
continue;
357390
auto geoSign = getGeoSign(collision, jet, track);
358391
auto varSignImpXYSig = geoSign * TMath::Abs(track.dcaXY()) / TMath::Sqrt(track.sigmaDcaXY2());
359392
vecSignImpSig.push_back(varSignImpXYSig);
@@ -364,14 +397,14 @@ void orderForIPJetTracks(T const& collision, U const& jet, V const& /*jtracks*/,
364397
/**
365398
* Checks if a jet is greater than the given tagging working point based on the signed impact parameter significances
366399
*/
367-
template <typename T, typename U, typename V, typename W, typename X, typename Y>
368-
bool isGreaterThanTaggingPoint(T const& collision, U const& jet, V const& jtracks, W const& tracks, X const& taggingPoint = 1.0, Y const& cnt = 1)
400+
template <typename T, typename U, typename V, typename W>
401+
bool isGreaterThanTaggingPoint(T const& collision, U const& jet, V const& jtracks, W const& tracks, float const& trackDcaXYMax, float const& trackDcaZMax, float const& taggingPoint = 1.0, int const& cnt = 1)
369402
{
370403
if (cnt == 0) {
371404
return true; // untagged
372405
}
373406
std::vector<float> vecSignImpSig;
374-
orderForIPJetTracks(collision, jet, jtracks, tracks, vecSignImpSig);
407+
orderForIPJetTracks(collision, jet, jtracks, tracks, trackDcaXYMax, trackDcaZMax, vecSignImpSig);
375408
if (vecSignImpSig.size() > static_cast<std::vector<float>::size_type>(cnt) - 1) {
376409
for (int i = 0; i < cnt; i++) {
377410
if (vecSignImpSig[i] < taggingPoint) { // tagger point set
@@ -448,16 +481,18 @@ float getTrackProbability(T const& fResoFuncjet, U const& track, const float& mi
448481
* geometric sign.
449482
*/
450483
template <typename T, typename U, typename V, typename W, typename X>
451-
float getJetProbability(T const& fResoFuncjet, U const& collision, V const& jet, W const& jtracks, X const& tracks, const int& cnt, const float& tagPoint = 1.0, const float& minSignImpXYSig = -10)
484+
float getJetProbability(T const& fResoFuncjet, U const& collision, V const& jet, W const& jtracks, X const& tracks, float const& trackDcaXYMax, float const& trackDcaZMax, const int& cnt, const float& tagPoint = 1.0, const float& minSignImpXYSig = -10)
452485
{
453-
if (!(isGreaterThanTaggingPoint(collision, jet, jtracks, tracks, tagPoint, cnt)))
486+
if (!(isGreaterThanTaggingPoint(collision, jet, jtracks, tracks, trackDcaXYMax, trackDcaZMax, tagPoint, cnt)))
454487
return -1;
455488

456489
std::vector<float> jetTracksPt;
457490
float trackjetProb = 1.;
458491

459492
for (auto& jtrack : jet.template tracks_as<W>()) {
460493
auto track = jtrack.template track_as<X>();
494+
if (!trackAcceptanceWithDca(track, trackDcaXYMax, trackDcaZMax))
495+
continue;
461496

462497
float probTrack = getTrackProbability(fResoFuncjet, track, minSignImpXYSig);
463498

@@ -481,6 +516,177 @@ float getJetProbability(T const& fResoFuncjet, U const& collision, V const& jet,
481516
return JP;
482517
}
483518

519+
// For secaondy vertex method utilites
520+
class bjetCandSV
521+
{
522+
public:
523+
bjetCandSV() = default;
524+
525+
bjetCandSV(float xpv, float ypv, float zpv, float xsv, float ysv, float zsv,
526+
float pxVal, float pyVal, float pzVal, float eVal, float mVal, float chi2Val,
527+
float errDecayLength, float errDecayLengthXY,
528+
float rSecVertex, float ptVal, float pVal,
529+
std::array<float, 3> pVec, float etaVal, float phiVal,
530+
float yVal, float decayLen, float decayLenXY,
531+
float decayLenNorm, float decayLenXYNorm,
532+
float cpaVal, float impParXY)
533+
: m_xPVertex(xpv), m_yPVertex(ypv), m_zPVertex(zpv), m_xSecondaryVertex(xsv), m_ySecondaryVertex(ysv), m_zSecondaryVertex(zsv), m_px(pxVal), m_py(pyVal), m_pz(pzVal), m_e(eVal), m_m(mVal), m_chi2PCA(chi2Val), m_errorDecayLength(errDecayLength), m_errorDecayLengthXY(errDecayLengthXY), m_rSecondaryVertex(rSecVertex), m_pt(ptVal), m_p(pVal), m_pVector(pVec), m_eta(etaVal), m_phi(phiVal), m_y(yVal), m_decayLength(decayLen), m_decayLengthXY(decayLenXY), m_decayLengthNormalised(decayLenNorm), m_decayLengthXYNormalised(decayLenXYNorm), m_cpa(cpaVal), m_impactParameterXY(impParXY)
534+
{
535+
}
536+
537+
float xPVertex() const { return m_xPVertex; }
538+
float yPVertex() const { return m_yPVertex; }
539+
float zPVertex() const { return m_zPVertex; }
540+
541+
float xSecondaryVertex() const { return m_xSecondaryVertex; }
542+
float ySecondaryVertex() const { return m_ySecondaryVertex; }
543+
float zSecondaryVertex() const { return m_zSecondaryVertex; }
544+
545+
float px() const { return m_px; }
546+
float py() const { return m_py; }
547+
float pz() const { return m_pz; }
548+
float e() const { return m_e; }
549+
float m() const { return m_m; }
550+
float chi2PCA() const { return m_chi2PCA; }
551+
552+
float errorDecayLength() const { return m_errorDecayLength; }
553+
float errorDecayLengthXY() const { return m_errorDecayLengthXY; }
554+
555+
float rSecondaryVertex() const { return m_rSecondaryVertex; }
556+
float pt() const { return m_pt; }
557+
float p() const { return m_p; }
558+
559+
std::array<float, 3> pVector() const { return m_pVector; }
560+
561+
float eta() const { return m_eta; }
562+
float phi() const { return m_phi; }
563+
float y() const { return m_y; }
564+
565+
float decayLength() const { return m_decayLength; }
566+
float decayLengthXY() const { return m_decayLengthXY; }
567+
float decayLengthNormalised() const { return m_decayLengthNormalised; }
568+
float decayLengthXYNormalised() const { return m_decayLengthXYNormalised; }
569+
570+
float cpa() const { return m_cpa; }
571+
float impactParameterXY() const { return m_impactParameterXY; }
572+
573+
private:
574+
float m_xPVertex, m_yPVertex, m_zPVertex;
575+
float m_xSecondaryVertex, m_ySecondaryVertex, m_zSecondaryVertex;
576+
float m_px, m_py, m_pz, m_e, m_m, m_chi2PCA;
577+
float m_errorDecayLength, m_errorDecayLengthXY;
578+
float m_rSecondaryVertex, m_pt, m_p;
579+
std::array<float, 3> m_pVector;
580+
float m_eta, m_phi, m_y;
581+
float m_decayLength, m_decayLengthXY, m_decayLengthNormalised, m_decayLengthXYNormalised;
582+
float m_cpa, m_impactParameterXY;
583+
};
584+
585+
template <typename ProngType, typename JetType>
586+
bjetCandSV jetFromProngMaxDecayLength(const JetType& jet, float const& prongChi2PCAMax, float const& prongsigmaLxyMax, const bool& doXYZ = false)
587+
{
588+
float xPVertex = 0.0f;
589+
float yPVertex = 0.0f;
590+
float zPVertex = 0.0f;
591+
float xSecondaryVertex = 0.0f;
592+
float ySecondaryVertex = 0.0f;
593+
float zSecondaryVertex = 0.0f;
594+
float px = 0.0f;
595+
float py = 0.0f;
596+
float pz = 0.0f;
597+
float e = 0.0f;
598+
float m = 0.0f;
599+
float chi2PCA = 0.0f;
600+
float errorDecayLength = 0.0f;
601+
float errorDecayLengthXY = 0.0f;
602+
603+
float rSecondaryVertex = 0.0f;
604+
float pt = 0.0f;
605+
float p = 0.0f;
606+
std::array<float, 3> pVector = {0.0f, 0.0f, 0.0f};
607+
float eta = 0.0f;
608+
float phi = 0.0f;
609+
float y = 0.0f;
610+
float decayLength = 0.0f;
611+
float decayLengthXY = 0.0f;
612+
float decayLengthNormalised = 0.0f;
613+
float decayLengthXYNormalised = 0.0f;
614+
float cpa = 0.0f;
615+
float impactParameterXY = 0.0f;
616+
617+
float maxSxy = -1.0f;
618+
619+
for (const auto& prong : jet.template secondaryVertices_as<ProngType>()) {
620+
float Sxy = -1.;
621+
if (!doXYZ) {
622+
Sxy = prong.decayLengthXY() / prong.errorDecayLengthXY();
623+
} else {
624+
Sxy = prong.decayLength() / prong.errorDecayLength();
625+
}
626+
if (!prongAcceptance(prong, prongChi2PCAMax, prongsigmaLxyMax, doXYZ))
627+
continue;
628+
629+
if (maxSxy < Sxy) {
630+
maxSxy = Sxy;
631+
632+
xPVertex = prong.xPVertex();
633+
yPVertex = prong.yPVertex();
634+
zPVertex = prong.zPVertex();
635+
xSecondaryVertex = prong.xSecondaryVertex();
636+
ySecondaryVertex = prong.ySecondaryVertex();
637+
zSecondaryVertex = prong.zSecondaryVertex();
638+
px = prong.px();
639+
py = prong.py();
640+
pz = prong.pz();
641+
e = prong.e();
642+
m = prong.m();
643+
chi2PCA = prong.chi2PCA();
644+
errorDecayLength = prong.errorDecayLength();
645+
errorDecayLengthXY = prong.errorDecayLengthXY();
646+
rSecondaryVertex = prong.rSecondaryVertex();
647+
pt = prong.pt();
648+
p = prong.p();
649+
pVector = prong.pVector();
650+
eta = prong.eta();
651+
phi = prong.phi();
652+
y = prong.y();
653+
decayLength = prong.decayLength();
654+
decayLengthXY = prong.decayLengthXY();
655+
decayLengthNormalised = prong.decayLengthNormalised();
656+
decayLengthXYNormalised = prong.decayLengthXYNormalised();
657+
cpa = prong.cpa();
658+
impactParameterXY = prong.impactParameterXY();
659+
}
660+
}
661+
662+
return bjetCandSV(
663+
xPVertex, yPVertex, zPVertex,
664+
xSecondaryVertex, ySecondaryVertex, zSecondaryVertex,
665+
px, py, pz, e, m, chi2PCA,
666+
errorDecayLength, errorDecayLengthXY,
667+
rSecondaryVertex, pt, p,
668+
pVector, eta, phi,
669+
y, decayLength, decayLengthXY,
670+
decayLengthNormalised, decayLengthXYNormalised,
671+
cpa, impactParameterXY);
672+
}
673+
674+
template <typename T, typename U>
675+
bool isTaggedJetSV(T const jet, U const& /*prongs*/, float const& prongChi2PCAMax, float const& prongsigmaLxyMax, float const& doXYZ = false, float const& tagPointForSV = 15.)
676+
{
677+
auto bjetCand = jetFromProngMaxDecayLength<U>(jet, prongChi2PCAMax, prongsigmaLxyMax, doXYZ);
678+
if (!doXYZ) {
679+
auto maxSxy = bjetCand.decayLengthXY() / bjetCand.errorDecayLengthXY();
680+
if (maxSxy < tagPointForSV)
681+
return false;
682+
} else {
683+
auto maxSxyz = bjetCand.decayLength() / bjetCand.errorDecayLength();
684+
if (maxSxyz < tagPointForSV)
685+
return false;
686+
}
687+
return true;
688+
}
689+
484690
}; // namespace jettaggingutilities
485691

486692
#endif // PWGJE_CORE_JETTAGGINGUTILITIES_H_

PWGJE/DataModel/JetTagging.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -123,10 +123,10 @@ JETSV_TABLES_DEF(Charged, SecondaryVertex2Prong, "2PRONG");
123123
{ \
124124
DECLARE_SOA_COLUMN(Origin, origin, int); \
125125
DECLARE_SOA_COLUMN(JetProb, jetProb, std::vector<float>); \
126-
DECLARE_SOA_COLUMN(Algorithm2, algorithm2, int); \
127-
DECLARE_SOA_COLUMN(Algorithm3, algorithm3, int); \
126+
DECLARE_SOA_COLUMN(FlagtaggedjetIP, flagtaggedjetIP, bool); \
127+
DECLARE_SOA_COLUMN(FlagtaggedjetSV, flagtaggedjetSV, bool); \
128128
} \
129-
DECLARE_SOA_TABLE(_jet_type_##Tags, "AOD", _description_ "Tags", _name_##tagging::Origin, _name_##tagging::JetProb, _name_##tagging::Algorithm2, _name_##tagging::Algorithm3);
129+
DECLARE_SOA_TABLE(_jet_type_##Tags, "AOD", _description_ "Tags", _name_##tagging::Origin, _name_##tagging::JetProb, _name_##tagging::FlagtaggedjetIP, _name_##tagging::FlagtaggedjetSV);
130130

131131
#define JETTAGGING_TABLES_DEF(_jet_type_, _description_) \
132132
JETTAGGING_TABLE_DEF(_jet_type_##Jet, _jet_type_##jet, _description_) \

0 commit comments

Comments
 (0)