]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - TPC/AliTPCParam.cxx
Just something left from v2...now clean
[u/mrichter/AliRoot.git] / TPC / AliTPCParam.cxx
index e2fe36669b767f5e2b5ff95d224f86eba422478b..5f7b55442f53635fc143d795ac63fdb5f2aa4118 100644 (file)
  * provided "as is" without express or implied warranty.                  *
  **************************************************************************/
 
-/*
-$Log$
-Revision 1.8.4.4  2000/06/26 07:39:42  kowal2
-Changes to obey the coding rules
-
-Revision 1.8.4.3  2000/06/25 08:38:41  kowal2
-Splitted from AliTPCtracking
-  
-Revision 1.8.4.2  2000/06/14 16:48:24  kowal2
-Parameter setting improved. Removed compiler warnings
-
-Revision 1.8.4.1  2000/06/09 07:12:21  kowal2  
-
-Updated defaults
-
-Revision 1.8  2000/04/17 09:37:33  kowal2
-removed obsolete AliTPCDigitsDisplay.C
-
-Revision 1.7.8.2  2000/04/10 08:44:51  kowal2
-
-New transformations added
-Different pad and pad-rows geometries for different sectors
-
-Revision 1.7.8.1  2000/04/10 07:56:53  kowal2
-Not used anymore - removed
-
-Revision 1.7  1999/10/08 13:10:35  fca
-Values in SetDefault are in radiants
-
-Revision 1.6  1999/10/08 06:27:59  fca
-Defaults updated
-
-Revision 1.5  1999/10/05 17:18:27  fca
-Correct GetWire check on even/odd fnWires
-
-Revision 1.4  1999/09/29 09:24:34  fca
-Introduction of the Copyright and cvs Log
-
-*/
+/* $Id$ */
 
 ///////////////////////////////////////////////////////////////////////
 //  Manager and of geomety  classes for set: TPC                     //
@@ -66,29 +28,108 @@ Introduction of the Copyright and cvs Log
 
 //
 
-#include <iostream.h>
-#include <TMath.h>
-#include <TObject.h>
-#include <TRandom.h>
 #include <AliTPCParam.h>
 
-
-
+#include <TGeoManager.h>
+#include <TGeoPhysicalNode.h>
+#include "AliAlignObj.h"
+#include "AliAlignObjParams.h"
+#include "AliLog.h"
 
 ClassImp(AliTPCParam)
 
 
 //___________________________________________
 AliTPCParam::AliTPCParam()
+            :AliDetectorParam(),
+            fbStatus(kFALSE),
+             fInnerRadiusLow(0.),
+             fInnerRadiusUp(0.),
+             fOuterRadiusUp(0.),
+             fOuterRadiusLow(0.),
+            fInnerAngle(0.),
+            fInnerAngleShift(0.),
+            fOuterAngle(0.),
+            fOuterAngleShift(0.),
+            fInnerFrameSpace(0.),
+            fOuterFrameSpace(0.),
+            fInnerWireMount(0.),
+            fOuterWireMount(0.),
+            fNInnerSector(0),
+            fNOuterSector(0),
+            fNSector(0),
+            fZLength(0),
+            fRotAngle(),
+            fGeometryType(0),
+            fTrackingMatrix(0),
+            fClusterMatrix(0), 
+            fGlobalMatrix(0),
+            fNInnerWiresPerPad(0),
+            fInnerWWPitch(0),
+            fInnerDummyWire(0),
+            fInnerOffWire(0.),
+            fRInnerFirstWire(0.),
+            fRInnerLastWire(0.),
+            fLastWireUp1(0.),
+            fNOuter1WiresPerPad(0),
+            fNOuter2WiresPerPad(0),
+            fOuterWWPitch(0.),
+            fOuterDummyWire(0),
+            fOuterOffWire(0.),
+            fROuterFirstWire(0.),
+            fROuterLastWire(0.),
+            fInnerPadPitchLength(0.),
+            fInnerPadPitchWidth(0.),
+            fInnerPadLength(0.),
+            fInnerPadWidth(0.),
+            fOuter1PadPitchLength(0.),
+            fOuter2PadPitchLength(0.),
+            fOuterPadPitchWidth(0.),
+            fOuter1PadLength(0.),
+            fOuter2PadLength(0.),
+            fOuterPadWidth(0.),
+            fBMWPCReadout(kFALSE),
+            fNCrossRows(0),
+            fNRowLow(0),
+            fNRowUp1(0),
+            fNRowUp2(0),
+            fNRowUp(0),
+            fNtRows(0),
+            fDiffT(0.),
+            fDiffL(0.),
+            fGasGain(0.),
+            fDriftV(0.),
+            fOmegaTau(0.),
+            fAttCoef(0.),
+            fOxyCont(0.),
+            fPadCoupling(0.),
+            fZeroSup(0),
+            fNoise(0.),
+            fChipGain(0.),
+            fChipNorm(0.),
+            fTSample(0.),
+            fZWidth(0.),
+            fTSigma(0.),
+            fMaxTBin(0),
+            fADCSat(0),
+            fADCDynRange(0.),
+            fTotalNormFac(0.),
+            fNoiseNormFac(0.),
+            fNResponseMax(0),
+            fResponseThreshold(0.),
+            fCurrentMax(0),
+            fResponseBin(0),
+            fResponseWeight(0),
+            fGateDelay(0.),
+            fL1Delay(0.),
+            fNTBinsBeforeL1(0),
+            fNTBinsL1(0.)   
 {   
   //
   //constructor sets the default parameters
   //
 
-  fResponseBin = 0;
-  fResponseWeight = 0;
-  fRotAngle = 0;
-  SetTitle("75x40_100x60");
+  SetTitle("75x40_100x60_150x60");
   SetDefault();  
 }
 
