#include "AliITSUTrackHyp.h"
#include "AliESDtrack.h"
#include "AliCluster.h"
#include "AliITSUAux.h"
#include <TString.h>
ClassImp(AliITSUTrackHyp)
AliITSUTrackHyp::AliITSUTrackHyp(Int_t nlr)
: fNLayers(nlr)
,fITSLabel(0)
,fESDTrack(0)
,fWinner(0)
,fTPCSeed(0)
,fLayerSeeds(0)
{
if (fNLayers>0) fLayerSeeds = new TObjArray[fNLayers];
}
AliITSUTrackHyp::~AliITSUTrackHyp()
{
delete[] fLayerSeeds;
delete fTPCSeed;
}
AliITSUTrackHyp::AliITSUTrackHyp(const AliITSUTrackHyp &src)
: AliKalmanTrack(src)
, fNLayers(src.fNLayers)
, fITSLabel(src.fITSLabel)
, fESDTrack(src.fESDTrack)
, fWinner(0)
, fTPCSeed(src.fTPCSeed)
, fLayerSeeds(0)
{
if (fNLayers>0) {
fLayerSeeds = new TObjArray[fNLayers];
for (int ilr=fNLayers;ilr--;) {
int ns = src.GetNSeeds(ilr);
for (int isd=0;isd<ns;isd++) {
AliITSUSeed* sd = src.GetSeed(ilr,isd);
if (sd->IsKilled()) continue;
AddSeed(sd,ilr);
}
}
fWinner = src.fWinner;
}
}
AliITSUTrackHyp::AliITSUTrackHyp(const AliKalmanTrack &src)
: AliKalmanTrack(src)
, fNLayers(0)
, fITSLabel(0)
, fESDTrack(0)
, fWinner(0)
, fTPCSeed(0)
, fLayerSeeds(0)
{
}
AliITSUTrackHyp::AliITSUTrackHyp(const AliESDtrack &src)
: AliKalmanTrack()
, fNLayers(0)
, fITSLabel(0)
, fESDTrack(0)
, fWinner(0)
, fTPCSeed(0)
, fLayerSeeds(0)
{
AliExternalTrackParam::operator=((const AliExternalTrackParam&)src);
SetMass(src.GetMassForTracking());
if (src.IsOn(AliESDtrack::kTIME)) {
StartTimeIntegral();
SetIntegratedLength(src.GetIntegratedLength());
double times[AliPID::kSPECIESC];
src.GetIntegratedTimes(times,AliPID::kSPECIESC);
SetIntegratedTimes(times);
}
}
void AliITSUTrackHyp::InitFrom(const AliITSUTrackHyp *src)
{
fNLayers = src->fNLayers;
fITSLabel = src->fITSLabel;
fESDTrack = src->fESDTrack;
fWinner = src->fWinner;
fTPCSeed = src->fTPCSeed;
}
AliITSUTrackHyp &AliITSUTrackHyp::operator=(const AliITSUTrackHyp &src)
{
if (this == &src) return *this;
this->~AliITSUTrackHyp();
new(this) AliITSUTrackHyp(src);
return *this;
}
AliITSUTrackHyp &AliITSUTrackHyp::operator=(const AliKalmanTrack &src)
{
if (this == &src) return *this;
AliKalmanTrack::operator=(src);
return *this;
}
AliITSUTrackHyp &AliITSUTrackHyp::operator=(const AliESDtrack &src)
{
AliExternalTrackParam::operator=((const AliExternalTrackParam&)src);
SetMass(src.GetMassForTracking());
if (src.IsOn(AliESDtrack::kTIME)) {
StartTimeIntegral();
SetIntegratedLength(src.GetIntegratedLength());
double times[AliPID::kSPECIESC];
src.GetIntegratedTimes(times,AliPID::kSPECIESC);
SetIntegratedTimes(times);
}
return *this;
}
void AliITSUTrackHyp::Print(Option_t* opt) const
{
printf("Track Hyp.#%4d. NSeeds:",GetUniqueID());
TString opts = opt;
opts.ToLower();
Bool_t prSeeds = opts.Contains("l");
for (int i=0;i<fNLayers;i++) {
printf("Lr (%d) %3d ",i,GetNSeeds(i));
if (prSeeds) {
printf("\n");
for (int isd=0;isd<GetNSeeds(i);isd++) ((AliITSUSeed*)GetSeed(i,isd))->Print(opt);
}
}
if (!prSeeds) printf("\n");
}
AliITSUSeed* AliITSUTrackHyp::GetWinner() const
{
return fWinner;
}
AliITSUSeed* AliITSUTrackHyp::DefineWinner(int lr, int id)
{
int nsd = GetNSeeds(lr);
while ( id<nsd && ( !(fWinner=GetSeed(lr,id)) || fWinner->IsKilled() ) ) {id++; fWinner=0;}
if (!fWinner) {
return 0;
}
UInt_t idESD = GetUniqueID();
this->AliExternalTrackParam::operator=(*fWinner);
SetUniqueID(idESD);
SetChi2(fWinner->GetChi2GloNrm());
SetNumberOfClusters(fWinner->GetNLayersHit());
return fWinner;
}
Double_t AliITSUTrackHyp::GetPredictedChi2(const AliCluster *cl) const
{
Double_t p[2]={cl->GetY(), cl->GetZ()};
Double_t cov[3]={cl->GetSigmaY2(), cl->GetSigmaYZ(), cl->GetSigmaZ2()};
return AliExternalTrackParam::GetPredictedChi2(p,cov);
}
Bool_t AliITSUTrackHyp::PropagateTo(Double_t , Double_t , Double_t )
{
AliFatal("Not to be used");
return 0;
}
Bool_t AliITSUTrackHyp::Update(const AliCluster* , Double_t , Int_t )
{
AliFatal("Not to be used");
return kFALSE;
}
Double_t AliITSUTrackHyp::Update(const AliCluster* cl)
{
Double_t p[2]={cl->GetY(), cl->GetZ()};
Double_t cov[3]={cl->GetSigmaY2(), cl->GetSigmaYZ(), cl->GetSigmaZ2()};
double chi2 = AliExternalTrackParam::GetPredictedChi2(p,cov);
if (!AliExternalTrackParam::Update(p,cov)) return -1;
SetChi2(GetChi2()+chi2);
return chi2;
}
Int_t AliITSUTrackHyp::FetchClusterInfo(Int_t *clIDarr) const
{
for (int i=fNLayers<<1;i--;) clIDarr[i]=-1;
return GetWinner() ? GetWinner()->FetchClusterInfo(clIDarr) : 0;
}
Int_t AliITSUTrackHyp::GetNumberOfClusters() const
{
AliITSUSeed* seed = GetWinner();
int ncl = 0;
if (!seed) {
AliFatal("The winner is not set");
return ncl;
}
return seed->GetNClusters();
}
Int_t AliITSUTrackHyp::GetClusterIndex(Int_t ind) const
{
AliITSUSeed* seed = GetWinner();
if (!seed) {
AliFatal("The winner is not set");
return -1;
}
return seed->GetClusterIndex(ind);
}