12#include "FairRootManager.h"
14#include "FairXMLNode.h"
16#include <TClonesArray.h>
17#include <TDatabasePDG.h>
18#include <TEveBrowser.h>
19#include <TEveGeoNode.h>
20#include <TEveManager.h>
21#include <TEveProjectionManager.h>
22#include <TEveProjections.h>
26#include <TEveViewer.h>
27#include <TEveWindow.h>
28#include <TGFileDialog.h>
29#include <TGLAnnotation.h>
30#include <TGLCameraOverlay.h>
32#include <TGLFontManager.h>
33#include <TGLLightSet.h>
36#include <TGeoManager.h>
38#include <TGeoVolume.h>
51 fRunAna = FairRunAna::Instance();
123 "TofUHit", kBlue, kCross, 1, kTRUE);
151 if (use_xml == kFALSE) {
153 Int_t vis_level = gGeoManager->GetVisLevel();
154 TGeoNode* top = gGeoManager->GetTopNode();
163 Int_t vis_level = gGeoManager->GetVisLevel();
164 TGeoNode* top = gGeoManager->GetTopNode();
168 if (gEve->GetGlobalScene()->GetRnrState()) {
169 gEve->GetGlobalScene()->SetRnrState(kFALSE);
170 gEve->GetGlobalScene()->SetRnrState(kTRUE);
178 gEve->GetViewers()->SwitchColorSet();
184 TList* taskList = FairRunAna::Instance()->GetMainTask()->GetListOfTasks();
187 for (TObject* task : *taskList) {
196 TEveManager::Create();
200 LOG(fatal) <<
"CbmTimesliceManager::Init() => Failed main view initialization";
210 fCbmEvents =
dynamic_cast<TClonesArray*
>(FairRootManager::Instance()->GetObject(
"CbmEvent"));
213 LOG(fatal) <<
"CbmTimesliceManager::Init() => CbmEvents branch not found! Task will be deactivated";
234 FairRunAna::Instance()->Run(
static_cast<Long64_t
>(
fTimesliceIdx));
242 int NbEventsInTs = 0;
243 while (NbEventsInTs == 0) {
247 LOG(debug) <<
"Display TS " <<
GetCurrentTimeslice() <<
" with " << NbEventsInTs <<
" events";
268 LOG(debug) << GetName() <<
" : Ts_nofTofTracks " << nofTofTracks <<
" in event " <<
fEventIdx;
271 TList* taskList = FairRunAna::Instance()->GetMainTask()->GetListOfTasks();
274 for (TObject* task : *taskList) {
279 LOG(debug) << GetName() <<
": call " << task->GetName();
283 LOG(debug) << GetName() <<
": call " << task->GetName();
287 LOG(debug) << GetName() <<
": call " << task->GetName();
325 stime.Form(
"TS Time: %.2f", time);
332 TString text =
"TS: ";
340 stime.Form(
"Event Time: %.2f", time);
347 TString text =
"Event: ";
356 const char* filetypes[] = {
"PNG",
"*.png",
"JPG",
"*.jpg", 0, 0};
358 fi.fFileTypes = filetypes;
359 fi.fIniDir = StrDup(
".");
360 new TGFileDialog(gClient->GetRoot(), gEve->GetMainWindow(), kFDSave, &fi);
361 if (fi.fFilename ==
nullptr) {
364 filename = fi.fFilename;
371 switch (screenshotType) {
373 gEve->GetDefaultGLViewer()->SavePicture(filename);
377 TGLViewer* gl =
fViewZX->GetGLViewer();
378 gl->SavePicture(filename);
382 TGLViewer* gl =
fViewZY->GetGLViewer();
383 gl->SavePicture(filename);
387 TString filename_path = filename(0, filename.Last(
'.'));
388 TString filename_ext = filename(filename.Last(
'.') + 1, 3);
389 TString filename3d = Form(
"%s_3d.%s", filename_path.Data(), filename_ext.Data());
390 TString filenameZY = Form(
"%s_ZY.%s", filename_path.Data(), filename_ext.Data());
391 TString filenameZX = Form(
"%s_ZX.%s", filename_path.Data(), filename_ext.Data());
392 gEve->GetDefaultGLViewer()->SavePicture(filename3d);
393 TGLViewer* gl =
fViewZY->GetGLViewer();
394 gl->SavePicture(filenameZY);
396 gl->SavePicture(filenameZX);
405 switch (screenshotType) {
407 gEve->GetDefaultGLViewer()->SavePicture(filename);
411 TGLViewer* gl =
fRPhiView->GetGLViewer();
412 gl->SavePicture(filename);
416 TGLViewer* gl =
fRhoZView->GetGLViewer();
417 gl->SavePicture(filename);
421 TString filename_path = filename(0, filename.Last(
'.'));
422 TString filename_ext = filename(filename.Last(
'.') + 1, 3);
423 TString filename3d = Form(
"%s_3d.%s", filename_path.Data(), filename_ext.Data());
424 TString filenameRphi = Form(
"%s_XY.%s", filename_path.Data(), filename_ext.Data());
425 TString filenameRhoz = Form(
"%s_Z.%s", filename_path.Data(), filename_ext.Data());
426 gEve->GetDefaultGLViewer()->SavePicture(filename3d);
427 TGLViewer* gl =
fRPhiView->GetGLViewer();
428 gl->SavePicture(filenameRphi);
430 gl->SavePicture(filenameRhoz);
446 FairXMLNode* xml = xmlfile.GetRootNode();
447 for (
int i = 0; i < xml->GetNChildren(); i++) {
448 TString nodename = xml->GetChild(i)->GetName();
449 if (nodename.EqualTo(
"Detectors")) {
450 TGeoNode* top = gGeoManager->GetTopNode();
451 FairXMLNode* top_xml = xml->GetChild(i)->GetChild(0);
452 if (top_xml !=
nullptr) {
456 else if (nodename.EqualTo(
"MCTracksColors")) {
457 FairXMLNode* colors = xml->GetChild(i);
458 for (
int j = 0; j < colors->GetNChildren(); j++) {
459 FairXMLNode* color = colors->GetChild(j);
460 TString pgd_code = color->GetAttrib(
"pdg")->GetValue();
461 TString color_code = color->GetAttrib(
"color")->GetValue();
466 if (gEve->GetGlobalScene()->GetRnrState()) {
467 gEve->GetGlobalScene()->SetRnrState(kFALSE);
468 gEve->GetGlobalScene()->SetRnrState(kTRUE);
476 TString name = xml->GetAttrib(
"name")->GetValue();
477 TString node_name = node->GetName();
478 Bool_t recursive = (xml->GetAttrib(
"recursive")->GetValue().Length() != 0 && !name.EqualTo(node_name));
479 if (recursive && depth == 0) {
482 TString transparency = xml->GetAttrib(
"transparency")->GetValue();
483 TString color = xml->GetAttrib(
"color")->GetValue();
484 TString visibility = xml->GetAttrib(
"visibility")->GetValue();
485 TString recursive_val = xml->GetAttrib(
"recursive")->GetValue();
486 if (!recursive &&
"0" != recursive_val) {
487 LOG(info) <<
"LoadXMLDetector called for " << node_name;
489 if (!color.EqualTo(
"")) {
493 if (!transparency.EqualTo(
"")) {
494 node->GetVolume()->SetTransparency((Char_t)(transparency.Atoi()));
496 if (!visibility.EqualTo(
"")) {
497 bool bVisVal = (0 < visibility.Atoi());
498 node->SetVisibility(bVisVal);
499 node->GetVolume()->SetVisibility(bVisVal);
501 LOG(info) <<
"Setting " << node_name << (bVisVal ?
" Visible" :
" Invisible")
502 << (
"0" != recursive_val ?
" and its daughters also" :
"");
505 if (recursive_val.Length() > 0) {
506 Int_t xml_depth = recursive_val.Atoi();
510 xml_depth = depth - 1;
514 for (
int i = 0; i < node->GetNdaughters(); i++) {
515 TGeoNode* daughter_node = node->GetDaughter(i);
520 if (xml->GetNChildren() > 0 && !recursive) {
521 for (
int i = 0; i < node->GetNdaughters(); i++) {
522 TString subdetector_name = node->GetDaughter(i)->GetName();
523 for (
int j = 0; j < xml->GetNChildren(); j++) {
524 FairXMLNode* subnode = xml->GetChild(j);
525 TString subnode_name = subnode->GetAttrib(
"name")->GetValue();
526 if (subnode_name == subdetector_name) {
536 if (color.Contains(
"k")) {
537 Int_t plus_index = color.First(
'+');
538 Int_t minus_index = color.First(
'-');
539 Int_t cut = plus_index;
544 cut = color.Length();
546 TString col_name(color(0, cut));
548 if (col_name.EqualTo(
"kWhite")) {
551 else if (col_name.EqualTo(
"kBlack")) {
554 else if (col_name.EqualTo(
"kGray")) {
557 else if (col_name.EqualTo(
"kRed")) {
560 else if (col_name.EqualTo(
"kGreen")) {
563 else if (col_name.EqualTo(
"kBlue")) {
566 else if (col_name.EqualTo(
"kYellow")) {
569 else if (col_name.EqualTo(
"kMagenta")) {
572 else if (col_name.EqualTo(
"kCyan")) {
575 else if (col_name.EqualTo(
"kOrange")) {
578 else if (col_name.EqualTo(
"kSpring")) {
581 else if (col_name.EqualTo(
"kTeal")) {
584 else if (col_name.EqualTo(
"kAzure")) {
587 else if (col_name.EqualTo(
"kViolet")) {
590 else if (col_name.EqualTo(
"kPink")) {
593 TString col_num(color(cut + 1, color.Length()));
594 if (col_num.Length() > 0) {
595 if (color.Contains(
"+")) {
596 col_val += col_num.Atoi();
599 col_val -= col_num.Atoi();
614 TDatabasePDG* pdgDB = TDatabasePDG::Instance();
616 const Double_t kAu2Gev = 0.9314943228;
617 const Double_t khSlash = 1.0545726663e-27;
618 const Double_t kErg2Gev = 1 / 1.6021773349e-3;
619 const Double_t khShGev = khSlash * kErg2Gev;
620 const Double_t kYear2Sec = 3600 * 24 * 365.25;
623 if (!pdgDB->GetParticle(1000010020)) {
624 pdgDB->AddParticle(
"Deuteron",
"Deuteron", 2 * kAu2Gev + 8.071e-3, kTRUE, 0, 3,
"Ion", 1000010020);
627 if (!pdgDB->GetParticle(1000010030)) {
628 pdgDB->AddParticle(
"Triton",
"Triton", 3 * kAu2Gev + 14.931e-3, kFALSE, khShGev / (12.33 * kYear2Sec), 3,
"Ion",
632 if (!pdgDB->GetParticle(1000020040)) {
633 pdgDB->AddParticle(
"Alpha",
"Alpha", 4 * kAu2Gev + 2.424e-3, kTRUE, khShGev / (12.33 * kYear2Sec), 6,
"Ion",
637 if (!pdgDB->GetParticle(1000020030)) {
638 pdgDB->AddParticle(
"He3",
"He3", 3 * kAu2Gev + 14.931e-3, kFALSE, 0, 6,
"Ion", 1000020030);
642 if (!pdgDB->GetParticle(50000050)) {
643 pdgDB->AddParticle(
"Cherenkov",
"Cherenkov", 0, kFALSE, 0, 0,
"Special", 50000050);
646 if (!pdgDB->GetParticle(50000051)) {
647 pdgDB->AddParticle(
"FeedbackPhoton",
"FeedbackPhoton", 0, kFALSE, 0, 0,
"Special", 50000051);
708 node->GetVolume()->SetTransparency(transparency);
712 for (
int i = 0; i < node->GetNdaughters(); i++) {
713 TGeoNode* dau = node->GetDaughter(i);
720 if (gGeoManager ==
nullptr) {
723 TGeoNode* N = gGeoManager->GetTopNode();
724 TEveGeoTopNode* TNod =
new TEveGeoTopNode(gGeoManager, N, visopt, vislvl, maxvisnds);
730 gEve->AddGlobalElement(TNod);
732 gEve->FullRedraw3D(kTRUE);
733 fEvent = gEve->AddEvent(
this);
735 fTimesliceNumberText =
new TGLAnnotation(gEve->GetDefaultGLViewer(),
"TS Number: ", 0.01, 0.94);
739 fTimesliceTimeText =
new TGLAnnotation(gEve->GetDefaultGLViewer(),
"TS Time: ", 0.01, 0.90);
743 fEventNumberText =
new TGLAnnotation(gEve->GetDefaultGLViewer(),
"Event Number: ", 0.01, 0.86);
747 fEventTimeText =
new TGLAnnotation(gEve->GetDefaultGLViewer(),
"Event Time: ", 0.01, 0.82);
763 fRPhiView = gEve->SpawnNewViewer(
"RPhi View",
"");
764 fRPhiScene = gEve->SpawnNewScene(
"RPhi",
"Scene holding axis.");
767 fRhoZView = gEve->SpawnNewViewer(
"RhoZ View",
"");
768 fRhoZScene = gEve->SpawnNewScene(
"RhoZ",
"Scene holding axis.");
773 TEveWindowSlot* MultiSlot = TEveWindow::CreateWindowInTab(gEve->GetBrowser()->GetTabRight());
774 TEveWindowPack* MultiPack = MultiSlot->MakePack();
775 MultiPack->SetElementName(
"Multi View");
776 MultiPack->SetHorizontal();
777 MultiPack->SetShowTitleBar(kFALSE);
778 MultiPack->NewSlot()->MakeCurrent();
779 fMultiView = gEve->SpawnNewViewer(
"3D View (multi)",
"");
782 fMultiView->GetGLViewer()->GetLightSet()->SetLight(TGLLightSet::kLightLeft,
false);
783 fMultiView->GetGLViewer()->GetLightSet()->SetLight(TGLLightSet::kLightRight,
false);
789 MultiPack = MultiPack->NewSlot()->MakePack();
790 MultiPack->SetShowTitleBar(kFALSE);
791 MultiPack->NewSlot()->MakeCurrent();
793 MultiPack->NewSlot()->MakeCurrent();
799 fRPhiView->GetGLViewer()->SetResetCamerasOnUpdate(kFALSE);
800 fRhoZView->GetGLViewer()->SetResetCamerasOnUpdate(kFALSE);
801 fMultiView->GetGLViewer()->SetResetCamerasOnUpdate(kFALSE);
804 fMultiView->GetEveFrame()->HideAllDecorations();
811 RPhi->GetGLViewer()->SetCurrentCamera(
fRphiCam);
813 RPhi->GetGLViewer()->GetCameraOverlay()->SetOrthographicMode(TGLCameraOverlay::kAxis);
814 RPhi->GetGLViewer()->GetCameraOverlay()->SetShowOrthographic(kTRUE);
817 RPhi->GetGLViewer()->GetLightSet()->SetLight(TGLLightSet::kLightLeft,
false);
818 RPhi->GetGLViewer()->GetLightSet()->SetLight(TGLLightSet::kLightRight,
false);
819 RPhi->GetGLViewer()->GetLightSet()->SetLight(TGLLightSet::kLightTop,
false);
820 RPhi->GetGLViewer()->GetLightSet()->SetLight(TGLLightSet::kLightBottom,
false);
822 RhoZ->GetGLViewer()->SetCurrentCamera(
fRhoCam);
824 RhoZ->GetGLViewer()->GetCameraOverlay()->SetOrthographicMode(TGLCameraOverlay::kAxis);
825 RhoZ->GetGLViewer()->GetCameraOverlay()->SetShowOrthographic(kTRUE);
828 RhoZ->GetGLViewer()->GetLightSet()->SetLight(TGLLightSet::kLightLeft,
false);
829 RhoZ->GetGLViewer()->GetLightSet()->SetLight(TGLLightSet::kLightRight,
false);
830 RhoZ->GetGLViewer()->GetLightSet()->SetLight(TGLLightSet::kLightFront,
false);
833 RPhi->AddScene(gEve->GetGlobalScene());
834 RPhi->AddScene(gEve->GetEventScene());
836 RhoZ->AddScene(gEve->GetGlobalScene());
837 RhoZ->AddScene(gEve->GetEventScene());
844 fProjManagerZY =
new TEveProjectionManager(TEveProjection::kPT_RhoZ);
846 fProjManagerZX =
new TEveProjectionManager(TEveProjection::kPT_RhoZ);
852 fViewZY = gEve->SpawnNewViewer(
"ZY View",
"");
853 fSceneZY = gEve->SpawnNewScene(
"ZY",
"Scene holding axis.");
856 fViewZX = gEve->SpawnNewViewer(
"ZX View",
"");
857 fSceneZX = gEve->SpawnNewScene(
"ZX",
"Scene holding axis.");
862 TEveWindowSlot* McbmSlot = TEveWindow::CreateWindowInTab(gEve->GetBrowser()->GetTabRight());
863 TEveWindowPack* McbmPack = McbmSlot->MakePack();
864 McbmPack->SetElementName(
"mCBM View");
865 McbmPack->SetHorizontal();
866 McbmPack->SetShowTitleBar(kFALSE);
867 McbmPack->NewSlot()->MakeCurrent();
868 fMcbmView = gEve->SpawnNewViewer(
"3D View (multi)",
"");
874 fMcbmView->AddScene(gEve->GetGlobalScene());
875 fMcbmView->AddScene(gEve->GetEventScene());
877 fMcbmView->GetGLViewer()->CurrentCamera().SetCenterVecWarp(0.0, 0.0, 150.0);
880 McbmPack = McbmPack->NewSlot()->MakePack();
881 McbmPack->SetShowTitleBar(kFALSE);
882 McbmPack->NewSlot()->MakeCurrent();
883 fMcbmViewZY = gEve->SpawnNewViewer(
"ZY View (multi)",
"");
884 McbmPack->NewSlot()->MakeCurrent();
885 fMcbmViewZX = gEve->SpawnNewViewer(
"ZX View (multi)",
"");
890 fViewZY->GetGLViewer()->SetResetCamerasOnUpdate(kFALSE);
891 fViewZX->GetGLViewer()->SetResetCamerasOnUpdate(kFALSE);
892 fMcbmView->GetGLViewer()->SetResetCamerasOnUpdate(kFALSE);
893 fMcbmViewZY->GetGLViewer()->SetResetCamerasOnUpdate(kFALSE);
894 fMcbmViewZX->GetGLViewer()->SetResetCamerasOnUpdate(kFALSE);
895 fMcbmView->GetEveFrame()->HideAllDecorations();
900 fViewZY->GetGLViewer()->SetClearColor(kYellow - 10);
901 fViewZX->GetGLViewer()->SetClearColor(kYellow - 10);
902 fMcbmView->GetGLViewer()->SetClearColor(kYellow - 10);
903 fMcbmViewZY->GetGLViewer()->SetClearColor(kYellow - 10);
904 fMcbmViewZX->GetGLViewer()->SetClearColor(kYellow - 10);
909 ZY->GetGLViewer()->SetCurrentCamera(
fCamZY);
911 ZY->GetGLViewer()->GetCameraOverlay()->SetOrthographicMode(TGLCameraOverlay::kAxis);
912 ZY->GetGLViewer()->GetCameraOverlay()->SetShowOrthographic(kTRUE);
915 ZY->GetGLViewer()->GetLightSet()->SetLight(TGLLightSet::kLightLeft,
false);
917 ZY->GetGLViewer()->GetLightSet()->SetLight(TGLLightSet::kLightFront,
false);
919 ZY->GetGLViewer()->CurrentCamera().SetCenterVecWarp(0.0, 0.0, 150.0);
922 ZY->AddScene(gEve->GetGlobalScene());
923 ZY->AddScene(gEve->GetEventScene());
925 ZX->GetGLViewer()->SetCurrentCamera(
fCamZX);
927 ZX->GetGLViewer()->GetCameraOverlay()->SetOrthographicMode(TGLCameraOverlay::kAxis);
928 ZX->GetGLViewer()->GetCameraOverlay()->SetShowOrthographic(kTRUE);
931 ZX->GetGLViewer()->GetLightSet()->SetLight(TGLLightSet::kLightLeft,
false);
933 ZX->GetGLViewer()->GetLightSet()->SetLight(TGLLightSet::kLightTop,
false);
934 ZX->GetGLViewer()->GetLightSet()->SetLight(TGLLightSet::kLightBottom,
false);
936 ZX->GetGLViewer()->CurrentCamera().SetCenterVecWarp(0.0, 0.0, 150.0);
939 ZX->AddScene(gEve->GetGlobalScene());
940 ZX->AddScene(gEve->GetEventScene());
ClassImp(CbmConverterManager)
Class characterising one event by a collection of links (indices) to data objects,...
size_t GetNofData() const
TBrowser Event display for Timeslices as Tree entry with CbmEvents in container. Function as unique I...
void SetMcbmViewers(TEveViewer *ZY, TEveViewer *ZX)
TEveProjectionAxes * fAxesZX
void LoadXMLDetector(TGeoNode *node, FairXMLNode *xml, Int_t depth=0)
void SetDisplayMcbm(bool bLowRate=true, bool bMuch=false)
Select/add default set of views and some Hit and Tracks drawing classes for the mCBM 2022+ setups.
FairRootManager * fRootManager
Int_t StringToColor(TString color) const
TEveViewer * fRPhiView
CBM views.
TEveViewer * fMultiRPhiView
TGLAnnotation * fTimesliceNumberText
virtual void GotoTimeslice(uint32_t timeslice)
TEveProjectionAxes * fAxesRho
TEveProjectionManager * fProjManagerZY
virtual void SetEvtNumberText(Int_t evtNumber)
virtual void LoadXMLSettings()
TGLAnnotation * fEventTimeText
void SwitchPdgColorTrack(Bool_t pdg_color)
TGLViewer::ECameraType fCamZX
TGLAnnotation * fEventNumberText
void InitializeViewsCbm()
bool InitializeMainView(Int_t visopt, Int_t vislvl, Int_t maxvisnds)
void InitializeViewsMcbm()
void SetTransparencyForLayer(TGeoNode *node, Int_t depth, Char_t transparency)
virtual uint32_t GetCurrentTimeslice() const
void SetDisplayCbmMuon()
Select/add default set of views and some Hit and Tracks drawing classes for the CBM SIS100 muon setup...
TEveProjectionManager * fRhoZProjManager
bool fbMcbmViewersEna
mCBM views
virtual Int_t Color(Int_t pdg)
virtual void SwitchBackground(Bool_t)
virtual void NextTimeslice()
TEveProjectionManager * fRPhiProjManager
void SetDisplayTofCosmicsHd()
Select/add default set of views and some Hit and Tracks drawing classes for the HD 2023+ cosmics setu...
virtual Int_t GetCurrentEvent() const
TEveProjectionManager * fProjManagerZX
TEveViewer * fMultiRhoZView
TGLViewer::ECameraType fCamZY
void SetDisplayCbmElectron()
Select/add default set of views and some Hit and Tracks drawing classes for the CBM SIS100 electron s...
void AddParticlesToPdgDataBase()
void AddTask(FairTask *t)
virtual void SetTsNumberText(Int_t tsNumber)
virtual void DisplaySettings()
virtual void GotoEvent(Int_t event)
void SetViewers(TEveViewer *RPhi, TEveViewer *RhoZ)
TClonesArray * fCbmEvents
virtual void SetEvtTimeText(Double_t time)
virtual void SetTransparency(Bool_t use_xml, Int_t trans)
static CbmTimesliceManager * gRinstanceTsMan
static CbmTimesliceManager * Instance()
virtual void PrevTimeslice()
TGLViewer::ECameraType fRhoCam
double_t GetTimesliceTime()
current time in ns to display in the event display.
virtual void Init(Int_t visopt=1, Int_t vislvl=3, Int_t maxvisnds=10000)
TGLViewer::ECameraType fRphiCam
TEveProjectionAxes * fAxesPhi
void MakeScreenshot(CbmTsEveAnimationControl::eScreenshotType screenshotType, TString def_path="")
Screenshot(s) generation: to be called by GUI element.
double_t GetEventTime()
current time in ns to display in the event display.
std::map< int, int > fPDGToColor
virtual void SetTsTimeText(Double_t time)
TEveProjectionAxes * fAxesZY
TGLAnnotation * fTimesliceTimeText
Interface class to add Cbm Hits drawing (derived from PixelHit) to CbmTimesliceManager....