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

/*************************************************************************
 * AliTrackFitter: base class for the fast track fitters                 *
 *                                                                       *
 * Supposed to be used for alignment framework                           *
 * More information is available in 
 * http://agenda.cern.ch/askArchive.php?base=agenda&categ=a057717&id=a057717s1t6/transparencies  
 * Author: C.Cheskov                                                     *
 *                                                                       *
 *                                                                       *
 *************************************************************************/

#include <TMatrixDSym.h>
#include <TArrayI.h>

#include "AliTrackFitter.h"
#include "AliTrackPointArray.h"
#include "AliLog.h"

ClassImp(AliTrackFitter)

//_____________________________________________________________________________
AliTrackFitter::AliTrackFitter() :
  TObject(),
  fCov(0),
  fPoints(0),
  fPVolId(0),
  fPTrack(0),
  fChi2(0),
  fNdf(0),
  fMinNPoints(0),
  fIsOwner(kFALSE)
{
  // default constructor
  //
  for (Int_t i=0;i<6;i++) fParams[i] = 0;
}

//_____________________________________________________________________________
AliTrackFitter::AliTrackFitter(AliTrackPointArray *array, Bool_t owner) :
  TObject(),
  fCov(new TMatrixDSym(6)),
  fPoints(0),
  fPVolId(0),
  fPTrack(0),
  fChi2(0),
  fNdf(0),
  fMinNPoints(0),
  fIsOwner(kFALSE)
  
{
  // constructor from space points array
  //
  for (Int_t i=0;i<6;i++) fParams[i] = 0;
  SetTrackPointArray(array,owner);
}

//_____________________________________________________________________________
AliTrackFitter::AliTrackFitter(const AliTrackFitter &fitter):
  TObject(fitter),
  fCov(new TMatrixDSym(*fitter.fCov)),
  fPoints(0),
  fPVolId(0),
  fPTrack(0),
  fChi2(fitter.fChi2),
  fNdf(fitter.fNdf),
  fMinNPoints(fitter.fMinNPoints),
  fIsOwner(kFALSE)
{
  // Copy constructor
  //
  SetTrackPointArray(fitter.fPoints,fitter.fIsOwner);
  for (Int_t i=0;i<6;i++) fParams[i] = fitter.fParams[i];
}

//_____________________________________________________________________________
AliTrackFitter &AliTrackFitter::operator =(const AliTrackFitter& fitter)
{
  // assignment operator
  //
  if(this==&fitter) return *this;

  SetTrackPointArray(fitter.fPoints);
  for (Int_t i=0;i<6;i++) fParams[i] = fitter.fParams[i];
  fCov = new TMatrixDSym(*fitter.fCov);
  fChi2 = fitter.fChi2;
  fNdf = fitter.fNdf;
  fMinNPoints = fitter.fMinNPoints;
  fIsOwner = kFALSE;
  
  return *this;
}

//_____________________________________________________________________________
AliTrackFitter::~AliTrackFitter()
{
  if (fIsOwner)
    delete fPoints;
  delete fCov;
}

//_____________________________________________________________________________
void AliTrackFitter::Reset()
{
  for (Int_t i=0;i<6;i++) fParams[i] = 0;
  delete fCov;
  fCov = new TMatrixDSym(6);
  fPVolId = fPTrack = 0;
  fChi2 = 0;
  fNdf = 0;
}

void AliTrackFitter::SetTrackPointArray(AliTrackPointArray *array, Bool_t owner)
{
  // Load space points from array
  // By default we don't copy them but
  // just put the pointers to them
  if (!array) {
    AliWarning("Invalid pointer to the space-points array !");
    if (fIsOwner) delete fPoints;
    fPoints = NULL;
    return;
  }

  Reset();

  if (fIsOwner) delete fPoints;

  if (owner) {
    fPoints = new AliTrackPointArray(*array);
    fIsOwner = kTRUE;
  }
  else {
    fPoints = array;
    fIsOwner = kFALSE;
  }
}

