CMS 3D CMS Logo

TracksClusteringFromDisplacedSeed.cc
Go to the documentation of this file.
2 //#define VTXDEBUG 1
4 
6  : // maxNTracks(params.getParameter<unsigned int>("maxNTracks")),
7  max3DIPSignificance(params.getParameter<double>("seedMax3DIPSignificance")),
8  max3DIPValue(params.getParameter<double>("seedMax3DIPValue")),
9  min3DIPSignificance(params.getParameter<double>("seedMin3DIPSignificance")),
10  min3DIPValue(params.getParameter<double>("seedMin3DIPValue")),
11  clusterMaxDistance(params.getParameter<double>("clusterMaxDistance")),
12  clusterMaxSignificance(params.getParameter<double>("clusterMaxSignificance")), //3
13  distanceRatio(params.getParameter<double>("distanceRatio")), //was clusterScale/densityFactor
14  clusterMinAngleCosine(params.getParameter<double>("clusterMinAngleCosine")), //0.0
15  maxTimeSignificance(params.getParameter<double>("maxTimeSignificance"))
16 
17 {}
18 
19 std::pair<std::vector<reco::TransientTrack>, GlobalPoint> TracksClusteringFromDisplacedSeed::nearTracks(
21  const std::vector<reco::TransientTrack> &tracks,
22  const reco::Vertex &primaryVertex) const {
23  VertexDistance3D distanceComputer;
24  GlobalPoint pv(primaryVertex.position().x(), primaryVertex.position().y(), primaryVertex.position().z());
25  std::vector<reco::TransientTrack> result;
27  GlobalPoint seedingPoint;
28  float sumWeights = 0;
29  std::pair<bool, Measurement1D> ipSeed = IPTools::absoluteImpactParameter3D(seed, primaryVertex);
30  float pvDistance = ipSeed.second.value();
31  for (std::vector<reco::TransientTrack>::const_iterator tt = tracks.begin(); tt != tracks.end(); ++tt) {
32  if (*tt == seed)
33  continue;
34 
35  if (dist.calculate(tt->impactPointState(), seed.impactPointState())) {
36  GlobalPoint ttPoint = dist.points().first;
37  GlobalError ttPointErr = tt->impactPointState().cartesianError().position();
38  GlobalPoint seedPosition = dist.points().second;
39  GlobalError seedPositionErr = seed.impactPointState().cartesianError().position();
41  distanceComputer.distance(VertexState(seedPosition, seedPositionErr), VertexState(ttPoint, ttPointErr));
43 
44  double timeSig = 0.;
45  if (primaryVertex.covariance(3, 3) > 0. && edm::isFinite(seed.timeExt()) && edm::isFinite(tt->timeExt())) {
46  // apply only if time available and being used in vertexing
47  const double tError = std::sqrt(std::pow(seed.dtErrorExt(), 2) + std::pow(tt->dtErrorExt(), 2));
48  timeSig = std::abs(seed.timeExt() - tt->timeExt()) / tError;
49  }
50 
51  float distanceFromPV = (dist.points().second - pv).mag();
52  float distance = dist.distance();
53  GlobalVector trackDir2D(
54  tt->impactPointState().globalDirection().x(), tt->impactPointState().globalDirection().y(), 0.);
55  GlobalVector seedDir2D(
56  seed.impactPointState().globalDirection().x(), seed.impactPointState().globalDirection().y(), 0.);
57  //SK:UNUSED// float dotprodTrackSeed2D = trackDir2D.unit().dot(seedDir2D.unit());
58 
59  float dotprodTrack = (dist.points().first - pv).unit().dot(tt->impactPointState().globalDirection().unit());
60  float dotprodSeed = (dist.points().second - pv).unit().dot(seed.impactPointState().globalDirection().unit());
61 
62  float w = distanceFromPV * distanceFromPV / (pvDistance * distance);
63  bool selected =
64  (m.significance() < clusterMaxSignificance &&
66  ? (dotprodSeed > clusterMinAngleCosine)
67  : (dotprodSeed < clusterMinAngleCosine)) && //Angles between PV-PCAonSeed vectors and seed directions
69  ? (dotprodTrack > clusterMinAngleCosine)
70  : (dotprodTrack < clusterMinAngleCosine)) && //Angles between PV-PCAonTrack vectors and track directions
71  //dotprodTrackSeed2D > clusterMinAngleCosine && //Angle between track and seed
72  //distance*clusterScale*tracks.size() < (distanceFromPV+pvDistance)*(distanceFromPV+pvDistance)/pvDistance && // cut scaling with track density
73  distance * distanceRatio < distanceFromPV && // cut scaling with track density
75  timeSig < maxTimeSignificance); // absolute distance cut
76 
77 #ifdef VTXDEBUG
78  std::cout << tt->trackBaseRef().key() << " : " << (selected ? "+" : " ") << " " << m.significance() << " < "
79  << clusterMaxSignificance << " && " << dotprodSeed << " > " << clusterMinAngleCosine << " && "
80  << dotprodTrack << " > " << clusterMinAngleCosine << " && " << dotprodTrackSeed2D << " > "
81  << clusterMinAngleCosine << " && " << distance * distanceRatio << " < " << distanceFromPV
82  << " crossingtoPV: " << distanceFromPV << " dis*scal " << distance * distanceRatio << " < "
83  << distanceFromPV << " dist: " << distance << " < " << clusterMaxDistance < < < <
84  "timeSig: " << timeSig << std::endl; // cut scaling with track density
85 #endif
86  if (selected) {
87  result.push_back(*tt);
88  seedingPoint =
89  GlobalPoint(cp.x() * w + seedingPoint.x(), cp.y() * w + seedingPoint.y(), cp.z() * w + seedingPoint.z());
90  sumWeights += w;
91  }
92  }
93  }
94 
95  seedingPoint =
96  GlobalPoint(seedingPoint.x() / sumWeights, seedingPoint.y() / sumWeights, seedingPoint.z() / sumWeights);
97  return std::pair<std::vector<reco::TransientTrack>, GlobalPoint>(result, seedingPoint);
98 }
99 
100 std::vector<TracksClusteringFromDisplacedSeed::Cluster> TracksClusteringFromDisplacedSeed::clusters(
101  const reco::Vertex &pv, const std::vector<reco::TransientTrack> &selectedTracks) {
102  using namespace reco;
103  std::vector<TransientTrack> seeds;
104  for (std::vector<TransientTrack>::const_iterator it = selectedTracks.begin(); it != selectedTracks.end(); it++) {
105  std::pair<bool, Measurement1D> ip = IPTools::absoluteImpactParameter3D(*it, pv);
106  if (ip.first && ip.second.value() >= min3DIPValue && ip.second.significance() >= min3DIPSignificance &&
107  ip.second.value() <= max3DIPValue && ip.second.significance() <= max3DIPSignificance) {
108 #ifdef VTXDEBUG
109  std::cout << "new seed " << it - selectedTracks.begin() << " ref " << it->trackBaseRef().key() << " "
110  << ip.second.value() << " " << ip.second.significance() << " "
111  << it->track().hitPattern().trackerLayersWithMeasurement() << " " << it->track().pt() << " "
112  << it->track().eta() << std::endl;
113 #endif
114  seeds.push_back(*it);
115  }
116  }
117 
118  std::vector<Cluster> clusters;
119  int i = 0;
120  for (std::vector<TransientTrack>::const_iterator s = seeds.begin(); s != seeds.end(); ++s, ++i) {
121 #ifdef VTXDEBUG
122  std::cout << "Seed N. " << i << std::endl;
123 #endif // VTXDEBUG
124  std::pair<std::vector<reco::TransientTrack>, GlobalPoint> ntracks = nearTracks(*s, selectedTracks, pv);
125  // std::cout << ntracks.first.size() << " " << ntracks.first.size() << std::endl;
126  // if(ntracks.first.size() == 0 || ntracks.first.size() > maxNTracks ) continue;
127  ntracks.first.push_back(*s);
128  Cluster aCl;
129  aCl.seedingTrack = *s;
130  aCl.seedPoint = ntracks.second;
131  aCl.tracks = ntracks.first;
132  clusters.push_back(aCl);
133  }
134 
135  return clusters;
136 }
std::vector< Cluster > clusters(const reco::Vertex &pv, const std::vector< reco::TransientTrack > &selectedTracks)
T w() const
T z() const
Definition: PV3DBase.h:61
Global3DPoint GlobalPoint
Definition: GlobalPoint.h:10
std::pair< bool, Measurement1D > absoluteImpactParameter3D(const reco::TransientTrack &transientTrack, const reco::Vertex &vertex)
Definition: IPTools.cc:38
GlobalPoint crossingPoint() const override
constexpr bool isFinite(T x)
bool calculate(const TrajectoryStateOnSurface &sta, const TrajectoryStateOnSurface &stb) override
T x() const
Definition: PV3DBase.h:59
T y() const
Definition: PV3DBase.h:60
T sqrt(T t)
Definition: SSEVec.h:19
def pv(vc)
Definition: MetAnalyzer.py:7
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
std::pair< std::vector< reco::TransientTrack >, GlobalPoint > nearTracks(const reco::TransientTrack &seed, const std::vector< reco::TransientTrack > &tracks, const reco::Vertex &primaryVertex) const
std::pair< GlobalPoint, GlobalPoint > points() const override
Basic3DVector unit() const
Measurement1D distance(const GlobalPoint &vtx1Position, const GlobalError &vtx1PositionError, const GlobalPoint &vtx2Position, const GlobalError &vtx2PositionError) const override
T mag() const
The vector magnitude. Equivalent to sqrt(vec.mag2())
auto const & tracks
cannot be loose
TracksClusteringFromDisplacedSeed(const edm::ParameterSet &params)
fixed size matrix
float distance() const override
T dot(const Basic3DVector &rh) const
Scalar product, or "dot" product, with a vector of same type.
primaryVertex
hltOfflineBeamSpot for HLTMON
Power< A, B >::type pow(const A &a, const B &b)
Definition: Power.h:29
def cp(fromDir, toDir, listOfFiles, overwrite=False, smallList=False)