File indexing completed on 2023-03-17 11:21:18
0001 #ifndef RecoParticleFlow_PFTracking_PFDisplacedVertexCandidateFinder_h
0002 #define RecoParticleFlow_PFTracking_PFDisplacedVertexCandidateFinder_h
0003
0004 #include "DataFormats/ParticleFlowReco/interface/PFDisplacedVertexCandidate.h"
0005 #include "DataFormats/ParticleFlowReco/interface/PFDisplacedVertexCandidateFwd.h"
0006 #include "DataFormats/GeometryVector/interface/GlobalPoint.h"
0007 #include "DataFormats/TrackReco/interface/TrackFwd.h"
0008 #include "DataFormats/VertexReco/interface/VertexFwd.h"
0009 #include "DataFormats/BeamSpot/interface/BeamSpot.h"
0010 #include "CommonTools/Utils/interface/KinematicTables.h"
0011 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0012
0013 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0014
0015 #include "TrackingTools/TrajectoryParametrization/interface/GlobalTrajectoryParameters.h"
0016 #include "TrackingTools/PatternTools/interface/TwoTrackMinimumDistance.h"
0017
0018
0019
0020
0021
0022
0023
0024 class MagneticField;
0025
0026 class PFDisplacedVertexCandidateFinder {
0027 public:
0028 PFDisplacedVertexCandidateFinder();
0029
0030 ~PFDisplacedVertexCandidateFinder();
0031
0032
0033 typedef std::vector<bool> Mask;
0034
0035 typedef std::list<reco::TrackBaseRef>::iterator IE;
0036 typedef std::list<reco::TrackBaseRef>::const_iterator IEC;
0037 typedef reco::PFDisplacedVertexCandidateCollection::const_iterator IBC;
0038
0039
0040
0041
0042 void setParameters(double dcaCut, double primaryVertexCut, double dcaPInnerHitCut, const edm::ParameterSet& ps_trk) {
0043 dcaCut_ = dcaCut;
0044 primaryVertexCut2_ = primaryVertexCut * primaryVertexCut;
0045 dcaPInnerHitCut2_ = dcaPInnerHitCut * dcaPInnerHitCut;
0046 nChi2_max_ = ps_trk.getParameter<double>("nChi2_max");
0047 pt_min_ = ps_trk.getParameter<double>("pt_min");
0048 pt_min_prim_ = ps_trk.getParameter<double>("pt_min_prim");
0049 dxy_ = ps_trk.getParameter<double>("dxy");
0050 }
0051
0052
0053 void setDebug(bool debug) { debug_ = debug; }
0054
0055
0056
0057 void setInput(const edm::Handle<reco::TrackCollection>& trackh, const MagneticField* magField);
0058
0059
0060 std::unique_ptr<reco::PFDisplacedVertexCandidateCollection> transferVertexCandidates() {
0061 return std::move(vertexCandidates_);
0062 }
0063
0064 const std::unique_ptr<reco::PFDisplacedVertexCandidateCollection>& vertexCandidates() const {
0065 return std::move(vertexCandidates_);
0066 }
0067
0068
0069
0070 void findDisplacedVertexCandidates();
0071
0072 void setPrimaryVertex(edm::Handle<reco::VertexCollection> mainVertexHandle,
0073 edm::Handle<reco::BeamSpot> beamSpotHandle);
0074
0075 private:
0076
0077
0078
0079 IE associate(IE next, IE last, reco::PFDisplacedVertexCandidate& tempVertexCandidate);
0080
0081
0082 void link(const reco::TrackBaseRef& el1,
0083 const reco::TrackBaseRef& el2,
0084 double& dist,
0085 GlobalPoint& crossing_point,
0086 reco::PFDisplacedVertexCandidate::VertexLinkTest& linktest);
0087
0088
0089
0090 void packLinks(reco::PFDisplacedVertexCandidate& vertexCandidate);
0091
0092
0093
0094
0095
0096 GlobalTrajectoryParameters getGlobalTrajectoryParameters(const reco::Track*) const;
0097
0098
0099 bool goodPtResolution(const reco::TrackBaseRef& trackref) const;
0100
0101
0102
0103 bool isSelected(const reco::TrackBaseRef& trackref) { return goodPtResolution(trackref); }
0104
0105 friend std::ostream& operator<<(std::ostream&, const PFDisplacedVertexCandidateFinder&);
0106
0107
0108
0109 std::unique_ptr<reco::PFDisplacedVertexCandidateCollection> vertexCandidates_;
0110
0111
0112 std::list<reco::TrackBaseRef> eventTracks_;
0113
0114
0115
0116
0117 Mask trackMask_;
0118
0119
0120 std::vector<GlobalTrajectoryParameters> eventTrackTrajectories_;
0121
0122
0123
0124
0125
0126 double dcaCut_;
0127
0128 double primaryVertexCut2_;
0129
0130 double dcaPInnerHitCut2_;
0131
0132
0133
0134
0135 double nChi2_max_;
0136 double pt_min_;
0137
0138 double pt_min_prim_;
0139 double dxy_;
0140
0141
0142
0143 unsigned vertexCandidatesSize_;
0144
0145
0146 TwoTrackMinimumDistance theMinimum_;
0147
0148 math::XYZPoint pvtx_;
0149
0150
0151 bool debug_;
0152
0153
0154 const MagneticField* magField_;
0155
0156 edm::soa::PtEtaPhiTable track_table_;
0157 };
0158
0159 #endif