本文整理汇总了C++中TGeoRotation::SetMatrix方法的典型用法代码示例。如果您正苦于以下问题:C++ TGeoRotation::SetMatrix方法的具体用法?C++ TGeoRotation::SetMatrix怎么用?C++ TGeoRotation::SetMatrix使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类TGeoRotation
的用法示例。
在下文中一共展示了TGeoRotation::SetMatrix方法的4个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: TGeoIdentity
// function to convert this transformation to a TGeo transformation
// mainly used for the benchmark comparisons with ROOT
TGeoMatrix * Transformation3D::ConvertToTGeoMatrix() const
{
if( fIdentity ){
return new TGeoIdentity();
}
if( fHasTranslation && ! fHasRotation ) {
return new TGeoTranslation(fTranslation[0], fTranslation[1], fTranslation[2]);
}
if( fHasRotation && ! fHasTranslation ) {
TGeoRotation * tmp = new TGeoRotation();
tmp->SetMatrix( Rotation() );
return tmp;
}
if( fHasTranslation && fHasRotation )
{
TGeoRotation * tmp = new TGeoRotation();
tmp->SetMatrix( Rotation() );
return new TGeoCombiTrans(fTranslation[0], fTranslation[1],
fTranslation[2], tmp);
}
return 0;
}
示例2: Draw3D
void Draw3D(AliITSOnlineCalibrationSPDhandler *h){
TGeoHMatrix m2t[240];
for(Int_t imod=0; imod<240; imod++){
int vid = AliITSAlignMille2Module::GetVolumeIDFromIndex(imod);
AliITSAlignMille2Module::SensVolMatrix(vid,&m2t[imod]);
}
delete gGeoManager;
new TGeoManager("SPD","active");
TGeoMaterial *vacuum = new TGeoMaterial("vacuum",0,0,0);
TGeoMedium *none = new TGeoMedium("Vacuum",0,vacuum);
TGeoVolume *top = gGeoManager->MakeBox("TOP",none,500,500,500);
gGeoManager->SetTopVolume(top);
TGeoVolume *ladder = gGeoManager->MakeBox("ladder",none,0.6375,0.001/2,3.48);
Int_t nActive[2]={0,0};
for(Int_t imod=0; imod<240; imod++){
TGeoRotation *rot = new TGeoRotation();
rot->SetMatrix(m2t[imod].GetRotationMatrix());
TGeoCombiTrans *matrix = new TGeoCombiTrans(m2t[imod].GetTranslation()[0],m2t[imod].GetTranslation()[1],m2t[imod].GetTranslation()[2],rot);
if((40960-h->GetNrBad(imod))>0) {
top->AddNode(ladder,imod,matrix);
if(imod<80) nActive[0]++;
else nActive[1]++;
}
}
printf(" \n\n Number of Active SPD modules (->Total) : inner %i (80) outer %i (160) \n\n\n",nActive[0],nActive[1]);
gGeoManager->CloseGeometry();
top->Draw("ogl");
gPad->GetView()->ShowAxis();
}
示例3: GetGlobalPosition
TGeoCombiTrans* GetGlobalPosition(TGeoCombiTrans *fRef)
{
if (fLocalTrans == kTRUE ) {
if ( ( fThetaX == 0 ) && ( fThetaY==0 ) && ( fThetaZ == 0 )
&&
( fX == 0 ) && ( fY == 0 ) && ( fZ == 0 )
) return fRef;
// X axis
Double_t xAxis[3] = { 1. , 0. , 0. };
Double_t yAxis[3] = { 0. , 1. , 0. };
Double_t zAxis[3] = { 0. , 0. , 1. };
// Reference Rotation
fRefRot = fRef->GetRotation();
if (fRefRot) {
Double_t mX[3] = {0.,0.,0.};
Double_t mY[3] = {0.,0.,0.};
Double_t mZ[3] = {0.,0.,0.};
fRefRot->LocalToMasterVect(xAxis,mX);
fRefRot->LocalToMasterVect(yAxis,mY);
fRefRot->LocalToMasterVect(zAxis,mZ);
Double_t a[4]={ mX[0],mX[1],mX[2], fThetaX };
Double_t b[4]={ mY[0],mY[1],mY[2], fThetaY };
Double_t c[4]={ mZ[0],mZ[1],mZ[2], fThetaZ };
ROOT::Math::AxisAngle aX(a,a+4);
ROOT::Math::AxisAngle aY(b,b+4);
ROOT::Math::AxisAngle aZ(c,c+4);
ROOT::Math::Rotation3D fMatX( aX );
ROOT::Math::Rotation3D fMatY( aY );
ROOT::Math::Rotation3D fMatZ( aZ );
ROOT::Math::Rotation3D fRotXYZ = (fMatZ * (fMatY * fMatX));
//cout << fRotXYZ << endl;
Double_t fRotable[9]={0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0};
fRotXYZ.GetComponents(
fRotable[0],fRotable[3],fRotable[6],
fRotable[1],fRotable[4],fRotable[7],
fRotable[2],fRotable[5],fRotable[8]
);
TGeoRotation *pRot = new TGeoRotation();
pRot->SetMatrix(fRotable);
TGeoCombiTrans *pTmp = new TGeoCombiTrans(*fGlobalTrans,*pRot);
// ne peut pas etre applique ici
// il faut differencier trans et rot dans la multi.
TGeoRotation rot_id;
rot_id.SetAngles(0.0,0.0,0.0);
TGeoCombiTrans c1;
c1.SetRotation(rot_id);
const Double_t *t = pTmp->GetTranslation();
c1.SetTranslation(t[0],t[1],t[2]);
TGeoCombiTrans c2;
c2.SetRotation(rot_id);
const Double_t *tt = fRefRot->GetTranslation();
c2.SetTranslation(tt[0],tt[1],tt[2]);
TGeoCombiTrans cc = c1 * c2 ;
TGeoCombiTrans c3;
c3.SetRotation(pTmp->GetRotation());
TGeoCombiTrans c4;
c4.SetRotation(fRefRot);
TGeoCombiTrans ccc = c3 * c4;
TGeoCombiTrans pGlobal;
pGlobal.SetRotation(ccc.GetRotation());
const Double_t *allt = cc.GetTranslation();
pGlobal.SetTranslation(allt[0],allt[1],allt[2]);
return ( new TGeoCombiTrans( pGlobal ) );
}else{
cout << "-E- R3BDetector::GetGlobalPosition() \
No. Ref. Transformation defined ! " << endl;
cout << "-E- R3BDetector::GetGlobalPosition() \
cannot create Local Transformation " << endl;
return NULL;
} //! fRefRot
} else {
// Lab Transf.
if ( ( fPhi == 0 ) && ( fTheta==0 ) && ( fPsi == 0 )
示例4: siPlaneXPosition
void EUTelGeometryTelescopeGeoDescription::translateSiPlane2TGeo(TGeoVolume* pvolumeWorld, int SensorId ) {
double xc, yc, zc; // volume center position
double alpha, beta, gamma;
double rotRef1, rotRef2, rotRef3, rotRef4;
std::stringstream strId;
strId << SensorId;
// Get sensor center position
xc = siPlaneXPosition( SensorId );
yc = siPlaneYPosition( SensorId );
zc = siPlaneZPosition( SensorId );
// Get sensor orientation
alpha = siPlaneXRotation( SensorId ); // in degrees !
beta = siPlaneYRotation( SensorId ); //
gamma = siPlaneZRotation( SensorId ); //
rotRef1 = siPlaneRotation1( SensorId );
rotRef2 = siPlaneRotation2( SensorId );
rotRef3 = siPlaneRotation3( SensorId );
rotRef4 = siPlaneRotation4( SensorId );
//We must check that the input is correct. Since this is a combination of initial rotations and reflections the determinate must be 1 or -1
float determinant = rotRef1*rotRef4 - rotRef2*rotRef3 ;
if(determinant==1 or determinant==-1) {
streamlog_out(DEBUG5) << "SensorID: " << SensorId << ". Determinant = " <<determinant <<" This is the correct determinate for this transformation." << std::endl;
} else {
streamlog_out(ERROR5) << "SensorID: " << SensorId << ". Determinant = " <<determinant << std::endl;
throw(lcio::Exception("The initial rotation and reflection matrix does not have determinant of 1 or -1. Gear file input must be wrong."));
}
//Create spatial TGeoTranslation object.
std::string stTranslationName = "matrixTranslationSensor";
stTranslationName.append( strId.str() );
TGeoTranslation* pMatrixTrans = new TGeoTranslation( stTranslationName.c_str(), xc, yc, zc );
//ALL clsses deriving from TGeoMatrix are not owned by the ROOT geometry manager, invoking RegisterYourself() transfers
//ownership and thus ROOT will clean up
pMatrixTrans->RegisterYourself();
//Create TGeoRotation object.
//Translations are of course just positional changes in the global frame.
//Note that each subsequent rotation is using the new coordinate system of the last transformation all the way back to the global frame.
//The way to think about this is that each rotation is the multiplication of the last rotation matrix by a new one.
//The order is:
//Integer Z rotation and reflections.
//Z rotations specified by in degrees.
//X rotations
//Y rotations
TGeoRotation* pMatrixRotRefCombined = new TGeoRotation();
//We have to ensure that we retain a right handed coordinate system, i.e. if we only flip the x or y axis, we have to also flip the z-axis. If we flip both we have to flip twice.
double integerRotationsAndReflections[9]={rotRef1,rotRef2,0,rotRef3,rotRef4,0,0,0, determinant};
pMatrixRotRefCombined->SetMatrix(integerRotationsAndReflections);
std::cout << "Rotating plane " << SensorId << " to gamma: " << gamma << std::endl;
pMatrixRotRefCombined->RotateZ(gamma);//Z Rotation (degrees)//This will again rotate a vector around z axis usign the right hand rule.
pMatrixRotRefCombined->RotateX(alpha);//X Rotations (degrees)//This will rotate a vector usign the right hand rule round the x-axis
pMatrixRotRefCombined->RotateY(beta);//Y Rotations (degrees)//Same again for Y axis
pMatrixRotRefCombined->RegisterYourself();//We must allow the matrix to be used by the TGeo manager.
// Combined translation and orientation
TGeoCombiTrans* combi = new TGeoCombiTrans( *pMatrixTrans, *pMatrixRotRefCombined );
//This is to print to screen the rotation and translation matrices used to transform from local to global frame.
streamlog_out(MESSAGE9) << "THESE MATRICES ARE USED TO TAKE A POINT IN THE LOCAL FRAME AND MOVE IT TO THE GLOBAL FRAME." << std::endl;
streamlog_out(MESSAGE9) << "SensorID: " << SensorId << " Rotation/Reflection matrix for this object." << std::endl;
const double* rotationMatrix = combi->GetRotationMatrix();
streamlog_out(MESSAGE9) << std::setw(10) <<rotationMatrix[0]<<" "<<rotationMatrix[1]<<" "<<rotationMatrix[2]<< std::endl;
streamlog_out(MESSAGE9) << std::setw(10) <<rotationMatrix[3]<<" "<<rotationMatrix[4]<<" "<<rotationMatrix[5]<< std::endl;
streamlog_out(MESSAGE9) << std::setw(10) <<rotationMatrix[6]<<" "<<rotationMatrix[7]<<" "<<rotationMatrix[8]<< std::endl;
//streamlog_out(MESSAGE9) << std::setw(10) <<rotationMatrix[0] << std::setw(10) <<rotationMatrix[1]<< std::setw(10) <<rotationMatrix[2]<< std::setw(10)<< std::endl<< std::endl;
//streamlog_out(MESSAGE9) << std::setw(10) <<rotationMatrix[3] << std::setw(10) <<rotationMatrix[4]<< std::setw(10) <<rotationMatrix[5]<< std::setw(10)<< std::endl<< std::endl;
//streamlog_out(MESSAGE9) << std::setw(10) <<rotationMatrix[6] << std::setw(10) <<rotationMatrix[7]<< std::setw(10) <<rotationMatrix[8]<< std::setw(10)<< std::endl<< std::endl;
const double* translationMatrix = combi->GetTranslation();
streamlog_out(MESSAGE9) << "SensorID: " << SensorId << " Translation vector for this object." << std::endl;
streamlog_out(MESSAGE9) << std::setw(10) <<translationMatrix[0] << std::setw(10) <<translationMatrix[1]<< std::setw(10) <<translationMatrix[2]<< std::setw(10)<< std::endl;
combi->RegisterYourself();
// Construct object medium. Required for radiation length determination
// assume SILICON, though all information except of radiation length is ignored
double a = 28.085500;
double z = 14.000000;
double density = 2.330000;
double radl = siPlaneRadLength( SensorId );
double absl = 45.753206;
std::string stMatName = "materialSensor";
stMatName.append( strId.str() );
TGeoMaterial* pMat = new TGeoMaterial( stMatName.c_str(), a, z, density, -radl, absl );
pMat->SetIndex( 1 );
// Medium: medium_Sensor_SILICON
int numed = 0; // medium number
double par[8];
par[0] = 0.000000; // isvol
par[1] = 0.000000; // ifield
par[2] = 0.000000; // fieldm
par[3] = 0.000000; // tmaxfd
par[4] = 0.000000; // stemax
par[5] = 0.000000; // deemax
par[6] = 0.000000; // epsil
par[7] = 0.000000; // stmin
std::string stMedName = "mediumSensor";
stMedName.append( strId.str() );
//.........这里部分代码省略.........