Go to the documentation of this file.00001 #ifndef FastSimulation_GeometryTool_Crystal_h
00002 #define FastSimulation_GeometryTool_Crystal_h
00003
00004
00005 #include "Math/GenVector/Plane3D.h"
00006 #include "DataFormats/Math/interface/Vector3D.h"
00007
00008
00009 #include "Geometry/CaloTopology/interface/CaloDirection.h"
00010 #include "DataFormats/DetId/interface/DetId.h"
00011
00012
00013 #include "FastSimulation/CaloGeometryTools/interface/CrystalNeighbour.h"
00014 #include "FastSimulation/CaloGeometryTools/interface/BaseCrystal.h"
00015
00016 #include <vector>
00017
00018 class DetId;
00019
00020 class Crystal
00021 {
00022
00023 public:
00024
00025 typedef math::XYZVector XYZVector;
00026 typedef math::XYZVector XYZPoint;
00027 typedef ROOT::Math::Plane3D Plane3D;
00028
00029
00030
00032 Crystal(){;};
00034 Crystal(const DetId& cell,const BaseCrystal* bc=0);
00035
00037 inline const XYZPoint& getCorner(unsigned i) const { return myCrystal_->getCorner(i);};
00039 inline const XYZPoint& getCenter() const {return myCrystal_->getCenter();};
00041 inline const XYZPoint& getFrontCenter() const {return myCrystal_->getFrontCenter();};
00043 inline const XYZPoint & getBackCenter() const {return myCrystal_->getBackCenter();}
00045 inline const XYZVector& getFirstEdge() const {return myCrystal_->getFirstEdge();}
00047 inline const XYZVector& getFifthEdge() const {return myCrystal_->getFifthEdge();}
00049 inline const DetId & getDetId() const {return cellid_;};
00051 inline const int getSubdetNumber() const {return myCrystal_->getSubdetNumber();}
00052 void print() const {return myCrystal_->print();}
00054 void getLateralEdges(unsigned i,XYZPoint& a,XYZPoint& b) const {myCrystal_->getLateralEdges(i,a,b); };
00056 void getFrontSide(XYZPoint &a,XYZPoint &b,XYZPoint &c,XYZPoint &d) const {myCrystal_->getFrontSide(a,b,c,d); }
00057 void getFrontSide(std::vector<XYZPoint>& corners) const {myCrystal_->getFrontSide(corners);}
00059 void getBackSide(XYZPoint &a,XYZPoint &b,XYZPoint &c,XYZPoint &d) const {myCrystal_->getBackSide(a,b,c,d);}
00060 void getBackSide(std::vector<XYZPoint>& corners) const {myCrystal_->getBackSide(corners);}
00062 void getLateralSide(unsigned i,XYZPoint &a,XYZPoint &b,XYZPoint &c,XYZPoint &d) const {myCrystal_->getLateralSide(i,a,b,c,d);}
00063 void getLateralSide(unsigned i,std::vector<XYZPoint>& corners) const {myCrystal_->getLateralSide(i,corners);}
00065 void getSide(const CaloDirection& side, XYZPoint &a,XYZPoint &b,XYZPoint &c,XYZPoint &d) const
00066 {myCrystal_->getSide(side,a,b,c,d);}
00067 void getSide(const CaloDirection& side, std::vector<XYZPoint>& corners) const
00068 {myCrystal_->getSide(side,corners);}
00069
00070
00072 const Plane3D& getFrontPlane() const {return myCrystal_->getFrontPlane();}
00074 const Plane3D& getBackPlane() const {return myCrystal_->getBackPlane();}
00076 const Plane3D& getLateralPlane(unsigned i) const {return myCrystal_->getLateralPlane(i);}
00078 const Plane3D& getPlane(const CaloDirection& side) const { return myCrystal_->getPlane(side);}
00079
00081 inline const XYZVector& getLateralEdge(unsigned i) const {return myCrystal_->getLateralEdge(i);}
00082
00084 inline const XYZVector& exitingNormal(const CaloDirection& side) const {return myCrystal_->exitingNormal(side);}
00085
00086 static unsigned oppositeDirection(unsigned iside);
00087
00089 void getDrawingCoordinates(std::vector<float> &x,std::vector<float> &y,std::vector<float> &z) const
00090 {
00091 myCrystal_->getDrawingCoordinates(x,y,z);
00092 }
00093
00095 inline void setNumber(unsigned n) {number_=n;};
00096
00098 inline unsigned number() const {
00099 return number_;};
00100
00102 inline CrystalNeighbour & crystalNeighbour(unsigned iq) { return neighbours_[iq];}
00103
00105 inline const XYZVector & getAxis() const { return myCrystal_->getAxis();}
00106
00108 inline void setX0Back(double val) {X0back_=val;}
00109
00111 inline double getX0Back() const { return X0back_;}
00112
00113 ~Crystal(){;};
00114
00115 private:
00116 unsigned number_;
00117 DetId cellid_ ;
00118 std::vector<CrystalNeighbour> neighbours_;
00119 double X0back_;
00120 const BaseCrystal * myCrystal_;
00121
00122 public:
00123 class crystalEqual
00124 {
00125 public:
00126 crystalEqual(const DetId & cell):ref_(cell)
00127 {;};
00128 ~crystalEqual(){;};
00129 inline bool operator() (const Crystal& xtal) const
00130 {
00131 return (ref_==xtal.getDetId());
00132 }
00133 private:
00134 const DetId& ref_;
00135 };
00136 };
00137 #endif