#include <SimpleNavigableLayer.h>
Public Types | |
typedef std::vector < BarrelDetLayer * > | BDLC |
typedef std::vector< const DetLayer * > | DLC |
typedef std::vector < ForwardDetLayer * > | FDLC |
Public Member Functions | |
virtual std::vector< const DetLayer * > | compatibleLayers (const FreeTrajectoryState &fts, PropagationDirection timeDirection, int &counter) const |
virtual void | setAdditionalLink (DetLayer *, NavigationDirection direction=insideOut)=0 |
void | setCheckCrossingSide (bool docheck) |
virtual void | setInwardLinks (const BDLC &, const FDLC &, TkLayerLess sorter=TkLayerLess(outsideIn))=0 |
SimpleNavigableLayer (const MagneticField *field, float eps, bool checkCrossingSide=true) | |
Public Attributes | |
bool | theSelfSearch |
Protected Types | |
typedef BDLC::iterator | BDLI |
typedef BDLC::const_iterator | ConstBDLI |
typedef FDLC::const_iterator | ConstFDLI |
typedef FDLC::iterator | FDLI |
typedef TrajectoryStateOnSurface | TSOS |
Protected Member Functions | |
TSOS | crossingState (const FreeTrajectoryState &fts, PropagationDirection dir) const |
Propagator & | propagator (PropagationDirection dir) const |
void | pushResult (DLC &result, const BDLC &tmp) const |
void | pushResult (DLC &result, const FDLC &tmp) const |
bool | wellInside (const FreeTrajectoryState &fts, PropagationDirection dir, ConstBDLI begin, ConstBDLI end, DLC &result) const |
bool | wellInside (const FreeTrajectoryState &fts, PropagationDirection dir, ConstFDLI begin, ConstFDLI end, DLC &result) const |
bool | wellInside (const FreeTrajectoryState &fts, PropagationDirection dir, const ForwardDetLayer *bl, DLC &result) const |
bool | wellInside (const FreeTrajectoryState &fts, PropagationDirection dir, const BarrelDetLayer *bl, DLC &result) const |
bool | wellInside (const FreeTrajectoryState &fts, PropagationDirection dir, const DLC &layers, DLC &result) const |
Protected Attributes | |
bool | theCheckCrossingSide |
float | theEpsilon |
AnalyticalPropagator | thePropagator |
A partial implementation of the NavigableLayer
Definition at line 19 of file SimpleNavigableLayer.h.
typedef std::vector<BarrelDetLayer*> SimpleNavigableLayer::BDLC |
Definition at line 23 of file SimpleNavigableLayer.h.
typedef BDLC::iterator SimpleNavigableLayer::BDLI [protected] |
Definition at line 44 of file SimpleNavigableLayer.h.
typedef BDLC::const_iterator SimpleNavigableLayer::ConstBDLI [protected] |
Definition at line 46 of file SimpleNavigableLayer.h.
typedef FDLC::const_iterator SimpleNavigableLayer::ConstFDLI [protected] |
Definition at line 47 of file SimpleNavigableLayer.h.
typedef std::vector<const DetLayer*> SimpleNavigableLayer::DLC |
Definition at line 22 of file SimpleNavigableLayer.h.
typedef std::vector<ForwardDetLayer*> SimpleNavigableLayer::FDLC |
Definition at line 24 of file SimpleNavigableLayer.h.
typedef FDLC::iterator SimpleNavigableLayer::FDLI [protected] |
Definition at line 45 of file SimpleNavigableLayer.h.
typedef TrajectoryStateOnSurface SimpleNavigableLayer::TSOS [protected] |
Definition at line 48 of file SimpleNavigableLayer.h.
SimpleNavigableLayer::SimpleNavigableLayer | ( | const MagneticField * | field, |
float | eps, | ||
bool | checkCrossingSide = true |
||
) | [inline] |
Definition at line 26 of file SimpleNavigableLayer.h.
: theSelfSearch(false), theEpsilon(eps),thePropagator(field),theCheckCrossingSide(checkCrossingSide) {}
std::vector< const DetLayer * > SimpleNavigableLayer::compatibleLayers | ( | const FreeTrajectoryState & | fts, |
PropagationDirection | timeDirection, | ||
int & | counter | ||
) | const [virtual] |
Reimplemented from NavigableLayer.
Definition at line 247 of file SimpleNavigableLayer.cc.
References relativeConstraints::empty, info, LogDebug, and query::result.
{ typedef std::vector<const DetLayer*> Lvect; typedef std::set<const DetLayer *> Lset; Lvect empty,result; result.reserve(15); //that's a max Lset collect; //a container of unique instances. to avoid duplicates Lset layerToTry,nextLayerToTry;//set used for iterations //initiate the first iteration Lvect someLayers(nextLayers(fts,timeDirection)); layerToTry.insert(someLayers.begin(),someLayers.end()); while (!layerToTry.empty() && (counter++)<=150){ LogDebug("SimpleNavigableLayer") <<counter<<"] going to check on : "<<layerToTry.size()<<" next layers."; //clear this set first, it will be swaped with layerToTry nextLayerToTry.clear(); for (Lset::iterator toTry=layerToTry.begin();toTry!=layerToTry.end();++toTry){ //add the layer you tried. LogDebug("SimpleNavigableLayer") <<counter<<"] adding layer with pointer: "<<(*toTry) <<" first detid: "<<DetIdInfo::info((*toTry)->basicComponents().front()->geographicalId()); collect.insert( (*toTry) ); //find the next layers from it Lvect nextLayers( (*toTry)->nextLayers(fts,timeDirection) ); LogDebug("SimpleNavigableLayer") <<counter<<"] this layer has : "<<nextLayers.size()<<" next layers."; for (Lvect::iterator next=nextLayers.begin();next!=nextLayers.end();++next){ //if the next layer is not already in the collected layers, add it for next round. bool alreadyTested=false; for (Lset::iterator testMe=collect.begin();testMe!=collect.end();++testMe){ //find method does not work well! if ((*testMe) == (*next)) {alreadyTested=true;break;} } // if ( collect.find(*next)!=collect.end()){ //find method does not work it seems... if (!alreadyTested){ nextLayerToTry.insert( *next ); LogDebug("SimpleNavigableLayer") <<counter<<"] to try next, layer with pointer: "<<(*next) <<" first detid: "<<DetIdInfo::info((*next)->basicComponents().front()->geographicalId()); } else{ LogDebug("SimpleNavigableLayer") <<counter<<"] skipping for next tryout, layer with pointer: "<<(*next) <<" first detid: "<<DetIdInfo::info((*next)->basicComponents().front()->geographicalId()); //for (Lset::iterator testMe=collect.begin();testMe!=collect.end();++testMe){ LogTrace("SimpleNavigableLayer") <<"pointer collected:" <<(*testMe); } } } LogDebug("SimpleNavigableLayer") <<counter<<"] "<<nextLayerToTry.size()<<" layers to try next so far."; } //swap now that you where to go next. layerToTry.swap(nextLayerToTry); } if(counter>=150) { edm::LogWarning("SimpleNavigableLayer") << "WARNING: compatibleLayers() more than 150 iterations!!! Bailing out.."; counter = -1;return empty; } result.insert(result.end(),collect.begin(),collect.end()); //cannot do a swap it seems LogDebug("SimpleNavigableLayer") <<"Number of compatible layers: "<<result.size(); return result; }
TrajectoryStateOnSurface SimpleNavigableLayer::crossingState | ( | const FreeTrajectoryState & | fts, |
PropagationDirection | dir | ||
) | const [protected] |
Definition at line 13 of file SimpleNavigableLayer.cc.
References alongMomentum, alignmentValidation::dest, TransverseImpactPointExtrapolator::extrapolate(), TrajectoryStateOnSurface::freeState(), TrajectoryStateOnSurface::isValid(), LogDebug, mag(), oppositeToMomentum, FreeTrajectoryState::position(), and LargeD0_PixelPairStep_cff::propagator.
{ TSOS propState; //self propagating. step one: go close to the center GlobalPoint initialPoint = fts.position(); TransverseImpactPointExtrapolator middle; GlobalPoint center(0,0,0); propState = middle.extrapolate(fts, center, propagator(dir)); if ( !propState.isValid()) return TrajectoryStateOnSurface(); FreeTrajectoryState & dest = *propState.freeState(); GlobalPoint middlePoint = dest.position(); const double toCloseToEachOther=1e-4; if ( (middlePoint-initialPoint).mag() < toCloseToEachOther){ LogDebug("SimpleNavigableLayer")<<"initial state and PCA are identical. Things are bound to fail. Do not add the link."; return TrajectoryStateOnSurface(); } std::string dirS; if (dir==alongMomentum) dirS = "alongMomentum"; else if (dir==oppositeToMomentum) dirS = "oppositeToMomentum"; else dirS = "anyDirection"; LogDebug("SimpleNavigableLayer")<<"self propagating("<< dir <<") from:\n" <<fts<<"\n" <<dest<<"\n" <<" and the direction is: "<<dir<<" = "<<dirS; //second propagation to go on the other side of the barrel //propState = propagator(dir).propagate( dest, detLayer()->specificSurface()); propState = propagator(dir).propagate( dest, detLayer()->surface()); if ( !propState.isValid()) return TrajectoryStateOnSurface(); FreeTrajectoryState & dest2 = *propState.freeState(); GlobalPoint finalPoint = dest2.position(); LogDebug("SimpleNavigableLayer")<<"second propagation("<< dir <<") to: \n" <<dest2; double finalDot = (middlePoint - initialPoint).basicVector().dot((finalPoint-middlePoint).basicVector()); if (finalDot<0){ // check that before and after are in different side. LogDebug("SimpleNavigableLayer")<<"switch side back: ABORT."; return TrajectoryStateOnSurface(); } return propState; }
Propagator & SimpleNavigableLayer::propagator | ( | PropagationDirection | dir | ) | const [protected] |
Definition at line 221 of file SimpleNavigableLayer.cc.
References Propagator::setPropagationDirection(), and thePropagator.
{ #ifndef CMS_NO_MUTABLE thePropagator.setPropagationDirection(dir); return thePropagator; #else SimpleNavigableLayer* mthis = const_cast<SimpleNavigableLayer*>(this); mthis->thePropagator.setPropagationDirection(dir); return mthis->thePropagator; #endif }
virtual void SimpleNavigableLayer::setAdditionalLink | ( | DetLayer * | , |
NavigationDirection | direction = insideOut |
||
) | [pure virtual] |
Implemented in SimpleBarrelNavigableLayer, and SimpleForwardNavigableLayer.
Referenced by CosmicNavigationSchool::buildAdditionalBarrelLinks().
void SimpleNavigableLayer::setCheckCrossingSide | ( | bool | docheck | ) | [inline] |
Definition at line 34 of file SimpleNavigableLayer.h.
References theCheckCrossingSide.
Referenced by BeamHaloNavigationSchool::BeamHaloNavigationSchool(), and CosmicNavigationSchool::buildAdditionalForwardLinks().
{theCheckCrossingSide = docheck;}
virtual void SimpleNavigableLayer::setInwardLinks | ( | const BDLC & | , |
const FDLC & | , | ||
TkLayerLess | sorter = TkLayerLess(outsideIn) |
||
) | [pure virtual] |
Implemented in SimpleBarrelNavigableLayer, and SimpleForwardNavigableLayer.
Referenced by BeamHaloNavigationSchool::addInward(), CosmicNavigationSchool::establishInverseRelations(), HICSimpleNavigationSchool::establishInverseRelations(), SimpleNavigationSchool::establishInverseRelations(), BeamHaloNavigationSchool::establishInverseRelations(), and CfgNavigationSchool::makeBwdLinks().
bool SimpleNavigableLayer::wellInside | ( | const FreeTrajectoryState & | fts, |
PropagationDirection | dir, | ||
const BarrelDetLayer * | bl, | ||
DLC & | result | ||
) | const [protected] |
Definition at line 58 of file SimpleNavigableLayer.cc.
References PV3DBase< T, PVType, FrameType >::basicVector(), BoundSurface::bounds(), FreeTrajectoryState::cartesianError(), GlobalErrorBase< T, ErrorWeightType >::czz(), TrajectoryStateOnSurface::globalDirection(), TrajectoryStateOnSurface::globalPosition(), TrajectoryStateOnSurface::hasError(), TrajectoryStateOnSurface::isValid(), Bounds::length(), LogTrace, PV3DBase< T, PVType, FrameType >::perp(), CartesianTrajectoryError::position(), FreeTrajectoryState::position(), LargeD0_PixelPairStep_cff::propagator, BarrelDetLayer::specificSurface(), mathSSE::sqrt(), funct::tan(), PV3DBase< T, PVType, FrameType >::theta(), PV3DBase< T, PVType, FrameType >::x(), PV3DBase< T, PVType, FrameType >::y(), and PV3DBase< T, PVType, FrameType >::z().
Referenced by SimpleBarrelNavigableLayer::compatibleLayers(), SimpleForwardNavigableLayer::compatibleLayers(), SimpleForwardNavigableLayer::nextLayers(), and SimpleBarrelNavigableLayer::nextLayers().
{ TSOS propState ; if (bl==detLayer()){ propState = crossingState(fts,dir); if (!propState.isValid()) return false; }else{ propState= propagator(dir).propagate( fts, bl->specificSurface()); } if ( !propState.isValid()) return false; //if requested check that the layer is crossed on the right side if (theCheckCrossingSide){ bool backTobackTransverse = (fts.position().x()*propState.globalPosition().x() + fts.position().y()*propState.globalPosition().y())<0; bool backToback = propState.globalPosition().basicVector().dot(fts.position().basicVector())<0; if (backTobackTransverse || backToback ){ LogTrace("TkNavigation") << "Crossing over prevented!\nStaring from (x,y,z,r) (" << fts.position().x()<<","<< fts.position().y()<<","<< fts.position().z()<<","<<fts.position().perp() << ") going to TSOS (x,y,z,r)" << propState.globalPosition().x()<<","<< propState.globalPosition().y()<<","<< propState.globalPosition().z()<<","<<propState.globalPosition().perp()<<")"; return false; /* //we have to check the crossing side only if we are going to something smaller if (fts.position().perp()>bl->specificSurface().radius() || fabs(fts.position().z())>bl->surface().bounds().length()/2. ){ if (propState.globalPosition().basicVector().dot(fts.position().basicVector())<0){ LogTrace("TkNavigation") << "Crossing over prevented!\nStaring from (x,y,z,r) (" << fts.position().x()<<","<< fts.position().y()<<","<< fts.position().z()<<","<<fts.position().perp() << ") going to TSOS (x,y,z,r)" << propState.globalPosition().x()<<","<< propState.globalPosition().y()<<","<< propState.globalPosition().z()<<","<<propState.globalPosition().perp()<<")";; return false; } } */ }} const Bounds& bounds( bl->specificSurface().bounds()); float length = bounds.length() / 2.f; // take into account the thickness of the layer float deltaZ = bounds.thickness()/2. / fabs( tan( propState.globalDirection().theta())); // take into account the error on the predicted state const float nSigma = theEpsilon; // temporary reuse of epsilon if (propState.hasError()) { deltaZ += nSigma * sqrt( fts.cartesianError().position().czz()); } // cout << "SimpleNavigableLayer BarrelDetLayer deltaZ = " << deltaZ << endl; float zpos = propState.globalPosition().z(); if ( fabs( zpos) < length + deltaZ) result.push_back( bl); if ( fabs( zpos) < length - deltaZ) return true; else return false; }
bool SimpleNavigableLayer::wellInside | ( | const FreeTrajectoryState & | fts, |
PropagationDirection | dir, | ||
const ForwardDetLayer * | bl, | ||
DLC & | result | ||
) | const [protected] |
Definition at line 123 of file SimpleNavigableLayer.cc.
References PV3DBase< T, PVType, FrameType >::basicVector(), BoundSurface::bounds(), deltaR(), TrajectoryStateOnSurface::freeState(), TrajectoryStateOnSurface::globalPosition(), TrajectoryStateOnSurface::hasError(), BoundDisk::innerRadius(), TrajectoryStateOnSurface::isValid(), TrajectoryStateOnSurface::localDirection(), TrajectoryStateOnSurface::localError(), LogDebug, LogTrace, BoundDisk::outerRadius(), PV3DBase< T, PVType, FrameType >::perp(), FreeTrajectoryState::position(), LocalTrajectoryError::positionError(), LargeD0_PixelPairStep_cff::propagator, ForwardDetLayer::specificSurface(), mathSSE::sqrt(), ForwardDetLayer::surface(), funct::tan(), PV3DBase< T, PVType, FrameType >::theta(), Bounds::thickness(), PV3DBase< T, PVType, FrameType >::x(), LocalError::xx(), PV3DBase< T, PVType, FrameType >::y(), LocalError::yy(), and PV3DBase< T, PVType, FrameType >::z().
{ TSOS propState = propagator(dir).propagate( fts, fl->specificSurface()); if ( !propState.isValid()) return false; if (fl==detLayer()){ LogDebug("SimpleNavigableLayer")<<"self propagating from:\n" <<fts<<"\n to \n" <<*propState.freeState(); } //if requested avoids crossing over the tracker if (theCheckCrossingSide){ bool backTobackTransverse = (fts.position().x()*propState.globalPosition().x() + fts.position().y()*propState.globalPosition().y())<0; bool backToback = propState.globalPosition().basicVector().dot(fts.position().basicVector())<0; if (backTobackTransverse || backToback ){ LogTrace("TkNavigation") << "Crossing over prevented!\nStaring from (x,y,z,r) (" << fts.position().x()<<","<< fts.position().y()<<","<< fts.position().z()<<","<<fts.position().perp() << ") going to TSOS (x,y,z,r)" << propState.globalPosition().x()<<","<< propState.globalPosition().y()<<","<< propState.globalPosition().z()<<","<<propState.globalPosition().perp()<<")";; return false; // if (fts.position().z()*propState.globalPosition().z() < 0) return false; }} float rpos = propState.globalPosition().perp(); float innerR = fl->specificSurface().innerRadius(); float outerR = fl->specificSurface().outerRadius(); // take into account the thickness of the layer float deltaR = fl->surface().bounds().thickness()/2. * fabs( tan( propState.localDirection().theta())); // take into account the error on the predicted state const float nSigma = theEpsilon; if (propState.hasError()) { LocalError err = propState.localError().positionError(); // ignore correlation for the moment... deltaR += nSigma * sqrt(err.xx() + err.yy()); } // cout << "SimpleNavigableLayer BarrelDetLayer deltaR = " << deltaR << endl; if ( innerR-deltaR < rpos && rpos < outerR+deltaR) result.push_back( fl); if ( innerR+deltaR < rpos && rpos < outerR-deltaR) return true; else return false; }
bool SimpleNavigableLayer::wellInside | ( | const FreeTrajectoryState & | fts, |
PropagationDirection | dir, | ||
ConstFDLI | begin, | ||
ConstFDLI | end, | ||
DLC & | result | ||
) | const [protected] |
bool SimpleNavigableLayer::wellInside | ( | const FreeTrajectoryState & | fts, |
PropagationDirection | dir, | ||
const DLC & | layers, | ||
DLC & | result | ||
) | const [protected] |
Definition at line 177 of file SimpleNavigableLayer.cc.
References i.
{ // cout << "Entering SimpleNavigableLayer::wellInside" << endl; for (DLC::const_iterator i = layers.begin(); i != layers.end(); i++) { const BarrelDetLayer* bl = dynamic_cast<const BarrelDetLayer*>(*i); if ( bl != 0) { if (wellInside( fts, dir, bl, result)) return true; } else { const ForwardDetLayer* fl = dynamic_cast<const ForwardDetLayer*>(*i); if ( fl == 0) edm::LogError("TkNavigation") << "dynamic_cast<const ForwardDetLayer*> failed" ; if (wellInside( fts, dir, fl, result)) return true; } } return false; }
bool SimpleNavigableLayer::wellInside | ( | const FreeTrajectoryState & | fts, |
PropagationDirection | dir, | ||
ConstBDLI | begin, | ||
ConstBDLI | end, | ||
DLC & | result | ||
) | const [protected] |
bool SimpleNavigableLayer::theCheckCrossingSide [protected] |
Definition at line 54 of file SimpleNavigableLayer.h.
Referenced by setCheckCrossingSide().
float SimpleNavigableLayer::theEpsilon [protected] |
Definition at line 50 of file SimpleNavigableLayer.h.
AnalyticalPropagator SimpleNavigableLayer::thePropagator [mutable, protected] |
Definition at line 52 of file SimpleNavigableLayer.h.
Referenced by propagator().
Definition at line 36 of file SimpleNavigableLayer.h.
Referenced by CosmicNavigationSchool::build(), and SimpleBarrelNavigableLayer::nextLayers().