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>
134 #include <THashList.h>
136 #include "AliAlignObj.h"
137 #include "AliAnalysisManager.h"
138 #include "AliAnalysisDataContainer.h"
139 #include "AliCDBEntry.h"
140 #include "AliCDBManager.h"
141 #include "AliCDBStorage.h"
142 #include "AliCTPRawStream.h"
143 #include "AliCascadeVertexer.h"
144 #include "AliCentralTrigger.h"
145 #include "AliCodeTimer.h"
147 #include "AliDetectorRecoParam.h"
148 #include "AliESDCaloCells.h"
149 #include "AliESDCaloCluster.h"
150 #include "AliESDEvent.h"
151 #include "AliESDMuonTrack.h"
152 #include "AliESDPmdTrack.h"
153 #include "AliESDTagCreator.h"
154 #include "AliESDVertex.h"
155 #include "AliESDcascade.h"
156 #include "AliESDfriend.h"
157 #include "AliESDkink.h"
158 #include "AliESDpid.h"
159 #include "AliESDtrack.h"
160 #include "AliESDtrack.h"
161 #include "AliEventInfo.h"
162 #include "AliGRPObject.h"
163 #include "AliGRPRecoParam.h"
164 #include "AliGenEventHeader.h"
165 #include "AliGeomManager.h"
166 #include "AliGlobalQADataMaker.h"
167 #include "AliHeader.h"
170 #include "AliMultiplicity.h"
172 #include "AliPlaneEff.h"
174 #include "AliQADataMakerRec.h"
175 #include "AliQAManager.h"
176 #include "AliRawVEvent.h"
177 #include "AliRawEventHeaderBase.h"
178 #include "AliRawHLTManager.h"
179 #include "AliRawReaderDate.h"
180 #include "AliRawReaderFile.h"
181 #include "AliRawReaderRoot.h"
182 #include "AliRecoInputHandler.h"
183 #include "AliReconstruction.h"
184 #include "AliReconstructor.h"
186 #include "AliRunInfo.h"
187 #include "AliRunLoader.h"
188 #include "AliSysInfo.h" // memory snapshots
189 #include "AliTrackPointArray.h"
190 #include "AliTracker.h"
191 #include "AliTriggerClass.h"
192 #include "AliTriggerCluster.h"
193 #include "AliTriggerIR.h"
194 #include "AliTriggerConfiguration.h"
195 #include "AliV0vertexer.h"
196 #include "AliVertexer.h"
197 #include "AliTrackleter.h"
198 #include "AliVertexerTracks.h"
199 #include "AliTriggerRunScalers.h"
200 #include "AliCTPTimeParams.h"
201 #include "AliESDHLTDecision.h"
202 #include "AliTriggerInput.h"
203 #include "AliLHCData.h"
204 #include "ARVersion.h"
205 #include <RVersion.h>
207 #include <sys/resource.h>
208 ClassImp(AliReconstruction)
212 //_____________________________________________________________________________
213 const char* AliReconstruction::fgkStopEvFName = "_stopEvent_";
214 const char* AliReconstruction::fgkDetectorName[AliReconstruction::kNDetectors] = {"ITS", "TPC", "TRD", "TOF", "PHOS", "HMPID", "EMCAL", "MUON", "FMD", "ZDC", "PMD", "T0", "VZERO", "ACORDE"
215 // #ifdef MFT_UPGRADE
222 //_____________________________________________________________________________
223 AliReconstruction::AliReconstruction(const char* gAliceFilename) :
225 fRunVertexFinder(kTRUE),
226 fRunVertexFinderTracks(kTRUE),
227 fRunMuonTracking(kFALSE),
229 fRunCascadeFinder(kTRUE),
230 fRunMultFinder(kTRUE),
232 fStopOnMissingTriggerFile(kTRUE),
233 fWriteAlignmentData(kFALSE),
234 fWriteESDfriend(kFALSE),
235 fFillTriggerESD(kTRUE),
243 fRunLocalReconstruction("ALL"),
246 fDeleteRecPoints(""),
249 fUseTrackingErrorsForAlignment(""),
250 fGAliceFileName(gAliceFilename),
253 fProofOutputFileName(""),
254 fProofOutputLocation(""),
255 fProofOutputDataset(kFALSE),
256 fProofOutputArchive(""),
260 fNumberOfEventsPerFile((UInt_t)-1),
261 fFractionFriends(0.04),
263 fLoadAlignFromCDB(kTRUE),
264 fLoadAlignData("ALL"),
269 fCTPTimeParams(NULL),
274 fParentRawReader(NULL),
278 fSPDTrackleter(NULL),
280 fDiamondProfileSPD(NULL),
281 fDiamondProfile(NULL),
282 fDiamondProfileTPC(NULL),
283 fListOfCosmicTriggers(NULL),
287 fAlignObjArray(NULL),
291 fInitCDBCalled(kFALSE),
292 fCDBSnapshotMode(kFALSE),
293 fSetRunNumberFromDataCalled(kFALSE),
298 fSameQACycle(kFALSE),
299 fInitQACalled(kFALSE),
300 fWriteQAExpertData(kTRUE),
301 fRunPlaneEff(kFALSE),
312 fIsNewRunLoader(kFALSE),
324 fDeclTriggerClasses(""),
329 // create reconstruction object with default parameters
332 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
333 fReconstructor[iDet] = NULL;
334 fUpgradeMask[iDet]=kFALSE;
335 fLoader[iDet] = NULL;
336 fTracker[iDet] = NULL;
338 for (Int_t iDet = 0; iDet < AliQAv1::kNDET; iDet++) {
339 fQACycles[iDet] = 999999 ;
340 fQAWriteExpert[iDet] = kFALSE ;
342 fBeamInt[0][0]=fBeamInt[0][1]=fBeamInt[1][0]=fBeamInt[1][1] = -1;
347 //_____________________________________________________________________________
348 AliReconstruction::AliReconstruction(const AliReconstruction& rec) :
350 fRunVertexFinder(rec.fRunVertexFinder),
351 fRunVertexFinderTracks(rec.fRunVertexFinderTracks),
352 fRunMuonTracking(rec.fRunMuonTracking),
353 fRunV0Finder(rec.fRunV0Finder),
354 fRunCascadeFinder(rec.fRunCascadeFinder),
355 fRunMultFinder(rec.fRunMultFinder),
356 fStopOnError(rec.fStopOnError),
357 fStopOnMissingTriggerFile(rec.fStopOnMissingTriggerFile),
358 fWriteAlignmentData(rec.fWriteAlignmentData),
359 fWriteESDfriend(rec.fWriteESDfriend),
360 fFillTriggerESD(rec.fFillTriggerESD),
362 fCleanESD(rec.fCleanESD),
363 fV0DCAmax(rec.fV0DCAmax),
364 fV0CsPmin(rec.fV0CsPmin),
368 fRunLocalReconstruction(rec.fRunLocalReconstruction),
369 fRunTracking(rec.fRunTracking),
370 fFillESD(rec.fFillESD),
371 fDeleteRecPoints(""),
373 fLoadCDB(rec.fLoadCDB),
374 fUseTrackingErrorsForAlignment(rec.fUseTrackingErrorsForAlignment),
375 fGAliceFileName(rec.fGAliceFileName),
376 fRawInput(rec.fRawInput),
377 fESDOutput(rec.fESDOutput),
378 fProofOutputFileName(rec.fProofOutputFileName),
379 fProofOutputLocation(rec.fProofOutputLocation),
380 fProofOutputDataset(rec.fProofOutputDataset),
381 fProofOutputArchive(rec.fProofOutputArchive),
382 fEquipIdMap(rec.fEquipIdMap),
383 fFirstEvent(rec.fFirstEvent),
384 fLastEvent(rec.fLastEvent),
385 fNumberOfEventsPerFile(rec.fNumberOfEventsPerFile),
386 fFractionFriends(rec.fFractionFriends),
388 fLoadAlignFromCDB(rec.fLoadAlignFromCDB),
389 fLoadAlignData(rec.fLoadAlignData),
390 fUseHLTData(rec.fUseHLTData),
394 fCTPTimeParams(NULL),
399 fParentRawReader(NULL),
401 fRecoParam(rec.fRecoParam),
403 fSPDTrackleter(NULL),
405 fDiamondProfileSPD(rec.fDiamondProfileSPD),
406 fDiamondProfile(rec.fDiamondProfile),
407 fDiamondProfileTPC(rec.fDiamondProfileTPC),
408 fListOfCosmicTriggers(NULL),
412 fAlignObjArray(rec.fAlignObjArray),
413 fCDBUri(rec.fCDBUri),
414 fQARefUri(rec.fQARefUri),
416 fInitCDBCalled(rec.fInitCDBCalled),
417 fCDBSnapshotMode(rec.fCDBSnapshotMode),
418 fSetRunNumberFromDataCalled(rec.fSetRunNumberFromDataCalled),
419 fQADetectors(rec.fQADetectors),
420 fQATasks(rec.fQATasks),
422 fRunGlobalQA(rec.fRunGlobalQA),
423 fSameQACycle(rec.fSameQACycle),
424 fInitQACalled(rec.fInitQACalled),
425 fWriteQAExpertData(rec.fWriteQAExpertData),
426 fRunPlaneEff(rec.fRunPlaneEff),
437 fIsNewRunLoader(rec.fIsNewRunLoader),
446 fAnalysisMacro(rec.fAnalysisMacro),
449 fDeclTriggerClasses(rec.fDeclTriggerClasses),
456 for (Int_t i = 0; i < rec.fOptions.GetEntriesFast(); i++) {
457 if (rec.fOptions[i]) fOptions.Add(rec.fOptions[i]->Clone());
459 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
460 fReconstructor[iDet] = NULL;
461 fUpgradeMask[iDet] = kFALSE;
462 fLoader[iDet] = NULL;
463 fTracker[iDet] = NULL;
466 for (Int_t iDet = 0; iDet < AliQAv1::kNDET; iDet++) {
467 fQACycles[iDet] = rec.fQACycles[iDet];
468 fQAWriteExpert[iDet] = rec.fQAWriteExpert[iDet] ;
471 for (Int_t i = 0; i < rec.fSpecCDBUri.GetEntriesFast(); i++) {
472 if (rec.fSpecCDBUri[i]) fSpecCDBUri.Add(rec.fSpecCDBUri[i]->Clone());
475 for (int i=2;i--;) for (int j=2;j--;) fBeamInt[i][j] = rec.fBeamInt[i][j];
479 //_____________________________________________________________________________
480 AliReconstruction& AliReconstruction::operator = (const AliReconstruction& rec)
482 // assignment operator
483 // Used in PROOF mode
484 // Be very careful while modifing it!
485 // Simple rules to follow:
486 // for persistent data members - use their assignment operators
487 // for non-persistent ones - do nothing or take the default values from constructor
488 // TSelector members should not be touched
489 if(&rec == this) return *this;
491 fRunVertexFinder = rec.fRunVertexFinder;
492 fRunVertexFinderTracks = rec.fRunVertexFinderTracks;
493 fRunMuonTracking = rec.fRunMuonTracking;
494 fRunV0Finder = rec.fRunV0Finder;
495 fRunCascadeFinder = rec.fRunCascadeFinder;
496 fRunMultFinder = rec.fRunMultFinder;
497 fStopOnError = rec.fStopOnError;
498 fStopOnMissingTriggerFile = rec.fStopOnMissingTriggerFile;
499 fWriteAlignmentData = rec.fWriteAlignmentData;
500 fWriteESDfriend = rec.fWriteESDfriend;
501 fFillTriggerESD = rec.fFillTriggerESD;
503 fCleanESD = rec.fCleanESD;
504 fV0DCAmax = rec.fV0DCAmax;
505 fV0CsPmin = rec.fV0CsPmin;
509 fRunLocalReconstruction = rec.fRunLocalReconstruction;
510 fRunTracking = rec.fRunTracking;
511 fFillESD = rec.fFillESD;
512 fDeleteRecPoints = rec.fDeleteRecPoints;
513 fDeleteDigits = rec.fDeleteDigits;
514 fLoadCDB = rec.fLoadCDB;
515 fUseTrackingErrorsForAlignment = rec.fUseTrackingErrorsForAlignment;
516 fGAliceFileName = rec.fGAliceFileName;
517 fRawInput = rec.fRawInput;
518 fESDOutput = rec.fESDOutput;
519 fProofOutputFileName = rec.fProofOutputFileName;
520 fProofOutputLocation = rec.fProofOutputLocation;
521 fProofOutputDataset = rec.fProofOutputDataset;
522 fProofOutputArchive = rec.fProofOutputArchive;
523 fEquipIdMap = rec.fEquipIdMap;
524 fFirstEvent = rec.fFirstEvent;
525 fLastEvent = rec.fLastEvent;
526 fNumberOfEventsPerFile = rec.fNumberOfEventsPerFile;
527 fFractionFriends = rec.fFractionFriends;
529 for (Int_t i = 0; i < rec.fOptions.GetEntriesFast(); i++) {
530 if (rec.fOptions[i]) fOptions.Add(rec.fOptions[i]->Clone());
533 fLoadAlignFromCDB = rec.fLoadAlignFromCDB;
534 fLoadAlignData = rec.fLoadAlignData;
535 fUseHLTData = rec.fUseHLTData;
537 delete fRunInfo; fRunInfo = NULL;
538 if (rec.fRunInfo) fRunInfo = new AliRunInfo(*rec.fRunInfo);
540 fEventInfo = rec.fEventInfo;
542 delete fRunScalers; fRunScalers = NULL;
543 if (rec.fRunScalers) fRunScalers = new AliTriggerRunScalers(*rec.fRunScalers);
545 delete fCTPTimeParams; fCTPTimeParams = NULL;
546 if (rec.fCTPTimeParams) fCTPTimeParams = new AliCTPTimeParams(*rec.fCTPTimeParams);
547 delete fCTPTimeAlign; fCTPTimeAlign = NULL;
548 if (rec.fCTPTimeAlign) fCTPTimeAlign = new AliCTPTimeParams(*rec.fCTPTimeAlign);
552 fParentRawReader = NULL;
554 fRecoParam = rec.fRecoParam;
556 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
557 fUpgradeMask[iDet] = kFALSE;
558 delete fReconstructor[iDet]; fReconstructor[iDet] = NULL;
559 delete fLoader[iDet]; fLoader[iDet] = NULL;
560 delete fTracker[iDet]; fTracker[iDet] = NULL;
563 for (Int_t iDet = 0; iDet < AliQAv1::kNDET; iDet++) {
564 fQACycles[iDet] = rec.fQACycles[iDet];
565 fQAWriteExpert[iDet] = rec.fQAWriteExpert[iDet] ;
568 delete fSPDTrackleter; fSPDTrackleter = NULL;
570 delete fDiamondProfileSPD; fDiamondProfileSPD = NULL;
571 if (rec.fDiamondProfileSPD) fDiamondProfileSPD = new AliESDVertex(*rec.fDiamondProfileSPD);
572 delete fDiamondProfile; fDiamondProfile = NULL;
573 if (rec.fDiamondProfile) fDiamondProfile = new AliESDVertex(*rec.fDiamondProfile);
574 delete fDiamondProfileTPC; fDiamondProfileTPC = NULL;
575 if (rec.fDiamondProfileTPC) fDiamondProfileTPC = new AliESDVertex(*rec.fDiamondProfileTPC);
577 delete fListOfCosmicTriggers; fListOfCosmicTriggers = NULL;
578 if (rec.fListOfCosmicTriggers) fListOfCosmicTriggers = (THashTable*)((rec.fListOfCosmicTriggers)->Clone());
580 delete fGRPData; fGRPData = NULL;
581 // if (rec.fGRPData) fGRPData = (TMap*)((rec.fGRPData)->Clone());
582 if (rec.fGRPData) fGRPData = (AliGRPObject*)((rec.fGRPData)->Clone());
584 delete fAlignObjArray; fAlignObjArray = NULL;
587 fQARefUri = rec.fQARefUri;
588 fSpecCDBUri.Delete();
589 fInitCDBCalled = rec.fInitCDBCalled;
590 fCDBSnapshotMode = rec.fCDBSnapshotMode;
591 fSetRunNumberFromDataCalled = rec.fSetRunNumberFromDataCalled;
592 fQADetectors = rec.fQADetectors;
593 fQATasks = rec.fQATasks;
595 fRunGlobalQA = rec.fRunGlobalQA;
596 fSameQACycle = rec.fSameQACycle;
597 fInitQACalled = rec.fInitQACalled;
598 fWriteQAExpertData = rec.fWriteQAExpertData;
599 fRunPlaneEff = rec.fRunPlaneEff;
600 for (int i=2;i--;) for (int j=2;j--;) fBeamInt[i][j] = rec.fBeamInt[i][j];
610 fIsNewRunLoader = rec.fIsNewRunLoader;
619 fAnalysisMacro = rec.fAnalysisMacro;
622 fDeclTriggerClasses = rec.fDeclTriggerClasses;
627 //_____________________________________________________________________________
628 AliReconstruction::~AliReconstruction()
633 if (fListOfCosmicTriggers) {
634 fListOfCosmicTriggers->Delete();
635 delete fListOfCosmicTriggers;
639 delete fCTPTimeParams;
640 delete fCTPTimeAlign;
642 if (fAlignObjArray) {
643 fAlignObjArray->Delete();
644 delete fAlignObjArray;
646 fSpecCDBUri.Delete();
648 AliCodeTimer::Instance()->Print();
651 //_____________________________________________________________________________
652 void AliReconstruction::InitQA()
654 //Initialize the QA and start of cycle
655 AliCodeTimerAuto("",0);
657 if (fInitQACalled) return;
658 fInitQACalled = kTRUE;
660 if (fGRPData) AliQADataMaker::SetCloningRequest( fGRPData->GetQATrigClasses(), fGRPData->GetQACloningRequest());
663 AliQAManager * qam = AliQAManager::QAManager(AliQAv1::kRECMODE) ;
664 qam->SetSaveData(kTRUE);
665 qam->SetCycleLength(AliQAv1::kITS, 5) ;
666 if (fWriteQAExpertData)
667 qam->SetWriteExpert() ;
669 if (qam->IsDefaultStorageSet()) {
670 AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
671 AliWarning("Default QA reference storage has been already set !");
672 AliWarning(Form("Ignoring the default storage declared in AliReconstruction: %s",fQARefUri.Data()));
673 AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
674 fQARefUri = qam->GetDefaultStorage()->GetURI();
676 if (fQARefUri.Length() > 0) {
677 AliDebug(2,"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
678 AliDebug(2, Form("Default QA reference storage is set to: %s", fQARefUri.Data()));
679 AliDebug(2, "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
681 fQARefUri="local://$ALICE_ROOT/QAref";
682 AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
683 AliWarning("Default QA refeference storage not yet set !!!!");
684 AliWarning(Form("Setting it now to: %s", fQARefUri.Data()));
685 AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
688 qam->SetDefaultStorage(fQARefUri);
692 qam->SetActiveDetectors(fQADetectors) ;
693 qam->SetActiveOnlineDetectors(fRunInfo->GetActiveDetectors());
695 for (Int_t det = 0 ; det < AliQAv1::kNDET ; det++) {
696 qam->SetCycleLength(AliQAv1::DETECTORINDEX_t(det), fQACycles[det]) ;
697 qam->SetWriteExpert(AliQAv1::DETECTORINDEX_t(det)) ;
699 if (!fRawReader && !fInput && IsInTasks(AliQAv1::kRAWS))
700 fQATasks.ReplaceAll(Form("%d",AliQAv1::kRAWS), "") ;
701 qam->SetTasks(fQATasks) ;
702 qam->InitQADataMaker(AliCDBManager::Instance()->GetRun()) ;
705 Bool_t sameCycle = kFALSE ;
706 AliQADataMaker *qadm = qam->GetQADataMaker(AliQAv1::kGLOBAL);
707 AliInfo(Form("Initializing the global QA data maker"));
708 if (IsInTasks(AliQAv1::kRECPOINTS)) {
709 qadm->StartOfCycle(AliQAv1::kRECPOINTS, AliCDBManager::Instance()->GetRun(), sameCycle) ;
710 TObjArray **arr=qadm->Init(AliQAv1::kRECPOINTS);
711 AliTracker::SetResidualsArray(arr);
714 if (IsInTasks(AliQAv1::kESDS)) {
715 qadm->StartOfCycle(AliQAv1::kESDS, AliCDBManager::Instance()->GetRun(), sameCycle) ;
716 qadm->Init(AliQAv1::kESDS);
719 AliSysInfo::AddStamp("InitQA") ;
722 //_____________________________________________________________________________
723 void AliReconstruction::MergeQA(const char *fileName)
725 //Initialize the QA and start of cycle
726 AliCodeTimerAuto("",0) ;
727 AliQAManager::QAManager()->Merge(AliCDBManager::Instance()->GetRun(),fileName) ;
728 AliSysInfo::AddStamp("MergeQA") ;
731 //_____________________________________________________________________________
732 void AliReconstruction::InitCDB()
734 // activate a default CDB storage
735 // First check if we have any CDB storage set, because it is used
736 // to retrieve the calibration and alignment constants
737 AliCodeTimerAuto("",0);
739 if (fInitCDBCalled) return;
740 fInitCDBCalled = kTRUE;
742 AliCDBManager* man = AliCDBManager::Instance();
743 if (man->IsDefaultStorageSet())
745 AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
746 AliWarning("Default CDB storage has been already set !");
747 AliWarning(Form("Ignoring the default storage declared in AliReconstruction: %s",fCDBUri.Data()));
748 AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
749 fCDBUri = man->GetDefaultStorage()->GetURI();
752 if (fCDBUri.Length() > 0)
754 AliDebug(2,"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
755 AliDebug(2, Form("Default CDB storage is set to: %s", fCDBUri.Data()));
756 AliDebug(2, "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
757 man->SetDefaultStorage(fCDBUri);
759 else if (!man->GetRaw()){
760 fCDBUri="local://$ALICE_ROOT/OCDB";
761 AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
762 AliWarning("Default CDB storage not yet set !!!!");
763 AliWarning(Form("Setting it now to: %s", fCDBUri.Data()));
764 AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
765 man->SetDefaultStorage(fCDBUri);
768 AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
769 AliWarning("Default storage will be set after setting the Run Number!!!");
770 AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
774 // Now activate the detector specific CDB storage locations
775 for (Int_t i = 0; i < fSpecCDBUri.GetEntriesFast(); i++) {
776 TObject* obj = fSpecCDBUri[i];
778 AliDebug(2, "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
779 AliDebug(2, Form("Specific CDB storage for %s is set to: %s",obj->GetName(),obj->GetTitle()));
780 AliDebug(2, "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
781 man->SetSpecificStorage(obj->GetName(), obj->GetTitle());
783 AliSysInfo::AddStamp("InitCDB");
786 //_____________________________________________________________________________
787 void AliReconstruction::SetCDBSnapshotMode(const char* snapshotFileName) {
788 fCDBSnapshotMode = kTRUE;
789 AliCDBManager::Instance()->SetSnapshotMode(snapshotFileName);
792 //_____________________________________________________________________________
793 void AliReconstruction::SetDefaultStorage(const char* uri) {
794 // Store the desired default CDB storage location
795 // Activate it later within the Run() method
801 //_____________________________________________________________________________
802 void AliReconstruction::SetQARefDefaultStorage(const char* uri) {
803 // Store the desired default CDB storage location
804 // Activate it later within the Run() method
807 AliQAv1::SetQARefStorage(fQARefUri.Data()) ;
810 //_____________________________________________________________________________
811 void AliReconstruction::SetSpecificStorage(const char* calibType, const char* uri) {
812 // Store a detector-specific CDB storage location
813 // Activate it later within the Run() method
815 AliCDBPath aPath(calibType);
816 if(!aPath.IsValid()){
817 // if calibType is not wildcard but it is a valid detector, add "/*" to make it a valid path
818 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
819 if(!strcmp(calibType, fgkDetectorName[iDet])) {
820 aPath.SetPath(Form("%s/*", calibType));
821 AliInfo(Form("Path for specific storage set to %s", aPath.GetPath().Data()));
825 if(!aPath.IsValid()){
826 AliError(Form("Not a valid path or detector: %s", calibType));
831 // // check that calibType refers to a "valid" detector name
832 // Bool_t isDetector = kFALSE;
833 // for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
834 // TString detName = fgkDetectorName[iDet];
835 // if(aPath.GetLevel0() == detName) {
836 // isDetector = kTRUE;
842 // AliError(Form("Not a valid detector: %s", aPath.GetLevel0().Data()));
846 TObject* obj = fSpecCDBUri.FindObject(aPath.GetPath().Data());
847 if (obj) fSpecCDBUri.Remove(obj);
848 fSpecCDBUri.Add(new TNamed(aPath.GetPath().Data(), uri));
852 //_____________________________________________________________________________
853 Bool_t AliReconstruction::SetRunNumberFromData()
855 // The method is called in Run() in order
856 // to set a correct run number.
857 // In case of raw data reconstruction the
858 // run number is taken from the raw data header
860 if (fSetRunNumberFromDataCalled) return kTRUE;
861 fSetRunNumberFromDataCalled = kTRUE;
863 AliCDBManager* man = AliCDBManager::Instance();
866 if(fRawReader->NextEvent()) {
867 if(man->GetRun() > 0) {
868 AliWarning("Run number is taken from raw-event header! Ignoring settings in AliCDBManager!");
870 man->SetRun(fRawReader->GetRunNumber());
872 fRawReader->RewindEvents();
875 if(man->GetRun() > 0) {
876 AliWarning("No raw-data events are found ! Using settings in AliCDBManager !");
879 AliWarning("Neither raw events nor settings in AliCDBManager are found !");
885 AliRunLoader *rl = AliRunLoader::Open(fGAliceFileName.Data());
887 AliError(Form("No run loader found in file %s", fGAliceFileName.Data()));
892 // read run number from gAlice
893 if(rl->GetHeader()) {
894 man->SetRun(rl->GetHeader()->GetRun());
899 AliError("Neither run-loader header nor RawReader objects are found !");
911 //_____________________________________________________________________________
912 void AliReconstruction::SetCDBLock() {
913 // Set CDB lock: from now on it is forbidden to reset the run number
914 // or the default storage or to activate any further storage!
916 AliCDBManager::Instance()->SetLock(1);
919 //_____________________________________________________________________________
920 void AliReconstruction::MatchUpgradeDetector() {
921 // Translates detector name in a boolean.
922 // The boolean is used in GetReconstructor to load the
923 // upgrade reconstructor instead of the standard one.
924 for(Int_t iDet = 0; iDet < kNDetectors; iDet++) {
925 if(fUpgradeModule.Contains(fgkDetectorName[iDet])) fUpgradeMask[iDet]=kTRUE;
928 //_____________________________________________________________________________
929 Bool_t AliReconstruction::MisalignGeometry(const TString& detectors)
931 // Read the alignment objects from CDB.
932 // Each detector is supposed to have the
933 // alignment objects in DET/Align/Data CDB path.
934 // All the detector objects are then collected,
935 // sorted by geometry level (starting from ALIC) and
936 // then applied to the TGeo geometry.
937 // Finally an overlaps check is performed.
939 // Load alignment data from CDB and fill fAlignObjArray
940 if(fLoadAlignFromCDB){
942 TString detStr = detectors;
943 TString loadAlObjsListOfDets = "";
945 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
946 if(!IsSelected(fgkDetectorName[iDet], detStr)) continue;
947 if(!strcmp(fgkDetectorName[iDet],"HLT")) continue;
949 if(AliGeomManager::GetNalignable(fgkDetectorName[iDet]) != 0)
951 loadAlObjsListOfDets += fgkDetectorName[iDet];
952 loadAlObjsListOfDets += " ";
954 } // end loop over detectors
956 if(AliGeomManager::GetNalignable("GRP") != 0)
957 loadAlObjsListOfDets.Prepend("GRP "); //add alignment objects for non-sensitive modules
958 AliGeomManager::ApplyAlignObjsFromCDB(loadAlObjsListOfDets.Data());
960 // Check if the array with alignment objects was
961 // provided by the user. If yes, apply the objects
962 // to the present TGeo geometry
963 if (fAlignObjArray) {
964 if (gGeoManager && gGeoManager->IsClosed()) {
965 if (AliGeomManager::ApplyAlignObjsToGeom(*fAlignObjArray) == kFALSE) {
966 AliError("The misalignment of one or more volumes failed!"
967 "Compare the list of simulated detectors and the list of detector alignment data!");
972 AliError("Can't apply the misalignment! gGeoManager doesn't exist or it is still opened!");
978 if (fAlignObjArray) {
979 fAlignObjArray->Delete();
980 delete fAlignObjArray; fAlignObjArray=NULL;
986 //_____________________________________________________________________________
987 void AliReconstruction::SetGAliceFile(const char* fileName)
989 // set the name of the galice file
991 fGAliceFileName = fileName;
994 //_____________________________________________________________________________
995 void AliReconstruction::SetInput(const char* input)
997 // In case the input string starts with 'mem://', we run in an online mode
998 // and AliRawReaderDateOnline object is created. In all other cases a raw-data
999 // file is assumed. One can give as an input:
1000 // mem://: - events taken from DAQ monitoring libs online
1002 // mem://<filename> - emulation of the above mode (via DATE monitoring libs)
1003 if (input) fRawInput = input;
1006 //_____________________________________________________________________________
1007 void AliReconstruction::SetOutput(const char* output)
1009 // Set the output ESD filename
1010 // 'output' is a normalt ROOT url
1011 // The method is used in case of raw-data reco with PROOF
1012 if (output) fESDOutput = output;
1015 //_____________________________________________________________________________
1016 void AliReconstruction::SetOption(const char* detector, const char* option)
1018 // set options for the reconstruction of a detector
1020 TObject* obj = fOptions.FindObject(detector);
1021 if (obj) fOptions.Remove(obj);
1022 fOptions.Add(new TNamed(detector, option));
1025 //_____________________________________________________________________________
1026 void AliReconstruction::SetRecoParam(const char* detector, AliDetectorRecoParam *par)
1028 // Set custom reconstruction parameters for a given detector
1029 // Single set of parameters for all the events
1031 // First check if the reco-params are global
1032 if(!strcmp(detector, "GRP")) {
1033 par->SetAsDefault();
1034 fRecoParam.AddDetRecoParam(kNDetectors,par);
1038 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
1039 if(!strcmp(detector, fgkDetectorName[iDet])) {
1040 par->SetAsDefault();
1041 fRecoParam.AddDetRecoParam(iDet,par);
1048 //_____________________________________________________________________________
1049 Bool_t AliReconstruction::InitGRP() {
1050 //------------------------------------
1051 // Initialization of the GRP entry
1052 //------------------------------------
1053 AliCDBEntry* entry = AliCDBManager::Instance()->Get("GRP/GRP/Data");
1057 TMap* m = dynamic_cast<TMap*>(entry->GetObject()); // old GRP entry
1060 AliInfo("Found a TMap in GRP/GRP/Data, converting it into an AliGRPObject");
1062 fGRPData = new AliGRPObject();
1063 fGRPData->ReadValuesFromMap(m);
1067 AliInfo("Found an AliGRPObject in GRP/GRP/Data, reading it");
1068 fGRPData = dynamic_cast<AliGRPObject*>(entry->GetObject()); // new GRP entry
1072 // FIX ME: The unloading of GRP entry is temporarily disabled
1073 // because ZDC and VZERO are using it in order to initialize
1074 // their reconstructor objects. In the future one has to think
1075 // of propagating AliRunInfo to the reconstructors.
1076 // AliCDBManager::Instance()->UnloadFromCache("GRP/GRP/Data");
1080 AliError("No GRP entry found in OCDB!");
1084 TString lhcState = fGRPData->GetLHCState();
1085 if (lhcState==AliGRPObject::GetInvalidString()) {
1086 AliError("GRP/GRP/Data entry: missing value for the LHC state ! Using UNKNOWN");
1087 lhcState = "UNKNOWN";
1090 TString beamType = fGRPData->GetBeamType();
1091 if (beamType==AliGRPObject::GetInvalidString()) {
1092 AliError("GRP/GRP/Data entry: missing value for the beam type ! Using UNKNOWN");
1093 beamType = "UNKNOWN";
1096 Float_t beamEnergy = fGRPData->GetBeamEnergy();
1097 if (beamEnergy==AliGRPObject::GetInvalidFloat()) {
1098 AliError("GRP/GRP/Data entry: missing value for the beam energy ! Using 0");
1102 TString runType = fGRPData->GetRunType();
1103 if (runType==AliGRPObject::GetInvalidString()) {
1104 AliError("GRP/GRP/Data entry: missing value for the run type ! Using UNKNOWN");
1105 runType = "UNKNOWN";
1108 Int_t activeDetectors = fGRPData->GetDetectorMask();
1109 if (activeDetectors==AliGRPObject::GetInvalidUInt()) {
1110 AliError("GRP/GRP/Data entry: missing value for the detector mask ! Using 1074790399");
1111 activeDetectors = 1074790399;
1113 AliDebug(1, Form("activeDetectors = %d", activeDetectors));
1115 fRunInfo = new AliRunInfo(lhcState, beamType, beamEnergy, runType, activeDetectors);
1119 // Process the list of active detectors
1120 if (activeDetectors) {
1121 UInt_t detMask = activeDetectors;
1122 AliDebug(1, Form("Detector List = %s", fRunLocalReconstruction.Data()));
1123 fRunLocalReconstruction = MatchDetectorList(fRunLocalReconstruction,detMask);
1124 AliDebug(1, Form("Detector List = %s", fRunLocalReconstruction.Data()));
1125 fRunTracking = MatchDetectorList(fRunTracking,detMask);
1126 fFillESD = MatchDetectorList(fFillESD,detMask);
1127 fQADetectors = MatchDetectorList(fQADetectors,detMask);
1128 AliInfo(Form("fQADetectors=%s",fQADetectors.Data()));
1129 fDeleteRecPoints = MatchDetectorList(fDeleteRecPoints,detMask);
1130 fDeleteDigits = MatchDetectorList(fDeleteDigits,detMask);
1131 fLoadCDB.Form("%s %s %s %s",
1132 fRunLocalReconstruction.Data(),
1133 fRunTracking.Data(),
1135 fQADetectors.Data());
1136 fLoadCDB = MatchDetectorList(fLoadCDB,detMask);
1137 if (!((detMask >> AliDAQ::DetectorID("ITSSPD")) & 0x1) &&
1138 !((detMask >> AliDAQ::DetectorID("ITSSDD")) & 0x1) &&
1139 !((detMask >> AliDAQ::DetectorID("ITSSSD")) & 0x1) ) {
1140 // switch off the vertexer
1141 AliInfo("SPD,SDD,SSD is not in the list of active detectors. Vertexer and Trackleter are switched off.");
1142 fRunVertexFinder = kFALSE;
1143 fRunMultFinder = kFALSE;
1145 if (!((detMask >> AliDAQ::DetectorID("TRG")) & 0x1)) {
1146 // switch off the reading of CTP raw-data payload
1147 if (fFillTriggerESD) {
1148 AliInfo("CTP is not in the list of active detectors. CTP data reading switched off.");
1149 fFillTriggerESD = kFALSE;
1154 AliInfo("===================================================================================");
1155 AliInfo(Form("Running local reconstruction for detectors: %s",fRunLocalReconstruction.Data()));
1156 AliInfo(Form("Running tracking for detectors: %s",fRunTracking.Data()));
1157 AliInfo(Form("Filling ESD for detectors: %s",fFillESD.Data()));
1158 AliInfo(Form("Quality assurance is active for detectors: %s",fQADetectors.Data()));
1159 AliInfo(Form("CDB and reconstruction parameters are loaded for detectors: %s",fLoadCDB.Data()));
1160 AliInfo("===================================================================================");
1162 //*** Dealing with the magnetic field map
1163 if ( TGeoGlobalMagField::Instance()->IsLocked() ) {
1164 if (TGeoGlobalMagField::Instance()->GetField()->TestBit(AliMagF::kOverrideGRP)) {
1165 AliInfo("ExpertMode!!! GRP information will be ignored !");
1166 AliInfo("ExpertMode!!! Running with the externally locked B field !");
1169 AliInfo("Destroying existing B field instance!");
1170 delete TGeoGlobalMagField::Instance();
1173 if ( !TGeoGlobalMagField::Instance()->IsLocked() ) {
1174 // Construct the field map out of the information retrieved from GRP.
1177 Float_t l3Current = fGRPData->GetL3Current((AliGRPObject::Stats)0);
1178 if (l3Current == AliGRPObject::GetInvalidFloat()) {
1179 AliError("GRP/GRP/Data entry: missing value for the L3 current !");
1183 Char_t l3Polarity = fGRPData->GetL3Polarity();
1184 if (l3Polarity == AliGRPObject::GetInvalidChar()) {
1185 AliError("GRP/GRP/Data entry: missing value for the L3 polarity !");
1190 Float_t diCurrent = fGRPData->GetDipoleCurrent((AliGRPObject::Stats)0);
1191 if (diCurrent == AliGRPObject::GetInvalidFloat()) {
1192 AliError("GRP/GRP/Data entry: missing value for the dipole current !");
1196 Char_t diPolarity = fGRPData->GetDipolePolarity();
1197 if (diPolarity == AliGRPObject::GetInvalidChar()) {
1198 AliError("GRP/GRP/Data entry: missing value for the dipole polarity !");
1202 // read special bits for the polarity convention and map type
1203 Int_t polConvention = fGRPData->IsPolarityConventionLHC() ? AliMagF::kConvLHC : AliMagF::kConvDCS2008;
1204 Bool_t uniformB = fGRPData->IsUniformBMap();
1207 AliMagF* fld = AliMagF::CreateFieldMap(TMath::Abs(l3Current) * (l3Polarity ? -1:1),
1208 TMath::Abs(diCurrent) * (diPolarity ? -1:1),
1209 polConvention,uniformB,beamEnergy, beamType.Data());
1211 TGeoGlobalMagField::Instance()->SetField( fld );
1212 TGeoGlobalMagField::Instance()->Lock();
1213 AliInfo("Running with the B field constructed out of GRP !");
1215 else AliFatal("Failed to create a B field map !");
1217 else AliFatal("B field is neither set nor constructed from GRP ! Exitig...");
1220 //*** Get the diamond profiles from OCDB
1221 entry = AliCDBManager::Instance()->Get("GRP/Calib/MeanVertexSPD");
1223 fDiamondProfileSPD = dynamic_cast<AliESDVertex*> (entry->GetObject());
1225 AliError("No SPD diamond profile found in OCDB!");
1228 entry = AliCDBManager::Instance()->Get("GRP/Calib/MeanVertex");
1230 fDiamondProfile = dynamic_cast<AliESDVertex*> (entry->GetObject());
1232 AliError("No diamond profile found in OCDB!");
1235 entry = AliCDBManager::Instance()->Get("GRP/Calib/MeanVertexTPC");
1237 fDiamondProfileTPC = dynamic_cast<AliESDVertex*> (entry->GetObject());
1239 AliError("No TPC diamond profile found in OCDB!");
1242 entry = AliCDBManager::Instance()->Get("GRP/Calib/CosmicTriggers");
1244 fListOfCosmicTriggers = dynamic_cast<THashTable*>(entry->GetObject());
1248 if (!fListOfCosmicTriggers) {
1249 AliWarning("Can not get list of cosmic triggers from OCDB! Cosmic event specie will be effectively disabled!");
1255 //_____________________________________________________________________________
1256 Bool_t AliReconstruction::LoadCDB()
1258 // Load CDB entries for all active detectors.
1259 // By default we load all the entries in <det>/Calib
1262 AliCodeTimerAuto("",0);
1264 AliCDBManager::Instance()->Get("GRP/CTP/Config");
1266 AliCDBManager::Instance()->Get("GRP/Calib/LHCClockPhase");
1268 TString detStr = fLoadCDB;
1269 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
1270 if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
1271 AliCDBManager::Instance()->GetAll(Form("%s/Calib/*",fgkDetectorName[iDet]));
1272 AliCDBManager::Instance()->GetAll(Form("%s/Trigger/*",fgkDetectorName[iDet]));
1275 // Temporary fix - one has to define the correct policy in order
1276 // to load the trigger OCDB entries only for the detectors that
1277 // in the trigger or that are needed in order to put correct
1278 // information in ESD
1279 AliCDBManager::Instance()->GetAll("TRIGGER/*/*");
1283 //_____________________________________________________________________________
1284 Bool_t AliReconstruction::LoadTriggerScalersCDB()
1286 // Load CTP scalers from OCDB.
1287 // The scalers are checked for consistency.
1289 AliCodeTimerAuto("",0);
1291 AliCDBEntry* entry = AliCDBManager::Instance()->Get("GRP/CTP/Scalers");
1295 AliInfo("Found an AliTriggerRunScalers in GRP/CTP/Scalers, reading it");
1296 fRunScalers = dynamic_cast<AliTriggerRunScalers*> (entry->GetObject());
1298 if (fRunScalers && (fRunScalers->CorrectScalersOverflow() == 0)) AliInfo("32bit Trigger counters corrected for overflow");
1303 //_____________________________________________________________________________
1304 Bool_t AliReconstruction::LoadCTPTimeParamsCDB()
1306 // Load CTP timing information (alignment)
1309 AliCDBEntry* entry = AliCDBManager::Instance()->Get("GRP/CTP/CTPtiming");
1310 if (!entry) return kFALSE;
1312 AliInfo("Found an AliCTPTimeParams in GRP/CTP/CTPtiming, reading it");
1313 fCTPTimeParams = dynamic_cast<AliCTPTimeParams*> (entry->GetObject());
1316 AliCDBEntry* entry2 = AliCDBManager::Instance()->Get("GRP/CTP/TimeAlign");
1317 if (!entry2) return kFALSE;
1319 AliInfo("Found an AliCTPTimeParams in GRP/CTP/TimeAlign, reading it");
1320 fCTPTimeAlign = dynamic_cast<AliCTPTimeParams*> (entry2->GetObject());
1321 entry2->SetOwner(0);
1326 //_____________________________________________________________________________
1327 Bool_t AliReconstruction::ReadIntensityInfoCDB()
1329 // Load LHC DIP data
1330 AliCDBEntry* entry = AliCDBManager::Instance()->Get("GRP/GRP/LHCData");
1331 AliCDBEntry* entryCTP = AliCDBManager::Instance()->Get("GRP/CTP/Config");
1333 if (!entry || !entryCTP) {
1334 AliError(Form("Failed to extract CDB objects GRP/GRP/LHCData: %p or GRP/CTP/Config: %p",entry,entryCTP));
1338 enum {kA,kB,kC,kE,kNMasks};
1339 AliTriggerConfiguration* conf = (AliTriggerConfiguration*)entryCTP->GetObject();
1340 const TObjArray& clArr = conf->GetClasses();
1341 TObjArray masks(kNMasks);
1343 AliTriggerClass* trClass = 0;
1345 masks.SetOwner(kFALSE);
1347 while ( (trClass=(AliTriggerClass*)next()) ) {
1348 TString trName = trClass->GetName();
1349 int ind = trName.Index("-"); // prefix in front of A,B,C,E
1350 if (ind<1) continue; // anomaly
1352 trName = trName.Data() + ind;
1353 AliTriggerBCMask* bcMask = trClass->GetBCMask();
1354 if (!bcMask) continue;
1356 if (trName.BeginsWith("-A-")) which |= 0x1<<kA;
1357 else if (trName.BeginsWith("-B-")) which |= 0x1<<kB;
1358 else if (trName.BeginsWith("-C-")) which |= 0x1<<kC;
1359 else if (trName.BeginsWith("-E-")) which |= 0x1<<kE;
1360 else if (trName.BeginsWith("-AC-")) which |= (0x1<<kA) | (0x1<<kC);
1361 else if (trName.BeginsWith("-CA-")) which |= (0x1<<kA) | (0x1<<kC);
1362 else { AliWarning(Form("Unknown trigger type %s\n",trClass->GetName())); continue;}
1364 for (int ip=kNMasks;ip--;) {
1365 if ( !(which&(0x1<<ip)) || masks[ip] ) continue; // does not match or already done
1366 masks[ip] = (TObject*)bcMask;
1369 if (nFound==kNMasks) break;
1372 AliInfo("Reading mean bunch intensities from GRP/GRP/LHCData");
1373 AliLHCData* dipData = dynamic_cast<AliLHCData*> (entry->GetObject());
1375 for (int ib=2;ib--;) {
1377 if (dipData && (dipData->GetMeanIntensity(ib,intI,intNI,&masks)>=0)) {
1378 fBeamInt[ib][0] = intI;
1379 fBeamInt[ib][1] = intNI;
1380 AliInfo(Form("Mean intensity for beam %d: Interacting:%.2e Non-Interacting:%.2e",ib,intI,intNI));
1388 //_____________________________________________________________________________
1389 Bool_t AliReconstruction::Run(const char* input)
1392 AliCodeTimerAuto("",0);
1395 if (GetAbort() != TSelector::kContinue) return kFALSE;
1397 TChain *chain = NULL;
1398 if (fRawReader && (chain = fRawReader->GetChain())) {
1399 Long64_t nEntries = (fLastEvent < 0) ? (TChain::kBigNumber) : (fLastEvent - fFirstEvent + 1);
1402 // Temporary fix for long raw-data runs (until socket timeout handling in PROOF is revised)
1403 gProof->Exec("gEnv->SetValue(\"Proof.SocketActivityTimeout\",-1)", kTRUE);
1406 gProof->Exec("TGrid::Connect(\"alien://\")",kTRUE);
1408 TMessage::EnableSchemaEvolutionForAll(kTRUE);
1409 gProof->Exec("TMessage::EnableSchemaEvolutionForAll(kTRUE)",kTRUE);
1411 gProof->AddInput(this);
1413 if (!ParseOutput()) return kFALSE;
1415 gProof->SetParameter("PROOF_MaxSlavesPerNode", 9999);
1417 chain->Process("AliReconstruction","",nEntries,fFirstEvent);
1420 chain->Process(this,"",nEntries,fFirstEvent);
1425 if (GetAbort() != TSelector::kContinue) return kFALSE;
1427 if (GetAbort() != TSelector::kContinue) return kFALSE;
1428 //******* The loop over events
1429 AliInfo("Starting looping over events");
1431 while ((iEvent < fRunLoader->GetNumberOfEvents()) ||
1432 (fRawReader && fRawReader->NextEvent())) {
1434 // check if process has enough resources
1435 if (!HasEnoughResources(iEvent)) break;
1436 if (!ProcessEvent(iEvent)) {
1437 Abort("ProcessEvent",TSelector::kAbortFile);
1442 if (!iEvent) AliWarning("No events passed trigger selection");
1444 if (GetAbort() != TSelector::kContinue) return kFALSE;
1446 if (GetAbort() != TSelector::kContinue) return kFALSE;
1452 //_____________________________________________________________________________
1453 void AliReconstruction::InitRawReader(const char* input)
1455 // Init raw-reader and
1456 // set the input in case of raw data
1458 AliCodeTimerAuto("",0);
1460 if (input) fRawInput = input;
1461 fRawReader = AliRawReader::Create(fRawInput.Data());
1463 if (fRawInput.IsNull()) {
1464 AliInfo("Reconstruction will run over digits");
1467 AliFatal("Can not create raw-data reader ! Exiting...");
1471 if (!fEquipIdMap.IsNull() && fRawReader)
1472 fRawReader->LoadEquipmentIdsMap(fEquipIdMap);
1474 if (!fUseHLTData.IsNull()) {
1475 // create the RawReaderHLT which performs redirection of HLT input data for
1476 // the specified detectors
1477 AliRawReader* pRawReader=AliRawHLTManager::CreateRawReaderHLT(fRawReader, fUseHLTData.Data());
1479 fParentRawReader=fRawReader;
1480 fRawReader=pRawReader;
1482 AliError(Form("can not create Raw Reader for HLT input %s", fUseHLTData.Data()));
1485 AliSysInfo::AddStamp("CreateRawReader");
1488 //_____________________________________________________________________________
1489 void AliReconstruction::InitRun(const char* input)
1491 // Initialization of raw-reader,
1492 // run number, CDB etc.
1493 AliCodeTimerAuto("",0);
1494 AliSysInfo::AddStamp("Start");
1496 // Initialize raw-reader if any
1497 InitRawReader(input);
1499 // Initialize the CDB storage
1502 // Set run number in CDBManager (if it is not already set by the user)
1503 if (!SetRunNumberFromData()) {
1504 Abort("SetRunNumberFromData", TSelector::kAbortProcess);
1508 // Set CDB lock: from now on it is forbidden to reset the run number
1509 // or the default storage or to activate any further storage!
1514 //_____________________________________________________________________________
1515 void AliReconstruction::Begin(TTree *)
1517 // Initialize AlReconstruction before
1518 // going into the event loop
1519 // Should follow the TSelector convention
1520 // i.e. initialize only the object on the client side
1521 AliCodeTimerAuto("",0);
1523 AliReconstruction *reco = NULL;
1525 if ((reco = (AliReconstruction*)fInput->FindObject("AliReconstruction"))) {
1528 AliSysInfo::AddStamp("ReadInputInBegin");
1531 // Import ideal TGeo geometry and apply misalignment
1533 TString geom(gSystem->DirName(fGAliceFileName));
1534 geom += "/geometry.root";
1535 AliGeomManager::LoadGeometry(geom.Data());
1537 Abort("LoadGeometry", TSelector::kAbortProcess);
1540 AliSysInfo::AddStamp("LoadGeom");
1541 TString detsToCheck=fRunLocalReconstruction;
1542 if(!AliGeomManager::CheckSymNamesLUT(detsToCheck.Data())) {
1543 Abort("CheckSymNamesLUT", TSelector::kAbortProcess);
1546 AliSysInfo::AddStamp("CheckGeom");
1549 Bool_t toCDBSnapshot=kFALSE;
1550 TString snapshotFileOut(""); // we could use fSnapshotFileName if we are not interested
1551 // in reading from and writing to a snapshot file at the same time
1552 if(TString(getenv("OCDB_SNAPSHOT_CREATE")) == TString("kTRUE")){
1553 toCDBSnapshot=kTRUE;
1554 //fFromCDBSnapshot=kFALSE;
1555 TString snapshotFile(getenv("OCDB_SNAPSHOT_FILENAME"));
1556 if(!(snapshotFile.IsNull() || snapshotFile.IsWhitespace()))
1557 snapshotFileOut = snapshotFile;
1559 snapshotFileOut="OCDB.root";
1562 if (!MisalignGeometry(fLoadAlignData)) {
1563 Abort("MisalignGeometry", TSelector::kAbortProcess);
1566 AliCDBManager::Instance()->UnloadFromCache("GRP/Geometry/Data");
1567 if(!toCDBSnapshot) AliCDBManager::Instance()->UnloadFromCache("*/Align/*");
1568 AliSysInfo::AddStamp("MisalignGeom");
1571 Abort("InitGRP", TSelector::kAbortProcess);
1574 AliSysInfo::AddStamp("InitGRP");
1575 if(!toCDBSnapshot) AliCDBManager::Instance()->UnloadFromCache("GRP/Calib/CosmicTriggers");
1577 if(!fCDBSnapshotMode || toCDBSnapshot){
1579 Abort("LoadCDB", TSelector::kAbortProcess);
1582 AliSysInfo::AddStamp("LoadCDB");
1585 if (!LoadTriggerScalersCDB()) {
1586 Abort("LoadTriggerScalersCDB", TSelector::kAbortProcess);
1589 AliSysInfo::AddStamp("LoadTriggerScalersCDB");
1591 if (!LoadCTPTimeParamsCDB()) {
1592 Abort("LoadCTPTimeParamsCDB", TSelector::kAbortProcess);
1595 AliSysInfo::AddStamp("LoadCTPTimeParamsCDB");
1597 if (!ReadIntensityInfoCDB()) {
1598 Abort("ReadIntensityInfoCDB", TSelector::kAbortProcess);
1601 AliSysInfo::AddStamp("ReadIntensityInfoCDB");
1603 // Read the reconstruction parameters from OCDB
1604 if (!InitRecoParams()) {
1605 AliWarning("Not all detectors have correct RecoParam objects initialized");
1607 AliSysInfo::AddStamp("InitRecoParams");
1611 AliCDBManager::Instance()->DumpToSnapshotFile(snapshotFileOut.Data(),kFALSE);
1612 AliCDBManager::Instance()->UnloadFromCache("*/Align/*");
1613 AliCDBManager::Instance()->UnloadFromCache("GRP/Calib/CosmicTriggers");
1616 if (fInput && gProof) {
1617 if (reco) *reco = *this;
1619 gGeoManager->SetName("Geometry");
1620 gProof->AddInputData(gGeoManager,kTRUE);
1622 gProof->AddInputData(const_cast<TMap*>(AliCDBManager::Instance()->GetEntryCache()),kTRUE);
1623 fInput->Add(new TParameter<Int_t>("RunNumber",AliCDBManager::Instance()->GetRun()));
1624 AliMagF *magFieldMap = (AliMagF*)TGeoGlobalMagField::Instance()->GetField();
1625 magFieldMap->SetName("MagneticFieldMap");
1626 gProof->AddInputData(magFieldMap,kTRUE);
1628 fAnalysis->SetName("Analysis");
1629 gProof->AddInputData(fAnalysis,kTRUE);
1635 //_____________________________________________________________________________
1636 void AliReconstruction::SlaveBegin(TTree*)
1638 // Initialization related to run-loader,
1639 // vertexer, trackers, recontructors
1640 // In proof mode it is executed on the slave
1641 AliCodeTimerAuto("",0);
1643 TProofOutputFile *outProofFile = NULL;
1645 if (AliDebugLevel() > 0) fInput->Print();
1646 if (AliDebugLevel() > 10) fInput->Dump();
1647 if (AliReconstruction *reco = (AliReconstruction*)fInput->FindObject("AliReconstruction")) {
1650 if (TGeoManager *tgeo = (TGeoManager*)fInput->FindObject("Geometry")) {
1652 AliGeomManager::SetGeometry(tgeo);
1654 if (TMap *entryCache = (TMap*)fInput->FindObject("CDBEntryCache")) {
1655 Int_t runNumber = -1;
1656 if (TProof::GetParameter(fInput,"RunNumber",runNumber) == 0) {
1657 AliCDBManager *man = AliCDBManager::Instance(entryCache,runNumber);
1658 man->SetCacheFlag(kTRUE);
1659 man->SetLock(kTRUE);
1663 if (AliMagF *map = (AliMagF*)fInput->FindObject("MagneticFieldMap")) {
1664 AliMagF *newMap = new AliMagF(*map);
1665 if (!newMap->LoadParameterization()) {
1666 Abort("AliMagF::LoadParameterization", TSelector::kAbortProcess);
1669 TGeoGlobalMagField::Instance()->SetField(newMap);
1670 TGeoGlobalMagField::Instance()->Lock();
1673 // Attempt to get the analysis manager from the input list
1674 fAnalysis = (AliAnalysisManager*)fInput->FindObject("Analysis");
1675 if (fAnalysis) AliInfo("==== Analysis manager retrieved from input list ====");
1677 if (TNamed *outputFileName = (TNamed*)fInput->FindObject("PROOF_OUTPUTFILE"))
1678 fProofOutputFileName = outputFileName->GetTitle();
1679 if (TNamed *outputLocation = (TNamed*)fInput->FindObject("PROOF_OUTPUTFILE_LOCATION"))
1680 fProofOutputLocation = outputLocation->GetTitle();
1681 if (fInput->FindObject("PROOF_OUTPUTFILE_DATASET"))
1682 fProofOutputDataset = kTRUE;
1683 if (TNamed *archiveList = (TNamed*)fInput->FindObject("PROOF_OUTPUTFILE_ARCHIVE"))
1684 fProofOutputArchive = archiveList->GetTitle();
1685 if (!fProofOutputFileName.IsNull() &&
1686 !fProofOutputLocation.IsNull() &&
1687 fProofOutputArchive.IsNull()) {
1688 if (!fProofOutputDataset) {
1689 outProofFile = new TProofOutputFile(fProofOutputFileName.Data(),"M");
1690 outProofFile->SetOutputFileName(Form("%s%s",fProofOutputLocation.Data(),fProofOutputFileName.Data()));
1693 outProofFile = new TProofOutputFile(fProofOutputFileName.Data(),"DROV",fProofOutputLocation.Data());
1695 if (AliDebugLevel() > 0) outProofFile->Dump();
1696 fOutput->Add(outProofFile);
1698 AliSysInfo::AddStamp("ReadInputInSlaveBegin");
1700 // Check if analysis was requested in the reconstruction event loop
1702 // Attempt to connect in-memory singleton
1703 fAnalysis = AliAnalysisManager::GetAnalysisManager();
1704 if (fAnalysis) AliInfo(Form("==== Analysis manager <%s> found in memory ====", fAnalysis->GetName()));
1705 // Check if an analysis macro was specified
1706 if (!fAnalysis && !fAnalysisMacro.IsNull()) {
1707 // Run specified analysis macro
1708 gROOT->ProcessLine(Form(".x %s",fAnalysisMacro.Data()));
1709 fAnalysis = AliAnalysisManager::GetAnalysisManager();
1710 if (!fAnalysis) AliError(Form("No analysis manager produced by analysis macro %s", fAnalysisMacro.Data()));
1711 else AliInfo(Form("==== Analysis manager <%s> produced by analysis macro <%s> ====",
1712 fAnalysis->GetName(), fAnalysisMacro.Data()));
1716 // get the run loader
1717 if (!InitRunLoader()) {
1718 Abort("InitRunLoader", TSelector::kAbortProcess);
1721 AliSysInfo::AddStamp("LoadLoader");
1723 ftVertexer = new AliVertexerTracks(AliTracker::GetBz());
1726 if (!fRunTracking.IsNull() && !CreateTrackers(fRunTracking)) {
1727 Abort("CreateTrackers", TSelector::kAbortProcess);
1730 AliSysInfo::AddStamp("CreateTrackers");
1732 // create the ESD output file and tree
1733 if (!outProofFile) {
1734 ffile = TFile::Open("AliESDs.root", "RECREATE");
1735 ffile->SetCompressionLevel(2);
1736 if (!ffile->IsOpen()) {
1737 Abort("OpenESDFile", TSelector::kAbortProcess);
1742 AliInfo(Form("Opening output PROOF file: %s/%s",
1743 outProofFile->GetDir(), outProofFile->GetFileName()));
1744 if (!(ffile = outProofFile->OpenFile("RECREATE"))) {
1745 Abort(Form("Problems opening output PROOF file: %s/%s",
1746 outProofFile->GetDir(), outProofFile->GetFileName()),
1747 TSelector::kAbortProcess);
1752 ftree = new TTree("esdTree", "Tree with ESD objects");
1753 fesd = new AliESDEvent();
1754 fesd->CreateStdContent();
1755 // add a so far non-std object to the ESD, this will
1756 // become part of the std content
1757 fesd->AddObject(new AliESDHLTDecision);
1759 fesd->WriteToTree(ftree);
1760 if (fWriteESDfriend) {
1761 ffileF = TFile::Open("AliESDfriends.root", "RECREATE");
1762 ftreeF = new TTree("esdFriendTree", "Tree with ESD Friend objects");
1763 fesdf = new AliESDfriend();
1764 ftreeF->Branch("ESDfriend.","AliESDfriend", &fesdf);
1765 fesd->AddObject(fesdf);
1768 ftree->GetUserInfo()->Add(fesd);
1770 fhlttree = new TTree("HLTesdTree", "Tree with HLT ESD objects");
1771 fhltesd = new AliESDEvent();
1772 fhltesd->CreateStdContent();
1773 // read the ESD template from CDB
1774 // HLT is allowed to put non-std content to its ESD, the non-std
1775 // objects need to be created before invocation of WriteToTree in
1776 // order to create all branches. Initialization is done from an
1777 // ESD layout template in CDB
1778 AliCDBManager* man = AliCDBManager::Instance();
1779 AliCDBEntry* hltESDConfig = man->Get("HLT/Calib/esdLayout");
1781 AliError(Form("Error getting \"HLT/Calib/esdLayout\""));
1784 AliESDEvent* pESDLayout=dynamic_cast<AliESDEvent*>(hltESDConfig->GetObject());
1786 // init all internal variables from the list of objects
1787 pESDLayout->GetStdContent();
1789 // copy content and create non-std objects
1790 *fhltesd=*pESDLayout;
1793 AliError(Form("error setting hltEsd layout from \"HLT/Calib/esdLayout\": invalid object type"));
1796 fhltesd->WriteToTree(fhlttree);
1797 fhlttree->GetUserInfo()->Add(fhltesd);
1799 ProcInfo_t procInfo;
1800 gSystem->GetProcInfo(&procInfo);
1801 AliInfo(Form("Current memory usage %ld %ld", procInfo.fMemResident, procInfo.fMemVirtual));
1804 //Initialize the QA and start of cycle
1805 if (fRunQA || fRunGlobalQA)
1808 //Initialize the Plane Efficiency framework
1809 if (fRunPlaneEff && !InitPlaneEff()) {
1810 Abort("InitPlaneEff", TSelector::kAbortProcess);
1814 if (strcmp(gProgName,"alieve") == 0)
1815 fRunAliEVE = InitAliEVE();
1816 // If we have an analysis manager, connect the AliRecoInputHandler here
1818 if (!dynamic_cast<AliRecoInputHandler*>(fAnalysis->GetInputEventHandler())) {
1819 AliError("Analysis manager used in reconstruction should use AliRecoInputHandler - \
1820 \n ->Replacing with AliRecoInputHandler instance.");
1821 delete fAnalysis->GetInputEventHandler();
1823 // Set the event and other data pointers
1824 fRecoHandler = new AliRecoInputHandler();
1825 // fRecoHandler->Init(ftree, "LOCAL");
1826 fRecoHandler->SetEvent(fesd);
1827 fRecoHandler->SetESDfriend(fesdf);
1828 fRecoHandler->SetHLTEvent(fhltesd);
1829 fRecoHandler->SetHLTTree(fhlttree);
1830 fAnalysis->SetInputEventHandler(fRecoHandler);
1831 // Enter external loop mode
1832 fAnalysis->SetExternalLoop(kTRUE);
1833 // Initialize analysis
1834 fAnalysis->SlaveBegin(ftree);
1835 fAnalysis->StartAnalysis("local", (TTree*)0);
1836 // Connect ESD tree with the input container
1837 fAnalysis->GetCommonInputContainer()->SetData(ftree);
1842 //_____________________________________________________________________________
1843 Bool_t AliReconstruction::Process(Long64_t entry)
1845 // run the reconstruction over a single entry
1846 // from the chain with raw data
1847 AliCodeTimerAuto("",0);
1849 TTree *currTree = fChain->GetTree();
1850 AliRawVEvent *event = NULL;
1851 currTree->SetBranchAddress("rawevent",&event);
1852 currTree->GetEntry(entry);
1853 fRawReader = new AliRawReaderRoot(event);
1854 // check if process has enough resources
1855 if (!HasEnoughResources(entry)) return kFALSE;
1856 fStatus = ProcessEvent(fRunLoader->GetNumberOfEvents());
1864 //_____________________________________________________________________________
1865 void AliReconstruction::Init(TTree *tree)
1867 // Implementation of TSelector::Init()
1870 AliError("The input tree is not found!");
1876 //_____________________________________________________________________________
1877 Bool_t AliReconstruction::ProcessEvent(Int_t iEvent)
1879 // run the reconstruction over a single event
1880 // The event loop is steered in Run method
1883 static Long_t oldMres=0;
1884 static Long_t oldMvir=0;
1885 static Float_t oldCPU=0;
1886 static Long_t aveDMres=0;
1887 static Long_t aveDMvir=0;
1888 static Float_t aveDCPU=0;
1890 AliCodeTimerAuto("",0);
1894 AliSysInfo::AddStamp(Form("StartEv_%d",iEvent), 0,0,iEvent);
1896 if (iEvent >= fRunLoader->GetNumberOfEvents()) {
1897 fRunLoader->SetEventNumber(iEvent);
1899 fRunLoader->GetHeader()->Reset(fRawReader->GetRunNumber(),
1901 fRunLoader->TreeE()->Fill();
1903 if (fRawReader && fRawReader->UseAutoSaveESD())
1904 fRunLoader->TreeE()->AutoSave("SaveSelf");
1907 if ((iEvent < fFirstEvent) || ((fLastEvent >= 0) && (iEvent > fLastEvent))) {
1912 fRunLoader->GetEvent(iEvent);
1914 // Fill Event-info object
1916 fRecoParam.SetEventSpecie(fRunInfo,fEventInfo,fListOfCosmicTriggers);
1918 ProcInfo_t procInfo;
1919 if(iEvent==fFirstEvent) {
1920 gSystem->GetProcInfo(&procInfo);
1921 oldMres=procInfo.fMemResident;
1922 oldMvir=procInfo.fMemVirtual;
1923 oldCPU=procInfo.fCpuUser+procInfo.fCpuSys;
1925 AliInfo(Form("================================= Processing event %d of type %-10s ==================================", iEvent,fRecoParam.PrintEventSpecie()));
1927 AliSysInfo::AddStamp(Form("StartReco_%d",iEvent), 0,0,iEvent);
1929 // Set the reco-params
1931 TString detStr = fLoadCDB;
1932 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
1933 if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
1934 AliReconstructor *reconstructor = GetReconstructor(iDet);
1935 if (reconstructor && fRecoParam.GetDetRecoParamArray(iDet)) {
1936 const AliDetectorRecoParam *par = fRecoParam.GetDetRecoParam(iDet);
1937 reconstructor->SetRecoParam(par);
1938 reconstructor->GetPidSettings(&pid);
1939 reconstructor->SetEventInfo(&fEventInfo);
1941 AliQAManager::QAManager()->SetEventInfo(&fEventInfo) ;
1942 AliQAManager::QAManager()->SetRecoParam(iDet, par) ;
1943 if (par) AliQAManager::QAManager()->SetEventSpecie(AliRecoParam::Convert(par->GetEventSpecie())) ;
1948 if (fRunQA || fRunGlobalQA) AliQADataMaker::SetEventTrigClasses(fEventInfo.GetTriggerClasses()); // RS: select which histo clones are to be filled
1951 const AliDetectorRecoParam *grppar = fRecoParam.GetDetRecoParam(kNDetectors);
1952 AliQAManager::QAManager()->SetRecoParam(AliQAv1::kGLOBAL, grppar) ;
1953 AliQAManager::QAManager()->SetEventSpecie(AliRecoParam::Convert(grppar->GetEventSpecie())) ;
1958 if (fRunQA && IsInTasks(AliQAv1::kRAWS)) {
1959 AliQAManager::QAManager()->SetEventSpecie(fRecoParam.GetEventSpecie()) ;
1960 AliQAManager::QAManager()->RunOneEvent(fRawReader) ;
1961 AliSysInfo::AddStamp(Form("RawQA_%d",iEvent), 0,0,iEvent);
1964 // fill Event header information from the RawEventHeader
1965 if (fRawReader){FillRawEventHeaderESD(fesd);}
1966 if (fRawReader){FillRawEventHeaderESD(fhltesd);}
1968 fesd->SetRunNumber(fRunLoader->GetHeader()->GetRun());
1969 fhltesd->SetRunNumber(fRunLoader->GetHeader()->GetRun());
1971 ((AliESDRun*)fesd->GetESDRun())->SetDetectorsInDAQ(fRunInfo->GetDetectorMask());
1972 ((AliESDRun*)fhltesd->GetESDRun())->SetDetectorsInDAQ(fRunInfo->GetDetectorMask());
1973 ((AliESDRun*)fesd->GetESDRun())->SetDetectorsInReco(AliDAQ::DetectorPatternOffline(fFillESD.Data()));
1974 ((AliESDRun*)fhltesd->GetESDRun())->SetDetectorsInReco(AliDAQ::DetectorPatternOffline(fFillESD.Data()));
1976 fesd->SetEventNumberInFile(fRunLoader->GetHeader()->GetEventNrInRun());
1977 fhltesd->SetEventNumberInFile(fRunLoader->GetHeader()->GetEventNrInRun());
1979 fesd->SetEventSpecie(fRecoParam.GetEventSpecie());
1980 fhltesd->SetEventSpecie(fRecoParam.GetEventSpecie());
1982 // Set magnetic field from the tracker
1983 fesd->SetMagneticField(AliTracker::GetBz());
1984 fhltesd->SetMagneticField(AliTracker::GetBz());
1986 AliESDRun *esdRun,*esdRunH;
1987 esdRun = (AliESDRun*)fesd->GetESDRun();
1988 esdRunH = (AliESDRun*)fhltesd->GetESDRun();
1989 esdRun->SetBeamEnergyIsSqrtSHalfGeV();
1990 esdRunH->SetBeamEnergyIsSqrtSHalfGeV();
1992 for (int ib=2;ib--;) for (int it=2;it--;) {
1993 esdRun->SetMeanIntensity(ib,it, fBeamInt[ib][it]);
1994 esdRunH->SetMeanIntensity(ib,it, fBeamInt[ib][it]);
1997 fesd->SetBeamEnergy(fGRPData->GetBeamEnergy());
1998 fesd->SetBeamType(fGRPData->GetBeamType().Data());
1999 fesd->SetBeamParticle(fGRPData->GetSingleBeamType(0).Atoi(),0);
2000 fesd->SetBeamParticle(fGRPData->GetSingleBeamType(1).Atoi(),1);
2001 fhltesd->SetBeamEnergy(fGRPData->GetBeamEnergy());
2002 fhltesd->SetBeamType(fGRPData->GetBeamType().Data());
2003 fhltesd->SetBeamParticle(fGRPData->GetSingleBeamType(0).Atoi(),0);
2004 fhltesd->SetBeamParticle(fGRPData->GetSingleBeamType(1).Atoi(),1);
2006 AliMagF* fld = (AliMagF*)TGeoGlobalMagField::Instance()->GetField();
2007 if (fld) { // set info needed for field initialization
2008 fesd->SetCurrentL3(fld->GetCurrentSol());
2009 fesd->SetCurrentDip(fld->GetCurrentDip());
2010 fesd->SetUniformBMap(fld->IsUniform());
2011 fesd->SetBInfoStored();
2013 fhltesd->SetCurrentL3(fld->GetCurrentSol());
2014 fhltesd->SetCurrentDip(fld->GetCurrentDip());
2015 fhltesd->SetUniformBMap(fld->IsUniform());
2016 fhltesd->SetBInfoStored();
2020 // run full HLT reconstruction first
2023 TString detectors=fRunLocalReconstruction;
2024 if (IsSelected("HLT", detectors) &&
2025 !RunLocalEventReconstruction("HLT")) {
2026 if (fStopOnError) {CleanUp(); return kFALSE;}
2029 // run HLT on hltesd
2030 if (IsSelected("HLT", detectors) &&
2031 !FillESD(fhltesd, "HLT")) {
2032 if (fStopOnError) {CleanUp(); return kFALSE;}
2036 // local single event reconstruction
2037 if (!fRunLocalReconstruction.IsNull()) {
2038 TString detectors=fRunLocalReconstruction;
2039 // the logic for selection and correct sequence of reconstruction relies on the
2040 // full list of detectors. Keyword 'ALL' should have been replaced at this point.
2041 if (detectors.Contains("ALL")) {
2042 AliFatal("Keyword 'ALL' needs to be replaced by the full list of detectors in "
2043 "fRunLocalReconstruction. This should have been done by the framework");
2045 detectors.ReplaceAll("HLT", "");
2046 if (!RunLocalEventReconstruction(detectors)) {
2056 // Set most probable pt, for B=0 tracking
2057 // Get the global reco-params. They are atposition 16 inside the array of detectors in fRecoParam
2058 const AliGRPRecoParam *grpRecoParam = dynamic_cast<const AliGRPRecoParam*>(fRecoParam.GetDetRecoParam(kNDetectors));
2059 if (grpRecoParam) AliExternalTrackParam::SetMostProbablePt(grpRecoParam->GetMostProbablePt());
2061 // Fill raw-data error log into the ESD
2062 if (fRawReader) FillRawDataErrorLog(iEvent,fesd);
2064 AliSysInfo::AddStamp(Form("FillHeadErrs_%d",iEvent), 0,0,iEvent);
2067 if (fRunVertexFinder) {
2068 if (!RunVertexFinder(fesd)) {
2069 if (fStopOnError) {CleanUp(); return kFALSE;}
2071 AliSysInfo::AddStamp(Form("VtxFinder_%d",iEvent), 0,0,iEvent);
2074 // For Plane Efficiency: run the SPD trackleter
2075 if (fRunPlaneEff && fSPDTrackleter) {
2076 if (!RunSPDTrackleting(fesd)) {
2077 if (fStopOnError) {CleanUp(); return kFALSE;}
2079 AliSysInfo::AddStamp(Form("TrackletEff_%d",iEvent), 0,0,iEvent);
2083 if (!fRunTracking.IsNull()) {
2084 if (fRunMuonTracking) {
2085 if (!RunMuonTracking(fesd)) {
2086 if (fStopOnError) {CleanUp(); return kFALSE;}
2089 AliSysInfo::AddStamp(Form("TrackingMUON_%d",iEvent), 0,0,iEvent);
2093 if (!fRunTracking.IsNull()) {
2094 if (!RunTracking(fesd,pid)) {
2095 if (fStopOnError) {CleanUp(); return kFALSE;}
2100 if (!fFillESD.IsNull()) {
2101 TString detectors=fFillESD;
2102 // the logic for selection and correct sequence of reconstruction relies on the
2103 // full list of detectors. Keyword 'ALL' should have been replaced at this point.
2104 if (detectors.Contains("ALL")) {
2105 AliFatal("Keyword 'ALL' needs to be replaced by the full list of detectors in "
2106 "fFillESD. This should have been done by the framework");
2108 // remove HLT as this has been executed at the beginning of the event reconstruction
2109 detectors.ReplaceAll("HLT", "");
2110 if (!FillESD(fesd, detectors)) {
2111 if (fStopOnError) {CleanUp(); return kFALSE;}
2118 // Propagate track to the beam pipe (if not already done by ITS)
2120 const Int_t ntracks = fesd->GetNumberOfTracks();
2121 const Double_t kRadius = 2.8; //something less than the beam pipe radius
2124 UShort_t selectedIdx[ntracks];
2126 for (Int_t itrack=0; itrack<ntracks; itrack++){
2127 const Double_t kMaxStep = 1; //max step over the material
2130 AliESDtrack *track = fesd->GetTrack(itrack);
2131 if (!track) continue;
2133 AliExternalTrackParam *tpcTrack =
2134 (AliExternalTrackParam *)track->GetTPCInnerParam();
2138 PropagateTrackToBxByBz(tpcTrack,kRadius,track->GetMass(),kMaxStep,kFALSE);
2141 Int_t n=trkArray.GetEntriesFast();
2142 selectedIdx[n]=track->GetID();
2143 trkArray.AddLast(tpcTrack);
2146 //Tracks refitted by ITS should already be at the SPD vertex
2147 if (track->IsOn(AliESDtrack::kITSrefit)) continue;
2150 PropagateTrackToBxByBz(track,kRadius,track->GetMass(),kMaxStep,kFALSE);
2151 Double_t x[3]; track->GetXYZ(x);
2152 Double_t b[3]; AliTracker::GetBxByBz(x,b);
2153 track->RelateToVertexBxByBz(fesd->GetPrimaryVertexSPD(), b, kVeryBig);
2156 AliSysInfo::AddStamp(Form("RelToSPDVtx_%d",iEvent), 0,0,iEvent);
2158 // Improve the reconstructed primary vertex position using the tracks
2160 Bool_t runVertexFinderTracks = fRunVertexFinderTracks;
2161 if(fesd->GetPrimaryVertexSPD()) {
2162 TString vtitle = fesd->GetPrimaryVertexSPD()->GetTitle();
2163 if(vtitle.Contains("cosmics")) {
2164 runVertexFinderTracks=kFALSE;
2168 if (runVertexFinderTracks) {
2169 // TPC + ITS primary vertex
2170 ftVertexer->SetITSMode();
2171 ftVertexer->SetConstraintOff();
2172 // get cuts for vertexer from AliGRPRecoParam
2173 Bool_t constrSPD=kFALSE;
2175 Int_t nCutsVertexer = grpRecoParam->GetVertexerTracksNCuts();
2176 Double_t *cutsVertexer = new Double_t[nCutsVertexer];
2177 grpRecoParam->GetVertexerTracksCutsITS(cutsVertexer,nCutsVertexer);
2178 ftVertexer->SetCuts(cutsVertexer,nCutsVertexer);
2179 delete [] cutsVertexer; cutsVertexer = NULL;
2180 if(grpRecoParam->GetVertexerTracksConstraintITS()) {
2181 if(fDiamondProfile && fDiamondProfile->GetXRes()<kRadius){
2182 ftVertexer->SetVtxStart(fDiamondProfile); // apply constraint only if sigmax is smaller than the beam pipe radius
2184 if(fDiamondProfileSPD && fDiamondProfileSPD->GetXRes()<kRadius){
2185 ftVertexer->SetVtxStart(fDiamondProfileSPD);
2191 AliESDVertex *pvtx=ftVertexer->FindPrimaryVertex(fesd);
2194 TString title=pvtx->GetTitle();
2195 title.Append("SPD");
2196 pvtx->SetTitle(title);
2198 if (pvtx->GetStatus()) {
2199 fesd->SetPrimaryVertexTracks(pvtx);
2200 for (Int_t i=0; i<ntracks; i++) {
2201 AliESDtrack *t = fesd->GetTrack(i);
2202 Double_t x[3]; t->GetXYZ(x);
2203 Double_t b[3]; AliTracker::GetBxByBz(x,b);
2204 t->RelateToVertexBxByBz(pvtx, b, kVeryBig);
2207 delete pvtx; pvtx=NULL;
2209 AliSysInfo::AddStamp(Form("VtxTrk_%d",iEvent), 0,0,iEvent);
2211 // TPC-only primary vertex
2212 ftVertexer->SetTPCMode();
2213 ftVertexer->SetConstraintOff();
2214 // get cuts for vertexer from AliGRPRecoParam
2216 Int_t nCutsVertexer = grpRecoParam->GetVertexerTracksNCuts();
2217 Double_t *cutsVertexer = new Double_t[nCutsVertexer];
2218 grpRecoParam->GetVertexerTracksCutsTPC(cutsVertexer,nCutsVertexer);
2219 ftVertexer->SetCuts(cutsVertexer,nCutsVertexer);
2220 delete [] cutsVertexer; cutsVertexer = NULL;
2221 if(fDiamondProfileTPC && grpRecoParam->GetVertexerTracksConstraintTPC()) {
2222 if(fDiamondProfileTPC->GetXRes()<kRadius) ftVertexer->SetVtxStart(fDiamondProfileTPC); // apply constraint only if sigmax is smaller than the beam pipe radius
2225 pvtx=ftVertexer->FindPrimaryVertex(&trkArray,selectedIdx);
2227 if (pvtx->GetStatus()) {
2228 fesd->SetPrimaryVertexTPC(pvtx);
2229 for (Int_t i=0; i<ntracks; i++) {
2230 AliESDtrack *t = fesd->GetTrack(i);
2231 Double_t x[3]; t->GetXYZ(x);
2232 Double_t b[3]; AliTracker::GetBxByBz(x,b);
2233 t->RelateToVertexTPCBxByBz(pvtx, b, kVeryBig);
2236 delete pvtx; pvtx=NULL;
2238 AliSysInfo::AddStamp(Form("VtxTPC_%d",iEvent), 0,0,iEvent);
2242 if(fDiamondProfile && fDiamondProfile->GetXRes()<kRadius) fesd->SetDiamond(fDiamondProfile);
2243 else fesd->SetDiamond(fDiamondProfileSPD);
2247 AliV0vertexer vtxer;
2248 // get cuts for V0vertexer from AliGRPRecoParam
2250 Int_t nCutsV0vertexer = grpRecoParam->GetVertexerV0NCuts();
2251 Double_t cutsV0vertexer[nCutsV0vertexer];
2252 grpRecoParam->GetVertexerV0Cuts(cutsV0vertexer);
2253 vtxer.SetCuts(cutsV0vertexer);
2255 vtxer.Tracks2V0vertices(fesd);
2256 AliSysInfo::AddStamp(Form("V0Finder_%d",iEvent), 0,0,iEvent);
2258 if (fRunCascadeFinder) {
2260 AliCascadeVertexer cvtxer;
2261 // get cuts for CascadeVertexer from AliGRPRecoParam
2263 Int_t nCutsCascadeVertexer = grpRecoParam->GetVertexerCascadeNCuts();
2264 Double_t cutsCascadeVertexer[nCutsCascadeVertexer];
2265 grpRecoParam->GetVertexerCascadeCuts(cutsCascadeVertexer);
2266 cvtxer.SetCuts(cutsCascadeVertexer);
2268 cvtxer.V0sTracks2CascadeVertices(fesd);
2269 AliSysInfo::AddStamp(Form("CascadeFinder_%d",iEvent), 0,0,iEvent);
2274 if (fReconstructor[3])
2275 GetReconstructor(3)->FillEventTimeWithTOF(fesd,&pid);
2280 if (fFillTriggerESD) {
2281 if (!FillTriggerESD(fesd)) {
2282 if (fStopOnError) {CleanUp(); return kFALSE;}
2285 // Always fill scalers
2286 if (!FillTriggerScalers(fesd)) {
2287 if (fStopOnError) {CleanUp(); return kFALSE;}
2290 AliSysInfo::AddStamp(Form("FillVaria_%d",iEvent), 0,0,iEvent);
2293 UInt_t specie = fesd->GetEventSpecie();
2294 Bool_t keepAll = (specie==AliRecoParam::kCosmic || specie==AliRecoParam::kCalib);
2295 if (fCleanESD && (!keepAll) ) {
2297 AliSysInfo::AddStamp(Form("CleanESD_%d",iEvent), 0,0,iEvent);
2300 // RS run updated trackleter: since we want to mark the clusters used by tracks and also mark the
2301 // tracks interpreted as primary, this step should be done in the very end, when full
2302 // ESD info is available (particulalry, V0s)
2304 if (fRunMultFinder) {
2305 if (!RunMultFinder(fesd)) {
2306 if (fStopOnError) {CleanUp(); return kFALSE;}
2308 AliSysInfo::AddStamp(Form("MultFinder_%d",iEvent), 0,0,iEvent);
2311 if (fRunQA && IsInTasks(AliQAv1::kESDS)) {
2312 AliQAManager::QAManager()->SetEventSpecie(fRecoParam.GetEventSpecie()) ;
2313 AliQAManager::QAManager()->RunOneEvent(fesd, fhltesd) ;
2314 AliSysInfo::AddStamp(Form("RunQA_%d",iEvent), 0,0,iEvent);
2317 AliQADataMaker *qadm = AliQAManager::QAManager()->GetQADataMaker(AliQAv1::kGLOBAL);
2319 qadm->SetEventSpecie(fRecoParam.GetEventSpecie()) ;
2320 if (qadm && IsInTasks(AliQAv1::kESDS))
2321 qadm->Exec(AliQAv1::kESDS, fesd);
2322 AliSysInfo::AddStamp(Form("RunGlobQA_%d",iEvent), 0,0,iEvent);
2325 // copy HLT decision from HLTesd to esd
2326 // the most relevant information is stored in a reduced container in the esd,
2327 // while the full information can be found in the HLTesd
2328 TObject* pHLTSrc=fhltesd->FindListObject(AliESDHLTDecision::Name());
2329 TObject* pHLTTgt=fesd->FindListObject(AliESDHLTDecision::Name());
2330 if (pHLTSrc && pHLTTgt) {
2331 pHLTSrc->Copy(*pHLTTgt);
2334 // Perform analysis of this event if requested
2335 // RS: Should be done before WriteESDfriend, since the latter may clean the esdfriend
2337 fRecoHandler->BeginEvent(iEvent);
2338 fAnalysis->ExecAnalysis();
2339 fRecoHandler->FinishEvent();
2340 AliSysInfo::AddStamp(Form("Analysis_%d",iEvent), 0,0,iEvent);
2343 if (fWriteESDfriend) {
2344 fesd->GetESDfriend(fesdf);
2345 AliSysInfo::AddStamp(Form("CreateFriend_%d",iEvent), 0,0,iEvent);
2350 AliSysInfo::AddStamp(Form("ESDFill_%d",iEvent), 0,0,iEvent);
2352 if (fWriteESDfriend) {
2354 AliSysInfo::AddStamp(Form("WriteFriend_%d",iEvent), 0,0,iEvent);
2358 // Auto-save the ESD tree in case of prompt reco @P2
2359 if (fRawReader && fRawReader->UseAutoSaveESD()) {
2360 ftree->AutoSave("SaveSelf");
2361 if (fWriteESDfriend) ftreeF->AutoSave("SaveSelf");
2367 if (fRunAliEVE) RunAliEVE();
2371 if (fWriteESDfriend) {
2372 fesdf->~AliESDfriend();
2373 new (fesdf) AliESDfriend(); // Reset...
2376 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
2377 if (fReconstructor[iDet]) fReconstructor[iDet]->FinishEvent();
2380 gSystem->GetProcInfo(&procInfo);
2381 Long_t dMres=(procInfo.fMemResident-oldMres)/1024;
2382 Long_t dMvir=(procInfo.fMemVirtual-oldMvir)/1024;
2383 Float_t dCPU=procInfo.fCpuUser+procInfo.fCpuSys-oldCPU;
2384 aveDMres+=(dMres-aveDMres)/(iEvent-fFirstEvent+1);
2385 aveDMvir+=(dMvir-aveDMvir)/(iEvent-fFirstEvent+1);
2386 aveDCPU+=(dCPU-aveDCPU)/(iEvent-fFirstEvent+1);
2387 AliInfo(Form("======================= End Event %d: Res %ld(%3ld <%3ld>) Vir %ld(%3ld <%3ld>) CPU %5.2f <%5.2f> ===================",
2388 iEvent, procInfo.fMemResident/1024, dMres, aveDMres, procInfo.fMemVirtual/1024, dMvir, aveDMvir, dCPU, aveDCPU));
2389 oldMres=procInfo.fMemResident;
2390 oldMvir=procInfo.fMemVirtual;
2391 oldCPU=procInfo.fCpuUser+procInfo.fCpuSys;
2394 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
2395 if (fReconstructor[iDet]) {
2396 fReconstructor[iDet]->SetRecoParam(NULL);
2397 fReconstructor[iDet]->SetEventInfo(NULL);
2399 if (fTracker[iDet]) fTracker[iDet]->SetEventInfo(NULL);
2402 if (fRunQA || fRunGlobalQA)
2403 AliQAManager::QAManager()->Increment() ;
2405 DeleteRecPoints(fDeleteRecPoints);
2406 DeleteDigits(fDeleteDigits);
2411 //_____________________________________________________________________________
2412 void AliReconstruction::SlaveTerminate()
2414 // Finalize the run on the slave side
2415 // Called after the exit
2416 // from the event loop
2417 AliCodeTimerAuto("",0);
2418 // If analysis was done during reconstruction, we need to call SlaveTerminate for it
2420 fAnalysis->PackOutput(fOutput);
2421 fAnalysis->SetSkipTerminate(kTRUE);
2422 fAnalysis->Terminate();
2425 if (fIsNewRunLoader) { // galice.root didn't exist
2426 fRunLoader->WriteHeader("OVERWRITE");
2427 fRunLoader->WriteTrigger("OVERWRITE");
2428 fRunLoader->CdGAFile();
2429 fRunLoader->Write(0, TObject::kOverwrite);
2432 const TMap *cdbMap = AliCDBManager::Instance()->GetStorageMap();
2433 const TList *cdbList = AliCDBManager::Instance()->GetRetrievedIds();
2435 TMap *cdbMapCopy = new TMap(cdbMap->GetEntries());
2436 cdbMapCopy->SetOwner(1);
2437 cdbMapCopy->SetName("cdbMap");
2438 TIter iter(cdbMap->GetTable());
2441 while((pair = dynamic_cast<TPair*> (iter.Next()))){
2442 TObjString* keyStr = dynamic_cast<TObjString*> (pair->Key());
2443 TObjString* valStr = dynamic_cast<TObjString*> (pair->Value());
2444 if (keyStr && valStr)
2445 cdbMapCopy->Add(new TObjString(keyStr->GetName()), new TObjString(valStr->GetName()));
2448 TList *cdbListCopy = new TList();
2449 cdbListCopy->SetOwner(1);
2450 cdbListCopy->SetName("cdbList");
2452 TIter iter2(cdbList);
2455 while((id = dynamic_cast<AliCDBId*> (iter2.Next()))){
2456 cdbListCopy->Add(new TObjString(id->ToString().Data()));
2459 ftree->GetUserInfo()->Add(cdbMapCopy);
2460 ftree->GetUserInfo()->Add(cdbListCopy);
2462 // Add the AliRoot version that created this file
2463 TString sVersion("aliroot ");
2464 sVersion += ALIROOT_SVN_BRANCH;
2466 sVersion += ALIROOT_SVN_REVISION;
2467 sVersion += "; root ";
2468 sVersion += ROOT_SVN_BRANCH;
2470 sVersion += ROOT_SVN_REVISION;
2471 sVersion += "; metadata ";
2472 sVersion += getenv("PRODUCTION_METADATA");
2475 TNamed * alirootVersion = new TNamed("alirootVersion",sVersion.Data());
2476 ftree->GetUserInfo()->Add(alirootVersion); // The list becomes owner of alirootVersion
2480 // we want to have only one tree version number
2481 ftree->Write(ftree->GetName(),TObject::kOverwrite);
2482 fhlttree->Write(fhlttree->GetName(),TObject::kOverwrite);
2484 if (fWriteESDfriend) {
2486 ftreeF->Write(ftreeF->GetName(),TObject::kOverwrite);
2489 // Finish with Plane Efficiency evaluation: before of CleanUp !!!
2490 if (fRunPlaneEff && !FinishPlaneEff()) {
2491 AliWarning("Finish PlaneEff evaluation failed");
2494 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
2495 if (fReconstructor[iDet]) fReconstructor[iDet]->Terminate();
2497 // End of cycle for the in-loop
2499 if (fRunQA || fRunGlobalQA) {
2500 AliQAManager::QAManager()->EndOfCycle() ;
2502 !fProofOutputLocation.IsNull() &&
2503 fProofOutputArchive.IsNull() &&
2504 !fProofOutputDataset) {
2505 TString qaOutputFile(Form("%sMerged.%s.Data.root",
2506 fProofOutputLocation.Data(),
2507 AliQAv1::GetQADataFileName()));
2508 TProofOutputFile *qaProofFile = new TProofOutputFile(Form("Merged.%s.Data.root",
2509 AliQAv1::GetQADataFileName()));
2510 qaProofFile->SetOutputFileName(qaOutputFile.Data());
2511 if (AliDebugLevel() > 0) qaProofFile->Dump();
2512 fOutput->Add(qaProofFile);
2513 MergeQA(qaProofFile->GetFileName());
2524 if (!fProofOutputFileName.IsNull() &&
2525 !fProofOutputLocation.IsNull() &&
2526 fProofOutputDataset &&
2527 !fProofOutputArchive.IsNull()) {
2528 TProofOutputFile *zipProofFile = new TProofOutputFile(fProofOutputFileName.Data(),
2530 fProofOutputLocation.Data());
2531 if (AliDebugLevel() > 0) zipProofFile->Dump();
2532 fOutput->Add(zipProofFile);
2533 TString fileList(fProofOutputArchive.Data());
2534 fileList.ReplaceAll(","," ");
2536 #if ROOT_SVN_REVISION >= 30174
2537 command.Form("zip -n root %s/%s %s",zipProofFile->GetDir(kTRUE),zipProofFile->GetFileName(),fileList.Data());
2539 command.Form("zip -n root %s/%s %s",zipProofFile->GetDir(),zipProofFile->GetFileName(),fileList.Data());
2541 AliInfo(Form("Executing: %s",command.Data()));
2542 gSystem->Exec(command.Data());
2547 //_____________________________________________________________________________
2548 void AliReconstruction::Terminate()
2550 // Create tags for the events in the ESD tree (the ESD tree is always present)
2551 // In case of empty events the tags will contain dummy values
2552 AliCodeTimerAuto("",0);
2554 // Do not call the ESD tag creator in case of PROOF-based reconstruction
2556 AliESDTagCreator *esdtagCreator = new AliESDTagCreator();
2557 esdtagCreator->CreateESDTags(fFirstEvent,fLastEvent,fGRPData, AliQAv1::Instance()->GetQA(), AliQAv1::Instance()->GetEventSpecies(), AliQAv1::kNDET, AliRecoParam::kNSpecies);
2558 delete esdtagCreator;
2561 // Cleanup of CDB manager: cache and active storages!
2562 AliCDBManager::Instance()->ClearCache();
2565 //_____________________________________________________________________________
2566 Bool_t AliReconstruction::RunLocalEventReconstruction(const TString& detectors)
2568 // run the local reconstruction
2570 static Int_t eventNr=0;
2571 AliCodeTimerAuto("",0)
2573 TString detStr = detectors;
2574 // execute HLT reconstruction first since other detector reconstruction
2575 // might depend on HLT data
2576 // key 'HLT' is removed from detStr by IsSelected
2577 if (IsSelected("HLT", detStr)) {
2578 AliReconstructor* reconstructor = GetReconstructor(kNDetectors-1);
2579 if (reconstructor) {
2580 // there is no AliLoader for HLT, see
2581 // https://savannah.cern.ch/bugs/?35473
2582 AliInfo("running reconstruction for HLT");
2584 AliInfo("reconstructor->Reconstruct(fRawReader, NULL)");
2585 reconstructor->Reconstruct(fRawReader, NULL);
2588 AliInfo("reconstructor->Reconstruct(dummy, NULL)");
2590 reconstructor->Reconstruct(dummy, NULL);
2593 AliSysInfo::AddStamp(Form("LRecHLT_%d",eventNr), -1,1,eventNr);
2596 AliInfo(Form("kNDetectors = %d",kNDetectors));
2598 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
2599 if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
2600 AliDebug(1, Form("Detector: %s", fgkDetectorName[iDet]));
2601 AliReconstructor* reconstructor = GetReconstructor(iDet);
2602 if (!reconstructor) continue;
2603 AliLoader* loader = fLoader[iDet];
2605 AliWarning(Form("No loader is defined for %s!",fgkDetectorName[iDet]));
2608 // conversion of digits
2609 if (fRawReader && reconstructor->HasDigitConversion()) {
2610 AliInfo(Form("converting raw data digits into root objects for %s",
2611 fgkDetectorName[iDet]));
2612 // AliCodeTimerAuto(Form("converting raw data digits into root objects for %s",
2613 // fgkDetectorName[iDet]),0);
2614 loader->LoadDigits("update");
2615 loader->CleanDigits();
2616 loader->MakeDigitsContainer();
2617 TTree* digitsTree = loader->TreeD();
2618 reconstructor->ConvertDigits(fRawReader, digitsTree);
2619 loader->WriteDigits("OVERWRITE");
2620 loader->UnloadDigits();
2622 // local reconstruction
2623 AliInfo(Form("running reconstruction for %s", fgkDetectorName[iDet]));
2624 //AliCodeTimerAuto(Form("running reconstruction for %s", fgkDetectorName[iDet]),0);
2625 AliDebug(1, "Loading Rec Points");
2626 loader->LoadRecPoints("update");
2627 AliDebug(1, "Cleaning Rec Points");
2628 loader->CleanRecPoints();
2629 AliDebug(1, "Making Rec Points Container");
2630 loader->MakeRecPointsContainer();
2631 TTree* clustersTree = loader->TreeR();
2632 if (fRawReader && !reconstructor->HasDigitConversion()) {
2633 reconstructor->Reconstruct(fRawReader, clustersTree);
2636 AliDebug(1, "Loading Digits");
2637 loader->LoadDigits("read");
2638 TTree* digitsTree = loader->TreeD();
2639 AliDebug(1, Form("Digits Tree = %p",digitsTree));
2641 AliError(Form("Can't get the %s digits tree", fgkDetectorName[iDet]));
2646 AliDebug(1, "Digits -> Clusters");
2647 reconstructor->Reconstruct(digitsTree, clustersTree);
2648 if (fRunQA && IsInTasks(AliQAv1::kDIGITSR)) {
2649 AliQAManager::QAManager()->SetEventSpecie(fRecoParam.GetEventSpecie()) ;
2650 AliQAManager::QAManager()->RunOneEventInOneDetector(iDet, digitsTree) ;
2653 loader->UnloadDigits();
2655 if (fRunQA && IsInTasks(AliQAv1::kRECPOINTS)) {
2656 AliQAManager::QAManager()->SetEventSpecie(fRecoParam.GetEventSpecie()) ;
2657 AliQAManager::QAManager()->RunOneEventInOneDetector(iDet, clustersTree) ;
2659 loader->WriteRecPoints("OVERWRITE");
2660 loader->UnloadRecPoints();
2661 AliSysInfo::AddStamp(Form("LRec%s_%d",fgkDetectorName[iDet],eventNr), iDet,1,eventNr);
2663 if (!IsSelected("CTP", detStr)) AliDebug(10,"No CTP");
2664 if ((detStr.CompareTo("ALL") != 0) && !detStr.IsNull()) {
2665 AliError(Form("the following detectors were not found: %s",
2673 //_____________________________________________________________________________
2674 Bool_t AliReconstruction::RunSPDTrackleting(AliESDEvent*& esd)
2676 // run the SPD trackleting (for SPD efficiency purpouses)
2678 AliCodeTimerAuto("",0)
2680 Double_t vtxPos[3] = {0, 0, 0};
2681 Double_t vtxErr[3] = {0.0, 0.0, 0.0};
2687 if (fRunLoader->GetHeader() && fRunLoader->GetHeader()->GenEventHeader()) {
2688 fRunLoader->GetHeader()->GenEventHeader()->PrimaryVertex(mcVertex);
2689 for (Int_t i = 0; i < 3; i++) vtxPos[i] = mcVertex[i];
2692 const AliESDVertex *vertex = esd->GetVertex();
2694 AliWarning("Vertex not found");
2697 vertex->GetXYZ(vtxPos);
2698 vertex->GetSigmaXYZ(vtxErr);
2699 if (fSPDTrackleter) {
2700 AliInfo("running the SPD Trackleter for Plane Efficiency Evaluation");
2703 fLoader[0]->LoadRecPoints("read");
2704 TTree* tree = fLoader[0]->TreeR();
2706 AliError("Can't get the ITS cluster tree");
2709 fSPDTrackleter->LoadClusters(tree);
2710 fSPDTrackleter->SetVertex(vtxPos, vtxErr);
2712 if (fSPDTrackleter->Clusters2Tracks(esd) != 0) {
2713 AliWarning("AliITSTrackleterSPDEff Clusters2Tracks failed");
2714 // fLoader[0]->UnloadRecPoints();
2717 //fSPDTrackleter->UnloadRecPoints();
2719 AliWarning("SPDTrackleter not available");
2725 //_____________________________________________________________________________
2726 Bool_t AliReconstruction::RunVertexFinder(AliESDEvent*& esd)
2728 // run the barrel tracking
2730 AliCodeTimerAuto("",0)
2732 AliVertexer *vertexer = CreateVertexer();
2733 if (!vertexer) return kFALSE;
2735 AliInfo(Form("running the ITS vertex finder: %s",vertexer->ClassName()));
2736 AliESDVertex* vertex = NULL;
2738 fLoader[0]->LoadRecPoints();
2739 TTree* cltree = fLoader[0]->TreeR();
2741 if(fDiamondProfileSPD) vertexer->SetVtxStart(fDiamondProfileSPD);
2742 vertex = vertexer->FindVertexForCurrentEvent(cltree);
2745 AliError("Can't get the ITS cluster tree");
2747 fLoader[0]->UnloadRecPoints();
2750 AliError("Can't get the ITS loader");
2753 AliWarning("Vertex not found");
2754 vertex = new AliESDVertex();
2755 vertex->SetName("default");
2758 vertex->SetName("reconstructed");
2763 vertex->GetXYZ(vtxPos);
2764 vertex->GetSigmaXYZ(vtxErr);
2766 esd->SetPrimaryVertexSPD(vertex);
2767 AliESDVertex *vpileup = NULL;
2768 Int_t novertices = 0;
2769 vpileup = vertexer->GetAllVertices(novertices);
2771 for (Int_t kk=1; kk<novertices; kk++)esd->AddPileupVertexSPD(&vpileup[kk]);
2774 // if SPD multiplicity has been determined, it is stored in the ESD
2775 AliMultiplicity *mult = vertexer->GetMultiplicity();
2776 if(mult)esd->SetMultiplicity(mult);
2778 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
2779 if (fTracker[iDet]) fTracker[iDet]->SetVertex(vtxPos, vtxErr);
2788 //_____________________________________________________________________________
2789 Bool_t AliReconstruction::RunMultFinder(AliESDEvent*& esd)
2791 // run the trackleter for multiplicity study
2793 AliCodeTimerAuto("",0)
2795 AliTrackleter *trackleter = CreateMultFinder();
2796 if (!trackleter) return kFALSE;
2798 AliInfo(Form("running the ITS multiplicity finder: %s",trackleter->ClassName()));
2801 fLoader[0]->LoadRecPoints();
2802 TTree* cltree = fLoader[0]->TreeR();
2804 trackleter->Reconstruct(esd,cltree);
2805 AliMultiplicity *mult = trackleter->GetMultiplicity();
2806 if(mult) esd->SetMultiplicity(mult);
2809 AliError("Can't get the ITS cluster tree");
2811 fLoader[0]->UnloadRecPoints();
2814 AliError("Can't get the ITS loader");
2822 //_____________________________________________________________________________
2823 Bool_t AliReconstruction::RunMuonTracking(AliESDEvent*& esd)
2825 // run the muon spectrometer tracking
2827 AliCodeTimerAuto("",0)
2830 AliError("Missing runLoader!");
2833 Int_t iDet = GetDetIndex("MUON"); // for MUON
2835 // Get a pointer to the MUON reconstructor
2836 AliReconstructor *reconstructor = GetReconstructor(iDet);
2837 if (!reconstructor) return kFALSE;
2840 TString detName = fgkDetectorName[iDet];
2841 AliDebug(1, Form("%s tracking", detName.Data()));
2842 AliTracker *tracker = reconstructor->CreateTracker();
2844 AliWarning(Form("couldn't create a tracker for %s", detName.Data()));
2849 fLoader[iDet]->LoadRecPoints("read");
2851 tracker->LoadClusters(fLoader[iDet]->TreeR());
2853 Int_t rv = tracker->Clusters2Tracks(esd);
2855 fLoader[iDet]->UnloadRecPoints();
2857 tracker->UnloadClusters();
2861 AliError(Form("%s Clusters2Tracks failed", fgkDetectorName[iDet]));
2869 //_____________________________________________________________________________
2870 Bool_t AliReconstruction::RunTracking(AliESDEvent*& esd,AliESDpid &PID)
2872 // run the barrel tracking
2873 static Int_t eventNr=0;
2874 AliCodeTimerAuto("",0)
2876 AliInfo("running tracking");
2878 // Set the event info which is used
2879 // by the trackers in order to obtain
2880 // information about read-out detectors,
2882 AliDebug(1, "Setting event info");
2883 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
2884 if (!fTracker[iDet]) continue;
2885 fTracker[iDet]->SetEventInfo(&fEventInfo);
2888 //Fill the ESD with the T0 info (will be used by the TOF)
2889 if (fReconstructor[11] && fLoader[11]) {
2890 fLoader[11]->LoadRecPoints("READ");
2891 TTree *treeR = fLoader[11]->TreeR();
2893 GetReconstructor(11)->FillESD((TTree *)NULL,treeR,esd);
2897 // pass 1: TPC + ITS inwards
2898 for (Int_t iDet = 1; iDet >= 0; iDet--) {
2899 if (!fTracker[iDet]) continue;
2900 AliDebug(1, Form("%s tracking", fgkDetectorName[iDet]));
2903 fLoader[iDet]->LoadRecPoints("read");
2904 AliSysInfo::AddStamp(Form("RLoadCluster%s_%d",fgkDetectorName[iDet],eventNr),iDet,1, eventNr);
2905 TTree* tree = fLoader[iDet]->TreeR();
2907 AliError(Form("Can't get the %s cluster tree", fgkDetectorName[iDet]));
2910 fTracker[iDet]->LoadClusters(tree);
2911 AliSysInfo::AddStamp(Form("TLoadCluster%s_%d",fgkDetectorName[iDet],eventNr), iDet,2, eventNr);
2913 if (fTracker[iDet]->Clusters2TracksHLT(esd, fhltesd) != 0) {
2914 AliError(Form("%s Clusters2Tracks failed", fgkDetectorName[iDet]));
2917 AliSysInfo::AddStamp(Form("Tracking0%s_%d",fgkDetectorName[iDet],eventNr), iDet,3,eventNr);
2918 // preliminary PID in TPC needed by the ITS tracker
2920 GetReconstructor(1)->FillESD((TTree*)NULL, (TTree*)NULL, esd);
2921 PID.MakePID(esd,kTRUE);
2922 AliSysInfo::AddStamp(Form("MakePID0%s_%d",fgkDetectorName[iDet],eventNr), iDet,4,eventNr);
2926 // pass 2: ALL backwards
2928 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
2929 if (!fTracker[iDet]) continue;
2930 AliDebug(1, Form("%s back propagation", fgkDetectorName[iDet]));
2933 if (iDet > 1) { // all except ITS, TPC
2935 fLoader[iDet]->LoadRecPoints("read");
2936 AliSysInfo::AddStamp(Form("RLoadCluster0%s_%d",fgkDetectorName[iDet],eventNr), iDet,1, eventNr);
2937 tree = fLoader[iDet]->TreeR();
2939 AliError(Form("Can't get the %s cluster tree", fgkDetectorName[iDet]));
2942 fTracker[iDet]->LoadClusters(tree);
2943 AliSysInfo::AddStamp(Form("TLoadCluster0%s_%d",fgkDetectorName[iDet],eventNr), iDet,2, eventNr);
2947 if (iDet>1) // start filling residuals for the "outer" detectors
2949 AliTracker::SetFillResiduals(fRecoParam.GetEventSpecie(), kTRUE);
2950 TObjArray ** arr = AliTracker::GetResidualsArray() ;
2952 AliRecoParam::EventSpecie_t es=fRecoParam.GetEventSpecie();
2953 TObjArray * elem = arr[AliRecoParam::AConvert(es)];
2954 if ( elem && (! elem->At(0)) ) {
2955 AliQADataMaker *qadm = AliQAManager::QAManager()->GetQADataMaker(AliQAv1::kGLOBAL);
2956 if (qadm) qadm->InitRecPointsForTracker() ;
2959 // AliSysInfo::AddStamp(Form("QAInitResid%s_%d",fgkDetectorName[iDet],eventNr), iDet,0, eventNr);
2961 if (fTracker[iDet]->PropagateBack(esd) != 0) {
2962 AliError(Form("%s backward propagation failed", fgkDetectorName[iDet]));
2965 AliSysInfo::AddStamp(Form("Tracking1%s_%d",fgkDetectorName[iDet],eventNr), iDet,3, eventNr);
2968 if (iDet > 3) { // all except ITS, TPC, TRD and TOF
2969 fTracker[iDet]->UnloadClusters();
2970 fLoader[iDet]->UnloadRecPoints();
2972 // updated PID in TPC needed by the ITS tracker -MI
2974 //GetReconstructor(1)->FillESD((TTree*)NULL, (TTree*)NULL, esd);
2975 //AliESDpid::MakePID(esd);
2976 PID.MakePID(esd,kTRUE);
2977 AliSysInfo::AddStamp(Form("MakePID1%s_%d",fgkDetectorName[iDet],eventNr), iDet,4,eventNr);
2981 //stop filling residuals for the "outer" detectors
2982 if (fRunGlobalQA) AliTracker::SetFillResiduals(fRecoParam.GetEventSpecie(), kFALSE);
2984 // pass 3: TRD + TPC + ITS refit inwards
2986 for (Int_t iDet = 2; iDet >= 0; iDet--) {
2987 if (!fTracker[iDet]) continue;
2988 AliDebug(1, Form("%s inward refit", fgkDetectorName[iDet]));
2991 if (iDet<2) // start filling residuals for TPC and ITS
2993 AliTracker::SetFillResiduals(fRecoParam.GetEventSpecie(), kTRUE);
2994 TObjArray ** arr = AliTracker::GetResidualsArray() ;
2996 AliRecoParam::EventSpecie_t es=fRecoParam.GetEventSpecie();
2997 TObjArray * elem = arr[AliRecoParam::AConvert(es)];
2998 if ( elem && (! elem->At(0)) ) {
2999 AliQADataMaker *qadm = AliQAManager::QAManager()->GetQADataMaker(AliQAv1::kGLOBAL);
3000 if (qadm) qadm->InitRecPointsForTracker() ;
3005 if (fTracker[iDet]->RefitInward(esd) != 0) {
3006 AliError(Form("%s inward refit failed", fgkDetectorName[iDet]));
3009 // run postprocessing
3010 if (fTracker[iDet]->PostProcess(esd) != 0) {
3011 AliError(Form("%s postprocessing failed", fgkDetectorName[iDet]));
3014 AliSysInfo::AddStamp(Form("Tracking2%s_%d",fgkDetectorName[iDet],eventNr), iDet,3, eventNr);
3017 // write space-points to the ESD in case alignment data output
3019 if (fWriteAlignmentData) {
3020 WriteAlignmentData(esd);
3021 AliSysInfo::AddStamp(Form("WrtAlignData_%d",eventNr), 0,0, eventNr);
3024 for (Int_t iDet = 3; iDet >= 0; iDet--) {
3025 if (!fTracker[iDet]) continue;
3027 fTracker[iDet]->UnloadClusters();
3028 AliSysInfo::AddStamp(Form("TUnloadCluster%s_%d",fgkDetectorName[iDet],eventNr), iDet,4, eventNr);
3029 fLoader[iDet]->UnloadRecPoints();
3030 AliSysInfo::AddStamp(Form("RUnloadCluster%s_%d",fgkDetectorName[iDet],eventNr), iDet,5, eventNr);
3032 // stop filling residuals for TPC and ITS
3033 if (fRunGlobalQA) AliTracker::SetFillResiduals(fRecoParam.GetEventSpecie(), kFALSE);
3039 //_____________________________________________________________________________
3040 Bool_t AliReconstruction::CleanESD(AliESDEvent *esd){
3042 // Remove the data which are not needed for the physics analysis.
3045 Int_t nTracks=esd->GetNumberOfTracks();
3046 Int_t nV0s=esd->GetNumberOfV0s();
3048 (Form("Number of ESD tracks and V0s before cleaning: %d %d",nTracks,nV0s));
3050 Float_t cleanPars[]={fV0DCAmax,fV0CsPmin,fDmax,fZmax};
3051 Bool_t rc=esd->Clean(cleanPars);
3053 nTracks=esd->GetNumberOfTracks();
3054 nV0s=esd->GetNumberOfV0s();
3056 (Form("Number of ESD tracks and V0s after cleaning %d %d",nTracks,nV0s));
3061 //_____________________________________________________________________________
3062 Bool_t AliReconstruction::FillESD(AliESDEvent*& esd, const TString& detectors)
3064 // fill the event summary data
3066 AliCodeTimerAuto("",0)
3067 static Int_t eventNr=0;
3068 TString detStr = detectors;
3070 AliSysInfo::AddStamp(Form("FillESDb%d",eventNr), -19,-19, eventNr);
3071 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
3072 if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
3073 AliReconstructor* reconstructor = GetReconstructor(iDet);
3074 if (!reconstructor) continue;
3075 AliDebug(1, Form("filling ESD for %s", fgkDetectorName[iDet]));
3076 TTree* clustersTree = NULL;
3077 if (fLoader[iDet]) {
3078 fLoader[iDet]->LoadRecPoints("read");
3079 clustersTree = fLoader[iDet]->TreeR();
3080 if (!clustersTree) {
3081 AliError(Form("Can't get the %s clusters tree",
3082 fgkDetectorName[iDet]));
3083 if (fStopOnError) return kFALSE;
3086 if (fRawReader && !reconstructor->HasDigitConversion()) {
3087 reconstructor->FillESD(fRawReader, clustersTree, esd);
3089 TTree* digitsTree = NULL;
3090 if (fLoader[iDet]) {
3091 fLoader[iDet]->LoadDigits("read");
3092 digitsTree = fLoader[iDet]->TreeD();
3094 AliError(Form("Can't get the %s digits tree",
3095 fgkDetectorName[iDet]));
3096 if (fStopOnError) return kFALSE;
3099 reconstructor->FillESD(digitsTree, clustersTree, esd);
3100 if (fLoader[iDet]) fLoader[iDet]->UnloadDigits();
3102 if (fLoader[iDet]) {
3103 fLoader[iDet]->UnloadRecPoints();
3107 if (!IsSelected("CTP", detStr)) AliDebug(10,"No CTP");
3108 if ((detStr.CompareTo("ALL") != 0) && !detStr.IsNull()) {
3109 AliError(Form("the following detectors were not found: %s",
3111 if (fStopOnError) return kFALSE;
3113 AliSysInfo::AddStamp(Form("FillESDe%d",eventNr), -20,-20, eventNr);
3118 //_____________________________________________________________________________
3119 Bool_t AliReconstruction::FillTriggerESD(AliESDEvent*& esd)
3121 // Reads the trigger decision which is
3122 // stored in Trigger.root file and fills
3123 // the corresponding esd entries
3125 AliCodeTimerAuto("",0)
3127 AliInfo("Filling trigger information into the ESD");
3130 AliCTPRawStream input(fRawReader);
3131 if (!input.Next()) {
3132 AliWarning("No valid CTP (trigger) DDL raw data is found ! The trigger info is taken from the event header!");
3135 if (esd->GetTriggerMask() != input.GetClassMask())
3136 AliError(Form("Invalid trigger pattern found in CTP raw-data: %llx %llx",
3137 input.GetClassMask(),esd->GetTriggerMask()));
3138 if (esd->GetOrbitNumber() != input.GetOrbitID())
3139 AliError(Form("Invalid orbit id found in CTP raw-data: %x %x",
3140 input.GetOrbitID(),esd->GetOrbitNumber()));
3141 if (esd->GetBunchCrossNumber() != input.GetBCID())
3142 AliError(Form("Invalid bunch-crossing id found in CTP raw-data: %x %x",
3143 input.GetBCID(),esd->GetBunchCrossNumber()));
3144 AliESDHeader* esdheader = esd->GetHeader();
3145 esdheader->SetL0TriggerInputs(input.GetL0Inputs());
3146 esdheader->SetL1TriggerInputs(input.GetL1Inputs());
3147 esdheader->SetL2TriggerInputs(input.GetL2Inputs());
3149 // UInt_t orbit=input.GetOrbitID();
3150 for(Int_t i=0 ; i<input.GetNIRs() ; i++ ) {
3151 esdheader->AddTriggerIR(input.GetIR(i));
3153 AliCentralTrigger* rlCTP = fRunLoader->GetTrigger();
3155 rlCTP->SetL0TriggerInputs(input.GetL0Inputs());
3156 rlCTP->SetL1TriggerInputs(input.GetL1Inputs());
3157 rlCTP->SetL2TriggerInputs(input.GetL2Inputs());
3160 if (fIsNewRunLoader) fRunLoader->TreeCT()->Fill();
3164 //_____________________________________________________________________________
3165 Bool_t AliReconstruction::FillTriggerScalers(AliESDEvent*& esd)
3168 //fRunScalers->Print();
3169 if(fRunScalers && fRunScalers->CheckRunScalers()){
3170 AliTimeStamp* timestamp = new AliTimeStamp(esd->GetOrbitNumber(), esd->GetPeriodNumber(), esd->GetBunchCrossNumber());
3171 //AliTimeStamp* timestamp = new AliTimeStamp(10308000, 0, (ULong64_t)486238);
3172 AliESDHeader* esdheader = fesd->GetHeader();
3173 for(Int_t i=0;i<50;i++){
3174 if((1ull<<i) & esd->GetTriggerMask()){
3175 AliTriggerScalersESD* scalesd = fRunScalers->GetScalersForEventClass( timestamp, i+1);
3176 if(scalesd)esdheader->SetTriggerScalersRecord(scalesd);
3179 const AliTriggerScalersRecordESD* scalrecEvent = fRunScalers->GetScalersDeltaForEvent( timestamp);
3180 const AliTriggerScalersRecordESD* scalrecRun = fRunScalers->GetScalersDeltaForRun();
3181 if (scalrecEvent) esdheader->SetTriggerScalersDeltaEvent(scalrecEvent);
3182 if (scalrecRun) esdheader->SetTriggerScalersDeltaRun(scalrecRun);
3186 //_____________________________________________________________________________
3187 Bool_t AliReconstruction::FillRawEventHeaderESD(AliESDEvent*& esd)
3190 // Filling information from RawReader Header
3193 if (!fRawReader) return kFALSE;
3195 AliInfo("Filling information from RawReader Header");
3197 esd->SetBunchCrossNumber(fRawReader->GetBCID());
3198 esd->SetOrbitNumber(fRawReader->GetOrbitID());
3199 esd->SetPeriodNumber(fRawReader->GetPeriod());
3201 esd->SetTimeStamp(fRawReader->GetTimestamp());
3202 esd->SetEventType(fRawReader->GetType());
3208 //_____________________________________________________________________________
3209 Bool_t AliReconstruction::IsSelected(TString detName, TString& detectors) const
3211 // check whether detName is contained in detectors
3212 // if yes, it is removed from detectors
3214 // check if all detectors are selected
3215 if ((detectors.CompareTo("ALL") == 0) ||
3216 detectors.BeginsWith("ALL ") ||
3217 detectors.EndsWith(" ALL") ||
3218 detectors.Contains(" ALL ")) {
3223 // search for the given detector
3224 Bool_t result = kFALSE;
3225 if ((detectors.CompareTo(detName) == 0) ||
3226 detectors.BeginsWith(detName+" ") ||
3227 detectors.EndsWith(" "+detName) ||
3228 detectors.Contains(" "+detName+" ")) {
3229 detectors.ReplaceAll(detName, "");
3233 // clean up the detectors string
3234 while (detectors.Contains(" ")) detectors.ReplaceAll(" ", " ");
3235 while (detectors.BeginsWith(" ")) detectors.Remove(0, 1);
3236 while (detectors.EndsWith(" ")) detectors.Remove(detectors.Length()-1, 1);
3241 //_____________________________________________________________________________
3242 Bool_t AliReconstruction::InitRunLoader()
3244 // get or create the run loader
3246 if (gAlice) delete gAlice;
3249 TFile *gafile = TFile::Open(fGAliceFileName.Data());
3250 // if (!gSystem->AccessPathName(fGAliceFileName.Data())) { // galice.root exists
3251 if (gafile) { // galice.root exists
3255 // load all base libraries to get the loader classes
3256 TString libs = gSystem->GetLibraries();
3257 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
3258 TString detName = fgkDetectorName[iDet];
3259 if (libs.Contains("lib" + detName + "base.so")) continue;
3260 gSystem->Load("lib" + detName + "base.so");
3262 fRunLoader = AliRunLoader::Open(fGAliceFileName.Data());
3264 AliError(Form("no run loader found in file %s", fGAliceFileName.Data()));
3269 fRunLoader->CdGAFile();
3270 fRunLoader->LoadgAlice();
3272 //PH This is a temporary fix to give access to the kinematics
3273 //PH that is needed for the labels of ITS clusters
3274 fRunLoader->LoadHeader();
3275 fRunLoader->LoadKinematics();
3277 } else { // galice.root does not exist
3279 AliError(Form("the file %s does not exist", fGAliceFileName.Data()));
3281 fRunLoader = AliRunLoader::Open(fGAliceFileName.Data(),
3282 AliConfig::GetDefaultEventFolderName(),
3285 AliError(Form("could not create run loader in file %s",
3286 fGAliceFileName.Data()));
3290 fIsNewRunLoader = kTRUE;
3291 fRunLoader->MakeTree("E");
3292 fRunLoader->MakeTree("GG");
3294 if (fNumberOfEventsPerFile > 0)
3295 fRunLoader->SetNumberOfEventsPerFile(fNumberOfEventsPerFile);
3297 fRunLoader->SetNumberOfEventsPerFile((UInt_t)-1);
3303 //_____________________________________________________________________________
3304 AliReconstructor* AliReconstruction::GetReconstructor(Int_t iDet)
3306 // get the reconstructor object and the loader for a detector
3308 if (fReconstructor[iDet]) {
3309 if (fRecoParam.GetDetRecoParamArray(iDet) && !AliReconstructor::GetRecoParam(iDet)) {
3310 const AliDetectorRecoParam *par = fRecoParam.GetDetRecoParam(iDet);
3311 fReconstructor[iDet]->SetRecoParam(par);
3312 fReconstructor[iDet]->SetRunInfo(fRunInfo);
3314 return fReconstructor[iDet];
3317 // load the reconstructor object
3318 TPluginManager* pluginManager = gROOT->GetPluginManager();
3319 TString detName = fgkDetectorName[iDet];
3320 TString recName = "Ali" + detName + "Reconstructor";
3322 if (!fIsNewRunLoader && !fRunLoader->GetLoader(detName+"Loader") && (detName != "HLT")) return NULL;
3324 AliReconstructor* reconstructor = NULL;
3325 // first check if a plugin is defined for the reconstructor
3326 TPluginHandler* pluginHandler =
3327 pluginManager->FindHandler("AliReconstructor", detName);
3328 // if not, add a plugin for it
3329 if (!pluginHandler) {
3330 AliDebug(1, Form("defining plugin for %s", recName.Data()));
3331 TString libs = gSystem->GetLibraries();
3332 if (libs.Contains("lib" + detName + "base.so") ||
3333 (gSystem->Load("lib" + detName + "base.so") >= 0)) {
3334 pluginManager->AddHandler("AliReconstructor", detName,
3335 recName, detName + "rec", recName + "()");
3337 pluginManager->AddHandler("AliReconstructor", detName,
3338 recName, detName, recName + "()");
3340 pluginHandler = pluginManager->FindHandler("AliReconstructor", detName);
3342 if (pluginHandler && (pluginHandler->LoadPlugin() == 0)) {
3343 reconstructor = (AliReconstructor*) pluginHandler->ExecPlugin(0);
3346 // check if the upgrade reconstructor should be used instead of the standard one
3347 if(fUpgradeMask[iDet]) {
3348 if(reconstructor) delete reconstructor;
3349 TClass *cl = new TClass(Form("Ali%sUpgradeReconstructor",fgkDetectorName[iDet]));
3350 reconstructor = (AliReconstructor*)(cl->New());
3353 if (reconstructor) {
3354 TObject* obj = fOptions.FindObject(detName.Data());
3355 if (obj) reconstructor->SetOption(obj->GetTitle());
3356 reconstructor->SetRunInfo(fRunInfo);
3357 reconstructor->SetHLTESD(fhltesd);
3358 reconstructor->Init();
3359 fReconstructor[iDet] = reconstructor;
3362 // get or create the loader
3363 if (detName != "HLT") {
3364 fLoader[iDet] = fRunLoader->GetLoader(detName + "Loader");
3365 if (!fLoader[iDet]) {
3366 AliConfig::Instance()
3367 ->CreateDetectorFolders(fRunLoader->GetEventFolder(),
3369 // first check if a plugin is defined for the loader
3371 pluginManager->FindHandler("AliLoader", detName);
3372 // if not, add a plugin for it
3373 if (!pluginHandler) {
3374 TString loaderName = "Ali" + detName + "Loader";
3375 AliDebug(1, Form("defining plugin for %s", loaderName.Data()));
3376 pluginManager->AddHandler("AliLoader", detName,
3377 loaderName, detName + "base",
3378 loaderName + "(const char*, TFolder*)");
3379 pluginHandler = pluginManager->FindHandler("AliLoader", detName);
3381 if (pluginHandler && (pluginHandler->LoadPlugin() == 0)) {
3383 (AliLoader*) pluginHandler->ExecPlugin(2, detName.Data(),
3384 fRunLoader->GetEventFolder());
3386 if (!fLoader[iDet]) { // use default loader
3387 fLoader[iDet] = new AliLoader(detName, fRunLoader->GetEventFolder());
3389 if (!fLoader[iDet]) {
3390 AliWarning(Form("couldn't get loader for %s", detName.Data()));
3391 if (fStopOnError) return NULL;
3393 fRunLoader->AddLoader(fLoader[iDet]);
3394 fRunLoader->CdGAFile();
3395 if (gFile && !gFile->IsWritable()) gFile->ReOpen("UPDATE");
3396 fRunLoader->Write(0, TObject::kOverwrite);
3401 if (fRecoParam.GetDetRecoParamArray(iDet) && !AliReconstructor::GetRecoParam(iDet)) {
3402 const AliDetectorRecoParam *par = fRecoParam.GetDetRecoParam(iDet);
3403 if (reconstructor) {
3404 reconstructor->SetRecoParam(par);
3405 reconstructor->SetRunInfo(fRunInfo);
3408 return reconstructor;
3411 //_____________________________________________________________________________
3412 AliVertexer* AliReconstruction::CreateVertexer()
3414 // create the vertexer
3415 // Please note that the caller is the owner of the
3418 AliVertexer* vertexer = NULL;
3419 AliReconstructor* itsReconstructor = GetReconstructor(0);
3420 if (itsReconstructor && ((fRunLocalReconstruction.Contains("ITS")) ||
3421 fRunTracking.Contains("ITS") || fFillESD.Contains("ITS") )) {
3422 vertexer = itsReconstructor->CreateVertexer();
3425 AliWarning("couldn't create a vertexer for ITS");
3431 //_____________________________________________________________________________
3432 AliTrackleter* AliReconstruction::CreateMultFinder()
3434 // create the ITS trackleter for mult. estimation
3435 // Please note that the caller is the owner of the
3438 AliTrackleter* trackleter = NULL;
3439 AliReconstructor* itsReconstructor = GetReconstructor(0);
3440 if (itsReconstructor && ((fRunLocalReconstruction.Contains("ITS")) ||
3441 fRunTracking.Contains("ITS") || fFillESD.Contains("ITS") )) {
3442 trackleter = itsReconstructor->CreateMultFinder();
3445 AliWarning("ITS is not in reconstruction, switching off RunMultFinder");
3446 fRunMultFinder = kFALSE;
3452 //_____________________________________________________________________________
3453 Bool_t AliReconstruction::CreateTrackers(const TString& detectors)
3455 // create the trackers
3456 AliInfo("Creating trackers");
3458 TString detStr = detectors;
3459 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
3460 if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
3461 AliReconstructor* reconstructor = GetReconstructor(iDet);
3462 if (!reconstructor) continue;
3463 TString detName = fgkDetectorName[iDet];
3464 if (detName == "MUON") {
3465 fRunMuonTracking = kTRUE;
3469 fTracker[iDet] = reconstructor->CreateTracker();
3470 if (!fTracker[iDet] && (iDet < 7)) {
3471 AliWarning(Form("couldn't create a tracker for %s", detName.Data()));
3472 if (fStopOnError) return kFALSE;
3474 AliSysInfo::AddStamp(Form("LTracker%s",fgkDetectorName[iDet]), iDet,0);
3480 //_____________________________________________________________________________
3481 void AliReconstruction::CleanUp()
3483 // delete trackers and the run loader and close and delete the file
3484 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
3485 delete fReconstructor[iDet];
3486 fReconstructor[iDet] = NULL;
3487 fLoader[iDet] = NULL;
3488 delete fTracker[iDet];
3489 fTracker[iDet] = NULL;
3495 delete fSPDTrackleter;
3496 fSPDTrackleter = NULL;
3505 delete fParentRawReader;
3506 fParentRawReader=NULL;
3514 if (AliQAManager::QAManager())
3515 AliQAManager::QAManager()->ShowQA() ;
3516 // AliQAManager::Destroy() ;
3521 void AliReconstruction::WriteAlignmentData(AliESDEvent* esd)
3523 // Write space-points which are then used in the alignment procedures
3524 // For the moment only ITS, TPC, TRD and TOF
3526 Int_t ntracks = esd->GetNumberOfTracks();
3527 for (Int_t itrack = 0; itrack < ntracks; itrack++)
3529 AliESDtrack *track = esd->GetTrack(itrack);
3532 for (Int_t i=0; i<200; ++i) idx[i] = -1; //PH avoid uninitialized values
3533 for (Int_t iDet = 5; iDet >= 0; iDet--) {// TOF, TRD, TPC, ITS clusters
3534 nsp += (iDet==GetDetIndex("TRD")) ? track->GetTRDntracklets():track->GetNcls(iDet);
3536 if (iDet==GetDetIndex("ITS")) { // ITS "extra" clusters
3537 track->GetClusters(iDet,idx);
3538 for (Int_t i=6; i<12; i++) if(idx[i] >= 0) nsp++;
3543 AliTrackPointArray *sp = new AliTrackPointArray(nsp);
3544 track->SetTrackPointArray(sp);
3546 for (Int_t iDet = 5; iDet >= 0; iDet--) {
3547 AliTracker *tracker = fTracker[iDet];
3548 if (!tracker) continue;
3549 Int_t nspdet = (iDet==GetDetIndex("TRD")) ? track->GetTRDtracklets(idx):track->GetClusters(iDet,idx);
3551 if (iDet==GetDetIndex("ITS")) // ITS "extra" clusters
3552 for (Int_t i=6; i<12; i++) if(idx[i] >= 0) nspdet++;
3554 if (nspdet <= 0) continue;
3558 while (isp2 < nspdet) {
3559 Bool_t isvalid=kTRUE;
3561 Int_t index=idx[isp++];
3562 if (index < 0) continue;
3564 TString dets = fgkDetectorName[iDet];
3565 if ((fUseTrackingErrorsForAlignment.CompareTo(dets) == 0) ||
3566 fUseTrackingErrorsForAlignment.BeginsWith(dets+" ") ||
3567 fUseTrackingErrorsForAlignment.EndsWith(" "+dets) ||
3568 fUseTrackingErrorsForAlignment.Contains(" "+dets+" ")) {
3569 isvalid = tracker->GetTrackPointTrackingError(index,p,track);
3571 isvalid = tracker->GetTrackPoint(index,p);
3574 if (!isvalid) continue;
3575 if (iDet==GetDetIndex("ITS") && (isp-1)>=6) p.SetExtra();
3576 sp->AddPoint(isptrack,&p); isptrack++;
3583 //_____________________________________________________________________________
3584 void AliReconstruction::FillRawDataErrorLog(Int_t iEvent, AliESDEvent* esd)
3586 // The method reads the raw-data error log
3587 // accumulated within the rawReader.
3588 // It extracts the raw-data errors related to
3589 // the current event and stores them into
3590 // a TClonesArray inside the esd object.
3592 if (!fRawReader) return;
3594 for(Int_t i = 0; i < fRawReader->GetNumberOfErrorLogs(); i++) {
3596 AliRawDataErrorLog *log = fRawReader->GetErrorLog(i);
3598 if (iEvent != log->GetEventNumber()) continue;
3600 esd->AddRawDataErrorLog(log);
3605 //_____________________________________________________________________________
3606 // void AliReconstruction::CheckQA()
3608 // check the QA of SIM for this run and remove the detectors
3609 // with status Fatal
3611 // TString newRunLocalReconstruction ;
3612 // TString newRunTracking ;
3613 // TString newFillESD ;
3615 // for (Int_t iDet = 0; iDet < AliQAv1::kNDET; iDet++) {
3616 // TString detName(AliQAv1::GetDetName(iDet)) ;
3617 // AliQAv1 * qa = AliQAv1::Instance(AliQAv1::DETECTORINDEX_t(iDet)) ;
3618 // if ( qa->IsSet(AliQAv1::DETECTORINDEX_t(iDet), AliQAv1::kSIM, specie, AliQAv1::kFATAL)) {
3619 // AliInfo(Form("QA status for %s %s in Hits and/or SDIGITS and/or Digits was Fatal; No reconstruction performed",
3620 // detName.Data(), AliRecoParam::GetEventSpecieName(es))) ;
3622 // if ( fRunLocalReconstruction.Contains(AliQAv1::GetDetName(iDet)) ||
3623 // fRunLocalReconstruction.Contains("ALL") ) {
3624 // newRunLocalReconstruction += detName ;
3625 // newRunLocalReconstruction += " " ;
3627 // if ( fRunTracking.Contains(AliQAv1::GetDetName(iDet)) ||
3628 // fRunTracking.Contains("ALL") ) {
3629 // newRunTracking += detName ;
3630 // newRunTracking += " " ;
3632 // if ( fFillESD.Contains(AliQAv1::GetDetName(iDet)) ||
3633 // fFillESD.Contains("ALL") ) {
3634 // newFillESD += detName ;
3635 // newFillESD += " " ;
3639 // fRunLocalReconstruction = newRunLocalReconstruction ;
3640 // fRunTracking = newRunTracking ;
3641 // fFillESD = newFillESD ;
3644 //_____________________________________________________________________________
3645 Int_t AliReconstruction::GetDetIndex(const char* detector)
3647 // return the detector index corresponding to detector
3649 for (index = 0; index < kNDetectors ; index++) {
3650 if ( strcmp(detector, fgkDetectorName[index]) == 0 )
3655 //_____________________________________________________________________________
3656 Bool_t AliReconstruction::FinishPlaneEff() {
3658 // Here execute all the necessary operationis, at the end of the tracking phase,
3659 // in case that evaluation of PlaneEfficiencies was required for some detector.
3660 // E.g., write into a DataBase file the PlaneEfficiency which have been evaluated.
3662 // This Preliminary version works only FOR ITS !!!!!
3663 // other detectors (TOF,TRD, etc. have to develop their specific codes)
3666 // Return: kTRUE if all operations have been done properly, kFALSE otherwise
3669 TString detStr = fLoadCDB;
3670 //for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
3671 for (Int_t iDet = 0; iDet < 1; iDet++) { // for the time being only ITS
3672 if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
3673 if(fTracker[iDet] && fTracker[iDet]->GetPlaneEff()) {
3674 AliPlaneEff *planeeff=fTracker[iDet]->GetPlaneEff();
3675 TString name=planeeff->GetName();
3677 TFile* pefile = TFile::Open(name, "RECREATE");
3678 ret=(Bool_t)planeeff->Write();
3680 if(planeeff->GetCreateHistos()) {
3681 TString hname=planeeff->GetName();
3682 hname+="Histo.root";
3683 ret*=planeeff->WriteHistosToFile(hname,"RECREATE");
3686 if(fSPDTrackleter) {
3687 AliPlaneEff *planeeff=fSPDTrackleter->GetPlaneEff();
3688 TString name="AliITSPlaneEffSPDtracklet.root";
3689 TFile* pefile = TFile::Open(name, "RECREATE");
3690 ret=(Bool_t)planeeff->Write();
3692 AliESDEvent *dummy=NULL;
3693 ret=(Bool_t)fSPDTrackleter->PostProcess(dummy); // take care of writing other files
3698 //_____________________________________________________________________________
3699 Bool_t AliReconstruction::InitPlaneEff() {
3701 // Here execute all the necessary operations, before of the tracking phase,
3702 // for the evaluation of PlaneEfficiencies, in case required for some detectors.
3703 // E.g., read from a DataBase file a first evaluation of the PlaneEfficiency
3704 // which should be updated/recalculated.
3706 // This Preliminary version will work only FOR ITS !!!!!
3707 // other detectors (TOF,TRD, etc. have to develop their specific codes)
3710 // Return: kTRUE if all operations have been done properly, kFALSE otherwise
3713 fSPDTrackleter = NULL;
3714 TString detStr = fLoadCDB;
3715 if (IsSelected(fgkDetectorName[0], detStr)) {
3716 AliReconstructor* itsReconstructor = GetReconstructor(0);
3717 if (itsReconstructor) {
3718 fSPDTrackleter = itsReconstructor->CreateTrackleter(); // this is NULL unless required in RecoParam
3720 if (fSPDTrackleter) {
3721 AliInfo("Trackleter for SPD has been created");
3727 //_____________________________________________________________________________
3728 Bool_t AliReconstruction::InitAliEVE()
3730 // This method should be called only in case
3731 // AliReconstruction is run
3732 // within the alieve environment.
3733 // It will initialize AliEVE in a way
3734 // so that it can visualize event processed
3735 // by AliReconstruction.
3736 // The return flag shows whenever the
3737 // AliEVE initialization was successful or not.
3739 TString macroStr(getenv("ALIEVE_ONLINE_MACRO"));
3741 if (macroStr.IsNull())
3742 macroStr.Form("%s/EVE/macros/alieve_online.C",gSystem->ExpandPathName("$ALICE_ROOT"));
3744 AliInfo(Form("Loading AliEVE macro: %s",macroStr.Data()));
3746 if (gROOT->LoadMacro(macroStr.Data()) != 0) return kFALSE;
3748 gROOT->ProcessLine("if (!AliEveEventManager::GetMaster()){new AliEveEventManager();AliEveEventManager::GetMaster()->AddNewEventCommand(\"alieve_online_on_new_event()\");gEve->AddEvent(AliEveEventManager::GetMaster());};");
3749 gROOT->ProcessLine("alieve_online_init()");
3754 //_____________________________________________________________________________
3755 void AliReconstruction::RunAliEVE()
3757 // Runs AliEVE visualisation of
3758 // the current event.
3759 // Should be executed only after
3760 // successful initialization of AliEVE.
3762 AliInfo("Running AliEVE...");
3763 gROOT->ProcessLine(Form("AliEveEventManager::GetMaster()->SetEvent((AliRunLoader*)%p,(AliRawReader*)%p,(AliESDEvent*)%p,(AliESDfriend*)%p);",fRunLoader,fRawReader,fesd,fesdf));
3767 //_____________________________________________________________________________
3768 Bool_t AliReconstruction::SetRunQA(TString detAndAction)
3770 // Allows to run QA for a selected set of detectors
3771 // and a selected set of tasks among RAWS, DIGITSR, RECPOINTS and ESDS
3772 // all selected detectors run the same selected tasks
3774 if (!detAndAction.Contains(":")) {
3775 AliError( Form("%s is a wrong syntax, use \"DetectorList:ActionList\" \n", detAndAction.Data()) ) ;
3779 Int_t colon = detAndAction.Index(":") ;
3780 fQADetectors = detAndAction(0, colon) ;
3781 fQATasks = detAndAction(colon+1, detAndAction.Sizeof() ) ;
3782 if (fQATasks.Contains("ALL") ) {
3783 fQATasks = Form("%d %d %d %d", AliQAv1::kRAWS, AliQAv1::kDIGITSR, AliQAv1::kRECPOINTS, AliQAv1::kESDS) ;
3785 fQATasks.ToUpper() ;
3787 if ( fQATasks.Contains("RAW") )
3788 tempo = Form("%d ", AliQAv1::kRAWS) ;
3789 if ( fQATasks.Contains("DIGIT") )
3790 tempo += Form("%d ", AliQAv1::kDIGITSR) ;
3791 if ( fQATasks.Contains("RECPOINT") )
3792 tempo += Form("%d ", AliQAv1::kRECPOINTS) ;
3793 if ( fQATasks.Contains("ESD") )
3794 tempo += Form("%d ", AliQAv1::kESDS) ;
3796 if (fQATasks.IsNull()) {
3797 AliInfo("No QA requested\n") ;
3802 TString tempo(fQATasks) ;
3803 tempo.ReplaceAll(Form("%d", AliQAv1::kRAWS), AliQAv1::GetTaskName(AliQAv1::kRAWS)) ;
3804 tempo.ReplaceAll(Form("%d", AliQAv1::kDIGITSR), AliQAv1::GetTaskName(AliQAv1::kDIGITSR)) ;
3805 tempo.ReplaceAll(Form("%d", AliQAv1::kRECPOINTS), AliQAv1::GetTaskName(AliQAv1::kRECPOINTS)) ;
3806 tempo.ReplaceAll(Form("%d", AliQAv1::kESDS), AliQAv1::GetTaskName(AliQAv1::kESDS)) ;
3807 AliInfo( Form("QA will be done on \"%s\" for \"%s\"\n", fQADetectors.Data(), tempo.Data()) ) ;
3812 //_____________________________________________________________________________
3813 Bool_t AliReconstruction::InitRecoParams()
3815 // The method accesses OCDB and retrieves all
3816 // the available reco-param objects from there.
3818 Bool_t isOK = kTRUE;
3820 if (fRecoParam.GetDetRecoParamArray(kNDetectors)) {
3821 AliInfo("Using custom GRP reconstruction parameters");
3824 AliInfo("Loading GRP reconstruction parameter objects");
3826 AliCDBPath path("GRP","Calib","RecoParam");
3827 AliCDBEntry *entry=AliCDBManager::Instance()->Get(path.GetPath());
3829 AliWarning("Couldn't find GRP RecoParam entry in OCDB");
3833 TObject *recoParamObj = entry->GetObject();
3834 if (dynamic_cast<TObjArray*>(recoParamObj)) {
3835 // GRP has a normal TobjArray of AliDetectorRecoParam objects
3836 // Registering them in AliRecoParam
3837 fRecoParam.AddDetRecoParamArray(kNDetectors,dynamic_cast<TObjArray*>(recoParamObj));
3839 else if (dynamic_cast<AliDetectorRecoParam*>(recoParamObj)) {
3840 // GRP has only onse set of reco parameters
3841 // Registering it in AliRecoParam
3842 AliInfo("Single set of GRP reconstruction parameters found");
3843 dynamic_cast<AliDetectorRecoParam*>(recoParamObj)->SetAsDefault();
3844 fRecoParam.AddDetRecoParam(kNDetectors,dynamic_cast<AliDetectorRecoParam*>(recoParamObj));
3847 AliError("No valid GRP RecoParam object found in the OCDB");
3854 TString detStr = fLoadCDB;
3855 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
3857 if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
3859 if (fRecoParam.GetDetRecoParamArray(iDet)) {
3860 AliInfo(Form("Using custom reconstruction parameters for detector %s",fgkDetectorName[iDet]));
3864 AliInfo(Form("Loading reconstruction parameter objects for detector %s",fgkDetectorName[iDet]));
3866 AliCDBPath path(fgkDetectorName[iDet],"Calib","RecoParam");
3867 AliCDBEntry *entry=AliCDBManager::Instance()->Get(path.GetPath());
3869 AliWarning(Form("Couldn't find RecoParam entry in OCDB for detector %s",fgkDetectorName[iDet]));
3873 TObject *recoParamObj = entry->GetObject();
3874 if (dynamic_cast<TObjArray*>(recoParamObj)) {
3875 // The detector has a normal TobjArray of AliDetectorRecoParam objects
3876 // Registering them in AliRecoParam
3877 fRecoParam.AddDetRecoParamArray(iDet,dynamic_cast<TObjArray*>(recoParamObj));
3879 else if (dynamic_cast<AliDetectorRecoParam*>(recoParamObj)) {
3880 // The detector has only onse set of reco parameters
3881 // Registering it in AliRecoParam
3882 AliInfo(Form("Single set of reconstruction parameters found for detector %s",fgkDetectorName[iDet]));
3883 dynamic_cast<AliDetectorRecoParam*>(recoParamObj)->SetAsDefault();
3884 fRecoParam.AddDetRecoParam(iDet,dynamic_cast<AliDetectorRecoParam*>(recoParamObj));
3887 AliError(Form("No valid RecoParam object found in the OCDB for detector %s",fgkDetectorName[iDet]));
3891 // FIX ME: We have to disable the unloading of reco-param CDB
3892 // entries because QA framework is using them. Has to be fix in
3893 // a way that the QA takes the objects already constructed in
3895 // AliCDBManager::Instance()->UnloadFromCache(path.GetPath());
3899 if (AliDebugLevel() > 0) fRecoParam.Print();
3904 //_____________________________________________________________________________
3905 Bool_t AliReconstruction::GetEventInfo()
3907 // Fill the event info object
3909 AliCodeTimerAuto("",0)
3911 AliCentralTrigger *aCTP = NULL;
3913 fEventInfo.SetEventType(fRawReader->GetType());
3915 ULong64_t mask = fRawReader->GetClassMask();
3916 fEventInfo.SetTriggerMask(mask);
3917 UInt_t clmask = fRawReader->GetDetectorPattern()[0];
3918 fEventInfo.SetTriggerCluster(AliDAQ::ListOfTriggeredDetectors(clmask));
3920 aCTP = new AliCentralTrigger();
3921 TString configstr("");
3922 if (!aCTP->LoadConfiguration(configstr)) { // Load CTP config from OCDB
3923 AliError("No trigger configuration found in OCDB! The trigger configuration information will not be used!");
3927 aCTP->SetClassMask(mask);
3928 aCTP->SetClusterMask(clmask);
3931 AliCentralTrigger* rlCTP = fRunLoader->GetTrigger();
3933 rlCTP->SetClassMask(mask);
3934 rlCTP->SetClusterMask(clmask);
3939 fEventInfo.SetEventType(AliRawEventHeaderBase::kPhysicsEvent);
3941 if (fRunLoader && (!fRunLoader->LoadTrigger())) {
3942 aCTP = fRunLoader->GetTrigger();
3943 fEventInfo.SetTriggerMask(aCTP->GetClassMask());
3944 // get inputs from actp - just get
3945 AliESDHeader* esdheader = fesd->GetHeader();
3946 esdheader->SetL0TriggerInputs(aCTP->GetL0TriggerInputs());
3947 esdheader->SetL1TriggerInputs(aCTP->GetL1TriggerInputs());
3948 esdheader->SetL2TriggerInputs(aCTP->GetL2TriggerInputs());
3949 fEventInfo.SetTriggerCluster(AliDAQ::ListOfTriggeredDetectors(aCTP->GetClusterMask()));
3952 if (fStopOnMissingTriggerFile) AliFatal("No trigger can be loaded! Stopping reconstruction!");
3953 AliWarning("No trigger can be loaded! The trigger information will not be used!");
3958 AliTriggerConfiguration *config = aCTP->GetConfiguration();
3960 AliError("No trigger configuration has been found! The trigger configuration information will not be used!");
3961 if (fRawReader) delete aCTP;
3965 // Load trigger aliases and declare the trigger classes included in aliases
3966 //PH Why do we do it in each event and not only once in the beginning of the chunk??
3967 //PH Temporary fix for #99725: AliReconstruction::GetEventInfo bug
3968 fDeclTriggerClasses.Clear();
3969 AliCDBEntry * entry = AliCDBManager::Instance()->Get("GRP/CTP/Aliases");
3971 THashList * lst = dynamic_cast<THashList*>(entry->GetObject());
3973 lst->Sort(kSortDescending); // to avoid problems with substrungs
3974 if (fRawReader) fRawReader->LoadTriggerAlias(lst);
3975 // Now declare all the triggers present in the aliases
3978 while((nmd = dynamic_cast<TNamed*>(iter.Next()))){
3979 fDeclTriggerClasses += " ";
3980 fDeclTriggerClasses += nmd->GetName();
3984 AliError("Cannot cast the object with trigger aliases to THashList!");
3988 AliError("No OCDB ebtry for the trigger aliases!");
3990 // Load trigger classes for this run
3991 UChar_t clustmask = 0;
3993 ULong64_t trmask = fEventInfo.GetTriggerMask();
3994 const TObjArray& classesArray = config->GetClasses();
3995 Int_t nclasses = classesArray.GetEntriesFast();
3996 for( Int_t iclass=0; iclass < nclasses; iclass++ ) {
3997 AliTriggerClass* trclass = (AliTriggerClass*)classesArray.At(iclass);
3998 if (trclass && trclass->GetMask()>0) {
3999 Int_t trindex = TMath::Nint(TMath::Log2(trclass->GetMask()));
4000 if (fesd) fesd->SetTriggerClass(trclass->GetName(),trindex);
4001 if (fRawReader) fRawReader->LoadTriggerClass(trclass->GetName(),trindex);
4002 if (trmask & (1ull << trindex)) {
4004 trclasses += trclass->GetName();
4006 clustmask |= trclass->GetCluster()->GetClusterMask();
4010 fEventInfo.SetTriggerClasses(trclasses);
4011 // Now put the declared trigger classes (not present in the run)
4012 // to 0/false in the event selection
4013 if (!fDeclTriggerClasses.IsNull()) {
4014 TObjArray *tokens = fDeclTriggerClasses.Tokenize(" ");
4015 Int_t ntokens = tokens->GetEntriesFast();
4016 for (Int_t itoken = 0; itoken < ntokens; ++itoken) {
4017 if (fRawReader) fRawReader->LoadTriggerClass((((TObjString*)tokens->At(itoken))->String()).Data(),-1);
4022 // Write names of active trigger inputs in ESD Header
4023 const TObjArray& inputsArray = config->GetInputs();
4024 Int_t ninputs = inputsArray.GetEntriesFast();
4025 for( Int_t iinput=0; iinput < ninputs; iinput++ ) {
4026 AliTriggerInput* trginput = (AliTriggerInput*)inputsArray.At(iinput);
4027 if (trginput && trginput->GetMask()>0) {
4028 Int_t inputIndex = (Int_t)TMath::Nint(TMath::Log2(trginput->GetMask()));
4029 AliESDHeader* headeresd = 0x0;
4030 if (fesd) headeresd = fesd->GetHeader();
4032 Int_t trglevel = (Int_t)trginput->GetLevel();
4033 if (trglevel == 0) headeresd->SetActiveTriggerInputs(trginput->GetInputName(), inputIndex);
4034 if (trglevel == 1) headeresd->SetActiveTriggerInputs(trginput->GetInputName(), inputIndex+24);
4035 if (trglevel == 2) headeresd->SetActiveTriggerInputs(trginput->GetInputName(), inputIndex+48);
4040 // Set the information in ESD
4042 fesd->SetTriggerMask(trmask);
4043 fesd->SetTriggerCluster(clustmask);
4046 if (!aCTP->CheckTriggeredDetectors()) {
4047 if (fRawReader) delete aCTP;
4051 if (fRawReader) delete aCTP;
4053 // We have to fill also the HLT decision here!!
4059 const char *AliReconstruction::MatchDetectorList(const char *detectorList, UInt_t detectorMask)
4061 // Match the detector list found in the rec.C or the default 'ALL'
4062 // to the list found in the GRP (stored there by the shuttle PP which
4063 // gets the information from ECS)
4064 static TString resultList;
4065 TString detList = detectorList;
4069 for(Int_t iDet = 0; iDet < (AliDAQ::kNDetectors-1); iDet++) {
4070 if ((detectorMask >> iDet) & 0x1) {
4071 TString det = AliDAQ::OfflineModuleName(iDet);
4072 if ((detList.CompareTo("ALL") == 0) ||
4073 ((detList.BeginsWith("ALL ") ||
4074 detList.EndsWith(" ALL") ||
4075 detList.Contains(" ALL ")) &&
4076 !(detList.BeginsWith("-"+det+" ") ||
4077 detList.EndsWith(" -"+det) ||
4078 detList.Contains(" -"+det+" "))) ||
4079 (detList.CompareTo(det) == 0) ||
4080 detList.BeginsWith(det+" ") ||
4081 detList.EndsWith(" "+det) ||
4082 detList.Contains( " "+det+" " )) {
4083 if (!resultList.EndsWith(det + " ")) {
4092 if ((detectorMask >> AliDAQ::kHLTId) & 0x1) {
4093 TString hltDet = AliDAQ::OfflineModuleName(AliDAQ::kNDetectors-1);
4094 if ((detList.CompareTo("ALL") == 0) ||
4095 ((detList.BeginsWith("ALL ") ||
4096 detList.EndsWith(" ALL") ||
4097 detList.Contains(" ALL ")) &&
4098 !(detList.BeginsWith("-"+hltDet+" ") ||
4099 detList.EndsWith(" -"+hltDet) ||
4100 detList.Contains(" -"+hltDet+" "))) ||
4101 (detList.CompareTo(hltDet) == 0) ||
4102 detList.BeginsWith(hltDet+" ") ||
4103 detList.EndsWith(" "+hltDet) ||
4104 detList.Contains( " "+hltDet+" " )) {
4105 resultList += hltDet;
4109 return resultList.Data();
4113 //______________________________________________________________________________
4114 void AliReconstruction::Abort(const char *method, EAbort what)
4116 // Abort processing. If what = kAbortProcess, the Process() loop will be
4117 // aborted. If what = kAbortFile, the current file in a chain will be
4118 // aborted and the processing will continue with the next file, if there
4119 // is no next file then Process() will be aborted. Abort() can also be
4120 // called from Begin(), SlaveBegin(), Init() and Notify(). After abort
4121 // the SlaveTerminate() and Terminate() are always called. The abort flag
4122 // can be checked in these methods using GetAbort().
4124 // The method is overwritten in AliReconstruction for better handling of
4125 // reco specific errors
4127 if (!fStopOnError) return;
4131 TString whyMess = method;
4132 whyMess += " failed! Aborting...";
4134 AliError(whyMess.Data());
4137 TString mess = "Abort";
4138 if (fAbort == kAbortProcess)
4139 mess = "AbortProcess";
4140 else if (fAbort == kAbortFile)
4143 Info(mess.Data(), "%s", whyMess.Data());
4146 //______________________________________________________________________________
4147 Bool_t AliReconstruction::ProcessEvent(void* event)
4149 // Method that is used in case the event loop
4150 // is steered from outside, for example by AMORE
4151 // 'event' is a pointer to the DATE event in the memory
4153 if (fRawReader) delete fRawReader;
4154 fRawReader = new AliRawReaderDate(event);
4155 fStatus = ProcessEvent(fRunLoader->GetNumberOfEvents());
4162 //______________________________________________________________________________
4163 Bool_t AliReconstruction::ParseOutput()
4165 // The method parses the output file
4166 // location string in order to steer
4167 // properly the selector
4169 TPMERegexp re1("(\\w+\\.zip#\\w+\\.root):([,*\\w+\\.root,*]+)@dataset://(\\w++)");
4170 TPMERegexp re2("(\\w+\\.root)?@?dataset://(\\w++)");
4172 if (re1.Match(fESDOutput) == 4) {
4173 // root archive with output files stored and regustered
4175 gProof->AddInput(new TNamed("PROOF_OUTPUTFILE",re1[1].Data()));
4176 gProof->AddInput(new TNamed("PROOF_OUTPUTFILE_LOCATION",re1[3].Data()));
4177 gProof->AddInput(new TNamed("PROOF_OUTPUTFILE_DATASET",""));
4178 gProof->AddInput(new TNamed("PROOF_OUTPUTFILE_ARCHIVE",re1[2].Data()));
4179 AliInfo(Form("%s files will be stored within %s in dataset %s",
4184 else if (re2.Match(fESDOutput) == 3) {
4185 // output file stored and registered
4187 gProof->AddInput(new TNamed("PROOF_OUTPUTFILE",(re2[1].IsNull()) ? "AliESDs.root" : re2[1].Data()));
4188 gProof->AddInput(new TNamed("PROOF_OUTPUTFILE_LOCATION",re2[2].Data()));
4189 gProof->AddInput(new TNamed("PROOF_OUTPUTFILE_DATASET",""));
4190 AliInfo(Form("%s will be stored in dataset %s",
4191 (re2[1].IsNull()) ? "AliESDs.root" : re2[1].Data(),
4195 if (fESDOutput.IsNull()) {
4196 // Output location not given.
4197 // Assuming xrootd has been already started and
4198 // the output file has to be sent back
4199 // to the client machine
4200 TString esdUrl(Form("root://%s/%s/",
4201 TUrl(gSystem->HostName()).GetHostFQDN(),
4203 gProof->AddInput(new TNamed("PROOF_OUTPUTFILE","AliESDs.root"));
4204 gProof->AddInput(new TNamed("PROOF_OUTPUTFILE_LOCATION",esdUrl.Data()));
4205 AliInfo(Form("AliESDs.root will be stored in %s",
4209 // User specified an output location.
4210 // Ones has just to parse it here
4211 TUrl outputUrl(fESDOutput.Data());
4212 TString outputFile(gSystem->BaseName(outputUrl.GetFile()));
4213 gProof->AddInput(new TNamed("PROOF_OUTPUTFILE",outputFile.IsNull() ? "AliESDs.root" : outputFile.Data()));
4214 TString outputLocation(outputUrl.GetUrl());
4215 outputLocation.ReplaceAll(outputFile.Data(),"");
4216 gProof->AddInput(new TNamed("PROOF_OUTPUTFILE_LOCATION",outputLocation.Data()));
4217 AliInfo(Form("%s will be stored in %s",
4218 outputFile.IsNull() ? "AliESDs.root" : outputFile.Data(),
4219 outputLocation.Data()));
4226 //______________________________________________________________________________
4227 Bool_t AliReconstruction::IsHighPt() const {
4228 // Selection of events containing "high" pT tracks
4229 // If at least one track is found within 1.5 and 100 GeV (pT)
4230 // that was reconstructed by both ITS and TPC, the event is accepted
4233 const Double_t pTmin = 1.5;
4234 const Double_t pTmax = 100;
4236 mask |= (AliESDtrack::kITSrefit);
4237 mask |= (AliESDtrack::kTPCrefit);
4238 const Double_t pTminCosmic = 5.;
4239 const Double_t pTmaxCosmic = 100;
4240 ULong_t maskCosmic = 0;
4241 Int_t cosmicCount=0;
4242 maskCosmic |= (AliESDtrack::kTPCrefit);
4244 Bool_t isOK = kFALSE;
4246 if (fesd && fesd->GetEventType()==AliRawEventHeaderBase::kPhysicsEvent) {
4247 // Check if this ia a physics event (code 7)
4248 Int_t ntrk = fesd->GetNumberOfTracks();
4249 for (Int_t itrk=0; itrk<ntrk; ++itrk) {
4251 AliESDtrack * trk = fesd->GetTrack(itrk);
4253 && trk->Pt() > pTmin
4254 && trk->Pt() < pTmax
4255 && (trk->GetStatus() & mask) == mask ) {
4261 && trk->GetInnerParam()
4262 && trk->GetInnerParam()->Pt() > pTminCosmic
4263 && trk->GetInnerParam()->Pt() < pTmaxCosmic
4264 && (trk->GetStatus() & maskCosmic) == maskCosmic ) {
4270 if (cosmicCount>1) isOK=kTRUE;
4275 //______________________________________________________________________________
4276 Bool_t AliReconstruction::IsCosmicOrCalibSpecie() const {
4277 // Select cosmic or calibration events
4279 Bool_t isOK = kFALSE;
4281 if (fesd && fesd->GetEventType()==AliRawEventHeaderBase::kPhysicsEvent) {
4282 // Check if this ia a physics event (code 7)
4284 UInt_t specie = fesd->GetEventSpecie();
4285 if (specie==AliRecoParam::kCosmic || specie==AliRecoParam::kCalib) {
4292 //______________________________________________________________________________
4293 void AliReconstruction::WriteESDfriend() {
4294 // Fill the ESD friend in the tree. The required fraction of ESD friends is stored
4295 // in fFractionFriends. We select events where we store the ESD friends according
4296 // to the following algorithm:
4297 // 1. Store all Cosmic or Calibration events within the required fraction
4298 // 2. Sample "high Pt" events within the remaining fraction after step 1.
4299 // 3. Sample randomly events if we still have remaining slot
4302 Bool_t isSelected = kFALSE;
4304 // Store all friends for B field OFF
4305 if (TMath::Abs(AliTrackerBase::GetBz())<0.5) isSelected=kTRUE;
4307 if (IsCosmicOrCalibSpecie()) { // Selection of calib or cosmic events
4314 Double_t remainingFraction = fFractionFriends;
4315 remainingFraction -= ((Double_t)(fSspecie)/(Double_t)(fNall));
4317 if (IsHighPt()) { // Selection of "high Pt" events
4319 Double_t curentHighPtFraction = ((Double_t)(fNhighPt+1))/((Double_t)(fNall+1));
4320 // "Bayesian" estimate supposing that without events all the events are of the required type
4323 Double_t rnd = gRandom->Rndm()*curentHighPtFraction;
4324 if (rnd<remainingFraction) {
4330 remainingFraction -= ((Double_t)(fShighPt)/(Double_t)(fNall));
4332 // Random selection to fill the remaining fraction (if any)
4334 Double_t rnd = gRandom->Rndm();
4335 if (rnd<remainingFraction) {
4341 fesdf->~AliESDfriend();
4342 new (fesdf) AliESDfriend(); // Reset...
4343 fesdf->SetSkipBit(kTRUE);
4349 //_________________________________________________________________
4350 void AliReconstruction::DeleteDigits(const TString& detectors)
4352 // delete requested digit files produced at current event
4353 static int iEvent = 0;
4354 if (detectors.IsNull()) return;
4355 TString detStr = detectors;
4356 AliInfo(Form("Deleting Digits: %s",detectors.Data()));
4358 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
4359 if(!IsSelected(fgkDetectorName[iDet], detStr)) continue;
4360 unlink(Form("%s.Digits.root",fgkDetectorName[iDet]));
4362 AliSysInfo::AddStamp(Form("DelDigits_%d",iEvent), 0,0,iEvent);
4366 //_________________________________________________________________
4367 void AliReconstruction::DeleteRecPoints(const TString& detectors)
4369 // delete requested recpoint files produced at current event
4370 static int iEvent = 0;
4371 if (detectors.IsNull()) return;
4372 TString detStr = detectors;
4373 AliInfo(Form("Deleting Recpoints: %s",detectors.Data()));
4375 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
4376 if(!IsSelected(fgkDetectorName[iDet], detStr)) continue;
4377 unlink(Form("%s.RecPoints.root",fgkDetectorName[iDet]));
4379 AliSysInfo::AddStamp(Form("DelRecPoints_%d",iEvent), 0,0,iEvent);
4383 //_________________________________________________________________
4384 void AliReconstruction::SetStopOnResourcesExcess(Int_t vRSS,Int_t vVMEM)
4386 // require checking the resources left and stopping on excess
4387 // if 0 : no check is done
4388 // if >0 : stop reconstruction if exceeds this value
4389 // if <0 : use as margin to system limits
4391 const int kKB2MB = 1024;
4392 const int kInfMem = 9999999;
4395 int pgSize = getpagesize();
4399 AliInfo(Form("Setting max. RSS usage to user value %d MB",fMaxRSS));
4402 getrlimit(RLIMIT_RSS,&r);
4403 fMaxRSS = r.rlim_max==RLIM_INFINITY ? kInfMem : int(r.rlim_max*pgSize/kKB2MB/kKB2MB) + vRSS;
4404 AliInfo(Form("Setting max. RSS usage to system hard limit %d%s MB (%d margin)",fMaxRSS,r.rlim_max==RLIM_INFINITY ? "(inf)":"",-vRSS));
4406 else {AliInfo("No check on RSS memory usage will be applied");}
4410 AliInfo(Form("Setting max. VMEM usage to user value %d MB",fMaxVMEM));
4413 getrlimit(RLIMIT_AS,&r);
4414 fMaxVMEM = r.rlim_max==RLIM_INFINITY ? kInfMem : int(r.rlim_max*pgSize/kKB2MB/kKB2MB) + vVMEM;
4415 AliInfo(Form("Setting max. VMEM usage to system hard limit %d%s MB (%d margin)",fMaxVMEM,r.rlim_max==RLIM_INFINITY ? "(inf)":"",-vVMEM));
4417 else {AliInfo("No check on RSS memory usage will be applied");}
4421 //_________________________________________________________________
4422 Bool_t AliReconstruction::HasEnoughResources(int ev)
4424 // check if process consumed more than allowed resources
4425 const int kKB2MB = 1024;
4427 if (!fMaxRSS && !fMaxVMEM) return res;
4429 ProcInfo_t procInfo;
4430 gSystem->GetProcInfo(&procInfo);
4431 if (procInfo.fMemResident/kKB2MB > fMaxRSS) res = kFALSE;
4432 if (procInfo.fMemVirtual/kKB2MB > fMaxVMEM) res = kFALSE;
4435 AliInfo(Form("Job exceeded allowed limits: RSS:%d (%d) VMEM:%d (%d), will stop",
4436 int(procInfo.fMemResident/kKB2MB),fMaxRSS,
4437 int(procInfo.fMemVirtual/kKB2MB) ,fMaxVMEM));
4439 unlink(Form("%s",fgkStopEvFName));
4440 ofstream outfile(fgkStopEvFName);
4441 outfile << ev << std::endl;