CMS 3D CMS Logo

FastSimProducer.cc
Go to the documentation of this file.
1 // system include files
2 #include <memory>
3 #include <string>
4 
5 // framework
17 
18 // data formats
25 
26 // fastsim
38 
39 // Hack for calorimetry
47 
48 
49 
51 // Author: L. Vanelderen, S. Kurz
52 // Date: 29 May 2017
54 
55 
57 
68  public:
69  explicit FastSimProducer(const edm::ParameterSet&);
70  ~FastSimProducer() override{;}
71 
72  private:
73  void beginStream(edm::StreamID id) override;
74  void produce(edm::Event&, const edm::EventSetup&) override;
75  void endStream() override;
76  virtual FSimTrack createFSimTrack(fastsim::Particle* particle, fastsim::ParticleManager* particleManager, HepPDT::ParticleDataTable const& particleTable);
77 
81  double beamPipeRadius_;
84  std::unique_ptr<RandomEngineAndDistribution> _randomEngine;
85 
89  std::unique_ptr<CalorimetryManager> myCalorimetry; // unfortunately, default constructor cannot be called
91 
93  std::vector<std::unique_ptr<fastsim::InteractionModel> > interactionModels_;
94  std::map<std::string, fastsim::InteractionModel *> interactionModelMap_;
96 
98 };
99 
100 const std::string FastSimProducer::MESSAGECATEGORY = "FastSimulation";
101 
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"))
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 }
166 
167 void
169 {
170  _randomEngine = std::make_unique<RandomEngineAndDistribution>(id);
171 }
172 
173 void
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 }
399 
400 void
402 {
403  _randomEngine.reset();
404 }
405 
406 FSimTrack
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 }
569 
#define LogDebug(id)
void beginStream(edm::StreamID id) override
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_
T getParameter(std::string const &) const
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.
The core class of the new SimplifiedGeometryPropagator.
Implementation of a generic detector layer (base class for forward/barrel layers).
const math::XYZTLorentzVector & position() const
Return position of the particle.
Definition: Particle.h:142
int onLayer2() const
Definition: FSimTrack.h:101
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)
def create(alignables, pedeDump, additionalData, outputFile, config)
HepPDT::ParticleDataTable ParticleDataTable
bool getByToken(EDGetToken token, Handle< PROD > &result) const
Definition: Event.h:517
fastsim::Geometry geometry_
The definition of the tracker according to python config.
#define nullptr
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
edm::EDGetTokenT< edm::HepMCProduct > genParticlesToken_
Token to get the genParticles.
void setEcal(const RawParticle &pp, int success)
Set the ecal variables.
Definition: FSimTrack.cc:81
fastsim::Decayer decayer_
Handles decays of non-stable particles using pythia.
void setGlobal()
particle did not decay before more detectors (useful for newProducer)
Definition: FSimTrack.h:156
virtual bool isForward() const =0
Returns false/true depending if the object is a (non-abstract) barrel/forward layer.
virtual FSimTrack createFSimTrack(fastsim::Particle *particle, fastsim::ParticleManager *particleManager, HepPDT::ParticleDataTable const &particleTable)
void setLayer2(const RawParticle &pp, int success)
Set the preshower layer2 variables.
Definition: FSimTrack.cc:74
int pdgId() const
Return pdgId of the particle.
Definition: Particle.h:136
bool moveParticleToNextLayer(Particle &particle, const SimplifiedGeometry *&layer)
Move particle along its trajectory to the next intersection with any of the tracker layers...
const SimVertex getSimVertex(unsigned i)
Returns the position of a given SimVertex. Needed for interfacing the code with the old calorimetry...
int onEcal() const
Definition: FSimTrack.h:106
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
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.
int simVertexIndex() const
Return index of the origin vertex.
Definition: Particle.h:161
~FastSimProducer() override
int iEvent
Definition: GenABIO.cc:224
void setLayer1(const RawParticle &pp, int success)
Set the preshower layer1 variables.
Definition: FSimTrack.cc:67
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
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
int onVFcal() const
Definition: FSimTrack.h:116
void addSecondaries(const math::XYZTLorentzVector &vertexPosition, int motherSimTrackId, std::vector< std::unique_ptr< Particle > > &secondaries, const SimplifiedGeometry *layer=nullptr)
Adds secondaries that are produced by any of the interactions (or particle decay) to the buffer...
double beamPipeRadius_
The radius of the beampipe.
std::vector< std::string > getParameterNames() const
void decay(const Particle &particle, std::vector< std::unique_ptr< Particle > > &secondaries, CLHEP::HepRandomEngine &engine) const
Decay particle using pythia.
Definition: Decayer.cc:34
int simTrackIndex() const
Return index of the SimTrack.
Definition: Particle.h:155
void produce(edm::Event &, const edm::EventSetup &) override
const HepMC::GenEvent * GetEvent() const
Definition: HepMCProduct.h:38
edm::ESWatcher< CaloTopologyRecord > watchCaloTopology_
void setfixLongLivedBug(bool disable)
Definition: Decayer.h:53
double charge() const
Return charge of the particle.
Definition: Particle.h:139
std::vector< SimVertex > SimVertexContainer
FastSimProducer(const edm::ParameterSet &)
virtual const double getThickness(const math::XYZTLorentzVector &position) const =0
Return thickness of the layer at a given position.
Definition the tracker geometry (vectors of forward/barrel layers).
Definition: Geometry.h:34
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
Implementation of non-stable particle decays.
Definition: Decayer.h:37
HLT enums.
T get() const
Definition: EventSetup.h:71
int onLayer1() const
Definition: FSimTrack.h:96
bool isStable() const
Returns true if particle is considered stable.
Definition: Particle.h:175
int onHcal() const
Definition: FSimTrack.h:111
void setVFcal(const RawParticle &pp, int success)
Set the hcal variables.
Definition: FSimTrack.cc:95
const math::XYZTLorentzVector & momentum() const
Return momentum of the particle.
Definition: Particle.h:145
(Kinematic) cuts on the particles that are propagated.
void setHcal(const RawParticle &pp, int success)
Set the hcal variables.
Definition: FSimTrack.cc:88
Definition of a generic FastSim Particle which can be propagated through the detector (formerly Parti...
Definition: Particle.h:19
void endStream() override
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
T get(const Candidate &c)
Definition: component.h:55