File indexing completed on 2024-04-06 12:28:52
0001 #include "SimpleBarrelNavigableLayer.h"
0002
0003 #include "DataFormats/GeometrySurface/interface/BoundCylinder.h"
0004 #include "DataFormats/GeometrySurface/interface/BoundDisk.h"
0005
0006 #include "TrackingTools/DetLayers/interface/DetLayerException.h"
0007 #include "TrackingTools/DetLayers/interface/BarrelDetLayer.h"
0008 #include "TrackingTools/DetLayers/interface/ForwardDetLayer.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 #include <algorithm>
0015 #include <map>
0016 #include <cmath>
0017
0018 using namespace std;
0019
0020 SimpleBarrelNavigableLayer::SimpleBarrelNavigableLayer(const BarrelDetLayer* detLayer,
0021 const BDLC& outerBLC,
0022 const FDLC& outerLeftFL,
0023 const FDLC& outerRightFL,
0024 const MagneticField* field,
0025 float epsilon,
0026 bool checkCrossingSide)
0027 : SimpleNavigableLayer(field, epsilon, checkCrossingSide),
0028 theDetLayer(detLayer),
0029 theOuterBarrelLayers(outerBLC),
0030 theOuterLeftForwardLayers(outerLeftFL),
0031 theOuterRightForwardLayers(outerRightFL)
0032
0033 {
0034
0035 theNegOuterLayers.reserve(outerBLC.size() + outerLeftFL.size());
0036 thePosOuterLayers.reserve(outerBLC.size() + outerRightFL.size());
0037
0038 for (ConstBDLI bl = outerBLC.begin(); bl != outerBLC.end(); bl++)
0039 theNegOuterLayers.push_back(*bl);
0040 thePosOuterLayers = theNegOuterLayers;
0041
0042 for (ConstFDLI fl = outerLeftFL.begin(); fl != outerLeftFL.end(); fl++)
0043 theNegOuterLayers.push_back(*fl);
0044 for (ConstFDLI fl = outerRightFL.begin(); fl != outerRightFL.end(); fl++)
0045 thePosOuterLayers.push_back(*fl);
0046
0047
0048 sort(theNegOuterLayers.begin(), theNegOuterLayers.end(), TkLayerLess());
0049 sort(thePosOuterLayers.begin(), thePosOuterLayers.end(), TkLayerLess());
0050 sort(theOuterBarrelLayers.begin(), theOuterBarrelLayers.end(), TkLayerLess());
0051 sort(theOuterLeftForwardLayers.begin(), theOuterLeftForwardLayers.end(), TkLayerLess());
0052 sort(theOuterRightForwardLayers.begin(), theOuterRightForwardLayers.end(), TkLayerLess());
0053 }
0054
0055 vector<const DetLayer*> SimpleBarrelNavigableLayer::nextLayers(NavigationDirection dir) const {
0056 vector<const DetLayer*> result;
0057
0058
0059
0060
0061 if (dir == insideOut) {
0062 result = theNegOuterLayers;
0063 for (DLC::const_iterator i = thePosOuterLayers.begin(); i != thePosOuterLayers.end(); i++) {
0064
0065 if ((**i).location() == GeomDetEnumerators::endcap)
0066 result.push_back(*i);
0067 }
0068 } else {
0069 result = theNegInnerLayers;
0070 for (DLC::const_iterator i = thePosInnerLayers.begin(); i != thePosInnerLayers.end(); i++) {
0071
0072 if ((**i).location() == GeomDetEnumerators::endcap)
0073 result.push_back(*i);
0074 }
0075 }
0076 return result;
0077 }
0078
0079 vector<const DetLayer*> SimpleBarrelNavigableLayer::nextLayers(const FreeTrajectoryState& fts,
0080 PropagationDirection dir) const {
0081
0082
0083
0084
0085 vector<const DetLayer*> result;
0086
0087 FreeTrajectoryState ftsWithoutErrors = (fts.hasError()) ? FreeTrajectoryState(fts.parameters()) : fts;
0088
0089 auto const position = fts.position();
0090 auto const momentum = fts.momentum();
0091
0092
0093
0094 GlobalVector transversePosition(position.x(), position.y(), 0);
0095 bool isInOutTrackBarrel = (transversePosition.dot(momentum) > 0);
0096
0097 float zpos = position.z();
0098 bool isInOutTrackFWD = momentum.z() * zpos > 0;
0099
0100
0101
0102 bool dirOppositeXORisInOutTrackBarrel =
0103 (!(dir == oppositeToMomentum) && isInOutTrackBarrel) || ((dir == oppositeToMomentum) && !isInOutTrackBarrel);
0104 bool dirOppositeXORisInOutTrackFWD =
0105 (!(dir == oppositeToMomentum) && isInOutTrackFWD) || ((dir == oppositeToMomentum) && !isInOutTrackFWD);
0106
0107 LogDebug("SimpleBarrelNavigableLayer") << "is alongMomentum? " << (dir == alongMomentum) << endl
0108 << "isInOutTrackBarrel: " << isInOutTrackBarrel << endl
0109 << "isInOutTrackFWD: " << isInOutTrackFWD << endl
0110 << "dirOppositeXORisInOutTrackFWD: " << dirOppositeXORisInOutTrackFWD << endl
0111 << "dirOppositeXORisInOutTrackBarrel: " << dirOppositeXORisInOutTrackBarrel
0112 << endl;
0113
0114 bool signZmomentumXORdir =
0115 (((momentum.z() > 0) && !(dir == alongMomentum)) || (!(momentum.z() > 0) && (dir == alongMomentum)));
0116
0117 if LIKELY (dirOppositeXORisInOutTrackBarrel && dirOppositeXORisInOutTrackFWD) {
0118 if (signZmomentumXORdir) {
0119 wellInside(ftsWithoutErrors, dir, theNegOuterLayers, result);
0120 } else {
0121 wellInside(ftsWithoutErrors, dir, thePosOuterLayers, result);
0122 }
0123 } else if (!dirOppositeXORisInOutTrackBarrel && !dirOppositeXORisInOutTrackFWD) {
0124 if (signZmomentumXORdir) {
0125 wellInside(ftsWithoutErrors, dir, thePosInnerLayers, result);
0126 } else {
0127 wellInside(ftsWithoutErrors, dir, theNegInnerLayers, result);
0128 }
0129 } else if (!dirOppositeXORisInOutTrackBarrel && dirOppositeXORisInOutTrackFWD) {
0130 wellInside(ftsWithoutErrors, dir, theInnerBarrelLayers.begin(), theInnerBarrelLayers.end(), result);
0131
0132 if (signZmomentumXORdir) {
0133 wellInside(ftsWithoutErrors, dir, theInnerLeftForwardLayers.begin(), theInnerLeftForwardLayers.end(), result);
0134 wellInside(ftsWithoutErrors, dir, theOuterLeftForwardLayers.begin(), theOuterLeftForwardLayers.end(), result);
0135 } else {
0136 wellInside(ftsWithoutErrors, dir, theInnerRightForwardLayers.begin(), theInnerRightForwardLayers.end(), result);
0137 wellInside(ftsWithoutErrors, dir, theOuterRightForwardLayers.begin(), theOuterRightForwardLayers.end(), result);
0138 }
0139 } else {
0140 if (signZmomentumXORdir) {
0141 wellInside(ftsWithoutErrors, dir, theInnerLeftForwardLayers.begin(), theInnerLeftForwardLayers.end(), result);
0142 } else {
0143 wellInside(ftsWithoutErrors, dir, theInnerRightForwardLayers.begin(), theInnerRightForwardLayers.end(), result);
0144 }
0145 wellInside(ftsWithoutErrors, dir, theOuterBarrelLayers.begin(), theOuterBarrelLayers.end(), result);
0146 }
0147
0148 bool goingIntoTheBarrel =
0149 (!isInOutTrackBarrel && dir == alongMomentum) || (isInOutTrackBarrel && dir == oppositeToMomentum);
0150
0151 LogDebug("SimpleBarrelNavigableLayer") << "goingIntoTheBarrel: " << goingIntoTheBarrel;
0152
0153 if UNLIKELY (theSelfSearch && result.empty()) {
0154 if (!goingIntoTheBarrel) {
0155 LogDebug("SimpleBarrelNavigableLayer")
0156 << " state is not going toward the center of the barrel. not adding self search.";
0157 } else {
0158 const BarrelDetLayer* bl = reinterpret_cast<const BarrelDetLayer*>(detLayer());
0159 unsigned int before = result.size();
0160 LogDebug("SimpleBarrelNavigableLayer") << " I am trying to added myself as a next layer.";
0161 wellInside(ftsWithoutErrors, dir, bl, result);
0162 unsigned int after = result.size();
0163 if (before != after)
0164 LogDebug("SimpleBarrelNavigableLayer") << " I have added myself as a next layer.";
0165 }
0166 }
0167
0168 return result;
0169 }
0170
0171 vector<const DetLayer*> SimpleBarrelNavigableLayer::compatibleLayers(NavigationDirection dir) const {
0172 edm::LogError("TkNavigation") << "ERROR: compatibleLayers() method used without all reachableLayers are set";
0173 throw DetLayerException("compatibleLayers() method used without all reachableLayers are set");
0174 return vector<const DetLayer*>();
0175 }
0176
0177 void SimpleBarrelNavigableLayer::setDetLayer(const DetLayer* dl) {
0178 cerr << "Warniong: SimpleBarrelNavigableLayer::setDetLayer called." << endl << "This should never happen!" << endl;
0179 }
0180
0181 void SimpleBarrelNavigableLayer::setInwardLinks(const BDLC& theBarrelv, const FDLC& theForwardv, TkLayerLess sorter) {
0182 theInnerBarrelLayers = theBarrelv;
0183
0184 sort(theInnerBarrelLayers.begin(), theInnerBarrelLayers.end(), sorter);
0185
0186 ConstFDLI middle = find_if(
0187 theForwardv.begin(), theForwardv.end(), [](const GeometricSearchDet* a) { return a->position().z() >= 0.0; });
0188 theInnerLeftForwardLayers = FDLC(theForwardv.begin(), middle);
0189 theInnerRightForwardLayers = FDLC(middle, theForwardv.end());
0190
0191
0192 sort(theInnerLeftForwardLayers.begin(), theInnerLeftForwardLayers.end(), sorter);
0193 sort(theInnerRightForwardLayers.begin(), theInnerRightForwardLayers.end(), sorter);
0194
0195
0196 theNegInnerLayers.reserve(theInnerBarrelLayers.size() + theInnerLeftForwardLayers.size());
0197 thePosInnerLayers.reserve(theInnerBarrelLayers.size() + theInnerRightForwardLayers.size());
0198
0199 for (ConstBDLI bl = theInnerBarrelLayers.begin(); bl != theInnerBarrelLayers.end(); bl++)
0200 theNegInnerLayers.push_back(*bl);
0201 thePosInnerLayers = theNegInnerLayers;
0202
0203 for (ConstFDLI fl = theInnerLeftForwardLayers.begin(); fl != theInnerLeftForwardLayers.end(); fl++)
0204 theNegInnerLayers.push_back(*fl);
0205 for (ConstFDLI fl = theInnerRightForwardLayers.begin(); fl != theInnerRightForwardLayers.end(); fl++)
0206 thePosInnerLayers.push_back(*fl);
0207
0208
0209 sort(theNegInnerLayers.begin(), theNegInnerLayers.end(), sorter);
0210 sort(thePosInnerLayers.begin(), thePosInnerLayers.end(), sorter);
0211 sort(theInnerBarrelLayers.begin(), theInnerBarrelLayers.end(), sorter);
0212 sort(theInnerLeftForwardLayers.begin(), theInnerLeftForwardLayers.end(), sorter);
0213 sort(theInnerRightForwardLayers.begin(), theInnerRightForwardLayers.end(), sorter);
0214 }
0215
0216 void SimpleBarrelNavigableLayer::setAdditionalLink(const DetLayer* additional, NavigationDirection direction) {
0217 const ForwardDetLayer* fadditional = dynamic_cast<const ForwardDetLayer*>(additional);
0218 const BarrelDetLayer* badditional = dynamic_cast<const BarrelDetLayer*>(additional);
0219 if (badditional) {
0220 if (direction == insideOut) {
0221 theOuterBarrelLayers.push_back(badditional);
0222 theNegOuterLayers.push_back(badditional);
0223 thePosOuterLayers.push_back(badditional);
0224 return;
0225 }
0226 theInnerBarrelLayers.push_back(badditional);
0227 theNegInnerLayers.push_back(badditional);
0228 thePosInnerLayers.push_back(badditional);
0229 return;
0230 } else if (fadditional) {
0231 double zpos = fadditional->position().z();
0232 if (direction == insideOut) {
0233 if (zpos > 0) {
0234 theOuterRightForwardLayers.push_back(fadditional);
0235 thePosOuterLayers.push_back(fadditional);
0236 return;
0237 }
0238 theOuterLeftForwardLayers.push_back(fadditional);
0239 theNegOuterLayers.push_back(fadditional);
0240 return;
0241 }
0242 if (zpos > 0) {
0243 theInnerRightForwardLayers.push_back(fadditional);
0244 thePosInnerLayers.push_back(fadditional);
0245 return;
0246 }
0247 theInnerLeftForwardLayers.push_back(fadditional);
0248 theNegInnerLayers.push_back(fadditional);
0249 return;
0250 }
0251 edm::LogError("TkNavigation") << "trying to add neither a ForwardDetLayer nor a BarrelDetLayer";
0252 return;
0253 }