]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - STEER/AliESDtrack.cxx
change in the dtor
[u/mrichter/AliRoot.git] / STEER / AliESDtrack.cxx
index 30ceb14ae596fbbcc6753ff53675967e770d9d01..08cfd553dc2146d2262a482766fb72b899a9b037 100644 (file)
@@ -76,7 +76,7 @@ AliESDtrack::AliESDtrack() :
   fTPCLabel(0),
   fTRDLabel(0),
   fTOFCalChannel(0),
-  fTOFindex(0),
+  fTOFindex(-1),
   fHMPIDqn(0),
   fHMPIDcluIdx(0),
   fEMCALindex(kEMCALNoMatch),
@@ -84,6 +84,8 @@ AliESDtrack::AliESDtrack() :
   fHMPIDtrkPhi(0),
   fHMPIDsignal(0),
   fTrackLength(0),
+  fdTPC(0),fzTPC(0),
+  fCddTPC(0),fCdzTPC(0),fCzzTPC(0),
   fD(0),fZ(0),
   fCdd(0),fCdz(0),fCzz(0),
   fCchi2(0),
@@ -113,12 +115,15 @@ AliESDtrack::AliESDtrack() :
   fITSClusterMap(0),
   fTRDncls(0),
   fTRDncls0(0),
-  fTRDpidQuality(0)
+  fTRDpidQuality(0),
+  fTRDnSlices(0),
+  fTRDslices(0x0)
+  
 {
   //
   // The default ESD constructor 
   //
-  Int_t i, j;
+  Int_t i;
   for (i=0; i<AliPID::kSPECIES; i++) {
     fTrackTime[i]=0.;
     fR[i]=0.;
@@ -131,10 +136,7 @@ AliESDtrack::AliESDtrack() :
   
   for (i=0; i<3; i++)   { fKinkIndexes[i]=0;}
   for (i=0; i<3; i++)   { fV0Indexes[i]=0;}
-  for (i=0;i<kNPlane;i++) {
-    for (j=0;j<kNSlice;j++) {
-      fTRDsignals[i][j]=0.; 
-    }
+  for (i=0;i<kTRDnPlanes;i++) {
     fTRDTimBin[i]=0;
   }
   for (i=0;i<4;i++) {fTPCPoints[i]=0;}
@@ -168,6 +170,8 @@ AliESDtrack::AliESDtrack(const AliESDtrack& track):
   fHMPIDtrkPhi(track.fHMPIDtrkPhi),
   fHMPIDsignal(track.fHMPIDsignal),
   fTrackLength(track.fTrackLength),
+  fdTPC(track.fdTPC),fzTPC(track.fzTPC),
+  fCddTPC(track.fCddTPC),fCdzTPC(track.fCdzTPC),fCzzTPC(track.fCzzTPC),
   fD(track.fD),fZ(track.fZ),
   fCdd(track.fCdd),fCdz(track.fCdz),fCzz(track.fCzz),
   fCchi2(track.fCchi2),
@@ -197,7 +201,9 @@ AliESDtrack::AliESDtrack(const AliESDtrack& track):
   fITSClusterMap(track.fITSClusterMap),
   fTRDncls(track.fTRDncls),
   fTRDncls0(track.fTRDncls0),
-  fTRDpidQuality(track.fTRDpidQuality)
+  fTRDpidQuality(track.fTRDpidQuality),
+  fTRDnSlices(track.fTRDnSlices),
+  fTRDslices(0x0)
 {
   //
   //copy constructor
@@ -212,12 +218,15 @@ AliESDtrack::AliESDtrack(const AliESDtrack& track):
   for (Int_t i=0; i<3;i++)   { fKinkIndexes[i]=track.fKinkIndexes[i];}
   for (Int_t i=0; i<3;i++)   { fV0Indexes[i]=track.fV0Indexes[i];}
   //
-  for (Int_t i=0;i<kNPlane;i++) {
-    for (Int_t j=0;j<kNSlice;j++) {
-      fTRDsignals[i][j]=track.fTRDsignals[i][j]; 
-    }
+  for (Int_t i=0;i<kTRDnPlanes;i++) {
     fTRDTimBin[i]=track.fTRDTimBin[i];
   }
+
+  if (fTRDnSlices) {
+    fTRDslices=new Double32_t[fTRDnSlices];
+    for (Int_t i=0; i<fTRDnSlices; i++) fTRDslices[i]=track.fTRDslices[i];
+  }
+
   for (Int_t i=0;i<AliPID::kSPECIES;i++) fTRDr[i]=track.fTRDr[i]; 
   for (Int_t i=0;i<AliPID::kSPECIES;i++) fTOFr[i]=track.fTOFr[i];
   for (Int_t i=0;i<3;i++) fTOFLabel[i]=track.fTOFLabel[i];
@@ -250,7 +259,7 @@ AliESDtrack::AliESDtrack(TParticle * part) :
   fTPCLabel(0),
   fTRDLabel(0),
   fTOFCalChannel(0),
-  fTOFindex(0),
+  fTOFindex(-1),
   fHMPIDqn(0),
   fHMPIDcluIdx(0),
   fEMCALindex(kEMCALNoMatch),
@@ -258,6 +267,8 @@ AliESDtrack::AliESDtrack(TParticle * part) :
   fHMPIDtrkPhi(0),
   fHMPIDsignal(0),
   fTrackLength(0),
+  fdTPC(0),fzTPC(0),
+  fCddTPC(0),fCdzTPC(0),fCzzTPC(0),
   fD(0),fZ(0),
   fCdd(0),fCdz(0),fCzz(0),
   fCchi2(0),
@@ -287,14 +298,16 @@ AliESDtrack::AliESDtrack(TParticle * part) :
   fITSClusterMap(0),
   fTRDncls(0),
   fTRDncls0(0),
-  fTRDpidQuality(0)
+  fTRDpidQuality(0),
+  fTRDnSlices(0),
+  fTRDslices(0x0)
 {
   //
   // ESD track from TParticle
   //
 
   // Reset all the arrays
-  Int_t i, j;
+  Int_t i;
   for (i=0; i<AliPID::kSPECIES; i++) {
     fTrackTime[i]=0.;
     fR[i]=0.;
@@ -307,10 +320,7 @@ AliESDtrack::AliESDtrack(TParticle * part) :
   
   for (i=0; i<3; i++)   { fKinkIndexes[i]=0;}
   for (i=0; i<3; i++)   { fV0Indexes[i]=-1;}
-  for (i=0;i<kNPlane;i++) {
-    for (j=0;j<kNSlice;j++) {
-      fTRDsignals[i][j]=0.; 
-    }
+  for (i=0;i<kTRDnPlanes;i++) {
     fTRDTimBin[i]=0;
   }
   for (i=0;i<4;i++) {fTPCPoints[i]=0;}
@@ -418,8 +428,201 @@ AliESDtrack::~AliESDtrack(){
   delete fOp;
   delete fCp; 
   delete fFriendTrack;
+  if(fTRDnSlices)
+    delete[] fTRDslices;
+}
+
+AliESDtrack &AliESDtrack::operator=(const AliESDtrack &source){
+  
+
+  if(&source == this) return *this;
+  AliExternalTrackParam::operator=(source);
+
+  
+  if(source.fCp){
+    // we have the trackparam: assign or copy construct
+    if(fCp)*fCp = *source.fCp;
+    else fCp = new AliExternalTrackParam(*source.fCp);
+  }
+  else{
+    // no track param delete the old one
+    if(fCp)delete fCp;
+    fCp = 0;
+  }
+
+  if(source.fIp){
+    // we have the trackparam: assign or copy construct
+    if(fIp)*fIp = *source.fIp;
+    else fIp = new AliExternalTrackParam(*source.fIp);
+  }
+  else{
+    // no track param delete the old one
+    if(fIp)delete fIp;
+    fIp = 0;
+  }
+
+
+  if(source.fTPCInner){
+    // we have the trackparam: assign or copy construct
+    if(fTPCInner) *fTPCInner = *source.fTPCInner;
+    else fTPCInner = new AliExternalTrackParam(*source.fTPCInner);
+  }
+  else{
+    // no track param delete the old one
+    if(fTPCInner)delete fTPCInner;
+    fTPCInner = 0;
+  }
+
+
+  if(source.fOp){
+    // we have the trackparam: assign or copy construct
+    if(fOp) *fOp = *source.fOp;
+    else fOp = new AliExternalTrackParam(*source.fOp);
+  }
+  else{
+    // no track param delete the old one
+    if(fOp)delete fOp;
+    fOp = 0;
+  }
+
+  // copy also the friend track 
+  // use copy constructor
+  if(source.fFriendTrack){
+    // we have the trackparam: assign or copy construct
+    delete fFriendTrack; fFriendTrack=new AliESDfriendTrack(*source.fFriendTrack);
+  }
+  else{
+    // no track param delete the old one
+    delete fFriendTrack; fFriendTrack= 0;
+  }
+
+  fTPCClusterMap = source.fTPCClusterMap; 
+  fTPCSharedMap  = source.fTPCSharedMap;  
+  // the simple stuff
+  fFlags    = source.fFlags; 
+  fID       = source.fID;             
+  fLabel    = source.fLabel;
+  fITSLabel = source.fITSLabel;
+  for(int i = 0; i< 12;++i){
+    fITSModule[i] = source.fITSModule[i];
+  }
+  fTPCLabel = source.fTPCLabel; 
+  fTRDLabel = source.fTRDLabel;
+  for(int i = 0; i< 3;++i){
+    fTOFLabel[i] = source.fTOFLabel[i];    
+  }
+  fTOFCalChannel = source.fTOFCalChannel;
+  fTOFindex      = source.fTOFindex;
+  fHMPIDqn       = source.fHMPIDqn;
+  fHMPIDcluIdx   = source.fHMPIDcluIdx; 
+  fEMCALindex    = source.fEMCALindex;
+
+  for(int i = 0; i< 3;++i){
+    fKinkIndexes[i] = source.fKinkIndexes[i]; 
+    fV0Indexes[i]   = source.fV0Indexes[i]; 
+  }
+
+  for(int i = 0; i< AliPID::kSPECIES;++i){
+    fR[i]     = source.fR[i];
+    fITSr[i]  = source.fITSr[i];
+    fTPCr[i]  = source.fTPCr[i];
+    fTRDr[i]  = source.fTRDr[i];
+    fTOFr[i]  = source.fTOFr[i];
+    fHMPIDr[i] = source.fHMPIDr[i];
+    fTrackTime[i] = source.fTrackTime[i];  
+  }
+
+  fHMPIDtrkTheta = source.fHMPIDtrkTheta;
+  fHMPIDtrkPhi   = source.fHMPIDtrkPhi;
+  fHMPIDsignal   = source.fHMPIDsignal; 
+
+  
+  fTrackLength   = source. fTrackLength;
+  fdTPC  = source.fdTPC; 
+  fzTPC  = source.fzTPC; 
+  fCddTPC = source.fCddTPC;
+  fCdzTPC = source.fCdzTPC;
+  fCzzTPC = source.fCzzTPC;
+  fD  = source.fD; 
+  fZ  = source.fZ; 
+  fCdd = source.fCdd;
+  fCdz = source.fCdz;
+  fCzz = source.fCzz;
+
+  fCchi2     = source.fCchi2;
+  fITSchi2   = source.fITSchi2;             
+  fTPCchi2   = source.fTPCchi2;            
+  fTRDchi2   = source.fTRDchi2;      
+  fTOFchi2   = source.fTOFchi2;      
+  fHMPIDchi2 = source.fHMPIDchi2;      
+
+
+  fITSsignal  = source.fITSsignal;     
+  fTPCsignal  = source.fTPCsignal;     
+  fTPCsignalS = source.fTPCsignalS;    
+  for(int i = 0; i< 4;++i){
+    fTPCPoints[i] = source.fTPCPoints[i];  
+  }
+  fTRDsignal = source.fTRDsignal;
+
+  for(int i = 0;i < kTRDnPlanes;++i){
+    fTRDTimBin[i] = source.fTRDTimBin[i];   
+  }
+
+  if(fTRDnSlices)
+    delete[] fTRDslices;
+  fTRDslices=0;
+  fTRDnSlices=source.fTRDnSlices;
+  if (fTRDnSlices) {
+    fTRDslices=new Double32_t[fTRDnSlices];
+    for(int j = 0;j < fTRDnSlices;++j) fTRDslices[j] = source.fTRDslices[j];
+  }
+
+  fTRDQuality =   source.fTRDQuality;     
+  fTRDBudget  =   source.fTRDBudget;      
+  fTOFsignal  =   source.fTOFsignal;     
+  fTOFsignalToT = source.fTOFsignalToT;   
+  fTOFsignalRaw = source.fTOFsignalRaw;  
+  fTOFsignalDz  = source.fTOFsignalDz;      
+  
+  for(int i = 0;i<10;++i){
+    fTOFInfo[i] = source.fTOFInfo[i];    
+  }
+
+  fHMPIDtrkX = source.fHMPIDtrkX; 
+  fHMPIDtrkY = source.fHMPIDtrkY; 
+  fHMPIDmipX = source.fHMPIDmipX;
+  fHMPIDmipY = source.fHMPIDmipY; 
+
+  fTPCncls    = source.fTPCncls;      
+  fTPCnclsF   = source.fTPCnclsF;     
+  fTPCsignalN = source.fTPCsignalN;   
+
+  fITSncls = source.fITSncls;       
+  fITSClusterMap = source.fITSClusterMap; 
+  fTRDncls   = source.fTRDncls;       
+  fTRDncls0  = source.fTRDncls0;      
+  fTRDpidQuality  = source.fTRDpidQuality; 
+  return *this;
+}
+
+
+
+void AliESDtrack::Copy(TObject &obj) const {
+  
+  // this overwrites the virtual TOBject::Copy()
+  // to allow run time copying without casting
+  // in AliESDEvent
+
+  if(this==&obj)return;
+  AliESDtrack *robj = dynamic_cast<AliESDtrack*>(&obj);
+  if(!robj)return; // not an AliESDtrack
+  *robj = *this;
+
 }
 
+
+
 void AliESDtrack::AddCalibObject(TObject * object){
   //
   // add calib object to the list
@@ -443,8 +646,7 @@ void AliESDtrack::MakeMiniESDtrack(){
   // fFlags: Reconstruction status flags 
   // fLabel: Track label
   // fID:  Unique ID of the track
-  // fD: Impact parameter in XY-plane
-  // fZ: Impact parameter in Z 
+  // Impact parameter information
   // fR[AliPID::kSPECIES]: combined "detector response probability"
   // Running track parameters in the base class (AliExternalTrackParam)
   
@@ -491,21 +693,22 @@ void AliESDtrack::MakeMiniESDtrack(){
   fTRDncls = 0;       
   fTRDncls0 = 0;       
   fTRDsignal = 0;      
-  for (Int_t i=0;i<kNPlane;i++) {
-    for (Int_t j=0;j<kNSlice;j++) {
-      fTRDsignals[i][j] = 0; 
-    }
+  for (Int_t i=0;i<kTRDnPlanes;i++) {
     fTRDTimBin[i]  = 0;
   }
   for (Int_t i=0;i<AliPID::kSPECIES;i++) fTRDr[i] = 0; 
   fTRDLabel = 0;       
   fTRDQuality  = 0;
   fTRDpidQuality = 0;
+  if(fTRDnSlices)
+    delete[] fTRDslices;
+  fTRDslices=0x0;
+  fTRDnSlices=0;
   fTRDBudget  = 0;
 
   // Reset TOF related track information
   fTOFchi2 = 0;        
-  fTOFindex = 0;       
+  fTOFindex = -1;       
   fTOFsignal = 0;      
   fTOFCalChannel = 0;
   fTOFsignalToT = 0;
@@ -689,11 +892,10 @@ Bool_t AliESDtrack::UpdateTrackParams(const AliKalmanTrack *t, ULong_t flags){
     break;
 
   case kTRDout: case kTRDin: case kTRDrefit:
-    index=fFriendTrack->GetTRDindices();
+    index     = fFriendTrack->GetTRDindices();
     fTRDLabel = t->GetLabel(); 
-    fTRDchi2=t->GetChi2();
-    fTRDncls=6;//t->GetNumberOfTracklets(); //t->GetNumberOfClusters();
-    //for (Int_t i=0;i<fTRDncls;i++) index[i]=t->GetClusterIndex(i);
+    fTRDchi2  = t->GetChi2();
+    fTRDncls  = t->GetNumberOfClusters();
     for (Int_t i=0;i<6;i++) index[i]=t->GetTrackletIndex(i);
     
     fTRDsignal=t->GetPIDsignal();
@@ -825,7 +1027,7 @@ Int_t AliESDtrack::GetNcls(Int_t idet) const
     ncls = fTRDncls;
     break;
   case 3:
-    if (fTOFindex != 0)
+    if (fTOFindex != -1)
       ncls = 1;
     break;
   default:
@@ -850,11 +1052,21 @@ Int_t AliESDtrack::GetClusters(Int_t idet, Int_t *idx) const
     ncls = GetTRDclusters(idx);
     break;
   case 3:
-    if (fTOFindex != 0) {
-      idx[0] = GetTOFcluster();
+    if (fTOFindex != -1) {
+      idx[0] = fTOFindex;
       ncls = 1;
     }
     break;
+  case 4: //PHOS
+    break;
+  case 5:
+    if (fHMPIDcluIdx != 0) {
+      idx[0] = GetHMPIDcluIdx();
+      ncls = 1;
+    }    
+    break;
+  case 6: //EMCAL
+    break;
   default:
     break;
   }
@@ -1050,6 +1262,61 @@ Double_t AliESDtrack::GetTRDpid(Int_t iSpecies) const
   return fTRDr[iSpecies];
 }
 
+void  AliESDtrack::SetNumberOfTRDslices(Int_t n) {
+  //Sets the number of slices used for PID 
+  if (fTRDnSlices != 0) return;
+  fTRDnSlices=kTRDnPlanes*n;
+  fTRDslices=new Double32_t[fTRDnSlices];
+  for (Int_t i=0; i<fTRDnSlices; i++) fTRDslices[i]=-1.;
+}
+
+void  AliESDtrack::SetTRDslice(Double_t q, Int_t plane, Int_t slice) {
+  //Sets the charge q in the slice of the plane
+  Int_t ns=GetNumberOfTRDslices();
+  if (ns==0) {
+    AliError("No TRD slices allocated for this track !");
+    return;
+  }
+
+  if ((plane<0) || (plane>=kTRDnPlanes)) {
+    AliError("Wrong TRD plane !");
+    return;
+  }
+  if ((slice<0) || (slice>=ns)) {
+    AliError("Wrong TRD slice !");
+    return;
+  }
+  Int_t n=plane*ns + slice;
+  fTRDslices[n]=q;
+}
+
+Double_t  AliESDtrack::GetTRDslice(Int_t plane, Int_t slice) const {
+  //Gets the charge from the slice of the plane
+  Int_t ns=GetNumberOfTRDslices();
+  if (ns==0) {
+    //AliError("No TRD slices allocated for this track !");
+    return -1.;
+  }
+
+  if ((plane<0) || (plane>=kTRDnPlanes)) {
+    AliError("Wrong TRD plane !");
+    return -1.;
+  }
+  if ((slice<-1) || (slice>=ns)) {
+    //AliError("Wrong TRD slice !");  
+    return -1.;
+  }
+
+  if (slice==-1) {
+    Double_t q=0.;
+    for (Int_t i=0; i<ns; i++) q+=fTRDslices[plane*ns + i];
+    return q/ns;
+  }
+
+  return fTRDslices[plane*ns + slice];
+}
+
+
 //_______________________________________________________________________
 void AliESDtrack::SetTOFpid(const Double_t *p) {  
   // Sets the probability of each particle type (in TOF)
@@ -1117,6 +1384,33 @@ void AliESDtrack::GetESDpid(Double_t *p) const {
   for (Int_t i=0; i<AliPID::kSPECIES; i++) p[i]=fR[i];
 }
 
+//_______________________________________________________________________
+Bool_t AliESDtrack::RelateToVertexTPC
+(const AliESDVertex *vtx, Double_t b, Double_t maxd) {
+  //
+  // Try to relate the TPC-only track paramters to the vertex "vtx", 
+  // if the (rough) transverse impact parameter is not bigger then "maxd". 
+  //            Magnetic field is "b" (kG).
+  //
+  // a) The TPC-only paramters are extapolated to the DCA to the vertex.
+  // b) The impact parameters and their covariance matrix are calculated.
+  //
+
+  if (!fTPCInner) return kFALSE;
+  if (!vtx) return kFALSE;
+
+  Double_t dz[2],cov[3];
+  if (!fTPCInner->PropagateToDCA(vtx, b, maxd, dz, cov)) return kFALSE;
+
+  fdTPC = dz[0];
+  fzTPC = dz[1];  
+  fCddTPC = cov[0];
+  fCdzTPC = cov[1];
+  fCzzTPC = cov[2];
+  
+  return kTRUE;
+}
+
 //_______________________________________________________________________
 Bool_t AliESDtrack::RelateToVertex
 (const AliESDVertex *vtx, Double_t b, Double_t maxd) {
@@ -1186,7 +1480,7 @@ void AliESDtrack::Print(Option_t *) const {
     GetTRDpid(p) ; 
     for(index = 0 ; index < AliPID::kSPECIES; index++) 
       printf("%f, ", p[index]) ;
-    printf("\n           signal = %f\n", GetTRDsignal()) ;
+      printf("\n           signal = %f\n", GetTRDsignal()) ;
   }
   if( IsOn(kTOFpid) ){
     printf("From TOF: ") ;