Logo ROOT  
Reference Guide
 
Loading...
Searching...
No Matches
geom_cms.C
Go to the documentation of this file.
1#include <sstream>
2#include <iostream>
3
4#include "TGeoManager.h"
5#include "TGeoVolume.h"
6#include "TGeoMaterial.h"
7#include "TGeoMatrix.h"
8#include "TSystem.h"
9#include "TFile.h"
10#include <ROOT/REveGeoShape.hxx>
11#include <ROOT/REveTrans.hxx>
12#include <ROOT/REveScene.hxx>
13#include <ROOT/REveViewer.hxx>
14#include <ROOT/REveElement.hxx>
15#include <ROOT/REveManager.hxx>
16
17namespace REX = ROOT::Experimental;
18
20{
21 auto gss = n->GetVolume()->GetShape();
22 auto b1s = new REX::REveGeoShape(n->GetName());
23 b1s->InitMainTrans();
24 b1s->RefMainTrans().SetFrom(trans.Array());
25 b1s->SetShape(gss);
26 b1s->SetMainColor(kCyan);
27 holder->AddElement(b1s);
28}
29
30void filterChildNodes(TGeoNode *pn, REX::REveTrans &trans, REX::REveElement *holder, std::string mat, int maxlevel,
31 int level)
32{
33 ++level;
34 if (level > maxlevel)
35 return;
36
37 for (int i = 0; i < pn->GetNdaughters(); ++i) {
38 TGeoNode *n = pn->GetDaughter(i);
39 TGeoMaterial *material = n->GetVolume()->GetMaterial();
40 REX::REveTrans ctrans;
41 ctrans.SetFrom(trans.Array());
42
43 {
44 TGeoMatrix *gm = n->GetMatrix();
45 const Double_t *rm = gm->GetRotationMatrix();
46 const Double_t *tv = gm->GetTranslation();
48 t(1, 1) = rm[0];
49 t(1, 2) = rm[1];
50 t(1, 3) = rm[2];
51 t(2, 1) = rm[3];
52 t(2, 2) = rm[4];
53 t(2, 3) = rm[5];
54 t(3, 1) = rm[6];
55 t(3, 2) = rm[7];
56 t(3, 3) = rm[8];
57 t(1, 4) = tv[0];
58 t(2, 4) = tv[1];
59 t(3, 4) = tv[2];
60 ctrans *= t;
61 }
62
63 std::string mn = material->GetName();
64 if (mn == mat) {
65 n->ls();
66 makeEveGeoShape(n, ctrans, holder);
67 }
68 filterChildNodes(n, ctrans, holder, mat, maxlevel, level);
69 }
70}
71
72TGeoNode *getNodeFromPath(TGeoNode *top, std::string path)
73{
74 TGeoNode *node = top;
75 istringstream f(path);
76 string s;
77 while (getline(f, s, '/'))
78 node = node->GetVolume()->FindNode(s.c_str());
79
80 return node;
81}
82
84{
85
86 auto eveMng = REX::REveManager::Create();
87
89
90 auto geoManager = eveMng->GetGeometry("http://root.cern/files/cms.root");
91 TGeoNode *top = geoManager->GetTopVolume()->FindNode("CMSE_1");
92
93 // tracker
94 {
95 auto holder = new REX::REveElement("Tracker");
97 TGeoNode *n = getNodeFromPath(top, "TRAK_1/SVTX_1/TGBX_1/GAW1_1");
98 REX::REveTrans trans;
99 std::string material = "TOB_Silicon";
100 filterChildNodes(n, trans, holder, material, 6, 0);
101 }
102
103 // muon
104 {
105 auto holder = new REX::REveElement("MUON");
106 eveMng->GetGlobalScene()->AddElement(holder);
107
108 auto n = getNodeFromPath(top, "MUON_1/MB_1");
109
110 std::string material = "M_B_Air";
111 REX::REveTrans trans;
112 filterChildNodes(n, trans, holder, material, 1, 0);
113
114 auto bv = n->GetVolume();
115 for (int i = 1; i < 5; ++i) {
116 auto n = bv->FindNode(Form("MBXC_%d", i));
117 auto gss = n->GetVolume()->GetShape();
118 auto b1s = new REX::REveGeoShape(Form("Arc %d", i));
119 b1s->InitMainTrans();
120 const double *move = n->GetMatrix()->GetTranslation();
121 b1s->RefMainTrans().SetFrom(*(n->GetMatrix()));
122 b1s->SetShape(gss);
123 b1s->SetMainColor(kBlue);
124 holder->AddElement(b1s);
125 }
126 }
127
128 eveMng->Show();
129}
#define f(i)
Definition RSha256.hxx:104
double Double_t
Definition RtypesCore.h:59
@ kCyan
Definition Rtypes.h:66
@ kBlue
Definition Rtypes.h:66
char * Form(const char *fmt,...)
Formats a string in a circular formatting buffer.
Definition TString.cxx:2489
virtual void AddElement(REveElement *el)
Add el to the list of children.
TGeoManager * GetGeometry(const TString &filename)
Get geometry with given filename.
REveScene * GetGlobalScene() const
void Show(const RWebDisplayArgs &args="")
Show eve manager in specified browser.
void SetFrom(Double_t *carr)
static Bool_t SetCacheFileDir(std::string_view cacheDir, Bool_t operateDisconnected=kTRUE, Bool_t forceCacheread=kFALSE)
Sets the directory where to locally stage/cache remote files.
Definition TFile.cxx:4623
Base class describing materials.
Geometrical transformation package.
Definition TGeoMatrix.h:38
virtual const Double_t * GetTranslation() const =0
virtual const Double_t * GetRotationMatrix() const =0
A node represent a volume positioned inside another.They store links to both volumes and to the TGeoM...
Definition TGeoNode.h:39
TGeoVolume * GetVolume() const
Definition TGeoNode.h:99
Int_t GetNdaughters() const
Definition TGeoNode.h:91
TGeoNode * GetDaughter(Int_t ind) const
Definition TGeoNode.h:83
Int_t FindNode(const TGeoNode *node, Int_t level)
Search for a node within the branch of this one.
Definition TGeoNode.cxx:411
TGeoNode * FindNode(const char *name) const
search a daughter inside the list of nodes
const char * GetName() const override
Returns name of object.
Definition TNamed.h:47
ROOT::Experimental::REveManager * eveMng
TGeoNode * getNodeFromPath(TGeoNode *top, std::string path)
Definition geom_cms.C:72
void makeEveGeoShape(TGeoNode *n, REX::REveTrans &trans, REX::REveElement *holder)
Definition geom_cms.C:19
void filterChildNodes(TGeoNode *pn, REX::REveTrans &trans, REX::REveElement *holder, std::string mat, int maxlevel, int level)
Definition geom_cms.C:30
void geom_cms()
Definition geom_cms.C:83
const Int_t n
Definition legend1.C:16