CMS 3D CMS Logo

List of all members | Public Member Functions | Private Member Functions | Private Attributes | Static Private Attributes
FastSimProducer Class Reference

The core class of the new SimplifiedGeometryPropagator. More...

Inheritance diagram for FastSimProducer:
edm::stream::EDProducer<>

Public Member Functions

 FastSimProducer (const edm::ParameterSet &)
 
 ~FastSimProducer () override
 
- Public Member Functions inherited from edm::stream::EDProducer<>
 EDProducer ()=default
 
bool hasAbilityToProduceInLumis () const final
 
bool hasAbilityToProduceInRuns () const final
 

Private Member Functions

void beginStream (edm::StreamID id) override
 
virtual FSimTrack createFSimTrack (fastsim::Particle *particle, fastsim::ParticleManager *particleManager, HepPDT::ParticleDataTable const &particleTable)
 
void endStream () override
 
void produce (edm::Event &, const edm::EventSetup &) override
 

Private Attributes

std::unique_ptr< RandomEngineAndDistribution_randomEngine
 The random engine. More...
 
double beamPipeRadius_
 The radius of the beampipe. More...
 
fastsim::Geometry caloGeometry_
 Hack to interface "old" calo to "new" tracking. More...
 
fastsim::Decayer decayer_
 Handles decays of non-stable particles using pythia. More...
 
double deltaRchargedMother_
 Cut on deltaR for ClosestChargedDaughter algorithm (FastSim tracking) More...
 
bool fixLongLivedBug_
 
edm::EDGetTokenT< edm::HepMCProductgenParticlesToken_
 Token to get the genParticles. More...
 
fastsim::Geometry geometry_
 The definition of the tracker according to python config. More...
 
std::map< std::string, fastsim::InteractionModel * > interactionModelMap_
 Each interaction model has a unique name. More...
 
std::vector< std::unique_ptr< fastsim::InteractionModel > > interactionModels_
 All defined interaction models. More...
 
std::unique_ptr< CalorimetryManagermyCalorimetry
 
fastsim::ParticleFilter particleFilter_
 Decides which particles have to be propagated. More...
 
bool simulateCalorimetry
 
bool simulateMuons
 
bool useFastSimsDecayer_
 
edm::ESWatcher< CaloGeometryRecordwatchCaloGeometry_
 
edm::ESWatcher< CaloTopologyRecordwatchCaloTopology_
 

Static Private Attributes

static const std::string MESSAGECATEGORY = "FastSimulation"
 Category of debugging messages ("FastSimulation") More...
 

Additional Inherited Members

- Public Types inherited from edm::stream::EDProducer<>
typedef CacheContexts< T... > CacheTypes
 
typedef CacheTypes::GlobalCache GlobalCache
 
typedef AbilityChecker< T... > HasAbility
 
typedef CacheTypes::LuminosityBlockCache LuminosityBlockCache
 
typedef LuminosityBlockContextT< LuminosityBlockCache, RunCache, GlobalCacheLuminosityBlockContext
 
typedef CacheTypes::LuminosityBlockSummaryCache LuminosityBlockSummaryCache
 
typedef CacheTypes::RunCache RunCache
 
typedef RunContextT< RunCache, GlobalCacheRunContext
 
typedef CacheTypes::RunSummaryCache RunSummaryCache
 

Detailed Description

The core class of the new SimplifiedGeometryPropagator.

Coordinates the propagation of all particles, this means it does the following loop: 1) Get particle from ParticleManager 2) Call LayerNavigator to move particle to next intersection with layer 3) Loop over all the interactions and add secondaries to the event 4) Repeat steps 2), 3) until particle left the tracker, lost all its energy or is about to decay 5) If particle is about to decay: do decay and add secondaries to the event 6) Restart from 1) with the next particle 7) If last particle was propagated add SimTracks, SimVertices, SimHits,... to the event

Definition at line 64 of file FastSimProducer.cc.

Constructor & Destructor Documentation

FastSimProducer::FastSimProducer ( const edm::ParameterSet iConfig)
explicit

Definition at line 102 of file FastSimProducer.cc.

References beamerCreator::create(), Exception, reco::get(), edm::ParameterSet::getParameter(), edm::ParameterSet::getParameterNames(), interactionModelMap_, interactionModels_, ecalBarrelClusterFastTimer_cfi::modelName, eostools::move(), myCalorimetry, simulateCalorimetry, and AlCaHLTBitMon_QueryRunRegistry::string.

