Class Reference for E1039 Core & Analysis Software
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
PHEventDisplay.cxx
Go to the documentation of this file.
1 
10 // STL and BOOST includes
11 #include <boost/shared_ptr.hpp>
12 #include <boost/make_shared.hpp>
13 #include <boost/bind.hpp>
14 
15 // PHOOL and Fun4All includes
17 #include <fun4all/Fun4AllServer.h>
18 #include <phool/getClass.h>
19 #include <phool/phool.h>
20 #include <phool/PHIODataNode.h>
21 #include <phool/PHNodeIterator.h>
22 #include <phool/PHTimer.h>
23 #include <phool/PHCompositeNode.h>
24 //#include <TMutNode.h>
25 #include <phool/PHTimeServer.h>
26 #include <phgeom/PHGeomUtility.h>
27 #include <phgeom/PHGeomTGeo.h>
28 #include <phfield/PHFieldUtility.h>
29 #include <phfield/PHField.h>
30 
31 #include <interface_main/SQEvent.h>
32 
33 
34 // EVE framework includes
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"
50 #include "TFile.h"
51 
52 
53 // sPHENIX Event Display
54 #include <pheve_display/PHEveDisplay.h>
55 
56 // Trk display
57 #include <pheve_modules/mTrkEveDisplay.h>
58 
59 #include <TThread.h>
60 #include <TStyle.h>
61 
62 #include "PHEventDisplay.h"
63 
64 using boost::bind;
65 
66 void MakeViewerScene(TEveWindowSlot* slot, TEveViewer*& v, TEveScene*& s)
67 {
68  // Create a scene and a viewer in the given slot.
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");
74  v->AddScene(s);
75 }
76 
77 TEveElement* MakeProjection (
78 TEveWindowSlot* slot,
79 TEveElement* element,
80 const double start_z,
81 const double end_z = 200,
82 const char* name = "Projection"
83 ) {
84 
85  TEveViewer* v; TEveScene* s;
86  MakeViewerScene(slot, v, s);
87  v->SetElementName(Form("Viewer - %s",name));
88  s->SetElementName(Form("Scene - %s",name));
89 
90  s->AddElement(element);
91 
92  TGeoNode *node_c = gGeoManager->GetCurrentNode();
93  TEveGeoTopNode* tnode_c = new TEveGeoTopNode(gGeoManager, node_c);
94  s->AddElement(tnode_c);
95 
96  auto vv = v->GetGLViewer();
97 
98  double mean_z = 0.5*(start_z + end_z);
99  double extd_z = end_z - start_z;
100 
101  double clip_par[] = {0,0,mean_z,300,300,extd_z};
102  vv->GetClipSet()->SetClipType(TGLClip::kClipBox);
103  vv->UpdateScene();
104  vv->GetClipSet()->SetClipState(TGLClip::kClipBox, clip_par);
105  vv->GetClipSet()->GetCurrentClip()->SetMode(TGLClip::kOutside);
106  vv->SetCurrentCamera(TGLViewer::kCameraOrthoXOY);
107 
108  TGLCameraOverlay* co = vv->GetCameraOverlay();
109  co->SetShowOrthographic(kTRUE);
110  co->SetOrthographicMode(TGLCameraOverlay::kGridFront);
111 
112  return 0;
113 }
114 
115 
116 TEveElement* DrawHodo (
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"
123 ) {
124 
125  TEveViewer* v; TEveScene* s;
126  MakeViewerScene(slot, v, s);
127  v->SetElementName(Form("Viewer - %s",name));
128  s->SetElementName(Form("Scene - %s",name));
129 
130  s->AddElement(element);
131 
132  TGeoNode *node_c = gGeoManager->GetCurrentNode();
133  TEveGeoTopNode* tnode_c = new TEveGeoTopNode(gGeoManager, node_c);
134  s->AddElement(tnode_c);
135 
136  auto vv = v->GetGLViewer();
137 
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);
145 
146  return 0;
147 }
148 
150  int h = 1080,
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") :
155  SubsysReco("PHEventDisplay"),
156  _pending_update(false),
157  _modules(),
158  _mutex(PTHREAD_MUTEX_INITIALIZER),
159  _update_thread(),
160  _PHEveDisplay(new PHEveDisplay(w, h, _use_fieldmap, _use_geofile, _mapname, _geoname, verbosity)),
161  _rot(NULL),
162  _status_thread(),
163  jet_pt_threshold(5.),
164  jet_e_scale(30.),
165  calo_e_threshold(0.2),
166  is_dc_on(true),
167  is_hodo_on(true),
168  is_prop_on(true),
169  is_truth_on(true),
170  use_fieldmap(_use_fieldmap),
171  use_geofile(_use_geofile),
172  width(w),
173  height(h),
174  mapname(_mapname),
175  geoname(_geoname),
176  nevent(0),
177  verbosity(0)
178 {
179 
180  // Alan's method
181  //TEveManager::Create(kTRUE,"V");
182  //TEveWindow::SetMainFrameDefWidth(width);
183  //TEveWindow::SetMainFrameDefHeight(height);
184 
185  // Haiwang's method
186  TApplication::NeedGraphicsLibs();
187  gApplication->InitializeGraphics();
188  TEveUtil::SetupEnvironment();
189  TEveUtil::SetupGUI();
190  gEve = new TEveManager(width, height, true, "V");
191 
192  gEve->GetBrowser()->HideBottomTab();
193  TFile::SetCacheFileDir(".");
194 
195  gEve->FullRedraw3D(kTRUE);
196  TGLViewer* v = gEve->GetDefaultGLViewer();
197  //v->ColorSet().Background().SetColor(kMagenta+4);
198  //v->SetGuideState(TGLUtil::kAxesOrigin, kTRUE, kFALSE, 0);
199  v->RefreshPadEditor(v);
200  v->DoDraw();
201 
202  _PHEveDisplay->set_eve_manager(gEve);
203 
204  if (verbosity) std::cout << "PHEventDisplay instantiated."<<std::endl;
205 }
206 
208 {
209 }
210 
212 {
213  SubsysReco::Init(topNode);
214 
215  _PHEveDisplay->set_jet_pt_threshold(jet_pt_threshold);
216  _PHEveDisplay->set_jet_e_scale(jet_e_scale);
217  _PHEveDisplay->set_calo_e_threshold(calo_e_threshold);
218 
219  std::cout.precision(5);
220  std::cout
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;
226 
227  return 0;
228 }
229 
231 {
232 
233  if (verbosity)
234  std::cout << "PHEventDisplay - initialize run. " << std::endl;
235 
236  try {
237  _PHEveDisplay->set_verbosity(verbosity);
238  if (verbosity)
239  std::cout << "PHEventDisplay - add_elements() begins." << std::endl;
240  _PHEveDisplay->add_elements(gEve);
241  if (verbosity)
242  std::cout << "PHEventDisplay - load_geometry() begins. " << std::endl;
243  _PHEveDisplay->load_geometry(topNode, gEve);
244  if (verbosity)
245  std::cout << "PHEventDisplay - config_bfield() begins." << std::endl;
246  PHField* field = PHFieldUtility::GetFieldMapNode(nullptr, topNode);
247  _PHEveDisplay->config_bfields(field);
248 
249  register_module<mTrkEveDisplay>();
250  if (verbosity)
251  std::cout << "PHEventDisplay - mSvtxEveDisplay module registered." << std::endl;
252 
253  if (verbosity)
254  std::cout << "_modules.size()" << _modules.size() << std::endl;
255 
256  std::for_each(_modules.begin(), _modules.end(), bind(&mPHEveModuleBase::init_run, _1, topNode));
257  if (verbosity)
258  std::cout << "PHEventDisplay - all modules registered. " << std::endl;
259 
260  } catch (std::exception &e) {
261  std::cout << "Exception caught while initializing sPHENIX event display: " << e.what() << std::endl;
262  }
263 
264  return 0;
265 }
266 
268 {
269  if (verbosity) std::cout<<"PHEventDisplay - setting up to process event." <<std::endl;
270  nevent++;
271 
272  // Clean up TEveElement list drawn from last events
273  if (verbosity) std::cout<<"PHEventDisplay - clear" <<std::endl;
274  std::for_each(_modules.begin(),_modules.end(),
275  bind(&mPHEveModuleBase::clear,_1));
276 
277  // Process this event, reco objects to TEve objects
278  if (verbosity) std::cout<<"PHEventDisplay - process" <<std::endl;
279  std::for_each(_modules.begin(),
280  _modules.end(),
282  _1,
283  topNode));
284 
285  // Draw this event
286  if (verbosity) std::cout<<"PHEventDisplay - draw" <<std::endl;
287  update_scene(topNode);
288 
289  return 0;
290 }
291 
293 {
294  return 0;
295 }
296 
298 {
299  TGLViewer* v = gEve->GetDefaultGLViewer();
300  v->ResetCurrentCamera();
301  v->CurrentCamera().RotateRad(-3.14/2.0, 0);
302  v->CurrentCamera().Zoom(200, 0, 0); // (400, 0, 0);
303  v->CurrentCamera().Truck(500, 0); // (2800,0);
304  v->DoDraw();
305 }
306 
308 {
309  TGLViewer* v = gEve->GetDefaultGLViewer();
310  v->ResetCurrentCamera();
311  v->CurrentCamera().Zoom(200, 0, 0); // (400, 0, 0);
312  v->CurrentCamera().Truck(500, 0); // (2800,0);
313  v->DoDraw();
314 }
315 
317 {
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); // (350, 0, 0);
322  v->CurrentCamera().Truck(1000, -500); // (2000,-1500);
323  v->DoDraw();
324 }
325 
326 
327 void PHEventDisplay::update_scene(PHCompositeNode *topNode)
328 {
329  if (verbosity) std::cout << "PHEventDisplay - update_scene() nevent = " <<nevent<<std::endl;
330  TThread::Lock(); // Keep the autorotator from segfaulting
331  draw_default(topNode);
332  TThread::UnLock();
333 }
334 
335 //void PHEventDisplay::run_evt_in_thread()
336 //{
337 // if (verbosity)
338 // std::cout << "PHEventDisplay - run_evt_in_thread() nevent = " << nevent << std::endl;
339 // if (!pthread_mutex_trylock(&_mutex)) {
340 // if (_pending_update) {
341 // update_scene();
342 // }
343 // _pending_update = false;
344 // _update_thread = boost::make_shared<boost::thread>(bind(&PHEventDisplay::reco_thread, this));
345 // }
346 //}
347 
348 
349 void PHEventDisplay::reco_thread()
350 {
351  if (verbosity) std::cout<< "PHEventDisplay - reco_thread() nevent = "<<nevent<<std::endl;
353  se->run(1);
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;
359 
360 }
361 
362 void PHEventDisplay::draw_default(PHCompositeNode *topNode)
363 {
364  if (verbosity) std::cout<<"PHEventDisplay - draw_default() begins."<<std::endl;
365 
366  if(nevent==1) {
367 
368  // Extra tabs
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();
384 
385  // 1970 | 2085 separate by absorber
386  // 2185 logic separation
387  MakeProjection(_slot_dc_00, _PHEveDisplay->get_top_list(), 550, 700, "ST1");
388  MakeProjection(_slot_dc_01, _PHEveDisplay->get_top_list(), 1300, 1450, "ST2");
389  MakeProjection(_slot_dc_10, _PHEveDisplay->get_top_list(), 1870, 2185, "ST3");
390  MakeProjection(_slot_dc_11, _PHEveDisplay->get_top_list(), 2185, 2450, "ST4");
391 
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();
405 
406  DrawHodo(_slot_hodo_xz, _PHEveDisplay->get_hodo_list(), 0.25, 0.05, 3.14, "XZ");
407  DrawHodo(_slot_hodo_yz, _PHEveDisplay->get_hodo_list(), 0.25, 3.14/2-0.05, 3.14, "YZ");
408  }
409 
410  if (verbosity>1) std::cout<<"draw_default() FullRedraw3D." <<std::endl;
411  gEve->FullRedraw3D(); // (kTRUE);
412 
413  if (verbosity>1) std::cout<<"draw_default() TGLViewer." <<std::endl;
414  TGLViewer* v = gEve->GetDefaultGLViewer();
415  //v->UpdateScene();
416 
417  //v->ColorSet().Background().SetColor(kMagenta+4);
418  //v->SetGuideState(TGLUtil::kAxesOrigin, kTRUE, kFALSE, 0);
419  //v->RefreshPadEditor(v);
420 
421  if(nevent==1) {
422  v->UpdateScene();
423  set_view_3d();
424  }
425  //v->DoDraw();
426 
427  // Annotation
428 
429  SQEvent* _sqevent = findNode::getClass<SQEvent>(topNode,"SQEvent");
430  if (_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}",
437  _sqevent->get_trigger(SQEvent::NIM1),
438  _sqevent->get_trigger(SQEvent::NIM2),
439  _sqevent->get_trigger(SQEvent::NIM3),
440  _sqevent->get_trigger(SQEvent::NIM4),
441  _sqevent->get_trigger(SQEvent::NIM5),
442  _sqevent->get_trigger(SQEvent::MATRIX1),
443  _sqevent->get_trigger(SQEvent::MATRIX2),
444  _sqevent->get_trigger(SQEvent::MATRIX3),
445  _sqevent->get_trigger(SQEvent::MATRIX4),
446  _sqevent->get_trigger(SQEvent::MATRIX5)
447  ), 0.55, 0.90);
448  ann->SetTextSize(0.04);
449  }
450 
451  //gEve->Redraw3D(kTRUE);
452  gEve->DoRedraw3D();
453 }
454 
455 
457 {
458  _rot = gEve->GetDefaultGLViewer()->GetAutoRotator();
459  _rot->SetADolly(0.0);
460  _rot->SetATheta(0.0);
461  _rot->SetWTheta(0.075);
462  _rot->SetWPhi(0.1);
463  _rot->Start();
464 }
465 
466 void
468 {
469  _PHEveDisplay->go_fullscreen(gEve);
470 }
471 
virtual int get_run_id() const =0
Return the run ID.
virtual int Init(PHCompositeNode *)
Definition: SubsysReco.h:41
virtual void clear()=0
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)
Definition: PHEveDisplay.h:70
const double s
void load_geometry(PHCompositeNode *topNode, TEveManager *geve)
int Init(PHCompositeNode *topNode)
Module initialization.
static Fun4AllServer * instance()
virtual void init_run(PHCompositeNode *top_node)=0
Fun4AllServer * se
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
Definition: PHField.h:13
void config_bfields(const PHField *field)
TEveElementList * get_top_list() const
Definition: PHEveDisplay.h:56
#define NULL
Definition: Pdb.h:9
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)
Definition: PHEveDisplay.h:63
void set_eve_manager(TEveManager *geve)
Set a pointer to the underlying TEveManager.
Definition: PHEveDisplay.h:52
TEveElementList * get_hodo_list() const
Definition: PHEveDisplay.h:58
void MakeViewerScene(TEveWindowSlot *slot, TEveViewer *&v, TEveScene *&s)
virtual bool event(PHCompositeNode *top_node)=0
An SQ interface class to hold one event header.
Definition: SQEvent.h:17
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)
Definition: PHEveDisplay.h:67
high precision timer
void add_elements(TEveManager *geve)
void set_jet_e_scale(float e_scale)
Definition: PHEveDisplay.h:65
void go_fullscreen(TEveManager *geve)
PHTimer server for accessing external information.