]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - STEER/AliAODRecoDecay.h
following coverity, fix for case of invalid DET string passed to GetNalignable
[u/mrichter/AliRoot.git] / STEER / AliAODRecoDecay.h
index fac92c10bd4694e486426c7e7311397ba435eb2f..917a16fbb6abfdfc5289b7ea770ada3ae74edbf7 100644 (file)
 
 #include <TMath.h>
 #include <TRef.h>
+#include <TClonesArray.h>
 #include "AliAODVertex.h"
-#include "AliVParticle.h"
+#include "AliAODTrack.h"
+#include "AliVTrack.h"
 
-class AliAODRecoDecay : public AliVParticle {
+class AliVVertex;
+
+class AliAODRecoDecay : public AliVTrack {
 
  public:
 
@@ -36,13 +40,22 @@ class AliAODRecoDecay : public AliVParticle {
   Double_t GetSecVtxZ() const {return GetSecondaryVtx()->GetZ();}
   Double_t RadiusSecVtx() const;
   void     SetSecondaryVtx(AliAODVertex *vtx2) {fSecondaryVtx=vtx2;}
-  AliAODVertex* GetSecondaryVtx() const {return (AliAODVertex*)fSecondaryVtx.GetObject();}
+  AliAODVertex* GetSecondaryVtx() const { return (((AliAODVertex*)fSecondaryVtx.GetObject()) ? (AliAODVertex*)fSecondaryVtx.GetObject() : GetOwnSecondaryVtx()); }
+  void     SetOwnSecondaryVtx(AliAODVertex *vtx2) {fOwnSecondaryVtx=vtx2;}
+  AliAODVertex* GetOwnSecondaryVtx() const {return fOwnSecondaryVtx;}
   void     GetSecondaryVtx(Double_t vtx[3]) const;
   Double_t GetReducedChi2() const {return GetSecondaryVtx()->GetChi2perNDF();}
   Short_t  Charge() const {return fCharge;}
   Short_t  GetCharge() const {return fCharge;}
   void     SetCharge(Short_t charge=0) {fCharge=charge;}
 
+  // Match to MC signal:
+  // check if this candidate is matched to a MC signal
+  // If no, return -1
+  // If yes, return label (>=0) of the AliAODMCParticle
+  // if ndgCk>0, checks also daughters PDGs
+  Int_t    MatchToMC(Int_t pdgabs,TClonesArray *mcArray,Int_t ndgCk=0,Int_t *pdgDg=0) const;
+
   // PID
   void      SetPID(Int_t nprongs,Double_t *pid);
   Double_t *GetPID() const { return fPID; }
@@ -60,6 +73,14 @@ class AliAODRecoDecay : public AliVParticle {
   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;
+  virtual Bool_t   PropagateToDCA(const AliVVertex* vtx,Double_t b,Double_t maxd,Double_t dz[2],Double_t covar[3]);
+
   // kinematics & topology
   Double_t Px() const; 
   Double_t Py() const;
@@ -103,12 +124,14 @@ class AliAODRecoDecay : public AliVParticle {
   Double_t ImpParXY(AliAODVertex *vtx1) const;
 
   // prongs
-  //Int_t   GetNProngs() const {return GetSecondaryVtx()->GetNDaughters();}
-  Int_t   GetNProngs() const {return fNProngs;}
+  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];} 
+  void     SetPxPyPzProngs(Int_t nprongs,Double_t *px,Double_t *py,Double_t *pz);
   Double_t PxProng(Int_t ip) const {return fPx[ip];}
   Double_t PyProng(Int_t ip) const {return fPy[ip];}
   Double_t PzProng(Int_t ip) const {return fPz[ip];}
@@ -149,10 +172,16 @@ class AliAODRecoDecay : public AliVParticle {
     {printf("Dummy function; use AliAODRecoDecay::Y(UInt_t pdg) instead"); return (Double_t)-999.;}
   Double_t M() const 
     {printf("Dummy function"); return (Double_t)-999.;}
-
+  Int_t GetLabel() const {return -1;}
+  Int_t PdgCode()  const {return  0;}
+  
  protected:
 
+  Int_t    MatchToMC(Int_t pdgabs,TClonesArray *mcArray,Int_t dgLabels[10],Int_t ndg,Int_t ndgCk=0,Int_t *pdgDg=0) const;
+  Int_t    MatchToMC(Int_t pdgabs,TClonesArray *mcArray,Int_t dgLabels[10]) const { return MatchToMC(pdgabs,mcArray,dgLabels,GetNDaughters()); }
+
   TRef     fSecondaryVtx;  // decay vertex
+  AliAODVertex *fOwnSecondaryVtx;  // temporary solution (to work outside AliAODEvent)
   Short_t  fCharge;  // charge, use this convention for prongs charges:
                      // if(charge== 0) even-index prongs are +
                      //                odd-index prongs are -
@@ -179,14 +208,13 @@ class AliAODRecoDecay : public AliVParticle {
   Int_t fRunNumber;
   // TO BE PUT IN SPECIAL MC CLASS
   //Bool_t   fSignal; // TRUE if signal, FALSE if background (for simulation)
-  //Int_t    fEvent;  // number of the event this candidate comes from
   //Int_t  fTrkNum[2]; // numbers of the two decay tracks  
   //Int_t fPdg[2];  // PDG codes of the two tracks (for sim.)
   //Int_t fMum[2];  // PDG codes of the mothers    (for sim.)
 
   //
 
-  ClassDef(AliAODRecoDecay,2)  // base class for AOD reconstructed decays
+  ClassDef(AliAODRecoDecay,4)  // base class for AOD reconstructed decays
 };
 
 
@@ -291,6 +319,26 @@ inline Double_t AliAODRecoDecay::QtProngFlightLine(Int_t ip,AliAODVertex *vtx1)
   return QtProngFlightLine(ip,v);
 }
 
+inline void AliAODRecoDecay::SetPxPyPzProngs(Int_t nprongs,Double_t *px,Double_t *py,Double_t *pz) 
+{
+  if(nprongs!=GetNProngs()) { 
+    printf("Wrong number of momenta, must be nProngs");
+    return;
+  }
+  if(!fPx) {
+    fPx = new Double32_t[nprongs];
+    fPy = new Double32_t[nprongs];
+    fPz = new Double32_t[nprongs];
+  }
+  for(Int_t i=0;i<nprongs;i++) {
+    fPx[i] = px[i]; 
+    fPy[i] = py[i]; 
+    fPz[i] = pz[i]; 
+  }
+
+  return;
+}
+
 inline void AliAODRecoDecay::SetDCAs(Int_t nDCA,Double_t *dca) 
 {
   if(nDCA!=(GetNProngs()*(GetNProngs()-1)/2)) { 
@@ -298,6 +346,7 @@ inline void AliAODRecoDecay::SetDCAs(Int_t nDCA,Double_t *dca)
     return;
   }
   if(fDCA) delete [] fDCA;
+  fNDCA = nDCA;
   fDCA = new Double32_t[nDCA];
   for(Int_t i=0;i<nDCA;i++) 
     fDCA[i] = dca[i]; 
@@ -318,6 +367,7 @@ inline void AliAODRecoDecay::SetPID(Int_t nprongs,Double_t *pid)
     return;
   }
   if(fPID) delete [] fPID;
+  fNPID = nprongs*5;
   fPID = new Double32_t[nprongs*5];
   for(Int_t i=0;i<nprongs;i++) 
     for(Int_t j=0;j<5;j++)
@@ -335,3 +385,4 @@ inline void AliAODRecoDecay::GetPIDProng(Int_t ip,Double_t *pid) const
 
 
 #endif
+