103  : genParticlesToken_(consumes<edm::HepMCProduct>(iConfig.getParameter<edm::InputTag>("src"))),
104  geometry_(iConfig.getParameter<edm::ParameterSet>("trackerDefinition")),
105  caloGeometry_(iConfig.getParameter<edm::ParameterSet>("caloDefinition")),
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")),
112  fixLongLivedBug_(iConfig.getParameter<bool>("fixLongLivedBug")),
113  useFastSimsDecayer_(iConfig.getParameter<bool>("useFastSimsDecayer")) {
114  //----------------
115  // define interaction models
116  //---------------
117 
118  const edm::ParameterSet& modelCfgs = iConfig.getParameter<edm::ParameterSet>("interactionModels");
119  for (const std::string& modelName : modelCfgs.getParameterNames()) {
120  const edm::ParameterSet& modelCfg = modelCfgs.getParameter<edm::ParameterSet>(modelName);
121  std::string modelClassName(modelCfg.getParameter<std::string>("className"));
122  // Use plugin-factory to create model
123  std::unique_ptr<fastsim::InteractionModel> interactionModel(
124  fastsim::InteractionModelFactory::get()->create(modelClassName, modelName, modelCfg));
125  if (!interactionModel.get()) {
126  throw cms::Exception("FastSimProducer") << "InteractionModel " << modelName << " could not be created";
127  }
128  // Add model to list
129  interactionModels_.push_back(std::move(interactionModel));
130  // and create the map
132  }
133 
134  //----------------
135  // calorimetry
136  //---------------
137 
138  if (simulateCalorimetry) {
139  myCalorimetry.reset(new CalorimetryManager(nullptr,
140  iConfig.getParameter<edm::ParameterSet>("Calorimetry"),
141  iConfig.getParameter<edm::ParameterSet>("MaterialEffectsForMuonsInECAL"),
142  iConfig.getParameter<edm::ParameterSet>("MaterialEffectsForMuonsInHCAL"),
143  iConfig.getParameter<edm::ParameterSet>("GFlash")));
144  }
145 
146  //----------------
147  // register products
148  //----------------
149 
150  // SimTracks and SimVertices
151  produces<edm::SimTrackContainer>();
152  produces<edm::SimVertexContainer>();
153  // products of interaction models, i.e. simHits
154  for (auto& interactionModel : interactionModels_) {
155  interactionModel->registerProducts(*this);
156  }
157  produces<edm::PCaloHitContainer>("EcalHitsEB");
158  produces<edm::PCaloHitContainer>("EcalHitsEE");
159  produces<edm::PCaloHitContainer>("EcalHitsES");
160  produces<edm::PCaloHitContainer>("HcalHits");
161  produces<edm::SimTrackContainer>("MuonSimTracks");
162 }
std::vector< std::unique_ptr< fastsim::InteractionModel > > interactionModels_
All defined interaction models.
T getParameter(std::string const &) const
fastsim::Geometry caloGeometry_
Hack to interface "old" calo to "new" tracking.
std::unique_ptr< RandomEngineAndDistribution > _randomEngine
The random engine.
double deltaRchargedMother_
Cut on deltaR for ClosestChargedDaughter algorithm (FastSim tracking)
def create(alignables, pedeDump, additionalData, outputFile, config)
fastsim::Geometry geometry_
The definition of the tracker according to python config.
edm::EDGetTokenT< edm::HepMCProduct > genParticlesToken_
Token to get the genParticles.
double beamPipeRadius_
The radius of the beampipe.
std::vector< std::string > getParameterNames() const
std::map< std::string, fastsim::InteractionModel * > interactionModelMap_
Each interaction model has a unique name.
std::unique_ptr< CalorimetryManager > myCalorimetry
fastsim::ParticleFilter particleFilter_
Decides which particles have to be propagated.
def move(src, dest)
Definition: eostools.py:511
T get(const Candidate &c)
Definition: component.h:55
FastSimProducer::~FastSimProducer ( )
inlineoverride

Definition at line 67 of file FastSimProducer.cc.

References beginStream(), createFSimTrack(), endStream(), and produce().

67 { ; }

Member Function Documentation

void FastSimProducer::beginStream ( edm::StreamID  id)
overrideprivate

Definition at line 164 of file FastSimProducer.cc.

References _randomEngine, and triggerObjects_cff::id.

Referenced by ~FastSimProducer().

