#include <TDatabasePDG.h>
#include <TVector3.h>
-#include "AliVParticle.h"
+#include "AliLog.h"
+#include "AliVTrack.h"
#include "AliAODRecoDecay.h"
ClassImp(AliAODRecoDecay)
//--------------------------------------------------------------------------
AliAODRecoDecay::AliAODRecoDecay() :
- AliVParticle(),
+ AliVTrack(),
fSecondaryVtx(0x0),
fOwnSecondaryVtx(0x0),
fCharge(0),
Short_t charge,
Double_t *px,Double_t *py,Double_t *pz,
Double_t *d0) :
- AliVParticle(),
+ AliVTrack(),
fSecondaryVtx(vtx2),
fOwnSecondaryVtx(0x0),
fCharge(charge),
AliAODRecoDecay::AliAODRecoDecay(AliAODVertex *vtx2,Int_t nprongs,
Short_t charge,
Double_t *d0) :
- AliVParticle(),
+ AliVTrack(),
fSecondaryVtx(vtx2),
fOwnSecondaryVtx(0x0),
fCharge(charge),
}
//--------------------------------------------------------------------------
AliAODRecoDecay::AliAODRecoDecay(const AliAODRecoDecay &source) :
- AliVParticle(source),
+ AliVTrack(source),
fSecondaryVtx(source.fSecondaryVtx),
fOwnSecondaryVtx(source.fOwnSecondaryVtx),
fCharge(source.fCharge),
Double_t mass = TDatabasePDG::Instance()->GetParticle(pdg)->Mass();
return TMath::Sqrt(mass*mass+PProng(ip)*PProng(ip));
}
-//---------------------------------------------------------------------------
-/*Int_t AliAODRecoDecay::GetIndexProng(Int_t ip) const
-{
- //
- // Index of prong ip
+//--------------------------------------------------------------------------
+Bool_t AliAODRecoDecay::GetCovarianceXYZPxPyPz(Double_t cv[21]) const {
+ //
+ // This function returns the global covariance matrix of the track params
+ //
+ // Cov(x,x) ... : cv[0]
+ // Cov(y,x) ... : cv[1] cv[2]
+ // Cov(z,x) ... : cv[3] cv[4] cv[5]
+ // Cov(px,x)... : cv[6] cv[7] cv[8] cv[9]
+ // Cov(py,x)... : cv[10] cv[11] cv[12] cv[13] cv[14]
+ // Cov(pz,x)... : cv[15] cv[16] cv[17] cv[18] cv[19] cv[20]
+ //
+ // For XYZ we take the cov of the vertex, for PxPyPz we take the
+ // sum of the covs of PxPyPz from the daughters, for the moment
+ // we set the cov between position and momentum as the sum of
+ // the same cov from the daughters.
//
- if(!GetNProngs()) return 999999;
-UShort_t *indices = GetSecondaryVtx()->GetIndices();
- return indices[ip];
-}*/
+
+ Int_t j;
+ for(j=0;j<21;j++) cv[j]=0.;
+
+ if(!GetNDaughters()) {
+ AliError("No daughters available");
+ return kFALSE;
+ }
+
+ Double_t v[6];
+ AliAODVertex *secv=GetSecondaryVtx();
+ if(!secv) {
+ AliError("Vertex covariance matrix not available");
+ return kFALSE;
+ }
+ if(!secv->GetCovMatrix(v)) {
+ AliError("Vertex covariance matrix not available");
+ return kFALSE;
+ }
+
+ Double_t p[21]; for(j=0;j<21;j++) p[j]=0.;
+ Bool_t error=kFALSE;
+ for(Int_t i=1; i<GetNDaughters(); i++) {
+ AliVTrack *daugh = (AliVTrack*)GetDaughter(i);
+ Double_t dcov[21];
+ if(!daugh->GetCovarianceXYZPxPyPz(dcov)) error=kTRUE;
+ for(j=0;j<21;j++) p[j] += dcov[j];
+ }
+ if(error) {
+ AliError("No covariance for at least one daughter")
+ return kFALSE;
+ }
+
+ for(j=0; j<21; j++) {
+ if(j<6) {
+ cv[j] = v[j];
+ } else {
+ cv[j] = p[j];
+ }
+ }
+
+ return kTRUE;
+}
//----------------------------------------------------------------------------
+UChar_t AliAODRecoDecay::GetITSClusterMap() const {
+ //
+ // We take the logical AND of the daughters cluster maps
+ // (only if all daughters have the bit for given layer, we set the bit)
+ //
+ UChar_t map=0;
+
+ if(!GetNDaughters()) {
+ AliError("No daughters available");
+ return map;
+ }
+
+ for(Int_t l=0; l<12; l++) { // loop on ITS layers (from here we cannot know how many they are; let's put 12 to be conservative)
+ Int_t bit = 1;
+ for(Int_t i=0; i<GetNDaughters(); i++) {
+ AliVTrack *daugh = (AliVTrack*)GetDaughter(i);
+ if(!TESTBIT(daugh->GetITSClusterMap(),l)) bit=0;
+ }
+ if(bit) SETBIT(map,l);
+ }
+
+ return map;
+}
+//--------------------------------------------------------------------------
+ULong_t AliAODRecoDecay::GetStatus() const {
+ //
+ // Same as for ITSClusterMap
+ //
+ ULong_t status=0;
+
+ if(!GetNDaughters()) {
+ AliError("No daughters available");
+ return status;
+ }
+
+ AliVTrack *daugh0 = (AliVTrack*)GetDaughter(0);
+ status = status&(daugh0->GetStatus());
+
+ for(Int_t i=1; i<GetNDaughters(); i++) {
+ AliVTrack *daugh = (AliVTrack*)GetDaughter(i);
+ status = status&(daugh->GetStatus());
+ }
+
+ return status;
+}
+//--------------------------------------------------------------------------
Double_t AliAODRecoDecay::ImpParXY(Double_t point[3]) const
{
//
#include <TRef.h>
#include "AliAODVertex.h"
#include "AliAODTrack.h"
-#include "AliVParticle.h"
+#include "AliVTrack.h"
-class AliAODRecoDecay : public AliVParticle {
+class AliAODRecoDecay : public AliVTrack {
public:
Int_t GetEventNumber() const { return fEventNumber; }
Int_t GetRunNumber() const { return fRunNumber; }
+ // methods of AliVTrack
+ virtual Int_t GetID() const { return -1; }
+ virtual UChar_t GetITSClusterMap() const;
+ virtual ULong_t GetStatus() const;
+ virtual Bool_t GetXYZ(Double_t *p) const { return XvYvZv(p); }
+ virtual Bool_t GetCovarianceXYZPxPyPz(Double_t cv[21]) const;
+
// kinematics & topology
Double_t Px() const;
Double_t Py() const;
Double_t ImpParXY(AliAODVertex *vtx1) const;
// prongs
- //Int_t GetNProngs() const {return GetSecondaryVtx()->GetNDaughters();}
- Int_t GetNProngs() const {return fNProngs;}
- TObject *GetDaughter(Int_t i) const {return GetSecondaryVtx()->GetDaughter(i);}
+ Int_t GetNProngs() const {return fNProngs;}
+ Int_t GetNDaughters() const {return GetSecondaryVtx()->GetNDaughters();}
+ TObject *GetDaughter(Int_t i) const {return (GetNDaughters()>i ? GetSecondaryVtx()->GetDaughter(i) : 0x0);}
- Short_t ChargeProng(Int_t ip) const;
+ Short_t ChargeProng(Int_t ip) const;
Double_t Getd0Prong(Int_t ip) const {return fd0[ip];}
Double_t Prodd0d0(Int_t ip1=0,Int_t ip2=0) const {return fd0[ip1]*fd0[ip2];}
Double_t PxProng(Int_t ip) const {return fPx[ip];}
//
- ClassDef(AliAODRecoDecay,3) // base class for AOD reconstructed decays
+ ClassDef(AliAODRecoDecay,4) // base class for AOD reconstructed decays
};