CMS 3D CMS Logo

CosmicNavigationSchool Class Reference

Concrete navigation school for cosmics in the Tracker. More...

#include <RecoTracker/TkNavigation/interface/CosmicNavigationSchool.h>

Inheritance diagram for CosmicNavigationSchool:

SimpleNavigationSchool NavigationSchool SkippingLayerCosmicNavigationSchool

List of all members.

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)

Classes

class  CosmicNavigationSchoolConfiguration


Detailed Description

Concrete navigation school for cosmics in the Tracker.

Definition at line 17 of file CosmicNavigationSchool.h.


Constructor & Destructor Documentation

CosmicNavigationSchool::CosmicNavigationSchool ( const GeometricSearchTracker theTracker,
const MagneticField field 
)

Definition at line 37 of file CosmicNavigationSchool.cc.

References build().

00039 {
00040   build(theInputTracker, field, CosmicNavigationSchoolConfiguration());
00041 }

CosmicNavigationSchool::~CosmicNavigationSchool (  )  [inline]

Definition at line 41 of file CosmicNavigationSchool.h.

00041 {};

CosmicNavigationSchool::CosmicNavigationSchool (  )  [inline, protected]

Definition at line 43 of file CosmicNavigationSchool.h.

00043 {}


Member Function Documentation

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, GeometricSearchTracker::barrelLayers(), SimpleNavigationSchool::establishInverseRelations(), GeometricSearchTracker::forwardLayers(), i, linkBarrelLayers(), SimpleNavigationSchool::linkForwardLayers(), LogDebug, LogTrace, middle, 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, GeomDetEnumerators::TEC, NavigationSchool::theAllDetLayersInSystem, SimpleNavigationSchool::theBarrelLayers, SimpleNavigationSchool::theBarrelLength, SimpleNavigationSchool::theField, SimpleNavigationSchool::theForwardLayers, SimpleNavigationSchool::theLeftLayers, SimpleNavigationSchool::theRightLayers, SimpleNavigableLayer::theSelfSearch, SimpleNavigationSchool::theTracker, GeomDetEnumerators::TIB, GeometricSearchTracker::tibLayers(), GeomDetEnumerators::TID, GeomDetEnumerators::TOB, and GeometricSearchTracker::tobLayers().

Referenced by CosmicNavigationSchool(), and SkippingLayerCosmicNavigationSchool::SkippingLayerCosmicNavigationSchool().

00046 {
00047   LogTrace("CosmicNavigationSchool") << "*********Running CosmicNavigationSchool***********" ;  
00048   theBarrelLength = 0;theField = field; theTracker = theInputTracker;
00049 
00050   theAllDetLayersInSystem=&theInputTracker->allLayers();
00051 
00052   // Get barrel layers
00053   vector<BarrelDetLayer*> blc = theTracker->barrelLayers();
00054   for ( vector<BarrelDetLayer*>::iterator i = blc.begin(); i != blc.end(); i++) {
00055     if (conf.noPXB && (*i)->subDetector() == GeomDetEnumerators::PixelBarrel) continue;
00056     if (conf.noTOB && (*i)->subDetector() == GeomDetEnumerators::TOB) continue;
00057     if (conf.noTIB && (*i)->subDetector() == GeomDetEnumerators::TIB) continue;
00058     theBarrelLayers.push_back( (*i) );
00059   }
00060 
00061   // get forward layers
00062   vector<ForwardDetLayer*> flc = theTracker->forwardLayers();
00063   for ( vector<ForwardDetLayer*>::iterator i = flc.begin(); i != flc.end(); i++) {
00064     if (conf.noPXF && (*i)->subDetector() == GeomDetEnumerators::PixelEndcap) continue;
00065     if (conf.noTEC && (*i)->subDetector() == GeomDetEnumerators::TEC) continue;
00066     if (conf.noTID && (*i)->subDetector() == GeomDetEnumerators::TID) continue;
00067     theForwardLayers.push_back( (*i) );
00068   }
00069 
00070   FDLI middle = find_if( theForwardLayers.begin(), theForwardLayers.end(),
00071                          not1(DetBelowZ(0)));
00072   theLeftLayers  = FDLC( theForwardLayers.begin(), middle);
00073   theRightLayers = FDLC( middle, theForwardLayers.end());
00074 
00075   SymmetricLayerFinder symFinder( theForwardLayers);
00076 
00077   // only work on positive Z side; negative by mirror symmetry later
00078   linkBarrelLayers( symFinder);
00079   linkForwardLayers( symFinder);
00080   establishInverseRelations( symFinder );
00081 
00082   if (conf.self){
00083 
00084     // set the self search by hand
00085     NavigationSetter setter(*this);
00086 
00087     //add TOB1->TOB1 inward link
00088     const std::vector< BarrelDetLayer * > &  tobL = theInputTracker->tobLayers();
00089     if (tobL.size()>=1){
00090       if (conf.allSelf){
00091         LogDebug("CosmicNavigationSchool")<<" adding all TOB self search.";
00092         for (std::vector< BarrelDetLayer * >::const_iterator lIt = tobL.begin(); lIt!=tobL.end(); ++lIt)
00093           dynamic_cast<SimpleNavigableLayer*>((*lIt)->navigableLayer())->theSelfSearch = true;
00094       }else{
00095         SimpleNavigableLayer* navigableLayer = dynamic_cast<SimpleNavigableLayer*>(tobL.front()->navigableLayer());
00096         LogDebug("CosmicNavigationSchool")<<" adding TOB1 to TOB1.";
00097         navigableLayer->theSelfSearch = true;
00098       }
00099     }
00100     const std::vector< BarrelDetLayer * > &  tibL = theInputTracker->tibLayers();
00101     if (tibL.size()>=1){
00102       if (conf.allSelf){
00103         LogDebug("CosmicNavigationSchool")<<" adding all TIB self search.";
00104         for (std::vector< BarrelDetLayer * >::const_iterator lIt = tibL.begin(); lIt!=tibL.end(); ++lIt)
00105           dynamic_cast<SimpleNavigableLayer*>((*lIt)->navigableLayer())->theSelfSearch = true;
00106       }else{
00107         SimpleNavigableLayer* navigableLayer = dynamic_cast<SimpleNavigableLayer*>(tibL.front()->navigableLayer());
00108         LogDebug("CosmicNavigationSchool")<<" adding tib1 to tib1.";
00109         navigableLayer->theSelfSearch = true;
00110       }
00111     }
00112     const std::vector< BarrelDetLayer * > &  pxbL = theInputTracker->pixelBarrelLayers();
00113     if (pxbL.size()>=1){
00114       if (conf.allSelf){
00115         LogDebug("CosmicNavigationSchool")<<" adding all PXB self search.";
00116         for (std::vector< BarrelDetLayer * >::const_iterator lIt = pxbL.begin(); lIt!=pxbL.end(); ++lIt)
00117           dynamic_cast<SimpleNavigableLayer*>((*lIt)->navigableLayer())->theSelfSearch = true;
00118       }else{
00119         SimpleNavigableLayer* navigableLayer = dynamic_cast<SimpleNavigableLayer*>(pxbL.front()->navigableLayer());
00120         LogDebug("CosmicNavigationSchool")<<" adding pxb1 to pxb1.";
00121         navigableLayer->theSelfSearch = true;
00122       }
00123     }
00124   }
00125 }

