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...
 
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 100 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.

101  : genParticlesToken_(consumes<edm::HepMCProduct>(iConfig.getParameter<edm::InputTag>("src"))),
102  geometry_(iConfig.getParameter<edm::ParameterSet>("trackerDefinition")),
103  caloGeometry_(iConfig.getParameter<edm::ParameterSet>("caloDefinition")),
104  beamPipeRadius_(iConfig.getParameter<double>("beamPipeRadius")),
105  deltaRchargedMother_(iConfig.getParameter<double>("deltaRchargedMother")),
106  particleFilter_(iConfig.getParameter<edm::ParameterSet>("particleFilter")),
107  _randomEngine(nullptr),
108  simulateCalorimetry(iConfig.getParameter<bool>("simulateCalorimetry")),
109  simulateMuons(iConfig.getParameter<bool>("simulateMuons")),
110  useFastSimsDecayer(iConfig.getParameter<bool>("useFastSimsDecayer")) {
111  //----------------
112  // define interaction models
113  //---------------
114 
115  const edm::ParameterSet& modelCfgs = iConfig.getParameter<edm::ParameterSet>("interactionModels");
116  for (const std::string& modelName : modelCfgs.getParameterNames()) {
117  const edm::ParameterSet& modelCfg = modelCfgs.getParameter<edm::ParameterSet>(modelName);
118  std::string modelClassName(modelCfg.getParameter<std::string>("className"));
119  // Use plugin-factory to create model
120  std::unique_ptr<fastsim::InteractionModel> interactionModel(
121  fastsim::InteractionModelFactory::get()->create(modelClassName, modelName, modelCfg));
122  if (!interactionModel.get()) {
123  throw cms::Exception("FastSimProducer") << "InteractionModel " << modelName << " could not be created";
124  }
125  // Add model to list
126  interactionModels_.push_back(std::move(interactionModel));
127  // and create the map
129  }
130 
131  //----------------
132  // calorimetry
133  //---------------
134 
135  if (simulateCalorimetry) {
136  myCalorimetry.reset(new CalorimetryManager(nullptr,
137  iConfig.getParameter<edm::ParameterSet>("Calorimetry"),
138  iConfig.getParameter<edm::ParameterSet>("MaterialEffectsForMuonsInECAL"),
139  iConfig.getParameter<edm::ParameterSet>("MaterialEffectsForMuonsInHCAL"),
140  iConfig.getParameter<edm::ParameterSet>("GFlash")));
141  }
142 
143  //----------------
144  // register products
145  //----------------
146 
147  // SimTracks and SimVertices
148  produces<edm::SimTrackContainer>();
149  produces<edm::SimVertexContainer>();
150  // products of interaction models, i.e. simHits
151  for (auto& interactionModel : interactionModels_) {
152  interactionModel->registerProducts(*this);
153  }
154  produces<edm::PCaloHitContainer>("EcalHitsEB");
155  produces<edm::PCaloHitContainer>("EcalHitsEE");
156  produces<edm::PCaloHitContainer>("EcalHitsES");
157  produces<edm::PCaloHitContainer>("HcalHits");
158  produces<edm::SimTrackContainer>("MuonSimTracks");
159 }
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 161 of file FastSimProducer.cc.

References _randomEngine, and triggerObjects_cff::id.

Referenced by ~FastSimProducer().

161  {
162  _randomEngine = std::make_unique<RandomEngineAndDistribution>(id);
163 }
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 374 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, and fastsim::SimplifiedGeometry::VFCAL.

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

