]> git.uio.no Git - u/mrichter/AliRoot.git/blame - MUON/mapping/AliMpMotifTypePadIterator.cxx
Mapping test macros (D. Guez, I. Hrivnacova)
[u/mrichter/AliRoot.git] / MUON / mapping / AliMpMotifTypePadIterator.cxx
CommitLineData
5f91c9e8 1// $Id$
2// Category: motif
3//
4// Class AliMpMotifTypePadIterator
5// -------------------------------
6// Class, which defines an iterator over the pads of a given motif type
dbe945cc 7// Included in AliRoot: 2003/05/02
5f91c9e8 8// Authors: David Guez, Ivana Hrivnacova; IPN Orsay
9
10#include "AliMpMotifTypePadIterator.h"
11#include "AliMpMotifType.h"
12
13ClassImp(AliMpMotifTypePadIterator)
14
15//______________________________________________________________________________
16AliMpMotifTypePadIterator::AliMpMotifTypePadIterator():
17 AliMpVPadIterator(),
18 fMotifType(0),
19 fCurrentPosition(AliMpIntPair::Invalid())
20{
21// default constructor, set the current position to "invalid"
22}
23
24//______________________________________________________________________________
25AliMpMotifTypePadIterator::AliMpMotifTypePadIterator(
26 const AliMpMotifType* motifType)
27 : AliMpVPadIterator(),
28 fMotifType(motifType),
29 fCurrentPosition(AliMpIntPair::Invalid())
30{
31// normal constructor, let *this to invalid position
32}
33
34//______________________________________________________________________________
35AliMpMotifTypePadIterator::AliMpMotifTypePadIterator(
36 const AliMpMotifTypePadIterator& right)
37 : AliMpVPadIterator(right),
38 fMotifType(right.fMotifType),
39 fCurrentPosition(right.fCurrentPosition)
40
41{
42// copy constructor
43}
44
45//______________________________________________________________________________
46AliMpMotifTypePadIterator::~AliMpMotifTypePadIterator()
47{
48// destructor
49}
50
51// operators
52
53//______________________________________________________________________________
54AliMpMotifTypePadIterator&
55AliMpMotifTypePadIterator::operator = (const AliMpMotifTypePadIterator& right)
56{
57// assignement operator
58// if the right hand iterator isn't of good type
59// the current operator is invalidated
60
61 // check assignement to self
62 if (this == &right) return *this;
63
64 // base class assignement
65 AliMpVPadIterator::operator=(right);
66
67 fMotifType = right.fMotifType;
68 fCurrentPosition = right.fCurrentPosition;
69
70 return *this;
71}
72
73//
74//private methods
75//
76
77//______________________________________________________________________________
78AliMpIntPair
79AliMpMotifTypePadIterator::FindFirstPadInLine(AliMpIntPair indices) const
80{
81// Find the indices of the first pad in the same line
82// as the <indices>, and in column, at least equal, to the
83// one of <indices>
84
85 if (!fMotifType) return AliMpIntPair::Invalid();
86
87 while (indices.GetFirst() < fMotifType->GetNofPadsX()) {
88 if (fMotifType->HasPad(indices)) return indices;
89 indices += AliMpIntPair(1,0);
90 }
91 return AliMpIntPair::Invalid();
92}
93
94//______________________________________________________________________________
95Bool_t AliMpMotifTypePadIterator::IsValid() const
96{
97// Is the iterator in a valid position?
98
99 return fMotifType!=0 && fCurrentPosition.IsValid();
100}
101
102//
103//public methods
104//
105
106//______________________________________________________________________________
107void AliMpMotifTypePadIterator::First()
108{
109// Reset the iterator, so that it points to the first available
110// pad in the motif type
111
112 if (!fMotifType) {
113 Invalidate();
114 return ;
115 }
116 fCurrentPosition = AliMpIntPair(0,0);
117 if (fMotifType->HasPad(fCurrentPosition)) return;
118
119
120 // if (0,0) is not available
121 // place itself to the first avalable motif after (0,0) (if exists)
122 // ++(*this);
123 Next();
124
125 return;
126}
127
128//______________________________________________________________________________
129void AliMpMotifTypePadIterator::Next()
130{
131// Move the iterator to the next valid pad.
132
133 //if (!IsValid()) return *this;
134 if (!IsValid()) return;
135
136 while (fCurrentPosition.GetSecond() < fMotifType->GetNofPadsY()){
137 AliMpIntPair nextTry
138 = FindFirstPadInLine(fCurrentPosition + AliMpIntPair(1,0));
139 if (nextTry.IsValid()){
140 fCurrentPosition = nextTry;
141 return;
142 }
143 fCurrentPosition.SetFirst(-1);
144 fCurrentPosition.SetSecond(fCurrentPosition.GetSecond()+1);
145 }
146
147 // if the loop is finished, there's not available pads at all...
148 Invalidate();
149 return;
150}
151
152//______________________________________________________________________________
153Bool_t AliMpMotifTypePadIterator::IsDone() const
154{
155//
156 return !IsValid();
157}
158
159//______________________________________________________________________________
160AliMpPad AliMpMotifTypePadIterator::CurrentItem() const
161{
162// Returns current pad.
163
164 if (!fMotifType)
165 return AliMpPad::Invalid();
166 else
167 return AliMpPad(AliMpIntPair::Invalid(),
168 fCurrentPosition,TVector2(),TVector2());
169}
170
171//______________________________________________________________________________
172void AliMpMotifTypePadIterator::Invalidate()
173{
174// Let the iterator points to the invalid position
175 fCurrentPosition = AliMpIntPair::Invalid();
176
177}
178