Merge changes from branches/dev/EVE. This branch was following development in ROOT...
[u/mrichter/AliRoot.git] / EVE / EveBase / AliEveEventManager.cxx
1 // $Id$
2 // Main authors: Matevz Tadel & Alja Mrak-Tadel: 2006, 2007
3
4 /**************************************************************************
5  * Copyright(c) 1998-2008, ALICE Experiment at CERN, all rights reserved. *
6  * See http://aliceinfo.cern.ch/Offline/AliRoot/License.html for          *
7  * full copyright notice.                                                 *
8  **************************************************************************/
9
10 #include "AliEveEventManager.h"
11 #include <TEveManager.h>
12
13 #include <AliRunLoader.h>
14 #include <AliRun.h>
15 #include <AliESDEvent.h>
16 #include <AliESDfriend.h>
17 #include <AliMagFMaps.h>
18 #include <AliCDBManager.h>
19 #include <AliHeader.h>
20 #include <AliGeomManager.h>
21
22 #include <TFile.h>
23 #include <TTree.h>
24 #include <TSystem.h>
25
26 //==============================================================================
27 //==============================================================================
28 // AliEveEventManager
29 //==============================================================================
30
31 //______________________________________________________________________________
32 //
33 // Provide interface for loading and navigating standard AliRoot data
34 // (AliRunLoader) and ESDs.
35 //
36 // Missing support for raw-data. For now this is handled individually
37 // by each sub-detector.
38 //
39 // Also provides interface to magnetic-field and geometry. Mostly
40 // intended as wrappers over standard AliRoot functionality for
41 // convenient use from visualizateion macros.
42
43 ClassImp(AliEveEventManager)
44
45 AliEveEventManager* gAliEveEvent = 0;
46
47 Bool_t AliEveEventManager::fgAssertRunLoader = kFALSE;
48 Bool_t AliEveEventManager::fgAssertESD       = kFALSE;
49
50 TString  AliEveEventManager::fgCdbUri("local://$ALICE_ROOT");
51
52 AliMagF* AliEveEventManager::fgMagField = 0;
53
54
55 AliEveEventManager::AliEveEventManager() :
56   TEveEventManager(),
57
58   fPath       (), fEventId (0),
59   fRunLoader (0),
60   fESDFile   (0), fESDTree (0), fESD (0),
61   fESDfriend (0), fESDfriendExists(kFALSE)
62 {
63   // Default constructor.
64 }
65
66 AliEveEventManager::AliEveEventManager(TString path, Int_t ev) :
67   TEveEventManager("AliEVE AliEveEventManager"),
68
69   fPath   (path), fEventId(-1),
70   fRunLoader (0),
71   fESDFile   (0), fESDTree (0), fESD (0),
72   fESDfriend (0), fESDfriendExists(kFALSE)
73 {
74   // Constructor with event-directory URL and event-id.
75
76   Open();
77   if (ev >= 0) GotoEvent(ev);
78 }
79
80 AliEveEventManager::~AliEveEventManager()
81 {
82   // Destructor.
83
84   // Somewhat unclear what to do here.
85   // In principle should close all data sources and deregister from
86   // TEveManager.
87 }
88
89 /******************************************************************************/
90
91 void AliEveEventManager::Open()
92 {
93   // Open event-data from URL specified in fPath.
94   // Attempts to create AliRunLoader() and to open ESD with ESDfriends.
95   // Warning is reported if run-loader or ESD is not found.
96   // Global data-members fgAssertRunLoader and fgAssertESD can be set
97   // to throw exceptions instead.
98
99   static const TEveException kEH("AliEveEventManager::Open ");
100
101   gSystem->ExpandPathName(fPath);
102   if (fPath[0] != '/')
103     fPath = Form("%s/%s", gSystem->WorkingDirectory(), fPath.Data());
104
105   Int_t runNo = -1;
106
107   TString gaPath(Form("%s/galice.root", fPath.Data()));
108   if (gSystem->AccessPathName(gaPath, kReadPermission) == kFALSE)
109   {
110     fRunLoader = AliRunLoader::Open(gaPath);
111     if (fRunLoader)
112     {
113       TString alicePath = fPath + "/";
114       fRunLoader->SetDirName(alicePath);
115
116       if (fRunLoader->LoadgAlice() != 0)
117         Warning(kEH, "failed loading gAlice via run-loader.");
118
119       if (fRunLoader->LoadHeader() == 0)
120       {
121         runNo = fRunLoader->GetHeader()->GetRun();
122       }
123       else
124       {
125         Warning(kEH, "failed loading run-loader's header.");
126         delete fRunLoader;
127         fRunLoader = 0;
128       }
129     }
130     else // run-loader open failed
131     {
132       Warning(kEH, "failed opening ALICE run-loader from '%s'.", gaPath.Data());
133     }
134   }
135   else // galice not readable
136   {
137     Warning(kEH, "can not read '%s'.", gaPath.Data());
138   }
139   if (fRunLoader == 0)
140   {
141     if (fgAssertRunLoader)
142       throw(kEH + "Bootstraping of run-loader failed. Its precence was requested.");
143     else
144       Warning(kEH, "Bootstraping of run-loader failed.");
145   }
146
147
148   TString esdPath(Form("%s/AliESDs.root", fPath.Data()));
149   if (gSystem->AccessPathName(esdPath, kReadPermission) == kFALSE)
150   {
151     fESDFile = new TFile(esdPath);
152     if (fESDFile->IsZombie() == kFALSE)
153     {
154       fESD = new AliESDEvent();
155       fESDTree = (TTree*) fESDFile->Get("esdTree");
156       if (fESDTree != 0)
157       {
158         fESD->ReadFromTree(fESDTree);
159         runNo = fESD->GetESDRun()->GetRunNumber();
160
161         // Check if ESDfriends exists and attach the branch
162         TString p = Form("%s/AliESDfriends.root", fPath.Data());
163         if (gSystem->AccessPathName(p, kReadPermission) == kFALSE)
164         {
165           fESDfriendExists = kTRUE;
166           fESDTree->SetBranchStatus ("ESDfriend*", 1);
167           fESDTree->SetBranchAddress("ESDfriend.", &fESDfriend);
168         }
169       }
170       else // esdtree == 0
171       {
172         delete fESDFile; fESDFile = 0;
173         Warning(kEH, "failed getting the esdTree.");
174       }
175     }
176     else // esd tfile is zombie
177     {
178       delete fESDFile; fESDFile = 0;
179       Warning(kEH, "failed opening ESD from '%s'.", esdPath.Data());
180     }
181   }
182   else // esd not readable
183   {
184     Warning(kEH, "can not read ESD file '%s'.", esdPath.Data());
185   }
186   if (fESDTree == 0)
187   {
188     if (fgAssertESD)
189     {
190       throw(kEH + "ESD not initialized. Its precence was requested.");
191     } else {
192       Warning(kEH, "ESD not initialized.");
193     }
194   }
195
196   if (runNo < 0)
197     throw(kEH + "invalid run number.");
198
199   {
200     AliCDBManager* cdb = AliCDBManager::Instance();
201     cdb->SetDefaultStorage(fgCdbUri);
202     if (cdb->IsDefaultStorageSet() == kFALSE)
203       throw(kEH + "CDB initialization failed.");
204     cdb->SetRun(runNo);
205   }
206
207   SetName(Form("Event %d", fEventId));
208   SetTitle(fPath);
209 }
210
211 void AliEveEventManager::GotoEvent(Int_t event)
212 {
213   // Load data for specified event.
214   // If event is out of range an exception is thrown and old state
215   // is preserved.
216   // After successful loading of event, the virtual function
217   // AfterNewEventLoaded() is called. This executes commands that
218   // were registered via TEveEventManager::AddNewEventCommand().
219
220   static const TEveException kEH("AliEveEventManager::GotoEvent ");
221
222   Int_t maxEvent = 0;
223   if (fRunLoader)
224     maxEvent = fRunLoader->GetNumberOfEvents() - 1;
225   else if (fESDTree)
226     maxEvent = fESDTree->GetEntries() - 1;
227   else
228     throw(kEH + "neither RunLoader nor ESD loaded.");
229
230   if (event < 0 || event > maxEvent)
231     throw(kEH + Form("event %d not present, available range [%d, %d].",
232                     event, 0, maxEvent));
233
234   TEveManager::TRedrawDisabler rd(gEve);
235   gEve->Redraw3D(kFALSE, kTRUE); // Enforce drop of all logicals.
236
237   // !!! MT this is somewhat brutal; at least optionally, one could be
238   // a bit gentler, checking for objs owning their external refs and having
239   // additinal parents.
240   DestroyElements();
241   fEventId = event;
242   SetName(Form("Event %d", fEventId));
243   UpdateItems();
244
245   if (fRunLoader) {
246     if (fRunLoader->GetEvent(fEventId) != 0)
247       throw(kEH + "failed getting required event.");
248   }
249
250   if (fESDTree) {
251     if (fESDTree->GetEntry(fEventId) <= 0)
252       throw(kEH + "failed getting required event from ESD.");
253
254     if (fESDfriendExists)
255       fESD->SetESDfriend(fESDfriend);
256   }
257
258   AfterNewEventLoaded();
259 }
260
261 void AliEveEventManager::Close()
262 {
263   // Close the event files.
264   // For the moment only ESD is closed. Needs to be investigated for
265   // AliRunLoader and Raw.
266
267   if (fESDTree) {
268     delete fESD;       fESD       = 0;
269     delete fESDfriend; fESDfriend = 0;
270
271     delete fESDTree; fESDTree = 0;
272     delete fESDFile; fESDFile = 0;
273   }
274 }
275
276
277 /******************************************************************************/
278 // Static convenience functions, mainly used from macros.
279 /******************************************************************************/
280
281 AliRunLoader* AliEveEventManager::AssertRunLoader()
282 {
283   // Make sure AliRunLoader is initialized and return it.
284   // Throws exception in case run-loader is not available.
285   // Static utility for macros.
286
287   static const TEveException kEH("AliEveEventManager::AssertRunLoader ");
288
289   if (gAliEveEvent == 0)
290     throw(kEH + "ALICE event not ready.");
291   if (gAliEveEvent->fRunLoader == 0)
292     throw(kEH + "AliRunLoader not initialised.");
293   return gAliEveEvent->fRunLoader;
294 }
295
296 AliESDEvent* AliEveEventManager::AssertESD()
297 {
298   // Make sure AliESDEvent is initialized and return it.
299   // Throws exception in case ESD is not available.
300   // Static utility for macros.
301
302   static const TEveException kEH("AliEveEventManager::AssertESD ");
303
304   if (gAliEveEvent == 0)
305     throw(kEH + "ALICE event not ready.");
306   if (gAliEveEvent->fESD == 0)
307     throw(kEH + "AliESD not initialised.");
308   return gAliEveEvent->fESD;
309 }
310
311 AliESDfriend* AliEveEventManager::AssertESDfriend()
312 {
313   // Make sure AliESDfriend is initialized and return it.
314   // Throws exception in case ESDfriend-loader is not available.
315   // Static utility for macros.
316
317   static const TEveException kEH("AliEveEventManager::AssertESDfriend ");
318
319   if (gAliEveEvent == 0)
320     throw(kEH + "ALICE event not ready.");
321   if (gAliEveEvent->fESDfriend == 0)
322     throw(kEH + "AliESDfriend not initialised.");
323   return gAliEveEvent->fESDfriend;
324 }
325
326 AliMagF* AliEveEventManager::AssertMagField()
327 {
328   // Make sure AliMagF is initialized and return it.
329   // Throws exception in case magnetic field is not available.
330   // Static utility for macros.
331
332   if (fgMagField == 0)
333   {
334     if (gAliEveEvent && gAliEveEvent->fRunLoader && gAliEveEvent->fRunLoader->GetAliRun())
335       fgMagField = gAliEveEvent->fRunLoader->GetAliRun()->Field();
336     else
337       fgMagField = new AliMagFMaps("Maps","Maps", 1, 1., 10., AliMagFMaps::k5kG);
338   }
339   return fgMagField;
340 }
341
342 TGeoManager* AliEveEventManager::AssertGeometry()
343 {
344   // Make sure AliGeomManager is initialized and returns the
345   // corresponding TGeoManger.
346   // gGeoManager is not set, maybe it should be.
347   // Throws exception in case run-loader is not available.
348   // Static utility for macros.
349
350   // !!!! Should we set gGeoManager here?
351
352   static const TEveException kEH("AliEveEventManager::AssertGeometry ");
353
354   if (AliGeomManager::GetGeometry() == 0)
355   {
356     gGeoManager = 0;
357     AliGeomManager::LoadGeometry();
358     if ( ! AliGeomManager::GetGeometry())
359     {
360       throw(kEH + "can not load geometry.");
361     }
362     if ( ! AliGeomManager::ApplyAlignObjsFromCDB("ITS TPC TRD TOF PHOS HMPID EMCAL MUON FMD ZDC PMD T0 VZERO ACORDE"))
363     {
364       ::Warning(kEH, "mismatch of alignable volumes. Proceeding.");
365       // throw(kEH + "could not apply align objs.");
366     }
367   }
368
369   return AliGeomManager::GetGeometry();
370 }