1 /**************************************************************************
2 * Copyright(c) 1998-2003, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
15 ///////////////////////////////////////////////////////////////////
17 // A straight line is coded as a point (3 Double_t) and //
18 // 3 direction cosines //
20 ///////////////////////////////////////////////////////////////////
21 #include <Riostream.h>
23 #include "AliITSStrLine.h"
25 ClassImp(AliITSStrLine)
27 //________________________________________________________
28 AliITSStrLine::AliITSStrLine() {
29 // Default constructor
30 for(Int_t i=0;i<3;i++) {
38 //________________________________________________________
39 AliITSStrLine::AliITSStrLine(Double_t *point, Double_t *cd) {
40 // Standard constructor
42 for(Int_t i=0;i<3;i++)norm+=cd[i]*cd[i];
44 norm = TMath::Sqrt(norm);
45 for(Int_t i=0;i<3;i++) cd[i]/=norm;
48 Error("AliITSStrLine","Null direction cosines!!!");
56 //________________________________________________________
57 AliITSStrLine::~AliITSStrLine() {
61 //________________________________________________________
62 void AliITSStrLine::PrintStatus() const {
63 // Print current status
64 cout <<"=======================================================\n";
65 cout <<"Direction cosines: ";
66 for(Int_t i=0;i<3;i++)cout <<fCd[i]<<"; ";
68 cout <<"Known point: ";
69 for(Int_t i=0;i<3;i++)cout <<fP0[i]<<"; ";
71 cout <<"Current value for the parameter: "<<fTpar<<endl;
72 cout <<" Debug flag: "<<fDebug<<endl;
75 //________________________________________________________
76 Int_t AliITSStrLine::IsParallelTo(AliITSStrLine *line) const {
77 // returns 1 if lines are parallel, 0 if not paralel
80 Double_t vecpx=fCd[1]*cd2[2]-fCd[2]*cd2[1];
81 if(vecpx!=0) return 0;
82 Double_t vecpy=-fCd[0]*cd2[2]+fCd[2]*cd2[0];
83 if(vecpy!=0) return 0;
84 Double_t vecpz=fCd[0]*cd2[1]-fCd[1]*cd2[0];
85 if(vecpz!=0) return 0;
88 //________________________________________________________
89 Int_t AliITSStrLine::Crossrphi(AliITSStrLine *line){
90 // Cross 2 lines in the X-Y plane
97 Double_t c=p2[0]-fP0[0];
100 Double_t f=p2[1]-fP0[1];
101 Double_t deno = a*e-b*d;
104 fTpar = (c*e-b*f)/deno;
112 //________________________________________________________
113 Int_t AliITSStrLine::CrossPoints(AliITSStrLine *line, Double_t *point1, Double_t *point2){
114 // Looks for the crossing point estimated starting from the
122 for(i=0;i<3;i++)k1+=(fP0[i]-p2[i])*fCd[i];
124 for(i=0;i<3;i++)k2+=(fP0[i]-p2[i])*cd2[i];
126 for(i=0;i<3;i++)a11+=fCd[i]*cd2[i];
129 for(i=0;i<3;i++)a21+=cd2[i]*cd2[i];
131 for(i=0;i<3;i++)a12-=fCd[i]*fCd[i];
132 Double_t deno = a11*a22-a21*a12;
133 if(deno == 0.) return -1;
134 fTpar = (a11*k2-a21*k1) / deno;
135 Double_t par2 = (k1*a22-k2*a12) / deno;
137 GetCurrentPoint(point1);
138 line->GetCurrentPoint(point2);
141 //________________________________________________________________
142 Int_t AliITSStrLine::Cross(AliITSStrLine *line, Double_t *point){
144 //Finds intersection between lines
147 Int_t retcod=CrossPoints(line,point1,point2);
149 for(Int_t i=0;i<3;i++)point[i]=(point1[i]+point2[i])/2.;
156 //___________________________________________________________
157 Double_t AliITSStrLine::GetDCA(AliITSStrLine *line){
158 //Returns the distance of closest approach between two lines
164 Int_t ispar=IsParallelTo(line);
166 Double_t dist1q=0,dist2=0,mod=0;
168 dist1q+=(fP0[i]-p2[i])*(fP0[i]-p2[i]);
169 dist2+=(fP0[i]-p2[i])*fCd[i];
174 return TMath::Sqrt(dist1q-dist2*dist2);
178 perp[0]=fCd[1]*cd2[2]-fCd[2]*cd2[1];
179 perp[1]=-fCd[0]*cd2[2]+fCd[2]*cd2[0];
180 perp[2]=fCd[0]*cd2[1]-fCd[1]*cd2[0];
181 Double_t mod=0,dist=0;
183 mod+=perp[i]*perp[i];
184 dist+=(fP0[i]-p2[i])*perp[i];
189 return TMath::Abs(dist);
193 //________________________________________________________
194 void AliITSStrLine::GetCurrentPoint(Double_t *point) const {
195 // Fills the array point with the current value on the line
196 for(Int_t i=0;i<3;i++)point[i]=fP0[i]+fCd[i]*fTpar;