Skip to content

Commit

Permalink
Provide test beam simulation with beam spread
Browse files Browse the repository at this point in the history
  • Loading branch information
Sunanda committed Sep 24, 2016
1 parent 8b82e97 commit 48ca91f
Show file tree
Hide file tree
Showing 4 changed files with 166 additions and 8 deletions.
29 changes: 29 additions & 0 deletions IOMC/ParticleGuns/interface/GaussRandomPThetaGunProducer.h
@@ -0,0 +1,29 @@
#ifndef GaussRandomPThetaGunProducer_H
#define GaussRandomPThetaGunProducer_H

#include "IOMC/ParticleGuns/interface/FlatBaseThetaGunProducer.h"

namespace edm {

class GaussRandomPThetaGunProducer : public FlatBaseThetaGunProducer {

public:
GaussRandomPThetaGunProducer(const ParameterSet &);
virtual ~GaussRandomPThetaGunProducer();

private:

virtual void produce(Event &e, const EventSetup& es) override;

protected :

// data members

double fMeanP ;
double fSigmaP ;
double fMeanTheta ;
double fSigmaTheta;
};
}

#endif
122 changes: 122 additions & 0 deletions IOMC/ParticleGuns/src/GaussRandomPThetaGunProducer.cc
@@ -0,0 +1,122 @@
#include <ostream>

#include "IOMC/ParticleGuns/interface/GaussRandomPThetaGunProducer.h"

#include "SimDataFormats/GeneratorProducts/interface/HepMCProduct.h"
#include "SimDataFormats/GeneratorProducts/interface/GenEventInfoProduct.h"

#include "FWCore/Framework/interface/Event.h"
#include "FWCore/ParameterSet/interface/ParameterSet.h"
#include "FWCore/MessageLogger/interface/MessageLogger.h"
#include "FWCore/ServiceRegistry/interface/Service.h"
#include "FWCore/Utilities/interface/RandomNumberGenerator.h"

#include "CLHEP/Random/RandGaussQ.h"
#include "CLHEP/Random/RandFlat.h"

//#define DebugLog

namespace CLHEP {
class HepRandomEngine;
}

using namespace edm;

GaussRandomPThetaGunProducer::GaussRandomPThetaGunProducer(const edm::ParameterSet& pset) : FlatBaseThetaGunProducer(pset) {

edm::ParameterSet defpset ;
edm::ParameterSet pgun_params =
pset.getParameter<edm::ParameterSet>("PGunParameters") ;

// doesn't seem necessary to check if pset is empty - if this
// is the case, default values will be taken for params
fMeanP = pgun_params.getParameter<double>("MeanP");
fSigmaP = pgun_params.getParameter<double>("SigmaP");
fMeanTheta = 0.5 * (fMinTheta + fMaxTheta);
fSigmaTheta = 0.5 * (fMaxTheta - fMinTheta);

produces<HepMCProduct>("unsmeared");
produces<GenEventInfoProduct>();
}

GaussRandomPThetaGunProducer::~GaussRandomPThetaGunProducer() {}

void GaussRandomPThetaGunProducer::produce(edm::Event & e, const edm::EventSetup& es) {
#ifdef DebugLog
if ( fVerbosity >= 0 )
std::cout << "GaussRandomPThetaGunProducer : Begin New Event Generation\n";
#endif
edm::Service<edm::RandomNumberGenerator> rng;
CLHEP::HepRandomEngine* engine = &rng->getEngine(e.streamID());

// event loop (well, another step in it...)

// no need to clean up GenEvent memory - done in HepMCProduct

// here re-create fEvt (memory)
//
fEvt = new HepMC::GenEvent() ;

// now actualy, cook up the event from PDGTable and gun parameters
//

// 1st, primary vertex
//
HepMC::GenVertex* Vtx = new HepMC::GenVertex( HepMC::FourVector(0.,0.,0.));

// loop over particles
//
int barcode = 1;
for (unsigned int ip=0; ip<fPartIDs.size(); ip++) {
double mom = CLHEP::RandGaussQ::shoot(engine, fMeanP, fSigmaP);
double theta = CLHEP::RandGaussQ::shoot(engine, fMeanTheta, fSigmaTheta);
double phi = CLHEP::RandFlat::shoot(engine, fMinPhi, fMaxPhi);
int PartID = fPartIDs[ip] ;
const HepPDT::ParticleData*
PData = fPDGTable->particle(HepPDT::ParticleID(abs(PartID))) ;
double mass = PData->mass().value() ;
double energy = sqrt(mom*mom + mass*mass) ;
double px = mom*sin(theta)*cos(phi) ;
double py = mom*sin(theta)*sin(phi) ;
double pz = mom*cos(theta) ;

HepMC::FourVector p(px,py,pz,energy) ;
HepMC::GenParticle* Part = new HepMC::GenParticle(p,PartID,1);
Part->suggest_barcode( barcode ) ;
barcode++ ;
Vtx->add_particle_out(Part);

if ( fAddAntiParticle ) {
HepMC::FourVector ap(-px,-py,-pz,energy) ;
int APartID = -PartID ;
if ( PartID == 22 || PartID == 23 ) {
APartID = PartID ;
}
HepMC::GenParticle* APart = new HepMC::GenParticle(ap,APartID,1);
APart->suggest_barcode( barcode ) ;
barcode++ ;
Vtx->add_particle_out(APart) ;
}

}
fEvt->add_vertex(Vtx) ;
fEvt->set_event_number(e.id().event()) ;
fEvt->set_signal_process_id(20) ;


#ifdef DebugLog
if ( fVerbosity >= 0 ) fEvt->print() ;
#endif

std::unique_ptr<HepMCProduct> BProduct(new HepMCProduct()) ;
BProduct->addHepMCData( fEvt );
e.put(std::move(BProduct), "unsmeared");

std::unique_ptr<GenEventInfoProduct> genEventInfo(new GenEventInfoProduct(fEvt));
e.put(std::move(genEventInfo));

#ifdef DebugLog
if ( fVerbosity >= 0 )
std::cout << "GaussRandomPThetaGunProducer : Event Generation Done\n";
#endif
}
3 changes: 3 additions & 0 deletions IOMC/ParticleGuns/src/SealModule.cc
Expand Up @@ -14,6 +14,7 @@
#include "IOMC/ParticleGuns/interface/FlatRandomOneOverPtGunProducer.h"
#include "IOMC/ParticleGuns/interface/ExpoRandomPtGunProducer.h"
#include "IOMC/ParticleGuns/interface/ExpoRandomPGunProducer.h"
#include "IOMC/ParticleGuns/interface/GaussRandomPThetaGunProducer.h"
#include "IOMC/ParticleGuns/interface/MultiParticleInConeGunProducer.h"
#include "IOMC/ParticleGuns/interface/RandomtXiGunProducer.h"

