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: AliTrackerBase.cxx 38069 2009-12-24 16:56:18Z belikov $ */

//-------------------------------------------------------------------------
//               Implementation of the AliTrackerBase class
//                that is the base for the AliTracker class    
//                     Origin: Marian.Ivanov@cern.ch
//-------------------------------------------------------------------------
#include <TClass.h>
#include <TMath.h>
#include <TGeoManager.h>

#include "AliLog.h"
#include "AliTrackerBase.h"
#include "AliExternalTrackParam.h"
#include "AliTrackPointArray.h"
#include "TVectorD.h"

extern TGeoManager *gGeoManager;

ClassImp(AliTrackerBase)

AliTrackerBase::AliTrackerBase():
  TObject(),
  fX(0),
  fY(0),
  fZ(0),
  fSigmaX(0.005),
  fSigmaY(0.005),
  fSigmaZ(0.010)
{
  //--------------------------------------------------------------------
  // The default constructor.
  //--------------------------------------------------------------------
  if (!TGeoGlobalMagField::Instance()->GetField())
    AliWarning("Field map is not set.");
}

//__________________________________________________________________________
AliTrackerBase::AliTrackerBase(const AliTrackerBase &atr):
  TObject(atr),
  fX(atr.fX),
  fY(atr.fY),
  fZ(atr.fZ),
  fSigmaX(atr.fSigmaX),
  fSigmaY(atr.fSigmaY),
  fSigmaZ(atr.fSigmaZ)
{
  //--------------------------------------------------------------------
  // The default constructor.
  //--------------------------------------------------------------------
  if (!TGeoGlobalMagField::Instance()->GetField())
    AliWarning("Field map is not set.");
}

//__________________________________________________________________________
Double_t AliTrackerBase::GetBz()
{
  AliMagF* fld = (AliMagF*)TGeoGlobalMagField::Instance()->GetField();
  if (!fld) {
    AliFatalClass("Field is not loaded");
    //if (!fld) 
    return  0.5*kAlmost0Field;
  }
  Double_t bz = fld->SolenoidField();
  return TMath::Sign(0.5*kAlmost0Field,bz) + bz;
}

//__________________________________________________________________________
Double_t AliTrackerBase::GetBz(const Double_t *r) {
  //------------------------------------------------------------------
  // Returns Bz (kG) at the point "r" .
  //------------------------------------------------------------------
  AliMagF* fld = (AliMagF*)TGeoGlobalMagField::Instance()->GetField();
  if (!fld) {
    AliFatalClass("Field is not loaded");
    //  if (!fld) 
    return  0.5*kAlmost0Field;
  }
  Double_t bz = fld->GetBz(r);
  return  TMath::Sign(0.5*kAlmost0Field,bz) + bz;
}

//__________________________________________________________________________
void AliTrackerBase::GetBxByBz(const Double_t r[3], Double_t b[3]) {
  //------------------------------------------------------------------
  // Returns Bx, By and Bz (kG) at the point "r" .
  //------------------------------------------------------------------
  AliMagF* fld = (AliMagF*)TGeoGlobalMagField::Instance()->GetField();
  if (!fld) {
    AliFatalClass("Field is not loaded");
    // b[0] = b[1] = 0.;
    // b[2] = 0.5*kAlmost0Field;
    return;
  }

  if (fld->IsUniform()) {
     b[0] = b[1] = 0.;
     b[2] = fld->SolenoidField();
  }  else {
     fld->Field(r,b);
  }
  b[2] = (TMath::Sign(0.5*kAlmost0Field,b[2]) + b[2]);
  return;
}

Double_t AliTrackerBase::MeanMaterialBudget(const Double_t *start, const Double_t *end, Double_t *mparam)
{
  // 
  // Calculate mean material budget and material properties between 
  //    the points "start" and "end".
  //
  // "mparam" - parameters used for the energy and multiple scattering
  //  corrections: 
  //
  // mparam[0] - mean density: sum(x_i*rho_i)/sum(x_i) [g/cm3]
  // mparam[1] - equivalent rad length fraction: sum(x_i/X0_i) [adimensional]
  // mparam[2] - mean A: sum(x_i*A_i)/sum(x_i) [adimensional]
  // mparam[3] - mean Z: sum(x_i*Z_i)/sum(x_i) [adimensional]
  // mparam[4] - length: sum(x_i) [cm]
  // mparam[5] - Z/A mean: sum(x_i*Z_i/A_i)/sum(x_i) [adimensional]
  // mparam[6] - number of boundary crosses
  //
  //  Origin:  Marian Ivanov, Marian.Ivanov@cern.ch
  //
  //  Corrections and improvements by
  //        Andrea Dainese, Andrea.Dainese@lnl.infn.it,
  //        Andrei Gheata,  Andrei.Gheata@cern.ch
  //

  mparam[0]=0; mparam[1]=1; mparam[2] =0; mparam[3] =0;
  mparam[4]=0; mparam[5]=0; mparam[6]=0;
  //
  Double_t bparam[6]; // total parameters
  Double_t lparam[6]; // local parameters

  for (Int_t i=0;i<6;i++) bparam[i]=0;

  if (!gGeoManager) {
    AliFatalClass("No TGeo\n");
    return 0.;
  }
  //
  Double_t length;
  Double_t dir[3];
  length = TMath::Sqrt((end[0]-start[0])*(end[0]-start[0])+
                       (end[1]-start[1])*(end[1]-start[1])+
                       (end[2]-start[2])*(end[2]-start[2]));
  mparam[4]=length;
  if (length<TGeoShape::Tolerance()) return 0.0;
  Double_t invlen = 1./length;
  dir[0] = (end[0]-start[0])*invlen;
  dir[1] = (end[1]-start[1])*invlen;
  dir[2] = (end[2]-start[2])*invlen;

  // Initialize start point and direction
  TGeoNode *currentnode = 0;
  TGeoNode *startnode = gGeoManager->InitTrack(start, dir);
  if (!startnode) {
    AliErrorClass(Form("start point out of geometry: x %f, y %f, z %f",
		  start[0],start[1],start[2]));
    return 0.0;
  }
  TGeoMaterial *material = startnode->GetVolume()->GetMedium()->GetMaterial();
  lparam[0]   = material->GetDensity();
  lparam[1]   = material->GetRadLen();
  lparam[2]   = material->GetA();
  lparam[3]   = material->GetZ();
  lparam[4]   = length;
  lparam[5]   = lparam[3]/lparam[2];
  if (material->IsMixture()) {
    TGeoMixture * mixture = (TGeoMixture*)material;
    lparam[5] =0;
    Double_t sum =0;
    for (Int_t iel=0;iel<mixture->GetNelements();iel++){
      sum  += mixture->GetWmixt()[iel];
      lparam[5]+= mixture->GetZmixt()[iel]*mixture->GetWmixt()[iel]/mixture->GetAmixt()[iel];
    }
    lparam[5]/=sum;
  }

  // Locate next boundary within length without computing safety.
  // Propagate either with length (if no boundary found) or just cross boundary
  gGeoManager->FindNextBoundaryAndStep(length, kFALSE);
  Double_t step = 0.0; // Step made
  Double_t snext = gGeoManager->GetStep();
  // If no boundary within proposed length, return current density
  if (!gGeoManager->IsOnBoundary()) {
    mparam[0] = lparam[0];
    mparam[1] = lparam[4]/lparam[1];
    mparam[2] = lparam[2];
    mparam[3] = lparam[3];
    mparam[4] = lparam[4];
    return lparam[0];
  }
  // Try to cross the boundary and see what is next
  Int_t nzero = 0;
  while (length>TGeoShape::Tolerance()) {
    currentnode = gGeoManager->GetCurrentNode();
    if (snext<2.*TGeoShape::Tolerance()) nzero++;
    else nzero = 0;
    if (nzero>3) {
      // This means navigation has problems on one boundary
      // Try to cross by making a small step
      AliErrorClass("Cannot cross boundary\n");
      mparam[0] = bparam[0]/step;
      mparam[1] = bparam[1];
      mparam[2] = bparam[2]/step;
      mparam[3] = bparam[3]/step;
      mparam[5] = bparam[5]/step;
      mparam[4] = step;
      mparam[0] = 0.;             // if crash of navigation take mean density 0
      mparam[1] = 1000000;        // and infinite rad length
      return bparam[0]/step;
    }
    mparam[6]+=1.;
    step += snext;
    bparam[1]    += snext/lparam[1];
    bparam[2]    += snext*lparam[2];
    bparam[3]    += snext*lparam[3];
    bparam[5]    += snext*lparam[5];
    bparam[0]    += snext*lparam[0];

    if (snext>=length) break;
    if (!currentnode) break;
    length -= snext;
    material = currentnode->GetVolume()->GetMedium()->GetMaterial();
    lparam[0] = material->GetDensity();
    lparam[1]  = material->GetRadLen();
    lparam[2]  = material->GetA();
    lparam[3]  = material->GetZ();
    lparam[5]   = lparam[3]/lparam[2];
    if (material->IsMixture()) {
      TGeoMixture * mixture = (TGeoMixture*)material;
      lparam[5]=0;
      Double_t sum =0;
      for (Int_t iel=0;iel<mixture->GetNelements();iel++){
        sum+= mixture->GetWmixt()[iel];
        lparam[5]+= mixture->GetZmixt()[iel]*mixture->GetWmixt()[iel]/mixture->GetAmixt()[iel];
      }
      lparam[5]/=sum;
    }
    gGeoManager->FindNextBoundaryAndStep(length, kFALSE);
    snext = gGeoManager->GetStep();
  }
  mparam[0] = bparam[0]/step;
  mparam[1] = bparam[1];
  mparam[2] = bparam[2]/step;
  mparam[3] = bparam[3]/step;
  mparam[5] = bparam[5]/step;
  return bparam[0]/step;
}


