]> git.uio.no Git - u/mrichter/AliRoot.git/commitdiff
AliTPCTransform.cxx AliTPCTransform.h
authormarian <marian@f7af4fe6-9843-0410-8265-dc069ae4e863>
Fri, 27 Feb 2009 19:57:14 +0000 (19:57 +0000)
committermarian <marian@f7af4fe6-9843-0410-8265-dc069ae4e863>
Fri, 27 Feb 2009 19:57:14 +0000 (19:57 +0000)
Adding data members - RecoParam, Run number and time stamp
Needed to calculate time dependent correction - inside run

AliTPCRecoParam.cxx AliTPCRecoParam.h
Possibility to switch OFF TOF correction

AliTPCCalibVdrift.h AliTPCCalibVdrift.cxx
Defining the default values, calculate default T/P correction for drift velocit
y
It is first order correction

TPC/AliTPCCalibVdrift.cxx
TPC/AliTPCCalibVdrift.h
TPC/AliTPCRecoParam.cxx
TPC/AliTPCRecoParam.h
TPC/AliTPCTransform.cxx
TPC/AliTPCTransform.h

index bbfed36de971b2661dc398e7aed832c8abb6d504..4c0436fdacd1322c848d314226aa3214f2d0eb93 100644 (file)
@@ -61,6 +61,14 @@ namespace paramDefinitions {
   Double_t krho = 0.934246; // density of TPC-Gas [kg/m^3]
                             // method of calculation: weighted average
   Double_t kg = 9.81;
+
+  //
+  // Nominal value obtained from 2008 data
+  //
+  const Double_t kKelvin       =273.15; // degree to Kelvin
+  const Double_t kNominalTemp  =19.03;  // mean between A and C side  in degree
+  const Double_t kNominalPress =973.9;  // pressure sensor - in mbar- 
+                                        // calibDB->GetPressure(tstamp,irun,1)
 }
 
 
