]>
Commit | Line | Data |
---|---|---|
ea4cae7a | 1 | // $Id$ |
2 | // Category: sector | |
3 | // | |
4 | // Class AliMpRowSegmentLSpecial | |
5 | // ----------------------------- | |
6 | // Class describing a special inner row segment composed of the | |
7 | // pad rows. | |
8 | // | |
9 | // Authors: David Guez, Ivana Hrivnacova; IPN Orsay | |
10 | ||
11 | #include <TError.h> | |
12 | ||
13 | #include "AliMpRowSegmentLSpecial.h" | |
14 | #include "AliMpRow.h" | |
15 | #include "AliMpPadRow.h" | |
16 | #include "AliMpVPadRowSegment.h" | |
17 | #include "AliMpMotif.h" | |
18 | #include "AliMpMotifType.h" | |
19 | #include "AliMpMotifMap.h" | |
20 | #include "AliMpMotifPosition.h" | |
21 | #include "AliMpConstants.h" | |
22 | ||
23 | ClassImp(AliMpRowSegmentLSpecial) | |
24 | ||
25 | //______________________________________________________________________________ | |
26 | AliMpRowSegmentLSpecial::AliMpRowSegmentLSpecial(AliMpRow* row, Double_t offsetX) | |
27 | : AliMpVRowSegmentSpecial(row, offsetX) | |
28 | { | |
29 | // | |
30 | } | |
31 | ||
32 | //______________________________________________________________________________ | |
33 | AliMpRowSegmentLSpecial::AliMpRowSegmentLSpecial() | |
34 | : AliMpVRowSegmentSpecial() | |
35 | { | |
36 | // | |
37 | } | |
38 | ||
39 | //______________________________________________________________________________ | |
40 | AliMpRowSegmentLSpecial::~AliMpRowSegmentLSpecial() | |
41 | { | |
42 | // | |
43 | } | |
44 | ||
45 | // | |
46 | // private methods | |
47 | // | |
48 | ||
49 | //______________________________________________________________________________ | |
50 | AliMpVPadRowSegment* | |
51 | AliMpRowSegmentLSpecial::FindMostRightPadRowSegment(Int_t motifPositionId) const | |
52 | { | |
53 | // Find the most right pad row segment with this motifPositionId. | |
54 | // --- | |
55 | ||
56 | AliMpVPadRowSegment* found = 0; | |
57 | ||
58 | for (Int_t i=0; i<GetNofPadRows(); i++) { | |
59 | AliMpPadRow* padRow = GetPadRow(i); | |
60 | ||
61 | for (Int_t j=0; j<padRow->GetNofPadRowSegments(); j++) { | |
62 | AliMpVPadRowSegment* padRowSegment = padRow->GetPadRowSegment(j); | |
63 | ||
64 | if ( padRowSegment->GetMotifPositionId() == motifPositionId && | |
65 | (!found || padRowSegment->RightBorderX() > found->RightBorderX())) | |
66 | ||
67 | found = padRowSegment; | |
68 | } | |
69 | } | |
70 | ||
71 | return found; | |
72 | } | |
73 | ||
74 | // | |
75 | // protected methods | |
76 | // | |
77 | ||
78 | //______________________________________________________________________________ | |
79 | TVector2 AliMpRowSegmentLSpecial::MotifCenterSlow(Int_t motifPositionId) const | |
80 | { | |
81 | // Returns the coordinates of the motif specified with | |
82 | // the given position identifier. | |
83 | // !! Applicable only for motifs that have their most down pad in | |
84 | // this row segment. | |
85 | // --- | |
86 | ||
87 | // Find the first (left, down) pad row segment with this motifPositionId. | |
88 | AliMpVPadRowSegment* downPadRowSegment | |
89 | = FindPadRowSegment(motifPositionId); | |
90 | AliMpVPadRowSegment* rightPadRowSegment | |
91 | = FindMostRightPadRowSegment(motifPositionId); | |
92 | ||
93 | // Check if the motifPositionId is present | |
94 | if (!downPadRowSegment || !rightPadRowSegment) { | |
95 | Error("MotifCenter", "Outside row segment region"); | |
96 | return 0; | |
97 | } | |
98 | ||
99 | // Check if both pad row segments have the same motif | |
100 | if (downPadRowSegment->GetMotif() != rightPadRowSegment->GetMotif()) { | |
101 | Fatal("MotifCenter", "Outside row segment region"); | |
102 | return 0; | |
103 | } | |
104 | ||
105 | // Get position of found row segment | |
106 | Double_t x = rightPadRowSegment->RightBorderX(); | |
107 | Double_t y = GetRow()->LowBorderY() ; | |
108 | ||
109 | for (Int_t i=0; i<downPadRowSegment->GetPadRow()->GetID(); i++) | |
110 | y += GetPadRow(i)->HalfSizeY()*2.; | |
111 | ||
112 | // Add motifs dimensions | |
113 | x -= downPadRowSegment->GetMotif()->Dimensions().X(); | |
114 | y += downPadRowSegment->GetMotif()->Dimensions().Y(); | |
115 | ||
116 | return TVector2(x, y); | |
117 | } | |
118 | ||
119 | // | |
120 | // public methods | |
121 | // | |
122 | ||
123 | //______________________________________________________________________________ | |
124 | void AliMpRowSegmentLSpecial::UpdatePadsOffset() | |
125 | { | |
126 | // Sets low indices limit to the pad offset calculated | |
127 | // from the neighbour normal segment. | |
128 | // --- | |
129 | ||
130 | // Get the neighbour row segment | |
131 | // (the first normal segment) | |
132 | AliMpVRowSegment* neighbour = GetRow()->GetRowSegment(1); | |
133 | ||
134 | // Get the the pads offset of the neighbour row segment | |
135 | // (the first normal segment) | |
136 | AliMpIntPair offset = neighbour->GetLowIndicesLimit(); | |
137 | ||
138 | // Find max nof pads in a row | |
139 | Int_t maxNofPads = MaxNofPadsInRow(); | |
140 | ||
141 | // Set limits | |
142 | SetLowIndicesLimit(offset - AliMpIntPair(maxNofPads, 0)); | |
143 | ||
144 | // Reset limits in the neighbour row segment | |
145 | // (pad offset is now included in the special segment) | |
146 | neighbour->SetLowIndicesLimit( | |
147 | AliMpIntPair(0, neighbour->GetLowIndicesLimit().GetSecond())); | |
148 | } | |
149 | ||
150 | //______________________________________________________________________________ | |
151 | Double_t AliMpRowSegmentLSpecial::LeftBorderX() const | |
152 | { | |
153 | // Returns the x coordinate of the left row segment border | |
154 | // in global coordinate system. | |
155 | // --- | |
156 | ||
157 | Double_t leftBorder = DBL_MAX; | |
158 | for (Int_t i=0; i<GetNofPadRows(); i++) { | |
159 | AliMpPadRow* padRow = GetPadRow(i); | |
160 | Double_t border | |
161 | = padRow->GetPadRowSegment(padRow->GetNofPadRowSegments()-1)->LeftBorderX(); | |
162 | ||
163 | if (border < leftBorder) leftBorder = border; | |
164 | } | |
165 | ||
166 | return leftBorder; | |
167 | } | |
168 | ||
169 | //______________________________________________________________________________ | |
170 | Double_t AliMpRowSegmentLSpecial::RightBorderX() const | |
171 | { | |
172 | // Returns the x coordinate of the right row segment border | |
173 | // in global coordinate system. | |
174 | // --- | |
175 | ||
176 | Double_t sameBorder = GetOffsetX(); | |
177 | ||
178 | // Consistence check | |
179 | Double_t rightBorder = -DBL_MAX; | |
180 | for (Int_t i=0; i<GetNofPadRows(); i++) { | |
181 | AliMpPadRow* padRow = GetPadRow(i); | |
182 | Double_t border = padRow->GetPadRowSegment(0)->RightBorderX(); | |
183 | if (border > rightBorder) rightBorder = border; | |
184 | } | |
185 | ||
186 | if (TMath::Abs(GetOffsetX() - rightBorder) > 1.e-04) { | |
187 | Error("RightBorderX", "WrongBorder"); | |
188 | return sameBorder; | |
189 | } | |
190 | ||
191 | return rightBorder; | |
192 | } | |
193 | ||
194 | //______________________________________________________________________________ | |
195 | TVector2 AliMpRowSegmentLSpecial::Position() const | |
196 | { | |
197 | // Returns the position of the row segment centre. | |
198 | // The centre is defined as the centre of the rectangular | |
199 | // row segment envelope. | |
200 | // --- | |
201 | ||
202 | Double_t x = GetOffsetX() - Dimensions().X(); | |
203 | Double_t y = GetRow()->Position().Y(); | |
204 | ||
205 | return TVector2(x, y); | |
206 | } | |
207 | ||
208 | //______________________________________________________________________________ | |
209 | Int_t AliMpRowSegmentLSpecial::SetIndicesToMotifPosition(Int_t i, | |
210 | const AliMpIntPair& indices) | |
211 | { | |
212 | // Sets global indices to i-th motif position and returns next index in x. | |
213 | // --- | |
214 | ||
215 | // Get motif position | |
216 | AliMpMotifPosition* motifPosition | |
217 | = GetRow()->GetMotifMap()->FindMotifPosition(GetMotifPositionId(i)); | |
218 | ||
219 | // Low limit | |
220 | AliMpIntPair low | |
221 | = AliMpIntPair(GetLowIndicesLimit().GetFirst() + AliMpConstants::StartPadIndex(), | |
222 | indices.GetSecond()) | |
223 | + FindRelativeLowIndicesOf(GetMotifPositionId(i)); | |
224 | ||
225 | if (! motifPosition->GetHighIndicesLimit().IsValid()) { | |
226 | motifPosition->SetLowIndicesLimit(low); | |
227 | } | |
228 | else { | |
229 | if (motifPosition->GetLowIndicesLimit().GetFirst() > low.GetFirst()) | |
230 | motifPosition->SetLowIndicesLimit( | |
231 | AliMpIntPair(low.GetFirst(), | |
232 | motifPosition->GetLowIndicesLimit().GetSecond())); | |
233 | ||
234 | if (motifPosition->GetLowIndicesLimit().GetSecond() > low.GetSecond()) | |
235 | motifPosition->SetLowIndicesLimit( | |
236 | AliMpIntPair(motifPosition->GetLowIndicesLimit().GetFirst(), | |
237 | low.GetSecond())); | |
238 | } | |
239 | ||
240 | // High limit | |
241 | AliMpMotifType* motifType = motifPosition->GetMotif()->GetMotifType(); | |
242 | AliMpIntPair high | |
243 | = motifPosition->GetLowIndicesLimit() | |
244 | + AliMpIntPair(motifType->GetNofPadsX()-1, motifType->GetNofPadsY()-1); | |
245 | motifPosition->SetHighIndicesLimit(high); | |
246 | ||
247 | // Increment index only if last motif position is processed | |
248 | if (i != GetNofMotifs()-1) | |
249 | return indices.GetFirst(); | |
250 | //return 0; | |
251 | else | |
252 | return indices.GetFirst() + MaxNofPadsInRow(); | |
253 | //return MaxNofPadsInRow(); | |
254 | } | |
255 | ||
256 | ||
257 |