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

/* $Id$ */

//-------------------------------------------------------------------------
//               Implementation of the AliTracker class
//  that is the base for AliTPCtracker, AliITStrackerV2 and AliTRDtracker    
//        Origin: Iouri Belikov, CERN, Jouri.Belikov@cern.ch
//-------------------------------------------------------------------------

#include <TMath.h>
#include <TH1F.h>
#include <TGeoMatrix.h>

#include "AliTracker.h"
#include "AliGeomManager.h"
#include "AliCluster.h"
#include "AliKalmanTrack.h"
#include "AliGlobalQADataMaker.h"

Bool_t AliTracker::fFillResiduals=kFALSE;
TObjArray **AliTracker::fResiduals=NULL;
AliRecoParam::EventSpecie_t AliTracker::fEventSpecie=AliRecoParam::kDefault;

ClassImp(AliTracker)

AliTracker::AliTracker():
  AliTrackerBase(),
  fEventInfo(NULL)
{
  //--------------------------------------------------------------------
  // The default constructor.
  //--------------------------------------------------------------------
}

//__________________________________________________________________________
AliTracker::AliTracker(const AliTracker &atr):
  AliTrackerBase(atr),
  fEventInfo(atr.fEventInfo)
{
  //--------------------------------------------------------------------
  // The default constructor.
  //--------------------------------------------------------------------
}

//__________________________________________________________________________
void AliTracker::FillClusterArray(TObjArray* /*array*/) const
{
  // Publishes all pointers to clusters known to the tracker into the
  // passed object array.
  // The ownership is not transfered - the caller is not expected to delete
  // the clusters.

  AliWarning("should be overriden by a sub-class.");
}

//__________________________________________________________________________
void AliTracker::CookLabel(AliKalmanTrack *t, Float_t wrong) const {
  //--------------------------------------------------------------------
  //This function "cooks" a track label. If label<0, this track is fake.
  //--------------------------------------------------------------------
  Int_t noc=t->GetNumberOfClusters();
  if (noc<1) return;
  Int_t *lb=new Int_t[noc];
  Int_t *mx=new Int_t[noc];
  AliCluster **clusters=new AliCluster*[noc];

  Int_t i;
  for (i=0; i<noc; i++) {
     lb[i]=mx[i]=0;
     Int_t index=t->GetClusterIndex(i);
     clusters[i]=GetCluster(index);
  }

  Int_t lab=123456789;
  for (i=0; i<noc; i++) {
    AliCluster *c=clusters[i];
    lab=TMath::Abs(c->GetLabel(0));
    Int_t j;
    for (j=0; j<noc; j++) if (lb[j]==lab || mx[j]==0) break;
    if (j<noc) {
       lb[j]=lab;
       (mx[j])++;
    }
  }

  Int_t max=0;
  for (i=0; i<noc; i++) if (mx[i]>max) {max=mx[i]; lab=lb[i];}
    
  for (i=0; i<noc; i++) {
    AliCluster *c=clusters[i];
    //if (TMath::Abs(c->GetLabel(1)) == lab ||
    //    TMath::Abs(c->GetLabel(2)) == lab ) max++;
    if (TMath::Abs(c->GetLabel(0)!=lab))
	if (TMath::Abs(c->GetLabel(1)) == lab ||
	    TMath::Abs(c->GetLabel(2)) == lab ) max++;
  }

  if ((1.- Float_t(max)/noc) > wrong) lab=-lab;
  t->SetFakeRatio((1.- Float_t(max)/noc));
  t->SetLabel(lab);

  delete[] lb;
  delete[] mx;
  delete[] clusters;
}

//____________________________________________________________________________
void AliTracker::UseClusters(const AliKalmanTrack *t, Int_t from) const {
  //------------------------------------------------------------------
  //This function marks clusters associated with the track.
  //------------------------------------------------------------------
  Int_t noc=t->GetNumberOfClusters();
  for (Int_t i=from; i<noc; i++) {
     Int_t index=t->GetClusterIndex(i);
     AliCluster *c=GetCluster(index); 
     c->Use();   
  }
}

