Updated from the TPC-PreRelease branch
[u/mrichter/AliRoot.git] / TPC / AliTPCParam.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 $Log$
18 Revision 1.8.4.4  2000/06/26 07:39:42  kowal2
19 Changes to obey the coding rules
20
21 Revision 1.8.4.3  2000/06/25 08:38:41  kowal2
22 Splitted from AliTPCtracking
23   
24 Revision 1.8.4.2  2000/06/14 16:48:24  kowal2
25 Parameter setting improved. Removed compiler warnings
26
27 Revision 1.8.4.1  2000/06/09 07:12:21  kowal2  
28
29 Updated defaults
30
31 Revision 1.8  2000/04/17 09:37:33  kowal2
32 removed obsolete AliTPCDigitsDisplay.C
33
34 Revision 1.7.8.2  2000/04/10 08:44:51  kowal2
35
36 New transformations added
37 Different pad and pad-rows geometries for different sectors
38
39 Revision 1.7.8.1  2000/04/10 07:56:53  kowal2
40 Not used anymore - removed
41
42 Revision 1.7  1999/10/08 13:10:35  fca
43 Values in SetDefault are in radiants
44
45 Revision 1.6  1999/10/08 06:27:59  fca
46 Defaults updated
47
48 Revision 1.5  1999/10/05 17:18:27  fca
49 Correct GetWire check on even/odd fnWires
50
51 Revision 1.4  1999/09/29 09:24:34  fca
52 Introduction of the Copyright and cvs Log
53
54 */
55
56 ///////////////////////////////////////////////////////////////////////
57 //  Manager and of geomety  classes for set: TPC                     //
58 //                                                                   //
59 //  !sectors are numbered from  0                                     //
60 //  !pad rows are numbered from 0                                     //
61 //  
62 //  12.6.   changed z relative 
63 //  Origin:  Marian Ivanov, Uni. of Bratislava, ivanov@fmph.uniba.sk // 
64 //                                                                   //  
65 ///////////////////////////////////////////////////////////////////////
66
67 //
68
69 #include <iostream.h>
70 #include <TMath.h>
71 #include <TObject.h>
72 #include <TRandom.h>
73 #include <AliTPCParam.h>
74
75
76
77
78 ClassImp(AliTPCParam)
79
80
81 //___________________________________________
82 AliTPCParam::AliTPCParam()
83 {   
84   //
85   //constructor sets the default parameters
86   //
87
88   fResponseBin = 0;
89   fResponseWeight = 0;
90   fRotAngle = 0;
91   SetTitle("75x40_100x60");
92   SetDefault();  
93 }
94
95 AliTPCParam::~AliTPCParam()
96 {
97   //
98   //destructor deletes some dynamicaly alocated variables
99   //
100
101   if (fResponseBin!=0)    delete [] fResponseBin;
102   if (fResponseWeight!=0) delete [] fResponseWeight;
103   if (fRotAngle      !=0) delete [] fRotAngle;
104
105 }
106
107
108
109
110 Int_t  AliTPCParam::Transform0to1(Float_t *xyz, Int_t * index)  const
111 {
112   //
113   // calculates sector number (index[1], undefined on input)
114   // xyz intact
115   //
116
117   Float_t angle,x1;
118   Int_t sector;
119   Float_t r = TMath::Sqrt(xyz[0]*xyz[0]+xyz[1]*xyz[1]);
120   if ((xyz[0]==0)&&(xyz[1]==0)) angle = 0.;
121   else
122     {
123       angle =TMath::ASin(xyz[1]/r);
124       if   (xyz[0]<0)   angle=TMath::Pi()-angle;
125       if ( (xyz[0]>0) && (xyz[1]<0) ) angle=2*TMath::Pi()+angle;
126     }
127
128   sector=Int_t((angle-fInnerAngleShift)/fInnerAngle);      
129  
130   Float_t cos,sin;
131   AdjustCosSin(sector,cos,sin);
132   x1=xyz[0]*cos + xyz[1]*sin;
133
134   if (x1>fOuterRadiusLow)
135     {
136       sector=Int_t((angle-fOuterAngleShift)/fOuterAngle)+fNInnerSector;      
137       if (xyz[2]<0)     sector+=(fNOuterSector>>1);            
138     }
139     else   
140       if (xyz[2]<0) sector+=(fNInnerSector>>1);    
141   index[1]=sector; // calculated sector number
142   index[0]=1; // indicates system after transformation
143   return sector;
144 }
145
146 Bool_t  AliTPCParam::Transform(Float_t *xyz, Int_t *index, Int_t* oindex)
147 {
148   //transformation from input coodination system to output coordination system
149   switch (index[0]){
150   case 0:
151     break;
152   };
153
154   return kFALSE;
155
156 }
157
158 Int_t AliTPCParam::GetPadRow(Float_t *xyz, Int_t *index) const 
159 {
160   //
161   //calculates pad row of point xyz - transformation to system 8 (digit system)
162   //
163   Int_t system = index[0];
164   if (0==system) {
165     Transform0to1(xyz,index); 
166     system=1;
167   }
168   if (1==system) {
169     Transform1to2(xyz,index); 
170     system=2;
171   }
172     
173   if (fGeometryType==0){ //straight row    
174     if (2==system) {
175       Transform2to3(xyz,index);       
176       system=3;
177     } 
178     if (3==system) {
179       Transform3to4(xyz,index);
180       system=4; 
181     }
182     if (4==system) {
183       Transform4to8(xyz,index);
184       system=8;     
185     }
186     if (8==system) {
187       index[0]=8;
188       return index[2];
189     } 
190   }
191
192   if (fGeometryType==1){ //cylindrical geometry    
193     if (2==system) {
194       Transform2to5(xyz,index);       
195       system=5;
196     } 
197     if (5==system) {
198       Transform2to3(xyz,index);
199       system=6;
200     }
201     if (6==system) {
202       Transform3to4(xyz,index); 
203       system=7;
204     }
205     if (8==system) {
206       index[0]=8;
207       return index[2];
208     }
209   } 
210   index[0]=system;
211   return -1; //if no reasonable system     
212 }
213
214 void  AliTPCParam::SetSectorAngles(Float_t innerangle, Float_t innershift, Float_t outerangle,
215                         Float_t outershift)
216 {
217   //
218   // set opening angles  
219   const static  Float_t  kDegtoRad = 0.01745329251994;
220   fInnerAngle = innerangle;       //opening angle of Inner sector
221   fInnerAngleShift = innershift;  //shift of first inner sector center to the 0
222   fOuterAngle = outerangle;       //opening angle of outer sector
223   fOuterAngleShift = outershift;  //shift of first sector center to the 0  
224   fInnerAngle *=kDegtoRad;
225   fInnerAngleShift *=kDegtoRad;
226   fOuterAngle *=kDegtoRad;
227   fOuterAngleShift *=kDegtoRad;
228 }
229
230 Float_t  AliTPCParam::GetInnerAngle() const
231 {
232   //return angle 
233   return fInnerAngle;
234
235 }
236
237 Float_t  AliTPCParam::GetInnerAngleShift() const
238 {  
239   //return angle   
240   return fInnerAngleShift;  
241 }
242 Float_t  AliTPCParam::GetOuterAngle() const
243
244   //return angle 
245   return fOuterAngle;
246
247 Float_t  AliTPCParam::GetOuterAngleShift() const
248
249   //return angle 
250
251      return fOuterAngleShift;
252
253
254
255 Int_t AliTPCParam::GetIndex(Int_t sector, Int_t row)
256 {
257   //
258   //give index of the given sector and pad row 
259   //no control if the sectors and rows  are reasonable !!!
260   //
261   if (sector<fNInnerSector) return sector*fNRowLow+row;
262   return (fNInnerSector*fNRowLow)+(sector-fNInnerSector)*fNRowUp+row;  
263 }
264
265 Bool_t   AliTPCParam::AdjustSectorRow(Int_t index, Int_t & sector, Int_t &row) const
266 {
267   //
268   //return sector and padrow for given index
269   //if index is reasonable returns true else return false
270   //
271   if ( (index<0) || (index>fNtRows))  return kFALSE;
272   Int_t outindex = fNInnerSector*fNRowLow;
273   if (index<outindex) {
274     sector = index/fNRowLow;
275     row    = index - sector*fNRowLow;
276     return kTRUE;
277   }
278   index-= outindex;
279   sector = index/fNRowUp;
280   row    = index - sector*fNRowUp;
281   sector += fNInnerSector;
282   return kTRUE;         
283
284
285 void AliTPCParam::SetDefault()
286 {
287   //
288   //set default parameters
289   //
290   const static  Int_t kMaxRows=600; 
291   //
292   //sector default parameters
293   //
294   const static  Float_t kInnerRadiusLow = 87.35;
295   const static  Float_t kOuterRadiusLow = 131.2;
296   const static  Float_t kInnerRadiusUp  = 130.6;
297   const static  Float_t kOuterRadiusUp  = 252.2;
298   const static  Float_t kInnerAngle = 20; // 20 degrees
299   const static  Float_t kInnerAngleShift = 10;
300   const static  Float_t kOuterAngle = 20; //  20 degrees
301   const static  Float_t kOuterAngleShift = 10;
302   const static  Float_t kInnerFrameSpace = 1.5;
303   const static  Float_t kOuterFrameSpace = 1.5;
304   const static  Float_t kInnerWireMount = 1.15;
305   const static  Float_t kOuterWireMount = 1.15;
306   const static  Float_t kZLength =250.;
307   const static  Int_t   kGeometryType = 0; //straight rows 
308   //
309   //wires default parameters
310   //
311   const static Int_t    kNInnerWiresPerPad = 3;
312   const static Int_t    kInnerDummyWire = 2;
313   const static Float_t  kInnerOffWire = 0.5;
314   const static Int_t    kNOuterWiresPerPad = 4;
315   const static Int_t    kOuterDummyWire = 2;
316   const static Float_t  kOuterOffWire = 0.5;
317   //
318   //pad default parameters
319   // 
320   const static Float_t  kInnerPadPitchLength = 0.75;
321   const static Float_t  kInnerPadPitchWidth = 0.40;
322   const static Float_t  kInnerPadLength = 0.75;
323   const static Float_t  kInnerPadWidth = 0.40;
324   const static Float_t  kOuterPadPitchLength = 1.0;
325   const static Float_t  kOuterPadPitchWidth = 0.6;
326   const static Float_t  kOuterPadLength = 1.0;
327   const static Float_t  kOuterPadWidth = 0.6;
328   const static Bool_t   kBMWPCReadout = kTRUE; //MWPC readout - another possibility GEM 
329   const static Int_t    kNCrossRows = 1; //number of rows to cross-talk
330   
331   //
332   //gas default parameters
333   //
334   const static  Float_t  kDiffT = 2.2e-2; 
335   const static  Float_t  kDiffL = 2.2e-2;
336   const static  Float_t  kGasGain = 2.e4;
337   const static  Float_t  kDriftV  =2.83e6;
338   const static  Float_t  kOmegaTau = 0.145;
339   const static  Float_t  kAttCoef = 250.;
340   const static  Float_t  kOxyCont = 5.e-6;
341   //
342   //electronic default parameters
343   //
344   const static  Float_t  kPadCoupling=0.5;
345   const static  Int_t    kZeroSup=2;
346   const static  Float_t  kNoise = 1000;                            
347   const static  Float_t  kChipGain = 12;
348   const static  Float_t  kChipNorm = 0.4;
349   const static  Float_t  kTSample = 2.e-7; 
350   const static  Float_t  kTFWHM   = 1.9e-7;  //fwhm of charge distribution
351   const static  Int_t    kMaxTBin =445;  
352   const static  Int_t    kADCSat  =1024;  
353   const static  Float_t  kADCDynRange =2000.;  
354   //
355   //
356   //
357   const static  Float_t kBField =0.2; 
358   const static  Float_t kNPrimLoss =10.9;
359   const static  Float_t kNTotalLoss =39.9;
360   // 
361   //response constants
362   //
363   const static Int_t     kNResponseMax=100;
364   const static Float_t   kResponseThreshold=0.01;     
365   fbStatus = kFALSE;
366   //
367   //set sector parameters
368   //
369   SetInnerRadiusLow(kInnerRadiusLow);
370   SetOuterRadiusLow(kOuterRadiusLow);
371   SetInnerRadiusUp(kInnerRadiusUp);
372   SetOuterRadiusUp(kOuterRadiusUp);
373   SetInnerFrameSpace(kInnerFrameSpace);
374   SetOuterFrameSpace(kOuterFrameSpace);
375   SetInnerWireMount(kInnerWireMount);
376   SetOuterWireMount(kOuterWireMount);
377   SetSectorAngles(kInnerAngle,kInnerAngleShift,kOuterAngle,kOuterAngleShift);
378   SetZLength(kZLength);
379   SetGeometryType(kGeometryType);
380   //
381   //set wire parameters
382   //
383   SetInnerNWires(kNInnerWiresPerPad);
384   SetInnerDummyWire(kInnerDummyWire);
385   SetInnerOffWire(kInnerOffWire);
386   SetOuterNWires(kNOuterWiresPerPad);
387   SetOuterDummyWire(kOuterDummyWire);
388   SetOuterOffWire(kOuterOffWire);
389   //
390   //set pad parameter
391   //
392   SetInnerPadPitchLength(kInnerPadPitchLength);
393   SetInnerPadPitchWidth(kInnerPadPitchWidth);
394   SetInnerPadLength(kInnerPadLength);
395   SetInnerPadWidth(kInnerPadWidth);
396   SetOuterPadPitchLength(kOuterPadPitchLength);
397   SetOuterPadPitchWidth(kOuterPadPitchWidth);
398   SetOuterPadLength(kOuterPadLength);
399   SetOuterPadWidth(kOuterPadWidth); 
400   SetMWPCReadout(kBMWPCReadout);
401   SetNCrossRows(kNCrossRows);
402   //
403   //set gas paremeters
404   //
405   SetDiffT(kDiffT);
406   SetDiffL(kDiffL);
407   SetGasGain(kGasGain);
408   SetDriftV(kDriftV);
409   SetOmegaTau(kOmegaTau);
410   SetAttCoef(kAttCoef);
411   SetOxyCont(kOxyCont);
412   //
413   //set electronivc parameters  
414   //
415   SetPadCoupling(kPadCoupling);
416   SetZeroSup(kZeroSup);
417   SetNoise(kNoise);
418   SetChipGain(kChipGain);
419   SetChipNorm(kChipNorm);   
420   SetTSample(kTSample);
421   SetTFWHM(kTFWHM);
422   SetMaxTBin(kMaxTBin);
423   SetADCSat(kADCSat);
424   SetADCDynRange(kADCDynRange);
425   //set magnetic field
426   SetBField(kBField);
427   SetNPrimLoss(kNPrimLoss);
428   SetNTotalLoss(kNTotalLoss);
429   //
430   //set response  parameters  
431   //
432   SetNResponseMax(kNResponseMax); 
433   SetResponseThreshold(kResponseThreshold);
434 }
435
436           
437 Bool_t AliTPCParam::Update()
438 {
439   //
440   // update some calculated parameter which must be updated after changing "base"
441   // parameters 
442   // for example we can change size of pads and according this recalculate number
443   // of pad rows, number of of pads in given row ....
444   //
445   const Float_t kQel = 1.602e-19; // elementary charge
446   fbStatus = kFALSE;
447
448   Int_t i,j;  //loop variables because HP 
449   //-----------------Sector section------------------------------------------
450   //calclulate number of sectors
451   fNInnerSector = Int_t(4*TMath::Pi()/fInnerAngle+0.2); 
452        // number of inner sectors - factor 0.2 to don't be influnced by inprecision
453   if (fNInnerSector%2) return kFALSE;
454   fNOuterSector = Int_t(4*TMath::Pi()/fOuterAngle+0.2); 
455   if (fNOuterSector%2) return kFALSE;
456   fNSector  = fNInnerSector+fNOuterSector;
457
458   if (fRotAngle!=0) delete [] fRotAngle;
459   fRotAngle = new Float_t[4*fNSector];
460   //calculate sin and cosine of rotations angle     
461   //sectors angles numbering from 0
462
463   j=fNInnerSector*2;
464   Float_t angle = fInnerAngleShift; 
465   for (i=0; j<fNInnerSector*4; i+=4, j+=4 , angle +=fInnerAngle){
466     fRotAngle[i]=TMath::Cos(angle);
467     fRotAngle[i+1]=TMath::Sin(angle);
468     fRotAngle[j] =  fRotAngle[i];
469     fRotAngle[j+1] =  fRotAngle[i+1];
470     fRotAngle[i+2] =angle;
471     fRotAngle[j+2] =angle;    
472   }
473   angle = fOuterAngleShift; 
474   j=(fNInnerSector+fNOuterSector/2)*4;
475   for (i=fNInnerSector*4; j<fNSector*4; i+=4,j+=4, angle +=fOuterAngle){
476     fRotAngle[i]=TMath::Cos(angle);
477     fRotAngle[i+1]=TMath::Sin(angle);
478     fRotAngle[j] =  fRotAngle[i];
479     fRotAngle[j+1] =  fRotAngle[i+1];
480     fRotAngle[i+2] =angle;
481     fRotAngle[j+2] =angle;    
482   }
483   fZWidth = fTSample*fDriftV;  
484   fTotalNormFac = fPadCoupling*fChipNorm*kQel*1.e15*fChipGain*fADCSat/fADCDynRange;
485   fNoiseNormFac = kQel*1.e15*fChipGain*fADCSat/fADCDynRange;
486   //wire section 
487   Int_t nwire;
488   Float_t wspace; //available space for wire
489   Float_t dummyspace; //dummyspace for wire
490
491   fInnerWWPitch = Float_t((Double_t)fInnerPadPitchLength/(Double_t)fNInnerWiresPerPad);  
492   wspace =fInnerRadiusUp-fInnerRadiusLow-2*fInnerOffWire;
493   nwire = Int_t(wspace/fInnerWWPitch);
494   wspace = Float_t(nwire)*fInnerWWPitch;
495   dummyspace =(fInnerRadiusUp-fInnerRadiusLow-wspace)/2.; 
496   fRInnerFirstWire = fInnerRadiusLow+dummyspace;
497   fRInnerLastWire = fRInnerFirstWire+fInnerWWPitch*(Float_t)(nwire);
498
499   fOuterWWPitch = Float_t((Double_t)fOuterPadPitchLength/(Double_t)fNOuterWiresPerPad);  
500   wspace =fOuterRadiusUp-fOuterRadiusLow-2*fOuterOffWire;
501   nwire = Int_t(wspace/fOuterWWPitch);
502   wspace = Float_t(nwire)*fOuterWWPitch;
503   dummyspace =(fOuterRadiusUp-fOuterRadiusLow-wspace)/2.; 
504   fROuterFirstWire = fOuterRadiusLow+dummyspace;
505   fROuterLastWire = fROuterFirstWire+fOuterWWPitch*(Float_t)(nwire);
506
507   
508   //
509   //response data
510   //
511   if (fResponseBin==0) delete [] fResponseBin;
512   if (fResponseWeight==0) delete [] fResponseBin;
513   fResponseBin    = new Int_t[3*fNResponseMax];
514   fResponseWeight = new Float_t[fNResponseMax];
515   
516   fbStatus = kTRUE;
517   return kTRUE;
518 }
519
520
521
522 Bool_t AliTPCParam::GetStatus()
523 {
524   //get information about object consistency
525   return fbStatus;
526 }
527
528 Int_t AliTPCParam::GetNRowLow() const
529 {
530   //get the number of pad rows in low sector
531   return fNRowLow;
532 }
533 Int_t AliTPCParam::GetNRowUp() const
534 {
535   //get the number of pad rows in up sector
536   return fNRowUp;
537 }
538 Float_t AliTPCParam::GetPadRowRadiiLow(Int_t irow) const
539 {
540   //get the pad row (irow) radii
541   if ( !(irow<0) && (irow<fNRowLow) ) 
542     return  fPadRowLow[irow];
543   else
544     return 0;
545 }
546
547 Float_t AliTPCParam::GetPadRowRadiiUp(Int_t irow) const
548 {
549   //get the pad row (irow) radii
550  if ( !(irow<0) && (irow<fNRowUp) ) 
551     return  fPadRowUp[irow];
552   else
553     return 0;
554 }
555
556 Int_t AliTPCParam::GetNPadsLow(Int_t irow) const
557 {
558   //get the number of pads in row irow
559   if ( !(irow<0) && (irow<fNRowLow) ) 
560     return  fNPadsLow[irow];
561   else
562     return 0;
563 }
564
565
566 Int_t AliTPCParam::GetNPadsUp(Int_t irow) const
567 {
568   //get the number of pads in row irow
569   if ( !(irow<0) && (irow<fNRowUp) ) 
570     return  fNPadsUp[irow];
571   else
572     return 0;
573 }
574
575
576 void AliTPCParam::Streamer(TBuffer &R__b)
577 {
578    // Stream an object of class AliTPC.
579
580    if (R__b.IsReading()) {
581       Version_t R__v = R__b.ReadVersion(); if (R__v) { }
582       AliDetectorParam::Streamer(R__b);
583       if (R__v < 2) return;
584       //---------------------------------------------------------------------
585       //   ALICE TPC sector geometry
586       //--------------------------------------------------------------------  
587       R__b >> fInnerRadiusLow;   // lower radius of inner sector-IP
588       R__b >> fInnerRadiusUp;    // upper radius of inner  sector-IP
589       R__b >> fOuterRadiusUp;    // upper radius of outer  sector-IP
590       R__b >> fOuterRadiusLow;   // lower radius of outer sector-IP
591       R__b >> fInnerAngle;       //opening angle of Inner sector
592       R__b >> fInnerAngleShift;  //shift of first inner sector center to the 0
593       R__b >> fOuterAngle;       //opening angle of outer sector
594       R__b >> fOuterAngleShift;  //shift of first sector center to the 0  
595       R__b >> fInnerFrameSpace;  //spce for inner frame in the phi direction 
596       R__b >> fOuterFrameSpace;  //spce for outer frame in the phi direction 
597       R__b >> fInnerWireMount;
598       R__b >> fOuterWireMount;
599       //R__b >> fNInnerSector;      //!number of inner sectors - calculated
600       //R__b >> fNOuterSector;      //!number of outer sectors -calculated
601       //R__b >> fNSector;           //! total number of sectors -calculated
602       R__b >> fZLength;           //length of the drift region of the TPC
603       //R__b.ReadFastArray(fRotAngle,fNSector*4);      //  sin and cos of rotation angles for 
604       R__b >> fGeometryType;      //type of geometry -0 straight rows
605                                  //  diferent sectors
606       //---------------------------------------------------------------------
607       //   ALICE TPC wires  geometry
608       //--------------------------------------------------------------------
609       R__b >> fNInnerWiresPerPad;//  Number of wires per pad
610       //R__b >> fInnerWWPitch;     // pitch between wires  in inner sector - calculated
611       R__b >> fInnerDummyWire;   //number of wires without pad readout
612       R__b >> fInnerOffWire;//oofset of first wire to the begining of the sector
613       //R__b >> fRInnerFirstWire;  //position of the first wire  -calculated
614       //R__b >> fRInnerLastWire;   //position of the last wire    -calculated
615       R__b >> fNOuterWiresPerPad;//  Number of wires per pad
616       //R__b >> fOuterWWPitch;     // pitch between wires in outer sector   - calculated
617       R__b >> fOuterDummyWire;   //number of wires without pad readout
618       R__b >> fOuterOffWire;//oofset of first wire to the begining of the sector
619       //R__b >> fROuterFirstWire;  //position of the first wire  -calulated
620       //R__b >> fROuterLastWire;   //position of the last wire    -calculated            
621       //---------------------------------------------------------------------
622       //   ALICE TPC pad parameters
623       //--------------------------------------------------------------------
624       R__b >> fInnerPadPitchLength;    //Inner pad pitch length
625       R__b >> fInnerPadPitchWidth;     //Inner pad pitch width
626       R__b >> fInnerPadLength;         //Inner pad  length
627       R__b >> fInnerPadWidth;          //Inner pad  width
628       R__b >> fOuterPadPitchLength;    //Outer pad pitch length
629       R__b >> fOuterPadPitchWidth;     //Outer pad pitch width
630       R__b >> fOuterPadLength;         //Outer pad  length
631       R__b >> fOuterPadWidth;          //Outer pad  width
632       R__b >> fBMWPCReadout;           //indicate wire readout 
633       R__b >> fNCrossRows;             //number of pad rows to crostalk
634       R__b >> fNRowLow;           //  number of pad rows per low sector 
635       R__b >> fNRowUp;            //  number of pad rows per sector up 
636       //R__b >> fPadRowLow[600]; // Lower sector, pad row radii
637       //R__b >> fPadRowUp[600];  // Upper sector, pad row radii
638       //R__b >> fNPadsLow[600];     // Lower sector, number of pads per row
639       //R__b >> fNPadsUp[600];      //  Upper sector, number of pads per row
640       //---------------------------------------------------------------------
641       //   ALICE TPC Gas Parameters
642       //--------------------------------------------------------------------
643       R__b >> fDiffT;          //tangencial diffusion constant
644       R__b >> fDiffL;          //longutudinal diffusion constant
645       R__b >> fGasGain;        //gas gain constant
646       R__b >> fDriftV;          //drift velocity constant
647       R__b >> fOmegaTau;       //omega tau ExB coeficient
648       R__b >> fAttCoef;        //attachment coefitients
649       R__b >> fOxyCont;        //oxygen content
650       //---------------------------------------------------------------------
651       //   ALICE TPC  Electronics Parameters
652       //--------------------------------------------------------------------
653       R__b >> fPadCoupling;     //coupling factor ration of  anode signal 
654       //and total pads signal  
655       R__b >> fZeroSup;         //zero suppresion constant
656       R__b >> fNoise;         //noise sigma constant
657       R__b >> fChipGain;      //preamp shaper constant
658       R__b >> fChipNorm;      //preamp shaper normalisation       
659       R__b >> fTSample; // sampling time
660       R__b >> fZWidth;  //derived value calculated using TSample and driftw 
661       R__b >> fTSigma;  // width of the Preamp/Shaper function
662       R__b >> fMaxTBin; //maximum time bin number   
663       R__b >> fADCSat;  //saturation value of ADC (10 bits)
664       R__b >> fADCDynRange; // input dynamic range (mV)
665       //--------------------------------------------------------        
666    } else {
667       R__b.WriteVersion(AliTPCParam::IsA());
668       AliDetectorParam::Streamer(R__b);      
669      //---------------------------------------------------------------------
670       //   ALICE TPC sector geometry
671       //--------------------------------------------------------------------  
672       R__b << fInnerRadiusLow;   // lower radius of inner sector-IP
673       R__b << fInnerRadiusUp;    // upper radius of inner  sector-IP
674       R__b << fOuterRadiusUp;    // upper radius of outer  sector-IP
675       R__b << fOuterRadiusLow;   // lower radius of outer sector-IP
676       R__b << fInnerAngle;       //opening angle of Inner sector
677       R__b << fInnerAngleShift;  //shift of first inner sector center to the 0
678       R__b << fOuterAngle;       //opening angle of outer sector
679       R__b << fOuterAngleShift;  //shift of first sector center to the 0  
680       R__b << fInnerFrameSpace;  //spce for inner frame in the phi direction 
681       R__b << fOuterFrameSpace;  //spce for outer frame in the phi direction 
682       R__b << fInnerWireMount;
683       R__b << fOuterWireMount;
684       //R__b << fNInnerSector;      //!number of inner sectors - calculated
685       //R__b << fNOuterSector;      //!number of outer sectors -calculated
686       //R__b << fNSector;           //! total number of sectors -calculated
687       R__b << fZLength;           //length of the drift region of the TPC
688       //R__b.WriteFastArray(fRotAngle,fNSector*4);      //  sin and cos of rotation angles for 
689       R__b << fGeometryType;      //type of geometry -0 straight rows
690       
691                                  //  diferent sectors
692       //---------------------------------------------------------------------
693       //   ALICE TPC wires  geometry
694       //--------------------------------------------------------------------
695       R__b << fNInnerWiresPerPad;//  Number of wires per pad
696       // R__b << fInnerWWPitch;     // pitch between wires  in inner sector - calculated
697       R__b << fInnerDummyWire;   //number of wires without pad readout
698       R__b << fInnerOffWire;//oofset of first wire to the begining of the sector
699       //R__b << fRInnerFirstWire;  //position of the first wire  -calculated
700       //R__b << fRInnerLastWire;   //position of the last wire    -calculated
701       R__b << fNOuterWiresPerPad;//  Number of wires per pad
702       //R__b << fOuterWWPitch;     // pitch between wires in outer sector   - calculated
703       R__b << fOuterDummyWire;   //number of wires without pad readout
704       R__b << fOuterOffWire;//oofset of first wire to the begining of the sector
705       //R__b << fROuterFirstWire;  //position of the first wire  -calulated
706       //R__b << fROuterLastWire;   //position of the last wire    -calculated            
707       //---------------------------------------------------------------------
708       //   ALICE TPC pad parameters
709       //--------------------------------------------------------------------
710       R__b << fInnerPadPitchLength;    //Inner pad pitch length
711       R__b << fInnerPadPitchWidth;     //Inner pad pitch width
712       R__b << fInnerPadLength;         //Inner pad  length
713       R__b << fInnerPadWidth;          //Inner pad  width
714       R__b << fOuterPadPitchLength;    //Outer pad pitch length
715       R__b << fOuterPadPitchWidth;     //Outer pad pitch width
716       R__b << fOuterPadLength;         //Outer pad  length
717       R__b << fOuterPadWidth;          //Outer pad  width
718       R__b << fBMWPCReadout;           //indicate wire readout 
719       R__b << fNCrossRows;             // number of rows to cross talk
720       R__b << fNRowLow;           //  number of pad rows per low sector 
721       R__b << fNRowUp;            //  number of pad rows per sector up 
722       // R__b << fPadRowLow[600]; // Lower sector, pad row radii
723       //R__b << fPadRowUp[600];  // Upper sector, pad row radii
724       //R__b << fNPadsLow[600];     // Lower sector, number of pads per row
725       //R__b << fNPadsUp[600];      //  Upper sector, number of pads per row
726       //---------------------------------------------------------------------
727       //   ALICE TPC Gas Parameters
728       //--------------------------------------------------------------------
729       R__b << fDiffT;          //tangencial diffusion constant
730       R__b << fDiffL;          //longutudinal diffusion constant
731       R__b << fGasGain;        //gas gain constant
732       R__b << fDriftV;          //drift velocity constant
733       R__b << fOmegaTau;       //omega tau ExB coeficient
734       R__b << fAttCoef;        //attachment coefitients
735       R__b << fOxyCont;        //oxygen content
736       //---------------------------------------------------------------------
737       //   ALICE TPC  Electronics Parameters
738       //--------------------------------------------------------------------
739       R__b << fPadCoupling;     //coupling factor ration of  anode signal 
740       //and total pads signal  
741       R__b << fZeroSup;         //zero suppresion constant
742       R__b << fNoise;         //noise sigma constant
743       R__b << fChipGain;      //preamp shaper constant
744       R__b << fChipNorm;      //preamp shaper normalisation     
745       R__b << fTSample; // sampling time
746       R__b << fZWidth;  //derived value calculated using TSample and driftw 
747       R__b << fTSigma;  // width of the Preamp/Shaper function
748       R__b << fMaxTBin; //maximum time bin number   
749       R__b << fADCSat;  //saturation value of ADC (10 bits)
750       R__b << fADCDynRange; // input dynamic range (mV)       
751    }
752 }
753