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, Bool_t IsOnline)
588 // run the reconstruction
594 if (!input) input = fInput.Data();
595 TString fileName(input);
596 if (fileName.EndsWith("/")) {
597 fRawReader = new AliRawReaderFile(fileName);
598 } else if (fileName.EndsWith(".root")) {
599 fRawReader = new AliRawReaderRoot(fileName);
600 } else if (!fileName.IsNull()) {
601 fRawReader = new AliRawReaderDate(fileName);
606 AliError("Null pointer to the event structure!");
609 fRawReader = new AliRawReaderDate((void *)input);
612 if (!fEquipIdMap.IsNull() && fRawReader)
613 fRawReader->LoadEquipmentIdsMap(fEquipIdMap);
615 AliSysInfo::AddStamp("Start");
616 // get the run loader
617 if (!InitRunLoader()) return kFALSE;
618 AliSysInfo::AddStamp("LoadLoader");
620 // Initialize the CDB storage
623 AliSysInfo::AddStamp("LoadCDB");
625 // Set run number in CDBManager (if it is not already set by the user)
626 if (!SetRunNumberFromData()) if (fStopOnError) return kFALSE;
628 // Set CDB lock: from now on it is forbidden to reset the run number
629 // or the default storage or to activate any further storage!
632 // Import ideal TGeo geometry and apply misalignment
634 TString geom(gSystem->DirName(fGAliceFileName));
635 geom += "/geometry.root";
636 AliGeomManager::LoadGeometry(geom.Data());
637 if (!gGeoManager) if (fStopOnError) return kFALSE;
640 if (!MisalignGeometry(fLoadAlignData)) if (fStopOnError) return kFALSE;
641 AliSysInfo::AddStamp("LoadGeom");
644 AliQADataMakerSteer qas ;
645 if (fRunQA && fRawReader) qas.Run(fRunLocalReconstruction, fRawReader) ;
646 // checking the QA of previous steps
650 // local reconstruction
651 if (!fRunLocalReconstruction.IsNull()) {
652 if (!RunLocalReconstruction(fRunLocalReconstruction)) {
653 if (fStopOnError) {CleanUp(); return kFALSE;}
659 if (fRunVertexFinder && !CreateVertexer()) {
665 AliSysInfo::AddStamp("Vertexer");
668 if (!fRunTracking.IsNull() && !CreateTrackers(fRunTracking)) {
674 AliSysInfo::AddStamp("LoadTrackers");
676 // get the possibly already existing ESD file and tree
677 AliESDEvent* esd = new AliESDEvent(); AliESDEvent* hltesd = new AliESDEvent();
678 TFile* fileOld = NULL;
679 TTree* treeOld = NULL; TTree *hlttreeOld = NULL;
680 if (!gSystem->AccessPathName("AliESDs.root")){
681 gSystem->CopyFile("AliESDs.root", "AliESDs.old.root", kTRUE);
682 fileOld = TFile::Open("AliESDs.old.root");
683 if (fileOld && fileOld->IsOpen()) {
684 treeOld = (TTree*) fileOld->Get("esdTree");
685 if (treeOld)esd->ReadFromTree(treeOld);
686 hlttreeOld = (TTree*) fileOld->Get("HLTesdTree");
687 if (hlttreeOld) hltesd->ReadFromTree(hlttreeOld);
691 // create the ESD output file and tree
692 TFile* file = TFile::Open("AliESDs.root", "RECREATE");
693 file->SetCompressionLevel(2);
694 if (!file->IsOpen()) {
695 AliError("opening AliESDs.root failed");
696 if (fStopOnError) {CleanUp(file, fileOld); return kFALSE;}
699 TTree* tree = new TTree("esdTree", "Tree with ESD objects");
700 esd = new AliESDEvent();
701 esd->CreateStdContent();
702 esd->WriteToTree(tree);
704 TTree* hlttree = new TTree("HLTesdTree", "Tree with HLT ESD objects");
705 hltesd = new AliESDEvent();
706 hltesd->CreateStdContent();
707 hltesd->WriteToTree(hlttree);
710 delete esd; delete hltesd;
711 esd = NULL; hltesd = NULL;
713 // create the branch with ESD additions
717 AliESDfriend *esdf = 0;
718 if (fWriteESDfriend) {
719 esdf = new AliESDfriend();
720 TBranch *br=tree->Branch("ESDfriend.","AliESDfriend", &esdf);
721 br->SetFile("AliESDfriends.root");
722 esd->AddObject(esdf);
726 // Get the GRP CDB entry
727 AliCDBEntry* entryGRP = AliCDBManager::Instance()->Get("GRP/GRP/Data");
730 fGRPList = dynamic_cast<TList*> (entryGRP->GetObject());
732 AliError("No GRP entry found in OCDB!");
735 // Get the diamond profile from OCDB
736 AliCDBEntry* entry = AliCDBManager::Instance()
737 ->Get("GRP/Calib/MeanVertex");
740 fDiamondProfile = dynamic_cast<AliESDVertex*> (entry->GetObject());
742 AliError("No diamond profile found in OCDB!");
745 AliVertexerTracks tVertexer(AliTracker::GetBz());
746 if(fDiamondProfile && fMeanVertexConstraint) tVertexer.SetVtxStart(fDiamondProfile);
748 if (fRawReader) fRawReader->RewindEvents();
751 gSystem->GetProcInfo(&ProcInfo);
752 AliInfo(Form("Current memory usage %d %d", ProcInfo.fMemResident, ProcInfo.fMemVirtual));
755 //Initialize the QA and start of cycle for out-of-cycle QA
757 TString detStr(fFillESD);
758 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
759 if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
760 AliQADataMakerRec *qadm = GetQADataMaker(iDet);
762 AliInfo(Form("Initializing the QA data maker for %s",
763 fgkDetectorName[iDet]));
764 qadm->Init(AliQA::kRECPOINTS, AliCDBManager::Instance()->GetRun());
765 qadm->Init(AliQA::kESDS, AliCDBManager::Instance()->GetRun());
767 qadm->StartOfCycle(AliQA::kRECPOINTS);
768 qadm->StartOfCycle(AliQA::kESDS,"same");
772 AliQADataMakerRec *qadm = GetQADataMaker(fgkNDetectors);
773 AliInfo(Form("Initializing the global QA data maker"));
775 qadm->Init(AliQA::kRECPOINTS, AliCDBManager::Instance()->GetRun());
776 AliTracker::SetResidualsArray(arr);
778 qadm->StartOfCycle(AliQA::kRECPOINTS);
784 //******* The loop over events
785 for (Int_t iEvent = 0; iEvent < fRunLoader->GetNumberOfEvents(); iEvent++) {
786 if (fRawReader) fRawReader->NextEvent();
787 if ((iEvent < fFirstEvent) || ((fLastEvent >= 0) && (iEvent > fLastEvent))) {
788 // copy old ESD to the new one
790 esd->ReadFromTree(treeOld);
791 treeOld->GetEntry(iEvent);
795 esd->ReadFromTree(hlttreeOld);
796 hlttreeOld->GetEntry(iEvent);
802 AliInfo(Form("processing event %d", iEvent));
804 //Start of cycle for the in-loop QA
805 if (fRunQA && fInLoopQA) {
806 TString detStr(fFillESD);
807 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
808 if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
809 AliQADataMakerRec *qadm = GetQADataMaker(iDet);
811 qadm->StartOfCycle(AliQA::kRECPOINTS);
812 qadm->StartOfCycle(AliQA::kESDS, "same") ;
815 AliQADataMakerRec *qadm = GetQADataMaker(fgkNDetectors);
816 qadm->StartOfCycle(AliQA::kRECPOINTS);
820 fRunLoader->GetEvent(iEvent);
823 sprintf(aFileName, "ESD_%d.%d_final.root",
824 fRunLoader->GetHeader()->GetRun(),
825 fRunLoader->GetHeader()->GetEventNrInRun());
826 if (!gSystem->AccessPathName(aFileName)) continue;
828 // local signle event reconstruction
829 if (!fRunLocalReconstruction.IsNull()) {
830 if (!RunLocalEventReconstruction(fRunLocalReconstruction)) {
831 if (fStopOnError) {CleanUp(file, fileOld); return kFALSE;}
835 esd->SetRunNumber(fRunLoader->GetHeader()->GetRun());
836 hltesd->SetRunNumber(fRunLoader->GetHeader()->GetRun());
837 esd->SetEventNumberInFile(fRunLoader->GetHeader()->GetEventNrInRun());
838 hltesd->SetEventNumberInFile(fRunLoader->GetHeader()->GetEventNrInRun());
840 // Set magnetic field from the tracker
841 esd->SetMagneticField(AliTracker::GetBz());
842 hltesd->SetMagneticField(AliTracker::GetBz());
846 // Fill raw-data error log into the ESD
847 if (fRawReader) FillRawDataErrorLog(iEvent,esd);
850 if (fRunVertexFinder) {
851 if (!ReadESD(esd, "vertex")) {
852 if (!RunVertexFinder(esd)) {
853 if (fStopOnError) {CleanUp(file, fileOld); return kFALSE;}
855 if (fCheckPointLevel > 0) WriteESD(esd, "vertex");
860 if (!fRunTracking.IsNull()) {
861 if (fRunHLTTracking) {
862 hltesd->SetVertex(esd->GetVertex());
863 if (!RunHLTTracking(hltesd)) {
864 if (fStopOnError) {CleanUp(file, fileOld); return kFALSE;}
870 if (!fRunTracking.IsNull()) {
871 if (fRunMuonTracking) {
872 if (!RunMuonTracking(esd)) {
873 if (fStopOnError) {CleanUp(file, fileOld); return kFALSE;}
879 if (!fRunTracking.IsNull()) {
880 if (!ReadESD(esd, "tracking")) {
881 if (!RunTracking(esd)) {
882 if (fStopOnError) {CleanUp(file, fileOld); return kFALSE;}
884 if (fCheckPointLevel > 0) WriteESD(esd, "tracking");
889 if (!fFillESD.IsNull()) {
890 if (!FillESD(esd, fFillESD)) {
891 if (fStopOnError) {CleanUp(file, fileOld); return kFALSE;}
895 // fill Event header information from the RawEventHeader
896 if (fRawReader){FillRawEventHeaderESD(esd);}
899 AliESDpid::MakePID(esd);
900 if (fCheckPointLevel > 1) WriteESD(esd, "PID");
902 if (fFillTriggerESD) {
903 if (!ReadESD(esd, "trigger")) {
904 if (!FillTriggerESD(esd)) {
905 if (fStopOnError) {CleanUp(file, fileOld); return kFALSE;}
907 if (fCheckPointLevel > 1) WriteESD(esd, "trigger");
913 //Try to improve the reconstructed primary vertex position using the tracks
914 AliESDVertex *pvtx=0;
915 Bool_t dovertex=kTRUE;
916 TObject* obj = fOptions.FindObject("ITS");
918 TString optITS = obj->GetTitle();
919 if (optITS.Contains("cosmics") || optITS.Contains("COSMICS"))
922 if(dovertex) pvtx=tVertexer.FindPrimaryVertex(esd);
923 if(fDiamondProfile) esd->SetDiamond(fDiamondProfile);
926 if (pvtx->GetStatus()) {
927 // Store the improved primary vertex
928 esd->SetPrimaryVertex(pvtx);
929 // Propagate the tracks to the DCA to the improved primary vertex
930 Double_t somethingbig = 777.;
931 Double_t bz = esd->GetMagneticField();
932 Int_t nt=esd->GetNumberOfTracks();
934 AliESDtrack *t = esd->GetTrack(nt);
935 t->RelateToVertex(pvtx, bz, somethingbig);
942 vtxer.Tracks2V0vertices(esd);
944 if (fRunCascadeFinder) {
946 AliCascadeVertexer cvtxer;
947 cvtxer.V0sTracks2CascadeVertices(esd);
952 if (fCleanESD) CleanESD(esd);
953 if (fWriteESDfriend) {
954 esdf->~AliESDfriend();
955 new (esdf) AliESDfriend(); // Reset...
956 esd->GetESDfriend(esdf);
963 if (fCheckPointLevel > 0) WriteESD(esd, "final");
966 if (fWriteESDfriend) {
967 esdf->~AliESDfriend();
968 new (esdf) AliESDfriend(); // Reset...
971 gSystem->GetProcInfo(&ProcInfo);
972 AliInfo(Form("Event %d -> Current memory usage %d %d",iEvent, ProcInfo.fMemResident, ProcInfo.fMemVirtual));
975 // End of cycle for the in-loop QA
976 if (fRunQA && fInLoopQA) {
977 RunQA(fFillESD.Data(), esd);
978 TString detStr(fFillESD);
979 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
980 if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
981 AliQADataMakerRec * qadm = GetQADataMaker(iDet);
983 qadm->EndOfCycle(AliQA::kRECPOINTS);
984 qadm->EndOfCycle(AliQA::kESDS);
988 AliQADataMakerRec *qadm = GetQADataMaker(fgkNDetectors);
990 qadm->EndOfCycle(AliQA::kRECPOINTS);
996 //******** End of the loop over events
1000 tree->GetUserInfo()->Add(esd);
1001 hlttree->GetUserInfo()->Add(hltesd);
1003 const TMap *cdbMap = AliCDBManager::Instance()->GetStorageMap();
1004 const TList *cdbList = AliCDBManager::Instance()->GetRetrievedIds();
1006 TMap *cdbMapCopy = new TMap(cdbMap->GetEntries());
1007 cdbMapCopy->SetOwner(1);
1008 cdbMapCopy->SetName("cdbMap");
1009 TIter iter(cdbMap->GetTable());
1012 while((pair = dynamic_cast<TPair*> (iter.Next()))){
1013 TObjString* keyStr = dynamic_cast<TObjString*> (pair->Key());
1014 TObjString* valStr = dynamic_cast<TObjString*> (pair->Value());
1015 cdbMapCopy->Add(new TObjString(keyStr->GetName()), new TObjString(valStr->GetName()));
1018 TList *cdbListCopy = new TList();
1019 cdbListCopy->SetOwner(1);
1020 cdbListCopy->SetName("cdbList");
1022 TIter iter2(cdbList);
1025 while((id = dynamic_cast<AliCDBId*> (iter2.Next()))){
1026 cdbListCopy->Add(new TObjString(id->ToString().Data()));
1029 tree->GetUserInfo()->Add(cdbMapCopy);
1030 tree->GetUserInfo()->Add(cdbListCopy);
1033 if(fESDPar.Contains("ESD.par")){
1034 AliInfo("Attaching ESD.par to Tree");
1035 TNamed *fn = CopyFileToTNamed(fESDPar.Data(),"ESD.par");
1036 tree->GetUserInfo()->Add(fn);
1042 if (fWriteESDfriend)
1043 tree->SetBranchStatus("ESDfriend*",0);
1044 // we want to have only one tree version number
1045 tree->Write(tree->GetName(),TObject::kOverwrite);
1049 TFile *aodFile = TFile::Open("AliAOD.root", "RECREATE");
1050 ESDFile2AODFile(file, aodFile);
1055 CleanUp(file, fileOld);
1057 // Create tags for the events in the ESD tree (the ESD tree is always present)
1058 // In case of empty events the tags will contain dummy values
1059 AliESDTagCreator *esdtagCreator = new AliESDTagCreator();
1060 esdtagCreator->CreateESDTags(fFirstEvent,fLastEvent,fGRPList);
1062 AliAODTagCreator *aodtagCreator = new AliAODTagCreator();
1063 aodtagCreator->CreateAODTags(fFirstEvent,fLastEvent,fGRPList);
1066 //Finish QA and end of cycle for out-of-loop QA
1067 if (fRunQA && !fInLoopQA) {
1068 qas.Run(fRunLocalReconstruction.Data(), AliQA::kRECPOINTS);
1070 qas.Run(fRunTracking.Data(), AliQA::kESDS);
1073 AliQADataMakerRec *qadm = GetQADataMaker(fgkNDetectors);
1075 qadm->EndOfCycle(AliQA::kRECPOINTS);
1081 // Cleanup of CDB manager: cache and active storages!
1082 AliCDBManager::Instance()->ClearCache();
1089 //_____________________________________________________________________________
1090 Bool_t AliReconstruction::RunLocalReconstruction(const TString& /*detectors*/)
1092 // run the local reconstruction
1093 static Int_t eventNr=0;
1094 AliCodeTimerAuto("")
1096 // AliCDBManager* man = AliCDBManager::Instance();
1097 // Bool_t origCache = man->GetCacheFlag();
1099 // TString detStr = detectors;
1100 // for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
1101 // if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
1102 // AliReconstructor* reconstructor = GetReconstructor(iDet);
1103 // if (!reconstructor) continue;
1104 // if (reconstructor->HasLocalReconstruction()) continue;
1106 // AliCodeTimerStart(Form("running reconstruction for %s", fgkDetectorName[iDet]));
1107 // AliInfo(Form("running reconstruction for %s", fgkDetectorName[iDet]));
1109 // AliCodeTimerStart(Form("Loading calibration data from OCDB for %s", fgkDetectorName[iDet]));
1110 // AliInfo(Form("Loading calibration data from OCDB for %s", fgkDetectorName[iDet]));
1112 // man->SetCacheFlag(kTRUE);
1113 // TString calibPath = Form("%s/Calib/*", fgkDetectorName[iDet]);
1114 // man->GetAll(calibPath); // entries are cached!
1116 // AliCodeTimerStop(Form("Loading calibration data from OCDB for %s", fgkDetectorName[iDet]));
1118 // if (fRawReader) {
1119 // fRawReader->RewindEvents();
1120 // reconstructor->Reconstruct(fRunLoader, fRawReader);
1122 // reconstructor->Reconstruct(fRunLoader);
1125 // AliCodeTimerStop(Form("running reconstruction for %s", fgkDetectorName[iDet]));
1126 // AliSysInfo::AddStamp(Form("LRec%s_%d",fgkDetectorName[iDet],eventNr));
1128 // // unload calibration data
1129 // man->UnloadFromCache(calibPath);
1130 // //man->ClearCache();
1133 // man->SetCacheFlag(origCache);
1135 // if ((detStr.CompareTo("ALL") != 0) && !detStr.IsNull()) {
1136 // AliError(Form("the following detectors were not found: %s",
1138 // if (fStopOnError) return kFALSE;
1145 //_____________________________________________________________________________
1146 Bool_t AliReconstruction::RunLocalEventReconstruction(const TString& detectors)
1148 // run the local reconstruction
1150 static Int_t eventNr=0;
1151 AliCodeTimerAuto("")
1153 TString detStr = detectors;
1154 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
1155 if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
1156 AliReconstructor* reconstructor = GetReconstructor(iDet);
1157 if (!reconstructor) continue;
1158 AliLoader* loader = fLoader[iDet];
1160 AliWarning(Form("No loader is defined for %s!",fgkDetectorName[iDet]));
1163 // conversion of digits
1164 if (fRawReader && reconstructor->HasDigitConversion()) {
1165 AliInfo(Form("converting raw data digits into root objects for %s",
1166 fgkDetectorName[iDet]));
1167 AliCodeTimerAuto(Form("converting raw data digits into root objects for %s",
1168 fgkDetectorName[iDet]));
1169 loader->LoadDigits("update");
1170 loader->CleanDigits();
1171 loader->MakeDigitsContainer();
1172 TTree* digitsTree = loader->TreeD();
1173 reconstructor->ConvertDigits(fRawReader, digitsTree);
1174 loader->WriteDigits("OVERWRITE");
1175 loader->UnloadDigits();
1177 // local reconstruction
1178 AliInfo(Form("running reconstruction for %s", fgkDetectorName[iDet]));
1179 AliCodeTimerAuto(Form("running reconstruction for %s", fgkDetectorName[iDet]));
1180 loader->LoadRecPoints("update");
1181 loader->CleanRecPoints();
1182 loader->MakeRecPointsContainer();
1183 TTree* clustersTree = loader->TreeR();
1184 if (fRawReader && !reconstructor->HasDigitConversion()) {
1185 reconstructor->Reconstruct(fRawReader, clustersTree);
1187 loader->LoadDigits("read");
1188 TTree* digitsTree = loader->TreeD();
1190 AliError(Form("Can't get the %s digits tree", fgkDetectorName[iDet]));
1191 if (fStopOnError) return kFALSE;
1193 reconstructor->Reconstruct(digitsTree, clustersTree);
1195 loader->UnloadDigits();
1198 // In-loop QA for local reconstrucion
1199 if (fRunQA && fInLoopQA) {
1200 AliQADataMakerRec * qadm = GetQADataMaker(iDet);
1203 //(Form("Running QA data maker for %s", fgkDetectorName[iDet]));
1205 //(Form("Running QA data maker for %s", fgkDetectorName[iDet]));
1207 qadm->Exec(AliQA::kRECPOINTS, clustersTree) ;
1210 //(Form("Running QA data maker for %s", fgkDetectorName[iDet]));
1214 loader->WriteRecPoints("OVERWRITE");
1215 loader->UnloadRecPoints();
1216 AliSysInfo::AddStamp(Form("LRec%s_%d",fgkDetectorName[iDet],eventNr), iDet,1,eventNr);
1219 if ((detStr.CompareTo("ALL") != 0) && !detStr.IsNull()) {
1220 AliError(Form("the following detectors were not found: %s",
1222 if (fStopOnError) return kFALSE;
1228 //_____________________________________________________________________________
1229 Bool_t AliReconstruction::RunVertexFinder(AliESDEvent*& esd)
1231 // run the barrel tracking
1233 AliCodeTimerAuto("")
1235 AliESDVertex* vertex = NULL;
1236 Double_t vtxPos[3] = {0, 0, 0};
1237 Double_t vtxErr[3] = {0.07, 0.07, 0.1};
1238 TArrayF mcVertex(3);
1239 if (fRunLoader->GetHeader() && fRunLoader->GetHeader()->GenEventHeader()) {
1240 fRunLoader->GetHeader()->GenEventHeader()->PrimaryVertex(mcVertex);
1241 for (Int_t i = 0; i < 3; i++) vtxPos[i] = mcVertex[i];
1245 if(fDiamondProfile) fVertexer->SetVtxStart(fDiamondProfile);
1246 AliInfo("running the ITS vertex finder");
1247 if (fLoader[0]) fLoader[0]->LoadRecPoints();
1248 vertex = fVertexer->FindVertexForCurrentEvent(fRunLoader->GetEventNumber());
1249 if (fLoader[0]) fLoader[0]->UnloadRecPoints();
1251 AliWarning("Vertex not found");
1252 vertex = new AliESDVertex();
1253 vertex->SetName("default");
1256 vertex->SetName("reconstructed");
1260 AliInfo("getting the primary vertex from MC");
1261 vertex = new AliESDVertex(vtxPos, vtxErr);
1265 vertex->GetXYZ(vtxPos);
1266 vertex->GetSigmaXYZ(vtxErr);
1268 AliWarning("no vertex reconstructed");
1269 vertex = new AliESDVertex(vtxPos, vtxErr);
1271 esd->SetVertex(vertex);
1272 // if SPD multiplicity has been determined, it is stored in the ESD
1273 AliMultiplicity *mult = fVertexer->GetMultiplicity();
1274 if(mult)esd->SetMultiplicity(mult);
1276 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
1277 if (fTracker[iDet]) fTracker[iDet]->SetVertex(vtxPos, vtxErr);
1284 //_____________________________________________________________________________
1285 Bool_t AliReconstruction::RunHLTTracking(AliESDEvent*& esd)
1287 // run the HLT barrel tracking
1289 AliCodeTimerAuto("")
1292 AliError("Missing runLoader!");
1296 AliInfo("running HLT tracking");
1298 // Get a pointer to the HLT reconstructor
1299 AliReconstructor *reconstructor = GetReconstructor(fgkNDetectors-1);
1300 if (!reconstructor) return kFALSE;
1303 for (Int_t iDet = 1; iDet >= 0; iDet--) {
1304 TString detName = fgkDetectorName[iDet];
1305 AliDebug(1, Form("%s HLT tracking", detName.Data()));
1306 reconstructor->SetOption(detName.Data());
1307 AliTracker *tracker = reconstructor->CreateTracker();
1309 AliWarning(Form("couldn't create a HLT tracker for %s", detName.Data()));
1310 if (fStopOnError) return kFALSE;
1314 Double_t vtxErr[3]={0.005,0.005,0.010};
1315 const AliESDVertex *vertex = esd->GetVertex();
1316 vertex->GetXYZ(vtxPos);
1317 tracker->SetVertex(vtxPos,vtxErr);
1319 fLoader[iDet]->LoadRecPoints("read");
1320 TTree* tree = fLoader[iDet]->TreeR();
1322 AliError(Form("Can't get the %s cluster tree", detName.Data()));
1325 tracker->LoadClusters(tree);
1327 if (tracker->Clusters2Tracks(esd) != 0) {
1328 AliError(Form("HLT %s Clusters2Tracks failed", fgkDetectorName[iDet]));
1332 tracker->UnloadClusters();
1340 //_____________________________________________________________________________
1341 Bool_t AliReconstruction::RunMuonTracking(AliESDEvent*& esd)
1343 // run the muon spectrometer tracking
1345 AliCodeTimerAuto("")
1348 AliError("Missing runLoader!");
1351 Int_t iDet = 7; // for MUON
1353 AliInfo("is running...");
1355 // Get a pointer to the MUON reconstructor
1356 AliReconstructor *reconstructor = GetReconstructor(iDet);
1357 if (!reconstructor) return kFALSE;
1360 TString detName = fgkDetectorName[iDet];
1361 AliDebug(1, Form("%s tracking", detName.Data()));
1362 AliTracker *tracker = reconstructor->CreateTracker();
1364 AliWarning(Form("couldn't create a tracker for %s", detName.Data()));
1369 fLoader[iDet]->LoadRecPoints("read");
1371 tracker->LoadClusters(fLoader[iDet]->TreeR());
1373 Int_t rv = tracker->Clusters2Tracks(esd);
1377 AliError(Form("%s Clusters2Tracks failed", fgkDetectorName[iDet]));
1381 fLoader[iDet]->UnloadRecPoints();
1383 tracker->UnloadClusters();
1391 //_____________________________________________________________________________
1392 Bool_t AliReconstruction::RunTracking(AliESDEvent*& esd)
1394 // run the barrel tracking
1395 static Int_t eventNr=0;
1396 AliCodeTimerAuto("")
1398 AliInfo("running tracking");
1400 //Fill the ESD with the T0 info (will be used by the TOF)
1401 if (fReconstructor[11] && fLoader[11]) {
1402 fLoader[11]->LoadRecPoints("READ");
1403 TTree *treeR = fLoader[11]->TreeR();
1404 GetReconstructor(11)->FillESD((TTree *)NULL,treeR,esd);
1407 // pass 1: TPC + ITS inwards
1408 for (Int_t iDet = 1; iDet >= 0; iDet--) {
1409 if (!fTracker[iDet]) continue;
1410 AliDebug(1, Form("%s tracking", fgkDetectorName[iDet]));
1413 fLoader[iDet]->LoadRecPoints("read");
1414 AliSysInfo::AddStamp(Form("RLoadCluster%s_%d",fgkDetectorName[iDet],eventNr),iDet,1, eventNr);
1415 TTree* tree = fLoader[iDet]->TreeR();
1417 AliError(Form("Can't get the %s cluster tree", fgkDetectorName[iDet]));
1420 fTracker[iDet]->LoadClusters(tree);
1421 AliSysInfo::AddStamp(Form("TLoadCluster%s_%d",fgkDetectorName[iDet],eventNr), iDet,2, eventNr);
1423 if (fTracker[iDet]->Clusters2Tracks(esd) != 0) {
1424 AliError(Form("%s Clusters2Tracks failed", fgkDetectorName[iDet]));
1427 if (fCheckPointLevel > 1) {
1428 WriteESD(esd, Form("%s.tracking", fgkDetectorName[iDet]));
1430 // preliminary PID in TPC needed by the ITS tracker
1432 GetReconstructor(1)->FillESD((TTree*)NULL, (TTree*)NULL, esd);
1433 AliESDpid::MakePID(esd);
1435 AliSysInfo::AddStamp(Form("Tracking0%s_%d",fgkDetectorName[iDet],eventNr), iDet,3,eventNr);
1438 // pass 2: ALL backwards
1440 if (fRunQA && fRunGlobalQA) AliTracker::SetFillResiduals(kTRUE);
1442 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
1443 if (!fTracker[iDet]) continue;
1444 AliDebug(1, Form("%s back propagation", fgkDetectorName[iDet]));
1447 if (iDet > 1) { // all except ITS, TPC
1449 fLoader[iDet]->LoadRecPoints("read");
1450 AliSysInfo::AddStamp(Form("RLoadCluster0%s_%d",fgkDetectorName[iDet],eventNr), iDet,1, eventNr);
1451 tree = fLoader[iDet]->TreeR();
1453 AliError(Form("Can't get the %s cluster tree", fgkDetectorName[iDet]));
1456 fTracker[iDet]->LoadClusters(tree);
1457 AliSysInfo::AddStamp(Form("TLoadCluster0%s_%d",fgkDetectorName[iDet],eventNr), iDet,2, eventNr);
1461 if (fTracker[iDet]->PropagateBack(esd) != 0) {
1462 AliError(Form("%s backward propagation failed", fgkDetectorName[iDet]));
1465 if (fCheckPointLevel > 1) {
1466 WriteESD(esd, Form("%s.back", fgkDetectorName[iDet]));
1470 if (iDet > 2) { // all except ITS, TPC, TRD
1471 fTracker[iDet]->UnloadClusters();
1472 fLoader[iDet]->UnloadRecPoints();
1474 // updated PID in TPC needed by the ITS tracker -MI
1476 GetReconstructor(1)->FillESD((TTree*)NULL, (TTree*)NULL, esd);
1477 AliESDpid::MakePID(esd);
1479 AliSysInfo::AddStamp(Form("Tracking1%s_%d",fgkDetectorName[iDet],eventNr), iDet,3, eventNr);
1482 if (fRunQA && fRunGlobalQA) AliTracker::SetFillResiduals(kFALSE);
1484 // write space-points to the ESD in case alignment data output
1486 if (fWriteAlignmentData)
1487 WriteAlignmentData(esd);
1489 // pass 3: TRD + TPC + ITS refit inwards
1492 for (Int_t iDet = 2; iDet >= 0; iDet--) {
1493 if (!fTracker[iDet]) continue;
1494 AliDebug(1, Form("%s inward refit", fgkDetectorName[iDet]));
1497 if (fTracker[iDet]->RefitInward(esd) != 0) {
1498 AliError(Form("%s inward refit failed", fgkDetectorName[iDet]));
1501 // run postprocessing
1502 if (fTracker[iDet]->PostProcess(esd) != 0) {
1503 AliError(Form("%s postprocessing failed", fgkDetectorName[iDet]));
1506 if (fCheckPointLevel > 1) {
1507 WriteESD(esd, Form("%s.refit", fgkDetectorName[iDet]));
1509 AliSysInfo::AddStamp(Form("Tracking2%s_%d",fgkDetectorName[iDet],eventNr), iDet,3, eventNr);
1511 fTracker[iDet]->UnloadClusters();
1512 AliSysInfo::AddStamp(Form("TUnloadCluster%s_%d",fgkDetectorName[iDet],eventNr), iDet,4, eventNr);
1513 fLoader[iDet]->UnloadRecPoints();
1514 AliSysInfo::AddStamp(Form("RUnloadCluster%s_%d",fgkDetectorName[iDet],eventNr), iDet,5, eventNr);
1518 // Propagate track to the vertex - if not done by ITS
1520 Int_t ntracks = esd->GetNumberOfTracks();
1521 for (Int_t itrack=0; itrack<ntracks; itrack++){
1522 const Double_t kRadius = 3; // beam pipe radius
1523 const Double_t kMaxStep = 5; // max step
1524 const Double_t kMaxD = 123456; // max distance to prim vertex
1525 Double_t fieldZ = AliTracker::GetBz(); //
1526 AliESDtrack * track = esd->GetTrack(itrack);
1527 if (!track) continue;
1528 if (track->IsOn(AliESDtrack::kITSrefit)) continue;
1529 AliTracker::PropagateTrackTo(track,kRadius,track->GetMass(),kMaxStep,kTRUE);
1530 track->RelateToVertex(esd->GetVertex(),fieldZ, kMaxD);
1536 //_____________________________________________________________________________
1537 Bool_t AliReconstruction::CleanESD(AliESDEvent *esd){
1539 // Remove the data which are not needed for the physics analysis.
1542 Int_t nTracks=esd->GetNumberOfTracks();
1543 Int_t nV0s=esd->GetNumberOfV0s();
1545 (Form("Number of ESD tracks and V0s before cleaning: %d %d",nTracks,nV0s));
1547 Float_t cleanPars[]={fV0DCAmax,fV0CsPmin,fDmax,fZmax};
1548 Bool_t rc=esd->Clean(cleanPars);
1550 nTracks=esd->GetNumberOfTracks();
1551 nV0s=esd->GetNumberOfV0s();
1553 (Form("Number of ESD tracks and V0s after cleaning %d %d",nTracks,nV0s));
1558 //_____________________________________________________________________________
1559 Bool_t AliReconstruction::FillESD(AliESDEvent*& esd, const TString& detectors)
1561 // fill the event summary data
1563 AliCodeTimerAuto("")
1564 static Int_t eventNr=0;
1565 TString detStr = detectors;
1567 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
1568 if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
1569 AliReconstructor* reconstructor = GetReconstructor(iDet);
1570 if (!reconstructor) continue;
1571 if (!ReadESD(esd, fgkDetectorName[iDet])) {
1572 AliDebug(1, Form("filling ESD for %s", fgkDetectorName[iDet]));
1573 TTree* clustersTree = NULL;
1574 if (fLoader[iDet]) {
1575 fLoader[iDet]->LoadRecPoints("read");
1576 clustersTree = fLoader[iDet]->TreeR();
1577 if (!clustersTree) {
1578 AliError(Form("Can't get the %s clusters tree",
1579 fgkDetectorName[iDet]));
1580 if (fStopOnError) return kFALSE;
1583 if (fRawReader && !reconstructor->HasDigitConversion()) {
1584 reconstructor->FillESD(fRawReader, clustersTree, esd);
1586 TTree* digitsTree = NULL;
1587 if (fLoader[iDet]) {
1588 fLoader[iDet]->LoadDigits("read");
1589 digitsTree = fLoader[iDet]->TreeD();
1591 AliError(Form("Can't get the %s digits tree",
1592 fgkDetectorName[iDet]));
1593 if (fStopOnError) return kFALSE;
1596 reconstructor->FillESD(digitsTree, clustersTree, esd);
1597 if (fLoader[iDet]) fLoader[iDet]->UnloadDigits();
1599 if (fLoader[iDet]) {
1600 fLoader[iDet]->UnloadRecPoints();
1603 if (fCheckPointLevel > 2) WriteESD(esd, fgkDetectorName[iDet]);
1607 if ((detStr.CompareTo("ALL") != 0) && !detStr.IsNull()) {
1608 AliError(Form("the following detectors were not found: %s",
1610 if (fStopOnError) return kFALSE;
1612 AliSysInfo::AddStamp(Form("FillESD%d",eventNr), 0,1, eventNr);
1617 //_____________________________________________________________________________
1618 Bool_t AliReconstruction::FillTriggerESD(AliESDEvent*& esd)
1620 // Reads the trigger decision which is
1621 // stored in Trigger.root file and fills
1622 // the corresponding esd entries
1624 AliCodeTimerAuto("")
1626 AliInfo("Filling trigger information into the ESD");
1629 AliCTPRawStream input(fRawReader);
1630 if (!input.Next()) {
1631 AliError("No valid CTP (trigger) DDL raw data is found ! The trigger information is not stored in the ESD !");
1634 esd->SetTriggerMask(input.GetClassMask());
1635 esd->SetTriggerCluster(input.GetClusterMask());
1638 AliRunLoader *runloader = AliRunLoader::GetRunLoader();
1640 if (!runloader->LoadTrigger()) {
1641 AliCentralTrigger *aCTP = runloader->GetTrigger();
1642 esd->SetTriggerMask(aCTP->GetClassMask());
1643 esd->SetTriggerCluster(aCTP->GetClusterMask());
1646 AliWarning("No trigger can be loaded! The trigger information is not stored in the ESD !");
1651 AliError("No run loader is available! The trigger information is not stored in the ESD !");
1663 //_____________________________________________________________________________
1664 Bool_t AliReconstruction::FillRawEventHeaderESD(AliESDEvent*& esd)
1667 // Filling information from RawReader Header
1670 AliInfo("Filling information from RawReader Header");
1671 esd->SetBunchCrossNumber(0);
1672 esd->SetOrbitNumber(0);
1673 esd->SetPeriodNumber(0);
1674 esd->SetTimeStamp(0);
1675 esd->SetEventType(0);
1676 const AliRawEventHeaderBase * eventHeader = fRawReader->GetEventHeader();
1679 const UInt_t *id = eventHeader->GetP("Id");
1680 esd->SetBunchCrossNumber((id)[1]&0x00000fff);
1681 esd->SetOrbitNumber((((id)[0]<<20)&0xf00000)|(((id)[1]>>12)&0xfffff));
1682 esd->SetPeriodNumber(((id)[0]>>4)&0x0fffffff);
1684 esd->SetTimeStamp((eventHeader->Get("Timestamp")));
1685 esd->SetEventType((eventHeader->Get("Type")));
1692 //_____________________________________________________________________________
1693 Bool_t AliReconstruction::IsSelected(TString detName, TString& detectors) const
1695 // check whether detName is contained in detectors
1696 // if yes, it is removed from detectors
1698 // check if all detectors are selected
1699 if ((detectors.CompareTo("ALL") == 0) ||
1700 detectors.BeginsWith("ALL ") ||
1701 detectors.EndsWith(" ALL") ||
1702 detectors.Contains(" ALL ")) {
1707 // search for the given detector
1708 Bool_t result = kFALSE;
1709 if ((detectors.CompareTo(detName) == 0) ||
1710 detectors.BeginsWith(detName+" ") ||
1711 detectors.EndsWith(" "+detName) ||
1712 detectors.Contains(" "+detName+" ")) {
1713 detectors.ReplaceAll(detName, "");
1717 // clean up the detectors string
1718 while (detectors.Contains(" ")) detectors.ReplaceAll(" ", " ");
1719 while (detectors.BeginsWith(" ")) detectors.Remove(0, 1);
1720 while (detectors.EndsWith(" ")) detectors.Remove(detectors.Length()-1, 1);
1725 //_____________________________________________________________________________
1726 Bool_t AliReconstruction::InitRunLoader()
1728 // get or create the run loader
1730 if (gAlice) delete gAlice;
1733 if (!gSystem->AccessPathName(fGAliceFileName.Data())) { // galice.root exists
1734 // load all base libraries to get the loader classes
1735 TString libs = gSystem->GetLibraries();
1736 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
1737 TString detName = fgkDetectorName[iDet];
1738 if (detName == "HLT") continue;
1739 if (libs.Contains("lib" + detName + "base.so")) continue;
1740 gSystem->Load("lib" + detName + "base.so");
1742 fRunLoader = AliRunLoader::Open(fGAliceFileName.Data());
1744 AliError(Form("no run loader found in file %s", fGAliceFileName.Data()));
1748 fRunLoader->CdGAFile();
1749 if (gFile->GetKey(AliRunLoader::GetGAliceName())) {
1750 if (fRunLoader->LoadgAlice() == 0) {
1751 gAlice = fRunLoader->GetAliRun();
1752 AliTracker::SetFieldMap(gAlice->Field(),fUniformField);
1755 if (!gAlice && !fRawReader) {
1756 AliError(Form("no gAlice object found in file %s",
1757 fGAliceFileName.Data()));
1762 //PH This is a temporary fix to give access to the kinematics
1763 //PH that is needed for the labels of ITS clusters
1764 fRunLoader->LoadHeader();
1765 fRunLoader->LoadKinematics();
1767 } else { // galice.root does not exist
1769 AliError(Form("the file %s does not exist", fGAliceFileName.Data()));
1773 fRunLoader = AliRunLoader::Open(fGAliceFileName.Data(),
1774 AliConfig::GetDefaultEventFolderName(),
1777 AliError(Form("could not create run loader in file %s",
1778 fGAliceFileName.Data()));
1782 fRunLoader->MakeTree("E");
1784 while (fRawReader->NextEvent()) {
1785 fRunLoader->SetEventNumber(iEvent);
1786 fRunLoader->GetHeader()->Reset(fRawReader->GetRunNumber(),
1788 fRunLoader->MakeTree("H");
1789 fRunLoader->TreeE()->Fill();
1792 fRawReader->RewindEvents();
1793 if (fNumberOfEventsPerFile > 0)
1794 fRunLoader->SetNumberOfEventsPerFile(fNumberOfEventsPerFile);
1796 fRunLoader->SetNumberOfEventsPerFile(iEvent);
1797 fRunLoader->WriteHeader("OVERWRITE");
1798 fRunLoader->CdGAFile();
1799 fRunLoader->Write(0, TObject::kOverwrite);
1800 // AliTracker::SetFieldMap(???);
1806 //_____________________________________________________________________________
1807 AliReconstructor* AliReconstruction::GetReconstructor(Int_t iDet)
1809 // get the reconstructor object and the loader for a detector
1811 if (fReconstructor[iDet]) return fReconstructor[iDet];
1813 // load the reconstructor object
1814 TPluginManager* pluginManager = gROOT->GetPluginManager();
1815 TString detName = fgkDetectorName[iDet];
1816 TString recName = "Ali" + detName + "Reconstructor";
1817 if (gAlice && !gAlice->GetDetector(detName) && (detName != "HLT")) return NULL;
1819 AliReconstructor* reconstructor = NULL;
1820 // first check if a plugin is defined for the reconstructor
1821 TPluginHandler* pluginHandler =
1822 pluginManager->FindHandler("AliReconstructor", detName);
1823 // if not, add a plugin for it
1824 if (!pluginHandler) {
1825 AliDebug(1, Form("defining plugin for %s", recName.Data()));
1826 TString libs = gSystem->GetLibraries();
1827 if (libs.Contains("lib" + detName + "base.so") ||
1828 (gSystem->Load("lib" + detName + "base.so") >= 0)) {
1829 pluginManager->AddHandler("AliReconstructor", detName,
1830 recName, detName + "rec", recName + "()");
1832 pluginManager->AddHandler("AliReconstructor", detName,
1833 recName, detName, recName + "()");
1835 pluginHandler = pluginManager->FindHandler("AliReconstructor", detName);
1837 if (pluginHandler && (pluginHandler->LoadPlugin() == 0)) {
1838 reconstructor = (AliReconstructor*) pluginHandler->ExecPlugin(0);
1840 if (reconstructor) {
1841 TObject* obj = fOptions.FindObject(detName.Data());
1842 if (obj) reconstructor->SetOption(obj->GetTitle());
1843 reconstructor->Init();
1844 fReconstructor[iDet] = reconstructor;
1847 // get or create the loader
1848 if (detName != "HLT") {
1849 fLoader[iDet] = fRunLoader->GetLoader(detName + "Loader");
1850 if (!fLoader[iDet]) {
1851 AliConfig::Instance()
1852 ->CreateDetectorFolders(fRunLoader->GetEventFolder(),
1854 // first check if a plugin is defined for the loader
1856 pluginManager->FindHandler("AliLoader", detName);
1857 // if not, add a plugin for it
1858 if (!pluginHandler) {
1859 TString loaderName = "Ali" + detName + "Loader";
1860 AliDebug(1, Form("defining plugin for %s", loaderName.Data()));
1861 pluginManager->AddHandler("AliLoader", detName,
1862 loaderName, detName + "base",
1863 loaderName + "(const char*, TFolder*)");
1864 pluginHandler = pluginManager->FindHandler("AliLoader", detName);
1866 if (pluginHandler && (pluginHandler->LoadPlugin() == 0)) {
1868 (AliLoader*) pluginHandler->ExecPlugin(2, detName.Data(),
1869 fRunLoader->GetEventFolder());
1871 if (!fLoader[iDet]) { // use default loader
1872 fLoader[iDet] = new AliLoader(detName, fRunLoader->GetEventFolder());
1874 if (!fLoader[iDet]) {
1875 AliWarning(Form("couldn't get loader for %s", detName.Data()));
1876 if (fStopOnError) return NULL;
1878 fRunLoader->AddLoader(fLoader[iDet]);
1879 fRunLoader->CdGAFile();
1880 if (gFile && !gFile->IsWritable()) gFile->ReOpen("UPDATE");
1881 fRunLoader->Write(0, TObject::kOverwrite);
1886 return reconstructor;
1889 //_____________________________________________________________________________
1890 Bool_t AliReconstruction::CreateVertexer()
1892 // create the vertexer
1895 AliReconstructor* itsReconstructor = GetReconstructor(0);
1896 if (itsReconstructor) {
1897 fVertexer = itsReconstructor->CreateVertexer();
1900 AliWarning("couldn't create a vertexer for ITS");
1901 if (fStopOnError) return kFALSE;
1907 //_____________________________________________________________________________
1908 Bool_t AliReconstruction::CreateTrackers(const TString& detectors)
1910 // create the trackers
1912 TString detStr = detectors;
1913 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
1914 if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
1915 AliReconstructor* reconstructor = GetReconstructor(iDet);
1916 if (!reconstructor) continue;
1917 TString detName = fgkDetectorName[iDet];
1918 if (detName == "HLT") {
1919 fRunHLTTracking = kTRUE;
1922 if (detName == "MUON") {
1923 fRunMuonTracking = kTRUE;
1928 fTracker[iDet] = reconstructor->CreateTracker();
1929 if (!fTracker[iDet] && (iDet < 7)) {
1930 AliWarning(Form("couldn't create a tracker for %s", detName.Data()));
1931 if (fStopOnError) return kFALSE;
1933 AliSysInfo::AddStamp(Form("LTracker%s",fgkDetectorName[iDet]), iDet,0);
1939 //_____________________________________________________________________________
1940 void AliReconstruction::CleanUp(TFile* file, TFile* fileOld)
1942 // delete trackers and the run loader and close and delete the file
1944 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
1945 delete fReconstructor[iDet];
1946 fReconstructor[iDet] = NULL;
1947 fLoader[iDet] = NULL;
1948 delete fTracker[iDet];
1949 fTracker[iDet] = NULL;
1950 // delete fQADataMaker[iDet];
1951 // fQADataMaker[iDet] = NULL;
1956 if(!(AliCDBManager::Instance()->GetCacheFlag())) {
1957 delete fDiamondProfile;
1958 fDiamondProfile = NULL;
1977 gSystem->Unlink("AliESDs.old.root");
1981 //_____________________________________________________________________________
1983 Bool_t AliReconstruction::ReadESD(AliESDEvent*& esd, const char* recStep) const
1985 // read the ESD event from a file
1987 if (!esd) return kFALSE;
1989 sprintf(fileName, "ESD_%d.%d_%s.root",
1990 esd->GetRunNumber(), esd->GetEventNumberInFile(), recStep);
1991 if (gSystem->AccessPathName(fileName)) return kFALSE;
1993 AliInfo(Form("reading ESD from file %s", fileName));
1994 AliDebug(1, Form("reading ESD from file %s", fileName));
1995 TFile* file = TFile::Open(fileName);
1996 if (!file || !file->IsOpen()) {
1997 AliError(Form("opening %s failed", fileName));
2004 esd = (AliESDEvent*) file->Get("ESD");
2013 //_____________________________________________________________________________
2014 void AliReconstruction::WriteESD(AliESDEvent* esd, const char* recStep) const
2016 // write the ESD event to a file
2020 sprintf(fileName, "ESD_%d.%d_%s.root",
2021 esd->GetRunNumber(), esd->GetEventNumberInFile(), recStep);
2023 AliDebug(1, Form("writing ESD to file %s", fileName));
2024 TFile* file = TFile::Open(fileName, "recreate");
2025 if (!file || !file->IsOpen()) {
2026 AliError(Form("opening %s failed", fileName));
2038 //_____________________________________________________________________________
2039 void AliReconstruction::ESDFile2AODFile(TFile* esdFile, TFile* aodFile)
2041 // write all files from the given esd file to an aod file
2043 // create an AliAOD object
2044 AliAODEvent *aod = new AliAODEvent();
2045 aod->CreateStdContent();
2051 TTree *aodTree = new TTree("aodTree", "AliAOD tree");
2052 aodTree->Branch(aod->GetList());
2055 TTree *t = (TTree*) esdFile->Get("esdTree");
2056 AliESDEvent *esd = new AliESDEvent();
2057 esd->ReadFromTree(t);
2059 Int_t nEvents = t->GetEntries();
2061 // set arrays and pointers
2071 // loop over events and fill them
2072 for (Int_t iEvent = 0; iEvent < nEvents; ++iEvent) {
2073 //cout << "event: " << iEvent << endl;
2074 t->GetEntry(iEvent);
2076 // Multiplicity information needed by the header (to be revised!)
2077 Int_t nTracks = esd->GetNumberOfTracks();
2078 Int_t nPosTracks = 0;
2079 for (Int_t iTrack=0; iTrack<nTracks; ++iTrack)
2080 if (esd->GetTrack(iTrack)->Charge()> 0) nPosTracks++;
2082 // Access the header
2083 AliAODHeader *header = aod->GetHeader();
2086 header->SetRunNumber (esd->GetRunNumber() );
2087 header->SetBunchCrossNumber(esd->GetBunchCrossNumber());
2088 header->SetOrbitNumber (esd->GetOrbitNumber() );
2089 header->SetPeriodNumber (esd->GetPeriodNumber() );
2090 header->SetTriggerMask (esd->GetTriggerMask() );
2091 header->SetTriggerCluster (esd->GetTriggerCluster() );
2092 header->SetEventType (esd->GetEventType() );
2093 header->SetMagneticField (esd->GetMagneticField() );
2094 header->SetZDCN1Energy (esd->GetZDCN1Energy() );
2095 header->SetZDCP1Energy (esd->GetZDCP1Energy() );
2096 header->SetZDCN2Energy (esd->GetZDCN2Energy() );
2097 header->SetZDCP2Energy (esd->GetZDCP2Energy() );
2098 header->SetZDCEMEnergy (esd->GetZDCEMEnergy(0),esd->GetZDCEMEnergy(1));
2099 header->SetRefMultiplicity (nTracks);
2100 header->SetRefMultiplicityPos(nPosTracks);
2101 header->SetRefMultiplicityNeg(nTracks - nPosTracks);
2102 header->SetMuonMagFieldScale(-999.); // FIXME
2103 header->SetCentrality(-999.); // FIXME
2105 Int_t nV0s = esd->GetNumberOfV0s();
2106 Int_t nCascades = esd->GetNumberOfCascades();
2107 Int_t nKinks = esd->GetNumberOfKinks();
2108 Int_t nVertices = nV0s + 2*nCascades /*could lead to two vertices, one V0 and the Xi */+ nKinks + 1 /* = prim. vtx*/;
2110 Int_t nCaloClus = esd->GetNumberOfCaloClusters();
2112 Int_t nPmdClus = esd->GetNumberOfPmdTracks();
2114 aod->ResetStd(nTracks, nVertices, nV0s+nCascades, nJets, nCaloClus, nFmdClus, nPmdClus);
2116 // Array to take into account the tracks already added to the AOD
2117 Bool_t * usedTrack = NULL;
2119 usedTrack = new Bool_t[nTracks];
2120 for (Int_t iTrack=0; iTrack<nTracks; ++iTrack) usedTrack[iTrack]=kFALSE;
2122 // Array to take into account the V0s already added to the AOD
2123 Bool_t * usedV0 = NULL;
2125 usedV0 = new Bool_t[nV0s];
2126 for (Int_t iV0=0; iV0<nV0s; ++iV0) usedV0[iV0]=kFALSE;
2128 // Array to take into account the kinks already added to the AOD
2129 Bool_t * usedKink = NULL;
2131 usedKink = new Bool_t[nKinks];
2132 for (Int_t iKink=0; iKink<nKinks; ++iKink) usedKink[iKink]=kFALSE;
2135 // Access to the AOD container of vertices
2136 TClonesArray &vertices = *(aod->GetVertices());
2139 // Access to the AOD container of tracks
2140 TClonesArray &tracks = *(aod->GetTracks());
2143 // Access to the AOD container of V0s
2144 TClonesArray &V0s = *(aod->GetV0s());
2147 // Add primary vertex. The primary tracks will be defined
2148 // after the loops on the composite objects (V0, cascades, kinks)
2149 const AliESDVertex *vtx = esd->GetPrimaryVertex();
2151 vtx->GetXYZ(pos); // position
2152 vtx->GetCovMatrix(covVtx); //covariance matrix
2154 AliAODVertex * primary = new(vertices[jVertices++])
2155 AliAODVertex(pos, covVtx, vtx->GetChi2toNDF(), NULL, -1, AliAODVertex::kPrimary);
2158 AliAODTrack *aodTrack = 0x0;
2160 // Create vertices starting from the most complex objects
2163 for (Int_t nCascade = 0; nCascade < nCascades; ++nCascade) {
2164 AliESDcascade *cascade = esd->GetCascade(nCascade);
2166 cascade->GetXYZ(pos[0], pos[1], pos[2]);
2167 cascade->GetPosCovXi(covVtx);
2169 // Add the cascade vertex
2170 AliAODVertex * vcascade = new(vertices[jVertices++]) AliAODVertex(pos,
2172 cascade->GetChi2Xi(), // = chi2/NDF since NDF = 2*2-3
2175 AliAODVertex::kCascade);
2177 primary->AddDaughter(vcascade); // the cascade 'particle' (represented by a vertex) is added as a daughter to the primary vertex
2179 // Add the V0 from the cascade. The ESD class have to be optimized...
2180 // Now we have to search for the corresponding V0 in the list of V0s
2181 // using the indeces of the positive and negative tracks
2183 Int_t posFromV0 = cascade->GetPindex();
2184 Int_t negFromV0 = cascade->GetNindex();
2187 AliESDv0 * v0 = 0x0;
2190 for (Int_t iV0=0; iV0<nV0s; ++iV0) {
2192 v0 = esd->GetV0(iV0);
2193 Int_t posV0 = v0->GetPindex();
2194 Int_t negV0 = v0->GetNindex();
2196 if (posV0==posFromV0 && negV0==negFromV0) {
2202 AliAODVertex * vV0FromCascade = 0x0;
2204 if (indV0>-1 && !usedV0[indV0]) {
2206 // the V0 exists in the array of V0s and is not used
2208 usedV0[indV0] = kTRUE;
2210 v0->GetXYZ(pos[0], pos[1], pos[2]);
2211 v0->GetPosCov(covVtx);
2213 vV0FromCascade = new(vertices[jVertices++]) AliAODVertex(pos,
2215 v0->GetChi2V0(), // = chi2/NDF since NDF = 2*2-3
2221 // the V0 doesn't exist in the array of V0s or was used
2222 cerr << "Error: event " << iEvent << " cascade " << nCascade
2223 << " The V0 " << indV0
2224 << " doesn't exist in the array of V0s or was used!" << endl;
2226 cascade->GetXYZ(pos[0], pos[1], pos[2]);
2227 cascade->GetPosCov(covVtx);
2229 vV0FromCascade = new(vertices[jVertices++]) AliAODVertex(pos,
2231 v0->GetChi2V0(), // = chi2/NDF since NDF = 2*2-3
2235 vcascade->AddDaughter(vV0FromCascade);
2239 // Add the positive tracks from the V0
2241 if (! usedTrack[posFromV0]) {
2243 usedTrack[posFromV0] = kTRUE;
2245 AliESDtrack *esdTrack = esd->GetTrack(posFromV0);
2246 esdTrack->GetPxPyPz(p_pos);
2247 esdTrack->GetXYZ(pos);
2248 esdTrack->GetCovarianceXYZPxPyPz(covTr);
2249 esdTrack->GetESDpid(pid);
2251 vV0FromCascade->AddDaughter(aodTrack =
2252 new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
2253 esdTrack->GetLabel(),
2259 (Short_t)esdTrack->Charge(),
2260 esdTrack->GetITSClusterMap(),
2263 kTRUE, // check if this is right
2264 kFALSE, // check if this is right
2265 AliAODTrack::kSecondary)
2267 aodTrack->ConvertAliPIDtoAODPID();
2270 cerr << "Error: event " << iEvent << " cascade " << nCascade
2271 << " track " << posFromV0 << " has already been used!" << endl;
2274 // Add the negative tracks from the V0
2276 if (!usedTrack[negFromV0]) {
2278 usedTrack[negFromV0] = kTRUE;
2280 AliESDtrack *esdTrack = esd->GetTrack(negFromV0);
2281 esdTrack->GetPxPyPz(p_neg);
2282 esdTrack->GetXYZ(pos);
2283 esdTrack->GetCovarianceXYZPxPyPz(covTr);
2284 esdTrack->GetESDpid(pid);
2286 vV0FromCascade->AddDaughter(aodTrack =
2287 new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
2288 esdTrack->GetLabel(),
2294 (Short_t)esdTrack->Charge(),
2295 esdTrack->GetITSClusterMap(),
2298 kTRUE, // check if this is right
2299 kFALSE, // check if this is right
2300 AliAODTrack::kSecondary)
2302 aodTrack->ConvertAliPIDtoAODPID();
2305 cerr << "Error: event " << iEvent << " cascade " << nCascade
2306 << " track " << negFromV0 << " has already been used!" << endl;
2309 // add it to the V0 array as well
2310 Double_t d0[2] = { -999., -99.};
2311 // counting is probably wrong
2312 new(V0s[jV0s++]) AliAODv0(vV0FromCascade, -999., -99., p_pos, p_neg, d0); // to be refined
2314 // Add the bachelor track from the cascade
2316 Int_t bachelor = cascade->GetBindex();
2318 if(!usedTrack[bachelor]) {
2320 usedTrack[bachelor] = kTRUE;
2322 AliESDtrack *esdTrack = esd->GetTrack(bachelor);
2323 esdTrack->GetPxPyPz(p);
2324 esdTrack->GetXYZ(pos);
2325 esdTrack->GetCovarianceXYZPxPyPz(covTr);
2326 esdTrack->GetESDpid(pid);
2328 vcascade->AddDaughter(aodTrack =
2329 new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
2330 esdTrack->GetLabel(),
2336 (Short_t)esdTrack->Charge(),
2337 esdTrack->GetITSClusterMap(),
2340 kTRUE, // check if this is right
2341 kFALSE, // check if this is right
2342 AliAODTrack::kSecondary)
2344 aodTrack->ConvertAliPIDtoAODPID();
2347 cerr << "Error: event " << iEvent << " cascade " << nCascade
2348 << " track " << bachelor << " has already been used!" << endl;
2351 // Add the primary track of the cascade (if any)
2353 } // end of the loop on cascades
2357 for (Int_t nV0 = 0; nV0 < nV0s; ++nV0) {
2359 if (usedV0[nV0]) continue; // skip if aready added to the AOD
2361 AliESDv0 *v0 = esd->GetV0(nV0);
2363 v0->GetXYZ(pos[0], pos[1], pos[2]);
2364 v0->GetPosCov(covVtx);
2366 AliAODVertex * vV0 =
2367 new(vertices[jVertices++]) AliAODVertex(pos,
2369 v0->GetChi2V0(), // = chi2/NDF since NDF = 2*2-3
2373 primary->AddDaughter(vV0);
2375 Int_t posFromV0 = v0->GetPindex();
2376 Int_t negFromV0 = v0->GetNindex();
2378 // Add the positive tracks from the V0
2380 if (!usedTrack[posFromV0]) {
2382 usedTrack[posFromV0] = kTRUE;
2384 AliESDtrack *esdTrack = esd->GetTrack(posFromV0);
2385 esdTrack->GetPxPyPz(p_pos);
2386 esdTrack->GetXYZ(pos);
2387 esdTrack->GetCovarianceXYZPxPyPz(covTr);
2388 esdTrack->GetESDpid(pid);
2390 vV0->AddDaughter(aodTrack =
2391 new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
2392 esdTrack->GetLabel(),
2398 (Short_t)esdTrack->Charge(),
2399 esdTrack->GetITSClusterMap(),
2402 kTRUE, // check if this is right
2403 kFALSE, // check if this is right
2404 AliAODTrack::kSecondary)
2406 aodTrack->ConvertAliPIDtoAODPID();
2409 cerr << "Error: event " << iEvent << " V0 " << nV0
2410 << " track " << posFromV0 << " has already been used!" << endl;
2413 // Add the negative tracks from the V0
2415 if (!usedTrack[negFromV0]) {
2417 usedTrack[negFromV0] = kTRUE;
2419 AliESDtrack *esdTrack = esd->GetTrack(negFromV0);
2420 esdTrack->GetPxPyPz(p_neg);
2421 esdTrack->GetXYZ(pos);
2422 esdTrack->GetCovarianceXYZPxPyPz(covTr);
2423 esdTrack->GetESDpid(pid);
2425 vV0->AddDaughter(aodTrack =
2426 new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
2427 esdTrack->GetLabel(),
2433 (Short_t)esdTrack->Charge(),
2434 esdTrack->GetITSClusterMap(),
2437 kTRUE, // check if this is right
2438 kFALSE, // check if this is right
2439 AliAODTrack::kSecondary)
2441 aodTrack->ConvertAliPIDtoAODPID();
2444 cerr << "Error: event " << iEvent << " V0 " << nV0
2445 << " track " << negFromV0 << " has already been used!" << endl;
2448 // add it to the V0 array as well
2449 Double_t d0[2] = { 999., 99.};
2450 new(V0s[jV0s++]) AliAODv0(vV0, 999., 99., p_pos, p_neg, d0); // to be refined
2453 // end of the loop on V0s
2455 // Kinks: it is a big mess the access to the information in the kinks
2456 // The loop is on the tracks in order to find the mother and daugther of each kink
2459 for (Int_t iTrack=0; iTrack<nTracks; ++iTrack) {
2461 AliESDtrack * esdTrack = esd->GetTrack(iTrack);
2463 Int_t ikink = esdTrack->GetKinkIndex(0);
2466 // Negative kink index: mother, positive: daughter
2468 // Search for the second track of the kink
2470 for (Int_t jTrack = iTrack+1; jTrack<nTracks; ++jTrack) {
2472 AliESDtrack * esdTrack1 = esd->GetTrack(jTrack);
2474 Int_t jkink = esdTrack1->GetKinkIndex(0);
2476 if ( TMath::Abs(ikink)==TMath::Abs(jkink) ) {
2478 // The two tracks are from the same kink
2480 if (usedKink[TMath::Abs(ikink)-1]) continue; // skip used kinks
2483 Int_t idaughter = -1;
2485 if (ikink<0 && jkink>0) {
2490 else if (ikink>0 && jkink<0) {
2496 cerr << "Error: Wrong combination of kink indexes: "
2497 << ikink << " " << jkink << endl;
2501 // Add the mother track
2503 AliAODTrack * mother = NULL;
2505 if (!usedTrack[imother]) {
2507 usedTrack[imother] = kTRUE;
2509 AliESDtrack *esdTrack = esd->GetTrack(imother);
2510 esdTrack->GetPxPyPz(p);
2511 esdTrack->GetXYZ(pos);
2512 esdTrack->GetCovarianceXYZPxPyPz(covTr);
2513 esdTrack->GetESDpid(pid);
2516 new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
2517 esdTrack->GetLabel(),
2523 (Short_t)esdTrack->Charge(),
2524 esdTrack->GetITSClusterMap(),
2527 kTRUE, // check if this is right
2528 kTRUE, // check if this is right
2529 AliAODTrack::kPrimary);
2530 primary->AddDaughter(mother);
2531 mother->ConvertAliPIDtoAODPID();
2534 cerr << "Error: event " << iEvent << " kink " << TMath::Abs(ikink)-1
2535 << " track " << imother << " has already been used!" << endl;
2538 // Add the kink vertex
2539 AliESDkink * kink = esd->GetKink(TMath::Abs(ikink)-1);
2541 AliAODVertex * vkink =
2542 new(vertices[jVertices++]) AliAODVertex(kink->GetPosition(),
2546 esdTrack->GetID(), // This is the track ID of the mother's track!
2547 AliAODVertex::kKink);
2548 // Add the daughter track
2550 AliAODTrack * daughter = NULL;
2552 if (!usedTrack[idaughter]) {
2554 usedTrack[idaughter] = kTRUE;
2556 AliESDtrack *esdTrack = esd->GetTrack(idaughter);
2557 esdTrack->GetPxPyPz(p);
2558 esdTrack->GetXYZ(pos);
2559 esdTrack->GetCovarianceXYZPxPyPz(covTr);
2560 esdTrack->GetESDpid(pid);
2563 new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
2564 esdTrack->GetLabel(),
2570 (Short_t)esdTrack->Charge(),
2571 esdTrack->GetITSClusterMap(),
2574 kTRUE, // check if this is right
2575 kTRUE, // check if this is right
2576 AliAODTrack::kPrimary);
2577 vkink->AddDaughter(daughter);
2578 daughter->ConvertAliPIDtoAODPID();
2581 cerr << "Error: event " << iEvent << " kink " << TMath::Abs(ikink)-1
2582 << " track " << idaughter << " has already been used!" << endl;
2588 vertices.Expand(jVertices);
2590 // Tracks (primary and orphan)
2591 for (Int_t nTrack = 0; nTrack < nTracks; ++nTrack) {
2593 if (usedTrack[nTrack]) continue;
2595 AliESDtrack *esdTrack = esd->GetTrack(nTrack);
2596 esdTrack->GetPxPyPz(p);
2597 esdTrack->GetXYZ(pos);
2598 esdTrack->GetCovarianceXYZPxPyPz(covTr);
2599 esdTrack->GetESDpid(pid);
2601 Float_t impactXY, impactZ;
2603 esdTrack->GetImpactParameters(impactXY,impactZ);
2606 // track inside the beam pipe
2608 primary->AddDaughter(aodTrack =
2609 new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
2610 esdTrack->GetLabel(),
2616 (Short_t)esdTrack->Charge(),
2617 esdTrack->GetITSClusterMap(),
2620 kTRUE, // check if this is right
2621 kTRUE, // check if this is right
2622 AliAODTrack::kPrimary)
2624 aodTrack->ConvertAliPIDtoAODPID();
2627 // outside the beam pipe: orphan track
2628 // Don't write them anymore!
2631 } // end of loop on tracks
2634 Int_t nMuTracks = esd->GetNumberOfMuonTracks();
2635 for (Int_t nMuTrack = 0; nMuTrack < nMuTracks; ++nMuTrack) {
2637 AliESDMuonTrack *esdMuTrack = esd->GetMuonTrack(nMuTrack);
2638 p[0] = esdMuTrack->Px();
2639 p[1] = esdMuTrack->Py();
2640 p[2] = esdMuTrack->Pz();
2641 pos[0] = primary->GetX();
2642 pos[1] = primary->GetY();
2643 pos[2] = primary->GetZ();
2645 // has to be changed once the muon pid is provided by the ESD
2646 for (Int_t i = 0; i < 10; pid[i++] = 0.); pid[AliAODTrack::kMuon]=1.;
2648 primary->AddDaughter(aodTrack =
2649 new(tracks[jTracks++]) AliAODTrack(0, // no ID provided
2650 0, // no label provided
2655 NULL, // no covariance matrix provided
2656 esdMuTrack->Charge(),
2657 0, // ITSClusterMap is set below
2660 kFALSE, // muon tracks are not used to fit the primary vtx
2661 kFALSE, // not used for vertex fit
2662 AliAODTrack::kPrimary)
2665 aodTrack->SetHitsPatternInTrigCh(esdMuTrack->GetHitsPatternInTrigCh());
2666 Int_t track2Trigger = esdMuTrack->GetMatchTrigger();
2667 aodTrack->SetMatchTrigger(track2Trigger);
2669 aodTrack->SetChi2MatchTrigger(esdMuTrack->GetChi2MatchTrigger());
2671 aodTrack->SetChi2MatchTrigger(0.);
2673 tracks.Expand(jTracks); // remove 'empty slots' due to unwritten tracks
2675 // Access to the AOD container of PMD clusters
2676 TClonesArray &pmdClusters = *(aod->GetPmdClusters());
2677 Int_t jPmdClusters=0;
2679 for (Int_t iPmd = 0; iPmd < nPmdClus; ++iPmd) {
2680 // file pmd clusters, to be revised!
2681 AliESDPmdTrack *pmdTrack = esd->GetPmdTrack(iPmd);
2684 Double_t pos[3] = { pmdTrack->GetClusterX(), pmdTrack->GetClusterY(), pmdTrack->GetClusterZ() };
2685 Double_t pid[9] = { 0., 0., 0., 0., 0., 0., 0., 0., 0. }; // to be revised!
2687 // assoc cluster not set
2688 new(pmdClusters[jPmdClusters++]) AliAODPmdCluster(iPmd, nLabel, label, pmdTrack->GetClusterADC(), pos, pid);
2691 // Access to the AOD container of clusters
2692 TClonesArray &caloClusters = *(aod->GetCaloClusters());
2695 for (Int_t iClust=0; iClust<nCaloClus; ++iClust) {
2697 AliESDCaloCluster * cluster = esd->GetCaloCluster(iClust);
2699 Int_t id = cluster->GetID();
2702 Float_t energy = cluster->E();
2703 cluster->GetPosition(posF);
2704 Char_t ttype=AliAODCluster::kUndef;
2706 if (cluster->GetClusterType() == AliESDCaloCluster::kPHOSCluster) {
2707 ttype=AliAODCluster::kPHOSNeutral;
2709 else if (cluster->GetClusterType() == AliESDCaloCluster::kEMCALClusterv1) {
2710 ttype = AliAODCluster::kEMCALClusterv1;
2714 AliAODCaloCluster *caloCluster = new(caloClusters[jClusters++]) AliAODCaloCluster(id,
2722 caloCluster->SetCaloCluster(); // to be refined!
2725 caloClusters.Expand(jClusters); // resize TObjArray to 'remove' slots for pseudo clusters
2726 // end of loop on calo clusters
2728 // fill EMCAL cell info
2729 if (esd->GetEMCALCells()) { // protection against missing ESD information
2730 AliESDCaloCells &esdEMcells = *(esd->GetEMCALCells());
2731 Int_t nEMcell = esdEMcells.GetNumberOfCells() ;
2733 AliAODCaloCells &aodEMcells = *(aod->GetEMCALCells());
2734 aodEMcells.CreateContainer(nEMcell);
2735 aodEMcells.SetType(AliAODCaloCells::kEMCAL);
2736 for (Int_t iCell = 0; iCell < nEMcell; iCell++) {
2737 aodEMcells.SetCell(iCell,esdEMcells.GetCellNumber(iCell),esdEMcells.GetAmplitude(iCell));
2742 // fill PHOS cell info
2743 if (esd->GetPHOSCells()) { // protection against missing ESD information
2744 AliESDCaloCells &esdPHcells = *(esd->GetPHOSCells());
2745 Int_t nPHcell = esdPHcells.GetNumberOfCells() ;
2747 AliAODCaloCells &aodPHcells = *(aod->GetPHOSCells());
2748 aodPHcells.CreateContainer(nPHcell);
2749 aodPHcells.SetType(AliAODCaloCells::kPHOS);
2750 for (Int_t iCell = 0; iCell < nPHcell; iCell++) {
2751 aodPHcells.SetCell(iCell,esdPHcells.GetCellNumber(iCell),esdPHcells.GetAmplitude(iCell));
2757 AliAODTracklets &SPDTracklets = *(aod->GetTracklets());
2758 const AliMultiplicity *mult = esd->GetMultiplicity();
2760 if (mult->GetNumberOfTracklets()>0) {
2761 SPDTracklets.CreateContainer(mult->GetNumberOfTracklets());
2763 for (Int_t n=0; n<mult->GetNumberOfTracklets(); n++) {
2764 SPDTracklets.SetTracklet(n, mult->GetTheta(n), mult->GetPhi(n), mult->GetDeltaPhi(n), mult->GetLabel(n));
2768 Printf("ERROR: AliMultiplicity could not be retrieved from ESD");
2771 delete [] usedTrack;
2775 // fill the tree for this event
2777 } // end of event loop
2779 aodTree->GetUserInfo()->Add(aod);
2781 // write the tree to the specified file
2782 aodFile = aodTree->GetCurrentFile();
2789 void AliReconstruction::WriteAlignmentData(AliESDEvent* esd)
2791 // Write space-points which are then used in the alignment procedures
2792 // For the moment only ITS, TRD and TPC
2794 // Load TOF clusters
2796 fLoader[3]->LoadRecPoints("read");
2797 TTree* tree = fLoader[3]->TreeR();
2799 AliError(Form("Can't get the %s cluster tree", fgkDetectorName[3]));
2802 fTracker[3]->LoadClusters(tree);
2804 Int_t ntracks = esd->GetNumberOfTracks();
2805 for (Int_t itrack = 0; itrack < ntracks; itrack++)
2807 AliESDtrack *track = esd->GetTrack(itrack);
2810 for (Int_t iDet = 3; iDet >= 0; iDet--)
2811 nsp += track->GetNcls(iDet);
2813 AliTrackPointArray *sp = new AliTrackPointArray(nsp);
2814 track->SetTrackPointArray(sp);
2816 for (Int_t iDet = 3; iDet >= 0; iDet--) {
2817 AliTracker *tracker = fTracker[iDet];
2818 if (!tracker) continue;
2819 Int_t nspdet = track->GetNcls(iDet);
2820 if (nspdet <= 0) continue;
2821 track->GetClusters(iDet,idx);
2825 while (isp2 < nspdet) {
2827 TString dets = fgkDetectorName[iDet];
2828 if ((fUseTrackingErrorsForAlignment.CompareTo(dets) == 0) ||
2829 fUseTrackingErrorsForAlignment.BeginsWith(dets+" ") ||
2830 fUseTrackingErrorsForAlignment.EndsWith(" "+dets) ||
2831 fUseTrackingErrorsForAlignment.Contains(" "+dets+" ")) {
2832 isvalid = tracker->GetTrackPointTrackingError(idx[isp2],p,track);
2834 isvalid = tracker->GetTrackPoint(idx[isp2],p);
2837 const Int_t kNTPCmax = 159;
2838 if (iDet==1 && isp2>kNTPCmax) break; // to be fixed
2839 if (!isvalid) continue;
2840 sp->AddPoint(isptrack,&p); isptrack++; isp++;
2846 fTracker[3]->UnloadClusters();
2847 fLoader[3]->UnloadRecPoints();
2851 //_____________________________________________________________________________
2852 void AliReconstruction::FillRawDataErrorLog(Int_t iEvent, AliESDEvent* esd)
2854 // The method reads the raw-data error log
2855 // accumulated within the rawReader.
2856 // It extracts the raw-data errors related to
2857 // the current event and stores them into
2858 // a TClonesArray inside the esd object.
2860 if (!fRawReader) return;
2862 for(Int_t i = 0; i < fRawReader->GetNumberOfErrorLogs(); i++) {
2864 AliRawDataErrorLog *log = fRawReader->GetErrorLog(i);
2866 if (iEvent != log->GetEventNumber()) continue;
2868 esd->AddRawDataErrorLog(log);
2873 TNamed* AliReconstruction::CopyFileToTNamed(TString fPath,TString fName){
2874 // Dump a file content into a char in TNamed
2876 in.open(fPath.Data(),ios::in | ios::binary|ios::ate);
2877 Int_t kBytes = (Int_t)in.tellg();
2878 printf("Size: %d \n",kBytes);
2881 char* memblock = new char [kBytes];
2882 in.seekg (0, ios::beg);
2883 in.read (memblock, kBytes);
2885 TString fData(memblock,kBytes);
2886 fn = new TNamed(fName,fData);
2887 printf("fData Size: %d \n",fData.Sizeof());
2888 printf("fName Size: %d \n",fName.Sizeof());
2889 printf("fn Size: %d \n",fn->Sizeof());
2893 AliInfo(Form("Could not Open %s\n",fPath.Data()));
2899 void AliReconstruction::TNamedToFile(TTree* fTree, TString fName){
2900 // This is not really needed in AliReconstruction at the moment
2901 // but can serve as a template
2903 TList *fList = fTree->GetUserInfo();
2904 TNamed *fn = (TNamed*)fList->FindObject(fName.Data());
2905 printf("fn Size: %d \n",fn->Sizeof());
2907 TString fTmp(fn->GetName()); // to be 100% sure in principle fName also works
2908 const char* cdata = fn->GetTitle();
2909 printf("fTmp Size %d\n",fTmp.Sizeof());
2911 int size = fn->Sizeof()-fTmp.Sizeof()-sizeof(UChar_t)-sizeof(Int_t); // see dfinition of TString::SizeOf()...
2912 printf("calculated size %d\n",size);
2913 ofstream out(fName.Data(),ios::out | ios::binary);
2914 out.write(cdata,size);
2919 //_____________________________________________________________________________
2920 AliQADataMakerRec * AliReconstruction::GetQADataMaker(Int_t iDet)
2922 // get the quality assurance data maker object and the loader for a detector
2924 if (fQADataMaker[iDet])
2925 return fQADataMaker[iDet];
2927 AliQADataMakerRec * qadm = NULL;
2928 if (iDet == fgkNDetectors) { //Global QA
2929 qadm = new AliGlobalQADataMaker();
2930 fQADataMaker[iDet] = qadm;
2934 // load the QA data maker object
2935 TPluginManager* pluginManager = gROOT->GetPluginManager();
2936 TString detName = fgkDetectorName[iDet];
2937 TString qadmName = "Ali" + detName + "QADataMakerRec";
2938 if (gAlice && !gAlice->GetDetector(detName) && (detName != "HLT"))
2941 // first check if a plugin is defined for the quality assurance data maker
2942 TPluginHandler* pluginHandler = pluginManager->FindHandler("AliQADataMakerRec", detName);
2943 // if not, add a plugin for it
2944 if (!pluginHandler) {
2945 AliDebug(1, Form("defining plugin for %s", qadmName.Data()));
2946 TString libs = gSystem->GetLibraries();
2947 if (libs.Contains("lib" + detName + "base.so") ||
2948 (gSystem->Load("lib" + detName + "base.so") >= 0)) {
2949 pluginManager->AddHandler("AliQADataMakerRec", detName,
2950 qadmName, detName + "qadm", qadmName + "()");
2952 pluginManager->AddHandler("AliQADataMakerRec", detName,
2953 qadmName, detName, qadmName + "()");
2955 pluginHandler = pluginManager->FindHandler("AliQADataMakerRec", detName);
2957 if (pluginHandler && (pluginHandler->LoadPlugin() == 0)) {
2958 qadm = (AliQADataMakerRec *) pluginHandler->ExecPlugin(0);
2961 fQADataMaker[iDet] = qadm;
2966 //_____________________________________________________________________________
2967 Bool_t AliReconstruction::RunQA(const char* detectors, AliESDEvent *& esd)
2969 // run the Quality Assurance data producer
2971 AliCodeTimerAuto("")
2972 TString detStr = detectors;
2973 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
2974 if (!IsSelected(fgkDetectorName[iDet], detStr))
2976 AliQADataMakerRec * qadm = GetQADataMaker(iDet);
2979 AliCodeTimerStart(Form("running quality assurance data maker for %s", fgkDetectorName[iDet]));
2980 AliInfo(Form("running quality assurance data maker for %s", fgkDetectorName[iDet]));
2982 qadm->Exec(AliQA::kESDS, esd) ;
2985 AliCodeTimerStop(Form("running quality assurance data maker for %s", fgkDetectorName[iDet]));
2987 if ((detStr.CompareTo("ALL") != 0) && !detStr.IsNull()) {
2988 AliError(Form("the following detectors were not found: %s",
2998 //_____________________________________________________________________________
2999 void AliReconstruction::CheckQA()
3001 // check the QA of SIM for this run and remove the detectors
3002 // with status Fatal
3004 TString newRunLocalReconstruction ;
3005 TString newRunTracking ;
3006 TString newFillESD ;
3008 for (Int_t iDet = 0; iDet < AliQA::kNDET; iDet++) {
3009 TString detName(AliQA::GetDetName(iDet)) ;
3010 AliQA * qa = AliQA::Instance(AliQA::DETECTORINDEX(iDet)) ;
3011 if ( qa->IsSet(AliQA::DETECTORINDEX(iDet), AliQA::kSIM, AliQA::kFATAL)) {
3012 AliInfo(Form("QA status for %s in Hits and/or SDIGITS and/or Digits was Fatal; No reconstruction performed", detName.Data())) ;
3014 if ( fRunLocalReconstruction.Contains(AliQA::GetDetName(iDet)) ||
3015 fRunLocalReconstruction.Contains("ALL") ) {
3016 newRunLocalReconstruction += detName ;
3017 newRunLocalReconstruction += " " ;
3019 if ( fRunTracking.Contains(AliQA::GetDetName(iDet)) ||
3020 fRunTracking.Contains("ALL") ) {
3021 newRunTracking += detName ;
3022 newRunTracking += " " ;
3024 if ( fFillESD.Contains(AliQA::GetDetName(iDet)) ||
3025 fFillESD.Contains("ALL") ) {
3026 newFillESD += detName ;
3031 fRunLocalReconstruction = newRunLocalReconstruction ;
3032 fRunTracking = newRunTracking ;
3033 fFillESD = newFillESD ;
3036 //_____________________________________________________________________________
3037 Int_t AliReconstruction::GetDetIndex(const char* detector)
3039 // return the detector index corresponding to detector
3041 for (index = 0; index < fgkNDetectors ; index++) {
3042 if ( strcmp(detector, fgkDetectorName[index]) == 0 )