Logo ROOT  
Reference Guide
 
Loading...
Searching...
No Matches
run_alice_esd.C File Reference

Detailed Description

Complex example showing ALICE ESD track visualization.

alice_esd.C - a simple event-display for ALICE ESD tracks and clusters

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

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.

Automatic building of ALICE ESD class declarations and dictionaries.

ALICE ESD is a TTree containing tracks and other event-related information with one entry per event. All these classes are part of the AliROOT offline framework and are not available to standard ROOT.

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.

See the run_alice_esd.C macro.

Creation of simple GUI for event navigation.

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.

Event-navigation functions.

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:

  1. drop the old visualization objects;
  2. retrieve given event from the ESD tree;
  3. call alice_esd_read() function to create visualization objects for the new event.

Reading of ALICE data and creation of visualization objects.

This is performed in alice_esd_read() function, with the following steps:

  1. create the track container object - TEveTrackList;
  2. iterate over the ESD tracks, create TEveTrack objects and append them to the container;
  3. instruct the container to extrapolate the tracks and set their visual attributes.
#include "MultiView.C"
// Forward declarations.
#include "aliesd/AliESDEvent.h"
#include "aliesd/AliESDfriend.h"
#include "aliesd/AliESDtrack.h"
#include "aliesd/AliESDRun.h"
void make_gui();
void load_event();
// Configuration and global variables.
const char *esd_file_name = "http://root.cern.ch/files/alice_ESDs.root";
// Temporarily disable reading of ESD friend.
// There seems to be no way to get it working without AliRoot.
// const char* esd_friends_file_name =
// "http://root.cern.ch/files/alice_ESDfriends.root";
const char *esd_friends_file_name = nullptr;
const char *esd_geom_file_name = "http://root.cern.ch/files/alice_ESDgeometry.root";
// For testing
// const char* esd_file_name = "AliESDs.root";
// const char* esd_friends_file_name = "AliESDfriends.root";
TFile *esd_file = nullptr;
TTree *esd_tree = nullptr;
AliESDEvent *esd = nullptr;
TList *esd_objs = nullptr;
Int_t esd_event_id = 0; // Current event id.
// Implemented in MultiView.C
MultiView *gMultiView = nullptr;
/******************************************************************************/
// Initialization and steering functions
/******************************************************************************/
//______________________________________________________________________________
{
// 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.
const TString weh("alice_esd()");
printf("*** Opening ESD ***\n");
if (!esd_file)
return;
esd_tree = (TTree *)esd_file->Get("esdTree");
esd = (AliESDEvent *)esd_tree->GetUserInfo()->FindObject("AliESDEvent");
esd_objs = esd->fESDObjects;
printf("*** Opening ESD-friends ***\n");
return;
esd_tree->SetBranchStatus("ESDfriend*", 1);
}
// Set the branch addresses.
{
TIter next(esd_objs);
while ((el = (TNamed *)next())) {
TString bname(el->GetName());
if (bname == "AliESDfriend") {
// AliESDfriend needs special treatment.
TBranch *br = esd_tree->GetBranch("ESDfriend.");
br->SetAddress(esd_objs->GetObjectRef(el));
} else {
TBranch *br = esd_tree->GetBranch(bname);
if (br) {
br->SetAddress(esd_objs->GetObjectRef(el));
} else {
br = esd_tree->GetBranch(bname + ".");
if (br) {
br->SetAddress(esd_objs->GetObjectRef(el));
} else {
Warning("AliESDEvent::ReadFromTree() "
"No Branch found with Name '%s' or '%s.'.",
bname.Data(), bname.Data());
}
}
}
}
}
{ // Simple geometry
if (!geom)
return;
geom->Close();
delete geom;
}
// Standard multi-view
//=====================
gMultiView->ImportGeomRPhi(gGeomGentle);
gMultiView->ImportGeomRhoZ(gGeomGentle);
// HTML summary view
//===================
fgHtmlSummary = new HtmlSummary("Alice Event Display Summary Table");
fgHtml = new TGHtml(0, 100, 100);
TEveWindowFrame *wf = slot->MakeFrame(fgHtml);
fgHtml->MapSubwindows();
wf->SetElementName("Summary");
// Final stuff
//=============
gEve->Redraw3D(kTRUE); // Reset camera after the first event has been shown.
}
//______________________________________________________________________________
void load_event()
{
// Load event specified in global esd_event_id.
// The contents of previous event are removed.
printf("Loading event %d.\n", esd_event_id);
gTrackList->DestroyElements();
esd_tree->GetEntry(esd_event_id);
// esd_tree->Show();
gMultiView->DestroyEventRPhi();
gMultiView->ImportEventRPhi(top);
gMultiView->DestroyEventRhoZ();
gMultiView->ImportEventRhoZ(top);
}
/******************************************************************************/
// GUI
/******************************************************************************/
//______________________________________________________________________________
//
// EvNavHandler class is needed to connect GUI signals.
class EvNavHandler {
public:
void Fwd()
{
if (esd_event_id < esd_tree->GetEntries() - 1) {
} else {
printf("Already at last event.\n");
}
}
void Bck()
{
if (esd_event_id > 0) {
} else {
printf("Already at first event.\n");
}
}
};
//______________________________________________________________________________
void make_gui()
{
// Create minimal GUI for event navigation.
browser->StartEmbedding(TRootBrowser::kLeft);
TGMainFrame *frmMain = new TGMainFrame(gClient->GetRoot(), 1000, 600);
frmMain->SetWindowName("XX GUI");
frmMain->SetCleanup(kDeepCleanup);
{
TString icondir(Form("%s/icons/", gSystem->Getenv("ROOTSYS")));
b = new TGPictureButton(hf, gClient->GetPicture(icondir + "GoBack.gif"));
hf->AddFrame(b);
b->Connect("Clicked()", "EvNavHandler", fh, "Bck()");
b = new TGPictureButton(hf, gClient->GetPicture(icondir + "GoForward.gif"));
hf->AddFrame(b);
b->Connect("Clicked()", "EvNavHandler", fh, "Fwd()");
}
frmMain->AddFrame(hf);
frmMain->MapSubwindows();
frmMain->Resize();
frmMain->MapWindow();
browser->StopEmbedding();
browser->SetTabTitle("Event Control", 0);
}
/******************************************************************************/
// Code for reading AliESD and creating visualization objects
/******************************************************************************/
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
};
//______________________________________________________________________________
{
// Read tracks and associated clusters from current event.
AliESDRun *esdrun = (AliESDRun *)esd_objs->FindObject("AliESDRun");
TClonesArray *tracks = (TClonesArray *)esd_objs->FindObject("Tracks");
// This needs further investigation. Clusters not shown.
// esd_friend = (AliESDfriend*) esd_objs->FindObject("AliESDfriend");
// printf("Friend %p, n_tracks:%d\n",
// esd_friend,
// esd_friend->fTracks.GetEntries());
if (gTrackList == 0) {
gTrackList = new TEveTrackList("ESD Tracks");
gTrackList->SetMainColor(6);
gTrackList->SetMarkerColor(kYellow);
gTrackList->SetMarkerStyle(4);
gTrackList->SetMarkerSize(0.5);
}
TEveTrackPropagator *trkProp = gTrackList->GetPropagator();
trkProp->SetMagField(0.1 * esdrun->fMagneticField); // kGaus to Tesla
for (Int_t n = 0; n < tracks->GetEntriesFast(); ++n) {
// If ITS refit failed, take track parameters at inner TPC radius.
if (!trackIsOn(at, kITSrefit)) {
tp = at->fIp;
}
track->SetAttLineAttMarker(gTrackList);
gTrackList->AddElement(track);
// This needs further investigation. Clusters not shown.
// if (frnd)
// {
// AliESDfriendTrack* ft = (AliESDfriendTrack*) frnd->fTracks->At(n);
// printf("%d friend = %p\n", ft);
// }
}
gTrackList->MakeTracks();
}
//______________________________________________________________________________
{
// Helper function creating TEveTrack from AliESDtrack.
//
// Optionally specific track-parameters (e.g. at TPC entry point)
// can be specified via the tp argument.
Double_t pbuf[3], vbuf[3];
if (tp == 0)
tp = at;
rt.fLabel = at->fLabel;
rt.fIndex = index;
rt.fStatus = (Int_t)at->fFlags;
rt.fSign = (tp->fP[4] > 0) ? 1 : -1;
rt.fV.Set(vbuf);
rt.fP.Set(pbuf);
Double_t mc = 0.138; // at->GetMass(); - Complicated function, requiring PID.
rt.fBeta = ep / TMath::Sqrt(ep * ep + mc * mc);
track->SetName(Form("TEveTrack %d", rt.fIndex));
track->SetStdTitle();
return track;
}
//______________________________________________________________________________
{
// Check is track-flag specified by mask are set.
return (t->fFlags & mask) > 0;
}
//______________________________________________________________________________
{
// Get global position of starting point of tp.
r[0] = tp->fX;
r[1] = tp->fP[0];
r[2] = tp->fP[1];
Double_t cs = TMath::Cos(tp->fAlpha), sn = TMath::Sin(tp->fAlpha), x = r[0];
r[0] = x * cs - r[1] * sn;
r[1] = x * sn + r[1] * cs;
}
//______________________________________________________________________________
{
// Return global momentum vector of starting point of tp.
p[0] = tp->fP[4];
p[1] = tp->fP[2];
p[2] = tp->fP[3];
Double_t pt = 1. / TMath::Abs(p[0]);
Double_t cs = TMath::Cos(tp->fAlpha), sn = TMath::Sin(tp->fAlpha);
Double_t r = TMath::Sqrt(1 - p[1] * p[1]);
p[0] = pt * (r * cs - p[1] * sn);
p[1] = pt * (p[1] * cs + r * sn);
p[2] = pt * p[2];
}
//______________________________________________________________________________
{
// Return magnitude of momentum of tp.
return TMath::Sqrt(1. + tp->fP[3] * tp->fP[3]) / TMath::Abs(tp->fP[4]);
}
Multi-view (3d, rphi, rhoz) service class using EVE Window Manager.
#define b(i)
Definition RSha256.hxx:100
bool Bool_t
Definition RtypesCore.h:63
int Int_t
Definition RtypesCore.h:45
constexpr Bool_t kFALSE
Definition RtypesCore.h:94
double Double_t
Definition RtypesCore.h:59
constexpr Bool_t kTRUE
Definition RtypesCore.h:93
@ kYellow
Definition Rtypes.h:66
ROOT::Detail::TRangeCast< T, true > TRangeDynCast
TRangeDynCast is an adapter class that allows the typed iteration through a TCollection.
void Warning(const char *location, const char *msgfmt,...)
Use this function in warning situations.
Definition TError.cxx:229
R__EXTERN TEveManager * gEve
#define gClient
Definition TGClient.h:157
@ kDeepCleanup
Definition TGFrame.h:42
winID h TVirtualViewer3D TVirtualGLPainter p
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t mask
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t r
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t index
char * Form(const char *fmt,...)
Formats a string in a circular formatting buffer.
Definition TString.cxx:2489
R__EXTERN TSystem * gSystem
Definition TSystem.h:561
Html table and event summary for alice_esd.C.
A TTree is a list of TBranches.
Definition TBranch.h:93
An array of clone (identical) objects.
Specialization of TRootBrowser for Eve.
Base class for TEveUtil visualization elements, providing hierarchy management, rendering control and...
Definition TEveElement.h:36
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...
static TEveGeoShape * ImportShapeExtract(TEveGeoShapeExtract *gse, TEveElement *parent=nullptr)
Import a shape extract 'gse' under element 'parent'.
void AddElement(TEveElement *element, TEveElement *parent=nullptr)
Add an element.
void AddGlobalElement(TEveElement *element, TEveElement *parent=nullptr)
Add a global element, i.e.
TEveViewerList * GetViewers() const
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.
Definition TEveTrack.h:140
Holding structure for a number of track rendering parameters.
Visual representation of a track.
Definition TEveTrack.h:33
void DeleteAnnotations()
Delete annotations from all viewers.
Encapsulates TGFrame into an eve-window.
Definition TEveWindow.h:336
static TEveWindowSlot * CreateWindowInTab(TGTab *tab, TEveWindow *eve_parent=nullptr)
Create a new tab in a given tab-widget and populate it with a default window-slot.
A ROOT file is an on-disk file, usually with extension .root, that stores objects in a file-system-li...
Definition TFile.h:53
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.
Definition TFile.cxx:4088
static Bool_t SetCacheFileDir(std::string_view cacheDir, Bool_t operateDisconnected=kTRUE, Bool_t forceCacheread=kFALSE)
Sets the directory where to locally stage/cache remote files.
Definition TFile.cxx:4625
A composite frame that layout their children in horizontal way.
Definition TGFrame.h:385
The ROOT HTML widget.
Definition TGHtml.h:873
Defines top level windows that interact with the system Window Manager.
Definition TGFrame.h:397
Yield an action as soon as it is clicked.
Definition TGButton.h:228
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:558
A doubly linked list.
Definition TList.h:38
The TNamed class is the base class for all named ROOT classes.
Definition TNamed.h:29
Mother of all ROOT objects.
Definition TObject.h:41
TGTab * GetTabRight() const
Basic string class.
Definition TString.h:139
virtual const char * Getenv(const char *env)
Get environment variable.
Definition TSystem.cxx:1665
A TTree represents a columnar dataset.
Definition TTree.h:79
TPaveText * pt
Double_t x[n]
Definition legend1.C:17
const Int_t n
Definition legend1.C:16
Double_t Sqrt(Double_t x)
Returns the square root of x.
Definition TMath.h:666
Double_t Cos(Double_t)
Returns the cosine of an angle of x radians.
Definition TMath.h:598
Double_t Sin(Double_t)
Returns the sine of an angle of x radians.
Definition TMath.h:592
Short_t Abs(Short_t d)
Returns the absolute value of parameter Short_t d.
Definition TMathBase.h:123
void tracks()
Definition tracks.C:48
Author
Matevz Tadel

Definition in file run_alice_esd.C.