Logo ROOT  
Reference Guide
assembly.C
Go to the documentation of this file.
1/// \file
2/// \ingroup tutorial_eve
3/// Geometry detector assembly example
4///
5/// Modified to save the assembly as shape-extract.
6/// 1. Run `root assembly.C`
7/// This will produce assembly.root containing the extract.
8/// 2. Display the assembly as:
9/// `root show_extract.C("assembly.root")`
10///
11/// \image html eve_assembly.png
12/// \macro_code
13///
14/// \author Andrei Gheata
15
16void assembly()
17{
18//--- Definition of a simple geometry
19 gSystem->Load("libGeom");
20 auto geom = new TGeoManager("Assemblies",
21 "Geometry using assemblies");
22 Int_t i;
23 //--- define some materials
24 auto matVacuum = new TGeoMaterial("Vacuum", 0,0,0);
25 auto matAl = new TGeoMaterial("Al", 26.98,13,2.7);
26 //--- define some media
27 auto Vacuum = new TGeoMedium("Vacuum",1, matVacuum);
28 auto Al = new TGeoMedium("Aluminium",2, matAl);
29
30 //--- make the top container volume
31 auto top = geom->MakeBox("TOP", Vacuum, 1000., 1000., 100.);
32 geom->SetTopVolume(top);
33
34 // Make the elementary assembly of the whole structure
35 auto tplate = new TGeoVolumeAssembly("TOOTHPLATE");
36
37 Int_t ntooth = 5;
38 Double_t xplate = 25;
39 Double_t yplate = 50;
40 Double_t xtooth = 10;
41 Double_t ytooth = 0.5*yplate/ntooth;
42 Double_t dshift = 2.*xplate + xtooth;
43 Double_t xt,yt;
44
45 auto plate = geom->MakeBox("PLATE", Al, xplate,yplate,1);
46 plate->SetLineColor(kBlue);
47 auto tooth = geom->MakeBox("TOOTH", Al, xtooth,ytooth,1);
48 tooth->SetLineColor(kBlue);
49 tplate->AddNode(plate,1);
50 for (i=0; i<ntooth; i++) {
51 xt = xplate+xtooth;
52 yt = -yplate + (4*i+1)*ytooth;
53 tplate->AddNode(tooth, i+1, new TGeoTranslation(xt,yt,0));
54 xt = -xplate-xtooth;
55 yt = -yplate + (4*i+3)*ytooth;
56 tplate->AddNode(tooth, ntooth+i+1, new TGeoTranslation(xt,yt,0));
57 }
58
59 auto rot1 = new TGeoRotation();
60 rot1->RotateX(90);
61 TGeoRotation *rot;
62 // Make a hexagone cell out of 6 toothplates. These can zip togeather
63 // without generating overlaps (they are self-contained)
64 TGeoVolume *cell = new TGeoVolumeAssembly("CELL");
65 for (i=0; i<6; i++) {
66 Double_t phi = 60.*i;
67 Double_t phirad = phi*TMath::DegToRad();
68 Double_t xp = dshift*TMath::Sin(phirad);
69 Double_t yp = -dshift*TMath::Cos(phirad);
70 rot = new TGeoRotation(*rot1);
71 rot->RotateZ(phi);
72 cell->AddNode(tplate,i+1,new TGeoCombiTrans(xp,yp,0,rot));
73 }
74
75 // Make a row as an assembly of cells, then combine rows in a honeycomb
76 // structure. This again works without any need to define rows as
77 // "overlapping"
78 auto row = new TGeoVolumeAssembly("ROW");
79 Int_t ncells = 5;
80 for (i=0; i<ncells; i++) {
81 Double_t ycell = (2*i+1)*(dshift+10);
82 row->AddNode(cell, ncells+i+1, new TGeoTranslation(0,ycell,0));
83 row->AddNode(cell,ncells-i,new TGeoTranslation(0,-ycell,0));
84 }
85
86 Double_t dxrow = 3.*(dshift+10.)*TMath::Tan(30.*TMath::DegToRad());
87 Double_t dyrow = dshift+10.;
88 Int_t nrows = 5;
89 for (i=0; i<nrows; i++) {
90 Double_t xrow = 0.5*(2*i+1)*dxrow;
91 Double_t yrow = 0.5*dyrow;
92 if ((i%2)==0) yrow = -yrow;
93 top->AddNode(row, nrows+i+1, new TGeoTranslation(xrow,yrow,0));
94 top->AddNode(row, nrows-i, new TGeoTranslation(-xrow,-yrow,0));
95 }
96
97 //--- close the geometry
98 geom->CloseGeometry();
99
101
102 auto node = gGeoManager->GetTopNode();
103 auto en = new TEveGeoTopNode(gGeoManager, node);
104 en->SetVisLevel(4);
105 en->GetNode()->GetVolume()->SetVisibility(kFALSE);
106
108
110
111 en->ExpandIntoListTreesRecursively();
112 en->Save("assembly.root", "Assembly");
113}
int Int_t
Definition: RtypesCore.h:41
const Bool_t kFALSE
Definition: RtypesCore.h:88
double Double_t
Definition: RtypesCore.h:55
const Bool_t kTRUE
Definition: RtypesCore.h:87
@ kBlue
Definition: Rtypes.h:64
R__EXTERN TEveManager * gEve
Definition: TEveManager.h:243
R__EXTERN TGeoManager * gGeoManager
Definition: TGeoManager.h:601
R__EXTERN TSystem * gSystem
Definition: TSystem.h:560
A wrapper over a TGeoNode, possibly displaced with a global trasformation stored in TEveElement.
Definition: TEveGeoNode.h:93
void AddGlobalElement(TEveElement *element, TEveElement *parent=0)
Add a global element, i.e.
static TEveManager * Create(Bool_t map_window=kTRUE, Option_t *opt="FIV")
If global TEveManager* gEve is not set initialize it.
void Redraw3D(Bool_t resetCameras=kFALSE, Bool_t dropLogicals=kFALSE)
Definition: TEveManager.h:168
Class describing rotation + translation.
Definition: TGeoMatrix.h:292
The manager class for any TGeo geometry.
Definition: TGeoManager.h:43
TGeoNode * GetTopNode() const
Definition: TGeoManager.h:532
Base class describing materials.
Definition: TGeoMaterial.h:31
Media are used to store properties related to tracking and which are useful only when using geometry ...
Definition: TGeoMedium.h:24
Class describing rotations.
Definition: TGeoMatrix.h:175
virtual void RotateZ(Double_t angle)
Rotate about Z axis of the master frame with angle expressed in degrees.
Class describing translations.
Definition: TGeoMatrix.h:122
Volume assemblies.
Definition: TGeoVolume.h:301
TGeoVolume, TGeoVolumeMulti, TGeoVolumeAssembly are the volume classes.
Definition: TGeoVolume.h:47
virtual void AddNode(TGeoVolume *vol, Int_t copy_no, TGeoMatrix *mat=0, Option_t *option="")
Add a TGeoNode to the list of nodes.
Definition: TGeoVolume.cxx:931
virtual int Load(const char *module, const char *entry="", Bool_t system=kFALSE)
Load a shared library.
Definition: TSystem.cxx:1845
constexpr Double_t DegToRad()
Conversion from degree to radian:
Definition: TMath.h:82
Double_t Cos(Double_t)
Definition: TMath.h:631
Double_t Sin(Double_t)
Definition: TMath.h:627
Double_t Tan(Double_t)
Definition: TMath.h:635