]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - STEER/AliAODRecoDecay.h
silvermy@ornl.gov - SMcalib - directory with tools for SuperModule calibrations at...
[u/mrichter/AliRoot.git] / STEER / AliAODRecoDecay.h
index a4dd21fd6c078dda008ed3440470e367d34fd135..cc6c5bbeb150d90c74186f46316f1ffa349a091e 100644 (file)
@@ -10,6 +10,7 @@
 //***********************************************************
 
 #include <TMath.h>
+#include <TRef.h>
 #include "AliAODVertex.h"
 #include "AliVParticle.h"
 
@@ -30,14 +31,16 @@ class AliAODRecoDecay : public AliVParticle {
    
 
   // decay vertex
-  Double_t GetSecVtxX() const {return fSecondaryVtx->GetX();}
-  Double_t GetSecVtxY() const {return fSecondaryVtx->GetY();}
-  Double_t GetSecVtxZ() const {return fSecondaryVtx->GetZ();}
+  Double_t GetSecVtxX() const {return GetSecondaryVtx()->GetX();}
+  Double_t GetSecVtxY() const {return GetSecondaryVtx()->GetY();}
+  Double_t GetSecVtxZ() const {return GetSecondaryVtx()->GetZ();}
   Double_t RadiusSecVtx() const;
   void     SetSecondaryVtx(AliAODVertex *vtx2) {fSecondaryVtx=vtx2;}
-  AliAODVertex* GetSecondaryVtx() const {return fSecondaryVtx;}
+  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 fSecondaryVtx->GetChi2perNDF();}
+  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;}
@@ -49,9 +52,9 @@ class AliAODRecoDecay : public AliVParticle {
   virtual const Double_t *PID() const { return fPID; }
 
   // prong-to-prong DCAs
-  void    SetDCAs(Int_t nDCA,Float_t *dca);
-  void    SetDCA(Float_t dca); // 2 prong
-  Float_t GetDCA(Int_t i=0) const {return fDCA[i];}
+  void    SetDCAs(Int_t nDCA,Double_t *dca);
+  void    SetDCA(Double_t dca); // 2 prong
+  Double_t GetDCA(Int_t i=0) const {return fDCA[i];}
 
   //event and run number
   void SetEventRunNumbers(Int_t en,Int_t rn) 
@@ -66,23 +69,28 @@ class AliAODRecoDecay : public AliVParticle {
   Double_t P() const {return TMath::Sqrt(Px()*Px()+Py()*Py()+Pz()*Pz());}
   Double_t Pt() const {return TMath::Sqrt(Px()*Px()+Py()*Py());}
   Double_t OneOverPt() const {return (Pt() ? 1./Pt() : 0.);}
+  Bool_t   PxPyPz(Double_t p[3]) const { p[0] = Px(); p[1] = Py(); p[2] = Pz(); return kTRUE; }
   Double_t Phi() const {return TMath::Pi()+TMath::ATan2(-Py(),-Px());}
   Double_t Theta() const {return 0.5*TMath::Pi()-TMath::ATan(Pz()/(Pt()+1.e-13));}
   Double_t Eta() const {return 0.5*TMath::Log((P()+Pz())/(P()-Pz()+1.e-13));}
+  Double_t Xv() const { return GetSecVtxX(); }
+  Double_t Yv() const { return GetSecVtxY(); }
+  Double_t Zv() const { return GetSecVtxZ(); }
+  virtual Bool_t   XvYvZv(Double_t x[3]) const { x[0] = Xv(); x[1] = Yv(); x[2] = Zv(); return kTRUE; }
   Double_t E(UInt_t pdg) const;
   Double_t Y(UInt_t pdg) const {return 0.5*TMath::Log((E(pdg)+Pz())/(E(pdg)-Pz()+1.e-13));}
   Double_t DecayLength(Double_t point[3]) const;
   Double_t DecayLength(AliAODVertex *vtx1) const
-    {return fSecondaryVtx->DistanceToVertex(vtx1);}
+  {return GetSecondaryVtx()->DistanceToVertex(vtx1);}
   Double_t DecayLengthError(AliAODVertex *vtx1) const
-    {return fSecondaryVtx->ErrorDistanceToVertex(vtx1);}
+    {return GetSecondaryVtx()->ErrorDistanceToVertex(vtx1);}
   Double_t NormalizedDecayLength(AliAODVertex *vtx1) const 
     {return DecayLength(vtx1)/DecayLengthError(vtx1);}
   Double_t DecayLengthXY(Double_t point[3]) const;
   Double_t DecayLengthXY(AliAODVertex *vtx1) const
-    {return fSecondaryVtx->DistanceXYToVertex(vtx1);}
+    {return GetSecondaryVtx()->DistanceXYToVertex(vtx1);}
   Double_t DecayLengthXYError(AliAODVertex *vtx1) const
-    {return fSecondaryVtx->ErrorDistanceXYToVertex(vtx1);}
+    {return GetSecondaryVtx()->ErrorDistanceXYToVertex(vtx1);}
   Double_t NormalizedDecayLengthXY(AliAODVertex *vtx1) const 
     {return DecayLengthXY(vtx1)/DecayLengthXYError(vtx1);}
   Double_t Ct(UInt_t pdg,Double_t point[3]) const;
@@ -97,7 +105,7 @@ class AliAODRecoDecay : public AliVParticle {
   Double_t ImpParXY(AliAODVertex *vtx1) const;
 
   // prongs
-  //Int_t   GetNProngs() const {return fSecondaryVtx->GetNDaughters();}
+  //Int_t   GetNProngs() const {return GetSecondaryVtx()->GetNDaughters();}
   Int_t   GetNProngs() const {return fNProngs;}
 
   Short_t ChargeProng(Int_t ip) const;
@@ -134,7 +142,7 @@ class AliAODRecoDecay : public AliVParticle {
 
   // print
   void    Print(Option_t* option = "") const;
-  //void    PrintIndices() const {fSecondaryVtx->PrintIndices();}
+  //void    PrintIndices() const {GetSecondaryVtx()->PrintIndices();}
 
   // dummy functions for inheritance from AliVParticle
   Double_t E() const 
@@ -143,44 +151,44 @@ 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;}
  protected:
 
-  AliAODVertex *fSecondaryVtx;  // decay vertex
-  Short_t  fCharge; // charge, use this convention for prongs charges:
-                    // if(charge== 0) even-index prongs are +
-                    //                odd-index prongs are -
-                    // if(charge==+1) even-index prongs are +
-                    //                odd-index prongs are -
-                    // if(charge==-1) even-index prongs are -
-                    //                odd-index prongs are +
+  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 -
+                     // if(charge==+1) even-index prongs are +
+                     //                odd-index prongs are -
+                     // if(charge==-1) even-index prongs are -
+                     //                odd-index prongs are +
 
   // TEMPORARY, to be removed when we do analysis on AliAODEvent
-  Int_t fNProngs;  // number of prongs
-  Int_t fNDCA;     // number of dca's
-  Int_t fNPID;     // number of PID probabilities
-  Double_t *fPx;   //[fNProngs] px of tracks at the vertex [GeV/c]
-  Double_t *fPy;   //[fNProngs] py of tracks at the vertex [GeV/c]
-  Double_t *fPz;   //[fNProngs] pz of tracks at the vertex [GeV/c]
-  Double_t *fd0;   //[fNProngs] rphi impact params w.r.t. Primary Vtx [cm]
-  Float_t *fDCA;   //[fNDCA] prong-to-prong DCA [cm]
-                   // convention:fDCA[0]=p0p1,fDCA[1]=p0p2,fDCA[2]=p1p2,...
-  Double_t *fPID;  //[fNPID] combined pid
-                   //  (combined detector response probabilities)
+  Int_t fNProngs;    // number of prongs
+  Int_t fNDCA;       // number of dca's
+  Int_t fNPID;       // number of PID probabilities
+  Double32_t *fPx;   //[fNProngs] px of tracks at the vertex [GeV/c]
+  Double32_t *fPy;   //[fNProngs] py of tracks at the vertex [GeV/c]
+  Double32_t *fPz;   //[fNProngs] pz of tracks at the vertex [GeV/c]
+  Double32_t *fd0;   //[fNProngs] rphi impact params w.r.t. Primary Vtx [cm]
+  Double32_t *fDCA;  //[fNDCA] prong-to-prong DCA [cm]
+                     // convention:fDCA[0]=p0p1,fDCA[1]=p0p2,fDCA[2]=p1p2,...
+  Double32_t *fPID;  //[fNPID] combined pid
+                     //  (combined detector response probabilities)
                             
   // TEMPORARY, to be removed when we do analysis on AliAODEvent
   Int_t fEventNumber;
   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,1)  // base class for AOD reconstructed decays
+  ClassDef(AliAODRecoDecay,3)  // base class for AOD reconstructed decays
 };
 
 
@@ -208,7 +216,7 @@ inline Double_t AliAODRecoDecay::RadiusSecVtx() const
 
 inline void AliAODRecoDecay::GetSecondaryVtx(Double_t vtx[3]) const 
 {
-  fSecondaryVtx->GetPosition(vtx);
+  GetSecondaryVtx()->GetPosition(vtx);
   return;
 }
 
@@ -285,22 +293,23 @@ inline Double_t AliAODRecoDecay::QtProngFlightLine(Int_t ip,AliAODVertex *vtx1)
   return QtProngFlightLine(ip,v);
 }
 
