ROOT logo
/**************************************************************************
 * Copyright(c) 1998-2003, 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.                  *
 **************************************************************************/

//-----------------------------------------------------------------
//           Implementation of the Primary Vertex class
//           for the Event Data Summary class
//           This class contains the Primary Vertex
//           of the event coming from reconstruction
// Origin: A.Dainese, andrea.dainese@lnl.infn.it
//-----------------------------------------------------------------

//---- standard headers ----
#include "Riostream.h"
//---- Root headers --------
#include <TMath.h>
#include <TROOT.h>
#include <TMatrixDSym.h>
//---- AliRoot headers -----
#include "AliESDVertex.h"
#include "AliVTrack.h"
#include "AliLog.h"

ClassImp(AliESDVertex)

//--------------------------------------------------------------------------
AliESDVertex::AliESDVertex() :
  AliVertex(),
  fCovXX(0.005*0.005),
  fCovXY(0),
  fCovYY(0.005*0.005),
  fCovXZ(0),
  fCovYZ(0),
  fCovZZ(5.3*5.3),
  fChi2(0),
  fID(-1),   // ID=-1 means the vertex with the biggest number of contributors 
  fBCID(AliVTrack::kTOFBCNA)
{
  //
  // Default Constructor, set everything to 0
  //
  SetToZero();
}

//--------------------------------------------------------------------------
AliESDVertex::AliESDVertex(Double_t positionZ,Double_t sigmaZ,
			   Int_t nContributors,const Char_t *vtxName) :
  AliVertex(),
  fCovXX(0.005*0.005),
  fCovXY(0),
  fCovYY(0.005*0.005),
  fCovXZ(0),
  fCovYZ(0),
  fCovZZ(sigmaZ*sigmaZ),
  fChi2(0),
  fID(-1),   // ID=-1 means the vertex with the biggest number of contributors 
  fBCID(AliVTrack::kTOFBCNA)
{
  //
  // Constructor for vertex Z from pixels
  //

  SetToZero();

  fPosition[2]   = positionZ;
  SetName(vtxName);
  SetNContributors(nContributors);

}

