Logo ROOT   6.18/05
Reference Guide
projection_prescale.C
Go to the documentation of this file.
1/// \file
2/// \ingroup tutorial_eve7
3/// This example display projection prescale
4///
5/// \macro_code
6///
7
8
9#include <sstream>
10#include <iostream>
11
12#include "TGeoManager.h"
13#include "TGeoVolume.h"
14#include "TGeoMaterial.h"
15#include "TGeoMatrix.h"
16#include "TSystem.h"
17#include "TFile.h"
18#include "TRandom.h"
19
20#include <ROOT/REveGeoShape.hxx>
21#include <ROOT/REveTrans.hxx>
22#include <ROOT/REveScene.hxx>
23#include <ROOT/REveViewer.hxx>
24#include <ROOT/REveElement.hxx>
25#include <ROOT/REveManager.hxx>
26#include <ROOT/REvePointSet.hxx>
27#include <ROOT/REveLine.hxx>
28#include <ROOT/REveProjectionManager.hxx>
29#include <ROOT/REveProjectionBases.hxx>
30
31namespace REX = ROOT::Experimental;
32
33REX::REveManager *eveMng = nullptr;
34
35REX::REvePointSet* getPointSet(int npoints = 2, float s=2, int color=28)
36{
37 TRandom &r = *gRandom;
38
39 auto ps = new REX::REvePointSet("testPnts", "title", npoints);
40
41 for (Int_t i=0; i<npoints; ++i)
42 ps->SetNextPoint(r.Uniform(-s,s), r.Uniform(-s,s), r.Uniform(-s,s));
43
44 ps->SetMarkerColor(color);
45 ps->SetMarkerSize(3+r.Uniform(1, 2));
46 // ps->SetMarkerStyle(4);
47 return ps;
48}
49
50void makeProjectedViewsAndScene(REX::REveProjection::EPType_e type, bool scale)
51{
52 auto rPhiGeomScene = eveMng->SpawnNewScene(Form("Project%s Geo", scale ? "PreScaled" : ""));
53 auto rPhiEventScene = eveMng->SpawnNewScene(Form("Project%s Event", scale ? "PreScaled" : ""));
54
55 auto mngRhoPhi = new REX::REveProjectionManager(type);
56 if (scale) {
57 REX::REveProjection* p = mngRhoPhi->GetProjection();
58 p->AddPreScaleEntry(0, 0, 4); // r scale 4 from 0
59 p->AddPreScaleEntry(0, 45, 1); // r scale 1 from 45
60 p->AddPreScaleEntry(0, 310, 0.5);
61 p->SetUsePreScale(kTRUE);
62 }
63 auto rphiView = eveMng->SpawnNewViewer("Projected View", "");
64 rphiView->AddScene(rPhiGeomScene);
65 rphiView->AddScene(rPhiEventScene);
66
67 for (auto &ie : eveMng->GetGlobalScene()->RefChildren())
68 mngRhoPhi->ImportElements(ie, rPhiGeomScene);
69
70 for (auto &ie : eveMng->GetEventScene()->RefChildren())
71 mngRhoPhi->ImportElements(ie, rPhiEventScene);
72}
73
74TGeoNode* getNodeFromPath( TGeoNode* top, std::string path)
75{
76 TGeoNode* node = top;
77 istringstream f(path);
78 string s;
79 while (getline(f, s, '/'))
80 node = node->GetVolume()->FindNode(s.c_str());
81
82 return node;
83}
84
85
86void projection_prescale(std::string type = "RhPhi")
87{
88 eveMng = REX::REveManager::Create();
89
90 // static scene
92 auto geoManager = eveMng->GetGeometry("http://root.cern.ch/files/cms.root");
93 TGeoNode* top = geoManager->GetTopVolume()->FindNode("CMSE_1");
94 auto holder = new REX::REveElement("MUON");
95 eveMng->GetGlobalScene()->AddElement(holder);
96 auto n = getNodeFromPath(top, "MUON_1/MB_1");
97 auto m = new REX::REveGeoShape("MB_1");
98 m->SetShape(n->GetVolume()->GetShape());
99 m->SetMainColor(kOrange);
100 holder->AddElement(m);
101
102 auto bv = n->GetVolume();
103 for (int i = 1; i < 5; ++i ) {
104
105 auto n = bv->FindNode(Form("MBXC_%d",i));
106 auto gss = n->GetVolume()->GetShape();
107 auto b1s = new REX::REveGeoShape(Form("Arc %d", i));
108 b1s->InitMainTrans();
109 const double* move = n->GetMatrix()->GetTranslation();
110 b1s->RefMainTrans().SetFrom( *(n->GetMatrix()));
111 b1s->SetShape(gss);
112 b1s->SetMainColor(kBlue);
113 holder->AddElement(b1s);
114 }
115
116 // event scene
117 auto line = new REX::REveLine();
118 line->SetNextPoint(0, 0, 0);
119 float a = 300;
120 line->SetNextPoint(a, a, a);
121 eveMng->GetEventScene()->AddElement(line);
122
123 auto line2 = new REX::REveLine();
124 line2->SetNextPoint(0, 0, 0);
125 float b = 30;
126 line2->SetNextPoint(b, b+5, b);
127 line2->SetMainColor(kRed);
128 eveMng->GetEventScene()->AddElement(line2);
129
130 auto points = getPointSet(10, 30);
131 eveMng->GetEventScene()->AddElement(points);
132
133 // make scaled and plain projected views
134 if (type == "RPhi") {
135 makeProjectedViewsAndScene(REX::REveProjection::kPT_RPhi, true);
136 makeProjectedViewsAndScene(REX::REveProjection::kPT_RPhi, false);
137 }
138 else {
139 makeProjectedViewsAndScene(REX::REveProjection::kPT_RhoZ, true);
140 makeProjectedViewsAndScene(REX::REveProjection::kPT_RhoZ, false);
141 }
142
143 eveMng->Show();
144}
145
ROOT::R::TRInterface & r
Definition: Object.C:4
#define b(i)
Definition: RSha256.hxx:100
#define f(i)
Definition: RSha256.hxx:104
int Int_t
Definition: RtypesCore.h:41
const Bool_t kTRUE
Definition: RtypesCore.h:87
@ kRed
Definition: Rtypes.h:64
@ kOrange
Definition: Rtypes.h:65
@ kBlue
Definition: Rtypes.h:64
int type
Definition: TGX11.cxx:120
R__EXTERN TRandom * gRandom
Definition: TRandom.h:62
char * Form(const char *fmt,...)
point * points
Definition: X3DBuffer.c:22
static Bool_t SetCacheFileDir(ROOT::Internal::TStringView cacheDir, Bool_t operateDisconnected=kTRUE, Bool_t forceCacheread=kFALSE)
Definition: TFile.h:316
A node represent a volume positioned inside another.They store links to both volumes and to the TGeoM...
Definition: TGeoNode.h:41
TGeoVolume * GetVolume() const
Definition: TGeoNode.h:94
Int_t FindNode(const TGeoNode *node, Int_t level)
Search for a node within the branch of this one.
Definition: TGeoNode.cxx:412
TGeoNode * FindNode(const char *name) const
search a daughter inside the list of nodes
This is the base class for the ROOT Random number generators.
Definition: TRandom.h:27
TLine * line
TGeoNode * getNodeFromPath(TGeoNode *top, std::string path)
REX::REveManager * eveMng
void makeProjectedViewsAndScene(REX::REveProjection::EPType_e type, bool scale)
void projection_prescale(std::string type="RhPhi")
REX::REvePointSet * getPointSet(int npoints=2, float s=2, int color=28)
REX::REveScene * rPhiGeomScene
Definition: event_demo.C:37
REX::REveScene * rPhiEventScene
Definition: event_demo.C:37
REX::REveViewer * rphiView
Definition: event_demo.C:39
REX::REveProjectionManager * mngRhoPhi
Definition: event_demo.C:35
const Int_t n
Definition: legend1.C:16
static constexpr double s
static constexpr double ps
auto * m
Definition: textangle.C:8
auto * a
Definition: textangle.C:12