@@ -102,6 +143,24 @@ AliTPCParam::~AliTPCParam()
   if (fResponseWeight!=0) delete [] fResponseWeight;
   if (fRotAngle      !=0) delete [] fRotAngle;
 
+  if (fTrackingMatrix) {
+    for(Int_t i = 0; i < fNSector; i++)
+      delete fTrackingMatrix[i];
+    delete [] fTrackingMatrix;
+  }
+
+  if (fClusterMatrix) {
+    for(Int_t i = 0; i < fNSector; i++)
+      delete fClusterMatrix[i];
+    delete [] fClusterMatrix;
+  }
+
+  if (fGlobalMatrix) {
+    for(Int_t i = 0; i < fNSector; i++)
+      delete fGlobalMatrix[i];
+    delete [] fGlobalMatrix;
+  }
+
 }
 
 
@@ -125,7 +184,7 @@ Int_t  AliTPCParam::Transform0to1(Float_t *xyz, Int_t * index)  const
       if ( (xyz[0]>0) && (xyz[1]<0) ) angle=2*TMath::Pi()+angle;
     }
 
-  sector=Int_t((angle-fInnerAngleShift)/fInnerAngle);      
+  sector=Int_t(TMath::Nint((angle-fInnerAngleShift)/fInnerAngle));      
  
   Float_t cos,sin;
   AdjustCosSin(sector,cos,sin);
@@ -133,17 +192,18 @@ Int_t  AliTPCParam::Transform0to1(Float_t *xyz, Int_t * index)  const
 
   if (x1>fOuterRadiusLow)
     {
-      sector=Int_t((angle-fOuterAngleShift)/fOuterAngle)+fNInnerSector;      
+      sector=Int_t(TMath::Nint((angle-fOuterAngleShift)/fOuterAngle))+fNInnerSector;      
       if (xyz[2]<0)    sector+=(fNOuterSector>>1);            
     }
     else   
-      if (xyz[2]<0) sector+=(fNInnerSector>>1);    
+      if (xyz[2]<0) sector+=(fNInnerSector>>1);  
+  if (sector<0 || sector>=fNSector) AliError(Form("Wrong sector %d",sector));
   index[1]=sector; // calculated sector number
   index[0]=1; // indicates system after transformation
   return sector;
 }
 
