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 "AliQADataMaker.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) ;
638 // checking the QA of previous steps
642 // local reconstruction
643 if (!fRunLocalReconstruction.IsNull()) {
644 if (!RunLocalReconstruction(fRunLocalReconstruction)) {
645 if (fStopOnError) {CleanUp(); return kFALSE;}
651 if (fRunVertexFinder && !CreateVertexer()) {
657 AliSysInfo::AddStamp("Vertexer");
660 if (!fRunTracking.IsNull() && !CreateTrackers(fRunTracking)) {
666 AliSysInfo::AddStamp("LoadTrackers");
668 // get the possibly already existing ESD file and tree
669 AliESDEvent* esd = new AliESDEvent(); AliESDEvent* hltesd = new AliESDEvent();
670 TFile* fileOld = NULL;
671 TTree* treeOld = NULL; TTree *hlttreeOld = NULL;
672 if (!gSystem->AccessPathName("AliESDs.root")){
673 gSystem->CopyFile("AliESDs.root", "AliESDs.old.root", kTRUE);
674 fileOld = TFile::Open("AliESDs.old.root");
675 if (fileOld && fileOld->IsOpen()) {
676 treeOld = (TTree*) fileOld->Get("esdTree");
677 if (treeOld)esd->ReadFromTree(treeOld);
678 hlttreeOld = (TTree*) fileOld->Get("HLTesdTree");
679 if (hlttreeOld) hltesd->ReadFromTree(hlttreeOld);
683 // create the ESD output file and tree
684 TFile* file = TFile::Open("AliESDs.root", "RECREATE");
685 file->SetCompressionLevel(2);
686 if (!file->IsOpen()) {
687 AliError("opening AliESDs.root failed");
688 if (fStopOnError) {CleanUp(file, fileOld); return kFALSE;}
691 TTree* tree = new TTree("esdTree", "Tree with ESD objects");
692 esd = new AliESDEvent();
693 esd->CreateStdContent();
694 esd->WriteToTree(tree);
696 TTree* hlttree = new TTree("HLTesdTree", "Tree with HLT ESD objects");
697 hltesd = new AliESDEvent();
698 hltesd->CreateStdContent();
699 hltesd->WriteToTree(hlttree);
702 delete esd; delete hltesd;
703 esd = NULL; hltesd = NULL;
705 // create the branch with ESD additions
709 AliESDfriend *esdf = 0;
710 if (fWriteESDfriend) {
711 esdf = new AliESDfriend();
712 TBranch *br=tree->Branch("ESDfriend.","AliESDfriend", &esdf);
713 br->SetFile("AliESDfriends.root");
714 esd->AddObject(esdf);
718 // Get the GRP CDB entry
719 AliCDBEntry* entryGRP = AliCDBManager::Instance()->Get("GRP/GRP/Data");
722 fGRPList = dynamic_cast<TList*> (entryGRP->GetObject());
724 AliError("No GRP entry found in OCDB!");
727 // Get the diamond profile from OCDB
728 AliCDBEntry* entry = AliCDBManager::Instance()
729 ->Get("GRP/Calib/MeanVertex");
732 fDiamondProfile = dynamic_cast<AliESDVertex*> (entry->GetObject());
734 AliError("No diamond profile found in OCDB!");
737 AliVertexerTracks tVertexer(AliTracker::GetBz());
738 if(fDiamondProfile && fMeanVertexConstraint) tVertexer.SetVtxStart(fDiamondProfile);
740 if (fRawReader) fRawReader->RewindEvents();
743 gSystem->GetProcInfo(&ProcInfo);
744 AliInfo(Form("Current memory usage %d %d", ProcInfo.fMemResident, ProcInfo.fMemVirtual));
747 //Initialize the QA and start of cycle for out-of-cycle QA
749 TString detStr(fFillESD);
750 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
751 if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
752 AliQADataMaker *qadm = GetQADataMaker(iDet);
754 AliInfo(Form("Initializing the QA data maker for %s",
755 fgkDetectorName[iDet]));
756 qadm->Init(AliQA::kRECPOINTS, AliCDBManager::Instance()->GetRun());
757 qadm->Init(AliQA::kESDS, AliCDBManager::Instance()->GetRun());
759 qadm->StartOfCycle(AliQA::kRECPOINTS);
760 qadm->StartOfCycle(AliQA::kESDS,"same");
764 AliQADataMaker *qadm = GetQADataMaker(fgkNDetectors);
765 AliInfo(Form("Initializing the global QA data maker"));
767 qadm->Init(AliQA::kRECPOINTS, AliCDBManager::Instance()->GetRun());
768 AliTracker::SetResidualsArray(arr);
770 qadm->StartOfCycle(AliQA::kRECPOINTS);
776 //******* The loop over events
777 for (Int_t iEvent = 0; iEvent < fRunLoader->GetNumberOfEvents(); iEvent++) {
778 if (fRawReader) fRawReader->NextEvent();
779 if ((iEvent < fFirstEvent) || ((fLastEvent >= 0) && (iEvent > fLastEvent))) {
780 // copy old ESD to the new one
782 esd->ReadFromTree(treeOld);
783 treeOld->GetEntry(iEvent);
787 esd->ReadFromTree(hlttreeOld);
788 hlttreeOld->GetEntry(iEvent);
794 AliInfo(Form("processing event %d", iEvent));
796 //Start of cycle for the in-loop QA
797 if (fRunQA && fInLoopQA) {
798 TString detStr(fFillESD);
799 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
800 if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
801 AliQADataMaker *qadm = GetQADataMaker(iDet);
803 qadm->StartOfCycle(AliQA::kRECPOINTS);
804 qadm->StartOfCycle(AliQA::kESDS, "same") ;
807 AliQADataMaker *qadm = GetQADataMaker(fgkNDetectors);
808 qadm->StartOfCycle(AliQA::kRECPOINTS);
812 fRunLoader->GetEvent(iEvent);
815 sprintf(aFileName, "ESD_%d.%d_final.root",
816 fRunLoader->GetHeader()->GetRun(),
817 fRunLoader->GetHeader()->GetEventNrInRun());
818 if (!gSystem->AccessPathName(aFileName)) continue;
820 // local signle event reconstruction
821 if (!fRunLocalReconstruction.IsNull()) {
822 if (!RunLocalEventReconstruction(fRunLocalReconstruction)) {
823 if (fStopOnError) {CleanUp(file, fileOld); return kFALSE;}
827 esd->SetRunNumber(fRunLoader->GetHeader()->GetRun());
828 hltesd->SetRunNumber(fRunLoader->GetHeader()->GetRun());
829 esd->SetEventNumberInFile(fRunLoader->GetHeader()->GetEventNrInRun());
830 hltesd->SetEventNumberInFile(fRunLoader->GetHeader()->GetEventNrInRun());
832 // Set magnetic field from the tracker
833 esd->SetMagneticField(AliTracker::GetBz());
834 hltesd->SetMagneticField(AliTracker::GetBz());
838 // Fill raw-data error log into the ESD
839 if (fRawReader) FillRawDataErrorLog(iEvent,esd);
842 if (fRunVertexFinder) {
843 if (!ReadESD(esd, "vertex")) {
844 if (!RunVertexFinder(esd)) {
845 if (fStopOnError) {CleanUp(file, fileOld); return kFALSE;}
847 if (fCheckPointLevel > 0) WriteESD(esd, "vertex");
852 if (!fRunTracking.IsNull()) {
853 if (fRunHLTTracking) {
854 hltesd->SetVertex(esd->GetVertex());
855 if (!RunHLTTracking(hltesd)) {
856 if (fStopOnError) {CleanUp(file, fileOld); return kFALSE;}
862 if (!fRunTracking.IsNull()) {
863 if (fRunMuonTracking) {
864 if (!RunMuonTracking(esd)) {
865 if (fStopOnError) {CleanUp(file, fileOld); return kFALSE;}
871 if (!fRunTracking.IsNull()) {
872 if (!ReadESD(esd, "tracking")) {
873 if (!RunTracking(esd)) {
874 if (fStopOnError) {CleanUp(file, fileOld); return kFALSE;}
876 if (fCheckPointLevel > 0) WriteESD(esd, "tracking");
881 if (!fFillESD.IsNull()) {
882 if (!FillESD(esd, fFillESD)) {
883 if (fStopOnError) {CleanUp(file, fileOld); return kFALSE;}
887 // fill Event header information from the RawEventHeader
888 if (fRawReader){FillRawEventHeaderESD(esd);}
891 AliESDpid::MakePID(esd);
892 if (fCheckPointLevel > 1) WriteESD(esd, "PID");
894 if (fFillTriggerESD) {
895 if (!ReadESD(esd, "trigger")) {
896 if (!FillTriggerESD(esd)) {
897 if (fStopOnError) {CleanUp(file, fileOld); return kFALSE;}
899 if (fCheckPointLevel > 1) WriteESD(esd, "trigger");
905 //Try to improve the reconstructed primary vertex position using the tracks
906 AliESDVertex *pvtx=0;
907 Bool_t dovertex=kTRUE;
908 TObject* obj = fOptions.FindObject("ITS");
910 TString optITS = obj->GetTitle();
911 if (optITS.Contains("cosmics") || optITS.Contains("COSMICS"))
914 if(dovertex) pvtx=tVertexer.FindPrimaryVertex(esd);
915 if(fDiamondProfile) esd->SetDiamond(fDiamondProfile);
918 if (pvtx->GetStatus()) {
919 // Store the improved primary vertex
920 esd->SetPrimaryVertex(pvtx);
921 // Propagate the tracks to the DCA to the improved primary vertex
922 Double_t somethingbig = 777.;
923 Double_t bz = esd->GetMagneticField();
924 Int_t nt=esd->GetNumberOfTracks();
926 AliESDtrack *t = esd->GetTrack(nt);
927 t->RelateToVertex(pvtx, bz, somethingbig);
934 vtxer.Tracks2V0vertices(esd);
936 if (fRunCascadeFinder) {
938 AliCascadeVertexer cvtxer;
939 cvtxer.V0sTracks2CascadeVertices(esd);
944 if (fCleanESD) CleanESD(esd);
945 if (fWriteESDfriend) {
946 esdf->~AliESDfriend();
947 new (esdf) AliESDfriend(); // Reset...
948 esd->GetESDfriend(esdf);
955 if (fCheckPointLevel > 0) WriteESD(esd, "final");
958 if (fWriteESDfriend) {
959 esdf->~AliESDfriend();
960 new (esdf) AliESDfriend(); // Reset...
963 gSystem->GetProcInfo(&ProcInfo);
964 AliInfo(Form("Event %d -> Current memory usage %d %d",iEvent, ProcInfo.fMemResident, ProcInfo.fMemVirtual));
967 // End of cycle for the in-loop QA
968 if (fRunQA && fInLoopQA) {
969 RunQA(fFillESD.Data(), esd);
970 TString detStr(fFillESD);
971 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
972 if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
973 AliQADataMaker * qadm = GetQADataMaker(iDet);
975 qadm->EndOfCycle(AliQA::kRECPOINTS);
976 qadm->EndOfCycle(AliQA::kESDS);
980 AliQADataMaker *qadm = GetQADataMaker(fgkNDetectors);
982 qadm->EndOfCycle(AliQA::kRECPOINTS);
988 //******** End of the loop over events
992 tree->GetUserInfo()->Add(esd);
993 hlttree->GetUserInfo()->Add(hltesd);
995 const TMap *cdbMap = AliCDBManager::Instance()->GetStorageMap();
996 const TList *cdbList = AliCDBManager::Instance()->GetRetrievedIds();
998 TMap *cdbMapCopy = new TMap(cdbMap->GetEntries());
999 cdbMapCopy->SetOwner(1);
1000 cdbMapCopy->SetName("cdbMap");
1001 TIter iter(cdbMap->GetTable());
1004 while((pair = dynamic_cast<TPair*> (iter.Next()))){
1005 TObjString* keyStr = dynamic_cast<TObjString*> (pair->Key());
1006 TObjString* valStr = dynamic_cast<TObjString*> (pair->Value());
1007 cdbMapCopy->Add(new TObjString(keyStr->GetName()), new TObjString(valStr->GetName()));
1010 TList *cdbListCopy = new TList();
1011 cdbListCopy->SetOwner(1);
1012 cdbListCopy->SetName("cdbList");
1014 TIter iter2(cdbList);
1017 while((id = dynamic_cast<AliCDBId*> (iter2.Next()))){
1018 cdbListCopy->Add(new TObjString(id->ToString().Data()));
1021 tree->GetUserInfo()->Add(cdbMapCopy);
1022 tree->GetUserInfo()->Add(cdbListCopy);
1025 if(fESDPar.Contains("ESD.par")){
1026 AliInfo("Attaching ESD.par to Tree");
1027 TNamed *fn = CopyFileToTNamed(fESDPar.Data(),"ESD.par");
1028 tree->GetUserInfo()->Add(fn);
1034 if (fWriteESDfriend)
1035 tree->SetBranchStatus("ESDfriend*",0);
1036 // we want to have only one tree version number
1037 tree->Write(tree->GetName(),TObject::kOverwrite);
1041 TFile *aodFile = TFile::Open("AliAOD.root", "RECREATE");
1042 ESDFile2AODFile(file, aodFile);
1047 CleanUp(file, fileOld);
1049 // Create tags for the events in the ESD tree (the ESD tree is always present)
1050 // In case of empty events the tags will contain dummy values
1051 AliESDTagCreator *esdtagCreator = new AliESDTagCreator();
1052 esdtagCreator->CreateESDTags(fFirstEvent,fLastEvent,fGRPList);
1054 AliAODTagCreator *aodtagCreator = new AliAODTagCreator();
1055 aodtagCreator->CreateAODTags(fFirstEvent,fLastEvent,fGRPList);
1058 //Finish QA and end of cycle for out-of-loop QA
1059 if (fRunQA && !fInLoopQA) {
1060 qas.Run(fRunLocalReconstruction.Data(), AliQA::kRECPOINTS);
1062 qas.Run(fRunTracking.Data(), AliQA::kESDS);
1065 AliQADataMaker *qadm = GetQADataMaker(fgkNDetectors);
1067 qadm->EndOfCycle(AliQA::kRECPOINTS);
1073 // Cleanup of CDB manager: cache and active storages!
1074 AliCDBManager::Instance()->ClearCache();
1081 //_____________________________________________________________________________
1082 Bool_t AliReconstruction::RunLocalReconstruction(const TString& detectors)
1084 // run the local reconstruction
1085 static Int_t eventNr=0;
1086 AliCodeTimerAuto("")
1088 // AliCDBManager* man = AliCDBManager::Instance();
1089 // Bool_t origCache = man->GetCacheFlag();
1091 // TString detStr = detectors;
1092 // for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
1093 // if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
1094 // AliReconstructor* reconstructor = GetReconstructor(iDet);
1095 // if (!reconstructor) continue;
1096 // if (reconstructor->HasLocalReconstruction()) continue;
1098 // AliCodeTimerStart(Form("running reconstruction for %s", fgkDetectorName[iDet]));
1099 // AliInfo(Form("running reconstruction for %s", fgkDetectorName[iDet]));
1101 // AliCodeTimerStart(Form("Loading calibration data from OCDB for %s", fgkDetectorName[iDet]));
1102 // AliInfo(Form("Loading calibration data from OCDB for %s", fgkDetectorName[iDet]));
1104 // man->SetCacheFlag(kTRUE);
1105 // TString calibPath = Form("%s/Calib/*", fgkDetectorName[iDet]);
1106 // man->GetAll(calibPath); // entries are cached!
1108 // AliCodeTimerStop(Form("Loading calibration data from OCDB for %s", fgkDetectorName[iDet]));
1110 // if (fRawReader) {
1111 // fRawReader->RewindEvents();
1112 // reconstructor->Reconstruct(fRunLoader, fRawReader);
1114 // reconstructor->Reconstruct(fRunLoader);
1117 // AliCodeTimerStop(Form("running reconstruction for %s", fgkDetectorName[iDet]));
1118 // AliSysInfo::AddStamp(Form("LRec%s_%d",fgkDetectorName[iDet],eventNr));
1120 // // unload calibration data
1121 // man->UnloadFromCache(calibPath);
1122 // //man->ClearCache();
1125 // man->SetCacheFlag(origCache);
1127 // if ((detStr.CompareTo("ALL") != 0) && !detStr.IsNull()) {
1128 // AliError(Form("the following detectors were not found: %s",
1130 // if (fStopOnError) return kFALSE;
1137 //_____________________________________________________________________________
1138 Bool_t AliReconstruction::RunLocalEventReconstruction(const TString& detectors)
1140 // run the local reconstruction
1142 static Int_t eventNr=0;
1143 AliCodeTimerAuto("")
1145 TString detStr = detectors;
1146 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
1147 if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
1148 AliReconstructor* reconstructor = GetReconstructor(iDet);
1149 if (!reconstructor) continue;
1150 AliLoader* loader = fLoader[iDet];
1152 AliWarning(Form("No loader is defined for %s!",fgkDetectorName[iDet]));
1155 // conversion of digits
1156 if (fRawReader && reconstructor->HasDigitConversion()) {
1157 AliInfo(Form("converting raw data digits into root objects for %s",
1158 fgkDetectorName[iDet]));
1159 AliCodeTimerAuto(Form("converting raw data digits into root objects for %s",
1160 fgkDetectorName[iDet]));
1161 loader->LoadDigits("update");
1162 loader->CleanDigits();
1163 loader->MakeDigitsContainer();
1164 TTree* digitsTree = loader->TreeD();
1165 reconstructor->ConvertDigits(fRawReader, digitsTree);
1166 loader->WriteDigits("OVERWRITE");
1167 loader->UnloadDigits();
1169 // local reconstruction
1170 AliInfo(Form("running reconstruction for %s", fgkDetectorName[iDet]));
1171 AliCodeTimerAuto(Form("running reconstruction for %s", fgkDetectorName[iDet]));
1172 loader->LoadRecPoints("update");
1173 loader->CleanRecPoints();
1174 loader->MakeRecPointsContainer();
1175 TTree* clustersTree = loader->TreeR();
1176 if (fRawReader && !reconstructor->HasDigitConversion()) {
1177 reconstructor->Reconstruct(fRawReader, clustersTree);
1179 loader->LoadDigits("read");
1180 TTree* digitsTree = loader->TreeD();
1182 AliError(Form("Can't get the %s digits tree", fgkDetectorName[iDet]));
1183 if (fStopOnError) return kFALSE;
1185 reconstructor->Reconstruct(digitsTree, clustersTree);
1187 loader->UnloadDigits();
1190 // In-loop QA for local reconstrucion
1191 if (fRunQA && fInLoopQA) {
1192 AliQADataMaker * qadm = GetQADataMaker(iDet);
1195 //(Form("Running QA data maker for %s", fgkDetectorName[iDet]));
1197 //(Form("Running QA data maker for %s", fgkDetectorName[iDet]));
1199 qadm->Exec(AliQA::kRECPOINTS, clustersTree) ;
1202 //(Form("Running QA data maker for %s", fgkDetectorName[iDet]));
1206 loader->WriteRecPoints("OVERWRITE");
1207 loader->UnloadRecPoints();
1208 AliSysInfo::AddStamp(Form("LRec%s_%d",fgkDetectorName[iDet],eventNr), iDet,1,eventNr);
1211 if ((detStr.CompareTo("ALL") != 0) && !detStr.IsNull()) {
1212 AliError(Form("the following detectors were not found: %s",
1214 if (fStopOnError) return kFALSE;
1220 //_____________________________________________________________________________
1221 Bool_t AliReconstruction::RunVertexFinder(AliESDEvent*& esd)
1223 // run the barrel tracking
1225 AliCodeTimerAuto("")
1227 AliESDVertex* vertex = NULL;
1228 Double_t vtxPos[3] = {0, 0, 0};
1229 Double_t vtxErr[3] = {0.07, 0.07, 0.1};
1230 TArrayF mcVertex(3);
1231 if (fRunLoader->GetHeader() && fRunLoader->GetHeader()->GenEventHeader()) {
1232 fRunLoader->GetHeader()->GenEventHeader()->PrimaryVertex(mcVertex);
1233 for (Int_t i = 0; i < 3; i++) vtxPos[i] = mcVertex[i];
1237 if(fDiamondProfile) fVertexer->SetVtxStart(fDiamondProfile);
1238 AliInfo("running the ITS vertex finder");
1239 if (fLoader[0]) fLoader[0]->LoadRecPoints();
1240 vertex = fVertexer->FindVertexForCurrentEvent(fRunLoader->GetEventNumber());
1241 if (fLoader[0]) fLoader[0]->UnloadRecPoints();
1243 AliWarning("Vertex not found");
1244 vertex = new AliESDVertex();
1245 vertex->SetName("default");
1248 vertex->SetName("reconstructed");
1252 AliInfo("getting the primary vertex from MC");
1253 vertex = new AliESDVertex(vtxPos, vtxErr);
1257 vertex->GetXYZ(vtxPos);
1258 vertex->GetSigmaXYZ(vtxErr);
1260 AliWarning("no vertex reconstructed");
1261 vertex = new AliESDVertex(vtxPos, vtxErr);
1263 esd->SetVertex(vertex);
1264 // if SPD multiplicity has been determined, it is stored in the ESD
1265 AliMultiplicity *mult = fVertexer->GetMultiplicity();
1266 if(mult)esd->SetMultiplicity(mult);
1268 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
1269 if (fTracker[iDet]) fTracker[iDet]->SetVertex(vtxPos, vtxErr);
1276 //_____________________________________________________________________________
1277 Bool_t AliReconstruction::RunHLTTracking(AliESDEvent*& esd)
1279 // run the HLT barrel tracking
1281 AliCodeTimerAuto("")
1284 AliError("Missing runLoader!");
1288 AliInfo("running HLT tracking");
1290 // Get a pointer to the HLT reconstructor
1291 AliReconstructor *reconstructor = GetReconstructor(fgkNDetectors-1);
1292 if (!reconstructor) return kFALSE;
1295 for (Int_t iDet = 1; iDet >= 0; iDet--) {
1296 TString detName = fgkDetectorName[iDet];
1297 AliDebug(1, Form("%s HLT tracking", detName.Data()));
1298 reconstructor->SetOption(detName.Data());
1299 AliTracker *tracker = reconstructor->CreateTracker();
1301 AliWarning(Form("couldn't create a HLT tracker for %s", detName.Data()));
1302 if (fStopOnError) return kFALSE;
1306 Double_t vtxErr[3]={0.005,0.005,0.010};
1307 const AliESDVertex *vertex = esd->GetVertex();
1308 vertex->GetXYZ(vtxPos);
1309 tracker->SetVertex(vtxPos,vtxErr);
1311 fLoader[iDet]->LoadRecPoints("read");
1312 TTree* tree = fLoader[iDet]->TreeR();
1314 AliError(Form("Can't get the %s cluster tree", detName.Data()));
1317 tracker->LoadClusters(tree);
1319 if (tracker->Clusters2Tracks(esd) != 0) {
1320 AliError(Form("HLT %s Clusters2Tracks failed", fgkDetectorName[iDet]));
1324 tracker->UnloadClusters();
1332 //_____________________________________________________________________________
1333 Bool_t AliReconstruction::RunMuonTracking(AliESDEvent*& esd)
1335 // run the muon spectrometer tracking
1337 AliCodeTimerAuto("")
1340 AliError("Missing runLoader!");
1343 Int_t iDet = 7; // for MUON
1345 AliInfo("is running...");
1347 // Get a pointer to the MUON reconstructor
1348 AliReconstructor *reconstructor = GetReconstructor(iDet);
1349 if (!reconstructor) return kFALSE;
1352 TString detName = fgkDetectorName[iDet];
1353 AliDebug(1, Form("%s tracking", detName.Data()));
1354 AliTracker *tracker = reconstructor->CreateTracker();
1356 AliWarning(Form("couldn't create a tracker for %s", detName.Data()));
1361 fLoader[iDet]->LoadRecPoints("read");
1363 tracker->LoadClusters(fLoader[iDet]->TreeR());
1365 Int_t rv = tracker->Clusters2Tracks(esd);
1369 AliError(Form("%s Clusters2Tracks failed", fgkDetectorName[iDet]));
1373 fLoader[iDet]->UnloadRecPoints();
1375 tracker->UnloadClusters();
1383 //_____________________________________________________________________________
1384 Bool_t AliReconstruction::RunTracking(AliESDEvent*& esd)
1386 // run the barrel tracking
1387 static Int_t eventNr=0;
1388 AliCodeTimerAuto("")
1390 AliInfo("running tracking");
1392 //Fill the ESD with the T0 info (will be used by the TOF)
1393 if (fReconstructor[11] && fLoader[11]) {
1394 fLoader[11]->LoadRecPoints("READ");
1395 TTree *treeR = fLoader[11]->TreeR();
1396 GetReconstructor(11)->FillESD((TTree *)NULL,treeR,esd);
1399 // pass 1: TPC + ITS inwards
1400 for (Int_t iDet = 1; iDet >= 0; iDet--) {
1401 if (!fTracker[iDet]) continue;
1402 AliDebug(1, Form("%s tracking", fgkDetectorName[iDet]));
1405 fLoader[iDet]->LoadRecPoints("read");
1406 AliSysInfo::AddStamp(Form("RLoadCluster%s_%d",fgkDetectorName[iDet],eventNr),iDet,1, eventNr);
1407 TTree* tree = fLoader[iDet]->TreeR();
1409 AliError(Form("Can't get the %s cluster tree", fgkDetectorName[iDet]));
1412 fTracker[iDet]->LoadClusters(tree);
1413 AliSysInfo::AddStamp(Form("TLoadCluster%s_%d",fgkDetectorName[iDet],eventNr), iDet,2, eventNr);
1415 if (fTracker[iDet]->Clusters2Tracks(esd) != 0) {
1416 AliError(Form("%s Clusters2Tracks failed", fgkDetectorName[iDet]));
1419 if (fCheckPointLevel > 1) {
1420 WriteESD(esd, Form("%s.tracking", fgkDetectorName[iDet]));
1422 // preliminary PID in TPC needed by the ITS tracker
1424 GetReconstructor(1)->FillESD((TTree*)NULL, (TTree*)NULL, esd);
1425 AliESDpid::MakePID(esd);
1427 AliSysInfo::AddStamp(Form("Tracking0%s_%d",fgkDetectorName[iDet],eventNr), iDet,3,eventNr);
1430 // pass 2: ALL backwards
1432 if (fRunQA && fRunGlobalQA) AliTracker::SetFillResiduals(kTRUE);
1434 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
1435 if (!fTracker[iDet]) continue;
1436 AliDebug(1, Form("%s back propagation", fgkDetectorName[iDet]));
1439 if (iDet > 1) { // all except ITS, TPC
1441 fLoader[iDet]->LoadRecPoints("read");
1442 AliSysInfo::AddStamp(Form("RLoadCluster0%s_%d",fgkDetectorName[iDet],eventNr), iDet,1, eventNr);
1443 tree = fLoader[iDet]->TreeR();
1445 AliError(Form("Can't get the %s cluster tree", fgkDetectorName[iDet]));
1448 fTracker[iDet]->LoadClusters(tree);
1449 AliSysInfo::AddStamp(Form("TLoadCluster0%s_%d",fgkDetectorName[iDet],eventNr), iDet,2, eventNr);
1453 if (fTracker[iDet]->PropagateBack(esd) != 0) {
1454 AliError(Form("%s backward propagation failed", fgkDetectorName[iDet]));
1457 if (fCheckPointLevel > 1) {
1458 WriteESD(esd, Form("%s.back", fgkDetectorName[iDet]));
1462 if (iDet > 2) { // all except ITS, TPC, TRD
1463 fTracker[iDet]->UnloadClusters();
1464 fLoader[iDet]->UnloadRecPoints();
1466 // updated PID in TPC needed by the ITS tracker -MI
1468 GetReconstructor(1)->FillESD((TTree*)NULL, (TTree*)NULL, esd);
1469 AliESDpid::MakePID(esd);
1471 AliSysInfo::AddStamp(Form("Tracking1%s_%d",fgkDetectorName[iDet],eventNr), iDet,3, eventNr);
1474 if (fRunQA && fRunGlobalQA) AliTracker::SetFillResiduals(kFALSE);
1476 // write space-points to the ESD in case alignment data output
1478 if (fWriteAlignmentData)
1479 WriteAlignmentData(esd);
1481 // pass 3: TRD + TPC + ITS refit inwards
1484 for (Int_t iDet = 2; iDet >= 0; iDet--) {
1485 if (!fTracker[iDet]) continue;
1486 AliDebug(1, Form("%s inward refit", fgkDetectorName[iDet]));
1489 if (fTracker[iDet]->RefitInward(esd) != 0) {
1490 AliError(Form("%s inward refit failed", fgkDetectorName[iDet]));
1493 if (fCheckPointLevel > 1) {
1494 WriteESD(esd, Form("%s.refit", fgkDetectorName[iDet]));
1496 AliSysInfo::AddStamp(Form("Tracking2%s_%d",fgkDetectorName[iDet],eventNr), iDet,3, eventNr);
1498 fTracker[iDet]->UnloadClusters();
1499 AliSysInfo::AddStamp(Form("TUnloadCluster%s_%d",fgkDetectorName[iDet],eventNr), iDet,4, eventNr);
1500 fLoader[iDet]->UnloadRecPoints();
1501 AliSysInfo::AddStamp(Form("RUnloadCluster%s_%d",fgkDetectorName[iDet],eventNr), iDet,5, eventNr);
1505 // Propagate track to the vertex - if not done by ITS
1507 Int_t ntracks = esd->GetNumberOfTracks();
1508 for (Int_t itrack=0; itrack<ntracks; itrack++){
1509 const Double_t kRadius = 3; // beam pipe radius
1510 const Double_t kMaxStep = 5; // max step
1511 const Double_t kMaxD = 123456; // max distance to prim vertex
1512 Double_t fieldZ = AliTracker::GetBz(); //
1513 AliESDtrack * track = esd->GetTrack(itrack);
1514 if (!track) continue;
1515 if (track->IsOn(AliESDtrack::kITSrefit)) continue;
1516 AliTracker::PropagateTrackTo(track,kRadius,track->GetMass(),kMaxStep,kTRUE);
1517 track->RelateToVertex(esd->GetVertex(),fieldZ, kMaxD);
1523 //_____________________________________________________________________________
1524 Bool_t AliReconstruction::CleanESD(AliESDEvent *esd){
1526 // Remove the data which are not needed for the physics analysis.
1529 Int_t nTracks=esd->GetNumberOfTracks();
1530 Int_t nV0s=esd->GetNumberOfV0s();
1532 (Form("Number of ESD tracks and V0s before cleaning: %d %d",nTracks,nV0s));
1534 Float_t cleanPars[]={fV0DCAmax,fV0CsPmin,fDmax,fZmax};
1535 Bool_t rc=esd->Clean(cleanPars);
1537 nTracks=esd->GetNumberOfTracks();
1538 nV0s=esd->GetNumberOfV0s();
1540 (Form("Number of ESD tracks and V0s after cleaning %d %d",nTracks,nV0s));
1545 //_____________________________________________________________________________
1546 Bool_t AliReconstruction::FillESD(AliESDEvent*& esd, const TString& detectors)
1548 // fill the event summary data
1550 AliCodeTimerAuto("")
1551 static Int_t eventNr=0;
1552 TString detStr = detectors;
1554 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
1555 if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
1556 AliReconstructor* reconstructor = GetReconstructor(iDet);
1557 if (!reconstructor) continue;
1558 if (!ReadESD(esd, fgkDetectorName[iDet])) {
1559 AliDebug(1, Form("filling ESD for %s", fgkDetectorName[iDet]));
1560 TTree* clustersTree = NULL;
1561 if (fLoader[iDet]) {
1562 fLoader[iDet]->LoadRecPoints("read");
1563 clustersTree = fLoader[iDet]->TreeR();
1564 if (!clustersTree) {
1565 AliError(Form("Can't get the %s clusters tree",
1566 fgkDetectorName[iDet]));
1567 if (fStopOnError) return kFALSE;
1570 if (fRawReader && !reconstructor->HasDigitConversion()) {
1571 reconstructor->FillESD(fRawReader, clustersTree, esd);
1573 TTree* digitsTree = NULL;
1574 if (fLoader[iDet]) {
1575 fLoader[iDet]->LoadDigits("read");
1576 digitsTree = fLoader[iDet]->TreeD();
1578 AliError(Form("Can't get the %s digits tree",
1579 fgkDetectorName[iDet]));
1580 if (fStopOnError) return kFALSE;
1583 reconstructor->FillESD(digitsTree, clustersTree, esd);
1584 if (fLoader[iDet]) fLoader[iDet]->UnloadDigits();
1586 if (fLoader[iDet]) {
1587 fLoader[iDet]->UnloadRecPoints();
1590 if (fCheckPointLevel > 2) WriteESD(esd, fgkDetectorName[iDet]);
1594 if ((detStr.CompareTo("ALL") != 0) && !detStr.IsNull()) {
1595 AliError(Form("the following detectors were not found: %s",
1597 if (fStopOnError) return kFALSE;
1599 AliSysInfo::AddStamp(Form("FillESD%d",eventNr), 0,1, eventNr);
1604 //_____________________________________________________________________________
1605 Bool_t AliReconstruction::FillTriggerESD(AliESDEvent*& esd)
1607 // Reads the trigger decision which is
1608 // stored in Trigger.root file and fills
1609 // the corresponding esd entries
1611 AliCodeTimerAuto("")
1613 AliInfo("Filling trigger information into the ESD");
1616 AliCTPRawStream input(fRawReader);
1617 if (!input.Next()) {
1618 AliError("No valid CTP (trigger) DDL raw data is found ! The trigger information is not stored in the ESD !");
1621 esd->SetTriggerMask(input.GetClassMask());
1622 esd->SetTriggerCluster(input.GetClusterMask());
1625 AliRunLoader *runloader = AliRunLoader::GetRunLoader();
1627 if (!runloader->LoadTrigger()) {
1628 AliCentralTrigger *aCTP = runloader->GetTrigger();
1629 esd->SetTriggerMask(aCTP->GetClassMask());
1630 esd->SetTriggerCluster(aCTP->GetClusterMask());
1633 AliWarning("No trigger can be loaded! The trigger information is not stored in the ESD !");
1638 AliError("No run loader is available! The trigger information is not stored in the ESD !");
1650 //_____________________________________________________________________________
1651 Bool_t AliReconstruction::FillRawEventHeaderESD(AliESDEvent*& esd)
1654 // Filling information from RawReader Header
1657 AliInfo("Filling information from RawReader Header");
1658 esd->SetBunchCrossNumber(0);
1659 esd->SetOrbitNumber(0);
1660 esd->SetPeriodNumber(0);
1661 esd->SetTimeStamp(0);
1662 esd->SetEventType(0);
1663 const AliRawEventHeaderBase * eventHeader = fRawReader->GetEventHeader();
1666 const UInt_t *id = eventHeader->GetP("Id");
1667 esd->SetBunchCrossNumber((id)[1]&0x00000fff);
1668 esd->SetOrbitNumber((((id)[0]<<20)&0xf00000)|(((id)[1]>>12)&0xfffff));
1669 esd->SetPeriodNumber(((id)[0]>>4)&0x0fffffff);
1671 esd->SetTimeStamp((eventHeader->Get("Timestamp")));
1672 esd->SetEventType((eventHeader->Get("Type")));
1679 //_____________________________________________________________________________
1680 Bool_t AliReconstruction::IsSelected(TString detName, TString& detectors) const
1682 // check whether detName is contained in detectors
1683 // if yes, it is removed from detectors
1685 // check if all detectors are selected
1686 if ((detectors.CompareTo("ALL") == 0) ||
1687 detectors.BeginsWith("ALL ") ||
1688 detectors.EndsWith(" ALL") ||
1689 detectors.Contains(" ALL ")) {
1694 // search for the given detector
1695 Bool_t result = kFALSE;
1696 if ((detectors.CompareTo(detName) == 0) ||
1697 detectors.BeginsWith(detName+" ") ||
1698 detectors.EndsWith(" "+detName) ||
1699 detectors.Contains(" "+detName+" ")) {
1700 detectors.ReplaceAll(detName, "");
1704 // clean up the detectors string
1705 while (detectors.Contains(" ")) detectors.ReplaceAll(" ", " ");
1706 while (detectors.BeginsWith(" ")) detectors.Remove(0, 1);
1707 while (detectors.EndsWith(" ")) detectors.Remove(detectors.Length()-1, 1);
1712 //_____________________________________________________________________________
1713 Bool_t AliReconstruction::InitRunLoader()
1715 // get or create the run loader
1717 if (gAlice) delete gAlice;
1720 if (!gSystem->AccessPathName(fGAliceFileName.Data())) { // galice.root exists
1721 // load all base libraries to get the loader classes
1722 TString libs = gSystem->GetLibraries();
1723 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
1724 TString detName = fgkDetectorName[iDet];
1725 if (detName == "HLT") continue;
1726 if (libs.Contains("lib" + detName + "base.so")) continue;
1727 gSystem->Load("lib" + detName + "base.so");
1729 fRunLoader = AliRunLoader::Open(fGAliceFileName.Data());
1731 AliError(Form("no run loader found in file %s", fGAliceFileName.Data()));
1735 fRunLoader->CdGAFile();
1736 if (gFile->GetKey(AliRunLoader::GetGAliceName())) {
1737 if (fRunLoader->LoadgAlice() == 0) {
1738 gAlice = fRunLoader->GetAliRun();
1739 AliTracker::SetFieldMap(gAlice->Field(),fUniformField);
1742 if (!gAlice && !fRawReader) {
1743 AliError(Form("no gAlice object found in file %s",
1744 fGAliceFileName.Data()));
1749 //PH This is a temporary fix to give access to the kinematics
1750 //PH that is needed for the labels of ITS clusters
1751 fRunLoader->LoadHeader();
1752 fRunLoader->LoadKinematics();
1754 } else { // galice.root does not exist
1756 AliError(Form("the file %s does not exist", fGAliceFileName.Data()));
1760 fRunLoader = AliRunLoader::Open(fGAliceFileName.Data(),
1761 AliConfig::GetDefaultEventFolderName(),
1764 AliError(Form("could not create run loader in file %s",
1765 fGAliceFileName.Data()));
1769 fRunLoader->MakeTree("E");
1771 while (fRawReader->NextEvent()) {
1772 fRunLoader->SetEventNumber(iEvent);
1773 fRunLoader->GetHeader()->Reset(fRawReader->GetRunNumber(),
1775 fRunLoader->MakeTree("H");
1776 fRunLoader->TreeE()->Fill();
1779 fRawReader->RewindEvents();
1780 if (fNumberOfEventsPerFile > 0)
1781 fRunLoader->SetNumberOfEventsPerFile(fNumberOfEventsPerFile);
1783 fRunLoader->SetNumberOfEventsPerFile(iEvent);
1784 fRunLoader->WriteHeader("OVERWRITE");
1785 fRunLoader->CdGAFile();
1786 fRunLoader->Write(0, TObject::kOverwrite);
1787 // AliTracker::SetFieldMap(???);
1793 //_____________________________________________________________________________
1794 AliReconstructor* AliReconstruction::GetReconstructor(Int_t iDet)
1796 // get the reconstructor object and the loader for a detector
1798 if (fReconstructor[iDet]) return fReconstructor[iDet];
1800 // load the reconstructor object
1801 TPluginManager* pluginManager = gROOT->GetPluginManager();
1802 TString detName = fgkDetectorName[iDet];
1803 TString recName = "Ali" + detName + "Reconstructor";
1804 if (gAlice && !gAlice->GetDetector(detName) && (detName != "HLT")) return NULL;
1806 AliReconstructor* reconstructor = NULL;
1807 // first check if a plugin is defined for the reconstructor
1808 TPluginHandler* pluginHandler =
1809 pluginManager->FindHandler("AliReconstructor", detName);
1810 // if not, add a plugin for it
1811 if (!pluginHandler) {
1812 AliDebug(1, Form("defining plugin for %s", recName.Data()));
1813 TString libs = gSystem->GetLibraries();
1814 if (libs.Contains("lib" + detName + "base.so") ||
1815 (gSystem->Load("lib" + detName + "base.so") >= 0)) {
1816 pluginManager->AddHandler("AliReconstructor", detName,
1817 recName, detName + "rec", recName + "()");
1819 pluginManager->AddHandler("AliReconstructor", detName,
1820 recName, detName, recName + "()");
1822 pluginHandler = pluginManager->FindHandler("AliReconstructor", detName);
1824 if (pluginHandler && (pluginHandler->LoadPlugin() == 0)) {
1825 reconstructor = (AliReconstructor*) pluginHandler->ExecPlugin(0);
1827 if (reconstructor) {
1828 TObject* obj = fOptions.FindObject(detName.Data());
1829 if (obj) reconstructor->SetOption(obj->GetTitle());
1830 reconstructor->Init();
1831 fReconstructor[iDet] = reconstructor;
1834 // get or create the loader
1835 if (detName != "HLT") {
1836 fLoader[iDet] = fRunLoader->GetLoader(detName + "Loader");
1837 if (!fLoader[iDet]) {
1838 AliConfig::Instance()
1839 ->CreateDetectorFolders(fRunLoader->GetEventFolder(),
1841 // first check if a plugin is defined for the loader
1843 pluginManager->FindHandler("AliLoader", detName);
1844 // if not, add a plugin for it
1845 if (!pluginHandler) {
1846 TString loaderName = "Ali" + detName + "Loader";
1847 AliDebug(1, Form("defining plugin for %s", loaderName.Data()));
1848 pluginManager->AddHandler("AliLoader", detName,
1849 loaderName, detName + "base",
1850 loaderName + "(const char*, TFolder*)");
1851 pluginHandler = pluginManager->FindHandler("AliLoader", detName);
1853 if (pluginHandler && (pluginHandler->LoadPlugin() == 0)) {
1855 (AliLoader*) pluginHandler->ExecPlugin(2, detName.Data(),
1856 fRunLoader->GetEventFolder());
1858 if (!fLoader[iDet]) { // use default loader
1859 fLoader[iDet] = new AliLoader(detName, fRunLoader->GetEventFolder());
1861 if (!fLoader[iDet]) {
1862 AliWarning(Form("couldn't get loader for %s", detName.Data()));
1863 if (fStopOnError) return NULL;
1865 fRunLoader->AddLoader(fLoader[iDet]);
1866 fRunLoader->CdGAFile();
1867 if (gFile && !gFile->IsWritable()) gFile->ReOpen("UPDATE");
1868 fRunLoader->Write(0, TObject::kOverwrite);
1873 return reconstructor;
1876 //_____________________________________________________________________________
1877 Bool_t AliReconstruction::CreateVertexer()
1879 // create the vertexer
1882 AliReconstructor* itsReconstructor = GetReconstructor(0);
1883 if (itsReconstructor) {
1884 fVertexer = itsReconstructor->CreateVertexer();
1887 AliWarning("couldn't create a vertexer for ITS");
1888 if (fStopOnError) return kFALSE;
1894 //_____________________________________________________________________________
1895 Bool_t AliReconstruction::CreateTrackers(const TString& detectors)
1897 // create the trackers
1899 TString detStr = detectors;
1900 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
1901 if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
1902 AliReconstructor* reconstructor = GetReconstructor(iDet);
1903 if (!reconstructor) continue;
1904 TString detName = fgkDetectorName[iDet];
1905 if (detName == "HLT") {
1906 fRunHLTTracking = kTRUE;
1909 if (detName == "MUON") {
1910 fRunMuonTracking = kTRUE;
1915 fTracker[iDet] = reconstructor->CreateTracker();
1916 if (!fTracker[iDet] && (iDet < 7)) {
1917 AliWarning(Form("couldn't create a tracker for %s", detName.Data()));
1918 if (fStopOnError) return kFALSE;
1920 AliSysInfo::AddStamp(Form("LTracker%s",fgkDetectorName[iDet]), iDet,0);
1926 //_____________________________________________________________________________
1927 void AliReconstruction::CleanUp(TFile* file, TFile* fileOld)
1929 // delete trackers and the run loader and close and delete the file
1931 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
1932 delete fReconstructor[iDet];
1933 fReconstructor[iDet] = NULL;
1934 fLoader[iDet] = NULL;
1935 delete fTracker[iDet];
1936 fTracker[iDet] = NULL;
1937 // delete fQADataMaker[iDet];
1938 // fQADataMaker[iDet] = NULL;
1943 if(!(AliCDBManager::Instance()->GetCacheFlag())) {
1944 delete fDiamondProfile;
1945 fDiamondProfile = NULL;
1964 gSystem->Unlink("AliESDs.old.root");
1968 //_____________________________________________________________________________
1970 Bool_t AliReconstruction::ReadESD(AliESDEvent*& esd, const char* recStep) const
1972 // read the ESD event from a file
1974 if (!esd) return kFALSE;
1976 sprintf(fileName, "ESD_%d.%d_%s.root",
1977 esd->GetRunNumber(), esd->GetEventNumberInFile(), recStep);
1978 if (gSystem->AccessPathName(fileName)) return kFALSE;
1980 AliInfo(Form("reading ESD from file %s", fileName));
1981 AliDebug(1, Form("reading ESD from file %s", fileName));
1982 TFile* file = TFile::Open(fileName);
1983 if (!file || !file->IsOpen()) {
1984 AliError(Form("opening %s failed", fileName));
1991 esd = (AliESDEvent*) file->Get("ESD");
2000 //_____________________________________________________________________________
2001 void AliReconstruction::WriteESD(AliESDEvent* esd, const char* recStep) const
2003 // write the ESD event to a file
2007 sprintf(fileName, "ESD_%d.%d_%s.root",
2008 esd->GetRunNumber(), esd->GetEventNumberInFile(), recStep);
2010 AliDebug(1, Form("writing ESD to file %s", fileName));
2011 TFile* file = TFile::Open(fileName, "recreate");
2012 if (!file || !file->IsOpen()) {
2013 AliError(Form("opening %s failed", fileName));
2025 //_____________________________________________________________________________
2026 void AliReconstruction::ESDFile2AODFile(TFile* esdFile, TFile* aodFile)
2028 // write all files from the given esd file to an aod file
2030 // create an AliAOD object
2031 AliAODEvent *aod = new AliAODEvent();
2032 aod->CreateStdContent();
2038 TTree *aodTree = new TTree("aodTree", "AliAOD tree");
2039 aodTree->Branch(aod->GetList());
2042 TTree *t = (TTree*) esdFile->Get("esdTree");
2043 AliESDEvent *esd = new AliESDEvent();
2044 esd->ReadFromTree(t);
2046 Int_t nEvents = t->GetEntries();
2048 // set arrays and pointers
2058 // loop over events and fill them
2059 for (Int_t iEvent = 0; iEvent < nEvents; ++iEvent) {
2060 //cout << "event: " << iEvent << endl;
2061 t->GetEntry(iEvent);
2063 // Multiplicity information needed by the header (to be revised!)
2064 Int_t nTracks = esd->GetNumberOfTracks();
2065 Int_t nPosTracks = 0;
2066 for (Int_t iTrack=0; iTrack<nTracks; ++iTrack)
2067 if (esd->GetTrack(iTrack)->Charge()> 0) nPosTracks++;
2069 // Access the header
2070 AliAODHeader *header = aod->GetHeader();
2073 header->SetRunNumber (esd->GetRunNumber() );
2074 header->SetBunchCrossNumber(esd->GetBunchCrossNumber());
2075 header->SetOrbitNumber (esd->GetOrbitNumber() );
2076 header->SetPeriodNumber (esd->GetPeriodNumber() );
2077 header->SetTriggerMask (esd->GetTriggerMask() );
2078 header->SetTriggerCluster (esd->GetTriggerCluster() );
2079 header->SetEventType (esd->GetEventType() );
2080 header->SetMagneticField (esd->GetMagneticField() );
2081 header->SetZDCN1Energy (esd->GetZDCN1Energy() );
2082 header->SetZDCP1Energy (esd->GetZDCP1Energy() );
2083 header->SetZDCN2Energy (esd->GetZDCN2Energy() );
2084 header->SetZDCP2Energy (esd->GetZDCP2Energy() );
2085 header->SetZDCEMEnergy (esd->GetZDCEMEnergy(0),esd->GetZDCEMEnergy(1));
2086 header->SetRefMultiplicity (nTracks);
2087 header->SetRefMultiplicityPos(nPosTracks);
2088 header->SetRefMultiplicityNeg(nTracks - nPosTracks);
2089 header->SetMuonMagFieldScale(-999.); // FIXME
2090 header->SetCentrality(-999.); // FIXME
2092 Int_t nV0s = esd->GetNumberOfV0s();
2093 Int_t nCascades = esd->GetNumberOfCascades();
2094 Int_t nKinks = esd->GetNumberOfKinks();
2095 Int_t nVertices = nV0s + 2*nCascades /*could lead to two vertices, one V0 and the Xi */+ nKinks + 1 /* = prim. vtx*/;
2097 Int_t nCaloClus = esd->GetNumberOfCaloClusters();
2099 Int_t nPmdClus = esd->GetNumberOfPmdTracks();
2101 aod->ResetStd(nTracks, nVertices, nV0s+nCascades, nJets, nCaloClus, nFmdClus, nPmdClus);
2103 // Array to take into account the tracks already added to the AOD
2104 Bool_t * usedTrack = NULL;
2106 usedTrack = new Bool_t[nTracks];
2107 for (Int_t iTrack=0; iTrack<nTracks; ++iTrack) usedTrack[iTrack]=kFALSE;
2109 // Array to take into account the V0s already added to the AOD
2110 Bool_t * usedV0 = NULL;
2112 usedV0 = new Bool_t[nV0s];
2113 for (Int_t iV0=0; iV0<nV0s; ++iV0) usedV0[iV0]=kFALSE;
2115 // Array to take into account the kinks already added to the AOD
2116 Bool_t * usedKink = NULL;
2118 usedKink = new Bool_t[nKinks];
2119 for (Int_t iKink=0; iKink<nKinks; ++iKink) usedKink[iKink]=kFALSE;
2122 // Access to the AOD container of vertices
2123 TClonesArray &vertices = *(aod->GetVertices());
2126 // Access to the AOD container of tracks
2127 TClonesArray &tracks = *(aod->GetTracks());
2130 // Access to the AOD container of V0s
2131 TClonesArray &V0s = *(aod->GetV0s());
2134 // Add primary vertex. The primary tracks will be defined
2135 // after the loops on the composite objects (V0, cascades, kinks)
2136 const AliESDVertex *vtx = esd->GetPrimaryVertex();
2138 vtx->GetXYZ(pos); // position
2139 vtx->GetCovMatrix(covVtx); //covariance matrix
2141 AliAODVertex * primary = new(vertices[jVertices++])
2142 AliAODVertex(pos, covVtx, vtx->GetChi2toNDF(), NULL, -1, AliAODVertex::kPrimary);
2145 AliAODTrack *aodTrack = 0x0;
2147 // Create vertices starting from the most complex objects
2150 for (Int_t nCascade = 0; nCascade < nCascades; ++nCascade) {
2151 AliESDcascade *cascade = esd->GetCascade(nCascade);
2153 cascade->GetXYZ(pos[0], pos[1], pos[2]);
2154 cascade->GetPosCovXi(covVtx);
2156 // Add the cascade vertex
2157 AliAODVertex * vcascade = new(vertices[jVertices++]) AliAODVertex(pos,
2159 cascade->GetChi2Xi(), // = chi2/NDF since NDF = 2*2-3
2162 AliAODVertex::kCascade);
2164 primary->AddDaughter(vcascade); // the cascade 'particle' (represented by a vertex) is added as a daughter to the primary vertex
2166 // Add the V0 from the cascade. The ESD class have to be optimized...
2167 // Now we have to search for the corresponding V0 in the list of V0s
2168 // using the indeces of the positive and negative tracks
2170 Int_t posFromV0 = cascade->GetPindex();
2171 Int_t negFromV0 = cascade->GetNindex();
2174 AliESDv0 * v0 = 0x0;
2177 for (Int_t iV0=0; iV0<nV0s; ++iV0) {
2179 v0 = esd->GetV0(iV0);
2180 Int_t posV0 = v0->GetPindex();
2181 Int_t negV0 = v0->GetNindex();
2183 if (posV0==posFromV0 && negV0==negFromV0) {
2189 AliAODVertex * vV0FromCascade = 0x0;
2191 if (indV0>-1 && !usedV0[indV0]) {
2193 // the V0 exists in the array of V0s and is not used
2195 usedV0[indV0] = kTRUE;
2197 v0->GetXYZ(pos[0], pos[1], pos[2]);
2198 v0->GetPosCov(covVtx);
2200 vV0FromCascade = new(vertices[jVertices++]) AliAODVertex(pos,
2202 v0->GetChi2V0(), // = chi2/NDF since NDF = 2*2-3
2208 // the V0 doesn't exist in the array of V0s or was used
2209 cerr << "Error: event " << iEvent << " cascade " << nCascade
2210 << " The V0 " << indV0
2211 << " doesn't exist in the array of V0s or was used!" << endl;
2213 cascade->GetXYZ(pos[0], pos[1], pos[2]);
2214 cascade->GetPosCov(covVtx);
2216 vV0FromCascade = new(vertices[jVertices++]) AliAODVertex(pos,
2218 v0->GetChi2V0(), // = chi2/NDF since NDF = 2*2-3
2222 vcascade->AddDaughter(vV0FromCascade);
2226 // Add the positive tracks from the V0
2228 if (! usedTrack[posFromV0]) {
2230 usedTrack[posFromV0] = kTRUE;
2232 AliESDtrack *esdTrack = esd->GetTrack(posFromV0);
2233 esdTrack->GetPxPyPz(p_pos);
2234 esdTrack->GetXYZ(pos);
2235 esdTrack->GetCovarianceXYZPxPyPz(covTr);
2236 esdTrack->GetESDpid(pid);
2238 vV0FromCascade->AddDaughter(aodTrack =
2239 new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
2240 esdTrack->GetLabel(),
2246 (Short_t)esdTrack->Charge(),
2247 esdTrack->GetITSClusterMap(),
2250 kTRUE, // check if this is right
2251 kFALSE, // check if this is right
2252 AliAODTrack::kSecondary)
2254 aodTrack->ConvertAliPIDtoAODPID();
2257 cerr << "Error: event " << iEvent << " cascade " << nCascade
2258 << " track " << posFromV0 << " has already been used!" << endl;
2261 // Add the negative tracks from the V0
2263 if (!usedTrack[negFromV0]) {
2265 usedTrack[negFromV0] = kTRUE;
2267 AliESDtrack *esdTrack = esd->GetTrack(negFromV0);
2268 esdTrack->GetPxPyPz(p_neg);
2269 esdTrack->GetXYZ(pos);
2270 esdTrack->GetCovarianceXYZPxPyPz(covTr);
2271 esdTrack->GetESDpid(pid);
2273 vV0FromCascade->AddDaughter(aodTrack =
2274 new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
2275 esdTrack->GetLabel(),
2281 (Short_t)esdTrack->Charge(),
2282 esdTrack->GetITSClusterMap(),
2285 kTRUE, // check if this is right
2286 kFALSE, // check if this is right
2287 AliAODTrack::kSecondary)
2289 aodTrack->ConvertAliPIDtoAODPID();
2292 cerr << "Error: event " << iEvent << " cascade " << nCascade
2293 << " track " << negFromV0 << " has already been used!" << endl;
2296 // add it to the V0 array as well
2297 Double_t d0[2] = { -999., -99.};
2298 // counting is probably wrong
2299 new(V0s[jV0s++]) AliAODv0(vV0FromCascade, -999., -99., p_pos, p_neg, d0); // to be refined
2301 // Add the bachelor track from the cascade
2303 Int_t bachelor = cascade->GetBindex();
2305 if(!usedTrack[bachelor]) {
2307 usedTrack[bachelor] = kTRUE;
2309 AliESDtrack *esdTrack = esd->GetTrack(bachelor);
2310 esdTrack->GetPxPyPz(p);
2311 esdTrack->GetXYZ(pos);
2312 esdTrack->GetCovarianceXYZPxPyPz(covTr);
2313 esdTrack->GetESDpid(pid);
2315 vcascade->AddDaughter(aodTrack =
2316 new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
2317 esdTrack->GetLabel(),
2323 (Short_t)esdTrack->Charge(),
2324 esdTrack->GetITSClusterMap(),
2327 kTRUE, // check if this is right
2328 kFALSE, // check if this is right
2329 AliAODTrack::kSecondary)
2331 aodTrack->ConvertAliPIDtoAODPID();
2334 cerr << "Error: event " << iEvent << " cascade " << nCascade
2335 << " track " << bachelor << " has already been used!" << endl;
2338 // Add the primary track of the cascade (if any)
2340 } // end of the loop on cascades
2344 for (Int_t nV0 = 0; nV0 < nV0s; ++nV0) {
2346 if (usedV0[nV0]) continue; // skip if aready added to the AOD
2348 AliESDv0 *v0 = esd->GetV0(nV0);
2350 v0->GetXYZ(pos[0], pos[1], pos[2]);
2351 v0->GetPosCov(covVtx);
2353 AliAODVertex * vV0 =
2354 new(vertices[jVertices++]) AliAODVertex(pos,
2356 v0->GetChi2V0(), // = chi2/NDF since NDF = 2*2-3
2360 primary->AddDaughter(vV0);
2362 Int_t posFromV0 = v0->GetPindex();
2363 Int_t negFromV0 = v0->GetNindex();
2365 // Add the positive tracks from the V0
2367 if (!usedTrack[posFromV0]) {
2369 usedTrack[posFromV0] = kTRUE;
2371 AliESDtrack *esdTrack = esd->GetTrack(posFromV0);
2372 esdTrack->GetPxPyPz(p_pos);
2373 esdTrack->GetXYZ(pos);
2374 esdTrack->GetCovarianceXYZPxPyPz(covTr);
2375 esdTrack->GetESDpid(pid);
2377 vV0->AddDaughter(aodTrack =
2378 new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
2379 esdTrack->GetLabel(),
2385 (Short_t)esdTrack->Charge(),
2386 esdTrack->GetITSClusterMap(),
2389 kTRUE, // check if this is right
2390 kFALSE, // check if this is right
2391 AliAODTrack::kSecondary)
2393 aodTrack->ConvertAliPIDtoAODPID();
2396 cerr << "Error: event " << iEvent << " V0 " << nV0
2397 << " track " << posFromV0 << " has already been used!" << endl;
2400 // Add the negative tracks from the V0
2402 if (!usedTrack[negFromV0]) {
2404 usedTrack[negFromV0] = kTRUE;
2406 AliESDtrack *esdTrack = esd->GetTrack(negFromV0);
2407 esdTrack->GetPxPyPz(p_neg);
2408 esdTrack->GetXYZ(pos);
2409 esdTrack->GetCovarianceXYZPxPyPz(covTr);
2410 esdTrack->GetESDpid(pid);
2412 vV0->AddDaughter(aodTrack =
2413 new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
2414 esdTrack->GetLabel(),
2420 (Short_t)esdTrack->Charge(),
2421 esdTrack->GetITSClusterMap(),
2424 kTRUE, // check if this is right
2425 kFALSE, // check if this is right
2426 AliAODTrack::kSecondary)
2428 aodTrack->ConvertAliPIDtoAODPID();
2431 cerr << "Error: event " << iEvent << " V0 " << nV0
2432 << " track " << negFromV0 << " has already been used!" << endl;
2435 // add it to the V0 array as well
2436 Double_t d0[2] = { 999., 99.};
2437 new(V0s[jV0s++]) AliAODv0(vV0, 999., 99., p_pos, p_neg, d0); // to be refined
2440 // end of the loop on V0s
2442 // Kinks: it is a big mess the access to the information in the kinks
2443 // The loop is on the tracks in order to find the mother and daugther of each kink
2446 for (Int_t iTrack=0; iTrack<nTracks; ++iTrack) {
2448 AliESDtrack * esdTrack = esd->GetTrack(iTrack);
2450 Int_t ikink = esdTrack->GetKinkIndex(0);
2453 // Negative kink index: mother, positive: daughter
2455 // Search for the second track of the kink
2457 for (Int_t jTrack = iTrack+1; jTrack<nTracks; ++jTrack) {
2459 AliESDtrack * esdTrack1 = esd->GetTrack(jTrack);
2461 Int_t jkink = esdTrack1->GetKinkIndex(0);
2463 if ( TMath::Abs(ikink)==TMath::Abs(jkink) ) {
2465 // The two tracks are from the same kink
2467 if (usedKink[TMath::Abs(ikink)-1]) continue; // skip used kinks
2470 Int_t idaughter = -1;
2472 if (ikink<0 && jkink>0) {
2477 else if (ikink>0 && jkink<0) {
2483 cerr << "Error: Wrong combination of kink indexes: "
2484 << ikink << " " << jkink << endl;
2488 // Add the mother track
2490 AliAODTrack * mother = NULL;
2492 if (!usedTrack[imother]) {
2494 usedTrack[imother] = kTRUE;
2496 AliESDtrack *esdTrack = esd->GetTrack(imother);
2497 esdTrack->GetPxPyPz(p);
2498 esdTrack->GetXYZ(pos);
2499 esdTrack->GetCovarianceXYZPxPyPz(covTr);
2500 esdTrack->GetESDpid(pid);
2503 new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
2504 esdTrack->GetLabel(),
2510 (Short_t)esdTrack->Charge(),
2511 esdTrack->GetITSClusterMap(),
2514 kTRUE, // check if this is right
2515 kTRUE, // check if this is right
2516 AliAODTrack::kPrimary);
2517 primary->AddDaughter(mother);
2518 mother->ConvertAliPIDtoAODPID();
2521 cerr << "Error: event " << iEvent << " kink " << TMath::Abs(ikink)-1
2522 << " track " << imother << " has already been used!" << endl;
2525 // Add the kink vertex
2526 AliESDkink * kink = esd->GetKink(TMath::Abs(ikink)-1);
2528 AliAODVertex * vkink =
2529 new(vertices[jVertices++]) AliAODVertex(kink->GetPosition(),
2533 esdTrack->GetID(), // This is the track ID of the mother's track!
2534 AliAODVertex::kKink);
2535 // Add the daughter track
2537 AliAODTrack * daughter = NULL;
2539 if (!usedTrack[idaughter]) {
2541 usedTrack[idaughter] = kTRUE;
2543 AliESDtrack *esdTrack = esd->GetTrack(idaughter);
2544 esdTrack->GetPxPyPz(p);
2545 esdTrack->GetXYZ(pos);
2546 esdTrack->GetCovarianceXYZPxPyPz(covTr);
2547 esdTrack->GetESDpid(pid);
2550 new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
2551 esdTrack->GetLabel(),
2557 (Short_t)esdTrack->Charge(),
2558 esdTrack->GetITSClusterMap(),
2561 kTRUE, // check if this is right
2562 kTRUE, // check if this is right
2563 AliAODTrack::kPrimary);
2564 vkink->AddDaughter(daughter);
2565 daughter->ConvertAliPIDtoAODPID();
2568 cerr << "Error: event " << iEvent << " kink " << TMath::Abs(ikink)-1
2569 << " track " << idaughter << " has already been used!" << endl;
2575 vertices.Expand(jVertices);
2577 // Tracks (primary and orphan)
2578 for (Int_t nTrack = 0; nTrack < nTracks; ++nTrack) {
2580 if (usedTrack[nTrack]) continue;
2582 AliESDtrack *esdTrack = esd->GetTrack(nTrack);
2583 esdTrack->GetPxPyPz(p);
2584 esdTrack->GetXYZ(pos);
2585 esdTrack->GetCovarianceXYZPxPyPz(covTr);
2586 esdTrack->GetESDpid(pid);
2588 Float_t impactXY, impactZ;
2590 esdTrack->GetImpactParameters(impactXY,impactZ);
2593 // track inside the beam pipe
2595 primary->AddDaughter(aodTrack =
2596 new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
2597 esdTrack->GetLabel(),
2603 (Short_t)esdTrack->Charge(),
2604 esdTrack->GetITSClusterMap(),
2607 kTRUE, // check if this is right
2608 kTRUE, // check if this is right
2609 AliAODTrack::kPrimary)
2611 aodTrack->ConvertAliPIDtoAODPID();
2614 // outside the beam pipe: orphan track
2615 // Don't write them anymore!
2618 } // end of loop on tracks
2621 Int_t nMuTracks = esd->GetNumberOfMuonTracks();
2622 for (Int_t nMuTrack = 0; nMuTrack < nMuTracks; ++nMuTrack) {
2624 AliESDMuonTrack *esdMuTrack = esd->GetMuonTrack(nMuTrack);
2625 p[0] = esdMuTrack->Px();
2626 p[1] = esdMuTrack->Py();
2627 p[2] = esdMuTrack->Pz();
2628 pos[0] = primary->GetX();
2629 pos[1] = primary->GetY();
2630 pos[2] = primary->GetZ();
2632 // has to be changed once the muon pid is provided by the ESD
2633 for (Int_t i = 0; i < 10; pid[i++] = 0.); pid[AliAODTrack::kMuon]=1.;
2635 primary->AddDaughter(aodTrack =
2636 new(tracks[jTracks++]) AliAODTrack(0, // no ID provided
2637 0, // no label provided
2642 NULL, // no covariance matrix provided
2643 esdMuTrack->Charge(),
2644 0, // ITSClusterMap is set below
2647 kFALSE, // muon tracks are not used to fit the primary vtx
2648 kFALSE, // not used for vertex fit
2649 AliAODTrack::kPrimary)
2652 aodTrack->SetHitsPatternInTrigCh(esdMuTrack->GetHitsPatternInTrigCh());
2653 Int_t track2Trigger = esdMuTrack->GetMatchTrigger();
2654 aodTrack->SetMatchTrigger(track2Trigger);
2656 aodTrack->SetChi2MatchTrigger(esdMuTrack->GetChi2MatchTrigger());
2658 aodTrack->SetChi2MatchTrigger(0.);
2660 tracks.Expand(jTracks); // remove 'empty slots' due to unwritten tracks
2662 // Access to the AOD container of PMD clusters
2663 TClonesArray &pmdClusters = *(aod->GetPmdClusters());
2664 Int_t jPmdClusters=0;
2666 for (Int_t iPmd = 0; iPmd < nPmdClus; ++iPmd) {
2667 // file pmd clusters, to be revised!
2668 AliESDPmdTrack *pmdTrack = esd->GetPmdTrack(iPmd);
2671 Double_t pos[3] = { pmdTrack->GetClusterX(), pmdTrack->GetClusterY(), pmdTrack->GetClusterZ() };
2672 Double_t pid[9] = { 0., 0., 0., 0., 0., 0., 0., 0., 0. }; // to be revised!
2674 // assoc cluster not set
2675 new(pmdClusters[jPmdClusters++]) AliAODPmdCluster(iPmd, nLabel, label, pmdTrack->GetClusterADC(), pos, pid);
2678 // Access to the AOD container of clusters
2679 TClonesArray &caloClusters = *(aod->GetCaloClusters());
2682 for (Int_t iClust=0; iClust<nCaloClus; ++iClust) {
2684 AliESDCaloCluster * cluster = esd->GetCaloCluster(iClust);
2686 Int_t id = cluster->GetID();
2689 Float_t energy = cluster->E();
2690 cluster->GetPosition(posF);
2691 Char_t ttype=AliAODCluster::kUndef;
2693 if (cluster->GetClusterType() == AliESDCaloCluster::kPHOSCluster) {
2694 ttype=AliAODCluster::kPHOSNeutral;
2696 else if (cluster->GetClusterType() == AliESDCaloCluster::kEMCALClusterv1) {
2697 ttype = AliAODCluster::kEMCALClusterv1;
2701 AliAODCaloCluster *caloCluster = new(caloClusters[jClusters++]) AliAODCaloCluster(id,
2709 caloCluster->SetCaloCluster(); // to be refined!
2712 caloClusters.Expand(jClusters); // resize TObjArray to 'remove' slots for pseudo clusters
2713 // end of loop on calo clusters
2715 // fill EMCAL cell info
2716 if (esd->GetEMCALCells()) { // protection against missing ESD information
2717 AliESDCaloCells &esdEMcells = *(esd->GetEMCALCells());
2718 Int_t nEMcell = esdEMcells.GetNumberOfCells() ;
2720 AliAODCaloCells &aodEMcells = *(aod->GetEMCALCells());
2721 aodEMcells.CreateContainer(nEMcell);
2722 aodEMcells.SetType(AliAODCaloCells::kEMCAL);
2723 for (Int_t iCell = 0; iCell < nEMcell; iCell++) {
2724 aodEMcells.SetCell(iCell,esdEMcells.GetCellNumber(iCell),esdEMcells.GetAmplitude(iCell));
2729 // fill PHOS cell info
2730 if (esd->GetPHOSCells()) { // protection against missing ESD information
2731 AliESDCaloCells &esdPHcells = *(esd->GetPHOSCells());
2732 Int_t nPHcell = esdPHcells.GetNumberOfCells() ;
2734 AliAODCaloCells &aodPHcells = *(aod->GetPHOSCells());
2735 aodPHcells.CreateContainer(nPHcell);
2736 aodPHcells.SetType(AliAODCaloCells::kPHOS);
2737 for (Int_t iCell = 0; iCell < nPHcell; iCell++) {
2738 aodPHcells.SetCell(iCell,esdPHcells.GetCellNumber(iCell),esdPHcells.GetAmplitude(iCell));
2744 AliAODTracklets &SPDTracklets = *(aod->GetTracklets());
2745 const AliMultiplicity *mult = esd->GetMultiplicity();
2747 if (mult->GetNumberOfTracklets()>0) {
2748 SPDTracklets.CreateContainer(mult->GetNumberOfTracklets());
2750 for (Int_t n=0; n<mult->GetNumberOfTracklets(); n++) {
2751 SPDTracklets.SetTracklet(n, mult->GetTheta(n), mult->GetPhi(n), mult->GetDeltaPhi(n), mult->GetLabel(n));
2755 Printf("ERROR: AliMultiplicity could not be retrieved from ESD");
2758 delete [] usedTrack;
2762 // fill the tree for this event
2764 } // end of event loop
2766 aodTree->GetUserInfo()->Add(aod);
2768 // write the tree to the specified file
2769 aodFile = aodTree->GetCurrentFile();
2776 void AliReconstruction::WriteAlignmentData(AliESDEvent* esd)
2778 // Write space-points which are then used in the alignment procedures
2779 // For the moment only ITS, TRD and TPC
2781 // Load TOF clusters
2783 fLoader[3]->LoadRecPoints("read");
2784 TTree* tree = fLoader[3]->TreeR();
2786 AliError(Form("Can't get the %s cluster tree", fgkDetectorName[3]));
2789 fTracker[3]->LoadClusters(tree);
2791 Int_t ntracks = esd->GetNumberOfTracks();
2792 for (Int_t itrack = 0; itrack < ntracks; itrack++)
2794 AliESDtrack *track = esd->GetTrack(itrack);
2797 for (Int_t iDet = 3; iDet >= 0; iDet--)
2798 nsp += track->GetNcls(iDet);
2800 AliTrackPointArray *sp = new AliTrackPointArray(nsp);
2801 track->SetTrackPointArray(sp);
2803 for (Int_t iDet = 3; iDet >= 0; iDet--) {
2804 AliTracker *tracker = fTracker[iDet];
2805 if (!tracker) continue;
2806 Int_t nspdet = track->GetNcls(iDet);
2807 if (nspdet <= 0) continue;
2808 track->GetClusters(iDet,idx);
2812 while (isp < nspdet) {
2814 TString dets = fgkDetectorName[iDet];
2815 if ((fUseTrackingErrorsForAlignment.CompareTo(dets) == 0) ||
2816 fUseTrackingErrorsForAlignment.BeginsWith(dets+" ") ||
2817 fUseTrackingErrorsForAlignment.EndsWith(" "+dets) ||
2818 fUseTrackingErrorsForAlignment.Contains(" "+dets+" ")) {
2819 isvalid = tracker->GetTrackPointTrackingError(idx[isp2],p,track);
2821 isvalid = tracker->GetTrackPoint(idx[isp2],p);
2824 const Int_t kNTPCmax = 159;
2825 if (iDet==1 && isp2>kNTPCmax) break; // to be fixed
2826 if (!isvalid) continue;
2827 sp->AddPoint(isptrack,&p); isptrack++; isp++;
2833 fTracker[3]->UnloadClusters();
2834 fLoader[3]->UnloadRecPoints();
2838 //_____________________________________________________________________________
2839 void AliReconstruction::FillRawDataErrorLog(Int_t iEvent, AliESDEvent* esd)
2841 // The method reads the raw-data error log
2842 // accumulated within the rawReader.
2843 // It extracts the raw-data errors related to
2844 // the current event and stores them into
2845 // a TClonesArray inside the esd object.
2847 if (!fRawReader) return;
2849 for(Int_t i = 0; i < fRawReader->GetNumberOfErrorLogs(); i++) {
2851 AliRawDataErrorLog *log = fRawReader->GetErrorLog(i);
2853 if (iEvent != log->GetEventNumber()) continue;
2855 esd->AddRawDataErrorLog(log);
2860 TNamed* AliReconstruction::CopyFileToTNamed(TString fPath,TString fName){
2861 // Dump a file content into a char in TNamed
2863 in.open(fPath.Data(),ios::in | ios::binary|ios::ate);
2864 Int_t kBytes = (Int_t)in.tellg();
2865 printf("Size: %d \n",kBytes);
2868 char* memblock = new char [kBytes];
2869 in.seekg (0, ios::beg);
2870 in.read (memblock, kBytes);
2872 TString fData(memblock,kBytes);
2873 fn = new TNamed(fName,fData);
2874 printf("fData Size: %d \n",fData.Sizeof());
2875 printf("fName Size: %d \n",fName.Sizeof());
2876 printf("fn Size: %d \n",fn->Sizeof());
2880 AliInfo(Form("Could not Open %s\n",fPath.Data()));
2886 void AliReconstruction::TNamedToFile(TTree* fTree, TString fName){
2887 // This is not really needed in AliReconstruction at the moment
2888 // but can serve as a template
2890 TList *fList = fTree->GetUserInfo();
2891 TNamed *fn = (TNamed*)fList->FindObject(fName.Data());
2892 printf("fn Size: %d \n",fn->Sizeof());
2894 TString fTmp(fn->GetName()); // to be 100% sure in principle fName also works
2895 const char* cdata = fn->GetTitle();
2896 printf("fTmp Size %d\n",fTmp.Sizeof());
2898 int size = fn->Sizeof()-fTmp.Sizeof()-sizeof(UChar_t)-sizeof(Int_t); // see dfinition of TString::SizeOf()...
2899 printf("calculated size %d\n",size);
2900 ofstream out(fName.Data(),ios::out | ios::binary);
2901 out.write(cdata,size);
2906 //_____________________________________________________________________________
2907 AliQADataMaker * AliReconstruction::GetQADataMaker(Int_t iDet)
2909 // get the quality assurance data maker object and the loader for a detector
2911 if (fQADataMaker[iDet])
2912 return fQADataMaker[iDet];
2914 AliQADataMaker * qadm = NULL;
2915 if (iDet==fgkNDetectors) { //Global QA
2916 qadm=new AliGlobalQADataMaker();
2917 fQADataMaker[iDet] = qadm;
2921 // load the QA data maker object
2922 TPluginManager* pluginManager = gROOT->GetPluginManager();
2923 TString detName = fgkDetectorName[iDet];
2924 TString qadmName = "Ali" + detName + "QADataMaker";
2925 if (gAlice && !gAlice->GetDetector(detName) && (detName != "HLT"))
2928 // first check if a plugin is defined for the quality assurance data maker
2929 TPluginHandler* pluginHandler = pluginManager->FindHandler("AliQADataMaker", detName);
2930 // if not, add a plugin for it
2931 if (!pluginHandler) {
2932 AliDebug(1, Form("defining plugin for %s", qadmName.Data()));
2933 TString libs = gSystem->GetLibraries();
2934 if (libs.Contains("lib" + detName + "base.so") ||
2935 (gSystem->Load("lib" + detName + "base.so") >= 0)) {
2936 pluginManager->AddHandler("AliQADataMaker", detName,
2937 qadmName, detName + "qadm", qadmName + "()");
2939 pluginManager->AddHandler("AliQADataMaker", detName,
2940 qadmName, detName, qadmName + "()");
2942 pluginHandler = pluginManager->FindHandler("AliQADataMaker", detName);
2944 if (pluginHandler && (pluginHandler->LoadPlugin() == 0)) {
2945 qadm = (AliQADataMaker *) pluginHandler->ExecPlugin(0);
2948 fQADataMaker[iDet] = qadm;
2953 //_____________________________________________________________________________
2954 Bool_t AliReconstruction::RunQA(const char* detectors, AliESDEvent *& esd)
2956 // run the Quality Assurance data producer
2958 AliCodeTimerAuto("")
2959 TString detStr = detectors;
2960 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
2961 if (!IsSelected(fgkDetectorName[iDet], detStr))
2963 AliQADataMaker * qadm = GetQADataMaker(iDet);
2966 AliCodeTimerStart(Form("running quality assurance data maker for %s", fgkDetectorName[iDet]));
2967 AliInfo(Form("running quality assurance data maker for %s", fgkDetectorName[iDet]));
2969 qadm->Exec(AliQA::kESDS, esd) ;
2972 AliCodeTimerStop(Form("running quality assurance data maker for %s", fgkDetectorName[iDet]));
2974 if ((detStr.CompareTo("ALL") != 0) && !detStr.IsNull()) {
2975 AliError(Form("the following detectors were not found: %s",
2985 //_____________________________________________________________________________
2986 void AliReconstruction::CheckQA()
2988 // check the QA of SIM for this run and remove the detectors
2989 // with status Fatal
2991 TString newRunLocalReconstruction ;
2992 TString newRunTracking ;
2993 TString newFillESD ;
2995 for (Int_t iDet = 0; iDet < AliQA::kNDET; iDet++) {
2996 TString detName(AliQA::GetDetName(iDet)) ;
2997 AliQA * qa = AliQA::Instance(AliQA::DETECTORINDEX(iDet)) ;
2998 if ( qa->IsSet(AliQA::DETECTORINDEX(iDet), AliQA::kSIM, AliQA::kFATAL)) {
2999 AliInfo(Form("QA status for %s in Hits and/or SDIGITS and/or Digits was Fatal; No reconstruction performed", detName.Data())) ;
3001 if ( fRunLocalReconstruction.Contains(AliQA::GetDetName(iDet)) ||
3002 fRunLocalReconstruction.Contains("ALL") ) {
3003 newRunLocalReconstruction += detName ;
3004 newRunLocalReconstruction += " " ;
3006 if ( fRunTracking.Contains(AliQA::GetDetName(iDet)) ||
3007 fRunTracking.Contains("ALL") ) {
3008 newRunTracking += detName ;
3009 newRunTracking += " " ;
3011 if ( fFillESD.Contains(AliQA::GetDetName(iDet)) ||
3012 fFillESD.Contains("ALL") ) {
3013 newFillESD += detName ;
3018 fRunLocalReconstruction = newRunLocalReconstruction ;
3019 fRunTracking = newRunTracking ;
3020 fFillESD = newFillESD ;
3023 //_____________________________________________________________________________
3024 Int_t AliReconstruction::GetDetIndex(const char* detector)
3026 // return the detector index corresponding to detector
3028 for (index = 0; index < fgkNDetectors ; index++) {
3029 if ( strcmp(detector, fgkDetectorName[index]) == 0 )