]> git.uio.no Git - u/mrichter/AliRoot.git/blame - MUON/mapping/AliMpRowSegmentLSpecial.cxx
Update for station2:
[u/mrichter/AliRoot.git] / MUON / mapping / AliMpRowSegmentLSpecial.cxx
CommitLineData
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
23ClassImp(AliMpRowSegmentLSpecial)
24
25//______________________________________________________________________________
26AliMpRowSegmentLSpecial::AliMpRowSegmentLSpecial(AliMpRow* row, Double_t offsetX)
27 : AliMpVRowSegmentSpecial(row, offsetX)
28{
29//
30}
31
32//______________________________________________________________________________
33AliMpRowSegmentLSpecial::AliMpRowSegmentLSpecial()
34 : AliMpVRowSegmentSpecial()
35{
36//
37}
38
39//______________________________________________________________________________
40AliMpRowSegmentLSpecial::~AliMpRowSegmentLSpecial()
41{
42//
43}
44
45//
46// private methods
47//
48
49//______________________________________________________________________________
50AliMpVPadRowSegment*
51AliMpRowSegmentLSpecial::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//______________________________________________________________________________
79TVector2 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//______________________________________________________________________________
124void 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//______________________________________________________________________________
151Double_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//______________________________________________________________________________
170Double_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//______________________________________________________________________________
195TVector2 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//______________________________________________________________________________
209Int_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