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("..."); //
109 ///////////////////////////////////////////////////////////////////////////////
116 #include <TPluginManager.h>
117 #include <TGeoManager.h>
118 #include <TLorentzVector.h>
121 #include <TObjArray.h>
125 #include <TProofOutputFile.h>
126 #include <TParameter.h>
128 #include "AliReconstruction.h"
129 #include "AliCodeTimer.h"
130 #include "AliReconstructor.h"
132 #include "AliRunLoader.h"
134 #include "AliRawReaderFile.h"
135 #include "AliRawReaderDate.h"
136 #include "AliRawReaderRoot.h"
137 #include "AliRawEventHeaderBase.h"
138 #include "AliRawEvent.h"
139 #include "AliESDEvent.h"
140 #include "AliESDMuonTrack.h"
141 #include "AliESDfriend.h"
142 #include "AliESDVertex.h"
143 #include "AliESDcascade.h"
144 #include "AliESDkink.h"
145 #include "AliESDtrack.h"
146 #include "AliESDCaloCluster.h"
147 #include "AliESDCaloCells.h"
148 #include "AliMultiplicity.h"
149 #include "AliTracker.h"
150 #include "AliVertexer.h"
151 #include "AliVertexerTracks.h"
152 #include "AliV0vertexer.h"
153 #include "AliCascadeVertexer.h"
154 #include "AliHeader.h"
155 #include "AliGenEventHeader.h"
157 #include "AliESDpid.h"
158 #include "AliESDtrack.h"
159 #include "AliESDPmdTrack.h"
161 #include "AliESDTagCreator.h"
163 #include "AliGeomManager.h"
164 #include "AliTrackPointArray.h"
165 #include "AliCDBManager.h"
166 #include "AliCDBStorage.h"
167 #include "AliCDBEntry.h"
168 #include "AliAlignObj.h"
170 #include "AliCentralTrigger.h"
171 #include "AliTriggerConfiguration.h"
172 #include "AliTriggerClass.h"
173 #include "AliTriggerCluster.h"
174 #include "AliCTPRawStream.h"
176 #include "AliQADataMakerRec.h"
177 #include "AliGlobalQADataMaker.h"
179 #include "AliQADataMakerSteer.h"
181 #include "AliPlaneEff.h"
183 #include "AliSysInfo.h" // memory snapshots
184 #include "AliRawHLTManager.h"
186 #include "AliMagWrapCheb.h"
188 #include "AliDetectorRecoParam.h"
189 #include "AliGRPRecoParam.h"
190 #include "AliRunInfo.h"
191 #include "AliEventInfo.h"
195 #include "AliGRPObject.h"
197 ClassImp(AliReconstruction)
199 //_____________________________________________________________________________
200 const char* AliReconstruction::fgkDetectorName[AliReconstruction::fgkNDetectors] = {"ITS", "TPC", "TRD", "TOF", "PHOS", "HMPID", "EMCAL", "MUON", "FMD", "ZDC", "PMD", "T0", "VZERO", "ACORDE", "HLT"};
202 //_____________________________________________________________________________
203 AliReconstruction::AliReconstruction(const char* gAliceFilename) :
205 fUniformField(kFALSE),
206 fForcedFieldMap(NULL),
207 fRunVertexFinder(kTRUE),
208 fRunVertexFinderTracks(kTRUE),
209 fRunHLTTracking(kFALSE),
210 fRunMuonTracking(kFALSE),
212 fRunCascadeFinder(kTRUE),
213 fStopOnError(kFALSE),
214 fWriteAlignmentData(kFALSE),
215 fWriteESDfriend(kFALSE),
216 fFillTriggerESD(kTRUE),
224 fRunLocalReconstruction("ALL"),
228 fUseTrackingErrorsForAlignment(""),
229 fGAliceFileName(gAliceFilename),
234 fNumberOfEventsPerFile(1),
236 fLoadAlignFromCDB(kTRUE),
237 fLoadAlignData("ALL"),
245 fParentRawReader(NULL),
250 fDiamondProfileSPD(NULL),
251 fDiamondProfile(NULL),
252 fDiamondProfileTPC(NULL),
256 fAlignObjArray(NULL),
259 fInitCDBCalled(kFALSE),
260 fSetRunNumberFromDataCalled(kFALSE),
266 fSameQACycle(kFALSE),
268 fRunPlaneEff(kFALSE),
277 fIsNewRunLoader(kFALSE),
281 // create reconstruction object with default parameters
284 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
285 fReconstructor[iDet] = NULL;
286 fLoader[iDet] = NULL;
287 fTracker[iDet] = NULL;
289 for (Int_t iDet = 0; iDet < AliQA::kNDET; iDet++) {
290 fQACycles[iDet] = 999999 ;
291 fQAWriteExpert[iDet] = kFALSE ;
297 //_____________________________________________________________________________
298 AliReconstruction::AliReconstruction(const AliReconstruction& rec) :
300 fUniformField(rec.fUniformField),
301 fForcedFieldMap(NULL),
302 fRunVertexFinder(rec.fRunVertexFinder),
303 fRunVertexFinderTracks(rec.fRunVertexFinderTracks),
304 fRunHLTTracking(rec.fRunHLTTracking),
305 fRunMuonTracking(rec.fRunMuonTracking),
306 fRunV0Finder(rec.fRunV0Finder),
307 fRunCascadeFinder(rec.fRunCascadeFinder),
308 fStopOnError(rec.fStopOnError),
309 fWriteAlignmentData(rec.fWriteAlignmentData),
310 fWriteESDfriend(rec.fWriteESDfriend),
311 fFillTriggerESD(rec.fFillTriggerESD),
313 fCleanESD(rec.fCleanESD),
314 fV0DCAmax(rec.fV0DCAmax),
315 fV0CsPmin(rec.fV0CsPmin),
319 fRunLocalReconstruction(rec.fRunLocalReconstruction),
320 fRunTracking(rec.fRunTracking),
321 fFillESD(rec.fFillESD),
322 fLoadCDB(rec.fLoadCDB),
323 fUseTrackingErrorsForAlignment(rec.fUseTrackingErrorsForAlignment),
324 fGAliceFileName(rec.fGAliceFileName),
325 fRawInput(rec.fRawInput),
326 fEquipIdMap(rec.fEquipIdMap),
327 fFirstEvent(rec.fFirstEvent),
328 fLastEvent(rec.fLastEvent),
329 fNumberOfEventsPerFile(rec.fNumberOfEventsPerFile),
331 fLoadAlignFromCDB(rec.fLoadAlignFromCDB),
332 fLoadAlignData(rec.fLoadAlignData),
333 fESDPar(rec.fESDPar),
334 fUseHLTData(rec.fUseHLTData),
340 fParentRawReader(NULL),
342 fRecoParam(rec.fRecoParam),
345 fDiamondProfileSPD(rec.fDiamondProfileSPD),
346 fDiamondProfile(rec.fDiamondProfile),
347 fDiamondProfileTPC(rec.fDiamondProfileTPC),
351 fAlignObjArray(rec.fAlignObjArray),
352 fCDBUri(rec.fCDBUri),
354 fInitCDBCalled(rec.fInitCDBCalled),
355 fSetRunNumberFromDataCalled(rec.fSetRunNumberFromDataCalled),
356 fQADetectors(rec.fQADetectors),
358 fQATasks(rec.fQATasks),
360 fRunGlobalQA(rec.fRunGlobalQA),
361 fSameQACycle(rec.fSameQACycle),
362 fRunPlaneEff(rec.fRunPlaneEff),
371 fIsNewRunLoader(rec.fIsNewRunLoader),
377 for (Int_t i = 0; i < rec.fOptions.GetEntriesFast(); i++) {
378 if (rec.fOptions[i]) fOptions.Add(rec.fOptions[i]->Clone());
380 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
381 fReconstructor[iDet] = NULL;
382 fLoader[iDet] = NULL;
383 fTracker[iDet] = NULL;
386 for (Int_t iDet = 0; iDet < AliQA::kNDET; iDet++) {
387 fQACycles[iDet] = rec.fQACycles[iDet];
388 fQAWriteExpert[iDet] = rec.fQAWriteExpert[iDet] ;
391 for (Int_t i = 0; i < rec.fSpecCDBUri.GetEntriesFast(); i++) {
392 if (rec.fSpecCDBUri[i]) fSpecCDBUri.Add(rec.fSpecCDBUri[i]->Clone());
396 //_____________________________________________________________________________
397 AliReconstruction& AliReconstruction::operator = (const AliReconstruction& rec)
399 // assignment operator
400 // Used in PROOF mode
401 // Be very careful while modifing it!
402 // Simple rules to follow:
403 // for persistent data members - use their assignment operators
404 // for non-persistent ones - do nothing or take the default values from constructor
405 // TSelector members should not be touched
406 if(&rec == this) return *this;
408 fUniformField = rec.fUniformField;
409 fForcedFieldMap = NULL;
410 fRunVertexFinder = rec.fRunVertexFinder;
411 fRunVertexFinderTracks = rec.fRunVertexFinderTracks;
412 fRunHLTTracking = rec.fRunHLTTracking;
413 fRunMuonTracking = rec.fRunMuonTracking;
414 fRunV0Finder = rec.fRunV0Finder;
415 fRunCascadeFinder = rec.fRunCascadeFinder;
416 fStopOnError = rec.fStopOnError;
417 fWriteAlignmentData = rec.fWriteAlignmentData;
418 fWriteESDfriend = rec.fWriteESDfriend;
419 fFillTriggerESD = rec.fFillTriggerESD;
421 fCleanESD = rec.fCleanESD;
422 fV0DCAmax = rec.fV0DCAmax;
423 fV0CsPmin = rec.fV0CsPmin;
427 fRunLocalReconstruction = rec.fRunLocalReconstruction;
428 fRunTracking = rec.fRunTracking;
429 fFillESD = rec.fFillESD;
430 fLoadCDB = rec.fLoadCDB;
431 fUseTrackingErrorsForAlignment = rec.fUseTrackingErrorsForAlignment;
432 fGAliceFileName = rec.fGAliceFileName;
433 fRawInput = rec.fRawInput;
434 fEquipIdMap = rec.fEquipIdMap;
435 fFirstEvent = rec.fFirstEvent;
436 fLastEvent = rec.fLastEvent;
437 fNumberOfEventsPerFile = rec.fNumberOfEventsPerFile;
439 for (Int_t i = 0; i < rec.fOptions.GetEntriesFast(); i++) {
440 if (rec.fOptions[i]) fOptions.Add(rec.fOptions[i]->Clone());
443 fLoadAlignFromCDB = rec.fLoadAlignFromCDB;
444 fLoadAlignData = rec.fLoadAlignData;
445 fESDPar = rec.fESDPar;
446 fUseHLTData = rec.fUseHLTData;
448 delete fRunInfo; fRunInfo = NULL;
449 if (rec.fRunInfo) fRunInfo = new AliRunInfo(*rec.fRunInfo);
451 fEventInfo = rec.fEventInfo;
455 fParentRawReader = NULL;
457 fRecoParam = rec.fRecoParam;
459 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
460 delete fReconstructor[iDet]; fReconstructor[iDet] = NULL;
461 delete fLoader[iDet]; fLoader[iDet] = NULL;
462 delete fTracker[iDet]; fTracker[iDet] = NULL;
465 for (Int_t iDet = 0; iDet < AliQA::kNDET; iDet++) {
466 fQACycles[iDet] = rec.fQACycles[iDet];
467 fQAWriteExpert[iDet] = rec.fQAWriteExpert[iDet] ;
471 delete fDiamondProfileSPD; fDiamondProfileSPD = NULL;
472 if (rec.fDiamondProfileSPD) fDiamondProfileSPD = new AliESDVertex(*rec.fDiamondProfileSPD);
473 delete fDiamondProfile; fDiamondProfile = NULL;
474 if (rec.fDiamondProfile) fDiamondProfile = new AliESDVertex(*rec.fDiamondProfile);
475 delete fDiamondProfileTPC; fDiamondProfileTPC = NULL;
476 if (rec.fDiamondProfileTPC) fDiamondProfileTPC = new AliESDVertex(*rec.fDiamondProfileTPC);
478 delete fGRPData; fGRPData = NULL;
479 // if (rec.fGRPData) fGRPData = (TMap*)((rec.fGRPData)->Clone());
480 if (rec.fGRPData) fGRPData = (AliGRPObject*)((rec.fGRPData)->Clone());
482 delete fAlignObjArray; fAlignObjArray = NULL;
485 fSpecCDBUri.Delete();
486 fInitCDBCalled = rec.fInitCDBCalled;
487 fSetRunNumberFromDataCalled = rec.fSetRunNumberFromDataCalled;
488 fQADetectors = rec.fQADetectors;
490 fQATasks = rec.fQATasks;
492 fRunGlobalQA = rec.fRunGlobalQA;
493 fSameQACycle = rec.fSameQACycle;
494 fRunPlaneEff = rec.fRunPlaneEff;
503 fIsNewRunLoader = rec.fIsNewRunLoader;
510 //_____________________________________________________________________________
511 AliReconstruction::~AliReconstruction()
517 delete fForcedFieldMap;
519 if (fAlignObjArray) {
520 fAlignObjArray->Delete();
521 delete fAlignObjArray;
523 fSpecCDBUri.Delete();
525 AliCodeTimer::Instance()->Print();
528 //_____________________________________________________________________________
529 void AliReconstruction::InitCDB()
531 // activate a default CDB storage
532 // First check if we have any CDB storage set, because it is used
533 // to retrieve the calibration and alignment constants
534 AliCodeTimerAuto("");
536 if (fInitCDBCalled) return;
537 fInitCDBCalled = kTRUE;
539 AliCDBManager* man = AliCDBManager::Instance();
540 if (man->IsDefaultStorageSet())
542 AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
543 AliWarning("Default CDB storage has been already set !");
544 AliWarning(Form("Ignoring the default storage declared in AliReconstruction: %s",fCDBUri.Data()));
545 AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
546 fCDBUri = man->GetDefaultStorage()->GetURI();
549 if (fCDBUri.Length() > 0)
551 AliDebug(2,"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
552 AliDebug(2, Form("Default CDB storage is set to: %s", fCDBUri.Data()));
553 AliDebug(2, "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
555 fCDBUri="local://$ALICE_ROOT";
556 AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
557 AliWarning("Default CDB storage not yet set !!!!");
558 AliWarning(Form("Setting it now to: %s", fCDBUri.Data()));
559 AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
562 man->SetDefaultStorage(fCDBUri);
565 // Now activate the detector specific CDB storage locations
566 for (Int_t i = 0; i < fSpecCDBUri.GetEntriesFast(); i++) {
567 TObject* obj = fSpecCDBUri[i];
569 AliDebug(2, "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
570 AliDebug(2, Form("Specific CDB storage for %s is set to: %s",obj->GetName(),obj->GetTitle()));
571 AliDebug(2, "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
572 man->SetSpecificStorage(obj->GetName(), obj->GetTitle());
574 AliSysInfo::AddStamp("InitCDB");
577 //_____________________________________________________________________________
578 void AliReconstruction::SetDefaultStorage(const char* uri) {
579 // Store the desired default CDB storage location
580 // Activate it later within the Run() method
586 //_____________________________________________________________________________
587 void AliReconstruction::SetSpecificStorage(const char* calibType, const char* uri) {
588 // Store a detector-specific CDB storage location
589 // Activate it later within the Run() method
591 AliCDBPath aPath(calibType);
592 if(!aPath.IsValid()){
593 // if calibType is not wildcard but it is a valid detector, add "/*" to make it a valid path
594 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
595 if(!strcmp(calibType, fgkDetectorName[iDet])) {
596 aPath.SetPath(Form("%s/*", calibType));
597 AliInfo(Form("Path for specific storage set to %s", aPath.GetPath().Data()));
601 if(!aPath.IsValid()){
602 AliError(Form("Not a valid path or detector: %s", calibType));
607 // // check that calibType refers to a "valid" detector name
608 // Bool_t isDetector = kFALSE;
609 // for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
610 // TString detName = fgkDetectorName[iDet];
611 // if(aPath.GetLevel0() == detName) {
612 // isDetector = kTRUE;
618 // AliError(Form("Not a valid detector: %s", aPath.GetLevel0().Data()));
622 TObject* obj = fSpecCDBUri.FindObject(aPath.GetPath().Data());
623 if (obj) fSpecCDBUri.Remove(obj);
624 fSpecCDBUri.Add(new TNamed(aPath.GetPath().Data(), uri));
628 //_____________________________________________________________________________
629 Bool_t AliReconstruction::SetRunNumberFromData()
631 // The method is called in Run() in order
632 // to set a correct run number.
633 // In case of raw data reconstruction the
634 // run number is taken from the raw data header
636 if (fSetRunNumberFromDataCalled) return kTRUE;
637 fSetRunNumberFromDataCalled = kTRUE;
639 AliCDBManager* man = AliCDBManager::Instance();
642 if(fRawReader->NextEvent()) {
643 if(man->GetRun() > 0) {
644 AliWarning("Run number is taken from raw-event header! Ignoring settings in AliCDBManager!");
646 man->SetRun(fRawReader->GetRunNumber());
647 fRawReader->RewindEvents();
650 if(man->GetRun() > 0) {
651 AliWarning("No raw-data events are found ! Using settings in AliCDBManager !");
654 AliWarning("Neither raw events nor settings in AliCDBManager are found !");
660 AliRunLoader *rl = AliRunLoader::Open(fGAliceFileName.Data());
662 AliError(Form("No run loader found in file %s", fGAliceFileName.Data()));
667 // read run number from gAlice
668 if(rl->GetHeader()) {
669 man->SetRun(rl->GetHeader()->GetRun());
674 AliError("Neither run-loader header nor RawReader objects are found !");
686 //_____________________________________________________________________________
687 void AliReconstruction::SetCDBLock() {
688 // Set CDB lock: from now on it is forbidden to reset the run number
689 // or the default storage or to activate any further storage!
691 AliCDBManager::Instance()->SetLock(1);
694 //_____________________________________________________________________________
695 Bool_t AliReconstruction::MisalignGeometry(const TString& detectors)
697 // Read the alignment objects from CDB.
698 // Each detector is supposed to have the
699 // alignment objects in DET/Align/Data CDB path.
700 // All the detector objects are then collected,
701 // sorted by geometry level (starting from ALIC) and
702 // then applied to the TGeo geometry.
703 // Finally an overlaps check is performed.
705 // Load alignment data from CDB and fill fAlignObjArray
706 if(fLoadAlignFromCDB){
708 TString detStr = detectors;
709 TString loadAlObjsListOfDets = "";
711 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
712 if(!IsSelected(fgkDetectorName[iDet], detStr)) continue;
713 if(!strcmp(fgkDetectorName[iDet],"HLT")) continue;
715 if(AliGeomManager::GetNalignable(fgkDetectorName[iDet]) != 0)
717 loadAlObjsListOfDets += fgkDetectorName[iDet];
718 loadAlObjsListOfDets += " ";
720 } // end loop over detectors
722 if(AliGeomManager::GetNalignable("GRP") != 0)
723 loadAlObjsListOfDets.Prepend("GRP "); //add alignment objects for non-sensitive modules
724 AliGeomManager::ApplyAlignObjsFromCDB(loadAlObjsListOfDets.Data());
725 AliCDBManager::Instance()->UnloadFromCache("*/Align/*");
727 // Check if the array with alignment objects was
728 // provided by the user. If yes, apply the objects
729 // to the present TGeo geometry
730 if (fAlignObjArray) {
731 if (gGeoManager && gGeoManager->IsClosed()) {
732 if (AliGeomManager::ApplyAlignObjsToGeom(*fAlignObjArray) == kFALSE) {
733 AliError("The misalignment of one or more volumes failed!"
734 "Compare the list of simulated detectors and the list of detector alignment data!");
739 AliError("Can't apply the misalignment! gGeoManager doesn't exist or it is still opened!");
745 if (fAlignObjArray) {
746 fAlignObjArray->Delete();
747 delete fAlignObjArray; fAlignObjArray=NULL;
753 //_____________________________________________________________________________
754 void AliReconstruction::SetGAliceFile(const char* fileName)
756 // set the name of the galice file
758 fGAliceFileName = fileName;
761 //_____________________________________________________________________________
762 void AliReconstruction::SetInput(const char* input)
764 // In case the input string starts with 'mem://', we run in an online mode
765 // and AliRawReaderDateOnline object is created. In all other cases a raw-data
766 // file is assumed. One can give as an input:
767 // mem://: - events taken from DAQ monitoring libs online
769 // mem://<filename> - emulation of the above mode (via DATE monitoring libs)
770 if (input) fRawInput = input;
773 //_____________________________________________________________________________
774 void AliReconstruction::SetOption(const char* detector, const char* option)
776 // set options for the reconstruction of a detector
778 TObject* obj = fOptions.FindObject(detector);
779 if (obj) fOptions.Remove(obj);
780 fOptions.Add(new TNamed(detector, option));
783 //_____________________________________________________________________________
784 void AliReconstruction::SetRecoParam(const char* detector, AliDetectorRecoParam *par)
786 // Set custom reconstruction parameters for a given detector
787 // Single set of parameters for all the events
789 // First check if the reco-params are global
790 if(!strcmp(detector, "GRP")) {
792 fRecoParam.AddDetRecoParam(fgkNDetectors,par);
796 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
797 if(!strcmp(detector, fgkDetectorName[iDet])) {
799 fRecoParam.AddDetRecoParam(iDet,par);
806 //_____________________________________________________________________________
807 Bool_t AliReconstruction::SetFieldMap(Float_t l3Current, Float_t diCurrent, Float_t factor, const char *path) {
808 //------------------------------------------------
809 // The magnetic field map, defined externally...
810 // L3 current 30000 A -> 0.5 T
811 // L3 current 12000 A -> 0.2 T
812 // dipole current 6000 A
813 // The polarities must be the same
814 //------------------------------------------------
815 const Float_t l3NominalCurrent1=30000.; // (A)
816 const Float_t l3NominalCurrent2=12000.; // (A)
817 const Float_t diNominalCurrent =6000. ; // (A)
819 const Float_t tolerance=0.03; // relative current tolerance
820 const Float_t zero=77.; // "zero" current (A)
823 Bool_t dipoleON=kFALSE;
825 TString s=(factor < 0) ? "L3: -" : "L3: +";
827 l3Current = TMath::Abs(l3Current);
828 if (TMath::Abs(l3Current-l3NominalCurrent1)/l3NominalCurrent1 < tolerance) {
829 map=AliMagWrapCheb::k5kG;
832 if (TMath::Abs(l3Current-l3NominalCurrent2)/l3NominalCurrent2 < tolerance) {
833 map=AliMagWrapCheb::k2kG;
836 if (l3Current < zero) {
837 map=AliMagWrapCheb::k2kG;
839 factor=0.; // in fact, this is a global factor...
840 fUniformField=kTRUE; // track with the uniform (zero) B field
842 AliError(Form("Wrong L3 current (%f A)!",l3Current));
846 diCurrent = TMath::Abs(diCurrent);
847 if (TMath::Abs(diCurrent-diNominalCurrent)/diNominalCurrent < tolerance) {
848 // 3% current tolerance...
852 if (diCurrent < zero) { // some small current..
856 AliError(Form("Wrong dipole current (%f A)!",diCurrent));
860 delete fForcedFieldMap;
862 new AliMagWrapCheb("B field map ",s,2,factor,10.,map,dipoleON,path);
864 fForcedFieldMap->Print();
866 AliTracker::SetFieldMap(fForcedFieldMap,fUniformField);
872 Bool_t AliReconstruction::InitGRP() {
873 //------------------------------------
874 // Initialization of the GRP entry
875 //------------------------------------
876 AliCDBEntry* entry = AliCDBManager::Instance()->Get("GRP/GRP/Data");
880 TMap* m = dynamic_cast<TMap*>(entry->GetObject()); // old GRP entry
883 AliInfo("Found a TMap in GRP/GRP/Data, converting it into an AliGRPObject");
885 fGRPData = new AliGRPObject();
886 fGRPData->ReadValuesFromMap(m);
890 AliInfo("Found an AliGRPObject in GRP/GRP/Data, reading it");
891 fGRPData = dynamic_cast<AliGRPObject*>(entry->GetObject()); // new GRP entry
895 AliCDBManager::Instance()->UnloadFromCache("GRP/GRP/Data");
899 AliError("No GRP entry found in OCDB!");
903 TString lhcState = fGRPData->GetLHCState();
904 if (lhcState==AliGRPObject::GetInvalidString()) {
905 AliError("GRP/GRP/Data entry: missing value for the LHC state ! Using UNKNOWN");
906 lhcState = "UNKNOWN";
909 TString beamType = fGRPData->GetBeamType();
910 if (beamType==AliGRPObject::GetInvalidString()) {
911 AliError("GRP/GRP/Data entry: missing value for the beam type ! Using UNKNOWN");
912 beamType = "UNKNOWN";
915 Float_t beamEnergy = fGRPData->GetBeamEnergy();
916 if (beamEnergy==AliGRPObject::GetInvalidFloat()) {
917 AliError("GRP/GRP/Data entry: missing value for the beam energy ! Using 0");
921 TString runType = fGRPData->GetRunType();
922 if (runType==AliGRPObject::GetInvalidString()) {
923 AliError("GRP/GRP/Data entry: missing value for the run type ! Using UNKNOWN");
927 Int_t activeDetectors = fGRPData->GetDetectorMask();
928 if (activeDetectors==AliGRPObject::GetInvalidUInt()) {
929 AliError("GRP/GRP/Data entry: missing value for the detector mask ! Using 1074790399");
930 activeDetectors = 1074790399;
933 fRunInfo = new AliRunInfo(lhcState, beamType, beamEnergy, runType, activeDetectors);
938 // Process the list of active detectors
939 if (activeDetectors) {
940 UInt_t detMask = activeDetectors;
941 fLoadCDB.Form("%s %s %s %s",
942 fRunLocalReconstruction.Data(),
945 fQADetectors.Data());
946 fRunLocalReconstruction = MatchDetectorList(fRunLocalReconstruction,detMask);
947 fRunTracking = MatchDetectorList(fRunTracking,detMask);
948 fFillESD = MatchDetectorList(fFillESD,detMask);
949 fQADetectors = MatchDetectorList(fQADetectors,detMask);
950 fLoadCDB = MatchDetectorList(fLoadCDB,detMask);
951 if (!((detMask >> AliDAQ::DetectorID("ITSSPD")) & 0x1)) {
952 // switch off the vertexer
953 AliInfo("SPD is not in the list of active detectors. Vertexer switched off.");
954 fRunVertexFinder = kFALSE;
956 if (!((detMask >> AliDAQ::DetectorID("TRG")) & 0x1)) {
957 // switch off the reading of CTP raw-data payload
958 if (fFillTriggerESD) {
959 AliInfo("CTP is not in the list of active detectors. CTP data reading switched off.");
960 fFillTriggerESD = kFALSE;
965 AliInfo("===================================================================================");
966 AliInfo(Form("Running local reconstruction for detectors: %s",fRunLocalReconstruction.Data()));
967 AliInfo(Form("Running tracking for detectors: %s",fRunTracking.Data()));
968 AliInfo(Form("Filling ESD for detectors: %s",fFillESD.Data()));
969 AliInfo(Form("Quality assurance is active for detectors: %s",fQADetectors.Data()));
970 AliInfo(Form("CDB and reconstruction parameters are loaded for detectors: %s",fLoadCDB.Data()));
971 AliInfo("===================================================================================");
973 //*** Dealing with the magnetic field map
974 if (AliTracker::GetFieldMap()) {
975 AliInfo("Running with the externally set B field !");
977 // Construct the field map out of the information retrieved from GRP.
982 Float_t l3Current = fGRPData->GetL3Current((AliGRPObject::Stats)0);
983 if (l3Current == AliGRPObject::GetInvalidFloat()) {
984 AliError("GRP/GRP/Data entry: missing value for the L3 current !");
988 Char_t l3Polarity = fGRPData->GetL3Polarity();
989 if (l3Polarity == AliGRPObject::GetInvalidChar()) {
990 AliError("GRP/GRP/Data entry: missing value for the L3 polarity !");
995 Float_t diCurrent = fGRPData->GetDipoleCurrent((AliGRPObject::Stats)0);
996 if (diCurrent == AliGRPObject::GetInvalidFloat()) {
997 AliError("GRP/GRP/Data entry: missing value for the dipole current !");
1001 Char_t diPolarity = fGRPData->GetDipolePolarity();
1002 if (diPolarity == AliGRPObject::GetInvalidChar()) {
1003 AliError("GRP/GRP/Data entry: missing value for the dipole polarity !");
1008 TObjString *l3Current=
1009 dynamic_cast<TObjString*>(fGRPData->GetValue("fL3Current"));
1011 AliError("GRP/GRP/Data entry: missing value for the L3 current !");
1014 TObjString *l3Polarity=
1015 dynamic_cast<TObjString*>(fGRPData->GetValue("fL3Polarity"));
1017 AliError("GRP/GRP/Data entry: missing value for the L3 polarity !");
1022 TObjString *diCurrent=
1023 dynamic_cast<TObjString*>(fGRPData->GetValue("fDipoleCurrent"));
1025 AliError("GRP/GRP/Data entry: missing value for the dipole current !");
1028 TObjString *diPolarity=
1029 dynamic_cast<TObjString*>(fGRPData->GetValue("fDipolePolarity"));
1031 AliError("GRP/GRP/Data entry: missing value for the dipole polarity !");
1037 Float_t l3Cur=TMath::Abs(l3Current);
1038 Float_t diCur=TMath::Abs(diCurrent);
1039 Float_t l3Pol=l3Polarity;
1040 // Float_t l3Cur=TMath::Abs(atof(l3Current->GetName()));
1041 //Float_t diCur=TMath::Abs(atof(diCurrent->GetName()));
1042 //Float_t l3Pol=atof(l3Polarity->GetName());
1044 if (l3Pol != 0.) factor=-1.;
1047 if (!SetFieldMap(l3Cur, diCur, factor)) {
1048 AliFatal("Failed to creat a B field map ! Exiting...");
1050 AliInfo("Running with the B field constructed out of GRP !");
1053 AliFatal("B field is neither set nor constructed from GRP ! Exitig...");
1058 //*** Get the diamond profiles from OCDB
1059 entry = AliCDBManager::Instance()->Get("GRP/Calib/MeanVertexSPD");
1061 fDiamondProfileSPD = dynamic_cast<AliESDVertex*> (entry->GetObject());
1063 AliError("No SPD diamond profile found in OCDB!");
1066 entry = AliCDBManager::Instance()->Get("GRP/Calib/MeanVertex");
1068 fDiamondProfile = dynamic_cast<AliESDVertex*> (entry->GetObject());
1070 AliError("No diamond profile found in OCDB!");
1073 entry = AliCDBManager::Instance()->Get("GRP/Calib/MeanVertexTPC");
1075 fDiamondProfileTPC = dynamic_cast<AliESDVertex*> (entry->GetObject());
1077 AliError("No TPC diamond profile found in OCDB!");
1083 //_____________________________________________________________________________
1084 Bool_t AliReconstruction::LoadCDB()
1086 AliCodeTimerAuto("");
1088 AliCDBManager::Instance()->Get("GRP/CTP/Config");
1090 TString detStr = fLoadCDB;
1091 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
1092 if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
1093 AliCDBManager::Instance()->GetAll(Form("%s/Calib/*",fgkDetectorName[iDet]));
1098 //_____________________________________________________________________________
1099 Bool_t AliReconstruction::Run(const char* input)
1102 AliCodeTimerAuto("");
1105 if (GetAbort() != TSelector::kContinue) return kFALSE;
1107 TChain *chain = NULL;
1108 if (fRawReader && (chain = fRawReader->GetChain())) {
1111 gProof->AddInput(this);
1113 outputFile.SetProtocol("root",kTRUE);
1114 outputFile.SetHost(gSystem->HostName());
1115 outputFile.SetFile(Form("%s/AliESDs.root",gSystem->pwd()));
1116 AliInfo(Form("Output file with ESDs is %s",outputFile.GetUrl()));
1117 gProof->AddInput(new TNamed("PROOF_OUTPUTFILE",outputFile.GetUrl()));
1119 chain->Process("AliReconstruction");
1122 chain->Process(this);
1127 if (GetAbort() != TSelector::kContinue) return kFALSE;
1129 if (GetAbort() != TSelector::kContinue) return kFALSE;
1130 //******* The loop over events
1131 AliInfo("Starting looping over events");
1133 while ((iEvent < fRunLoader->GetNumberOfEvents()) ||
1134 (fRawReader && fRawReader->NextEvent())) {
1135 if (!ProcessEvent(iEvent)) {
1136 Abort("ProcessEvent",TSelector::kAbortFile);
1142 if (GetAbort() != TSelector::kContinue) return kFALSE;
1144 if (GetAbort() != TSelector::kContinue) return kFALSE;
1150 //_____________________________________________________________________________
1151 void AliReconstruction::InitRawReader(const char* input)
1153 AliCodeTimerAuto("");
1155 // Init raw-reader and
1156 // set the input in case of raw data
1157 if (input) fRawInput = input;
1158 fRawReader = AliRawReader::Create(fRawInput.Data());
1160 AliInfo("Reconstruction will run over digits");
1162 if (!fEquipIdMap.IsNull() && fRawReader)
1163 fRawReader->LoadEquipmentIdsMap(fEquipIdMap);
1165 if (!fUseHLTData.IsNull()) {
1166 // create the RawReaderHLT which performs redirection of HLT input data for
1167 // the specified detectors
1168 AliRawReader* pRawReader=AliRawHLTManager::CreateRawReaderHLT(fRawReader, fUseHLTData.Data());
1170 fParentRawReader=fRawReader;
1171 fRawReader=pRawReader;
1173 AliError(Form("can not create Raw Reader for HLT input %s", fUseHLTData.Data()));
1176 AliSysInfo::AddStamp("CreateRawReader");
1179 //_____________________________________________________________________________
1180 void AliReconstruction::InitRun(const char* input)
1182 // Initialization of raw-reader,
1183 // run number, CDB etc.
1184 AliCodeTimerAuto("");
1185 AliSysInfo::AddStamp("Start");
1187 // Initialize raw-reader if any
1188 InitRawReader(input);
1190 // Initialize the CDB storage
1193 // Set run number in CDBManager (if it is not already set by the user)
1194 if (!SetRunNumberFromData()) {
1195 Abort("SetRunNumberFromData", TSelector::kAbortProcess);
1199 // Set CDB lock: from now on it is forbidden to reset the run number
1200 // or the default storage or to activate any further storage!
1205 //_____________________________________________________________________________
1206 void AliReconstruction::Begin(TTree *)
1208 // Initialize AlReconstruction before
1209 // going into the event loop
1210 // Should follow the TSelector convention
1211 // i.e. initialize only the object on the client side
1212 AliCodeTimerAuto("");
1214 AliReconstruction *reco = NULL;
1216 if ((reco = (AliReconstruction*)fInput->FindObject("AliReconstruction"))) {
1219 AliSysInfo::AddStamp("ReadInputInBegin");
1222 // Import ideal TGeo geometry and apply misalignment
1224 TString geom(gSystem->DirName(fGAliceFileName));
1225 geom += "/geometry.root";
1226 AliGeomManager::LoadGeometry(geom.Data());
1228 Abort("LoadGeometry", TSelector::kAbortProcess);
1231 AliSysInfo::AddStamp("LoadGeom");
1232 TString detsToCheck=fRunLocalReconstruction;
1233 if(!AliGeomManager::CheckSymNamesLUT(detsToCheck.Data())) {
1234 Abort("CheckSymNamesLUT", TSelector::kAbortProcess);
1237 AliSysInfo::AddStamp("CheckGeom");
1240 if (!MisalignGeometry(fLoadAlignData)) {
1241 Abort("MisalignGeometry", TSelector::kAbortProcess);
1244 AliCDBManager::Instance()->UnloadFromCache("GRP/Geometry/Data");
1245 AliSysInfo::AddStamp("MisalignGeom");
1248 Abort("InitGRP", TSelector::kAbortProcess);
1251 AliSysInfo::AddStamp("InitGRP");
1254 Abort("LoadCDB", TSelector::kAbortProcess);
1257 AliSysInfo::AddStamp("LoadCDB");
1259 // Read the reconstruction parameters from OCDB
1260 if (!InitRecoParams()) {
1261 AliWarning("Not all detectors have correct RecoParam objects initialized");
1263 AliSysInfo::AddStamp("InitRecoParams");
1266 if (reco) *reco = *this;
1267 fInput->Add(gGeoManager);
1269 fInput->Add(const_cast<TMap*>(AliCDBManager::Instance()->GetEntryCache()));
1270 fInput->Add(new TParameter<Int_t>("RunNumber",AliCDBManager::Instance()->GetRun()));
1271 AliMagF *magFieldMap = (AliMagF*)AliTracker::GetFieldMap();
1272 magFieldMap->SetName("MagneticFieldMap");
1273 fInput->Add(magFieldMap);
1278 //_____________________________________________________________________________
1279 void AliReconstruction::SlaveBegin(TTree*)
1281 // Initialization related to run-loader,
1282 // vertexer, trackers, recontructors
1283 // In proof mode it is executed on the slave
1284 AliCodeTimerAuto("");
1286 TProofOutputFile *outProofFile = NULL;
1288 if (AliReconstruction *reco = (AliReconstruction*)fInput->FindObject("AliReconstruction")) {
1291 if (TGeoManager *tgeo = (TGeoManager*)fInput->FindObject("Geometry")) {
1293 AliGeomManager::SetGeometry(tgeo);
1295 if (TMap *entryCache = (TMap*)fInput->FindObject("CDBEntryCache")) {
1296 Int_t runNumber = -1;
1297 if (TProof::GetParameter(fInput,"RunNumber",runNumber) == 0) {
1298 AliCDBManager *man = AliCDBManager::Instance(entryCache,runNumber);
1299 man->SetCacheFlag(kTRUE);
1300 man->SetLock(kTRUE);
1304 if (AliMagF *map = (AliMagF*)fInput->FindObject("MagneticFieldMap")) {
1305 AliTracker::SetFieldMap(map,fUniformField);
1307 if (TNamed *outputFileName = (TNamed *) fInput->FindObject("PROOF_OUTPUTFILE")) {
1308 outProofFile = new TProofOutputFile(gSystem->BaseName(TUrl(outputFileName->GetTitle()).GetFile()));
1309 outProofFile->SetOutputFileName(outputFileName->GetTitle());
1310 fOutput->Add(outProofFile);
1312 AliSysInfo::AddStamp("ReadInputInSlaveBegin");
1315 // get the run loader
1316 if (!InitRunLoader()) {
1317 Abort("InitRunLoader", TSelector::kAbortProcess);
1320 AliSysInfo::AddStamp("LoadLoader");
1322 ftVertexer = new AliVertexerTracks(AliTracker::GetBz());
1325 if (fRunVertexFinder && !CreateVertexer()) {
1326 Abort("CreateVertexer", TSelector::kAbortProcess);
1329 AliSysInfo::AddStamp("CreateVertexer");
1332 if (!fRunTracking.IsNull() && !CreateTrackers(fRunTracking)) {
1333 Abort("CreateTrackers", TSelector::kAbortProcess);
1336 AliSysInfo::AddStamp("CreateTrackers");
1338 // create the ESD output file and tree
1339 if (!outProofFile) {
1340 ffile = TFile::Open("AliESDs.root", "RECREATE");
1341 ffile->SetCompressionLevel(2);
1342 if (!ffile->IsOpen()) {
1343 Abort("OpenESDFile", TSelector::kAbortProcess);
1348 if (!(ffile = outProofFile->OpenFile("RECREATE"))) {
1349 Abort(Form("Problems opening output PROOF file: %s/%s",
1350 outProofFile->GetDir(), outProofFile->GetFileName()),
1351 TSelector::kAbortProcess);
1356 ftree = new TTree("esdTree", "Tree with ESD objects");
1357 fesd = new AliESDEvent();
1358 fesd->CreateStdContent();
1359 if (fWriteESDfriend) {
1360 fesdf = new AliESDfriend();
1361 TBranch *br=ftree->Branch("ESDfriend.","AliESDfriend", &fesdf);
1362 br->SetFile("AliESDfriends.root");
1363 fesd->AddObject(fesdf);
1365 fesd->WriteToTree(ftree);
1366 ftree->GetUserInfo()->Add(fesd);
1368 fhlttree = new TTree("HLTesdTree", "Tree with HLT ESD objects");
1369 fhltesd = new AliESDEvent();
1370 fhltesd->CreateStdContent();
1372 // read the ESD template from CDB
1373 // HLT is allowed to put non-std content to its ESD, the non-std
1374 // objects need to be created before invocation of WriteToTree in
1375 // order to create all branches. Initialization is done from an
1376 // ESD layout template in CDB
1377 AliCDBManager* man = AliCDBManager::Instance();
1378 AliCDBPath hltESDConfigPath("HLT/ConfigHLT/esdLayout");
1379 AliCDBEntry* hltESDConfig=NULL;
1380 if (man->GetId(hltESDConfigPath)!=NULL &&
1381 (hltESDConfig=man->Get(hltESDConfigPath))!=NULL) {
1382 AliESDEvent* pESDLayout=dynamic_cast<AliESDEvent*>(hltESDConfig->GetObject());
1384 // init all internal variables from the list of objects
1385 pESDLayout->GetStdContent();
1387 // copy content and create non-std objects
1388 *fhltesd=*pESDLayout;
1391 AliError(Form("error setting hltEsd layout from %s: invalid object type",
1392 hltESDConfigPath.GetPath().Data()));
1396 fhltesd->WriteToTree(fhlttree);
1397 fhlttree->GetUserInfo()->Add(fhltesd);
1399 ProcInfo_t ProcInfo;
1400 gSystem->GetProcInfo(&ProcInfo);
1401 AliInfo(Form("Current memory usage %d %d", ProcInfo.fMemResident, ProcInfo.fMemVirtual));
1404 //Initialize the QA and start of cycle
1406 fQASteer = new AliQADataMakerSteer("rec") ;
1407 fQASteer->SetActiveDetectors(fQADetectors) ;
1408 for (Int_t det = 0 ; det < AliQA::kNDET ; det++) {
1409 fQASteer->SetCycleLength(AliQA::DETECTORINDEX_t(det), fQACycles[det]) ;
1410 if (fQAWriteExpert[det])
1411 fQASteer->SetWriteExpert(AliQA::DETECTORINDEX_t(det)) ;
1414 if (!fRawReader && fQATasks.Contains(AliQA::kRAWS))
1415 fQATasks.ReplaceAll(Form("%d",AliQA::kRAWS), "") ;
1416 fQASteer->SetTasks(fQATasks) ;
1417 fQASteer->InitQADataMaker(AliCDBManager::Instance()->GetRun(), fRecoParam) ;
1421 Bool_t sameCycle = kFALSE ;
1422 if (!fQASteer) fQASteer = new AliQADataMakerSteer("rec") ;
1423 AliQADataMaker *qadm = fQASteer->GetQADataMaker(AliQA::kGLOBAL);
1424 AliInfo(Form("Initializing the global QA data maker"));
1425 if (fQATasks.Contains(Form("%d", AliQA::kRECPOINTS))) {
1426 qadm->StartOfCycle(AliQA::kRECPOINTS, AliCDBManager::Instance()->GetRun(), sameCycle) ;
1427 TObjArray *arr=qadm->Init(AliQA::kRECPOINTS);
1428 AliTracker::SetResidualsArray(arr);
1431 if (fQATasks.Contains(Form("%d", AliQA::kESDS))) {
1432 qadm->StartOfCycle(AliQA::kESDS, AliCDBManager::Instance()->GetRun(), sameCycle) ;
1433 qadm->Init(AliQA::kESDS);
1437 //Initialize the Plane Efficiency framework
1438 if (fRunPlaneEff && !InitPlaneEff()) {
1439 Abort("InitPlaneEff", TSelector::kAbortProcess);
1443 if (strcmp(gProgName,"alieve") == 0)
1444 fRunAliEVE = InitAliEVE();
1449 //_____________________________________________________________________________
1450 Bool_t AliReconstruction::Process(Long64_t entry)
1452 // run the reconstruction over a single entry
1453 // from the chain with raw data
1454 AliCodeTimerAuto("");
1456 TTree *currTree = fChain->GetTree();
1457 AliRawEvent *event = new AliRawEvent;
1458 currTree->SetBranchAddress("rawevent",&event);
1459 currTree->GetEntry(entry);
1460 fRawReader = new AliRawReaderRoot(event);
1461 fStatus = ProcessEvent(fRunLoader->GetNumberOfEvents());
1469 //_____________________________________________________________________________
1470 void AliReconstruction::Init(TTree *tree)
1473 AliError("The input tree is not found!");
1479 //_____________________________________________________________________________
1480 Bool_t AliReconstruction::ProcessEvent(Int_t iEvent)
1482 // run the reconstruction over a single event
1483 // The event loop is steered in Run method
1485 AliCodeTimerAuto("");
1487 if (iEvent >= fRunLoader->GetNumberOfEvents()) {
1488 fRunLoader->SetEventNumber(iEvent);
1489 fRunLoader->GetHeader()->Reset(fRawReader->GetRunNumber(),
1491 fRunLoader->TreeE()->Fill();
1492 if (fRawReader && fRawReader->UseAutoSaveESD())
1493 fRunLoader->TreeE()->AutoSave("SaveSelf");
1496 if ((iEvent < fFirstEvent) || ((fLastEvent >= 0) && (iEvent > fLastEvent))) {
1500 AliInfo(Form("processing event %d", iEvent));
1502 // Fill Event-info object
1504 fRecoParam.SetEventSpecie(fRunInfo,fEventInfo);
1506 // Set the reco-params
1508 TString detStr = fLoadCDB;
1509 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
1510 if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
1511 AliReconstructor *reconstructor = GetReconstructor(iDet);
1512 if (reconstructor && fRecoParam.GetDetRecoParamArray(iDet)) {
1513 const AliDetectorRecoParam *par = fRecoParam.GetDetRecoParam(iDet);
1514 reconstructor->SetRecoParam(par);
1519 fRunLoader->GetEvent(iEvent);
1523 fQASteer->RunOneEvent(fRawReader) ;
1525 // local single event reconstruction
1526 if (!fRunLocalReconstruction.IsNull()) {
1527 TString detectors=fRunLocalReconstruction;
1528 // run HLT event reconstruction first
1529 // ;-( IsSelected changes the string
1530 if (IsSelected("HLT", detectors) &&
1531 !RunLocalEventReconstruction("HLT")) {
1532 if (fStopOnError) {CleanUp(); return kFALSE;}
1534 detectors=fRunLocalReconstruction;
1535 detectors.ReplaceAll("HLT", "");
1536 if (!RunLocalEventReconstruction(detectors)) {
1537 if (fStopOnError) {CleanUp(); return kFALSE;}
1541 fesd->SetRunNumber(fRunLoader->GetHeader()->GetRun());
1542 fhltesd->SetRunNumber(fRunLoader->GetHeader()->GetRun());
1543 fesd->SetEventNumberInFile(fRunLoader->GetHeader()->GetEventNrInRun());
1544 fhltesd->SetEventNumberInFile(fRunLoader->GetHeader()->GetEventNrInRun());
1546 // Set magnetic field from the tracker
1547 fesd->SetMagneticField(AliTracker::GetBz());
1548 fhltesd->SetMagneticField(AliTracker::GetBz());
1550 // Set most probable pt, for B=0 tracking
1551 // Get the global reco-params. They are atposition 16 inside the array of detectors in fRecoParam
1552 const AliGRPRecoParam *grpRecoParam = dynamic_cast<const AliGRPRecoParam*>(fRecoParam.GetDetRecoParam(fgkNDetectors));
1553 if (grpRecoParam) AliExternalTrackParam::SetMostProbablePt(grpRecoParam->GetMostProbablePt());
1555 // Fill raw-data error log into the ESD
1556 if (fRawReader) FillRawDataErrorLog(iEvent,fesd);
1559 if (fRunVertexFinder) {
1560 if (!RunVertexFinder(fesd)) {
1561 if (fStopOnError) {CleanUp(); return kFALSE;}
1566 if (!fRunTracking.IsNull()) {
1567 if (fRunMuonTracking) {
1568 if (!RunMuonTracking(fesd)) {
1569 if (fStopOnError) {CleanUp(); return kFALSE;}
1575 if (!fRunTracking.IsNull()) {
1576 if (!RunTracking(fesd)) {
1577 if (fStopOnError) {CleanUp(); return kFALSE;}
1582 if (!fFillESD.IsNull()) {
1583 TString detectors=fFillESD;
1584 // run HLT first and on hltesd
1585 // ;-( IsSelected changes the string
1586 if (IsSelected("HLT", detectors) &&
1587 !FillESD(fhltesd, "HLT")) {
1588 if (fStopOnError) {CleanUp(); return kFALSE;}
1591 // Temporary fix to avoid problems with HLT that overwrites the offline ESDs
1592 if (detectors.Contains("ALL")) {
1594 for (Int_t idet=0; idet<fgkNDetectors; ++idet){
1595 detectors += fgkDetectorName[idet];
1599 detectors.ReplaceAll("HLT", "");
1600 if (!FillESD(fesd, detectors)) {
1601 if (fStopOnError) {CleanUp(); return kFALSE;}
1605 // fill Event header information from the RawEventHeader
1606 if (fRawReader){FillRawEventHeaderESD(fesd);}
1609 AliESDpid::MakePID(fesd);
1611 if (fFillTriggerESD) {
1612 if (!FillTriggerESD(fesd)) {
1613 if (fStopOnError) {CleanUp(); return kFALSE;}
1620 // Propagate track to the beam pipe (if not already done by ITS)
1622 const Int_t ntracks = fesd->GetNumberOfTracks();
1623 const Double_t kBz = fesd->GetMagneticField();
1624 const Double_t kRadius = 2.8; //something less than the beam pipe radius
1627 UShort_t *selectedIdx=new UShort_t[ntracks];
1629 for (Int_t itrack=0; itrack<ntracks; itrack++){
1630 const Double_t kMaxStep = 5; //max step over the material
1633 AliESDtrack *track = fesd->GetTrack(itrack);
1634 if (!track) continue;
1636 AliExternalTrackParam *tpcTrack =
1637 (AliExternalTrackParam *)track->GetTPCInnerParam();
1641 PropagateTrackTo(tpcTrack,kRadius,track->GetMass(),kMaxStep,kFALSE);
1644 Int_t n=trkArray.GetEntriesFast();
1645 selectedIdx[n]=track->GetID();
1646 trkArray.AddLast(tpcTrack);
1649 //Tracks refitted by ITS should already be at the SPD vertex
1650 if (track->IsOn(AliESDtrack::kITSrefit)) continue;
1653 PropagateTrackTo(track,kRadius,track->GetMass(),kMaxStep,kFALSE);
1654 track->RelateToVertex(fesd->GetPrimaryVertexSPD(), kBz, kVeryBig);
1659 // Improve the reconstructed primary vertex position using the tracks
1661 Bool_t runVertexFinderTracks = fRunVertexFinderTracks;
1662 if(fesd->GetPrimaryVertexSPD()) {
1663 TString vtitle = fesd->GetPrimaryVertexSPD()->GetTitle();
1664 if(vtitle.Contains("cosmics")) {
1665 runVertexFinderTracks=kFALSE;
1669 if (runVertexFinderTracks) {
1670 // TPC + ITS primary vertex
1671 ftVertexer->SetITSMode();
1672 ftVertexer->SetConstraintOff();
1673 // get cuts for vertexer from AliGRPRecoParam
1675 Int_t nCutsVertexer = grpRecoParam->GetVertexerTracksNCuts();
1676 Double_t *cutsVertexer = new Double_t[nCutsVertexer];
1677 grpRecoParam->GetVertexerTracksCutsITS(cutsVertexer);
1678 ftVertexer->SetCuts(cutsVertexer);
1679 delete [] cutsVertexer; cutsVertexer = NULL;
1680 if(fDiamondProfile && grpRecoParam->GetVertexerTracksConstraintITS())
1681 ftVertexer->SetVtxStart(fDiamondProfile);
1683 AliESDVertex *pvtx=ftVertexer->FindPrimaryVertex(fesd);
1685 if (pvtx->GetStatus()) {
1686 fesd->SetPrimaryVertexTracks(pvtx);
1687 for (Int_t i=0; i<ntracks; i++) {
1688 AliESDtrack *t = fesd->GetTrack(i);
1689 t->RelateToVertex(pvtx, kBz, kVeryBig);
1694 // TPC-only primary vertex
1695 ftVertexer->SetTPCMode();
1696 ftVertexer->SetConstraintOff();
1697 // get cuts for vertexer from AliGRPRecoParam
1699 Int_t nCutsVertexer = grpRecoParam->GetVertexerTracksNCuts();
1700 Double_t *cutsVertexer = new Double_t[nCutsVertexer];
1701 grpRecoParam->GetVertexerTracksCutsTPC(cutsVertexer);
1702 ftVertexer->SetCuts(cutsVertexer);
1703 delete [] cutsVertexer; cutsVertexer = NULL;
1704 if(fDiamondProfileTPC && grpRecoParam->GetVertexerTracksConstraintTPC())
1705 ftVertexer->SetVtxStart(fDiamondProfileTPC);
1707 pvtx=ftVertexer->FindPrimaryVertex(&trkArray,selectedIdx);
1709 if (pvtx->GetStatus()) {
1710 fesd->SetPrimaryVertexTPC(pvtx);
1711 for (Int_t i=0; i<ntracks; i++) {
1712 AliESDtrack *t = fesd->GetTrack(i);
1713 t->RelateToVertexTPC(pvtx, kBz, kVeryBig);
1719 delete[] selectedIdx;
1721 if(fDiamondProfile) fesd->SetDiamond(fDiamondProfile);
1726 AliV0vertexer vtxer;
1727 vtxer.Tracks2V0vertices(fesd);
1729 if (fRunCascadeFinder) {
1731 AliCascadeVertexer cvtxer;
1732 cvtxer.V0sTracks2CascadeVertices(fesd);
1737 if (fCleanESD) CleanESD(fesd);
1740 fQASteer->RunOneEvent(fesd) ;
1743 AliQADataMaker *qadm = fQASteer->GetQADataMaker(AliQA::kGLOBAL);
1744 if (qadm && fQATasks.Contains(Form("%d", AliQA::kESDS)))
1745 qadm->Exec(AliQA::kESDS, fesd);
1748 if (fWriteESDfriend) {
1749 // fesdf->~AliESDfriend();
1750 // new (fesdf) AliESDfriend(); // Reset...
1751 fesd->GetESDfriend(fesdf);
1755 // Auto-save the ESD tree in case of prompt reco @P2
1756 if (fRawReader && fRawReader->UseAutoSaveESD()) {
1757 ftree->AutoSave("SaveSelf");
1758 TFile *friendfile = (TFile *)(gROOT->GetListOfFiles()->FindObject("AliESDfriends.root"));
1759 if (friendfile) friendfile->Save();
1766 if (fRunAliEVE) RunAliEVE();
1770 if (fWriteESDfriend) {
1771 fesdf->~AliESDfriend();
1772 new (fesdf) AliESDfriend(); // Reset...
1775 ProcInfo_t ProcInfo;
1776 gSystem->GetProcInfo(&ProcInfo);
1777 AliInfo(Form("Event %d -> Current memory usage %d %d",iEvent, ProcInfo.fMemResident, ProcInfo.fMemVirtual));
1780 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
1781 if (fReconstructor[iDet])
1782 fReconstructor[iDet]->SetRecoParam(NULL);
1785 if (fRunQA || fRunGlobalQA)
1786 fQASteer->Increment() ;
1791 //_____________________________________________________________________________
1792 void AliReconstruction::SlaveTerminate()
1794 // Finalize the run on the slave side
1795 // Called after the exit
1796 // from the event loop
1797 AliCodeTimerAuto("");
1799 if (fIsNewRunLoader) { // galice.root didn't exist
1800 fRunLoader->WriteHeader("OVERWRITE");
1801 fRunLoader->CdGAFile();
1802 fRunLoader->Write(0, TObject::kOverwrite);
1805 const TMap *cdbMap = AliCDBManager::Instance()->GetStorageMap();
1806 const TList *cdbList = AliCDBManager::Instance()->GetRetrievedIds();
1808 TMap *cdbMapCopy = new TMap(cdbMap->GetEntries());
1809 cdbMapCopy->SetOwner(1);
1810 cdbMapCopy->SetName("cdbMap");
1811 TIter iter(cdbMap->GetTable());
1814 while((pair = dynamic_cast<TPair*> (iter.Next()))){
1815 TObjString* keyStr = dynamic_cast<TObjString*> (pair->Key());
1816 TObjString* valStr = dynamic_cast<TObjString*> (pair->Value());
1817 cdbMapCopy->Add(new TObjString(keyStr->GetName()), new TObjString(valStr->GetName()));
1820 TList *cdbListCopy = new TList();
1821 cdbListCopy->SetOwner(1);
1822 cdbListCopy->SetName("cdbList");
1824 TIter iter2(cdbList);
1827 while((id = dynamic_cast<AliCDBId*> (iter2.Next()))){
1828 cdbListCopy->Add(new TObjString(id->ToString().Data()));
1831 ftree->GetUserInfo()->Add(cdbMapCopy);
1832 ftree->GetUserInfo()->Add(cdbListCopy);
1835 if(fESDPar.Contains("ESD.par")){
1836 AliInfo("Attaching ESD.par to Tree");
1837 TNamed *fn = CopyFileToTNamed(fESDPar.Data(),"ESD.par");
1838 ftree->GetUserInfo()->Add(fn);
1844 if (fWriteESDfriend)
1845 ftree->SetBranchStatus("ESDfriend*",0);
1846 // we want to have only one tree version number
1847 ftree->Write(ftree->GetName(),TObject::kOverwrite);
1850 // Finish with Plane Efficiency evaluation: before of CleanUp !!!
1851 if (fRunPlaneEff && !FinishPlaneEff()) {
1852 AliWarning("Finish PlaneEff evaluation failed");
1855 // End of cycle for the in-loop
1857 fQASteer->EndOfCycle() ;
1860 AliQADataMaker *qadm = fQASteer->GetQADataMaker(AliQA::kGLOBAL);
1862 if (fQATasks.Contains(Form("%d", AliQA::kRECPOINTS)))
1863 qadm->EndOfCycle(AliQA::kRECPOINTS);
1864 if (fQATasks.Contains(Form("%d", AliQA::kESDS)))
1865 qadm->EndOfCycle(AliQA::kESDS);
1873 //_____________________________________________________________________________
1874 void AliReconstruction::Terminate()
1876 // Create tags for the events in the ESD tree (the ESD tree is always present)
1877 // In case of empty events the tags will contain dummy values
1878 AliCodeTimerAuto("");
1880 AliESDTagCreator *esdtagCreator = new AliESDTagCreator();
1881 esdtagCreator->CreateESDTags(fFirstEvent,fLastEvent,fGRPData);
1883 // Cleanup of CDB manager: cache and active storages!
1884 AliCDBManager::Instance()->ClearCache();
1887 //_____________________________________________________________________________
1888 Bool_t AliReconstruction::RunLocalEventReconstruction(const TString& detectors)
1890 // run the local reconstruction
1892 static Int_t eventNr=0;
1893 AliCodeTimerAuto("")
1895 TString detStr = detectors;
1896 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
1897 if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
1898 AliReconstructor* reconstructor = GetReconstructor(iDet);
1899 if (!reconstructor) continue;
1900 AliLoader* loader = fLoader[iDet];
1901 // Matthias April 2008: temporary fix to run HLT reconstruction
1902 // although the HLT loader is missing
1903 if (strcmp(fgkDetectorName[iDet], "HLT")==0) {
1905 reconstructor->Reconstruct(fRawReader, NULL);
1908 reconstructor->Reconstruct(dummy, NULL);
1913 AliWarning(Form("No loader is defined for %s!",fgkDetectorName[iDet]));
1916 // conversion of digits
1917 if (fRawReader && reconstructor->HasDigitConversion()) {
1918 AliInfo(Form("converting raw data digits into root objects for %s",
1919 fgkDetectorName[iDet]));
1920 // AliCodeTimerAuto(Form("converting raw data digits into root objects for %s",
1921 // fgkDetectorName[iDet]));
1922 loader->LoadDigits("update");
1923 loader->CleanDigits();
1924 loader->MakeDigitsContainer();
1925 TTree* digitsTree = loader->TreeD();
1926 reconstructor->ConvertDigits(fRawReader, digitsTree);
1927 loader->WriteDigits("OVERWRITE");
1928 loader->UnloadDigits();
1930 // local reconstruction
1931 AliInfo(Form("running reconstruction for %s", fgkDetectorName[iDet]));
1932 //AliCodeTimerAuto(Form("running reconstruction for %s", fgkDetectorName[iDet]));
1933 loader->LoadRecPoints("update");
1934 loader->CleanRecPoints();
1935 loader->MakeRecPointsContainer();
1936 TTree* clustersTree = loader->TreeR();
1937 if (fRawReader && !reconstructor->HasDigitConversion()) {
1938 reconstructor->Reconstruct(fRawReader, clustersTree);
1940 loader->LoadDigits("read");
1941 TTree* digitsTree = loader->TreeD();
1943 AliError(Form("Can't get the %s digits tree", fgkDetectorName[iDet]));
1944 if (fStopOnError) return kFALSE;
1946 reconstructor->Reconstruct(digitsTree, clustersTree);
1948 loader->UnloadDigits();
1951 TString detQAStr(fQADetectors) ;
1953 fQASteer->RunOneEventInOneDetector(iDet, clustersTree) ;
1955 loader->WriteRecPoints("OVERWRITE");
1956 loader->UnloadRecPoints();
1957 AliSysInfo::AddStamp(Form("LRec%s_%d",fgkDetectorName[iDet],eventNr), iDet,1,eventNr);
1959 if ((detStr.CompareTo("ALL") != 0) && !detStr.IsNull()) {
1960 AliError(Form("the following detectors were not found: %s",
1962 if (fStopOnError) return kFALSE;
1968 //_____________________________________________________________________________
1969 Bool_t AliReconstruction::RunVertexFinder(AliESDEvent*& esd)
1971 // run the barrel tracking
1973 AliCodeTimerAuto("")
1975 AliESDVertex* vertex = NULL;
1976 Double_t vtxPos[3] = {0, 0, 0};
1977 Double_t vtxErr[3] = {0.07, 0.07, 0.1};
1978 TArrayF mcVertex(3);
1979 if (fRunLoader->GetHeader() && fRunLoader->GetHeader()->GenEventHeader()) {
1980 fRunLoader->GetHeader()->GenEventHeader()->PrimaryVertex(mcVertex);
1981 for (Int_t i = 0; i < 3; i++) vtxPos[i] = mcVertex[i];
1985 AliInfo("running the ITS vertex finder");
1987 fLoader[0]->LoadRecPoints();
1988 TTree* cltree = fLoader[0]->TreeR();
1990 if(fDiamondProfileSPD) fVertexer->SetVtxStart(fDiamondProfileSPD);
1991 vertex = fVertexer->FindVertexForCurrentEvent(cltree);
1994 AliError("Can't get the ITS cluster tree");
1996 fLoader[0]->UnloadRecPoints();
1999 AliError("Can't get the ITS loader");
2002 AliWarning("Vertex not found");
2003 vertex = new AliESDVertex();
2004 vertex->SetName("default");
2007 vertex->SetName("reconstructed");
2011 AliInfo("getting the primary vertex from MC");
2012 vertex = new AliESDVertex(vtxPos, vtxErr);
2016 vertex->GetXYZ(vtxPos);
2017 vertex->GetSigmaXYZ(vtxErr);
2019 AliWarning("no vertex reconstructed");
2020 vertex = new AliESDVertex(vtxPos, vtxErr);
2022 esd->SetPrimaryVertexSPD(vertex);
2023 // if SPD multiplicity has been determined, it is stored in the ESD
2024 AliMultiplicity *mult = fVertexer->GetMultiplicity();
2025 if(mult)esd->SetMultiplicity(mult);
2027 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
2028 if (fTracker[iDet]) fTracker[iDet]->SetVertex(vtxPos, vtxErr);
2035 //_____________________________________________________________________________
2036 Bool_t AliReconstruction::RunHLTTracking(AliESDEvent*& esd)
2038 // run the HLT barrel tracking
2040 AliCodeTimerAuto("")
2043 AliError("Missing runLoader!");
2047 AliInfo("running HLT tracking");
2049 // Get a pointer to the HLT reconstructor
2050 AliReconstructor *reconstructor = GetReconstructor(fgkNDetectors-1);
2051 if (!reconstructor) return kFALSE;
2054 for (Int_t iDet = 1; iDet >= 0; iDet--) {
2055 TString detName = fgkDetectorName[iDet];
2056 AliDebug(1, Form("%s HLT tracking", detName.Data()));
2057 reconstructor->SetOption(detName.Data());
2058 AliTracker *tracker = reconstructor->CreateTracker();
2060 AliWarning(Form("couldn't create a HLT tracker for %s", detName.Data()));
2061 if (fStopOnError) return kFALSE;
2065 Double_t vtxErr[3]={0.005,0.005,0.010};
2066 const AliESDVertex *vertex = esd->GetVertex();
2067 vertex->GetXYZ(vtxPos);
2068 tracker->SetVertex(vtxPos,vtxErr);
2070 fLoader[iDet]->LoadRecPoints("read");
2071 TTree* tree = fLoader[iDet]->TreeR();
2073 AliError(Form("Can't get the %s cluster tree", detName.Data()));
2076 tracker->LoadClusters(tree);
2078 if (tracker->Clusters2Tracks(esd) != 0) {
2079 AliError(Form("HLT %s Clusters2Tracks failed", fgkDetectorName[iDet]));
2083 tracker->UnloadClusters();
2091 //_____________________________________________________________________________
2092 Bool_t AliReconstruction::RunMuonTracking(AliESDEvent*& esd)
2094 // run the muon spectrometer tracking
2096 AliCodeTimerAuto("")
2099 AliError("Missing runLoader!");
2102 Int_t iDet = 7; // for MUON
2104 AliInfo("is running...");
2106 // Get a pointer to the MUON reconstructor
2107 AliReconstructor *reconstructor = GetReconstructor(iDet);
2108 if (!reconstructor) return kFALSE;
2111 TString detName = fgkDetectorName[iDet];
2112 AliDebug(1, Form("%s tracking", detName.Data()));
2113 AliTracker *tracker = reconstructor->CreateTracker();
2115 AliWarning(Form("couldn't create a tracker for %s", detName.Data()));
2120 fLoader[iDet]->LoadRecPoints("read");
2122 tracker->LoadClusters(fLoader[iDet]->TreeR());
2124 Int_t rv = tracker->Clusters2Tracks(esd);
2128 AliError(Form("%s Clusters2Tracks failed", fgkDetectorName[iDet]));
2132 fLoader[iDet]->UnloadRecPoints();
2134 tracker->UnloadClusters();
2142 //_____________________________________________________________________________
2143 Bool_t AliReconstruction::RunTracking(AliESDEvent*& esd)
2145 // run the barrel tracking
2146 static Int_t eventNr=0;
2147 AliCodeTimerAuto("")
2149 AliInfo("running tracking");
2151 //Fill the ESD with the T0 info (will be used by the TOF)
2152 if (fReconstructor[11] && fLoader[11]) {
2153 fLoader[11]->LoadRecPoints("READ");
2154 TTree *treeR = fLoader[11]->TreeR();
2155 GetReconstructor(11)->FillESD((TTree *)NULL,treeR,esd);
2158 // pass 1: TPC + ITS inwards
2159 for (Int_t iDet = 1; iDet >= 0; iDet--) {
2160 if (!fTracker[iDet]) continue;
2161 AliDebug(1, Form("%s tracking", fgkDetectorName[iDet]));
2164 fLoader[iDet]->LoadRecPoints("read");
2165 AliSysInfo::AddStamp(Form("RLoadCluster%s_%d",fgkDetectorName[iDet],eventNr),iDet,1, eventNr);
2166 TTree* tree = fLoader[iDet]->TreeR();
2168 AliError(Form("Can't get the %s cluster tree", fgkDetectorName[iDet]));
2171 fTracker[iDet]->LoadClusters(tree);
2172 AliSysInfo::AddStamp(Form("TLoadCluster%s_%d",fgkDetectorName[iDet],eventNr), iDet,2, eventNr);
2174 if (fTracker[iDet]->Clusters2Tracks(esd) != 0) {
2175 AliError(Form("%s Clusters2Tracks failed", fgkDetectorName[iDet]));
2178 // preliminary PID in TPC needed by the ITS tracker
2180 GetReconstructor(1)->FillESD((TTree*)NULL, (TTree*)NULL, esd);
2181 AliESDpid::MakePID(esd);
2183 AliSysInfo::AddStamp(Form("Tracking0%s_%d",fgkDetectorName[iDet],eventNr), iDet,3,eventNr);
2186 // pass 2: ALL backwards
2188 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
2189 if (!fTracker[iDet]) continue;
2190 AliDebug(1, Form("%s back propagation", fgkDetectorName[iDet]));
2193 if (iDet > 1) { // all except ITS, TPC
2195 fLoader[iDet]->LoadRecPoints("read");
2196 AliSysInfo::AddStamp(Form("RLoadCluster0%s_%d",fgkDetectorName[iDet],eventNr), iDet,1, eventNr);
2197 tree = fLoader[iDet]->TreeR();
2199 AliError(Form("Can't get the %s cluster tree", fgkDetectorName[iDet]));
2202 fTracker[iDet]->LoadClusters(tree);
2203 AliSysInfo::AddStamp(Form("TLoadCluster0%s_%d",fgkDetectorName[iDet],eventNr), iDet,2, eventNr);
2207 if (iDet>1) // start filling residuals for the "outer" detectors
2208 if (fRunGlobalQA) AliTracker::SetFillResiduals(kTRUE);
2210 if (fTracker[iDet]->PropagateBack(esd) != 0) {
2211 AliError(Form("%s backward propagation failed", fgkDetectorName[iDet]));
2216 if (iDet > 3) { // all except ITS, TPC, TRD and TOF
2217 fTracker[iDet]->UnloadClusters();
2218 fLoader[iDet]->UnloadRecPoints();
2220 // updated PID in TPC needed by the ITS tracker -MI
2222 GetReconstructor(1)->FillESD((TTree*)NULL, (TTree*)NULL, esd);
2223 AliESDpid::MakePID(esd);
2225 AliSysInfo::AddStamp(Form("Tracking1%s_%d",fgkDetectorName[iDet],eventNr), iDet,3, eventNr);
2227 //stop filling residuals for the "outer" detectors
2228 if (fRunGlobalQA) AliTracker::SetFillResiduals(kFALSE);
2230 // pass 3: TRD + TPC + ITS refit inwards
2232 for (Int_t iDet = 2; iDet >= 0; iDet--) {
2233 if (!fTracker[iDet]) continue;
2234 AliDebug(1, Form("%s inward refit", fgkDetectorName[iDet]));
2237 if (iDet<2) // start filling residuals for TPC and ITS
2238 if (fRunGlobalQA) AliTracker::SetFillResiduals(kTRUE);
2240 if (fTracker[iDet]->RefitInward(esd) != 0) {
2241 AliError(Form("%s inward refit failed", fgkDetectorName[iDet]));
2244 // run postprocessing
2245 if (fTracker[iDet]->PostProcess(esd) != 0) {
2246 AliError(Form("%s postprocessing failed", fgkDetectorName[iDet]));
2249 AliSysInfo::AddStamp(Form("Tracking2%s_%d",fgkDetectorName[iDet],eventNr), iDet,3, eventNr);
2252 // write space-points to the ESD in case alignment data output
2254 if (fWriteAlignmentData)
2255 WriteAlignmentData(esd);
2257 for (Int_t iDet = 3; iDet >= 0; iDet--) {
2258 if (!fTracker[iDet]) continue;
2260 fTracker[iDet]->UnloadClusters();
2261 AliSysInfo::AddStamp(Form("TUnloadCluster%s_%d",fgkDetectorName[iDet],eventNr), iDet,4, eventNr);
2262 fLoader[iDet]->UnloadRecPoints();
2263 AliSysInfo::AddStamp(Form("RUnloadCluster%s_%d",fgkDetectorName[iDet],eventNr), iDet,5, eventNr);
2265 // stop filling residuals for TPC and ITS
2266 if (fRunGlobalQA) AliTracker::SetFillResiduals(kFALSE);
2272 //_____________________________________________________________________________
2273 Bool_t AliReconstruction::CleanESD(AliESDEvent *esd){
2275 // Remove the data which are not needed for the physics analysis.
2278 Int_t nTracks=esd->GetNumberOfTracks();
2279 Int_t nV0s=esd->GetNumberOfV0s();
2281 (Form("Number of ESD tracks and V0s before cleaning: %d %d",nTracks,nV0s));
2283 Float_t cleanPars[]={fV0DCAmax,fV0CsPmin,fDmax,fZmax};
2284 Bool_t rc=esd->Clean(cleanPars);
2286 nTracks=esd->GetNumberOfTracks();
2287 nV0s=esd->GetNumberOfV0s();
2289 (Form("Number of ESD tracks and V0s after cleaning %d %d",nTracks,nV0s));
2294 //_____________________________________________________________________________
2295 Bool_t AliReconstruction::FillESD(AliESDEvent*& esd, const TString& detectors)
2297 // fill the event summary data
2299 AliCodeTimerAuto("")
2300 static Int_t eventNr=0;
2301 TString detStr = detectors;
2303 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
2304 if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
2305 AliReconstructor* reconstructor = GetReconstructor(iDet);
2306 if (!reconstructor) continue;
2307 AliDebug(1, Form("filling ESD for %s", fgkDetectorName[iDet]));
2308 TTree* clustersTree = NULL;
2309 if (fLoader[iDet]) {
2310 fLoader[iDet]->LoadRecPoints("read");
2311 clustersTree = fLoader[iDet]->TreeR();
2312 if (!clustersTree) {
2313 AliError(Form("Can't get the %s clusters tree",
2314 fgkDetectorName[iDet]));
2315 if (fStopOnError) return kFALSE;
2318 if (fRawReader && !reconstructor->HasDigitConversion()) {
2319 reconstructor->FillESD(fRawReader, clustersTree, esd);
2321 TTree* digitsTree = NULL;
2322 if (fLoader[iDet]) {
2323 fLoader[iDet]->LoadDigits("read");
2324 digitsTree = fLoader[iDet]->TreeD();
2326 AliError(Form("Can't get the %s digits tree",
2327 fgkDetectorName[iDet]));
2328 if (fStopOnError) return kFALSE;
2331 reconstructor->FillESD(digitsTree, clustersTree, esd);
2332 if (fLoader[iDet]) fLoader[iDet]->UnloadDigits();
2334 if (fLoader[iDet]) {
2335 fLoader[iDet]->UnloadRecPoints();
2339 if ((detStr.CompareTo("ALL") != 0) && !detStr.IsNull()) {
2340 AliError(Form("the following detectors were not found: %s",
2342 if (fStopOnError) return kFALSE;
2344 AliSysInfo::AddStamp(Form("FillESD%d",eventNr), 0,1, eventNr);
2349 //_____________________________________________________________________________
2350 Bool_t AliReconstruction::FillTriggerESD(AliESDEvent*& esd)
2352 // Reads the trigger decision which is
2353 // stored in Trigger.root file and fills
2354 // the corresponding esd entries
2356 AliCodeTimerAuto("")
2358 AliInfo("Filling trigger information into the ESD");
2361 AliCTPRawStream input(fRawReader);
2362 if (!input.Next()) {
2363 AliWarning("No valid CTP (trigger) DDL raw data is found ! The trigger info is taken from the event header!");
2366 if (esd->GetTriggerMask() != input.GetClassMask())
2367 AliError(Form("Invalid trigger pattern found in CTP raw-data: %llx %llx",
2368 input.GetClassMask(),esd->GetTriggerMask()));
2369 if (esd->GetOrbitNumber() != input.GetOrbitID())
2370 AliError(Form("Invalid orbit id found in CTP raw-data: %x %x",
2371 input.GetOrbitID(),esd->GetOrbitNumber()));
2372 if (esd->GetBunchCrossNumber() != input.GetBCID())
2373 AliError(Form("Invalid bunch-crossing id found in CTP raw-data: %x %x",
2374 input.GetBCID(),esd->GetBunchCrossNumber()));
2377 // Here one has to add the filling of trigger inputs and
2378 // interaction records
2388 //_____________________________________________________________________________
2389 Bool_t AliReconstruction::FillRawEventHeaderESD(AliESDEvent*& esd)
2392 // Filling information from RawReader Header
2395 if (!fRawReader) return kFALSE;
2397 AliInfo("Filling information from RawReader Header");
2399 esd->SetBunchCrossNumber(fRawReader->GetBCID());
2400 esd->SetOrbitNumber(fRawReader->GetOrbitID());
2401 esd->SetPeriodNumber(fRawReader->GetPeriod());
2403 esd->SetTimeStamp(fRawReader->GetTimestamp());
2404 esd->SetEventType(fRawReader->GetType());
2410 //_____________________________________________________________________________
2411 Bool_t AliReconstruction::IsSelected(TString detName, TString& detectors) const
2413 // check whether detName is contained in detectors
2414 // if yes, it is removed from detectors
2416 // check if all detectors are selected
2417 if ((detectors.CompareTo("ALL") == 0) ||
2418 detectors.BeginsWith("ALL ") ||
2419 detectors.EndsWith(" ALL") ||
2420 detectors.Contains(" ALL ")) {
2425 // search for the given detector
2426 Bool_t result = kFALSE;
2427 if ((detectors.CompareTo(detName) == 0) ||
2428 detectors.BeginsWith(detName+" ") ||
2429 detectors.EndsWith(" "+detName) ||
2430 detectors.Contains(" "+detName+" ")) {
2431 detectors.ReplaceAll(detName, "");
2435 // clean up the detectors string
2436 while (detectors.Contains(" ")) detectors.ReplaceAll(" ", " ");
2437 while (detectors.BeginsWith(" ")) detectors.Remove(0, 1);
2438 while (detectors.EndsWith(" ")) detectors.Remove(detectors.Length()-1, 1);
2443 //_____________________________________________________________________________
2444 Bool_t AliReconstruction::InitRunLoader()
2446 // get or create the run loader
2448 if (gAlice) delete gAlice;
2451 if (!gSystem->AccessPathName(fGAliceFileName.Data())) { // galice.root exists
2452 // load all base libraries to get the loader classes
2453 TString libs = gSystem->GetLibraries();
2454 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
2455 TString detName = fgkDetectorName[iDet];
2456 if (detName == "HLT") continue;
2457 if (libs.Contains("lib" + detName + "base.so")) continue;
2458 gSystem->Load("lib" + detName + "base.so");
2460 fRunLoader = AliRunLoader::Open(fGAliceFileName.Data());
2462 AliError(Form("no run loader found in file %s", fGAliceFileName.Data()));
2467 fRunLoader->CdGAFile();
2468 fRunLoader->LoadgAlice();
2470 //PH This is a temporary fix to give access to the kinematics
2471 //PH that is needed for the labels of ITS clusters
2472 fRunLoader->LoadHeader();
2473 fRunLoader->LoadKinematics();
2475 } else { // galice.root does not exist
2477 AliError(Form("the file %s does not exist", fGAliceFileName.Data()));
2479 fRunLoader = AliRunLoader::Open(fGAliceFileName.Data(),
2480 AliConfig::GetDefaultEventFolderName(),
2483 AliError(Form("could not create run loader in file %s",
2484 fGAliceFileName.Data()));
2488 fIsNewRunLoader = kTRUE;
2489 fRunLoader->MakeTree("E");
2491 if (fNumberOfEventsPerFile > 0)
2492 fRunLoader->SetNumberOfEventsPerFile(fNumberOfEventsPerFile);
2494 fRunLoader->SetNumberOfEventsPerFile((UInt_t)-1);
2500 //_____________________________________________________________________________
2501 AliReconstructor* AliReconstruction::GetReconstructor(Int_t iDet)
2503 // get the reconstructor object and the loader for a detector
2505 if (fReconstructor[iDet]) {
2506 if (fRecoParam.GetDetRecoParamArray(iDet) && !AliReconstructor::GetRecoParam(iDet)) {
2507 const AliDetectorRecoParam *par = fRecoParam.GetDetRecoParam(iDet);
2508 fReconstructor[iDet]->SetRecoParam(par);
2510 return fReconstructor[iDet];
2513 // load the reconstructor object
2514 TPluginManager* pluginManager = gROOT->GetPluginManager();
2515 TString detName = fgkDetectorName[iDet];
2516 TString recName = "Ali" + detName + "Reconstructor";
2518 if (!fIsNewRunLoader && !fRunLoader->GetLoader(detName+"Loader") && (detName != "HLT")) return NULL;
2520 AliReconstructor* reconstructor = NULL;
2521 // first check if a plugin is defined for the reconstructor
2522 TPluginHandler* pluginHandler =
2523 pluginManager->FindHandler("AliReconstructor", detName);
2524 // if not, add a plugin for it
2525 if (!pluginHandler) {
2526 AliDebug(1, Form("defining plugin for %s", recName.Data()));
2527 TString libs = gSystem->GetLibraries();
2528 if (libs.Contains("lib" + detName + "base.so") ||
2529 (gSystem->Load("lib" + detName + "base.so") >= 0)) {
2530 pluginManager->AddHandler("AliReconstructor", detName,
2531 recName, detName + "rec", recName + "()");
2533 pluginManager->AddHandler("AliReconstructor", detName,
2534 recName, detName, recName + "()");
2536 pluginHandler = pluginManager->FindHandler("AliReconstructor", detName);
2538 if (pluginHandler && (pluginHandler->LoadPlugin() == 0)) {
2539 reconstructor = (AliReconstructor*) pluginHandler->ExecPlugin(0);
2541 if (reconstructor) {
2542 TObject* obj = fOptions.FindObject(detName.Data());
2543 if (obj) reconstructor->SetOption(obj->GetTitle());
2544 reconstructor->Init();
2545 fReconstructor[iDet] = reconstructor;
2548 // get or create the loader
2549 if (detName != "HLT") {
2550 fLoader[iDet] = fRunLoader->GetLoader(detName + "Loader");
2551 if (!fLoader[iDet]) {
2552 AliConfig::Instance()
2553 ->CreateDetectorFolders(fRunLoader->GetEventFolder(),
2555 // first check if a plugin is defined for the loader
2557 pluginManager->FindHandler("AliLoader", detName);
2558 // if not, add a plugin for it
2559 if (!pluginHandler) {
2560 TString loaderName = "Ali" + detName + "Loader";
2561 AliDebug(1, Form("defining plugin for %s", loaderName.Data()));
2562 pluginManager->AddHandler("AliLoader", detName,
2563 loaderName, detName + "base",
2564 loaderName + "(const char*, TFolder*)");
2565 pluginHandler = pluginManager->FindHandler("AliLoader", detName);
2567 if (pluginHandler && (pluginHandler->LoadPlugin() == 0)) {
2569 (AliLoader*) pluginHandler->ExecPlugin(2, detName.Data(),
2570 fRunLoader->GetEventFolder());
2572 if (!fLoader[iDet]) { // use default loader
2573 fLoader[iDet] = new AliLoader(detName, fRunLoader->GetEventFolder());
2575 if (!fLoader[iDet]) {
2576 AliWarning(Form("couldn't get loader for %s", detName.Data()));
2577 if (fStopOnError) return NULL;
2579 fRunLoader->AddLoader(fLoader[iDet]);
2580 fRunLoader->CdGAFile();
2581 if (gFile && !gFile->IsWritable()) gFile->ReOpen("UPDATE");
2582 fRunLoader->Write(0, TObject::kOverwrite);
2587 if (fRecoParam.GetDetRecoParamArray(iDet) && !AliReconstructor::GetRecoParam(iDet)) {
2588 const AliDetectorRecoParam *par = fRecoParam.GetDetRecoParam(iDet);
2589 reconstructor->SetRecoParam(par);
2591 return reconstructor;
2594 //_____________________________________________________________________________
2595 Bool_t AliReconstruction::CreateVertexer()
2597 // create the vertexer
2600 AliReconstructor* itsReconstructor = GetReconstructor(0);
2601 if (itsReconstructor) {
2602 fVertexer = itsReconstructor->CreateVertexer();
2605 AliWarning("couldn't create a vertexer for ITS");
2606 if (fStopOnError) return kFALSE;
2612 //_____________________________________________________________________________
2613 Bool_t AliReconstruction::CreateTrackers(const TString& detectors)
2615 // create the trackers
2616 AliInfo("Creating trackers");
2618 TString detStr = detectors;
2619 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
2620 if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
2621 AliReconstructor* reconstructor = GetReconstructor(iDet);
2622 if (!reconstructor) continue;
2623 TString detName = fgkDetectorName[iDet];
2624 if (detName == "HLT") {
2625 fRunHLTTracking = kTRUE;
2628 if (detName == "MUON") {
2629 fRunMuonTracking = kTRUE;
2634 fTracker[iDet] = reconstructor->CreateTracker();
2635 if (!fTracker[iDet] && (iDet < 7)) {
2636 AliWarning(Form("couldn't create a tracker for %s", detName.Data()));
2637 if (fStopOnError) return kFALSE;
2639 AliSysInfo::AddStamp(Form("LTracker%s",fgkDetectorName[iDet]), iDet,0);
2645 //_____________________________________________________________________________
2646 void AliReconstruction::CleanUp()
2648 // delete trackers and the run loader and close and delete the file
2650 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
2651 delete fReconstructor[iDet];
2652 fReconstructor[iDet] = NULL;
2653 fLoader[iDet] = NULL;
2654 delete fTracker[iDet];
2655 fTracker[iDet] = NULL;
2666 if(!(AliCDBManager::Instance()->GetCacheFlag())) {
2667 delete fDiamondProfileSPD;
2668 fDiamondProfileSPD = NULL;
2669 delete fDiamondProfile;
2670 fDiamondProfile = NULL;
2671 delete fDiamondProfileTPC;
2672 fDiamondProfileTPC = NULL;
2678 delete fParentRawReader;
2679 fParentRawReader=NULL;
2688 void AliReconstruction::WriteAlignmentData(AliESDEvent* esd)
2690 // Write space-points which are then used in the alignment procedures
2691 // For the moment only ITS, TPC, TRD and TOF
2693 Int_t ntracks = esd->GetNumberOfTracks();
2694 for (Int_t itrack = 0; itrack < ntracks; itrack++)
2696 AliESDtrack *track = esd->GetTrack(itrack);
2699 for (Int_t iDet = 5; iDet >= 0; iDet--) {// TOF, TRD, TPC, ITS clusters
2700 nsp += track->GetNcls(iDet);
2702 if (iDet==0) { // ITS "extra" clusters
2703 track->GetClusters(iDet,idx);
2704 for (Int_t i=6; i<12; i++) if(idx[i] >= 0) nsp++;
2709 AliTrackPointArray *sp = new AliTrackPointArray(nsp);
2710 track->SetTrackPointArray(sp);
2712 for (Int_t iDet = 5; iDet >= 0; iDet--) {
2713 AliTracker *tracker = fTracker[iDet];
2714 if (!tracker) continue;
2715 Int_t nspdet = track->GetClusters(iDet,idx);
2717 if (iDet==0) // ITS "extra" clusters
2718 for (Int_t i=6; i<12; i++) if(idx[i] >= 0) nspdet++;
2720 if (nspdet <= 0) continue;
2724 while (isp2 < nspdet) {
2725 Bool_t isvalid=kTRUE;
2727 Int_t index=idx[isp++];
2728 if (index < 0) continue;
2730 TString dets = fgkDetectorName[iDet];
2731 if ((fUseTrackingErrorsForAlignment.CompareTo(dets) == 0) ||
2732 fUseTrackingErrorsForAlignment.BeginsWith(dets+" ") ||
2733 fUseTrackingErrorsForAlignment.EndsWith(" "+dets) ||
2734 fUseTrackingErrorsForAlignment.Contains(" "+dets+" ")) {
2735 isvalid = tracker->GetTrackPointTrackingError(index,p,track);
2737 isvalid = tracker->GetTrackPoint(index,p);
2740 if (!isvalid) continue;
2741 sp->AddPoint(isptrack,&p); isptrack++;
2748 //_____________________________________________________________________________
2749 void AliReconstruction::FillRawDataErrorLog(Int_t iEvent, AliESDEvent* esd)
2751 // The method reads the raw-data error log
2752 // accumulated within the rawReader.
2753 // It extracts the raw-data errors related to
2754 // the current event and stores them into
2755 // a TClonesArray inside the esd object.
2757 if (!fRawReader) return;
2759 for(Int_t i = 0; i < fRawReader->GetNumberOfErrorLogs(); i++) {
2761 AliRawDataErrorLog *log = fRawReader->GetErrorLog(i);
2763 if (iEvent != log->GetEventNumber()) continue;
2765 esd->AddRawDataErrorLog(log);
2770 TNamed* AliReconstruction::CopyFileToTNamed(TString fPath,TString pName){
2771 // Dump a file content into a char in TNamed
2773 in.open(fPath.Data(),ios::in | ios::binary|ios::ate);
2774 Int_t kBytes = (Int_t)in.tellg();
2775 printf("Size: %d \n",kBytes);
2778 char* memblock = new char [kBytes];
2779 in.seekg (0, ios::beg);
2780 in.read (memblock, kBytes);
2782 TString fData(memblock,kBytes);
2783 fn = new TNamed(pName,fData);
2784 printf("fData Size: %d \n",fData.Sizeof());
2785 printf("pName Size: %d \n",pName.Sizeof());
2786 printf("fn Size: %d \n",fn->Sizeof());
2790 AliInfo(Form("Could not Open %s\n",fPath.Data()));
2796 void AliReconstruction::TNamedToFile(TTree* fTree, TString pName){
2797 // This is not really needed in AliReconstruction at the moment
2798 // but can serve as a template
2800 TList *fList = fTree->GetUserInfo();
2801 TNamed *fn = (TNamed*)fList->FindObject(pName.Data());
2802 printf("fn Size: %d \n",fn->Sizeof());
2804 TString fTmp(fn->GetName()); // to be 100% sure in principle pName also works
2805 const char* cdata = fn->GetTitle();
2806 printf("fTmp Size %d\n",fTmp.Sizeof());
2808 int size = fn->Sizeof()-fTmp.Sizeof()-sizeof(UChar_t)-sizeof(Int_t); // see dfinition of TString::SizeOf()...
2809 printf("calculated size %d\n",size);
2810 ofstream out(pName.Data(),ios::out | ios::binary);
2811 out.write(cdata,size);
2816 //_____________________________________________________________________________
2817 void AliReconstruction::CheckQA()
2819 // check the QA of SIM for this run and remove the detectors
2820 // with status Fatal
2822 TString newRunLocalReconstruction ;
2823 TString newRunTracking ;
2824 TString newFillESD ;
2826 for (Int_t iDet = 0; iDet < AliQA::kNDET; iDet++) {
2827 TString detName(AliQA::GetDetName(iDet)) ;
2828 AliQA * qa = AliQA::Instance(AliQA::DETECTORINDEX_t(iDet)) ;
2829 if ( qa->IsSet(AliQA::DETECTORINDEX_t(iDet), AliQA::kSIM, AliQA::kFATAL)) {
2830 AliInfo(Form("QA status for %s in Hits and/or SDIGITS and/or Digits was Fatal; No reconstruction performed", detName.Data())) ;
2832 if ( fRunLocalReconstruction.Contains(AliQA::GetDetName(iDet)) ||
2833 fRunLocalReconstruction.Contains("ALL") ) {
2834 newRunLocalReconstruction += detName ;
2835 newRunLocalReconstruction += " " ;
2837 if ( fRunTracking.Contains(AliQA::GetDetName(iDet)) ||
2838 fRunTracking.Contains("ALL") ) {
2839 newRunTracking += detName ;
2840 newRunTracking += " " ;
2842 if ( fFillESD.Contains(AliQA::GetDetName(iDet)) ||
2843 fFillESD.Contains("ALL") ) {
2844 newFillESD += detName ;
2849 fRunLocalReconstruction = newRunLocalReconstruction ;
2850 fRunTracking = newRunTracking ;
2851 fFillESD = newFillESD ;
2854 //_____________________________________________________________________________
2855 Int_t AliReconstruction::GetDetIndex(const char* detector)
2857 // return the detector index corresponding to detector
2859 for (index = 0; index < fgkNDetectors ; index++) {
2860 if ( strcmp(detector, fgkDetectorName[index]) == 0 )
2865 //_____________________________________________________________________________
2866 Bool_t AliReconstruction::FinishPlaneEff() {
2868 // Here execute all the necessary operationis, at the end of the tracking phase,
2869 // in case that evaluation of PlaneEfficiencies was required for some detector.
2870 // E.g., write into a DataBase file the PlaneEfficiency which have been evaluated.
2872 // This Preliminary version works only FOR ITS !!!!!
2873 // other detectors (TOF,TRD, etc. have to develop their specific codes)
2876 // Return: kTRUE if all operations have been done properly, kFALSE otherwise
2879 //for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
2880 for (Int_t iDet = 0; iDet < 1; iDet++) { // for the time being only ITS
2881 //if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
2882 if(fTracker[iDet]) {
2883 AliPlaneEff *planeeff=fTracker[iDet]->GetPlaneEff();
2884 TString name=planeeff->GetName();
2886 TFile* pefile = TFile::Open(name, "RECREATE");
2887 ret=(Bool_t)planeeff->Write();
2889 if(planeeff->GetCreateHistos()) {
2890 TString hname=planeeff->GetName();
2891 hname+="Histo.root";
2892 ret*=planeeff->WriteHistosToFile(hname,"RECREATE");
2898 //_____________________________________________________________________________
2899 Bool_t AliReconstruction::InitPlaneEff() {
2901 // Here execute all the necessary operations, before of the tracking phase,
2902 // for the evaluation of PlaneEfficiencies, in case required for some detectors.
2903 // E.g., read from a DataBase file a first evaluation of the PlaneEfficiency
2904 // which should be updated/recalculated.
2906 // This Preliminary version will work only FOR ITS !!!!!
2907 // other detectors (TOF,TRD, etc. have to develop their specific codes)
2910 // Return: kTRUE if all operations have been done properly, kFALSE otherwise
2912 AliWarning(Form("Implementation of this method not yet done !! Method return kTRUE"));
2916 //_____________________________________________________________________________
2917 Bool_t AliReconstruction::InitAliEVE()
2919 // This method should be called only in case
2920 // AliReconstruction is run
2921 // within the alieve environment.
2922 // It will initialize AliEVE in a way
2923 // so that it can visualize event processed
2924 // by AliReconstruction.
2925 // The return flag shows whenever the
2926 // AliEVE initialization was successful or not.
2929 macroStr.Form("%s/EVE/macros/alieve_online.C",gSystem->ExpandPathName("$ALICE_ROOT"));
2930 AliInfo(Form("Loading AliEVE macro: %s",macroStr.Data()));
2931 if (gROOT->LoadMacro(macroStr.Data()) != 0) return kFALSE;
2933 gROOT->ProcessLine("if (!AliEveEventManager::GetMaster()){new AliEveEventManager();AliEveEventManager::GetMaster()->AddNewEventCommand(\"alieve_online_on_new_event()\");gEve->AddEvent(AliEveEventManager::GetMaster());};");
2934 gROOT->ProcessLine("alieve_online_init()");
2939 //_____________________________________________________________________________
2940 void AliReconstruction::RunAliEVE()
2942 // Runs AliEVE visualisation of
2943 // the current event.
2944 // Should be executed only after
2945 // successful initialization of AliEVE.
2947 AliInfo("Running AliEVE...");
2948 gROOT->ProcessLine(Form("AliEveEventManager::GetMaster()->SetEvent((AliRunLoader*)%p,(AliRawReader*)%p,(AliESDEvent*)%p);",fRunLoader,fRawReader,fesd));
2952 //_____________________________________________________________________________
2953 Bool_t AliReconstruction::SetRunQA(TString detAndAction)
2955 // Allows to run QA for a selected set of detectors
2956 // and a selected set of tasks among RAWS, RECPOINTS and ESDS
2957 // all selected detectors run the same selected tasks
2959 if (!detAndAction.Contains(":")) {
2960 AliError( Form("%s is a wrong syntax, use \"DetectorList:ActionList\" \n", detAndAction.Data()) ) ;
2964 Int_t colon = detAndAction.Index(":") ;
2965 fQADetectors = detAndAction(0, colon) ;
2966 if (fQADetectors.Contains("ALL") )
2967 fQADetectors = fFillESD ;
2968 fQATasks = detAndAction(colon+1, detAndAction.Sizeof() ) ;
2969 if (fQATasks.Contains("ALL") ) {
2970 fQATasks = Form("%d %d %d", AliQA::kRAWS, AliQA::kRECPOINTS, AliQA::kESDS) ;
2972 fQATasks.ToUpper() ;
2974 if ( fQATasks.Contains("RAW") )
2975 tempo = Form("%d ", AliQA::kRAWS) ;
2976 if ( fQATasks.Contains("RECPOINT") )
2977 tempo += Form("%d ", AliQA::kRECPOINTS) ;
2978 if ( fQATasks.Contains("ESD") )
2979 tempo += Form("%d ", AliQA::kESDS) ;
2981 if (fQATasks.IsNull()) {
2982 AliInfo("No QA requested\n") ;
2987 TString tempo(fQATasks) ;
2988 tempo.ReplaceAll(Form("%d", AliQA::kRAWS), AliQA::GetTaskName(AliQA::kRAWS)) ;
2989 tempo.ReplaceAll(Form("%d", AliQA::kRECPOINTS), AliQA::GetTaskName(AliQA::kRECPOINTS)) ;
2990 tempo.ReplaceAll(Form("%d", AliQA::kESDS), AliQA::GetTaskName(AliQA::kESDS)) ;
2991 AliInfo( Form("QA will be done on \"%s\" for \"%s\"\n", fQADetectors.Data(), tempo.Data()) ) ;
2996 //_____________________________________________________________________________
2997 Bool_t AliReconstruction::InitRecoParams()
2999 // The method accesses OCDB and retrieves all
3000 // the available reco-param objects from there.
3002 Bool_t isOK = kTRUE;
3004 TString detStr = fLoadCDB;
3005 for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
3007 if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
3009 if (fRecoParam.GetDetRecoParamArray(iDet)) {
3010 AliInfo(Form("Using custom reconstruction parameters for detector %s",fgkDetectorName[iDet]));
3014 AliInfo(Form("Loading reconstruction parameter objects for detector %s",fgkDetectorName[iDet]));
3016 AliCDBPath path(fgkDetectorName[iDet],"Calib","RecoParam");
3017 AliCDBEntry *entry=AliCDBManager::Instance()->Get(path.GetPath());
3019 AliWarning(Form("Couldn't find RecoParam entry in OCDB for detector %s",fgkDetectorName[iDet]));
3023 TObject *recoParamObj = entry->GetObject();
3024 if (dynamic_cast<TObjArray*>(recoParamObj)) {
3025 // The detector has a normal TobjArray of AliDetectorRecoParam objects
3026 // Registering them in AliRecoParam
3027 fRecoParam.AddDetRecoParamArray(iDet,dynamic_cast<TObjArray*>(recoParamObj));
3029 else if (dynamic_cast<AliDetectorRecoParam*>(recoParamObj)) {
3030 // The detector has only onse set of reco parameters
3031 // Registering it in AliRecoParam
3032 AliInfo(Form("Single set of reconstruction parameters found for detector %s",fgkDetectorName[iDet]));
3033 dynamic_cast<AliDetectorRecoParam*>(recoParamObj)->SetAsDefault();
3034 fRecoParam.AddDetRecoParam(iDet,dynamic_cast<AliDetectorRecoParam*>(recoParamObj));
3037 AliError(Form("No valid RecoParam object found in the OCDB for detector %s",fgkDetectorName[iDet]));
3041 AliCDBManager::Instance()->UnloadFromCache(path.GetPath());
3045 if (AliDebugLevel() > 0) fRecoParam.Print();
3050 //_____________________________________________________________________________
3051 Bool_t AliReconstruction::GetEventInfo()
3053 // Fill the event info object
3055 AliCodeTimerAuto("")
3057 AliCentralTrigger *aCTP = NULL;
3059 fEventInfo.SetEventType(fRawReader->GetType());
3061 ULong64_t mask = fRawReader->GetClassMask();
3062 fEventInfo.SetTriggerMask(mask);
3063 UInt_t clmask = fRawReader->GetDetectorPattern()[0];
3064 fEventInfo.SetTriggerCluster(AliDAQ::ListOfTriggeredDetectors(clmask));
3066 aCTP = new AliCentralTrigger();
3067 TString configstr("");
3068 if (!aCTP->LoadConfiguration(configstr)) { // Load CTP config from OCDB
3069 AliError("No trigger configuration found in OCDB! The trigger configuration information will not be used!");
3073 aCTP->SetClassMask(mask);
3074 aCTP->SetClusterMask(clmask);
3077 fEventInfo.SetEventType(AliRawEventHeaderBase::kPhysicsEvent);
3079 if (fRunLoader && (!fRunLoader->LoadTrigger())) {
3080 aCTP = fRunLoader->GetTrigger();
3081 fEventInfo.SetTriggerMask(aCTP->GetClassMask());
3082 fEventInfo.SetTriggerCluster(AliDAQ::ListOfTriggeredDetectors(aCTP->GetClusterMask()));
3085 AliWarning("No trigger can be loaded! The trigger information will not be used!");
3090 AliTriggerConfiguration *config = aCTP->GetConfiguration();
3092 AliError("No trigger configuration has been found! The trigger configuration information will not be used!");
3093 if (fRawReader) delete aCTP;
3097 UChar_t clustmask = 0;
3099 ULong64_t trmask = fEventInfo.GetTriggerMask();
3100 const TObjArray& classesArray = config->GetClasses();
3101 Int_t nclasses = classesArray.GetEntriesFast();
3102 for( Int_t iclass=0; iclass < nclasses; iclass++ ) {
3103 AliTriggerClass* trclass = (AliTriggerClass*)classesArray.At(iclass);
3105 Int_t trindex = TMath::Nint(TMath::Log2(trclass->GetMask()));
3106 fesd->SetTriggerClass(trclass->GetName(),trindex);
3107 if (fRawReader) fRawReader->LoadTriggerClass(trclass->GetName(),trindex);
3108 if (trmask & (1 << trindex)) {
3110 trclasses += trclass->GetName();
3112 clustmask |= trclass->GetCluster()->GetClusterMask();
3116 fEventInfo.SetTriggerClasses(trclasses);
3118 // Set the information in ESD
3119 fesd->SetTriggerMask(trmask);
3120 fesd->SetTriggerCluster(clustmask);
3122 if (!aCTP->CheckTriggeredDetectors()) {
3123 if (fRawReader) delete aCTP;
3127 if (fRawReader) delete aCTP;
3129 // We have to fill also the HLT decision here!!
3135 const char *AliReconstruction::MatchDetectorList(const char *detectorList, UInt_t detectorMask)
3137 // Match the detector list found in the rec.C or the default 'ALL'
3138 // to the list found in the GRP (stored there by the shuttle PP which
3139 // gets the information from ECS)
3140 static TString resultList;
3141 TString detList = detectorList;
3145 for(Int_t iDet = 0; iDet < (AliDAQ::kNDetectors-1); iDet++) {
3146 if ((detectorMask >> iDet) & 0x1) {
3147 TString det = AliDAQ::OfflineModuleName(iDet);
3148 if ((detList.CompareTo("ALL") == 0) ||
3149 detList.BeginsWith("ALL ") ||
3150 detList.EndsWith(" ALL") ||
3151 detList.Contains(" ALL ") ||
3152 (detList.CompareTo(det) == 0) ||
3153 detList.BeginsWith(det) ||
3154 detList.EndsWith(det) ||
3155 detList.Contains( " "+det+" " )) {
3156 if (!resultList.EndsWith(det + " ")) {
3165 if ((detectorMask >> AliDAQ::kHLTId) & 0x1) {
3166 TString hltDet = AliDAQ::OfflineModuleName(AliDAQ::kNDetectors-1);
3167 if ((detList.CompareTo("ALL") == 0) ||
3168 detList.BeginsWith("ALL ") ||
3169 detList.EndsWith(" ALL") ||
3170 detList.Contains(" ALL ") ||
3171 (detList.CompareTo(hltDet) == 0) ||
3172 detList.BeginsWith(hltDet) ||
3173 detList.EndsWith(hltDet) ||
3174 detList.Contains( " "+hltDet+" " )) {
3175 resultList += hltDet;
3179 return resultList.Data();
3183 //______________________________________________________________________________
3184 void AliReconstruction::Abort(const char *method, EAbort what)
3186 // Abort processing. If what = kAbortProcess, the Process() loop will be
3187 // aborted. If what = kAbortFile, the current file in a chain will be
3188 // aborted and the processing will continue with the next file, if there
3189 // is no next file then Process() will be aborted. Abort() can also be
3190 // called from Begin(), SlaveBegin(), Init() and Notify(). After abort
3191 // the SlaveTerminate() and Terminate() are always called. The abort flag
3192 // can be checked in these methods using GetAbort().
3194 // The method is overwritten in AliReconstruction for better handling of
3195 // reco specific errors
3197 if (!fStopOnError) return;
3201 TString whyMess = method;
3202 whyMess += " failed! Aborting...";
3204 AliError(whyMess.Data());
3207 TString mess = "Abort";
3208 if (fAbort == kAbortProcess)
3209 mess = "AbortProcess";
3210 else if (fAbort == kAbortFile)
3213 Info(mess, whyMess.Data());