Bool_t 
AliTrackerBase::PropagateTrackTo(AliExternalTrackParam *track, Double_t xToGo, 
				 Double_t mass, Double_t maxStep, Bool_t rotateTo, Double_t maxSnp, Int_t sign, Bool_t addTimeStep, Bool_t correctMaterialBudget){
  //----------------------------------------------------------------
  //
  // Propagates the track to the plane X=xk (cm) using the magnetic field map 
  // and correcting for the crossed material.
  //
  // mass     - mass used in propagation - used for energy loss correction (if <0 then q = 2)
  // maxStep  - maximal step for propagation
  //
  //  Origin: Marian Ivanov,  Marian.Ivanov@cern.ch
  //
  //----------------------------------------------------------------
  const Double_t kEpsilon = 0.00001;
  Double_t xpos     = track->GetX();
  Int_t dir         = (xpos<xToGo) ? 1:-1;
  //
  while ( (xToGo-xpos)*dir > kEpsilon){
    Double_t step = dir*TMath::Min(TMath::Abs(xToGo-xpos), maxStep);
    Double_t x    = xpos+step;
    Double_t xyz0[3],xyz1[3],param[7];
    track->GetXYZ(xyz0);   //starting global position

    Double_t bz=GetBz(xyz0); // getting the local Bz
    if (!track->GetXYZAt(x,bz,xyz1)) return kFALSE;   // no prolongation
    xyz1[2]+=kEpsilon; // waiting for bug correction in geo
    
    if (maxSnp>0 && TMath::Abs(track->GetSnpAt(x,bz)) >= maxSnp) return kFALSE;
    if (!track->PropagateTo(x,bz))  return kFALSE;

    if (correctMaterialBudget){
      MeanMaterialBudget(xyz0,xyz1,param);
      Double_t xrho=param[0]*param[4], xx0=param[1];
      if (sign) {if (sign<0) xrho = -xrho;}  // sign is imposed
      else { // determine automatically the sign from direction
        if (dir>0) xrho = -xrho; // outward should be negative
      }
      //
      if (!track->CorrectForMeanMaterial(xx0,xrho,mass)) return kFALSE;
    }
    
    if (rotateTo){
      track->GetXYZ(xyz1);   // global position
      Double_t alphan = TMath::ATan2(xyz1[1], xyz1[0]); 
      if (maxSnp>0) {
	if (TMath::Abs(track->GetSnp()) >= maxSnp) return kFALSE;
        
	//
	Double_t ca=TMath::Cos(alphan-track->GetAlpha()), sa=TMath::Sin(alphan-track->GetAlpha());
	Double_t sf=track->GetSnp(), cf=TMath::Sqrt((1.-sf)*(1.+sf));
	Double_t sinNew =  sf*ca - cf*sa;
        if (TMath::Abs(sinNew) >= maxSnp) return kFALSE;
        
      }
      if (!track->AliExternalTrackParam::Rotate(alphan)) return kFALSE;
      
    }
    xpos = track->GetX();
    if (addTimeStep && track->IsStartedTimeIntegral()) {
      if (!rotateTo) track->GetXYZ(xyz1); // if rotateTo==kTRUE, then xyz1 is already extracted
      Double_t dX=xyz0[0]-xyz1[0],dY=xyz0[1]-xyz1[1],dZ=xyz0[2]-xyz1[2]; 
      Double_t d=TMath::Sqrt(dX*dX + dY*dY + dZ*dZ);
      if (sign) {if (sign>0) d = -d;}  // step sign is imposed, positive means inward direction
      else { // determine automatically the sign from direction
	if (dir<0) d = -d;
      }
      track->AddTimeStep(d);
    }
  }
  return kTRUE;
}

Int_t AliTrackerBase::PropagateTrackTo2(AliExternalTrackParam *track, Double_t xToGo,
                                        Double_t mass, Double_t maxStep, Bool_t rotateTo, Double_t maxSnp, Int_t sign, Bool_t addTimeStep, Bool_t correctMaterialBudget){
  //----------------------------------------------------------------
  //
  // Propagates the track to the plane X=xk (cm) using the magnetic field map
  // and correcting for the crossed material.
  //
  // mass     - mass used in propagation - used for energy loss correction
  // maxStep  - maximal step for propagation
  //
  //  Origin: Marian Ivanov,  Marian.Ivanov@cern.ch
  //
  //----------------------------------------------------------------
  const Double_t kEpsilon = 0.00001;
  Double_t xpos     = track->GetX();
  Int_t dir         = (xpos<xToGo) ? 1:-1;
  //
  while ( (xToGo-xpos)*dir > kEpsilon){
    Double_t step = dir*TMath::Min(TMath::Abs(xToGo-xpos), maxStep);
    Double_t x    = xpos+step;
    Double_t xyz0[3],xyz1[3],param[7];
    track->GetXYZ(xyz0);   //starting global position
    
    Double_t bz=GetBz(xyz0); // getting the local Bz
    if (!track->GetXYZAt(x,bz,xyz1)) return -1;   // no prolongation
    xyz1[2]+=kEpsilon; // waiting for bug correction in geo
    
    if (maxSnp>0 && TMath::Abs(track->GetSnpAt(x,bz)) >= maxSnp) return -2;
    if (!track->PropagateTo(x,bz))  return -3;
    
    if (correctMaterialBudget){
      MeanMaterialBudget(xyz0,xyz1,param);
      Double_t xrho=param[0]*param[4], xx0=param[1];
      if (sign) {if (sign<0) xrho = -xrho;}  // sign is imposed
      else { // determine automatically the sign from direction
        if (dir>0) xrho = -xrho; // outward should be negative
      }
      //
      if (!track->CorrectForMeanMaterial(xx0,xrho,mass)) return -4;
    }
    
    if (rotateTo){
      track->GetXYZ(xyz1);   // global position
      Double_t alphan = TMath::ATan2(xyz1[1], xyz1[0]);
      if (maxSnp>0) {
        if (TMath::Abs(track->GetSnp()) >= maxSnp) return -5;
        
        //
        Double_t ca=TMath::Cos(alphan-track->GetAlpha()), sa=TMath::Sin(alphan-track->GetAlpha());
        Double_t sf=track->GetSnp(), cf=TMath::Sqrt((1.-sf)*(1.+sf));
        Double_t sinNew =  sf*ca - cf*sa;
        if (TMath::Abs(sinNew) >= maxSnp) return -6;
        
      }
      if (!track->AliExternalTrackParam::Rotate(alphan)) return -7;
      
    }
    xpos = track->GetX();
    if (addTimeStep && track->IsStartedTimeIntegral()) {
      if (!rotateTo) track->GetXYZ(xyz1); // if rotateTo==kTRUE, then xyz1 is already extracted
      Double_t dX=xyz0[0]-xyz1[0],dY=xyz0[1]-xyz1[1],dZ=xyz0[2]-xyz1[2];
      Double_t d=TMath::Sqrt(dX*dX + dY*dY + dZ*dZ);
      if (sign) {if (sign>0) d = -d;}  // step sign is imposed, positive means inward direction
      else { // determine automatically the sign from direction
        if (dir<0) d = -d;
      }
      track->AddTimeStep(d);
    }
  }
  return 1;
}