164  {
165  _randomEngine = std::make_unique<RandomEngineAndDistribution>(id);
166 }
std::unique_ptr< RandomEngineAndDistribution > _randomEngine
The random engine.
FSimTrack FastSimProducer::createFSimTrack ( fastsim::Particle particle,
fastsim::ParticleManager particleManager,
HepPDT::ParticleDataTable const &  particleTable 
)
privatevirtual

Definition at line 378 of file FastSimProducer.cc.

References _randomEngine, fastsim::ParticleManager::addSecondaries(), caloGeometry_, fastsim::Particle::charge(), fastsim::Decayer::decay(), decayer_, DEFINE_FWK_MODULE, fastsim::SimplifiedGeometry::ECAL, fastsim::Particle::genParticleIndex(), fastsim::SimplifiedGeometry::getCaloType(), fastsim::ParticleManager::getSimTrack(), fastsim::ParticleManager::getSimVertex(), fastsim::SimplifiedGeometry::getThickness(), fastsim::SimplifiedGeometry::HCAL, fastsim::SimplifiedGeometry::isForward(), fastsim::Particle::isStable(), LogDebug, makeParticle(), MESSAGECATEGORY, fastsim::Particle::momentum(), fastsim::LayerNavigator::moveParticleToNextLayer(), FSimTrack::onEcal(), FSimTrack::onHcal(), FSimTrack::onLayer1(), FSimTrack::onLayer2(), FSimTrack::onVFcal(), fastsim::Particle::pdgId(), fastsim::Particle::position(), fastsim::SimplifiedGeometry::PRESHOWER1, fastsim::SimplifiedGeometry::PRESHOWER2, fastsim::Particle::remainingProperLifeTimeC(), FSimTrack::setEcal(), FSimTrack::setGlobal(), FSimTrack::setHcal(), FSimTrack::setLayer1(), FSimTrack::setLayer2(), FSimTrack::setVFcal(), fastsim::Particle::simTrackIndex(), fastsim::Particle::simVertexIndex(), summarizeEdmComparisonLogfiles::success, useFastSimsDecayer_, and fastsim::SimplifiedGeometry::VFCAL.

Referenced by produce(), and ~FastSimProducer().

