#include "hgeomtrap.h"
#include "hgeomvolume.h"
#include "hgeomvector.h"
ClassImp(HGeomTrap)
HGeomTrap::HGeomTrap() {
fName="TRAP";
nPoints=8;
nParam=11;
param=new TArrayD(nParam);
intrinsicRot.setElement(-1.,0);
intrinsicRot.setElement(-1.,4);
}
HGeomTrap::~HGeomTrap() {
if (param) {
delete param;
param=0;
}
if (center) {
delete center;
center=0;
}
if (position) {
delete position;
position=0;
}
}
TArrayD* HGeomTrap::calcVoluParam(HGeomVolume* volu) {
const Double_t fac=20.;
const Double_t raddeg=180./TMath::Pi();
Double_t alpha, beta;
HGeomVector cb, ct, dc;
for(Int_t i=0;i<4;i++) cb+=*(volu->getPoint(i));
for(Int_t i=4;i<8;i++) ct+=*(volu->getPoint(i));
dc=(ct-cb);
dc*=0.25;
dc.setX(-dc(0));
dc.setY(-dc(1));
param->AddAt(TMath::Abs(dc(2))/fac,0);
alpha=TMath::ATan(TMath::Sqrt(dc(0)*dc(0)+dc(1)*dc(1))/dc(2))*raddeg;
if (TMath::Abs(alpha)<0.0001) {
alpha=0.0;
beta=0.0;
} else {
if (TMath::Abs(dc(0))<0.0001) {
if (dc(1)>0) beta=90.0;
else beta=270.0;
} else {
beta=atan(dc(1)/dc(0))*raddeg;
if (dc(0)<0) beta=180.0 + beta;
if (beta<0) beta=360.0 + beta;
}
}
param->AddAt(alpha,1);
param->AddAt(beta,2);
param->AddAt(((*(volu->getPoint(1)))(1)-(*(volu->getPoint(0)))(1))/fac,3);
param->AddAt(((*(volu->getPoint(1)))(0)-(*(volu->getPoint(2)))(0))/fac,4);
param->AddAt(((*(volu->getPoint(0)))(0)-(*(volu->getPoint(3)))(0))/fac,5);
Double_t a=TMath::ATan(((*(volu->getPoint(1)))(0)
- (*(volu->getPoint(0)))(0)
+ (*(volu->getPoint(2)))(0)
- (*(volu->getPoint(3)))(0))/40./param->At(3)
)*raddeg;
if (TMath::Abs(a)<=0.0001) param->AddAt(0.,6);
else param->AddAt(a,6);
param->AddAt(((*(volu->getPoint(5)))(1)-(*(volu->getPoint(4)))(1))/fac,7);
param->AddAt(((*(volu->getPoint(5)))(0)-(*(volu->getPoint(6)))(0))/fac,8);
param->AddAt(((*(volu->getPoint(4)))(0)-(*(volu->getPoint(7)))(0))/fac,9);
a=TMath::ATan(((*(volu->getPoint(5)))(0)
- (*(volu->getPoint(4)))(0)
+ (*(volu->getPoint(6)))(0)
- (*(volu->getPoint(7)))(0))/40./param->At(7))*raddeg;
if (TMath::Abs(a)<=0.0001) param->AddAt(0.,10);
else param->AddAt(a,10);
Double_t dx=(param->At(4) - param->At(5)) / param->At(3) * param->At(7) -
(param->At(8) - param->At(9));
if (TMath::Abs(dx)>=0.001) {
cout << "top and bottom plane are not coplanar for shape TRAP\n";
cout << "lenght in x-direction of top plane is changed\n";
cout << "old values: " << param->At(8) << " " << param->At(9) << "\n";
param->AddAt(param->At(8) + dx/2.,8);
param->AddAt(param->At(9) - dx/2.,9);
cout << "new values: " << param->At(8) << " " << param->At(9) << "\n";
}
return param;
}
void HGeomTrap::calcVoluPosition(HGeomVolume* volu,
const HGeomTransform& dTC,const HGeomTransform& mTR) {
Double_t t[3]={0.,0.,0.};
for(Int_t i=0;i<8;i++) t[0]+=(*(volu->getPoint(i)))(0);
t[0]/=8.;
t[1]=((*(volu->getPoint(1)))(1) + (*(volu->getPoint(0)))(1) +
(*(volu->getPoint(5)))(1) + (*(volu->getPoint(4)))(1))/4.;
t[2]=((*(volu->getPoint(4)))(2) + (*(volu->getPoint(0)))(2))/2.;
center->setTransVector(t);
center->setRotMatrix(intrinsicRot);
posInMother(dTC,mTR);
}
Last change: Sat May 22 12:56:45 2010
Last generated: 2010-05-22 12:56
This page has been automatically generated. If you have any comments or suggestions about the page layout send a mail to ROOT support, or contact the developers with any questions or problems regarding ROOT.