void AliTracker::FillResiduals(const AliExternalTrackParam *t,
			      Double_t *p, Double_t *cov, 
                              UShort_t id, Bool_t updated) {
  //
  // This function fills the histograms of residuals 
  // The array of these histos is external for this AliTracker class.
  // Normally, this array belong to AliGlobalQADataMaker class.  
  // 
  if (!fFillResiduals) return; 
  if (!fResiduals) return; 

  const Double_t *residuals=t->GetResiduals(p,cov,updated);
  if (!residuals) return;

  TH1F *h=0;
  Int_t esIndex = AliRecoParam::AConvert(fEventSpecie) ; 
  AliGeomManager::ELayerID layer=AliGeomManager::VolUIDToLayer(id);
  h=(TH1F*)fResiduals[esIndex]->At(2*layer-2);
  if (h) h->Fill(residuals[0]);
  h=(TH1F*)fResiduals[esIndex]->At(2*layer-1);
  if (h) h->Fill(residuals[1]);

  if (layer==5) {
    if (p[1]<0) {  // SSD1 absolute residuals
      h = (TH1F*)fResiduals[esIndex]->At(40);
      if (h) h->Fill(t->GetY()-p[0]); //C side
      h = (TH1F*)fResiduals[esIndex]->At(41);
      if (h) h->Fill(t->GetZ()-p[1]);
    } else {             
      h = (TH1F*)fResiduals[esIndex]->At(42);
      if (h) h->Fill(t->GetY()-p[0]); //A side
      h = (TH1F*)fResiduals[esIndex]->At(43);
      if (h) h->Fill(t->GetZ()-p[1]);
    }           
  }
  if (layer==6) {  // SSD2 absolute residuals
    if (p[1]<0) {
      h = (TH1F*)fResiduals[esIndex]->At(44);
      if (h) h->Fill(t->GetY()-p[0]); //C side
      h = (TH1F*)fResiduals[esIndex]->At(45);
      if (h) h->Fill(t->GetZ()-p[1]);
    } else {
      h = (TH1F*)fResiduals[esIndex]->At(46);
      if (h) h->Fill(t->GetY()-p[0]); //A side
      h = (TH1F*)fResiduals[esIndex]->At(47);
      if (h) h->Fill(t->GetZ()-p[1]);
    }
  }

}

