ROOT logo
/**************************************************************************
 * 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.                  *
 **************************************************************************/

/*****************************************************************
  AliStarTrack: Event container for flow analysis

  origin:   Mikolaj Krzewicki  (mikolaj.krzewicki@cern.ch)
*****************************************************************/

#include <string.h>
#include <TObject.h>
#include <TString.h>
#include "AliStarTrack.h"

ClassImp(AliStarTrack)

//______________________________________________________________________________
AliStarTrack::AliStarTrack():
  TObject(),
  fParams()
{
  //ctor
}

//______________________________________________________________________________
AliStarTrack::AliStarTrack( const Float_t* params ):
  TObject(),
  fParams()
{
  //ctor
  memcpy(fParams,params,fgkNparams*sizeof(Float_t));
}

//______________________________________________________________________________
AliStarTrack::AliStarTrack( const AliStarTrack& track ):
  TObject(),
  fParams()
{
  //copy ctor
  memcpy(fParams,track.fParams,fgkNparams*sizeof(Float_t));
}

//______________________________________________________________________________
AliStarTrack& AliStarTrack::operator=( const AliStarTrack& track )
{
  //assignment
  if (this == &track) return *this;
  TObject::operator=(track);
  memcpy(fParams,track.fParams,fgkNparams*sizeof(Float_t));
  return *this;
}

//______________________________________________________________________________
void AliStarTrack::SetParams( const Float_t* params )
{
  //set params
  memcpy(fParams,params,fgkNparams*sizeof(Float_t));
}

//______________________________________________________________________________
AliStarTrack* AliStarTrack::Clone( const char* /*option*/) const
{
  //clone "constructor"
  return new AliStarTrack(*this);
}

//______________________________________________________________________________
void AliStarTrack::Print( Option_t* option ) const
{
  // print info
  // TNtuple* track: names are documented in the next 2 lines
  // tracks = new TNtuple("tracks","tracks",
  //   "ID:Charge:Eta:Phi:Pt:Dca:nHits:nHitsFit:nHitsPoss:nHitsDedx:dEdx:nSigElect:nSigPi:nSigK:nSigProton" ) ;
  //
  TString optionstr(option);
  if ( optionstr.Contains("legend") )
  {
    printf(
	  "    id charge     eta     phi      pt     dca  nHits  nFit nPoss ndEdx   dEdx nSigElec nSigPi  nSigK nSigPr\n") ;
    return;
  }

  Int_t   id             = (Int_t)   fParams[0]   ;  // id - a unique integer for each track in this event 
  Int_t   charge         = (Int_t)   fParams[1]   ;  // +1 or -1 
  Float_t eta            = (Float_t) fParams[2]   ;  // Pseudo-rapidity at the vertex
  Float_t phi            = (Float_t) fParams[3]   ;  // Phi emission angle at the vertexcd 
  Float_t pt             = (Float_t) fParams[4]   ;  // Pt of the track at the vertex
  Float_t dca            = (Float_t) fParams[5]   ;  // Magnitude of 3D DCA to vertex
  Int_t   nHits          = (Int_t)   fParams[6]   ;  // Number of clusters available to the Kalman Filter
  Int_t   nHitsFit       = (Int_t)   fParams[7]   ;  // Number of clusters used in the fit (after cuts)
  Int_t   nHitsPoss      = (Int_t)   fParams[8]   ;  // Number of possible cluster on track (theoretical max) 
  Int_t   nHitsDedx      = (Int_t)   fParams[9]   ;  // Number of clusters used in the fit (after dEdx cuts)
  Float_t dEdx           = 1.e6*(Float_t)fParams[10]  ;  // Measured dEdx (Note: GeV/cm so convert to keV/cm!!)
  Float_t nSigmaElectron = (Float_t) fParams[11]  ;  // Number of sigma from electron Bethe-Bloch curve
  Float_t nSigmaPion     = (Float_t) fParams[12]  ;  // Number of sigma from pion Bethe-Bloch curve
  Float_t nSigmaKaon     = (Float_t) fParams[13]  ;  // Number of sigma from kaon Bethe-Bloch curve
  Float_t nSigmaProton   = (Float_t) fParams[14]  ;  // Number of sigma from proton Bethe-Bloch curve
  
  // Alternative way to access the data 
  // nHitsPoss      = (Int_t) ( fTracks->GetLeaf("nHitsPoss")->GetValue() ) ;  // Note alternative method to retrieve data
  // Using the definition of the original NTuple
  // TrackTuple      = new TNtuple("NTtracks","NTtracks",
  // "ID:Charge:Eta:Phi:Pt:Dca:nHits:nHitsFit:nHitsPoss:nHitsDedx:dEdx:nSigElect:nSigPi:nSigK:nSigProton" ) 
  
  printf("%6d %4d   %7.3f %7.3f %7.3f %7.4f %6d %5d %5d %5d %6.2f   %6.2f %6.2f %6.2f %6.2f \n",
	 id, charge, eta, phi, pt, dca, nHits, nHitsFit, nHitsPoss, nHitsDedx, dEdx,
	 nSigmaElectron, nSigmaPion, nSigmaKaon, nSigmaProton ) ;
}

