Fixed a would-be-a-bug in PadByIndices where AliMpPad returned would
[u/mrichter/AliRoot.git] / MUON / mapping / AliMpSlatSegmentation.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: AliMpSlatSegmentation.cxx,v 1.4 2005/09/19 19:01:31 ivana Exp $
18
19 #include "AliMpSlatSegmentation.h"
20
21 #include "AliLog.h"
22 #include "AliMpConnection.h"
23 #include "AliMpMotif.h"
24 #include "AliMpMotifPosition.h"
25 #include "AliMpMotifType.h"
26 #include "AliMpPCB.h"
27 #include "AliMpSlat.h"
28 #include "AliMpSlatPadIterator.h"
29
30 ClassImp(AliMpSlatSegmentation)
31
32 //_____________________________________________________________________________
33 AliMpSlatSegmentation::AliMpSlatSegmentation() 
34 : AliMpVSegmentation(),
35 fkSlat(0)
36 {
37   //
38   // Default ctor. Not to be used really.
39   //
40   AliDebug(1,Form("this=%p Empty ctor",this));
41 }
42
43 //_____________________________________________________________________________
44 AliMpSlatSegmentation::AliMpSlatSegmentation(const AliMpSlat* slat) 
45 : AliMpVSegmentation(), 
46 fkSlat(slat)
47 {
48   //
49   // Normal ctor.
50   //
51   AliDebug(1,Form("this=%p Normal ctor slat=%p",this,slat));
52 }
53
54 //_____________________________________________________________________________
55 AliMpSlatSegmentation::~AliMpSlatSegmentation()
56 {
57   //
58   // Dtor (empty).
59   //
60   // Int_t i(0);//just to be able to put a breakpoint in gdb
61   AliDebug(1,Form("this=%p",this));                     
62 }
63
64 //_____________________________________________________________________________
65 AliMpVPadIterator*
66 AliMpSlatSegmentation::CreateIterator(const AliMpArea& area) const
67 {
68   //
69   // Returns an iterator to loop over the pad contained within given area.
70   //
71   
72   return new AliMpSlatPadIterator(fkSlat,area);
73 }
74
75 //_____________________________________________________________________________
76 const char*
77 AliMpSlatSegmentation::GetName() const
78 {
79   TString name("SlatSegmentation");
80   if ( fkSlat) 
81   {
82     name += ".";
83     name += fkSlat->GetName();
84   }
85   return name.Data();
86 }
87
88 //_____________________________________________________________________________
89 Bool_t
90 AliMpSlatSegmentation::HasPad(const AliMpIntPair& indices) const
91 {
92   //
93   // Test if this slat has a pad located at the position referenced
94   // by the integer indices.
95   //
96   
97   return PadByIndices(indices,kFALSE) != AliMpPad::Invalid();
98 }
99
100 //_____________________________________________________________________________
101 Int_t 
102 AliMpSlatSegmentation::MaxPadIndexX()
103 {
104   //
105   // Returns the value of the largest pad index in x-direction.
106   //
107   
108   return fkSlat->GetNofPadsX()-1;
109 }
110
111 //_____________________________________________________________________________
112 Int_t 
113 AliMpSlatSegmentation::MaxPadIndexY()
114 {
115   //
116   // Returns the value of the largest pad index in y-direction.
117   //
118   
119   return fkSlat->GetMaxNofPadsY()-1;
120 }
121
122 //_____________________________________________________________________________
123 AliMpPad
124 AliMpSlatSegmentation::PadByLocation(const AliMpIntPair& location, 
125                                      Bool_t warning) const
126 {
127   //
128   // Returns the pad specified by its location, where location is the 
129   // pair (ManuID,ManuChannel).
130   // If warning=kTRUE and the pad does not exist, a warning message is 
131   // printed.
132   //
133   // AliMpPad::Invalid() is returned if there's no pad at the given location.
134   //
135   Int_t manuID = location.GetFirst();
136         
137   AliMpMotifPosition* motifPos = fkSlat->FindMotifPosition(manuID);
138         
139   if (!motifPos)
140         {
141                 if (warning)
142                 {
143                         AliWarning(Form("Manu ID %d not found in slat %s",
144                                          manuID, fkSlat->GetID()));
145     }
146     return AliMpPad::Invalid();
147         }
148   AliMpVMotif* motif = motifPos->GetMotif();
149   AliMpIntPair localIndices = 
150     motif->GetMotifType()->FindLocalIndicesByGassiNum(location.GetSecond());
151         
152   if (!localIndices.IsValid()) 
153         {
154                 if (warning) 
155                 {
156                         AliWarning(Form("The pad number %d doesn't exists",
157                                         location.GetSecond()));
158                 }
159                 return AliMpPad::Invalid();
160         }
161         
162   return AliMpPad(location,
163                   motifPos->GlobalIndices(localIndices),
164                   motifPos->Position() 
165                   + motif->PadPositionLocal(localIndices) 
166                   - fkSlat->Position(),
167                   motif->GetPadDimensions(localIndices));  
168 }
169
170 //_____________________________________________________________________________
171 AliMpPad
172 AliMpSlatSegmentation::PadByIndices(const AliMpIntPair& indices, 
173                                     Bool_t warning) const
174 {
175   //
176   // Returns the pad specified by its integer indices.
177   // If warning=kTRUE and the pad does not exist, a warning message is 
178   // printed.
179   //
180   // AliMpPad::Invalid() is returned if there's no pad at the given location.
181   //
182   //  
183   // FIXME: except for the FindMotifPosition below, this method
184   // is exactly as the one in AliMpSectorSegmentation.
185   // See if we can merge them somehow.
186         
187   AliMpMotifPosition* motifPos = fkSlat->FindMotifPosition(indices.GetFirst(),
188                                                                                                                                                                                                          indices.GetSecond());
189   if (!motifPos)
190         {
191                 if ( warning ) 
192                 {
193                         AliWarning(Form("No motif found containing pad location (%d,%d)",
194                                          indices.GetFirst(),indices.GetSecond()));        
195                 }
196                 return AliMpPad::Invalid();
197         }
198         
199   AliMpVMotif* motif = motifPos->GetMotif();
200   AliMpMotifType* motifType = motif->GetMotifType();
201   AliMpIntPair localIndices(indices-motifPos->GetLowIndicesLimit());
202   AliMpConnection* connection = motifType->FindConnectionByLocalIndices(localIndices);
203   
204   if (!connection)
205         {
206                 if ( warning )
207                 {
208                         AliWarning(Form("No connection for pad location (%d,%d)",
209                                         indices.GetFirst(),indices.GetSecond()));
210     }
211     return AliMpPad::Invalid();
212         }
213         
214   return AliMpPad(AliMpIntPair(motifPos->GetID(),connection->GetGassiNum()),
215                   indices,
216                   motifPos->Position()
217                   + motif->PadPositionLocal(localIndices)
218                   - fkSlat->Position(),
219                   motif->GetPadDimensions(localIndices));
220 }
221
222 //_____________________________________________________________________________
223 AliMpPad
224 AliMpSlatSegmentation::PadByPosition(const TVector2& position, 
225                                      Bool_t warning) const
226 {
227   //
228   // Returns the pad specified by its (floating point) position.
229   // If warning=kTRUE and the pad does not exist, a warning message is 
230   // printed.
231   //
232   // AliMpPad::Invalid() is returned if there's no pad at the given location.
233   //
234   
235   AliMpMotifPosition* motifPos = fkSlat->FindMotifPosition(position.X(),position.Y());
236         
237   if (!motifPos)
238         {
239                 if (warning) 
240                 {
241                         AliWarning(Form("Slat %s Position (%e,%e) mm outside limits",
242                       fkSlat->GetID(),position.X(),position.Y()));
243                 }
244                 return AliMpPad::Invalid();
245         }
246         
247   AliMpVMotif* motif =  motifPos->GetMotif();  
248   AliMpIntPair localIndices 
249     = motif->PadIndicesLocal(position-motifPos->Position());
250         
251   AliMpConnection* connect = 
252     motif->GetMotifType()->FindConnectionByLocalIndices(localIndices);
253         
254   if (!connect)
255         {
256                 if (warning) 
257                 {
258                         AliWarning(Form("Slat %s localIndices (%d,%d) outside motif %s limits",
259                       fkSlat->GetID(),localIndices.GetFirst(),
260                       localIndices.GetSecond(),motif->GetID().Data()));
261                 }
262                 return AliMpPad::Invalid();
263         }
264   
265   return AliMpPad(AliMpIntPair(motifPos->GetID(),connect->GetGassiNum()),
266                   motifPos->GlobalIndices(localIndices),
267                   motifPos->Position()
268                   + motif->PadPositionLocal(localIndices)
269                   - fkSlat->Position(),
270                   motif->GetPadDimensions(localIndices));  
271 }
272
273 //_____________________________________________________________________________
274 const AliMpSlat* 
275 AliMpSlatSegmentation::Slat() const
276 {
277   //
278   // Returns the pointer to the referenced slat.
279   //
280   
281   return fkSlat;
282 }