File indexing completed on 2024-04-06 12:28:52
0001 #include "SimpleForwardNavigableLayer.h"
0002
0003 #include "TrackingTools/DetLayers/interface/BarrelDetLayer.h"
0004 #include "TrackingTools/DetLayers/interface/ForwardDetLayer.h"
0005 #include "TrackingTools/DetLayers/interface/DetLayerException.h"
0006
0007 #include "DataFormats/GeometrySurface/interface/BoundCylinder.h"
0008 #include "DataFormats/GeometrySurface/interface/BoundDisk.h"
0009
0010 #include "TrackingTools/DetLayers/interface/TkLayerLess.h"
0011 #include "FWCore/MessageLogger/interface/MessageLogger.h"
0012 #include "FWCore/Utilities/interface/Likely.h"
0013
0014 using namespace std;
0015
0016 SimpleForwardNavigableLayer::SimpleForwardNavigableLayer(const ForwardDetLayer* detLayer,
0017 const BDLC& outerBL,
0018 const FDLC& outerFL,
0019 const MagneticField* field,
0020 float epsilon,
0021 bool checkCrossingSide)
0022 : SimpleNavigableLayer(field, epsilon, checkCrossingSide),
0023 theDetLayer(detLayer),
0024 theOuterBarrelLayers(outerBL),
0025 theInnerBarrelLayers(0),
0026 theOuterForwardLayers(outerFL),
0027 theInnerForwardLayers(0),
0028 theOuterLayers(0),
0029 theInnerLayers(0) {
0030
0031 theOuterLayers.reserve(outerBL.size() + outerFL.size());
0032 for (ConstBDLI bl = outerBL.begin(); bl != outerBL.end(); bl++)
0033 theOuterLayers.push_back(*bl);
0034 for (ConstFDLI fl = outerFL.begin(); fl != outerFL.end(); fl++)
0035 theOuterLayers.push_back(*fl);
0036
0037
0038 sort(theOuterLayers.begin(), theOuterLayers.end(), TkLayerLess());
0039 sort(theOuterForwardLayers.begin(), theOuterForwardLayers.end(), TkLayerLess());
0040 sort(theOuterBarrelLayers.begin(), theOuterBarrelLayers.end(), TkLayerLess());
0041 }
0042
0043 vector<const DetLayer*> SimpleForwardNavigableLayer::nextLayers(NavigationDirection dir) const {
0044 vector<const DetLayer*> result;
0045
0046
0047
0048
0049 if (dir == insideOut) {
0050 return theOuterLayers;
0051 } else {
0052 return theInnerLayers;
0053 }
0054
0055 return result;
0056 }
0057
0058 vector<const DetLayer*> SimpleForwardNavigableLayer::nextLayers(const FreeTrajectoryState& fts,
0059 PropagationDirection dir) const {
0060
0061
0062
0063
0064 vector<const DetLayer*> result;
0065
0066 FreeTrajectoryState ftsWithoutErrors = (fts.hasError()) ? FreeTrajectoryState(fts.parameters()) : fts;
0067
0068 auto const position = fts.position();
0069 auto const momentum = fts.momentum();
0070
0071
0072
0073 float zpos = position.z();
0074 bool isInOutTrackFWD = momentum.z() * zpos > 0;
0075 GlobalVector transversePosition(position.x(), position.y(), 0);
0076 bool isInOutTrackBarrel = (transversePosition.dot(momentum) > 0);
0077
0078
0079
0080 bool dirOppositeXORisInOutTrackBarrel =
0081 (!(dir == oppositeToMomentum) && isInOutTrackBarrel) || ((dir == oppositeToMomentum) && !isInOutTrackBarrel);
0082 bool dirOppositeXORisInOutTrackFWD =
0083 (!(dir == oppositeToMomentum) && isInOutTrackFWD) || ((dir == oppositeToMomentum) && !isInOutTrackFWD);
0084
0085
0086 if LIKELY (dirOppositeXORisInOutTrackFWD && dirOppositeXORisInOutTrackBarrel) {
0087 wellInside(ftsWithoutErrors, dir, theOuterLayers, result);
0088 } else if (!dirOppositeXORisInOutTrackFWD && !dirOppositeXORisInOutTrackBarrel) {
0089 wellInside(ftsWithoutErrors, dir, theInnerLayers, result);
0090 } else if (!dirOppositeXORisInOutTrackFWD && dirOppositeXORisInOutTrackBarrel) {
0091 wellInside(ftsWithoutErrors, dir, theInnerForwardLayers.begin(), theInnerForwardLayers.end(), result);
0092 wellInside(ftsWithoutErrors, dir, theOuterBarrelLayers.begin(), theOuterBarrelLayers.end(), result);
0093 } else {
0094 wellInside(ftsWithoutErrors, dir, theInnerBarrelLayers.begin(), theInnerBarrelLayers.end(), result);
0095 wellInside(ftsWithoutErrors, dir, theOuterForwardLayers.begin(), theOuterForwardLayers.end(), result);
0096 }
0097
0098 return result;
0099 }
0100
0101 vector<const DetLayer*> SimpleForwardNavigableLayer::compatibleLayers(NavigationDirection dir) const {
0102 edm::LogError("TkNavigation") << "ERROR: compatibleLayers() method used without all reachableLayers are set";
0103 throw DetLayerException("compatibleLayers() method used without all reachableLayers are set");
0104 return vector<const DetLayer*>();
0105 }
0106
0107 void SimpleForwardNavigableLayer::setDetLayer(const DetLayer* dl) {
0108 cerr << "Warning: SimpleForwardNavigableLayer::setDetLayer called." << endl << "This should never happen!" << endl;
0109 }
0110
0111 void SimpleForwardNavigableLayer::setInwardLinks(const BDLC& innerBL, const FDLC& innerFL, TkLayerLess sorter) {
0112 theInnerBarrelLayers = innerBL;
0113 theInnerForwardLayers = innerFL;
0114
0115 theInnerLayers.clear();
0116 theInnerLayers.reserve(innerBL.size() + innerFL.size());
0117 for (ConstBDLI bl = innerBL.begin(); bl != innerBL.end(); bl++)
0118 theInnerLayers.push_back(*bl);
0119 for (ConstFDLI fl = innerFL.begin(); fl != innerFL.end(); fl++)
0120 theInnerLayers.push_back(*fl);
0121
0122
0123 sort(theInnerLayers.begin(), theInnerLayers.end(), sorter);
0124 sort(theInnerForwardLayers.begin(), theInnerForwardLayers.end(), sorter);
0125 sort(theInnerBarrelLayers.begin(), theInnerBarrelLayers.end(), sorter);
0126 }
0127
0128 void SimpleForwardNavigableLayer::setAdditionalLink(const DetLayer* additional, NavigationDirection direction) {
0129 const ForwardDetLayer* fadditional = dynamic_cast<const ForwardDetLayer*>(additional);
0130 const BarrelDetLayer* badditional = dynamic_cast<const BarrelDetLayer*>(additional);
0131 if (badditional) {
0132 if (direction == insideOut) {
0133 theOuterBarrelLayers.push_back(badditional);
0134 theOuterLayers.push_back(badditional);
0135 return;
0136 }
0137 theInnerBarrelLayers.push_back(badditional);
0138 theInnerLayers.push_back(badditional);
0139 return;
0140 } else if (fadditional) {
0141 if (direction == insideOut) {
0142 theOuterForwardLayers.push_back(fadditional);
0143 theOuterLayers.push_back(badditional);
0144 return;
0145 }
0146 theInnerForwardLayers.push_back(fadditional);
0147 theInnerLayers.push_back(badditional);
0148 return;
0149 }
0150 edm::LogError("TkNavigation") << "trying to add neither a ForwardDetLayer nor a BarrelDetLayer";
0151 return;
0152 }