43 typedef std::pair<const GeomDet*, TrajectoryStateOnSurface>
DetWithState;
69 std::vector<std::unique_ptr<Particle>>& secondaries,
91 double layerThickness,
127 std::vector<std::unique_ptr<Particle>>& secondaries,
168 if (particle.
charge() == 0) {
200 std::map<double, std::unique_ptr<PSimHit>> distAndHits;
212 for (
const auto& detectorWithState : compatibleDetectors) {
225 if (hitPair.second) {
226 distAndHits.insert(distAndHits.end(),
std::move(hitPair));
230 for (
const auto component : detector.
components()) {
231 std::pair<double, std::unique_ptr<PSimHit>> hitPair =
239 if (hitPair.second) {
240 distAndHits.insert(distAndHits.end(),
std::move(hitPair));
247 for (
std::map<
double, std::unique_ptr<PSimHit>>::const_iterator it = distAndHits.begin(); it != distAndHits.end();
257 double layerThickness,
278 std::pair<bool, double>
path = crossing.pathLength(detector.
surface());
287 return std::pair<double, std::unique_ptr<PSimHit>>(0, std::unique_ptr<PSimHit>(
nullptr));
294 double pZ = localMomentum.
z();
296 LocalPoint exit = localPosition + (halfThick / pZ) * localMomentum;
300 double boundX = detectorPlane.
bounds().
width() / 2.;
304 if (subdet == 4 || subdet == 6)
305 boundX *= 1. - localPosition.
y() / detectorPlane.
position().
perp();
306 if (fabs(localPosition.
x()) > boundX || fabs(localPosition.
y()) > boundY) {
307 return std::pair<double, std::unique_ptr<PSimHit>>(0, std::unique_ptr<PSimHit>(
nullptr));
314 eLoss *= (2. * halfThick - 0.003) / (9.36 * layerThickness);
319 return std::pair<double, std::unique_ptr<PSimHit>>(
320 (hitPos - refPos).
mag(),
321 std::unique_ptr<PSimHit>(
new PSimHit(entry,
329 localMomentum.
theta(),
330 localMomentum.
phi())));
GlobalPoint toGlobal(const Point2DBase< Scalar, LocalTag > lp) const
T getParameter(std::string const &) const
virtual float length() const =0
OrphanHandle< PROD > put(std::unique_ptr< PROD > product)
Put a new product.
TrackerSimHitProducer(const std::string &name, const edm::ParameterSet &cfg)
Constructor.
virtual ConstReferenceCountingPointer< TangentPlane > tangentPlane(const GlobalPoint &) const =0
Implementation of a generic detector layer (base class for forward/barrel layers).
const math::XYZTLorentzVector & position() const
Return position of the particle.
ProductRegistryHelper::BranchAliasSetterT< ProductType > produces()
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].
virtual bool isForward() const =0
Returns false/true depending if the object is a (non-abstract) barrel/forward layer.
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
Geom::Theta< T > theta() const
LocalVector localMomentum() const
~TrackerSimHitProducer() override
Default destructor.
virtual float width() const =0
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...
void registerProducts(edm::ProducesCollector) const override
Register the SimHit collection.
virtual const double getMagneticFieldZ(const math::XYZTLorentzVector &position) const =0
Return magnetic field (field only has Z component!) on the layer.
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.
virtual const BoundSurface & surface() const =0
The surface of the GeometricSearchDet.
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
virtual float thickness() const =0
double minMomentum_
Set the minimal momentum of incoming particle.
void storeProducts(edm::Event &iEvent) override
Store the SimHit collection.
double charge() const
Return charge of the particle.
virtual const double getThickness(const math::XYZTLorentzVector &position) const =0
Return thickness of the layer at a given position.
void interact(Particle &particle, const SimplifiedGeometry &layer, std::vector< std::unique_ptr< Particle >> &secondaries, const RandomEngineAndDistribution &random) override
Perform the interaction.
std::pair< const GeomDet *, TrajectoryStateOnSurface > DetWithState
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
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