//________________________________________________________
AliStrLine::AliStrLine() :
TObject(),
- fTpar(0),
- fDebug(0)
+ fWMatrix(0),
+ fTpar(0)
{
// Default constructor
for(Int_t i=0;i<3;i++) {
fSigma2P0[i] = 0.;
fCd[i] = 0.;
}
- for(Int_t i=0;i<9;i++) fWMatrix[i] = 0.;
}
//________________________________________________________
AliStrLine::AliStrLine(Double_t *point, Double_t *cd,Bool_t twopoints) :
TObject(),
- fTpar(0),
- fDebug(0)
+ fWMatrix(0),
+ fTpar(0)
{
// Standard constructor
// if twopoints is true: point and cd are the 3D coordinates of
for(Int_t i=0;i<3;i++){
fSigma2P0[i] = 0.;
}
- for(Int_t i=0;i<9;i++) fWMatrix[i] = 0.;
if(twopoints){
InitTwoPoints(point,cd);
}
//________________________________________________________
AliStrLine::AliStrLine(Float_t *pointf, Float_t *cdf,Bool_t twopoints) :
TObject(),
- fTpar(0),
- fDebug(0)
+ fWMatrix(0),
+ fTpar(0)
{
// Standard constructor - with float arguments
// if twopoints is true: point and cd are the 3D coordinates of
cd[i] = cdf[i];
fSigma2P0[i] = 0.;
}
- for(Int_t i=0;i<9;i++) fWMatrix[i] = 0.;
if(twopoints){
InitTwoPoints(point,cd);
}
//________________________________________________________
AliStrLine::AliStrLine(Double_t *point, Double_t *sig2point, Double_t *cd,Bool_t twopoints) :
TObject(),
- fTpar(0),
- fDebug(0)
+ fWMatrix(0),
+ fTpar(0)
{
// Standard constructor
// if twopoints is true: point and cd are the 3D coordinates of
for(Int_t i=0;i<3;i++){
fSigma2P0[i] = sig2point[i];
}
- for(Int_t i=0;i<9;i++) fWMatrix[i] = 0.;
if(twopoints){
InitTwoPoints(point,cd);
}
//________________________________________________________
AliStrLine::AliStrLine(Float_t *pointf, Float_t *sig2point, Float_t *cdf,Bool_t twopoints) :
TObject(),
- fTpar(0),
- fDebug(0)
+ fWMatrix(0),
+ fTpar(0)
{
// Standard constructor - with float arguments
// if twopoints is true: point and cd are the 3D coordinates of
cd[i] = cdf[i];
fSigma2P0[i] = sig2point[i];
}
- for(Int_t i=0;i<9;i++) fWMatrix[i] = 0.;
if(twopoints){
InitTwoPoints(point,cd);
}
//________________________________________________________
AliStrLine::AliStrLine(Double_t *point, Double_t *sig2point, Double_t *wmat, Double_t *cd,Bool_t twopoints) :
TObject(),
- fTpar(0),
- fDebug(0)
+ fWMatrix(0),
+ fTpar(0)
{
// Standard constructor
// if twopoints is true: point and cd are the 3D coordinates of
// if twopoint is false: point represents the 3D coordinates of a point
// belonging to the straight line and cd is the
// direction in space
+ Int_t k = 0;
+ fWMatrix = new Double_t [6];
for(Int_t i=0;i<3;i++){
fSigma2P0[i] = sig2point[i];
+ for(Int_t j=0;j<3;j++)if(j>=i)fWMatrix[k++]=wmat[3*i+j];
}
- for(Int_t i=0;i<9;i++) fWMatrix[i] = wmat[i];
if(twopoints){
InitTwoPoints(point,cd);
}
//________________________________________________________
AliStrLine::AliStrLine(Float_t *pointf, Float_t *sig2point, Float_t *wmat, Float_t *cdf,Bool_t twopoints) :
TObject(),
- fTpar(0),
- fDebug(0)
+ fWMatrix(0),
+ fTpar(0)
{
// Standard constructor - with float arguments
// if twopoints is true: point and cd are the 3D coordinates of
// direction in space
Double_t point[3];
Double_t cd[3];
+ fWMatrix = new Double_t [6];
+ Int_t k = 0;
for(Int_t i=0;i<3;i++){
point[i] = pointf[i];
cd[i] = cdf[i];
fSigma2P0[i] = sig2point[i];
+ for(Int_t j=0;j<3;j++)if(j>=i)fWMatrix[k++]=wmat[3*i+j];
}
- for(Int_t i=0;i<9;i++) fWMatrix[i] = wmat[i];
if(twopoints){
InitTwoPoints(point,cd);
}
InitDirection(point,cd);
}
}
+
+//________________________________________________________
+AliStrLine::AliStrLine(const AliStrLine &source):TObject(source),
+fWMatrix(0),
+fTpar(source.fTpar){
+ // copy constructor
+ if(source.fWMatrix)fWMatrix = new Double_t [6];
+ for(Int_t i=0;i<3;i++){
+ fP0[i]=source.fP0[i];
+ fSigma2P0[i]=source.fSigma2P0[i];
+ fCd[i]=source.fCd[i];
+ }
+ for(Int_t i=0;i<6;i++)fWMatrix[i]=source.fWMatrix[i];
+}
+
+//________________________________________________________
+AliStrLine& AliStrLine::operator=(const AliStrLine& source){
+ // Assignment operator
+ if(this !=&source){
+ this->~AliStrLine();
+ new(this)AliStrLine(source);
+ }
+ return *this;
+}
+
+//________________________________________________________
+void AliStrLine::GetWMatrix(Double_t *wmat)const {
+// Getter for weighting matrix, as a [9] dim. array
+ if(!fWMatrix)return;
+ Int_t k = 0;
+ for(Int_t i=0;i<3;i++){
+ for(Int_t j=0;j<3;j++){
+ if(j>=i){
+ wmat[3*i+j]=fWMatrix[k++];
+ }
+ else{
+ wmat[3*i+j]=wmat[3*j+i];
+ }
+ }
+ }
+}
+
+//________________________________________________________
+void AliStrLine::SetWMatrix(const Double_t *wmat) {
+// Setter for weighting matrix, strating from a [9] dim. array
+ if(fWMatrix)delete [] fWMatrix;
+ fWMatrix = new Double_t [6];
+ Int_t k = 0;
+ for(Int_t i=0;i<3;i++){
+ for(Int_t j=0;j<3;j++)if(j>=i)fWMatrix[k++]=wmat[3*i+j];
+ }
+}
+
//________________________________________________________
void AliStrLine::InitDirection(Double_t *point, Double_t *cd){
// Initialization from a point and a direction
SetP0(point);
SetCd(cd);
fTpar = 0.;
- SetDebug();
}
//________________________________________________________
//________________________________________________________
AliStrLine::~AliStrLine() {
// destructor
+ if(fWMatrix)delete [] fWMatrix;
}
//________________________________________________________
for(Int_t i=0;i<3;i++)cout <<TMath::Sqrt(fSigma2P0[i])<<"; ";
cout <<endl;
cout <<"Current value for the parameter: "<<fTpar<<endl;
- cout <<" Debug flag: "<<fDebug<<endl;
}
//________________________________________________________
line->GetCd(cd2);
Int_t i;
Double_t k1 = 0;
- for(i=0;i<3;i++)k1+=(fP0[i]-p2[i])*fCd[i];
Double_t k2 = 0;
- for(i=0;i<3;i++)k2+=(fP0[i]-p2[i])*cd2[i];
Double_t a11 = 0;
- for(i=0;i<3;i++)a11+=fCd[i]*cd2[i];
+ for(i=0;i<3;i++){
+ k1+=(fP0[i]-p2[i])*fCd[i];
+ k2+=(fP0[i]-p2[i])*cd2[i];
+ a11+=fCd[i]*cd2[i];
+ }
Double_t a22 = -a11;
Double_t a21 = 0;
- for(i=0;i<3;i++)a21+=cd2[i]*cd2[i];
Double_t a12 = 0;
- for(i=0;i<3;i++)a12-=fCd[i]*fCd[i];
+ for(i=0;i<3;i++){
+ a21+=cd2[i]*cd2[i];
+ a12-=fCd[i]*fCd[i];
+ }
Double_t deno = a11*a22-a21*a12;
if(deno == 0.) return -1;
fTpar = (a11*k2-a21*k1) / deno;
AliStrLine(Float_t *pointf, Float_t *sig2point, Float_t *cdf, Bool_t twopoints=kFALSE);
AliStrLine(Double_t *point, Double_t *sig2point, Double_t *wmat, Double_t *cd, Bool_t twopoints=kFALSE);
AliStrLine(Float_t *pointf, Float_t *sig2point, Float_t *wmat, Float_t *cdf, Bool_t twopoints=kFALSE);
+ AliStrLine(const AliStrLine& source);
+ AliStrLine& operator=(const AliStrLine& source);
virtual ~AliStrLine(); // destructor
+ virtual void Clear(Option_t*){if(fWMatrix)delete[] fWMatrix; fWMatrix = 0;}
void PrintStatus() const;
- void SetP0(Double_t *point) {for(Int_t i=0;i<3;i++)fP0[i]=point[i];}
- void SetSigma2P0(Double_t *sigsq) {for(Int_t i=0;i<3;i++)fSigma2P0[i]=sigsq[i];}
- void SetWMatrix(Double_t *wmat) {for(Int_t i=0;i<9;i++)fWMatrix[i]=wmat[i];}
- void SetCd(Double_t *cd) {for(Int_t i=0;i<3;i++)fCd[i]=cd[i];}
- void SetDebug(Int_t dbfl = 0){fDebug = dbfl; }
+ void SetP0(const Double_t *point) {for(Int_t i=0;i<3;i++)fP0[i]=point[i];}
+ void SetSigma2P0(const Double_t *sigsq) {for(Int_t i=0;i<3;i++)fSigma2P0[i]=sigsq[i];}
+ void SetWMatrix(const Double_t *wmat);
+ void SetCd(const Double_t *cd) {for(Int_t i=0;i<3;i++)fCd[i]=cd[i];}
void GetP0(Double_t *point) const {for(Int_t i=0;i<3;i++)point[i]=fP0[i];}
void GetSigma2P0(Double_t *sigsq) const {for(Int_t i=0;i<3;i++)sigsq[i]=fSigma2P0[i];}
- void GetWMatrix(Double_t *wmat) const {for(Int_t i=0;i<9;i++)wmat[i]=fWMatrix[i];}
+ void GetWMatrix(Double_t *wmat) const;
void GetCd(Double_t *cd) const {for(Int_t i=0;i<3;i++)cd[i]=fCd[i];}
void GetCurrentPoint(Double_t *point) const;
Int_t IsParallelTo(AliStrLine *line) const;
void InitTwoPoints(Double_t *pA, Double_t *pB);
Double_t fP0[3]; // given point
Double_t fSigma2P0[3]; // errors on coordinates of given point
- Double_t fWMatrix[9]; // weighting matrix
+ Double_t *fWMatrix; //[6] weighting matrix
+ /* fWMatrix is a symmetric matrix internally stored as
+ 0 --> row = 0, col = 0
+ 1 --> 0,1
+ 2 --> 0,2
+ 3 --> 1,1
+ 4 --> 1,2
+ 5 --> 2,2
+ The external interface (constructor, getter and setter) is:
+ 0 --> row = 0, col = 0
+ 1 --> 0,1
+ 2 --> 0,2
+ 3 --> 1,0
+ 4 --> 1,1
+ 5 --> 1,2
+ 6 --> 2,0
+ 7 --> 2,1
+ 8 --> 2,2 */
Double_t fCd[3]; // direction cosines
Double_t fTpar; //! parameter
- Int_t fDebug; //! debug flag - verbose printing if >0
private:
- void SetPar(Double_t par){fTpar = par;}
+ void SetPar(const Double_t par){fTpar = par;}
- ClassDef(AliStrLine,3);
+ ClassDef(AliStrLine,4);
};
#endif