Back to home page

Project CMSSW displayed by LXR

 
 

    


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   // adapted from DeepNtuples
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     // deal with PAT/AOD polymorphism to get track
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();  // trackRef was sometimes null
0045     } else if (packed_candidate && packed_candidate->hasTrackDetails()) {
0046       // if PackedCandidate does not have TrackDetails this gives an Exception
0047       // because unpackCovariance might be called for pseudoTrack/bestTrack
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 }  // namespace btagbtvdeep