]> git.uio.no Git - u/mrichter/AliRoot.git/blame - MUON/MUONmapping/AliMpVRowSegmentSpecial.cxx
o adapt Macro to new TPC structure (Benjamin Hess)
[u/mrichter/AliRoot.git] / MUON / MUONmapping / 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//______________________________________________________________________________
6e97fbb8 265AliMpVMotif* AliMpVRowSegmentSpecial::FindMotif(Double_t x, Double_t y) const
ea4cae7a 266{
dee1d5f1 267/// Return the motif of this row;
ea4cae7a 268
6e97fbb8 269 AliMpPadRow* padRow = FindPadRow(y);
ea4cae7a 270
6e97fbb8 271 if ( ! padRow ) return 0;
ea4cae7a 272
6e97fbb8 273 AliMpVPadRowSegment* padRowSegment = padRow->FindPadRowSegment(x);
ea4cae7a 274
6e97fbb8 275 if (! padRowSegment ) return 0;
ea4cae7a 276
277 return padRowSegment->GetMotif();
278}
279
280//______________________________________________________________________________
6e97fbb8 281Int_t AliMpVRowSegmentSpecial::FindMotifPositionId(Double_t x, Double_t y) const
ea4cae7a 282{
dee1d5f1 283/// Return the motif position identified for the given
284/// geometric position.
ea4cae7a 285
6e97fbb8 286 AliMpPadRow* padRow = FindPadRow(y);
ea4cae7a 287
6e97fbb8 288 if ( ! padRow ) return 0;
ea4cae7a 289
6e97fbb8 290 AliMpVPadRowSegment* padRowSegment = padRow->FindPadRowSegment(x);
ea4cae7a 291
6e97fbb8 292 if ( ! padRowSegment ) return 0;
ea4cae7a 293
294 return padRowSegment->GetMotifPositionId();
295}
296
297//______________________________________________________________________________
298Bool_t AliMpVRowSegmentSpecial::HasMotifPosition(Int_t motifPositionId) const
299{
dee1d5f1 300/// Return true if the motif specified with the given position identifier
301/// is in this segment.
ea4cae7a 302
303 if (FindPadRowSegment(motifPositionId))
304 return true;
305 else
306 return false;
307}
308
309//______________________________________________________________________________
6e97fbb8 310void AliMpVRowSegmentSpecial::MotifCenter(Int_t motifPositionId,
311 Double_t& x, Double_t& y) const
ea4cae7a 312{
dee1d5f1 313/// Return the coordinates of the motif specified with
314/// the given position identifier.
ea4cae7a 315
316 // Try to get the motif position from the motif map first
317 AliMpMotifPosition* motifPosition
318 = GetRow()->GetMotifMap()->FindMotifPosition(motifPositionId);
6e97fbb8 319
320 if (motifPosition) {
321 x = motifPosition->GetPositionX(),
322 y = motifPosition->GetPositionY();
323 }
324 else {
325 MotifCenterSlow(motifPositionId, x, y);
326 }
ea4cae7a 327}
328
329//______________________________________________________________________________
6e97fbb8 330Double_t AliMpVRowSegmentSpecial::GetDimensionX() const
ea4cae7a 331{
dee1d5f1 332/// Return the halflengths in x, y of the row segment rectangular envelope.
ea4cae7a 333
334 Double_t x = 0.;
ea4cae7a 335 for (Int_t i=0; i<GetNofPadRows(); i++) {
336 AliMpPadRow* padRow = GetPadRow(i);
337
ea4cae7a 338 // Find the biggest pad rows x halfsize
339 Double_t xx
340 = (padRow->GetPadRowSegment(0)->RightBorderX() -
341 padRow->GetPadRowSegment(padRow->GetNofPadRowSegments()-1)->LeftBorderX())/2.;
342 if (xx > x) x = xx;
343 }
344
6e97fbb8 345 return x;
346}
347
348//______________________________________________________________________________
349Double_t AliMpVRowSegmentSpecial::GetDimensionY() const
350{
351/// Return the halflengths in x, y of the row segment rectangular envelope.
352
353 Double_t y = 0.;
354 for (Int_t i=0; i<GetNofPadRows(); i++) {
355 AliMpPadRow* padRow = GetPadRow(i);
356
357 // Add all pad rows y halfsizes
358 y += padRow->HalfSizeY();
359 }
360
361 return y;
ea4cae7a 362}
363
ea4cae7a 364//______________________________________________________________________________
365AliMpRow* AliMpVRowSegmentSpecial::GetRow() const
366{
dee1d5f1 367/// Return the row.which this row segment belongs to.
ea4cae7a 368
369 return fRow;
370}
371
372//______________________________________________________________________________
373Int_t AliMpVRowSegmentSpecial::GetNofMotifs() const
374{
dee1d5f1 375/// Return the number of different motifs present in this row segment.
ea4cae7a 376
f79c58a5 377 return fMotifs.GetEntriesFast();
ea4cae7a 378}
379
380//______________________________________________________________________________
381AliMpVMotif* AliMpVRowSegmentSpecial::GetMotif(Int_t i) const
382{
dee1d5f1 383/// Return the i-th motif present in this row segment.
ea4cae7a 384
f79c58a5 385 return (AliMpVMotif*)fMotifs[i];
ea4cae7a 386}
387
388//______________________________________________________________________________
389Int_t AliMpVRowSegmentSpecial::GetMotifPositionId(Int_t i) const
390{
dee1d5f1 391/// Return the i-th motif position Id present in this row segment.
ea4cae7a 392
393 return fMotifPositionIds[i];
394}
395