1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
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 **************************************************************************/
17 // $MpId: AliMpVRowSegmentSpecial.cxx,v 1.9 2006/05/24 13:58:46 ivana Exp $
20 //-----------------------------------------------------------------------------
21 // Class AliMpVRowSegmentSpecial
22 // ----------------------------
23 // Class describing a special row segment composed of the
25 // Included in AliRoot: 2003/05/02
26 // Authors: David Guez, Ivana Hrivnacova; IPN Orsay
27 //-----------------------------------------------------------------------------
29 #include "AliMpVRowSegmentSpecial.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"
39 #include <Riostream.h>
42 ClassImp(AliMpVRowSegmentSpecial)
45 const Int_t AliMpVRowSegmentSpecial::fgkMaxNofMotifPositionIds = 20;
47 //______________________________________________________________________________
48 AliMpVRowSegmentSpecial::AliMpVRowSegmentSpecial(AliMpRow* row, Double_t offsetX)
55 fNofMotifPositionIds(0)
57 /// Standard constructor
60 //______________________________________________________________________________
61 AliMpVRowSegmentSpecial::AliMpVRowSegmentSpecial()
68 fNofMotifPositionIds(0)
70 /// Default constructor
72 fMotifPositionIds.Set(fgkMaxNofMotifPositionIds);
75 //______________________________________________________________________________
76 AliMpVRowSegmentSpecial::~AliMpVRowSegmentSpecial()
80 for (Int_t i=0; i<GetNofPadRows(); i++)
88 //______________________________________________________________________________
89 AliMpPadRow* AliMpVRowSegmentSpecial::FindPadRow(Double_t y) const
91 /// Find the pad row in the given y coordinate.
93 Double_t lowBorder = fRow->LowBorderY();
94 Double_t highBorder = fRow->LowBorderY();
96 for (Int_t i=0; i<GetNofPadRows(); i++) {
98 AliMpPadRow* padRow = GetPadRow(i);
99 highBorder += 2.*padRow->HalfSizeY();
101 if ( y >= lowBorder && y <= highBorder)
104 lowBorder = highBorder;
110 //______________________________________________________________________________
112 AliMpVRowSegmentSpecial::FindPadRowSegment(Int_t motifPositionId) const
114 /// Find the most down pad row segment with this motifPositionId.
116 for (Int_t i=0; i<GetNofPadRows(); i++) {
117 AliMpPadRow* padRow = GetPadRow(i);
119 for (Int_t j=0; j<padRow->GetNofPadRowSegments(); j++) {
120 AliMpVPadRowSegment* padRowSegment = padRow->GetPadRowSegment(j);
122 if (padRowSegment->GetMotifPositionId() == motifPositionId)
123 return padRowSegment;
129 //______________________________________________________________________________
131 AliMpVRowSegmentSpecial::FindRelativeLowIndicesOf(Int_t motifPositionId) const
133 /// Return the lowest pad indices where the motif of the given position ID
134 /// exist in this segment.
143 for (Int_t i=0; i<GetNofPadRows(); i++) {
144 AliMpPadRow* padRow = GetPadRow(i);
147 for ( Int_t j=0; j<padRow->GetNofPadRowSegments(); j++ ) {
148 AliMpVPadRowSegment* padRowSegment = padRow->GetPadRowSegment(j);
149 nofPadsX += padRowSegment->GetNofPads();
150 if (padRowSegment->GetMotifPositionId() == motifPositionId) {
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
157 if ( nofPadsX > maxNofPadsX ) maxNofPadsX = nofPadsX;
159 if ( ansIx == ans0Ix && ansIy == ans0Iy ) return -1;
161 return AliMp::Pair(maxNofPadsX-ansIx, ansIy);
164 //______________________________________________________________________________
165 Int_t AliMpVRowSegmentSpecial::MaxNofPadsInRow() const
167 /// Return the maximum number of pads in this row segment along the X direction
169 Int_t maxNofPads = 0;
171 for (Int_t i=0; i<GetNofPadRows(); i++){
172 Int_t nofPads = GetPadRow(i)->GetNofPads();
175 if (nofPads > maxNofPads) maxNofPads = nofPads;
181 //______________________________________________________________________________
182 Bool_t AliMpVRowSegmentSpecial::HasMotif(const AliMpVMotif* motif) const
184 /// Return true if the specified motif is already in fMotifs vector,
185 /// returns false otherwise.
187 for (Int_t i=0; i<fMotifs.GetEntriesFast(); i++)
188 if (fMotifs[i] == (const TObject*)motif) return true;
193 //______________________________________________________________________________
194 Int_t AliMpVRowSegmentSpecial::GetNofPadRows() const
196 /// Return number of pad rows.
198 return fPadRows.GetEntriesFast();
201 //______________________________________________________________________________
202 AliMpPadRow* AliMpVRowSegmentSpecial::GetPadRow(Int_t i) const
204 /// Return number of pad rows.
206 return (AliMpPadRow*)fPadRows[i];
213 //______________________________________________________________________________
214 void AliMpVRowSegmentSpecial::AddPadRow(AliMpPadRow* padRow)
218 padRow->SetOffsetX(fOffsetX);
219 padRow->SetID(GetNofPadRows());
221 fPadRows.Add(padRow);
224 //______________________________________________________________________________
225 void AliMpVRowSegmentSpecial::UpdateMotifVector()
227 /// Add motifs associated with the pad row segments in the specified
228 /// pad row in the fMotifs vector.
230 for (Int_t i=0; i<GetNofPadRows(); i++) {
231 AliMpPadRow* padRow = GetPadRow(i);
233 for (Int_t j=0; j<padRow->GetNofPadRowSegments(); j++) {
234 AliMpVMotif* motif = padRow->GetPadRowSegment(j)->GetMotif();
236 if (!HasMotif(motif)) {
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++);
251 //______________________________________________________________________________
252 Double_t AliMpVRowSegmentSpecial::HalfSizeY() const
254 /// Return the size in y of this row segment.
256 Double_t halfSizeY = 0.;
257 for (Int_t i=0; i<GetNofPadRows(); i++) {
258 halfSizeY += GetPadRow(i)->HalfSizeY();
264 //______________________________________________________________________________
265 AliMpVMotif* AliMpVRowSegmentSpecial::FindMotif(const TVector2& position) const
267 /// Return the motif of this row;
270 = FindPadRow(position.Y());
272 if (!padRow) return 0;
274 AliMpVPadRowSegment* padRowSegment
275 = padRow->FindPadRowSegment(position.X());
277 if (!padRowSegment) return 0;
279 return padRowSegment->GetMotif();
282 //______________________________________________________________________________
283 Int_t AliMpVRowSegmentSpecial::FindMotifPositionId(const TVector2& position) const
285 /// Return the motif position identified for the given
286 /// geometric position.
289 = FindPadRow(position.Y());
291 if (!padRow) return 0;
293 AliMpVPadRowSegment* padRowSegment
294 = padRow->FindPadRowSegment(position.X());
296 if (!padRowSegment) return 0;
298 return padRowSegment->GetMotifPositionId();
301 //______________________________________________________________________________
302 Bool_t AliMpVRowSegmentSpecial::HasMotifPosition(Int_t motifPositionId) const
304 /// Return true if the motif specified with the given position identifier
305 /// is in this segment.
307 if (FindPadRowSegment(motifPositionId))
313 //______________________________________________________________________________
314 TVector2 AliMpVRowSegmentSpecial::MotifCenter(Int_t motifPositionId) const
316 /// Return the coordinates of the motif specified with
317 /// the given position identifier.
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();
324 // Use slow method otherwise
325 return MotifCenterSlow(motifPositionId);
328 //______________________________________________________________________________
329 TVector2 AliMpVRowSegmentSpecial::Dimensions() const
331 /// Return the halflengths in x, y of the row segment rectangular envelope.
335 for (Int_t i=0; i<GetNofPadRows(); i++) {
336 AliMpPadRow* padRow = GetPadRow(i);
338 // Add all pad rows y halfsizes
339 y += padRow->HalfSizeY();
341 // Find the biggest pad rows x halfsize
343 = (padRow->GetPadRowSegment(0)->RightBorderX() -
344 padRow->GetPadRowSegment(padRow->GetNofPadRowSegments()-1)->LeftBorderX())/2.;
348 return TVector2(x, y);
351 //______________________________________________________________________________
352 AliMpRow* AliMpVRowSegmentSpecial::GetRow() const
354 /// Return the row.which this row segment belongs to.
359 //______________________________________________________________________________
360 Int_t AliMpVRowSegmentSpecial::GetNofMotifs() const
362 /// Return the number of different motifs present in this row segment.
364 return fMotifs.GetEntriesFast();
367 //______________________________________________________________________________
368 AliMpVMotif* AliMpVRowSegmentSpecial::GetMotif(Int_t i) const
370 /// Return the i-th motif present in this row segment.
372 return (AliMpVMotif*)fMotifs[i];
375 //______________________________________________________________________________
376 Int_t AliMpVRowSegmentSpecial::GetMotifPositionId(Int_t i) const
378 /// Return the i-th motif position Id present in this row segment.
380 return fMotifPositionIds[i];