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)
}
fSensTemp(0),
fSensPres(0),
fTempMap(0),
- fSensGasComp(0)
+ fSensGasComp(0),
+ fNominalTemp(0), // nominal temperature in Kelvin
+ fNominalPress(0) // nominal pressure in mbar
{
//
// Standard constructor
fTempMap = 0;
}
fSensGasComp = SensGasComp;
+ fNominalTemp = kNominalTemp;
+ fNominalPress= kNominalPress;
}
//_____________________________________________________________________________
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
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;
}
class TObject;
class AliTPCSensorTempArray;
class TGraph;
-
+class AliTPCTempMap;
class AliTPCCalibVdrift : public TNamed {
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);
};
fMaxC(0.3),
fBSpecialSeeding(kFALSE),
fBKinkFinder(kTRUE),
- fLastSeedRowSec(120)
+ fLastSeedRowSec(120),
+ fUseTOFCorrection(kTRUE)
{
//
// constructor
param->fMaxSnpTracker = 0.98;
param->fMaxC = 0.02;
param->fBSpecialSeeding = kTRUE;
+ param->fUseTOFCorrection=kFALSE;
//
//
param->SetName("Laser Flux");
param->fBSpecialSeeding = kTRUE;
param->fMaxC = 0.07;
param->fBKinkFinder = kFALSE;
+ param->fUseTOFCorrection =kFALSE;
param->SetName("Cosmic Flux");
param->SetTitle("Cosmic Flux");
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;}
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
#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!
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();
//
// 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);
//
//
//
//
+ 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");
}
//
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;
// 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);
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)
};