Replacement of AliMpIntPair object with algoritmic
[u/mrichter/AliRoot.git] / MUON / mapping / AliMpVRowSegmentSpecial.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: AliMpVRowSegmentSpecial.cxx,v 1.9 2006/05/24 13:58:46 ivana Exp $
ea4cae7a 18// Category: sector
3d1463c8 19
20//-----------------------------------------------------------------------------
ea4cae7a 21// Class AliMpVRowSegmentSpecial
22// ----------------------------
23// Class describing a special row segment composed of the
24// pad rows.
dbe945cc 25// Included in AliRoot: 2003/05/02
ea4cae7a 26// Authors: David Guez, Ivana Hrivnacova; IPN Orsay
3d1463c8 27//-----------------------------------------------------------------------------
ea4cae7a 28
ea4cae7a 29#include "AliMpVRowSegmentSpecial.h"
30#include "AliMpRow.h"
31#include "AliMpPadRow.h"
32#include "AliMpVPadRowSegment.h"
33#include "AliMpMotif.h"
34#include "AliMpMotifType.h"
35#include "AliMpMotifMap.h"
36#include "AliMpMotifPosition.h"
37#include "AliMpConstants.h"
38
63ed9c6b 39#include <Riostream.h>
ea4cae7a 40
13985652 41/// \cond CLASSIMP
42ClassImp(AliMpVRowSegmentSpecial)
43/// \endcond
44
f79c58a5 45const Int_t AliMpVRowSegmentSpecial::fgkMaxNofMotifPositionIds = 20;
f79c58a5 46
ea4cae7a 47//______________________________________________________________________________
48AliMpVRowSegmentSpecial::AliMpVRowSegmentSpecial(AliMpRow* row, Double_t offsetX)
49 : AliMpVRowSegment(),
50 fRow(row),
51 fOffsetX(offsetX),
52 fPadRows(),
53 fMotifs(),
2294822d 54 fMotifPositionIds(),
55 fNofMotifPositionIds(0)
ea4cae7a 56{
dee1d5f1 57/// Standard constructor
ea4cae7a 58}
59
60//______________________________________________________________________________
61AliMpVRowSegmentSpecial::AliMpVRowSegmentSpecial()
62 : AliMpVRowSegment(),
63 fRow(0),
64 fOffsetX(0.),
65 fPadRows(),
66 fMotifs(),
2294822d 67 fMotifPositionIds(),
68 fNofMotifPositionIds(0)
ea4cae7a 69{
dee1d5f1 70/// Default constructor
71
f79c58a5 72 fMotifPositionIds.Set(fgkMaxNofMotifPositionIds);
ea4cae7a 73}
74
75//______________________________________________________________________________
76AliMpVRowSegmentSpecial::~AliMpVRowSegmentSpecial()
77{
dee1d5f1 78/// Destructor
79
ea4cae7a 80 for (Int_t i=0; i<GetNofPadRows(); i++)
81 delete fPadRows[i];
82}
83
84//
85// protected methods
86//
87
88//______________________________________________________________________________
89AliMpPadRow* AliMpVRowSegmentSpecial::FindPadRow(Double_t y) const
90{
dee1d5f1 91/// Find the pad row in the given y coordinate.
ea4cae7a 92
93 Double_t lowBorder = fRow->LowBorderY();
94 Double_t highBorder = fRow->LowBorderY();
95
96 for (Int_t i=0; i<GetNofPadRows(); i++) {
97
98 AliMpPadRow* padRow = GetPadRow(i);
99 highBorder += 2.*padRow->HalfSizeY();
100
101 if ( y >= lowBorder && y <= highBorder)
102 return padRow;
103
104 lowBorder = highBorder;
105 }
106
107 return 0;
108}
109
110//______________________________________________________________________________
111AliMpVPadRowSegment*
112AliMpVRowSegmentSpecial::FindPadRowSegment(Int_t motifPositionId) const
113{
dee1d5f1 114/// Find the most down pad row segment with this motifPositionId.
ea4cae7a 115
116 for (Int_t i=0; i<GetNofPadRows(); i++) {
117 AliMpPadRow* padRow = GetPadRow(i);
118
119 for (Int_t j=0; j<padRow->GetNofPadRowSegments(); j++) {
120 AliMpVPadRowSegment* padRowSegment = padRow->GetPadRowSegment(j);
121
122 if (padRowSegment->GetMotifPositionId() == motifPositionId)
123 return padRowSegment;
124 }
125 }
126 return 0;
127}
128
129//______________________________________________________________________________
168e9c4d 130MpPair_t
ea4cae7a 131AliMpVRowSegmentSpecial::FindRelativeLowIndicesOf(Int_t motifPositionId) const
132{
dee1d5f1 133/// Return the lowest pad indices where the motif of the given position ID
134/// exist in this segment.
ea4cae7a 135
168e9c4d 136 Int_t ans0Ix = 0;
137 Int_t ans0Iy = 1000;
138 Int_t ansIx = 0;
139 Int_t ansIy = 1000;
140
ea4cae7a 141 Int_t maxNofPadsX=0;
142
143 for (Int_t i=0; i<GetNofPadRows(); i++) {
144 AliMpPadRow* padRow = GetPadRow(i);
145
146 Int_t nofPadsX=0;
168e9c4d 147 for ( Int_t j=0; j<padRow->GetNofPadRowSegments(); j++ ) {
ea4cae7a 148 AliMpVPadRowSegment* padRowSegment = padRow->GetPadRowSegment(j);
149 nofPadsX += padRowSegment->GetNofPads();
150 if (padRowSegment->GetMotifPositionId() == motifPositionId) {
168e9c4d 151 if ( ansIx < nofPadsX ) ansIx = nofPadsX;
152 if ( ansIy >i ) ansIy = i;
153 // ansIx = max (nof pads of this pos ID)
154 // ansIy = min of pad row number
ea4cae7a 155 }
156 }
168e9c4d 157 if ( nofPadsX > maxNofPadsX ) maxNofPadsX = nofPadsX;
ea4cae7a 158 }
168e9c4d 159 if ( ansIx == ans0Ix && ansIy == ans0Iy ) return -1;
ea4cae7a 160
168e9c4d 161 return AliMp::Pair(maxNofPadsX-ansIx, ansIy);
ea4cae7a 162}
163
164//______________________________________________________________________________
165Int_t AliMpVRowSegmentSpecial::MaxNofPadsInRow() const
166{
dee1d5f1 167/// Return the maximum number of pads in this row segment along the X direction
ea4cae7a 168
169 Int_t maxNofPads = 0;
170
171 for (Int_t i=0; i<GetNofPadRows(); i++){
172 Int_t nofPads = GetPadRow(i)->GetNofPads();
173
174 // Find maximum
175 if (nofPads > maxNofPads) maxNofPads = nofPads;
176 }
177
178 return maxNofPads;
179}
180
181//______________________________________________________________________________
182Bool_t AliMpVRowSegmentSpecial::HasMotif(const AliMpVMotif* motif) const
183{
dee1d5f1 184/// Return true if the specified motif is already in fMotifs vector,
185/// returns false otherwise.
ea4cae7a 186
f79c58a5 187 for (Int_t i=0; i<fMotifs.GetEntriesFast(); i++)
b166d013 188 if (fMotifs[i] == (const TObject*)motif) return true;
ea4cae7a 189
190 return false;
191}
192
193//______________________________________________________________________________
194Int_t AliMpVRowSegmentSpecial::GetNofPadRows() const
195{
dee1d5f1 196/// Return number of pad rows.
ea4cae7a 197
f79c58a5 198 return fPadRows.GetEntriesFast();
ea4cae7a 199}
200
201//______________________________________________________________________________
202AliMpPadRow* AliMpVRowSegmentSpecial::GetPadRow(Int_t i) const
203{
dee1d5f1 204/// Return number of pad rows.
ea4cae7a 205
f79c58a5 206 return (AliMpPadRow*)fPadRows[i];
ea4cae7a 207}
208
209//
210// public methods
211//
212
213//______________________________________________________________________________
214void AliMpVRowSegmentSpecial::AddPadRow(AliMpPadRow* padRow)
215{
dee1d5f1 216/// Add a pad row.
ea4cae7a 217
218 padRow->SetOffsetX(fOffsetX);
219 padRow->SetID(GetNofPadRows());
f79c58a5 220
f79c58a5 221 fPadRows.Add(padRow);
ea4cae7a 222}
223
224//______________________________________________________________________________
225void AliMpVRowSegmentSpecial::UpdateMotifVector()
226{
dee1d5f1 227/// Add motifs associated with the pad row segments in the specified
228/// pad row in the fMotifs vector.
ea4cae7a 229
230 for (Int_t i=0; i<GetNofPadRows(); i++) {
231 AliMpPadRow* padRow = GetPadRow(i);
232
233 for (Int_t j=0; j<padRow->GetNofPadRowSegments(); j++) {
234 AliMpVMotif* motif = padRow->GetPadRowSegment(j)->GetMotif();
235
236 if (!HasMotif(motif)) {
f79c58a5 237 fMotifs.Add(motif);
238
239 // resize array if needed
240 if (fNofMotifPositionIds<fgkMaxNofMotifPositionIds)
241 fMotifPositionIds.Set(fMotifPositionIds.GetSize()+
242 fgkMaxNofMotifPositionIds);
243 fMotifPositionIds.AddAt(
244 padRow->GetPadRowSegment(j)->GetMotifPositionId(),
245 fNofMotifPositionIds++);
ea4cae7a 246 }
247 }
248 }
249}
250
251//______________________________________________________________________________
252Double_t AliMpVRowSegmentSpecial::HalfSizeY() const
253{
dee1d5f1 254/// Return the size in y of this row segment.
ea4cae7a 255
256 Double_t halfSizeY = 0.;
257 for (Int_t i=0; i<GetNofPadRows(); i++) {
258 halfSizeY += GetPadRow(i)->HalfSizeY();
259 }
260
261 return halfSizeY;
262}
263
264//______________________________________________________________________________
265AliMpVMotif* AliMpVRowSegmentSpecial::FindMotif(const TVector2& position) const
266{
dee1d5f1 267/// Return the motif of this row;
ea4cae7a 268
269 AliMpPadRow* padRow
270 = FindPadRow(position.Y());
271
272 if (!padRow) return 0;
273
274 AliMpVPadRowSegment* padRowSegment
275 = padRow->FindPadRowSegment(position.X());
276
277 if (!padRowSegment) return 0;
278
279 return padRowSegment->GetMotif();
280}
281
282//______________________________________________________________________________
283Int_t AliMpVRowSegmentSpecial::FindMotifPositionId(const TVector2& position) const
284{
dee1d5f1 285/// Return the motif position identified for the given
286/// geometric position.
ea4cae7a 287
288 AliMpPadRow* padRow
289 = FindPadRow(position.Y());
290
291 if (!padRow) return 0;
292
293 AliMpVPadRowSegment* padRowSegment
294 = padRow->FindPadRowSegment(position.X());
295
296 if (!padRowSegment) return 0;
297
298 return padRowSegment->GetMotifPositionId();
299}
300
301//______________________________________________________________________________
302Bool_t AliMpVRowSegmentSpecial::HasMotifPosition(Int_t motifPositionId) const
303{
dee1d5f1 304/// Return true if the motif specified with the given position identifier
305/// is in this segment.
ea4cae7a 306
307 if (FindPadRowSegment(motifPositionId))
308 return true;
309 else
310 return false;
311}
312
313//______________________________________________________________________________
314TVector2 AliMpVRowSegmentSpecial::MotifCenter(Int_t motifPositionId) const
315{
dee1d5f1 316/// Return the coordinates of the motif specified with
317/// the given position identifier.
ea4cae7a 318
319 // Try to get the motif position from the motif map first
320 AliMpMotifPosition* motifPosition
321 = GetRow()->GetMotifMap()->FindMotifPosition(motifPositionId);
322 if (motifPosition) return motifPosition->Position();
323
324 // Use slow method otherwise
325 return MotifCenterSlow(motifPositionId);
326}
327
328//______________________________________________________________________________
329TVector2 AliMpVRowSegmentSpecial::Dimensions() const
330{
dee1d5f1 331/// Return the halflengths in x, y of the row segment rectangular envelope.
ea4cae7a 332
333 Double_t x = 0.;
334 Double_t y = 0.;
335 for (Int_t i=0; i<GetNofPadRows(); i++) {
336 AliMpPadRow* padRow = GetPadRow(i);
337
338 // Add all pad rows y halfsizes
339 y += padRow->HalfSizeY();
340
341 // Find the biggest pad rows x halfsize
342 Double_t xx
343 = (padRow->GetPadRowSegment(0)->RightBorderX() -
344 padRow->GetPadRowSegment(padRow->GetNofPadRowSegments()-1)->LeftBorderX())/2.;
345 if (xx > x) x = xx;
346 }
347
348 return TVector2(x, y);
349}
350
351//______________________________________________________________________________
ea4cae7a 352AliMpRow* AliMpVRowSegmentSpecial::GetRow() const
353{
dee1d5f1 354/// Return the row.which this row segment belongs to.
ea4cae7a 355
356 return fRow;
357}
358
359//______________________________________________________________________________
360Int_t AliMpVRowSegmentSpecial::GetNofMotifs() const
361{
dee1d5f1 362/// Return the number of different motifs present in this row segment.
ea4cae7a 363
f79c58a5 364 return fMotifs.GetEntriesFast();
ea4cae7a 365}
366
367//______________________________________________________________________________
368AliMpVMotif* AliMpVRowSegmentSpecial::GetMotif(Int_t i) const
369{
dee1d5f1 370/// Return the i-th motif present in this row segment.
ea4cae7a 371
f79c58a5 372 return (AliMpVMotif*)fMotifs[i];
ea4cae7a 373}
374
375//______________________________________________________________________________
376Int_t AliMpVRowSegmentSpecial::GetMotifPositionId(Int_t i) const
377{
dee1d5f1 378/// Return the i-th motif position Id present in this row segment.
ea4cae7a 379
380 return fMotifPositionIds[i];
381}
382