]> git.uio.no Git - u/mrichter/AliRoot.git/blob - MUON/mapping/AliMpVRowSegmentSpecial.cxx
Replacement of AliMpIntPair object with algoritmic
[u/mrichter/AliRoot.git] / MUON / mapping / AliMpVRowSegmentSpecial.cxx
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
16 // $Id$
17 // $MpId: AliMpVRowSegmentSpecial.cxx,v 1.9 2006/05/24 13:58:46 ivana Exp $
18 // Category: sector
19
20 //-----------------------------------------------------------------------------
21 // Class AliMpVRowSegmentSpecial
22 // ----------------------------
23 // Class describing a special row segment composed of the 
24 // pad rows.
25 // Included in AliRoot: 2003/05/02
26 // Authors: David Guez, Ivana Hrivnacova; IPN Orsay
27 //-----------------------------------------------------------------------------
28
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
39 #include <Riostream.h>
40
41 /// \cond CLASSIMP
42 ClassImp(AliMpVRowSegmentSpecial)
43 /// \endcond
44
45 const Int_t  AliMpVRowSegmentSpecial::fgkMaxNofMotifPositionIds = 20;
46
47 //______________________________________________________________________________
48 AliMpVRowSegmentSpecial::AliMpVRowSegmentSpecial(AliMpRow* row, Double_t offsetX)
49   : AliMpVRowSegment(),
50     fRow(row),
51     fOffsetX(offsetX),
52     fPadRows(),
53     fMotifs(),
54     fMotifPositionIds(),
55     fNofMotifPositionIds(0)
56 {
57 /// Standard constructor  
58 }
59
60 //______________________________________________________________________________
61 AliMpVRowSegmentSpecial::AliMpVRowSegmentSpecial() 
62   : AliMpVRowSegment(),
63     fRow(0),
64     fOffsetX(0.),
65     fPadRows(),
66     fMotifs(),
67     fMotifPositionIds(),
68     fNofMotifPositionIds(0)
69 {
70 /// Default constructor  
71
72    fMotifPositionIds.Set(fgkMaxNofMotifPositionIds);
73 }
74
75 //______________________________________________________________________________
76 AliMpVRowSegmentSpecial::~AliMpVRowSegmentSpecial() 
77 {
78 /// Destructor
79   
80   for (Int_t i=0; i<GetNofPadRows(); i++)
81     delete fPadRows[i];
82 }
83
84 //
85 // protected methods  
86 //
87
88 //______________________________________________________________________________
89 AliMpPadRow*  AliMpVRowSegmentSpecial::FindPadRow(Double_t y) const
90 {
91 /// Find the pad row in the given y coordinate.
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 //______________________________________________________________________________
111 AliMpVPadRowSegment*  
112 AliMpVRowSegmentSpecial::FindPadRowSegment(Int_t motifPositionId) const
113 {
114 /// Find the most down pad row segment with this motifPositionId.
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 //______________________________________________________________________________
130 MpPair_t 
131 AliMpVRowSegmentSpecial::FindRelativeLowIndicesOf(Int_t motifPositionId) const 
132
133 /// Return the lowest pad indices where the motif of the given position ID
134 /// exist in this segment.
135
136   Int_t ans0Ix = 0;
137   Int_t ans0Iy = 1000;
138   Int_t ansIx = 0;
139   Int_t ansIy = 1000;
140   
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;
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
155       }
156     }  
157     if ( nofPadsX > maxNofPadsX ) maxNofPadsX = nofPadsX;
158   }    
159   if ( ansIx == ans0Ix && ansIy == ans0Iy ) return -1;
160   
161   return AliMp::Pair(maxNofPadsX-ansIx, ansIy);
162 }
163  
164 //______________________________________________________________________________
165 Int_t  AliMpVRowSegmentSpecial::MaxNofPadsInRow() const 
166
167 /// Return the maximum number of pads in this row segment along the X direction
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 //______________________________________________________________________________
182 Bool_t AliMpVRowSegmentSpecial::HasMotif(const AliMpVMotif* motif) const
183 {
184 /// Return true if the specified motif is already in fMotifs vector,
185 /// returns false otherwise.
186
187   for (Int_t i=0; i<fMotifs.GetEntriesFast(); i++)
188     if (fMotifs[i] == (const TObject*)motif) return true;
189
190   return false;  
191 }
192
193 //______________________________________________________________________________
194 Int_t AliMpVRowSegmentSpecial::GetNofPadRows() const
195 {
196 /// Return number of pad rows.
197
198   return fPadRows.GetEntriesFast();
199 }  
200
201 //______________________________________________________________________________
202 AliMpPadRow* AliMpVRowSegmentSpecial::GetPadRow(Int_t i) const
203 {
204 /// Return number of pad rows.
205
206   return (AliMpPadRow*)fPadRows[i];
207 }  
208
209 //
210 // public methods  
211 //
212
213 //______________________________________________________________________________
214 void  AliMpVRowSegmentSpecial::AddPadRow(AliMpPadRow* padRow)
215 {
216 /// Add a pad row.
217
218   padRow->SetOffsetX(fOffsetX);
219   padRow->SetID(GetNofPadRows());
220
221   fPadRows.Add(padRow);
222 }  
223
224 //______________________________________________________________________________
225 void AliMpVRowSegmentSpecial::UpdateMotifVector()
226 {
227 /// Add motifs associated with the pad row segments in the specified
228 /// pad row in the fMotifs vector.
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)) {
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++);
246       }
247     }  
248   }
249 }
250
251 //______________________________________________________________________________
252 Double_t  AliMpVRowSegmentSpecial::HalfSizeY() const
253 {
254 /// Return the size in y of this row segment.
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 //______________________________________________________________________________
265 AliMpVMotif*  AliMpVRowSegmentSpecial::FindMotif(const TVector2& position) const
266 {
267 /// Return the motif of this row; 
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 //______________________________________________________________________________
283 Int_t AliMpVRowSegmentSpecial::FindMotifPositionId(const TVector2& position) const
284 {
285 /// Return the motif position identified for the given
286 /// geometric position.
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 //______________________________________________________________________________
302 Bool_t AliMpVRowSegmentSpecial::HasMotifPosition(Int_t motifPositionId) const
303 {
304 /// Return true if the motif specified with the given position identifier
305 /// is in this segment.
306
307   if (FindPadRowSegment(motifPositionId))
308     return true;
309   else  
310     return false;       
311 }
312
313 //______________________________________________________________________________
314 TVector2 AliMpVRowSegmentSpecial::MotifCenter(Int_t motifPositionId) const
315 {
316 /// Return the coordinates of the motif specified with
317 /// the given position identifier.
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 //______________________________________________________________________________
329 TVector2 AliMpVRowSegmentSpecial::Dimensions() const
330 {
331 /// Return the halflengths in x, y of the row segment rectangular envelope.
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 //______________________________________________________________________________
352 AliMpRow*  AliMpVRowSegmentSpecial::GetRow() const
353 {
354 /// Return the row.which this row segment belongs to.
355
356   return fRow;
357 }  
358
359 //______________________________________________________________________________
360 Int_t  AliMpVRowSegmentSpecial::GetNofMotifs() const 
361
362 /// Return the number of different motifs present in this row segment.
363
364   return fMotifs.GetEntriesFast();
365 }  
366
367 //______________________________________________________________________________
368 AliMpVMotif* AliMpVRowSegmentSpecial::GetMotif(Int_t i) const  
369 {
370 /// Return the i-th motif present in this row segment.
371
372    return (AliMpVMotif*)fMotifs[i]; 
373 }
374
375 //______________________________________________________________________________
376 Int_t  AliMpVRowSegmentSpecial::GetMotifPositionId(Int_t i) const 
377
378 /// Return the i-th motif position Id present in this row segment.
379
380    return fMotifPositionIds[i]; 
381
382