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
 
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 67 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(), decayer_, Exception, fixLongLivedBug_, reco::get(), edm::ParameterSet::getParameter(), edm::ParameterSet::getParameterNames(), interactionModelMap_, interactionModels_, ecalBarrelClusterFastTimer_cfi::modelName, eostools::move(), myCalorimetry, fastsim::Decayer::setfixLongLivedBug(), 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 {
114  // Fix the decayer for the long lived stuff
116  //----------------
117  // define interaction models
118  //---------------
119 
120  const edm::ParameterSet & modelCfgs = iConfig.getParameter<edm::ParameterSet>("interactionModels");
121  for(const std::string & modelName : modelCfgs.getParameterNames())
122  {
123  const edm::ParameterSet & modelCfg = modelCfgs.getParameter<edm::ParameterSet>(modelName);
124  std::string modelClassName(modelCfg.getParameter<std::string>("className"));
125  // Use plugin-factory to create model
126  std::unique_ptr<fastsim::InteractionModel> interactionModel(fastsim::InteractionModelFactory::get()->create(modelClassName, modelName, modelCfg));
127  if(!interactionModel.get()){
128  throw cms::Exception("FastSimProducer") << "InteractionModel " << modelName << " could not be created";
129  }
130  // Add model to list
131  interactionModels_.push_back(std::move(interactionModel));
132  // and create the map
134  }
135 
136  //----------------
137  // calorimetry
138  //---------------
139 
141  myCalorimetry.reset(new CalorimetryManager(nullptr,
142  iConfig.getParameter<edm::ParameterSet>("Calorimetry"),
143  iConfig.getParameter<edm::ParameterSet>("MaterialEffectsForMuonsInECAL"),
144  iConfig.getParameter<edm::ParameterSet>("MaterialEffectsForMuonsInHCAL"),
145  iConfig.getParameter<edm::ParameterSet>("GFlash")));
146  }
147 
148  //----------------
149  // register products
150  //----------------
151 
152  // SimTracks and SimVertices
153  produces<edm::SimTrackContainer>();
154  produces<edm::SimVertexContainer>();
155  // products of interaction models, i.e. simHits
156  for(auto & interactionModel : interactionModels_)
157  {
158  interactionModel->registerProducts(*this);
159  }
160  produces<edm::PCaloHitContainer>("EcalHitsEB");
161  produces<edm::PCaloHitContainer>("EcalHitsEE");
162  produces<edm::PCaloHitContainer>("EcalHitsES");
163  produces<edm::PCaloHitContainer>("HcalHits");
164  produces<edm::SimTrackContainer>("MuonSimTracks");
165 }
std::map< std::string, fastsim::InteractionModel * > interactionModelMap_
Each interaction model has a unique name.
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.
fastsim::Decayer decayer_
Handles decays of non-stable particles using pythia.
double beamPipeRadius_
The radius of the beampipe.
std::vector< std::string > getParameterNames() const
void setfixLongLivedBug(bool disable)
Definition: Decayer.h:53
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 70 of file FastSimProducer.cc.

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

70 {;}

Member Function Documentation

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

Definition at line 168 of file FastSimProducer.cc.

References _randomEngine, and triggerObjects_cff::id.

Referenced by ~FastSimProducer().

169 {
170  _randomEngine = std::make_unique<RandomEngineAndDistribution>(id);
171 }
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 407 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().

