File indexing completed on 2024-04-06 12:28:12
0001 #include "RecoTracker/MeasurementDet/interface/StartingLayerFinder.h"
0002
0003 #include "DataFormats/DetId/interface/DetId.h"
0004 #include "DataFormats/TrackingRecHit/interface/TrackingRecHit.h"
0005 #include "DataFormats/TrackingRecHit/interface/TrackingRecHitFwd.h"
0006 #include "DataFormats/TrajectoryState/interface/PTrajectoryStateOnDet.h"
0007 #include "DataFormats/TrajectorySeed/interface/TrajectorySeed.h"
0008 #include "DataFormats/SiStripDetId/interface/StripSubdetector.h"
0009 #include "DataFormats/SiPixelDetId/interface/PixelSubdetector.h"
0010
0011 #include "TrackingTools/TrajectoryState/interface/TrajectoryStateTransform.h"
0012 #include "TrackingTools/TrajectoryState/interface/TrajectoryStateOnSurface.h"
0013
0014 #include <utility>
0015
0016 using namespace std;
0017
0018 namespace {
0019
0020 typedef std::pair<float, float> Range;
0021
0022 inline bool rangesIntersect(const Range& a, const Range& b) {
0023 if (a.first > b.second || b.first > a.second)
0024 return false;
0025 else
0026 return true;
0027 }
0028 };
0029
0030 vector<const DetLayer*> StartingLayerFinder::operator()(const FreeTrajectoryState& aFts, float dr, float dz) const {
0031 vector<const DetLayer*> mylayers;
0032 mylayers.reserve(3);
0033
0034 FreeTrajectoryState fastFts(aFts.parameters());
0035
0036
0037 TrajectoryStateOnSurface pTsos = thePropagator.propagate(fastFts, firstPixelBarrelLayer()->surface());
0038
0039 if (pTsos.isValid()) {
0040 Range barrZRange(
0041 firstPixelBarrelLayer()->position().z() - 0.5 * (firstPixelBarrelLayer()->surface().bounds().length()),
0042 firstPixelBarrelLayer()->position().z() + 0.5 * (firstPixelBarrelLayer()->surface().bounds().length()));
0043 Range trajZRange(pTsos.globalPosition().z() - dz, pTsos.globalPosition().z() + dz);
0044
0045 if (rangesIntersect(trajZRange, barrZRange)) {
0046 mylayers.push_back(firstPixelBarrelLayer());
0047 }
0048 }
0049
0050
0051
0052 for (auto infwd : firstPosPixelFwdLayer()) {
0053 pTsos = thePropagator.propagate(fastFts, infwd->surface());
0054 if (pTsos.isValid()) {
0055 Range nfwdRRange(infwd->specificSurface().innerRadius(), infwd->specificSurface().outerRadius());
0056 Range trajRRange(pTsos.globalPosition().perp() - dr, pTsos.globalPosition().perp() + dr);
0057 if (rangesIntersect(trajRRange, nfwdRRange)) {
0058 mylayers.push_back(infwd);
0059 }
0060 }
0061 }
0062
0063
0064 for (auto ipfwd : firstPosPixelFwdLayer()) {
0065 pTsos = thePropagator.propagate(fastFts, ipfwd->surface());
0066 if (pTsos.isValid()) {
0067 Range pfwdRRange(ipfwd->specificSurface().innerRadius(), ipfwd->specificSurface().outerRadius());
0068 Range trajRRange(pTsos.globalPosition().perp() - dr, pTsos.globalPosition().perp() + dr);
0069 if (rangesIntersect(trajRRange, pfwdRRange)) {
0070 mylayers.push_back(ipfwd);
0071 }
0072 }
0073 }
0074
0075 return mylayers;
0076 }
0077
0078 const BarrelDetLayer* StartingLayerFinder::firstPixelBarrelLayer() const {
0079 checkPixelLayers();
0080 return theFirstPixelBarrelLayer;
0081 }
0082
0083 const vector<const ForwardDetLayer*> StartingLayerFinder::firstNegPixelFwdLayer() const {
0084 checkPixelLayers();
0085 return theFirstNegPixelFwdLayer;
0086 }
0087
0088 const vector<const ForwardDetLayer*> StartingLayerFinder::firstPosPixelFwdLayer() const {
0089 checkPixelLayers();
0090 return theFirstPosPixelFwdLayer;
0091 }
0092
0093 void StartingLayerFinder::checkPixelLayers() const {
0094 if (!thePixelLayersValid) {
0095 const GeometricSearchTracker* theGeometricSearchTracker = theMeasurementTracker.geometricSearchTracker();
0096
0097 theFirstPixelBarrelLayer = theGeometricSearchTracker->pixelBarrelLayers().front();
0098 theFirstNegPixelFwdLayer = theGeometricSearchTracker->negPixelForwardLayers();
0099 theFirstPosPixelFwdLayer = theGeometricSearchTracker->posPixelForwardLayers();
0100 thePixelLayersValid = true;
0101 }
0102 }