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 
49 // Author: L. Vanelderen, S. Kurz
50 // Date: 29 May 2017
52 
54 
65 public:
66  explicit FastSimProducer(const edm::ParameterSet&);
67  ~FastSimProducer() override { ; }
68 
69 private:
70  void beginStream(edm::StreamID id) override;
71  void produce(edm::Event&, const edm::EventSetup&) override;
72  void endStream() override;
74  fastsim::ParticleManager* particleManager,
76 
80  double beamPipeRadius_;
83  std::unique_ptr<RandomEngineAndDistribution> _randomEngine;
84 
88  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_;
99 };
100 
101 const std::string FastSimProducer::MESSAGECATEGORY = "FastSimulation";
102 
104  : genParticlesToken_(consumes<edm::HepMCProduct>(iConfig.getParameter<edm::InputTag>("src"))),
105  geometry_(iConfig.getParameter<edm::ParameterSet>("trackerDefinition"), consumesCollector()),
106  caloGeometry_(iConfig.getParameter<edm::ParameterSet>("caloDefinition"), consumesCollector()),
107  beamPipeRadius_(iConfig.getParameter<double>("beamPipeRadius")),
108  deltaRchargedMother_(iConfig.getParameter<double>("deltaRchargedMother")),
109  particleFilter_(iConfig.getParameter<edm::ParameterSet>("particleFilter")),
110  _randomEngine(nullptr),
111  simulateCalorimetry(iConfig.getParameter<bool>("simulateCalorimetry")),
112  simulateMuons(iConfig.getParameter<bool>("simulateMuons")),
113  useFastSimsDecayer(iConfig.getParameter<bool>("useFastSimsDecayer")),
114  particleDataTableESToken_(esConsumes()) {
115  if (simulateCalorimetry) {
118  }
119 
120  //----------------
121  // define interaction models
122  //---------------
123 
124  const edm::ParameterSet& modelCfgs = iConfig.getParameter<edm::ParameterSet>("interactionModels");
125  for (const std::string& modelName : modelCfgs.getParameterNames()) {
126  const edm::ParameterSet& modelCfg = modelCfgs.getParameter<edm::ParameterSet>(modelName);
127  std::string modelClassName(modelCfg.getParameter<std::string>("className"));
128  // Use plugin-factory to create model
129  std::unique_ptr<fastsim::InteractionModel> interactionModel(
130  fastsim::InteractionModelFactory::get()->create(modelClassName, modelName, modelCfg));
131  if (!interactionModel.get()) {
132  throw cms::Exception("FastSimProducer") << "InteractionModel " << modelName << " could not be created";
133  }
134  // Add model to list
135  interactionModels_.push_back(std::move(interactionModel));
136  // and create the map
138  }
139 
140  //----------------
141  // calorimetry
142  //---------------
143 
144  if (simulateCalorimetry) {
145  myCalorimetry =
146  std::make_unique<CalorimetryManager>(nullptr,
147  iConfig.getParameter<edm::ParameterSet>("Calorimetry"),
148  iConfig.getParameter<edm::ParameterSet>("MaterialEffectsForMuonsInECAL"),
149  iConfig.getParameter<edm::ParameterSet>("MaterialEffectsForMuonsInHCAL"),
150  iConfig.getParameter<edm::ParameterSet>("GFlash"),
151  consumesCollector());
152  }
153 
154  //----------------
155  // register products
156  //----------------
157 
158  // SimTracks and SimVertices
159  produces<edm::SimTrackContainer>();
160  produces<edm::SimVertexContainer>();
161  // products of interaction models, i.e. simHits
162  for (auto& interactionModel : interactionModels_) {
163  interactionModel->registerProducts(producesCollector());
164  }
165  produces<edm::PCaloHitContainer>("EcalHitsEB");
166  produces<edm::PCaloHitContainer>("EcalHitsEE");
167  produces<edm::PCaloHitContainer>("EcalHitsES");
168  produces<edm::PCaloHitContainer>("HcalHits");
169  produces<edm::SimTrackContainer>("MuonSimTracks");
170 }
171 
173  _randomEngine = std::make_unique<RandomEngineAndDistribution>(id);
174 }
175 
177  LogDebug(MESSAGECATEGORY) << " produce";
178 
181 
182  // Define containers for SimTracks, SimVertices
183  std::unique_ptr<edm::SimTrackContainer> simTracks_(new edm::SimTrackContainer);
184  std::unique_ptr<edm::SimVertexContainer> simVertices_(new edm::SimVertexContainer);
185 
186  // Get the particle data table (in case lifetime or charge of GenParticles not set)
187  auto const& pdt = iSetup.getData(particleDataTableESToken_);
188 
189  // Get the GenParticle collection
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
205  if (simulateCalorimetry) {
206  //evaluate here since || short circuits and we want to be sure bother are updated
207  auto newGeom = watchCaloGeometry_.check(iSetup);
208  auto newTopo = watchCaloTopology_.check(iSetup);
209  if (newGeom || newTopo) {
210  auto const& pG = iSetup.getData(caloGeometryESToken_);
211  myCalorimetry->getCalorimeter()->setupGeometry(pG);
212 
213  auto const& theCaloTopology = iSetup.getData(caloTopologyESToken_);
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  LogDebug(MESSAGECATEGORY) << "################################"
228  << "\n###############################";
229 
230  // loop over particles
231  for (std::unique_ptr<fastsim::Particle> particle = particleManager.nextParticle(*_randomEngine); particle != nullptr;
232  particle = particleManager.nextParticle(*_randomEngine)) {
233  LogDebug(MESSAGECATEGORY) << "\n moving NEXT particle: " << *particle;
234 
235  // -----------------------------
236  // This condition is necessary because of hack for calorimetry
237  // -> The CalorimetryManager should also be implemented based on this new FastSim classes (Particle.h) in a future project.
238  // A second loop (below) loops over all parts of the calorimetry in order to create a track of the old FastSim class FSimTrack.
239  // The condition below (R<128, z<302) makes sure that the particle geometrically is outside the tracker boundaries
240  // -----------------------------
241 
242  if (particle->position().Perp2() < 128. * 128. && std::abs(particle->position().Z()) < 302.) {
243  // move the particle through the layers
244  fastsim::LayerNavigator layerNavigator(geometry_);
245  const fastsim::SimplifiedGeometry* layer = nullptr;
246 
247  // moveParticleToNextLayer(..) returns 0 in case that particle decays
248  // in this case particle is propagated up to its decay vertex
249  while (layerNavigator.moveParticleToNextLayer(*particle, layer)) {
250  LogDebug(MESSAGECATEGORY) << " moved to next layer: " << *layer;
251  LogDebug(MESSAGECATEGORY) << " new state: " << *particle;
252 
253  // Hack to interface "old" calo to "new" tracking
254  // Particle reached calorimetry so stop further propagation
255  if (layer->getCaloType() == fastsim::SimplifiedGeometry::TRACKERBOUNDARY) {
256  layer = nullptr;
257  // particle no longer is on a layer
258  particle->resetOnLayer();
259  break;
260  }
261 
262  // break after 25 ns: only happens for particles stuck in loops
263  if (particle->position().T() > 25) {
264  layer = nullptr;
265  // particle no longer is on a layer
266  particle->resetOnLayer();
267  break;
268  }
269 
270  // perform interaction between layer and particle
271  // do only if there is actual material
272  if (layer->getThickness(particle->position(), particle->momentum()) > 1E-10) {
273  int nSecondaries = 0;
274  // loop on interaction models
275  for (fastsim::InteractionModel* interactionModel : layer->getInteractionModels()) {
276  LogDebug(MESSAGECATEGORY) << " interact with " << *interactionModel;
277  std::vector<std::unique_ptr<fastsim::Particle> > secondaries;
278  interactionModel->interact(*particle, *layer, secondaries, *_randomEngine);
279  nSecondaries += secondaries.size();
280  particleManager.addSecondaries(particle->position(), particle->simTrackIndex(), secondaries, layer);
281  }
282 
283  // kinematic cuts: particle might e.g. lost all its energy
284  if (!particleFilter_.acceptsEn(*particle)) {
285  // Add endvertex if particle did not create any secondaries
286  if (nSecondaries == 0)
287  particleManager.addEndVertex(particle.get());
288  layer = nullptr;
289  break;
290  }
291  }
292 
293  LogDebug(MESSAGECATEGORY) << "--------------------------------"
294  << "\n-------------------------------";
295  }
296 
297  // do decays
298  if (!particle->isStable() && particle->remainingProperLifeTimeC() < 1E-10) {
299  LogDebug(MESSAGECATEGORY) << "Decaying particle...";
300  std::vector<std::unique_ptr<fastsim::Particle> > secondaries;
301  if (useFastSimsDecayer)
302  decayer_.decay(*particle, secondaries, _randomEngine->theEngine());
303  LogDebug(MESSAGECATEGORY) << " decay has " << secondaries.size() << " products";
304  particleManager.addSecondaries(particle->position(), particle->simTrackIndex(), secondaries);
305  continue;
306  }
307 
308  LogDebug(MESSAGECATEGORY) << "################################"
309  << "\n###############################";
310  }
311 
312  // -----------------------------
313  // Hack to interface "old" calorimetry with "new" propagation in tracker
314  // The CalorimetryManager has to know which particle could in principle hit which parts of the calorimeter
315  // I think it's a bit strange to propagate the particle even further (and even decay it) if it already hits
316  // some part of the calorimetry but this is how the code works...
317  // -----------------------------
318 
319  if (particle->position().Perp2() >= 128. * 128. || std::abs(particle->position().Z()) >= 302.) {
320  LogDebug(MESSAGECATEGORY) << "\n moving particle to calorimetry: " << *particle;
321 
322  // create FSimTrack (this is the object the old propagation uses)
323  myFSimTracks.push_back(createFSimTrack(particle.get(), &particleManager, pdt));
324  // particle was decayed
325  if (!particle->isStable() && particle->remainingProperLifeTimeC() < 1E-10) {
326  continue;
327  }
328 
329  LogDebug(MESSAGECATEGORY) << "################################"
330  << "\n###############################";
331  }
332 
333  // -----------------------------
334  // End Hack
335  // -----------------------------
336 
337  LogDebug(MESSAGECATEGORY) << "################################"
338  << "\n###############################";
339  }
340 
341  // store simTracks and simVertices
342  iEvent.put(std::move(simTracks_));
343  iEvent.put(std::move(simVertices_));
344  // store products of interaction models, i.e. simHits
345  for (auto& interactionModel : interactionModels_) {
346  interactionModel->storeProducts(iEvent);
347  }
348 
349  // -----------------------------
350  // Calorimetry Manager
351  // -----------------------------
352  if (simulateCalorimetry) {
353  for (auto myFSimTrack : myFSimTracks) {
354  myCalorimetry->reconstructTrack(myFSimTrack, _randomEngine.get());
355  }
356  }
357 
358  // -----------------------------
359  // Store Hits
360  // -----------------------------
361  std::unique_ptr<edm::PCaloHitContainer> p4(new edm::PCaloHitContainer);
362  std::unique_ptr<edm::PCaloHitContainer> p5(new edm::PCaloHitContainer);
363  std::unique_ptr<edm::PCaloHitContainer> p6(new edm::PCaloHitContainer);
364  std::unique_ptr<edm::PCaloHitContainer> p7(new edm::PCaloHitContainer);
365 
366  std::unique_ptr<edm::SimTrackContainer> m1(new edm::SimTrackContainer);
367 
368  if (simulateCalorimetry) {
369  myCalorimetry->loadFromEcalBarrel(*p4);
370  myCalorimetry->loadFromEcalEndcap(*p5);
371  myCalorimetry->loadFromPreshower(*p6);
372  myCalorimetry->loadFromHcal(*p7);
373  if (simulateMuons) {
374  myCalorimetry->harvestMuonSimTracks(*m1);
375  }
376  }
377  iEvent.put(std::move(p4), "EcalHitsEB");
378  iEvent.put(std::move(p5), "EcalHitsEE");
379  iEvent.put(std::move(p6), "EcalHitsES");
380  iEvent.put(std::move(p7), "HcalHits");
381  iEvent.put(std::move(m1), "MuonSimTracks");
382 }
383 
385 
387  fastsim::ParticleManager* particleManager,
389  FSimTrack myFSimTrack(particle->pdgId(),
390  particleManager->getSimTrack(particle->simTrackIndex()).momentum(),
391  particle->simVertexIndex(),
392  particle->genParticleIndex(),
393  particle->simTrackIndex(),
394  particle->charge(),
395  particle->position(),
396  particle->momentum(),
397  particleManager->getSimVertex(particle->simVertexIndex()));
398 
399  // move the particle through the caloLayers
400  fastsim::LayerNavigator caloLayerNavigator(caloGeometry_);
401  const fastsim::SimplifiedGeometry* caloLayer = nullptr;
402 
403  // moveParticleToNextLayer(..) returns 0 in case that particle decays
404  // in this case particle is propagated up to its decay vertex
405  while (caloLayerNavigator.moveParticleToNextLayer(*particle, caloLayer)) {
406  LogDebug(MESSAGECATEGORY) << " moved to next caloLayer: " << *caloLayer;
407  LogDebug(MESSAGECATEGORY) << " new state: " << *particle;
408 
409  // break after 25 ns: only happens for particles stuck in loops
410  if (particle->position().T() > 50) {
411  caloLayer = nullptr;
412  break;
413  }
414 
416  // Define ParticlePropagators (RawParticle) needed for CalorimetryManager and save them
418 
419  RawParticle PP = makeParticle(&particleTable, particle->pdgId(), particle->momentum(), particle->position());
420 
421  // no material
422  if (caloLayer->getThickness(particle->position(), particle->momentum()) < 1E-10) {
423  // unfortunately needed for CalorimetryManager
424  if (caloLayer->getCaloType() == fastsim::SimplifiedGeometry::ECAL) {
425  if (!myFSimTrack.onEcal()) {
426  myFSimTrack.setEcal(PP, 0);
427  }
428  } else if (caloLayer->getCaloType() == fastsim::SimplifiedGeometry::HCAL) {
429  if (!myFSimTrack.onHcal()) {
430  myFSimTrack.setHcal(PP, 0);
431  }
432  } else if (caloLayer->getCaloType() == fastsim::SimplifiedGeometry::VFCAL) {
433  if (!myFSimTrack.onVFcal()) {
434  myFSimTrack.setVFcal(PP, 0);
435  }
436  }
437 
438  // not necessary to continue propagation
439  if (caloLayer->getCaloType() == fastsim::SimplifiedGeometry::VFCAL) {
440  myFSimTrack.setGlobal();
441  caloLayer = nullptr;
442  break;
443  }
444 
445  continue;
446  }
447 
448  // Stupid variable used by the old propagator
449  // For details check BaseParticlePropagator.h
450  int success = 0;
451  if (caloLayer->isForward()) {
452  success = 2;
453  // particle moves inwards
454  if (particle->position().Z() * particle->momentum().Z() < 0) {
455  success *= -1;
456  }
457  } else {
458  success = 1;
459  // particle moves inwards
460  if (particle->momentum().X() * particle->position().X() + particle->momentum().Y() * particle->position().Y() <
461  0) {
462  success *= -1;
463  }
464  }
465 
466  // Save the hit
468  if (!myFSimTrack.onLayer1()) {
469  myFSimTrack.setLayer1(PP, success);
470  }
471  }
472 
474  if (!myFSimTrack.onLayer2()) {
475  myFSimTrack.setLayer2(PP, success);
476  }
477  }
478 
479  if (caloLayer->getCaloType() == fastsim::SimplifiedGeometry::ECAL) {
480  if (!myFSimTrack.onEcal()) {
481  myFSimTrack.setEcal(PP, success);
482  }
483  }
484 
485  if (caloLayer->getCaloType() == fastsim::SimplifiedGeometry::HCAL) {
486  if (!myFSimTrack.onHcal()) {
487  myFSimTrack.setHcal(PP, success);
488  }
489  }
490 
491  if (caloLayer->getCaloType() == fastsim::SimplifiedGeometry::VFCAL) {
492  if (!myFSimTrack.onVFcal()) {
493  myFSimTrack.setVFcal(PP, success);
494  }
495  }
496 
497  // Particle reached end of detector
498  if (caloLayer->getCaloType() == fastsim::SimplifiedGeometry::VFCAL) {
499  myFSimTrack.setGlobal();
500  caloLayer = nullptr;
501  break;
502  }
503 
504  LogDebug(MESSAGECATEGORY) << "--------------------------------"
505  << "\n-------------------------------";
506  }
507 
508  // do decays
509  // don't have to worry about daughters if particle already within the calorimetry
510  // since they will be rejected by the vertex cut of the ParticleFilter
511  if (!particle->isStable() && particle->remainingProperLifeTimeC() < 1E-10) {
512  LogDebug(MESSAGECATEGORY) << "Decaying particle...";
513  std::vector<std::unique_ptr<fastsim::Particle> > secondaries;
514  if (useFastSimsDecayer)
515  decayer_.decay(*particle, secondaries, _randomEngine->theEngine());
516  LogDebug(MESSAGECATEGORY) << " decay has " << secondaries.size() << " products";
517  particleManager->addSecondaries(particle->position(), particle->simTrackIndex(), secondaries);
518  }
519 
520  return myFSimTrack;
521 }
522 
void beginStream(edm::StreamID id) override
std::vector< std::unique_ptr< fastsim::InteractionModel > > interactionModels_
All defined interaction models.
edm::ESWatcher< CaloGeometryRecord > watchCaloGeometry_
bool isStable() const
Returns true if particle is considered stable.
Definition: Particle.h:171
ESGetTokenH3DDVariant esConsumes(std::string const &Record, edm::ConsumesCollector &)
Definition: DeDxTools.cc:283
T getParameter(std::string const &) const
Definition: ParameterSet.h:307
CaloType getCaloType() const
Hack to interface "old" Calorimetry with "new" Tracker.
std::vector< PCaloHit > PCaloHitContainer
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).
T const & getData(const ESGetToken< T, R > &iToken) const noexcept(false)
Definition: EventSetup.h:119
void update(const edm::EventSetup &iSetup, const std::map< std::string, InteractionModel *> &interactionModelMap)
Initializes the tracker geometry.
Definition: Geometry.cc:55
virtual const double getThickness(const math::XYZTLorentzVector &position) const =0
Return thickness of the layer at a given position.
Handles/tracks (possible) intersections of particle&#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
fastsim::Geometry geometry_
The definition of the tracker according to python config.
void decay(const Particle &particle, std::vector< std::unique_ptr< Particle > > &secondaries, CLHEP::HepRandomEngine &engine) const
Decay particle using pythia.
Definition: Decayer.cc:29
edm::EDGetTokenT< edm::HepMCProduct > genParticlesToken_
Token to get the genParticles.
void setEcal(const RawParticle &pp, int success)
Set the ecal variables.
Definition: FSimTrack.cc:118
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:161
const math::XYZTLorentzVector & position() const
Return position of the particle.
Definition: Particle.h:140
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:112
int onHcal() const
Definition: FSimTrack.h:116
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...
double remainingProperLifeTimeC() const
Return the particle&#39;s remaining proper lifetime[in ct].
Definition: Particle.h:150
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:28
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.
~FastSimProducer() override
const edm::ESGetToken< HepPDT::ParticleDataTable, edm::DefaultRecord > particleDataTableESToken_
int iEvent
Definition: GenABIO.cc:224
void setLayer1(const RawParticle &pp, int success)
Set the preshower layer1 variables.
Definition: FSimTrack.cc:106
edm::ESGetToken< CaloGeometry, CaloGeometryRecord > caloGeometryESToken_
Abs< T >::type abs(const T &t)
Definition: Abs.h:22
int onLayer2() const
Definition: FSimTrack.h:106
#define DEFINE_FWK_MODULE(type)
Definition: MakerMacros.h:16
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...
int onLayer1() const
Definition: FSimTrack.h:101
double beamPipeRadius_
The radius of the beampipe.
int simTrackIndex() const
Return index of the SimTrack.
Definition: Particle.h:153
int onVFcal() const
Definition: FSimTrack.h:121
int onEcal() const
Definition: FSimTrack.h:111
void produce(edm::Event &, const edm::EventSetup &) override
int simVertexIndex() const
Return index of the origin vertex.
Definition: Particle.h:159
bool acceptsEn(const Particle &particle) const
Kinematic cuts on the particle.
int pdgId() const
Return pdgId of the particle.
Definition: Particle.h:134
edm::ESWatcher< CaloTopologyRecord > watchCaloTopology_
virtual bool isForward() const =0
Returns false/true depending if the object is a (non-abstract) barrel/forward layer.
edm::ESGetToken< CaloTopology, CaloTopologyRecord > caloTopologyESToken_
std::vector< SimVertex > SimVertexContainer
const math::XYZTLorentzVector & momentum() const
Return momentum of the particle.
Definition: Particle.h:143
FastSimProducer(const edm::ParameterSet &)
Definition the tracker geometry (vectors of forward/barrel layers).
Definition: Geometry.h:30
double getMagneticFieldZ(const math::XYZTLorentzVector &position) const
Initializes the tracker geometry.
Definition: Geometry.cc:156
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:57
double charge() const
Return charge of the particle.
Definition: Particle.h:137
Implementation of non-stable particle decays.
Definition: Decayer.h:35
HLT enums.
void setVFcal(const RawParticle &pp, int success)
Set the hcal variables.
Definition: FSimTrack.cc:130
(Kinematic) cuts on the particles that are propagated.
void setHcal(const RawParticle &pp, int success)
Set the hcal variables.
Definition: FSimTrack.cc:124
#define get
Definition of a generic FastSim Particle which can be propagated through the detector (formerly Parti...
Definition: Particle.h:16
void endStream() override
std::vector< SimTrack > SimTrackContainer
std::vector< std::string > getParameterNames() const
fastsim::ParticleFilter particleFilter_
Decides which particles have to be propagated.
def move(src, dest)
Definition: eostools.py:511
int genParticleIndex() const
Return index of the particle in the genParticle vector.
Definition: Particle.h:165
#define LogDebug(id)