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 "AliMultiplicity.h"
147 #include "AliTracker.h"
148 #include "AliVertexer.h"
149 #include "AliVertexerTracks.h"
150 #include "AliV0vertexer.h"
151 #include "AliCascadeVertexer.h"
152 #include "AliHeader.h"
153 #include "AliGenEventHeader.h"
155 #include "AliESDpid.h"
156 #include "AliESDtrack.h"
157 #include "AliESDPmdTrack.h"
159 #include "AliESDTagCreator.h"
160 #include "AliAODTagCreator.h"
162 #include "AliGeomManager.h"
163 #include "AliTrackPointArray.h"
164 #include "AliCDBManager.h"
165 #include "AliCDBStorage.h"
166 #include "AliCDBEntry.h"
167 #include "AliAlignObj.h"
169 #include "AliCentralTrigger.h"
170 #include "AliCTPRawStream.h"
172 #include "AliAODEvent.h"
173 #include "AliAODHeader.h"
174 #include "AliAODTrack.h"
175 #include "AliAODVertex.h"
176 #include "AliAODv0.h"
177 #include "AliAODJet.h"
178 #include "AliAODCaloCells.h"
179 #include "AliAODCaloCluster.h"
180 #include "AliAODPmdCluster.h"
181 #include "AliAODFmdCluster.h"
182 #include "AliAODTracklets.h"
184 #include "AliQADataMaker.h"
186 #include "AliQADataMakerSteer.h"
188 #include "AliSysInfo.h" // memory snapshots
191 ClassImp(AliReconstruction)
194 //_____________________________________________________________________________
195 const char* AliReconstruction::fgkDetectorName[AliReconstruction::fgkNDetectors] = {"ITS", "TPC", "TRD", "TOF", "PHOS", "HMPID", "EMCAL", "MUON", "FMD", "ZDC", "PMD", "T0", "VZERO", "ACORDE", "HLT"};
197 //_____________________________________________________________________________
198 AliReconstruction::AliReconstruction(const char* gAliceFilename,
199 const char* name, const char* title) :
202 fUniformField(kTRUE),
203 fRunVertexFinder(kTRUE),
204 fRunHLTTracking(kFALSE),
205 fRunMuonTracking(kFALSE),
207 fRunCascadeFinder(kTRUE),
208 fStopOnError(kFALSE),
209 fWriteAlignmentData(kFALSE),
210 fWriteESDfriend(kFALSE),
212 fFillTriggerESD(kTRUE),
220 fRunLocalReconstruction("ALL"),
223 fUseTrackingErrorsForAlignment(""),
224 fGAliceFileName(gAliceFilename),
229 fNumberOfEventsPerFile(1),
232 fLoadAlignFromCDB(kTRUE),
233 fLoadAlignData("ALL"),
240 fDiamondProfile(NULL),
244 fAlignObjArray(NULL),
247 fInitCDBCalled(kFALSE),
248 fSetRunNumberFromDataCalled(kFALSE),
253 // create reconstruction object with default parameters
255 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
256 fReconstructor[iDet] = NULL;
257 fLoader[iDet] = NULL;
258 fTracker[iDet] = NULL;
259 fQADataMaker[iDet] = NULL;
260 fQACycles[iDet] = 999999;
265 //_____________________________________________________________________________
266 AliReconstruction::AliReconstruction(const AliReconstruction& rec) :
269 fUniformField(rec.fUniformField),
270 fRunVertexFinder(rec.fRunVertexFinder),
271 fRunHLTTracking(rec.fRunHLTTracking),
272 fRunMuonTracking(rec.fRunMuonTracking),
273 fRunV0Finder(rec.fRunV0Finder),
274 fRunCascadeFinder(rec.fRunCascadeFinder),
275 fStopOnError(rec.fStopOnError),
276 fWriteAlignmentData(rec.fWriteAlignmentData),
277 fWriteESDfriend(rec.fWriteESDfriend),
278 fWriteAOD(rec.fWriteAOD),
279 fFillTriggerESD(rec.fFillTriggerESD),
281 fCleanESD(rec.fCleanESD),
282 fV0DCAmax(rec.fV0DCAmax),
283 fV0CsPmin(rec.fV0CsPmin),
287 fRunLocalReconstruction(rec.fRunLocalReconstruction),
288 fRunTracking(rec.fRunTracking),
289 fFillESD(rec.fFillESD),
290 fUseTrackingErrorsForAlignment(rec.fUseTrackingErrorsForAlignment),
291 fGAliceFileName(rec.fGAliceFileName),
293 fEquipIdMap(rec.fEquipIdMap),
294 fFirstEvent(rec.fFirstEvent),
295 fLastEvent(rec.fLastEvent),
296 fNumberOfEventsPerFile(rec.fNumberOfEventsPerFile),
299 fLoadAlignFromCDB(rec.fLoadAlignFromCDB),
300 fLoadAlignData(rec.fLoadAlignData),
301 fESDPar(rec.fESDPar),
307 fDiamondProfile(NULL),
311 fAlignObjArray(rec.fAlignObjArray),
312 fCDBUri(rec.fCDBUri),
314 fInitCDBCalled(rec.fInitCDBCalled),
315 fSetRunNumberFromDataCalled(rec.fSetRunNumberFromDataCalled),
322 for (Int_t i = 0; i < rec.fOptions.GetEntriesFast(); i++) {
323 if (rec.fOptions[i]) fOptions.Add(rec.fOptions[i]->Clone());
325 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
326 fReconstructor[iDet] = NULL;
327 fLoader[iDet] = NULL;
328 fTracker[iDet] = NULL;
329 fQADataMaker[iDet] = NULL;
330 fQACycles[iDet] = rec.fQACycles[iDet];
332 for (Int_t i = 0; i < rec.fSpecCDBUri.GetEntriesFast(); i++) {
333 if (rec.fSpecCDBUri[i]) fSpecCDBUri.Add(rec.fSpecCDBUri[i]->Clone());
337 //_____________________________________________________________________________
338 AliReconstruction& AliReconstruction::operator = (const AliReconstruction& rec)
340 // assignment operator
342 this->~AliReconstruction();
343 new(this) AliReconstruction(rec);
347 //_____________________________________________________________________________
348 AliReconstruction::~AliReconstruction()
354 fSpecCDBUri.Delete();
356 AliCodeTimer::Instance()->Print();
359 //_____________________________________________________________________________
360 void AliReconstruction::InitCDB()
362 // activate a default CDB storage
363 // First check if we have any CDB storage set, because it is used
364 // to retrieve the calibration and alignment constants
366 if (fInitCDBCalled) return;
367 fInitCDBCalled = kTRUE;
369 AliCDBManager* man = AliCDBManager::Instance();
370 if (man->IsDefaultStorageSet())
372 AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
373 AliWarning("Default CDB storage has been already set !");
374 AliWarning(Form("Ignoring the default storage declared in AliReconstruction: %s",fCDBUri.Data()));
375 AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
376 fCDBUri = man->GetDefaultStorage()->GetURI();
379 if (fCDBUri.Length() > 0)
381 AliDebug(2,"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
382 AliDebug(2, Form("Default CDB storage is set to: %s", fCDBUri.Data()));
383 AliDebug(2, "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
385 fCDBUri="local://$ALICE_ROOT";
386 AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
387 AliWarning("Default CDB storage not yet set !!!!");
388 AliWarning(Form("Setting it now to: %s", fCDBUri.Data()));
389 AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
392 man->SetDefaultStorage(fCDBUri);
395 // Now activate the detector specific CDB storage locations
396 for (Int_t i = 0; i < fSpecCDBUri.GetEntriesFast(); i++) {
397 TObject* obj = fSpecCDBUri[i];
399 AliDebug(2, "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
400 AliDebug(2, Form("Specific CDB storage for %s is set to: %s",obj->GetName(),obj->GetTitle()));
401 AliDebug(2, "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
402 man->SetSpecificStorage(obj->GetName(), obj->GetTitle());
407 //_____________________________________________________________________________
408 void AliReconstruction::SetDefaultStorage(const char* uri) {
409 // Store the desired default CDB storage location
410 // Activate it later within the Run() method
416 //_____________________________________________________________________________
417 void AliReconstruction::SetSpecificStorage(const char* calibType, const char* uri) {
418 // Store a detector-specific CDB storage location
419 // Activate it later within the Run() method
421 AliCDBPath aPath(calibType);
422 if(!aPath.IsValid()){
423 // if calibType is not wildcard but it is a valid detector, add "/*" to make it a valid path
424 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
425 if(!strcmp(calibType, fgkDetectorName[iDet])) {
426 aPath.SetPath(Form("%s/*", calibType));
427 AliInfo(Form("Path for specific storage set to %s", aPath.GetPath().Data()));
431 if(!aPath.IsValid()){
432 AliError(Form("Not a valid path or detector: %s", calibType));
437 // // check that calibType refers to a "valid" detector name
438 // Bool_t isDetector = kFALSE;
439 // for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
440 // TString detName = fgkDetectorName[iDet];
441 // if(aPath.GetLevel0() == detName) {
442 // isDetector = kTRUE;
448 // AliError(Form("Not a valid detector: %s", aPath.GetLevel0().Data()));
452 TObject* obj = fSpecCDBUri.FindObject(aPath.GetPath().Data());
453 if (obj) fSpecCDBUri.Remove(obj);
454 fSpecCDBUri.Add(new TNamed(aPath.GetPath().Data(), uri));
458 //_____________________________________________________________________________
459 Bool_t AliReconstruction::SetRunNumberFromData()
461 // The method is called in Run() in order
462 // to set a correct run number.
463 // In case of raw data reconstruction the
464 // run number is taken from the raw data header
466 if (fSetRunNumberFromDataCalled) return kTRUE;
467 fSetRunNumberFromDataCalled = kTRUE;
469 AliCDBManager* man = AliCDBManager::Instance();
471 if(man->GetRun() > 0) {
472 AliWarning("Run number is taken from event header! Ignoring settings in AliCDBManager!");
476 AliError("No run loader is found !");
479 // read run number from gAlice
480 if(fRunLoader->GetAliRun())
481 AliCDBManager::Instance()->SetRun(fRunLoader->GetHeader()->GetRun());
484 if(fRawReader->NextEvent()) {
485 AliCDBManager::Instance()->SetRun(fRawReader->GetRunNumber());
486 fRawReader->RewindEvents();
489 AliError("No raw-data events found !");
494 AliError("Neither gAlice nor RawReader objects are found !");
504 //_____________________________________________________________________________
505 void AliReconstruction::SetCDBLock() {
506 // Set CDB lock: from now on it is forbidden to reset the run number
507 // or the default storage or to activate any further storage!
509 AliCDBManager::Instance()->SetLock(1);
512 //_____________________________________________________________________________
513 Bool_t AliReconstruction::MisalignGeometry(const TString& detectors)
515 // Read the alignment objects from CDB.
516 // Each detector is supposed to have the
517 // alignment objects in DET/Align/Data CDB path.
518 // All the detector objects are then collected,
519 // sorted by geometry level (starting from ALIC) and
520 // then applied to the TGeo geometry.
521 // Finally an overlaps check is performed.
523 // Load alignment data from CDB and fill fAlignObjArray
524 if(fLoadAlignFromCDB){
526 TString detStr = detectors;
527 TString loadAlObjsListOfDets = "";
529 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
530 if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
531 loadAlObjsListOfDets += fgkDetectorName[iDet];
532 loadAlObjsListOfDets += " ";
533 } // end loop over detectors
534 loadAlObjsListOfDets.Prepend("GRP "); //add alignment objects for non-sensitive modules
535 AliGeomManager::ApplyAlignObjsFromCDB(loadAlObjsListOfDets.Data());
537 // Check if the array with alignment objects was
538 // provided by the user. If yes, apply the objects
539 // to the present TGeo geometry
540 if (fAlignObjArray) {
541 if (gGeoManager && gGeoManager->IsClosed()) {
542 if (AliGeomManager::ApplyAlignObjsToGeom(*fAlignObjArray) == kFALSE) {
543 AliError("The misalignment of one or more volumes failed!"
544 "Compare the list of simulated detectors and the list of detector alignment data!");
549 AliError("Can't apply the misalignment! gGeoManager doesn't exist or it is still opened!");
555 delete fAlignObjArray; fAlignObjArray=0;
560 //_____________________________________________________________________________
561 void AliReconstruction::SetGAliceFile(const char* fileName)
563 // set the name of the galice file
565 fGAliceFileName = fileName;
568 //_____________________________________________________________________________
569 void AliReconstruction::SetOption(const char* detector, const char* option)
571 // set options for the reconstruction of a detector
573 TObject* obj = fOptions.FindObject(detector);
574 if (obj) fOptions.Remove(obj);
575 fOptions.Add(new TNamed(detector, option));
579 //_____________________________________________________________________________
580 Bool_t AliReconstruction::Run(const char* input)
582 // run the reconstruction
587 if (!input) input = fInput.Data();
588 TString fileName(input);
589 if (fileName.EndsWith("/")) {
590 fRawReader = new AliRawReaderFile(fileName);
591 } else if (fileName.EndsWith(".root")) {
592 fRawReader = new AliRawReaderRoot(fileName);
593 } else if (!fileName.IsNull()) {
594 fRawReader = new AliRawReaderDate(fileName);
595 fRawReader->SelectEvents(7);
597 if (!fEquipIdMap.IsNull() && fRawReader)
598 fRawReader->LoadEquipmentIdsMap(fEquipIdMap);
600 AliSysInfo::AddStamp("Start");
601 // get the run loader
602 if (!InitRunLoader()) return kFALSE;
603 AliSysInfo::AddStamp("LoadLoader");
605 // Initialize the CDB storage
608 AliSysInfo::AddStamp("LoadCDB");
610 // Set run number in CDBManager (if it is not already set by the user)
611 if (!SetRunNumberFromData()) if (fStopOnError) return kFALSE;
613 // Set CDB lock: from now on it is forbidden to reset the run number
614 // or the default storage or to activate any further storage!
617 // Import ideal TGeo geometry and apply misalignment
619 TString geom(gSystem->DirName(fGAliceFileName));
620 geom += "/geometry.root";
621 AliGeomManager::LoadGeometry(geom.Data());
622 if (!gGeoManager) if (fStopOnError) return kFALSE;
625 if (!MisalignGeometry(fLoadAlignData)) if (fStopOnError) return kFALSE;
626 AliSysInfo::AddStamp("LoadGeom");
629 AliQADataMakerSteer qas ;
630 if ( fRunQA && fRawReader)
631 qas.Run("ALL", fRawReader) ;
633 // checking the QA of previous steps
636 // local reconstruction
637 if (!fRunLocalReconstruction.IsNull()) {
638 if (!RunLocalReconstruction(fRunLocalReconstruction)) {
639 if (fStopOnError) {CleanUp(); return kFALSE;}
642 // if (!fRunVertexFinder && fRunTracking.IsNull() &&
643 // fFillESD.IsNull()) return kTRUE;
646 if (fRunVertexFinder && !CreateVertexer()) {
652 AliSysInfo::AddStamp("Vertexer");
655 if (!fRunTracking.IsNull() && !CreateTrackers(fRunTracking)) {
661 AliSysInfo::AddStamp("LoadTrackers");
663 // get the possibly already existing ESD file and tree
664 AliESDEvent* esd = new AliESDEvent(); AliESDEvent* hltesd = new AliESDEvent();
665 TFile* fileOld = NULL;
666 TTree* treeOld = NULL; TTree *hlttreeOld = NULL;
667 if (!gSystem->AccessPathName("AliESDs.root")){
668 gSystem->CopyFile("AliESDs.root", "AliESDs.old.root", kTRUE);
669 fileOld = TFile::Open("AliESDs.old.root");
670 if (fileOld && fileOld->IsOpen()) {
671 treeOld = (TTree*) fileOld->Get("esdTree");
672 if (treeOld)esd->ReadFromTree(treeOld);
673 hlttreeOld = (TTree*) fileOld->Get("HLTesdTree");
674 if (hlttreeOld) hltesd->ReadFromTree(hlttreeOld);
678 // create the ESD output file and tree
679 TFile* file = TFile::Open("AliESDs.root", "RECREATE");
680 file->SetCompressionLevel(2);
681 if (!file->IsOpen()) {
682 AliError("opening AliESDs.root failed");
683 if (fStopOnError) {CleanUp(file, fileOld); return kFALSE;}
686 TTree* tree = new TTree("esdTree", "Tree with ESD objects");
687 esd = new AliESDEvent();
688 esd->CreateStdContent();
689 esd->WriteToTree(tree);
691 TTree* hlttree = new TTree("HLTesdTree", "Tree with HLT ESD objects");
692 hltesd = new AliESDEvent();
693 hltesd->CreateStdContent();
694 hltesd->WriteToTree(hlttree);
697 delete esd; delete hltesd;
698 esd = NULL; hltesd = NULL;
700 // create the branch with ESD additions
704 AliESDfriend *esdf = 0;
705 if (fWriteESDfriend) {
706 esdf = new AliESDfriend();
707 TBranch *br=tree->Branch("ESDfriend.","AliESDfriend", &esdf);
708 br->SetFile("AliESDfriends.root");
709 esd->AddObject(esdf);
713 // Get the GRP CDB entry
714 AliCDBEntry* entryGRP = AliCDBManager::Instance()->Get("GRP/GRP/Data");
717 fGRPList = dynamic_cast<TList*> (entryGRP->GetObject());
719 AliError("No GRP entry found in OCDB!");
722 // Get the diamond profile from OCDB
723 AliCDBEntry* entry = AliCDBManager::Instance()
724 ->Get("GRP/Calib/MeanVertex");
727 fDiamondProfile = dynamic_cast<AliESDVertex*> (entry->GetObject());
729 AliError("No diamond profile found in OCDB!");
732 AliVertexerTracks tVertexer(AliTracker::GetBz());
733 if(fDiamondProfile) tVertexer.SetVtxStart(fDiamondProfile);
737 if (fRawReader) fRawReader->RewindEvents();
738 TString detStr(fFillESD) ;
741 gSystem->GetProcInfo(&ProcInfo);
742 AliInfo(Form("Current memory usage %d %d", ProcInfo.fMemResident, ProcInfo.fMemVirtual));
744 for (Int_t iEvent = 0; iEvent < fRunLoader->GetNumberOfEvents(); iEvent++) {
745 if (fRawReader) fRawReader->NextEvent();
746 if ((iEvent < fFirstEvent) || ((fLastEvent >= 0) && (iEvent > fLastEvent))) {
747 // copy old ESD to the new one
749 esd->ReadFromTree(treeOld);
750 treeOld->GetEntry(iEvent);
754 esd->ReadFromTree(hlttreeOld);
755 hlttreeOld->GetEntry(iEvent);
761 AliInfo(Form("processing event %d", iEvent));
762 fRunLoader->GetEvent(iEvent);
765 sprintf(aFileName, "ESD_%d.%d_final.root",
766 fRunLoader->GetHeader()->GetRun(),
767 fRunLoader->GetHeader()->GetEventNrInRun());
768 if (!gSystem->AccessPathName(aFileName)) continue;
770 // local reconstruction
771 if (!fRunLocalReconstruction.IsNull()) {
772 if (!RunLocalEventReconstruction(fRunLocalReconstruction)) {
773 if (fStopOnError) {CleanUp(file, fileOld); return kFALSE;}
778 esd->SetRunNumber(fRunLoader->GetHeader()->GetRun());
779 hltesd->SetRunNumber(fRunLoader->GetHeader()->GetRun());
780 esd->SetEventNumberInFile(fRunLoader->GetHeader()->GetEventNrInRun());
781 hltesd->SetEventNumberInFile(fRunLoader->GetHeader()->GetEventNrInRun());
783 // Set magnetic field from the tracker
784 esd->SetMagneticField(AliTracker::GetBz());
785 hltesd->SetMagneticField(AliTracker::GetBz());
789 // Fill raw-data error log into the ESD
790 if (fRawReader) FillRawDataErrorLog(iEvent,esd);
793 if (fRunVertexFinder) {
794 if (!ReadESD(esd, "vertex")) {
795 if (!RunVertexFinder(esd)) {
796 if (fStopOnError) {CleanUp(file, fileOld); return kFALSE;}
798 if (fCheckPointLevel > 0) WriteESD(esd, "vertex");
803 if (!fRunTracking.IsNull()) {
804 if (fRunHLTTracking) {
805 hltesd->SetVertex(esd->GetVertex());
806 if (!RunHLTTracking(hltesd)) {
807 if (fStopOnError) {CleanUp(file, fileOld); return kFALSE;}
813 if (!fRunTracking.IsNull()) {
814 if (fRunMuonTracking) {
815 if (!RunMuonTracking(esd)) {
816 if (fStopOnError) {CleanUp(file, fileOld); return kFALSE;}
822 if (!fRunTracking.IsNull()) {
823 if (!ReadESD(esd, "tracking")) {
824 if (!RunTracking(esd)) {
825 if (fStopOnError) {CleanUp(file, fileOld); return kFALSE;}
827 if (fCheckPointLevel > 0) WriteESD(esd, "tracking");
832 if (!fFillESD.IsNull()) {
833 if (!FillESD(esd, fFillESD)) {
834 if (fStopOnError) {CleanUp(file, fileOld); return kFALSE;}
838 // if (!fFillESD.IsNull())
840 // do QA in the event loop if requested
842 RunQA(fFillESD.Data(), esd);
844 // fill Event header information from the RawEventHeader
845 if (fRawReader){FillRawEventHeaderESD(esd);}
848 AliESDpid::MakePID(esd);
849 if (fCheckPointLevel > 1) WriteESD(esd, "PID");
851 if (fFillTriggerESD) {
852 if (!ReadESD(esd, "trigger")) {
853 if (!FillTriggerESD(esd)) {
854 if (fStopOnError) {CleanUp(file, fileOld); return kFALSE;}
856 if (fCheckPointLevel > 1) WriteESD(esd, "trigger");
862 //Try to improve the reconstructed primary vertex position using the tracks
863 AliESDVertex *pvtx=0;
864 Bool_t dovertex=kTRUE;
865 TObject* obj = fOptions.FindObject("ITS");
867 TString optITS = obj->GetTitle();
868 if (optITS.Contains("cosmics") || optITS.Contains("COSMICS"))
871 if(dovertex) pvtx=tVertexer.FindPrimaryVertex(esd);
872 if(fDiamondProfile) esd->SetDiamond(fDiamondProfile);
875 if (pvtx->GetStatus()) {
876 // Store the improved primary vertex
877 esd->SetPrimaryVertex(pvtx);
878 // Propagate the tracks to the DCA to the improved primary vertex
879 Double_t somethingbig = 777.;
880 Double_t bz = esd->GetMagneticField();
881 Int_t nt=esd->GetNumberOfTracks();
883 AliESDtrack *t = esd->GetTrack(nt);
884 t->RelateToVertex(pvtx, bz, somethingbig);
891 vtxer.Tracks2V0vertices(esd);
893 if (fRunCascadeFinder) {
895 AliCascadeVertexer cvtxer;
896 cvtxer.V0sTracks2CascadeVertices(esd);
901 if (fCleanESD) CleanESD(esd);
902 if (fWriteESDfriend) {
903 esdf->~AliESDfriend();
904 new (esdf) AliESDfriend(); // Reset...
905 esd->GetESDfriend(esdf);
912 if (fCheckPointLevel > 0) WriteESD(esd, "final");
915 if (fWriteESDfriend) {
916 esdf->~AliESDfriend();
917 new (esdf) AliESDfriend(); // Reset...
920 // delete esdf; esdf = 0;
923 gSystem->GetProcInfo(&ProcInfo);
924 AliInfo(Form("Event %d -> Current memory usage %d %d",iEvent, ProcInfo.fMemResident, ProcInfo.fMemVirtual));
930 // write quality assurance ESDs data (one entry for all events)
932 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
933 if (!IsSelected(fgkDetectorName[iDet], detStr))
935 AliQADataMaker * qadm = GetQADataMaker(iDet);
937 qadm->EndOfCycle(AliQA::kRECPOINTS);
938 qadm->EndOfCycle(AliQA::kESDS);
943 tree->GetUserInfo()->Add(esd);
944 hlttree->GetUserInfo()->Add(hltesd);
946 const TMap *cdbMap = AliCDBManager::Instance()->GetStorageMap();
947 const TList *cdbList = AliCDBManager::Instance()->GetRetrievedIds();
949 TMap *cdbMapCopy = new TMap(cdbMap->GetEntries());
950 cdbMapCopy->SetOwner(1);
951 cdbMapCopy->SetName("cdbMap");
952 TIter iter(cdbMap->GetTable());
955 while((pair = dynamic_cast<TPair*> (iter.Next()))){
956 TObjString* keyStr = dynamic_cast<TObjString*> (pair->Key());
957 TObjString* valStr = dynamic_cast<TObjString*> (pair->Value());
958 cdbMapCopy->Add(new TObjString(keyStr->GetName()), new TObjString(valStr->GetName()));
961 TList *cdbListCopy = new TList();
962 cdbListCopy->SetOwner(1);
963 cdbListCopy->SetName("cdbList");
965 TIter iter2(cdbList);
968 while((id = dynamic_cast<AliCDBId*> (iter2.Next()))){
969 cdbListCopy->Add(new TObjString(id->ToString().Data()));
972 tree->GetUserInfo()->Add(cdbMapCopy);
973 tree->GetUserInfo()->Add(cdbListCopy);
976 if(fESDPar.Contains("ESD.par")){
977 AliInfo("Attaching ESD.par to Tree");
978 TNamed *fn = CopyFileToTNamed(fESDPar.Data(),"ESD.par");
979 tree->GetUserInfo()->Add(fn);
985 tree->SetBranchStatus("ESDfriend*",0);
986 // we want to have only one tree version number
987 tree->Write(tree->GetName(),TObject::kOverwrite);
991 TFile *aodFile = TFile::Open("AliAOD.root", "RECREATE");
992 ESDFile2AODFile(file, aodFile);
997 CleanUp(file, fileOld);
999 // Create tags for the events in the ESD tree (the ESD tree is always present)
1000 // In case of empty events the tags will contain dummy values
1001 AliESDTagCreator *esdtagCreator = new AliESDTagCreator();
1002 esdtagCreator->CreateESDTags(fFirstEvent,fLastEvent,fGRPList);
1004 AliAODTagCreator *aodtagCreator = new AliAODTagCreator();
1005 aodtagCreator->CreateAODTags(fFirstEvent,fLastEvent,fGRPList);
1008 //QA fone outside the event loop
1011 qas.Run(fRunLocalReconstruction.Data(), AliQA::kRECPOINTS) ;
1013 qas.Run(fRunTracking.Data(), AliQA::kESDS) ;
1017 // Cleanup of CDB manager: cache and active storages!
1018 AliCDBManager::Instance()->ClearCache();
1025 //_____________________________________________________________________________
1026 Bool_t AliReconstruction::RunLocalReconstruction(const TString& detectors)
1028 // run the local reconstruction
1029 static Int_t eventNr=0;
1030 AliCodeTimerAuto("")
1032 // AliCDBManager* man = AliCDBManager::Instance();
1033 // Bool_t origCache = man->GetCacheFlag();
1035 // TString detStr = detectors;
1036 // for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
1037 // if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
1038 // AliReconstructor* reconstructor = GetReconstructor(iDet);
1039 // if (!reconstructor) continue;
1040 // if (reconstructor->HasLocalReconstruction()) continue;
1042 // AliCodeTimerStart(Form("running reconstruction for %s", fgkDetectorName[iDet]));
1043 // AliInfo(Form("running reconstruction for %s", fgkDetectorName[iDet]));
1045 // AliCodeTimerStart(Form("Loading calibration data from OCDB for %s", fgkDetectorName[iDet]));
1046 // AliInfo(Form("Loading calibration data from OCDB for %s", fgkDetectorName[iDet]));
1048 // man->SetCacheFlag(kTRUE);
1049 // TString calibPath = Form("%s/Calib/*", fgkDetectorName[iDet]);
1050 // man->GetAll(calibPath); // entries are cached!
1052 // AliCodeTimerStop(Form("Loading calibration data from OCDB for %s", fgkDetectorName[iDet]));
1054 // if (fRawReader) {
1055 // fRawReader->RewindEvents();
1056 // reconstructor->Reconstruct(fRunLoader, fRawReader);
1058 // reconstructor->Reconstruct(fRunLoader);
1061 // AliCodeTimerStop(Form("running reconstruction for %s", fgkDetectorName[iDet]));
1062 // AliSysInfo::AddStamp(Form("LRec%s_%d",fgkDetectorName[iDet],eventNr));
1064 // // unload calibration data
1065 // man->UnloadFromCache(calibPath);
1066 // //man->ClearCache();
1069 // man->SetCacheFlag(origCache);
1071 // if ((detStr.CompareTo("ALL") != 0) && !detStr.IsNull()) {
1072 // AliError(Form("the following detectors were not found: %s",
1074 // if (fStopOnError) return kFALSE;
1081 //_____________________________________________________________________________
1082 Bool_t AliReconstruction::RunLocalEventReconstruction(const TString& detectors)
1084 // run the local reconstruction
1085 static Int_t eventNr=0;
1086 AliCodeTimerAuto("")
1088 TString detStr = detectors;
1089 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
1090 if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
1091 AliReconstructor* reconstructor = GetReconstructor(iDet);
1092 if (!reconstructor) continue;
1093 AliLoader* loader = fLoader[iDet];
1095 AliWarning(Form("No loader is defined for %s!",fgkDetectorName[iDet]));
1099 // conversion of digits
1100 if (fRawReader && reconstructor->HasDigitConversion()) {
1101 AliInfo(Form("converting raw data digits into root objects for %s",
1102 fgkDetectorName[iDet]));
1103 AliCodeTimerAuto(Form("converting raw data digits into root objects for %s",
1104 fgkDetectorName[iDet]));
1105 loader->LoadDigits("update");
1106 loader->CleanDigits();
1107 loader->MakeDigitsContainer();
1108 TTree* digitsTree = loader->TreeD();
1109 reconstructor->ConvertDigits(fRawReader, digitsTree);
1110 loader->WriteDigits("OVERWRITE");
1111 loader->UnloadDigits();
1114 // local reconstruction
1115 AliInfo(Form("running reconstruction for %s", fgkDetectorName[iDet]));
1116 AliCodeTimerAuto(Form("running reconstruction for %s", fgkDetectorName[iDet]));
1117 loader->LoadRecPoints("update");
1118 loader->CleanRecPoints();
1119 loader->MakeRecPointsContainer();
1120 TTree* clustersTree = loader->TreeR();
1121 if (fRawReader && !reconstructor->HasDigitConversion()) {
1122 reconstructor->Reconstruct(fRawReader, clustersTree);
1124 loader->LoadDigits("read");
1125 TTree* digitsTree = loader->TreeD();
1127 AliError(Form("Can't get the %s digits tree", fgkDetectorName[iDet]));
1128 if (fStopOnError) return kFALSE;
1130 reconstructor->Reconstruct(digitsTree, clustersTree);
1132 loader->UnloadDigits();
1135 // do QA in the event loop if requested
1137 AliQADataMaker * qadm = GetQADataMaker(iDet);
1139 AliCodeTimerStart(Form("running quality assurance data maker for %s", fgkDetectorName[iDet]));
1140 AliInfo(Form("running quality assurance data maker for %s", fgkDetectorName[iDet]));
1141 if (qadm->IsCycleDone() ) {
1142 qadm->EndOfCycle(AliQA::kRECPOINTS) ;
1143 qadm->EndOfCycle(AliQA::kESDS) ;
1144 qadm->StartOfCycle(AliQA::kRECPOINTS) ;
1145 qadm->StartOfCycle(AliQA::kESDS, "same") ;
1147 qadm->Exec(AliQA::kRECPOINTS, clustersTree) ;
1148 AliCodeTimerStop(Form("running quality assurance data maker for %s", fgkDetectorName[iDet]));
1152 loader->WriteRecPoints("OVERWRITE");
1153 loader->UnloadRecPoints();
1154 AliSysInfo::AddStamp(Form("LRec%s_%d",fgkDetectorName[iDet],eventNr), iDet,1,eventNr);
1157 if ((detStr.CompareTo("ALL") != 0) && !detStr.IsNull()) {
1158 AliError(Form("the following detectors were not found: %s",
1160 if (fStopOnError) return kFALSE;
1166 //_____________________________________________________________________________
1167 Bool_t AliReconstruction::RunVertexFinder(AliESDEvent*& esd)
1169 // run the barrel tracking
1171 AliCodeTimerAuto("")
1173 AliESDVertex* vertex = NULL;
1174 Double_t vtxPos[3] = {0, 0, 0};
1175 Double_t vtxErr[3] = {0.07, 0.07, 0.1};
1176 TArrayF mcVertex(3);
1177 if (fRunLoader->GetHeader() && fRunLoader->GetHeader()->GenEventHeader()) {
1178 fRunLoader->GetHeader()->GenEventHeader()->PrimaryVertex(mcVertex);
1179 for (Int_t i = 0; i < 3; i++) vtxPos[i] = mcVertex[i];
1183 if(fDiamondProfile) fVertexer->SetVtxStart(fDiamondProfile);
1184 AliInfo("running the ITS vertex finder");
1185 if (fLoader[0]) fLoader[0]->LoadRecPoints();
1186 vertex = fVertexer->FindVertexForCurrentEvent(fRunLoader->GetEventNumber());
1187 if (fLoader[0]) fLoader[0]->UnloadRecPoints();
1189 AliWarning("Vertex not found");
1190 vertex = new AliESDVertex();
1191 vertex->SetName("default");
1194 vertex->SetName("reconstructed");
1198 AliInfo("getting the primary vertex from MC");
1199 vertex = new AliESDVertex(vtxPos, vtxErr);
1203 vertex->GetXYZ(vtxPos);
1204 vertex->GetSigmaXYZ(vtxErr);
1206 AliWarning("no vertex reconstructed");
1207 vertex = new AliESDVertex(vtxPos, vtxErr);
1209 esd->SetVertex(vertex);
1210 // if SPD multiplicity has been determined, it is stored in the ESD
1211 AliMultiplicity *mult = fVertexer->GetMultiplicity();
1212 if(mult)esd->SetMultiplicity(mult);
1214 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
1215 if (fTracker[iDet]) fTracker[iDet]->SetVertex(vtxPos, vtxErr);
1222 //_____________________________________________________________________________
1223 Bool_t AliReconstruction::RunHLTTracking(AliESDEvent*& esd)
1225 // run the HLT barrel tracking
1227 AliCodeTimerAuto("")
1230 AliError("Missing runLoader!");
1234 AliInfo("running HLT tracking");
1236 // Get a pointer to the HLT reconstructor
1237 AliReconstructor *reconstructor = GetReconstructor(fgkNDetectors-1);
1238 if (!reconstructor) return kFALSE;
1241 for (Int_t iDet = 1; iDet >= 0; iDet--) {
1242 TString detName = fgkDetectorName[iDet];
1243 AliDebug(1, Form("%s HLT tracking", detName.Data()));
1244 reconstructor->SetOption(detName.Data());
1245 AliTracker *tracker = reconstructor->CreateTracker();
1247 AliWarning(Form("couldn't create a HLT tracker for %s", detName.Data()));
1248 if (fStopOnError) return kFALSE;
1252 Double_t vtxErr[3]={0.005,0.005,0.010};
1253 const AliESDVertex *vertex = esd->GetVertex();
1254 vertex->GetXYZ(vtxPos);
1255 tracker->SetVertex(vtxPos,vtxErr);
1257 fLoader[iDet]->LoadRecPoints("read");
1258 TTree* tree = fLoader[iDet]->TreeR();
1260 AliError(Form("Can't get the %s cluster tree", detName.Data()));
1263 tracker->LoadClusters(tree);
1265 if (tracker->Clusters2Tracks(esd) != 0) {
1266 AliError(Form("HLT %s Clusters2Tracks failed", fgkDetectorName[iDet]));
1270 tracker->UnloadClusters();
1278 //_____________________________________________________________________________
1279 Bool_t AliReconstruction::RunMuonTracking(AliESDEvent*& esd)
1281 // run the muon spectrometer tracking
1283 AliCodeTimerAuto("")
1286 AliError("Missing runLoader!");
1289 Int_t iDet = 7; // for MUON
1291 AliInfo("is running...");
1293 // Get a pointer to the MUON reconstructor
1294 AliReconstructor *reconstructor = GetReconstructor(iDet);
1295 if (!reconstructor) return kFALSE;
1298 TString detName = fgkDetectorName[iDet];
1299 AliDebug(1, Form("%s tracking", detName.Data()));
1300 AliTracker *tracker = reconstructor->CreateTracker();
1302 AliWarning(Form("couldn't create a tracker for %s", detName.Data()));
1307 fLoader[iDet]->LoadRecPoints("read");
1309 tracker->LoadClusters(fLoader[iDet]->TreeR());
1311 Int_t rv = tracker->Clusters2Tracks(esd);
1315 AliError(Form("%s Clusters2Tracks failed", fgkDetectorName[iDet]));
1319 fLoader[iDet]->UnloadRecPoints();
1321 tracker->UnloadClusters();
1329 //_____________________________________________________________________________
1330 Bool_t AliReconstruction::RunTracking(AliESDEvent*& esd)
1332 // run the barrel tracking
1333 static Int_t eventNr=0;
1334 AliCodeTimerAuto("")
1336 AliInfo("running tracking");
1338 //Fill the ESD with the T0 info (will be used by the TOF)
1339 if (fReconstructor[11] && fLoader[11]) {
1340 fLoader[11]->LoadRecPoints("READ");
1341 TTree *treeR = fLoader[11]->TreeR();
1342 GetReconstructor(11)->FillESD((TTree *)NULL,treeR,esd);
1345 // pass 1: TPC + ITS inwards
1346 for (Int_t iDet = 1; iDet >= 0; iDet--) {
1347 if (!fTracker[iDet]) continue;
1348 AliDebug(1, Form("%s tracking", fgkDetectorName[iDet]));
1351 fLoader[iDet]->LoadRecPoints("read");
1352 AliSysInfo::AddStamp(Form("RLoadCluster%s_%d",fgkDetectorName[iDet],eventNr),iDet,1, eventNr);
1353 TTree* tree = fLoader[iDet]->TreeR();
1355 AliError(Form("Can't get the %s cluster tree", fgkDetectorName[iDet]));
1358 fTracker[iDet]->LoadClusters(tree);
1359 AliSysInfo::AddStamp(Form("TLoadCluster%s_%d",fgkDetectorName[iDet],eventNr), iDet,2, eventNr);
1361 if (fTracker[iDet]->Clusters2Tracks(esd) != 0) {
1362 AliError(Form("%s Clusters2Tracks failed", fgkDetectorName[iDet]));
1365 if (fCheckPointLevel > 1) {
1366 WriteESD(esd, Form("%s.tracking", fgkDetectorName[iDet]));
1368 // preliminary PID in TPC needed by the ITS tracker
1370 GetReconstructor(1)->FillESD((TTree*)NULL, (TTree*)NULL, esd);
1371 AliESDpid::MakePID(esd);
1373 AliSysInfo::AddStamp(Form("Tracking0%s_%d",fgkDetectorName[iDet],eventNr), iDet,3,eventNr);
1376 // pass 2: ALL backwards
1377 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
1378 if (!fTracker[iDet]) continue;
1379 AliDebug(1, Form("%s back propagation", fgkDetectorName[iDet]));
1382 if (iDet > 1) { // all except ITS, TPC
1384 fLoader[iDet]->LoadRecPoints("read");
1385 AliSysInfo::AddStamp(Form("RLoadCluster0%s_%d",fgkDetectorName[iDet],eventNr), iDet,1, eventNr);
1386 tree = fLoader[iDet]->TreeR();
1388 AliError(Form("Can't get the %s cluster tree", fgkDetectorName[iDet]));
1391 fTracker[iDet]->LoadClusters(tree);
1392 AliSysInfo::AddStamp(Form("TLoadCluster0%s_%d",fgkDetectorName[iDet],eventNr), iDet,2, eventNr);
1396 if (fTracker[iDet]->PropagateBack(esd) != 0) {
1397 AliError(Form("%s backward propagation failed", fgkDetectorName[iDet]));
1400 if (fCheckPointLevel > 1) {
1401 WriteESD(esd, Form("%s.back", fgkDetectorName[iDet]));
1405 if (iDet > 2) { // all except ITS, TPC, TRD
1406 fTracker[iDet]->UnloadClusters();
1407 fLoader[iDet]->UnloadRecPoints();
1409 // updated PID in TPC needed by the ITS tracker -MI
1411 GetReconstructor(1)->FillESD((TTree*)NULL, (TTree*)NULL, esd);
1412 AliESDpid::MakePID(esd);
1414 AliSysInfo::AddStamp(Form("Tracking1%s_%d",fgkDetectorName[iDet],eventNr), iDet,3, eventNr);
1417 // write space-points to the ESD in case alignment data output
1419 if (fWriteAlignmentData)
1420 WriteAlignmentData(esd);
1422 // pass 3: TRD + TPC + ITS refit inwards
1423 for (Int_t iDet = 2; iDet >= 0; iDet--) {
1424 if (!fTracker[iDet]) continue;
1425 AliDebug(1, Form("%s inward refit", fgkDetectorName[iDet]));
1428 if (fTracker[iDet]->RefitInward(esd) != 0) {
1429 AliError(Form("%s inward refit failed", fgkDetectorName[iDet]));
1432 if (fCheckPointLevel > 1) {
1433 WriteESD(esd, Form("%s.refit", fgkDetectorName[iDet]));
1435 AliSysInfo::AddStamp(Form("Tracking2%s_%d",fgkDetectorName[iDet],eventNr), iDet,3, eventNr);
1437 fTracker[iDet]->UnloadClusters();
1438 AliSysInfo::AddStamp(Form("TUnloadCluster%s_%d",fgkDetectorName[iDet],eventNr), iDet,4, eventNr);
1439 fLoader[iDet]->UnloadRecPoints();
1440 AliSysInfo::AddStamp(Form("RUnloadCluster%s_%d",fgkDetectorName[iDet],eventNr), iDet,5, eventNr);
1443 // Propagate track to the vertex - if not done by ITS
1445 Int_t ntracks = esd->GetNumberOfTracks();
1446 for (Int_t itrack=0; itrack<ntracks; itrack++){
1447 const Double_t kRadius = 3; // beam pipe radius
1448 const Double_t kMaxStep = 5; // max step
1449 const Double_t kMaxD = 123456; // max distance to prim vertex
1450 Double_t fieldZ = AliTracker::GetBz(); //
1451 AliESDtrack * track = esd->GetTrack(itrack);
1452 if (!track) continue;
1453 if (track->IsOn(AliESDtrack::kITSrefit)) continue;
1454 AliTracker::PropagateTrackTo(track,kRadius,track->GetMass(),kMaxStep,kTRUE);
1455 track->RelateToVertex(esd->GetVertex(),fieldZ, kMaxD);
1461 //_____________________________________________________________________________
1462 Bool_t AliReconstruction::CleanESD(AliESDEvent *esd){
1464 // Remove the data which are not needed for the physics analysis.
1467 Int_t nTracks=esd->GetNumberOfTracks();
1468 Int_t nV0s=esd->GetNumberOfV0s();
1470 (Form("Number of ESD tracks and V0s before cleaning: %d %d",nTracks,nV0s));
1472 Float_t cleanPars[]={fV0DCAmax,fV0CsPmin,fDmax,fZmax};
1473 Bool_t rc=esd->Clean(cleanPars);
1475 nTracks=esd->GetNumberOfTracks();
1476 nV0s=esd->GetNumberOfV0s();
1478 (Form("Number of ESD tracks and V0s after cleaning %d",nTracks,nV0s));
1483 //_____________________________________________________________________________
1484 Bool_t AliReconstruction::FillESD(AliESDEvent*& esd, const TString& detectors)
1486 // fill the event summary data
1488 AliCodeTimerAuto("")
1489 static Int_t eventNr=0;
1490 TString detStr = detectors;
1492 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
1493 if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
1494 AliReconstructor* reconstructor = GetReconstructor(iDet);
1495 if (!reconstructor) continue;
1496 if (!ReadESD(esd, fgkDetectorName[iDet])) {
1497 AliDebug(1, Form("filling ESD for %s", fgkDetectorName[iDet]));
1498 TTree* clustersTree = NULL;
1499 if (fLoader[iDet]) {
1500 fLoader[iDet]->LoadRecPoints("read");
1501 clustersTree = fLoader[iDet]->TreeR();
1502 if (!clustersTree) {
1503 AliError(Form("Can't get the %s clusters tree",
1504 fgkDetectorName[iDet]));
1505 if (fStopOnError) return kFALSE;
1508 if (fRawReader && !reconstructor->HasDigitConversion()) {
1509 reconstructor->FillESD(fRawReader, clustersTree, esd);
1511 TTree* digitsTree = NULL;
1512 if (fLoader[iDet]) {
1513 fLoader[iDet]->LoadDigits("read");
1514 digitsTree = fLoader[iDet]->TreeD();
1516 AliError(Form("Can't get the %s digits tree",
1517 fgkDetectorName[iDet]));
1518 if (fStopOnError) return kFALSE;
1521 reconstructor->FillESD(digitsTree, clustersTree, esd);
1522 if (fLoader[iDet]) fLoader[iDet]->UnloadDigits();
1524 if (fLoader[iDet]) {
1525 fLoader[iDet]->UnloadRecPoints();
1528 if (fCheckPointLevel > 2) WriteESD(esd, fgkDetectorName[iDet]);
1532 if ((detStr.CompareTo("ALL") != 0) && !detStr.IsNull()) {
1533 AliError(Form("the following detectors were not found: %s",
1535 if (fStopOnError) return kFALSE;
1537 AliSysInfo::AddStamp(Form("FillESD%d",eventNr), 0,1, eventNr);
1542 //_____________________________________________________________________________
1543 Bool_t AliReconstruction::FillTriggerESD(AliESDEvent*& esd)
1545 // Reads the trigger decision which is
1546 // stored in Trigger.root file and fills
1547 // the corresponding esd entries
1549 AliCodeTimerAuto("")
1551 AliInfo("Filling trigger information into the ESD");
1554 AliCTPRawStream input(fRawReader);
1555 if (!input.Next()) {
1556 AliError("No valid CTP (trigger) DDL raw data is found ! The trigger information is not stored in the ESD !");
1559 esd->SetTriggerMask(input.GetClassMask());
1560 esd->SetTriggerCluster(input.GetClusterMask());
1563 AliRunLoader *runloader = AliRunLoader::GetRunLoader();
1565 if (!runloader->LoadTrigger()) {
1566 AliCentralTrigger *aCTP = runloader->GetTrigger();
1567 esd->SetTriggerMask(aCTP->GetClassMask());
1568 esd->SetTriggerCluster(aCTP->GetClusterMask());
1571 AliWarning("No trigger can be loaded! The trigger information is not stored in the ESD !");
1576 AliError("No run loader is available! The trigger information is not stored in the ESD !");
1588 //_____________________________________________________________________________
1589 Bool_t AliReconstruction::FillRawEventHeaderESD(AliESDEvent*& esd)
1592 // Filling information from RawReader Header
1595 AliInfo("Filling information from RawReader Header");
1596 esd->SetBunchCrossNumber(0);
1597 esd->SetOrbitNumber(0);
1598 esd->SetPeriodNumber(0);
1599 esd->SetTimeStamp(0);
1600 esd->SetEventType(0);
1601 const AliRawEventHeaderBase * eventHeader = fRawReader->GetEventHeader();
1604 const UInt_t *id = eventHeader->GetP("Id");
1605 esd->SetBunchCrossNumber((id)[1]&0x00000fff);
1606 esd->SetOrbitNumber((((id)[0]<<20)&0xf00000)|(((id)[1]>>12)&0xfffff));
1607 esd->SetPeriodNumber(((id)[0]>>4)&0x0fffffff);
1609 esd->SetTimeStamp((eventHeader->Get("Timestamp")));
1610 esd->SetEventType((eventHeader->Get("Type")));
1617 //_____________________________________________________________________________
1618 Bool_t AliReconstruction::IsSelected(TString detName, TString& detectors) const
1620 // check whether detName is contained in detectors
1621 // if yes, it is removed from detectors
1623 // check if all detectors are selected
1624 if ((detectors.CompareTo("ALL") == 0) ||
1625 detectors.BeginsWith("ALL ") ||
1626 detectors.EndsWith(" ALL") ||
1627 detectors.Contains(" ALL ")) {
1632 // search for the given detector
1633 Bool_t result = kFALSE;
1634 if ((detectors.CompareTo(detName) == 0) ||
1635 detectors.BeginsWith(detName+" ") ||
1636 detectors.EndsWith(" "+detName) ||
1637 detectors.Contains(" "+detName+" ")) {
1638 detectors.ReplaceAll(detName, "");
1642 // clean up the detectors string
1643 while (detectors.Contains(" ")) detectors.ReplaceAll(" ", " ");
1644 while (detectors.BeginsWith(" ")) detectors.Remove(0, 1);
1645 while (detectors.EndsWith(" ")) detectors.Remove(detectors.Length()-1, 1);
1650 //_____________________________________________________________________________
1651 Bool_t AliReconstruction::InitRunLoader()
1653 // get or create the run loader
1655 if (gAlice) delete gAlice;
1658 if (!gSystem->AccessPathName(fGAliceFileName.Data())) { // galice.root exists
1659 // load all base libraries to get the loader classes
1660 TString libs = gSystem->GetLibraries();
1661 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
1662 TString detName = fgkDetectorName[iDet];
1663 if (detName == "HLT") continue;
1664 if (libs.Contains("lib" + detName + "base.so")) continue;
1665 gSystem->Load("lib" + detName + "base.so");
1667 fRunLoader = AliRunLoader::Open(fGAliceFileName.Data());
1669 AliError(Form("no run loader found in file %s", fGAliceFileName.Data()));
1673 fRunLoader->CdGAFile();
1674 if (gFile->GetKey(AliRunLoader::GetGAliceName())) {
1675 if (fRunLoader->LoadgAlice() == 0) {
1676 gAlice = fRunLoader->GetAliRun();
1677 AliTracker::SetFieldMap(gAlice->Field(),fUniformField);
1680 if (!gAlice && !fRawReader) {
1681 AliError(Form("no gAlice object found in file %s",
1682 fGAliceFileName.Data()));
1687 //PH This is a temporary fix to give access to the kinematics
1688 //PH that is needed for the labels of ITS clusters
1689 fRunLoader->LoadHeader();
1690 fRunLoader->LoadKinematics();
1692 } else { // galice.root does not exist
1694 AliError(Form("the file %s does not exist", fGAliceFileName.Data()));
1698 fRunLoader = AliRunLoader::Open(fGAliceFileName.Data(),
1699 AliConfig::GetDefaultEventFolderName(),
1702 AliError(Form("could not create run loader in file %s",
1703 fGAliceFileName.Data()));
1707 fRunLoader->MakeTree("E");
1709 while (fRawReader->NextEvent()) {
1710 fRunLoader->SetEventNumber(iEvent);
1711 fRunLoader->GetHeader()->Reset(fRawReader->GetRunNumber(),
1713 fRunLoader->MakeTree("H");
1714 fRunLoader->TreeE()->Fill();
1717 fRawReader->RewindEvents();
1718 if (fNumberOfEventsPerFile > 0)
1719 fRunLoader->SetNumberOfEventsPerFile(fNumberOfEventsPerFile);
1721 fRunLoader->SetNumberOfEventsPerFile(iEvent);
1722 fRunLoader->WriteHeader("OVERWRITE");
1723 fRunLoader->CdGAFile();
1724 fRunLoader->Write(0, TObject::kOverwrite);
1725 // AliTracker::SetFieldMap(???);
1731 //_____________________________________________________________________________
1732 AliReconstructor* AliReconstruction::GetReconstructor(Int_t iDet)
1734 // get the reconstructor object and the loader for a detector
1736 if (fReconstructor[iDet]) return fReconstructor[iDet];
1738 // load the reconstructor object
1739 TPluginManager* pluginManager = gROOT->GetPluginManager();
1740 TString detName = fgkDetectorName[iDet];
1741 TString recName = "Ali" + detName + "Reconstructor";
1742 if (gAlice && !gAlice->GetDetector(detName) && (detName != "HLT")) return NULL;
1744 AliReconstructor* reconstructor = NULL;
1745 // first check if a plugin is defined for the reconstructor
1746 TPluginHandler* pluginHandler =
1747 pluginManager->FindHandler("AliReconstructor", detName);
1748 // if not, add a plugin for it
1749 if (!pluginHandler) {
1750 AliDebug(1, Form("defining plugin for %s", recName.Data()));
1751 TString libs = gSystem->GetLibraries();
1752 if (libs.Contains("lib" + detName + "base.so") ||
1753 (gSystem->Load("lib" + detName + "base.so") >= 0)) {
1754 pluginManager->AddHandler("AliReconstructor", detName,
1755 recName, detName + "rec", recName + "()");
1757 pluginManager->AddHandler("AliReconstructor", detName,
1758 recName, detName, recName + "()");
1760 pluginHandler = pluginManager->FindHandler("AliReconstructor", detName);
1762 if (pluginHandler && (pluginHandler->LoadPlugin() == 0)) {
1763 reconstructor = (AliReconstructor*) pluginHandler->ExecPlugin(0);
1765 if (reconstructor) {
1766 TObject* obj = fOptions.FindObject(detName.Data());
1767 if (obj) reconstructor->SetOption(obj->GetTitle());
1768 reconstructor->Init();
1769 fReconstructor[iDet] = reconstructor;
1772 // get or create the loader
1773 if (detName != "HLT") {
1774 fLoader[iDet] = fRunLoader->GetLoader(detName + "Loader");
1775 if (!fLoader[iDet]) {
1776 AliConfig::Instance()
1777 ->CreateDetectorFolders(fRunLoader->GetEventFolder(),
1779 // first check if a plugin is defined for the loader
1781 pluginManager->FindHandler("AliLoader", detName);
1782 // if not, add a plugin for it
1783 if (!pluginHandler) {
1784 TString loaderName = "Ali" + detName + "Loader";
1785 AliDebug(1, Form("defining plugin for %s", loaderName.Data()));
1786 pluginManager->AddHandler("AliLoader", detName,
1787 loaderName, detName + "base",
1788 loaderName + "(const char*, TFolder*)");
1789 pluginHandler = pluginManager->FindHandler("AliLoader", detName);
1791 if (pluginHandler && (pluginHandler->LoadPlugin() == 0)) {
1793 (AliLoader*) pluginHandler->ExecPlugin(2, detName.Data(),
1794 fRunLoader->GetEventFolder());
1796 if (!fLoader[iDet]) { // use default loader
1797 fLoader[iDet] = new AliLoader(detName, fRunLoader->GetEventFolder());
1799 if (!fLoader[iDet]) {
1800 AliWarning(Form("couldn't get loader for %s", detName.Data()));
1801 if (fStopOnError) return NULL;
1803 fRunLoader->AddLoader(fLoader[iDet]);
1804 fRunLoader->CdGAFile();
1805 if (gFile && !gFile->IsWritable()) gFile->ReOpen("UPDATE");
1806 fRunLoader->Write(0, TObject::kOverwrite);
1811 return reconstructor;
1814 //_____________________________________________________________________________
1815 Bool_t AliReconstruction::CreateVertexer()
1817 // create the vertexer
1820 AliReconstructor* itsReconstructor = GetReconstructor(0);
1821 if (itsReconstructor) {
1822 fVertexer = itsReconstructor->CreateVertexer();
1825 AliWarning("couldn't create a vertexer for ITS");
1826 if (fStopOnError) return kFALSE;
1832 //_____________________________________________________________________________
1833 Bool_t AliReconstruction::CreateTrackers(const TString& detectors)
1835 // create the trackers
1837 TString detStr = detectors;
1838 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
1839 if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
1840 AliReconstructor* reconstructor = GetReconstructor(iDet);
1841 if (!reconstructor) continue;
1842 TString detName = fgkDetectorName[iDet];
1843 if (detName == "HLT") {
1844 fRunHLTTracking = kTRUE;
1847 if (detName == "MUON") {
1848 fRunMuonTracking = kTRUE;
1853 fTracker[iDet] = reconstructor->CreateTracker();
1854 if (!fTracker[iDet] && (iDet < 7)) {
1855 AliWarning(Form("couldn't create a tracker for %s", detName.Data()));
1856 if (fStopOnError) return kFALSE;
1858 AliSysInfo::AddStamp(Form("LTracker%s",fgkDetectorName[iDet]), iDet,0);
1864 //_____________________________________________________________________________
1865 void AliReconstruction::CleanUp(TFile* file, TFile* fileOld)
1867 // delete trackers and the run loader and close and delete the file
1869 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
1870 delete fReconstructor[iDet];
1871 fReconstructor[iDet] = NULL;
1872 fLoader[iDet] = NULL;
1873 delete fTracker[iDet];
1874 fTracker[iDet] = NULL;
1875 // delete fQADataMaker[iDet];
1876 // fQADataMaker[iDet] = NULL;
1881 if(!(AliCDBManager::Instance()->GetCacheFlag())) {
1882 delete fDiamondProfile;
1883 fDiamondProfile = NULL;
1902 gSystem->Unlink("AliESDs.old.root");
1906 //_____________________________________________________________________________
1908 Bool_t AliReconstruction::ReadESD(AliESDEvent*& esd, const char* recStep) const
1910 // read the ESD event from a file
1912 if (!esd) return kFALSE;
1914 sprintf(fileName, "ESD_%d.%d_%s.root",
1915 esd->GetRunNumber(), esd->GetEventNumberInFile(), recStep);
1916 if (gSystem->AccessPathName(fileName)) return kFALSE;
1918 AliInfo(Form("reading ESD from file %s", fileName));
1919 AliDebug(1, Form("reading ESD from file %s", fileName));
1920 TFile* file = TFile::Open(fileName);
1921 if (!file || !file->IsOpen()) {
1922 AliError(Form("opening %s failed", fileName));
1929 esd = (AliESDEvent*) file->Get("ESD");
1938 //_____________________________________________________________________________
1939 void AliReconstruction::WriteESD(AliESDEvent* esd, const char* recStep) const
1941 // write the ESD event to a file
1945 sprintf(fileName, "ESD_%d.%d_%s.root",
1946 esd->GetRunNumber(), esd->GetEventNumberInFile(), recStep);
1948 AliDebug(1, Form("writing ESD to file %s", fileName));
1949 TFile* file = TFile::Open(fileName, "recreate");
1950 if (!file || !file->IsOpen()) {
1951 AliError(Form("opening %s failed", fileName));
1963 //_____________________________________________________________________________
1964 void AliReconstruction::ESDFile2AODFile(TFile* esdFile, TFile* aodFile)
1966 // write all files from the given esd file to an aod file
1968 // create an AliAOD object
1969 AliAODEvent *aod = new AliAODEvent();
1970 aod->CreateStdContent();
1976 TTree *aodTree = new TTree("aodTree", "AliAOD tree");
1977 aodTree->Branch(aod->GetList());
1980 TTree *t = (TTree*) esdFile->Get("esdTree");
1981 AliESDEvent *esd = new AliESDEvent();
1982 esd->ReadFromTree(t);
1984 Int_t nEvents = t->GetEntries();
1986 // set arrays and pointers
1996 // loop over events and fill them
1997 for (Int_t iEvent = 0; iEvent < nEvents; ++iEvent) {
1998 //cout << "event: " << iEvent << endl;
1999 t->GetEntry(iEvent);
2001 // Multiplicity information needed by the header (to be revised!)
2002 Int_t nTracks = esd->GetNumberOfTracks();
2003 Int_t nPosTracks = 0;
2004 for (Int_t iTrack=0; iTrack<nTracks; ++iTrack)
2005 if (esd->GetTrack(iTrack)->Charge()> 0) nPosTracks++;
2007 // Access the header
2008 AliAODHeader *header = aod->GetHeader();
2011 header->SetRunNumber (esd->GetRunNumber() );
2012 header->SetBunchCrossNumber(esd->GetBunchCrossNumber());
2013 header->SetOrbitNumber (esd->GetOrbitNumber() );
2014 header->SetPeriodNumber (esd->GetPeriodNumber() );
2015 header->SetTriggerMask (esd->GetTriggerMask() );
2016 header->SetTriggerCluster (esd->GetTriggerCluster() );
2017 header->SetEventType (esd->GetEventType() );
2018 header->SetMagneticField (esd->GetMagneticField() );
2019 header->SetZDCN1Energy (esd->GetZDCN1Energy() );
2020 header->SetZDCP1Energy (esd->GetZDCP1Energy() );
2021 header->SetZDCN2Energy (esd->GetZDCN2Energy() );
2022 header->SetZDCP2Energy (esd->GetZDCP2Energy() );
2023 header->SetZDCEMEnergy (esd->GetZDCEMEnergy(0),esd->GetZDCEMEnergy(1));
2024 header->SetRefMultiplicity (nTracks);
2025 header->SetRefMultiplicityPos(nPosTracks);
2026 header->SetRefMultiplicityNeg(nTracks - nPosTracks);
2027 header->SetMuonMagFieldScale(-999.); // FIXME
2028 header->SetCentrality(-999.); // FIXME
2030 Int_t nV0s = esd->GetNumberOfV0s();
2031 Int_t nCascades = esd->GetNumberOfCascades();
2032 Int_t nKinks = esd->GetNumberOfKinks();
2033 Int_t nVertices = nV0s + 2*nCascades /*could lead to two vertices, one V0 and the Xi */+ nKinks + 1 /* = prim. vtx*/;
2035 Int_t nCaloClus = esd->GetNumberOfCaloClusters();
2037 Int_t nPmdClus = esd->GetNumberOfPmdTracks();
2039 aod->ResetStd(nTracks, nVertices, nV0s+nCascades, nJets, nCaloClus, nFmdClus, nPmdClus);
2041 // Array to take into account the tracks already added to the AOD
2042 Bool_t * usedTrack = NULL;
2044 usedTrack = new Bool_t[nTracks];
2045 for (Int_t iTrack=0; iTrack<nTracks; ++iTrack) usedTrack[iTrack]=kFALSE;
2047 // Array to take into account the V0s already added to the AOD
2048 Bool_t * usedV0 = NULL;
2050 usedV0 = new Bool_t[nV0s];
2051 for (Int_t iV0=0; iV0<nV0s; ++iV0) usedV0[iV0]=kFALSE;
2053 // Array to take into account the kinks already added to the AOD
2054 Bool_t * usedKink = NULL;
2056 usedKink = new Bool_t[nKinks];
2057 for (Int_t iKink=0; iKink<nKinks; ++iKink) usedKink[iKink]=kFALSE;
2060 // Access to the AOD container of vertices
2061 TClonesArray &vertices = *(aod->GetVertices());
2064 // Access to the AOD container of tracks
2065 TClonesArray &tracks = *(aod->GetTracks());
2068 // Access to the AOD container of V0s
2069 TClonesArray &V0s = *(aod->GetV0s());
2072 // Add primary vertex. The primary tracks will be defined
2073 // after the loops on the composite objects (V0, cascades, kinks)
2074 const AliESDVertex *vtx = esd->GetPrimaryVertex();
2076 vtx->GetXYZ(pos); // position
2077 vtx->GetCovMatrix(covVtx); //covariance matrix
2079 AliAODVertex * primary = new(vertices[jVertices++])
2080 AliAODVertex(pos, covVtx, vtx->GetChi2toNDF(), NULL, -1, AliAODVertex::kPrimary);
2083 AliAODTrack *aodTrack = 0x0;
2085 // Create vertices starting from the most complex objects
2088 for (Int_t nCascade = 0; nCascade < nCascades; ++nCascade) {
2089 AliESDcascade *cascade = esd->GetCascade(nCascade);
2091 cascade->GetXYZ(pos[0], pos[1], pos[2]);
2092 cascade->GetPosCovXi(covVtx);
2094 // Add the cascade vertex
2095 AliAODVertex * vcascade = new(vertices[jVertices++]) AliAODVertex(pos,
2097 cascade->GetChi2Xi(), // = chi2/NDF since NDF = 2*2-3
2100 AliAODVertex::kCascade);
2102 primary->AddDaughter(vcascade); // the cascade 'particle' (represented by a vertex) is added as a daughter to the primary vertex
2104 // Add the V0 from the cascade. The ESD class have to be optimized...
2105 // Now we have to search for the corresponding V0 in the list of V0s
2106 // using the indeces of the positive and negative tracks
2108 Int_t posFromV0 = cascade->GetPindex();
2109 Int_t negFromV0 = cascade->GetNindex();
2112 AliESDv0 * v0 = 0x0;
2115 for (Int_t iV0=0; iV0<nV0s; ++iV0) {
2117 v0 = esd->GetV0(iV0);
2118 Int_t posV0 = v0->GetPindex();
2119 Int_t negV0 = v0->GetNindex();
2121 if (posV0==posFromV0 && negV0==negFromV0) {
2127 AliAODVertex * vV0FromCascade = 0x0;
2129 if (indV0>-1 && !usedV0[indV0]) {
2131 // the V0 exists in the array of V0s and is not used
2133 usedV0[indV0] = kTRUE;
2135 v0->GetXYZ(pos[0], pos[1], pos[2]);
2136 v0->GetPosCov(covVtx);
2138 vV0FromCascade = new(vertices[jVertices++]) AliAODVertex(pos,
2140 v0->GetChi2V0(), // = chi2/NDF since NDF = 2*2-3
2146 // the V0 doesn't exist in the array of V0s or was used
2147 cerr << "Error: event " << iEvent << " cascade " << nCascade
2148 << " The V0 " << indV0
2149 << " doesn't exist in the array of V0s or was used!" << endl;
2151 cascade->GetXYZ(pos[0], pos[1], pos[2]);
2152 cascade->GetPosCov(covVtx);
2154 vV0FromCascade = new(vertices[jVertices++]) AliAODVertex(pos,
2156 v0->GetChi2V0(), // = chi2/NDF since NDF = 2*2-3
2160 vcascade->AddDaughter(vV0FromCascade);
2164 // Add the positive tracks from the V0
2166 if (! usedTrack[posFromV0]) {
2168 usedTrack[posFromV0] = kTRUE;
2170 AliESDtrack *esdTrack = esd->GetTrack(posFromV0);
2171 esdTrack->GetPxPyPz(p_pos);
2172 esdTrack->GetXYZ(pos);
2173 esdTrack->GetCovarianceXYZPxPyPz(covTr);
2174 esdTrack->GetESDpid(pid);
2176 vV0FromCascade->AddDaughter(aodTrack =
2177 new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
2178 esdTrack->GetLabel(),
2184 (Short_t)esdTrack->Charge(),
2185 esdTrack->GetITSClusterMap(),
2188 kTRUE, // check if this is right
2189 kFALSE, // check if this is right
2190 AliAODTrack::kSecondary)
2192 aodTrack->ConvertAliPIDtoAODPID();
2195 cerr << "Error: event " << iEvent << " cascade " << nCascade
2196 << " track " << posFromV0 << " has already been used!" << endl;
2199 // Add the negative tracks from the V0
2201 if (!usedTrack[negFromV0]) {
2203 usedTrack[negFromV0] = kTRUE;
2205 AliESDtrack *esdTrack = esd->GetTrack(negFromV0);
2206 esdTrack->GetPxPyPz(p_neg);
2207 esdTrack->GetXYZ(pos);
2208 esdTrack->GetCovarianceXYZPxPyPz(covTr);
2209 esdTrack->GetESDpid(pid);
2211 vV0FromCascade->AddDaughter(aodTrack =
2212 new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
2213 esdTrack->GetLabel(),
2219 (Short_t)esdTrack->Charge(),
2220 esdTrack->GetITSClusterMap(),
2223 kTRUE, // check if this is right
2224 kFALSE, // check if this is right
2225 AliAODTrack::kSecondary)
2227 aodTrack->ConvertAliPIDtoAODPID();
2230 cerr << "Error: event " << iEvent << " cascade " << nCascade
2231 << " track " << negFromV0 << " has already been used!" << endl;
2234 // add it to the V0 array as well
2235 Double_t d0[2] = { -999., -99.};
2236 // counting is probably wrong
2237 new(V0s[jV0s++]) AliAODv0(vV0FromCascade, -999., -99., p_pos, p_neg, d0); // to be refined
2239 // Add the bachelor track from the cascade
2241 Int_t bachelor = cascade->GetBindex();
2243 if(!usedTrack[bachelor]) {
2245 usedTrack[bachelor] = kTRUE;
2247 AliESDtrack *esdTrack = esd->GetTrack(bachelor);
2248 esdTrack->GetPxPyPz(p);
2249 esdTrack->GetXYZ(pos);
2250 esdTrack->GetCovarianceXYZPxPyPz(covTr);
2251 esdTrack->GetESDpid(pid);
2253 vcascade->AddDaughter(aodTrack =
2254 new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
2255 esdTrack->GetLabel(),
2261 (Short_t)esdTrack->Charge(),
2262 esdTrack->GetITSClusterMap(),
2265 kTRUE, // check if this is right
2266 kFALSE, // check if this is right
2267 AliAODTrack::kSecondary)
2269 aodTrack->ConvertAliPIDtoAODPID();
2272 cerr << "Error: event " << iEvent << " cascade " << nCascade
2273 << " track " << bachelor << " has already been used!" << endl;
2276 // Add the primary track of the cascade (if any)
2278 } // end of the loop on cascades
2282 for (Int_t nV0 = 0; nV0 < nV0s; ++nV0) {
2284 if (usedV0[nV0]) continue; // skip if aready added to the AOD
2286 AliESDv0 *v0 = esd->GetV0(nV0);
2288 v0->GetXYZ(pos[0], pos[1], pos[2]);
2289 v0->GetPosCov(covVtx);
2291 AliAODVertex * vV0 =
2292 new(vertices[jVertices++]) AliAODVertex(pos,
2294 v0->GetChi2V0(), // = chi2/NDF since NDF = 2*2-3
2298 primary->AddDaughter(vV0);
2300 Int_t posFromV0 = v0->GetPindex();
2301 Int_t negFromV0 = v0->GetNindex();
2303 // Add the positive tracks from the V0
2305 if (!usedTrack[posFromV0]) {
2307 usedTrack[posFromV0] = kTRUE;
2309 AliESDtrack *esdTrack = esd->GetTrack(posFromV0);
2310 esdTrack->GetPxPyPz(p_pos);
2311 esdTrack->GetXYZ(pos);
2312 esdTrack->GetCovarianceXYZPxPyPz(covTr);
2313 esdTrack->GetESDpid(pid);
2315 vV0->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 << " V0 " << nV0
2335 << " track " << posFromV0 << " has already been used!" << endl;
2338 // Add the negative tracks from the V0
2340 if (!usedTrack[negFromV0]) {
2342 usedTrack[negFromV0] = kTRUE;
2344 AliESDtrack *esdTrack = esd->GetTrack(negFromV0);
2345 esdTrack->GetPxPyPz(p_neg);
2346 esdTrack->GetXYZ(pos);
2347 esdTrack->GetCovarianceXYZPxPyPz(covTr);
2348 esdTrack->GetESDpid(pid);
2350 vV0->AddDaughter(aodTrack =
2351 new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
2352 esdTrack->GetLabel(),
2358 (Short_t)esdTrack->Charge(),
2359 esdTrack->GetITSClusterMap(),
2362 kTRUE, // check if this is right
2363 kFALSE, // check if this is right
2364 AliAODTrack::kSecondary)
2366 aodTrack->ConvertAliPIDtoAODPID();
2369 cerr << "Error: event " << iEvent << " V0 " << nV0
2370 << " track " << negFromV0 << " has already been used!" << endl;
2373 // add it to the V0 array as well
2374 Double_t d0[2] = { 999., 99.};
2375 new(V0s[jV0s++]) AliAODv0(vV0, 999., 99., p_pos, p_neg, d0); // to be refined
2378 // end of the loop on V0s
2380 // Kinks: it is a big mess the access to the information in the kinks
2381 // The loop is on the tracks in order to find the mother and daugther of each kink
2384 for (Int_t iTrack=0; iTrack<nTracks; ++iTrack) {
2386 AliESDtrack * esdTrack = esd->GetTrack(iTrack);
2388 Int_t ikink = esdTrack->GetKinkIndex(0);
2391 // Negative kink index: mother, positive: daughter
2393 // Search for the second track of the kink
2395 for (Int_t jTrack = iTrack+1; jTrack<nTracks; ++jTrack) {
2397 AliESDtrack * esdTrack1 = esd->GetTrack(jTrack);
2399 Int_t jkink = esdTrack1->GetKinkIndex(0);
2401 if ( TMath::Abs(ikink)==TMath::Abs(jkink) ) {
2403 // The two tracks are from the same kink
2405 if (usedKink[TMath::Abs(ikink)-1]) continue; // skip used kinks
2408 Int_t idaughter = -1;
2410 if (ikink<0 && jkink>0) {
2415 else if (ikink>0 && jkink<0) {
2421 cerr << "Error: Wrong combination of kink indexes: "
2422 << ikink << " " << jkink << endl;
2426 // Add the mother track
2428 AliAODTrack * mother = NULL;
2430 if (!usedTrack[imother]) {
2432 usedTrack[imother] = kTRUE;
2434 AliESDtrack *esdTrack = esd->GetTrack(imother);
2435 esdTrack->GetPxPyPz(p);
2436 esdTrack->GetXYZ(pos);
2437 esdTrack->GetCovarianceXYZPxPyPz(covTr);
2438 esdTrack->GetESDpid(pid);
2441 new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
2442 esdTrack->GetLabel(),
2448 (Short_t)esdTrack->Charge(),
2449 esdTrack->GetITSClusterMap(),
2452 kTRUE, // check if this is right
2453 kTRUE, // check if this is right
2454 AliAODTrack::kPrimary);
2455 primary->AddDaughter(mother);
2456 mother->ConvertAliPIDtoAODPID();
2459 cerr << "Error: event " << iEvent << " kink " << TMath::Abs(ikink)-1
2460 << " track " << imother << " has already been used!" << endl;
2463 // Add the kink vertex
2464 AliESDkink * kink = esd->GetKink(TMath::Abs(ikink)-1);
2466 AliAODVertex * vkink =
2467 new(vertices[jVertices++]) AliAODVertex(kink->GetPosition(),
2471 esdTrack->GetID(), // This is the track ID of the mother's track!
2472 AliAODVertex::kKink);
2473 // Add the daughter track
2475 AliAODTrack * daughter = NULL;
2477 if (!usedTrack[idaughter]) {
2479 usedTrack[idaughter] = kTRUE;
2481 AliESDtrack *esdTrack = esd->GetTrack(idaughter);
2482 esdTrack->GetPxPyPz(p);
2483 esdTrack->GetXYZ(pos);
2484 esdTrack->GetCovarianceXYZPxPyPz(covTr);
2485 esdTrack->GetESDpid(pid);
2488 new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
2489 esdTrack->GetLabel(),
2495 (Short_t)esdTrack->Charge(),
2496 esdTrack->GetITSClusterMap(),
2499 kTRUE, // check if this is right
2500 kTRUE, // check if this is right
2501 AliAODTrack::kPrimary);
2502 vkink->AddDaughter(daughter);
2503 daughter->ConvertAliPIDtoAODPID();
2506 cerr << "Error: event " << iEvent << " kink " << TMath::Abs(ikink)-1
2507 << " track " << idaughter << " has already been used!" << endl;
2513 vertices.Expand(jVertices);
2515 // Tracks (primary and orphan)
2516 for (Int_t nTrack = 0; nTrack < nTracks; ++nTrack) {
2518 if (usedTrack[nTrack]) continue;
2520 AliESDtrack *esdTrack = esd->GetTrack(nTrack);
2521 esdTrack->GetPxPyPz(p);
2522 esdTrack->GetXYZ(pos);
2523 esdTrack->GetCovarianceXYZPxPyPz(covTr);
2524 esdTrack->GetESDpid(pid);
2526 Float_t impactXY, impactZ;
2528 esdTrack->GetImpactParameters(impactXY,impactZ);
2531 // track inside the beam pipe
2533 primary->AddDaughter(aodTrack =
2534 new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
2535 esdTrack->GetLabel(),
2541 (Short_t)esdTrack->Charge(),
2542 esdTrack->GetITSClusterMap(),
2545 kTRUE, // check if this is right
2546 kTRUE, // check if this is right
2547 AliAODTrack::kPrimary)
2549 aodTrack->ConvertAliPIDtoAODPID();
2552 // outside the beam pipe: orphan track
2553 // Don't write them anymore!
2556 } // end of loop on tracks
2559 Int_t nMuTracks = esd->GetNumberOfMuonTracks();
2560 for (Int_t nMuTrack = 0; nMuTrack < nMuTracks; ++nMuTrack) {
2562 AliESDMuonTrack *esdMuTrack = esd->GetMuonTrack(nMuTrack);
2563 p[0] = esdMuTrack->Px();
2564 p[1] = esdMuTrack->Py();
2565 p[2] = esdMuTrack->Pz();
2566 pos[0] = primary->GetX();
2567 pos[1] = primary->GetY();
2568 pos[2] = primary->GetZ();
2570 // has to be changed once the muon pid is provided by the ESD
2571 for (Int_t i = 0; i < 10; pid[i++] = 0.); pid[AliAODTrack::kMuon]=1.;
2573 primary->AddDaughter(aodTrack =
2574 new(tracks[jTracks++]) AliAODTrack(0, // no ID provided
2575 0, // no label provided
2580 NULL, // no covariance matrix provided
2581 esdMuTrack->Charge(),
2582 0, // ITSClusterMap is set below
2585 kFALSE, // muon tracks are not used to fit the primary vtx
2586 kFALSE, // not used for vertex fit
2587 AliAODTrack::kPrimary)
2590 aodTrack->SetHitsPatternInTrigCh(esdMuTrack->GetHitsPatternInTrigCh());
2591 Int_t track2Trigger = esdMuTrack->GetMatchTrigger();
2592 aodTrack->SetMatchTrigger(track2Trigger);
2594 aodTrack->SetChi2MatchTrigger(esdMuTrack->GetChi2MatchTrigger());
2596 aodTrack->SetChi2MatchTrigger(0.);
2598 tracks.Expand(jTracks); // remove 'empty slots' due to unwritten tracks
2600 // Access to the AOD container of PMD clusters
2601 TClonesArray &pmdClusters = *(aod->GetPmdClusters());
2602 Int_t jPmdClusters=0;
2604 for (Int_t iPmd = 0; iPmd < nPmdClus; ++iPmd) {
2605 // file pmd clusters, to be revised!
2606 AliESDPmdTrack *pmdTrack = esd->GetPmdTrack(iPmd);
2609 Double_t pos[3] = { pmdTrack->GetClusterX(), pmdTrack->GetClusterY(), pmdTrack->GetClusterZ() };
2610 Double_t pid[9] = { 0., 0., 0., 0., 0., 0., 0., 0., 0. }; // to be revised!
2612 // assoc cluster not set
2613 new(pmdClusters[jPmdClusters++]) AliAODPmdCluster(iPmd, nLabel, label, pmdTrack->GetClusterADC(), pos, pid);
2616 // Access to the AOD container of clusters
2617 TClonesArray &caloClusters = *(aod->GetCaloClusters());
2621 TArrayS EMCCellNumber(15000);
2622 TArrayD EMCCellAmplitude(15000);
2623 Int_t nEMCCells = 0;
2624 const Float_t fEMCAmpScale = 1./500;
2626 for (Int_t iClust=0; iClust<nCaloClus; ++iClust) {
2628 AliESDCaloCluster * cluster = esd->GetCaloCluster(iClust);
2630 Int_t id = cluster->GetID();
2633 Float_t energy = cluster->E();
2634 cluster->GetPosition(posF);
2635 Char_t ttype=AliAODCluster::kUndef;
2637 if (cluster->GetClusterType() == AliESDCaloCluster::kPHOSCluster) {
2638 ttype=AliAODCluster::kPHOSNeutral;
2640 else if (cluster->GetClusterType() == AliESDCaloCluster::kEMCALClusterv1) {
2641 ttype = AliAODCluster::kEMCALClusterv1;
2643 else if (cluster->GetClusterType() == AliESDCaloCluster::kEMCALPseudoCluster) {
2644 // Collect raw tower info
2645 for (Int_t iDig = 0; iDig < cluster->GetNumberOfDigits(); iDig++) {
2646 EMCCellNumber[nEMCCells] = cluster->GetDigitIndex()->At(iDig);
2647 EMCCellAmplitude[nEMCCells] = fEMCAmpScale*cluster->GetDigitAmplitude()->At(iDig);
2650 // don't write cluster data (it's just a pseudo cluster, holding the tower information)
2654 AliAODCaloCluster *caloCluster = new(caloClusters[jClusters++]) AliAODCaloCluster(id,
2662 caloCluster->SetCaloCluster(); // to be refined!
2665 caloClusters.Expand(jClusters); // resize TObjArray to 'remove' slots for pseudo clusters
2666 // end of loop on calo clusters
2668 // fill EMC cell info
2669 AliAODCaloCells &EMCCells = *(aod->GetEmcalCells());
2670 EMCCells.CreateContainer(nEMCCells);
2671 EMCCells.SetType(AliAODCaloCells::kEMCAL);
2672 for (Int_t iCell = 0; iCell < nEMCCells; iCell++) {
2673 EMCCells.SetCell(iCell,EMCCellNumber[iCell],EMCCellAmplitude[iCell]);
2678 AliAODTracklets &SPDTracklets = *(aod->GetTracklets());
2679 const AliMultiplicity *mult = esd->GetMultiplicity();
2681 if (mult->GetNumberOfTracklets()>0) {
2682 SPDTracklets.CreateContainer(mult->GetNumberOfTracklets());
2684 for (Int_t n=0; n<mult->GetNumberOfTracklets(); n++) {
2685 SPDTracklets.SetTracklet(n, mult->GetTheta(n), mult->GetPhi(n), mult->GetDeltaPhi(n), mult->GetLabel(n));
2689 Printf("ERROR: AliMultiplicity could not be retrieved from ESD");
2692 delete [] usedTrack;
2696 // fill the tree for this event
2698 } // end of event loop
2700 aodTree->GetUserInfo()->Add(aod);
2702 // write the tree to the specified file
2703 aodFile = aodTree->GetCurrentFile();
2710 void AliReconstruction::WriteAlignmentData(AliESDEvent* esd)
2712 // Write space-points which are then used in the alignment procedures
2713 // For the moment only ITS, TRD and TPC
2715 // Load TOF clusters
2717 fLoader[3]->LoadRecPoints("read");
2718 TTree* tree = fLoader[3]->TreeR();
2720 AliError(Form("Can't get the %s cluster tree", fgkDetectorName[3]));
2723 fTracker[3]->LoadClusters(tree);
2725 Int_t ntracks = esd->GetNumberOfTracks();
2726 for (Int_t itrack = 0; itrack < ntracks; itrack++)
2728 AliESDtrack *track = esd->GetTrack(itrack);
2731 for (Int_t iDet = 3; iDet >= 0; iDet--)
2732 nsp += track->GetNcls(iDet);
2734 AliTrackPointArray *sp = new AliTrackPointArray(nsp);
2735 track->SetTrackPointArray(sp);
2737 for (Int_t iDet = 3; iDet >= 0; iDet--) {
2738 AliTracker *tracker = fTracker[iDet];
2739 if (!tracker) continue;
2740 Int_t nspdet = track->GetNcls(iDet);
2741 if (nspdet <= 0) continue;
2742 track->GetClusters(iDet,idx);
2746 while (isp < nspdet) {
2748 if(IsSelected(fgkDetectorName[iDet],fUseTrackingErrorsForAlignment)) {
2749 isvalid = tracker->GetTrackPointTrackingError(idx[isp2],p,track);
2751 isvalid = tracker->GetTrackPoint(idx[isp2],p);
2754 const Int_t kNTPCmax = 159;
2755 if (iDet==1 && isp2>kNTPCmax) break; // to be fixed
2756 if (!isvalid) continue;
2757 sp->AddPoint(isptrack,&p); isptrack++; isp++;
2763 fTracker[3]->UnloadClusters();
2764 fLoader[3]->UnloadRecPoints();
2768 //_____________________________________________________________________________
2769 void AliReconstruction::FillRawDataErrorLog(Int_t iEvent, AliESDEvent* esd)
2771 // The method reads the raw-data error log
2772 // accumulated within the rawReader.
2773 // It extracts the raw-data errors related to
2774 // the current event and stores them into
2775 // a TClonesArray inside the esd object.
2777 if (!fRawReader) return;
2779 for(Int_t i = 0; i < fRawReader->GetNumberOfErrorLogs(); i++) {
2781 AliRawDataErrorLog *log = fRawReader->GetErrorLog(i);
2783 if (iEvent != log->GetEventNumber()) continue;
2785 esd->AddRawDataErrorLog(log);
2790 TNamed* AliReconstruction::CopyFileToTNamed(TString fPath,TString fName){
2791 // Dump a file content into a char in TNamed
2793 in.open(fPath.Data(),ios::in | ios::binary|ios::ate);
2794 Int_t kBytes = (Int_t)in.tellg();
2795 printf("Size: %d \n",kBytes);
2798 char* memblock = new char [kBytes];
2799 in.seekg (0, ios::beg);
2800 in.read (memblock, kBytes);
2802 TString fData(memblock,kBytes);
2803 fn = new TNamed(fName,fData);
2804 printf("fData Size: %d \n",fData.Sizeof());
2805 printf("fName Size: %d \n",fName.Sizeof());
2806 printf("fn Size: %d \n",fn->Sizeof());
2810 AliInfo(Form("Could not Open %s\n",fPath.Data()));
2816 void AliReconstruction::TNamedToFile(TTree* fTree, TString fName){
2817 // This is not really needed in AliReconstruction at the moment
2818 // but can serve as a template
2820 TList *fList = fTree->GetUserInfo();
2821 TNamed *fn = (TNamed*)fList->FindObject(fName.Data());
2822 printf("fn Size: %d \n",fn->Sizeof());
2824 TString fTmp(fn->GetName()); // to be 100% sure in principle fName also works
2825 const char* cdata = fn->GetTitle();
2826 printf("fTmp Size %d\n",fTmp.Sizeof());
2828 int size = fn->Sizeof()-fTmp.Sizeof()-sizeof(UChar_t)-sizeof(Int_t); // see dfinition of TString::SizeOf()...
2829 printf("calculated size %d\n",size);
2830 ofstream out(fName.Data(),ios::out | ios::binary);
2831 out.write(cdata,size);
2836 //_____________________________________________________________________________
2837 AliQADataMaker * AliReconstruction::GetQADataMaker(Int_t iDet)
2839 // get the quality assurance data maker object and the loader for a detector
2841 if (fQADataMaker[iDet])
2842 return fQADataMaker[iDet];
2844 // load the QA data maker object
2845 TPluginManager* pluginManager = gROOT->GetPluginManager();
2846 TString detName = fgkDetectorName[iDet];
2847 TString qadmName = "Ali" + detName + "QADataMaker";
2848 if (gAlice && !gAlice->GetDetector(detName) && (detName != "HLT"))
2851 AliQADataMaker * qadm = NULL;
2852 // first check if a plugin is defined for the quality assurance data maker
2853 TPluginHandler* pluginHandler = pluginManager->FindHandler("AliQADataMaker", detName);
2854 // if not, add a plugin for it
2855 if (!pluginHandler) {
2856 AliDebug(1, Form("defining plugin for %s", qadmName.Data()));
2857 TString libs = gSystem->GetLibraries();
2858 if (libs.Contains("lib" + detName + "base.so") ||
2859 (gSystem->Load("lib" + detName + "base.so") >= 0)) {
2860 pluginManager->AddHandler("AliQADataMaker", detName,
2861 qadmName, detName + "qadm", qadmName + "()");
2863 pluginManager->AddHandler("AliQADataMaker", detName,
2864 qadmName, detName, qadmName + "()");
2866 pluginHandler = pluginManager->FindHandler("AliQADataMaker", detName);
2868 if (pluginHandler && (pluginHandler->LoadPlugin() == 0)) {
2869 qadm = (AliQADataMaker *) pluginHandler->ExecPlugin(0);
2872 AliInfo(Form("Initializing quality assurance data maker for %s", fgkDetectorName[iDet]));
2873 qadm->Init(AliQA::kRECPOINTS, AliCDBManager::Instance()->GetRun(), GetQACycles(fgkDetectorName[iDet]));
2874 qadm->StartOfCycle(AliQA::kRECPOINTS);
2875 qadm->Init(AliQA::kESDS, AliCDBManager::Instance()->GetRun());
2876 qadm->StartOfCycle(AliQA::kESDS, "same") ;
2877 fQADataMaker[iDet] = qadm;
2883 //_____________________________________________________________________________
2884 Bool_t AliReconstruction::RunQA(const char* detectors, AliESDEvent *& esd)
2886 // run the Quality Assurance data producer
2888 AliCodeTimerAuto("")
2889 TString detStr = detectors;
2890 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
2891 if (!IsSelected(fgkDetectorName[iDet], detStr))
2893 AliQADataMaker * qadm = GetQADataMaker(iDet);
2896 AliCodeTimerStart(Form("running quality assurance data maker for %s", fgkDetectorName[iDet]));
2897 AliInfo(Form("running quality assurance data maker for %s", fgkDetectorName[iDet]));
2899 qadm->Exec(AliQA::kESDS, esd) ;
2902 AliCodeTimerStop(Form("running quality assurance data maker for %s", fgkDetectorName[iDet]));
2904 if ((detStr.CompareTo("ALL") != 0) && !detStr.IsNull()) {
2905 AliError(Form("the following detectors were not found: %s",
2915 //_____________________________________________________________________________
2916 void AliReconstruction::CheckQA()
2918 // check the QA of SIM for this run and remove the detectors
2919 // with status Fatal
2921 TString newRunLocalReconstruction ;
2922 TString newRunTracking ;
2923 TString newFillESD ;
2925 for (Int_t iDet = 0; iDet < AliQA::kNDET; iDet++) {
2926 TString detName(AliQA::GetDetName(iDet)) ;
2927 AliQA * qa = AliQA::Instance(AliQA::DETECTORINDEX(iDet)) ;
2928 if ( qa->IsSet(AliQA::DETECTORINDEX(iDet), AliQA::kSIM, AliQA::kFATAL)) {
2929 AliInfo(Form("QA status for %s in Hits and/or SDIGITS and/or Digits was Fatal; No reconstruction performed", detName.Data())) ;
2931 if ( fRunLocalReconstruction.Contains(AliQA::GetDetName(iDet)) ||
2932 fRunLocalReconstruction.Contains("ALL") ) {
2933 newRunLocalReconstruction += detName ;
2934 newRunLocalReconstruction += " " ;
2936 if ( fRunTracking.Contains(AliQA::GetDetName(iDet)) ||
2937 fRunTracking.Contains("ALL") ) {
2938 newRunTracking += detName ;
2939 newRunTracking += " " ;
2941 if ( fFillESD.Contains(AliQA::GetDetName(iDet)) ||
2942 fFillESD.Contains("ALL") ) {
2943 newFillESD += detName ;
2948 fRunLocalReconstruction = newRunLocalReconstruction ;
2949 fRunTracking = newRunTracking ;
2950 fFillESD = newFillESD ;
2953 //_____________________________________________________________________________
2954 Int_t AliReconstruction::GetDetIndex(const char* detector)
2956 // return the detector index corresponding to detector
2958 for (index = 0; index < fgkNDetectors ; index++) {
2959 if ( strcmp(detector, fgkDetectorName[index]) == 0 )