]> git.uio.no Git - u/mrichter/AliRoot.git/blame_incremental - MUON/mapping/AliMpTrigger.cxx
In Print(): added an option to print area borders
[u/mrichter/AliRoot.git] / MUON / mapping / AliMpTrigger.cxx
... / ...
CommitLineData
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 purpeateose. It is *
13* provided "as is" without express or implied warranty. *
14**************************************************************************/
15
16// $Id$
17// $MpId: AliMpTrigger.cxx,v 1.4 2006/05/24 13:58:52 ivana Exp $
18
19#include "AliMpTrigger.h"
20#include "AliMpSlatSegmentation.h"
21#include "AliMpConstants.h"
22#include "AliLog.h"
23#include "AliMpSlat.h"
24
25#include "Riostream.h"
26#include "TArrayI.h"
27#include "TObjArray.h"
28
29//-----------------------------------------------------------------------------
30/// \class AliMpTrigger
31///
32/// A trigger 'slat' object.
33/// It is to be viewed as a superposition of
34/// virtual layers of AliMpSlat objects. The need for more than one layer
35/// arise from the fact that a given local board deals with strips
36/// located in different detelem. So a given strip (pad) can have several
37/// "locations".
38///
39/// \author Laurent Aphecetche
40//-----------------------------------------------------------------------------
41
42/// \cond CLASSIMP
43ClassImp(AliMpTrigger)
44/// \endcond
45
46namespace
47{
48 Bool_t IsEqual(Double_t a, Double_t b, Double_t precision)
49{
50 if (b)
51 {
52 Double_t diff = TMath::Abs(b-a)/TMath::Abs(b);
53 if ( diff < precision )
54 {
55 return kTRUE;
56 }
57 }
58 else
59 {
60 if ( !a ) return kTRUE;
61 }
62 return kFALSE;
63}
64}
65
66//_____________________________________________________________________________
67AliMpTrigger::AliMpTrigger()
68: TObject(),
69 fId(""),
70 fPlaneType(AliMp::kNonBendingPlane),
71 fSlats(0),
72 fSlatSegmentations(0),
73 fMaxNofPadsY(0),
74 fDX(0),
75 fDY(0)
76{
77 /// default ctor
78
79 AliDebugStream(1) << "this = " << this << endl;
80
81 fSlats.SetOwner(kFALSE);
82 fSlatSegmentations.SetOwner(kTRUE);
83}
84
85//_____________________________________________________________________________
86AliMpTrigger::AliMpTrigger(const char* slatType, AliMp::PlaneType bendingOrNot)
87 : TObject(),
88 fId(slatType),
89 fPlaneType(bendingOrNot),
90 fSlats(0),
91 fSlatSegmentations(0),
92 fMaxNofPadsY(0),
93 fDX(0),
94 fDY(0)
95{
96 /// normal ctor
97
98 AliDebugStream(1) << "this = " << this << endl;
99
100 fSlats.SetOwner(kFALSE);
101 fSlatSegmentations.SetOwner(kTRUE);
102}
103
104//_____________________________________________________________________________
105AliMpTrigger::~AliMpTrigger()
106{
107 /// dtor
108 AliDebugStream(1) << "this = " << this << endl;
109
110 fSlatSegmentations.Delete();
111}
112
113//_____________________________________________________________________________
114Bool_t
115AliMpTrigger::AdoptLayer(AliMpSlat* slat)
116{
117 /// Adopt (i.e. we become owner of that pointer) a slat, as
118 /// a layer of this trigger slat.
119
120 AliDebug(2,Form("%s is adopting %s ",
121 GetID(),slat->GetID()));
122
123 // Check that we keep our size constant.
124
125 if ( GetSize() > 0 &&
126 ( !::IsEqual(slat->DX(),fDX,AliMpConstants::LengthTolerance()) ||
127 !::IsEqual(slat->DY(),fDY,AliMpConstants::LengthTolerance()) )
128 )
129 {
130 AliError(Form("In %s trying to add a layer (%e,%e) (layer #%d) "
131 "of a different size than mine (%e,%e)",
132 GetID(),slat->DX(),slat->DY(),fSlats.GetEntries(),
133 fDX,fDY));
134 return kFALSE;
135 }
136 fSlats.Add(slat);
137 Bool_t owner(kTRUE);
138 // the slat segmentation will be the owner of the slat, and will delete
139 // it when it'll be deleted itself
140 fSlatSegmentations.Add(new AliMpSlatSegmentation(slat,owner));
141 fMaxNofPadsY = TMath::Max(slat->GetMaxNofPadsY(),fMaxNofPadsY);
142 fDX = TMath::Max(fDX,slat->DX());
143 fDY = TMath::Max(fDY,slat->DY());
144 return kTRUE;
145}
146
147//_____________________________________________________________________________
148TVector2
149AliMpTrigger::Dimensions() const
150{
151 /// Returns the dimensions (half-sizes) of that slat (cm)
152 return TVector2(DX(),DY());
153}
154
155//_____________________________________________________________________________
156Double_t
157AliMpTrigger::DX() const
158{
159 /// Returns the half-size in X (cm)
160 return fDX;
161}
162
163//_____________________________________________________________________________
164Double_t
165AliMpTrigger::DY() const
166{
167 /// Returns the half-size in Y (cm)
168 return fDY;
169}
170
171//_____________________________________________________________________________
172void
173AliMpTrigger::GetAllLocalBoardNumbers(TArrayI& lbn) const
174{
175 /// Fills lbn with the local board numbers we're dealing with
176 Int_t n(0);
177 for ( Int_t i = 0; i < GetSize(); ++i )
178 {
179 n += GetLayer(i)->GetNofElectronicCards();
180 }
181
182 lbn.Set(n);
183
184 Int_t index(0);
185
186 for ( Int_t i = 0; i < GetSize(); ++i )
187 {
188 TArrayI slbn;
189 GetLayer(i)->GetAllMotifPositionsIDs(slbn);
190 for ( Int_t j = 0; j < slbn.GetSize(); ++j )
191 {
192 lbn[index] = slbn[j];
193 ++index;
194 }
195 }
196}
197
198//_____________________________________________________________________________
199const char*
200AliMpTrigger::GetID() const
201{
202 /// returns the id of this slat
203 return fId.Data();
204}
205
206//_____________________________________________________________________________
207const char*
208AliMpTrigger::GetName() const
209{
210 /// returns the name (=id+bending/non-bending) of this slat
211 TString name(GetID());
212 if ( fPlaneType == AliMp::kBendingPlane )
213 {
214 name += ".Bending";
215 }
216 else if ( fPlaneType == AliMp::kNonBendingPlane )
217 {
218 name += ".NonBending";
219 }
220 else
221 {
222 name += ".Invalid";
223 }
224 return name.Data();
225}
226
227//_____________________________________________________________________________
228AliMpSlat*
229AliMpTrigger::GetLayer(int layer) const
230{
231 /// Returns a given layer
232 if ( IsLayerValid(layer) )
233 {
234 return (AliMpSlat*)fSlats.At(layer);
235 }
236 return 0;
237}
238
239//_____________________________________________________________________________
240AliMpVSegmentation*
241AliMpTrigger::GetLayerSegmentation(int layer) const
242{
243 /// Returns a given layer
244 if ( IsLayerValid(layer) )
245 {
246 return (AliMpSlatSegmentation*)fSlatSegmentations.At(layer);
247 }
248 return 0;
249}
250
251//_____________________________________________________________________________
252Int_t
253AliMpTrigger::GetNofPadsX() const
254{
255 /// Returns the number of pad in x direction
256 if ( !GetSize() ) return -1;
257 if ( GetLayer(0) )
258 {
259 return GetLayer(0)->GetNofPadsX();
260 }
261 return -1;
262}
263
264//_____________________________________________________________________________
265Int_t
266AliMpTrigger::GetMaxNofPadsY() const
267{
268 /// Maximum number of pads in y direction
269 return fMaxNofPadsY;
270}
271
272//_____________________________________________________________________________
273Int_t
274AliMpTrigger::GetSize() const
275{
276 /// Number of layers
277 return fSlats.GetEntriesFast();
278}
279
280//_____________________________________________________________________________
281Bool_t
282AliMpTrigger::IsLayerValid(int layer) const
283{
284 /// Whether a given layer index is valid or not
285 if ( layer >= 0 && layer < GetSize() )
286 {
287 return kTRUE;
288 }
289 return kFALSE;
290}
291
292//_____________________________________________________________________________
293AliMp::PlaneType
294AliMpTrigger::PlaneType() const
295{
296 /// Bending or not
297 return fPlaneType;
298}
299
300//_____________________________________________________________________________
301TVector2
302AliMpTrigger::Position() const
303{
304 /// Slat position (cm)
305 return TVector2(DX(),DY());
306}
307
308//_____________________________________________________________________________
309void
310AliMpTrigger::Print(Option_t* opt) const
311{
312 /// Dump on screen
313 cout << "AliMpTrigger::" << GetID();
314 if ( GetSize() == 0 )
315 {
316 cout << " Empty";
317 }
318 else if ( GetSize() > 1 )
319 {
320 cout << " Number of layers : " << GetSize();
321 }
322 else
323 {
324 cout << " One layer";
325 }
326 cout << endl;
327 for ( Int_t i = 0; i < GetSize(); ++i )
328 {
329 cout << " ";
330 GetLayer(i)->Print(opt);
331 }
332}
333
334//_____________________________________________________________________________
335//_____________________________________________________________________________
336//_____________________________________________________________________________
337//_____________________________________________________________________________