CMS 3D CMS Logo

JetSignalVertexCompatibilityAlgo.cc
Go to the documentation of this file.
1 #include <functional>
2 #include <cmath>
3 #include <map>
4 
9 
15 
17 
19 
20 using namespace reco;
21 
22 // helper
23 template <typename T>
25  const edm::RefToBase<T> &r2) const {
26  return r1.id() < r2.id() || (r1.id() == r2.id() && r1.key() < r2.key());
27 }
28 
31 
33 
35  GlobalPoint point1 = RecoVertex::convertPos(vtx.position());
37  TrajectoryStateOnSurface tsos = extrap.extrapolate(track.impactPointState(), point1);
38 
39  if (!tsos.isValid())
40  return 1.0e6;
41 
42  GlobalPoint point2 = tsos.globalPosition();
43  ROOT::Math::SVector<double, 3> dir(point1.x() - point2.x(), point1.y() - point2.y(), point1.z() - point2.z());
44  GlobalError cov = RecoVertex::convertError(vtx.covariance()) + tsos.cartesianError().position();
45 
46  return ROOT::Math::Mag2(dir) / std::sqrt(ROOT::Math::Similarity(cov.matrix(), dir));
47 }
48 
50  TransientTrackMap::iterator pos = trackMap.lower_bound(track);
51  if (pos != trackMap.end() && pos->first == track)
52  return pos->second;
53 
54  // the castTo will only work with regular, i.e. no GsfTracks
55  // the interface is not intrinsically polymorph...
56  return trackMap.insert(pos, std::make_pair(track, trackBuilder->build(track.castTo<TrackRef>())))->second;
57 }
58 
59 double JetSignalVertexCompatibilityAlgo::activation(double compat) const {
60  return 1. / (std::exp((compat - cut) / temperature) + 1.);
61 }
62 
64  const reco::TrackRefVector &tracks) const {
65  std::vector<float> result(vertices.size(), 0.);
66  float sum = 0.;
67 
68  for (TrackRefVector::const_iterator track = tracks.begin(); track != tracks.end(); ++track) {
69  const TransientTrack &transientTrack = convert(TrackBaseRef(*track));
70 
71  for (unsigned int i = 0; i < vertices.size(); i++) {
72  double compat = trackVertexCompat(vertices[i], transientTrack);
73  double contribution = activation(compat) * (*track)->pt();
74 
75  result[i] += contribution;
76  sum += contribution;
77  }
78  }
79 
80  if (sum < 1.0e-9) {
81  for (unsigned int i = 0; i < result.size(); i++)
82  result[i] = 1.0 / result.size();
83  } else {
84  for (unsigned int i = 0; i < result.size(); i++)
85  result[i] /= sum;
86  }
87 
88  return result;
89 }
90 
92  trackMap.clear();
93  trackBuilder = builder;
94 }
reco::Vertex::Point convertPos(const GlobalPoint &p)
std::vector< float > compatibility(const reco::VertexCollection &vertices, const reco::TrackRefVector &tracks) const
reco::Vertex::Error convertError(const GlobalError &ge)
Definition: ConvertError.h:8
std::vector< Vertex > VertexCollection
collection of Vertex objects
Definition: VertexFwd.h:9
bool operator()(const edm::RefToBase< T > &r1, const edm::RefToBase< T > &r2) const
reco::TransientTrack build(const reco::Track *p) const
static double trackVertexCompat(const reco::Vertex &vtx, const TransientTrack &track)
GlobalPoint globalPosition() const
edm::RefToBase< reco::Track > TrackBaseRef
persistent reference to a Track, using views
Definition: TrackFwd.h:35
T sqrt(T t)
Definition: SSEVec.h:19
void resetEvent(const TransientTrackBuilder *trackBuilder)
auto const & tracks
cannot be loose
JetSignalVertexCompatibilityAlgo(double cut, double temperature)
ROOT::Math::PositionVector3D< ROOT::Math::Cartesian3D< float >, ROOT::Math::GlobalCoordinateSystemTag > GlobalPoint
point in global coordinate system
Definition: Point3D.h:18
fixed size matrix
const TransientTrack & convert(const reco::TrackBaseRef &track) const