@@ -71,7 +79,9 @@ AliTPCCalibVdrift::AliTPCCalibVdrift(AliTPCSensorTempArray *SensTemp, AliDCSSens
   fSensTemp(0),
   fSensPres(0),
   fTempMap(0),
-  fSensGasComp(0)
+  fSensGasComp(0),
+  fNominalTemp(0),    // nominal temperature in Kelvin
+  fNominalPress(0)    // nominal pressure    in mbar 
 {
   //
   //  Standard constructor
@@ -85,6 +95,8 @@ AliTPCCalibVdrift::AliTPCCalibVdrift(AliTPCSensorTempArray *SensTemp, AliDCSSens
     fTempMap = 0;
   }
   fSensGasComp = SensGasComp;
+  fNominalTemp = kNominalTemp;
+  fNominalPress= kNominalPress;
 }
 
 //_____________________________________________________________________________
@@ -93,7 +105,10 @@ AliTPCCalibVdrift::AliTPCCalibVdrift(const AliTPCCalibVdrift& source) :
   fSensTemp(source.fSensTemp),
   fSensPres(source.fSensPres),
   fTempMap(source.fTempMap),
-  fSensGasComp(source.fSensGasComp)
+  fSensGasComp(source.fSensGasComp),
+  fNominalTemp(source.fNominalTemp),    // nominal temperature in Kelvin
+  fNominalPress(source.fNominalPress)    // nominal pressure    in mbar 
+
 {
   //
   //  Copy constructor
@@ -138,11 +153,15 @@ Double_t AliTPCCalibVdrift::GetPTRelative(UInt_t absTimeSec, Int_t side){
   fitter->GetParameters(vec);
   delete fitter;
   if (vec[0]<10) return 0;
-  Double_t  temperature = vec[0]+273.15;
-  Double_t povertMeas = pressure/temperature;
-  Double_t povertNom =  kstdP/(torrTokPascal*kstdT);
+  //
+  //
+  //
+  Double_t  temperature = vec[0];  //vec[0] temeperature 
+  Double_t  tpnom       = (fNominalTemp+kKelvin)/(fNominalPress);
+  Double_t  tpmeasured  = (temperature+kKelvin)/(pressure);
+  Double_t  result      = (tpmeasured-tpnom)/tpnom;
 
-  return povertMeas/povertNom;
+  return result;
 
 }
 
index af3134512ff7e28483c7bd7fbbe536fc116db804..b7f2b2a3202aff2438fb08e3cb26c1821c84e1fe 100644 (file)
@@ -11,7 +11,7 @@
 class TObject;
 class AliTPCSensorTempArray;
 class TGraph;
-
+class AliTPCTempMap;
 class AliTPCCalibVdrift : public TNamed {
 
 public:
@@ -35,14 +35,20 @@ public:
   Double_t GetMeanZVdriftChange(Double_t x, Double_t y, UInt_t absTimeSec);
 
   TGraph *MakeGraphMeanZVdriftChange(Double_t x, Double_t y, Int_t nPoints);
+  Float_t GetNominalTemperature(){return fNominalTemp;}
+  Float_t GetNominalPressure(){return fNominalPress;}
 
 protected:
-
+  //
   AliTPCSensorTempArray *fSensTemp;   // Temperature sensors 
   AliDCSSensor          *fSensPres;   // pressure sensor (cavernpress in GRP)
   AliTPCTempMap         *fTempMap;    // Temperature Map
   TObject *fSensGasComp;      // placeholder for GasConzentration infos  
-  
+  //
+  // Nominal values
+  //
+  Float_t               fNominalTemp;    // nominal temperature in Kelvin
+  Float_t               fNominalPress;    // nominal pressure    in mbar 
   ClassDef(AliTPCCalibVdrift,1);
 
 };
index 0c043e78406874765c4864205a7214191f588096..4c4182915012ac1c15a6f02363eb65716db52efe 100644 (file)
@@ -80,7 +80,8 @@ AliTPCRecoParam::AliTPCRecoParam():
   fMaxC(0.3),
   fBSpecialSeeding(kFALSE),
   fBKinkFinder(kTRUE),
-  fLastSeedRowSec(120)
+  fLastSeedRowSec(120),
+  fUseTOFCorrection(kTRUE)
 {
   //
   // constructor
@@ -160,6 +161,7 @@ AliTPCRecoParam *AliTPCRecoParam::GetLaserTestParam(Bool_t bPedestal){
   param->fMaxSnpTracker = 0.98;
   param->fMaxC          = 0.02;
   param->fBSpecialSeeding = kTRUE;
+  param->fUseTOFCorrection=kFALSE;
   //
   //
   param->SetName("Laser Flux");
@@ -181,6 +183,7 @@ AliTPCRecoParam *AliTPCRecoParam::GetCosmicTestParam(Bool_t bPedestal){
   param->fBSpecialSeeding = kTRUE;
   param->fMaxC          = 0.07;
   param->fBKinkFinder   = kFALSE;
+  param->fUseTOFCorrection =kFALSE;
   param->SetName("Cosmic Flux");
   param->SetTitle("Cosmic Flux");
 
index 6a512dbcb21107bd0d882451bd8b81e3c5307fbd..cefa4d919b3286a9a15ef4e1a743d81cf41ad6b6 100644 (file)
@@ -54,6 +54,10 @@ class AliTPCRecoParam : public AliDetectorRecoParam
   Float_t  GetMaxC()    const      { return fMaxC;}
   Bool_t   GetSpecialSeeding() const { return fBSpecialSeeding;}
   //
+  // Correction setup
+  //
+  Bool_t   GetUseTOFCorrection() {return fUseTOFCorrection;}
+  //
   void     SetSystematicError(Double_t *systematic){ for (Int_t i=0; i<5;i++) fSystematicErrors[i]=systematic[i];}
   const Double_t * GetSystematicError() const { return fSystematicErrors;}
 
@@ -91,6 +95,10 @@ class AliTPCRecoParam : public AliDetectorRecoParam
   Bool_t   fBKinkFinder;     // do kink finder reconstruction
   Int_t    fLastSeedRowSec;     // Most Inner Row to make seeding for secondaries
   //
+  // Correction switches
+  //
+  Bool_t fUseTOFCorrection;  // switch - kTRUE use TOF correction kFALSE - do not use
+  //
   //  misscalibration
   //
   Double_t fSystematicErrors[5];  //systematic errors in the track parameters - to be added to TPC covariance matrix    
index 885a4b42128234c18e6202fde24fd940bc6dddc9..81cd03669bd20d3865a720dc528ff7c7c111bf0a 100755 (executable)
 #include "AliLog.h"
 #include "AliTPCExB.h"
 #include "TGeoMatrix.h"
+#include "AliTPCRecoParam.h"
+#include "AliTPCCalibVdrift.h"
 #include "AliTPCTransform.h"
 
 ClassImp(AliTPCTransform)
 
 
-  AliTPCTransform::AliTPCTransform():
-    AliTransform()
+AliTPCTransform::AliTPCTransform():
+  AliTransform(),
+  fCurrentRecoParam(0),       //! current reconstruction parameters
+  fCurrentRun(0),             //! current run
+  fCurrentTimeStamp(0)        //! current time stamp   
+{
+  //
+  // Speed it up a bit!
+  //
+  for (Int_t i=0;i<18;++i) {
+    Double_t alpha=TMath::DegToRad()*(10.+20.*(i%18));
+    fSins[i]=TMath::Sin(alpha);
+    fCoss[i]=TMath::Cos(alpha);
+  }
+  fPrimVtx[0]=0;
+  fPrimVtx[1]=0;
+  fPrimVtx[2]=0;
+}
+AliTPCTransform::AliTPCTransform(const AliTPCTransform& transform):
+  AliTransform(transform),
+  fCurrentRecoParam(transform.fCurrentRecoParam),       //! current reconstruction parameters
+  fCurrentRun(transform.fCurrentRun),             //! current run
+  fCurrentTimeStamp(transform.fCurrentTimeStamp)        //! current time stamp   
 {
   //
   // Speed it up a bit!
@@ -117,7 +140,7 @@ void AliTPCTransform::Transform(Double_t *x,Int_t *i,UInt_t /*time*/,
   Int_t row=TMath::Nint(x[0]);
   Int_t pad=TMath::Nint(x[1]);
   Int_t sector=i[0];
-  AliTPCcalibDB*  calib=AliTPCcalibDB::Instance();
+  AliTPCcalibDB*  calib=AliTPCcalibDB::Instance();  
   //
   AliTPCCalPad * time0TPC = calib->GetPadTime0(); 
   AliTPCParam  * param    = calib->GetParameters(); 
@@ -151,23 +174,29 @@ void AliTPCTransform::Transform(Double_t *x,Int_t *i,UInt_t /*time*/,
   //
   // Time of flight correction
   // 
-  const Int_t kNIS=param->GetNInnerSector(), kNOS=param->GetNOuterSector(); 
-  Float_t sign=1;
-  if (sector < kNIS) {
-    sign = (sector < kNIS/2) ? 1 : -1;
-  } else {
-    sign = ((sector-kNIS) < kNOS/2) ? 1 : -1;
+  if (fCurrentRecoParam&&fCurrentRecoParam->GetUseTOFCorrection()){
+    const Int_t kNIS=param->GetNInnerSector(), kNOS=param->GetNOuterSector(); 
+    Float_t sign=1;
+    if (sector < kNIS) {
+      sign = (sector < kNIS/2) ? 1 : -1;
+    } else {
+      sign = ((sector-kNIS) < kNOS/2) ? 1 : -1;
+    }
+    Float_t deltaDr =0;
+    Float_t dist=0;
+    dist+=(fPrimVtx[0]-x[0])*(fPrimVtx[0]-x[0]);
+    dist+=(fPrimVtx[1]-x[1])*(fPrimVtx[1]-x[1]);
+    dist+=(fPrimVtx[2]-x[2])*(fPrimVtx[2]-x[2]);
+    dist = TMath::Sqrt(dist);
+    // drift length correction because of TOF
+    // the drift velocity is in cm/s therefore multiplication by 0.01
+    deltaDr = (dist*(0.01*param->GetDriftV()))/TMath::C(); 
+    xx[2]+=sign*deltaDr;
   }
-  Float_t deltaDr =0;
-  Float_t dist=0;
-  dist+=(fPrimVtx[0]-x[0])*(fPrimVtx[0]-x[0]);
-  dist+=(fPrimVtx[1]-x[1])*(fPrimVtx[1]-x[1]);
-  dist+=(fPrimVtx[2]-x[2])*(fPrimVtx[2]-x[2]);
-  dist = TMath::Sqrt(dist);
-  // drift length correction because of TOF
-  // the drift velocity is in cm/s therefore multiplication by 0.01
-  deltaDr = (dist*(0.01*param->GetDriftV()))/TMath::C(); 
-  xx[2]+=sign*deltaDr;
+  //
+  //
+  //
+
   //
   Global2RotatedGlobal(sector,xx);
   //
@@ -186,8 +215,30 @@ void AliTPCTransform::Local2RotatedGlobal(Int_t sector, Double_t *x) const {
   //
   //  
   //
+  const  Int_t kMax =60;  // cache for 60 seconds
+  static Int_t lastStamp=-1;  //cached values
+  static Double_t lastCorr = 1;
+  //
   AliTPCcalibDB*  calib=AliTPCcalibDB::Instance();
   AliTPCParam  * param    = calib->GetParameters(); 
+  AliTPCCalibVdrift *driftCalib = AliTPCcalibDB::Instance()->GetVdrift(fCurrentRun);
+  Double_t driftCorr = 1.;
+  if (driftCalib){
+    //
+    // caching drift correction - temp. fix
+    // Extremally slow procedure
+    if ( TMath::Abs((lastStamp)-Int_t(fCurrentTimeStamp))<kMax){
+      driftCorr = lastCorr;
+    }else{
+      driftCorr = 1.+(driftCalib->GetPTRelative(fCurrentTimeStamp,0)+ driftCalib->GetPTRelative(fCurrentTimeStamp,1))*0.5;
+      lastCorr=driftCorr;
+      lastStamp=fCurrentTimeStamp;
+      
+    }
+  }
+  
+
+
   if (!param){
     AliFatal("Parameters missing");
   }
@@ -196,7 +247,7 @@ void AliTPCTransform::Local2RotatedGlobal(Int_t sector, Double_t *x) const {
   //
   const Int_t kNIS=param->GetNInnerSector(), kNOS=param->GetNOuterSector();
   Double_t sign = 1.;
-  Double_t zwidth    = param->GetZWidth();
+  Double_t zwidth    = param->GetZWidth()*driftCorr;
   Double_t padWidth  = 0;
   Double_t padLength = 0;
   Double_t    maxPad    = 0;
index 6559076fa9e9b422c5119bba5b49afa2842a4829..13a1762291fd8cb4ccd2b5e6bcc8bf48206a63be 100755 (executable)
 //      rotated global (tracking) cooridnate frame (sector, lx,ly,lz)
 //
 
+class AliTPCRecoParam;
 #include "AliTransform.h"
 
 class AliTPCTransform:public AliTransform {
 public:
   AliTPCTransform();
+  AliTPCTransform(const AliTPCTransform& transform);
   virtual ~AliTPCTransform();
   virtual void Transform(Double_t *x,Int_t *i,UInt_t time,
                         Int_t coordinateType);
@@ -26,10 +28,19 @@ public:
   void RotatedGlobal2Global(Int_t sector,Double_t *x) const;
   void Global2RotatedGlobal(Int_t sector,Double_t *x) const;
   void GetCosAndSin(Int_t sector,Double_t &cos,Double_t &sin) const;
+  //
+  // set current values
+  //
+  void SetCurrentRecoParam(AliTPCRecoParam* param){fCurrentRecoParam=param;}
+  void SetCurrentRun(Int_t run){fCurrentRun=run;}
+  void SetCurrentTimeStamp(Int_t timeStamp){fCurrentTimeStamp=timeStamp;}
 private:
   Double_t fCoss[18];  // cache the transformation
   Double_t fSins[18];  // cache the transformation
   Double_t fPrimVtx[3];// position of the primary vertex - needed for TOF correction
+  AliTPCRecoParam * fCurrentRecoParam; //! current reconstruction parameters
+  Int_t    fCurrentRun;                //! current run
+  UInt_t   fCurrentTimeStamp;          //! current time stamp
   ClassDef(AliTPCTransform,1)
 };