380  {
381  FSimTrack myFSimTrack(particle->pdgId(),
382  particleManager->getSimTrack(particle->simTrackIndex()).momentum(),
383  particle->simVertexIndex(),
384  particle->genParticleIndex(),
385  particle->simTrackIndex(),
386  particle->charge(),
387  particle->position(),
388  particle->momentum(),
389  particleManager->getSimVertex(particle->simVertexIndex()));
390 
391  // move the particle through the caloLayers
392  fastsim::LayerNavigator caloLayerNavigator(caloGeometry_);
393  const fastsim::SimplifiedGeometry* caloLayer = nullptr;
394 
395  // moveParticleToNextLayer(..) returns 0 in case that particle decays
396  // in this case particle is propagated up to its decay vertex
397  while (caloLayerNavigator.moveParticleToNextLayer(*particle, caloLayer)) {
398  LogDebug(MESSAGECATEGORY) << " moved to next caloLayer: " << *caloLayer;
399  LogDebug(MESSAGECATEGORY) << " new state: " << *particle;
400 
401  // break after 25 ns: only happens for particles stuck in loops
402  if (particle->position().T() > 50) {
403  caloLayer = nullptr;
404  break;
405  }
406 
408  // Define ParticlePropagators (RawParticle) needed for CalorimetryManager and save them
410 
411  RawParticle PP = makeParticle(&particleTable, particle->pdgId(), particle->momentum(), particle->position());
412 
413  // no material
414  if (caloLayer->getThickness(particle->position(), particle->momentum()) < 1E-10) {
415  // unfortunately needed for CalorimetryManager
416  if (caloLayer->getCaloType() == fastsim::SimplifiedGeometry::ECAL) {
417  if (!myFSimTrack.onEcal()) {
418  myFSimTrack.setEcal(PP, 0);
419  }
420  } else if (caloLayer->getCaloType() == fastsim::SimplifiedGeometry::HCAL) {
421  if (!myFSimTrack.onHcal()) {
422  myFSimTrack.setHcal(PP, 0);
423  }
424  } else if (caloLayer->getCaloType() == fastsim::SimplifiedGeometry::VFCAL) {
425  if (!myFSimTrack.onVFcal()) {
426  myFSimTrack.setVFcal(PP, 0);
427  }
428  }
429 
430  // not necessary to continue propagation
431  if (caloLayer->getCaloType() == fastsim::SimplifiedGeometry::VFCAL) {
432  myFSimTrack.setGlobal();
433  caloLayer = nullptr;
434  break;
435  }
436 
437  continue;
438  }
439 
440  // Stupid variable used by the old propagator
441  // For details check BaseParticlePropagator.h
442  int success = 0;
443  if (caloLayer->isForward()) {
444  success = 2;
445  // particle moves inwards
446  if (particle->position().Z() * particle->momentum().Z() < 0) {
447  success *= -1;
448  }
449  } else {
450  success = 1;
451  // particle moves inwards
452  if (particle->momentum().X() * particle->position().X() + particle->momentum().Y() * particle->position().Y() <
453  0) {
454  success *= -1;
455  }
456  }
457 
458  // Save the hit
460  if (!myFSimTrack.onLayer1()) {
461  myFSimTrack.setLayer1(PP, success);
462  }
463  }
464 
466  if (!myFSimTrack.onLayer2()) {
467  myFSimTrack.setLayer2(PP, success);
468  }
469  }
470 
471  if (caloLayer->getCaloType() == fastsim::SimplifiedGeometry::ECAL) {
472  if (!myFSimTrack.onEcal()) {
473  myFSimTrack.setEcal(PP, success);
474  }
475  }
476 
477  if (caloLayer->getCaloType() == fastsim::SimplifiedGeometry::HCAL) {
478  if (!myFSimTrack.onHcal()) {
479  myFSimTrack.setHcal(PP, success);
480  }
481  }
482 
483  if (caloLayer->getCaloType() == fastsim::SimplifiedGeometry::VFCAL) {
484  if (!myFSimTrack.onVFcal()) {
485  myFSimTrack.setVFcal(PP, success);
486  }
487  }
488 
489  // Particle reached end of detector
490  if (caloLayer->getCaloType() == fastsim::SimplifiedGeometry::VFCAL) {
491  myFSimTrack.setGlobal();
492  caloLayer = nullptr;
493  break;
494  }
495 
496  LogDebug(MESSAGECATEGORY) << "--------------------------------"
497  << "\n-------------------------------";
498  }
499 
500  // do decays
501  // don't have to worry about daughters if particle already within the calorimetry
502  // since they will be rejected by the vertex cut of the ParticleFilter
503  if (!particle->isStable() && particle->remainingProperLifeTimeC() < 1E-10) {
504  LogDebug(MESSAGECATEGORY) << "Decaying particle...";
505  std::vector<std::unique_ptr<fastsim::Particle> > secondaries;
506  if (useFastSimsDecayer_) decayer_.decay(*particle, secondaries, _randomEngine->theEngine());
507  LogDebug(MESSAGECATEGORY) << " decay has " << secondaries.size() << " products";
508  particleManager->addSecondaries(particle->position(), particle->simTrackIndex(), secondaries);
509  }
510 
511  return myFSimTrack;
512 }
#define LogDebug(id)
fastsim::Geometry caloGeometry_
Hack to interface "old" calo to "new" tracking.
std::unique_ptr< RandomEngineAndDistribution > _randomEngine
The random engine.
Implementation of a generic detector layer (base class for forward/barrel layers).
const math::XYZTLorentzVector & position() const
Return position of the particle.
Definition: Particle.h:142
Handles/tracks (possible) intersections of particle&#39;s trajectory and tracker layers.
double remainingProperLifeTimeC() const
Return the particle&#39;s remaining proper lifetime[in ct].
Definition: Particle.h:152
int genParticleIndex() const
Return index of the particle in the genParticle vector.
Definition: Particle.h:167
fastsim::Decayer decayer_
Handles decays of non-stable particles using pythia.
virtual bool isForward() const =0
Returns false/true depending if the object is a (non-abstract) barrel/forward layer.
int pdgId() const
Return pdgId of the particle.
Definition: Particle.h:136
const SimVertex getSimVertex(unsigned i)
Returns the position of a given SimVertex. Needed for interfacing the code with the old calorimetry...
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)
Definition: makeParticle.cc:29
int simVertexIndex() const
Return index of the origin vertex.
Definition: Particle.h:161
CaloType getCaloType() const
Hack to interface "old" Calorimetry with "new" Tracker.
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...
void decay(const Particle &particle, std::vector< std::unique_ptr< Particle > > &secondaries, CLHEP::HepRandomEngine &engine) const
Decay particle using pythia.
Definition: Decayer.cc:29
int simTrackIndex() const
Return index of the SimTrack.
Definition: Particle.h:155
double charge() const
Return charge of the particle.
Definition: Particle.h:139
virtual const double getThickness(const math::XYZTLorentzVector &position) const =0
Return thickness of the layer at a given position.
static const std::string MESSAGECATEGORY
Category of debugging messages ("FastSimulation")
bool isStable() const
Returns true if particle is considered stable.
Definition: Particle.h:175
const math::XYZTLorentzVector & momentum() const
Return momentum of the particle.
Definition: Particle.h:145
void FastSimProducer::endStream ( )
overrideprivate

