45 typedef std::pair<const GeomDet*,TrajectoryStateOnSurface>
DetWithState;
201 std::map<double, PSimHit*> distAndHits;
211 for (
const auto & detectorWithState : compatibleDetectors)
221 distAndHits.insert(distAndHits.end(), hitPair);
227 for(
const auto component : detector.
components())
231 distAndHits.insert(distAndHits.end(), hitPair);
238 for(std::map<double, PSimHit*>::const_iterator it = distAndHits.begin(); it != distAndHits.end(); it++){
265 std::pair<bool,double>
path = crossing.pathLength(detector.
surface());
276 return std::pair<double, PSimHit*>(0,
nullptr);
283 double pZ = localMomentum.
z();
285 LocalPoint exit = localPosition + (halfThick / pZ) * localMomentum;
289 double boundX = detectorPlane.bounds().width() / 2.;
290 double boundY = detectorPlane.bounds().length() / 2.;
293 if (subdet == 4 || subdet == 6)
294 boundX *= 1. - localPosition.
y() / detectorPlane.position().perp();
295 if(fabs(localPosition.
x()) > boundX || fabs(localPosition.
y()) > boundY )
297 return std::pair<double, PSimHit*>(0,
nullptr);
304 eLoss *= (2. * halfThick - 0.003) / (9.36 * layerThickness);
309 return std::pair<double, PSimHit*>((hitPos-refPos).
mag(),
312 localMomentum.
theta(),
313 localMomentum.
phi()));
319 "fastsim::TrackerSimHitProducer" BranchAliasSetterT< ProductType > produces()
declare what type of product will make and with which optional label
GlobalPoint toGlobal(const Point2DBase< Scalar, LocalTag > lp) const
T getParameter(std::string const &) const
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.
T mag() const
The vector magnitude. Equivalent to sqrt(vec.mag2())
std::pair< const GeomDet *, TrajectoryStateOnSurface > DetWithState
LocalPoint localPosition() const
int getMotherPdgId() const
Get pdgIdto mother particle (only makes sense if mother and daughter charged).
Geom::Phi< T > phi() const
Global3DPoint GlobalPoint
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
int pdgId() const
Return pdgId of the particle.
std::unique_ptr< edm::PSimHitContainer > simHitContainer_
The SimHit.
void interact(Particle &particle, const SimplifiedGeometry &layer, std::vector< std::unique_ptr< Particle > > &secondaries, const RandomEngineAndDistribution &random) override
Perform the interaction.
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
uint32_t rawId() const
get the raw id
LocalVector localMomentum() const
~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...
virtual const double getMagneticFieldZ(const math::XYZTLorentzVector &position) const =0
Return magnetic field (field only has Z component!) on the layer.
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.
virtual std::vector< const GeomDet * > components() const
Returns direct components, if any.
Vector3DBase unit() const
void registerProducts(edm::ProducerBase &producer) const override
Register the SimHit collection.
virtual float thickness() const =0
double minMomentum_
Set the minimal momentum of incoming particle.
double getMotherDeltaR() const
Get delta R to mother particle (only makes sense if mother and daughter charged). ...
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.
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.
std::pair< double, 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.
#define DEFINE_EDM_PLUGIN(factory, type, name)
std::vector< PSimHit > PSimHitContainer
const BasicVectorType & basicVector() 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