376  {
377  FSimTrack myFSimTrack(particle->pdgId(),
378  particleManager->getSimTrack(particle->simTrackIndex()).momentum(),
379  particle->simVertexIndex(),
380  particle->genParticleIndex(),
381  particle->simTrackIndex(),
382  particle->charge(),
383  particle->position(),
384  particle->momentum(),
385  particleManager->getSimVertex(particle->simVertexIndex()));
386 
387  // move the particle through the caloLayers
388  fastsim::LayerNavigator caloLayerNavigator(caloGeometry_);
389  const fastsim::SimplifiedGeometry* caloLayer = nullptr;
390 
391  // moveParticleToNextLayer(..) returns 0 in case that particle decays
392  // in this case particle is propagated up to its decay vertex
393  while (caloLayerNavigator.moveParticleToNextLayer(*particle, caloLayer)) {
394  LogDebug(MESSAGECATEGORY) << " moved to next caloLayer: " << *caloLayer;
395  LogDebug(MESSAGECATEGORY) << " new state: " << *particle;
396 
397  // break after 25 ns: only happens for particles stuck in loops
398  if (particle->position().T() > 50) {
399  caloLayer = nullptr;
400  break;
401  }
402 
404  // Define ParticlePropagators (RawParticle) needed for CalorimetryManager and save them
406 
407  RawParticle PP = makeParticle(&particleTable, particle->pdgId(), particle->momentum(), particle->position());
408 
409  // no material
410  if (caloLayer->getThickness(particle->position(), particle->momentum()) < 1E-10) {
411  // unfortunately needed for CalorimetryManager
412  if (caloLayer->getCaloType() == fastsim::SimplifiedGeometry::ECAL) {
413  if (!myFSimTrack.onEcal()) {
414  myFSimTrack.setEcal(PP, 0);
415  }
416  } else if (caloLayer->getCaloType() == fastsim::SimplifiedGeometry::HCAL) {
417  if (!myFSimTrack.onHcal()) {
418  myFSimTrack.setHcal(PP, 0);
419  }
420  } else if (caloLayer->getCaloType() == fastsim::SimplifiedGeometry::VFCAL) {
421  if (!myFSimTrack.onVFcal()) {
422  myFSimTrack.setVFcal(PP, 0);
423  }
424  }
425 
426  // not necessary to continue propagation
427  if (caloLayer->getCaloType() == fastsim::SimplifiedGeometry::VFCAL) {
428  myFSimTrack.setGlobal();
429  caloLayer = nullptr;
430  break;
431  }
432 
433  continue;
434  }
435 
436  // Stupid variable used by the old propagator
437  // For details check BaseParticlePropagator.h
438  int success = 0;
439  if (caloLayer->isForward()) {
440  success = 2;
441  // particle moves inwards
442  if (particle->position().Z() * particle->momentum().Z() < 0) {
443  success *= -1;
444  }
445  } else {
446  success = 1;
447  // particle moves inwards
448  if (particle->momentum().X() * particle->position().X() + particle->momentum().Y() * particle->position().Y() <
449  0) {
450  success *= -1;
451  }
452  }
453 
454  // Save the hit
456  if (!myFSimTrack.onLayer1()) {
457  myFSimTrack.setLayer1(PP, success);
458  }
459  }
460 
462  if (!myFSimTrack.onLayer2()) {
463  myFSimTrack.setLayer2(PP, success);
464  }
465  }
466 
467  if (caloLayer->getCaloType() == fastsim::SimplifiedGeometry::ECAL) {
468  if (!myFSimTrack.onEcal()) {
469  myFSimTrack.setEcal(PP, success);
470  }
471  }
472 
473  if (caloLayer->getCaloType() == fastsim::SimplifiedGeometry::HCAL) {
474  if (!myFSimTrack.onHcal()) {
475  myFSimTrack.setHcal(PP, success);
476  }
477  }
478 
479  if (caloLayer->getCaloType() == fastsim::SimplifiedGeometry::VFCAL) {
480  if (!myFSimTrack.onVFcal()) {
481  myFSimTrack.setVFcal(PP, success);
482  }
483  }
484 
485  // Particle reached end of detector
486  if (caloLayer->getCaloType() == fastsim::SimplifiedGeometry::VFCAL) {
487  myFSimTrack.setGlobal();
488  caloLayer = nullptr;
489  break;
490  }
491 
492  LogDebug(MESSAGECATEGORY) << "--------------------------------"
493  << "\n-------------------------------";
494  }
495 
496  // do decays
497  // don't have to worry about daughters if particle already within the calorimetry
498  // since they will be rejected by the vertex cut of the ParticleFilter
499  if (!particle->isStable() && particle->remainingProperLifeTimeC() < 1E-10) {
500  LogDebug(MESSAGECATEGORY) << "Decaying particle...";
501  std::vector<std::unique_ptr<fastsim::Particle> > secondaries;
502  decayer_.decay(*particle, secondaries, _randomEngine->theEngine());
503  LogDebug(MESSAGECATEGORY) << " decay has " << secondaries.size() << " products";
504  particleManager->addSecondaries(particle->position(), particle->simTrackIndex(), secondaries);
505  }
506 
507  return myFSimTrack;
508 }
#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 372 of file FastSimProducer.cc.

References _randomEngine.

Referenced by ~FastSimProducer().

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

Definition at line 165 of file FastSimProducer.cc.

References _randomEngine, funct::abs(), beamPipeRadius_, caloGeometry_, edm::ESWatcher< T >::check(), createFSimTrack(), fastsim::Decayer::decay(), decayer_, deltaRchargedMother_, 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().

