]> git.uio.no Git - u/mrichter/AliRoot.git/blame - MUON/mapping/AliMpPlaneAreaPadIterator.cxx
Slats mapping files in Bending
[u/mrichter/AliRoot.git] / MUON / mapping / AliMpPlaneAreaPadIterator.cxx
CommitLineData
5f91c9e8 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.
dbe945cc 8// Included in AliRoot: 2003/05/02
5f91c9e8 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
19ClassImp(AliMpPlaneAreaPadIterator)
20
21//______________________________________________________________________________
22AliMpPlaneAreaPadIterator::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
f79c58a5 34#ifdef WITH_STL
5f91c9e8 35 fCurrentIterator = fPadIterators.end();
f79c58a5 36#endif
37
38#ifdef WITH_ROOT
39 fCurrentIterator = fPadIterators.GetEntriesFast();
40#endif
5f91c9e8 41}
42
43//______________________________________________________________________________
44AliMpPlaneAreaPadIterator::AliMpPlaneAreaPadIterator(
45 const AliMpPlaneAreaPadIterator& right)
46 : AliMpVPadIterator(right)
47{
435d6612 48// Copy constructor
5f91c9e8 49
50 Fatal("Copy constructor", "Not implemented");
51}
52
53//______________________________________________________________________________
54AliMpPlaneAreaPadIterator::AliMpPlaneAreaPadIterator()
55 : AliMpVPadIterator(),
56 fkPlaneSegmentation(0),
57 fkArea(AliMpArea()),
58 fPadIterators()
59{
60// Dummy default constructor.
61}
62
63//______________________________________________________________________________
64AliMpPlaneAreaPadIterator::~AliMpPlaneAreaPadIterator()
65{
435d6612 66// Destructor
5f91c9e8 67
68 // delete created iterators here
69}
70
71//
72// operators
73//
74
75//______________________________________________________________________________
76AliMpPlaneAreaPadIterator&
77AliMpPlaneAreaPadIterator::operator = (const AliMpPlaneAreaPadIterator& right)
78{
79// Assignement operator
80
435d6612 81 // check assignement to self
82 if (this == &right) return *this;
83
84 Fatal("operator =", "Assignement operator not provided.");
85
5f91c9e8 86 return *this;
87}
88
89//
90// private methods
91//
92
93//______________________________________________________________________________
94void 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
f79c58a5 112#ifdef WITH_STL
5f91c9e8 113 fPadIterators.push_back(
114 new AliMpTransformPadIterator(sectorIt, transformer));
f79c58a5 115#endif
116
117#ifdef WITH_ROOT
118 fPadIterators.Add(
119 new AliMpTransformPadIterator(sectorIt, transformer));
120#endif
5f91c9e8 121 }
122 }
123}
124
125//
126// public methods
127//
128
129//______________________________________________________________________________
130void AliMpPlaneAreaPadIterator::First()
131{
132// Reset the iterator, so that it points to the first available
133// pad in the area
134// ---
f79c58a5 135
136#ifdef WITH_STL
5f91c9e8 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 }
f79c58a5 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
5f91c9e8 168}
169
170//______________________________________________________________________________
171void AliMpPlaneAreaPadIterator::Next()
172{
173// Move the iterator to the next valid pad.
174// ---
175
f79c58a5 176#ifdef WITH_STL
5f91c9e8 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 }
f79c58a5 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
5f91c9e8 202}
203
204//______________________________________________________________________________
205Bool_t AliMpPlaneAreaPadIterator::IsDone() const
206{
207//
f79c58a5 208#ifdef WITH_STL
5f91c9e8 209 return fCurrentIterator == fPadIterators.end();
f79c58a5 210#endif
211
212#ifdef WITH_ROOT
213 return fCurrentIterator == fPadIterators.GetEntriesFast();
214#endif
5f91c9e8 215}
216
217//______________________________________________________________________________
218AliMpPad AliMpPlaneAreaPadIterator::CurrentItem() const
219{
220// Returns the current pad.
221// ---
222
f79c58a5 223#ifdef WITH_STL
5f91c9e8 224 if (fCurrentIterator != fPadIterators.end())
225 return (*fCurrentIterator)->CurrentItem();
226 else
227 return AliMpPad::Invalid();
f79c58a5 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
5f91c9e8 237}
238
239//______________________________________________________________________________
240void AliMpPlaneAreaPadIterator::Invalidate()
241{
242// Invalidates all sector iterators and sets the current
243// iterator to invalid position.
244// ---
245
f79c58a5 246#ifdef WITH_STL
5f91c9e8 247 PadIteratorVectorIterator it;
248 for (it=fPadIterators.begin(); it !=fPadIterators.end(); it++) {
249 (*it)->Invalidate();
250 }
251
252 fCurrentIterator = fPadIterators.end();
f79c58a5 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
5f91c9e8 262}
263