- Adding comment lines to class description needed for Root documentation
[u/mrichter/AliRoot.git] / MUON / mapping / AliMpRowSegmentRSpecial.cxx
CommitLineData
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
ea4cae7a 16// $Id$
13985652 17// $MpId: AliMpRowSegmentRSpecial.cxx,v 1.7 2006/05/24 13:58:46 ivana Exp $
ea4cae7a 18// Category: sector
19//
20// Class AliMpRowSegmentRSpecial
21// -----------------------------
22// Class describing a special outer row segment composed of the
23// pad rows.
dbe945cc 24// Included in AliRoot: 2003/05/02
ea4cae7a 25// Authors: David Guez, Ivana Hrivnacova; IPN Orsay
26
ea4cae7a 27#include "AliMpRowSegmentRSpecial.h"
28#include "AliMpRow.h"
29#include "AliMpPadRow.h"
30#include "AliMpVPadRowSegment.h"
31#include "AliMpMotif.h"
32#include "AliMpMotifType.h"
33#include "AliMpMotifMap.h"
34#include "AliMpMotifPosition.h"
580c28fd 35#include "AliMpConstants.h"
ea4cae7a 36
97186a3f 37#include "AliLog.h"
38
39#include <Riostream.h>
40#include <TMath.h>
41
13985652 42/// \cond CLASSIMP
ea4cae7a 43ClassImp(AliMpRowSegmentRSpecial)
13985652 44/// \endcond
ea4cae7a 45
46//______________________________________________________________________________
47AliMpRowSegmentRSpecial::AliMpRowSegmentRSpecial(AliMpRow* row, Double_t offsetX)
48 : AliMpVRowSegmentSpecial(row, offsetX)
49{
dee1d5f1 50/// Standard constructor
ea4cae7a 51}
52
53//______________________________________________________________________________
54AliMpRowSegmentRSpecial::AliMpRowSegmentRSpecial()
55 : AliMpVRowSegmentSpecial()
56{
dee1d5f1 57/// Default constructor
ea4cae7a 58}
59
60//______________________________________________________________________________
61AliMpRowSegmentRSpecial::~AliMpRowSegmentRSpecial()
62{
dee1d5f1 63/// Destructor
ea4cae7a 64}
65
66//
67// private methods
68//
69
70//______________________________________________________________________________
71AliMpVPadRowSegment*
72AliMpRowSegmentRSpecial::FindMostLeftPadRowSegment(Int_t motifPositionId) const
73{
dee1d5f1 74/// Find the most left pad row segment with this motifPositionId.
ea4cae7a 75
76 AliMpVPadRowSegment* found = 0;
77
78 for (Int_t i=0; i<GetNofPadRows(); i++) {
79 AliMpPadRow* padRow = GetPadRow(i);
80
81 for (Int_t j=0; j<padRow->GetNofPadRowSegments(); j++) {
82 AliMpVPadRowSegment* padRowSegment = padRow->GetPadRowSegment(j);
83
84 if ( padRowSegment->GetMotifPositionId() == motifPositionId &&
85 (!found || padRowSegment->LeftBorderX() < found->LeftBorderX()))
86
87 found = padRowSegment;
88 }
89 }
90
91 return found;
92}
93
94//______________________________________________________________________________
95void AliMpRowSegmentRSpecial::SetGlobalIndicesLow()
96{
dee1d5f1 97/// Set global low indices
ea4cae7a 98
99 // Last normal row segment in the row
100 // (preceding this special row segment)
101 AliMpVRowSegment* rowSegment
102 = GetRow()->GetRowSegment(GetRow()->GetNofRowSegments()-2);
103
104 // Set low indices limit to continue indices of the
105 // preceding row segment
106 Int_t ix = rowSegment->GetHighIndicesLimit().GetFirst() + 1;
107 Int_t iy = rowSegment->GetLowIndicesLimit().GetSecond();
108
109 SetLowIndicesLimit(AliMpIntPair(ix, iy));
110}
111
112//
113// protected methods
114//
115
116//______________________________________________________________________________
117TVector2 AliMpRowSegmentRSpecial::MotifCenterSlow(Int_t motifPositionId) const
118{
dee1d5f1 119/// Return the coordinates of the motif specified with
120/// the given position identifier. \n
121/// !! Applicable only for motifs that have their most down pad in
122/// this row segment.
ea4cae7a 123
124 // Find the first (left, down) pad row segment with this motifPositionId.
125 AliMpVPadRowSegment* downPadRowSegment
126 = FindPadRowSegment(motifPositionId);
127 AliMpVPadRowSegment* leftPadRowSegment
128 = FindMostLeftPadRowSegment(motifPositionId);
129
130 // Check if the motifPositionId is present
131 if (!downPadRowSegment || !leftPadRowSegment) {
2c605e66 132 AliErrorStream() << "Outside row segment region" << endl;
ea4cae7a 133 return 0;
134 }
135
136 // Check if both pad row segments have the same motif
137 if (downPadRowSegment->GetMotif() != leftPadRowSegment->GetMotif()) {
2c605e66 138 AliFatal("Outside row segment region");
ea4cae7a 139 return 0;
140 }
141
142 // Get position of found row segment
143 Double_t x = leftPadRowSegment->LeftBorderX();
144 Double_t y = GetRow()->LowBorderY() ;
145
146 for (Int_t i=0; i<downPadRowSegment->GetPadRow()->GetID(); i++)
147 y += GetPadRow(i)->HalfSizeY()*2.;
148
149 // Add motifs dimensions
150 x += downPadRowSegment->GetMotif()->Dimensions().X();
151 y += downPadRowSegment->GetMotif()->Dimensions().Y();
152
153 return TVector2(x, y);
154}
155
156//
157// public methods
158//
159
160//______________________________________________________________________________
161Double_t AliMpRowSegmentRSpecial::LeftBorderX() const
162{
dee1d5f1 163/// Return the x coordinate of the left row segment border
164/// in the global coordinate system.
ea4cae7a 165
166 // The right edge of the last normal segment
167 Double_t sameBorder = GetOffsetX();
168
169 // Consistence check
170 Double_t leftBorder = DBL_MAX;
171 for (Int_t i=0; i<GetNofPadRows(); i++) {
172 AliMpPadRow* padRow = GetPadRow(i);
173 Double_t border = padRow->GetPadRowSegment(0)->LeftBorderX();
174 if (border < leftBorder) leftBorder = border;
175 }
176
177 if (TMath::Abs(sameBorder - leftBorder) > 1.e-04) {
2c605e66 178 AliErrorStream() << "WrongBorder" << endl;;
ea4cae7a 179 return sameBorder;
180 }
181
182 return leftBorder;
183
184}
185
186//______________________________________________________________________________
187Double_t AliMpRowSegmentRSpecial::RightBorderX() const
188{
dee1d5f1 189/// Return the x coordinate of the right row segment border
190/// in the global coordinate system.
ea4cae7a 191
192 Double_t rightBorder = -DBL_MAX;
193 for (Int_t i=0; i<GetNofPadRows(); i++) {
194 AliMpPadRow* padRow = GetPadRow(i);
195 Double_t border
196 = padRow->GetPadRowSegment(padRow->GetNofPadRowSegments()-1)
197 ->RightBorderX();
198
199 if (border > rightBorder) rightBorder = border;
200 }
201
202 return rightBorder;
203}
204
205//______________________________________________________________________________
206TVector2 AliMpRowSegmentRSpecial::Position() const
207{
dee1d5f1 208/// Return the position of the row segment centre.
209/// The centre is defined as the centre of the rectangular
210/// row segment envelope.
ea4cae7a 211
212 // The right edge of the last normal segment
213 Double_t x = GetOffsetX() + Dimensions().X();
214 Double_t y = GetRow()->Position().Y();
215
216 return TVector2(x, y);
217}
218
219//______________________________________________________________________________
220Int_t AliMpRowSegmentRSpecial::SetIndicesToMotifPosition(Int_t i,
221 const AliMpIntPair& indices)
222{
dee1d5f1 223/// Set global indices to i-th motif position and returns next index in x.
ea4cae7a 224
225 // Update low indices limit for this row segment
226 SetGlobalIndicesLow();
580c28fd 227
ea4cae7a 228 // Check for consistence
229 if (GetLowIndicesLimit().GetFirst() != indices.GetFirst())
c3cd353e 230 AliFatal("Inconsistent indices");
ea4cae7a 231
232 // Get motif position
233 AliMpMotifPosition* motifPosition
234 = GetRow()->GetMotifMap()->FindMotifPosition(GetMotifPositionId(i));
580c28fd 235
236 // Set limits only once
237 if ( motifPosition->GetHighIndicesLimit().IsValid() )
238 return indices.GetFirst();;
ea4cae7a 239
240 // Low limit
580c28fd 241 //
242 Int_t ixl = GetLowIndicesLimit().GetFirst();
243 Int_t iyl = GetLowIndicesLimit().GetSecond();
244
245 // Find the most down pad row segment with this motifPositionId.
246 AliMpVPadRowSegment* padRowSegment = FindPadRowSegment(GetMotifPositionId(i));
247 Int_t padRowID = padRowSegment->GetPadRow()->GetID();
248 iyl += padRowID;
249
250 // Add pads offset of this motif position in the row segment
251 for (Int_t im=0; im<i; im++) {
252 AliMpVPadRowSegment* rs = GetPadRow(padRowID)->GetPadRowSegment(im);
253 if ( rs->GetMotifPositionId() == GetMotifPositionId(i) ) break;
254 ixl += rs->GetNofPads();
255 }
256 motifPosition->SetLowIndicesLimit(AliMpIntPair(ixl, iyl));
ea4cae7a 257
580c28fd 258 // High limit
259 //
ea4cae7a 260 AliMpMotifType* motifType = motifPosition->GetMotif()->GetMotifType();
261 AliMpIntPair high
262 = motifPosition->GetLowIndicesLimit()
263 + AliMpIntPair(motifType->GetNofPadsX()-1, motifType->GetNofPadsY()-1);
264 motifPosition->SetHighIndicesLimit(high);
580c28fd 265
ea4cae7a 266 // No increment index needed (this is always the last element)
267 return indices.GetFirst();
268}
269
580c28fd 270//______________________________________________________________________________
271void AliMpRowSegmentRSpecial::SetGlobalIndices(AliMpRow* rowBefore)
272{
dee1d5f1 273/// Set indices limits.
274/// The limits are defined as the limits of the smallest rectangle which
275/// includes all pads of this special row segment.
580c28fd 276
277 // Get first motif position
278 AliMpMotifPosition* firstMotifPosition
279 = GetRow()->GetMotifMap()->FindMotifPosition(GetMotifPositionId(0));
280
281 // Low ix
282 Int_t ixl = firstMotifPosition->GetLowIndicesLimit().GetFirst();
283 // We have to take the motif position limit
284 // as it can overlap over more rows and the indices
285 // of the right border of the precedent normal segment
286 // differ from one row to another
287
288 // High ix
289 Int_t ixh = ixl + MaxNofPadsInRow() - 1;
290
291 // Low iy
292 Int_t iyl = AliMpConstants::StartPadIndex();
293 if (rowBefore) {
294 //if (constPadSizeDirection == kY) {
295 iyl = rowBefore->GetHighIndicesLimit().GetSecond()+1;
296 //}
297 /*
298 else {
299 AliMpVRowSegment* seg = rowBefore->FindRowSegment(ixl);
300 AliMpMotifPosition* motPos = rowBefore->FindMotifPosition(seg, ixl);
301 if (!motPos)
302 Fatal("SetGlobalIndices", "Motif position in rowBefore not found.");
303 iyl = motPos->GetHighIndicesLimit().GetSecond()+1;
304 }
305 */
306 }
307
308 // High iy
309 Int_t iyh = iyl + GetNofPadRows() - 1;
310
311 SetLowIndicesLimit(AliMpIntPair(ixl, iyl));
312 SetHighIndicesLimit(AliMpIntPair(ixh, iyh));
313}
314
ea4cae7a 315