Possibility to propagate tracks to the DCA to the primary vertex at the AOD level...
authorbelikov <belikov@f7af4fe6-9843-0410-8265-dc069ae4e863>
Fri, 18 Jun 2010 12:01:12 +0000 (12:01 +0000)
committerbelikov <belikov@f7af4fe6-9843-0410-8265-dc069ae4e863>
Fri, 18 Jun 2010 12:01:12 +0000 (12:01 +0000)
STEER/AliAODRecoDecay.cxx
STEER/AliAODRecoDecay.h
STEER/AliAODTrack.cxx
STEER/AliAODTrack.h
STEER/AliVTrack.h

index 6e686b2..d7d192b 100644 (file)
@@ -25,6 +25,8 @@
 #include <TClonesArray.h>
 #include "AliLog.h"
 #include "AliVTrack.h"
+#include "AliExternalTrackParam.h"
+#include "AliNeutralTrackParam.h"
 #include "AliAODMCParticle.h"
 #include "AliAODRecoDecay.h"
 
@@ -421,6 +423,27 @@ ULong_t AliAODRecoDecay::GetStatus() const {
   return status;
 }
 //--------------------------------------------------------------------------
+Bool_t AliAODRecoDecay::PropagateToDCA(const AliVVertex* vtx,Double_t b,Double_t maxd,Double_t dz[2],Double_t covar[3]) 
+{
+  // compute impact parameters to the vertex vtx and their covariance matrix
+  // b is the Bz, needed to propagate correctly the track to vertex 
+  // return kFALSE is something went wrong
+
+  AliWarning("The AliAODRecoDecay momentum is not updated to the DCA");
+
+  Bool_t retval=kTRUE;
+  if(Charge()==0) {
+    // convert to AliNeutralTrackParam
+    AliNeutralTrackParam ntp(this);  
+    retval = ntp.PropagateToDCA(vtx,b,maxd,dz,covar);
+  } else {
+    // convert to AliExternalTrackParam
+    AliExternalTrackParam etp(this);  
+    retval = etp.PropagateToDCA(vtx,b,maxd,dz,covar);
+  }
+  return retval;
+}
+//--------------------------------------------------------------------------
 Double_t AliAODRecoDecay::ImpParXY(Double_t point[3]) const 
 {
   //
index d1d6654..944e892 100644 (file)
@@ -16,6 +16,8 @@
 #include "AliAODTrack.h"
 #include "AliVTrack.h"
 
+class AliVVertex;
+
 class AliAODRecoDecay : public AliVTrack {
 
  public:
@@ -77,6 +79,7 @@ class AliAODRecoDecay : public AliVTrack {
   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; 
index b391e8c..99e9d5c 100644 (file)
@@ -22,6 +22,8 @@
 //-------------------------------------------------------------------------
 
 #include "AliLog.h"
+#include "AliExternalTrackParam.h"
+#include "AliVVertex.h"
 #include "AliAODTrack.h"
 
 ClassImp(AliAODTrack)
@@ -522,3 +524,36 @@ Bool_t AliAODTrack::MatchTriggerDigits() const
   return (nMatchedChambers >= 2);
 }
 
+//______________________________________________________________________________
+Bool_t AliAODTrack::PropagateToDCA(const AliVVertex *vtx, 
+    Double_t b, Double_t maxd, Double_t dz[2], Double_t covar[3])
+{
+  // compute impact parameters to the vertex vtx and their covariance matrix
+  // b is the Bz, needed to propagate correctly the track to vertex 
+  // only the track parameters are update after the propagation (pos and mom),
+  // not the covariance matrix. This is OK for propagation over short distance
+  // inside the beam pipe.
+  // return kFALSE is something went wrong
+
+  // convert to AliExternalTrackParam
+  AliExternalTrackParam etp(this);  
+
+  Float_t xstart = etp.GetX();
+  if(xstart>3.) {
+    AliError("This method can be used only for propagation inside the beam pipe");
+    return kFALSE; 
+  }
+
+  if(!etp.PropagateToDCA(vtx,b,maxd,dz,covar)) return kFALSE;
+
+  // update track position and momentum
+  Double_t mom[3];
+  etp.GetPxPyPz(mom);
+  SetP(mom,kTRUE);
+  etp.GetXYZ(mom);
+  SetPosition(mom,kFALSE);
+
+
+  return kTRUE;
+}
+
index abfe63f..5021938 100644 (file)
@@ -18,6 +18,8 @@
 #include "AliAODRedCov.h"
 #include "AliAODPid.h"
 
+class AliVVertex;
+
 class AliAODTrack : public AliVTrack {
 
  public:
@@ -119,6 +121,9 @@ class AliAODTrack : public AliVTrack {
 
   virtual Short_t  Charge() const {return fCharge; }
 
+  virtual Bool_t   PropagateToDCA(const AliVVertex *vtx, 
+         Double_t b, Double_t maxd, Double_t dz[2], Double_t covar[3]);
+
   // PID
   virtual const Double_t *PID() const { return fPID; }
   AODTrkPID_t GetMostProbablePID() const;
@@ -191,6 +196,8 @@ class AliAODTrack : public AliVTrack {
   Double_t GetRAtAbsorberEnd() const { return fRAtAbsorberEnd; }
   
   UChar_t  GetITSClusterMap() const       { return (UChar_t)(fITSMuonClusterMap&0xff); }
+  Int_t    GetITSNcls() const; 
+  Bool_t   HasPointOnITSLayer(Int_t i) const { return TESTBIT(GetITSClusterMap(),i); }
   UShort_t GetHitsPatternInTrigCh() const { return (UShort_t)((fITSMuonClusterMap&0xff00)>>8); }
   UInt_t   GetMUONClusterMap() const      { return (fITSMuonClusterMap&0x3ff0000)>>16; }
   UInt_t   GetITSMUONClusterMap() const   { return fITSMuonClusterMap; }
@@ -263,6 +270,8 @@ class AliAODTrack : public AliVTrack {
   void     SetProdVertex(TObject *vertex) { fProdVertex = vertex; }
   void     SetType(AODTrk_t ttype) { fType=ttype; }
 
+
+
   // Dummy
   Int_t    PdgCode() const {return 0;}
   
@@ -314,4 +323,12 @@ inline Bool_t  AliAODTrack::IsPrimaryCandidate() const
     }
 }
 
+inline Int_t AliAODTrack::GetITSNcls() const 
+{
+  // Number of points in ITS
+  Int_t n=0;
+  for(Int_t i=0;i<6;i++) if(HasPointOnITSLayer(i)) n++;
+  return n;
+}
+
 #endif
index 840282e..1b92894 100644 (file)
@@ -9,8 +9,11 @@
 //     Author: A. Dainese
 //-------------------------------------------------------------------------
 
+#include <TBits.h>
+
 #include "AliVParticle.h"
 
+class AliVVertex;
 
 class AliVTrack: public AliVParticle {
 
@@ -28,6 +31,7 @@ public:
   virtual Double_t GetBz() const;
   virtual void     GetBxByBz(Double_t b[3]) const;
   virtual Bool_t   GetCovarianceXYZPxPyPz(Double_t cv[21]) const = 0;
+  virtual Bool_t   PropagateToDCA(const AliVVertex *vtx,Double_t b,Double_t maxd,Double_t dz[2],Double_t covar[3]) = 0;
 
   ClassDef(AliVTrack,1)  // base class for tracks
 };