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 <TGeoGlobalMagField.h>
117 #include <TGeoManager.h>
119 #include <TLorentzVector.h>
121 #include <TObjArray.h>
122 #include <TPRegexp.h>
123 #include <TParameter.h>
124 #include <TPluginManager.h>
126 #include <TProofOutputFile.h>
129 #include <THashTable.h>
131 #include <TMessage.h>
133 #include "AliAlignObj.h"
134 #include "AliCDBEntry.h"
135 #include "AliCDBManager.h"
136 #include "AliCDBStorage.h"
137 #include "AliCTPRawStream.h"
138 #include "AliCascadeVertexer.h"
139 #include "AliCentralTrigger.h"
140 #include "AliCodeTimer.h"
142 #include "AliDetectorRecoParam.h"
143 #include "AliESDCaloCells.h"
144 #include "AliESDCaloCluster.h"
145 #include "AliESDEvent.h"
146 #include "AliESDMuonTrack.h"
147 #include "AliESDPmdTrack.h"
148 #include "AliESDTagCreator.h"
149 #include "AliESDVertex.h"
150 #include "AliESDcascade.h"
151 #include "AliESDfriend.h"
152 #include "AliESDkink.h"
153 #include "AliESDpid.h"
154 #include "AliESDtrack.h"
155 #include "AliESDtrack.h"
156 #include "AliEventInfo.h"
157 #include "AliGRPObject.h"
158 #include "AliGRPRecoParam.h"
159 #include "AliGenEventHeader.h"
160 #include "AliGeomManager.h"
161 #include "AliGlobalQADataMaker.h"
162 #include "AliHeader.h"
165 #include "AliMultiplicity.h"
167 #include "AliPlaneEff.h"
169 #include "AliQADataMakerRec.h"
170 #include "AliQAManager.h"
171 #include "AliRawVEvent.h"
172 #include "AliRawEventHeaderBase.h"
173 #include "AliRawHLTManager.h"
174 #include "AliRawReaderDate.h"
175 #include "AliRawReaderFile.h"
176 #include "AliRawReaderRoot.h"
177 #include "AliReconstruction.h"
178 #include "AliReconstructor.h"
180 #include "AliRunInfo.h"
181 #include "AliRunLoader.h"
182 #include "AliSysInfo.h" // memory snapshots
183 #include "AliTrackPointArray.h"
184 #include "AliTracker.h"
185 #include "AliTriggerClass.h"
186 #include "AliTriggerCluster.h"
187 #include "AliTriggerIR.h"
188 #include "AliTriggerConfiguration.h"
189 #include "AliV0vertexer.h"
190 #include "AliVertexer.h"
191 #include "AliVertexerTracks.h"
193 ClassImp(AliReconstruction)
195 //_____________________________________________________________________________
196 const char* AliReconstruction::fgkDetectorName[AliReconstruction::kNDetectors] = {"ITS", "TPC", "TRD", "TOF", "PHOS", "HMPID", "EMCAL", "MUON", "FMD", "ZDC", "PMD", "T0", "VZERO", "ACORDE", "HLT"};
198 //_____________________________________________________________________________
199 AliReconstruction::AliReconstruction(const char* gAliceFilename) :
201 fRunVertexFinder(kTRUE),
202 fRunVertexFinderTracks(kTRUE),
203 fRunHLTTracking(kFALSE),
204 fRunMuonTracking(kFALSE),
206 fRunCascadeFinder(kTRUE),
207 fStopOnError(kFALSE),
208 fWriteAlignmentData(kFALSE),
209 fWriteESDfriend(kFALSE),
210 fFillTriggerESD(kTRUE),
218 fRunLocalReconstruction("ALL"),
222 fUseTrackingErrorsForAlignment(""),
223 fGAliceFileName(gAliceFilename),
229 fNumberOfEventsPerFile((UInt_t)-1),
231 fLoadAlignFromCDB(kTRUE),
232 fLoadAlignData("ALL"),
240 fParentRawReader(NULL),
244 fSPDTrackleter(NULL),
246 fDiamondProfileSPD(NULL),
247 fDiamondProfile(NULL),
248 fDiamondProfileTPC(NULL),
249 fListOfCosmicTriggers(NULL),
253 fAlignObjArray(NULL),
257 fInitCDBCalled(kFALSE),
258 fSetRunNumberFromDataCalled(kFALSE),
263 fSameQACycle(kFALSE),
264 fInitQACalled(kFALSE),
265 fWriteQAExpertData(kTRUE),
266 fRunPlaneEff(kFALSE),
275 fIsNewRunLoader(kFALSE),
279 // create reconstruction object with default parameters
282 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
283 fReconstructor[iDet] = NULL;
284 fLoader[iDet] = NULL;
285 fTracker[iDet] = NULL;
287 for (Int_t iDet = 0; iDet < AliQAv1::kNDET; iDet++) {
288 fQACycles[iDet] = 999999 ;
289 fQAWriteExpert[iDet] = kFALSE ;
295 //_____________________________________________________________________________
296 AliReconstruction::AliReconstruction(const AliReconstruction& rec) :
298 fRunVertexFinder(rec.fRunVertexFinder),
299 fRunVertexFinderTracks(rec.fRunVertexFinderTracks),
300 fRunHLTTracking(rec.fRunHLTTracking),
301 fRunMuonTracking(rec.fRunMuonTracking),
302 fRunV0Finder(rec.fRunV0Finder),
303 fRunCascadeFinder(rec.fRunCascadeFinder),
304 fStopOnError(rec.fStopOnError),
305 fWriteAlignmentData(rec.fWriteAlignmentData),
306 fWriteESDfriend(rec.fWriteESDfriend),
307 fFillTriggerESD(rec.fFillTriggerESD),
309 fCleanESD(rec.fCleanESD),
310 fV0DCAmax(rec.fV0DCAmax),
311 fV0CsPmin(rec.fV0CsPmin),
315 fRunLocalReconstruction(rec.fRunLocalReconstruction),
316 fRunTracking(rec.fRunTracking),
317 fFillESD(rec.fFillESD),
318 fLoadCDB(rec.fLoadCDB),
319 fUseTrackingErrorsForAlignment(rec.fUseTrackingErrorsForAlignment),
320 fGAliceFileName(rec.fGAliceFileName),
321 fRawInput(rec.fRawInput),
322 fESDOutput(rec.fESDOutput),
323 fEquipIdMap(rec.fEquipIdMap),
324 fFirstEvent(rec.fFirstEvent),
325 fLastEvent(rec.fLastEvent),
326 fNumberOfEventsPerFile(rec.fNumberOfEventsPerFile),
328 fLoadAlignFromCDB(rec.fLoadAlignFromCDB),
329 fLoadAlignData(rec.fLoadAlignData),
330 fUseHLTData(rec.fUseHLTData),
337 fParentRawReader(NULL),
339 fRecoParam(rec.fRecoParam),
341 fSPDTrackleter(NULL),
343 fDiamondProfileSPD(rec.fDiamondProfileSPD),
344 fDiamondProfile(rec.fDiamondProfile),
345 fDiamondProfileTPC(rec.fDiamondProfileTPC),
346 fListOfCosmicTriggers(NULL),
350 fAlignObjArray(rec.fAlignObjArray),
351 fCDBUri(rec.fCDBUri),
352 fQARefUri(rec.fQARefUri),
354 fInitCDBCalled(rec.fInitCDBCalled),
355 fSetRunNumberFromDataCalled(rec.fSetRunNumberFromDataCalled),
356 fQADetectors(rec.fQADetectors),
357 fQATasks(rec.fQATasks),
359 fRunGlobalQA(rec.fRunGlobalQA),
360 fSameQACycle(rec.fSameQACycle),
361 fInitQACalled(rec.fInitQACalled),
362 fWriteQAExpertData(rec.fWriteQAExpertData),
363 fRunPlaneEff(rec.fRunPlaneEff),
372 fIsNewRunLoader(rec.fIsNewRunLoader),
378 for (Int_t i = 0; i < rec.fOptions.GetEntriesFast(); i++) {
379 if (rec.fOptions[i]) fOptions.Add(rec.fOptions[i]->Clone());
381 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
382 fReconstructor[iDet] = NULL;
383 fLoader[iDet] = NULL;
384 fTracker[iDet] = NULL;
387 for (Int_t iDet = 0; iDet < AliQAv1::kNDET; iDet++) {
388 fQACycles[iDet] = rec.fQACycles[iDet];
389 fQAWriteExpert[iDet] = rec.fQAWriteExpert[iDet] ;
392 for (Int_t i = 0; i < rec.fSpecCDBUri.GetEntriesFast(); i++) {
393 if (rec.fSpecCDBUri[i]) fSpecCDBUri.Add(rec.fSpecCDBUri[i]->Clone());
397 //_____________________________________________________________________________
398 AliReconstruction& AliReconstruction::operator = (const AliReconstruction& rec)
400 // assignment operator
401 // Used in PROOF mode
402 // Be very careful while modifing it!
403 // Simple rules to follow:
404 // for persistent data members - use their assignment operators
405 // for non-persistent ones - do nothing or take the default values from constructor
406 // TSelector members should not be touched
407 if(&rec == this) return *this;
409 fRunVertexFinder = rec.fRunVertexFinder;
410 fRunVertexFinderTracks = rec.fRunVertexFinderTracks;
411 fRunHLTTracking = rec.fRunHLTTracking;
412 fRunMuonTracking = rec.fRunMuonTracking;
413 fRunV0Finder = rec.fRunV0Finder;
414 fRunCascadeFinder = rec.fRunCascadeFinder;
415 fStopOnError = rec.fStopOnError;
416 fWriteAlignmentData = rec.fWriteAlignmentData;
417 fWriteESDfriend = rec.fWriteESDfriend;
418 fFillTriggerESD = rec.fFillTriggerESD;
420 fCleanESD = rec.fCleanESD;
421 fV0DCAmax = rec.fV0DCAmax;
422 fV0CsPmin = rec.fV0CsPmin;
426 fRunLocalReconstruction = rec.fRunLocalReconstruction;
427 fRunTracking = rec.fRunTracking;
428 fFillESD = rec.fFillESD;
429 fLoadCDB = rec.fLoadCDB;
430 fUseTrackingErrorsForAlignment = rec.fUseTrackingErrorsForAlignment;
431 fGAliceFileName = rec.fGAliceFileName;
432 fRawInput = rec.fRawInput;
433 fESDOutput = rec.fESDOutput;
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 fUseHLTData = rec.fUseHLTData;
447 delete fRunInfo; fRunInfo = NULL;
448 if (rec.fRunInfo) fRunInfo = new AliRunInfo(*rec.fRunInfo);
450 fEventInfo = rec.fEventInfo;
452 delete fRunScalers; fRunScalers = NULL;
453 if (rec.fRunScalers) fRunScalers = new AliTriggerRunScalers(*rec.fRunScalers);
458 fParentRawReader = NULL;
460 fRecoParam = rec.fRecoParam;
462 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
463 delete fReconstructor[iDet]; fReconstructor[iDet] = NULL;
464 delete fLoader[iDet]; fLoader[iDet] = NULL;
465 delete fTracker[iDet]; fTracker[iDet] = NULL;
468 for (Int_t iDet = 0; iDet < AliQAv1::kNDET; iDet++) {
469 fQACycles[iDet] = rec.fQACycles[iDet];
470 fQAWriteExpert[iDet] = rec.fQAWriteExpert[iDet] ;
473 delete fSPDTrackleter; fSPDTrackleter = NULL;
475 delete fDiamondProfileSPD; fDiamondProfileSPD = NULL;
476 if (rec.fDiamondProfileSPD) fDiamondProfileSPD = new AliESDVertex(*rec.fDiamondProfileSPD);
477 delete fDiamondProfile; fDiamondProfile = NULL;
478 if (rec.fDiamondProfile) fDiamondProfile = new AliESDVertex(*rec.fDiamondProfile);
479 delete fDiamondProfileTPC; fDiamondProfileTPC = NULL;
480 if (rec.fDiamondProfileTPC) fDiamondProfileTPC = new AliESDVertex(*rec.fDiamondProfileTPC);
482 delete fListOfCosmicTriggers; fListOfCosmicTriggers = NULL;
483 if (rec.fListOfCosmicTriggers) fListOfCosmicTriggers = (THashTable*)((rec.fListOfCosmicTriggers)->Clone());
485 delete fGRPData; fGRPData = NULL;
486 // if (rec.fGRPData) fGRPData = (TMap*)((rec.fGRPData)->Clone());
487 if (rec.fGRPData) fGRPData = (AliGRPObject*)((rec.fGRPData)->Clone());
489 delete fAlignObjArray; fAlignObjArray = NULL;
492 fQARefUri = rec.fQARefUri;
493 fSpecCDBUri.Delete();
494 fInitCDBCalled = rec.fInitCDBCalled;
495 fSetRunNumberFromDataCalled = rec.fSetRunNumberFromDataCalled;
496 fQADetectors = rec.fQADetectors;
497 fQATasks = rec.fQATasks;
499 fRunGlobalQA = rec.fRunGlobalQA;
500 fSameQACycle = rec.fSameQACycle;
501 fInitQACalled = rec.fInitQACalled;
502 fWriteQAExpertData = rec.fWriteQAExpertData;
503 fRunPlaneEff = rec.fRunPlaneEff;
512 fIsNewRunLoader = rec.fIsNewRunLoader;
519 //_____________________________________________________________________________
520 AliReconstruction::~AliReconstruction()
525 if (fListOfCosmicTriggers) {
526 fListOfCosmicTriggers->Delete();
527 delete fListOfCosmicTriggers;
532 if (fAlignObjArray) {
533 fAlignObjArray->Delete();
534 delete fAlignObjArray;
536 fSpecCDBUri.Delete();
538 AliCodeTimer::Instance()->Print();
541 //_____________________________________________________________________________
542 void AliReconstruction::InitQA()
544 //Initialize the QA and start of cycle
545 AliCodeTimerAuto("");
547 if (fInitQACalled) return;
548 fInitQACalled = kTRUE;
550 AliQAManager * qam = AliQAManager::QAManager(AliQAv1::kRECMODE) ;
551 if (fWriteQAExpertData)
552 qam->SetWriteExpert() ;
554 if (qam->IsDefaultStorageSet()) {
555 AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
556 AliWarning("Default QA reference storage has been already set !");
557 AliWarning(Form("Ignoring the default storage declared in AliReconstruction: %s",fQARefUri.Data()));
558 AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
559 fQARefUri = qam->GetDefaultStorage()->GetURI();
561 if (fQARefUri.Length() > 0) {
562 AliDebug(2,"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
563 AliDebug(2, Form("Default QA reference storage is set to: %s", fQARefUri.Data()));
564 AliDebug(2, "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
566 fQARefUri="local://$ALICE_ROOT/QAref";
567 AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
568 AliWarning("Default QA refeference storage not yet set !!!!");
569 AliWarning(Form("Setting it now to: %s", fQARefUri.Data()));
570 AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
573 qam->SetDefaultStorage(fQARefUri);
577 qam->SetActiveDetectors(fQADetectors) ;
578 for (Int_t det = 0 ; det < AliQAv1::kNDET ; det++) {
579 qam->SetCycleLength(AliQAv1::DETECTORINDEX_t(det), fQACycles[det]) ;
580 qam->SetWriteExpert(AliQAv1::DETECTORINDEX_t(det)) ;
582 if (!fRawReader && !fInput && fQATasks.Contains(AliQAv1::kRAWS))
583 fQATasks.ReplaceAll(Form("%d",AliQAv1::kRAWS), "") ;
584 qam->SetTasks(fQATasks) ;
585 qam->InitQADataMaker(AliCDBManager::Instance()->GetRun()) ;
588 Bool_t sameCycle = kFALSE ;
589 AliQADataMaker *qadm = qam->GetQADataMaker(AliQAv1::kGLOBAL);
590 AliInfo(Form("Initializing the global QA data maker"));
591 if (fQATasks.Contains(Form("%d", AliQAv1::kRECPOINTS))) {
592 qadm->StartOfCycle(AliQAv1::kRECPOINTS, AliCDBManager::Instance()->GetRun(), sameCycle) ;
593 TObjArray **arr=qadm->Init(AliQAv1::kRECPOINTS);
594 AliTracker::SetResidualsArray(arr);
597 if (fQATasks.Contains(Form("%d", AliQAv1::kESDS))) {
598 qadm->StartOfCycle(AliQAv1::kESDS, AliCDBManager::Instance()->GetRun(), sameCycle) ;
599 qadm->Init(AliQAv1::kESDS);
602 AliSysInfo::AddStamp("InitQA") ;
605 //_____________________________________________________________________________
606 void AliReconstruction::MergeQA(const char *fileName)
608 //Initialize the QA and start of cycle
609 AliCodeTimerAuto("") ;
610 AliQAManager::QAManager()->Merge(AliCDBManager::Instance()->GetRun(),fileName) ;
611 AliSysInfo::AddStamp("MergeQA") ;
614 //_____________________________________________________________________________
615 void AliReconstruction::InitCDB()
617 // activate a default CDB storage
618 // First check if we have any CDB storage set, because it is used
619 // to retrieve the calibration and alignment constants
620 AliCodeTimerAuto("");
622 if (fInitCDBCalled) return;
623 fInitCDBCalled = kTRUE;
625 AliCDBManager* man = AliCDBManager::Instance();
626 if (man->IsDefaultStorageSet())
628 AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
629 AliWarning("Default CDB storage has been already set !");
630 AliWarning(Form("Ignoring the default storage declared in AliReconstruction: %s",fCDBUri.Data()));
631 AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
632 fCDBUri = man->GetDefaultStorage()->GetURI();
635 if (fCDBUri.Length() > 0)
637 AliDebug(2,"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
638 AliDebug(2, Form("Default CDB storage is set to: %s", fCDBUri.Data()));
639 AliDebug(2, "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
641 fCDBUri="local://$ALICE_ROOT/OCDB";
642 AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
643 AliWarning("Default CDB storage not yet set !!!!");
644 AliWarning(Form("Setting it now to: %s", fCDBUri.Data()));
645 AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
648 man->SetDefaultStorage(fCDBUri);
651 // Now activate the detector specific CDB storage locations
652 for (Int_t i = 0; i < fSpecCDBUri.GetEntriesFast(); i++) {
653 TObject* obj = fSpecCDBUri[i];
655 AliDebug(2, "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
656 AliDebug(2, Form("Specific CDB storage for %s is set to: %s",obj->GetName(),obj->GetTitle()));
657 AliDebug(2, "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
658 man->SetSpecificStorage(obj->GetName(), obj->GetTitle());
660 AliSysInfo::AddStamp("InitCDB");
663 //_____________________________________________________________________________
664 void AliReconstruction::SetDefaultStorage(const char* uri) {
665 // Store the desired default CDB storage location
666 // Activate it later within the Run() method
672 //_____________________________________________________________________________
673 void AliReconstruction::SetQARefDefaultStorage(const char* uri) {
674 // Store the desired default CDB storage location
675 // Activate it later within the Run() method
678 AliQAv1::SetQARefStorage(fQARefUri.Data()) ;
681 //_____________________________________________________________________________
682 void AliReconstruction::SetSpecificStorage(const char* calibType, const char* uri) {
683 // Store a detector-specific CDB storage location
684 // Activate it later within the Run() method
686 AliCDBPath aPath(calibType);
687 if(!aPath.IsValid()){
688 // if calibType is not wildcard but it is a valid detector, add "/*" to make it a valid path
689 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
690 if(!strcmp(calibType, fgkDetectorName[iDet])) {
691 aPath.SetPath(Form("%s/*", calibType));
692 AliInfo(Form("Path for specific storage set to %s", aPath.GetPath().Data()));
696 if(!aPath.IsValid()){
697 AliError(Form("Not a valid path or detector: %s", calibType));
702 // // check that calibType refers to a "valid" detector name
703 // Bool_t isDetector = kFALSE;
704 // for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
705 // TString detName = fgkDetectorName[iDet];
706 // if(aPath.GetLevel0() == detName) {
707 // isDetector = kTRUE;
713 // AliError(Form("Not a valid detector: %s", aPath.GetLevel0().Data()));
717 TObject* obj = fSpecCDBUri.FindObject(aPath.GetPath().Data());
718 if (obj) fSpecCDBUri.Remove(obj);
719 fSpecCDBUri.Add(new TNamed(aPath.GetPath().Data(), uri));
723 //_____________________________________________________________________________
724 Bool_t AliReconstruction::SetRunNumberFromData()
726 // The method is called in Run() in order
727 // to set a correct run number.
728 // In case of raw data reconstruction the
729 // run number is taken from the raw data header
731 if (fSetRunNumberFromDataCalled) return kTRUE;
732 fSetRunNumberFromDataCalled = kTRUE;
734 AliCDBManager* man = AliCDBManager::Instance();
737 if(fRawReader->NextEvent()) {
738 if(man->GetRun() > 0) {
739 AliWarning("Run number is taken from raw-event header! Ignoring settings in AliCDBManager!");
741 man->SetRun(fRawReader->GetRunNumber());
742 fRawReader->RewindEvents();
745 if(man->GetRun() > 0) {
746 AliWarning("No raw-data events are found ! Using settings in AliCDBManager !");
749 AliWarning("Neither raw events nor settings in AliCDBManager are found !");
755 AliRunLoader *rl = AliRunLoader::Open(fGAliceFileName.Data());
757 AliError(Form("No run loader found in file %s", fGAliceFileName.Data()));
762 // read run number from gAlice
763 if(rl->GetHeader()) {
764 man->SetRun(rl->GetHeader()->GetRun());
769 AliError("Neither run-loader header nor RawReader objects are found !");
781 //_____________________________________________________________________________
782 void AliReconstruction::SetCDBLock() {
783 // Set CDB lock: from now on it is forbidden to reset the run number
784 // or the default storage or to activate any further storage!
786 AliCDBManager::Instance()->SetLock(1);
789 //_____________________________________________________________________________
790 Bool_t AliReconstruction::MisalignGeometry(const TString& detectors)
792 // Read the alignment objects from CDB.
793 // Each detector is supposed to have the
794 // alignment objects in DET/Align/Data CDB path.
795 // All the detector objects are then collected,
796 // sorted by geometry level (starting from ALIC) and
797 // then applied to the TGeo geometry.
798 // Finally an overlaps check is performed.
800 // Load alignment data from CDB and fill fAlignObjArray
801 if(fLoadAlignFromCDB){
803 TString detStr = detectors;
804 TString loadAlObjsListOfDets = "";
806 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
807 if(!IsSelected(fgkDetectorName[iDet], detStr)) continue;
808 if(!strcmp(fgkDetectorName[iDet],"HLT")) continue;
810 if(AliGeomManager::GetNalignable(fgkDetectorName[iDet]) != 0)
812 loadAlObjsListOfDets += fgkDetectorName[iDet];
813 loadAlObjsListOfDets += " ";
815 } // end loop over detectors
817 if(AliGeomManager::GetNalignable("GRP") != 0)
818 loadAlObjsListOfDets.Prepend("GRP "); //add alignment objects for non-sensitive modules
819 AliGeomManager::ApplyAlignObjsFromCDB(loadAlObjsListOfDets.Data());
820 AliCDBManager::Instance()->UnloadFromCache("*/Align/*");
822 // Check if the array with alignment objects was
823 // provided by the user. If yes, apply the objects
824 // to the present TGeo geometry
825 if (fAlignObjArray) {
826 if (gGeoManager && gGeoManager->IsClosed()) {
827 if (AliGeomManager::ApplyAlignObjsToGeom(*fAlignObjArray) == kFALSE) {
828 AliError("The misalignment of one or more volumes failed!"
829 "Compare the list of simulated detectors and the list of detector alignment data!");
834 AliError("Can't apply the misalignment! gGeoManager doesn't exist or it is still opened!");
840 if (fAlignObjArray) {
841 fAlignObjArray->Delete();
842 delete fAlignObjArray; fAlignObjArray=NULL;
848 //_____________________________________________________________________________
849 void AliReconstruction::SetGAliceFile(const char* fileName)
851 // set the name of the galice file
853 fGAliceFileName = fileName;
856 //_____________________________________________________________________________
857 void AliReconstruction::SetInput(const char* input)
859 // In case the input string starts with 'mem://', we run in an online mode
860 // and AliRawReaderDateOnline object is created. In all other cases a raw-data
861 // file is assumed. One can give as an input:
862 // mem://: - events taken from DAQ monitoring libs online
864 // mem://<filename> - emulation of the above mode (via DATE monitoring libs)
865 if (input) fRawInput = input;
868 //_____________________________________________________________________________
869 void AliReconstruction::SetOutput(const char* output)
871 // Set the output ESD filename
872 // 'output' is a normalt ROOT url
873 // The method is used in case of raw-data reco with PROOF
874 if (output) fESDOutput.SetUrl(output);
877 //_____________________________________________________________________________
878 void AliReconstruction::SetOption(const char* detector, const char* option)
880 // set options for the reconstruction of a detector
882 TObject* obj = fOptions.FindObject(detector);
883 if (obj) fOptions.Remove(obj);
884 fOptions.Add(new TNamed(detector, option));
887 //_____________________________________________________________________________
888 void AliReconstruction::SetRecoParam(const char* detector, AliDetectorRecoParam *par)
890 // Set custom reconstruction parameters for a given detector
891 // Single set of parameters for all the events
893 // First check if the reco-params are global
894 if(!strcmp(detector, "GRP")) {
896 fRecoParam.AddDetRecoParam(kNDetectors,par);
900 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
901 if(!strcmp(detector, fgkDetectorName[iDet])) {
903 fRecoParam.AddDetRecoParam(iDet,par);
910 //_____________________________________________________________________________
911 Bool_t AliReconstruction::SetFieldMap(Float_t l3Cur, Float_t diCur, Float_t l3Pol,
912 Float_t diPol, Int_t convention, Bool_t uniform,
913 Float_t beamenergy, const Char_t *beamtype, const Char_t *path)
915 //------------------------------------------------
916 // The magnetic field map, defined externally...
917 // L3 current 30000 A -> 0.5 T
918 // L3 current 12000 A -> 0.2 T
919 // dipole current 6000 A
920 // The polarities must match the convention (LHC or DCS2008)
921 // unless the special uniform map was used for MC
922 //------------------------------------------------
923 const Float_t l3NominalCurrent1=30000.; // (A)
924 const Float_t l3NominalCurrent2=12000.; // (A)
925 const Float_t diNominalCurrent =6000. ; // (A)
927 const Float_t tolerance=0.03; // relative current tolerance
928 const Float_t zero=77.; // "zero" current (A)
933 l3Cur = TMath::Abs(l3Cur);
934 diCur = TMath::Abs(diCur);
936 if (TMath::Abs((sclDip=diCur/diNominalCurrent)-1.) > tolerance && !uniform) {
937 if (diCur <= zero) sclDip = 0.; // some small current.. -> Dipole OFF
939 AliError(Form("Wrong dipole current (%f A)!",diCur));
945 // special treatment of special MC with uniform mag field (normalized to 0.5 T)
946 // no check for scaling/polarities are done
947 map = AliMagF::k5kGUniform;
948 sclL3 = l3Cur/l3NominalCurrent1;
951 if (TMath::Abs((sclL3=l3Cur/l3NominalCurrent1)-1.) < tolerance) map = AliMagF::k5kG;
952 else if (TMath::Abs((sclL3=l3Cur/l3NominalCurrent2)-1.) < tolerance) map = AliMagF::k2kG;
953 else if (l3Cur <= zero) { sclL3 = 0; map = AliMagF::k5kGUniform;}
955 AliError(Form("Wrong L3 current (%f A)!",l3Cur));
960 if (sclDip!=0 && (map==AliMagF::k5kG || map==AliMagF::k2kG) &&
961 ((convention==AliMagF::kConvLHC && l3Pol!=diPol) ||
962 (convention==AliMagF::kConvDCS2008 && l3Pol==diPol)) ) {
963 AliError(Form("Wrong combination for L3/Dipole polarities (%c/%c) in %s convention",
964 l3Pol>0?'+':'-',diPol>0?'+':'-',convention==AliMagF::kConvDCS2008?"DCS2008":"LHC"));
968 if (l3Pol<0) sclL3 = -sclL3;
969 if (diPol<0) sclDip = -sclDip;
971 AliMagF::BeamType_t btype = AliMagF::kNoBeamField;
972 TString btypestr = beamtype;
974 TPRegexp protonBeam("(proton|p)\\s*-?\\s*\\1");
975 TPRegexp ionBeam("(lead|pb|ion|a)\\s*-?\\s*\\1");
976 if (btypestr.Contains(ionBeam)) btype = AliMagF::kBeamTypeAA;
977 else if (btypestr.Contains(protonBeam)) btype = AliMagF::kBeamTypepp;
978 else AliInfo(Form("Assume no LHC magnet field for the beam type %s, ",beamtype));
981 sprintf(ttl,"L3: %+5d Dip: %+4d kA; %s | Polarities in %s convention",(int)TMath::Sign(l3Cur,float(sclL3)),
982 (int)TMath::Sign(diCur,float(sclDip)),uniform ? " Constant":"",
983 convention==AliMagF::kConvLHC ? "LHC":"DCS2008");
984 // LHC and DCS08 conventions have opposite dipole polarities
985 if ( AliMagF::GetPolarityConvention() != convention) sclDip = -sclDip;
987 AliMagF* fld = new AliMagF("MagneticFieldMap", ttl, 2, sclL3, sclDip, 10., map, path,
989 TGeoGlobalMagField::Instance()->SetField( fld );
990 TGeoGlobalMagField::Instance()->Lock();
995 Bool_t AliReconstruction::InitGRP() {
996 //------------------------------------
997 // Initialization of the GRP entry
998 //------------------------------------
999 AliCDBEntry* entry = AliCDBManager::Instance()->Get("GRP/GRP/Data");
1003 TMap* m = dynamic_cast<TMap*>(entry->GetObject()); // old GRP entry
1006 AliInfo("Found a TMap in GRP/GRP/Data, converting it into an AliGRPObject");
1008 fGRPData = new AliGRPObject();
1009 fGRPData->ReadValuesFromMap(m);
1013 AliInfo("Found an AliGRPObject in GRP/GRP/Data, reading it");
1014 fGRPData = dynamic_cast<AliGRPObject*>(entry->GetObject()); // new GRP entry
1018 // FIX ME: The unloading of GRP entry is temporarily disabled
1019 // because ZDC and VZERO are using it in order to initialize
1020 // their reconstructor objects. In the future one has to think
1021 // of propagating AliRunInfo to the reconstructors.
1022 // AliCDBManager::Instance()->UnloadFromCache("GRP/GRP/Data");
1026 AliError("No GRP entry found in OCDB!");
1030 TString lhcState = fGRPData->GetLHCState();
1031 if (lhcState==AliGRPObject::GetInvalidString()) {
1032 AliError("GRP/GRP/Data entry: missing value for the LHC state ! Using UNKNOWN");
1033 lhcState = "UNKNOWN";
1036 TString beamType = fGRPData->GetBeamType();
1037 if (beamType==AliGRPObject::GetInvalidString()) {
1038 AliError("GRP/GRP/Data entry: missing value for the beam type ! Using UNKNOWN");
1039 beamType = "UNKNOWN";
1042 Float_t beamEnergy = fGRPData->GetBeamEnergy();
1043 if (beamEnergy==AliGRPObject::GetInvalidFloat()) {
1044 AliError("GRP/GRP/Data entry: missing value for the beam energy ! Using 0");
1047 // LHC: "multiply by 120 to get the energy in MeV"
1048 beamEnergy *= 0.120;
1050 TString runType = fGRPData->GetRunType();
1051 if (runType==AliGRPObject::GetInvalidString()) {
1052 AliError("GRP/GRP/Data entry: missing value for the run type ! Using UNKNOWN");
1053 runType = "UNKNOWN";
1056 Int_t activeDetectors = fGRPData->GetDetectorMask();
1057 if (activeDetectors==AliGRPObject::GetInvalidUInt()) {
1058 AliError("GRP/GRP/Data entry: missing value for the detector mask ! Using 1074790399");
1059 activeDetectors = 1074790399;
1062 fRunInfo = new AliRunInfo(lhcState, beamType, beamEnergy, runType, activeDetectors);
1066 // Process the list of active detectors
1067 if (activeDetectors) {
1068 UInt_t detMask = activeDetectors;
1069 fRunLocalReconstruction = MatchDetectorList(fRunLocalReconstruction,detMask);
1070 fRunTracking = MatchDetectorList(fRunTracking,detMask);
1071 fFillESD = MatchDetectorList(fFillESD,detMask);
1072 fQADetectors = MatchDetectorList(fQADetectors,detMask);
1073 fLoadCDB.Form("%s %s %s %s",
1074 fRunLocalReconstruction.Data(),
1075 fRunTracking.Data(),
1077 fQADetectors.Data());
1078 fLoadCDB = MatchDetectorList(fLoadCDB,detMask);
1079 if (!((detMask >> AliDAQ::DetectorID("ITSSPD")) & 0x1)) {
1080 // switch off the vertexer
1081 AliInfo("SPD is not in the list of active detectors. Vertexer switched off.");
1082 fRunVertexFinder = kFALSE;
1084 if (!((detMask >> AliDAQ::DetectorID("TRG")) & 0x1)) {
1085 // switch off the reading of CTP raw-data payload
1086 if (fFillTriggerESD) {
1087 AliInfo("CTP is not in the list of active detectors. CTP data reading switched off.");
1088 fFillTriggerESD = kFALSE;
1093 AliInfo("===================================================================================");
1094 AliInfo(Form("Running local reconstruction for detectors: %s",fRunLocalReconstruction.Data()));
1095 AliInfo(Form("Running tracking for detectors: %s",fRunTracking.Data()));
1096 AliInfo(Form("Filling ESD for detectors: %s",fFillESD.Data()));
1097 AliInfo(Form("Quality assurance is active for detectors: %s",fQADetectors.Data()));
1098 AliInfo(Form("CDB and reconstruction parameters are loaded for detectors: %s",fLoadCDB.Data()));
1099 AliInfo("===================================================================================");
1101 //*** Dealing with the magnetic field map
1102 if ( TGeoGlobalMagField::Instance()->IsLocked() ) {
1103 if (TGeoGlobalMagField::Instance()->GetField()->TestBit(AliMagF::kOverrideGRP)) {
1104 AliInfo("ExpertMode!!! GRP information will be ignored !");
1105 AliInfo("ExpertMode!!! Running with the externally locked B field !");
1108 AliInfo("Destroying existing B field instance!");
1109 delete TGeoGlobalMagField::Instance();
1112 if ( !TGeoGlobalMagField::Instance()->IsLocked() ) {
1113 // Construct the field map out of the information retrieved from GRP.
1116 Float_t l3Current = fGRPData->GetL3Current((AliGRPObject::Stats)0);
1117 if (l3Current == AliGRPObject::GetInvalidFloat()) {
1118 AliError("GRP/GRP/Data entry: missing value for the L3 current !");
1122 Char_t l3Polarity = fGRPData->GetL3Polarity();
1123 if (l3Polarity == AliGRPObject::GetInvalidChar()) {
1124 AliError("GRP/GRP/Data entry: missing value for the L3 polarity !");
1129 Float_t diCurrent = fGRPData->GetDipoleCurrent((AliGRPObject::Stats)0);
1130 if (diCurrent == AliGRPObject::GetInvalidFloat()) {
1131 AliError("GRP/GRP/Data entry: missing value for the dipole current !");
1135 Char_t diPolarity = fGRPData->GetDipolePolarity();
1136 if (diPolarity == AliGRPObject::GetInvalidChar()) {
1137 AliError("GRP/GRP/Data entry: missing value for the dipole polarity !");
1141 // read special bits for the polarity convention and map type
1142 Int_t polConvention = fGRPData->IsPolarityConventionLHC() ? AliMagF::kConvLHC : AliMagF::kConvDCS2008;
1143 Bool_t uniformB = fGRPData->IsUniformBMap();
1146 if ( !SetFieldMap(l3Current, diCurrent, l3Polarity ? -1:1, diPolarity ? -1:1,
1147 polConvention,uniformB,beamEnergy, beamType.Data()))
1148 AliFatal("Failed to creat a B field map ! Exiting...");
1149 AliInfo("Running with the B field constructed out of GRP !");
1151 else AliFatal("B field is neither set nor constructed from GRP ! Exitig...");
1154 //*** Get the diamond profiles from OCDB
1155 entry = AliCDBManager::Instance()->Get("GRP/Calib/MeanVertexSPD");
1157 fDiamondProfileSPD = dynamic_cast<AliESDVertex*> (entry->GetObject());
1159 AliError("No SPD diamond profile found in OCDB!");
1162 entry = AliCDBManager::Instance()->Get("GRP/Calib/MeanVertex");
1164 fDiamondProfile = dynamic_cast<AliESDVertex*> (entry->GetObject());
1166 AliError("No diamond profile found in OCDB!");
1169 entry = AliCDBManager::Instance()->Get("GRP/Calib/MeanVertexTPC");
1171 fDiamondProfileTPC = dynamic_cast<AliESDVertex*> (entry->GetObject());
1173 AliError("No TPC diamond profile found in OCDB!");
1176 entry = AliCDBManager::Instance()->Get("GRP/Calib/CosmicTriggers");
1178 fListOfCosmicTriggers = dynamic_cast<THashTable*>(entry->GetObject());
1180 AliCDBManager::Instance()->UnloadFromCache("GRP/Calib/CosmicTriggers");
1183 if (!fListOfCosmicTriggers) {
1184 AliWarning("Can not get list of cosmic triggers from OCDB! Cosmic event specie will be effectively disabled!");
1190 //_____________________________________________________________________________
1191 Bool_t AliReconstruction::LoadCDB()
1193 AliCodeTimerAuto("");
1195 AliCDBManager::Instance()->Get("GRP/CTP/Config");
1197 TString detStr = fLoadCDB;
1198 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
1199 if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
1200 AliCDBManager::Instance()->GetAll(Form("%s/Calib/*",fgkDetectorName[iDet]));
1204 //_____________________________________________________________________________
1205 Bool_t AliReconstruction::LoadTriggerScalersCDB()
1207 AliCodeTimerAuto("");
1209 AliCDBEntry* entry = AliCDBManager::Instance()->Get("GRP/CTP/Scalers");
1213 AliInfo("Found an AliTriggerRunScalers in GRP/CTP/Scalers, reading it");
1214 fRunScalers = dynamic_cast<AliTriggerRunScalers*> (entry->GetObject());
1216 if (fRunScalers->CorrectScalersOverflow() == 0) AliInfo("32bit Trigger counters corrected for overflow");
1221 //_____________________________________________________________________________
1222 Bool_t AliReconstruction::Run(const char* input)
1225 AliCodeTimerAuto("");
1228 if (GetAbort() != TSelector::kContinue) return kFALSE;
1230 TChain *chain = NULL;
1231 if (fRawReader && (chain = fRawReader->GetChain())) {
1232 Long64_t nEntries = (fLastEvent < 0) ? (TChain::kBigNumber) : (fLastEvent - fFirstEvent + 1);
1237 gProof->Exec("TGrid::Connect(\"alien://\")",kTRUE);
1239 TMessage::EnableSchemaEvolutionForAll(kTRUE);
1240 gProof->Exec("TMessage::EnableSchemaEvolutionForAll(kTRUE)",kTRUE);
1242 gProof->AddInput(this);
1243 if (!fESDOutput.IsValid()) {
1244 fESDOutput.SetProtocol("root",kTRUE);
1245 fESDOutput.SetHost(gSystem->HostName());
1246 fESDOutput.SetFile(Form("%s/AliESDs.root",gSystem->pwd()));
1248 AliInfo(Form("Output file with ESDs is %s",fESDOutput.GetUrl()));
1249 gProof->AddInput(new TNamed("PROOF_OUTPUTFILE",fESDOutput.GetUrl()));
1250 gProof->SetParameter("PROOF_MaxSlavesPerNode", 9999);
1252 chain->Process("AliReconstruction","",nEntries,fFirstEvent);
1255 chain->Process(this,"",nEntries,fFirstEvent);
1260 if (GetAbort() != TSelector::kContinue) return kFALSE;
1262 if (GetAbort() != TSelector::kContinue) return kFALSE;
1263 //******* The loop over events
1264 AliInfo("Starting looping over events");
1266 while ((iEvent < fRunLoader->GetNumberOfEvents()) ||
1267 (fRawReader && fRawReader->NextEvent())) {
1268 if (!ProcessEvent(iEvent)) {
1269 Abort("ProcessEvent",TSelector::kAbortFile);
1275 if (GetAbort() != TSelector::kContinue) return kFALSE;
1277 if (GetAbort() != TSelector::kContinue) return kFALSE;
1283 //_____________________________________________________________________________
1284 void AliReconstruction::InitRawReader(const char* input)
1286 AliCodeTimerAuto("");
1288 // Init raw-reader and
1289 // set the input in case of raw data
1290 if (input) fRawInput = input;
1291 fRawReader = AliRawReader::Create(fRawInput.Data());
1293 AliInfo("Reconstruction will run over digits");
1295 if (!fEquipIdMap.IsNull() && fRawReader)
1296 fRawReader->LoadEquipmentIdsMap(fEquipIdMap);
1298 if (!fUseHLTData.IsNull()) {
1299 // create the RawReaderHLT which performs redirection of HLT input data for
1300 // the specified detectors
1301 AliRawReader* pRawReader=AliRawHLTManager::CreateRawReaderHLT(fRawReader, fUseHLTData.Data());
1303 fParentRawReader=fRawReader;
1304 fRawReader=pRawReader;
1306 AliError(Form("can not create Raw Reader for HLT input %s", fUseHLTData.Data()));
1309 AliSysInfo::AddStamp("CreateRawReader");
1312 //_____________________________________________________________________________
1313 void AliReconstruction::InitRun(const char* input)
1315 // Initialization of raw-reader,
1316 // run number, CDB etc.
1317 AliCodeTimerAuto("");
1318 AliSysInfo::AddStamp("Start");
1320 // Initialize raw-reader if any
1321 InitRawReader(input);
1323 // Initialize the CDB storage
1326 // Set run number in CDBManager (if it is not already set by the user)
1327 if (!SetRunNumberFromData()) {
1328 Abort("SetRunNumberFromData", TSelector::kAbortProcess);
1332 // Set CDB lock: from now on it is forbidden to reset the run number
1333 // or the default storage or to activate any further storage!
1338 //_____________________________________________________________________________
1339 void AliReconstruction::Begin(TTree *)
1341 // Initialize AlReconstruction before
1342 // going into the event loop
1343 // Should follow the TSelector convention
1344 // i.e. initialize only the object on the client side
1345 AliCodeTimerAuto("");
1347 AliReconstruction *reco = NULL;
1349 if ((reco = (AliReconstruction*)fInput->FindObject("AliReconstruction"))) {
1352 AliSysInfo::AddStamp("ReadInputInBegin");
1355 // Import ideal TGeo geometry and apply misalignment
1357 TString geom(gSystem->DirName(fGAliceFileName));
1358 geom += "/geometry.root";
1359 AliGeomManager::LoadGeometry(geom.Data());
1361 Abort("LoadGeometry", TSelector::kAbortProcess);
1364 AliSysInfo::AddStamp("LoadGeom");
1365 TString detsToCheck=fRunLocalReconstruction;
1366 if(!AliGeomManager::CheckSymNamesLUT(detsToCheck.Data())) {
1367 Abort("CheckSymNamesLUT", TSelector::kAbortProcess);
1370 AliSysInfo::AddStamp("CheckGeom");
1373 if (!MisalignGeometry(fLoadAlignData)) {
1374 Abort("MisalignGeometry", TSelector::kAbortProcess);
1377 AliCDBManager::Instance()->UnloadFromCache("GRP/Geometry/Data");
1378 AliSysInfo::AddStamp("MisalignGeom");
1381 Abort("InitGRP", TSelector::kAbortProcess);
1384 AliSysInfo::AddStamp("InitGRP");
1387 Abort("LoadCDB", TSelector::kAbortProcess);
1390 AliSysInfo::AddStamp("LoadCDB");
1392 if (!LoadTriggerScalersCDB()) {
1393 Abort("LoadTriggerScalersCDB", TSelector::kAbortProcess);
1396 AliSysInfo::AddStamp("LoadTriggerScalersCDB");
1399 // Read the reconstruction parameters from OCDB
1400 if (!InitRecoParams()) {
1401 AliWarning("Not all detectors have correct RecoParam objects initialized");
1403 AliSysInfo::AddStamp("InitRecoParams");
1405 if (fInput && gProof) {
1406 if (reco) *reco = *this;
1408 gProof->AddInputData(gGeoManager,kTRUE);
1410 gProof->AddInputData(const_cast<TMap*>(AliCDBManager::Instance()->GetEntryCache()),kTRUE);
1411 fInput->Add(new TParameter<Int_t>("RunNumber",AliCDBManager::Instance()->GetRun()));
1412 AliMagF *magFieldMap = (AliMagF*)TGeoGlobalMagField::Instance()->GetField();
1413 magFieldMap->SetName("MagneticFieldMap");
1414 gProof->AddInputData(magFieldMap,kTRUE);
1419 //_____________________________________________________________________________
1420 void AliReconstruction::SlaveBegin(TTree*)
1422 // Initialization related to run-loader,
1423 // vertexer, trackers, recontructors
1424 // In proof mode it is executed on the slave
1425 AliCodeTimerAuto("");
1427 TProofOutputFile *outProofFile = NULL;
1429 if (AliReconstruction *reco = (AliReconstruction*)fInput->FindObject("AliReconstruction")) {
1432 if (TGeoManager *tgeo = (TGeoManager*)fInput->FindObject("Geometry")) {
1434 AliGeomManager::SetGeometry(tgeo);
1436 if (TMap *entryCache = (TMap*)fInput->FindObject("CDBEntryCache")) {
1437 Int_t runNumber = -1;
1438 if (TProof::GetParameter(fInput,"RunNumber",runNumber) == 0) {
1439 AliCDBManager *man = AliCDBManager::Instance(entryCache,runNumber);
1440 man->SetCacheFlag(kTRUE);
1441 man->SetLock(kTRUE);
1445 if (AliMagF *map = (AliMagF*)fInput->FindObject("MagneticFieldMap")) {
1446 TGeoGlobalMagField::Instance()->SetField(map);
1448 if (TNamed *outputFileName = (TNamed *) fInput->FindObject("PROOF_OUTPUTFILE")) {
1449 outProofFile = new TProofOutputFile(gSystem->BaseName(TUrl(outputFileName->GetTitle()).GetFile()));
1450 outProofFile->SetOutputFileName(outputFileName->GetTitle());
1451 fOutput->Add(outProofFile);
1453 AliSysInfo::AddStamp("ReadInputInSlaveBegin");
1456 // get the run loader
1457 if (!InitRunLoader()) {
1458 Abort("InitRunLoader", TSelector::kAbortProcess);
1461 AliSysInfo::AddStamp("LoadLoader");
1463 ftVertexer = new AliVertexerTracks(AliTracker::GetBz());
1466 if (!fRunTracking.IsNull() && !CreateTrackers(fRunTracking)) {
1467 Abort("CreateTrackers", TSelector::kAbortProcess);
1470 AliSysInfo::AddStamp("CreateTrackers");
1472 // create the ESD output file and tree
1473 if (!outProofFile) {
1474 ffile = TFile::Open("AliESDs.root", "RECREATE");
1475 ffile->SetCompressionLevel(2);
1476 if (!ffile->IsOpen()) {
1477 Abort("OpenESDFile", TSelector::kAbortProcess);
1482 if (!(ffile = outProofFile->OpenFile("RECREATE"))) {
1483 Abort(Form("Problems opening output PROOF file: %s/%s",
1484 outProofFile->GetDir(), outProofFile->GetFileName()),
1485 TSelector::kAbortProcess);
1490 ftree = new TTree("esdTree", "Tree with ESD objects");
1491 fesd = new AliESDEvent();
1492 fesd->CreateStdContent();
1494 fesd->WriteToTree(ftree);
1495 if (fWriteESDfriend) {
1497 // Since we add the branch manually we must
1498 // book and add it after WriteToTree
1499 // otherwise it is created twice,
1500 // once via writetotree and once here.
1501 // The case for AliESDfriend is now
1502 // caught also in AlIESDEvent::WriteToTree but
1503 // be careful when changing the name (AliESDfriend is not
1504 // a TNamed so we had to hardwire it)
1505 fesdf = new AliESDfriend();
1506 TBranch *br=ftree->Branch("ESDfriend.","AliESDfriend", &fesdf);
1507 br->SetFile("AliESDfriends.root");
1508 fesd->AddObject(fesdf);
1510 ftree->GetUserInfo()->Add(fesd);
1512 fhlttree = new TTree("HLTesdTree", "Tree with HLT ESD objects");
1513 fhltesd = new AliESDEvent();
1514 fhltesd->CreateStdContent();
1516 // read the ESD template from CDB
1517 // HLT is allowed to put non-std content to its ESD, the non-std
1518 // objects need to be created before invocation of WriteToTree in
1519 // order to create all branches. Initialization is done from an
1520 // ESD layout template in CDB
1521 AliCDBManager* man = AliCDBManager::Instance();
1522 AliCDBPath hltESDConfigPath("HLT/ConfigHLT/esdLayout");
1523 AliCDBEntry* hltESDConfig=NULL;
1524 if (man->GetId(hltESDConfigPath)!=NULL &&
1525 (hltESDConfig=man->Get(hltESDConfigPath))!=NULL) {
1526 AliESDEvent* pESDLayout=dynamic_cast<AliESDEvent*>(hltESDConfig->GetObject());
1528 // init all internal variables from the list of objects
1529 pESDLayout->GetStdContent();
1531 // copy content and create non-std objects
1532 *fhltesd=*pESDLayout;
1535 AliError(Form("error setting hltEsd layout from %s: invalid object type",
1536 hltESDConfigPath.GetPath().Data()));
1540 fhltesd->WriteToTree(fhlttree);
1541 fhlttree->GetUserInfo()->Add(fhltesd);
1543 ProcInfo_t procInfo;
1544 gSystem->GetProcInfo(&procInfo);
1545 AliInfo(Form("Current memory usage %d %d", procInfo.fMemResident, procInfo.fMemVirtual));
1548 //Initialize the QA and start of cycle
1549 if (fRunQA || fRunGlobalQA)
1552 //Initialize the Plane Efficiency framework
1553 if (fRunPlaneEff && !InitPlaneEff()) {
1554 Abort("InitPlaneEff", TSelector::kAbortProcess);
1558 if (strcmp(gProgName,"alieve") == 0)
1559 fRunAliEVE = InitAliEVE();
1564 //_____________________________________________________________________________
1565 Bool_t AliReconstruction::Process(Long64_t entry)
1567 // run the reconstruction over a single entry
1568 // from the chain with raw data
1569 AliCodeTimerAuto("");
1571 TTree *currTree = fChain->GetTree();
1572 AliRawVEvent *event = NULL;
1573 currTree->SetBranchAddress("rawevent",&event);
1574 currTree->GetEntry(entry);
1575 fRawReader = new AliRawReaderRoot(event);
1576 fStatus = ProcessEvent(fRunLoader->GetNumberOfEvents());
1584 //_____________________________________________________________________________
1585 void AliReconstruction::Init(TTree *tree)
1588 AliError("The input tree is not found!");
1594 //_____________________________________________________________________________
1595 Bool_t AliReconstruction::ProcessEvent(Int_t iEvent)
1597 // run the reconstruction over a single event
1598 // The event loop is steered in Run method
1600 AliCodeTimerAuto("");
1602 if (iEvent >= fRunLoader->GetNumberOfEvents()) {
1603 fRunLoader->SetEventNumber(iEvent);
1604 fRunLoader->GetHeader()->Reset(fRawReader->GetRunNumber(),
1606 fRunLoader->TreeE()->Fill();
1607 if (fRawReader && fRawReader->UseAutoSaveESD())
1608 fRunLoader->TreeE()->AutoSave("SaveSelf");
1611 if ((iEvent < fFirstEvent) || ((fLastEvent >= 0) && (iEvent > fLastEvent))) {
1615 AliInfo(Form("processing event %d", iEvent));
1617 fRunLoader->GetEvent(iEvent);
1619 // Fill Event-info object
1621 fRecoParam.SetEventSpecie(fRunInfo,fEventInfo,fListOfCosmicTriggers);
1622 AliInfo(Form("Current event specie: %s",fRecoParam.PrintEventSpecie()));
1624 // Set the reco-params
1626 TString detStr = fLoadCDB;
1627 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
1628 if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
1629 AliReconstructor *reconstructor = GetReconstructor(iDet);
1630 if (reconstructor && fRecoParam.GetDetRecoParamArray(iDet)) {
1631 const AliDetectorRecoParam *par = fRecoParam.GetDetRecoParam(iDet);
1632 reconstructor->SetRecoParam(par);
1633 reconstructor->SetEventInfo(&fEventInfo);
1635 AliQAManager::QAManager()->SetRecoParam(iDet, par) ;
1636 AliQAManager::QAManager()->SetEventSpecie(AliRecoParam::Convert(par->GetEventSpecie())) ;
1644 AliQAManager::QAManager()->SetEventSpecie(fRecoParam.GetEventSpecie()) ;
1645 AliQAManager::QAManager()->RunOneEvent(fRawReader) ;
1647 // local single event reconstruction
1648 if (!fRunLocalReconstruction.IsNull()) {
1649 TString detectors=fRunLocalReconstruction;
1650 // run HLT event reconstruction first
1651 // ;-( IsSelected changes the string
1652 if (IsSelected("HLT", detectors) &&
1653 !RunLocalEventReconstruction("HLT")) {
1654 if (fStopOnError) {CleanUp(); return kFALSE;}
1656 detectors=fRunLocalReconstruction;
1657 detectors.ReplaceAll("HLT", "");
1658 if (!RunLocalEventReconstruction(detectors)) {
1659 if (fStopOnError) {CleanUp(); return kFALSE;}
1663 fesd->SetRunNumber(fRunLoader->GetHeader()->GetRun());
1664 fhltesd->SetRunNumber(fRunLoader->GetHeader()->GetRun());
1665 fesd->SetEventNumberInFile(fRunLoader->GetHeader()->GetEventNrInRun());
1666 fhltesd->SetEventNumberInFile(fRunLoader->GetHeader()->GetEventNrInRun());
1668 // Set magnetic field from the tracker
1669 fesd->SetMagneticField(AliTracker::GetBz());
1670 fhltesd->SetMagneticField(AliTracker::GetBz());
1672 // Set most probable pt, for B=0 tracking
1673 // Get the global reco-params. They are atposition 16 inside the array of detectors in fRecoParam
1674 const AliGRPRecoParam *grpRecoParam = dynamic_cast<const AliGRPRecoParam*>(fRecoParam.GetDetRecoParam(kNDetectors));
1675 if (grpRecoParam) AliExternalTrackParam::SetMostProbablePt(grpRecoParam->GetMostProbablePt());
1677 // Fill raw-data error log into the ESD
1678 if (fRawReader) FillRawDataErrorLog(iEvent,fesd);
1681 if (fRunVertexFinder) {
1682 if (!RunVertexFinder(fesd)) {
1683 if (fStopOnError) {CleanUp(); return kFALSE;}
1687 // For Plane Efficiency: run the SPD trackleter
1688 if (fRunPlaneEff && fSPDTrackleter) {
1689 if (!RunSPDTrackleting(fesd)) {
1690 if (fStopOnError) {CleanUp(); return kFALSE;}
1695 if (!fRunTracking.IsNull()) {
1696 if (fRunMuonTracking) {
1697 if (!RunMuonTracking(fesd)) {
1698 if (fStopOnError) {CleanUp(); return kFALSE;}
1704 if (!fRunTracking.IsNull()) {
1705 if (!RunTracking(fesd)) {
1706 if (fStopOnError) {CleanUp(); return kFALSE;}
1711 if (!fFillESD.IsNull()) {
1712 TString detectors=fFillESD;
1713 // run HLT first and on hltesd
1714 // ;-( IsSelected changes the string
1715 if (IsSelected("HLT", detectors) &&
1716 !FillESD(fhltesd, "HLT")) {
1717 if (fStopOnError) {CleanUp(); return kFALSE;}
1720 // Temporary fix to avoid problems with HLT that overwrites the offline ESDs
1721 if (detectors.Contains("ALL")) {
1723 for (Int_t idet=0; idet<kNDetectors; ++idet){
1724 detectors += fgkDetectorName[idet];
1728 detectors.ReplaceAll("HLT", "");
1729 if (!FillESD(fesd, detectors)) {
1730 if (fStopOnError) {CleanUp(); return kFALSE;}
1734 // fill Event header information from the RawEventHeader
1735 if (fRawReader){FillRawEventHeaderESD(fesd);}
1736 if (fRawReader){FillRawEventHeaderESD(fhltesd);}
1739 AliESDpid::MakePID(fesd);
1741 if (fFillTriggerESD) {
1742 if (!FillTriggerESD(fesd)) {
1743 if (fStopOnError) {CleanUp(); return kFALSE;}
1746 // Always fill scalers
1747 if (!FillTriggerScalers(fesd)) {
1748 if (fStopOnError) {CleanUp(); return kFALSE;}
1755 // Propagate track to the beam pipe (if not already done by ITS)
1757 const Int_t ntracks = fesd->GetNumberOfTracks();
1758 const Double_t kBz = fesd->GetMagneticField();
1759 const Double_t kRadius = 2.8; //something less than the beam pipe radius
1762 UShort_t *selectedIdx=new UShort_t[ntracks];
1764 for (Int_t itrack=0; itrack<ntracks; itrack++){
1765 const Double_t kMaxStep = 1; //max step over the material
1768 AliESDtrack *track = fesd->GetTrack(itrack);
1769 if (!track) continue;
1771 AliExternalTrackParam *tpcTrack =
1772 (AliExternalTrackParam *)track->GetTPCInnerParam();
1776 PropagateTrackTo(tpcTrack,kRadius,track->GetMass(),kMaxStep,kFALSE);
1779 Int_t n=trkArray.GetEntriesFast();
1780 selectedIdx[n]=track->GetID();
1781 trkArray.AddLast(tpcTrack);
1784 //Tracks refitted by ITS should already be at the SPD vertex
1785 if (track->IsOn(AliESDtrack::kITSrefit)) continue;
1788 PropagateTrackTo(track,kRadius,track->GetMass(),kMaxStep,kFALSE);
1789 track->RelateToVertex(fesd->GetPrimaryVertexSPD(), kBz, kVeryBig);
1794 // Improve the reconstructed primary vertex position using the tracks
1796 Bool_t runVertexFinderTracks = fRunVertexFinderTracks;
1797 if(fesd->GetPrimaryVertexSPD()) {
1798 TString vtitle = fesd->GetPrimaryVertexSPD()->GetTitle();
1799 if(vtitle.Contains("cosmics")) {
1800 runVertexFinderTracks=kFALSE;
1804 if (runVertexFinderTracks) {
1805 // TPC + ITS primary vertex
1806 ftVertexer->SetITSMode();
1807 ftVertexer->SetConstraintOff();
1808 // get cuts for vertexer from AliGRPRecoParam
1810 Int_t nCutsVertexer = grpRecoParam->GetVertexerTracksNCuts();
1811 Double_t *cutsVertexer = new Double_t[nCutsVertexer];
1812 grpRecoParam->GetVertexerTracksCutsITS(cutsVertexer);
1813 ftVertexer->SetCuts(cutsVertexer);
1814 delete [] cutsVertexer; cutsVertexer = NULL;
1815 if(fDiamondProfile && grpRecoParam->GetVertexerTracksConstraintITS())
1816 ftVertexer->SetVtxStart(fDiamondProfile);
1818 AliESDVertex *pvtx=ftVertexer->FindPrimaryVertex(fesd);
1820 if (pvtx->GetStatus()) {
1821 fesd->SetPrimaryVertexTracks(pvtx);
1822 for (Int_t i=0; i<ntracks; i++) {
1823 AliESDtrack *t = fesd->GetTrack(i);
1824 t->RelateToVertex(pvtx, kBz, kVeryBig);
1829 // TPC-only primary vertex
1830 ftVertexer->SetTPCMode();
1831 ftVertexer->SetConstraintOff();
1832 // get cuts for vertexer from AliGRPRecoParam
1834 Int_t nCutsVertexer = grpRecoParam->GetVertexerTracksNCuts();
1835 Double_t *cutsVertexer = new Double_t[nCutsVertexer];
1836 grpRecoParam->GetVertexerTracksCutsTPC(cutsVertexer);
1837 ftVertexer->SetCuts(cutsVertexer);
1838 delete [] cutsVertexer; cutsVertexer = NULL;
1839 if(fDiamondProfileTPC && grpRecoParam->GetVertexerTracksConstraintTPC())
1840 ftVertexer->SetVtxStart(fDiamondProfileTPC);
1842 pvtx=ftVertexer->FindPrimaryVertex(&trkArray,selectedIdx);
1844 if (pvtx->GetStatus()) {
1845 fesd->SetPrimaryVertexTPC(pvtx);
1846 for (Int_t i=0; i<ntracks; i++) {
1847 AliESDtrack *t = fesd->GetTrack(i);
1848 t->RelateToVertexTPC(pvtx, kBz, kVeryBig);
1854 delete[] selectedIdx;
1856 if(fDiamondProfile) fesd->SetDiamond(fDiamondProfile);
1861 AliV0vertexer vtxer;
1862 vtxer.Tracks2V0vertices(fesd);
1864 if (fRunCascadeFinder) {
1866 AliCascadeVertexer cvtxer;
1867 cvtxer.V0sTracks2CascadeVertices(fesd);
1872 if (fCleanESD) CleanESD(fesd);
1875 AliQAManager::QAManager()->SetEventSpecie(fRecoParam.GetEventSpecie()) ;
1876 AliQAManager::QAManager()->RunOneEvent(fesd) ;
1879 AliQADataMaker *qadm = AliQAManager::QAManager()->GetQADataMaker(AliQAv1::kGLOBAL);
1880 qadm->SetEventSpecie(fRecoParam.GetEventSpecie()) ;
1881 if (qadm && fQATasks.Contains(Form("%d", AliQAv1::kESDS)))
1882 qadm->Exec(AliQAv1::kESDS, fesd);
1885 if (fWriteESDfriend) {
1886 // fesdf->~AliESDfriend();
1887 // new (fesdf) AliESDfriend(); // Reset...
1888 fesd->GetESDfriend(fesdf);
1892 // Auto-save the ESD tree in case of prompt reco @P2
1893 if (fRawReader && fRawReader->UseAutoSaveESD()) {
1894 ftree->AutoSave("SaveSelf");
1895 TFile *friendfile = (TFile *)(gROOT->GetListOfFiles()->FindObject("AliESDfriends.root"));
1896 if (friendfile) friendfile->Save();
1903 if (fRunAliEVE) RunAliEVE();
1907 if (fWriteESDfriend) {
1908 fesdf->~AliESDfriend();
1909 new (fesdf) AliESDfriend(); // Reset...
1912 ProcInfo_t procInfo;
1913 gSystem->GetProcInfo(&procInfo);
1914 AliInfo(Form("Event %d -> Current memory usage %d %d",iEvent, procInfo.fMemResident, procInfo.fMemVirtual));
1917 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
1918 if (fReconstructor[iDet]) {
1919 fReconstructor[iDet]->SetRecoParam(NULL);
1920 fReconstructor[iDet]->SetEventInfo(NULL);
1922 if (fTracker[iDet]) fTracker[iDet]->SetEventInfo(NULL);
1925 if (fRunQA || fRunGlobalQA)
1926 AliQAManager::QAManager()->Increment() ;
1931 //_____________________________________________________________________________
1932 void AliReconstruction::SlaveTerminate()
1934 // Finalize the run on the slave side
1935 // Called after the exit
1936 // from the event loop
1937 AliCodeTimerAuto("");
1939 if (fIsNewRunLoader) { // galice.root didn't exist
1940 fRunLoader->WriteHeader("OVERWRITE");
1941 fRunLoader->CdGAFile();
1942 fRunLoader->Write(0, TObject::kOverwrite);
1945 const TMap *cdbMap = AliCDBManager::Instance()->GetStorageMap();
1946 const TList *cdbList = AliCDBManager::Instance()->GetRetrievedIds();
1948 TMap *cdbMapCopy = new TMap(cdbMap->GetEntries());
1949 cdbMapCopy->SetOwner(1);
1950 cdbMapCopy->SetName("cdbMap");
1951 TIter iter(cdbMap->GetTable());
1954 while((pair = dynamic_cast<TPair*> (iter.Next()))){
1955 TObjString* keyStr = dynamic_cast<TObjString*> (pair->Key());
1956 TObjString* valStr = dynamic_cast<TObjString*> (pair->Value());
1957 cdbMapCopy->Add(new TObjString(keyStr->GetName()), new TObjString(valStr->GetName()));
1960 TList *cdbListCopy = new TList();
1961 cdbListCopy->SetOwner(1);
1962 cdbListCopy->SetName("cdbList");
1964 TIter iter2(cdbList);
1967 while((id = dynamic_cast<AliCDBId*> (iter2.Next()))){
1968 cdbListCopy->Add(new TObjString(id->ToString().Data()));
1971 ftree->GetUserInfo()->Add(cdbMapCopy);
1972 ftree->GetUserInfo()->Add(cdbListCopy);
1977 if (fWriteESDfriend)
1978 ftree->SetBranchStatus("ESDfriend*",0);
1979 // we want to have only one tree version number
1980 ftree->Write(ftree->GetName(),TObject::kOverwrite);
1981 fhlttree->Write(fhlttree->GetName(),TObject::kOverwrite);
1983 // Finish with Plane Efficiency evaluation: before of CleanUp !!!
1984 if (fRunPlaneEff && !FinishPlaneEff()) {
1985 AliWarning("Finish PlaneEff evaluation failed");
1988 // End of cycle for the in-loop
1990 AliQAManager::QAManager()->EndOfCycle() ;
1993 AliQADataMaker *qadm = AliQAManager::QAManager()->GetQADataMaker(AliQAv1::kGLOBAL);
1995 if (fQATasks.Contains(Form("%d", AliQAv1::kRECPOINTS)))
1996 qadm->EndOfCycle(AliQAv1::kRECPOINTS);
1997 if (fQATasks.Contains(Form("%d", AliQAv1::kESDS)))
1998 qadm->EndOfCycle(AliQAv1::kESDS);
2003 if (fRunQA || fRunGlobalQA) {
2005 if (TNamed *outputFileName = (TNamed *) fInput->FindObject("PROOF_OUTPUTFILE")) {
2006 TString qaOutputFile = outputFileName->GetTitle();
2007 qaOutputFile.ReplaceAll(gSystem->BaseName(TUrl(outputFileName->GetTitle()).GetFile()),
2008 Form("Merged.%s.Data.root",AliQAv1::GetQADataFileName()));
2009 TProofOutputFile *qaProofFile = new TProofOutputFile(Form("Merged.%s.Data.root",AliQAv1::GetQADataFileName()));
2010 qaProofFile->SetOutputFileName(qaOutputFile.Data());
2011 fOutput->Add(qaProofFile);
2012 MergeQA(qaProofFile->GetFileName());
2024 //_____________________________________________________________________________
2025 void AliReconstruction::Terminate()
2027 // Create tags for the events in the ESD tree (the ESD tree is always present)
2028 // In case of empty events the tags will contain dummy values
2029 AliCodeTimerAuto("");
2031 // Do not call the ESD tag creator in case of PROOF-based reconstruction
2033 AliESDTagCreator *esdtagCreator = new AliESDTagCreator();
2034 esdtagCreator->CreateESDTags(fFirstEvent,fLastEvent,fGRPData, AliQAv1::Instance()->GetQA(), AliQAv1::Instance()->GetEventSpecies(), AliQAv1::kNDET, AliRecoParam::kNSpecies);
2037 // Cleanup of CDB manager: cache and active storages!
2038 AliCDBManager::Instance()->ClearCache();
2041 //_____________________________________________________________________________
2042 Bool_t AliReconstruction::RunLocalEventReconstruction(const TString& detectors)
2044 // run the local reconstruction
2046 static Int_t eventNr=0;
2047 AliCodeTimerAuto("")
2049 TString detStr = detectors;
2050 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
2051 if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
2052 AliReconstructor* reconstructor = GetReconstructor(iDet);
2053 if (!reconstructor) continue;
2054 AliLoader* loader = fLoader[iDet];
2055 // Matthias April 2008: temporary fix to run HLT reconstruction
2056 // although the HLT loader is missing
2057 if (strcmp(fgkDetectorName[iDet], "HLT")==0) {
2059 reconstructor->Reconstruct(fRawReader, NULL);
2062 reconstructor->Reconstruct(dummy, NULL);
2067 AliWarning(Form("No loader is defined for %s!",fgkDetectorName[iDet]));
2070 // conversion of digits
2071 if (fRawReader && reconstructor->HasDigitConversion()) {
2072 AliInfo(Form("converting raw data digits into root objects for %s",
2073 fgkDetectorName[iDet]));
2074 // AliCodeTimerAuto(Form("converting raw data digits into root objects for %s",
2075 // fgkDetectorName[iDet]));
2076 loader->LoadDigits("update");
2077 loader->CleanDigits();
2078 loader->MakeDigitsContainer();
2079 TTree* digitsTree = loader->TreeD();
2080 reconstructor->ConvertDigits(fRawReader, digitsTree);
2081 loader->WriteDigits("OVERWRITE");
2082 loader->UnloadDigits();
2084 // local reconstruction
2085 AliInfo(Form("running reconstruction for %s", fgkDetectorName[iDet]));
2086 //AliCodeTimerAuto(Form("running reconstruction for %s", fgkDetectorName[iDet]));
2087 loader->LoadRecPoints("update");
2088 loader->CleanRecPoints();
2089 loader->MakeRecPointsContainer();
2090 TTree* clustersTree = loader->TreeR();
2091 if (fRawReader && !reconstructor->HasDigitConversion()) {
2092 reconstructor->Reconstruct(fRawReader, clustersTree);
2094 loader->LoadDigits("read");
2095 TTree* digitsTree = loader->TreeD();
2097 AliError(Form("Can't get the %s digits tree", fgkDetectorName[iDet]));
2098 if (fStopOnError) return kFALSE;
2100 reconstructor->Reconstruct(digitsTree, clustersTree);
2102 AliQAManager::QAManager()->SetEventSpecie(fRecoParam.GetEventSpecie()) ;
2103 AliQAManager::QAManager()->RunOneEventInOneDetector(iDet, digitsTree) ;
2106 loader->UnloadDigits();
2109 AliQAManager::QAManager()->SetEventSpecie(fRecoParam.GetEventSpecie()) ;
2110 AliQAManager::QAManager()->RunOneEventInOneDetector(iDet, clustersTree) ;
2112 loader->WriteRecPoints("OVERWRITE");
2113 loader->UnloadRecPoints();
2114 AliSysInfo::AddStamp(Form("LRec%s_%d",fgkDetectorName[iDet],eventNr), iDet,1,eventNr);
2116 if ((detStr.CompareTo("ALL") != 0) && !detStr.IsNull()) {
2117 AliError(Form("the following detectors were not found: %s",
2119 if (fStopOnError) return kFALSE;
2124 //_____________________________________________________________________________
2125 Bool_t AliReconstruction::RunSPDTrackleting(AliESDEvent*& esd)
2127 // run the SPD trackleting (for SPD efficiency purpouses)
2129 AliCodeTimerAuto("")
2131 Double_t vtxPos[3] = {0, 0, 0};
2132 Double_t vtxErr[3] = {0.0, 0.0, 0.0};
2134 TArrayF mcVertex(3);
2136 if (fRunLoader->GetHeader() && fRunLoader->GetHeader()->GenEventHeader()) {
2137 fRunLoader->GetHeader()->GenEventHeader()->PrimaryVertex(mcVertex);
2138 for (Int_t i = 0; i < 3; i++) vtxPos[i] = mcVertex[i];
2141 const AliESDVertex *vertex = esd->GetVertex();
2143 AliWarning("Vertex not found");
2146 vertex->GetXYZ(vtxPos);
2147 vertex->GetSigmaXYZ(vtxErr);
2148 if (fSPDTrackleter) {
2149 AliInfo("running the SPD Trackleter for Plane Efficiency Evaluation");
2152 fLoader[0]->LoadRecPoints("read");
2153 TTree* tree = fLoader[0]->TreeR();
2155 AliError("Can't get the ITS cluster tree");
2158 fSPDTrackleter->LoadClusters(tree);
2159 fSPDTrackleter->SetVertex(vtxPos, vtxErr);
2161 if (fSPDTrackleter->Clusters2Tracks(esd) != 0) {
2162 AliError("AliITSTrackleterSPDEff Clusters2Tracks failed");
2163 // fLoader[0]->UnloadRecPoints();
2166 //fSPDTrackleter->UnloadRecPoints();
2168 AliWarning("SPDTrackleter not available");
2174 //_____________________________________________________________________________
2175 Bool_t AliReconstruction::RunVertexFinder(AliESDEvent*& esd)
2177 // run the barrel tracking
2179 AliCodeTimerAuto("")
2181 AliVertexer *vertexer = CreateVertexer();
2182 if (!vertexer) return kFALSE;
2184 AliInfo("running the ITS vertex finder");
2185 AliESDVertex* vertex = NULL;
2187 fLoader[0]->LoadRecPoints();
2188 TTree* cltree = fLoader[0]->TreeR();
2190 if(fDiamondProfileSPD) vertexer->SetVtxStart(fDiamondProfileSPD);
2191 vertex = vertexer->FindVertexForCurrentEvent(cltree);
2194 AliError("Can't get the ITS cluster tree");
2196 fLoader[0]->UnloadRecPoints();
2199 AliError("Can't get the ITS loader");
2202 AliWarning("Vertex not found");
2203 vertex = new AliESDVertex();
2204 vertex->SetName("default");
2207 vertex->SetName("reconstructed");
2212 vertex->GetXYZ(vtxPos);
2213 vertex->GetSigmaXYZ(vtxErr);
2215 esd->SetPrimaryVertexSPD(vertex);
2216 AliESDVertex *vpileup = NULL;
2217 Int_t novertices = 0;
2218 vpileup = vertexer->GetAllVertices(novertices);
2220 for (Int_t kk=1; kk<novertices; kk++)esd->AddPileupVertexSPD(&vpileup[kk]);
2222 // if SPD multiplicity has been determined, it is stored in the ESD
2223 AliMultiplicity *mult = vertexer->GetMultiplicity();
2224 if(mult)esd->SetMultiplicity(mult);
2226 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
2227 if (fTracker[iDet]) fTracker[iDet]->SetVertex(vtxPos, vtxErr);
2236 //_____________________________________________________________________________
2237 Bool_t AliReconstruction::RunHLTTracking(AliESDEvent*& esd)
2239 // run the HLT barrel tracking
2241 AliCodeTimerAuto("")
2244 AliError("Missing runLoader!");
2248 AliInfo("running HLT tracking");
2250 // Get a pointer to the HLT reconstructor
2251 AliReconstructor *reconstructor = GetReconstructor(kNDetectors-1);
2252 if (!reconstructor) return kFALSE;
2255 for (Int_t iDet = 1; iDet >= 0; iDet--) {
2256 TString detName = fgkDetectorName[iDet];
2257 AliDebug(1, Form("%s HLT tracking", detName.Data()));
2258 reconstructor->SetOption(detName.Data());
2259 AliTracker *tracker = reconstructor->CreateTracker();
2261 AliWarning(Form("couldn't create a HLT tracker for %s", detName.Data()));
2262 if (fStopOnError) return kFALSE;
2266 Double_t vtxErr[3]={0.005,0.005,0.010};
2267 const AliESDVertex *vertex = esd->GetVertex();
2268 vertex->GetXYZ(vtxPos);
2269 tracker->SetVertex(vtxPos,vtxErr);
2271 fLoader[iDet]->LoadRecPoints("read");
2272 TTree* tree = fLoader[iDet]->TreeR();
2274 AliError(Form("Can't get the %s cluster tree", detName.Data()));
2277 tracker->LoadClusters(tree);
2279 if (tracker->Clusters2Tracks(esd) != 0) {
2280 AliError(Form("HLT %s Clusters2Tracks failed", fgkDetectorName[iDet]));
2284 tracker->UnloadClusters();
2292 //_____________________________________________________________________________
2293 Bool_t AliReconstruction::RunMuonTracking(AliESDEvent*& esd)
2295 // run the muon spectrometer tracking
2297 AliCodeTimerAuto("")
2300 AliError("Missing runLoader!");
2303 Int_t iDet = 7; // for MUON
2305 AliInfo("is running...");
2307 // Get a pointer to the MUON reconstructor
2308 AliReconstructor *reconstructor = GetReconstructor(iDet);
2309 if (!reconstructor) return kFALSE;
2312 TString detName = fgkDetectorName[iDet];
2313 AliDebug(1, Form("%s tracking", detName.Data()));
2314 AliTracker *tracker = reconstructor->CreateTracker();
2316 AliWarning(Form("couldn't create a tracker for %s", detName.Data()));
2321 fLoader[iDet]->LoadRecPoints("read");
2323 tracker->LoadClusters(fLoader[iDet]->TreeR());
2325 Int_t rv = tracker->Clusters2Tracks(esd);
2329 AliError(Form("%s Clusters2Tracks failed", fgkDetectorName[iDet]));
2333 fLoader[iDet]->UnloadRecPoints();
2335 tracker->UnloadClusters();
2343 //_____________________________________________________________________________
2344 Bool_t AliReconstruction::RunTracking(AliESDEvent*& esd)
2346 // run the barrel tracking
2347 static Int_t eventNr=0;
2348 AliCodeTimerAuto("")
2350 AliInfo("running tracking");
2352 // Set the event info which is used
2353 // by the trackers in order to obtain
2354 // information about read-out detectors,
2356 AliDebug(1, "Setting event info");
2357 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
2358 if (!fTracker[iDet]) continue;
2359 fTracker[iDet]->SetEventInfo(&fEventInfo);
2362 //Fill the ESD with the T0 info (will be used by the TOF)
2363 if (fReconstructor[11] && fLoader[11]) {
2364 fLoader[11]->LoadRecPoints("READ");
2365 TTree *treeR = fLoader[11]->TreeR();
2367 GetReconstructor(11)->FillESD((TTree *)NULL,treeR,esd);
2371 // pass 1: TPC + ITS inwards
2372 for (Int_t iDet = 1; iDet >= 0; iDet--) {
2373 if (!fTracker[iDet]) continue;
2374 AliDebug(1, Form("%s tracking", fgkDetectorName[iDet]));
2377 fLoader[iDet]->LoadRecPoints("read");
2378 AliSysInfo::AddStamp(Form("RLoadCluster%s_%d",fgkDetectorName[iDet],eventNr),iDet,1, eventNr);
2379 TTree* tree = fLoader[iDet]->TreeR();
2381 AliError(Form("Can't get the %s cluster tree", fgkDetectorName[iDet]));
2384 fTracker[iDet]->LoadClusters(tree);
2385 AliSysInfo::AddStamp(Form("TLoadCluster%s_%d",fgkDetectorName[iDet],eventNr), iDet,2, eventNr);
2387 if (fTracker[iDet]->Clusters2Tracks(esd) != 0) {
2388 AliError(Form("%s Clusters2Tracks failed", fgkDetectorName[iDet]));
2391 // preliminary PID in TPC needed by the ITS tracker
2393 GetReconstructor(1)->FillESD((TTree*)NULL, (TTree*)NULL, esd);
2394 AliESDpid::MakePID(esd);
2396 AliSysInfo::AddStamp(Form("Tracking0%s_%d",fgkDetectorName[iDet],eventNr), iDet,3,eventNr);
2399 // pass 2: ALL backwards
2401 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
2402 if (!fTracker[iDet]) continue;
2403 AliDebug(1, Form("%s back propagation", fgkDetectorName[iDet]));
2406 if (iDet > 1) { // all except ITS, TPC
2408 fLoader[iDet]->LoadRecPoints("read");
2409 AliSysInfo::AddStamp(Form("RLoadCluster0%s_%d",fgkDetectorName[iDet],eventNr), iDet,1, eventNr);
2410 tree = fLoader[iDet]->TreeR();
2412 AliError(Form("Can't get the %s cluster tree", fgkDetectorName[iDet]));
2415 fTracker[iDet]->LoadClusters(tree);
2416 AliSysInfo::AddStamp(Form("TLoadCluster0%s_%d",fgkDetectorName[iDet],eventNr), iDet,2, eventNr);
2420 if (iDet>1) // start filling residuals for the "outer" detectors
2422 AliTracker::SetFillResiduals(fRecoParam.GetEventSpecie(), kTRUE);
2423 TObjArray ** arr = AliTracker::GetResidualsArray() ;
2425 AliRecoParam::EventSpecie_t es=fRecoParam.GetEventSpecie();
2426 TObjArray * elem = arr[AliRecoParam::AConvert(es)];
2427 if ( elem && (! elem->At(0)) ) {
2428 AliQADataMaker *qadm = AliQAManager::QAManager()->GetQADataMaker(AliQAv1::kGLOBAL);
2429 if (qadm) qadm->InitRecPointsForTracker() ;
2433 if (fTracker[iDet]->PropagateBack(esd) != 0) {
2434 AliError(Form("%s backward propagation failed", fgkDetectorName[iDet]));
2439 if (iDet > 3) { // all except ITS, TPC, TRD and TOF
2440 fTracker[iDet]->UnloadClusters();
2441 fLoader[iDet]->UnloadRecPoints();
2443 // updated PID in TPC needed by the ITS tracker -MI
2445 GetReconstructor(1)->FillESD((TTree*)NULL, (TTree*)NULL, esd);
2446 AliESDpid::MakePID(esd);
2448 AliSysInfo::AddStamp(Form("Tracking1%s_%d",fgkDetectorName[iDet],eventNr), iDet,3, eventNr);
2450 //stop filling residuals for the "outer" detectors
2451 if (fRunGlobalQA) AliTracker::SetFillResiduals(fRecoParam.GetEventSpecie(), kFALSE);
2453 // pass 3: TRD + TPC + ITS refit inwards
2455 for (Int_t iDet = 2; iDet >= 0; iDet--) {
2456 if (!fTracker[iDet]) continue;
2457 AliDebug(1, Form("%s inward refit", fgkDetectorName[iDet]));
2460 if (iDet<2) // start filling residuals for TPC and ITS
2462 AliTracker::SetFillResiduals(fRecoParam.GetEventSpecie(), kTRUE);
2463 TObjArray ** arr = AliTracker::GetResidualsArray() ;
2465 AliRecoParam::EventSpecie_t es=fRecoParam.GetEventSpecie();
2466 TObjArray * elem = arr[AliRecoParam::AConvert(es)];
2467 if ( elem && (! elem->At(0)) ) {
2468 AliQADataMaker *qadm = AliQAManager::QAManager()->GetQADataMaker(AliQAv1::kGLOBAL);
2469 if (qadm) qadm->InitRecPointsForTracker() ;
2474 if (fTracker[iDet]->RefitInward(esd) != 0) {
2475 AliError(Form("%s inward refit failed", fgkDetectorName[iDet]));
2478 // run postprocessing
2479 if (fTracker[iDet]->PostProcess(esd) != 0) {
2480 AliError(Form("%s postprocessing failed", fgkDetectorName[iDet]));
2483 AliSysInfo::AddStamp(Form("Tracking2%s_%d",fgkDetectorName[iDet],eventNr), iDet,3, eventNr);
2486 // write space-points to the ESD in case alignment data output
2488 if (fWriteAlignmentData)
2489 WriteAlignmentData(esd);
2491 for (Int_t iDet = 3; iDet >= 0; iDet--) {
2492 if (!fTracker[iDet]) continue;
2494 fTracker[iDet]->UnloadClusters();
2495 AliSysInfo::AddStamp(Form("TUnloadCluster%s_%d",fgkDetectorName[iDet],eventNr), iDet,4, eventNr);
2496 fLoader[iDet]->UnloadRecPoints();
2497 AliSysInfo::AddStamp(Form("RUnloadCluster%s_%d",fgkDetectorName[iDet],eventNr), iDet,5, eventNr);
2499 // stop filling residuals for TPC and ITS
2500 if (fRunGlobalQA) AliTracker::SetFillResiduals(fRecoParam.GetEventSpecie(), kFALSE);
2506 //_____________________________________________________________________________
2507 Bool_t AliReconstruction::CleanESD(AliESDEvent *esd){
2509 // Remove the data which are not needed for the physics analysis.
2512 Int_t nTracks=esd->GetNumberOfTracks();
2513 Int_t nV0s=esd->GetNumberOfV0s();
2515 (Form("Number of ESD tracks and V0s before cleaning: %d %d",nTracks,nV0s));
2517 Float_t cleanPars[]={fV0DCAmax,fV0CsPmin,fDmax,fZmax};
2518 Bool_t rc=esd->Clean(cleanPars);
2520 nTracks=esd->GetNumberOfTracks();
2521 nV0s=esd->GetNumberOfV0s();
2523 (Form("Number of ESD tracks and V0s after cleaning %d %d",nTracks,nV0s));
2528 //_____________________________________________________________________________
2529 Bool_t AliReconstruction::FillESD(AliESDEvent*& esd, const TString& detectors)
2531 // fill the event summary data
2533 AliCodeTimerAuto("")
2534 static Int_t eventNr=0;
2535 TString detStr = detectors;
2537 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
2538 if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
2539 AliReconstructor* reconstructor = GetReconstructor(iDet);
2540 if (!reconstructor) continue;
2541 AliDebug(1, Form("filling ESD for %s", fgkDetectorName[iDet]));
2542 TTree* clustersTree = NULL;
2543 if (fLoader[iDet]) {
2544 fLoader[iDet]->LoadRecPoints("read");
2545 clustersTree = fLoader[iDet]->TreeR();
2546 if (!clustersTree) {
2547 AliError(Form("Can't get the %s clusters tree",
2548 fgkDetectorName[iDet]));
2549 if (fStopOnError) return kFALSE;
2552 if (fRawReader && !reconstructor->HasDigitConversion()) {
2553 reconstructor->FillESD(fRawReader, clustersTree, esd);
2555 TTree* digitsTree = NULL;
2556 if (fLoader[iDet]) {
2557 fLoader[iDet]->LoadDigits("read");
2558 digitsTree = fLoader[iDet]->TreeD();
2560 AliError(Form("Can't get the %s digits tree",
2561 fgkDetectorName[iDet]));
2562 if (fStopOnError) return kFALSE;
2565 reconstructor->FillESD(digitsTree, clustersTree, esd);
2566 if (fLoader[iDet]) fLoader[iDet]->UnloadDigits();
2568 if (fLoader[iDet]) {
2569 fLoader[iDet]->UnloadRecPoints();
2573 if ((detStr.CompareTo("ALL") != 0) && !detStr.IsNull()) {
2574 AliError(Form("the following detectors were not found: %s",
2576 if (fStopOnError) return kFALSE;
2578 AliSysInfo::AddStamp(Form("FillESD%d",eventNr), 0,1, eventNr);
2583 //_____________________________________________________________________________
2584 Bool_t AliReconstruction::FillTriggerESD(AliESDEvent*& esd)
2586 // Reads the trigger decision which is
2587 // stored in Trigger.root file and fills
2588 // the corresponding esd entries
2590 AliCodeTimerAuto("")
2592 AliInfo("Filling trigger information into the ESD");
2595 AliCTPRawStream input(fRawReader);
2596 if (!input.Next()) {
2597 AliWarning("No valid CTP (trigger) DDL raw data is found ! The trigger info is taken from the event header!");
2600 if (esd->GetTriggerMask() != input.GetClassMask())
2601 AliError(Form("Invalid trigger pattern found in CTP raw-data: %llx %llx",
2602 input.GetClassMask(),esd->GetTriggerMask()));
2603 if (esd->GetOrbitNumber() != input.GetOrbitID())
2604 AliError(Form("Invalid orbit id found in CTP raw-data: %x %x",
2605 input.GetOrbitID(),esd->GetOrbitNumber()));
2606 if (esd->GetBunchCrossNumber() != input.GetBCID())
2607 AliError(Form("Invalid bunch-crossing id found in CTP raw-data: %x %x",
2608 input.GetBCID(),esd->GetBunchCrossNumber()));
2609 AliESDHeader* esdheader = esd->GetHeader();
2610 esdheader->SetL0TriggerInputs(input.GetL0Inputs());
2611 esdheader->SetL1TriggerInputs(input.GetL1Inputs());
2612 esdheader->SetL2TriggerInputs(input.GetL2Inputs());
2614 UInt_t orbit=input.GetOrbitID();
2615 for(Int_t i=0 ; i<input.GetNIRs() ; i++ )
2616 if(TMath::Abs(Int_t(orbit-(input.GetIR(i))->GetOrbit()))<=1){
2617 esdheader->AddTriggerIR(input.GetIR(i));
2623 //_____________________________________________________________________________
2624 Bool_t AliReconstruction::FillTriggerScalers(AliESDEvent*& esd)
2627 //fRunScalers->Print();
2628 if(fRunScalers && fRunScalers->CheckRunScalers()){
2629 AliTimeStamp* timestamp = new AliTimeStamp(esd->GetOrbitNumber(), esd->GetPeriodNumber(), esd->GetBunchCrossNumber());
2630 //AliTimeStamp* timestamp = new AliTimeStamp(10308000, 0, (ULong64_t)486238);
2631 AliESDHeader* esdheader = fesd->GetHeader();
2632 for(Int_t i=0;i<50;i++){
2633 if((1<<i) & esd->GetTriggerMask()){
2634 AliTriggerScalersESD* scalesd = fRunScalers->GetScalersForEventClass( timestamp, i+1);
2635 if(scalesd)esdheader->SetTriggerScalersRecord(scalesd);
2641 //_____________________________________________________________________________
2642 Bool_t AliReconstruction::FillRawEventHeaderESD(AliESDEvent*& esd)
2645 // Filling information from RawReader Header
2648 if (!fRawReader) return kFALSE;
2650 AliInfo("Filling information from RawReader Header");
2652 esd->SetBunchCrossNumber(fRawReader->GetBCID());
2653 esd->SetOrbitNumber(fRawReader->GetOrbitID());
2654 esd->SetPeriodNumber(fRawReader->GetPeriod());
2656 esd->SetTimeStamp(fRawReader->GetTimestamp());
2657 esd->SetEventType(fRawReader->GetType());
2663 //_____________________________________________________________________________
2664 Bool_t AliReconstruction::IsSelected(TString detName, TString& detectors) const
2666 // check whether detName is contained in detectors
2667 // if yes, it is removed from detectors
2669 // check if all detectors are selected
2670 if ((detectors.CompareTo("ALL") == 0) ||
2671 detectors.BeginsWith("ALL ") ||
2672 detectors.EndsWith(" ALL") ||
2673 detectors.Contains(" ALL ")) {
2678 // search for the given detector
2679 Bool_t result = kFALSE;
2680 if ((detectors.CompareTo(detName) == 0) ||
2681 detectors.BeginsWith(detName+" ") ||
2682 detectors.EndsWith(" "+detName) ||
2683 detectors.Contains(" "+detName+" ")) {
2684 detectors.ReplaceAll(detName, "");
2688 // clean up the detectors string
2689 while (detectors.Contains(" ")) detectors.ReplaceAll(" ", " ");
2690 while (detectors.BeginsWith(" ")) detectors.Remove(0, 1);
2691 while (detectors.EndsWith(" ")) detectors.Remove(detectors.Length()-1, 1);
2696 //_____________________________________________________________________________
2697 Bool_t AliReconstruction::InitRunLoader()
2699 // get or create the run loader
2701 if (gAlice) delete gAlice;
2704 TFile *gafile = TFile::Open(fGAliceFileName.Data());
2705 // if (!gSystem->AccessPathName(fGAliceFileName.Data())) { // galice.root exists
2706 if (gafile) { // galice.root exists
2710 // load all base libraries to get the loader classes
2711 TString libs = gSystem->GetLibraries();
2712 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
2713 TString detName = fgkDetectorName[iDet];
2714 if (detName == "HLT") continue;
2715 if (libs.Contains("lib" + detName + "base.so")) continue;
2716 gSystem->Load("lib" + detName + "base.so");
2718 fRunLoader = AliRunLoader::Open(fGAliceFileName.Data());
2720 AliError(Form("no run loader found in file %s", fGAliceFileName.Data()));
2725 fRunLoader->CdGAFile();
2726 fRunLoader->LoadgAlice();
2728 //PH This is a temporary fix to give access to the kinematics
2729 //PH that is needed for the labels of ITS clusters
2730 fRunLoader->LoadHeader();
2731 fRunLoader->LoadKinematics();
2733 } else { // galice.root does not exist
2735 AliError(Form("the file %s does not exist", fGAliceFileName.Data()));
2737 fRunLoader = AliRunLoader::Open(fGAliceFileName.Data(),
2738 AliConfig::GetDefaultEventFolderName(),
2741 AliError(Form("could not create run loader in file %s",
2742 fGAliceFileName.Data()));
2746 fIsNewRunLoader = kTRUE;
2747 fRunLoader->MakeTree("E");
2749 if (fNumberOfEventsPerFile > 0)
2750 fRunLoader->SetNumberOfEventsPerFile(fNumberOfEventsPerFile);
2752 fRunLoader->SetNumberOfEventsPerFile((UInt_t)-1);
2758 //_____________________________________________________________________________
2759 AliReconstructor* AliReconstruction::GetReconstructor(Int_t iDet)
2761 // get the reconstructor object and the loader for a detector
2763 if (fReconstructor[iDet]) {
2764 if (fRecoParam.GetDetRecoParamArray(iDet) && !AliReconstructor::GetRecoParam(iDet)) {
2765 const AliDetectorRecoParam *par = fRecoParam.GetDetRecoParam(iDet);
2766 fReconstructor[iDet]->SetRecoParam(par);
2767 fReconstructor[iDet]->SetRunInfo(fRunInfo);
2769 return fReconstructor[iDet];
2772 // load the reconstructor object
2773 TPluginManager* pluginManager = gROOT->GetPluginManager();
2774 TString detName = fgkDetectorName[iDet];
2775 TString recName = "Ali" + detName + "Reconstructor";
2777 if (!fIsNewRunLoader && !fRunLoader->GetLoader(detName+"Loader") && (detName != "HLT")) return NULL;
2779 AliReconstructor* reconstructor = NULL;
2780 // first check if a plugin is defined for the reconstructor
2781 TPluginHandler* pluginHandler =
2782 pluginManager->FindHandler("AliReconstructor", detName);
2783 // if not, add a plugin for it
2784 if (!pluginHandler) {
2785 AliDebug(1, Form("defining plugin for %s", recName.Data()));
2786 TString libs = gSystem->GetLibraries();
2787 if (libs.Contains("lib" + detName + "base.so") ||
2788 (gSystem->Load("lib" + detName + "base.so") >= 0)) {
2789 pluginManager->AddHandler("AliReconstructor", detName,
2790 recName, detName + "rec", recName + "()");
2792 pluginManager->AddHandler("AliReconstructor", detName,
2793 recName, detName, recName + "()");
2795 pluginHandler = pluginManager->FindHandler("AliReconstructor", detName);
2797 if (pluginHandler && (pluginHandler->LoadPlugin() == 0)) {
2798 reconstructor = (AliReconstructor*) pluginHandler->ExecPlugin(0);
2800 if (reconstructor) {
2801 TObject* obj = fOptions.FindObject(detName.Data());
2802 if (obj) reconstructor->SetOption(obj->GetTitle());
2803 reconstructor->SetRunInfo(fRunInfo);
2804 reconstructor->Init();
2805 fReconstructor[iDet] = reconstructor;
2808 // get or create the loader
2809 if (detName != "HLT") {
2810 fLoader[iDet] = fRunLoader->GetLoader(detName + "Loader");
2811 if (!fLoader[iDet]) {
2812 AliConfig::Instance()
2813 ->CreateDetectorFolders(fRunLoader->GetEventFolder(),
2815 // first check if a plugin is defined for the loader
2817 pluginManager->FindHandler("AliLoader", detName);
2818 // if not, add a plugin for it
2819 if (!pluginHandler) {
2820 TString loaderName = "Ali" + detName + "Loader";
2821 AliDebug(1, Form("defining plugin for %s", loaderName.Data()));
2822 pluginManager->AddHandler("AliLoader", detName,
2823 loaderName, detName + "base",
2824 loaderName + "(const char*, TFolder*)");
2825 pluginHandler = pluginManager->FindHandler("AliLoader", detName);
2827 if (pluginHandler && (pluginHandler->LoadPlugin() == 0)) {
2829 (AliLoader*) pluginHandler->ExecPlugin(2, detName.Data(),
2830 fRunLoader->GetEventFolder());
2832 if (!fLoader[iDet]) { // use default loader
2833 fLoader[iDet] = new AliLoader(detName, fRunLoader->GetEventFolder());
2835 if (!fLoader[iDet]) {
2836 AliWarning(Form("couldn't get loader for %s", detName.Data()));
2837 if (fStopOnError) return NULL;
2839 fRunLoader->AddLoader(fLoader[iDet]);
2840 fRunLoader->CdGAFile();
2841 if (gFile && !gFile->IsWritable()) gFile->ReOpen("UPDATE");
2842 fRunLoader->Write(0, TObject::kOverwrite);
2847 if (fRecoParam.GetDetRecoParamArray(iDet) && !AliReconstructor::GetRecoParam(iDet)) {
2848 const AliDetectorRecoParam *par = fRecoParam.GetDetRecoParam(iDet);
2849 reconstructor->SetRecoParam(par);
2850 reconstructor->SetRunInfo(fRunInfo);
2852 return reconstructor;
2855 //_____________________________________________________________________________
2856 AliVertexer* AliReconstruction::CreateVertexer()
2858 // create the vertexer
2859 // Please note that the caller is the owner of the
2862 AliVertexer* vertexer = NULL;
2863 AliReconstructor* itsReconstructor = GetReconstructor(0);
2864 if (itsReconstructor && ((fRunLocalReconstruction.Contains("ITS")) || fRunTracking.Contains("ITS"))) {
2865 vertexer = itsReconstructor->CreateVertexer();
2868 AliWarning("couldn't create a vertexer for ITS");
2874 //_____________________________________________________________________________
2875 Bool_t AliReconstruction::CreateTrackers(const TString& detectors)
2877 // create the trackers
2878 AliInfo("Creating trackers");
2880 TString detStr = detectors;
2881 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
2882 if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
2883 AliReconstructor* reconstructor = GetReconstructor(iDet);
2884 if (!reconstructor) continue;
2885 TString detName = fgkDetectorName[iDet];
2886 if (detName == "HLT") {
2887 fRunHLTTracking = kTRUE;
2890 if (detName == "MUON") {
2891 fRunMuonTracking = kTRUE;
2896 fTracker[iDet] = reconstructor->CreateTracker();
2897 if (!fTracker[iDet] && (iDet < 7)) {
2898 AliWarning(Form("couldn't create a tracker for %s", detName.Data()));
2899 if (fStopOnError) return kFALSE;
2901 AliSysInfo::AddStamp(Form("LTracker%s",fgkDetectorName[iDet]), iDet,0);
2907 //_____________________________________________________________________________
2908 void AliReconstruction::CleanUp()
2910 // delete trackers and the run loader and close and delete the file
2912 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
2913 delete fReconstructor[iDet];
2914 fReconstructor[iDet] = NULL;
2915 fLoader[iDet] = NULL;
2916 delete fTracker[iDet];
2917 fTracker[iDet] = NULL;
2922 delete fSPDTrackleter;
2923 fSPDTrackleter = NULL;
2932 delete fParentRawReader;
2933 fParentRawReader=NULL;
2941 if (AliQAManager::QAManager())
2942 AliQAManager::QAManager()->ShowQA() ;
2943 AliQAManager::Destroy() ;
2945 TGeoGlobalMagField::Instance()->SetField(NULL);
2948 void AliReconstruction::WriteAlignmentData(AliESDEvent* esd)
2950 // Write space-points which are then used in the alignment procedures
2951 // For the moment only ITS, TPC, TRD and TOF
2953 Int_t ntracks = esd->GetNumberOfTracks();
2954 for (Int_t itrack = 0; itrack < ntracks; itrack++)
2956 AliESDtrack *track = esd->GetTrack(itrack);
2959 for (Int_t i=0; i<200; ++i) idx[i] = -1; //PH avoid uninitialized values
2960 for (Int_t iDet = 5; iDet >= 0; iDet--) {// TOF, TRD, TPC, ITS clusters
2961 nsp += track->GetNcls(iDet);
2963 if (iDet==0) { // ITS "extra" clusters
2964 track->GetClusters(iDet,idx);
2965 for (Int_t i=6; i<12; i++) if(idx[i] >= 0) nsp++;
2970 AliTrackPointArray *sp = new AliTrackPointArray(nsp);
2971 track->SetTrackPointArray(sp);
2973 for (Int_t iDet = 5; iDet >= 0; iDet--) {
2974 AliTracker *tracker = fTracker[iDet];
2975 if (!tracker) continue;
2976 Int_t nspdet = track->GetClusters(iDet,idx);
2978 if (iDet==0) // ITS "extra" clusters
2979 for (Int_t i=6; i<12; i++) if(idx[i] >= 0) nspdet++;
2981 if (nspdet <= 0) continue;
2985 while (isp2 < nspdet) {
2986 Bool_t isvalid=kTRUE;
2988 Int_t index=idx[isp++];
2989 if (index < 0) continue;
2991 TString dets = fgkDetectorName[iDet];
2992 if ((fUseTrackingErrorsForAlignment.CompareTo(dets) == 0) ||
2993 fUseTrackingErrorsForAlignment.BeginsWith(dets+" ") ||
2994 fUseTrackingErrorsForAlignment.EndsWith(" "+dets) ||
2995 fUseTrackingErrorsForAlignment.Contains(" "+dets+" ")) {
2996 isvalid = tracker->GetTrackPointTrackingError(index,p,track);
2998 isvalid = tracker->GetTrackPoint(index,p);
3001 if (!isvalid) continue;
3002 if (iDet==0 && (isp-1)>=6) p.SetExtra();
3003 sp->AddPoint(isptrack,&p); isptrack++;
3010 //_____________________________________________________________________________
3011 void AliReconstruction::FillRawDataErrorLog(Int_t iEvent, AliESDEvent* esd)
3013 // The method reads the raw-data error log
3014 // accumulated within the rawReader.
3015 // It extracts the raw-data errors related to
3016 // the current event and stores them into
3017 // a TClonesArray inside the esd object.
3019 if (!fRawReader) return;
3021 for(Int_t i = 0; i < fRawReader->GetNumberOfErrorLogs(); i++) {
3023 AliRawDataErrorLog *log = fRawReader->GetErrorLog(i);
3025 if (iEvent != log->GetEventNumber()) continue;
3027 esd->AddRawDataErrorLog(log);
3032 //_____________________________________________________________________________
3033 void AliReconstruction::CheckQA()
3035 // check the QA of SIM for this run and remove the detectors
3036 // with status Fatal
3038 // TString newRunLocalReconstruction ;
3039 // TString newRunTracking ;
3040 // TString newFillESD ;
3042 // for (Int_t iDet = 0; iDet < AliQAv1::kNDET; iDet++) {
3043 // TString detName(AliQAv1::GetDetName(iDet)) ;
3044 // AliQAv1 * qa = AliQAv1::Instance(AliQAv1::DETECTORINDEX_t(iDet)) ;
3045 // if ( qa->IsSet(AliQAv1::DETECTORINDEX_t(iDet), AliQAv1::kSIM, specie, AliQAv1::kFATAL)) {
3046 // AliInfo(Form("QA status for %s %s in Hits and/or SDIGITS and/or Digits was Fatal; No reconstruction performed",
3047 // detName.Data(), AliRecoParam::GetEventSpecieName(es))) ;
3049 // if ( fRunLocalReconstruction.Contains(AliQAv1::GetDetName(iDet)) ||
3050 // fRunLocalReconstruction.Contains("ALL") ) {
3051 // newRunLocalReconstruction += detName ;
3052 // newRunLocalReconstruction += " " ;
3054 // if ( fRunTracking.Contains(AliQAv1::GetDetName(iDet)) ||
3055 // fRunTracking.Contains("ALL") ) {
3056 // newRunTracking += detName ;
3057 // newRunTracking += " " ;
3059 // if ( fFillESD.Contains(AliQAv1::GetDetName(iDet)) ||
3060 // fFillESD.Contains("ALL") ) {
3061 // newFillESD += detName ;
3062 // newFillESD += " " ;
3066 // fRunLocalReconstruction = newRunLocalReconstruction ;
3067 // fRunTracking = newRunTracking ;
3068 // fFillESD = newFillESD ;
3071 //_____________________________________________________________________________
3072 Int_t AliReconstruction::GetDetIndex(const char* detector)
3074 // return the detector index corresponding to detector
3076 for (index = 0; index < kNDetectors ; index++) {
3077 if ( strcmp(detector, fgkDetectorName[index]) == 0 )
3082 //_____________________________________________________________________________
3083 Bool_t AliReconstruction::FinishPlaneEff() {
3085 // Here execute all the necessary operationis, at the end of the tracking phase,
3086 // in case that evaluation of PlaneEfficiencies was required for some detector.
3087 // E.g., write into a DataBase file the PlaneEfficiency which have been evaluated.
3089 // This Preliminary version works only FOR ITS !!!!!
3090 // other detectors (TOF,TRD, etc. have to develop their specific codes)
3093 // Return: kTRUE if all operations have been done properly, kFALSE otherwise
3096 //for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
3097 for (Int_t iDet = 0; iDet < 1; iDet++) { // for the time being only ITS
3098 //if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
3099 if(fTracker[iDet] && fTracker[iDet]->GetPlaneEff()) {
3100 AliPlaneEff *planeeff=fTracker[iDet]->GetPlaneEff();
3101 TString name=planeeff->GetName();
3103 TFile* pefile = TFile::Open(name, "RECREATE");
3104 ret=(Bool_t)planeeff->Write();
3106 if(planeeff->GetCreateHistos()) {
3107 TString hname=planeeff->GetName();
3108 hname+="Histo.root";
3109 ret*=planeeff->WriteHistosToFile(hname,"RECREATE");
3112 if(fSPDTrackleter) {
3113 AliPlaneEff *planeeff=fSPDTrackleter->GetPlaneEff();
3114 TString name="AliITSPlaneEffSPDtracklet.root";
3115 TFile* pefile = TFile::Open(name, "RECREATE");
3116 ret=(Bool_t)planeeff->Write();
3118 AliESDEvent *dummy=NULL;
3119 ret=(Bool_t)fSPDTrackleter->PostProcess(dummy); // take care of writing other files
3124 //_____________________________________________________________________________
3125 Bool_t AliReconstruction::InitPlaneEff() {
3127 // Here execute all the necessary operations, before of the tracking phase,
3128 // for the evaluation of PlaneEfficiencies, in case required for some detectors.
3129 // E.g., read from a DataBase file a first evaluation of the PlaneEfficiency
3130 // which should be updated/recalculated.
3132 // This Preliminary version will work only FOR ITS !!!!!
3133 // other detectors (TOF,TRD, etc. have to develop their specific codes)
3136 // Return: kTRUE if all operations have been done properly, kFALSE otherwise
3138 AliWarning(Form("Implementation of this method not yet completed !! Method return kTRUE"));
3140 fSPDTrackleter = NULL;
3141 AliReconstructor* itsReconstructor = GetReconstructor(0);
3142 if (itsReconstructor) {
3143 fSPDTrackleter = itsReconstructor->CreateTrackleter(); // this is NULL unless required in RecoParam
3145 if (fSPDTrackleter) {
3146 AliInfo("Trackleter for SPD has been created");
3152 //_____________________________________________________________________________
3153 Bool_t AliReconstruction::InitAliEVE()
3155 // This method should be called only in case
3156 // AliReconstruction is run
3157 // within the alieve environment.
3158 // It will initialize AliEVE in a way
3159 // so that it can visualize event processed
3160 // by AliReconstruction.
3161 // The return flag shows whenever the
3162 // AliEVE initialization was successful or not.
3165 macroStr.Form("%s/EVE/macros/alieve_online.C",gSystem->ExpandPathName("$ALICE_ROOT"));
3166 AliInfo(Form("Loading AliEVE macro: %s",macroStr.Data()));
3167 if (gROOT->LoadMacro(macroStr.Data()) != 0) return kFALSE;
3169 gROOT->ProcessLine("if (!AliEveEventManager::GetMaster()){new AliEveEventManager();AliEveEventManager::GetMaster()->AddNewEventCommand(\"alieve_online_on_new_event()\");gEve->AddEvent(AliEveEventManager::GetMaster());};");
3170 gROOT->ProcessLine("alieve_online_init()");
3175 //_____________________________________________________________________________
3176 void AliReconstruction::RunAliEVE()
3178 // Runs AliEVE visualisation of
3179 // the current event.
3180 // Should be executed only after
3181 // successful initialization of AliEVE.
3183 AliInfo("Running AliEVE...");
3184 gROOT->ProcessLine(Form("AliEveEventManager::GetMaster()->SetEvent((AliRunLoader*)0x%lx,(AliRawReader*)0x%lx,(AliESDEvent*)0x%lx,(AliESDfriend*)0x%lx);",fRunLoader,fRawReader,fesd,fesdf));
3188 //_____________________________________________________________________________
3189 Bool_t AliReconstruction::SetRunQA(TString detAndAction)
3191 // Allows to run QA for a selected set of detectors
3192 // and a selected set of tasks among RAWS, DIGITSR, RECPOINTS and ESDS
3193 // all selected detectors run the same selected tasks
3195 if (!detAndAction.Contains(":")) {
3196 AliError( Form("%s is a wrong syntax, use \"DetectorList:ActionList\" \n", detAndAction.Data()) ) ;
3200 Int_t colon = detAndAction.Index(":") ;
3201 fQADetectors = detAndAction(0, colon) ;
3202 if (fQADetectors.Contains("ALL") )
3203 fQADetectors = fFillESD ;
3204 fQATasks = detAndAction(colon+1, detAndAction.Sizeof() ) ;
3205 if (fQATasks.Contains("ALL") ) {
3206 fQATasks = Form("%d %d %d %d", AliQAv1::kRAWS, AliQAv1::kDIGITSR, AliQAv1::kRECPOINTS, AliQAv1::kESDS) ;
3208 fQATasks.ToUpper() ;
3210 if ( fQATasks.Contains("RAW") )
3211 tempo = Form("%d ", AliQAv1::kRAWS) ;
3212 if ( fQATasks.Contains("DIGIT") )
3213 tempo += Form("%d ", AliQAv1::kDIGITSR) ;
3214 if ( fQATasks.Contains("RECPOINT") )
3215 tempo += Form("%d ", AliQAv1::kRECPOINTS) ;
3216 if ( fQATasks.Contains("ESD") )
3217 tempo += Form("%d ", AliQAv1::kESDS) ;
3219 if (fQATasks.IsNull()) {
3220 AliInfo("No QA requested\n") ;
3225 TString tempo(fQATasks) ;
3226 tempo.ReplaceAll(Form("%d", AliQAv1::kRAWS), AliQAv1::GetTaskName(AliQAv1::kRAWS)) ;
3227 tempo.ReplaceAll(Form("%d", AliQAv1::kDIGITSR), AliQAv1::GetTaskName(AliQAv1::kDIGITSR)) ;
3228 tempo.ReplaceAll(Form("%d", AliQAv1::kRECPOINTS), AliQAv1::GetTaskName(AliQAv1::kRECPOINTS)) ;
3229 tempo.ReplaceAll(Form("%d", AliQAv1::kESDS), AliQAv1::GetTaskName(AliQAv1::kESDS)) ;
3230 AliInfo( Form("QA will be done on \"%s\" for \"%s\"\n", fQADetectors.Data(), tempo.Data()) ) ;
3235 //_____________________________________________________________________________
3236 Bool_t AliReconstruction::InitRecoParams()
3238 // The method accesses OCDB and retrieves all
3239 // the available reco-param objects from there.
3241 Bool_t isOK = kTRUE;
3243 if (fRecoParam.GetDetRecoParamArray(kNDetectors)) {
3244 AliInfo("Using custom GRP reconstruction parameters");
3247 AliInfo("Loading GRP reconstruction parameter objects");
3249 AliCDBPath path("GRP","Calib","RecoParam");
3250 AliCDBEntry *entry=AliCDBManager::Instance()->Get(path.GetPath());
3252 AliWarning("Couldn't find GRP RecoParam entry in OCDB");
3256 TObject *recoParamObj = entry->GetObject();
3257 if (dynamic_cast<TObjArray*>(recoParamObj)) {
3258 // GRP has a normal TobjArray of AliDetectorRecoParam objects
3259 // Registering them in AliRecoParam
3260 fRecoParam.AddDetRecoParamArray(kNDetectors,dynamic_cast<TObjArray*>(recoParamObj));
3262 else if (dynamic_cast<AliDetectorRecoParam*>(recoParamObj)) {
3263 // GRP has only onse set of reco parameters
3264 // Registering it in AliRecoParam
3265 AliInfo("Single set of GRP reconstruction parameters found");
3266 dynamic_cast<AliDetectorRecoParam*>(recoParamObj)->SetAsDefault();
3267 fRecoParam.AddDetRecoParam(kNDetectors,dynamic_cast<AliDetectorRecoParam*>(recoParamObj));
3270 AliError("No valid GRP RecoParam object found in the OCDB");
3277 TString detStr = fLoadCDB;
3278 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
3280 if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
3282 if (fRecoParam.GetDetRecoParamArray(iDet)) {
3283 AliInfo(Form("Using custom reconstruction parameters for detector %s",fgkDetectorName[iDet]));
3287 AliInfo(Form("Loading reconstruction parameter objects for detector %s",fgkDetectorName[iDet]));
3289 AliCDBPath path(fgkDetectorName[iDet],"Calib","RecoParam");
3290 AliCDBEntry *entry=AliCDBManager::Instance()->Get(path.GetPath());
3292 AliWarning(Form("Couldn't find RecoParam entry in OCDB for detector %s",fgkDetectorName[iDet]));
3296 TObject *recoParamObj = entry->GetObject();
3297 if (dynamic_cast<TObjArray*>(recoParamObj)) {
3298 // The detector has a normal TobjArray of AliDetectorRecoParam objects
3299 // Registering them in AliRecoParam
3300 fRecoParam.AddDetRecoParamArray(iDet,dynamic_cast<TObjArray*>(recoParamObj));
3302 else if (dynamic_cast<AliDetectorRecoParam*>(recoParamObj)) {
3303 // The detector has only onse set of reco parameters
3304 // Registering it in AliRecoParam
3305 AliInfo(Form("Single set of reconstruction parameters found for detector %s",fgkDetectorName[iDet]));
3306 dynamic_cast<AliDetectorRecoParam*>(recoParamObj)->SetAsDefault();
3307 fRecoParam.AddDetRecoParam(iDet,dynamic_cast<AliDetectorRecoParam*>(recoParamObj));
3310 AliError(Form("No valid RecoParam object found in the OCDB for detector %s",fgkDetectorName[iDet]));
3314 // FIX ME: We have to disable the unloading of reco-param CDB
3315 // entries because QA framework is using them. Has to be fix in
3316 // a way that the QA takes the objects already constructed in
3318 // AliCDBManager::Instance()->UnloadFromCache(path.GetPath());
3322 if (AliDebugLevel() > 0) fRecoParam.Print();
3327 //_____________________________________________________________________________
3328 Bool_t AliReconstruction::GetEventInfo()
3330 // Fill the event info object
3332 AliCodeTimerAuto("")
3334 AliCentralTrigger *aCTP = NULL;
3336 fEventInfo.SetEventType(fRawReader->GetType());
3338 ULong64_t mask = fRawReader->GetClassMask();
3339 fEventInfo.SetTriggerMask(mask);
3340 UInt_t clmask = fRawReader->GetDetectorPattern()[0];
3341 fEventInfo.SetTriggerCluster(AliDAQ::ListOfTriggeredDetectors(clmask));
3343 aCTP = new AliCentralTrigger();
3344 TString configstr("");
3345 if (!aCTP->LoadConfiguration(configstr)) { // Load CTP config from OCDB
3346 AliError("No trigger configuration found in OCDB! The trigger configuration information will not be used!");
3350 aCTP->SetClassMask(mask);
3351 aCTP->SetClusterMask(clmask);
3354 fEventInfo.SetEventType(AliRawEventHeaderBase::kPhysicsEvent);
3356 if (fRunLoader && (!fRunLoader->LoadTrigger())) {
3357 aCTP = fRunLoader->GetTrigger();
3358 fEventInfo.SetTriggerMask(aCTP->GetClassMask());
3359 // get inputs from actp - just get
3360 AliESDHeader* esdheader = fesd->GetHeader();
3361 esdheader->SetL0TriggerInputs(aCTP->GetL0TriggerInputs());
3362 esdheader->SetL1TriggerInputs(aCTP->GetL1TriggerInputs());
3363 esdheader->SetL2TriggerInputs(aCTP->GetL2TriggerInputs());
3364 fEventInfo.SetTriggerCluster(AliDAQ::ListOfTriggeredDetectors(aCTP->GetClusterMask()));
3367 AliWarning("No trigger can be loaded! The trigger information will not be used!");
3372 AliTriggerConfiguration *config = aCTP->GetConfiguration();
3374 AliError("No trigger configuration has been found! The trigger configuration information will not be used!");
3375 if (fRawReader) delete aCTP;
3379 UChar_t clustmask = 0;
3381 ULong64_t trmask = fEventInfo.GetTriggerMask();
3382 const TObjArray& classesArray = config->GetClasses();
3383 Int_t nclasses = classesArray.GetEntriesFast();
3384 for( Int_t iclass=0; iclass < nclasses; iclass++ ) {
3385 AliTriggerClass* trclass = (AliTriggerClass*)classesArray.At(iclass);
3387 Int_t trindex = TMath::Nint(TMath::Log2(trclass->GetMask()));
3388 fesd->SetTriggerClass(trclass->GetName(),trindex);
3389 if (fRawReader) fRawReader->LoadTriggerClass(trclass->GetName(),trindex);
3390 if (trmask & (1ull << trindex)) {
3392 trclasses += trclass->GetName();
3394 clustmask |= trclass->GetCluster()->GetClusterMask();
3398 fEventInfo.SetTriggerClasses(trclasses);
3400 // Set the information in ESD
3401 fesd->SetTriggerMask(trmask);
3402 fesd->SetTriggerCluster(clustmask);
3404 if (!aCTP->CheckTriggeredDetectors()) {
3405 if (fRawReader) delete aCTP;
3409 if (fRawReader) delete aCTP;
3411 // We have to fill also the HLT decision here!!
3417 const char *AliReconstruction::MatchDetectorList(const char *detectorList, UInt_t detectorMask)
3419 // Match the detector list found in the rec.C or the default 'ALL'
3420 // to the list found in the GRP (stored there by the shuttle PP which
3421 // gets the information from ECS)
3422 static TString resultList;
3423 TString detList = detectorList;
3427 for(Int_t iDet = 0; iDet < (AliDAQ::kNDetectors-1); iDet++) {
3428 if ((detectorMask >> iDet) & 0x1) {
3429 TString det = AliDAQ::OfflineModuleName(iDet);
3430 if ((detList.CompareTo("ALL") == 0) ||
3431 ((detList.BeginsWith("ALL ") ||
3432 detList.EndsWith(" ALL") ||
3433 detList.Contains(" ALL ")) &&
3434 !(detList.BeginsWith("-"+det+" ") ||
3435 detList.EndsWith(" -"+det) ||
3436 detList.Contains(" -"+det+" "))) ||
3437 (detList.CompareTo(det) == 0) ||
3438 detList.BeginsWith(det+" ") ||
3439 detList.EndsWith(" "+det) ||
3440 detList.Contains( " "+det+" " )) {
3441 if (!resultList.EndsWith(det + " ")) {
3450 if ((detectorMask >> AliDAQ::kHLTId) & 0x1) {
3451 TString hltDet = AliDAQ::OfflineModuleName(AliDAQ::kNDetectors-1);
3452 if ((detList.CompareTo("ALL") == 0) ||
3453 ((detList.BeginsWith("ALL ") ||
3454 detList.EndsWith(" ALL") ||
3455 detList.Contains(" ALL ")) &&
3456 !(detList.BeginsWith("-"+hltDet+" ") ||
3457 detList.EndsWith(" -"+hltDet) ||
3458 detList.Contains(" -"+hltDet+" "))) ||
3459 (detList.CompareTo(hltDet) == 0) ||
3460 detList.BeginsWith(hltDet+" ") ||
3461 detList.EndsWith(" "+hltDet) ||
3462 detList.Contains( " "+hltDet+" " )) {
3463 resultList += hltDet;
3467 return resultList.Data();
3471 //______________________________________________________________________________
3472 void AliReconstruction::Abort(const char *method, EAbort what)
3474 // Abort processing. If what = kAbortProcess, the Process() loop will be
3475 // aborted. If what = kAbortFile, the current file in a chain will be
3476 // aborted and the processing will continue with the next file, if there
3477 // is no next file then Process() will be aborted. Abort() can also be
3478 // called from Begin(), SlaveBegin(), Init() and Notify(). After abort
3479 // the SlaveTerminate() and Terminate() are always called. The abort flag
3480 // can be checked in these methods using GetAbort().
3482 // The method is overwritten in AliReconstruction for better handling of
3483 // reco specific errors
3485 if (!fStopOnError) return;
3489 TString whyMess = method;
3490 whyMess += " failed! Aborting...";
3492 AliError(whyMess.Data());
3495 TString mess = "Abort";
3496 if (fAbort == kAbortProcess)
3497 mess = "AbortProcess";
3498 else if (fAbort == kAbortFile)
3501 Info(mess, whyMess.Data());
3504 //______________________________________________________________________________
3505 Bool_t AliReconstruction::ProcessEvent(void* event)
3507 // Method that is used in case the event loop
3508 // is steered from outside, for example by AMORE
3509 // 'event' is a pointer to the DATE event in the memory
3511 if (fRawReader) delete fRawReader;
3512 fRawReader = new AliRawReaderDate(event);
3513 fStatus = ProcessEvent(fRunLoader->GetNumberOfEvents());