//------------------------------------------------------------------------- 
AliESDVertex::AliESDVertex(Double_t position[3],Double_t covmatrix[6],
			   Double_t chi2,Int_t nContributors,
			   const Char_t *vtxName) :
  AliVertex(position,0.,nContributors),
  fCovXX(covmatrix[0]),
  fCovXY(covmatrix[1]),
  fCovYY(covmatrix[2]),
  fCovXZ(covmatrix[3]),
  fCovYZ(covmatrix[4]),
  fCovZZ(covmatrix[5]),
  fChi2(chi2),
  fID(-1),   // ID=-1 means the vertex with the biggest number of contributors 
  fBCID(AliVTrack::kTOFBCNA)
{
  //
  // Constructor for vertex in 3D from tracks
  //

  SetToZero();
  SetName(vtxName);

}
//--------------------------------------------------------------------------
AliESDVertex::AliESDVertex(Double_t position[3],Double_t sigma[3],
			   const Char_t *vtxName) :
  AliVertex(position,0.,0),
  fCovXX(sigma[0]*sigma[0]),
  fCovXY(0),
  fCovYY(sigma[1]*sigma[1]),
  fCovXZ(0),
  fCovYZ(0),
  fCovZZ(sigma[2]*sigma[2]),
  fChi2(0),
  fID(-1),   // ID=-1 means the vertex with the biggest number of contributors 
  fBCID(AliVTrack::kTOFBCNA)
{
  //
  // Constructor for smearing of true position
  //

  SetToZero();
  SetName(vtxName);

}
//--------------------------------------------------------------------------
AliESDVertex::AliESDVertex(Double_t position[3],Double_t sigma[3],
			   Double_t snr[3], const Char_t *vtxName) :
  AliVertex(position,0.,0),
  fCovXX(sigma[0]*sigma[0]),
  fCovXY(0),
  fCovYY(sigma[1]*sigma[1]),
  fCovXZ(0),
  fCovYZ(0),
  fCovZZ(sigma[2]*sigma[2]),
  fChi2(0),
  fID(-1),   // ID=-1 means the vertex with the biggest number of contributors 
  fBCID(AliVTrack::kTOFBCNA)
{
  //
  // Constructor for Pb-Pb
  //

  SetToZero();
  SetName(vtxName);

  fSNR[0]        = snr[0];
  fSNR[1]        = snr[1];
  fSNR[2]        = snr[2];

}
//--------------------------------------------------------------------------
AliESDVertex::AliESDVertex(const AliESDVertex &source):
  AliVertex(source),
  fCovXX(source.fCovXX),
  fCovXY(source.fCovXY),
  fCovYY(source.fCovYY),
  fCovXZ(source.fCovXZ),
  fCovYZ(source.fCovYZ),
  fCovZZ(source.fCovZZ),
  fChi2(source.fChi2),
  fID(source.fID),
  fBCID(source.fBCID)
{
  //
  // Copy constructor
  //
  for(Int_t i=0;i<3;i++) {
    fSNR[i] = source.fSNR[i];
  }
}
//--------------------------------------------------------------------------
AliESDVertex &AliESDVertex::operator=(const AliESDVertex &source){
  //
  // assignment operator
  //
  if(&source != this){
    AliVertex::operator=(source);
    for(Int_t i=0;i<3;++i)fSNR[i] = source.fSNR[i];
    fCovXX = source.fCovXX;
    fCovXY = source.fCovXY;
    fCovYY = source.fCovYY;
    fCovXZ = source.fCovXZ;
    fCovYZ = source.fCovYZ;
    fCovZZ = source.fCovZZ;
    fChi2 = source.fChi2;
    fID = source.fID;
    fBCID = source.fBCID;
  }
  return *this;
}
//--------------------------------------------------------------------------
void AliESDVertex::Copy(TObject &obj) const {
  
  // this overwrites the virtual TOBject::Copy()
  // to allow run time copying without casting
  // in AliESDEvent

  if(this==&obj)return;
  AliESDVertex *robj = dynamic_cast<AliESDVertex*>(&obj);
  if(!robj)return; // not an AliESDVertex
  *robj = *this;

}
//--------------------------------------------------------------------------
void AliESDVertex::SetToZero() {
  //
  // Set the content of arrays to 0. Used by constructors
  //
  for(Int_t i=0; i<3; i++){
    fSNR[i] = 0.;
  }
}
//--------------------------------------------------------------------------
void AliESDVertex::GetSigmaXYZ(Double_t sigma[3]) const {
  //
  // Return errors on vertex position in thrust frame
  //
  sigma[0] = TMath::Sqrt(fCovXX);
  sigma[1] = TMath::Sqrt(fCovYY);
  sigma[2] = TMath::Sqrt(fCovZZ);

  return;
}
//--------------------------------------------------------------------------
void AliESDVertex::GetCovMatrix(Double_t covmatrix[6]) const {
  //
  // Return covariance matrix of the vertex
  //
  covmatrix[0] = fCovXX;
  covmatrix[1] = fCovXY;
  covmatrix[2] = fCovYY;
  covmatrix[3] = fCovXZ;
  covmatrix[4] = fCovYZ;
  covmatrix[5] = fCovZZ;

  return;
}

//--------------------------------------------------------------------------
void AliESDVertex::SetCovarianceMatrix(const Double_t *covmatrix) {
  //
  // Return covariance matrix of the vertex
  //
  fCovXX = covmatrix[0];
  fCovXY = covmatrix[1];
  fCovYY = covmatrix[2];
  fCovXZ = covmatrix[3];
  fCovYZ = covmatrix[4];
  fCovZZ = covmatrix[5];

  return;
}

//--------------------------------------------------------------------------
void AliESDVertex::GetSNR(Double_t snr[3]) const {
  //
  // Return S/N ratios
  //
  for(Int_t i=0;i<3;i++) snr[i] = fSNR[i];

  return;
}
//--------------------------------------------------------------------------
void AliESDVertex::Print(Option_t* /*option*/) const {
  //
  // Print out information on all data members
  //
  printf("ESD vertex position:\n");
  printf("   x = %f +- %f\n",fPosition[0], fCovXX>0 ? TMath::Sqrt(fCovXX) : 0.);
  printf("   y = %f +- %f\n",fPosition[1], fCovYY>0 ? TMath::Sqrt(fCovYY) : 0.);
  printf("   z = %f +- %f\n",fPosition[2], fCovZZ>0 ? TMath::Sqrt(fCovZZ) : 0.);
  printf(" Covariance matrix:\n");
  printf(" %12.10f  %12.10f  %12.10f\n %12.10f  %12.10f  %12.10f\n %12.10f  %12.10f  %12.10f\n",fCovXX,fCovXY,fCovXZ,fCovXY,fCovYY,fCovYZ,fCovXZ,fCovYZ,fCovZZ);
  printf(" S/N = (%f, %f, %f)\n",fSNR[0],fSNR[1],fSNR[2]);
  printf(" chi2 = %f\n",fChi2);
  printf(" # tracks (or tracklets) = %d BCID=%d\n",fNContributors,int(fBCID));
  //
  if (fCovXX<0 || fCovYY<0 || fCovZZ<0) {AliError("Attention: negative diagonal element");}
  //
  return;
}


