]> git.uio.no Git - u/mrichter/AliRoot.git/blob - MUON/mapping/AliMpPlaneAreaPadIterator.cxx
e6f39452c976778737837f9993da3a3f8ec338a5
[u/mrichter/AliRoot.git] / MUON / mapping / AliMpPlaneAreaPadIterator.cxx
1 // $Id$
2 // Category: plane
3 //
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
10
11 #include <Riostream.h>
12 #include <TVector2.h>
13
14 #include "AliMpPlaneAreaPadIterator.h"
15 #include "AliMpTransformPadIterator.h"
16 #include "AliMpPlaneSegmentation.h"
17 #include "AliMpSectorSegmentation.h"
18
19 ClassImp(AliMpPlaneAreaPadIterator)
20
21 //______________________________________________________________________________
22 AliMpPlaneAreaPadIterator::AliMpPlaneAreaPadIterator(
23                                 const AliMpPlaneSegmentation* segmentation,
24                                 const AliMpArea& area) 
25  : AliMpVPadIterator(),
26    fkPlaneSegmentation(segmentation),
27    fkArea(area),
28    fPadIterators()
29 {
30 // Normal constructor, start in invalid position
31  
32   DecomposeArea();
33
34 #ifdef WITH_STL
35   fCurrentIterator = fPadIterators.end();
36 #endif
37
38 #ifdef WITH_ROOT
39   fCurrentIterator = fPadIterators.GetEntriesFast();
40 #endif
41 }
42
43 //______________________________________________________________________________
44 AliMpPlaneAreaPadIterator::AliMpPlaneAreaPadIterator(
45                                 const AliMpPlaneAreaPadIterator& right)
46   : AliMpVPadIterator(right)
47 {
48 // Copy constructor
49  
50   Fatal("Copy constructor", "Not implemented");
51 }
52
53 //______________________________________________________________________________
54 AliMpPlaneAreaPadIterator::AliMpPlaneAreaPadIterator()
55  : AliMpVPadIterator(),
56    fkPlaneSegmentation(0),
57    fkArea(AliMpArea()),
58    fPadIterators()
59 {
60 // Dummy default constructor.
61 }
62
63 //______________________________________________________________________________
64 AliMpPlaneAreaPadIterator::~AliMpPlaneAreaPadIterator()
65 {
66 // Destructor
67
68   // delete created iterators here
69 }
70
71 //
72 // operators
73 //
74
75 //______________________________________________________________________________
76 AliMpPlaneAreaPadIterator& 
77 AliMpPlaneAreaPadIterator::operator = (const AliMpPlaneAreaPadIterator& right)
78 {
79 // Assignement operator
80
81   // check assignement to self
82   if (this == &right) return *this;
83
84   Fatal("operator =", "Assignement operator not provided.");
85
86   return *this;
87
88
89 //
90 // private methods
91 //
92
93 //______________________________________________________________________________
94 void AliMpPlaneAreaPadIterator::DecomposeArea()
95 {
96 // Decompose the area into areas belonging to the quadrants.
97 // --
98
99   for (Int_t i=0; i<fkPlaneSegmentation->GetNofTransformers(); i++) {
100   
101     AliMpTransformer* transformer = fkPlaneSegmentation->GetTransformer(i);
102     AliMpArea area = transformer->CutArea(fkArea);
103
104     if (area.IsValid()) {
105     
106       AliMpSectorSegmentation* segmentation 
107         = fkPlaneSegmentation->GetSectorSegmentation(transformer->GetScale());
108           
109       AliMpVPadIterator* sectorIt 
110         = segmentation->CreateIterator(area);
111             
112 #ifdef WITH_STL
113       fPadIterators.push_back(
114         new AliMpTransformPadIterator(sectorIt, transformer));
115 #endif
116
117 #ifdef WITH_ROOT
118       fPadIterators.Add(
119         new AliMpTransformPadIterator(sectorIt, transformer));
120 #endif
121     }   
122   }
123 }
124
125 //
126 // public methods
127 //
128
129 //______________________________________________________________________________
130 void AliMpPlaneAreaPadIterator::First()
131 {
132 // Reset the iterator, so that it points to the first available
133 // pad in the area
134 // ---
135
136 #ifdef WITH_STL
137   if (fPadIterators.size()==0) return;
138
139   fCurrentIterator = fPadIterators.begin();
140   (*fCurrentIterator)->First();
141
142   while ( fCurrentIterator != fPadIterators.end() &&
143           (*fCurrentIterator)->IsDone()) {
144          
145     fCurrentIterator++;
146     if (fCurrentIterator != fPadIterators.end()) {
147       (*fCurrentIterator)->First();
148     }    
149   }
150 #endif
151
152 #ifdef WITH_ROOT
153   if (fPadIterators.GetEntriesFast()==0) return;
154
155   fCurrentIterator = 0;
156   ((AliMpTransformPadIterator*)fPadIterators.At(fCurrentIterator))->First();
157
158   while ( fCurrentIterator != fPadIterators.GetEntriesFast() &&
159           ((AliMpTransformPadIterator*)fPadIterators.At(fCurrentIterator))
160             ->IsDone()) {
161
162     fCurrentIterator++;
163     if (fCurrentIterator != fPadIterators.GetEntriesFast()) {
164       ((AliMpTransformPadIterator*)fPadIterators.At(fCurrentIterator))->First();
165     }    
166   }
167 #endif
168 }
169
170 //______________________________________________________________________________
171 void AliMpPlaneAreaPadIterator::Next()
172 {
173 // Move the iterator to the next valid pad.
174 // ---
175
176 #ifdef WITH_STL
177   (*fCurrentIterator)->Next();
178   
179   while ( fCurrentIterator != fPadIterators.end() &&
180           (*fCurrentIterator)->IsDone()) {
181          
182     fCurrentIterator++;
183     if (fCurrentIterator != fPadIterators.end()) {
184       (*fCurrentIterator)->First();
185     }    
186   }
187 #endif
188
189 #ifdef WITH_ROOT
190   ((AliMpTransformPadIterator*)fPadIterators.At(fCurrentIterator))->Next();
191
192   while ( fCurrentIterator != fPadIterators.GetEntriesFast() &&
193           ((AliMpTransformPadIterator*)fPadIterators.At(fCurrentIterator))
194             ->IsDone()) {
195          
196     fCurrentIterator++;
197     if (fCurrentIterator != fPadIterators.GetEntriesFast()) {
198       ((AliMpTransformPadIterator*)fPadIterators.At(fCurrentIterator))->First();
199     }    
200   }
201 #endif
202 }
203
204 //______________________________________________________________________________
205 Bool_t AliMpPlaneAreaPadIterator::IsDone() const
206 {
207 // 
208 #ifdef WITH_STL
209   return  fCurrentIterator == fPadIterators.end();
210 #endif
211
212 #ifdef WITH_ROOT
213   return  fCurrentIterator == fPadIterators.GetEntriesFast();
214 #endif
215 }
216
217 //______________________________________________________________________________
218 AliMpPad AliMpPlaneAreaPadIterator::CurrentItem() const 
219 {
220 // Returns the current pad.
221 // ---
222
223 #ifdef WITH_STL
224   if (fCurrentIterator != fPadIterators.end())
225     return (*fCurrentIterator)->CurrentItem();
226   else
227     return AliMpPad::Invalid();  
228 #endif
229
230 #ifdef WITH_ROOT
231   if (fCurrentIterator != fPadIterators.GetEntriesFast())
232     return ((AliMpTransformPadIterator*)fPadIterators.At(fCurrentIterator))
233              ->CurrentItem();
234   else
235     return AliMpPad::Invalid();  
236 #endif
237 }
238
239 //______________________________________________________________________________
240 void AliMpPlaneAreaPadIterator::Invalidate()
241 {
242 // Invalidates all sector iterators and sets the current
243 // iterator to invalid position.
244 // ---
245  
246 #ifdef WITH_STL
247   PadIteratorVectorIterator it;
248   for (it=fPadIterators.begin(); it !=fPadIterators.end(); it++) {
249     (*it)->Invalidate(); 
250   }
251   
252   fCurrentIterator = fPadIterators.end();
253 #endif
254
255 #ifdef WITH_ROOT
256   for (Int_t i=0; i<fPadIterators.GetEntriesFast(); i++) {
257     ((AliMpTransformPadIterator*)fPadIterators.At(i))->Invalidate();
258   }  
259
260   fCurrentIterator = fPadIterators.GetEntriesFast();
261 #endif
262 }
263