3 #include "HepMC/GenEvent.h" 4 #include "HepMC/Units.h" 5 #include "HepPDT/ParticleDataTable.hh" 19 double beamPipeRadius,
20 double deltaRchargedMother,
25 bool useFastSimsDecayer)
26 : genEvent_(&genEvent),
27 genParticleIterator_(genEvent_->particles_begin()),
28 genParticleEnd_(genEvent_->particles_end()),
30 particleDataTable_(&particleDataTable),
31 beamPipeRadius2_(beamPipeRadius * beamPipeRadius),
32 deltaRchargedMother_(deltaRchargedMother),
33 particleFilter_(&particleFilter),
34 simTracks_(&simTracks),
35 simVertices_(&simVertices),
36 fixLongLivedBug_(fixLongLivedBug),
37 useFastSimsDecayer_(useFastSimsDecayer)
47 momentumUnitConversionFactor_(conversion_factor(genEvent_->momentum_unit(),
HepMC::Units::GEV)),
48 lengthUnitConversionFactor_(conversion_factor(genEvent_->length_unit(),
HepMC::Units::LengthUnit::CM)),
49 lengthUnitConversionFactor2_(lengthUnitConversionFactor_ * lengthUnitConversionFactor_),
54 if (genEvent.vertices_begin() !=
genEvent_->vertices_end()) {
55 const HepMC::FourVector&
position = (*genEvent.vertices_begin())->
position();
67 std::unique_ptr<fastsim::Particle> particle;
87 if (!particle->remainingProperLifeTimeIsSet() || !particle->chargeIsSet()) {
93 particle->setRemainingProperLifeTimeC(0.);
94 particle->setCharge(0.);
98 if (!particle->remainingProperLifeTimeIsSet()) {
101 double width = particleData->totalWidth().value();
102 if (width > 1.0
e-35) {
103 particle->setRemainingProperLifeTimeC(-
log(random.
flatShoot()) * 6.582119
e-25 / width / 10.);
105 particle->setStable();
110 if (!particle->chargeIsSet()) {
111 particle->setCharge(particleData->charge());
116 unsigned simTrackIndex =
addSimTrack(particle.get());
117 particle->setSimTrackIndex(simTrackIndex);
124 int parentSimTrackIndex,
125 std::vector<std::unique_ptr<Particle> >& secondaries,
133 if (secondaries.empty()) {
138 unsigned simVertexIndex =
addSimVertex(vertexPosition, parentSimTrackIndex);
142 double distMin = 99999.;
145 for (
auto& secondary : secondaries) {
147 if (secondary->getMotherDeltaR() != -1) {
150 secondary->resetMother();
152 if (secondary->getMotherDeltaR() < distMin) {
153 distMin = secondary->getMotherDeltaR();
162 for (
auto& secondary : secondaries) {
166 if (secondary->getMotherDeltaR() != -1 && idx != idxMin) {
167 secondary->resetMother();
172 secondary->setSimVertexIndex(simVertexIndex);
188 simVertices_->emplace_back(position.Vect(), position.T(), parentSimTrackIndex, simVertexIndex);
189 return simVertexIndex;
197 return simTrackIndex;
211 const HepMC::GenVertex* productionVertex = particle.production_vertex();
212 const HepMC::GenVertex* endVertex = particle.end_vertex();
215 if (!productionVertex) {
218 if (
std::abs(particle.pdg_id()) < 10 ||
std::abs(particle.pdg_id()) == 21) {
222 int exoticRelativeId = 0;
223 const bool producedWithinBeamPipe =
233 const bool decayedWithinBeamPipe =
235 if (decayedWithinBeamPipe) {
245 std::unique_ptr<Particle> newParticle(
257 newParticle->setMotherPdgId(exoticRelativeId);
262 double labFrameLifeTime =
264 newParticle->setRemainingProperLifeTimeC(labFrameLifeTime / newParticle->gamma() *
270 bool foundVtx =
false;
272 if (
std::abs(simVtx.position().x() - newParticle->position().x()) < 1E-3 &&
273 std::abs(simVtx.position().y() - newParticle->position().y()) < 1E-3 &&
274 std::abs(simVtx.position().z() - newParticle->position().z()) < 1E-3) {
275 newParticle->setSimVertexIndex(simVtx.vertexId());
281 newParticle->setSimVertexIndex(
addSimVertex(newParticle->position(), -1));
290 return std::unique_ptr<Particle>();
294 int& exoticRelativeId_,
296 if (ngendepth > 99 || exoticRelativeId_ == -1 ||
isExotic(
std::abs(exoticRelativeId_)))
299 std::vector<HepMC::GenParticle*>::const_iterator relativesIterator_ = originVertex->particles_in_const_begin();
300 std::vector<HepMC::GenParticle*>::const_iterator relativesIteratorEnd_ = originVertex->particles_in_const_end();
301 for (; relativesIterator_ != relativesIteratorEnd_; ++relativesIterator_) {
304 exoticRelativeId_ = genRelative.pdg_id();
305 if (ngendepth == 100)
306 exoticRelativeId_ = -1;
309 const HepMC::GenVertex* vertex_ = genRelative.production_vertex();
Implementation of a generic detector layer (base class for forward/barrel layers).
const math::XYZTLorentzVector & position() const
Return position of the particle.
double flatShoot(double xmin=0.0, double xmax=1.0) const
HepPDT::ParticleDataTable ParticleDataTable
const double deltaRchargedMother_
For FastSim (cheat) tracking: cut on the angle between a charged mother and charged daughter...
bool accepts(const Particle &particle) const
Check all if all criteria are fullfilled.
const ParticleFilter *const particleFilter_
(Kinematic) cuts on the particles that have to be propagated.
int genParticleIndex() const
Return index of the particle in the genParticle vector.
double momentumUnitConversionFactor_
Convert Pythia units to GeV (FastSim standard).
std::vector< std::unique_ptr< Particle > > particleBuffer_
The vector of all secondaries that are not yet propagated in the event.
static double constexpr speedOfLight
Speed of light [cm / ns].
virtual bool isForward() const =0
Returns false/true depending if the object is a (non-abstract) barrel/forward layer.
HepMC::GenEvent::particle_const_iterator genParticleIterator_
Iterator to keep track on which GenParticles where already considered.
int pdgId() const
Return pdgId of the particle.
const HepMC::GenEvent *const genEvent_
The GenEvent.
const HepMC::GenEvent::particle_const_iterator genParticleEnd_
The last particle of the GenEvent.
double lengthUnitConversionFactor2_
Convert Pythia units to cm^2 (FastSim standard).
unsigned addSimTrack(const Particle *particle)
Add a simTrack (simTrack contains some basic info about the particle, e.g. pdgId).
XYZTLorentzVectorD XYZTLorentzVector
Lorentz vector with cylindrical internal representation using pseudorapidity.
int simVertexIndex() const
Return index of the origin vertex.
const double beamPipeRadius2_
(Radius of the beampipe)^2
bool isExotic(int pdgid_)
~ParticleManager()
Default destructor.
Abs< T >::type abs(const T &t)
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...
std::unique_ptr< Particle > nextParticle(const RandomEngineAndDistribution &random)
Returns the next particle that has to be propagated (secondary or genParticle).
void exoticRelativesChecker(const HepMC::GenVertex *originVertex, int &hasExoticAssociation, int ngendepth)
HepPDT::ParticleData ParticleData
int simTrackIndex() const
Return index of the SimTrack.
std::vector< SimTrack > * simTracks_
The generated SimTrack of this event.
ParticleManager(const HepMC::GenEvent &genEvent, const HepPDT::ParticleDataTable &particleDataTable, double beamPipeRadius, double deltaRchargedMother, const ParticleFilter &particleFilter, std::vector< SimTrack > &simTracks, std::vector< SimVertex > &simVertices, bool fixLongLivedBug, bool useFastSimsDecayer)
Constructor.
std::unique_ptr< Particle > nextGenParticle()
Returns next particle from the GenEvent that has to be propagated.
double lengthUnitConversionFactor_
Convert Pythia units to cm (FastSim standard).
const HepPDT::ParticleDataTable *const particleDataTable_
Necessary to get information like lifetime and charge of a particle if unknown.
double timeUnitConversionFactor_
Convert Pythia units to ns (FastSim standard).
int index() const
Return index of this layer (layers are numbered according to their position in the detector)...
static int position[264][3]
std::vector< SimVertex > * simVertices_
The generated SimVertices of this event.
const math::XYZTLorentzVector & momentum() const
Return momentum of the particle.
(Kinematic) cuts on the particles that are propagated.
Definition of a generic FastSim Particle which can be propagated through the detector (formerly Parti...
int genParticleIndex_
Index of particle in the GenEvent (if it is a GenParticle)
unsigned addSimVertex(const math::XYZTLorentzVector &position, int motherIndex)
Add a simVertex (simVertex contains information about the track it was produced). ...
unsigned addEndVertex(const Particle *particle)
Necessary to add an end vertex to a particle.
bool acceptsVtx(const math::XYZTLorentzVector &originVertexPosition) const
Vertex within tracker volume.