]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - TPC/AliTPCParam.cxx
skim task first usable version
[u/mrichter/AliRoot.git] / TPC / AliTPCParam.cxx
index 5646360646e1cec293dda6ff0014f1f35dead4ec..7835205c877c843f864c6761051c8806845b5248 100644 (file)
 
 #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_150x60");
   SetDefault();  
 }
@@ -57,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;
+  }
+
 }
 
 
@@ -92,7 +196,8 @@ Int_t  AliTPCParam::Transform0to1(Float_t *xyz, Int_t * index)  const
       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;
@@ -246,18 +351,18 @@ void AliTPCParam::SetDefault()
   //
   //sector default parameters
   //
-  static const  Float_t kInnerRadiusLow = 82.97;
-  static const  Float_t kInnerRadiusUp  = 133.17;
-  static const  Float_t kOuterRadiusLow = 133.58;
-  static const  Float_t kOuterRadiusUp  = 247.78;
+  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.370825926;
-  static const  Float_t kOuterWireMount = 1.370825926;
+  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;
@@ -270,14 +375,14 @@ void AliTPCParam::SetDefault()
   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.445;
-  static const Float_t  kRInnerLastWire = 132.445;
+  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.305;
-  static const Float_t  kROuterLastWire = 247.055;
+  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;
   //
@@ -320,17 +425,18 @@ void AliTPCParam::SetDefault()
   static const  Int_t    kMaxTBin =445;  
   static const  Int_t    kADCSat  =1024;  
   static const  Float_t  kADCDynRange =2000.;  
-  //
-  //
-  //
-  static const  Float_t kBField =0.2; 
-  static const  Float_t kNPrimLoss =10.9;
-  static const  Float_t kNTotalLoss =39.9;
   // 
   //response constants
   //
   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
@@ -404,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(static_cast<int>(kResponseThreshold));
+  //L1 data
+  SetGateDelay(kGateDelay);
+  SetL1Delay(kL1Delay);
+  SetNTBinsBeforeL1(kNTBinsBeforeL1);
 }
 
           
@@ -462,6 +572,7 @@ 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;
@@ -485,17 +596,119 @@ Bool_t AliTPCParam::Update()
   //
   //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::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();
+    // Since GEANT4 does not allow reflections, in this case the reflection
+    // component if the matrix is embedded by TGeo inside TGeoScaledShape
+    if (gGeoManager->GetCurrentVolume()->GetShape()->IsReflected()) 
+       m->ReflectZ(kFALSE, kTRUE);
+    //
+    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
@@ -569,10 +782,53 @@ Float_t AliTPCParam::GetYOuter(Int_t irow) const
   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;
+  }
+}