@@ -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 */
352383template <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 */
450483template <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_
0 commit comments