File indexing completed on 2023-03-17 11:23:10
0001 #ifndef __RecoVertex_AdaptiveVertexFinder_SVTimeHelpers_h__
0002 #define __RecoVertex_AdaptiveVertexFinder_SVTimeHelpers_h__
0003
0004 #include "RecoVertex/VertexPrimitives/interface/TransientVertex.h"
0005 #include "TrackingTools/TransientTrack/interface/TransientTrack.h"
0006
0007 #include "FWCore/Utilities/interface/isFinite.h"
0008
0009 namespace svhelper {
0010
0011 inline void updateVertexTime(TransientVertex& vtx) {
0012 const auto& trks = vtx.originalTracks();
0013 double meantime = 0., expv_x2 = 0., normw = 0., timecov = 0.;
0014 for (const auto& trk : trks) {
0015 if (edm::isFinite(trk.timeExt())) {
0016 const double time = trk.timeExt();
0017 const double inverr = 1.0 / trk.dtErrorExt();
0018 const double w = inverr * inverr;
0019 meantime += time * w;
0020 expv_x2 += time * time * w;
0021 normw += w;
0022 }
0023 }
0024 if (normw > 0.) {
0025 meantime = meantime / normw;
0026 expv_x2 = expv_x2 / normw;
0027 timecov = expv_x2 - meantime * meantime;
0028 auto err = vtx.positionError().matrix4D();
0029 err(3, 3) = timecov / (double)trks.size();
0030 vtx = TransientVertex(vtx.position(), meantime, err, vtx.originalTracks(), vtx.totalChiSquared());
0031 }
0032 }
0033 }
0034
0035 #endif