File indexing completed on 2023-03-17 11:26:23
0001 #include "TrackingTools/GeomPropagators/interface/StateOnTrackerBound.h"
0002 #include "TrackingTools/GeomPropagators/interface/Propagator.h"
0003 #include "TrackingTools/TrajectoryState/interface/FreeTrajectoryState.h"
0004 #include "TrackingTools/TrajectoryState/interface/TrajectoryStateOnSurface.h"
0005 #include "TrackingTools/GeomPropagators/interface/TrackerBounds.h"
0006 #include "DataFormats/GeometrySurface/interface/BoundDisk.h"
0007 #include "DataFormats/GeometrySurface/interface/BoundCylinder.h"
0008
0009
0010
0011 StateOnTrackerBound::StateOnTrackerBound(const Propagator* prop) : thePropagator(prop->clone()) {}
0012
0013 StateOnTrackerBound::~StateOnTrackerBound() { delete thePropagator; }
0014
0015 TrajectoryStateOnSurface StateOnTrackerBound::operator()(const TrajectoryStateOnSurface& tsos) const {
0016 return operator()(*tsos.freeState());
0017 }
0018
0019 TrajectoryStateOnSurface StateOnTrackerBound::operator()(const FreeTrajectoryState& fts) const {
0020
0021 float tanTheta = (fts.position().perp() > 70) ? fts.position().perp() / fts.position().z()
0022 : fts.momentum().perp() / fts.momentum().z();
0023 float corner = TrackerBounds::radius() / TrackerBounds::halfLength();
0024
0025 TrajectoryStateOnSurface firstTry;
0026 if (tanTheta < 0 && fabs(tanTheta) < corner) {
0027 firstTry = thePropagator->propagate(fts, TrackerBounds::negativeEndcapDisk());
0028
0029 if (!firstTry.isValid()) {
0030 return thePropagator->propagate(fts, TrackerBounds::barrelBound());
0031 }
0032 if (firstTry.globalPosition().perp() > TrackerBounds::radius()) {
0033
0034 return thePropagator->propagate(fts, TrackerBounds::barrelBound());
0035 } else
0036 return firstTry;
0037 } else if (tanTheta > 0 && fabs(tanTheta) < corner) {
0038 firstTry = thePropagator->propagate(fts, TrackerBounds::positiveEndcapDisk());
0039 if (!firstTry.isValid()) {
0040 return thePropagator->propagate(fts, TrackerBounds::barrelBound());
0041 }
0042 if (firstTry.globalPosition().perp() > TrackerBounds::radius()) {
0043 return thePropagator->propagate(fts, TrackerBounds::barrelBound());
0044 } else
0045 return firstTry;
0046 } else {
0047
0048 firstTry = thePropagator->propagate(fts, TrackerBounds::barrelBound());
0049 if (!firstTry.isValid()) {
0050 if (tanTheta < 0)
0051 return thePropagator->propagate(fts, TrackerBounds::negativeEndcapDisk());
0052 if (tanTheta >= 0)
0053 return thePropagator->propagate(fts, TrackerBounds::positiveEndcapDisk());
0054 return firstTry;
0055 }
0056 if (firstTry.globalPosition().z() < -TrackerBounds::halfLength()) {
0057
0058 return thePropagator->propagate(fts, TrackerBounds::negativeEndcapDisk());
0059 } else if (firstTry.globalPosition().z() > TrackerBounds::halfLength()) {
0060
0061 return thePropagator->propagate(fts, TrackerBounds::positiveEndcapDisk());
0062 } else
0063 return firstTry;
0064 }
0065 return firstTry;
0066 }