AliESDMuonTrack:
authorhristov <hristov@f7af4fe6-9843-0410-8265-dc069ae4e863>
Fri, 23 Nov 2007 17:41:30 +0000 (17:41 +0000)
committerhristov <hristov@f7af4fe6-9843-0410-8265-dc069ae4e863>
Fri, 23 Nov 2007 17:41:30 +0000 (17:41 +0000)
- Added track parameters at DCA
- Added TClonesArray of clusters associated to the track

AliESDMuonCluster:
- New class to store reduced MUON clusters in ESD

Philippe

STEER/AliESDMuonCluster.cxx [new file with mode: 0644]
STEER/AliESDMuonCluster.h [new file with mode: 0644]
STEER/AliESDMuonTrack.cxx
STEER/AliESDMuonTrack.h
STEER/ESDLinkDef.h
STEER/libESD.pkg

diff --git a/STEER/AliESDMuonCluster.cxx b/STEER/AliESDMuonCluster.cxx
new file mode 100644 (file)
index 0000000..57fb9f6
--- /dev/null
@@ -0,0 +1,86 @@
+/**************************************************************************
+* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
+*                                                                        *
+* Author: The ALICE Off-line Project.                                    *
+* Contributors are mentioned in the code where appropriate.              *
+*                                                                        *
+* Permission to use, copy, modify and distribute this software and its   *
+* documentation strictly for non-commercial purposes is hereby granted   *
+* without fee, provided that the above copyright notice appears in all   *
+* copies and that both the copyright notice and this permission notice   *
+* appear in the supporting documentation. The authors make no claims     *
+* about the suitability of this software for any purpose. It is          *
+* provided "as is" without express or implied warranty.                  *
+**************************************************************************/
+
+// $Id$
+
+//-----------------------------------------------------------------------------
+/// \class AliESDMuonCluster
+///
+/// Class to describe the MUON clusters in the Event Summary Data
+///
+/// \author Philippe Pillot, Subatech
+//-----------------------------------------------------------------------------
+
+#include "AliESDMuonCluster.h"
+
+#include "AliLog.h"
+
+#include <Riostream.h>
+
+/// \cond CLASSIMP
+ClassImp(AliESDMuonCluster)
+/// \endcond
+
+//_____________________________________________________________________________
+AliESDMuonCluster::AliESDMuonCluster()
+: TObject()
+{
+  /// default constructor
+  fXYZ[0] = fXYZ[1] = fXYZ[2] = 0.;
+  fErrXY[0] = fErrXY[1] = 0.;
+}
+
+//_____________________________________________________________________________
+AliESDMuonCluster::AliESDMuonCluster (const AliESDMuonCluster& cluster)
+: TObject(cluster)
+{
+  /// Copy constructor
+  fXYZ[0] = cluster.fXYZ[0];
+  fXYZ[1] = cluster.fXYZ[1];
+  fXYZ[2] = cluster.fXYZ[2];
+  fErrXY[0] = cluster.fErrXY[0];
+  fErrXY[1] = cluster.fErrXY[1];
+}
+
+//_____________________________________________________________________________
+AliESDMuonCluster& AliESDMuonCluster::operator=(const AliESDMuonCluster& cluster)
+{
+  /// Equal operator
+  if (this == &cluster) return *this;
+  
+  TObject::operator=(cluster); // don't forget to invoke the base class' assignment operator
+  
+  fXYZ[0] = cluster.fXYZ[0];
+  fXYZ[1] = cluster.fXYZ[1];
+  fXYZ[2] = cluster.fXYZ[2];
+  fErrXY[0] = cluster.fErrXY[0];
+  fErrXY[1] = cluster.fErrXY[1];
+  
+  return *this;
+}
+
+//_____________________________________________________________________________
+void AliESDMuonCluster::Print(Option_t */*option*/) const
+{
+  /// print cluster content
+  UInt_t cId = GetUniqueID();
+  
+  cout<<Form("clusterID=%u (ch=%d, det=%d, index=%d)",
+            cId,GetChamberId(),GetDetElemId(),GetClusterIndex())<<endl;
+  
+  cout<<Form("position=(%5.2f, %5.2f, %5.2f), sigma=(%5.2f, %5.2f, 0.0)",
+            GetX(),GetY(),GetZ(),GetErrX(),GetErrY())<<endl;
+}
+
diff --git a/STEER/AliESDMuonCluster.h b/STEER/AliESDMuonCluster.h
new file mode 100644 (file)
index 0000000..2df3972
--- /dev/null
@@ -0,0 +1,64 @@
+#ifndef ALIESDMUONCLUSTER_H
+#define ALIESDMUONCLUSTER_H
+
+/* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
+* See cxx source for full Copyright notice                               */
+
+// $Id$
+
+/// \class AliESDMuonCluster
+/// \brief Class to describe the MUON clusters in the Event Summary Data
+//  Author Philippe Pillot, Subatech
+
+
+#include <TObject.h>
+
+class AliESDMuonCluster : public TObject {
+public:
+  AliESDMuonCluster(); // Constructor
+  virtual ~AliESDMuonCluster() {} ///< Destructor
+  AliESDMuonCluster(const AliESDMuonCluster& cluster);
+  AliESDMuonCluster& operator=(const AliESDMuonCluster& cluster);
+  
+  /// Clear method (used by TClonesArray)
+  void Clear(Option_t*) {}
+  
+  /// Set coordinates (cm)
+  void     SetXYZ(Double_t x, Double_t y, Double_t z) {fXYZ[0] = x; fXYZ[1] = y; fXYZ[2] = z;}
+  /// Return X-position (cm)
+  Double_t GetX() const {return fXYZ[0];}
+  /// Return Y-position (cm)
+  Double_t GetY() const {return fXYZ[1];}
+  /// Return Z-position (cm)
+  Double_t GetZ() const {return fXYZ[2];}
+  
+  /// Set (X,Y) resolution (cm)
+  void     SetErrXY(Double_t errX, Double_t errY) {fErrXY[0] = errX; fErrXY[1] = errY;}
+  /// Return X-resolution (cm)
+  Double_t GetErrX() const  {return fErrXY[0];}
+  /// Return X-resolution**2 (cm**2)
+  Double_t GetErrX2() const {return fErrXY[0]*fErrXY[0];}
+  /// Return Y-resolution (cm)
+  Double_t GetErrY() const  {return fErrXY[1];}
+  /// Return Y-resolution**2 (cm**2)
+  Double_t GetErrY2() const {return fErrXY[1]*fErrXY[1];}
+  
+  /// Return chamber id (0..), part of the uniqueID
+  Int_t    GetChamberId() const    {return (GetUniqueID() & 0xF0000000) >> 28;}
+  /// Return detection element id, part of the uniqueID
+  Int_t    GetDetElemId() const    {return (GetUniqueID() & 0x0FFE0000) >> 17;}
+  /// Returnt the index of this cluster (0..), part of the uniqueID
+  Int_t    GetClusterIndex() const {return (GetUniqueID() & 0x0001FFFF);}
+  
+  void     Print(Option_t */*option*/ = "") const;
+  
+  
+protected:
+  Double32_t fXYZ[3];   ///< cluster position
+  Double32_t fErrXY[2]; ///< transverse position errors
+  
+  
+  ClassDef(AliESDMuonCluster, 1) // MUON ESD cluster class
+};
+
+#endif
index fc81948..0fb9b57 100644 (file)
@@ -26,7 +26,9 @@
 ///////////////////////////////////////////////////////////////////////////////
 
 #include "AliESDMuonTrack.h"