Expand Down Expand Up @@ -45,6 +46,8 @@ using edm::ExpoRandomPtGunProducer;
DEFINE_FWK_MODULE(ExpoRandomPtGunProducer);
using edm::ExpoRandomPGunProducer;
DEFINE_FWK_MODULE(ExpoRandomPGunProducer);
using edm::GaussRandomPThetaGunProducer;
DEFINE_FWK_MODULE(GaussRandomPThetaGunProducer);
using edm::MultiParticleInConeGunProducer;
DEFINE_FWK_MODULE(MultiParticleInConeGunProducer);
using edm::RandomtXiGunProducer;
Expand Down
20 changes: 12 additions & 8 deletions SimG4CMS/HGCalTestBeam/test/HGCalTBGenSim_cfg.py
Expand Up @@ -7,7 +7,7 @@
process.load('SimGeneral.HepPDTESSource.pythiapdt_cfi')
process.load('Configuration.EventContent.EventContent_cff')
process.load('SimGeneral.MixingModule.mixNoPU_cfi')
process.load('SimG4CMS.HGCalTestBeam.HGCalTB160XML_cfi')
process.load('SimG4CMS.HGCalTestBeam.HGCalTB160Module16XML_cfi')
process.load('Geometry.HGCalCommonData.hgcalNumberingInitialization_cfi')
process.load('Geometry.HGCalCommonData.hgcalParametersInitialization_cfi')
process.load('Configuration.StandardSequences.MagneticField_0T_cff')
Expand Down Expand Up @@ -45,7 +45,7 @@

# Production Info
process.configurationMetadata = cms.untracked.PSet(
annotation = cms.untracked.string('SingleElectronE1000_cfi nevts:10'),
annotation = cms.untracked.string('SingleElectronE4_cfi'),
name = cms.untracked.string('Applications'),
version = cms.untracked.string('$Revision: 1.19 $')
)
Expand Down Expand Up @@ -76,22 +76,26 @@
from Configuration.AlCa.GlobalTag import GlobalTag
process.GlobalTag = GlobalTag(process.GlobalTag, 'auto:run2_mc', '')

process.generator = cms.EDProducer("FlatRandomEThetaGunProducer",
process.generator = cms.EDProducer("GaussRandomPThetaGunProducer",
AddAntiParticle = cms.bool(False),
PGunParameters = cms.PSet(
MinE = cms.double(99.99),
MaxE = cms.double(100.01),
MeanP = cms.double(4.0),
SigmaP = cms.double(0.108),
MinTheta = cms.double(0.0),
MaxTheta = cms.double(0.0),
MinPhi = cms.double(-3.14159265359),
MaxPhi = cms.double(3.14159265359),
PartID = cms.vint32(13)
PartID = cms.vint32(11)
),
Verbosity = cms.untracked.int32(0),
firstRun = cms.untracked.uint32(1),
psethack = cms.string('single muon E 100')
psethack = cms.string('single electron E 4')
)
process.VtxSmeared.MeanZ = -499.90
process.VtxSmeared.MeanX = 0.0
process.VtxSmeared.SigmaX = 0.55
process.VtxSmeared.MeanY = 0.0
process.VtxSmeared.SigmaY = 0.65
process.VtxSmeared.MeanZ = -499.90
process.VtxSmeared.SigmaZ = 0
process.HGCalTBAnalyzer.DoDigis = False
process.HGCalTBAnalyzer.DoRecHits = False
Expand Down

0 comments on commit 48ca91f

Please sign in to comment.