]> git.uio.no Git - u/mrichter/AliRoot.git/blob - MUON/mapping/AliMpTriggerSegmentation.cxx
Adding comment lines to class description needed for Root documentation,
[u/mrichter/AliRoot.git] / MUON / mapping / AliMpTriggerSegmentation.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: AliMpTriggerSegmentation.cxx,v 1.7 2006/05/24 13:58:52 ivana Exp $
18
19 #include "AliMpTriggerSegmentation.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 "AliMpTrigger.h"
29
30 //-----------------------------------------------------------------------------
31 /// \class AliMpTriggerSegmentation
32 ///
33 /// Implementation of AliMpVSegmentation for trigger slats.
34 ///
35 /// \todo Implement CreateIterator method, if needed.
36 ///
37 /// \author Laurent Aphecetche
38 //-----------------------------------------------------------------------------
39
40 /// \cond CLASSIMP
41 ClassImp(AliMpTriggerSegmentation)
42 /// \endcond
43
44 //_____________________________________________________________________________
45 AliMpTriggerSegmentation::AliMpTriggerSegmentation() 
46 : AliMpVSegmentation(),
47   fkSlat(0),
48   fIsOwner(false),
49   fNofStrips(0)
50 {
51   ///
52   /// Default ctor. Not to be used really.
53   ///
54   AliDebug(1,Form("this=%p Empty ctor",this));
55 }
56
57 //_____________________________________________________________________________
58 AliMpTriggerSegmentation::AliMpTriggerSegmentation(
59                                const AliMpTrigger* slat, Bool_t own) 
60 : AliMpVSegmentation(), 
61   fkSlat(slat),
62   fIsOwner(own),
63   fNofStrips(0)
64 {
65   ///
66   /// Normal ctor.
67   ///
68   AliDebug(1,Form("this=%p Normal ctor slat=%p",this,slat));
69   
70   // Compute the number of strips.
71   // We have to loop over all possible pads, in order to properly take
72   // into account the fact that a given strip might be part of several
73   // layer. Otherwise we would double count pads.
74
75
76   for ( Int_t ix = 0; ix <= MaxPadIndexX(); ++ix )
77   {
78     for ( Int_t iy = 0; iy <= MaxPadIndexY(); ++iy )
79     {
80       if ( HasPad(AliMpIntPair(ix,iy)) )
81       {
82         ++fNofStrips;
83       }
84     }
85   }
86 }
87
88 //_____________________________________________________________________________
89 AliMpTriggerSegmentation::~AliMpTriggerSegmentation()
90 {
91   ///
92   /// Dtor (empty).
93   ///
94
95   if ( fIsOwner ) delete fkSlat;
96
97   AliDebug(1,Form("this=%p",this));                     
98 }
99
100 //_____________________________________________________________________________
101 AliMpVPadIterator*
102 AliMpTriggerSegmentation::CreateIterator(const AliMpArea&) const
103 {
104   ///
105   /// Returns an iterator to loop over the pad contained within given area.
106   /// Not implemented for trigger.
107   AliError("Not implemented for trigger");
108   return 0;
109 }
110
111 //_____________________________________________________________________________
112 AliMpVPadIterator*
113 AliMpTriggerSegmentation::CreateIterator() const
114 {
115   ///
116   /// Returns an iterator to loop over all the pads
117   /// Not implemented for trigger.
118   AliError("Not implemented for trigger");
119   
120   return 0;
121 }
122
123 //_____________________________________________________________________________
124 Int_t 
125 AliMpTriggerSegmentation::GetNeighbours(const AliMpPad& /*pad*/, 
126                                         TObjArray& /*neighbours*/,
127                                         Bool_t /*includeSelf*/,
128                                         Bool_t /*includeVoid*/) const
129 {
130   /// not implemented.
131   AliError("Not implemented for trigger");
132   return 0;
133 }
134
135 //_____________________________________________________________________________
136 TVector2
137 AliMpTriggerSegmentation::Dimensions() const
138 {
139 /// Return dimensions
140
141   return Slat()->Dimensions();
142 }
143
144 //_____________________________________________________________________________
145 void 
146 AliMpTriggerSegmentation::GetAllElectronicCardIDs(TArrayI& ecn) const
147 {
148 /// Fill the array ecn with all manuIds
149
150   Slat()->GetAllLocalBoardNumbers(ecn);
151 }
152
153 //_____________________________________________________________________________
154 const char*
155 AliMpTriggerSegmentation::GetName() const
156 {
157   /// Name of that segmentation = TriggerSegmentation + slatName
158   TString name("TriggerSegmentation");
159   if ( fkSlat) 
160   {
161     name += ".";
162     name += fkSlat->GetName();
163   }
164   return name.Data();
165 }
166
167 //_____________________________________________________________________________
168 Bool_t
169 AliMpTriggerSegmentation::HasPad(const AliMpIntPair& indices) const
170 {
171   ///
172   /// Test if this slat has a pad located at the position referenced
173   /// by the integer indices.
174   ///
175   
176   return PadByIndices(indices,kFALSE) != AliMpPad::Invalid();
177 }
178
179 //_____________________________________________________________________________
180 Int_t 
181 AliMpTriggerSegmentation::MaxPadIndexX() const
182 {
183   ///
184   /// Returns the value of the largest pad index in x-direction.
185   ///
186   
187   return fkSlat->GetNofPadsX()-1;
188 }
189
190 //_____________________________________________________________________________
191 Int_t 
192 AliMpTriggerSegmentation::MaxPadIndexY() const
193 {
194   ///
195   /// Returns the value of the largest pad index in y-direction.
196   ///
197   
198   return fkSlat->GetMaxNofPadsY()-1;
199 }
200
201 //_____________________________________________________________________________
202 AliMpPad
203 AliMpTriggerSegmentation::PadByLocation(const AliMpIntPair& location, 
204                                         Bool_t warning) const
205 {
206   ///
207   /// Returns the pad specified by its location, where location is the 
208   /// pair (ManuID,ManuChannel).
209   /// If warning=kTRUE and the pad does not exist, a warning message is 
210   /// printed.
211   ///
212   /// AliMpPad::Invalid() is returned if there's no pad at the given location.
213   ///
214   AliMpPad pad;
215   AliMpIntPair invloc;
216   
217   for ( Int_t i = 0; i < fkSlat->GetSize(); ++i )
218   {
219     AliMpVSegmentation* seg = fkSlat->GetLayerSegmentation(i);
220     AliMpPad pi = seg->PadByLocation(location,kFALSE);
221     if ( pi.IsValid() ) 
222     {
223       if ( !pad.IsValid() )
224       {
225         // uses PadByIndices to get the complete list of locations
226         return PadByIndices(pi.GetIndices(),warning);
227       }
228     }
229   }
230   if ( warning && !pad.IsValid()  )
231   {
232     AliWarning(Form("No pad found at location (%d,%d)",location.GetFirst(),
233                     location.GetSecond()));
234   }
235   return pad;
236 }
237
238 //_____________________________________________________________________________
239 AliMpPad
240 AliMpTriggerSegmentation::PadByIndices(const AliMpIntPair& indices, 
241                                     Bool_t warning) const
242 {
243   ///
244   /// Returns the pad specified by its integer indices.
245   /// If warning=kTRUE and the pad does not exist, a warning message is 
246   /// printed.
247   ///
248   /// AliMpPad::Invalid() is returned if there's no pad at the given location.
249   ///
250   ///  
251  
252   AliMpPad pad;
253   AliMpIntPair invloc;
254   
255   for ( Int_t i = 0; i < fkSlat->GetSize(); ++i )
256   {
257     AliMpVSegmentation* seg = fkSlat->GetLayerSegmentation(i);
258     AliMpPad pi = seg->PadByIndices(indices,kFALSE);
259     if ( pi.IsValid() ) 
260     {      
261       if ( !pad.IsValid() )
262       {
263         pad = AliMpPad(invloc,pi.GetIndices(),pi.Position(),pi.Dimensions());
264         pad.AddLocation(pi.GetLocation());
265       }
266       else
267       {
268         pad.AddLocation(pi.GetLocation());
269       }  
270     }
271   }
272   if ( warning && !pad.IsValid()  )
273   {
274     AliWarning(Form("No pad found at indices (%d,%d)",indices.GetFirst(),
275                     indices.GetSecond()));
276   }
277   
278   return pad;
279 }
280
281 //_____________________________________________________________________________
282 AliMpPad
283 AliMpTriggerSegmentation::PadByPosition(const TVector2& position, 
284                                      Bool_t warning) const
285 {
286   ///
287   /// Returns the pad specified by its (floating point) position.
288   /// If warning=kTRUE and the pad does not exist, a warning message is 
289   /// printed.
290   ///
291   /// AliMpPad::Invalid() is returned if there's no pad at the given location.
292   ///
293   AliMpPad pad;
294   AliMpIntPair invloc;
295   
296   for ( Int_t i = 0; i < fkSlat->GetSize(); ++i )
297   {
298     AliMpVSegmentation* seg = fkSlat->GetLayerSegmentation(i);
299     AliMpPad pi = seg->PadByPosition(position,kFALSE);
300     if ( pi.IsValid() ) 
301     {
302       if ( !pad.IsValid() )
303       {
304         pad = AliMpPad(invloc,pi.GetIndices(),pi.Position(),pi.Dimensions());
305         pad.AddLocation(pi.GetLocation());
306       }
307       else
308       {
309         pad.AddLocation(pi.GetLocation());
310       }  
311     }
312   }
313   if ( warning && !pad.IsValid()  )
314   {
315     AliWarning(Form("No pad found at position (%e,%e)",position.X(),
316                     position.Y()));
317   }
318   
319   return pad;  
320 }
321
322 //_____________________________________________________________________________
323 AliMp::PlaneType
324 AliMpTriggerSegmentation::PlaneType() const
325 {
326   /// Return plane type
327
328   return Slat()->PlaneType();
329 }
330
331 //_____________________________________________________________________________
332 const AliMpTrigger* 
333 AliMpTriggerSegmentation::Slat() const
334 {
335   ///
336   /// Returns the pointer to the referenced slat.
337   ///
338   
339   return fkSlat;
340 }