Bool_t AliTrackFitter::FindVolId(const TArrayI *array, UShort_t volid) const
{
  // The method is used to check whenever
  // the volume id (volid) is contained in
  // a array of integers
  Int_t nVolIds = array->GetSize();
  if (nVolIds == 0) return kFALSE;

  Bool_t found = kFALSE;
  for (Int_t iVolId = 0; iVolId < nVolIds; iVolId++) {
    if ((*array)[iVolId] == volid) {
      found = kTRUE;
      break;
    }
  }

  return found;
}

Bool_t AliTrackFitter::Fit(const TArrayI *volIds,const TArrayI *volIdsFit,
AliGeomManager::ELayerID layerRangeMin,
AliGeomManager::ELayerID layerRangeMax)
{
  //-------------------------------------------------------------------
  //
  //                      Fit the track points. 
  //
  // volIds    - the array of IDs of volumes where the residuals 
  //             will be calculated.
  // volIdsFit - the array of IDs of volumes having the points
  //              that will be fitted
  // 
  // If volIdsFit==0, the IDs of volumes having the points to fit
  // are taken in the range defined by the two last parameters
  // 
  //
  // The function fills two track-point arrays: fPVolId and fPTrack.
  // The first one contains the track points from the volumes with IDs  
  // taken from the "volIds". The second array is filled with 
  // the intersection points between the fitted track and the volumes
  // the points from the first arry belong to.
  //
  // The two arrays are used for calculation of the residuals
  // and for the construction of a chi2 function to be minimized 
  // in the alignment procedures. 
  //
  //--------------------------------------------------------------------

  Int_t npoints=fPoints->GetNPoints();
  if (npoints<fMinNPoints) return kFALSE;

  // Fast counting the points
  Int_t countFit=0;
  Int_t countPnt=0;

  Int_t fst=-1;
  Int_t lst=-1;
  if (volIdsFit != 0x0) {
     for (Int_t i=0; i<npoints; i++) {
         if (FindVolId(volIds,   fPoints->GetVolumeID()[i])) countPnt++;
         if (FindVolId(volIdsFit,fPoints->GetVolumeID()[i])) {
            countFit++;
            if (fst<0) fst=i;
            lst=i;
         }
     }
  } else {
     for (Int_t i=0; i<npoints; i++) {
         UShort_t id=fPoints->GetVolumeID()[i]; 
         if (FindVolId(volIds,id)) countPnt++;
         if (id < AliGeomManager::LayerToVolUID(layerRangeMin,0)) continue;
	 if (id > AliGeomManager::LayerToVolUID(layerRangeMax,
		  AliGeomManager::LayerSize(layerRangeMax))) continue;
         countFit++;
         if (fst<0) fst=i;
         lst=i;
     }
  }
  if (countPnt==0) return kFALSE;
  if (countFit<fMinNPoints) return kFALSE;



  //************* Fit the selected track points

  if (!Begin(fst,lst)) return kFALSE;

  AliTrackPoint p;
  if (volIdsFit != 0x0) {
     for (Int_t i=0; i<npoints; i++) {
         if (!FindVolId(volIdsFit,fPoints->GetVolumeID()[i])) continue;
         fPoints->GetPoint(p,i);
         if (!AddPoint(&p)) return kFALSE;
     }
  } else {
     for (Int_t i=0; i<npoints; i++) {
         UShort_t id=fPoints->GetVolumeID()[i]; 
         if (id < AliGeomManager::LayerToVolUID(layerRangeMin,0)) continue;
	 if (id > AliGeomManager::LayerToVolUID(layerRangeMax,
		  AliGeomManager::LayerSize(layerRangeMax))) continue;
         fPoints->GetPoint(p,i);
         if (!AddPoint(&p)) continue;
     }
  }

  if (!Update()) return kFALSE;




  //************* Calculate the intersection points

  fPVolId = new AliTrackPointArray(countPnt);
  fPTrack = new AliTrackPointArray(countPnt);

  Int_t n=0;
  AliTrackPoint p2;
  for (Int_t i=0; i<npoints; i++) {
      if (!FindVolId(volIds,fPoints->GetVolumeID()[i])) continue;
      fPoints->GetPoint(p,i);
      if (GetPCA(p,p2)) {
	fPVolId->AddPoint(n,&p);
	fPTrack->AddPoint(n,&p2);
        n++;
      } else {
	delete fPVolId;
	fPVolId=0;
	delete fPTrack;
	fPTrack=0;
	return kFALSE;
      }
  }
  
  return kTRUE;
}
 AliTrackFitter.cxx:1
 AliTrackFitter.cxx:2
 AliTrackFitter.cxx:3
 AliTrackFitter.cxx:4
 AliTrackFitter.cxx:5
 AliTrackFitter.cxx:6
 AliTrackFitter.cxx:7
 AliTrackFitter.cxx:8
 AliTrackFitter.cxx:9
 AliTrackFitter.cxx:10
 AliTrackFitter.cxx:11
 AliTrackFitter.cxx:12
 AliTrackFitter.cxx:13
 AliTrackFitter.cxx:14
 AliTrackFitter.cxx:15
 AliTrackFitter.cxx:16
 AliTrackFitter.cxx:17
 AliTrackFitter.cxx:18
 AliTrackFitter.cxx:19
 AliTrackFitter.cxx:20
 AliTrackFitter.cxx:21
 AliTrackFitter.cxx:22
 AliTrackFitter.cxx:23
 AliTrackFitter.cxx:24
 AliTrackFitter.cxx:25
 AliTrackFitter.cxx:26
 AliTrackFitter.cxx:27
 AliTrackFitter.cxx:28
 AliTrackFitter.cxx:29
 AliTrackFitter.cxx:30
 AliTrackFitter.cxx:31
 AliTrackFitter.cxx:32
 AliTrackFitter.cxx:33
 AliTrackFitter.cxx:34
 AliTrackFitter.cxx:35
 AliTrackFitter.cxx:36
 AliTrackFitter.cxx:37
 AliTrackFitter.cxx:38
 AliTrackFitter.cxx:39
 AliTrackFitter.cxx:40
 AliTrackFitter.cxx:41
 AliTrackFitter.cxx:42
 AliTrackFitter.cxx:43
 AliTrackFitter.cxx:44
 AliTrackFitter.cxx:45
 AliTrackFitter.cxx:46
 AliTrackFitter.cxx:47
 AliTrackFitter.cxx:48
 AliTrackFitter.cxx:49
 AliTrackFitter.cxx:50
 AliTrackFitter.cxx:51
 AliTrackFitter.cxx:52
 AliTrackFitter.cxx:53
 AliTrackFitter.cxx:54
 AliTrackFitter.cxx:55
 AliTrackFitter.cxx:56
 AliTrackFitter.cxx:57
 AliTrackFitter.cxx:58
 AliTrackFitter.cxx:59
 AliTrackFitter.cxx:60
 AliTrackFitter.cxx:61
 AliTrackFitter.cxx:62
 AliTrackFitter.cxx:63
 AliTrackFitter.cxx:64
 AliTrackFitter.cxx:65
 AliTrackFitter.cxx:66
 AliTrackFitter.cxx:67
 AliTrackFitter.cxx:68
 AliTrackFitter.cxx:69
 AliTrackFitter.cxx:70
 AliTrackFitter.cxx:71
 AliTrackFitter.cxx:72
 AliTrackFitter.cxx:73
 AliTrackFitter.cxx:74
 AliTrackFitter.cxx:75
 AliTrackFitter.cxx:76
 AliTrackFitter.cxx:77
 AliTrackFitter.cxx:78
 AliTrackFitter.cxx:79
 AliTrackFitter.cxx:80
 AliTrackFitter.cxx:81
 AliTrackFitter.cxx:82
 AliTrackFitter.cxx:83
 AliTrackFitter.cxx:84
 AliTrackFitter.cxx:85
 AliTrackFitter.cxx:86
 AliTrackFitter.cxx:87
 AliTrackFitter.cxx:88
 AliTrackFitter.cxx:89
 AliTrackFitter.cxx:90
 AliTrackFitter.cxx:91
 AliTrackFitter.cxx:92
 AliTrackFitter.cxx:93
 AliTrackFitter.cxx:94
 AliTrackFitter.cxx:95
 AliTrackFitter.cxx:96
 AliTrackFitter.cxx:97
 AliTrackFitter.cxx:98
 AliTrackFitter.cxx:99
 AliTrackFitter.cxx:100
 AliTrackFitter.cxx:101
 AliTrackFitter.cxx:102
 AliTrackFitter.cxx:103
 AliTrackFitter.cxx:104
 AliTrackFitter.cxx:105
 AliTrackFitter.cxx:106
 AliTrackFitter.cxx:107
 AliTrackFitter.cxx:108
 AliTrackFitter.cxx:109
 AliTrackFitter.cxx:110
 AliTrackFitter.cxx:111
 AliTrackFitter.cxx:112
 AliTrackFitter.cxx:113
 AliTrackFitter.cxx:114
 AliTrackFitter.cxx:115
 AliTrackFitter.cxx:116
 AliTrackFitter.cxx:117
 AliTrackFitter.cxx:118
 AliTrackFitter.cxx:119
 AliTrackFitter.cxx:120
 AliTrackFitter.cxx:121
 AliTrackFitter.cxx:122
 AliTrackFitter.cxx:123
 AliTrackFitter.cxx:124
 AliTrackFitter.cxx:125
 AliTrackFitter.cxx:126
 AliTrackFitter.cxx:127
 AliTrackFitter.cxx:128
 AliTrackFitter.cxx:129
 AliTrackFitter.cxx:130
 AliTrackFitter.cxx:131
 AliTrackFitter.cxx:132
 AliTrackFitter.cxx:133
 AliTrackFitter.cxx:134
 AliTrackFitter.cxx:135
 AliTrackFitter.cxx:136
 AliTrackFitter.cxx:137
 AliTrackFitter.cxx:138
 AliTrackFitter.cxx:139
 AliTrackFitter.cxx:140
 AliTrackFitter.cxx:141
 AliTrackFitter.cxx:142
 AliTrackFitter.cxx:143
 AliTrackFitter.cxx:144
 AliTrackFitter.cxx:145
 AliTrackFitter.cxx:146
 AliTrackFitter.cxx:147
 AliTrackFitter.cxx:148
 AliTrackFitter.cxx:149
 AliTrackFitter.cxx:150
 AliTrackFitter.cxx:151
 AliTrackFitter.cxx:152
 AliTrackFitter.cxx:153
 AliTrackFitter.cxx:154
 AliTrackFitter.cxx:155
 AliTrackFitter.cxx:156
 AliTrackFitter.cxx:157
 AliTrackFitter.cxx:158
 AliTrackFitter.cxx:159
 AliTrackFitter.cxx:160
 AliTrackFitter.cxx:161
 AliTrackFitter.cxx:162
 AliTrackFitter.cxx:163
 AliTrackFitter.cxx:164
 AliTrackFitter.cxx:165
 AliTrackFitter.cxx:166
 AliTrackFitter.cxx:167
 AliTrackFitter.cxx:168
 AliTrackFitter.cxx:169
 AliTrackFitter.cxx:170
 AliTrackFitter.cxx:171
 AliTrackFitter.cxx:172
 AliTrackFitter.cxx:173
 AliTrackFitter.cxx:174
 AliTrackFitter.cxx:175
 AliTrackFitter.cxx:176
 AliTrackFitter.cxx:177
 AliTrackFitter.cxx:178
 AliTrackFitter.cxx:179
 AliTrackFitter.cxx:180
 AliTrackFitter.cxx:181
 AliTrackFitter.cxx:182
 AliTrackFitter.cxx:183
 AliTrackFitter.cxx:184
 AliTrackFitter.cxx:185
 AliTrackFitter.cxx:186
 AliTrackFitter.cxx:187
 AliTrackFitter.cxx:188
 AliTrackFitter.cxx:189
 AliTrackFitter.cxx:190
 AliTrackFitter.cxx:191
 AliTrackFitter.cxx:192
 AliTrackFitter.cxx:193
 AliTrackFitter.cxx:194
 AliTrackFitter.cxx:195
 AliTrackFitter.cxx:196
 AliTrackFitter.cxx:197
 AliTrackFitter.cxx:198
 AliTrackFitter.cxx:199
 AliTrackFitter.cxx:200
 AliTrackFitter.cxx:201
 AliTrackFitter.cxx:202
 AliTrackFitter.cxx:203
 AliTrackFitter.cxx:204
 AliTrackFitter.cxx:205
 AliTrackFitter.cxx:206
 AliTrackFitter.cxx:207
 AliTrackFitter.cxx:208
 AliTrackFitter.cxx:209
 AliTrackFitter.cxx:210
 AliTrackFitter.cxx:211
 AliTrackFitter.cxx:212
 AliTrackFitter.cxx:213
 AliTrackFitter.cxx:214
 AliTrackFitter.cxx:215
 AliTrackFitter.cxx:216
 AliTrackFitter.cxx:217
 AliTrackFitter.cxx:218
 AliTrackFitter.cxx:219
 AliTrackFitter.cxx:220
 AliTrackFitter.cxx:221
 AliTrackFitter.cxx:222
 AliTrackFitter.cxx:223
 AliTrackFitter.cxx:224
 AliTrackFitter.cxx:225
 AliTrackFitter.cxx:226
 AliTrackFitter.cxx:227
 AliTrackFitter.cxx:228
 AliTrackFitter.cxx:229
 AliTrackFitter.cxx:230
 AliTrackFitter.cxx:231
 AliTrackFitter.cxx:232
 AliTrackFitter.cxx:233
 AliTrackFitter.cxx:234
 AliTrackFitter.cxx:235
 AliTrackFitter.cxx:236
 AliTrackFitter.cxx:237
 AliTrackFitter.cxx:238
 AliTrackFitter.cxx:239
 AliTrackFitter.cxx:240
 AliTrackFitter.cxx:241
 AliTrackFitter.cxx:242
 AliTrackFitter.cxx:243
 AliTrackFitter.cxx:244
 AliTrackFitter.cxx:245
 AliTrackFitter.cxx:246
 AliTrackFitter.cxx:247
 AliTrackFitter.cxx:248
 AliTrackFitter.cxx:249
 AliTrackFitter.cxx:250
 AliTrackFitter.cxx:251
 AliTrackFitter.cxx:252
 AliTrackFitter.cxx:253
 AliTrackFitter.cxx:254
 AliTrackFitter.cxx:255
 AliTrackFitter.cxx:256
 AliTrackFitter.cxx:257
 AliTrackFitter.cxx:258
 AliTrackFitter.cxx:259
 AliTrackFitter.cxx:260
 AliTrackFitter.cxx:261
 AliTrackFitter.cxx:262
 AliTrackFitter.cxx:263
 AliTrackFitter.cxx:264
 AliTrackFitter.cxx:265
 AliTrackFitter.cxx:266
 AliTrackFitter.cxx:267
 AliTrackFitter.cxx:268
 AliTrackFitter.cxx:269
 AliTrackFitter.cxx:270
 AliTrackFitter.cxx:271
 AliTrackFitter.cxx:272
 AliTrackFitter.cxx:273
 AliTrackFitter.cxx:274
 AliTrackFitter.cxx:275
 AliTrackFitter.cxx:276
 AliTrackFitter.cxx:277
 AliTrackFitter.cxx:278
 AliTrackFitter.cxx:279
 AliTrackFitter.cxx:280
 AliTrackFitter.cxx:281
 AliTrackFitter.cxx:282
 AliTrackFitter.cxx:283
 AliTrackFitter.cxx:284
 AliTrackFitter.cxx:285
 AliTrackFitter.cxx:286
 AliTrackFitter.cxx:287