#include <CosmicNavigationSchool.h>
Classes | |
class | CosmicNavigationSchoolConfiguration |
Public Member Functions | |
void | build (const GeometricSearchTracker *theTracker, const MagneticField *field, const CosmicNavigationSchoolConfiguration conf) |
CosmicNavigationSchool (const GeometricSearchTracker *theTracker, const MagneticField *field) | |
~CosmicNavigationSchool () | |
Protected Member Functions | |
CosmicNavigationSchool () | |
Private Member Functions | |
void | buildAdditionalBarrelLinks () |
void | buildAdditionalForwardLinks (SymmetricLayerFinder &symFinder) |
void | establishInverseRelations (SymmetricLayerFinder &symFinder) |
void | linkBarrelLayers (SymmetricLayerFinder &symFinder) |
Concrete navigation school for cosmics in the Tracker
Definition at line 17 of file CosmicNavigationSchool.h.
CosmicNavigationSchool::CosmicNavigationSchool | ( | const GeometricSearchTracker * | theTracker, |
const MagneticField * | field | ||
) |
Definition at line 37 of file CosmicNavigationSchool.cc.
References newFWLiteAna::build.
{ build(theInputTracker, field, CosmicNavigationSchoolConfiguration()); }
CosmicNavigationSchool::~CosmicNavigationSchool | ( | ) | [inline] |
Definition at line 21 of file CosmicNavigationSchool.h.
References SimpleNavigationSchool::cleanMemory().
{ cleanMemory();}
CosmicNavigationSchool::CosmicNavigationSchool | ( | ) | [inline, protected] |
Definition at line 43 of file CosmicNavigationSchool.h.
{}
void CosmicNavigationSchool::build | ( | const GeometricSearchTracker * | theTracker, |
const MagneticField * | field, | ||
const CosmicNavigationSchoolConfiguration | conf | ||
) |
Definition at line 43 of file CosmicNavigationSchool.cc.
References GeometricSearchTracker::allLayers(), CosmicNavigationSchool::CosmicNavigationSchoolConfiguration::allSelf, i, LogDebug, LogTrace, CosmicNavigationSchool::CosmicNavigationSchoolConfiguration::noPXB, CosmicNavigationSchool::CosmicNavigationSchoolConfiguration::noPXF, CosmicNavigationSchool::CosmicNavigationSchoolConfiguration::noTEC, CosmicNavigationSchool::CosmicNavigationSchoolConfiguration::noTIB, CosmicNavigationSchool::CosmicNavigationSchoolConfiguration::noTID, CosmicNavigationSchool::CosmicNavigationSchoolConfiguration::noTOB, GeomDetEnumerators::PixelBarrel, GeometricSearchTracker::pixelBarrelLayers(), GeomDetEnumerators::PixelEndcap, CosmicNavigationSchool::CosmicNavigationSchoolConfiguration::self, sistripsummary::TEC, SimpleNavigableLayer::theSelfSearch, sistripsummary::TIB, GeometricSearchTracker::tibLayers(), sistripsummary::TID, sistripsummary::TOB, and GeometricSearchTracker::tobLayers().
Referenced by SkippingLayerCosmicNavigationSchool::SkippingLayerCosmicNavigationSchool().
{ LogTrace("CosmicNavigationSchool") << "*********Running CosmicNavigationSchool***********" ; theBarrelLength = 0;theField = field; theTracker = theInputTracker; theAllDetLayersInSystem=&theInputTracker->allLayers(); // Get barrel layers vector<BarrelDetLayer*> blc = theTracker->barrelLayers(); for ( vector<BarrelDetLayer*>::iterator i = blc.begin(); i != blc.end(); i++) { if (conf.noPXB && (*i)->subDetector() == GeomDetEnumerators::PixelBarrel) continue; if (conf.noTOB && (*i)->subDetector() == GeomDetEnumerators::TOB) continue; if (conf.noTIB && (*i)->subDetector() == GeomDetEnumerators::TIB) continue; theBarrelLayers.push_back( (*i) ); } // get forward layers vector<ForwardDetLayer*> flc = theTracker->forwardLayers(); for ( vector<ForwardDetLayer*>::iterator i = flc.begin(); i != flc.end(); i++) { if (conf.noPXF && (*i)->subDetector() == GeomDetEnumerators::PixelEndcap) continue; if (conf.noTEC && (*i)->subDetector() == GeomDetEnumerators::TEC) continue; if (conf.noTID && (*i)->subDetector() == GeomDetEnumerators::TID) continue; theForwardLayers.push_back( (*i) ); } FDLI middle = find_if( theForwardLayers.begin(), theForwardLayers.end(), not1(DetBelowZ(0))); theLeftLayers = FDLC( theForwardLayers.begin(), middle); theRightLayers = FDLC( middle, theForwardLayers.end()); SymmetricLayerFinder symFinder( theForwardLayers); // only work on positive Z side; negative by mirror symmetry later linkBarrelLayers( symFinder); linkForwardLayers( symFinder); establishInverseRelations( symFinder ); if (conf.self){ // set the self search by hand NavigationSetter setter(*this); //add TOB1->TOB1 inward link const std::vector< BarrelDetLayer * > & tobL = theInputTracker->tobLayers(); if (tobL.size()>=1){ if (conf.allSelf){ LogDebug("CosmicNavigationSchool")<<" adding all TOB self search."; for (std::vector< BarrelDetLayer * >::const_iterator lIt = tobL.begin(); lIt!=tobL.end(); ++lIt) dynamic_cast<SimpleNavigableLayer*>((*lIt)->navigableLayer())->theSelfSearch = true; }else{ SimpleNavigableLayer* navigableLayer = dynamic_cast<SimpleNavigableLayer*>(tobL.front()->navigableLayer()); LogDebug("CosmicNavigationSchool")<<" adding TOB1 to TOB1."; navigableLayer->theSelfSearch = true; } } const std::vector< BarrelDetLayer * > & tibL = theInputTracker->tibLayers(); if (tibL.size()>=1){ if (conf.allSelf){ LogDebug("CosmicNavigationSchool")<<" adding all TIB self search."; for (std::vector< BarrelDetLayer * >::const_iterator lIt = tibL.begin(); lIt!=tibL.end(); ++lIt) dynamic_cast<SimpleNavigableLayer*>((*lIt)->navigableLayer())->theSelfSearch = true; }else{ SimpleNavigableLayer* navigableLayer = dynamic_cast<SimpleNavigableLayer*>(tibL.front()->navigableLayer()); LogDebug("CosmicNavigationSchool")<<" adding tib1 to tib1."; navigableLayer->theSelfSearch = true; } } const std::vector< BarrelDetLayer * > & pxbL = theInputTracker->pixelBarrelLayers(); if (pxbL.size()>=1){ if (conf.allSelf){ LogDebug("CosmicNavigationSchool")<<" adding all PXB self search."; for (std::vector< BarrelDetLayer * >::const_iterator lIt = pxbL.begin(); lIt!=pxbL.end(); ++lIt) dynamic_cast<SimpleNavigableLayer*>((*lIt)->navigableLayer())->theSelfSearch = true; }else{ SimpleNavigableLayer* navigableLayer = dynamic_cast<SimpleNavigableLayer*>(pxbL.front()->navigableLayer()); LogDebug("CosmicNavigationSchool")<<" adding pxb1 to pxb1."; navigableLayer->theSelfSearch = true; } } } }
void CosmicNavigationSchool::buildAdditionalBarrelLinks | ( | ) | [private] |
Definition at line 206 of file CosmicNavigationSchool.cc.
References i, outsideIn, and SimpleNavigableLayer::setAdditionalLink().
{ for ( vector<BarrelDetLayer*>::iterator i = theBarrelLayers.begin(); i != theBarrelLayers.end(); i++) { SimpleNavigableLayer* navigableLayer = dynamic_cast<SimpleNavigableLayer*>((**i).navigableLayer()); if (i+1 != theBarrelLayers.end() )navigableLayer->setAdditionalLink(*(i+1), outsideIn); } }
void CosmicNavigationSchool::buildAdditionalForwardLinks | ( | SymmetricLayerFinder & | symFinder | ) | [private] |
Definition at line 215 of file CosmicNavigationSchool.cc.
References i, j, SymmetricLayerFinder::mirror(), DetLayer::navigableLayer(), outsideIn, and SimpleNavigableLayer::setCheckCrossingSide().
{ //the first layer of FPIX should not check the crossing side (since there are no inner layers to be tryed first) SimpleNavigableLayer* firstR = dynamic_cast<SimpleNavigableLayer*>(theRightLayers.front()->navigableLayer()); SimpleNavigableLayer* firstL = dynamic_cast<SimpleNavigableLayer*>(theLeftLayers.front()->navigableLayer()); firstR->setCheckCrossingSide(false); firstL->setCheckCrossingSide(false); for ( vector<ForwardDetLayer*>::iterator i = theRightLayers.begin(); i != theRightLayers.end(); i++){ //look for first bigger barrel layer and link to it outsideIn SimpleForwardNavigableLayer* nfl = dynamic_cast<SimpleForwardNavigableLayer*>((*i)->navigableLayer()); SimpleForwardNavigableLayer* mnfl = dynamic_cast<SimpleForwardNavigableLayer*>(symFinder.mirror(*i)->navigableLayer()); for (vector<BarrelDetLayer*>::iterator j = theBarrelLayers.begin(); j != theBarrelLayers.end(); j++){ if ((*i)->specificSurface().outerRadius() < (*j)->specificSurface().radius() && fabs((*i)->specificSurface().position().z()) < (*j)->surface().bounds().length()/2.){ nfl ->setAdditionalLink(*j, outsideIn); mnfl->setAdditionalLink(*j, outsideIn); break; } } } }
void CosmicNavigationSchool::establishInverseRelations | ( | SymmetricLayerFinder & | symFinder | ) | [private] |
Definition at line 160 of file CosmicNavigationSchool.cc.
References i, insideOut, and SimpleNavigableLayer::setInwardLinks().
{ //again: standard part is identical to SimpleNavigationSchool one. //After the standard link, special outsideIn links are added NavigationSetter setter(*this); // find for each layer which are the barrel and forward // layers that point to it typedef map<const DetLayer*, vector<BarrelDetLayer*>, less<const DetLayer*> > BarrelMapType; typedef map<const DetLayer*, vector<ForwardDetLayer*>, less<const DetLayer*> > ForwardMapType; BarrelMapType reachedBarrelLayersMap; ForwardMapType reachedForwardLayersMap; for ( BDLI bli = theBarrelLayers.begin(); bli!=theBarrelLayers.end(); bli++) { DLC reachedLC = (**bli).nextLayers( insideOut); for ( DLI i = reachedLC.begin(); i != reachedLC.end(); i++) { reachedBarrelLayersMap[*i].push_back( *bli); } } for ( FDLI fli = theForwardLayers.begin(); fli!=theForwardLayers.end(); fli++) { DLC reachedLC = (**fli).nextLayers( insideOut); for ( DLI i = reachedLC.begin(); i != reachedLC.end(); i++) { reachedForwardLayersMap[*i].push_back( *fli); } } vector<DetLayer*> lc = theTracker->allLayers(); for ( vector<DetLayer*>::iterator i = lc.begin(); i != lc.end(); i++) { SimpleNavigableLayer* navigableLayer = dynamic_cast<SimpleNavigableLayer*>((**i).navigableLayer()); if (navigableLayer) navigableLayer->setInwardLinks( reachedBarrelLayersMap[*i],reachedForwardLayersMap[*i] ); } //buildAdditionalBarrelLinks(); buildAdditionalForwardLinks(symFinder); }
void CosmicNavigationSchool::linkBarrelLayers | ( | SymmetricLayerFinder & | symFinder | ) | [private, virtual] |
Reimplemented from SimpleNavigationSchool.
Definition at line 128 of file CosmicNavigationSchool.cc.
References i, and SymmetricLayerFinder::mirror().
{ //identical to the SimpleNavigationSchool one, but it allows crossing over the tracker //is some non-standard link is needed, it should probably be added here // Link barrel layers outwards for ( BDLI i = theBarrelLayers.begin(); i != theBarrelLayers.end(); i++) { BDLC reachableBL; FDLC leftFL; FDLC rightFL; // always add next barrel layer first if ( i+1 != theBarrelLayers.end()) reachableBL.push_back(*(i+1)); // Add closest reachable forward layer (except for last BarrelLayer) if (i != theBarrelLayers.end() - 1) { linkNextForwardLayer( *i, rightFL); } // Add next BarrelLayer with length larger than the current BL if ( i+2 < theBarrelLayers.end()) { linkNextLargerLayer( i, theBarrelLayers.end(), reachableBL); } theBarrelNLC.push_back( new SimpleBarrelNavigableLayer( *i, reachableBL, symFinder.mirror(rightFL), rightFL,theField, 5.,false)); } }