Logo ROOT  
Reference Guide
 
Loading...
Searching...
No Matches
assembly.C File Reference

Detailed Description

Geometry detector assembly example.

␖{bĂU

void assembly()
{
//--- Definition of a simple geometry
gSystem->Load("libGeom");
auto geom = new TGeoManager("Assemblies", "Geometry using assemblies");
Int_t i;
//--- define some materials
auto matVacuum = new TGeoMaterial("Vacuum", 0, 0, 0);
auto matAl = new TGeoMaterial("Al", 26.98, 13, 2.7);
//--- define some media
auto Vacuum = new TGeoMedium("Vacuum", 1, matVacuum);
auto Al = new TGeoMedium("Aluminium", 2, matAl);
//--- make the top container volume
auto top = geom->MakeBox("TOP", Vacuum, 1000., 1000., 100.);
geom->SetTopVolume(top);
// Make the elementary assembly of the whole structure
auto tplate = new TGeoVolumeAssembly("TOOTHPLATE");
Int_t ntooth = 5;
Double_t xplate = 25;
Double_t yplate = 50;
Double_t xtooth = 10;
Double_t ytooth = 0.5 * yplate / ntooth;
Double_t dshift = 2. * xplate + xtooth;
Double_t xt, yt;
auto plate = geom->MakeBox("PLATE", Al, xplate, yplate, 1);
plate->SetLineColor(kBlue);
auto tooth = geom->MakeBox("TOOTH", Al, xtooth, ytooth, 1);
tooth->SetLineColor(kBlue);
tplate->AddNode(plate, 1);
for (i = 0; i < ntooth; i++) {
xt = xplate + xtooth;
yt = -yplate + (4 * i + 1) * ytooth;
tplate->AddNode(tooth, i + 1, new TGeoTranslation(xt, yt, 0));
xt = -xplate - xtooth;
yt = -yplate + (4 * i + 3) * ytooth;
tplate->AddNode(tooth, ntooth + i + 1, new TGeoTranslation(xt, yt, 0));
}
auto rot1 = new TGeoRotation();
rot1->RotateX(90);
// Make a hexagone cell out of 6 toothplates. These can zip togeather
// without generating overlaps (they are self-contained)
TGeoVolume *cell = new TGeoVolumeAssembly("CELL");
for (i = 0; i < 6; i++) {
Double_t phi = 60. * i;
Double_t phirad = phi * TMath::DegToRad();
Double_t xp = dshift * TMath::Sin(phirad);
Double_t yp = -dshift * TMath::Cos(phirad);
rot = new TGeoRotation(*rot1);
rot->RotateZ(phi);
cell->AddNode(tplate, i + 1, new TGeoCombiTrans(xp, yp, 0, rot));
}
// Make a row as an assembly of cells, then combine rows in a honeycomb
// structure. This again works without any need to define rows as
// "overlapping"
auto row = new TGeoVolumeAssembly("ROW");
Int_t ncells = 5;
for (i = 0; i < ncells; i++) {
Double_t ycell = (2 * i + 1) * (dshift + 10);
row->AddNode(cell, ncells + i + 1, new TGeoTranslation(0, ycell, 0));
row->AddNode(cell, ncells - i, new TGeoTranslation(0, -ycell, 0));
}
Double_t dxrow = 3. * (dshift + 10.) * TMath::Tan(30. * TMath::DegToRad());
Double_t dyrow = dshift + 10.;
Int_t nrows = 5;
for (i = 0; i < nrows; i++) {
Double_t xrow = 0.5 * (2 * i + 1) * dxrow;
Double_t yrow = 0.5 * dyrow;
if ((i % 2) == 0)
yrow = -yrow;
top->AddNode(row, nrows + i + 1, new TGeoTranslation(xrow, yrow, 0));
top->AddNode(row, nrows - i, new TGeoTranslation(-xrow, -yrow, 0));
}
//--- close the geometry
geom->CloseGeometry();
auto node = gGeoManager->GetTopNode();
auto en = new TEveGeoTopNode(gGeoManager, node);
en->SetVisLevel(4);
en->GetNode()->GetVolume()->SetVisibility(kFALSE);
en->ExpandIntoListTreesRecursively();
en->Save("assembly.root", "Assembly");
}
int Int_t
Definition RtypesCore.h:45
constexpr Bool_t kFALSE
Definition RtypesCore.h:94
double Double_t
Definition RtypesCore.h:59
constexpr Bool_t kTRUE
Definition RtypesCore.h:93
@ kBlue
Definition Rtypes.h:66
R__EXTERN TEveManager * gEve
R__EXTERN TGeoManager * gGeoManager
R__EXTERN TSystem * gSystem
Definition TSystem.h:561
A wrapper over a TGeoNode, possibly displaced with a global trasformation stored in TEveElement.
Definition TEveGeoNode.h:90
void AddGlobalElement(TEveElement *element, TEveElement *parent=nullptr)
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)
Class describing rotation + translation.
Definition TGeoMatrix.h:317
The manager class for any TGeo geometry.
Definition TGeoManager.h:44
TGeoNode * GetTopNode() const
Base class describing materials.
Media are used to store properties related to tracking and which are useful only when using geometry ...
Definition TGeoMedium.h:23
Class describing rotations.
Definition TGeoMatrix.h:168
void RotateZ(Double_t angle) override
Rotate about Z axis of the master frame with angle expressed in degrees.
Class describing translations.
Definition TGeoMatrix.h:116
Volume assemblies.
Definition TGeoVolume.h:316
TGeoVolume, TGeoVolumeMulti, TGeoVolumeAssembly are the volume classes.
Definition TGeoVolume.h:43
virtual TGeoNode * AddNode(TGeoVolume *vol, Int_t copy_no, TGeoMatrix *mat=nullptr, Option_t *option="")
Add a TGeoNode to the list of nodes.
virtual int Load(const char *module, const char *entry="", Bool_t system=kFALSE)
Load a shared library.
Definition TSystem.cxx:1857
constexpr Double_t DegToRad()
Conversion from degree to radian: .
Definition TMath.h:79
Double_t Cos(Double_t)
Returns the cosine of an angle of x radians.
Definition TMath.h:598
Double_t Sin(Double_t)
Returns the sine of an angle of x radians.
Definition TMath.h:592
Double_t Tan(Double_t)
Returns the tangent of an angle of x radians.
Definition TMath.h:604
Author
Andrei Gheata

Definition in file assembly.C.