Moved mode lines to end of files
[u/mrichter/AliRoot.git] / FMD / AliFMD.h
1 #ifndef ALIFMD_H
2 #define ALIFMD_H
3 /* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights
4  * reserved. 
5  *
6  * Latest changes by Christian Holm Christensen <cholm@nbi.dk>
7  *
8  * See cxx source for full Copyright notice                               
9  */
10
11 ////////////////////////////////////////////////
12 //  Manager and hits classes for set:Si-FMD     //
13 ////////////////////////////////////////////////
14
15 #ifndef ALIDETECTOR_H 
16 # include <AliDetector.h>
17 #endif
18 #ifndef ALIFMDSUBDETECTOR_H
19 # include "AliFMDSubDetector.h"
20 #endif
21 #ifndef ALIFMDRING_H
22 # include "AliFMDRing.h"
23 #endif
24 #ifndef ROOT_TBranch
25 # include <TBranch.h>
26 #endif
27 #ifndef ROOT_TArrayI
28 # include <TArrayI.h>
29 #endif
30
31 //____________________________________________________________________
32 class AliFMD : public AliDetector 
33 {
34 public:
35   AliFMD();
36   AliFMD(const char *name, const char *title, bool detailed);
37   AliFMD(const AliFMD& FMD) : AliDetector(FMD)  {}  //copy ctor
38   virtual ~AliFMD(); 
39   AliFMD&               operator=(const AliFMD&)  {return *this;}
40
41   // GEometry ANd Tracking (GEANT :-)
42   virtual void   CreateGeometry();
43   virtual void   CreateMaterials(); 
44   virtual void   Init();
45   virtual void   StepManager() = 0;
46   AliFMDSubDetector*    GetFMD1() const       { return fFMD1; }
47   AliFMDSubDetector*    GetFMD2() const       { return fFMD2; }
48   AliFMDSubDetector*    GetFMD3() const       { return fFMD3; }
49   AliFMDRing*           GetInner() const      { return fInner; }
50   AliFMDRing*           GetOuter() const      { return fOuter; }
51
52   // Graphics and event display 
53   virtual        void   BuildGeometry();
54   virtual        void   DrawDetector();
55   virtual const  Int_t  DistanceToPrimitive(Int_t px, Int_t py);
56
57   // Hit and digit management 
58   virtual void          MakeBranch(Option_t *opt=" ");
59   virtual void          SetHitsAddressBranch(TBranch *b);
60   virtual void          SetTreeAddress();
61   virtual TClonesArray* SDigits() { return fSDigits; }        
62   virtual void          ResetSDigits();
63   virtual void          AddHit(Int_t track, Int_t *vol, Float_t *hits);
64   virtual void          AddHit(Int_t    track, 
65                                UShort_t detector, 
66                                Char_t   ring, 
67                                UShort_t sector, 
68                                UShort_t strip, 
69                                Float_t  x=0,
70                                Float_t  y=0, 
71                                Float_t  z=0,
72                                Float_t  px=0, 
73                                Float_t  py=0, 
74                                Float_t  pz=0,
75                                Float_t  edep=0,
76                                Int_t    pdg=0,
77                                Float_t  t=0);
78   virtual        void   AddDigit(Int_t *digits);
79   virtual        void   AddDigit(UShort_t detector=0, 
80                                  Char_t   ring='\0', 
81                                  UShort_t sector=0, 
82                                  UShort_t strip=0, 
83                                  UShort_t count1=0, 
84                                  Short_t  count2=-1, 
85                                  Short_t  count3=-1);
86   virtual        void   AddSDigit(Int_t *digits);
87   virtual        void   AddSDigit(UShort_t detector=0, 
88                                   Char_t   ring='\0', 
89                                   UShort_t sector=0, 
90                                   UShort_t strip=0, 
91                                   Float_t  edep=0,
92                                   UShort_t count1=0, 
93                                   Short_t  count2=-1, 
94                                   Short_t  count3=-1);
95
96   // Digitisation
97   virtual AliDigitizer* CreateDigitizer(AliRunDigitizer* manager) const;
98   virtual        void   Hits2Digits();
99   virtual        void   Hits2SDigits();
100
101   // Raw data 
102   virtual        void   Digits2Raw();
103
104   // Set various parameters 
105   void     SetLegLength(Double_t     length=1);
106   void     SetLegRadius(Double_t     radius=.5);
107   void     SetLegOffset(Double_t     offset=.5);
108   void     SetModuleSpacing(Double_t spacing=1);
109
110   // Get various parameters
111   Int_t    GetSiId() const                 { return (*fIdtmed)[kSiId]; }
112   Int_t    GetAirId() const                { return (*fIdtmed)[kAirId]; }
113   Int_t    GetPlasticId() const            { return (*fIdtmed)[kPlasticId]; }
114   Int_t    GetPcbId() const                { return (*fIdtmed)[kPcbId]; }
115   Int_t    GetKaptionId() const            { return (*fIdtmed)[kKaptionId]; }
116   Int_t    GetCarbonId() const             { return (*fIdtmed)[kCarbonId]; }
117   Int_t    GetPrintboardRotationId() const { return fPrintboardRotationId; }
118   Int_t    GetShortLegId() const           { return fShortLegId; }
119   Int_t    GetLongLegId() const            { return fLongLegId; }
120   Double_t GetLegLength() const            { return fLegLength; }
121   Double_t GetLegRadius() const            { return fLegRadius; }
122   Double_t GetModuleSpacing() const        { return fModuleSpacing; }  
123
124   // Utility
125   void   Browse(TBrowser* b);
126   Float_t GetSiDensity() const { return fSiDensity; }
127   enum { 
128     kBaseDDL = 0x1000 // DDL offset for the FMD
129   };
130 protected:
131   enum {
132     kSiId,                 // ID of Si medium
133     kAirId,                // ID of Air medium
134     kPlasticId,            // ID of Plastic medium
135     kPcbId,                // ID of PCB medium
136     kSiChipId,             // ID of Si Chip medium
137     kKaptionId,            // ID of Kaption medium
138     kCarbonId              // ID of Carbon medium
139   };
140
141   void    SetSiDensity(Float_t r=2.33) { fSiDensity = r; }
142   TClonesArray*      HitsArray();
143   TClonesArray*      DigitsArray();
144   TClonesArray*      SDigitsArray();
145   
146   AliFMDRing*        fInner;        // Inner ring structure
147   AliFMDRing*        fOuter;        // Outer ring structure  
148   AliFMDSubDetector* fFMD1;         // FMD1 structure
149   AliFMDSubDetector* fFMD2;         // FMD2 structure  
150   AliFMDSubDetector* fFMD3;         // FMD3 structure
151
152   TClonesArray*      fSDigits;
153   Int_t              fNsdigits;
154   
155   Float_t    fSiDensity;            // Density of Silicon
156   Int_t      fPrintboardRotationId; // ID of Rotation of print bard
157   Int_t      fIdentityRotationId;   // ID of identity matrix 
158   Int_t      fShortLegId;           // ID short leg volume
159   Int_t      fLongLegId;            // ID long leg volume  
160   Double_t   fLegLength;            // Leg length
161   Double_t   fLegRadius;            // Leg radius
162   Double_t   fModuleSpacing;        // Staggering offset 
163   
164   ClassDef(AliFMD,8)     // Base class FMD entry point
165 };
166
167 //____________________________________________________________________
168 class AliFMDv0 : public AliFMD 
169 {
170 public:
171   AliFMDv0() {}
172   AliFMDv0(const char *name, const char *title="Coarse geometry") 
173     : AliFMD(name, title, false)
174   {}
175   virtual ~AliFMDv0() 
176   {}
177
178   // Required member functions 
179   virtual Int_t  IsVersion() const {return 0;}
180   virtual void   StepManager() {}
181
182   ClassDef(AliFMDv0,1) // Coarse FMD geometry 
183 };
184
185 //____________________________________________________________________
186 #ifndef ROOT_TLorentzVector
187 # include <TLorentzVector.h>
188 #endif
189  
190 class AliFMDv1 : public AliFMD 
191 {
192 public:
193   AliFMDv1() {}
194   AliFMDv1(const char *name, const char *title="Detailed geometry") 
195     : AliFMD(name, title, true) 
196   {}
197   virtual ~AliFMDv1() {}
198
199   // Required member functions 
200   virtual Int_t  IsVersion() const {return 1;}
201   virtual void   StepManager();
202 protected:
203   Double_t   fCurrentDeltaE;        // The current accumelated energy loss
204   TLorentzVector fCurrentV;         // Current production vertex 
205   TLorentzVector fCurrentP;         // Current momentum vector 
206   Int_t          fCurrentPdg;       // Current PDG code 
207   
208   ClassDef(AliFMDv1,3)  // Detailed FMD geometry
209 };
210
211 #endif
212 //____________________________________________________________________
213 //
214 // Local Variables:
215 //   mode: C++
216 // End:
217 //
218 // EOF
219 //