File indexing completed on 2024-04-16 23:01:11
0001 #include "RecoBTag/FeatureTools/interface/TrackInfoBuilder.h"
0002 #include "DataFormats/PatCandidates/interface/PackedCandidate.h"
0003 #include "DataFormats/ParticleFlowCandidate/interface/PFCandidate.h"
0004 #include "DataFormats/BTauReco/interface/JetTagInfo.h"
0005 #include "DataFormats/BTauReco/interface/IPTagInfo.h"
0006 #include "TrackingTools/TransientTrack/interface/TransientTrackBuilder.h"
0007 #include "TrackingTools/IPTools/interface/IPTools.h"
0008 #include "TrackingTools/Records/interface/TransientTrackRecord.h"
0009 #include "RecoVertex/VertexTools/interface/VertexDistance3D.h"
0010 #include "TVector3.h"
0011
0012 namespace btagbtvdeep {
0013
0014
0015 TrackInfoBuilder::TrackInfoBuilder(edm::ESHandle<TransientTrackBuilder> &build)
0016 : builder_(build),
0017 trackMomentum_(0),
0018 trackEta_(0),
0019 trackEtaRel_(0),
0020 trackPtRel_(0),
0021 trackPPar_(0),
0022 trackDeltaR_(0),
0023 trackPtRatio_(0),
0024 trackPParRatio_(0),
0025 trackSip2dVal_(0),
0026 trackSip2dSig_(0),
0027 trackSip3dVal_(0),
0028 trackSip3dSig_(0),
0029 trackJetDistVal_(0),
0030 trackJetDistSig_(0),
0031 trackJetDecayLen_(0) {}
0032
0033 void TrackInfoBuilder::buildTrackInfo(const reco::Candidate *candidate,
0034 const math::XYZVector &jetDir,
0035 GlobalVector refjetdirection,
0036 const reco::Vertex &pv) {
0037 TVector3 jetDir3(jetDir.x(), jetDir.y(), jetDir.z());
0038
0039
0040 const reco::Track *track_ptr = nullptr;
0041 auto packed_candidate = dynamic_cast<const pat::PackedCandidate *>(candidate);
0042 auto pf_candidate = dynamic_cast<const reco::PFCandidate *>(candidate);
0043 if (pf_candidate) {
0044 track_ptr = pf_candidate->bestTrack();
0045 } else if (packed_candidate && packed_candidate->hasTrackDetails()) {
0046
0047
0048 track_ptr = &(packed_candidate->pseudoTrack());
0049 }
0050
0051 if (!track_ptr) {
0052 TVector3 trackMom3(candidate->momentum().x(), candidate->momentum().y(), candidate->momentum().z());
0053 trackMomentum_ = candidate->p();
0054 trackEta_ = candidate->eta();
0055 trackEtaRel_ = reco::btau::etaRel(jetDir, candidate->momentum());
0056 trackPtRel_ = trackMom3.Perp(jetDir3);
0057 trackPPar_ = jetDir.Dot(candidate->momentum());
0058 trackDeltaR_ = reco::deltaR(candidate->momentum(), jetDir);
0059 trackPtRatio_ = trackMom3.Perp(jetDir3) / candidate->p();
0060 trackPParRatio_ = jetDir.Dot(candidate->momentum()) / candidate->p();
0061 trackSip2dVal_ = 0.;
0062 trackSip2dSig_ = 0.;
0063 trackSip3dVal_ = 0.;
0064 trackSip3dSig_ = 0.;
0065 trackJetDistVal_ = 0.;
0066 trackJetDistSig_ = 0.;
0067 trackJetDecayLen_ = 0.;
0068 return;
0069 }
0070
0071 math::XYZVector trackMom = track_ptr->momentum();
0072 double trackMag = std::sqrt(trackMom.Mag2());
0073 TVector3 trackMom3(trackMom.x(), trackMom.y(), trackMom.z());
0074
0075 trackMomentum_ = std::sqrt(trackMom.Mag2());
0076 trackEta_ = trackMom.Eta();
0077 trackEtaRel_ = reco::btau::etaRel(jetDir, trackMom);
0078 trackPtRel_ = trackMom3.Perp(jetDir3);
0079 trackPPar_ = jetDir.Dot(trackMom);
0080 trackDeltaR_ = reco::deltaR(trackMom, jetDir);
0081 trackPtRatio_ = trackMom3.Perp(jetDir3) / trackMag;
0082 trackPParRatio_ = jetDir.Dot(trackMom) / trackMag;
0083
0084 reco::TransientTrack transientTrack;
0085 transientTrack = builder_->build(*track_ptr);
0086 Measurement1D meas_ip2d = IPTools::signedTransverseImpactParameter(transientTrack, refjetdirection, pv).second;
0087 Measurement1D meas_ip3d = IPTools::signedImpactParameter3D(transientTrack, refjetdirection, pv).second;
0088 Measurement1D jetdist = IPTools::jetTrackDistance(transientTrack, refjetdirection, pv).second;
0089 Measurement1D decayl = IPTools::signedDecayLength3D(transientTrack, refjetdirection, pv).second;
0090 trackSip2dVal_ = static_cast<float>(meas_ip2d.value());
0091 trackSip2dSig_ = static_cast<float>(meas_ip2d.significance());
0092 trackSip3dVal_ = static_cast<float>(meas_ip3d.value());
0093 trackSip3dSig_ = static_cast<float>(meas_ip3d.significance());
0094 trackJetDistVal_ = static_cast<float>(jetdist.value());
0095 trackJetDistSig_ = static_cast<float>(jetdist.significance());
0096
0097 trackJetDecayLen_ = static_cast<float>(decayl.value());
0098 }
0099
0100 }