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 // The input data of a detector can be replaced by the corresponding HLT //
105 // data by calling (usual detector string) //
106 // SetUseHLTData("..."); //
108 // For debug purposes the method SetCheckPointLevel can be used. If the //
109 // argument is greater than 0, files with ESD events will be written after //
110 // selected steps of the reconstruction for each event: //
111 // level 1: after tracking and after filling of ESD (final) //
112 // level 2: in addition after each tracking step //
113 // level 3: in addition after the filling of ESD for each detector //
114 // If a final check point file exists for an event, this event will be //
115 // skipped in the reconstruction. The tracking and the filling of ESD for //
116 // a detector will be skipped as well, if the corresponding check point //
117 // file exists. The ESD event will then be loaded from the file instead. //
119 ///////////////////////////////////////////////////////////////////////////////
126 #include <TPluginManager.h>
127 #include <TGeoManager.h>
128 #include <TLorentzVector.h>
131 #include <TObjArray.h>
133 #include "AliReconstruction.h"
134 #include "AliCodeTimer.h"
135 #include "AliReconstructor.h"
137 #include "AliRunLoader.h"
139 #include "AliRawReaderFile.h"
140 #include "AliRawReaderDate.h"
141 #include "AliRawReaderRoot.h"
142 #include "AliRawEventHeaderBase.h"
143 #include "AliESDEvent.h"
144 #include "AliESDMuonTrack.h"
145 #include "AliESDfriend.h"
146 #include "AliESDVertex.h"
147 #include "AliESDcascade.h"
148 #include "AliESDkink.h"
149 #include "AliESDtrack.h"
150 #include "AliESDCaloCluster.h"
151 #include "AliESDCaloCells.h"
152 #include "AliMultiplicity.h"
153 #include "AliTracker.h"
154 #include "AliVertexer.h"
155 #include "AliVertexerTracks.h"
156 #include "AliV0vertexer.h"
157 #include "AliCascadeVertexer.h"
158 #include "AliHeader.h"
159 #include "AliGenEventHeader.h"
161 #include "AliESDpid.h"
162 #include "AliESDtrack.h"
163 #include "AliESDPmdTrack.h"
165 #include "AliESDTagCreator.h"
166 #include "AliAODTagCreator.h"
168 #include "AliGeomManager.h"
169 #include "AliTrackPointArray.h"
170 #include "AliCDBManager.h"
171 #include "AliCDBStorage.h"
172 #include "AliCDBEntry.h"
173 #include "AliAlignObj.h"
175 #include "AliCentralTrigger.h"
176 #include "AliTriggerConfiguration.h"
177 #include "AliTriggerClass.h"
178 #include "AliCTPRawStream.h"
180 #include "AliAODEvent.h"
181 #include "AliAODHeader.h"
182 #include "AliAODTrack.h"
183 #include "AliAODVertex.h"
184 #include "AliAODv0.h"
185 #include "AliAODJet.h"
186 #include "AliAODCaloCells.h"
187 #include "AliAODCaloCluster.h"
188 #include "AliAODPmdCluster.h"
189 #include "AliAODFmdCluster.h"
190 #include "AliAODTracklets.h"
192 #include "AliQADataMakerRec.h"
193 #include "AliGlobalQADataMaker.h"
195 #include "AliQADataMakerSteer.h"
197 #include "AliPlaneEff.h"
199 #include "AliSysInfo.h" // memory snapshots
200 #include "AliRawHLTManager.h"
203 ClassImp(AliReconstruction)
206 //_____________________________________________________________________________
207 const char* AliReconstruction::fgkDetectorName[AliReconstruction::fgkNDetectors] = {"ITS", "TPC", "TRD", "TOF", "PHOS", "HMPID", "EMCAL", "MUON", "FMD", "ZDC", "PMD", "T0", "VZERO", "ACORDE", "HLT"};
209 //_____________________________________________________________________________
210 AliReconstruction::AliReconstruction(const char* gAliceFilename,
211 const char* name, const char* title) :
214 fUniformField(kTRUE),
215 fRunVertexFinder(kTRUE),
216 fRunVertexFinderTracks(kTRUE),
217 fRunHLTTracking(kFALSE),
218 fRunMuonTracking(kFALSE),
220 fRunCascadeFinder(kTRUE),
221 fStopOnError(kFALSE),
222 fWriteAlignmentData(kFALSE),
223 fWriteESDfriend(kFALSE),
225 fFillTriggerESD(kTRUE),
233 fRunLocalReconstruction("ALL"),
236 fUseTrackingErrorsForAlignment(""),
237 fGAliceFileName(gAliceFilename),
242 fNumberOfEventsPerFile(1),
245 fLoadAlignFromCDB(kTRUE),
246 fLoadAlignData("ALL"),
252 fParentRawReader(NULL),
255 fDiamondProfile(NULL),
256 fDiamondProfileTPC(NULL),
257 fMeanVertexConstraint(kTRUE),
261 fAlignObjArray(NULL),
264 fInitCDBCalled(kFALSE),
265 fSetRunNumberFromDataCalled(kFALSE),
272 // create reconstruction object with default parameters
274 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
275 fReconstructor[iDet] = NULL;
276 fLoader[iDet] = NULL;
277 fTracker[iDet] = NULL;
278 fQADataMaker[iDet] = NULL;
279 fQACycles[iDet] = 999999;
281 fQADataMaker[fgkNDetectors]=NULL; //Global QA
285 //_____________________________________________________________________________
286 AliReconstruction::AliReconstruction(const AliReconstruction& rec) :
289 fUniformField(rec.fUniformField),
290 fRunVertexFinder(rec.fRunVertexFinder),
291 fRunVertexFinderTracks(rec.fRunVertexFinderTracks),
292 fRunHLTTracking(rec.fRunHLTTracking),
293 fRunMuonTracking(rec.fRunMuonTracking),
294 fRunV0Finder(rec.fRunV0Finder),
295 fRunCascadeFinder(rec.fRunCascadeFinder),
296 fStopOnError(rec.fStopOnError),
297 fWriteAlignmentData(rec.fWriteAlignmentData),
298 fWriteESDfriend(rec.fWriteESDfriend),
299 fWriteAOD(rec.fWriteAOD),
300 fFillTriggerESD(rec.fFillTriggerESD),
302 fCleanESD(rec.fCleanESD),
303 fV0DCAmax(rec.fV0DCAmax),
304 fV0CsPmin(rec.fV0CsPmin),
308 fRunLocalReconstruction(rec.fRunLocalReconstruction),
309 fRunTracking(rec.fRunTracking),
310 fFillESD(rec.fFillESD),
311 fUseTrackingErrorsForAlignment(rec.fUseTrackingErrorsForAlignment),
312 fGAliceFileName(rec.fGAliceFileName),
314 fEquipIdMap(rec.fEquipIdMap),
315 fFirstEvent(rec.fFirstEvent),
316 fLastEvent(rec.fLastEvent),
317 fNumberOfEventsPerFile(rec.fNumberOfEventsPerFile),
320 fLoadAlignFromCDB(rec.fLoadAlignFromCDB),
321 fLoadAlignData(rec.fLoadAlignData),
322 fESDPar(rec.fESDPar),
323 fUseHLTData(rec.fUseHLTData),
327 fParentRawReader(NULL),
330 fDiamondProfile(NULL),
331 fDiamondProfileTPC(NULL),
332 fMeanVertexConstraint(rec.fMeanVertexConstraint),
336 fAlignObjArray(rec.fAlignObjArray),
337 fCDBUri(rec.fCDBUri),
339 fInitCDBCalled(rec.fInitCDBCalled),
340 fSetRunNumberFromDataCalled(rec.fSetRunNumberFromDataCalled),
342 fRunGlobalQA(rec.fRunGlobalQA),
343 fInLoopQA(rec.fInLoopQA),
344 fRunPlaneEff(rec.fRunPlaneEff)
348 for (Int_t i = 0; i < rec.fOptions.GetEntriesFast(); i++) {
349 if (rec.fOptions[i]) fOptions.Add(rec.fOptions[i]->Clone());
351 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
352 fReconstructor[iDet] = NULL;
353 fLoader[iDet] = NULL;
354 fTracker[iDet] = NULL;
355 fQADataMaker[iDet] = NULL;
356 fQACycles[iDet] = rec.fQACycles[iDet];
358 fQADataMaker[fgkNDetectors]=NULL; //Global QA
359 for (Int_t i = 0; i < rec.fSpecCDBUri.GetEntriesFast(); i++) {
360 if (rec.fSpecCDBUri[i]) fSpecCDBUri.Add(rec.fSpecCDBUri[i]->Clone());
364 //_____________________________________________________________________________
365 AliReconstruction& AliReconstruction::operator = (const AliReconstruction& rec)
367 // assignment operator
369 this->~AliReconstruction();
370 new(this) AliReconstruction(rec);
374 //_____________________________________________________________________________
375 AliReconstruction::~AliReconstruction()
381 fSpecCDBUri.Delete();
383 AliCodeTimer::Instance()->Print();
386 //_____________________________________________________________________________
387 void AliReconstruction::InitCDB()
389 // activate a default CDB storage
390 // First check if we have any CDB storage set, because it is used
391 // to retrieve the calibration and alignment constants
393 if (fInitCDBCalled) return;
394 fInitCDBCalled = kTRUE;
396 AliCDBManager* man = AliCDBManager::Instance();
397 if (man->IsDefaultStorageSet())
399 AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
400 AliWarning("Default CDB storage has been already set !");
401 AliWarning(Form("Ignoring the default storage declared in AliReconstruction: %s",fCDBUri.Data()));
402 AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
403 fCDBUri = man->GetDefaultStorage()->GetURI();
406 if (fCDBUri.Length() > 0)
408 AliDebug(2,"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
409 AliDebug(2, Form("Default CDB storage is set to: %s", fCDBUri.Data()));
410 AliDebug(2, "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
412 fCDBUri="local://$ALICE_ROOT";
413 AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
414 AliWarning("Default CDB storage not yet set !!!!");
415 AliWarning(Form("Setting it now to: %s", fCDBUri.Data()));
416 AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
419 man->SetDefaultStorage(fCDBUri);
422 // Now activate the detector specific CDB storage locations
423 for (Int_t i = 0; i < fSpecCDBUri.GetEntriesFast(); i++) {
424 TObject* obj = fSpecCDBUri[i];
426 AliDebug(2, "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
427 AliDebug(2, Form("Specific CDB storage for %s is set to: %s",obj->GetName(),obj->GetTitle()));
428 AliDebug(2, "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
429 man->SetSpecificStorage(obj->GetName(), obj->GetTitle());
434 //_____________________________________________________________________________
435 void AliReconstruction::SetDefaultStorage(const char* uri) {
436 // Store the desired default CDB storage location
437 // Activate it later within the Run() method
443 //_____________________________________________________________________________
444 void AliReconstruction::SetSpecificStorage(const char* calibType, const char* uri) {
445 // Store a detector-specific CDB storage location
446 // Activate it later within the Run() method
448 AliCDBPath aPath(calibType);
449 if(!aPath.IsValid()){
450 // if calibType is not wildcard but it is a valid detector, add "/*" to make it a valid path
451 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
452 if(!strcmp(calibType, fgkDetectorName[iDet])) {
453 aPath.SetPath(Form("%s/*", calibType));
454 AliInfo(Form("Path for specific storage set to %s", aPath.GetPath().Data()));
458 if(!aPath.IsValid()){
459 AliError(Form("Not a valid path or detector: %s", calibType));
464 // // check that calibType refers to a "valid" detector name
465 // Bool_t isDetector = kFALSE;
466 // for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
467 // TString detName = fgkDetectorName[iDet];
468 // if(aPath.GetLevel0() == detName) {
469 // isDetector = kTRUE;
475 // AliError(Form("Not a valid detector: %s", aPath.GetLevel0().Data()));
479 TObject* obj = fSpecCDBUri.FindObject(aPath.GetPath().Data());
480 if (obj) fSpecCDBUri.Remove(obj);
481 fSpecCDBUri.Add(new TNamed(aPath.GetPath().Data(), uri));
485 //_____________________________________________________________________________
486 Bool_t AliReconstruction::SetRunNumberFromData()
488 // The method is called in Run() in order
489 // to set a correct run number.
490 // In case of raw data reconstruction the
491 // run number is taken from the raw data header
493 if (fSetRunNumberFromDataCalled) return kTRUE;
494 fSetRunNumberFromDataCalled = kTRUE;
496 AliCDBManager* man = AliCDBManager::Instance();
498 if(man->GetRun() > 0) {
499 AliWarning("Run number is taken from event header! Ignoring settings in AliCDBManager!");
503 AliError("No run loader is found !");
506 // read run number from gAlice
507 if(fRunLoader->GetAliRun())
508 AliCDBManager::Instance()->SetRun(fRunLoader->GetHeader()->GetRun());
511 if(fRawReader->NextEvent()) {
512 AliCDBManager::Instance()->SetRun(fRawReader->GetRunNumber());
513 fRawReader->RewindEvents();
516 AliError("No raw-data events found !");
521 AliError("Neither gAlice nor RawReader objects are found !");
531 //_____________________________________________________________________________
532 void AliReconstruction::SetCDBLock() {
533 // Set CDB lock: from now on it is forbidden to reset the run number
534 // or the default storage or to activate any further storage!
536 AliCDBManager::Instance()->SetLock(1);
539 //_____________________________________________________________________________
540 Bool_t AliReconstruction::MisalignGeometry(const TString& detectors)
542 // Read the alignment objects from CDB.
543 // Each detector is supposed to have the
544 // alignment objects in DET/Align/Data CDB path.
545 // All the detector objects are then collected,
546 // sorted by geometry level (starting from ALIC) and
547 // then applied to the TGeo geometry.
548 // Finally an overlaps check is performed.
550 // Load alignment data from CDB and fill fAlignObjArray
551 if(fLoadAlignFromCDB){
553 TString detStr = detectors;
554 TString loadAlObjsListOfDets = "";
556 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
557 if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
558 loadAlObjsListOfDets += fgkDetectorName[iDet];
559 loadAlObjsListOfDets += " ";
560 } // end loop over detectors
561 loadAlObjsListOfDets.Prepend("GRP "); //add alignment objects for non-sensitive modules
562 AliGeomManager::ApplyAlignObjsFromCDB(loadAlObjsListOfDets.Data());
564 // Check if the array with alignment objects was
565 // provided by the user. If yes, apply the objects
566 // to the present TGeo geometry
567 if (fAlignObjArray) {
568 if (gGeoManager && gGeoManager->IsClosed()) {
569 if (AliGeomManager::ApplyAlignObjsToGeom(*fAlignObjArray) == kFALSE) {
570 AliError("The misalignment of one or more volumes failed!"
571 "Compare the list of simulated detectors and the list of detector alignment data!");
576 AliError("Can't apply the misalignment! gGeoManager doesn't exist or it is still opened!");
582 delete fAlignObjArray; fAlignObjArray=0;
587 //_____________________________________________________________________________
588 void AliReconstruction::SetGAliceFile(const char* fileName)
590 // set the name of the galice file
592 fGAliceFileName = fileName;
595 //_____________________________________________________________________________
596 void AliReconstruction::SetOption(const char* detector, const char* option)
598 // set options for the reconstruction of a detector
600 TObject* obj = fOptions.FindObject(detector);
601 if (obj) fOptions.Remove(obj);
602 fOptions.Add(new TNamed(detector, option));
606 //_____________________________________________________________________________
607 Bool_t AliReconstruction::Run(const char* input, Bool_t IsOnline)
609 // run the reconstruction
615 if (!input) input = fInput.Data();
616 TString fileName(input);
617 if (fileName.EndsWith("/")) {
618 fRawReader = new AliRawReaderFile(fileName);
619 } else if (fileName.EndsWith(".root")) {
620 fRawReader = new AliRawReaderRoot(fileName);
621 } else if (!fileName.IsNull()) {
622 fRawReader = new AliRawReaderDate(fileName);
627 AliError("Null pointer to the event structure!");
630 fRawReader = new AliRawReaderDate((void *)input);
633 if (!fEquipIdMap.IsNull() && fRawReader)
634 fRawReader->LoadEquipmentIdsMap(fEquipIdMap);
636 if (!fUseHLTData.IsNull()) {
637 // create the RawReaderHLT which performs redirection of HLT input data for
638 // the specified detectors
639 AliRawReader* pRawReader=AliRawHLTManager::CreateRawReaderHLT(fRawReader, fUseHLTData.Data());
641 fParentRawReader=fRawReader;
642 fRawReader=pRawReader;
644 AliError(Form("can not create Raw Reader for HLT input %s", fUseHLTData.Data()));
648 AliSysInfo::AddStamp("Start");
649 // get the run loader
650 if (!InitRunLoader()) return kFALSE;
651 AliSysInfo::AddStamp("LoadLoader");
653 // Initialize the CDB storage
656 AliSysInfo::AddStamp("LoadCDB");
658 // Set run number in CDBManager (if it is not already set by the user)
659 if (!SetRunNumberFromData()) if (fStopOnError) return kFALSE;
661 // Set CDB lock: from now on it is forbidden to reset the run number
662 // or the default storage or to activate any further storage!
665 // Import ideal TGeo geometry and apply misalignment
667 TString geom(gSystem->DirName(fGAliceFileName));
668 geom += "/geometry.root";
669 AliGeomManager::LoadGeometry(geom.Data());
670 if (!gGeoManager) if (fStopOnError) return kFALSE;
673 if (!MisalignGeometry(fLoadAlignData)) if (fStopOnError) return kFALSE;
674 AliSysInfo::AddStamp("LoadGeom");
677 AliQADataMakerSteer qas ;
678 if (fRunQA && fRawReader) qas.Run(fRunLocalReconstruction, fRawReader) ;
679 // checking the QA of previous steps
683 // local reconstruction
684 if (!fRunLocalReconstruction.IsNull()) {
685 if (!RunLocalReconstruction(fRunLocalReconstruction)) {
686 if (fStopOnError) {CleanUp(); return kFALSE;}
692 if (fRunVertexFinder && !CreateVertexer()) {
698 AliSysInfo::AddStamp("Vertexer");
701 if (!fRunTracking.IsNull() && !CreateTrackers(fRunTracking)) {
707 AliSysInfo::AddStamp("LoadTrackers");
709 // get the possibly already existing ESD file and tree
710 AliESDEvent* esd = new AliESDEvent(); AliESDEvent* hltesd = new AliESDEvent();
711 TFile* fileOld = NULL;
712 TTree* treeOld = NULL; TTree *hlttreeOld = NULL;
713 if (!gSystem->AccessPathName("AliESDs.root")){
714 gSystem->CopyFile("AliESDs.root", "AliESDs.old.root", kTRUE);
715 fileOld = TFile::Open("AliESDs.old.root");
716 if (fileOld && fileOld->IsOpen()) {
717 treeOld = (TTree*) fileOld->Get("esdTree");
718 if (treeOld)esd->ReadFromTree(treeOld);
719 hlttreeOld = (TTree*) fileOld->Get("HLTesdTree");
720 if (hlttreeOld) hltesd->ReadFromTree(hlttreeOld);
724 // create the ESD output file and tree
725 TFile* file = TFile::Open("AliESDs.root", "RECREATE");
726 file->SetCompressionLevel(2);
727 if (!file->IsOpen()) {
728 AliError("opening AliESDs.root failed");
729 if (fStopOnError) {CleanUp(file, fileOld); return kFALSE;}
732 TTree* tree = new TTree("esdTree", "Tree with ESD objects");
733 esd = new AliESDEvent();
734 esd->CreateStdContent();
735 esd->WriteToTree(tree);
737 TTree* hlttree = new TTree("HLTesdTree", "Tree with HLT ESD objects");
738 hltesd = new AliESDEvent();
739 hltesd->CreateStdContent();
740 hltesd->WriteToTree(hlttree);
743 delete esd; delete hltesd;
744 esd = NULL; hltesd = NULL;
746 // create the branch with ESD additions
750 AliESDfriend *esdf = 0;
751 if (fWriteESDfriend) {
752 esdf = new AliESDfriend();
753 TBranch *br=tree->Branch("ESDfriend.","AliESDfriend", &esdf);
754 br->SetFile("AliESDfriends.root");
755 esd->AddObject(esdf);
759 // Get the GRP CDB entry
760 AliCDBEntry* entryGRP = AliCDBManager::Instance()->Get("GRP/GRP/Data");
763 fGRPList = dynamic_cast<TList*> (entryGRP->GetObject());
765 AliError("No GRP entry found in OCDB!");
768 // Get the diamond profile from OCDB
769 AliCDBEntry* entry = AliCDBManager::Instance()
770 ->Get("GRP/Calib/MeanVertex");
773 fDiamondProfile = dynamic_cast<AliESDVertex*> (entry->GetObject());
775 AliError("No diamond profile found in OCDB!");
779 entry = AliCDBManager::Instance()
780 ->Get("GRP/Calib/MeanVertexTPC");
783 fDiamondProfileTPC = dynamic_cast<AliESDVertex*> (entry->GetObject());
785 AliError("No diamond profile found in OCDB!");
788 AliVertexerTracks tVertexer(AliTracker::GetBz());
789 if(fDiamondProfile && fMeanVertexConstraint) tVertexer.SetVtxStart(fDiamondProfile);
791 if (fRawReader) fRawReader->RewindEvents();
794 gSystem->GetProcInfo(&ProcInfo);
795 AliInfo(Form("Current memory usage %d %d", ProcInfo.fMemResident, ProcInfo.fMemVirtual));
798 //Initialize the QA and start of cycle for out-of-cycle QA
800 TString detStr(fFillESD);
801 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
802 if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
803 AliQADataMakerRec *qadm = GetQADataMaker(iDet);
805 AliInfo(Form("Initializing the QA data maker for %s",
806 fgkDetectorName[iDet]));
807 qadm->Init(AliQA::kRECPOINTS, AliCDBManager::Instance()->GetRun());
808 qadm->Init(AliQA::kESDS, AliCDBManager::Instance()->GetRun());
810 qadm->StartOfCycle(AliQA::kRECPOINTS);
811 qadm->StartOfCycle(AliQA::kESDS,"same");
816 AliQADataMakerRec *qadm = GetQADataMaker(fgkNDetectors);
817 AliInfo(Form("Initializing the global QA data maker"));
819 qadm->Init(AliQA::kRECPOINTS, AliCDBManager::Instance()->GetRun());
820 AliTracker::SetResidualsArray(arr);
821 qadm->Init(AliQA::kESDS, AliCDBManager::Instance()->GetRun());
823 qadm->StartOfCycle(AliQA::kRECPOINTS);
824 qadm->StartOfCycle(AliQA::kESDS,"same");
828 //Initialize the Plane Efficiency framework
829 if (fRunPlaneEff && !InitPlaneEff()) {
830 if(fStopOnError) {CleanUp(file, fileOld); return kFALSE;}
833 //******* The loop over events
834 for (Int_t iEvent = 0; iEvent < fRunLoader->GetNumberOfEvents(); iEvent++) {
835 if (fRawReader) fRawReader->NextEvent();
836 if ((iEvent < fFirstEvent) || ((fLastEvent >= 0) && (iEvent > fLastEvent))) {
837 // copy old ESD to the new one
839 esd->ReadFromTree(treeOld);
840 treeOld->GetEntry(iEvent);
844 esd->ReadFromTree(hlttreeOld);
845 hlttreeOld->GetEntry(iEvent);
851 AliInfo(Form("processing event %d", iEvent));
853 //Start of cycle for the in-loop QA
856 TString detStr(fFillESD);
857 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
858 if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
859 AliQADataMakerRec *qadm = GetQADataMaker(iDet);
861 qadm->StartOfCycle(AliQA::kRECPOINTS);
862 qadm->StartOfCycle(AliQA::kESDS, "same") ;
866 AliQADataMakerRec *qadm = GetQADataMaker(fgkNDetectors);
867 qadm->StartOfCycle(AliQA::kRECPOINTS);
868 qadm->StartOfCycle(AliQA::kESDS,"same");
872 fRunLoader->GetEvent(iEvent);
875 sprintf(aFileName, "ESD_%d.%d_final.root",
876 fRunLoader->GetHeader()->GetRun(),
877 fRunLoader->GetHeader()->GetEventNrInRun());
878 if (!gSystem->AccessPathName(aFileName)) continue;
880 // local signle event reconstruction
881 if (!fRunLocalReconstruction.IsNull()) {
882 if (!RunLocalEventReconstruction(fRunLocalReconstruction)) {
883 if (fStopOnError) {CleanUp(file, fileOld); return kFALSE;}
887 esd->SetRunNumber(fRunLoader->GetHeader()->GetRun());
888 hltesd->SetRunNumber(fRunLoader->GetHeader()->GetRun());
889 esd->SetEventNumberInFile(fRunLoader->GetHeader()->GetEventNrInRun());
890 hltesd->SetEventNumberInFile(fRunLoader->GetHeader()->GetEventNrInRun());
892 // Set magnetic field from the tracker
893 esd->SetMagneticField(AliTracker::GetBz());
894 hltesd->SetMagneticField(AliTracker::GetBz());
898 // Fill raw-data error log into the ESD
899 if (fRawReader) FillRawDataErrorLog(iEvent,esd);
902 if (fRunVertexFinder) {
903 if (!ReadESD(esd, "vertex")) {
904 if (!RunVertexFinder(esd)) {
905 if (fStopOnError) {CleanUp(file, fileOld); return kFALSE;}
907 if (fCheckPointLevel > 0) WriteESD(esd, "vertex");
912 if (!fRunTracking.IsNull()) {
913 if (fRunHLTTracking) {
914 hltesd->SetPrimaryVertexSPD(esd->GetVertex());
915 if (!RunHLTTracking(hltesd)) {
916 if (fStopOnError) {CleanUp(file, fileOld); return kFALSE;}
922 if (!fRunTracking.IsNull()) {
923 if (fRunMuonTracking) {
924 if (!RunMuonTracking(esd)) {
925 if (fStopOnError) {CleanUp(file, fileOld); return kFALSE;}
931 if (!fRunTracking.IsNull()) {
932 if (!ReadESD(esd, "tracking")) {
933 if (!RunTracking(esd)) {
934 if (fStopOnError) {CleanUp(file, fileOld); return kFALSE;}
936 if (fCheckPointLevel > 0) WriteESD(esd, "tracking");
941 if (!fFillESD.IsNull()) {
942 if (!FillESD(esd, fFillESD)) {
943 if (fStopOnError) {CleanUp(file, fileOld); return kFALSE;}
947 // fill Event header information from the RawEventHeader
948 if (fRawReader){FillRawEventHeaderESD(esd);}
951 AliESDpid::MakePID(esd);
952 if (fCheckPointLevel > 1) WriteESD(esd, "PID");
954 if (fFillTriggerESD) {
955 if (!ReadESD(esd, "trigger")) {
956 if (!FillTriggerESD(esd)) {
957 if (fStopOnError) {CleanUp(file, fileOld); return kFALSE;}
959 if (fCheckPointLevel > 1) WriteESD(esd, "trigger");
966 // Propagate track to the beam pipe (if not laready done by ITS)
968 const Int_t ntracks = esd->GetNumberOfTracks();
969 const Double_t kBz = esd->GetMagneticField();
970 const Double_t kRadius = 2.8; //something less than the beam pipe radius
973 UShort_t *selectedIdx=new UShort_t[ntracks];
975 for (Int_t itrack=0; itrack<ntracks; itrack++){
976 const Double_t kMaxStep = 5; //max step over the material
979 AliESDtrack *track = esd->GetTrack(itrack);
980 if (!track) continue;
982 AliExternalTrackParam *tpcTrack =
983 (AliExternalTrackParam *)track->GetTPCInnerParam();
987 PropagateTrackTo(tpcTrack,kRadius,track->GetMass(),kMaxStep,kTRUE);
992 Int_t n=trkArray.GetEntriesFast();
993 selectedIdx[n]=track->GetID();
994 trkArray.AddLast(tpcTrack);
997 if (track->GetX() < kRadius) continue;
1000 PropagateTrackTo(track,kRadius,track->GetMass(),kMaxStep,kTRUE);
1002 track->RelateToVertex(esd->GetPrimaryVertexSPD(), kBz, kRadius);
1007 // Improve the reconstructed primary vertex position using the tracks
1009 TObject *obj = fOptions.FindObject("ITS");
1011 TString optITS = obj->GetTitle();
1012 if (optITS.Contains("cosmics") || optITS.Contains("COSMICS"))
1013 fRunVertexFinderTracks=kFALSE;
1015 if (fRunVertexFinderTracks) {
1016 // TPC + ITS primary vertex
1017 tVertexer.SetITSrefitRequired();
1018 if(fDiamondProfile && fMeanVertexConstraint) {
1019 tVertexer.SetVtxStart(fDiamondProfile);
1021 tVertexer.SetConstraintOff();
1023 AliESDVertex *pvtx=tVertexer.FindPrimaryVertex(esd);
1025 if (pvtx->GetStatus()) {
1026 esd->SetPrimaryVertex(pvtx);
1027 for (Int_t i=0; i<ntracks; i++) {
1028 AliESDtrack *t = esd->GetTrack(i);
1029 t->RelateToVertex(pvtx, kBz, kRadius);
1034 // TPC-only primary vertex
1035 tVertexer.SetITSrefitNotRequired();
1036 if(fDiamondProfileTPC && fMeanVertexConstraint) {
1037 tVertexer.SetVtxStart(fDiamondProfileTPC);
1039 tVertexer.SetConstraintOff();
1041 pvtx=tVertexer.FindPrimaryVertex(&trkArray,selectedIdx);
1043 if (pvtx->GetStatus()) {
1044 esd->SetPrimaryVertexTPC(pvtx);
1045 Int_t nsel=trkArray.GetEntriesFast();
1046 for (Int_t i=0; i<nsel; i++) {
1047 AliExternalTrackParam *t =
1048 (AliExternalTrackParam *)trkArray.UncheckedAt(i);
1049 t->PropagateToDCA(pvtx, kBz, kRadius);
1055 delete[] selectedIdx;
1057 if(fDiamondProfile) esd->SetDiamond(fDiamondProfile);
1062 AliV0vertexer vtxer;
1063 vtxer.Tracks2V0vertices(esd);
1065 if (fRunCascadeFinder) {
1067 AliCascadeVertexer cvtxer;
1068 cvtxer.V0sTracks2CascadeVertices(esd);
1073 if (fCleanESD) CleanESD(esd);
1076 AliQADataMakerRec *qadm = GetQADataMaker(fgkNDetectors);
1077 if (qadm) qadm->Exec(AliQA::kESDS, esd);
1080 if (fWriteESDfriend) {
1081 esdf->~AliESDfriend();
1082 new (esdf) AliESDfriend(); // Reset...
1083 esd->GetESDfriend(esdf);
1090 if (fCheckPointLevel > 0) WriteESD(esd, "final");
1093 if (fWriteESDfriend) {
1094 esdf->~AliESDfriend();
1095 new (esdf) AliESDfriend(); // Reset...
1098 gSystem->GetProcInfo(&ProcInfo);
1099 AliInfo(Form("Event %d -> Current memory usage %d %d",iEvent, ProcInfo.fMemResident, ProcInfo.fMemVirtual));
1102 // End of cycle for the in-loop QA
1105 RunQA(fFillESD.Data(), esd);
1106 TString detStr(fFillESD);
1107 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
1108 if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
1109 AliQADataMakerRec * qadm = GetQADataMaker(iDet);
1110 if (!qadm) continue;
1111 qadm->EndOfCycle(AliQA::kRECPOINTS);
1112 qadm->EndOfCycle(AliQA::kESDS);
1117 AliQADataMakerRec *qadm = GetQADataMaker(fgkNDetectors);
1119 qadm->EndOfCycle(AliQA::kRECPOINTS);
1120 qadm->EndOfCycle(AliQA::kESDS);
1126 //******** End of the loop over events
1130 tree->GetUserInfo()->Add(esd);
1131 hlttree->GetUserInfo()->Add(hltesd);
1133 const TMap *cdbMap = AliCDBManager::Instance()->GetStorageMap();
1134 const TList *cdbList = AliCDBManager::Instance()->GetRetrievedIds();
1136 TMap *cdbMapCopy = new TMap(cdbMap->GetEntries());
1137 cdbMapCopy->SetOwner(1);
1138 cdbMapCopy->SetName("cdbMap");
1139 TIter iter(cdbMap->GetTable());
1142 while((pair = dynamic_cast<TPair*> (iter.Next()))){
1143 TObjString* keyStr = dynamic_cast<TObjString*> (pair->Key());
1144 TObjString* valStr = dynamic_cast<TObjString*> (pair->Value());
1145 cdbMapCopy->Add(new TObjString(keyStr->GetName()), new TObjString(valStr->GetName()));
1148 TList *cdbListCopy = new TList();
1149 cdbListCopy->SetOwner(1);
1150 cdbListCopy->SetName("cdbList");
1152 TIter iter2(cdbList);
1155 while((id = dynamic_cast<AliCDBId*> (iter2.Next()))){
1156 cdbListCopy->Add(new TObjString(id->ToString().Data()));
1159 tree->GetUserInfo()->Add(cdbMapCopy);
1160 tree->GetUserInfo()->Add(cdbListCopy);
1163 if(fESDPar.Contains("ESD.par")){
1164 AliInfo("Attaching ESD.par to Tree");
1165 TNamed *fn = CopyFileToTNamed(fESDPar.Data(),"ESD.par");
1166 tree->GetUserInfo()->Add(fn);
1172 if (fWriteESDfriend)
1173 tree->SetBranchStatus("ESDfriend*",0);
1174 // we want to have only one tree version number
1175 tree->Write(tree->GetName(),TObject::kOverwrite);
1178 // Finish with Plane Efficiency evaluation: before of CleanUp !!!
1179 if (fRunPlaneEff && !FinishPlaneEff()) {
1180 AliWarning("Finish PlaneEff evaluation failed");
1184 CleanUp(file, fileOld);
1187 TFile *esdFile = TFile::Open("AliESDs.root", "READONLY");
1188 TFile *aodFile = TFile::Open("AliAOD.root", "RECREATE");
1189 ESDFile2AODFile(esdFile, aodFile);
1194 // Create tags for the events in the ESD tree (the ESD tree is always present)
1195 // In case of empty events the tags will contain dummy values
1196 AliESDTagCreator *esdtagCreator = new AliESDTagCreator();
1197 esdtagCreator->CreateESDTags(fFirstEvent,fLastEvent,fGRPList);
1199 AliAODTagCreator *aodtagCreator = new AliAODTagCreator();
1200 aodtagCreator->CreateAODTags(fFirstEvent,fLastEvent,fGRPList);
1203 //Finish QA and end of cycle for out-of-loop QA
1206 qas.Run(fRunLocalReconstruction.Data(), AliQA::kRECPOINTS);
1208 qas.Run(fRunTracking.Data(), AliQA::kESDS);
1211 AliQADataMakerRec *qadm = GetQADataMaker(fgkNDetectors);
1213 qadm->EndOfCycle(AliQA::kRECPOINTS);
1214 qadm->EndOfCycle(AliQA::kESDS);
1220 // Cleanup of CDB manager: cache and active storages!
1221 AliCDBManager::Instance()->ClearCache();
1228 //_____________________________________________________________________________
1229 Bool_t AliReconstruction::RunLocalReconstruction(const TString& /*detectors*/)
1231 // run the local reconstruction
1232 static Int_t eventNr=0;
1233 AliCodeTimerAuto("")
1235 // AliCDBManager* man = AliCDBManager::Instance();
1236 // Bool_t origCache = man->GetCacheFlag();
1238 // TString detStr = detectors;
1239 // for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
1240 // if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
1241 // AliReconstructor* reconstructor = GetReconstructor(iDet);
1242 // if (!reconstructor) continue;
1243 // if (reconstructor->HasLocalReconstruction()) continue;
1245 // AliCodeTimerStart(Form("running reconstruction for %s", fgkDetectorName[iDet]));
1246 // AliInfo(Form("running reconstruction for %s", fgkDetectorName[iDet]));
1248 // AliCodeTimerStart(Form("Loading calibration data from OCDB for %s", fgkDetectorName[iDet]));
1249 // AliInfo(Form("Loading calibration data from OCDB for %s", fgkDetectorName[iDet]));
1251 // man->SetCacheFlag(kTRUE);
1252 // TString calibPath = Form("%s/Calib/*", fgkDetectorName[iDet]);
1253 // man->GetAll(calibPath); // entries are cached!
1255 // AliCodeTimerStop(Form("Loading calibration data from OCDB for %s", fgkDetectorName[iDet]));
1257 // if (fRawReader) {
1258 // fRawReader->RewindEvents();
1259 // reconstructor->Reconstruct(fRunLoader, fRawReader);
1261 // reconstructor->Reconstruct(fRunLoader);
1264 // AliCodeTimerStop(Form("running reconstruction for %s", fgkDetectorName[iDet]));
1265 // AliSysInfo::AddStamp(Form("LRec%s_%d",fgkDetectorName[iDet],eventNr));
1267 // // unload calibration data
1268 // man->UnloadFromCache(calibPath);
1269 // //man->ClearCache();
1272 // man->SetCacheFlag(origCache);
1274 // if ((detStr.CompareTo("ALL") != 0) && !detStr.IsNull()) {
1275 // AliError(Form("the following detectors were not found: %s",
1277 // if (fStopOnError) return kFALSE;
1284 //_____________________________________________________________________________
1285 Bool_t AliReconstruction::RunLocalEventReconstruction(const TString& detectors)
1287 // run the local reconstruction
1289 static Int_t eventNr=0;
1290 AliCodeTimerAuto("")
1292 TString detStr = detectors;
1293 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
1294 if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
1295 AliReconstructor* reconstructor = GetReconstructor(iDet);
1296 if (!reconstructor) continue;
1297 AliLoader* loader = fLoader[iDet];
1299 AliWarning(Form("No loader is defined for %s!",fgkDetectorName[iDet]));
1302 // conversion of digits
1303 if (fRawReader && reconstructor->HasDigitConversion()) {
1304 AliInfo(Form("converting raw data digits into root objects for %s",
1305 fgkDetectorName[iDet]));
1306 AliCodeTimerAuto(Form("converting raw data digits into root objects for %s",
1307 fgkDetectorName[iDet]));
1308 loader->LoadDigits("update");
1309 loader->CleanDigits();
1310 loader->MakeDigitsContainer();
1311 TTree* digitsTree = loader->TreeD();
1312 reconstructor->ConvertDigits(fRawReader, digitsTree);
1313 loader->WriteDigits("OVERWRITE");
1314 loader->UnloadDigits();
1316 // local reconstruction
1317 AliInfo(Form("running reconstruction for %s", fgkDetectorName[iDet]));
1318 AliCodeTimerAuto(Form("running reconstruction for %s", fgkDetectorName[iDet]));
1319 loader->LoadRecPoints("update");
1320 loader->CleanRecPoints();
1321 loader->MakeRecPointsContainer();
1322 TTree* clustersTree = loader->TreeR();
1323 if (fRawReader && !reconstructor->HasDigitConversion()) {
1324 reconstructor->Reconstruct(fRawReader, clustersTree);
1326 loader->LoadDigits("read");
1327 TTree* digitsTree = loader->TreeD();
1329 AliError(Form("Can't get the %s digits tree", fgkDetectorName[iDet]));
1330 if (fStopOnError) return kFALSE;
1332 reconstructor->Reconstruct(digitsTree, clustersTree);
1334 loader->UnloadDigits();
1337 // In-loop QA for local reconstrucion
1338 if (fRunQA && fInLoopQA) {
1339 AliQADataMakerRec * qadm = GetQADataMaker(iDet);
1342 //(Form("Running QA data maker for %s", fgkDetectorName[iDet]));
1344 //(Form("Running QA data maker for %s", fgkDetectorName[iDet]));
1346 qadm->Exec(AliQA::kRECPOINTS, clustersTree) ;
1349 //(Form("Running QA data maker for %s", fgkDetectorName[iDet]));
1353 loader->WriteRecPoints("OVERWRITE");
1354 loader->UnloadRecPoints();
1355 AliSysInfo::AddStamp(Form("LRec%s_%d",fgkDetectorName[iDet],eventNr), iDet,1,eventNr);
1358 if ((detStr.CompareTo("ALL") != 0) && !detStr.IsNull()) {
1359 AliError(Form("the following detectors were not found: %s",
1361 if (fStopOnError) return kFALSE;
1367 //_____________________________________________________________________________
1368 Bool_t AliReconstruction::RunVertexFinder(AliESDEvent*& esd)
1370 // run the barrel tracking
1372 AliCodeTimerAuto("")
1374 AliESDVertex* vertex = NULL;
1375 Double_t vtxPos[3] = {0, 0, 0};
1376 Double_t vtxErr[3] = {0.07, 0.07, 0.1};
1377 TArrayF mcVertex(3);
1378 if (fRunLoader->GetHeader() && fRunLoader->GetHeader()->GenEventHeader()) {
1379 fRunLoader->GetHeader()->GenEventHeader()->PrimaryVertex(mcVertex);
1380 for (Int_t i = 0; i < 3; i++) vtxPos[i] = mcVertex[i];
1384 if(fDiamondProfile) fVertexer->SetVtxStart(fDiamondProfile);
1385 AliInfo("running the ITS vertex finder");
1386 if (fLoader[0]) fLoader[0]->LoadRecPoints();
1387 vertex = fVertexer->FindVertexForCurrentEvent(fRunLoader->GetEventNumber());
1388 if (fLoader[0]) fLoader[0]->UnloadRecPoints();
1390 AliWarning("Vertex not found");
1391 vertex = new AliESDVertex();
1392 vertex->SetName("default");
1395 vertex->SetName("reconstructed");
1399 AliInfo("getting the primary vertex from MC");
1400 vertex = new AliESDVertex(vtxPos, vtxErr);
1404 vertex->GetXYZ(vtxPos);
1405 vertex->GetSigmaXYZ(vtxErr);
1407 AliWarning("no vertex reconstructed");
1408 vertex = new AliESDVertex(vtxPos, vtxErr);
1410 esd->SetPrimaryVertexSPD(vertex);
1411 // if SPD multiplicity has been determined, it is stored in the ESD
1412 AliMultiplicity *mult = fVertexer->GetMultiplicity();
1413 if(mult)esd->SetMultiplicity(mult);
1415 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
1416 if (fTracker[iDet]) fTracker[iDet]->SetVertex(vtxPos, vtxErr);
1423 //_____________________________________________________________________________
1424 Bool_t AliReconstruction::RunHLTTracking(AliESDEvent*& esd)
1426 // run the HLT barrel tracking
1428 AliCodeTimerAuto("")
1431 AliError("Missing runLoader!");
1435 AliInfo("running HLT tracking");
1437 // Get a pointer to the HLT reconstructor
1438 AliReconstructor *reconstructor = GetReconstructor(fgkNDetectors-1);
1439 if (!reconstructor) return kFALSE;
1442 for (Int_t iDet = 1; iDet >= 0; iDet--) {
1443 TString detName = fgkDetectorName[iDet];
1444 AliDebug(1, Form("%s HLT tracking", detName.Data()));
1445 reconstructor->SetOption(detName.Data());
1446 AliTracker *tracker = reconstructor->CreateTracker();
1448 AliWarning(Form("couldn't create a HLT tracker for %s", detName.Data()));
1449 if (fStopOnError) return kFALSE;
1453 Double_t vtxErr[3]={0.005,0.005,0.010};
1454 const AliESDVertex *vertex = esd->GetVertex();
1455 vertex->GetXYZ(vtxPos);
1456 tracker->SetVertex(vtxPos,vtxErr);
1458 fLoader[iDet]->LoadRecPoints("read");
1459 TTree* tree = fLoader[iDet]->TreeR();
1461 AliError(Form("Can't get the %s cluster tree", detName.Data()));
1464 tracker->LoadClusters(tree);
1466 if (tracker->Clusters2Tracks(esd) != 0) {
1467 AliError(Form("HLT %s Clusters2Tracks failed", fgkDetectorName[iDet]));
1471 tracker->UnloadClusters();
1479 //_____________________________________________________________________________
1480 Bool_t AliReconstruction::RunMuonTracking(AliESDEvent*& esd)
1482 // run the muon spectrometer tracking
1484 AliCodeTimerAuto("")
1487 AliError("Missing runLoader!");
1490 Int_t iDet = 7; // for MUON
1492 AliInfo("is running...");
1494 // Get a pointer to the MUON reconstructor
1495 AliReconstructor *reconstructor = GetReconstructor(iDet);
1496 if (!reconstructor) return kFALSE;
1499 TString detName = fgkDetectorName[iDet];
1500 AliDebug(1, Form("%s tracking", detName.Data()));
1501 AliTracker *tracker = reconstructor->CreateTracker();
1503 AliWarning(Form("couldn't create a tracker for %s", detName.Data()));
1508 fLoader[iDet]->LoadRecPoints("read");
1510 tracker->LoadClusters(fLoader[iDet]->TreeR());
1512 Int_t rv = tracker->Clusters2Tracks(esd);
1516 AliError(Form("%s Clusters2Tracks failed", fgkDetectorName[iDet]));
1520 fLoader[iDet]->UnloadRecPoints();
1522 tracker->UnloadClusters();
1530 //_____________________________________________________________________________
1531 Bool_t AliReconstruction::RunTracking(AliESDEvent*& esd)
1533 // run the barrel tracking
1534 static Int_t eventNr=0;
1535 AliCodeTimerAuto("")
1537 AliInfo("running tracking");
1539 //Fill the ESD with the T0 info (will be used by the TOF)
1540 if (fReconstructor[11] && fLoader[11]) {
1541 fLoader[11]->LoadRecPoints("READ");
1542 TTree *treeR = fLoader[11]->TreeR();
1543 GetReconstructor(11)->FillESD((TTree *)NULL,treeR,esd);
1546 // pass 1: TPC + ITS inwards
1547 for (Int_t iDet = 1; iDet >= 0; iDet--) {
1548 if (!fTracker[iDet]) continue;
1549 AliDebug(1, Form("%s tracking", fgkDetectorName[iDet]));
1552 fLoader[iDet]->LoadRecPoints("read");
1553 AliSysInfo::AddStamp(Form("RLoadCluster%s_%d",fgkDetectorName[iDet],eventNr),iDet,1, eventNr);
1554 TTree* tree = fLoader[iDet]->TreeR();
1556 AliError(Form("Can't get the %s cluster tree", fgkDetectorName[iDet]));
1559 fTracker[iDet]->LoadClusters(tree);
1560 AliSysInfo::AddStamp(Form("TLoadCluster%s_%d",fgkDetectorName[iDet],eventNr), iDet,2, eventNr);
1562 if (fTracker[iDet]->Clusters2Tracks(esd) != 0) {
1563 AliError(Form("%s Clusters2Tracks failed", fgkDetectorName[iDet]));
1566 if (fCheckPointLevel > 1) {
1567 WriteESD(esd, Form("%s.tracking", fgkDetectorName[iDet]));
1569 // preliminary PID in TPC needed by the ITS tracker
1571 GetReconstructor(1)->FillESD((TTree*)NULL, (TTree*)NULL, esd);
1572 AliESDpid::MakePID(esd);
1574 AliSysInfo::AddStamp(Form("Tracking0%s_%d",fgkDetectorName[iDet],eventNr), iDet,3,eventNr);
1577 // pass 2: ALL backwards
1579 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
1580 if (!fTracker[iDet]) continue;
1581 AliDebug(1, Form("%s back propagation", fgkDetectorName[iDet]));
1584 if (iDet > 1) { // all except ITS, TPC
1586 fLoader[iDet]->LoadRecPoints("read");
1587 AliSysInfo::AddStamp(Form("RLoadCluster0%s_%d",fgkDetectorName[iDet],eventNr), iDet,1, eventNr);
1588 tree = fLoader[iDet]->TreeR();
1590 AliError(Form("Can't get the %s cluster tree", fgkDetectorName[iDet]));
1593 fTracker[iDet]->LoadClusters(tree);
1594 AliSysInfo::AddStamp(Form("TLoadCluster0%s_%d",fgkDetectorName[iDet],eventNr), iDet,2, eventNr);
1598 if (iDet>1) // start filling residuals for the "outer" detectors
1599 if (fRunGlobalQA) AliTracker::SetFillResiduals(kTRUE);
1601 if (fTracker[iDet]->PropagateBack(esd) != 0) {
1602 AliError(Form("%s backward propagation failed", fgkDetectorName[iDet]));
1605 if (fCheckPointLevel > 1) {
1606 WriteESD(esd, Form("%s.back", fgkDetectorName[iDet]));
1610 if (iDet > 2) { // all except ITS, TPC, TRD
1611 fTracker[iDet]->UnloadClusters();
1612 fLoader[iDet]->UnloadRecPoints();
1614 // updated PID in TPC needed by the ITS tracker -MI
1616 GetReconstructor(1)->FillESD((TTree*)NULL, (TTree*)NULL, esd);
1617 AliESDpid::MakePID(esd);
1619 AliSysInfo::AddStamp(Form("Tracking1%s_%d",fgkDetectorName[iDet],eventNr), iDet,3, eventNr);
1621 //stop filling residuals for the "outer" detectors
1622 if (fRunGlobalQA) AliTracker::SetFillResiduals(kFALSE);
1624 // write space-points to the ESD in case alignment data output
1626 if (fWriteAlignmentData)
1627 WriteAlignmentData(esd);
1629 // pass 3: TRD + TPC + ITS refit inwards
1631 for (Int_t iDet = 2; iDet >= 0; iDet--) {
1632 if (!fTracker[iDet]) continue;
1633 AliDebug(1, Form("%s inward refit", fgkDetectorName[iDet]));
1636 if (iDet<2) // start filling residuals for TPC and ITS
1637 if (fRunGlobalQA) AliTracker::SetFillResiduals(kTRUE);
1639 if (fTracker[iDet]->RefitInward(esd) != 0) {
1640 AliError(Form("%s inward refit failed", fgkDetectorName[iDet]));
1643 // run postprocessing
1644 if (fTracker[iDet]->PostProcess(esd) != 0) {
1645 AliError(Form("%s postprocessing failed", fgkDetectorName[iDet]));
1648 if (fCheckPointLevel > 1) {
1649 WriteESD(esd, Form("%s.refit", fgkDetectorName[iDet]));
1651 AliSysInfo::AddStamp(Form("Tracking2%s_%d",fgkDetectorName[iDet],eventNr), iDet,3, eventNr);
1653 fTracker[iDet]->UnloadClusters();
1654 AliSysInfo::AddStamp(Form("TUnloadCluster%s_%d",fgkDetectorName[iDet],eventNr), iDet,4, eventNr);
1655 fLoader[iDet]->UnloadRecPoints();
1656 AliSysInfo::AddStamp(Form("RUnloadCluster%s_%d",fgkDetectorName[iDet],eventNr), iDet,5, eventNr);
1658 // stop filling residuals for TPC and ITS
1659 if (fRunGlobalQA) AliTracker::SetFillResiduals(kFALSE);
1665 //_____________________________________________________________________________
1666 Bool_t AliReconstruction::CleanESD(AliESDEvent *esd){
1668 // Remove the data which are not needed for the physics analysis.
1671 Int_t nTracks=esd->GetNumberOfTracks();
1672 Int_t nV0s=esd->GetNumberOfV0s();
1674 (Form("Number of ESD tracks and V0s before cleaning: %d %d",nTracks,nV0s));
1676 Float_t cleanPars[]={fV0DCAmax,fV0CsPmin,fDmax,fZmax};
1677 Bool_t rc=esd->Clean(cleanPars);
1679 nTracks=esd->GetNumberOfTracks();
1680 nV0s=esd->GetNumberOfV0s();
1682 (Form("Number of ESD tracks and V0s after cleaning %d %d",nTracks,nV0s));
1687 //_____________________________________________________________________________
1688 Bool_t AliReconstruction::FillESD(AliESDEvent*& esd, const TString& detectors)
1690 // fill the event summary data
1692 AliCodeTimerAuto("")
1693 static Int_t eventNr=0;
1694 TString detStr = detectors;
1696 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
1697 if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
1698 AliReconstructor* reconstructor = GetReconstructor(iDet);
1699 if (!reconstructor) continue;
1700 if (!ReadESD(esd, fgkDetectorName[iDet])) {
1701 AliDebug(1, Form("filling ESD for %s", fgkDetectorName[iDet]));
1702 TTree* clustersTree = NULL;
1703 if (fLoader[iDet]) {
1704 fLoader[iDet]->LoadRecPoints("read");
1705 clustersTree = fLoader[iDet]->TreeR();
1706 if (!clustersTree) {
1707 AliError(Form("Can't get the %s clusters tree",
1708 fgkDetectorName[iDet]));
1709 if (fStopOnError) return kFALSE;
1712 if (fRawReader && !reconstructor->HasDigitConversion()) {
1713 reconstructor->FillESD(fRawReader, clustersTree, esd);
1715 TTree* digitsTree = NULL;
1716 if (fLoader[iDet]) {
1717 fLoader[iDet]->LoadDigits("read");
1718 digitsTree = fLoader[iDet]->TreeD();
1720 AliError(Form("Can't get the %s digits tree",
1721 fgkDetectorName[iDet]));
1722 if (fStopOnError) return kFALSE;
1725 reconstructor->FillESD(digitsTree, clustersTree, esd);
1726 if (fLoader[iDet]) fLoader[iDet]->UnloadDigits();
1728 if (fLoader[iDet]) {
1729 fLoader[iDet]->UnloadRecPoints();
1732 if (fCheckPointLevel > 2) WriteESD(esd, fgkDetectorName[iDet]);
1736 if ((detStr.CompareTo("ALL") != 0) && !detStr.IsNull()) {
1737 AliError(Form("the following detectors were not found: %s",
1739 if (fStopOnError) return kFALSE;
1741 AliSysInfo::AddStamp(Form("FillESD%d",eventNr), 0,1, eventNr);
1746 //_____________________________________________________________________________
1747 Bool_t AliReconstruction::FillTriggerESD(AliESDEvent*& esd)
1749 // Reads the trigger decision which is
1750 // stored in Trigger.root file and fills
1751 // the corresponding esd entries
1753 AliCodeTimerAuto("")
1755 AliInfo("Filling trigger information into the ESD");
1757 AliCentralTrigger *aCTP = NULL;
1760 AliCTPRawStream input(fRawReader);
1761 if (!input.Next()) {
1762 AliError("No valid CTP (trigger) DDL raw data is found ! The trigger information is not stored in the ESD !");
1765 esd->SetTriggerMask(input.GetClassMask());
1766 esd->SetTriggerCluster(input.GetClusterMask());
1768 aCTP = new AliCentralTrigger();
1769 TString configstr("");
1770 if (!aCTP->LoadConfiguration(configstr)) { // Load CTP config from OCDB
1771 AliError("No trigger configuration found in OCDB! The trigger classes information will no be stored in ESD!");
1776 AliRunLoader *runloader = AliRunLoader::GetRunLoader();
1778 if (!runloader->LoadTrigger()) {
1779 aCTP = runloader->GetTrigger();
1780 esd->SetTriggerMask(aCTP->GetClassMask());
1781 esd->SetTriggerCluster(aCTP->GetClusterMask());
1784 AliWarning("No trigger can be loaded! The trigger information is not stored in the ESD !");
1789 AliError("No run loader is available! The trigger information is not stored in the ESD !");
1794 // Now fill the trigger class names into AliESDRun object
1795 AliTriggerConfiguration *config = aCTP->GetConfiguration();
1797 AliError("No trigger configuration has been found! The trigger classes information will no be stored in ESD!");
1801 const TObjArray& classesArray = config->GetClasses();
1802 Int_t nclasses = classesArray.GetEntriesFast();
1803 for( Int_t j=0; j<nclasses; j++ ) {
1804 AliTriggerClass* trclass = (AliTriggerClass*)classesArray.At( j );
1805 Int_t trindex = (Int_t)TMath::Log2(trclass->GetMask());
1806 esd->SetTriggerClass(trclass->GetName(),trindex);
1816 //_____________________________________________________________________________
1817 Bool_t AliReconstruction::FillRawEventHeaderESD(AliESDEvent*& esd)
1820 // Filling information from RawReader Header
1823 AliInfo("Filling information from RawReader Header");
1824 esd->SetBunchCrossNumber(0);
1825 esd->SetOrbitNumber(0);
1826 esd->SetPeriodNumber(0);
1827 esd->SetTimeStamp(0);
1828 esd->SetEventType(0);
1829 const AliRawEventHeaderBase * eventHeader = fRawReader->GetEventHeader();
1832 const UInt_t *id = eventHeader->GetP("Id");
1833 esd->SetBunchCrossNumber((id)[1]&0x00000fff);
1834 esd->SetOrbitNumber((((id)[0]<<20)&0xf00000)|(((id)[1]>>12)&0xfffff));
1835 esd->SetPeriodNumber(((id)[0]>>4)&0x0fffffff);
1837 esd->SetTimeStamp((eventHeader->Get("Timestamp")));
1838 esd->SetEventType((eventHeader->Get("Type")));
1845 //_____________________________________________________________________________
1846 Bool_t AliReconstruction::IsSelected(TString detName, TString& detectors) const
1848 // check whether detName is contained in detectors
1849 // if yes, it is removed from detectors
1851 // check if all detectors are selected
1852 if ((detectors.CompareTo("ALL") == 0) ||
1853 detectors.BeginsWith("ALL ") ||
1854 detectors.EndsWith(" ALL") ||
1855 detectors.Contains(" ALL ")) {
1860 // search for the given detector
1861 Bool_t result = kFALSE;
1862 if ((detectors.CompareTo(detName) == 0) ||
1863 detectors.BeginsWith(detName+" ") ||
1864 detectors.EndsWith(" "+detName) ||
1865 detectors.Contains(" "+detName+" ")) {
1866 detectors.ReplaceAll(detName, "");
1870 // clean up the detectors string
1871 while (detectors.Contains(" ")) detectors.ReplaceAll(" ", " ");
1872 while (detectors.BeginsWith(" ")) detectors.Remove(0, 1);
1873 while (detectors.EndsWith(" ")) detectors.Remove(detectors.Length()-1, 1);
1878 //_____________________________________________________________________________
1879 Bool_t AliReconstruction::InitRunLoader()
1881 // get or create the run loader
1883 if (gAlice) delete gAlice;
1886 if (!gSystem->AccessPathName(fGAliceFileName.Data())) { // galice.root exists
1887 // load all base libraries to get the loader classes
1888 TString libs = gSystem->GetLibraries();
1889 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
1890 TString detName = fgkDetectorName[iDet];
1891 if (detName == "HLT") continue;
1892 if (libs.Contains("lib" + detName + "base.so")) continue;
1893 gSystem->Load("lib" + detName + "base.so");
1895 fRunLoader = AliRunLoader::Open(fGAliceFileName.Data());
1897 AliError(Form("no run loader found in file %s", fGAliceFileName.Data()));
1901 fRunLoader->CdGAFile();
1902 if (gFile->GetKey(AliRunLoader::GetGAliceName())) {
1903 if (fRunLoader->LoadgAlice() == 0) {
1904 gAlice = fRunLoader->GetAliRun();
1905 AliTracker::SetFieldMap(gAlice->Field(),fUniformField);
1908 if (!gAlice && !fRawReader) {
1909 AliError(Form("no gAlice object found in file %s",
1910 fGAliceFileName.Data()));
1915 //PH This is a temporary fix to give access to the kinematics
1916 //PH that is needed for the labels of ITS clusters
1917 fRunLoader->LoadHeader();
1918 fRunLoader->LoadKinematics();
1920 } else { // galice.root does not exist
1922 AliError(Form("the file %s does not exist", fGAliceFileName.Data()));
1926 fRunLoader = AliRunLoader::Open(fGAliceFileName.Data(),
1927 AliConfig::GetDefaultEventFolderName(),
1930 AliError(Form("could not create run loader in file %s",
1931 fGAliceFileName.Data()));
1935 fRunLoader->MakeTree("E");
1937 while (fRawReader->NextEvent()) {
1938 fRunLoader->SetEventNumber(iEvent);
1939 fRunLoader->GetHeader()->Reset(fRawReader->GetRunNumber(),
1941 fRunLoader->MakeTree("H");
1942 fRunLoader->TreeE()->Fill();
1945 fRawReader->RewindEvents();
1946 if (fNumberOfEventsPerFile > 0)
1947 fRunLoader->SetNumberOfEventsPerFile(fNumberOfEventsPerFile);
1949 fRunLoader->SetNumberOfEventsPerFile(iEvent);
1950 fRunLoader->WriteHeader("OVERWRITE");
1951 fRunLoader->CdGAFile();
1952 fRunLoader->Write(0, TObject::kOverwrite);
1953 // AliTracker::SetFieldMap(???);
1959 //_____________________________________________________________________________
1960 AliReconstructor* AliReconstruction::GetReconstructor(Int_t iDet)
1962 // get the reconstructor object and the loader for a detector
1964 if (fReconstructor[iDet]) return fReconstructor[iDet];
1966 // load the reconstructor object
1967 TPluginManager* pluginManager = gROOT->GetPluginManager();
1968 TString detName = fgkDetectorName[iDet];
1969 TString recName = "Ali" + detName + "Reconstructor";
1970 if (gAlice && !gAlice->GetDetector(detName) && (detName != "HLT")) return NULL;
1972 AliReconstructor* reconstructor = NULL;
1973 // first check if a plugin is defined for the reconstructor
1974 TPluginHandler* pluginHandler =
1975 pluginManager->FindHandler("AliReconstructor", detName);
1976 // if not, add a plugin for it
1977 if (!pluginHandler) {
1978 AliDebug(1, Form("defining plugin for %s", recName.Data()));
1979 TString libs = gSystem->GetLibraries();
1980 if (libs.Contains("lib" + detName + "base.so") ||
1981 (gSystem->Load("lib" + detName + "base.so") >= 0)) {
1982 pluginManager->AddHandler("AliReconstructor", detName,
1983 recName, detName + "rec", recName + "()");
1985 pluginManager->AddHandler("AliReconstructor", detName,
1986 recName, detName, recName + "()");
1988 pluginHandler = pluginManager->FindHandler("AliReconstructor", detName);
1990 if (pluginHandler && (pluginHandler->LoadPlugin() == 0)) {
1991 reconstructor = (AliReconstructor*) pluginHandler->ExecPlugin(0);
1993 if (reconstructor) {
1994 TObject* obj = fOptions.FindObject(detName.Data());
1995 if (obj) reconstructor->SetOption(obj->GetTitle());
1996 reconstructor->Init();
1997 fReconstructor[iDet] = reconstructor;
2000 // get or create the loader
2001 if (detName != "HLT") {
2002 fLoader[iDet] = fRunLoader->GetLoader(detName + "Loader");
2003 if (!fLoader[iDet]) {
2004 AliConfig::Instance()
2005 ->CreateDetectorFolders(fRunLoader->GetEventFolder(),
2007 // first check if a plugin is defined for the loader
2009 pluginManager->FindHandler("AliLoader", detName);
2010 // if not, add a plugin for it
2011 if (!pluginHandler) {
2012 TString loaderName = "Ali" + detName + "Loader";
2013 AliDebug(1, Form("defining plugin for %s", loaderName.Data()));
2014 pluginManager->AddHandler("AliLoader", detName,
2015 loaderName, detName + "base",
2016 loaderName + "(const char*, TFolder*)");
2017 pluginHandler = pluginManager->FindHandler("AliLoader", detName);
2019 if (pluginHandler && (pluginHandler->LoadPlugin() == 0)) {
2021 (AliLoader*) pluginHandler->ExecPlugin(2, detName.Data(),
2022 fRunLoader->GetEventFolder());
2024 if (!fLoader[iDet]) { // use default loader
2025 fLoader[iDet] = new AliLoader(detName, fRunLoader->GetEventFolder());
2027 if (!fLoader[iDet]) {
2028 AliWarning(Form("couldn't get loader for %s", detName.Data()));
2029 if (fStopOnError) return NULL;
2031 fRunLoader->AddLoader(fLoader[iDet]);
2032 fRunLoader->CdGAFile();
2033 if (gFile && !gFile->IsWritable()) gFile->ReOpen("UPDATE");
2034 fRunLoader->Write(0, TObject::kOverwrite);
2039 return reconstructor;
2042 //_____________________________________________________________________________
2043 Bool_t AliReconstruction::CreateVertexer()
2045 // create the vertexer
2048 AliReconstructor* itsReconstructor = GetReconstructor(0);
2049 if (itsReconstructor) {
2050 fVertexer = itsReconstructor->CreateVertexer();
2053 AliWarning("couldn't create a vertexer for ITS");
2054 if (fStopOnError) return kFALSE;
2060 //_____________________________________________________________________________
2061 Bool_t AliReconstruction::CreateTrackers(const TString& detectors)
2063 // create the trackers
2065 TString detStr = detectors;
2066 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
2067 if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
2068 AliReconstructor* reconstructor = GetReconstructor(iDet);
2069 if (!reconstructor) continue;
2070 TString detName = fgkDetectorName[iDet];
2071 if (detName == "HLT") {
2072 fRunHLTTracking = kTRUE;
2075 if (detName == "MUON") {
2076 fRunMuonTracking = kTRUE;
2081 fTracker[iDet] = reconstructor->CreateTracker();
2082 if (!fTracker[iDet] && (iDet < 7)) {
2083 AliWarning(Form("couldn't create a tracker for %s", detName.Data()));
2084 if (fStopOnError) return kFALSE;
2086 AliSysInfo::AddStamp(Form("LTracker%s",fgkDetectorName[iDet]), iDet,0);
2092 //_____________________________________________________________________________
2093 void AliReconstruction::CleanUp(TFile* file, TFile* fileOld)
2095 // delete trackers and the run loader and close and delete the file
2097 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
2098 delete fReconstructor[iDet];
2099 fReconstructor[iDet] = NULL;
2100 fLoader[iDet] = NULL;
2101 delete fTracker[iDet];
2102 fTracker[iDet] = NULL;
2103 // delete fQADataMaker[iDet];
2104 // fQADataMaker[iDet] = NULL;
2109 if(!(AliCDBManager::Instance()->GetCacheFlag())) {
2110 delete fDiamondProfile;
2111 fDiamondProfile = NULL;
2112 delete fDiamondProfileTPC;
2113 fDiamondProfileTPC = NULL;
2123 if (fParentRawReader) delete fParentRawReader;
2124 fParentRawReader=NULL;
2134 gSystem->Unlink("AliESDs.old.root");
2138 //_____________________________________________________________________________
2140 Bool_t AliReconstruction::ReadESD(AliESDEvent*& esd, const char* recStep) const
2142 // read the ESD event from a file
2144 if (!esd) return kFALSE;
2146 sprintf(fileName, "ESD_%d.%d_%s.root",
2147 esd->GetRunNumber(), esd->GetEventNumberInFile(), recStep);
2148 if (gSystem->AccessPathName(fileName)) return kFALSE;
2150 AliInfo(Form("reading ESD from file %s", fileName));
2151 AliDebug(1, Form("reading ESD from file %s", fileName));
2152 TFile* file = TFile::Open(fileName);
2153 if (!file || !file->IsOpen()) {
2154 AliError(Form("opening %s failed", fileName));
2161 esd = (AliESDEvent*) file->Get("ESD");
2170 //_____________________________________________________________________________
2171 void AliReconstruction::WriteESD(AliESDEvent* esd, const char* recStep) const
2173 // write the ESD event to a file
2177 sprintf(fileName, "ESD_%d.%d_%s.root",
2178 esd->GetRunNumber(), esd->GetEventNumberInFile(), recStep);
2180 AliDebug(1, Form("writing ESD to file %s", fileName));
2181 TFile* file = TFile::Open(fileName, "recreate");
2182 if (!file || !file->IsOpen()) {
2183 AliError(Form("opening %s failed", fileName));
2195 //_____________________________________________________________________________
2196 void AliReconstruction::ESDFile2AODFile(TFile* esdFile, TFile* aodFile)
2198 // write all files from the given esd file to an aod file
2200 // create an AliAOD object
2201 AliAODEvent *aod = new AliAODEvent();
2202 aod->CreateStdContent();
2208 TTree *aodTree = new TTree("aodTree", "AliAOD tree");
2209 aodTree->Branch(aod->GetList());
2212 TTree *t = (TTree*) esdFile->Get("esdTree");
2213 AliESDEvent *esd = new AliESDEvent();
2214 esd->ReadFromTree(t);
2216 Int_t nEvents = t->GetEntries();
2218 // set arrays and pointers
2228 // loop over events and fill them
2229 for (Int_t iEvent = 0; iEvent < nEvents; ++iEvent) {
2230 //cout << "event: " << iEvent << endl;
2231 t->GetEntry(iEvent);
2233 // Multiplicity information needed by the header (to be revised!)
2234 Int_t nTracks = esd->GetNumberOfTracks();
2235 Int_t nPosTracks = 0;
2236 for (Int_t iTrack=0; iTrack<nTracks; ++iTrack)
2237 if (esd->GetTrack(iTrack)->Charge()> 0) nPosTracks++;
2239 // Access the header
2240 AliAODHeader *header = aod->GetHeader();
2243 header->SetRunNumber (esd->GetRunNumber() );
2244 header->SetBunchCrossNumber(esd->GetBunchCrossNumber());
2245 header->SetOrbitNumber (esd->GetOrbitNumber() );
2246 header->SetPeriodNumber (esd->GetPeriodNumber() );
2247 header->SetTriggerMask (esd->GetTriggerMask() );
2248 header->SetTriggerCluster (esd->GetTriggerCluster() );
2249 header->SetEventType (esd->GetEventType() );
2250 header->SetMagneticField (esd->GetMagneticField() );
2251 header->SetZDCN1Energy (esd->GetZDCN1Energy() );
2252 header->SetZDCP1Energy (esd->GetZDCP1Energy() );
2253 header->SetZDCN2Energy (esd->GetZDCN2Energy() );
2254 header->SetZDCP2Energy (esd->GetZDCP2Energy() );
2255 header->SetZDCEMEnergy (esd->GetZDCEMEnergy(0),esd->GetZDCEMEnergy(1));
2256 header->SetRefMultiplicity (nTracks);
2257 header->SetRefMultiplicityPos(nPosTracks);
2258 header->SetRefMultiplicityNeg(nTracks - nPosTracks);
2259 header->SetMuonMagFieldScale(-999.); // FIXME
2260 header->SetCentrality(-999.); // FIXME
2262 Int_t nV0s = esd->GetNumberOfV0s();
2263 Int_t nCascades = esd->GetNumberOfCascades();
2264 Int_t nKinks = esd->GetNumberOfKinks();
2265 Int_t nVertices = nV0s + 2*nCascades /*could lead to two vertices, one V0 and the Xi */+ nKinks + 1 /* = prim. vtx*/;
2267 Int_t nCaloClus = esd->GetNumberOfCaloClusters();
2269 Int_t nPmdClus = esd->GetNumberOfPmdTracks();
2271 aod->ResetStd(nTracks, nVertices, nV0s+nCascades, nJets, nCaloClus, nFmdClus, nPmdClus);
2273 // Array to take into account the tracks already added to the AOD
2274 Bool_t * usedTrack = NULL;
2276 usedTrack = new Bool_t[nTracks];
2277 for (Int_t iTrack=0; iTrack<nTracks; ++iTrack) usedTrack[iTrack]=kFALSE;
2279 // Array to take into account the V0s already added to the AOD
2280 Bool_t * usedV0 = NULL;
2282 usedV0 = new Bool_t[nV0s];
2283 for (Int_t iV0=0; iV0<nV0s; ++iV0) usedV0[iV0]=kFALSE;
2285 // Array to take into account the kinks already added to the AOD
2286 Bool_t * usedKink = NULL;
2288 usedKink = new Bool_t[nKinks];
2289 for (Int_t iKink=0; iKink<nKinks; ++iKink) usedKink[iKink]=kFALSE;
2292 // Access to the AOD container of vertices
2293 TClonesArray &vertices = *(aod->GetVertices());
2296 // Access to the AOD container of tracks
2297 TClonesArray &tracks = *(aod->GetTracks());
2300 // Access to the AOD container of V0s
2301 TClonesArray &V0s = *(aod->GetV0s());
2304 // Add primary vertex. The primary tracks will be defined
2305 // after the loops on the composite objects (V0, cascades, kinks)
2306 const AliESDVertex *vtx = esd->GetPrimaryVertex();
2308 vtx->GetXYZ(pos); // position
2309 vtx->GetCovMatrix(covVtx); //covariance matrix
2311 AliAODVertex * primary = new(vertices[jVertices++])
2312 AliAODVertex(pos, covVtx, vtx->GetChi2toNDF(), NULL, -1, AliAODVertex::kPrimary);
2315 AliAODTrack *aodTrack = 0x0;
2317 // Create vertices starting from the most complex objects
2320 for (Int_t nCascade = 0; nCascade < nCascades; ++nCascade) {
2321 AliESDcascade *cascade = esd->GetCascade(nCascade);
2323 cascade->GetXYZ(pos[0], pos[1], pos[2]);
2324 cascade->GetPosCovXi(covVtx);
2326 // Add the cascade vertex
2327 AliAODVertex * vcascade = new(vertices[jVertices++]) AliAODVertex(pos,
2329 cascade->GetChi2Xi(), // = chi2/NDF since NDF = 2*2-3
2332 AliAODVertex::kCascade);
2334 primary->AddDaughter(vcascade); // the cascade 'particle' (represented by a vertex) is added as a daughter to the primary vertex
2336 // Add the V0 from the cascade. The ESD class have to be optimized...
2337 // Now we have to search for the corresponding V0 in the list of V0s
2338 // using the indeces of the positive and negative tracks
2340 Int_t posFromV0 = cascade->GetPindex();
2341 Int_t negFromV0 = cascade->GetNindex();
2344 AliESDv0 * v0 = 0x0;
2347 for (Int_t iV0=0; iV0<nV0s; ++iV0) {
2349 v0 = esd->GetV0(iV0);
2350 Int_t posV0 = v0->GetPindex();
2351 Int_t negV0 = v0->GetNindex();
2353 if (posV0==posFromV0 && negV0==negFromV0) {
2359 AliAODVertex * vV0FromCascade = 0x0;
2361 if (indV0>-1 && !usedV0[indV0]) {
2363 // the V0 exists in the array of V0s and is not used
2365 usedV0[indV0] = kTRUE;
2367 v0->GetXYZ(pos[0], pos[1], pos[2]);
2368 v0->GetPosCov(covVtx);
2370 vV0FromCascade = new(vertices[jVertices++]) AliAODVertex(pos,
2372 v0->GetChi2V0(), // = chi2/NDF since NDF = 2*2-3
2378 // the V0 doesn't exist in the array of V0s or was used
2379 cerr << "Error: event " << iEvent << " cascade " << nCascade
2380 << " The V0 " << indV0
2381 << " doesn't exist in the array of V0s or was used!" << endl;
2383 cascade->GetXYZ(pos[0], pos[1], pos[2]);
2384 cascade->GetPosCov(covVtx);
2386 vV0FromCascade = new(vertices[jVertices++]) AliAODVertex(pos,
2388 v0->GetChi2V0(), // = chi2/NDF since NDF = 2*2-3
2392 vcascade->AddDaughter(vV0FromCascade);
2396 // Add the positive tracks from the V0
2398 if (! usedTrack[posFromV0]) {
2400 usedTrack[posFromV0] = kTRUE;
2402 AliESDtrack *esdTrack = esd->GetTrack(posFromV0);
2403 esdTrack->GetPxPyPz(p_pos);
2404 esdTrack->GetXYZ(pos);
2405 esdTrack->GetCovarianceXYZPxPyPz(covTr);
2406 esdTrack->GetESDpid(pid);
2408 vV0FromCascade->AddDaughter(aodTrack =
2409 new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
2410 esdTrack->GetLabel(),
2416 (Short_t)esdTrack->Charge(),
2417 esdTrack->GetITSClusterMap(),
2420 kTRUE, // check if this is right
2421 kFALSE, // check if this is right
2422 AliAODTrack::kSecondary)
2424 aodTrack->ConvertAliPIDtoAODPID();
2427 cerr << "Error: event " << iEvent << " cascade " << nCascade
2428 << " track " << posFromV0 << " has already been used!" << endl;
2431 // Add the negative tracks from the V0
2433 if (!usedTrack[negFromV0]) {
2435 usedTrack[negFromV0] = kTRUE;
2437 AliESDtrack *esdTrack = esd->GetTrack(negFromV0);
2438 esdTrack->GetPxPyPz(p_neg);
2439 esdTrack->GetXYZ(pos);
2440 esdTrack->GetCovarianceXYZPxPyPz(covTr);
2441 esdTrack->GetESDpid(pid);
2443 vV0FromCascade->AddDaughter(aodTrack =
2444 new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
2445 esdTrack->GetLabel(),
2451 (Short_t)esdTrack->Charge(),
2452 esdTrack->GetITSClusterMap(),
2455 kTRUE, // check if this is right
2456 kFALSE, // check if this is right
2457 AliAODTrack::kSecondary)
2459 aodTrack->ConvertAliPIDtoAODPID();
2462 cerr << "Error: event " << iEvent << " cascade " << nCascade
2463 << " track " << negFromV0 << " has already been used!" << endl;
2466 // add it to the V0 array as well
2467 Double_t d0[2] = { -999., -99.};
2468 // counting is probably wrong
2469 new(V0s[jV0s++]) AliAODv0(vV0FromCascade, -999., -99., p_pos, p_neg, d0); // to be refined
2471 // Add the bachelor track from the cascade
2473 Int_t bachelor = cascade->GetBindex();
2475 if(!usedTrack[bachelor]) {
2477 usedTrack[bachelor] = kTRUE;
2479 AliESDtrack *esdTrack = esd->GetTrack(bachelor);
2480 esdTrack->GetPxPyPz(p);
2481 esdTrack->GetXYZ(pos);
2482 esdTrack->GetCovarianceXYZPxPyPz(covTr);
2483 esdTrack->GetESDpid(pid);
2485 vcascade->AddDaughter(aodTrack =
2486 new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
2487 esdTrack->GetLabel(),
2493 (Short_t)esdTrack->Charge(),
2494 esdTrack->GetITSClusterMap(),
2497 kTRUE, // check if this is right
2498 kFALSE, // check if this is right
2499 AliAODTrack::kSecondary)
2501 aodTrack->ConvertAliPIDtoAODPID();
2504 cerr << "Error: event " << iEvent << " cascade " << nCascade
2505 << " track " << bachelor << " has already been used!" << endl;
2508 // Add the primary track of the cascade (if any)
2510 } // end of the loop on cascades
2514 for (Int_t nV0 = 0; nV0 < nV0s; ++nV0) {
2516 if (usedV0[nV0]) continue; // skip if aready added to the AOD
2518 AliESDv0 *v0 = esd->GetV0(nV0);
2520 v0->GetXYZ(pos[0], pos[1], pos[2]);
2521 v0->GetPosCov(covVtx);
2523 AliAODVertex * vV0 =
2524 new(vertices[jVertices++]) AliAODVertex(pos,
2526 v0->GetChi2V0(), // = chi2/NDF since NDF = 2*2-3
2530 primary->AddDaughter(vV0);
2532 Int_t posFromV0 = v0->GetPindex();
2533 Int_t negFromV0 = v0->GetNindex();
2535 // Add the positive tracks from the V0
2537 if (!usedTrack[posFromV0]) {
2539 usedTrack[posFromV0] = kTRUE;
2541 AliESDtrack *esdTrack = esd->GetTrack(posFromV0);
2542 esdTrack->GetPxPyPz(p_pos);
2543 esdTrack->GetXYZ(pos);
2544 esdTrack->GetCovarianceXYZPxPyPz(covTr);
2545 esdTrack->GetESDpid(pid);
2547 vV0->AddDaughter(aodTrack =
2548 new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
2549 esdTrack->GetLabel(),
2555 (Short_t)esdTrack->Charge(),
2556 esdTrack->GetITSClusterMap(),
2559 kTRUE, // check if this is right
2560 kFALSE, // check if this is right
2561 AliAODTrack::kSecondary)
2563 aodTrack->ConvertAliPIDtoAODPID();
2566 cerr << "Error: event " << iEvent << " V0 " << nV0
2567 << " track " << posFromV0 << " has already been used!" << endl;
2570 // Add the negative tracks from the V0
2572 if (!usedTrack[negFromV0]) {
2574 usedTrack[negFromV0] = kTRUE;
2576 AliESDtrack *esdTrack = esd->GetTrack(negFromV0);
2577 esdTrack->GetPxPyPz(p_neg);
2578 esdTrack->GetXYZ(pos);
2579 esdTrack->GetCovarianceXYZPxPyPz(covTr);
2580 esdTrack->GetESDpid(pid);
2582 vV0->AddDaughter(aodTrack =
2583 new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
2584 esdTrack->GetLabel(),
2590 (Short_t)esdTrack->Charge(),
2591 esdTrack->GetITSClusterMap(),
2594 kTRUE, // check if this is right
2595 kFALSE, // check if this is right
2596 AliAODTrack::kSecondary)
2598 aodTrack->ConvertAliPIDtoAODPID();
2601 cerr << "Error: event " << iEvent << " V0 " << nV0
2602 << " track " << negFromV0 << " has already been used!" << endl;
2605 // add it to the V0 array as well
2606 Double_t d0[2] = { 999., 99.};
2607 new(V0s[jV0s++]) AliAODv0(vV0, 999., 99., p_pos, p_neg, d0); // to be refined
2610 // end of the loop on V0s
2612 // Kinks: it is a big mess the access to the information in the kinks
2613 // The loop is on the tracks in order to find the mother and daugther of each kink
2616 for (Int_t iTrack=0; iTrack<nTracks; ++iTrack) {
2618 AliESDtrack * esdTrack = esd->GetTrack(iTrack);
2620 Int_t ikink = esdTrack->GetKinkIndex(0);
2623 // Negative kink index: mother, positive: daughter
2625 // Search for the second track of the kink
2627 for (Int_t jTrack = iTrack+1; jTrack<nTracks; ++jTrack) {
2629 AliESDtrack * esdTrack1 = esd->GetTrack(jTrack);
2631 Int_t jkink = esdTrack1->GetKinkIndex(0);
2633 if ( TMath::Abs(ikink)==TMath::Abs(jkink) ) {
2635 // The two tracks are from the same kink
2637 if (usedKink[TMath::Abs(ikink)-1]) continue; // skip used kinks
2640 Int_t idaughter = -1;
2642 if (ikink<0 && jkink>0) {
2647 else if (ikink>0 && jkink<0) {
2653 cerr << "Error: Wrong combination of kink indexes: "
2654 << ikink << " " << jkink << endl;
2658 // Add the mother track
2660 AliAODTrack * mother = NULL;
2662 if (!usedTrack[imother]) {
2664 usedTrack[imother] = kTRUE;
2666 AliESDtrack *esdTrack = esd->GetTrack(imother);
2667 esdTrack->GetPxPyPz(p);
2668 esdTrack->GetXYZ(pos);
2669 esdTrack->GetCovarianceXYZPxPyPz(covTr);
2670 esdTrack->GetESDpid(pid);
2673 new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
2674 esdTrack->GetLabel(),
2680 (Short_t)esdTrack->Charge(),
2681 esdTrack->GetITSClusterMap(),
2684 kTRUE, // check if this is right
2685 kTRUE, // check if this is right
2686 AliAODTrack::kPrimary);
2687 primary->AddDaughter(mother);
2688 mother->ConvertAliPIDtoAODPID();
2691 cerr << "Error: event " << iEvent << " kink " << TMath::Abs(ikink)-1
2692 << " track " << imother << " has already been used!" << endl;
2695 // Add the kink vertex
2696 AliESDkink * kink = esd->GetKink(TMath::Abs(ikink)-1);
2698 AliAODVertex * vkink =
2699 new(vertices[jVertices++]) AliAODVertex(kink->GetPosition(),
2703 esdTrack->GetID(), // This is the track ID of the mother's track!
2704 AliAODVertex::kKink);
2705 // Add the daughter track
2707 AliAODTrack * daughter = NULL;
2709 if (!usedTrack[idaughter]) {
2711 usedTrack[idaughter] = kTRUE;
2713 AliESDtrack *esdTrack = esd->GetTrack(idaughter);
2714 esdTrack->GetPxPyPz(p);
2715 esdTrack->GetXYZ(pos);
2716 esdTrack->GetCovarianceXYZPxPyPz(covTr);
2717 esdTrack->GetESDpid(pid);
2720 new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
2721 esdTrack->GetLabel(),
2727 (Short_t)esdTrack->Charge(),
2728 esdTrack->GetITSClusterMap(),
2731 kTRUE, // check if this is right
2732 kTRUE, // check if this is right
2733 AliAODTrack::kPrimary);
2734 vkink->AddDaughter(daughter);
2735 daughter->ConvertAliPIDtoAODPID();
2738 cerr << "Error: event " << iEvent << " kink " << TMath::Abs(ikink)-1
2739 << " track " << idaughter << " has already been used!" << endl;
2745 vertices.Expand(jVertices);
2747 // Tracks (primary and orphan)
2748 for (Int_t nTrack = 0; nTrack < nTracks; ++nTrack) {
2750 if (usedTrack[nTrack]) continue;
2752 AliESDtrack *esdTrack = esd->GetTrack(nTrack);
2753 esdTrack->GetPxPyPz(p);
2754 esdTrack->GetXYZ(pos);
2755 esdTrack->GetCovarianceXYZPxPyPz(covTr);
2756 esdTrack->GetESDpid(pid);
2758 Float_t impactXY, impactZ;
2760 esdTrack->GetImpactParameters(impactXY,impactZ);
2763 // track inside the beam pipe
2765 primary->AddDaughter(aodTrack =
2766 new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
2767 esdTrack->GetLabel(),
2773 (Short_t)esdTrack->Charge(),
2774 esdTrack->GetITSClusterMap(),
2777 kTRUE, // check if this is right
2778 kTRUE, // check if this is right
2779 AliAODTrack::kPrimary)
2781 aodTrack->ConvertAliPIDtoAODPID();
2784 // outside the beam pipe: orphan track
2785 // Don't write them anymore!
2788 } // end of loop on tracks
2791 Int_t nMuTracks = esd->GetNumberOfMuonTracks();
2792 for (Int_t nMuTrack = 0; nMuTrack < nMuTracks; ++nMuTrack) {
2794 AliESDMuonTrack *esdMuTrack = esd->GetMuonTrack(nMuTrack);
2795 p[0] = esdMuTrack->Px();
2796 p[1] = esdMuTrack->Py();
2797 p[2] = esdMuTrack->Pz();
2798 pos[0] = primary->GetX();
2799 pos[1] = primary->GetY();
2800 pos[2] = primary->GetZ();
2802 // has to be changed once the muon pid is provided by the ESD
2803 for (Int_t i = 0; i < 10; pid[i++] = 0.); pid[AliAODTrack::kMuon]=1.;
2805 primary->AddDaughter(aodTrack =
2806 new(tracks[jTracks++]) AliAODTrack(0, // no ID provided
2807 0, // no label provided
2812 NULL, // no covariance matrix provided
2813 esdMuTrack->Charge(),
2814 0, // ITSClusterMap is set below
2817 kFALSE, // muon tracks are not used to fit the primary vtx
2818 kFALSE, // not used for vertex fit
2819 AliAODTrack::kPrimary)
2822 aodTrack->SetHitsPatternInTrigCh(esdMuTrack->GetHitsPatternInTrigCh());
2823 Int_t track2Trigger = esdMuTrack->GetMatchTrigger();
2824 aodTrack->SetMatchTrigger(track2Trigger);
2826 aodTrack->SetChi2MatchTrigger(esdMuTrack->GetChi2MatchTrigger());
2828 aodTrack->SetChi2MatchTrigger(0.);
2830 tracks.Expand(jTracks); // remove 'empty slots' due to unwritten tracks
2832 // Access to the AOD container of PMD clusters
2833 TClonesArray &pmdClusters = *(aod->GetPmdClusters());
2834 Int_t jPmdClusters=0;
2836 for (Int_t iPmd = 0; iPmd < nPmdClus; ++iPmd) {
2837 // file pmd clusters, to be revised!
2838 AliESDPmdTrack *pmdTrack = esd->GetPmdTrack(iPmd);
2841 Double_t pos[3] = { pmdTrack->GetClusterX(), pmdTrack->GetClusterY(), pmdTrack->GetClusterZ() };
2842 Double_t pid[9] = { 0., 0., 0., 0., 0., 0., 0., 0., 0. }; // to be revised!
2844 // assoc cluster not set
2845 new(pmdClusters[jPmdClusters++]) AliAODPmdCluster(iPmd, nLabel, label, pmdTrack->GetClusterADC(), pos, pid);
2848 // Access to the AOD container of clusters
2849 TClonesArray &caloClusters = *(aod->GetCaloClusters());
2852 for (Int_t iClust=0; iClust<nCaloClus; ++iClust) {
2854 AliESDCaloCluster * cluster = esd->GetCaloCluster(iClust);
2856 Int_t id = cluster->GetID();
2859 Float_t energy = cluster->E();
2860 cluster->GetPosition(posF);
2861 Char_t ttype=AliAODCluster::kUndef;
2863 if (cluster->GetClusterType() == AliESDCaloCluster::kPHOSCluster) {
2864 ttype=AliAODCluster::kPHOSNeutral;
2866 else if (cluster->GetClusterType() == AliESDCaloCluster::kEMCALClusterv1) {
2867 ttype = AliAODCluster::kEMCALClusterv1;
2871 AliAODCaloCluster *caloCluster = new(caloClusters[jClusters++]) AliAODCaloCluster(id,
2879 caloCluster->SetCaloCluster(); // to be refined!
2882 caloClusters.Expand(jClusters); // resize TObjArray to 'remove' slots for pseudo clusters
2883 // end of loop on calo clusters
2885 // fill EMCAL cell info
2886 if (esd->GetEMCALCells()) { // protection against missing ESD information
2887 AliESDCaloCells &esdEMcells = *(esd->GetEMCALCells());
2888 Int_t nEMcell = esdEMcells.GetNumberOfCells() ;
2890 AliAODCaloCells &aodEMcells = *(aod->GetEMCALCells());
2891 aodEMcells.CreateContainer(nEMcell);
2892 aodEMcells.SetType(AliAODCaloCells::kEMCAL);
2893 for (Int_t iCell = 0; iCell < nEMcell; iCell++) {
2894 aodEMcells.SetCell(iCell,esdEMcells.GetCellNumber(iCell),esdEMcells.GetAmplitude(iCell));
2899 // fill PHOS cell info
2900 if (esd->GetPHOSCells()) { // protection against missing ESD information
2901 AliESDCaloCells &esdPHcells = *(esd->GetPHOSCells());
2902 Int_t nPHcell = esdPHcells.GetNumberOfCells() ;
2904 AliAODCaloCells &aodPHcells = *(aod->GetPHOSCells());
2905 aodPHcells.CreateContainer(nPHcell);
2906 aodPHcells.SetType(AliAODCaloCells::kPHOS);
2907 for (Int_t iCell = 0; iCell < nPHcell; iCell++) {
2908 aodPHcells.SetCell(iCell,esdPHcells.GetCellNumber(iCell),esdPHcells.GetAmplitude(iCell));
2914 AliAODTracklets &SPDTracklets = *(aod->GetTracklets());
2915 const AliMultiplicity *mult = esd->GetMultiplicity();
2917 if (mult->GetNumberOfTracklets()>0) {
2918 SPDTracklets.CreateContainer(mult->GetNumberOfTracklets());
2920 for (Int_t n=0; n<mult->GetNumberOfTracklets(); n++) {
2921 SPDTracklets.SetTracklet(n, mult->GetTheta(n), mult->GetPhi(n), mult->GetDeltaPhi(n), mult->GetLabel(n));
2925 Printf("ERROR: AliMultiplicity could not be retrieved from ESD");
2928 delete [] usedTrack;
2932 // fill the tree for this event
2934 } // end of event loop
2936 aodTree->GetUserInfo()->Add(aod);
2938 // write the tree to the specified file
2939 aodFile = aodTree->GetCurrentFile();
2946 void AliReconstruction::WriteAlignmentData(AliESDEvent* esd)
2948 // Write space-points which are then used in the alignment procedures
2949 // For the moment only ITS, TRD and TPC
2951 // Load TOF clusters
2953 fLoader[3]->LoadRecPoints("read");
2954 TTree* tree = fLoader[3]->TreeR();
2956 AliError(Form("Can't get the %s cluster tree", fgkDetectorName[3]));
2959 fTracker[3]->LoadClusters(tree);
2961 Int_t ntracks = esd->GetNumberOfTracks();
2962 for (Int_t itrack = 0; itrack < ntracks; itrack++)
2964 AliESDtrack *track = esd->GetTrack(itrack);
2967 for (Int_t iDet = 3; iDet >= 0; iDet--)
2968 nsp += track->GetNcls(iDet);
2970 AliTrackPointArray *sp = new AliTrackPointArray(nsp);
2971 track->SetTrackPointArray(sp);
2973 for (Int_t iDet = 3; iDet >= 0; iDet--) {
2974 AliTracker *tracker = fTracker[iDet];
2975 if (!tracker) continue;
2976 Int_t nspdet = track->GetNcls(iDet);
2977 if (nspdet <= 0) continue;
2978 track->GetClusters(iDet,idx);
2982 while (isp2 < nspdet) {
2984 TString dets = fgkDetectorName[iDet];
2985 if ((fUseTrackingErrorsForAlignment.CompareTo(dets) == 0) ||
2986 fUseTrackingErrorsForAlignment.BeginsWith(dets+" ") ||
2987 fUseTrackingErrorsForAlignment.EndsWith(" "+dets) ||
2988 fUseTrackingErrorsForAlignment.Contains(" "+dets+" ")) {
2989 isvalid = tracker->GetTrackPointTrackingError(idx[isp2],p,track);
2991 isvalid = tracker->GetTrackPoint(idx[isp2],p);
2994 const Int_t kNTPCmax = 159;
2995 if (iDet==1 && isp2>kNTPCmax) break; // to be fixed
2996 if (!isvalid) continue;
2997 sp->AddPoint(isptrack,&p); isptrack++; isp++;
3003 fTracker[3]->UnloadClusters();
3004 fLoader[3]->UnloadRecPoints();
3008 //_____________________________________________________________________________
3009 void AliReconstruction::FillRawDataErrorLog(Int_t iEvent, AliESDEvent* esd)
3011 // The method reads the raw-data error log
3012 // accumulated within the rawReader.
3013 // It extracts the raw-data errors related to
3014 // the current event and stores them into
3015 // a TClonesArray inside the esd object.
3017 if (!fRawReader) return;
3019 for(Int_t i = 0; i < fRawReader->GetNumberOfErrorLogs(); i++) {
3021 AliRawDataErrorLog *log = fRawReader->GetErrorLog(i);
3023 if (iEvent != log->GetEventNumber()) continue;
3025 esd->AddRawDataErrorLog(log);
3030 TNamed* AliReconstruction::CopyFileToTNamed(TString fPath,TString fName){
3031 // Dump a file content into a char in TNamed
3033 in.open(fPath.Data(),ios::in | ios::binary|ios::ate);
3034 Int_t kBytes = (Int_t)in.tellg();
3035 printf("Size: %d \n",kBytes);
3038 char* memblock = new char [kBytes];
3039 in.seekg (0, ios::beg);
3040 in.read (memblock, kBytes);
3042 TString fData(memblock,kBytes);
3043 fn = new TNamed(fName,fData);
3044 printf("fData Size: %d \n",fData.Sizeof());
3045 printf("fName Size: %d \n",fName.Sizeof());
3046 printf("fn Size: %d \n",fn->Sizeof());
3050 AliInfo(Form("Could not Open %s\n",fPath.Data()));
3056 void AliReconstruction::TNamedToFile(TTree* fTree, TString fName){
3057 // This is not really needed in AliReconstruction at the moment
3058 // but can serve as a template
3060 TList *fList = fTree->GetUserInfo();
3061 TNamed *fn = (TNamed*)fList->FindObject(fName.Data());
3062 printf("fn Size: %d \n",fn->Sizeof());
3064 TString fTmp(fn->GetName()); // to be 100% sure in principle fName also works
3065 const char* cdata = fn->GetTitle();
3066 printf("fTmp Size %d\n",fTmp.Sizeof());
3068 int size = fn->Sizeof()-fTmp.Sizeof()-sizeof(UChar_t)-sizeof(Int_t); // see dfinition of TString::SizeOf()...
3069 printf("calculated size %d\n",size);
3070 ofstream out(fName.Data(),ios::out | ios::binary);
3071 out.write(cdata,size);
3076 //_____________________________________________________________________________
3077 AliQADataMakerRec * AliReconstruction::GetQADataMaker(Int_t iDet)
3079 // get the quality assurance data maker object and the loader for a detector
3081 if (fQADataMaker[iDet])
3082 return fQADataMaker[iDet];
3084 AliQADataMakerRec * qadm = NULL;
3085 if (iDet == fgkNDetectors) { //Global QA
3086 qadm = new AliGlobalQADataMaker();
3087 fQADataMaker[iDet] = qadm;
3091 // load the QA data maker object
3092 TPluginManager* pluginManager = gROOT->GetPluginManager();
3093 TString detName = fgkDetectorName[iDet];
3094 TString qadmName = "Ali" + detName + "QADataMakerRec";
3095 if (gAlice && !gAlice->GetDetector(detName) && (detName != "HLT"))
3098 // first check if a plugin is defined for the quality assurance data maker
3099 TPluginHandler* pluginHandler = pluginManager->FindHandler("AliQADataMakerRec", detName);
3100 // if not, add a plugin for it
3101 if (!pluginHandler) {
3102 AliDebug(1, Form("defining plugin for %s", qadmName.Data()));
3103 TString libs = gSystem->GetLibraries();
3104 if (libs.Contains("lib" + detName + "base.so") ||
3105 (gSystem->Load("lib" + detName + "base.so") >= 0)) {
3106 pluginManager->AddHandler("AliQADataMakerRec", detName,
3107 qadmName, detName + "qadm", qadmName + "()");
3109 pluginManager->AddHandler("AliQADataMakerRec", detName,
3110 qadmName, detName, qadmName + "()");
3112 pluginHandler = pluginManager->FindHandler("AliQADataMakerRec", detName);
3114 if (pluginHandler && (pluginHandler->LoadPlugin() == 0)) {
3115 qadm = (AliQADataMakerRec *) pluginHandler->ExecPlugin(0);
3118 fQADataMaker[iDet] = qadm;
3123 //_____________________________________________________________________________
3124 Bool_t AliReconstruction::RunQA(const char* detectors, AliESDEvent *& esd)
3126 // run the Quality Assurance data producer
3128 AliCodeTimerAuto("")
3129 TString detStr = detectors;
3130 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
3131 if (!IsSelected(fgkDetectorName[iDet], detStr))
3133 AliQADataMakerRec * qadm = GetQADataMaker(iDet);
3136 AliCodeTimerStart(Form("running quality assurance data maker for %s", fgkDetectorName[iDet]));
3137 AliInfo(Form("running quality assurance data maker for %s", fgkDetectorName[iDet]));
3139 qadm->Exec(AliQA::kESDS, esd) ;
3142 AliCodeTimerStop(Form("running quality assurance data maker for %s", fgkDetectorName[iDet]));
3144 if ((detStr.CompareTo("ALL") != 0) && !detStr.IsNull()) {
3145 AliError(Form("the following detectors were not found: %s",
3155 //_____________________________________________________________________________
3156 void AliReconstruction::CheckQA()
3158 // check the QA of SIM for this run and remove the detectors
3159 // with status Fatal
3161 TString newRunLocalReconstruction ;
3162 TString newRunTracking ;
3163 TString newFillESD ;
3165 for (Int_t iDet = 0; iDet < AliQA::kNDET; iDet++) {
3166 TString detName(AliQA::GetDetName(iDet)) ;
3167 AliQA * qa = AliQA::Instance(AliQA::DETECTORINDEX(iDet)) ;
3168 if ( qa->IsSet(AliQA::DETECTORINDEX(iDet), AliQA::kSIM, AliQA::kFATAL)) {
3169 AliInfo(Form("QA status for %s in Hits and/or SDIGITS and/or Digits was Fatal; No reconstruction performed", detName.Data())) ;
3171 if ( fRunLocalReconstruction.Contains(AliQA::GetDetName(iDet)) ||
3172 fRunLocalReconstruction.Contains("ALL") ) {
3173 newRunLocalReconstruction += detName ;
3174 newRunLocalReconstruction += " " ;
3176 if ( fRunTracking.Contains(AliQA::GetDetName(iDet)) ||
3177 fRunTracking.Contains("ALL") ) {
3178 newRunTracking += detName ;
3179 newRunTracking += " " ;
3181 if ( fFillESD.Contains(AliQA::GetDetName(iDet)) ||
3182 fFillESD.Contains("ALL") ) {
3183 newFillESD += detName ;
3188 fRunLocalReconstruction = newRunLocalReconstruction ;
3189 fRunTracking = newRunTracking ;
3190 fFillESD = newFillESD ;
3193 //_____________________________________________________________________________
3194 Int_t AliReconstruction::GetDetIndex(const char* detector)
3196 // return the detector index corresponding to detector
3198 for (index = 0; index < fgkNDetectors ; index++) {
3199 if ( strcmp(detector, fgkDetectorName[index]) == 0 )
3204 //_____________________________________________________________________________
3205 Bool_t AliReconstruction::FinishPlaneEff() {
3207 // Here execute all the necessary operationis, at the end of the tracking phase,
3208 // in case that evaluation of PlaneEfficiencies was required for some detector.
3209 // E.g., write into a DataBase file the PlaneEfficiency which have been evaluated.
3211 // This Preliminary version works only FOR ITS !!!!!
3212 // other detectors (TOF,TRD, etc. have to develop their specific codes)
3215 // Return: kTRUE if all operations have been done properly, kFALSE otherwise
3218 //for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
3219 for (Int_t iDet = 0; iDet < 1; iDet++) { // for the time being only ITS
3220 //if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
3221 if(fTracker[iDet]) {
3222 AliPlaneEff *planeeff=fTracker[iDet]->GetPlaneEff();
3223 ret=planeeff->WriteIntoCDB();
3224 if(planeeff->GetCreateHistos()) {
3225 TString name="PlaneEffHisto";
3226 name+=fgkDetectorName[iDet];
3228 ret*=planeeff->WriteHistosToFile(name,"RECREATE");
3234 //_____________________________________________________________________________
3235 Bool_t AliReconstruction::InitPlaneEff() {
3237 // Here execute all the necessary operations, before of the tracking phase,
3238 // for the evaluation of PlaneEfficiencies, in case required for some detectors.
3239 // E.g., read from a DataBase file a first evaluation of the PlaneEfficiency
3240 // which should be updated/recalculated.
3242 // This Preliminary version will work only FOR ITS !!!!!
3243 // other detectors (TOF,TRD, etc. have to develop their specific codes)
3246 // Return: kTRUE if all operations have been done properly, kFALSE otherwise
3248 AliWarning(Form("Implementation of this method not yet done !! Method return kTRUE"));