00001 #ifndef CommonDet_GeomDet_H 00002 #define CommonDet_GeomDet_H 00003 00010 #include "DataFormats/GeometrySurface/interface/BoundPlane.h" 00011 #include "DataFormats/DetId/interface/DetId.h" 00012 00013 #include "DataFormats/GeometryVector/interface/GlobalPoint.h" 00014 #include "DataFormats/GeometryVector/interface/GlobalVector.h" 00015 #include "DataFormats/GeometryVector/interface/LocalPoint.h" 00016 #include "DataFormats/GeometryVector/interface/LocalVector.h" 00017 #include "DataFormats/GeometrySurface/interface/LocalError.h" 00018 #include "Geometry/CommonDetUnit/interface/GeomDetEnumerators.h" 00019 00020 #include <vector> 00021 00022 class AlignmentPositionError; 00023 00024 class GeomDet { 00025 public: 00026 typedef GeomDetEnumerators::SubDetector SubDetector; 00027 00028 explicit GeomDet(BoundPlane* plane); 00029 00030 explicit GeomDet(const ReferenceCountingPointer<BoundPlane>& plane); 00031 00032 virtual ~GeomDet(); 00033 00035 const BoundPlane& surface() const {return *thePlane;} 00036 00038 const BoundPlane& specificSurface() const {return *thePlane;} 00039 00041 const Surface::PositionType& position() const {return surface().position();} 00042 00044 const Surface::RotationType& rotation() const { return surface().rotation();} 00045 00047 GlobalPoint toGlobal(const Local2DPoint& lp) const { 00048 return surface().toGlobal( lp); 00049 } 00050 00052 GlobalPoint toGlobal(const Local3DPoint& lp) const { 00053 return surface().toGlobal( lp); 00054 } 00055 00057 GlobalVector toGlobal(const LocalVector& lv) const { 00058 return surface().toGlobal( lv); 00059 } 00060 00062 LocalPoint toLocal(const GlobalPoint& gp) const { 00063 return surface().toLocal( gp); 00064 } 00065 00067 LocalVector toLocal(const GlobalVector& gv) const { 00068 return surface().toLocal( gv); 00069 } 00070 00072 DetId geographicalId() const { return m_detId; } 00073 00075 virtual SubDetector subDetector() const = 0; 00076 00078 LocalError const & localAlignmentError() const { return theLocalAlignmentError;} 00079 00081 virtual std::vector< const GeomDet*> components() const = 0; 00082 00084 // FIXME: must become pure virtual 00085 virtual const GeomDet* component(DetId /*id*/) const {return 0;} 00086 00088 AlignmentPositionError* alignmentPositionError() const { return theAlignmentPositionError;} 00089 00090 00091 // specific unix index in a given subdetector (such as Tracker) 00092 int index() const { return m_index;} 00093 void setIndex(int i) { m_index=i;} 00094 00095 protected: 00096 00097 void setDetId(DetId id) { 00098 m_detId = id; 00099 } 00100 00101 private: 00102 00103 ReferenceCountingPointer<BoundPlane> thePlane; 00104 AlignmentPositionError* theAlignmentPositionError; 00105 LocalError theLocalAlignmentError; 00106 DetId m_detId; 00107 int m_index; 00108 00110 friend class DetPositioner; 00111 00114 void move( const GlobalVector& displacement); 00115 00118 void rotate( const Surface::RotationType& rotation); 00119 00123 00124 void setPosition( const Surface::PositionType& position, 00125 const Surface::RotationType& rotation); 00126 00129 00130 bool setAlignmentPositionError (const AlignmentPositionError& ape); 00131 00132 }; 00133 00134 #endif 00135 00136 00137 00138