ROOT logo
#include "AliITSUClusterLines.h"
#include <TMath.h>

using std::cout;
using std::endl;

ClassImp(AliITSUClusterLines);

//////////////////////////////////////////////////////////////////////
// This class is used by the AliITSUVertexer to compute and store   //
// information about vertex candidates.                             //           
// The cluster is seeded starting from two lines, then it is        //
// possible to attach other lines. Whenever a new line is attached  //
// the weight and coefficient matrices are computed.                //
// Origin puccio@to.infn.it  Feb. 20 2014                           //
//////////////////////////////////////////////////////////////////////


//____________________________________________________________________________________________________________
AliITSUClusterLines::AliITSUClusterLines() : TObject(),
					     fA(),
					     fB(),
					     fLabels(),
					     fV() {
  // Default Constructor

  for(Int_t i=0;i<9;++i) fW[i] = 0.;
}

//____________________________________________________________________________________________________________
AliITSUClusterLines::AliITSUClusterLines(UInt_t first, AliStrLine *line1, UInt_t second, AliStrLine *line2,Bool_t weight) : TObject(),
															    fA(),
															    fB(),
															    fLabels(),
															    fV() {
  // Standard constructor
  fLabels.push_back(first);
  fLabels.push_back(second);
  Double_t wmat1[9],wmat2[9],p1[3],p2[3],cd1[3],cd2[3],sq1[3]={1.,1.,1.},sq2[3]={1.,1.,1.};
  line1->GetWMatrix(wmat1);
  line2->GetWMatrix(wmat2);
  for(Int_t i=0;i<9;++i) fW[i]=wmat1[i]+wmat2[i];
  line1->GetP0(p1);
  line2->GetP0(p2);
  line1->GetCd(cd1);
  line2->GetCd(cd2);
  if(weight) {
    line1->GetSigma2P0(sq1);
    line2->GetSigma2P0(sq2);
  }
  
  Double_t det1=cd1[2]*cd1[2]*sq1[0]*sq1[1]+cd1[1]*cd1[1]*sq1[0]*sq1[2]+cd1[0]*cd1[0]*sq1[1]*sq1[2];
  Double_t det2=cd2[2]*cd2[2]*sq2[0]*sq2[1]+cd2[1]*cd2[1]*sq2[0]*sq2[2]+cd2[0]*cd2[0]*sq2[1]*sq2[2];

  fA[0]=(cd1[2]*cd1[2]*sq1[1]+cd1[1]*cd1[1]*sq1[2])/det1+(cd2[2]*cd2[2]*sq2[1]+cd2[1]*cd2[1]*sq2[2])/det2;
  fA[1]=-cd1[0]*cd1[1]*sq1[2]/det1-cd2[0]*cd2[1]*sq2[2]/det2;
  fA[2]=-cd1[0]*cd1[2]*sq1[1]/det1-cd2[0]*cd2[2]*sq2[1]/det2;
  fA[3]=(cd1[2]*cd1[2]*sq1[0]+cd1[0]*cd1[0]*sq1[2])/det1+(cd2[2]*cd2[2]*sq2[0]+cd2[0]*cd2[0]*sq2[2])/det2;
  fA[4]=-cd1[1]*cd1[2]*sq1[0]/det1-cd2[1]*cd2[2]*sq2[0]/det2;
  fA[5]=(cd1[1]*cd1[1]*sq1[0]+cd1[0]*cd1[0]*sq1[1])/det1+(cd2[1]*cd2[1]*sq2[0]+cd2[0]*cd2[0]*sq2[1])/det2;
  
  fB[0]=(cd1[1]*sq1[2]*(-cd1[1]*p1[0]+cd1[0]*p1[1])+cd1[2]*sq1[1]*(-cd1[2]*p1[0]+cd1[0]*p1[2]))/det1;
  fB[0]+=(cd2[1]*sq2[2]*(-cd2[1]*p2[0]+cd2[0]*p2[1])+cd2[2]*sq2[1]*(-cd2[2]*p2[0]+cd2[0]*p2[2]))/det2;
  fB[1]=(cd1[0]*sq1[2]*(-cd1[0]*p1[1]+cd1[1]*p1[0])+cd1[2]*sq1[0]*(-cd1[2]*p1[1]+cd1[1]*p1[2]))/det1;
  fB[1]+=(cd2[0]*sq2[2]*(-cd2[0]*p2[1]+cd2[1]*p2[0])+cd2[2]*sq2[0]*(-cd2[2]*p2[1]+cd2[1]*p2[2]))/det2;
  fB[2]=(cd1[0]*sq1[1]*(-cd1[0]*p1[2]+cd1[2]*p1[0])+cd1[1]*sq1[0]*(-cd1[1]*p1[2]+cd1[2]*p1[1]))/det1;
  fB[2]+=(cd2[0]*sq2[1]*(-cd2[0]*p2[2]+cd2[2]*p2[0])+cd2[1]*sq2[0]*(-cd2[1]*p2[2]+cd2[2]*p2[1]))/det2;

  this->ComputeClusterCentroid();

}