Bool_t 
AliTrackerBase::PropagateTrackToBxByBz(AliExternalTrackParam *track,
				       Double_t xToGo,Double_t mass, Double_t maxStep, Bool_t rotateTo, Double_t maxSnp,Int_t sign, Bool_t addTimeStep){
  //----------------------------------------------------------------
  //
  // Propagates the track to the plane X=xk (cm)
  // taking into account all the three components of the magnetic field 
  // and correcting for the crossed material.
  //
  // mass     - mass used in propagation - used for energy loss correction (if <0 then q=2)
  // maxStep  - maximal step for propagation
  //
  //  Origin: Marian Ivanov,  Marian.Ivanov@cern.ch
  //
  //----------------------------------------------------------------
  const Double_t kEpsilon = 0.00001;
  Double_t xpos     = track->GetX();
  Int_t dir         = (xpos<xToGo) ? 1:-1;
  //
  while ( (xToGo-xpos)*dir > kEpsilon){
    Double_t step = dir*TMath::Min(TMath::Abs(xToGo-xpos), maxStep);
    Double_t x    = xpos+step;
    Double_t xyz0[3],xyz1[3],param[7];
    track->GetXYZ(xyz0);   //starting global position

    Double_t b[3]; GetBxByBz(xyz0,b); // getting the local Bx, By and Bz

    if (!track->GetXYZAt(x,b[2],xyz1)) return kFALSE;   // no prolongation
    xyz1[2]+=kEpsilon; // waiting for bug correction in geo

    if (maxSnp>0 && TMath::Abs(track->GetSnpAt(x,b[2])) >= maxSnp) return kFALSE;
    if (!track->PropagateToBxByBz(x,b))  return kFALSE;

    MeanMaterialBudget(xyz0,xyz1,param);    
    Double_t xrho=param[0]*param[4], xx0=param[1];
    if (sign) {if (sign<0) xrho = -xrho;}  // sign is imposed
    else { // determine automatically the sign from direction
      if (dir>0) xrho = -xrho; // outward should be negative
    }    
    //
    if (!track->CorrectForMeanMaterial(xx0,xrho,mass)) return kFALSE;
    if (rotateTo){
      track->GetXYZ(xyz1);   // global position
      Double_t alphan = TMath::ATan2(xyz1[1], xyz1[0]); 
      if (maxSnp>0) {
	if (TMath::Abs(track->GetSnp()) >= maxSnp) return kFALSE;
	Double_t ca=TMath::Cos(alphan-track->GetAlpha()), sa=TMath::Sin(alphan-track->GetAlpha());
	Double_t sf=track->GetSnp(), cf=TMath::Sqrt((1.-sf)*(1.+sf));
	Double_t sinNew =  sf*ca - cf*sa;
	if (TMath::Abs(sinNew) >= maxSnp) return kFALSE;
      }
      if (!track->AliExternalTrackParam::Rotate(alphan)) return kFALSE;
    }
    xpos = track->GetX();    
    if (addTimeStep && track->IsStartedTimeIntegral()) {
      if (!rotateTo) track->GetXYZ(xyz1); // if rotateTo==kTRUE, then xyz1 is already extracted
      Double_t dX=xyz0[0]-xyz1[0],dY=xyz0[1]-xyz1[1],dZ=xyz0[2]-xyz1[2]; 
      Double_t d=TMath::Sqrt(dX*dX + dY*dY + dZ*dZ);
      if (sign) {if (sign>0) d = -d;}  // step sign is imposed, positive means inward direction
      else { // determine automatically the sign from direction
	if (dir<0) d = -d;
      }
      track->AddTimeStep(d);
    }
  }
  return kTRUE;
}

Double_t AliTrackerBase::GetTrackPredictedChi2(AliExternalTrackParam *track,
                                           Double_t mass, Double_t step,
			             const AliExternalTrackParam *backup) {
  //
  // This function brings the "track" with particle "mass" [GeV] 
  // to the same local coord. system and the same reference plane as 
  // of the "backup", doing it in "steps" [cm].
  // Then, it calculates the 5D predicted Chi2 for these two tracks
  //
  Double_t chi2=kVeryBig;
  Double_t alpha=backup->GetAlpha();
  if (!track->Rotate(alpha)) return chi2;

  Double_t xb=backup->GetX();
  Double_t sign=(xb < track->GetX()) ? 1. : -1.;
  if (!PropagateTrackTo(track,xb,mass,step,kFALSE,kAlmost1,sign)) return chi2;

  chi2=track->GetPredictedChi2(backup);

  return chi2;
}




Double_t AliTrackerBase::MakeC(Double_t x1,Double_t y1,
                   Double_t x2,Double_t y2,
                   Double_t x3,Double_t y3)
{
  //-----------------------------------------------------------------
  // Initial approximation of the track curvature
  //-----------------------------------------------------------------
  x3 -=x1;
  x2 -=x1;
  y3 -=y1;
  y2 -=y1;
  //  
  Double_t det = x3*y2-x2*y3;
  if (TMath::Abs(det)<1e-10) {
    return 0;
  }
  //
  Double_t u = 0.5* (x2*(x2-x3)+y2*(y2-y3))/det;
  Double_t x0 = x3*0.5-y3*u;
  Double_t y0 = y3*0.5+x3*u;
  Double_t c2 = 1/TMath::Sqrt(x0*x0+y0*y0);
  if (det>0) c2*=-1;
  return c2;
}

Double_t AliTrackerBase::MakeSnp(Double_t x1,Double_t y1,
                   Double_t x2,Double_t y2,
                   Double_t x3,Double_t y3)
{
  //-----------------------------------------------------------------
  // Initial approximation of the track snp
  //-----------------------------------------------------------------
  x3 -=x1;
  x2 -=x1;
  y3 -=y1;
  y2 -=y1;
  //  
  Double_t det = x3*y2-x2*y3;
  if (TMath::Abs(det)<1e-10) {
    return 0;
  }
  //
  Double_t u = 0.5* (x2*(x2-x3)+y2*(y2-y3))/det;
  Double_t x0 = x3*0.5-y3*u; 
  Double_t y0 = y3*0.5+x3*u;
  Double_t c2 = 1./TMath::Sqrt(x0*x0+y0*y0);
  x0*=c2;
  x0=TMath::Abs(x0);
  if (y2*x2<0.) x0*=-1;
  return x0;
}

Double_t AliTrackerBase::MakeTgl(Double_t x1,Double_t y1,
                   Double_t x2,Double_t y2,
                   Double_t z1,Double_t z2, Double_t c)
{
  //-----------------------------------------------------------------
  // Initial approximation of the tangent of the track dip angle
  //-----------------------------------------------------------------
  //
  const Double_t kEpsilon =0.00001;
  x2-=x1;
  y2-=y1;
  z2-=z1;
  Double_t d  =  TMath::Sqrt(x2*x2+y2*y2);  // distance  straight line
  if (TMath::Abs(d*c*0.5)>1) return 0;
  Double_t   angle2    = TMath::ASin(d*c*0.5); 
  if (TMath::Abs(angle2)>kEpsilon)  {
    angle2  = z2*TMath::Abs(c/(angle2*2.));
  }else{
    angle2=z2/d;
  }
  return angle2;
}


Double_t AliTrackerBase::MakeTgl(Double_t x1,Double_t y1, 
                   Double_t x2,Double_t y2,
                   Double_t z1,Double_t z2) 
{
  //-----------------------------------------------------------------
  // Initial approximation of the tangent of the track dip angle
  //-----------------------------------------------------------------
  return (z1 - z2)/sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
}