Definition at line 376 of file FastSimProducer.cc.

References _randomEngine.

Referenced by ~FastSimProducer().

376 { _randomEngine.reset(); }
std::unique_ptr< RandomEngineAndDistribution > _randomEngine
The random engine.
void FastSimProducer::produce ( edm::Event iEvent,
const edm::EventSetup iSetup 
)
overrideprivate

Definition at line 168 of file FastSimProducer.cc.

References _randomEngine, funct::abs(), beamPipeRadius_, caloGeometry_, edm::ESWatcher< T >::check(), createFSimTrack(), fastsim::Decayer::decay(), decayer_, deltaRchargedMother_, fixLongLivedBug_, GenHFHadronMatcher_cfi::genParticles, genParticlesToken_, geometry_, edm::EventSetup::get(), edm::Event::getByToken(), fastsim::SimplifiedGeometry::getCaloType(), edm::EventSetup::getData(), edm::HepMCProduct::GetEvent(), fastsim::SimplifiedGeometry::getInteractionModels(), fastsim::Geometry::getMagneticFieldZ(), fastsim::SimplifiedGeometry::getThickness(), interactionModelMap_, interactionModels_, LogDebug, MESSAGECATEGORY, eostools::move(), fastsim::LayerNavigator::moveParticleToNextLayer(), myCalorimetry, p4, particleFilter_, edm::Event::put(), simulateCalorimetry, simulateMuons, fastsim::SimplifiedGeometry::TRACKERBOUNDARY, fastsim::Geometry::update(), useFastSimsDecayer_, watchCaloGeometry_, and watchCaloTopology_.

Referenced by JSONExport.JsonExport::export(), HTMLExport.HTMLExport::export(), HTMLExport.HTMLExportStatic::export(), and ~FastSimProducer().

