104 geometry_(iConfig.getParameter<edm::
ParameterSet>(
"trackerDefinition"), consumesCollector()),
105 caloGeometry_(iConfig.getParameter<edm::
ParameterSet>(
"caloDefinition"), consumesCollector()),
106 beamPipeRadius_(iConfig.getParameter<double>(
"beamPipeRadius")),
107 deltaRchargedMother_(iConfig.getParameter<double>(
"deltaRchargedMother")),
108 particleFilter_(iConfig.getParameter<edm::
ParameterSet>(
"particleFilter")),
109 _randomEngine(nullptr),
110 simulateCalorimetry(iConfig.getParameter<bool>(
"simulateCalorimetry")),
111 simulateMuons(iConfig.getParameter<bool>(
"simulateMuons")),
127 std::unique_ptr<fastsim::InteractionModel> interactionModel(
129 if (!interactionModel.get()) {
130 throw cms::Exception(
"FastSimProducer") <<
"InteractionModel " << modelName <<
" could not be created";
144 std::make_unique<CalorimetryManager>(
nullptr,
149 consumesCollector());
157 produces<edm::SimTrackContainer>();
158 produces<edm::SimVertexContainer>();
161 interactionModel->registerProducts(producesCollector());
163 produces<edm::PCaloHitContainer>(
"EcalHitsEB");
164 produces<edm::PCaloHitContainer>(
"EcalHitsEE");
165 produces<edm::PCaloHitContainer>(
"EcalHitsES");
166 produces<edm::PCaloHitContainer>(
"HcalHits");
167 produces<edm::SimTrackContainer>(
"MuonSimTracks");
208 myCalorimetry->getCalorimeter()->setupTopology(theCaloTopology);
211 myCalorimetry->getHFShowerLibrary()->initHFShowerLibrary(iSetup);
219 std::vector<FSimTrack> myFSimTracks;
222 <<
"\n###############################";
225 for (std::unique_ptr<fastsim::Particle> particle = particleManager.nextParticle(*
_randomEngine); particle !=
nullptr;
236 if (particle->position().Perp2() < 128. * 128. &&
std::abs(particle->position().Z()) < 302.) {
252 particle->resetOnLayer();
257 if (particle->position().T() > 25) {
260 particle->resetOnLayer();
266 if (layer->
getThickness(particle->position(), particle->momentum()) > 1E-10) {
267 int nSecondaries = 0;
271 std::vector<std::unique_ptr<fastsim::Particle> > secondaries;
272 interactionModel->interact(*particle, *layer, secondaries, *
_randomEngine);
273 nSecondaries += secondaries.size();
274 particleManager.addSecondaries(particle->position(), particle->simTrackIndex(), secondaries,
layer);
278 if (!particleFilter_.acceptsEn(*particle)) {
280 if (nSecondaries == 0)
281 particleManager.addEndVertex(particle.get());
288 <<
"\n-------------------------------";
292 if (!particle->isStable() && particle->remainingProperLifeTimeC() < 1E-10) {
294 std::vector<std::unique_ptr<fastsim::Particle> > secondaries;
297 particleManager.addSecondaries(particle->position(), particle->simTrackIndex(), secondaries);
302 <<
"\n###############################";
312 if (particle->position().Perp2() >= 128. * 128. ||
std::abs(particle->position().Z()) >= 302.) {
316 myFSimTracks.push_back(
createFSimTrack(particle.get(), &particleManager, pdt));
318 if (!particle->isStable() && particle->remainingProperLifeTimeC() < 1E-10) {
323 <<
"\n###############################";
331 <<
"\n###############################";
339 interactionModel->storeProducts(iEvent);
346 for (
auto myFSimTrack : myFSimTracks) {
403 if (particle->
position().T() > 50) {
418 if (!myFSimTrack.
onEcal()) {
422 if (!myFSimTrack.
onHcal()) {
473 if (!myFSimTrack.
onEcal()) {
474 myFSimTrack.
setEcal(PP, success);
479 if (!myFSimTrack.
onHcal()) {
480 myFSimTrack.
setHcal(PP, success);
498 <<
"\n-------------------------------";
506 std::vector<std::unique_ptr<fastsim::Particle> > secondaries;
void beginStream(edm::StreamID id) override
std::vector< std::unique_ptr< fastsim::InteractionModel > > interactionModels_
All defined interaction models.
edm::ESWatcher< CaloGeometryRecord > watchCaloGeometry_
void update(const edm::EventSetup &iSetup, const std::map< std::string, InteractionModel * > &interactionModelMap)
Initializes the tracker geometry.
std::vector< PCaloHit > PCaloHitContainer
OrphanHandle< PROD > put(std::unique_ptr< PROD > product)
Put a new product.
fastsim::Geometry caloGeometry_
Hack to interface "old" calo to "new" tracking.
std::unique_ptr< RandomEngineAndDistribution > _randomEngine
The random engine.
The core class of the new SimplifiedGeometryPropagator.
Implementation of a generic detector layer (base class for forward/barrel layers).
const math::XYZTLorentzVector & position() const
Return position of the particle.
virtual const double getThickness(const math::XYZTLorentzVector &position) const =0
Return thickness of the layer at a given position.
Handles/tracks (possible) intersections of particle's trajectory and tracker layers.
uint16_t *__restrict__ id
Manages GenParticles and Secondaries from interactions.
double deltaRchargedMother_
Cut on deltaR for ClosestChargedDaughter algorithm (FastSim tracking)
HepPDT::ParticleDataTable ParticleDataTable
bool getByToken(EDGetToken token, Handle< PROD > &result) const
#define DEFINE_FWK_MODULE(type)
fastsim::Geometry geometry_
The definition of the tracker according to python config.
double remainingProperLifeTimeC() const
Return the particle's remaining proper lifetime[in ct].
int genParticleIndex() const
Return index of the particle in the genParticle vector.
edm::EDGetTokenT< edm::HepMCProduct > genParticlesToken_
Token to get the genParticles.
void setEcal(const RawParticle &pp, int success)
Set the ecal variables.
fastsim::Decayer decayer_
Handles decays of non-stable particles using pythia.
void setGlobal()
particle did not decay before more detectors (useful for newProducer)
virtual FSimTrack createFSimTrack(fastsim::Particle *particle, fastsim::ParticleManager *particleManager, HepPDT::ParticleDataTable const &particleTable)
void setLayer2(const RawParticle &pp, int success)
Set the preshower layer2 variables.
int pdgId() const
Return pdgId of the particle.
bool moveParticleToNextLayer(Particle &particle, const SimplifiedGeometry *&layer)
Move particle along its trajectory to the next intersection with any of the tracker layers...
const SimVertex getSimVertex(unsigned i)
Returns the position of a given SimVertex. Needed for interfacing the code with the old calorimetry...
constexpr std::array< uint8_t, layerIndexSize > layer
const SimTrack getSimTrack(unsigned i)
Returns a given SimTrack. Needed for interfacing the code with the old calorimetry.
RawParticle makeParticle(HepPDT::ParticleDataTable const *, int id, const math::XYZTLorentzVector &p)
bool getData(T &iHolder) const
XYZTLorentzVectorD XYZTLorentzVector
Lorentz vector with cylindrical internal representation using pseudorapidity.
Base class for any interaction model between a particle and a tracker layer.
int simVertexIndex() const
Return index of the origin vertex.
~FastSimProducer() override
const edm::ESGetToken< HepPDT::ParticleDataTable, edm::DefaultRecord > particleDataTableESToken_
void setLayer1(const RawParticle &pp, int success)
Set the preshower layer1 variables.
edm::ESGetToken< CaloGeometry, CaloGeometryRecord > caloGeometryESToken_
CaloType getCaloType() const
Hack to interface "old" Calorimetry with "new" Tracker.
Abs< T >::type abs(const T &t)
void addSecondaries(const math::XYZTLorentzVector &vertexPosition, int motherSimTrackId, std::vector< std::unique_ptr< Particle > > &secondaries, const SimplifiedGeometry *layer=nullptr)
Adds secondaries that are produced by any of the interactions (or particle decay) to the buffer...
double beamPipeRadius_
The radius of the beampipe.
std::vector< std::string > getParameterNames() const
void decay(const Particle &particle, std::vector< std::unique_ptr< Particle > > &secondaries, CLHEP::HepRandomEngine &engine) const
Decay particle using pythia.
int simTrackIndex() const
Return index of the SimTrack.
void produce(edm::Event &, const edm::EventSetup &) override
edm::ESWatcher< CaloTopologyRecord > watchCaloTopology_
const std::vector< InteractionModel * > & getInteractionModels() const
Return the vector of all interaction models that are assigned with a layer.
virtual bool isForward() const =0
Returns false/true depending if the object is a (non-abstract) barrel/forward layer.
double charge() const
Return charge of the particle.
edm::ESGetToken< CaloTopology, CaloTopologyRecord > caloTopologyESToken_
std::vector< SimVertex > SimVertexContainer
T getParameter(std::string const &) const
FastSimProducer(const edm::ParameterSet &)
Definition the tracker geometry (vectors of forward/barrel layers).
std::map< std::string, fastsim::InteractionModel * > interactionModelMap_
Each interaction model has a unique name.
static const std::string MESSAGECATEGORY
Category of debugging messages ("FastSimulation")
std::unique_ptr< CalorimetryManager > myCalorimetry
bool check(const edm::EventSetup &iSetup)
Implementation of non-stable particle decays.
bool isStable() const
Returns true if particle is considered stable.
void setVFcal(const RawParticle &pp, int success)
Set the hcal variables.
const math::XYZTLorentzVector & momentum() const
Return momentum of the particle.
(Kinematic) cuts on the particles that are propagated.
void setHcal(const RawParticle &pp, int success)
Set the hcal variables.
Definition of a generic FastSim Particle which can be propagated through the detector (formerly Parti...
void endStream() override
std::vector< SimTrack > SimTrackContainer
double getMagneticFieldZ(const math::XYZTLorentzVector &position) const
Initializes the tracker geometry.
fastsim::ParticleFilter particleFilter_
Decides which particles have to be propagated.