165  {
166  LogDebug(MESSAGECATEGORY) << " produce";
167 
170 
171  // Define containers for SimTracks, SimVertices
172  std::unique_ptr<edm::SimTrackContainer> simTracks_(new edm::SimTrackContainer);
173  std::unique_ptr<edm::SimVertexContainer> simVertices_(new edm::SimVertexContainer);
174 
175  // Get the particle data table (in case lifetime or charge of GenParticles not set)
177  iSetup.getData(pdt);
178 
179  // Get the GenParticle collection
181  iEvent.getByToken(genParticlesToken_, genParticles);
182 
183  // Load the ParticleManager which returns the particles that have to be propagated
184  // Creates a fastsim::Particle out of a GenParticle/secondary
185  fastsim::ParticleManager particleManager(*genParticles->GetEvent(),
186  *pdt,
190  *simTracks_,
191  *simVertices_,
193 
194  // Initialize the calorimeter geometry
195  if (simulateCalorimetry) {
196  if (watchCaloGeometry_.check(iSetup) || watchCaloTopology_.check(iSetup)) {
198  iSetup.get<CaloGeometryRecord>().get(pG);
199  myCalorimetry->getCalorimeter()->setupGeometry(*pG);
200 
201  edm::ESHandle<CaloTopology> theCaloTopology;
202  iSetup.get<CaloTopologyRecord>().get(theCaloTopology);
203  myCalorimetry->getCalorimeter()->setupTopology(*theCaloTopology);
204  myCalorimetry->getCalorimeter()->initialize(geometry_.getMagneticFieldZ(math::XYZTLorentzVector(0., 0., 0., 0.)));
205 
206  myCalorimetry->getHFShowerLibrary()->initHFShowerLibrary(iSetup);
207  }
208 
209  // Important: this also cleans the calorimetry information from the last event
210  myCalorimetry->initialize(_randomEngine.get());
211  }
212 
213  // The vector of SimTracks needed for the CalorimetryManager
214  std::vector<FSimTrack> myFSimTracks;
215 
216  LogDebug(MESSAGECATEGORY) << "################################"
217  << "\n###############################";
218 
219  // loop over particles
220  for (std::unique_ptr<fastsim::Particle> particle = particleManager.nextParticle(*_randomEngine); particle != nullptr;
221  particle = particleManager.nextParticle(*_randomEngine)) {
222  LogDebug(MESSAGECATEGORY) << "\n moving NEXT particle: " << *particle;
223 
224  // -----------------------------
225  // This condition is necessary because of hack for calorimetry
226  // -> The CalorimetryManager should also be implemented based on this new FastSim classes (Particle.h) in a future project.
227  // A second loop (below) loops over all parts of the calorimetry in order to create a track of the old FastSim class FSimTrack.
228  // The condition below (R<128, z<302) makes sure that the particle geometrically is outside the tracker boundaries
229  // -----------------------------
230 
231  if (particle->position().Perp2() < 128. * 128. && std::abs(particle->position().Z()) < 302.) {
232  // move the particle through the layers
233  fastsim::LayerNavigator layerNavigator(geometry_);
234  const fastsim::SimplifiedGeometry* layer = nullptr;
235 
236  // moveParticleToNextLayer(..) returns 0 in case that particle decays
237  // in this case particle is propagated up to its decay vertex
238  while (layerNavigator.moveParticleToNextLayer(*particle, layer)) {
239  LogDebug(MESSAGECATEGORY) << " moved to next layer: " << *layer;
240  LogDebug(MESSAGECATEGORY) << " new state: " << *particle;
241 
242  // Hack to interface "old" calo to "new" tracking
243  // Particle reached calorimetry so stop further propagation
245  layer = nullptr;
246  // particle no longer is on a layer
247  particle->resetOnLayer();
248  break;
249  }
250 
251  // break after 25 ns: only happens for particles stuck in loops
252  if (particle->position().T() > 25) {
253  layer = nullptr;
254  // particle no longer is on a layer
255  particle->resetOnLayer();
256  break;
257  }
258 
259  // perform interaction between layer and particle
260  // do only if there is actual material
261  if (layer->getThickness(particle->position(), particle->momentum()) > 1E-10) {
262  int nSecondaries = 0;
263  // loop on interaction models
264  for (fastsim::InteractionModel* interactionModel : layer->getInteractionModels()) {
265  LogDebug(MESSAGECATEGORY) << " interact with " << *interactionModel;
266  std::vector<std::unique_ptr<fastsim::Particle> > secondaries;
267  interactionModel->interact(*particle, *layer, secondaries, *_randomEngine);
268  nSecondaries += secondaries.size();
269  particleManager.addSecondaries(particle->position(), particle->simTrackIndex(), secondaries, layer);
270  }
271 
272  // kinematic cuts: particle might e.g. lost all its energy
273  if (!particleFilter_.acceptsEn(*particle)) {
274  // Add endvertex if particle did not create any secondaries
275  if (nSecondaries == 0)
276  particleManager.addEndVertex(particle.get());
277  layer = nullptr;
278  break;
279  }
280  }
281 
282  LogDebug(MESSAGECATEGORY) << "--------------------------------"
283  << "\n-------------------------------";
284  }
285 
286  // do decays
287  if (!particle->isStable() && particle->remainingProperLifeTimeC() < 1E-10) {
288  LogDebug(MESSAGECATEGORY) << "Decaying particle...";
289  std::vector<std::unique_ptr<fastsim::Particle> > secondaries;
290  decayer_.decay(*particle, secondaries, _randomEngine->theEngine());
291  LogDebug(MESSAGECATEGORY) << " decay has " << secondaries.size() << " products";
292  particleManager.addSecondaries(particle->position(), particle->simTrackIndex(), secondaries);
293  continue;
294  }
295 
296  LogDebug(MESSAGECATEGORY) << "################################"
297  << "\n###############################";
298  }
299 
300  // -----------------------------
301  // Hack to interface "old" calorimetry with "new" propagation in tracker
302  // The CalorimetryManager has to know which particle could in principle hit which parts of the calorimeter
303  // I think it's a bit strange to propagate the particle even further (and even decay it) if it already hits
304  // some part of the calorimetry but this is how the code works...
305  // -----------------------------
306 
307  if (particle->position().Perp2() >= 128. * 128. || std::abs(particle->position().Z()) >= 302.) {
308  LogDebug(MESSAGECATEGORY) << "\n moving particle to calorimetry: " << *particle;
309 
310  // create FSimTrack (this is the object the old propagation uses)
311  myFSimTracks.push_back(createFSimTrack(particle.get(), &particleManager, *pdt));
312  // particle was decayed
313  if (!particle->isStable() && particle->remainingProperLifeTimeC() < 1E-10) {
314  continue;
315  }
316 
317  LogDebug(MESSAGECATEGORY) << "################################"
318  << "\n###############################";
319  }
320 
321  // -----------------------------
322  // End Hack
323  // -----------------------------
324 
325  LogDebug(MESSAGECATEGORY) << "################################"
326  << "\n###############################";
327  }
328 
329  // store simTracks and simVertices
330  iEvent.put(std::move(simTracks_));
331  iEvent.put(std::move(simVertices_));
332  // store products of interaction models, i.e. simHits
333  for (auto& interactionModel : interactionModels_) {
334  interactionModel->storeProducts(iEvent);
335  }
336 
337  // -----------------------------
338  // Calorimetry Manager
339  // -----------------------------
340  if (simulateCalorimetry) {
341  for (auto myFSimTrack : myFSimTracks) {
342  myCalorimetry->reconstructTrack(myFSimTrack, _randomEngine.get());
343  }
344  }
345 
346  // -----------------------------
347  // Store Hits
348  // -----------------------------
349  std::unique_ptr<edm::PCaloHitContainer> p4(new edm::PCaloHitContainer);
350  std::unique_ptr<edm::PCaloHitContainer> p5(new edm::PCaloHitContainer);
351  std::unique_ptr<edm::PCaloHitContainer> p6(new edm::PCaloHitContainer);
352  std::unique_ptr<edm::PCaloHitContainer> p7(new edm::PCaloHitContainer);
353 
354  std::unique_ptr<edm::SimTrackContainer> m1(new edm::SimTrackContainer);
355 
356  if (simulateCalorimetry) {
357  myCalorimetry->loadFromEcalBarrel(*p4);
358  myCalorimetry->loadFromEcalEndcap(*p5);
359  myCalorimetry->loadFromPreshower(*p6);
360  myCalorimetry->loadFromHcal(*p7);
361  if (simulateMuons) {
362  myCalorimetry->harvestMuonSimTracks(*m1);
363  }
364  }
365  iEvent.put(std::move(p4), "EcalHitsEB");
366  iEvent.put(std::move(p5), "EcalHitsEE");
367  iEvent.put(std::move(p6), "EcalHitsES");
368  iEvent.put(std::move(p7), "HcalHits");
369  iEvent.put(std::move(m1), "MuonSimTracks");
370 }
#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 92 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().

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 94 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 93 of file FastSimProducer.cc.

Referenced by FastSimProducer(), and produce().

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

Category of debugging messages ("FastSimulation")

Definition at line 95 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 90 of file FastSimProducer.cc.

Referenced by 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().