#include #include #include #include #include #include #include #include #include #include #include void computeCorners( int symmetryOrder, double closestDistanceToIp, double phi0, std::vector > &coordinates ) { if (symmetryOrder > 2) { const Double_t pi(3.1415927); const Double_t x0(-1. * closestDistanceToIp * tan(pi / Double_t(symmetryOrder))); const Double_t y0(closestDistanceToIp); for (int i = 0; i <= symmetryOrder; ++i) { Double_t theta = 0.f; theta = phi0 + (2 * pi * Double_t(i) / Double_t(symmetryOrder)); Double_t x = x0 * cos(theta) + y0 * sin(theta); Double_t y = y0 * cos(theta) - x0 * sin(theta); coordinates.push_back( std::pair( x, y ) ); } } } TGeoVolume* makePolygoneTube( std::string name, int symmetryOrder, double closestDistanceToIp, double phi0, double halfLength, TGeoMedium* medium = 0 ) { std::vector > vertices; computeCorners( symmetryOrder, closestDistanceToIp, phi0, vertices ); const Int_t nvertices = vertices.size(); Double_t* x = new Double_t[nvertices]; Double_t* y = new Double_t[nvertices]; int index = 0; for( std::vector< std::pair >::iterator itCoord = vertices.begin(), itCoordEnd = vertices.end(); itCoord != itCoordEnd; ++itCoord ) { x[index] = (*itCoord).first; y[index] = (*itCoord).second; ++index; } Int_t nz = 2; TGeoXtru *xtru = new TGeoXtru(2); // TGeoXtru *xtru = new TGeoXtru(5); xtru->DefinePolygon(nvertices,x,y); Double_t z0 = -halfLength, x0 = 0, y0 = 0; Double_t z1 = halfLength, x1 = 0, y1 = 0; Double_t scale0 = 1.0, scale1 = 0.99; xtru->DefineSection(0, z0, x0, y0, scale0); // Z position, offset and scale for first section xtru->DefineSection(1, z1, x1, y1, scale0); // -''- go forward // xtru->DefineSection(2, z1, x1, y1, scale1); // -''- go inward // xtru->DefineSection(3, z0, x0, y0, scale1); // -''- go backward // xtru->DefineSection(4, z0, x0, y0, scale0); // -''- go outward TGeoVolume* xtruVol = new TGeoVolume( name.c_str(), xtru, medium); delete[] x; delete[] y; return xtruVol; } void myGeoEve() { //--- Definition of a simple geometry gSystem->Load("libGeom"); TGeoManager *geom = new TGeoManager("GeomTest", "test drawing simple detector"); Int_t i; // //--- define some materials TGeoMaterial *matVacuum = new TGeoMaterial("Vacuum", 0,0,0); TGeoMaterial *matAl = new TGeoMaterial("Al", 26.98,13,2.7); // // //--- define some media TGeoMedium *Vacuum = new TGeoMedium("Vacuum",1, matVacuum); TGeoMedium *Al = new TGeoMedium("Aluminium",2, matAl); //--- make the top container volume TGeoVolume *top = geom->MakeBox("TOP", Vacuum, 1000., 1000., 100.); geom->SetTopVolume(top); Int_t symInner = 8; Int_t symOuter = 12; TGeoVolume* plate = geom->MakeBox( "box", Al, 20, 40, 5 ); TGeoVolume* xtruVolInner = makePolygoneTube( "inner", symInner, 30., 0.0, 70., Al ); TGeoVolume* xtruVolOuter = makePolygoneTube( "outer", symOuter, 50., 0.3, 70., Al ); TGeoVolume* tube = geom->MakeTube("tube", Al, 60, 70, 50 ); xtruVolInner->SetLineColor(kRed); xtruVolOuter->SetLineColor(kBlue); xtruVolInner->SetTransparency(0); xtruVolOuter->SetTransparency(0); top->AddNode( xtruVolInner, 0, new TGeoTranslation(0,0,0)); top->AddNode( xtruVolOuter, 1, new TGeoTranslation(0,0,0)); top->AddNode( tube, 2, new TGeoTranslation(0,0,0)); // top->AddNode( plate, 2, new TGeoTranslation(30,20,-20)); //--- close the geometry geom->CloseGeometry(); TEveManager::Create(); TGeoNode* node = gGeoManager->GetTopNode(); TEveGeoTopNode* en = new TEveGeoTopNode(gGeoManager, node); en->SetVisLevel(4); en->GetNode()->GetVolume()->SetVisibility(kFALSE); gEve->AddGlobalElement(en); gEve->Redraw3D(kTRUE); }