45 typedef std::pair<const GeomDet*, TrajectoryStateOnSurface>
DetWithState;
71 std::vector<std::unique_ptr<Particle>>& secondaries,
93 double layerThickness,
124 simHitContainer_ = std::make_unique<edm::PSimHitContainer>();
129 std::vector<std::unique_ptr<Particle>>& secondaries,
138 if (!doHitsFromInboundParticles_) {
170 if (particle.
charge() == 0) {
177 if (particle.
momentum().Perp2() < minMomentum_ * minMomentum_) {
202 std::map<double, std::unique_ptr<PSimHit>> distAndHits;
209 int pdgId = particle.
pdgId();
214 for (
const auto& detectorWithState : compatibleDetectors) {
215 const GeomDet& detector = *detectorWithState.first;
220 std::pair<double, std::unique_ptr<PSimHit>> hitPair = createHitOnDetector(particleState,
227 if (hitPair.second) {
228 distAndHits.insert(distAndHits.end(),
std::move(hitPair));
232 for (
const auto component : detector.
components()) {
233 std::pair<double, std::unique_ptr<PSimHit>> hitPair =
234 createHitOnDetector(particleState,
241 if (hitPair.second) {
242 distAndHits.insert(distAndHits.end(),
std::move(hitPair));
249 for (std::map<
double, std::unique_ptr<PSimHit>>::const_iterator it = distAndHits.begin(); it != distAndHits.end();
251 simHitContainer_->push_back(*(it->second));
259 double layerThickness,
280 std::pair<bool, double>
path = crossing.pathLength(detector.
surface());
289 return std::pair<double, std::unique_ptr<PSimHit>>(0, std::unique_ptr<PSimHit>(
nullptr));
296 double pZ = localMomentum.
z();
298 LocalPoint exit = localPosition + (halfThick / pZ) * localMomentum;
302 double boundX = detectorPlane.
bounds().
width() / 2.;
306 if (subdet == 4 || subdet == 6)
307 boundX *= 1. - localPosition.
y() / detectorPlane.
position().
perp();
308 if (fabs(localPosition.
x()) > boundX || fabs(localPosition.
y()) > boundY) {
309 return std::pair<double, std::unique_ptr<PSimHit>>(0, std::unique_ptr<PSimHit>(
nullptr));
316 eLoss *= (2. * halfThick - 0.003) / (9.36 * layerThickness);
321 return std::pair<double, std::unique_ptr<PSimHit>>((hitPos - refPos).
mag(),
322 std::make_unique<PSimHit>(
entry,
330 localMomentum.
theta(),
331 localMomentum.
phi()));
GlobalPoint toGlobal(const Point2DBase< Scalar, LocalTag > lp) const
virtual const BoundSurface & surface() const =0
The surface of the GeometricSearchDet.
OrphanHandle< PROD > put(std::unique_ptr< PROD > product)
Put a new product.
TrackerSimHitProducer(const std::string &name, const edm::ParameterSet &cfg)
Constructor.
Implementation of a generic detector layer (base class for forward/barrel layers).
virtual const double getMagneticFieldZ(const math::XYZTLorentzVector &position) const =0
Return magnetic field (field only has Z component!) on the layer.
virtual float length() const =0
const math::XYZTLorentzVector & position() const
Return position of the particle.
virtual ConstReferenceCountingPointer< TangentPlane > tangentPlane(const GlobalPoint &) const =0
virtual const double getThickness(const math::XYZTLorentzVector &position) const =0
Return thickness of the layer at a given position.
ProductRegistryHelper::BranchAliasSetterT< ProductType > produces()
void registerProducts(edm::ProducesCollector) const override
Register the SimHit collection.
T mag() const
The vector magnitude. Equivalent to sqrt(vec.mag2())
LocalPoint localPosition() const
Geom::Phi< T > phi() const
Global3DPoint GlobalPoint
constexpr uint32_t rawId() const
get the raw id
GlobalPoint globalPosition() const
LocalPoint toLocal(const GlobalPoint &gp) const
Conversion to the R.F. of the GeomDet.
static double constexpr speedOfLight
Speed of light [cm / ns].
const Bounds & bounds() const
virtual std::vector< const GeomDet * > components() const
Returns direct components, if any.
int pdgId() const
Return pdgId of the particle.
std::unique_ptr< edm::PSimHitContainer > simHitContainer_
The SimHit.
double isLooper() const
Check if this particle is about to do a loop in the tracker or the direction of the momentum is going...
const Plane & surface() const
The nominal surface of the GeomDet.
virtual std::vector< DetWithState > compatibleDets(const TrajectoryStateOnSurface &startingState, const Propagator &prop, const MeasurementEstimator &est) const
constexpr std::array< uint8_t, layerIndexSize > layer
Geom::Theta< T > theta() const
LocalVector localMomentum() const
virtual float thickness() const =0
~TrackerSimHitProducer() override
Default destructor.
Base class for any interaction model between a particle and a tracker layer.
Produces SimHits in the tracker layers.
void setLooper()
This particle is about to do a loop in the tracker or the direction of the momentum is going inwards...
bool doHitsFromInboundParticles_
If not set, incoming particles (negative speed relative to center of detector) don't create a SimHits...
std::pair< const GeomDet *, TrajectoryStateOnSurface > DetWithState
std::pair< double, std::unique_ptr< PSimHit > > createHitOnDetector(const TrajectoryStateOnSurface &particle, int pdgId, double layerThickness, double eLoss, int simTrackId, const GeomDet &detector, GlobalPoint &refPos)
Helper funtion to create the actual SimHit on a detector (sub-) module.
DetId geographicalId() const
The label of this GeomDet.
virtual bool isLeaf() const
is a Unit
int simTrackIndex() const
Return index of the SimTrack.
Vector3DBase unit() const
double minMomentum_
Set the minimal momentum of incoming particle.
virtual bool isForward() const =0
Returns false/true depending if the object is a (non-abstract) barrel/forward layer.
void storeProducts(edm::Event &iEvent) override
Store the SimHit collection.
double charge() const
Return charge of the particle.
T getParameter(std::string const &) const
void interact(Particle &particle, const SimplifiedGeometry &layer, std::vector< std::unique_ptr< Particle >> &secondaries, const RandomEngineAndDistribution &random) override
Perform the interaction.
const DetLayer * getDetLayer() const
Return pointer to the assigned active layer (if any).
GlobalVector globalMomentum() const
static int position[264][3]
double getEnergyDeposit() const
Return the energy the particle deposited in the tracker layer that was last hit (ionization).
const math::XYZTLorentzVector & momentum() const
Return momentum of the particle.
int getMotherSimTrackIndex() const
Get index of simTrack of mother particle (only makes sense if mother and daughter charged)...
#define DEFINE_EDM_PLUGIN(factory, type, name)
std::vector< PSimHit > PSimHitContainer
Definition of a generic FastSim Particle which can be propagated through the detector (formerly Parti...
virtual float width() const =0
const BasicVectorType & basicVector() const
const PositionType & position() const
void setEnergyDeposit(double energyDeposit)
Set the energy the particle deposited in the tracker layer that was last hit (ionization).
Global3DVector GlobalVector
const double onSurfaceTolerance_
Max distance between particle and active (sub-) module. Otherwise particle has to be propagated...
double transverseCurvature() const