From f95e1ccfcd856e434f4c860c4eea84a70c179f1d Mon Sep 17 00:00:00 2001 From: Andrey Date: Thu, 24 Feb 2022 10:33:51 +0100 Subject: [PATCH] memory leak fix for Hydjets --- .../Hydjet2Interface/src/Hydjet2Hadronizer.cc | 89 +++++++++---------- .../Hydjet2Interface/test/Hydjet2Analyzer.cc | 50 ++++++----- .../Hydjet2Interface/test/testHydjet.py | 37 +++++++- .../HydjetInterface/src/HydjetHadronizer.cc | 32 +++---- .../HydjetInterface/test/HydjetAnalyzer.cc | 73 ++++++--------- .../PyquenInterface/test/PyquenAnalyzer.h | 12 +-- 6 files changed, 154 insertions(+), 139 deletions(-) diff --git a/GeneratorInterface/Hydjet2Interface/src/Hydjet2Hadronizer.cc b/GeneratorInterface/Hydjet2Interface/src/Hydjet2Hadronizer.cc index 6261ae91fd2ed..5f2f58cadbc7c 100644 --- a/GeneratorInterface/Hydjet2Interface/src/Hydjet2Hadronizer.cc +++ b/GeneratorInterface/Hydjet2Interface/src/Hydjet2Hadronizer.cc @@ -1,6 +1,6 @@ /** * \brief Interface to the HYDJET++ (Hydjet2) generator (since core v. 2.4.3), produces HepMC events - * \version 1.1 + * \version 1.2 * \author Andrey Belyaev */ @@ -329,21 +329,22 @@ bool Hydjet2Hadronizer::generatePartonsAndHadronize() { nsub_++; // event information - HepMC::GenEvent *evt = new HepMC::GenEvent(); + std::unique_ptr evt = std::make_unique(); + std::unique_ptr HepMCEvt = std::make_unique(); if (nhard_ > 0 || nsoft_ > 0) - get_particles(evt); + get_particles(evt.get()); evt->set_signal_process_id(pypars.msti[0]); // type of the process evt->set_event_scale(pypars.pari[16]); // Q^2 - add_heavy_ion_rec(evt); + add_heavy_ion_rec(evt.get()); if (fVertex_) { // generate new vertex & apply the shift // Copy the HepMC::GenEvent - std::unique_ptr HepMCEvt(new edm::HepMCProduct(evt)); + HepMCEvt = std::make_unique(evt.get()); HepMCEvt->applyVtxGen(fVertex_); - evt = new HepMC::GenEvent((*HepMCEvt->GetEvent())); + evt = std::make_unique(*HepMCEvt->GetEvent()); } HepMC::HEPEVT_Wrapper::check_hepevt_consistency(); @@ -351,7 +352,7 @@ bool Hydjet2Hadronizer::generatePartonsAndHadronize() { << " Entries number: " << HepMC::HEPEVT_Wrapper::number_entries() << " Max. entries " << HepMC::HEPEVT_Wrapper::max_number_entries() << std::endl; - event().reset(evt); + event() = std::move(evt); return kTRUE; } @@ -385,27 +386,23 @@ void Hydjet2Hadronizer::rotateEvtPlane() { //_____________________________________________________________________ bool Hydjet2Hadronizer::get_particles(HepMC::GenEvent *evt) { - LogDebug("SubEvent") << " Number of sub events " << nsub_; - LogDebug("Hydjet") << " Number of hard events " << hj2->GetNjet(); - LogDebug("Hydjet") << " Number of hard particles " << nhard_; - LogDebug("Hydjet") << " Number of soft particles " << nsoft_; - LogDebug("Hydjet") << " nhard_ + nsoft_ = " << nhard_ + nsoft_ << " Ntot = " << hj2->GetNtot() << endl; + LogDebug("Hydjet2") << " Number of sub events " << nsub_; + LogDebug("Hydjet2") << " Number of hard events " << hj2->GetNjet(); + LogDebug("Hydjet2") << " Number of hard particles " << nhard_; + LogDebug("Hydjet2") << " Number of soft particles " << nsoft_; + LogDebug("Hydjet2") << " nhard_ + nsoft_ = " << nhard_ + nsoft_ << " Ntot = " << hj2->GetNtot() << endl; int ihy = 0; int isub_l = -1; int stab = 0; - vector primary_particle(hj2->GetNtot()); vector particle(hj2->GetNtot()); - - HepMC::GenVertex *sub_vertices = new HepMC::GenVertex(HepMC::FourVector(0, 0, 0, 0), 0); // just initialization + HepMC::GenVertex *sub_vertices = nullptr; while (ihy < hj2->GetNtot()) { if ((hj2->GetiJet().at(ihy)) != isub_l) { sub_vertices = new HepMC::GenVertex(HepMC::FourVector(0, 0, 0, 0), hj2->GetiJet().at(ihy)); - evt->add_vertex(sub_vertices); - if (!evt->signal_process_vertex()) evt->set_signal_process_vertex(sub_vertices); isub_l = hj2->GetiJet().at(ihy); @@ -413,55 +410,55 @@ bool Hydjet2Hadronizer::get_particles(HepMC::GenEvent *evt) { if ((hj2->GetFinal().at(ihy)) == 1) //convertStatus(hj2->GetPythiaStatus().at(ihy)) == 1) stab++; - LogDebug("Hydjet_array") << ihy << " MULTin ev.:" << hj2->GetNtot() << " SubEv.#" << hj2->GetiJet().at(ihy) - << " Part #" << ihy + 1 << ", PDG: " << hj2->GetPdg().at(ihy) << " (st. " - << convertStatus(hj2->GetPythiaStatus().at(ihy)) - << ") mother=" << hj2->GetMotherIndex().at(ihy) + 1 << ", childs (" - << hj2->GetFirstDaughterIndex().at(ihy) + 1 << "-" - << hj2->GetLastDaughterIndex().at(ihy) + 1 << "), vtx (" << hj2->GetX().at(ihy) << "," - << hj2->GetY().at(ihy) << "," << hj2->GetZ().at(ihy) << ") " << std::endl; + LogDebug("Hydjet2_array") << ihy << " MULTin ev.:" << hj2->GetNtot() << " SubEv.#" << hj2->GetiJet().at(ihy) + << " Part #" << ihy + 1 << ", PDG: " << hj2->GetPdg().at(ihy) << " (st. " + << convertStatus(hj2->GetPythiaStatus().at(ihy)) + << ") mother=" << hj2->GetMotherIndex().at(ihy) + 1 << ", childs (" + << hj2->GetFirstDaughterIndex().at(ihy) + 1 << "-" + << hj2->GetLastDaughterIndex().at(ihy) + 1 << "), vtx (" << hj2->GetX().at(ihy) << "," + << hj2->GetY().at(ihy) << "," << hj2->GetZ().at(ihy) << ") " << std::endl; if ((hj2->GetMotherIndex().at(ihy)) <= 0) { - primary_particle.at(ihy) = build_hyjet2(ihy, ihy + 1); - sub_vertices->add_particle_out(primary_particle.at(ihy)); - LogDebug("Hydjet_array") << " ---> " << ihy + 1 << std::endl; + particle.at(ihy) = build_hyjet2(ihy, ihy + 1); + if (!sub_vertices) + LogError("Hydjet2_array") << "##### HYDJET2: Vertex not initialized!"; + else + sub_vertices->add_particle_out(particle.at(ihy)); + LogDebug("Hydjet2_array") << " ---> " << ihy + 1 << std::endl; } else { particle.at(ihy) = build_hyjet2(ihy, ihy + 1); int mid = hj2->GetMotherIndex().at(ihy); - int mid_t = mid; - while ((mid < ihy) && ((hj2->GetPdg().at(ihy)) < 100) && ((hj2->GetFirstDaughterIndex().at(ihy)) == ihy)) + while (((mid + 1) < ihy) && (std::abs(hj2->GetPdg().at(mid)) < 100) && + ((hj2->GetFirstDaughterIndex().at(mid + 1)) <= ihy)) { mid++; + LogDebug("Hydjet2_array") << "======== MID changed to " << mid + << " ======== PDG(mid) = " << hj2->GetPdg().at(mid) << std::endl; + } - if ((hj2->GetPdg().at(ihy)) < 100) - mid = mid_t; - - HepMC::GenParticle *mother = primary_particle.at(mid); - HepMC::GenVertex *prods = build_hyjet2_vertex(ihy, (hj2->GetiJet().at(ihy))); - - if (!mother) { - mother = particle.at(mid); - primary_particle.at(mid) = mother; + if (std::abs(hj2->GetPdg().at(mid)) < 100) { + mid = hj2->GetMotherIndex().at(ihy); + LogDebug("Hydjet2_array") << "======== MID changed BACK to " << mid + << " ======== PDG(mid) = " << hj2->GetPdg().at(mid) << std::endl; } + HepMC::GenParticle *mother = particle.at(mid); HepMC::GenVertex *prod_vertex = mother->end_vertex(); + if (!prod_vertex) { - prod_vertex = prods; + prod_vertex = build_hyjet2_vertex(ihy, (hj2->GetiJet().at(ihy))); prod_vertex->add_particle_in(mother); - LogDebug("Hydjet_array") << " <--- " << mid + 1 << std::endl; + LogDebug("Hydjet2_array") << " <--- " << mid + 1 << std::endl; evt->add_vertex(prod_vertex); - prods = nullptr; } prod_vertex->add_particle_out(particle.at(ihy)); - LogDebug("Hydjet_array") << " ---" << mid + 1 << "---> " << ihy + 1 << std::endl; - delete prods; + LogDebug("Hydjet2_array") << " ---" << mid + 1 << "---> " << ihy + 1 << std::endl; } ihy++; } - delete sub_vertices; - LogDebug("Hydjet_array") << " MULTin ev.:" << hj2->GetNtot() << ", last index: " << ihy - 1 - << ", stable particles: " << stab << std::endl; + LogDebug("Hydjet2_array") << " MULTin ev.:" << hj2->GetNtot() << ", last index: " << ihy - 1 + << ", stable particles: " << stab << std::endl; return kTRUE; } diff --git a/GeneratorInterface/Hydjet2Interface/test/Hydjet2Analyzer.cc b/GeneratorInterface/Hydjet2Interface/test/Hydjet2Analyzer.cc index d45921b8ff1b0..098740755b5d6 100644 --- a/GeneratorInterface/Hydjet2Interface/test/Hydjet2Analyzer.cc +++ b/GeneratorInterface/Hydjet2Interface/test/Hydjet2Analyzer.cc @@ -1,7 +1,7 @@ /** \class Hydjet2Analyzer \brief HepMC events analyzer - \version 2.0 + \version 2.1 \authors Yetkin Yilmaz, Andrey Belyaev */ @@ -13,7 +13,7 @@ #include // user include files -#include "FWCore/Framework/interface/EDAnalyzer.h" +#include "FWCore/Framework/interface/one/EDAnalyzer.h" #include "FWCore/Framework/interface/Frameworkfwd.h" #include "FWCore/Framework/interface/Event.h" @@ -42,6 +42,7 @@ // root include file #include "TFile.h" #include "TNtuple.h" +#include "TH1.h" #include "FWCore/Framework/interface/ConsumesCollector.h" #include "FWCore/Framework/interface/EDProducer.h" @@ -49,9 +50,10 @@ using namespace edm; using namespace std; -static const int MAXPARTICLES = 5000000; -static const int ETABINS = 3; // Fix also in branch string - +namespace { + static const int MAXPARTICLES = 5000000; + static const int ETABINS = 3; // Fix also in branch string +} // namespace struct Hydjet2Event { int event; float b; @@ -79,16 +81,15 @@ struct Hydjet2Event { float vz; float vr; }; -class Hydjet2Analyzer : public edm::EDAnalyzer { +class Hydjet2Analyzer : public edm::one::EDAnalyzer { public: explicit Hydjet2Analyzer(const edm::ParameterSet &); ~Hydjet2Analyzer(); private: - virtual void beginRun(const edm::Run &, const edm::EventSetup &); - virtual void beginJob(); - virtual void analyze(const edm::Event &, const edm::EventSetup &); - virtual void endJob(); + void beginJob() final; + void analyze(const edm::Event &, const edm::EventSetup &) final; + void endJob() final; // ----------member data --------------------------- std::ofstream out_b; std::string fBFileName; @@ -100,6 +101,7 @@ class Hydjet2Analyzer : public edm::EDAnalyzer { Hydjet2Event hev_; TNtuple *nt; std::string output; // Output filename + bool doTestEvent_; bool doAnalysis_; bool printLists_; bool doCF_; @@ -155,9 +157,7 @@ class Hydjet2Analyzer : public edm::EDAnalyzer { edm::InputTag genParticleSrc_; edm::InputTag genHIsrc_; edm::InputTag simVerticesTag_; - edm::ESGetToken pdt_; - - edm::Service f; + edm::ESGetToken pdtToken_; //common TH1D *dhpt; @@ -272,7 +272,6 @@ class Hydjet2Analyzer : public edm::EDAnalyzer { }; Hydjet2Analyzer::Hydjet2Analyzer(const edm::ParameterSet &iConfig) { - pdt_ = esConsumes(); fBFileName = iConfig.getUntrackedParameter("output_b", "b_values.txt"); fNFileName = iConfig.getUntrackedParameter("output_n", "n_values.txt"); fMFileName = iConfig.getUntrackedParameter("output_m", "m_values.txt"); @@ -293,10 +292,12 @@ Hydjet2Analyzer::Hydjet2Analyzer(const edm::ParameterSet &iConfig) { genParticleSrc_ = iConfig.getUntrackedParameter("src", edm::InputTag("hiGenParticles")); genHIsrc_ = iConfig.getUntrackedParameter("src", edm::InputTag("heavyIon")); - doParticles_ = iConfig.getUntrackedParameter("doParticles", false); + if (useHepMCProduct_) + pdtToken_ = esConsumes(); + doTestEvent_ = iConfig.getUntrackedParameter("doTestEvent", false); + doParticles_ = iConfig.getUntrackedParameter("doParticles", false); doHistos_ = iConfig.getUntrackedParameter("doHistos", false); - if (doHistos_) { userHistos_ = iConfig.getUntrackedParameter("userHistos", false); if (userHistos_) { @@ -408,7 +409,6 @@ Hydjet2Analyzer::~Hydjet2Analyzer() {} // ------------ method called to for each event ------------ void Hydjet2Analyzer::analyze(const edm::Event &iEvent, const edm::EventSetup &iSetup) { - auto const &pdt = iSetup.getData(pdt_); using namespace edm; using namespace HepMC; hev_.event = iEvent.id().event(); @@ -435,7 +435,8 @@ void Hydjet2Analyzer::analyze(const edm::Event &iEvent, const edm::EventSetup &i int sig = -1; int src = -1; if (useHepMCProduct_) { - //_______________________________________________________________________________________ + edm::ESHandle pdt = iSetup.getHandle(pdtToken_); + if (doCF_) { Handle> cf; iEvent.getByToken(srcTmix_, cf); @@ -457,7 +458,7 @@ void Hydjet2Analyzer::analyze(const edm::Event &iEvent, const edm::EventSetup &i float eta = (*it)->momentum().eta(); float phi = (*it)->momentum().phi(); float pt = (*it)->momentum().perp(); - const ParticleData *part = pdt.particle(pdg_id); + const ParticleData *part = pdt->particle(pdg_id); int charge = static_cast(part->charge()); hev_.pt[hev_.mult] = pt; hev_.eta[hev_.mult] = eta; @@ -502,6 +503,10 @@ void Hydjet2Analyzer::analyze(const edm::Event &iEvent, const edm::EventSetup &i } src = evt->particles_size(); + if (doTestEvent_) { + std::cout << "Event size: " << src << std::endl; + mc->GetEvent()->print(); + } HepMC::GenEvent::particle_const_iterator begin = evt->particles_begin(); HepMC::GenEvent::particle_const_iterator end = evt->particles_end(); @@ -519,8 +524,8 @@ void Hydjet2Analyzer::analyze(const edm::Event &iEvent, const edm::EventSetup &i float e = (*it)->momentum().e(); float pseudoRapidity = (*it)->momentum().pseudoRapidity(); int charge = -1; - if ((pdt.particle(pdg_id))) { - part = pdt.particle(pdg_id); + if ((pdt->particle(pdg_id))) { + part = pdt->particle(pdg_id); charge = static_cast(part->charge()); } @@ -795,7 +800,6 @@ void Hydjet2Analyzer::analyze(const edm::Event &iEvent, const edm::EventSetup &i } } // ------------ method called once each job just before starting event loop ------------ -void Hydjet2Analyzer::beginRun(const edm::Run &, const edm::EventSetup &iSetup) {} void Hydjet2Analyzer::beginJob() { if (printLists_) { out_b.open(fBFileName.c_str()); @@ -944,6 +948,8 @@ void Hydjet2Analyzer::beginJob() { } if (doAnalysis_) { + usesResource(TFileService::kSharedResource); + edm::Service f; nt = f->make("nt", "Mixing Analysis", "mix:np:src:sig"); hydjetTree_ = f->make("hi", "Tree of Hydjet2 Events"); hydjetTree_->Branch("event", &hev_.event, "event/I"); diff --git a/GeneratorInterface/Hydjet2Interface/test/testHydjet.py b/GeneratorInterface/Hydjet2Interface/test/testHydjet.py index a3921092c083f..fd143187d0bd5 100644 --- a/GeneratorInterface/Hydjet2Interface/test/testHydjet.py +++ b/GeneratorInterface/Hydjet2Interface/test/testHydjet.py @@ -6,13 +6,14 @@ process.load("Configuration.StandardSequences.Services_cff") process.load("GeneratorInterface.Hydjet2Interface.hydjet2Default_cfi") -process.maxEvents = cms.untracked.PSet(input = cms.untracked.int32(100)) +process.maxEvents = cms.untracked.PSet(input = cms.untracked.int32(10)) process.ana = cms.EDAnalyzer('Hydjet2Analyzer', doHistos = cms.untracked.bool(True), userHistos = cms.untracked.bool(False), - #doAnalysis = cms.untracked.bool(True), + doAnalysis = cms.untracked.bool(False), + doTestEvent = cms.untracked.bool(False), # for debuging event output information ###Settings for USER histos @@ -58,6 +59,38 @@ #to separate hydro and jet parts of hydjet2 process.generator.separateHydjetComponents = cms.untracked.bool(True) +Debug = None + +if Debug: + process.load("FWCore.MessageLogger.MessageLogger_cfi") + + process.MessageLogger = cms.Service("MessageLogger", + + destinations = cms.untracked.vstring('LogDebug_Hydjet2'), + categories = cms.untracked.vstring( + 'Hydjet2', + 'Hydjet2_array' + ), + LogDebug_Hydjet2 = cms.untracked.PSet( + threshold = cms.untracked.string('DEBUG'), #Priority: DEBUG < INFO < WARNING < ERROR + DEBUG = cms.untracked.PSet(limit = cms.untracked.int32(-1)), + INFO = cms.untracked.PSet(limit = cms.untracked.int32(0)), + WARNING = cms.untracked.PSet(limit = cms.untracked.int32(0)), + ERROR = cms.untracked.PSet(limit = cms.untracked.int32(0)), + #Categores + Hydjet2 = cms.untracked.PSet( + limit = cms.untracked.int32(-1), # number of masseges + timespan = cms.untracked.int32(0) #time to resete limit counter in seconds + ), + + Hydjet2_array = cms.untracked.PSet( + limit = cms.untracked.int32(-1), # number of masseges + timespan = cms.untracked.int32(0) #time to resete limit counter in seconds + ) + + ), + debugModules = cms.untracked.vstring('*') + ) process.TFileService = cms.Service('TFileService', fileName = cms.string('Hydjet2_MB_5020GeV.root') diff --git a/GeneratorInterface/HydjetInterface/src/HydjetHadronizer.cc b/GeneratorInterface/HydjetInterface/src/HydjetHadronizer.cc index 0bdec1702a413..1d4e9d4da1b72 100644 --- a/GeneratorInterface/HydjetInterface/src/HydjetHadronizer.cc +++ b/GeneratorInterface/HydjetInterface/src/HydjetHadronizer.cc @@ -1,6 +1,6 @@ /** \brief Interface to the HYDJET generator (since core v. 1.9.1), produces HepMC events - \version 2.1 + \version 2.2 \authors Camelia Mironov, Andrey Belyaev */ @@ -284,23 +284,22 @@ bool HydjetHadronizer::generatePartonsAndHadronize() { nsub_++; // event information - HepMC::GenEvent* evt = new HepMC::GenEvent(); + std::unique_ptr evt = std::make_unique(); + std::unique_ptr HepMCEvt = std::make_unique(); if (nhard_ > 0 || nsoft_ > 0) - get_particles(evt); + get_particles(evt.get()); evt->set_signal_process_id(pypars.msti[0]); // type of the process evt->set_event_scale(pypars.pari[16]); // Q^2 - add_heavy_ion_rec(evt); + add_heavy_ion_rec(evt.get()); if (fVertex_) { // generate new vertex & apply the shift - // Copy the HepMC::GenEvent - std::unique_ptr HepMCEvt(new edm::HepMCProduct(evt)); - + HepMCEvt = std::make_unique(evt.get()); HepMCEvt->applyVtxGen(fVertex_); - evt = new HepMC::GenEvent((*HepMCEvt->GetEvent())); + evt = std::make_unique(*HepMCEvt->GetEvent()); } HepMC::HEPEVT_Wrapper::check_hepevt_consistency(); @@ -308,7 +307,7 @@ bool HydjetHadronizer::generatePartonsAndHadronize() { << " Entries number: " << HepMC::HEPEVT_Wrapper::number_entries() << " Max. entries " << HepMC::HEPEVT_Wrapper::max_number_entries() << std::endl; - event().reset(evt); + event() = std::move(evt); return true; } @@ -322,7 +321,7 @@ bool HydjetHadronizer::get_particles(HepMC::GenEvent* evt) { // The SubEvent information is kept by storing indeces of main vertices // of subevents as a vector in GenHIEvent. - LogDebug("SubEvent") << " Number of sub events " << nsub_; + LogDebug("Hydjet") << " Number of sub events " << nsub_; LogDebug("Hydjet") << " Number of hard events " << hyjpar.njet; LogDebug("Hydjet") << " Number of hard particles " << nhard_; LogDebug("Hydjet") << " Number of soft particles " << nsoft_; @@ -336,7 +335,7 @@ bool HydjetHadronizer::get_particles(HepMC::GenEvent* evt) { vector primary_particle(hyjets.nhj); vector particle(hyjets.nhj); - HepMC::GenVertex* sub_vertices = new HepMC::GenVertex(HepMC::FourVector(0, 0, 0, 0), 0); // just initialization + HepMC::GenVertex* sub_vertices = nullptr; // just initialization // contain the last index in for each subevent vector index(nsub_); @@ -367,15 +366,19 @@ bool HydjetHadronizer::get_particles(HepMC::GenEvent* evt) { if (hyjets.khj[2][ihy] == 0) { primary_particle[ihy] = build_hyjet(ihy, ihy + 1); - sub_vertices->add_particle_out(primary_particle[ihy]); + if (!sub_vertices) + LogError("Hydjet_array") << "##### HYDJET2: Vertex not initialized!"; + else + sub_vertices->add_particle_out(primary_particle[ihy]); LogDebug("Hydjet_array") << " ---> " << ihy + 1 << std::endl; } else { particle[ihy] = build_hyjet(ihy, ihy + 1); int mid = hyjets.khj[2][ihy] - hjoffset + index[isub]; int mid_t = mid; - while ((mid < ihy) && (hyjets.khj[1][mid] < 100) && (hyjets.khj[3][mid + 1] - hjoffset + index[isub] == ihy)) + while (((mid + 1) < ihy) && (std::abs(hyjets.khj[1][mid]) < 100) && + (hyjets.khj[3][mid + 1] - hjoffset + index[isub] <= ihy)) mid++; - if (hyjets.khj[1][mid] < 100) + if (std::abs(hyjets.khj[1][mid]) < 100) mid = mid_t; HepMC::GenParticle* mother = primary_particle.at(mid); @@ -401,7 +404,6 @@ bool HydjetHadronizer::get_particles(HepMC::GenEvent* evt) { } ihy++; } - delete sub_vertices; LogDebug("Hydjet_array") << " MULTin ev.:" << hyjets.nhj << ", last index: " << ihy - 1 << ", Sub events: " << isub + 1 << ", stable particles: " << stab << std::endl; diff --git a/GeneratorInterface/HydjetInterface/test/HydjetAnalyzer.cc b/GeneratorInterface/HydjetInterface/test/HydjetAnalyzer.cc index aa31eeb722444..bee9966052092 100644 --- a/GeneratorInterface/HydjetInterface/test/HydjetAnalyzer.cc +++ b/GeneratorInterface/HydjetInterface/test/HydjetAnalyzer.cc @@ -1,7 +1,7 @@ /** \class HydjetAnalyzer \brief HepMC events analyzer - \version 2.0 + \version 2.1 \authors Yetkin Yilmaz, Andrey Belyaev */ @@ -13,7 +13,7 @@ #include // user include files -#include "FWCore/Framework/interface/EDAnalyzer.h" +#include "FWCore/Framework/interface/one/EDAnalyzer.h" #include "FWCore/Framework/interface/Frameworkfwd.h" #include "FWCore/Framework/interface/Event.h" @@ -42,6 +42,7 @@ // root include file #include "TFile.h" #include "TNtuple.h" +#include "TH1.h" #include "FWCore/Framework/interface/ConsumesCollector.h" #include "FWCore/Framework/interface/EDProducer.h" @@ -49,12 +50,10 @@ using namespace edm; using namespace std; -static const int MAXPARTICLES = 5000000; -static const int ETABINS = 3; // Fix also in branch string -// -// class decleration -// - +namespace { + static const int MAXPARTICLES = 5000000; + static const int ETABINS = 3; // Fix also in branch string +} // namespace struct HydjetEvent { int event; float b; @@ -82,16 +81,15 @@ struct HydjetEvent { float vz; float vr; }; -class HydjetAnalyzer : public edm::EDAnalyzer { +class HydjetAnalyzer : public edm::one::EDAnalyzer { public: explicit HydjetAnalyzer(const edm::ParameterSet &); ~HydjetAnalyzer(); private: - virtual void beginRun(const edm::Run &, const edm::EventSetup &); - virtual void beginJob(); - virtual void analyze(const edm::Event &, const edm::EventSetup &); - virtual void endJob(); + void beginJob() final; + void analyze(const edm::Event &, const edm::EventSetup &) final; + void endJob() final; // ----------member data --------------------------- std::ofstream out_b; std::string fBFileName; @@ -155,13 +153,10 @@ class HydjetAnalyzer : public edm::EDAnalyzer { edm::EDGetTokenT srcT_; edm::EDGetTokenT> srcTmix_; - // edm::InputTag src_; edm::InputTag genParticleSrc_; edm::InputTag genHIsrc_; edm::InputTag simVerticesTag_; - edm::ESGetToken pdt_; - - edm::Service f; + edm::ESGetToken pdtToken_; //common TH1D *dhpt; @@ -274,20 +269,8 @@ class HydjetAnalyzer : public edm::EDAnalyzer { TH1D *uhv0etah_db; TH1D *uhv0etaj_db; }; -// -// constants, enums and typedefs -// - -// -// static data member definitions -// -// -// constructors and destructor -// HydjetAnalyzer::HydjetAnalyzer(const edm::ParameterSet &iConfig) { - //now do what ever initialization is needed - pdt_ = esConsumes(); fBFileName = iConfig.getUntrackedParameter("output_b", "b_values.txt"); fNFileName = iConfig.getUntrackedParameter("output_n", "n_values.txt"); fMFileName = iConfig.getUntrackedParameter("output_m", "m_values.txt"); @@ -306,13 +289,13 @@ HydjetAnalyzer::HydjetAnalyzer(const edm::ParameterSet &iConfig) { srcTmix_ = consumes>( iConfig.getUntrackedParameter("srcMix", edm::InputTag("mix", "generatorSmeared"))); - // src_ = iConfig.getUntrackedParameter("src", edm::InputTag("VtxSmeared")); genParticleSrc_ = iConfig.getUntrackedParameter("src", edm::InputTag("hiGenParticles")); genHIsrc_ = iConfig.getUntrackedParameter("src", edm::InputTag("heavyIon")); - doParticles_ = iConfig.getUntrackedParameter("doParticles", false); + if (useHepMCProduct_) + pdtToken_ = esConsumes(); + doParticles_ = iConfig.getUntrackedParameter("doParticles", false); doHistos_ = iConfig.getUntrackedParameter("doHistos", false); - if (doHistos_) { userHistos_ = iConfig.getUntrackedParameter("userHistos", false); if (userHistos_) { @@ -417,21 +400,13 @@ HydjetAnalyzer::HydjetAnalyzer(const edm::ParameterSet &iConfig) { v2etaBins[k] = minV2eta + k * ((maxV2eta - minV2eta) / nintV2eta); } } - } //user histo } //do histo } -HydjetAnalyzer::~HydjetAnalyzer() { - // do anything here that needs to be done at desctruction time - // (e.g. close files, deallocate resources etc.) -} +HydjetAnalyzer::~HydjetAnalyzer() {} -// -// member functions -// // ------------ method called to for each event ------------ void HydjetAnalyzer::analyze(const edm::Event &iEvent, const edm::EventSetup &iSetup) { - auto const &pdt = iSetup.getData(pdt_); using namespace edm; using namespace HepMC; hev_.event = iEvent.id().event(); @@ -458,7 +433,8 @@ void HydjetAnalyzer::analyze(const edm::Event &iEvent, const edm::EventSetup &iS int sig = -1; int src = -1; if (useHepMCProduct_) { - //_______________________________________________________________________________________ + edm::ESHandle pdt = iSetup.getHandle(pdtToken_); + if (doCF_) { Handle> cf; iEvent.getByToken(srcTmix_, cf); @@ -480,7 +456,7 @@ void HydjetAnalyzer::analyze(const edm::Event &iEvent, const edm::EventSetup &iS float eta = (*it)->momentum().eta(); float phi = (*it)->momentum().phi(); float pt = (*it)->momentum().perp(); - const ParticleData *part = pdt.particle(pdg_id); + const ParticleData *part = pdt->particle(pdg_id); int charge = static_cast(part->charge()); hev_.pt[hev_.mult] = pt; hev_.eta[hev_.mult] = eta; @@ -506,7 +482,6 @@ void HydjetAnalyzer::analyze(const edm::Event &iEvent, const edm::EventSetup &iS } else { //not mixing Handle mc; iEvent.getByToken(srcT_, mc); - // iEvent.getByLabel(src_, mc); evt = mc->GetEvent(); scale = evt->event_scale(); const HeavyIon *hi = evt->heavy_ion(); @@ -517,7 +492,8 @@ void HydjetAnalyzer::analyze(const edm::Event &iEvent, const edm::EventSetup &iS ncoll = hi->Ncoll(); nhard = hi->Ncoll_hard(); phi0 = hi->event_plane_angle(); - phi3 = 0.; // No HepMC entry for Psi3 exist, but in private code it's possible to use hi->eccentricity(); + phi3 = + hi->eccentricity(); // 0.; // No HepMC entry for Psi3 exist, but in private code it's possible to use hi->eccentricity(); if (printLists_) { out_b << b << endl; out_n << npart << endl; @@ -542,8 +518,8 @@ void HydjetAnalyzer::analyze(const edm::Event &iEvent, const edm::EventSetup &iS float e = (*it)->momentum().e(); float pseudoRapidity = (*it)->momentum().pseudoRapidity(); int charge = -1; - if ((pdt.particle(pdg_id))) { - part = pdt.particle(pdg_id); + if ((pdt->particle(pdg_id))) { + part = pdt->particle(pdg_id); charge = static_cast(part->charge()); } @@ -818,7 +794,6 @@ void HydjetAnalyzer::analyze(const edm::Event &iEvent, const edm::EventSetup &iS } } // ------------ method called once each job just before starting event loop ------------ -void HydjetAnalyzer::beginRun(const edm::Run &, const edm::EventSetup &iSetup) {} void HydjetAnalyzer::beginJob() { if (printLists_) { out_b.open(fBFileName.c_str()); @@ -967,6 +942,8 @@ void HydjetAnalyzer::beginJob() { } if (doAnalysis_) { + usesResource(TFileService::kSharedResource); + edm::Service f; nt = f->make("nt", "Mixing Analysis", "mix:np:src:sig"); hydjetTree_ = f->make("hi", "Tree of Hydjet Events"); hydjetTree_->Branch("event", &hev_.event, "event/I"); diff --git a/GeneratorInterface/PyquenInterface/test/PyquenAnalyzer.h b/GeneratorInterface/PyquenInterface/test/PyquenAnalyzer.h index b942887458fc5..03383b12aa343 100644 --- a/GeneratorInterface/PyquenInterface/test/PyquenAnalyzer.h +++ b/GeneratorInterface/PyquenInterface/test/PyquenAnalyzer.h @@ -2,26 +2,26 @@ #ifndef PyquenAnalyzer_H #define PyquenAnalyzer_H -#include "FWCore/Framework/interface/EDAnalyzer.h" +#include "FWCore/Framework/interface/one/EDAnalyzer.h" #include "SimDataFormats/GeneratorProducts/interface/HepMCProduct.h" #include "FWCore/Utilities/interface/EDGetToken.h" -#include "FWCore/Framework/interface/EDProducer.h" +//#include "FWCore/Framework/interface/EDProducer.h" #include "FWCore/Framework/interface/ConsumesCollector.h" // forward declarations class TFile; class TH1D; -class PyquenAnalyzer : public edm::EDAnalyzer { //analyzer module to analyze pythia events +class PyquenAnalyzer : public edm::one::EDAnalyzer<> { //analyzer module to analyze pythia events public: explicit PyquenAnalyzer(const edm::ParameterSet&); virtual ~PyquenAnalyzer() {} - virtual void analyze(const edm::Event&, const edm::EventSetup&); - virtual void beginJob(); - virtual void endJob(); + void analyze(const edm::Event&, const edm::EventSetup&) final; + void beginJob() final; + void endJob() final; edm::EDGetTokenT srcT_;