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>
135 #include "AliAlignObj.h"
136 #include "AliAnalysisManager.h"
137 #include "AliAnalysisDataContainer.h"
138 #include "AliCDBEntry.h"
139 #include "AliCDBManager.h"
140 #include "AliCDBStorage.h"
141 #include "AliCTPRawStream.h"
142 #include "AliCascadeVertexer.h"
143 #include "AliCentralTrigger.h"
144 #include "AliCodeTimer.h"
146 #include "AliDetectorRecoParam.h"
147 #include "AliESDCaloCells.h"
148 #include "AliESDCaloCluster.h"
149 #include "AliESDEvent.h"
150 #include "AliESDMuonTrack.h"
151 #include "AliESDPmdTrack.h"
152 #include "AliESDTagCreator.h"
153 #include "AliESDVertex.h"
154 #include "AliESDcascade.h"
155 #include "AliESDfriend.h"
156 #include "AliESDkink.h"
157 #include "AliESDpid.h"
158 #include "AliESDtrack.h"
159 #include "AliESDtrack.h"
160 #include "AliEventInfo.h"
161 #include "AliGRPObject.h"
162 #include "AliGRPRecoParam.h"
163 #include "AliGenEventHeader.h"
164 #include "AliGeomManager.h"
165 #include "AliGlobalQADataMaker.h"
166 #include "AliHeader.h"
169 #include "AliMultiplicity.h"
171 #include "AliPlaneEff.h"
173 #include "AliQADataMakerRec.h"
174 #include "AliQAManager.h"
175 #include "AliRawVEvent.h"
176 #include "AliRawEventHeaderBase.h"
177 #include "AliRawHLTManager.h"
178 #include "AliRawReaderDate.h"
179 #include "AliRawReaderFile.h"
180 #include "AliRawReaderRoot.h"
181 #include "AliRecoInputHandler.h"
182 #include "AliReconstruction.h"
183 #include "AliReconstructor.h"
185 #include "AliRunInfo.h"
186 #include "AliRunLoader.h"
187 #include "AliSysInfo.h" // memory snapshots
188 #include "AliTrackPointArray.h"
189 #include "AliTracker.h"
190 #include "AliTriggerClass.h"
191 #include "AliTriggerCluster.h"
192 #include "AliTriggerIR.h"
193 #include "AliTriggerConfiguration.h"
194 #include "AliV0vertexer.h"
195 #include "AliVertexer.h"
196 #include "AliTrackleter.h"
197 #include "AliVertexerTracks.h"
198 #include "AliTriggerRunScalers.h"
199 #include "AliCTPTimeParams.h"
200 #include "AliESDHLTDecision.h"
201 #include "AliTriggerInput.h"
202 #include "AliLHCData.h"
203 #include "ARVersion.h"
204 #include <RVersion.h>
206 #include <sys/resource.h>
207 ClassImp(AliReconstruction)
209 //_____________________________________________________________________________
210 const char* AliReconstruction::fgkStopEvFName = "_stopEvent_";
211 const char* AliReconstruction::fgkDetectorName[AliReconstruction::kNDetectors] = {"ITS", "TPC", "TRD", "TOF", "PHOS", "HMPID", "EMCAL", "MUON", "FMD", "ZDC", "PMD", "T0", "VZERO", "ACORDE"
212 // #ifdef MFT_UPGRADE
219 //_____________________________________________________________________________
220 AliReconstruction::AliReconstruction(const char* gAliceFilename) :
222 fRunVertexFinder(kTRUE),
223 fRunVertexFinderTracks(kTRUE),
224 fRunHLTTracking(kFALSE),
225 fRunMuonTracking(kFALSE),
227 fRunCascadeFinder(kTRUE),
228 fRunMultFinder(kTRUE),
230 fWriteAlignmentData(kFALSE),
231 fWriteESDfriend(kFALSE),
232 fFillTriggerESD(kTRUE),
240 fRunLocalReconstruction("ALL"),
243 fDeleteRecPoints(""),
246 fUseTrackingErrorsForAlignment(""),
247 fGAliceFileName(gAliceFilename),
250 fProofOutputFileName(""),
251 fProofOutputLocation(""),
252 fProofOutputDataset(kFALSE),
253 fProofOutputArchive(""),
257 fNumberOfEventsPerFile((UInt_t)-1),
258 fFractionFriends(0.04),
260 fLoadAlignFromCDB(kTRUE),
261 fLoadAlignData("ALL"),
266 fCTPTimeParams(NULL),
271 fParentRawReader(NULL),
275 fSPDTrackleter(NULL),
277 fDiamondProfileSPD(NULL),
278 fDiamondProfile(NULL),
279 fDiamondProfileTPC(NULL),
280 fListOfCosmicTriggers(NULL),
284 fAlignObjArray(NULL),
288 fInitCDBCalled(kFALSE),
289 fFromCDBSnapshot(kFALSE),
290 fSnapshotFileName(""),
291 fSetRunNumberFromDataCalled(kFALSE),
296 fSameQACycle(kFALSE),
297 fInitQACalled(kFALSE),
298 fWriteQAExpertData(kTRUE),
299 fRunPlaneEff(kFALSE),
310 fIsNewRunLoader(kFALSE),
322 fDeclTriggerClasses(""),
327 // create reconstruction object with default parameters
330 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
331 fReconstructor[iDet] = NULL;
332 fUpgradeMask[iDet]=kFALSE;
333 fLoader[iDet] = NULL;
334 fTracker[iDet] = NULL;
336 for (Int_t iDet = 0; iDet < AliQAv1::kNDET; iDet++) {
337 fQACycles[iDet] = 999999 ;
338 fQAWriteExpert[iDet] = kFALSE ;
340 fBeamInt[0][0]=fBeamInt[0][1]=fBeamInt[1][0]=fBeamInt[1][1] = -1;
345 //_____________________________________________________________________________
346 AliReconstruction::AliReconstruction(const AliReconstruction& rec) :
348 fRunVertexFinder(rec.fRunVertexFinder),
349 fRunVertexFinderTracks(rec.fRunVertexFinderTracks),
350 fRunHLTTracking(rec.fRunHLTTracking),
351 fRunMuonTracking(rec.fRunMuonTracking),
352 fRunV0Finder(rec.fRunV0Finder),
353 fRunCascadeFinder(rec.fRunCascadeFinder),
354 fRunMultFinder(rec.fRunMultFinder),
355 fStopOnError(rec.fStopOnError),
356 fWriteAlignmentData(rec.fWriteAlignmentData),
357 fWriteESDfriend(rec.fWriteESDfriend),
358 fFillTriggerESD(rec.fFillTriggerESD),
360 fCleanESD(rec.fCleanESD),
361 fV0DCAmax(rec.fV0DCAmax),
362 fV0CsPmin(rec.fV0CsPmin),
366 fRunLocalReconstruction(rec.fRunLocalReconstruction),
367 fRunTracking(rec.fRunTracking),
368 fFillESD(rec.fFillESD),
369 fDeleteRecPoints(""),
371 fLoadCDB(rec.fLoadCDB),
372 fUseTrackingErrorsForAlignment(rec.fUseTrackingErrorsForAlignment),
373 fGAliceFileName(rec.fGAliceFileName),
374 fRawInput(rec.fRawInput),
375 fESDOutput(rec.fESDOutput),
376 fProofOutputFileName(rec.fProofOutputFileName),
377 fProofOutputLocation(rec.fProofOutputLocation),
378 fProofOutputDataset(rec.fProofOutputDataset),
379 fProofOutputArchive(rec.fProofOutputArchive),
380 fEquipIdMap(rec.fEquipIdMap),
381 fFirstEvent(rec.fFirstEvent),
382 fLastEvent(rec.fLastEvent),
383 fNumberOfEventsPerFile(rec.fNumberOfEventsPerFile),
384 fFractionFriends(rec.fFractionFriends),
386 fLoadAlignFromCDB(rec.fLoadAlignFromCDB),
387 fLoadAlignData(rec.fLoadAlignData),
388 fUseHLTData(rec.fUseHLTData),
392 fCTPTimeParams(NULL),
397 fParentRawReader(NULL),
399 fRecoParam(rec.fRecoParam),
401 fSPDTrackleter(NULL),
403 fDiamondProfileSPD(rec.fDiamondProfileSPD),
404 fDiamondProfile(rec.fDiamondProfile),
405 fDiamondProfileTPC(rec.fDiamondProfileTPC),
406 fListOfCosmicTriggers(NULL),
410 fAlignObjArray(rec.fAlignObjArray),
411 fCDBUri(rec.fCDBUri),
412 fQARefUri(rec.fQARefUri),
414 fInitCDBCalled(rec.fInitCDBCalled),
415 fFromCDBSnapshot(rec.fFromCDBSnapshot),
416 fSnapshotFileName(rec.fSnapshotFileName),
417 fSetRunNumberFromDataCalled(rec.fSetRunNumberFromDataCalled),
418 fQADetectors(rec.fQADetectors),
419 fQATasks(rec.fQATasks),
421 fRunGlobalQA(rec.fRunGlobalQA),
422 fSameQACycle(rec.fSameQACycle),
423 fInitQACalled(rec.fInitQACalled),
424 fWriteQAExpertData(rec.fWriteQAExpertData),
425 fRunPlaneEff(rec.fRunPlaneEff),
436 fIsNewRunLoader(rec.fIsNewRunLoader),
445 fAnalysisMacro(rec.fAnalysisMacro),
448 fDeclTriggerClasses(rec.fDeclTriggerClasses),
455 for (Int_t i = 0; i < rec.fOptions.GetEntriesFast(); i++) {
456 if (rec.fOptions[i]) fOptions.Add(rec.fOptions[i]->Clone());
458 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
459 fReconstructor[iDet] = NULL;
460 fUpgradeMask[iDet] = kFALSE;
461 fLoader[iDet] = NULL;
462 fTracker[iDet] = NULL;
465 for (Int_t iDet = 0; iDet < AliQAv1::kNDET; iDet++) {
466 fQACycles[iDet] = rec.fQACycles[iDet];
467 fQAWriteExpert[iDet] = rec.fQAWriteExpert[iDet] ;
470 for (Int_t i = 0; i < rec.fSpecCDBUri.GetEntriesFast(); i++) {
471 if (rec.fSpecCDBUri[i]) fSpecCDBUri.Add(rec.fSpecCDBUri[i]->Clone());
474 for (int i=2;i--;) for (int j=2;j--;) fBeamInt[i][j] = rec.fBeamInt[i][j];
478 //_____________________________________________________________________________
479 AliReconstruction& AliReconstruction::operator = (const AliReconstruction& rec)
481 // assignment operator
482 // Used in PROOF mode
483 // Be very careful while modifing it!
484 // Simple rules to follow:
485 // for persistent data members - use their assignment operators
486 // for non-persistent ones - do nothing or take the default values from constructor
487 // TSelector members should not be touched
488 if(&rec == this) return *this;
490 fRunVertexFinder = rec.fRunVertexFinder;
491 fRunVertexFinderTracks = rec.fRunVertexFinderTracks;
492 fRunHLTTracking = rec.fRunHLTTracking;
493 fRunMuonTracking = rec.fRunMuonTracking;
494 fRunV0Finder = rec.fRunV0Finder;
495 fRunCascadeFinder = rec.fRunCascadeFinder;
496 fRunMultFinder = rec.fRunMultFinder;
497 fStopOnError = rec.fStopOnError;
498 fWriteAlignmentData = rec.fWriteAlignmentData;
499 fWriteESDfriend = rec.fWriteESDfriend;
500 fFillTriggerESD = rec.fFillTriggerESD;
502 fCleanESD = rec.fCleanESD;
503 fV0DCAmax = rec.fV0DCAmax;
504 fV0CsPmin = rec.fV0CsPmin;
508 fRunLocalReconstruction = rec.fRunLocalReconstruction;
509 fRunTracking = rec.fRunTracking;
510 fFillESD = rec.fFillESD;
511 fDeleteRecPoints = rec.fDeleteRecPoints;
512 fDeleteDigits = rec.fDeleteDigits;
513 fLoadCDB = rec.fLoadCDB;
514 fUseTrackingErrorsForAlignment = rec.fUseTrackingErrorsForAlignment;
515 fGAliceFileName = rec.fGAliceFileName;
516 fRawInput = rec.fRawInput;
517 fESDOutput = rec.fESDOutput;
518 fProofOutputFileName = rec.fProofOutputFileName;
519 fProofOutputLocation = rec.fProofOutputLocation;
520 fProofOutputDataset = rec.fProofOutputDataset;
521 fProofOutputArchive = rec.fProofOutputArchive;
522 fEquipIdMap = rec.fEquipIdMap;
523 fFirstEvent = rec.fFirstEvent;
524 fLastEvent = rec.fLastEvent;
525 fNumberOfEventsPerFile = rec.fNumberOfEventsPerFile;
526 fFractionFriends = rec.fFractionFriends;
528 for (Int_t i = 0; i < rec.fOptions.GetEntriesFast(); i++) {
529 if (rec.fOptions[i]) fOptions.Add(rec.fOptions[i]->Clone());
532 fLoadAlignFromCDB = rec.fLoadAlignFromCDB;
533 fLoadAlignData = rec.fLoadAlignData;
534 fUseHLTData = rec.fUseHLTData;
536 delete fRunInfo; fRunInfo = NULL;
537 if (rec.fRunInfo) fRunInfo = new AliRunInfo(*rec.fRunInfo);
539 fEventInfo = rec.fEventInfo;
541 delete fRunScalers; fRunScalers = NULL;
542 if (rec.fRunScalers) fRunScalers = new AliTriggerRunScalers(*rec.fRunScalers);
544 delete fCTPTimeParams; fCTPTimeParams = NULL;
545 if (rec.fCTPTimeParams) fCTPTimeParams = new AliCTPTimeParams(*rec.fCTPTimeParams);
546 delete fCTPTimeAlign; fCTPTimeAlign = NULL;
547 if (rec.fCTPTimeAlign) fCTPTimeAlign = new AliCTPTimeParams(*rec.fCTPTimeAlign);
551 fParentRawReader = NULL;
553 fRecoParam = rec.fRecoParam;
555 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
556 fUpgradeMask[iDet] = kFALSE;
557 delete fReconstructor[iDet]; fReconstructor[iDet] = NULL;
558 delete fLoader[iDet]; fLoader[iDet] = NULL;
559 delete fTracker[iDet]; fTracker[iDet] = NULL;
562 for (Int_t iDet = 0; iDet < AliQAv1::kNDET; iDet++) {
563 fQACycles[iDet] = rec.fQACycles[iDet];
564 fQAWriteExpert[iDet] = rec.fQAWriteExpert[iDet] ;
567 delete fSPDTrackleter; fSPDTrackleter = NULL;
569 delete fDiamondProfileSPD; fDiamondProfileSPD = NULL;
570 if (rec.fDiamondProfileSPD) fDiamondProfileSPD = new AliESDVertex(*rec.fDiamondProfileSPD);
571 delete fDiamondProfile; fDiamondProfile = NULL;
572 if (rec.fDiamondProfile) fDiamondProfile = new AliESDVertex(*rec.fDiamondProfile);
573 delete fDiamondProfileTPC; fDiamondProfileTPC = NULL;
574 if (rec.fDiamondProfileTPC) fDiamondProfileTPC = new AliESDVertex(*rec.fDiamondProfileTPC);
576 delete fListOfCosmicTriggers; fListOfCosmicTriggers = NULL;
577 if (rec.fListOfCosmicTriggers) fListOfCosmicTriggers = (THashTable*)((rec.fListOfCosmicTriggers)->Clone());
579 delete fGRPData; fGRPData = NULL;
580 // if (rec.fGRPData) fGRPData = (TMap*)((rec.fGRPData)->Clone());
581 if (rec.fGRPData) fGRPData = (AliGRPObject*)((rec.fGRPData)->Clone());
583 delete fAlignObjArray; fAlignObjArray = NULL;
586 fQARefUri = rec.fQARefUri;
587 fSpecCDBUri.Delete();
588 fInitCDBCalled = rec.fInitCDBCalled;
589 fFromCDBSnapshot = rec.fFromCDBSnapshot;
590 fSnapshotFileName = rec.fSnapshotFileName;
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 if (fWriteQAExpertData)
665 qam->SetWriteExpert() ;
667 if (qam->IsDefaultStorageSet()) {
668 AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
669 AliWarning("Default QA reference storage has been already set !");
670 AliWarning(Form("Ignoring the default storage declared in AliReconstruction: %s",fQARefUri.Data()));
671 AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
672 fQARefUri = qam->GetDefaultStorage()->GetURI();
674 if (fQARefUri.Length() > 0) {
675 AliDebug(2,"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
676 AliDebug(2, Form("Default QA reference storage is set to: %s", fQARefUri.Data()));
677 AliDebug(2, "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
679 fQARefUri="local://$ALICE_ROOT/QAref";
680 AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
681 AliWarning("Default QA refeference storage not yet set !!!!");
682 AliWarning(Form("Setting it now to: %s", fQARefUri.Data()));
683 AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
686 qam->SetDefaultStorage(fQARefUri);
690 qam->SetActiveDetectors(fQADetectors) ;
691 for (Int_t det = 0 ; det < AliQAv1::kNDET ; det++) {
692 qam->SetCycleLength(AliQAv1::DETECTORINDEX_t(det), fQACycles[det]) ;
693 qam->SetWriteExpert(AliQAv1::DETECTORINDEX_t(det)) ;
695 if (!fRawReader && !fInput && IsInTasks(AliQAv1::kRAWS))
696 fQATasks.ReplaceAll(Form("%d",AliQAv1::kRAWS), "") ;
697 qam->SetTasks(fQATasks) ;
698 qam->InitQADataMaker(AliCDBManager::Instance()->GetRun()) ;
701 Bool_t sameCycle = kFALSE ;
702 AliQADataMaker *qadm = qam->GetQADataMaker(AliQAv1::kGLOBAL);
703 AliInfo(Form("Initializing the global QA data maker"));
704 if (IsInTasks(AliQAv1::kRECPOINTS)) {
705 qadm->StartOfCycle(AliQAv1::kRECPOINTS, AliCDBManager::Instance()->GetRun(), sameCycle) ;
706 TObjArray **arr=qadm->Init(AliQAv1::kRECPOINTS);
707 AliTracker::SetResidualsArray(arr);
710 if (IsInTasks(AliQAv1::kESDS)) {
711 qadm->StartOfCycle(AliQAv1::kESDS, AliCDBManager::Instance()->GetRun(), sameCycle) ;
712 qadm->Init(AliQAv1::kESDS);
715 AliSysInfo::AddStamp("InitQA") ;
718 //_____________________________________________________________________________
719 void AliReconstruction::MergeQA(const char *fileName)
721 //Initialize the QA and start of cycle
722 AliCodeTimerAuto("",0) ;
723 AliQAManager::QAManager()->Merge(AliCDBManager::Instance()->GetRun(),fileName) ;
724 AliSysInfo::AddStamp("MergeQA") ;
727 //_____________________________________________________________________________
728 void AliReconstruction::InitCDB()
730 // activate a default CDB storage
731 // First check if we have any CDB storage set, because it is used
732 // to retrieve the calibration and alignment constants
733 AliCodeTimerAuto("",0);
735 if (fInitCDBCalled) return;
736 fInitCDBCalled = kTRUE;
738 AliCDBManager* man = AliCDBManager::Instance();
739 if (man->IsDefaultStorageSet())
741 AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
742 AliWarning("Default CDB storage has been already set !");
743 AliWarning(Form("Ignoring the default storage declared in AliReconstruction: %s",fCDBUri.Data()));
744 AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
745 fCDBUri = man->GetDefaultStorage()->GetURI();
748 if (fCDBUri.Length() > 0)
750 AliDebug(2,"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
751 AliDebug(2, Form("Default CDB storage is set to: %s", fCDBUri.Data()));
752 AliDebug(2, "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
753 man->SetDefaultStorage(fCDBUri);
755 else if (!man->GetRaw()){
756 fCDBUri="local://$ALICE_ROOT/OCDB";
757 AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
758 AliWarning("Default CDB storage not yet set !!!!");
759 AliWarning(Form("Setting it now to: %s", fCDBUri.Data()));
760 AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
761 man->SetDefaultStorage(fCDBUri);
764 AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
765 AliWarning("Default storage will be set after setting the Run Number!!!");
766 AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
770 // Now activate the detector specific CDB storage locations
771 for (Int_t i = 0; i < fSpecCDBUri.GetEntriesFast(); i++) {
772 TObject* obj = fSpecCDBUri[i];
774 AliDebug(2, "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
775 AliDebug(2, Form("Specific CDB storage for %s is set to: %s",obj->GetName(),obj->GetTitle()));
776 AliDebug(2, "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
777 man->SetSpecificStorage(obj->GetName(), obj->GetTitle());
779 AliSysInfo::AddStamp("InitCDB");
782 //_____________________________________________________________________________
783 void AliReconstruction::SetCDBSnapshotMode(const char* snapshotFileName) {
784 AliCDBManager::Instance()->SetSnapshotMode(snapshotFileName);
787 //_____________________________________________________________________________
788 void AliReconstruction::SetDefaultStorage(const char* uri) {
789 // Store the desired default CDB storage location
790 // Activate it later within the Run() method
796 //_____________________________________________________________________________
797 void AliReconstruction::SetQARefDefaultStorage(const char* uri) {
798 // Store the desired default CDB storage location
799 // Activate it later within the Run() method
802 AliQAv1::SetQARefStorage(fQARefUri.Data()) ;
805 //_____________________________________________________________________________
806 void AliReconstruction::SetSpecificStorage(const char* calibType, const char* uri) {
807 // Store a detector-specific CDB storage location
808 // Activate it later within the Run() method
810 AliCDBPath aPath(calibType);
811 if(!aPath.IsValid()){
812 // if calibType is not wildcard but it is a valid detector, add "/*" to make it a valid path
813 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
814 if(!strcmp(calibType, fgkDetectorName[iDet])) {
815 aPath.SetPath(Form("%s/*", calibType));
816 AliInfo(Form("Path for specific storage set to %s", aPath.GetPath().Data()));
820 if(!aPath.IsValid()){
821 AliError(Form("Not a valid path or detector: %s", calibType));
826 // // check that calibType refers to a "valid" detector name
827 // Bool_t isDetector = kFALSE;
828 // for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
829 // TString detName = fgkDetectorName[iDet];
830 // if(aPath.GetLevel0() == detName) {
831 // isDetector = kTRUE;
837 // AliError(Form("Not a valid detector: %s", aPath.GetLevel0().Data()));
841 TObject* obj = fSpecCDBUri.FindObject(aPath.GetPath().Data());
842 if (obj) fSpecCDBUri.Remove(obj);
843 fSpecCDBUri.Add(new TNamed(aPath.GetPath().Data(), uri));
847 //_____________________________________________________________________________
848 Bool_t AliReconstruction::SetRunNumberFromData()
850 // The method is called in Run() in order
851 // to set a correct run number.
852 // In case of raw data reconstruction the
853 // run number is taken from the raw data header
855 if (fSetRunNumberFromDataCalled) return kTRUE;
856 fSetRunNumberFromDataCalled = kTRUE;
858 AliCDBManager* man = AliCDBManager::Instance();
861 if(fRawReader->NextEvent()) {
862 if(man->GetRun() > 0) {
863 AliWarning("Run number is taken from raw-event header! Ignoring settings in AliCDBManager!");
865 man->SetRun(fRawReader->GetRunNumber());
866 fRawReader->RewindEvents();
869 if(man->GetRun() > 0) {
870 AliWarning("No raw-data events are found ! Using settings in AliCDBManager !");
873 AliWarning("Neither raw events nor settings in AliCDBManager are found !");
879 AliRunLoader *rl = AliRunLoader::Open(fGAliceFileName.Data());
881 AliError(Form("No run loader found in file %s", fGAliceFileName.Data()));
886 // read run number from gAlice
887 if(rl->GetHeader()) {
888 man->SetRun(rl->GetHeader()->GetRun());
893 AliError("Neither run-loader header nor RawReader objects are found !");
905 //_____________________________________________________________________________
906 void AliReconstruction::SetCDBLock() {
907 // Set CDB lock: from now on it is forbidden to reset the run number
908 // or the default storage or to activate any further storage!
910 AliCDBManager::Instance()->SetLock(1);
913 //_____________________________________________________________________________
914 void AliReconstruction::MatchUpgradeDetector() {
915 // Translates detector name in a boolean.
916 // The boolean is used in GetReconstructor to load the
917 // upgrade reconstructor instead of the standard one.
918 for(Int_t iDet = 0; iDet < kNDetectors; iDet++) {
919 if(fUpgradeModule.Contains(fgkDetectorName[iDet])) fUpgradeMask[iDet]=kTRUE;
922 //_____________________________________________________________________________
923 Bool_t AliReconstruction::MisalignGeometry(const TString& detectors)
925 // Read the alignment objects from CDB.
926 // Each detector is supposed to have the
927 // alignment objects in DET/Align/Data CDB path.
928 // All the detector objects are then collected,
929 // sorted by geometry level (starting from ALIC) and
930 // then applied to the TGeo geometry.
931 // Finally an overlaps check is performed.
933 // Load alignment data from CDB and fill fAlignObjArray
934 if(fLoadAlignFromCDB){
936 TString detStr = detectors;
937 TString loadAlObjsListOfDets = "";
939 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
940 if(!IsSelected(fgkDetectorName[iDet], detStr)) continue;
941 if(!strcmp(fgkDetectorName[iDet],"HLT")) continue;
943 if(AliGeomManager::GetNalignable(fgkDetectorName[iDet]) != 0)
945 loadAlObjsListOfDets += fgkDetectorName[iDet];
946 loadAlObjsListOfDets += " ";
948 } // end loop over detectors
950 if(AliGeomManager::GetNalignable("GRP") != 0)
951 loadAlObjsListOfDets.Prepend("GRP "); //add alignment objects for non-sensitive modules
952 AliGeomManager::ApplyAlignObjsFromCDB(loadAlObjsListOfDets.Data());
954 // Check if the array with alignment objects was
955 // provided by the user. If yes, apply the objects
956 // to the present TGeo geometry
957 if (fAlignObjArray) {
958 if (gGeoManager && gGeoManager->IsClosed()) {
959 if (AliGeomManager::ApplyAlignObjsToGeom(*fAlignObjArray) == kFALSE) {
960 AliError("The misalignment of one or more volumes failed!"
961 "Compare the list of simulated detectors and the list of detector alignment data!");
966 AliError("Can't apply the misalignment! gGeoManager doesn't exist or it is still opened!");
972 if (fAlignObjArray) {
973 fAlignObjArray->Delete();
974 delete fAlignObjArray; fAlignObjArray=NULL;
980 //_____________________________________________________________________________
981 void AliReconstruction::SetGAliceFile(const char* fileName)
983 // set the name of the galice file
985 fGAliceFileName = fileName;
988 //_____________________________________________________________________________
989 void AliReconstruction::SetInput(const char* input)
991 // In case the input string starts with 'mem://', we run in an online mode
992 // and AliRawReaderDateOnline object is created. In all other cases a raw-data
993 // file is assumed. One can give as an input:
994 // mem://: - events taken from DAQ monitoring libs online
996 // mem://<filename> - emulation of the above mode (via DATE monitoring libs)
997 if (input) fRawInput = input;
1000 //_____________________________________________________________________________
1001 void AliReconstruction::SetOutput(const char* output)
1003 // Set the output ESD filename
1004 // 'output' is a normalt ROOT url
1005 // The method is used in case of raw-data reco with PROOF
1006 if (output) fESDOutput = output;
1009 //_____________________________________________________________________________
1010 void AliReconstruction::SetOption(const char* detector, const char* option)
1012 // set options for the reconstruction of a detector
1014 TObject* obj = fOptions.FindObject(detector);
1015 if (obj) fOptions.Remove(obj);
1016 fOptions.Add(new TNamed(detector, option));
1019 //_____________________________________________________________________________
1020 void AliReconstruction::SetRecoParam(const char* detector, AliDetectorRecoParam *par)
1022 // Set custom reconstruction parameters for a given detector
1023 // Single set of parameters for all the events
1025 // First check if the reco-params are global
1026 if(!strcmp(detector, "GRP")) {
1027 par->SetAsDefault();
1028 fRecoParam.AddDetRecoParam(kNDetectors,par);
1032 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
1033 if(!strcmp(detector, fgkDetectorName[iDet])) {
1034 par->SetAsDefault();
1035 fRecoParam.AddDetRecoParam(iDet,par);
1042 //_____________________________________________________________________________
1043 Bool_t AliReconstruction::InitGRP() {
1044 //------------------------------------
1045 // Initialization of the GRP entry
1046 //------------------------------------
1047 AliCDBEntry* entry = AliCDBManager::Instance()->Get("GRP/GRP/Data");
1051 TMap* m = dynamic_cast<TMap*>(entry->GetObject()); // old GRP entry
1054 AliInfo("Found a TMap in GRP/GRP/Data, converting it into an AliGRPObject");
1056 fGRPData = new AliGRPObject();
1057 fGRPData->ReadValuesFromMap(m);
1061 AliInfo("Found an AliGRPObject in GRP/GRP/Data, reading it");
1062 fGRPData = dynamic_cast<AliGRPObject*>(entry->GetObject()); // new GRP entry
1066 // FIX ME: The unloading of GRP entry is temporarily disabled
1067 // because ZDC and VZERO are using it in order to initialize
1068 // their reconstructor objects. In the future one has to think
1069 // of propagating AliRunInfo to the reconstructors.
1070 // AliCDBManager::Instance()->UnloadFromCache("GRP/GRP/Data");
1074 AliError("No GRP entry found in OCDB!");
1078 TString lhcState = fGRPData->GetLHCState();
1079 if (lhcState==AliGRPObject::GetInvalidString()) {
1080 AliError("GRP/GRP/Data entry: missing value for the LHC state ! Using UNKNOWN");
1081 lhcState = "UNKNOWN";
1084 TString beamType = fGRPData->GetBeamType();
1085 if (beamType==AliGRPObject::GetInvalidString()) {
1086 AliError("GRP/GRP/Data entry: missing value for the beam type ! Using UNKNOWN");
1087 beamType = "UNKNOWN";
1090 Float_t beamEnergy = fGRPData->GetBeamEnergy();
1091 if (beamEnergy==AliGRPObject::GetInvalidFloat()) {
1092 AliError("GRP/GRP/Data entry: missing value for the beam energy ! Using 0");
1096 TString runType = fGRPData->GetRunType();
1097 if (runType==AliGRPObject::GetInvalidString()) {
1098 AliError("GRP/GRP/Data entry: missing value for the run type ! Using UNKNOWN");
1099 runType = "UNKNOWN";
1102 Int_t activeDetectors = fGRPData->GetDetectorMask();
1103 if (activeDetectors==AliGRPObject::GetInvalidUInt()) {
1104 AliError("GRP/GRP/Data entry: missing value for the detector mask ! Using 1074790399");
1105 activeDetectors = 1074790399;
1107 AliDebug(1, Form("activeDetectors = %d", activeDetectors));
1109 fRunInfo = new AliRunInfo(lhcState, beamType, beamEnergy, runType, activeDetectors);
1113 // Process the list of active detectors
1114 if (activeDetectors) {
1115 UInt_t detMask = activeDetectors;
1116 AliDebug(1, Form("Detector List = %s", fRunLocalReconstruction.Data()));
1117 fRunLocalReconstruction = MatchDetectorList(fRunLocalReconstruction,detMask);
1118 AliDebug(1, Form("Detector List = %s", fRunLocalReconstruction.Data()));
1119 fRunTracking = MatchDetectorList(fRunTracking,detMask);
1120 fFillESD = MatchDetectorList(fFillESD,detMask);
1121 fQADetectors = MatchDetectorList(fQADetectors,detMask);
1122 fDeleteRecPoints = MatchDetectorList(fDeleteRecPoints,detMask);
1123 fDeleteDigits = MatchDetectorList(fDeleteDigits,detMask);
1124 fLoadCDB.Form("%s %s %s %s",
1125 fRunLocalReconstruction.Data(),
1126 fRunTracking.Data(),
1128 fQADetectors.Data());
1129 fLoadCDB = MatchDetectorList(fLoadCDB,detMask);
1130 if (!((detMask >> AliDAQ::DetectorID("ITSSPD")) & 0x1) &&
1131 !((detMask >> AliDAQ::DetectorID("ITSSDD")) & 0x1) &&
1132 !((detMask >> AliDAQ::DetectorID("ITSSSD")) & 0x1) ) {
1133 // switch off the vertexer
1134 AliInfo("SPD,SDD,SSD is not in the list of active detectors. Vertexer and Trackleter are switched off.");
1135 fRunVertexFinder = kFALSE;
1136 fRunMultFinder = kFALSE;
1138 if (!((detMask >> AliDAQ::DetectorID("TRG")) & 0x1)) {
1139 // switch off the reading of CTP raw-data payload
1140 if (fFillTriggerESD) {
1141 AliInfo("CTP is not in the list of active detectors. CTP data reading switched off.");
1142 fFillTriggerESD = kFALSE;
1147 AliInfo("===================================================================================");
1148 AliInfo(Form("Running local reconstruction for detectors: %s",fRunLocalReconstruction.Data()));
1149 AliInfo(Form("Running tracking for detectors: %s",fRunTracking.Data()));
1150 AliInfo(Form("Filling ESD for detectors: %s",fFillESD.Data()));
1151 AliInfo(Form("Quality assurance is active for detectors: %s",fQADetectors.Data()));
1152 AliInfo(Form("CDB and reconstruction parameters are loaded for detectors: %s",fLoadCDB.Data()));
1153 AliInfo("===================================================================================");
1155 //*** Dealing with the magnetic field map
1156 if ( TGeoGlobalMagField::Instance()->IsLocked() ) {
1157 if (TGeoGlobalMagField::Instance()->GetField()->TestBit(AliMagF::kOverrideGRP)) {
1158 AliInfo("ExpertMode!!! GRP information will be ignored !");
1159 AliInfo("ExpertMode!!! Running with the externally locked B field !");
1162 AliInfo("Destroying existing B field instance!");
1163 delete TGeoGlobalMagField::Instance();
1166 if ( !TGeoGlobalMagField::Instance()->IsLocked() ) {
1167 // Construct the field map out of the information retrieved from GRP.
1170 Float_t l3Current = fGRPData->GetL3Current((AliGRPObject::Stats)0);
1171 if (l3Current == AliGRPObject::GetInvalidFloat()) {
1172 AliError("GRP/GRP/Data entry: missing value for the L3 current !");
1176 Char_t l3Polarity = fGRPData->GetL3Polarity();
1177 if (l3Polarity == AliGRPObject::GetInvalidChar()) {
1178 AliError("GRP/GRP/Data entry: missing value for the L3 polarity !");
1183 Float_t diCurrent = fGRPData->GetDipoleCurrent((AliGRPObject::Stats)0);
1184 if (diCurrent == AliGRPObject::GetInvalidFloat()) {
1185 AliError("GRP/GRP/Data entry: missing value for the dipole current !");
1189 Char_t diPolarity = fGRPData->GetDipolePolarity();
1190 if (diPolarity == AliGRPObject::GetInvalidChar()) {
1191 AliError("GRP/GRP/Data entry: missing value for the dipole polarity !");
1195 // read special bits for the polarity convention and map type
1196 Int_t polConvention = fGRPData->IsPolarityConventionLHC() ? AliMagF::kConvLHC : AliMagF::kConvDCS2008;
1197 Bool_t uniformB = fGRPData->IsUniformBMap();
1200 AliMagF* fld = AliMagF::CreateFieldMap(TMath::Abs(l3Current) * (l3Polarity ? -1:1),
1201 TMath::Abs(diCurrent) * (diPolarity ? -1:1),
1202 polConvention,uniformB,beamEnergy, beamType.Data());
1204 TGeoGlobalMagField::Instance()->SetField( fld );
1205 TGeoGlobalMagField::Instance()->Lock();
1206 AliInfo("Running with the B field constructed out of GRP !");
1208 else AliFatal("Failed to create a B field map !");
1210 else AliFatal("B field is neither set nor constructed from GRP ! Exitig...");
1213 //*** Get the diamond profiles from OCDB
1214 entry = AliCDBManager::Instance()->Get("GRP/Calib/MeanVertexSPD");
1216 fDiamondProfileSPD = dynamic_cast<AliESDVertex*> (entry->GetObject());
1218 AliError("No SPD diamond profile found in OCDB!");
1221 entry = AliCDBManager::Instance()->Get("GRP/Calib/MeanVertex");
1223 fDiamondProfile = dynamic_cast<AliESDVertex*> (entry->GetObject());
1225 AliError("No diamond profile found in OCDB!");
1228 entry = AliCDBManager::Instance()->Get("GRP/Calib/MeanVertexTPC");
1230 fDiamondProfileTPC = dynamic_cast<AliESDVertex*> (entry->GetObject());
1232 AliError("No TPC diamond profile found in OCDB!");
1235 entry = AliCDBManager::Instance()->Get("GRP/Calib/CosmicTriggers");
1237 fListOfCosmicTriggers = dynamic_cast<THashTable*>(entry->GetObject());
1241 if (!fListOfCosmicTriggers) {
1242 AliWarning("Can not get list of cosmic triggers from OCDB! Cosmic event specie will be effectively disabled!");
1248 //_____________________________________________________________________________
1249 Bool_t AliReconstruction::LoadCDB()
1251 // Load CDB entries for all active detectors.
1252 // By default we load all the entries in <det>/Calib
1255 AliCodeTimerAuto("",0);
1257 AliCDBManager::Instance()->Get("GRP/CTP/Config");
1259 AliCDBManager::Instance()->Get("GRP/Calib/LHCClockPhase");
1261 TString detStr = fLoadCDB;
1262 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
1263 if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
1264 AliCDBManager::Instance()->GetAll(Form("%s/Calib/*",fgkDetectorName[iDet]));
1265 AliCDBManager::Instance()->GetAll(Form("%s/Trigger/*",fgkDetectorName[iDet]));
1268 // Temporary fix - one has to define the correct policy in order
1269 // to load the trigger OCDB entries only for the detectors that
1270 // in the trigger or that are needed in order to put correct
1271 // information in ESD
1272 AliCDBManager::Instance()->GetAll("TRIGGER/*/*");
1276 //_____________________________________________________________________________
1277 Bool_t AliReconstruction::LoadTriggerScalersCDB()
1279 // Load CTP scalers from OCDB.
1280 // The scalers are checked for consistency.
1282 AliCodeTimerAuto("",0);
1284 AliCDBEntry* entry = AliCDBManager::Instance()->Get("GRP/CTP/Scalers");
1288 AliInfo("Found an AliTriggerRunScalers in GRP/CTP/Scalers, reading it");
1289 fRunScalers = dynamic_cast<AliTriggerRunScalers*> (entry->GetObject());
1291 if (fRunScalers && (fRunScalers->CorrectScalersOverflow() == 0)) AliInfo("32bit Trigger counters corrected for overflow");
1296 //_____________________________________________________________________________
1297 Bool_t AliReconstruction::LoadCTPTimeParamsCDB()
1299 // Load CTP timing information (alignment)
1302 AliCDBEntry* entry = AliCDBManager::Instance()->Get("GRP/CTP/CTPtiming");
1303 if (!entry) return kFALSE;
1305 AliInfo("Found an AliCTPTimeParams in GRP/CTP/CTPtiming, reading it");
1306 fCTPTimeParams = dynamic_cast<AliCTPTimeParams*> (entry->GetObject());
1309 AliCDBEntry* entry2 = AliCDBManager::Instance()->Get("GRP/CTP/TimeAlign");
1310 if (!entry2) return kFALSE;
1312 AliInfo("Found an AliCTPTimeParams in GRP/CTP/TimeAlign, reading it");
1313 fCTPTimeAlign = dynamic_cast<AliCTPTimeParams*> (entry2->GetObject());
1314 entry2->SetOwner(0);
1319 //_____________________________________________________________________________
1320 Bool_t AliReconstruction::ReadIntensityInfoCDB()
1322 // Load LHC DIP data
1323 AliCDBEntry* entry = AliCDBManager::Instance()->Get("GRP/GRP/LHCData");
1324 AliCDBEntry* entryCTP = AliCDBManager::Instance()->Get("GRP/CTP/Config");
1326 if (!entry || !entryCTP) {
1327 AliError(Form("Failed to extract CDB objects GRP/GRP/LHCData: %p or GRP/CTP/Config: %p",entry,entryCTP));
1331 enum {kA,kB,kC,kE,kNMasks};
1332 AliTriggerConfiguration* conf = (AliTriggerConfiguration*)entryCTP->GetObject();
1333 const TObjArray& clArr = conf->GetClasses();
1334 TObjArray masks(kNMasks);
1336 AliTriggerClass* trClass = 0;
1338 masks.SetOwner(kFALSE);
1340 while ( (trClass=(AliTriggerClass*)next()) ) {
1341 TString trName = trClass->GetName();
1342 int ind = trName.Index("-"); // prefix in front of A,B,C,E
1343 if (ind<1) continue; // anomaly
1345 trName = trName.Data() + ind;
1346 AliTriggerBCMask* bcMask = trClass->GetBCMask();
1347 if (!bcMask) continue;
1349 if (trName.BeginsWith("-A-")) which |= 0x1<<kA;
1350 else if (trName.BeginsWith("-B-")) which |= 0x1<<kB;
1351 else if (trName.BeginsWith("-C-")) which |= 0x1<<kC;
1352 else if (trName.BeginsWith("-E-")) which |= 0x1<<kE;
1353 else if (trName.BeginsWith("-AC-")) which |= (0x1<<kA) | (0x1<<kC);
1354 else if (trName.BeginsWith("-CA-")) which |= (0x1<<kA) | (0x1<<kC);
1355 else { AliWarning(Form("Unknown trigger type %s\n",trClass->GetName())); continue;}
1357 for (int ip=kNMasks;ip--;) {
1358 if ( !(which&(0x1<<ip)) || masks[ip] ) continue; // does not match or already done
1359 masks[ip] = (TObject*)bcMask;
1362 if (nFound==kNMasks) break;
1365 AliInfo("Reading mean bunch intensities from GRP/GRP/LHCData");
1366 AliLHCData* dipData = dynamic_cast<AliLHCData*> (entry->GetObject());
1368 for (int ib=2;ib--;) {
1370 if (dipData && (dipData->GetMeanIntensity(ib,intI,intNI,&masks)>=0)) {
1371 fBeamInt[ib][0] = intI;
1372 fBeamInt[ib][1] = intNI;
1373 AliInfo(Form("Mean intensity for beam %d: Interacting:%.2e Non-Interacting:%.2e",ib,intI,intNI));
1381 //_____________________________________________________________________________
1382 Bool_t AliReconstruction::Run(const char* input)
1385 AliCodeTimerAuto("",0);
1388 if (GetAbort() != TSelector::kContinue) return kFALSE;
1390 TChain *chain = NULL;
1391 if (fRawReader && (chain = fRawReader->GetChain())) {
1392 Long64_t nEntries = (fLastEvent < 0) ? (TChain::kBigNumber) : (fLastEvent - fFirstEvent + 1);
1395 // Temporary fix for long raw-data runs (until socket timeout handling in PROOF is revised)
1396 gProof->Exec("gEnv->SetValue(\"Proof.SocketActivityTimeout\",-1)", kTRUE);
1399 gProof->Exec("TGrid::Connect(\"alien://\")",kTRUE);
1401 TMessage::EnableSchemaEvolutionForAll(kTRUE);
1402 gProof->Exec("TMessage::EnableSchemaEvolutionForAll(kTRUE)",kTRUE);
1404 gProof->AddInput(this);
1406 if (!ParseOutput()) return kFALSE;
1408 gProof->SetParameter("PROOF_MaxSlavesPerNode", 9999);
1410 chain->Process("AliReconstruction","",nEntries,fFirstEvent);
1413 chain->Process(this,"",nEntries,fFirstEvent);
1418 if (GetAbort() != TSelector::kContinue) return kFALSE;
1420 if (GetAbort() != TSelector::kContinue) return kFALSE;
1421 //******* The loop over events
1422 AliInfo("Starting looping over events");
1424 while ((iEvent < fRunLoader->GetNumberOfEvents()) ||
1425 (fRawReader && fRawReader->NextEvent())) {
1427 // check if process has enough resources
1428 if (!HasEnoughResources(iEvent)) break;
1429 if (!ProcessEvent(iEvent)) {
1430 Abort("ProcessEvent",TSelector::kAbortFile);
1436 if (GetAbort() != TSelector::kContinue) return kFALSE;
1438 if (GetAbort() != TSelector::kContinue) return kFALSE;
1444 //_____________________________________________________________________________
1445 void AliReconstruction::InitRawReader(const char* input)
1447 // Init raw-reader and
1448 // set the input in case of raw data
1450 AliCodeTimerAuto("",0);
1452 if (input) fRawInput = input;
1453 fRawReader = AliRawReader::Create(fRawInput.Data());
1455 if (fRawInput.IsNull()) {
1456 AliInfo("Reconstruction will run over digits");
1459 AliFatal("Can not create raw-data reader ! Exiting...");
1463 if (!fEquipIdMap.IsNull() && fRawReader)
1464 fRawReader->LoadEquipmentIdsMap(fEquipIdMap);
1466 if (!fUseHLTData.IsNull()) {
1467 // create the RawReaderHLT which performs redirection of HLT input data for
1468 // the specified detectors
1469 AliRawReader* pRawReader=AliRawHLTManager::CreateRawReaderHLT(fRawReader, fUseHLTData.Data());
1471 fParentRawReader=fRawReader;
1472 fRawReader=pRawReader;
1474 AliError(Form("can not create Raw Reader for HLT input %s", fUseHLTData.Data()));
1477 AliSysInfo::AddStamp("CreateRawReader");
1480 //_____________________________________________________________________________
1481 void AliReconstruction::InitRun(const char* input)
1483 // Initialization of raw-reader,
1484 // run number, CDB etc.
1485 AliCodeTimerAuto("",0);
1486 AliSysInfo::AddStamp("Start");
1488 // Initialize raw-reader if any
1489 InitRawReader(input);
1491 // Initialize the CDB storage
1494 // Set run number in CDBManager (if it is not already set by the user)
1495 if (!SetRunNumberFromData()) {
1496 Abort("SetRunNumberFromData", TSelector::kAbortProcess);
1500 if(fFromCDBSnapshot){
1501 AliDebug(2,"Initializing from a CDB snapshot");
1502 if(!AliCDBManager::Instance()->InitFromSnapshot(fSnapshotFileName.Data()))
1503 AliFatal("Was not able to initialize from the snapshot!");
1505 // Set CDB lock: from now on it is forbidden to reset the run number
1506 // or the default storage or to activate any further storage!
1511 //_____________________________________________________________________________
1512 void AliReconstruction::Begin(TTree *)
1514 // Initialize AlReconstruction before
1515 // going into the event loop
1516 // Should follow the TSelector convention
1517 // i.e. initialize only the object on the client side
1518 AliCodeTimerAuto("",0);
1520 AliReconstruction *reco = NULL;
1522 if ((reco = (AliReconstruction*)fInput->FindObject("AliReconstruction"))) {
1525 AliSysInfo::AddStamp("ReadInputInBegin");
1528 // Import ideal TGeo geometry and apply misalignment
1530 TString geom(gSystem->DirName(fGAliceFileName));
1531 geom += "/geometry.root";
1532 AliGeomManager::LoadGeometry(geom.Data());
1534 Abort("LoadGeometry", TSelector::kAbortProcess);
1537 AliSysInfo::AddStamp("LoadGeom");
1538 TString detsToCheck=fRunLocalReconstruction;
1539 if(!AliGeomManager::CheckSymNamesLUT(detsToCheck.Data())) {
1540 Abort("CheckSymNamesLUT", TSelector::kAbortProcess);
1543 AliSysInfo::AddStamp("CheckGeom");
1546 Bool_t toCDBSnapshot=kFALSE;
1547 TString snapshotFileOut(""); // we could use fSnapshotFileName if we are not interested
1548 // in reading from and writing to a snapshot file at the same time
1549 if(TString(gSystem->Getenv("OCDB_SNAPSHOT_CREATE")) == TString("kTRUE")){
1550 toCDBSnapshot=kTRUE;
1551 //fFromCDBSnapshot=kFALSE;
1552 TString snapshotFile(gSystem->Getenv("OCDB_SNAPSHOT_FILENAME"));
1553 if(!(snapshotFile.IsNull() || snapshotFile.IsWhitespace()))
1554 snapshotFileOut = snapshotFile;
1556 snapshotFileOut="OCDB.root";
1559 if (!MisalignGeometry(fLoadAlignData)) {
1560 Abort("MisalignGeometry", TSelector::kAbortProcess);
1563 AliCDBManager::Instance()->UnloadFromCache("GRP/Geometry/Data");
1564 if(!toCDBSnapshot) AliCDBManager::Instance()->UnloadFromCache("*/Align/*");
1565 AliSysInfo::AddStamp("MisalignGeom");
1568 Abort("InitGRP", TSelector::kAbortProcess);
1571 AliSysInfo::AddStamp("InitGRP");
1572 if(!toCDBSnapshot) AliCDBManager::Instance()->UnloadFromCache("GRP/Calib/CosmicTriggers");
1574 if(!fFromCDBSnapshot){
1576 Abort("LoadCDB", TSelector::kAbortProcess);
1579 AliSysInfo::AddStamp("LoadCDB");
1582 if (!LoadTriggerScalersCDB()) {
1583 Abort("LoadTriggerScalersCDB", TSelector::kAbortProcess);
1586 AliSysInfo::AddStamp("LoadTriggerScalersCDB");
1588 if (!LoadCTPTimeParamsCDB()) {
1589 Abort("LoadCTPTimeParamsCDB", TSelector::kAbortProcess);
1592 AliSysInfo::AddStamp("LoadCTPTimeParamsCDB");
1594 if (!ReadIntensityInfoCDB()) {
1595 Abort("ReadIntensityInfoCDB", TSelector::kAbortProcess);
1598 AliSysInfo::AddStamp("ReadIntensityInfoCDB");
1600 // Read the reconstruction parameters from OCDB
1601 if (!InitRecoParams()) {
1602 AliWarning("Not all detectors have correct RecoParam objects initialized");
1604 AliSysInfo::AddStamp("InitRecoParams");
1607 AliCDBManager::Instance()->DumpToSnapshotFile(snapshotFileOut.Data(),kFALSE);
1608 AliCDBManager::Instance()->UnloadFromCache("*/Align/*");
1609 AliCDBManager::Instance()->UnloadFromCache("GRP/Calib/CosmicTriggers");
1611 if (fInput && gProof) {
1612 if (reco) *reco = *this;
1614 gGeoManager->SetName("Geometry");
1615 gProof->AddInputData(gGeoManager,kTRUE);
1617 gProof->AddInputData(const_cast<TMap*>(AliCDBManager::Instance()->GetEntryCache()),kTRUE);
1618 fInput->Add(new TParameter<Int_t>("RunNumber",AliCDBManager::Instance()->GetRun()));
1619 AliMagF *magFieldMap = (AliMagF*)TGeoGlobalMagField::Instance()->GetField();
1620 magFieldMap->SetName("MagneticFieldMap");
1621 gProof->AddInputData(magFieldMap,kTRUE);
1623 fAnalysis->SetName("Analysis");
1624 gProof->AddInputData(fAnalysis,kTRUE);
1630 //_____________________________________________________________________________
1631 void AliReconstruction::SlaveBegin(TTree*)
1633 // Initialization related to run-loader,
1634 // vertexer, trackers, recontructors
1635 // In proof mode it is executed on the slave
1636 AliCodeTimerAuto("",0);
1638 TProofOutputFile *outProofFile = NULL;
1640 if (AliDebugLevel() > 0) fInput->Print();
1641 if (AliDebugLevel() > 10) fInput->Dump();
1642 if (AliReconstruction *reco = (AliReconstruction*)fInput->FindObject("AliReconstruction")) {
1645 if (TGeoManager *tgeo = (TGeoManager*)fInput->FindObject("Geometry")) {
1647 AliGeomManager::SetGeometry(tgeo);
1649 if (TMap *entryCache = (TMap*)fInput->FindObject("CDBEntryCache")) {
1650 Int_t runNumber = -1;
1651 if (TProof::GetParameter(fInput,"RunNumber",runNumber) == 0) {
1652 AliCDBManager *man = AliCDBManager::Instance(entryCache,runNumber);
1653 man->SetCacheFlag(kTRUE);
1654 man->SetLock(kTRUE);
1658 if (AliMagF *map = (AliMagF*)fInput->FindObject("MagneticFieldMap")) {
1659 AliMagF *newMap = new AliMagF(*map);
1660 if (!newMap->LoadParameterization()) {
1661 Abort("AliMagF::LoadParameterization", TSelector::kAbortProcess);
1664 TGeoGlobalMagField::Instance()->SetField(newMap);
1665 TGeoGlobalMagField::Instance()->Lock();
1668 // Attempt to get the analysis manager from the input list
1669 fAnalysis = (AliAnalysisManager*)fInput->FindObject("Analysis");
1670 if (fAnalysis) AliInfo("==== Analysis manager retrieved from input list ====");
1672 if (TNamed *outputFileName = (TNamed*)fInput->FindObject("PROOF_OUTPUTFILE"))
1673 fProofOutputFileName = outputFileName->GetTitle();
1674 if (TNamed *outputLocation = (TNamed*)fInput->FindObject("PROOF_OUTPUTFILE_LOCATION"))
1675 fProofOutputLocation = outputLocation->GetTitle();
1676 if (fInput->FindObject("PROOF_OUTPUTFILE_DATASET"))
1677 fProofOutputDataset = kTRUE;
1678 if (TNamed *archiveList = (TNamed*)fInput->FindObject("PROOF_OUTPUTFILE_ARCHIVE"))
1679 fProofOutputArchive = archiveList->GetTitle();
1680 if (!fProofOutputFileName.IsNull() &&
1681 !fProofOutputLocation.IsNull() &&
1682 fProofOutputArchive.IsNull()) {
1683 if (!fProofOutputDataset) {
1684 outProofFile = new TProofOutputFile(fProofOutputFileName.Data(),"M");
1685 outProofFile->SetOutputFileName(Form("%s%s",fProofOutputLocation.Data(),fProofOutputFileName.Data()));
1688 outProofFile = new TProofOutputFile(fProofOutputFileName.Data(),"DROV",fProofOutputLocation.Data());
1690 if (AliDebugLevel() > 0) outProofFile->Dump();
1691 fOutput->Add(outProofFile);
1693 AliSysInfo::AddStamp("ReadInputInSlaveBegin");
1695 // Check if analysis was requested in the reconstruction event loop
1697 // Attempt to connect in-memory singleton
1698 fAnalysis = AliAnalysisManager::GetAnalysisManager();
1699 if (fAnalysis) AliInfo(Form("==== Analysis manager <%s> found in memory ====", fAnalysis->GetName()));
1700 // Check if an analysis macro was specified
1701 if (!fAnalysis && !fAnalysisMacro.IsNull()) {
1702 // Run specified analysis macro
1703 gROOT->ProcessLine(Form(".x %s",fAnalysisMacro.Data()));
1704 fAnalysis = AliAnalysisManager::GetAnalysisManager();
1705 if (!fAnalysis) AliError(Form("No analysis manager produced by analysis macro %s", fAnalysisMacro.Data()));
1706 else AliInfo(Form("==== Analysis manager <%s> produced by analysis macro <%s> ====",
1707 fAnalysis->GetName(), fAnalysisMacro.Data()));
1711 // get the run loader
1712 if (!InitRunLoader()) {
1713 Abort("InitRunLoader", TSelector::kAbortProcess);
1716 AliSysInfo::AddStamp("LoadLoader");
1718 ftVertexer = new AliVertexerTracks(AliTracker::GetBz());
1721 if (!fRunTracking.IsNull() && !CreateTrackers(fRunTracking)) {
1722 Abort("CreateTrackers", TSelector::kAbortProcess);
1725 AliSysInfo::AddStamp("CreateTrackers");
1727 // create the ESD output file and tree
1728 if (!outProofFile) {
1729 ffile = TFile::Open("AliESDs.root", "RECREATE");
1730 ffile->SetCompressionLevel(2);
1731 if (!ffile->IsOpen()) {
1732 Abort("OpenESDFile", TSelector::kAbortProcess);
1737 AliInfo(Form("Opening output PROOF file: %s/%s",
1738 outProofFile->GetDir(), outProofFile->GetFileName()));
1739 if (!(ffile = outProofFile->OpenFile("RECREATE"))) {
1740 Abort(Form("Problems opening output PROOF file: %s/%s",
1741 outProofFile->GetDir(), outProofFile->GetFileName()),
1742 TSelector::kAbortProcess);
1747 ftree = new TTree("esdTree", "Tree with ESD objects");
1748 fesd = new AliESDEvent();
1749 fesd->CreateStdContent();
1750 // add a so far non-std object to the ESD, this will
1751 // become part of the std content
1752 fesd->AddObject(new AliESDHLTDecision);
1754 fesd->WriteToTree(ftree);
1755 if (fWriteESDfriend) {
1756 ffileF = TFile::Open("AliESDfriends.root", "RECREATE");
1757 ftreeF = new TTree("esdFriendTree", "Tree with ESD Friend objects");
1758 fesdf = new AliESDfriend();
1759 ftreeF->Branch("ESDfriend.","AliESDfriend", &fesdf);
1760 fesd->AddObject(fesdf);
1763 ftree->GetUserInfo()->Add(fesd);
1765 fhlttree = new TTree("HLTesdTree", "Tree with HLT ESD objects");
1766 fhltesd = new AliESDEvent();
1767 fhltesd->CreateStdContent();
1768 // read the ESD template from CDB
1769 // HLT is allowed to put non-std content to its ESD, the non-std
1770 // objects need to be created before invocation of WriteToTree in
1771 // order to create all branches. Initialization is done from an
1772 // ESD layout template in CDB
1773 AliCDBManager* man = AliCDBManager::Instance();
1774 AliCDBPath hltESDConfigPath("HLT/Calib/esdLayout");
1775 AliCDBEntry* hltESDConfig=NULL;
1776 if (man->GetId(hltESDConfigPath)!=NULL)
1777 hltESDConfig=man->Get(hltESDConfigPath);
1778 if (!hltESDConfig) {
1779 // try the alternative path
1780 // in Feb 2012 the object has been moved from ConfigHLT to Calib
1781 AliCDBPath hltESDConfigLegacyPath("HLT/ConfigHLT/esdLayout");
1782 AliInfo(Form("can not find HLT ESD config object in %s, trying legacy path %s",
1783 hltESDConfigPath.GetPath().Data(),
1784 hltESDConfigLegacyPath.GetPath().Data()));
1785 hltESDConfig=man->Get(hltESDConfigLegacyPath);
1788 AliESDEvent* pESDLayout=dynamic_cast<AliESDEvent*>(hltESDConfig->GetObject());
1790 // init all internal variables from the list of objects
1791 pESDLayout->GetStdContent();
1793 // copy content and create non-std objects
1794 *fhltesd=*pESDLayout;
1797 AliError(Form("error setting hltEsd layout from %s: invalid object type",
1798 hltESDConfigPath.GetPath().Data()));
1802 fhltesd->WriteToTree(fhlttree);
1803 fhlttree->GetUserInfo()->Add(fhltesd);
1805 ProcInfo_t procInfo;
1806 gSystem->GetProcInfo(&procInfo);
1807 AliInfo(Form("Current memory usage %ld %ld", procInfo.fMemResident, procInfo.fMemVirtual));
1810 //Initialize the QA and start of cycle
1811 if (fRunQA || fRunGlobalQA)
1814 //Initialize the Plane Efficiency framework
1815 if (fRunPlaneEff && !InitPlaneEff()) {
1816 Abort("InitPlaneEff", TSelector::kAbortProcess);
1820 if (strcmp(gProgName,"alieve") == 0)
1821 fRunAliEVE = InitAliEVE();
1822 // If we have an analysis manager, connect the AliRecoInputHandler here
1824 if (!dynamic_cast<AliRecoInputHandler*>(fAnalysis->GetInputEventHandler())) {
1825 AliError("Analysis manager used in reconstruction should use AliRecoInputHandler - \
1826 \n ->Replacing with AliRecoInputHandler instance.");
1827 delete fAnalysis->GetInputEventHandler();
1829 // Set the event and other data pointers
1830 fRecoHandler = new AliRecoInputHandler();
1831 fRecoHandler->Init(ftree, "LOCAL");
1832 fRecoHandler->SetEvent(fesd);
1833 fRecoHandler->SetESDfriend(fesdf);
1834 fRecoHandler->SetHLTEvent(fhltesd);
1835 fRecoHandler->SetHLTTree(fhlttree);
1836 fAnalysis->SetInputEventHandler(fRecoHandler);
1837 // Enter external loop mode
1838 fAnalysis->SetExternalLoop(kTRUE);
1839 // Initialize analysis
1840 fAnalysis->StartAnalysis("local", (TTree*)0);
1841 // Connect ESD tree with the input container
1842 fAnalysis->GetCommonInputContainer()->SetData(ftree);
1847 //_____________________________________________________________________________
1848 Bool_t AliReconstruction::Process(Long64_t entry)
1850 // run the reconstruction over a single entry
1851 // from the chain with raw data
1852 AliCodeTimerAuto("",0);
1854 TTree *currTree = fChain->GetTree();
1855 AliRawVEvent *event = NULL;
1856 currTree->SetBranchAddress("rawevent",&event);
1857 currTree->GetEntry(entry);
1858 fRawReader = new AliRawReaderRoot(event);
1859 // check if process has enough resources
1860 if (!HasEnoughResources(entry)) return kFALSE;
1861 fStatus = ProcessEvent(fRunLoader->GetNumberOfEvents());
1869 //_____________________________________________________________________________
1870 void AliReconstruction::Init(TTree *tree)
1872 // Implementation of TSelector::Init()
1875 AliError("The input tree is not found!");
1881 //_____________________________________________________________________________
1882 Bool_t AliReconstruction::ProcessEvent(Int_t iEvent)
1884 // run the reconstruction over a single event
1885 // The event loop is steered in Run method
1888 static Long_t oldMres=0;
1889 static Long_t oldMvir=0;
1890 static Float_t oldCPU=0;
1891 static Long_t aveDMres=0;
1892 static Long_t aveDMvir=0;
1893 static Float_t aveDCPU=0;
1895 AliCodeTimerAuto("",0);
1899 AliSysInfo::AddStamp(Form("StartEv_%d",iEvent), 0,0,iEvent);
1901 if (iEvent >= fRunLoader->GetNumberOfEvents()) {
1902 fRunLoader->SetEventNumber(iEvent);
1904 fRunLoader->GetHeader()->Reset(fRawReader->GetRunNumber(),
1906 fRunLoader->TreeE()->Fill();
1908 if (fRawReader && fRawReader->UseAutoSaveESD())
1909 fRunLoader->TreeE()->AutoSave("SaveSelf");
1912 if ((iEvent < fFirstEvent) || ((fLastEvent >= 0) && (iEvent > fLastEvent))) {
1917 fRunLoader->GetEvent(iEvent);
1919 // Fill Event-info object
1921 fRecoParam.SetEventSpecie(fRunInfo,fEventInfo,fListOfCosmicTriggers);
1923 ProcInfo_t procInfo;
1924 if(iEvent==fFirstEvent) {
1925 gSystem->GetProcInfo(&procInfo);
1926 oldMres=procInfo.fMemResident;
1927 oldMvir=procInfo.fMemVirtual;
1928 oldCPU=procInfo.fCpuUser+procInfo.fCpuSys;
1930 AliInfo(Form("================================= Processing event %d of type %-10s ==================================", iEvent,fRecoParam.PrintEventSpecie()));
1932 AliSysInfo::AddStamp(Form("StartReco_%d",iEvent), 0,0,iEvent);
1934 // Set the reco-params
1936 TString detStr = fLoadCDB;
1937 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
1938 if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
1939 AliReconstructor *reconstructor = GetReconstructor(iDet);
1940 if (reconstructor && fRecoParam.GetDetRecoParamArray(iDet)) {
1941 const AliDetectorRecoParam *par = fRecoParam.GetDetRecoParam(iDet);
1942 reconstructor->SetRecoParam(par);
1943 reconstructor->GetPidSettings(&pid);
1944 reconstructor->SetEventInfo(&fEventInfo);
1946 AliQAManager::QAManager()->SetEventInfo(&fEventInfo) ;
1947 AliQAManager::QAManager()->SetRecoParam(iDet, par) ;
1948 if (par) AliQAManager::QAManager()->SetEventSpecie(AliRecoParam::Convert(par->GetEventSpecie())) ;
1953 if (fRunQA || fRunGlobalQA) AliQADataMaker::SetEventTrigClasses(fEventInfo.GetTriggerClasses()); // RS: select which histo clones are to be filled
1956 const AliDetectorRecoParam *grppar = fRecoParam.GetDetRecoParam(kNDetectors);
1957 AliQAManager::QAManager()->SetRecoParam(AliQAv1::kGLOBAL, grppar) ;
1958 AliQAManager::QAManager()->SetEventSpecie(AliRecoParam::Convert(grppar->GetEventSpecie())) ;
1963 if (fRunQA && IsInTasks(AliQAv1::kRAWS)) {
1964 AliQAManager::QAManager()->SetEventSpecie(fRecoParam.GetEventSpecie()) ;
1965 AliQAManager::QAManager()->RunOneEvent(fRawReader) ;
1966 AliSysInfo::AddStamp(Form("RawQA_%d",iEvent), 0,0,iEvent);
1968 // local single event reconstruction
1969 if (!fRunLocalReconstruction.IsNull()) {
1970 TString detectors=fRunLocalReconstruction;
1971 // run HLT event reconstruction first
1972 // ;-( IsSelected changes the string
1973 if (IsSelected("HLT", detectors) &&
1974 !RunLocalEventReconstruction("HLT")) {
1975 if (fStopOnError) {CleanUp(); return kFALSE;}
1977 detectors=fRunLocalReconstruction;
1978 detectors.ReplaceAll("HLT", "");
1979 if (!RunLocalEventReconstruction(detectors)) {
1988 // fill Event header information from the RawEventHeader
1989 if (fRawReader){FillRawEventHeaderESD(fesd);}
1990 if (fRawReader){FillRawEventHeaderESD(fhltesd);}
1992 fesd->SetRunNumber(fRunLoader->GetHeader()->GetRun());
1993 fhltesd->SetRunNumber(fRunLoader->GetHeader()->GetRun());
1995 ((AliESDRun*)fesd->GetESDRun())->SetDetectorsInDAQ(fRunInfo->GetDetectorMask());
1996 ((AliESDRun*)fhltesd->GetESDRun())->SetDetectorsInDAQ(fRunInfo->GetDetectorMask());
1997 ((AliESDRun*)fesd->GetESDRun())->SetDetectorsInReco(AliDAQ::DetectorPatternOffline(fFillESD.Data()));
1998 ((AliESDRun*)fhltesd->GetESDRun())->SetDetectorsInReco(AliDAQ::DetectorPatternOffline(fFillESD.Data()));
2000 fesd->SetEventNumberInFile(fRunLoader->GetHeader()->GetEventNrInRun());
2001 fhltesd->SetEventNumberInFile(fRunLoader->GetHeader()->GetEventNrInRun());
2003 fesd->SetEventSpecie(fRecoParam.GetEventSpecie());
2004 fhltesd->SetEventSpecie(fRecoParam.GetEventSpecie());
2006 // Set magnetic field from the tracker
2007 fesd->SetMagneticField(AliTracker::GetBz());
2008 fhltesd->SetMagneticField(AliTracker::GetBz());
2010 AliESDRun *esdRun,*esdRunH;
2011 esdRun = (AliESDRun*)fesd->GetESDRun();
2012 esdRunH = (AliESDRun*)fhltesd->GetESDRun();
2013 esdRun->SetBeamEnergyIsSqrtSHalfGeV();
2014 esdRunH->SetBeamEnergyIsSqrtSHalfGeV();
2016 for (int ib=2;ib--;) for (int it=2;it--;) {
2017 esdRun->SetMeanIntensity(ib,it, fBeamInt[ib][it]);
2018 esdRunH->SetMeanIntensity(ib,it, fBeamInt[ib][it]);
2021 fesd->SetBeamEnergy(fGRPData->GetBeamEnergy());
2022 fesd->SetBeamType(fGRPData->GetBeamType().Data());
2023 fesd->SetBeamParticle(fGRPData->GetSingleBeamType(0).Atoi(),0);
2024 fesd->SetBeamParticle(fGRPData->GetSingleBeamType(1).Atoi(),1);
2025 fhltesd->SetBeamEnergy(fGRPData->GetBeamEnergy());
2026 fhltesd->SetBeamType(fGRPData->GetBeamType().Data());
2027 fhltesd->SetBeamParticle(fGRPData->GetSingleBeamType(0).Atoi(),0);
2028 fhltesd->SetBeamParticle(fGRPData->GetSingleBeamType(1).Atoi(),1);
2030 AliMagF* fld = (AliMagF*)TGeoGlobalMagField::Instance()->GetField();
2031 if (fld) { // set info needed for field initialization
2032 fesd->SetCurrentL3(fld->GetCurrentSol());
2033 fesd->SetCurrentDip(fld->GetCurrentDip());
2034 fesd->SetUniformBMap(fld->IsUniform());
2035 fesd->SetBInfoStored();
2037 fhltesd->SetCurrentL3(fld->GetCurrentSol());
2038 fhltesd->SetCurrentDip(fld->GetCurrentDip());
2039 fhltesd->SetUniformBMap(fld->IsUniform());
2040 fhltesd->SetBInfoStored();
2043 // Set most probable pt, for B=0 tracking
2044 // Get the global reco-params. They are atposition 16 inside the array of detectors in fRecoParam
2045 const AliGRPRecoParam *grpRecoParam = dynamic_cast<const AliGRPRecoParam*>(fRecoParam.GetDetRecoParam(kNDetectors));
2046 if (grpRecoParam) AliExternalTrackParam::SetMostProbablePt(grpRecoParam->GetMostProbablePt());
2048 // Fill raw-data error log into the ESD
2049 if (fRawReader) FillRawDataErrorLog(iEvent,fesd);
2051 AliSysInfo::AddStamp(Form("FillHeadErrs_%d",iEvent), 0,0,iEvent);
2054 if (fRunVertexFinder) {
2055 if (!RunVertexFinder(fesd)) {
2056 if (fStopOnError) {CleanUp(); return kFALSE;}
2058 AliSysInfo::AddStamp(Form("VtxFinder_%d",iEvent), 0,0,iEvent);
2061 // For Plane Efficiency: run the SPD trackleter
2062 if (fRunPlaneEff && fSPDTrackleter) {
2063 if (!RunSPDTrackleting(fesd)) {
2064 if (fStopOnError) {CleanUp(); return kFALSE;}
2066 AliSysInfo::AddStamp(Form("TrackletEff_%d",iEvent), 0,0,iEvent);
2070 if (!fRunTracking.IsNull()) {
2071 if (fRunMuonTracking) {
2072 if (!RunMuonTracking(fesd)) {
2073 if (fStopOnError) {CleanUp(); return kFALSE;}
2076 AliSysInfo::AddStamp(Form("TrackingMUON_%d",iEvent), 0,0,iEvent);
2080 if (!fRunTracking.IsNull()) {
2081 if (!RunTracking(fesd,pid)) {
2082 if (fStopOnError) {CleanUp(); return kFALSE;}
2087 if (!fFillESD.IsNull()) {
2088 TString detectors=fFillESD;
2089 // run HLT first and on hltesd
2090 // ;-( IsSelected changes the string
2091 if (IsSelected("HLT", detectors) &&
2092 !FillESD(fhltesd, "HLT")) {
2093 if (fStopOnError) {CleanUp(); return kFALSE;}
2096 // Temporary fix to avoid problems with HLT that overwrites the offline ESDs
2097 if (detectors.Contains("ALL")) {
2099 for (Int_t idet=0; idet<kNDetectors; ++idet){
2100 detectors += fgkDetectorName[idet];
2104 detectors.ReplaceAll("HLT", "");
2105 if (!FillESD(fesd, detectors)) {
2106 if (fStopOnError) {CleanUp(); return kFALSE;}
2114 // Propagate track to the beam pipe (if not already done by ITS)
2116 const Int_t ntracks = fesd->GetNumberOfTracks();
2117 const Double_t kRadius = 2.8; //something less than the beam pipe radius
2120 UShort_t selectedIdx[ntracks];
2122 for (Int_t itrack=0; itrack<ntracks; itrack++){
2123 const Double_t kMaxStep = 1; //max step over the material
2126 AliESDtrack *track = fesd->GetTrack(itrack);
2127 if (!track) continue;
2129 AliExternalTrackParam *tpcTrack =
2130 (AliExternalTrackParam *)track->GetTPCInnerParam();
2134 PropagateTrackToBxByBz(tpcTrack,kRadius,track->GetMass(),kMaxStep,kFALSE);
2137 Int_t n=trkArray.GetEntriesFast();
2138 selectedIdx[n]=track->GetID();
2139 trkArray.AddLast(tpcTrack);
2142 //Tracks refitted by ITS should already be at the SPD vertex
2143 if (track->IsOn(AliESDtrack::kITSrefit)) continue;
2146 PropagateTrackToBxByBz(track,kRadius,track->GetMass(),kMaxStep,kFALSE);
2147 Double_t x[3]; track->GetXYZ(x);
2148 Double_t b[3]; AliTracker::GetBxByBz(x,b);
2149 track->RelateToVertexBxByBz(fesd->GetPrimaryVertexSPD(), b, kVeryBig);
2152 AliSysInfo::AddStamp(Form("RelToSPDVtx_%d",iEvent), 0,0,iEvent);
2154 // Improve the reconstructed primary vertex position using the tracks
2156 Bool_t runVertexFinderTracks = fRunVertexFinderTracks;
2157 if(fesd->GetPrimaryVertexSPD()) {
2158 TString vtitle = fesd->GetPrimaryVertexSPD()->GetTitle();
2159 if(vtitle.Contains("cosmics")) {
2160 runVertexFinderTracks=kFALSE;
2164 if (runVertexFinderTracks) {
2165 // TPC + ITS primary vertex
2166 ftVertexer->SetITSMode();
2167 ftVertexer->SetConstraintOff();
2168 // get cuts for vertexer from AliGRPRecoParam
2169 Bool_t constrSPD=kFALSE;
2171 Int_t nCutsVertexer = grpRecoParam->GetVertexerTracksNCuts();
2172 Double_t *cutsVertexer = new Double_t[nCutsVertexer];
2173 grpRecoParam->GetVertexerTracksCutsITS(cutsVertexer,nCutsVertexer);
2174 ftVertexer->SetCuts(cutsVertexer,nCutsVertexer);
2175 delete [] cutsVertexer; cutsVertexer = NULL;
2176 if(grpRecoParam->GetVertexerTracksConstraintITS()) {
2177 if(fDiamondProfile && fDiamondProfile->GetXRes()<kRadius){
2178 ftVertexer->SetVtxStart(fDiamondProfile); // apply constraint only if sigmax is smaller than the beam pipe radius
2180 if(fDiamondProfileSPD && fDiamondProfileSPD->GetXRes()<kRadius){
2181 ftVertexer->SetVtxStart(fDiamondProfileSPD);
2187 AliESDVertex *pvtx=ftVertexer->FindPrimaryVertex(fesd);
2190 TString title=pvtx->GetTitle();
2191 title.Append("SPD");
2192 pvtx->SetTitle(title);
2194 if (pvtx->GetStatus()) {
2195 fesd->SetPrimaryVertexTracks(pvtx);
2196 for (Int_t i=0; i<ntracks; i++) {
2197 AliESDtrack *t = fesd->GetTrack(i);
2198 Double_t x[3]; t->GetXYZ(x);
2199 Double_t b[3]; AliTracker::GetBxByBz(x,b);
2200 t->RelateToVertexBxByBz(pvtx, b, kVeryBig);
2203 delete pvtx; pvtx=NULL;
2205 AliSysInfo::AddStamp(Form("VtxTrk_%d",iEvent), 0,0,iEvent);
2207 // TPC-only primary vertex
2208 ftVertexer->SetTPCMode();
2209 ftVertexer->SetConstraintOff();
2210 // get cuts for vertexer from AliGRPRecoParam
2212 Int_t nCutsVertexer = grpRecoParam->GetVertexerTracksNCuts();
2213 Double_t *cutsVertexer = new Double_t[nCutsVertexer];
2214 grpRecoParam->GetVertexerTracksCutsTPC(cutsVertexer,nCutsVertexer);
2215 ftVertexer->SetCuts(cutsVertexer,nCutsVertexer);
2216 delete [] cutsVertexer; cutsVertexer = NULL;
2217 if(fDiamondProfileTPC && grpRecoParam->GetVertexerTracksConstraintTPC()) {
2218 if(fDiamondProfileTPC->GetXRes()<kRadius) ftVertexer->SetVtxStart(fDiamondProfileTPC); // apply constraint only if sigmax is smaller than the beam pipe radius
2221 pvtx=ftVertexer->FindPrimaryVertex(&trkArray,selectedIdx);
2223 if (pvtx->GetStatus()) {
2224 fesd->SetPrimaryVertexTPC(pvtx);
2225 for (Int_t i=0; i<ntracks; i++) {
2226 AliESDtrack *t = fesd->GetTrack(i);
2227 Double_t x[3]; t->GetXYZ(x);
2228 Double_t b[3]; AliTracker::GetBxByBz(x,b);
2229 t->RelateToVertexTPCBxByBz(pvtx, b, kVeryBig);
2232 delete pvtx; pvtx=NULL;
2234 AliSysInfo::AddStamp(Form("VtxTPC_%d",iEvent), 0,0,iEvent);
2238 if(fDiamondProfile && fDiamondProfile->GetXRes()<kRadius) fesd->SetDiamond(fDiamondProfile);
2239 else fesd->SetDiamond(fDiamondProfileSPD);
2243 AliV0vertexer vtxer;
2244 // get cuts for V0vertexer from AliGRPRecoParam
2246 Int_t nCutsV0vertexer = grpRecoParam->GetVertexerV0NCuts();
2247 Double_t cutsV0vertexer[nCutsV0vertexer];
2248 grpRecoParam->GetVertexerV0Cuts(cutsV0vertexer);
2249 vtxer.SetCuts(cutsV0vertexer);
2251 vtxer.Tracks2V0vertices(fesd);
2252 AliSysInfo::AddStamp(Form("V0Finder_%d",iEvent), 0,0,iEvent);
2254 if (fRunCascadeFinder) {
2256 AliCascadeVertexer cvtxer;
2257 // get cuts for CascadeVertexer from AliGRPRecoParam
2259 Int_t nCutsCascadeVertexer = grpRecoParam->GetVertexerCascadeNCuts();
2260 Double_t cutsCascadeVertexer[nCutsCascadeVertexer];
2261 grpRecoParam->GetVertexerCascadeCuts(cutsCascadeVertexer);
2262 cvtxer.SetCuts(cutsCascadeVertexer);
2264 cvtxer.V0sTracks2CascadeVertices(fesd);
2265 AliSysInfo::AddStamp(Form("CascadeFinder_%d",iEvent), 0,0,iEvent);
2270 if (fReconstructor[3])
2271 GetReconstructor(3)->FillEventTimeWithTOF(fesd,&pid);
2276 if (fFillTriggerESD) {
2277 if (!FillTriggerESD(fesd)) {
2278 if (fStopOnError) {CleanUp(); return kFALSE;}
2281 // Always fill scalers
2282 if (!FillTriggerScalers(fesd)) {
2283 if (fStopOnError) {CleanUp(); return kFALSE;}
2286 AliSysInfo::AddStamp(Form("FillVaria_%d",iEvent), 0,0,iEvent);
2291 AliSysInfo::AddStamp(Form("CleanESD_%d",iEvent), 0,0,iEvent);
2294 // RS run updated trackleter: since we want to mark the clusters used by tracks and also mark the
2295 // tracks interpreted as primary, this step should be done in the very end, when full
2296 // ESD info is available (particulalry, V0s)
2298 if (fRunMultFinder) {
2299 if (!RunMultFinder(fesd)) {
2300 if (fStopOnError) {CleanUp(); return kFALSE;}
2302 AliSysInfo::AddStamp(Form("MultFinder_%d",iEvent), 0,0,iEvent);
2305 if (fRunQA && IsInTasks(AliQAv1::kESDS)) {
2306 AliQAManager::QAManager()->SetEventSpecie(fRecoParam.GetEventSpecie()) ;
2307 AliQAManager::QAManager()->RunOneEvent(fesd, fhltesd) ;
2308 AliSysInfo::AddStamp(Form("RunQA_%d",iEvent), 0,0,iEvent);
2311 AliQADataMaker *qadm = AliQAManager::QAManager()->GetQADataMaker(AliQAv1::kGLOBAL);
2313 qadm->SetEventSpecie(fRecoParam.GetEventSpecie()) ;
2314 if (qadm && IsInTasks(AliQAv1::kESDS))
2315 qadm->Exec(AliQAv1::kESDS, fesd);
2316 AliSysInfo::AddStamp(Form("RunGlobQA_%d",iEvent), 0,0,iEvent);
2319 // copy HLT decision from HLTesd to esd
2320 // the most relevant information is stored in a reduced container in the esd,
2321 // while the full information can be found in the HLTesd
2322 TObject* pHLTSrc=fhltesd->FindListObject(AliESDHLTDecision::Name());
2323 TObject* pHLTTgt=fesd->FindListObject(AliESDHLTDecision::Name());
2324 if (pHLTSrc && pHLTTgt) {
2325 pHLTSrc->Copy(*pHLTTgt);
2328 // Perform analysis of this event if requested
2329 // RS: Should be done before WriteESDfriend, since the latter may clean the esdfriend
2331 fRecoHandler->BeginEvent(iEvent);
2332 fAnalysis->ExecAnalysis();
2333 fRecoHandler->FinishEvent();
2334 AliSysInfo::AddStamp(Form("Analysis_%d",iEvent), 0,0,iEvent);
2337 if (fWriteESDfriend) {
2338 fesd->GetESDfriend(fesdf);
2339 AliSysInfo::AddStamp(Form("CreateFriend_%d",iEvent), 0,0,iEvent);
2344 AliSysInfo::AddStamp(Form("ESDFill_%d",iEvent), 0,0,iEvent);
2346 if (fWriteESDfriend) {
2348 AliSysInfo::AddStamp(Form("WriteFriend_%d",iEvent), 0,0,iEvent);
2352 // Auto-save the ESD tree in case of prompt reco @P2
2353 if (fRawReader && fRawReader->UseAutoSaveESD()) {
2354 ftree->AutoSave("SaveSelf");
2355 if (fWriteESDfriend) ftreeF->AutoSave("SaveSelf");
2361 if (fRunAliEVE) RunAliEVE();
2365 if (fWriteESDfriend) {
2366 fesdf->~AliESDfriend();
2367 new (fesdf) AliESDfriend(); // Reset...
2370 gSystem->GetProcInfo(&procInfo);
2371 Long_t dMres=(procInfo.fMemResident-oldMres)/1024;
2372 Long_t dMvir=(procInfo.fMemVirtual-oldMvir)/1024;
2373 Float_t dCPU=procInfo.fCpuUser+procInfo.fCpuSys-oldCPU;
2374 aveDMres+=(dMres-aveDMres)/(iEvent-fFirstEvent+1);
2375 aveDMvir+=(dMvir-aveDMvir)/(iEvent-fFirstEvent+1);
2376 aveDCPU+=(dCPU-aveDCPU)/(iEvent-fFirstEvent+1);
2377 AliInfo(Form("======================= End Event %d: Res %ld(%3ld <%3ld>) Vir %ld(%3ld <%3ld>) CPU %5.2f <%5.2f> ===================",
2378 iEvent, procInfo.fMemResident/1024, dMres, aveDMres, procInfo.fMemVirtual/1024, dMvir, aveDMvir, dCPU, aveDCPU));
2379 oldMres=procInfo.fMemResident;
2380 oldMvir=procInfo.fMemVirtual;
2381 oldCPU=procInfo.fCpuUser+procInfo.fCpuSys;
2384 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
2385 if (fReconstructor[iDet]) {
2386 fReconstructor[iDet]->SetRecoParam(NULL);
2387 fReconstructor[iDet]->SetEventInfo(NULL);
2389 if (fTracker[iDet]) fTracker[iDet]->SetEventInfo(NULL);
2392 if (fRunQA || fRunGlobalQA)
2393 AliQAManager::QAManager()->Increment() ;
2395 DeleteRecPoints(fDeleteRecPoints);
2396 DeleteDigits(fDeleteDigits);
2401 //_____________________________________________________________________________
2402 void AliReconstruction::SlaveTerminate()
2404 // Finalize the run on the slave side
2405 // Called after the exit
2406 // from the event loop
2407 AliCodeTimerAuto("",0);
2408 // If analysis was done during reconstruction, we need to call SlaveTerminate for it
2410 fAnalysis->PackOutput(fOutput);
2411 fAnalysis->SetSkipTerminate(kTRUE);
2412 fAnalysis->Terminate();
2415 if (fIsNewRunLoader) { // galice.root didn't exist
2416 fRunLoader->WriteHeader("OVERWRITE");
2417 fRunLoader->WriteTrigger("OVERWRITE");
2418 fRunLoader->CdGAFile();
2419 fRunLoader->Write(0, TObject::kOverwrite);
2422 const TMap *cdbMap = AliCDBManager::Instance()->GetStorageMap();
2423 const TList *cdbList = AliCDBManager::Instance()->GetRetrievedIds();
2425 TMap *cdbMapCopy = new TMap(cdbMap->GetEntries());
2426 cdbMapCopy->SetOwner(1);
2427 cdbMapCopy->SetName("cdbMap");
2428 TIter iter(cdbMap->GetTable());
2431 while((pair = dynamic_cast<TPair*> (iter.Next()))){
2432 TObjString* keyStr = dynamic_cast<TObjString*> (pair->Key());
2433 TObjString* valStr = dynamic_cast<TObjString*> (pair->Value());
2434 if (keyStr && valStr)
2435 cdbMapCopy->Add(new TObjString(keyStr->GetName()), new TObjString(valStr->GetName()));
2438 TList *cdbListCopy = new TList();
2439 cdbListCopy->SetOwner(1);
2440 cdbListCopy->SetName("cdbList");
2442 TIter iter2(cdbList);
2445 while((id = dynamic_cast<AliCDBId*> (iter2.Next()))){
2446 cdbListCopy->Add(new TObjString(id->ToString().Data()));
2449 ftree->GetUserInfo()->Add(cdbMapCopy);
2450 ftree->GetUserInfo()->Add(cdbListCopy);
2452 // Add the AliRoot version that created this file
2453 TString sVersion("aliroot ");
2454 sVersion += ALIROOT_SVN_BRANCH;
2456 sVersion += ALIROOT_SVN_REVISION;
2457 sVersion += "; root ";
2458 sVersion += ROOT_SVN_BRANCH;
2460 sVersion += ROOT_SVN_REVISION;
2461 sVersion += "; metadata ";
2462 sVersion += gSystem->Getenv("PRODUCTION_METADATA");
2465 TNamed * alirootVersion = new TNamed("alirootVersion",sVersion.Data());
2466 ftree->GetUserInfo()->Add(alirootVersion); // The list becomes owner of alirootVersion
2470 // we want to have only one tree version number
2471 ftree->Write(ftree->GetName(),TObject::kOverwrite);
2472 fhlttree->Write(fhlttree->GetName(),TObject::kOverwrite);
2474 if (fWriteESDfriend) {
2476 ftreeF->Write(ftreeF->GetName(),TObject::kOverwrite);
2479 // Finish with Plane Efficiency evaluation: before of CleanUp !!!
2480 if (fRunPlaneEff && !FinishPlaneEff()) {
2481 AliWarning("Finish PlaneEff evaluation failed");
2484 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
2485 if (fReconstructor[iDet]) fReconstructor[iDet]->Terminate();
2487 // End of cycle for the in-loop
2489 if (fRunQA || fRunGlobalQA) {
2490 AliQAManager::QAManager()->EndOfCycle() ;
2492 !fProofOutputLocation.IsNull() &&
2493 fProofOutputArchive.IsNull() &&
2494 !fProofOutputDataset) {
2495 TString qaOutputFile(Form("%sMerged.%s.Data.root",
2496 fProofOutputLocation.Data(),
2497 AliQAv1::GetQADataFileName()));
2498 TProofOutputFile *qaProofFile = new TProofOutputFile(Form("Merged.%s.Data.root",
2499 AliQAv1::GetQADataFileName()));
2500 qaProofFile->SetOutputFileName(qaOutputFile.Data());
2501 if (AliDebugLevel() > 0) qaProofFile->Dump();
2502 fOutput->Add(qaProofFile);
2503 MergeQA(qaProofFile->GetFileName());
2514 if (!fProofOutputFileName.IsNull() &&
2515 !fProofOutputLocation.IsNull() &&
2516 fProofOutputDataset &&
2517 !fProofOutputArchive.IsNull()) {
2518 TProofOutputFile *zipProofFile = new TProofOutputFile(fProofOutputFileName.Data(),
2520 fProofOutputLocation.Data());
2521 if (AliDebugLevel() > 0) zipProofFile->Dump();
2522 fOutput->Add(zipProofFile);
2523 TString fileList(fProofOutputArchive.Data());
2524 fileList.ReplaceAll(","," ");
2526 #if ROOT_SVN_REVISION >= 30174
2527 command.Form("zip -n root %s/%s %s",zipProofFile->GetDir(kTRUE),zipProofFile->GetFileName(),fileList.Data());
2529 command.Form("zip -n root %s/%s %s",zipProofFile->GetDir(),zipProofFile->GetFileName(),fileList.Data());
2531 AliInfo(Form("Executing: %s",command.Data()));
2532 gSystem->Exec(command.Data());
2537 //_____________________________________________________________________________
2538 void AliReconstruction::Terminate()
2540 // Create tags for the events in the ESD tree (the ESD tree is always present)
2541 // In case of empty events the tags will contain dummy values
2542 AliCodeTimerAuto("",0);
2544 // Do not call the ESD tag creator in case of PROOF-based reconstruction
2546 AliESDTagCreator *esdtagCreator = new AliESDTagCreator();
2547 esdtagCreator->CreateESDTags(fFirstEvent,fLastEvent,fGRPData, AliQAv1::Instance()->GetQA(), AliQAv1::Instance()->GetEventSpecies(), AliQAv1::kNDET, AliRecoParam::kNSpecies);
2548 delete esdtagCreator;
2551 // Cleanup of CDB manager: cache and active storages!
2552 AliCDBManager::Instance()->ClearCache();
2555 //_____________________________________________________________________________
2556 Bool_t AliReconstruction::RunLocalEventReconstruction(const TString& detectors)
2558 // run the local reconstruction
2560 static Int_t eventNr=0;
2561 AliCodeTimerAuto("",0)
2563 TString detStr = detectors;
2564 // execute HLT reconstruction first since other detector reconstruction
2565 // might depend on HLT data
2566 // key 'HLT' is removed from detStr by IsSelected
2567 if (!IsSelected("HLT", detStr)) {
2568 AliReconstructor* reconstructor = GetReconstructor(kNDetectors-1);
2569 if (reconstructor) {
2570 // there is no AliLoader for HLT, see
2571 // https://savannah.cern.ch/bugs/?35473
2572 AliInfo("running reconstruction for HLT");
2574 AliInfo("reconstructor->Reconstruct(fRawReader, NULL)");
2575 reconstructor->Reconstruct(fRawReader, NULL);
2578 AliInfo("reconstructor->Reconstruct(dummy, NULL)");
2580 reconstructor->Reconstruct(dummy, NULL);
2583 AliSysInfo::AddStamp(Form("LRecHLT_%d",eventNr), -1,1,eventNr);
2586 AliInfo(Form("kNDetectors = %d",kNDetectors));
2588 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
2589 if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
2590 AliDebug(1, Form("Detector: %s", fgkDetectorName[iDet]));
2591 AliReconstructor* reconstructor = GetReconstructor(iDet);
2592 if (!reconstructor) continue;
2593 AliLoader* loader = fLoader[iDet];
2595 AliWarning(Form("No loader is defined for %s!",fgkDetectorName[iDet]));
2598 // conversion of digits
2599 if (fRawReader && reconstructor->HasDigitConversion()) {
2600 AliInfo(Form("converting raw data digits into root objects for %s",
2601 fgkDetectorName[iDet]));
2602 // AliCodeTimerAuto(Form("converting raw data digits into root objects for %s",
2603 // fgkDetectorName[iDet]),0);
2604 loader->LoadDigits("update");
2605 loader->CleanDigits();
2606 loader->MakeDigitsContainer();
2607 TTree* digitsTree = loader->TreeD();
2608 reconstructor->ConvertDigits(fRawReader, digitsTree);
2609 loader->WriteDigits("OVERWRITE");
2610 loader->UnloadDigits();
2612 // local reconstruction
2613 AliInfo(Form("running reconstruction for %s", fgkDetectorName[iDet]));
2614 //AliCodeTimerAuto(Form("running reconstruction for %s", fgkDetectorName[iDet]),0);
2615 AliDebug(1, "Loading Rec Points");
2616 loader->LoadRecPoints("update");
2617 AliDebug(1, "Cleaning Rec Points");
2618 loader->CleanRecPoints();
2619 AliDebug(1, "Making Rec Points Container");
2620 loader->MakeRecPointsContainer();
2621 TTree* clustersTree = loader->TreeR();
2622 if (fRawReader && !reconstructor->HasDigitConversion()) {
2623 reconstructor->Reconstruct(fRawReader, clustersTree);
2626 AliDebug(1, "Loading Digits");
2627 loader->LoadDigits("read");
2628 TTree* digitsTree = loader->TreeD();
2629 AliDebug(1, Form("Digits Tree = %p",digitsTree));
2631 AliError(Form("Can't get the %s digits tree", fgkDetectorName[iDet]));
2636 AliDebug(1, "Digits -> Clusters");
2637 reconstructor->Reconstruct(digitsTree, clustersTree);
2638 if (fRunQA && IsInTasks(AliQAv1::kDIGITSR)) {
2639 AliQAManager::QAManager()->SetEventSpecie(fRecoParam.GetEventSpecie()) ;
2640 AliQAManager::QAManager()->RunOneEventInOneDetector(iDet, digitsTree) ;
2643 loader->UnloadDigits();
2645 if (fRunQA && IsInTasks(AliQAv1::kRECPOINTS)) {
2646 AliQAManager::QAManager()->SetEventSpecie(fRecoParam.GetEventSpecie()) ;
2647 AliQAManager::QAManager()->RunOneEventInOneDetector(iDet, clustersTree) ;
2649 loader->WriteRecPoints("OVERWRITE");
2650 loader->UnloadRecPoints();
2651 AliSysInfo::AddStamp(Form("LRec%s_%d",fgkDetectorName[iDet],eventNr), iDet,1,eventNr);
2653 if (!IsSelected("CTP", detStr)) AliDebug(10,"No CTP");
2654 if ((detStr.CompareTo("ALL") != 0) && !detStr.IsNull()) {
2655 AliError(Form("the following detectors were not found: %s",
2663 //_____________________________________________________________________________
2664 Bool_t AliReconstruction::RunSPDTrackleting(AliESDEvent*& esd)
2666 // run the SPD trackleting (for SPD efficiency purpouses)
2668 AliCodeTimerAuto("",0)
2670 Double_t vtxPos[3] = {0, 0, 0};
2671 Double_t vtxErr[3] = {0.0, 0.0, 0.0};
2677 if (fRunLoader->GetHeader() && fRunLoader->GetHeader()->GenEventHeader()) {
2678 fRunLoader->GetHeader()->GenEventHeader()->PrimaryVertex(mcVertex);
2679 for (Int_t i = 0; i < 3; i++) vtxPos[i] = mcVertex[i];
2682 const AliESDVertex *vertex = esd->GetVertex();
2684 AliWarning("Vertex not found");
2687 vertex->GetXYZ(vtxPos);
2688 vertex->GetSigmaXYZ(vtxErr);
2689 if (fSPDTrackleter) {
2690 AliInfo("running the SPD Trackleter for Plane Efficiency Evaluation");
2693 fLoader[0]->LoadRecPoints("read");
2694 TTree* tree = fLoader[0]->TreeR();
2696 AliError("Can't get the ITS cluster tree");
2699 fSPDTrackleter->LoadClusters(tree);
2700 fSPDTrackleter->SetVertex(vtxPos, vtxErr);
2702 if (fSPDTrackleter->Clusters2Tracks(esd) != 0) {
2703 AliWarning("AliITSTrackleterSPDEff Clusters2Tracks failed");
2704 // fLoader[0]->UnloadRecPoints();
2707 //fSPDTrackleter->UnloadRecPoints();
2709 AliWarning("SPDTrackleter not available");
2715 //_____________________________________________________________________________
2716 Bool_t AliReconstruction::RunVertexFinder(AliESDEvent*& esd)
2718 // run the barrel tracking
2720 AliCodeTimerAuto("",0)
2722 AliVertexer *vertexer = CreateVertexer();
2723 if (!vertexer) return kFALSE;
2725 AliInfo(Form("running the ITS vertex finder: %s",vertexer->ClassName()));
2726 AliESDVertex* vertex = NULL;
2728 fLoader[0]->LoadRecPoints();
2729 TTree* cltree = fLoader[0]->TreeR();
2731 if(fDiamondProfileSPD) vertexer->SetVtxStart(fDiamondProfileSPD);
2732 vertex = vertexer->FindVertexForCurrentEvent(cltree);
2735 AliError("Can't get the ITS cluster tree");
2737 fLoader[0]->UnloadRecPoints();
2740 AliError("Can't get the ITS loader");
2743 AliWarning("Vertex not found");
2744 vertex = new AliESDVertex();
2745 vertex->SetName("default");
2748 vertex->SetName("reconstructed");
2753 vertex->GetXYZ(vtxPos);
2754 vertex->GetSigmaXYZ(vtxErr);
2756 esd->SetPrimaryVertexSPD(vertex);
2757 AliESDVertex *vpileup = NULL;
2758 Int_t novertices = 0;
2759 vpileup = vertexer->GetAllVertices(novertices);
2761 for (Int_t kk=1; kk<novertices; kk++)esd->AddPileupVertexSPD(&vpileup[kk]);
2764 // if SPD multiplicity has been determined, it is stored in the ESD
2765 AliMultiplicity *mult = vertexer->GetMultiplicity();
2766 if(mult)esd->SetMultiplicity(mult);
2768 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
2769 if (fTracker[iDet]) fTracker[iDet]->SetVertex(vtxPos, vtxErr);
2778 //_____________________________________________________________________________
2779 Bool_t AliReconstruction::RunMultFinder(AliESDEvent*& esd)
2781 // run the trackleter for multiplicity study
2783 AliCodeTimerAuto("",0)
2785 AliTrackleter *trackleter = CreateMultFinder();
2786 if (!trackleter) return kFALSE;
2788 AliInfo(Form("running the ITS multiplicity finder: %s",trackleter->ClassName()));
2791 fLoader[0]->LoadRecPoints();
2792 TTree* cltree = fLoader[0]->TreeR();
2794 trackleter->Reconstruct(esd,cltree);
2795 AliMultiplicity *mult = trackleter->GetMultiplicity();
2796 if(mult) esd->SetMultiplicity(mult);
2799 AliError("Can't get the ITS cluster tree");
2801 fLoader[0]->UnloadRecPoints();
2804 AliError("Can't get the ITS loader");
2812 //_____________________________________________________________________________
2813 Bool_t AliReconstruction::RunHLTTracking(AliESDEvent*& esd)
2815 // run the HLT barrel tracking
2817 AliCodeTimerAuto("",0)
2820 AliError("Missing runLoader!");
2824 AliInfo("running HLT tracking");
2826 // Get a pointer to the HLT reconstructor
2827 AliReconstructor *reconstructor = GetReconstructor(kNDetectors-1);
2828 if (!reconstructor) return kFALSE;
2831 for (Int_t iDet = 1; iDet >= 0; iDet--) {
2832 TString detName = fgkDetectorName[iDet];
2833 AliDebug(1, Form("%s HLT tracking", detName.Data()));
2834 reconstructor->SetOption(detName.Data());
2835 AliTracker *tracker = reconstructor->CreateTracker();
2837 AliWarning(Form("couldn't create a HLT tracker for %s", detName.Data()));
2838 if (fStopOnError) return kFALSE;
2842 Double_t vtxErr[3]={0.005,0.005,0.010};
2843 const AliESDVertex *vertex = esd->GetVertex();
2844 vertex->GetXYZ(vtxPos);
2845 tracker->SetVertex(vtxPos,vtxErr);
2847 fLoader[iDet]->LoadRecPoints("read");
2848 TTree* tree = fLoader[iDet]->TreeR();
2850 AliError(Form("Can't get the %s cluster tree", detName.Data()));
2853 tracker->LoadClusters(tree);
2855 if (tracker->Clusters2Tracks(esd) != 0) {
2856 AliError(Form("HLT %s Clusters2Tracks failed", fgkDetectorName[iDet]));
2860 tracker->UnloadClusters();
2868 //_____________________________________________________________________________
2869 Bool_t AliReconstruction::RunMuonTracking(AliESDEvent*& esd)
2871 // run the muon spectrometer tracking
2873 AliCodeTimerAuto("",0)
2876 AliError("Missing runLoader!");
2879 Int_t iDet = GetDetIndex("MUON"); // for MUON
2881 // Get a pointer to the MUON reconstructor
2882 AliReconstructor *reconstructor = GetReconstructor(iDet);
2883 if (!reconstructor) return kFALSE;
2886 TString detName = fgkDetectorName[iDet];
2887 AliDebug(1, Form("%s tracking", detName.Data()));
2888 AliTracker *tracker = reconstructor->CreateTracker();
2890 AliWarning(Form("couldn't create a tracker for %s", detName.Data()));
2895 fLoader[iDet]->LoadRecPoints("read");
2897 tracker->LoadClusters(fLoader[iDet]->TreeR());
2899 Int_t rv = tracker->Clusters2Tracks(esd);
2901 fLoader[iDet]->UnloadRecPoints();
2903 tracker->UnloadClusters();
2907 AliError(Form("%s Clusters2Tracks failed", fgkDetectorName[iDet]));
2915 //_____________________________________________________________________________
2916 Bool_t AliReconstruction::RunTracking(AliESDEvent*& esd,AliESDpid &PID)
2918 // run the barrel tracking
2919 static Int_t eventNr=0;
2920 AliCodeTimerAuto("",0)
2922 AliInfo("running tracking");
2924 // Set the event info which is used
2925 // by the trackers in order to obtain
2926 // information about read-out detectors,
2928 AliDebug(1, "Setting event info");
2929 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
2930 if (!fTracker[iDet]) continue;
2931 fTracker[iDet]->SetEventInfo(&fEventInfo);
2934 //Fill the ESD with the T0 info (will be used by the TOF)
2935 if (fReconstructor[11] && fLoader[11]) {
2936 fLoader[11]->LoadRecPoints("READ");
2937 TTree *treeR = fLoader[11]->TreeR();
2939 GetReconstructor(11)->FillESD((TTree *)NULL,treeR,esd);
2943 // pass 1: TPC + ITS inwards
2944 for (Int_t iDet = 1; iDet >= 0; iDet--) {
2945 if (!fTracker[iDet]) continue;
2946 AliDebug(1, Form("%s tracking", fgkDetectorName[iDet]));
2949 fLoader[iDet]->LoadRecPoints("read");
2950 AliSysInfo::AddStamp(Form("RLoadCluster%s_%d",fgkDetectorName[iDet],eventNr),iDet,1, eventNr);
2951 TTree* tree = fLoader[iDet]->TreeR();
2953 AliError(Form("Can't get the %s cluster tree", fgkDetectorName[iDet]));
2956 fTracker[iDet]->LoadClusters(tree);
2957 AliSysInfo::AddStamp(Form("TLoadCluster%s_%d",fgkDetectorName[iDet],eventNr), iDet,2, eventNr);
2959 if (fTracker[iDet]->Clusters2Tracks(esd) != 0) {
2960 AliError(Form("%s Clusters2Tracks failed", fgkDetectorName[iDet]));
2963 AliSysInfo::AddStamp(Form("Tracking0%s_%d",fgkDetectorName[iDet],eventNr), iDet,3,eventNr);
2964 // preliminary PID in TPC needed by the ITS tracker
2966 GetReconstructor(1)->FillESD((TTree*)NULL, (TTree*)NULL, esd);
2967 PID.MakePID(esd,kTRUE);
2968 AliSysInfo::AddStamp(Form("MakePID0%s_%d",fgkDetectorName[iDet],eventNr), iDet,4,eventNr);
2972 // pass 2: ALL backwards
2974 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
2975 if (!fTracker[iDet]) continue;
2976 AliDebug(1, Form("%s back propagation", fgkDetectorName[iDet]));
2979 if (iDet > 1) { // all except ITS, TPC
2981 fLoader[iDet]->LoadRecPoints("read");
2982 AliSysInfo::AddStamp(Form("RLoadCluster0%s_%d",fgkDetectorName[iDet],eventNr), iDet,1, eventNr);
2983 tree = fLoader[iDet]->TreeR();
2985 AliError(Form("Can't get the %s cluster tree", fgkDetectorName[iDet]));
2988 fTracker[iDet]->LoadClusters(tree);
2989 AliSysInfo::AddStamp(Form("TLoadCluster0%s_%d",fgkDetectorName[iDet],eventNr), iDet,2, eventNr);
2993 if (iDet>1) // start filling residuals for the "outer" detectors
2995 AliTracker::SetFillResiduals(fRecoParam.GetEventSpecie(), kTRUE);
2996 TObjArray ** arr = AliTracker::GetResidualsArray() ;
2998 AliRecoParam::EventSpecie_t es=fRecoParam.GetEventSpecie();
2999 TObjArray * elem = arr[AliRecoParam::AConvert(es)];
3000 if ( elem && (! elem->At(0)) ) {
3001 AliQADataMaker *qadm = AliQAManager::QAManager()->GetQADataMaker(AliQAv1::kGLOBAL);
3002 if (qadm) qadm->InitRecPointsForTracker() ;
3005 // AliSysInfo::AddStamp(Form("QAInitResid%s_%d",fgkDetectorName[iDet],eventNr), iDet,0, eventNr);
3007 if (fTracker[iDet]->PropagateBack(esd) != 0) {
3008 AliError(Form("%s backward propagation failed", fgkDetectorName[iDet]));
3011 AliSysInfo::AddStamp(Form("Tracking1%s_%d",fgkDetectorName[iDet],eventNr), iDet,3, eventNr);
3014 if (iDet > 3) { // all except ITS, TPC, TRD and TOF
3015 fTracker[iDet]->UnloadClusters();
3016 fLoader[iDet]->UnloadRecPoints();
3018 // updated PID in TPC needed by the ITS tracker -MI
3020 //GetReconstructor(1)->FillESD((TTree*)NULL, (TTree*)NULL, esd);
3021 //AliESDpid::MakePID(esd);
3022 PID.MakePID(esd,kTRUE);
3023 AliSysInfo::AddStamp(Form("MakePID1%s_%d",fgkDetectorName[iDet],eventNr), iDet,4,eventNr);
3027 //stop filling residuals for the "outer" detectors
3028 if (fRunGlobalQA) AliTracker::SetFillResiduals(fRecoParam.GetEventSpecie(), kFALSE);
3030 // pass 3: TRD + TPC + ITS refit inwards
3032 for (Int_t iDet = 2; iDet >= 0; iDet--) {
3033 if (!fTracker[iDet]) continue;
3034 AliDebug(1, Form("%s inward refit", fgkDetectorName[iDet]));
3037 if (iDet<2) // start filling residuals for TPC and ITS
3039 AliTracker::SetFillResiduals(fRecoParam.GetEventSpecie(), kTRUE);
3040 TObjArray ** arr = AliTracker::GetResidualsArray() ;
3042 AliRecoParam::EventSpecie_t es=fRecoParam.GetEventSpecie();
3043 TObjArray * elem = arr[AliRecoParam::AConvert(es)];
3044 if ( elem && (! elem->At(0)) ) {
3045 AliQADataMaker *qadm = AliQAManager::QAManager()->GetQADataMaker(AliQAv1::kGLOBAL);
3046 if (qadm) qadm->InitRecPointsForTracker() ;
3051 if (fTracker[iDet]->RefitInward(esd) != 0) {
3052 AliError(Form("%s inward refit failed", fgkDetectorName[iDet]));
3055 // run postprocessing
3056 if (fTracker[iDet]->PostProcess(esd) != 0) {
3057 AliError(Form("%s postprocessing failed", fgkDetectorName[iDet]));
3060 AliSysInfo::AddStamp(Form("Tracking2%s_%d",fgkDetectorName[iDet],eventNr), iDet,3, eventNr);
3063 // write space-points to the ESD in case alignment data output
3065 if (fWriteAlignmentData) {
3066 WriteAlignmentData(esd);
3067 AliSysInfo::AddStamp(Form("WrtAlignData_%d",eventNr), 0,0, eventNr);
3070 for (Int_t iDet = 3; iDet >= 0; iDet--) {
3071 if (!fTracker[iDet]) continue;
3073 fTracker[iDet]->UnloadClusters();
3074 AliSysInfo::AddStamp(Form("TUnloadCluster%s_%d",fgkDetectorName[iDet],eventNr), iDet,4, eventNr);
3075 fLoader[iDet]->UnloadRecPoints();
3076 AliSysInfo::AddStamp(Form("RUnloadCluster%s_%d",fgkDetectorName[iDet],eventNr), iDet,5, eventNr);
3078 // stop filling residuals for TPC and ITS
3079 if (fRunGlobalQA) AliTracker::SetFillResiduals(fRecoParam.GetEventSpecie(), kFALSE);
3085 //_____________________________________________________________________________
3086 Bool_t AliReconstruction::CleanESD(AliESDEvent *esd){
3088 // Remove the data which are not needed for the physics analysis.
3091 Int_t nTracks=esd->GetNumberOfTracks();
3092 Int_t nV0s=esd->GetNumberOfV0s();
3094 (Form("Number of ESD tracks and V0s before cleaning: %d %d",nTracks,nV0s));
3096 Float_t cleanPars[]={fV0DCAmax,fV0CsPmin,fDmax,fZmax};
3097 Bool_t rc=esd->Clean(cleanPars);
3099 nTracks=esd->GetNumberOfTracks();
3100 nV0s=esd->GetNumberOfV0s();
3102 (Form("Number of ESD tracks and V0s after cleaning %d %d",nTracks,nV0s));
3107 //_____________________________________________________________________________
3108 Bool_t AliReconstruction::FillESD(AliESDEvent*& esd, const TString& detectors)
3110 // fill the event summary data
3112 AliCodeTimerAuto("",0)
3113 static Int_t eventNr=0;
3114 TString detStr = detectors;
3116 AliSysInfo::AddStamp(Form("FillESDb%d",eventNr), -19,-19, eventNr);
3117 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
3118 if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
3119 AliReconstructor* reconstructor = GetReconstructor(iDet);
3120 if (!reconstructor) continue;
3121 AliDebug(1, Form("filling ESD for %s", fgkDetectorName[iDet]));
3122 TTree* clustersTree = NULL;
3123 if (fLoader[iDet]) {
3124 fLoader[iDet]->LoadRecPoints("read");
3125 clustersTree = fLoader[iDet]->TreeR();
3126 if (!clustersTree) {
3127 AliError(Form("Can't get the %s clusters tree",
3128 fgkDetectorName[iDet]));
3129 if (fStopOnError) return kFALSE;
3132 if (fRawReader && !reconstructor->HasDigitConversion()) {
3133 reconstructor->FillESD(fRawReader, clustersTree, esd);
3135 TTree* digitsTree = NULL;
3136 if (fLoader[iDet]) {
3137 fLoader[iDet]->LoadDigits("read");
3138 digitsTree = fLoader[iDet]->TreeD();
3140 AliError(Form("Can't get the %s digits tree",
3141 fgkDetectorName[iDet]));
3142 if (fStopOnError) return kFALSE;
3145 reconstructor->FillESD(digitsTree, clustersTree, esd);
3146 if (fLoader[iDet]) fLoader[iDet]->UnloadDigits();
3148 if (fLoader[iDet]) {
3149 fLoader[iDet]->UnloadRecPoints();
3153 if (!IsSelected("CTP", detStr)) AliDebug(10,"No CTP");
3154 if ((detStr.CompareTo("ALL") != 0) && !detStr.IsNull()) {
3155 AliError(Form("the following detectors were not found: %s",
3157 if (fStopOnError) return kFALSE;
3159 AliSysInfo::AddStamp(Form("FillESDe%d",eventNr), -20,-20, eventNr);
3164 //_____________________________________________________________________________
3165 Bool_t AliReconstruction::FillTriggerESD(AliESDEvent*& esd)
3167 // Reads the trigger decision which is
3168 // stored in Trigger.root file and fills
3169 // the corresponding esd entries
3171 AliCodeTimerAuto("",0)
3173 AliInfo("Filling trigger information into the ESD");
3176 AliCTPRawStream input(fRawReader);
3177 if (!input.Next()) {
3178 AliWarning("No valid CTP (trigger) DDL raw data is found ! The trigger info is taken from the event header!");
3181 if (esd->GetTriggerMask() != input.GetClassMask())
3182 AliError(Form("Invalid trigger pattern found in CTP raw-data: %llx %llx",
3183 input.GetClassMask(),esd->GetTriggerMask()));
3184 if (esd->GetOrbitNumber() != input.GetOrbitID())
3185 AliError(Form("Invalid orbit id found in CTP raw-data: %x %x",
3186 input.GetOrbitID(),esd->GetOrbitNumber()));
3187 if (esd->GetBunchCrossNumber() != input.GetBCID())
3188 AliError(Form("Invalid bunch-crossing id found in CTP raw-data: %x %x",
3189 input.GetBCID(),esd->GetBunchCrossNumber()));
3190 AliESDHeader* esdheader = esd->GetHeader();
3191 esdheader->SetL0TriggerInputs(input.GetL0Inputs());
3192 esdheader->SetL1TriggerInputs(input.GetL1Inputs());
3193 esdheader->SetL2TriggerInputs(input.GetL2Inputs());
3195 // UInt_t orbit=input.GetOrbitID();
3196 for(Int_t i=0 ; i<input.GetNIRs() ; i++ ) {
3197 esdheader->AddTriggerIR(input.GetIR(i));
3199 AliCentralTrigger* rlCTP = fRunLoader->GetTrigger();
3201 rlCTP->SetL0TriggerInputs(input.GetL0Inputs());
3202 rlCTP->SetL1TriggerInputs(input.GetL1Inputs());
3203 rlCTP->SetL2TriggerInputs(input.GetL2Inputs());
3206 if (fIsNewRunLoader) fRunLoader->TreeCT()->Fill();
3210 //_____________________________________________________________________________
3211 Bool_t AliReconstruction::FillTriggerScalers(AliESDEvent*& esd)
3214 //fRunScalers->Print();
3215 if(fRunScalers && fRunScalers->CheckRunScalers()){
3216 AliTimeStamp* timestamp = new AliTimeStamp(esd->GetOrbitNumber(), esd->GetPeriodNumber(), esd->GetBunchCrossNumber());
3217 //AliTimeStamp* timestamp = new AliTimeStamp(10308000, 0, (ULong64_t)486238);
3218 AliESDHeader* esdheader = fesd->GetHeader();
3219 for(Int_t i=0;i<50;i++){
3220 if((1ull<<i) & esd->GetTriggerMask()){
3221 AliTriggerScalersESD* scalesd = fRunScalers->GetScalersForEventClass( timestamp, i+1);
3222 if(scalesd)esdheader->SetTriggerScalersRecord(scalesd);
3225 const AliTriggerScalersRecordESD* scalrecEvent = fRunScalers->GetScalersDeltaForEvent( timestamp);
3226 const AliTriggerScalersRecordESD* scalrecRun = fRunScalers->GetScalersDeltaForRun();
3227 if (scalrecEvent) esdheader->SetTriggerScalersDeltaEvent(scalrecEvent);
3228 if (scalrecRun) esdheader->SetTriggerScalersDeltaRun(scalrecRun);
3232 //_____________________________________________________________________________
3233 Bool_t AliReconstruction::FillRawEventHeaderESD(AliESDEvent*& esd)
3236 // Filling information from RawReader Header
3239 if (!fRawReader) return kFALSE;
3241 AliInfo("Filling information from RawReader Header");
3243 esd->SetBunchCrossNumber(fRawReader->GetBCID());
3244 esd->SetOrbitNumber(fRawReader->GetOrbitID());
3245 esd->SetPeriodNumber(fRawReader->GetPeriod());
3247 esd->SetTimeStamp(fRawReader->GetTimestamp());
3248 esd->SetEventType(fRawReader->GetType());
3254 //_____________________________________________________________________________
3255 Bool_t AliReconstruction::IsSelected(TString detName, TString& detectors) const
3257 // check whether detName is contained in detectors
3258 // if yes, it is removed from detectors
3260 // check if all detectors are selected
3261 if ((detectors.CompareTo("ALL") == 0) ||
3262 detectors.BeginsWith("ALL ") ||
3263 detectors.EndsWith(" ALL") ||
3264 detectors.Contains(" ALL ")) {
3269 // search for the given detector
3270 Bool_t result = kFALSE;
3271 if ((detectors.CompareTo(detName) == 0) ||
3272 detectors.BeginsWith(detName+" ") ||
3273 detectors.EndsWith(" "+detName) ||
3274 detectors.Contains(" "+detName+" ")) {
3275 detectors.ReplaceAll(detName, "");
3279 // clean up the detectors string
3280 while (detectors.Contains(" ")) detectors.ReplaceAll(" ", " ");
3281 while (detectors.BeginsWith(" ")) detectors.Remove(0, 1);
3282 while (detectors.EndsWith(" ")) detectors.Remove(detectors.Length()-1, 1);
3287 //_____________________________________________________________________________
3288 Bool_t AliReconstruction::InitRunLoader()
3290 // get or create the run loader
3292 if (gAlice) delete gAlice;
3295 TFile *gafile = TFile::Open(fGAliceFileName.Data());
3296 // if (!gSystem->AccessPathName(fGAliceFileName.Data())) { // galice.root exists
3297 if (gafile) { // galice.root exists
3301 // load all base libraries to get the loader classes
3302 TString libs = gSystem->GetLibraries();
3303 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
3304 TString detName = fgkDetectorName[iDet];
3305 if (detName == "HLT") continue;
3306 if (libs.Contains("lib" + detName + "base.so")) continue;
3307 gSystem->Load("lib" + detName + "base.so");
3309 fRunLoader = AliRunLoader::Open(fGAliceFileName.Data());
3311 AliError(Form("no run loader found in file %s", fGAliceFileName.Data()));
3316 fRunLoader->CdGAFile();
3317 fRunLoader->LoadgAlice();
3319 //PH This is a temporary fix to give access to the kinematics
3320 //PH that is needed for the labels of ITS clusters
3321 fRunLoader->LoadHeader();
3322 fRunLoader->LoadKinematics();
3324 } else { // galice.root does not exist
3326 AliError(Form("the file %s does not exist", fGAliceFileName.Data()));
3328 fRunLoader = AliRunLoader::Open(fGAliceFileName.Data(),
3329 AliConfig::GetDefaultEventFolderName(),
3332 AliError(Form("could not create run loader in file %s",
3333 fGAliceFileName.Data()));
3337 fIsNewRunLoader = kTRUE;
3338 fRunLoader->MakeTree("E");
3339 fRunLoader->MakeTree("GG");
3341 if (fNumberOfEventsPerFile > 0)
3342 fRunLoader->SetNumberOfEventsPerFile(fNumberOfEventsPerFile);
3344 fRunLoader->SetNumberOfEventsPerFile((UInt_t)-1);
3350 //_____________________________________________________________________________
3351 AliReconstructor* AliReconstruction::GetReconstructor(Int_t iDet)
3353 // get the reconstructor object and the loader for a detector
3355 if (fReconstructor[iDet]) {
3356 if (fRecoParam.GetDetRecoParamArray(iDet) && !AliReconstructor::GetRecoParam(iDet)) {
3357 const AliDetectorRecoParam *par = fRecoParam.GetDetRecoParam(iDet);
3358 fReconstructor[iDet]->SetRecoParam(par);
3359 fReconstructor[iDet]->SetRunInfo(fRunInfo);
3361 return fReconstructor[iDet];
3364 // load the reconstructor object
3365 TPluginManager* pluginManager = gROOT->GetPluginManager();
3366 TString detName = fgkDetectorName[iDet];
3367 TString recName = "Ali" + detName + "Reconstructor";
3369 if (!fIsNewRunLoader && !fRunLoader->GetLoader(detName+"Loader") && (detName != "HLT")) return NULL;
3371 AliReconstructor* reconstructor = NULL;
3372 // first check if a plugin is defined for the reconstructor
3373 TPluginHandler* pluginHandler =
3374 pluginManager->FindHandler("AliReconstructor", detName);
3375 // if not, add a plugin for it
3376 if (!pluginHandler) {
3377 AliDebug(1, Form("defining plugin for %s", recName.Data()));
3378 TString libs = gSystem->GetLibraries();
3379 if (libs.Contains("lib" + detName + "base.so") ||
3380 (gSystem->Load("lib" + detName + "base.so") >= 0)) {
3381 pluginManager->AddHandler("AliReconstructor", detName,
3382 recName, detName + "rec", recName + "()");
3384 pluginManager->AddHandler("AliReconstructor", detName,
3385 recName, detName, recName + "()");
3387 pluginHandler = pluginManager->FindHandler("AliReconstructor", detName);
3389 if (pluginHandler && (pluginHandler->LoadPlugin() == 0)) {
3390 reconstructor = (AliReconstructor*) pluginHandler->ExecPlugin(0);
3393 // check if the upgrade reconstructor should be used instead of the standard one
3394 if(fUpgradeMask[iDet]) {
3395 if(reconstructor) delete reconstructor;
3396 TClass *cl = new TClass(Form("Ali%sUpgradeReconstructor",fgkDetectorName[iDet]));
3397 reconstructor = (AliReconstructor*)(cl->New());
3400 if (reconstructor) {
3401 TObject* obj = fOptions.FindObject(detName.Data());
3402 if (obj) reconstructor->SetOption(obj->GetTitle());
3403 reconstructor->SetRunInfo(fRunInfo);
3404 reconstructor->Init();
3405 fReconstructor[iDet] = reconstructor;
3408 // get or create the loader
3409 if (detName != "HLT") {
3410 fLoader[iDet] = fRunLoader->GetLoader(detName + "Loader");
3411 if (!fLoader[iDet]) {
3412 AliConfig::Instance()
3413 ->CreateDetectorFolders(fRunLoader->GetEventFolder(),
3415 // first check if a plugin is defined for the loader
3417 pluginManager->FindHandler("AliLoader", detName);
3418 // if not, add a plugin for it
3419 if (!pluginHandler) {
3420 TString loaderName = "Ali" + detName + "Loader";
3421 AliDebug(1, Form("defining plugin for %s", loaderName.Data()));
3422 pluginManager->AddHandler("AliLoader", detName,
3423 loaderName, detName + "base",
3424 loaderName + "(const char*, TFolder*)");
3425 pluginHandler = pluginManager->FindHandler("AliLoader", detName);
3427 if (pluginHandler && (pluginHandler->LoadPlugin() == 0)) {
3429 (AliLoader*) pluginHandler->ExecPlugin(2, detName.Data(),
3430 fRunLoader->GetEventFolder());
3432 if (!fLoader[iDet]) { // use default loader
3433 fLoader[iDet] = new AliLoader(detName, fRunLoader->GetEventFolder());
3435 if (!fLoader[iDet]) {
3436 AliWarning(Form("couldn't get loader for %s", detName.Data()));
3437 if (fStopOnError) return NULL;
3439 fRunLoader->AddLoader(fLoader[iDet]);
3440 fRunLoader->CdGAFile();
3441 if (gFile && !gFile->IsWritable()) gFile->ReOpen("UPDATE");
3442 fRunLoader->Write(0, TObject::kOverwrite);
3447 if (fRecoParam.GetDetRecoParamArray(iDet) && !AliReconstructor::GetRecoParam(iDet)) {
3448 const AliDetectorRecoParam *par = fRecoParam.GetDetRecoParam(iDet);
3449 if (reconstructor) {
3450 reconstructor->SetRecoParam(par);
3451 reconstructor->SetRunInfo(fRunInfo);
3454 return reconstructor;
3457 //_____________________________________________________________________________
3458 AliVertexer* AliReconstruction::CreateVertexer()
3460 // create the vertexer
3461 // Please note that the caller is the owner of the
3464 AliVertexer* vertexer = NULL;
3465 AliReconstructor* itsReconstructor = GetReconstructor(0);
3466 if (itsReconstructor && ((fRunLocalReconstruction.Contains("ITS")) ||
3467 fRunTracking.Contains("ITS") || fFillESD.Contains("ITS") )) {
3468 vertexer = itsReconstructor->CreateVertexer();
3471 AliWarning("couldn't create a vertexer for ITS");
3477 //_____________________________________________________________________________
3478 AliTrackleter* AliReconstruction::CreateMultFinder()
3480 // create the ITS trackleter for mult. estimation
3481 // Please note that the caller is the owner of the
3484 AliTrackleter* trackleter = NULL;
3485 AliReconstructor* itsReconstructor = GetReconstructor(0);
3486 if (itsReconstructor && ((fRunLocalReconstruction.Contains("ITS")) ||
3487 fRunTracking.Contains("ITS") || fFillESD.Contains("ITS") )) {
3488 trackleter = itsReconstructor->CreateMultFinder();
3491 AliWarning("ITS is not in reconstruction, switching off RunMultFinder");
3492 fRunMultFinder = kFALSE;
3498 //_____________________________________________________________________________
3499 Bool_t AliReconstruction::CreateTrackers(const TString& detectors)
3501 // create the trackers
3502 AliInfo("Creating trackers");
3504 TString detStr = detectors;
3505 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
3506 if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
3507 AliReconstructor* reconstructor = GetReconstructor(iDet);
3508 if (!reconstructor) continue;
3509 TString detName = fgkDetectorName[iDet];
3510 if (detName == "HLT") {
3511 fRunHLTTracking = kTRUE;
3514 if (detName == "MUON") {
3515 fRunMuonTracking = kTRUE;
3519 fTracker[iDet] = reconstructor->CreateTracker();
3520 if (!fTracker[iDet] && (iDet < 7)) {
3521 AliWarning(Form("couldn't create a tracker for %s", detName.Data()));
3522 if (fStopOnError) return kFALSE;
3524 AliSysInfo::AddStamp(Form("LTracker%s",fgkDetectorName[iDet]), iDet,0);
3530 //_____________________________________________________________________________
3531 void AliReconstruction::CleanUp()
3533 // delete trackers and the run loader and close and delete the file
3535 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
3536 delete fReconstructor[iDet];
3537 fReconstructor[iDet] = NULL;
3538 fLoader[iDet] = NULL;
3539 delete fTracker[iDet];
3540 fTracker[iDet] = NULL;
3547 delete fSPDTrackleter;
3548 fSPDTrackleter = NULL;
3557 delete fParentRawReader;
3558 fParentRawReader=NULL;
3566 if (AliQAManager::QAManager())
3567 AliQAManager::QAManager()->ShowQA() ;
3568 // AliQAManager::Destroy() ;
3573 void AliReconstruction::WriteAlignmentData(AliESDEvent* esd)
3575 // Write space-points which are then used in the alignment procedures
3576 // For the moment only ITS, TPC, TRD and TOF
3578 Int_t ntracks = esd->GetNumberOfTracks();
3579 for (Int_t itrack = 0; itrack < ntracks; itrack++)
3581 AliESDtrack *track = esd->GetTrack(itrack);
3584 for (Int_t i=0; i<200; ++i) idx[i] = -1; //PH avoid uninitialized values
3585 for (Int_t iDet = 5; iDet >= 0; iDet--) {// TOF, TRD, TPC, ITS clusters
3586 nsp += (iDet==GetDetIndex("TRD")) ? track->GetTRDntracklets():track->GetNcls(iDet);
3588 if (iDet==GetDetIndex("ITS")) { // ITS "extra" clusters
3589 track->GetClusters(iDet,idx);
3590 for (Int_t i=6; i<12; i++) if(idx[i] >= 0) nsp++;
3595 AliTrackPointArray *sp = new AliTrackPointArray(nsp);
3596 track->SetTrackPointArray(sp);
3598 for (Int_t iDet = 5; iDet >= 0; iDet--) {
3599 AliTracker *tracker = fTracker[iDet];
3600 if (!tracker) continue;
3601 Int_t nspdet = (iDet==GetDetIndex("TRD")) ? track->GetTRDtracklets(idx):track->GetClusters(iDet,idx);
3603 if (iDet==GetDetIndex("ITS")) // ITS "extra" clusters
3604 for (Int_t i=6; i<12; i++) if(idx[i] >= 0) nspdet++;
3606 if (nspdet <= 0) continue;
3610 while (isp2 < nspdet) {
3611 Bool_t isvalid=kTRUE;
3613 Int_t index=idx[isp++];
3614 if (index < 0) continue;
3616 TString dets = fgkDetectorName[iDet];
3617 if ((fUseTrackingErrorsForAlignment.CompareTo(dets) == 0) ||
3618 fUseTrackingErrorsForAlignment.BeginsWith(dets+" ") ||
3619 fUseTrackingErrorsForAlignment.EndsWith(" "+dets) ||
3620 fUseTrackingErrorsForAlignment.Contains(" "+dets+" ")) {
3621 isvalid = tracker->GetTrackPointTrackingError(index,p,track);
3623 isvalid = tracker->GetTrackPoint(index,p);
3626 if (!isvalid) continue;
3627 if (iDet==GetDetIndex("ITS") && (isp-1)>=6) p.SetExtra();
3628 sp->AddPoint(isptrack,&p); isptrack++;
3635 //_____________________________________________________________________________
3636 void AliReconstruction::FillRawDataErrorLog(Int_t iEvent, AliESDEvent* esd)
3638 // The method reads the raw-data error log
3639 // accumulated within the rawReader.
3640 // It extracts the raw-data errors related to
3641 // the current event and stores them into
3642 // a TClonesArray inside the esd object.
3644 if (!fRawReader) return;
3646 for(Int_t i = 0; i < fRawReader->GetNumberOfErrorLogs(); i++) {
3648 AliRawDataErrorLog *log = fRawReader->GetErrorLog(i);
3650 if (iEvent != log->GetEventNumber()) continue;
3652 esd->AddRawDataErrorLog(log);
3657 //_____________________________________________________________________________
3658 // void AliReconstruction::CheckQA()
3660 // check the QA of SIM for this run and remove the detectors
3661 // with status Fatal
3663 // TString newRunLocalReconstruction ;
3664 // TString newRunTracking ;
3665 // TString newFillESD ;
3667 // for (Int_t iDet = 0; iDet < AliQAv1::kNDET; iDet++) {
3668 // TString detName(AliQAv1::GetDetName(iDet)) ;
3669 // AliQAv1 * qa = AliQAv1::Instance(AliQAv1::DETECTORINDEX_t(iDet)) ;
3670 // if ( qa->IsSet(AliQAv1::DETECTORINDEX_t(iDet), AliQAv1::kSIM, specie, AliQAv1::kFATAL)) {
3671 // AliInfo(Form("QA status for %s %s in Hits and/or SDIGITS and/or Digits was Fatal; No reconstruction performed",
3672 // detName.Data(), AliRecoParam::GetEventSpecieName(es))) ;
3674 // if ( fRunLocalReconstruction.Contains(AliQAv1::GetDetName(iDet)) ||
3675 // fRunLocalReconstruction.Contains("ALL") ) {
3676 // newRunLocalReconstruction += detName ;
3677 // newRunLocalReconstruction += " " ;
3679 // if ( fRunTracking.Contains(AliQAv1::GetDetName(iDet)) ||
3680 // fRunTracking.Contains("ALL") ) {
3681 // newRunTracking += detName ;
3682 // newRunTracking += " " ;
3684 // if ( fFillESD.Contains(AliQAv1::GetDetName(iDet)) ||
3685 // fFillESD.Contains("ALL") ) {
3686 // newFillESD += detName ;
3687 // newFillESD += " " ;
3691 // fRunLocalReconstruction = newRunLocalReconstruction ;
3692 // fRunTracking = newRunTracking ;
3693 // fFillESD = newFillESD ;
3696 //_____________________________________________________________________________
3697 Int_t AliReconstruction::GetDetIndex(const char* detector)
3699 // return the detector index corresponding to detector
3701 for (index = 0; index < kNDetectors ; index++) {
3702 if ( strcmp(detector, fgkDetectorName[index]) == 0 )
3707 //_____________________________________________________________________________
3708 Bool_t AliReconstruction::FinishPlaneEff() {
3710 // Here execute all the necessary operationis, at the end of the tracking phase,
3711 // in case that evaluation of PlaneEfficiencies was required for some detector.
3712 // E.g., write into a DataBase file the PlaneEfficiency which have been evaluated.
3714 // This Preliminary version works only FOR ITS !!!!!
3715 // other detectors (TOF,TRD, etc. have to develop their specific codes)
3718 // Return: kTRUE if all operations have been done properly, kFALSE otherwise
3721 TString detStr = fLoadCDB;
3722 //for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
3723 for (Int_t iDet = 0; iDet < 1; iDet++) { // for the time being only ITS
3724 if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
3725 if(fTracker[iDet] && fTracker[iDet]->GetPlaneEff()) {
3726 AliPlaneEff *planeeff=fTracker[iDet]->GetPlaneEff();
3727 TString name=planeeff->GetName();
3729 TFile* pefile = TFile::Open(name, "RECREATE");
3730 ret=(Bool_t)planeeff->Write();
3732 if(planeeff->GetCreateHistos()) {
3733 TString hname=planeeff->GetName();
3734 hname+="Histo.root";
3735 ret*=planeeff->WriteHistosToFile(hname,"RECREATE");
3738 if(fSPDTrackleter) {
3739 AliPlaneEff *planeeff=fSPDTrackleter->GetPlaneEff();
3740 TString name="AliITSPlaneEffSPDtracklet.root";
3741 TFile* pefile = TFile::Open(name, "RECREATE");
3742 ret=(Bool_t)planeeff->Write();
3744 AliESDEvent *dummy=NULL;
3745 ret=(Bool_t)fSPDTrackleter->PostProcess(dummy); // take care of writing other files
3750 //_____________________________________________________________________________
3751 Bool_t AliReconstruction::InitPlaneEff() {
3753 // Here execute all the necessary operations, before of the tracking phase,
3754 // for the evaluation of PlaneEfficiencies, in case required for some detectors.
3755 // E.g., read from a DataBase file a first evaluation of the PlaneEfficiency
3756 // which should be updated/recalculated.
3758 // This Preliminary version will work only FOR ITS !!!!!
3759 // other detectors (TOF,TRD, etc. have to develop their specific codes)
3762 // Return: kTRUE if all operations have been done properly, kFALSE otherwise
3765 fSPDTrackleter = NULL;
3766 TString detStr = fLoadCDB;
3767 if (IsSelected(fgkDetectorName[0], detStr)) {
3768 AliReconstructor* itsReconstructor = GetReconstructor(0);
3769 if (itsReconstructor) {
3770 fSPDTrackleter = itsReconstructor->CreateTrackleter(); // this is NULL unless required in RecoParam
3772 if (fSPDTrackleter) {
3773 AliInfo("Trackleter for SPD has been created");
3779 //_____________________________________________________________________________
3780 Bool_t AliReconstruction::InitAliEVE()
3782 // This method should be called only in case
3783 // AliReconstruction is run
3784 // within the alieve environment.
3785 // It will initialize AliEVE in a way
3786 // so that it can visualize event processed
3787 // by AliReconstruction.
3788 // The return flag shows whenever the
3789 // AliEVE initialization was successful or not.
3791 TString macroStr(gSystem->Getenv("ALIEVE_ONLINE_MACRO"));
3793 if (macroStr.IsNull())
3794 macroStr.Form("%s/EVE/macros/alieve_online.C",gSystem->ExpandPathName("$ALICE_ROOT"));
3796 AliInfo(Form("Loading AliEVE macro: %s",macroStr.Data()));
3798 if (gROOT->LoadMacro(macroStr.Data()) != 0) return kFALSE;
3800 gROOT->ProcessLine("if (!AliEveEventManager::GetMaster()){new AliEveEventManager();AliEveEventManager::GetMaster()->AddNewEventCommand(\"alieve_online_on_new_event()\");gEve->AddEvent(AliEveEventManager::GetMaster());};");
3801 gROOT->ProcessLine("alieve_online_init()");
3806 //_____________________________________________________________________________
3807 void AliReconstruction::RunAliEVE()
3809 // Runs AliEVE visualisation of
3810 // the current event.
3811 // Should be executed only after
3812 // successful initialization of AliEVE.
3814 AliInfo("Running AliEVE...");
3815 gROOT->ProcessLine(Form("AliEveEventManager::GetMaster()->SetEvent((AliRunLoader*)%p,(AliRawReader*)%p,(AliESDEvent*)%p,(AliESDfriend*)%p);",fRunLoader,fRawReader,fesd,fesdf));
3819 //_____________________________________________________________________________
3820 Bool_t AliReconstruction::SetRunQA(TString detAndAction)
3822 // Allows to run QA for a selected set of detectors
3823 // and a selected set of tasks among RAWS, DIGITSR, RECPOINTS and ESDS
3824 // all selected detectors run the same selected tasks
3826 if (!detAndAction.Contains(":")) {
3827 AliError( Form("%s is a wrong syntax, use \"DetectorList:ActionList\" \n", detAndAction.Data()) ) ;
3831 Int_t colon = detAndAction.Index(":") ;
3832 fQADetectors = detAndAction(0, colon) ;
3833 fQATasks = detAndAction(colon+1, detAndAction.Sizeof() ) ;
3834 if (fQATasks.Contains("ALL") ) {
3835 fQATasks = Form("%d %d %d %d", AliQAv1::kRAWS, AliQAv1::kDIGITSR, AliQAv1::kRECPOINTS, AliQAv1::kESDS) ;
3837 fQATasks.ToUpper() ;
3839 if ( fQATasks.Contains("RAW") )
3840 tempo = Form("%d ", AliQAv1::kRAWS) ;
3841 if ( fQATasks.Contains("DIGIT") )
3842 tempo += Form("%d ", AliQAv1::kDIGITSR) ;
3843 if ( fQATasks.Contains("RECPOINT") )
3844 tempo += Form("%d ", AliQAv1::kRECPOINTS) ;
3845 if ( fQATasks.Contains("ESD") )
3846 tempo += Form("%d ", AliQAv1::kESDS) ;
3848 if (fQATasks.IsNull()) {
3849 AliInfo("No QA requested\n") ;
3854 TString tempo(fQATasks) ;
3855 tempo.ReplaceAll(Form("%d", AliQAv1::kRAWS), AliQAv1::GetTaskName(AliQAv1::kRAWS)) ;
3856 tempo.ReplaceAll(Form("%d", AliQAv1::kDIGITSR), AliQAv1::GetTaskName(AliQAv1::kDIGITSR)) ;
3857 tempo.ReplaceAll(Form("%d", AliQAv1::kRECPOINTS), AliQAv1::GetTaskName(AliQAv1::kRECPOINTS)) ;
3858 tempo.ReplaceAll(Form("%d", AliQAv1::kESDS), AliQAv1::GetTaskName(AliQAv1::kESDS)) ;
3859 AliInfo( Form("QA will be done on \"%s\" for \"%s\"\n", fQADetectors.Data(), tempo.Data()) ) ;
3864 //_____________________________________________________________________________
3865 Bool_t AliReconstruction::InitRecoParams()
3867 // The method accesses OCDB and retrieves all
3868 // the available reco-param objects from there.
3870 Bool_t isOK = kTRUE;
3872 if (fRecoParam.GetDetRecoParamArray(kNDetectors)) {
3873 AliInfo("Using custom GRP reconstruction parameters");
3876 AliInfo("Loading GRP reconstruction parameter objects");
3878 AliCDBPath path("GRP","Calib","RecoParam");
3879 AliCDBEntry *entry=AliCDBManager::Instance()->Get(path.GetPath());
3881 AliWarning("Couldn't find GRP RecoParam entry in OCDB");
3885 TObject *recoParamObj = entry->GetObject();
3886 if (dynamic_cast<TObjArray*>(recoParamObj)) {
3887 // GRP has a normal TobjArray of AliDetectorRecoParam objects
3888 // Registering them in AliRecoParam
3889 fRecoParam.AddDetRecoParamArray(kNDetectors,dynamic_cast<TObjArray*>(recoParamObj));
3891 else if (dynamic_cast<AliDetectorRecoParam*>(recoParamObj)) {
3892 // GRP has only onse set of reco parameters
3893 // Registering it in AliRecoParam
3894 AliInfo("Single set of GRP reconstruction parameters found");
3895 dynamic_cast<AliDetectorRecoParam*>(recoParamObj)->SetAsDefault();
3896 fRecoParam.AddDetRecoParam(kNDetectors,dynamic_cast<AliDetectorRecoParam*>(recoParamObj));
3899 AliError("No valid GRP RecoParam object found in the OCDB");
3906 TString detStr = fLoadCDB;
3907 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
3909 if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
3911 if (fRecoParam.GetDetRecoParamArray(iDet)) {
3912 AliInfo(Form("Using custom reconstruction parameters for detector %s",fgkDetectorName[iDet]));
3916 AliInfo(Form("Loading reconstruction parameter objects for detector %s",fgkDetectorName[iDet]));
3918 AliCDBPath path(fgkDetectorName[iDet],"Calib","RecoParam");
3919 AliCDBEntry *entry=AliCDBManager::Instance()->Get(path.GetPath());
3921 AliWarning(Form("Couldn't find RecoParam entry in OCDB for detector %s",fgkDetectorName[iDet]));
3925 TObject *recoParamObj = entry->GetObject();
3926 if (dynamic_cast<TObjArray*>(recoParamObj)) {
3927 // The detector has a normal TobjArray of AliDetectorRecoParam objects
3928 // Registering them in AliRecoParam
3929 fRecoParam.AddDetRecoParamArray(iDet,dynamic_cast<TObjArray*>(recoParamObj));
3931 else if (dynamic_cast<AliDetectorRecoParam*>(recoParamObj)) {
3932 // The detector has only onse set of reco parameters
3933 // Registering it in AliRecoParam
3934 AliInfo(Form("Single set of reconstruction parameters found for detector %s",fgkDetectorName[iDet]));
3935 dynamic_cast<AliDetectorRecoParam*>(recoParamObj)->SetAsDefault();
3936 fRecoParam.AddDetRecoParam(iDet,dynamic_cast<AliDetectorRecoParam*>(recoParamObj));
3939 AliError(Form("No valid RecoParam object found in the OCDB for detector %s",fgkDetectorName[iDet]));
3943 // FIX ME: We have to disable the unloading of reco-param CDB
3944 // entries because QA framework is using them. Has to be fix in
3945 // a way that the QA takes the objects already constructed in
3947 // AliCDBManager::Instance()->UnloadFromCache(path.GetPath());
3951 if (AliDebugLevel() > 0) fRecoParam.Print();
3956 //_____________________________________________________________________________
3957 Bool_t AliReconstruction::GetEventInfo()
3959 // Fill the event info object
3961 AliCodeTimerAuto("",0)
3963 AliCentralTrigger *aCTP = NULL;
3965 fEventInfo.SetEventType(fRawReader->GetType());
3967 ULong64_t mask = fRawReader->GetClassMask();
3968 fEventInfo.SetTriggerMask(mask);
3969 UInt_t clmask = fRawReader->GetDetectorPattern()[0];
3970 fEventInfo.SetTriggerCluster(AliDAQ::ListOfTriggeredDetectors(clmask));
3972 aCTP = new AliCentralTrigger();
3973 TString configstr("");
3974 if (!aCTP->LoadConfiguration(configstr)) { // Load CTP config from OCDB
3975 AliError("No trigger configuration found in OCDB! The trigger configuration information will not be used!");
3979 aCTP->SetClassMask(mask);
3980 aCTP->SetClusterMask(clmask);
3982 AliCentralTrigger* rlCTP = fRunLoader->GetTrigger();
3984 rlCTP->SetClassMask(mask);
3985 rlCTP->SetClusterMask(clmask);
3989 fEventInfo.SetEventType(AliRawEventHeaderBase::kPhysicsEvent);
3991 if (fRunLoader && (!fRunLoader->LoadTrigger())) {
3992 aCTP = fRunLoader->GetTrigger();
3993 fEventInfo.SetTriggerMask(aCTP->GetClassMask());
3994 // get inputs from actp - just get
3995 AliESDHeader* esdheader = fesd->GetHeader();
3996 esdheader->SetL0TriggerInputs(aCTP->GetL0TriggerInputs());
3997 esdheader->SetL1TriggerInputs(aCTP->GetL1TriggerInputs());
3998 esdheader->SetL2TriggerInputs(aCTP->GetL2TriggerInputs());
3999 fEventInfo.SetTriggerCluster(AliDAQ::ListOfTriggeredDetectors(aCTP->GetClusterMask()));
4002 AliWarning("No trigger can be loaded! The trigger information will not be used!");
4007 AliTriggerConfiguration *config = aCTP->GetConfiguration();
4009 AliError("No trigger configuration has been found! The trigger configuration information will not be used!");
4010 if (fRawReader) delete aCTP;
4014 UChar_t clustmask = 0;
4016 ULong64_t trmask = fEventInfo.GetTriggerMask();
4017 const TObjArray& classesArray = config->GetClasses();
4018 Int_t nclasses = classesArray.GetEntriesFast();
4019 for( Int_t iclass=0; iclass < nclasses; iclass++ ) {
4020 AliTriggerClass* trclass = (AliTriggerClass*)classesArray.At(iclass);
4021 if (trclass && trclass->GetMask()>0) {
4022 Int_t trindex = TMath::Nint(TMath::Log2(trclass->GetMask()));
4023 fesd->SetTriggerClass(trclass->GetName(),trindex);
4024 if (fRawReader) fRawReader->LoadTriggerClass(trclass->GetName(),trindex);
4025 if (trmask & (1ull << trindex)) {
4027 trclasses += trclass->GetName();
4029 clustmask |= trclass->GetCluster()->GetClusterMask();
4033 fEventInfo.SetTriggerClasses(trclasses);
4034 // Now put the declared trigger classes (not present in the run)
4035 // to 0/false in the event selection
4036 if (!fDeclTriggerClasses.IsNull()) {
4037 TObjArray *tokens = fDeclTriggerClasses.Tokenize(" ");
4038 Int_t ntokens = tokens->GetEntriesFast();
4039 for (Int_t itoken = 0; itoken < ntokens; ++itoken) {
4040 if (fRawReader) fRawReader->LoadTriggerClass((((TObjString*)tokens->At(itoken))->String()).Data(),-1);
4045 // Write names of active trigger inputs in ESD Header
4046 const TObjArray& inputsArray = config->GetInputs();
4047 Int_t ninputs = inputsArray.GetEntriesFast();
4048 for( Int_t iinput=0; iinput < ninputs; iinput++ ) {
4049 AliTriggerInput* trginput = (AliTriggerInput*)inputsArray.At(iinput);
4050 if (trginput && trginput->GetMask()>0) {
4051 Int_t inputIndex = (Int_t)TMath::Nint(TMath::Log2(trginput->GetMask()));
4052 AliESDHeader* headeresd = fesd->GetHeader();
4053 Int_t trglevel = (Int_t)trginput->GetLevel();
4054 if (trglevel == 0) headeresd->SetActiveTriggerInputs(trginput->GetInputName(), inputIndex);
4055 if (trglevel == 1) headeresd->SetActiveTriggerInputs(trginput->GetInputName(), inputIndex+24);
4056 if (trglevel == 2) headeresd->SetActiveTriggerInputs(trginput->GetInputName(), inputIndex+48);
4060 // Set the information in ESD
4061 fesd->SetTriggerMask(trmask);
4062 fesd->SetTriggerCluster(clustmask);
4064 if (!aCTP->CheckTriggeredDetectors()) {
4065 if (fRawReader) delete aCTP;
4069 if (fRawReader) delete aCTP;
4071 // We have to fill also the HLT decision here!!
4077 const char *AliReconstruction::MatchDetectorList(const char *detectorList, UInt_t detectorMask)
4079 // Match the detector list found in the rec.C or the default 'ALL'
4080 // to the list found in the GRP (stored there by the shuttle PP which
4081 // gets the information from ECS)
4082 static TString resultList;
4083 TString detList = detectorList;
4087 for(Int_t iDet = 0; iDet < (AliDAQ::kNDetectors-1); iDet++) {
4088 if ((detectorMask >> iDet) & 0x1) {
4089 TString det = AliDAQ::OfflineModuleName(iDet);
4090 if ((detList.CompareTo("ALL") == 0) ||
4091 ((detList.BeginsWith("ALL ") ||
4092 detList.EndsWith(" ALL") ||
4093 detList.Contains(" ALL ")) &&
4094 !(detList.BeginsWith("-"+det+" ") ||
4095 detList.EndsWith(" -"+det) ||
4096 detList.Contains(" -"+det+" "))) ||
4097 (detList.CompareTo(det) == 0) ||
4098 detList.BeginsWith(det+" ") ||
4099 detList.EndsWith(" "+det) ||
4100 detList.Contains( " "+det+" " )) {
4101 if (!resultList.EndsWith(det + " ")) {
4110 if ((detectorMask >> AliDAQ::kHLTId) & 0x1) {
4111 TString hltDet = AliDAQ::OfflineModuleName(AliDAQ::kNDetectors-1);
4112 if ((detList.CompareTo("ALL") == 0) ||
4113 ((detList.BeginsWith("ALL ") ||
4114 detList.EndsWith(" ALL") ||
4115 detList.Contains(" ALL ")) &&
4116 !(detList.BeginsWith("-"+hltDet+" ") ||
4117 detList.EndsWith(" -"+hltDet) ||
4118 detList.Contains(" -"+hltDet+" "))) ||
4119 (detList.CompareTo(hltDet) == 0) ||
4120 detList.BeginsWith(hltDet+" ") ||
4121 detList.EndsWith(" "+hltDet) ||
4122 detList.Contains( " "+hltDet+" " )) {
4123 resultList += hltDet;
4127 return resultList.Data();
4131 //______________________________________________________________________________
4132 void AliReconstruction::Abort(const char *method, EAbort what)
4134 // Abort processing. If what = kAbortProcess, the Process() loop will be
4135 // aborted. If what = kAbortFile, the current file in a chain will be
4136 // aborted and the processing will continue with the next file, if there
4137 // is no next file then Process() will be aborted. Abort() can also be
4138 // called from Begin(), SlaveBegin(), Init() and Notify(). After abort
4139 // the SlaveTerminate() and Terminate() are always called. The abort flag
4140 // can be checked in these methods using GetAbort().
4142 // The method is overwritten in AliReconstruction for better handling of
4143 // reco specific errors
4145 if (!fStopOnError) return;
4149 TString whyMess = method;
4150 whyMess += " failed! Aborting...";
4152 AliError(whyMess.Data());
4155 TString mess = "Abort";
4156 if (fAbort == kAbortProcess)
4157 mess = "AbortProcess";
4158 else if (fAbort == kAbortFile)
4161 Info(mess.Data(), "%s", whyMess.Data());
4164 //______________________________________________________________________________
4165 Bool_t AliReconstruction::ProcessEvent(void* event)
4167 // Method that is used in case the event loop
4168 // is steered from outside, for example by AMORE
4169 // 'event' is a pointer to the DATE event in the memory
4171 if (fRawReader) delete fRawReader;
4172 fRawReader = new AliRawReaderDate(event);
4173 fStatus = ProcessEvent(fRunLoader->GetNumberOfEvents());
4180 //______________________________________________________________________________
4181 Bool_t AliReconstruction::ParseOutput()
4183 // The method parses the output file
4184 // location string in order to steer
4185 // properly the selector
4187 TPMERegexp re1("(\\w+\\.zip#\\w+\\.root):([,*\\w+\\.root,*]+)@dataset://(\\w++)");
4188 TPMERegexp re2("(\\w+\\.root)?@?dataset://(\\w++)");
4190 if (re1.Match(fESDOutput) == 4) {
4191 // root archive with output files stored and regustered
4193 gProof->AddInput(new TNamed("PROOF_OUTPUTFILE",re1[1].Data()));
4194 gProof->AddInput(new TNamed("PROOF_OUTPUTFILE_LOCATION",re1[3].Data()));
4195 gProof->AddInput(new TNamed("PROOF_OUTPUTFILE_DATASET",""));
4196 gProof->AddInput(new TNamed("PROOF_OUTPUTFILE_ARCHIVE",re1[2].Data()));
4197 AliInfo(Form("%s files will be stored within %s in dataset %s",
4202 else if (re2.Match(fESDOutput) == 3) {
4203 // output file stored and registered
4205 gProof->AddInput(new TNamed("PROOF_OUTPUTFILE",(re2[1].IsNull()) ? "AliESDs.root" : re2[1].Data()));
4206 gProof->AddInput(new TNamed("PROOF_OUTPUTFILE_LOCATION",re2[2].Data()));
4207 gProof->AddInput(new TNamed("PROOF_OUTPUTFILE_DATASET",""));
4208 AliInfo(Form("%s will be stored in dataset %s",
4209 (re2[1].IsNull()) ? "AliESDs.root" : re2[1].Data(),
4213 if (fESDOutput.IsNull()) {
4214 // Output location not given.
4215 // Assuming xrootd has been already started and
4216 // the output file has to be sent back
4217 // to the client machine
4218 TString esdUrl(Form("root://%s/%s/",
4219 TUrl(gSystem->HostName()).GetHostFQDN(),
4221 gProof->AddInput(new TNamed("PROOF_OUTPUTFILE","AliESDs.root"));
4222 gProof->AddInput(new TNamed("PROOF_OUTPUTFILE_LOCATION",esdUrl.Data()));
4223 AliInfo(Form("AliESDs.root will be stored in %s",
4227 // User specified an output location.
4228 // Ones has just to parse it here
4229 TUrl outputUrl(fESDOutput.Data());
4230 TString outputFile(gSystem->BaseName(outputUrl.GetFile()));
4231 gProof->AddInput(new TNamed("PROOF_OUTPUTFILE",outputFile.IsNull() ? "AliESDs.root" : outputFile.Data()));
4232 TString outputLocation(outputUrl.GetUrl());
4233 outputLocation.ReplaceAll(outputFile.Data(),"");
4234 gProof->AddInput(new TNamed("PROOF_OUTPUTFILE_LOCATION",outputLocation.Data()));
4235 AliInfo(Form("%s will be stored in %s",
4236 outputFile.IsNull() ? "AliESDs.root" : outputFile.Data(),
4237 outputLocation.Data()));
4244 //______________________________________________________________________________
4245 Bool_t AliReconstruction::IsHighPt() const {
4246 // Selection of events containing "high" pT tracks
4247 // If at least one track is found within 1.5 and 100 GeV (pT)
4248 // that was reconstructed by both ITS and TPC, the event is accepted
4251 const Double_t pTmin = 1.5;
4252 const Double_t pTmax = 100;
4254 mask |= (AliESDtrack::kITSrefit);
4255 mask |= (AliESDtrack::kTPCrefit);
4256 const Double_t pTminCosmic = 5.;
4257 const Double_t pTmaxCosmic = 100;
4258 ULong_t maskCosmic = 0;
4259 Int_t cosmicCount=0;
4260 maskCosmic |= (AliESDtrack::kTPCrefit);
4262 Bool_t isOK = kFALSE;
4264 if (fesd && fesd->GetEventType()==AliRawEventHeaderBase::kPhysicsEvent) {
4265 // Check if this ia a physics event (code 7)
4266 Int_t ntrk = fesd->GetNumberOfTracks();
4267 for (Int_t itrk=0; itrk<ntrk; ++itrk) {
4269 AliESDtrack * trk = fesd->GetTrack(itrk);
4271 && trk->Pt() > pTmin
4272 && trk->Pt() < pTmax
4273 && (trk->GetStatus() & mask) == mask ) {
4279 && trk->GetInnerParam()
4280 && trk->GetInnerParam()->Pt() > pTminCosmic
4281 && trk->GetInnerParam()->Pt() < pTmaxCosmic
4282 && (trk->GetStatus() & maskCosmic) == maskCosmic ) {
4288 if (cosmicCount>1) isOK=kTRUE;
4293 //______________________________________________________________________________
4294 Bool_t AliReconstruction::IsCosmicOrCalibSpecie() const {
4295 // Select cosmic or calibration events
4297 Bool_t isOK = kFALSE;
4299 if (fesd && fesd->GetEventType()==AliRawEventHeaderBase::kPhysicsEvent) {
4300 // Check if this ia a physics event (code 7)
4302 UInt_t specie = fesd->GetEventSpecie();
4303 if (specie==AliRecoParam::kCosmic || specie==AliRecoParam::kCalib) {
4310 //______________________________________________________________________________
4311 void AliReconstruction::WriteESDfriend() {
4312 // Fill the ESD friend in the tree. The required fraction of ESD friends is stored
4313 // in fFractionFriends. We select events where we store the ESD friends according
4314 // to the following algorithm:
4315 // 1. Store all Cosmic or Calibration events within the required fraction
4316 // 2. Sample "high Pt" events within the remaining fraction after step 1.
4317 // 3. Sample randomly events if we still have remaining slot
4320 Bool_t isSelected = kFALSE;
4322 // Store all friends for B field OFF
4323 if (TMath::Abs(AliTrackerBase::GetBz())<0.5) isSelected=kTRUE;
4325 if (IsCosmicOrCalibSpecie()) { // Selection of calib or cosmic events
4332 Double_t remainingFraction = fFractionFriends;
4333 remainingFraction -= ((Double_t)(fSspecie)/(Double_t)(fNall));
4335 if (IsHighPt()) { // Selection of "high Pt" events
4337 Double_t curentHighPtFraction = ((Double_t)(fNhighPt+1))/((Double_t)(fNall+1));
4338 // "Bayesian" estimate supposing that without events all the events are of the required type
4341 Double_t rnd = gRandom->Rndm()*curentHighPtFraction;
4342 if (rnd<remainingFraction) {
4348 remainingFraction -= ((Double_t)(fShighPt)/(Double_t)(fNall));
4350 // Random selection to fill the remaining fraction (if any)
4352 Double_t rnd = gRandom->Rndm();
4353 if (rnd<remainingFraction) {
4359 fesdf->~AliESDfriend();
4360 new (fesdf) AliESDfriend(); // Reset...
4361 fesdf->SetSkipBit(kTRUE);
4367 //_________________________________________________________________
4368 void AliReconstruction::DeleteDigits(const TString& detectors)
4370 // delete requested digit files produced at current event
4371 static int iEvent = 0;
4372 if (detectors.IsNull()) return;
4373 TString detStr = detectors;
4374 AliInfo(Form("Deleting Digits: %s",detectors.Data()));
4376 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
4377 gSystem->Exec(Form("if [ -e %s.Digits.root ]; then\nrm %s.Digits.root\nfi",
4378 fgkDetectorName[iDet],fgkDetectorName[iDet]));
4380 AliSysInfo::AddStamp(Form("DelDigits_%d",iEvent), 0,0,iEvent);
4384 //_________________________________________________________________
4385 void AliReconstruction::DeleteRecPoints(const TString& detectors)
4387 // delete requested recpoint files produced at current event
4388 static int iEvent = 0;
4389 if (detectors.IsNull()) return;
4390 TString detStr = detectors;
4391 AliInfo(Form("Deleting Recpoints: %s",detectors.Data()));
4393 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
4394 gSystem->Exec(Form("if [ -e %s.RecPoints.root ]; then\nrm %s.RecPoints.root\nfi",
4395 fgkDetectorName[iDet],fgkDetectorName[iDet]));
4397 AliSysInfo::AddStamp(Form("DelRecPoints_%d",iEvent), 0,0,iEvent);
4401 //_________________________________________________________________
4402 void AliReconstruction::SetStopOnResourcesExcess(Int_t vRSS,Int_t vVMEM)
4404 // require checking the resources left and stopping on excess
4405 // if 0 : no check is done
4406 // if >0 : stop reconstruction if exceeds this value
4407 // if <0 : use as margin to system limits
4409 const int kKB2MB = 1024;
4410 const int kInfMem = 9999999;
4413 int pgSize = getpagesize();
4417 AliInfo(Form("Setting max. RSS usage to user value %d MB",fMaxRSS));
4420 getrlimit(RLIMIT_RSS,&r);
4421 fMaxRSS = r.rlim_max==RLIM_INFINITY ? kInfMem : int(r.rlim_max*pgSize/kKB2MB/kKB2MB) + vRSS;
4422 AliInfo(Form("Setting max. RSS usage to system hard limit %d%s MB (%d margin)",fMaxRSS,r.rlim_max==RLIM_INFINITY ? "(inf)":"",-vRSS));
4424 else {AliInfo("No check on RSS memory usage will be applied");}
4428 AliInfo(Form("Setting max. VMEM usage to user value %d MB",fMaxVMEM));
4431 getrlimit(RLIMIT_AS,&r);
4432 fMaxVMEM = r.rlim_max==RLIM_INFINITY ? kInfMem : int(r.rlim_max*pgSize/kKB2MB/kKB2MB) + vVMEM;
4433 AliInfo(Form("Setting max. VMEM usage to system hard limit %d%s MB (%d margin)",fMaxVMEM,r.rlim_max==RLIM_INFINITY ? "(inf)":"",-vVMEM));
4435 else {AliInfo("No check on RSS memory usage will be applied");}
4439 //_________________________________________________________________
4440 Bool_t AliReconstruction::HasEnoughResources(int ev)
4442 // check if process consumed more than allowed resources
4443 const int kKB2MB = 1024;
4445 if (!fMaxRSS && !fMaxVMEM) return res;
4447 ProcInfo_t procInfo;
4448 gSystem->GetProcInfo(&procInfo);
4449 if (procInfo.fMemResident/kKB2MB > fMaxRSS) res = kFALSE;
4450 if (procInfo.fMemVirtual/kKB2MB > fMaxVMEM) res = kFALSE;
4453 AliInfo(Form("Job exceeded allowed limits: RSS:%d (%d) VMEM:%d (%d), will stop",
4454 int(procInfo.fMemResident/kKB2MB),fMaxRSS,
4455 int(procInfo.fMemVirtual/kKB2MB) ,fMaxVMEM));
4457 gSystem->Exec(Form("if [ -e %s ]; then\nrm %s\nfi\necho %d > %s",fgkStopEvFName,fgkStopEvFName,ev,fgkStopEvFName));