Eff C++
[u/mrichter/AliRoot.git] / TPC / AliTPCROC.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
17 ///////////////////////////////////////////////////////////////////////////////
18 //                                                                           //
19 //  Geometry        class for a single ROC                                   //
20 //                                                                           //
21 //                                                                           //
22 ///////////////////////////////////////////////////////////////////////////////
23 #include "AliTPCROC.h"
24 #include "TMath.h"
25
26 ClassImp(AliTPCROC)
27
28
29 AliTPCROC* AliTPCROC::fgInstance = 0;
30
31
32
33
34 //_ singleton implementation __________________________________________________
35 AliTPCROC* AliTPCROC::Instance()
36 {
37   //
38   // Singleton implementation
39   // Returns an instance of this class, it is created if neccessary
40   //
41   if (fgInstance == 0){
42     fgInstance = new AliTPCROC();
43     fgInstance->Init();    
44   }
45   return fgInstance;
46 }
47
48
49
50
51 void AliTPCROC::Init(){
52   //
53   // initialize static variables
54   //
55   if (AliTPCROC::fNSectorsAll>0) return;
56   fNSectorsAll =72;
57   fNSectors[0] =36;
58   fNSectors[1] =36;
59   //
60   fNRows[0]= 63;
61   fNRows[1]= 96;
62   //
63   // number of pads in padrow
64   fNPads[0] = new UInt_t[fNRows[0]];
65   fNPads[1] = new UInt_t[fNRows[1]];  
66   //
67   // padrow index in array
68   //
69   fRowPosIndex[0] = new UInt_t[fNRows[0]];
70   fRowPosIndex[1] = new UInt_t[fNRows[1]];
71   //
72   // inner sectors
73   //
74   UInt_t index =0;
75   for (UInt_t irow=0; irow<fNRows[0];irow++){
76     UInt_t npads = (irow==0) ? 68 : 2 *Int_t(Double_t(irow)/3. +33.67);
77     fNPads[0][irow] = npads;
78     fRowPosIndex[0][irow] = index;
79     index+=npads;
80   }
81   fNChannels[0] = index;
82   //
83   index =0;
84   Double_t k1 = 10.*TMath::Tan(10*TMath::DegToRad())/6.;
85   Double_t k2 = 15.*TMath::Tan(10*TMath::DegToRad())/6.;
86   for (UInt_t irow=0; irow<fNRows[1];irow++){    
87     UInt_t npads = (irow<64) ? 
88       2*Int_t(k1*Double_t(irow)+37.75):
89       2*Int_t(k2*Double_t(irow-64)+56.66);
90     fNPads[1][irow] = npads;
91     fRowPosIndex[1][irow] = index;
92     index+=npads;
93   }
94   fNChannels[1] = index;
95   SetGeometry();
96 }
97
98
99
100
101 void AliTPCROC::SetGeometry()
102 {
103   //
104   //set ROC geometry parameters
105   //
106   const  Float_t kInnerRadiusLow = 83.65;
107   const  Float_t kInnerRadiusUp  = 133.3;
108   const  Float_t kOuterRadiusLow = 133.5;
109   const  Float_t kOuterRadiusUp  = 247.7;
110   const  Float_t kInnerFrameSpace = 1.5;
111   const  Float_t kOuterFrameSpace = 1.5;
112   const  Float_t kInnerWireMount = 1.2;
113   const  Float_t kOuterWireMount = 1.4;
114   const  Float_t kZLength =250.;
115   const  UInt_t   kNRowLow = 63;
116   const  UInt_t   kNRowUp1 = 64;
117   const  UInt_t   kNRowUp2 = 32;
118   const  UInt_t   kNRowUp  = 96;
119   const  Float_t kInnerAngle = 20; // 20 degrees
120   const  Float_t kOuterAngle = 20; // 20 degrees
121   //
122   //  pad     parameters
123   // 
124   const Float_t  kInnerPadPitchLength = 0.75;
125   const Float_t  kInnerPadPitchWidth = 0.40;
126   const Float_t  kInnerPadLength = 0.75;
127   const Float_t  kInnerPadWidth = 0.40;
128   const Float_t  kOuter1PadPitchLength = 1.0;
129   const Float_t  kOuterPadPitchWidth = 0.6;
130   const Float_t  kOuter1PadLength = 1.0;
131   const Float_t  kOuterPadWidth = 0.6;
132   const Float_t  kOuter2PadPitchLength = 1.5;
133   const Float_t  kOuter2PadLength = 1.5;  
134
135   //
136   //wires default parameters
137   //
138 //   const UInt_t    kNInnerWiresPerPad = 3;
139 //   const UInt_t    kInnerDummyWire = 2;
140 //   const Float_t  kInnerWWPitch = 0.25;
141 //   const Float_t  kRInnerFirstWire = 84.475;
142 //   const Float_t  kRInnerLastWire = 132.475;
143 //   const Float_t  kInnerOffWire = 0.5;
144 //   const UInt_t    kNOuter1WiresPerPad = 4;
145 //   const UInt_t    kNOuter2WiresPerPad = 6;
146 //   const Float_t  kOuterWWPitch = 0.25;  
147 //   const Float_t  kROuterFirstWire = 134.225;
148 //   const Float_t  kROuterLastWire = 246.975;
149 //   const UInt_t    kOuterDummyWire = 2;
150 //   const Float_t  kOuterOffWire = 0.5;
151   //
152   //set sector parameters
153   //
154   fInnerRadiusLow = kInnerRadiusLow;
155   fOuterRadiusLow = kOuterRadiusLow;
156   fInnerRadiusUp  = kInnerRadiusUp;
157   fOuterRadiusUp  = kOuterRadiusUp;  
158   fInnerFrameSpace = kInnerFrameSpace;
159   fOuterFrameSpace = kOuterFrameSpace;
160   fInnerWireMount  = kInnerWireMount;
161   fOuterWireMount  = kOuterWireMount;
162   fZLength         = kZLength;
163   fInnerAngle      =  TMath::DegToRad()*kInnerAngle;
164   fOuterAngle      =  TMath::DegToRad()*kOuterAngle;
165
166   fNRowLow       = kNRowLow;
167   fNRowUp1      = kNRowUp1;
168   fNRowUp2       = kNRowUp2;
169   fNRowUp        = kNRowUp;
170   //
171   //set pad parameter
172   //
173   fInnerPadPitchLength = kInnerPadPitchLength;
174   fInnerPadPitchWidth  = kInnerPadPitchWidth;
175   fInnerPadLength      = kInnerPadLength;
176   fInnerPadWidth       = kInnerPadWidth;
177   fOuter1PadPitchLength = kOuter1PadPitchLength; 
178   fOuter2PadPitchLength = kOuter2PadPitchLength;
179   fOuterPadPitchWidth   = kOuterPadPitchWidth;
180   fOuter1PadLength      = kOuter1PadLength;
181   fOuter2PadLength      = kOuter2PadLength;
182   fOuterPadWidth        = kOuterPadWidth; 
183
184   //
185   //set wire parameters
186   //
187   // SetInnerNWires(kNInnerWiresPerPad);
188   //   SetInnerDummyWire(kInnerDummyWire);
189   //   SetInnerOffWire(kInnerOffWire);
190   //   SetOuter1NWires(kNOuter1WiresPerPad);
191   //   SetOuter2NWire(kNOuter2WiresPerPad);
192   //   SetOuterDummyWire(kOuterDummyWire);
193   //   SetOuterOffWire(kOuterOffWire);
194   //   SetInnerWWPitch(kInnerWWPitch);
195   //   SetRInnerFirstWire(kRInnerFirstWire);
196   //   SetRInnerLastWire(kRInnerLastWire);
197   //   SetOuterWWPitch(kOuterWWPitch);
198   //   SetROuterFirstWire(kROuterFirstWire);
199   //   SetROuterLastWire(kROuterLastWire);  
200
201
202
203
204
205 //_____________________________________________________________________________
206 AliTPCROC::AliTPCROC()
207           :TObject(), 
208            fNSectorsAll(0),
209            fInnerRadiusLow(0.),
210            fInnerRadiusUp(0.),
211            fOuterRadiusUp(0.),
212            fOuterRadiusLow(0.),
213            fInnerFrameSpace(0.),
214            fOuterFrameSpace(0.),
215            fInnerWireMount(0.),
216            fOuterWireMount(0.),
217            fZLength(0.),
218            fInnerAngle(0.),
219            fOuterAngle(0.),
220            fNInnerWiresPerPad(0),
221            fInnerWWPitch(0.),
222            fInnerDummyWire(0),
223            fInnerOffWire(0.),
224            fRInnerFirstWire(0.),
225            fRInnerLastWire(0.),
226            fLastWireUp1(0.),
227            fNOuter1WiresPerPad(0),
228            fNOuter2WiresPerPad(0),
229            fOuterWWPitch(0.),
230            fOuterDummyWire(0),
231            fOuterOffWire(0),
232            fROuterFirstWire(0.),
233            fROuterLastWire(0),
234            fInnerPadPitchLength(0.),
235            fInnerPadPitchWidth(0.),
236            fInnerPadLength(0.),
237            fInnerPadWidth(0.),
238            fOuter1PadPitchLength(0.),
239            fOuter2PadPitchLength(0),
240            fOuterPadPitchWidth(0),
241            fOuter1PadLength(0.),
242            fOuter2PadLength(0),
243            fOuterPadWidth(0),
244            fNRowLow(0),
245            fNRowUp1(0),
246            fNRowUp2(0),
247            fNRowUp(0),
248            fNtRows(0)
249 {
250   //
251   // Default constructor
252   for (UInt_t i=0;i<2;i++){
253     fNSectors[i]  = 0;
254     fNRows[i]     = 0;
255     fNChannels[i] = 0;
256     fNPads[i]     = 0;
257     fRowPosIndex[i]= 0;
258   }
259 }
260
261
262 //_____________________________________________________________________________
263 AliTPCROC::AliTPCROC(const AliTPCROC &roc)
264           :TObject(roc),
265            fNSectorsAll(0),
266            fInnerRadiusLow(0.),
267            fInnerRadiusUp(0.),
268            fOuterRadiusUp(0.),
269            fOuterRadiusLow(0.),
270            fInnerFrameSpace(0.),
271            fOuterFrameSpace(0.),
272            fInnerWireMount(0.),
273            fOuterWireMount(0.),
274            fZLength(0.),
275            fInnerAngle(0.),
276            fOuterAngle(0.),
277            fNInnerWiresPerPad(0),
278            fInnerWWPitch(0.),
279            fInnerDummyWire(0),
280            fInnerOffWire(0.),
281            fRInnerFirstWire(0.),
282            fRInnerLastWire(0.),
283            fLastWireUp1(0.),
284            fNOuter1WiresPerPad(0),
285            fNOuter2WiresPerPad(0),
286            fOuterWWPitch(0.),
287            fOuterDummyWire(0),
288            fOuterOffWire(0),
289            fROuterFirstWire(0.),
290            fROuterLastWire(0),
291            fInnerPadPitchLength(0.),
292            fInnerPadPitchWidth(0.),
293            fInnerPadLength(0.),
294            fInnerPadWidth(0.),
295            fOuter1PadPitchLength(0.),
296            fOuter2PadPitchLength(0),
297            fOuterPadPitchWidth(0),
298            fOuter1PadLength(0.),
299            fOuter2PadLength(0),
300            fOuterPadWidth(0),
301            fNRowLow(0),
302            fNRowUp1(0),
303            fNRowUp2(0),
304            fNRowUp(0),
305            fNtRows(0)
306
307 {
308   //
309   // AliTPCROC copy constructor
310   //
311   fNSectorsAll = roc.fNSectorsAll;
312   fNSectors[0] = roc.fNSectors[0];
313   fNSectors[1] = roc.fNSectors[1];
314   fNRows[0]    = roc.fNRows[0];
315   fNRows[1]    = roc.fNRows[1];
316   fNChannels[0]= roc.fNChannels[0];
317   fNChannels[1]= roc.fNChannels[1];
318   //
319   // number of pads in padrow
320   fNPads[0] = new UInt_t[fNRows[0]];
321   fNPads[1] = new UInt_t[fNRows[1]];  
322   //
323   // padrow index in array
324   //
325   fRowPosIndex[0] = new UInt_t[fNRows[0]];
326   fRowPosIndex[1] = new UInt_t[fNRows[1]];
327   //
328   for (UInt_t irow =0; irow<fNRows[0];irow++){
329     fNPads[0][irow]       = roc.fNPads[0][irow];
330     fRowPosIndex[0][irow] = roc.fRowPosIndex[0][irow];
331   }
332   for (UInt_t irow =0; irow<fNRows[1];irow++){
333     fNPads[1][irow]       = roc.fNPads[1][irow];
334     fRowPosIndex[1][irow] = roc.fRowPosIndex[1][irow];
335   }
336 }
337 //____________________________________________________________________________
338 AliTPCROC & AliTPCROC::operator =(const AliTPCROC & roc)
339 {
340   //
341   // assignment operator - dummy
342   //
343   fZLength = roc.fZLength;
344   return (*this);
345 }
346 //_____________________________________________________________________________
347 AliTPCROC::~AliTPCROC()
348 {
349   //
350   // AliTPCROC destructor
351   //
352   delete [] fNPads[0];
353   delete [] fNPads[1];
354   delete [] fRowPosIndex[0];
355   delete [] fRowPosIndex[1];
356   fgInstance = 0x0;
357   
358 }
359