#include <TGeoMatrix.h>
#include "AliLog.h"
#include "AliTRDtransform.h"
#include "AliTRDcluster.h"
#include "AliTRDgeometry.h"
#include "AliTRDpadPlane.h"
#include "AliTRDCommonParam.h"
#include "AliTRDcalibDB.h"
#include "Cal/AliTRDCalDet.h"
#include "Cal/AliTRDCalROC.h"
ClassImp(AliTRDtransform)
AliTRDtransform::AliTRDtransform()
:TObject()
,fDetector(0)
,fParam(0x0)
,fCalibration(0x0)
,fCalVdriftROC(0x0)
,fCalT0ROC(0x0)
,fCalPRFROC(0x0)
,fkCalVdriftDet(0x0)
,fkCalT0Det(0x0)
,fkCalExBDet(0x0)
,fCalVdriftDetValue(0)
,fCalT0DetValue(0)
,fCalExBDetValue(0)
,fSamplingFrequency(0)
,fPadPlane(0x0)
,fZShiftIdeal(0)
,fMatrix(0x0)
{
fParam = AliTRDCommonParam::Instance();
if (!fParam) {
AliError("Could not get common parameters\n");
}
fSamplingFrequency = fParam->GetSamplingFrequency();
fCalibration = AliTRDcalibDB::Instance();
if (!fCalibration) {
AliError("Cannot find calibration object");
}
fkCalVdriftDet = fCalibration->GetVdriftDet();
fkCalT0Det = fCalibration->GetT0Det();
fkCalExBDet = fCalibration->GetExBDet();
}
AliTRDtransform::AliTRDtransform(Int_t det)
:TObject()
,fDetector(0)
,fParam(0x0)
,fCalibration(0x0)
,fCalVdriftROC(0x0)
,fCalT0ROC(0x0)
,fCalPRFROC(0x0)
,fkCalVdriftDet(0x0)
,fkCalT0Det(0x0)
,fkCalExBDet(0x0)
,fCalVdriftDetValue(0)
,fCalT0DetValue(0)
,fCalExBDetValue(0)
,fSamplingFrequency(0)
,fPadPlane(0x0)
,fZShiftIdeal(0)
,fMatrix(0x0)
{
fParam = AliTRDCommonParam::Instance();
if (!fParam) {
AliError("Could not get common parameters\n");
}
fSamplingFrequency = fParam->GetSamplingFrequency();
fCalibration = AliTRDcalibDB::Instance();
if (!fCalibration) {
AliError("Cannot find calibration object");
}
fkCalVdriftDet = fCalibration->GetVdriftDet();
fkCalT0Det = fCalibration->GetT0Det();
fkCalExBDet = fCalibration->GetExBDet();
SetDetector(det);
}
AliTRDtransform::AliTRDtransform(const AliTRDtransform &t)
:TObject(t)
,fDetector(t.fDetector)
,fParam(0x0)
,fCalibration(0x0)
,fCalVdriftROC(0x0)
,fCalT0ROC(0x0)
,fCalPRFROC(0x0)
,fkCalVdriftDet(0x0)
,fkCalT0Det(0x0)
,fkCalExBDet(0x0)
,fCalVdriftDetValue(0)
,fCalT0DetValue(0)
,fCalExBDetValue(0)
,fSamplingFrequency(0)
,fPadPlane(0x0)
,fZShiftIdeal(0)
,fMatrix(0x0)
{
fParam = AliTRDCommonParam::Instance();
if (!fParam) {
AliError("Could not get common parameters\n");
}
fSamplingFrequency = fParam->GetSamplingFrequency();
fCalibration = AliTRDcalibDB::Instance();
if (!fCalibration) {
AliError("Cannot find calibration object");
}
fkCalVdriftDet = fCalibration->GetVdriftDet();
fkCalT0Det = fCalibration->GetT0Det();
fkCalExBDet = fCalibration->GetExBDet();
}
AliTRDtransform::~AliTRDtransform()
{
}
AliTRDtransform &AliTRDtransform::operator=(const AliTRDtransform &t)
{
if (this != &t) {
((AliTRDtransform &) t).Copy(*this);
}
return *this;
}
void AliTRDtransform::Copy(TObject &t) const
{
((AliTRDtransform &) t).fDetector = fDetector;
((AliTRDtransform &) t).fParam = AliTRDCommonParam::Instance();
((AliTRDtransform &) t).fCalibration = AliTRDcalibDB::Instance();
if (fCalibration) {
((AliTRDtransform &) t).fkCalVdriftDet = fCalibration->GetVdriftDet();
((AliTRDtransform &) t).fkCalT0Det = fCalibration->GetT0Det();
((AliTRDtransform &) t).fkCalExBDet = fCalibration->GetExBDet();
}
else {
((AliTRDtransform &) t).fkCalVdriftDet = 0;
((AliTRDtransform &) t).fkCalT0Det = 0;
((AliTRDtransform &) t).fkCalExBDet = 0;
}
((AliTRDtransform &) t).fCalVdriftROC = 0x0;
((AliTRDtransform &) t).fCalT0ROC = 0x0;
((AliTRDtransform &) t).fCalPRFROC = 0x0;
((AliTRDtransform &) t).fCalVdriftDetValue = 0;
((AliTRDtransform &) t).fCalT0DetValue = 0;
((AliTRDtransform &) t).fCalExBDetValue = 0;
((AliTRDtransform &) t).fSamplingFrequency = 0;
((AliTRDtransform &) t).fPadPlane = 0x0;
((AliTRDtransform &) t).fZShiftIdeal = 0;
((AliTRDtransform &) t).fMatrix = 0x0;
}
AliTRDgeometry& AliTRDtransform::Geometry()
{
static AliTRDgeometry g;
if (!g.CreateClusterMatrixArray()) {
AliErrorGeneral("AliTRDtransform::Geometry()", "Could not get transformation matrices\n");
}
return g;
}
void AliTRDtransform::SetDetector(Int_t det)
{
fDetector = det;
fCalVdriftROC = fCalibration->GetVdriftROC(det);
fCalT0ROC = fCalibration->GetT0ROC(det);
fCalPRFROC = fCalibration->GetPRFROC(det);
fCalVdriftDetValue = fkCalVdriftDet->GetValue(det);
fCalT0DetValue = fkCalT0Det->GetValue(det);
fCalExBDetValue = fkCalExBDet->GetValue(det);
Int_t layer = Geometry().GetLayer(det);
Int_t stack = Geometry().GetStack(det);
fPadPlane = Geometry().GetPadPlane(layer,stack);
fZShiftIdeal = 0.5 * (fPadPlane->GetRow0() + fPadPlane->GetRowEnd());
fMatrix = Geometry().GetClusterMatrix(det);
}
Bool_t AliTRDtransform::Transform(AliTRDcluster *c)
{
if (!fMatrix) return kFALSE;
const Double_t kX0shift = AliTRDgeometry::AnodePos();
Int_t col = c->GetPadCol(), row = c->GetPadRow();
Double_t vd = fCalVdriftDetValue * fCalVdriftROC->GetValue(col,row);
Double_t t0 = fCalT0DetValue + fCalT0ROC->GetValue(col,row);
t0 /= fSamplingFrequency;
Double_t exb = fCalExBDetValue;
Float_t x = c->GetXloc(t0, vd);
Double_t rs = fPadPlane->GetRowSize(row);
Double_t cs = fPadPlane->GetColSize(col);
Double_t s2 = cs*fCalPRFROC->GetValue(col, row);
s2 *= s2;
Float_t dl, dt;
AliTRDCommonParam::Instance()->GetDiffCoeff(dl, dt, vd);
Double_t y0 = fPadPlane->GetColPos(col) + .5*cs;
Double_t loc[] = {
kX0shift-x,
c->GetYloc(y0, s2, cs) - x*exb,
fPadPlane->GetRowPos(row) - .5*rs - fZShiftIdeal
};
Double_t trk[3];
fMatrix->LocalToMaster(loc, trk);
c->SetX(trk[0]);c->SetY(trk[1]);c->SetZ(trk[2]);
c->SetSigmaY2(s2, dt, exb, x);
c->SetSigmaZ2(fPadPlane->GetRowSize(row)*fPadPlane->GetRowSize(row)/12.);
return kTRUE;
}
void AliTRDtransform::Recalibrate(AliTRDcluster *c, Bool_t setDet)
{
if (setDet) SetDetector(c->GetDetector());
Transform(c);
}