+#include "AliESDMuonCluster.h"
 
+#include <TClonesArray.h>
 #include <TLorentzVector.h>
 #include <TMath.h>
 
@@ -41,6 +43,11 @@ AliESDMuonTrack::AliESDMuonTrack ():
   fZ(0),
   fBendingCoor(0),
   fNonBendingCoor(0),
+  fInverseBendingMomentumAtDCA(0),
+  fThetaXAtDCA(0),
+  fThetaYAtDCA(0),
+  fBendingCoorAtDCA(0),
+  fNonBendingCoorAtDCA(0),
   fInverseBendingMomentumUncorrected(0),
   fThetaXUncorrected(0),
   fThetaYUncorrected(0),
@@ -52,7 +59,8 @@ AliESDMuonTrack::AliESDMuonTrack ():
   fLocalTrigger(0),
   fMuonClusterMap(0),
   fHitsPatternInTrigCh(0),
-  fNHit(0)
+  fNHit(0),
+  fClusters(0x0)
 {
   //
   // Default constructor
@@ -70,6 +78,11 @@ AliESDMuonTrack::AliESDMuonTrack (const AliESDMuonTrack& MUONTrack):
   fZ(MUONTrack.fZ),
   fBendingCoor(MUONTrack.fBendingCoor),
   fNonBendingCoor(MUONTrack.fNonBendingCoor),
+  fInverseBendingMomentumAtDCA(MUONTrack.fInverseBendingMomentumAtDCA),
+  fThetaXAtDCA(MUONTrack.fThetaXAtDCA),
+  fThetaYAtDCA(MUONTrack.fThetaYAtDCA),
+  fBendingCoorAtDCA(MUONTrack.fBendingCoorAtDCA),
+  fNonBendingCoorAtDCA(MUONTrack.fNonBendingCoorAtDCA),
   fInverseBendingMomentumUncorrected(MUONTrack.fInverseBendingMomentumUncorrected),
   fThetaXUncorrected(MUONTrack.fThetaXUncorrected),
   fThetaYUncorrected(MUONTrack.fThetaYUncorrected),
@@ -81,13 +94,24 @@ AliESDMuonTrack::AliESDMuonTrack (const AliESDMuonTrack& MUONTrack):
   fLocalTrigger(MUONTrack.fLocalTrigger),
   fMuonClusterMap(MUONTrack.fMuonClusterMap),
   fHitsPatternInTrigCh(MUONTrack.fHitsPatternInTrigCh),
-  fNHit(MUONTrack.fNHit)
+  fNHit(MUONTrack.fNHit),
+  fClusters(0x0)
 {
   //
   // Copy constructor
   // Deep copy implemented
   //
   for (Int_t i = 0; i < 15; i++) fCovariances[i] = MUONTrack.fCovariances[i];
+  
+  // necessary to make a copy of the objects and not only the pointers in TClonesArray
+  if (MUONTrack.fClusters) {
+    fClusters = new TClonesArray("AliESDMuonCluster",MUONTrack.fClusters->GetEntriesFast());
+    AliESDMuonCluster *cluster = (AliESDMuonCluster*) MUONTrack.fClusters->First();
+    while (cluster) {
+      new ((*fClusters)[fClusters->GetEntriesFast()]) AliESDMuonCluster(*cluster);
+      cluster = (AliESDMuonCluster*) MUONTrack.fClusters->After(cluster);
+    }
+  }
 }
 
 //_____________________________________________________________________________
@@ -108,6 +132,12 @@ AliESDMuonTrack& AliESDMuonTrack::operator=(const AliESDMuonTrack& MUONTrack)
   fBendingCoor            = MUONTrack.fBendingCoor;      
   fNonBendingCoor         = MUONTrack.fNonBendingCoor;   
   
+  fInverseBendingMomentumAtDCA = MUONTrack.fInverseBendingMomentumAtDCA; 
+  fThetaXAtDCA                 = MUONTrack.fThetaXAtDCA;           
+  fThetaYAtDCA                 = MUONTrack.fThetaYAtDCA;           
+  fBendingCoorAtDCA            = MUONTrack.fBendingCoorAtDCA;      
+  fNonBendingCoorAtDCA         = MUONTrack.fNonBendingCoorAtDCA;   
+  
   fInverseBendingMomentumUncorrected = MUONTrack.fInverseBendingMomentumUncorrected; 
   fThetaXUncorrected                 = MUONTrack.fThetaXUncorrected;           
   fThetaYUncorrected                 = MUONTrack.fThetaYUncorrected;           
@@ -127,9 +157,34 @@ AliESDMuonTrack& AliESDMuonTrack::operator=(const AliESDMuonTrack& MUONTrack)
  
   fMuonClusterMap        = MUONTrack.fMuonClusterMap;
   
+  // necessary to make a copy of the objects and not only the pointers in TClonesArray
+  delete fClusters;
+  if (MUONTrack.fClusters) {
+    fClusters = new TClonesArray("AliESDMuonCluster",MUONTrack.fClusters->GetEntriesFast());
+    AliESDMuonCluster *cluster = (AliESDMuonCluster*) MUONTrack.fClusters->First();
+    while (cluster) {
+      new ((*fClusters)[fClusters->GetEntriesFast()]) AliESDMuonCluster(*cluster);
+      cluster = (AliESDMuonCluster*) MUONTrack.fClusters->After(cluster);
+    }
+  } else fClusters = 0x0;
+  
   return *this;
 }
 
