Logo ROOT  
Reference Guide
event_demo.C
Go to the documentation of this file.
1/// \file
2/// \ingroup tutorial_eve7
3/// This example display geometry, tracks and hits in web browser
4///
5/// \macro_code
6///
7
8#include <vector>
9#include <string>
10#include <iostream>
11
12#include "TClass.h"
13#include "TRandom.h"
14#include "TGeoTube.h"
15#include "TGeoSphere.h"
16#include "TParticle.h"
17#include "TApplication.h"
18#include "TMatrixDSym.h"
19#include "TVector.h"
20#include "TMatrixDEigen.h"
21
22#include <ROOT/REveGeoShape.hxx>
23#include <ROOT/REveScene.hxx>
24#include <ROOT/REveViewer.hxx>
25#include <ROOT/REveElement.hxx>
26#include <ROOT/REveCompound.hxx>
27#include <ROOT/REveManager.hxx>
28#include <ROOT/REveUtil.hxx>
29#include <ROOT/REveGeoShape.hxx>
32#include <ROOT/REvePointSet.hxx>
33#include <ROOT/REveJetCone.hxx>
34#include <ROOT/REveTrans.hxx>
35#include <ROOT/REveTrack.hxx>
37
38namespace REX = ROOT::Experimental;
39
40// globals
48
49const Double_t kR_min = 240;
50const Double_t kR_max = 250;
51const Double_t kZ_d = 300;
52
53
54REX::REvePointSet *getPointSet(int npoints = 2, float s=2, int color=28)
55{
56 TRandom &r = *gRandom;
57
58 auto ps = new REX::REvePointSet("fu", "", npoints);
59
60 for (Int_t i=0; i<npoints; ++i)
61 ps->SetNextPoint(r.Uniform(-s,s), r.Uniform(-s,s), r.Uniform(-s,s));
62
63 ps->SetMarkerColor(color);
64 ps->SetMarkerSize(8 + r.Uniform(1, 8));
65 ps->SetMarkerStyle(4);
66 return ps;
67}
68
70{
72
73 auto pntHolder = new REX::REveCompound("Hits");
74
75 auto ps1 = getPointSet(20, 100);
76 ps1->SetName("Points_1");
77 ps1->SetTitle("Points_1 title"); // used as tooltip
78
79 pntHolder->AddElement(ps1);
80
81 auto ps2 = getPointSet(10, 200, 4);
82 ps2->SetName("Points_2");
83 ps2->SetTitle("Points_2 title"); // used as tooltip
84 ps2->SetAlwaysSecSelect(true);
85 pntHolder->AddElement(ps2);
86
87 event->AddElement(pntHolder);
88}
89
91{
92 TRandom &r = *gRandom;
93
95 auto prop = new REX::REveTrackPropagator();
96 prop->SetMagFieldObj(new REX::REveMagFieldDuo(350, 3.5, -2.0));
97 prop->SetMaxR(300);
98 prop->SetMaxZ(600);
99 prop->SetMaxOrbs(6);
100
101 auto trackHolder = new REX::REveCompound("Tracks");
102
103 double v = 0.2;
104 double m = 5;
105
106 int N_Tracks = 10 + r.Integer(20);
107 for (int i = 0; i < N_Tracks; i++)
108 {
109 TParticle p;
110
111 int pdg = 11 * (r.Integer(2) > 0 ? 1 : -1);
112 p.SetPdgCode(pdg);
113
114 p.SetProductionVertex(r.Uniform(-v,v), r.Uniform(-v,v), r.Uniform(-v,v), 1);
115 p.SetMomentum(r.Uniform(-m,m), r.Uniform(-m,m), r.Uniform(-m,m)*r.Uniform(1, 3), 1);
116 auto track = new REX::REveTrack(&p, 1, prop);
117 track->MakeTrack();
118 if (i % 4 == 3) track->SetLineStyle(2); // enabled dashed style for some tracks
119 track->SetMainColor(kBlue);
120 track->SetName(Form("RandomTrack_%d", i));
121 track->SetTitle(Form("RandomTrack_%d title", i)); // used as tooltip
122 trackHolder->AddElement(track);
123 }
124
125 event->AddElement(trackHolder);
126}
127
129{
130 TRandom &r = *gRandom;
131
133 auto jetHolder = new REX::REveCompound("Jets");
134
135 int N_Jets = 5 + r.Integer(5);
136 for (int i = 0; i < N_Jets; i++)
137 {
138 auto jet = new REX::REveJetCone(Form("Jet_%d", i));
139 jet->SetTitle(Form("Jet_%d\n pT = %.2f", i, r.Uniform(1, 40))); // used as tooltip
140 jet->SetCylinder(2*kR_max, 2*kZ_d);
141 jet->AddEllipticCone(r.Uniform(-3.5, 3.5), r.Uniform(0, TMath::TwoPi()),
142 r.Uniform(0.02, 0.2), r.Uniform(0.02, 0.3));
143 jet->SetFillColor(kPink - 8);
144 jet->SetLineColor(kBlack);
145
146 jetHolder->AddElement(jet);
147 }
148 event->AddElement(jetHolder);
149}
150
152{
153 addPoints();
154 addTracks();
155 addJets();
156}
157
159{
160 auto b1 = new REX::REveGeoShape("Barrel 1");
161 b1->SetShape(new TGeoTube(kR_min, kR_max, kZ_d));
162 b1->SetMainColor(kCyan);
163 b1->SetNSegments(80);
165
166 // Debug of surface fill in RPhi (index buffer screwed).
167 // b1->SetNSegments(3);
168 b1->SetNSegments(40);
169}
170
171
173{
174 // project RhoPhi
175 rPhiGeomScene = eveMng->SpawnNewScene("RPhi Geometry","RPhi");
176 rPhiEventScene = eveMng->SpawnNewScene("RPhi Event Data","RPhi");
177
179
180 rphiView = eveMng->SpawnNewViewer("RPhi View", "");
184
185 // ----------------------------------------------------------------
186
187 rhoZGeomScene = eveMng->SpawnNewScene("RhoZ Geometry", "RhoZ");
188 rhoZEventScene = eveMng->SpawnNewScene("RhoZ Event Data","RhoZ");
189
191
192 rhoZView = eveMng->SpawnNewViewer("RhoZ View", "");
196}
197
198void projectScenes(bool geomp, bool eventp)
199{
200 if (geomp)
201 {
202 for (auto &ie : eveMng->GetGlobalScene()->RefChildren())
203 {
208 }
209 }
210 if (eventp)
211 {
212 int depth = 50;
213 for (auto &ie : eveMng->GetEventScene()->RefChildren())
214 {
217 mngRhoZ ->SetCurrentDepth(depth);
219 depth -= 10;
220 }
221 }
222
223 // auto t0 = eveMng->GetEventScene()->FindChild("Tracks")->FirstChild();
224 // printf("t0=%p, %s %s\n", t0, t0->GetElementName(), t0->IsA()->GetName());
225 // dynamic_cast<REX::REveTrack*>(t0)->Print("all");
226
227 // auto t1 = rPhiEventScene->FindChild("Tracks [P]")->FirstChild();
228 // printf("t1=%p, %s %s\n", t1, t1->GetElementName(), t1->IsA()->GetName());
229 // dynamic_cast<REX::REveTrack*>(t1)->Print("all");
230}
231
232//==============================================================================
233
234class EventManager : public REX::REveElement
235{
236private:
237 bool fAutoplay{false};
238 int fPlayDelay{10};
239 int fCount{0};
240
241 std::chrono::time_point<std::chrono::system_clock> fPrevTime;
242 std::chrono::duration<double> fDeltaTime{1};
243
244 std::thread* fTimerThread{nullptr};
245 std::mutex fMutex;
246 std::condition_variable fCV;
247
248
249public:
251 {
252 std::chrono::milliseconds ms(100);
253 fDeltaTime = ms;
254 }
255
256 virtual ~EventManager() {}
257
259 {
260 auto scene = eveMng->GetEventScene();
261 scene->DestroyElements();
263 projectScenes(false, true);
264 // if (++fCount % 10 == 0) printf("At event %d\n", fCount);
265 }
266
268 {
269 while (true) {
270 bool autoplay;
271 {
272 std::unique_lock<std::mutex> lock{fMutex};
273 if (!fAutoplay) {
274 // printf("exit thread pre wait\n");
275 return;
276 }
277 if (fCV.wait_for(lock, fDeltaTime) != std::cv_status::timeout) {
278 printf("autoplay not timed out \n");
279 if (!fAutoplay) {
280 printf("exit thread post wait\n");
281 return;
282 } else {
283 continue;
284 }
285 }
286 autoplay = fAutoplay;
287 }
288 if (autoplay) {
289 REX::REveManager::ChangeGuard ch;
290 NextEvent();
291 } else {
292 return;
293 }
294 }
295 }
296
297 void Autoplay()
298 {
299 static std::mutex autoplay_mutex;
300 std::unique_lock<std::mutex> aplock{autoplay_mutex};
301 {
302 std::unique_lock<std::mutex> lock{fMutex};
304 if (fAutoplay) {
305 if (fTimerThread) {
306 fTimerThread->join();
307 delete fTimerThread;
308 fTimerThread = nullptr;
309 }
310 NextEvent();
311 fTimerThread = new std::thread{[this] { autoplay_scheduler(); }};
312 } else {
313 fCV.notify_all();
314 }
315 }
316 }
317
318 virtual void QuitRoot()
319 {
320 printf("Quit ROOT\n");
322 }
323};
324
326{
327 // disable browser cache - all scripts and html files will be loaded every time, useful for development
328 // gEnv->SetValue("WebGui.HttpMaxAge", 0);
329
330 gRandom->SetSeed(0); // make random seed
331
333
334 auto eventMng = new EventManager();
335 eventMng->SetName("EventManager");
336 eveMng->GetWorld()->AddElement(eventMng);
337
338 eveMng->GetWorld()->AddCommand("QuitRoot", "sap-icon://log", eventMng, "QuitRoot()");
339
340 eveMng->GetWorld()->AddCommand("NextEvent", "sap-icon://step", eventMng, "NextEvent()");
341
342 eveMng->GetWorld()->AddCommand("Autoplay", "sap-icon://refresh", eventMng, "Autoplay()");
343
346
347 if (1) {
349 projectScenes(true, true);
350 }
351
352 eveMng->Show();
353}
int Int_t
Definition: RtypesCore.h:45
double Double_t
Definition: RtypesCore.h:59
@ kPink
Definition: Rtypes.h:67
@ kBlack
Definition: Rtypes.h:65
@ kCyan
Definition: Rtypes.h:66
@ kBlue
Definition: Rtypes.h:66
winID h TVirtualViewer3D TVirtualGLPainter p
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t r
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t winding char text const char depth char const char Int_t count const char ColorStruct_t color const char Pixmap_t Pixmap_t PictureAttributes_t attr const char char ret_data h unsigned char height h prop
R__EXTERN TRandom * gRandom
Definition: TRandom.h:62
char * Form(const char *fmt,...)
Formats a string in a circular formatting buffer.
Definition: TString.cxx:2468
std::condition_variable fCV
Definition: event_demo.C:246
std::chrono::duration< double > fDeltaTime
Definition: event_demo.C:242
virtual void QuitRoot()
Definition: event_demo.C:318
std::mutex fMutex
Definition: event_demo.C:245
std::chrono::time_point< std::chrono::system_clock > fPrevTime
Definition: event_demo.C:241
bool fAutoplay
Definition: event_demo.C:237
void Autoplay()
Definition: event_demo.C:297
void NextEvent()
Definition: event_demo.C:258
virtual void NextEvent()
std::thread * fTimerThread
Definition: event_demo.C:244
void autoplay_scheduler()
Definition: event_demo.C:267
virtual ~EventManager()
Definition: event_demo.C:256
virtual void AddElement(REveElement *el)
Add el to the list of children.
virtual void DestroyElements()
Destroy all children of this element.
REveMagFieldDuo Interface to magnetic field with two different values depending on radius.
REveScene * GetEventScene() const
static REveManager * Create()
If global REveManager* REX::gEve is not set initialize it.
REveScene * GetGlobalScene() const
REveScene * SpawnNewScene(const char *name, const char *title="")
Create a new scene.
REveViewer * SpawnNewViewer(const char *name, const char *title="")
Create a new GL viewer.
REveScene * GetWorld() const
void Show(const RWebDisplayArgs &args="")
Show eve manager in specified browser.
REveProjectionManager Manager class for steering of projections and managing projected objects.
virtual REveElement * ImportElements(REveElement *el, REveElement *ext_list=nullptr)
Recursively import elements and apply projection to the newly imported objects.
void AddCommand(const std::string &name, const std::string &icon, const REveElement *element, const std::string &action)
Definition: REveScene.cxx:83
REveTrackPropagator Calculates path of a particle taking into account special path-marks and imposed ...
REveTrack Track with given vertex, momentum and optional referece-points (path-marks) along its path.
Definition: REveTrack.hxx:40
REveViewer Reve representation of TGLViewer.
Definition: REveViewer.hxx:28
void SetCameraType(ECameraType t)
Definition: REveViewer.hxx:47
virtual void AddScene(REveScene *scene)
Add 'scene' to the list of scenes.
Definition: REveViewer.cxx:58
Cylindrical tube class.
Definition: TGeoTube.h:18
Description of the dynamic properties of a particle.
Definition: TParticle.h:26
This is the base class for the ROOT Random number generators.
Definition: TRandom.h:27
virtual void SetSeed(ULong_t seed=0)
Set the random generator seed.
Definition: TRandom.cxx:608
REX::REveScene * rPhiGeomScene
Definition: event_demo.C:44
void addTracks()
Definition: event_demo.C:90
void addJets()
Definition: event_demo.C:128
REX::REveScene * rPhiEventScene
Definition: event_demo.C:44
void makeEventScene()
Definition: event_demo.C:151
const Double_t kR_max
Definition: event_demo.C:50
REX::REveProjectionManager * mngRhoZ
Definition: event_demo.C:43
REX::REveManager * eveMng
Definition: event_demo.C:41
REX::REveViewer * rhoZView
Definition: event_demo.C:47
const Double_t kZ_d
Definition: event_demo.C:51
REX::REveScene * rhoZEventScene
Definition: event_demo.C:45
void createProjectionStuff()
Definition: event_demo.C:172
void addPoints()
Definition: event_demo.C:69
REX::REveViewer * rphiView
Definition: event_demo.C:46
void makeGeometryScene()
Definition: event_demo.C:158
REX::REveProjectionManager * mngRhoPhi
Definition: event_demo.C:42
void event_demo()
Definition: event_demo.C:325
REX::REveScene * rhoZGeomScene
Definition: event_demo.C:45
void projectScenes(bool geomp, bool eventp)
Definition: event_demo.C:198
REX::REvePointSet * getPointSet(int npoints=2, float s=2, int color=28)
Definition: event_demo.C:54
const Double_t kR_min
Definition: event_demo.C:49
static constexpr double s
static constexpr double ms
static constexpr double ps
constexpr Double_t TwoPi()
Definition: TMath.h:44
TMarker m
Definition: textangle.C:8