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;
542 //_____________________________________________________________________________
543 void AliReconstruction::SetGAliceFile(const char* fileName)
545 // set the name of the galice file
547 fGAliceFileName = fileName;
550 //_____________________________________________________________________________
551 void AliReconstruction::SetOption(const char* detector, const char* option)
553 // set options for the reconstruction of a detector
555 TObject* obj = fOptions.FindObject(detector);
556 if (obj) fOptions.Remove(obj);
557 fOptions.Add(new TNamed(detector, option));
561 //_____________________________________________________________________________
562 Bool_t AliReconstruction::Run(const char* input)
564 // run the reconstruction
567 if (!input) input = fInput.Data();
568 TString fileName(input);
569 if (fileName.EndsWith("/")) {
570 fRawReader = new AliRawReaderFile(fileName);
571 } else if (fileName.EndsWith(".root")) {
572 fRawReader = new AliRawReaderRoot(fileName);
573 } else if (!fileName.IsNull()) {
574 fRawReader = new AliRawReaderDate(fileName);
575 fRawReader->SelectEvents(7);
577 if (!fEquipIdMap.IsNull() && fRawReader)
578 fRawReader->LoadEquipmentIdsMap(fEquipIdMap);
581 // get the run loader
582 if (!InitRunLoader()) return kFALSE;
584 // Initialize the CDB storage
587 // Set run number in CDBManager (if it is not already set by the user)
588 if (!SetRunNumber()) if (fStopOnError) return kFALSE;
590 // Import ideal TGeo geometry and apply misalignment
592 TString geom(gSystem->DirName(fGAliceFileName));
593 geom += "/geometry.root";
594 TGeoManager::Import(geom.Data());
595 if (!gGeoManager) if (fStopOnError) return kFALSE;
598 AliCDBManager* man = AliCDBManager::Instance();
599 if (!MisalignGeometry(fLoadAlignData)) if (fStopOnError) return kFALSE;
601 // local reconstruction
602 if (!fRunLocalReconstruction.IsNull()) {
603 if (!RunLocalReconstruction(fRunLocalReconstruction)) {
604 if (fStopOnError) {CleanUp(); return kFALSE;}
607 // if (!fRunVertexFinder && fRunTracking.IsNull() &&
608 // fFillESD.IsNull()) return kTRUE;
611 if (fRunVertexFinder && !CreateVertexer()) {
619 if (!fRunTracking.IsNull() && !CreateTrackers(fRunTracking)) {
627 TStopwatch stopwatch;
630 // get the possibly already existing ESD file and tree
631 AliESD* esd = new AliESD; AliESD* hltesd = new AliESD;
632 TFile* fileOld = NULL;
633 TTree* treeOld = NULL; TTree *hlttreeOld = NULL;
634 if (!gSystem->AccessPathName("AliESDs.root")){
635 gSystem->CopyFile("AliESDs.root", "AliESDs.old.root", kTRUE);
636 fileOld = TFile::Open("AliESDs.old.root");
637 if (fileOld && fileOld->IsOpen()) {
638 treeOld = (TTree*) fileOld->Get("esdTree");
639 if (treeOld) treeOld->SetBranchAddress("ESD", &esd);
640 hlttreeOld = (TTree*) fileOld->Get("HLTesdTree");
641 if (hlttreeOld) hlttreeOld->SetBranchAddress("ESD", &hltesd);
645 // create the ESD output file and tree
646 TFile* file = TFile::Open("AliESDs.root", "RECREATE");
647 if (!file->IsOpen()) {
648 AliError("opening AliESDs.root failed");
649 if (fStopOnError) {CleanUp(file, fileOld); return kFALSE;}
651 TTree* tree = new TTree("esdTree", "Tree with ESD objects");
652 tree->Branch("ESD", "AliESD", &esd);
653 TTree* hlttree = new TTree("HLTesdTree", "Tree with HLT ESD objects");
654 hlttree->Branch("ESD", "AliESD", &hltesd);
655 delete esd; delete hltesd;
656 esd = NULL; hltesd = NULL;
658 // create the branch with ESD additions
659 AliESDfriend *esdf=0;
660 if (fWriteESDfriend) {
661 TBranch *br=tree->Branch("ESDfriend.", "AliESDfriend", &esdf);
662 br->SetFile("AliESDfriends.root");
665 AliVertexerTracks tVertexer;
666 if(fDiamondProfile) tVertexer.SetVtxStart(fDiamondProfile);
669 if (fRawReader) fRawReader->RewindEvents();
671 for (Int_t iEvent = 0; iEvent < fRunLoader->GetNumberOfEvents(); iEvent++) {
672 if (fRawReader) fRawReader->NextEvent();
673 if ((iEvent < fFirstEvent) || ((fLastEvent >= 0) && (iEvent > fLastEvent))) {
674 // copy old ESD to the new one
676 treeOld->SetBranchAddress("ESD", &esd);
677 treeOld->GetEntry(iEvent);
681 hlttreeOld->SetBranchAddress("ESD", &hltesd);
682 hlttreeOld->GetEntry(iEvent);
688 AliInfo(Form("processing event %d", iEvent));
689 fRunLoader->GetEvent(iEvent);
692 sprintf(aFileName, "ESD_%d.%d_final.root",
693 fRunLoader->GetHeader()->GetRun(),
694 fRunLoader->GetHeader()->GetEventNrInRun());
695 if (!gSystem->AccessPathName(aFileName)) continue;
697 // local reconstruction
698 if (!fRunLocalReconstruction.IsNull()) {
699 if (!RunLocalEventReconstruction(fRunLocalReconstruction)) {
700 if (fStopOnError) {CleanUp(file, fileOld); return kFALSE;}
704 esd = new AliESD; hltesd = new AliESD;
705 esd->SetRunNumber(fRunLoader->GetHeader()->GetRun());
706 hltesd->SetRunNumber(fRunLoader->GetHeader()->GetRun());
707 esd->SetEventNumberInFile(fRunLoader->GetHeader()->GetEventNrInRun());
708 hltesd->SetEventNumberInFile(fRunLoader->GetHeader()->GetEventNrInRun());
710 // Set magnetic field from the tracker
711 esd->SetMagneticField(AliTracker::GetBz());
712 hltesd->SetMagneticField(AliTracker::GetBz());
714 // Fill raw-data error log into the ESD
715 if (fRawReader) FillRawDataErrorLog(iEvent,esd);
718 if (fRunVertexFinder) {
719 if (!ReadESD(esd, "vertex")) {
720 if (!RunVertexFinder(esd)) {
721 if (fStopOnError) {CleanUp(file, fileOld); return kFALSE;}
723 if (fCheckPointLevel > 0) WriteESD(esd, "vertex");
728 if (!fRunTracking.IsNull()) {
729 if (fRunHLTTracking) {
730 hltesd->SetVertex(esd->GetVertex());
731 if (!RunHLTTracking(hltesd)) {
732 if (fStopOnError) {CleanUp(file, fileOld); return kFALSE;}
738 if (!fRunTracking.IsNull()) {
739 if (fRunMuonTracking) {
740 if (!RunMuonTracking()) {
741 if (fStopOnError) {CleanUp(file, fileOld); return kFALSE;}
747 if (!fRunTracking.IsNull()) {
748 if (!ReadESD(esd, "tracking")) {
749 if (!RunTracking(esd)) {
750 if (fStopOnError) {CleanUp(file, fileOld); return kFALSE;}
752 if (fCheckPointLevel > 0) WriteESD(esd, "tracking");
757 if (!fFillESD.IsNull()) {
758 if (!FillESD(esd, fFillESD)) {
759 if (fStopOnError) {CleanUp(file, fileOld); return kFALSE;}
762 // fill Event header information from the RawEventHeader
763 if (fRawReader){FillRawEventHeaderESD(esd);}
766 AliESDpid::MakePID(esd);
767 if (fCheckPointLevel > 1) WriteESD(esd, "PID");
769 if (fFillTriggerESD) {
770 if (!ReadESD(esd, "trigger")) {
771 if (!FillTriggerESD(esd)) {
772 if (fStopOnError) {CleanUp(file, fileOld); return kFALSE;}
774 if (fCheckPointLevel > 1) WriteESD(esd, "trigger");
778 //Try to improve the reconstructed primary vertex position using the tracks
779 AliESDVertex *pvtx=tVertexer.FindPrimaryVertex(esd);
781 if (pvtx->GetStatus()) {
782 // Store the improved primary vertex
783 esd->SetPrimaryVertex(pvtx);
784 // Propagate the tracks to the DCA to the improved primary vertex
785 Double_t somethingbig = 777.;
786 Double_t bz = esd->GetMagneticField();
787 Int_t nt=esd->GetNumberOfTracks();
789 AliESDtrack *t = esd->GetTrack(nt);
790 t->RelateToVertex(pvtx, bz, somethingbig);
797 vtxer.Tracks2V0vertices(esd);
800 AliCascadeVertexer cvtxer;
801 cvtxer.V0sTracks2CascadeVertices(esd);
805 if (fWriteESDfriend) {
806 esdf=new AliESDfriend();
807 esd->GetESDfriend(esdf);
814 if (fCheckPointLevel > 0) WriteESD(esd, "final");
816 delete esd; delete esdf; delete hltesd;
817 esd = NULL; esdf=NULL; hltesd = NULL;
820 AliInfo(Form("Execution time for filling ESD : R:%.2fs C:%.2fs",
821 stopwatch.RealTime(),stopwatch.CpuTime()));
825 tree->SetBranchStatus("ESDfriend*",0);
833 // Create tags for the events in the ESD tree (the ESD tree is always present)
834 // In case of empty events the tags will contain dummy values
836 CleanUp(file, fileOld);
842 //_____________________________________________________________________________
843 Bool_t AliReconstruction::RunLocalReconstruction(const TString& detectors)
845 // run the local reconstruction
847 TStopwatch stopwatch;
850 AliCDBManager* man = AliCDBManager::Instance();
851 Bool_t origCache = man->GetCacheFlag();
853 TString detStr = detectors;
854 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
855 if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
856 AliReconstructor* reconstructor = GetReconstructor(iDet);
857 if (!reconstructor) continue;
858 if (reconstructor->HasLocalReconstruction()) continue;
860 AliInfo(Form("running reconstruction for %s", fgkDetectorName[iDet]));
861 TStopwatch stopwatchDet;
862 stopwatchDet.Start();
864 AliInfo(Form("Loading calibration data from OCDB for %s", fgkDetectorName[iDet]));
866 man->SetCacheFlag(kTRUE);
867 TString calibPath = Form("%s/Calib/*", fgkDetectorName[iDet]);
868 man->GetAll(calibPath); // entries are cached!
871 fRawReader->RewindEvents();
872 reconstructor->Reconstruct(fRunLoader, fRawReader);
874 reconstructor->Reconstruct(fRunLoader);
876 AliInfo(Form("Execution time for %s: R:%.2fs C:%.2fs",
877 fgkDetectorName[iDet],
878 stopwatchDet.RealTime(),stopwatchDet.CpuTime()));
880 // unload calibration data
884 man->SetCacheFlag(origCache);
886 if ((detStr.CompareTo("ALL") != 0) && !detStr.IsNull()) {
887 AliError(Form("the following detectors were not found: %s",
889 if (fStopOnError) return kFALSE;
892 AliInfo(Form("Execution time: R:%.2fs C:%.2fs",
893 stopwatch.RealTime(),stopwatch.CpuTime()));
898 //_____________________________________________________________________________
899 Bool_t AliReconstruction::RunLocalEventReconstruction(const TString& detectors)
901 // run the local reconstruction
903 TStopwatch stopwatch;
906 TString detStr = detectors;
907 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
908 if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
909 AliReconstructor* reconstructor = GetReconstructor(iDet);
910 if (!reconstructor) continue;
911 AliLoader* loader = fLoader[iDet];
913 // conversion of digits
914 if (fRawReader && reconstructor->HasDigitConversion()) {
915 AliInfo(Form("converting raw data digits into root objects for %s",
916 fgkDetectorName[iDet]));
917 TStopwatch stopwatchDet;
918 stopwatchDet.Start();
919 loader->LoadDigits("update");
920 loader->CleanDigits();
921 loader->MakeDigitsContainer();
922 TTree* digitsTree = loader->TreeD();
923 reconstructor->ConvertDigits(fRawReader, digitsTree);
924 loader->WriteDigits("OVERWRITE");
925 loader->UnloadDigits();
926 AliInfo(Form("Execution time for %s: R:%.2fs C:%.2fs",
927 fgkDetectorName[iDet],
928 stopwatchDet.RealTime(),stopwatchDet.CpuTime()));
931 // local reconstruction
932 if (!reconstructor->HasLocalReconstruction()) continue;
933 AliInfo(Form("running reconstruction for %s", fgkDetectorName[iDet]));
934 TStopwatch stopwatchDet;
935 stopwatchDet.Start();
936 loader->LoadRecPoints("update");
937 loader->CleanRecPoints();
938 loader->MakeRecPointsContainer();
939 TTree* clustersTree = loader->TreeR();
940 if (fRawReader && !reconstructor->HasDigitConversion()) {
941 reconstructor->Reconstruct(fRawReader, clustersTree);
943 loader->LoadDigits("read");
944 TTree* digitsTree = loader->TreeD();
946 AliError(Form("Can't get the %s digits tree", fgkDetectorName[iDet]));
947 if (fStopOnError) return kFALSE;
949 reconstructor->Reconstruct(digitsTree, clustersTree);
951 loader->UnloadDigits();
953 loader->WriteRecPoints("OVERWRITE");
954 loader->UnloadRecPoints();
955 AliDebug(1,Form("Execution time for %s: R:%.2fs C:%.2fs",
956 fgkDetectorName[iDet],
957 stopwatchDet.RealTime(),stopwatchDet.CpuTime()));
960 if ((detStr.CompareTo("ALL") != 0) && !detStr.IsNull()) {
961 AliError(Form("the following detectors were not found: %s",
963 if (fStopOnError) return kFALSE;
966 AliInfo(Form("Execution time: R:%.2fs C:%.2fs",
967 stopwatch.RealTime(),stopwatch.CpuTime()));
972 //_____________________________________________________________________________
973 Bool_t AliReconstruction::RunVertexFinder(AliESD*& esd)
975 // run the barrel tracking
977 TStopwatch stopwatch;
980 AliESDVertex* vertex = NULL;
981 Double_t vtxPos[3] = {0, 0, 0};
982 Double_t vtxErr[3] = {0.07, 0.07, 0.1};
984 if (fRunLoader->GetHeader() && fRunLoader->GetHeader()->GenEventHeader()) {
985 fRunLoader->GetHeader()->GenEventHeader()->PrimaryVertex(mcVertex);
986 for (Int_t i = 0; i < 3; i++) vtxPos[i] = mcVertex[i];
990 AliInfo("running the ITS vertex finder");
991 if (fLoader[0]) fLoader[0]->LoadRecPoints();
992 vertex = fVertexer->FindVertexForCurrentEvent(fRunLoader->GetEventNumber());
993 if (fLoader[0]) fLoader[0]->UnloadRecPoints();
995 AliWarning("Vertex not found");
996 vertex = new AliESDVertex();
997 vertex->SetName("default");
1000 vertex->SetTruePos(vtxPos); // store also the vertex from MC
1001 vertex->SetName("reconstructed");
1005 AliInfo("getting the primary vertex from MC");
1006 vertex = new AliESDVertex(vtxPos, vtxErr);
1010 vertex->GetXYZ(vtxPos);
1011 vertex->GetSigmaXYZ(vtxErr);
1013 AliWarning("no vertex reconstructed");
1014 vertex = new AliESDVertex(vtxPos, vtxErr);
1016 esd->SetVertex(vertex);
1017 // if SPD multiplicity has been determined, it is stored in the ESD
1018 AliMultiplicity *mult= fVertexer->GetMultiplicity();
1019 if(mult)esd->SetMultiplicity(mult);
1021 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
1022 if (fTracker[iDet]) fTracker[iDet]->SetVertex(vtxPos, vtxErr);
1026 AliInfo(Form("Execution time: R:%.2fs C:%.2fs",
1027 stopwatch.RealTime(),stopwatch.CpuTime()));
1032 //_____________________________________________________________________________
1033 Bool_t AliReconstruction::RunHLTTracking(AliESD*& esd)
1035 // run the HLT barrel tracking
1037 TStopwatch stopwatch;
1041 AliError("Missing runLoader!");
1045 AliInfo("running HLT tracking");
1047 // Get a pointer to the HLT reconstructor
1048 AliReconstructor *reconstructor = GetReconstructor(fgkNDetectors-1);
1049 if (!reconstructor) return kFALSE;
1052 for (Int_t iDet = 1; iDet >= 0; iDet--) {
1053 TString detName = fgkDetectorName[iDet];
1054 AliDebug(1, Form("%s HLT tracking", detName.Data()));
1055 reconstructor->SetOption(detName.Data());
1056 AliTracker *tracker = reconstructor->CreateTracker(fRunLoader);
1058 AliWarning(Form("couldn't create a HLT tracker for %s", detName.Data()));
1059 if (fStopOnError) return kFALSE;
1063 Double_t vtxErr[3]={0.005,0.005,0.010};
1064 const AliESDVertex *vertex = esd->GetVertex();
1065 vertex->GetXYZ(vtxPos);
1066 tracker->SetVertex(vtxPos,vtxErr);
1068 fLoader[iDet]->LoadRecPoints("read");
1069 TTree* tree = fLoader[iDet]->TreeR();
1071 AliError(Form("Can't get the %s cluster tree", detName.Data()));
1074 tracker->LoadClusters(tree);
1076 if (tracker->Clusters2Tracks(esd) != 0) {
1077 AliError(Form("HLT %s Clusters2Tracks failed", fgkDetectorName[iDet]));
1081 tracker->UnloadClusters();
1086 AliInfo(Form("Execution time: R:%.2fs C:%.2fs",
1087 stopwatch.RealTime(),stopwatch.CpuTime()));
1092 //_____________________________________________________________________________
1093 Bool_t AliReconstruction::RunMuonTracking()
1095 // run the muon spectrometer tracking
1097 TStopwatch stopwatch;
1101 AliError("Missing runLoader!");
1104 Int_t iDet = 7; // for MUON
1106 AliInfo("is running...");
1108 // Get a pointer to the MUON reconstructor
1109 AliReconstructor *reconstructor = GetReconstructor(iDet);
1110 if (!reconstructor) return kFALSE;
1113 TString detName = fgkDetectorName[iDet];
1114 AliDebug(1, Form("%s tracking", detName.Data()));
1115 AliTracker *tracker = reconstructor->CreateTracker(fRunLoader);
1117 AliWarning(Form("couldn't create a tracker for %s", detName.Data()));
1122 fLoader[iDet]->LoadTracks("update");
1123 fLoader[iDet]->CleanTracks();
1124 fLoader[iDet]->MakeTracksContainer();
1127 fLoader[iDet]->LoadRecPoints("read");
1129 if (!tracker->Clusters2Tracks(0x0)) {
1130 AliError(Form("%s Clusters2Tracks failed", fgkDetectorName[iDet]));
1133 fLoader[iDet]->UnloadRecPoints();
1135 fLoader[iDet]->WriteTracks("OVERWRITE");
1136 fLoader[iDet]->UnloadTracks();
1141 AliInfo(Form("Execution time: R:%.2fs C:%.2fs",
1142 stopwatch.RealTime(),stopwatch.CpuTime()));
1148 //_____________________________________________________________________________
1149 Bool_t AliReconstruction::RunTracking(AliESD*& esd)
1151 // run the barrel tracking
1153 TStopwatch stopwatch;
1156 AliInfo("running tracking");
1158 // pass 1: TPC + ITS inwards
1159 for (Int_t iDet = 1; iDet >= 0; iDet--) {
1160 if (!fTracker[iDet]) continue;
1161 AliDebug(1, Form("%s tracking", fgkDetectorName[iDet]));
1164 fLoader[iDet]->LoadRecPoints("read");
1165 TTree* tree = fLoader[iDet]->TreeR();
1167 AliError(Form("Can't get the %s cluster tree", fgkDetectorName[iDet]));
1170 fTracker[iDet]->LoadClusters(tree);
1173 if (fTracker[iDet]->Clusters2Tracks(esd) != 0) {
1174 AliError(Form("%s Clusters2Tracks failed", fgkDetectorName[iDet]));
1177 if (fCheckPointLevel > 1) {
1178 WriteESD(esd, Form("%s.tracking", fgkDetectorName[iDet]));
1180 // preliminary PID in TPC needed by the ITS tracker
1182 GetReconstructor(1)->FillESD(fRunLoader, esd);
1183 GetReconstructor(1)->FillESD((TTree*)NULL, (TTree*)NULL, esd);
1184 AliESDpid::MakePID(esd);
1188 // pass 2: ALL backwards
1189 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
1190 if (!fTracker[iDet]) continue;
1191 AliDebug(1, Form("%s back propagation", fgkDetectorName[iDet]));
1194 if (iDet > 1) { // all except ITS, TPC
1196 fLoader[iDet]->LoadRecPoints("read");
1197 tree = fLoader[iDet]->TreeR();
1199 AliError(Form("Can't get the %s cluster tree", fgkDetectorName[iDet]));
1202 fTracker[iDet]->LoadClusters(tree);
1206 if (fTracker[iDet]->PropagateBack(esd) != 0) {
1207 AliError(Form("%s backward propagation failed", fgkDetectorName[iDet]));
1210 if (fCheckPointLevel > 1) {
1211 WriteESD(esd, Form("%s.back", fgkDetectorName[iDet]));
1215 if (iDet > 2) { // all except ITS, TPC, TRD
1216 fTracker[iDet]->UnloadClusters();
1217 fLoader[iDet]->UnloadRecPoints();
1219 // updated PID in TPC needed by the ITS tracker -MI
1221 GetReconstructor(1)->FillESD(fRunLoader, esd);
1222 GetReconstructor(1)->FillESD((TTree*)NULL, (TTree*)NULL, esd);
1223 AliESDpid::MakePID(esd);
1227 // write space-points to the ESD in case alignment data output
1229 if (fWriteAlignmentData)
1230 WriteAlignmentData(esd);
1232 // pass 3: TRD + TPC + ITS refit inwards
1233 for (Int_t iDet = 2; iDet >= 0; iDet--) {
1234 if (!fTracker[iDet]) continue;
1235 AliDebug(1, Form("%s inward refit", fgkDetectorName[iDet]));
1238 if (fTracker[iDet]->RefitInward(esd) != 0) {
1239 AliError(Form("%s inward refit failed", fgkDetectorName[iDet]));
1242 if (fCheckPointLevel > 1) {
1243 WriteESD(esd, Form("%s.refit", fgkDetectorName[iDet]));
1247 fTracker[iDet]->UnloadClusters();
1248 fLoader[iDet]->UnloadRecPoints();
1251 // Propagate track to the vertex - if not done by ITS
1253 Int_t ntracks = esd->GetNumberOfTracks();
1254 for (Int_t itrack=0; itrack<ntracks; itrack++){
1255 const Double_t kRadius = 3; // beam pipe radius
1256 const Double_t kMaxStep = 5; // max step
1257 const Double_t kMaxD = 123456; // max distance to prim vertex
1258 Double_t fieldZ = AliTracker::GetBz(); //
1259 AliESDtrack * track = esd->GetTrack(itrack);
1260 if (!track) continue;
1261 if (track->IsOn(AliESDtrack::kITSrefit)) continue;
1262 track->PropagateTo(kRadius, fieldZ, track->GetMass(),kMaxStep,kTRUE);
1263 track->RelateToVertex(esd->GetVertex(),fieldZ, kMaxD);
1266 AliInfo(Form("Execution time: R:%.2fs C:%.2fs",
1267 stopwatch.RealTime(),stopwatch.CpuTime()));
1272 //_____________________________________________________________________________
1273 Bool_t AliReconstruction::FillESD(AliESD*& esd, const TString& detectors)
1275 // fill the event summary data
1277 TStopwatch stopwatch;
1279 AliInfo("filling ESD");
1281 TString detStr = detectors;
1282 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
1283 if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
1284 AliReconstructor* reconstructor = GetReconstructor(iDet);
1285 if (!reconstructor) continue;
1287 if (!ReadESD(esd, fgkDetectorName[iDet])) {
1288 AliDebug(1, Form("filling ESD for %s", fgkDetectorName[iDet]));
1289 TTree* clustersTree = NULL;
1290 if (reconstructor->HasLocalReconstruction() && fLoader[iDet]) {
1291 fLoader[iDet]->LoadRecPoints("read");
1292 clustersTree = fLoader[iDet]->TreeR();
1293 if (!clustersTree) {
1294 AliError(Form("Can't get the %s clusters tree",
1295 fgkDetectorName[iDet]));
1296 if (fStopOnError) return kFALSE;
1299 if (fRawReader && !reconstructor->HasDigitConversion()) {
1300 reconstructor->FillESD(fRawReader, clustersTree, esd);
1302 TTree* digitsTree = NULL;
1303 if (fLoader[iDet]) {
1304 fLoader[iDet]->LoadDigits("read");
1305 digitsTree = fLoader[iDet]->TreeD();
1307 AliError(Form("Can't get the %s digits tree",
1308 fgkDetectorName[iDet]));
1309 if (fStopOnError) return kFALSE;
1312 reconstructor->FillESD(digitsTree, clustersTree, esd);
1313 if (fLoader[iDet]) fLoader[iDet]->UnloadDigits();
1315 if (reconstructor->HasLocalReconstruction() && fLoader[iDet]) {
1316 fLoader[iDet]->UnloadRecPoints();
1320 reconstructor->FillESD(fRunLoader, fRawReader, esd);
1322 reconstructor->FillESD(fRunLoader, esd);
1324 if (fCheckPointLevel > 2) WriteESD(esd, fgkDetectorName[iDet]);
1328 if ((detStr.CompareTo("ALL") != 0) && !detStr.IsNull()) {
1329 AliError(Form("the following detectors were not found: %s",
1331 if (fStopOnError) return kFALSE;
1334 AliInfo(Form("Execution time: R:%.2fs C:%.2fs",
1335 stopwatch.RealTime(),stopwatch.CpuTime()));
1340 //_____________________________________________________________________________
1341 Bool_t AliReconstruction::FillTriggerESD(AliESD*& esd)
1343 // Reads the trigger decision which is
1344 // stored in Trigger.root file and fills
1345 // the corresponding esd entries
1347 AliInfo("Filling trigger information into the ESD");
1350 AliCTPRawStream input(fRawReader);
1351 if (!input.Next()) {
1352 AliError("No valid CTP (trigger) DDL raw data is found ! The trigger information is not stored in the ESD !");
1355 esd->SetTriggerMask(input.GetClassMask());
1356 esd->SetTriggerCluster(input.GetClusterMask());
1359 AliRunLoader *runloader = AliRunLoader::GetRunLoader();
1361 if (!runloader->LoadTrigger()) {
1362 AliCentralTrigger *aCTP = runloader->GetTrigger();
1363 esd->SetTriggerMask(aCTP->GetClassMask());
1364 esd->SetTriggerCluster(aCTP->GetClusterMask());
1367 AliWarning("No trigger can be loaded! The trigger information is not stored in the ESD !");
1372 AliError("No run loader is available! The trigger information is not stored in the ESD !");
1384 //_____________________________________________________________________________
1385 Bool_t AliReconstruction::FillRawEventHeaderESD(AliESD*& esd)
1388 // Filling information from RawReader Header
1391 AliInfo("Filling information from RawReader Header");
1392 esd->SetBunchCrossNumber(0);
1393 esd->SetOrbitNumber(0);
1394 esd->SetTimeStamp(0);
1395 esd->SetEventType(0);
1396 const AliRawEventHeaderBase * eventHeader = fRawReader->GetEventHeader();
1398 esd->SetBunchCrossNumber((eventHeader->GetP("Id")[0]));
1399 esd->SetOrbitNumber((eventHeader->GetP("Id")[1]));
1400 esd->SetTimeStamp((eventHeader->Get("Timestamp")));
1401 esd->SetEventType((eventHeader->Get("Type")));
1408 //_____________________________________________________________________________
1409 Bool_t AliReconstruction::IsSelected(TString detName, TString& detectors) const
1411 // check whether detName is contained in detectors
1412 // if yes, it is removed from detectors
1414 // check if all detectors are selected
1415 if ((detectors.CompareTo("ALL") == 0) ||
1416 detectors.BeginsWith("ALL ") ||
1417 detectors.EndsWith(" ALL") ||
1418 detectors.Contains(" ALL ")) {
1423 // search for the given detector
1424 Bool_t result = kFALSE;
1425 if ((detectors.CompareTo(detName) == 0) ||
1426 detectors.BeginsWith(detName+" ") ||
1427 detectors.EndsWith(" "+detName) ||
1428 detectors.Contains(" "+detName+" ")) {
1429 detectors.ReplaceAll(detName, "");
1433 // clean up the detectors string
1434 while (detectors.Contains(" ")) detectors.ReplaceAll(" ", " ");
1435 while (detectors.BeginsWith(" ")) detectors.Remove(0, 1);
1436 while (detectors.EndsWith(" ")) detectors.Remove(detectors.Length()-1, 1);
1441 //_____________________________________________________________________________
1442 Bool_t AliReconstruction::InitRunLoader()
1444 // get or create the run loader
1446 if (gAlice) delete gAlice;
1449 if (!gSystem->AccessPathName(fGAliceFileName.Data())) { // galice.root exists
1450 // load all base libraries to get the loader classes
1451 TString libs = gSystem->GetLibraries();
1452 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
1453 TString detName = fgkDetectorName[iDet];
1454 if (detName == "HLT") continue;
1455 if (libs.Contains("lib" + detName + "base.so")) continue;
1456 gSystem->Load("lib" + detName + "base.so");
1458 fRunLoader = AliRunLoader::Open(fGAliceFileName.Data());
1460 AliError(Form("no run loader found in file %s", fGAliceFileName.Data()));
1464 fRunLoader->CdGAFile();
1465 if (gFile->GetKey(AliRunLoader::GetGAliceName())) {
1466 if (fRunLoader->LoadgAlice() == 0) {
1467 gAlice = fRunLoader->GetAliRun();
1468 AliTracker::SetFieldMap(gAlice->Field(),fUniformField);
1471 if (!gAlice && !fRawReader) {
1472 AliError(Form("no gAlice object found in file %s",
1473 fGAliceFileName.Data()));
1478 } else { // galice.root does not exist
1480 AliError(Form("the file %s does not exist", fGAliceFileName.Data()));
1484 fRunLoader = AliRunLoader::Open(fGAliceFileName.Data(),
1485 AliConfig::GetDefaultEventFolderName(),
1488 AliError(Form("could not create run loader in file %s",
1489 fGAliceFileName.Data()));
1493 fRunLoader->MakeTree("E");
1495 while (fRawReader->NextEvent()) {
1496 fRunLoader->SetEventNumber(iEvent);
1497 fRunLoader->GetHeader()->Reset(fRawReader->GetRunNumber(),
1499 fRunLoader->MakeTree("H");
1500 fRunLoader->TreeE()->Fill();
1503 fRawReader->RewindEvents();
1504 if (fNumberOfEventsPerFile > 0)
1505 fRunLoader->SetNumberOfEventsPerFile(fNumberOfEventsPerFile);
1507 fRunLoader->SetNumberOfEventsPerFile(iEvent);
1508 fRunLoader->WriteHeader("OVERWRITE");
1509 fRunLoader->CdGAFile();
1510 fRunLoader->Write(0, TObject::kOverwrite);
1511 // AliTracker::SetFieldMap(???);
1517 //_____________________________________________________________________________
1518 AliReconstructor* AliReconstruction::GetReconstructor(Int_t iDet)
1520 // get the reconstructor object and the loader for a detector
1522 if (fReconstructor[iDet]) return fReconstructor[iDet];
1524 // load the reconstructor object
1525 TPluginManager* pluginManager = gROOT->GetPluginManager();
1526 TString detName = fgkDetectorName[iDet];
1527 TString recName = "Ali" + detName + "Reconstructor";
1528 if (gAlice && !gAlice->GetDetector(detName) && (detName != "HLT")) return NULL;
1530 if (detName == "HLT") {
1531 if (!gROOT->GetClass("AliLevel3")) {
1532 gSystem->Load("libAliHLTSrc.so");
1533 gSystem->Load("libAliHLTMisc.so");
1534 gSystem->Load("libAliHLTHough.so");
1535 gSystem->Load("libAliHLTComp.so");
1539 AliReconstructor* reconstructor = NULL;
1540 // first check if a plugin is defined for the reconstructor
1541 TPluginHandler* pluginHandler =
1542 pluginManager->FindHandler("AliReconstructor", detName);
1543 // if not, add a plugin for it
1544 if (!pluginHandler) {
1545 AliDebug(1, Form("defining plugin for %s", recName.Data()));
1546 TString libs = gSystem->GetLibraries();
1547 if (libs.Contains("lib" + detName + "base.so") ||
1548 (gSystem->Load("lib" + detName + "base.so") >= 0)) {
1549 pluginManager->AddHandler("AliReconstructor", detName,
1550 recName, detName + "rec", recName + "()");
1552 pluginManager->AddHandler("AliReconstructor", detName,
1553 recName, detName, recName + "()");
1555 pluginHandler = pluginManager->FindHandler("AliReconstructor", detName);
1557 if (pluginHandler && (pluginHandler->LoadPlugin() == 0)) {
1558 reconstructor = (AliReconstructor*) pluginHandler->ExecPlugin(0);
1560 if (reconstructor) {
1561 TObject* obj = fOptions.FindObject(detName.Data());
1562 if (obj) reconstructor->SetOption(obj->GetTitle());
1563 reconstructor->Init(fRunLoader);
1564 fReconstructor[iDet] = reconstructor;
1567 // get or create the loader
1568 if (detName != "HLT") {
1569 fLoader[iDet] = fRunLoader->GetLoader(detName + "Loader");
1570 if (!fLoader[iDet]) {
1571 AliConfig::Instance()
1572 ->CreateDetectorFolders(fRunLoader->GetEventFolder(),
1574 // first check if a plugin is defined for the loader
1576 pluginManager->FindHandler("AliLoader", detName);
1577 // if not, add a plugin for it
1578 if (!pluginHandler) {
1579 TString loaderName = "Ali" + detName + "Loader";
1580 AliDebug(1, Form("defining plugin for %s", loaderName.Data()));
1581 pluginManager->AddHandler("AliLoader", detName,
1582 loaderName, detName + "base",
1583 loaderName + "(const char*, TFolder*)");
1584 pluginHandler = pluginManager->FindHandler("AliLoader", detName);
1586 if (pluginHandler && (pluginHandler->LoadPlugin() == 0)) {
1588 (AliLoader*) pluginHandler->ExecPlugin(2, detName.Data(),
1589 fRunLoader->GetEventFolder());
1591 if (!fLoader[iDet]) { // use default loader
1592 fLoader[iDet] = new AliLoader(detName, fRunLoader->GetEventFolder());
1594 if (!fLoader[iDet]) {
1595 AliWarning(Form("couldn't get loader for %s", detName.Data()));
1596 if (fStopOnError) return NULL;
1598 fRunLoader->AddLoader(fLoader[iDet]);
1599 fRunLoader->CdGAFile();
1600 if (gFile && !gFile->IsWritable()) gFile->ReOpen("UPDATE");
1601 fRunLoader->Write(0, TObject::kOverwrite);
1606 return reconstructor;
1609 //_____________________________________________________________________________
1610 Bool_t AliReconstruction::CreateVertexer()
1612 // create the vertexer
1615 AliReconstructor* itsReconstructor = GetReconstructor(0);
1616 if (itsReconstructor) {
1617 fVertexer = itsReconstructor->CreateVertexer(fRunLoader);
1620 AliWarning("couldn't create a vertexer for ITS");
1621 if (fStopOnError) return kFALSE;
1627 //_____________________________________________________________________________
1628 Bool_t AliReconstruction::CreateTrackers(const TString& detectors)
1630 // create the trackers
1632 TString detStr = detectors;
1633 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
1634 if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
1635 AliReconstructor* reconstructor = GetReconstructor(iDet);
1636 if (!reconstructor) continue;
1637 TString detName = fgkDetectorName[iDet];
1638 if (detName == "HLT") {
1639 fRunHLTTracking = kTRUE;
1642 if (detName == "MUON") {
1643 fRunMuonTracking = kTRUE;
1648 fTracker[iDet] = reconstructor->CreateTracker(fRunLoader);
1649 if (!fTracker[iDet] && (iDet < 7)) {
1650 AliWarning(Form("couldn't create a tracker for %s", detName.Data()));
1651 if (fStopOnError) return kFALSE;
1658 //_____________________________________________________________________________
1659 void AliReconstruction::CleanUp(TFile* file, TFile* fileOld)
1661 // delete trackers and the run loader and close and delete the file
1663 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
1664 delete fReconstructor[iDet];
1665 fReconstructor[iDet] = NULL;
1666 fLoader[iDet] = NULL;
1667 delete fTracker[iDet];
1668 fTracker[iDet] = NULL;
1672 delete fDiamondProfile;
1673 fDiamondProfile = NULL;
1688 gSystem->Unlink("AliESDs.old.root");
1693 //_____________________________________________________________________________
1694 Bool_t AliReconstruction::ReadESD(AliESD*& esd, const char* recStep) const
1696 // read the ESD event from a file
1698 if (!esd) return kFALSE;
1700 sprintf(fileName, "ESD_%d.%d_%s.root",
1701 esd->GetRunNumber(), esd->GetEventNumberInFile(), recStep);
1702 if (gSystem->AccessPathName(fileName)) return kFALSE;
1704 AliInfo(Form("reading ESD from file %s", fileName));
1705 AliDebug(1, Form("reading ESD from file %s", fileName));
1706 TFile* file = TFile::Open(fileName);
1707 if (!file || !file->IsOpen()) {
1708 AliError(Form("opening %s failed", fileName));
1715 esd = (AliESD*) file->Get("ESD");
1721 //_____________________________________________________________________________
1722 void AliReconstruction::WriteESD(AliESD* esd, const char* recStep) const
1724 // write the ESD event to a file
1728 sprintf(fileName, "ESD_%d.%d_%s.root",
1729 esd->GetRunNumber(), esd->GetEventNumberInFile(), recStep);
1731 AliDebug(1, Form("writing ESD to file %s", fileName));
1732 TFile* file = TFile::Open(fileName, "recreate");
1733 if (!file || !file->IsOpen()) {
1734 AliError(Form("opening %s failed", fileName));
1745 //_____________________________________________________________________________
1746 void AliReconstruction::CreateTag(TFile* file)
1751 Double_t fMUONMASS = 0.105658369;
1754 Double_t fThetaX, fThetaY, fPyz, fChisquare;
1755 Double_t fPxRec,fPyRec, fPzRec, fEnergy;
1757 TLorentzVector fEPvector;
1759 Float_t fZVertexCut = 10.0;
1760 Float_t fRhoVertexCut = 2.0;
1762 Float_t fLowPtCut = 1.0;
1763 Float_t fHighPtCut = 3.0;
1764 Float_t fVeryHighPtCut = 10.0;
1767 Double_t partFrac[5] = {0.01, 0.01, 0.85, 0.10, 0.05};
1769 // Creates the tags for all the events in a given ESD file
1771 Int_t nProtons, nKaons, nPions, nMuons, nElectrons;
1772 Int_t nPos, nNeg, nNeutr;
1773 Int_t nK0s, nNeutrons, nPi0s, nGamas;
1774 Int_t nCh1GeV, nCh3GeV, nCh10GeV;
1775 Int_t nMu1GeV, nMu3GeV, nMu10GeV;
1776 Int_t nEl1GeV, nEl3GeV, nEl10GeV;
1777 Float_t maxPt = .0, meanPt = .0, totalP = .0;
1779 Int_t iRunNumber = 0;
1780 TString fVertexName("default");
1782 AliRunTag *tag = new AliRunTag();
1783 AliEventTag *evTag = new AliEventTag();
1784 TTree ttag("T","A Tree with event tags");
1785 TBranch * btag = ttag.Branch("AliTAG", &tag);
1786 btag->SetCompressionLevel(9);
1788 AliInfo(Form("Creating the tags......."));
1790 if (!file || !file->IsOpen()) {
1791 AliError(Form("opening failed"));
1795 Int_t lastEvent = 0;
1796 TTree *t = (TTree*) file->Get("esdTree");
1797 TBranch * b = t->GetBranch("ESD");
1799 b->SetAddress(&esd);
1801 b->GetEntry(fFirstEvent);
1802 Int_t iInitRunNumber = esd->GetRunNumber();
1804 Int_t iNumberOfEvents = (Int_t)b->GetEntries();
1805 if(fLastEvent != -1) iNumberOfEvents = fLastEvent + 1;
1806 for (Int_t iEventNumber = fFirstEvent; iEventNumber < iNumberOfEvents; iEventNumber++) {
1834 b->GetEntry(iEventNumber);
1835 iRunNumber = esd->GetRunNumber();
1836 if(iRunNumber != iInitRunNumber) AliFatal("Inconsistency of run numbers in the AliESD!!!");
1837 const AliESDVertex * vertexIn = esd->GetVertex();
1838 if (!vertexIn) AliError("ESD has not defined vertex.");
1839 if (vertexIn) fVertexName = vertexIn->GetName();
1840 if(fVertexName != "default") fVertexflag = 1;
1841 for (Int_t iTrackNumber = 0; iTrackNumber < esd->GetNumberOfTracks(); iTrackNumber++) {
1842 AliESDtrack * esdTrack = esd->GetTrack(iTrackNumber);
1843 UInt_t status = esdTrack->GetStatus();
1845 //select only tracks with ITS refit
1846 if ((status&AliESDtrack::kITSrefit)==0) continue;
1847 //select only tracks with TPC refit
1848 if ((status&AliESDtrack::kTPCrefit)==0) continue;
1850 //select only tracks with the "combined PID"
1851 if ((status&AliESDtrack::kESDpid)==0) continue;
1853 esdTrack->GetPxPyPz(p);
1854 Double_t momentum = sqrt(pow(p[0],2) + pow(p[1],2) + pow(p[2],2));
1855 Double_t fPt = sqrt(pow(p[0],2) + pow(p[1],2));
1858 if(fPt > maxPt) maxPt = fPt;
1860 if(esdTrack->GetSign() > 0) {
1862 if(fPt > fLowPtCut) nCh1GeV++;
1863 if(fPt > fHighPtCut) nCh3GeV++;
1864 if(fPt > fVeryHighPtCut) nCh10GeV++;
1866 if(esdTrack->GetSign() < 0) {
1868 if(fPt > fLowPtCut) nCh1GeV++;
1869 if(fPt > fHighPtCut) nCh3GeV++;
1870 if(fPt > fVeryHighPtCut) nCh10GeV++;
1872 if(esdTrack->GetSign() == 0) nNeutr++;
1876 esdTrack->GetESDpid(prob);
1879 for(Int_t i = 0; i < AliPID::kSPECIES; i++) rcc += prob[i]*partFrac[i];
1880 if(rcc == 0.0) continue;
1883 for(Int_t i = 0; i < AliPID::kSPECIES; i++) w[i] = prob[i]*partFrac[i]/rcc;
1886 if ((w[4]>w[3])&&(w[4]>w[2])&&(w[4]>w[1])&&(w[4]>w[0])) nProtons++;
1888 if ((w[3]>w[4])&&(w[3]>w[2])&&(w[3]>w[1])&&(w[3]>w[0])) nKaons++;
1890 if ((w[2]>w[4])&&(w[2]>w[3])&&(w[2]>w[1])&&(w[2]>w[0])) nPions++;
1892 if ((w[0]>w[4])&&(w[0]>w[3])&&(w[0]>w[2])&&(w[0]>w[1])) {
1894 if(fPt > fLowPtCut) nEl1GeV++;
1895 if(fPt > fHighPtCut) nEl3GeV++;
1896 if(fPt > fVeryHighPtCut) nEl10GeV++;
1904 Int_t nMuonTracks = esd->GetNumberOfMuonTracks();
1905 // loop over all reconstructed tracks (also first track of combination)
1906 for (Int_t iTrack = 0; iTrack < nMuonTracks; iTrack++) {
1907 AliESDMuonTrack* muonTrack = esd->GetMuonTrack(iTrack);
1908 if (muonTrack == 0x0) continue;
1910 // Coordinates at vertex
1911 fZ = muonTrack->GetZ();
1912 fY = muonTrack->GetBendingCoor();
1913 fX = muonTrack->GetNonBendingCoor();
1915 fThetaX = muonTrack->GetThetaX();
1916 fThetaY = muonTrack->GetThetaY();
1918 fPyz = 1./TMath::Abs(muonTrack->GetInverseBendingMomentum());
1919 fPzRec = - fPyz / TMath::Sqrt(1.0 + TMath::Tan(fThetaY)*TMath::Tan(fThetaY));
1920 fPxRec = fPzRec * TMath::Tan(fThetaX);
1921 fPyRec = fPzRec * TMath::Tan(fThetaY);
1922 fCharge = Int_t(TMath::Sign(1.,muonTrack->GetInverseBendingMomentum()));
1924 //ChiSquare of the track if needed
1925 fChisquare = muonTrack->GetChi2()/(2.0 * muonTrack->GetNHit() - 5);
1926 fEnergy = TMath::Sqrt(fMUONMASS * fMUONMASS + fPxRec * fPxRec + fPyRec * fPyRec + fPzRec * fPzRec);
1927 fEPvector.SetPxPyPzE(fPxRec, fPyRec, fPzRec, fEnergy);
1929 // total number of muons inside a vertex cut
1930 if((TMath::Abs(fZ)<fZVertexCut) && (TMath::Sqrt(fY*fY+fX*fX)<fRhoVertexCut)) {
1932 if(fEPvector.Pt() > fLowPtCut) {
1934 if(fEPvector.Pt() > fHighPtCut) {
1936 if (fEPvector.Pt() > fVeryHighPtCut) {
1944 // Fill the event tags
1946 meanPt = meanPt/ntrack;
1948 evTag->SetEventId(iEventNumber+1);
1950 evTag->SetVertexX(vertexIn->GetXv());
1951 evTag->SetVertexY(vertexIn->GetYv());
1952 evTag->SetVertexZ(vertexIn->GetZv());
1953 evTag->SetVertexZError(vertexIn->GetZRes());
1955 evTag->SetVertexFlag(fVertexflag);
1957 evTag->SetT0VertexZ(esd->GetT0zVertex());
1959 evTag->SetTriggerMask(esd->GetTriggerMask());
1960 evTag->SetTriggerCluster(esd->GetTriggerCluster());
1962 evTag->SetZDCNeutron1Energy(esd->GetZDCN1Energy());
1963 evTag->SetZDCProton1Energy(esd->GetZDCP1Energy());
1964 evTag->SetZDCNeutron2Energy(esd->GetZDCN2Energy());
1965 evTag->SetZDCProton2Energy(esd->GetZDCP2Energy());
1966 evTag->SetZDCEMEnergy(esd->GetZDCEMEnergy());
1967 evTag->SetNumOfParticipants(esd->GetZDCParticipants());
1970 evTag->SetNumOfTracks(esd->GetNumberOfTracks());
1971 evTag->SetNumOfPosTracks(nPos);
1972 evTag->SetNumOfNegTracks(nNeg);
1973 evTag->SetNumOfNeutrTracks(nNeutr);
1975 evTag->SetNumOfV0s(esd->GetNumberOfV0s());
1976 evTag->SetNumOfCascades(esd->GetNumberOfCascades());
1977 evTag->SetNumOfKinks(esd->GetNumberOfKinks());
1978 evTag->SetNumOfPMDTracks(esd->GetNumberOfPmdTracks());
1980 evTag->SetNumOfProtons(nProtons);
1981 evTag->SetNumOfKaons(nKaons);
1982 evTag->SetNumOfPions(nPions);
1983 evTag->SetNumOfMuons(nMuons);
1984 evTag->SetNumOfElectrons(nElectrons);
1985 evTag->SetNumOfPhotons(nGamas);
1986 evTag->SetNumOfPi0s(nPi0s);
1987 evTag->SetNumOfNeutrons(nNeutrons);
1988 evTag->SetNumOfKaon0s(nK0s);
1990 evTag->SetNumOfChargedAbove1GeV(nCh1GeV);
1991 evTag->SetNumOfChargedAbove3GeV(nCh3GeV);
1992 evTag->SetNumOfChargedAbove10GeV(nCh10GeV);
1993 evTag->SetNumOfMuonsAbove1GeV(nMu1GeV);
1994 evTag->SetNumOfMuonsAbove3GeV(nMu3GeV);
1995 evTag->SetNumOfMuonsAbove10GeV(nMu10GeV);
1996 evTag->SetNumOfElectronsAbove1GeV(nEl1GeV);
1997 evTag->SetNumOfElectronsAbove3GeV(nEl3GeV);
1998 evTag->SetNumOfElectronsAbove10GeV(nEl10GeV);
2000 evTag->SetNumOfPHOSClusters(esd->GetNumberOfPHOSClusters());
2001 evTag->SetNumOfEMCALClusters(esd->GetNumberOfEMCALClusters());
2003 evTag->SetTotalMomentum(totalP);
2004 evTag->SetMeanPt(meanPt);
2005 evTag->SetMaxPt(maxPt);
2007 tag->SetRunId(iInitRunNumber);
2008 tag->AddEventTag(*evTag);
2010 if(fLastEvent == -1) lastEvent = (Int_t)b->GetEntries();
2011 else lastEvent = fLastEvent;
2017 sprintf(fileName, "Run%d.Event%d_%d.ESD.tag.root",
2018 tag->GetRunId(),fFirstEvent,lastEvent );
2019 AliInfo(Form("writing tags to file %s", fileName));
2020 AliDebug(1, Form("writing tags to file %s", fileName));
2022 TFile* ftag = TFile::Open(fileName, "recreate");
2031 //_____________________________________________________________________________
2032 void AliReconstruction::CreateAOD(TFile* esdFile)
2034 // do nothing for now
2040 void AliReconstruction::WriteAlignmentData(AliESD* esd)
2042 // Write space-points which are then used in the alignment procedures
2043 // For the moment only ITS, TRD and TPC
2045 // Load TOF clusters
2047 fLoader[3]->LoadRecPoints("read");
2048 TTree* tree = fLoader[3]->TreeR();
2050 AliError(Form("Can't get the %s cluster tree", fgkDetectorName[3]));
2053 fTracker[3]->LoadClusters(tree);
2055 Int_t ntracks = esd->GetNumberOfTracks();
2056 for (Int_t itrack = 0; itrack < ntracks; itrack++)
2058 AliESDtrack *track = esd->GetTrack(itrack);
2061 for (Int_t iDet = 3; iDet >= 0; iDet--)
2062 nsp += track->GetNcls(iDet);
2064 AliTrackPointArray *sp = new AliTrackPointArray(nsp);
2065 track->SetTrackPointArray(sp);
2067 for (Int_t iDet = 3; iDet >= 0; iDet--) {
2068 AliTracker *tracker = fTracker[iDet];
2069 if (!tracker) continue;
2070 Int_t nspdet = track->GetNcls(iDet);
2071 if (nspdet <= 0) continue;
2072 track->GetClusters(iDet,idx);
2076 while (isp < nspdet) {
2077 Bool_t isvalid = tracker->GetTrackPoint(idx[isp2],p); isp2++;
2078 const Int_t kNTPCmax = 159;
2079 if (iDet==1 && isp2>kNTPCmax) break; // to be fixed
2080 if (!isvalid) continue;
2081 sp->AddPoint(isptrack,&p); isptrack++; isp++;
2087 fTracker[3]->UnloadClusters();
2088 fLoader[3]->UnloadRecPoints();
2092 //_____________________________________________________________________________
2093 void AliReconstruction::FillRawDataErrorLog(Int_t iEvent, AliESD* esd)
2095 // The method reads the raw-data error log
2096 // accumulated within the rawReader.
2097 // It extracts the raw-data errors related to
2098 // the current event and stores them into
2099 // a TClonesArray inside the esd object.
2101 if (!fRawReader) return;
2103 for(Int_t i = 0; i < fRawReader->GetNumberOfErrorLogs(); i++) {
2105 AliRawDataErrorLog *log = fRawReader->GetErrorLog(i);
2107 if (iEvent != log->GetEventNumber()) continue;
2109 esd->AddRawDataErrorLog(log);