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 ///////////////////////////////////////////////////////////////////////////////
121 #include <TPluginManager.h>
122 #include <TGeoManager.h>
123 #include <TLorentzVector.h>
125 #include "AliReconstruction.h"
126 #include "AliCodeTimer.h"
127 #include "AliReconstructor.h"
129 #include "AliRunLoader.h"
131 #include "AliRawReaderFile.h"
132 #include "AliRawReaderDate.h"
133 #include "AliRawReaderRoot.h"
134 #include "AliRawEventHeaderBase.h"
135 #include "AliESDEvent.h"
136 #include "AliESDMuonTrack.h"
137 #include "AliESDfriend.h"
138 #include "AliESDVertex.h"
139 #include "AliESDcascade.h"
140 #include "AliESDkink.h"
141 #include "AliESDtrack.h"
142 #include "AliESDCaloCluster.h"
143 #include "AliMultiplicity.h"
144 #include "AliTracker.h"
145 #include "AliVertexer.h"
146 #include "AliVertexerTracks.h"
147 #include "AliV0vertexer.h"
148 #include "AliCascadeVertexer.h"
149 #include "AliHeader.h"
150 #include "AliGenEventHeader.h"
152 #include "AliESDpid.h"
153 #include "AliESDtrack.h"
155 #include "AliESDTagCreator.h"
156 #include "AliAODTagCreator.h"
158 #include "AliGeomManager.h"
159 #include "AliTrackPointArray.h"
160 #include "AliCDBManager.h"
161 #include "AliCDBEntry.h"
162 #include "AliAlignObj.h"
164 #include "AliCentralTrigger.h"
165 #include "AliCTPRawStream.h"
167 #include "AliAODEvent.h"
168 #include "AliAODHeader.h"
169 #include "AliAODTrack.h"
170 #include "AliAODVertex.h"
171 #include "AliAODCluster.h"
173 #include "AliQualAssDataMaker.h"
175 ClassImp(AliReconstruction)
178 //_____________________________________________________________________________
179 const char* AliReconstruction::fgkDetectorName[AliReconstruction::fgkNDetectors] = {"ITS", "TPC", "TRD", "TOF", "PHOS", "HMPID", "EMCAL", "MUON", "FMD", "ZDC", "PMD", "T0", "VZERO", "ACORDE", "HLT"};
181 //_____________________________________________________________________________
182 AliReconstruction::AliReconstruction(const char* gAliceFilename, const char* cdbUri,
183 const char* name, const char* title) :
186 fUniformField(kTRUE),
187 fRunVertexFinder(kTRUE),
188 fRunHLTTracking(kFALSE),
189 fRunMuonTracking(kFALSE),
190 fStopOnError(kFALSE),
191 fWriteAlignmentData(kFALSE),
193 fWriteESDfriend(kFALSE),
195 fFillTriggerESD(kTRUE),
197 fRunLocalReconstruction("ALL"),
200 fGAliceFileName(gAliceFilename),
205 fNumberOfEventsPerFile(1),
208 fLoadAlignFromCDB(kTRUE),
209 fLoadAlignData("ALL"),
216 fDiamondProfile(NULL),
218 fAlignObjArray(NULL),
223 // create reconstruction object with default parameters
225 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
226 fReconstructor[iDet] = NULL;
227 fLoader[iDet] = NULL;
228 fTracker[iDet] = NULL;
229 fQualAssDataMaker[iDet] = NULL;
234 //_____________________________________________________________________________
235 AliReconstruction::AliReconstruction(const AliReconstruction& rec) :
238 fUniformField(rec.fUniformField),
239 fRunVertexFinder(rec.fRunVertexFinder),
240 fRunHLTTracking(rec.fRunHLTTracking),
241 fRunMuonTracking(rec.fRunMuonTracking),
242 fStopOnError(rec.fStopOnError),
243 fWriteAlignmentData(rec.fWriteAlignmentData),
244 fCleanESD(rec.fCleanESD),
245 fWriteESDfriend(rec.fWriteESDfriend),
246 fWriteAOD(rec.fWriteAOD),
247 fFillTriggerESD(rec.fFillTriggerESD),
249 fRunLocalReconstruction(rec.fRunLocalReconstruction),
250 fRunTracking(rec.fRunTracking),
251 fFillESD(rec.fFillESD),
252 fGAliceFileName(rec.fGAliceFileName),
254 fEquipIdMap(rec.fEquipIdMap),
255 fFirstEvent(rec.fFirstEvent),
256 fLastEvent(rec.fLastEvent),
257 fNumberOfEventsPerFile(rec.fNumberOfEventsPerFile),
260 fLoadAlignFromCDB(rec.fLoadAlignFromCDB),
261 fLoadAlignData(rec.fLoadAlignData),
262 fESDPar(rec.fESDPar),
268 fDiamondProfile(NULL),
270 fAlignObjArray(rec.fAlignObjArray),
271 fCDBUri(rec.fCDBUri),
272 fRemoteCDBUri(rec.fRemoteCDBUri),
277 for (Int_t i = 0; i < rec.fOptions.GetEntriesFast(); i++) {
278 if (rec.fOptions[i]) fOptions.Add(rec.fOptions[i]->Clone());
280 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
281 fReconstructor[iDet] = NULL;
282 fLoader[iDet] = NULL;
283 fTracker[iDet] = NULL;
284 fQualAssDataMaker[iDet] = NULL;
286 for (Int_t i = 0; i < rec.fSpecCDBUri.GetEntriesFast(); i++) {
287 if (rec.fSpecCDBUri[i]) fSpecCDBUri.Add(rec.fSpecCDBUri[i]->Clone());
291 //_____________________________________________________________________________
292 AliReconstruction& AliReconstruction::operator = (const AliReconstruction& rec)
294 // assignment operator
296 this->~AliReconstruction();
297 new(this) AliReconstruction(rec);
301 //_____________________________________________________________________________
302 AliReconstruction::~AliReconstruction()
308 fSpecCDBUri.Delete();
310 AliCodeTimer::Instance()->Print();
313 //_____________________________________________________________________________
314 void AliReconstruction::InitCDBStorage()
316 // activate a default CDB storage
317 // First check if we have any CDB storage set, because it is used
318 // to retrieve the calibration and alignment constants
320 AliCDBManager* man = AliCDBManager::Instance();
321 if (man->IsDefaultStorageSet())
323 AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
324 AliWarning("Default CDB storage has been already set !");
325 AliWarning(Form("Ignoring the default storage declared in AliReconstruction: %s",fCDBUri.Data()));
326 AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
330 AliDebug(2, "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
331 AliDebug(2, Form("Default CDB storage is set to: %s",fCDBUri.Data()));
332 AliDebug(2, "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
333 man->SetDefaultStorage(fCDBUri);
336 // Remote storage (the Grid storage) is used if it is activated
337 // and if the object is not found in the default storage
338 if (man->IsRemoteStorageSet())
340 AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
341 AliWarning("Remote CDB storage has been already set !");
342 AliWarning(Form("Ignoring the remote storage declared in AliReconstruction: %s",fRemoteCDBUri.Data()));
343 AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
347 AliDebug(2,"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
348 AliDebug(2, Form("Remote CDB storage is set to: %s",fRemoteCDBUri.Data()));
349 AliDebug(2, "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
350 man->SetRemoteStorage(fRemoteCDBUri);
353 // Now activate the detector specific CDB storage locations
354 for (Int_t i = 0; i < fSpecCDBUri.GetEntriesFast(); i++) {
355 TObject* obj = fSpecCDBUri[i];
357 AliDebug(2, "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
358 AliDebug(2, Form("Specific CDB storage for %s is set to: %s",obj->GetName(),obj->GetTitle()));
359 AliDebug(2, "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
360 man->SetSpecificStorage(obj->GetName(), obj->GetTitle());
365 //_____________________________________________________________________________
366 void AliReconstruction::SetDefaultStorage(const char* uri) {
367 // Store the desired default CDB storage location
368 // Activate it later within the Run() method
374 //_____________________________________________________________________________
375 void AliReconstruction::SetRemoteStorage(const char* uri) {
376 // Store the desired remote CDB storage location
377 // Activate it later within the Run() method
378 // Remote storage (the Grid storage) is used if it is activated
379 // and if the object is not found in the default storage
385 //_____________________________________________________________________________
386 void AliReconstruction::SetSpecificStorage(const char* calibType, const char* uri) {
387 // Store a detector-specific CDB storage location
388 // Activate it later within the Run() method
390 AliCDBPath aPath(calibType);
391 if(!aPath.IsValid()){
392 // if calibType is not wildcard but it is a valid detector, add "/*" to make it a valid path
393 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
394 if(!strcmp(calibType, fgkDetectorName[iDet])) {
395 aPath.SetPath(Form("%s/*", calibType));
396 AliInfo(Form("Path for specific storage set to %s", aPath.GetPath().Data()));
400 if(!aPath.IsValid()){
401 AliError(Form("Not a valid path or detector: %s", calibType));
406 // // check that calibType refers to a "valid" detector name
407 // Bool_t isDetector = kFALSE;
408 // for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
409 // TString detName = fgkDetectorName[iDet];
410 // if(aPath.GetLevel0() == detName) {
411 // isDetector = kTRUE;
417 // AliError(Form("Not a valid detector: %s", aPath.GetLevel0().Data()));
421 TObject* obj = fSpecCDBUri.FindObject(aPath.GetPath().Data());
422 if (obj) fSpecCDBUri.Remove(obj);
423 fSpecCDBUri.Add(new TNamed(aPath.GetPath().Data(), uri));
430 //_____________________________________________________________________________
431 Bool_t AliReconstruction::SetRunNumber()
433 // The method is called in Run() in order
434 // to set a correct run number.
435 // In case of raw data reconstruction the
436 // run number is taken from the raw data header
438 if(AliCDBManager::Instance()->GetRun() < 0) {
440 AliError("No run loader is found !");
443 // read run number from gAlice
444 if(fRunLoader->GetAliRun())
445 AliCDBManager::Instance()->SetRun(fRunLoader->GetAliRun()->GetRunNumber());
448 if(fRawReader->NextEvent()) {
449 AliCDBManager::Instance()->SetRun(fRawReader->GetRunNumber());
450 fRawReader->RewindEvents();
453 AliError("No raw-data events found !");
458 AliError("Neither gAlice nor RawReader objects are found !");
462 AliInfo(Form("CDB Run number: %d",AliCDBManager::Instance()->GetRun()));
467 //_____________________________________________________________________________
468 Bool_t AliReconstruction::MisalignGeometry(const TString& detectors)
470 // Read the alignment objects from CDB.
471 // Each detector is supposed to have the
472 // alignment objects in DET/Align/Data CDB path.
473 // All the detector objects are then collected,
474 // sorted by geometry level (starting from ALIC) and
475 // then applied to the TGeo geometry.
476 // Finally an overlaps check is performed.
478 // Load alignment data from CDB and fill fAlignObjArray
479 if(fLoadAlignFromCDB){
481 TString detStr = detectors;
482 TString loadAlObjsListOfDets = "";
484 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
485 if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
486 loadAlObjsListOfDets += fgkDetectorName[iDet];
487 loadAlObjsListOfDets += " ";
488 } // end loop over detectors
489 loadAlObjsListOfDets.Prepend("GRP "); //add alignment objects for non-sensitive modules
490 AliGeomManager::ApplyAlignObjsFromCDB(loadAlObjsListOfDets.Data());
492 // Check if the array with alignment objects was
493 // provided by the user. If yes, apply the objects
494 // to the present TGeo geometry
495 if (fAlignObjArray) {
496 if (gGeoManager && gGeoManager->IsClosed()) {
497 if (AliGeomManager::ApplyAlignObjsToGeom(*fAlignObjArray) == kFALSE) {
498 AliError("The misalignment of one or more volumes failed!"
499 "Compare the list of simulated detectors and the list of detector alignment data!");
504 AliError("Can't apply the misalignment! gGeoManager doesn't exist or it is still opened!");
510 delete fAlignObjArray; fAlignObjArray=0;
515 //_____________________________________________________________________________
516 void AliReconstruction::SetGAliceFile(const char* fileName)
518 // set the name of the galice file
520 fGAliceFileName = fileName;
523 //_____________________________________________________________________________
524 void AliReconstruction::SetOption(const char* detector, const char* option)
526 // set options for the reconstruction of a detector
528 TObject* obj = fOptions.FindObject(detector);
529 if (obj) fOptions.Remove(obj);
530 fOptions.Add(new TNamed(detector, option));
534 //_____________________________________________________________________________
535 Bool_t AliReconstruction::Run(const char* input)
537 // run the reconstruction
542 if (!input) input = fInput.Data();
543 TString fileName(input);
544 if (fileName.EndsWith("/")) {
545 fRawReader = new AliRawReaderFile(fileName);
546 } else if (fileName.EndsWith(".root")) {
547 fRawReader = new AliRawReaderRoot(fileName);
548 } else if (!fileName.IsNull()) {
549 fRawReader = new AliRawReaderDate(fileName);
550 fRawReader->SelectEvents(7);
552 if (!fEquipIdMap.IsNull() && fRawReader)
553 fRawReader->LoadEquipmentIdsMap(fEquipIdMap);
556 // get the run loader
557 if (!InitRunLoader()) return kFALSE;
559 // Initialize the CDB storage
562 // Set run number in CDBManager (if it is not already set by the user)
563 if (!SetRunNumber()) if (fStopOnError) return kFALSE;
565 // Import ideal TGeo geometry and apply misalignment
567 TString geom(gSystem->DirName(fGAliceFileName));
568 geom += "/geometry.root";
569 AliGeomManager::LoadGeometry(geom.Data());
570 if (!gGeoManager) if (fStopOnError) return kFALSE;
573 AliCDBManager* man = AliCDBManager::Instance();
574 if (!MisalignGeometry(fLoadAlignData)) if (fStopOnError) return kFALSE;
576 // local reconstruction
577 if (!fRunLocalReconstruction.IsNull()) {
578 if (!RunLocalReconstruction(fRunLocalReconstruction)) {
579 if (fStopOnError) {CleanUp(); return kFALSE;}
582 // if (!fRunVertexFinder && fRunTracking.IsNull() &&
583 // fFillESD.IsNull()) return kTRUE;
586 if (fRunVertexFinder && !CreateVertexer()) {
594 if (!fRunTracking.IsNull() && !CreateTrackers(fRunTracking)) {
601 // get the possibly already existing ESD file and tree
602 AliESDEvent* esd = new AliESDEvent(); AliESDEvent* hltesd = new AliESDEvent();
603 TFile* fileOld = NULL;
604 TTree* treeOld = NULL; TTree *hlttreeOld = NULL;
605 if (!gSystem->AccessPathName("AliESDs.root")){
606 gSystem->CopyFile("AliESDs.root", "AliESDs.old.root", kTRUE);
607 fileOld = TFile::Open("AliESDs.old.root");
608 if (fileOld && fileOld->IsOpen()) {
609 treeOld = (TTree*) fileOld->Get("esdTree");
610 if (treeOld)esd->ReadFromTree(treeOld);
611 hlttreeOld = (TTree*) fileOld->Get("HLTesdTree");
612 if (hlttreeOld) hltesd->ReadFromTree(hlttreeOld);
616 // create the ESD output file and tree
617 TFile* file = TFile::Open("AliESDs.root", "RECREATE");
618 file->SetCompressionLevel(2);
619 if (!file->IsOpen()) {
620 AliError("opening AliESDs.root failed");
621 if (fStopOnError) {CleanUp(file, fileOld); return kFALSE;}
624 TTree* tree = new TTree("esdTree", "Tree with ESD objects");
625 esd = new AliESDEvent();
626 esd->CreateStdContent();
627 esd->WriteToTree(tree);
629 TTree* hlttree = new TTree("HLTesdTree", "Tree with HLT ESD objects");
630 hltesd = new AliESDEvent();
631 hltesd->CreateStdContent();
632 hltesd->WriteToTree(hlttree);
635 delete esd; delete hltesd;
636 esd = NULL; hltesd = NULL;
638 // create the branch with ESD additions
642 AliESDfriend *esdf = 0;
643 if (fWriteESDfriend) {
644 esdf = new AliESDfriend();
645 TBranch *br=tree->Branch("ESDfriend.","AliESDfriend", &esdf);
646 br->SetFile("AliESDfriends.root");
647 esd->AddObject(esdf);
651 // Get the diamond profile from OCDB
652 AliCDBEntry* entry = AliCDBManager::Instance()
653 ->Get("GRP/Calib/MeanVertex");
656 fDiamondProfile = dynamic_cast<AliESDVertex*> (entry->GetObject());
658 AliError("No diamond profile found in OCDB!");
661 AliVertexerTracks tVertexer(AliTracker::GetBz());
662 if(fDiamondProfile) tVertexer.SetVtxStart(fDiamondProfile);
666 if (fRawReader) fRawReader->RewindEvents();
667 TString detStr(fFillESD) ;
669 // initialises quality assurance for ESDs
670 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
671 if (!IsSelected(fgkDetectorName[iDet], detStr))
673 AliQualAssDataMaker * qadm = GetQualAssDataMaker(iDet);
676 qadm->Init(AliQualAss::kESDS) ;
680 gSystem->GetProcInfo(&ProcInfo);
681 AliInfo(Form("Current memory usage %d %d", ProcInfo.fMemResident, ProcInfo.fMemVirtual));
682 for (Int_t iEvent = 0; iEvent < fRunLoader->GetNumberOfEvents(); iEvent++) {
683 if (fRawReader) fRawReader->NextEvent();
684 if ((iEvent < fFirstEvent) || ((fLastEvent >= 0) && (iEvent > fLastEvent))) {
685 // copy old ESD to the new one
687 esd->ReadFromTree(treeOld);
688 treeOld->GetEntry(iEvent);
692 esd->ReadFromTree(hlttreeOld);
693 hlttreeOld->GetEntry(iEvent);
699 AliInfo(Form("processing event %d", iEvent));
700 fRunLoader->GetEvent(iEvent);
703 sprintf(aFileName, "ESD_%d.%d_final.root",
704 fRunLoader->GetHeader()->GetRun(),
705 fRunLoader->GetHeader()->GetEventNrInRun());
706 if (!gSystem->AccessPathName(aFileName)) continue;
708 // local reconstruction
709 if (!fRunLocalReconstruction.IsNull()) {
710 if (!RunLocalEventReconstruction(fRunLocalReconstruction)) {
711 if (fStopOnError) {CleanUp(file, fileOld); return kFALSE;}
716 esd->SetRunNumber(fRunLoader->GetHeader()->GetRun());
717 hltesd->SetRunNumber(fRunLoader->GetHeader()->GetRun());
718 esd->SetEventNumberInFile(fRunLoader->GetHeader()->GetEventNrInRun());
719 hltesd->SetEventNumberInFile(fRunLoader->GetHeader()->GetEventNrInRun());
721 // Set magnetic field from the tracker
722 esd->SetMagneticField(AliTracker::GetBz());
723 hltesd->SetMagneticField(AliTracker::GetBz());
727 // Fill raw-data error log into the ESD
728 if (fRawReader) FillRawDataErrorLog(iEvent,esd);
731 if (fRunVertexFinder) {
732 if (!ReadESD(esd, "vertex")) {
733 if (!RunVertexFinder(esd)) {
734 if (fStopOnError) {CleanUp(file, fileOld); return kFALSE;}
736 if (fCheckPointLevel > 0) WriteESD(esd, "vertex");
741 if (!fRunTracking.IsNull()) {
742 if (fRunHLTTracking) {
743 hltesd->SetVertex(esd->GetVertex());
744 if (!RunHLTTracking(hltesd)) {
745 if (fStopOnError) {CleanUp(file, fileOld); return kFALSE;}
751 if (!fRunTracking.IsNull()) {
752 if (fRunMuonTracking) {
753 if (!RunMuonTracking(esd)) {
754 if (fStopOnError) {CleanUp(file, fileOld); return kFALSE;}
760 if (!fRunTracking.IsNull()) {
761 if (!ReadESD(esd, "tracking")) {
762 if (!RunTracking(esd)) {
763 if (fStopOnError) {CleanUp(file, fileOld); return kFALSE;}
765 if (fCheckPointLevel > 0) WriteESD(esd, "tracking");
770 if (!fFillESD.IsNull()) {
771 if (!FillESD(esd, fFillESD)) {
772 if (fStopOnError) {CleanUp(file, fileOld); return kFALSE;}
776 if (!fFillESD.IsNull())
777 RunQualAss(fFillESD.Data(), esd);
779 // fill Event header information from the RawEventHeader
780 if (fRawReader){FillRawEventHeaderESD(esd);}
783 AliESDpid::MakePID(esd);
784 if (fCheckPointLevel > 1) WriteESD(esd, "PID");
786 if (fFillTriggerESD) {
787 if (!ReadESD(esd, "trigger")) {
788 if (!FillTriggerESD(esd)) {
789 if (fStopOnError) {CleanUp(file, fileOld); return kFALSE;}
791 if (fCheckPointLevel > 1) WriteESD(esd, "trigger");
795 //Try to improve the reconstructed primary vertex position using the tracks
796 AliESDVertex *pvtx=0;
797 Bool_t dovertex=kTRUE;
798 TObject* obj = fOptions.FindObject("ITS");
800 TString optITS = obj->GetTitle();
801 if (optITS.Contains("cosmics") || optITS.Contains("COSMICS"))
804 if(dovertex) pvtx=tVertexer.FindPrimaryVertex(esd);
805 if(fDiamondProfile) esd->SetDiamond(fDiamondProfile);
808 if (pvtx->GetStatus()) {
809 // Store the improved primary vertex
810 esd->SetPrimaryVertex(pvtx);
811 // Propagate the tracks to the DCA to the improved primary vertex
812 Double_t somethingbig = 777.;
813 Double_t bz = esd->GetMagneticField();
814 Int_t nt=esd->GetNumberOfTracks();
816 AliESDtrack *t = esd->GetTrack(nt);
817 t->RelateToVertex(pvtx, bz, somethingbig);
824 vtxer.Tracks2V0vertices(esd);
827 AliCascadeVertexer cvtxer;
828 cvtxer.V0sTracks2CascadeVertices(esd);
832 if (fCleanESD) CleanESD(esd);
833 if (fWriteESDfriend) {
834 new (esdf) AliESDfriend(); // Reset...
835 esd->GetESDfriend(esdf);
842 if (fCheckPointLevel > 0) WriteESD(esd, "final");
845 if (fWriteESDfriend) {
846 new (esdf) AliESDfriend(); // Reset...
849 // delete esdf; esdf = 0;
852 gSystem->GetProcInfo(&ProcInfo);
853 AliInfo(Form("Event %d -> Current memory usage %d %d",iEvent, ProcInfo.fMemResident, ProcInfo.fMemVirtual));
857 // write quality assurance ESDs data (one entry for all events)
858 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
859 if (!IsSelected(fgkDetectorName[iDet], detStr))
861 AliQualAssDataMaker * qadm = GetQualAssDataMaker(iDet);
864 qadm->Finish(AliQualAss::kESDS) ;
867 tree->GetUserInfo()->Add(esd);
868 hlttree->GetUserInfo()->Add(hltesd);
872 if(fESDPar.Contains("ESD.par")){
873 AliInfo("Attaching ESD.par to Tree");
874 TNamed *fn = CopyFileToTNamed(fESDPar.Data(),"ESD.par");
875 tree->GetUserInfo()->Add(fn);
881 tree->SetBranchStatus("ESDfriend*",0);
886 TFile *aodFile = TFile::Open("AliAOD.root", "RECREATE");
887 ESDFile2AODFile(file, aodFile);
892 CleanUp(file, fileOld);
894 // Create tags for the events in the ESD tree (the ESD tree is always present)
895 // In case of empty events the tags will contain dummy values
896 AliESDTagCreator *esdtagCreator = new AliESDTagCreator();
897 esdtagCreator->CreateESDTags(fFirstEvent,fLastEvent);
899 AliAODTagCreator *aodtagCreator = new AliAODTagCreator();
900 aodtagCreator->CreateAODTags(fFirstEvent,fLastEvent);
907 //_____________________________________________________________________________
908 Bool_t AliReconstruction::RunLocalReconstruction(const TString& detectors)
910 // run the local reconstruction
914 AliCDBManager* man = AliCDBManager::Instance();
915 Bool_t origCache = man->GetCacheFlag();
917 TString detStr = detectors;
918 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
919 if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
920 AliReconstructor* reconstructor = GetReconstructor(iDet);
921 if (!reconstructor) continue;
922 if (reconstructor->HasLocalReconstruction()) continue;
924 AliCodeTimerStart(Form("running reconstruction for %s", fgkDetectorName[iDet]));
925 AliInfo(Form("running reconstruction for %s", fgkDetectorName[iDet]));
927 AliCodeTimerStart(Form("Loading calibration data from OCDB for %s", fgkDetectorName[iDet]));
928 AliInfo(Form("Loading calibration data from OCDB for %s", fgkDetectorName[iDet]));
930 man->SetCacheFlag(kTRUE);
931 TString calibPath = Form("%s/Calib/*", fgkDetectorName[iDet]);
932 man->GetAll(calibPath); // entries are cached!
934 AliCodeTimerStop(Form("Loading calibration data from OCDB for %s", fgkDetectorName[iDet]));
937 fRawReader->RewindEvents();
938 reconstructor->Reconstruct(fRunLoader, fRawReader);
940 reconstructor->Reconstruct(fRunLoader);
943 AliCodeTimerStop(Form("running reconstruction for %s", fgkDetectorName[iDet]));
945 // unload calibration data
946 man->UnloadFromCache(calibPath);
950 man->SetCacheFlag(origCache);
952 if ((detStr.CompareTo("ALL") != 0) && !detStr.IsNull()) {
953 AliError(Form("the following detectors were not found: %s",
955 if (fStopOnError) return kFALSE;
961 //_____________________________________________________________________________
962 Bool_t AliReconstruction::RunLocalEventReconstruction(const TString& detectors)
964 // run the local reconstruction
968 TString detStr = detectors;
969 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
970 if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
971 AliReconstructor* reconstructor = GetReconstructor(iDet);
972 if (!reconstructor) continue;
973 AliLoader* loader = fLoader[iDet];
975 // conversion of digits
976 if (fRawReader && reconstructor->HasDigitConversion()) {
977 AliInfo(Form("converting raw data digits into root objects for %s",
978 fgkDetectorName[iDet]));
979 AliCodeTimerAuto(Form("converting raw data digits into root objects for %s",
980 fgkDetectorName[iDet]));
981 loader->LoadDigits("update");
982 loader->CleanDigits();
983 loader->MakeDigitsContainer();
984 TTree* digitsTree = loader->TreeD();
985 reconstructor->ConvertDigits(fRawReader, digitsTree);
986 loader->WriteDigits("OVERWRITE");
987 loader->UnloadDigits();
990 // local reconstruction
991 if (!reconstructor->HasLocalReconstruction()) continue;
992 AliInfo(Form("running reconstruction for %s", fgkDetectorName[iDet]));
993 AliCodeTimerAuto(Form("running reconstruction for %s", fgkDetectorName[iDet]));
994 loader->LoadRecPoints("update");
995 loader->CleanRecPoints();
996 loader->MakeRecPointsContainer();
997 TTree* clustersTree = loader->TreeR();
998 if (fRawReader && !reconstructor->HasDigitConversion()) {
999 reconstructor->Reconstruct(fRawReader, clustersTree);
1001 loader->LoadDigits("read");
1002 TTree* digitsTree = loader->TreeD();
1004 AliError(Form("Can't get the %s digits tree", fgkDetectorName[iDet]));
1005 if (fStopOnError) return kFALSE;
1007 reconstructor->Reconstruct(digitsTree, clustersTree);
1009 loader->UnloadDigits();
1011 loader->WriteRecPoints("OVERWRITE");
1012 loader->UnloadRecPoints();
1015 if ((detStr.CompareTo("ALL") != 0) && !detStr.IsNull()) {
1016 AliError(Form("the following detectors were not found: %s",
1018 if (fStopOnError) return kFALSE;
1024 //_____________________________________________________________________________
1025 Bool_t AliReconstruction::RunVertexFinder(AliESDEvent*& esd)
1027 // run the barrel tracking
1029 AliCodeTimerAuto("")
1031 AliESDVertex* vertex = NULL;
1032 Double_t vtxPos[3] = {0, 0, 0};
1033 Double_t vtxErr[3] = {0.07, 0.07, 0.1};
1034 TArrayF mcVertex(3);
1035 if (fRunLoader->GetHeader() && fRunLoader->GetHeader()->GenEventHeader()) {
1036 fRunLoader->GetHeader()->GenEventHeader()->PrimaryVertex(mcVertex);
1037 for (Int_t i = 0; i < 3; i++) vtxPos[i] = mcVertex[i];
1041 if(fDiamondProfile) fVertexer->SetVtxStart(fDiamondProfile);
1042 AliInfo("running the ITS vertex finder");
1043 if (fLoader[0]) fLoader[0]->LoadRecPoints();
1044 vertex = fVertexer->FindVertexForCurrentEvent(fRunLoader->GetEventNumber());
1045 if (fLoader[0]) fLoader[0]->UnloadRecPoints();
1047 AliWarning("Vertex not found");
1048 vertex = new AliESDVertex();
1049 vertex->SetName("default");
1052 vertex->SetName("reconstructed");
1056 AliInfo("getting the primary vertex from MC");
1057 vertex = new AliESDVertex(vtxPos, vtxErr);
1061 vertex->GetXYZ(vtxPos);
1062 vertex->GetSigmaXYZ(vtxErr);
1064 AliWarning("no vertex reconstructed");
1065 vertex = new AliESDVertex(vtxPos, vtxErr);
1067 esd->SetVertex(vertex);
1068 // if SPD multiplicity has been determined, it is stored in the ESD
1069 AliMultiplicity *mult = fVertexer->GetMultiplicity();
1070 if(mult)esd->SetMultiplicity(mult);
1072 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
1073 if (fTracker[iDet]) fTracker[iDet]->SetVertex(vtxPos, vtxErr);
1080 //_____________________________________________________________________________
1081 Bool_t AliReconstruction::RunHLTTracking(AliESDEvent*& esd)
1083 // run the HLT barrel tracking
1085 AliCodeTimerAuto("")
1088 AliError("Missing runLoader!");
1092 AliInfo("running HLT tracking");
1094 // Get a pointer to the HLT reconstructor
1095 AliReconstructor *reconstructor = GetReconstructor(fgkNDetectors-1);
1096 if (!reconstructor) return kFALSE;
1099 for (Int_t iDet = 1; iDet >= 0; iDet--) {
1100 TString detName = fgkDetectorName[iDet];
1101 AliDebug(1, Form("%s HLT tracking", detName.Data()));
1102 reconstructor->SetOption(detName.Data());
1103 AliTracker *tracker = reconstructor->CreateTracker(fRunLoader);
1105 AliWarning(Form("couldn't create a HLT tracker for %s", detName.Data()));
1106 if (fStopOnError) return kFALSE;
1110 Double_t vtxErr[3]={0.005,0.005,0.010};
1111 const AliESDVertex *vertex = esd->GetVertex();
1112 vertex->GetXYZ(vtxPos);
1113 tracker->SetVertex(vtxPos,vtxErr);
1115 fLoader[iDet]->LoadRecPoints("read");
1116 TTree* tree = fLoader[iDet]->TreeR();
1118 AliError(Form("Can't get the %s cluster tree", detName.Data()));
1121 tracker->LoadClusters(tree);
1123 if (tracker->Clusters2Tracks(esd) != 0) {
1124 AliError(Form("HLT %s Clusters2Tracks failed", fgkDetectorName[iDet]));
1128 tracker->UnloadClusters();
1136 //_____________________________________________________________________________
1137 Bool_t AliReconstruction::RunMuonTracking(AliESDEvent*& esd)
1139 // run the muon spectrometer tracking
1141 AliCodeTimerAuto("")
1144 AliError("Missing runLoader!");
1147 Int_t iDet = 7; // for MUON
1149 AliInfo("is running...");
1151 // Get a pointer to the MUON reconstructor
1152 AliReconstructor *reconstructor = GetReconstructor(iDet);
1153 if (!reconstructor) return kFALSE;
1156 TString detName = fgkDetectorName[iDet];
1157 AliDebug(1, Form("%s tracking", detName.Data()));
1158 AliTracker *tracker = reconstructor->CreateTracker(fRunLoader);
1160 AliWarning(Form("couldn't create a tracker for %s", detName.Data()));
1165 fLoader[iDet]->LoadTracks("update");
1166 fLoader[iDet]->CleanTracks();
1167 fLoader[iDet]->MakeTracksContainer();
1170 fLoader[iDet]->LoadRecPoints("read");
1171 tracker->LoadClusters(fLoader[iDet]->TreeR());
1173 Int_t rv = tracker->Clusters2Tracks(esd);
1175 fLoader[iDet]->UnloadRecPoints();
1179 AliError(Form("%s Clusters2Tracks failed", fgkDetectorName[iDet]));
1183 tracker->UnloadClusters();
1185 fLoader[iDet]->UnloadRecPoints();
1187 fLoader[iDet]->WriteTracks("OVERWRITE");
1188 fLoader[iDet]->UnloadTracks();
1196 //_____________________________________________________________________________
1197 Bool_t AliReconstruction::RunTracking(AliESDEvent*& esd)
1199 // run the barrel tracking
1201 AliCodeTimerAuto("")
1203 AliInfo("running tracking");
1205 //Fill the ESD with the T0 info (will be used by the TOF)
1206 if (fReconstructor[11])
1207 GetReconstructor(11)->FillESD(fRunLoader, esd);
1209 // pass 1: TPC + ITS inwards
1210 for (Int_t iDet = 1; iDet >= 0; iDet--) {
1211 if (!fTracker[iDet]) continue;
1212 AliDebug(1, Form("%s tracking", fgkDetectorName[iDet]));
1215 fLoader[iDet]->LoadRecPoints("read");
1216 TTree* tree = fLoader[iDet]->TreeR();
1218 AliError(Form("Can't get the %s cluster tree", fgkDetectorName[iDet]));
1221 fTracker[iDet]->LoadClusters(tree);
1224 if (fTracker[iDet]->Clusters2Tracks(esd) != 0) {
1225 AliError(Form("%s Clusters2Tracks failed", fgkDetectorName[iDet]));
1228 if (fCheckPointLevel > 1) {
1229 WriteESD(esd, Form("%s.tracking", fgkDetectorName[iDet]));
1231 // preliminary PID in TPC needed by the ITS tracker
1233 GetReconstructor(1)->FillESD(fRunLoader, esd);
1234 GetReconstructor(1)->FillESD((TTree*)NULL, (TTree*)NULL, esd);
1235 AliESDpid::MakePID(esd);
1239 // pass 2: ALL backwards
1240 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
1241 if (!fTracker[iDet]) continue;
1242 AliDebug(1, Form("%s back propagation", fgkDetectorName[iDet]));
1245 if (iDet > 1) { // all except ITS, TPC
1247 fLoader[iDet]->LoadRecPoints("read");
1248 tree = fLoader[iDet]->TreeR();
1250 AliError(Form("Can't get the %s cluster tree", fgkDetectorName[iDet]));
1253 fTracker[iDet]->LoadClusters(tree);
1257 if (fTracker[iDet]->PropagateBack(esd) != 0) {
1258 AliError(Form("%s backward propagation failed", fgkDetectorName[iDet]));
1261 if (fCheckPointLevel > 1) {
1262 WriteESD(esd, Form("%s.back", fgkDetectorName[iDet]));
1266 if (iDet > 2) { // all except ITS, TPC, TRD
1267 fTracker[iDet]->UnloadClusters();
1268 fLoader[iDet]->UnloadRecPoints();
1270 // updated PID in TPC needed by the ITS tracker -MI
1272 GetReconstructor(1)->FillESD(fRunLoader, esd);
1273 GetReconstructor(1)->FillESD((TTree*)NULL, (TTree*)NULL, esd);
1274 AliESDpid::MakePID(esd);
1278 // write space-points to the ESD in case alignment data output
1280 if (fWriteAlignmentData)
1281 WriteAlignmentData(esd);
1283 // pass 3: TRD + TPC + ITS refit inwards
1284 for (Int_t iDet = 2; iDet >= 0; iDet--) {
1285 if (!fTracker[iDet]) continue;
1286 AliDebug(1, Form("%s inward refit", fgkDetectorName[iDet]));
1289 if (fTracker[iDet]->RefitInward(esd) != 0) {
1290 AliError(Form("%s inward refit failed", fgkDetectorName[iDet]));
1293 if (fCheckPointLevel > 1) {
1294 WriteESD(esd, Form("%s.refit", fgkDetectorName[iDet]));
1298 fTracker[iDet]->UnloadClusters();
1299 fLoader[iDet]->UnloadRecPoints();
1302 // Propagate track to the vertex - if not done by ITS
1304 Int_t ntracks = esd->GetNumberOfTracks();
1305 for (Int_t itrack=0; itrack<ntracks; itrack++){
1306 const Double_t kRadius = 3; // beam pipe radius
1307 const Double_t kMaxStep = 5; // max step
1308 const Double_t kMaxD = 123456; // max distance to prim vertex
1309 Double_t fieldZ = AliTracker::GetBz(); //
1310 AliESDtrack * track = esd->GetTrack(itrack);
1311 if (!track) continue;
1312 if (track->IsOn(AliESDtrack::kITSrefit)) continue;
1313 AliTracker::PropagateTrackTo(track,kRadius,track->GetMass(),kMaxStep,kTRUE);
1314 track->RelateToVertex(esd->GetVertex(),fieldZ, kMaxD);
1320 //_____________________________________________________________________________
1321 Bool_t AliReconstruction::CleanESD(AliESDEvent *esd){
1323 // Remove the data which are not needed for the physics analysis.
1326 AliInfo("Cleaning the ESD...");
1328 const AliESDVertex *vertex=esd->GetVertex();
1329 Double_t vz=vertex->GetZv();
1331 Int_t nTracks=esd->GetNumberOfTracks();
1332 for (Int_t i=0; i<nTracks; i++) {
1333 AliESDtrack *track=esd->GetTrack(i);
1335 Float_t xy,z; track->GetImpactParameters(xy,z);
1336 if (TMath::Abs(xy) < 50.) continue;
1337 if (vertex->GetStatus())
1338 if (TMath::Abs(vz-z) < 5.) continue;
1340 esd->RemoveTrack(i);
1346 //_____________________________________________________________________________
1347 Bool_t AliReconstruction::FillESD(AliESDEvent*& esd, const TString& detectors)
1349 // fill the event summary data
1351 AliCodeTimerAuto("")
1353 TString detStr = detectors;
1354 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
1355 if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
1356 AliReconstructor* reconstructor = GetReconstructor(iDet);
1357 if (!reconstructor) continue;
1359 if (!ReadESD(esd, fgkDetectorName[iDet])) {
1360 AliDebug(1, Form("filling ESD for %s", fgkDetectorName[iDet]));
1361 TTree* clustersTree = NULL;
1362 if (reconstructor->HasLocalReconstruction() && fLoader[iDet]) {
1363 fLoader[iDet]->LoadRecPoints("read");
1364 clustersTree = fLoader[iDet]->TreeR();
1365 if (!clustersTree) {
1366 AliError(Form("Can't get the %s clusters tree",
1367 fgkDetectorName[iDet]));
1368 if (fStopOnError) return kFALSE;
1371 if (fRawReader && !reconstructor->HasDigitConversion()) {
1372 reconstructor->FillESD(fRawReader, clustersTree, esd);
1374 TTree* digitsTree = NULL;
1375 if (fLoader[iDet]) {
1376 fLoader[iDet]->LoadDigits("read");
1377 digitsTree = fLoader[iDet]->TreeD();
1379 AliError(Form("Can't get the %s digits tree",
1380 fgkDetectorName[iDet]));
1381 if (fStopOnError) return kFALSE;
1384 reconstructor->FillESD(digitsTree, clustersTree, esd);
1385 if (fLoader[iDet]) fLoader[iDet]->UnloadDigits();
1387 if (reconstructor->HasLocalReconstruction() && fLoader[iDet]) {
1388 fLoader[iDet]->UnloadRecPoints();
1392 reconstructor->FillESD(fRunLoader, fRawReader, esd);
1394 reconstructor->FillESD(fRunLoader, esd);
1396 if (fCheckPointLevel > 2) WriteESD(esd, fgkDetectorName[iDet]);
1400 if ((detStr.CompareTo("ALL") != 0) && !detStr.IsNull()) {
1401 AliError(Form("the following detectors were not found: %s",
1403 if (fStopOnError) return kFALSE;
1409 //_____________________________________________________________________________
1410 Bool_t AliReconstruction::FillTriggerESD(AliESDEvent*& esd)
1412 // Reads the trigger decision which is
1413 // stored in Trigger.root file and fills
1414 // the corresponding esd entries
1416 AliCodeTimerAuto("")
1418 AliInfo("Filling trigger information into the ESD");
1421 AliCTPRawStream input(fRawReader);
1422 if (!input.Next()) {
1423 AliError("No valid CTP (trigger) DDL raw data is found ! The trigger information is not stored in the ESD !");
1426 esd->SetTriggerMask(input.GetClassMask());
1427 esd->SetTriggerCluster(input.GetClusterMask());
1430 AliRunLoader *runloader = AliRunLoader::GetRunLoader();
1432 if (!runloader->LoadTrigger()) {
1433 AliCentralTrigger *aCTP = runloader->GetTrigger();
1434 esd->SetTriggerMask(aCTP->GetClassMask());
1435 esd->SetTriggerCluster(aCTP->GetClusterMask());
1438 AliWarning("No trigger can be loaded! The trigger information is not stored in the ESD !");
1443 AliError("No run loader is available! The trigger information is not stored in the ESD !");
1455 //_____________________________________________________________________________
1456 Bool_t AliReconstruction::FillRawEventHeaderESD(AliESDEvent*& esd)
1459 // Filling information from RawReader Header
1462 AliInfo("Filling information from RawReader Header");
1463 esd->SetBunchCrossNumber(0);
1464 esd->SetOrbitNumber(0);
1465 esd->SetPeriodNumber(0);
1466 esd->SetTimeStamp(0);
1467 esd->SetEventType(0);
1468 const AliRawEventHeaderBase * eventHeader = fRawReader->GetEventHeader();
1471 const UInt_t *id = eventHeader->GetP("Id");
1472 esd->SetBunchCrossNumber((id)[1]&0x00000fff);
1473 esd->SetOrbitNumber((((id)[0]<<20)&0xf00000)|(((id)[1]>>12)&0xfffff));
1474 esd->SetPeriodNumber(((id)[0]>>4)&0x0fffffff);
1476 esd->SetTimeStamp((eventHeader->Get("Timestamp")));
1477 esd->SetEventType((eventHeader->Get("Type")));
1484 //_____________________________________________________________________________
1485 Bool_t AliReconstruction::IsSelected(TString detName, TString& detectors) const
1487 // check whether detName is contained in detectors
1488 // if yes, it is removed from detectors
1490 // check if all detectors are selected
1491 if ((detectors.CompareTo("ALL") == 0) ||
1492 detectors.BeginsWith("ALL ") ||
1493 detectors.EndsWith(" ALL") ||
1494 detectors.Contains(" ALL ")) {
1499 // search for the given detector
1500 Bool_t result = kFALSE;
1501 if ((detectors.CompareTo(detName) == 0) ||
1502 detectors.BeginsWith(detName+" ") ||
1503 detectors.EndsWith(" "+detName) ||
1504 detectors.Contains(" "+detName+" ")) {
1505 detectors.ReplaceAll(detName, "");
1509 // clean up the detectors string
1510 while (detectors.Contains(" ")) detectors.ReplaceAll(" ", " ");
1511 while (detectors.BeginsWith(" ")) detectors.Remove(0, 1);
1512 while (detectors.EndsWith(" ")) detectors.Remove(detectors.Length()-1, 1);
1517 //_____________________________________________________________________________
1518 Bool_t AliReconstruction::InitRunLoader()
1520 // get or create the run loader
1522 if (gAlice) delete gAlice;
1525 if (!gSystem->AccessPathName(fGAliceFileName.Data())) { // galice.root exists
1526 // load all base libraries to get the loader classes
1527 TString libs = gSystem->GetLibraries();
1528 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
1529 TString detName = fgkDetectorName[iDet];
1530 if (detName == "HLT") continue;
1531 if (libs.Contains("lib" + detName + "base.so")) continue;
1532 gSystem->Load("lib" + detName + "base.so");
1534 fRunLoader = AliRunLoader::Open(fGAliceFileName.Data());
1536 AliError(Form("no run loader found in file %s", fGAliceFileName.Data()));
1540 fRunLoader->CdGAFile();
1541 if (gFile->GetKey(AliRunLoader::GetGAliceName())) {
1542 if (fRunLoader->LoadgAlice() == 0) {
1543 gAlice = fRunLoader->GetAliRun();
1544 AliTracker::SetFieldMap(gAlice->Field(),fUniformField);
1547 if (!gAlice && !fRawReader) {
1548 AliError(Form("no gAlice object found in file %s",
1549 fGAliceFileName.Data()));
1554 //PH This is a temporary fix to give access to the kinematics
1555 //PH that is needed for the labels of ITS clusters
1556 fRunLoader->LoadKinematics();
1558 } else { // galice.root does not exist
1560 AliError(Form("the file %s does not exist", fGAliceFileName.Data()));
1564 fRunLoader = AliRunLoader::Open(fGAliceFileName.Data(),
1565 AliConfig::GetDefaultEventFolderName(),
1568 AliError(Form("could not create run loader in file %s",
1569 fGAliceFileName.Data()));
1573 fRunLoader->MakeTree("E");
1575 while (fRawReader->NextEvent()) {
1576 fRunLoader->SetEventNumber(iEvent);
1577 fRunLoader->GetHeader()->Reset(fRawReader->GetRunNumber(),
1579 fRunLoader->MakeTree("H");
1580 fRunLoader->TreeE()->Fill();
1583 fRawReader->RewindEvents();
1584 if (fNumberOfEventsPerFile > 0)
1585 fRunLoader->SetNumberOfEventsPerFile(fNumberOfEventsPerFile);
1587 fRunLoader->SetNumberOfEventsPerFile(iEvent);
1588 fRunLoader->WriteHeader("OVERWRITE");
1589 fRunLoader->CdGAFile();
1590 fRunLoader->Write(0, TObject::kOverwrite);
1591 // AliTracker::SetFieldMap(???);
1597 //_____________________________________________________________________________
1598 AliReconstructor* AliReconstruction::GetReconstructor(Int_t iDet)
1600 // get the reconstructor object and the loader for a detector
1602 if (fReconstructor[iDet]) return fReconstructor[iDet];
1604 // load the reconstructor object
1605 TPluginManager* pluginManager = gROOT->GetPluginManager();
1606 TString detName = fgkDetectorName[iDet];
1607 TString recName = "Ali" + detName + "Reconstructor";
1608 if (gAlice && !gAlice->GetDetector(detName) && (detName != "HLT")) return NULL;
1610 if (detName == "HLT") {
1611 if (!gROOT->GetClass("AliLevel3")) {
1612 gSystem->Load("libAliHLTSrc.so");
1613 gSystem->Load("libAliHLTMisc.so");
1614 gSystem->Load("libAliHLTHough.so");
1615 gSystem->Load("libAliHLTComp.so");
1619 AliReconstructor* reconstructor = NULL;
1620 // first check if a plugin is defined for the reconstructor
1621 TPluginHandler* pluginHandler =
1622 pluginManager->FindHandler("AliReconstructor", detName);
1623 // if not, add a plugin for it
1624 if (!pluginHandler) {
1625 AliDebug(1, Form("defining plugin for %s", recName.Data()));
1626 TString libs = gSystem->GetLibraries();
1627 if (libs.Contains("lib" + detName + "base.so") ||
1628 (gSystem->Load("lib" + detName + "base.so") >= 0)) {
1629 pluginManager->AddHandler("AliReconstructor", detName,
1630 recName, detName + "rec", recName + "()");
1632 pluginManager->AddHandler("AliReconstructor", detName,
1633 recName, detName, recName + "()");
1635 pluginHandler = pluginManager->FindHandler("AliReconstructor", detName);
1637 if (pluginHandler && (pluginHandler->LoadPlugin() == 0)) {
1638 reconstructor = (AliReconstructor*) pluginHandler->ExecPlugin(0);
1640 if (reconstructor) {
1641 TObject* obj = fOptions.FindObject(detName.Data());
1642 if (obj) reconstructor->SetOption(obj->GetTitle());
1643 reconstructor->Init(fRunLoader);
1644 fReconstructor[iDet] = reconstructor;
1647 // get or create the loader
1648 if (detName != "HLT") {
1649 fLoader[iDet] = fRunLoader->GetLoader(detName + "Loader");
1650 if (!fLoader[iDet]) {
1651 AliConfig::Instance()
1652 ->CreateDetectorFolders(fRunLoader->GetEventFolder(),
1654 // first check if a plugin is defined for the loader
1656 pluginManager->FindHandler("AliLoader", detName);
1657 // if not, add a plugin for it
1658 if (!pluginHandler) {
1659 TString loaderName = "Ali" + detName + "Loader";
1660 AliDebug(1, Form("defining plugin for %s", loaderName.Data()));
1661 pluginManager->AddHandler("AliLoader", detName,
1662 loaderName, detName + "base",
1663 loaderName + "(const char*, TFolder*)");
1664 pluginHandler = pluginManager->FindHandler("AliLoader", detName);
1666 if (pluginHandler && (pluginHandler->LoadPlugin() == 0)) {
1668 (AliLoader*) pluginHandler->ExecPlugin(2, detName.Data(),
1669 fRunLoader->GetEventFolder());
1671 if (!fLoader[iDet]) { // use default loader
1672 fLoader[iDet] = new AliLoader(detName, fRunLoader->GetEventFolder());
1674 if (!fLoader[iDet]) {
1675 AliWarning(Form("couldn't get loader for %s", detName.Data()));
1676 if (fStopOnError) return NULL;
1678 fRunLoader->AddLoader(fLoader[iDet]);
1679 fRunLoader->CdGAFile();
1680 if (gFile && !gFile->IsWritable()) gFile->ReOpen("UPDATE");
1681 fRunLoader->Write(0, TObject::kOverwrite);
1686 return reconstructor;
1689 //_____________________________________________________________________________
1690 Bool_t AliReconstruction::CreateVertexer()
1692 // create the vertexer
1695 AliReconstructor* itsReconstructor = GetReconstructor(0);
1696 if (itsReconstructor) {
1697 fVertexer = itsReconstructor->CreateVertexer(fRunLoader);
1700 AliWarning("couldn't create a vertexer for ITS");
1701 if (fStopOnError) return kFALSE;
1707 //_____________________________________________________________________________
1708 Bool_t AliReconstruction::CreateTrackers(const TString& detectors)
1710 // create the trackers
1712 TString detStr = detectors;
1713 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
1714 if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
1715 AliReconstructor* reconstructor = GetReconstructor(iDet);
1716 if (!reconstructor) continue;
1717 TString detName = fgkDetectorName[iDet];
1718 if (detName == "HLT") {
1719 fRunHLTTracking = kTRUE;
1722 if (detName == "MUON") {
1723 fRunMuonTracking = kTRUE;
1728 fTracker[iDet] = reconstructor->CreateTracker(fRunLoader);
1729 if (!fTracker[iDet] && (iDet < 7)) {
1730 AliWarning(Form("couldn't create a tracker for %s", detName.Data()));
1731 if (fStopOnError) return kFALSE;
1738 //_____________________________________________________________________________
1739 void AliReconstruction::CleanUp(TFile* file, TFile* fileOld)
1741 // delete trackers and the run loader and close and delete the file
1743 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
1744 delete fReconstructor[iDet];
1745 fReconstructor[iDet] = NULL;
1746 fLoader[iDet] = NULL;
1747 delete fTracker[iDet];
1748 fTracker[iDet] = NULL;
1749 delete fQualAssDataMaker[iDet];
1750 fQualAssDataMaker[iDet] = NULL;
1754 delete fDiamondProfile;
1755 fDiamondProfile = NULL;
1770 gSystem->Unlink("AliESDs.old.root");
1774 //_____________________________________________________________________________
1776 Bool_t AliReconstruction::ReadESD(AliESDEvent*& esd, const char* recStep) const
1778 // read the ESD event from a file
1780 if (!esd) return kFALSE;
1782 sprintf(fileName, "ESD_%d.%d_%s.root",
1783 esd->GetRunNumber(), esd->GetEventNumberInFile(), recStep);
1784 if (gSystem->AccessPathName(fileName)) return kFALSE;
1786 AliInfo(Form("reading ESD from file %s", fileName));
1787 AliDebug(1, Form("reading ESD from file %s", fileName));
1788 TFile* file = TFile::Open(fileName);
1789 if (!file || !file->IsOpen()) {
1790 AliError(Form("opening %s failed", fileName));
1797 esd = (AliESDEvent*) file->Get("ESD");
1806 //_____________________________________________________________________________
1807 void AliReconstruction::WriteESD(AliESDEvent* esd, const char* recStep) const
1809 // write the ESD event to a file
1813 sprintf(fileName, "ESD_%d.%d_%s.root",
1814 esd->GetRunNumber(), esd->GetEventNumberInFile(), recStep);
1816 AliDebug(1, Form("writing ESD to file %s", fileName));
1817 TFile* file = TFile::Open(fileName, "recreate");
1818 if (!file || !file->IsOpen()) {
1819 AliError(Form("opening %s failed", fileName));
1831 //_____________________________________________________________________________
1832 void AliReconstruction::ESDFile2AODFile(TFile* esdFile, TFile* aodFile)
1834 // write all files from the given esd file to an aod file
1836 // create an AliAOD object
1837 AliAODEvent *aod = new AliAODEvent();
1838 aod->CreateStdContent();
1844 TTree *aodTree = new TTree("aodTree", "AliAOD tree");
1845 aodTree->Branch(aod->GetList());
1848 TTree *t = (TTree*) esdFile->Get("esdTree");
1849 AliESDEvent *esd = new AliESDEvent();
1850 esd->ReadFromTree(t);
1852 Int_t nEvents = t->GetEntries();
1854 // set arrays and pointers
1862 // loop over events and fill them
1863 for (Int_t iEvent = 0; iEvent < nEvents; ++iEvent) {
1864 t->GetEntry(iEvent);
1866 // Multiplicity information needed by the header (to be revised!)
1867 Int_t nTracks = esd->GetNumberOfTracks();
1868 Int_t nPosTracks = 0;
1869 for (Int_t iTrack=0; iTrack<nTracks; ++iTrack)
1870 if (esd->GetTrack(iTrack)->Charge()> 0) nPosTracks++;
1872 // Access the header
1873 AliAODHeader *header = aod->GetHeader();
1876 header->SetRunNumber (esd->GetRunNumber() );
1877 header->SetBunchCrossNumber(esd->GetBunchCrossNumber());
1878 header->SetOrbitNumber (esd->GetOrbitNumber() );
1879 header->SetPeriodNumber (esd->GetPeriodNumber() );
1880 header->SetTriggerMask (esd->GetTriggerMask() );
1881 header->SetTriggerCluster (esd->GetTriggerCluster() );
1882 header->SetEventType (esd->GetEventType() );
1883 header->SetMagneticField (esd->GetMagneticField() );
1884 header->SetZDCN1Energy (esd->GetZDCN1Energy() );
1885 header->SetZDCP1Energy (esd->GetZDCP1Energy() );
1886 header->SetZDCN2Energy (esd->GetZDCN2Energy() );
1887 header->SetZDCP2Energy (esd->GetZDCP2Energy() );
1888 header->SetZDCEMEnergy (esd->GetZDCEMEnergy() );
1889 header->SetRefMultiplicity (nTracks);
1890 header->SetRefMultiplicityPos(nPosTracks);
1891 header->SetRefMultiplicityNeg(nTracks - nPosTracks);
1892 header->SetMuonMagFieldScale(-999.); // FIXME
1893 header->SetCentrality(-999.); // FIXME
1895 Int_t nV0s = esd->GetNumberOfV0s();
1896 Int_t nCascades = esd->GetNumberOfCascades();
1897 Int_t nKinks = esd->GetNumberOfKinks();
1898 Int_t nVertices = nV0s + nCascades + nKinks;
1900 aod->ResetStd(nTracks, nVertices);
1901 AliAODTrack *aodTrack;
1903 // Array to take into account the tracks already added to the AOD
1904 Bool_t * usedTrack = NULL;
1906 usedTrack = new Bool_t[nTracks];
1907 for (Int_t iTrack=0; iTrack<nTracks; ++iTrack) usedTrack[iTrack]=kFALSE;
1909 // Array to take into account the V0s already added to the AOD
1910 Bool_t * usedV0 = NULL;
1912 usedV0 = new Bool_t[nV0s];
1913 for (Int_t iV0=0; iV0<nV0s; ++iV0) usedV0[iV0]=kFALSE;
1915 // Array to take into account the kinks already added to the AOD
1916 Bool_t * usedKink = NULL;
1918 usedKink = new Bool_t[nKinks];
1919 for (Int_t iKink=0; iKink<nKinks; ++iKink) usedKink[iKink]=kFALSE;
1922 // Access to the AOD container of vertices
1923 TClonesArray &vertices = *(aod->GetVertices());
1926 // Access to the AOD container of tracks
1927 TClonesArray &tracks = *(aod->GetTracks());
1930 // Add primary vertex. The primary tracks will be defined
1931 // after the loops on the composite objects (V0, cascades, kinks)
1932 const AliESDVertex *vtx = esd->GetPrimaryVertex();
1934 vtx->GetXYZ(pos); // position
1935 vtx->GetCovMatrix(covVtx); //covariance matrix
1937 AliAODVertex * primary = new(vertices[jVertices++])
1938 AliAODVertex(pos, covVtx, vtx->GetChi2toNDF(), NULL, -1, AliAODVertex::kPrimary);
1940 // Create vertices starting from the most complex objects
1943 for (Int_t nCascade = 0; nCascade < nCascades; ++nCascade) {
1944 AliESDcascade *cascade = esd->GetCascade(nCascade);
1946 cascade->GetXYZ(pos[0], pos[1], pos[2]);
1947 cascade->GetPosCovXi(covVtx);
1949 // Add the cascade vertex
1950 AliAODVertex * vcascade = new(vertices[jVertices++]) AliAODVertex(pos,
1952 cascade->GetChi2Xi(), // = chi2/NDF since NDF = 2*2-3
1955 AliAODVertex::kCascade);
1957 primary->AddDaughter(vcascade);
1959 // Add the V0 from the cascade. The ESD class have to be optimized...
1960 // Now we have to search for the corresponding V0 in the list of V0s
1961 // using the indeces of the positive and negative tracks
1963 Int_t posFromV0 = cascade->GetPindex();
1964 Int_t negFromV0 = cascade->GetNindex();
1967 AliESDv0 * v0 = 0x0;
1970 for (Int_t iV0=0; iV0<nV0s; ++iV0) {
1972 v0 = esd->GetV0(iV0);
1973 Int_t posV0 = v0->GetPindex();
1974 Int_t negV0 = v0->GetNindex();
1976 if (posV0==posFromV0 && negV0==negFromV0) {
1982 AliAODVertex * vV0FromCascade = 0x0;
1984 if (indV0>-1 && !usedV0[indV0] ) {
1986 // the V0 exists in the array of V0s and is not used
1988 usedV0[indV0] = kTRUE;
1990 v0->GetXYZ(pos[0], pos[1], pos[2]);
1991 v0->GetPosCov(covVtx);
1993 vV0FromCascade = new(vertices[jVertices++]) AliAODVertex(pos,
1995 v0->GetChi2V0(), // = chi2/NDF since NDF = 2*2-3
2001 // the V0 doesn't exist in the array of V0s or was used
2002 cerr << "Error: event " << iEvent << " cascade " << nCascade
2003 << " The V0 " << indV0
2004 << " doesn't exist in the array of V0s or was used!" << endl;
2006 cascade->GetXYZ(pos[0], pos[1], pos[2]);
2007 cascade->GetPosCov(covVtx);
2009 vV0FromCascade = new(vertices[jVertices++]) AliAODVertex(pos,
2011 v0->GetChi2V0(), // = chi2/NDF since NDF = 2*2-3
2015 vcascade->AddDaughter(vV0FromCascade);
2018 // Add the positive tracks from the V0
2020 if (! usedTrack[posFromV0]) {
2022 usedTrack[posFromV0] = kTRUE;
2024 AliESDtrack *esdTrack = esd->GetTrack(posFromV0);
2025 esdTrack->GetPxPyPz(p);
2026 esdTrack->GetXYZ(pos);
2027 esdTrack->GetCovarianceXYZPxPyPz(covTr);
2028 esdTrack->GetESDpid(pid);
2030 vV0FromCascade->AddDaughter(aodTrack =
2031 new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
2032 esdTrack->GetLabel(),
2038 (Short_t)esdTrack->Charge(),
2039 esdTrack->GetITSClusterMap(),
2042 kTRUE, // check if this is right
2043 kFALSE, // check if this is right
2044 AliAODTrack::kSecondary)
2046 aodTrack->ConvertAliPIDtoAODPID();
2049 cerr << "Error: event " << iEvent << " cascade " << nCascade
2050 << " track " << posFromV0 << " has already been used!" << endl;
2053 // Add the negative tracks from the V0
2055 if (!usedTrack[negFromV0]) {
2057 usedTrack[negFromV0] = kTRUE;
2059 AliESDtrack *esdTrack = esd->GetTrack(negFromV0);
2060 esdTrack->GetPxPyPz(p);
2061 esdTrack->GetXYZ(pos);
2062 esdTrack->GetCovarianceXYZPxPyPz(covTr);
2063 esdTrack->GetESDpid(pid);
2065 vV0FromCascade->AddDaughter(aodTrack =
2066 new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
2067 esdTrack->GetLabel(),
2073 (Short_t)esdTrack->Charge(),
2074 esdTrack->GetITSClusterMap(),
2077 kTRUE, // check if this is right
2078 kFALSE, // check if this is right
2079 AliAODTrack::kSecondary)
2081 aodTrack->ConvertAliPIDtoAODPID();
2084 cerr << "Error: event " << iEvent << " cascade " << nCascade
2085 << " track " << negFromV0 << " has already been used!" << endl;
2088 // Add the bachelor track from the cascade
2090 Int_t bachelor = cascade->GetBindex();
2092 if(!usedTrack[bachelor]) {
2094 usedTrack[bachelor] = kTRUE;
2096 AliESDtrack *esdTrack = esd->GetTrack(bachelor);
2097 esdTrack->GetPxPyPz(p);
2098 esdTrack->GetXYZ(pos);
2099 esdTrack->GetCovarianceXYZPxPyPz(covTr);
2100 esdTrack->GetESDpid(pid);
2102 vcascade->AddDaughter(aodTrack =
2103 new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
2104 esdTrack->GetLabel(),
2110 (Short_t)esdTrack->Charge(),
2111 esdTrack->GetITSClusterMap(),
2114 kTRUE, // check if this is right
2115 kFALSE, // check if this is right
2116 AliAODTrack::kSecondary)
2118 aodTrack->ConvertAliPIDtoAODPID();
2121 cerr << "Error: event " << iEvent << " cascade " << nCascade
2122 << " track " << bachelor << " has already been used!" << endl;
2125 // Add the primary track of the cascade (if any)
2127 } // end of the loop on cascades
2131 for (Int_t nV0 = 0; nV0 < nV0s; ++nV0) {
2133 if (usedV0[nV0]) continue; // skip if aready added to the AOD
2135 AliESDv0 *v0 = esd->GetV0(nV0);
2137 v0->GetXYZ(pos[0], pos[1], pos[2]);
2138 v0->GetPosCov(covVtx);
2140 AliAODVertex * vV0 =
2141 new(vertices[jVertices++]) AliAODVertex(pos,
2143 v0->GetChi2V0(), // = chi2/NDF since NDF = 2*2-3
2147 primary->AddDaughter(vV0);
2149 Int_t posFromV0 = v0->GetPindex();
2150 Int_t negFromV0 = v0->GetNindex();
2152 // Add the positive tracks from the V0
2154 if (!usedTrack[posFromV0]) {
2156 usedTrack[posFromV0] = kTRUE;
2158 AliESDtrack *esdTrack = esd->GetTrack(posFromV0);
2159 esdTrack->GetPxPyPz(p);
2160 esdTrack->GetXYZ(pos);
2161 esdTrack->GetCovarianceXYZPxPyPz(covTr);
2162 esdTrack->GetESDpid(pid);
2164 vV0->AddDaughter(aodTrack =
2165 new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
2166 esdTrack->GetLabel(),
2172 (Short_t)esdTrack->Charge(),
2173 esdTrack->GetITSClusterMap(),
2176 kTRUE, // check if this is right
2177 kFALSE, // check if this is right
2178 AliAODTrack::kSecondary)
2180 aodTrack->ConvertAliPIDtoAODPID();
2183 cerr << "Error: event " << iEvent << " V0 " << nV0
2184 << " track " << posFromV0 << " has already been used!" << endl;
2187 // Add the negative tracks from the V0
2189 if (!usedTrack[negFromV0]) {
2191 usedTrack[negFromV0] = kTRUE;
2193 AliESDtrack *esdTrack = esd->GetTrack(negFromV0);
2194 esdTrack->GetPxPyPz(p);
2195 esdTrack->GetXYZ(pos);
2196 esdTrack->GetCovarianceXYZPxPyPz(covTr);
2197 esdTrack->GetESDpid(pid);
2199 vV0->AddDaughter(aodTrack =
2200 new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
2201 esdTrack->GetLabel(),
2207 (Short_t)esdTrack->Charge(),
2208 esdTrack->GetITSClusterMap(),
2211 kTRUE, // check if this is right
2212 kFALSE, // check if this is right
2213 AliAODTrack::kSecondary)
2215 aodTrack->ConvertAliPIDtoAODPID();
2218 cerr << "Error: event " << iEvent << " V0 " << nV0
2219 << " track " << negFromV0 << " has already been used!" << endl;
2222 } // end of the loop on V0s
2224 // Kinks: it is a big mess the access to the information in the kinks
2225 // The loop is on the tracks in order to find the mother and daugther of each kink
2228 for (Int_t iTrack=0; iTrack<nTracks; ++iTrack) {
2231 AliESDtrack * esdTrack = esd->GetTrack(iTrack);
2233 Int_t ikink = esdTrack->GetKinkIndex(0);
2236 // Negative kink index: mother, positive: daughter
2238 // Search for the second track of the kink
2240 for (Int_t jTrack = iTrack+1; jTrack<nTracks; ++jTrack) {
2242 AliESDtrack * esdTrack1 = esd->GetTrack(jTrack);
2244 Int_t jkink = esdTrack1->GetKinkIndex(0);
2246 if ( TMath::Abs(ikink)==TMath::Abs(jkink) ) {
2248 // The two tracks are from the same kink
2250 if (usedKink[TMath::Abs(ikink)-1]) continue; // skip used kinks
2253 Int_t idaughter = -1;
2255 if (ikink<0 && jkink>0) {
2260 else if (ikink>0 && jkink<0) {
2266 cerr << "Error: Wrong combination of kink indexes: "
2267 << ikink << " " << jkink << endl;
2271 // Add the mother track
2273 AliAODTrack * mother = NULL;
2275 if (!usedTrack[imother]) {
2277 usedTrack[imother] = kTRUE;
2279 AliESDtrack *esdTrack = esd->GetTrack(imother);
2280 esdTrack->GetPxPyPz(p);
2281 esdTrack->GetXYZ(pos);
2282 esdTrack->GetCovarianceXYZPxPyPz(covTr);
2283 esdTrack->GetESDpid(pid);
2286 new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
2287 esdTrack->GetLabel(),
2293 (Short_t)esdTrack->Charge(),
2294 esdTrack->GetITSClusterMap(),
2297 kTRUE, // check if this is right
2298 kTRUE, // check if this is right
2299 AliAODTrack::kPrimary);
2300 primary->AddDaughter(mother);
2301 mother->ConvertAliPIDtoAODPID();
2304 cerr << "Error: event " << iEvent << " kink " << TMath::Abs(ikink)-1
2305 << " track " << imother << " has already been used!" << endl;
2308 // Add the kink vertex
2309 AliESDkink * kink = esd->GetKink(TMath::Abs(ikink)-1);
2311 AliAODVertex * vkink =
2312 new(vertices[jVertices++]) AliAODVertex(kink->GetPosition(),
2316 esdTrack->GetID(), // This is the track ID of the mother's track!
2317 AliAODVertex::kKink);
2318 // Add the daughter track
2320 AliAODTrack * daughter = NULL;
2322 if (!usedTrack[idaughter]) {
2324 usedTrack[idaughter] = kTRUE;
2326 AliESDtrack *esdTrack = esd->GetTrack(idaughter);
2327 esdTrack->GetPxPyPz(p);
2328 esdTrack->GetXYZ(pos);
2329 esdTrack->GetCovarianceXYZPxPyPz(covTr);
2330 esdTrack->GetESDpid(pid);
2333 new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
2334 esdTrack->GetLabel(),
2340 (Short_t)esdTrack->Charge(),
2341 esdTrack->GetITSClusterMap(),
2344 kTRUE, // check if this is right
2345 kTRUE, // check if this is right
2346 AliAODTrack::kPrimary);
2347 vkink->AddDaughter(daughter);
2348 daughter->ConvertAliPIDtoAODPID();
2351 cerr << "Error: event " << iEvent << " kink " << TMath::Abs(ikink)-1
2352 << " track " << idaughter << " has already been used!" << endl;
2364 // Tracks (primary and orphan)
2366 for (Int_t nTrack = 0; nTrack < nTracks; ++nTrack) {
2369 if (usedTrack[nTrack]) continue;
2371 AliESDtrack *esdTrack = esd->GetTrack(nTrack);
2372 esdTrack->GetPxPyPz(p);
2373 esdTrack->GetXYZ(pos);
2374 esdTrack->GetCovarianceXYZPxPyPz(covTr);
2375 esdTrack->GetESDpid(pid);
2377 Float_t impactXY, impactZ;
2379 esdTrack->GetImpactParameters(impactXY,impactZ);
2382 // track inside the beam pipe
2384 primary->AddDaughter(aodTrack =
2385 new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
2386 esdTrack->GetLabel(),
2392 (Short_t)esdTrack->Charge(),
2393 esdTrack->GetITSClusterMap(),
2396 kTRUE, // check if this is right
2397 kTRUE, // check if this is right
2398 AliAODTrack::kPrimary)
2400 aodTrack->ConvertAliPIDtoAODPID();
2403 // outside the beam pipe: orphan track
2405 new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
2406 esdTrack->GetLabel(),
2412 (Short_t)esdTrack->Charge(),
2413 esdTrack->GetITSClusterMap(),
2416 kFALSE, // check if this is right
2417 kFALSE, // check if this is right
2418 AliAODTrack::kOrphan);
2419 aodTrack->ConvertAliPIDtoAODPID();
2421 } // end of loop on tracks
2424 Int_t nMuTracks = esd->GetNumberOfMuonTracks();
2425 for (Int_t nMuTrack = 0; nMuTrack < nMuTracks; ++nMuTrack) {
2427 AliESDMuonTrack *esdMuTrack = esd->GetMuonTrack(nMuTrack);
2428 p[0] = esdMuTrack->Px();
2429 p[1] = esdMuTrack->Py();
2430 p[2] = esdMuTrack->Pz();
2431 pos[0] = primary->GetX();
2432 pos[1] = primary->GetY();
2433 pos[2] = primary->GetZ();
2435 // has to be changed once the muon pid is provided by the ESD
2436 for (Int_t i = 0; i < 10; pid[i++] = 0.); pid[AliAODTrack::kMuon]=1.;
2438 primary->AddDaughter(aodTrack =
2439 new(tracks[jTracks++]) AliAODTrack(0, // no ID provided
2440 0, // no label provided
2445 NULL, // no covariance matrix provided
2446 esdMuTrack->Charge(),
2447 0, // ITSClusterMap is set below
2450 kFALSE, // muon tracks are not used to fit the primary vtx
2451 kFALSE, // not used for vertex fit
2452 AliAODTrack::kPrimary)
2455 aodTrack->SetHitsPatternInTrigCh(esdMuTrack->GetHitsPatternInTrigCh());
2456 Int_t track2Trigger = esdMuTrack->GetMatchTrigger();
2457 aodTrack->SetMatchTrigger(track2Trigger);
2459 aodTrack->SetChi2MatchTrigger(esdMuTrack->GetChi2MatchTrigger());
2461 aodTrack->SetChi2MatchTrigger(0.);
2464 // Access to the AOD container of clusters
2465 TClonesArray &clusters = *(aod->GetClusters());
2469 Int_t nClusters = esd->GetNumberOfCaloClusters();
2471 for (Int_t iClust=0; iClust<nClusters; ++iClust) {
2473 AliESDCaloCluster * cluster = esd->GetCaloCluster(iClust);
2475 Int_t id = cluster->GetID();
2477 Float_t energy = cluster->E();
2478 cluster->GetPosition(posF);
2479 AliAODVertex *prodVertex = primary;
2480 AliAODTrack *primTrack = NULL;
2481 Char_t ttype=AliAODCluster::kUndef;
2483 if (cluster->IsPHOS()) ttype=AliAODCluster::kPHOSNeutral;
2484 else if (cluster->IsEMCAL()) {
2486 if (cluster->GetClusterType() == AliESDCaloCluster::kPseudoCluster)
2487 ttype = AliAODCluster::kEMCALPseudoCluster;
2489 ttype = AliAODCluster::kEMCALClusterv1;
2493 new(clusters[jClusters++]) AliAODCluster(id,
2497 NULL, // no covariance matrix provided
2498 NULL, // no pid for clusters provided
2503 } // end of loop on calo clusters
2506 const AliMultiplicity *mult = esd->GetMultiplicity();
2508 if (mult->GetNumberOfTracklets()>0) {
2509 aod->GetTracklets()->CreateContainer(mult->GetNumberOfTracklets());
2511 for (Int_t n=0; n<mult->GetNumberOfTracklets(); n++) {
2512 aod->GetTracklets()->SetTracklet(n, mult->GetTheta(n), mult->GetPhi(n), mult->GetDeltaPhi(n), mult->GetLabel(n));
2516 Printf("ERROR: AliMultiplicity could not be retrieved from ESD");
2519 delete [] usedTrack;
2523 // fill the tree for this event
2525 } // end of event loop
2527 aodTree->GetUserInfo()->Add(aod);
2532 // write the tree to the specified file
2533 aodFile = aodTree->GetCurrentFile();
2540 void AliReconstruction::WriteAlignmentData(AliESDEvent* esd)
2542 // Write space-points which are then used in the alignment procedures
2543 // For the moment only ITS, TRD and TPC
2545 // Load TOF clusters
2547 fLoader[3]->LoadRecPoints("read");
2548 TTree* tree = fLoader[3]->TreeR();
2550 AliError(Form("Can't get the %s cluster tree", fgkDetectorName[3]));
2553 fTracker[3]->LoadClusters(tree);
2555 Int_t ntracks = esd->GetNumberOfTracks();
2556 for (Int_t itrack = 0; itrack < ntracks; itrack++)
2558 AliESDtrack *track = esd->GetTrack(itrack);
2561 for (Int_t iDet = 3; iDet >= 0; iDet--)
2562 nsp += track->GetNcls(iDet);
2564 AliTrackPointArray *sp = new AliTrackPointArray(nsp);
2565 track->SetTrackPointArray(sp);
2567 for (Int_t iDet = 3; iDet >= 0; iDet--) {
2568 AliTracker *tracker = fTracker[iDet];
2569 if (!tracker) continue;
2570 Int_t nspdet = track->GetNcls(iDet);
2571 if (nspdet <= 0) continue;
2572 track->GetClusters(iDet,idx);
2576 while (isp < nspdet) {
2577 Bool_t isvalid = tracker->GetTrackPoint(idx[isp2],p); isp2++;
2578 const Int_t kNTPCmax = 159;
2579 if (iDet==1 && isp2>kNTPCmax) break; // to be fixed
2580 if (!isvalid) continue;
2581 sp->AddPoint(isptrack,&p); isptrack++; isp++;
2587 fTracker[3]->UnloadClusters();
2588 fLoader[3]->UnloadRecPoints();
2592 //_____________________________________________________________________________
2593 void AliReconstruction::FillRawDataErrorLog(Int_t iEvent, AliESDEvent* esd)
2595 // The method reads the raw-data error log
2596 // accumulated within the rawReader.
2597 // It extracts the raw-data errors related to
2598 // the current event and stores them into
2599 // a TClonesArray inside the esd object.
2601 if (!fRawReader) return;
2603 for(Int_t i = 0; i < fRawReader->GetNumberOfErrorLogs(); i++) {
2605 AliRawDataErrorLog *log = fRawReader->GetErrorLog(i);
2607 if (iEvent != log->GetEventNumber()) continue;
2609 esd->AddRawDataErrorLog(log);
2614 TNamed* AliReconstruction::CopyFileToTNamed(TString fPath,TString fName){
2615 // Dump a file content into a char in TNamed
2617 in.open(fPath.Data(),ios::in | ios::binary|ios::ate);
2618 Int_t kBytes = (Int_t)in.tellg();
2619 printf("Size: %d \n",kBytes);
2622 char* memblock = new char [kBytes];
2623 in.seekg (0, ios::beg);
2624 in.read (memblock, kBytes);
2626 TString fData(memblock,kBytes);
2627 fn = new TNamed(fName,fData);
2628 printf("fData Size: %d \n",fData.Sizeof());
2629 printf("fName Size: %d \n",fName.Sizeof());
2630 printf("fn Size: %d \n",fn->Sizeof());
2634 AliInfo(Form("Could not Open %s\n",fPath.Data()));
2640 void AliReconstruction::TNamedToFile(TTree* fTree, TString fName){
2641 // This is not really needed in AliReconstruction at the moment
2642 // but can serve as a template
2644 TList *fList = fTree->GetUserInfo();
2645 TNamed *fn = (TNamed*)fList->FindObject(fName.Data());
2646 printf("fn Size: %d \n",fn->Sizeof());
2648 TString fTmp(fn->GetName()); // to be 100% sure in principle fName also works
2649 const char* cdata = fn->GetTitle();
2650 printf("fTmp Size %d\n",fTmp.Sizeof());
2652 int size = fn->Sizeof()-fTmp.Sizeof()-sizeof(UChar_t)-sizeof(Int_t); // see dfinition of TString::SizeOf()...
2653 printf("calculated size %d\n",size);
2654 ofstream out(fName.Data(),ios::out | ios::binary);
2655 out.write(cdata,size);
2660 //_____________________________________________________________________________
2661 AliQualAssDataMaker * AliReconstruction::GetQualAssDataMaker(Int_t iDet)
2663 // get the quality assurance data maker object and the loader for a detector
2665 if (fQualAssDataMaker[iDet])
2666 return fQualAssDataMaker[iDet];
2668 // load the QA data maker object
2669 TPluginManager* pluginManager = gROOT->GetPluginManager();
2670 TString detName = fgkDetectorName[iDet];
2671 TString qadmName = "Ali" + detName + "QualAssDataMaker";
2672 if (gAlice && !gAlice->GetDetector(detName) && (detName != "HLT"))
2675 AliQualAssDataMaker * qadm = NULL;
2676 // first check if a plugin is defined for the quality assurance data maker
2677 TPluginHandler* pluginHandler = pluginManager->FindHandler("AliQualAssDataMaker", detName);
2678 // if not, add a plugin for it
2679 if (!pluginHandler) {
2680 AliDebug(1, Form("defining plugin for %s", qadmName.Data()));
2681 TString libs = gSystem->GetLibraries();
2682 if (libs.Contains("lib" + detName + "base.so") ||
2683 (gSystem->Load("lib" + detName + "base.so") >= 0)) {
2684 pluginManager->AddHandler("AliQualAssDataMaker", detName,
2685 qadmName, detName + "qadm", qadmName + "()");
2687 pluginManager->AddHandler("AliQualAssDataMaker", detName,
2688 qadmName, detName, qadmName + "()");
2690 pluginHandler = pluginManager->FindHandler("AliQualAssDataMaker", detName);
2692 if (pluginHandler && (pluginHandler->LoadPlugin() == 0)) {
2693 qadm = (AliQualAssDataMaker *) pluginHandler->ExecPlugin(0);
2696 // TObject* obj = fOptions.FindObject(detName.Data());
2697 // if (obj) reconstructor->SetOption(obj->GetTitle());
2698 fQualAssDataMaker[iDet] = qadm;
2701 // get or create the loader
2702 fLoader[iDet] = fRunLoader->GetLoader(detName + "Loader");
2703 if (!fLoader[iDet]) {
2704 AliConfig::Instance()
2705 ->CreateDetectorFolders(fRunLoader->GetEventFolder(),
2707 // first check if a plugin is defined for the loader
2709 pluginManager->FindHandler("AliLoader", detName);
2710 // if not, add a plugin for it
2711 if (!pluginHandler) {
2712 TString loaderName = "Ali" + detName + "Loader";
2713 AliDebug(1, Form("defining plugin for %s", loaderName.Data()));
2714 pluginManager->AddHandler("AliLoader", detName,
2715 loaderName, detName + "base",
2716 loaderName + "(const char*, TFolder*)");
2717 pluginHandler = pluginManager->FindHandler("AliLoader", detName);
2719 if (pluginHandler && (pluginHandler->LoadPlugin() == 0)) {
2721 (AliLoader*) pluginHandler->ExecPlugin(2, detName.Data(),
2722 fRunLoader->GetEventFolder());
2724 if (!fLoader[iDet]) { // use default loader
2725 fLoader[iDet] = new AliLoader(detName, fRunLoader->GetEventFolder());
2727 if (!fLoader[iDet]) {
2728 AliWarning(Form("couldn't get loader for %s", detName.Data()));
2729 if (fStopOnError) return NULL;
2731 fRunLoader->AddLoader(fLoader[iDet]);
2732 fRunLoader->CdGAFile();
2733 if (gFile && !gFile->IsWritable()) gFile->ReOpen("UPDATE");
2734 fRunLoader->Write(0, TObject::kOverwrite);
2741 //_____________________________________________________________________________
2742 Bool_t AliReconstruction::RunQualAss(const char* detectors, AliESDEvent *& esd)
2744 // run the Quality Assurance data producer
2746 AliCodeTimerAuto("")
2747 TString detStr = detectors;
2748 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
2749 if (!IsSelected(fgkDetectorName[iDet], detStr))
2751 AliQualAssDataMaker * qadm = GetQualAssDataMaker(iDet);
2754 AliCodeTimerStart(Form("running quality assurance data maker for %s", fgkDetectorName[iDet]));
2755 AliInfo(Form("running quality assurance data maker for %s", fgkDetectorName[iDet]));
2757 qadm->SetData(esd) ;
2758 qadm->Exec(AliQualAss::kESDS) ;
2760 AliCodeTimerStop(Form("running quality assurance data maker for %s", fgkDetectorName[iDet]));
2762 if ((detStr.CompareTo("ALL") != 0) && !detStr.IsNull()) {
2763 AliError(Form("the following detectors were not found: %s",