fHypotheses=0;
fBegin=0;
fEnd=0;
+ fRef=0;
fImpactXY=0;
fImpactXZ=0;
fImpactYZ=0;
fClosest=0;
fParent=0;
+ fFit=0;
+ fTstamp=0;
}
///////////////////////////////////////////////////////////////////////////
AliTrack::~AliTrack()
// Destructor to delete memory allocated for decay tracks array.
// This destructor automatically cleares the pointer of this AliTrack
// from all the link slots of the related AliSignal objects.
-
Int_t nsig=GetNsignals();
for (Int_t i=1; i<=nsig; i++)
{
delete fEnd;
fEnd=0;
}
+ if (fRef)
+ {
+ delete fRef;
+ fRef=0;
+ }
if (fImpactXY)
{
delete fImpactXY;
delete fClosest;
fClosest=0;
}
+ if (fFit)
+ {
+ delete fFit;
+ fFit=0;
+ }
+ if (fTstamp)
+ {
+ delete fTstamp;
+ fTstamp=0;
+ }
}
///////////////////////////////////////////////////////////////////////////
-AliTrack::AliTrack(AliTrack& t) : TNamed(t),Ali4Vector(t)
+AliTrack::AliTrack(const AliTrack& t) : TNamed(t),Ali4Vector(t)
{
// Copy constructor
Init();
fProb=t.fProb;
if (t.fBegin) fBegin=new AliPositionObj(*(t.fBegin));
if (t.fEnd) fEnd=new AliPositionObj(*(t.fEnd));
+ if (t.fRef) fRef=new AliPositionObj(*(t.fRef));
if (t.fImpactXY) fImpactXY=new AliPositionObj(*(t.fImpactXY));
if (t.fImpactXZ) fImpactXZ=new AliPositionObj(*(t.fImpactXZ));
if (t.fImpactYZ) fImpactYZ=new AliPositionObj(*(t.fImpactYZ));
if (t.fClosest) fClosest=new AliPositionObj(*(t.fClosest));
+ if (t.fFit) fFit=t.fFit->Clone();
+ if (t.fTstamp) fTstamp=new AliTimestamp(*(t.fTstamp));
fUserId=t.fUserId;
fChi2=t.fChi2;
fNdf=t.fNdf;
delete fEnd;
fEnd=0;
}
+ if (fRef)
+ {
+ delete fRef;
+ fRef=0;
+ }
if (fImpactXY)
{
delete fImpactXY;
delete fClosest;
fClosest=0;
}
+ if (fFit)
+ {
+ delete fFit;
+ fFit=0;
+ }
+ if (fTstamp)
+ {
+ delete fTstamp;
+ fTstamp=0;
+ }
}
///////////////////////////////////////////////////////////////////////////
void AliTrack::Set3Momentum(Ali3Vector& p)
{
-// Set the track parameters according to the 3-momentum p
+// Set the track parameters according to the 3-momentum p.
+// In case the mass was not yet set, the energy is set to correspond to m=0.
Set3Vector(p);
+ Double_t inv=GetInvariant();
+ if (inv<0) SetMass(0.);
}
///////////////////////////////////////////////////////////////////////////
void AliTrack::Set4Momentum(Ali4Vector& p)
const char* title=GetTitle();
cout << " *" << ClassName() << "::Data*";
- if (strlen(name)) cout << " Name : " << GetName();
- if (strlen(title)) cout << " Title : " << GetTitle();
+ if (strlen(name)) cout << " Name : " << name;
+ if (strlen(title)) cout << " Title : " << title;
cout << endl;
+ if (fTstamp) fTstamp->Date(1);
cout << " Id : " << fUserId << " Code : " << fCode
<< " m : " << m << " dm : " << dm << " Charge : " << fQ
<< " p : " << GetMomentum() << endl;
cout << " Nhypotheses : " << GetNhypotheses() << " Ndecay-tracks : " << GetNdecay()
<< " Nsignals : " << GetNsignals() << endl;
+ if (fParent)
+ {
+ cout << " Parent track Id : " << fParent->GetId() << " Code : " << fParent->GetParticleCode()
+ << " m : " << fParent->GetMass() << " Q : " << fParent->GetCharge()
+ << " p : " << fParent->GetMomentum();
+ const char* pname=fParent->GetName();
+ const char* ptitle=fParent->GetTitle();
+ if (strlen(pname)) cout << " Name : " << pname;
+ if (strlen(ptitle)) cout << " Title : " << ptitle;
+ cout << endl;
+ }
+ if (fFit)
+ {
+ cout << " Fit details present in object of class " << fFit->ClassName() << endl;
+ if (fFit->InheritsFrom("AliSignal")) ((AliSignal*)fFit)->List(-1);
+ }
Ali4Vector::Data(f);
}
///////////////////////////////////////////////////////////////////////////
Data(f); // Information of the current track
if (fBegin) { cout << " Begin-point :"; fBegin->Data(f); }
if (fEnd) { cout << " End-point :"; fEnd->Data(f); }
+ if (fRef) { cout << " Ref-point :"; fRef->Data(f); }
Int_t nhyp=GetNhypotheses();
if (nhyp)
return norm;
}
///////////////////////////////////////////////////////////////////////////
-Ali3Vector AliTrack::Get3Momentum()
+Ali3Vector AliTrack::Get3Momentum() const
{
// Provide the track 3-momentum
return (Ali3Vector)Get3Vector();
}
}
///////////////////////////////////////////////////////////////////////////
-Float_t AliTrack::GetCharge()
+Float_t AliTrack::GetCharge() const
{
// Provide the particle charge
return fQ;
((AliTrack*)fDecays->At(1))->SetMass(m2);
}
///////////////////////////////////////////////////////////////////////////
-Int_t AliTrack::GetNdecay()
+Int_t AliTrack::GetNdecay() const
{
// Provide the number of decay produced tracks
Int_t ndec=0;
return ndec;
}
///////////////////////////////////////////////////////////////////////////
-AliTrack* AliTrack::GetDecayTrack(Int_t j)
+AliTrack* AliTrack::GetDecayTrack(Int_t j) const
{
// Provide decay produced track number j
// Note : j=1 denotes the first decay track
}
}
///////////////////////////////////////////////////////////////////////////
-Int_t AliTrack::GetNsignals()
+Int_t AliTrack::GetNsignals() const
{
// Provide the number of related AliSignals.
Int_t nsig=0;
return nsig;
}
///////////////////////////////////////////////////////////////////////////
-AliSignal* AliTrack::GetSignal(Int_t j)
+AliSignal* AliTrack::GetSignal(Int_t j) const
{
// Provide the related AliSignal number j.
// Note : j=1 denotes the first signal.
}
}
///////////////////////////////////////////////////////////////////////////
-Int_t AliTrack::GetNhypotheses()
+Int_t AliTrack::GetNhypotheses() const
{
// Provide the number of track hypotheses.
Int_t nhyp=0;
return nhyp;
}
///////////////////////////////////////////////////////////////////////////
-AliTrack* AliTrack::GetTrackHypothesis(Int_t j)
+AliTrack* AliTrack::GetTrackHypothesis(Int_t j) const
{
// Provide the j-th track hypothesis.
// Note : j=1 denotes the first hypothesis.
void AliTrack::SetBeginPoint(AliPosition& p)
{
// Store the position of the track begin-point.
- if (!fBegin)
- {
- fBegin=new AliPositionObj(p);
- }
- else
- {
- fBegin->Load(p);
- }
+ if (fBegin) delete fBegin;
+ fBegin=new AliPositionObj(p);
}
///////////////////////////////////////////////////////////////////////////
AliPosition* AliTrack::GetBeginPoint()
void AliTrack::SetEndPoint(AliPosition& p)
{
// Store the position of the track end-point.
- if (!fEnd)
- {
- fEnd=new AliPositionObj(p);
- }
- else
- {
- fEnd->Load(p);
- }
+ if (fEnd) delete fEnd;
+ fEnd=new AliPositionObj(p);
}
///////////////////////////////////////////////////////////////////////////
AliPosition* AliTrack::GetEndPoint()
return fEnd;
}
///////////////////////////////////////////////////////////////////////////
+void AliTrack::SetReferencePoint(AliPosition& p)
+{
+// Store the position of the track reference-point.
+// The reference-point is the point on the track in which the
+// 3-momentum vector components have been defined.
+// This reference point is the preferable point to start track extrapolations
+// etc... which are sensitive to the components of the 3-momentum vector.
+ if (fRef) delete fRef;
+ fRef=new AliPositionObj(p);
+}
+///////////////////////////////////////////////////////////////////////////
+AliPosition* AliTrack::GetReferencePoint()
+{
+// Provide the position of the track reference-point.
+// The reference-point is the point on the track in which the
+// 3-momentum vector components have been defined.
+// This reference point is the preferable point to start track extrapolations
+// etc... which are sensitive to the components of the 3-momentum vector.
+ return fRef;
+}
+///////////////////////////////////////////////////////////////////////////
void AliTrack::SetMass()
{
// Set the mass and error to the value of the hypothesis with highest prob.
switch (axis)
{
case 1: // Impact-point in the plane X=0
- if (!fImpactYZ)
- {
- fImpactYZ=new AliPositionObj(p);
- }
- else
- {
- fImpactYZ->Load(p);
- }
+ if (fImpactYZ) delete fImpactYZ;
+ fImpactYZ=new AliPositionObj(p);
break;
case 2: // Impact-point in the plane Y=0
- if (!fImpactXZ)
- {
- fImpactXZ=new AliPositionObj(p);
- }
- else
- {
- fImpactXZ->Load(p);
- }
+ if (fImpactXZ) delete fImpactXZ;
+ fImpactXZ=new AliPositionObj(p);
break;
case 3: // Impact-point in the plane Z=0
- if (!fImpactXY)
- {
- fImpactXY=new AliPositionObj(p);
- }
- else
- {
- fImpactXY->Load(p);
- }
+ if (fImpactXY) delete fImpactXY;
+ fImpactXY=new AliPositionObj(p);
break;
default: // Unsupported axis
fUserId=id;
}
///////////////////////////////////////////////////////////////////////////
-Int_t AliTrack::GetId()
+Int_t AliTrack::GetId() const
{
// Provide the user defined unique identifier of this track.
return fUserId;
void AliTrack::SetClosestPoint(AliPosition& p)
{
// Set position p as the point of closest approach w.r.t. some reference
- if (!fClosest)
- {
- fClosest=new AliPositionObj(p);
- }
- else
- {
- fClosest->Load(p);
- }
+ if (fClosest) delete fClosest;
+ fClosest=new AliPositionObj(p);
}
///////////////////////////////////////////////////////////////////////////
AliPosition* AliTrack::GetClosestPoint()
}
}
///////////////////////////////////////////////////////////////////////////
-Float_t AliTrack::GetChi2()
+Float_t AliTrack::GetChi2() const
{
// Provide the chi-squared value of the track fit.
return fChi2;
}
///////////////////////////////////////////////////////////////////////////
-Int_t AliTrack::GetNdf()
+Int_t AliTrack::GetNdf() const
{
// Provide the number of degrees of freedom for the track fit.
return fNdf;
fCode=code;
}
///////////////////////////////////////////////////////////////////////////
-Int_t AliTrack::GetParticleCode()
+Int_t AliTrack::GetParticleCode() const
{
// Provide the user defined particle id code.
return fCode;
fProb=prob;
}
///////////////////////////////////////////////////////////////////////////
-Float_t AliTrack::GetProb()
+Float_t AliTrack::GetProb() const
{
// Provide the hypothesis probability for this track.
return fProb;
}
///////////////////////////////////////////////////////////////////////////
-TObject* AliTrack::Clone(const char* name)
+void AliTrack::SetFitDetails(TObject* obj)
+{
+// Enter the object containing the fit details.
+// In case an object to hold fit details was already present, this
+// will be deleted first before the new one is stored.
+// This means that SetFitDetails(0) can be used to just remove the
+// existing object with the fit details.
+// All objects derived from TObject can be entered in this way.
+// Obvious candidates for objects containing detailed fit information
+// are functions (e.g. TF1) and histograms (e.g. TH1F).
+// However, using an AliDevice object provides a very versatile facility
+// to store the parameters of various fit procedures.
+// In such a case the AliDevice can be used to provide the various fit
+// definitions and the corresponding fit parameters can be entered as
+// separate AliSignal objects which are stored as hits to the AliDevice.
+// In addition various functions and histograms can be linked to the
+// various AliSignal instances
+// The latter procedure is based on the original idea of Adam Bouchta.
+//
+// Note : The entered object is owned by this AliTrack instance.
+// As such, a private copy of obj will be stored using the Clone()
+// memberfunction.
+// In case the entered object contains pointers to other objects,
+// the user has to provide the appropriate Clone() memberfunction
+// for the class to which the entered object belongs.
+// An example can be seen from AliTrack::Clone().
+//
+ if (fFit)
+ {
+ delete fFit;
+ fFit=0;
+ }
+
+ if (obj) fFit=obj->Clone();
+}
+///////////////////////////////////////////////////////////////////////////
+TObject* AliTrack::GetFitDetails()
+{
+// Provide the pointer to the object containing the fit details.
+ return fFit;
+}
+///////////////////////////////////////////////////////////////////////////
+void AliTrack::SetTimestamp(AliTimestamp& t)
+{
+// Store the timestamp for this track.
+ if (fTstamp) delete fTstamp;
+ fTstamp=new AliTimestamp(t);
+}
+///////////////////////////////////////////////////////////////////////////
+AliTimestamp* AliTrack::GetTimestamp()
+{
+// Provide the timestamp of this track.
+ return fTstamp;
+}
+///////////////////////////////////////////////////////////////////////////
+void AliTrack::RemoveTimestamp()
+{
+// Remove the timestamp from this track.
+ if (fTstamp)
+ {
+ delete fTstamp;
+ fTstamp=0;
+ }
+}
+///////////////////////////////////////////////////////////////////////////
+TObject* AliTrack::Clone(const char* name) const
{
// Make a deep copy of the current object and provide the pointer to the copy.
// This memberfunction enables automatic creation of new objects of the