//____________________________________________________________
Double_t AliESDVertex::GetWDist(const AliESDVertex* v) const
{
  // calculate sqrt of weighted distance to other vertex
  static TMatrixDSym vVb(3);
  double dist = -1;
  double dx = fPosition[0]-v->fPosition[0], dy = fPosition[1]-v->fPosition[1], dz = fPosition[2]-v->fPosition[2];
  vVb(0,0) = fCovXX + v->fCovXX;
  vVb(1,1) = fCovYY + v->fCovYY;
  vVb(2,2) = fCovZZ + v->fCovZZ;;
  vVb(1,0) = vVb(0,1) = fCovXY + v->fCovXY;
  vVb(0,2) = vVb(1,2) = vVb(2,0) = vVb(2,1) = 0.;
  vVb.InvertFast();
  if (!vVb.IsValid()) {AliError("Singular Matrix"); return dist;}
  dist = vVb(0,0)*dx*dx + vVb(1,1)*dy*dy + vVb(2,2)*dz*dz
    +    2*vVb(0,1)*dx*dy + 2*vVb(0,2)*dx*dz + 2*vVb(1,2)*dy*dz;
  return dist>0 ? TMath::Sqrt(dist) : -1; 
}
 AliESDVertex.cxx:1
 AliESDVertex.cxx:2
 AliESDVertex.cxx:3
 AliESDVertex.cxx:4
 AliESDVertex.cxx:5
 AliESDVertex.cxx:6
 AliESDVertex.cxx:7
 AliESDVertex.cxx:8
 AliESDVertex.cxx:9
 AliESDVertex.cxx:10
 AliESDVertex.cxx:11
 AliESDVertex.cxx:12
 AliESDVertex.cxx:13
 AliESDVertex.cxx:14
 AliESDVertex.cxx:15
 AliESDVertex.cxx:16
 AliESDVertex.cxx:17
 AliESDVertex.cxx:18
 AliESDVertex.cxx:19
 AliESDVertex.cxx:20
 AliESDVertex.cxx:21
 AliESDVertex.cxx:22
 AliESDVertex.cxx:23
 AliESDVertex.cxx:24
 AliESDVertex.cxx:25
 AliESDVertex.cxx:26
 AliESDVertex.cxx:27
 AliESDVertex.cxx:28
 AliESDVertex.cxx:29
 AliESDVertex.cxx:30
 AliESDVertex.cxx:31
 AliESDVertex.cxx:32
 AliESDVertex.cxx:33
 AliESDVertex.cxx:34
 AliESDVertex.cxx:35
 AliESDVertex.cxx:36
 AliESDVertex.cxx:37
 AliESDVertex.cxx:38
 AliESDVertex.cxx:39
 AliESDVertex.cxx:40
 AliESDVertex.cxx:41
 AliESDVertex.cxx:42
 AliESDVertex.cxx:43
 AliESDVertex.cxx:44
 AliESDVertex.cxx:45
 AliESDVertex.cxx:46
 AliESDVertex.cxx:47
 AliESDVertex.cxx:48
 AliESDVertex.cxx:49
 AliESDVertex.cxx:50
 AliESDVertex.cxx:51
 AliESDVertex.cxx:52
 AliESDVertex.cxx:53
 AliESDVertex.cxx:54
 AliESDVertex.cxx:55
 AliESDVertex.cxx:56
 AliESDVertex.cxx:57
 AliESDVertex.cxx:58
 AliESDVertex.cxx:59
 AliESDVertex.cxx:60
 AliESDVertex.cxx:61
 AliESDVertex.cxx:62
 AliESDVertex.cxx:63
 AliESDVertex.cxx:64
 AliESDVertex.cxx:65
 AliESDVertex.cxx:66
 AliESDVertex.cxx:67
 AliESDVertex.cxx:68
 AliESDVertex.cxx:69
 AliESDVertex.cxx:70
 AliESDVertex.cxx:71
 AliESDVertex.cxx:72
 AliESDVertex.cxx:73
 AliESDVertex.cxx:74
 AliESDVertex.cxx:75
 AliESDVertex.cxx:76
 AliESDVertex.cxx:77
 AliESDVertex.cxx:78
 AliESDVertex.cxx:79
 AliESDVertex.cxx:80
 AliESDVertex.cxx:81
 AliESDVertex.cxx:82
 AliESDVertex.cxx:83
 AliESDVertex.cxx:84
 AliESDVertex.cxx:85
 AliESDVertex.cxx:86
 AliESDVertex.cxx:87
 AliESDVertex.cxx:88
 AliESDVertex.cxx:89
 AliESDVertex.cxx:90
 AliESDVertex.cxx:91
 AliESDVertex.cxx:92
 AliESDVertex.cxx:93
 AliESDVertex.cxx:94
 AliESDVertex.cxx:95
 AliESDVertex.cxx:96
 AliESDVertex.cxx:97
 AliESDVertex.cxx:98
 AliESDVertex.cxx:99
 AliESDVertex.cxx:100
 AliESDVertex.cxx:101
 AliESDVertex.cxx:102
 AliESDVertex.cxx:103
 AliESDVertex.cxx:104
 AliESDVertex.cxx:105
 AliESDVertex.cxx:106
 AliESDVertex.cxx:107
 AliESDVertex.cxx:108
 AliESDVertex.cxx:109
 AliESDVertex.cxx:110
 AliESDVertex.cxx:111
 AliESDVertex.cxx:112
 AliESDVertex.cxx:113
 AliESDVertex.cxx:114
 AliESDVertex.cxx:115
 AliESDVertex.cxx:116
 AliESDVertex.cxx:117
 AliESDVertex.cxx:118
 AliESDVertex.cxx:119
 AliESDVertex.cxx:120
 AliESDVertex.cxx:121
 AliESDVertex.cxx:122
 AliESDVertex.cxx:123
 AliESDVertex.cxx:124
 AliESDVertex.cxx:125
 AliESDVertex.cxx:126
 AliESDVertex.cxx:127
 AliESDVertex.cxx:128
 AliESDVertex.cxx:129
 AliESDVertex.cxx:130
 AliESDVertex.cxx:131
 AliESDVertex.cxx:132
 AliESDVertex.cxx:133
 AliESDVertex.cxx:134
 AliESDVertex.cxx:135
 AliESDVertex.cxx:136
 AliESDVertex.cxx:137
 AliESDVertex.cxx:138
 AliESDVertex.cxx:139
 AliESDVertex.cxx:140
 AliESDVertex.cxx:141
 AliESDVertex.cxx:142
 AliESDVertex.cxx:143
 AliESDVertex.cxx:144
 AliESDVertex.cxx:145
 AliESDVertex.cxx:146
 AliESDVertex.cxx:147
 AliESDVertex.cxx:148
 AliESDVertex.cxx:149
 AliESDVertex.cxx:150
 AliESDVertex.cxx:151
 AliESDVertex.cxx:152
 AliESDVertex.cxx:153
 AliESDVertex.cxx:154
 AliESDVertex.cxx:155
 AliESDVertex.cxx:156
 AliESDVertex.cxx:157
 AliESDVertex.cxx:158
 AliESDVertex.cxx:159
 AliESDVertex.cxx:160
 AliESDVertex.cxx:161
 AliESDVertex.cxx:162
 AliESDVertex.cxx:163
 AliESDVertex.cxx:164
 AliESDVertex.cxx:165
 AliESDVertex.cxx:166
 AliESDVertex.cxx:167
 AliESDVertex.cxx:168
 AliESDVertex.cxx:169
 AliESDVertex.cxx:170
 AliESDVertex.cxx:171
 AliESDVertex.cxx:172
 AliESDVertex.cxx:173
 AliESDVertex.cxx:174
 AliESDVertex.cxx:175
 AliESDVertex.cxx:176
 AliESDVertex.cxx:177
 AliESDVertex.cxx:178
 AliESDVertex.cxx:179
 AliESDVertex.cxx:180
 AliESDVertex.cxx:181
 AliESDVertex.cxx:182
 AliESDVertex.cxx:183
 AliESDVertex.cxx:184
 AliESDVertex.cxx:185
 AliESDVertex.cxx:186
 AliESDVertex.cxx:187
 AliESDVertex.cxx:188
 AliESDVertex.cxx:189
 AliESDVertex.cxx:190
 AliESDVertex.cxx:191
 AliESDVertex.cxx:192
 AliESDVertex.cxx:193
 AliESDVertex.cxx:194
 AliESDVertex.cxx:195
 AliESDVertex.cxx:196
 AliESDVertex.cxx:197
 AliESDVertex.cxx:198
 AliESDVertex.cxx:199
 AliESDVertex.cxx:200
 AliESDVertex.cxx:201
 AliESDVertex.cxx:202
 AliESDVertex.cxx:203
 AliESDVertex.cxx:204
 AliESDVertex.cxx:205
 AliESDVertex.cxx:206
 AliESDVertex.cxx:207
 AliESDVertex.cxx:208
 AliESDVertex.cxx:209
 AliESDVertex.cxx:210
 AliESDVertex.cxx:211
 AliESDVertex.cxx:212
 AliESDVertex.cxx:213
 AliESDVertex.cxx:214
 AliESDVertex.cxx:215
 AliESDVertex.cxx:216
 AliESDVertex.cxx:217
 AliESDVertex.cxx:218
 AliESDVertex.cxx:219
 AliESDVertex.cxx:220
 AliESDVertex.cxx:221
 AliESDVertex.cxx:222
 AliESDVertex.cxx:223
 AliESDVertex.cxx:224
 AliESDVertex.cxx:225
 AliESDVertex.cxx:226
 AliESDVertex.cxx:227
 AliESDVertex.cxx:228
 AliESDVertex.cxx:229
 AliESDVertex.cxx:230
 AliESDVertex.cxx:231
 AliESDVertex.cxx:232
 AliESDVertex.cxx:233
 AliESDVertex.cxx:234
 AliESDVertex.cxx:235
 AliESDVertex.cxx:236
 AliESDVertex.cxx:237
 AliESDVertex.cxx:238
 AliESDVertex.cxx:239
 AliESDVertex.cxx:240
 AliESDVertex.cxx:241
 AliESDVertex.cxx:242
 AliESDVertex.cxx:243
 AliESDVertex.cxx:244
 AliESDVertex.cxx:245
 AliESDVertex.cxx:246
 AliESDVertex.cxx:247
 AliESDVertex.cxx:248
 AliESDVertex.cxx:249
 AliESDVertex.cxx:250
 AliESDVertex.cxx:251
 AliESDVertex.cxx:252
 AliESDVertex.cxx:253
 AliESDVertex.cxx:254
 AliESDVertex.cxx:255
 AliESDVertex.cxx:256
 AliESDVertex.cxx:257
 AliESDVertex.cxx:258
 AliESDVertex.cxx:259
 AliESDVertex.cxx:260
 AliESDVertex.cxx:261
 AliESDVertex.cxx:262
 AliESDVertex.cxx:263
 AliESDVertex.cxx:264
 AliESDVertex.cxx:265
 AliESDVertex.cxx:266
 AliESDVertex.cxx:267
 AliESDVertex.cxx:268
 AliESDVertex.cxx:269
 AliESDVertex.cxx:270
 AliESDVertex.cxx:271
 AliESDVertex.cxx:272
 AliESDVertex.cxx:273
 AliESDVertex.cxx:274
 AliESDVertex.cxx:275
 AliESDVertex.cxx:276
 AliESDVertex.cxx:277
 AliESDVertex.cxx:278
 AliESDVertex.cxx:279
 AliESDVertex.cxx:280
 AliESDVertex.cxx:281
 AliESDVertex.cxx:282
 AliESDVertex.cxx:283
 AliESDVertex.cxx:284
 AliESDVertex.cxx:285
 AliESDVertex.cxx:286
 AliESDVertex.cxx:287
 AliESDVertex.cxx:288
 AliESDVertex.cxx:289
 AliESDVertex.cxx:290
 AliESDVertex.cxx:291
 AliESDVertex.cxx:292
 AliESDVertex.cxx:293
 AliESDVertex.cxx:294
 AliESDVertex.cxx:295
 AliESDVertex.cxx:296
 AliESDVertex.cxx:297
 AliESDVertex.cxx:298
 AliESDVertex.cxx:299
 AliESDVertex.cxx:300
 AliESDVertex.cxx:301
 AliESDVertex.cxx:302
 AliESDVertex.cxx:303