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(!AliGeomManager::CheckSymNamesLUT())
718 AliFatalClass("Current loaded geometry differs in the definition of symbolic names!");
719 if (!gGeoManager) if (fStopOnError) return kFALSE;
722 if (!MisalignGeometry(fLoadAlignData)) if (fStopOnError) return kFALSE;
723 AliSysInfo::AddStamp("LoadGeom");
726 // Get the GRP CDB entry
727 AliCDBEntry* entryGRP = AliCDBManager::Instance()->Get("GRP/GRP/Data");
730 fGRPData = dynamic_cast<TMap*>(entryGRP->GetObject());
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);
890 // if (!qadm) continue;
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 // Temporary fix to avoid problems with HLT that overwrites the offline ESDs
1059 if (detectors.Contains("ALL")) {
1061 for (Int_t idet=0; idet<fgkNDetectors; ++idet){
1062 detectors += fgkDetectorName[idet];
1066 detectors.ReplaceAll("HLT", "");
1067 if (!FillESD(fesd, detectors)) {
1068 if (fStopOnError) {CleanUp(ffile, ffileOld); return kFALSE;}
1072 // fill Event header information from the RawEventHeader
1073 if (fRawReader){FillRawEventHeaderESD(fesd);}
1076 AliESDpid::MakePID(fesd);
1077 if (fCheckPointLevel > 1) WriteESD(fesd, "PID");
1079 if (fFillTriggerESD) {
1080 if (!ReadESD(fesd, "trigger")) {
1081 if (!FillTriggerESD(fesd)) {
1082 if (fStopOnError) {CleanUp(ffile, ffileOld); return kFALSE;}
1084 if (fCheckPointLevel > 1) WriteESD(fesd, "trigger");
1091 // Propagate track to the beam pipe (if not already done by ITS)
1093 const Int_t ntracks = fesd->GetNumberOfTracks();
1094 const Double_t kBz = fesd->GetMagneticField();
1095 const Double_t kRadius = 2.8; //something less than the beam pipe radius
1098 UShort_t *selectedIdx=new UShort_t[ntracks];
1100 for (Int_t itrack=0; itrack<ntracks; itrack++){
1101 const Double_t kMaxStep = 5; //max step over the material
1104 AliESDtrack *track = fesd->GetTrack(itrack);
1105 if (!track) continue;
1107 AliExternalTrackParam *tpcTrack =
1108 (AliExternalTrackParam *)track->GetTPCInnerParam();
1112 PropagateTrackTo(tpcTrack,kRadius,track->GetMass(),kMaxStep,kTRUE);
1117 Int_t n=trkArray.GetEntriesFast();
1118 selectedIdx[n]=track->GetID();
1119 trkArray.AddLast(tpcTrack);
1122 if (track->GetX() < kRadius) continue;
1125 PropagateTrackTo(track,kRadius,track->GetMass(),kMaxStep,kTRUE);
1127 track->RelateToVertex(fesd->GetPrimaryVertexSPD(), kBz, kRadius);
1132 // Improve the reconstructed primary vertex position using the tracks
1134 TObject *obj = fOptions.FindObject("ITS");
1136 TString optITS = obj->GetTitle();
1137 if (optITS.Contains("cosmics") || optITS.Contains("COSMICS"))
1138 fRunVertexFinderTracks=kFALSE;
1140 if (fRunVertexFinderTracks) {
1141 // TPC + ITS primary vertex
1142 ftVertexer->SetITSrefitRequired();
1143 if(fDiamondProfile && fMeanVertexConstraint) {
1144 ftVertexer->SetVtxStart(fDiamondProfile);
1146 ftVertexer->SetConstraintOff();
1148 AliESDVertex *pvtx=ftVertexer->FindPrimaryVertex(fesd);
1150 if (pvtx->GetStatus()) {
1151 fesd->SetPrimaryVertex(pvtx);
1152 for (Int_t i=0; i<ntracks; i++) {
1153 AliESDtrack *t = fesd->GetTrack(i);
1154 t->RelateToVertex(pvtx, kBz, kRadius);
1159 // TPC-only primary vertex
1160 ftVertexer->SetITSrefitNotRequired();
1161 if(fDiamondProfileTPC && fMeanVertexConstraint) {
1162 ftVertexer->SetVtxStart(fDiamondProfileTPC);
1164 ftVertexer->SetConstraintOff();
1166 pvtx=ftVertexer->FindPrimaryVertex(&trkArray,selectedIdx);
1168 if (pvtx->GetStatus()) {
1169 fesd->SetPrimaryVertexTPC(pvtx);
1170 Int_t nsel=trkArray.GetEntriesFast();
1171 for (Int_t i=0; i<nsel; i++) {
1172 AliExternalTrackParam *t =
1173 (AliExternalTrackParam *)trkArray.UncheckedAt(i);
1174 t->PropagateToDCA(pvtx, kBz, kRadius);
1180 delete[] selectedIdx;
1182 if(fDiamondProfile) fesd->SetDiamond(fDiamondProfile);
1187 AliV0vertexer vtxer;
1188 vtxer.Tracks2V0vertices(fesd);
1190 if (fRunCascadeFinder) {
1192 AliCascadeVertexer cvtxer;
1193 cvtxer.V0sTracks2CascadeVertices(fesd);
1198 if (fCleanESD) CleanESD(fesd);
1202 AliQADataMakerRec *qadm = GetQADataMaker(AliQA::kGLOBAL);
1203 if (qadm) qadm->Exec(AliQA::kESDS, fesd);
1207 if (fWriteESDfriend) {
1208 fesdf->~AliESDfriend();
1209 new (fesdf) AliESDfriend(); // Reset...
1210 fesd->GetESDfriend(fesdf);
1218 if (fRunAliEVE) RunAliEVE();
1220 if (fCheckPointLevel > 0) WriteESD(fesd, "final");
1223 if (fWriteESDfriend) {
1224 fesdf->~AliESDfriend();
1225 new (fesdf) AliESDfriend(); // Reset...
1228 ProcInfo_t ProcInfo;
1229 gSystem->GetProcInfo(&ProcInfo);
1230 AliInfo(Form("Event %d -> Current memory usage %d %d",iEvent, ProcInfo.fMemResident, ProcInfo.fMemVirtual));
1233 // End of cycle for the in-loop QA
1236 RunQA(fFillESD.Data(), fesd);
1237 TString detStr(fFillESD);
1238 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
1239 if (!IsSelected(fgkDetectorName[iDet], detStr))
1241 AliQADataMakerRec * qadm = GetQADataMaker(iDet);
1244 qadm->EndOfCycle(AliQA::kRECPOINTS);
1245 qadm->EndOfCycle(AliQA::kESDS);
1250 AliQADataMakerRec *qadm = GetQADataMaker(AliQA::kGLOBAL);
1252 qadm->EndOfCycle(AliQA::kRECPOINTS);
1253 qadm->EndOfCycle(AliQA::kESDS);
1262 //_____________________________________________________________________________
1263 Bool_t AliReconstruction::FinishRun()
1266 // Called after the exit
1267 // from the event loop
1268 AliCodeTimerAuto("");
1270 if (fIsNewRunLoader) { // galice.root didn't exist
1271 fRunLoader->WriteHeader("OVERWRITE");
1272 fRunLoader->CdGAFile();
1273 fRunLoader->Write(0, TObject::kOverwrite);
1276 ftree->GetUserInfo()->Add(fesd);
1277 fhlttree->GetUserInfo()->Add(fhltesd);
1279 const TMap *cdbMap = AliCDBManager::Instance()->GetStorageMap();
1280 const TList *cdbList = AliCDBManager::Instance()->GetRetrievedIds();
1282 TMap *cdbMapCopy = new TMap(cdbMap->GetEntries());
1283 cdbMapCopy->SetOwner(1);
1284 cdbMapCopy->SetName("cdbMap");
1285 TIter iter(cdbMap->GetTable());
1288 while((pair = dynamic_cast<TPair*> (iter.Next()))){
1289 TObjString* keyStr = dynamic_cast<TObjString*> (pair->Key());
1290 TObjString* valStr = dynamic_cast<TObjString*> (pair->Value());
1291 cdbMapCopy->Add(new TObjString(keyStr->GetName()), new TObjString(valStr->GetName()));
1294 TList *cdbListCopy = new TList();
1295 cdbListCopy->SetOwner(1);
1296 cdbListCopy->SetName("cdbList");
1298 TIter iter2(cdbList);
1301 while((id = dynamic_cast<AliCDBId*> (iter2.Next()))){
1302 cdbListCopy->Add(new TObjString(id->ToString().Data()));
1305 ftree->GetUserInfo()->Add(cdbMapCopy);
1306 ftree->GetUserInfo()->Add(cdbListCopy);
1309 if(fESDPar.Contains("ESD.par")){
1310 AliInfo("Attaching ESD.par to Tree");
1311 TNamed *fn = CopyFileToTNamed(fESDPar.Data(),"ESD.par");
1312 ftree->GetUserInfo()->Add(fn);
1318 if (fWriteESDfriend)
1319 ftree->SetBranchStatus("ESDfriend*",0);
1320 // we want to have only one tree version number
1321 ftree->Write(ftree->GetName(),TObject::kOverwrite);
1324 // Finish with Plane Efficiency evaluation: before of CleanUp !!!
1325 if (fRunPlaneEff && !FinishPlaneEff()) {
1326 AliWarning("Finish PlaneEff evaluation failed");
1330 CleanUp(ffile, ffileOld);
1333 AliWarning("AOD creation not supported anymore during reconstruction. See ANALYSIS/AliAnalysisTaskESDfilter.cxx instead.");
1336 // Create tags for the events in the ESD tree (the ESD tree is always present)
1337 // In case of empty events the tags will contain dummy values
1338 AliESDTagCreator *esdtagCreator = new AliESDTagCreator();
1339 esdtagCreator->CreateESDTags(fFirstEvent,fLastEvent,fGRPData);
1341 AliWarning("AOD tag creation not supported anymore during reconstruction.");
1344 //Finish QA and end of cycle for out-of-loop QA
1347 AliQADataMakerSteer qas;
1348 qas.Run(fRunLocalReconstruction.Data(), AliQA::kRECPOINTS, fSameQACycle);
1350 qas.Run(fRunLocalReconstruction.Data(), AliQA::kESDS, fSameQACycle);
1352 AliQADataMakerRec *qadm = GetQADataMaker(AliQA::kGLOBAL);
1354 qadm->EndOfCycle(AliQA::kRECPOINTS);
1355 qadm->EndOfCycle(AliQA::kESDS);
1362 // Cleanup of CDB manager: cache and active storages!
1363 AliCDBManager::Instance()->ClearCache();
1369 //_____________________________________________________________________________
1370 Bool_t AliReconstruction::RunLocalReconstruction(const TString& /*detectors*/)
1372 // run the local reconstruction
1373 static Int_t eventNr=0;
1374 AliCodeTimerAuto("")
1376 // AliCDBManager* man = AliCDBManager::Instance();
1377 // Bool_t origCache = man->GetCacheFlag();
1379 // TString detStr = detectors;
1380 // for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
1381 // if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
1382 // AliReconstructor* reconstructor = GetReconstructor(iDet);
1383 // if (!reconstructor) continue;
1384 // if (reconstructor->HasLocalReconstruction()) continue;
1386 // AliCodeTimerStart(Form("running reconstruction for %s", fgkDetectorName[iDet]));
1387 // AliInfo(Form("running reconstruction for %s", fgkDetectorName[iDet]));
1389 // AliCodeTimerStart(Form("Loading calibration data from OCDB for %s", fgkDetectorName[iDet]));
1390 // AliInfo(Form("Loading calibration data from OCDB for %s", fgkDetectorName[iDet]));
1392 // man->SetCacheFlag(kTRUE);
1393 // TString calibPath = Form("%s/Calib/*", fgkDetectorName[iDet]);
1394 // man->GetAll(calibPath); // entries are cached!
1396 // AliCodeTimerStop(Form("Loading calibration data from OCDB for %s", fgkDetectorName[iDet]));
1398 // if (fRawReader) {
1399 // fRawReader->RewindEvents();
1400 // reconstructor->Reconstruct(fRunLoader, fRawReader);
1402 // reconstructor->Reconstruct(fRunLoader);
1405 // AliCodeTimerStop(Form("running reconstruction for %s", fgkDetectorName[iDet]));
1406 // AliSysInfo::AddStamp(Form("LRec%s_%d",fgkDetectorName[iDet],eventNr));
1408 // // unload calibration data
1409 // man->UnloadFromCache(calibPath);
1410 // //man->ClearCache();
1413 // man->SetCacheFlag(origCache);
1415 // if ((detStr.CompareTo("ALL") != 0) && !detStr.IsNull()) {
1416 // AliError(Form("the following detectors were not found: %s",
1418 // if (fStopOnError) return kFALSE;
1425 //_____________________________________________________________________________
1426 Bool_t AliReconstruction::RunLocalEventReconstruction(const TString& detectors)
1428 // run the local reconstruction
1430 static Int_t eventNr=0;
1431 AliCodeTimerAuto("")
1433 TString detStr = detectors;
1434 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
1435 if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
1436 AliReconstructor* reconstructor = GetReconstructor(iDet);
1437 if (!reconstructor) continue;
1438 AliLoader* loader = fLoader[iDet];
1439 // Matthias April 2008: temporary fix to run HLT reconstruction
1440 // although the HLT loader is missing
1441 if (strcmp(fgkDetectorName[iDet], "HLT")==0) {
1443 reconstructor->Reconstruct(fRawReader, NULL);
1446 reconstructor->Reconstruct(dummy, NULL);
1451 AliWarning(Form("No loader is defined for %s!",fgkDetectorName[iDet]));
1454 // conversion of digits
1455 if (fRawReader && reconstructor->HasDigitConversion()) {
1456 AliInfo(Form("converting raw data digits into root objects for %s",
1457 fgkDetectorName[iDet]));
1458 AliCodeTimerAuto(Form("converting raw data digits into root objects for %s",
1459 fgkDetectorName[iDet]));
1460 loader->LoadDigits("update");
1461 loader->CleanDigits();
1462 loader->MakeDigitsContainer();
1463 TTree* digitsTree = loader->TreeD();
1464 reconstructor->ConvertDigits(fRawReader, digitsTree);
1465 loader->WriteDigits("OVERWRITE");
1466 loader->UnloadDigits();
1468 // local reconstruction
1469 AliInfo(Form("running reconstruction for %s", fgkDetectorName[iDet]));
1470 AliCodeTimerAuto(Form("running reconstruction for %s", fgkDetectorName[iDet]));
1471 loader->LoadRecPoints("update");
1472 loader->CleanRecPoints();
1473 loader->MakeRecPointsContainer();
1474 TTree* clustersTree = loader->TreeR();
1475 if (fRawReader && !reconstructor->HasDigitConversion()) {
1476 reconstructor->Reconstruct(fRawReader, clustersTree);
1478 loader->LoadDigits("read");
1479 TTree* digitsTree = loader->TreeD();
1481 AliError(Form("Can't get the %s digits tree", fgkDetectorName[iDet]));
1482 if (fStopOnError) return kFALSE;
1484 reconstructor->Reconstruct(digitsTree, clustersTree);
1486 loader->UnloadDigits();
1489 // In-loop QA for local reconstrucion
1490 if (fRunQA && fInLoopQA) {
1491 AliQADataMakerRec * qadm = GetQADataMaker(iDet);
1494 //(Form("Running QA data maker for %s", fgkDetectorName[iDet]));
1496 //(Form("Running QA data maker for %s", fgkDetectorName[iDet]));
1498 qadm->Exec(AliQA::kRECPOINTS, clustersTree) ;
1501 //(Form("Running QA data maker for %s", fgkDetectorName[iDet]));
1505 loader->WriteRecPoints("OVERWRITE");
1506 loader->UnloadRecPoints();
1507 AliSysInfo::AddStamp(Form("LRec%s_%d",fgkDetectorName[iDet],eventNr), iDet,1,eventNr);
1510 if ((detStr.CompareTo("ALL") != 0) && !detStr.IsNull()) {
1511 AliError(Form("the following detectors were not found: %s",
1513 if (fStopOnError) return kFALSE;
1519 //_____________________________________________________________________________
1520 Bool_t AliReconstruction::RunVertexFinder(AliESDEvent*& esd)
1522 // run the barrel tracking
1524 AliCodeTimerAuto("")
1526 AliESDVertex* vertex = NULL;
1527 Double_t vtxPos[3] = {0, 0, 0};
1528 Double_t vtxErr[3] = {0.07, 0.07, 0.1};
1529 TArrayF mcVertex(3);
1530 if (fRunLoader->GetHeader() && fRunLoader->GetHeader()->GenEventHeader()) {
1531 fRunLoader->GetHeader()->GenEventHeader()->PrimaryVertex(mcVertex);
1532 for (Int_t i = 0; i < 3; i++) vtxPos[i] = mcVertex[i];
1536 if(fDiamondProfile) fVertexer->SetVtxStart(fDiamondProfile);
1537 AliInfo("running the ITS vertex finder");
1538 if (fLoader[0]) fLoader[0]->LoadRecPoints();
1539 vertex = fVertexer->FindVertexForCurrentEvent(fRunLoader->GetEventNumber());
1540 if (fLoader[0]) fLoader[0]->UnloadRecPoints();
1542 AliWarning("Vertex not found");
1543 vertex = new AliESDVertex();
1544 vertex->SetName("default");
1547 vertex->SetName("reconstructed");
1551 AliInfo("getting the primary vertex from MC");
1552 vertex = new AliESDVertex(vtxPos, vtxErr);
1556 vertex->GetXYZ(vtxPos);
1557 vertex->GetSigmaXYZ(vtxErr);
1559 AliWarning("no vertex reconstructed");
1560 vertex = new AliESDVertex(vtxPos, vtxErr);
1562 esd->SetPrimaryVertexSPD(vertex);
1563 // if SPD multiplicity has been determined, it is stored in the ESD
1564 AliMultiplicity *mult = fVertexer->GetMultiplicity();
1565 if(mult)esd->SetMultiplicity(mult);
1567 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
1568 if (fTracker[iDet]) fTracker[iDet]->SetVertex(vtxPos, vtxErr);
1575 //_____________________________________________________________________________
1576 Bool_t AliReconstruction::RunHLTTracking(AliESDEvent*& esd)
1578 // run the HLT barrel tracking
1580 AliCodeTimerAuto("")
1583 AliError("Missing runLoader!");
1587 AliInfo("running HLT tracking");
1589 // Get a pointer to the HLT reconstructor
1590 AliReconstructor *reconstructor = GetReconstructor(fgkNDetectors-1);
1591 if (!reconstructor) return kFALSE;
1594 for (Int_t iDet = 1; iDet >= 0; iDet--) {
1595 TString detName = fgkDetectorName[iDet];
1596 AliDebug(1, Form("%s HLT tracking", detName.Data()));
1597 reconstructor->SetOption(detName.Data());
1598 AliTracker *tracker = reconstructor->CreateTracker();
1600 AliWarning(Form("couldn't create a HLT tracker for %s", detName.Data()));
1601 if (fStopOnError) return kFALSE;
1605 Double_t vtxErr[3]={0.005,0.005,0.010};
1606 const AliESDVertex *vertex = esd->GetVertex();
1607 vertex->GetXYZ(vtxPos);
1608 tracker->SetVertex(vtxPos,vtxErr);
1610 fLoader[iDet]->LoadRecPoints("read");
1611 TTree* tree = fLoader[iDet]->TreeR();
1613 AliError(Form("Can't get the %s cluster tree", detName.Data()));
1616 tracker->LoadClusters(tree);
1618 if (tracker->Clusters2Tracks(esd) != 0) {
1619 AliError(Form("HLT %s Clusters2Tracks failed", fgkDetectorName[iDet]));
1623 tracker->UnloadClusters();
1631 //_____________________________________________________________________________
1632 Bool_t AliReconstruction::RunMuonTracking(AliESDEvent*& esd)
1634 // run the muon spectrometer tracking
1636 AliCodeTimerAuto("")
1639 AliError("Missing runLoader!");
1642 Int_t iDet = 7; // for MUON
1644 AliInfo("is running...");
1646 // Get a pointer to the MUON reconstructor
1647 AliReconstructor *reconstructor = GetReconstructor(iDet);
1648 if (!reconstructor) return kFALSE;
1651 TString detName = fgkDetectorName[iDet];
1652 AliDebug(1, Form("%s tracking", detName.Data()));
1653 AliTracker *tracker = reconstructor->CreateTracker();
1655 AliWarning(Form("couldn't create a tracker for %s", detName.Data()));
1660 fLoader[iDet]->LoadRecPoints("read");
1662 tracker->LoadClusters(fLoader[iDet]->TreeR());
1664 Int_t rv = tracker->Clusters2Tracks(esd);
1668 AliError(Form("%s Clusters2Tracks failed", fgkDetectorName[iDet]));
1672 fLoader[iDet]->UnloadRecPoints();
1674 tracker->UnloadClusters();
1682 //_____________________________________________________________________________
1683 Bool_t AliReconstruction::RunTracking(AliESDEvent*& esd)
1685 // run the barrel tracking
1686 static Int_t eventNr=0;
1687 AliCodeTimerAuto("")
1689 AliInfo("running tracking");
1691 //Fill the ESD with the T0 info (will be used by the TOF)
1692 if (fReconstructor[11] && fLoader[11]) {
1693 fLoader[11]->LoadRecPoints("READ");
1694 TTree *treeR = fLoader[11]->TreeR();
1695 GetReconstructor(11)->FillESD((TTree *)NULL,treeR,esd);
1698 // pass 1: TPC + ITS inwards
1699 for (Int_t iDet = 1; iDet >= 0; iDet--) {
1700 if (!fTracker[iDet]) continue;
1701 AliDebug(1, Form("%s tracking", fgkDetectorName[iDet]));
1704 fLoader[iDet]->LoadRecPoints("read");
1705 AliSysInfo::AddStamp(Form("RLoadCluster%s_%d",fgkDetectorName[iDet],eventNr),iDet,1, eventNr);
1706 TTree* tree = fLoader[iDet]->TreeR();
1708 AliError(Form("Can't get the %s cluster tree", fgkDetectorName[iDet]));
1711 fTracker[iDet]->LoadClusters(tree);
1712 AliSysInfo::AddStamp(Form("TLoadCluster%s_%d",fgkDetectorName[iDet],eventNr), iDet,2, eventNr);
1714 if (fTracker[iDet]->Clusters2Tracks(esd) != 0) {
1715 AliError(Form("%s Clusters2Tracks failed", fgkDetectorName[iDet]));
1718 if (fCheckPointLevel > 1) {
1719 WriteESD(esd, Form("%s.tracking", fgkDetectorName[iDet]));
1721 // preliminary PID in TPC needed by the ITS tracker
1723 GetReconstructor(1)->FillESD((TTree*)NULL, (TTree*)NULL, esd);
1724 AliESDpid::MakePID(esd);
1726 AliSysInfo::AddStamp(Form("Tracking0%s_%d",fgkDetectorName[iDet],eventNr), iDet,3,eventNr);
1729 // pass 2: ALL backwards
1731 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
1732 if (!fTracker[iDet]) continue;
1733 AliDebug(1, Form("%s back propagation", fgkDetectorName[iDet]));
1736 if (iDet > 1) { // all except ITS, TPC
1738 fLoader[iDet]->LoadRecPoints("read");
1739 AliSysInfo::AddStamp(Form("RLoadCluster0%s_%d",fgkDetectorName[iDet],eventNr), iDet,1, eventNr);
1740 tree = fLoader[iDet]->TreeR();
1742 AliError(Form("Can't get the %s cluster tree", fgkDetectorName[iDet]));
1745 fTracker[iDet]->LoadClusters(tree);
1746 AliSysInfo::AddStamp(Form("TLoadCluster0%s_%d",fgkDetectorName[iDet],eventNr), iDet,2, eventNr);
1750 if (iDet>1) // start filling residuals for the "outer" detectors
1751 if (fRunGlobalQA) AliTracker::SetFillResiduals(kTRUE);
1753 if (fTracker[iDet]->PropagateBack(esd) != 0) {
1754 AliError(Form("%s backward propagation failed", fgkDetectorName[iDet]));
1757 if (fCheckPointLevel > 1) {
1758 WriteESD(esd, Form("%s.back", fgkDetectorName[iDet]));
1762 if (iDet > 2) { // all except ITS, TPC, TRD
1763 fTracker[iDet]->UnloadClusters();
1764 fLoader[iDet]->UnloadRecPoints();
1766 // updated PID in TPC needed by the ITS tracker -MI
1768 GetReconstructor(1)->FillESD((TTree*)NULL, (TTree*)NULL, esd);
1769 AliESDpid::MakePID(esd);
1771 AliSysInfo::AddStamp(Form("Tracking1%s_%d",fgkDetectorName[iDet],eventNr), iDet,3, eventNr);
1773 //stop filling residuals for the "outer" detectors
1774 if (fRunGlobalQA) AliTracker::SetFillResiduals(kFALSE);
1776 // write space-points to the ESD in case alignment data output
1778 if (fWriteAlignmentData)
1779 WriteAlignmentData(esd);
1781 // pass 3: TRD + TPC + ITS refit inwards
1783 for (Int_t iDet = 2; iDet >= 0; iDet--) {
1784 if (!fTracker[iDet]) continue;
1785 AliDebug(1, Form("%s inward refit", fgkDetectorName[iDet]));
1788 if (iDet<2) // start filling residuals for TPC and ITS
1789 if (fRunGlobalQA) AliTracker::SetFillResiduals(kTRUE);
1791 if (fTracker[iDet]->RefitInward(esd) != 0) {
1792 AliError(Form("%s inward refit failed", fgkDetectorName[iDet]));
1795 // run postprocessing
1796 if (fTracker[iDet]->PostProcess(esd) != 0) {
1797 AliError(Form("%s postprocessing failed", fgkDetectorName[iDet]));
1800 if (fCheckPointLevel > 1) {
1801 WriteESD(esd, Form("%s.refit", fgkDetectorName[iDet]));
1803 AliSysInfo::AddStamp(Form("Tracking2%s_%d",fgkDetectorName[iDet],eventNr), iDet,3, eventNr);
1805 fTracker[iDet]->UnloadClusters();
1806 AliSysInfo::AddStamp(Form("TUnloadCluster%s_%d",fgkDetectorName[iDet],eventNr), iDet,4, eventNr);
1807 fLoader[iDet]->UnloadRecPoints();
1808 AliSysInfo::AddStamp(Form("RUnloadCluster%s_%d",fgkDetectorName[iDet],eventNr), iDet,5, eventNr);
1810 // stop filling residuals for TPC and ITS
1811 if (fRunGlobalQA) AliTracker::SetFillResiduals(kFALSE);
1817 //_____________________________________________________________________________
1818 Bool_t AliReconstruction::CleanESD(AliESDEvent *esd){
1820 // Remove the data which are not needed for the physics analysis.
1823 Int_t nTracks=esd->GetNumberOfTracks();
1824 Int_t nV0s=esd->GetNumberOfV0s();
1826 (Form("Number of ESD tracks and V0s before cleaning: %d %d",nTracks,nV0s));
1828 Float_t cleanPars[]={fV0DCAmax,fV0CsPmin,fDmax,fZmax};
1829 Bool_t rc=esd->Clean(cleanPars);
1831 nTracks=esd->GetNumberOfTracks();
1832 nV0s=esd->GetNumberOfV0s();
1834 (Form("Number of ESD tracks and V0s after cleaning %d %d",nTracks,nV0s));
1839 //_____________________________________________________________________________
1840 Bool_t AliReconstruction::FillESD(AliESDEvent*& esd, const TString& detectors)
1842 // fill the event summary data
1844 AliCodeTimerAuto("")
1845 static Int_t eventNr=0;
1846 TString detStr = detectors;
1848 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
1849 if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
1850 AliReconstructor* reconstructor = GetReconstructor(iDet);
1851 if (!reconstructor) continue;
1852 if (!ReadESD(esd, fgkDetectorName[iDet])) {
1853 AliDebug(1, Form("filling ESD for %s", fgkDetectorName[iDet]));
1854 TTree* clustersTree = NULL;
1855 if (fLoader[iDet]) {
1856 fLoader[iDet]->LoadRecPoints("read");
1857 clustersTree = fLoader[iDet]->TreeR();
1858 if (!clustersTree) {
1859 AliError(Form("Can't get the %s clusters tree",
1860 fgkDetectorName[iDet]));
1861 if (fStopOnError) return kFALSE;
1864 if (fRawReader && !reconstructor->HasDigitConversion()) {
1865 reconstructor->FillESD(fRawReader, clustersTree, esd);
1867 TTree* digitsTree = NULL;
1868 if (fLoader[iDet]) {
1869 fLoader[iDet]->LoadDigits("read");
1870 digitsTree = fLoader[iDet]->TreeD();
1872 AliError(Form("Can't get the %s digits tree",
1873 fgkDetectorName[iDet]));
1874 if (fStopOnError) return kFALSE;
1877 reconstructor->FillESD(digitsTree, clustersTree, esd);
1878 if (fLoader[iDet]) fLoader[iDet]->UnloadDigits();
1880 if (fLoader[iDet]) {
1881 fLoader[iDet]->UnloadRecPoints();
1884 if (fCheckPointLevel > 2) WriteESD(esd, fgkDetectorName[iDet]);
1888 if ((detStr.CompareTo("ALL") != 0) && !detStr.IsNull()) {
1889 AliError(Form("the following detectors were not found: %s",
1891 if (fStopOnError) return kFALSE;
1893 AliSysInfo::AddStamp(Form("FillESD%d",eventNr), 0,1, eventNr);
1898 //_____________________________________________________________________________
1899 Bool_t AliReconstruction::FillTriggerESD(AliESDEvent*& esd)
1901 // Reads the trigger decision which is
1902 // stored in Trigger.root file and fills
1903 // the corresponding esd entries
1905 AliCodeTimerAuto("")
1907 AliInfo("Filling trigger information into the ESD");
1909 AliCentralTrigger *aCTP = NULL;
1912 AliCTPRawStream input(fRawReader);
1913 if (!input.Next()) {
1914 AliError("No valid CTP (trigger) DDL raw data is found ! The trigger information is not stored in the ESD !");
1917 esd->SetTriggerMask(input.GetClassMask());
1918 esd->SetTriggerCluster(input.GetClusterMask());
1920 aCTP = new AliCentralTrigger();
1921 TString configstr("");
1922 if (!aCTP->LoadConfiguration(configstr)) { // Load CTP config from OCDB
1923 AliError("No trigger configuration found in OCDB! The trigger classes information will no be stored in ESD!");
1929 AliRunLoader *runloader = AliRunLoader::GetRunLoader();
1931 if (!runloader->LoadTrigger()) {
1932 aCTP = runloader->GetTrigger();
1933 esd->SetTriggerMask(aCTP->GetClassMask());
1934 esd->SetTriggerCluster(aCTP->GetClusterMask());
1937 AliWarning("No trigger can be loaded! The trigger information is not stored in the ESD !");
1942 AliError("No run loader is available! The trigger information is not stored in the ESD !");
1947 // Now fill the trigger class names into AliESDRun object
1948 AliTriggerConfiguration *config = aCTP->GetConfiguration();
1950 AliError("No trigger configuration has been found! The trigger classes information will no be stored in ESD!");
1951 if (fRawReader) delete aCTP;
1955 const TObjArray& classesArray = config->GetClasses();
1956 Int_t nclasses = classesArray.GetEntriesFast();
1957 for( Int_t j=0; j<nclasses; j++ ) {
1958 AliTriggerClass* trclass = (AliTriggerClass*)classesArray.At( j );
1959 Int_t trindex = (Int_t)TMath::Log2(trclass->GetMask());
1960 esd->SetTriggerClass(trclass->GetName(),trindex);
1963 if (fRawReader) delete aCTP;
1971 //_____________________________________________________________________________
1972 Bool_t AliReconstruction::FillRawEventHeaderESD(AliESDEvent*& esd)
1975 // Filling information from RawReader Header
1978 AliInfo("Filling information from RawReader Header");
1979 esd->SetBunchCrossNumber(0);
1980 esd->SetOrbitNumber(0);
1981 esd->SetPeriodNumber(0);
1982 esd->SetTimeStamp(0);
1983 esd->SetEventType(0);
1984 const AliRawEventHeaderBase * eventHeader = fRawReader->GetEventHeader();
1987 const UInt_t *id = eventHeader->GetP("Id");
1988 esd->SetBunchCrossNumber((id)[1]&0x00000fff);
1989 esd->SetOrbitNumber((((id)[0]<<20)&0xf00000)|(((id)[1]>>12)&0xfffff));
1990 esd->SetPeriodNumber(((id)[0]>>4)&0x0fffffff);
1992 esd->SetTimeStamp((eventHeader->Get("Timestamp")));
1993 esd->SetEventType((eventHeader->Get("Type")));
2000 //_____________________________________________________________________________
2001 Bool_t AliReconstruction::IsSelected(TString detName, TString& detectors) const
2003 // check whether detName is contained in detectors
2004 // if yes, it is removed from detectors
2006 // check if all detectors are selected
2007 if ((detectors.CompareTo("ALL") == 0) ||
2008 detectors.BeginsWith("ALL ") ||
2009 detectors.EndsWith(" ALL") ||
2010 detectors.Contains(" ALL ")) {
2015 // search for the given detector
2016 Bool_t result = kFALSE;
2017 if ((detectors.CompareTo(detName) == 0) ||
2018 detectors.BeginsWith(detName+" ") ||
2019 detectors.EndsWith(" "+detName) ||
2020 detectors.Contains(" "+detName+" ")) {
2021 detectors.ReplaceAll(detName, "");
2025 // clean up the detectors string
2026 while (detectors.Contains(" ")) detectors.ReplaceAll(" ", " ");
2027 while (detectors.BeginsWith(" ")) detectors.Remove(0, 1);
2028 while (detectors.EndsWith(" ")) detectors.Remove(detectors.Length()-1, 1);
2033 //_____________________________________________________________________________
2034 Bool_t AliReconstruction::InitRunLoader()
2036 // get or create the run loader
2038 if (gAlice) delete gAlice;
2041 if (!gSystem->AccessPathName(fGAliceFileName.Data())) { // galice.root exists
2042 // load all base libraries to get the loader classes
2043 TString libs = gSystem->GetLibraries();
2044 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
2045 TString detName = fgkDetectorName[iDet];
2046 if (detName == "HLT") continue;
2047 if (libs.Contains("lib" + detName + "base.so")) continue;
2048 gSystem->Load("lib" + detName + "base.so");
2050 fRunLoader = AliRunLoader::Open(fGAliceFileName.Data());
2052 AliError(Form("no run loader found in file %s", fGAliceFileName.Data()));
2057 fRunLoader->CdGAFile();
2058 fRunLoader->LoadgAlice();
2060 //PH This is a temporary fix to give access to the kinematics
2061 //PH that is needed for the labels of ITS clusters
2062 fRunLoader->LoadHeader();
2063 fRunLoader->LoadKinematics();
2065 } else { // galice.root does not exist
2067 AliError(Form("the file %s does not exist", fGAliceFileName.Data()));
2071 fRunLoader = AliRunLoader::Open(fGAliceFileName.Data(),
2072 AliConfig::GetDefaultEventFolderName(),
2075 AliError(Form("could not create run loader in file %s",
2076 fGAliceFileName.Data()));
2080 fIsNewRunLoader = kTRUE;
2081 fRunLoader->MakeTree("E");
2083 if (fNumberOfEventsPerFile > 0)
2084 fRunLoader->SetNumberOfEventsPerFile(fNumberOfEventsPerFile);
2086 fRunLoader->SetNumberOfEventsPerFile((UInt_t)-1);
2092 //_____________________________________________________________________________
2093 AliReconstructor* AliReconstruction::GetReconstructor(Int_t iDet)
2095 // get the reconstructor object and the loader for a detector
2097 if (fReconstructor[iDet]) return fReconstructor[iDet];
2099 // load the reconstructor object
2100 TPluginManager* pluginManager = gROOT->GetPluginManager();
2101 TString detName = fgkDetectorName[iDet];
2102 TString recName = "Ali" + detName + "Reconstructor";
2104 if (!fIsNewRunLoader && !fRunLoader->GetLoader(detName+"Loader") && (detName != "HLT")) return NULL;
2106 AliReconstructor* reconstructor = NULL;
2107 // first check if a plugin is defined for the reconstructor
2108 TPluginHandler* pluginHandler =
2109 pluginManager->FindHandler("AliReconstructor", detName);
2110 // if not, add a plugin for it
2111 if (!pluginHandler) {
2112 AliDebug(1, Form("defining plugin for %s", recName.Data()));
2113 TString libs = gSystem->GetLibraries();
2114 if (libs.Contains("lib" + detName + "base.so") ||
2115 (gSystem->Load("lib" + detName + "base.so") >= 0)) {
2116 pluginManager->AddHandler("AliReconstructor", detName,
2117 recName, detName + "rec", recName + "()");
2119 pluginManager->AddHandler("AliReconstructor", detName,
2120 recName, detName, recName + "()");
2122 pluginHandler = pluginManager->FindHandler("AliReconstructor", detName);
2124 if (pluginHandler && (pluginHandler->LoadPlugin() == 0)) {
2125 reconstructor = (AliReconstructor*) pluginHandler->ExecPlugin(0);
2127 if (reconstructor) {
2128 TObject* obj = fOptions.FindObject(detName.Data());
2129 if (obj) reconstructor->SetOption(obj->GetTitle());
2130 reconstructor->Init();
2131 fReconstructor[iDet] = reconstructor;
2134 // get or create the loader
2135 if (detName != "HLT") {
2136 fLoader[iDet] = fRunLoader->GetLoader(detName + "Loader");
2137 if (!fLoader[iDet]) {
2138 AliConfig::Instance()
2139 ->CreateDetectorFolders(fRunLoader->GetEventFolder(),
2141 // first check if a plugin is defined for the loader
2143 pluginManager->FindHandler("AliLoader", detName);
2144 // if not, add a plugin for it
2145 if (!pluginHandler) {
2146 TString loaderName = "Ali" + detName + "Loader";
2147 AliDebug(1, Form("defining plugin for %s", loaderName.Data()));
2148 pluginManager->AddHandler("AliLoader", detName,
2149 loaderName, detName + "base",
2150 loaderName + "(const char*, TFolder*)");
2151 pluginHandler = pluginManager->FindHandler("AliLoader", detName);
2153 if (pluginHandler && (pluginHandler->LoadPlugin() == 0)) {
2155 (AliLoader*) pluginHandler->ExecPlugin(2, detName.Data(),
2156 fRunLoader->GetEventFolder());
2158 if (!fLoader[iDet]) { // use default loader
2159 fLoader[iDet] = new AliLoader(detName, fRunLoader->GetEventFolder());
2161 if (!fLoader[iDet]) {
2162 AliWarning(Form("couldn't get loader for %s", detName.Data()));
2163 if (fStopOnError) return NULL;
2165 fRunLoader->AddLoader(fLoader[iDet]);
2166 fRunLoader->CdGAFile();
2167 if (gFile && !gFile->IsWritable()) gFile->ReOpen("UPDATE");
2168 fRunLoader->Write(0, TObject::kOverwrite);
2173 return reconstructor;
2176 //_____________________________________________________________________________
2177 Bool_t AliReconstruction::CreateVertexer()
2179 // create the vertexer
2182 AliReconstructor* itsReconstructor = GetReconstructor(0);
2183 if (itsReconstructor) {
2184 fVertexer = itsReconstructor->CreateVertexer();
2187 AliWarning("couldn't create a vertexer for ITS");
2188 if (fStopOnError) return kFALSE;
2194 //_____________________________________________________________________________
2195 Bool_t AliReconstruction::CreateTrackers(const TString& detectors)
2197 // create the trackers
2199 TString detStr = detectors;
2200 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
2201 if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
2202 AliReconstructor* reconstructor = GetReconstructor(iDet);
2203 if (!reconstructor) continue;
2204 TString detName = fgkDetectorName[iDet];
2205 if (detName == "HLT") {
2206 fRunHLTTracking = kTRUE;
2209 if (detName == "MUON") {
2210 fRunMuonTracking = kTRUE;
2215 fTracker[iDet] = reconstructor->CreateTracker();
2216 if (!fTracker[iDet] && (iDet < 7)) {
2217 AliWarning(Form("couldn't create a tracker for %s", detName.Data()));
2218 if (fStopOnError) return kFALSE;
2220 AliSysInfo::AddStamp(Form("LTracker%s",fgkDetectorName[iDet]), iDet,0);
2226 //_____________________________________________________________________________
2227 void AliReconstruction::CleanUp(TFile* file, TFile* fileOld)
2229 // delete trackers and the run loader and close and delete the file
2231 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
2232 delete fReconstructor[iDet];
2233 fReconstructor[iDet] = NULL;
2234 fLoader[iDet] = NULL;
2235 delete fTracker[iDet];
2236 fTracker[iDet] = NULL;
2237 // delete fQADataMaker[iDet];
2238 // fQADataMaker[iDet] = NULL;
2243 if (ftVertexer) delete ftVertexer;
2246 if(!(AliCDBManager::Instance()->GetCacheFlag())) {
2247 delete fDiamondProfile;
2248 fDiamondProfile = NULL;
2249 delete fDiamondProfileTPC;
2250 fDiamondProfileTPC = NULL;
2260 if (fParentRawReader) delete fParentRawReader;
2261 fParentRawReader=NULL;
2271 gSystem->Unlink("AliESDs.old.root");
2276 //_____________________________________________________________________________
2278 Bool_t AliReconstruction::ReadESD(AliESDEvent*& esd, const char* recStep) const
2280 // read the ESD event from a file
2282 if (!esd) return kFALSE;
2284 sprintf(fileName, "ESD_%d.%d_%s.root",
2285 esd->GetRunNumber(), esd->GetEventNumberInFile(), recStep);
2286 if (gSystem->AccessPathName(fileName)) return kFALSE;
2288 AliInfo(Form("reading ESD from file %s", fileName));
2289 AliDebug(1, Form("reading ESD from file %s", fileName));
2290 TFile* file = TFile::Open(fileName);
2291 if (!file || !file->IsOpen()) {
2292 AliError(Form("opening %s failed", fileName));
2299 esd = (AliESDEvent*) file->Get("ESD");
2308 //_____________________________________________________________________________
2309 void AliReconstruction::WriteESD(AliESDEvent* esd, const char* recStep) const
2311 // write the ESD event to a file
2315 sprintf(fileName, "ESD_%d.%d_%s.root",
2316 esd->GetRunNumber(), esd->GetEventNumberInFile(), recStep);
2318 AliDebug(1, Form("writing ESD to file %s", fileName));
2319 TFile* file = TFile::Open(fileName, "recreate");
2320 if (!file || !file->IsOpen()) {
2321 AliError(Form("opening %s failed", fileName));
2330 void AliReconstruction::WriteAlignmentData(AliESDEvent* esd)
2332 // Write space-points which are then used in the alignment procedures
2333 // For the moment only ITS, TRD and TPC
2335 // Load TOF clusters
2337 fLoader[3]->LoadRecPoints("read");
2338 TTree* tree = fLoader[3]->TreeR();
2340 AliError(Form("Can't get the %s cluster tree", fgkDetectorName[3]));
2343 fTracker[3]->LoadClusters(tree);
2345 Int_t ntracks = esd->GetNumberOfTracks();
2346 for (Int_t itrack = 0; itrack < ntracks; itrack++)
2348 AliESDtrack *track = esd->GetTrack(itrack);
2351 for (Int_t iDet = 3; iDet >= 0; iDet--)
2352 nsp += track->GetNcls(iDet);
2354 AliTrackPointArray *sp = new AliTrackPointArray(nsp);
2355 track->SetTrackPointArray(sp);
2357 for (Int_t iDet = 3; iDet >= 0; iDet--) {
2358 AliTracker *tracker = fTracker[iDet];
2359 if (!tracker) continue;
2360 Int_t nspdet = track->GetNcls(iDet);
2361 if (nspdet <= 0) continue;
2362 track->GetClusters(iDet,idx);
2366 while (isp2 < nspdet) {
2368 TString dets = fgkDetectorName[iDet];
2369 if ((fUseTrackingErrorsForAlignment.CompareTo(dets) == 0) ||
2370 fUseTrackingErrorsForAlignment.BeginsWith(dets+" ") ||
2371 fUseTrackingErrorsForAlignment.EndsWith(" "+dets) ||
2372 fUseTrackingErrorsForAlignment.Contains(" "+dets+" ")) {
2373 isvalid = tracker->GetTrackPointTrackingError(idx[isp2],p,track);
2375 isvalid = tracker->GetTrackPoint(idx[isp2],p);
2378 const Int_t kNTPCmax = 159;
2379 if (iDet==1 && isp2>kNTPCmax) break; // to be fixed
2380 if (!isvalid) continue;
2381 sp->AddPoint(isptrack,&p); isptrack++; isp++;
2387 fTracker[3]->UnloadClusters();
2388 fLoader[3]->UnloadRecPoints();
2392 //_____________________________________________________________________________
2393 void AliReconstruction::FillRawDataErrorLog(Int_t iEvent, AliESDEvent* esd)
2395 // The method reads the raw-data error log
2396 // accumulated within the rawReader.
2397 // It extracts the raw-data errors related to
2398 // the current event and stores them into
2399 // a TClonesArray inside the esd object.
2401 if (!fRawReader) return;
2403 for(Int_t i = 0; i < fRawReader->GetNumberOfErrorLogs(); i++) {
2405 AliRawDataErrorLog *log = fRawReader->GetErrorLog(i);
2407 if (iEvent != log->GetEventNumber()) continue;
2409 esd->AddRawDataErrorLog(log);
2414 TNamed* AliReconstruction::CopyFileToTNamed(TString fPath,TString pName){
2415 // Dump a file content into a char in TNamed
2417 in.open(fPath.Data(),ios::in | ios::binary|ios::ate);
2418 Int_t kBytes = (Int_t)in.tellg();
2419 printf("Size: %d \n",kBytes);
2422 char* memblock = new char [kBytes];
2423 in.seekg (0, ios::beg);
2424 in.read (memblock, kBytes);
2426 TString fData(memblock,kBytes);
2427 fn = new TNamed(pName,fData);
2428 printf("fData Size: %d \n",fData.Sizeof());
2429 printf("pName Size: %d \n",pName.Sizeof());
2430 printf("fn Size: %d \n",fn->Sizeof());
2434 AliInfo(Form("Could not Open %s\n",fPath.Data()));
2440 void AliReconstruction::TNamedToFile(TTree* fTree, TString pName){
2441 // This is not really needed in AliReconstruction at the moment
2442 // but can serve as a template
2444 TList *fList = fTree->GetUserInfo();
2445 TNamed *fn = (TNamed*)fList->FindObject(pName.Data());
2446 printf("fn Size: %d \n",fn->Sizeof());
2448 TString fTmp(fn->GetName()); // to be 100% sure in principle pName also works
2449 const char* cdata = fn->GetTitle();
2450 printf("fTmp Size %d\n",fTmp.Sizeof());
2452 int size = fn->Sizeof()-fTmp.Sizeof()-sizeof(UChar_t)-sizeof(Int_t); // see dfinition of TString::SizeOf()...
2453 printf("calculated size %d\n",size);
2454 ofstream out(pName.Data(),ios::out | ios::binary);
2455 out.write(cdata,size);
2460 //_____________________________________________________________________________
2461 AliQADataMakerRec * AliReconstruction::GetQADataMaker(Int_t iDet)
2463 // get the quality assurance data maker object and the loader for a detector
2465 if (fQADataMaker[iDet])
2466 return fQADataMaker[iDet];
2468 AliQADataMakerRec * qadm = NULL;
2469 if (iDet == fgkNDetectors) { //Global QA
2470 qadm = new AliGlobalQADataMaker();
2471 fQADataMaker[iDet] = qadm;
2475 // load the QA data maker object
2476 TPluginManager* pluginManager = gROOT->GetPluginManager();
2477 TString detName = fgkDetectorName[iDet];
2478 TString qadmName = "Ali" + detName + "QADataMakerRec";
2479 if (!fIsNewRunLoader && !fRunLoader->GetLoader(detName+"Loader") && (detName != "HLT"))
2482 // first check if a plugin is defined for the quality assurance data maker
2483 TPluginHandler* pluginHandler = pluginManager->FindHandler("AliQADataMakerRec", detName);
2484 // if not, add a plugin for it
2485 if (!pluginHandler) {
2486 AliDebug(1, Form("defining plugin for %s", qadmName.Data()));
2487 TString libs = gSystem->GetLibraries();
2488 if (libs.Contains("lib" + detName + "base.so") ||
2489 (gSystem->Load("lib" + detName + "base.so") >= 0)) {
2490 pluginManager->AddHandler("AliQADataMakerRec", detName,
2491 qadmName, detName + "qadm", qadmName + "()");
2493 pluginManager->AddHandler("AliQADataMakerRec", detName,
2494 qadmName, detName, qadmName + "()");
2496 pluginHandler = pluginManager->FindHandler("AliQADataMakerRec", detName);
2498 if (pluginHandler && (pluginHandler->LoadPlugin() == 0)) {
2499 qadm = (AliQADataMakerRec *) pluginHandler->ExecPlugin(0);
2502 fQADataMaker[iDet] = qadm;
2507 //_____________________________________________________________________________
2508 Bool_t AliReconstruction::RunQA(const char* detectors, AliESDEvent *& esd)
2510 // run the Quality Assurance data producer
2512 AliCodeTimerAuto("")
2513 TString detStr = detectors;
2514 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
2515 if (!IsSelected(fgkDetectorName[iDet], detStr))
2517 AliQADataMakerRec * qadm = GetQADataMaker(iDet);
2520 AliCodeTimerStart(Form("running quality assurance data maker for %s", fgkDetectorName[iDet]));
2521 AliInfo(Form("running quality assurance data maker for %s", fgkDetectorName[iDet]));
2523 qadm->Exec(AliQA::kESDS, esd) ;
2526 AliCodeTimerStop(Form("running quality assurance data maker for %s", fgkDetectorName[iDet]));
2528 if ((detStr.CompareTo("ALL") != 0) && !detStr.IsNull()) {
2529 AliError(Form("the following detectors were not found: %s",
2539 //_____________________________________________________________________________
2540 void AliReconstruction::CheckQA()
2542 // check the QA of SIM for this run and remove the detectors
2543 // with status Fatal
2545 TString newRunLocalReconstruction ;
2546 TString newRunTracking ;
2547 TString newFillESD ;
2549 for (Int_t iDet = 0; iDet < AliQA::kNDET; iDet++) {
2550 TString detName(AliQA::GetDetName(iDet)) ;
2551 AliQA * qa = AliQA::Instance(AliQA::DETECTORINDEX_t(iDet)) ;
2552 if ( qa->IsSet(AliQA::DETECTORINDEX_t(iDet), AliQA::kSIM, AliQA::kFATAL)) {
2553 AliInfo(Form("QA status for %s in Hits and/or SDIGITS and/or Digits was Fatal; No reconstruction performed", detName.Data())) ;
2555 if ( fRunLocalReconstruction.Contains(AliQA::GetDetName(iDet)) ||
2556 fRunLocalReconstruction.Contains("ALL") ) {
2557 newRunLocalReconstruction += detName ;
2558 newRunLocalReconstruction += " " ;
2560 if ( fRunTracking.Contains(AliQA::GetDetName(iDet)) ||
2561 fRunTracking.Contains("ALL") ) {
2562 newRunTracking += detName ;
2563 newRunTracking += " " ;
2565 if ( fFillESD.Contains(AliQA::GetDetName(iDet)) ||
2566 fFillESD.Contains("ALL") ) {
2567 newFillESD += detName ;
2572 fRunLocalReconstruction = newRunLocalReconstruction ;
2573 fRunTracking = newRunTracking ;
2574 fFillESD = newFillESD ;
2577 //_____________________________________________________________________________
2578 Int_t AliReconstruction::GetDetIndex(const char* detector)
2580 // return the detector index corresponding to detector
2582 for (index = 0; index < fgkNDetectors ; index++) {
2583 if ( strcmp(detector, fgkDetectorName[index]) == 0 )
2588 //_____________________________________________________________________________
2589 Bool_t AliReconstruction::FinishPlaneEff() {
2591 // Here execute all the necessary operationis, at the end of the tracking phase,
2592 // in case that evaluation of PlaneEfficiencies was required for some detector.
2593 // E.g., write into a DataBase file the PlaneEfficiency which have been evaluated.
2595 // This Preliminary version works only FOR ITS !!!!!
2596 // other detectors (TOF,TRD, etc. have to develop their specific codes)
2599 // Return: kTRUE if all operations have been done properly, kFALSE otherwise
2602 //for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
2603 for (Int_t iDet = 0; iDet < 1; iDet++) { // for the time being only ITS
2604 //if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
2605 if(fTracker[iDet]) {
2606 AliPlaneEff *planeeff=fTracker[iDet]->GetPlaneEff();
2607 ret=planeeff->WriteIntoCDB();
2608 if(planeeff->GetCreateHistos()) {
2609 TString name="PlaneEffHisto";
2610 name+=fgkDetectorName[iDet];
2612 ret*=planeeff->WriteHistosToFile(name,"RECREATE");
2618 //_____________________________________________________________________________
2619 Bool_t AliReconstruction::InitPlaneEff() {
2621 // Here execute all the necessary operations, before of the tracking phase,
2622 // for the evaluation of PlaneEfficiencies, in case required for some detectors.
2623 // E.g., read from a DataBase file a first evaluation of the PlaneEfficiency
2624 // which should be updated/recalculated.
2626 // This Preliminary version will work only FOR ITS !!!!!
2627 // other detectors (TOF,TRD, etc. have to develop their specific codes)
2630 // Return: kTRUE if all operations have been done properly, kFALSE otherwise
2632 AliWarning(Form("Implementation of this method not yet done !! Method return kTRUE"));
2636 //_____________________________________________________________________________
2637 Bool_t AliReconstruction::InitAliEVE()
2639 // This method should be called only in case
2640 // AliReconstruction is run
2641 // within the alieve environment.
2642 // It will initialize AliEVE in a way
2643 // so that it can visualize event processed
2644 // by AliReconstruction.
2645 // The return flag shows whenever the
2646 // AliEVE initialization was successful or not.
2649 macroStr.Form("%s/EVE/macros/alieve_online.C",gSystem->ExpandPathName("$ALICE_ROOT"));
2650 AliInfo(Form("Loading AliEVE macro: %s",macroStr.Data()));
2651 if (gROOT->LoadMacro(macroStr.Data()) != 0) return kFALSE;
2653 gROOT->ProcessLine("if (!gAliEveEvent) {gAliEveEvent = new AliEveEventManager();gAliEveEvent->SetAutoLoad(kTRUE);gAliEveEvent->AddNewEventCommand(\"alieve_online_on_new_event()\");gEve->AddEvent(gAliEveEvent);};");
2654 gROOT->ProcessLine("alieve_online_init()");
2659 //_____________________________________________________________________________
2660 void AliReconstruction::RunAliEVE()
2662 // Runs AliEVE visualisation of
2663 // the current event.
2664 // Should be executed only after
2665 // successful initialization of AliEVE.
2667 AliInfo("Running AliEVE...");
2668 gROOT->ProcessLine(Form("gAliEveEvent->SetEvent((AliRunLoader*)%p,(AliRawReader*)%p,(AliESDEvent*)%p);",fRunLoader,fRawReader,fesd));
2669 gROOT->ProcessLine("gAliEveEvent->StartStopAutoLoadTimer();");