Logo ROOT   6.18/05
Reference Guide
alice_vsd.C File Reference

Detailed Description

Complex example showing ALICE VSD visualization.

alice_vsd.C - a simple event-display for ALICE

Only standard ROOT is used to process the ALICE VSD files.

No ALICE code is needed – the VSD file is exported from AliRoot into VSD format – see TEveVSDStructs.h and TEveVSD.h.

A simple geometry of 10KB, extracted from the full TGeo-geometry, is used to outline the central detectors of ALICE.

All files are access from the web by using the "CACHEREAD" option.

#include <TEveManager.h>
#include <TEveVSD.h>
#include <TEveVSDStructs.h>
#include <TEveTrack.h>
#include <TEveGeoShape.h>
#include <TGTab.h>
#include <TGButton.h>
#include <TFile.h>
#include <TKey.h>
#include <TSystem.h>
#include <TPRegexp.h>
// Include components -- compile time link :)
#include "MultiView.C"
MultiView* gMultiView = 0;
class TVSDReader
{
public:
// ----------------------------------------------------------
// File / Event Data
// ----------------------------------------------------------
TFile *fFile;
TDirectory *fDirectory;
TObjArray *fEvDirKeys;
TEveVSD *fVSD;
Int_t fMaxEv, fCurEv;
// ----------------------------------------------------------
// Event visualization structures
// ----------------------------------------------------------
TEveTrackList *fTrackList;
TEvePointSet *fITSClusters;
TEvePointSet *fTPCClusters;
TEvePointSet *fTRDClusters;
TEvePointSet *fTOFClusters;
public:
TVSDReader(const char* file_name) :
fFile(0), fDirectory(0), fEvDirKeys(0),
fVSD(0),
fMaxEv(-1), fCurEv(-1),
fTrackList(0),
fITSClusters(0), fTPCClusters(0), fTRDClusters(0), fTOFClusters(0)
{
fFile = TFile::Open(file_name);
if (!fFile)
{
Error("VSD_Reader", "Can not open file '%s' ... terminating.",
file_name);
}
fEvDirKeys = new TObjArray;
TPMERegexp name_re("Event\\d+");
TObjLink* lnk = fFile->GetListOfKeys()->FirstLink();
while (lnk) {
if (name_re.Match(lnk->GetObject()->GetName()))
{
fEvDirKeys->Add(lnk->GetObject());
}
lnk = lnk->Next();
}
fMaxEv = fEvDirKeys->GetEntriesFast();
if (fMaxEv == 0) {
Error("VSD_Reader", "No events to show ... terminating.");
}
fVSD = new TEveVSD;
}
virtual ~TVSDReader()
{
// Destructor.
DropEvent();
delete fVSD;
delete fEvDirKeys;
fFile->Close();
delete fFile;
}
void AttachEvent()
{
// Attach event data from current directory.
fVSD->LoadTrees();
}
void DropEvent()
{
// Drup currently held event data, release current directory.
// Drop old visualization structures.
// Drop old event-data.
fVSD->DeleteTrees();
delete fDirectory;
fDirectory = 0;
}
//---------------------------------------------------------------------------
// Event navigation
//---------------------------------------------------------------------------
void NextEvent()
{
GotoEvent(fCurEv + 1);
}
void PrevEvent()
{
GotoEvent(fCurEv - 1);
}
Bool_t GotoEvent(Int_t ev)
{
if (ev < 0 || ev >= fMaxEv)
{
Warning("GotoEvent", "Invalid event id %d.", ev);
return kFALSE;
}
DropEvent();
// Connect to new event-data.
fCurEv = ev;
fDirectory = (TDirectory*) ((TKey*) fEvDirKeys->At(fCurEv))->ReadObj();
fVSD->SetDirectory(fDirectory);
AttachEvent();
// Load event data into visualization structures.
LoadClusters(fITSClusters, "ITS", 0);
LoadClusters(fTPCClusters, "TPC", 1);
LoadClusters(fTRDClusters, "TRD", 2);
LoadClusters(fTOFClusters, "TOF", 3);
LoadEsdTracks();
// Fill projected views.
auto top = gEve->GetCurrentEvent();
gMultiView->DestroyEventRPhi();
gMultiView->ImportEventRPhi(top);
gMultiView->DestroyEventRhoZ();
gMultiView->ImportEventRhoZ(top);
return kTRUE;
}
//---------------------------------------------------------------------------
// Cluster loading
//---------------------------------------------------------------------------
void LoadClusters(TEvePointSet*& ps, const TString& det_name, Int_t det_id)
{
if (ps == 0) {
ps = new TEvePointSet(det_name);
ps->SetMainColor((Color_t)(det_id + 2));
ps->SetMarkerSize(0.5);
ps->SetMarkerStyle(2);
ps->IncDenyDestroy();
} else {
ps->Reset();
}
TEvePointSelector ss(fVSD->fTreeC, ps, "fV.fX:fV.fY:fV.fZ",
TString::Format("fDetId==%d", det_id));
ss.Select();
ps->SetTitle(TString::Format("N=%d", ps->Size()));
}
//---------------------------------------------------------------------------
// Track loading
//---------------------------------------------------------------------------
enum ESDTrackFlags
{
kITSin=0x0001,kITSout=0x0002,kITSrefit=0x0004,kITSpid=0x0008,
kTPCin=0x0010,kTPCout=0x0020,kTPCrefit=0x0040,kTPCpid=0x0080,
kTRDin=0x0100,kTRDout=0x0200,kTRDrefit=0x0400,kTRDpid=0x0800,
kTOFin=0x1000,kTOFout=0x2000,kTOFrefit=0x4000,kTOFpid=0x8000,
kHMPIDpid=0x20000,
kEMCALmatch=0x40000,
kTRDbackup=0x80000,
kTRDStop=0x20000000,
kESDpid=0x40000000,
kTIME=0x80000000
};
Bool_t trackIsOn(TEveTrack* t, Int_t mask)
{
// Check is track-flag specified by mask are set.
return (t->GetStatus() & mask) > 0;
}
void LoadEsdTracks()
{
// Read reconstructed tracks from current event.
if (fTrackList == 0) {
fTrackList = new TEveTrackList("ESD Tracks");
fTrackList->SetMainColor(6);
fTrackList->SetMarkerColor(kYellow);
fTrackList->SetMarkerStyle(4);
fTrackList->SetMarkerSize(0.5);
fTrackList->IncDenyDestroy();
} else {
fTrackList->DestroyElements();
}
auto trkProp = fTrackList->GetPropagator();
// !!!! Need to store field on file !!!!
// Can store TEveMagField ?
trkProp->SetMagField(0.5);
trkProp->SetStepper(TEveTrackPropagator::kRungeKutta);
Int_t nTracks = fVSD->fTreeR->GetEntries();
for (Int_t n = 0; n < nTracks; ++n) {
fVSD->fTreeR->GetEntry(n);
TEveTrack* track = new TEveTrack(&fVSD->fR, trkProp);
track->SetName(Form("ESD Track %d", fVSD->fR.fIndex));
track->SetStdTitle();
track->SetAttLineAttMarker(fTrackList);
fTrackList->AddElement(track);
}
fTrackList->MakeTracks();
gEve->AddElement(fTrackList);
}
ClassDef(TVSDReader, 0);
};
TVSDReader* gVSDReader = 0;
// Forward declaration.
void make_gui();
//______________________________________________________________________________
void alice_vsd(const char* vsd_file_name=
"http://mtadel.home.cern.ch/mtadel/root/AliVSD.root")
{
// Main function, initializes the application.
//
// 1. Load the auto-generated library holding ESD classes and
// ESD dictionaries.
// 2. Open ESD data-files.
// 3. Load cartoon geometry.
// 4. Spawn simple GUI.
// 5. Load first event.
gVSDReader = new TVSDReader(vsd_file_name);
TEveGeoShape *gentle_geom = 0;
{ // Simple geometry
auto geom =
TFile::Open("http://mtadel.home.cern.ch/mtadel/root/alice_mini_geom.root",
"CACHEREAD");
if (!geom)
return;
auto gse = (TEveGeoShapeExtract*) geom->Get("Gentle");
gentle_geom = TEveGeoShape::ImportShapeExtract(gse, 0);
geom->Close();
delete geom;
gEve->AddGlobalElement(gentle_geom);
}
// Standard multi-view
//=====================
gMultiView = new MultiView;
gMultiView->f3DView->GetGLViewer()->SetStyle(TGLRnrCtx::kOutline);
gMultiView->SetDepth(-10);
gMultiView->ImportGeomRPhi(gentle_geom);
gMultiView->ImportGeomRhoZ(gentle_geom);
gMultiView->SetDepth(0);
// Final stuff
//=============
make_gui();
gEve->AddEvent(new TEveEventManager("Event", "ALICE VSD Event"));
gVSDReader->GotoEvent(0);
gEve->Redraw3D(kTRUE); // Reset camera after the first event has been shown.
}
//______________________________________________________________________________
void make_gui()
{
// Create minimal GUI for event navigation.
auto browser = gEve->GetBrowser();
auto frmMain = new TGMainFrame(gClient->GetRoot(), 1000, 600);
frmMain->SetWindowName("XX GUI");
frmMain->SetCleanup(kDeepCleanup);
auto hf = new TGHorizontalFrame(frmMain);
{
TString icondir(TString::Format("%s/icons/", gSystem->Getenv("ROOTSYS")));
b = new TGPictureButton(hf, gClient->GetPicture(icondir+"GoBack.gif"));
hf->AddFrame(b);
b->Connect("Clicked()", "TVSDReader", gVSDReader, "PrevEvent()");
b = new TGPictureButton(hf, gClient->GetPicture(icondir+"GoForward.gif"));
hf->AddFrame(b);
b->Connect("Clicked()", "TVSDReader", gVSDReader, "NextEvent()");
}
frmMain->AddFrame(hf);
frmMain->MapSubwindows();
frmMain->Resize();
frmMain->MapWindow();
browser->StopEmbedding();
browser->SetTabTitle("Event Control", 0);
}
Multi-view (3d, rphi, rhoz) service class using EVE Window Manager.
#define b(i)
Definition: RSha256.hxx:100
int Int_t
Definition: RtypesCore.h:41
const Bool_t kFALSE
Definition: RtypesCore.h:88
bool Bool_t
Definition: RtypesCore.h:59
short Color_t
Definition: RtypesCore.h:79
const Bool_t kTRUE
Definition: RtypesCore.h:87
#define ClassDef(name, id)
Definition: Rtypes.h:326
@ kYellow
Definition: Rtypes.h:64
void Error(const char *location, const char *msgfmt,...)
void Warning(const char *location, const char *msgfmt,...)
R__EXTERN TEveManager * gEve
Definition: TEveManager.h:243
#define gClient
Definition: TGClient.h:166
@ kDeepCleanup
Definition: TGFrame.h:51
char * Form(const char *fmt,...)
R__EXTERN TSystem * gSystem
Definition: TSystem.h:560
virtual TList * GetListOfKeys() const
Describe directory structure in memory.
Definition: TDirectory.h:34
virtual void AddElement(TEveElement *el)
Add el to the list of children.
void IncDenyDestroy()
Increases the deny-destroy count of the element.
virtual void DestroyElements()
Destroy all children of this element.
Base class for event management and navigation.
Globally positioned TGeoShape with rendering attributes and an optional list of daughter shape-extrac...
Wrapper for TGeoShape with absolute positioning and color attributes allowing display of extracted TG...
Definition: TEveGeoShape.h:24
static TEveGeoShape * ImportShapeExtract(TEveGeoShapeExtract *gse, TEveElement *parent=0)
Import a shape extract 'gse' under element 'parent'.
TEveViewerList * GetViewers() const
Definition: TEveManager.h:145
void AddElement(TEveElement *element, TEveElement *parent=0)
Add an element.
void AddGlobalElement(TEveElement *element, TEveElement *parent=0)
Add a global element, i.e.
TGLViewer * GetDefaultGLViewer() const
Get TGLViewer of the default TEveViewer.
TEveBrowser * GetBrowser() const
Definition: TEveManager.h:137
static TEveManager * Create(Bool_t map_window=kTRUE, Option_t *opt="FIV")
If global TEveManager* gEve is not set initialize it.
TGListTreeItem * AddEvent(TEveEventManager *event)
Add a new event and make it the current event.
void Redraw3D(Bool_t resetCameras=kFALSE, Bool_t dropLogicals=kFALSE)
Definition: TEveManager.h:168
TEveEventManager * GetCurrentEvent() const
Definition: TEveManager.h:149
TEvePointSelector is a sub-class of TSelectorDraw for direct extraction of point-like data from a Tre...
Definition: TEveTreeTools.h:67
TEvePointSet is a render-element holding a collection of 3D points with optional per-point TRef and a...
Definition: TEvePointSet.h:36
A list of tracks supporting change of common attributes and selection based on track parameters.
Definition: TEveTrack.h:140
virtual void SetMarkerStyle(Style_t s)
Set marker style for the list and the elements.
Definition: TEveTrack.cxx:901
virtual void SetMarkerColor(Color_t c)
Set marker color for the list and the elements.
Definition: TEveTrack.cxx:933
void MakeTracks(Bool_t recurse=kTRUE)
Regenerate the visual representations of tracks.
Definition: TEveTrack.cxx:639
virtual void SetMainColor(Color_t c)
Set main (line) color for the list and the elements.
Definition: TEveTrack.cxx:805
TEveTrackPropagator * GetPropagator()
Definition: TEveTrack.h:175
virtual void SetMarkerSize(Size_t s)
Set marker size for the list and the elements.
Definition: TEveTrack.cxx:965
void SetMagField(Double_t bX, Double_t bY, Double_t bZ)
Set constant magnetic field and rebuild tracks.
Visual representation of a track.
Definition: TEveTrack.h:33
void SetAttLineAttMarker(TEveTrackList *tl)
Set line and marker attributes from TEveTrackList.
Definition: TEveTrack.cxx:322
Int_t GetStatus() const
Definition: TEveTrack.h:104
virtual void SetStdTitle()
Set standard track title based on most data-member values.
Definition: TEveTrack.cxx:268
Visualization Summary Data - a collection of trees holding standard event data in experiment independ...
Definition: TEveVSD.h:20
static void DisableTObjectStreamersForVSDStruct()
Disable TObject streamers for those VSD structs that inherit from TObject directly.
Definition: TEveVSD.cxx:204
TEveRecTrack fR
Definition: TEveVSD.h:44
virtual void SetBranchAddresses()
Set branche addresses of internal trees.
Definition: TEveVSD.cxx:122
virtual void DeleteTrees()
Delete internal trees.
Definition: TEveVSD.cxx:88
virtual void SetDirectory(TDirectory *dir)
Set directory in which the trees are (or will be) created.
Definition: TEveVSD.cxx:64
TTree * fTreeC
Hits.
Definition: TEveVSD.h:34
virtual void LoadTrees()
Load internal trees from directory.
Definition: TEveVSD.cxx:149
TTree * fTreeR
Clusters.
Definition: TEveVSD.h:35
void SwitchColorSet()
Switch background color.
Definition: TEveViewer.cxx:658
void DeleteAnnotations()
Delete annotations from all viewers.
Definition: TEveViewer.cxx:475
A ROOT file is a suite of consecutive data records (TKey instances) with a well defined format.
Definition: TFile.h:48
virtual void Close(Option_t *option="")
Close a file.
Definition: TFile.cxx:914
static Bool_t SetCacheFileDir(ROOT::Internal::TStringView cacheDir, Bool_t operateDisconnected=kTRUE, Bool_t forceCacheread=kFALSE)
Definition: TFile.h:316
static TFile * Open(const char *name, Option_t *option="", const char *ftitle="", Int_t compress=ROOT::RCompressionSetting::EDefaults::kUseGeneralPurpose, Int_t netopt=0)
Create / open a file.
Definition: TFile.cxx:3980
@ kOutline
Definition: TGLRnrCtx.h:47
void SetStyle(Short_t st)
virtual Bool_t SetTab(Int_t tabIndex, Bool_t emit=kTRUE)
Brings the composite frame with the index tabIndex to the front and generate the following event if t...
Definition: TGTab.cxx:507
Book space in a file, create I/O buffers, to fill them, (un)compress them.
Definition: TKey.h:24
virtual TObjLink * FirstLink() const
Definition: TList.h:108
An array of TObjects.
Definition: TObjArray.h:37
Int_t GetEntriesFast() const
Definition: TObjArray.h:64
void Add(TObject *obj)
Definition: TObjArray.h:74
TObject * At(Int_t idx) const
Definition: TObjArray.h:166
virtual const char * GetName() const
Returns name of object.
Definition: TObject.cxx:357
Wrapper for PCRE library (Perl Compatible Regular Expressions).
Definition: TPRegexp.h:97
virtual void SetName(const char *name)
Change (i.e.
virtual void StartEmbedding(Int_t pos=kRight, Int_t subpos=-1)
Start embedding external frame in the tab "pos" and tab element "subpos".
TGTab * GetTabRight() const
Definition: TRootBrowser.h:141
Basic string class.
Definition: TString.h:131
static TString Format(const char *fmt,...)
Static method which formats a string using a printf style format descriptor and return a TString.
Definition: TString.cxx:2311
virtual const char * Getenv(const char *env)
Get environment variable.
Definition: TSystem.cxx:1652
virtual void Exit(int code, Bool_t mode=kTRUE)
Exit the application.
Definition: TSystem.cxx:725
virtual Long64_t GetEntries() const
Definition: TTree.h:402
virtual Int_t GetEntry(Long64_t entry=0, Int_t getall=0)
Read all branches of entry and return total number of bytes read.
Definition: TTree.cxx:5422
const Int_t n
Definition: legend1.C:16
static constexpr double ps
Author
Matevz Tadel

Definition in file alice_vsd.C.