//____________________________________________________________________________________________________________
AliITSUClusterLines::~AliITSUClusterLines() {
  // Destructor
}

//____________________________________________________________________________________________________________
void AliITSUClusterLines::Add(UInt_t label, AliStrLine *line, Bool_t weight) {
  // Add a line to the cluster. It changes the weight matrix of the cluster and its parameters
  fLabels.push_back(label);
  Double_t wmat[9],p[3],cd[3],sq[3]={1.,1.,1.};
  line->GetWMatrix(wmat);
  line->GetP0(p);
  line->GetCd(cd);

  for(Int_t i=0;i<9;++i) fW[i]+=wmat[i];
  if(weight) line->GetSigma2P0(sq);
    
  Double_t det=cd[2]*cd[2]*sq[0]*sq[1]+cd[1]*cd[1]*sq[0]*sq[2]+cd[0]*cd[0]*sq[1]*sq[2];
  fA[0]+=(cd[2]*cd[2]*sq[1]+cd[1]*cd[1]*sq[2])/det;
  fA[1]+=-cd[0]*cd[1]*sq[2]/det;
  fA[2]+=-cd[0]*cd[2]*sq[1]/det;
  fA[3]+=(cd[2]*cd[2]*sq[0]+cd[0]*cd[0]*sq[2])/det;
  fA[4]+=-cd[1]*cd[2]*sq[0]/det;
  fA[5]+=(cd[1]*cd[1]*sq[0]+cd[0]*cd[0]*sq[1])/det;

  fB[0]+=(cd[1]*sq[2]*(-cd[1]*p[0]+cd[0]*p[1])+cd[2]*sq[1]*(-cd[2]*p[0]+cd[0]*p[2]))/det;
  fB[1]+=(cd[0]*sq[2]*(-cd[0]*p[1]+cd[1]*p[0])+cd[2]*sq[0]*(-cd[2]*p[1]+cd[1]*p[2]))/det; 
  fB[2]+=(cd[0]*sq[1]*(-cd[0]*p[2]+cd[2]*p[0])+cd[1]*sq[0]*(-cd[1]*p[2]+cd[2]*p[1]))/det;

  this->ComputeClusterCentroid();
}

//____________________________________________________________________________________________________________
Int_t AliITSUClusterLines::Compare(const TObject* obj) const {
  // Comparison criteria between two clusters
  const AliITSUClusterLines *cl=(const AliITSUClusterLines*)obj;
  if(fLabels.size()<cl->GetSize()) return 1;
  if(fLabels.size()>cl->GetSize()) return -1;
  return 0;
}

//____________________________________________________________________________________________________________
void AliITSUClusterLines::ComputeClusterCentroid() {
  // Calculation of the centroid
  Double_t *a=fA;
  Double_t *b=fB;
  Double_t *v=fV;

  Double_t det=a[0]*(a[3]*a[5]-a[4]*a[4])-a[1]*(a[1]*a[5]-a[4]*a[2])+a[2]*(a[1]*a[4]-a[2]*a[3]);

  if(det==0) {
    cout << "Could not invert weight matrix" << endl;
    return;
  }
  v[0]=-(b[0]*(a[3]*a[5]-a[4]*a[4])-a[1]*(b[1]*a[5]-a[4]*b[2])+a[2]*(b[1]*a[4]-b[2]*a[3]))/det;
  v[1]=-(a[0]*(b[1]*a[5]-b[2]*a[4])-b[0]*(a[1]*a[5]-a[4]*a[2])+a[2]*(a[1]*b[2]-a[2]*b[1]))/det;
  v[2]=-(a[0]*(a[3]*b[2]-b[1]*a[4])-a[1]*(a[1]*b[2]-b[1]*a[2])+b[0]*(a[1]*a[4]-a[2]*a[3]))/det;
}

//____________________________________________________________________________________________________________
void AliITSUClusterLines::GetCovMatrix(Float_t cov[6]) {
  // Returns the covariance matrix (single precision)
  Double_t *w=fW;
  Double_t den=w[0]*(w[4]*w[8]-w[5]*w[7])-w[1]*(w[3]*w[8]-w[5]*w[6])+w[2]*(w[3]*w[7]-w[4]*w[6]);
  if(den==0) {
    cout << "Could not invert weight matrix" << endl;
    return;
  }
  cov[0]=(w[4]*w[8]-w[5]*w[7])/den;
  cov[1]=-(w[1]*w[8]-w[7]*w[2])/den;
  cov[2]=(w[1]*w[5]-w[4]*w[2])/den;
  cov[3]=(w[0]*w[8]-w[6]*w[2])/den;
  cov[4]=-(w[0]*w[5]-w[3]*w[2])/den;
  cov[5]=(w[0]*w[4]-w[1]*w[3])/den;
}

