MUON + CheckCompiler
[u/mrichter/AliRoot.git] / MUON / MUONmapping / AliMpPCB.h
1 /* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
2  * See cxx source for full Copyright notice                               */
3
4 // $Id$ 
5 // $MpId: AliMpPCB.h,v 1.9 2006/05/24 13:58:24 ivana Exp $ 
6
7 /// \ingroup slat
8 /// \class AliMpPCB
9 /// \brief A PCB for station 3,4 or 5
10 /// 
11 //  Author: Laurent Aphecetche
12
13 #ifndef ALIMPPCB_H
14 #define ALIMPPCB_H
15
16 #ifndef ALI_MP_VPAD_ITERATOR_H
17 #  include "AliMpVPadIterator.h"
18 #endif
19
20 #ifndef ALI_MP_AREA_H
21 #  include "AliMpArea.h"
22 #endif
23
24
25 #ifndef ROOT_TObject
26 #  include "TObject.h"
27 #endif
28
29 #ifndef ROOT_TString
30 #  include "TString.h"
31 #endif
32
33 #ifndef ROOT_TArraI
34 #  include "TArrayI.h"
35 #endif
36
37 #ifndef ROOT_TObjArray
38 #  include "TObjArray.h"
39 #endif
40
41 class AliMpSlatMotifMap;
42 class AliMpMotifPosition;
43 class AliMpMotifType;
44 class AliMpMotifSpecial;
45
46 class AliMpPCB : public TObject
47 {
48  public:
49
50   AliMpPCB();
51   /** Ctor. The sizes are given in mm.
52       See full doc for the meaning of enveloppe parameters.
53   */
54   AliMpPCB(AliMpSlatMotifMap* motifMap,
55            const char* id, Double_t padSizeX, Double_t padSizeY,
56            Double_t enveloppeSizeX, Double_t enveloppeSizeY);
57   
58   AliMpPCB(const char* id, AliMpMotifSpecial* ms);
59   
60   AliMpPCB(const AliMpPCB& o);
61   AliMpPCB& operator=(const AliMpPCB& o);
62
63   virtual ~AliMpPCB();
64
65   TObject* Clone(const char* newname="") const;
66
67   /** Duplicate this PCB. The copy has the manuids of its motifs changed 
68       according to the manuid vector, and its x-offset according to ix 
69       and x.
70   */    
71   AliMpPCB* Clone(const TArrayI& manuids,
72                   Int_t ixOffset, Double_t xOffset) const;
73
74   void Copy(TObject& o) const;
75
76   /** Add a motif to this PCB. (ix,iy) are the coordinates of one corner 
77     of the motif, in pad-units. Which corner depends on the sign(s) of (ix,iy):
78     (ix>0,iy>0) : bottom-left corner
79     (ix<0,iy>0) : bottom-right corner
80     (ix<0,iy<0) : top-right corner
81     (ix>0,iy<0) : top-left corner.
82     */
83   void Add(AliMpMotifType* motifType, Int_t ix, Int_t iy);
84
85   AliMpArea Area() const;
86   
87   void Print(Option_t* option = "") const;
88
89   Bool_t HasMotifPositionID(Int_t manuId) const;
90   
91   Double_t ActiveDX() const;
92   Double_t ActiveDY() const;
93
94   Double_t DX() const;
95   Double_t DY() const;
96
97   Double_t X() const;
98   Double_t Y() const;
99
100   Double_t Xmin() const;
101   Double_t Xmax() const;
102  
103   Double_t ActiveXmin() const;
104   Double_t ActiveXmax() const;
105
106   Double_t Ymin() const;
107   Double_t Ymax() const;
108
109   Double_t PadSizeX() const;
110   Double_t PadSizeY() const;
111
112   /** Returns the i-th motifPosition of this PCB.
113       i : [0..GetSize()-1]
114   */
115   AliMpMotifPosition* GetMotifPosition(Int_t i) const;
116
117   /// Returns the motifPosition which contains the pad at (ix,iy).
118   AliMpMotifPosition* FindMotifPosition(Int_t ix, Int_t iy) const;
119
120   /// Returns the motifPosition which contains the pad at (x,y).
121   AliMpMotifPosition* FindMotifPosition(Double_t x, Double_t y) const;
122
123   /// The number of motifs, aka manus.
124   Int_t GetSize() const;
125
126   Int_t GetNofPadsX() const;
127   Int_t GetNofPadsY() const;
128
129   Int_t Ixmin() const;
130   Int_t Ixmax() const;
131   
132   Int_t Iymin() const;
133   Int_t Iymax() const;
134   
135   const char* GetID() const;
136   
137   /// Return the number of pads in this PCB 
138   Int_t NofPads() const { return fNofPads; }
139   
140   /// Return the motif map
141   AliMpSlatMotifMap* MotifMap() const { return fMotifMap; }
142   
143   void Save() const;
144   
145  private:
146   TString fId; ///< PCB name
147   Double_t fPadSizeX; ///< x-size of this PCB's pads (cm)
148   Double_t fPadSizeY; ///< y-size of this PCB's pads (cm)
149   Double_t fEnveloppeSizeX; ///< max x-size of this PCB (cm)
150   Double_t fEnveloppeSizeY; ///< max y-size of this PCB (cm)
151   Double_t fXoffset; ///< x-offset = x of first pad of this PCB (cm)
152   Double_t fActiveXmin; ///< min x of an actual pad in this PCB (cm)
153   Double_t fActiveXmax; ///< max x of an actual pad in this PCB (cm)
154   Int_t fIxmin; ///< min pad index in x
155   Int_t fIxmax; ///< max pad index in x
156   Int_t fIymin; ///< min pad index in y
157   Int_t fIymax; ///< max pad index in y
158   TObjArray fMotifPositions; ///< array of motifs
159   Int_t fNofPads; ///< number of pads in this PCB
160   AliMpSlatMotifMap* fMotifMap; ///< to keep track of things to avoid duplications of motif and motiftypes, and get proper deletion
161   
162   ClassDef(AliMpPCB,3) // A PCB for Stations 3,4,5
163 };
164
165 #endif