]>
Commit | Line | Data |
---|---|---|
dee1d5f1 | 1 | /************************************************************************** |
2 | * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. * | |
3 | * * | |
4 | * Author: The ALICE Off-line Project. * | |
5 | * Contributors are mentioned in the code where appropriate. * | |
6 | * * | |
7 | * Permission to use, copy, modify and distribute this software and its * | |
8 | * documentation strictly for non-commercial purposes is hereby granted * | |
9 | * without fee, provided that the above copyright notice appears in all * | |
10 | * copies and that both the copyright notice and this permission notice * | |
11 | * appear in the supporting documentation. The authors make no claims * | |
12 | * about the suitability of this software for any purpose. It is * | |
13 | * provided "as is" without express or implied warranty. * | |
14 | **************************************************************************/ | |
15 | ||
5f91c9e8 | 16 | // $Id$ |
13985652 | 17 | // $MpId: AliMpMotifTypePadIterator.cxx,v 1.6 2006/05/24 13:58:41 ivana Exp $ |
5f91c9e8 | 18 | // Category: motif |
19 | // | |
20 | // Class AliMpMotifTypePadIterator | |
21 | // ------------------------------- | |
22 | // Class, which defines an iterator over the pads of a given motif type | |
dbe945cc | 23 | // Included in AliRoot: 2003/05/02 |
5f91c9e8 | 24 | // Authors: David Guez, Ivana Hrivnacova; IPN Orsay |
25 | ||
26 | #include "AliMpMotifTypePadIterator.h" | |
27 | #include "AliMpMotifType.h" | |
28 | ||
13985652 | 29 | /// \cond CLASSIMP |
5f91c9e8 | 30 | ClassImp(AliMpMotifTypePadIterator) |
13985652 | 31 | /// \endcond |
5f91c9e8 | 32 | |
33 | //______________________________________________________________________________ | |
34 | AliMpMotifTypePadIterator::AliMpMotifTypePadIterator(): | |
35 | AliMpVPadIterator(), | |
36 | fMotifType(0), | |
37 | fCurrentPosition(AliMpIntPair::Invalid()) | |
38 | { | |
dee1d5f1 | 39 | /// Default constructor, set the current position to "invalid" |
5f91c9e8 | 40 | } |
41 | ||
42 | //______________________________________________________________________________ | |
43 | AliMpMotifTypePadIterator::AliMpMotifTypePadIterator( | |
44 | const AliMpMotifType* motifType) | |
45 | : AliMpVPadIterator(), | |
46 | fMotifType(motifType), | |
47 | fCurrentPosition(AliMpIntPair::Invalid()) | |
48 | { | |
dee1d5f1 | 49 | /// Standard constructor, let *this to invalid position |
5f91c9e8 | 50 | } |
51 | ||
52 | //______________________________________________________________________________ | |
53 | AliMpMotifTypePadIterator::AliMpMotifTypePadIterator( | |
54 | const AliMpMotifTypePadIterator& right) | |
55 | : AliMpVPadIterator(right), | |
56 | fMotifType(right.fMotifType), | |
57 | fCurrentPosition(right.fCurrentPosition) | |
58 | ||
59 | { | |
dee1d5f1 | 60 | /// Copy constructor |
5f91c9e8 | 61 | } |
62 | ||
63 | //______________________________________________________________________________ | |
64 | AliMpMotifTypePadIterator::~AliMpMotifTypePadIterator() | |
65 | { | |
dee1d5f1 | 66 | /// Destructor |
5f91c9e8 | 67 | } |
68 | ||
69 | // operators | |
70 | ||
71 | //______________________________________________________________________________ | |
72 | AliMpMotifTypePadIterator& | |
73 | AliMpMotifTypePadIterator::operator = (const AliMpMotifTypePadIterator& right) | |
74 | { | |
dee1d5f1 | 75 | /// Assignment operator. \n |
76 | /// If the right hand iterator isn't of good type | |
77 | /// the current operator is invalidated | |
5f91c9e8 | 78 | |
dee1d5f1 | 79 | // check assignment to self |
5f91c9e8 | 80 | if (this == &right) return *this; |
81 | ||
dee1d5f1 | 82 | // base class assignment |
5f91c9e8 | 83 | AliMpVPadIterator::operator=(right); |
84 | ||
85 | fMotifType = right.fMotifType; | |
86 | fCurrentPosition = right.fCurrentPosition; | |
87 | ||
88 | return *this; | |
89 | } | |
90 | ||
91 | // | |
92 | //private methods | |
93 | // | |
94 | ||
95 | //______________________________________________________________________________ | |
96 | AliMpIntPair | |
97 | AliMpMotifTypePadIterator::FindFirstPadInLine(AliMpIntPair indices) const | |
98 | { | |
dee1d5f1 | 99 | /// Find the indices of the first pad in the same line |
13985652 | 100 | /// as the \a indices, and in column, at least equal, to the |
101 | /// one of \a indices | |
5f91c9e8 | 102 | |
103 | if (!fMotifType) return AliMpIntPair::Invalid(); | |
104 | ||
105 | while (indices.GetFirst() < fMotifType->GetNofPadsX()) { | |
106 | if (fMotifType->HasPad(indices)) return indices; | |
107 | indices += AliMpIntPair(1,0); | |
108 | } | |
109 | return AliMpIntPair::Invalid(); | |
110 | } | |
111 | ||
112 | //______________________________________________________________________________ | |
113 | Bool_t AliMpMotifTypePadIterator::IsValid() const | |
114 | { | |
dee1d5f1 | 115 | /// Is the iterator in a valid position? |
5f91c9e8 | 116 | |
117 | return fMotifType!=0 && fCurrentPosition.IsValid(); | |
118 | } | |
119 | ||
120 | // | |
121 | //public methods | |
122 | // | |
123 | ||
124 | //______________________________________________________________________________ | |
125 | void AliMpMotifTypePadIterator::First() | |
126 | { | |
dee1d5f1 | 127 | /// Reset the iterator, so that it points to the first available |
128 | /// pad in the motif type | |
5f91c9e8 | 129 | |
130 | if (!fMotifType) { | |
131 | Invalidate(); | |
132 | return ; | |
133 | } | |
134 | fCurrentPosition = AliMpIntPair(0,0); | |
135 | if (fMotifType->HasPad(fCurrentPosition)) return; | |
136 | ||
137 | ||
138 | // if (0,0) is not available | |
139 | // place itself to the first avalable motif after (0,0) (if exists) | |
140 | // ++(*this); | |
141 | Next(); | |
142 | ||
143 | return; | |
144 | } | |
145 | ||
146 | //______________________________________________________________________________ | |
147 | void AliMpMotifTypePadIterator::Next() | |
148 | { | |
dee1d5f1 | 149 | /// Move the iterator to the next valid pad. |
5f91c9e8 | 150 | |
151 | //if (!IsValid()) return *this; | |
152 | if (!IsValid()) return; | |
153 | ||
154 | while (fCurrentPosition.GetSecond() < fMotifType->GetNofPadsY()){ | |
155 | AliMpIntPair nextTry | |
156 | = FindFirstPadInLine(fCurrentPosition + AliMpIntPair(1,0)); | |
157 | if (nextTry.IsValid()){ | |
158 | fCurrentPosition = nextTry; | |
159 | return; | |
160 | } | |
161 | fCurrentPosition.SetFirst(-1); | |
162 | fCurrentPosition.SetSecond(fCurrentPosition.GetSecond()+1); | |
163 | } | |
164 | ||
165 | // if the loop is finished, there's not available pads at all... | |
166 | Invalidate(); | |
167 | return; | |
168 | } | |
169 | ||
170 | //______________________________________________________________________________ | |
171 | Bool_t AliMpMotifTypePadIterator::IsDone() const | |
172 | { | |
dee1d5f1 | 173 | /// Is the iterator in the end ? |
174 | ||
5f91c9e8 | 175 | return !IsValid(); |
176 | } | |
177 | ||
178 | //______________________________________________________________________________ | |
179 | AliMpPad AliMpMotifTypePadIterator::CurrentItem() const | |
180 | { | |
dee1d5f1 | 181 | /// Return current pad. |
5f91c9e8 | 182 | |
183 | if (!fMotifType) | |
184 | return AliMpPad::Invalid(); | |
185 | else | |
186 | return AliMpPad(AliMpIntPair::Invalid(), | |
187 | fCurrentPosition,TVector2(),TVector2()); | |
188 | } | |
189 | ||
190 | //______________________________________________________________________________ | |
191 | void AliMpMotifTypePadIterator::Invalidate() | |
192 | { | |
dee1d5f1 | 193 | /// Let the iterator point to the invalid position |
194 | ||
5f91c9e8 | 195 | fCurrentPosition = AliMpIntPair::Invalid(); |
196 | ||
197 | } | |
198 |