#include <TMatrixDSym.h>
#include <TArrayI.h>
#include "AliTrackFitter.h"
#include "AliTrackPointArray.h"
#include "AliLog.h"
ClassImp(AliTrackFitter)
AliTrackFitter::AliTrackFitter() :
TObject(),
fCov(0),
fPoints(0),
fPVolId(0),
fPTrack(0),
fChi2(0),
fNdf(0),
fMinNPoints(0),
fIsOwner(kFALSE)
{
for (Int_t i=0;i<6;i++) fParams[i] = 0;
}
AliTrackFitter::AliTrackFitter(AliTrackPointArray *array, Bool_t owner) :
TObject(),
fCov(new TMatrixDSym(6)),
fPoints(0),
fPVolId(0),
fPTrack(0),
fChi2(0),
fNdf(0),
fMinNPoints(0),
fIsOwner(kFALSE)
{
for (Int_t i=0;i<6;i++) fParams[i] = 0;
SetTrackPointArray(array,owner);
}
AliTrackFitter::AliTrackFitter(const AliTrackFitter &fitter):
TObject(fitter),
fCov(new TMatrixDSym(*fitter.fCov)),
fPoints(0),
fPVolId(0),
fPTrack(0),
fChi2(fitter.fChi2),
fNdf(fitter.fNdf),
fMinNPoints(fitter.fMinNPoints),
fIsOwner(kFALSE)
{
SetTrackPointArray(fitter.fPoints,fitter.fIsOwner);
for (Int_t i=0;i<6;i++) fParams[i] = fitter.fParams[i];
}
AliTrackFitter &AliTrackFitter::operator =(const AliTrackFitter& fitter)
{
if(this==&fitter) return *this;
SetTrackPointArray(fitter.fPoints);
for (Int_t i=0;i<6;i++) fParams[i] = fitter.fParams[i];
fCov = new TMatrixDSym(*fitter.fCov);
fChi2 = fitter.fChi2;
fNdf = fitter.fNdf;
fMinNPoints = fitter.fMinNPoints;
fIsOwner = kFALSE;
return *this;
}
AliTrackFitter::~AliTrackFitter()
{
if (fIsOwner)
delete fPoints;
delete fCov;
}
void AliTrackFitter::Reset()
{
for (Int_t i=0;i<6;i++) fParams[i] = 0;
delete fCov;
fCov = new TMatrixDSym(6);
fPVolId = fPTrack = 0;
fChi2 = 0;
fNdf = 0;
}
void AliTrackFitter::SetTrackPointArray(AliTrackPointArray *array, Bool_t owner)
{
if (!array) {
AliWarning("Invalid pointer to the space-points array !");
if (fIsOwner) delete fPoints;
fPoints = NULL;
return;
}
Reset();
if (fIsOwner) delete fPoints;
if (owner) {
fPoints = new AliTrackPointArray(*array);
fIsOwner = kTRUE;
}
else {
fPoints = array;
fIsOwner = kFALSE;
}
}
Bool_t AliTrackFitter::FindVolId(const TArrayI *array, UShort_t volid) const
{
Int_t nVolIds = array->GetSize();
if (nVolIds == 0) return kFALSE;
Bool_t found = kFALSE;
for (Int_t iVolId = 0; iVolId < nVolIds; iVolId++) {
if ((*array)[iVolId] == volid) {
found = kTRUE;
break;
}
}
return found;
}
Bool_t AliTrackFitter::Fit(const TArrayI *volIds,const TArrayI *volIdsFit,
AliGeomManager::ELayerID layerRangeMin,
AliGeomManager::ELayerID layerRangeMax)
{
Int_t npoints=fPoints->GetNPoints();
if (npoints<fMinNPoints) return kFALSE;
Int_t countFit=0;
Int_t countPnt=0;
Int_t fst=-1;
Int_t lst=-1;
if (volIdsFit != 0x0) {
for (Int_t i=0; i<npoints; i++) {
if (FindVolId(volIds, fPoints->GetVolumeID()[i])) countPnt++;
if (FindVolId(volIdsFit,fPoints->GetVolumeID()[i])) {
countFit++;
if (fst<0) fst=i;
lst=i;
}
}
} else {
for (Int_t i=0; i<npoints; i++) {
UShort_t id=fPoints->GetVolumeID()[i];
if (FindVolId(volIds,id)) countPnt++;
if (id < AliGeomManager::LayerToVolUID(layerRangeMin,0)) continue;
if (id > AliGeomManager::LayerToVolUID(layerRangeMax,
AliGeomManager::LayerSize(layerRangeMax))) continue;
countFit++;
if (fst<0) fst=i;
lst=i;
}
}
if (countPnt==0) return kFALSE;
if (countFit<fMinNPoints) return kFALSE;
if (!Begin(fst,lst)) return kFALSE;
AliTrackPoint p;
if (volIdsFit != 0x0) {
for (Int_t i=0; i<npoints; i++) {
if (!FindVolId(volIdsFit,fPoints->GetVolumeID()[i])) continue;
fPoints->GetPoint(p,i);
if (!AddPoint(&p)) return kFALSE;
}
} else {
for (Int_t i=0; i<npoints; i++) {
UShort_t id=fPoints->GetVolumeID()[i];
if (id < AliGeomManager::LayerToVolUID(layerRangeMin,0)) continue;
if (id > AliGeomManager::LayerToVolUID(layerRangeMax,
AliGeomManager::LayerSize(layerRangeMax))) continue;
fPoints->GetPoint(p,i);
if (!AddPoint(&p)) continue;
}
}
if (!Update()) return kFALSE;
fPVolId = new AliTrackPointArray(countPnt);
fPTrack = new AliTrackPointArray(countPnt);
Int_t n=0;
AliTrackPoint p2;
for (Int_t i=0; i<npoints; i++) {
if (!FindVolId(volIds,fPoints->GetVolumeID()[i])) continue;
fPoints->GetPoint(p,i);
if (GetPCA(p,p2)) {
fPVolId->AddPoint(n,&p);
fPTrack->AddPoint(n,&p2);
n++;
} else {
delete fPVolId;
fPVolId=0;
delete fPTrack;
fPTrack=0;
return kFALSE;
}
}
return kTRUE;
}