168  {
169  LogDebug(MESSAGECATEGORY) << " produce";
170 
173 
174  // Define containers for SimTracks, SimVertices
175  std::unique_ptr<edm::SimTrackContainer> simTracks_(new edm::SimTrackContainer);
176  std::unique_ptr<edm::SimVertexContainer> simVertices_(new edm::SimVertexContainer);
177 
178  // Get the particle data table (in case lifetime or charge of GenParticles not set)
180  iSetup.getData(pdt);
181 
182  // Get the GenParticle collection
184  iEvent.getByToken(genParticlesToken_, genParticles);
185 
186  // Load the ParticleManager which returns the particles that have to be propagated
187  // Creates a fastsim::Particle out of a GenParticle/secondary
188  fastsim::ParticleManager particleManager(*genParticles->GetEvent(),
189  *pdt,
193  *simTracks_,
194  *simVertices_,
197 
198  // Initialize the calorimeter geometry
199  if (simulateCalorimetry) {
200  if (watchCaloGeometry_.check(iSetup) || watchCaloTopology_.check(iSetup)) {
202  iSetup.get<CaloGeometryRecord>().get(pG);
203  myCalorimetry->getCalorimeter()->setupGeometry(*pG);
204 
205  edm::ESHandle<CaloTopology> theCaloTopology;
206  iSetup.get<CaloTopologyRecord>().get(theCaloTopology);
207  myCalorimetry->getCalorimeter()->setupTopology(*theCaloTopology);
208  myCalorimetry->getCalorimeter()->initialize(geometry_.getMagneticFieldZ(math::XYZTLorentzVector(0., 0., 0., 0.)));
209 
210  myCalorimetry->getHFShowerLibrary()->initHFShowerLibrary(iSetup);
211  }
212 
213  // Important: this also cleans the calorimetry information from the last event
214  myCalorimetry->initialize(_randomEngine.get());
215  }
216 
217  // The vector of SimTracks needed for the CalorimetryManager
218  std::vector<FSimTrack> myFSimTracks;
219 
220  LogDebug(MESSAGECATEGORY) << "################################"
221  << "\n###############################";
222 
223  // loop over particles
224  for (std::unique_ptr<fastsim::Particle> particle = particleManager.nextParticle(*_randomEngine); particle != nullptr;
225  particle = particleManager.nextParticle(*_randomEngine)) {
226  LogDebug(MESSAGECATEGORY) << "\n moving NEXT particle: " << *particle;
227 
228  // -----------------------------
229  // This condition is necessary because of hack for calorimetry
230  // -> The CalorimetryManager should also be implemented based on this new FastSim classes (Particle.h) in a future project.
231  // A second loop (below) loops over all parts of the calorimetry in order to create a track of the old FastSim class FSimTrack.
232  // The condition below (R<128, z<302) makes sure that the particle geometrically is outside the tracker boundaries
233  // -----------------------------
234 
235  if (particle->position().Perp2() < 128. * 128. && std::abs(particle->position().Z()) < 302.) {
236  // move the particle through the layers
237  fastsim::LayerNavigator layerNavigator(geometry_);
238  const fastsim::SimplifiedGeometry* layer = nullptr;
239 
240  // moveParticleToNextLayer(..) returns 0 in case that particle decays
241  // in this case particle is propagated up to its decay vertex
242  while (layerNavigator.moveParticleToNextLayer(*particle, layer)) {
243  LogDebug(MESSAGECATEGORY) << " moved to next layer: " << *layer;
244  LogDebug(MESSAGECATEGORY) << " new state: " << *particle;
245 
246  // Hack to interface "old" calo to "new" tracking
247  // Particle reached calorimetry so stop further propagation
249  layer = nullptr;
250  // particle no longer is on a layer
251  particle->resetOnLayer();
252  break;
253  }
254 
255  // break after 25 ns: only happens for particles stuck in loops
256  if (particle->position().T() > 25) {
257  layer = nullptr;
258  // particle no longer is on a layer
259  particle->resetOnLayer();
260  break;
261  }
262 
263  // perform interaction between layer and particle
264  // do only if there is actual material
265  if (layer->getThickness(particle->position(), particle->momentum()) > 1E-10) {
266  int nSecondaries = 0;
267  // loop on interaction models
268  for (fastsim::InteractionModel* interactionModel : layer->getInteractionModels()) {
269  LogDebug(MESSAGECATEGORY) << " interact with " << *interactionModel;
270  std::vector<std::unique_ptr<fastsim::Particle> > secondaries;
271  interactionModel->interact(*particle, *layer, secondaries, *_randomEngine);
272  nSecondaries += secondaries.size();
273  particleManager.addSecondaries(particle->position(), particle->simTrackIndex(), secondaries, layer);
274  }
275 
276  // kinematic cuts: particle might e.g. lost all its energy
277  if (!particleFilter_.acceptsEn(*particle)) {
278  // Add endvertex if particle did not create any secondaries
279  if (nSecondaries == 0)
280  particleManager.addEndVertex(particle.get());
281  layer = nullptr;
282  break;
283  }
284  }
285 
286  LogDebug(MESSAGECATEGORY) << "--------------------------------"
287  << "\n-------------------------------";
288  }
289 
290  // do decays
291  if (!particle->isStable() && particle->remainingProperLifeTimeC() < 1E-10) {
292  LogDebug(MESSAGECATEGORY) << "Decaying particle...";
293  std::vector<std::unique_ptr<fastsim::Particle> > secondaries;
294  if (useFastSimsDecayer_) decayer_.decay(*particle, secondaries, _randomEngine->theEngine());
295  LogDebug(MESSAGECATEGORY) << " decay has " << secondaries.size() << " products";
296  particleManager.addSecondaries(particle->position(), particle->simTrackIndex(), secondaries);
297  continue;
298  }
299 
300  LogDebug(MESSAGECATEGORY) << "################################"
301  << "\n###############################";
302  }
303 
304  // -----------------------------
305  // Hack to interface "old" calorimetry with "new" propagation in tracker
306  // The CalorimetryManager has to know which particle could in principle hit which parts of the calorimeter
307  // I think it's a bit strange to propagate the particle even further (and even decay it) if it already hits
308  // some part of the calorimetry but this is how the code works...
309  // -----------------------------
310 
311  if (particle->position().Perp2() >= 128. * 128. || std::abs(particle->position().Z()) >= 302.) {
312  LogDebug(MESSAGECATEGORY) << "\n moving particle to calorimetry: " << *particle;
313 
314  // create FSimTrack (this is the object the old propagation uses)
315  myFSimTracks.push_back(createFSimTrack(particle.get(), &particleManager, *pdt));
316  // particle was decayed
317  if (!particle->isStable() && particle->remainingProperLifeTimeC() < 1E-10) {
318  continue;
319  }
320 
321  LogDebug(MESSAGECATEGORY) << "################################"
322  << "\n###############################";
323  }
324 
325  // -----------------------------
326  // End Hack
327  // -----------------------------
328 
329  LogDebug(MESSAGECATEGORY) << "################################"
330  << "\n###############################";
331  }
332 
333  // store simTracks and simVertices
334  iEvent.put(std::move(simTracks_));
335  iEvent.put(std::move(simVertices_));
336  // store products of interaction models, i.e. simHits
337  for (auto& interactionModel : interactionModels_) {
338  interactionModel->storeProducts(iEvent);
339  }
340 
341  // -----------------------------
342  // Calorimetry Manager
343  // -----------------------------
344  if (simulateCalorimetry) {
345  for (auto myFSimTrack : myFSimTracks) {
346  myCalorimetry->reconstructTrack(myFSimTrack, _randomEngine.get());
347  }
348  }
349 
350  // -----------------------------
351  // Store Hits
352  // -----------------------------
353  std::unique_ptr<edm::PCaloHitContainer> p4(new edm::PCaloHitContainer);
354  std::unique_ptr<edm::PCaloHitContainer> p5(new edm::PCaloHitContainer);
355  std::unique_ptr<edm::PCaloHitContainer> p6(new edm::PCaloHitContainer);
356  std::unique_ptr<edm::PCaloHitContainer> p7(new edm::PCaloHitContainer);
357 
358  std::unique_ptr<edm::SimTrackContainer> m1(new edm::SimTrackContainer);
359 
360  if (simulateCalorimetry) {
361  myCalorimetry->loadFromEcalBarrel(*p4);
362  myCalorimetry->loadFromEcalEndcap(*p5);
363  myCalorimetry->loadFromPreshower(*p6);
364  myCalorimetry->loadFromHcal(*p7);
365  if (simulateMuons) {
366  myCalorimetry->harvestMuonSimTracks(*m1);
367  }
368  }
369  iEvent.put(std::move(p4), "EcalHitsEB");
370  iEvent.put(std::move(p5), "EcalHitsEE");
371  iEvent.put(std::move(p6), "EcalHitsES");
372  iEvent.put(std::move(p7), "HcalHits");
373  iEvent.put(std::move(m1), "MuonSimTracks");
374 }
#define LogDebug(id)
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.
Definition: Geometry.cc:44
std::vector< PCaloHit > PCaloHitContainer
OrphanHandle< PROD > put(std::unique_ptr< PROD > product)
Put a new product.
Definition: Event.h:125
fastsim::Geometry caloGeometry_
Hack to interface "old" calo to "new" tracking.
std::unique_ptr< RandomEngineAndDistribution > _randomEngine
The random engine.
Implementation of a generic detector layer (base class for forward/barrel layers).
Handles/tracks (possible) intersections of particle&#39;s trajectory and tracker layers.
Manages GenParticles and Secondaries from interactions.
double deltaRchargedMother_
Cut on deltaR for ClosestChargedDaughter algorithm (FastSim tracking)
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:517
fastsim::Geometry geometry_
The definition of the tracker according to python config.
edm::EDGetTokenT< edm::HepMCProduct > genParticlesToken_
Token to get the genParticles.
fastsim::Decayer decayer_
Handles decays of non-stable particles using pythia.
virtual FSimTrack createFSimTrack(fastsim::Particle *particle, fastsim::ParticleManager *particleManager, HepPDT::ParticleDataTable const &particleTable)
bool getData(T &iHolder) const
Definition: EventSetup.h:111
XYZTLorentzVectorD XYZTLorentzVector
Lorentz vector with cylindrical internal representation using pseudorapidity.
Definition: LorentzVector.h:29
Base class for any interaction model between a particle and a tracker layer.
const std::vector< InteractionModel * > & getInteractionModels() const
Return the vector of all interaction models that are assigned with a layer.
CaloType getCaloType() const
Hack to interface "old" Calorimetry with "new" Tracker.
double p4[4]
Definition: TauolaWrapper.h:92
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
double beamPipeRadius_
The radius of the beampipe.
void decay(const Particle &particle, std::vector< std::unique_ptr< Particle > > &secondaries, CLHEP::HepRandomEngine &engine) const
Decay particle using pythia.
Definition: Decayer.cc:29
const HepMC::GenEvent * GetEvent() const
Definition: HepMCProduct.h:38
edm::ESWatcher< CaloTopologyRecord > watchCaloTopology_
std::vector< SimVertex > SimVertexContainer
virtual const double getThickness(const math::XYZTLorentzVector &position) const =0
Return thickness of the layer at a given position.
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)
Definition: ESWatcher.h:52
T get() const
Definition: EventSetup.h:71
std::vector< SimTrack > SimTrackContainer
double getMagneticFieldZ(const math::XYZTLorentzVector &position) const
Initializes the tracker geometry.
Definition: Geometry.cc:161
fastsim::ParticleFilter particleFilter_
Decides which particles have to be propagated.
def move(src, dest)
Definition: eostools.py:511