//____________________________________________________________________________________________________________
void AliITSUClusterLines::GetCovMatrix(Double_t cov[6]) {
  // Returns the covariance matrix (double precision)
  Double_t *w=fW;
  Double_t den=w[0]*(w[4]*w[8]-w[5]*w[7])-w[1]*(w[3]*w[8]-w[5]*w[6])+w[2]*(w[3]*w[7]-w[4]*w[6]);
  if(den==0) {
    cout << "Could not invert weight matrix" << endl;
    return;
  }
  cov[0]=(w[4]*w[8]-w[5]*w[7])/den;
  cov[1]=-(w[1]*w[8]-w[7]*w[2])/den;
  cov[2]=(w[1]*w[5]-w[4]*w[2])/den;
  cov[3]=(w[0]*w[8]-w[6]*w[2])/den;
  cov[4]=-(w[0]*w[5]-w[3]*w[2])/den;
  cov[5]=(w[0]*w[4]-w[1]*w[3])/den;

}

//____________________________________________________________________________________________________________
Bool_t AliITSUClusterLines::IsEqual(const TObject* obj) const {
  // Comparison criteria between two clusters
  const AliITSUClusterLines *cl=(const AliITSUClusterLines*)obj;
  if(fLabels.size()==cl->GetSize()) return kTRUE;
  return kFALSE;
}

 AliITSUClusterLines.cxx:1
 AliITSUClusterLines.cxx:2
 AliITSUClusterLines.cxx:3
 AliITSUClusterLines.cxx:4
 AliITSUClusterLines.cxx:5
 AliITSUClusterLines.cxx:6
 AliITSUClusterLines.cxx:7
 AliITSUClusterLines.cxx:8
 AliITSUClusterLines.cxx:9
 AliITSUClusterLines.cxx:10
 AliITSUClusterLines.cxx:11
 AliITSUClusterLines.cxx:12
 AliITSUClusterLines.cxx:13
 AliITSUClusterLines.cxx:14
 AliITSUClusterLines.cxx:15
 AliITSUClusterLines.cxx:16
 AliITSUClusterLines.cxx:17
 AliITSUClusterLines.cxx:18
 AliITSUClusterLines.cxx:19
 AliITSUClusterLines.cxx:20
 AliITSUClusterLines.cxx:21
 AliITSUClusterLines.cxx:22
 AliITSUClusterLines.cxx:23
 AliITSUClusterLines.cxx:24
 AliITSUClusterLines.cxx:25
 AliITSUClusterLines.cxx:26
 AliITSUClusterLines.cxx:27
 AliITSUClusterLines.cxx:28
 AliITSUClusterLines.cxx:29
 AliITSUClusterLines.cxx:30
 AliITSUClusterLines.cxx:31
 AliITSUClusterLines.cxx:32
 AliITSUClusterLines.cxx:33
 AliITSUClusterLines.cxx:34
 AliITSUClusterLines.cxx:35
 AliITSUClusterLines.cxx:36
 AliITSUClusterLines.cxx:37
 AliITSUClusterLines.cxx:38
 AliITSUClusterLines.cxx:39
 AliITSUClusterLines.cxx:40
 AliITSUClusterLines.cxx:41
 AliITSUClusterLines.cxx:42
 AliITSUClusterLines.cxx:43
 AliITSUClusterLines.cxx:44
 AliITSUClusterLines.cxx:45
 AliITSUClusterLines.cxx:46
 AliITSUClusterLines.cxx:47
 AliITSUClusterLines.cxx:48
 AliITSUClusterLines.cxx:49
 AliITSUClusterLines.cxx:50
 AliITSUClusterLines.cxx:51
 AliITSUClusterLines.cxx:52
 AliITSUClusterLines.cxx:53
 AliITSUClusterLines.cxx:54
 AliITSUClusterLines.cxx:55
 AliITSUClusterLines.cxx:56
 AliITSUClusterLines.cxx:57
 AliITSUClusterLines.cxx:58
 AliITSUClusterLines.cxx:59
 AliITSUClusterLines.cxx:60
 AliITSUClusterLines.cxx:61
 AliITSUClusterLines.cxx:62
 AliITSUClusterLines.cxx:63
 AliITSUClusterLines.cxx:64
 AliITSUClusterLines.cxx:65
 AliITSUClusterLines.cxx:66
 AliITSUClusterLines.cxx:67
 AliITSUClusterLines.cxx:68
 AliITSUClusterLines.cxx:69
 AliITSUClusterLines.cxx:70
 AliITSUClusterLines.cxx:71
 AliITSUClusterLines.cxx:72
 AliITSUClusterLines.cxx:73
 AliITSUClusterLines.cxx:74
 AliITSUClusterLines.cxx:75
 AliITSUClusterLines.cxx:76
 AliITSUClusterLines.cxx:77
 AliITSUClusterLines.cxx:78
 AliITSUClusterLines.cxx:79
 AliITSUClusterLines.cxx:80
 AliITSUClusterLines.cxx:81
 AliITSUClusterLines.cxx:82
 AliITSUClusterLines.cxx:83
 AliITSUClusterLines.cxx:84
 AliITSUClusterLines.cxx:85
 AliITSUClusterLines.cxx:86
 AliITSUClusterLines.cxx:87
 AliITSUClusterLines.cxx:88
 AliITSUClusterLines.cxx:89
 AliITSUClusterLines.cxx:90
 AliITSUClusterLines.cxx:91
 AliITSUClusterLines.cxx:92
 AliITSUClusterLines.cxx:93
 AliITSUClusterLines.cxx:94
 AliITSUClusterLines.cxx:95
 AliITSUClusterLines.cxx:96
 AliITSUClusterLines.cxx:97
 AliITSUClusterLines.cxx:98
 AliITSUClusterLines.cxx:99
 AliITSUClusterLines.cxx:100
 AliITSUClusterLines.cxx:101
 AliITSUClusterLines.cxx:102
 AliITSUClusterLines.cxx:103
 AliITSUClusterLines.cxx:104
 AliITSUClusterLines.cxx:105
 AliITSUClusterLines.cxx:106
 AliITSUClusterLines.cxx:107
 AliITSUClusterLines.cxx:108
 AliITSUClusterLines.cxx:109
 AliITSUClusterLines.cxx:110
 AliITSUClusterLines.cxx:111
 AliITSUClusterLines.cxx:112
 AliITSUClusterLines.cxx:113
 AliITSUClusterLines.cxx:114
 AliITSUClusterLines.cxx:115
 AliITSUClusterLines.cxx:116
 AliITSUClusterLines.cxx:117
 AliITSUClusterLines.cxx:118
 AliITSUClusterLines.cxx:119
 AliITSUClusterLines.cxx:120
 AliITSUClusterLines.cxx:121
 AliITSUClusterLines.cxx:122
 AliITSUClusterLines.cxx:123
 AliITSUClusterLines.cxx:124
 AliITSUClusterLines.cxx:125
 AliITSUClusterLines.cxx:126
 AliITSUClusterLines.cxx:127
 AliITSUClusterLines.cxx:128
 AliITSUClusterLines.cxx:129
 AliITSUClusterLines.cxx:130
 AliITSUClusterLines.cxx:131
 AliITSUClusterLines.cxx:132
 AliITSUClusterLines.cxx:133
 AliITSUClusterLines.cxx:134
 AliITSUClusterLines.cxx:135
 AliITSUClusterLines.cxx:136
 AliITSUClusterLines.cxx:137
 AliITSUClusterLines.cxx:138
 AliITSUClusterLines.cxx:139
 AliITSUClusterLines.cxx:140
 AliITSUClusterLines.cxx:141
 AliITSUClusterLines.cxx:142
 AliITSUClusterLines.cxx:143
 AliITSUClusterLines.cxx:144
 AliITSUClusterLines.cxx:145
 AliITSUClusterLines.cxx:146
 AliITSUClusterLines.cxx:147
 AliITSUClusterLines.cxx:148
 AliITSUClusterLines.cxx:149
 AliITSUClusterLines.cxx:150
 AliITSUClusterLines.cxx:151
 AliITSUClusterLines.cxx:152
 AliITSUClusterLines.cxx:153
 AliITSUClusterLines.cxx:154
 AliITSUClusterLines.cxx:155
 AliITSUClusterLines.cxx:156
 AliITSUClusterLines.cxx:157
 AliITSUClusterLines.cxx:158
 AliITSUClusterLines.cxx:159
 AliITSUClusterLines.cxx:160
 AliITSUClusterLines.cxx:161
 AliITSUClusterLines.cxx:162
 AliITSUClusterLines.cxx:163
 AliITSUClusterLines.cxx:164
 AliITSUClusterLines.cxx:165
 AliITSUClusterLines.cxx:166
 AliITSUClusterLines.cxx:167
 AliITSUClusterLines.cxx:168
 AliITSUClusterLines.cxx:169
 AliITSUClusterLines.cxx:170
 AliITSUClusterLines.cxx:171
 AliITSUClusterLines.cxx:172
 AliITSUClusterLines.cxx:173
 AliITSUClusterLines.cxx:174