00001 #include "RecoTracker/TkNavigation/interface/SimpleForwardNavigableLayer.h"
00002
00003 #include "TrackingTools/DetLayers/interface/BarrelDetLayer.h"
00004 #include "TrackingTools/DetLayers/interface/ForwardDetLayer.h"
00005 #include "TrackingTools/DetLayers/interface/DetLayerException.h"
00006
00007 #include "DataFormats/GeometrySurface/interface/BoundCylinder.h"
00008 #include "DataFormats/GeometrySurface/interface/BoundDisk.h"
00009
00010 #include "RecoTracker/TkNavigation/interface/TkLayerLess.h"
00011 #include "FWCore/MessageLogger/interface/MessageLogger.h"
00012
00013
00014 using namespace std;
00015
00016 SimpleForwardNavigableLayer::
00017 SimpleForwardNavigableLayer( ForwardDetLayer* detLayer,
00018 const BDLC& outerBL,
00019 const FDLC& outerFL,
00020 const MagneticField* field,
00021 float epsilon,
00022 bool checkCrossingSide) :
00023 SimpleNavigableLayer(field,epsilon,checkCrossingSide),
00024 areAllReachableLayersSet(false),
00025 theDetLayer(detLayer),
00026 theOuterBarrelLayers(outerBL),
00027 theInnerBarrelLayers(0),
00028 theOuterForwardLayers(outerFL),
00029 theInnerForwardLayers(0),
00030 theOuterLayers(0),
00031 theInnerLayers(0)
00032 {
00033
00034
00035 theOuterLayers.reserve(outerBL.size() + outerFL.size());
00036 for ( ConstBDLI bl = outerBL.begin(); bl != outerBL.end(); bl++ )
00037 theOuterLayers.push_back(*bl);
00038 for ( ConstFDLI fl = outerFL.begin(); fl != outerFL.end(); fl++ )
00039 theOuterLayers.push_back(*fl);
00040
00041
00042 sort(theOuterLayers.begin(), theOuterLayers.end(), TkLayerLess());
00043 sort(theOuterForwardLayers.begin(), theOuterForwardLayers.end(), TkLayerLess());
00044 sort(theOuterBarrelLayers.begin(), theOuterBarrelLayers.end(), TkLayerLess());
00045
00046 }
00047
00048 SimpleForwardNavigableLayer::
00049 SimpleForwardNavigableLayer( ForwardDetLayer* detLayer,
00050 const BDLC& outerBL,
00051 const BDLC& allOuterBL,
00052 const BDLC& innerBL,
00053 const BDLC& allInnerBL,
00054 const FDLC& outerFL,
00055 const FDLC& allOuterFL,
00056 const FDLC& innerFL,
00057 const FDLC& allInnerFL,
00058 const MagneticField* field,
00059 float epsilon,
00060 bool checkCrossingSide) :
00061 SimpleNavigableLayer(field,epsilon,checkCrossingSide),
00062 areAllReachableLayersSet(true),
00063 theDetLayer(detLayer),
00064 theOuterBarrelLayers(outerBL),
00065 theAllOuterBarrelLayers(allOuterBL),
00066 theInnerBarrelLayers(innerBL),
00067 theAllInnerBarrelLayers(allInnerBL),
00068 theOuterForwardLayers(outerFL),
00069 theAllOuterForwardLayers(allOuterFL),
00070 theInnerForwardLayers(innerFL),
00071 theAllInnerForwardLayers(allInnerFL),
00072 theOuterLayers(0),
00073 theInnerLayers(0),
00074 theAllOuterLayers(0),
00075 theAllInnerLayers(0)
00076 {
00077
00078
00079 theOuterLayers.reserve(outerBL.size() + outerFL.size());
00080 for ( ConstBDLI bl = outerBL.begin(); bl != outerBL.end(); bl++ )
00081 theOuterLayers.push_back(*bl);
00082 for ( ConstFDLI fl = outerFL.begin(); fl != outerFL.end(); fl++ )
00083 theOuterLayers.push_back(*fl);
00084
00085 theAllOuterLayers.reserve(allOuterBL.size() + allOuterFL.size());
00086 for ( ConstBDLI bl = allOuterBL.begin(); bl != allOuterBL.end(); bl++ )
00087 theAllOuterLayers.push_back(*bl);
00088 for ( ConstFDLI fl = allOuterFL.begin(); fl != allOuterFL.end(); fl++ )
00089 theAllOuterLayers.push_back(*fl);
00090
00091 theInnerLayers.reserve(innerBL.size() + innerFL.size());
00092 for ( ConstBDLI bl = innerBL.begin(); bl != innerBL.end(); bl++ )
00093 theInnerLayers.push_back(*bl);
00094 for ( ConstFDLI fl = innerFL.begin(); fl != innerFL.end(); fl++ )
00095 theInnerLayers.push_back(*fl);
00096
00097 theAllInnerLayers.reserve(allInnerBL.size() + allInnerFL.size());
00098 for ( ConstBDLI bl = allInnerBL.begin(); bl != allInnerBL.end(); bl++ )
00099 theAllInnerLayers.push_back(*bl);
00100 for ( ConstFDLI fl = allInnerFL.begin(); fl != allInnerFL.end(); fl++ )
00101 theAllInnerLayers.push_back(*fl);
00102
00103
00104
00105 sort(theOuterLayers.begin(), theOuterLayers.end(), TkLayerLess());
00106 sort(theInnerLayers.begin(), theInnerLayers.end(),TkLayerLess(outsideIn));
00107 sort(theOuterBarrelLayers.begin(), theOuterBarrelLayers.end(), TkLayerLess());
00108 sort(theInnerBarrelLayers.begin(), theInnerBarrelLayers.end(),TkLayerLess(outsideIn));
00109 sort(theOuterForwardLayers.begin(), theOuterForwardLayers.end(), TkLayerLess());
00110 sort(theInnerForwardLayers.begin(), theInnerForwardLayers.end(),TkLayerLess(outsideIn));
00111
00112 sort(theAllOuterLayers.begin(), theAllOuterLayers.end(), TkLayerLess());
00113 sort(theAllInnerLayers.begin(), theAllInnerLayers.end(),TkLayerLess(outsideIn));
00114
00115 }
00116
00117
00118
00119 vector<const DetLayer*>
00120 SimpleForwardNavigableLayer::nextLayers( NavigationDirection dir) const
00121 {
00122 vector<const DetLayer*> result;
00123
00124
00125
00126
00127 if ( dir == insideOut ) {
00128 return theOuterLayers;
00129 }
00130 else {
00131 return theInnerLayers;
00132 }
00133
00134 return result;
00135 }
00136
00137 vector<const DetLayer*>
00138 SimpleForwardNavigableLayer::nextLayers( const FreeTrajectoryState& fts,
00139 PropagationDirection dir) const
00140 {
00141
00142
00143
00144
00145 vector<const DetLayer*> result;
00146
00147 FreeTrajectoryState ftsWithoutErrors = (fts.hasError()) ?
00148 FreeTrajectoryState(fts.parameters()) : fts;
00149
00150
00151
00152
00153 float zpos = fts.position().z();
00154 bool isInOutTrackFWD = fts.momentum().z()*zpos>0;
00155 GlobalVector transversePosition(fts.position().x(), fts.position().y(), 0);
00156 bool isInOutTrackBarrel = (transversePosition.dot(fts.momentum())>0) ? 1 : 0;
00157
00158
00159
00160 bool dirOppositeXORisInOutTrackBarrel = ( !(dir == oppositeToMomentum) && isInOutTrackBarrel) || ( (dir == oppositeToMomentum) && !isInOutTrackBarrel);
00161 bool dirOppositeXORisInOutTrackFWD = ( !(dir == oppositeToMomentum) && isInOutTrackFWD) || ( (dir == oppositeToMomentum) && !isInOutTrackFWD);
00162
00163
00164 if ( dirOppositeXORisInOutTrackFWD && dirOppositeXORisInOutTrackBarrel ) {
00165
00166
00167 wellInside(ftsWithoutErrors, dir, theOuterLayers, result);
00168
00169 }
00170 else if (!dirOppositeXORisInOutTrackFWD && !dirOppositeXORisInOutTrackBarrel){
00171
00172
00173 wellInside(ftsWithoutErrors, dir, theInnerLayers, result);
00174
00175 } else if (!dirOppositeXORisInOutTrackFWD && dirOppositeXORisInOutTrackBarrel ) {
00176 wellInside(ftsWithoutErrors, dir, theInnerForwardLayers.begin(), theInnerForwardLayers.end(), result);
00177 wellInside(ftsWithoutErrors, dir, theOuterBarrelLayers.begin(), theOuterBarrelLayers.end(), result);
00178
00179 } else {
00180 wellInside(ftsWithoutErrors, dir, theInnerBarrelLayers.begin(), theInnerBarrelLayers.end(), result);
00181 wellInside(ftsWithoutErrors, dir, theOuterForwardLayers.begin(), theOuterForwardLayers.end(), result);
00182
00183 }
00184
00185
00186
00187
00188
00189
00190
00191
00192
00193
00194
00195
00196
00197 return result;
00198 }
00199
00200
00201 vector<const DetLayer*>
00202 SimpleForwardNavigableLayer::compatibleLayers( NavigationDirection dir) const
00203 {
00204 if( !areAllReachableLayersSet ){
00205 edm::LogError("TkNavigation") << "ERROR: compatibleLayers() method used without all reachableLayers are set" ;
00206 throw DetLayerException("compatibleLayers() method used without all reachableLayers are set");
00207 }
00208
00209 vector<const DetLayer*> result;
00210
00211 if ( dir == insideOut ) {
00212 return theAllOuterLayers;
00213 }
00214 else {
00215 return theAllInnerLayers;
00216 }
00217 return result;
00218
00219 }
00220
00221 vector<const DetLayer*>
00222 SimpleForwardNavigableLayer::compatibleLayers( const FreeTrajectoryState& fts,
00223 PropagationDirection dir) const
00224 {
00225 if( !areAllReachableLayersSet ){
00226 int counter = 0;
00227 return SimpleNavigableLayer::compatibleLayers(fts,dir,counter);
00228
00229
00230 }
00231
00232 vector<const DetLayer*> result;
00233 FreeTrajectoryState ftsWithoutErrors = (fts.hasError()) ?
00234 FreeTrajectoryState(fts.parameters()) : fts;
00235
00236
00237
00238
00239
00240
00241
00242
00243
00244
00245
00246
00247
00248
00249
00250
00251
00252
00253
00254 float zpos = fts.position().z();
00255 bool isInOutTrackFWD = fts.momentum().z()*zpos>0;
00256 GlobalVector transversePosition(fts.position().x(), fts.position().y(), 0);
00257 bool isInOutTrackBarrel = (transversePosition.dot(fts.momentum())>0) ? 1 : 0;
00258
00259
00260
00261 bool dirOppositeXORisInOutTrackBarrel = ( !(dir == oppositeToMomentum) && isInOutTrackBarrel) || ( (dir == oppositeToMomentum) && !isInOutTrackBarrel);
00262 bool dirOppositeXORisInOutTrackFWD = ( !(dir == oppositeToMomentum) && isInOutTrackFWD) || ( (dir == oppositeToMomentum) && !isInOutTrackFWD);
00263
00264
00265 if ( dirOppositeXORisInOutTrackFWD && dirOppositeXORisInOutTrackBarrel ) {
00266
00267
00268 wellInside(ftsWithoutErrors, dir, theAllOuterLayers, result);
00269
00270 }
00271 else if (!dirOppositeXORisInOutTrackFWD && !dirOppositeXORisInOutTrackBarrel){
00272
00273
00274 wellInside(ftsWithoutErrors, dir, theAllInnerLayers, result);
00275
00276 } else if (!dirOppositeXORisInOutTrackFWD && dirOppositeXORisInOutTrackBarrel ) {
00277
00278 wellInside(ftsWithoutErrors, dir, theAllInnerForwardLayers.begin(), theAllInnerForwardLayers.end(), result);
00279 wellInside(ftsWithoutErrors, dir, theAllOuterBarrelLayers.begin(), theAllOuterBarrelLayers.end(), result);
00280
00281 } else {
00282
00283 wellInside(ftsWithoutErrors, dir, theAllInnerBarrelLayers.begin(), theAllInnerBarrelLayers.end(), result);
00284 wellInside(ftsWithoutErrors, dir, theAllOuterForwardLayers.begin(), theAllOuterForwardLayers.end(), result);
00285
00286 }
00287 return result;
00288 }
00289
00290
00291 DetLayer* SimpleForwardNavigableLayer::detLayer() const { return theDetLayer; }
00292
00293 void SimpleForwardNavigableLayer::setDetLayer( DetLayer* dl) {
00294 cerr << "Warning: SimpleForwardNavigableLayer::setDetLayer called."
00295 << endl << "This should never happen!" << endl;
00296 }
00297
00298 void SimpleForwardNavigableLayer::setInwardLinks(const BDLC& innerBL,
00299 const FDLC& innerFL,
00300 TkLayerLess sorter) {
00301
00302 theInnerBarrelLayers = innerBL;
00303 theInnerForwardLayers = innerFL;
00304
00305 theInnerLayers.clear();
00306 theInnerLayers.reserve(innerBL.size() + innerFL.size());
00307 for ( ConstBDLI bl = innerBL.begin(); bl != innerBL.end(); bl++ )
00308 theInnerLayers.push_back(*bl);
00309 for ( ConstFDLI fl = innerFL.begin(); fl != innerFL.end(); fl++ )
00310 theInnerLayers.push_back(*fl);
00311
00312
00313 sort(theInnerLayers.begin(), theInnerLayers.end(),sorter);
00314 sort(theInnerForwardLayers.begin(), theInnerForwardLayers.end(),sorter);
00315 sort(theInnerBarrelLayers.begin(), theInnerBarrelLayers.end(), sorter);
00316
00317 }
00318
00319 void SimpleForwardNavigableLayer::setAdditionalLink(DetLayer* additional, NavigationDirection direction){
00320 ForwardDetLayer* fadditional = dynamic_cast<ForwardDetLayer*>(additional);
00321 BarrelDetLayer* badditional = dynamic_cast<BarrelDetLayer*>(additional);
00322 if (badditional){
00323 if (direction==insideOut){
00324 theOuterBarrelLayers.push_back(badditional);
00325 theAllOuterBarrelLayers.push_back(badditional);
00326 theOuterLayers.push_back(badditional);
00327 theAllOuterLayers.push_back(badditional);
00328 return;
00329 }
00330 theInnerBarrelLayers.push_back(badditional);
00331 theAllInnerBarrelLayers.push_back(badditional);
00332 theInnerLayers.push_back(badditional);
00333 theAllInnerLayers.push_back(badditional);
00334 return;
00335 } else if (fadditional){
00336 if (direction==insideOut){
00337 theOuterForwardLayers.push_back(fadditional);
00338 theAllOuterForwardLayers.push_back(fadditional);
00339 theOuterLayers.push_back(badditional);
00340 theAllOuterLayers.push_back(badditional);
00341 return;
00342 }
00343 theInnerForwardLayers.push_back(fadditional);
00344 theAllInnerForwardLayers.push_back(fadditional);
00345 theInnerLayers.push_back(badditional);
00346 theAllInnerLayers.push_back(badditional);
00347 return;
00348 }
00349 edm::LogError("TkNavigation") << "trying to add neither a ForwardDetLayer nor a BarrelDetLayer";
00350 return;
00351 }