File indexing completed on 2024-09-10 02:59:14
0001
0002
0003
0004
0005
0006
0007
0008
0009 #include <iostream>
0010 #include <memory>
0011 #include <sstream>
0012 #include <string>
0013 #include <vector>
0014
0015
0016 #include "DataFormats/TrackReco/interface/TrackFwd.h"
0017 #include "DataFormats/VertexReco/interface/Vertex.h"
0018
0019 #include "FWCore/Framework/interface/ESHandle.h"
0020 #include "FWCore/Framework/interface/Event.h"
0021 #include "FWCore/Utilities/interface/EDGetToken.h"
0022 #include "FWCore/Framework/interface/EventSetup.h"
0023 #include "FWCore/Framework/interface/Frameworkfwd.h"
0024 #include "FWCore/Framework/interface/MakerMacros.h"
0025 #include "FWCore/Framework/interface/one/EDAnalyzer.h"
0026 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0027
0028 #include "SimGeneral/HepPDTRecord/interface/ParticleDataTable.h"
0029 #include "SimTracker/TrackHistory/interface/VertexClassifier.h"
0030
0031
0032
0033
0034
0035 class VertexHistoryAnalyzer : public edm::one::EDAnalyzer<edm::one::WatchRuns> {
0036 public:
0037 explicit VertexHistoryAnalyzer(const edm::ParameterSet &);
0038 ~VertexHistoryAnalyzer() override = default;
0039
0040 private:
0041 void beginRun(const edm::Run &, const edm::EventSetup &) override;
0042 void endRun(const edm::Run &, const edm::EventSetup &) override {}
0043 void analyze(const edm::Event &, const edm::EventSetup &) override;
0044
0045
0046 const edm::ESGetToken<ParticleDataTable, PDTRecord> pdtToken_;
0047 const edm::EDGetTokenT<edm::View<reco::Vertex>> vtxToken_;
0048
0049 VertexClassifier classifier_;
0050
0051 edm::ESHandle<ParticleDataTable> pdt_;
0052
0053 std::string particleString(int) const;
0054
0055 std::string vertexString(const TrackingParticleRefVector &, const TrackingParticleRefVector &) const;
0056
0057 std::string vertexString(HepMC::GenVertex::particles_in_const_iterator,
0058 HepMC::GenVertex::particles_in_const_iterator,
0059 HepMC::GenVertex::particles_out_const_iterator,
0060 HepMC::GenVertex::particles_out_const_iterator) const;
0061 };
0062
0063 VertexHistoryAnalyzer::VertexHistoryAnalyzer(const edm::ParameterSet &config)
0064 : pdtToken_(esConsumes<edm::Transition::BeginRun>()),
0065 vtxToken_(consumes<edm::View<reco::Vertex>>(config.getUntrackedParameter<edm::InputTag>("vertexProducer"))),
0066 classifier_(config, consumesCollector()) {}
0067
0068 void VertexHistoryAnalyzer::analyze(const edm::Event &event, const edm::EventSetup &setup) {
0069
0070 classifier_.newEvent(event, setup);
0071
0072
0073 edm::Handle<edm::View<reco::Vertex>> vertexCollection;
0074 event.getByToken(vtxToken_, vertexCollection);
0075
0076
0077 VertexHistory const &tracer = classifier_.history();
0078
0079
0080 for (std::size_t index = 0; index < vertexCollection->size(); index++) {
0081 edm::LogPrint("VertexHistoryAnalyzer") << std::endl << "History for vertex #" << index << " : ";
0082
0083
0084 if (!classifier_.evaluate(reco::VertexBaseRef(vertexCollection, index)).is(VertexClassifier::Fake)) {
0085
0086 VertexHistory::SimParticleTrail simParticles(tracer.simParticleTrail());
0087
0088
0089 for (std::size_t hindex = 0; hindex < simParticles.size(); hindex++) {
0090 edm::LogPrint("VertexHistoryAnalyzer")
0091 << " simParticles [" << hindex << "] : " << particleString(simParticles[hindex]->pdgId());
0092 }
0093
0094
0095 VertexHistory::SimVertexTrail simVertexes(tracer.simVertexTrail());
0096
0097
0098 if (!simVertexes.empty()) {
0099 for (std::size_t hindex = 0; hindex < simVertexes.size(); hindex++) {
0100 edm::LogPrint("VertexHistoryAnalyzer")
0101 << " simVertex [" << hindex
0102 << "] : " << vertexString(simVertexes[hindex]->sourceTracks(), simVertexes[hindex]->daughterTracks());
0103 }
0104 } else
0105 edm::LogPrint("VertexHistoryAnalyzer") << " simVertex no found";
0106
0107
0108 VertexHistory::GenParticleTrail genParticles(tracer.genParticleTrail());
0109
0110
0111 for (std::size_t hindex = 0; hindex < genParticles.size(); hindex++) {
0112 edm::LogPrint("VertexHistoryAnalyzer")
0113 << " genParticles [" << hindex << "] : " << particleString(genParticles[hindex]->pdg_id());
0114 }
0115
0116
0117 VertexHistory::GenVertexTrail genVertexes(tracer.genVertexTrail());
0118
0119
0120 if (!genVertexes.empty()) {
0121 for (std::size_t hindex = 0; hindex < genVertexes.size(); hindex++) {
0122 edm::LogPrint("VertexHistoryAnalyzer") << " genVertex [" << hindex << "] : "
0123 << vertexString(genVertexes[hindex]->particles_in_const_begin(),
0124 genVertexes[hindex]->particles_in_const_end(),
0125 genVertexes[hindex]->particles_out_const_begin(),
0126 genVertexes[hindex]->particles_out_const_end());
0127 }
0128 } else
0129 edm::LogPrint("VertexHistoryAnalyzer") << " genVertex no found";
0130 } else
0131 edm::LogPrint("VertexHistoryAnalyzer") << " fake vertex";
0132
0133 edm::LogPrint("VertexHistoryAnalyzer") << " vertex categories : " << classifier_;
0134 }
0135 }
0136
0137 void VertexHistoryAnalyzer::beginRun(const edm::Run &run, const edm::EventSetup &setup) {
0138
0139 pdt_ = setup.getHandle(pdtToken_);
0140 }
0141
0142 std::string VertexHistoryAnalyzer::particleString(int pdgId) const {
0143 ParticleData const *pid;
0144
0145 std::ostringstream vDescription;
0146
0147 HepPDT::ParticleID particleType(pdgId);
0148
0149 if (particleType.isValid()) {
0150 pid = pdt_->particle(particleType);
0151 if (pid)
0152 vDescription << pid->name();
0153 else
0154 vDescription << pdgId;
0155 } else
0156 vDescription << pdgId;
0157
0158 return vDescription.str();
0159 }
0160
0161 std::string VertexHistoryAnalyzer::vertexString(const TrackingParticleRefVector &in,
0162 const TrackingParticleRefVector &out) const {
0163 ParticleData const *pid;
0164
0165 std::ostringstream vDescription;
0166
0167 for (std::size_t j = 0; j < in.size(); j++) {
0168 if (!j)
0169 vDescription << "(";
0170
0171 HepPDT::ParticleID particleType(in[j]->pdgId());
0172
0173 if (particleType.isValid()) {
0174 pid = pdt_->particle(particleType);
0175 if (pid)
0176 vDescription << pid->name();
0177 else
0178 vDescription << in[j]->pdgId();
0179 } else
0180 vDescription << in[j]->pdgId();
0181
0182 if (j == in.size() - 1)
0183 vDescription << ")";
0184 else
0185 vDescription << ",";
0186 }
0187
0188 vDescription << "->";
0189
0190 for (std::size_t j = 0; j < out.size(); j++) {
0191 if (!j)
0192 vDescription << "(";
0193
0194 HepPDT::ParticleID particleType(out[j]->pdgId());
0195
0196 if (particleType.isValid()) {
0197 pid = pdt_->particle(particleType);
0198 if (pid)
0199 vDescription << pid->name();
0200 else
0201 vDescription << out[j]->pdgId();
0202 } else
0203 vDescription << out[j]->pdgId();
0204
0205 if (j == out.size() - 1)
0206 vDescription << ")";
0207 else
0208 vDescription << ",";
0209 }
0210
0211 return vDescription.str();
0212 }
0213
0214 std::string VertexHistoryAnalyzer::vertexString(HepMC::GenVertex::particles_in_const_iterator in_begin,
0215 HepMC::GenVertex::particles_in_const_iterator in_end,
0216 HepMC::GenVertex::particles_out_const_iterator out_begin,
0217 HepMC::GenVertex::particles_out_const_iterator out_end) const {
0218 ParticleData const *pid;
0219
0220 std::ostringstream vDescription;
0221
0222 std::size_t j = 0;
0223
0224 HepMC::GenVertex::particles_in_const_iterator in, itmp;
0225
0226 for (in = in_begin; in != in_end; in++, j++) {
0227 if (!j)
0228 vDescription << "(";
0229
0230 HepPDT::ParticleID particleType((*in)->pdg_id());
0231
0232 if (particleType.isValid()) {
0233 pid = pdt_->particle(particleType);
0234 if (pid)
0235 vDescription << pid->name();
0236 else
0237 vDescription << (*in)->pdg_id();
0238 } else
0239 vDescription << (*in)->pdg_id();
0240
0241 itmp = in;
0242
0243 if (++itmp == in_end)
0244 vDescription << ")";
0245 else
0246 vDescription << ",";
0247 }
0248
0249 vDescription << "->";
0250 j = 0;
0251
0252 HepMC::GenVertex::particles_out_const_iterator out, otmp;
0253
0254 for (out = out_begin; out != out_end; out++, j++) {
0255 if (!j)
0256 vDescription << "(";
0257
0258 HepPDT::ParticleID particleType((*out)->pdg_id());
0259
0260 if (particleType.isValid()) {
0261 pid = pdt_->particle(particleType);
0262 if (pid)
0263 vDescription << pid->name();
0264 else
0265 vDescription << (*out)->pdg_id();
0266 } else
0267 vDescription << (*out)->pdg_id();
0268
0269 otmp = out;
0270
0271 if (++otmp == out_end)
0272 vDescription << ")";
0273 else
0274 vDescription << ",";
0275 }
0276
0277 return vDescription.str();
0278 }
0279
0280 DEFINE_FWK_MODULE(VertexHistoryAnalyzer);