AliExternalTrackParam * AliTrackerBase::MakeSeed( AliTrackPoint &point0, AliTrackPoint &point1, AliTrackPoint &point2){
  //
  // Make Seed  - AliExternalTrackParam from input 3 points   
  // returning seed in local frame of point0
  //
  Double_t xyz0[3]={0,0,0};
  Double_t xyz1[3]={0,0,0};
  Double_t xyz2[3]={0,0,0};
  Double_t alpha=point0.GetAngle();
  Double_t xyz[3]={point0.GetX(),point0.GetY(),point0.GetZ()};
  Double_t bxyz[3]; GetBxByBz(xyz,bxyz); 
  Double_t bz = bxyz[2];
  //
  // get points in frame of point 0
  //
  AliTrackPoint p0r = point0.Rotate(alpha);
  AliTrackPoint p1r = point1.Rotate(alpha);
  AliTrackPoint p2r = point2.Rotate(alpha);
  xyz0[0]=p0r.GetX();
  xyz0[1]=p0r.GetY();
  xyz0[2]=p0r.GetZ();
  xyz1[0]=p1r.GetX();
  xyz1[1]=p1r.GetY();
  xyz1[2]=p1r.GetZ();
  xyz2[0]=p2r.GetX();
  xyz2[1]=p2r.GetY();
  xyz2[2]=p2r.GetZ();
  //
  // make covariance estimate
  //  
  Double_t covar[15];
  Double_t param[5]={0,0,0,0,0};
  for (Int_t m=0; m<15; m++) covar[m]=0;
  //
  // calculate intitial param
  param[0]=xyz0[1];              
  param[1]=xyz0[2];
  param[2]=MakeSnp(xyz0[0],xyz0[1],xyz1[0],xyz1[1],xyz2[0],xyz2[1]);
  param[4]=MakeC(xyz0[0],xyz0[1],xyz1[0],xyz1[1],xyz2[0],xyz2[1]);
  param[3]=MakeTgl(xyz0[0],xyz0[1],xyz1[0],xyz1[1],xyz0[2],xyz1[2],param[4]);

  //covariance matrix - only diagonal elements
  //Double_t dist=p0r.GetX()-p2r.GetX();
  Double_t deltaP=0;
  covar[0]= p0r.GetCov()[3];
  covar[2]= p0r.GetCov()[5];
  //sigma snp
  deltaP= (MakeSnp(xyz0[0],xyz0[1]+TMath::Sqrt(p0r.GetCov()[3]),xyz1[0],xyz1[1],xyz2[0],xyz2[1])-param[2]);
  covar[5]+= deltaP*deltaP;
  deltaP= (MakeSnp(xyz0[0],xyz0[1],xyz1[0],xyz1[1]+TMath::Sqrt(p1r.GetCov()[3]),xyz2[0],xyz2[1])-param[2]);
  covar[5]+= deltaP*deltaP;
  deltaP= (MakeSnp(xyz0[0],xyz0[1],xyz1[0],xyz1[1],xyz2[0],xyz2[1]+TMath::Sqrt(p1r.GetCov()[3]))-param[2]);
  covar[5]+= deltaP*deltaP;
  //sigma tgl
  //
  deltaP=MakeTgl(xyz0[0],xyz0[1],xyz1[0],xyz1[1],xyz0[2]+TMath::Sqrt(p1r.GetCov()[5]),xyz1[2],param[4])-param[3];
  covar[9]+= deltaP*deltaP;
  deltaP=MakeTgl(xyz0[0],xyz0[1],xyz1[0],xyz1[1],xyz0[2],xyz1[2]+TMath::Sqrt(p1r.GetCov()[5]),param[4])-param[3];
  covar[9]+= deltaP*deltaP;
  //
  
  deltaP=MakeC(xyz0[0],xyz0[1]+TMath::Sqrt(p0r.GetCov()[3]),xyz1[0],xyz1[1],xyz2[0],xyz2[1])-param[4];
  covar[14]+= deltaP*deltaP;
  deltaP=MakeC(xyz0[0],xyz0[1],xyz1[0],xyz1[1]+TMath::Sqrt(p1r.GetCov()[3]),xyz2[0],xyz2[1])-param[4];
  covar[14]+= deltaP*deltaP;
  deltaP=MakeC(xyz0[0],xyz0[1],xyz1[0],xyz1[1],xyz2[0],xyz2[1]+TMath::Sqrt(p2r.GetCov()[3]))-param[4];
  covar[14]+= deltaP*deltaP;
  
  covar[14]/=(bz*kB2C)*(bz*kB2C);
  param[4]/=(bz*kB2C); // transform to 1/pt
  AliExternalTrackParam * trackParam = new AliExternalTrackParam(xyz0[0],alpha,param, covar);
  if (0) {
    // consistency check  -to put warnings here 
    // small disagrement once Track extrapolation used 
    // nice agreement in seeds with MC track parameters - problem in extrapoloation - to be fixed
    // to check later
    Double_t y1,y2,z1,z2;
    trackParam->GetYAt(xyz1[0],bz,y1);
    trackParam->GetZAt(xyz1[0],bz,z1);
    trackParam->GetYAt(xyz2[0],bz,y2);
    trackParam->GetZAt(xyz2[0],bz,z2);
    if (TMath::Abs(y1-xyz1[1])> TMath::Sqrt(p1r.GetCov()[3]*5)){
      AliWarningClass("Seeding problem y1\n");
    }
    if (TMath::Abs(y2-xyz2[1])> TMath::Sqrt(p2r.GetCov()[3]*5)){
      AliWarningClass("Seeding problem y2\n");
    }
    if (TMath::Abs(z1-xyz1[2])> TMath::Sqrt(p1r.GetCov()[5]*5)){
      AliWarningClass("Seeding problem z1\n");
    }
  }
  return trackParam;  
} 

Double_t  AliTrackerBase::FitTrack(AliExternalTrackParam * trackParam, AliTrackPointArray *pointArray, Double_t mass, Double_t maxStep){
  //
  // refit the track  - trackParam using the points in point array  
  //
  const Double_t kMaxSnp=0.99;
  if (!trackParam) return 0;
  Int_t  npoints=pointArray->GetNPoints();
  AliTrackPoint point,point2;
  Double_t pointPos[2]={0,0};
  Double_t pointCov[3]={0,0,0};
  // choose coordinate frame
  // in standard way the coordinate frame should be changed point by point
  // Some problems with rotation observed
  // rotate method of AliExternalTrackParam should be revisited
  pointArray->GetPoint(point,0);
  pointArray->GetPoint(point2,npoints-1);
  Double_t alpha=TMath::ATan2(point.GetY()-point2.GetY(), point.GetX()-point2.GetX());
  
  for (Int_t ipoint=npoints-1; ipoint>0; ipoint-=1){
    pointArray->GetPoint(point,ipoint);
    AliTrackPoint pr = point.Rotate(alpha);
    trackParam->Rotate(alpha);
    Bool_t status = PropagateTrackTo(trackParam,pr.GetX(),mass,maxStep,kFALSE,kMaxSnp);
    if(!status){
      AliWarningClass("Problem to propagate\n");    
      break;
    }
    if (TMath::Abs(trackParam->GetSnp())>kMaxSnp){ 
      AliWarningClass("sin(phi) > kMaxSnp \n");
      break;
    }
    pointPos[0]=pr.GetY();//local y
    pointPos[1]=pr.GetZ();//local z
    pointCov[0]=pr.GetCov()[3];//simay^2
    pointCov[1]=pr.GetCov()[4];//sigmayz
    pointCov[2]=pr.GetCov()[5];//sigmaz^2
    trackParam->Update(pointPos,pointCov); 
  }
  return 0;
}