void AliTracker::FillResiduals(const AliExternalTrackParam *t,
                               const AliCluster *c, Bool_t /*updated*/) {
  //
  // This function fills the histograms of residuals 
  // The array of these histos is external for this AliTracker class.
  // Normally, this array belong to AliGlobalQADataMaker class.  
  // 
  // For the moment, the residuals are absolute !
  //

  if (!fFillResiduals) return; 
  if (!fResiduals) return; 

  UShort_t id=c->GetVolumeId();
  const TGeoHMatrix *matrixT2L=AliGeomManager::GetTracking2LocalMatrix(id);

  // Position of the cluster in the tracking c.s.
  Double_t clsTrk[3]={c->GetX(), c->GetY(), c->GetZ()};
  // Position of the cluster in the local module c.s.
  Double_t clsLoc[3]={0.,0.,0.};
  matrixT2L->LocalToMaster(clsTrk,clsLoc);


  // Position of the intersection point in the tracking c.s.
  Double_t trkTrk[3]={t->GetX(),t->GetY(),t->GetZ()};
  // Position of the intersection point in the local module c.s.
  Double_t trkLoc[3]={0.,0.,0.};
  matrixT2L->LocalToMaster(trkTrk,trkLoc);

  Double_t residuals[2]={trkLoc[0]-clsLoc[0], trkLoc[2]-clsLoc[2]};

  TH1F *h=0;
  Int_t esIndex = AliRecoParam::AConvert(fEventSpecie) ; 
  AliGeomManager::ELayerID layer=AliGeomManager::VolUIDToLayer(id);
  h=(TH1F*)fResiduals[esIndex]->At(2*layer-2);
  if (h) h->Fill(residuals[0]);
  h=(TH1F*)fResiduals[esIndex]->At(2*layer-1);
  if (h) h->Fill(residuals[1]);

}

 AliTracker.cxx:1
 AliTracker.cxx:2
 AliTracker.cxx:3
 AliTracker.cxx:4
 AliTracker.cxx:5
 AliTracker.cxx:6
 AliTracker.cxx:7
 AliTracker.cxx:8
 AliTracker.cxx:9
 AliTracker.cxx:10
 AliTracker.cxx:11
 AliTracker.cxx:12
 AliTracker.cxx:13
 AliTracker.cxx:14
 AliTracker.cxx:15
 AliTracker.cxx:16
 AliTracker.cxx:17
 AliTracker.cxx:18
 AliTracker.cxx:19
 AliTracker.cxx:20
 AliTracker.cxx:21
 AliTracker.cxx:22
 AliTracker.cxx:23
 AliTracker.cxx:24
 AliTracker.cxx:25
 AliTracker.cxx:26
 AliTracker.cxx:27
 AliTracker.cxx:28
 AliTracker.cxx:29
 AliTracker.cxx:30
 AliTracker.cxx:31
 AliTracker.cxx:32
 AliTracker.cxx:33
 AliTracker.cxx:34
 AliTracker.cxx:35
 AliTracker.cxx:36
 AliTracker.cxx:37
 AliTracker.cxx:38
 AliTracker.cxx:39
 AliTracker.cxx:40
 AliTracker.cxx:41
 AliTracker.cxx:42
 AliTracker.cxx:43
 AliTracker.cxx:44
 AliTracker.cxx:45
 AliTracker.cxx:46
 AliTracker.cxx:47
 AliTracker.cxx:48
 AliTracker.cxx:49
 AliTracker.cxx:50
 AliTracker.cxx:51
 AliTracker.cxx:52
 AliTracker.cxx:53
 AliTracker.cxx:54
 AliTracker.cxx:55
 AliTracker.cxx:56
 AliTracker.cxx:57
 AliTracker.cxx:58
 AliTracker.cxx:59
 AliTracker.cxx:60
 AliTracker.cxx:61
 AliTracker.cxx:62
 AliTracker.cxx:63
 AliTracker.cxx:64
 AliTracker.cxx:65
 AliTracker.cxx:66
 AliTracker.cxx:67
 AliTracker.cxx:68
 AliTracker.cxx:69
 AliTracker.cxx:70
 AliTracker.cxx:71
 AliTracker.cxx:72
 AliTracker.cxx:73
 AliTracker.cxx:74
 AliTracker.cxx:75
 AliTracker.cxx:76
 AliTracker.cxx:77
 AliTracker.cxx:78
 AliTracker.cxx:79
 AliTracker.cxx:80
 AliTracker.cxx:81
 AliTracker.cxx:82
 AliTracker.cxx:83
 AliTracker.cxx:84
 AliTracker.cxx:85
 AliTracker.cxx:86
 AliTracker.cxx:87
 AliTracker.cxx:88
 AliTracker.cxx:89
 AliTracker.cxx:90
 AliTracker.cxx:91
 AliTracker.cxx:92
 AliTracker.cxx:93
 AliTracker.cxx:94
 AliTracker.cxx:95
 AliTracker.cxx:96
 AliTracker.cxx:97
 AliTracker.cxx:98
 AliTracker.cxx:99
 AliTracker.cxx:100
 AliTracker.cxx:101
 AliTracker.cxx:102
 AliTracker.cxx:103
 AliTracker.cxx:104
 AliTracker.cxx:105
 AliTracker.cxx:106
 AliTracker.cxx:107
 AliTracker.cxx:108
 AliTracker.cxx:109
 AliTracker.cxx:110
 AliTracker.cxx:111
 AliTracker.cxx:112
 AliTracker.cxx:113
 AliTracker.cxx:114
 AliTracker.cxx:115
 AliTracker.cxx:116
 AliTracker.cxx:117
 AliTracker.cxx:118
 AliTracker.cxx:119
 AliTracker.cxx:120
 AliTracker.cxx:121
 AliTracker.cxx:122
 AliTracker.cxx:123
 AliTracker.cxx:124
 AliTracker.cxx:125
 AliTracker.cxx:126
 AliTracker.cxx:127
 AliTracker.cxx:128
 AliTracker.cxx:129
 AliTracker.cxx:130
 AliTracker.cxx:131
 AliTracker.cxx:132
 AliTracker.cxx:133
 AliTracker.cxx:134
 AliTracker.cxx:135
 AliTracker.cxx:136
 AliTracker.cxx:137
 AliTracker.cxx:138
 AliTracker.cxx:139
 AliTracker.cxx:140
 AliTracker.cxx:141
 AliTracker.cxx:142
 AliTracker.cxx:143
 AliTracker.cxx:144
 AliTracker.cxx:145
 AliTracker.cxx:146
 AliTracker.cxx:147
 AliTracker.cxx:148
 AliTracker.cxx:149
 AliTracker.cxx:150
 AliTracker.cxx:151
 AliTracker.cxx:152
 AliTracker.cxx:153
 AliTracker.cxx:154
 AliTracker.cxx:155
 AliTracker.cxx:156
 AliTracker.cxx:157
 AliTracker.cxx:158
 AliTracker.cxx:159
 AliTracker.cxx:160
 AliTracker.cxx:161
 AliTracker.cxx:162
 AliTracker.cxx:163
 AliTracker.cxx:164
 AliTracker.cxx:165
 AliTracker.cxx:166
 AliTracker.cxx:167
 AliTracker.cxx:168
 AliTracker.cxx:169
 AliTracker.cxx:170
 AliTracker.cxx:171
 AliTracker.cxx:172
 AliTracker.cxx:173
 AliTracker.cxx:174
 AliTracker.cxx:175
 AliTracker.cxx:176
 AliTracker.cxx:177
 AliTracker.cxx:178
 AliTracker.cxx:179
 AliTracker.cxx:180
 AliTracker.cxx:181
 AliTracker.cxx:182
 AliTracker.cxx:183
 AliTracker.cxx:184
 AliTracker.cxx:185
 AliTracker.cxx:186
 AliTracker.cxx:187
 AliTracker.cxx:188
 AliTracker.cxx:189
 AliTracker.cxx:190
 AliTracker.cxx:191
 AliTracker.cxx:192
 AliTracker.cxx:193
 AliTracker.cxx:194
 AliTracker.cxx:195
 AliTracker.cxx:196
 AliTracker.cxx:197
 AliTracker.cxx:198
 AliTracker.cxx:199
 AliTracker.cxx:200
 AliTracker.cxx:201
 AliTracker.cxx:202
 AliTracker.cxx:203
 AliTracker.cxx:204
 AliTracker.cxx:205
 AliTracker.cxx:206
 AliTracker.cxx:207
 AliTracker.cxx:208
 AliTracker.cxx:209
 AliTracker.cxx:210
 AliTracker.cxx:211
 AliTracker.cxx:212
 AliTracker.cxx:213
 AliTracker.cxx:214
 AliTracker.cxx:215
 AliTracker.cxx:216
 AliTracker.cxx:217
 AliTracker.cxx:218
 AliTracker.cxx:219
 AliTracker.cxx:220
 AliTracker.cxx:221
 AliTracker.cxx:222
 AliTracker.cxx:223
 AliTracker.cxx:224
 AliTracker.cxx:225