1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
18 ///////////////////////////////////////////////////////////////////////////////
20 // class for running the reconstruction //
22 // Clusters and tracks are created for all detectors and all events by //
25 // AliReconstruction rec; //
28 // The Run method returns kTRUE in case of successful execution. //
30 // If the input to the reconstruction are not simulated digits but raw data, //
31 // this can be specified by an argument of the Run method or by the method //
33 // rec.SetInput("..."); //
35 // The input formats and the corresponding argument are: //
36 // - DDL raw data files: directory name, ends with "/" //
37 // - raw data root file: root file name, extension ".root" //
38 // - raw data DATE file: DATE file name, any other non-empty string //
39 // - MC root files : empty string, default //
41 // By default all events are reconstructed. The reconstruction can be //
42 // limited to a range of events by giving the index of the first and the //
43 // last event as an argument to the Run method or by calling //
45 // rec.SetEventRange(..., ...); //
47 // The index -1 (default) can be used for the last event to indicate no //
48 // upper limit of the event range. //
50 // In case of raw-data reconstruction the user can modify the default //
51 // number of events per digits/clusters/tracks file. In case the option //
52 // is not used the number is set 1. In case the user provides 0, than //
53 // the number of events is equal to the number of events inside the //
54 // raw-data file (i.e. one digits/clusters/tracks file): //
56 // rec.SetNumberOfEventsPerFile(...); //
59 // The name of the galice file can be changed from the default //
60 // "galice.root" by passing it as argument to the AliReconstruction //
61 // constructor or by //
63 // rec.SetGAliceFile("..."); //
65 // The local reconstruction can be switched on or off for individual //
68 // rec.SetRunLocalReconstruction("..."); //
70 // The argument is a (case sensitive) string with the names of the //
71 // detectors separated by a space. The special string "ALL" selects all //
72 // available detectors. This is the default. //
74 // The reconstruction of the primary vertex position can be switched off by //
76 // rec.SetRunVertexFinder(kFALSE); //
78 // The tracking and the creation of ESD tracks can be switched on for //
79 // selected detectors by //
81 // rec.SetRunTracking("..."); //
83 // Uniform/nonuniform field tracking switches (default: uniform field) //
85 // rec.SetUniformFieldTracking(); ( rec.SetUniformFieldTracking(kFALSE); ) //
87 // The filling of additional ESD information can be steered by //
89 // rec.SetFillESD("..."); //
91 // Again, for both methods the string specifies the list of detectors. //
92 // The default is "ALL". //
94 // The call of the shortcut method //
96 // rec.SetRunReconstruction("..."); //
98 // is equivalent to calling SetRunLocalReconstruction, SetRunTracking and //
99 // SetFillESD with the same detector selecting string as argument. //
101 // The reconstruction requires digits or raw data as input. For the creation //
102 // of digits and raw data have a look at the class AliSimulation. //
104 // For debug purposes the method SetCheckPointLevel can be used. If the //
105 // argument is greater than 0, files with ESD events will be written after //
106 // selected steps of the reconstruction for each event: //
107 // level 1: after tracking and after filling of ESD (final) //
108 // level 2: in addition after each tracking step //
109 // level 3: in addition after the filling of ESD for each detector //
110 // If a final check point file exists for an event, this event will be //
111 // skipped in the reconstruction. The tracking and the filling of ESD for //
112 // a detector will be skipped as well, if the corresponding check point //
113 // file exists. The ESD event will then be loaded from the file instead. //
115 ///////////////////////////////////////////////////////////////////////////////
122 #include <TPluginManager.h>
123 #include <TGeoManager.h>
124 #include <TLorentzVector.h>
128 #include "AliReconstruction.h"
129 #include "AliCodeTimer.h"
130 #include "AliReconstructor.h"
132 #include "AliRunLoader.h"
134 #include "AliRawReaderFile.h"
135 #include "AliRawReaderDate.h"
136 #include "AliRawReaderRoot.h"
137 #include "AliRawEventHeaderBase.h"
138 #include "AliESDEvent.h"
139 #include "AliESDMuonTrack.h"
140 #include "AliESDfriend.h"
141 #include "AliESDVertex.h"
142 #include "AliESDcascade.h"
143 #include "AliESDkink.h"
144 #include "AliESDtrack.h"
145 #include "AliESDCaloCluster.h"
146 #include "AliESDCaloCells.h"
147 #include "AliMultiplicity.h"
148 #include "AliTracker.h"
149 #include "AliVertexer.h"
150 #include "AliVertexerTracks.h"
151 #include "AliV0vertexer.h"
152 #include "AliCascadeVertexer.h"
153 #include "AliHeader.h"
154 #include "AliGenEventHeader.h"
156 #include "AliESDpid.h"
157 #include "AliESDtrack.h"
158 #include "AliESDPmdTrack.h"
160 #include "AliESDTagCreator.h"
161 #include "AliAODTagCreator.h"
163 #include "AliGeomManager.h"
164 #include "AliTrackPointArray.h"
165 #include "AliCDBManager.h"
166 #include "AliCDBStorage.h"
167 #include "AliCDBEntry.h"
168 #include "AliAlignObj.h"
170 #include "AliCentralTrigger.h"
171 #include "AliCTPRawStream.h"
173 #include "AliAODEvent.h"
174 #include "AliAODHeader.h"
175 #include "AliAODTrack.h"
176 #include "AliAODVertex.h"
177 #include "AliAODv0.h"
178 #include "AliAODJet.h"
179 #include "AliAODCaloCells.h"
180 #include "AliAODCaloCluster.h"
181 #include "AliAODPmdCluster.h"
182 #include "AliAODFmdCluster.h"
183 #include "AliAODTracklets.h"
185 #include "AliQADataMakerRec.h"
186 #include "AliGlobalQADataMaker.h"
188 #include "AliQADataMakerSteer.h"
190 #include "AliSysInfo.h" // memory snapshots
193 ClassImp(AliReconstruction)
196 //_____________________________________________________________________________
197 const char* AliReconstruction::fgkDetectorName[AliReconstruction::fgkNDetectors] = {"ITS", "TPC", "TRD", "TOF", "PHOS", "HMPID", "EMCAL", "MUON", "FMD", "ZDC", "PMD", "T0", "VZERO", "ACORDE", "HLT"};
199 //_____________________________________________________________________________
200 AliReconstruction::AliReconstruction(const char* gAliceFilename,
201 const char* name, const char* title) :
204 fUniformField(kTRUE),
205 fRunVertexFinder(kTRUE),
206 fRunHLTTracking(kFALSE),
207 fRunMuonTracking(kFALSE),
209 fRunCascadeFinder(kTRUE),
210 fStopOnError(kFALSE),
211 fWriteAlignmentData(kFALSE),
212 fWriteESDfriend(kFALSE),
214 fFillTriggerESD(kTRUE),
222 fRunLocalReconstruction("ALL"),
225 fUseTrackingErrorsForAlignment(""),
226 fGAliceFileName(gAliceFilename),
231 fNumberOfEventsPerFile(1),
234 fLoadAlignFromCDB(kTRUE),
235 fLoadAlignData("ALL"),
242 fDiamondProfile(NULL),
243 fMeanVertexConstraint(kTRUE),
247 fAlignObjArray(NULL),
250 fInitCDBCalled(kFALSE),
251 fSetRunNumberFromDataCalled(kFALSE),
253 fRunGlobalQA(kFALSE),
256 // create reconstruction object with default parameters
258 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
259 fReconstructor[iDet] = NULL;
260 fLoader[iDet] = NULL;
261 fTracker[iDet] = NULL;
262 fQADataMaker[iDet] = NULL;
263 fQACycles[iDet] = 999999;
265 fQADataMaker[fgkNDetectors]=NULL; //Global QA
269 //_____________________________________________________________________________
270 AliReconstruction::AliReconstruction(const AliReconstruction& rec) :
273 fUniformField(rec.fUniformField),
274 fRunVertexFinder(rec.fRunVertexFinder),
275 fRunHLTTracking(rec.fRunHLTTracking),
276 fRunMuonTracking(rec.fRunMuonTracking),
277 fRunV0Finder(rec.fRunV0Finder),
278 fRunCascadeFinder(rec.fRunCascadeFinder),
279 fStopOnError(rec.fStopOnError),
280 fWriteAlignmentData(rec.fWriteAlignmentData),
281 fWriteESDfriend(rec.fWriteESDfriend),
282 fWriteAOD(rec.fWriteAOD),
283 fFillTriggerESD(rec.fFillTriggerESD),
285 fCleanESD(rec.fCleanESD),
286 fV0DCAmax(rec.fV0DCAmax),
287 fV0CsPmin(rec.fV0CsPmin),
291 fRunLocalReconstruction(rec.fRunLocalReconstruction),
292 fRunTracking(rec.fRunTracking),
293 fFillESD(rec.fFillESD),
294 fUseTrackingErrorsForAlignment(rec.fUseTrackingErrorsForAlignment),
295 fGAliceFileName(rec.fGAliceFileName),
297 fEquipIdMap(rec.fEquipIdMap),
298 fFirstEvent(rec.fFirstEvent),
299 fLastEvent(rec.fLastEvent),
300 fNumberOfEventsPerFile(rec.fNumberOfEventsPerFile),
303 fLoadAlignFromCDB(rec.fLoadAlignFromCDB),
304 fLoadAlignData(rec.fLoadAlignData),
305 fESDPar(rec.fESDPar),
311 fDiamondProfile(NULL),
312 fMeanVertexConstraint(rec.fMeanVertexConstraint),
316 fAlignObjArray(rec.fAlignObjArray),
317 fCDBUri(rec.fCDBUri),
319 fInitCDBCalled(rec.fInitCDBCalled),
320 fSetRunNumberFromDataCalled(rec.fSetRunNumberFromDataCalled),
322 fRunGlobalQA(rec.fRunGlobalQA),
323 fInLoopQA(rec.fInLoopQA)
327 for (Int_t i = 0; i < rec.fOptions.GetEntriesFast(); i++) {
328 if (rec.fOptions[i]) fOptions.Add(rec.fOptions[i]->Clone());
330 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
331 fReconstructor[iDet] = NULL;
332 fLoader[iDet] = NULL;
333 fTracker[iDet] = NULL;
334 fQADataMaker[iDet] = NULL;
335 fQACycles[iDet] = rec.fQACycles[iDet];
337 fQADataMaker[fgkNDetectors]=NULL; //Global QA
338 for (Int_t i = 0; i < rec.fSpecCDBUri.GetEntriesFast(); i++) {
339 if (rec.fSpecCDBUri[i]) fSpecCDBUri.Add(rec.fSpecCDBUri[i]->Clone());
343 //_____________________________________________________________________________
344 AliReconstruction& AliReconstruction::operator = (const AliReconstruction& rec)
346 // assignment operator
348 this->~AliReconstruction();
349 new(this) AliReconstruction(rec);
353 //_____________________________________________________________________________
354 AliReconstruction::~AliReconstruction()
360 fSpecCDBUri.Delete();
362 AliCodeTimer::Instance()->Print();
365 //_____________________________________________________________________________
366 void AliReconstruction::InitCDB()
368 // activate a default CDB storage
369 // First check if we have any CDB storage set, because it is used
370 // to retrieve the calibration and alignment constants
372 if (fInitCDBCalled) return;
373 fInitCDBCalled = kTRUE;
375 AliCDBManager* man = AliCDBManager::Instance();
376 if (man->IsDefaultStorageSet())
378 AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
379 AliWarning("Default CDB storage has been already set !");
380 AliWarning(Form("Ignoring the default storage declared in AliReconstruction: %s",fCDBUri.Data()));
381 AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
382 fCDBUri = man->GetDefaultStorage()->GetURI();
385 if (fCDBUri.Length() > 0)
387 AliDebug(2,"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
388 AliDebug(2, Form("Default CDB storage is set to: %s", fCDBUri.Data()));
389 AliDebug(2, "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
391 fCDBUri="local://$ALICE_ROOT";
392 AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
393 AliWarning("Default CDB storage not yet set !!!!");
394 AliWarning(Form("Setting it now to: %s", fCDBUri.Data()));
395 AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
398 man->SetDefaultStorage(fCDBUri);
401 // Now activate the detector specific CDB storage locations
402 for (Int_t i = 0; i < fSpecCDBUri.GetEntriesFast(); i++) {
403 TObject* obj = fSpecCDBUri[i];
405 AliDebug(2, "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
406 AliDebug(2, Form("Specific CDB storage for %s is set to: %s",obj->GetName(),obj->GetTitle()));
407 AliDebug(2, "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
408 man->SetSpecificStorage(obj->GetName(), obj->GetTitle());
413 //_____________________________________________________________________________
414 void AliReconstruction::SetDefaultStorage(const char* uri) {
415 // Store the desired default CDB storage location
416 // Activate it later within the Run() method
422 //_____________________________________________________________________________
423 void AliReconstruction::SetSpecificStorage(const char* calibType, const char* uri) {
424 // Store a detector-specific CDB storage location
425 // Activate it later within the Run() method
427 AliCDBPath aPath(calibType);
428 if(!aPath.IsValid()){
429 // if calibType is not wildcard but it is a valid detector, add "/*" to make it a valid path
430 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
431 if(!strcmp(calibType, fgkDetectorName[iDet])) {
432 aPath.SetPath(Form("%s/*", calibType));
433 AliInfo(Form("Path for specific storage set to %s", aPath.GetPath().Data()));
437 if(!aPath.IsValid()){
438 AliError(Form("Not a valid path or detector: %s", calibType));
443 // // check that calibType refers to a "valid" detector name
444 // Bool_t isDetector = kFALSE;
445 // for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
446 // TString detName = fgkDetectorName[iDet];
447 // if(aPath.GetLevel0() == detName) {
448 // isDetector = kTRUE;
454 // AliError(Form("Not a valid detector: %s", aPath.GetLevel0().Data()));
458 TObject* obj = fSpecCDBUri.FindObject(aPath.GetPath().Data());
459 if (obj) fSpecCDBUri.Remove(obj);
460 fSpecCDBUri.Add(new TNamed(aPath.GetPath().Data(), uri));
464 //_____________________________________________________________________________
465 Bool_t AliReconstruction::SetRunNumberFromData()
467 // The method is called in Run() in order
468 // to set a correct run number.
469 // In case of raw data reconstruction the
470 // run number is taken from the raw data header
472 if (fSetRunNumberFromDataCalled) return kTRUE;
473 fSetRunNumberFromDataCalled = kTRUE;
475 AliCDBManager* man = AliCDBManager::Instance();
477 if(man->GetRun() > 0) {
478 AliWarning("Run number is taken from event header! Ignoring settings in AliCDBManager!");
482 AliError("No run loader is found !");
485 // read run number from gAlice
486 if(fRunLoader->GetAliRun())
487 AliCDBManager::Instance()->SetRun(fRunLoader->GetHeader()->GetRun());
490 if(fRawReader->NextEvent()) {
491 AliCDBManager::Instance()->SetRun(fRawReader->GetRunNumber());
492 fRawReader->RewindEvents();
495 AliError("No raw-data events found !");
500 AliError("Neither gAlice nor RawReader objects are found !");
510 //_____________________________________________________________________________
511 void AliReconstruction::SetCDBLock() {
512 // Set CDB lock: from now on it is forbidden to reset the run number
513 // or the default storage or to activate any further storage!
515 AliCDBManager::Instance()->SetLock(1);
518 //_____________________________________________________________________________
519 Bool_t AliReconstruction::MisalignGeometry(const TString& detectors)
521 // Read the alignment objects from CDB.
522 // Each detector is supposed to have the
523 // alignment objects in DET/Align/Data CDB path.
524 // All the detector objects are then collected,
525 // sorted by geometry level (starting from ALIC) and
526 // then applied to the TGeo geometry.
527 // Finally an overlaps check is performed.
529 // Load alignment data from CDB and fill fAlignObjArray
530 if(fLoadAlignFromCDB){
532 TString detStr = detectors;
533 TString loadAlObjsListOfDets = "";
535 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
536 if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
537 loadAlObjsListOfDets += fgkDetectorName[iDet];
538 loadAlObjsListOfDets += " ";
539 } // end loop over detectors
540 loadAlObjsListOfDets.Prepend("GRP "); //add alignment objects for non-sensitive modules
541 AliGeomManager::ApplyAlignObjsFromCDB(loadAlObjsListOfDets.Data());
543 // Check if the array with alignment objects was
544 // provided by the user. If yes, apply the objects
545 // to the present TGeo geometry
546 if (fAlignObjArray) {
547 if (gGeoManager && gGeoManager->IsClosed()) {
548 if (AliGeomManager::ApplyAlignObjsToGeom(*fAlignObjArray) == kFALSE) {
549 AliError("The misalignment of one or more volumes failed!"
550 "Compare the list of simulated detectors and the list of detector alignment data!");
555 AliError("Can't apply the misalignment! gGeoManager doesn't exist or it is still opened!");
561 delete fAlignObjArray; fAlignObjArray=0;
566 //_____________________________________________________________________________
567 void AliReconstruction::SetGAliceFile(const char* fileName)
569 // set the name of the galice file
571 fGAliceFileName = fileName;
574 //_____________________________________________________________________________
575 void AliReconstruction::SetOption(const char* detector, const char* option)
577 // set options for the reconstruction of a detector
579 TObject* obj = fOptions.FindObject(detector);
580 if (obj) fOptions.Remove(obj);
581 fOptions.Add(new TNamed(detector, option));
585 //_____________________________________________________________________________
586 Bool_t AliReconstruction::Run(const char* input)
588 // run the reconstruction
593 if (!input) input = fInput.Data();
594 TString fileName(input);
595 if (fileName.EndsWith("/")) {
596 fRawReader = new AliRawReaderFile(fileName);
597 } else if (fileName.EndsWith(".root")) {
598 fRawReader = new AliRawReaderRoot(fileName);
599 } else if (!fileName.IsNull()) {
600 fRawReader = new AliRawReaderDate(fileName);
601 fRawReader->SelectEvents(7);
603 if (!fEquipIdMap.IsNull() && fRawReader)
604 fRawReader->LoadEquipmentIdsMap(fEquipIdMap);
606 AliSysInfo::AddStamp("Start");
607 // get the run loader
608 if (!InitRunLoader()) return kFALSE;
609 AliSysInfo::AddStamp("LoadLoader");
611 // Initialize the CDB storage
614 AliSysInfo::AddStamp("LoadCDB");
616 // Set run number in CDBManager (if it is not already set by the user)
617 if (!SetRunNumberFromData()) if (fStopOnError) return kFALSE;
619 // Set CDB lock: from now on it is forbidden to reset the run number
620 // or the default storage or to activate any further storage!
623 // Import ideal TGeo geometry and apply misalignment
625 TString geom(gSystem->DirName(fGAliceFileName));
626 geom += "/geometry.root";
627 AliGeomManager::LoadGeometry(geom.Data());
628 if (!gGeoManager) if (fStopOnError) return kFALSE;
631 if (!MisalignGeometry(fLoadAlignData)) if (fStopOnError) return kFALSE;
632 AliSysInfo::AddStamp("LoadGeom");
635 AliQADataMakerSteer qas ;
636 if (fRunQA && fRawReader) qas.Run(fRunLocalReconstruction, fRawReader) ;
637 // checking the QA of previous steps
641 // local reconstruction
642 if (!fRunLocalReconstruction.IsNull()) {
643 if (!RunLocalReconstruction(fRunLocalReconstruction)) {
644 if (fStopOnError) {CleanUp(); return kFALSE;}
650 if (fRunVertexFinder && !CreateVertexer()) {
656 AliSysInfo::AddStamp("Vertexer");
659 if (!fRunTracking.IsNull() && !CreateTrackers(fRunTracking)) {
665 AliSysInfo::AddStamp("LoadTrackers");
667 // get the possibly already existing ESD file and tree
668 AliESDEvent* esd = new AliESDEvent(); AliESDEvent* hltesd = new AliESDEvent();
669 TFile* fileOld = NULL;
670 TTree* treeOld = NULL; TTree *hlttreeOld = NULL;
671 if (!gSystem->AccessPathName("AliESDs.root")){
672 gSystem->CopyFile("AliESDs.root", "AliESDs.old.root", kTRUE);
673 fileOld = TFile::Open("AliESDs.old.root");
674 if (fileOld && fileOld->IsOpen()) {
675 treeOld = (TTree*) fileOld->Get("esdTree");
676 if (treeOld)esd->ReadFromTree(treeOld);
677 hlttreeOld = (TTree*) fileOld->Get("HLTesdTree");
678 if (hlttreeOld) hltesd->ReadFromTree(hlttreeOld);
682 // create the ESD output file and tree
683 TFile* file = TFile::Open("AliESDs.root", "RECREATE");
684 file->SetCompressionLevel(2);
685 if (!file->IsOpen()) {
686 AliError("opening AliESDs.root failed");
687 if (fStopOnError) {CleanUp(file, fileOld); return kFALSE;}
690 TTree* tree = new TTree("esdTree", "Tree with ESD objects");
691 esd = new AliESDEvent();
692 esd->CreateStdContent();
693 esd->WriteToTree(tree);
695 TTree* hlttree = new TTree("HLTesdTree", "Tree with HLT ESD objects");
696 hltesd = new AliESDEvent();
697 hltesd->CreateStdContent();
698 hltesd->WriteToTree(hlttree);
701 delete esd; delete hltesd;
702 esd = NULL; hltesd = NULL;
704 // create the branch with ESD additions
708 AliESDfriend *esdf = 0;
709 if (fWriteESDfriend) {
710 esdf = new AliESDfriend();
711 TBranch *br=tree->Branch("ESDfriend.","AliESDfriend", &esdf);
712 br->SetFile("AliESDfriends.root");
713 esd->AddObject(esdf);
717 // Get the GRP CDB entry
718 AliCDBEntry* entryGRP = AliCDBManager::Instance()->Get("GRP/GRP/Data");
721 fGRPList = dynamic_cast<TList*> (entryGRP->GetObject());
723 AliError("No GRP entry found in OCDB!");
726 // Get the diamond profile from OCDB
727 AliCDBEntry* entry = AliCDBManager::Instance()
728 ->Get("GRP/Calib/MeanVertex");
731 fDiamondProfile = dynamic_cast<AliESDVertex*> (entry->GetObject());
733 AliError("No diamond profile found in OCDB!");
736 AliVertexerTracks tVertexer(AliTracker::GetBz());
737 if(fDiamondProfile && fMeanVertexConstraint) tVertexer.SetVtxStart(fDiamondProfile);
739 if (fRawReader) fRawReader->RewindEvents();
742 gSystem->GetProcInfo(&ProcInfo);
743 AliInfo(Form("Current memory usage %d %d", ProcInfo.fMemResident, ProcInfo.fMemVirtual));
746 //Initialize the QA and start of cycle for out-of-cycle QA
748 TString detStr(fFillESD);
749 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
750 if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
751 AliQADataMakerRec *qadm = GetQADataMaker(iDet);
753 AliInfo(Form("Initializing the QA data maker for %s",
754 fgkDetectorName[iDet]));
755 qadm->Init(AliQA::kRECPOINTS, AliCDBManager::Instance()->GetRun());
756 qadm->Init(AliQA::kESDS, AliCDBManager::Instance()->GetRun());
758 qadm->StartOfCycle(AliQA::kRECPOINTS);
759 qadm->StartOfCycle(AliQA::kESDS,"same");
763 AliQADataMakerRec *qadm = GetQADataMaker(fgkNDetectors);
764 AliInfo(Form("Initializing the global QA data maker"));
766 qadm->Init(AliQA::kRECPOINTS, AliCDBManager::Instance()->GetRun());
767 AliTracker::SetResidualsArray(arr);
769 qadm->StartOfCycle(AliQA::kRECPOINTS);
775 //******* The loop over events
776 for (Int_t iEvent = 0; iEvent < fRunLoader->GetNumberOfEvents(); iEvent++) {
777 if (fRawReader) fRawReader->NextEvent();
778 if ((iEvent < fFirstEvent) || ((fLastEvent >= 0) && (iEvent > fLastEvent))) {
779 // copy old ESD to the new one
781 esd->ReadFromTree(treeOld);
782 treeOld->GetEntry(iEvent);
786 esd->ReadFromTree(hlttreeOld);
787 hlttreeOld->GetEntry(iEvent);
793 AliInfo(Form("processing event %d", iEvent));
795 //Start of cycle for the in-loop QA
796 if (fRunQA && fInLoopQA) {
797 TString detStr(fFillESD);
798 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
799 if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
800 AliQADataMakerRec *qadm = GetQADataMaker(iDet);
802 qadm->StartOfCycle(AliQA::kRECPOINTS);
803 qadm->StartOfCycle(AliQA::kESDS, "same") ;
806 AliQADataMakerRec *qadm = GetQADataMaker(fgkNDetectors);
807 qadm->StartOfCycle(AliQA::kRECPOINTS);
811 fRunLoader->GetEvent(iEvent);
814 sprintf(aFileName, "ESD_%d.%d_final.root",
815 fRunLoader->GetHeader()->GetRun(),
816 fRunLoader->GetHeader()->GetEventNrInRun());
817 if (!gSystem->AccessPathName(aFileName)) continue;
819 // local signle event reconstruction
820 if (!fRunLocalReconstruction.IsNull()) {
821 if (!RunLocalEventReconstruction(fRunLocalReconstruction)) {
822 if (fStopOnError) {CleanUp(file, fileOld); return kFALSE;}
826 esd->SetRunNumber(fRunLoader->GetHeader()->GetRun());
827 hltesd->SetRunNumber(fRunLoader->GetHeader()->GetRun());
828 esd->SetEventNumberInFile(fRunLoader->GetHeader()->GetEventNrInRun());
829 hltesd->SetEventNumberInFile(fRunLoader->GetHeader()->GetEventNrInRun());
831 // Set magnetic field from the tracker
832 esd->SetMagneticField(AliTracker::GetBz());
833 hltesd->SetMagneticField(AliTracker::GetBz());
837 // Fill raw-data error log into the ESD
838 if (fRawReader) FillRawDataErrorLog(iEvent,esd);
841 if (fRunVertexFinder) {
842 if (!ReadESD(esd, "vertex")) {
843 if (!RunVertexFinder(esd)) {
844 if (fStopOnError) {CleanUp(file, fileOld); return kFALSE;}
846 if (fCheckPointLevel > 0) WriteESD(esd, "vertex");
851 if (!fRunTracking.IsNull()) {
852 if (fRunHLTTracking) {
853 hltesd->SetVertex(esd->GetVertex());
854 if (!RunHLTTracking(hltesd)) {
855 if (fStopOnError) {CleanUp(file, fileOld); return kFALSE;}
861 if (!fRunTracking.IsNull()) {
862 if (fRunMuonTracking) {
863 if (!RunMuonTracking(esd)) {
864 if (fStopOnError) {CleanUp(file, fileOld); return kFALSE;}
870 if (!fRunTracking.IsNull()) {
871 if (!ReadESD(esd, "tracking")) {
872 if (!RunTracking(esd)) {
873 if (fStopOnError) {CleanUp(file, fileOld); return kFALSE;}
875 if (fCheckPointLevel > 0) WriteESD(esd, "tracking");
880 if (!fFillESD.IsNull()) {
881 if (!FillESD(esd, fFillESD)) {
882 if (fStopOnError) {CleanUp(file, fileOld); return kFALSE;}
886 // fill Event header information from the RawEventHeader
887 if (fRawReader){FillRawEventHeaderESD(esd);}
890 AliESDpid::MakePID(esd);
891 if (fCheckPointLevel > 1) WriteESD(esd, "PID");
893 if (fFillTriggerESD) {
894 if (!ReadESD(esd, "trigger")) {
895 if (!FillTriggerESD(esd)) {
896 if (fStopOnError) {CleanUp(file, fileOld); return kFALSE;}
898 if (fCheckPointLevel > 1) WriteESD(esd, "trigger");
904 //Try to improve the reconstructed primary vertex position using the tracks
905 AliESDVertex *pvtx=0;
906 Bool_t dovertex=kTRUE;
907 TObject* obj = fOptions.FindObject("ITS");
909 TString optITS = obj->GetTitle();
910 if (optITS.Contains("cosmics") || optITS.Contains("COSMICS"))
913 if(dovertex) pvtx=tVertexer.FindPrimaryVertex(esd);
914 if(fDiamondProfile) esd->SetDiamond(fDiamondProfile);
917 if (pvtx->GetStatus()) {
918 // Store the improved primary vertex
919 esd->SetPrimaryVertex(pvtx);
920 // Propagate the tracks to the DCA to the improved primary vertex
921 Double_t somethingbig = 777.;
922 Double_t bz = esd->GetMagneticField();
923 Int_t nt=esd->GetNumberOfTracks();
925 AliESDtrack *t = esd->GetTrack(nt);
926 t->RelateToVertex(pvtx, bz, somethingbig);
933 vtxer.Tracks2V0vertices(esd);
935 if (fRunCascadeFinder) {
937 AliCascadeVertexer cvtxer;
938 cvtxer.V0sTracks2CascadeVertices(esd);
943 if (fCleanESD) CleanESD(esd);
944 if (fWriteESDfriend) {
945 esdf->~AliESDfriend();
946 new (esdf) AliESDfriend(); // Reset...
947 esd->GetESDfriend(esdf);
954 if (fCheckPointLevel > 0) WriteESD(esd, "final");
957 if (fWriteESDfriend) {
958 esdf->~AliESDfriend();
959 new (esdf) AliESDfriend(); // Reset...
962 gSystem->GetProcInfo(&ProcInfo);
963 AliInfo(Form("Event %d -> Current memory usage %d %d",iEvent, ProcInfo.fMemResident, ProcInfo.fMemVirtual));
966 // End of cycle for the in-loop QA
967 if (fRunQA && fInLoopQA) {
968 RunQA(fFillESD.Data(), esd);
969 TString detStr(fFillESD);
970 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
971 if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
972 AliQADataMakerRec * qadm = GetQADataMaker(iDet);
974 qadm->EndOfCycle(AliQA::kRECPOINTS);
975 qadm->EndOfCycle(AliQA::kESDS);
979 AliQADataMakerRec *qadm = GetQADataMaker(fgkNDetectors);
981 qadm->EndOfCycle(AliQA::kRECPOINTS);
987 //******** End of the loop over events
991 tree->GetUserInfo()->Add(esd);
992 hlttree->GetUserInfo()->Add(hltesd);
994 const TMap *cdbMap = AliCDBManager::Instance()->GetStorageMap();
995 const TList *cdbList = AliCDBManager::Instance()->GetRetrievedIds();
997 TMap *cdbMapCopy = new TMap(cdbMap->GetEntries());
998 cdbMapCopy->SetOwner(1);
999 cdbMapCopy->SetName("cdbMap");
1000 TIter iter(cdbMap->GetTable());
1003 while((pair = dynamic_cast<TPair*> (iter.Next()))){
1004 TObjString* keyStr = dynamic_cast<TObjString*> (pair->Key());
1005 TObjString* valStr = dynamic_cast<TObjString*> (pair->Value());
1006 cdbMapCopy->Add(new TObjString(keyStr->GetName()), new TObjString(valStr->GetName()));
1009 TList *cdbListCopy = new TList();
1010 cdbListCopy->SetOwner(1);
1011 cdbListCopy->SetName("cdbList");
1013 TIter iter2(cdbList);
1016 while((id = dynamic_cast<AliCDBId*> (iter2.Next()))){
1017 cdbListCopy->Add(new TObjString(id->ToString().Data()));
1020 tree->GetUserInfo()->Add(cdbMapCopy);
1021 tree->GetUserInfo()->Add(cdbListCopy);
1024 if(fESDPar.Contains("ESD.par")){
1025 AliInfo("Attaching ESD.par to Tree");
1026 TNamed *fn = CopyFileToTNamed(fESDPar.Data(),"ESD.par");
1027 tree->GetUserInfo()->Add(fn);
1033 if (fWriteESDfriend)
1034 tree->SetBranchStatus("ESDfriend*",0);
1035 // we want to have only one tree version number
1036 tree->Write(tree->GetName(),TObject::kOverwrite);
1040 TFile *aodFile = TFile::Open("AliAOD.root", "RECREATE");
1041 ESDFile2AODFile(file, aodFile);
1046 CleanUp(file, fileOld);
1048 // Create tags for the events in the ESD tree (the ESD tree is always present)
1049 // In case of empty events the tags will contain dummy values
1050 AliESDTagCreator *esdtagCreator = new AliESDTagCreator();
1051 esdtagCreator->CreateESDTags(fFirstEvent,fLastEvent,fGRPList);
1053 AliAODTagCreator *aodtagCreator = new AliAODTagCreator();
1054 aodtagCreator->CreateAODTags(fFirstEvent,fLastEvent,fGRPList);
1057 //Finish QA and end of cycle for out-of-loop QA
1058 if (fRunQA && !fInLoopQA) {
1059 qas.Run(fRunLocalReconstruction.Data(), AliQA::kRECPOINTS);
1061 qas.Run(fRunTracking.Data(), AliQA::kESDS);
1064 AliQADataMakerRec *qadm = GetQADataMaker(fgkNDetectors);
1066 qadm->EndOfCycle(AliQA::kRECPOINTS);
1072 // Cleanup of CDB manager: cache and active storages!
1073 AliCDBManager::Instance()->ClearCache();
1080 //_____________________________________________________________________________
1081 Bool_t AliReconstruction::RunLocalReconstruction(const TString& detectors)
1083 // run the local reconstruction
1084 static Int_t eventNr=0;
1085 AliCodeTimerAuto("")
1087 // AliCDBManager* man = AliCDBManager::Instance();
1088 // Bool_t origCache = man->GetCacheFlag();
1090 // TString detStr = detectors;
1091 // for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
1092 // if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
1093 // AliReconstructor* reconstructor = GetReconstructor(iDet);
1094 // if (!reconstructor) continue;
1095 // if (reconstructor->HasLocalReconstruction()) continue;
1097 // AliCodeTimerStart(Form("running reconstruction for %s", fgkDetectorName[iDet]));
1098 // AliInfo(Form("running reconstruction for %s", fgkDetectorName[iDet]));
1100 // AliCodeTimerStart(Form("Loading calibration data from OCDB for %s", fgkDetectorName[iDet]));
1101 // AliInfo(Form("Loading calibration data from OCDB for %s", fgkDetectorName[iDet]));
1103 // man->SetCacheFlag(kTRUE);
1104 // TString calibPath = Form("%s/Calib/*", fgkDetectorName[iDet]);
1105 // man->GetAll(calibPath); // entries are cached!
1107 // AliCodeTimerStop(Form("Loading calibration data from OCDB for %s", fgkDetectorName[iDet]));
1109 // if (fRawReader) {
1110 // fRawReader->RewindEvents();
1111 // reconstructor->Reconstruct(fRunLoader, fRawReader);
1113 // reconstructor->Reconstruct(fRunLoader);
1116 // AliCodeTimerStop(Form("running reconstruction for %s", fgkDetectorName[iDet]));
1117 // AliSysInfo::AddStamp(Form("LRec%s_%d",fgkDetectorName[iDet],eventNr));
1119 // // unload calibration data
1120 // man->UnloadFromCache(calibPath);
1121 // //man->ClearCache();
1124 // man->SetCacheFlag(origCache);
1126 // if ((detStr.CompareTo("ALL") != 0) && !detStr.IsNull()) {
1127 // AliError(Form("the following detectors were not found: %s",
1129 // if (fStopOnError) return kFALSE;
1136 //_____________________________________________________________________________
1137 Bool_t AliReconstruction::RunLocalEventReconstruction(const TString& detectors)
1139 // run the local reconstruction
1141 static Int_t eventNr=0;
1142 AliCodeTimerAuto("")
1144 TString detStr = detectors;
1145 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
1146 if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
1147 AliReconstructor* reconstructor = GetReconstructor(iDet);
1148 if (!reconstructor) continue;
1149 AliLoader* loader = fLoader[iDet];
1151 AliWarning(Form("No loader is defined for %s!",fgkDetectorName[iDet]));
1154 // conversion of digits
1155 if (fRawReader && reconstructor->HasDigitConversion()) {
1156 AliInfo(Form("converting raw data digits into root objects for %s",
1157 fgkDetectorName[iDet]));
1158 AliCodeTimerAuto(Form("converting raw data digits into root objects for %s",
1159 fgkDetectorName[iDet]));
1160 loader->LoadDigits("update");
1161 loader->CleanDigits();
1162 loader->MakeDigitsContainer();
1163 TTree* digitsTree = loader->TreeD();
1164 reconstructor->ConvertDigits(fRawReader, digitsTree);
1165 loader->WriteDigits("OVERWRITE");
1166 loader->UnloadDigits();
1168 // local reconstruction
1169 AliInfo(Form("running reconstruction for %s", fgkDetectorName[iDet]));
1170 AliCodeTimerAuto(Form("running reconstruction for %s", fgkDetectorName[iDet]));
1171 loader->LoadRecPoints("update");
1172 loader->CleanRecPoints();
1173 loader->MakeRecPointsContainer();
1174 TTree* clustersTree = loader->TreeR();
1175 if (fRawReader && !reconstructor->HasDigitConversion()) {
1176 reconstructor->Reconstruct(fRawReader, clustersTree);
1178 loader->LoadDigits("read");
1179 TTree* digitsTree = loader->TreeD();
1181 AliError(Form("Can't get the %s digits tree", fgkDetectorName[iDet]));
1182 if (fStopOnError) return kFALSE;
1184 reconstructor->Reconstruct(digitsTree, clustersTree);
1186 loader->UnloadDigits();
1189 // In-loop QA for local reconstrucion
1190 if (fRunQA && fInLoopQA) {
1191 AliQADataMakerRec * qadm = GetQADataMaker(iDet);
1194 //(Form("Running QA data maker for %s", fgkDetectorName[iDet]));
1196 //(Form("Running QA data maker for %s", fgkDetectorName[iDet]));
1198 qadm->Exec(AliQA::kRECPOINTS, clustersTree) ;
1201 //(Form("Running QA data maker for %s", fgkDetectorName[iDet]));
1205 loader->WriteRecPoints("OVERWRITE");
1206 loader->UnloadRecPoints();
1207 AliSysInfo::AddStamp(Form("LRec%s_%d",fgkDetectorName[iDet],eventNr), iDet,1,eventNr);
1210 if ((detStr.CompareTo("ALL") != 0) && !detStr.IsNull()) {
1211 AliError(Form("the following detectors were not found: %s",
1213 if (fStopOnError) return kFALSE;
1219 //_____________________________________________________________________________
1220 Bool_t AliReconstruction::RunVertexFinder(AliESDEvent*& esd)
1222 // run the barrel tracking
1224 AliCodeTimerAuto("")
1226 AliESDVertex* vertex = NULL;
1227 Double_t vtxPos[3] = {0, 0, 0};
1228 Double_t vtxErr[3] = {0.07, 0.07, 0.1};
1229 TArrayF mcVertex(3);
1230 if (fRunLoader->GetHeader() && fRunLoader->GetHeader()->GenEventHeader()) {
1231 fRunLoader->GetHeader()->GenEventHeader()->PrimaryVertex(mcVertex);
1232 for (Int_t i = 0; i < 3; i++) vtxPos[i] = mcVertex[i];
1236 if(fDiamondProfile) fVertexer->SetVtxStart(fDiamondProfile);
1237 AliInfo("running the ITS vertex finder");
1238 if (fLoader[0]) fLoader[0]->LoadRecPoints();
1239 vertex = fVertexer->FindVertexForCurrentEvent(fRunLoader->GetEventNumber());
1240 if (fLoader[0]) fLoader[0]->UnloadRecPoints();
1242 AliWarning("Vertex not found");
1243 vertex = new AliESDVertex();
1244 vertex->SetName("default");
1247 vertex->SetName("reconstructed");
1251 AliInfo("getting the primary vertex from MC");
1252 vertex = new AliESDVertex(vtxPos, vtxErr);
1256 vertex->GetXYZ(vtxPos);
1257 vertex->GetSigmaXYZ(vtxErr);
1259 AliWarning("no vertex reconstructed");
1260 vertex = new AliESDVertex(vtxPos, vtxErr);
1262 esd->SetVertex(vertex);
1263 // if SPD multiplicity has been determined, it is stored in the ESD
1264 AliMultiplicity *mult = fVertexer->GetMultiplicity();
1265 if(mult)esd->SetMultiplicity(mult);
1267 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
1268 if (fTracker[iDet]) fTracker[iDet]->SetVertex(vtxPos, vtxErr);
1275 //_____________________________________________________________________________
1276 Bool_t AliReconstruction::RunHLTTracking(AliESDEvent*& esd)
1278 // run the HLT barrel tracking
1280 AliCodeTimerAuto("")
1283 AliError("Missing runLoader!");
1287 AliInfo("running HLT tracking");
1289 // Get a pointer to the HLT reconstructor
1290 AliReconstructor *reconstructor = GetReconstructor(fgkNDetectors-1);
1291 if (!reconstructor) return kFALSE;
1294 for (Int_t iDet = 1; iDet >= 0; iDet--) {
1295 TString detName = fgkDetectorName[iDet];
1296 AliDebug(1, Form("%s HLT tracking", detName.Data()));
1297 reconstructor->SetOption(detName.Data());
1298 AliTracker *tracker = reconstructor->CreateTracker();
1300 AliWarning(Form("couldn't create a HLT tracker for %s", detName.Data()));
1301 if (fStopOnError) return kFALSE;
1305 Double_t vtxErr[3]={0.005,0.005,0.010};
1306 const AliESDVertex *vertex = esd->GetVertex();
1307 vertex->GetXYZ(vtxPos);
1308 tracker->SetVertex(vtxPos,vtxErr);
1310 fLoader[iDet]->LoadRecPoints("read");
1311 TTree* tree = fLoader[iDet]->TreeR();
1313 AliError(Form("Can't get the %s cluster tree", detName.Data()));
1316 tracker->LoadClusters(tree);
1318 if (tracker->Clusters2Tracks(esd) != 0) {
1319 AliError(Form("HLT %s Clusters2Tracks failed", fgkDetectorName[iDet]));
1323 tracker->UnloadClusters();
1331 //_____________________________________________________________________________
1332 Bool_t AliReconstruction::RunMuonTracking(AliESDEvent*& esd)
1334 // run the muon spectrometer tracking
1336 AliCodeTimerAuto("")
1339 AliError("Missing runLoader!");
1342 Int_t iDet = 7; // for MUON
1344 AliInfo("is running...");
1346 // Get a pointer to the MUON reconstructor
1347 AliReconstructor *reconstructor = GetReconstructor(iDet);
1348 if (!reconstructor) return kFALSE;
1351 TString detName = fgkDetectorName[iDet];
1352 AliDebug(1, Form("%s tracking", detName.Data()));
1353 AliTracker *tracker = reconstructor->CreateTracker();
1355 AliWarning(Form("couldn't create a tracker for %s", detName.Data()));
1360 fLoader[iDet]->LoadRecPoints("read");
1362 tracker->LoadClusters(fLoader[iDet]->TreeR());
1364 Int_t rv = tracker->Clusters2Tracks(esd);
1368 AliError(Form("%s Clusters2Tracks failed", fgkDetectorName[iDet]));
1372 fLoader[iDet]->UnloadRecPoints();
1374 tracker->UnloadClusters();
1382 //_____________________________________________________________________________
1383 Bool_t AliReconstruction::RunTracking(AliESDEvent*& esd)
1385 // run the barrel tracking
1386 static Int_t eventNr=0;
1387 AliCodeTimerAuto("")
1389 AliInfo("running tracking");
1391 //Fill the ESD with the T0 info (will be used by the TOF)
1392 if (fReconstructor[11] && fLoader[11]) {
1393 fLoader[11]->LoadRecPoints("READ");
1394 TTree *treeR = fLoader[11]->TreeR();
1395 GetReconstructor(11)->FillESD((TTree *)NULL,treeR,esd);
1398 // pass 1: TPC + ITS inwards
1399 for (Int_t iDet = 1; iDet >= 0; iDet--) {
1400 if (!fTracker[iDet]) continue;
1401 AliDebug(1, Form("%s tracking", fgkDetectorName[iDet]));
1404 fLoader[iDet]->LoadRecPoints("read");
1405 AliSysInfo::AddStamp(Form("RLoadCluster%s_%d",fgkDetectorName[iDet],eventNr),iDet,1, eventNr);
1406 TTree* tree = fLoader[iDet]->TreeR();
1408 AliError(Form("Can't get the %s cluster tree", fgkDetectorName[iDet]));
1411 fTracker[iDet]->LoadClusters(tree);
1412 AliSysInfo::AddStamp(Form("TLoadCluster%s_%d",fgkDetectorName[iDet],eventNr), iDet,2, eventNr);
1414 if (fTracker[iDet]->Clusters2Tracks(esd) != 0) {
1415 AliError(Form("%s Clusters2Tracks failed", fgkDetectorName[iDet]));
1418 if (fCheckPointLevel > 1) {
1419 WriteESD(esd, Form("%s.tracking", fgkDetectorName[iDet]));
1421 // preliminary PID in TPC needed by the ITS tracker
1423 GetReconstructor(1)->FillESD((TTree*)NULL, (TTree*)NULL, esd);
1424 AliESDpid::MakePID(esd);
1426 AliSysInfo::AddStamp(Form("Tracking0%s_%d",fgkDetectorName[iDet],eventNr), iDet,3,eventNr);
1429 // pass 2: ALL backwards
1431 if (fRunQA && fRunGlobalQA) AliTracker::SetFillResiduals(kTRUE);
1433 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
1434 if (!fTracker[iDet]) continue;
1435 AliDebug(1, Form("%s back propagation", fgkDetectorName[iDet]));
1438 if (iDet > 1) { // all except ITS, TPC
1440 fLoader[iDet]->LoadRecPoints("read");
1441 AliSysInfo::AddStamp(Form("RLoadCluster0%s_%d",fgkDetectorName[iDet],eventNr), iDet,1, eventNr);
1442 tree = fLoader[iDet]->TreeR();
1444 AliError(Form("Can't get the %s cluster tree", fgkDetectorName[iDet]));
1447 fTracker[iDet]->LoadClusters(tree);
1448 AliSysInfo::AddStamp(Form("TLoadCluster0%s_%d",fgkDetectorName[iDet],eventNr), iDet,2, eventNr);
1452 if (fTracker[iDet]->PropagateBack(esd) != 0) {
1453 AliError(Form("%s backward propagation failed", fgkDetectorName[iDet]));
1456 if (fCheckPointLevel > 1) {
1457 WriteESD(esd, Form("%s.back", fgkDetectorName[iDet]));
1461 if (iDet > 2) { // all except ITS, TPC, TRD
1462 fTracker[iDet]->UnloadClusters();
1463 fLoader[iDet]->UnloadRecPoints();
1465 // updated PID in TPC needed by the ITS tracker -MI
1467 GetReconstructor(1)->FillESD((TTree*)NULL, (TTree*)NULL, esd);
1468 AliESDpid::MakePID(esd);
1470 AliSysInfo::AddStamp(Form("Tracking1%s_%d",fgkDetectorName[iDet],eventNr), iDet,3, eventNr);
1473 if (fRunQA && fRunGlobalQA) AliTracker::SetFillResiduals(kFALSE);
1475 // write space-points to the ESD in case alignment data output
1477 if (fWriteAlignmentData)
1478 WriteAlignmentData(esd);
1480 // pass 3: TRD + TPC + ITS refit inwards
1483 for (Int_t iDet = 2; iDet >= 0; iDet--) {
1484 if (!fTracker[iDet]) continue;
1485 AliDebug(1, Form("%s inward refit", fgkDetectorName[iDet]));
1488 if (fTracker[iDet]->RefitInward(esd) != 0) {
1489 AliError(Form("%s inward refit failed", fgkDetectorName[iDet]));
1492 if (fCheckPointLevel > 1) {
1493 WriteESD(esd, Form("%s.refit", fgkDetectorName[iDet]));
1495 AliSysInfo::AddStamp(Form("Tracking2%s_%d",fgkDetectorName[iDet],eventNr), iDet,3, eventNr);
1497 fTracker[iDet]->UnloadClusters();
1498 AliSysInfo::AddStamp(Form("TUnloadCluster%s_%d",fgkDetectorName[iDet],eventNr), iDet,4, eventNr);
1499 fLoader[iDet]->UnloadRecPoints();
1500 AliSysInfo::AddStamp(Form("RUnloadCluster%s_%d",fgkDetectorName[iDet],eventNr), iDet,5, eventNr);
1504 // Propagate track to the vertex - if not done by ITS
1506 Int_t ntracks = esd->GetNumberOfTracks();
1507 for (Int_t itrack=0; itrack<ntracks; itrack++){
1508 const Double_t kRadius = 3; // beam pipe radius
1509 const Double_t kMaxStep = 5; // max step
1510 const Double_t kMaxD = 123456; // max distance to prim vertex
1511 Double_t fieldZ = AliTracker::GetBz(); //
1512 AliESDtrack * track = esd->GetTrack(itrack);
1513 if (!track) continue;
1514 if (track->IsOn(AliESDtrack::kITSrefit)) continue;
1515 AliTracker::PropagateTrackTo(track,kRadius,track->GetMass(),kMaxStep,kTRUE);
1516 track->RelateToVertex(esd->GetVertex(),fieldZ, kMaxD);
1522 //_____________________________________________________________________________
1523 Bool_t AliReconstruction::CleanESD(AliESDEvent *esd){
1525 // Remove the data which are not needed for the physics analysis.
1528 Int_t nTracks=esd->GetNumberOfTracks();
1529 Int_t nV0s=esd->GetNumberOfV0s();
1531 (Form("Number of ESD tracks and V0s before cleaning: %d %d",nTracks,nV0s));
1533 Float_t cleanPars[]={fV0DCAmax,fV0CsPmin,fDmax,fZmax};
1534 Bool_t rc=esd->Clean(cleanPars);
1536 nTracks=esd->GetNumberOfTracks();
1537 nV0s=esd->GetNumberOfV0s();
1539 (Form("Number of ESD tracks and V0s after cleaning %d %d",nTracks,nV0s));
1544 //_____________________________________________________________________________
1545 Bool_t AliReconstruction::FillESD(AliESDEvent*& esd, const TString& detectors)
1547 // fill the event summary data
1549 AliCodeTimerAuto("")
1550 static Int_t eventNr=0;
1551 TString detStr = detectors;
1553 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
1554 if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
1555 AliReconstructor* reconstructor = GetReconstructor(iDet);
1556 if (!reconstructor) continue;
1557 if (!ReadESD(esd, fgkDetectorName[iDet])) {
1558 AliDebug(1, Form("filling ESD for %s", fgkDetectorName[iDet]));
1559 TTree* clustersTree = NULL;
1560 if (fLoader[iDet]) {
1561 fLoader[iDet]->LoadRecPoints("read");
1562 clustersTree = fLoader[iDet]->TreeR();
1563 if (!clustersTree) {
1564 AliError(Form("Can't get the %s clusters tree",
1565 fgkDetectorName[iDet]));
1566 if (fStopOnError) return kFALSE;
1569 if (fRawReader && !reconstructor->HasDigitConversion()) {
1570 reconstructor->FillESD(fRawReader, clustersTree, esd);
1572 TTree* digitsTree = NULL;
1573 if (fLoader[iDet]) {
1574 fLoader[iDet]->LoadDigits("read");
1575 digitsTree = fLoader[iDet]->TreeD();
1577 AliError(Form("Can't get the %s digits tree",
1578 fgkDetectorName[iDet]));
1579 if (fStopOnError) return kFALSE;
1582 reconstructor->FillESD(digitsTree, clustersTree, esd);
1583 if (fLoader[iDet]) fLoader[iDet]->UnloadDigits();
1585 if (fLoader[iDet]) {
1586 fLoader[iDet]->UnloadRecPoints();
1589 if (fCheckPointLevel > 2) WriteESD(esd, fgkDetectorName[iDet]);
1593 if ((detStr.CompareTo("ALL") != 0) && !detStr.IsNull()) {
1594 AliError(Form("the following detectors were not found: %s",
1596 if (fStopOnError) return kFALSE;
1598 AliSysInfo::AddStamp(Form("FillESD%d",eventNr), 0,1, eventNr);
1603 //_____________________________________________________________________________
1604 Bool_t AliReconstruction::FillTriggerESD(AliESDEvent*& esd)
1606 // Reads the trigger decision which is
1607 // stored in Trigger.root file and fills
1608 // the corresponding esd entries
1610 AliCodeTimerAuto("")
1612 AliInfo("Filling trigger information into the ESD");
1615 AliCTPRawStream input(fRawReader);
1616 if (!input.Next()) {
1617 AliError("No valid CTP (trigger) DDL raw data is found ! The trigger information is not stored in the ESD !");
1620 esd->SetTriggerMask(input.GetClassMask());
1621 esd->SetTriggerCluster(input.GetClusterMask());
1624 AliRunLoader *runloader = AliRunLoader::GetRunLoader();
1626 if (!runloader->LoadTrigger()) {
1627 AliCentralTrigger *aCTP = runloader->GetTrigger();
1628 esd->SetTriggerMask(aCTP->GetClassMask());
1629 esd->SetTriggerCluster(aCTP->GetClusterMask());
1632 AliWarning("No trigger can be loaded! The trigger information is not stored in the ESD !");
1637 AliError("No run loader is available! The trigger information is not stored in the ESD !");
1649 //_____________________________________________________________________________
1650 Bool_t AliReconstruction::FillRawEventHeaderESD(AliESDEvent*& esd)
1653 // Filling information from RawReader Header
1656 AliInfo("Filling information from RawReader Header");
1657 esd->SetBunchCrossNumber(0);
1658 esd->SetOrbitNumber(0);
1659 esd->SetPeriodNumber(0);
1660 esd->SetTimeStamp(0);
1661 esd->SetEventType(0);
1662 const AliRawEventHeaderBase * eventHeader = fRawReader->GetEventHeader();
1665 const UInt_t *id = eventHeader->GetP("Id");
1666 esd->SetBunchCrossNumber((id)[1]&0x00000fff);
1667 esd->SetOrbitNumber((((id)[0]<<20)&0xf00000)|(((id)[1]>>12)&0xfffff));
1668 esd->SetPeriodNumber(((id)[0]>>4)&0x0fffffff);
1670 esd->SetTimeStamp((eventHeader->Get("Timestamp")));
1671 esd->SetEventType((eventHeader->Get("Type")));
1678 //_____________________________________________________________________________
1679 Bool_t AliReconstruction::IsSelected(TString detName, TString& detectors) const
1681 // check whether detName is contained in detectors
1682 // if yes, it is removed from detectors
1684 // check if all detectors are selected
1685 if ((detectors.CompareTo("ALL") == 0) ||
1686 detectors.BeginsWith("ALL ") ||
1687 detectors.EndsWith(" ALL") ||
1688 detectors.Contains(" ALL ")) {
1693 // search for the given detector
1694 Bool_t result = kFALSE;
1695 if ((detectors.CompareTo(detName) == 0) ||
1696 detectors.BeginsWith(detName+" ") ||
1697 detectors.EndsWith(" "+detName) ||
1698 detectors.Contains(" "+detName+" ")) {
1699 detectors.ReplaceAll(detName, "");
1703 // clean up the detectors string
1704 while (detectors.Contains(" ")) detectors.ReplaceAll(" ", " ");
1705 while (detectors.BeginsWith(" ")) detectors.Remove(0, 1);
1706 while (detectors.EndsWith(" ")) detectors.Remove(detectors.Length()-1, 1);
1711 //_____________________________________________________________________________
1712 Bool_t AliReconstruction::InitRunLoader()
1714 // get or create the run loader
1716 if (gAlice) delete gAlice;
1719 if (!gSystem->AccessPathName(fGAliceFileName.Data())) { // galice.root exists
1720 // load all base libraries to get the loader classes
1721 TString libs = gSystem->GetLibraries();
1722 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
1723 TString detName = fgkDetectorName[iDet];
1724 if (detName == "HLT") continue;
1725 if (libs.Contains("lib" + detName + "base.so")) continue;
1726 gSystem->Load("lib" + detName + "base.so");
1728 fRunLoader = AliRunLoader::Open(fGAliceFileName.Data());
1730 AliError(Form("no run loader found in file %s", fGAliceFileName.Data()));
1734 fRunLoader->CdGAFile();
1735 if (gFile->GetKey(AliRunLoader::GetGAliceName())) {
1736 if (fRunLoader->LoadgAlice() == 0) {
1737 gAlice = fRunLoader->GetAliRun();
1738 AliTracker::SetFieldMap(gAlice->Field(),fUniformField);
1741 if (!gAlice && !fRawReader) {
1742 AliError(Form("no gAlice object found in file %s",
1743 fGAliceFileName.Data()));
1748 //PH This is a temporary fix to give access to the kinematics
1749 //PH that is needed for the labels of ITS clusters
1750 fRunLoader->LoadHeader();
1751 fRunLoader->LoadKinematics();
1753 } else { // galice.root does not exist
1755 AliError(Form("the file %s does not exist", fGAliceFileName.Data()));
1759 fRunLoader = AliRunLoader::Open(fGAliceFileName.Data(),
1760 AliConfig::GetDefaultEventFolderName(),
1763 AliError(Form("could not create run loader in file %s",
1764 fGAliceFileName.Data()));
1768 fRunLoader->MakeTree("E");
1770 while (fRawReader->NextEvent()) {
1771 fRunLoader->SetEventNumber(iEvent);
1772 fRunLoader->GetHeader()->Reset(fRawReader->GetRunNumber(),
1774 fRunLoader->MakeTree("H");
1775 fRunLoader->TreeE()->Fill();
1778 fRawReader->RewindEvents();
1779 if (fNumberOfEventsPerFile > 0)
1780 fRunLoader->SetNumberOfEventsPerFile(fNumberOfEventsPerFile);
1782 fRunLoader->SetNumberOfEventsPerFile(iEvent);
1783 fRunLoader->WriteHeader("OVERWRITE");
1784 fRunLoader->CdGAFile();
1785 fRunLoader->Write(0, TObject::kOverwrite);
1786 // AliTracker::SetFieldMap(???);
1792 //_____________________________________________________________________________
1793 AliReconstructor* AliReconstruction::GetReconstructor(Int_t iDet)
1795 // get the reconstructor object and the loader for a detector
1797 if (fReconstructor[iDet]) return fReconstructor[iDet];
1799 // load the reconstructor object
1800 TPluginManager* pluginManager = gROOT->GetPluginManager();
1801 TString detName = fgkDetectorName[iDet];
1802 TString recName = "Ali" + detName + "Reconstructor";
1803 if (gAlice && !gAlice->GetDetector(detName) && (detName != "HLT")) return NULL;
1805 AliReconstructor* reconstructor = NULL;
1806 // first check if a plugin is defined for the reconstructor
1807 TPluginHandler* pluginHandler =
1808 pluginManager->FindHandler("AliReconstructor", detName);
1809 // if not, add a plugin for it
1810 if (!pluginHandler) {
1811 AliDebug(1, Form("defining plugin for %s", recName.Data()));
1812 TString libs = gSystem->GetLibraries();
1813 if (libs.Contains("lib" + detName + "base.so") ||
1814 (gSystem->Load("lib" + detName + "base.so") >= 0)) {
1815 pluginManager->AddHandler("AliReconstructor", detName,
1816 recName, detName + "rec", recName + "()");
1818 pluginManager->AddHandler("AliReconstructor", detName,
1819 recName, detName, recName + "()");
1821 pluginHandler = pluginManager->FindHandler("AliReconstructor", detName);
1823 if (pluginHandler && (pluginHandler->LoadPlugin() == 0)) {
1824 reconstructor = (AliReconstructor*) pluginHandler->ExecPlugin(0);
1826 if (reconstructor) {
1827 TObject* obj = fOptions.FindObject(detName.Data());
1828 if (obj) reconstructor->SetOption(obj->GetTitle());
1829 reconstructor->Init();
1830 fReconstructor[iDet] = reconstructor;
1833 // get or create the loader
1834 if (detName != "HLT") {
1835 fLoader[iDet] = fRunLoader->GetLoader(detName + "Loader");
1836 if (!fLoader[iDet]) {
1837 AliConfig::Instance()
1838 ->CreateDetectorFolders(fRunLoader->GetEventFolder(),
1840 // first check if a plugin is defined for the loader
1842 pluginManager->FindHandler("AliLoader", detName);
1843 // if not, add a plugin for it
1844 if (!pluginHandler) {
1845 TString loaderName = "Ali" + detName + "Loader";
1846 AliDebug(1, Form("defining plugin for %s", loaderName.Data()));
1847 pluginManager->AddHandler("AliLoader", detName,
1848 loaderName, detName + "base",
1849 loaderName + "(const char*, TFolder*)");
1850 pluginHandler = pluginManager->FindHandler("AliLoader", detName);
1852 if (pluginHandler && (pluginHandler->LoadPlugin() == 0)) {
1854 (AliLoader*) pluginHandler->ExecPlugin(2, detName.Data(),
1855 fRunLoader->GetEventFolder());
1857 if (!fLoader[iDet]) { // use default loader
1858 fLoader[iDet] = new AliLoader(detName, fRunLoader->GetEventFolder());
1860 if (!fLoader[iDet]) {
1861 AliWarning(Form("couldn't get loader for %s", detName.Data()));
1862 if (fStopOnError) return NULL;
1864 fRunLoader->AddLoader(fLoader[iDet]);
1865 fRunLoader->CdGAFile();
1866 if (gFile && !gFile->IsWritable()) gFile->ReOpen("UPDATE");
1867 fRunLoader->Write(0, TObject::kOverwrite);
1872 return reconstructor;
1875 //_____________________________________________________________________________
1876 Bool_t AliReconstruction::CreateVertexer()
1878 // create the vertexer
1881 AliReconstructor* itsReconstructor = GetReconstructor(0);
1882 if (itsReconstructor) {
1883 fVertexer = itsReconstructor->CreateVertexer();
1886 AliWarning("couldn't create a vertexer for ITS");
1887 if (fStopOnError) return kFALSE;
1893 //_____________________________________________________________________________
1894 Bool_t AliReconstruction::CreateTrackers(const TString& detectors)
1896 // create the trackers
1898 TString detStr = detectors;
1899 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
1900 if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
1901 AliReconstructor* reconstructor = GetReconstructor(iDet);
1902 if (!reconstructor) continue;
1903 TString detName = fgkDetectorName[iDet];
1904 if (detName == "HLT") {
1905 fRunHLTTracking = kTRUE;
1908 if (detName == "MUON") {
1909 fRunMuonTracking = kTRUE;
1914 fTracker[iDet] = reconstructor->CreateTracker();
1915 if (!fTracker[iDet] && (iDet < 7)) {
1916 AliWarning(Form("couldn't create a tracker for %s", detName.Data()));
1917 if (fStopOnError) return kFALSE;
1919 AliSysInfo::AddStamp(Form("LTracker%s",fgkDetectorName[iDet]), iDet,0);
1925 //_____________________________________________________________________________
1926 void AliReconstruction::CleanUp(TFile* file, TFile* fileOld)
1928 // delete trackers and the run loader and close and delete the file
1930 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
1931 delete fReconstructor[iDet];
1932 fReconstructor[iDet] = NULL;
1933 fLoader[iDet] = NULL;
1934 delete fTracker[iDet];
1935 fTracker[iDet] = NULL;
1936 // delete fQADataMaker[iDet];
1937 // fQADataMaker[iDet] = NULL;
1942 if(!(AliCDBManager::Instance()->GetCacheFlag())) {
1943 delete fDiamondProfile;
1944 fDiamondProfile = NULL;
1963 gSystem->Unlink("AliESDs.old.root");
1967 //_____________________________________________________________________________
1969 Bool_t AliReconstruction::ReadESD(AliESDEvent*& esd, const char* recStep) const
1971 // read the ESD event from a file
1973 if (!esd) return kFALSE;
1975 sprintf(fileName, "ESD_%d.%d_%s.root",
1976 esd->GetRunNumber(), esd->GetEventNumberInFile(), recStep);
1977 if (gSystem->AccessPathName(fileName)) return kFALSE;
1979 AliInfo(Form("reading ESD from file %s", fileName));
1980 AliDebug(1, Form("reading ESD from file %s", fileName));
1981 TFile* file = TFile::Open(fileName);
1982 if (!file || !file->IsOpen()) {
1983 AliError(Form("opening %s failed", fileName));
1990 esd = (AliESDEvent*) file->Get("ESD");
1999 //_____________________________________________________________________________
2000 void AliReconstruction::WriteESD(AliESDEvent* esd, const char* recStep) const
2002 // write the ESD event to a file
2006 sprintf(fileName, "ESD_%d.%d_%s.root",
2007 esd->GetRunNumber(), esd->GetEventNumberInFile(), recStep);
2009 AliDebug(1, Form("writing ESD to file %s", fileName));
2010 TFile* file = TFile::Open(fileName, "recreate");
2011 if (!file || !file->IsOpen()) {
2012 AliError(Form("opening %s failed", fileName));
2024 //_____________________________________________________________________________
2025 void AliReconstruction::ESDFile2AODFile(TFile* esdFile, TFile* aodFile)
2027 // write all files from the given esd file to an aod file
2029 // create an AliAOD object
2030 AliAODEvent *aod = new AliAODEvent();
2031 aod->CreateStdContent();
2037 TTree *aodTree = new TTree("aodTree", "AliAOD tree");
2038 aodTree->Branch(aod->GetList());
2041 TTree *t = (TTree*) esdFile->Get("esdTree");
2042 AliESDEvent *esd = new AliESDEvent();
2043 esd->ReadFromTree(t);
2045 Int_t nEvents = t->GetEntries();
2047 // set arrays and pointers
2057 // loop over events and fill them
2058 for (Int_t iEvent = 0; iEvent < nEvents; ++iEvent) {
2059 //cout << "event: " << iEvent << endl;
2060 t->GetEntry(iEvent);
2062 // Multiplicity information needed by the header (to be revised!)
2063 Int_t nTracks = esd->GetNumberOfTracks();
2064 Int_t nPosTracks = 0;
2065 for (Int_t iTrack=0; iTrack<nTracks; ++iTrack)
2066 if (esd->GetTrack(iTrack)->Charge()> 0) nPosTracks++;
2068 // Access the header
2069 AliAODHeader *header = aod->GetHeader();
2072 header->SetRunNumber (esd->GetRunNumber() );
2073 header->SetBunchCrossNumber(esd->GetBunchCrossNumber());
2074 header->SetOrbitNumber (esd->GetOrbitNumber() );
2075 header->SetPeriodNumber (esd->GetPeriodNumber() );
2076 header->SetTriggerMask (esd->GetTriggerMask() );
2077 header->SetTriggerCluster (esd->GetTriggerCluster() );
2078 header->SetEventType (esd->GetEventType() );
2079 header->SetMagneticField (esd->GetMagneticField() );
2080 header->SetZDCN1Energy (esd->GetZDCN1Energy() );
2081 header->SetZDCP1Energy (esd->GetZDCP1Energy() );
2082 header->SetZDCN2Energy (esd->GetZDCN2Energy() );
2083 header->SetZDCP2Energy (esd->GetZDCP2Energy() );
2084 header->SetZDCEMEnergy (esd->GetZDCEMEnergy(0),esd->GetZDCEMEnergy(1));
2085 header->SetRefMultiplicity (nTracks);
2086 header->SetRefMultiplicityPos(nPosTracks);
2087 header->SetRefMultiplicityNeg(nTracks - nPosTracks);
2088 header->SetMuonMagFieldScale(-999.); // FIXME
2089 header->SetCentrality(-999.); // FIXME
2091 Int_t nV0s = esd->GetNumberOfV0s();
2092 Int_t nCascades = esd->GetNumberOfCascades();
2093 Int_t nKinks = esd->GetNumberOfKinks();
2094 Int_t nVertices = nV0s + 2*nCascades /*could lead to two vertices, one V0 and the Xi */+ nKinks + 1 /* = prim. vtx*/;
2096 Int_t nCaloClus = esd->GetNumberOfCaloClusters();
2098 Int_t nPmdClus = esd->GetNumberOfPmdTracks();
2100 aod->ResetStd(nTracks, nVertices, nV0s+nCascades, nJets, nCaloClus, nFmdClus, nPmdClus);
2102 // Array to take into account the tracks already added to the AOD
2103 Bool_t * usedTrack = NULL;
2105 usedTrack = new Bool_t[nTracks];
2106 for (Int_t iTrack=0; iTrack<nTracks; ++iTrack) usedTrack[iTrack]=kFALSE;
2108 // Array to take into account the V0s already added to the AOD
2109 Bool_t * usedV0 = NULL;
2111 usedV0 = new Bool_t[nV0s];
2112 for (Int_t iV0=0; iV0<nV0s; ++iV0) usedV0[iV0]=kFALSE;
2114 // Array to take into account the kinks already added to the AOD
2115 Bool_t * usedKink = NULL;
2117 usedKink = new Bool_t[nKinks];
2118 for (Int_t iKink=0; iKink<nKinks; ++iKink) usedKink[iKink]=kFALSE;
2121 // Access to the AOD container of vertices
2122 TClonesArray &vertices = *(aod->GetVertices());
2125 // Access to the AOD container of tracks
2126 TClonesArray &tracks = *(aod->GetTracks());
2129 // Access to the AOD container of V0s
2130 TClonesArray &V0s = *(aod->GetV0s());
2133 // Add primary vertex. The primary tracks will be defined
2134 // after the loops on the composite objects (V0, cascades, kinks)
2135 const AliESDVertex *vtx = esd->GetPrimaryVertex();
2137 vtx->GetXYZ(pos); // position
2138 vtx->GetCovMatrix(covVtx); //covariance matrix
2140 AliAODVertex * primary = new(vertices[jVertices++])
2141 AliAODVertex(pos, covVtx, vtx->GetChi2toNDF(), NULL, -1, AliAODVertex::kPrimary);
2144 AliAODTrack *aodTrack = 0x0;
2146 // Create vertices starting from the most complex objects
2149 for (Int_t nCascade = 0; nCascade < nCascades; ++nCascade) {
2150 AliESDcascade *cascade = esd->GetCascade(nCascade);
2152 cascade->GetXYZ(pos[0], pos[1], pos[2]);
2153 cascade->GetPosCovXi(covVtx);
2155 // Add the cascade vertex
2156 AliAODVertex * vcascade = new(vertices[jVertices++]) AliAODVertex(pos,
2158 cascade->GetChi2Xi(), // = chi2/NDF since NDF = 2*2-3
2161 AliAODVertex::kCascade);
2163 primary->AddDaughter(vcascade); // the cascade 'particle' (represented by a vertex) is added as a daughter to the primary vertex
2165 // Add the V0 from the cascade. The ESD class have to be optimized...
2166 // Now we have to search for the corresponding V0 in the list of V0s
2167 // using the indeces of the positive and negative tracks
2169 Int_t posFromV0 = cascade->GetPindex();
2170 Int_t negFromV0 = cascade->GetNindex();
2173 AliESDv0 * v0 = 0x0;
2176 for (Int_t iV0=0; iV0<nV0s; ++iV0) {
2178 v0 = esd->GetV0(iV0);
2179 Int_t posV0 = v0->GetPindex();
2180 Int_t negV0 = v0->GetNindex();
2182 if (posV0==posFromV0 && negV0==negFromV0) {
2188 AliAODVertex * vV0FromCascade = 0x0;
2190 if (indV0>-1 && !usedV0[indV0]) {
2192 // the V0 exists in the array of V0s and is not used
2194 usedV0[indV0] = kTRUE;
2196 v0->GetXYZ(pos[0], pos[1], pos[2]);
2197 v0->GetPosCov(covVtx);
2199 vV0FromCascade = new(vertices[jVertices++]) AliAODVertex(pos,
2201 v0->GetChi2V0(), // = chi2/NDF since NDF = 2*2-3
2207 // the V0 doesn't exist in the array of V0s or was used
2208 cerr << "Error: event " << iEvent << " cascade " << nCascade
2209 << " The V0 " << indV0
2210 << " doesn't exist in the array of V0s or was used!" << endl;
2212 cascade->GetXYZ(pos[0], pos[1], pos[2]);
2213 cascade->GetPosCov(covVtx);
2215 vV0FromCascade = new(vertices[jVertices++]) AliAODVertex(pos,
2217 v0->GetChi2V0(), // = chi2/NDF since NDF = 2*2-3
2221 vcascade->AddDaughter(vV0FromCascade);
2225 // Add the positive tracks from the V0
2227 if (! usedTrack[posFromV0]) {
2229 usedTrack[posFromV0] = kTRUE;
2231 AliESDtrack *esdTrack = esd->GetTrack(posFromV0);
2232 esdTrack->GetPxPyPz(p_pos);
2233 esdTrack->GetXYZ(pos);
2234 esdTrack->GetCovarianceXYZPxPyPz(covTr);
2235 esdTrack->GetESDpid(pid);
2237 vV0FromCascade->AddDaughter(aodTrack =
2238 new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
2239 esdTrack->GetLabel(),
2245 (Short_t)esdTrack->Charge(),
2246 esdTrack->GetITSClusterMap(),
2249 kTRUE, // check if this is right
2250 kFALSE, // check if this is right
2251 AliAODTrack::kSecondary)
2253 aodTrack->ConvertAliPIDtoAODPID();
2256 cerr << "Error: event " << iEvent << " cascade " << nCascade
2257 << " track " << posFromV0 << " has already been used!" << endl;
2260 // Add the negative tracks from the V0
2262 if (!usedTrack[negFromV0]) {
2264 usedTrack[negFromV0] = kTRUE;
2266 AliESDtrack *esdTrack = esd->GetTrack(negFromV0);
2267 esdTrack->GetPxPyPz(p_neg);
2268 esdTrack->GetXYZ(pos);
2269 esdTrack->GetCovarianceXYZPxPyPz(covTr);
2270 esdTrack->GetESDpid(pid);
2272 vV0FromCascade->AddDaughter(aodTrack =
2273 new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
2274 esdTrack->GetLabel(),
2280 (Short_t)esdTrack->Charge(),
2281 esdTrack->GetITSClusterMap(),
2284 kTRUE, // check if this is right
2285 kFALSE, // check if this is right
2286 AliAODTrack::kSecondary)
2288 aodTrack->ConvertAliPIDtoAODPID();
2291 cerr << "Error: event " << iEvent << " cascade " << nCascade
2292 << " track " << negFromV0 << " has already been used!" << endl;
2295 // add it to the V0 array as well
2296 Double_t d0[2] = { -999., -99.};
2297 // counting is probably wrong
2298 new(V0s[jV0s++]) AliAODv0(vV0FromCascade, -999., -99., p_pos, p_neg, d0); // to be refined
2300 // Add the bachelor track from the cascade
2302 Int_t bachelor = cascade->GetBindex();
2304 if(!usedTrack[bachelor]) {
2306 usedTrack[bachelor] = kTRUE;
2308 AliESDtrack *esdTrack = esd->GetTrack(bachelor);
2309 esdTrack->GetPxPyPz(p);
2310 esdTrack->GetXYZ(pos);
2311 esdTrack->GetCovarianceXYZPxPyPz(covTr);
2312 esdTrack->GetESDpid(pid);
2314 vcascade->AddDaughter(aodTrack =
2315 new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
2316 esdTrack->GetLabel(),
2322 (Short_t)esdTrack->Charge(),
2323 esdTrack->GetITSClusterMap(),
2326 kTRUE, // check if this is right
2327 kFALSE, // check if this is right
2328 AliAODTrack::kSecondary)
2330 aodTrack->ConvertAliPIDtoAODPID();
2333 cerr << "Error: event " << iEvent << " cascade " << nCascade
2334 << " track " << bachelor << " has already been used!" << endl;
2337 // Add the primary track of the cascade (if any)
2339 } // end of the loop on cascades
2343 for (Int_t nV0 = 0; nV0 < nV0s; ++nV0) {
2345 if (usedV0[nV0]) continue; // skip if aready added to the AOD
2347 AliESDv0 *v0 = esd->GetV0(nV0);
2349 v0->GetXYZ(pos[0], pos[1], pos[2]);
2350 v0->GetPosCov(covVtx);
2352 AliAODVertex * vV0 =
2353 new(vertices[jVertices++]) AliAODVertex(pos,
2355 v0->GetChi2V0(), // = chi2/NDF since NDF = 2*2-3
2359 primary->AddDaughter(vV0);
2361 Int_t posFromV0 = v0->GetPindex();
2362 Int_t negFromV0 = v0->GetNindex();
2364 // Add the positive tracks from the V0
2366 if (!usedTrack[posFromV0]) {
2368 usedTrack[posFromV0] = kTRUE;
2370 AliESDtrack *esdTrack = esd->GetTrack(posFromV0);
2371 esdTrack->GetPxPyPz(p_pos);
2372 esdTrack->GetXYZ(pos);
2373 esdTrack->GetCovarianceXYZPxPyPz(covTr);
2374 esdTrack->GetESDpid(pid);
2376 vV0->AddDaughter(aodTrack =
2377 new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
2378 esdTrack->GetLabel(),
2384 (Short_t)esdTrack->Charge(),
2385 esdTrack->GetITSClusterMap(),
2388 kTRUE, // check if this is right
2389 kFALSE, // check if this is right
2390 AliAODTrack::kSecondary)
2392 aodTrack->ConvertAliPIDtoAODPID();
2395 cerr << "Error: event " << iEvent << " V0 " << nV0
2396 << " track " << posFromV0 << " has already been used!" << endl;
2399 // Add the negative tracks from the V0
2401 if (!usedTrack[negFromV0]) {
2403 usedTrack[negFromV0] = kTRUE;
2405 AliESDtrack *esdTrack = esd->GetTrack(negFromV0);
2406 esdTrack->GetPxPyPz(p_neg);
2407 esdTrack->GetXYZ(pos);
2408 esdTrack->GetCovarianceXYZPxPyPz(covTr);
2409 esdTrack->GetESDpid(pid);
2411 vV0->AddDaughter(aodTrack =
2412 new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
2413 esdTrack->GetLabel(),
2419 (Short_t)esdTrack->Charge(),
2420 esdTrack->GetITSClusterMap(),
2423 kTRUE, // check if this is right
2424 kFALSE, // check if this is right
2425 AliAODTrack::kSecondary)
2427 aodTrack->ConvertAliPIDtoAODPID();
2430 cerr << "Error: event " << iEvent << " V0 " << nV0
2431 << " track " << negFromV0 << " has already been used!" << endl;
2434 // add it to the V0 array as well
2435 Double_t d0[2] = { 999., 99.};
2436 new(V0s[jV0s++]) AliAODv0(vV0, 999., 99., p_pos, p_neg, d0); // to be refined
2439 // end of the loop on V0s
2441 // Kinks: it is a big mess the access to the information in the kinks
2442 // The loop is on the tracks in order to find the mother and daugther of each kink
2445 for (Int_t iTrack=0; iTrack<nTracks; ++iTrack) {
2447 AliESDtrack * esdTrack = esd->GetTrack(iTrack);
2449 Int_t ikink = esdTrack->GetKinkIndex(0);
2452 // Negative kink index: mother, positive: daughter
2454 // Search for the second track of the kink
2456 for (Int_t jTrack = iTrack+1; jTrack<nTracks; ++jTrack) {
2458 AliESDtrack * esdTrack1 = esd->GetTrack(jTrack);
2460 Int_t jkink = esdTrack1->GetKinkIndex(0);
2462 if ( TMath::Abs(ikink)==TMath::Abs(jkink) ) {
2464 // The two tracks are from the same kink
2466 if (usedKink[TMath::Abs(ikink)-1]) continue; // skip used kinks
2469 Int_t idaughter = -1;
2471 if (ikink<0 && jkink>0) {
2476 else if (ikink>0 && jkink<0) {
2482 cerr << "Error: Wrong combination of kink indexes: "
2483 << ikink << " " << jkink << endl;
2487 // Add the mother track
2489 AliAODTrack * mother = NULL;
2491 if (!usedTrack[imother]) {
2493 usedTrack[imother] = kTRUE;
2495 AliESDtrack *esdTrack = esd->GetTrack(imother);
2496 esdTrack->GetPxPyPz(p);
2497 esdTrack->GetXYZ(pos);
2498 esdTrack->GetCovarianceXYZPxPyPz(covTr);
2499 esdTrack->GetESDpid(pid);
2502 new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
2503 esdTrack->GetLabel(),
2509 (Short_t)esdTrack->Charge(),
2510 esdTrack->GetITSClusterMap(),
2513 kTRUE, // check if this is right
2514 kTRUE, // check if this is right
2515 AliAODTrack::kPrimary);
2516 primary->AddDaughter(mother);
2517 mother->ConvertAliPIDtoAODPID();
2520 cerr << "Error: event " << iEvent << " kink " << TMath::Abs(ikink)-1
2521 << " track " << imother << " has already been used!" << endl;
2524 // Add the kink vertex
2525 AliESDkink * kink = esd->GetKink(TMath::Abs(ikink)-1);
2527 AliAODVertex * vkink =
2528 new(vertices[jVertices++]) AliAODVertex(kink->GetPosition(),
2532 esdTrack->GetID(), // This is the track ID of the mother's track!
2533 AliAODVertex::kKink);
2534 // Add the daughter track
2536 AliAODTrack * daughter = NULL;
2538 if (!usedTrack[idaughter]) {
2540 usedTrack[idaughter] = kTRUE;
2542 AliESDtrack *esdTrack = esd->GetTrack(idaughter);
2543 esdTrack->GetPxPyPz(p);
2544 esdTrack->GetXYZ(pos);
2545 esdTrack->GetCovarianceXYZPxPyPz(covTr);
2546 esdTrack->GetESDpid(pid);
2549 new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
2550 esdTrack->GetLabel(),
2556 (Short_t)esdTrack->Charge(),
2557 esdTrack->GetITSClusterMap(),
2560 kTRUE, // check if this is right
2561 kTRUE, // check if this is right
2562 AliAODTrack::kPrimary);
2563 vkink->AddDaughter(daughter);
2564 daughter->ConvertAliPIDtoAODPID();
2567 cerr << "Error: event " << iEvent << " kink " << TMath::Abs(ikink)-1
2568 << " track " << idaughter << " has already been used!" << endl;
2574 vertices.Expand(jVertices);
2576 // Tracks (primary and orphan)
2577 for (Int_t nTrack = 0; nTrack < nTracks; ++nTrack) {
2579 if (usedTrack[nTrack]) continue;
2581 AliESDtrack *esdTrack = esd->GetTrack(nTrack);
2582 esdTrack->GetPxPyPz(p);
2583 esdTrack->GetXYZ(pos);
2584 esdTrack->GetCovarianceXYZPxPyPz(covTr);
2585 esdTrack->GetESDpid(pid);
2587 Float_t impactXY, impactZ;
2589 esdTrack->GetImpactParameters(impactXY,impactZ);
2592 // track inside the beam pipe
2594 primary->AddDaughter(aodTrack =
2595 new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
2596 esdTrack->GetLabel(),
2602 (Short_t)esdTrack->Charge(),
2603 esdTrack->GetITSClusterMap(),
2606 kTRUE, // check if this is right
2607 kTRUE, // check if this is right
2608 AliAODTrack::kPrimary)
2610 aodTrack->ConvertAliPIDtoAODPID();
2613 // outside the beam pipe: orphan track
2614 // Don't write them anymore!
2617 } // end of loop on tracks
2620 Int_t nMuTracks = esd->GetNumberOfMuonTracks();
2621 for (Int_t nMuTrack = 0; nMuTrack < nMuTracks; ++nMuTrack) {
2623 AliESDMuonTrack *esdMuTrack = esd->GetMuonTrack(nMuTrack);
2624 p[0] = esdMuTrack->Px();
2625 p[1] = esdMuTrack->Py();
2626 p[2] = esdMuTrack->Pz();
2627 pos[0] = primary->GetX();
2628 pos[1] = primary->GetY();
2629 pos[2] = primary->GetZ();
2631 // has to be changed once the muon pid is provided by the ESD
2632 for (Int_t i = 0; i < 10; pid[i++] = 0.); pid[AliAODTrack::kMuon]=1.;
2634 primary->AddDaughter(aodTrack =
2635 new(tracks[jTracks++]) AliAODTrack(0, // no ID provided
2636 0, // no label provided
2641 NULL, // no covariance matrix provided
2642 esdMuTrack->Charge(),
2643 0, // ITSClusterMap is set below
2646 kFALSE, // muon tracks are not used to fit the primary vtx
2647 kFALSE, // not used for vertex fit
2648 AliAODTrack::kPrimary)
2651 aodTrack->SetHitsPatternInTrigCh(esdMuTrack->GetHitsPatternInTrigCh());
2652 Int_t track2Trigger = esdMuTrack->GetMatchTrigger();
2653 aodTrack->SetMatchTrigger(track2Trigger);
2655 aodTrack->SetChi2MatchTrigger(esdMuTrack->GetChi2MatchTrigger());
2657 aodTrack->SetChi2MatchTrigger(0.);
2659 tracks.Expand(jTracks); // remove 'empty slots' due to unwritten tracks
2661 // Access to the AOD container of PMD clusters
2662 TClonesArray &pmdClusters = *(aod->GetPmdClusters());
2663 Int_t jPmdClusters=0;
2665 for (Int_t iPmd = 0; iPmd < nPmdClus; ++iPmd) {
2666 // file pmd clusters, to be revised!
2667 AliESDPmdTrack *pmdTrack = esd->GetPmdTrack(iPmd);
2670 Double_t pos[3] = { pmdTrack->GetClusterX(), pmdTrack->GetClusterY(), pmdTrack->GetClusterZ() };
2671 Double_t pid[9] = { 0., 0., 0., 0., 0., 0., 0., 0., 0. }; // to be revised!
2673 // assoc cluster not set
2674 new(pmdClusters[jPmdClusters++]) AliAODPmdCluster(iPmd, nLabel, label, pmdTrack->GetClusterADC(), pos, pid);
2677 // Access to the AOD container of clusters
2678 TClonesArray &caloClusters = *(aod->GetCaloClusters());
2681 for (Int_t iClust=0; iClust<nCaloClus; ++iClust) {
2683 AliESDCaloCluster * cluster = esd->GetCaloCluster(iClust);
2685 Int_t id = cluster->GetID();
2688 Float_t energy = cluster->E();
2689 cluster->GetPosition(posF);
2690 Char_t ttype=AliAODCluster::kUndef;
2692 if (cluster->GetClusterType() == AliESDCaloCluster::kPHOSCluster) {
2693 ttype=AliAODCluster::kPHOSNeutral;
2695 else if (cluster->GetClusterType() == AliESDCaloCluster::kEMCALClusterv1) {
2696 ttype = AliAODCluster::kEMCALClusterv1;
2700 AliAODCaloCluster *caloCluster = new(caloClusters[jClusters++]) AliAODCaloCluster(id,
2708 caloCluster->SetCaloCluster(); // to be refined!
2711 caloClusters.Expand(jClusters); // resize TObjArray to 'remove' slots for pseudo clusters
2712 // end of loop on calo clusters
2714 // fill EMCAL cell info
2715 if (esd->GetEMCALCells()) { // protection against missing ESD information
2716 AliESDCaloCells &esdEMcells = *(esd->GetEMCALCells());
2717 Int_t nEMcell = esdEMcells.GetNumberOfCells() ;
2719 AliAODCaloCells &aodEMcells = *(aod->GetEMCALCells());
2720 aodEMcells.CreateContainer(nEMcell);
2721 aodEMcells.SetType(AliAODCaloCells::kEMCAL);
2722 for (Int_t iCell = 0; iCell < nEMcell; iCell++) {
2723 aodEMcells.SetCell(iCell,esdEMcells.GetCellNumber(iCell),esdEMcells.GetAmplitude(iCell));
2728 // fill PHOS cell info
2729 if (esd->GetPHOSCells()) { // protection against missing ESD information
2730 AliESDCaloCells &esdPHcells = *(esd->GetPHOSCells());
2731 Int_t nPHcell = esdPHcells.GetNumberOfCells() ;
2733 AliAODCaloCells &aodPHcells = *(aod->GetPHOSCells());
2734 aodPHcells.CreateContainer(nPHcell);
2735 aodPHcells.SetType(AliAODCaloCells::kPHOS);
2736 for (Int_t iCell = 0; iCell < nPHcell; iCell++) {
2737 aodPHcells.SetCell(iCell,esdPHcells.GetCellNumber(iCell),esdPHcells.GetAmplitude(iCell));
2743 AliAODTracklets &SPDTracklets = *(aod->GetTracklets());
2744 const AliMultiplicity *mult = esd->GetMultiplicity();
2746 if (mult->GetNumberOfTracklets()>0) {
2747 SPDTracklets.CreateContainer(mult->GetNumberOfTracklets());
2749 for (Int_t n=0; n<mult->GetNumberOfTracklets(); n++) {
2750 SPDTracklets.SetTracklet(n, mult->GetTheta(n), mult->GetPhi(n), mult->GetDeltaPhi(n), mult->GetLabel(n));
2754 Printf("ERROR: AliMultiplicity could not be retrieved from ESD");
2757 delete [] usedTrack;
2761 // fill the tree for this event
2763 } // end of event loop
2765 aodTree->GetUserInfo()->Add(aod);
2767 // write the tree to the specified file
2768 aodFile = aodTree->GetCurrentFile();
2775 void AliReconstruction::WriteAlignmentData(AliESDEvent* esd)
2777 // Write space-points which are then used in the alignment procedures
2778 // For the moment only ITS, TRD and TPC
2780 // Load TOF clusters
2782 fLoader[3]->LoadRecPoints("read");
2783 TTree* tree = fLoader[3]->TreeR();
2785 AliError(Form("Can't get the %s cluster tree", fgkDetectorName[3]));
2788 fTracker[3]->LoadClusters(tree);
2790 Int_t ntracks = esd->GetNumberOfTracks();
2791 for (Int_t itrack = 0; itrack < ntracks; itrack++)
2793 AliESDtrack *track = esd->GetTrack(itrack);
2796 for (Int_t iDet = 3; iDet >= 0; iDet--)
2797 nsp += track->GetNcls(iDet);
2799 AliTrackPointArray *sp = new AliTrackPointArray(nsp);
2800 track->SetTrackPointArray(sp);
2802 for (Int_t iDet = 3; iDet >= 0; iDet--) {
2803 AliTracker *tracker = fTracker[iDet];
2804 if (!tracker) continue;
2805 Int_t nspdet = track->GetNcls(iDet);
2806 if (nspdet <= 0) continue;
2807 track->GetClusters(iDet,idx);
2811 while (isp < nspdet) {
2813 TString dets = fgkDetectorName[iDet];
2814 if ((fUseTrackingErrorsForAlignment.CompareTo(dets) == 0) ||
2815 fUseTrackingErrorsForAlignment.BeginsWith(dets+" ") ||
2816 fUseTrackingErrorsForAlignment.EndsWith(" "+dets) ||
2817 fUseTrackingErrorsForAlignment.Contains(" "+dets+" ")) {
2818 isvalid = tracker->GetTrackPointTrackingError(idx[isp2],p,track);
2820 isvalid = tracker->GetTrackPoint(idx[isp2],p);
2823 const Int_t kNTPCmax = 159;
2824 if (iDet==1 && isp2>kNTPCmax) break; // to be fixed
2825 if (!isvalid) continue;
2826 sp->AddPoint(isptrack,&p); isptrack++; isp++;
2832 fTracker[3]->UnloadClusters();
2833 fLoader[3]->UnloadRecPoints();
2837 //_____________________________________________________________________________
2838 void AliReconstruction::FillRawDataErrorLog(Int_t iEvent, AliESDEvent* esd)
2840 // The method reads the raw-data error log
2841 // accumulated within the rawReader.
2842 // It extracts the raw-data errors related to
2843 // the current event and stores them into
2844 // a TClonesArray inside the esd object.
2846 if (!fRawReader) return;
2848 for(Int_t i = 0; i < fRawReader->GetNumberOfErrorLogs(); i++) {
2850 AliRawDataErrorLog *log = fRawReader->GetErrorLog(i);
2852 if (iEvent != log->GetEventNumber()) continue;
2854 esd->AddRawDataErrorLog(log);
2859 TNamed* AliReconstruction::CopyFileToTNamed(TString fPath,TString fName){
2860 // Dump a file content into a char in TNamed
2862 in.open(fPath.Data(),ios::in | ios::binary|ios::ate);
2863 Int_t kBytes = (Int_t)in.tellg();
2864 printf("Size: %d \n",kBytes);
2867 char* memblock = new char [kBytes];
2868 in.seekg (0, ios::beg);
2869 in.read (memblock, kBytes);
2871 TString fData(memblock,kBytes);
2872 fn = new TNamed(fName,fData);
2873 printf("fData Size: %d \n",fData.Sizeof());
2874 printf("fName Size: %d \n",fName.Sizeof());
2875 printf("fn Size: %d \n",fn->Sizeof());
2879 AliInfo(Form("Could not Open %s\n",fPath.Data()));
2885 void AliReconstruction::TNamedToFile(TTree* fTree, TString fName){
2886 // This is not really needed in AliReconstruction at the moment
2887 // but can serve as a template
2889 TList *fList = fTree->GetUserInfo();
2890 TNamed *fn = (TNamed*)fList->FindObject(fName.Data());
2891 printf("fn Size: %d \n",fn->Sizeof());
2893 TString fTmp(fn->GetName()); // to be 100% sure in principle fName also works
2894 const char* cdata = fn->GetTitle();
2895 printf("fTmp Size %d\n",fTmp.Sizeof());
2897 int size = fn->Sizeof()-fTmp.Sizeof()-sizeof(UChar_t)-sizeof(Int_t); // see dfinition of TString::SizeOf()...
2898 printf("calculated size %d\n",size);
2899 ofstream out(fName.Data(),ios::out | ios::binary);
2900 out.write(cdata,size);
2905 //_____________________________________________________________________________
2906 AliQADataMakerRec * AliReconstruction::GetQADataMaker(Int_t iDet)
2908 // get the quality assurance data maker object and the loader for a detector
2910 if (fQADataMaker[iDet])
2911 return fQADataMaker[iDet];
2913 AliQADataMakerRec * qadm = NULL;
2914 if (iDet == fgkNDetectors) { //Global QA
2915 qadm = new AliGlobalQADataMaker();
2916 fQADataMaker[iDet] = qadm;
2920 // load the QA data maker object
2921 TPluginManager* pluginManager = gROOT->GetPluginManager();
2922 TString detName = fgkDetectorName[iDet];
2923 TString qadmName = "Ali" + detName + "QADataMakerRec";
2924 if (gAlice && !gAlice->GetDetector(detName) && (detName != "HLT"))
2927 // first check if a plugin is defined for the quality assurance data maker
2928 TPluginHandler* pluginHandler = pluginManager->FindHandler("AliQADataMakerRec", detName);
2929 // if not, add a plugin for it
2930 if (!pluginHandler) {
2931 AliDebug(1, Form("defining plugin for %s", qadmName.Data()));
2932 TString libs = gSystem->GetLibraries();
2933 if (libs.Contains("lib" + detName + "base.so") ||
2934 (gSystem->Load("lib" + detName + "base.so") >= 0)) {
2935 pluginManager->AddHandler("AliQADataMakerRec", detName,
2936 qadmName, detName + "qadm", qadmName + "()");
2938 pluginManager->AddHandler("AliQADataMakerRec", detName,
2939 qadmName, detName, qadmName + "()");
2941 pluginHandler = pluginManager->FindHandler("AliQADataMakerRec", detName);
2943 if (pluginHandler && (pluginHandler->LoadPlugin() == 0)) {
2944 qadm = (AliQADataMakerRec *) pluginHandler->ExecPlugin(0);
2947 fQADataMaker[iDet] = qadm;
2952 //_____________________________________________________________________________
2953 Bool_t AliReconstruction::RunQA(const char* detectors, AliESDEvent *& esd)
2955 // run the Quality Assurance data producer
2957 AliCodeTimerAuto("")
2958 TString detStr = detectors;
2959 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
2960 if (!IsSelected(fgkDetectorName[iDet], detStr))
2962 AliQADataMakerRec * qadm = GetQADataMaker(iDet);
2965 AliCodeTimerStart(Form("running quality assurance data maker for %s", fgkDetectorName[iDet]));
2966 AliInfo(Form("running quality assurance data maker for %s", fgkDetectorName[iDet]));
2968 qadm->Exec(AliQA::kESDS, esd) ;
2971 AliCodeTimerStop(Form("running quality assurance data maker for %s", fgkDetectorName[iDet]));
2973 if ((detStr.CompareTo("ALL") != 0) && !detStr.IsNull()) {
2974 AliError(Form("the following detectors were not found: %s",
2984 //_____________________________________________________________________________
2985 void AliReconstruction::CheckQA()
2987 // check the QA of SIM for this run and remove the detectors
2988 // with status Fatal
2990 TString newRunLocalReconstruction ;
2991 TString newRunTracking ;
2992 TString newFillESD ;
2994 for (Int_t iDet = 0; iDet < AliQA::kNDET; iDet++) {
2995 TString detName(AliQA::GetDetName(iDet)) ;
2996 AliQA * qa = AliQA::Instance(AliQA::DETECTORINDEX(iDet)) ;
2997 if ( qa->IsSet(AliQA::DETECTORINDEX(iDet), AliQA::kSIM, AliQA::kFATAL)) {
2998 AliInfo(Form("QA status for %s in Hits and/or SDIGITS and/or Digits was Fatal; No reconstruction performed", detName.Data())) ;
3000 if ( fRunLocalReconstruction.Contains(AliQA::GetDetName(iDet)) ||
3001 fRunLocalReconstruction.Contains("ALL") ) {
3002 newRunLocalReconstruction += detName ;
3003 newRunLocalReconstruction += " " ;
3005 if ( fRunTracking.Contains(AliQA::GetDetName(iDet)) ||
3006 fRunTracking.Contains("ALL") ) {
3007 newRunTracking += detName ;
3008 newRunTracking += " " ;
3010 if ( fFillESD.Contains(AliQA::GetDetName(iDet)) ||
3011 fFillESD.Contains("ALL") ) {
3012 newFillESD += detName ;
3017 fRunLocalReconstruction = newRunLocalReconstruction ;
3018 fRunTracking = newRunTracking ;
3019 fFillESD = newFillESD ;
3022 //_____________________________________________________________________________
3023 Int_t AliReconstruction::GetDetIndex(const char* detector)
3025 // return the detector index corresponding to detector
3027 for (index = 0; index < fgkNDetectors ; index++) {
3028 if ( strcmp(detector, fgkDetectorName[index]) == 0 )