23 phi_(std::atan(momentum_.Py() / momentum_.Px()) +
24 (momentum_.Px() * particle.
charge() < 0 ? 3. *
M_PI / 2. :
M_PI / 2.))
33 centerX_(position_.
X() -
34 radius_ * (momentum_.Py() / momentum_.Px()) /
35 std::
sqrt((momentum_.Py() / momentum_.Px()) * (momentum_.Py() / momentum_.Px()) + 1) *
36 (momentum_.Px() * particle.
charge() < 0 ? 1. : -1.)),
37 centerY_(position_.
Y() -
38 radius_ * 1 / std::
sqrt((momentum_.Py() / momentum_.Px()) * (momentum_.Py() / momentum_.Px()) + 1) *
39 (momentum_.Px() * particle.
charge() < 0 ? -1. : 1.))
43 centerR_(std::
sqrt(centerX_ * centerX_ + centerY_ * centerY_)),
44 minR_(std::
abs(centerR_ - radius_)),
45 maxR_(centerR_ + radius_)
97 double E = centerX_ * centerX_ + centerY_ * centerY_ + radius_ * radius_ - layer.
getRadius() * layer.
getRadius();
98 double F = 2 * centerY_ * radius_;
99 double G = 2 * centerX_ * radius_;
101 double a = F * F + G *
G;
102 double b = 2 * E *
F;
103 double c = E * E - G *
G;
105 double delta = b * b - 4 * a *
c;
116 double sqrtDelta =
sqrt(delta);
117 double phi1 = 0, phi2 = 0;
119 phi1 = std::asin((2. * c) / (-b + sqrtDelta));
120 phi2 = std::asin((-b + sqrtDelta) / (2. * a));
122 phi1 = std::asin((-b - sqrtDelta) / (2. * a));
123 phi2 = std::asin((2. * c) / (-b - sqrtDelta));
144 double t1 = (phi1 - phi_) / phiSpeed_;
148 double t2 = (phi2 - phi_) / phiSpeed_;
165 bool particleMovesInwards = momentum_.X() * position_.X() + momentum_.Y() * position_.Y() < 0;
167 double posX1 = centerX_ + radius_ *
std::cos(phi1);
168 double posY1 = centerY_ + radius_ *
std::sin(phi1);
169 double momX1 = momentum_.X() *
std::cos(phi1 - phi_) - momentum_.Y() *
std::sin(phi1 - phi_);
170 double momY1 = momentum_.X() *
std::sin(phi1 - phi_) + momentum_.Y() *
std::cos(phi1 - phi_);
171 bool particleMovesInwards1 = momX1 * posX1 + momY1 * posY1 < 0;
173 double posX2 = centerX_ + radius_ *
std::cos(phi2);
174 double posY2 = centerY_ + radius_ *
std::sin(phi2);
175 double momX2 = momentum_.X() *
std::cos(phi2 - phi_) - momentum_.Y() *
std::sin(phi2 - phi_);
176 double momY2 = momentum_.X() *
std::sin(phi2 - phi_) + momentum_.Y() *
std::cos(phi2 - phi_);
177 bool particleMovesInwards2 = momX2 * posX2 + momY2 * posY2 < 0;
179 if (particleMovesInwards1 != particleMovesInwards) {
181 }
else if (particleMovesInwards2 != particleMovesInwards) {
195 double deltaPhi = phiSpeed_ * deltaT;
196 position_.SetXYZT(centerX_ + radius_ *
std::cos(phi_ + deltaPhi),
197 centerY_ + radius_ *
std::sin(phi_ + deltaPhi),
198 position_.Z() + momentum_.Z() / momentum_.E() * deltaTimeC,
199 position_.T() + deltaT);
203 momentum_.SetXYZT(momentum_.X() *
std::cos(deltaPhi) - momentum_.Y() *
std::sin(deltaPhi),
211 (centerY_ + radius_ *
std::sin(phi)) * (centerY_ + radius_ *
std::sin(phi)));
const edm::EventSetup & c
Sin< T >::type sin(const T &t)
Implementation of a barrel detector layer (cylindrical).
static double constexpr speedOfLight
Speed of light [cm / ns].
bool crosses(const BarrelSimplifiedGeometry &layer) const override
Check if an intersection of the trajectory with a barrel layer exists.
constexpr std::array< uint8_t, layerIndexSize > layer
double getRadParticle(double phi) const
Return distance of particle from center of the detector if it was at given angle phi of the helix...
Mathematical representation of a straight trajectory.
Cos< T >::type cos(const T &t)
Abs< T >::type abs(const T &t)
Definition the generic trajectory of a particle (base class for helix/straight trajectories).
void move(double deltaTimeC) override
Move the particle along the helix trajectory for a given time.
HelixTrajectory(const Particle &particle, double magneticFieldZ)
Constructor.
double nextCrossingTimeC(const BarrelSimplifiedGeometry &layer, bool onLayer=false) const override
Return delta time (t*c) of the next intersection of trajectory and barrel layer.
double nextCrossingTimeC(const BarrelSimplifiedGeometry &layer, bool onLayer=false) const override
Return delta time (t*c) of the next intersection of trajectory and barrel layer.
const double getRadius() const
Return radius of the barrel layer.
Definition of a generic FastSim Particle which can be propagated through the detector (formerly Parti...
static uInt32 F(BLOWFISH_CTX *ctx, uInt32 x)