1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
18 ///////////////////////////////////////////////////////////////////////////////
20 // class for running the reconstruction //
22 // Clusters and tracks are created for all detectors and all events by //
25 // AliReconstruction rec; //
28 // The Run method returns kTRUE in case of successful execution. //
30 // If the input to the reconstruction are not simulated digits but raw data, //
31 // this can be specified by an argument of the Run method or by the method //
33 // rec.SetInput("..."); //
35 // The input formats and the corresponding argument are: //
36 // - DDL raw data files: directory name, ends with "/" //
37 // - raw data root file: root file name, extension ".root" //
38 // - raw data DATE file: DATE file name, any other non-empty string //
39 // - MC root files : empty string, default //
41 // The name of the galice file can be changed from the default //
42 // "galice.root" by passing it as argument to the AliReconstruction //
43 // constructor or by //
45 // rec.SetGAliceFile("..."); //
47 // The local reconstruction can be switched on or off for individual //
50 // rec.SetRunLocalReconstruction("..."); //
52 // The argument is a (case sensitive) string with the names of the //
53 // detectors separated by a space. The special string "ALL" selects all //
54 // available detectors. This is the default. //
56 // The reconstruction of the primary vertex position can be switched off by //
58 // rec.SetRunVertexFinder(kFALSE); //
60 // The tracking and the creation of ESD tracks can be switched on for //
61 // selected detectors by //
63 // rec.SetRunTracking("..."); //
65 // The filling of additional ESD information can be steered by //
67 // rec.SetFillESD("..."); //
69 // Again, for both methods the string specifies the list of detectors. //
70 // The default is "ALL". //
72 // The call of the shortcut method //
74 // rec.SetRunReconstruction("..."); //
76 // is equivalent to calling SetRunLocalReconstruction, SetRunTracking and //
77 // SetFillESD with the same detector selecting string as argument. //
79 // The reconstruction requires digits or raw data as input. For the creation //
80 // of digits and raw data have a look at the class AliSimulation. //
82 // For debug purposes the method SetCheckPointLevel can be used. If the //
83 // argument is greater than 0, files with ESD events will be written after //
84 // selected steps of the reconstruction for each event: //
85 // level 1: after tracking and after filling of ESD (final) //
86 // level 2: in addition after each tracking step //
87 // level 3: in addition after the filling of ESD for each detector //
88 // If a final check point file exists for an event, this event will be //
89 // skipped in the reconstruction. The tracking and the filling of ESD for //
90 // a detector will be skipped as well, if the corresponding check point //
91 // file exists. The ESD event will then be loaded from the file instead. //
93 ///////////////////////////////////////////////////////////////////////////////
99 #include <TPluginManager.h>
100 #include <TStopwatch.h>
102 #include "AliReconstruction.h"
103 #include "AliReconstructor.h"
105 #include "AliRunLoader.h"
107 #include "AliRawReaderFile.h"
108 #include "AliRawReaderDate.h"
109 #include "AliRawReaderRoot.h"
110 #include "AliTracker.h"
112 #include "AliESDVertex.h"
113 #include "AliVertexer.h"
114 #include "AliHeader.h"
115 #include "AliGenEventHeader.h"
116 #include "AliESDpid.h"
119 ClassImp(AliReconstruction)
122 //_____________________________________________________________________________
123 const char* AliReconstruction::fgkDetectorName[AliReconstruction::fgkNDetectors] = {"ITS", "TPC", "TRD", "TOF", "PHOS", "RICH", "EMCAL", "MUON", "FMD", "ZDC", "PMD", "START", "VZERO", "CRT", "HLT"};
125 //_____________________________________________________________________________
126 AliReconstruction::AliReconstruction(const char* gAliceFilename,
127 const char* name, const char* title) :
130 fRunLocalReconstruction("ALL"),
131 fRunVertexFinder(kTRUE),
134 fGAliceFileName(gAliceFilename),
136 fStopOnError(kFALSE),
145 // create reconstruction object with default parameters
147 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
148 fReconstructor[iDet] = NULL;
149 fLoader[iDet] = NULL;
150 fTracker[iDet] = NULL;
154 //_____________________________________________________________________________
155 AliReconstruction::AliReconstruction(const AliReconstruction& rec) :
158 fRunLocalReconstruction(rec.fRunLocalReconstruction),
159 fRunVertexFinder(rec.fRunVertexFinder),
160 fRunTracking(rec.fRunTracking),
161 fFillESD(rec.fFillESD),
162 fGAliceFileName(rec.fGAliceFileName),
164 fStopOnError(rec.fStopOnError),
175 for (Int_t i = 0; i < fOptions.GetEntriesFast(); i++) {
176 if (rec.fOptions[i]) fOptions.Add(rec.fOptions[i]->Clone());
178 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
179 fReconstructor[iDet] = NULL;
180 fLoader[iDet] = NULL;
181 fTracker[iDet] = NULL;
185 //_____________________________________________________________________________
186 AliReconstruction& AliReconstruction::operator = (const AliReconstruction& rec)
188 // assignment operator
190 this->~AliReconstruction();
191 new(this) AliReconstruction(rec);
195 //_____________________________________________________________________________
196 AliReconstruction::~AliReconstruction()
205 //_____________________________________________________________________________
206 void AliReconstruction::SetGAliceFile(const char* fileName)
208 // set the name of the galice file
210 fGAliceFileName = fileName;
213 //_____________________________________________________________________________
214 void AliReconstruction::SetOption(const char* detector, const char* option)
216 // set options for the reconstruction of a detector
218 TObject* obj = fOptions.FindObject(detector);
219 if (obj) fOptions.Remove(obj);
220 fOptions.Add(new TNamed(detector, option));
224 //_____________________________________________________________________________
225 Bool_t AliReconstruction::Run(const char* input)
227 // run the reconstruction
230 if (!input) input = fInput.Data();
231 TString fileName(input);
232 if (fileName.EndsWith("/")) {
233 fRawReader = new AliRawReaderFile(fileName);
234 } else if (fileName.EndsWith(".root")) {
235 fRawReader = new AliRawReaderRoot(fileName);
236 } else if (!fileName.IsNull()) {
237 fRawReader = new AliRawReaderDate(fileName);
238 fRawReader->SelectEvents(7);
241 // get the run loader
242 if (!InitRunLoader()) return kFALSE;
244 // local reconstruction
245 if (!fRunLocalReconstruction.IsNull()) {
246 if (!RunLocalReconstruction(fRunLocalReconstruction)) {
247 if (fStopOnError) {CleanUp(); return kFALSE;}
250 if (!fRunVertexFinder && fRunTracking.IsNull() &&
251 fFillESD.IsNull()) return kTRUE;
254 if (fRunVertexFinder && !CreateVertexer()) {
262 if (!fRunTracking.IsNull() && !CreateTrackers(fRunTracking)) {
269 // create the ESD output file and tree
270 TFile* file = TFile::Open("AliESDs.root", "RECREATE");
271 if (!file->IsOpen()) {
272 AliError("opening AliESDs.root failed");
273 if (fStopOnError) {CleanUp(file); return kFALSE;}
275 AliESD* esd = new AliESD;
276 TTree* tree = new TTree("esdTree", "Tree with ESD objects");
277 tree->Branch("ESD", "AliESD", &esd);
282 if (fRawReader) fRawReader->RewindEvents();
284 for (Int_t iEvent = 0; iEvent < fRunLoader->GetNumberOfEvents(); iEvent++) {
285 AliInfo(Form("processing event %d", iEvent));
286 fRunLoader->GetEvent(iEvent);
287 if (fRawReader) fRawReader->NextEvent();
290 sprintf(fileName, "ESD_%d.%d_final.root",
291 fRunLoader->GetHeader()->GetRun(),
292 fRunLoader->GetHeader()->GetEventNrInRun());
293 if (!gSystem->AccessPathName(fileName)) continue;
296 esd->SetRunNumber(fRunLoader->GetHeader()->GetRun());
297 esd->SetEventNumber(fRunLoader->GetHeader()->GetEventNrInRun());
299 esd->SetMagneticField(gAlice->Field()->SolenoidField());
305 if (fRunVertexFinder) {
306 if (!ReadESD(esd, "vertex")) {
307 if (!RunVertexFinder(esd)) {
308 if (fStopOnError) {CleanUp(file); return kFALSE;}
310 if (fCheckPointLevel > 0) WriteESD(esd, "vertex");
315 if (!fRunTracking.IsNull()) {
316 if (!ReadESD(esd, "tracking")) {
317 if (!RunTracking(esd)) {
318 if (fStopOnError) {CleanUp(file); return kFALSE;}
320 if (fCheckPointLevel > 0) WriteESD(esd, "tracking");
325 if (!fFillESD.IsNull()) {
326 if (!FillESD(esd, fFillESD)) {
327 if (fStopOnError) {CleanUp(file); return kFALSE;}
332 AliESDpid::MakePID(esd);
333 if (fCheckPointLevel > 1) WriteESD(esd, "PID");
338 if (fCheckPointLevel > 0) WriteESD(esd, "final");
350 //_____________________________________________________________________________
351 Bool_t AliReconstruction::RunLocalReconstruction(const TString& detectors)
353 // run the local reconstruction
355 TStopwatch stopwatch;
358 TString detStr = detectors;
359 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
360 if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
361 AliReconstructor* reconstructor = GetReconstructor(iDet);
362 if (!reconstructor) continue;
364 AliInfo(Form("running reconstruction for %s", fgkDetectorName[iDet]));
365 TStopwatch stopwatchDet;
366 stopwatchDet.Start();
368 fRawReader->RewindEvents();
369 reconstructor->Reconstruct(fRunLoader, fRawReader);
371 reconstructor->Reconstruct(fRunLoader);
373 AliInfo(Form("execution time for %s:", fgkDetectorName[iDet]));
374 ToAliInfo(stopwatchDet.Print());
377 if ((detStr.CompareTo("ALL") != 0) && !detStr.IsNull()) {
378 AliError(Form("the following detectors were not found: %s",
380 if (fStopOnError) return kFALSE;
383 AliInfo("execution time:");
384 ToAliInfo(stopwatch.Print());
389 //_____________________________________________________________________________
390 Bool_t AliReconstruction::RunVertexFinder(AliESD*& esd)
392 // run the barrel tracking
394 TStopwatch stopwatch;
397 AliESDVertex* vertex = NULL;
398 Double_t vtxPos[3] = {0, 0, 0};
399 Double_t vtxErr[3] = {0.07, 0.07, 0.1};
401 if (fRunLoader->GetHeader() && fRunLoader->GetHeader()->GenEventHeader()) {
402 fRunLoader->GetHeader()->GenEventHeader()->PrimaryVertex(mcVertex);
403 for (Int_t i = 0; i < 3; i++) vtxPos[i] = mcVertex[i];
407 AliInfo("running the ITS vertex finder");
408 vertex = fVertexer->FindVertexForCurrentEvent(fRunLoader->GetEventNumber());
410 AliWarning("Vertex not found");
411 vertex = new AliESDVertex();
414 vertex->SetTruePos(vtxPos); // store also the vertex from MC
418 AliInfo("getting the primary vertex from MC");
419 vertex = new AliESDVertex(vtxPos, vtxErr);
423 vertex->GetXYZ(vtxPos);
424 vertex->GetSigmaXYZ(vtxErr);
426 AliWarning("no vertex reconstructed");
427 vertex = new AliESDVertex(vtxPos, vtxErr);
429 esd->SetVertex(vertex);
430 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
431 if (fTracker[iDet]) fTracker[iDet]->SetVertex(vtxPos, vtxErr);
435 AliInfo("execution time:");
436 ToAliInfo(stopwatch.Print());
441 //_____________________________________________________________________________
442 Bool_t AliReconstruction::RunTracking(AliESD*& esd)
444 // run the barrel tracking
446 TStopwatch stopwatch;
449 AliInfo("running tracking");
451 // pass 1: TPC + ITS inwards
452 for (Int_t iDet = 1; iDet >= 0; iDet--) {
453 if (!fTracker[iDet]) continue;
454 AliDebug(1, Form("%s tracking", fgkDetectorName[iDet]));
457 fLoader[iDet]->LoadRecPoints("read");
458 TTree* tree = fLoader[iDet]->TreeR();
460 AliError(Form("Can't get the %s cluster tree", fgkDetectorName[iDet]));
463 fTracker[iDet]->LoadClusters(tree);
466 if (fTracker[iDet]->Clusters2Tracks(esd) != 0) {
467 AliError(Form("%s Clusters2Tracks failed", fgkDetectorName[iDet]));
470 if (fCheckPointLevel > 1) {
471 WriteESD(esd, Form("%s.tracking", fgkDetectorName[iDet]));
473 // preliminary PID in TPC needed by the ITS tracker
475 GetReconstructor(1)->FillESD(fRunLoader, esd);
476 AliESDpid::MakePID(esd);
480 // pass 2: ALL backwards
481 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
482 if (!fTracker[iDet]) continue;
483 AliDebug(1, Form("%s back propagation", fgkDetectorName[iDet]));
486 if (iDet > 1) { // all except ITS, TPC
488 if (iDet == 3) { // TOF
489 fLoader[iDet]->LoadDigits("read");
490 tree = fLoader[iDet]->TreeD();
492 fLoader[iDet]->LoadRecPoints("read");
493 tree = fLoader[iDet]->TreeR();
496 AliError(Form("Can't get the %s cluster tree", fgkDetectorName[iDet]));
499 fTracker[iDet]->LoadClusters(tree);
503 if (fTracker[iDet]->PropagateBack(esd) != 0) {
504 AliError(Form("%s backward propagation failed", fgkDetectorName[iDet]));
507 if (fCheckPointLevel > 1) {
508 WriteESD(esd, Form("%s.back", fgkDetectorName[iDet]));
512 if (iDet > 2) { // all except ITS, TPC, TRD
513 fTracker[iDet]->UnloadClusters();
514 if (iDet == 3) { // TOF
515 fLoader[iDet]->UnloadDigits();
517 fLoader[iDet]->UnloadRecPoints();
522 // pass 3: TRD + TPC + ITS refit inwards
523 for (Int_t iDet = 2; iDet >= 0; iDet--) {
524 if (!fTracker[iDet]) continue;
525 AliDebug(1, Form("%s inward refit", fgkDetectorName[iDet]));
528 if (fTracker[iDet]->RefitInward(esd) != 0) {
529 AliError(Form("%s inward refit failed", fgkDetectorName[iDet]));
532 if (fCheckPointLevel > 1) {
533 WriteESD(esd, Form("%s.refit", fgkDetectorName[iDet]));
537 fTracker[iDet]->UnloadClusters();
538 fLoader[iDet]->UnloadRecPoints();
541 AliInfo("execution time:");
542 ToAliInfo(stopwatch.Print());
547 //_____________________________________________________________________________
548 Bool_t AliReconstruction::FillESD(AliESD*& esd, const TString& detectors)
550 // fill the event summary data
552 TStopwatch stopwatch;
554 AliInfo("filling ESD");
556 TString detStr = detectors;
557 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
558 if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
559 AliReconstructor* reconstructor = GetReconstructor(iDet);
560 if (!reconstructor) continue;
562 if (!ReadESD(esd, fgkDetectorName[iDet])) {
563 AliDebug(1, Form("filling ESD for %s", fgkDetectorName[iDet]));
565 reconstructor->FillESD(fRunLoader, fRawReader, esd);
567 reconstructor->FillESD(fRunLoader, esd);
569 if (fCheckPointLevel > 2) WriteESD(esd, fgkDetectorName[iDet]);
573 if ((detStr.CompareTo("ALL") != 0) && !detStr.IsNull()) {
574 AliError(Form("the following detectors were not found: %s",
576 if (fStopOnError) return kFALSE;
579 AliInfo("execution time:");
580 ToAliInfo(stopwatch.Print());
586 //_____________________________________________________________________________
587 Bool_t AliReconstruction::IsSelected(TString detName, TString& detectors) const
589 // check whether detName is contained in detectors
590 // if yes, it is removed from detectors
592 // check if all detectors are selected
593 if ((detectors.CompareTo("ALL") == 0) ||
594 detectors.BeginsWith("ALL ") ||
595 detectors.EndsWith(" ALL") ||
596 detectors.Contains(" ALL ")) {
601 // search for the given detector
602 Bool_t result = kFALSE;
603 if ((detectors.CompareTo(detName) == 0) ||
604 detectors.BeginsWith(detName+" ") ||
605 detectors.EndsWith(" "+detName) ||
606 detectors.Contains(" "+detName+" ")) {
607 detectors.ReplaceAll(detName, "");
611 // clean up the detectors string
612 while (detectors.Contains(" ")) detectors.ReplaceAll(" ", " ");
613 while (detectors.BeginsWith(" ")) detectors.Remove(0, 1);
614 while (detectors.EndsWith(" ")) detectors.Remove(detectors.Length()-1, 1);
619 //_____________________________________________________________________________
620 Bool_t AliReconstruction::InitRunLoader()
622 // get or create the run loader
624 if (gAlice) delete gAlice;
627 if (!gSystem->AccessPathName(fGAliceFileName.Data())) {
628 fRunLoader = AliRunLoader::Open(fGAliceFileName.Data());
630 AliError(Form("no run loader found in file %s", fGAliceFileName.Data()));
634 if (fRunLoader->LoadgAlice() == 0) {
635 gAlice = fRunLoader->GetAliRun();
636 AliTracker::SetFieldMap(gAlice->Field());
638 if (!gAlice && !fRawReader) {
639 AliError(Form("no gAlice object found in file %s",
640 fGAliceFileName.Data()));
645 } else { // galice.root does not exist
647 AliError(Form("the file %s does not exist", fGAliceFileName.Data()));
651 fRunLoader = AliRunLoader::Open(fGAliceFileName.Data(),
652 AliConfig::GetDefaultEventFolderName(),
655 AliError(Form("could not create run loader in file %s",
656 fGAliceFileName.Data()));
660 fRunLoader->MakeTree("E");
662 while (fRawReader->NextEvent()) {
663 fRunLoader->SetEventNumber(iEvent);
664 fRunLoader->GetHeader()->Reset(fRawReader->GetRunNumber(),
666 fRunLoader->MakeTree("H");
667 fRunLoader->TreeE()->Fill();
670 fRawReader->RewindEvents();
671 fRunLoader->WriteHeader("OVERWRITE");
672 fRunLoader->CdGAFile();
673 fRunLoader->Write(0, TObject::kOverwrite);
674 // AliTracker::SetFieldMap(???);
680 //_____________________________________________________________________________
681 AliReconstructor* AliReconstruction::GetReconstructor(Int_t iDet)
683 // get the reconstructor object and the loader for a detector
685 if (fReconstructor[iDet]) return fReconstructor[iDet];
687 // load the reconstructor object
688 TPluginManager* pluginManager = gROOT->GetPluginManager();
689 TString detName = fgkDetectorName[iDet];
690 TString recName = "Ali" + detName + "Reconstructor";
691 if (gAlice && !gAlice->GetDetector(detName) && (detName != "HLT")) return NULL;
693 if (detName == "HLT") {
694 if (!gROOT->GetClass("AliLevel3")) {
695 gSystem->Load("libAliL3Src.so");
696 gSystem->Load("libAliL3Misc.so");
697 gSystem->Load("libAliL3Hough.so");
698 gSystem->Load("libAliL3Comp.so");
702 AliReconstructor* reconstructor = NULL;
703 // first check if a plugin is defined for the reconstructor
704 TPluginHandler* pluginHandler =
705 pluginManager->FindHandler("AliReconstructor", detName);
706 // if not, add a plugin for it
707 if (!pluginHandler) {
708 AliDebug(1, Form("defining plugin for %s", recName.Data()));
709 if (gSystem->Load("lib" + detName + "base.so") == 0) {
710 pluginManager->AddHandler("AliReconstructor", detName,
711 recName, detName + "rec", recName + "()");
713 pluginManager->AddHandler("AliReconstructor", detName,
714 recName, detName, recName + "()");
716 pluginHandler = pluginManager->FindHandler("AliReconstructor", detName);
718 if (pluginHandler && (pluginHandler->LoadPlugin() == 0)) {
719 reconstructor = (AliReconstructor*) pluginHandler->ExecPlugin(0);
722 TObject* obj = fOptions.FindObject(detName.Data());
723 if (obj) reconstructor->SetOption(obj->GetTitle());
724 fReconstructor[iDet] = reconstructor;
727 // get or create the loader
728 if (detName != "HLT") {
729 fLoader[iDet] = fRunLoader->GetLoader(detName + "Loader");
730 if (!fLoader[iDet]) {
731 AliConfig::Instance()
732 ->CreateDetectorFolders(fRunLoader->GetEventFolder(),
734 // first check if a plugin is defined for the loader
735 TPluginHandler* pluginHandler =
736 pluginManager->FindHandler("AliLoader", detName);
737 // if not, add a plugin for it
738 if (!pluginHandler) {
739 TString loaderName = "Ali" + detName + "Loader";
740 AliDebug(1, Form("defining plugin for %s", loaderName.Data()));
741 pluginManager->AddHandler("AliLoader", detName,
742 loaderName, detName + "base",
743 loaderName + "(const char*, TFolder*)");
744 pluginHandler = pluginManager->FindHandler("AliLoader", detName);
746 if (pluginHandler && (pluginHandler->LoadPlugin() == 0)) {
748 (AliLoader*) pluginHandler->ExecPlugin(2, detName.Data(),
749 fRunLoader->GetEventFolder());
751 if (!fLoader[iDet]) { // use default loader
752 fLoader[iDet] = new AliLoader(detName, fRunLoader->GetEventFolder());
754 if (!fLoader[iDet]) {
755 AliWarning(Form("couldn't get loader for %s", detName.Data()));
756 if (fStopOnError) return NULL;
758 fRunLoader->AddLoader(fLoader[iDet]);
759 fRunLoader->CdGAFile();
760 if (gFile && !gFile->IsWritable()) gFile->ReOpen("UPDATE");
761 fRunLoader->Write(0, TObject::kOverwrite);
766 return reconstructor;
769 //_____________________________________________________________________________
770 Bool_t AliReconstruction::CreateVertexer()
772 // create the vertexer
775 AliReconstructor* itsReconstructor = GetReconstructor(0);
776 if (itsReconstructor) {
777 fVertexer = itsReconstructor->CreateVertexer(fRunLoader);
780 AliWarning("couldn't create a vertexer for ITS");
781 if (fStopOnError) return kFALSE;
787 //_____________________________________________________________________________
788 Bool_t AliReconstruction::CreateTrackers(const TString& detectors)
790 // create the trackers
792 TString detStr = detectors;
793 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
794 if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
795 AliReconstructor* reconstructor = GetReconstructor(iDet);
796 if (!reconstructor) continue;
797 TString detName = fgkDetectorName[iDet];
798 if (detName == "HLT") continue;
800 fTracker[iDet] = reconstructor->CreateTracker(fRunLoader);
801 if (!fTracker[iDet] && (iDet < 7)) {
802 AliWarning(Form("couldn't create a tracker for %s", detName.Data()));
803 if (fStopOnError) return kFALSE;
810 //_____________________________________________________________________________
811 void AliReconstruction::CleanUp(TFile* file)
813 // delete trackers and the run loader and close and delete the file
815 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
816 delete fReconstructor[iDet];
817 fReconstructor[iDet] = NULL;
818 fLoader[iDet] = NULL;
819 delete fTracker[iDet];
820 fTracker[iDet] = NULL;
837 //_____________________________________________________________________________
838 Bool_t AliReconstruction::ReadESD(AliESD*& esd, const char* recStep) const
840 // read the ESD event from a file
842 if (!esd) return kFALSE;
844 sprintf(fileName, "ESD_%d.%d_%s.root",
845 esd->GetRunNumber(), esd->GetEventNumber(), recStep);
846 if (gSystem->AccessPathName(fileName)) return kFALSE;
848 AliDebug(1, Form("reading ESD from file %s", fileName));
849 TFile* file = TFile::Open(fileName);
850 if (!file || !file->IsOpen()) {
851 AliError(Form("opening %s failed", fileName));
858 esd = (AliESD*) file->Get("ESD");
864 //_____________________________________________________________________________
865 void AliReconstruction::WriteESD(AliESD* esd, const char* recStep) const
867 // write the ESD event to a file
871 sprintf(fileName, "ESD_%d.%d_%s.root",
872 esd->GetRunNumber(), esd->GetEventNumber(), recStep);
874 AliDebug(1, Form("writing ESD to file %s", fileName));
875 TFile* file = TFile::Open(fileName, "recreate");
876 if (!file || !file->IsOpen()) {
877 AliError(Form("opening %s failed", fileName));