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
00037
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