File indexing completed on 2024-04-06 12:31:08
0001 #include "SimTracker/VertexAssociation/interface/VertexAssociatorByTracks.h"
0002
0003 #include "DataFormats/Common/interface/Handle.h"
0004 #include "DataFormats/Common/interface/Ref.h"
0005 #include "DataFormats/Common/interface/RefToBase.h"
0006 #include "DataFormats/VertexReco/interface/Vertex.h"
0007 #include "DataFormats/VertexReco/interface/VertexFwd.h"
0008
0009 #include "FWCore/Framework/interface/Frameworkfwd.h"
0010 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0011
0012 #include "SimDataFormats/EncodedEventId/interface/EncodedEventId.h"
0013 #include "SimDataFormats/TrackingAnalysis/interface/TrackingVertex.h"
0014 #include "SimDataFormats/TrackingAnalysis/interface/TrackingVertexContainer.h"
0015
0016 #include "SimTracker/Common/interface/TrackingParticleSelector.h"
0017
0018 #include "CommonTools/Statistics/interface/ChiSquaredProbability.h"
0019
0020
0021 VertexAssociatorByTracks::VertexAssociatorByTracks(const edm::EDProductGetter *productGetter,
0022 double R2SMatchedSimRatio,
0023 double R2SMatchedRecoRatio,
0024 double S2RMatchedSimRatio,
0025 double S2RMatchedRecoRatio,
0026 const TrackingParticleSelector *selector,
0027 reco::TrackBase::TrackQuality trackQuality,
0028 const reco::RecoToSimCollection *trackRecoToSimAssociation,
0029 const reco::SimToRecoCollection *trackSimToRecoAssociation)
0030 : productGetter_(productGetter),
0031 R2SMatchedSimRatio_(R2SMatchedSimRatio),
0032 R2SMatchedRecoRatio_(R2SMatchedRecoRatio),
0033 S2RMatchedSimRatio_(S2RMatchedSimRatio),
0034 S2RMatchedRecoRatio_(S2RMatchedRecoRatio),
0035 selector_(selector),
0036 trackQuality_(trackQuality),
0037 trackRecoToSimAssociation_(trackRecoToSimAssociation),
0038 trackSimToRecoAssociation_(trackSimToRecoAssociation) {}
0039
0040
0041 VertexAssociatorByTracks::~VertexAssociatorByTracks() {}
0042
0043 reco::VertexRecoToSimCollection VertexAssociatorByTracks::associateRecoToSim(
0044 const edm::Handle<edm::View<reco::Vertex>> &recoVertexes,
0045 const edm::Handle<TrackingVertexCollection> &trackingVertexes) const {
0046 reco::VertexRecoToSimCollection outputCollection(productGetter_);
0047
0048 std::map<TrackingVertexRef, std::pair<double, std::size_t>> matches;
0049
0050 LogDebug("VertexAssociation") << "reco::VertexCollection size = " << recoVertexes->size()
0051 << " ; TrackingVertexCollection size = " << trackingVertexes->size() << std::endl;
0052
0053
0054 for (std::size_t recoIndex = 0; recoIndex < recoVertexes->size(); ++recoIndex) {
0055 reco::VertexBaseRef recoVertex(recoVertexes, recoIndex);
0056
0057 matches.clear();
0058
0059 double recoDaughterWeight = 0.;
0060
0061
0062 for (reco::Vertex::trackRef_iterator recoDaughter = recoVertex->tracks_begin();
0063 recoDaughter != recoVertex->tracks_end();
0064 ++recoDaughter) {
0065
0066 if (!(*recoDaughter)->quality(trackQuality_))
0067 continue;
0068
0069
0070 if (trackRecoToSimAssociation_->numberOfAssociations(*recoDaughter) > 0) {
0071 std::vector<std::pair<TrackingParticleRef, double>> associations = (*trackRecoToSimAssociation_)[*recoDaughter];
0072
0073
0074 for (std::vector<std::pair<TrackingParticleRef, double>>::const_iterator association = associations.begin();
0075 association != associations.end();
0076 ++association) {
0077
0078
0079 TrackingVertexRef trackingVertex = association->first->parentVertex();
0080
0081 matches[trackingVertex].first += recoVertex->trackWeight(*recoDaughter);
0082 matches[trackingVertex].second++;
0083 }
0084 }
0085
0086 recoDaughterWeight += recoVertex->trackWeight(*recoDaughter);
0087 }
0088
0089 std::size_t assoIndex = 0;
0090
0091
0092 for (std::map<TrackingVertexRef, std::pair<double, std::size_t>>::const_iterator match = matches.begin();
0093 match != matches.end();
0094 ++match) {
0095
0096 TrackingVertexRef trackingVertex = match->first;
0097 double matchedDaughterWeight = match->second.first;
0098 std::size_t matchedDaughterCounter = match->second.second;
0099
0100
0101 std::size_t simDaughterCounter = 0;
0102
0103 for (TrackingVertex::tp_iterator simDaughter = trackingVertex->daughterTracks_begin();
0104 simDaughter != trackingVertex->daughterTracks_end();
0105 ++simDaughter)
0106 if ((*selector_)(**simDaughter))
0107 simDaughterCounter++;
0108
0109
0110 if (simDaughterCounter < matchedDaughterCounter)
0111 simDaughterCounter = matchedDaughterCounter;
0112
0113
0114 if ((double)matchedDaughterCounter / simDaughterCounter < R2SMatchedSimRatio_)
0115 continue;
0116
0117 double quality = (double)matchedDaughterWeight / recoDaughterWeight;
0118
0119
0120 if (quality < R2SMatchedRecoRatio_)
0121 continue;
0122
0123 outputCollection.insert(recoVertex, std::make_pair(trackingVertex, quality));
0124
0125 LogTrace("VertexAssociation") << "R2S: INDEX " << assoIndex << " ; SimDaughterCounter = " << simDaughterCounter
0126 << " ; RecoDaughterWeight = " << recoDaughterWeight
0127 << " ; MatchedDaughterCounter = " << matchedDaughterCounter
0128 << " ; MatchedDaughterWeight = " << matchedDaughterWeight
0129 << " ; quality = " << quality;
0130
0131 assoIndex++;
0132 }
0133 }
0134
0135 LogTrace("VertexAssociation") << "\nRecoToSim OUTPUT COLLECTION: outputCollection.size() = "
0136 << outputCollection.size() << std::endl;
0137
0138 return outputCollection;
0139 }
0140
0141 reco::VertexSimToRecoCollection VertexAssociatorByTracks::associateSimToReco(
0142 const edm::Handle<edm::View<reco::Vertex>> &recoVertexes,
0143 const edm::Handle<TrackingVertexCollection> &trackingVertexes) const {
0144 reco::VertexSimToRecoCollection outputCollection(productGetter_);
0145
0146
0147 std::map<std::size_t, std::pair<double, std::size_t>> matches;
0148
0149
0150 for (std::size_t simIndex = 0; simIndex < trackingVertexes->size(); ++simIndex) {
0151 TrackingVertexRef trackingVertex(trackingVertexes, simIndex);
0152
0153 matches.clear();
0154
0155 std::size_t simDaughterCounter = 0;
0156
0157
0158 for (TrackingVertex::tp_iterator simDaughter = trackingVertex->daughterTracks_begin();
0159 simDaughter != trackingVertex->daughterTracks_end();
0160 ++simDaughter) {
0161
0162 if (!(*selector_)(**simDaughter))
0163 continue;
0164
0165
0166 if (trackSimToRecoAssociation_->numberOfAssociations(*simDaughter) > 0) {
0167 std::vector<std::pair<reco::TrackBaseRef, double>> associations = (*trackSimToRecoAssociation_)[*simDaughter];
0168
0169
0170 for (std::vector<std::pair<reco::TrackBaseRef, double>>::const_iterator association = associations.begin();
0171 association != associations.end();
0172 ++association) {
0173 reco::TrackBaseRef recoTrack = association->first;
0174
0175 for (std::size_t recoIndex = 0; recoIndex < recoVertexes->size(); ++recoIndex) {
0176 reco::VertexBaseRef recoVertex(recoVertexes, recoIndex);
0177
0178 for (reco::Vertex::trackRef_iterator recoDaughter = recoVertex->tracks_begin();
0179 recoDaughter != recoVertex->tracks_end();
0180 ++recoDaughter) {
0181
0182 if (recoDaughter->id() == recoTrack.id() && recoDaughter->key() == recoTrack.key()) {
0183 matches[recoIndex].first += recoVertex->trackWeight(*recoDaughter);
0184 matches[recoIndex].second++;
0185 }
0186 }
0187 }
0188 }
0189 }
0190
0191 simDaughterCounter++;
0192 }
0193
0194 std::size_t assoIndex = 0;
0195
0196
0197 for (std::map<std::size_t, std::pair<double, std::size_t>>::const_iterator match = matches.begin();
0198 match != matches.end();
0199 ++match) {
0200
0201 reco::VertexBaseRef recoVertex(recoVertexes, match->first);
0202 double matchedDaughterWeight = match->second.first;
0203 std::size_t matchedDaughterCounter = match->second.second;
0204
0205 double recoDaughterWeight = 0.;
0206
0207
0208
0209 for (reco::Vertex::trackRef_iterator recoDaughter = recoVertex->tracks_begin();
0210 recoDaughter != recoVertex->tracks_end();
0211 ++recoDaughter)
0212 if ((*recoDaughter)->quality(trackQuality_))
0213 recoDaughterWeight += recoVertex->trackWeight(*recoDaughter);
0214
0215
0216 if (recoDaughterWeight < matchedDaughterWeight)
0217 recoDaughterWeight = matchedDaughterWeight;
0218
0219
0220 if (matchedDaughterWeight / recoDaughterWeight < S2RMatchedRecoRatio_)
0221 continue;
0222
0223 double quality = (double)matchedDaughterCounter / simDaughterCounter;
0224
0225
0226 if (quality < S2RMatchedSimRatio_)
0227 continue;
0228
0229 outputCollection.insert(trackingVertex, std::make_pair(recoVertex, quality));
0230
0231 LogTrace("VertexAssociation") << "R2S: INDEX " << assoIndex << " ; SimDaughterCounter = " << simDaughterCounter
0232 << " ; RecoDaughterWeight = " << recoDaughterWeight
0233 << " ; MatchedDaughterCounter = " << matchedDaughterCounter
0234 << " ; MatchedDaughterWeight = " << matchedDaughterWeight
0235 << " ; quality = " << quality;
0236
0237 assoIndex++;
0238 }
0239 }
0240
0241 LogTrace("VertexAssociation") << "SimToReco OUTPUT COLLECTION: outputCollection.size() = " << outputCollection.size()
0242 << std::endl;
0243
0244 return outputCollection;
0245 }