408 {
409  FSimTrack myFSimTrack(particle->pdgId(),
410  particleManager->getSimTrack(particle->simTrackIndex()).momentum(),
411  particle->simVertexIndex(),
412  particle->genParticleIndex(),
413  particle->simTrackIndex(),
414  particle->charge(),
415  particle->position(),
416  particle->momentum(),
417  particleManager->getSimVertex(particle->simVertexIndex()));
418 
419  // move the particle through the caloLayers
420  fastsim::LayerNavigator caloLayerNavigator(caloGeometry_);
421  const fastsim::SimplifiedGeometry * caloLayer = nullptr;
422 
423  // moveParticleToNextLayer(..) returns 0 in case that particle decays
424  // in this case particle is propagated up to its decay vertex
425  while(caloLayerNavigator.moveParticleToNextLayer(*particle,caloLayer))
426  {
427  LogDebug(MESSAGECATEGORY) << " moved to next caloLayer: " << *caloLayer;
428  LogDebug(MESSAGECATEGORY) << " new state: " << *particle;
429 
430  // break after 25 ns: only happens for particles stuck in loops
431  if(particle->position().T() > 50)
432  {
433  caloLayer = nullptr;
434  break;
435  }
436 
438  // Define ParticlePropagators (RawParticle) needed for CalorimetryManager and save them
440 
441  RawParticle PP = makeParticle(&particleTable,
442  particle->pdgId(),
443  particle->momentum(),
444  particle->position());
445 
446  // no material
447  if(caloLayer->getThickness(particle->position(), particle->momentum()) < 1E-10)
448  {
449  // unfortunately needed for CalorimetryManager
451  if(!myFSimTrack.onEcal())
452  {
453  myFSimTrack.setEcal(PP, 0);
454  }
455  }
456  else if(caloLayer->getCaloType() == fastsim::SimplifiedGeometry::HCAL){
457  if(!myFSimTrack.onHcal())
458  {
459  myFSimTrack.setHcal(PP, 0);
460  }
461  }
462  else if(caloLayer->getCaloType() == fastsim::SimplifiedGeometry::VFCAL){
463  if(!myFSimTrack.onVFcal())
464  {
465  myFSimTrack.setVFcal(PP, 0);
466  }
467  }
468 
469  // not necessary to continue propagation
471  {
472  myFSimTrack.setGlobal();
473  caloLayer = nullptr;
474  break;
475  }
476 
477  continue;
478  }
479 
480  // Stupid variable used by the old propagator
481  // For details check BaseParticlePropagator.h
482  int success = 0;
483  if(caloLayer->isForward())
484  {
485  success = 2;
486  // particle moves inwards
487  if(particle->position().Z() * particle->momentum().Z() < 0)
488  {
489  success *= -1;
490  }
491  }
492  else
493  {
494  success = 1;
495  // particle moves inwards
496  if(particle->momentum().X() * particle->position().X() + particle->momentum().Y() * particle->position().Y() < 0)
497  {
498  success *= -1;
499  }
500  }
501 
502  // Save the hit
504  {
505  if(!myFSimTrack.onLayer1())
506  {
507  myFSimTrack.setLayer1(PP, success);
508  }
509  }
510 
512  {
513  if(!myFSimTrack.onLayer2())
514  {
515  myFSimTrack.setLayer2(PP, success);
516  }
517  }
518 
520  {
521  if(!myFSimTrack.onEcal())
522  {
523  myFSimTrack.setEcal(PP, success);
524  }
525  }
526 
528  {
529  if(!myFSimTrack.onHcal())
530  {
531  myFSimTrack.setHcal(PP, success);
532  }
533  }
534 
536  {
537  if(!myFSimTrack.onVFcal())
538  {
539  myFSimTrack.setVFcal(PP, success);
540  }
541  }
542 
543  // Particle reached end of detector
545  {
546  myFSimTrack.setGlobal();
547  caloLayer = nullptr;
548  break;
549  }
550 
551  LogDebug(MESSAGECATEGORY) << "--------------------------------"
552  << "\n-------------------------------";
553  }
554 
555  // do decays
556  // don't have to worry about daughters if particle already within the calorimetry
557  // since they will be rejected by the vertex cut of the ParticleFilter
558  if(!particle->isStable() && particle->remainingProperLifeTimeC() < 1E-10)
559  {
560  LogDebug(MESSAGECATEGORY) << "Decaying particle...";
561  std::vector<std::unique_ptr<fastsim::Particle> > secondaries;
562  decayer_.decay(*particle,secondaries, _randomEngine->theEngine());
563  LogDebug(MESSAGECATEGORY) << " decay has " << secondaries.size() << " products";
564  particleManager->addSecondaries(particle->position(), particle->simTrackIndex(),secondaries);
565  }
566 
567  return myFSimTrack;
568 }
#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:34
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 401 of file FastSimProducer.cc.

References _randomEngine.

Referenced by ~FastSimProducer().

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

Definition at line 174 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(), watchCaloGeometry_, and watchCaloTopology_.

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

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

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

double FastSimProducer::beamPipeRadius_
private

The radius of the beampipe.

Definition at line 81 of file FastSimProducer.cc.

Referenced by produce().

fastsim::Geometry FastSimProducer::caloGeometry_
private

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

Definition at line 80 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(), FastSimProducer(), and produce().

double FastSimProducer::deltaRchargedMother_
private

Cut on deltaR for ClosestChargedDaughter algorithm (FastSim tracking)

Definition at line 82 of file FastSimProducer.cc.

Referenced by produce().

bool FastSimProducer::fixLongLivedBug_
private

Definition at line 97 of file FastSimProducer.cc.

Referenced by FastSimProducer(), and produce().

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

Token to get the genParticles.

Definition at line 78 of file FastSimProducer.cc.

Referenced by produce().

fastsim::Geometry FastSimProducer::geometry_
private

The definition of the tracker according to python config.

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

Referenced by FastSimProducer(), and produce().

fastsim::ParticleFilter FastSimProducer::particleFilter_
private

Decides which particles have to be propagated.

Definition at line 83 of file FastSimProducer.cc.

Referenced by produce().

bool FastSimProducer::simulateCalorimetry
private

Definition at line 86 of file FastSimProducer.cc.

Referenced by FastSimProducer(), and produce().

bool FastSimProducer::simulateMuons
private

Definition at line 90 of file FastSimProducer.cc.

Referenced by produce().

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

Definition at line 87 of file FastSimProducer.cc.

Referenced by produce().

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

Definition at line 88 of file FastSimProducer.cc.

Referenced by produce().