+//__________________________________________________________________________
+AliESDMuonTrack::~AliESDMuonTrack()
+{
+  /// Destructor
+  delete fClusters;
+}
+
+//__________________________________________________________________________
+void AliESDMuonTrack::Clear(Option_t* opt)
+{
+  /// Clear arrays
+  if (fClusters) fClusters->Clear(opt);
+}
+
 //_____________________________________________________________________________
 void AliESDMuonTrack::GetCovariances(TMatrixD& cov) const
 {
@@ -256,6 +311,62 @@ void AliESDMuonTrack::LorentzP(TLorentzVector& vP) const
 }
 
 //_____________________________________________________________________________
+Double_t AliESDMuonTrack::PxAtDCA() const
+{
+  // return p_x from track parameters
+  Double_t nonBendingSlope = TMath::Tan(fThetaXAtDCA);
+  Double_t bendingSlope    = TMath::Tan(fThetaYAtDCA);
+  Double_t pYZ = (fInverseBendingMomentumAtDCA != 0.) ? TMath::Abs(1. / fInverseBendingMomentumAtDCA) : 0.;
+  Double_t pZ  = -pYZ / TMath::Sqrt(1.0 + bendingSlope*bendingSlope);  // spectro. (z<0)
+  return pZ * nonBendingSlope;
+}
+
+//_____________________________________________________________________________
+Double_t AliESDMuonTrack::PyAtDCA() const
+{
+  // return p_y from track parameters
+  Double_t bendingSlope = TMath::Tan(fThetaYAtDCA);
+  Double_t pYZ = (fInverseBendingMomentumAtDCA != 0.) ? TMath::Abs(1. / fInverseBendingMomentumAtDCA) : 0.;
+  Double_t pZ  = -pYZ / TMath::Sqrt(1.0 + bendingSlope*bendingSlope);  // spectro. (z<0)
+  return pZ * bendingSlope;
+}
+
+//_____________________________________________________________________________
+Double_t AliESDMuonTrack::PzAtDCA() const
+{
+  // return p_z from track parameters
+  Double_t bendingSlope = TMath::Tan(fThetaYAtDCA);
+  Double_t pYZ = (fInverseBendingMomentumAtDCA != 0.) ? TMath::Abs(1. / fInverseBendingMomentumAtDCA) : 0.;
+  return -pYZ / TMath::Sqrt(1.0 + bendingSlope*bendingSlope);  // spectro. (z<0)
+}
+
+//_____________________________________________________________________________
+Double_t AliESDMuonTrack::PAtDCA() const
+{
+  // return p from track parameters
+  Double_t nonBendingSlope = TMath::Tan(fThetaXAtDCA);
+  Double_t bendingSlope    = TMath::Tan(fThetaYAtDCA);
+  Double_t pYZ = (fInverseBendingMomentumAtDCA != 0.) ? TMath::Abs(1. / fInverseBendingMomentumAtDCA) : 0.;
+  Double_t pZ  = -pYZ / TMath::Sqrt(1.0 + bendingSlope*bendingSlope);  // spectro. (z<0)
+  return -pZ * TMath::Sqrt(1.0 + bendingSlope*bendingSlope + nonBendingSlope*nonBendingSlope);
+}
+
+//_____________________________________________________________________________
+void AliESDMuonTrack::LorentzPAtDCA(TLorentzVector& vP) const
+{
+  // return Lorentz momentum vector from track parameters
+  Double_t muonMass = M();
+  Double_t nonBendingSlope = TMath::Tan(fThetaXAtDCA);
+  Double_t bendingSlope    = TMath::Tan(fThetaYAtDCA);
+  Double_t pYZ = (fInverseBendingMomentumAtDCA != 0.) ? TMath::Abs(1. / fInverseBendingMomentumAtDCA) : 0.;
+  Double_t pZ  = -pYZ / TMath::Sqrt(1.0 + bendingSlope*bendingSlope);  // spectro. (z<0)
+  Double_t pX  = pZ * nonBendingSlope;
+  Double_t pY  = pZ * bendingSlope;
+  Double_t e   = TMath::Sqrt(muonMass*muonMass + pX*pX + pY*pY + pZ*pZ);
+  vP.SetPxPyPzE(pX, pY, pZ, e);
+}
+
+//_____________________________________________________________________________
 Double_t AliESDMuonTrack::PxUncorrected() const
 {
   // return p_x from track parameters
@@ -354,3 +465,32 @@ Bool_t AliESDMuonTrack::IsInMuonClusterMap(Int_t chamber) const
   
 }
 