void CosmicNavigationSchool::buildAdditionalBarrelLinks (  )  [private]

Definition at line 206 of file CosmicNavigationSchool.cc.

References i, outsideIn, SimpleNavigableLayer::setAdditionalLink(), and SimpleNavigationSchool::theBarrelLayers.

00206                                                        {
00207     for ( vector<BarrelDetLayer*>::iterator i = theBarrelLayers.begin(); i != theBarrelLayers.end(); i++) {
00208       SimpleNavigableLayer* navigableLayer =
00209         dynamic_cast<SimpleNavigableLayer*>((**i).navigableLayer());
00210         if (i+1 != theBarrelLayers.end() )navigableLayer->setAdditionalLink(*(i+1), outsideIn);
00211     }
00212 }

void CosmicNavigationSchool::buildAdditionalForwardLinks ( SymmetricLayerFinder symFinder  )  [private]

Definition at line 215 of file CosmicNavigationSchool.cc.

References i, j, SymmetricLayerFinder::mirror(), DetLayer::navigableLayer(), nfl, outsideIn, SimpleForwardNavigableLayer::setAdditionalLink(), SimpleNavigableLayer::setCheckCrossingSide(), SimpleNavigationSchool::theBarrelLayers, SimpleNavigationSchool::theLeftLayers, and SimpleNavigationSchool::theRightLayers.

Referenced by establishInverseRelations().

00215                                                                                        {
00216     //the first layer of FPIX should not check the crossing side (since there are no inner layers to be tryed first)
00217     SimpleNavigableLayer* firstR = dynamic_cast<SimpleNavigableLayer*>(theRightLayers.front()->navigableLayer());
00218     SimpleNavigableLayer* firstL = dynamic_cast<SimpleNavigableLayer*>(theLeftLayers.front()->navigableLayer());
00219     firstR->setCheckCrossingSide(false);        
00220     firstL->setCheckCrossingSide(false);        
00221         
00222     for ( vector<ForwardDetLayer*>::iterator i = theRightLayers.begin(); i != theRightLayers.end(); i++){
00223         //look for first bigger barrel layer and link to it outsideIn
00224         SimpleForwardNavigableLayer*  nfl = dynamic_cast<SimpleForwardNavigableLayer*>((*i)->navigableLayer());
00225         SimpleForwardNavigableLayer* mnfl = dynamic_cast<SimpleForwardNavigableLayer*>(symFinder.mirror(*i)->navigableLayer());
00226         for (vector<BarrelDetLayer*>::iterator j = theBarrelLayers.begin(); j != theBarrelLayers.end(); j++){
00227             if ((*i)->specificSurface().outerRadius() < (*j)->specificSurface().radius() && 
00228                  fabs((*i)->specificSurface().position().z()) < (*j)->surface().bounds().length()/2.){ 
00229                 nfl ->setAdditionalLink(*j, outsideIn);
00230                 mnfl->setAdditionalLink(*j, outsideIn); 
00231                 break;
00232             }   
00233         }
00234     }           
00235 }

