X-Git-Url: http://git.uio.no/git/?a=blobdiff_plain;f=ITS%2FAliITSgeomMatrix.cxx;h=5134615058182f9f4d0c5eed43f0c9b59eb992e1;hb=eb4728f2366efd8ab268063ca4069b3df0e2de5d;hp=80e80b77a5dd0192f75aa2d72c7b5df77dbb39a8;hpb=a1e1719345ba9efe0fc78e84d3a3aa7f18ee3fca;p=u%2Fmrichter%2FAliRoot.git diff --git a/ITS/AliITSgeomMatrix.cxx b/ITS/AliITSgeomMatrix.cxx index 80e80b77a5d..51346150581 100644 --- a/ITS/AliITSgeomMatrix.cxx +++ b/ITS/AliITSgeomMatrix.cxx @@ -31,19 +31,24 @@ $Id$ #include #include #include +#if ROOT_VERSION_CODE>= 331523 +#include +#else #include +#endif #include #include #include #include #include +#include "AliLog.h" #include "AliITSgeomMatrix.h" ClassImp(AliITSgeomMatrix) //---------------------------------------------------------------------- AliITSgeomMatrix::AliITSgeomMatrix(): -TObject(), +TObject(), // Base Class. fDetectorIndex(0), // Detector type index (like fShapeIndex was) fid(), // layer, ladder, detector numbers. frot(), //! vector of rotations about x,y,z [radians]. @@ -80,17 +85,21 @@ fPath(){ // Path in geometry to this module fid[i] = 0; frot[i] = ftran[i] = 0.0; for(j=0;j<3;j++) fm[i][j] = 0.0; - fCylR = fCylPhi = 0.0; }// end for i fm[0][0] = fm[1][1] = fm[2][2] = 1.0; } //---------------------------------------------------------------------- AliITSgeomMatrix::AliITSgeomMatrix(const AliITSgeomMatrix &source) : -TObject(source), -fDetectorIndex(source.fDetectorIndex), -fCylR(source.fCylR), -fCylPhi(source.fCylPhi), +TObject(source), // Base Class. +fDetectorIndex(source.fDetectorIndex),// Detector type index (like + // fShapeIndex was) +fid(), // layer, ladder, detector numbers. +frot(), //! vector of rotations about x,y,z [radians]. +ftran(), // Translation vector of module x,y,z. +fCylR(source.fCylR), //! R Translation in Cylinderical coordinates +fCylPhi(source.fCylPhi),//! Phi Translation vector in Cylindrical coord. +fm(), // Rotation matrix based on frot. fPath(source.fPath){ // The standard Copy constructor. This make a full / proper copy of // this class. @@ -100,13 +109,14 @@ fPath(source.fPath){ // none. // Return: // A copy constructes AliITSgeomMatrix class. - Int_t i,j; - for(i=0;i<3;i++){ - this->fid[i] = source.fid[i]; - this->frot[i] = source.frot[i]; - this->ftran[i] = source.ftran[i]; - for(j=0;j<3;j++) this->fm[i][j] = source.fm[i][j]; - }// end for i + Int_t i,j; + + for(i=0;i<3;i++){ + this->fid[i] = source.fid[i]; + this->frot[i] = source.frot[i]; + this->ftran[i] = source.ftran[i]; + for(j=0;j<3;j++) this->fm[i][j] = source.fm[i][j]; + }// end for i } //---------------------------------------------------------------------- AliITSgeomMatrix& AliITSgeomMatrix::operator=(const AliITSgeomMatrix &source){ @@ -120,27 +130,26 @@ AliITSgeomMatrix& AliITSgeomMatrix::operator=(const AliITSgeomMatrix &source){ // none. // Return: // A copy of the source AliITSgeomMatrix class. - if(this == &source)return *this; - Int_t i,j; - this->fDetectorIndex = source.fDetectorIndex; - this->fCylR = source.fCylR; - this->fCylPhi = source.fCylPhi; - for(i=0;i<3;i++){ - this->fid[i] = source.fid[i]; - this->frot[i] = source.frot[i]; - this->ftran[i] = source.ftran[i]; + if(this == &source)return *this; + Int_t i,j; - for(j=0;j<3;j++) this->fm[i][j] = source.fm[i][j]; - } - this->fPath = source.fPath; - return *this; + this->fDetectorIndex = source.fDetectorIndex; + this->fCylR = source.fCylR; + this->fCylPhi = source.fCylPhi; + for(i=0;i<3;i++){ + this->fid[i] = source.fid[i]; + this->frot[i] = source.frot[i]; + this->ftran[i] = source.ftran[i]; + for(j=0;j<3;j++) this->fm[i][j] = source.fm[i][j]; + } // end for i + this->fPath = source.fPath; + return *this; } - //---------------------------------------------------------------------- AliITSgeomMatrix::AliITSgeomMatrix(Int_t idt,const Int_t id[3], const Double_t rot[3],const Double_t tran[3]): -TObject(), +TObject(), // Base class fDetectorIndex(idt), // Detector type index (like fShapeIndex was) fid(), // layer, ladder, detector numbers. frot(), //! vector of rotations about x,y,z [radians]. @@ -181,14 +190,14 @@ fPath(){ // Path in geometry to this moduel }// end for i fCylR = TMath::Sqrt(ftran[0]*ftran[0]+ftran[1]*ftran[1]); fCylPhi = TMath::ATan2(ftran[1],ftran[0]); - if(fCylPhi<0.0) fCylPhi += TMath::Pi(); + if(fCylPhi<0.0) fCylPhi += 2.*TMath::Pi(); this->MatrixFromAngle(); } //---------------------------------------------------------------------- AliITSgeomMatrix::AliITSgeomMatrix(Int_t idt, const Int_t id[3], Double_t matrix[3][3], const Double_t tran[3]): -TObject(), +TObject(), // Base class fDetectorIndex(idt), // Detector type index (like fShapeIndex was) fid(), // layer, ladder, detector numbers. frot(), //! vector of rotations about x,y,z [radians]. @@ -230,7 +239,7 @@ fPath(){ // Path in geometry to this module }// end for i fCylR = TMath::Sqrt(ftran[0]*ftran[0]+ftran[1]*ftran[1]); fCylPhi = TMath::ATan2(ftran[1],ftran[0]); - if(fCylPhi<0.0) fCylPhi += TMath::Pi(); + if(fCylPhi<0.0) fCylPhi += 2.*TMath::Pi(); this->AngleFromMatrix(); } //---------------------------------------------------------------------- @@ -244,19 +253,20 @@ void AliITSgeomMatrix::SixAnglesFromMatrix(Double_t *ang)const{ // Return: // noting Double_t si,c=180./TMath::Pi(); + const Double_t epsil=1.e-15; ang[1] = TMath::ATan2(fm[0][1],fm[0][0]); - if(TMath::Cos(ang[1])!=0.0) si = fm[0][0]/TMath::Cos(ang[1]); + if( !(TMath::AreEqualAbs(TMath::Cos(ang[1]),0.,epsil))) si = fm[0][0]/TMath::Cos(ang[1]); else si = fm[0][1]/TMath::Sin(ang[1]); ang[0] = TMath::ATan2(si,fm[0][2]); ang[3] = TMath::ATan2(fm[1][1],fm[1][0]); - if(TMath::Cos(ang[3])!=0.0) si = fm[1][0]/TMath::Cos(ang[3]); + if(!(TMath::AreEqualAbs(TMath::Cos(ang[3]),0.,epsil))) si = fm[1][0]/TMath::Cos(ang[3]); else si = fm[1][1]/TMath::Sin(ang[3]); ang[2] = TMath::ATan2(si,fm[1][2]); ang[5] = TMath::ATan2(fm[2][1],fm[2][0]); - if(TMath::Cos(ang[5])!=0.0) si = fm[2][0]/TMath::Cos(ang[5]); + if(!(TMath::AreEqualAbs(TMath::Cos(ang[5]),0.,epsil))) si = fm[2][0]/TMath::Cos(ang[5]); else si = fm[2][1]/TMath::Sin(ang[5]); ang[4] = TMath::ATan2(si,fm[2][2]); @@ -276,39 +286,40 @@ void AliITSgeomMatrix::MatrixFromSixAngles(const Double_t *ang){ // noting Int_t i,j; Double_t si,lr[9],c=TMath::Pi()/180.; + const Double_t epsil = 1.e-15; si = TMath::Sin(c*ang[0]); - if(ang[0]== 90.0) si = +1.0; - if(ang[0]==270.0) si = -1.0; - if(ang[0]== 0.0||ang[0]==180.) si = 0.0; + if(TMath::AreEqualAbs(ang[0],90.,epsil)) si = +1.0; + if(TMath::AreEqualAbs(ang[0],270.,epsil)) si = -1.0; + if(TMath::AreEqualAbs(ang[0],0.,epsil) ||TMath::AreEqualAbs(ang[0],180.,epsil)) si = 0.0; lr[0] = si * TMath::Cos(c*ang[1]); lr[1] = si * TMath::Sin(c*ang[1]); lr[2] = TMath::Cos(c*ang[0]); - if(ang[0]== 90.0||ang[0]==270.) lr[2] = 0.0; - if(ang[0]== 0.0) lr[2] = +1.0; - if(ang[0]==180.0) lr[2] = -1.0; + if(TMath::AreEqualAbs(ang[0],90.,epsil)||TMath::AreEqualAbs(ang[0],270.,epsil)) lr[2] = 0.0; + if(TMath::AreEqualAbs(ang[0],0.,epsil)) lr[2] = +1.0; + if(TMath::AreEqualAbs(ang[0],180.,epsil)) lr[2] = -1.0; // si = TMath::Sin(c*ang[2]); - if(ang[2]== 90.0) si = +1.0; - if(ang[2]==270.0) si = -1.0; - if(ang[2]== 0.0||ang[2]==180.) si = 0.0; + if(TMath::AreEqualAbs(ang[2],90.,epsil)) si = +1.0; + if(TMath::AreEqualAbs(ang[2],270.,epsil)) si = -1.0; + if(TMath::AreEqualAbs(ang[2],0.,epsil) || TMath::AreEqualAbs(ang[2],180.,epsil)) si = 0.0; lr[3] = si * TMath::Cos(c*ang[3]); lr[4] = si * TMath::Sin(c*ang[3]); lr[5] = TMath::Cos(c*ang[2]); - if(ang[2]== 90.0||ang[2]==270.) lr[5] = 0.0; - if(ang[2]== 0.0) lr[5] = +1.0; - if(ang[2]==180.0) lr[5] = -1.0; + if(TMath::AreEqualAbs(ang[2],90.,epsil) || TMath::AreEqualAbs(ang[2],270.,epsil)) lr[5] = 0.0; + if(TMath::AreEqualAbs(ang[2],0.,epsil)) lr[5] = +1.0; + if(TMath::AreEqualAbs(ang[2],180.,epsil)) lr[5] = -1.0; // si = TMath::Sin(c*ang[4]); - if(ang[4]== 90.0) si = +1.0; - if(ang[4]==270.0) si = -1.0; - if(ang[4]== 0.0||ang[4]==180.) si = 0.0; + if(TMath::AreEqualAbs(ang[4],90.,epsil)) si = +1.0; + if(TMath::AreEqualAbs(ang[4],270.0,epsil)) si = -1.0; + if(TMath::AreEqualAbs(ang[4],0.,epsil)|| TMath::AreEqualAbs(ang[4],180.,epsil)) si = 0.0; lr[6] = si * TMath::Cos(c*ang[5]); lr[7] = si * TMath::Sin(c*ang[5]); lr[8] = TMath::Cos(c*ang[4]); - if(ang[4]== 90.0||ang[4]==270.0) lr[8] = 0.0; - if(ang[4]== 0.0) lr[8] = +1.0; - if(ang[4]==180.0) lr[8] = -1.0; + if(TMath::AreEqualAbs(ang[4],90.0,epsil) ||TMath::AreEqualAbs(ang[4],270.,epsil)) lr[8] = 0.0; + if(TMath::AreEqualAbs(ang[4],0.,epsil)) lr[8] = +1.0; + if(TMath::AreEqualAbs(ang[4],180.0,epsil)) lr[8] = -1.0; // Normalize these elements and fill matrix fm. for(i=0;i<3;i++){// reuse si. si = 0.0; @@ -322,11 +333,15 @@ void AliITSgeomMatrix::MatrixFromSixAngles(const Double_t *ang){ AliITSgeomMatrix::AliITSgeomMatrix(const Double_t rotd[6]/*degrees*/, Int_t idt,const Int_t id[3], const Double_t tran[3]): -TObject(), -fDetectorIndex(idt), -fCylR(0.), -fCylPhi(0.), -fPath(){ +TObject(), // Base class +fDetectorIndex(idt), // Detector type index (like fShapeIndex was) +fid(), // layer, ladder, detector numbers. +frot(), //! vector of rotations about x,y,z [radians]. +ftran(), // Translation vector of module x,y,z. +fCylR(0.0), //! R Translation in Cylinderical coordinates +fCylPhi(0.0),//! Phi Translation vector in Cylindrical coord. +fm(), // Rotation matrix based on frot. +fPath(){ // Path in geometry to this module // This is a constructor for the AliITSgeomMatrix class. The matrix // is defined by the 6 GEANT 3.21 rotation angles [degrees], and // the translation vector tran [cm]. In addition the layer, ladder, @@ -355,10 +370,9 @@ fPath(){ }// end for i fCylR = TMath::Sqrt(ftran[0]*ftran[0]+ftran[1]*ftran[1]); fCylPhi = TMath::ATan2(ftran[1],ftran[0]); - if(fCylPhi<0.0) fCylPhi += TMath::Pi(); + if(fCylPhi<0.0) fCylPhi += 2.*TMath::Pi(); this->MatrixFromSixAngles(rotd); } - //---------------------------------------------------------------------- void AliITSgeomMatrix::AngleFromMatrix(){ // Computes the angles from the rotation matrix up to a phase of @@ -388,7 +402,6 @@ void AliITSgeomMatrix::AngleFromMatrix(){ frot[2] = rz; return; } - //---------------------------------------------------------------------- void AliITSgeomMatrix::MatrixFromAngle(){ // Computes the Rotation matrix from the angles [radians] kept in this @@ -407,23 +420,57 @@ void AliITSgeomMatrix::MatrixFromAngle(){ // none // Return: // none - Double_t sx,sy,sz,cx,cy,cz; - - sx = TMath::Sin(frot[0]); cx = TMath::Cos(frot[0]); - sy = TMath::Sin(frot[1]); cy = TMath::Cos(frot[1]); - sz = TMath::Sin(frot[2]); cz = TMath::Cos(frot[2]); - fm[0][0] = +cz*cy; // fr[0] - fm[0][1] = +cz*sy*sx - sz*cx; // fr[1] - fm[0][2] = +cz*sy*cx + sz*sx; // fr[2] - fm[1][0] = +sz*cy; // fr[3] - fm[1][1] = +sz*sy*sx + cz*cx; // fr[4] - fm[1][2] = +sz*sy*cx - cz*sx; // fr[5] - fm[2][0] = -sy; // fr[6] - fm[2][1] = +cy*sx; // fr[7] - fm[2][2] = +cy*cx; // fr[8] + Double_t sx,sy,sz,cx,cy,cz; + sx = TMath::Sin(frot[0]); cx = TMath::Cos(frot[0]); + sy = TMath::Sin(frot[1]); cy = TMath::Cos(frot[1]); + sz = TMath::Sin(frot[2]); cz = TMath::Cos(frot[2]); + fm[0][0] = +cz*cy; // fr[0] + fm[0][1] = +cz*sy*sx - sz*cx; // fr[1] + fm[0][2] = +cz*sy*cx + sz*sx; // fr[2] + fm[1][0] = +sz*cy; // fr[3] + fm[1][1] = +sz*sy*sx + cz*cx; // fr[4] + fm[1][2] = +sz*sy*cx - cz*sx; // fr[5] + fm[2][0] = -sy; // fr[6] + fm[2][1] = +cy*sx; // fr[7] + fm[2][2] = +cy*cx; // fr[8] } +//---------------------------------------------------------------------- +void AliITSgeomMatrix::SetEulerAnglesChi(const Double_t ang[3]){ + // Computes the Rotation matrix from the Euler angles [radians], + // Chi-convention, kept in this class. The matrix used in + // AliITSgeomMatrix::SetEulerAnglesChi and + // its inverse AliITSgeomMatrix::GetEulerAnglesChi() are defined in + // the following ways, R = Rb*Rc*Rd (M=R*L+T) where + // C2 +S2 0 1 0 0 C0 +S0 0 + // Rb=-S2 C2 0 Rc= 0 C1 +S1 Rd=-S0 C0 0 + // 0 0 1 0 -S1 C1 0 0 1 + // This form is taken from Wolfram Research's Geometry> + // Transformations>Rotations web page (also should be + // found in their book). + // Inputs: + // Double_t ang[3] The three Euler Angles Phi, Theta, Psi + // Outputs: + // none + // Return: + // none + Double_t s0,s1,s2,c0,c1,c2; + s0 = TMath::Sin(ang[0]); c0 = TMath::Cos(ang[0]); + s1 = TMath::Sin(ang[1]); c1 = TMath::Cos(ang[1]); + s2 = TMath::Sin(ang[2]); c2 = TMath::Cos(ang[2]); + fm[0][0] = +c2*c0-c1*s0*s2; // fr[0] + fm[0][1] = +c2*s0+c1*c0*s2; // fr[1] + fm[0][2] = +s2*s1; // fr[2] + fm[1][0] = -s2*c0-c1*s0*c2; // fr[3] + fm[1][1] = -s2*s0+c1*c0*c2; // fr[4] + fm[1][2] = +c2*s1; // fr[5] + fm[2][0] = s1*s0; // fr[6] + fm[2][1] = -s1*c0; // fr[7] + fm[2][2] = +c1; // fr[8] + AngleFromMatrix(); + return ; +} //---------------------------------------------------------------------- void AliITSgeomMatrix::GtoLPosition(const Double_t g0[3],Double_t l[3]) const { // Returns the local coordinates given the global coordinates [cm]. @@ -435,16 +482,16 @@ void AliITSgeomMatrix::GtoLPosition(const Double_t g0[3],Double_t l[3]) const { // detector coordiante system // Return: // none - Int_t i,j; - Double_t g[3]; + Int_t i,j; + Double_t g[3]; - for(i=0;i<3;i++) g[i] = g0[i] - ftran[i]; - for(i=0;i<3;i++){ - l[i] = 0.0; - for(j=0;j<3;j++) l[i] += fm[i][j]*g[j]; - // g = R l + translation - } // end for i - return; + for(i=0;i<3;i++) g[i] = g0[i] - ftran[i]; + for(i=0;i<3;i++){ + l[i] = 0.0; + for(j=0;j<3;j++) l[i] += fm[i][j]*g[j]; + // g = R l + translation + } // end for i + return; } //---------------------------------------------------------------------- void AliITSgeomMatrix::LtoGPosition(const Double_t l[3],Double_t g[3]) const { @@ -457,15 +504,15 @@ void AliITSgeomMatrix::LtoGPosition(const Double_t l[3],Double_t g[3]) const { // Global coordinate system // Return: // none. - Int_t i,j; + Int_t i,j; - for(i=0;i<3;i++){ - g[i] = 0.0; - for(j=0;j<3;j++) g[i] += fm[j][i]*l[j]; - g[i] += ftran[i]; - // g = R^t l + translation - } // end for i - return; + for(i=0;i<3;i++){ + g[i] = 0.0; + for(j=0;j<3;j++) g[i] += fm[j][i]*l[j]; + g[i] += ftran[i]; + // g = R^t l + translation + } // end for i + return; } //---------------------------------------------------------------------- void AliITSgeomMatrix::GtoLMomentum(const Double_t g[3],Double_t l[3]) const{ @@ -480,14 +527,14 @@ void AliITSgeomMatrix::GtoLMomentum(const Double_t g[3],Double_t l[3]) const{ // local coordinate system // Return: // none. - Int_t i,j; + Int_t i,j; - for(i=0;i<3;i++){ - l[i] = 0.0; - for(j=0;j<3;j++) l[i] += fm[i][j]*g[j]; - // g = R l - } // end for i - return; + for(i=0;i<3;i++){ + l[i] = 0.0; + for(j=0;j<3;j++) l[i] += fm[i][j]*g[j]; + // g = R l + } // end for i + return; } //---------------------------------------------------------------------- void AliITSgeomMatrix::LtoGMomentum(const Double_t l[3],Double_t g[3]) const { @@ -502,14 +549,14 @@ void AliITSgeomMatrix::LtoGMomentum(const Double_t l[3],Double_t g[3]) const { // coordinate system // Return: // none. - Int_t i,j; + Int_t i,j; - for(i=0;i<3;i++){ - g[i] = 0.0; - for(j=0;j<3;j++) g[i] += fm[j][i]*l[j]; - // g = R^t l - } // end for i - return; + for(i=0;i<3;i++){ + g[i] = 0.0; + for(j=0;j<3;j++) g[i] += fm[j][i]*l[j]; + // g = R^t l + } // end for i + return; } //---------------------------------------------------------------------- void AliITSgeomMatrix::GtoLPositionError(const Double_t g[3][3], @@ -526,15 +573,15 @@ void AliITSgeomMatrix::GtoLPositionError(const Double_t g[3][3], // local coordinate system // Return: // none. - Int_t i,j,k,m; + Int_t i,j,k,m; - for(i=0;i<3;i++)for(m=0;m<3;m++){ - l[i][m] = 0.0; - for(j=0;j<3;j++)for(k=0;k<3;k++) - l[i][m] += fm[j][i]*g[j][k]*fm[k][m]; - } // end for i,m - // g = R^t l R - return; + for(i=0;i<3;i++)for(m=0;m<3;m++){ + l[i][m] = 0.0; + for(j=0;j<3;j++)for(k=0;k<3;k++) + l[i][m] += fm[j][i]*g[j][k]*fm[k][m]; + } // end for i,m + // g = R^t l R + return; } //---------------------------------------------------------------------- void AliITSgeomMatrix::LtoGPositionError(const Double_t l[3][3], @@ -550,15 +597,15 @@ void AliITSgeomMatrix::LtoGPositionError(const Double_t l[3][3], // coordinate system // Return: // none. - Int_t i,j,k,m; + Int_t i,j,k,m; - for(i=0;i<3;i++)for(m=0;m<3;m++){ - g[i][m] = 0.0; - for(j=0;j<3;j++)for(k=0;k<3;k++) - g[i][m] += fm[i][j]*l[j][k]*fm[m][k]; - } // end for i,m - // g = R l R^t - return; + for(i=0;i<3;i++)for(m=0;m<3;m++){ + g[i][m] = 0.0; + for(j=0;j<3;j++)for(k=0;k<3;k++) + g[i][m] += fm[i][j]*l[j][k]*fm[m][k]; + } // end for i,m + // g = R l R^t + return; } //---------------------------------------------------------------------- void AliITSgeomMatrix::GtoLPositionTracking(const Double_t g[3], @@ -729,22 +776,22 @@ void AliITSgeomMatrix::GtoLPositionErrorTracking(const Double_t g[3][3], // Double_t l[3][3] the error matrix represented in the detector // local coordinate system // Return: - Int_t i,j,k,m; - Double_t rt[3][3]; - Double_t a0[3][3] = {{0.,+1.,0.},{-1.,0.,0.},{0.,0.,+1.}}; - Double_t a1[3][3] = {{0.,-1.,0.},{+1.,0.,0.},{0.,0.,+1.}}; + Int_t i,j,k,m; + Double_t rt[3][3]; + Double_t a0[3][3] = {{0.,+1.,0.},{-1.,0.,0.},{0.,0.,+1.}}; + Double_t a1[3][3] = {{0.,-1.,0.},{+1.,0.,0.},{0.,0.,+1.}}; - if(fid[0]==1) for(i=0;i<3;i++)for(j=0;j<3;j++)for(k=0;k<3;k++) - rt[i][k] = a0[i][j]*fm[j][k]; - else for(i=0;i<3;i++)for(j=0;j<3;j++)for(k=0;k<3;k++) - rt[i][k] = a1[i][j]*fm[j][k]; - for(i=0;i<3;i++)for(m=0;m<3;m++){ - l[i][m] = 0.0; - for(j=0;j<3;j++)for(k=0;k<3;k++) - l[i][m] += rt[j][i]*g[j][k]*rt[k][m]; - } // end for i,m - // g = R^t l R - return; + if(fid[0]==1) for(i=0;i<3;i++)for(j=0;j<3;j++)for(k=0;k<3;k++) + rt[i][k] = a0[i][j]*fm[j][k]; + else for(i=0;i<3;i++)for(j=0;j<3;j++)for(k=0;k<3;k++) + rt[i][k] = a1[i][j]*fm[j][k]; + for(i=0;i<3;i++)for(m=0;m<3;m++){ + l[i][m] = 0.0; + for(j=0;j<3;j++)for(k=0;k<3;k++) + l[i][m] += rt[j][i]*g[j][k]*rt[k][m]; + } // end for i,m + // g = R^t l R + return; } //---------------------------------------------------------------------- void AliITSgeomMatrix::LtoGPositionErrorTracking(const Double_t l[3][3], @@ -768,22 +815,22 @@ void AliITSgeomMatrix::LtoGPositionErrorTracking(const Double_t l[3][3], // coordinate system // Return: // none. - Int_t i,j,k,m; - Double_t rt[3][3]; - Double_t a0[3][3] = {{0.,+1.,0.},{-1.,0.,0.},{0.,0.,+1.}}; - Double_t a1[3][3] = {{0.,-1.,0.},{+1.,0.,0.},{0.,0.,+1.}}; + Int_t i,j,k,m; + Double_t rt[3][3]; + Double_t a0[3][3] = {{0.,+1.,0.},{-1.,0.,0.},{0.,0.,+1.}}; + Double_t a1[3][3] = {{0.,-1.,0.},{+1.,0.,0.},{0.,0.,+1.}}; - if(fid[0]==1) for(i=0;i<3;i++)for(j=0;j<3;j++)for(k=0;k<3;k++) - rt[i][k] = a0[i][j]*fm[j][k]; - else for(i=0;i<3;i++)for(j=0;j<3;j++)for(k=0;k<3;k++) - rt[i][k] = a1[i][j]*fm[j][k]; - for(i=0;i<3;i++)for(m=0;m<3;m++){ - g[i][m] = 0.0; - for(j=0;j<3;j++)for(k=0;k<3;k++) - g[i][m] += rt[i][j]*l[j][k]*rt[m][k]; - } // end for i,m - // g = R l R^t - return; + if(fid[0]==1) for(i=0;i<3;i++)for(j=0;j<3;j++)for(k=0;k<3;k++) + rt[i][k] = a0[i][j]*fm[j][k]; + else for(i=0;i<3;i++)for(j=0;j<3;j++)for(k=0;k<3;k++) + rt[i][k] = a1[i][j]*fm[j][k]; + for(i=0;i<3;i++)for(m=0;m<3;m++){ + g[i][m] = 0.0; + for(j=0;j<3;j++)for(k=0;k<3;k++) + g[i][m] += rt[i][j]*l[j][k]*rt[m][k]; + } // end for i,m + // g = R l R^t + return; } //---------------------------------------------------------------------- void AliITSgeomMatrix::PrintTitles(ostream *os) const { @@ -869,7 +916,7 @@ void AliITSgeomMatrix::Read(istream *is){ // Return: // none. Int_t i,j; - + const Int_t kMxVal=10000; *is >> fDetectorIndex; for(i=0;i<3;i++) *is >> fid[i]; // for(i=0;i<3;i++) *is >> frot[i]; // Redundant with fm[][]. @@ -878,13 +925,17 @@ void AliITSgeomMatrix::Read(istream *is){ while(is->peek()==' ')is->get(); // skip white spaces if(isprint(is->peek())){ // old format did not have path. *is >> j; // string length + if(j>kMxVal || j<0){ + AliError(Form("j> %d",kMxVal)); + return; + } fPath.Resize(j); for(i=0;i> fPath[i];} } // end if AngleFromMatrix(); // compute angles frot[]. fCylR = TMath::Sqrt(ftran[0]*ftran[0]+ftran[1]*ftran[1]); fCylPhi = TMath::ATan2(ftran[1],ftran[0]); - if(fCylPhi<0.0) fCylPhi += TMath::Pi(); + if(fCylPhi<0.0) fCylPhi += 2.*TMath::Pi(); return; } //______________________________________________________________________ @@ -902,7 +953,7 @@ void AliITSgeomMatrix::Streamer(TBuffer &R__b){ fCylR = TMath::Sqrt(ftran[0]*ftran[0]+ftran[1]*ftran[1]); fCylPhi = TMath::ATan2(ftran[1],ftran[0]); this->AngleFromMatrix(); - if(fCylPhi<0.0) fCylPhi += TMath::Pi(); + if(fCylPhi<0.0) fCylPhi += 2.*TMath::Pi(); } else { AliITSgeomMatrix::Class()->WriteBuffer(R__b, this); } // end if @@ -919,7 +970,7 @@ void AliITSgeomMatrix::SetTranslation(const Double_t tran[3]){ for(Int_t i=0;i<3;i++) ftran[i] = tran[i]; fCylR = TMath::Sqrt(ftran[0]*ftran[0]+ftran[1]*ftran[1]); fCylPhi = TMath::ATan2(ftran[1],ftran[0]); - if(fCylPhi<0.0) fCylPhi += TMath::Pi(); + if(fCylPhi<0.0) fCylPhi += 2.*TMath::Pi(); } //---------------------------------------------------------------------- TPolyLine3D* AliITSgeomMatrix::CreateLocalAxis() const { @@ -1001,22 +1052,26 @@ TNode* AliITSgeomMatrix::CreateNode(const Char_t *nodeName, title = nodeTitle; // mother->cd(); - TNode *node1 = new TNode(name.Data(),title.Data(),shape,trans[0],trans[1],trans[2],rot); + TNode *node1 = new TNode(name.Data(),title.Data(),shape, + trans[0],trans[1],trans[2],rot); if(axis){ Int_t i,j; const Float_t kScale=0.5,kLw=0.2; - Float_t xchar[13][2]={{0.5*kLw,1.},{0.,0.5*kLw},{0.5-0.5*kLw,0.5}, - {0.,0.5*kLw},{0.5*kLw,0.},{0.5,0.5-0.5*kLw}, - {1-0.5*kLw,0.},{1.,0.5*kLw},{0.5+0.5*kLw,0.5}, - {1.,1.-0.5*kLw},{1.-0.5*kLw,1.},{0.5,0.5+0.5*kLw}, - {0.5*kLw,1.}}; - Float_t ychar[10][2]={{.5-0.5*kLw,0.},{.5+0.5*kLw,0.},{.5+0.5*kLw,0.5-0.5*kLw}, - {1.,1.-0.5*kLw},{1.-0.5*kLw,1.},{0.5+0.5*kLw,0.5}, - {0.5*kLw,1.} ,{0.,1-0.5*kLw} ,{0.5-0.5*kLw,0.5}, - {.5-0.5*kLw,0.}}; - Float_t zchar[11][2]={{0.,1.},{0,1.-kLw},{1.-kLw,1.-kLw},{0.,kLw} ,{0.,0.}, - {1.,0.},{1.,kLw} ,{kLw,kLw} ,{1.,1.-kLw},{1.,1.}, - {0.,1.}}; + Float_t xchar[13][2]={ + {0.5*kLw,1.},{0.,0.5*kLw},{0.5-0.5*kLw,0.5}, + {0.,0.5*kLw},{0.5*kLw,0.},{0.5,0.5-0.5*kLw}, + {1-0.5*kLw,0.},{1.,0.5*kLw},{0.5+0.5*kLw,0.5}, + {1.,1.-0.5*kLw},{1.-0.5*kLw,1.},{0.5,0.5+0.5*kLw}, + {0.5*kLw,1.}}; + Float_t ychar[10][2]={ + {.5-0.5*kLw,0.},{.5+0.5*kLw,0.},{.5+0.5*kLw,0.5-0.5*kLw}, + {1.,1.-0.5*kLw},{1.-0.5*kLw,1.},{0.5+0.5*kLw,0.5}, + {0.5*kLw,1.} ,{0.,1-0.5*kLw} ,{0.5-0.5*kLw,0.5}, + {.5-0.5*kLw,0.}}; + Float_t zchar[11][2]={ + {0.,1.},{0,1.-kLw},{1.-kLw,1.-kLw},{0.,kLw} ,{0.,0.}, + {1.,0.},{1.,kLw} ,{kLw,kLw} ,{1.,1.-kLw},{1.,1.}, + {0.,1.}}; for(i=0;i<13;i++)for(j=0;j<2;j++){ if(i<13) xchar[i][j] = kScale*xchar[i][j]; if(i<10) ychar[i][j] = kScale*ychar[i][j]; @@ -1031,16 +1086,18 @@ TNode* AliITSgeomMatrix::CreateNode(const Char_t *nodeName, TXTRU *axiszl = new TXTRU("z","z","text",10,2); for(i=0;i<10;i++) axiszl->DefineVertex(i,zchar[i][0],zchar[i][1]); axiszl->DefineSection(0,-0.5*kLw);axiszl->DefineSection(1,0.5*kLw); - Float_t lxy[13][2]={{-0.5*kLw,-0.5*kLw},{0.8,-0.5*kLw},{0.8,-0.1},{1.0,0.0}, - {0.8,0.1},{0.8,0.5*kLw},{0.5*kLw,0.5*kLw},{0.5*kLw,0.8}, - {0.1,0.8},{0.0,1.0},{-0.1,0.8},{-0.5*kLw,0.8}, - {-0.5*kLw,-0.5*kLw}}; + Float_t lxy[13][2]={ + {-0.5*kLw,-0.5*kLw},{0.8,-0.5*kLw},{0.8,-0.1},{1.0,0.0}, + {0.8,0.1},{0.8,0.5*kLw},{0.5*kLw,0.5*kLw},{0.5*kLw,0.8}, + {0.1,0.8},{0.0,1.0},{-0.1,0.8},{-0.5*kLw,0.8}, + {-0.5*kLw,-0.5*kLw}}; TXTRU *axisxy = new TXTRU("axisxy","axisxy","text",13,2); for(i=0;i<13;i++) axisxy->DefineVertex(i,lxy[i][0],lxy[i][1]); axisxy->DefineSection(0,-0.5*kLw);axisxy->DefineSection(1,0.5*kLw); - Float_t lz[8][2]={{0.5*kLw,-0.5*kLw},{0.8,-0.5*kLw},{0.8,-0.1},{1.0,0.0}, - {0.8,0.1},{0.8,0.5*kLw},{0.5*kLw,0.5*kLw}, - {0.5*kLw,-0.5*kLw}}; + Float_t lz[8][2]={ + {0.5*kLw,-0.5*kLw},{0.8,-0.5*kLw},{0.8,-0.1},{1.0,0.0}, + {0.8,0.1},{0.8,0.5*kLw},{0.5*kLw,0.5*kLw}, + {0.5*kLw,-0.5*kLw}}; TXTRU *axisz = new TXTRU("axisz","axisz","text",8,2); for(i=0;i<8;i++) axisz->DefineVertex(i,lz[i][0],lz[i][1]); axisz->DefineSection(0,-0.5*kLw);axisz->DefineSection(1,0.5*kLw); @@ -1052,7 +1109,8 @@ TNode* AliITSgeomMatrix::CreateNode(const Char_t *nodeName, title = name.Append("axisxy"); TNode *nodeaxy = new TNode(title.Data(),title.Data(),axisxy); title = name.Append("axisz"); - TNode *nodeaz = new TNode(title.Data(),title.Data(),axisz,0.,0.,0.,yaxis90); + TNode *nodeaz = new TNode(title.Data(),title.Data(),axisz, + 0.,0.,0.,yaxis90); TNode *textboxX0 = new TNode("textboxX0","textboxX0",axisxl, lxy[3][0],lxy[3][1],0.0); TNode *textboxX1 = new TNode("textboxX1","textboxX1",axisxl, @@ -1100,7 +1158,13 @@ void AliITSgeomMatrix::MakeFigures() const { Float_t l[5][3]={{1.0,0.0,0.0},{0.0,0.0,0.0},{0.0,1.0,0.0},{0.0,0.0,0.0}, {0.0,0.0,1.0}}; TCanvas *c = new TCanvas(kFALSE);// create a batch mode canvas. +#if ROOT_VERSION_CODE>= 331523 + Double_t rmin[]={-1,-1,-1}; + Double_t rmax[]={ 1, 1, 1}; + TView *view = new TView3D(1,rmin,rmax); +#else TView *view = new TView(1); // Create Cartesian coordiante view +#endif TBRIK *mother = new TBRIK("Mother","Mother","void",kDx0,kDy0,kDz0); TBRIK *det = new TBRIK("Detector","","Si",kDx,kDy,kDz); TPolyLine3D *axis = new TPolyLine3D(5,&(l[0][0])); @@ -1126,8 +1190,10 @@ void AliITSgeomMatrix::MakeFigures() const { node0->cd(); TNode *node1 = new TNode("NODE1","NODE1",det); node1->cd(); - TNode *nodex = new TNode("NODEx","NODEx",arrow,l[0][0],l[0][1],l[0][2],xarrow); - TNode *nodey = new TNode("NODEy","NODEy",arrow,l[2][0],l[2][1],l[2][2],yarrow); + TNode *nodex = new TNode("NODEx","NODEx",arrow, + l[0][0],l[0][1],l[0][2],xarrow); + TNode *nodey = new TNode("NODEy","NODEy",arrow, + l[2][0],l[2][1],l[2][2],yarrow); TNode *nodez = new TNode("NODEz","NODEz",arrow,l[4][0],l[4][1],l[4][2]); // axis->Draw();