prepare vectors with all track information: TP links, i.p. significances, track grade, etc
339 std::string
author = jetName;
346 std::string
pref =
"";
352 double deltaRtoClosestB = 999., deltaRtoClosestC = 999., deltaRtoClosestT = 999.;
353 double deltaRmin(0.);
354 if (jetToTag.
getAttribute(
"TruthLabelDeltaR_B",deltaRtoClosestB)) {
356 jetToTag.
getAttribute(
"TruthLabelDeltaR_C",deltaRtoClosestC);
357 jetToTag.
getAttribute(
"TruthLabelDeltaR_T",deltaRtoClosestT);
358 deltaRmin = deltaRtoClosestB < deltaRtoClosestC ? deltaRtoClosestB : deltaRtoClosestC;
359 deltaRmin = deltaRtoClosestT < deltaRmin ? deltaRtoClosestT : deltaRmin;
361 ATH_MSG_ERROR(
"#BTAG# No TruthInfo ! Cannot run in reference mode !");
362 return StatusCode::FAILURE;
372 }
else if (0==
label) {
383 std::vector<GradedTrack> tracksInJet;
386 std::vector<const xAOD::TrackParticle*> TrkFromV0;
388 bool canUseSvxDirection=
false;
391 m_SVForIPTool->getDirectionFromSecondaryVertexInfo(SvxDirection,canUseSvxDirection,
396 m_SVForIPTool->getTrkFromV0FromSecondaryVertexInfo(TrkFromV0,
398 if (TrkFromV0.size()!=0)
ATH_MSG_DEBUG(
"#BTAG# TrkFromV0 : number of reconstructed bad tracks: " << TrkFromV0.size());
404 std::vector< ElementLink< xAOD::TrackParticleContainer > > associationLinks =
405 trackAssocAcc (
BTag);
407 if( associationLinks.size() == 0 ) {
411 std::vector< ElementLink< xAOD::TrackParticleContainer> >::const_iterator trkIter;
414 for( trkIter = associationLinks.begin(); trkIter != associationLinks.end() ; ++trkIter ) {
421 sumTrkpT += aTemp->
pt();
425 for( trkIter = associationLinks.begin(); trkIter != associationLinks.end() ; ++trkIter ) {
430 ATH_MSG_VERBOSE(
"#BTAG# result of selectTrack is OK, grade= " << theGrade->gradeString() );
431 bool tobeUsed =
false;
432 for(
int i=0;
i<nbPart;
i++) {
439 if(
std::find(TrkFromV0.begin(),TrkFromV0.end(),aTemp) != TrkFromV0.end() ) {
441 << aTemp->
eta() <<
" phi = " << aTemp->
phi() );
445 if (tobeUsed) tracksInJet.push_back(GradedTrack(*trkIter, *theGrade));
459 unit = SvxDirection.unit();
460 ATH_MSG_DEBUG(
"#BTAG# Using direction from sec vertex finder: " <<
461 " phi: " <<
unit.phi() <<
" theta: " <<
unit.theta() <<
462 " instead of jet direction phi: " << jetDirection.phi() <<
463 " theta: " << jetDirection.theta() );
467 std::vector<ElementLink<xAOD::TrackParticleContainer> > IPTracks;
468 std::vector<double> vectD0;
469 std::vector<double> vectD0Signi;
470 std::vector<double> vectZ0;
471 std::vector<double> vectZ0Signi;
472 std::vector<TrackGrade> vectGrades;
474 std::vector<bool> vectFromV0;
475 std::vector<float> vectWeightB;
476 std::vector<float> vectWeightU;
477 std::vector<float> vectWeightC;
478 std::vector<myIPxDinfo> vectObj;
481 const int nbTrackMean = 5;
482 vectD0.reserve(nbTrackMean);
483 vectD0Signi.reserve(nbTrackMean);
484 vectZ0.reserve(nbTrackMean);
485 vectZ0Signi.reserve(nbTrackMean);
486 vectGrades.reserve(nbTrackMean);
487 vectFromV0.reserve(nbTrackMean);
488 vectWeightB.reserve(nbTrackMean);
489 vectWeightU.reserve(nbTrackMean);
490 vectWeightC.reserve(nbTrackMean);
491 vectObj.reserve(nbTrackMean);
494 trkItr != tracksInJet.end(); ++trkItr) {
497 bool isFromV0 = (
std::find(TrkFromV0.begin(),TrkFromV0.end(),trk) != TrkFromV0.end());
500 double d0wrtPriVtx(0.);
501 double z0wrtPriVtx(0.);
502 double d0ErrwrtPriVtx(1.);
503 double z0ErrwrtPriVtx(1.);
506 std::unique_ptr<Trk::ImpactParametersAndSigma> myIPandSigma =
nullptr;
510 if(0==myIPandSigma) {
513 d0wrtPriVtx=myIPandSigma->
IPd0;
514 d0ErrwrtPriVtx=myIPandSigma->
sigmad0;
550 double sIP = signOfIP*fabs(d0wrtPriVtx);
551 double significance= signOfIP*fabs(d0wrtPriVtx/d0ErrwrtPriVtx);
552 double szIP = signOfZIP*fabs(z0wrtPriVtx);
553 double z0Sig = signOfZIP*fabs(z0wrtPriVtx/z0ErrwrtPriVtx);
555 ATH_MSG_VERBOSE(
"#BTAG# IPTAG: Trk: grade= " << trkItr->grade.gradeString()
556 <<
" Eta= " << trk->
eta() <<
" Phi= " << trk->
phi() <<
" pT= " << trk->
pt()
558 <<
"+-" << d0ErrwrtPriVtx
559 <<
" sigd0= " << significance
561 <<
"+-" << z0ErrwrtPriVtx
562 <<
" sigz0= " << z0Sig);
566 tmpObj.trk=trkItr->track;
568 tmpObj.d0sig=significance;
571 tmpObj.grade=trkItr->grade;
573 tmpObj.fromV0=isFromV0;
575 double tpb = 0., tpu = 0., tpc = 0.;
576 this->
trackWeight(author,trkItr->grade,significance,z0Sig,tpb,tpu,tpc);
580 vectObj.push_back(tmpObj);
587 int resizeVal=vectObj.size();
594 if ( resizeVal2<resizeVal ) resizeVal=resizeVal2;
599 vectObj.resize(resizeVal);
602 for (
unsigned int i=0;
i<vectObj.size();
i++) {
607 if( !
pref.empty() ) {
609 const TrackGradesDefinition & trackFactoryGradesDefinition =
m_trackGradeFactory->getTrackGradesDefinition();
610 const std::vector<TrackGrade> & gradeList = trackFactoryGradesDefinition.getList();
611 std::vector<TrackGrade>::const_iterator listIter=gradeList.begin();
612 std::vector<TrackGrade>::const_iterator listEnd=gradeList.end();
613 for ( ; listIter !=listEnd ; ++listIter ) {
614 const TrackGrade & grd = (*listIter);
615 ATH_MSG_DEBUG(
"#BTAG# filling ref histo for grade " << grd.gradeString() );
616 if( grd==(vectObj[
i]).grade ) {
618 const std::string
suffix =
"_" + grd.gradeString();
620 std::string hName =
"/RefFile/IP1D/" +
author +
"/"
621 +
pref +
"/" + grd.gradeString() +
"/SipZ0";
626 std::string hName =
"/RefFile/IP2D/" +
author +
"/"
627 +
pref +
"/" + grd.gradeString() +
"/SipA0";
632 std::string hName =
"/RefFile/IP3D/" +
author +
"/"
633 +
pref +
"/" + grd.gradeString() +
"/Sip3D";
642 IPTracks.push_back( (vectObj[
i]).trk );
643 vectD0.push_back( (vectObj[
i]).
d0 );
644 vectD0Signi.push_back( (vectObj[
i]).d0sig );
645 vectZ0.push_back( (vectObj[
i]).
z0 );
646 vectZ0Signi.push_back( (vectObj[
i]).z0sig );
647 vectGrades.push_back( (vectObj[
i]).grade );
649 vectFromV0.push_back( (vectObj[
i]).fromV0 );
650 vectWeightB.push_back( (vectObj[
i]).wB );
651 vectWeightU.push_back( (vectObj[
i]).wU );
652 vectWeightC.push_back( (vectObj[
i]).wC );
660 std::vector<Slice>
slices;
661 for(
unsigned int i=0;
i<vectD0Signi.size();
i++) {
663 AtomicProperty atom1(vectD0Signi[
i],
"Significance of IP (rphi)");
664 AtomicProperty atom2(vectZ0Signi[
i],
"Significance of Z0");
665 std::string compoName(
author+
"#");
666 compoName += vectGrades[
i].gradeString();
667 compoName +=
"/Sip3D";
668 Composite compo1(compoName);
669 compo1.atoms.push_back(atom1);
670 compo1.atoms.push_back(atom2);
671 Slice slice1(
"IP3D");
672 slice1.composites.push_back(compo1);
676 AtomicProperty atom1(vectD0Signi[
i],
"Significance of IP (rphi)");
677 std::string compoName(
author+
"#");
678 compoName += vectGrades[
i].gradeString();
679 compoName +=
"/SipA0";
680 Composite compo1(compoName);
681 compo1.atoms.push_back(atom1);
682 Slice slice1(
"IP2D");
683 slice1.composites.push_back(compo1);
687 AtomicProperty atom1(vectZ0Signi[
i],
"Significance of IP (z)");
688 std::string compoName(
author+
"#");
689 compoName += vectGrades[
i].gradeString();
690 compoName +=
"/SipZ0";
691 Composite compo1(compoName);
692 compo1.atoms.push_back(atom1);
693 Slice slice1(
"IP1D");
694 slice1.composites.push_back(compo1);
698 std::vector<double> lkl;
700 if(vectD0Signi.size()>0) {
702 if (lkl.size() != 3) {
703 ATH_MSG_WARNING(
"#BTAG# likelihood size is " << lkl.size() <<
" expected size is 3");
712 ATH_MSG_DEBUG(
"#BTAG# likelihood : number of values = " << lkl.size() );
714 <<
"pb= " << lkl[0] <<
" pu= " << lkl[1] <<
" pc= " << lkl[2] );
723 if (IPTracks.size() == 0) {
731 std::vector<float> f_vectD0( vectD0.begin(), vectD0.end() );
732 std::vector<float> f_vectD0Signi( vectD0Signi.begin(), vectD0Signi.end() );
733 std::vector<float> f_vectZ0( vectZ0.begin(), vectZ0.end() );
734 std::vector<float> f_vectZ0Signi( vectZ0Signi.begin(), vectZ0Signi.end() );
735 std::vector<int> i_vectGrades( vectGrades.begin(), vectGrades.end() );
767 BTag.setVariable<std::vector<ElementLink<xAOD::TrackParticleContainer> > > (
772 BTag.setVariable< std::vector<float> > (
m_xAODBaseName,
"valD0wrtPVofTracks", f_vectD0);
774 BTag.setVariable< std::vector<float> > (
m_xAODBaseName,
"valZ0wrtPVofTracks", f_vectZ0);
778 BTag.setVariable< std::vector<float> > (
m_xAODBaseName,
"sigD0wrtPVofTracks", f_vectD0Signi);
780 BTag.setVariable< std::vector<float> > (
m_xAODBaseName,
"sigZ0wrtPVofTracks", f_vectZ0Signi);
782 BTag.setVariable< std::vector<float> > (
m_xAODBaseName,
"weightBofTracks", vectWeightB);
783 BTag.setVariable< std::vector<float> > (
m_xAODBaseName,
"weightUofTracks", vectWeightU);
784 BTag.setVariable< std::vector<float> > (
m_xAODBaseName,
"weightCofTracks", vectWeightC);
785 BTag.setVariable< std::vector<bool> > (
m_xAODBaseName,
"flagFromV0ofTracks", vectFromV0);
792 return StatusCode::SUCCESS;