+//_____________________________________________________________________________
+TClonesArray& AliESDMuonTrack::GetClusters() const
+{
+  // return the array of clusters associated to the track
+  if (!fClusters) fClusters = new TClonesArray("AliESDMuonCluster",10);
+  
+  return *fClusters;
+}
+
+//_____________________________________________________________________________
+void AliESDMuonTrack::AddCluster(const AliESDMuonCluster &cluster)
+{
+  // add a cluster to the TClonesArray of clusters associated to the track
+  if (!fClusters) fClusters = new TClonesArray("AliESDMuonCluster",10);
+  
+  new ((*fClusters)[fClusters->GetEntriesFast()]) AliESDMuonCluster(cluster);
+}
+
+//_____________________________________________________________________________
+Bool_t AliESDMuonTrack::ClustersStored() const
+{
+  // return kTRUE if the clusters associated to the track are registered
+  if (!fClusters) return kFALSE;
+  
+  if (fClusters->GetEntriesFast() == 0) return kFALSE;
+  
+  return kTRUE;
+}
+
index 7f43991..6373794 100644 (file)
@@ -2,7 +2,7 @@
 #define ALIESDMUONTRACK_H
 
 /* Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
- * See cxx source for full Copyright notice                               */
+* See cxx source for full Copyright notice                               */
 
 /* $Id$ */
 
 
 #include "AliVParticle.h"
 
