File indexing completed on 2024-04-06 12:29:07
0001 #include "RecoVertex/GaussianSumVertexFit/interface/GsfVertexMerger.h"
0002 #include "TrackingTools/GsfTools/interface/KullbackLeiblerDistance.h"
0003
0004 #include "TrackingTools/GsfTools/interface/CloseComponentsMerger.h"
0005
0006
0007
0008 #include "DataFormats/Common/interface/Handle.h"
0009 #include "RecoVertex/VertexPrimitives/interface/VertexException.h"
0010
0011 #include "RecoVertex/GaussianSumVertexFit/interface/VertexGaussianStateConversions.h"
0012
0013 GsfVertexMerger::GsfVertexMerger(const edm::ParameterSet& pSet) {
0014 maxComponents = pSet.getParameter<int>("maxNbrComponents");
0015 std::string mergerName = pSet.getParameter<std::string>("merger");
0016 std::string distanceName = pSet.getParameter<std::string>("distance");
0017
0018 if (mergerName == "CloseComponentsMerger") {
0019 DistanceBetweenComponents<3>* distance;
0020
0021 if (distanceName == "KullbackLeiblerDistance")
0022 distance = new KullbackLeiblerDistance<3>();
0023
0024
0025 else
0026 throw VertexException("GsfVertexMerger: Distance type " + distanceName +
0027 " unknown. Check distance parameter in GsfMergerParameters PSet");
0028
0029 merger = new CloseComponentsMerger<3>(maxComponents, distance);
0030 delete distance;
0031 }
0032
0033
0034 else
0035 throw VertexException("GsfVertexMerger: Merger type " + mergerName +
0036 " unknown. Check merger parameter in GsfMergerParameters PSet");
0037
0038
0039
0040
0041
0042
0043
0044
0045 }
0046
0047 CachingVertex<5> GsfVertexMerger::merge(const CachingVertex<5>& oldVertex) const {
0048 if (oldVertex.vertexState().components().size() <= maxComponents)
0049 return oldVertex;
0050
0051 VertexState newVertexState = merge(oldVertex.vertexState());
0052
0053 if (oldVertex.hasPrior()) {
0054 return CachingVertex<5>(oldVertex.priorPosition(),
0055 oldVertex.priorError(),
0056 newVertexState.weightTimesPosition(),
0057 newVertexState.weight(),
0058 oldVertex.tracks(),
0059 oldVertex.totalChiSquared());
0060 } else {
0061 return CachingVertex<5>(newVertexState, oldVertex.tracks(), oldVertex.totalChiSquared());
0062 }
0063 }
0064
0065 VertexState GsfVertexMerger::merge(const VertexState& oldVertex) const {
0066 using namespace GaussianStateConversions;
0067
0068 if (oldVertex.components().size() <= maxComponents)
0069 return oldVertex;
0070
0071 MultiGaussianState<3> multiGaussianState(multiGaussianStateFromVertex(oldVertex));
0072 MultiGaussianState<3> finalState(merger->merge(multiGaussianState));
0073 return vertexFromMultiGaussianState(finalState);
0074 }