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