-inline void AliAODRecoDecay::SetDCAs(Int_t nDCA,Float_t *dca) 
+inline void AliAODRecoDecay::SetDCAs(Int_t nDCA,Double_t *dca) 
 {
   if(nDCA!=(GetNProngs()*(GetNProngs()-1)/2)) { 
     printf("Wrong number of DCAs, must be nProngs*(nProngs-1)/2");
     return;
   }
   if(fDCA) delete [] fDCA;
-  fDCA = new Float_t[nDCA];
+  fNDCA = nDCA;
+  fDCA = new Double32_t[nDCA];
   for(Int_t i=0;i<nDCA;i++) 
     fDCA[i] = dca[i]; 
   return;
 }
 
-inline void AliAODRecoDecay::SetDCA(Float_t dca) 
+inline void AliAODRecoDecay::SetDCA(Double_t dca) 
 {
-  Float_t ddca[1]; ddca[0]=dca;
+  Double_t ddca[1]; ddca[0]=dca;
   SetDCAs(1,ddca);
   return;
 }
@@ -312,7 +321,8 @@ inline void AliAODRecoDecay::SetPID(Int_t nprongs,Double_t *pid)
     return;
   }
   if(fPID) delete [] fPID;
-  fPID = new Double_t[nprongs*5];
+  fNPID = nprongs;
+  fPID = new Double32_t[nprongs*5];
   for(Int_t i=0;i<nprongs;i++) 
     for(Int_t j=0;j<5;j++)
       fPID[i*5+j] = pid[i*5+j];