void CosmicNavigationSchool::establishInverseRelations ( SymmetricLayerFinder symFinder  )  [private]

Definition at line 160 of file CosmicNavigationSchool.cc.

References GeometricSearchTracker::allLayers(), buildAdditionalForwardLinks(), i, insideOut, SimpleNavigableLayer::setInwardLinks(), SimpleNavigationSchool::theBarrelLayers, SimpleNavigationSchool::theForwardLayers, and SimpleNavigationSchool::theTracker.

00160                                                                                       {
00161     
00162     //again: standard part is identical to SimpleNavigationSchool one. 
00163     //After the standard link, special outsideIn links are added  
00164 
00165     NavigationSetter setter(*this);
00166 
00167     // find for each layer which are the barrel and forward
00168     // layers that point to it
00169     typedef map<const DetLayer*, vector<BarrelDetLayer*>, less<const DetLayer*> > BarrelMapType;
00170     typedef map<const DetLayer*, vector<ForwardDetLayer*>, less<const DetLayer*> > ForwardMapType;
00171 
00172 
00173     BarrelMapType reachedBarrelLayersMap;
00174     ForwardMapType reachedForwardLayersMap;
00175 
00176 
00177     for ( BDLI bli = theBarrelLayers.begin();
00178         bli!=theBarrelLayers.end(); bli++) {
00179       DLC reachedLC = (**bli).nextLayers( insideOut);
00180       for ( DLI i = reachedLC.begin(); i != reachedLC.end(); i++) {
00181         reachedBarrelLayersMap[*i].push_back( *bli);
00182       }
00183     }
00184 
00185     for ( FDLI fli = theForwardLayers.begin();
00186         fli!=theForwardLayers.end(); fli++) {
00187       DLC reachedLC = (**fli).nextLayers( insideOut);
00188       for ( DLI i = reachedLC.begin(); i != reachedLC.end(); i++) {
00189         reachedForwardLayersMap[*i].push_back( *fli);
00190       }
00191     }
00192 
00193 
00194     vector<DetLayer*> lc = theTracker->allLayers();
00195     for ( vector<DetLayer*>::iterator i = lc.begin(); i != lc.end(); i++) {
00196       SimpleNavigableLayer* navigableLayer = dynamic_cast<SimpleNavigableLayer*>((**i).navigableLayer());
00197       if (navigableLayer)
00198         navigableLayer->setInwardLinks( reachedBarrelLayersMap[*i],reachedForwardLayersMap[*i] );
00199     }   
00200     //buildAdditionalBarrelLinks();
00201     buildAdditionalForwardLinks(symFinder); 
00202 
00203 }

void CosmicNavigationSchool::linkBarrelLayers ( SymmetricLayerFinder symFinder  )  [private, virtual]

Reimplemented from SimpleNavigationSchool.

Definition at line 128 of file CosmicNavigationSchool.cc.

References i, SimpleNavigationSchool::linkNextForwardLayer(), SimpleNavigationSchool::linkNextLargerLayer(), SymmetricLayerFinder::mirror(), SimpleNavigationSchool::theBarrelLayers, SimpleNavigationSchool::theBarrelNLC, and SimpleNavigationSchool::theField.

Referenced by build().

00129 {
00130   //identical to the SimpleNavigationSchool one, but it allows crossing over the tracker
00131   //is some non-standard link is needed, it should probably be added here
00132   
00133   // Link barrel layers outwards
00134   for ( BDLI i = theBarrelLayers.begin(); i != theBarrelLayers.end(); i++) {
00135     BDLC reachableBL;
00136     FDLC leftFL;
00137     FDLC rightFL;
00138 
00139     // always add next barrel layer first
00140     if ( i+1 != theBarrelLayers.end()) reachableBL.push_back(*(i+1));
00141 
00142     // Add closest reachable forward layer (except for last BarrelLayer)
00143     if (i != theBarrelLayers.end() - 1) {
00144       linkNextForwardLayer( *i, rightFL);
00145     }
00146 
00147     // Add next BarrelLayer with length larger than the current BL
00148     if ( i+2 < theBarrelLayers.end()) {
00149       linkNextLargerLayer( i, theBarrelLayers.end(), reachableBL);
00150     }
00151 
00152     theBarrelNLC.push_back( new
00153        SimpleBarrelNavigableLayer( *i, reachableBL,
00154                                    symFinder.mirror(rightFL),
00155                                    rightFL,theField, 5.,false));
00156   }
00157 }


The documentation for this class was generated from the following files:
Generated on Tue Jun 9 18:16:57 2009 for CMSSW by  doxygen 1.5.4