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 // The input data of a detector can be replaced by the corresponding HLT //
105 // data by calling (usual detector string) //
106 // SetUseHLTData("..."); //
108 // For debug purposes the method SetCheckPointLevel can be used. If the //
109 // argument is greater than 0, files with ESD events will be written after //
110 // selected steps of the reconstruction for each event: //
111 // level 1: after tracking and after filling of ESD (final) //
112 // level 2: in addition after each tracking step //
113 // level 3: in addition after the filling of ESD for each detector //
114 // If a final check point file exists for an event, this event will be //
115 // skipped in the reconstruction. The tracking and the filling of ESD for //
116 // a detector will be skipped as well, if the corresponding check point //
117 // file exists. The ESD event will then be loaded from the file instead. //
119 ///////////////////////////////////////////////////////////////////////////////
126 #include <TPluginManager.h>
127 #include <TGeoManager.h>
128 #include <TLorentzVector.h>
131 #include <TObjArray.h>
134 #include "AliReconstruction.h"
135 #include "AliCodeTimer.h"
136 #include "AliReconstructor.h"
138 #include "AliRunLoader.h"
140 #include "AliRawReaderFile.h"
141 #include "AliRawReaderDate.h"
142 #include "AliRawReaderRoot.h"
143 #include "AliRawEventHeaderBase.h"
144 #include "AliESDEvent.h"
145 #include "AliESDMuonTrack.h"
146 #include "AliESDfriend.h"
147 #include "AliESDVertex.h"
148 #include "AliESDcascade.h"
149 #include "AliESDkink.h"
150 #include "AliESDtrack.h"
151 #include "AliESDCaloCluster.h"
152 #include "AliESDCaloCells.h"
153 #include "AliMultiplicity.h"
154 #include "AliTracker.h"
155 #include "AliVertexer.h"
156 #include "AliVertexerTracks.h"
157 #include "AliV0vertexer.h"
158 #include "AliCascadeVertexer.h"
159 #include "AliHeader.h"
160 #include "AliGenEventHeader.h"
162 #include "AliESDpid.h"
163 #include "AliESDtrack.h"
164 #include "AliESDPmdTrack.h"
166 #include "AliESDTagCreator.h"
167 #include "AliAODTagCreator.h"
169 #include "AliGeomManager.h"
170 #include "AliTrackPointArray.h"
171 #include "AliCDBManager.h"
172 #include "AliCDBStorage.h"
173 #include "AliCDBEntry.h"
174 #include "AliAlignObj.h"
176 #include "AliCentralTrigger.h"
177 #include "AliTriggerConfiguration.h"
178 #include "AliTriggerClass.h"
179 #include "AliCTPRawStream.h"
181 #include "AliQADataMakerRec.h"
182 #include "AliGlobalQADataMaker.h"
184 #include "AliQADataMakerSteer.h"
186 #include "AliPlaneEff.h"
188 #include "AliSysInfo.h" // memory snapshots
189 #include "AliRawHLTManager.h"
191 #include "AliMagWrapCheb.h"
193 ClassImp(AliReconstruction)
196 //_____________________________________________________________________________
197 const char* AliReconstruction::fgkDetectorName[AliReconstruction::fgkNDetectors] = {"ITS", "TPC", "TRD", "TOF", "PHOS", "HMPID", "EMCAL", "MUON", "FMD", "ZDC", "PMD", "T0", "VZERO", "ACORDE", "HLT"};
199 //_____________________________________________________________________________
200 AliReconstruction::AliReconstruction(const char* gAliceFilename,
201 const char* name, const char* title) :
204 fUniformField(kFALSE),
205 fRunVertexFinder(kTRUE),
206 fRunVertexFinderTracks(kTRUE),
207 fRunHLTTracking(kFALSE),
208 fRunMuonTracking(kFALSE),
210 fRunCascadeFinder(kTRUE),
211 fStopOnError(kFALSE),
212 fWriteAlignmentData(kFALSE),
213 fWriteESDfriend(kFALSE),
215 fFillTriggerESD(kTRUE),
223 fRunLocalReconstruction("ALL"),
226 fUseTrackingErrorsForAlignment(""),
227 fGAliceFileName(gAliceFilename),
232 fNumberOfEventsPerFile(1),
235 fLoadAlignFromCDB(kTRUE),
236 fLoadAlignData("ALL"),
242 fParentRawReader(NULL),
245 fDiamondProfile(NULL),
246 fDiamondProfileTPC(NULL),
247 fMeanVertexConstraint(kTRUE),
251 fAlignObjArray(NULL),
254 fInitCDBCalled(kFALSE),
255 fSetRunNumberFromDataCalled(kFALSE),
259 fSameQACycle(kFALSE),
261 fRunPlaneEff(kFALSE),
273 fIsNewRunLoader(kFALSE),
276 // create reconstruction object with default parameters
278 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
279 fReconstructor[iDet] = NULL;
280 fLoader[iDet] = NULL;
281 fTracker[iDet] = NULL;
282 fQADataMaker[iDet] = NULL;
283 fQACycles[iDet] = 999999;
285 fQADataMaker[fgkNDetectors]=NULL; //Global QA
289 //_____________________________________________________________________________
290 AliReconstruction::AliReconstruction(const AliReconstruction& rec) :
293 fUniformField(rec.fUniformField),
294 fRunVertexFinder(rec.fRunVertexFinder),
295 fRunVertexFinderTracks(rec.fRunVertexFinderTracks),
296 fRunHLTTracking(rec.fRunHLTTracking),
297 fRunMuonTracking(rec.fRunMuonTracking),
298 fRunV0Finder(rec.fRunV0Finder),
299 fRunCascadeFinder(rec.fRunCascadeFinder),
300 fStopOnError(rec.fStopOnError),
301 fWriteAlignmentData(rec.fWriteAlignmentData),
302 fWriteESDfriend(rec.fWriteESDfriend),
303 fWriteAOD(rec.fWriteAOD),
304 fFillTriggerESD(rec.fFillTriggerESD),
306 fCleanESD(rec.fCleanESD),
307 fV0DCAmax(rec.fV0DCAmax),
308 fV0CsPmin(rec.fV0CsPmin),
312 fRunLocalReconstruction(rec.fRunLocalReconstruction),
313 fRunTracking(rec.fRunTracking),
314 fFillESD(rec.fFillESD),
315 fUseTrackingErrorsForAlignment(rec.fUseTrackingErrorsForAlignment),
316 fGAliceFileName(rec.fGAliceFileName),
318 fEquipIdMap(rec.fEquipIdMap),
319 fFirstEvent(rec.fFirstEvent),
320 fLastEvent(rec.fLastEvent),
321 fNumberOfEventsPerFile(rec.fNumberOfEventsPerFile),
324 fLoadAlignFromCDB(rec.fLoadAlignFromCDB),
325 fLoadAlignData(rec.fLoadAlignData),
326 fESDPar(rec.fESDPar),
327 fUseHLTData(rec.fUseHLTData),
331 fParentRawReader(NULL),
334 fDiamondProfile(NULL),
335 fDiamondProfileTPC(NULL),
336 fMeanVertexConstraint(rec.fMeanVertexConstraint),
340 fAlignObjArray(rec.fAlignObjArray),
341 fCDBUri(rec.fCDBUri),
343 fInitCDBCalled(rec.fInitCDBCalled),
344 fSetRunNumberFromDataCalled(rec.fSetRunNumberFromDataCalled),
346 fRunGlobalQA(rec.fRunGlobalQA),
347 fInLoopQA(rec.fInLoopQA),
348 fSameQACycle(rec.fSameQACycle),
349 fRunPlaneEff(rec.fRunPlaneEff),
361 fIsNewRunLoader(rec.fIsNewRunLoader),
366 for (Int_t i = 0; i < rec.fOptions.GetEntriesFast(); i++) {
367 if (rec.fOptions[i]) fOptions.Add(rec.fOptions[i]->Clone());
369 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
370 fReconstructor[iDet] = NULL;
371 fLoader[iDet] = NULL;
372 fTracker[iDet] = NULL;
373 fQADataMaker[iDet] = NULL;
374 fQACycles[iDet] = rec.fQACycles[iDet];
376 fQADataMaker[fgkNDetectors]=NULL; //Global QA
377 for (Int_t i = 0; i < rec.fSpecCDBUri.GetEntriesFast(); i++) {
378 if (rec.fSpecCDBUri[i]) fSpecCDBUri.Add(rec.fSpecCDBUri[i]->Clone());
382 //_____________________________________________________________________________
383 AliReconstruction& AliReconstruction::operator = (const AliReconstruction& rec)
385 // assignment operator
387 this->~AliReconstruction();
388 new(this) AliReconstruction(rec);
392 //_____________________________________________________________________________
393 AliReconstruction::~AliReconstruction()
399 fSpecCDBUri.Delete();
401 AliCodeTimer::Instance()->Print();
404 //_____________________________________________________________________________
405 void AliReconstruction::InitCDB()
407 // activate a default CDB storage
408 // First check if we have any CDB storage set, because it is used
409 // to retrieve the calibration and alignment constants
411 if (fInitCDBCalled) return;
412 fInitCDBCalled = kTRUE;
414 AliCDBManager* man = AliCDBManager::Instance();
415 if (man->IsDefaultStorageSet())
417 AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
418 AliWarning("Default CDB storage has been already set !");
419 AliWarning(Form("Ignoring the default storage declared in AliReconstruction: %s",fCDBUri.Data()));
420 AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
421 fCDBUri = man->GetDefaultStorage()->GetURI();
424 if (fCDBUri.Length() > 0)
426 AliDebug(2,"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
427 AliDebug(2, Form("Default CDB storage is set to: %s", fCDBUri.Data()));
428 AliDebug(2, "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
430 fCDBUri="local://$ALICE_ROOT";
431 AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
432 AliWarning("Default CDB storage not yet set !!!!");
433 AliWarning(Form("Setting it now to: %s", fCDBUri.Data()));
434 AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
437 man->SetDefaultStorage(fCDBUri);
440 // Now activate the detector specific CDB storage locations
441 for (Int_t i = 0; i < fSpecCDBUri.GetEntriesFast(); i++) {
442 TObject* obj = fSpecCDBUri[i];
444 AliDebug(2, "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
445 AliDebug(2, Form("Specific CDB storage for %s is set to: %s",obj->GetName(),obj->GetTitle()));
446 AliDebug(2, "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
447 man->SetSpecificStorage(obj->GetName(), obj->GetTitle());
452 //_____________________________________________________________________________
453 void AliReconstruction::SetDefaultStorage(const char* uri) {
454 // Store the desired default CDB storage location
455 // Activate it later within the Run() method
461 //_____________________________________________________________________________
462 void AliReconstruction::SetSpecificStorage(const char* calibType, const char* uri) {
463 // Store a detector-specific CDB storage location
464 // Activate it later within the Run() method
466 AliCDBPath aPath(calibType);
467 if(!aPath.IsValid()){
468 // if calibType is not wildcard but it is a valid detector, add "/*" to make it a valid path
469 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
470 if(!strcmp(calibType, fgkDetectorName[iDet])) {
471 aPath.SetPath(Form("%s/*", calibType));
472 AliInfo(Form("Path for specific storage set to %s", aPath.GetPath().Data()));
476 if(!aPath.IsValid()){
477 AliError(Form("Not a valid path or detector: %s", calibType));
482 // // check that calibType refers to a "valid" detector name
483 // Bool_t isDetector = kFALSE;
484 // for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
485 // TString detName = fgkDetectorName[iDet];
486 // if(aPath.GetLevel0() == detName) {
487 // isDetector = kTRUE;
493 // AliError(Form("Not a valid detector: %s", aPath.GetLevel0().Data()));
497 TObject* obj = fSpecCDBUri.FindObject(aPath.GetPath().Data());
498 if (obj) fSpecCDBUri.Remove(obj);
499 fSpecCDBUri.Add(new TNamed(aPath.GetPath().Data(), uri));
503 //_____________________________________________________________________________
504 Bool_t AliReconstruction::SetRunNumberFromData()
506 // The method is called in Run() in order
507 // to set a correct run number.
508 // In case of raw data reconstruction the
509 // run number is taken from the raw data header
511 if (fSetRunNumberFromDataCalled) return kTRUE;
512 fSetRunNumberFromDataCalled = kTRUE;
514 AliCDBManager* man = AliCDBManager::Instance();
516 if(man->GetRun() > 0) {
517 AliWarning("Run number is taken from raw-event header! Ignoring settings in AliCDBManager!");
521 AliError("No run loader is found !");
524 // read run number from gAlice
525 if(fRunLoader->GetAliRun())
526 AliCDBManager::Instance()->SetRun(fRunLoader->GetHeader()->GetRun());
529 if(fRawReader->NextEvent()) {
530 AliCDBManager::Instance()->SetRun(fRawReader->GetRunNumber());
531 fRawReader->RewindEvents();
534 if(man->GetRun() > 0) {
535 AliWarning("No raw events is found ! Using settings in AliCDBManager !");
540 AliWarning("Neither raw events nor settings in AliCDBManager are found !");
546 AliError("Neither gAlice nor RawReader objects are found !");
556 //_____________________________________________________________________________
557 void AliReconstruction::SetCDBLock() {
558 // Set CDB lock: from now on it is forbidden to reset the run number
559 // or the default storage or to activate any further storage!
561 AliCDBManager::Instance()->SetLock(1);
564 //_____________________________________________________________________________
565 Bool_t AliReconstruction::MisalignGeometry(const TString& detectors)
567 // Read the alignment objects from CDB.
568 // Each detector is supposed to have the
569 // alignment objects in DET/Align/Data CDB path.
570 // All the detector objects are then collected,
571 // sorted by geometry level (starting from ALIC) and
572 // then applied to the TGeo geometry.
573 // Finally an overlaps check is performed.
575 // Load alignment data from CDB and fill fAlignObjArray
576 if(fLoadAlignFromCDB){
578 TString detStr = detectors;
579 TString loadAlObjsListOfDets = "";
581 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
582 if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
583 loadAlObjsListOfDets += fgkDetectorName[iDet];
584 loadAlObjsListOfDets += " ";
585 } // end loop over detectors
586 loadAlObjsListOfDets.Prepend("GRP "); //add alignment objects for non-sensitive modules
587 AliGeomManager::ApplyAlignObjsFromCDB(loadAlObjsListOfDets.Data());
589 // Check if the array with alignment objects was
590 // provided by the user. If yes, apply the objects
591 // to the present TGeo geometry
592 if (fAlignObjArray) {
593 if (gGeoManager && gGeoManager->IsClosed()) {
594 if (AliGeomManager::ApplyAlignObjsToGeom(*fAlignObjArray) == kFALSE) {
595 AliError("The misalignment of one or more volumes failed!"
596 "Compare the list of simulated detectors and the list of detector alignment data!");
601 AliError("Can't apply the misalignment! gGeoManager doesn't exist or it is still opened!");
607 delete fAlignObjArray; fAlignObjArray=0;
612 //_____________________________________________________________________________
613 void AliReconstruction::SetGAliceFile(const char* fileName)
615 // set the name of the galice file
617 fGAliceFileName = fileName;
620 //_____________________________________________________________________________
621 void AliReconstruction::SetInput(const char* input)
623 // In case the input string starts with 'mem://', we run in an online mode
624 // and AliRawReaderDateOnline object is created. In all other cases a raw-data
625 // file is assumed. One can give as an input:
626 // mem://: - events taken from DAQ monitoring libs online
628 // mem://<filename> - emulation of the above mode (via DATE monitoring libs)
632 //_____________________________________________________________________________
633 void AliReconstruction::SetOption(const char* detector, const char* option)
635 // set options for the reconstruction of a detector
637 TObject* obj = fOptions.FindObject(detector);
638 if (obj) fOptions.Remove(obj);
639 fOptions.Add(new TNamed(detector, option));
642 //_____________________________________________________________________________
643 Bool_t AliReconstruction::Run(const char* input)
646 AliCodeTimerAuto("");
648 if (!InitRun(input)) return kFALSE;
650 //******* The loop over events
652 while ((iEvent < fRunLoader->GetNumberOfEvents()) ||
653 (fRawReader && fRawReader->NextEvent())) {
654 if (!RunEvent(iEvent)) return kFALSE;
658 if (!FinishRun()) return kFALSE;
663 //_____________________________________________________________________________
664 Bool_t AliReconstruction::InitRun(const char* input)
666 // Initialize all the stuff before
667 // going into the event loop
668 // If the second argument is given, the first one is ignored and
669 // the reconstruction works in an online mode
670 AliCodeTimerAuto("");
672 // Overwrite the previous setting
673 if (input) fInput = input;
675 // set the input in case of raw data
676 fRawReader = AliRawReader::Create(fInput.Data());
678 AliInfo("Reconstruction will run over digits");
680 if (!fEquipIdMap.IsNull() && fRawReader)
681 fRawReader->LoadEquipmentIdsMap(fEquipIdMap);
683 if (!fUseHLTData.IsNull()) {
684 // create the RawReaderHLT which performs redirection of HLT input data for
685 // the specified detectors
686 AliRawReader* pRawReader=AliRawHLTManager::CreateRawReaderHLT(fRawReader, fUseHLTData.Data());
688 fParentRawReader=fRawReader;
689 fRawReader=pRawReader;
691 AliError(Form("can not create Raw Reader for HLT input %s", fUseHLTData.Data()));
695 AliSysInfo::AddStamp("Start");
696 // get the run loader
697 if (!InitRunLoader()) return kFALSE;
698 AliSysInfo::AddStamp("LoadLoader");
700 // Initialize the CDB storage
703 AliSysInfo::AddStamp("LoadCDB");
705 // Set run number in CDBManager (if it is not already set by the user)
706 if (!SetRunNumberFromData()) if (fStopOnError) return kFALSE;
708 // Set CDB lock: from now on it is forbidden to reset the run number
709 // or the default storage or to activate any further storage!
712 // Import ideal TGeo geometry and apply misalignment
714 TString geom(gSystem->DirName(fGAliceFileName));
715 geom += "/geometry.root";
716 AliGeomManager::LoadGeometry(geom.Data());
717 if (!gGeoManager) if (fStopOnError) return kFALSE;
720 if (!MisalignGeometry(fLoadAlignData)) if (fStopOnError) return kFALSE;
721 AliSysInfo::AddStamp("LoadGeom");
724 // Get the GRP CDB entry
725 AliCDBEntry* entryGRP = AliCDBManager::Instance()->Get("GRP/GRP/Data");
729 list = dynamic_cast<TList*>(entryGRP->GetObject());
730 fGRPData=dynamic_cast<TMap*>(list->FindObject("pp")); // ?????????
733 AliError("No GRP entry found in OCDB!");
738 // Magnetic field map
739 if (!AliTracker::GetFieldMap()) {
740 // Construct the field map out of the information retrieved from GRP.
742 // For the moment, this is a dummy piece of code.
743 // The actual map is expected to be already created in rec.C !
747 Int_t map=AliMagWrapCheb::k5kG;
748 Bool_t dipoleON=kTRUE;
751 TObjString *l3Current=
752 dynamic_cast<TObjString*>(fGRPData->GetValue("fL3Current"));
754 AliError("GRP/GRP/Data entry: missing value for the L3 current !");
757 TObjString *l3Polarity=
758 dynamic_cast<TObjString*>(fGRPData->GetValue("fL3Polarity"));
760 AliError("GRP/GRP/Data entry: missing value for the L3 polarity !");
765 TObjString *diCurrent=
766 dynamic_cast<TObjString*>(fGRPData->GetValue("fDipoleCurrent"));
768 AliError("GRP/GRP/Data entry: missing value for the dipole current !");
771 TObjString *diPolarity=
772 dynamic_cast<TObjString*>(fGRPData->GetValue("fDipolePolarity"));
774 AliError("GRP/GRP/Data entry: missing value for the dipole polarity !");
780 new AliMagWrapCheb("Maps","Maps",2,factor,10.,map,dipoleON);
781 AliTracker::SetFieldMap(field,fUniformField);
784 AliFatal("Please, provide the field map ! Crashing deliberately...");
789 // Get the diamond profile from OCDB
790 AliCDBEntry* entry = AliCDBManager::Instance()
791 ->Get("GRP/Calib/MeanVertex");
794 fDiamondProfile = dynamic_cast<AliESDVertex*> (entry->GetObject());
796 AliError("No diamond profile found in OCDB!");
800 entry = AliCDBManager::Instance()
801 ->Get("GRP/Calib/MeanVertexTPC");
804 fDiamondProfileTPC = dynamic_cast<AliESDVertex*> (entry->GetObject());
806 AliError("No diamond profile found in OCDB!");
809 ftVertexer = new AliVertexerTracks(AliTracker::GetBz());
810 if(fDiamondProfile && fMeanVertexConstraint) ftVertexer->SetVtxStart(fDiamondProfile);
813 if (fRunVertexFinder && !CreateVertexer()) {
819 AliSysInfo::AddStamp("Vertexer");
822 if (!fRunTracking.IsNull() && !CreateTrackers(fRunTracking)) {
828 AliSysInfo::AddStamp("LoadTrackers");
830 // get the possibly already existing ESD file and tree
831 fesd = new AliESDEvent(); fhltesd = new AliESDEvent();
832 if (!gSystem->AccessPathName("AliESDs.root")){
833 gSystem->CopyFile("AliESDs.root", "AliESDs.old.root", kTRUE);
834 ffileOld = TFile::Open("AliESDs.old.root");
835 if (ffileOld && ffileOld->IsOpen()) {
836 ftreeOld = (TTree*) ffileOld->Get("esdTree");
837 if (ftreeOld)fesd->ReadFromTree(ftreeOld);
838 fhlttreeOld = (TTree*) ffileOld->Get("HLTesdTree");
839 if (fhlttreeOld) fhltesd->ReadFromTree(fhlttreeOld);
843 // create the ESD output file and tree
844 ffile = TFile::Open("AliESDs.root", "RECREATE");
845 ffile->SetCompressionLevel(2);
846 if (!ffile->IsOpen()) {
847 AliError("opening AliESDs.root failed");
848 if (fStopOnError) {CleanUp(ffile, ffileOld); return kFALSE;}
851 ftree = new TTree("esdTree", "Tree with ESD objects");
852 fesd = new AliESDEvent();
853 fesd->CreateStdContent();
854 fesd->WriteToTree(ftree);
856 fhlttree = new TTree("HLTesdTree", "Tree with HLT ESD objects");
857 fhltesd = new AliESDEvent();
858 fhltesd->CreateStdContent();
859 fhltesd->WriteToTree(fhlttree);
862 if (fWriteESDfriend) {
863 fesdf = new AliESDfriend();
864 TBranch *br=ftree->Branch("ESDfriend.","AliESDfriend", &fesdf);
865 br->SetFile("AliESDfriends.root");
866 fesd->AddObject(fesdf);
871 if (fRawReader) fRawReader->RewindEvents();
874 gSystem->GetProcInfo(&ProcInfo);
875 AliInfo(Form("Current memory usage %d %d", ProcInfo.fMemResident, ProcInfo.fMemVirtual));
879 AliQADataMakerSteer qas ;
880 if (fRunQA && fRawReader) {
881 qas.Run(fRunLocalReconstruction, fRawReader) ;
882 fSameQACycle = kTRUE ;
884 //Initialize the QA and start of cycle for out-of-cycle QA
886 TString detStr(fFillESD);
887 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
888 if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
889 AliQADataMakerRec *qadm = GetQADataMaker(iDet);
891 AliInfo(Form("Initializing the QA data maker for %s",
892 fgkDetectorName[iDet]));
893 qadm->Init(AliQA::kRECPOINTS, AliCDBManager::Instance()->GetRun());
894 qadm->Init(AliQA::kESDS, AliCDBManager::Instance()->GetRun());
896 qadm->StartOfCycle(AliQA::kRECPOINTS, fSameQACycle);
897 qadm->StartOfCycle(AliQA::kESDS,"same");
901 AliQADataMakerRec *qadm = GetQADataMaker(AliQA::kGLOBAL);
902 AliInfo(Form("Initializing the global QA data maker"));
904 qadm->Init(AliQA::kRECPOINTS, AliCDBManager::Instance()->GetRun());
905 AliTracker::SetResidualsArray(arr);
906 qadm->Init(AliQA::kESDS, AliCDBManager::Instance()->GetRun());
908 qadm->StartOfCycle(AliQA::kRECPOINTS, fSameQACycle);
909 qadm->StartOfCycle(AliQA::kESDS, "same");
913 fSameQACycle = kTRUE;
916 //Initialize the Plane Efficiency framework
917 if (fRunPlaneEff && !InitPlaneEff()) {
918 if(fStopOnError) {CleanUp(ffile, ffileOld); return kFALSE;}
921 if (strcmp(gProgName,"alieve") == 0)
922 fRunAliEVE = InitAliEVE();
927 //_____________________________________________________________________________
928 Bool_t AliReconstruction::RunEvent(Int_t iEvent)
930 // run the reconstruction over a single event
931 // The event loop is steered in Run method
933 AliCodeTimerAuto("");
935 if (iEvent >= fRunLoader->GetNumberOfEvents()) {
936 fRunLoader->SetEventNumber(iEvent);
937 fRunLoader->GetHeader()->Reset(fRawReader->GetRunNumber(),
939 //?? fRunLoader->MakeTree("H");
940 fRunLoader->TreeE()->Fill();
943 if ((iEvent < fFirstEvent) || ((fLastEvent >= 0) && (iEvent > fLastEvent))) {
944 // copy old ESD to the new one
946 fesd->ReadFromTree(ftreeOld);
947 ftreeOld->GetEntry(iEvent);
951 fhltesd->ReadFromTree(fhlttreeOld);
952 fhlttreeOld->GetEntry(iEvent);
958 AliInfo(Form("processing event %d", iEvent));
960 //Start of cycle for the in-loop QA
963 TString detStr(fFillESD);
964 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
965 if (!IsSelected(fgkDetectorName[iDet], detStr))
967 AliQADataMakerRec *qadm = GetQADataMaker(iDet);
970 qadm->StartOfCycle(AliQA::kRECPOINTS, fSameQACycle);
971 qadm->StartOfCycle(AliQA::kESDS, "same") ;
974 AliQADataMakerRec *qadm = GetQADataMaker(AliQA::kGLOBAL);
975 qadm->StartOfCycle(AliQA::kRECPOINTS, fSameQACycle);
976 qadm->StartOfCycle(AliQA::kESDS, "same");
981 fRunLoader->GetEvent(iEvent);
984 sprintf(aFileName, "ESD_%d.%d_final.root",
985 fRunLoader->GetHeader()->GetRun(),
986 fRunLoader->GetHeader()->GetEventNrInRun());
987 if (!gSystem->AccessPathName(aFileName)) return kTRUE;
989 // local single event reconstruction
990 if (!fRunLocalReconstruction.IsNull()) {
991 TString detectors=fRunLocalReconstruction;
992 // run HLT event reconstruction first
993 // ;-( IsSelected changes the string
994 if (IsSelected("HLT", detectors) &&
995 !RunLocalEventReconstruction("HLT")) {
996 if (fStopOnError) {CleanUp(ffile, ffileOld); return kFALSE;}
998 detectors=fRunLocalReconstruction;
999 detectors.ReplaceAll("HLT", "");
1000 if (!RunLocalEventReconstruction(detectors)) {
1001 if (fStopOnError) {CleanUp(ffile, ffileOld); return kFALSE;}
1005 fesd->SetRunNumber(fRunLoader->GetHeader()->GetRun());
1006 fhltesd->SetRunNumber(fRunLoader->GetHeader()->GetRun());
1007 fesd->SetEventNumberInFile(fRunLoader->GetHeader()->GetEventNrInRun());
1008 fhltesd->SetEventNumberInFile(fRunLoader->GetHeader()->GetEventNrInRun());
1010 // Set magnetic field from the tracker
1011 fesd->SetMagneticField(AliTracker::GetBz());
1012 fhltesd->SetMagneticField(AliTracker::GetBz());
1016 // Fill raw-data error log into the ESD
1017 if (fRawReader) FillRawDataErrorLog(iEvent,fesd);
1020 if (fRunVertexFinder) {
1021 if (!ReadESD(fesd, "vertex")) {
1022 if (!RunVertexFinder(fesd)) {
1023 if (fStopOnError) {CleanUp(ffile, ffileOld); return kFALSE;}
1025 if (fCheckPointLevel > 0) WriteESD(fesd, "vertex");
1030 if (!fRunTracking.IsNull()) {
1031 if (fRunMuonTracking) {
1032 if (!RunMuonTracking(fesd)) {
1033 if (fStopOnError) {CleanUp(ffile, ffileOld); return kFALSE;}
1039 if (!fRunTracking.IsNull()) {
1040 if (!ReadESD(fesd, "tracking")) {
1041 if (!RunTracking(fesd)) {
1042 if (fStopOnError) {CleanUp(ffile, ffileOld); return kFALSE;}
1044 if (fCheckPointLevel > 0) WriteESD(fesd, "tracking");
1049 if (!fFillESD.IsNull()) {
1050 TString detectors=fFillESD;
1051 // run HLT first and on hltesd
1052 // ;-( IsSelected changes the string
1053 if (IsSelected("HLT", detectors) &&
1054 !FillESD(fhltesd, "HLT")) {
1055 if (fStopOnError) {CleanUp(ffile, ffileOld); return kFALSE;}
1058 detectors.ReplaceAll("HLT", "");
1059 if (!FillESD(fesd, detectors)) {
1060 if (fStopOnError) {CleanUp(ffile, ffileOld); return kFALSE;}
1064 // fill Event header information from the RawEventHeader
1065 if (fRawReader){FillRawEventHeaderESD(fesd);}
1068 AliESDpid::MakePID(fesd);
1069 if (fCheckPointLevel > 1) WriteESD(fesd, "PID");
1071 if (fFillTriggerESD) {
1072 if (!ReadESD(fesd, "trigger")) {
1073 if (!FillTriggerESD(fesd)) {
1074 if (fStopOnError) {CleanUp(ffile, ffileOld); return kFALSE;}
1076 if (fCheckPointLevel > 1) WriteESD(fesd, "trigger");
1083 // Propagate track to the beam pipe (if not already done by ITS)
1085 const Int_t ntracks = fesd->GetNumberOfTracks();
1086 const Double_t kBz = fesd->GetMagneticField();
1087 const Double_t kRadius = 2.8; //something less than the beam pipe radius
1090 UShort_t *selectedIdx=new UShort_t[ntracks];
1092 for (Int_t itrack=0; itrack<ntracks; itrack++){
1093 const Double_t kMaxStep = 5; //max step over the material
1096 AliESDtrack *track = fesd->GetTrack(itrack);
1097 if (!track) continue;
1099 AliExternalTrackParam *tpcTrack =
1100 (AliExternalTrackParam *)track->GetTPCInnerParam();
1104 PropagateTrackTo(tpcTrack,kRadius,track->GetMass(),kMaxStep,kTRUE);
1109 Int_t n=trkArray.GetEntriesFast();
1110 selectedIdx[n]=track->GetID();
1111 trkArray.AddLast(tpcTrack);
1114 if (track->GetX() < kRadius) continue;
1117 PropagateTrackTo(track,kRadius,track->GetMass(),kMaxStep,kTRUE);
1119 track->RelateToVertex(fesd->GetPrimaryVertexSPD(), kBz, kRadius);
1124 // Improve the reconstructed primary vertex position using the tracks
1126 TObject *obj = fOptions.FindObject("ITS");
1128 TString optITS = obj->GetTitle();
1129 if (optITS.Contains("cosmics") || optITS.Contains("COSMICS"))
1130 fRunVertexFinderTracks=kFALSE;
1132 if (fRunVertexFinderTracks) {
1133 // TPC + ITS primary vertex
1134 ftVertexer->SetITSrefitRequired();
1135 if(fDiamondProfile && fMeanVertexConstraint) {
1136 ftVertexer->SetVtxStart(fDiamondProfile);
1138 ftVertexer->SetConstraintOff();
1140 AliESDVertex *pvtx=ftVertexer->FindPrimaryVertex(fesd);
1142 if (pvtx->GetStatus()) {
1143 fesd->SetPrimaryVertex(pvtx);
1144 for (Int_t i=0; i<ntracks; i++) {
1145 AliESDtrack *t = fesd->GetTrack(i);
1146 t->RelateToVertex(pvtx, kBz, kRadius);
1151 // TPC-only primary vertex
1152 ftVertexer->SetITSrefitNotRequired();
1153 if(fDiamondProfileTPC && fMeanVertexConstraint) {
1154 ftVertexer->SetVtxStart(fDiamondProfileTPC);
1156 ftVertexer->SetConstraintOff();
1158 pvtx=ftVertexer->FindPrimaryVertex(&trkArray,selectedIdx);
1160 if (pvtx->GetStatus()) {
1161 fesd->SetPrimaryVertexTPC(pvtx);
1162 Int_t nsel=trkArray.GetEntriesFast();
1163 for (Int_t i=0; i<nsel; i++) {
1164 AliExternalTrackParam *t =
1165 (AliExternalTrackParam *)trkArray.UncheckedAt(i);
1166 t->PropagateToDCA(pvtx, kBz, kRadius);
1172 delete[] selectedIdx;
1174 if(fDiamondProfile) fesd->SetDiamond(fDiamondProfile);
1179 AliV0vertexer vtxer;
1180 vtxer.Tracks2V0vertices(fesd);
1182 if (fRunCascadeFinder) {
1184 AliCascadeVertexer cvtxer;
1185 cvtxer.V0sTracks2CascadeVertices(fesd);
1190 if (fCleanESD) CleanESD(fesd);
1194 AliQADataMakerRec *qadm = GetQADataMaker(AliQA::kGLOBAL);
1195 if (qadm) qadm->Exec(AliQA::kESDS, fesd);
1199 if (fWriteESDfriend) {
1200 fesdf->~AliESDfriend();
1201 new (fesdf) AliESDfriend(); // Reset...
1202 fesd->GetESDfriend(fesdf);
1210 if (fRunAliEVE) RunAliEVE();
1212 if (fCheckPointLevel > 0) WriteESD(fesd, "final");
1215 if (fWriteESDfriend) {
1216 fesdf->~AliESDfriend();
1217 new (fesdf) AliESDfriend(); // Reset...
1220 ProcInfo_t ProcInfo;
1221 gSystem->GetProcInfo(&ProcInfo);
1222 AliInfo(Form("Event %d -> Current memory usage %d %d",iEvent, ProcInfo.fMemResident, ProcInfo.fMemVirtual));
1225 // End of cycle for the in-loop QA
1228 RunQA(fFillESD.Data(), fesd);
1229 TString detStr(fFillESD);
1230 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
1231 if (!IsSelected(fgkDetectorName[iDet], detStr))
1233 AliQADataMakerRec * qadm = GetQADataMaker(iDet);
1236 qadm->EndOfCycle(AliQA::kRECPOINTS);
1237 qadm->EndOfCycle(AliQA::kESDS);
1242 AliQADataMakerRec *qadm = GetQADataMaker(AliQA::kGLOBAL);
1244 qadm->EndOfCycle(AliQA::kRECPOINTS);
1245 qadm->EndOfCycle(AliQA::kESDS);
1254 //_____________________________________________________________________________
1255 Bool_t AliReconstruction::FinishRun()
1258 // Called after the exit
1259 // from the event loop
1260 AliCodeTimerAuto("");
1262 if (fIsNewRunLoader) { // galice.root didn't exist
1263 fRunLoader->WriteHeader("OVERWRITE");
1264 fRunLoader->CdGAFile();
1265 fRunLoader->Write(0, TObject::kOverwrite);
1268 ftree->GetUserInfo()->Add(fesd);
1269 fhlttree->GetUserInfo()->Add(fhltesd);
1271 const TMap *cdbMap = AliCDBManager::Instance()->GetStorageMap();
1272 const TList *cdbList = AliCDBManager::Instance()->GetRetrievedIds();
1274 TMap *cdbMapCopy = new TMap(cdbMap->GetEntries());
1275 cdbMapCopy->SetOwner(1);
1276 cdbMapCopy->SetName("cdbMap");
1277 TIter iter(cdbMap->GetTable());
1280 while((pair = dynamic_cast<TPair*> (iter.Next()))){
1281 TObjString* keyStr = dynamic_cast<TObjString*> (pair->Key());
1282 TObjString* valStr = dynamic_cast<TObjString*> (pair->Value());
1283 cdbMapCopy->Add(new TObjString(keyStr->GetName()), new TObjString(valStr->GetName()));
1286 TList *cdbListCopy = new TList();
1287 cdbListCopy->SetOwner(1);
1288 cdbListCopy->SetName("cdbList");
1290 TIter iter2(cdbList);
1293 while((id = dynamic_cast<AliCDBId*> (iter2.Next()))){
1294 cdbListCopy->Add(new TObjString(id->ToString().Data()));
1297 ftree->GetUserInfo()->Add(cdbMapCopy);
1298 ftree->GetUserInfo()->Add(cdbListCopy);
1301 if(fESDPar.Contains("ESD.par")){
1302 AliInfo("Attaching ESD.par to Tree");
1303 TNamed *fn = CopyFileToTNamed(fESDPar.Data(),"ESD.par");
1304 ftree->GetUserInfo()->Add(fn);
1310 if (fWriteESDfriend)
1311 ftree->SetBranchStatus("ESDfriend*",0);
1312 // we want to have only one tree version number
1313 ftree->Write(ftree->GetName(),TObject::kOverwrite);
1316 // Finish with Plane Efficiency evaluation: before of CleanUp !!!
1317 if (fRunPlaneEff && !FinishPlaneEff()) {
1318 AliWarning("Finish PlaneEff evaluation failed");
1322 CleanUp(ffile, ffileOld);
1325 AliWarning("AOD creation not supported anymore during reconstruction. See ANALYSIS/AliAnalysisTaskESDfilter.cxx instead.");
1328 // Create tags for the events in the ESD tree (the ESD tree is always present)
1329 // In case of empty events the tags will contain dummy values
1330 AliESDTagCreator *esdtagCreator = new AliESDTagCreator();
1331 esdtagCreator->CreateESDTags(fFirstEvent,fLastEvent,fGRPData);
1333 AliWarning("AOD tag creation not supported anymore during reconstruction.");
1336 //Finish QA and end of cycle for out-of-loop QA
1339 AliQADataMakerSteer qas;
1340 qas.Run(fRunLocalReconstruction.Data(), AliQA::kRECPOINTS, fSameQACycle);
1342 qas.Run(fRunTracking.Data(), AliQA::kESDS, fSameQACycle);
1344 AliQADataMakerRec *qadm = GetQADataMaker(AliQA::kGLOBAL);
1346 qadm->EndOfCycle(AliQA::kRECPOINTS);
1347 qadm->EndOfCycle(AliQA::kESDS);
1354 // Cleanup of CDB manager: cache and active storages!
1355 AliCDBManager::Instance()->ClearCache();
1361 //_____________________________________________________________________________
1362 Bool_t AliReconstruction::RunLocalReconstruction(const TString& /*detectors*/)
1364 // run the local reconstruction
1365 static Int_t eventNr=0;
1366 AliCodeTimerAuto("")
1368 // AliCDBManager* man = AliCDBManager::Instance();
1369 // Bool_t origCache = man->GetCacheFlag();
1371 // TString detStr = detectors;
1372 // for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
1373 // if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
1374 // AliReconstructor* reconstructor = GetReconstructor(iDet);
1375 // if (!reconstructor) continue;
1376 // if (reconstructor->HasLocalReconstruction()) continue;
1378 // AliCodeTimerStart(Form("running reconstruction for %s", fgkDetectorName[iDet]));
1379 // AliInfo(Form("running reconstruction for %s", fgkDetectorName[iDet]));
1381 // AliCodeTimerStart(Form("Loading calibration data from OCDB for %s", fgkDetectorName[iDet]));
1382 // AliInfo(Form("Loading calibration data from OCDB for %s", fgkDetectorName[iDet]));
1384 // man->SetCacheFlag(kTRUE);
1385 // TString calibPath = Form("%s/Calib/*", fgkDetectorName[iDet]);
1386 // man->GetAll(calibPath); // entries are cached!
1388 // AliCodeTimerStop(Form("Loading calibration data from OCDB for %s", fgkDetectorName[iDet]));
1390 // if (fRawReader) {
1391 // fRawReader->RewindEvents();
1392 // reconstructor->Reconstruct(fRunLoader, fRawReader);
1394 // reconstructor->Reconstruct(fRunLoader);
1397 // AliCodeTimerStop(Form("running reconstruction for %s", fgkDetectorName[iDet]));
1398 // AliSysInfo::AddStamp(Form("LRec%s_%d",fgkDetectorName[iDet],eventNr));
1400 // // unload calibration data
1401 // man->UnloadFromCache(calibPath);
1402 // //man->ClearCache();
1405 // man->SetCacheFlag(origCache);
1407 // if ((detStr.CompareTo("ALL") != 0) && !detStr.IsNull()) {
1408 // AliError(Form("the following detectors were not found: %s",
1410 // if (fStopOnError) return kFALSE;
1417 //_____________________________________________________________________________
1418 Bool_t AliReconstruction::RunLocalEventReconstruction(const TString& detectors)
1420 // run the local reconstruction
1422 static Int_t eventNr=0;
1423 AliCodeTimerAuto("")
1425 TString detStr = detectors;
1426 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
1427 if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
1428 AliReconstructor* reconstructor = GetReconstructor(iDet);
1429 if (!reconstructor) continue;
1430 AliLoader* loader = fLoader[iDet];
1431 // Matthias April 2008: temporary fix to run HLT reconstruction
1432 // although the HLT loader is missing
1433 if (strcmp(fgkDetectorName[iDet], "HLT")==0) {
1435 reconstructor->Reconstruct(fRawReader, NULL);
1438 reconstructor->Reconstruct(dummy, NULL);
1443 AliWarning(Form("No loader is defined for %s!",fgkDetectorName[iDet]));
1446 // conversion of digits
1447 if (fRawReader && reconstructor->HasDigitConversion()) {
1448 AliInfo(Form("converting raw data digits into root objects for %s",
1449 fgkDetectorName[iDet]));
1450 AliCodeTimerAuto(Form("converting raw data digits into root objects for %s",
1451 fgkDetectorName[iDet]));
1452 loader->LoadDigits("update");
1453 loader->CleanDigits();
1454 loader->MakeDigitsContainer();
1455 TTree* digitsTree = loader->TreeD();
1456 reconstructor->ConvertDigits(fRawReader, digitsTree);
1457 loader->WriteDigits("OVERWRITE");
1458 loader->UnloadDigits();
1460 // local reconstruction
1461 AliInfo(Form("running reconstruction for %s", fgkDetectorName[iDet]));
1462 AliCodeTimerAuto(Form("running reconstruction for %s", fgkDetectorName[iDet]));
1463 loader->LoadRecPoints("update");
1464 loader->CleanRecPoints();
1465 loader->MakeRecPointsContainer();
1466 TTree* clustersTree = loader->TreeR();
1467 if (fRawReader && !reconstructor->HasDigitConversion()) {
1468 reconstructor->Reconstruct(fRawReader, clustersTree);
1470 loader->LoadDigits("read");
1471 TTree* digitsTree = loader->TreeD();
1473 AliError(Form("Can't get the %s digits tree", fgkDetectorName[iDet]));
1474 if (fStopOnError) return kFALSE;
1476 reconstructor->Reconstruct(digitsTree, clustersTree);
1478 loader->UnloadDigits();
1481 // In-loop QA for local reconstrucion
1482 if (fRunQA && fInLoopQA) {
1483 AliQADataMakerRec * qadm = GetQADataMaker(iDet);
1486 //(Form("Running QA data maker for %s", fgkDetectorName[iDet]));
1488 //(Form("Running QA data maker for %s", fgkDetectorName[iDet]));
1490 qadm->Exec(AliQA::kRECPOINTS, clustersTree) ;
1493 //(Form("Running QA data maker for %s", fgkDetectorName[iDet]));
1497 loader->WriteRecPoints("OVERWRITE");
1498 loader->UnloadRecPoints();
1499 AliSysInfo::AddStamp(Form("LRec%s_%d",fgkDetectorName[iDet],eventNr), iDet,1,eventNr);
1502 if ((detStr.CompareTo("ALL") != 0) && !detStr.IsNull()) {
1503 AliError(Form("the following detectors were not found: %s",
1505 if (fStopOnError) return kFALSE;
1511 //_____________________________________________________________________________
1512 Bool_t AliReconstruction::RunVertexFinder(AliESDEvent*& esd)
1514 // run the barrel tracking
1516 AliCodeTimerAuto("")
1518 AliESDVertex* vertex = NULL;
1519 Double_t vtxPos[3] = {0, 0, 0};
1520 Double_t vtxErr[3] = {0.07, 0.07, 0.1};
1521 TArrayF mcVertex(3);
1522 if (fRunLoader->GetHeader() && fRunLoader->GetHeader()->GenEventHeader()) {
1523 fRunLoader->GetHeader()->GenEventHeader()->PrimaryVertex(mcVertex);
1524 for (Int_t i = 0; i < 3; i++) vtxPos[i] = mcVertex[i];
1528 if(fDiamondProfile) fVertexer->SetVtxStart(fDiamondProfile);
1529 AliInfo("running the ITS vertex finder");
1530 if (fLoader[0]) fLoader[0]->LoadRecPoints();
1531 vertex = fVertexer->FindVertexForCurrentEvent(fRunLoader->GetEventNumber());
1532 if (fLoader[0]) fLoader[0]->UnloadRecPoints();
1534 AliWarning("Vertex not found");
1535 vertex = new AliESDVertex();
1536 vertex->SetName("default");
1539 vertex->SetName("reconstructed");
1543 AliInfo("getting the primary vertex from MC");
1544 vertex = new AliESDVertex(vtxPos, vtxErr);
1548 vertex->GetXYZ(vtxPos);
1549 vertex->GetSigmaXYZ(vtxErr);
1551 AliWarning("no vertex reconstructed");
1552 vertex = new AliESDVertex(vtxPos, vtxErr);
1554 esd->SetPrimaryVertexSPD(vertex);
1555 // if SPD multiplicity has been determined, it is stored in the ESD
1556 AliMultiplicity *mult = fVertexer->GetMultiplicity();
1557 if(mult)esd->SetMultiplicity(mult);
1559 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
1560 if (fTracker[iDet]) fTracker[iDet]->SetVertex(vtxPos, vtxErr);
1567 //_____________________________________________________________________________
1568 Bool_t AliReconstruction::RunHLTTracking(AliESDEvent*& esd)
1570 // run the HLT barrel tracking
1572 AliCodeTimerAuto("")
1575 AliError("Missing runLoader!");
1579 AliInfo("running HLT tracking");
1581 // Get a pointer to the HLT reconstructor
1582 AliReconstructor *reconstructor = GetReconstructor(fgkNDetectors-1);
1583 if (!reconstructor) return kFALSE;
1586 for (Int_t iDet = 1; iDet >= 0; iDet--) {
1587 TString detName = fgkDetectorName[iDet];
1588 AliDebug(1, Form("%s HLT tracking", detName.Data()));
1589 reconstructor->SetOption(detName.Data());
1590 AliTracker *tracker = reconstructor->CreateTracker();
1592 AliWarning(Form("couldn't create a HLT tracker for %s", detName.Data()));
1593 if (fStopOnError) return kFALSE;
1597 Double_t vtxErr[3]={0.005,0.005,0.010};
1598 const AliESDVertex *vertex = esd->GetVertex();
1599 vertex->GetXYZ(vtxPos);
1600 tracker->SetVertex(vtxPos,vtxErr);
1602 fLoader[iDet]->LoadRecPoints("read");
1603 TTree* tree = fLoader[iDet]->TreeR();
1605 AliError(Form("Can't get the %s cluster tree", detName.Data()));
1608 tracker->LoadClusters(tree);
1610 if (tracker->Clusters2Tracks(esd) != 0) {
1611 AliError(Form("HLT %s Clusters2Tracks failed", fgkDetectorName[iDet]));
1615 tracker->UnloadClusters();
1623 //_____________________________________________________________________________
1624 Bool_t AliReconstruction::RunMuonTracking(AliESDEvent*& esd)
1626 // run the muon spectrometer tracking
1628 AliCodeTimerAuto("")
1631 AliError("Missing runLoader!");
1634 Int_t iDet = 7; // for MUON
1636 AliInfo("is running...");
1638 // Get a pointer to the MUON reconstructor
1639 AliReconstructor *reconstructor = GetReconstructor(iDet);
1640 if (!reconstructor) return kFALSE;
1643 TString detName = fgkDetectorName[iDet];
1644 AliDebug(1, Form("%s tracking", detName.Data()));
1645 AliTracker *tracker = reconstructor->CreateTracker();
1647 AliWarning(Form("couldn't create a tracker for %s", detName.Data()));
1652 fLoader[iDet]->LoadRecPoints("read");
1654 tracker->LoadClusters(fLoader[iDet]->TreeR());
1656 Int_t rv = tracker->Clusters2Tracks(esd);
1660 AliError(Form("%s Clusters2Tracks failed", fgkDetectorName[iDet]));
1664 fLoader[iDet]->UnloadRecPoints();
1666 tracker->UnloadClusters();
1674 //_____________________________________________________________________________
1675 Bool_t AliReconstruction::RunTracking(AliESDEvent*& esd)
1677 // run the barrel tracking
1678 static Int_t eventNr=0;
1679 AliCodeTimerAuto("")
1681 AliInfo("running tracking");
1683 //Fill the ESD with the T0 info (will be used by the TOF)
1684 if (fReconstructor[11] && fLoader[11]) {
1685 fLoader[11]->LoadRecPoints("READ");
1686 TTree *treeR = fLoader[11]->TreeR();
1687 GetReconstructor(11)->FillESD((TTree *)NULL,treeR,esd);
1690 // pass 1: TPC + ITS inwards
1691 for (Int_t iDet = 1; iDet >= 0; iDet--) {
1692 if (!fTracker[iDet]) continue;
1693 AliDebug(1, Form("%s tracking", fgkDetectorName[iDet]));
1696 fLoader[iDet]->LoadRecPoints("read");
1697 AliSysInfo::AddStamp(Form("RLoadCluster%s_%d",fgkDetectorName[iDet],eventNr),iDet,1, eventNr);
1698 TTree* tree = fLoader[iDet]->TreeR();
1700 AliError(Form("Can't get the %s cluster tree", fgkDetectorName[iDet]));
1703 fTracker[iDet]->LoadClusters(tree);
1704 AliSysInfo::AddStamp(Form("TLoadCluster%s_%d",fgkDetectorName[iDet],eventNr), iDet,2, eventNr);
1706 if (fTracker[iDet]->Clusters2Tracks(esd) != 0) {
1707 AliError(Form("%s Clusters2Tracks failed", fgkDetectorName[iDet]));
1710 if (fCheckPointLevel > 1) {
1711 WriteESD(esd, Form("%s.tracking", fgkDetectorName[iDet]));
1713 // preliminary PID in TPC needed by the ITS tracker
1715 GetReconstructor(1)->FillESD((TTree*)NULL, (TTree*)NULL, esd);
1716 AliESDpid::MakePID(esd);
1718 AliSysInfo::AddStamp(Form("Tracking0%s_%d",fgkDetectorName[iDet],eventNr), iDet,3,eventNr);
1721 // pass 2: ALL backwards
1723 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
1724 if (!fTracker[iDet]) continue;
1725 AliDebug(1, Form("%s back propagation", fgkDetectorName[iDet]));
1728 if (iDet > 1) { // all except ITS, TPC
1730 fLoader[iDet]->LoadRecPoints("read");
1731 AliSysInfo::AddStamp(Form("RLoadCluster0%s_%d",fgkDetectorName[iDet],eventNr), iDet,1, eventNr);
1732 tree = fLoader[iDet]->TreeR();
1734 AliError(Form("Can't get the %s cluster tree", fgkDetectorName[iDet]));
1737 fTracker[iDet]->LoadClusters(tree);
1738 AliSysInfo::AddStamp(Form("TLoadCluster0%s_%d",fgkDetectorName[iDet],eventNr), iDet,2, eventNr);
1742 if (iDet>1) // start filling residuals for the "outer" detectors
1743 if (fRunGlobalQA) AliTracker::SetFillResiduals(kTRUE);
1745 if (fTracker[iDet]->PropagateBack(esd) != 0) {
1746 AliError(Form("%s backward propagation failed", fgkDetectorName[iDet]));
1749 if (fCheckPointLevel > 1) {
1750 WriteESD(esd, Form("%s.back", fgkDetectorName[iDet]));
1754 if (iDet > 2) { // all except ITS, TPC, TRD
1755 fTracker[iDet]->UnloadClusters();
1756 fLoader[iDet]->UnloadRecPoints();
1758 // updated PID in TPC needed by the ITS tracker -MI
1760 GetReconstructor(1)->FillESD((TTree*)NULL, (TTree*)NULL, esd);
1761 AliESDpid::MakePID(esd);
1763 AliSysInfo::AddStamp(Form("Tracking1%s_%d",fgkDetectorName[iDet],eventNr), iDet,3, eventNr);
1765 //stop filling residuals for the "outer" detectors
1766 if (fRunGlobalQA) AliTracker::SetFillResiduals(kFALSE);
1768 // write space-points to the ESD in case alignment data output
1770 if (fWriteAlignmentData)
1771 WriteAlignmentData(esd);
1773 // pass 3: TRD + TPC + ITS refit inwards
1775 for (Int_t iDet = 2; iDet >= 0; iDet--) {
1776 if (!fTracker[iDet]) continue;
1777 AliDebug(1, Form("%s inward refit", fgkDetectorName[iDet]));
1780 if (iDet<2) // start filling residuals for TPC and ITS
1781 if (fRunGlobalQA) AliTracker::SetFillResiduals(kTRUE);
1783 if (fTracker[iDet]->RefitInward(esd) != 0) {
1784 AliError(Form("%s inward refit failed", fgkDetectorName[iDet]));
1787 // run postprocessing
1788 if (fTracker[iDet]->PostProcess(esd) != 0) {
1789 AliError(Form("%s postprocessing failed", fgkDetectorName[iDet]));
1792 if (fCheckPointLevel > 1) {
1793 WriteESD(esd, Form("%s.refit", fgkDetectorName[iDet]));
1795 AliSysInfo::AddStamp(Form("Tracking2%s_%d",fgkDetectorName[iDet],eventNr), iDet,3, eventNr);
1797 fTracker[iDet]->UnloadClusters();
1798 AliSysInfo::AddStamp(Form("TUnloadCluster%s_%d",fgkDetectorName[iDet],eventNr), iDet,4, eventNr);
1799 fLoader[iDet]->UnloadRecPoints();
1800 AliSysInfo::AddStamp(Form("RUnloadCluster%s_%d",fgkDetectorName[iDet],eventNr), iDet,5, eventNr);
1802 // stop filling residuals for TPC and ITS
1803 if (fRunGlobalQA) AliTracker::SetFillResiduals(kFALSE);
1809 //_____________________________________________________________________________
1810 Bool_t AliReconstruction::CleanESD(AliESDEvent *esd){
1812 // Remove the data which are not needed for the physics analysis.
1815 Int_t nTracks=esd->GetNumberOfTracks();
1816 Int_t nV0s=esd->GetNumberOfV0s();
1818 (Form("Number of ESD tracks and V0s before cleaning: %d %d",nTracks,nV0s));
1820 Float_t cleanPars[]={fV0DCAmax,fV0CsPmin,fDmax,fZmax};
1821 Bool_t rc=esd->Clean(cleanPars);
1823 nTracks=esd->GetNumberOfTracks();
1824 nV0s=esd->GetNumberOfV0s();
1826 (Form("Number of ESD tracks and V0s after cleaning %d %d",nTracks,nV0s));
1831 //_____________________________________________________________________________
1832 Bool_t AliReconstruction::FillESD(AliESDEvent*& esd, const TString& detectors)
1834 // fill the event summary data
1836 AliCodeTimerAuto("")
1837 static Int_t eventNr=0;
1838 TString detStr = detectors;
1840 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
1841 if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
1842 AliReconstructor* reconstructor = GetReconstructor(iDet);
1843 if (!reconstructor) continue;
1844 if (!ReadESD(esd, fgkDetectorName[iDet])) {
1845 AliDebug(1, Form("filling ESD for %s", fgkDetectorName[iDet]));
1846 TTree* clustersTree = NULL;
1847 if (fLoader[iDet]) {
1848 fLoader[iDet]->LoadRecPoints("read");
1849 clustersTree = fLoader[iDet]->TreeR();
1850 if (!clustersTree) {
1851 AliError(Form("Can't get the %s clusters tree",
1852 fgkDetectorName[iDet]));
1853 if (fStopOnError) return kFALSE;
1856 if (fRawReader && !reconstructor->HasDigitConversion()) {
1857 reconstructor->FillESD(fRawReader, clustersTree, esd);
1859 TTree* digitsTree = NULL;
1860 if (fLoader[iDet]) {
1861 fLoader[iDet]->LoadDigits("read");
1862 digitsTree = fLoader[iDet]->TreeD();
1864 AliError(Form("Can't get the %s digits tree",
1865 fgkDetectorName[iDet]));
1866 if (fStopOnError) return kFALSE;
1869 reconstructor->FillESD(digitsTree, clustersTree, esd);
1870 if (fLoader[iDet]) fLoader[iDet]->UnloadDigits();
1872 if (fLoader[iDet]) {
1873 fLoader[iDet]->UnloadRecPoints();
1876 if (fCheckPointLevel > 2) WriteESD(esd, fgkDetectorName[iDet]);
1880 if ((detStr.CompareTo("ALL") != 0) && !detStr.IsNull()) {
1881 AliError(Form("the following detectors were not found: %s",
1883 if (fStopOnError) return kFALSE;
1885 AliSysInfo::AddStamp(Form("FillESD%d",eventNr), 0,1, eventNr);
1890 //_____________________________________________________________________________
1891 Bool_t AliReconstruction::FillTriggerESD(AliESDEvent*& esd)
1893 // Reads the trigger decision which is
1894 // stored in Trigger.root file and fills
1895 // the corresponding esd entries
1897 AliCodeTimerAuto("")
1899 AliInfo("Filling trigger information into the ESD");
1901 AliCentralTrigger *aCTP = NULL;
1904 AliCTPRawStream input(fRawReader);
1905 if (!input.Next()) {
1906 AliError("No valid CTP (trigger) DDL raw data is found ! The trigger information is not stored in the ESD !");
1909 esd->SetTriggerMask(input.GetClassMask());
1910 esd->SetTriggerCluster(input.GetClusterMask());
1912 aCTP = new AliCentralTrigger();
1913 TString configstr("");
1914 if (!aCTP->LoadConfiguration(configstr)) { // Load CTP config from OCDB
1915 AliError("No trigger configuration found in OCDB! The trigger classes information will no be stored in ESD!");
1921 AliRunLoader *runloader = AliRunLoader::GetRunLoader();
1923 if (!runloader->LoadTrigger()) {
1924 aCTP = runloader->GetTrigger();
1925 esd->SetTriggerMask(aCTP->GetClassMask());
1926 esd->SetTriggerCluster(aCTP->GetClusterMask());
1929 AliWarning("No trigger can be loaded! The trigger information is not stored in the ESD !");
1934 AliError("No run loader is available! The trigger information is not stored in the ESD !");
1939 // Now fill the trigger class names into AliESDRun object
1940 AliTriggerConfiguration *config = aCTP->GetConfiguration();
1942 AliError("No trigger configuration has been found! The trigger classes information will no be stored in ESD!");
1943 if (fRawReader) delete aCTP;
1947 const TObjArray& classesArray = config->GetClasses();
1948 Int_t nclasses = classesArray.GetEntriesFast();
1949 for( Int_t j=0; j<nclasses; j++ ) {
1950 AliTriggerClass* trclass = (AliTriggerClass*)classesArray.At( j );
1951 Int_t trindex = (Int_t)TMath::Log2(trclass->GetMask());
1952 esd->SetTriggerClass(trclass->GetName(),trindex);
1955 if (fRawReader) delete aCTP;
1963 //_____________________________________________________________________________
1964 Bool_t AliReconstruction::FillRawEventHeaderESD(AliESDEvent*& esd)
1967 // Filling information from RawReader Header
1970 AliInfo("Filling information from RawReader Header");
1971 esd->SetBunchCrossNumber(0);
1972 esd->SetOrbitNumber(0);
1973 esd->SetPeriodNumber(0);
1974 esd->SetTimeStamp(0);
1975 esd->SetEventType(0);
1976 const AliRawEventHeaderBase * eventHeader = fRawReader->GetEventHeader();
1979 const UInt_t *id = eventHeader->GetP("Id");
1980 esd->SetBunchCrossNumber((id)[1]&0x00000fff);
1981 esd->SetOrbitNumber((((id)[0]<<20)&0xf00000)|(((id)[1]>>12)&0xfffff));
1982 esd->SetPeriodNumber(((id)[0]>>4)&0x0fffffff);
1984 esd->SetTimeStamp((eventHeader->Get("Timestamp")));
1985 esd->SetEventType((eventHeader->Get("Type")));
1992 //_____________________________________________________________________________
1993 Bool_t AliReconstruction::IsSelected(TString detName, TString& detectors) const
1995 // check whether detName is contained in detectors
1996 // if yes, it is removed from detectors
1998 // check if all detectors are selected
1999 if ((detectors.CompareTo("ALL") == 0) ||
2000 detectors.BeginsWith("ALL ") ||
2001 detectors.EndsWith(" ALL") ||
2002 detectors.Contains(" ALL ")) {
2007 // search for the given detector
2008 Bool_t result = kFALSE;
2009 if ((detectors.CompareTo(detName) == 0) ||
2010 detectors.BeginsWith(detName+" ") ||
2011 detectors.EndsWith(" "+detName) ||
2012 detectors.Contains(" "+detName+" ")) {
2013 detectors.ReplaceAll(detName, "");
2017 // clean up the detectors string
2018 while (detectors.Contains(" ")) detectors.ReplaceAll(" ", " ");
2019 while (detectors.BeginsWith(" ")) detectors.Remove(0, 1);
2020 while (detectors.EndsWith(" ")) detectors.Remove(detectors.Length()-1, 1);
2025 //_____________________________________________________________________________
2026 Bool_t AliReconstruction::InitRunLoader()
2028 // get or create the run loader
2030 if (gAlice) delete gAlice;
2033 if (!gSystem->AccessPathName(fGAliceFileName.Data())) { // galice.root exists
2034 // load all base libraries to get the loader classes
2035 TString libs = gSystem->GetLibraries();
2036 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
2037 TString detName = fgkDetectorName[iDet];
2038 if (detName == "HLT") continue;
2039 if (libs.Contains("lib" + detName + "base.so")) continue;
2040 gSystem->Load("lib" + detName + "base.so");
2042 fRunLoader = AliRunLoader::Open(fGAliceFileName.Data());
2044 AliError(Form("no run loader found in file %s", fGAliceFileName.Data()));
2049 fRunLoader->CdGAFile();
2050 fRunLoader->LoadgAlice();
2052 //PH This is a temporary fix to give access to the kinematics
2053 //PH that is needed for the labels of ITS clusters
2054 fRunLoader->LoadHeader();
2055 fRunLoader->LoadKinematics();
2057 } else { // galice.root does not exist
2059 AliError(Form("the file %s does not exist", fGAliceFileName.Data()));
2063 fRunLoader = AliRunLoader::Open(fGAliceFileName.Data(),
2064 AliConfig::GetDefaultEventFolderName(),
2067 AliError(Form("could not create run loader in file %s",
2068 fGAliceFileName.Data()));
2072 fIsNewRunLoader = kTRUE;
2073 fRunLoader->MakeTree("E");
2075 if (fNumberOfEventsPerFile > 0)
2076 fRunLoader->SetNumberOfEventsPerFile(fNumberOfEventsPerFile);
2078 fRunLoader->SetNumberOfEventsPerFile((UInt_t)-1);
2084 //_____________________________________________________________________________
2085 AliReconstructor* AliReconstruction::GetReconstructor(Int_t iDet)
2087 // get the reconstructor object and the loader for a detector
2089 if (fReconstructor[iDet]) return fReconstructor[iDet];
2091 // load the reconstructor object
2092 TPluginManager* pluginManager = gROOT->GetPluginManager();
2093 TString detName = fgkDetectorName[iDet];
2094 TString recName = "Ali" + detName + "Reconstructor";
2096 if (!fIsNewRunLoader && !fRunLoader->GetLoader(detName+"Loader") && (detName != "HLT")) return NULL;
2098 AliReconstructor* reconstructor = NULL;
2099 // first check if a plugin is defined for the reconstructor
2100 TPluginHandler* pluginHandler =
2101 pluginManager->FindHandler("AliReconstructor", detName);
2102 // if not, add a plugin for it
2103 if (!pluginHandler) {
2104 AliDebug(1, Form("defining plugin for %s", recName.Data()));
2105 TString libs = gSystem->GetLibraries();
2106 if (libs.Contains("lib" + detName + "base.so") ||
2107 (gSystem->Load("lib" + detName + "base.so") >= 0)) {
2108 pluginManager->AddHandler("AliReconstructor", detName,
2109 recName, detName + "rec", recName + "()");
2111 pluginManager->AddHandler("AliReconstructor", detName,
2112 recName, detName, recName + "()");
2114 pluginHandler = pluginManager->FindHandler("AliReconstructor", detName);
2116 if (pluginHandler && (pluginHandler->LoadPlugin() == 0)) {
2117 reconstructor = (AliReconstructor*) pluginHandler->ExecPlugin(0);
2119 if (reconstructor) {
2120 TObject* obj = fOptions.FindObject(detName.Data());
2121 if (obj) reconstructor->SetOption(obj->GetTitle());
2122 reconstructor->Init();
2123 fReconstructor[iDet] = reconstructor;
2126 // get or create the loader
2127 if (detName != "HLT") {
2128 fLoader[iDet] = fRunLoader->GetLoader(detName + "Loader");
2129 if (!fLoader[iDet]) {
2130 AliConfig::Instance()
2131 ->CreateDetectorFolders(fRunLoader->GetEventFolder(),
2133 // first check if a plugin is defined for the loader
2135 pluginManager->FindHandler("AliLoader", detName);
2136 // if not, add a plugin for it
2137 if (!pluginHandler) {
2138 TString loaderName = "Ali" + detName + "Loader";
2139 AliDebug(1, Form("defining plugin for %s", loaderName.Data()));
2140 pluginManager->AddHandler("AliLoader", detName,
2141 loaderName, detName + "base",
2142 loaderName + "(const char*, TFolder*)");
2143 pluginHandler = pluginManager->FindHandler("AliLoader", detName);
2145 if (pluginHandler && (pluginHandler->LoadPlugin() == 0)) {
2147 (AliLoader*) pluginHandler->ExecPlugin(2, detName.Data(),
2148 fRunLoader->GetEventFolder());
2150 if (!fLoader[iDet]) { // use default loader
2151 fLoader[iDet] = new AliLoader(detName, fRunLoader->GetEventFolder());
2153 if (!fLoader[iDet]) {
2154 AliWarning(Form("couldn't get loader for %s", detName.Data()));
2155 if (fStopOnError) return NULL;
2157 fRunLoader->AddLoader(fLoader[iDet]);
2158 fRunLoader->CdGAFile();
2159 if (gFile && !gFile->IsWritable()) gFile->ReOpen("UPDATE");
2160 fRunLoader->Write(0, TObject::kOverwrite);
2165 return reconstructor;
2168 //_____________________________________________________________________________
2169 Bool_t AliReconstruction::CreateVertexer()
2171 // create the vertexer
2174 AliReconstructor* itsReconstructor = GetReconstructor(0);
2175 if (itsReconstructor) {
2176 fVertexer = itsReconstructor->CreateVertexer();
2179 AliWarning("couldn't create a vertexer for ITS");
2180 if (fStopOnError) return kFALSE;
2186 //_____________________________________________________________________________
2187 Bool_t AliReconstruction::CreateTrackers(const TString& detectors)
2189 // create the trackers
2191 TString detStr = detectors;
2192 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
2193 if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
2194 AliReconstructor* reconstructor = GetReconstructor(iDet);
2195 if (!reconstructor) continue;
2196 TString detName = fgkDetectorName[iDet];
2197 if (detName == "HLT") {
2198 fRunHLTTracking = kTRUE;
2201 if (detName == "MUON") {
2202 fRunMuonTracking = kTRUE;
2207 fTracker[iDet] = reconstructor->CreateTracker();
2208 if (!fTracker[iDet] && (iDet < 7)) {
2209 AliWarning(Form("couldn't create a tracker for %s", detName.Data()));
2210 if (fStopOnError) return kFALSE;
2212 AliSysInfo::AddStamp(Form("LTracker%s",fgkDetectorName[iDet]), iDet,0);
2218 //_____________________________________________________________________________
2219 void AliReconstruction::CleanUp(TFile* file, TFile* fileOld)
2221 // delete trackers and the run loader and close and delete the file
2223 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
2224 delete fReconstructor[iDet];
2225 fReconstructor[iDet] = NULL;
2226 fLoader[iDet] = NULL;
2227 delete fTracker[iDet];
2228 fTracker[iDet] = NULL;
2229 // delete fQADataMaker[iDet];
2230 // fQADataMaker[iDet] = NULL;
2235 if (ftVertexer) delete ftVertexer;
2238 if(!(AliCDBManager::Instance()->GetCacheFlag())) {
2239 delete fDiamondProfile;
2240 fDiamondProfile = NULL;
2241 delete fDiamondProfileTPC;
2242 fDiamondProfileTPC = NULL;
2252 if (fParentRawReader) delete fParentRawReader;
2253 fParentRawReader=NULL;
2263 gSystem->Unlink("AliESDs.old.root");
2268 //_____________________________________________________________________________
2270 Bool_t AliReconstruction::ReadESD(AliESDEvent*& esd, const char* recStep) const
2272 // read the ESD event from a file
2274 if (!esd) return kFALSE;
2276 sprintf(fileName, "ESD_%d.%d_%s.root",
2277 esd->GetRunNumber(), esd->GetEventNumberInFile(), recStep);
2278 if (gSystem->AccessPathName(fileName)) return kFALSE;
2280 AliInfo(Form("reading ESD from file %s", fileName));
2281 AliDebug(1, Form("reading ESD from file %s", fileName));
2282 TFile* file = TFile::Open(fileName);
2283 if (!file || !file->IsOpen()) {
2284 AliError(Form("opening %s failed", fileName));
2291 esd = (AliESDEvent*) file->Get("ESD");
2300 //_____________________________________________________________________________
2301 void AliReconstruction::WriteESD(AliESDEvent* esd, const char* recStep) const
2303 // write the ESD event to a file
2307 sprintf(fileName, "ESD_%d.%d_%s.root",
2308 esd->GetRunNumber(), esd->GetEventNumberInFile(), recStep);
2310 AliDebug(1, Form("writing ESD to file %s", fileName));
2311 TFile* file = TFile::Open(fileName, "recreate");
2312 if (!file || !file->IsOpen()) {
2313 AliError(Form("opening %s failed", fileName));
2322 void AliReconstruction::WriteAlignmentData(AliESDEvent* esd)
2324 // Write space-points which are then used in the alignment procedures
2325 // For the moment only ITS, TRD and TPC
2327 // Load TOF clusters
2329 fLoader[3]->LoadRecPoints("read");
2330 TTree* tree = fLoader[3]->TreeR();
2332 AliError(Form("Can't get the %s cluster tree", fgkDetectorName[3]));
2335 fTracker[3]->LoadClusters(tree);
2337 Int_t ntracks = esd->GetNumberOfTracks();
2338 for (Int_t itrack = 0; itrack < ntracks; itrack++)
2340 AliESDtrack *track = esd->GetTrack(itrack);
2343 for (Int_t iDet = 3; iDet >= 0; iDet--)
2344 nsp += track->GetNcls(iDet);
2346 AliTrackPointArray *sp = new AliTrackPointArray(nsp);
2347 track->SetTrackPointArray(sp);
2349 for (Int_t iDet = 3; iDet >= 0; iDet--) {
2350 AliTracker *tracker = fTracker[iDet];
2351 if (!tracker) continue;
2352 Int_t nspdet = track->GetNcls(iDet);
2353 if (nspdet <= 0) continue;
2354 track->GetClusters(iDet,idx);
2358 while (isp2 < nspdet) {
2360 TString dets = fgkDetectorName[iDet];
2361 if ((fUseTrackingErrorsForAlignment.CompareTo(dets) == 0) ||
2362 fUseTrackingErrorsForAlignment.BeginsWith(dets+" ") ||
2363 fUseTrackingErrorsForAlignment.EndsWith(" "+dets) ||
2364 fUseTrackingErrorsForAlignment.Contains(" "+dets+" ")) {
2365 isvalid = tracker->GetTrackPointTrackingError(idx[isp2],p,track);
2367 isvalid = tracker->GetTrackPoint(idx[isp2],p);
2370 const Int_t kNTPCmax = 159;
2371 if (iDet==1 && isp2>kNTPCmax) break; // to be fixed
2372 if (!isvalid) continue;
2373 sp->AddPoint(isptrack,&p); isptrack++; isp++;
2379 fTracker[3]->UnloadClusters();
2380 fLoader[3]->UnloadRecPoints();
2384 //_____________________________________________________________________________
2385 void AliReconstruction::FillRawDataErrorLog(Int_t iEvent, AliESDEvent* esd)
2387 // The method reads the raw-data error log
2388 // accumulated within the rawReader.
2389 // It extracts the raw-data errors related to
2390 // the current event and stores them into
2391 // a TClonesArray inside the esd object.
2393 if (!fRawReader) return;
2395 for(Int_t i = 0; i < fRawReader->GetNumberOfErrorLogs(); i++) {
2397 AliRawDataErrorLog *log = fRawReader->GetErrorLog(i);
2399 if (iEvent != log->GetEventNumber()) continue;
2401 esd->AddRawDataErrorLog(log);
2406 TNamed* AliReconstruction::CopyFileToTNamed(TString fPath,TString pName){
2407 // Dump a file content into a char in TNamed
2409 in.open(fPath.Data(),ios::in | ios::binary|ios::ate);
2410 Int_t kBytes = (Int_t)in.tellg();
2411 printf("Size: %d \n",kBytes);
2414 char* memblock = new char [kBytes];
2415 in.seekg (0, ios::beg);
2416 in.read (memblock, kBytes);
2418 TString fData(memblock,kBytes);
2419 fn = new TNamed(pName,fData);
2420 printf("fData Size: %d \n",fData.Sizeof());
2421 printf("pName Size: %d \n",pName.Sizeof());
2422 printf("fn Size: %d \n",fn->Sizeof());
2426 AliInfo(Form("Could not Open %s\n",fPath.Data()));
2432 void AliReconstruction::TNamedToFile(TTree* fTree, TString pName){
2433 // This is not really needed in AliReconstruction at the moment
2434 // but can serve as a template
2436 TList *fList = fTree->GetUserInfo();
2437 TNamed *fn = (TNamed*)fList->FindObject(pName.Data());
2438 printf("fn Size: %d \n",fn->Sizeof());
2440 TString fTmp(fn->GetName()); // to be 100% sure in principle pName also works
2441 const char* cdata = fn->GetTitle();
2442 printf("fTmp Size %d\n",fTmp.Sizeof());
2444 int size = fn->Sizeof()-fTmp.Sizeof()-sizeof(UChar_t)-sizeof(Int_t); // see dfinition of TString::SizeOf()...
2445 printf("calculated size %d\n",size);
2446 ofstream out(pName.Data(),ios::out | ios::binary);
2447 out.write(cdata,size);
2452 //_____________________________________________________________________________
2453 AliQADataMakerRec * AliReconstruction::GetQADataMaker(Int_t iDet)
2455 // get the quality assurance data maker object and the loader for a detector
2457 if (fQADataMaker[iDet])
2458 return fQADataMaker[iDet];
2460 AliQADataMakerRec * qadm = NULL;
2461 if (iDet == fgkNDetectors) { //Global QA
2462 qadm = new AliGlobalQADataMaker();
2463 fQADataMaker[iDet] = qadm;
2467 // load the QA data maker object
2468 TPluginManager* pluginManager = gROOT->GetPluginManager();
2469 TString detName = fgkDetectorName[iDet];
2470 TString qadmName = "Ali" + detName + "QADataMakerRec";
2471 if (!fIsNewRunLoader && !fRunLoader->GetLoader(detName+"Loader") && (detName != "HLT"))
2474 // first check if a plugin is defined for the quality assurance data maker
2475 TPluginHandler* pluginHandler = pluginManager->FindHandler("AliQADataMakerRec", detName);
2476 // if not, add a plugin for it
2477 if (!pluginHandler) {
2478 AliDebug(1, Form("defining plugin for %s", qadmName.Data()));
2479 TString libs = gSystem->GetLibraries();
2480 if (libs.Contains("lib" + detName + "base.so") ||
2481 (gSystem->Load("lib" + detName + "base.so") >= 0)) {
2482 pluginManager->AddHandler("AliQADataMakerRec", detName,
2483 qadmName, detName + "qadm", qadmName + "()");
2485 pluginManager->AddHandler("AliQADataMakerRec", detName,
2486 qadmName, detName, qadmName + "()");
2488 pluginHandler = pluginManager->FindHandler("AliQADataMakerRec", detName);
2490 if (pluginHandler && (pluginHandler->LoadPlugin() == 0)) {
2491 qadm = (AliQADataMakerRec *) pluginHandler->ExecPlugin(0);
2494 fQADataMaker[iDet] = qadm;
2499 //_____________________________________________________________________________
2500 Bool_t AliReconstruction::RunQA(const char* detectors, AliESDEvent *& esd)
2502 // run the Quality Assurance data producer
2504 AliCodeTimerAuto("")
2505 TString detStr = detectors;
2506 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
2507 if (!IsSelected(fgkDetectorName[iDet], detStr))
2509 AliQADataMakerRec * qadm = GetQADataMaker(iDet);
2512 AliCodeTimerStart(Form("running quality assurance data maker for %s", fgkDetectorName[iDet]));
2513 AliInfo(Form("running quality assurance data maker for %s", fgkDetectorName[iDet]));
2515 qadm->Exec(AliQA::kESDS, esd) ;
2518 AliCodeTimerStop(Form("running quality assurance data maker for %s", fgkDetectorName[iDet]));
2520 if ((detStr.CompareTo("ALL") != 0) && !detStr.IsNull()) {
2521 AliError(Form("the following detectors were not found: %s",
2531 //_____________________________________________________________________________
2532 void AliReconstruction::CheckQA()
2534 // check the QA of SIM for this run and remove the detectors
2535 // with status Fatal
2537 TString newRunLocalReconstruction ;
2538 TString newRunTracking ;
2539 TString newFillESD ;
2541 for (Int_t iDet = 0; iDet < AliQA::kNDET; iDet++) {
2542 TString detName(AliQA::GetDetName(iDet)) ;
2543 AliQA * qa = AliQA::Instance(AliQA::DETECTORINDEX_t(iDet)) ;
2544 if ( qa->IsSet(AliQA::DETECTORINDEX_t(iDet), AliQA::kSIM, AliQA::kFATAL)) {
2545 AliInfo(Form("QA status for %s in Hits and/or SDIGITS and/or Digits was Fatal; No reconstruction performed", detName.Data())) ;
2547 if ( fRunLocalReconstruction.Contains(AliQA::GetDetName(iDet)) ||
2548 fRunLocalReconstruction.Contains("ALL") ) {
2549 newRunLocalReconstruction += detName ;
2550 newRunLocalReconstruction += " " ;
2552 if ( fRunTracking.Contains(AliQA::GetDetName(iDet)) ||
2553 fRunTracking.Contains("ALL") ) {
2554 newRunTracking += detName ;
2555 newRunTracking += " " ;
2557 if ( fFillESD.Contains(AliQA::GetDetName(iDet)) ||
2558 fFillESD.Contains("ALL") ) {
2559 newFillESD += detName ;
2564 fRunLocalReconstruction = newRunLocalReconstruction ;
2565 fRunTracking = newRunTracking ;
2566 fFillESD = newFillESD ;
2569 //_____________________________________________________________________________
2570 Int_t AliReconstruction::GetDetIndex(const char* detector)
2572 // return the detector index corresponding to detector
2574 for (index = 0; index < fgkNDetectors ; index++) {
2575 if ( strcmp(detector, fgkDetectorName[index]) == 0 )
2580 //_____________________________________________________________________________
2581 Bool_t AliReconstruction::FinishPlaneEff() {
2583 // Here execute all the necessary operationis, at the end of the tracking phase,
2584 // in case that evaluation of PlaneEfficiencies was required for some detector.
2585 // E.g., write into a DataBase file the PlaneEfficiency which have been evaluated.
2587 // This Preliminary version works only FOR ITS !!!!!
2588 // other detectors (TOF,TRD, etc. have to develop their specific codes)
2591 // Return: kTRUE if all operations have been done properly, kFALSE otherwise
2594 //for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
2595 for (Int_t iDet = 0; iDet < 1; iDet++) { // for the time being only ITS
2596 //if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
2597 if(fTracker[iDet]) {
2598 AliPlaneEff *planeeff=fTracker[iDet]->GetPlaneEff();
2599 ret=planeeff->WriteIntoCDB();
2600 if(planeeff->GetCreateHistos()) {
2601 TString name="PlaneEffHisto";
2602 name+=fgkDetectorName[iDet];
2604 ret*=planeeff->WriteHistosToFile(name,"RECREATE");
2610 //_____________________________________________________________________________
2611 Bool_t AliReconstruction::InitPlaneEff() {
2613 // Here execute all the necessary operations, before of the tracking phase,
2614 // for the evaluation of PlaneEfficiencies, in case required for some detectors.
2615 // E.g., read from a DataBase file a first evaluation of the PlaneEfficiency
2616 // which should be updated/recalculated.
2618 // This Preliminary version will work only FOR ITS !!!!!
2619 // other detectors (TOF,TRD, etc. have to develop their specific codes)
2622 // Return: kTRUE if all operations have been done properly, kFALSE otherwise
2624 AliWarning(Form("Implementation of this method not yet done !! Method return kTRUE"));
2628 //_____________________________________________________________________________
2629 Bool_t AliReconstruction::InitAliEVE()
2631 // This method should be called only in case
2632 // AliReconstruction is run
2633 // within the alieve environment.
2634 // It will initialize AliEVE in a way
2635 // so that it can visualize event processed
2636 // by AliReconstruction.
2637 // The return flag shows whenever the
2638 // AliEVE initialization was successful or not.
2641 macroStr.Form("%s/EVE/macros/alieve_online.C",gSystem->ExpandPathName("$ALICE_ROOT"));
2642 AliInfo(Form("Loading AliEVE macro: %s",macroStr.Data()));
2643 if (gROOT->LoadMacro(macroStr.Data()) != 0) return kFALSE;
2645 gROOT->ProcessLine("if (!gAliEveEvent) {gAliEveEvent = new AliEveEventManager();gAliEveEvent->SetAutoLoad(kTRUE);gAliEveEvent->AddNewEventCommand(\"alieve_online_on_new_event()\");gEve->AddEvent(gAliEveEvent);};");
2646 gROOT->ProcessLine("alieve_online_init()");
2651 //_____________________________________________________________________________
2652 void AliReconstruction::RunAliEVE()
2654 // Runs AliEVE visualisation of
2655 // the current event.
2656 // Should be executed only after
2657 // successful initialization of AliEVE.
2659 AliInfo("Running AliEVE...");
2660 gROOT->ProcessLine(Form("gAliEveEvent->SetEvent((AliRunLoader*)%p,(AliRawReader*)%p,(AliESDEvent*)%p);",fRunLoader,fRawReader,fesd));
2661 gROOT->ProcessLine("gAliEveEvent->StartStopAutoLoadTimer();");