- Updated for changing mm->cm
[u/mrichter/AliRoot.git] / MUON / mapping / AliMpSlat.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
16// $Id$
17// $MpId: AliMpSlat.cxx,v 1.2 2005/09/19 19:01:31 ivana Exp $
18
19#include "AliMpSlat.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 "AliMpSlatPadIterator.h"
28
29#include "Riostream.h"
30
31#include "TArrayI.h"
32
33ClassImp(AliMpSlat)
34
35//_____________________________________________________________________________
36AliMpSlat::AliMpSlat()
37: TObject(),
38 fId(""),
19b51aad 39 fPlaneType(kNonBendingPlane),
dee1d5f1 40 fDX(0),
41 fDY(0),
42 fNofPadsX(0),
19b51aad 43 fMaxNofPadsY(0),
44 fManuMap()
dee1d5f1 45{
46 //
47 // Empty ctor.
48 //
49 AliDebug(1,Form("this=%p Empty ctor",this));
50}
51
52//_____________________________________________________________________________
19b51aad 53AliMpSlat::AliMpSlat(const char* id, AliMpPlaneType bendingOrNonBending)
dee1d5f1 54: TObject(),
55 fId(id),
19b51aad 56 fPlaneType(bendingOrNonBending),
dee1d5f1 57 fDX(0),
58 fDY(0),
59 fNofPadsX(0),
19b51aad 60 fMaxNofPadsY(0),
61 fManuMap(kTRUE)
dee1d5f1 62{
63 //
64 // Normal ctor
65 //
66 AliDebug(1,Form("this=%p id=%s",this,id));
67}
68
69//_____________________________________________________________________________
70AliMpSlat::~AliMpSlat()
71{
72 //
73 // Dtor.
74 //
75 AliDebug(1,Form("this=%p fId=%s",this,fId.Data()));
76}
77
78//_____________________________________________________________________________
79void
80AliMpSlat::Add(AliMpPCB* pcbType, const TArrayI& manuList)
81{
82 //
83 // Adds a PCB to this slat. The manuList speficy the ids of the manu
84 // that compose the PCB. The manuList ordering is important, as the
85 // assumption is that it's ordered counter-clockwise, starting from
86 // the lower-left of the PCB.
87 //
88 Int_t ixOffset = 0;
89 if ( GetSize() )
90 {
91 ixOffset = GetPCB(GetSize()-1)->Ixmax()+1;
92 }
19b51aad 93 else
94 {
95 ixOffset = pcbType->Ixmin();
96 }
dee1d5f1 97 Double_t xOffset = DX()*2;
98 AliMpPCB* pcb = pcbType->Clone(manuList,ixOffset,xOffset);
99#ifdef WITH_ROOT
100 fPCBs.AddLast(pcb);
101#else
102 fPCBs.push_back(pcb);
103#endif
19b51aad 104 fDY = TMath::Max(pcb->DY(),fDY);
dee1d5f1 105 fDX += pcb->DX();
106 fNofPadsX += pcb->GetNofPadsX();
107 fMaxNofPadsY = std::max(fMaxNofPadsY,pcb->GetNofPadsY());
108 for ( AliMpPCB::Size_t i = 0; i < pcb->GetSize(); ++i )
109 {
110 AliMpMotifPosition* mp = pcb->GetMotifPosition(i);
111 Int_t manuID = mp->GetID();
112 // Before inserting a new key, check if it's already there
113#ifdef WITH_ROOT
19b51aad 114 TObject* there = fManuMap.GetValue(manuID);
dee1d5f1 115 if ( there == 0 )
116 {
19b51aad 117 fManuMap.Add(manuID,(TObject*)mp);
dee1d5f1 118 }
119 else
120 {
121 AliError(Form("ManuID %d is duplicated for PCB %s",manuID,pcbType->GetID()));
122 }
123#else
124 fManuMap[manuID] = mp;
125#endif
126 }
19b51aad 127 fPosition.Set(DX(),DY());
dee1d5f1 128}
129
130//_____________________________________________________________________________
131TVector2
132AliMpSlat::Dimensions() const
133{
134 //
135 // Returns the half-sizes of the slat.
136 //
137 return TVector2(DX(),DY());
138}
139
140//_____________________________________________________________________________
141Double_t
142AliMpSlat::DX() const
143{
144 //
145 // Returns the x-half-size of the slat.
146 //
147 return fDX;
148}
149
150//_____________________________________________________________________________
151Double_t
152AliMpSlat::DY() const
153{
154 //
155 // Returns the y-half-size of the slat.
156 //
157 return fDY;
158}
159
160//_____________________________________________________________________________
161AliMpMotifPosition*
162AliMpSlat::FindMotifPosition(Int_t manuID) const
163{
164 //
165 // Returns the motifPosition referenced by it manuID
166 //
167#ifdef WITH_ROOT
19b51aad 168 TObject* rv = fManuMap.GetValue(manuID);
dee1d5f1 169 if ( rv )
170 {
171 return (AliMpMotifPosition*)(rv);
172 }
173 else
174 {
175 return 0;
176 }
177#else
178 std::map<int,AliMpMotifPosition*>::const_iterator it = fManuMap.find(manuID);
179 if ( it != fManuMap.end() )
180 {
181 return it->second;
182 }
183 else
184 {
185 return 0;
186 }
187#endif
188}
189
190//_____________________________________________________________________________
191AliMpMotifPosition*
192AliMpSlat::FindMotifPosition(Int_t ix, Int_t iy) const
193{
194 //
195 // 1. Find the PCB containing ix (iy not needed for this)
196 // 2. Forward the request to the PCB, using pcb local indices.
197 //
198 const AliMpPCB* pcb = FindPCB(ix);
199 if ( pcb )
200 {
201 return pcb->FindMotifPosition(ix,iy);
202 }
203 else
204 {
205 return 0;
206 }
207}
208
209//_____________________________________________________________________________
210AliMpMotifPosition*
211AliMpSlat::FindMotifPosition(Double_t x, Double_t y) const
212{
213 //
214 // Returns the motifPosition containing position (x,y)
215 //
216 const AliMpPCB* pcb = FindPCB(x,y);
217 if (pcb)
218 {
219 return pcb->FindMotifPosition(x,y);
220 }
221 else
222 {
223 return 0;
224 }
225}
226
227//_____________________________________________________________________________
228AliMpPCB*
229AliMpSlat::FindPCB(Int_t ix) const
230{
231 //
232 // Returns the PCB containing x-integer-position ix
233 //
234 for ( Size_t i = 0; i < GetSize(); ++i )
235 {
236 AliMpPCB* pcb = GetPCB(i);
237 if ( ix >= pcb->Ixmin() && ix <= pcb->Ixmax() )
238 {
239 return pcb;
240 }
241 }
242 return 0;
243}
244
245//_____________________________________________________________________________
246Int_t
247AliMpSlat::FindPCBIndex(Int_t ix) const
248{
249 //
250 // Returns the index of the PCB containing x-integer-position ix.
251 //
252 for ( Size_t i = 0; i < GetSize(); ++i )
253 {
254 AliMpPCB* pcb = GetPCB(i);
255 if ( ix >= pcb->Ixmin() && ix <= pcb->Ixmax() )
256 {
257 return i;
258 }
259 }
260 return -1;
261}
262
263//_____________________________________________________________________________
264AliMpPCB*
265AliMpSlat::FindPCB(Double_t x, Double_t y) const
266{
267 //
268 // Returns the PCB containing position (x,y)
269 //
270 for ( Size_t i = 0; i < GetSize(); ++i )
271 {
272 AliMpPCB* pcb = GetPCB(i);
273 if ( x >= pcb->Xmin() && x < pcb->Xmax() &&
274 y >= pcb->Ymin() && y < pcb->Ymax() )
275 {
276 return pcb;
277 }
278 }
279 return 0;
280}
281
282//_____________________________________________________________________________
283Int_t
284AliMpSlat::FindPCBIndex(Double_t x, Double_t y) const
285{
286 //
287 // Returns the index of the PCB containing position (x,y)
288 //
289 for ( Size_t i = 0; i < GetSize(); ++i )
290 {
291 AliMpPCB* pcb = GetPCB(i);
292 if ( x >= pcb->Xmin() && x < pcb->Xmax() &&
293 y >= pcb->Ymin() && y < pcb->Ymax() )
294 {
295 return i;
296 }
297 }
298 return -1;
299}
300
19b51aad 301//_____________________________________________________________________________
302void
303AliMpSlat::ForcePosition(const TVector2& pos)
304{
305 //
306 // Force the position to be different from (DX(),DY()).
307 // Normally only used by triggerSlats (for layers).
308 // Beware that this method must be called once all PCB have been added,
309 // as the Add() method resets the position.
310 //
311 fPosition = pos;
312}
313
314//_____________________________________________________________________________
315void
316AliMpSlat::GetAllElectronicCardNumbers(TArrayI& ecn) const
317{
318 ecn.Set(GetNofElectronicCards());
319 TExMapIter it(fManuMap.GetIterator());
320 Long_t key;
321 Long_t value;
322 Int_t n(0);
323 while ( it.Next(key,value) == kTRUE )
324 {
325 ecn.AddAt((Int_t)(key),n);
326 ++n;
327 }
328}
329
dee1d5f1 330//_____________________________________________________________________________
331const char*
332AliMpSlat::GetID() const
333{
334 //
335 // Returns the name of this slat.
336 //
337 return fId.Data();
338}
339
340//_____________________________________________________________________________
341Int_t
342AliMpSlat::GetMaxNofPadsY() const
343{
344 //
345 // Returns the maximum number of pads to be found in this slat y-direction.
346 //
347 return fMaxNofPadsY;
348}
349
16e8fffd 350//_____________________________________________________________________________
351Int_t
352AliMpSlat::GetMaxPadIndexX() const
353{
354 AliMpPCB* last = GetPCB(GetSize()-1);
355 if (last)
356 {
357 return last->Ixmax();
358 }
359 return 0;
360}
361
19b51aad 362//_____________________________________________________________________________
363const char*
364AliMpSlat::GetName() const
365{
366 TString name(GetID());
367 if ( fPlaneType == kBendingPlane )
368 {
369 name += ".Bending";
370 }
371 else if ( fPlaneType == kNonBendingPlane )
372 {
373 name += ".NonBending";
374 }
375 else
376 {
377 name += ".Invalid";
378 }
379 return name.Data();
380}
381
382//_____________________________________________________________________________
383Int_t
384AliMpSlat::GetNofElectronicCards() const
385{
386 return fManuMap.GetSize();
387}
388
dee1d5f1 389//_____________________________________________________________________________
390Int_t
391AliMpSlat::GetNofPadsX() const
392{
393 //
394 // Returns the number of pad in x-direction.
395 //
396 return fNofPadsX;
397}
398
399//_____________________________________________________________________________
400AliMpPCB*
401AliMpSlat::GetPCB(AliMpSlat::Size_t i) const
402{
403 //
404 // Returns the i-th PCB of this slat.
405 //
406#ifdef WITH_ROOT
407 if ( i >= fPCBs.GetEntriesFast() ) return 0;
408 return (AliMpPCB*)fPCBs[i];
409#else
410 if ( i >= fPCBs.size() ) return 0;
411 return fPCBs[i];
412#endif
413}
414
415//_____________________________________________________________________________
416AliMpSlat::Size_t
417AliMpSlat::GetSize() const
418{
419 //
420 // Returns the number of PCB in this slat.
421 //
422#ifdef WITH_ROOT
423 return fPCBs.GetEntriesFast();
424#else
425 return fPCBs.size();
426#endif
427}
428
19b51aad 429//_____________________________________________________________________________
430TVector2
431AliMpSlat::Position() const
432{
433 return fPosition;
434}
435
dee1d5f1 436//_____________________________________________________________________________
437void
438AliMpSlat::Print(Option_t* option) const
439{
440 //
441 // Prints the slat characteristics.
442 //
443 cout << "SLAT " << GetID() << " 1/2 DIM = (" << DX() << "," << DY() << ")"
19b51aad 444 << " POS = " << Position().X() << "," << Position().Y()
445 << " NPADSX = " << GetNofPadsX()
446 << " MAXNPADSY = " << GetMaxNofPadsY()
447 << " NPCBs=" << GetSize() << endl;
448
449 TString soption(option);
dee1d5f1 450
19b51aad 451 if ( soption.Contains("P") )
dee1d5f1 452 {
453 for ( Size_t i = 0; i < GetSize() ; ++i )
454 {
455 cout << " ";
456 if ( option )
457 {
458 fPCBs[i]->Print(option+1);
459 }
460 else
461 {
462 fPCBs[i]->Print();
463 }
464 }
465 }
19b51aad 466
467 if ( soption.Contains("M") || soption.Contains("L") )
468 {
469 cout << fManuMap.GetSize() << " ";
470 cout << "Electronic card (manu or local board) Ids : ";
471
472 TExMapIter iter(fManuMap.GetIterator());
473 Long_t key, value;
474 while ( iter.Next(key,value) )
475 {
476 cout << key << " ";
477 }
478 cout << endl;
479 }
dee1d5f1 480}