Back to home page

Project CMSSW displayed by LXR

 
 

    


File indexing completed on 2024-04-06 12:31:29

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 //Ported from ORCA
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   // try to guess if propagation should be first to cylinder or first to disk
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       // the propagation should have gone to the cylinder
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     // barrel
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       // the propagation should have gone to the negative disk
0058       return thePropagator->propagate(fts, TrackerBounds::negativeEndcapDisk());
0059     } else if (firstTry.globalPosition().z() > TrackerBounds::halfLength()) {
0060       // the propagation should have gone to the positive disk
0061       return thePropagator->propagate(fts, TrackerBounds::positiveEndcapDisk());
0062     } else
0063       return firstTry;
0064   }
0065   return firstTry;
0066 }