CMS 3D CMS Logo

CMSSW_4_4_3_patch1/src/Geometry/CaloGeometry/src/CaloGeometry.cc

Go to the documentation of this file.
00001 #include "Geometry/CaloGeometry/interface/CaloCellGeometry.h"
00002 #include "Geometry/CaloGeometry/interface/CaloSubdetectorGeometry.h"
00003 #include "Geometry/CaloGeometry/interface/CaloGeometry.h"
00004 
00005 const std::vector<DetId> CaloGeometry::k_emptyVec ( 0 ) ;
00006 
00007 CaloGeometry::CaloGeometry() :
00008    m_geos ( kLength, 0 )
00009 {
00010 }
00011 
00012 unsigned int 
00013 CaloGeometry::makeIndex( DetId::Detector det    , 
00014                          int             subdet ,
00015                          bool&           ok       ) const 
00016 {
00017    const unsigned int idet ( det ) ;
00018 
00019    ok = ( kMinDet <= idet   &&
00020           kMaxDet >= idet   &&
00021           0       <  subdet &&
00022           kMaxSub >= subdet    ) ;
00023 
00024    return ( ( det - kMinDet )*kMaxSub + subdet - 1 ) ;
00025 }
00026 
00027 void 
00028 CaloGeometry::setSubdetGeometry( DetId::Detector                det    , 
00029                                  int                            subdet , 
00030                                  const CaloSubdetectorGeometry* geom     ) 
00031 {
00032    bool ok ;
00033    const unsigned int index = makeIndex( det, subdet, ok ) ;
00034    if( ok ) m_geos[index] = geom ;
00035 
00036 //   std::cout<<"Detector="<<(int)det<<", subset="<<subdet<<", index="<<index
00037 //          <<", size="<<m_geos.size()<<std::endl;
00038 
00039    assert( ok ) ;
00040 }
00041 
00042 const CaloSubdetectorGeometry* 
00043 CaloGeometry::getSubdetectorGeometry( const DetId& id ) const 
00044 {
00045    bool ok ;
00046 
00047    const unsigned int index ( makeIndex( id.det(),
00048                                          id.subdetId(),
00049                                          ok             ) ) ;
00050    return ( ok ? m_geos[ index ] : 0 ) ;
00051 }
00052 
00053 const CaloSubdetectorGeometry* 
00054 CaloGeometry::getSubdetectorGeometry( DetId::Detector det    , 
00055                                       int             subdet  ) const 
00056 {
00057    bool ok ;
00058 
00059    const unsigned int index ( makeIndex( det,
00060                                          subdet,
00061                                          ok             ) ) ;
00062    return ( ok ? m_geos[ index ] : 0 ) ;
00063 }
00064 
00065 static const GlobalPoint notFound(0,0,0);
00066 
00067 const GlobalPoint& 
00068 CaloGeometry::getPosition( const DetId& id ) const 
00069 {
00070    const CaloSubdetectorGeometry* geom=getSubdetectorGeometry( id ) ;
00071    const CaloCellGeometry* cell ( ( 0 == geom ? 0 : geom->getGeometry( id ) ) ) ;
00072    return ( 0 == cell ?  notFound : cell->getPosition() ) ;
00073 }
00074 
00075 const CaloCellGeometry* 
00076 CaloGeometry::getGeometry( const DetId& id ) const 
00077 {
00078    const CaloSubdetectorGeometry* geom ( getSubdetectorGeometry( id ) ) ;
00079    const CaloCellGeometry* cell ( 0 == geom ? 0 : geom->getGeometry( id ) ) ;
00080    return cell ;
00081 }
00082 
00083 bool 
00084 CaloGeometry::present( const DetId& id ) const 
00085 {
00086    const CaloSubdetectorGeometry* geom ( getSubdetectorGeometry( id ) ) ;
00087    return ( 0 == geom ? false : geom->present( id ) ) ;
00088 }
00089 
00090 std::vector<DetId> CaloGeometry::getValidDetIds() const
00091 {
00092    std::vector<DetId> returnValue ;
00093    returnValue.reserve( kLength ) ;
00094 
00095    bool doneHcal ( false ) ;
00096    for( unsigned int i ( 0 ) ; i != m_geos.size() ; ++i ) 
00097    {
00098       if( 0    != m_geos[i] )
00099       {
00100          const std::vector< DetId >& aVec ( m_geos[i]->getValidDetIds() ) ;
00101          const bool isHcal ( DetId::Hcal == aVec.front().det() ) ;
00102          if( !doneHcal ||
00103              !isHcal      )
00104          {
00105             returnValue.insert( returnValue.end(), aVec.begin(), aVec.end() ) ;
00106             if( !doneHcal &&
00107                 isHcal        ) doneHcal = true ;
00108          }
00109       }
00110    }
00111    return returnValue ;
00112 }
00113 
00114 const std::vector<DetId>&
00115 CaloGeometry::getValidDetIds( DetId::Detector det    , 
00116                               int             subdet  ) const 
00117 {
00118    bool ok ;
00119 
00120    const unsigned int index ( makeIndex( det,
00121                                          subdet,
00122                                          ok             ) ) ;
00123 
00124    return ( ok && ( 0 != m_geos[ index ] ) ?
00125             m_geos[ index ]->getValidDetIds( det, subdet ) :
00126             k_emptyVec ) ;
00127 }
00128   
00129