Member Data Documentation

std::unique_ptr<RandomEngineAndDistribution> FastSimProducer::_randomEngine
private

The random engine.

Definition at line 83 of file FastSimProducer.cc.

Referenced by beginStream(), createFSimTrack(), endStream(), and produce().

double FastSimProducer::beamPipeRadius_
private

The radius of the beampipe.

Definition at line 80 of file FastSimProducer.cc.

Referenced by produce().

fastsim::Geometry FastSimProducer::caloGeometry_
private

Hack to interface "old" calo to "new" tracking.

Definition at line 79 of file FastSimProducer.cc.

Referenced by createFSimTrack(), and produce().

fastsim::Decayer FastSimProducer::decayer_
private

Handles decays of non-stable particles using pythia.

Definition at line 94 of file FastSimProducer.cc.

Referenced by createFSimTrack(), and produce().

double FastSimProducer::deltaRchargedMother_
private

Cut on deltaR for ClosestChargedDaughter algorithm (FastSim tracking)

Definition at line 81 of file FastSimProducer.cc.

Referenced by produce().

bool FastSimProducer::fixLongLivedBug_
private

Definition at line 91 of file FastSimProducer.cc.

Referenced by produce().

edm::EDGetTokenT<edm::HepMCProduct> FastSimProducer::genParticlesToken_
private

