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 Int_t sameQACycle = kFALSE ;
678 AliQADataMakerSteer qas ;
679 if (fRunQA && fRawReader) {
680 qas.Run(fRunLocalReconstruction, fRawReader) ;
683 // checking the QA of previous steps
687 // local reconstruction
688 if (!fRunLocalReconstruction.IsNull()) {
689 if (!RunLocalReconstruction(fRunLocalReconstruction)) {
690 if (fStopOnError) {CleanUp(); return kFALSE;}
696 if (fRunVertexFinder && !CreateVertexer()) {
702 AliSysInfo::AddStamp("Vertexer");
705 if (!fRunTracking.IsNull() && !CreateTrackers(fRunTracking)) {
711 AliSysInfo::AddStamp("LoadTrackers");
713 // get the possibly already existing ESD file and tree
714 AliESDEvent* esd = new AliESDEvent(); AliESDEvent* hltesd = new AliESDEvent();
715 TFile* fileOld = NULL;
716 TTree* treeOld = NULL; TTree *hlttreeOld = NULL;
717 if (!gSystem->AccessPathName("AliESDs.root")){
718 gSystem->CopyFile("AliESDs.root", "AliESDs.old.root", kTRUE);
719 fileOld = TFile::Open("AliESDs.old.root");
720 if (fileOld && fileOld->IsOpen()) {
721 treeOld = (TTree*) fileOld->Get("esdTree");
722 if (treeOld)esd->ReadFromTree(treeOld);
723 hlttreeOld = (TTree*) fileOld->Get("HLTesdTree");
724 if (hlttreeOld) hltesd->ReadFromTree(hlttreeOld);
728 // create the ESD output file and tree
729 TFile* file = TFile::Open("AliESDs.root", "RECREATE");
730 file->SetCompressionLevel(2);
731 if (!file->IsOpen()) {
732 AliError("opening AliESDs.root failed");
733 if (fStopOnError) {CleanUp(file, fileOld); return kFALSE;}
736 TTree* tree = new TTree("esdTree", "Tree with ESD objects");
737 esd = new AliESDEvent();
738 esd->CreateStdContent();
739 esd->WriteToTree(tree);
741 TTree* hlttree = new TTree("HLTesdTree", "Tree with HLT ESD objects");
742 hltesd = new AliESDEvent();
743 hltesd->CreateStdContent();
744 hltesd->WriteToTree(hlttree);
747 delete esd; delete hltesd;
748 esd = NULL; hltesd = NULL;
750 // create the branch with ESD additions
754 AliESDfriend *esdf = 0;
755 if (fWriteESDfriend) {
756 esdf = new AliESDfriend();
757 TBranch *br=tree->Branch("ESDfriend.","AliESDfriend", &esdf);
758 br->SetFile("AliESDfriends.root");
759 esd->AddObject(esdf);
763 // Get the GRP CDB entry
764 AliCDBEntry* entryGRP = AliCDBManager::Instance()->Get("GRP/GRP/Data");
767 fGRPList = dynamic_cast<TList*> (entryGRP->GetObject());
769 AliError("No GRP entry found in OCDB!");
772 // Get the diamond profile from OCDB
773 AliCDBEntry* entry = AliCDBManager::Instance()
774 ->Get("GRP/Calib/MeanVertex");
777 fDiamondProfile = dynamic_cast<AliESDVertex*> (entry->GetObject());
779 AliError("No diamond profile found in OCDB!");
783 entry = AliCDBManager::Instance()
784 ->Get("GRP/Calib/MeanVertexTPC");
787 fDiamondProfileTPC = dynamic_cast<AliESDVertex*> (entry->GetObject());
789 AliError("No diamond profile found in OCDB!");
792 AliVertexerTracks tVertexer(AliTracker::GetBz());
793 if(fDiamondProfile && fMeanVertexConstraint) tVertexer.SetVtxStart(fDiamondProfile);
795 if (fRawReader) fRawReader->RewindEvents();
798 gSystem->GetProcInfo(&ProcInfo);
799 AliInfo(Form("Current memory usage %d %d", ProcInfo.fMemResident, ProcInfo.fMemVirtual));
802 //Initialize the QA and start of cycle for out-of-cycle QA
804 TString detStr(fFillESD);
805 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
806 if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
807 AliQADataMakerRec *qadm = GetQADataMaker(iDet);
809 AliInfo(Form("Initializing the QA data maker for %s",
810 fgkDetectorName[iDet]));
811 qadm->Init(AliQA::kRECPOINTS, AliCDBManager::Instance()->GetRun());
812 qadm->Init(AliQA::kESDS, AliCDBManager::Instance()->GetRun());
814 // qadm->StartOfCycle(AliQA::kRECPOINTS);
815 // qadm->StartOfCycle(AliQA::kESDS,"same");
820 AliQADataMakerRec *qadm = GetQADataMaker(AliQA::kGLOBAL);
821 AliInfo(Form("Initializing the global QA data maker"));
823 qadm->Init(AliQA::kRECPOINTS, AliCDBManager::Instance()->GetRun());
824 AliTracker::SetResidualsArray(arr);
825 qadm->Init(AliQA::kESDS, AliCDBManager::Instance()->GetRun());
827 qadm->StartOfCycle(AliQA::kRECPOINTS, sameQACycle);
828 qadm->StartOfCycle(AliQA::kESDS, "same");
832 //Initialize the Plane Efficiency framework
833 if (fRunPlaneEff && !InitPlaneEff()) {
834 if(fStopOnError) {CleanUp(file, fileOld); return kFALSE;}
837 //******* The loop over events
838 for (Int_t iEvent = 0; iEvent < fRunLoader->GetNumberOfEvents(); iEvent++) {
839 if (fRawReader) fRawReader->NextEvent();
840 if ((iEvent < fFirstEvent) || ((fLastEvent >= 0) && (iEvent > fLastEvent))) {
841 // copy old ESD to the new one
843 esd->ReadFromTree(treeOld);
844 treeOld->GetEntry(iEvent);
848 esd->ReadFromTree(hlttreeOld);
849 hlttreeOld->GetEntry(iEvent);
855 AliInfo(Form("processing event %d", iEvent));
857 //Start of cycle for the in-loop QA
860 TString detStr(fFillESD);
861 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
862 if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
863 AliQADataMakerRec *qadm = GetQADataMaker(iDet);
865 qadm->StartOfCycle(AliQA::kRECPOINTS, sameQACycle);
866 qadm->StartOfCycle(AliQA::kESDS, "same") ;
870 AliQADataMakerRec *qadm = GetQADataMaker(AliQA::kGLOBAL);
871 qadm->StartOfCycle(AliQA::kRECPOINTS, sameQACycle);
872 qadm->StartOfCycle(AliQA::kESDS, "same");
876 fRunLoader->GetEvent(iEvent);
879 sprintf(aFileName, "ESD_%d.%d_final.root",
880 fRunLoader->GetHeader()->GetRun(),
881 fRunLoader->GetHeader()->GetEventNrInRun());
882 if (!gSystem->AccessPathName(aFileName)) continue;
884 // local signle event reconstruction
885 if (!fRunLocalReconstruction.IsNull()) {
886 if (!RunLocalEventReconstruction(fRunLocalReconstruction)) {
887 if (fStopOnError) {CleanUp(file, fileOld); return kFALSE;}
891 esd->SetRunNumber(fRunLoader->GetHeader()->GetRun());
892 hltesd->SetRunNumber(fRunLoader->GetHeader()->GetRun());
893 esd->SetEventNumberInFile(fRunLoader->GetHeader()->GetEventNrInRun());
894 hltesd->SetEventNumberInFile(fRunLoader->GetHeader()->GetEventNrInRun());
896 // Set magnetic field from the tracker
897 esd->SetMagneticField(AliTracker::GetBz());
898 hltesd->SetMagneticField(AliTracker::GetBz());
902 // Fill raw-data error log into the ESD
903 if (fRawReader) FillRawDataErrorLog(iEvent,esd);
906 if (fRunVertexFinder) {
907 if (!ReadESD(esd, "vertex")) {
908 if (!RunVertexFinder(esd)) {
909 if (fStopOnError) {CleanUp(file, fileOld); return kFALSE;}
911 if (fCheckPointLevel > 0) WriteESD(esd, "vertex");
916 if (!fRunTracking.IsNull()) {
917 if (fRunHLTTracking) {
918 hltesd->SetPrimaryVertexSPD(esd->GetVertex());
919 if (!RunHLTTracking(hltesd)) {
920 if (fStopOnError) {CleanUp(file, fileOld); return kFALSE;}
926 if (!fRunTracking.IsNull()) {
927 if (fRunMuonTracking) {
928 if (!RunMuonTracking(esd)) {
929 if (fStopOnError) {CleanUp(file, fileOld); return kFALSE;}
935 if (!fRunTracking.IsNull()) {
936 if (!ReadESD(esd, "tracking")) {
937 if (!RunTracking(esd)) {
938 if (fStopOnError) {CleanUp(file, fileOld); return kFALSE;}
940 if (fCheckPointLevel > 0) WriteESD(esd, "tracking");
945 if (!fFillESD.IsNull()) {
946 if (!FillESD(esd, fFillESD)) {
947 if (fStopOnError) {CleanUp(file, fileOld); return kFALSE;}
951 // fill Event header information from the RawEventHeader
952 if (fRawReader){FillRawEventHeaderESD(esd);}
955 AliESDpid::MakePID(esd);
956 if (fCheckPointLevel > 1) WriteESD(esd, "PID");
958 if (fFillTriggerESD) {
959 if (!ReadESD(esd, "trigger")) {
960 if (!FillTriggerESD(esd)) {
961 if (fStopOnError) {CleanUp(file, fileOld); return kFALSE;}
963 if (fCheckPointLevel > 1) WriteESD(esd, "trigger");
970 // Propagate track to the beam pipe (if not laready done by ITS)
972 const Int_t ntracks = esd->GetNumberOfTracks();
973 const Double_t kBz = esd->GetMagneticField();
974 const Double_t kRadius = 2.8; //something less than the beam pipe radius
977 UShort_t *selectedIdx=new UShort_t[ntracks];
979 for (Int_t itrack=0; itrack<ntracks; itrack++){
980 const Double_t kMaxStep = 5; //max step over the material
983 AliESDtrack *track = esd->GetTrack(itrack);
984 if (!track) continue;
986 AliExternalTrackParam *tpcTrack =
987 (AliExternalTrackParam *)track->GetTPCInnerParam();
991 PropagateTrackTo(tpcTrack,kRadius,track->GetMass(),kMaxStep,kTRUE);
996 Int_t n=trkArray.GetEntriesFast();
997 selectedIdx[n]=track->GetID();
998 trkArray.AddLast(tpcTrack);
1001 if (track->GetX() < kRadius) continue;
1004 PropagateTrackTo(track,kRadius,track->GetMass(),kMaxStep,kTRUE);
1006 track->RelateToVertex(esd->GetPrimaryVertexSPD(), kBz, kRadius);
1011 // Improve the reconstructed primary vertex position using the tracks
1013 TObject *obj = fOptions.FindObject("ITS");
1015 TString optITS = obj->GetTitle();
1016 if (optITS.Contains("cosmics") || optITS.Contains("COSMICS"))
1017 fRunVertexFinderTracks=kFALSE;
1019 if (fRunVertexFinderTracks) {
1020 // TPC + ITS primary vertex
1021 tVertexer.SetITSrefitRequired();
1022 if(fDiamondProfile && fMeanVertexConstraint) {
1023 tVertexer.SetVtxStart(fDiamondProfile);
1025 tVertexer.SetConstraintOff();
1027 AliESDVertex *pvtx=tVertexer.FindPrimaryVertex(esd);
1029 if (pvtx->GetStatus()) {
1030 esd->SetPrimaryVertex(pvtx);
1031 for (Int_t i=0; i<ntracks; i++) {
1032 AliESDtrack *t = esd->GetTrack(i);
1033 t->RelateToVertex(pvtx, kBz, kRadius);
1038 // TPC-only primary vertex
1039 tVertexer.SetITSrefitNotRequired();
1040 if(fDiamondProfileTPC && fMeanVertexConstraint) {
1041 tVertexer.SetVtxStart(fDiamondProfileTPC);
1043 tVertexer.SetConstraintOff();
1045 pvtx=tVertexer.FindPrimaryVertex(&trkArray,selectedIdx);
1047 if (pvtx->GetStatus()) {
1048 esd->SetPrimaryVertexTPC(pvtx);
1049 Int_t nsel=trkArray.GetEntriesFast();
1050 for (Int_t i=0; i<nsel; i++) {
1051 AliExternalTrackParam *t =
1052 (AliExternalTrackParam *)trkArray.UncheckedAt(i);
1053 t->PropagateToDCA(pvtx, kBz, kRadius);
1059 delete[] selectedIdx;
1061 if(fDiamondProfile) esd->SetDiamond(fDiamondProfile);
1066 AliV0vertexer vtxer;
1067 vtxer.Tracks2V0vertices(esd);
1069 if (fRunCascadeFinder) {
1071 AliCascadeVertexer cvtxer;
1072 cvtxer.V0sTracks2CascadeVertices(esd);
1077 if (fCleanESD) CleanESD(esd);
1080 AliQADataMakerRec *qadm = GetQADataMaker(AliQA::kGLOBAL);
1081 if (qadm) qadm->Exec(AliQA::kESDS, esd);
1084 if (fWriteESDfriend) {
1085 esdf->~AliESDfriend();
1086 new (esdf) AliESDfriend(); // Reset...
1087 esd->GetESDfriend(esdf);
1094 if (fCheckPointLevel > 0) WriteESD(esd, "final");
1097 if (fWriteESDfriend) {
1098 esdf->~AliESDfriend();
1099 new (esdf) AliESDfriend(); // Reset...
1102 gSystem->GetProcInfo(&ProcInfo);
1103 AliInfo(Form("Event %d -> Current memory usage %d %d",iEvent, ProcInfo.fMemResident, ProcInfo.fMemVirtual));
1106 // End of cycle for the in-loop QA
1109 RunQA(fFillESD.Data(), esd);
1110 TString detStr(fFillESD);
1111 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
1112 if (!IsSelected(fgkDetectorName[iDet], detStr))
1114 AliQADataMakerRec * qadm = GetQADataMaker(iDet);
1117 qadm->EndOfCycle(AliQA::kRECPOINTS);
1118 qadm->EndOfCycle(AliQA::kESDS);
1123 AliQADataMakerRec *qadm = GetQADataMaker(AliQA::kGLOBAL);
1125 qadm->EndOfCycle(AliQA::kRECPOINTS);
1126 qadm->EndOfCycle(AliQA::kESDS);
1132 //******** End of the loop over events
1136 tree->GetUserInfo()->Add(esd);
1137 hlttree->GetUserInfo()->Add(hltesd);
1139 const TMap *cdbMap = AliCDBManager::Instance()->GetStorageMap();
1140 const TList *cdbList = AliCDBManager::Instance()->GetRetrievedIds();
1142 TMap *cdbMapCopy = new TMap(cdbMap->GetEntries());
1143 cdbMapCopy->SetOwner(1);
1144 cdbMapCopy->SetName("cdbMap");
1145 TIter iter(cdbMap->GetTable());
1148 while((pair = dynamic_cast<TPair*> (iter.Next()))){
1149 TObjString* keyStr = dynamic_cast<TObjString*> (pair->Key());
1150 TObjString* valStr = dynamic_cast<TObjString*> (pair->Value());
1151 cdbMapCopy->Add(new TObjString(keyStr->GetName()), new TObjString(valStr->GetName()));
1154 TList *cdbListCopy = new TList();
1155 cdbListCopy->SetOwner(1);
1156 cdbListCopy->SetName("cdbList");
1158 TIter iter2(cdbList);
1161 while((id = dynamic_cast<AliCDBId*> (iter2.Next()))){
1162 cdbListCopy->Add(new TObjString(id->ToString().Data()));
1165 tree->GetUserInfo()->Add(cdbMapCopy);
1166 tree->GetUserInfo()->Add(cdbListCopy);
1169 if(fESDPar.Contains("ESD.par")){
1170 AliInfo("Attaching ESD.par to Tree");
1171 TNamed *fn = CopyFileToTNamed(fESDPar.Data(),"ESD.par");
1172 tree->GetUserInfo()->Add(fn);
1178 if (fWriteESDfriend)
1179 tree->SetBranchStatus("ESDfriend*",0);
1180 // we want to have only one tree version number
1181 tree->Write(tree->GetName(),TObject::kOverwrite);
1184 // Finish with Plane Efficiency evaluation: before of CleanUp !!!
1185 if (fRunPlaneEff && !FinishPlaneEff()) {
1186 AliWarning("Finish PlaneEff evaluation failed");
1190 CleanUp(file, fileOld);
1193 TFile *esdFile = TFile::Open("AliESDs.root", "READONLY");
1194 TFile *aodFile = TFile::Open("AliAOD.root", "RECREATE");
1195 ESDFile2AODFile(esdFile, aodFile);
1200 // Create tags for the events in the ESD tree (the ESD tree is always present)
1201 // In case of empty events the tags will contain dummy values
1202 AliESDTagCreator *esdtagCreator = new AliESDTagCreator();
1203 esdtagCreator->CreateESDTags(fFirstEvent,fLastEvent,fGRPList);
1205 AliAODTagCreator *aodtagCreator = new AliAODTagCreator();
1206 aodtagCreator->CreateAODTags(fFirstEvent,fLastEvent,fGRPList);
1209 //Finish QA and end of cycle for out-of-loop QA
1212 qas.Run(fRunLocalReconstruction.Data(), AliQA::kRECPOINTS, sameQACycle);
1214 qas.Run(fRunTracking.Data(), AliQA::kESDS, sameQACycle);
1217 AliQADataMakerRec *qadm = GetQADataMaker(AliQA::kGLOBAL);
1219 qadm->EndOfCycle(AliQA::kRECPOINTS);
1220 qadm->EndOfCycle(AliQA::kESDS);
1226 // Cleanup of CDB manager: cache and active storages!
1227 AliCDBManager::Instance()->ClearCache();
1234 //_____________________________________________________________________________
1235 Bool_t AliReconstruction::RunLocalReconstruction(const TString& /*detectors*/)
1237 // run the local reconstruction
1238 static Int_t eventNr=0;
1239 AliCodeTimerAuto("")
1241 // AliCDBManager* man = AliCDBManager::Instance();
1242 // Bool_t origCache = man->GetCacheFlag();
1244 // TString detStr = detectors;
1245 // for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
1246 // if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
1247 // AliReconstructor* reconstructor = GetReconstructor(iDet);
1248 // if (!reconstructor) continue;
1249 // if (reconstructor->HasLocalReconstruction()) continue;
1251 // AliCodeTimerStart(Form("running reconstruction for %s", fgkDetectorName[iDet]));
1252 // AliInfo(Form("running reconstruction for %s", fgkDetectorName[iDet]));
1254 // AliCodeTimerStart(Form("Loading calibration data from OCDB for %s", fgkDetectorName[iDet]));
1255 // AliInfo(Form("Loading calibration data from OCDB for %s", fgkDetectorName[iDet]));
1257 // man->SetCacheFlag(kTRUE);
1258 // TString calibPath = Form("%s/Calib/*", fgkDetectorName[iDet]);
1259 // man->GetAll(calibPath); // entries are cached!
1261 // AliCodeTimerStop(Form("Loading calibration data from OCDB for %s", fgkDetectorName[iDet]));
1263 // if (fRawReader) {
1264 // fRawReader->RewindEvents();
1265 // reconstructor->Reconstruct(fRunLoader, fRawReader);
1267 // reconstructor->Reconstruct(fRunLoader);
1270 // AliCodeTimerStop(Form("running reconstruction for %s", fgkDetectorName[iDet]));
1271 // AliSysInfo::AddStamp(Form("LRec%s_%d",fgkDetectorName[iDet],eventNr));
1273 // // unload calibration data
1274 // man->UnloadFromCache(calibPath);
1275 // //man->ClearCache();
1278 // man->SetCacheFlag(origCache);
1280 // if ((detStr.CompareTo("ALL") != 0) && !detStr.IsNull()) {
1281 // AliError(Form("the following detectors were not found: %s",
1283 // if (fStopOnError) return kFALSE;
1290 //_____________________________________________________________________________
1291 Bool_t AliReconstruction::RunLocalEventReconstruction(const TString& detectors)
1293 // run the local reconstruction
1295 static Int_t eventNr=0;
1296 AliCodeTimerAuto("")
1298 TString detStr = detectors;
1299 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
1300 if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
1301 AliReconstructor* reconstructor = GetReconstructor(iDet);
1302 if (!reconstructor) continue;
1303 AliLoader* loader = fLoader[iDet];
1305 AliWarning(Form("No loader is defined for %s!",fgkDetectorName[iDet]));
1308 // conversion of digits
1309 if (fRawReader && reconstructor->HasDigitConversion()) {
1310 AliInfo(Form("converting raw data digits into root objects for %s",
1311 fgkDetectorName[iDet]));
1312 AliCodeTimerAuto(Form("converting raw data digits into root objects for %s",
1313 fgkDetectorName[iDet]));
1314 loader->LoadDigits("update");
1315 loader->CleanDigits();
1316 loader->MakeDigitsContainer();
1317 TTree* digitsTree = loader->TreeD();
1318 reconstructor->ConvertDigits(fRawReader, digitsTree);
1319 loader->WriteDigits("OVERWRITE");
1320 loader->UnloadDigits();
1322 // local reconstruction
1323 AliInfo(Form("running reconstruction for %s", fgkDetectorName[iDet]));
1324 AliCodeTimerAuto(Form("running reconstruction for %s", fgkDetectorName[iDet]));
1325 loader->LoadRecPoints("update");
1326 loader->CleanRecPoints();
1327 loader->MakeRecPointsContainer();
1328 TTree* clustersTree = loader->TreeR();
1329 if (fRawReader && !reconstructor->HasDigitConversion()) {
1330 reconstructor->Reconstruct(fRawReader, clustersTree);
1332 loader->LoadDigits("read");
1333 TTree* digitsTree = loader->TreeD();
1335 AliError(Form("Can't get the %s digits tree", fgkDetectorName[iDet]));
1336 if (fStopOnError) return kFALSE;
1338 reconstructor->Reconstruct(digitsTree, clustersTree);
1340 loader->UnloadDigits();
1343 // In-loop QA for local reconstrucion
1344 if (fRunQA && fInLoopQA) {
1345 AliQADataMakerRec * qadm = GetQADataMaker(iDet);
1348 //(Form("Running QA data maker for %s", fgkDetectorName[iDet]));
1350 //(Form("Running QA data maker for %s", fgkDetectorName[iDet]));
1352 qadm->Exec(AliQA::kRECPOINTS, clustersTree) ;
1355 //(Form("Running QA data maker for %s", fgkDetectorName[iDet]));
1359 loader->WriteRecPoints("OVERWRITE");
1360 loader->UnloadRecPoints();
1361 AliSysInfo::AddStamp(Form("LRec%s_%d",fgkDetectorName[iDet],eventNr), iDet,1,eventNr);
1364 if ((detStr.CompareTo("ALL") != 0) && !detStr.IsNull()) {
1365 AliError(Form("the following detectors were not found: %s",
1367 if (fStopOnError) return kFALSE;
1373 //_____________________________________________________________________________
1374 Bool_t AliReconstruction::RunVertexFinder(AliESDEvent*& esd)
1376 // run the barrel tracking
1378 AliCodeTimerAuto("")
1380 AliESDVertex* vertex = NULL;
1381 Double_t vtxPos[3] = {0, 0, 0};
1382 Double_t vtxErr[3] = {0.07, 0.07, 0.1};
1383 TArrayF mcVertex(3);
1384 if (fRunLoader->GetHeader() && fRunLoader->GetHeader()->GenEventHeader()) {
1385 fRunLoader->GetHeader()->GenEventHeader()->PrimaryVertex(mcVertex);
1386 for (Int_t i = 0; i < 3; i++) vtxPos[i] = mcVertex[i];
1390 if(fDiamondProfile) fVertexer->SetVtxStart(fDiamondProfile);
1391 AliInfo("running the ITS vertex finder");
1392 if (fLoader[0]) fLoader[0]->LoadRecPoints();
1393 vertex = fVertexer->FindVertexForCurrentEvent(fRunLoader->GetEventNumber());
1394 if (fLoader[0]) fLoader[0]->UnloadRecPoints();
1396 AliWarning("Vertex not found");
1397 vertex = new AliESDVertex();
1398 vertex->SetName("default");
1401 vertex->SetName("reconstructed");
1405 AliInfo("getting the primary vertex from MC");
1406 vertex = new AliESDVertex(vtxPos, vtxErr);
1410 vertex->GetXYZ(vtxPos);
1411 vertex->GetSigmaXYZ(vtxErr);
1413 AliWarning("no vertex reconstructed");
1414 vertex = new AliESDVertex(vtxPos, vtxErr);
1416 esd->SetPrimaryVertexSPD(vertex);
1417 // if SPD multiplicity has been determined, it is stored in the ESD
1418 AliMultiplicity *mult = fVertexer->GetMultiplicity();
1419 if(mult)esd->SetMultiplicity(mult);
1421 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
1422 if (fTracker[iDet]) fTracker[iDet]->SetVertex(vtxPos, vtxErr);
1429 //_____________________________________________________________________________
1430 Bool_t AliReconstruction::RunHLTTracking(AliESDEvent*& esd)
1432 // run the HLT barrel tracking
1434 AliCodeTimerAuto("")
1437 AliError("Missing runLoader!");
1441 AliInfo("running HLT tracking");
1443 // Get a pointer to the HLT reconstructor
1444 AliReconstructor *reconstructor = GetReconstructor(fgkNDetectors-1);
1445 if (!reconstructor) return kFALSE;
1448 for (Int_t iDet = 1; iDet >= 0; iDet--) {
1449 TString detName = fgkDetectorName[iDet];
1450 AliDebug(1, Form("%s HLT tracking", detName.Data()));
1451 reconstructor->SetOption(detName.Data());
1452 AliTracker *tracker = reconstructor->CreateTracker();
1454 AliWarning(Form("couldn't create a HLT tracker for %s", detName.Data()));
1455 if (fStopOnError) return kFALSE;
1459 Double_t vtxErr[3]={0.005,0.005,0.010};
1460 const AliESDVertex *vertex = esd->GetVertex();
1461 vertex->GetXYZ(vtxPos);
1462 tracker->SetVertex(vtxPos,vtxErr);
1464 fLoader[iDet]->LoadRecPoints("read");
1465 TTree* tree = fLoader[iDet]->TreeR();
1467 AliError(Form("Can't get the %s cluster tree", detName.Data()));
1470 tracker->LoadClusters(tree);
1472 if (tracker->Clusters2Tracks(esd) != 0) {
1473 AliError(Form("HLT %s Clusters2Tracks failed", fgkDetectorName[iDet]));
1477 tracker->UnloadClusters();
1485 //_____________________________________________________________________________
1486 Bool_t AliReconstruction::RunMuonTracking(AliESDEvent*& esd)
1488 // run the muon spectrometer tracking
1490 AliCodeTimerAuto("")
1493 AliError("Missing runLoader!");
1496 Int_t iDet = 7; // for MUON
1498 AliInfo("is running...");
1500 // Get a pointer to the MUON reconstructor
1501 AliReconstructor *reconstructor = GetReconstructor(iDet);
1502 if (!reconstructor) return kFALSE;
1505 TString detName = fgkDetectorName[iDet];
1506 AliDebug(1, Form("%s tracking", detName.Data()));
1507 AliTracker *tracker = reconstructor->CreateTracker();
1509 AliWarning(Form("couldn't create a tracker for %s", detName.Data()));
1514 fLoader[iDet]->LoadRecPoints("read");
1516 tracker->LoadClusters(fLoader[iDet]->TreeR());
1518 Int_t rv = tracker->Clusters2Tracks(esd);
1522 AliError(Form("%s Clusters2Tracks failed", fgkDetectorName[iDet]));
1526 fLoader[iDet]->UnloadRecPoints();
1528 tracker->UnloadClusters();
1536 //_____________________________________________________________________________
1537 Bool_t AliReconstruction::RunTracking(AliESDEvent*& esd)
1539 // run the barrel tracking
1540 static Int_t eventNr=0;
1541 AliCodeTimerAuto("")
1543 AliInfo("running tracking");
1545 //Fill the ESD with the T0 info (will be used by the TOF)
1546 if (fReconstructor[11] && fLoader[11]) {
1547 fLoader[11]->LoadRecPoints("READ");
1548 TTree *treeR = fLoader[11]->TreeR();
1549 GetReconstructor(11)->FillESD((TTree *)NULL,treeR,esd);
1552 // pass 1: TPC + ITS inwards
1553 for (Int_t iDet = 1; iDet >= 0; iDet--) {
1554 if (!fTracker[iDet]) continue;
1555 AliDebug(1, Form("%s tracking", fgkDetectorName[iDet]));
1558 fLoader[iDet]->LoadRecPoints("read");
1559 AliSysInfo::AddStamp(Form("RLoadCluster%s_%d",fgkDetectorName[iDet],eventNr),iDet,1, eventNr);
1560 TTree* tree = fLoader[iDet]->TreeR();
1562 AliError(Form("Can't get the %s cluster tree", fgkDetectorName[iDet]));
1565 fTracker[iDet]->LoadClusters(tree);
1566 AliSysInfo::AddStamp(Form("TLoadCluster%s_%d",fgkDetectorName[iDet],eventNr), iDet,2, eventNr);
1568 if (fTracker[iDet]->Clusters2Tracks(esd) != 0) {
1569 AliError(Form("%s Clusters2Tracks failed", fgkDetectorName[iDet]));
1572 if (fCheckPointLevel > 1) {
1573 WriteESD(esd, Form("%s.tracking", fgkDetectorName[iDet]));
1575 // preliminary PID in TPC needed by the ITS tracker
1577 GetReconstructor(1)->FillESD((TTree*)NULL, (TTree*)NULL, esd);
1578 AliESDpid::MakePID(esd);
1580 AliSysInfo::AddStamp(Form("Tracking0%s_%d",fgkDetectorName[iDet],eventNr), iDet,3,eventNr);
1583 // pass 2: ALL backwards
1585 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
1586 if (!fTracker[iDet]) continue;
1587 AliDebug(1, Form("%s back propagation", fgkDetectorName[iDet]));
1590 if (iDet > 1) { // all except ITS, TPC
1592 fLoader[iDet]->LoadRecPoints("read");
1593 AliSysInfo::AddStamp(Form("RLoadCluster0%s_%d",fgkDetectorName[iDet],eventNr), iDet,1, eventNr);
1594 tree = fLoader[iDet]->TreeR();
1596 AliError(Form("Can't get the %s cluster tree", fgkDetectorName[iDet]));
1599 fTracker[iDet]->LoadClusters(tree);
1600 AliSysInfo::AddStamp(Form("TLoadCluster0%s_%d",fgkDetectorName[iDet],eventNr), iDet,2, eventNr);
1604 if (iDet>1) // start filling residuals for the "outer" detectors
1605 if (fRunGlobalQA) AliTracker::SetFillResiduals(kTRUE);
1607 if (fTracker[iDet]->PropagateBack(esd) != 0) {
1608 AliError(Form("%s backward propagation failed", fgkDetectorName[iDet]));
1611 if (fCheckPointLevel > 1) {
1612 WriteESD(esd, Form("%s.back", fgkDetectorName[iDet]));
1616 if (iDet > 2) { // all except ITS, TPC, TRD
1617 fTracker[iDet]->UnloadClusters();
1618 fLoader[iDet]->UnloadRecPoints();
1620 // updated PID in TPC needed by the ITS tracker -MI
1622 GetReconstructor(1)->FillESD((TTree*)NULL, (TTree*)NULL, esd);
1623 AliESDpid::MakePID(esd);
1625 AliSysInfo::AddStamp(Form("Tracking1%s_%d",fgkDetectorName[iDet],eventNr), iDet,3, eventNr);
1627 //stop filling residuals for the "outer" detectors
1628 if (fRunGlobalQA) AliTracker::SetFillResiduals(kFALSE);
1630 // write space-points to the ESD in case alignment data output
1632 if (fWriteAlignmentData)
1633 WriteAlignmentData(esd);
1635 // pass 3: TRD + TPC + ITS refit inwards
1637 for (Int_t iDet = 2; iDet >= 0; iDet--) {
1638 if (!fTracker[iDet]) continue;
1639 AliDebug(1, Form("%s inward refit", fgkDetectorName[iDet]));
1642 if (iDet<2) // start filling residuals for TPC and ITS
1643 if (fRunGlobalQA) AliTracker::SetFillResiduals(kTRUE);
1645 if (fTracker[iDet]->RefitInward(esd) != 0) {
1646 AliError(Form("%s inward refit failed", fgkDetectorName[iDet]));
1649 // run postprocessing
1650 if (fTracker[iDet]->PostProcess(esd) != 0) {
1651 AliError(Form("%s postprocessing failed", fgkDetectorName[iDet]));
1654 if (fCheckPointLevel > 1) {
1655 WriteESD(esd, Form("%s.refit", fgkDetectorName[iDet]));
1657 AliSysInfo::AddStamp(Form("Tracking2%s_%d",fgkDetectorName[iDet],eventNr), iDet,3, eventNr);
1659 fTracker[iDet]->UnloadClusters();
1660 AliSysInfo::AddStamp(Form("TUnloadCluster%s_%d",fgkDetectorName[iDet],eventNr), iDet,4, eventNr);
1661 fLoader[iDet]->UnloadRecPoints();
1662 AliSysInfo::AddStamp(Form("RUnloadCluster%s_%d",fgkDetectorName[iDet],eventNr), iDet,5, eventNr);
1664 // stop filling residuals for TPC and ITS
1665 if (fRunGlobalQA) AliTracker::SetFillResiduals(kFALSE);
1671 //_____________________________________________________________________________
1672 Bool_t AliReconstruction::CleanESD(AliESDEvent *esd){
1674 // Remove the data which are not needed for the physics analysis.
1677 Int_t nTracks=esd->GetNumberOfTracks();
1678 Int_t nV0s=esd->GetNumberOfV0s();
1680 (Form("Number of ESD tracks and V0s before cleaning: %d %d",nTracks,nV0s));
1682 Float_t cleanPars[]={fV0DCAmax,fV0CsPmin,fDmax,fZmax};
1683 Bool_t rc=esd->Clean(cleanPars);
1685 nTracks=esd->GetNumberOfTracks();
1686 nV0s=esd->GetNumberOfV0s();
1688 (Form("Number of ESD tracks and V0s after cleaning %d %d",nTracks,nV0s));
1693 //_____________________________________________________________________________
1694 Bool_t AliReconstruction::FillESD(AliESDEvent*& esd, const TString& detectors)
1696 // fill the event summary data
1698 AliCodeTimerAuto("")
1699 static Int_t eventNr=0;
1700 TString detStr = detectors;
1702 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
1703 if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
1704 AliReconstructor* reconstructor = GetReconstructor(iDet);
1705 if (!reconstructor) continue;
1706 if (!ReadESD(esd, fgkDetectorName[iDet])) {
1707 AliDebug(1, Form("filling ESD for %s", fgkDetectorName[iDet]));
1708 TTree* clustersTree = NULL;
1709 if (fLoader[iDet]) {
1710 fLoader[iDet]->LoadRecPoints("read");
1711 clustersTree = fLoader[iDet]->TreeR();
1712 if (!clustersTree) {
1713 AliError(Form("Can't get the %s clusters tree",
1714 fgkDetectorName[iDet]));
1715 if (fStopOnError) return kFALSE;
1718 if (fRawReader && !reconstructor->HasDigitConversion()) {
1719 reconstructor->FillESD(fRawReader, clustersTree, esd);
1721 TTree* digitsTree = NULL;
1722 if (fLoader[iDet]) {
1723 fLoader[iDet]->LoadDigits("read");
1724 digitsTree = fLoader[iDet]->TreeD();
1726 AliError(Form("Can't get the %s digits tree",
1727 fgkDetectorName[iDet]));
1728 if (fStopOnError) return kFALSE;
1731 reconstructor->FillESD(digitsTree, clustersTree, esd);
1732 if (fLoader[iDet]) fLoader[iDet]->UnloadDigits();
1734 if (fLoader[iDet]) {
1735 fLoader[iDet]->UnloadRecPoints();
1738 if (fCheckPointLevel > 2) WriteESD(esd, fgkDetectorName[iDet]);
1742 if ((detStr.CompareTo("ALL") != 0) && !detStr.IsNull()) {
1743 AliError(Form("the following detectors were not found: %s",
1745 if (fStopOnError) return kFALSE;
1747 AliSysInfo::AddStamp(Form("FillESD%d",eventNr), 0,1, eventNr);
1752 //_____________________________________________________________________________
1753 Bool_t AliReconstruction::FillTriggerESD(AliESDEvent*& esd)
1755 // Reads the trigger decision which is
1756 // stored in Trigger.root file and fills
1757 // the corresponding esd entries
1759 AliCodeTimerAuto("")
1761 AliInfo("Filling trigger information into the ESD");
1763 AliCentralTrigger *aCTP = NULL;
1766 AliCTPRawStream input(fRawReader);
1767 if (!input.Next()) {
1768 AliError("No valid CTP (trigger) DDL raw data is found ! The trigger information is not stored in the ESD !");
1771 esd->SetTriggerMask(input.GetClassMask());
1772 esd->SetTriggerCluster(input.GetClusterMask());
1774 aCTP = new AliCentralTrigger();
1775 TString configstr("");
1776 if (!aCTP->LoadConfiguration(configstr)) { // Load CTP config from OCDB
1777 AliError("No trigger configuration found in OCDB! The trigger classes information will no be stored in ESD!");
1782 AliRunLoader *runloader = AliRunLoader::GetRunLoader();
1784 if (!runloader->LoadTrigger()) {
1785 aCTP = runloader->GetTrigger();
1786 esd->SetTriggerMask(aCTP->GetClassMask());
1787 esd->SetTriggerCluster(aCTP->GetClusterMask());
1790 AliWarning("No trigger can be loaded! The trigger information is not stored in the ESD !");
1795 AliError("No run loader is available! The trigger information is not stored in the ESD !");
1800 // Now fill the trigger class names into AliESDRun object
1801 AliTriggerConfiguration *config = aCTP->GetConfiguration();
1803 AliError("No trigger configuration has been found! The trigger classes information will no be stored in ESD!");
1807 const TObjArray& classesArray = config->GetClasses();
1808 Int_t nclasses = classesArray.GetEntriesFast();
1809 for( Int_t j=0; j<nclasses; j++ ) {
1810 AliTriggerClass* trclass = (AliTriggerClass*)classesArray.At( j );
1811 Int_t trindex = (Int_t)TMath::Log2(trclass->GetMask());
1812 esd->SetTriggerClass(trclass->GetName(),trindex);
1822 //_____________________________________________________________________________
1823 Bool_t AliReconstruction::FillRawEventHeaderESD(AliESDEvent*& esd)
1826 // Filling information from RawReader Header
1829 AliInfo("Filling information from RawReader Header");
1830 esd->SetBunchCrossNumber(0);
1831 esd->SetOrbitNumber(0);
1832 esd->SetPeriodNumber(0);
1833 esd->SetTimeStamp(0);
1834 esd->SetEventType(0);
1835 const AliRawEventHeaderBase * eventHeader = fRawReader->GetEventHeader();
1838 const UInt_t *id = eventHeader->GetP("Id");
1839 esd->SetBunchCrossNumber((id)[1]&0x00000fff);
1840 esd->SetOrbitNumber((((id)[0]<<20)&0xf00000)|(((id)[1]>>12)&0xfffff));
1841 esd->SetPeriodNumber(((id)[0]>>4)&0x0fffffff);
1843 esd->SetTimeStamp((eventHeader->Get("Timestamp")));
1844 esd->SetEventType((eventHeader->Get("Type")));
1851 //_____________________________________________________________________________
1852 Bool_t AliReconstruction::IsSelected(TString detName, TString& detectors) const
1854 // check whether detName is contained in detectors
1855 // if yes, it is removed from detectors
1857 // check if all detectors are selected
1858 if ((detectors.CompareTo("ALL") == 0) ||
1859 detectors.BeginsWith("ALL ") ||
1860 detectors.EndsWith(" ALL") ||
1861 detectors.Contains(" ALL ")) {
1866 // search for the given detector
1867 Bool_t result = kFALSE;
1868 if ((detectors.CompareTo(detName) == 0) ||
1869 detectors.BeginsWith(detName+" ") ||
1870 detectors.EndsWith(" "+detName) ||
1871 detectors.Contains(" "+detName+" ")) {
1872 detectors.ReplaceAll(detName, "");
1876 // clean up the detectors string
1877 while (detectors.Contains(" ")) detectors.ReplaceAll(" ", " ");
1878 while (detectors.BeginsWith(" ")) detectors.Remove(0, 1);
1879 while (detectors.EndsWith(" ")) detectors.Remove(detectors.Length()-1, 1);
1884 //_____________________________________________________________________________
1885 Bool_t AliReconstruction::InitRunLoader()
1887 // get or create the run loader
1889 if (gAlice) delete gAlice;
1892 if (!gSystem->AccessPathName(fGAliceFileName.Data())) { // galice.root exists
1893 // load all base libraries to get the loader classes
1894 TString libs = gSystem->GetLibraries();
1895 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
1896 TString detName = fgkDetectorName[iDet];
1897 if (detName == "HLT") continue;
1898 if (libs.Contains("lib" + detName + "base.so")) continue;
1899 gSystem->Load("lib" + detName + "base.so");
1901 fRunLoader = AliRunLoader::Open(fGAliceFileName.Data());
1903 AliError(Form("no run loader found in file %s", fGAliceFileName.Data()));
1907 fRunLoader->CdGAFile();
1908 if (gFile->GetKey(AliRunLoader::GetGAliceName())) {
1909 if (fRunLoader->LoadgAlice() == 0) {
1910 gAlice = fRunLoader->GetAliRun();
1911 AliTracker::SetFieldMap(gAlice->Field(),fUniformField);
1914 if (!gAlice && !fRawReader) {
1915 AliError(Form("no gAlice object found in file %s",
1916 fGAliceFileName.Data()));
1921 //PH This is a temporary fix to give access to the kinematics
1922 //PH that is needed for the labels of ITS clusters
1923 fRunLoader->LoadHeader();
1924 fRunLoader->LoadKinematics();
1926 } else { // galice.root does not exist
1928 AliError(Form("the file %s does not exist", fGAliceFileName.Data()));
1932 fRunLoader = AliRunLoader::Open(fGAliceFileName.Data(),
1933 AliConfig::GetDefaultEventFolderName(),
1936 AliError(Form("could not create run loader in file %s",
1937 fGAliceFileName.Data()));
1941 fRunLoader->MakeTree("E");
1943 while (fRawReader->NextEvent()) {
1944 fRunLoader->SetEventNumber(iEvent);
1945 fRunLoader->GetHeader()->Reset(fRawReader->GetRunNumber(),
1947 fRunLoader->MakeTree("H");
1948 fRunLoader->TreeE()->Fill();
1951 fRawReader->RewindEvents();
1952 if (fNumberOfEventsPerFile > 0)
1953 fRunLoader->SetNumberOfEventsPerFile(fNumberOfEventsPerFile);
1955 fRunLoader->SetNumberOfEventsPerFile(iEvent);
1956 fRunLoader->WriteHeader("OVERWRITE");
1957 fRunLoader->CdGAFile();
1958 fRunLoader->Write(0, TObject::kOverwrite);
1959 // AliTracker::SetFieldMap(???);
1965 //_____________________________________________________________________________
1966 AliReconstructor* AliReconstruction::GetReconstructor(Int_t iDet)
1968 // get the reconstructor object and the loader for a detector
1970 if (fReconstructor[iDet]) return fReconstructor[iDet];
1972 // load the reconstructor object
1973 TPluginManager* pluginManager = gROOT->GetPluginManager();
1974 TString detName = fgkDetectorName[iDet];
1975 TString recName = "Ali" + detName + "Reconstructor";
1976 if (gAlice && !gAlice->GetDetector(detName) && (detName != "HLT")) return NULL;
1978 AliReconstructor* reconstructor = NULL;
1979 // first check if a plugin is defined for the reconstructor
1980 TPluginHandler* pluginHandler =
1981 pluginManager->FindHandler("AliReconstructor", detName);
1982 // if not, add a plugin for it
1983 if (!pluginHandler) {
1984 AliDebug(1, Form("defining plugin for %s", recName.Data()));
1985 TString libs = gSystem->GetLibraries();
1986 if (libs.Contains("lib" + detName + "base.so") ||
1987 (gSystem->Load("lib" + detName + "base.so") >= 0)) {
1988 pluginManager->AddHandler("AliReconstructor", detName,
1989 recName, detName + "rec", recName + "()");
1991 pluginManager->AddHandler("AliReconstructor", detName,
1992 recName, detName, recName + "()");
1994 pluginHandler = pluginManager->FindHandler("AliReconstructor", detName);
1996 if (pluginHandler && (pluginHandler->LoadPlugin() == 0)) {
1997 reconstructor = (AliReconstructor*) pluginHandler->ExecPlugin(0);
1999 if (reconstructor) {
2000 TObject* obj = fOptions.FindObject(detName.Data());
2001 if (obj) reconstructor->SetOption(obj->GetTitle());
2002 reconstructor->Init();
2003 fReconstructor[iDet] = reconstructor;
2006 // get or create the loader
2007 if (detName != "HLT") {
2008 fLoader[iDet] = fRunLoader->GetLoader(detName + "Loader");
2009 if (!fLoader[iDet]) {
2010 AliConfig::Instance()
2011 ->CreateDetectorFolders(fRunLoader->GetEventFolder(),
2013 // first check if a plugin is defined for the loader
2015 pluginManager->FindHandler("AliLoader", detName);
2016 // if not, add a plugin for it
2017 if (!pluginHandler) {
2018 TString loaderName = "Ali" + detName + "Loader";
2019 AliDebug(1, Form("defining plugin for %s", loaderName.Data()));
2020 pluginManager->AddHandler("AliLoader", detName,
2021 loaderName, detName + "base",
2022 loaderName + "(const char*, TFolder*)");
2023 pluginHandler = pluginManager->FindHandler("AliLoader", detName);
2025 if (pluginHandler && (pluginHandler->LoadPlugin() == 0)) {
2027 (AliLoader*) pluginHandler->ExecPlugin(2, detName.Data(),
2028 fRunLoader->GetEventFolder());
2030 if (!fLoader[iDet]) { // use default loader
2031 fLoader[iDet] = new AliLoader(detName, fRunLoader->GetEventFolder());
2033 if (!fLoader[iDet]) {
2034 AliWarning(Form("couldn't get loader for %s", detName.Data()));
2035 if (fStopOnError) return NULL;
2037 fRunLoader->AddLoader(fLoader[iDet]);
2038 fRunLoader->CdGAFile();
2039 if (gFile && !gFile->IsWritable()) gFile->ReOpen("UPDATE");
2040 fRunLoader->Write(0, TObject::kOverwrite);
2045 return reconstructor;
2048 //_____________________________________________________________________________
2049 Bool_t AliReconstruction::CreateVertexer()
2051 // create the vertexer
2054 AliReconstructor* itsReconstructor = GetReconstructor(0);
2055 if (itsReconstructor) {
2056 fVertexer = itsReconstructor->CreateVertexer();
2059 AliWarning("couldn't create a vertexer for ITS");
2060 if (fStopOnError) return kFALSE;
2066 //_____________________________________________________________________________
2067 Bool_t AliReconstruction::CreateTrackers(const TString& detectors)
2069 // create the trackers
2071 TString detStr = detectors;
2072 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
2073 if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
2074 AliReconstructor* reconstructor = GetReconstructor(iDet);
2075 if (!reconstructor) continue;
2076 TString detName = fgkDetectorName[iDet];
2077 if (detName == "HLT") {
2078 fRunHLTTracking = kTRUE;
2081 if (detName == "MUON") {
2082 fRunMuonTracking = kTRUE;
2087 fTracker[iDet] = reconstructor->CreateTracker();
2088 if (!fTracker[iDet] && (iDet < 7)) {
2089 AliWarning(Form("couldn't create a tracker for %s", detName.Data()));
2090 if (fStopOnError) return kFALSE;
2092 AliSysInfo::AddStamp(Form("LTracker%s",fgkDetectorName[iDet]), iDet,0);
2098 //_____________________________________________________________________________
2099 void AliReconstruction::CleanUp(TFile* file, TFile* fileOld)
2101 // delete trackers and the run loader and close and delete the file
2103 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
2104 delete fReconstructor[iDet];
2105 fReconstructor[iDet] = NULL;
2106 fLoader[iDet] = NULL;
2107 delete fTracker[iDet];
2108 fTracker[iDet] = NULL;
2109 // delete fQADataMaker[iDet];
2110 // fQADataMaker[iDet] = NULL;
2115 if(!(AliCDBManager::Instance()->GetCacheFlag())) {
2116 delete fDiamondProfile;
2117 fDiamondProfile = NULL;
2118 delete fDiamondProfileTPC;
2119 fDiamondProfileTPC = NULL;
2129 if (fParentRawReader) delete fParentRawReader;
2130 fParentRawReader=NULL;
2140 gSystem->Unlink("AliESDs.old.root");
2144 //_____________________________________________________________________________
2146 Bool_t AliReconstruction::ReadESD(AliESDEvent*& esd, const char* recStep) const
2148 // read the ESD event from a file
2150 if (!esd) return kFALSE;
2152 sprintf(fileName, "ESD_%d.%d_%s.root",
2153 esd->GetRunNumber(), esd->GetEventNumberInFile(), recStep);
2154 if (gSystem->AccessPathName(fileName)) return kFALSE;
2156 AliInfo(Form("reading ESD from file %s", fileName));
2157 AliDebug(1, Form("reading ESD from file %s", fileName));
2158 TFile* file = TFile::Open(fileName);
2159 if (!file || !file->IsOpen()) {
2160 AliError(Form("opening %s failed", fileName));
2167 esd = (AliESDEvent*) file->Get("ESD");
2176 //_____________________________________________________________________________
2177 void AliReconstruction::WriteESD(AliESDEvent* esd, const char* recStep) const
2179 // write the ESD event to a file
2183 sprintf(fileName, "ESD_%d.%d_%s.root",
2184 esd->GetRunNumber(), esd->GetEventNumberInFile(), recStep);
2186 AliDebug(1, Form("writing ESD to file %s", fileName));
2187 TFile* file = TFile::Open(fileName, "recreate");
2188 if (!file || !file->IsOpen()) {
2189 AliError(Form("opening %s failed", fileName));
2201 //_____________________________________________________________________________
2202 void AliReconstruction::ESDFile2AODFile(TFile* esdFile, TFile* aodFile)
2204 // write all files from the given esd file to an aod file
2206 // create an AliAOD object
2207 AliAODEvent *aod = new AliAODEvent();
2208 aod->CreateStdContent();
2214 TTree *aodTree = new TTree("aodTree", "AliAOD tree");
2215 aodTree->Branch(aod->GetList());
2218 TTree *t = (TTree*) esdFile->Get("esdTree");
2219 AliESDEvent *esd = new AliESDEvent();
2220 esd->ReadFromTree(t);
2222 Int_t nEvents = t->GetEntries();
2224 // set arrays and pointers
2234 // loop over events and fill them
2235 for (Int_t iEvent = 0; iEvent < nEvents; ++iEvent) {
2236 //cout << "event: " << iEvent << endl;
2237 t->GetEntry(iEvent);
2239 // Multiplicity information needed by the header (to be revised!)
2240 Int_t nTracks = esd->GetNumberOfTracks();
2241 Int_t nPosTracks = 0;
2242 for (Int_t iTrack=0; iTrack<nTracks; ++iTrack)
2243 if (esd->GetTrack(iTrack)->Charge()> 0) nPosTracks++;
2245 // Access the header
2246 AliAODHeader *header = aod->GetHeader();
2249 header->SetRunNumber (esd->GetRunNumber() );
2250 header->SetBunchCrossNumber(esd->GetBunchCrossNumber());
2251 header->SetOrbitNumber (esd->GetOrbitNumber() );
2252 header->SetPeriodNumber (esd->GetPeriodNumber() );
2253 header->SetTriggerMask (esd->GetTriggerMask() );
2254 header->SetTriggerCluster (esd->GetTriggerCluster() );
2255 header->SetEventType (esd->GetEventType() );
2256 header->SetMagneticField (esd->GetMagneticField() );
2257 header->SetZDCN1Energy (esd->GetZDCN1Energy() );
2258 header->SetZDCP1Energy (esd->GetZDCP1Energy() );
2259 header->SetZDCN2Energy (esd->GetZDCN2Energy() );
2260 header->SetZDCP2Energy (esd->GetZDCP2Energy() );
2261 header->SetZDCEMEnergy (esd->GetZDCEMEnergy(0),esd->GetZDCEMEnergy(1));
2262 header->SetRefMultiplicity (nTracks);
2263 header->SetRefMultiplicityPos(nPosTracks);
2264 header->SetRefMultiplicityNeg(nTracks - nPosTracks);
2265 header->SetMuonMagFieldScale(-999.); // FIXME
2266 header->SetCentrality(-999.); // FIXME
2268 Int_t nV0s = esd->GetNumberOfV0s();
2269 Int_t nCascades = esd->GetNumberOfCascades();
2270 Int_t nKinks = esd->GetNumberOfKinks();
2271 Int_t nVertices = nV0s + 2*nCascades /*could lead to two vertices, one V0 and the Xi */+ nKinks + 1 /* = prim. vtx*/;
2273 Int_t nCaloClus = esd->GetNumberOfCaloClusters();
2275 Int_t nPmdClus = esd->GetNumberOfPmdTracks();
2277 aod->ResetStd(nTracks, nVertices, nV0s+nCascades, nJets, nCaloClus, nFmdClus, nPmdClus);
2279 // Array to take into account the tracks already added to the AOD
2280 Bool_t * usedTrack = NULL;
2282 usedTrack = new Bool_t[nTracks];
2283 for (Int_t iTrack=0; iTrack<nTracks; ++iTrack) usedTrack[iTrack]=kFALSE;
2285 // Array to take into account the V0s already added to the AOD
2286 Bool_t * usedV0 = NULL;
2288 usedV0 = new Bool_t[nV0s];
2289 for (Int_t iV0=0; iV0<nV0s; ++iV0) usedV0[iV0]=kFALSE;
2291 // Array to take into account the kinks already added to the AOD
2292 Bool_t * usedKink = NULL;
2294 usedKink = new Bool_t[nKinks];
2295 for (Int_t iKink=0; iKink<nKinks; ++iKink) usedKink[iKink]=kFALSE;
2298 // Access to the AOD container of vertices
2299 TClonesArray &vertices = *(aod->GetVertices());
2302 // Access to the AOD container of tracks
2303 TClonesArray &tracks = *(aod->GetTracks());
2306 // Access to the AOD container of V0s
2307 TClonesArray &V0s = *(aod->GetV0s());
2310 // Add primary vertex. The primary tracks will be defined
2311 // after the loops on the composite objects (V0, cascades, kinks)
2312 const AliESDVertex *vtx = esd->GetPrimaryVertex();
2314 vtx->GetXYZ(pos); // position
2315 vtx->GetCovMatrix(covVtx); //covariance matrix
2317 AliAODVertex * primary = new(vertices[jVertices++])
2318 AliAODVertex(pos, covVtx, vtx->GetChi2toNDF(), NULL, -1, AliAODVertex::kPrimary);
2321 AliAODTrack *aodTrack = 0x0;
2323 // Create vertices starting from the most complex objects
2326 for (Int_t nCascade = 0; nCascade < nCascades; ++nCascade) {
2327 AliESDcascade *cascade = esd->GetCascade(nCascade);
2329 cascade->GetXYZ(pos[0], pos[1], pos[2]);
2330 cascade->GetPosCovXi(covVtx);
2332 // Add the cascade vertex
2333 AliAODVertex * vcascade = new(vertices[jVertices++]) AliAODVertex(pos,
2335 cascade->GetChi2Xi(), // = chi2/NDF since NDF = 2*2-3
2338 AliAODVertex::kCascade);
2340 primary->AddDaughter(vcascade); // the cascade 'particle' (represented by a vertex) is added as a daughter to the primary vertex
2342 // Add the V0 from the cascade. The ESD class have to be optimized...
2343 // Now we have to search for the corresponding V0 in the list of V0s
2344 // using the indeces of the positive and negative tracks
2346 Int_t posFromV0 = cascade->GetPindex();
2347 Int_t negFromV0 = cascade->GetNindex();
2350 AliESDv0 * v0 = 0x0;
2353 for (Int_t iV0=0; iV0<nV0s; ++iV0) {
2355 v0 = esd->GetV0(iV0);
2356 Int_t posV0 = v0->GetPindex();
2357 Int_t negV0 = v0->GetNindex();
2359 if (posV0==posFromV0 && negV0==negFromV0) {
2365 AliAODVertex * vV0FromCascade = 0x0;
2367 if (indV0>-1 && !usedV0[indV0]) {
2369 // the V0 exists in the array of V0s and is not used
2371 usedV0[indV0] = kTRUE;
2373 v0->GetXYZ(pos[0], pos[1], pos[2]);
2374 v0->GetPosCov(covVtx);
2376 vV0FromCascade = new(vertices[jVertices++]) AliAODVertex(pos,
2378 v0->GetChi2V0(), // = chi2/NDF since NDF = 2*2-3
2384 // the V0 doesn't exist in the array of V0s or was used
2385 cerr << "Error: event " << iEvent << " cascade " << nCascade
2386 << " The V0 " << indV0
2387 << " doesn't exist in the array of V0s or was used!" << endl;
2389 cascade->GetXYZ(pos[0], pos[1], pos[2]);
2390 cascade->GetPosCov(covVtx);
2392 vV0FromCascade = new(vertices[jVertices++]) AliAODVertex(pos,
2394 v0->GetChi2V0(), // = chi2/NDF since NDF = 2*2-3
2398 vcascade->AddDaughter(vV0FromCascade);
2402 // Add the positive tracks from the V0
2404 if (! usedTrack[posFromV0]) {
2406 usedTrack[posFromV0] = kTRUE;
2408 AliESDtrack *esdTrack = esd->GetTrack(posFromV0);
2409 esdTrack->GetPxPyPz(p_pos);
2410 esdTrack->GetXYZ(pos);
2411 esdTrack->GetCovarianceXYZPxPyPz(covTr);
2412 esdTrack->GetESDpid(pid);
2414 vV0FromCascade->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 kFALSE, // check if this is right
2428 AliAODTrack::kSecondary)
2430 aodTrack->ConvertAliPIDtoAODPID();
2433 cerr << "Error: event " << iEvent << " cascade " << nCascade
2434 << " track " << posFromV0 << " has already been used!" << endl;
2437 // Add the negative tracks from the V0
2439 if (!usedTrack[negFromV0]) {
2441 usedTrack[negFromV0] = kTRUE;
2443 AliESDtrack *esdTrack = esd->GetTrack(negFromV0);
2444 esdTrack->GetPxPyPz(p_neg);
2445 esdTrack->GetXYZ(pos);
2446 esdTrack->GetCovarianceXYZPxPyPz(covTr);
2447 esdTrack->GetESDpid(pid);
2449 vV0FromCascade->AddDaughter(aodTrack =
2450 new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
2451 esdTrack->GetLabel(),
2457 (Short_t)esdTrack->Charge(),
2458 esdTrack->GetITSClusterMap(),
2461 kTRUE, // check if this is right
2462 kFALSE, // check if this is right
2463 AliAODTrack::kSecondary)
2465 aodTrack->ConvertAliPIDtoAODPID();
2468 cerr << "Error: event " << iEvent << " cascade " << nCascade
2469 << " track " << negFromV0 << " has already been used!" << endl;
2472 // add it to the V0 array as well
2473 Double_t d0[2] = { -999., -99.};
2474 // counting is probably wrong
2475 new(V0s[jV0s++]) AliAODv0(vV0FromCascade, -999., -99., p_pos, p_neg, d0); // to be refined
2477 // Add the bachelor track from the cascade
2479 Int_t bachelor = cascade->GetBindex();
2481 if(!usedTrack[bachelor]) {
2483 usedTrack[bachelor] = kTRUE;
2485 AliESDtrack *esdTrack = esd->GetTrack(bachelor);
2486 esdTrack->GetPxPyPz(p);
2487 esdTrack->GetXYZ(pos);
2488 esdTrack->GetCovarianceXYZPxPyPz(covTr);
2489 esdTrack->GetESDpid(pid);
2491 vcascade->AddDaughter(aodTrack =
2492 new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
2493 esdTrack->GetLabel(),
2499 (Short_t)esdTrack->Charge(),
2500 esdTrack->GetITSClusterMap(),
2503 kTRUE, // check if this is right
2504 kFALSE, // check if this is right
2505 AliAODTrack::kSecondary)
2507 aodTrack->ConvertAliPIDtoAODPID();
2510 cerr << "Error: event " << iEvent << " cascade " << nCascade
2511 << " track " << bachelor << " has already been used!" << endl;
2514 // Add the primary track of the cascade (if any)
2516 } // end of the loop on cascades
2520 for (Int_t nV0 = 0; nV0 < nV0s; ++nV0) {
2522 if (usedV0[nV0]) continue; // skip if aready added to the AOD
2524 AliESDv0 *v0 = esd->GetV0(nV0);
2526 v0->GetXYZ(pos[0], pos[1], pos[2]);
2527 v0->GetPosCov(covVtx);
2529 AliAODVertex * vV0 =
2530 new(vertices[jVertices++]) AliAODVertex(pos,
2532 v0->GetChi2V0(), // = chi2/NDF since NDF = 2*2-3
2536 primary->AddDaughter(vV0);
2538 Int_t posFromV0 = v0->GetPindex();
2539 Int_t negFromV0 = v0->GetNindex();
2541 // Add the positive tracks from the V0
2543 if (!usedTrack[posFromV0]) {
2545 usedTrack[posFromV0] = kTRUE;
2547 AliESDtrack *esdTrack = esd->GetTrack(posFromV0);
2548 esdTrack->GetPxPyPz(p_pos);
2549 esdTrack->GetXYZ(pos);
2550 esdTrack->GetCovarianceXYZPxPyPz(covTr);
2551 esdTrack->GetESDpid(pid);
2553 vV0->AddDaughter(aodTrack =
2554 new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
2555 esdTrack->GetLabel(),
2561 (Short_t)esdTrack->Charge(),
2562 esdTrack->GetITSClusterMap(),
2565 kTRUE, // check if this is right
2566 kFALSE, // check if this is right
2567 AliAODTrack::kSecondary)
2569 aodTrack->ConvertAliPIDtoAODPID();
2572 cerr << "Error: event " << iEvent << " V0 " << nV0
2573 << " track " << posFromV0 << " has already been used!" << endl;
2576 // Add the negative tracks from the V0
2578 if (!usedTrack[negFromV0]) {
2580 usedTrack[negFromV0] = kTRUE;
2582 AliESDtrack *esdTrack = esd->GetTrack(negFromV0);
2583 esdTrack->GetPxPyPz(p_neg);
2584 esdTrack->GetXYZ(pos);
2585 esdTrack->GetCovarianceXYZPxPyPz(covTr);
2586 esdTrack->GetESDpid(pid);
2588 vV0->AddDaughter(aodTrack =
2589 new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
2590 esdTrack->GetLabel(),
2596 (Short_t)esdTrack->Charge(),
2597 esdTrack->GetITSClusterMap(),
2600 kTRUE, // check if this is right
2601 kFALSE, // check if this is right
2602 AliAODTrack::kSecondary)
2604 aodTrack->ConvertAliPIDtoAODPID();
2607 cerr << "Error: event " << iEvent << " V0 " << nV0
2608 << " track " << negFromV0 << " has already been used!" << endl;
2611 // add it to the V0 array as well
2612 Double_t d0[2] = { 999., 99.};
2613 new(V0s[jV0s++]) AliAODv0(vV0, 999., 99., p_pos, p_neg, d0); // to be refined
2616 // end of the loop on V0s
2618 // Kinks: it is a big mess the access to the information in the kinks
2619 // The loop is on the tracks in order to find the mother and daugther of each kink
2622 for (Int_t iTrack=0; iTrack<nTracks; ++iTrack) {
2624 AliESDtrack * esdTrack = esd->GetTrack(iTrack);
2626 Int_t ikink = esdTrack->GetKinkIndex(0);
2629 // Negative kink index: mother, positive: daughter
2631 // Search for the second track of the kink
2633 for (Int_t jTrack = iTrack+1; jTrack<nTracks; ++jTrack) {
2635 AliESDtrack * esdTrack1 = esd->GetTrack(jTrack);
2637 Int_t jkink = esdTrack1->GetKinkIndex(0);
2639 if ( TMath::Abs(ikink)==TMath::Abs(jkink) ) {
2641 // The two tracks are from the same kink
2643 if (usedKink[TMath::Abs(ikink)-1]) continue; // skip used kinks
2646 Int_t idaughter = -1;
2648 if (ikink<0 && jkink>0) {
2653 else if (ikink>0 && jkink<0) {
2659 cerr << "Error: Wrong combination of kink indexes: "
2660 << ikink << " " << jkink << endl;
2664 // Add the mother track
2666 AliAODTrack * mother = NULL;
2668 if (!usedTrack[imother]) {
2670 usedTrack[imother] = kTRUE;
2672 AliESDtrack *esdTrack = esd->GetTrack(imother);
2673 esdTrack->GetPxPyPz(p);
2674 esdTrack->GetXYZ(pos);
2675 esdTrack->GetCovarianceXYZPxPyPz(covTr);
2676 esdTrack->GetESDpid(pid);
2679 new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
2680 esdTrack->GetLabel(),
2686 (Short_t)esdTrack->Charge(),
2687 esdTrack->GetITSClusterMap(),
2690 kTRUE, // check if this is right
2691 kTRUE, // check if this is right
2692 AliAODTrack::kPrimary);
2693 primary->AddDaughter(mother);
2694 mother->ConvertAliPIDtoAODPID();
2697 cerr << "Error: event " << iEvent << " kink " << TMath::Abs(ikink)-1
2698 << " track " << imother << " has already been used!" << endl;
2701 // Add the kink vertex
2702 AliESDkink * kink = esd->GetKink(TMath::Abs(ikink)-1);
2704 AliAODVertex * vkink =
2705 new(vertices[jVertices++]) AliAODVertex(kink->GetPosition(),
2709 esdTrack->GetID(), // This is the track ID of the mother's track!
2710 AliAODVertex::kKink);
2711 // Add the daughter track
2713 AliAODTrack * daughter = NULL;
2715 if (!usedTrack[idaughter]) {
2717 usedTrack[idaughter] = kTRUE;
2719 AliESDtrack *esdTrack = esd->GetTrack(idaughter);
2720 esdTrack->GetPxPyPz(p);
2721 esdTrack->GetXYZ(pos);
2722 esdTrack->GetCovarianceXYZPxPyPz(covTr);
2723 esdTrack->GetESDpid(pid);
2726 new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
2727 esdTrack->GetLabel(),
2733 (Short_t)esdTrack->Charge(),
2734 esdTrack->GetITSClusterMap(),
2737 kTRUE, // check if this is right
2738 kTRUE, // check if this is right
2739 AliAODTrack::kPrimary);
2740 vkink->AddDaughter(daughter);
2741 daughter->ConvertAliPIDtoAODPID();
2744 cerr << "Error: event " << iEvent << " kink " << TMath::Abs(ikink)-1
2745 << " track " << idaughter << " has already been used!" << endl;
2751 vertices.Expand(jVertices);
2753 // Tracks (primary and orphan)
2754 for (Int_t nTrack = 0; nTrack < nTracks; ++nTrack) {
2756 if (usedTrack[nTrack]) continue;
2758 AliESDtrack *esdTrack = esd->GetTrack(nTrack);
2759 esdTrack->GetPxPyPz(p);
2760 esdTrack->GetXYZ(pos);
2761 esdTrack->GetCovarianceXYZPxPyPz(covTr);
2762 esdTrack->GetESDpid(pid);
2764 Float_t impactXY, impactZ;
2766 esdTrack->GetImpactParameters(impactXY,impactZ);
2769 // track inside the beam pipe
2771 primary->AddDaughter(aodTrack =
2772 new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
2773 esdTrack->GetLabel(),
2779 (Short_t)esdTrack->Charge(),
2780 esdTrack->GetITSClusterMap(),
2783 kTRUE, // check if this is right
2784 kTRUE, // check if this is right
2785 AliAODTrack::kPrimary)
2787 aodTrack->ConvertAliPIDtoAODPID();
2790 // outside the beam pipe: orphan track
2791 // Don't write them anymore!
2794 } // end of loop on tracks
2797 Int_t nMuTracks = esd->GetNumberOfMuonTracks();
2798 for (Int_t nMuTrack = 0; nMuTrack < nMuTracks; ++nMuTrack) {
2800 AliESDMuonTrack *esdMuTrack = esd->GetMuonTrack(nMuTrack);
2801 p[0] = esdMuTrack->Px();
2802 p[1] = esdMuTrack->Py();
2803 p[2] = esdMuTrack->Pz();
2804 pos[0] = primary->GetX();
2805 pos[1] = primary->GetY();
2806 pos[2] = primary->GetZ();
2808 // has to be changed once the muon pid is provided by the ESD
2809 for (Int_t i = 0; i < 10; pid[i++] = 0.); pid[AliAODTrack::kMuon]=1.;
2811 primary->AddDaughter(aodTrack =
2812 new(tracks[jTracks++]) AliAODTrack(0, // no ID provided
2813 0, // no label provided
2818 NULL, // no covariance matrix provided
2819 esdMuTrack->Charge(),
2820 0, // ITSClusterMap is set below
2823 kFALSE, // muon tracks are not used to fit the primary vtx
2824 kFALSE, // not used for vertex fit
2825 AliAODTrack::kPrimary)
2828 aodTrack->SetHitsPatternInTrigCh(esdMuTrack->GetHitsPatternInTrigCh());
2829 Int_t track2Trigger = esdMuTrack->GetMatchTrigger();
2830 aodTrack->SetMatchTrigger(track2Trigger);
2832 aodTrack->SetChi2MatchTrigger(esdMuTrack->GetChi2MatchTrigger());
2834 aodTrack->SetChi2MatchTrigger(0.);
2836 tracks.Expand(jTracks); // remove 'empty slots' due to unwritten tracks
2838 // Access to the AOD container of PMD clusters
2839 TClonesArray &pmdClusters = *(aod->GetPmdClusters());
2840 Int_t jPmdClusters=0;
2842 for (Int_t iPmd = 0; iPmd < nPmdClus; ++iPmd) {
2843 // file pmd clusters, to be revised!
2844 AliESDPmdTrack *pmdTrack = esd->GetPmdTrack(iPmd);
2847 Double_t pos[3] = { pmdTrack->GetClusterX(), pmdTrack->GetClusterY(), pmdTrack->GetClusterZ() };
2848 Double_t pid[9] = { 0., 0., 0., 0., 0., 0., 0., 0., 0. }; // to be revised!
2850 // assoc cluster not set
2851 new(pmdClusters[jPmdClusters++]) AliAODPmdCluster(iPmd, nLabel, label, pmdTrack->GetClusterADC(), pos, pid);
2854 // Access to the AOD container of clusters
2855 TClonesArray &caloClusters = *(aod->GetCaloClusters());
2858 for (Int_t iClust=0; iClust<nCaloClus; ++iClust) {
2860 AliESDCaloCluster * cluster = esd->GetCaloCluster(iClust);
2862 Int_t id = cluster->GetID();
2865 Float_t energy = cluster->E();
2866 cluster->GetPosition(posF);
2867 Char_t ttype=AliAODCluster::kUndef;
2869 if (cluster->GetClusterType() == AliESDCaloCluster::kPHOSCluster) {
2870 ttype=AliAODCluster::kPHOSNeutral;
2872 else if (cluster->GetClusterType() == AliESDCaloCluster::kEMCALClusterv1) {
2873 ttype = AliAODCluster::kEMCALClusterv1;
2877 AliAODCaloCluster *caloCluster = new(caloClusters[jClusters++]) AliAODCaloCluster(id,
2885 caloCluster->SetCaloCluster(); // to be refined!
2888 caloClusters.Expand(jClusters); // resize TObjArray to 'remove' slots for pseudo clusters
2889 // end of loop on calo clusters
2891 // fill EMCAL cell info
2892 if (esd->GetEMCALCells()) { // protection against missing ESD information
2893 AliESDCaloCells &esdEMcells = *(esd->GetEMCALCells());
2894 Int_t nEMcell = esdEMcells.GetNumberOfCells() ;
2896 AliAODCaloCells &aodEMcells = *(aod->GetEMCALCells());
2897 aodEMcells.CreateContainer(nEMcell);
2898 aodEMcells.SetType(AliAODCaloCells::kEMCAL);
2899 for (Int_t iCell = 0; iCell < nEMcell; iCell++) {
2900 aodEMcells.SetCell(iCell,esdEMcells.GetCellNumber(iCell),esdEMcells.GetAmplitude(iCell));
2905 // fill PHOS cell info
2906 if (esd->GetPHOSCells()) { // protection against missing ESD information
2907 AliESDCaloCells &esdPHcells = *(esd->GetPHOSCells());
2908 Int_t nPHcell = esdPHcells.GetNumberOfCells() ;
2910 AliAODCaloCells &aodPHcells = *(aod->GetPHOSCells());
2911 aodPHcells.CreateContainer(nPHcell);
2912 aodPHcells.SetType(AliAODCaloCells::kPHOS);
2913 for (Int_t iCell = 0; iCell < nPHcell; iCell++) {
2914 aodPHcells.SetCell(iCell,esdPHcells.GetCellNumber(iCell),esdPHcells.GetAmplitude(iCell));
2920 AliAODTracklets &SPDTracklets = *(aod->GetTracklets());
2921 const AliMultiplicity *mult = esd->GetMultiplicity();
2923 if (mult->GetNumberOfTracklets()>0) {
2924 SPDTracklets.CreateContainer(mult->GetNumberOfTracklets());
2926 for (Int_t n=0; n<mult->GetNumberOfTracklets(); n++) {
2927 SPDTracklets.SetTracklet(n, mult->GetTheta(n), mult->GetPhi(n), mult->GetDeltaPhi(n), mult->GetLabel(n));
2931 Printf("ERROR: AliMultiplicity could not be retrieved from ESD");
2934 delete [] usedTrack;
2938 // fill the tree for this event
2940 } // end of event loop
2942 aodTree->GetUserInfo()->Add(aod);
2944 // write the tree to the specified file
2945 aodFile = aodTree->GetCurrentFile();
2952 void AliReconstruction::WriteAlignmentData(AliESDEvent* esd)
2954 // Write space-points which are then used in the alignment procedures
2955 // For the moment only ITS, TRD and TPC
2957 // Load TOF clusters
2959 fLoader[3]->LoadRecPoints("read");
2960 TTree* tree = fLoader[3]->TreeR();
2962 AliError(Form("Can't get the %s cluster tree", fgkDetectorName[3]));
2965 fTracker[3]->LoadClusters(tree);
2967 Int_t ntracks = esd->GetNumberOfTracks();
2968 for (Int_t itrack = 0; itrack < ntracks; itrack++)
2970 AliESDtrack *track = esd->GetTrack(itrack);
2973 for (Int_t iDet = 3; iDet >= 0; iDet--)
2974 nsp += track->GetNcls(iDet);
2976 AliTrackPointArray *sp = new AliTrackPointArray(nsp);
2977 track->SetTrackPointArray(sp);
2979 for (Int_t iDet = 3; iDet >= 0; iDet--) {
2980 AliTracker *tracker = fTracker[iDet];
2981 if (!tracker) continue;
2982 Int_t nspdet = track->GetNcls(iDet);
2983 if (nspdet <= 0) continue;
2984 track->GetClusters(iDet,idx);
2988 while (isp2 < nspdet) {
2990 TString dets = fgkDetectorName[iDet];
2991 if ((fUseTrackingErrorsForAlignment.CompareTo(dets) == 0) ||
2992 fUseTrackingErrorsForAlignment.BeginsWith(dets+" ") ||
2993 fUseTrackingErrorsForAlignment.EndsWith(" "+dets) ||
2994 fUseTrackingErrorsForAlignment.Contains(" "+dets+" ")) {
2995 isvalid = tracker->GetTrackPointTrackingError(idx[isp2],p,track);
2997 isvalid = tracker->GetTrackPoint(idx[isp2],p);
3000 const Int_t kNTPCmax = 159;
3001 if (iDet==1 && isp2>kNTPCmax) break; // to be fixed
3002 if (!isvalid) continue;
3003 sp->AddPoint(isptrack,&p); isptrack++; isp++;
3009 fTracker[3]->UnloadClusters();
3010 fLoader[3]->UnloadRecPoints();
3014 //_____________________________________________________________________________
3015 void AliReconstruction::FillRawDataErrorLog(Int_t iEvent, AliESDEvent* esd)
3017 // The method reads the raw-data error log
3018 // accumulated within the rawReader.
3019 // It extracts the raw-data errors related to
3020 // the current event and stores them into
3021 // a TClonesArray inside the esd object.
3023 if (!fRawReader) return;
3025 for(Int_t i = 0; i < fRawReader->GetNumberOfErrorLogs(); i++) {
3027 AliRawDataErrorLog *log = fRawReader->GetErrorLog(i);
3029 if (iEvent != log->GetEventNumber()) continue;
3031 esd->AddRawDataErrorLog(log);
3036 TNamed* AliReconstruction::CopyFileToTNamed(TString fPath,TString fName){
3037 // Dump a file content into a char in TNamed
3039 in.open(fPath.Data(),ios::in | ios::binary|ios::ate);
3040 Int_t kBytes = (Int_t)in.tellg();
3041 printf("Size: %d \n",kBytes);
3044 char* memblock = new char [kBytes];
3045 in.seekg (0, ios::beg);
3046 in.read (memblock, kBytes);
3048 TString fData(memblock,kBytes);
3049 fn = new TNamed(fName,fData);
3050 printf("fData Size: %d \n",fData.Sizeof());
3051 printf("fName Size: %d \n",fName.Sizeof());
3052 printf("fn Size: %d \n",fn->Sizeof());
3056 AliInfo(Form("Could not Open %s\n",fPath.Data()));
3062 void AliReconstruction::TNamedToFile(TTree* fTree, TString fName){
3063 // This is not really needed in AliReconstruction at the moment
3064 // but can serve as a template
3066 TList *fList = fTree->GetUserInfo();
3067 TNamed *fn = (TNamed*)fList->FindObject(fName.Data());
3068 printf("fn Size: %d \n",fn->Sizeof());
3070 TString fTmp(fn->GetName()); // to be 100% sure in principle fName also works
3071 const char* cdata = fn->GetTitle();
3072 printf("fTmp Size %d\n",fTmp.Sizeof());
3074 int size = fn->Sizeof()-fTmp.Sizeof()-sizeof(UChar_t)-sizeof(Int_t); // see dfinition of TString::SizeOf()...
3075 printf("calculated size %d\n",size);
3076 ofstream out(fName.Data(),ios::out | ios::binary);
3077 out.write(cdata,size);
3082 //_____________________________________________________________________________
3083 AliQADataMakerRec * AliReconstruction::GetQADataMaker(Int_t iDet)
3085 // get the quality assurance data maker object and the loader for a detector
3087 if (fQADataMaker[iDet])
3088 return fQADataMaker[iDet];
3090 AliQADataMakerRec * qadm = NULL;
3091 if (iDet == fgkNDetectors) { //Global QA
3092 qadm = new AliGlobalQADataMaker();
3093 fQADataMaker[iDet] = qadm;
3097 // load the QA data maker object
3098 TPluginManager* pluginManager = gROOT->GetPluginManager();
3099 TString detName = fgkDetectorName[iDet];
3100 TString qadmName = "Ali" + detName + "QADataMakerRec";
3101 if (gAlice && !gAlice->GetDetector(detName) && (detName != "HLT"))
3104 // first check if a plugin is defined for the quality assurance data maker
3105 TPluginHandler* pluginHandler = pluginManager->FindHandler("AliQADataMakerRec", detName);
3106 // if not, add a plugin for it
3107 if (!pluginHandler) {
3108 AliDebug(1, Form("defining plugin for %s", qadmName.Data()));
3109 TString libs = gSystem->GetLibraries();
3110 if (libs.Contains("lib" + detName + "base.so") ||
3111 (gSystem->Load("lib" + detName + "base.so") >= 0)) {
3112 pluginManager->AddHandler("AliQADataMakerRec", detName,
3113 qadmName, detName + "qadm", qadmName + "()");
3115 pluginManager->AddHandler("AliQADataMakerRec", detName,
3116 qadmName, detName, qadmName + "()");
3118 pluginHandler = pluginManager->FindHandler("AliQADataMakerRec", detName);
3120 if (pluginHandler && (pluginHandler->LoadPlugin() == 0)) {
3121 qadm = (AliQADataMakerRec *) pluginHandler->ExecPlugin(0);
3124 fQADataMaker[iDet] = qadm;
3129 //_____________________________________________________________________________
3130 Bool_t AliReconstruction::RunQA(const char* detectors, AliESDEvent *& esd)
3132 // run the Quality Assurance data producer
3134 AliCodeTimerAuto("")
3135 TString detStr = detectors;
3136 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
3137 if (!IsSelected(fgkDetectorName[iDet], detStr))
3139 AliQADataMakerRec * qadm = GetQADataMaker(iDet);
3142 AliCodeTimerStart(Form("running quality assurance data maker for %s", fgkDetectorName[iDet]));
3143 AliInfo(Form("running quality assurance data maker for %s", fgkDetectorName[iDet]));
3145 qadm->Exec(AliQA::kESDS, esd) ;
3148 AliCodeTimerStop(Form("running quality assurance data maker for %s", fgkDetectorName[iDet]));
3150 if ((detStr.CompareTo("ALL") != 0) && !detStr.IsNull()) {
3151 AliError(Form("the following detectors were not found: %s",
3161 //_____________________________________________________________________________
3162 void AliReconstruction::CheckQA()
3164 // check the QA of SIM for this run and remove the detectors
3165 // with status Fatal
3167 TString newRunLocalReconstruction ;
3168 TString newRunTracking ;
3169 TString newFillESD ;
3171 for (Int_t iDet = 0; iDet < AliQA::kNDET; iDet++) {
3172 TString detName(AliQA::GetDetName(iDet)) ;
3173 AliQA * qa = AliQA::Instance(AliQA::DETECTORINDEX_t(iDet)) ;
3174 if ( qa->IsSet(AliQA::DETECTORINDEX_t(iDet), AliQA::kSIM, AliQA::kFATAL)) {
3175 AliInfo(Form("QA status for %s in Hits and/or SDIGITS and/or Digits was Fatal; No reconstruction performed", detName.Data())) ;
3177 if ( fRunLocalReconstruction.Contains(AliQA::GetDetName(iDet)) ||
3178 fRunLocalReconstruction.Contains("ALL") ) {
3179 newRunLocalReconstruction += detName ;
3180 newRunLocalReconstruction += " " ;
3182 if ( fRunTracking.Contains(AliQA::GetDetName(iDet)) ||
3183 fRunTracking.Contains("ALL") ) {
3184 newRunTracking += detName ;
3185 newRunTracking += " " ;
3187 if ( fFillESD.Contains(AliQA::GetDetName(iDet)) ||
3188 fFillESD.Contains("ALL") ) {
3189 newFillESD += detName ;
3194 fRunLocalReconstruction = newRunLocalReconstruction ;
3195 fRunTracking = newRunTracking ;
3196 fFillESD = newFillESD ;
3199 //_____________________________________________________________________________
3200 Int_t AliReconstruction::GetDetIndex(const char* detector)
3202 // return the detector index corresponding to detector
3204 for (index = 0; index < fgkNDetectors ; index++) {
3205 if ( strcmp(detector, fgkDetectorName[index]) == 0 )
3210 //_____________________________________________________________________________
3211 Bool_t AliReconstruction::FinishPlaneEff() {
3213 // Here execute all the necessary operationis, at the end of the tracking phase,
3214 // in case that evaluation of PlaneEfficiencies was required for some detector.
3215 // E.g., write into a DataBase file the PlaneEfficiency which have been evaluated.
3217 // This Preliminary version works only FOR ITS !!!!!
3218 // other detectors (TOF,TRD, etc. have to develop their specific codes)
3221 // Return: kTRUE if all operations have been done properly, kFALSE otherwise
3224 //for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
3225 for (Int_t iDet = 0; iDet < 1; iDet++) { // for the time being only ITS
3226 //if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
3227 if(fTracker[iDet]) {
3228 AliPlaneEff *planeeff=fTracker[iDet]->GetPlaneEff();
3229 ret=planeeff->WriteIntoCDB();
3230 if(planeeff->GetCreateHistos()) {
3231 TString name="PlaneEffHisto";
3232 name+=fgkDetectorName[iDet];
3234 ret*=planeeff->WriteHistosToFile(name,"RECREATE");
3240 //_____________________________________________________________________________
3241 Bool_t AliReconstruction::InitPlaneEff() {
3243 // Here execute all the necessary operations, before of the tracking phase,
3244 // for the evaluation of PlaneEfficiencies, in case required for some detectors.
3245 // E.g., read from a DataBase file a first evaluation of the PlaneEfficiency
3246 // which should be updated/recalculated.
3248 // This Preliminary version will work only FOR ITS !!!!!
3249 // other detectors (TOF,TRD, etc. have to develop their specific codes)
3252 // Return: kTRUE if all operations have been done properly, kFALSE otherwise
3254 AliWarning(Form("Implementation of this method not yet done !! Method return kTRUE"));