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 "AliESDfriend.h"
137 #include "AliESDVertex.h"
138 #include "AliMultiplicity.h"
139 #include "AliTracker.h"
140 #include "AliVertexer.h"
141 #include "AliVertexerTracks.h"
142 #include "AliV0vertexer.h"
143 #include "AliCascadeVertexer.h"
144 #include "AliHeader.h"
145 #include "AliGenEventHeader.h"
147 #include "AliESDpid.h"
148 #include "AliESDtrack.h"
150 #include "AliRunTag.h"
151 #include "AliDetectorTag.h"
152 #include "AliEventTag.h"
154 #include "AliGeomManager.h"
155 #include "AliTrackPointArray.h"
156 #include "AliCDBManager.h"
157 #include "AliCDBEntry.h"
158 #include "AliAlignObj.h"
160 #include "AliCentralTrigger.h"
161 #include "AliCTPRawStream.h"
163 #include "AliAODEvent.h"
164 #include "AliAODHeader.h"
165 #include "AliAODTrack.h"
166 #include "AliAODVertex.h"
167 #include "AliAODCluster.h"
170 ClassImp(AliReconstruction)
173 //_____________________________________________________________________________
174 const char* AliReconstruction::fgkDetectorName[AliReconstruction::fgkNDetectors] = {"ITS", "TPC", "TRD", "TOF", "PHOS", "HMPID", "EMCAL", "MUON", "FMD", "ZDC", "PMD", "T0", "VZERO", "ACORDE", "HLT"};
176 //_____________________________________________________________________________
177 AliReconstruction::AliReconstruction(const char* gAliceFilename, const char* cdbUri,
178 const char* name, const char* title) :
181 fUniformField(kTRUE),
182 fRunVertexFinder(kTRUE),
183 fRunHLTTracking(kFALSE),
184 fRunMuonTracking(kFALSE),
185 fStopOnError(kFALSE),
186 fWriteAlignmentData(kFALSE),
187 fWriteESDfriend(kFALSE),
189 fFillTriggerESD(kTRUE),
191 fRunLocalReconstruction("ALL"),
194 fGAliceFileName(gAliceFilename),
199 fNumberOfEventsPerFile(1),
202 fLoadAlignFromCDB(kTRUE),
203 fLoadAlignData("ALL"),
210 fDiamondProfile(NULL),
212 fAlignObjArray(NULL),
216 // create reconstruction object with default parameters
218 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
219 fReconstructor[iDet] = NULL;
220 fLoader[iDet] = NULL;
221 fTracker[iDet] = NULL;
226 //_____________________________________________________________________________
227 AliReconstruction::AliReconstruction(const AliReconstruction& rec) :
230 fUniformField(rec.fUniformField),
231 fRunVertexFinder(rec.fRunVertexFinder),
232 fRunHLTTracking(rec.fRunHLTTracking),
233 fRunMuonTracking(rec.fRunMuonTracking),
234 fStopOnError(rec.fStopOnError),
235 fWriteAlignmentData(rec.fWriteAlignmentData),
236 fWriteESDfriend(rec.fWriteESDfriend),
237 fWriteAOD(rec.fWriteAOD),
238 fFillTriggerESD(rec.fFillTriggerESD),
240 fRunLocalReconstruction(rec.fRunLocalReconstruction),
241 fRunTracking(rec.fRunTracking),
242 fFillESD(rec.fFillESD),
243 fGAliceFileName(rec.fGAliceFileName),
245 fEquipIdMap(rec.fEquipIdMap),
246 fFirstEvent(rec.fFirstEvent),
247 fLastEvent(rec.fLastEvent),
248 fNumberOfEventsPerFile(rec.fNumberOfEventsPerFile),
251 fLoadAlignFromCDB(rec.fLoadAlignFromCDB),
252 fLoadAlignData(rec.fLoadAlignData),
253 fESDPar(rec.fESDPar),
259 fDiamondProfile(NULL),
261 fAlignObjArray(rec.fAlignObjArray),
262 fCDBUri(rec.fCDBUri),
267 for (Int_t i = 0; i < rec.fOptions.GetEntriesFast(); i++) {
268 if (rec.fOptions[i]) fOptions.Add(rec.fOptions[i]->Clone());
270 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
271 fReconstructor[iDet] = NULL;
272 fLoader[iDet] = NULL;
273 fTracker[iDet] = NULL;
275 for (Int_t i = 0; i < rec.fSpecCDBUri.GetEntriesFast(); i++) {
276 if (rec.fSpecCDBUri[i]) fSpecCDBUri.Add(rec.fSpecCDBUri[i]->Clone());
280 //_____________________________________________________________________________
281 AliReconstruction& AliReconstruction::operator = (const AliReconstruction& rec)
283 // assignment operator
285 this->~AliReconstruction();
286 new(this) AliReconstruction(rec);
290 //_____________________________________________________________________________
291 AliReconstruction::~AliReconstruction()
297 fSpecCDBUri.Delete();
299 AliCodeTimer::Instance()->Print();
302 //_____________________________________________________________________________
303 void AliReconstruction::InitCDBStorage()
305 // activate a default CDB storage
306 // First check if we have any CDB storage set, because it is used
307 // to retrieve the calibration and alignment constants
309 AliCDBManager* man = AliCDBManager::Instance();
310 if (man->IsDefaultStorageSet())
312 AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
313 AliWarning("Default CDB storage has been already set !");
314 AliWarning(Form("Ignoring the default storage declared in AliReconstruction: %s",fCDBUri.Data()));
315 AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
319 AliDebug(2, "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
320 AliDebug(2, Form("Default CDB storage is set to: %s",fCDBUri.Data()));
321 AliDebug(2, "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
322 man->SetDefaultStorage(fCDBUri);
325 // Now activate the detector specific CDB storage locations
326 for (Int_t i = 0; i < fSpecCDBUri.GetEntriesFast(); i++) {
327 TObject* obj = fSpecCDBUri[i];
329 AliDebug(2, "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
330 AliDebug(2, Form("Specific CDB storage for %s is set to: %s",obj->GetName(),obj->GetTitle()));
331 AliDebug(2, "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
332 man->SetSpecificStorage(obj->GetName(), obj->GetTitle());
337 //_____________________________________________________________________________
338 void AliReconstruction::SetDefaultStorage(const char* uri) {
339 // Store the desired default CDB storage location
340 // Activate it later within the Run() method
346 //_____________________________________________________________________________
347 void AliReconstruction::SetSpecificStorage(const char* calibType, const char* uri) {
348 // Store a detector-specific CDB storage location
349 // Activate it later within the Run() method
351 AliCDBPath aPath(calibType);
352 if(!aPath.IsValid()){
353 // if calibType is not wildcard but it is a valid detector, add "/*" to make it a valid path
354 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
355 if(!strcmp(calibType, fgkDetectorName[iDet])) {
356 aPath.SetPath(Form("%s/*", calibType));
357 AliInfo(Form("Path for specific storage set to %s", aPath.GetPath().Data()));
361 if(!aPath.IsValid()){
362 AliError(Form("Not a valid path or detector: %s", calibType));
367 // check that calibType refers to a "valid" detector name
368 Bool_t isDetector = kFALSE;
369 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
370 TString detName = fgkDetectorName[iDet];
371 if(aPath.GetLevel0() == detName) {
378 AliError(Form("Not a valid detector: %s", aPath.GetLevel0().Data()));
382 TObject* obj = fSpecCDBUri.FindObject(aPath.GetPath().Data());
383 if (obj) fSpecCDBUri.Remove(obj);
384 fSpecCDBUri.Add(new TNamed(aPath.GetPath().Data(), uri));
391 //_____________________________________________________________________________
392 Bool_t AliReconstruction::SetRunNumber()
394 // The method is called in Run() in order
395 // to set a correct run number.
396 // In case of raw data reconstruction the
397 // run number is taken from the raw data header
399 if(AliCDBManager::Instance()->GetRun() < 0) {
401 AliError("No run loader is found !");
404 // read run number from gAlice
405 if(fRunLoader->GetAliRun())
406 AliCDBManager::Instance()->SetRun(fRunLoader->GetAliRun()->GetRunNumber());
409 if(fRawReader->NextEvent()) {
410 AliCDBManager::Instance()->SetRun(fRawReader->GetRunNumber());
411 fRawReader->RewindEvents();
414 AliError("No raw-data events found !");
419 AliError("Neither gAlice nor RawReader objects are found !");
423 AliInfo(Form("CDB Run number: %d",AliCDBManager::Instance()->GetRun()));
428 //_____________________________________________________________________________
429 Bool_t AliReconstruction::MisalignGeometry(const TString& detectors)
431 // Read the alignment objects from CDB.
432 // Each detector is supposed to have the
433 // alignment objects in DET/Align/Data CDB path.
434 // All the detector objects are then collected,
435 // sorted by geometry level (starting from ALIC) and
436 // then applied to the TGeo geometry.
437 // Finally an overlaps check is performed.
439 // Load alignment data from CDB and fill fAlignObjArray
440 if(fLoadAlignFromCDB){
442 TString detStr = detectors;
443 TString loadAlObjsListOfDets = "";
445 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
446 if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
447 loadAlObjsListOfDets += fgkDetectorName[iDet];
448 loadAlObjsListOfDets += " ";
449 } // end loop over detectors
450 AliGeomManager::ApplyAlignObjsFromCDB(loadAlObjsListOfDets.Data());
452 // Check if the array with alignment objects was
453 // provided by the user. If yes, apply the objects
454 // to the present TGeo geometry
455 if (fAlignObjArray) {
456 if (gGeoManager && gGeoManager->IsClosed()) {
457 if (AliGeomManager::ApplyAlignObjsToGeom(*fAlignObjArray) == kFALSE) {
458 AliError("The misalignment of one or more volumes failed!"
459 "Compare the list of simulated detectors and the list of detector alignment data!");
464 AliError("Can't apply the misalignment! gGeoManager doesn't exist or it is still opened!");
470 delete fAlignObjArray; fAlignObjArray=0;
475 //_____________________________________________________________________________
476 void AliReconstruction::SetGAliceFile(const char* fileName)
478 // set the name of the galice file
480 fGAliceFileName = fileName;
483 //_____________________________________________________________________________
484 void AliReconstruction::SetOption(const char* detector, const char* option)
486 // set options for the reconstruction of a detector
488 TObject* obj = fOptions.FindObject(detector);
489 if (obj) fOptions.Remove(obj);
490 fOptions.Add(new TNamed(detector, option));
494 //_____________________________________________________________________________
495 Bool_t AliReconstruction::Run(const char* input)
497 // run the reconstruction
502 if (!input) input = fInput.Data();
503 TString fileName(input);
504 if (fileName.EndsWith("/")) {
505 fRawReader = new AliRawReaderFile(fileName);
506 } else if (fileName.EndsWith(".root")) {
507 fRawReader = new AliRawReaderRoot(fileName);
508 } else if (!fileName.IsNull()) {
509 fRawReader = new AliRawReaderDate(fileName);
510 fRawReader->SelectEvents(7);
512 if (!fEquipIdMap.IsNull() && fRawReader)
513 fRawReader->LoadEquipmentIdsMap(fEquipIdMap);
516 // get the run loader
517 if (!InitRunLoader()) return kFALSE;
519 // Initialize the CDB storage
522 // Set run number in CDBManager (if it is not already set by the user)
523 if (!SetRunNumber()) if (fStopOnError) return kFALSE;
525 // Import ideal TGeo geometry and apply misalignment
527 TString geom(gSystem->DirName(fGAliceFileName));
528 geom += "/geometry.root";
529 AliGeomManager::LoadGeometry(geom.Data());
530 if (!gGeoManager) if (fStopOnError) return kFALSE;
533 AliCDBManager* man = AliCDBManager::Instance();
534 if (!MisalignGeometry(fLoadAlignData)) if (fStopOnError) return kFALSE;
536 // local reconstruction
537 if (!fRunLocalReconstruction.IsNull()) {
538 if (!RunLocalReconstruction(fRunLocalReconstruction)) {
539 if (fStopOnError) {CleanUp(); return kFALSE;}
542 // if (!fRunVertexFinder && fRunTracking.IsNull() &&
543 // fFillESD.IsNull()) return kTRUE;
546 if (fRunVertexFinder && !CreateVertexer()) {
554 if (!fRunTracking.IsNull() && !CreateTrackers(fRunTracking)) {
561 // get the possibly already existing ESD file and tree
562 AliESDEvent* esd = new AliESDEvent(); AliESDEvent* hltesd = new AliESDEvent();
563 TFile* fileOld = NULL;
564 TTree* treeOld = NULL; TTree *hlttreeOld = NULL;
565 if (!gSystem->AccessPathName("AliESDs.root")){
566 gSystem->CopyFile("AliESDs.root", "AliESDs.old.root", kTRUE);
567 fileOld = TFile::Open("AliESDs.old.root");
568 if (fileOld && fileOld->IsOpen()) {
569 treeOld = (TTree*) fileOld->Get("esdTree");
570 if (treeOld)esd->ReadFromTree(treeOld);
571 hlttreeOld = (TTree*) fileOld->Get("HLTesdTree");
572 if (hlttreeOld) hltesd->ReadFromTree(hlttreeOld);
576 // create the ESD output file and tree
577 TFile* file = TFile::Open("AliESDs.root", "RECREATE");
578 file->SetCompressionLevel(2);
579 if (!file->IsOpen()) {
580 AliError("opening AliESDs.root failed");
581 if (fStopOnError) {CleanUp(file, fileOld); return kFALSE;}
584 TTree* tree = new TTree("esdTree", "Tree with ESD objects");
585 esd = new AliESDEvent();
586 esd->CreateStdContent();
587 esd->WriteToTree(tree);
589 TTree* hlttree = new TTree("HLTesdTree", "Tree with HLT ESD objects");
590 hltesd = new AliESDEvent();
591 hltesd->CreateStdContent();
592 hltesd->WriteToTree(hlttree);
595 delete esd; delete hltesd;
596 esd = NULL; hltesd = NULL;
598 // create the branch with ESD additions
602 AliESDfriend *esdf = 0;
603 if (fWriteESDfriend) {
604 esdf = new AliESDfriend();
605 TBranch *br=tree->Branch("ESDfriend.","AliESDfriend", &esdf);
606 br->SetFile("AliESDfriends.root");
607 esd->AddObject(esdf);
611 // Get the diamond profile from OCDB
612 AliCDBEntry* entry = AliCDBManager::Instance()
613 ->Get("GRP/Calib/MeanVertex");
616 fDiamondProfile = dynamic_cast<AliESDVertex*> (entry->GetObject());
618 AliError("No diamond profile found in OCDB!");
621 AliVertexerTracks tVertexer(AliTracker::GetBz());
622 if(fDiamondProfile) tVertexer.SetVtxStart(fDiamondProfile);
625 if (fRawReader) fRawReader->RewindEvents();
627 for (Int_t iEvent = 0; iEvent < fRunLoader->GetNumberOfEvents(); iEvent++) {
628 if (fRawReader) fRawReader->NextEvent();
629 if ((iEvent < fFirstEvent) || ((fLastEvent >= 0) && (iEvent > fLastEvent))) {
630 // copy old ESD to the new one
632 esd->ReadFromTree(treeOld);
633 treeOld->GetEntry(iEvent);
637 esd->ReadFromTree(hlttreeOld);
638 hlttreeOld->GetEntry(iEvent);
644 AliInfo(Form("processing event %d", iEvent));
645 fRunLoader->GetEvent(iEvent);
648 sprintf(aFileName, "ESD_%d.%d_final.root",
649 fRunLoader->GetHeader()->GetRun(),
650 fRunLoader->GetHeader()->GetEventNrInRun());
651 if (!gSystem->AccessPathName(aFileName)) continue;
653 // local reconstruction
654 if (!fRunLocalReconstruction.IsNull()) {
655 if (!RunLocalEventReconstruction(fRunLocalReconstruction)) {
656 if (fStopOnError) {CleanUp(file, fileOld); return kFALSE;}
661 esd->SetRunNumber(fRunLoader->GetHeader()->GetRun());
662 hltesd->SetRunNumber(fRunLoader->GetHeader()->GetRun());
663 esd->SetEventNumberInFile(fRunLoader->GetHeader()->GetEventNrInRun());
664 hltesd->SetEventNumberInFile(fRunLoader->GetHeader()->GetEventNrInRun());
666 // Set magnetic field from the tracker
667 esd->SetMagneticField(AliTracker::GetBz());
668 hltesd->SetMagneticField(AliTracker::GetBz());
672 // Fill raw-data error log into the ESD
673 if (fRawReader) FillRawDataErrorLog(iEvent,esd);
676 if (fRunVertexFinder) {
677 if (!ReadESD(esd, "vertex")) {
678 if (!RunVertexFinder(esd)) {
679 if (fStopOnError) {CleanUp(file, fileOld); return kFALSE;}
681 if (fCheckPointLevel > 0) WriteESD(esd, "vertex");
686 if (!fRunTracking.IsNull()) {
687 if (fRunHLTTracking) {
688 hltesd->SetVertex(esd->GetVertex());
689 if (!RunHLTTracking(hltesd)) {
690 if (fStopOnError) {CleanUp(file, fileOld); return kFALSE;}
696 if (!fRunTracking.IsNull()) {
697 if (fRunMuonTracking) {
698 if (!RunMuonTracking(esd)) {
699 if (fStopOnError) {CleanUp(file, fileOld); return kFALSE;}
705 if (!fRunTracking.IsNull()) {
706 if (!ReadESD(esd, "tracking")) {
707 if (!RunTracking(esd)) {
708 if (fStopOnError) {CleanUp(file, fileOld); return kFALSE;}
710 if (fCheckPointLevel > 0) WriteESD(esd, "tracking");
715 if (!fFillESD.IsNull()) {
716 if (!FillESD(esd, fFillESD)) {
717 if (fStopOnError) {CleanUp(file, fileOld); return kFALSE;}
720 // fill Event header information from the RawEventHeader
721 if (fRawReader){FillRawEventHeaderESD(esd);}
724 AliESDpid::MakePID(esd);
725 if (fCheckPointLevel > 1) WriteESD(esd, "PID");
727 if (fFillTriggerESD) {
728 if (!ReadESD(esd, "trigger")) {
729 if (!FillTriggerESD(esd)) {
730 if (fStopOnError) {CleanUp(file, fileOld); return kFALSE;}
732 if (fCheckPointLevel > 1) WriteESD(esd, "trigger");
736 //Try to improve the reconstructed primary vertex position using the tracks
737 AliESDVertex *pvtx=0;
738 Bool_t dovertex=kTRUE;
739 TObject* obj = fOptions.FindObject("ITS");
741 TString optITS = obj->GetTitle();
742 if (optITS.Contains("cosmics") || optITS.Contains("COSMICS"))
745 if(dovertex) pvtx=tVertexer.FindPrimaryVertex(esd);
746 if(fDiamondProfile) esd->SetDiamond(fDiamondProfile);
749 if (pvtx->GetStatus()) {
750 // Store the improved primary vertex
751 esd->SetPrimaryVertex(pvtx);
752 // Propagate the tracks to the DCA to the improved primary vertex
753 Double_t somethingbig = 777.;
754 Double_t bz = esd->GetMagneticField();
755 Int_t nt=esd->GetNumberOfTracks();
757 AliESDtrack *t = esd->GetTrack(nt);
758 t->RelateToVertex(pvtx, bz, somethingbig);
765 vtxer.Tracks2V0vertices(esd);
768 AliCascadeVertexer cvtxer;
769 cvtxer.V0sTracks2CascadeVertices(esd);
773 if (fWriteESDfriend) {
774 new (esdf) AliESDfriend(); // Reset...
775 esd->GetESDfriend(esdf);
782 if (fCheckPointLevel > 0) WriteESD(esd, "final");
785 if (fWriteESDfriend) {
786 new (esdf) AliESDfriend(); // Reset...
789 // delete esdf; esdf = 0;
795 tree->GetUserInfo()->Add(esd);
796 hlttree->GetUserInfo()->Add(hltesd);
800 if(fESDPar.Contains("ESD.par")){
801 AliInfo("Attaching ESD.par to Tree");
802 TNamed *fn = CopyFileToTNamed(fESDPar.Data(),"ESD.par");
803 tree->GetUserInfo()->Add(fn);
809 tree->SetBranchStatus("ESDfriend*",0);
814 TFile *aodFile = TFile::Open("AliAOD.root", "RECREATE");
815 ESDFile2AODFile(file, aodFile);
820 CleanUp(file, fileOld);
822 // Create tags for the events in the ESD tree (the ESD tree is always present)
823 // In case of empty events the tags will contain dummy values
824 CreateTag("AliESDs.root");
831 //_____________________________________________________________________________
832 Bool_t AliReconstruction::RunLocalReconstruction(const TString& detectors)
834 // run the local reconstruction
838 AliCDBManager* man = AliCDBManager::Instance();
839 Bool_t origCache = man->GetCacheFlag();
841 TString detStr = detectors;
842 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
843 if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
844 AliReconstructor* reconstructor = GetReconstructor(iDet);
845 if (!reconstructor) continue;
846 if (reconstructor->HasLocalReconstruction()) continue;
848 AliCodeTimerStart(Form("running reconstruction for %s", fgkDetectorName[iDet]));
849 AliInfo(Form("running reconstruction for %s", fgkDetectorName[iDet]));
851 AliCodeTimerStart(Form("Loading calibration data from OCDB for %s", fgkDetectorName[iDet]));
852 AliInfo(Form("Loading calibration data from OCDB for %s", fgkDetectorName[iDet]));
854 man->SetCacheFlag(kTRUE);
855 TString calibPath = Form("%s/Calib/*", fgkDetectorName[iDet]);
856 man->GetAll(calibPath); // entries are cached!
858 AliCodeTimerStop(Form("Loading calibration data from OCDB for %s", fgkDetectorName[iDet]));
861 fRawReader->RewindEvents();
862 reconstructor->Reconstruct(fRunLoader, fRawReader);
864 reconstructor->Reconstruct(fRunLoader);
867 AliCodeTimerStop(Form("running reconstruction for %s", fgkDetectorName[iDet]));
869 // unload calibration data
870 man->UnloadFromCache(calibPath);
874 man->SetCacheFlag(origCache);
876 if ((detStr.CompareTo("ALL") != 0) && !detStr.IsNull()) {
877 AliError(Form("the following detectors were not found: %s",
879 if (fStopOnError) return kFALSE;
885 //_____________________________________________________________________________
886 Bool_t AliReconstruction::RunLocalEventReconstruction(const TString& detectors)
888 // run the local reconstruction
892 TString detStr = detectors;
893 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
894 if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
895 AliReconstructor* reconstructor = GetReconstructor(iDet);
896 if (!reconstructor) continue;
897 AliLoader* loader = fLoader[iDet];
899 // conversion of digits
900 if (fRawReader && reconstructor->HasDigitConversion()) {
901 AliInfo(Form("converting raw data digits into root objects for %s",
902 fgkDetectorName[iDet]));
903 AliCodeTimerAuto(Form("converting raw data digits into root objects for %s",
904 fgkDetectorName[iDet]));
905 loader->LoadDigits("update");
906 loader->CleanDigits();
907 loader->MakeDigitsContainer();
908 TTree* digitsTree = loader->TreeD();
909 reconstructor->ConvertDigits(fRawReader, digitsTree);
910 loader->WriteDigits("OVERWRITE");
911 loader->UnloadDigits();
914 // local reconstruction
915 if (!reconstructor->HasLocalReconstruction()) continue;
916 AliInfo(Form("running reconstruction for %s", fgkDetectorName[iDet]));
917 AliCodeTimerAuto(Form("running reconstruction for %s", fgkDetectorName[iDet]));
918 loader->LoadRecPoints("update");
919 loader->CleanRecPoints();
920 loader->MakeRecPointsContainer();
921 TTree* clustersTree = loader->TreeR();
922 if (fRawReader && !reconstructor->HasDigitConversion()) {
923 reconstructor->Reconstruct(fRawReader, clustersTree);
925 loader->LoadDigits("read");
926 TTree* digitsTree = loader->TreeD();
928 AliError(Form("Can't get the %s digits tree", fgkDetectorName[iDet]));
929 if (fStopOnError) return kFALSE;
931 reconstructor->Reconstruct(digitsTree, clustersTree);
933 loader->UnloadDigits();
935 loader->WriteRecPoints("OVERWRITE");
936 loader->UnloadRecPoints();
939 if ((detStr.CompareTo("ALL") != 0) && !detStr.IsNull()) {
940 AliError(Form("the following detectors were not found: %s",
942 if (fStopOnError) return kFALSE;
948 //_____________________________________________________________________________
949 Bool_t AliReconstruction::RunVertexFinder(AliESDEvent*& esd)
951 // run the barrel tracking
955 AliESDVertex* vertex = NULL;
956 Double_t vtxPos[3] = {0, 0, 0};
957 Double_t vtxErr[3] = {0.07, 0.07, 0.1};
959 if (fRunLoader->GetHeader() && fRunLoader->GetHeader()->GenEventHeader()) {
960 fRunLoader->GetHeader()->GenEventHeader()->PrimaryVertex(mcVertex);
961 for (Int_t i = 0; i < 3; i++) vtxPos[i] = mcVertex[i];
965 if(fDiamondProfile) fVertexer->SetVtxStart(fDiamondProfile);
966 AliInfo("running the ITS vertex finder");
967 if (fLoader[0]) fLoader[0]->LoadRecPoints();
968 vertex = fVertexer->FindVertexForCurrentEvent(fRunLoader->GetEventNumber());
969 if (fLoader[0]) fLoader[0]->UnloadRecPoints();
971 AliWarning("Vertex not found");
972 vertex = new AliESDVertex();
973 vertex->SetName("default");
976 vertex->SetName("reconstructed");
980 AliInfo("getting the primary vertex from MC");
981 vertex = new AliESDVertex(vtxPos, vtxErr);
985 vertex->GetXYZ(vtxPos);
986 vertex->GetSigmaXYZ(vtxErr);
988 AliWarning("no vertex reconstructed");
989 vertex = new AliESDVertex(vtxPos, vtxErr);
991 esd->SetVertex(vertex);
992 // if SPD multiplicity has been determined, it is stored in the ESD
993 AliMultiplicity *mult = fVertexer->GetMultiplicity();
994 if(mult)esd->SetMultiplicity(mult);
996 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
997 if (fTracker[iDet]) fTracker[iDet]->SetVertex(vtxPos, vtxErr);
1004 //_____________________________________________________________________________
1005 Bool_t AliReconstruction::RunHLTTracking(AliESDEvent*& esd)
1007 // run the HLT barrel tracking
1009 AliCodeTimerAuto("")
1012 AliError("Missing runLoader!");
1016 AliInfo("running HLT tracking");
1018 // Get a pointer to the HLT reconstructor
1019 AliReconstructor *reconstructor = GetReconstructor(fgkNDetectors-1);
1020 if (!reconstructor) return kFALSE;
1023 for (Int_t iDet = 1; iDet >= 0; iDet--) {
1024 TString detName = fgkDetectorName[iDet];
1025 AliDebug(1, Form("%s HLT tracking", detName.Data()));
1026 reconstructor->SetOption(detName.Data());
1027 AliTracker *tracker = reconstructor->CreateTracker(fRunLoader);
1029 AliWarning(Form("couldn't create a HLT tracker for %s", detName.Data()));
1030 if (fStopOnError) return kFALSE;
1034 Double_t vtxErr[3]={0.005,0.005,0.010};
1035 const AliESDVertex *vertex = esd->GetVertex();
1036 vertex->GetXYZ(vtxPos);
1037 tracker->SetVertex(vtxPos,vtxErr);
1039 fLoader[iDet]->LoadRecPoints("read");
1040 TTree* tree = fLoader[iDet]->TreeR();
1042 AliError(Form("Can't get the %s cluster tree", detName.Data()));
1045 tracker->LoadClusters(tree);
1047 if (tracker->Clusters2Tracks(esd) != 0) {
1048 AliError(Form("HLT %s Clusters2Tracks failed", fgkDetectorName[iDet]));
1052 tracker->UnloadClusters();
1060 //_____________________________________________________________________________
1061 Bool_t AliReconstruction::RunMuonTracking(AliESDEvent*& esd)
1063 // run the muon spectrometer tracking
1065 AliCodeTimerAuto("")
1068 AliError("Missing runLoader!");
1071 Int_t iDet = 7; // for MUON
1073 AliInfo("is running...");
1075 // Get a pointer to the MUON reconstructor
1076 AliReconstructor *reconstructor = GetReconstructor(iDet);
1077 if (!reconstructor) return kFALSE;
1080 TString detName = fgkDetectorName[iDet];
1081 AliDebug(1, Form("%s tracking", detName.Data()));
1082 AliTracker *tracker = reconstructor->CreateTracker(fRunLoader);
1084 AliWarning(Form("couldn't create a tracker for %s", detName.Data()));
1089 fLoader[iDet]->LoadTracks("update");
1090 fLoader[iDet]->CleanTracks();
1091 fLoader[iDet]->MakeTracksContainer();
1094 fLoader[iDet]->LoadRecPoints("read");
1095 tracker->LoadClusters(fLoader[iDet]->TreeR());
1097 Int_t rv = tracker->Clusters2Tracks(esd);
1099 fLoader[iDet]->UnloadRecPoints();
1103 AliError(Form("%s Clusters2Tracks failed", fgkDetectorName[iDet]));
1107 tracker->UnloadClusters();
1109 fLoader[iDet]->UnloadRecPoints();
1111 fLoader[iDet]->WriteTracks("OVERWRITE");
1112 fLoader[iDet]->UnloadTracks();
1120 //_____________________________________________________________________________
1121 Bool_t AliReconstruction::RunTracking(AliESDEvent*& esd)
1123 // run the barrel tracking
1125 AliCodeTimerAuto("")
1127 AliInfo("running tracking");
1129 //Fill the ESD with the T0 info (will be used by the TOF)
1130 if (fReconstructor[11])
1131 GetReconstructor(11)->FillESD(fRunLoader, esd);
1133 // pass 1: TPC + ITS inwards
1134 for (Int_t iDet = 1; iDet >= 0; iDet--) {
1135 if (!fTracker[iDet]) continue;
1136 AliDebug(1, Form("%s tracking", fgkDetectorName[iDet]));
1139 fLoader[iDet]->LoadRecPoints("read");
1140 TTree* tree = fLoader[iDet]->TreeR();
1142 AliError(Form("Can't get the %s cluster tree", fgkDetectorName[iDet]));
1145 fTracker[iDet]->LoadClusters(tree);
1148 if (fTracker[iDet]->Clusters2Tracks(esd) != 0) {
1149 AliError(Form("%s Clusters2Tracks failed", fgkDetectorName[iDet]));
1152 if (fCheckPointLevel > 1) {
1153 WriteESD(esd, Form("%s.tracking", fgkDetectorName[iDet]));
1155 // preliminary PID in TPC needed by the ITS tracker
1157 GetReconstructor(1)->FillESD(fRunLoader, esd);
1158 GetReconstructor(1)->FillESD((TTree*)NULL, (TTree*)NULL, esd);
1159 AliESDpid::MakePID(esd);
1163 // pass 2: ALL backwards
1164 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
1165 if (!fTracker[iDet]) continue;
1166 AliDebug(1, Form("%s back propagation", fgkDetectorName[iDet]));
1169 if (iDet > 1) { // all except ITS, TPC
1171 fLoader[iDet]->LoadRecPoints("read");
1172 tree = fLoader[iDet]->TreeR();
1174 AliError(Form("Can't get the %s cluster tree", fgkDetectorName[iDet]));
1177 fTracker[iDet]->LoadClusters(tree);
1181 if (fTracker[iDet]->PropagateBack(esd) != 0) {
1182 AliError(Form("%s backward propagation failed", fgkDetectorName[iDet]));
1185 if (fCheckPointLevel > 1) {
1186 WriteESD(esd, Form("%s.back", fgkDetectorName[iDet]));
1190 if (iDet > 2) { // all except ITS, TPC, TRD
1191 fTracker[iDet]->UnloadClusters();
1192 fLoader[iDet]->UnloadRecPoints();
1194 // updated PID in TPC needed by the ITS tracker -MI
1196 GetReconstructor(1)->FillESD(fRunLoader, esd);
1197 GetReconstructor(1)->FillESD((TTree*)NULL, (TTree*)NULL, esd);
1198 AliESDpid::MakePID(esd);
1202 // write space-points to the ESD in case alignment data output
1204 if (fWriteAlignmentData)
1205 WriteAlignmentData(esd);
1207 // pass 3: TRD + TPC + ITS refit inwards
1208 for (Int_t iDet = 2; iDet >= 0; iDet--) {
1209 if (!fTracker[iDet]) continue;
1210 AliDebug(1, Form("%s inward refit", fgkDetectorName[iDet]));
1213 if (fTracker[iDet]->RefitInward(esd) != 0) {
1214 AliError(Form("%s inward refit failed", fgkDetectorName[iDet]));
1217 if (fCheckPointLevel > 1) {
1218 WriteESD(esd, Form("%s.refit", fgkDetectorName[iDet]));
1222 fTracker[iDet]->UnloadClusters();
1223 fLoader[iDet]->UnloadRecPoints();
1226 // Propagate track to the vertex - if not done by ITS
1228 Int_t ntracks = esd->GetNumberOfTracks();
1229 for (Int_t itrack=0; itrack<ntracks; itrack++){
1230 const Double_t kRadius = 3; // beam pipe radius
1231 const Double_t kMaxStep = 5; // max step
1232 const Double_t kMaxD = 123456; // max distance to prim vertex
1233 Double_t fieldZ = AliTracker::GetBz(); //
1234 AliESDtrack * track = esd->GetTrack(itrack);
1235 if (!track) continue;
1236 if (track->IsOn(AliESDtrack::kITSrefit)) continue;
1237 track->PropagateTo(kRadius, fieldZ, track->GetMass(),kMaxStep,kTRUE);
1238 track->RelateToVertex(esd->GetVertex(),fieldZ, kMaxD);
1244 //_____________________________________________________________________________
1245 Bool_t AliReconstruction::FillESD(AliESDEvent*& esd, const TString& detectors)
1247 // fill the event summary data
1249 AliCodeTimerAuto("")
1251 TString detStr = detectors;
1252 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
1253 if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
1254 AliReconstructor* reconstructor = GetReconstructor(iDet);
1255 if (!reconstructor) continue;
1257 if (!ReadESD(esd, fgkDetectorName[iDet])) {
1258 AliDebug(1, Form("filling ESD for %s", fgkDetectorName[iDet]));
1259 TTree* clustersTree = NULL;
1260 if (reconstructor->HasLocalReconstruction() && fLoader[iDet]) {
1261 fLoader[iDet]->LoadRecPoints("read");
1262 clustersTree = fLoader[iDet]->TreeR();
1263 if (!clustersTree) {
1264 AliError(Form("Can't get the %s clusters tree",
1265 fgkDetectorName[iDet]));
1266 if (fStopOnError) return kFALSE;
1269 if (fRawReader && !reconstructor->HasDigitConversion()) {
1270 reconstructor->FillESD(fRawReader, clustersTree, esd);
1272 TTree* digitsTree = NULL;
1273 if (fLoader[iDet]) {
1274 fLoader[iDet]->LoadDigits("read");
1275 digitsTree = fLoader[iDet]->TreeD();
1277 AliError(Form("Can't get the %s digits tree",
1278 fgkDetectorName[iDet]));
1279 if (fStopOnError) return kFALSE;
1282 reconstructor->FillESD(digitsTree, clustersTree, esd);
1283 if (fLoader[iDet]) fLoader[iDet]->UnloadDigits();
1285 if (reconstructor->HasLocalReconstruction() && fLoader[iDet]) {
1286 fLoader[iDet]->UnloadRecPoints();
1290 reconstructor->FillESD(fRunLoader, fRawReader, esd);
1292 reconstructor->FillESD(fRunLoader, esd);
1294 if (fCheckPointLevel > 2) WriteESD(esd, fgkDetectorName[iDet]);
1298 if ((detStr.CompareTo("ALL") != 0) && !detStr.IsNull()) {
1299 AliError(Form("the following detectors were not found: %s",
1301 if (fStopOnError) return kFALSE;
1307 //_____________________________________________________________________________
1308 Bool_t AliReconstruction::FillTriggerESD(AliESDEvent*& esd)
1310 // Reads the trigger decision which is
1311 // stored in Trigger.root file and fills
1312 // the corresponding esd entries
1314 AliCodeTimerAuto("")
1316 AliInfo("Filling trigger information into the ESD");
1319 AliCTPRawStream input(fRawReader);
1320 if (!input.Next()) {
1321 AliError("No valid CTP (trigger) DDL raw data is found ! The trigger information is not stored in the ESD !");
1324 esd->SetTriggerMask(input.GetClassMask());
1325 esd->SetTriggerCluster(input.GetClusterMask());
1328 AliRunLoader *runloader = AliRunLoader::GetRunLoader();
1330 if (!runloader->LoadTrigger()) {
1331 AliCentralTrigger *aCTP = runloader->GetTrigger();
1332 esd->SetTriggerMask(aCTP->GetClassMask());
1333 esd->SetTriggerCluster(aCTP->GetClusterMask());
1336 AliWarning("No trigger can be loaded! The trigger information is not stored in the ESD !");
1341 AliError("No run loader is available! The trigger information is not stored in the ESD !");
1353 //_____________________________________________________________________________
1354 Bool_t AliReconstruction::FillRawEventHeaderESD(AliESDEvent*& esd)
1357 // Filling information from RawReader Header
1360 AliInfo("Filling information from RawReader Header");
1361 esd->SetBunchCrossNumber(0);
1362 esd->SetOrbitNumber(0);
1363 esd->SetPeriodNumber(0);
1364 esd->SetTimeStamp(0);
1365 esd->SetEventType(0);
1366 const AliRawEventHeaderBase * eventHeader = fRawReader->GetEventHeader();
1369 const UInt_t *id = eventHeader->GetP("Id");
1370 esd->SetBunchCrossNumber((id)[1]&0x00000fff);
1371 esd->SetOrbitNumber((((id)[0]<<20)&0xf00000)|(((id)[1]>>12)&0xfffff));
1372 esd->SetPeriodNumber(((id)[0]>>4)&0x0fffffff);
1374 esd->SetTimeStamp((eventHeader->Get("Timestamp")));
1375 esd->SetEventType((eventHeader->Get("Type")));
1382 //_____________________________________________________________________________
1383 Bool_t AliReconstruction::IsSelected(TString detName, TString& detectors) const
1385 // check whether detName is contained in detectors
1386 // if yes, it is removed from detectors
1388 // check if all detectors are selected
1389 if ((detectors.CompareTo("ALL") == 0) ||
1390 detectors.BeginsWith("ALL ") ||
1391 detectors.EndsWith(" ALL") ||
1392 detectors.Contains(" ALL ")) {
1397 // search for the given detector
1398 Bool_t result = kFALSE;
1399 if ((detectors.CompareTo(detName) == 0) ||
1400 detectors.BeginsWith(detName+" ") ||
1401 detectors.EndsWith(" "+detName) ||
1402 detectors.Contains(" "+detName+" ")) {
1403 detectors.ReplaceAll(detName, "");
1407 // clean up the detectors string
1408 while (detectors.Contains(" ")) detectors.ReplaceAll(" ", " ");
1409 while (detectors.BeginsWith(" ")) detectors.Remove(0, 1);
1410 while (detectors.EndsWith(" ")) detectors.Remove(detectors.Length()-1, 1);
1415 //_____________________________________________________________________________
1416 Bool_t AliReconstruction::InitRunLoader()
1418 // get or create the run loader
1420 if (gAlice) delete gAlice;
1423 if (!gSystem->AccessPathName(fGAliceFileName.Data())) { // galice.root exists
1424 // load all base libraries to get the loader classes
1425 TString libs = gSystem->GetLibraries();
1426 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
1427 TString detName = fgkDetectorName[iDet];
1428 if (detName == "HLT") continue;
1429 if (libs.Contains("lib" + detName + "base.so")) continue;
1430 gSystem->Load("lib" + detName + "base.so");
1432 fRunLoader = AliRunLoader::Open(fGAliceFileName.Data());
1434 AliError(Form("no run loader found in file %s", fGAliceFileName.Data()));
1438 fRunLoader->CdGAFile();
1439 if (gFile->GetKey(AliRunLoader::GetGAliceName())) {
1440 if (fRunLoader->LoadgAlice() == 0) {
1441 gAlice = fRunLoader->GetAliRun();
1442 AliTracker::SetFieldMap(gAlice->Field(),fUniformField);
1445 if (!gAlice && !fRawReader) {
1446 AliError(Form("no gAlice object found in file %s",
1447 fGAliceFileName.Data()));
1452 } else { // galice.root does not exist
1454 AliError(Form("the file %s does not exist", fGAliceFileName.Data()));
1458 fRunLoader = AliRunLoader::Open(fGAliceFileName.Data(),
1459 AliConfig::GetDefaultEventFolderName(),
1462 AliError(Form("could not create run loader in file %s",
1463 fGAliceFileName.Data()));
1467 fRunLoader->MakeTree("E");
1469 while (fRawReader->NextEvent()) {
1470 fRunLoader->SetEventNumber(iEvent);
1471 fRunLoader->GetHeader()->Reset(fRawReader->GetRunNumber(),
1473 fRunLoader->MakeTree("H");
1474 fRunLoader->TreeE()->Fill();
1477 fRawReader->RewindEvents();
1478 if (fNumberOfEventsPerFile > 0)
1479 fRunLoader->SetNumberOfEventsPerFile(fNumberOfEventsPerFile);
1481 fRunLoader->SetNumberOfEventsPerFile(iEvent);
1482 fRunLoader->WriteHeader("OVERWRITE");
1483 fRunLoader->CdGAFile();
1484 fRunLoader->Write(0, TObject::kOverwrite);
1485 // AliTracker::SetFieldMap(???);
1491 //_____________________________________________________________________________
1492 AliReconstructor* AliReconstruction::GetReconstructor(Int_t iDet)
1494 // get the reconstructor object and the loader for a detector
1496 if (fReconstructor[iDet]) return fReconstructor[iDet];
1498 // load the reconstructor object
1499 TPluginManager* pluginManager = gROOT->GetPluginManager();
1500 TString detName = fgkDetectorName[iDet];
1501 TString recName = "Ali" + detName + "Reconstructor";
1502 if (gAlice && !gAlice->GetDetector(detName) && (detName != "HLT")) return NULL;
1504 if (detName == "HLT") {
1505 if (!gROOT->GetClass("AliLevel3")) {
1506 gSystem->Load("libAliHLTSrc.so");
1507 gSystem->Load("libAliHLTMisc.so");
1508 gSystem->Load("libAliHLTHough.so");
1509 gSystem->Load("libAliHLTComp.so");
1513 AliReconstructor* reconstructor = NULL;
1514 // first check if a plugin is defined for the reconstructor
1515 TPluginHandler* pluginHandler =
1516 pluginManager->FindHandler("AliReconstructor", detName);
1517 // if not, add a plugin for it
1518 if (!pluginHandler) {
1519 AliDebug(1, Form("defining plugin for %s", recName.Data()));
1520 TString libs = gSystem->GetLibraries();
1521 if (libs.Contains("lib" + detName + "base.so") ||
1522 (gSystem->Load("lib" + detName + "base.so") >= 0)) {
1523 pluginManager->AddHandler("AliReconstructor", detName,
1524 recName, detName + "rec", recName + "()");
1526 pluginManager->AddHandler("AliReconstructor", detName,
1527 recName, detName, recName + "()");
1529 pluginHandler = pluginManager->FindHandler("AliReconstructor", detName);
1531 if (pluginHandler && (pluginHandler->LoadPlugin() == 0)) {
1532 reconstructor = (AliReconstructor*) pluginHandler->ExecPlugin(0);
1534 if (reconstructor) {
1535 TObject* obj = fOptions.FindObject(detName.Data());
1536 if (obj) reconstructor->SetOption(obj->GetTitle());
1537 reconstructor->Init(fRunLoader);
1538 fReconstructor[iDet] = reconstructor;
1541 // get or create the loader
1542 if (detName != "HLT") {
1543 fLoader[iDet] = fRunLoader->GetLoader(detName + "Loader");
1544 if (!fLoader[iDet]) {
1545 AliConfig::Instance()
1546 ->CreateDetectorFolders(fRunLoader->GetEventFolder(),
1548 // first check if a plugin is defined for the loader
1550 pluginManager->FindHandler("AliLoader", detName);
1551 // if not, add a plugin for it
1552 if (!pluginHandler) {
1553 TString loaderName = "Ali" + detName + "Loader";
1554 AliDebug(1, Form("defining plugin for %s", loaderName.Data()));
1555 pluginManager->AddHandler("AliLoader", detName,
1556 loaderName, detName + "base",
1557 loaderName + "(const char*, TFolder*)");
1558 pluginHandler = pluginManager->FindHandler("AliLoader", detName);
1560 if (pluginHandler && (pluginHandler->LoadPlugin() == 0)) {
1562 (AliLoader*) pluginHandler->ExecPlugin(2, detName.Data(),
1563 fRunLoader->GetEventFolder());
1565 if (!fLoader[iDet]) { // use default loader
1566 fLoader[iDet] = new AliLoader(detName, fRunLoader->GetEventFolder());
1568 if (!fLoader[iDet]) {
1569 AliWarning(Form("couldn't get loader for %s", detName.Data()));
1570 if (fStopOnError) return NULL;
1572 fRunLoader->AddLoader(fLoader[iDet]);
1573 fRunLoader->CdGAFile();
1574 if (gFile && !gFile->IsWritable()) gFile->ReOpen("UPDATE");
1575 fRunLoader->Write(0, TObject::kOverwrite);
1580 return reconstructor;
1583 //_____________________________________________________________________________
1584 Bool_t AliReconstruction::CreateVertexer()
1586 // create the vertexer
1589 AliReconstructor* itsReconstructor = GetReconstructor(0);
1590 if (itsReconstructor) {
1591 fVertexer = itsReconstructor->CreateVertexer(fRunLoader);
1594 AliWarning("couldn't create a vertexer for ITS");
1595 if (fStopOnError) return kFALSE;
1601 //_____________________________________________________________________________
1602 Bool_t AliReconstruction::CreateTrackers(const TString& detectors)
1604 // create the trackers
1606 TString detStr = detectors;
1607 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
1608 if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
1609 AliReconstructor* reconstructor = GetReconstructor(iDet);
1610 if (!reconstructor) continue;
1611 TString detName = fgkDetectorName[iDet];
1612 if (detName == "HLT") {
1613 fRunHLTTracking = kTRUE;
1616 if (detName == "MUON") {
1617 fRunMuonTracking = kTRUE;
1622 fTracker[iDet] = reconstructor->CreateTracker(fRunLoader);
1623 if (!fTracker[iDet] && (iDet < 7)) {
1624 AliWarning(Form("couldn't create a tracker for %s", detName.Data()));
1625 if (fStopOnError) return kFALSE;
1632 //_____________________________________________________________________________
1633 void AliReconstruction::CleanUp(TFile* file, TFile* fileOld)
1635 // delete trackers and the run loader and close and delete the file
1637 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
1638 delete fReconstructor[iDet];
1639 fReconstructor[iDet] = NULL;
1640 fLoader[iDet] = NULL;
1641 delete fTracker[iDet];
1642 fTracker[iDet] = NULL;
1646 delete fDiamondProfile;
1647 fDiamondProfile = NULL;
1662 gSystem->Unlink("AliESDs.old.root");
1667 //_____________________________________________________________________________
1669 Bool_t AliReconstruction::ReadESD(AliESDEvent*& esd, const char* recStep) const
1671 // read the ESD event from a file
1673 if (!esd) return kFALSE;
1675 sprintf(fileName, "ESD_%d.%d_%s.root",
1676 esd->GetRunNumber(), esd->GetEventNumberInFile(), recStep);
1677 if (gSystem->AccessPathName(fileName)) return kFALSE;
1679 AliInfo(Form("reading ESD from file %s", fileName));
1680 AliDebug(1, Form("reading ESD from file %s", fileName));
1681 TFile* file = TFile::Open(fileName);
1682 if (!file || !file->IsOpen()) {
1683 AliError(Form("opening %s failed", fileName));
1690 esd = (AliESDEvent*) file->Get("ESD");
1699 //_____________________________________________________________________________
1700 void AliReconstruction::WriteESD(AliESDEvent* esd, const char* recStep) const
1702 // write the ESD event to a file
1706 sprintf(fileName, "ESD_%d.%d_%s.root",
1707 esd->GetRunNumber(), esd->GetEventNumberInFile(), recStep);
1709 AliDebug(1, Form("writing ESD to file %s", fileName));
1710 TFile* file = TFile::Open(fileName, "recreate");
1711 if (!file || !file->IsOpen()) {
1712 AliError(Form("opening %s failed", fileName));
1723 //_____________________________________________________________________________
1724 void AliReconstruction::CreateTag(const char* fESDfilename)
1727 Float_t lhcLuminosity = 0.0;
1728 TString lhcState = "test";
1729 UInt_t detectorMask = 0;
1734 Double_t fMUONMASS = 0.105658369;
1737 Double_t fThetaX, fThetaY, fPyz, fChisquare;
1738 Double_t fPxRec,fPyRec, fPzRec, fEnergy;
1740 TLorentzVector fEPvector;
1742 Float_t fZVertexCut = 10.0;
1743 Float_t fRhoVertexCut = 2.0;
1745 Float_t fLowPtCut = 1.0;
1746 Float_t fHighPtCut = 3.0;
1747 Float_t fVeryHighPtCut = 10.0;
1750 Double_t partFrac[5] = {0.01, 0.01, 0.85, 0.10, 0.05};
1752 // Creates the tags for all the events in a given ESD file
1754 Int_t nProtons, nKaons, nPions, nMuons, nElectrons;
1755 Int_t nPos, nNeg, nNeutr;
1756 Int_t nK0s, nNeutrons, nPi0s, nGamas;
1757 Int_t nCh1GeV, nCh3GeV, nCh10GeV;
1758 Int_t nMu1GeV, nMu3GeV, nMu10GeV;
1759 Int_t nEl1GeV, nEl3GeV, nEl10GeV;
1760 Float_t maxPt = .0, meanPt = .0, totalP = .0;
1762 Int_t iRunNumber = 0;
1763 TString fVertexName("default");
1765 AliRunTag *tag = new AliRunTag();
1766 AliEventTag *evTag = new AliEventTag();
1767 TTree ttag("T","A Tree with event tags");
1768 TBranch * btag = ttag.Branch("AliTAG", &tag);
1769 btag->SetCompressionLevel(9);
1771 AliInfo(Form("Creating the tags......."));
1773 TFile *file = TFile::Open(fESDfilename);
1774 if (!file || !file->IsOpen()) {
1775 AliError(Form("opening failed"));
1779 Int_t lastEvent = 0;
1780 TTree *b = (TTree*) file->Get("esdTree");
1781 AliESDEvent *esd = new AliESDEvent();
1782 esd->ReadFromTree(b);
1784 b->GetEntry(fFirstEvent);
1785 Int_t iInitRunNumber = esd->GetRunNumber();
1787 Int_t iNumberOfEvents = (Int_t)b->GetEntries();
1788 if(fLastEvent != -1) iNumberOfEvents = fLastEvent + 1;
1789 for (Int_t iEventNumber = fFirstEvent; iEventNumber < iNumberOfEvents; iEventNumber++) {
1817 b->GetEntry(iEventNumber);
1818 iRunNumber = esd->GetRunNumber();
1819 if(iRunNumber != iInitRunNumber) AliFatal("Inconsistency of run numbers in the AliESD!!!");
1820 const AliESDVertex * vertexIn = esd->GetVertex();
1821 if (!vertexIn) AliError("ESD has not defined vertex.");
1822 if (vertexIn) fVertexName = vertexIn->GetName();
1823 if(fVertexName != "default") fVertexflag = 1;
1824 for (Int_t iTrackNumber = 0; iTrackNumber < esd->GetNumberOfTracks(); iTrackNumber++) {
1825 AliESDtrack * esdTrack = esd->GetTrack(iTrackNumber);
1826 UInt_t status = esdTrack->GetStatus();
1828 //select only tracks with ITS refit
1829 if ((status&AliESDtrack::kITSrefit)==0) continue;
1830 //select only tracks with TPC refit
1831 if ((status&AliESDtrack::kTPCrefit)==0) continue;
1833 //select only tracks with the "combined PID"
1834 if ((status&AliESDtrack::kESDpid)==0) continue;
1836 esdTrack->GetPxPyPz(p);
1837 Double_t momentum = sqrt(pow(p[0],2) + pow(p[1],2) + pow(p[2],2));
1838 Double_t fPt = sqrt(pow(p[0],2) + pow(p[1],2));
1841 if(fPt > maxPt) maxPt = fPt;
1843 if(esdTrack->GetSign() > 0) {
1845 if(fPt > fLowPtCut) nCh1GeV++;
1846 if(fPt > fHighPtCut) nCh3GeV++;
1847 if(fPt > fVeryHighPtCut) nCh10GeV++;
1849 if(esdTrack->GetSign() < 0) {
1851 if(fPt > fLowPtCut) nCh1GeV++;
1852 if(fPt > fHighPtCut) nCh3GeV++;
1853 if(fPt > fVeryHighPtCut) nCh10GeV++;
1855 if(esdTrack->GetSign() == 0) nNeutr++;
1859 esdTrack->GetESDpid(prob);
1862 for(Int_t i = 0; i < AliPID::kSPECIES; i++) rcc += prob[i]*partFrac[i];
1863 if(rcc == 0.0) continue;
1866 for(Int_t i = 0; i < AliPID::kSPECIES; i++) w[i] = prob[i]*partFrac[i]/rcc;
1869 if ((w[4]>w[3])&&(w[4]>w[2])&&(w[4]>w[1])&&(w[4]>w[0])) nProtons++;
1871 if ((w[3]>w[4])&&(w[3]>w[2])&&(w[3]>w[1])&&(w[3]>w[0])) nKaons++;
1873 if ((w[2]>w[4])&&(w[2]>w[3])&&(w[2]>w[1])&&(w[2]>w[0])) nPions++;
1875 if ((w[0]>w[4])&&(w[0]>w[3])&&(w[0]>w[2])&&(w[0]>w[1])) {
1877 if(fPt > fLowPtCut) nEl1GeV++;
1878 if(fPt > fHighPtCut) nEl3GeV++;
1879 if(fPt > fVeryHighPtCut) nEl10GeV++;
1887 Int_t nMuonTracks = esd->GetNumberOfMuonTracks();
1888 // loop over all reconstructed tracks (also first track of combination)
1889 for (Int_t iTrack = 0; iTrack < nMuonTracks; iTrack++) {
1890 AliESDMuonTrack* muonTrack = esd->GetMuonTrack(iTrack);
1891 if (muonTrack == 0x0) continue;
1893 // Coordinates at vertex
1894 fZ = muonTrack->GetZ();
1895 fY = muonTrack->GetBendingCoor();
1896 fX = muonTrack->GetNonBendingCoor();
1898 fThetaX = muonTrack->GetThetaX();
1899 fThetaY = muonTrack->GetThetaY();
1901 fPyz = 1./TMath::Abs(muonTrack->GetInverseBendingMomentum());
1902 fPzRec = - fPyz / TMath::Sqrt(1.0 + TMath::Tan(fThetaY)*TMath::Tan(fThetaY));
1903 fPxRec = fPzRec * TMath::Tan(fThetaX);
1904 fPyRec = fPzRec * TMath::Tan(fThetaY);
1905 fCharge = Int_t(TMath::Sign(1.,muonTrack->GetInverseBendingMomentum()));
1907 //ChiSquare of the track if needed
1908 fChisquare = muonTrack->GetChi2()/(2.0 * muonTrack->GetNHit() - 5);
1909 fEnergy = TMath::Sqrt(fMUONMASS * fMUONMASS + fPxRec * fPxRec + fPyRec * fPyRec + fPzRec * fPzRec);
1910 fEPvector.SetPxPyPzE(fPxRec, fPyRec, fPzRec, fEnergy);
1912 // total number of muons inside a vertex cut
1913 if((TMath::Abs(fZ)<fZVertexCut) && (TMath::Sqrt(fY*fY+fX*fX)<fRhoVertexCut)) {
1915 if(fEPvector.Pt() > fLowPtCut) {
1917 if(fEPvector.Pt() > fHighPtCut) {
1919 if (fEPvector.Pt() > fVeryHighPtCut) {
1927 // Fill the event tags
1929 meanPt = meanPt/ntrack;
1931 evTag->SetEventId(iEventNumber+1);
1933 evTag->SetVertexX(vertexIn->GetXv());
1934 evTag->SetVertexY(vertexIn->GetYv());
1935 evTag->SetVertexZ(vertexIn->GetZv());
1936 evTag->SetVertexZError(vertexIn->GetZRes());
1938 evTag->SetVertexFlag(fVertexflag);
1940 evTag->SetT0VertexZ(esd->GetT0zVertex());
1942 evTag->SetTriggerMask(esd->GetTriggerMask());
1943 evTag->SetTriggerCluster(esd->GetTriggerCluster());
1945 evTag->SetZDCNeutron1Energy(esd->GetZDCN1Energy());
1946 evTag->SetZDCProton1Energy(esd->GetZDCP1Energy());
1947 evTag->SetZDCNeutron2Energy(esd->GetZDCN2Energy());
1948 evTag->SetZDCProton2Energy(esd->GetZDCP2Energy());
1949 evTag->SetZDCEMEnergy(esd->GetZDCEMEnergy());
1950 evTag->SetNumOfParticipants(esd->GetZDCParticipants());
1953 evTag->SetNumOfTracks(esd->GetNumberOfTracks());
1954 evTag->SetNumOfPosTracks(nPos);
1955 evTag->SetNumOfNegTracks(nNeg);
1956 evTag->SetNumOfNeutrTracks(nNeutr);
1958 evTag->SetNumOfV0s(esd->GetNumberOfV0s());
1959 evTag->SetNumOfCascades(esd->GetNumberOfCascades());
1960 evTag->SetNumOfKinks(esd->GetNumberOfKinks());
1961 evTag->SetNumOfPMDTracks(esd->GetNumberOfPmdTracks());
1963 evTag->SetNumOfProtons(nProtons);
1964 evTag->SetNumOfKaons(nKaons);
1965 evTag->SetNumOfPions(nPions);
1966 evTag->SetNumOfMuons(nMuons);
1967 evTag->SetNumOfElectrons(nElectrons);
1968 evTag->SetNumOfPhotons(nGamas);
1969 evTag->SetNumOfPi0s(nPi0s);
1970 evTag->SetNumOfNeutrons(nNeutrons);
1971 evTag->SetNumOfKaon0s(nK0s);
1973 evTag->SetNumOfChargedAbove1GeV(nCh1GeV);
1974 evTag->SetNumOfChargedAbove3GeV(nCh3GeV);
1975 evTag->SetNumOfChargedAbove10GeV(nCh10GeV);
1976 evTag->SetNumOfMuonsAbove1GeV(nMu1GeV);
1977 evTag->SetNumOfMuonsAbove3GeV(nMu3GeV);
1978 evTag->SetNumOfMuonsAbove10GeV(nMu10GeV);
1979 evTag->SetNumOfElectronsAbove1GeV(nEl1GeV);
1980 evTag->SetNumOfElectronsAbove3GeV(nEl3GeV);
1981 evTag->SetNumOfElectronsAbove10GeV(nEl10GeV);
1983 evTag->SetNumOfPHOSClusters(esd->GetNumberOfPHOSClusters());
1984 evTag->SetNumOfEMCALClusters(esd->GetNumberOfEMCALClusters());
1986 evTag->SetTotalMomentum(totalP);
1987 evTag->SetMeanPt(meanPt);
1988 evTag->SetMaxPt(maxPt);
1990 tag->SetLHCTag(lhcLuminosity,lhcState);
1991 tag->SetDetectorTag(detectorMask);
1993 tag->SetRunId(iInitRunNumber);
1994 tag->AddEventTag(*evTag);
1996 if(fLastEvent == -1) lastEvent = (Int_t)b->GetEntries();
1997 else lastEvent = fLastEvent;
2003 sprintf(fileName, "Run%d.Event%d_%d.ESD.tag.root",
2004 tag->GetRunId(),fFirstEvent,lastEvent );
2005 AliInfo(Form("writing tags to file %s", fileName));
2006 AliDebug(1, Form("writing tags to file %s", fileName));
2008 TFile* ftag = TFile::Open(fileName, "recreate");
2017 //_____________________________________________________________________________
2018 void AliReconstruction::ESDFile2AODFile(TFile* esdFile, TFile* aodFile)
2020 // write all files from the given esd file to an aod file
2022 // create an AliAOD object
2023 AliAODEvent *aod = new AliAODEvent();
2024 aod->CreateStdContent();
2030 TTree *aodTree = new TTree("AOD", "AliAOD tree");
2031 aodTree->Branch(aod->GetList());
2034 TTree *t = (TTree*) esdFile->Get("esdTree");
2035 AliESDEvent *esd = new AliESDEvent();
2036 esd->ReadFromTree(t);
2038 Int_t nEvents = t->GetEntries();
2040 // set arrays and pointers
2048 // loop over events and fill them
2049 for (Int_t iEvent = 0; iEvent < nEvents; ++iEvent) {
2050 t->GetEntry(iEvent);
2052 // Multiplicity information needed by the header (to be revised!)
2053 Int_t nTracks = esd->GetNumberOfTracks();
2054 Int_t nPosTracks = 0;
2055 for (Int_t iTrack=0; iTrack<nTracks; ++iTrack)
2056 if (esd->GetTrack(iTrack)->GetSign()> 0) nPosTracks++;
2058 // Update the header
2059 AliAODHeader* header = aod->GetHeader();
2061 header->SetRunNumber (esd->GetRunNumber() );
2062 header->SetBunchCrossNumber(esd->GetBunchCrossNumber());
2063 header->SetOrbitNumber (esd->GetOrbitNumber() );
2064 header->SetPeriodNumber (esd->GetPeriodNumber() );
2065 header->SetTriggerMask (esd->GetTriggerMask() );
2066 header->SetTriggerCluster (esd->GetTriggerCluster() );
2067 header->SetEventType (esd->GetEventType() );
2068 header->SetMagneticField (esd->GetMagneticField() );
2069 header->SetZDCN1Energy (esd->GetZDCN1Energy() );
2070 header->SetZDCP1Energy (esd->GetZDCP1Energy() );
2071 header->SetZDCN2Energy (esd->GetZDCN2Energy() );
2072 header->SetZDCP2Energy (esd->GetZDCP2Energy() );
2073 header->SetZDCEMEnergy (esd->GetZDCEMEnergy() );
2074 header->SetRefMultiplicity (nTracks);
2075 header->SetRefMultiplicityPos(nPosTracks);
2076 header->SetRefMultiplicityNeg(nTracks - nPosTracks);
2077 header->SetMuonMagFieldScale(-999.); // FIXME
2078 header->SetCentrality(-999.); // FIXME
2082 Int_t nV0s = esd->GetNumberOfV0s();
2083 Int_t nCascades = esd->GetNumberOfCascades();
2084 Int_t nKinks = esd->GetNumberOfKinks();
2085 Int_t nVertices = nV0s + nCascades + nKinks;
2087 aod->ResetStd(nTracks, nVertices);
2088 AliAODTrack *aodTrack;
2091 // Array to take into account the tracks already added to the AOD
2092 Bool_t * usedTrack = NULL;
2094 usedTrack = new Bool_t[nTracks];
2095 for (Int_t iTrack=0; iTrack<nTracks; ++iTrack) usedTrack[iTrack]=kFALSE;
2097 // Array to take into account the V0s already added to the AOD
2098 Bool_t * usedV0 = NULL;
2100 usedV0 = new Bool_t[nV0s];
2101 for (Int_t iV0=0; iV0<nV0s; ++iV0) usedV0[iV0]=kFALSE;
2103 // Array to take into account the kinks already added to the AOD
2104 Bool_t * usedKink = NULL;
2106 usedKink = new Bool_t[nKinks];
2107 for (Int_t iKink=0; iKink<nKinks; ++iKink) usedKink[iKink]=kFALSE;
2110 // Access to the AOD container of vertices
2111 TClonesArray &vertices = *(aod->GetVertices());
2114 // Access to the AOD container of tracks
2115 TClonesArray &tracks = *(aod->GetTracks());
2118 // Add primary vertex. The primary tracks will be defined
2119 // after the loops on the composite objects (V0, cascades, kinks)
2120 const AliESDVertex *vtx = esd->GetPrimaryVertex();
2122 vtx->GetXYZ(pos); // position
2123 vtx->GetCovMatrix(covVtx); //covariance matrix
2125 AliAODVertex * primary = new(vertices[jVertices++])
2126 AliAODVertex(pos, covVtx, vtx->GetChi2toNDF(), NULL, AliAODVertex::kPrimary);
2128 // Create vertices starting from the most complex objects
2131 for (Int_t nCascade = 0; nCascade < nCascades; ++nCascade) {
2132 AliESDcascade *cascade = esd->GetCascade(nCascade);
2134 cascade->GetXYZ(pos[0], pos[1], pos[2]);
2135 cascade->GetPosCovXi(covVtx);
2137 // Add the cascade vertex
2138 AliAODVertex * vcascade = new(vertices[jVertices++]) AliAODVertex(pos,
2140 cascade->GetChi2Xi(), // = chi2/NDF since NDF = 2*2-3
2142 AliAODVertex::kCascade);
2144 primary->AddDaughter(vcascade);
2146 // Add the V0 from the cascade. The ESD class have to be optimized...
2147 // Now we have to search for the corresponding Vo in the list of V0s
2148 // using the indeces of the positive and negative tracks
2150 Int_t posFromV0 = cascade->GetPindex();
2151 Int_t negFromV0 = cascade->GetNindex();
2154 AliESDv0 * v0 = 0x0;
2157 for (Int_t iV0=0; iV0<nV0s; ++iV0) {
2159 v0 = esd->GetV0(iV0);
2160 Int_t posV0 = v0->GetPindex();
2161 Int_t negV0 = v0->GetNindex();
2163 if (posV0==posFromV0 && negV0==negFromV0) {
2169 AliAODVertex * vV0FromCascade = 0x0;
2171 if (indV0>-1 && !usedV0[indV0] ) {
2173 // the V0 exists in the array of V0s and is not used
2175 usedV0[indV0] = kTRUE;
2177 v0->GetXYZ(pos[0], pos[1], pos[2]);
2178 v0->GetPosCov(covVtx);
2180 vV0FromCascade = new(vertices[jVertices++]) AliAODVertex(pos,
2182 v0->GetChi2V0(), // = chi2/NDF since NDF = 2*2-3
2187 // the V0 doesn't exist in the array of V0s or was used
2188 cerr << "Error: event " << iEvent << " cascade " << nCascade
2189 << " The V0 " << indV0
2190 << " doesn't exist in the array of V0s or was used!" << endl;
2192 cascade->GetXYZ(pos[0], pos[1], pos[2]);
2193 cascade->GetPosCov(covVtx);
2195 vV0FromCascade = new(vertices[jVertices++]) AliAODVertex(pos,
2197 v0->GetChi2V0(), // = chi2/NDF since NDF = 2*2-3
2200 vcascade->AddDaughter(vV0FromCascade);
2203 // Add the positive tracks from the V0
2205 if (! usedTrack[posFromV0]) {
2207 usedTrack[posFromV0] = kTRUE;
2209 AliESDtrack *esdTrack = esd->GetTrack(posFromV0);
2210 esdTrack->GetPxPyPz(p);
2211 esdTrack->GetXYZ(pos);
2212 esdTrack->GetCovarianceXYZPxPyPz(covTr);
2213 esdTrack->GetESDpid(pid);
2215 vV0FromCascade->AddDaughter(aodTrack =
2216 new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
2217 esdTrack->GetLabel(),
2223 (Short_t)esdTrack->GetSign(),
2224 esdTrack->GetITSClusterMap(),
2227 kTRUE, // check if this is right
2228 kFALSE, // check if this is right
2229 AliAODTrack::kSecondary)
2231 aodTrack->ConvertAliPIDtoAODPID();
2234 cerr << "Error: event " << iEvent << " cascade " << nCascade
2235 << " track " << posFromV0 << " has already been used!" << endl;
2238 // Add the negative tracks from the V0
2240 if (!usedTrack[negFromV0]) {
2242 usedTrack[negFromV0] = kTRUE;
2244 AliESDtrack *esdTrack = esd->GetTrack(negFromV0);
2245 esdTrack->GetPxPyPz(p);
2246 esdTrack->GetXYZ(pos);
2247 esdTrack->GetCovarianceXYZPxPyPz(covTr);
2248 esdTrack->GetESDpid(pid);
2250 vV0FromCascade->AddDaughter(aodTrack =
2251 new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
2252 esdTrack->GetLabel(),
2258 (Short_t)esdTrack->GetSign(),
2259 esdTrack->GetITSClusterMap(),
2262 kTRUE, // check if this is right
2263 kFALSE, // check if this is right
2264 AliAODTrack::kSecondary)
2266 aodTrack->ConvertAliPIDtoAODPID();
2269 cerr << "Error: event " << iEvent << " cascade " << nCascade
2270 << " track " << negFromV0 << " has already been used!" << endl;
2273 // Add the bachelor track from the cascade
2275 Int_t bachelor = cascade->GetBindex();
2277 if(!usedTrack[bachelor]) {
2279 usedTrack[bachelor] = kTRUE;
2281 AliESDtrack *esdTrack = esd->GetTrack(bachelor);
2282 esdTrack->GetPxPyPz(p);
2283 esdTrack->GetXYZ(pos);
2284 esdTrack->GetCovarianceXYZPxPyPz(covTr);
2285 esdTrack->GetESDpid(pid);
2287 vcascade->AddDaughter(aodTrack =
2288 new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
2289 esdTrack->GetLabel(),
2295 (Short_t)esdTrack->GetSign(),
2296 esdTrack->GetITSClusterMap(),
2299 kTRUE, // check if this is right
2300 kFALSE, // check if this is right
2301 AliAODTrack::kSecondary)
2303 aodTrack->ConvertAliPIDtoAODPID();
2306 cerr << "Error: event " << iEvent << " cascade " << nCascade
2307 << " track " << bachelor << " has already been used!" << endl;
2310 // Add the primary track of the cascade (if any)
2312 } // end of the loop on cascades
2316 for (Int_t nV0 = 0; nV0 < nV0s; ++nV0) {
2318 if (usedV0[nV0]) continue; // skip if aready added to the AOD
2320 AliESDv0 *v0 = esd->GetV0(nV0);
2322 v0->GetXYZ(pos[0], pos[1], pos[2]);
2323 v0->GetPosCov(covVtx);
2325 AliAODVertex * vV0 =
2326 new(vertices[jVertices++]) AliAODVertex(pos,
2328 v0->GetChi2V0(), // = chi2/NDF since NDF = 2*2-3
2331 primary->AddDaughter(vV0);
2333 Int_t posFromV0 = v0->GetPindex();
2334 Int_t negFromV0 = v0->GetNindex();
2336 // Add the positive tracks from the V0
2338 if (!usedTrack[posFromV0]) {
2340 usedTrack[posFromV0] = kTRUE;
2342 AliESDtrack *esdTrack = esd->GetTrack(posFromV0);
2343 esdTrack->GetPxPyPz(p);
2344 esdTrack->GetXYZ(pos);
2345 esdTrack->GetCovarianceXYZPxPyPz(covTr);
2346 esdTrack->GetESDpid(pid);
2348 vV0->AddDaughter(aodTrack =
2349 new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
2350 esdTrack->GetLabel(),
2356 (Short_t)esdTrack->GetSign(),
2357 esdTrack->GetITSClusterMap(),
2360 kTRUE, // check if this is right
2361 kFALSE, // check if this is right
2362 AliAODTrack::kSecondary)
2364 aodTrack->ConvertAliPIDtoAODPID();
2367 cerr << "Error: event " << iEvent << " V0 " << nV0
2368 << " track " << posFromV0 << " has already been used!" << endl;
2371 // Add the negative tracks from the V0
2373 if (!usedTrack[negFromV0]) {
2375 usedTrack[negFromV0] = kTRUE;
2377 AliESDtrack *esdTrack = esd->GetTrack(negFromV0);
2378 esdTrack->GetPxPyPz(p);
2379 esdTrack->GetXYZ(pos);
2380 esdTrack->GetCovarianceXYZPxPyPz(covTr);
2381 esdTrack->GetESDpid(pid);
2383 vV0->AddDaughter(aodTrack =
2384 new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
2385 esdTrack->GetLabel(),
2391 (Short_t)esdTrack->GetSign(),
2392 esdTrack->GetITSClusterMap(),
2395 kTRUE, // check if this is right
2396 kFALSE, // check if this is right
2397 AliAODTrack::kSecondary)
2399 aodTrack->ConvertAliPIDtoAODPID();
2402 cerr << "Error: event " << iEvent << " V0 " << nV0
2403 << " track " << negFromV0 << " has already been used!" << endl;
2406 } // end of the loop on V0s
2408 // Kinks: it is a big mess the access to the information in the kinks
2409 // The loop is on the tracks in order to find the mother and daugther of each kink
2412 for (Int_t iTrack=0; iTrack<nTracks; ++iTrack) {
2415 AliESDtrack * esdTrack = esd->GetTrack(iTrack);
2417 Int_t ikink = esdTrack->GetKinkIndex(0);
2420 // Negative kink index: mother, positive: daughter
2422 // Search for the second track of the kink
2424 for (Int_t jTrack = iTrack+1; jTrack<nTracks; ++jTrack) {
2426 AliESDtrack * esdTrack1 = esd->GetTrack(jTrack);
2428 Int_t jkink = esdTrack1->GetKinkIndex(0);
2430 if ( TMath::Abs(ikink)==TMath::Abs(jkink) ) {
2432 // The two tracks are from the same kink
2434 if (usedKink[TMath::Abs(ikink)-1]) continue; // skip used kinks
2437 Int_t idaughter = -1;
2439 if (ikink<0 && jkink>0) {
2444 else if (ikink>0 && jkink<0) {
2450 cerr << "Error: Wrong combination of kink indexes: "
2451 << ikink << " " << jkink << endl;
2455 // Add the mother track
2457 AliAODTrack * mother = NULL;
2459 if (!usedTrack[imother]) {
2461 usedTrack[imother] = kTRUE;
2463 AliESDtrack *esdTrack = esd->GetTrack(imother);
2464 esdTrack->GetPxPyPz(p);
2465 esdTrack->GetXYZ(pos);
2466 esdTrack->GetCovarianceXYZPxPyPz(covTr);
2467 esdTrack->GetESDpid(pid);
2470 new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
2471 esdTrack->GetLabel(),
2477 (Short_t)esdTrack->GetSign(),
2478 esdTrack->GetITSClusterMap(),
2481 kTRUE, // check if this is right
2482 kTRUE, // check if this is right
2483 AliAODTrack::kPrimary);
2484 primary->AddDaughter(mother);
2485 mother->ConvertAliPIDtoAODPID();
2488 cerr << "Error: event " << iEvent << " kink " << TMath::Abs(ikink)-1
2489 << " track " << imother << " has already been used!" << endl;
2492 // Add the kink vertex
2493 AliESDkink * kink = esd->GetKink(TMath::Abs(ikink)-1);
2495 AliAODVertex * vkink =
2496 new(vertices[jVertices++]) AliAODVertex(kink->GetPosition(),
2500 AliAODVertex::kKink);
2501 // Add the daughter track
2503 AliAODTrack * daughter = NULL;
2505 if (!usedTrack[idaughter]) {
2507 usedTrack[idaughter] = kTRUE;
2509 AliESDtrack *esdTrack = esd->GetTrack(idaughter);
2510 esdTrack->GetPxPyPz(p);
2511 esdTrack->GetXYZ(pos);
2512 esdTrack->GetCovarianceXYZPxPyPz(covTr);
2513 esdTrack->GetESDpid(pid);
2516 new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
2517 esdTrack->GetLabel(),
2523 (Short_t)esdTrack->GetSign(),
2524 esdTrack->GetITSClusterMap(),
2527 kTRUE, // check if this is right
2528 kTRUE, // check if this is right
2529 AliAODTrack::kPrimary);
2530 vkink->AddDaughter(daughter);
2531 daughter->ConvertAliPIDtoAODPID();
2534 cerr << "Error: event " << iEvent << " kink " << TMath::Abs(ikink)-1
2535 << " track " << idaughter << " has already been used!" << endl;
2547 // Tracks (primary and orphan)
2549 for (Int_t nTrack = 0; nTrack < nTracks; ++nTrack) {
2552 if (usedTrack[nTrack]) continue;
2554 AliESDtrack *esdTrack = esd->GetTrack(nTrack);
2555 esdTrack->GetPxPyPz(p);
2556 esdTrack->GetXYZ(pos);
2557 esdTrack->GetCovarianceXYZPxPyPz(covTr);
2558 esdTrack->GetESDpid(pid);
2560 Float_t impactXY, impactZ;
2562 esdTrack->GetImpactParameters(impactXY,impactZ);
2565 // track inside the beam pipe
2567 primary->AddDaughter(aodTrack =
2568 new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
2569 esdTrack->GetLabel(),
2575 (Short_t)esdTrack->GetSign(),
2576 esdTrack->GetITSClusterMap(),
2579 kTRUE, // check if this is right
2580 kTRUE, // check if this is right
2581 AliAODTrack::kPrimary)
2583 aodTrack->ConvertAliPIDtoAODPID();
2586 // outside the beam pipe: orphan track
2588 new(tracks[jTracks++]) AliAODTrack(esdTrack->GetID(),
2589 esdTrack->GetLabel(),
2595 (Short_t)esdTrack->GetSign(),
2596 esdTrack->GetITSClusterMap(),
2599 kFALSE, // check if this is right
2600 kFALSE, // check if this is right
2601 AliAODTrack::kOrphan);
2602 aodTrack->ConvertAliPIDtoAODPID();
2604 } // end of loop on tracks
2607 Int_t nMuTracks = esd->GetNumberOfMuonTracks();
2608 for (Int_t nMuTrack = 0; nMuTrack < nMuTracks; ++nMuTrack) {
2610 AliESDMuonTrack *esdMuTrack = esd->GetMuonTrack(nMuTrack);
2611 p[0] = esdMuTrack->Px();
2612 p[1] = esdMuTrack->Py();
2613 p[2] = esdMuTrack->Pz();
2614 pos[0] = primary->GetX();
2615 pos[1] = primary->GetY();
2616 pos[2] = primary->GetZ();
2618 // has to be changed once the muon pid is provided by the ESD
2619 for (Int_t i = 0; i < 10; pid[i++] = 0.); pid[AliAODTrack::kMuon]=1.;
2621 primary->AddDaughter(
2622 new(tracks[jTracks++]) AliAODTrack(0, // no ID provided
2623 0, // no label provided
2628 NULL, // no covariance matrix provided
2629 (Short_t)-99, // no charge provided
2630 0, // no ITSClusterMap
2633 kTRUE, // check if this is right
2634 kTRUE, // not used for vertex fit
2635 AliAODTrack::kPrimary)
2639 // Access to the AOD container of clusters
2640 TClonesArray &clusters = *(aod->GetClusters());
2644 Int_t nClusters = esd->GetNumberOfCaloClusters();
2646 for (Int_t iClust=0; iClust<nClusters; ++iClust) {
2648 AliESDCaloCluster * cluster = esd->GetCaloCluster(iClust);
2650 Int_t id = cluster->GetID();
2652 Float_t energy = cluster->E();
2653 cluster->GetPosition(posF);
2654 AliAODVertex *prodVertex = primary;
2655 AliAODTrack *primTrack = NULL;
2656 Char_t ttype=AliAODCluster::kUndef;
2658 if (cluster->IsPHOS()) ttype=AliAODCluster::kPHOSNeutral;
2659 else if (cluster->IsEMCAL()) {
2661 if (cluster->GetClusterType() == AliESDCaloCluster::kPseudoCluster)
2662 ttype = AliAODCluster::kEMCALPseudoCluster;
2664 ttype = AliAODCluster::kEMCALClusterv1;
2668 new(clusters[jClusters++]) AliAODCluster(id,
2672 NULL, // no covariance matrix provided
2673 NULL, // no pid for clusters provided
2678 } // end of loop on calo clusters
2680 delete [] usedTrack;
2684 // fill the tree for this event
2686 } // end of event loop
2688 aodTree->GetUserInfo()->Add(aod);
2693 // write the tree to the specified file
2694 aodFile = aodTree->GetCurrentFile();
2701 void AliReconstruction::WriteAlignmentData(AliESDEvent* esd)
2703 // Write space-points which are then used in the alignment procedures
2704 // For the moment only ITS, TRD and TPC
2706 // Load TOF clusters
2708 fLoader[3]->LoadRecPoints("read");
2709 TTree* tree = fLoader[3]->TreeR();
2711 AliError(Form("Can't get the %s cluster tree", fgkDetectorName[3]));
2714 fTracker[3]->LoadClusters(tree);
2716 Int_t ntracks = esd->GetNumberOfTracks();
2717 for (Int_t itrack = 0; itrack < ntracks; itrack++)
2719 AliESDtrack *track = esd->GetTrack(itrack);
2722 for (Int_t iDet = 3; iDet >= 0; iDet--)
2723 nsp += track->GetNcls(iDet);
2725 AliTrackPointArray *sp = new AliTrackPointArray(nsp);
2726 track->SetTrackPointArray(sp);
2728 for (Int_t iDet = 3; iDet >= 0; iDet--) {
2729 AliTracker *tracker = fTracker[iDet];
2730 if (!tracker) continue;
2731 Int_t nspdet = track->GetNcls(iDet);
2732 if (nspdet <= 0) continue;
2733 track->GetClusters(iDet,idx);
2737 while (isp < nspdet) {
2738 Bool_t isvalid = tracker->GetTrackPoint(idx[isp2],p); isp2++;
2739 const Int_t kNTPCmax = 159;
2740 if (iDet==1 && isp2>kNTPCmax) break; // to be fixed
2741 if (!isvalid) continue;
2742 sp->AddPoint(isptrack,&p); isptrack++; isp++;
2748 fTracker[3]->UnloadClusters();
2749 fLoader[3]->UnloadRecPoints();
2753 //_____________________________________________________________________________
2754 void AliReconstruction::FillRawDataErrorLog(Int_t iEvent, AliESDEvent* esd)
2756 // The method reads the raw-data error log
2757 // accumulated within the rawReader.
2758 // It extracts the raw-data errors related to
2759 // the current event and stores them into
2760 // a TClonesArray inside the esd object.
2762 if (!fRawReader) return;
2764 for(Int_t i = 0; i < fRawReader->GetNumberOfErrorLogs(); i++) {
2766 AliRawDataErrorLog *log = fRawReader->GetErrorLog(i);
2768 if (iEvent != log->GetEventNumber()) continue;
2770 esd->AddRawDataErrorLog(log);
2775 TNamed* AliReconstruction::CopyFileToTNamed(TString fPath,TString fName){
2776 // Dump a file content into a char in TNamed
2778 in.open(fPath.Data(),ios::in | ios::binary|ios::ate);
2779 Int_t kBytes = (Int_t)in.tellg();
2780 printf("Size: %d \n",kBytes);
2783 char* memblock = new char [kBytes];
2784 in.seekg (0, ios::beg);
2785 in.read (memblock, kBytes);
2787 TString fData(memblock,kBytes);
2788 fn = new TNamed(fName,fData);
2789 printf("fData Size: %d \n",fData.Sizeof());
2790 printf("fName Size: %d \n",fName.Sizeof());
2791 printf("fn Size: %d \n",fn->Sizeof());
2795 AliInfo(Form("Could not Open %s\n",fPath.Data()));
2801 void AliReconstruction::TNamedToFile(TTree* fTree, TString fName){
2802 // This is not really needed in AliReconstruction at the moment
2803 // but can serve as a template
2805 TList *fList = fTree->GetUserInfo();
2806 TNamed *fn = (TNamed*)fList->FindObject(fName.Data());
2807 printf("fn Size: %d \n",fn->Sizeof());
2809 TString fTmp(fn->GetName()); // to be 100% sure in principle fName also works
2810 const char* cdata = fn->GetTitle();
2811 printf("fTmp Size %d\n",fTmp.Sizeof());
2813 int size = fn->Sizeof()-fTmp.Sizeof()-sizeof(UChar_t)-sizeof(Int_t); // see dfinition of TString::SizeOf()...
2814 printf("calculated size %d\n",size);
2815 ofstream out(fName.Data(),ios::out | ios::binary);
2816 out.write(cdata,size);