+class AliESDMuonCluster;
+class TClonesArray;
 class TLorentzVector;
 
 class AliESDMuonTrack : public AliVParticle {
 public:
   AliESDMuonTrack(); //Constructor
-  virtual ~AliESDMuonTrack(){} // Destructor
+  virtual ~AliESDMuonTrack(); // Destructor
   AliESDMuonTrack(const AliESDMuonTrack& esdm);
   AliESDMuonTrack& operator=(const AliESDMuonTrack& esdm);
 
+  void Clear(Option_t* opt);
 
- // Get and Set methods for data at vertex
+  // Get and Set methods for data at vertex
   Double_t GetInverseBendingMomentum(void) const {return fInverseBendingMomentum;}
   void     SetInverseBendingMomentum(Double_t InverseBendingMomentum) 
                {fInverseBendingMomentum = InverseBendingMomentum;}
@@ -42,7 +45,22 @@ public:
   Double_t GetNonBendingCoor(void) const {return fNonBendingCoor;}
   void     SetNonBendingCoor(Double_t NonBendingCoor) {fNonBendingCoor = NonBendingCoor;}
   
- // Get and Set methods for data at first station
+  // Get and Set methods for data at Distance of Closest Approach in the vertex plane
+  Double_t GetInverseBendingMomentumAtDCA(void) const {return fInverseBendingMomentumAtDCA;}
+  void     SetInverseBendingMomentumAtDCA(Double_t InverseBendingMomentum) 
+               {fInverseBendingMomentumAtDCA = InverseBendingMomentum;}
+  Double_t GetThetaXAtDCA(void) const {return fThetaXAtDCA;}
+  void     SetThetaXAtDCA(Double_t ThetaX) {fThetaXAtDCA = ThetaX;}
+  Double_t GetThetaYAtDCA(void) const {return fThetaYAtDCA;}
+  void     SetThetaYAtDCA(Double_t ThetaY) {fThetaYAtDCA = ThetaY;}
+  Double_t GetBendingCoorAtDCA(void) const {return fBendingCoorAtDCA;}
+  void     SetBendingCoorAtDCA(Double_t BendingCoor) {fBendingCoorAtDCA = BendingCoor;}
+  Double_t GetNonBendingCoorAtDCA(void) const {return fNonBendingCoorAtDCA;}
+  void     SetNonBendingCoorAtDCA(Double_t NonBendingCoor) {fNonBendingCoorAtDCA = NonBendingCoor;}
+  Double_t GetDCA(void) const {return TMath::Sqrt(fNonBendingCoorAtDCA*fNonBendingCoorAtDCA +
+                                                 fBendingCoorAtDCA*fBendingCoorAtDCA);}
+  
+  // Get and Set methods for data at first station
   Double_t GetInverseBendingMomentumUncorrected(void) const {return fInverseBendingMomentumUncorrected;}
   void     SetInverseBendingMomentumUncorrected(Double_t InverseBendingMomentum) 
                {fInverseBendingMomentumUncorrected = InverseBendingMomentum;}
@@ -56,19 +74,19 @@ public:
   void     SetBendingCoorUncorrected(Double_t BendingCoor) {fBendingCoorUncorrected = BendingCoor;}
   Double_t GetNonBendingCoorUncorrected(void) const {return fNonBendingCoorUncorrected;}
   void     SetNonBendingCoorUncorrected(Double_t NonBendingCoor) {fNonBendingCoorUncorrected = NonBendingCoor;}
-
- // Get and Set methods for covariance matrix of data at first station
+  
+  // Get and Set methods for covariance matrix of data at first station
   void     GetCovariances(TMatrixD& cov) const;
   void     SetCovariances(const TMatrixD& cov);
   void     GetCovarianceXYZPxPyPz(Double_t cov[21]) const;
-
- // Get and Set methods for global tracking info
+  
+  // Get and Set methods for global tracking info
   Double_t GetChi2(void) const {return fChi2;}
   void     SetChi2(Double_t Chi2) {fChi2 = Chi2;}
   UChar_t  GetNHit(void) const {return fNHit;}
   void     SetNHit(UInt_t NHit) {fNHit = NHit;}
-
- // Get and Set methods for trigger matching
+  
+  // Get and Set methods for trigger matching
   Int_t    GetMatchTrigger() const;
   Double_t GetChi2MatchTrigger() const {return fChi2MatchTrigger;}
   void     SetChi2MatchTrigger(Double_t Chi2MatchTrigger) {fChi2MatchTrigger = Chi2MatchTrigger;}
@@ -82,23 +100,35 @@ public:
   Int_t    LoLpt(void)    const  { return fLocalTrigger >> 22 & 0x03; }
   Int_t    LoHpt(void)    const  { return fLocalTrigger >> 24 & 0x03; }
   
- // Get and Set methods for muon cluster map
+  // Get and Set methods for muon cluster map
   UInt_t   GetMuonClusterMap() const {return fMuonClusterMap;}
   void     SetMuonClusterMap(UInt_t muonClusterMap) {fMuonClusterMap = muonClusterMap;}
   void     AddInMuonClusterMap(Int_t chamber);
   Bool_t   IsInMuonClusterMap(Int_t chamber) const;
   
- // Methods to compute track momentum
+  // Methods to get, fill and check the array of associated clusters
+  TClonesArray& GetClusters() const;
+  void          AddCluster(const AliESDMuonCluster &cluster);
+  Bool_t        ClustersStored() const;
+  
+  // Methods to compute track momentum
   Double_t Px() const;
   Double_t Py() const;
   Double_t Pz() const;
   Double_t P() const;
   Bool_t   PxPyPz(Double_t p[3]) const { p[0] = Px(); p[1] = Py(); p[2] = Pz(); return kTRUE; }
   void     LorentzP(TLorentzVector& vP) const;
+  Double_t PxAtDCA() const;
+  Double_t PyAtDCA() const;
+  Double_t PzAtDCA() const;
+  Double_t PAtDCA() const;
+  Bool_t   PxPyPzAtDCA(Double_t p[3]) const { p[0] = Px(); p[1] = Py(); p[2] = Pz(); return kTRUE; }
+  void     LorentzPAtDCA(TLorentzVector& vP) const;
   Double_t PxUncorrected() const;
   Double_t PyUncorrected() const;
   Double_t PzUncorrected() const;
   Double_t PUncorrected() const;
+  Bool_t   PxPyPzUncorrected(Double_t p[3]) const { p[0] = Px(); p[1] = Py(); p[2] = Pz(); return kTRUE; }
   void     LorentzPUncorrected(TLorentzVector& vP) const;
   
   // additional methods to comply with AliVParticle
@@ -116,10 +146,10 @@ public:
   Double_t Y() const { return TMath::ATanH(Pz()/E()); }
   Short_t  Charge() const { return (Short_t)TMath::Sign(1., GetInverseBendingMomentum()); }
   const Double_t *PID() const { return (Double_t*)0x0; }
-    
+  
   
 protected:
- // parameters at vertex
+  // parameters at vertex
   Double32_t fInverseBendingMomentum; ///< Inverse bending momentum (GeV/c ** -1) times the charge 
   Double32_t fThetaX;                 ///< Angle of track at vertex in X direction (rad)
   Double32_t fThetaY;                 ///< Angle of track at vertex in Y direction (rad)
@@ -127,7 +157,14 @@ protected:
   Double32_t fBendingCoor;            ///< bending coordinate (cm)
   Double32_t fNonBendingCoor;         ///< non bending coordinate (cm)
   
- // parameters at first tracking station
+  // parameters at Distance of Closest Approach in the vertex plane
+  Double32_t fInverseBendingMomentumAtDCA; ///< Inverse bending momentum (GeV/c ** -1) times the charge 
+  Double32_t fThetaXAtDCA;                 ///< Angle of track at vertex in X direction (rad)
+  Double32_t fThetaYAtDCA;                 ///< Angle of track at vertex in Y direction (rad)
+  Double32_t fBendingCoorAtDCA;            ///< bending coordinate (cm)
+  Double32_t fNonBendingCoorAtDCA;         ///< non bending coordinate (cm)
+  
+  // parameters at first tracking station
   Double32_t fInverseBendingMomentumUncorrected; ///< Inverse bending momentum (GeV/c ** -1) times the charge 
   Double32_t fThetaXUncorrected;                 ///< Angle of track at vertex in X direction (rad)
   Double32_t fThetaYUncorrected;                 ///< Angle of track at vertex in Y direction (rad)
@@ -135,25 +172,26 @@ protected:
   Double32_t fBendingCoorUncorrected;            ///< bending coordinate (cm)
   Double32_t fNonBendingCoorUncorrected;         ///< non bending coordinate (cm)
   
- /// reduced covariance matrix of UNCORRECTED track parameters, ordered as follow:      <pre>
- /// [0] =  <X,X>
- /// [1] =<X,ThetaX>  [2] =<ThetaX,ThetaX>
- /// [3] =  <X,Y>     [4] =  <Y,ThetaX>     [5] =  <Y,Y>
- /// [6] =<X,ThetaY>  [7] =<ThetaX,ThetaY>  [8] =<Y,ThetaY>  [9] =<ThetaY,ThetaY>
- /// [10]=<X,InvP_yz> [11]=<ThetaX,InvP_yz> [12]=<Y,InvP_yz> [13]=<ThetaY,InvP_yz> [14]=<InvP_yz,InvP_yz>  </pre>
+  /// reduced covariance matrix of UNCORRECTED track parameters, ordered as follow:      <pre>
+  /// [0] =  <X,X>
+  /// [1] =<X,ThetaX>  [2] =<ThetaX,ThetaX>
+  /// [3] =  <X,Y>     [4] =  <Y,ThetaX>     [5] =  <Y,Y>
+  /// [6] =<X,ThetaY>  [7] =<ThetaX,ThetaY>  [8] =<Y,ThetaY>  [9] =<ThetaY,ThetaY>
+  /// [10]=<X,InvP_yz> [11]=<ThetaX,InvP_yz> [12]=<Y,InvP_yz> [13]=<ThetaY,InvP_yz> [14]=<InvP_yz,InvP_yz>  </pre>
   Double32_t fCovariances[15]; ///< \brief reduced covariance matrix of parameters AT FIRST CHAMBER
   
- // global tracking info
+  // global tracking info
   Double32_t fChi2;                ///< chi2 in the MUON track fit
   Double32_t fChi2MatchTrigger;    ///< chi2 of trigger/track matching
   Int_t      fLocalTrigger;        ///< packed local trigger information
-
+  
   UInt_t     fMuonClusterMap;      ///< Map of clusters in tracking chambers
   UShort_t   fHitsPatternInTrigCh; ///< Word containing info on the hits left in trigger chambers
   UChar_t    fNHit;                ///< number of hit in the track
-
-
-  ClassDef(AliESDMuonTrack,8) // MUON ESD track class 
+  
+  mutable TClonesArray* fClusters; ///< Array of clusters attached to the track
+  
+  ClassDef(AliESDMuonTrack,9) // MUON ESD track class 
 };
 
 #endif 
