11 #include <boost/shared_ptr.hpp>
12 #include <boost/make_shared.hpp>
13 #include <boost/bind.hpp>
26 #include <phgeom/PHGeomUtility.h>
27 #include <phgeom/PHGeomTGeo.h>
28 #include <phfield/PHFieldUtility.h>
29 #include <phfield/PHField.h>
35 #include "TEveManager.h"
36 #include "TApplication.h"
37 #include "TEveBrowser.h"
38 #include "TEveWindow.h"
39 #include "TGeoManager.h"
40 #include "TGeoVolume.h"
41 #include "TGLAutoRotator.h"
42 #include "TGLViewer.h"
43 #include "TEveViewer.h"
44 #include "TEveScene.h"
45 #include "TEveProjectionManager.h"
46 #include "TEveProjectionAxes.h"
47 #include "TEveGeoNode.h"
48 #include "TGLCameraOverlay.h"
49 #include "TGLAnnotation.h"
54 #include <pheve_display/PHEveDisplay.h>
57 #include <pheve_modules/mTrkEveDisplay.h>
69 v =
new TEveViewer(
"Viewer");
70 v->SpawnGLViewer((TGedEditor*)gEve->GetEditor());
71 slot->ReplaceWindow(v);
72 gEve->GetViewers()->AddElement(v);
73 s = gEve->SpawnNewScene(
"Scene");
81 const double end_z = 200,
82 const char* name =
"Projection"
85 TEveViewer* v; TEveScene*
s;
87 v->SetElementName(Form(
"Viewer - %s",name));
88 s->SetElementName(Form(
"Scene - %s",name));
90 s->AddElement(element);
92 TGeoNode *node_c = gGeoManager->GetCurrentNode();
93 TEveGeoTopNode* tnode_c =
new TEveGeoTopNode(gGeoManager, node_c);
94 s->AddElement(tnode_c);
96 auto vv = v->GetGLViewer();
98 double mean_z = 0.5*(start_z + end_z);
99 double extd_z = end_z - start_z;
101 double clip_par[] = {0,0,mean_z,300,300,extd_z};
102 vv->GetClipSet()->SetClipType(TGLClip::kClipBox);
104 vv->GetClipSet()->SetClipState(TGLClip::kClipBox, clip_par);
105 vv->GetClipSet()->GetCurrentClip()->SetMode(TGLClip::kOutside);
106 vv->SetCurrentCamera(TGLViewer::kCameraOrthoXOY);
108 TGLCameraOverlay* co = vv->GetCameraOverlay();
109 co->SetShowOrthographic(kTRUE);
110 co->SetOrthographicMode(TGLCameraOverlay::kGridFront);
117 TEveWindowSlot* slot,
118 TEveElement* element,
119 const double zoom = 0.1,
120 const double hrot = 0,
121 const double vrot = 0,
122 const char* name =
"Hodo"
125 TEveViewer* v; TEveScene*
s;
127 v->SetElementName(Form(
"Viewer - %s",name));
128 s->SetElementName(Form(
"Scene - %s",name));
130 s->AddElement(element);
132 TGeoNode *node_c = gGeoManager->GetCurrentNode();
133 TEveGeoTopNode* tnode_c =
new TEveGeoTopNode(gGeoManager, node_c);
134 s->AddElement(tnode_c);
136 auto vv = v->GetGLViewer();
138 TGLViewer::ECameraType cam_type = TGLViewer::kCameraOrthoZOX;
139 double cent[3] = {0, 0, 1000};
140 vv->SetOrthoCamera(cam_type, zoom, 0, cent, hrot, vrot);
141 vv->SetCurrentCamera(cam_type);
142 TGLCameraOverlay* co = vv->GetCameraOverlay();
143 co->SetShowOrthographic(kTRUE);
144 co->SetOrthographicMode(TGLCameraOverlay::kGridFront);
151 bool _use_fieldmap =
false,
152 bool _use_geofile =
false,
153 const std::string& _mapname =
"sPHEBIX.2d.root",
154 const std::string& _geoname =
"geo.root") :
156 _pending_update(false),
158 _mutex(PTHREAD_MUTEX_INITIALIZER),
160 _PHEveDisplay(new
PHEveDisplay(w, h, _use_fieldmap, _use_geofile, _mapname, _geoname, verbosity)),
163 jet_pt_threshold(5.),
165 calo_e_threshold(0.2),
170 use_fieldmap(_use_fieldmap),
171 use_geofile(_use_geofile),
186 TApplication::NeedGraphicsLibs();
187 gApplication->InitializeGraphics();
188 TEveUtil::SetupEnvironment();
189 TEveUtil::SetupGUI();
190 gEve =
new TEveManager(width, height,
true,
"V");
192 gEve->GetBrowser()->HideBottomTab();
193 TFile::SetCacheFileDir(
".");
195 gEve->FullRedraw3D(kTRUE);
196 TGLViewer* v = gEve->GetDefaultGLViewer();
199 v->RefreshPadEditor(v);
204 if (verbosity) std::cout <<
"PHEventDisplay instantiated."<<std::endl;
219 std::cout.precision(5);
221 <<
"dc :" << is_dc_on
222 <<
", hodo : "<< is_hodo_on
223 <<
", prop : "<< is_prop_on
224 <<
", truth : " << is_truth_on
225 <<
", verbosity : " << verbosity <<std::endl;
234 std::cout <<
"PHEventDisplay - initialize run. " << std::endl;
239 std::cout <<
"PHEventDisplay - add_elements() begins." << std::endl;
242 std::cout <<
"PHEventDisplay - load_geometry() begins. " << std::endl;
245 std::cout <<
"PHEventDisplay - config_bfield() begins." << std::endl;
249 register_module<mTrkEveDisplay>();
251 std::cout <<
"PHEventDisplay - mSvtxEveDisplay module registered." << std::endl;
254 std::cout <<
"_modules.size()" << _modules.size() << std::endl;
258 std::cout <<
"PHEventDisplay - all modules registered. " << std::endl;
260 }
catch (std::exception &e) {
261 std::cout <<
"Exception caught while initializing sPHENIX event display: " << e.what() << std::endl;
269 if (verbosity) std::cout<<
"PHEventDisplay - setting up to process event." <<std::endl;
273 if (verbosity) std::cout<<
"PHEventDisplay - clear" <<std::endl;
274 std::for_each(_modules.begin(),_modules.end(),
278 if (verbosity) std::cout<<
"PHEventDisplay - process" <<std::endl;
279 std::for_each(_modules.begin(),
286 if (verbosity) std::cout<<
"PHEventDisplay - draw" <<std::endl;
287 update_scene(topNode);
299 TGLViewer* v = gEve->GetDefaultGLViewer();
300 v->ResetCurrentCamera();
301 v->CurrentCamera().RotateRad(-3.14/2.0, 0);
302 v->CurrentCamera().Zoom(200, 0, 0);
303 v->CurrentCamera().Truck(500, 0);
309 TGLViewer* v = gEve->GetDefaultGLViewer();
310 v->ResetCurrentCamera();
311 v->CurrentCamera().Zoom(200, 0, 0);
312 v->CurrentCamera().Truck(500, 0);
318 TGLViewer* v = gEve->GetDefaultGLViewer();
319 v->ResetCurrentCamera();
320 v->CurrentCamera().RotateRad(-3.14/4., -3.14/4.);
321 v->CurrentCamera().Zoom(180, 0, 0);
322 v->CurrentCamera().Truck(1000, -500);
329 if (verbosity) std::cout <<
"PHEventDisplay - update_scene() nevent = " <<nevent<<std::endl;
331 draw_default(topNode);
349 void PHEventDisplay::reco_thread()
351 if (verbosity) std::cout<<
"PHEventDisplay - reco_thread() nevent = "<<nevent<<std::endl;
354 if (verbosity>1) std::cout <<
"reco_thread() run(1) complete."<<std::endl;
355 _pending_update =
true;
356 if (verbosity>1) std::cout<<
"reco_thread() pendinding update "<<std::endl;
357 pthread_mutex_unlock(&_mutex);
358 if (verbosity>1) std::cout <<
"reco_thread() mutex unlock()"<<std::endl;
364 if (verbosity) std::cout<<
"PHEventDisplay - draw_default() begins."<<std::endl;
369 _slot_dc = TEveWindow::CreateWindowInTab(gEve->GetBrowser()->GetTabRight());
370 auto pack_dc = _slot_dc->MakePack();
371 pack_dc->SetElementName(
"Station View");
372 pack_dc->SetHorizontal();
373 pack_dc->SetShowTitleBar(kFALSE);
374 _slot_dc = pack_dc->NewSlot();
375 auto pack0 = _slot_dc->MakePack();
376 pack0->SetShowTitleBar(kFALSE);
377 _slot_dc_00 = pack0->NewSlot();
378 _slot_dc_10 = pack0->NewSlot();
379 _slot_dc = pack_dc->NewSlot();
380 auto pack1 = _slot_dc->MakePack();
381 pack1->SetShowTitleBar(kFALSE);
382 _slot_dc_01 = pack1->NewSlot();
383 _slot_dc_11 = pack1->NewSlot();
392 _slot_hodo = TEveWindow::CreateWindowInTab(gEve->GetBrowser()->GetTabRight());
393 auto pack_hodo = _slot_hodo->MakePack();
394 pack_hodo->SetElementName(
"Hodo View");
395 pack_hodo->SetVertical();
396 pack_hodo->SetShowTitleBar(kFALSE);
397 _slot_hodo = pack_hodo->NewSlot();
398 auto pack_hodo_0 = _slot_hodo->MakePack();
399 pack_hodo_0->SetShowTitleBar(kFALSE);
400 _slot_hodo_xz = pack_hodo_0->NewSlot();
401 _slot_hodo = pack_hodo->NewSlot();
402 auto pack_hodo_1 = _slot_hodo->MakePack();
403 pack_hodo_1->SetShowTitleBar(kFALSE);
404 _slot_hodo_yz = pack_hodo_1->NewSlot();
410 if (verbosity>1) std::cout<<
"draw_default() FullRedraw3D." <<std::endl;
411 gEve->FullRedraw3D();
413 if (verbosity>1) std::cout<<
"draw_default() TGLViewer." <<std::endl;
414 TGLViewer* v = gEve->GetDefaultGLViewer();
429 SQEvent* _sqevent = findNode::getClass<SQEvent>(topNode,
"SQEvent");
431 if(verbosity) std::cout<<
"PHEventDisplay - SQEvent nodes found."<<std::endl;
432 v->DeleteOverlayAnnotations();
433 TGLAnnotation* ann =
new TGLAnnotation(v, Form(
"Run: %d, Spill: %d, Event: %d", _sqevent->
get_run_id(), _sqevent->
get_spill_id(), _sqevent->
get_event_id()), 0.55, 0.95);
434 ann->SetTextSize(0.04);
435 ann =
new TGLAnnotation(v,
436 Form(
"NIM: {%d, %d, %d, %d, %d} MATRIX: {%d, %d, %d, %d, %d}",
448 ann->SetTextSize(0.04);
458 _rot = gEve->GetDefaultGLViewer()->GetAutoRotator();
459 _rot->SetADolly(0.0);
460 _rot->SetATheta(0.0);
461 _rot->SetWTheta(0.075);
virtual int get_run_id() const =0
Return the run ID.
virtual int Init(PHCompositeNode *)
int InitRun(PHCompositeNode *topNode)
Run initialization.
virtual bool get_trigger(const SQEvent::TriggerMask i) const =0
Return the trigger bit (fired or not) of the selected trigger channel.
TEveElement * DrawHodo(TEveWindowSlot *slot, TEveElement *element, const double zoom=0.1, const double hrot=0, const double vrot=0, const char *name="Hodo")
void set_verbosity(const int a)
void load_geometry(PHCompositeNode *topNode, TEveManager *geve)
int Init(PHCompositeNode *topNode)
Module initialization.
static Fun4AllServer * instance()
virtual void init_run(PHCompositeNode *top_node)=0
int process_event(PHCompositeNode *topNode)
Event processing.
event display interface, set parameters/switches, call detector modules, control display.
virtual int get_event_id() const =0
Return the event ID, which is unique per run.
virtual int get_spill_id() const =0
Return the spill ID.
transient DST object for field storage and access
void config_bfields(const PHField *field)
TEveElementList * get_top_list() const
int run(const int nevnts=0, const bool require_nevents=false)
run n events (0 means up to end of file)
int End(PHCompositeNode *topNode)
End of process.
void start_rotation()
Threaded access to Fun4All server.
static PHField * GetFieldMapNode(const PHFieldConfig *default_config=nullptr, PHCompositeNode *topNode=nullptr, const int verbosity=0)
Get transient PHField from DST nodes. If not found, make a new one based on default_config.
void set_jet_pt_threshold(float pt)
void set_eve_manager(TEveManager *geve)
Set a pointer to the underlying TEveManager.
TEveElementList * get_hodo_list() const
void MakeViewerScene(TEveWindowSlot *slot, TEveViewer *&v, TEveScene *&s)
virtual bool event(PHCompositeNode *top_node)=0
An SQ interface class to hold one event header.
PHEventDisplay(int w, int h, bool _use_fieldmap, bool _use_geofile, const std::string &_mapname, const std::string &_geoname)
TEveElement * MakeProjection(TEveWindowSlot *slot, TEveElement *element, const double start_z, const double end_z=200, const char *name="Projection")
void set_calo_e_threshold(float e)
void add_elements(TEveManager *geve)
void set_jet_e_scale(float e_scale)
void go_fullscreen(TEveManager *geve)
PHTimer server for accessing external information.