Logo ROOT   6.30.04
Reference Guide
 All Namespaces Files Pages
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 
16 void 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 
100  TEveManager::Create();
101 
102  auto node = gGeoManager->GetTopNode();
103  auto en = new TEveGeoTopNode(gGeoManager, node);
104  en->SetVisLevel(4);
105  en->GetNode()->GetVolume()->SetVisibility(kFALSE);
106 
107  gEve->AddGlobalElement(en);
108 
109  gEve->Redraw3D(kTRUE);
110 
111  en->ExpandIntoListTreesRecursively();
112  en->Save("assembly.root", "Assembly");
113 }