File indexing completed on 2024-09-10 02:59:07
0001
0002 #include <vector>
0003
0004
0005 #include "FWCore/Framework/interface/Frameworkfwd.h"
0006 #include "FWCore/Framework/interface/one/EDAnalyzer.h"
0007 #include "FWCore/ParameterSet/interface/ConfigurationDescriptions.h"
0008 #include "FWCore/Utilities/interface/EDGetToken.h"
0009 #include "DataFormats/Common/interface/ValidHandle.h"
0010 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0011
0012 #include "FWCore/Framework/interface/Event.h"
0013 #include "FWCore/ParameterSet/interface/ParameterSet.h"
0014
0015 #include "SimDataFormats/TrackingHit/interface/PSimHit.h"
0016 #include "SimDataFormats/TrackingHit/interface/PSimHitContainer.h"
0017
0018 #include "SimDataFormats/Track/interface/SimTrack.h"
0019 #include "SimDataFormats/Track/interface/SimTrackContainer.h"
0020 #include "SimDataFormats/Vertex/interface/SimVertex.h"
0021 #include "SimDataFormats/Vertex/interface/SimVertexContainer.h"
0022
0023 #include "SimDataFormats/GeneratorProducts/interface/HepMCProduct.h"
0024 #include "HepMC/GenEvent.h"
0025
0026 class SimTrackSimVertexDumper : public edm::one::EDAnalyzer<> {
0027 public:
0028 explicit SimTrackSimVertexDumper(const edm::ParameterSet&);
0029 ~SimTrackSimVertexDumper() override {}
0030
0031 void analyze(const edm::Event&, const edm::EventSetup&) override;
0032 void beginJob() override {}
0033 void endJob() override {}
0034
0035 static void fillDescriptions(edm::ConfigurationDescriptions& descriptions);
0036
0037 private:
0038 edm::EDGetTokenT<edm::HepMCProduct> hepmcToken_;
0039 edm::EDGetTokenT<edm::SimTrackContainer> simTrackToken_;
0040 edm::EDGetTokenT<edm::SimVertexContainer> simVertexToken_;
0041 bool dumpHepMC_;
0042 };
0043
0044 SimTrackSimVertexDumper::SimTrackSimVertexDumper(const edm::ParameterSet& iConfig)
0045 : hepmcToken_(consumes<edm::HepMCProduct>(iConfig.getParameter<edm::InputTag>("moduleLabelHepMC"))),
0046 simTrackToken_(consumes<edm::SimTrackContainer>(iConfig.getParameter<edm::InputTag>("moduleLabelTk"))),
0047 simVertexToken_(consumes<edm::SimVertexContainer>(iConfig.getParameter<edm::InputTag>("moduleLabelVtx"))),
0048 dumpHepMC_(iConfig.getUntrackedParameter<bool>("dumpHepMC")) {}
0049
0050
0051
0052
0053
0054
0055 void SimTrackSimVertexDumper::analyze(const edm::Event& iEvent, const edm::EventSetup& iSetup) {
0056 using namespace HepMC;
0057
0058 std::vector<SimTrack> theSimTracks;
0059 std::vector<SimVertex> theSimVertexes;
0060
0061 auto MCEvt = edm::makeValid(iEvent.getHandle(hepmcToken_));
0062 const HepMC::GenEvent* evt = MCEvt->GetEvent();
0063
0064 auto SimTk = edm::makeValid(iEvent.getHandle(simTrackToken_));
0065 auto SimVtx = edm::makeValid(iEvent.getHandle(simVertexToken_));
0066
0067 theSimTracks.insert(theSimTracks.end(), SimTk->begin(), SimTk->end());
0068 theSimVertexes.insert(theSimVertexes.end(), SimVtx->begin(), SimVtx->end());
0069
0070 edm::LogPrint("DumpTkVtx") << "\n SimVertex / SimTrack structure dump \n";
0071 edm::LogPrint("DumpTkVtx") << " SimVertex in the event = " << theSimVertexes.size();
0072 edm::LogPrint("DumpTkVtx") << " SimTracks in the event = " << theSimTracks.size();
0073 edm::LogPrint("DumpTkVtx") << "\n";
0074 for (unsigned int isimvtx = 0; isimvtx < theSimVertexes.size(); isimvtx++) {
0075 edm::LogPrint("DumpTkVtx") << "SimVertex " << isimvtx << " = " << theSimVertexes[isimvtx] << "\n";
0076 for (unsigned int isimtk = 0; isimtk < theSimTracks.size(); isimtk++) {
0077 if (theSimTracks[isimtk].vertIndex() >= 0 && std::abs(theSimTracks[isimtk].vertIndex()) == (int)isimvtx) {
0078 edm::LogPrint("DumpTkVtx") << " SimTrack " << isimtk << " = " << theSimTracks[isimtk]
0079 << " Track Id = " << theSimTracks[isimtk].trackId();
0080
0081
0082 if (dumpHepMC_) {
0083 if (theSimTracks[isimtk].genpartIndex() != -1) {
0084 HepMC::GenParticle* part = evt->barcode_to_particle(theSimTracks[isimtk].genpartIndex());
0085 if (part) {
0086 edm::LogPrint("DumpTkVtx") << " ---> Corresponding to HepMC particle " << *part;
0087 } else {
0088 edm::LogPrint("DumpTkVtx") << " ---> Corresponding HepMC particle to barcode "
0089 << theSimTracks[isimtk].genpartIndex() << " not in selected event ";
0090 }
0091 }
0092 }
0093 }
0094 }
0095 edm::LogPrint("DumpTkVtx") << "\n";
0096 }
0097
0098 for (std::vector<SimTrack>::iterator isimtk = theSimTracks.begin(); isimtk != theSimTracks.end(); ++isimtk) {
0099 if (isimtk->noVertex()) {
0100 edm::LogPrint("DumpTkVtx") << "SimTrack without an associated Vertex = " << *isimtk;
0101 }
0102 }
0103
0104 return;
0105 }
0106
0107 void SimTrackSimVertexDumper::fillDescriptions(edm::ConfigurationDescriptions& descriptions) {
0108 edm::ParameterSetDescription desc;
0109 desc.add<edm::InputTag>("moduleLabelHepMC", edm::InputTag("generatorSmeared"))
0110 ->setComment("Input generated HepMC event after vtx smearing");
0111 desc.add<edm::InputTag>("moduleLabelTk", edm::InputTag("g4SimHits"))
0112 ->setComment("Module for input SimTrack collection");
0113 desc.add<edm::InputTag>("moduleLabelVtx", edm::InputTag("g4SimHits"))
0114 ->setComment("Module for input SimVertex collection");
0115 desc.addUntracked<bool>("dumpHepMC", false);
0116 descriptions.add("simTrackSimVertexDumper", desc);
0117 }
0118
0119 #include "FWCore/Framework/interface/MakerMacros.h"
0120
0121
0122 DEFINE_FWK_MODULE(SimTrackSimVertexDumper);