File indexing completed on 2024-04-06 12:24:37
0001 #ifndef RECOCALOTOOLS_NAVIGATION_CALONAVIGATOR_H
0002 #define RECOCALOTOOLS_NAVIGATION_CALONAVIGATOR_H 1
0003
0004 #include "Geometry/CaloTopology/interface/CaloSubdetectorTopology.h"
0005
0006 template <class T, class TOPO = CaloSubdetectorTopology>
0007 class CaloNavigator final {
0008 public:
0009 CaloNavigator(const T& home, const TOPO* topology) : myTopology_(topology) { setHome(home); }
0010
0011
0012 inline void setHome(const T& startingPoint);
0013
0014
0015 inline void setTopology(const TOPO*);
0016
0017
0018 const TOPO* getTopology() const { return myTopology_; }
0019
0020
0021 inline void home() const;
0022
0023
0024 T pos() const { return currentPoint_; }
0025
0026
0027 T operator*() const { return currentPoint_; }
0028
0029
0030 T north() const {
0031 currentPoint_ = myTopology_->goNorth(currentPoint_);
0032 return currentPoint_;
0033 };
0034
0035
0036 T south() const {
0037 currentPoint_ = myTopology_->goSouth(currentPoint_);
0038 return currentPoint_;
0039 };
0040
0041
0042 T east() const {
0043 currentPoint_ = myTopology_->goEast(currentPoint_);
0044 return currentPoint_;
0045 };
0046
0047
0048 T west() const {
0049 currentPoint_ = myTopology_->goWest(currentPoint_);
0050 return currentPoint_;
0051 };
0052
0053
0054 T up() const {
0055 currentPoint_ = myTopology_->goUp(currentPoint_);
0056 return currentPoint_;
0057 };
0058
0059
0060 T down() const {
0061 currentPoint_ = myTopology_->goDown(currentPoint_);
0062 return currentPoint_;
0063 };
0064
0065
0066 T offsetBy(int deltaX, int deltaY) const {
0067 for (int x = 0; x < abs(deltaX) && currentPoint_ != T(0); x++) {
0068 if (deltaX > 0)
0069 east();
0070 else
0071 west();
0072 }
0073
0074 for (int y = 0; y < abs(deltaY) && currentPoint_ != T(0); y++) {
0075 if (deltaY > 0)
0076 north();
0077 else
0078 south();
0079 }
0080
0081 return currentPoint_;
0082 }
0083
0084 protected:
0085 const TOPO* myTopology_;
0086 mutable T startingPoint_, currentPoint_;
0087 };
0088
0089 template <class T, class TOPO>
0090 inline void CaloNavigator<T, TOPO>::setHome(const T& startingPoint) {
0091 startingPoint_ = startingPoint;
0092 home();
0093 }
0094
0095 template <class T, class TOPO>
0096 inline void CaloNavigator<T, TOPO>::home() const {
0097 currentPoint_ = startingPoint_;
0098 }
0099
0100 template <class T, class TOPO>
0101 inline void CaloNavigator<T, TOPO>::setTopology(const TOPO* topology) {
0102 if (myTopology_ == 0)
0103 myTopology_ = topology;
0104 else
0105 return;
0106 }
0107
0108 #endif