Token to get the genParticles.

Definition at line 77 of file FastSimProducer.cc.

Referenced by produce().

fastsim::Geometry FastSimProducer::geometry_
private

The definition of the tracker according to python config.

Definition at line 78 of file FastSimProducer.cc.

Referenced by produce().

std::map<std::string, fastsim::InteractionModel*> FastSimProducer::interactionModelMap_
private

Each interaction model has a unique name.

Definition at line 96 of file FastSimProducer.cc.

Referenced by FastSimProducer(), and produce().

std::vector<std::unique_ptr<fastsim::InteractionModel> > FastSimProducer::interactionModels_
private

All defined interaction models.

Definition at line 95 of file FastSimProducer.cc.

Referenced by FastSimProducer(), and produce().

const std::string FastSimProducer::MESSAGECATEGORY = "FastSimulation"
staticprivate

Category of debugging messages ("FastSimulation")

Definition at line 97 of file FastSimProducer.cc.

Referenced by createFSimTrack(), and produce().

std::unique_ptr<CalorimetryManager> FastSimProducer::myCalorimetry
private

Definition at line 88 of file FastSimProducer.cc.

Referenced by FastSimProducer(), and produce().

fastsim::ParticleFilter FastSimProducer::particleFilter_
private

Decides which particles have to be propagated.

Definition at line 82 of file FastSimProducer.cc.

Referenced by produce().

bool FastSimProducer::simulateCalorimetry
private

Definition at line 85 of file FastSimProducer.cc.

Referenced by FastSimProducer(), and produce().

bool FastSimProducer::simulateMuons
private

Definition at line 89 of file FastSimProducer.cc.

Referenced by produce().

bool FastSimProducer::useFastSimsDecayer_
private

Definition at line 92 of file FastSimProducer.cc.

Referenced by createFSimTrack(), and produce().

edm::ESWatcher<CaloGeometryRecord> FastSimProducer::watchCaloGeometry_
private

Definition at line 86 of file FastSimProducer.cc.

Referenced by produce().

edm::ESWatcher<CaloTopologyRecord> FastSimProducer::watchCaloTopology_
private

Definition at line 87 of file FastSimProducer.cc.

Referenced by produce().