27 const Plane& plane)
const {
40 bool parametersOK = this->propagateParametersOnPlane(fts, plane, x,
p,
s);
49 LogDebug(
"AnalyticalPropagator") <<
"not going anywhere. Already on surface.\n"
50 <<
"plane.localZ(fts.position()): " << plane.
localZ(fts.
position()) <<
"\n"
51 <<
"plane.position().mag(): " << plane.
position().
mag() <<
"\n"
52 <<
"plane.posPrec: " << plane.
posPrec();
67 return propagatedStateWithPath(fts, plane, gtp,
s);
80 bool parametersOK = this->propagateParametersOnCylinder(fts, cylinder, x,
p,
s);
82 float dphi2 =
s *
rho;
101 return propagatedStateWithPath(fts, *plane, gtp,
s);
116 const double&
s)
const {
162 return propagateWithLineCrossing(fts.
position(),
p, cylinder, x,
s);
168 auto rdiff = x.perp() - cylinder.radius();
176 UNLIKELY(!cylinderCrossing.hasSolution())
return false;
178 s = cylinderCrossing.pathLength();
180 x = cylinderCrossing.position();
182 p = cylinderCrossing.direction().unit() * fts.
momentum().
mag();
200 return propagateWithLineCrossing(fts.
position(),
p, plane, x,
s);
213 LIKELY(isOldPropagationType) {
215 return propagateWithHelixCrossing(*planeCrossing, plane, fts.
momentum().
mag(), x,
p,
s);
223 LogDebug(
"AnalyticalPropagator") <<
"In AnaliticalProp, calling HAPC "
225 <<
"plane is centered in xyz: " << plane.position().x() <<
" , "
226 << plane.position().y() <<
" , " << plane.position().z() <<
"\n";
234 LogDebug(
"AnalyticalPropagator") <<
"gp1 before calling planeCrossing1: " << gp1 <<
"\n";
244 bool check1 = propagateWithHelixCrossing(*planeCrossing1, plane, fts.
momentum().
mag(), gp1, gm1, s1);
245 double dphi1 = fabs(fts.
momentum().
phi() - gm1.phi());
246 LogDebug(
"AnalyticalPropagator") <<
"check1, s1, dphi, gp1: " << check1 <<
" , " << s1 <<
" , " << dphi1 <<
" , "
251 xGen = (*planeCrossing1).position(s1 +
tolerance);
252 pGen = (*planeCrossing1).direction(s1 +
tolerance);
270 LogDebug(
"AnalyticalPropagator") <<
"failed also second attempt. No idea what to do, then bailout"
274 pGen *= gm1.
mag() / pGen.
mag();
283 bool check2 = propagateWithHelixCrossing(*planeCrossing2, plane, gm2.
mag(), gp2, gm2,
s2);
293 edm::LogError(
"AnalyticalPropagator") <<
"LOGIC ERROR: I should not have entered here!"
298 LogDebug(
"AnalyticalPropagator") <<
"check2, s2, gp2: " << check2 <<
" , " <<
s2 <<
" , " << gp2 <<
"\n";
300 double dist1 = (plane.position() - gp1).
perp();
301 double dist2 = (plane.position() - gp2).
perp();
303 LogDebug(
"AnalyticalPropagator") <<
"propDir, dist1, dist2: " << propagationDirection() <<
" , " << dist1 <<
" , "
307 if (dist1 < 2 * dist2) {
312 }
else if (dist2 < 2 * dist1) {
318 if (fabs(s1) < fabs(
s2)) {
348 std::pair<bool, double> propResult = planeCrossing.pathLength(plane);
349 if (!propResult.first)
351 s = propResult.second;
370 std::pair<bool, double> propResult = cylCrossing.pathLength(cylinder);
371 if (!propResult.first)
373 s = propResult.second;
375 x = cylCrossing.position(
s);
387 std::pair<bool, double> propResult = planeCrossing.
pathLength(plane);
389 UNLIKELY(!propResult.first)
return false;
391 s = propResult.second;
395 pGen *= pmag / pGen.
mag();