void AliTrackerBase::UpdateTrack(AliExternalTrackParam &track1, const AliExternalTrackParam &track2){
  //
  // Update track 1 with track 2
  //
  //
  //
  TMatrixD vecXk(5,1);    // X vector
  TMatrixD covXk(5,5);    // X covariance 
  TMatrixD matHk(5,5);    // vector to mesurement
  TMatrixD measR(5,5);    // measurement error 
  TMatrixD vecZk(5,1);    // measurement
  //
  TMatrixD vecYk(5,1);    // Innovation or measurement residual
  TMatrixD matHkT(5,5);
  TMatrixD matSk(5,5);    // Innovation (or residual) covariance
  TMatrixD matKk(5,5);    // Optimal Kalman gain
  TMatrixD mat1(5,5);     // update covariance matrix
  TMatrixD covXk2(5,5);   // 
  TMatrixD covOut(5,5);
  //
  Double_t *param1=(Double_t*) track1.GetParameter();
  Double_t *covar1=(Double_t*) track1.GetCovariance();
  Double_t *param2=(Double_t*) track2.GetParameter();
  Double_t *covar2=(Double_t*) track2.GetCovariance();
  //
  // copy data to the matrix
  for (Int_t ipar=0; ipar<5; ipar++){
    for (Int_t jpar=0; jpar<5; jpar++){
      covXk(ipar,jpar) = covar1[track1.GetIndex(ipar, jpar)];
      measR(ipar,jpar) = covar2[track2.GetIndex(ipar, jpar)];
      matHk(ipar,jpar)=0;
      mat1(ipar,jpar)=0;
    }
    vecXk(ipar,0) = param1[ipar];
    vecZk(ipar,0) = param2[ipar];
    matHk(ipar,ipar)=1;
    mat1(ipar,ipar)=1;
  }
  //
  //
  //
  //
  //
  vecYk = vecZk-matHk*vecXk;                 // Innovation or measurement residual
  matHkT=matHk.T(); matHk.T();
  matSk = (matHk*(covXk*matHkT))+measR;      // Innovation (or residual) covariance
  matSk.Invert();
  matKk = (covXk*matHkT)*matSk;              //  Optimal Kalman gain
  vecXk += matKk*vecYk;                      //  updated vector 
  covXk2 = (mat1-(matKk*matHk));
  covOut =  covXk2*covXk; 
  //
  //
  //
  // copy from matrix to parameters
  if (0) {
    vecXk.Print();
    vecZk.Print();
    //
    measR.Print();
    covXk.Print();
    covOut.Print();
    //
    track1.Print();
    track2.Print();
  }

  for (Int_t ipar=0; ipar<5; ipar++){
    param1[ipar]= vecXk(ipar,0) ;
    for (Int_t jpar=0; jpar<5; jpar++){
      covar1[track1.GetIndex(ipar, jpar)]=covOut(ipar,jpar);
    }
  }
}


 AliTrackerBase.cxx:1
 AliTrackerBase.cxx:2
 AliTrackerBase.cxx:3
 AliTrackerBase.cxx:4
 AliTrackerBase.cxx:5
 AliTrackerBase.cxx:6
 AliTrackerBase.cxx:7
 AliTrackerBase.cxx:8
 AliTrackerBase.cxx:9
 AliTrackerBase.cxx:10
 AliTrackerBase.cxx:11
 AliTrackerBase.cxx:12
 AliTrackerBase.cxx:13
 AliTrackerBase.cxx:14
 AliTrackerBase.cxx:15
 AliTrackerBase.cxx:16
 AliTrackerBase.cxx:17
 AliTrackerBase.cxx:18
 AliTrackerBase.cxx:19
 AliTrackerBase.cxx:20
 AliTrackerBase.cxx:21
 AliTrackerBase.cxx:22
 AliTrackerBase.cxx:23
 AliTrackerBase.cxx:24
 AliTrackerBase.cxx:25
 AliTrackerBase.cxx:26
 AliTrackerBase.cxx:27
 AliTrackerBase.cxx:28
 AliTrackerBase.cxx:29
 AliTrackerBase.cxx:30
 AliTrackerBase.cxx:31
 AliTrackerBase.cxx:32
 AliTrackerBase.cxx:33
 AliTrackerBase.cxx:34
 AliTrackerBase.cxx:35
 AliTrackerBase.cxx:36
 AliTrackerBase.cxx:37
 AliTrackerBase.cxx:38
 AliTrackerBase.cxx:39
 AliTrackerBase.cxx:40
 AliTrackerBase.cxx:41
 AliTrackerBase.cxx:42
 AliTrackerBase.cxx:43
 AliTrackerBase.cxx:44
 AliTrackerBase.cxx:45
 AliTrackerBase.cxx:46
 AliTrackerBase.cxx:47
 AliTrackerBase.cxx:48
 AliTrackerBase.cxx:49
 AliTrackerBase.cxx:50
 AliTrackerBase.cxx:51
 AliTrackerBase.cxx:52
 AliTrackerBase.cxx:53
 AliTrackerBase.cxx:54
 AliTrackerBase.cxx:55
 AliTrackerBase.cxx:56
 AliTrackerBase.cxx:57
 AliTrackerBase.cxx:58
 AliTrackerBase.cxx:59
 AliTrackerBase.cxx:60
 AliTrackerBase.cxx:61
 AliTrackerBase.cxx:62
 AliTrackerBase.cxx:63
 AliTrackerBase.cxx:64
 AliTrackerBase.cxx:65
 AliTrackerBase.cxx:66
 AliTrackerBase.cxx:67
 AliTrackerBase.cxx:68
 AliTrackerBase.cxx:69
 AliTrackerBase.cxx:70
 AliTrackerBase.cxx:71
 AliTrackerBase.cxx:72
 AliTrackerBase.cxx:73
 AliTrackerBase.cxx:74
 AliTrackerBase.cxx:75
 AliTrackerBase.cxx:76
 AliTrackerBase.cxx:77
 AliTrackerBase.cxx:78
 AliTrackerBase.cxx:79
 AliTrackerBase.cxx:80
 AliTrackerBase.cxx:81
 AliTrackerBase.cxx:82
 AliTrackerBase.cxx:83
 AliTrackerBase.cxx:84
 AliTrackerBase.cxx:85
 AliTrackerBase.cxx:86
 AliTrackerBase.cxx:87
 AliTrackerBase.cxx:88
 AliTrackerBase.cxx:89
 AliTrackerBase.cxx:90
 AliTrackerBase.cxx:91
 AliTrackerBase.cxx:92
 AliTrackerBase.cxx:93
 AliTrackerBase.cxx:94
 AliTrackerBase.cxx:95
 AliTrackerBase.cxx:96
 AliTrackerBase.cxx:97
 AliTrackerBase.cxx:98
 AliTrackerBase.cxx:99
 AliTrackerBase.cxx:100
 AliTrackerBase.cxx:101
 AliTrackerBase.cxx:102
 AliTrackerBase.cxx:103
 AliTrackerBase.cxx:104
 AliTrackerBase.cxx:105
 AliTrackerBase.cxx:106
 AliTrackerBase.cxx:107
 AliTrackerBase.cxx:108
 AliTrackerBase.cxx:109
 AliTrackerBase.cxx:110
 AliTrackerBase.cxx:111
 AliTrackerBase.cxx:112
 AliTrackerBase.cxx:113
 AliTrackerBase.cxx:114
 AliTrackerBase.cxx:115
 AliTrackerBase.cxx:116
 AliTrackerBase.cxx:117
 AliTrackerBase.cxx:118
 AliTrackerBase.cxx:119
 AliTrackerBase.cxx:120
 AliTrackerBase.cxx:121
 AliTrackerBase.cxx:122
 AliTrackerBase.cxx:123
 AliTrackerBase.cxx:124
 AliTrackerBase.cxx:125
 AliTrackerBase.cxx:126
 AliTrackerBase.cxx:127
 AliTrackerBase.cxx:128
 AliTrackerBase.cxx:129
 AliTrackerBase.cxx:130
 AliTrackerBase.cxx:131
 AliTrackerBase.cxx:132
 AliTrackerBase.cxx:133
 AliTrackerBase.cxx:134
 AliTrackerBase.cxx:135
 AliTrackerBase.cxx:136
 AliTrackerBase.cxx:137
 AliTrackerBase.cxx:138
 AliTrackerBase.cxx:139
 AliTrackerBase.cxx:140
 AliTrackerBase.cxx:141
 AliTrackerBase.cxx:142
 AliTrackerBase.cxx:143
 AliTrackerBase.cxx:144
 AliTrackerBase.cxx:145
 AliTrackerBase.cxx:146
 AliTrackerBase.cxx:147
 AliTrackerBase.cxx:148
 AliTrackerBase.cxx:149
 AliTrackerBase.cxx:150
 AliTrackerBase.cxx:151
 AliTrackerBase.cxx:152
 AliTrackerBase.cxx:153
 AliTrackerBase.cxx:154
 AliTrackerBase.cxx:155
 AliTrackerBase.cxx:156
 AliTrackerBase.cxx:157
 AliTrackerBase.cxx:158
 AliTrackerBase.cxx:159
 AliTrackerBase.cxx:160
 AliTrackerBase.cxx:161
 AliTrackerBase.cxx:162
 AliTrackerBase.cxx:163
 AliTrackerBase.cxx:164
 AliTrackerBase.cxx:165
 AliTrackerBase.cxx:166
 AliTrackerBase.cxx:167
 AliTrackerBase.cxx:168
 AliTrackerBase.cxx:169
 AliTrackerBase.cxx:170
 AliTrackerBase.cxx:171
 AliTrackerBase.cxx:172
 AliTrackerBase.cxx:173
 AliTrackerBase.cxx:174
 AliTrackerBase.cxx:175
 AliTrackerBase.cxx:176
 AliTrackerBase.cxx:177
 AliTrackerBase.cxx:178
 AliTrackerBase.cxx:179
 AliTrackerBase.cxx:180
 AliTrackerBase.cxx:181
 AliTrackerBase.cxx:182
 AliTrackerBase.cxx:183
 AliTrackerBase.cxx:184
 AliTrackerBase.cxx:185
 AliTrackerBase.cxx:186
 AliTrackerBase.cxx:187
 AliTrackerBase.cxx:188
 AliTrackerBase.cxx:189
 AliTrackerBase.cxx:190
 AliTrackerBase.cxx:191
 AliTrackerBase.cxx:192
 AliTrackerBase.cxx:193
 AliTrackerBase.cxx:194
 AliTrackerBase.cxx:195
 AliTrackerBase.cxx:196
 AliTrackerBase.cxx:197
 AliTrackerBase.cxx:198
 AliTrackerBase.cxx:199
 AliTrackerBase.cxx:200
 AliTrackerBase.cxx:201
 AliTrackerBase.cxx:202
 AliTrackerBase.cxx:203
 AliTrackerBase.cxx:204
 AliTrackerBase.cxx:205
 AliTrackerBase.cxx:206
 AliTrackerBase.cxx:207
 AliTrackerBase.cxx:208
 AliTrackerBase.cxx:209
 AliTrackerBase.cxx:210
 AliTrackerBase.cxx:211
 AliTrackerBase.cxx:212
 AliTrackerBase.cxx:213
 AliTrackerBase.cxx:214
 AliTrackerBase.cxx:215
 AliTrackerBase.cxx:216
 AliTrackerBase.cxx:217
 AliTrackerBase.cxx:218
 AliTrackerBase.cxx:219
 AliTrackerBase.cxx:220
 AliTrackerBase.cxx:221
 AliTrackerBase.cxx:222
 AliTrackerBase.cxx:223
 AliTrackerBase.cxx:224
 AliTrackerBase.cxx:225
 AliTrackerBase.cxx:226
 AliTrackerBase.cxx:227
 AliTrackerBase.cxx:228
 AliTrackerBase.cxx:229
 AliTrackerBase.cxx:230
 AliTrackerBase.cxx:231
 AliTrackerBase.cxx:232
 AliTrackerBase.cxx:233
 AliTrackerBase.cxx:234
 AliTrackerBase.cxx:235
 AliTrackerBase.cxx:236
 AliTrackerBase.cxx:237
 AliTrackerBase.cxx:238
 AliTrackerBase.cxx:239
 AliTrackerBase.cxx:240
 AliTrackerBase.cxx:241
 AliTrackerBase.cxx:242
 AliTrackerBase.cxx:243
 AliTrackerBase.cxx:244
 AliTrackerBase.cxx:245
 AliTrackerBase.cxx:246
 AliTrackerBase.cxx:247
 AliTrackerBase.cxx:248
 AliTrackerBase.cxx:249
 AliTrackerBase.cxx:250
 AliTrackerBase.cxx:251
 AliTrackerBase.cxx:252
 AliTrackerBase.cxx:253
 AliTrackerBase.cxx:254
 AliTrackerBase.cxx:255
 AliTrackerBase.cxx:256
 AliTrackerBase.cxx:257
 AliTrackerBase.cxx:258
 AliTrackerBase.cxx:259
 AliTrackerBase.cxx:260
 AliTrackerBase.cxx:261
 AliTrackerBase.cxx:262
 AliTrackerBase.cxx:263
 AliTrackerBase.cxx:264
 AliTrackerBase.cxx:265
 AliTrackerBase.cxx:266
 AliTrackerBase.cxx:267
 AliTrackerBase.cxx:268
 AliTrackerBase.cxx:269
 AliTrackerBase.cxx:270
 AliTrackerBase.cxx:271
 AliTrackerBase.cxx:272
 AliTrackerBase.cxx:273
 AliTrackerBase.cxx:274
 AliTrackerBase.cxx:275
 AliTrackerBase.cxx:276
 AliTrackerBase.cxx:277
 AliTrackerBase.cxx:278
 AliTrackerBase.cxx:279
 AliTrackerBase.cxx:280
 AliTrackerBase.cxx:281
 AliTrackerBase.cxx:282
 AliTrackerBase.cxx:283
 AliTrackerBase.cxx:284
 AliTrackerBase.cxx:285
 AliTrackerBase.cxx:286
 AliTrackerBase.cxx:287
 AliTrackerBase.cxx:288
 AliTrackerBase.cxx:289
 AliTrackerBase.cxx:290
 AliTrackerBase.cxx:291
 AliTrackerBase.cxx:292
 AliTrackerBase.cxx:293
 AliTrackerBase.cxx:294
 AliTrackerBase.cxx:295
 AliTrackerBase.cxx:296
 AliTrackerBase.cxx:297
 AliTrackerBase.cxx:298
 AliTrackerBase.cxx:299
 AliTrackerBase.cxx:300
 AliTrackerBase.cxx:301
 AliTrackerBase.cxx:302
 AliTrackerBase.cxx:303
 AliTrackerBase.cxx:304
 AliTrackerBase.cxx:305
 AliTrackerBase.cxx:306
 AliTrackerBase.cxx:307
 AliTrackerBase.cxx:308
 AliTrackerBase.cxx:309
 AliTrackerBase.cxx:310
 AliTrackerBase.cxx:311
 AliTrackerBase.cxx:312
 AliTrackerBase.cxx:313
 AliTrackerBase.cxx:314
 AliTrackerBase.cxx:315
 AliTrackerBase.cxx:316
 AliTrackerBase.cxx:317
 AliTrackerBase.cxx:318
 AliTrackerBase.cxx:319
 AliTrackerBase.cxx:320
 AliTrackerBase.cxx:321
 AliTrackerBase.cxx:322
 AliTrackerBase.cxx:323
 AliTrackerBase.cxx:324
 AliTrackerBase.cxx:325
 AliTrackerBase.cxx:326
 AliTrackerBase.cxx:327
 AliTrackerBase.cxx:328
 AliTrackerBase.cxx:329
 AliTrackerBase.cxx:330
 AliTrackerBase.cxx:331
 AliTrackerBase.cxx:332
 AliTrackerBase.cxx:333
 AliTrackerBase.cxx:334
 AliTrackerBase.cxx:335
 AliTrackerBase.cxx:336
 AliTrackerBase.cxx:337
 AliTrackerBase.cxx:338
 AliTrackerBase.cxx:339
 AliTrackerBase.cxx:340
 AliTrackerBase.cxx:341
 AliTrackerBase.cxx:342
 AliTrackerBase.cxx:343
 AliTrackerBase.cxx:344
 AliTrackerBase.cxx:345
 AliTrackerBase.cxx:346
 AliTrackerBase.cxx:347
 AliTrackerBase.cxx:348
 AliTrackerBase.cxx:349
 AliTrackerBase.cxx:350
 AliTrackerBase.cxx:351
 AliTrackerBase.cxx:352
 AliTrackerBase.cxx:353
 AliTrackerBase.cxx:354
 AliTrackerBase.cxx:355
 AliTrackerBase.cxx:356
 AliTrackerBase.cxx:357
 AliTrackerBase.cxx:358
 AliTrackerBase.cxx:359
 AliTrackerBase.cxx:360
 AliTrackerBase.cxx:361
 AliTrackerBase.cxx:362
 AliTrackerBase.cxx:363
 AliTrackerBase.cxx:364
 AliTrackerBase.cxx:365
 AliTrackerBase.cxx:366
 AliTrackerBase.cxx:367
 AliTrackerBase.cxx:368
 AliTrackerBase.cxx:369
 AliTrackerBase.cxx:370
 AliTrackerBase.cxx:371
 AliTrackerBase.cxx:372
 AliTrackerBase.cxx:373
 AliTrackerBase.cxx:374
 AliTrackerBase.cxx:375
 AliTrackerBase.cxx:376
 AliTrackerBase.cxx:377
 AliTrackerBase.cxx:378
 AliTrackerBase.cxx:379
 AliTrackerBase.cxx:380
 AliTrackerBase.cxx:381
 AliTrackerBase.cxx:382
 AliTrackerBase.cxx:383
 AliTrackerBase.cxx:384
 AliTrackerBase.cxx:385
 AliTrackerBase.cxx:386
 AliTrackerBase.cxx:387
 AliTrackerBase.cxx:388
 AliTrackerBase.cxx:389
 AliTrackerBase.cxx:390
 AliTrackerBase.cxx:391
 AliTrackerBase.cxx:392
 AliTrackerBase.cxx:393
 AliTrackerBase.cxx:394
 AliTrackerBase.cxx:395
 AliTrackerBase.cxx:396
 AliTrackerBase.cxx:397
 AliTrackerBase.cxx:398
 AliTrackerBase.cxx:399
 AliTrackerBase.cxx:400
 AliTrackerBase.cxx:401
 AliTrackerBase.cxx:402
 AliTrackerBase.cxx:403
 AliTrackerBase.cxx:404
 AliTrackerBase.cxx:405
 AliTrackerBase.cxx:406
 AliTrackerBase.cxx:407
 AliTrackerBase.cxx:408
 AliTrackerBase.cxx:409
 AliTrackerBase.cxx:410
 AliTrackerBase.cxx:411
 AliTrackerBase.cxx:412
 AliTrackerBase.cxx:413
 AliTrackerBase.cxx:414
 AliTrackerBase.cxx:415
 AliTrackerBase.cxx:416
 AliTrackerBase.cxx:417
 AliTrackerBase.cxx:418
 AliTrackerBase.cxx:419
 AliTrackerBase.cxx:420
 AliTrackerBase.cxx:421
 AliTrackerBase.cxx:422
 AliTrackerBase.cxx:423
 AliTrackerBase.cxx:424
 AliTrackerBase.cxx:425
 AliTrackerBase.cxx:426
 AliTrackerBase.cxx:427
 AliTrackerBase.cxx:428
 AliTrackerBase.cxx:429
 AliTrackerBase.cxx:430
 AliTrackerBase.cxx:431
 AliTrackerBase.cxx:432
 AliTrackerBase.cxx:433
 AliTrackerBase.cxx:434
 AliTrackerBase.cxx:435
 AliTrackerBase.cxx:436
 AliTrackerBase.cxx:437
 AliTrackerBase.cxx:438
 AliTrackerBase.cxx:439
 AliTrackerBase.cxx:440
 AliTrackerBase.cxx:441
 AliTrackerBase.cxx:442
 AliTrackerBase.cxx:443
 AliTrackerBase.cxx:444
 AliTrackerBase.cxx:445
 AliTrackerBase.cxx:446
 AliTrackerBase.cxx:447
 AliTrackerBase.cxx:448
 AliTrackerBase.cxx:449
 AliTrackerBase.cxx:450
 AliTrackerBase.cxx:451
 AliTrackerBase.cxx:452
 AliTrackerBase.cxx:453
 AliTrackerBase.cxx:454
 AliTrackerBase.cxx:455
 AliTrackerBase.cxx:456
 AliTrackerBase.cxx:457
 AliTrackerBase.cxx:458
 AliTrackerBase.cxx:459
 AliTrackerBase.cxx:460
 AliTrackerBase.cxx:461
 AliTrackerBase.cxx:462
 AliTrackerBase.cxx:463
 AliTrackerBase.cxx:464
 AliTrackerBase.cxx:465
 AliTrackerBase.cxx:466
 AliTrackerBase.cxx:467
 AliTrackerBase.cxx:468
 AliTrackerBase.cxx:469
 AliTrackerBase.cxx:470
 AliTrackerBase.cxx:471
 AliTrackerBase.cxx:472
 AliTrackerBase.cxx:473
 AliTrackerBase.cxx:474
 AliTrackerBase.cxx:475
 AliTrackerBase.cxx:476
 AliTrackerBase.cxx:477
 AliTrackerBase.cxx:478
 AliTrackerBase.cxx:479
 AliTrackerBase.cxx:480
 AliTrackerBase.cxx:481
 AliTrackerBase.cxx:482
 AliTrackerBase.cxx:483
 AliTrackerBase.cxx:484
 AliTrackerBase.cxx:485
 AliTrackerBase.cxx:486
 AliTrackerBase.cxx:487
 AliTrackerBase.cxx:488
 AliTrackerBase.cxx:489
 AliTrackerBase.cxx:490
 AliTrackerBase.cxx:491
 AliTrackerBase.cxx:492
 AliTrackerBase.cxx:493
 AliTrackerBase.cxx:494
 AliTrackerBase.cxx:495
 AliTrackerBase.cxx:496
 AliTrackerBase.cxx:497
 AliTrackerBase.cxx:498
 AliTrackerBase.cxx:499
 AliTrackerBase.cxx:500
 AliTrackerBase.cxx:501
 AliTrackerBase.cxx:502
 AliTrackerBase.cxx:503
 AliTrackerBase.cxx:504
 AliTrackerBase.cxx:505
 AliTrackerBase.cxx:506
 AliTrackerBase.cxx:507
 AliTrackerBase.cxx:508
 AliTrackerBase.cxx:509
 AliTrackerBase.cxx:510
 AliTrackerBase.cxx:511
 AliTrackerBase.cxx:512
 AliTrackerBase.cxx:513
 AliTrackerBase.cxx:514
 AliTrackerBase.cxx:515
 AliTrackerBase.cxx:516
 AliTrackerBase.cxx:517
 AliTrackerBase.cxx:518
 AliTrackerBase.cxx:519
 AliTrackerBase.cxx:520
 AliTrackerBase.cxx:521
 AliTrackerBase.cxx:522
 AliTrackerBase.cxx:523
 AliTrackerBase.cxx:524
 AliTrackerBase.cxx:525
 AliTrackerBase.cxx:526
 AliTrackerBase.cxx:527
 AliTrackerBase.cxx:528
 AliTrackerBase.cxx:529
 AliTrackerBase.cxx:530
 AliTrackerBase.cxx:531
 AliTrackerBase.cxx:532
 AliTrackerBase.cxx:533
 AliTrackerBase.cxx:534
 AliTrackerBase.cxx:535
 AliTrackerBase.cxx:536
 AliTrackerBase.cxx:537
 AliTrackerBase.cxx:538
 AliTrackerBase.cxx:539
 AliTrackerBase.cxx:540
 AliTrackerBase.cxx:541
 AliTrackerBase.cxx:542
 AliTrackerBase.cxx:543
 AliTrackerBase.cxx:544
 AliTrackerBase.cxx:545
 AliTrackerBase.cxx:546
 AliTrackerBase.cxx:547
 AliTrackerBase.cxx:548
 AliTrackerBase.cxx:549
 AliTrackerBase.cxx:550
 AliTrackerBase.cxx:551
 AliTrackerBase.cxx:552
 AliTrackerBase.cxx:553
 AliTrackerBase.cxx:554
 AliTrackerBase.cxx:555
 AliTrackerBase.cxx:556
 AliTrackerBase.cxx:557
 AliTrackerBase.cxx:558
 AliTrackerBase.cxx:559
 AliTrackerBase.cxx:560
 AliTrackerBase.cxx:561
 AliTrackerBase.cxx:562
 AliTrackerBase.cxx:563
 AliTrackerBase.cxx:564
 AliTrackerBase.cxx:565
 AliTrackerBase.cxx:566
 AliTrackerBase.cxx:567
 AliTrackerBase.cxx:568
 AliTrackerBase.cxx:569
 AliTrackerBase.cxx:570
 AliTrackerBase.cxx:571
 AliTrackerBase.cxx:572
 AliTrackerBase.cxx:573
 AliTrackerBase.cxx:574
 AliTrackerBase.cxx:575
 AliTrackerBase.cxx:576
 AliTrackerBase.cxx:577
 AliTrackerBase.cxx:578
 AliTrackerBase.cxx:579
 AliTrackerBase.cxx:580
 AliTrackerBase.cxx:581
 AliTrackerBase.cxx:582
 AliTrackerBase.cxx:583
 AliTrackerBase.cxx:584
 AliTrackerBase.cxx:585
 AliTrackerBase.cxx:586
 AliTrackerBase.cxx:587
 AliTrackerBase.cxx:588
 AliTrackerBase.cxx:589
 AliTrackerBase.cxx:590
 AliTrackerBase.cxx:591
 AliTrackerBase.cxx:592
 AliTrackerBase.cxx:593
 AliTrackerBase.cxx:594
 AliTrackerBase.cxx:595
 AliTrackerBase.cxx:596
 AliTrackerBase.cxx:597
 AliTrackerBase.cxx:598
 AliTrackerBase.cxx:599
 AliTrackerBase.cxx:600
 AliTrackerBase.cxx:601
 AliTrackerBase.cxx:602
 AliTrackerBase.cxx:603
 AliTrackerBase.cxx:604
 AliTrackerBase.cxx:605
 AliTrackerBase.cxx:606
 AliTrackerBase.cxx:607
 AliTrackerBase.cxx:608
 AliTrackerBase.cxx:609
 AliTrackerBase.cxx:610
 AliTrackerBase.cxx:611
 AliTrackerBase.cxx:612
 AliTrackerBase.cxx:613
 AliTrackerBase.cxx:614
 AliTrackerBase.cxx:615
 AliTrackerBase.cxx:616
 AliTrackerBase.cxx:617
 AliTrackerBase.cxx:618
 AliTrackerBase.cxx:619
 AliTrackerBase.cxx:620
 AliTrackerBase.cxx:621
 AliTrackerBase.cxx:622
 AliTrackerBase.cxx:623
 AliTrackerBase.cxx:624
 AliTrackerBase.cxx:625
 AliTrackerBase.cxx:626
 AliTrackerBase.cxx:627
 AliTrackerBase.cxx:628
 AliTrackerBase.cxx:629
 AliTrackerBase.cxx:630
 AliTrackerBase.cxx:631
 AliTrackerBase.cxx:632
 AliTrackerBase.cxx:633
 AliTrackerBase.cxx:634
 AliTrackerBase.cxx:635
 AliTrackerBase.cxx:636
 AliTrackerBase.cxx:637
 AliTrackerBase.cxx:638
 AliTrackerBase.cxx:639
 AliTrackerBase.cxx:640
 AliTrackerBase.cxx:641
 AliTrackerBase.cxx:642
 AliTrackerBase.cxx:643
 AliTrackerBase.cxx:644
 AliTrackerBase.cxx:645
 AliTrackerBase.cxx:646
 AliTrackerBase.cxx:647
 AliTrackerBase.cxx:648
 AliTrackerBase.cxx:649
 AliTrackerBase.cxx:650
 AliTrackerBase.cxx:651
 AliTrackerBase.cxx:652
 AliTrackerBase.cxx:653
 AliTrackerBase.cxx:654
 AliTrackerBase.cxx:655
 AliTrackerBase.cxx:656
 AliTrackerBase.cxx:657
 AliTrackerBase.cxx:658
 AliTrackerBase.cxx:659
 AliTrackerBase.cxx:660
 AliTrackerBase.cxx:661
 AliTrackerBase.cxx:662
 AliTrackerBase.cxx:663
 AliTrackerBase.cxx:664
 AliTrackerBase.cxx:665
 AliTrackerBase.cxx:666
 AliTrackerBase.cxx:667
 AliTrackerBase.cxx:668
 AliTrackerBase.cxx:669
 AliTrackerBase.cxx:670
 AliTrackerBase.cxx:671
 AliTrackerBase.cxx:672
 AliTrackerBase.cxx:673
 AliTrackerBase.cxx:674
 AliTrackerBase.cxx:675
 AliTrackerBase.cxx:676
 AliTrackerBase.cxx:677
 AliTrackerBase.cxx:678
 AliTrackerBase.cxx:679
 AliTrackerBase.cxx:680
 AliTrackerBase.cxx:681
 AliTrackerBase.cxx:682
 AliTrackerBase.cxx:683
 AliTrackerBase.cxx:684
 AliTrackerBase.cxx:685
 AliTrackerBase.cxx:686
 AliTrackerBase.cxx:687
 AliTrackerBase.cxx:688
 AliTrackerBase.cxx:689
 AliTrackerBase.cxx:690
 AliTrackerBase.cxx:691
 AliTrackerBase.cxx:692
 AliTrackerBase.cxx:693
 AliTrackerBase.cxx:694
 AliTrackerBase.cxx:695
 AliTrackerBase.cxx:696
 AliTrackerBase.cxx:697
 AliTrackerBase.cxx:698
 AliTrackerBase.cxx:699
 AliTrackerBase.cxx:700
 AliTrackerBase.cxx:701
 AliTrackerBase.cxx:702
 AliTrackerBase.cxx:703
 AliTrackerBase.cxx:704
 AliTrackerBase.cxx:705
 AliTrackerBase.cxx:706
 AliTrackerBase.cxx:707
 AliTrackerBase.cxx:708
 AliTrackerBase.cxx:709
 AliTrackerBase.cxx:710
 AliTrackerBase.cxx:711
 AliTrackerBase.cxx:712
 AliTrackerBase.cxx:713
 AliTrackerBase.cxx:714
 AliTrackerBase.cxx:715
 AliTrackerBase.cxx:716
 AliTrackerBase.cxx:717
 AliTrackerBase.cxx:718
 AliTrackerBase.cxx:719
 AliTrackerBase.cxx:720
 AliTrackerBase.cxx:721
 AliTrackerBase.cxx:722
 AliTrackerBase.cxx:723
 AliTrackerBase.cxx:724
 AliTrackerBase.cxx:725
 AliTrackerBase.cxx:726
 AliTrackerBase.cxx:727
 AliTrackerBase.cxx:728
 AliTrackerBase.cxx:729
 AliTrackerBase.cxx:730
 AliTrackerBase.cxx:731
 AliTrackerBase.cxx:732
 AliTrackerBase.cxx:733
 AliTrackerBase.cxx:734
 AliTrackerBase.cxx:735
 AliTrackerBase.cxx:736
 AliTrackerBase.cxx:737
 AliTrackerBase.cxx:738
 AliTrackerBase.cxx:739
 AliTrackerBase.cxx:740
 AliTrackerBase.cxx:741
 AliTrackerBase.cxx:742
 AliTrackerBase.cxx:743
 AliTrackerBase.cxx:744
 AliTrackerBase.cxx:745
 AliTrackerBase.cxx:746
 AliTrackerBase.cxx:747
 AliTrackerBase.cxx:748
 AliTrackerBase.cxx:749
 AliTrackerBase.cxx:750
 AliTrackerBase.cxx:751
 AliTrackerBase.cxx:752
 AliTrackerBase.cxx:753
 AliTrackerBase.cxx:754
 AliTrackerBase.cxx:755
 AliTrackerBase.cxx:756
 AliTrackerBase.cxx:757
 AliTrackerBase.cxx:758
 AliTrackerBase.cxx:759
 AliTrackerBase.cxx:760
 AliTrackerBase.cxx:761
 AliTrackerBase.cxx:762
 AliTrackerBase.cxx:763
 AliTrackerBase.cxx:764
 AliTrackerBase.cxx:765
 AliTrackerBase.cxx:766
 AliTrackerBase.cxx:767
 AliTrackerBase.cxx:768
 AliTrackerBase.cxx:769
 AliTrackerBase.cxx:770
 AliTrackerBase.cxx:771
 AliTrackerBase.cxx:772
 AliTrackerBase.cxx:773
 AliTrackerBase.cxx:774
 AliTrackerBase.cxx:775
 AliTrackerBase.cxx:776
 AliTrackerBase.cxx:777
 AliTrackerBase.cxx:778
 AliTrackerBase.cxx:779
 AliTrackerBase.cxx:780
 AliTrackerBase.cxx:781
 AliTrackerBase.cxx:782
 AliTrackerBase.cxx:783
 AliTrackerBase.cxx:784
 AliTrackerBase.cxx:785
 AliTrackerBase.cxx:786
 AliTrackerBase.cxx:787
 AliTrackerBase.cxx:788
 AliTrackerBase.cxx:789
 AliTrackerBase.cxx:790
 AliTrackerBase.cxx:791
 AliTrackerBase.cxx:792
 AliTrackerBase.cxx:793
 AliTrackerBase.cxx:794
 AliTrackerBase.cxx:795
 AliTrackerBase.cxx:796
 AliTrackerBase.cxx:797
 AliTrackerBase.cxx:798
 AliTrackerBase.cxx:799
 AliTrackerBase.cxx:800
 AliTrackerBase.cxx:801
 AliTrackerBase.cxx:802
 AliTrackerBase.cxx:803
 AliTrackerBase.cxx:804
 AliTrackerBase.cxx:805
 AliTrackerBase.cxx:806