Complex example showing ALICE ESD track visualization.
No ALICE code is needed, only four simple coordinate-transformation functions declared in this macro.
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.
To be able to access the event data in a natural way, by using data-members of classes and object containers, the header files and class dictionaries are automatically generated from the TStreamerInfo classes stored in the ESD file by using the TFile::MakeProject() function. The header files and a shared library is created in the aliesd/ directory and can be loaded dynamically into the ROOT session.
Most common use of the event-display is to browse through a collection of events. Thus a simple GUI allowing this is created in the function make_gui().
Eve uses the configurable ROOT-browser as its main window and so we create an extra tab in the left working area of the browser and provide backward/forward buttons.
As this is a simple macro, we store the information about the current event in the global variable 'Int_t esd_event_id'. The functions for event-navigation simply modify this variable and call the load_event() function which does the following:
#include "aliesd/AliESDEvent.h"
#include "aliesd/AliESDfriend.h"
#include "aliesd/AliESDtrack.h"
#include "aliesd/AliESDRun.h"
class AliExternalTrackParam;
void make_gui();
void load_event();
void alice_esd_read();
AliESDtrack* at,
AliExternalTrackParam* tp=0);
void trackGetPos(AliExternalTrackParam* tp,
Double_t r[3]);
void trackGetMomentum(AliExternalTrackParam* tp,
Double_t p[3]);
Double_t trackGetP(AliExternalTrackParam* tp);
const char* esd_file_name = "http://root.cern.ch/files/alice_ESDs.root";
const char* esd_friends_file_name = nullptr;
const char* esd_geom_file_name =
"http://root.cern.ch/files/alice_ESDgeometry.root";
TFile *esd_file =
nullptr;
TFile *esd_friends_file =
nullptr;
TTree *esd_tree =
nullptr;
AliESDEvent *esd = nullptr;
TList *esd_objs =
nullptr;
AliESDfriend *esd_friend = nullptr;
MultiView *gMultiView = nullptr;
void run_alice_esd()
{
printf("*** Opening ESD ***\n");
if (!esd_file)
return;
esd_tree = (
TTree*) esd_file->
Get(
"esdTree");
esd_objs = esd->fESDObjects;
if (esd_friends_file_name != 0)
{
printf("*** Opening ESD-friends ***\n");
esd_friends_file =
TFile::Open(esd_friends_file_name,
"CACHEREAD");
if (!esd_friends_file)
return;
}
{
while ((el = (
TNamed*)next()))
{
if (bname == "AliESDfriend")
{
}
else
{
if (br)
{
}
else
{
if (br)
{
}
else
{
Warning(
"AliESDEvent::ReadFromTree() "
"No Branch found with Name '%s' or '%s.'.",
bname.Data(),bname.Data());
}
}
}
}
}
{
if (!geom)
return;
delete geom;
}
gMultiView = new MultiView;
gMultiView->ImportGeomRPhi(gGeomGentle);
gMultiView->ImportGeomRhoZ(gGeomGentle);
fgHtmlSummary = new HtmlSummary("Alice Event Display Summary Table");
fgHtml =
new TGHtml(0, 100, 100);
fgHtml->MapSubwindows();
make_gui();
load_event();
}
void load_event()
{
printf("Loading event %d.\n", esd_event_id);
if (gTrackList)
alice_esd_read();
gMultiView->DestroyEventRPhi();
gMultiView->ImportEventRPhi(top);
gMultiView->DestroyEventRhoZ();
gMultiView->ImportEventRhoZ(top);
update_html_summary();
}
class EvNavHandler
{
public:
void Fwd()
{
if (esd_event_id < esd_tree->GetEntries() - 1) {
++esd_event_id;
load_event();
} else {
printf("Already at last event.\n");
}
}
void Bck()
{
if (esd_event_id > 0) {
--esd_event_id;
load_event();
} else {
printf("Already at first event.\n");
}
}
};
void make_gui()
{
{
EvNavHandler *fh = new EvNavHandler;
b->Connect(
"Clicked()",
"EvNavHandler", fh,
"Bck()");
b->Connect(
"Clicked()",
"EvNavHandler", fh,
"Fwd()");
}
}
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
};
void alice_esd_read()
{
AliESDRun *esdrun = (AliESDRun*) esd_objs->
FindObject(
"AliESDRun");
if (gTrackList == 0)
{
}
{
AliESDtrack* at = (AliESDtrack*)
tracks->At(
n);
AliExternalTrackParam* tp = at;
if (! trackIsOn(at, kITSrefit)) {
tp = at->fIp;
}
TEveTrack* track = esd_make_track(trkProp,
n, at, tp);
}
}
AliESDtrack* at,
AliExternalTrackParam* tp)
{
if (tp == 0) tp = at;
rt.
fSign = (tp->fP[4] > 0) ? 1 : -1;
trackGetPos(tp, vbuf); rt.
fV.
Set(vbuf);
trackGetMomentum(tp, pbuf); rt.
fP.
Set(pbuf);
return track;
}
{
return (t->fFlags & mask) > 0;
}
void trackGetPos(AliExternalTrackParam* tp,
Double_t r[3])
{
r[0] = tp->fX;
r[1] = tp->fP[0];
r[2] = tp->fP[1];
r[0] =
x*cs -
r[1]*sn;
r[1] =
x*sn +
r[1]*cs;
}
void trackGetMomentum(AliExternalTrackParam* tp,
Double_t p[3])
{
p[0] = tp->fP[4]; p[1] = tp->fP[2]; p[2] = tp->fP[3];
p[0]=
pt*(
r*cs - p[1]*sn); p[1]=
pt*(p[1]*cs +
r*sn); p[2]=
pt*p[2];
}
Double_t trackGetP(AliExternalTrackParam* tp)
{
}
Multi-view (3d, rphi, rhoz) service class using EVE Window Manager.
void Warning(const char *location, const char *msgfmt,...)
Use this function in warning situations.
R__EXTERN TEveManager * gEve
char * Form(const char *fmt,...)
R__EXTERN TSystem * gSystem
Html table and event summary for alice_esd.C.
A TTree is a list of TBranches.
virtual void SetAddress(void *add)
Set address of this branch.
An array of clone (identical) objects.
TObject * Get(const char *namecycle) override
Return pointer to object identified by namecycle.
Specialization of TRootBrowser for Eve.
virtual void SetElementName(const char *name)
Virtual function for setting of name of an element.
Base class for TEveUtil visualization elements, providing hierarchy management, rendering control and...
virtual void AddElement(TEveElement *el)
Add el to the list of children.
virtual void DestroyElements()
Destroy all children of this element.
Wrapper for TGeoShape with absolute positioning and color attributes allowing display of extracted TG...
static TEveGeoShape * ImportShapeExtract(TEveGeoShapeExtract *gse, TEveElement *parent=0)
Import a shape extract 'gse' under element 'parent'.
TEveViewerList * GetViewers() const
void AddElement(TEveElement *element, TEveElement *parent=0)
Add an element.
void AddGlobalElement(TEveElement *element, TEveElement *parent=0)
Add a global element, i.e.
TEveBrowser * GetBrowser() const
static TEveManager * Create(Bool_t map_window=kTRUE, Option_t *opt="FIV")
If global TEveManager* gEve is not set initialize it.
void Redraw3D(Bool_t resetCameras=kFALSE, Bool_t dropLogicals=kFALSE)
TEveEventManager * GetCurrentEvent() const
A list of tracks supporting change of common attributes and selection based on track parameters.
virtual void SetMarkerStyle(Style_t s)
Set marker style for the list and the elements.
virtual void SetMarkerColor(Color_t c)
Set marker color for the list and the elements.
void MakeTracks(Bool_t recurse=kTRUE)
Regenerate the visual representations of tracks.
virtual void SetMainColor(Color_t c)
Set main (line) color for the list and the elements.
TEveTrackPropagator * GetPropagator()
virtual void SetMarkerSize(Size_t s)
Set marker size for the list and the elements.
Holding structure for a number of track rendering parameters.
void SetMagField(Double_t bX, Double_t bY, Double_t bZ)
Set constant magnetic field and rebuild tracks.
Visual representation of a track.
void SetAttLineAttMarker(TEveTrackList *tl)
Set line and marker attributes from TEveTrackList.
virtual void SetStdTitle()
Set standard track title based on most data-member values.
void Set(const Float_t *v)
void DeleteAnnotations()
Delete annotations from all viewers.
Encapsulates TGFrame into an eve-window.
static TEveWindowSlot * CreateWindowInTab(TGTab *tab, TEveWindow *eve_parent=0)
Create a new tab in a given tab-widget and populate it with a default window-slot.
A ROOT file is a suite of consecutive data records (TKey instances) with a well defined format.
static Bool_t SetCacheFileDir(ROOT::Internal::TStringView cacheDir, Bool_t operateDisconnected=kTRUE, Bool_t forceCacheread=kFALSE)
static TFile * Open(const char *name, Option_t *option="", const char *ftitle="", Int_t compress=ROOT::RCompressionSetting::EDefaults::kUseCompiledDefault, Int_t netopt=0)
Create / open a file.
void Close(Option_t *option="") override
Close a file.
virtual void AddFrame(TGFrame *f, TGLayoutHints *l=0)
Add frame to the composite frame using the specified layout hints.
virtual void SetCleanup(Int_t mode=kLocalCleanup)
Turn on automatic cleanup of child frames in dtor.
virtual void MapSubwindows()
Map all sub windows that are part of the composite frame.
virtual void Resize(UInt_t w=0, UInt_t h=0)
Resize the frame.
virtual void MapWindow()
map window
A composite frame that layout their children in horizontal way.
Defines top level windows that interact with the system Window Manager.
void SetWindowName(const char *name=0)
Set window name. This is typically done via the window manager.
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...
virtual TObject ** GetObjectRef(const TObject *obj) const
Return address of pointer to obj.
virtual TObject * FindObject(const char *name) const
Find an object in this list using its name.
The TNamed class is the base class for all named ROOT classes.
Mother of all ROOT objects.
virtual const char * GetName() const
Returns name of object.
virtual void SetName(const char *name)
Change (i.e.
void StartEmbedding(Int_t pos=kRight, Int_t subpos=-1) override
Start embedding external frame in the tab "pos" and tab element "subpos".
void SetTabTitle(const char *title, Int_t pos=kRight, Int_t subpos=-1)
Set text "title" of Tab "subpos" in TGTab "pos".
void StopEmbedding(const char *name=nullptr) override
TGTab * GetTabRight() const
virtual const char * Getenv(const char *env)
Get environment variable.
A TTree represents a columnar dataset.
virtual TBranch * GetBranch(const char *name)
Return pointer to the branch with the given name in this tree or its friends.
virtual Int_t GetEntry(Long64_t entry, Int_t getall=0)
Read all branches of entry and return total number of bytes read.
virtual TList * GetUserInfo()
Return a pointer to the list containing user objects associated to this tree.
virtual void SetBranchStatus(const char *bname, Bool_t status=1, UInt_t *found=0)
Set branch status to Process or DoNotProcess.
Double_t Sqrt(Double_t x)