index a26597b..a89482f 100644 (file)
@@ -33,6 +33,7 @@
 #pragma link C++ class  AliESDkink+;
 #pragma link C++ class  AliESDV0Params+;
 #pragma link C++ class  AliESDCaloCluster+;
+#pragma link C++ class  AliESDMuonCluster+;
 
 #pragma link C++ class  AliKFParticleBase+;
 #pragma link C++ class  AliKFParticle+;
index 98def75..d8e66de 100644 (file)
@@ -3,7 +3,7 @@ SRCS = AliESDEvent.cxx AliESDInputHandler.cxx AliESDfriend.cxx AliESD.cxx \
        AliESDMuonTrack.cxx AliESDPmdTrack.cxx AliESDTrdTrack.cxx AliESDHLTtrack.cxx \
        AliESDv0.cxx AliESDcascade.cxx AliVertex.cxx AliESDVertex.cxx \
        AliESDpid.cxx AliESDkink.cxx \
-       AliESDCaloCluster.cxx \
+       AliESDCaloCluster.cxx AliESDMuonCluster.cxx \
        AliKFParticleBase.cxx AliKFParticle.cxx AliKFVertex.cxx\
        AliKalmanTrack.cxx AliExternalTrackParam.cxx \
        AliVertexerTracks.cxx AliStrLine.cxx \