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 // By default all events are reconstructed. The reconstruction can be //
42 // limited to a range of events by giving the index of the first and the //
43 // last event as an argument to the Run method or by calling //
45 // rec.SetEventRange(..., ...); //
47 // The index -1 (default) can be used for the last event to indicate no //
48 // upper limit of the event range. //
50 // In case of raw-data reconstruction the user can modify the default //
51 // number of events per digits/clusters/tracks file. In case the option //
52 // is not used the number is set 1. In case the user provides 0, than //
53 // the number of events is equal to the number of events inside the //
54 // raw-data file (i.e. one digits/clusters/tracks file): //
56 // rec.SetNumberOfEventsPerFile(...); //
59 // The name of the galice file can be changed from the default //
60 // "galice.root" by passing it as argument to the AliReconstruction //
61 // constructor or by //
63 // rec.SetGAliceFile("..."); //
65 // The local reconstruction can be switched on or off for individual //
68 // rec.SetRunLocalReconstruction("..."); //
70 // The argument is a (case sensitive) string with the names of the //
71 // detectors separated by a space. The special string "ALL" selects all //
72 // available detectors. This is the default. //
74 // The reconstruction of the primary vertex position can be switched off by //
76 // rec.SetRunVertexFinder(kFALSE); //
78 // The tracking and the creation of ESD tracks can be switched on for //
79 // selected detectors by //
81 // rec.SetRunTracking("..."); //
83 // Uniform/nonuniform field tracking switches (default: uniform field) //
85 // rec.SetUniformFieldTracking(); ( rec.SetUniformFieldTracking(kFALSE); ) //
87 // The filling of additional ESD information can be steered by //
89 // rec.SetFillESD("..."); //
91 // Again, for both methods the string specifies the list of detectors. //
92 // The default is "ALL". //
94 // The call of the shortcut method //
96 // rec.SetRunReconstruction("..."); //
98 // is equivalent to calling SetRunLocalReconstruction, SetRunTracking and //
99 // SetFillESD with the same detector selecting string as argument. //
101 // The reconstruction requires digits or raw data as input. For the creation //
102 // of digits and raw data have a look at the class AliSimulation. //
104 // For debug purposes the method SetCheckPointLevel can be used. If the //
105 // argument is greater than 0, files with ESD events will be written after //
106 // selected steps of the reconstruction for each event: //
107 // level 1: after tracking and after filling of ESD (final) //
108 // level 2: in addition after each tracking step //
109 // level 3: in addition after the filling of ESD for each detector //
110 // If a final check point file exists for an event, this event will be //
111 // skipped in the reconstruction. The tracking and the filling of ESD for //
112 // a detector will be skipped as well, if the corresponding check point //
113 // file exists. The ESD event will then be loaded from the file instead. //
115 ///////////////////////////////////////////////////////////////////////////////
121 #include <TPluginManager.h>
122 #include <TStopwatch.h>
123 #include <TGeoManager.h>
124 #include <TLorentzVector.h>
126 #include "AliReconstruction.h"
127 #include "AliReconstructor.h"
129 #include "AliRunLoader.h"
131 #include "AliRawReaderFile.h"
132 #include "AliRawReaderDate.h"
133 #include "AliRawReaderRoot.h"
134 #include "AliRawEventHeaderBase.h"
136 #include "AliESDfriend.h"
137 #include "AliESDVertex.h"
138 #include "AliMultiplicity.h"
139 #include "AliTracker.h"
140 #include "AliVertexer.h"
141 #include "AliVertexerTracks.h"
142 #include "AliV0vertexer.h"
143 #include "AliCascadeVertexer.h"
144 #include "AliHeader.h"
145 #include "AliGenEventHeader.h"
147 #include "AliESDpid.h"
148 #include "AliESDtrack.h"
150 #include "AliRunTag.h"
151 #include "AliDetectorTag.h"
152 #include "AliEventTag.h"
154 #include "AliTrackPointArray.h"
155 #include "AliCDBManager.h"
156 #include "AliCDBEntry.h"
157 #include "AliAlignObj.h"
159 #include "AliCentralTrigger.h"
160 #include "AliCTPRawStream.h"
162 ClassImp(AliReconstruction)
165 //_____________________________________________________________________________
166 const char* AliReconstruction::fgkDetectorName[AliReconstruction::fgkNDetectors] = {"ITS", "TPC", "TRD", "TOF", "PHOS", "HMPID", "EMCAL", "MUON", "FMD", "ZDC", "PMD", "T0", "VZERO", "ACORDE", "HLT"};
168 //_____________________________________________________________________________
169 AliReconstruction::AliReconstruction(const char* gAliceFilename, const char* cdbUri,
170 const char* name, const char* title) :
173 fUniformField(kTRUE),
174 fRunVertexFinder(kTRUE),
175 fRunHLTTracking(kFALSE),
176 fRunMuonTracking(kFALSE),
177 fStopOnError(kFALSE),
178 fWriteAlignmentData(kFALSE),
179 fWriteESDfriend(kFALSE),
181 fFillTriggerESD(kTRUE),
183 fRunLocalReconstruction("ALL"),
186 fGAliceFileName(gAliceFilename),
191 fNumberOfEventsPerFile(1),
194 fLoadAlignFromCDB(kTRUE),
195 fLoadAlignData("ALL"),
201 fDiamondProfile(NULL),
203 fAlignObjArray(NULL),
207 // create reconstruction object with default parameters
209 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
210 fReconstructor[iDet] = NULL;
211 fLoader[iDet] = NULL;
212 fTracker[iDet] = NULL;
217 //_____________________________________________________________________________
218 AliReconstruction::AliReconstruction(const AliReconstruction& rec) :
221 fUniformField(rec.fUniformField),
222 fRunVertexFinder(rec.fRunVertexFinder),
223 fRunHLTTracking(rec.fRunHLTTracking),
224 fRunMuonTracking(rec.fRunMuonTracking),
225 fStopOnError(rec.fStopOnError),
226 fWriteAlignmentData(rec.fWriteAlignmentData),
227 fWriteESDfriend(rec.fWriteESDfriend),
228 fWriteAOD(rec.fWriteAOD),
229 fFillTriggerESD(rec.fFillTriggerESD),
231 fRunLocalReconstruction(rec.fRunLocalReconstruction),
232 fRunTracking(rec.fRunTracking),
233 fFillESD(rec.fFillESD),
234 fGAliceFileName(rec.fGAliceFileName),
236 fEquipIdMap(rec.fEquipIdMap),
237 fFirstEvent(rec.fFirstEvent),
238 fLastEvent(rec.fLastEvent),
239 fNumberOfEventsPerFile(rec.fNumberOfEventsPerFile),
242 fLoadAlignFromCDB(rec.fLoadAlignFromCDB),
243 fLoadAlignData(rec.fLoadAlignData),
249 fDiamondProfile(NULL),
251 fAlignObjArray(rec.fAlignObjArray),
252 fCDBUri(rec.fCDBUri),
257 for (Int_t i = 0; i < rec.fOptions.GetEntriesFast(); i++) {
258 if (rec.fOptions[i]) fOptions.Add(rec.fOptions[i]->Clone());
260 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
261 fReconstructor[iDet] = NULL;
262 fLoader[iDet] = NULL;
263 fTracker[iDet] = NULL;
265 for (Int_t i = 0; i < rec.fSpecCDBUri.GetEntriesFast(); i++) {
266 if (rec.fSpecCDBUri[i]) fSpecCDBUri.Add(rec.fSpecCDBUri[i]->Clone());
270 //_____________________________________________________________________________
271 AliReconstruction& AliReconstruction::operator = (const AliReconstruction& rec)
273 // assignment operator
275 this->~AliReconstruction();
276 new(this) AliReconstruction(rec);
280 //_____________________________________________________________________________
281 AliReconstruction::~AliReconstruction()
287 fSpecCDBUri.Delete();
290 //_____________________________________________________________________________
291 void AliReconstruction::InitCDBStorage()
293 // activate a default CDB storage
294 // First check if we have any CDB storage set, because it is used
295 // to retrieve the calibration and alignment constants
297 AliCDBManager* man = AliCDBManager::Instance();
298 if (man->IsDefaultStorageSet())
300 AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
301 AliWarning("Default CDB storage has been already set !");
302 AliWarning(Form("Ignoring the default storage declared in AliReconstruction: %s",fCDBUri.Data()));
303 AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
307 AliDebug(2, "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
308 AliDebug(2, Form("Default CDB storage is set to: %s",fCDBUri.Data()));
309 AliDebug(2, "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
310 man->SetDefaultStorage(fCDBUri);
313 // Now activate the detector specific CDB storage locations
314 for (Int_t i = 0; i < fSpecCDBUri.GetEntriesFast(); i++) {
315 TObject* obj = fSpecCDBUri[i];
317 AliDebug(2, "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
318 AliDebug(2, Form("Specific CDB storage for %s is set to: %s",obj->GetName(),obj->GetTitle()));
319 AliDebug(2, "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
320 man->SetSpecificStorage(obj->GetName(), obj->GetTitle());
325 //_____________________________________________________________________________
326 void AliReconstruction::SetDefaultStorage(const char* uri) {
327 // Store the desired default CDB storage location
328 // Activate it later within the Run() method
334 //_____________________________________________________________________________
335 void AliReconstruction::SetSpecificStorage(const char* calibType, const char* uri) {
336 // Store a detector-specific CDB storage location
337 // Activate it later within the Run() method
339 AliCDBPath aPath(calibType);
340 if(!aPath.IsValid()){
341 // if calibType is not wildcard but it is a valid detector, add "/*" to make it a valid path
342 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
343 if(!strcmp(calibType, fgkDetectorName[iDet])) {
344 aPath.SetPath(Form("%s/*", calibType));
345 AliInfo(Form("Path for specific storage set to %s", aPath.GetPath().Data()));
349 if(!aPath.IsValid()){
350 AliError(Form("Not a valid path or detector: %s", calibType));
355 // check that calibType refers to a "valid" detector name
356 Bool_t isDetector = kFALSE;
357 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
358 TString detName = fgkDetectorName[iDet];
359 if(aPath.GetLevel0() == detName) {
366 AliError(Form("Not a valid detector: %s", aPath.GetLevel0().Data()));
370 TObject* obj = fSpecCDBUri.FindObject(aPath.GetPath().Data());
371 if (obj) fSpecCDBUri.Remove(obj);
372 fSpecCDBUri.Add(new TNamed(aPath.GetPath().Data(), uri));
376 //_____________________________________________________________________________
377 Bool_t AliReconstruction::SetRunNumber()
379 // The method is called in Run() in order
380 // to set a correct run number.
381 // In case of raw data reconstruction the
382 // run number is taken from the raw data header
384 if(AliCDBManager::Instance()->GetRun() < 0) {
386 AliError("No run loader is found !");
389 // read run number from gAlice
390 if(fRunLoader->GetAliRun())
391 AliCDBManager::Instance()->SetRun(fRunLoader->GetAliRun()->GetRunNumber());
394 if(fRawReader->NextEvent()) {
395 AliCDBManager::Instance()->SetRun(fRawReader->GetRunNumber());
396 fRawReader->RewindEvents();
399 AliError("No raw-data events found !");
404 AliError("Neither gAlice nor RawReader objects are found !");
408 AliInfo(Form("CDB Run number: %d",AliCDBManager::Instance()->GetRun()));
413 //_____________________________________________________________________________
414 Bool_t AliReconstruction::ApplyAlignObjsToGeom(TObjArray* alObjArray)
416 // Read collection of alignment objects (AliAlignObj derived) saved
417 // in the TClonesArray ClArrayName and apply them to the geometry
418 // manager singleton.
421 Int_t nvols = alObjArray->GetEntriesFast();
425 for(Int_t j=0; j<nvols; j++)
427 AliAlignObj* alobj = (AliAlignObj*) alObjArray->UncheckedAt(j);
428 if (alobj->ApplyToGeometry() == kFALSE) flag = kFALSE;
431 if (AliDebugLevelClass() >= 1) {
432 gGeoManager->GetTopNode()->CheckOverlaps(20);
433 TObjArray* ovexlist = gGeoManager->GetListOfOverlaps();
434 if(ovexlist->GetEntriesFast()){
435 AliError("The application of alignment objects to the geometry caused huge overlaps/extrusions!");
443 //_____________________________________________________________________________
444 Bool_t AliReconstruction::SetAlignObjArraySingleDet(const char* detName)
446 // Fills array of single detector's alignable objects from CDB
448 AliDebug(2, Form("Loading alignment data for detector: %s",detName));
452 AliCDBPath path(detName,"Align","Data");
454 entry=AliCDBManager::Instance()->Get(path.GetPath());
456 AliDebug(2,Form("Couldn't load alignment data for detector %s",detName));
460 TClonesArray *alignArray = (TClonesArray*) entry->GetObject();
461 alignArray->SetOwner(0);
462 AliDebug(2,Form("Found %d alignment objects for %s",
463 alignArray->GetEntries(),detName));
465 AliAlignObj *alignObj=0;
466 TIter iter(alignArray);
468 // loop over align objects in detector
469 while( ( alignObj=(AliAlignObj *) iter.Next() ) ){
470 fAlignObjArray->Add(alignObj);
472 // delete entry --- Don't delete, it is cached!
474 AliDebug(2, Form("fAlignObjArray entries: %d",fAlignObjArray->GetEntries() ));
479 //_____________________________________________________________________________
480 Bool_t AliReconstruction::MisalignGeometry(const TString& detectors)
482 // Read the alignment objects from CDB.
483 // Each detector is supposed to have the
484 // alignment objects in DET/Align/Data CDB path.
485 // All the detector objects are then collected,
486 // sorted by geometry level (starting from ALIC) and
487 // then applied to the TGeo geometry.
488 // Finally an overlaps check is performed.
490 // Load alignment data from CDB and fill fAlignObjArray
491 if(fLoadAlignFromCDB){
492 if(!fAlignObjArray) fAlignObjArray = new TObjArray();
494 //fAlignObjArray->RemoveAll();
495 fAlignObjArray->Clear();
496 fAlignObjArray->SetOwner(0);
498 TString detStr = detectors;
499 TString dataNotLoaded="";
500 TString dataLoaded="";
502 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
503 if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
504 if(!SetAlignObjArraySingleDet(fgkDetectorName[iDet])){
505 dataNotLoaded += fgkDetectorName[iDet];
506 dataNotLoaded += " ";
508 dataLoaded += fgkDetectorName[iDet];
511 } // end loop over detectors
513 if ((detStr.CompareTo("ALL") == 0)) detStr = "";
514 dataNotLoaded += detStr;
515 if(!dataLoaded.IsNull()) AliInfo(Form("Alignment data loaded for: %s",
517 if(!dataNotLoaded.IsNull()) AliInfo(Form("Didn't/couldn't load alignment data for: %s",
518 dataNotLoaded.Data()));
519 } // fLoadAlignFromCDB flag
521 // Check if the array with alignment objects was
522 // provided by the user. If yes, apply the objects
523 // to the present TGeo geometry
524 if (fAlignObjArray) {
525 if (gGeoManager && gGeoManager->IsClosed()) {
526 if (ApplyAlignObjsToGeom(fAlignObjArray) == kFALSE) {
527 AliError("The misalignment of one or more volumes failed!"
528 "Compare the list of simulated detectors and the list of detector alignment data!");
533 AliError("Can't apply the misalignment! gGeoManager doesn't exist or it is still opened!");
538 delete fAlignObjArray; fAlignObjArray=0;
540 // Update the TGeoPhysicalNodes
541 gGeoManager->RefreshPhysicalNodes();
546 //_____________________________________________________________________________
547 void AliReconstruction::SetGAliceFile(const char* fileName)
549 // set the name of the galice file
551 fGAliceFileName = fileName;
554 //_____________________________________________________________________________
555 void AliReconstruction::SetOption(const char* detector, const char* option)
557 // set options for the reconstruction of a detector
559 TObject* obj = fOptions.FindObject(detector);
560 if (obj) fOptions.Remove(obj);
561 fOptions.Add(new TNamed(detector, option));
565 //_____________________________________________________________________________
566 Bool_t AliReconstruction::Run(const char* input)
568 // run the reconstruction
571 if (!input) input = fInput.Data();
572 TString fileName(input);
573 if (fileName.EndsWith("/")) {
574 fRawReader = new AliRawReaderFile(fileName);
575 } else if (fileName.EndsWith(".root")) {
576 fRawReader = new AliRawReaderRoot(fileName);
577 } else if (!fileName.IsNull()) {
578 fRawReader = new AliRawReaderDate(fileName);
579 fRawReader->SelectEvents(7);
581 if (!fEquipIdMap.IsNull() && fRawReader)
582 fRawReader->LoadEquipmentIdsMap(fEquipIdMap);
585 // get the run loader
586 if (!InitRunLoader()) return kFALSE;
588 // Initialize the CDB storage
591 // Set run number in CDBManager (if it is not already set by the user)
592 if (!SetRunNumber()) if (fStopOnError) return kFALSE;
594 // Import ideal TGeo geometry and apply misalignment
596 TString geom(gSystem->DirName(fGAliceFileName));
597 geom += "/geometry.root";
598 TGeoManager::Import(geom.Data());
599 if (!gGeoManager) if (fStopOnError) return kFALSE;
602 AliCDBManager* man = AliCDBManager::Instance();
603 if (!MisalignGeometry(fLoadAlignData)) if (fStopOnError) return kFALSE;
605 // local reconstruction
606 if (!fRunLocalReconstruction.IsNull()) {
607 if (!RunLocalReconstruction(fRunLocalReconstruction)) {
608 if (fStopOnError) {CleanUp(); return kFALSE;}
611 // if (!fRunVertexFinder && fRunTracking.IsNull() &&
612 // fFillESD.IsNull()) return kTRUE;
615 if (fRunVertexFinder && !CreateVertexer()) {
623 if (!fRunTracking.IsNull() && !CreateTrackers(fRunTracking)) {
631 TStopwatch stopwatch;
634 // get the possibly already existing ESD file and tree
635 AliESD* esd = new AliESD; AliESD* hltesd = new AliESD;
636 TFile* fileOld = NULL;
637 TTree* treeOld = NULL; TTree *hlttreeOld = NULL;
638 if (!gSystem->AccessPathName("AliESDs.root")){
639 gSystem->CopyFile("AliESDs.root", "AliESDs.old.root", kTRUE);
640 fileOld = TFile::Open("AliESDs.old.root");
641 if (fileOld && fileOld->IsOpen()) {
642 treeOld = (TTree*) fileOld->Get("esdTree");
643 if (treeOld) treeOld->SetBranchAddress("ESD", &esd);
644 hlttreeOld = (TTree*) fileOld->Get("HLTesdTree");
645 if (hlttreeOld) hlttreeOld->SetBranchAddress("ESD", &hltesd);
649 // create the ESD output file and tree
650 TFile* file = TFile::Open("AliESDs.root", "RECREATE");
651 if (!file->IsOpen()) {
652 AliError("opening AliESDs.root failed");
653 if (fStopOnError) {CleanUp(file, fileOld); return kFALSE;}
655 TTree* tree = new TTree("esdTree", "Tree with ESD objects");
656 tree->Branch("ESD", "AliESD", &esd);
657 TTree* hlttree = new TTree("HLTesdTree", "Tree with HLT ESD objects");
658 hlttree->Branch("ESD", "AliESD", &hltesd);
659 delete esd; delete hltesd;
660 esd = NULL; hltesd = NULL;
662 // create the branch with ESD additions
663 AliESDfriend *esdf=0;
664 if (fWriteESDfriend) {
665 TBranch *br=tree->Branch("ESDfriend.", "AliESDfriend", &esdf);
666 br->SetFile("AliESDfriends.root");
669 // Get the diamond profile from OCDB
670 AliCDBEntry* entry = AliCDBManager::Instance()
671 ->Get("GRP/Calib/MeanVertex");
674 fDiamondProfile = dynamic_cast<AliESDVertex*> (entry->GetObject());
676 AliError("No diamond profile found in OCDB!");
679 AliVertexerTracks tVertexer(AliTracker::GetBz());
680 if(fDiamondProfile) tVertexer.SetVtxStart(fDiamondProfile);
683 if (fRawReader) fRawReader->RewindEvents();
685 for (Int_t iEvent = 0; iEvent < fRunLoader->GetNumberOfEvents(); iEvent++) {
686 if (fRawReader) fRawReader->NextEvent();
687 if ((iEvent < fFirstEvent) || ((fLastEvent >= 0) && (iEvent > fLastEvent))) {
688 // copy old ESD to the new one
690 treeOld->SetBranchAddress("ESD", &esd);
691 treeOld->GetEntry(iEvent);
695 hlttreeOld->SetBranchAddress("ESD", &hltesd);
696 hlttreeOld->GetEntry(iEvent);
702 AliInfo(Form("processing event %d", iEvent));
703 fRunLoader->GetEvent(iEvent);
706 sprintf(aFileName, "ESD_%d.%d_final.root",
707 fRunLoader->GetHeader()->GetRun(),
708 fRunLoader->GetHeader()->GetEventNrInRun());
709 if (!gSystem->AccessPathName(aFileName)) continue;
711 // local reconstruction
712 if (!fRunLocalReconstruction.IsNull()) {
713 if (!RunLocalEventReconstruction(fRunLocalReconstruction)) {
714 if (fStopOnError) {CleanUp(file, fileOld); return kFALSE;}
718 esd = new AliESD; hltesd = new AliESD;
719 esd->SetRunNumber(fRunLoader->GetHeader()->GetRun());
720 hltesd->SetRunNumber(fRunLoader->GetHeader()->GetRun());
721 esd->SetEventNumberInFile(fRunLoader->GetHeader()->GetEventNrInRun());
722 hltesd->SetEventNumberInFile(fRunLoader->GetHeader()->GetEventNrInRun());
724 // Set magnetic field from the tracker
725 esd->SetMagneticField(AliTracker::GetBz());
726 hltesd->SetMagneticField(AliTracker::GetBz());
728 // Fill raw-data error log into the ESD
729 if (fRawReader) FillRawDataErrorLog(iEvent,esd);
732 if (fRunVertexFinder) {
733 if (!ReadESD(esd, "vertex")) {
734 if (!RunVertexFinder(esd)) {
735 if (fStopOnError) {CleanUp(file, fileOld); return kFALSE;}
737 if (fCheckPointLevel > 0) WriteESD(esd, "vertex");
742 if (!fRunTracking.IsNull()) {
743 if (fRunHLTTracking) {
744 hltesd->SetVertex(esd->GetVertex());
745 if (!RunHLTTracking(hltesd)) {
746 if (fStopOnError) {CleanUp(file, fileOld); return kFALSE;}
752 if (!fRunTracking.IsNull()) {
753 if (fRunMuonTracking) {
754 if (!RunMuonTracking()) {
755 if (fStopOnError) {CleanUp(file, fileOld); return kFALSE;}
761 if (!fRunTracking.IsNull()) {
762 if (!ReadESD(esd, "tracking")) {
763 if (!RunTracking(esd)) {
764 if (fStopOnError) {CleanUp(file, fileOld); return kFALSE;}
766 if (fCheckPointLevel > 0) WriteESD(esd, "tracking");
771 if (!fFillESD.IsNull()) {
772 if (!FillESD(esd, fFillESD)) {
773 if (fStopOnError) {CleanUp(file, fileOld); return kFALSE;}
776 // fill Event header information from the RawEventHeader
777 if (fRawReader){FillRawEventHeaderESD(esd);}
780 AliESDpid::MakePID(esd);
781 if (fCheckPointLevel > 1) WriteESD(esd, "PID");
783 if (fFillTriggerESD) {
784 if (!ReadESD(esd, "trigger")) {
785 if (!FillTriggerESD(esd)) {
786 if (fStopOnError) {CleanUp(file, fileOld); return kFALSE;}
788 if (fCheckPointLevel > 1) WriteESD(esd, "trigger");
792 //Try to improve the reconstructed primary vertex position using the tracks
793 AliESDVertex *pvtx=tVertexer.FindPrimaryVertex(esd);
794 if(fDiamondProfile) esd->SetDiamond(fDiamondProfile);
797 if (pvtx->GetStatus()) {
798 // Store the improved primary vertex
799 esd->SetPrimaryVertex(pvtx);
800 // Propagate the tracks to the DCA to the improved primary vertex
801 Double_t somethingbig = 777.;
802 Double_t bz = esd->GetMagneticField();
803 Int_t nt=esd->GetNumberOfTracks();
805 AliESDtrack *t = esd->GetTrack(nt);
806 t->RelateToVertex(pvtx, bz, somethingbig);
813 vtxer.Tracks2V0vertices(esd);
816 AliCascadeVertexer cvtxer;
817 cvtxer.V0sTracks2CascadeVertices(esd);
821 if (fWriteESDfriend) {
822 esdf=new AliESDfriend();
823 esd->GetESDfriend(esdf);
830 if (fCheckPointLevel > 0) WriteESD(esd, "final");
832 delete esd; delete esdf; delete hltesd;
833 esd = NULL; esdf=NULL; hltesd = NULL;
836 AliInfo(Form("Execution time for filling ESD : R:%.2fs C:%.2fs",
837 stopwatch.RealTime(),stopwatch.CpuTime()));
841 tree->SetBranchStatus("ESDfriend*",0);
849 // Create tags for the events in the ESD tree (the ESD tree is always present)
850 // In case of empty events the tags will contain dummy values
852 CleanUp(file, fileOld);
858 //_____________________________________________________________________________
859 Bool_t AliReconstruction::RunLocalReconstruction(const TString& detectors)
861 // run the local reconstruction
863 TStopwatch stopwatch;
866 AliCDBManager* man = AliCDBManager::Instance();
867 Bool_t origCache = man->GetCacheFlag();
869 TString detStr = detectors;
870 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
871 if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
872 AliReconstructor* reconstructor = GetReconstructor(iDet);
873 if (!reconstructor) continue;
874 if (reconstructor->HasLocalReconstruction()) continue;
876 AliInfo(Form("running reconstruction for %s", fgkDetectorName[iDet]));
877 TStopwatch stopwatchDet;
878 stopwatchDet.Start();
880 AliInfo(Form("Loading calibration data from OCDB for %s", fgkDetectorName[iDet]));
882 man->SetCacheFlag(kTRUE);
883 TString calibPath = Form("%s/Calib/*", fgkDetectorName[iDet]);
884 man->GetAll(calibPath); // entries are cached!
887 fRawReader->RewindEvents();
888 reconstructor->Reconstruct(fRunLoader, fRawReader);
890 reconstructor->Reconstruct(fRunLoader);
892 AliInfo(Form("Execution time for %s: R:%.2fs C:%.2fs",
893 fgkDetectorName[iDet],
894 stopwatchDet.RealTime(),stopwatchDet.CpuTime()));
896 // unload calibration data
900 man->SetCacheFlag(origCache);
902 if ((detStr.CompareTo("ALL") != 0) && !detStr.IsNull()) {
903 AliError(Form("the following detectors were not found: %s",
905 if (fStopOnError) return kFALSE;
908 AliInfo(Form("Execution time: R:%.2fs C:%.2fs",
909 stopwatch.RealTime(),stopwatch.CpuTime()));
914 //_____________________________________________________________________________
915 Bool_t AliReconstruction::RunLocalEventReconstruction(const TString& detectors)
917 // run the local reconstruction
919 TStopwatch stopwatch;
922 TString detStr = detectors;
923 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
924 if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
925 AliReconstructor* reconstructor = GetReconstructor(iDet);
926 if (!reconstructor) continue;
927 AliLoader* loader = fLoader[iDet];
929 // conversion of digits
930 if (fRawReader && reconstructor->HasDigitConversion()) {
931 AliInfo(Form("converting raw data digits into root objects for %s",
932 fgkDetectorName[iDet]));
933 TStopwatch stopwatchDet;
934 stopwatchDet.Start();
935 loader->LoadDigits("update");
936 loader->CleanDigits();
937 loader->MakeDigitsContainer();
938 TTree* digitsTree = loader->TreeD();
939 reconstructor->ConvertDigits(fRawReader, digitsTree);
940 loader->WriteDigits("OVERWRITE");
941 loader->UnloadDigits();
942 AliInfo(Form("Execution time for %s: R:%.2fs C:%.2fs",
943 fgkDetectorName[iDet],
944 stopwatchDet.RealTime(),stopwatchDet.CpuTime()));
947 // local reconstruction
948 if (!reconstructor->HasLocalReconstruction()) continue;
949 AliInfo(Form("running reconstruction for %s", fgkDetectorName[iDet]));
950 TStopwatch stopwatchDet;
951 stopwatchDet.Start();
952 loader->LoadRecPoints("update");
953 loader->CleanRecPoints();
954 loader->MakeRecPointsContainer();
955 TTree* clustersTree = loader->TreeR();
956 if (fRawReader && !reconstructor->HasDigitConversion()) {
957 reconstructor->Reconstruct(fRawReader, clustersTree);
959 loader->LoadDigits("read");
960 TTree* digitsTree = loader->TreeD();
962 AliError(Form("Can't get the %s digits tree", fgkDetectorName[iDet]));
963 if (fStopOnError) return kFALSE;
965 reconstructor->Reconstruct(digitsTree, clustersTree);
967 loader->UnloadDigits();
969 loader->WriteRecPoints("OVERWRITE");
970 loader->UnloadRecPoints();
971 AliDebug(1,Form("Execution time for %s: R:%.2fs C:%.2fs",
972 fgkDetectorName[iDet],
973 stopwatchDet.RealTime(),stopwatchDet.CpuTime()));
976 if ((detStr.CompareTo("ALL") != 0) && !detStr.IsNull()) {
977 AliError(Form("the following detectors were not found: %s",
979 if (fStopOnError) return kFALSE;
982 AliInfo(Form("Execution time: R:%.2fs C:%.2fs",
983 stopwatch.RealTime(),stopwatch.CpuTime()));
988 //_____________________________________________________________________________
989 Bool_t AliReconstruction::RunVertexFinder(AliESD*& esd)
991 // run the barrel tracking
993 TStopwatch stopwatch;
996 AliESDVertex* vertex = NULL;
997 Double_t vtxPos[3] = {0, 0, 0};
998 Double_t vtxErr[3] = {0.07, 0.07, 0.1};
1000 if (fRunLoader->GetHeader() && fRunLoader->GetHeader()->GenEventHeader()) {
1001 fRunLoader->GetHeader()->GenEventHeader()->PrimaryVertex(mcVertex);
1002 for (Int_t i = 0; i < 3; i++) vtxPos[i] = mcVertex[i];
1006 if(fDiamondProfile) fVertexer->SetVtxStart(fDiamondProfile);
1007 AliInfo("running the ITS vertex finder");
1008 if (fLoader[0]) fLoader[0]->LoadRecPoints();
1009 vertex = fVertexer->FindVertexForCurrentEvent(fRunLoader->GetEventNumber());
1010 if (fLoader[0]) fLoader[0]->UnloadRecPoints();
1012 AliWarning("Vertex not found");
1013 vertex = new AliESDVertex();
1014 vertex->SetName("default");
1017 vertex->SetTruePos(vtxPos); // store also the vertex from MC
1018 vertex->SetName("reconstructed");
1022 AliInfo("getting the primary vertex from MC");
1023 vertex = new AliESDVertex(vtxPos, vtxErr);
1027 vertex->GetXYZ(vtxPos);
1028 vertex->GetSigmaXYZ(vtxErr);
1030 AliWarning("no vertex reconstructed");
1031 vertex = new AliESDVertex(vtxPos, vtxErr);
1033 esd->SetVertex(vertex);
1034 // if SPD multiplicity has been determined, it is stored in the ESD
1035 AliMultiplicity *mult= fVertexer->GetMultiplicity();
1036 if(mult)esd->SetMultiplicity(mult);
1038 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
1039 if (fTracker[iDet]) fTracker[iDet]->SetVertex(vtxPos, vtxErr);
1043 AliInfo(Form("Execution time: R:%.2fs C:%.2fs",
1044 stopwatch.RealTime(),stopwatch.CpuTime()));
1049 //_____________________________________________________________________________
1050 Bool_t AliReconstruction::RunHLTTracking(AliESD*& esd)
1052 // run the HLT barrel tracking
1054 TStopwatch stopwatch;
1058 AliError("Missing runLoader!");
1062 AliInfo("running HLT tracking");
1064 // Get a pointer to the HLT reconstructor
1065 AliReconstructor *reconstructor = GetReconstructor(fgkNDetectors-1);
1066 if (!reconstructor) return kFALSE;
1069 for (Int_t iDet = 1; iDet >= 0; iDet--) {
1070 TString detName = fgkDetectorName[iDet];
1071 AliDebug(1, Form("%s HLT tracking", detName.Data()));
1072 reconstructor->SetOption(detName.Data());
1073 AliTracker *tracker = reconstructor->CreateTracker(fRunLoader);
1075 AliWarning(Form("couldn't create a HLT tracker for %s", detName.Data()));
1076 if (fStopOnError) return kFALSE;
1080 Double_t vtxErr[3]={0.005,0.005,0.010};
1081 const AliESDVertex *vertex = esd->GetVertex();
1082 vertex->GetXYZ(vtxPos);
1083 tracker->SetVertex(vtxPos,vtxErr);
1085 fLoader[iDet]->LoadRecPoints("read");
1086 TTree* tree = fLoader[iDet]->TreeR();
1088 AliError(Form("Can't get the %s cluster tree", detName.Data()));
1091 tracker->LoadClusters(tree);
1093 if (tracker->Clusters2Tracks(esd) != 0) {
1094 AliError(Form("HLT %s Clusters2Tracks failed", fgkDetectorName[iDet]));
1098 tracker->UnloadClusters();
1103 AliInfo(Form("Execution time: R:%.2fs C:%.2fs",
1104 stopwatch.RealTime(),stopwatch.CpuTime()));
1109 //_____________________________________________________________________________
1110 Bool_t AliReconstruction::RunMuonTracking()
1112 // run the muon spectrometer tracking
1114 TStopwatch stopwatch;
1118 AliError("Missing runLoader!");
1121 Int_t iDet = 7; // for MUON
1123 AliInfo("is running...");
1125 // Get a pointer to the MUON reconstructor
1126 AliReconstructor *reconstructor = GetReconstructor(iDet);
1127 if (!reconstructor) return kFALSE;
1130 TString detName = fgkDetectorName[iDet];
1131 AliDebug(1, Form("%s tracking", detName.Data()));
1132 AliTracker *tracker = reconstructor->CreateTracker(fRunLoader);
1134 AliWarning(Form("couldn't create a tracker for %s", detName.Data()));
1139 fLoader[iDet]->LoadTracks("update");
1140 fLoader[iDet]->CleanTracks();
1141 fLoader[iDet]->MakeTracksContainer();
1144 fLoader[iDet]->LoadRecPoints("read");
1146 if (!tracker->Clusters2Tracks(0x0)) {
1147 AliError(Form("%s Clusters2Tracks failed", fgkDetectorName[iDet]));
1150 fLoader[iDet]->UnloadRecPoints();
1152 fLoader[iDet]->WriteTracks("OVERWRITE");
1153 fLoader[iDet]->UnloadTracks();
1158 AliInfo(Form("Execution time: R:%.2fs C:%.2fs",
1159 stopwatch.RealTime(),stopwatch.CpuTime()));
1165 //_____________________________________________________________________________
1166 Bool_t AliReconstruction::RunTracking(AliESD*& esd)
1168 // run the barrel tracking
1170 TStopwatch stopwatch;
1173 AliInfo("running tracking");
1175 // pass 1: TPC + ITS inwards
1176 for (Int_t iDet = 1; iDet >= 0; iDet--) {
1177 if (!fTracker[iDet]) continue;
1178 AliDebug(1, Form("%s tracking", fgkDetectorName[iDet]));
1181 fLoader[iDet]->LoadRecPoints("read");
1182 TTree* tree = fLoader[iDet]->TreeR();
1184 AliError(Form("Can't get the %s cluster tree", fgkDetectorName[iDet]));
1187 fTracker[iDet]->LoadClusters(tree);
1190 if (fTracker[iDet]->Clusters2Tracks(esd) != 0) {
1191 AliError(Form("%s Clusters2Tracks failed", fgkDetectorName[iDet]));
1194 if (fCheckPointLevel > 1) {
1195 WriteESD(esd, Form("%s.tracking", fgkDetectorName[iDet]));
1197 // preliminary PID in TPC needed by the ITS tracker
1199 GetReconstructor(1)->FillESD(fRunLoader, esd);
1200 GetReconstructor(1)->FillESD((TTree*)NULL, (TTree*)NULL, esd);
1201 AliESDpid::MakePID(esd);
1205 // pass 2: ALL backwards
1206 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
1207 if (!fTracker[iDet]) continue;
1208 AliDebug(1, Form("%s back propagation", fgkDetectorName[iDet]));
1211 if (iDet > 1) { // all except ITS, TPC
1213 fLoader[iDet]->LoadRecPoints("read");
1214 tree = fLoader[iDet]->TreeR();
1216 AliError(Form("Can't get the %s cluster tree", fgkDetectorName[iDet]));
1219 fTracker[iDet]->LoadClusters(tree);
1223 if (fTracker[iDet]->PropagateBack(esd) != 0) {
1224 AliError(Form("%s backward propagation failed", fgkDetectorName[iDet]));
1227 if (fCheckPointLevel > 1) {
1228 WriteESD(esd, Form("%s.back", fgkDetectorName[iDet]));
1232 if (iDet > 2) { // all except ITS, TPC, TRD
1233 fTracker[iDet]->UnloadClusters();
1234 fLoader[iDet]->UnloadRecPoints();
1236 // updated PID in TPC needed by the ITS tracker -MI
1238 GetReconstructor(1)->FillESD(fRunLoader, esd);
1239 GetReconstructor(1)->FillESD((TTree*)NULL, (TTree*)NULL, esd);
1240 AliESDpid::MakePID(esd);
1244 // write space-points to the ESD in case alignment data output
1246 if (fWriteAlignmentData)
1247 WriteAlignmentData(esd);
1249 // pass 3: TRD + TPC + ITS refit inwards
1250 for (Int_t iDet = 2; iDet >= 0; iDet--) {
1251 if (!fTracker[iDet]) continue;
1252 AliDebug(1, Form("%s inward refit", fgkDetectorName[iDet]));
1255 if (fTracker[iDet]->RefitInward(esd) != 0) {
1256 AliError(Form("%s inward refit failed", fgkDetectorName[iDet]));
1259 if (fCheckPointLevel > 1) {
1260 WriteESD(esd, Form("%s.refit", fgkDetectorName[iDet]));
1264 fTracker[iDet]->UnloadClusters();
1265 fLoader[iDet]->UnloadRecPoints();
1268 // Propagate track to the vertex - if not done by ITS
1270 Int_t ntracks = esd->GetNumberOfTracks();
1271 for (Int_t itrack=0; itrack<ntracks; itrack++){
1272 const Double_t kRadius = 3; // beam pipe radius
1273 const Double_t kMaxStep = 5; // max step
1274 const Double_t kMaxD = 123456; // max distance to prim vertex
1275 Double_t fieldZ = AliTracker::GetBz(); //
1276 AliESDtrack * track = esd->GetTrack(itrack);
1277 if (!track) continue;
1278 if (track->IsOn(AliESDtrack::kITSrefit)) continue;
1279 track->PropagateTo(kRadius, fieldZ, track->GetMass(),kMaxStep,kTRUE);
1280 track->RelateToVertex(esd->GetVertex(),fieldZ, kMaxD);
1283 AliInfo(Form("Execution time: R:%.2fs C:%.2fs",
1284 stopwatch.RealTime(),stopwatch.CpuTime()));
1289 //_____________________________________________________________________________
1290 Bool_t AliReconstruction::FillESD(AliESD*& esd, const TString& detectors)
1292 // fill the event summary data
1294 TStopwatch stopwatch;
1296 AliInfo("filling ESD");
1298 TString detStr = detectors;
1299 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
1300 if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
1301 AliReconstructor* reconstructor = GetReconstructor(iDet);
1302 if (!reconstructor) continue;
1304 if (!ReadESD(esd, fgkDetectorName[iDet])) {
1305 AliDebug(1, Form("filling ESD for %s", fgkDetectorName[iDet]));
1306 TTree* clustersTree = NULL;
1307 if (reconstructor->HasLocalReconstruction() && fLoader[iDet]) {
1308 fLoader[iDet]->LoadRecPoints("read");
1309 clustersTree = fLoader[iDet]->TreeR();
1310 if (!clustersTree) {
1311 AliError(Form("Can't get the %s clusters tree",
1312 fgkDetectorName[iDet]));
1313 if (fStopOnError) return kFALSE;
1316 if (fRawReader && !reconstructor->HasDigitConversion()) {
1317 reconstructor->FillESD(fRawReader, clustersTree, esd);
1319 TTree* digitsTree = NULL;
1320 if (fLoader[iDet]) {
1321 fLoader[iDet]->LoadDigits("read");
1322 digitsTree = fLoader[iDet]->TreeD();
1324 AliError(Form("Can't get the %s digits tree",
1325 fgkDetectorName[iDet]));
1326 if (fStopOnError) return kFALSE;
1329 reconstructor->FillESD(digitsTree, clustersTree, esd);
1330 if (fLoader[iDet]) fLoader[iDet]->UnloadDigits();
1332 if (reconstructor->HasLocalReconstruction() && fLoader[iDet]) {
1333 fLoader[iDet]->UnloadRecPoints();
1337 reconstructor->FillESD(fRunLoader, fRawReader, esd);
1339 reconstructor->FillESD(fRunLoader, esd);
1341 if (fCheckPointLevel > 2) WriteESD(esd, fgkDetectorName[iDet]);
1345 if ((detStr.CompareTo("ALL") != 0) && !detStr.IsNull()) {
1346 AliError(Form("the following detectors were not found: %s",
1348 if (fStopOnError) return kFALSE;
1351 AliInfo(Form("Execution time: R:%.2fs C:%.2fs",
1352 stopwatch.RealTime(),stopwatch.CpuTime()));
1357 //_____________________________________________________________________________
1358 Bool_t AliReconstruction::FillTriggerESD(AliESD*& esd)
1360 // Reads the trigger decision which is
1361 // stored in Trigger.root file and fills
1362 // the corresponding esd entries
1364 AliInfo("Filling trigger information into the ESD");
1367 AliCTPRawStream input(fRawReader);
1368 if (!input.Next()) {
1369 AliError("No valid CTP (trigger) DDL raw data is found ! The trigger information is not stored in the ESD !");
1372 esd->SetTriggerMask(input.GetClassMask());
1373 esd->SetTriggerCluster(input.GetClusterMask());
1376 AliRunLoader *runloader = AliRunLoader::GetRunLoader();
1378 if (!runloader->LoadTrigger()) {
1379 AliCentralTrigger *aCTP = runloader->GetTrigger();
1380 esd->SetTriggerMask(aCTP->GetClassMask());
1381 esd->SetTriggerCluster(aCTP->GetClusterMask());
1384 AliWarning("No trigger can be loaded! The trigger information is not stored in the ESD !");
1389 AliError("No run loader is available! The trigger information is not stored in the ESD !");
1401 //_____________________________________________________________________________
1402 Bool_t AliReconstruction::FillRawEventHeaderESD(AliESD*& esd)
1405 // Filling information from RawReader Header
1408 AliInfo("Filling information from RawReader Header");
1409 esd->SetBunchCrossNumber(0);
1410 esd->SetOrbitNumber(0);
1411 esd->SetPeriodNumber(0);
1412 esd->SetTimeStamp(0);
1413 esd->SetEventType(0);
1414 const AliRawEventHeaderBase * eventHeader = fRawReader->GetEventHeader();
1417 const UInt_t *id = eventHeader->GetP("Id");
1418 esd->SetBunchCrossNumber((id)[1]&0x00000fff);
1419 esd->SetOrbitNumber((((id)[0]<<20)&0xf00000)|(((id)[1]>>12)&0xfffff));
1420 esd->SetPeriodNumber(((id)[0]>>4)&0x0fffffff);
1422 esd->SetTimeStamp((eventHeader->Get("Timestamp")));
1423 esd->SetEventType((eventHeader->Get("Type")));
1430 //_____________________________________________________________________________
1431 Bool_t AliReconstruction::IsSelected(TString detName, TString& detectors) const
1433 // check whether detName is contained in detectors
1434 // if yes, it is removed from detectors
1436 // check if all detectors are selected
1437 if ((detectors.CompareTo("ALL") == 0) ||
1438 detectors.BeginsWith("ALL ") ||
1439 detectors.EndsWith(" ALL") ||
1440 detectors.Contains(" ALL ")) {
1445 // search for the given detector
1446 Bool_t result = kFALSE;
1447 if ((detectors.CompareTo(detName) == 0) ||
1448 detectors.BeginsWith(detName+" ") ||
1449 detectors.EndsWith(" "+detName) ||
1450 detectors.Contains(" "+detName+" ")) {
1451 detectors.ReplaceAll(detName, "");
1455 // clean up the detectors string
1456 while (detectors.Contains(" ")) detectors.ReplaceAll(" ", " ");
1457 while (detectors.BeginsWith(" ")) detectors.Remove(0, 1);
1458 while (detectors.EndsWith(" ")) detectors.Remove(detectors.Length()-1, 1);
1463 //_____________________________________________________________________________
1464 Bool_t AliReconstruction::InitRunLoader()
1466 // get or create the run loader
1468 if (gAlice) delete gAlice;
1471 if (!gSystem->AccessPathName(fGAliceFileName.Data())) { // galice.root exists
1472 // load all base libraries to get the loader classes
1473 TString libs = gSystem->GetLibraries();
1474 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
1475 TString detName = fgkDetectorName[iDet];
1476 if (detName == "HLT") continue;
1477 if (libs.Contains("lib" + detName + "base.so")) continue;
1478 gSystem->Load("lib" + detName + "base.so");
1480 fRunLoader = AliRunLoader::Open(fGAliceFileName.Data());
1482 AliError(Form("no run loader found in file %s", fGAliceFileName.Data()));
1486 fRunLoader->CdGAFile();
1487 if (gFile->GetKey(AliRunLoader::GetGAliceName())) {
1488 if (fRunLoader->LoadgAlice() == 0) {
1489 gAlice = fRunLoader->GetAliRun();
1490 AliTracker::SetFieldMap(gAlice->Field(),fUniformField);
1493 if (!gAlice && !fRawReader) {
1494 AliError(Form("no gAlice object found in file %s",
1495 fGAliceFileName.Data()));
1500 } else { // galice.root does not exist
1502 AliError(Form("the file %s does not exist", fGAliceFileName.Data()));
1506 fRunLoader = AliRunLoader::Open(fGAliceFileName.Data(),
1507 AliConfig::GetDefaultEventFolderName(),
1510 AliError(Form("could not create run loader in file %s",
1511 fGAliceFileName.Data()));
1515 fRunLoader->MakeTree("E");
1517 while (fRawReader->NextEvent()) {
1518 fRunLoader->SetEventNumber(iEvent);
1519 fRunLoader->GetHeader()->Reset(fRawReader->GetRunNumber(),
1521 fRunLoader->MakeTree("H");
1522 fRunLoader->TreeE()->Fill();
1525 fRawReader->RewindEvents();
1526 if (fNumberOfEventsPerFile > 0)
1527 fRunLoader->SetNumberOfEventsPerFile(fNumberOfEventsPerFile);
1529 fRunLoader->SetNumberOfEventsPerFile(iEvent);
1530 fRunLoader->WriteHeader("OVERWRITE");
1531 fRunLoader->CdGAFile();
1532 fRunLoader->Write(0, TObject::kOverwrite);
1533 // AliTracker::SetFieldMap(???);
1539 //_____________________________________________________________________________
1540 AliReconstructor* AliReconstruction::GetReconstructor(Int_t iDet)
1542 // get the reconstructor object and the loader for a detector
1544 if (fReconstructor[iDet]) return fReconstructor[iDet];
1546 // load the reconstructor object
1547 TPluginManager* pluginManager = gROOT->GetPluginManager();
1548 TString detName = fgkDetectorName[iDet];
1549 TString recName = "Ali" + detName + "Reconstructor";
1550 if (gAlice && !gAlice->GetDetector(detName) && (detName != "HLT")) return NULL;
1552 if (detName == "HLT") {
1553 if (!gROOT->GetClass("AliLevel3")) {
1554 gSystem->Load("libAliHLTSrc.so");
1555 gSystem->Load("libAliHLTMisc.so");
1556 gSystem->Load("libAliHLTHough.so");
1557 gSystem->Load("libAliHLTComp.so");
1561 AliReconstructor* reconstructor = NULL;
1562 // first check if a plugin is defined for the reconstructor
1563 TPluginHandler* pluginHandler =
1564 pluginManager->FindHandler("AliReconstructor", detName);
1565 // if not, add a plugin for it
1566 if (!pluginHandler) {
1567 AliDebug(1, Form("defining plugin for %s", recName.Data()));
1568 TString libs = gSystem->GetLibraries();
1569 if (libs.Contains("lib" + detName + "base.so") ||
1570 (gSystem->Load("lib" + detName + "base.so") >= 0)) {
1571 pluginManager->AddHandler("AliReconstructor", detName,
1572 recName, detName + "rec", recName + "()");
1574 pluginManager->AddHandler("AliReconstructor", detName,
1575 recName, detName, recName + "()");
1577 pluginHandler = pluginManager->FindHandler("AliReconstructor", detName);
1579 if (pluginHandler && (pluginHandler->LoadPlugin() == 0)) {
1580 reconstructor = (AliReconstructor*) pluginHandler->ExecPlugin(0);
1582 if (reconstructor) {
1583 TObject* obj = fOptions.FindObject(detName.Data());
1584 if (obj) reconstructor->SetOption(obj->GetTitle());
1585 reconstructor->Init(fRunLoader);
1586 fReconstructor[iDet] = reconstructor;
1589 // get or create the loader
1590 if (detName != "HLT") {
1591 fLoader[iDet] = fRunLoader->GetLoader(detName + "Loader");
1592 if (!fLoader[iDet]) {
1593 AliConfig::Instance()
1594 ->CreateDetectorFolders(fRunLoader->GetEventFolder(),
1596 // first check if a plugin is defined for the loader
1598 pluginManager->FindHandler("AliLoader", detName);
1599 // if not, add a plugin for it
1600 if (!pluginHandler) {
1601 TString loaderName = "Ali" + detName + "Loader";
1602 AliDebug(1, Form("defining plugin for %s", loaderName.Data()));
1603 pluginManager->AddHandler("AliLoader", detName,
1604 loaderName, detName + "base",
1605 loaderName + "(const char*, TFolder*)");
1606 pluginHandler = pluginManager->FindHandler("AliLoader", detName);
1608 if (pluginHandler && (pluginHandler->LoadPlugin() == 0)) {
1610 (AliLoader*) pluginHandler->ExecPlugin(2, detName.Data(),
1611 fRunLoader->GetEventFolder());
1613 if (!fLoader[iDet]) { // use default loader
1614 fLoader[iDet] = new AliLoader(detName, fRunLoader->GetEventFolder());
1616 if (!fLoader[iDet]) {
1617 AliWarning(Form("couldn't get loader for %s", detName.Data()));
1618 if (fStopOnError) return NULL;
1620 fRunLoader->AddLoader(fLoader[iDet]);
1621 fRunLoader->CdGAFile();
1622 if (gFile && !gFile->IsWritable()) gFile->ReOpen("UPDATE");
1623 fRunLoader->Write(0, TObject::kOverwrite);
1628 return reconstructor;
1631 //_____________________________________________________________________________
1632 Bool_t AliReconstruction::CreateVertexer()
1634 // create the vertexer
1637 AliReconstructor* itsReconstructor = GetReconstructor(0);
1638 if (itsReconstructor) {
1639 fVertexer = itsReconstructor->CreateVertexer(fRunLoader);
1642 AliWarning("couldn't create a vertexer for ITS");
1643 if (fStopOnError) return kFALSE;
1649 //_____________________________________________________________________________
1650 Bool_t AliReconstruction::CreateTrackers(const TString& detectors)
1652 // create the trackers
1654 TString detStr = detectors;
1655 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
1656 if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
1657 AliReconstructor* reconstructor = GetReconstructor(iDet);
1658 if (!reconstructor) continue;
1659 TString detName = fgkDetectorName[iDet];
1660 if (detName == "HLT") {
1661 fRunHLTTracking = kTRUE;
1664 if (detName == "MUON") {
1665 fRunMuonTracking = kTRUE;
1670 fTracker[iDet] = reconstructor->CreateTracker(fRunLoader);
1671 if (!fTracker[iDet] && (iDet < 7)) {
1672 AliWarning(Form("couldn't create a tracker for %s", detName.Data()));
1673 if (fStopOnError) return kFALSE;
1680 //_____________________________________________________________________________
1681 void AliReconstruction::CleanUp(TFile* file, TFile* fileOld)
1683 // delete trackers and the run loader and close and delete the file
1685 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
1686 delete fReconstructor[iDet];
1687 fReconstructor[iDet] = NULL;
1688 fLoader[iDet] = NULL;
1689 delete fTracker[iDet];
1690 fTracker[iDet] = NULL;
1694 delete fDiamondProfile;
1695 fDiamondProfile = NULL;
1710 gSystem->Unlink("AliESDs.old.root");
1715 //_____________________________________________________________________________
1716 Bool_t AliReconstruction::ReadESD(AliESD*& esd, const char* recStep) const
1718 // read the ESD event from a file
1720 if (!esd) return kFALSE;
1722 sprintf(fileName, "ESD_%d.%d_%s.root",
1723 esd->GetRunNumber(), esd->GetEventNumberInFile(), recStep);
1724 if (gSystem->AccessPathName(fileName)) return kFALSE;
1726 AliInfo(Form("reading ESD from file %s", fileName));
1727 AliDebug(1, Form("reading ESD from file %s", fileName));
1728 TFile* file = TFile::Open(fileName);
1729 if (!file || !file->IsOpen()) {
1730 AliError(Form("opening %s failed", fileName));
1737 esd = (AliESD*) file->Get("ESD");
1743 //_____________________________________________________________________________
1744 void AliReconstruction::WriteESD(AliESD* esd, const char* recStep) const
1746 // write the ESD event to a file
1750 sprintf(fileName, "ESD_%d.%d_%s.root",
1751 esd->GetRunNumber(), esd->GetEventNumberInFile(), recStep);
1753 AliDebug(1, Form("writing ESD to file %s", fileName));
1754 TFile* file = TFile::Open(fileName, "recreate");
1755 if (!file || !file->IsOpen()) {
1756 AliError(Form("opening %s failed", fileName));
1767 //_____________________________________________________________________________
1768 void AliReconstruction::CreateTag(TFile* file)
1773 Double_t fMUONMASS = 0.105658369;
1776 Double_t fThetaX, fThetaY, fPyz, fChisquare;
1777 Double_t fPxRec,fPyRec, fPzRec, fEnergy;
1779 TLorentzVector fEPvector;
1781 Float_t fZVertexCut = 10.0;
1782 Float_t fRhoVertexCut = 2.0;
1784 Float_t fLowPtCut = 1.0;
1785 Float_t fHighPtCut = 3.0;
1786 Float_t fVeryHighPtCut = 10.0;
1789 Double_t partFrac[5] = {0.01, 0.01, 0.85, 0.10, 0.05};
1791 // Creates the tags for all the events in a given ESD file
1793 Int_t nProtons, nKaons, nPions, nMuons, nElectrons;
1794 Int_t nPos, nNeg, nNeutr;
1795 Int_t nK0s, nNeutrons, nPi0s, nGamas;
1796 Int_t nCh1GeV, nCh3GeV, nCh10GeV;
1797 Int_t nMu1GeV, nMu3GeV, nMu10GeV;
1798 Int_t nEl1GeV, nEl3GeV, nEl10GeV;
1799 Float_t maxPt = .0, meanPt = .0, totalP = .0;
1801 Int_t iRunNumber = 0;
1802 TString fVertexName("default");
1804 AliRunTag *tag = new AliRunTag();
1805 AliEventTag *evTag = new AliEventTag();
1806 TTree ttag("T","A Tree with event tags");
1807 TBranch * btag = ttag.Branch("AliTAG", &tag);
1808 btag->SetCompressionLevel(9);
1810 AliInfo(Form("Creating the tags......."));
1812 if (!file || !file->IsOpen()) {
1813 AliError(Form("opening failed"));
1817 Int_t lastEvent = 0;
1818 TTree *t = (TTree*) file->Get("esdTree");
1819 TBranch * b = t->GetBranch("ESD");
1821 b->SetAddress(&esd);
1823 b->GetEntry(fFirstEvent);
1824 Int_t iInitRunNumber = esd->GetRunNumber();
1826 Int_t iNumberOfEvents = (Int_t)b->GetEntries();
1827 if(fLastEvent != -1) iNumberOfEvents = fLastEvent + 1;
1828 for (Int_t iEventNumber = fFirstEvent; iEventNumber < iNumberOfEvents; iEventNumber++) {
1856 b->GetEntry(iEventNumber);
1857 iRunNumber = esd->GetRunNumber();
1858 if(iRunNumber != iInitRunNumber) AliFatal("Inconsistency of run numbers in the AliESD!!!");
1859 const AliESDVertex * vertexIn = esd->GetVertex();
1860 if (!vertexIn) AliError("ESD has not defined vertex.");
1861 if (vertexIn) fVertexName = vertexIn->GetName();
1862 if(fVertexName != "default") fVertexflag = 1;
1863 for (Int_t iTrackNumber = 0; iTrackNumber < esd->GetNumberOfTracks(); iTrackNumber++) {
1864 AliESDtrack * esdTrack = esd->GetTrack(iTrackNumber);
1865 UInt_t status = esdTrack->GetStatus();
1867 //select only tracks with ITS refit
1868 if ((status&AliESDtrack::kITSrefit)==0) continue;
1869 //select only tracks with TPC refit
1870 if ((status&AliESDtrack::kTPCrefit)==0) continue;
1872 //select only tracks with the "combined PID"
1873 if ((status&AliESDtrack::kESDpid)==0) continue;
1875 esdTrack->GetPxPyPz(p);
1876 Double_t momentum = sqrt(pow(p[0],2) + pow(p[1],2) + pow(p[2],2));
1877 Double_t fPt = sqrt(pow(p[0],2) + pow(p[1],2));
1880 if(fPt > maxPt) maxPt = fPt;
1882 if(esdTrack->GetSign() > 0) {
1884 if(fPt > fLowPtCut) nCh1GeV++;
1885 if(fPt > fHighPtCut) nCh3GeV++;
1886 if(fPt > fVeryHighPtCut) nCh10GeV++;
1888 if(esdTrack->GetSign() < 0) {
1890 if(fPt > fLowPtCut) nCh1GeV++;
1891 if(fPt > fHighPtCut) nCh3GeV++;
1892 if(fPt > fVeryHighPtCut) nCh10GeV++;
1894 if(esdTrack->GetSign() == 0) nNeutr++;
1898 esdTrack->GetESDpid(prob);
1901 for(Int_t i = 0; i < AliPID::kSPECIES; i++) rcc += prob[i]*partFrac[i];
1902 if(rcc == 0.0) continue;
1905 for(Int_t i = 0; i < AliPID::kSPECIES; i++) w[i] = prob[i]*partFrac[i]/rcc;
1908 if ((w[4]>w[3])&&(w[4]>w[2])&&(w[4]>w[1])&&(w[4]>w[0])) nProtons++;
1910 if ((w[3]>w[4])&&(w[3]>w[2])&&(w[3]>w[1])&&(w[3]>w[0])) nKaons++;
1912 if ((w[2]>w[4])&&(w[2]>w[3])&&(w[2]>w[1])&&(w[2]>w[0])) nPions++;
1914 if ((w[0]>w[4])&&(w[0]>w[3])&&(w[0]>w[2])&&(w[0]>w[1])) {
1916 if(fPt > fLowPtCut) nEl1GeV++;
1917 if(fPt > fHighPtCut) nEl3GeV++;
1918 if(fPt > fVeryHighPtCut) nEl10GeV++;
1926 Int_t nMuonTracks = esd->GetNumberOfMuonTracks();
1927 // loop over all reconstructed tracks (also first track of combination)
1928 for (Int_t iTrack = 0; iTrack < nMuonTracks; iTrack++) {
1929 AliESDMuonTrack* muonTrack = esd->GetMuonTrack(iTrack);
1930 if (muonTrack == 0x0) continue;
1932 // Coordinates at vertex
1933 fZ = muonTrack->GetZ();
1934 fY = muonTrack->GetBendingCoor();
1935 fX = muonTrack->GetNonBendingCoor();
1937 fThetaX = muonTrack->GetThetaX();
1938 fThetaY = muonTrack->GetThetaY();
1940 fPyz = 1./TMath::Abs(muonTrack->GetInverseBendingMomentum());
1941 fPzRec = - fPyz / TMath::Sqrt(1.0 + TMath::Tan(fThetaY)*TMath::Tan(fThetaY));
1942 fPxRec = fPzRec * TMath::Tan(fThetaX);
1943 fPyRec = fPzRec * TMath::Tan(fThetaY);
1944 fCharge = Int_t(TMath::Sign(1.,muonTrack->GetInverseBendingMomentum()));
1946 //ChiSquare of the track if needed
1947 fChisquare = muonTrack->GetChi2()/(2.0 * muonTrack->GetNHit() - 5);
1948 fEnergy = TMath::Sqrt(fMUONMASS * fMUONMASS + fPxRec * fPxRec + fPyRec * fPyRec + fPzRec * fPzRec);
1949 fEPvector.SetPxPyPzE(fPxRec, fPyRec, fPzRec, fEnergy);
1951 // total number of muons inside a vertex cut
1952 if((TMath::Abs(fZ)<fZVertexCut) && (TMath::Sqrt(fY*fY+fX*fX)<fRhoVertexCut)) {
1954 if(fEPvector.Pt() > fLowPtCut) {
1956 if(fEPvector.Pt() > fHighPtCut) {
1958 if (fEPvector.Pt() > fVeryHighPtCut) {
1966 // Fill the event tags
1968 meanPt = meanPt/ntrack;
1970 evTag->SetEventId(iEventNumber+1);
1972 evTag->SetVertexX(vertexIn->GetXv());
1973 evTag->SetVertexY(vertexIn->GetYv());
1974 evTag->SetVertexZ(vertexIn->GetZv());
1975 evTag->SetVertexZError(vertexIn->GetZRes());
1977 evTag->SetVertexFlag(fVertexflag);
1979 evTag->SetT0VertexZ(esd->GetT0zVertex());
1981 evTag->SetTriggerMask(esd->GetTriggerMask());
1982 evTag->SetTriggerCluster(esd->GetTriggerCluster());
1984 evTag->SetZDCNeutron1Energy(esd->GetZDCN1Energy());
1985 evTag->SetZDCProton1Energy(esd->GetZDCP1Energy());
1986 evTag->SetZDCNeutron2Energy(esd->GetZDCN2Energy());
1987 evTag->SetZDCProton2Energy(esd->GetZDCP2Energy());
1988 evTag->SetZDCEMEnergy(esd->GetZDCEMEnergy());
1989 evTag->SetNumOfParticipants(esd->GetZDCParticipants());
1992 evTag->SetNumOfTracks(esd->GetNumberOfTracks());
1993 evTag->SetNumOfPosTracks(nPos);
1994 evTag->SetNumOfNegTracks(nNeg);
1995 evTag->SetNumOfNeutrTracks(nNeutr);
1997 evTag->SetNumOfV0s(esd->GetNumberOfV0s());
1998 evTag->SetNumOfCascades(esd->GetNumberOfCascades());
1999 evTag->SetNumOfKinks(esd->GetNumberOfKinks());
2000 evTag->SetNumOfPMDTracks(esd->GetNumberOfPmdTracks());
2002 evTag->SetNumOfProtons(nProtons);
2003 evTag->SetNumOfKaons(nKaons);
2004 evTag->SetNumOfPions(nPions);
2005 evTag->SetNumOfMuons(nMuons);
2006 evTag->SetNumOfElectrons(nElectrons);
2007 evTag->SetNumOfPhotons(nGamas);
2008 evTag->SetNumOfPi0s(nPi0s);
2009 evTag->SetNumOfNeutrons(nNeutrons);
2010 evTag->SetNumOfKaon0s(nK0s);
2012 evTag->SetNumOfChargedAbove1GeV(nCh1GeV);
2013 evTag->SetNumOfChargedAbove3GeV(nCh3GeV);
2014 evTag->SetNumOfChargedAbove10GeV(nCh10GeV);
2015 evTag->SetNumOfMuonsAbove1GeV(nMu1GeV);
2016 evTag->SetNumOfMuonsAbove3GeV(nMu3GeV);
2017 evTag->SetNumOfMuonsAbove10GeV(nMu10GeV);
2018 evTag->SetNumOfElectronsAbove1GeV(nEl1GeV);
2019 evTag->SetNumOfElectronsAbove3GeV(nEl3GeV);
2020 evTag->SetNumOfElectronsAbove10GeV(nEl10GeV);
2022 evTag->SetNumOfPHOSClusters(esd->GetNumberOfPHOSClusters());
2023 evTag->SetNumOfEMCALClusters(esd->GetNumberOfEMCALClusters());
2025 evTag->SetTotalMomentum(totalP);
2026 evTag->SetMeanPt(meanPt);
2027 evTag->SetMaxPt(maxPt);
2029 tag->SetRunId(iInitRunNumber);
2030 tag->AddEventTag(*evTag);
2032 if(fLastEvent == -1) lastEvent = (Int_t)b->GetEntries();
2033 else lastEvent = fLastEvent;
2039 sprintf(fileName, "Run%d.Event%d_%d.ESD.tag.root",
2040 tag->GetRunId(),fFirstEvent,lastEvent );
2041 AliInfo(Form("writing tags to file %s", fileName));
2042 AliDebug(1, Form("writing tags to file %s", fileName));
2044 TFile* ftag = TFile::Open(fileName, "recreate");
2053 //_____________________________________________________________________________
2054 void AliReconstruction::CreateAOD(TFile* esdFile)
2056 // do nothing for now
2062 void AliReconstruction::WriteAlignmentData(AliESD* esd)
2064 // Write space-points which are then used in the alignment procedures
2065 // For the moment only ITS, TRD and TPC
2067 // Load TOF clusters
2069 fLoader[3]->LoadRecPoints("read");
2070 TTree* tree = fLoader[3]->TreeR();
2072 AliError(Form("Can't get the %s cluster tree", fgkDetectorName[3]));
2075 fTracker[3]->LoadClusters(tree);
2077 Int_t ntracks = esd->GetNumberOfTracks();
2078 for (Int_t itrack = 0; itrack < ntracks; itrack++)
2080 AliESDtrack *track = esd->GetTrack(itrack);
2083 for (Int_t iDet = 3; iDet >= 0; iDet--)
2084 nsp += track->GetNcls(iDet);
2086 AliTrackPointArray *sp = new AliTrackPointArray(nsp);
2087 track->SetTrackPointArray(sp);
2089 for (Int_t iDet = 3; iDet >= 0; iDet--) {
2090 AliTracker *tracker = fTracker[iDet];
2091 if (!tracker) continue;
2092 Int_t nspdet = track->GetNcls(iDet);
2093 if (nspdet <= 0) continue;
2094 track->GetClusters(iDet,idx);
2098 while (isp < nspdet) {
2099 Bool_t isvalid = tracker->GetTrackPoint(idx[isp2],p); isp2++;
2100 const Int_t kNTPCmax = 159;
2101 if (iDet==1 && isp2>kNTPCmax) break; // to be fixed
2102 if (!isvalid) continue;
2103 sp->AddPoint(isptrack,&p); isptrack++; isp++;
2109 fTracker[3]->UnloadClusters();
2110 fLoader[3]->UnloadRecPoints();
2114 //_____________________________________________________________________________
2115 void AliReconstruction::FillRawDataErrorLog(Int_t iEvent, AliESD* esd)
2117 // The method reads the raw-data error log
2118 // accumulated within the rawReader.
2119 // It extracts the raw-data errors related to
2120 // the current event and stores them into
2121 // a TClonesArray inside the esd object.
2123 if (!fRawReader) return;
2125 for(Int_t i = 0; i < fRawReader->GetNumberOfErrorLogs(); i++) {
2127 AliRawDataErrorLog *log = fRawReader->GetErrorLog(i);
2129 if (iEvent != log->GetEventNumber()) continue;
2131 esd->AddRawDataErrorLog(log);