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 <TGeoManager.h>
123 #include <TLorentzVector.h>
125 #include "AliReconstruction.h"
126 #include "AliCodeTimer.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"
135 #include "AliESDEvent.h"
136 #include "AliESDMuonTrack.h"
137 #include "AliESDfriend.h"
138 #include "AliESDVertex.h"
139 #include "AliESDcascade.h"
140 #include "AliESDkink.h"
141 #include "AliESDtrack.h"
142 #include "AliESDCaloCluster.h"
143 #include "AliMultiplicity.h"
144 #include "AliTracker.h"
145 #include "AliVertexer.h"
146 #include "AliVertexerTracks.h"
147 #include "AliV0vertexer.h"
148 #include "AliCascadeVertexer.h"
149 #include "AliHeader.h"
150 #include "AliGenEventHeader.h"
152 #include "AliESDpid.h"
153 #include "AliESDtrack.h"
155 #include "AliESDTagCreator.h"
156 #include "AliAODTagCreator.h"
158 #include "AliGeomManager.h"
159 #include "AliTrackPointArray.h"
160 #include "AliCDBManager.h"
161 #include "AliCDBEntry.h"
162 #include "AliAlignObj.h"
164 #include "AliCentralTrigger.h"
165 #include "AliCTPRawStream.h"
167 #include "AliAODEvent.h"
168 #include "AliAODHeader.h"
169 #include "AliAODTrack.h"
170 #include "AliAODVertex.h"
171 #include "AliAODCluster.h"
173 #include "AliQualAssDataMaker.h"
175 //#include "TMemStatManager.h" // memory snapshots
176 #include "AliSysInfo.h" // memory snapshots
178 ClassImp(AliReconstruction)
181 //_____________________________________________________________________________
182 const char* AliReconstruction::fgkDetectorName[AliReconstruction::fgkNDetectors] = {"ITS", "TPC", "TRD", "TOF", "PHOS", "HMPID", "EMCAL", "MUON", "FMD", "ZDC", "PMD", "T0", "VZERO", "ACORDE", "HLT"};
184 //_____________________________________________________________________________
185 AliReconstruction::AliReconstruction(const char* gAliceFilename, const char* cdbUri,
186 const char* name, const char* title) :
189 fUniformField(kTRUE),
190 fRunVertexFinder(kTRUE),
191 fRunHLTTracking(kFALSE),
192 fRunMuonTracking(kFALSE),
194 fRunCascadeFinder(kTRUE),
195 fStopOnError(kFALSE),
196 fWriteAlignmentData(kFALSE),
197 fWriteESDfriend(kFALSE),
199 fFillTriggerESD(kTRUE),
205 fRunLocalReconstruction("ALL"),
208 fUseTrackingErrorsForAlignment(""),
209 fGAliceFileName(gAliceFilename),
214 fNumberOfEventsPerFile(1),
217 fLoadAlignFromCDB(kTRUE),
218 fLoadAlignData("ALL"),
225 fDiamondProfile(NULL),
227 fAlignObjArray(NULL),
232 // create reconstruction object with default parameters
234 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
235 fReconstructor[iDet] = NULL;
236 fLoader[iDet] = NULL;
237 fTracker[iDet] = NULL;
238 fQualAssDataMaker[iDet] = NULL;
239 fQACycles[iDet] = 999999;
244 //_____________________________________________________________________________
245 AliReconstruction::AliReconstruction(const AliReconstruction& rec) :
248 fUniformField(rec.fUniformField),
249 fRunVertexFinder(rec.fRunVertexFinder),
250 fRunHLTTracking(rec.fRunHLTTracking),
251 fRunMuonTracking(rec.fRunMuonTracking),
252 fRunV0Finder(rec.fRunV0Finder),
253 fRunCascadeFinder(rec.fRunCascadeFinder),
254 fStopOnError(rec.fStopOnError),
255 fWriteAlignmentData(rec.fWriteAlignmentData),
256 fWriteESDfriend(rec.fWriteESDfriend),
257 fWriteAOD(rec.fWriteAOD),
258 fFillTriggerESD(rec.fFillTriggerESD),
260 fCleanESD(rec.fCleanESD),
264 fRunLocalReconstruction(rec.fRunLocalReconstruction),
265 fRunTracking(rec.fRunTracking),
266 fFillESD(rec.fFillESD),
267 fUseTrackingErrorsForAlignment(rec.fUseTrackingErrorsForAlignment),
268 fGAliceFileName(rec.fGAliceFileName),
270 fEquipIdMap(rec.fEquipIdMap),
271 fFirstEvent(rec.fFirstEvent),
272 fLastEvent(rec.fLastEvent),
273 fNumberOfEventsPerFile(rec.fNumberOfEventsPerFile),
276 fLoadAlignFromCDB(rec.fLoadAlignFromCDB),
277 fLoadAlignData(rec.fLoadAlignData),
278 fESDPar(rec.fESDPar),
284 fDiamondProfile(NULL),
286 fAlignObjArray(rec.fAlignObjArray),
287 fCDBUri(rec.fCDBUri),
288 fRemoteCDBUri(rec.fRemoteCDBUri),
293 for (Int_t i = 0; i < rec.fOptions.GetEntriesFast(); i++) {
294 if (rec.fOptions[i]) fOptions.Add(rec.fOptions[i]->Clone());
296 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
297 fReconstructor[iDet] = NULL;
298 fLoader[iDet] = NULL;
299 fTracker[iDet] = NULL;
300 fQualAssDataMaker[iDet] = NULL;
301 fQACycles[iDet] = rec.fQACycles[iDet];
303 for (Int_t i = 0; i < rec.fSpecCDBUri.GetEntriesFast(); i++) {
304 if (rec.fSpecCDBUri[i]) fSpecCDBUri.Add(rec.fSpecCDBUri[i]->Clone());
308 //_____________________________________________________________________________
309 AliReconstruction& AliReconstruction::operator = (const AliReconstruction& rec)
311 // assignment operator
313 this->~AliReconstruction();
314 new(this) AliReconstruction(rec);
318 //_____________________________________________________________________________
319 AliReconstruction::~AliReconstruction()
325 fSpecCDBUri.Delete();
327 AliCodeTimer::Instance()->Print();
330 //_____________________________________________________________________________
331 void AliReconstruction::InitCDBStorage()
333 // activate a default CDB storage
334 // First check if we have any CDB storage set, because it is used
335 // to retrieve the calibration and alignment constants
337 AliCDBManager* man = AliCDBManager::Instance();
338 if (man->IsDefaultStorageSet())
340 AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
341 AliWarning("Default CDB storage has been already set !");
342 AliWarning(Form("Ignoring the default storage declared in AliReconstruction: %s",fCDBUri.Data()));
343 AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
347 AliDebug(2, "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
348 AliDebug(2, Form("Default CDB storage is set to: %s",fCDBUri.Data()));
349 AliDebug(2, "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
350 man->SetDefaultStorage(fCDBUri);
353 // Remote storage (the Grid storage) is used if it is activated
354 // and if the object is not found in the default storage
356 // if (man->IsRemoteStorageSet())
358 // AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
359 // AliWarning("Remote CDB storage has been already set !");
360 // AliWarning(Form("Ignoring the remote storage declared in AliReconstruction: %s",fRemoteCDBUri.Data()));
361 // AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
362 // fRemoteCDBUri = "";
365 // AliDebug(2,"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
366 // AliDebug(2, Form("Remote CDB storage is set to: %s",fRemoteCDBUri.Data()));
367 // AliDebug(2, "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
368 // man->SetRemoteStorage(fRemoteCDBUri);
371 // Now activate the detector specific CDB storage locations
372 for (Int_t i = 0; i < fSpecCDBUri.GetEntriesFast(); i++) {
373 TObject* obj = fSpecCDBUri[i];
375 AliDebug(2, "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
376 AliDebug(2, Form("Specific CDB storage for %s is set to: %s",obj->GetName(),obj->GetTitle()));
377 AliDebug(2, "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
378 man->SetSpecificStorage(obj->GetName(), obj->GetTitle());
383 //_____________________________________________________________________________
384 void AliReconstruction::SetDefaultStorage(const char* uri) {
385 // Store the desired default CDB storage location
386 // Activate it later within the Run() method
392 //_____________________________________________________________________________
393 void AliReconstruction::SetRemoteStorage(const char* uri) {
394 // Store the desired remote CDB storage location
395 // Activate it later within the Run() method
396 // Remote storage (the Grid storage) is used if it is activated
397 // and if the object is not found in the default storage
403 //_____________________________________________________________________________
404 void AliReconstruction::SetSpecificStorage(const char* calibType, const char* uri) {
405 // Store a detector-specific CDB storage location
406 // Activate it later within the Run() method
408 AliCDBPath aPath(calibType);
409 if(!aPath.IsValid()){
410 // if calibType is not wildcard but it is a valid detector, add "/*" to make it a valid path
411 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
412 if(!strcmp(calibType, fgkDetectorName[iDet])) {
413 aPath.SetPath(Form("%s/*", calibType));
414 AliInfo(Form("Path for specific storage set to %s", aPath.GetPath().Data()));
418 if(!aPath.IsValid()){
419 AliError(Form("Not a valid path or detector: %s", calibType));
424 // // check that calibType refers to a "valid" detector name
425 // Bool_t isDetector = kFALSE;
426 // for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
427 // TString detName = fgkDetectorName[iDet];
428 // if(aPath.GetLevel0() == detName) {
429 // isDetector = kTRUE;
435 // AliError(Form("Not a valid detector: %s", aPath.GetLevel0().Data()));
439 TObject* obj = fSpecCDBUri.FindObject(aPath.GetPath().Data());
440 if (obj) fSpecCDBUri.Remove(obj);
441 fSpecCDBUri.Add(new TNamed(aPath.GetPath().Data(), uri));
448 //_____________________________________________________________________________
449 Bool_t AliReconstruction::SetRunNumber()
451 // The method is called in Run() in order
452 // to set a correct run number.
453 // In case of raw data reconstruction the
454 // run number is taken from the raw data header
456 if(AliCDBManager::Instance()->GetRun() < 0) {
458 AliError("No run loader is found !");
461 // read run number from gAlice
462 if(fRunLoader->GetAliRun())
463 AliCDBManager::Instance()->SetRun(fRunLoader->GetAliRun()->GetRunNumber());
466 if(fRawReader->NextEvent()) {
467 AliCDBManager::Instance()->SetRun(fRawReader->GetRunNumber());
468 fRawReader->RewindEvents();
471 AliError("No raw-data events found !");
476 AliError("Neither gAlice nor RawReader objects are found !");
480 AliInfo(Form("CDB Run number: %d",AliCDBManager::Instance()->GetRun()));
485 //_____________________________________________________________________________
486 Bool_t AliReconstruction::MisalignGeometry(const TString& detectors)
488 // Read the alignment objects from CDB.
489 // Each detector is supposed to have the
490 // alignment objects in DET/Align/Data CDB path.
491 // All the detector objects are then collected,
492 // sorted by geometry level (starting from ALIC) and
493 // then applied to the TGeo geometry.
494 // Finally an overlaps check is performed.
496 // Load alignment data from CDB and fill fAlignObjArray
497 if(fLoadAlignFromCDB){
499 TString detStr = detectors;
500 TString loadAlObjsListOfDets = "";
502 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
503 if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
504 loadAlObjsListOfDets += fgkDetectorName[iDet];
505 loadAlObjsListOfDets += " ";
506 } // end loop over detectors
507 loadAlObjsListOfDets.Prepend("GRP "); //add alignment objects for non-sensitive modules
508 AliGeomManager::ApplyAlignObjsFromCDB(loadAlObjsListOfDets.Data());
510 // Check if the array with alignment objects was
511 // provided by the user. If yes, apply the objects
512 // to the present TGeo geometry
513 if (fAlignObjArray) {
514 if (gGeoManager && gGeoManager->IsClosed()) {
515 if (AliGeomManager::ApplyAlignObjsToGeom(*fAlignObjArray) == kFALSE) {
516 AliError("The misalignment of one or more volumes failed!"
517 "Compare the list of simulated detectors and the list of detector alignment data!");
522 AliError("Can't apply the misalignment! gGeoManager doesn't exist or it is still opened!");
528 delete fAlignObjArray; fAlignObjArray=0;
533 //_____________________________________________________________________________
534 void AliReconstruction::SetGAliceFile(const char* fileName)
536 // set the name of the galice file
538 fGAliceFileName = fileName;
541 //_____________________________________________________________________________
542 void AliReconstruction::SetOption(const char* detector, const char* option)
544 // set options for the reconstruction of a detector
546 TObject* obj = fOptions.FindObject(detector);
547 if (obj) fOptions.Remove(obj);
548 fOptions.Add(new TNamed(detector, option));
552 //_____________________________________________________________________________
553 Bool_t AliReconstruction::Run(const char* input)
555 // run the reconstruction
560 if (!input) input = fInput.Data();
561 TString fileName(input);
562 if (fileName.EndsWith("/")) {
563 fRawReader = new AliRawReaderFile(fileName);
564 } else if (fileName.EndsWith(".root")) {
565 fRawReader = new AliRawReaderRoot(fileName);
566 } else if (!fileName.IsNull()) {
567 fRawReader = new AliRawReaderDate(fileName);
568 fRawReader->SelectEvents(7);
570 if (!fEquipIdMap.IsNull() && fRawReader)
571 fRawReader->LoadEquipmentIdsMap(fEquipIdMap);
573 AliSysInfo::AddStamp("Start");
574 // get the run loader
575 if (!InitRunLoader()) return kFALSE;
576 AliSysInfo::AddStamp("LoadLoader");
578 // Initialize the CDB storage
580 AliSysInfo::AddStamp("LoadCDB");
582 // Set run number in CDBManager (if it is not already set by the user)
583 if (!SetRunNumber()) if (fStopOnError) return kFALSE;
585 // Import ideal TGeo geometry and apply misalignment
587 TString geom(gSystem->DirName(fGAliceFileName));
588 geom += "/geometry.root";
589 AliGeomManager::LoadGeometry(geom.Data());
590 if (!gGeoManager) if (fStopOnError) return kFALSE;
593 if (!MisalignGeometry(fLoadAlignData)) if (fStopOnError) return kFALSE;
594 AliSysInfo::AddStamp("LoadGeom");
596 // local reconstruction
597 if (!fRunLocalReconstruction.IsNull()) {
598 if (!RunLocalReconstruction(fRunLocalReconstruction)) {
599 if (fStopOnError) {CleanUp(); return kFALSE;}
602 // if (!fRunVertexFinder && fRunTracking.IsNull() &&
603 // fFillESD.IsNull()) return kTRUE;
606 if (fRunVertexFinder && !CreateVertexer()) {
612 AliSysInfo::AddStamp("Vertexer");
615 if (!fRunTracking.IsNull() && !CreateTrackers(fRunTracking)) {
621 AliSysInfo::AddStamp("LoadTrackers");
623 // get the possibly already existing ESD file and tree
624 AliESDEvent* esd = new AliESDEvent(); AliESDEvent* hltesd = new AliESDEvent();
625 TFile* fileOld = NULL;
626 TTree* treeOld = NULL; TTree *hlttreeOld = NULL;
627 if (!gSystem->AccessPathName("AliESDs.root")){
628 gSystem->CopyFile("AliESDs.root", "AliESDs.old.root", kTRUE);
629 fileOld = TFile::Open("AliESDs.old.root");
630 if (fileOld && fileOld->IsOpen()) {
631 treeOld = (TTree*) fileOld->Get("esdTree");
632 if (treeOld)esd->ReadFromTree(treeOld);
633 hlttreeOld = (TTree*) fileOld->Get("HLTesdTree");
634 if (hlttreeOld) hltesd->ReadFromTree(hlttreeOld);
638 // create the ESD output file and tree
639 TFile* file = TFile::Open("AliESDs.root", "RECREATE");
640 file->SetCompressionLevel(2);
641 if (!file->IsOpen()) {
642 AliError("opening AliESDs.root failed");
643 if (fStopOnError) {CleanUp(file, fileOld); return kFALSE;}
646 TTree* tree = new TTree("esdTree", "Tree with ESD objects");
647 esd = new AliESDEvent();
648 esd->CreateStdContent();
649 esd->WriteToTree(tree);
651 TTree* hlttree = new TTree("HLTesdTree", "Tree with HLT ESD objects");
652 hltesd = new AliESDEvent();
653 hltesd->CreateStdContent();
654 hltesd->WriteToTree(hlttree);
657 delete esd; delete hltesd;
658 esd = NULL; hltesd = NULL;
660 // create the branch with ESD additions
664 AliESDfriend *esdf = 0;
665 if (fWriteESDfriend) {
666 esdf = new AliESDfriend();
667 TBranch *br=tree->Branch("ESDfriend.","AliESDfriend", &esdf);
668 br->SetFile("AliESDfriends.root");
669 esd->AddObject(esdf);
673 // Get the diamond profile from OCDB
674 AliCDBEntry* entry = AliCDBManager::Instance()
675 ->Get("GRP/Calib/MeanVertex");
678 fDiamondProfile = dynamic_cast<AliESDVertex*> (entry->GetObject());
680 AliError("No diamond profile found in OCDB!");
683 AliVertexerTracks tVertexer(AliTracker::GetBz());
684 if(fDiamondProfile) tVertexer.SetVtxStart(fDiamondProfile);
688 if (fRawReader) fRawReader->RewindEvents();
689 TString detStr(fFillESD) ;
692 gSystem->GetProcInfo(&ProcInfo);
693 AliInfo(Form("Current memory usage %d %d", ProcInfo.fMemResident, ProcInfo.fMemVirtual));
694 for (Int_t iEvent = 0; iEvent < fRunLoader->GetNumberOfEvents(); iEvent++) {
695 if (fRawReader) fRawReader->NextEvent();
696 if ((iEvent < fFirstEvent) || ((fLastEvent >= 0) && (iEvent > fLastEvent))) {
697 // copy old ESD to the new one
699 esd->ReadFromTree(treeOld);
700 treeOld->GetEntry(iEvent);
704 esd->ReadFromTree(hlttreeOld);
705 hlttreeOld->GetEntry(iEvent);
711 AliInfo(Form("processing event %d", iEvent));
712 fRunLoader->GetEvent(iEvent);
715 sprintf(aFileName, "ESD_%d.%d_final.root",
716 fRunLoader->GetHeader()->GetRun(),
717 fRunLoader->GetHeader()->GetEventNrInRun());
718 if (!gSystem->AccessPathName(aFileName)) continue;
720 // local reconstruction
721 if (!fRunLocalReconstruction.IsNull()) {
722 if (!RunLocalEventReconstruction(fRunLocalReconstruction)) {
723 if (fStopOnError) {CleanUp(file, fileOld); return kFALSE;}
728 esd->SetRunNumber(fRunLoader->GetHeader()->GetRun());
729 hltesd->SetRunNumber(fRunLoader->GetHeader()->GetRun());
730 esd->SetEventNumberInFile(fRunLoader->GetHeader()->GetEventNrInRun());
731 hltesd->SetEventNumberInFile(fRunLoader->GetHeader()->GetEventNrInRun());
733 // Set magnetic field from the tracker
734 esd->SetMagneticField(AliTracker::GetBz());
735 hltesd->SetMagneticField(AliTracker::GetBz());
739 // Fill raw-data error log into the ESD
740 if (fRawReader) FillRawDataErrorLog(iEvent,esd);
743 if (fRunVertexFinder) {
744 if (!ReadESD(esd, "vertex")) {
745 if (!RunVertexFinder(esd)) {
746 if (fStopOnError) {CleanUp(file, fileOld); return kFALSE;}
748 if (fCheckPointLevel > 0) WriteESD(esd, "vertex");
753 if (!fRunTracking.IsNull()) {
754 if (fRunHLTTracking) {
755 hltesd->SetVertex(esd->GetVertex());
756 if (!RunHLTTracking(hltesd)) {
757 if (fStopOnError) {CleanUp(file, fileOld); return kFALSE;}
763 if (!fRunTracking.IsNull()) {
764 if (fRunMuonTracking) {
765 if (!RunMuonTracking(esd)) {
766 if (fStopOnError) {CleanUp(file, fileOld); return kFALSE;}
772 if (!fRunTracking.IsNull()) {
773 if (!ReadESD(esd, "tracking")) {
774 if (!RunTracking(esd)) {
775 if (fStopOnError) {CleanUp(file, fileOld); return kFALSE;}
777 if (fCheckPointLevel > 0) WriteESD(esd, "tracking");
782 if (!fFillESD.IsNull()) {
783 if (!FillESD(esd, fFillESD)) {
784 if (fStopOnError) {CleanUp(file, fileOld); return kFALSE;}
788 if (!fFillESD.IsNull())
789 RunQualAss(fFillESD.Data(), esd);
791 // fill Event header information from the RawEventHeader
792 if (fRawReader){FillRawEventHeaderESD(esd);}
795 AliESDpid::MakePID(esd);
796 if (fCheckPointLevel > 1) WriteESD(esd, "PID");
798 if (fFillTriggerESD) {
799 if (!ReadESD(esd, "trigger")) {
800 if (!FillTriggerESD(esd)) {
801 if (fStopOnError) {CleanUp(file, fileOld); return kFALSE;}
803 if (fCheckPointLevel > 1) WriteESD(esd, "trigger");
809 //Try to improve the reconstructed primary vertex position using the tracks
810 AliESDVertex *pvtx=0;
811 Bool_t dovertex=kTRUE;
812 TObject* obj = fOptions.FindObject("ITS");
814 TString optITS = obj->GetTitle();
815 if (optITS.Contains("cosmics") || optITS.Contains("COSMICS"))
818 if(dovertex) pvtx=tVertexer.FindPrimaryVertex(esd);
819 if(fDiamondProfile) esd->SetDiamond(fDiamondProfile);
822 if (pvtx->GetStatus()) {
823 // Store the improved primary vertex
824 esd->SetPrimaryVertex(pvtx);
825 // Propagate the tracks to the DCA to the improved primary vertex
826 Double_t somethingbig = 777.;
827 Double_t bz = esd->GetMagneticField();
828 Int_t nt=esd->GetNumberOfTracks();
830 AliESDtrack *t = esd->GetTrack(nt);
831 t->RelateToVertex(pvtx, bz, somethingbig);
838 vtxer.Tracks2V0vertices(esd);
840 if (fRunCascadeFinder) {
842 AliCascadeVertexer cvtxer;
843 cvtxer.V0sTracks2CascadeVertices(esd);
848 if (fCleanESD) CleanESD(esd);
849 if (fWriteESDfriend) {
850 esdf->~AliESDfriend();
851 new (esdf) AliESDfriend(); // Reset...
852 esd->GetESDfriend(esdf);
859 if (fCheckPointLevel > 0) WriteESD(esd, "final");
862 if (fWriteESDfriend) {
863 esdf->~AliESDfriend();
864 new (esdf) AliESDfriend(); // Reset...
867 // delete esdf; esdf = 0;
870 gSystem->GetProcInfo(&ProcInfo);
871 AliInfo(Form("Event %d -> Current memory usage %d %d",iEvent, ProcInfo.fMemResident, ProcInfo.fMemVirtual));
875 // write quality assurance ESDs data (one entry for all events)
876 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
877 if (!IsSelected(fgkDetectorName[iDet], detStr))
879 AliQualAssDataMaker * qadm = GetQualAssDataMaker(iDet);
882 qadm->EndOfCycle(AliQualAss::kRECPOINTS);
883 qadm->EndOfCycle(AliQualAss::kESDS);
884 qadm->Finish(AliQualAss::kRECPOINTS);
885 qadm->Finish(AliQualAss::kESDS) ;
889 tree->GetUserInfo()->Add(esd);
890 hlttree->GetUserInfo()->Add(hltesd);
894 if(fESDPar.Contains("ESD.par")){
895 AliInfo("Attaching ESD.par to Tree");
896 TNamed *fn = CopyFileToTNamed(fESDPar.Data(),"ESD.par");
897 tree->GetUserInfo()->Add(fn);
903 tree->SetBranchStatus("ESDfriend*",0);
904 // we want to have only one tree version number
905 tree->Write(tree->GetName(),TObject::kOverwrite);
909 TFile *aodFile = TFile::Open("AliAOD.root", "RECREATE");
910 ESDFile2AODFile(file, aodFile);
915 CleanUp(file, fileOld);
917 // Create tags for the events in the ESD tree (the ESD tree is always present)
918 // In case of empty events the tags will contain dummy values
919 AliESDTagCreator *esdtagCreator = new AliESDTagCreator();
920 esdtagCreator->CreateESDTags(fFirstEvent,fLastEvent);
922 AliAODTagCreator *aodtagCreator = new AliAODTagCreator();
923 aodtagCreator->CreateAODTags(fFirstEvent,fLastEvent);
930 //_____________________________________________________________________________
931 Bool_t AliReconstruction::RunLocalReconstruction(const TString& detectors)
933 // run the local reconstruction
934 static Int_t eventNr=0;
937 // AliCDBManager* man = AliCDBManager::Instance();
938 // Bool_t origCache = man->GetCacheFlag();
940 // TString detStr = detectors;
941 // for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
942 // if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
943 // AliReconstructor* reconstructor = GetReconstructor(iDet);
944 // if (!reconstructor) continue;
945 // if (reconstructor->HasLocalReconstruction()) continue;
947 // AliCodeTimerStart(Form("running reconstruction for %s", fgkDetectorName[iDet]));
948 // AliInfo(Form("running reconstruction for %s", fgkDetectorName[iDet]));
950 // AliCodeTimerStart(Form("Loading calibration data from OCDB for %s", fgkDetectorName[iDet]));
951 // AliInfo(Form("Loading calibration data from OCDB for %s", fgkDetectorName[iDet]));
953 // man->SetCacheFlag(kTRUE);
954 // TString calibPath = Form("%s/Calib/*", fgkDetectorName[iDet]);
955 // man->GetAll(calibPath); // entries are cached!
957 // AliCodeTimerStop(Form("Loading calibration data from OCDB for %s", fgkDetectorName[iDet]));
960 // fRawReader->RewindEvents();
961 // reconstructor->Reconstruct(fRunLoader, fRawReader);
963 // reconstructor->Reconstruct(fRunLoader);
966 // AliCodeTimerStop(Form("running reconstruction for %s", fgkDetectorName[iDet]));
967 // AliSysInfo::AddStamp(Form("LRec%s_%d",fgkDetectorName[iDet],eventNr));
969 // // unload calibration data
970 // man->UnloadFromCache(calibPath);
971 // //man->ClearCache();
974 // man->SetCacheFlag(origCache);
976 // if ((detStr.CompareTo("ALL") != 0) && !detStr.IsNull()) {
977 // AliError(Form("the following detectors were not found: %s",
979 // if (fStopOnError) return kFALSE;
986 //_____________________________________________________________________________
987 Bool_t AliReconstruction::RunLocalEventReconstruction(const TString& detectors)
989 // run the local reconstruction
990 static Int_t eventNr=0;
993 TString detStr = detectors;
994 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
995 if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
996 AliReconstructor* reconstructor = GetReconstructor(iDet);
997 if (!reconstructor) continue;
998 AliLoader* loader = fLoader[iDet];
1000 AliWarning(Form("No loader is defined for %s!",fgkDetectorName[iDet]));
1004 // conversion of digits
1005 if (fRawReader && reconstructor->HasDigitConversion()) {
1006 AliInfo(Form("converting raw data digits into root objects for %s",
1007 fgkDetectorName[iDet]));
1008 AliCodeTimerAuto(Form("converting raw data digits into root objects for %s",
1009 fgkDetectorName[iDet]));
1010 loader->LoadDigits("update");
1011 loader->CleanDigits();
1012 loader->MakeDigitsContainer();
1013 TTree* digitsTree = loader->TreeD();
1014 reconstructor->ConvertDigits(fRawReader, digitsTree);
1015 loader->WriteDigits("OVERWRITE");
1016 loader->UnloadDigits();
1019 // local reconstruction
1020 AliInfo(Form("running reconstruction for %s", fgkDetectorName[iDet]));
1021 AliCodeTimerAuto(Form("running reconstruction for %s", fgkDetectorName[iDet]));
1022 loader->LoadRecPoints("update");
1023 loader->CleanRecPoints();
1024 loader->MakeRecPointsContainer();
1025 TTree* clustersTree = loader->TreeR();
1026 if (fRawReader && !reconstructor->HasDigitConversion()) {
1027 reconstructor->Reconstruct(fRawReader, clustersTree);
1029 loader->LoadDigits("read");
1030 TTree* digitsTree = loader->TreeD();
1032 AliError(Form("Can't get the %s digits tree", fgkDetectorName[iDet]));
1033 if (fStopOnError) return kFALSE;
1035 reconstructor->Reconstruct(digitsTree, clustersTree);
1037 loader->UnloadDigits();
1040 AliQualAssDataMaker * qadm = GetQualAssDataMaker(iDet);
1042 AliCodeTimerStart(Form("running quality assurance data maker for %s", fgkDetectorName[iDet]));
1043 AliInfo(Form("running quality assurance data maker for %s", fgkDetectorName[iDet]));
1045 if (qadm->IsCycleDone() ) {
1047 qadm->EndOfCycle(AliQualAss::kRECPOINTS) ;
1048 qadm->EndOfCycle(AliQualAss::kESDS) ;
1049 qadm->StartOfCycle(AliQualAss::kRECPOINTS) ;
1050 qadm->StartOfCycle(AliQualAss::kESDS, "same") ;
1052 qadm->Exec(AliQualAss::kRECPOINTS, clustersTree) ;
1053 AliCodeTimerStop(Form("running quality assurance data maker for %s", fgkDetectorName[iDet]));
1056 loader->WriteRecPoints("OVERWRITE");
1057 loader->UnloadRecPoints();
1058 AliSysInfo::AddStamp(Form("LRec%s_%d",fgkDetectorName[iDet],eventNr));
1061 if ((detStr.CompareTo("ALL") != 0) && !detStr.IsNull()) {
1062 AliError(Form("the following detectors were not found: %s",
1064 if (fStopOnError) return kFALSE;
1070 //_____________________________________________________________________________
1071 Bool_t AliReconstruction::RunVertexFinder(AliESDEvent*& esd)
1073 // run the barrel tracking
1075 AliCodeTimerAuto("")
1077 AliESDVertex* vertex = NULL;
1078 Double_t vtxPos[3] = {0, 0, 0};
1079 Double_t vtxErr[3] = {0.07, 0.07, 0.1};
1080 TArrayF mcVertex(3);
1081 if (fRunLoader->GetHeader() && fRunLoader->GetHeader()->GenEventHeader()) {
1082 fRunLoader->GetHeader()->GenEventHeader()->PrimaryVertex(mcVertex);
1083 for (Int_t i = 0; i < 3; i++) vtxPos[i] = mcVertex[i];
1087 if(fDiamondProfile) fVertexer->SetVtxStart(fDiamondProfile);
1088 AliInfo("running the ITS vertex finder");
1089 if (fLoader[0]) fLoader[0]->LoadRecPoints();
1090 vertex = fVertexer->FindVertexForCurrentEvent(fRunLoader->GetEventNumber());
1091 if (fLoader[0]) fLoader[0]->UnloadRecPoints();
1093 AliWarning("Vertex not found");
1094 vertex = new AliESDVertex();
1095 vertex->SetName("default");
1098 vertex->SetName("reconstructed");
1102 AliInfo("getting the primary vertex from MC");
1103 vertex = new AliESDVertex(vtxPos, vtxErr);
1107 vertex->GetXYZ(vtxPos);
1108 vertex->GetSigmaXYZ(vtxErr);
1110 AliWarning("no vertex reconstructed");
1111 vertex = new AliESDVertex(vtxPos, vtxErr);
1113 esd->SetVertex(vertex);
1114 // if SPD multiplicity has been determined, it is stored in the ESD
1115 AliMultiplicity *mult = fVertexer->GetMultiplicity();
1116 if(mult)esd->SetMultiplicity(mult);
1118 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
1119 if (fTracker[iDet]) fTracker[iDet]->SetVertex(vtxPos, vtxErr);
1126 //_____________________________________________________________________________
1127 Bool_t AliReconstruction::RunHLTTracking(AliESDEvent*& esd)
1129 // run the HLT barrel tracking
1131 AliCodeTimerAuto("")
1134 AliError("Missing runLoader!");
1138 AliInfo("running HLT tracking");
1140 // Get a pointer to the HLT reconstructor
1141 AliReconstructor *reconstructor = GetReconstructor(fgkNDetectors-1);
1142 if (!reconstructor) return kFALSE;
1145 for (Int_t iDet = 1; iDet >= 0; iDet--) {
1146 TString detName = fgkDetectorName[iDet];
1147 AliDebug(1, Form("%s HLT tracking", detName.Data()));
1148 reconstructor->SetOption(detName.Data());
1149 AliTracker *tracker = reconstructor->CreateTracker();
1151 AliWarning(Form("couldn't create a HLT tracker for %s", detName.Data()));
1152 if (fStopOnError) return kFALSE;
1156 Double_t vtxErr[3]={0.005,0.005,0.010};
1157 const AliESDVertex *vertex = esd->GetVertex();
1158 vertex->GetXYZ(vtxPos);
1159 tracker->SetVertex(vtxPos,vtxErr);
1161 fLoader[iDet]->LoadRecPoints("read");
1162 TTree* tree = fLoader[iDet]->TreeR();
1164 AliError(Form("Can't get the %s cluster tree", detName.Data()));
1167 tracker->LoadClusters(tree);
1169 if (tracker->Clusters2Tracks(esd) != 0) {
1170 AliError(Form("HLT %s Clusters2Tracks failed", fgkDetectorName[iDet]));
1174 tracker->UnloadClusters();
1182 //_____________________________________________________________________________
1183 Bool_t AliReconstruction::RunMuonTracking(AliESDEvent*& esd)
1185 // run the muon spectrometer tracking
1187 AliCodeTimerAuto("")
1190 AliError("Missing runLoader!");
1193 Int_t iDet = 7; // for MUON
1195 AliInfo("is running...");
1197 // Get a pointer to the MUON reconstructor
1198 AliReconstructor *reconstructor = GetReconstructor(iDet);
1199 if (!reconstructor) return kFALSE;
1202 TString detName = fgkDetectorName[iDet];
1203 AliDebug(1, Form("%s tracking", detName.Data()));
1204 AliTracker *tracker = reconstructor->CreateTracker();
1206 AliWarning(Form("couldn't create a tracker for %s", detName.Data()));
1211 fLoader[iDet]->LoadTracks("update");
1212 fLoader[iDet]->CleanTracks();
1213 fLoader[iDet]->MakeTracksContainer();
1216 fLoader[iDet]->LoadRecPoints("read");
1217 tracker->LoadClusters(fLoader[iDet]->TreeR());
1219 Int_t rv = tracker->Clusters2Tracks(esd);
1221 fLoader[iDet]->UnloadRecPoints();
1225 AliError(Form("%s Clusters2Tracks failed", fgkDetectorName[iDet]));
1229 tracker->UnloadClusters();
1231 fLoader[iDet]->UnloadRecPoints();
1233 fLoader[iDet]->WriteTracks("OVERWRITE");
1234 fLoader[iDet]->UnloadTracks();
1242 //_____________________________________________________________________________
1243 Bool_t AliReconstruction::RunTracking(AliESDEvent*& esd)
1245 // run the barrel tracking
1246 static Int_t eventNr=0;
1247 AliCodeTimerAuto("")
1249 AliInfo("running tracking");
1251 //Fill the ESD with the T0 info (will be used by the TOF)
1252 if (fReconstructor[11] && fLoader[11]) {
1253 fLoader[11]->LoadRecPoints("READ");
1254 TTree *treeR = fLoader[11]->TreeR();
1255 GetReconstructor(11)->FillESD((TTree *)NULL,treeR,esd);
1258 // pass 1: TPC + ITS inwards
1259 for (Int_t iDet = 1; iDet >= 0; iDet--) {
1260 if (!fTracker[iDet]) continue;
1261 AliDebug(1, Form("%s tracking", fgkDetectorName[iDet]));
1264 fLoader[iDet]->LoadRecPoints("read");
1265 TTree* tree = fLoader[iDet]->TreeR();
1267 AliError(Form("Can't get the %s cluster tree", fgkDetectorName[iDet]));
1270 fTracker[iDet]->LoadClusters(tree);
1273 if (fTracker[iDet]->Clusters2Tracks(esd) != 0) {
1274 AliError(Form("%s Clusters2Tracks failed", fgkDetectorName[iDet]));
1277 if (fCheckPointLevel > 1) {
1278 WriteESD(esd, Form("%s.tracking", fgkDetectorName[iDet]));
1280 // preliminary PID in TPC needed by the ITS tracker
1282 GetReconstructor(1)->FillESD((TTree*)NULL, (TTree*)NULL, esd);
1283 AliESDpid::MakePID(esd);
1285 AliSysInfo::AddStamp(Form("Tracking0%s_%d",fgkDetectorName[iDet],eventNr));
1288 // pass 2: ALL backwards
1289 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
1290 if (!fTracker[iDet]) continue;
1291 AliDebug(1, Form("%s back propagation", fgkDetectorName[iDet]));
1294 if (iDet > 1) { // all except ITS, TPC
1296 fLoader[iDet]->LoadRecPoints("read");
1297 tree = fLoader[iDet]->TreeR();
1299 AliError(Form("Can't get the %s cluster tree", fgkDetectorName[iDet]));
1302 fTracker[iDet]->LoadClusters(tree);
1303 AliSysInfo::AddStamp(Form("LoadCluster0%s_%d",fgkDetectorName[iDet],eventNr));
1307 if (fTracker[iDet]->PropagateBack(esd) != 0) {
1308 AliError(Form("%s backward propagation failed", fgkDetectorName[iDet]));
1311 if (fCheckPointLevel > 1) {
1312 WriteESD(esd, Form("%s.back", fgkDetectorName[iDet]));
1316 if (iDet > 2) { // all except ITS, TPC, TRD
1317 fTracker[iDet]->UnloadClusters();
1318 fLoader[iDet]->UnloadRecPoints();
1320 // updated PID in TPC needed by the ITS tracker -MI
1322 GetReconstructor(1)->FillESD((TTree*)NULL, (TTree*)NULL, esd);
1323 AliESDpid::MakePID(esd);
1325 AliSysInfo::AddStamp(Form("Tracking1%s_%d",fgkDetectorName[iDet],eventNr));
1328 // write space-points to the ESD in case alignment data output
1330 if (fWriteAlignmentData)
1331 WriteAlignmentData(esd);
1333 // pass 3: TRD + TPC + ITS refit inwards
1334 for (Int_t iDet = 2; iDet >= 0; iDet--) {
1335 if (!fTracker[iDet]) continue;
1336 AliDebug(1, Form("%s inward refit", fgkDetectorName[iDet]));
1339 if (fTracker[iDet]->RefitInward(esd) != 0) {
1340 AliError(Form("%s inward refit failed", fgkDetectorName[iDet]));
1343 if (fCheckPointLevel > 1) {
1344 WriteESD(esd, Form("%s.refit", fgkDetectorName[iDet]));
1348 fTracker[iDet]->UnloadClusters();
1349 fLoader[iDet]->UnloadRecPoints();
1350 AliSysInfo::AddStamp(Form("Tracking2%s_%d",fgkDetectorName[iDet],eventNr));
1353 // Propagate track to the vertex - if not done by ITS
1355 Int_t ntracks = esd->GetNumberOfTracks();
1356 for (Int_t itrack=0; itrack<ntracks; itrack++){
1357 const Double_t kRadius = 3; // beam pipe radius
1358 const Double_t kMaxStep = 5; // max step
1359 const Double_t kMaxD = 123456; // max distance to prim vertex
1360 Double_t fieldZ = AliTracker::GetBz(); //
1361 AliESDtrack * track = esd->GetTrack(itrack);
1362 if (!track) continue;
1363 if (track->IsOn(AliESDtrack::kITSrefit)) continue;
1364 AliTracker::PropagateTrackTo(track,kRadius,track->GetMass(),kMaxStep,kTRUE);
1365 track->RelateToVertex(esd->GetVertex(),fieldZ, kMaxD);
1371 //_____________________________________________________________________________
1372 Bool_t AliReconstruction::CleanESD(AliESDEvent *esd){
1374 // Remove the data which are not needed for the physics analysis.
1377 AliInfo("Cleaning the ESD...");
1378 Int_t nTracks=esd->GetNumberOfTracks();
1379 AliInfo(Form("Number of ESD tracks before cleaning %d",nTracks));
1381 Float_t cleanPars[]={fDmax,fZmax};
1382 Bool_t rc=esd->Clean(cleanPars);
1384 nTracks=esd->GetNumberOfTracks();
1385 AliInfo(Form("Number of ESD tracks after cleaning %d",nTracks));
1390 //_____________________________________________________________________________
1391 Bool_t AliReconstruction::FillESD(AliESDEvent*& esd, const TString& detectors)
1393 // fill the event summary data
1395 AliCodeTimerAuto("")
1396 static Int_t eventNr=0;
1397 TString detStr = detectors;
1398 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
1399 if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
1400 AliReconstructor* reconstructor = GetReconstructor(iDet);
1401 if (!reconstructor) continue;
1403 if (!ReadESD(esd, fgkDetectorName[iDet])) {
1404 AliDebug(1, Form("filling ESD for %s", fgkDetectorName[iDet]));
1405 TTree* clustersTree = NULL;
1406 if (fLoader[iDet]) {
1407 fLoader[iDet]->LoadRecPoints("read");
1408 clustersTree = fLoader[iDet]->TreeR();
1409 if (!clustersTree) {
1410 AliError(Form("Can't get the %s clusters tree",
1411 fgkDetectorName[iDet]));
1412 if (fStopOnError) return kFALSE;
1415 if (fRawReader && !reconstructor->HasDigitConversion()) {
1416 reconstructor->FillESD(fRawReader, clustersTree, esd);
1418 TTree* digitsTree = NULL;
1419 if (fLoader[iDet]) {
1420 fLoader[iDet]->LoadDigits("read");
1421 digitsTree = fLoader[iDet]->TreeD();
1423 AliError(Form("Can't get the %s digits tree",
1424 fgkDetectorName[iDet]));
1425 if (fStopOnError) return kFALSE;
1428 reconstructor->FillESD(digitsTree, clustersTree, esd);
1429 if (fLoader[iDet]) fLoader[iDet]->UnloadDigits();
1431 if (fLoader[iDet]) {
1432 fLoader[iDet]->UnloadRecPoints();
1435 if (fCheckPointLevel > 2) WriteESD(esd, fgkDetectorName[iDet]);
1439 if ((detStr.CompareTo("ALL") != 0) && !detStr.IsNull()) {
1440 AliError(Form("the following detectors were not found: %s",
1442 if (fStopOnError) return kFALSE;
1444 AliSysInfo::AddStamp(Form("FillESD%d",eventNr));
1449 //_____________________________________________________________________________
1450 Bool_t AliReconstruction::FillTriggerESD(AliESDEvent*& esd)
1452 // Reads the trigger decision which is
1453 // stored in Trigger.root file and fills
1454 // the corresponding esd entries
1456 AliCodeTimerAuto("")
1458 AliInfo("Filling trigger information into the ESD");
1461 AliCTPRawStream input(fRawReader);
1462 if (!input.Next()) {
1463 AliError("No valid CTP (trigger) DDL raw data is found ! The trigger information is not stored in the ESD !");
1466 esd->SetTriggerMask(input.GetClassMask());
1467 esd->SetTriggerCluster(input.GetClusterMask());
1470 AliRunLoader *runloader = AliRunLoader::GetRunLoader();
1472 if (!runloader->LoadTrigger()) {
1473 AliCentralTrigger *aCTP = runloader->GetTrigger();
1474 esd->SetTriggerMask(aCTP->GetClassMask());
1475 esd->SetTriggerCluster(aCTP->GetClusterMask());
1478 AliWarning("No trigger can be loaded! The trigger information is not stored in the ESD !");
1483 AliError("No run loader is available! The trigger information is not stored in the ESD !");
1495 //_____________________________________________________________________________
1496 Bool_t AliReconstruction::FillRawEventHeaderESD(AliESDEvent*& esd)
1499 // Filling information from RawReader Header
1502 AliInfo("Filling information from RawReader Header");
1503 esd->SetBunchCrossNumber(0);
1504 esd->SetOrbitNumber(0);
1505 esd->SetPeriodNumber(0);
1506 esd->SetTimeStamp(0);
1507 esd->SetEventType(0);
1508 const AliRawEventHeaderBase * eventHeader = fRawReader->GetEventHeader();
1511 const UInt_t *id = eventHeader->GetP("Id");
1512 esd->SetBunchCrossNumber((id)[1]&0x00000fff);
1513 esd->SetOrbitNumber((((id)[0]<<20)&0xf00000)|(((id)[1]>>12)&0xfffff));
1514 esd->SetPeriodNumber(((id)[0]>>4)&0x0fffffff);
1516 esd->SetTimeStamp((eventHeader->Get("Timestamp")));
1517 esd->SetEventType((eventHeader->Get("Type")));
1524 //_____________________________________________________________________________
1525 Bool_t AliReconstruction::IsSelected(TString detName, TString& detectors) const
1527 // check whether detName is contained in detectors
1528 // if yes, it is removed from detectors
1530 // check if all detectors are selected
1531 if ((detectors.CompareTo("ALL") == 0) ||
1532 detectors.BeginsWith("ALL ") ||
1533 detectors.EndsWith(" ALL") ||
1534 detectors.Contains(" ALL ")) {
1539 // search for the given detector
1540 Bool_t result = kFALSE;
1541 if ((detectors.CompareTo(detName) == 0) ||
1542 detectors.BeginsWith(detName+" ") ||
1543 detectors.EndsWith(" "+detName) ||
1544 detectors.Contains(" "+detName+" ")) {
1545 detectors.ReplaceAll(detName, "");
1549 // clean up the detectors string
1550 while (detectors.Contains(" ")) detectors.ReplaceAll(" ", " ");
1551 while (detectors.BeginsWith(" ")) detectors.Remove(0, 1);
1552 while (detectors.EndsWith(" ")) detectors.Remove(detectors.Length()-1, 1);
1557 //_____________________________________________________________________________
1558 Bool_t AliReconstruction::InitRunLoader()
1560 // get or create the run loader
1562 if (gAlice) delete gAlice;
1565 if (!gSystem->AccessPathName(fGAliceFileName.Data())) { // galice.root exists
1566 // load all base libraries to get the loader classes
1567 TString libs = gSystem->GetLibraries();
1568 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
1569 TString detName = fgkDetectorName[iDet];
1570 if (detName == "HLT") continue;
1571 if (libs.Contains("lib" + detName + "base.so")) continue;
1572 gSystem->Load("lib" + detName + "base.so");
1574 fRunLoader = AliRunLoader::Open(fGAliceFileName.Data());
1576 AliError(Form("no run loader found in file %s", fGAliceFileName.Data()));
1580 fRunLoader->CdGAFile();
1581 if (gFile->GetKey(AliRunLoader::GetGAliceName())) {
1582 if (fRunLoader->LoadgAlice() == 0) {
1583 gAlice = fRunLoader->GetAliRun();
1584 AliTracker::SetFieldMap(gAlice->Field(),fUniformField);
1587 if (!gAlice && !fRawReader) {
1588 AliError(Form("no gAlice object found in file %s",
1589 fGAliceFileName.Data()));
1594 //PH This is a temporary fix to give access to the kinematics
1595 //PH that is needed for the labels of ITS clusters
1596 fRunLoader->LoadKinematics();
1598 } else { // galice.root does not exist
1600 AliError(Form("the file %s does not exist", fGAliceFileName.Data()));
1604 fRunLoader = AliRunLoader::Open(fGAliceFileName.Data(),
1605 AliConfig::GetDefaultEventFolderName(),
1608 AliError(Form("could not create run loader in file %s",
1609 fGAliceFileName.Data()));
1613 fRunLoader->MakeTree("E");
1615 while (fRawReader->NextEvent()) {
1616 fRunLoader->SetEventNumber(iEvent);
1617 fRunLoader->GetHeader()->Reset(fRawReader->GetRunNumber(),
1619 fRunLoader->MakeTree("H");
1620 fRunLoader->TreeE()->Fill();
1623 fRawReader->RewindEvents();
1624 if (fNumberOfEventsPerFile > 0)
1625 fRunLoader->SetNumberOfEventsPerFile(fNumberOfEventsPerFile);
1627 fRunLoader->SetNumberOfEventsPerFile(iEvent);
1628 fRunLoader->WriteHeader("OVERWRITE");
1629 fRunLoader->CdGAFile();
1630 fRunLoader->Write(0, TObject::kOverwrite);
1631 // AliTracker::SetFieldMap(???);
1637 //_____________________________________________________________________________
1638 AliReconstructor* AliReconstruction::GetReconstructor(Int_t iDet)
1640 // get the reconstructor object and the loader for a detector
1642 if (fReconstructor[iDet]) return fReconstructor[iDet];
1644 // load the reconstructor object
1645 TPluginManager* pluginManager = gROOT->GetPluginManager();
1646 TString detName = fgkDetectorName[iDet];
1647 TString recName = "Ali" + detName + "Reconstructor";
1648 if (gAlice && !gAlice->GetDetector(detName) && (detName != "HLT")) return NULL;
1650 AliReconstructor* reconstructor = NULL;
1651 // first check if a plugin is defined for the reconstructor
1652 TPluginHandler* pluginHandler =
1653 pluginManager->FindHandler("AliReconstructor", detName);
1654 // if not, add a plugin for it
1655 if (!pluginHandler) {
1656 AliDebug(1, Form("defining plugin for %s", recName.Data()));
1657 TString libs = gSystem->GetLibraries();
1658 if (libs.Contains("lib" + detName + "base.so") ||
1659 (gSystem->Load("lib" + detName + "base.so") >= 0)) {
1660 pluginManager->AddHandler("AliReconstructor", detName,
1661 recName, detName + "rec", recName + "()");
1663 pluginManager->AddHandler("AliReconstructor", detName,
1664 recName, detName, recName + "()");
1666 pluginHandler = pluginManager->FindHandler("AliReconstructor", detName);
1668 if (pluginHandler && (pluginHandler->LoadPlugin() == 0)) {
1669 reconstructor = (AliReconstructor*) pluginHandler->ExecPlugin(0);
1671 if (reconstructor) {
1672 TObject* obj = fOptions.FindObject(detName.Data());
1673 if (obj) reconstructor->SetOption(obj->GetTitle());
1674 reconstructor->Init();
1675 fReconstructor[iDet] = reconstructor;
1678 // get or create the loader
1679 if (detName != "HLT") {
1680 fLoader[iDet] = fRunLoader->GetLoader(detName + "Loader");
1681 if (!fLoader[iDet]) {
1682 AliConfig::Instance()
1683 ->CreateDetectorFolders(fRunLoader->GetEventFolder(),
1685 // first check if a plugin is defined for the loader
1687 pluginManager->FindHandler("AliLoader", detName);
1688 // if not, add a plugin for it
1689 if (!pluginHandler) {
1690 TString loaderName = "Ali" + detName + "Loader";
1691 AliDebug(1, Form("defining plugin for %s", loaderName.Data()));
1692 pluginManager->AddHandler("AliLoader", detName,
1693 loaderName, detName + "base",
1694 loaderName + "(const char*, TFolder*)");
1695 pluginHandler = pluginManager->FindHandler("AliLoader", detName);
1697 if (pluginHandler && (pluginHandler->LoadPlugin() == 0)) {
1699 (AliLoader*) pluginHandler->ExecPlugin(2, detName.Data(),
1700 fRunLoader->GetEventFolder());
1702 if (!fLoader[iDet]) { // use default loader
1703 fLoader[iDet] = new AliLoader(detName, fRunLoader->GetEventFolder());
1705 if (!fLoader[iDet]) {
1706 AliWarning(Form("couldn't get loader for %s", detName.Data()));
1707 if (fStopOnError) return NULL;
1709 fRunLoader->AddLoader(fLoader[iDet]);
1710 fRunLoader->CdGAFile();
1711 if (gFile && !gFile->IsWritable()) gFile->ReOpen("UPDATE");
1712 fRunLoader->Write(0, TObject::kOverwrite);
1717 return reconstructor;
1720 //_____________________________________________________________________________
1721 Bool_t AliReconstruction::CreateVertexer()
1723 // create the vertexer
1726 AliReconstructor* itsReconstructor = GetReconstructor(0);
1727 if (itsReconstructor) {
1728 fVertexer = itsReconstructor->CreateVertexer();
1731 AliWarning("couldn't create a vertexer for ITS");
1732 if (fStopOnError) return kFALSE;
1738 //_____________________________________________________________________________
1739 Bool_t AliReconstruction::CreateTrackers(const TString& detectors)
1741 // create the trackers
1743 TString detStr = detectors;
1744 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
1745 if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
1746 AliReconstructor* reconstructor = GetReconstructor(iDet);
1747 if (!reconstructor) continue;
1748 TString detName = fgkDetectorName[iDet];
1749 if (detName == "HLT") {
1750 fRunHLTTracking = kTRUE;
1753 if (detName == "MUON") {
1754 fRunMuonTracking = kTRUE;
1759 fTracker[iDet] = reconstructor->CreateTracker();
1760 if (!fTracker[iDet] && (iDet < 7)) {
1761 AliWarning(Form("couldn't create a tracker for %s", detName.Data()));
1762 if (fStopOnError) return kFALSE;
1769 //_____________________________________________________________________________
1770 void AliReconstruction::CleanUp(TFile* file, TFile* fileOld)
1772 // delete trackers and the run loader and close and delete the file
1774 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
1775 delete fReconstructor[iDet];
1776 fReconstructor[iDet] = NULL;
1777 fLoader[iDet] = NULL;
1778 delete fTracker[iDet];
1779 fTracker[iDet] = NULL;
1780 delete fQualAssDataMaker[iDet];
1781 fQualAssDataMaker[iDet] = NULL;
1785 delete fDiamondProfile;
1786 fDiamondProfile = NULL;
1801 gSystem->Unlink("AliESDs.old.root");
1805 //_____________________________________________________________________________
1807 Bool_t AliReconstruction::ReadESD(AliESDEvent*& esd, const char* recStep) const
1809 // read the ESD event from a file
1811 if (!esd) return kFALSE;
1813 sprintf(fileName, "ESD_%d.%d_%s.root",
1814 esd->GetRunNumber(), esd->GetEventNumberInFile(), recStep);
1815 if (gSystem->AccessPathName(fileName)) return kFALSE;
1817 AliInfo(Form("reading ESD from file %s", fileName));
1818 AliDebug(1, Form("reading ESD from file %s", fileName));
1819 TFile* file = TFile::Open(fileName);
1820 if (!file || !file->IsOpen()) {
1821 AliError(Form("opening %s failed", fileName));
1828 esd = (AliESDEvent*) file->Get("ESD");
1837 //_____________________________________________________________________________
1838 void AliReconstruction::WriteESD(AliESDEvent* esd, const char* recStep) const
1840 // write the ESD event to a file
1844 sprintf(fileName, "ESD_%d.%d_%s.root",
1845 esd->GetRunNumber(), esd->GetEventNumberInFile(), recStep);
1847 AliDebug(1, Form("writing ESD to file %s", fileName));
1848 TFile* file = TFile::Open(fileName, "recreate");
1849 if (!file || !file->IsOpen()) {
1850 AliError(Form("opening %s failed", fileName));
1862 //_____________________________________________________________________________
1863 void AliReconstruction::ESDFile2AODFile(TFile* esdFile, TFile* aodFile)
1865 // write all files from the given esd file to an aod file
1867 // create an AliAOD object
1868 AliAODEvent *aod = new AliAODEvent();
1869 aod->CreateStdContent();
1875 TTree *aodTree = new TTree("aodTree", "AliAOD tree");
1876 aodTree->Branch(aod->GetList());
1879 TTree *t = (TTree*) esdFile->Get("esdTree");
1880 AliESDEvent *esd = new AliESDEvent();
1881 esd->ReadFromTree(t);
1883 Int_t nEvents = t->GetEntries();
1885 // set arrays and pointers
1893 // loop over events and fill them
1894 for (Int_t iEvent = 0; iEvent < nEvents; ++iEvent) {
1895 t->GetEntry(iEvent);
1897 // Multiplicity information needed by the header (to be revised!)
1898 Int_t nTracks = esd->GetNumberOfTracks();
1899 Int_t nPosTracks = 0;
1900 for (Int_t iTrack=0; iTrack<nTracks; ++iTrack)
1901 if (esd->GetTrack(iTrack)->Charge()> 0) nPosTracks++;
1903 // Access the header
1904 AliAODHeader *header = aod->GetHeader();
1907 header->SetRunNumber (esd->GetRunNumber() );
1908 header->SetBunchCrossNumber(esd->GetBunchCrossNumber());
1909 header->SetOrbitNumber (esd->GetOrbitNumber() );
1910 header->SetPeriodNumber (esd->GetPeriodNumber() );
1911 header->SetTriggerMask (esd->GetTriggerMask() );
1912 header->SetTriggerCluster (esd->GetTriggerCluster() );
1913 header->SetEventType (esd->GetEventType() );
1914 header->SetMagneticField (esd->GetMagneticField() );
1915 header->SetZDCN1Energy (esd->GetZDCN1Energy() );
1916 header->SetZDCP1Energy (esd->GetZDCP1Energy() );
1917 header->SetZDCN2Energy (esd->GetZDCN2Energy() );
1918 header->SetZDCP2Energy (esd->GetZDCP2Energy() );
1919 header->SetZDCEMEnergy (esd->GetZDCEMEnergy() );
1920 header->SetRefMultiplicity (nTracks);
1921 header->SetRefMultiplicityPos(nPosTracks);
1922 header->SetRefMultiplicityNeg(nTracks - nPosTracks);
1923 header->SetMuonMagFieldScale(-999.); // FIXME
1924 header->SetCentrality(-999.); // FIXME
1926 Int_t nV0s = esd->GetNumberOfV0s();
1927 Int_t nCascades = esd->GetNumberOfCascades();
1928 Int_t nKinks = esd->GetNumberOfKinks();
1929 Int_t nVertices = nV0s + nCascades + nKinks;
1931 aod->ResetStd(nTracks, nVertices);
1932 AliAODTrack *aodTrack;
1934 // Array to take into account the tracks already added to the AOD
1935 Bool_t * usedTrack = NULL;
1937 usedTrack = new Bool_t[nTracks];
1938 for (Int_t iTrack=0; iTrack<nTracks; ++iTrack) usedTrack[iTrack]=kFALSE;
1940 // Array to take into account the V0s already added to the AOD
1941 Bool_t * usedV0 = NULL;
1943 usedV0 = new Bool_t[nV0s];
1944 for (Int_t iV0=0; iV0<nV0s; ++iV0) usedV0[iV0]=kFALSE;
1946 // Array to take into account the kinks already added to the AOD
1947 Bool_t * usedKink = NULL;
1949 usedKink = new Bool_t[nKinks];
1950 for (Int_t iKink=0; iKink<nKinks; ++iKink) usedKink[iKink]=kFALSE;
1953 // Access to the AOD container of vertices
1954 TClonesArray &vertices = *(aod->GetVertices());
1957 // Access to the AOD container of tracks
1958 TClonesArray &tracks = *(aod->GetTracks());
1961 // Add primary vertex. The primary tracks will be defined
1962 // after the loops on the composite objects (V0, cascades, kinks)
1963 const AliESDVertex *vtx = esd->GetPrimaryVertex();
1965 vtx->GetXYZ(pos); // position
1966 vtx->GetCovMatrix(covVtx); //covariance matrix
1968 AliAODVertex * primary = new(vertices[jVertices++])
1969 AliAODVertex(pos, covVtx, vtx->GetChi2toNDF(), NULL, -1, AliAODVertex::kPrimary);
1971 // Create vertices starting from the most complex objects
1974 for (Int_t nCascade = 0; nCascade < nCascades; ++nCascade) {
1975 AliESDcascade *cascade = esd->GetCascade(nCascade);
1977 cascade->GetXYZcascade(pos[0], pos[1], pos[2]); // Bo: bug correction
1978 cascade->GetPosCovXi(covVtx);
1980 // Add the cascade vertex
1981 AliAODVertex * vcascade = new(vertices[jVertices++]) AliAODVertex(pos,
1983 cascade->GetChi2Xi(), // = chi2/NDF since NDF = 2*2-3
1986 AliAODVertex::kCascade);
1988 primary->AddDaughter(vcascade);
1990 // Add the V0 from the cascade. The ESD class have to be optimized...
1991 // Now we have to search for the corresponding V0 in the list of V0s
1992 // using the indeces of the positive and negative tracks
1994 Int_t posFromV0 = cascade->GetPindex();
1995 Int_t negFromV0 = cascade->GetNindex();
1997 AliESDv0 * v0 = 0x0;
2000 for (Int_t iV0=0; iV0<nV0s; ++iV0) {
2002 v0 = esd->GetV0(iV0);
2003 Int_t posV0 = v0->GetPindex();
2004 Int_t negV0 = v0->GetNindex();
2006 if (posV0==posFromV0 && negV0==negFromV0) {
2012 AliAODVertex * vV0FromCascade = 0x0;
2014 if (indV0>-1 && !usedV0[indV0] ) {
2016 // the V0 exists in the array of V0s and is not used
2018 usedV0[indV0] = kTRUE;
2020 v0->GetXYZ(pos[0], pos[1], pos[2]);
2021 v0->GetPosCov(covVtx);
2023 vV0FromCascade = new(vertices[jVertices++]) AliAODVertex(pos,
2025 v0->GetChi2V0(), // = chi2/NDF since NDF = 2*2-3
2031 // the V0 doesn't exist in the array of V0s or was used
2032 cerr << "Error: event " << iEvent << " cascade " << nCascade
2033 << " The V0 " << indV0
2034 << " doesn't exist in the array of V0s or was used!" << endl;
2036 cascade->GetXYZ(pos[0], pos[1], pos[2]);
2037 cascade->GetPosCov(covVtx);
2039 vV0FromCascade = new(vertices[jVertices++]) AliAODVertex(pos,
2041 v0->GetChi2V0(), // = chi2/NDF since NDF = 2*2-3
2045 vcascade->AddDaughter(vV0FromCascade);
2048 // Add the positive tracks from the V0
2050 if (! usedTrack[posFromV0]) {
2052 usedTrack[posFromV0] = kTRUE;
2054 AliESDtrack *esdTrack = esd->GetTrack(posFromV0);
2055 esdTrack->GetPxPyPz(p);
2056 esdTrack->GetXYZ(pos);
2057 esdTrack->GetCovarianceXYZPxPyPz(covTr);
2058 esdTrack->GetESDpid(pid);
2060 vV0FromCascade->AddDaughter(aodTrack =
2061 new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
2062 esdTrack->GetLabel(),
2068 (Short_t)esdTrack->Charge(),
2069 esdTrack->GetITSClusterMap(),
2072 kTRUE, // check if this is right
2073 kFALSE, // check if this is right
2074 AliAODTrack::kSecondary)
2076 aodTrack->ConvertAliPIDtoAODPID();
2079 cerr << "Error: event " << iEvent << " cascade " << nCascade
2080 << " track " << posFromV0 << " has already been used!" << endl;
2083 // Add the negative tracks from the V0
2085 if (!usedTrack[negFromV0]) {
2087 usedTrack[negFromV0] = kTRUE;
2089 AliESDtrack *esdTrack = esd->GetTrack(negFromV0);
2090 esdTrack->GetPxPyPz(p);
2091 esdTrack->GetXYZ(pos);
2092 esdTrack->GetCovarianceXYZPxPyPz(covTr);
2093 esdTrack->GetESDpid(pid);
2095 vV0FromCascade->AddDaughter(aodTrack =
2096 new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
2097 esdTrack->GetLabel(),
2103 (Short_t)esdTrack->Charge(),
2104 esdTrack->GetITSClusterMap(),
2107 kTRUE, // check if this is right
2108 kFALSE, // check if this is right
2109 AliAODTrack::kSecondary)
2111 aodTrack->ConvertAliPIDtoAODPID();
2114 cerr << "Error: event " << iEvent << " cascade " << nCascade
2115 << " track " << negFromV0 << " has already been used!" << endl;
2118 // Add the bachelor track from the cascade
2120 Int_t bachelor = cascade->GetBindex();
2122 if(!usedTrack[bachelor]) {
2124 usedTrack[bachelor] = kTRUE;
2126 AliESDtrack *esdTrack = esd->GetTrack(bachelor);
2127 esdTrack->GetPxPyPz(p);
2128 esdTrack->GetXYZ(pos);
2129 esdTrack->GetCovarianceXYZPxPyPz(covTr);
2130 esdTrack->GetESDpid(pid);
2132 vcascade->AddDaughter(aodTrack =
2133 new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
2134 esdTrack->GetLabel(),
2140 (Short_t)esdTrack->Charge(),
2141 esdTrack->GetITSClusterMap(),
2144 kTRUE, // check if this is right
2145 kFALSE, // check if this is right
2146 AliAODTrack::kSecondary)
2148 aodTrack->ConvertAliPIDtoAODPID();
2151 cerr << "Error: event " << iEvent << " cascade " << nCascade
2152 << " track " << bachelor << " has already been used!" << endl;
2155 // Add the primary track of the cascade (if any)
2157 } // end of the loop on cascades
2161 for (Int_t nV0 = 0; nV0 < nV0s; ++nV0) {
2163 if (usedV0[nV0]) continue; // skip if aready added to the AOD
2165 AliESDv0 *v0 = esd->GetV0(nV0);
2167 v0->GetXYZ(pos[0], pos[1], pos[2]);
2168 v0->GetPosCov(covVtx);
2170 AliAODVertex * vV0 =
2171 new(vertices[jVertices++]) AliAODVertex(pos,
2173 v0->GetChi2V0(), // = chi2/NDF since NDF = 2*2-3
2177 primary->AddDaughter(vV0);
2179 Int_t posFromV0 = v0->GetPindex();
2180 Int_t negFromV0 = v0->GetNindex();
2182 // Add the positive tracks from the V0
2184 if (!usedTrack[posFromV0]) {
2186 usedTrack[posFromV0] = kTRUE;
2188 AliESDtrack *esdTrack = esd->GetTrack(posFromV0);
2189 esdTrack->GetPxPyPz(p);
2190 esdTrack->GetXYZ(pos);
2191 esdTrack->GetCovarianceXYZPxPyPz(covTr);
2192 esdTrack->GetESDpid(pid);
2194 vV0->AddDaughter(aodTrack =
2195 new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
2196 esdTrack->GetLabel(),
2202 (Short_t)esdTrack->Charge(),
2203 esdTrack->GetITSClusterMap(),
2206 kTRUE, // check if this is right
2207 kFALSE, // check if this is right
2208 AliAODTrack::kSecondary)
2210 aodTrack->ConvertAliPIDtoAODPID();
2213 cerr << "Error: event " << iEvent << " V0 " << nV0
2214 << " track " << posFromV0 << " has already been used!" << endl;
2217 // Add the negative tracks from the V0
2219 if (!usedTrack[negFromV0]) {
2221 usedTrack[negFromV0] = kTRUE;
2223 AliESDtrack *esdTrack = esd->GetTrack(negFromV0);
2224 esdTrack->GetPxPyPz(p);
2225 esdTrack->GetXYZ(pos);
2226 esdTrack->GetCovarianceXYZPxPyPz(covTr);
2227 esdTrack->GetESDpid(pid);
2229 vV0->AddDaughter(aodTrack =
2230 new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
2231 esdTrack->GetLabel(),
2237 (Short_t)esdTrack->Charge(),
2238 esdTrack->GetITSClusterMap(),
2241 kTRUE, // check if this is right
2242 kFALSE, // check if this is right
2243 AliAODTrack::kSecondary)
2245 aodTrack->ConvertAliPIDtoAODPID();
2248 cerr << "Error: event " << iEvent << " V0 " << nV0
2249 << " track " << negFromV0 << " has already been used!" << endl;
2252 } // end of the loop on V0s
2254 // Kinks: it is a big mess the access to the information in the kinks
2255 // The loop is on the tracks in order to find the mother and daugther of each kink
2258 for (Int_t iTrack=0; iTrack<nTracks; ++iTrack) {
2261 AliESDtrack * esdTrack = esd->GetTrack(iTrack);
2263 Int_t ikink = esdTrack->GetKinkIndex(0);
2266 // Negative kink index: mother, positive: daughter
2268 // Search for the second track of the kink
2270 for (Int_t jTrack = iTrack+1; jTrack<nTracks; ++jTrack) {
2272 AliESDtrack * esdTrack1 = esd->GetTrack(jTrack);
2274 Int_t jkink = esdTrack1->GetKinkIndex(0);
2276 if ( TMath::Abs(ikink)==TMath::Abs(jkink) ) {
2278 // The two tracks are from the same kink
2280 if (usedKink[TMath::Abs(ikink)-1]) continue; // skip used kinks
2283 Int_t idaughter = -1;
2285 if (ikink<0 && jkink>0) {
2290 else if (ikink>0 && jkink<0) {
2296 cerr << "Error: Wrong combination of kink indexes: "
2297 << ikink << " " << jkink << endl;
2301 // Add the mother track
2303 AliAODTrack * mother = NULL;
2305 if (!usedTrack[imother]) {
2307 usedTrack[imother] = kTRUE;
2309 AliESDtrack *esdTrack = esd->GetTrack(imother);
2310 esdTrack->GetPxPyPz(p);
2311 esdTrack->GetXYZ(pos);
2312 esdTrack->GetCovarianceXYZPxPyPz(covTr);
2313 esdTrack->GetESDpid(pid);
2316 new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
2317 esdTrack->GetLabel(),
2323 (Short_t)esdTrack->Charge(),
2324 esdTrack->GetITSClusterMap(),
2327 kTRUE, // check if this is right
2328 kTRUE, // check if this is right
2329 AliAODTrack::kPrimary);
2330 primary->AddDaughter(mother);
2331 mother->ConvertAliPIDtoAODPID();
2334 cerr << "Error: event " << iEvent << " kink " << TMath::Abs(ikink)-1
2335 << " track " << imother << " has already been used!" << endl;
2338 // Add the kink vertex
2339 AliESDkink * kink = esd->GetKink(TMath::Abs(ikink)-1);
2341 AliAODVertex * vkink =
2342 new(vertices[jVertices++]) AliAODVertex(kink->GetPosition(),
2346 esdTrack->GetID(), // This is the track ID of the mother's track!
2347 AliAODVertex::kKink);
2348 // Add the daughter track
2350 AliAODTrack * daughter = NULL;
2352 if (!usedTrack[idaughter]) {
2354 usedTrack[idaughter] = kTRUE;
2356 AliESDtrack *esdTrack = esd->GetTrack(idaughter);
2357 esdTrack->GetPxPyPz(p);
2358 esdTrack->GetXYZ(pos);
2359 esdTrack->GetCovarianceXYZPxPyPz(covTr);
2360 esdTrack->GetESDpid(pid);
2363 new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
2364 esdTrack->GetLabel(),
2370 (Short_t)esdTrack->Charge(),
2371 esdTrack->GetITSClusterMap(),
2374 kTRUE, // check if this is right
2375 kTRUE, // check if this is right
2376 AliAODTrack::kPrimary);
2377 vkink->AddDaughter(daughter);
2378 daughter->ConvertAliPIDtoAODPID();
2381 cerr << "Error: event " << iEvent << " kink " << TMath::Abs(ikink)-1
2382 << " track " << idaughter << " has already been used!" << endl;
2394 // Tracks (primary and orphan)
2396 for (Int_t nTrack = 0; nTrack < nTracks; ++nTrack) {
2399 if (usedTrack[nTrack]) continue;
2401 AliESDtrack *esdTrack = esd->GetTrack(nTrack);
2402 esdTrack->GetPxPyPz(p);
2403 esdTrack->GetXYZ(pos);
2404 esdTrack->GetCovarianceXYZPxPyPz(covTr);
2405 esdTrack->GetESDpid(pid);
2407 Float_t impactXY, impactZ;
2409 esdTrack->GetImpactParameters(impactXY,impactZ);
2412 // track inside the beam pipe
2414 primary->AddDaughter(aodTrack =
2415 new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
2416 esdTrack->GetLabel(),
2422 (Short_t)esdTrack->Charge(),
2423 esdTrack->GetITSClusterMap(),
2426 kTRUE, // check if this is right
2427 kTRUE, // check if this is right
2428 AliAODTrack::kPrimary)
2430 aodTrack->ConvertAliPIDtoAODPID();
2433 // outside the beam pipe: orphan track
2435 new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
2436 esdTrack->GetLabel(),
2442 (Short_t)esdTrack->Charge(),
2443 esdTrack->GetITSClusterMap(),
2446 kFALSE, // check if this is right
2447 kFALSE, // check if this is right
2448 AliAODTrack::kOrphan);
2449 aodTrack->ConvertAliPIDtoAODPID();
2451 } // end of loop on tracks
2454 Int_t nMuTracks = esd->GetNumberOfMuonTracks();
2455 for (Int_t nMuTrack = 0; nMuTrack < nMuTracks; ++nMuTrack) {
2457 AliESDMuonTrack *esdMuTrack = esd->GetMuonTrack(nMuTrack);
2458 p[0] = esdMuTrack->Px();
2459 p[1] = esdMuTrack->Py();
2460 p[2] = esdMuTrack->Pz();
2461 pos[0] = primary->GetX();
2462 pos[1] = primary->GetY();
2463 pos[2] = primary->GetZ();
2465 // has to be changed once the muon pid is provided by the ESD
2466 for (Int_t i = 0; i < 10; pid[i++] = 0.); pid[AliAODTrack::kMuon]=1.;
2468 primary->AddDaughter(aodTrack =
2469 new(tracks[jTracks++]) AliAODTrack(0, // no ID provided
2470 0, // no label provided
2475 NULL, // no covariance matrix provided
2476 esdMuTrack->Charge(),
2477 0, // ITSClusterMap is set below
2480 kFALSE, // muon tracks are not used to fit the primary vtx
2481 kFALSE, // not used for vertex fit
2482 AliAODTrack::kPrimary)
2485 aodTrack->SetHitsPatternInTrigCh(esdMuTrack->GetHitsPatternInTrigCh());
2486 Int_t track2Trigger = esdMuTrack->GetMatchTrigger();
2487 aodTrack->SetMatchTrigger(track2Trigger);
2489 aodTrack->SetChi2MatchTrigger(esdMuTrack->GetChi2MatchTrigger());
2491 aodTrack->SetChi2MatchTrigger(0.);
2494 // Access to the AOD container of clusters
2495 TClonesArray &clusters = *(aod->GetClusters());
2499 Int_t nClusters = esd->GetNumberOfCaloClusters();
2501 for (Int_t iClust=0; iClust<nClusters; ++iClust) {
2503 AliESDCaloCluster * cluster = esd->GetCaloCluster(iClust);
2505 Int_t id = cluster->GetID();
2507 Float_t energy = cluster->E();
2508 cluster->GetPosition(posF);
2509 AliAODVertex *prodVertex = primary;
2510 AliAODTrack *primTrack = NULL;
2511 Char_t ttype=AliAODCluster::kUndef;
2513 if (cluster->GetClusterType() == AliESDCaloCluster::kPHOSCluster){
2514 ttype = AliAODCluster::kPHOSNeutral;
2516 else if (cluster->GetClusterType() == AliESDCaloCluster::kEMCALClusterv1){
2517 ttype = AliAODCluster::kEMCALClusterv1;
2519 else if (cluster->GetClusterType() == AliESDCaloCluster::kEMCALPseudoCluster){
2520 ttype = AliAODCluster::kEMCALPseudoCluster;
2523 new(clusters[jClusters++]) AliAODCluster(id,
2527 NULL, // no covariance matrix provided
2528 NULL, // no pid for clusters provided
2533 } // end of loop on calo clusters
2536 const AliMultiplicity *mult = esd->GetMultiplicity();
2538 if (mult->GetNumberOfTracklets()>0) {
2539 aod->GetTracklets()->CreateContainer(mult->GetNumberOfTracklets());
2541 for (Int_t n=0; n<mult->GetNumberOfTracklets(); n++) {
2542 aod->GetTracklets()->SetTracklet(n, mult->GetTheta(n), mult->GetPhi(n), mult->GetDeltaPhi(n), mult->GetLabel(n));
2546 Printf("ERROR: AliMultiplicity could not be retrieved from ESD");
2549 delete [] usedTrack;
2553 // fill the tree for this event
2555 } // end of event loop
2557 aodTree->GetUserInfo()->Add(aod);
2562 // write the tree to the specified file
2563 aodFile = aodTree->GetCurrentFile();
2570 void AliReconstruction::WriteAlignmentData(AliESDEvent* esd)
2572 // Write space-points which are then used in the alignment procedures
2573 // For the moment only ITS, TRD and TPC
2575 // Load TOF clusters
2577 fLoader[3]->LoadRecPoints("read");
2578 TTree* tree = fLoader[3]->TreeR();
2580 AliError(Form("Can't get the %s cluster tree", fgkDetectorName[3]));
2583 fTracker[3]->LoadClusters(tree);
2585 Int_t ntracks = esd->GetNumberOfTracks();
2586 for (Int_t itrack = 0; itrack < ntracks; itrack++)
2588 AliESDtrack *track = esd->GetTrack(itrack);
2591 for (Int_t iDet = 3; iDet >= 0; iDet--)
2592 nsp += track->GetNcls(iDet);
2594 AliTrackPointArray *sp = new AliTrackPointArray(nsp);
2595 track->SetTrackPointArray(sp);
2597 for (Int_t iDet = 3; iDet >= 0; iDet--) {
2598 AliTracker *tracker = fTracker[iDet];
2599 if (!tracker) continue;
2600 Int_t nspdet = track->GetNcls(iDet);
2601 if (nspdet <= 0) continue;
2602 track->GetClusters(iDet,idx);
2606 while (isp < nspdet) {
2608 if(IsSelected(fgkDetectorName[iDet],fUseTrackingErrorsForAlignment)) {
2609 isvalid = tracker->GetTrackPointTrackingError(idx[isp2],p,track);
2611 isvalid = tracker->GetTrackPoint(idx[isp2],p);
2614 const Int_t kNTPCmax = 159;
2615 if (iDet==1 && isp2>kNTPCmax) break; // to be fixed
2616 if (!isvalid) continue;
2617 sp->AddPoint(isptrack,&p); isptrack++; isp++;
2623 fTracker[3]->UnloadClusters();
2624 fLoader[3]->UnloadRecPoints();
2628 //_____________________________________________________________________________
2629 void AliReconstruction::FillRawDataErrorLog(Int_t iEvent, AliESDEvent* esd)
2631 // The method reads the raw-data error log
2632 // accumulated within the rawReader.
2633 // It extracts the raw-data errors related to
2634 // the current event and stores them into
2635 // a TClonesArray inside the esd object.
2637 if (!fRawReader) return;
2639 for(Int_t i = 0; i < fRawReader->GetNumberOfErrorLogs(); i++) {
2641 AliRawDataErrorLog *log = fRawReader->GetErrorLog(i);
2643 if (iEvent != log->GetEventNumber()) continue;
2645 esd->AddRawDataErrorLog(log);
2650 TNamed* AliReconstruction::CopyFileToTNamed(TString fPath,TString fName){
2651 // Dump a file content into a char in TNamed
2653 in.open(fPath.Data(),ios::in | ios::binary|ios::ate);
2654 Int_t kBytes = (Int_t)in.tellg();
2655 printf("Size: %d \n",kBytes);
2658 char* memblock = new char [kBytes];
2659 in.seekg (0, ios::beg);
2660 in.read (memblock, kBytes);
2662 TString fData(memblock,kBytes);
2663 fn = new TNamed(fName,fData);
2664 printf("fData Size: %d \n",fData.Sizeof());
2665 printf("fName Size: %d \n",fName.Sizeof());
2666 printf("fn Size: %d \n",fn->Sizeof());
2670 AliInfo(Form("Could not Open %s\n",fPath.Data()));
2676 void AliReconstruction::TNamedToFile(TTree* fTree, TString fName){
2677 // This is not really needed in AliReconstruction at the moment
2678 // but can serve as a template
2680 TList *fList = fTree->GetUserInfo();
2681 TNamed *fn = (TNamed*)fList->FindObject(fName.Data());
2682 printf("fn Size: %d \n",fn->Sizeof());
2684 TString fTmp(fn->GetName()); // to be 100% sure in principle fName also works
2685 const char* cdata = fn->GetTitle();
2686 printf("fTmp Size %d\n",fTmp.Sizeof());
2688 int size = fn->Sizeof()-fTmp.Sizeof()-sizeof(UChar_t)-sizeof(Int_t); // see dfinition of TString::SizeOf()...
2689 printf("calculated size %d\n",size);
2690 ofstream out(fName.Data(),ios::out | ios::binary);
2691 out.write(cdata,size);
2696 //_____________________________________________________________________________
2697 AliQualAssDataMaker * AliReconstruction::GetQualAssDataMaker(Int_t iDet)
2699 // get the quality assurance data maker object and the loader for a detector
2701 if (fQualAssDataMaker[iDet])
2702 return fQualAssDataMaker[iDet];
2704 // load the QA data maker object
2705 TPluginManager* pluginManager = gROOT->GetPluginManager();
2706 TString detName = fgkDetectorName[iDet];
2707 TString qadmName = "Ali" + detName + "QualAssDataMaker";
2708 if (gAlice && !gAlice->GetDetector(detName) && (detName != "HLT"))
2711 AliQualAssDataMaker * qadm = NULL;
2712 // first check if a plugin is defined for the quality assurance data maker
2713 TPluginHandler* pluginHandler = pluginManager->FindHandler("AliQualAssDataMaker", detName);
2714 // if not, add a plugin for it
2715 if (!pluginHandler) {
2716 AliDebug(1, Form("defining plugin for %s", qadmName.Data()));
2717 TString libs = gSystem->GetLibraries();
2718 if (libs.Contains("lib" + detName + "base.so") ||
2719 (gSystem->Load("lib" + detName + "base.so") >= 0)) {
2720 pluginManager->AddHandler("AliQualAssDataMaker", detName,
2721 qadmName, detName + "qadm", qadmName + "()");
2723 pluginManager->AddHandler("AliQualAssDataMaker", detName,
2724 qadmName, detName, qadmName + "()");
2726 pluginHandler = pluginManager->FindHandler("AliQualAssDataMaker", detName);
2728 if (pluginHandler && (pluginHandler->LoadPlugin() == 0)) {
2729 qadm = (AliQualAssDataMaker *) pluginHandler->ExecPlugin(0);
2732 AliInfo(Form("Initializing quality assurance data maker for %s", fgkDetectorName[iDet]));
2733 qadm->Init(AliQualAss::kRECPOINTS, fRunLoader->GetHeader()->GetRun(), GetQACycles(fgkDetectorName[iDet]));
2734 qadm->Init(AliQualAss::kESDS, fRunLoader->GetHeader()->GetRun(), GetQACycles(fgkDetectorName[iDet]));
2735 qadm->StartOfCycle(AliQualAss::kRECPOINTS);
2736 qadm->StartOfCycle(AliQualAss::kESDS, "same") ;
2737 fQualAssDataMaker[iDet] = qadm;
2743 //_____________________________________________________________________________
2744 Bool_t AliReconstruction::RunQualAss(const char* detectors, AliESDEvent *& esd)
2746 // run the Quality Assurance data producer
2748 AliCodeTimerAuto("")
2749 TString detStr = detectors;
2750 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
2751 if (!IsSelected(fgkDetectorName[iDet], detStr))
2753 AliQualAssDataMaker * qadm = GetQualAssDataMaker(iDet);
2756 AliCodeTimerStart(Form("running quality assurance data maker for %s", fgkDetectorName[iDet]));
2757 AliInfo(Form("running quality assurance data maker for %s", fgkDetectorName[iDet]));
2759 qadm->Exec(AliQualAss::kESDS, esd) ;
2762 AliCodeTimerStop(Form("running quality assurance data maker for %s", fgkDetectorName[iDet]));
2764 if ((detStr.CompareTo("ALL") != 0) && !detStr.IsNull()) {
2765 AliError(Form("the following detectors were not found: %s",
2776 //_____________________________________________________________________________
2777 Int_t AliReconstruction::GetDetIndex(const char* detector)
2779 // return the detector index corresponding to detector
2781 for (index = 0; index < fgkNDetectors ; index++) {
2782 if ( strcmp(detector, fgkDetectorName[index]) == 0 )