// 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(),
+ AliVVertex(),
fChi2perNDF(-999.),
fID(-1),
fType(kUndef),
+ fNprong(0),
+ fIprong(0),
fCovMatrix(NULL),
- fParent(0x0),
- fDaughters()
+ fParent(),
+ fDaughters(),
+ fProngs(NULL)
{
// default constructor
Double_t chi2perNDF,
TObject *parent,
Short_t id,
- Char_t vtype) :
- TObject(),
+ Char_t vtype,
+ Int_t nprong) :
+ AliVVertex(),
fChi2perNDF(chi2perNDF),
fID(id),
fType(vtype),
+ fNprong(nprong),
+ fIprong(0),
fCovMatrix(NULL),
fParent(parent),
- fDaughters()
+ fDaughters(),
+ fProngs(0)
{
// constructor
SetPosition(position);
if (covMatrix) SetCovMatrix(covMatrix);
+ MakeProngs();
}
//______________________________________________________________________________
Double_t chi2perNDF,
TObject *parent,
Short_t id,
- Char_t vtype) :
+ Char_t vtype,
+ Int_t nprong) :
- TObject(),
+ AliVVertex(),
fChi2perNDF(chi2perNDF),
fID(id),
fType(vtype),
+ fNprong(nprong),
+ fIprong(0),
fCovMatrix(NULL),
fParent(parent),
- fDaughters()
+ fDaughters(),
+ fProngs(0)
{
// constructor
SetPosition(position);
if (covMatrix) SetCovMatrix(covMatrix);
+ MakeProngs();
}
//______________________________________________________________________________
AliAODVertex::AliAODVertex(const Double_t position[3],
Double_t chi2perNDF,
- Char_t vtype) :
- TObject(),
+ Char_t vtype,
+ Int_t nprong) :
+ AliVVertex(),
fChi2perNDF(chi2perNDF),
fID(-1),
fType(vtype),
+ fNprong(nprong),
+ fIprong(0),
fCovMatrix(NULL),
- fParent(0x0),
- fDaughters()
+ fParent(),
+ fDaughters(),
+ fProngs(0)
{
// constructor without covariance matrix
SetPosition(position);
+ MakeProngs();
}
//______________________________________________________________________________
AliAODVertex::AliAODVertex(const Float_t position[3],
Double_t chi2perNDF,
- Char_t vtype) :
- TObject(),
+ Char_t vtype, Int_t nprong) :
+ AliVVertex(),
fChi2perNDF(chi2perNDF),
fID(-1),
fType(vtype),
+ fNprong(nprong),
+ fIprong(0),
fCovMatrix(NULL),
- fParent(0x0),
- fDaughters()
+ fParent(),
+ fDaughters(),
+ fProngs(0)
{
// constructor without covariance matrix
SetPosition(position);
+ MakeProngs();
}
//______________________________________________________________________________
// Destructor
delete fCovMatrix;
+ if (fNprong > 0) delete[] fProngs;
}
//______________________________________________________________________________
AliAODVertex::AliAODVertex(const AliAODVertex& vtx) :
- TObject(vtx),
+ AliVVertex(vtx),
fChi2perNDF(vtx.fChi2perNDF),
fID(vtx.fID),
fType(vtx.fType),
+ fNprong(vtx.fNprong),
+ fIprong(vtx.fIprong),
fCovMatrix(NULL),
fParent(vtx.fParent),
- fDaughters(vtx.fDaughters)
+ fDaughters(vtx.fDaughters),
+ 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];
+ }
}
//______________________________________________________________________________
if (this != &vtx) {
// name and type
- TObject::operator=(vtx);
+ AliVVertex::operator=(vtx);
//momentum
for (int i = 0; i < 3; i++)
//other stuff
fParent = vtx.fParent;
fDaughters = vtx.fDaughters;
+ 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
{
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;
+ }
}
//______________________________________________________________________________
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));
}
}
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);