// Base class for Analysis Object Data
// Generic version
// Author: Markus Oldenburg, CERN
+// Inheritance from AliVVertex: A. Dainese
//-------------------------------------------------------------------------
#include "AliAODVertex.h"
+#include "AliAODTrack.h"
ClassImp(AliAODVertex)
//______________________________________________________________________________
AliAODVertex::AliAODVertex() :
- TObject(),
- fChi2(-999.),
+ AliVVertex(),
+ fChi2perNDF(-999.),
+ fID(-1),
+ fType(kUndef),
+ fNprong(0),
+ fIprong(0),
+ fNContributors(0),
fCovMatrix(NULL),
- fParent(0x0),
+ fParent(),
fDaughters(),
- fType(kUndef)
- {
+ fProngs(NULL)
+ {
// default constructor
fPosition[0] = fPosition[1] = fPosition[2] = -999.;
//______________________________________________________________________________
AliAODVertex::AliAODVertex(const Double_t position[3],
- const Double_t covMatrix[6],
- Double_t chi2,
+ const Double_t covMatrix[6],
+ Double_t chi2perNDF,
TObject *parent,
- Char_t vtype) :
- TObject(),
- fChi2(chi2),
+ Short_t id,
+ Char_t vtype,
+ Int_t nprong) :
+ AliVVertex(),
+ fChi2perNDF(chi2perNDF),
+ fID(id),
+ fType(vtype),
+ fNprong(nprong),
+ fIprong(0),
+ fNContributors(0),
fCovMatrix(NULL),
fParent(parent),
fDaughters(),
- fType(vtype)
+ fProngs(0)
{
// constructor
SetPosition(position);
if (covMatrix) SetCovMatrix(covMatrix);
+ MakeProngs();
}
//______________________________________________________________________________
AliAODVertex::AliAODVertex(const Float_t position[3],
const Float_t covMatrix[6],
- Double_t chi2,
+ Double_t chi2perNDF,
TObject *parent,
- Char_t vtype) :
- TObject(),
- fChi2(chi2),
+ Short_t id,
+ Char_t vtype,
+ Int_t nprong) :
+
+ AliVVertex(),
+ fChi2perNDF(chi2perNDF),
+ fID(id),
+ fType(vtype),
+ fNprong(nprong),
+ fIprong(0),
+ fNContributors(0),
fCovMatrix(NULL),
fParent(parent),
fDaughters(),
- fType(vtype)
+ fProngs(0)
{
// constructor
SetPosition(position);
if (covMatrix) SetCovMatrix(covMatrix);
+ MakeProngs();
}
//______________________________________________________________________________
AliAODVertex::AliAODVertex(const Double_t position[3],
- Double_t chi2,
- Char_t vtype) :
- TObject(),
- fChi2(chi2),
+ Double_t chi2perNDF,
+ Char_t vtype,
+ Int_t nprong) :
+ AliVVertex(),
+ fChi2perNDF(chi2perNDF),
+ fID(-1),
+ fType(vtype),
+ fNprong(nprong),
+ fIprong(0),
+ fNContributors(0),
fCovMatrix(NULL),
- fParent(0x0),
+ fParent(),
fDaughters(),
- fType(vtype)
+ fProngs(0)
{
// constructor without covariance matrix
SetPosition(position);
+ MakeProngs();
}
//______________________________________________________________________________
AliAODVertex::AliAODVertex(const Float_t position[3],
- Double_t chi2,
- Char_t vtype) :
- TObject(),
- fChi2(chi2),
+ Double_t chi2perNDF,
+ Char_t vtype, Int_t nprong) :
+ AliVVertex(),
+ fChi2perNDF(chi2perNDF),
+ fID(-1),
+ fType(vtype),
+ fNprong(nprong),
+ fIprong(0),
+ fNContributors(0),
fCovMatrix(NULL),
- fParent(0x0),
+ fParent(),
fDaughters(),
- fType(vtype)
+ fProngs(0)
{
// constructor without covariance matrix
SetPosition(position);
+ MakeProngs();
}
//______________________________________________________________________________
// Destructor
delete fCovMatrix;
+ if (fNprong > 0) delete[] fProngs;
}
//______________________________________________________________________________
AliAODVertex::AliAODVertex(const AliAODVertex& vtx) :
- TObject(vtx),
- fChi2(vtx.fChi2),
+ AliVVertex(vtx),
+ fChi2perNDF(vtx.fChi2perNDF),
+ fID(vtx.fID),
+ fType(vtx.fType),
+ fNprong(vtx.fNprong),
+ fIprong(vtx.fIprong),
+ fNContributors(vtx.fNContributors),
fCovMatrix(NULL),
fParent(vtx.fParent),
fDaughters(vtx.fDaughters),
- fType(vtx.fType)
+ fProngs(0)
{
// Copy constructor.
fPosition[i] = vtx.fPosition[i];
if (vtx.fCovMatrix) fCovMatrix=new AliAODRedCov<3>(*vtx.fCovMatrix);
+ MakeProngs();
+ for (int i = 0; i < fNprong; i++) {
+ fProngs[i] = vtx.fProngs[i];
+ }
+}
+
+//______________________________________________________________________________
+AliAODVertex* AliAODVertex::CloneWithoutRefs() const
+{
+ // Special method to copy all but the refs
+
+ Double_t cov[6] = { 0.0 };
+
+ if (fCovMatrix) fCovMatrix->GetCovMatrix(cov);
+
+ AliAODVertex* v = new AliAODVertex(fPosition,
+ cov,
+ fChi2perNDF,
+ 0x0,
+ fID,
+ fType,
+ 0);
+
+ v->SetNContributors(fNContributors);
+
+ return v;
}
//______________________________________________________________________________
if (this != &vtx) {
// name and type
- TObject::operator=(vtx);
+ AliVVertex::operator=(vtx);
//momentum
for (int i = 0; i < 3; i++)
fPosition[i] = vtx.fPosition[i];
- fChi2 = vtx.fChi2;
+ fChi2perNDF = vtx.fChi2perNDF;
+ fID = vtx.fID;
+ fType = vtx.fType;
//covariance matrix
delete fCovMatrix;
//other stuff
fParent = vtx.fParent;
fDaughters = vtx.fDaughters;
- fType = vtx.fType;
+ fNprong = vtx.fNprong;
+ fIprong = vtx.fIprong;
+
+ MakeProngs();
+ for (int i = 0; i < fNprong; i++) {
+ fProngs[i] = vtx.fProngs[i];
+ }
}
return *this;
}
+//______________________________________________________________________________
+void AliAODVertex::AddDaughter(TObject *daughter)
+{
+ // Add reference to daughter track
+ if (!fProngs) {
+ if (fDaughters.GetEntries()==0) {
+ TRefArray* arr = &fDaughters;
+ new(arr)TRefArray(TProcessID::GetProcessWithUID(daughter));
+ }
+ fDaughters.Add(daughter);
+ } else {
+ if (fIprong < fNprong) {
+ fProngs[fIprong++] = daughter;
+ } else {
+ AliWarning("Number of daughters out of range !\n");
+ }
+ }
+ return;
+}
+
+
//______________________________________________________________________________
template <class T> void AliAODVertex::GetSigmaXYZ(T sigma[3]) const
{
*/
}
+//______________________________________________________________________________
+Int_t AliAODVertex::GetNContributors() const
+{
+ // Returns the number of tracks used to fit this vertex.
+ Int_t cont = 0;
+
+ TString vtitle = GetTitle();
+ if (!vtitle.Contains("VertexerTracks")) {
+ cont = fNContributors;
+ } else {
+ for (Int_t iDaug = 0; iDaug < GetNDaughters(); iDaug++) {
+ AliAODTrack* aodT = dynamic_cast<AliAODTrack*>(fDaughters.At(iDaug));
+ if (!aodT) continue;
+ if (aodT->GetUsedForPrimVtxFit()) cont++;
+ }
+ // the constraint adds another DOF
+ if(vtitle.Contains("VertexerTracksWithConstraint"))cont++;
+ }
+ return cont;
+}
+
//______________________________________________________________________________
Bool_t AliAODVertex::HasDaughter(TObject *daughter) const
{
// Checks if the given daughter (particle) is part of this vertex.
-
- TRefArrayIter iter(&fDaughters);
- while (TObject *daugh = iter.Next()) {
- if (daugh == daughter) return kTRUE;
- }
- return kFALSE;
+ if (!fProngs) {
+ TRefArrayIter iter(&fDaughters);
+ while (TObject *daugh = iter.Next()) {
+ if (daugh == daughter) return kTRUE;
+ }
+ return kFALSE;
+ } else {
+ Bool_t has = kFALSE;
+ for (int i = 0; i < fNprong; i++) {
+ if (fProngs[i].GetObject() == daughter) has = kTRUE;
+ }
+ return has;
+ }
}
//______________________________________________________________________________
}
//______________________________________________________________________________
-Double_t AliAODVertex::DistanceToVertex(AliAODVertex *vtx) const
+Double_t AliAODVertex::Distance2ToVertex(const AliAODVertex *vtx) const
{
// distance in 3D to another AliAODVertex
Double_t dy = GetY()-vtx->GetY();
Double_t dz = GetZ()-vtx->GetZ();
- return TMath::Sqrt(dx*dx+dy*dy+dz*dz);
+ return dx*dx+dy*dy+dz*dz;
}
//______________________________________________________________________________
-Double_t AliAODVertex::DistanceXYToVertex(AliAODVertex *vtx) const
+Double_t AliAODVertex::DistanceXY2ToVertex(const AliAODVertex *vtx) const
{
// distance in XY to another AliAODVertex
Double_t dx = GetX()-vtx->GetX();
Double_t dy = GetY()-vtx->GetY();
- return TMath::Sqrt(dx*dx+dy*dy);
+ return dx*dx+dy*dy;
}
//______________________________________________________________________________
-Double_t AliAODVertex::ErrorDistanceToVertex(AliAODVertex *vtx) const
+Double_t AliAODVertex::Error2DistanceToVertex(AliAODVertex *vtx) const
{
// error on the distance in 3D to another AliAODVertex
// error2 due to vtx vertex
Double_t error2vtx = vtx->RotatedCovMatrixXX(phi,theta);
- return TMath::Sqrt(error2+error2vtx);
+ return error2+error2vtx;
}
//______________________________________________________________________________
-Double_t AliAODVertex::ErrorDistanceXYToVertex(AliAODVertex *vtx) const
+Double_t AliAODVertex::Error2DistanceXYToVertex(AliAODVertex *vtx) const
{
// error on the distance in XY to another AliAODVertex
// error2 due to vtx vertex
Double_t error2vtx = vtx->RotatedCovMatrixXX(phi);
- return TMath::Sqrt(error2+error2vtx);
+ return error2+error2vtx;
}
//______________________________________________________________________________
// rotation angles around z-axis (phi) and around new y-axis (theta)
// with which vtx is seen (used by RotatedCovMatrix... methods)
- phi = TMath::ATan2(vtx->GetY()-GetY(),vtx->GetX()-GetX());
+ phi = TMath::Pi()+TMath::ATan2(-vtx->GetY()+GetY(),-vtx->GetX()+GetX());
Double_t vtxxphi = vtx->GetX()*TMath::Cos(phi)+vtx->GetY()*TMath::Sin(phi);
Double_t xphi = GetX()*TMath::Cos(phi)+GetY()*TMath::Sin(phi);
theta = TMath::ATan2(vtx->GetZ()-GetZ(),vtxxphi-xphi);
TRefArrayIter iter(&fDaughters);
while (TObject *daugh = iter.Next()) {
- printf("Particle %p originates from this vertex.\n", daugh);
+ printf("Particle %p originates from this vertex.\n", static_cast<void*>(daugh));
}
}
+//______________________________________________________________________________
+const char* AliAODVertex::AsString() const
+{
+ // Make a string describing this object
+
+ TString tmp(Form("%10s pos(%7.2f,%7.2f,%7.2f)",GetTypeName((AODVtx_t)GetType()),GetX(),GetY(),GetZ()));
+
+ if (GetType()==kPrimary || GetType()==kMainSPD || GetType()==kPileupSPD )
+ {
+ tmp += Form(" ncontrib %d chi2/ndf %4.1f",GetNContributors(),GetChi2perNDF());
+
+ }
+
+ if ( !fParent.GetObject() )
+ {
+ tmp += " no parent";
+ }
+ if ( fDaughters.GetEntriesFast() > 0 )
+ {
+ if ( fDaughters.GetEntriesFast() == 1 )
+ {
+ tmp += " origin of 1 particle";
+ }
+ else
+ {
+ tmp += Form(" origin of %2d particles",fDaughters.GetEntriesFast());
+ }
+ }
+
+ return tmp.Data();
+}
+
+//______________________________________________________________________________
+const char* AliAODVertex::GetTypeName(AODVtx_t type)
+{
+ // Return an ASCII version of type
+
+ switch (type)
+ {
+ case kPrimary:
+ return "primary";
+ break;
+ case kKink:
+ return "kink";
+ break;
+ case kV0:
+ return "v0";
+ break;
+ case kCascade:
+ return "cascade";
+ break;
+ case kMainSPD:
+ return "mainSPD";
+ break;
+ case kPileupSPD:
+ return "pileupSPD";
+ break;
+ case kPileupTracks:
+ return "pileupTRK";
+ break;
+ case kMainTPC:
+ return "mainTPC";
+ break;
+ default:
+ return "unknown";
+ break;
+ };
+}
+
//______________________________________________________________________________
void AliAODVertex::Print(Option_t* /*option*/) const
{
printf(" x = %f\n", fPosition[0]);
printf(" y = %f\n", fPosition[1]);
printf(" z = %f\n", fPosition[2]);
- printf(" parent particle: %p\n", fParent.GetObject());
+ printf(" parent particle: %p\n", static_cast<void*>(fParent.GetObject()));
printf(" origin of %d particles\n", fDaughters.GetEntriesFast());
printf(" vertex type %d\n", fType);
fCovMatrix[4],
fCovMatrix[5]);
} */
- printf(" Chi^2 = %f\n", fChi2);
+ printf(" Chi^2/NDF = %f\n", fChi2perNDF);
}