//______________________________________________________________________________
Int_t AliStarTrack::PID() const
{
  // Note: This is a very simple PID selection scheme.  More elaborate methods (with multiple cuts) may be required.
  // When you *are* using dEdx information, you must chose a finite number of good Dedx hits ... but the limit should
  // be about 2/3 of nHitsMin.  This is because some clusters do not form good dEdx hits due to track
  // merging, etc., and so nHitsDedx is always less than nHitsFit.  A rule of thumb says ~2/3 ratio.

  Int_t pid = 0 ;

  const Int_t   nHitDedxMin =    15  ;       // 10 to 20 is typical.  nHitDedxMin is often chosen to be about 2/3 of nHitMin.
  const Float_t nSigmaPID   =    2.0 ;       // Number of Sigma cut to apply to PID bands

  // Test on Number of dE/dx hits required, return 0 if not enough hits
  if ( GetNHitsDedx() <  nHitDedxMin ) return pid;

  // Begin PID

  if ( TMath::Abs( GetNSigElect() ) >= nSigmaPID )
  {
    if ( TMath::Abs( GetNSigK()  ) <= nSigmaPID )
    {
      pid = 321  ;
    }
    if ( TMath::Abs( GetNSigProton()  ) <= nSigmaPID )
    {
      pid = 2212 ;
    }
    if ( TMath::Abs( GetNSigPi()  ) <= nSigmaPID )
    {
      pid = 211  ;
    }
  }

  // Pion is the default in case of ambiguity because it is most abundent. Don't re-arrange order, above.

  return pid ;
}

 AliStarTrack.cxx:1
 AliStarTrack.cxx:2
 AliStarTrack.cxx:3
 AliStarTrack.cxx:4
 AliStarTrack.cxx:5
 AliStarTrack.cxx:6
 AliStarTrack.cxx:7
 AliStarTrack.cxx:8
 AliStarTrack.cxx:9
 AliStarTrack.cxx:10
 AliStarTrack.cxx:11
 AliStarTrack.cxx:12
 AliStarTrack.cxx:13
 AliStarTrack.cxx:14
 AliStarTrack.cxx:15
 AliStarTrack.cxx:16
 AliStarTrack.cxx:17
 AliStarTrack.cxx:18
 AliStarTrack.cxx:19
 AliStarTrack.cxx:20
 AliStarTrack.cxx:21
 AliStarTrack.cxx:22
 AliStarTrack.cxx:23
 AliStarTrack.cxx:24
 AliStarTrack.cxx:25
 AliStarTrack.cxx:26
 AliStarTrack.cxx:27
 AliStarTrack.cxx:28
 AliStarTrack.cxx:29
 AliStarTrack.cxx:30
 AliStarTrack.cxx:31
 AliStarTrack.cxx:32
 AliStarTrack.cxx:33
 AliStarTrack.cxx:34
 AliStarTrack.cxx:35
 AliStarTrack.cxx:36
 AliStarTrack.cxx:37
 AliStarTrack.cxx:38
 AliStarTrack.cxx:39
 AliStarTrack.cxx:40
 AliStarTrack.cxx:41
 AliStarTrack.cxx:42
 AliStarTrack.cxx:43
 AliStarTrack.cxx:44
 AliStarTrack.cxx:45
 AliStarTrack.cxx:46
 AliStarTrack.cxx:47
 AliStarTrack.cxx:48
 AliStarTrack.cxx:49
 AliStarTrack.cxx:50
 AliStarTrack.cxx:51
 AliStarTrack.cxx:52
 AliStarTrack.cxx:53
 AliStarTrack.cxx:54
 AliStarTrack.cxx:55
 AliStarTrack.cxx:56
 AliStarTrack.cxx:57
 AliStarTrack.cxx:58
 AliStarTrack.cxx:59
 AliStarTrack.cxx:60
 AliStarTrack.cxx:61
 AliStarTrack.cxx:62
 AliStarTrack.cxx:63
 AliStarTrack.cxx:64
 AliStarTrack.cxx:65
 AliStarTrack.cxx:66
 AliStarTrack.cxx:67
 AliStarTrack.cxx:68
 AliStarTrack.cxx:69
 AliStarTrack.cxx:70
 AliStarTrack.cxx:71
 AliStarTrack.cxx:72
 AliStarTrack.cxx:73
 AliStarTrack.cxx:74
 AliStarTrack.cxx:75
 AliStarTrack.cxx:76
 AliStarTrack.cxx:77
 AliStarTrack.cxx:78
 AliStarTrack.cxx:79
 AliStarTrack.cxx:80
 AliStarTrack.cxx:81
 AliStarTrack.cxx:82
 AliStarTrack.cxx:83
 AliStarTrack.cxx:84
 AliStarTrack.cxx:85
 AliStarTrack.cxx:86
 AliStarTrack.cxx:87
 AliStarTrack.cxx:88
 AliStarTrack.cxx:89
 AliStarTrack.cxx:90
 AliStarTrack.cxx:91
 AliStarTrack.cxx:92
 AliStarTrack.cxx:93
 AliStarTrack.cxx:94
 AliStarTrack.cxx:95
 AliStarTrack.cxx:96
 AliStarTrack.cxx:97
 AliStarTrack.cxx:98
 AliStarTrack.cxx:99
 AliStarTrack.cxx:100
 AliStarTrack.cxx:101
 AliStarTrack.cxx:102
 AliStarTrack.cxx:103
 AliStarTrack.cxx:104
 AliStarTrack.cxx:105
 AliStarTrack.cxx:106
 AliStarTrack.cxx:107
 AliStarTrack.cxx:108
 AliStarTrack.cxx:109
 AliStarTrack.cxx:110
 AliStarTrack.cxx:111
 AliStarTrack.cxx:112
 AliStarTrack.cxx:113
 AliStarTrack.cxx:114
 AliStarTrack.cxx:115
 AliStarTrack.cxx:116
 AliStarTrack.cxx:117
 AliStarTrack.cxx:118
 AliStarTrack.cxx:119
 AliStarTrack.cxx:120
 AliStarTrack.cxx:121
 AliStarTrack.cxx:122
 AliStarTrack.cxx:123
 AliStarTrack.cxx:124
 AliStarTrack.cxx:125
 AliStarTrack.cxx:126
 AliStarTrack.cxx:127
 AliStarTrack.cxx:128
 AliStarTrack.cxx:129
 AliStarTrack.cxx:130
 AliStarTrack.cxx:131
 AliStarTrack.cxx:132
 AliStarTrack.cxx:133
 AliStarTrack.cxx:134
 AliStarTrack.cxx:135
 AliStarTrack.cxx:136
 AliStarTrack.cxx:137
 AliStarTrack.cxx:138
 AliStarTrack.cxx:139
 AliStarTrack.cxx:140
 AliStarTrack.cxx:141
 AliStarTrack.cxx:142
 AliStarTrack.cxx:143
 AliStarTrack.cxx:144
 AliStarTrack.cxx:145
 AliStarTrack.cxx:146
 AliStarTrack.cxx:147
 AliStarTrack.cxx:148
 AliStarTrack.cxx:149
 AliStarTrack.cxx:150
 AliStarTrack.cxx:151
 AliStarTrack.cxx:152
 AliStarTrack.cxx:153
 AliStarTrack.cxx:154
 AliStarTrack.cxx:155
 AliStarTrack.cxx:156
 AliStarTrack.cxx:157
 AliStarTrack.cxx:158
 AliStarTrack.cxx:159
 AliStarTrack.cxx:160