00001
00002
00003
00004
00059 #ifndef StiDetectorContainer_HH
00060 #define StiDetectorContainer_HH
00061
00062 #include <vector>
00063 using std::vector;
00064 #include <map>
00065 using std::map;
00066
00067 #include "Sti/Base/Named.h"
00068 #include "Sti/Base/Described.h"
00069 #include "Sti/Base/Factory.h"
00070 #include "Sti/StiDetector.h"
00071 #include "Sti/StiDetectorBuilder.h"
00072 #include "Sti/StiMasterDetectorBuilder.h"
00073 #include "Sti/StiCompositeLeafIterator.h"
00074 #include "Sti/StiMapUtilities.h"
00075 #include "Sti/StiCompositeTreeNode.h"
00076
00077 using namespace std;
00078 using std::vector;
00079 using std::map;
00080 template <class FILTERED> class Filter;
00081
00082 class StiDetectorContainer : public Named, public Described
00083 {
00084 public:
00085 StiDetectorContainer(const string & name, const string & description,StiMasterDetectorBuilder *);
00086 virtual ~StiDetectorContainer();
00087 void initialize();
00089 virtual void build(StiDetectorBuilder * builder);
00091 const StiDetectorNode* root() const;
00093 void add(StiDetector* det);
00095 void reset();
00096 void unset(){;}
00098 StiDetector* operator*() const;
00099 StiDetector* getCurrentDetector() const;
00100 #if 0
00102 bool moveToNextRegion();
00104 bool moveToPreviousRegion();
00106 bool moveOut();
00107 #endif
00109 bool moveIn();
00110 #if 0
00112 void movePlusPhi();
00114 void moveMinusPhi();
00115 #endif
00117 void setToDetector(const StiDetector* layer);
00120 void setToDetector(double position);
00122 void setToDetector(double position, double angle);
00123 vector<StiDetector*> & getDetectors();
00124 vector<StiDetector*> & getDetectors(Filter<StiDetector> & filter);
00125 StiMasterDetectorBuilder * getDetectorBuilder();
00126 vector<StiDetector*>::const_iterator begin() const;
00127 vector<StiDetector*>::const_iterator end() const;
00128 vector<StiDetector*>::iterator begin();
00129 vector<StiDetector*>::iterator end();
00130
00131 vector<StiDetectorNode*>::const_iterator beginRadial(const StiDetector * detector)
00132 {
00133 setToDetector(detector);
00134 return mradial_it;
00135 }
00136
00137 vector<StiDetectorNode*>::const_iterator endRadial()
00138 {
00139 return (*mregion)->end();
00140 }
00141
00142 vector<StiDetectorNode*>::reverse_iterator rbeginRadial(const StiDetector * detector)
00143 {
00144 setToDetector(detector);
00145 vector<StiDetectorNode*>::reverse_iterator it;
00146 for (it =(*mregion)->rbegin();
00147 it != (*mregion)->rend();
00148 ++it)
00149 {
00150
00151 if (*it==*mradial_it) break;
00152 }
00153 return it;
00154 }
00155
00156 StiDetectorNodeVector::const_reverse_iterator rendRadial()
00157 {
00158 return (*mregion)->rend();
00159 }
00160
00161 StiDetectorNodeVector::const_iterator beginPhi(StiDetectorNodeVector::const_iterator &radialIterator)
00162 {
00163
00164 return (*radialIterator)->begin();
00165 }
00166 StiDetectorNodeVector::const_iterator endPhi(StiDetectorNodeVector::const_iterator &radialIterator)
00167 {
00168 return (*radialIterator)->end();
00169 }
00170 StiDetectorNodeVector::const_iterator beginPhi(StiDetectorNodeVector::const_reverse_iterator &radialIterator)
00171 {
00172
00173 return (*radialIterator)->begin();
00174 }
00175 StiDetectorNodeVector::const_iterator endPhi(StiDetectorNodeVector::const_reverse_iterator &radialIterator)
00176 {
00177 return (*radialIterator)->end();
00178 }
00179
00180 private:
00181 bool setPhi(const StiOrderKey& oldOrder);
00182
00183 bool setPhiIterator(double oldOrder, unsigned int oldNDaughters,
00184 StiDetectorNodeVector::difference_type oldDistance);
00186 StiDetectorNode* mroot;
00189 StiCompositeLeafIterator<StiDetector>* mLeafIt;
00192 StiDetectorNodeVector::const_iterator mregion;
00193
00195 StiDetectorNodeVector::const_iterator mradial_it;
00197 StiDetectorNodeVector::const_iterator mphi_it;
00201 void setToLeaf(StiDetectorNode* node);
00202 vector<StiDetector *> _sortedDetectors;
00203 vector<StiDetector *> _selectedDetectors;
00204 StiMasterDetectorBuilder * _masterDetectorBuilder;
00205 };
00206
00207
00208 class RPhiLessThan
00209 {
00210 public:
00211 bool operator()(const StiDetector* lhs, const StiDetector* rhs);
00212 };
00213
00214 inline const StiDetectorNode* StiDetectorContainer::root() const
00215 {
00216 return mroot;
00217 }
00218
00219 inline StiMasterDetectorBuilder * StiDetectorContainer::getDetectorBuilder()
00220 {
00221 return _masterDetectorBuilder;
00222 }
00223
00224 #endif