4 // Class AliMpPlaneAreaPadIterator
5 // -------------------------------
6 // Class, which defines an iterator over the pads
7 // inside a given area in a plane in horizontal direction.
8 // Included in AliRoot: 2003/05/02
9 // Authors: David Guez, Ivana Hrivnacova; IPN Orsay
11 #include <Riostream.h>
14 #include "AliMpPlaneAreaPadIterator.h"
15 #include "AliMpTransformPadIterator.h"
16 #include "AliMpPlaneSegmentation.h"
17 #include "AliMpSectorSegmentation.h"
19 ClassImp(AliMpPlaneAreaPadIterator)
21 //______________________________________________________________________________
22 AliMpPlaneAreaPadIterator::AliMpPlaneAreaPadIterator(
23 const AliMpPlaneSegmentation* segmentation,
24 const AliMpArea& area)
25 : AliMpVPadIterator(),
26 fkPlaneSegmentation(segmentation),
30 // Normal constructor, start in invalid position
35 fCurrentIterator = fPadIterators.end();
39 fCurrentIterator = fPadIterators.GetEntriesFast();
43 //______________________________________________________________________________
44 AliMpPlaneAreaPadIterator::AliMpPlaneAreaPadIterator(
45 const AliMpPlaneAreaPadIterator& right)
46 : AliMpVPadIterator(right)
50 Fatal("Copy constructor", "Not implemented");
53 //______________________________________________________________________________
54 AliMpPlaneAreaPadIterator::AliMpPlaneAreaPadIterator()
55 : AliMpVPadIterator(),
56 fkPlaneSegmentation(0),
60 // Dummy default constructor.
63 //______________________________________________________________________________
64 AliMpPlaneAreaPadIterator::~AliMpPlaneAreaPadIterator()
68 // delete created iterators here
75 //______________________________________________________________________________
76 AliMpPlaneAreaPadIterator&
77 AliMpPlaneAreaPadIterator::operator = (const AliMpPlaneAreaPadIterator& right)
79 // Assignement operator
81 // check assignement to self
82 if (this == &right) return *this;
84 Fatal("operator =", "Assignement operator not provided.");
93 //______________________________________________________________________________
94 void AliMpPlaneAreaPadIterator::DecomposeArea()
96 // Decompose the area into areas belonging to the quadrants.
99 for (Int_t i=0; i<fkPlaneSegmentation->GetNofTransformers(); i++) {
101 AliMpTransformer* transformer = fkPlaneSegmentation->GetTransformer(i);
102 AliMpArea area = transformer->CutArea(fkArea);
104 if (area.IsValid()) {
106 AliMpSectorSegmentation* segmentation
107 = fkPlaneSegmentation->GetSectorSegmentation(transformer->GetScale());
109 AliMpVPadIterator* sectorIt
110 = segmentation->CreateIterator(area);
113 fPadIterators.push_back(
114 new AliMpTransformPadIterator(sectorIt, transformer));
119 new AliMpTransformPadIterator(sectorIt, transformer));
129 //______________________________________________________________________________
130 void AliMpPlaneAreaPadIterator::First()
132 // Reset the iterator, so that it points to the first available
137 if (fPadIterators.size()==0) return;
139 fCurrentIterator = fPadIterators.begin();
140 (*fCurrentIterator)->First();
142 while ( fCurrentIterator != fPadIterators.end() &&
143 (*fCurrentIterator)->IsDone()) {
146 if (fCurrentIterator != fPadIterators.end()) {
147 (*fCurrentIterator)->First();
153 if (fPadIterators.GetEntriesFast()==0) return;
155 fCurrentIterator = 0;
156 ((AliMpTransformPadIterator*)fPadIterators.At(fCurrentIterator))->First();
158 while ( fCurrentIterator != fPadIterators.GetEntriesFast() &&
159 ((AliMpTransformPadIterator*)fPadIterators.At(fCurrentIterator))
163 if (fCurrentIterator != fPadIterators.GetEntriesFast()) {
164 ((AliMpTransformPadIterator*)fPadIterators.At(fCurrentIterator))->First();
170 //______________________________________________________________________________
171 void AliMpPlaneAreaPadIterator::Next()
173 // Move the iterator to the next valid pad.
177 (*fCurrentIterator)->Next();
179 while ( fCurrentIterator != fPadIterators.end() &&
180 (*fCurrentIterator)->IsDone()) {
183 if (fCurrentIterator != fPadIterators.end()) {
184 (*fCurrentIterator)->First();
190 ((AliMpTransformPadIterator*)fPadIterators.At(fCurrentIterator))->Next();
192 while ( fCurrentIterator != fPadIterators.GetEntriesFast() &&
193 ((AliMpTransformPadIterator*)fPadIterators.At(fCurrentIterator))
197 if (fCurrentIterator != fPadIterators.GetEntriesFast()) {
198 ((AliMpTransformPadIterator*)fPadIterators.At(fCurrentIterator))->First();
204 //______________________________________________________________________________
205 Bool_t AliMpPlaneAreaPadIterator::IsDone() const
209 return fCurrentIterator == fPadIterators.end();
213 return fCurrentIterator == fPadIterators.GetEntriesFast();
217 //______________________________________________________________________________
218 AliMpPad AliMpPlaneAreaPadIterator::CurrentItem() const
220 // Returns the current pad.
224 if (fCurrentIterator != fPadIterators.end())
225 return (*fCurrentIterator)->CurrentItem();
227 return AliMpPad::Invalid();
231 if (fCurrentIterator != fPadIterators.GetEntriesFast())
232 return ((AliMpTransformPadIterator*)fPadIterators.At(fCurrentIterator))
235 return AliMpPad::Invalid();
239 //______________________________________________________________________________
240 void AliMpPlaneAreaPadIterator::Invalidate()
242 // Invalidates all sector iterators and sets the current
243 // iterator to invalid position.
247 PadIteratorVectorIterator it;
248 for (it=fPadIterators.begin(); it !=fPadIterators.end(); it++) {
252 fCurrentIterator = fPadIterators.end();
256 for (Int_t i=0; i<fPadIterators.GetEntriesFast(); i++) {
257 ((AliMpTransformPadIterator*)fPadIterators.At(i))->Invalidate();
260 fCurrentIterator = fPadIterators.GetEntriesFast();