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 // The name of the galice file can be changed from the default //
51 // "galice.root" by passing it as argument to the AliReconstruction //
52 // constructor or by //
54 // rec.SetGAliceFile("..."); //
56 // The local reconstruction can be switched on or off for individual //
59 // rec.SetRunLocalReconstruction("..."); //
61 // The argument is a (case sensitive) string with the names of the //
62 // detectors separated by a space. The special string "ALL" selects all //
63 // available detectors. This is the default. //
65 // The reconstruction of the primary vertex position can be switched off by //
67 // rec.SetRunVertexFinder(kFALSE); //
69 // The tracking and the creation of ESD tracks can be switched on for //
70 // selected detectors by //
72 // rec.SetRunTracking("..."); //
74 // Uniform/nonuniform field tracking switches (default: uniform field) //
76 // rec.SetUniformFieldTracking(); ( rec.SetUniformFieldTracking(kFALSE); ) //
78 // The filling of additional ESD information can be steered by //
80 // rec.SetFillESD("..."); //
82 // Again, for both methods the string specifies the list of detectors. //
83 // The default is "ALL". //
85 // The call of the shortcut method //
87 // rec.SetRunReconstruction("..."); //
89 // is equivalent to calling SetRunLocalReconstruction, SetRunTracking and //
90 // SetFillESD with the same detector selecting string as argument. //
92 // The reconstruction requires digits or raw data as input. For the creation //
93 // of digits and raw data have a look at the class AliSimulation. //
95 // For debug purposes the method SetCheckPointLevel can be used. If the //
96 // argument is greater than 0, files with ESD events will be written after //
97 // selected steps of the reconstruction for each event: //
98 // level 1: after tracking and after filling of ESD (final) //
99 // level 2: in addition after each tracking step //
100 // level 3: in addition after the filling of ESD for each detector //
101 // If a final check point file exists for an event, this event will be //
102 // skipped in the reconstruction. The tracking and the filling of ESD for //
103 // a detector will be skipped as well, if the corresponding check point //
104 // file exists. The ESD event will then be loaded from the file instead. //
106 ///////////////////////////////////////////////////////////////////////////////
112 #include <TPluginManager.h>
113 #include <TStopwatch.h>
114 #include <TGeoManager.h>
115 #include <TLorentzVector.h>
117 #include "AliReconstruction.h"
118 #include "AliReconstructor.h"
120 #include "AliRunLoader.h"
122 #include "AliRawReaderFile.h"
123 #include "AliRawReaderDate.h"
124 #include "AliRawReaderRoot.h"
126 #include "AliESDfriend.h"
127 #include "AliESDVertex.h"
128 #include "AliTracker.h"
129 #include "AliVertexer.h"
130 #include "AliVertexerTracks.h"
131 #include "AliHeader.h"
132 #include "AliGenEventHeader.h"
134 #include "AliESDpid.h"
135 #include "AliESDtrack.h"
137 #include "AliRunTag.h"
138 #include "AliDetectorTag.h"
139 #include "AliEventTag.h"
141 #include "AliTrackPointArray.h"
142 #include "AliCDBManager.h"
143 #include "AliCDBEntry.h"
144 #include "AliAlignObj.h"
146 #include "AliCentralTrigger.h"
147 #include "AliCTPRawStream.h"
149 ClassImp(AliReconstruction)
152 //_____________________________________________________________________________
153 const char* AliReconstruction::fgkDetectorName[AliReconstruction::fgkNDetectors] = {"ITS", "TPC", "TRD", "TOF", "PHOS", "RICH", "EMCAL", "MUON", "FMD", "ZDC", "PMD", "START", "VZERO", "CRT", "HLT"};
155 //_____________________________________________________________________________
156 AliReconstruction::AliReconstruction(const char* gAliceFilename, const char* cdbUri,
157 const char* name, const char* title) :
160 fUniformField(kTRUE),
161 fRunVertexFinder(kTRUE),
162 fRunHLTTracking(kFALSE),
163 fStopOnError(kFALSE),
164 fWriteAlignmentData(kFALSE),
165 fWriteESDfriend(kFALSE),
166 fFillTriggerESD(kTRUE),
168 fRunLocalReconstruction("ALL"),
171 fGAliceFileName(gAliceFilename),
178 fLoadAlignFromCDB(kTRUE),
179 fLoadAlignData("ALL"),
186 fAlignObjArray(NULL),
189 // create reconstruction object with default parameters
191 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
192 fReconstructor[iDet] = NULL;
193 fLoader[iDet] = NULL;
194 fTracker[iDet] = NULL;
199 //_____________________________________________________________________________
200 AliReconstruction::AliReconstruction(const AliReconstruction& rec) :
203 fUniformField(rec.fUniformField),
204 fRunVertexFinder(rec.fRunVertexFinder),
205 fRunHLTTracking(rec.fRunHLTTracking),
206 fStopOnError(rec.fStopOnError),
207 fWriteAlignmentData(rec.fWriteAlignmentData),
208 fWriteESDfriend(rec.fWriteESDfriend),
209 fFillTriggerESD(rec.fFillTriggerESD),
211 fRunLocalReconstruction(rec.fRunLocalReconstruction),
212 fRunTracking(rec.fRunTracking),
213 fFillESD(rec.fFillESD),
214 fGAliceFileName(rec.fGAliceFileName),
216 fEquipIdMap(rec.fEquipIdMap),
217 fFirstEvent(rec.fFirstEvent),
218 fLastEvent(rec.fLastEvent),
221 fLoadAlignFromCDB(rec.fLoadAlignFromCDB),
222 fLoadAlignData(rec.fLoadAlignData),
229 fAlignObjArray(rec.fAlignObjArray),
234 for (Int_t i = 0; i < fOptions.GetEntriesFast(); i++) {
235 if (rec.fOptions[i]) fOptions.Add(rec.fOptions[i]->Clone());
237 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
238 fReconstructor[iDet] = NULL;
239 fLoader[iDet] = NULL;
240 fTracker[iDet] = NULL;
244 //_____________________________________________________________________________
245 AliReconstruction& AliReconstruction::operator = (const AliReconstruction& rec)
247 // assignment operator
249 this->~AliReconstruction();
250 new(this) AliReconstruction(rec);
254 //_____________________________________________________________________________
255 AliReconstruction::~AliReconstruction()
263 //_____________________________________________________________________________
264 void AliReconstruction::InitCDBStorage()
266 // activate a default CDB storage
267 // First check if we have any CDB storage set, because it is used
268 // to retrieve the calibration and alignment constants
270 AliCDBManager* man = AliCDBManager::Instance();
271 if (!man->IsDefaultStorageSet())
273 AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
274 AliWarning("Default CDB storage not yet set");
275 AliWarning(Form("Using default storage declared in AliSimulation: %s",fCDBUri.Data()));
276 AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
277 SetDefaultStorage(fCDBUri);
279 Int_t cdbRun = AliCDBManager::Instance()->GetRun();
281 AliWarning("AliCDBManager's run number temporarily set to 0!!");
282 AliCDBManager::Instance()->SetRun(0);
288 //_____________________________________________________________________________
289 void AliReconstruction::SetDefaultStorage(const char* uri) {
290 // activate a default CDB storage
292 AliCDBManager::Instance()->SetDefaultStorage(uri);
296 //_____________________________________________________________________________
297 void AliReconstruction::SetSpecificStorage(const char* detName, const char* uri) {
298 // activate a detector-specific CDB storage
300 AliCDBManager::Instance()->SetSpecificStorage(detName, uri);
304 //_____________________________________________________________________________
305 Bool_t AliReconstruction::SetRunNumber()
307 // The method is called in Run() in order
308 // to set a correct run number.
309 // In case of raw data reconstruction the
310 // run number is taken from the raw data header
312 if(AliCDBManager::Instance()->GetRun() < 0) {
314 AliError("No run loader is found !");
317 // read run number from gAlice
318 AliCDBManager::Instance()->SetRun(fRunLoader->GetAliRun()->GetRunNumber());
319 AliInfo(Form("Run number: %d",AliCDBManager::Instance()->GetRun()));
324 //_____________________________________________________________________________
325 Bool_t AliReconstruction::ApplyAlignObjsToGeom(TObjArray* alObjArray)
327 // Read collection of alignment objects (AliAlignObj derived) saved
328 // in the TClonesArray ClArrayName and apply them to the geometry
329 // manager singleton.
332 Int_t nvols = alObjArray->GetEntriesFast();
336 for(Int_t j=0; j<nvols; j++)
338 AliAlignObj* alobj = (AliAlignObj*) alObjArray->UncheckedAt(j);
339 if (alobj->ApplyToGeometry() == kFALSE) flag = kFALSE;
342 if (AliDebugLevelClass() >= 1) {
343 gGeoManager->GetTopNode()->CheckOverlaps(20);
344 TObjArray* ovexlist = gGeoManager->GetListOfOverlaps();
345 if(ovexlist->GetEntriesFast()){
346 AliError("The application of alignment objects to the geometry caused huge overlaps/extrusions!");
354 //_____________________________________________________________________________
355 Bool_t AliReconstruction::SetAlignObjArraySingleDet(const char* detName)
357 // Fills array of single detector's alignable objects from CDB
359 AliDebug(2, Form("Loading alignment data for detector: %s",detName));
363 AliCDBPath path(detName,"Align","Data");
365 entry=AliCDBManager::Instance()->Get(path.GetPath());
367 AliDebug(2,Form("Couldn't load alignment data for detector %s",detName));
371 TClonesArray *alignArray = (TClonesArray*) entry->GetObject();
372 alignArray->SetOwner(0);
373 AliDebug(2,Form("Found %d alignment objects for %s",
374 alignArray->GetEntries(),detName));
376 AliAlignObj *alignObj=0;
377 TIter iter(alignArray);
379 // loop over align objects in detector
380 while( ( alignObj=(AliAlignObj *) iter.Next() ) ){
381 fAlignObjArray->Add(alignObj);
383 // delete entry --- Don't delete, it is cached!
385 AliDebug(2, Form("fAlignObjArray entries: %d",fAlignObjArray->GetEntries() ));
390 //_____________________________________________________________________________
391 Bool_t AliReconstruction::MisalignGeometry(const TString& detectors)
393 // Read the alignment objects from CDB.
394 // Each detector is supposed to have the
395 // alignment objects in DET/Align/Data CDB path.
396 // All the detector objects are then collected,
397 // sorted by geometry level (starting from ALIC) and
398 // then applied to the TGeo geometry.
399 // Finally an overlaps check is performed.
401 // Load alignment data from CDB and fill fAlignObjArray
402 if(fLoadAlignFromCDB){
403 if(!fAlignObjArray) fAlignObjArray = new TObjArray();
405 //fAlignObjArray->RemoveAll();
406 fAlignObjArray->Clear();
407 fAlignObjArray->SetOwner(0);
409 TString detStr = detectors;
410 TString dataNotLoaded="";
411 TString dataLoaded="";
413 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
414 if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
415 if(!SetAlignObjArraySingleDet(fgkDetectorName[iDet])){
416 dataNotLoaded += fgkDetectorName[iDet];
417 dataNotLoaded += " ";
419 dataLoaded += fgkDetectorName[iDet];
422 } // end loop over detectors
424 if ((detStr.CompareTo("ALL") == 0)) detStr = "";
425 dataNotLoaded += detStr;
426 AliInfo(Form("Alignment data loaded for: %s",
428 AliInfo(Form("Didn't/couldn't load alignment data for: %s",
429 dataNotLoaded.Data()));
430 } // fLoadAlignFromCDB flag
432 // Check if the array with alignment objects was
433 // provided by the user. If yes, apply the objects
434 // to the present TGeo geometry
435 if (fAlignObjArray) {
436 if (gGeoManager && gGeoManager->IsClosed()) {
437 if (ApplyAlignObjsToGeom(fAlignObjArray) == kFALSE) {
438 AliError("The misalignment of one or more volumes failed!"
439 "Compare the list of simulated detectors and the list of detector alignment data!");
444 AliError("Can't apply the misalignment! gGeoManager doesn't exist or it is still opened!");
452 //_____________________________________________________________________________
453 void AliReconstruction::SetGAliceFile(const char* fileName)
455 // set the name of the galice file
457 fGAliceFileName = fileName;
460 //_____________________________________________________________________________
461 void AliReconstruction::SetOption(const char* detector, const char* option)
463 // set options for the reconstruction of a detector
465 TObject* obj = fOptions.FindObject(detector);
466 if (obj) fOptions.Remove(obj);
467 fOptions.Add(new TNamed(detector, option));
471 //_____________________________________________________________________________
472 Bool_t AliReconstruction::Run(const char* input,
473 Int_t firstEvent, Int_t lastEvent)
475 // run the reconstruction
480 if (!input) input = fInput.Data();
481 TString fileName(input);
482 if (fileName.EndsWith("/")) {
483 fRawReader = new AliRawReaderFile(fileName);
484 } else if (fileName.EndsWith(".root")) {
485 fRawReader = new AliRawReaderRoot(fileName);
486 } else if (!fileName.IsNull()) {
487 fRawReader = new AliRawReaderDate(fileName);
488 fRawReader->SelectEvents(7);
490 if (!fEquipIdMap.IsNull() && fRawReader)
491 fRawReader->LoadEquipmentIdsMap(fEquipIdMap);
494 // get the run loader
495 if (!InitRunLoader()) return kFALSE;
497 // Set run number in CDBManager (if it is not already set by the user)
498 if (!SetRunNumber()) if (fStopOnError) return kFALSE;
500 // Import ideal TGeo geometry and apply misalignment
502 TString geom(gSystem->DirName(fGAliceFileName));
503 geom += "/geometry.root";
504 TGeoManager::Import(geom.Data());
505 if (!gGeoManager) if (fStopOnError) return kFALSE;
507 if (!MisalignGeometry(fLoadAlignData)) if (fStopOnError) return kFALSE;
509 // Temporary fix by A.Gheata
510 // Could be removed with the next Root version (>5.11)
512 TIter next(gGeoManager->GetListOfVolumes());
514 while ((vol = (TGeoVolume *)next())) {
515 if (vol->GetVoxels()) {
516 if (vol->GetVoxels()->NeedRebuild()) {
517 vol->GetVoxels()->Voxelize();
524 // local reconstruction
525 if (!fRunLocalReconstruction.IsNull()) {
526 if (!RunLocalReconstruction(fRunLocalReconstruction)) {
527 if (fStopOnError) {CleanUp(); return kFALSE;}
530 // if (!fRunVertexFinder && fRunTracking.IsNull() &&
531 // fFillESD.IsNull()) return kTRUE;
534 if (fRunVertexFinder && !CreateVertexer()) {
542 if (!fRunTracking.IsNull() && !CreateTrackers(fRunTracking)) {
550 TStopwatch stopwatch;
553 // get the possibly already existing ESD file and tree
554 AliESD* esd = new AliESD; AliESD* hltesd = new AliESD;
555 TFile* fileOld = NULL;
556 TTree* treeOld = NULL; TTree *hlttreeOld = NULL;
557 if (!gSystem->AccessPathName("AliESDs.root")){
558 gSystem->CopyFile("AliESDs.root", "AliESDs.old.root", kTRUE);
559 fileOld = TFile::Open("AliESDs.old.root");
560 if (fileOld && fileOld->IsOpen()) {
561 treeOld = (TTree*) fileOld->Get("esdTree");
562 if (treeOld) treeOld->SetBranchAddress("ESD", &esd);
563 hlttreeOld = (TTree*) fileOld->Get("HLTesdTree");
564 if (hlttreeOld) hlttreeOld->SetBranchAddress("ESD", &hltesd);
568 // create the ESD output file and tree
569 TFile* file = TFile::Open("AliESDs.root", "RECREATE");
570 if (!file->IsOpen()) {
571 AliError("opening AliESDs.root failed");
572 if (fStopOnError) {CleanUp(file, fileOld); return kFALSE;}
574 TTree* tree = new TTree("esdTree", "Tree with ESD objects");
575 tree->Branch("ESD", "AliESD", &esd);
576 TTree* hlttree = new TTree("HLTesdTree", "Tree with HLT ESD objects");
577 hlttree->Branch("ESD", "AliESD", &hltesd);
578 delete esd; delete hltesd;
579 esd = NULL; hltesd = NULL;
581 // create the file and tree with ESD additions
582 TFile *filef=0; TTree *treef=0; AliESDfriend *esdf=0;
583 if (fWriteESDfriend) {
584 filef = TFile::Open("AliESDfriends.root", "RECREATE");
585 if (!filef->IsOpen()) {
586 AliError("opening AliESDfriends.root failed");
588 treef = new TTree("esdFriendTree", "Tree with ESD friends");
589 treef->Branch("ESDfriend", "AliESDfriend", &esdf);
594 AliVertexerTracks tVertexer;
597 if (fRawReader) fRawReader->RewindEvents();
599 for (Int_t iEvent = 0; iEvent < fRunLoader->GetNumberOfEvents(); iEvent++) {
600 if (fRawReader) fRawReader->NextEvent();
601 if ((iEvent < firstEvent) || ((lastEvent >= 0) && (iEvent > lastEvent))) {
602 // copy old ESD to the new one
604 treeOld->SetBranchAddress("ESD", &esd);
605 treeOld->GetEntry(iEvent);
609 hlttreeOld->SetBranchAddress("ESD", &hltesd);
610 hlttreeOld->GetEntry(iEvent);
616 AliInfo(Form("processing event %d", iEvent));
617 fRunLoader->GetEvent(iEvent);
620 sprintf(fileName, "ESD_%d.%d_final.root",
621 fRunLoader->GetHeader()->GetRun(),
622 fRunLoader->GetHeader()->GetEventNrInRun());
623 if (!gSystem->AccessPathName(fileName)) continue;
625 // local reconstruction
626 if (!fRunLocalReconstruction.IsNull()) {
627 if (!RunLocalEventReconstruction(fRunLocalReconstruction)) {
628 if (fStopOnError) {CleanUp(file, fileOld); return kFALSE;}
632 esd = new AliESD; hltesd = new AliESD;
633 esd->SetRunNumber(fRunLoader->GetHeader()->GetRun());
634 hltesd->SetRunNumber(fRunLoader->GetHeader()->GetRun());
635 esd->SetEventNumber(fRunLoader->GetHeader()->GetEventNrInRun());
636 hltesd->SetEventNumber(fRunLoader->GetHeader()->GetEventNrInRun());
638 // Set magnetic field from the tracker
639 esd->SetMagneticField(AliTracker::GetBz());
640 hltesd->SetMagneticField(AliTracker::GetBz());
643 if (fRunVertexFinder) {
644 if (!ReadESD(esd, "vertex")) {
645 if (!RunVertexFinder(esd)) {
646 if (fStopOnError) {CleanUp(file, fileOld); return kFALSE;}
648 if (fCheckPointLevel > 0) WriteESD(esd, "vertex");
653 if (!fRunTracking.IsNull()) {
654 if (fRunHLTTracking) {
655 hltesd->SetVertex(esd->GetVertex());
656 if (!RunHLTTracking(hltesd)) {
657 if (fStopOnError) {CleanUp(file, fileOld); return kFALSE;}
663 if (!fRunTracking.IsNull()) {
664 if (!ReadESD(esd, "tracking")) {
665 if (!RunTracking(esd)) {
666 if (fStopOnError) {CleanUp(file, fileOld); return kFALSE;}
668 if (fCheckPointLevel > 0) WriteESD(esd, "tracking");
673 if (!fFillESD.IsNull()) {
674 if (!FillESD(esd, fFillESD)) {
675 if (fStopOnError) {CleanUp(file, fileOld); return kFALSE;}
680 AliESDpid::MakePID(esd);
681 if (fCheckPointLevel > 1) WriteESD(esd, "PID");
683 if (fFillTriggerESD) {
684 if (!ReadESD(esd, "trigger")) {
685 if (!FillTriggerESD(esd)) {
686 if (fStopOnError) {CleanUp(file, fileOld); return kFALSE;}
688 if (fCheckPointLevel > 1) WriteESD(esd, "trigger");
692 esd->SetPrimaryVertex(tVertexer.FindPrimaryVertex(esd));
700 if (fWriteESDfriend) {
701 esdf=new AliESDfriend();
702 esd->GetESDfriend(esdf);
706 if (fCheckPointLevel > 0) WriteESD(esd, "final");
708 delete esd; delete hltesd;
709 esd = NULL; hltesd = NULL;
712 AliInfo(Form("Execution time for filling ESD : R:%.2fs C:%.2fs",
713 stopwatch.RealTime(),stopwatch.CpuTime()));
719 if (fWriteESDfriend) {
721 treef->Write(); delete treef; filef->Close(); delete filef;
724 // Create tags for the events in the ESD tree (the ESD tree is always present)
725 // In case of empty events the tags will contain dummy values
727 CleanUp(file, fileOld);
733 //_____________________________________________________________________________
734 Bool_t AliReconstruction::RunLocalReconstruction(const TString& detectors)
736 // run the local reconstruction
738 TStopwatch stopwatch;
741 TString detStr = detectors;
742 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
743 if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
744 AliReconstructor* reconstructor = GetReconstructor(iDet);
745 if (!reconstructor) continue;
746 if (reconstructor->HasLocalReconstruction()) continue;
748 AliInfo(Form("running reconstruction for %s", fgkDetectorName[iDet]));
749 TStopwatch stopwatchDet;
750 stopwatchDet.Start();
752 fRawReader->RewindEvents();
753 reconstructor->Reconstruct(fRunLoader, fRawReader);
755 reconstructor->Reconstruct(fRunLoader);
757 AliInfo(Form("Execution time for %s: R:%.2fs C:%.2fs",
758 fgkDetectorName[iDet],
759 stopwatchDet.RealTime(),stopwatchDet.CpuTime()));
762 if ((detStr.CompareTo("ALL") != 0) && !detStr.IsNull()) {
763 AliError(Form("the following detectors were not found: %s",
765 if (fStopOnError) return kFALSE;
768 AliInfo(Form("Execution time: R:%.2fs C:%.2fs",
769 stopwatch.RealTime(),stopwatch.CpuTime()));
774 //_____________________________________________________________________________
775 Bool_t AliReconstruction::RunLocalEventReconstruction(const TString& detectors)
777 // run the local reconstruction
779 TStopwatch stopwatch;
782 TString detStr = detectors;
783 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
784 if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
785 AliReconstructor* reconstructor = GetReconstructor(iDet);
786 if (!reconstructor) continue;
787 AliLoader* loader = fLoader[iDet];
789 // conversion of digits
790 if (fRawReader && reconstructor->HasDigitConversion()) {
791 AliInfo(Form("converting raw data digits into root objects for %s",
792 fgkDetectorName[iDet]));
793 TStopwatch stopwatchDet;
794 stopwatchDet.Start();
795 loader->LoadDigits("update");
796 loader->CleanDigits();
797 loader->MakeDigitsContainer();
798 TTree* digitsTree = loader->TreeD();
799 reconstructor->ConvertDigits(fRawReader, digitsTree);
800 loader->WriteDigits("OVERWRITE");
801 loader->UnloadDigits();
802 AliInfo(Form("Execution time for %s: R:%.2fs C:%.2fs",
803 fgkDetectorName[iDet],
804 stopwatchDet.RealTime(),stopwatchDet.CpuTime()));
807 // local reconstruction
808 if (!reconstructor->HasLocalReconstruction()) continue;
809 AliInfo(Form("running reconstruction for %s", fgkDetectorName[iDet]));
810 TStopwatch stopwatchDet;
811 stopwatchDet.Start();
812 loader->LoadRecPoints("update");
813 loader->CleanRecPoints();
814 loader->MakeRecPointsContainer();
815 TTree* clustersTree = loader->TreeR();
816 if (fRawReader && !reconstructor->HasDigitConversion()) {
817 reconstructor->Reconstruct(fRawReader, clustersTree);
819 loader->LoadDigits("read");
820 TTree* digitsTree = loader->TreeD();
822 AliError(Form("Can't get the %s digits tree", fgkDetectorName[iDet]));
823 if (fStopOnError) return kFALSE;
825 reconstructor->Reconstruct(digitsTree, clustersTree);
827 loader->UnloadDigits();
829 loader->WriteRecPoints("OVERWRITE");
830 loader->UnloadRecPoints();
831 AliDebug(1,Form("Execution time for %s: R:%.2fs C:%.2fs",
832 fgkDetectorName[iDet],
833 stopwatchDet.RealTime(),stopwatchDet.CpuTime()));
836 if ((detStr.CompareTo("ALL") != 0) && !detStr.IsNull()) {
837 AliError(Form("the following detectors were not found: %s",
839 if (fStopOnError) return kFALSE;
842 AliInfo(Form("Execution time: R:%.2fs C:%.2fs",
843 stopwatch.RealTime(),stopwatch.CpuTime()));
848 //_____________________________________________________________________________
849 Bool_t AliReconstruction::RunVertexFinder(AliESD*& esd)
851 // run the barrel tracking
853 TStopwatch stopwatch;
856 AliESDVertex* vertex = NULL;
857 Double_t vtxPos[3] = {0, 0, 0};
858 Double_t vtxErr[3] = {0.07, 0.07, 0.1};
860 if (fRunLoader->GetHeader() && fRunLoader->GetHeader()->GenEventHeader()) {
861 fRunLoader->GetHeader()->GenEventHeader()->PrimaryVertex(mcVertex);
862 for (Int_t i = 0; i < 3; i++) vtxPos[i] = mcVertex[i];
866 AliInfo("running the ITS vertex finder");
867 if (fLoader[0]) fLoader[0]->LoadRecPoints();
868 vertex = fVertexer->FindVertexForCurrentEvent(fRunLoader->GetEventNumber());
869 if (fLoader[0]) fLoader[0]->UnloadRecPoints();
871 AliWarning("Vertex not found");
872 vertex = new AliESDVertex();
873 vertex->SetName("default");
876 vertex->SetTruePos(vtxPos); // store also the vertex from MC
877 vertex->SetName("reconstructed");
881 AliInfo("getting the primary vertex from MC");
882 vertex = new AliESDVertex(vtxPos, vtxErr);
886 vertex->GetXYZ(vtxPos);
887 vertex->GetSigmaXYZ(vtxErr);
889 AliWarning("no vertex reconstructed");
890 vertex = new AliESDVertex(vtxPos, vtxErr);
892 esd->SetVertex(vertex);
893 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
894 if (fTracker[iDet]) fTracker[iDet]->SetVertex(vtxPos, vtxErr);
898 AliInfo(Form("Execution time: R:%.2fs C:%.2fs",
899 stopwatch.RealTime(),stopwatch.CpuTime()));
904 //_____________________________________________________________________________
905 Bool_t AliReconstruction::RunHLTTracking(AliESD*& esd)
907 // run the HLT barrel tracking
909 TStopwatch stopwatch;
913 AliError("Missing runLoader!");
917 AliInfo("running HLT tracking");
919 // Get a pointer to the HLT reconstructor
920 AliReconstructor *reconstructor = GetReconstructor(fgkNDetectors-1);
921 if (!reconstructor) return kFALSE;
924 for (Int_t iDet = 1; iDet >= 0; iDet--) {
925 TString detName = fgkDetectorName[iDet];
926 AliDebug(1, Form("%s HLT tracking", detName.Data()));
927 reconstructor->SetOption(detName.Data());
928 AliTracker *tracker = reconstructor->CreateTracker(fRunLoader);
930 AliWarning(Form("couldn't create a HLT tracker for %s", detName.Data()));
931 if (fStopOnError) return kFALSE;
935 Double_t vtxErr[3]={0.005,0.005,0.010};
936 const AliESDVertex *vertex = esd->GetVertex();
937 vertex->GetXYZ(vtxPos);
938 tracker->SetVertex(vtxPos,vtxErr);
940 fLoader[iDet]->LoadRecPoints("read");
941 TTree* tree = fLoader[iDet]->TreeR();
943 AliError(Form("Can't get the %s cluster tree", detName.Data()));
946 tracker->LoadClusters(tree);
948 if (tracker->Clusters2Tracks(esd) != 0) {
949 AliError(Form("HLT %s Clusters2Tracks failed", fgkDetectorName[iDet]));
953 tracker->UnloadClusters();
958 AliInfo(Form("Execution time: R:%.2fs C:%.2fs",
959 stopwatch.RealTime(),stopwatch.CpuTime()));
964 //_____________________________________________________________________________
965 Bool_t AliReconstruction::RunTracking(AliESD*& esd)
967 // run the barrel tracking
969 TStopwatch stopwatch;
972 AliInfo("running tracking");
974 // pass 1: TPC + ITS inwards
975 for (Int_t iDet = 1; iDet >= 0; iDet--) {
976 if (!fTracker[iDet]) continue;
977 AliDebug(1, Form("%s tracking", fgkDetectorName[iDet]));
980 fLoader[iDet]->LoadRecPoints("read");
981 TTree* tree = fLoader[iDet]->TreeR();
983 AliError(Form("Can't get the %s cluster tree", fgkDetectorName[iDet]));
986 fTracker[iDet]->LoadClusters(tree);
989 if (fTracker[iDet]->Clusters2Tracks(esd) != 0) {
990 AliError(Form("%s Clusters2Tracks failed", fgkDetectorName[iDet]));
993 if (fCheckPointLevel > 1) {
994 WriteESD(esd, Form("%s.tracking", fgkDetectorName[iDet]));
996 // preliminary PID in TPC needed by the ITS tracker
998 GetReconstructor(1)->FillESD(fRunLoader, esd);
999 GetReconstructor(1)->FillESD((TTree*)NULL, (TTree*)NULL, esd);
1000 AliESDpid::MakePID(esd);
1004 // pass 2: ALL backwards
1005 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
1006 if (!fTracker[iDet]) continue;
1007 AliDebug(1, Form("%s back propagation", fgkDetectorName[iDet]));
1010 if (iDet > 1) { // all except ITS, TPC
1012 fLoader[iDet]->LoadRecPoints("read");
1013 tree = fLoader[iDet]->TreeR();
1015 AliError(Form("Can't get the %s cluster tree", fgkDetectorName[iDet]));
1018 fTracker[iDet]->LoadClusters(tree);
1022 if (fTracker[iDet]->PropagateBack(esd) != 0) {
1023 AliError(Form("%s backward propagation failed", fgkDetectorName[iDet]));
1026 if (fCheckPointLevel > 1) {
1027 WriteESD(esd, Form("%s.back", fgkDetectorName[iDet]));
1031 if (iDet > 2) { // all except ITS, TPC, TRD
1032 fTracker[iDet]->UnloadClusters();
1033 fLoader[iDet]->UnloadRecPoints();
1035 // updated PID in TPC needed by the ITS tracker -MI
1037 GetReconstructor(1)->FillESD(fRunLoader, esd);
1038 GetReconstructor(1)->FillESD((TTree*)NULL, (TTree*)NULL, esd);
1039 AliESDpid::MakePID(esd);
1043 // write space-points to the ESD in case alignment data output
1045 if (fWriteAlignmentData)
1046 WriteAlignmentData(esd);
1048 // pass 3: TRD + TPC + ITS refit inwards
1049 for (Int_t iDet = 2; iDet >= 0; iDet--) {
1050 if (!fTracker[iDet]) continue;
1051 AliDebug(1, Form("%s inward refit", fgkDetectorName[iDet]));
1054 if (fTracker[iDet]->RefitInward(esd) != 0) {
1055 AliError(Form("%s inward refit failed", fgkDetectorName[iDet]));
1058 if (fCheckPointLevel > 1) {
1059 WriteESD(esd, Form("%s.refit", fgkDetectorName[iDet]));
1063 fTracker[iDet]->UnloadClusters();
1064 fLoader[iDet]->UnloadRecPoints();
1067 // Propagate track to the vertex - if not done by ITS
1069 Int_t ntracks = esd->GetNumberOfTracks();
1070 for (Int_t itrack=0; itrack<ntracks; itrack++){
1071 const Double_t kRadius = 3; // beam pipe radius
1072 const Double_t kMaxStep = 5; // max step
1073 const Double_t kMaxD = 123456; // max distance to prim vertex
1074 Double_t fieldZ = AliTracker::GetBz(); //
1075 AliESDtrack * track = esd->GetTrack(itrack);
1076 if (!track) continue;
1077 if (track->IsOn(AliESDtrack::kITSrefit)) continue;
1078 track->PropagateTo(kRadius, fieldZ, track->GetMass(),kMaxStep,kTRUE);
1079 track->RelateToVertex(esd->GetVertex(),fieldZ, kMaxD);
1082 AliInfo(Form("Execution time: R:%.2fs C:%.2fs",
1083 stopwatch.RealTime(),stopwatch.CpuTime()));
1088 //_____________________________________________________________________________
1089 Bool_t AliReconstruction::FillESD(AliESD*& esd, const TString& detectors)
1091 // fill the event summary data
1093 TStopwatch stopwatch;
1095 AliInfo("filling ESD");
1097 TString detStr = detectors;
1098 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
1099 if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
1100 AliReconstructor* reconstructor = GetReconstructor(iDet);
1101 if (!reconstructor) continue;
1103 if (!ReadESD(esd, fgkDetectorName[iDet])) {
1104 AliDebug(1, Form("filling ESD for %s", fgkDetectorName[iDet]));
1105 TTree* clustersTree = NULL;
1106 if (reconstructor->HasLocalReconstruction() && fLoader[iDet]) {
1107 fLoader[iDet]->LoadRecPoints("read");
1108 clustersTree = fLoader[iDet]->TreeR();
1109 if (!clustersTree) {
1110 AliError(Form("Can't get the %s clusters tree",
1111 fgkDetectorName[iDet]));
1112 if (fStopOnError) return kFALSE;
1115 if (fRawReader && !reconstructor->HasDigitConversion()) {
1116 reconstructor->FillESD(fRawReader, clustersTree, esd);
1118 TTree* digitsTree = NULL;
1119 if (fLoader[iDet]) {
1120 fLoader[iDet]->LoadDigits("read");
1121 digitsTree = fLoader[iDet]->TreeD();
1123 AliError(Form("Can't get the %s digits tree",
1124 fgkDetectorName[iDet]));
1125 if (fStopOnError) return kFALSE;
1128 reconstructor->FillESD(digitsTree, clustersTree, esd);
1129 if (fLoader[iDet]) fLoader[iDet]->UnloadDigits();
1131 if (reconstructor->HasLocalReconstruction() && fLoader[iDet]) {
1132 fLoader[iDet]->UnloadRecPoints();
1136 reconstructor->FillESD(fRunLoader, fRawReader, esd);
1138 reconstructor->FillESD(fRunLoader, esd);
1140 if (fCheckPointLevel > 2) WriteESD(esd, fgkDetectorName[iDet]);
1144 if ((detStr.CompareTo("ALL") != 0) && !detStr.IsNull()) {
1145 AliError(Form("the following detectors were not found: %s",
1147 if (fStopOnError) return kFALSE;
1150 AliInfo(Form("Execution time: R:%.2fs C:%.2fs",
1151 stopwatch.RealTime(),stopwatch.CpuTime()));
1156 //_____________________________________________________________________________
1157 Bool_t AliReconstruction::FillTriggerESD(AliESD*& esd)
1159 // Reads the trigger decision which is
1160 // stored in Trigger.root file and fills
1161 // the corresponding esd entries
1163 AliInfo("Filling trigger information into the ESD");
1166 AliCTPRawStream input(fRawReader);
1167 if (!input.Next()) {
1168 AliError("No valid CTP (trigger) DDL raw data is found ! The trigger information is not stored in the ESD !");
1171 esd->SetTriggerMask(input.GetClassMask());
1172 esd->SetTriggerCluster(input.GetClusterMask());
1175 AliRunLoader *runloader = AliRunLoader::GetRunLoader();
1177 if (!runloader->LoadTrigger()) {
1178 AliCentralTrigger *aCTP = runloader->GetTrigger();
1179 esd->SetTriggerMask(aCTP->GetClassMask());
1180 esd->SetTriggerCluster(aCTP->GetClusterMask());
1183 AliWarning("No trigger can be loaded! The trigger information is not stored in the ESD !");
1188 AliError("No run loader is available! The trigger information is not stored in the ESD !");
1196 //_____________________________________________________________________________
1197 Bool_t AliReconstruction::IsSelected(TString detName, TString& detectors) const
1199 // check whether detName is contained in detectors
1200 // if yes, it is removed from detectors
1202 // check if all detectors are selected
1203 if ((detectors.CompareTo("ALL") == 0) ||
1204 detectors.BeginsWith("ALL ") ||
1205 detectors.EndsWith(" ALL") ||
1206 detectors.Contains(" ALL ")) {
1211 // search for the given detector
1212 Bool_t result = kFALSE;
1213 if ((detectors.CompareTo(detName) == 0) ||
1214 detectors.BeginsWith(detName+" ") ||
1215 detectors.EndsWith(" "+detName) ||
1216 detectors.Contains(" "+detName+" ")) {
1217 detectors.ReplaceAll(detName, "");
1221 // clean up the detectors string
1222 while (detectors.Contains(" ")) detectors.ReplaceAll(" ", " ");
1223 while (detectors.BeginsWith(" ")) detectors.Remove(0, 1);
1224 while (detectors.EndsWith(" ")) detectors.Remove(detectors.Length()-1, 1);
1229 //_____________________________________________________________________________
1230 Bool_t AliReconstruction::InitRunLoader()
1232 // get or create the run loader
1234 if (gAlice) delete gAlice;
1237 if (!gSystem->AccessPathName(fGAliceFileName.Data())) { // galice.root exists
1238 // load all base libraries to get the loader classes
1239 TString libs = gSystem->GetLibraries();
1240 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
1241 TString detName = fgkDetectorName[iDet];
1242 if (detName == "HLT") continue;
1243 if (libs.Contains("lib" + detName + "base.so")) continue;
1244 gSystem->Load("lib" + detName + "base.so");
1246 fRunLoader = AliRunLoader::Open(fGAliceFileName.Data());
1248 AliError(Form("no run loader found in file %s", fGAliceFileName.Data()));
1252 fRunLoader->CdGAFile();
1253 if (gFile->GetKey(AliRunLoader::GetGAliceName())) {
1254 if (fRunLoader->LoadgAlice() == 0) {
1255 gAlice = fRunLoader->GetAliRun();
1256 AliTracker::SetFieldMap(gAlice->Field(),fUniformField);
1259 if (!gAlice && !fRawReader) {
1260 AliError(Form("no gAlice object found in file %s",
1261 fGAliceFileName.Data()));
1266 } else { // galice.root does not exist
1268 AliError(Form("the file %s does not exist", fGAliceFileName.Data()));
1272 fRunLoader = AliRunLoader::Open(fGAliceFileName.Data(),
1273 AliConfig::GetDefaultEventFolderName(),
1276 AliError(Form("could not create run loader in file %s",
1277 fGAliceFileName.Data()));
1281 fRunLoader->MakeTree("E");
1283 while (fRawReader->NextEvent()) {
1284 fRunLoader->SetEventNumber(iEvent);
1285 fRunLoader->GetHeader()->Reset(fRawReader->GetRunNumber(),
1287 fRunLoader->MakeTree("H");
1288 fRunLoader->TreeE()->Fill();
1291 fRawReader->RewindEvents();
1292 fRunLoader->WriteHeader("OVERWRITE");
1293 fRunLoader->CdGAFile();
1294 fRunLoader->Write(0, TObject::kOverwrite);
1295 // AliTracker::SetFieldMap(???);
1301 //_____________________________________________________________________________
1302 AliReconstructor* AliReconstruction::GetReconstructor(Int_t iDet)
1304 // get the reconstructor object and the loader for a detector
1306 if (fReconstructor[iDet]) return fReconstructor[iDet];
1308 // load the reconstructor object
1309 TPluginManager* pluginManager = gROOT->GetPluginManager();
1310 TString detName = fgkDetectorName[iDet];
1311 TString recName = "Ali" + detName + "Reconstructor";
1312 if (gAlice && !gAlice->GetDetector(detName) && (detName != "HLT")) return NULL;
1314 if (detName == "HLT") {
1315 if (!gROOT->GetClass("AliLevel3")) {
1316 gSystem->Load("libAliL3Src.so");
1317 gSystem->Load("libAliL3Misc.so");
1318 gSystem->Load("libAliL3Hough.so");
1319 gSystem->Load("libAliL3Comp.so");
1323 AliReconstructor* reconstructor = NULL;
1324 // first check if a plugin is defined for the reconstructor
1325 TPluginHandler* pluginHandler =
1326 pluginManager->FindHandler("AliReconstructor", detName);
1327 // if not, add a plugin for it
1328 if (!pluginHandler) {
1329 AliDebug(1, Form("defining plugin for %s", recName.Data()));
1330 TString libs = gSystem->GetLibraries();
1331 if (libs.Contains("lib" + detName + "base.so") ||
1332 (gSystem->Load("lib" + detName + "base.so") >= 0)) {
1333 pluginManager->AddHandler("AliReconstructor", detName,
1334 recName, detName + "rec", recName + "()");
1336 pluginManager->AddHandler("AliReconstructor", detName,
1337 recName, detName, recName + "()");
1339 pluginHandler = pluginManager->FindHandler("AliReconstructor", detName);
1341 if (pluginHandler && (pluginHandler->LoadPlugin() == 0)) {
1342 reconstructor = (AliReconstructor*) pluginHandler->ExecPlugin(0);
1344 if (reconstructor) {
1345 TObject* obj = fOptions.FindObject(detName.Data());
1346 if (obj) reconstructor->SetOption(obj->GetTitle());
1347 reconstructor->Init(fRunLoader);
1348 fReconstructor[iDet] = reconstructor;
1351 // get or create the loader
1352 if (detName != "HLT") {
1353 fLoader[iDet] = fRunLoader->GetLoader(detName + "Loader");
1354 if (!fLoader[iDet]) {
1355 AliConfig::Instance()
1356 ->CreateDetectorFolders(fRunLoader->GetEventFolder(),
1358 // first check if a plugin is defined for the loader
1359 TPluginHandler* pluginHandler =
1360 pluginManager->FindHandler("AliLoader", detName);
1361 // if not, add a plugin for it
1362 if (!pluginHandler) {
1363 TString loaderName = "Ali" + detName + "Loader";
1364 AliDebug(1, Form("defining plugin for %s", loaderName.Data()));
1365 pluginManager->AddHandler("AliLoader", detName,
1366 loaderName, detName + "base",
1367 loaderName + "(const char*, TFolder*)");
1368 pluginHandler = pluginManager->FindHandler("AliLoader", detName);
1370 if (pluginHandler && (pluginHandler->LoadPlugin() == 0)) {
1372 (AliLoader*) pluginHandler->ExecPlugin(2, detName.Data(),
1373 fRunLoader->GetEventFolder());
1375 if (!fLoader[iDet]) { // use default loader
1376 fLoader[iDet] = new AliLoader(detName, fRunLoader->GetEventFolder());
1378 if (!fLoader[iDet]) {
1379 AliWarning(Form("couldn't get loader for %s", detName.Data()));
1380 if (fStopOnError) return NULL;
1382 fRunLoader->AddLoader(fLoader[iDet]);
1383 fRunLoader->CdGAFile();
1384 if (gFile && !gFile->IsWritable()) gFile->ReOpen("UPDATE");
1385 fRunLoader->Write(0, TObject::kOverwrite);
1390 return reconstructor;
1393 //_____________________________________________________________________________
1394 Bool_t AliReconstruction::CreateVertexer()
1396 // create the vertexer
1399 AliReconstructor* itsReconstructor = GetReconstructor(0);
1400 if (itsReconstructor) {
1401 fVertexer = itsReconstructor->CreateVertexer(fRunLoader);
1404 AliWarning("couldn't create a vertexer for ITS");
1405 if (fStopOnError) return kFALSE;
1411 //_____________________________________________________________________________
1412 Bool_t AliReconstruction::CreateTrackers(const TString& detectors)
1414 // create the trackers
1416 TString detStr = detectors;
1417 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
1418 if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
1419 AliReconstructor* reconstructor = GetReconstructor(iDet);
1420 if (!reconstructor) continue;
1421 TString detName = fgkDetectorName[iDet];
1422 if (detName == "HLT") {
1423 fRunHLTTracking = kTRUE;
1427 fTracker[iDet] = reconstructor->CreateTracker(fRunLoader);
1428 if (!fTracker[iDet] && (iDet < 7)) {
1429 AliWarning(Form("couldn't create a tracker for %s", detName.Data()));
1430 if (fStopOnError) return kFALSE;
1437 //_____________________________________________________________________________
1438 void AliReconstruction::CleanUp(TFile* file, TFile* fileOld)
1440 // delete trackers and the run loader and close and delete the file
1442 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
1443 delete fReconstructor[iDet];
1444 fReconstructor[iDet] = NULL;
1445 fLoader[iDet] = NULL;
1446 delete fTracker[iDet];
1447 fTracker[iDet] = NULL;
1465 gSystem->Unlink("AliESDs.old.root");
1470 //_____________________________________________________________________________
1471 Bool_t AliReconstruction::ReadESD(AliESD*& esd, const char* recStep) const
1473 // read the ESD event from a file
1475 if (!esd) return kFALSE;
1477 sprintf(fileName, "ESD_%d.%d_%s.root",
1478 esd->GetRunNumber(), esd->GetEventNumber(), recStep);
1479 if (gSystem->AccessPathName(fileName)) return kFALSE;
1481 AliInfo(Form("reading ESD from file %s", fileName));
1482 AliDebug(1, Form("reading ESD from file %s", fileName));
1483 TFile* file = TFile::Open(fileName);
1484 if (!file || !file->IsOpen()) {
1485 AliError(Form("opening %s failed", fileName));
1492 esd = (AliESD*) file->Get("ESD");
1498 //_____________________________________________________________________________
1499 void AliReconstruction::WriteESD(AliESD* esd, const char* recStep) const
1501 // write the ESD event to a file
1505 sprintf(fileName, "ESD_%d.%d_%s.root",
1506 esd->GetRunNumber(), esd->GetEventNumber(), recStep);
1508 AliDebug(1, Form("writing ESD to file %s", fileName));
1509 TFile* file = TFile::Open(fileName, "recreate");
1510 if (!file || !file->IsOpen()) {
1511 AliError(Form("opening %s failed", fileName));
1522 //_____________________________________________________________________________
1523 void AliReconstruction::CreateTag(TFile* file)
1528 Double_t fMUONMASS = 0.105658369;
1531 Double_t fThetaX, fThetaY, fPyz, fChisquare;
1532 Double_t fPxRec,fPyRec, fPzRec, fEnergy;
1534 TLorentzVector fEPvector;
1536 Float_t fZVertexCut = 10.0;
1537 Float_t fRhoVertexCut = 2.0;
1539 Float_t fLowPtCut = 1.0;
1540 Float_t fHighPtCut = 3.0;
1541 Float_t fVeryHighPtCut = 10.0;
1544 Double_t partFrac[5] = {0.01, 0.01, 0.85, 0.10, 0.05};
1546 // Creates the tags for all the events in a given ESD file
1548 Int_t nProtons, nKaons, nPions, nMuons, nElectrons;
1549 Int_t nPos, nNeg, nNeutr;
1550 Int_t nK0s, nNeutrons, nPi0s, nGamas;
1551 Int_t nCh1GeV, nCh3GeV, nCh10GeV;
1552 Int_t nMu1GeV, nMu3GeV, nMu10GeV;
1553 Int_t nEl1GeV, nEl3GeV, nEl10GeV;
1554 Float_t maxPt = .0, meanPt = .0, totalP = .0;
1556 Int_t iRunNumber = 0;
1557 TString fVertexName("default");
1559 AliRunTag *tag = new AliRunTag();
1560 AliEventTag *evTag = new AliEventTag();
1561 TTree ttag("T","A Tree with event tags");
1562 TBranch * btag = ttag.Branch("AliTAG", &tag);
1563 btag->SetCompressionLevel(9);
1565 AliInfo(Form("Creating the tags......."));
1567 if (!file || !file->IsOpen()) {
1568 AliError(Form("opening failed"));
1572 Int_t firstEvent = 0,lastEvent = 0;
1573 TTree *t = (TTree*) file->Get("esdTree");
1574 TBranch * b = t->GetBranch("ESD");
1576 b->SetAddress(&esd);
1579 Int_t iInitRunNumber = esd->GetRunNumber();
1581 Int_t iNumberOfEvents = b->GetEntries();
1582 for (Int_t iEventNumber = 0; iEventNumber < iNumberOfEvents; iEventNumber++) {
1610 b->GetEntry(iEventNumber);
1611 iRunNumber = esd->GetRunNumber();
1612 if(iRunNumber != iInitRunNumber) AliFatal("Inconsistency of run numbers in the AliESD!!!");
1613 const AliESDVertex * vertexIn = esd->GetVertex();
1614 if (!vertexIn) AliError("ESD has not defined vertex.");
1615 if (vertexIn) fVertexName = vertexIn->GetName();
1616 if(fVertexName != "default") fVertexflag = 1;
1617 for (Int_t iTrackNumber = 0; iTrackNumber < esd->GetNumberOfTracks(); iTrackNumber++) {
1618 AliESDtrack * esdTrack = esd->GetTrack(iTrackNumber);
1619 UInt_t status = esdTrack->GetStatus();
1621 //select only tracks with ITS refit
1622 if ((status&AliESDtrack::kITSrefit)==0) continue;
1623 //select only tracks with TPC refit
1624 if ((status&AliESDtrack::kTPCrefit)==0) continue;
1626 //select only tracks with the "combined PID"
1627 if ((status&AliESDtrack::kESDpid)==0) continue;
1629 esdTrack->GetPxPyPz(p);
1630 Double_t momentum = sqrt(pow(p[0],2) + pow(p[1],2) + pow(p[2],2));
1631 Double_t fPt = sqrt(pow(p[0],2) + pow(p[1],2));
1634 if(fPt > maxPt) maxPt = fPt;
1636 if(esdTrack->GetSign() > 0) {
1638 if(fPt > fLowPtCut) nCh1GeV++;
1639 if(fPt > fHighPtCut) nCh3GeV++;
1640 if(fPt > fVeryHighPtCut) nCh10GeV++;
1642 if(esdTrack->GetSign() < 0) {
1644 if(fPt > fLowPtCut) nCh1GeV++;
1645 if(fPt > fHighPtCut) nCh3GeV++;
1646 if(fPt > fVeryHighPtCut) nCh10GeV++;
1648 if(esdTrack->GetSign() == 0) nNeutr++;
1652 esdTrack->GetESDpid(prob);
1655 for(Int_t i = 0; i < AliPID::kSPECIES; i++) rcc += prob[i]*partFrac[i];
1656 if(rcc == 0.0) continue;
1659 for(Int_t i = 0; i < AliPID::kSPECIES; i++) w[i] = prob[i]*partFrac[i]/rcc;
1662 if ((w[4]>w[3])&&(w[4]>w[2])&&(w[4]>w[1])&&(w[4]>w[0])) nProtons++;
1664 if ((w[3]>w[4])&&(w[3]>w[2])&&(w[3]>w[1])&&(w[3]>w[0])) nKaons++;
1666 if ((w[2]>w[4])&&(w[2]>w[3])&&(w[2]>w[1])&&(w[2]>w[0])) nPions++;
1668 if ((w[0]>w[4])&&(w[0]>w[3])&&(w[0]>w[2])&&(w[0]>w[1])) {
1670 if(fPt > fLowPtCut) nEl1GeV++;
1671 if(fPt > fHighPtCut) nEl3GeV++;
1672 if(fPt > fVeryHighPtCut) nEl10GeV++;
1680 Int_t nMuonTracks = esd->GetNumberOfMuonTracks();
1681 // loop over all reconstructed tracks (also first track of combination)
1682 for (Int_t iTrack = 0; iTrack < nMuonTracks; iTrack++) {
1683 AliESDMuonTrack* muonTrack = esd->GetMuonTrack(iTrack);
1684 if (muonTrack == 0x0) continue;
1686 // Coordinates at vertex
1687 fZ = muonTrack->GetZ();
1688 fY = muonTrack->GetBendingCoor();
1689 fX = muonTrack->GetNonBendingCoor();
1691 fThetaX = muonTrack->GetThetaX();
1692 fThetaY = muonTrack->GetThetaY();
1694 fPyz = 1./TMath::Abs(muonTrack->GetInverseBendingMomentum());
1695 fPzRec = - fPyz / TMath::Sqrt(1.0 + TMath::Tan(fThetaY)*TMath::Tan(fThetaY));
1696 fPxRec = fPzRec * TMath::Tan(fThetaX);
1697 fPyRec = fPzRec * TMath::Tan(fThetaY);
1698 fCharge = Int_t(TMath::Sign(1.,muonTrack->GetInverseBendingMomentum()));
1700 //ChiSquare of the track if needed
1701 fChisquare = muonTrack->GetChi2()/(2.0 * muonTrack->GetNHit() - 5);
1702 fEnergy = TMath::Sqrt(fMUONMASS * fMUONMASS + fPxRec * fPxRec + fPyRec * fPyRec + fPzRec * fPzRec);
1703 fEPvector.SetPxPyPzE(fPxRec, fPyRec, fPzRec, fEnergy);
1705 // total number of muons inside a vertex cut
1706 if((TMath::Abs(fZ)<fZVertexCut) && (TMath::Sqrt(fY*fY+fX*fX)<fRhoVertexCut)) {
1708 if(fEPvector.Pt() > fLowPtCut) {
1710 if(fEPvector.Pt() > fHighPtCut) {
1712 if (fEPvector.Pt() > fVeryHighPtCut) {
1720 // Fill the event tags
1722 meanPt = meanPt/ntrack;
1724 evTag->SetEventId(iEventNumber+1);
1726 evTag->SetVertexX(vertexIn->GetXv());
1727 evTag->SetVertexY(vertexIn->GetYv());
1728 evTag->SetVertexZ(vertexIn->GetZv());
1729 evTag->SetVertexZError(vertexIn->GetZRes());
1731 evTag->SetVertexFlag(fVertexflag);
1733 evTag->SetT0VertexZ(esd->GetT0zVertex());
1735 evTag->SetTriggerMask(esd->GetTriggerMask());
1736 evTag->SetTriggerCluster(esd->GetTriggerCluster());
1738 evTag->SetZDCNeutron1Energy(esd->GetZDCN1Energy());
1739 evTag->SetZDCProton1Energy(esd->GetZDCP1Energy());
1740 evTag->SetZDCNeutron2Energy(esd->GetZDCN2Energy());
1741 evTag->SetZDCProton2Energy(esd->GetZDCP2Energy());
1742 evTag->SetZDCEMEnergy(esd->GetZDCEMEnergy());
1743 evTag->SetNumOfParticipants(esd->GetZDCParticipants());
1746 evTag->SetNumOfTracks(esd->GetNumberOfTracks());
1747 evTag->SetNumOfPosTracks(nPos);
1748 evTag->SetNumOfNegTracks(nNeg);
1749 evTag->SetNumOfNeutrTracks(nNeutr);
1751 evTag->SetNumOfV0s(esd->GetNumberOfV0s());
1752 evTag->SetNumOfCascades(esd->GetNumberOfCascades());
1753 evTag->SetNumOfKinks(esd->GetNumberOfKinks());
1754 evTag->SetNumOfPMDTracks(esd->GetNumberOfPmdTracks());
1756 evTag->SetNumOfProtons(nProtons);
1757 evTag->SetNumOfKaons(nKaons);
1758 evTag->SetNumOfPions(nPions);
1759 evTag->SetNumOfMuons(nMuons);
1760 evTag->SetNumOfElectrons(nElectrons);
1761 evTag->SetNumOfPhotons(nGamas);
1762 evTag->SetNumOfPi0s(nPi0s);
1763 evTag->SetNumOfNeutrons(nNeutrons);
1764 evTag->SetNumOfKaon0s(nK0s);
1766 evTag->SetNumOfChargedAbove1GeV(nCh1GeV);
1767 evTag->SetNumOfChargedAbove3GeV(nCh3GeV);
1768 evTag->SetNumOfChargedAbove10GeV(nCh10GeV);
1769 evTag->SetNumOfMuonsAbove1GeV(nMu1GeV);
1770 evTag->SetNumOfMuonsAbove3GeV(nMu3GeV);
1771 evTag->SetNumOfMuonsAbove10GeV(nMu10GeV);
1772 evTag->SetNumOfElectronsAbove1GeV(nEl1GeV);
1773 evTag->SetNumOfElectronsAbove3GeV(nEl3GeV);
1774 evTag->SetNumOfElectronsAbove10GeV(nEl10GeV);
1776 evTag->SetNumOfPHOSClusters(esd->GetNumberOfPHOSClusters());
1777 evTag->SetNumOfEMCALClusters(esd->GetNumberOfEMCALClusters());
1779 evTag->SetTotalMomentum(totalP);
1780 evTag->SetMeanPt(meanPt);
1781 evTag->SetMaxPt(maxPt);
1783 tag->SetRunId(iInitRunNumber);
1784 tag->AddEventTag(*evTag);
1786 lastEvent = iNumberOfEvents;
1792 sprintf(fileName, "Run%d.Event%d_%d.ESD.tag.root",
1793 tag->GetRunId(),firstEvent,lastEvent );
1794 AliInfo(Form("writing tags to file %s", fileName));
1795 AliDebug(1, Form("writing tags to file %s", fileName));
1797 TFile* ftag = TFile::Open(fileName, "recreate");
1806 void AliReconstruction::WriteAlignmentData(AliESD* esd)
1808 // Write space-points which are then used in the alignment procedures
1809 // For the moment only ITS, TRD and TPC
1811 // Load TOF clusters
1813 fLoader[3]->LoadRecPoints("read");
1814 TTree* tree = fLoader[3]->TreeR();
1816 AliError(Form("Can't get the %s cluster tree", fgkDetectorName[3]));
1819 fTracker[3]->LoadClusters(tree);
1821 Int_t ntracks = esd->GetNumberOfTracks();
1822 for (Int_t itrack = 0; itrack < ntracks; itrack++)
1824 AliESDtrack *track = esd->GetTrack(itrack);
1827 for (Int_t iDet = 3; iDet >= 0; iDet--)
1828 nsp += track->GetNcls(iDet);
1830 AliTrackPointArray *sp = new AliTrackPointArray(nsp);
1831 track->SetTrackPointArray(sp);
1833 for (Int_t iDet = 3; iDet >= 0; iDet--) {
1834 AliTracker *tracker = fTracker[iDet];
1835 if (!tracker) continue;
1836 Int_t nspdet = track->GetNcls(iDet);
1837 if (nspdet <= 0) continue;
1838 track->GetClusters(iDet,idx);
1842 while (isp < nspdet) {
1843 Bool_t isvalid = tracker->GetTrackPoint(idx[isp2],p); isp2++;
1844 const Int_t kNTPCmax = 159;
1845 if (iDet==1 && isp2>kNTPCmax) break; // to be fixed
1846 if (!isvalid) continue;
1847 sp->AddPoint(isptrack,&p); isptrack++; isp++;
1853 fTracker[3]->UnloadClusters();
1854 fLoader[3]->UnloadRecPoints();