-Bool_t  AliTPCParam::Transform(Float_t *xyz, Int_t *index, Int_t* oindex)
+Bool_t  AliTPCParam::Transform(Float_t */*xyz*/, Int_t *index, Int_t* /*oindex*/)
 {
   //transformation from input coodination system to output coordination system
   switch (index[0]){
@@ -216,7 +276,7 @@ void  AliTPCParam::SetSectorAngles(Float_t innerangle, Float_t innershift, Float
 {
   //
   // set opening angles  
-  const static  Float_t  kDegtoRad = 0.01745329251994;
+  static const  Float_t  kDegtoRad = 0.01745329251994;
   fInnerAngle = innerangle;       //opening angle of Inner sector
   fInnerAngleShift = innershift;  //shift of first inner sector center to the 0
   fOuterAngle = outerangle;       //opening angle of outer sector
@@ -252,7 +312,7 @@ Float_t  AliTPCParam::GetOuterAngleShift() const
 } 
 
 
-Int_t AliTPCParam::GetIndex(Int_t sector, Int_t row)
+Int_t AliTPCParam::GetIndex(Int_t sector, Int_t row) const
 {
   //
   //give index of the given sector and pad row 
@@ -287,81 +347,96 @@ void AliTPCParam::SetDefault()
   //
   //set default parameters
   //
-  const static  Int_t kMaxRows=600; 
+  //const static  Int_t kMaxRows=600; 
   //
   //sector default parameters
   //
-  const static  Float_t kInnerRadiusLow = 87.35;
-  const static  Float_t kOuterRadiusLow = 131.2;
-  const static  Float_t kInnerRadiusUp  = 130.6;
-  const static  Float_t kOuterRadiusUp  = 252.2;
-  const static  Float_t kInnerAngle = 20; // 20 degrees
-  const static  Float_t kInnerAngleShift = 10;
-  const static  Float_t kOuterAngle = 20; //  20 degrees
-  const static  Float_t kOuterAngleShift = 10;
-  const static  Float_t kInnerFrameSpace = 1.5;
-  const static  Float_t kOuterFrameSpace = 1.5;
-  const static  Float_t kInnerWireMount = 1.15;
-  const static  Float_t kOuterWireMount = 1.15;
-  const static  Float_t kZLength =250.;
-  const static  Int_t   kGeometryType = 0; //straight rows 
+  static const  Float_t kInnerRadiusLow = 83.65;
+  static const  Float_t kInnerRadiusUp  = 133.3;
+  static const  Float_t kOuterRadiusLow = 133.5;
+  static const  Float_t kOuterRadiusUp  = 247.7;
+  static const  Float_t kInnerAngle = 20; // 20 degrees
+  static const  Float_t kInnerAngleShift = 10;
+  static const  Float_t kOuterAngle = 20; //  20 degrees
+  static const  Float_t kOuterAngleShift = 10;
+  static const  Float_t kInnerFrameSpace = 1.5;
+  static const  Float_t kOuterFrameSpace = 1.5;
+  static const  Float_t kInnerWireMount = 1.2;
+  static const  Float_t kOuterWireMount = 1.4;
+  static const  Float_t kZLength =250.;
+  static const  Int_t   kGeometryType = 0; //straight rows 
+  static const Int_t kNRowLow = 63;
+  static const Int_t kNRowUp1 = 64;
+  static const Int_t kNRowUp2 = 32;
+  static const Int_t  kNRowUp = 96;
   //
   //wires default parameters
   //
-  const static Int_t    kNInnerWiresPerPad = 3;
-  const static Int_t    kInnerDummyWire = 2;
-  const static Float_t  kInnerOffWire = 0.5;
-  const static Int_t    kNOuterWiresPerPad = 4;
-  const static Int_t    kOuterDummyWire = 2;
-  const static Float_t  kOuterOffWire = 0.5;
+  static const Int_t    kNInnerWiresPerPad = 3;
+  static const Int_t    kInnerDummyWire = 2;
+  static const Float_t  kInnerWWPitch = 0.25;
+  static const Float_t  kRInnerFirstWire = 84.475;
+  static const Float_t  kRInnerLastWire = 132.475;
+  static const Float_t  kInnerOffWire = 0.5;
+  static const Int_t    kNOuter1WiresPerPad = 4;
+  static const Int_t    kNOuter2WiresPerPad = 6;
+  static const Float_t  kOuterWWPitch = 0.25;  
+  static const Float_t  kROuterFirstWire = 134.225;
+  static const Float_t  kROuterLastWire = 246.975;
+  static const Int_t    kOuterDummyWire = 2;
+  static const Float_t  kOuterOffWire = 0.5;
   //
   //pad default parameters
   // 
-  const static Float_t  kInnerPadPitchLength = 0.75;
-  const static Float_t  kInnerPadPitchWidth = 0.40;
-  const static Float_t  kInnerPadLength = 0.75;
-  const static Float_t  kInnerPadWidth = 0.40;
-  const static Float_t  kOuterPadPitchLength = 1.0;
-  const static Float_t  kOuterPadPitchWidth = 0.6;
-  const static Float_t  kOuterPadLength = 1.0;
-  const static Float_t  kOuterPadWidth = 0.6;
-  const static Bool_t   kBMWPCReadout = kTRUE; //MWPC readout - another possibility GEM 
-  const static Int_t    kNCrossRows = 1; //number of rows to cross-talk
+  static const Float_t  kInnerPadPitchLength = 0.75;
+  static const Float_t  kInnerPadPitchWidth = 0.40;
+  static const Float_t  kInnerPadLength = 0.75;
+  static const Float_t  kInnerPadWidth = 0.40;
+  static const Float_t  kOuter1PadPitchLength = 1.0;
+  static const Float_t  kOuterPadPitchWidth = 0.6;
+  static const Float_t  kOuter1PadLength = 1.0;
+  static const Float_t  kOuterPadWidth = 0.6;
+  static const Float_t  kOuter2PadPitchLength = 1.5;
+  static const Float_t  kOuter2PadLength = 1.5;
+
+  static const Bool_t   kBMWPCReadout = kTRUE; //MWPC readout - another possibility GEM 
+  static const Int_t    kNCrossRows = 1; //number of rows to cross-talk
   
   //
   //gas default parameters
   //
-  const static  Float_t  kDiffT = 2.2e-2; 
-  const static  Float_t  kDiffL = 2.2e-2;
-  const static  Float_t  kGasGain = 2.e4;
-  const static  Float_t  kDriftV  =2.83e6;
-  const static  Float_t  kOmegaTau = 0.145;
-  const static  Float_t  kAttCoef = 250.;
-  const static  Float_t  kOxyCont = 5.e-6;
+  static const  Float_t  kDiffT = 2.2e-2; 
+  static const  Float_t  kDiffL = 2.2e-2;
+  static const  Float_t  kGasGain = 2.e4;
+  static const  Float_t  kDriftV  =2.83e6;
+  static const  Float_t  kOmegaTau = 0.145;
+  static const  Float_t  kAttCoef = 250.;
+  static const  Float_t  kOxyCont = 5.e-6;
   //
   //electronic default parameters
   //
-  const static  Float_t  kPadCoupling=0.5;
-  const static  Int_t    kZeroSup=2;
-  const static  Float_t  kNoise = 1000;                            
-  const static  Float_t  kChipGain = 12;
-  const static  Float_t  kChipNorm = 0.4;
-  const static  Float_t  kTSample = 2.e-7; 
-  const static  Float_t  kTFWHM   = 1.9e-7;  //fwhm of charge distribution
-  const static  Int_t    kMaxTBin =445;  
-  const static  Int_t    kADCSat  =1024;  
-  const static  Float_t  kADCDynRange =2000.;  
-  //
-  //
-  //
-  const static  Float_t kBField =0.2; 
-  const static  Float_t kNPrimLoss =10.9;
-  const static  Float_t kNTotalLoss =39.9;
+  static const  Float_t  kPadCoupling=0.5;
+  static const  Int_t    kZeroSup=2;
+  static const  Float_t  kNoise = 1000;                            
+  static const  Float_t  kChipGain = 12;
+  static const  Float_t  kChipNorm = 0.4;
+  static const  Float_t  kTSample = 2.e-7; 
+  static const  Float_t  kTFWHM   = 1.9e-7;  //fwhm of charge distribution
+  static const  Int_t    kMaxTBin =445;  
+  static const  Int_t    kADCSat  =1024;  
+  static const  Float_t  kADCDynRange =2000.;  
   // 
   //response constants
   //
-  const static Int_t     kNResponseMax=100;
-  const static Float_t   kResponseThreshold=0.01;     
+  static const Int_t     kNResponseMax=100;
+  static const Float_t   kResponseThreshold=0.01;     
+  //L1 constants
+  //  static const Float_t   kGateDelay=6.1e-6; //In s
+  static const Float_t   kGateDelay=0.; //For the moment no gating
+  //  static const Float_t   kL1Delay=6.5e-6; //In s
+  static const Float_t   kL1Delay=0.; //For the moment no delay
+  //  static const UShort_t  kNTBinsBeforeL1=14;
+  static const UShort_t  kNTBinsBeforeL1=0; //For the moment no shift
   fbStatus = kFALSE;
   //
   //set sector parameters
@@ -377,15 +452,26 @@ void AliTPCParam::SetDefault()
   SetSectorAngles(kInnerAngle,kInnerAngleShift,kOuterAngle,kOuterAngleShift);
   SetZLength(kZLength);
   SetGeometryType(kGeometryType);
+  SetRowNLow(kNRowLow);
+  SetRowNUp1 (kNRowUp1);
+  SetRowNUp2(kNRowUp2);
+  SetRowNUp(kNRowUp);
   //
   //set wire parameters
   //
   SetInnerNWires(kNInnerWiresPerPad);
   SetInnerDummyWire(kInnerDummyWire);
   SetInnerOffWire(kInnerOffWire);
-  SetOuterNWires(kNOuterWiresPerPad);
+  SetOuter1NWires(kNOuter1WiresPerPad);
+  SetOuter2NWire(kNOuter2WiresPerPad);
   SetOuterDummyWire(kOuterDummyWire);
   SetOuterOffWire(kOuterOffWire);
+  SetInnerWWPitch(kInnerWWPitch);
+  SetRInnerFirstWire(kRInnerFirstWire);
+  SetRInnerLastWire(kRInnerLastWire);
+  SetOuterWWPitch(kOuterWWPitch);
+  SetROuterFirstWire(kROuterFirstWire);
+  SetROuterLastWire(kROuterLastWire);  
   //
   //set pad parameter
   //
@@ -393,9 +479,11 @@ void AliTPCParam::SetDefault()
   SetInnerPadPitchWidth(kInnerPadPitchWidth);
   SetInnerPadLength(kInnerPadLength);
   SetInnerPadWidth(kInnerPadWidth);
-  SetOuterPadPitchLength(kOuterPadPitchLength);
+  SetOuter1PadPitchLength(kOuter1PadPitchLength); 
+  SetOuter2PadPitchLength(kOuter2PadPitchLength);
   SetOuterPadPitchWidth(kOuterPadPitchWidth);
-  SetOuterPadLength(kOuterPadLength);
+  SetOuter1PadLength(kOuter1PadLength);
+  SetOuter2PadLength(kOuter2PadLength);
   SetOuterPadWidth(kOuterPadWidth); 
   SetMWPCReadout(kBMWPCReadout);
   SetNCrossRows(kNCrossRows);
@@ -422,15 +510,19 @@ void AliTPCParam::SetDefault()
   SetMaxTBin(kMaxTBin);
   SetADCSat(kADCSat);
   SetADCDynRange(kADCDynRange);
-  //set magnetic field
-  SetBField(kBField);
-  SetNPrimLoss(kNPrimLoss);
-  SetNTotalLoss(kNTotalLoss);
+//   //set magnetic field
+//   SetBField(kBField);
+//   SetNPrimLoss(kNPrimLoss);
+//   SetNTotalLoss(kNTotalLoss);
   //
   //set response  parameters  
   //
   SetNResponseMax(kNResponseMax); 
-  SetResponseThreshold(kResponseThreshold);
+  SetResponseThreshold(static_cast<int>(kResponseThreshold));
+  //L1 data
+  SetGateDelay(kGateDelay);
+  SetL1Delay(kL1Delay);
+  SetNTBinsBeforeL1(kNTBinsBeforeL1);
 }
 
           
@@ -480,46 +572,141 @@ Bool_t AliTPCParam::Update()
     fRotAngle[i+2] =angle;
     fRotAngle[j+2] =angle;    
   }
+
   fZWidth = fTSample*fDriftV;  
   fTotalNormFac = fPadCoupling*fChipNorm*kQel*1.e15*fChipGain*fADCSat/fADCDynRange;
   fNoiseNormFac = kQel*1.e15*fChipGain*fADCSat/fADCDynRange;
   //wire section 
-  Int_t nwire;
+  /*  Int_t nwire;
   Float_t wspace; //available space for wire
   Float_t dummyspace; //dummyspace for wire
-
-  fInnerWWPitch = Float_t((Double_t)fInnerPadPitchLength/(Double_t)fNInnerWiresPerPad);  
   wspace =fInnerRadiusUp-fInnerRadiusLow-2*fInnerOffWire;
   nwire = Int_t(wspace/fInnerWWPitch);
   wspace = Float_t(nwire)*fInnerWWPitch;
-  dummyspace =(fInnerRadiusUp-fInnerRadiusLow-wspace)/2.; 
-  fRInnerFirstWire = fInnerRadiusLow+dummyspace;
-  fRInnerLastWire = fRInnerFirstWire+fInnerWWPitch*(Float_t)(nwire);
-
-  fOuterWWPitch = Float_t((Double_t)fOuterPadPitchLength/(Double_t)fNOuterWiresPerPad);  
+  dummyspace =(fInnerRadiusUp-fInnerRadiusLow-wspace)/2.;  
   wspace =fOuterRadiusUp-fOuterRadiusLow-2*fOuterOffWire;
   nwire = Int_t(wspace/fOuterWWPitch);
   wspace = Float_t(nwire)*fOuterWWPitch;
   dummyspace =(fOuterRadiusUp-fOuterRadiusLow-wspace)/2.; 
   fROuterFirstWire = fOuterRadiusLow+dummyspace;
   fROuterLastWire = fROuterFirstWire+fOuterWWPitch*(Float_t)(nwire);
-
+  */
   
   //
   //response data
   //
-  if (fResponseBin==0) delete [] fResponseBin;
-  if (fResponseWeight==0) delete [] fResponseBin;
+  if (fResponseBin) delete [] fResponseBin;
+  if (fResponseWeight) delete [] fResponseWeight;
   fResponseBin    = new Int_t[3*fNResponseMax];
   fResponseWeight = new Float_t[fNResponseMax];
-  
+
+  //L1 data
+  fNTBinsL1 = fL1Delay/fTSample - (Float_t)fNTBinsBeforeL1;
   fbStatus = kTRUE;
   return kTRUE;
 }
 
 
 
-Bool_t AliTPCParam::GetStatus()
+Bool_t AliTPCParam::ReadGeoMatrices(){
+  //
+  // read geo matrixes
+  //
+  if (!gGeoManager){
+    AliFatal("Geo manager not initialized\n");
+  }
+  AliAlignObjParams o;
+  //
+  if (fTrackingMatrix) delete [] fTrackingMatrix;
+  fTrackingMatrix = new TGeoHMatrix*[fNSector];
+  if (fClusterMatrix) delete [] fClusterMatrix;
+  fClusterMatrix = new TGeoHMatrix*[fNSector];
+  if (fGlobalMatrix) delete [] fGlobalMatrix;
+  fGlobalMatrix = new TGeoHMatrix*[fNSector];
+  for (Int_t isec=0; isec<fNSector; isec++) {
+    fGlobalMatrix[isec] = 0;
+    fClusterMatrix[isec]= 0;
+    fTrackingMatrix[isec]=0;
+  }   
+  //
+  for (Int_t isec=0; isec<fNSector; isec++) {
+    fGlobalMatrix[isec] = 0;
+    fClusterMatrix[isec]= 0;
+    fTrackingMatrix[isec]=0;   
+    AliGeomManager::ELayerID iLayer;
+    Int_t iModule;
+
+    if(isec<fNInnerSector) {
+      iLayer = AliGeomManager::kTPC1;
+      iModule = isec;
+    }
+    else {
+      iLayer = AliGeomManager::kTPC2;
+      iModule = isec - fNInnerSector;
+    }
+
+    UShort_t volid = AliGeomManager::LayerToVolUID(iLayer,iModule);
+    TGeoPNEntry* pne = gGeoManager->GetAlignableEntryByUID(volid);
+    if(!pne)
+    {
+      AliError(Form("Alignable entry for volume ID %d not in geometry. Exiting!",volid));
+      return kFALSE;
+    }
+    const char *path = pne->GetTitle();
+    if (!gGeoManager->cd(path)) return kFALSE;
+    TGeoHMatrix *m = gGeoManager->GetCurrentMatrix();
+    //
+    TGeoRotation mchange; 
+    mchange.RotateY(90); mchange.RotateX(90);
+    Float_t ROCcenter[3]; 
+    GetChamberCenter(isec,ROCcenter);
+    //
+    // Convert to global coordinate system
+    //
+    fGlobalMatrix[isec] = new TGeoHMatrix(*m);
+    fGlobalMatrix[isec]->Multiply(&(mchange.Inverse()));
+    TGeoTranslation center("center",-ROCcenter[0],-ROCcenter[1],-ROCcenter[2]);
+    fGlobalMatrix[isec]->Multiply(&center);
+    //
+    //  cluster correction matrix
+    //
+    fClusterMatrix[isec] = new TGeoHMatrix;
+    Double_t sectorAngle = 20.*(isec%18)+10;
+    TGeoHMatrix  rotMatrix;
+    rotMatrix.RotateZ(sectorAngle);
+    if (GetGlobalMatrix(isec)->GetTranslation()[2]>0){
+      //
+      // mirrored system 
+      //
+      TGeoRotation mirrorZ;
+      mirrorZ.SetAngles(90,0,90,90,180,0);
+      fClusterMatrix[isec]->Multiply(&mirrorZ);
+    }
+    TGeoTranslation trans(0,0,GetZLength(isec));
+    fClusterMatrix[isec]->MultiplyLeft(&trans);
+    fClusterMatrix[isec]->MultiplyLeft((GetGlobalMatrix(isec)));       
+    fClusterMatrix[isec]->MultiplyLeft(&(rotMatrix.Inverse()));
+  }
+  return kTRUE;
+}
+
+TGeoHMatrix *  AliTPCParam::Tracking2LocalMatrix(const TGeoHMatrix * geoMatrix, Int_t sector) const{
+  //
+  // make local to tracking matrix
+  //
+  Double_t sectorAngle = 20.*(sector%18)+10;
+  TGeoHMatrix *newMatrix = new TGeoHMatrix();
+  newMatrix->RotateZ(sectorAngle);
+  newMatrix->MultiplyLeft(&(geoMatrix->Inverse()));
+  return newMatrix;
+}
+
+
+
+
+Bool_t AliTPCParam::GetStatus() const
 {
   //get information about object consistency
   return fbStatus;
@@ -535,6 +722,16 @@ Int_t AliTPCParam::GetNRowUp() const
   //get the number of pad rows in up sector
   return fNRowUp;
 }
+Int_t AliTPCParam::GetNRowUp1() const
+{
+  //get the number of pad rows in up1 sector
+  return fNRowUp1;
+}
+Int_t AliTPCParam::GetNRowUp2() const
+{
+  //get the number of pad rows in up2 sector
+  return fNRowUp2;
+}
 Float_t AliTPCParam::GetPadRowRadiiLow(Int_t irow) const
 {
   //get the pad row (irow) radii
@@ -571,183 +768,64 @@ Int_t AliTPCParam::GetNPadsUp(Int_t irow) const
   else
     return 0;
 }
+Float_t AliTPCParam::GetYInner(Int_t irow) const
+{
+  return fYInner[irow];
+}
 
 
-void AliTPCParam::Streamer(TBuffer &R__b)
+Float_t AliTPCParam::GetYOuter(Int_t irow) const
 {
-   // Stream an object of class AliTPC.
-
-   if (R__b.IsReading()) {
-      Version_t R__v = R__b.ReadVersion(); if (R__v) { }
-      AliDetectorParam::Streamer(R__b);
-      if (R__v < 2) return;
-      //---------------------------------------------------------------------
-      //   ALICE TPC sector geometry
-      //--------------------------------------------------------------------  
-      R__b >> fInnerRadiusLow;   // lower radius of inner sector-IP
-      R__b >> fInnerRadiusUp;    // upper radius of inner  sector-IP
-      R__b >> fOuterRadiusUp;    // upper radius of outer  sector-IP
-      R__b >> fOuterRadiusLow;   // lower radius of outer sector-IP
-      R__b >> fInnerAngle;       //opening angle of Inner sector
-      R__b >> fInnerAngleShift;  //shift of first inner sector center to the 0
-      R__b >> fOuterAngle;       //opening angle of outer sector
-      R__b >> fOuterAngleShift;  //shift of first sector center to the 0  
-      R__b >> fInnerFrameSpace;  //spce for inner frame in the phi direction 
-      R__b >> fOuterFrameSpace;  //spce for outer frame in the phi direction 
-      R__b >> fInnerWireMount;
-      R__b >> fOuterWireMount;
-      //R__b >> fNInnerSector;      //!number of inner sectors - calculated
-      //R__b >> fNOuterSector;      //!number of outer sectors -calculated
-      //R__b >> fNSector;           //! total number of sectors -calculated
-      R__b >> fZLength;           //length of the drift region of the TPC
-      //R__b.ReadFastArray(fRotAngle,fNSector*4);      //  sin and cos of rotation angles for 
-      R__b >> fGeometryType;      //type of geometry -0 straight rows
-                                 //  diferent sectors
-      //---------------------------------------------------------------------
-      //   ALICE TPC wires  geometry
-      //--------------------------------------------------------------------
-      R__b >> fNInnerWiresPerPad;//  Number of wires per pad
-      //R__b >> fInnerWWPitch;     // pitch between wires  in inner sector - calculated
-      R__b >> fInnerDummyWire;   //number of wires without pad readout
-      R__b >> fInnerOffWire;//oofset of first wire to the begining of the sector
-      //R__b >> fRInnerFirstWire;  //position of the first wire  -calculated
-      //R__b >> fRInnerLastWire;   //position of the last wire    -calculated
-      R__b >> fNOuterWiresPerPad;//  Number of wires per pad
-      //R__b >> fOuterWWPitch;     // pitch between wires in outer sector   - calculated
-      R__b >> fOuterDummyWire;   //number of wires without pad readout
-      R__b >> fOuterOffWire;//oofset of first wire to the begining of the sector
-      //R__b >> fROuterFirstWire;  //position of the first wire  -calulated
-      //R__b >> fROuterLastWire;   //position of the last wire    -calculated            
-      //---------------------------------------------------------------------
-      //   ALICE TPC pad parameters
-      //--------------------------------------------------------------------
-      R__b >> fInnerPadPitchLength;    //Inner pad pitch length
-      R__b >> fInnerPadPitchWidth;     //Inner pad pitch width
-      R__b >> fInnerPadLength;         //Inner pad  length
-      R__b >> fInnerPadWidth;          //Inner pad  width
-      R__b >> fOuterPadPitchLength;    //Outer pad pitch length
-      R__b >> fOuterPadPitchWidth;     //Outer pad pitch width
-      R__b >> fOuterPadLength;         //Outer pad  length
-      R__b >> fOuterPadWidth;          //Outer pad  width
-      R__b >> fBMWPCReadout;           //indicate wire readout 
-      R__b >> fNCrossRows;             //number of pad rows to crostalk
-      R__b >> fNRowLow;           //  number of pad rows per low sector 
-      R__b >> fNRowUp;            //  number of pad rows per sector up 
-      //R__b >> fPadRowLow[600]; // Lower sector, pad row radii
-      //R__b >> fPadRowUp[600];  // Upper sector, pad row radii
-      //R__b >> fNPadsLow[600];     // Lower sector, number of pads per row
-      //R__b >> fNPadsUp[600];      //  Upper sector, number of pads per row
-      //---------------------------------------------------------------------
-      //   ALICE TPC Gas Parameters
-      //--------------------------------------------------------------------
-      R__b >> fDiffT;          //tangencial diffusion constant
-      R__b >> fDiffL;          //longutudinal diffusion constant
-      R__b >> fGasGain;        //gas gain constant
-      R__b >> fDriftV;          //drift velocity constant
-      R__b >> fOmegaTau;       //omega tau ExB coeficient
-      R__b >> fAttCoef;        //attachment coefitients
-      R__b >> fOxyCont;        //oxygen content
-      //---------------------------------------------------------------------
-      //   ALICE TPC  Electronics Parameters
-      //--------------------------------------------------------------------
-      R__b >> fPadCoupling;     //coupling factor ration of  anode signal 
-      //and total pads signal  
-      R__b >> fZeroSup;         //zero suppresion constant
-      R__b >> fNoise;         //noise sigma constant
-      R__b >> fChipGain;      //preamp shaper constant
-      R__b >> fChipNorm;      //preamp shaper normalisation       
-      R__b >> fTSample; // sampling time
-      R__b >> fZWidth;  //derived value calculated using TSample and driftw 
-      R__b >> fTSigma;  // width of the Preamp/Shaper function
-      R__b >> fMaxTBin; //maximum time bin number   
-      R__b >> fADCSat;  //saturation value of ADC (10 bits)
-      R__b >> fADCDynRange; // input dynamic range (mV)
-      //--------------------------------------------------------        
-   } else {
-      R__b.WriteVersion(AliTPCParam::IsA());
-      AliDetectorParam::Streamer(R__b);      
-     //---------------------------------------------------------------------
-      //   ALICE TPC sector geometry
-      //--------------------------------------------------------------------  
-      R__b << fInnerRadiusLow;   // lower radius of inner sector-IP
-      R__b << fInnerRadiusUp;    // upper radius of inner  sector-IP
-      R__b << fOuterRadiusUp;    // upper radius of outer  sector-IP
-      R__b << fOuterRadiusLow;   // lower radius of outer sector-IP
-      R__b << fInnerAngle;       //opening angle of Inner sector
-      R__b << fInnerAngleShift;  //shift of first inner sector center to the 0
-      R__b << fOuterAngle;       //opening angle of outer sector
-      R__b << fOuterAngleShift;  //shift of first sector center to the 0  
-      R__b << fInnerFrameSpace;  //spce for inner frame in the phi direction 
-      R__b << fOuterFrameSpace;  //spce for outer frame in the phi direction 
-      R__b << fInnerWireMount;
-      R__b << fOuterWireMount;
-      //R__b << fNInnerSector;      //!number of inner sectors - calculated
-      //R__b << fNOuterSector;      //!number of outer sectors -calculated
-      //R__b << fNSector;           //! total number of sectors -calculated
-      R__b << fZLength;           //length of the drift region of the TPC
-      //R__b.WriteFastArray(fRotAngle,fNSector*4);      //  sin and cos of rotation angles for 
-      R__b << fGeometryType;      //type of geometry -0 straight rows
-      
-                                 //  diferent sectors
-      //---------------------------------------------------------------------
-      //   ALICE TPC wires  geometry
-      //--------------------------------------------------------------------
-      R__b << fNInnerWiresPerPad;//  Number of wires per pad
-      // R__b << fInnerWWPitch;     // pitch between wires  in inner sector - calculated
-      R__b << fInnerDummyWire;   //number of wires without pad readout
-      R__b << fInnerOffWire;//oofset of first wire to the begining of the sector
-      //R__b << fRInnerFirstWire;  //position of the first wire  -calculated
-      //R__b << fRInnerLastWire;   //position of the last wire    -calculated
-      R__b << fNOuterWiresPerPad;//  Number of wires per pad
-      //R__b << fOuterWWPitch;     // pitch between wires in outer sector   - calculated
-      R__b << fOuterDummyWire;   //number of wires without pad readout
-      R__b << fOuterOffWire;//oofset of first wire to the begining of the sector
-      //R__b << fROuterFirstWire;  //position of the first wire  -calulated
-      //R__b << fROuterLastWire;   //position of the last wire    -calculated            
-      //---------------------------------------------------------------------
-      //   ALICE TPC pad parameters
-      //--------------------------------------------------------------------
-      R__b << fInnerPadPitchLength;    //Inner pad pitch length
-      R__b << fInnerPadPitchWidth;     //Inner pad pitch width
-      R__b << fInnerPadLength;         //Inner pad  length
-      R__b << fInnerPadWidth;          //Inner pad  width
-      R__b << fOuterPadPitchLength;    //Outer pad pitch length
-      R__b << fOuterPadPitchWidth;     //Outer pad pitch width
-      R__b << fOuterPadLength;         //Outer pad  length
-      R__b << fOuterPadWidth;          //Outer pad  width
-      R__b << fBMWPCReadout;           //indicate wire readout 
-      R__b << fNCrossRows;             // number of rows to cross talk
-      R__b << fNRowLow;           //  number of pad rows per low sector 
-      R__b << fNRowUp;            //  number of pad rows per sector up 
-      // R__b << fPadRowLow[600]; // Lower sector, pad row radii
-      //R__b << fPadRowUp[600];  // Upper sector, pad row radii
-      //R__b << fNPadsLow[600];     // Lower sector, number of pads per row
-      //R__b << fNPadsUp[600];      //  Upper sector, number of pads per row
-      //---------------------------------------------------------------------
-      //   ALICE TPC Gas Parameters
-      //--------------------------------------------------------------------
-      R__b << fDiffT;          //tangencial diffusion constant
-      R__b << fDiffL;          //longutudinal diffusion constant
-      R__b << fGasGain;        //gas gain constant
-      R__b << fDriftV;          //drift velocity constant
-      R__b << fOmegaTau;       //omega tau ExB coeficient
-      R__b << fAttCoef;        //attachment coefitients
-      R__b << fOxyCont;        //oxygen content
-      //---------------------------------------------------------------------
-      //   ALICE TPC  Electronics Parameters
-      //--------------------------------------------------------------------
-      R__b << fPadCoupling;     //coupling factor ration of  anode signal 
-      //and total pads signal  
-      R__b << fZeroSup;         //zero suppresion constant
-      R__b << fNoise;         //noise sigma constant
-      R__b << fChipGain;      //preamp shaper constant
-      R__b << fChipNorm;      //preamp shaper normalisation     
-      R__b << fTSample; // sampling time
-      R__b << fZWidth;  //derived value calculated using TSample and driftw 
-      R__b << fTSigma;  // width of the Preamp/Shaper function
-      R__b << fMaxTBin; //maximum time bin number   
-      R__b << fADCSat;  //saturation value of ADC (10 bits)
-      R__b << fADCDynRange; // input dynamic range (mV)       
-   }
+  return fYOuter[irow];
 }
 
+Int_t AliTPCParam::GetSectorIndex(Float_t angle, Int_t row, Float_t z) const
+{
+  // returns the sector index
+  // takes as input the angle, index of the pad row and z position
+  if(row<0) return -1;
+
+  if (angle > 2.*TMath::Pi()) angle -= 2.*TMath::Pi();
+  if (angle < 0.            ) angle += 2.*TMath::Pi();
+  Int_t sector;
+  if(row<fNRowLow) {
+    sector=Int_t(TMath::Nint((angle-fInnerAngleShift)/fInnerAngle));
+    if (z<0) sector += (fNInnerSector>>1);
+  }
+  else {
+    sector=Int_t(TMath::Nint((angle-fOuterAngleShift)/fOuterAngle))+fNInnerSector;      
+    if (z<0) sector += (fNOuterSector>>1);
+  }    
+  
+  return sector;
+}
+
+Float_t AliTPCParam::GetChamberCenter(Int_t isec, Float_t * center) const
+{
+  // returns the default radial position
+  // of the readout chambers
+
+  const Float_t kROCcenterIn = 110.2;
+  const Float_t kROCcenterOut = 188.45;
+
+  if (isec<fNInnerSector){
+    if (center){
+      center[0] = kROCcenterIn;
+      center[1] = 0; 
+      center[2] = -5.51-0.08; 
+    }
+    return kROCcenterIn;
+  }
+  else{
+    if (center){
+      center[0] = kROCcenterOut;
+      center[1] = 0; 
+      center[2] = -5.61-0.08; 
+    }
+    return kROCcenterOut;
+  }
+}
+
+
+