1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
18 ///////////////////////////////////////////////////////////////////////////////
20 // class for running the reconstruction //
22 // Clusters and tracks are created for all detectors and all events by //
25 // AliReconstruction rec; //
28 // The Run method returns kTRUE in case of successful execution. //
30 // If the input to the reconstruction are not simulated digits but raw data, //
31 // this can be specified by an argument of the Run method or by the method //
33 // rec.SetInput("..."); //
35 // The input formats and the corresponding argument are: //
36 // - DDL raw data files: directory name, ends with "/" //
37 // - raw data root file: root file name, extension ".root" //
38 // - raw data DATE file: DATE file name, any other non-empty string //
39 // - MC root files : empty string, default //
41 // By default all events are reconstructed. The reconstruction can be //
42 // limited to a range of events by giving the index of the first and the //
43 // last event as an argument to the Run method or by calling //
45 // rec.SetEventRange(..., ...); //
47 // The index -1 (default) can be used for the last event to indicate no //
48 // upper limit of the event range. //
50 // In case of raw-data reconstruction the user can modify the default //
51 // number of events per digits/clusters/tracks file. In case the option //
52 // is not used the number is set 1. In case the user provides 0, than //
53 // the number of events is equal to the number of events inside the //
54 // raw-data file (i.e. one digits/clusters/tracks file): //
56 // rec.SetNumberOfEventsPerFile(...); //
59 // The name of the galice file can be changed from the default //
60 // "galice.root" by passing it as argument to the AliReconstruction //
61 // constructor or by //
63 // rec.SetGAliceFile("..."); //
65 // The local reconstruction can be switched on or off for individual //
68 // rec.SetRunLocalReconstruction("..."); //
70 // The argument is a (case sensitive) string with the names of the //
71 // detectors separated by a space. The special string "ALL" selects all //
72 // available detectors. This is the default. //
74 // The reconstruction of the primary vertex position can be switched off by //
76 // rec.SetRunVertexFinder(kFALSE); //
78 // The tracking and the creation of ESD tracks can be switched on for //
79 // selected detectors by //
81 // rec.SetRunTracking("..."); //
83 // Uniform/nonuniform field tracking switches (default: uniform field) //
85 // rec.SetUniformFieldTracking(); ( rec.SetUniformFieldTracking(kFALSE); ) //
87 // The filling of additional ESD information can be steered by //
89 // rec.SetFillESD("..."); //
91 // Again, for both methods the string specifies the list of detectors. //
92 // The default is "ALL". //
94 // The call of the shortcut method //
96 // rec.SetRunReconstruction("..."); //
98 // is equivalent to calling SetRunLocalReconstruction, SetRunTracking and //
99 // SetFillESD with the same detector selecting string as argument. //
101 // The reconstruction requires digits or raw data as input. For the creation //
102 // of digits and raw data have a look at the class AliSimulation. //
104 // The input data of a detector can be replaced by the corresponding HLT //
105 // data by calling (usual detector string) //
106 // SetUseHLTData("..."); //
109 ///////////////////////////////////////////////////////////////////////////////
116 #include <TGeoGlobalMagField.h>
117 #include <TGeoManager.h>
119 #include <TLorentzVector.h>
121 #include <TObjArray.h>
122 #include <TPRegexp.h>
123 #include <TParameter.h>
124 #include <TPluginManager.h>
126 #include <TProofOutputFile.h>
129 #include <THashTable.h>
131 #include <TMessage.h>
134 #include <THashList.h>
136 #include "AliAlignObj.h"
137 #include "AliAnalysisManager.h"
138 #include "AliAnalysisDataContainer.h"
139 #include "AliCDBEntry.h"
140 #include "AliCDBManager.h"
141 #include "AliCDBStorage.h"
142 #include "AliCTPRawStream.h"
143 #include "AliCascadeVertexer.h"
144 #include "AliCentralTrigger.h"
145 #include "AliCodeTimer.h"
147 #include "AliDetectorRecoParam.h"
148 #include "AliESDCaloCells.h"
149 #include "AliESDCaloCluster.h"
150 #include "AliESDEvent.h"
151 #include "AliESDMuonTrack.h"
152 #include "AliESDPmdTrack.h"
153 #include "AliESDTagCreator.h"
154 #include "AliESDVertex.h"
155 #include "AliESDcascade.h"
156 #include "AliESDfriend.h"
157 #include "AliESDkink.h"
158 #include "AliESDpid.h"
159 #include "AliESDtrack.h"
160 #include "AliESDtrack.h"
161 #include "AliEventInfo.h"
162 #include "AliGRPObject.h"
163 #include "AliGRPRecoParam.h"
164 #include "AliGenEventHeader.h"
165 #include "AliGeomManager.h"
166 #include "AliGlobalQADataMaker.h"
167 #include "AliHeader.h"
170 #include "AliMultiplicity.h"
172 #include "AliPlaneEff.h"
174 #include "AliQADataMakerRec.h"
175 #include "AliQAManager.h"
176 #include "AliRawVEvent.h"
177 #include "AliRawEventHeaderBase.h"
178 #include "AliRawHLTManager.h"
179 #include "AliRawReaderDate.h"
180 #include "AliRawReaderFile.h"
181 #include "AliRawReaderRoot.h"
182 #include "AliRecoInputHandler.h"
183 #include "AliReconstruction.h"
184 #include "AliReconstructor.h"
186 #include "AliRunInfo.h"
187 #include "AliRunLoader.h"
188 #include "AliSysInfo.h" // memory snapshots
189 #include "AliTrackPointArray.h"
190 #include "AliTracker.h"
191 #include "AliTriggerClass.h"
192 #include "AliTriggerCluster.h"
193 #include "AliTriggerIR.h"
194 #include "AliTriggerConfiguration.h"
195 #include "AliV0vertexer.h"
196 #include "AliVertexer.h"
197 #include "AliTrackleter.h"
198 #include "AliVertexerTracks.h"
199 #include "AliTriggerRunScalers.h"
200 #include "AliCTPTimeParams.h"
201 #include "AliESDHLTDecision.h"
202 #include "AliTriggerInput.h"
203 #include "AliLHCData.h"
204 #include "ARVersion.h"
205 #include <RVersion.h>
207 #include <sys/resource.h>
208 ClassImp(AliReconstruction)
210 //_____________________________________________________________________________
211 const char* AliReconstruction::fgkStopEvFName = "_stopEvent_";
212 const char* AliReconstruction::fgkDetectorName[AliReconstruction::kNDetectors] = {"ITS", "TPC", "TRD", "TOF", "PHOS", "HMPID", "EMCAL", "MUON", "FMD", "ZDC", "PMD", "T0", "VZERO", "ACORDE"
213 // #ifdef MFT_UPGRADE
220 //_____________________________________________________________________________
221 AliReconstruction::AliReconstruction(const char* gAliceFilename) :
223 fRunVertexFinder(kTRUE),
224 fRunVertexFinderTracks(kTRUE),
225 fRunHLTTracking(kFALSE),
226 fRunMuonTracking(kFALSE),
228 fRunCascadeFinder(kTRUE),
229 fRunMultFinder(kTRUE),
231 fWriteAlignmentData(kFALSE),
232 fWriteESDfriend(kFALSE),
233 fFillTriggerESD(kTRUE),
241 fRunLocalReconstruction("ALL"),
244 fDeleteRecPoints(""),
247 fUseTrackingErrorsForAlignment(""),
248 fGAliceFileName(gAliceFilename),
251 fProofOutputFileName(""),
252 fProofOutputLocation(""),
253 fProofOutputDataset(kFALSE),
254 fProofOutputArchive(""),
258 fNumberOfEventsPerFile((UInt_t)-1),
259 fFractionFriends(0.04),
261 fLoadAlignFromCDB(kTRUE),
262 fLoadAlignData("ALL"),
267 fCTPTimeParams(NULL),
272 fParentRawReader(NULL),
276 fSPDTrackleter(NULL),
278 fDiamondProfileSPD(NULL),
279 fDiamondProfile(NULL),
280 fDiamondProfileTPC(NULL),
281 fListOfCosmicTriggers(NULL),
285 fAlignObjArray(NULL),
289 fInitCDBCalled(kFALSE),
290 fCDBSnapshotMode(kFALSE),
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 fCDBSnapshotMode(rec.fCDBSnapshotMode),
416 fSetRunNumberFromDataCalled(rec.fSetRunNumberFromDataCalled),
417 fQADetectors(rec.fQADetectors),
418 fQATasks(rec.fQATasks),
420 fRunGlobalQA(rec.fRunGlobalQA),
421 fSameQACycle(rec.fSameQACycle),
422 fInitQACalled(rec.fInitQACalled),
423 fWriteQAExpertData(rec.fWriteQAExpertData),
424 fRunPlaneEff(rec.fRunPlaneEff),
435 fIsNewRunLoader(rec.fIsNewRunLoader),
444 fAnalysisMacro(rec.fAnalysisMacro),
447 fDeclTriggerClasses(rec.fDeclTriggerClasses),
454 for (Int_t i = 0; i < rec.fOptions.GetEntriesFast(); i++) {
455 if (rec.fOptions[i]) fOptions.Add(rec.fOptions[i]->Clone());
457 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
458 fReconstructor[iDet] = NULL;
459 fUpgradeMask[iDet] = kFALSE;
460 fLoader[iDet] = NULL;
461 fTracker[iDet] = NULL;
464 for (Int_t iDet = 0; iDet < AliQAv1::kNDET; iDet++) {
465 fQACycles[iDet] = rec.fQACycles[iDet];
466 fQAWriteExpert[iDet] = rec.fQAWriteExpert[iDet] ;
469 for (Int_t i = 0; i < rec.fSpecCDBUri.GetEntriesFast(); i++) {
470 if (rec.fSpecCDBUri[i]) fSpecCDBUri.Add(rec.fSpecCDBUri[i]->Clone());
473 for (int i=2;i--;) for (int j=2;j--;) fBeamInt[i][j] = rec.fBeamInt[i][j];
477 //_____________________________________________________________________________
478 AliReconstruction& AliReconstruction::operator = (const AliReconstruction& rec)
480 // assignment operator
481 // Used in PROOF mode
482 // Be very careful while modifing it!
483 // Simple rules to follow:
484 // for persistent data members - use their assignment operators
485 // for non-persistent ones - do nothing or take the default values from constructor
486 // TSelector members should not be touched
487 if(&rec == this) return *this;
489 fRunVertexFinder = rec.fRunVertexFinder;
490 fRunVertexFinderTracks = rec.fRunVertexFinderTracks;
491 fRunHLTTracking = rec.fRunHLTTracking;
492 fRunMuonTracking = rec.fRunMuonTracking;
493 fRunV0Finder = rec.fRunV0Finder;
494 fRunCascadeFinder = rec.fRunCascadeFinder;
495 fRunMultFinder = rec.fRunMultFinder;
496 fStopOnError = rec.fStopOnError;
497 fWriteAlignmentData = rec.fWriteAlignmentData;
498 fWriteESDfriend = rec.fWriteESDfriend;
499 fFillTriggerESD = rec.fFillTriggerESD;
501 fCleanESD = rec.fCleanESD;
502 fV0DCAmax = rec.fV0DCAmax;
503 fV0CsPmin = rec.fV0CsPmin;
507 fRunLocalReconstruction = rec.fRunLocalReconstruction;
508 fRunTracking = rec.fRunTracking;
509 fFillESD = rec.fFillESD;
510 fDeleteRecPoints = rec.fDeleteRecPoints;
511 fDeleteDigits = rec.fDeleteDigits;
512 fLoadCDB = rec.fLoadCDB;
513 fUseTrackingErrorsForAlignment = rec.fUseTrackingErrorsForAlignment;
514 fGAliceFileName = rec.fGAliceFileName;
515 fRawInput = rec.fRawInput;
516 fESDOutput = rec.fESDOutput;
517 fProofOutputFileName = rec.fProofOutputFileName;
518 fProofOutputLocation = rec.fProofOutputLocation;
519 fProofOutputDataset = rec.fProofOutputDataset;
520 fProofOutputArchive = rec.fProofOutputArchive;
521 fEquipIdMap = rec.fEquipIdMap;
522 fFirstEvent = rec.fFirstEvent;
523 fLastEvent = rec.fLastEvent;
524 fNumberOfEventsPerFile = rec.fNumberOfEventsPerFile;
525 fFractionFriends = rec.fFractionFriends;
527 for (Int_t i = 0; i < rec.fOptions.GetEntriesFast(); i++) {
528 if (rec.fOptions[i]) fOptions.Add(rec.fOptions[i]->Clone());
531 fLoadAlignFromCDB = rec.fLoadAlignFromCDB;
532 fLoadAlignData = rec.fLoadAlignData;
533 fUseHLTData = rec.fUseHLTData;
535 delete fRunInfo; fRunInfo = NULL;
536 if (rec.fRunInfo) fRunInfo = new AliRunInfo(*rec.fRunInfo);
538 fEventInfo = rec.fEventInfo;
540 delete fRunScalers; fRunScalers = NULL;
541 if (rec.fRunScalers) fRunScalers = new AliTriggerRunScalers(*rec.fRunScalers);
543 delete fCTPTimeParams; fCTPTimeParams = NULL;
544 if (rec.fCTPTimeParams) fCTPTimeParams = new AliCTPTimeParams(*rec.fCTPTimeParams);
545 delete fCTPTimeAlign; fCTPTimeAlign = NULL;
546 if (rec.fCTPTimeAlign) fCTPTimeAlign = new AliCTPTimeParams(*rec.fCTPTimeAlign);
550 fParentRawReader = NULL;
552 fRecoParam = rec.fRecoParam;
554 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
555 fUpgradeMask[iDet] = kFALSE;
556 delete fReconstructor[iDet]; fReconstructor[iDet] = NULL;
557 delete fLoader[iDet]; fLoader[iDet] = NULL;
558 delete fTracker[iDet]; fTracker[iDet] = NULL;
561 for (Int_t iDet = 0; iDet < AliQAv1::kNDET; iDet++) {
562 fQACycles[iDet] = rec.fQACycles[iDet];
563 fQAWriteExpert[iDet] = rec.fQAWriteExpert[iDet] ;
566 delete fSPDTrackleter; fSPDTrackleter = NULL;
568 delete fDiamondProfileSPD; fDiamondProfileSPD = NULL;
569 if (rec.fDiamondProfileSPD) fDiamondProfileSPD = new AliESDVertex(*rec.fDiamondProfileSPD);
570 delete fDiamondProfile; fDiamondProfile = NULL;
571 if (rec.fDiamondProfile) fDiamondProfile = new AliESDVertex(*rec.fDiamondProfile);
572 delete fDiamondProfileTPC; fDiamondProfileTPC = NULL;
573 if (rec.fDiamondProfileTPC) fDiamondProfileTPC = new AliESDVertex(*rec.fDiamondProfileTPC);
575 delete fListOfCosmicTriggers; fListOfCosmicTriggers = NULL;
576 if (rec.fListOfCosmicTriggers) fListOfCosmicTriggers = (THashTable*)((rec.fListOfCosmicTriggers)->Clone());
578 delete fGRPData; fGRPData = NULL;
579 // if (rec.fGRPData) fGRPData = (TMap*)((rec.fGRPData)->Clone());
580 if (rec.fGRPData) fGRPData = (AliGRPObject*)((rec.fGRPData)->Clone());
582 delete fAlignObjArray; fAlignObjArray = NULL;
585 fQARefUri = rec.fQARefUri;
586 fSpecCDBUri.Delete();
587 fInitCDBCalled = rec.fInitCDBCalled;
588 fCDBSnapshotMode = rec.fCDBSnapshotMode;
589 fSetRunNumberFromDataCalled = rec.fSetRunNumberFromDataCalled;
590 fQADetectors = rec.fQADetectors;
591 fQATasks = rec.fQATasks;
593 fRunGlobalQA = rec.fRunGlobalQA;
594 fSameQACycle = rec.fSameQACycle;
595 fInitQACalled = rec.fInitQACalled;
596 fWriteQAExpertData = rec.fWriteQAExpertData;
597 fRunPlaneEff = rec.fRunPlaneEff;
598 for (int i=2;i--;) for (int j=2;j--;) fBeamInt[i][j] = rec.fBeamInt[i][j];
608 fIsNewRunLoader = rec.fIsNewRunLoader;
617 fAnalysisMacro = rec.fAnalysisMacro;
620 fDeclTriggerClasses = rec.fDeclTriggerClasses;
625 //_____________________________________________________________________________
626 AliReconstruction::~AliReconstruction()
631 if (fListOfCosmicTriggers) {
632 fListOfCosmicTriggers->Delete();
633 delete fListOfCosmicTriggers;
637 delete fCTPTimeParams;
638 delete fCTPTimeAlign;
640 if (fAlignObjArray) {
641 fAlignObjArray->Delete();
642 delete fAlignObjArray;
644 fSpecCDBUri.Delete();
646 AliCodeTimer::Instance()->Print();
649 //_____________________________________________________________________________
650 void AliReconstruction::InitQA()
652 //Initialize the QA and start of cycle
653 AliCodeTimerAuto("",0);
655 if (fInitQACalled) return;
656 fInitQACalled = kTRUE;
658 if (fGRPData) AliQADataMaker::SetCloningRequest( fGRPData->GetQATrigClasses(), fGRPData->GetQACloningRequest());
661 AliQAManager * qam = AliQAManager::QAManager(AliQAv1::kRECMODE) ;
662 if (fWriteQAExpertData)
663 qam->SetWriteExpert() ;
665 if (qam->IsDefaultStorageSet()) {
666 AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
667 AliWarning("Default QA reference storage has been already set !");
668 AliWarning(Form("Ignoring the default storage declared in AliReconstruction: %s",fQARefUri.Data()));
669 AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
670 fQARefUri = qam->GetDefaultStorage()->GetURI();
672 if (fQARefUri.Length() > 0) {
673 AliDebug(2,"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
674 AliDebug(2, Form("Default QA reference storage is set to: %s", fQARefUri.Data()));
675 AliDebug(2, "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
677 fQARefUri="local://$ALICE_ROOT/QAref";
678 AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
679 AliWarning("Default QA refeference storage not yet set !!!!");
680 AliWarning(Form("Setting it now to: %s", fQARefUri.Data()));
681 AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
684 qam->SetDefaultStorage(fQARefUri);
688 qam->SetActiveDetectors(fQADetectors) ;
689 for (Int_t det = 0 ; det < AliQAv1::kNDET ; det++) {
690 qam->SetCycleLength(AliQAv1::DETECTORINDEX_t(det), fQACycles[det]) ;
691 qam->SetWriteExpert(AliQAv1::DETECTORINDEX_t(det)) ;
693 if (!fRawReader && !fInput && IsInTasks(AliQAv1::kRAWS))
694 fQATasks.ReplaceAll(Form("%d",AliQAv1::kRAWS), "") ;
695 qam->SetTasks(fQATasks) ;
696 qam->InitQADataMaker(AliCDBManager::Instance()->GetRun()) ;
699 Bool_t sameCycle = kFALSE ;
700 AliQADataMaker *qadm = qam->GetQADataMaker(AliQAv1::kGLOBAL);
701 AliInfo(Form("Initializing the global QA data maker"));
702 if (IsInTasks(AliQAv1::kRECPOINTS)) {
703 qadm->StartOfCycle(AliQAv1::kRECPOINTS, AliCDBManager::Instance()->GetRun(), sameCycle) ;
704 TObjArray **arr=qadm->Init(AliQAv1::kRECPOINTS);
705 AliTracker::SetResidualsArray(arr);
708 if (IsInTasks(AliQAv1::kESDS)) {
709 qadm->StartOfCycle(AliQAv1::kESDS, AliCDBManager::Instance()->GetRun(), sameCycle) ;
710 qadm->Init(AliQAv1::kESDS);
713 AliSysInfo::AddStamp("InitQA") ;
716 //_____________________________________________________________________________
717 void AliReconstruction::MergeQA(const char *fileName)
719 //Initialize the QA and start of cycle
720 AliCodeTimerAuto("",0) ;
721 AliQAManager::QAManager()->Merge(AliCDBManager::Instance()->GetRun(),fileName) ;
722 AliSysInfo::AddStamp("MergeQA") ;
725 //_____________________________________________________________________________
726 void AliReconstruction::InitCDB()
728 // activate a default CDB storage
729 // First check if we have any CDB storage set, because it is used
730 // to retrieve the calibration and alignment constants
731 AliCodeTimerAuto("",0);
733 if (fInitCDBCalled) return;
734 fInitCDBCalled = kTRUE;
736 AliCDBManager* man = AliCDBManager::Instance();
737 if (man->IsDefaultStorageSet())
739 AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
740 AliWarning("Default CDB storage has been already set !");
741 AliWarning(Form("Ignoring the default storage declared in AliReconstruction: %s",fCDBUri.Data()));
742 AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
743 fCDBUri = man->GetDefaultStorage()->GetURI();
746 if (fCDBUri.Length() > 0)
748 AliDebug(2,"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
749 AliDebug(2, Form("Default CDB storage is set to: %s", fCDBUri.Data()));
750 AliDebug(2, "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
751 man->SetDefaultStorage(fCDBUri);
753 else if (!man->GetRaw()){
754 fCDBUri="local://$ALICE_ROOT/OCDB";
755 AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
756 AliWarning("Default CDB storage not yet set !!!!");
757 AliWarning(Form("Setting it now to: %s", fCDBUri.Data()));
758 AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
759 man->SetDefaultStorage(fCDBUri);
762 AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
763 AliWarning("Default storage will be set after setting the Run Number!!!");
764 AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
768 // Now activate the detector specific CDB storage locations
769 for (Int_t i = 0; i < fSpecCDBUri.GetEntriesFast(); i++) {
770 TObject* obj = fSpecCDBUri[i];
772 AliDebug(2, "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
773 AliDebug(2, Form("Specific CDB storage for %s is set to: %s",obj->GetName(),obj->GetTitle()));
774 AliDebug(2, "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
775 man->SetSpecificStorage(obj->GetName(), obj->GetTitle());
777 AliSysInfo::AddStamp("InitCDB");
780 //_____________________________________________________________________________
781 void AliReconstruction::SetCDBSnapshotMode(const char* snapshotFileName) {
782 fCDBSnapshotMode = kTRUE;
783 AliCDBManager::Instance()->SetSnapshotMode(snapshotFileName);
786 //_____________________________________________________________________________
787 void AliReconstruction::SetDefaultStorage(const char* uri) {
788 // Store the desired default CDB storage location
789 // Activate it later within the Run() method
795 //_____________________________________________________________________________
796 void AliReconstruction::SetQARefDefaultStorage(const char* uri) {
797 // Store the desired default CDB storage location
798 // Activate it later within the Run() method
801 AliQAv1::SetQARefStorage(fQARefUri.Data()) ;
804 //_____________________________________________________________________________
805 void AliReconstruction::SetSpecificStorage(const char* calibType, const char* uri) {
806 // Store a detector-specific CDB storage location
807 // Activate it later within the Run() method
809 AliCDBPath aPath(calibType);
810 if(!aPath.IsValid()){
811 // if calibType is not wildcard but it is a valid detector, add "/*" to make it a valid path
812 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
813 if(!strcmp(calibType, fgkDetectorName[iDet])) {
814 aPath.SetPath(Form("%s/*", calibType));
815 AliInfo(Form("Path for specific storage set to %s", aPath.GetPath().Data()));
819 if(!aPath.IsValid()){
820 AliError(Form("Not a valid path or detector: %s", calibType));
825 // // check that calibType refers to a "valid" detector name
826 // Bool_t isDetector = kFALSE;
827 // for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
828 // TString detName = fgkDetectorName[iDet];
829 // if(aPath.GetLevel0() == detName) {
830 // isDetector = kTRUE;
836 // AliError(Form("Not a valid detector: %s", aPath.GetLevel0().Data()));
840 TObject* obj = fSpecCDBUri.FindObject(aPath.GetPath().Data());
841 if (obj) fSpecCDBUri.Remove(obj);
842 fSpecCDBUri.Add(new TNamed(aPath.GetPath().Data(), uri));
846 //_____________________________________________________________________________
847 Bool_t AliReconstruction::SetRunNumberFromData()
849 // The method is called in Run() in order
850 // to set a correct run number.
851 // In case of raw data reconstruction the
852 // run number is taken from the raw data header
854 if (fSetRunNumberFromDataCalled) return kTRUE;
855 fSetRunNumberFromDataCalled = kTRUE;
857 AliCDBManager* man = AliCDBManager::Instance();
860 if(fRawReader->NextEvent()) {
861 if(man->GetRun() > 0) {
862 AliWarning("Run number is taken from raw-event header! Ignoring settings in AliCDBManager!");
864 man->SetRun(fRawReader->GetRunNumber());
865 fRawReader->RewindEvents();
868 if(man->GetRun() > 0) {
869 AliWarning("No raw-data events are found ! Using settings in AliCDBManager !");
872 AliWarning("Neither raw events nor settings in AliCDBManager are found !");
878 AliRunLoader *rl = AliRunLoader::Open(fGAliceFileName.Data());
880 AliError(Form("No run loader found in file %s", fGAliceFileName.Data()));
885 // read run number from gAlice
886 if(rl->GetHeader()) {
887 man->SetRun(rl->GetHeader()->GetRun());
892 AliError("Neither run-loader header nor RawReader objects are found !");
904 //_____________________________________________________________________________
905 void AliReconstruction::SetCDBLock() {
906 // Set CDB lock: from now on it is forbidden to reset the run number
907 // or the default storage or to activate any further storage!
909 AliCDBManager::Instance()->SetLock(1);
912 //_____________________________________________________________________________
913 void AliReconstruction::MatchUpgradeDetector() {
914 // Translates detector name in a boolean.
915 // The boolean is used in GetReconstructor to load the
916 // upgrade reconstructor instead of the standard one.
917 for(Int_t iDet = 0; iDet < kNDetectors; iDet++) {
918 if(fUpgradeModule.Contains(fgkDetectorName[iDet])) fUpgradeMask[iDet]=kTRUE;
921 //_____________________________________________________________________________
922 Bool_t AliReconstruction::MisalignGeometry(const TString& detectors)
924 // Read the alignment objects from CDB.
925 // Each detector is supposed to have the
926 // alignment objects in DET/Align/Data CDB path.
927 // All the detector objects are then collected,
928 // sorted by geometry level (starting from ALIC) and
929 // then applied to the TGeo geometry.
930 // Finally an overlaps check is performed.
932 // Load alignment data from CDB and fill fAlignObjArray
933 if(fLoadAlignFromCDB){
935 TString detStr = detectors;
936 TString loadAlObjsListOfDets = "";
938 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
939 if(!IsSelected(fgkDetectorName[iDet], detStr)) continue;
940 if(!strcmp(fgkDetectorName[iDet],"HLT")) continue;
942 if(AliGeomManager::GetNalignable(fgkDetectorName[iDet]) != 0)
944 loadAlObjsListOfDets += fgkDetectorName[iDet];
945 loadAlObjsListOfDets += " ";
947 } // end loop over detectors
949 if(AliGeomManager::GetNalignable("GRP") != 0)
950 loadAlObjsListOfDets.Prepend("GRP "); //add alignment objects for non-sensitive modules
951 AliGeomManager::ApplyAlignObjsFromCDB(loadAlObjsListOfDets.Data());
953 // Check if the array with alignment objects was
954 // provided by the user. If yes, apply the objects
955 // to the present TGeo geometry
956 if (fAlignObjArray) {
957 if (gGeoManager && gGeoManager->IsClosed()) {
958 if (AliGeomManager::ApplyAlignObjsToGeom(*fAlignObjArray) == kFALSE) {
959 AliError("The misalignment of one or more volumes failed!"
960 "Compare the list of simulated detectors and the list of detector alignment data!");
965 AliError("Can't apply the misalignment! gGeoManager doesn't exist or it is still opened!");
971 if (fAlignObjArray) {
972 fAlignObjArray->Delete();
973 delete fAlignObjArray; fAlignObjArray=NULL;
979 //_____________________________________________________________________________
980 void AliReconstruction::SetGAliceFile(const char* fileName)
982 // set the name of the galice file
984 fGAliceFileName = fileName;
987 //_____________________________________________________________________________
988 void AliReconstruction::SetInput(const char* input)
990 // In case the input string starts with 'mem://', we run in an online mode
991 // and AliRawReaderDateOnline object is created. In all other cases a raw-data
992 // file is assumed. One can give as an input:
993 // mem://: - events taken from DAQ monitoring libs online
995 // mem://<filename> - emulation of the above mode (via DATE monitoring libs)
996 if (input) fRawInput = input;
999 //_____________________________________________________________________________
1000 void AliReconstruction::SetOutput(const char* output)
1002 // Set the output ESD filename
1003 // 'output' is a normalt ROOT url
1004 // The method is used in case of raw-data reco with PROOF
1005 if (output) fESDOutput = output;
1008 //_____________________________________________________________________________
1009 void AliReconstruction::SetOption(const char* detector, const char* option)
1011 // set options for the reconstruction of a detector
1013 TObject* obj = fOptions.FindObject(detector);
1014 if (obj) fOptions.Remove(obj);
1015 fOptions.Add(new TNamed(detector, option));
1018 //_____________________________________________________________________________
1019 void AliReconstruction::SetRecoParam(const char* detector, AliDetectorRecoParam *par)
1021 // Set custom reconstruction parameters for a given detector
1022 // Single set of parameters for all the events
1024 // First check if the reco-params are global
1025 if(!strcmp(detector, "GRP")) {
1026 par->SetAsDefault();
1027 fRecoParam.AddDetRecoParam(kNDetectors,par);
1031 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
1032 if(!strcmp(detector, fgkDetectorName[iDet])) {
1033 par->SetAsDefault();
1034 fRecoParam.AddDetRecoParam(iDet,par);
1041 //_____________________________________________________________________________
1042 Bool_t AliReconstruction::InitGRP() {
1043 //------------------------------------
1044 // Initialization of the GRP entry
1045 //------------------------------------
1046 AliCDBEntry* entry = AliCDBManager::Instance()->Get("GRP/GRP/Data");
1050 TMap* m = dynamic_cast<TMap*>(entry->GetObject()); // old GRP entry
1053 AliInfo("Found a TMap in GRP/GRP/Data, converting it into an AliGRPObject");
1055 fGRPData = new AliGRPObject();
1056 fGRPData->ReadValuesFromMap(m);
1060 AliInfo("Found an AliGRPObject in GRP/GRP/Data, reading it");
1061 fGRPData = dynamic_cast<AliGRPObject*>(entry->GetObject()); // new GRP entry
1065 // FIX ME: The unloading of GRP entry is temporarily disabled
1066 // because ZDC and VZERO are using it in order to initialize
1067 // their reconstructor objects. In the future one has to think
1068 // of propagating AliRunInfo to the reconstructors.
1069 // AliCDBManager::Instance()->UnloadFromCache("GRP/GRP/Data");
1073 AliError("No GRP entry found in OCDB!");
1077 TString lhcState = fGRPData->GetLHCState();
1078 if (lhcState==AliGRPObject::GetInvalidString()) {
1079 AliError("GRP/GRP/Data entry: missing value for the LHC state ! Using UNKNOWN");
1080 lhcState = "UNKNOWN";
1083 TString beamType = fGRPData->GetBeamType();
1084 if (beamType==AliGRPObject::GetInvalidString()) {
1085 AliError("GRP/GRP/Data entry: missing value for the beam type ! Using UNKNOWN");
1086 beamType = "UNKNOWN";
1089 Float_t beamEnergy = fGRPData->GetBeamEnergy();
1090 if (beamEnergy==AliGRPObject::GetInvalidFloat()) {
1091 AliError("GRP/GRP/Data entry: missing value for the beam energy ! Using 0");
1095 TString runType = fGRPData->GetRunType();
1096 if (runType==AliGRPObject::GetInvalidString()) {
1097 AliError("GRP/GRP/Data entry: missing value for the run type ! Using UNKNOWN");
1098 runType = "UNKNOWN";
1101 Int_t activeDetectors = fGRPData->GetDetectorMask();
1102 if (activeDetectors==AliGRPObject::GetInvalidUInt()) {
1103 AliError("GRP/GRP/Data entry: missing value for the detector mask ! Using 1074790399");
1104 activeDetectors = 1074790399;
1106 AliDebug(1, Form("activeDetectors = %d", activeDetectors));
1108 fRunInfo = new AliRunInfo(lhcState, beamType, beamEnergy, runType, activeDetectors);
1112 // Process the list of active detectors
1113 if (activeDetectors) {
1114 UInt_t detMask = activeDetectors;
1115 AliDebug(1, Form("Detector List = %s", fRunLocalReconstruction.Data()));
1116 fRunLocalReconstruction = MatchDetectorList(fRunLocalReconstruction,detMask);
1117 AliDebug(1, Form("Detector List = %s", fRunLocalReconstruction.Data()));
1118 fRunTracking = MatchDetectorList(fRunTracking,detMask);
1119 fFillESD = MatchDetectorList(fFillESD,detMask);
1120 fQADetectors = MatchDetectorList(fQADetectors,detMask);
1121 fDeleteRecPoints = MatchDetectorList(fDeleteRecPoints,detMask);
1122 fDeleteDigits = MatchDetectorList(fDeleteDigits,detMask);
1123 fLoadCDB.Form("%s %s %s %s",
1124 fRunLocalReconstruction.Data(),
1125 fRunTracking.Data(),
1127 fQADetectors.Data());
1128 fLoadCDB = MatchDetectorList(fLoadCDB,detMask);
1129 if (!((detMask >> AliDAQ::DetectorID("ITSSPD")) & 0x1) &&
1130 !((detMask >> AliDAQ::DetectorID("ITSSDD")) & 0x1) &&
1131 !((detMask >> AliDAQ::DetectorID("ITSSSD")) & 0x1) ) {
1132 // switch off the vertexer
1133 AliInfo("SPD,SDD,SSD is not in the list of active detectors. Vertexer and Trackleter are switched off.");
1134 fRunVertexFinder = kFALSE;
1135 fRunMultFinder = kFALSE;
1137 if (!((detMask >> AliDAQ::DetectorID("TRG")) & 0x1)) {
1138 // switch off the reading of CTP raw-data payload
1139 if (fFillTriggerESD) {
1140 AliInfo("CTP is not in the list of active detectors. CTP data reading switched off.");
1141 fFillTriggerESD = kFALSE;
1146 AliInfo("===================================================================================");
1147 AliInfo(Form("Running local reconstruction for detectors: %s",fRunLocalReconstruction.Data()));
1148 AliInfo(Form("Running tracking for detectors: %s",fRunTracking.Data()));
1149 AliInfo(Form("Filling ESD for detectors: %s",fFillESD.Data()));
1150 AliInfo(Form("Quality assurance is active for detectors: %s",fQADetectors.Data()));
1151 AliInfo(Form("CDB and reconstruction parameters are loaded for detectors: %s",fLoadCDB.Data()));
1152 AliInfo("===================================================================================");
1154 //*** Dealing with the magnetic field map
1155 if ( TGeoGlobalMagField::Instance()->IsLocked() ) {
1156 if (TGeoGlobalMagField::Instance()->GetField()->TestBit(AliMagF::kOverrideGRP)) {
1157 AliInfo("ExpertMode!!! GRP information will be ignored !");
1158 AliInfo("ExpertMode!!! Running with the externally locked B field !");
1161 AliInfo("Destroying existing B field instance!");
1162 delete TGeoGlobalMagField::Instance();
1165 if ( !TGeoGlobalMagField::Instance()->IsLocked() ) {
1166 // Construct the field map out of the information retrieved from GRP.
1169 Float_t l3Current = fGRPData->GetL3Current((AliGRPObject::Stats)0);
1170 if (l3Current == AliGRPObject::GetInvalidFloat()) {
1171 AliError("GRP/GRP/Data entry: missing value for the L3 current !");
1175 Char_t l3Polarity = fGRPData->GetL3Polarity();
1176 if (l3Polarity == AliGRPObject::GetInvalidChar()) {
1177 AliError("GRP/GRP/Data entry: missing value for the L3 polarity !");
1182 Float_t diCurrent = fGRPData->GetDipoleCurrent((AliGRPObject::Stats)0);
1183 if (diCurrent == AliGRPObject::GetInvalidFloat()) {
1184 AliError("GRP/GRP/Data entry: missing value for the dipole current !");
1188 Char_t diPolarity = fGRPData->GetDipolePolarity();
1189 if (diPolarity == AliGRPObject::GetInvalidChar()) {
1190 AliError("GRP/GRP/Data entry: missing value for the dipole polarity !");
1194 // read special bits for the polarity convention and map type
1195 Int_t polConvention = fGRPData->IsPolarityConventionLHC() ? AliMagF::kConvLHC : AliMagF::kConvDCS2008;
1196 Bool_t uniformB = fGRPData->IsUniformBMap();
1199 AliMagF* fld = AliMagF::CreateFieldMap(TMath::Abs(l3Current) * (l3Polarity ? -1:1),
1200 TMath::Abs(diCurrent) * (diPolarity ? -1:1),
1201 polConvention,uniformB,beamEnergy, beamType.Data());
1203 TGeoGlobalMagField::Instance()->SetField( fld );
1204 TGeoGlobalMagField::Instance()->Lock();
1205 AliInfo("Running with the B field constructed out of GRP !");
1207 else AliFatal("Failed to create a B field map !");
1209 else AliFatal("B field is neither set nor constructed from GRP ! Exitig...");
1212 //*** Get the diamond profiles from OCDB
1213 entry = AliCDBManager::Instance()->Get("GRP/Calib/MeanVertexSPD");
1215 fDiamondProfileSPD = dynamic_cast<AliESDVertex*> (entry->GetObject());
1217 AliError("No SPD diamond profile found in OCDB!");
1220 entry = AliCDBManager::Instance()->Get("GRP/Calib/MeanVertex");
1222 fDiamondProfile = dynamic_cast<AliESDVertex*> (entry->GetObject());
1224 AliError("No diamond profile found in OCDB!");
1227 entry = AliCDBManager::Instance()->Get("GRP/Calib/MeanVertexTPC");
1229 fDiamondProfileTPC = dynamic_cast<AliESDVertex*> (entry->GetObject());
1231 AliError("No TPC diamond profile found in OCDB!");
1234 entry = AliCDBManager::Instance()->Get("GRP/Calib/CosmicTriggers");
1236 fListOfCosmicTriggers = dynamic_cast<THashTable*>(entry->GetObject());
1240 if (!fListOfCosmicTriggers) {
1241 AliWarning("Can not get list of cosmic triggers from OCDB! Cosmic event specie will be effectively disabled!");
1247 //_____________________________________________________________________________
1248 Bool_t AliReconstruction::LoadCDB()
1250 // Load CDB entries for all active detectors.
1251 // By default we load all the entries in <det>/Calib
1254 AliCodeTimerAuto("",0);
1256 AliCDBManager::Instance()->Get("GRP/CTP/Config");
1258 AliCDBManager::Instance()->Get("GRP/Calib/LHCClockPhase");
1260 TString detStr = fLoadCDB;
1261 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
1262 if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
1263 AliCDBManager::Instance()->GetAll(Form("%s/Calib/*",fgkDetectorName[iDet]));
1264 AliCDBManager::Instance()->GetAll(Form("%s/Trigger/*",fgkDetectorName[iDet]));
1267 // Temporary fix - one has to define the correct policy in order
1268 // to load the trigger OCDB entries only for the detectors that
1269 // in the trigger or that are needed in order to put correct
1270 // information in ESD
1271 AliCDBManager::Instance()->GetAll("TRIGGER/*/*");
1275 //_____________________________________________________________________________
1276 Bool_t AliReconstruction::LoadTriggerScalersCDB()
1278 // Load CTP scalers from OCDB.
1279 // The scalers are checked for consistency.
1281 AliCodeTimerAuto("",0);
1283 AliCDBEntry* entry = AliCDBManager::Instance()->Get("GRP/CTP/Scalers");
1287 AliInfo("Found an AliTriggerRunScalers in GRP/CTP/Scalers, reading it");
1288 fRunScalers = dynamic_cast<AliTriggerRunScalers*> (entry->GetObject());
1290 if (fRunScalers && (fRunScalers->CorrectScalersOverflow() == 0)) AliInfo("32bit Trigger counters corrected for overflow");
1295 //_____________________________________________________________________________
1296 Bool_t AliReconstruction::LoadCTPTimeParamsCDB()
1298 // Load CTP timing information (alignment)
1301 AliCDBEntry* entry = AliCDBManager::Instance()->Get("GRP/CTP/CTPtiming");
1302 if (!entry) return kFALSE;
1304 AliInfo("Found an AliCTPTimeParams in GRP/CTP/CTPtiming, reading it");
1305 fCTPTimeParams = dynamic_cast<AliCTPTimeParams*> (entry->GetObject());
1308 AliCDBEntry* entry2 = AliCDBManager::Instance()->Get("GRP/CTP/TimeAlign");
1309 if (!entry2) return kFALSE;
1311 AliInfo("Found an AliCTPTimeParams in GRP/CTP/TimeAlign, reading it");
1312 fCTPTimeAlign = dynamic_cast<AliCTPTimeParams*> (entry2->GetObject());
1313 entry2->SetOwner(0);
1318 //_____________________________________________________________________________
1319 Bool_t AliReconstruction::ReadIntensityInfoCDB()
1321 // Load LHC DIP data
1322 AliCDBEntry* entry = AliCDBManager::Instance()->Get("GRP/GRP/LHCData");
1323 AliCDBEntry* entryCTP = AliCDBManager::Instance()->Get("GRP/CTP/Config");
1325 if (!entry || !entryCTP) {
1326 AliError(Form("Failed to extract CDB objects GRP/GRP/LHCData: %p or GRP/CTP/Config: %p",entry,entryCTP));
1330 enum {kA,kB,kC,kE,kNMasks};
1331 AliTriggerConfiguration* conf = (AliTriggerConfiguration*)entryCTP->GetObject();
1332 const TObjArray& clArr = conf->GetClasses();
1333 TObjArray masks(kNMasks);
1335 AliTriggerClass* trClass = 0;
1337 masks.SetOwner(kFALSE);
1339 while ( (trClass=(AliTriggerClass*)next()) ) {
1340 TString trName = trClass->GetName();
1341 int ind = trName.Index("-"); // prefix in front of A,B,C,E
1342 if (ind<1) continue; // anomaly
1344 trName = trName.Data() + ind;
1345 AliTriggerBCMask* bcMask = trClass->GetBCMask();
1346 if (!bcMask) continue;
1348 if (trName.BeginsWith("-A-")) which |= 0x1<<kA;
1349 else if (trName.BeginsWith("-B-")) which |= 0x1<<kB;
1350 else if (trName.BeginsWith("-C-")) which |= 0x1<<kC;
1351 else if (trName.BeginsWith("-E-")) which |= 0x1<<kE;
1352 else if (trName.BeginsWith("-AC-")) which |= (0x1<<kA) | (0x1<<kC);
1353 else if (trName.BeginsWith("-CA-")) which |= (0x1<<kA) | (0x1<<kC);
1354 else { AliWarning(Form("Unknown trigger type %s\n",trClass->GetName())); continue;}
1356 for (int ip=kNMasks;ip--;) {
1357 if ( !(which&(0x1<<ip)) || masks[ip] ) continue; // does not match or already done
1358 masks[ip] = (TObject*)bcMask;
1361 if (nFound==kNMasks) break;
1364 AliInfo("Reading mean bunch intensities from GRP/GRP/LHCData");
1365 AliLHCData* dipData = dynamic_cast<AliLHCData*> (entry->GetObject());
1367 for (int ib=2;ib--;) {
1369 if (dipData && (dipData->GetMeanIntensity(ib,intI,intNI,&masks)>=0)) {
1370 fBeamInt[ib][0] = intI;
1371 fBeamInt[ib][1] = intNI;
1372 AliInfo(Form("Mean intensity for beam %d: Interacting:%.2e Non-Interacting:%.2e",ib,intI,intNI));
1380 //_____________________________________________________________________________
1381 Bool_t AliReconstruction::Run(const char* input)
1384 AliCodeTimerAuto("",0);
1387 if (GetAbort() != TSelector::kContinue) return kFALSE;
1389 TChain *chain = NULL;
1390 if (fRawReader && (chain = fRawReader->GetChain())) {
1391 Long64_t nEntries = (fLastEvent < 0) ? (TChain::kBigNumber) : (fLastEvent - fFirstEvent + 1);
1394 // Temporary fix for long raw-data runs (until socket timeout handling in PROOF is revised)
1395 gProof->Exec("gEnv->SetValue(\"Proof.SocketActivityTimeout\",-1)", kTRUE);
1398 gProof->Exec("TGrid::Connect(\"alien://\")",kTRUE);
1400 TMessage::EnableSchemaEvolutionForAll(kTRUE);
1401 gProof->Exec("TMessage::EnableSchemaEvolutionForAll(kTRUE)",kTRUE);
1403 gProof->AddInput(this);
1405 if (!ParseOutput()) return kFALSE;
1407 gProof->SetParameter("PROOF_MaxSlavesPerNode", 9999);
1409 chain->Process("AliReconstruction","",nEntries,fFirstEvent);
1412 chain->Process(this,"",nEntries,fFirstEvent);
1417 if (GetAbort() != TSelector::kContinue) return kFALSE;
1419 if (GetAbort() != TSelector::kContinue) return kFALSE;
1420 //******* The loop over events
1421 AliInfo("Starting looping over events");
1423 while ((iEvent < fRunLoader->GetNumberOfEvents()) ||
1424 (fRawReader && fRawReader->NextEvent())) {
1426 // check if process has enough resources
1427 if (!HasEnoughResources(iEvent)) break;
1428 if (!ProcessEvent(iEvent)) {
1429 Abort("ProcessEvent",TSelector::kAbortFile);
1435 if (GetAbort() != TSelector::kContinue) return kFALSE;
1437 if (GetAbort() != TSelector::kContinue) return kFALSE;
1443 //_____________________________________________________________________________
1444 void AliReconstruction::InitRawReader(const char* input)
1446 // Init raw-reader and
1447 // set the input in case of raw data
1449 AliCodeTimerAuto("",0);
1451 if (input) fRawInput = input;
1452 fRawReader = AliRawReader::Create(fRawInput.Data());
1454 if (fRawInput.IsNull()) {
1455 AliInfo("Reconstruction will run over digits");
1458 AliFatal("Can not create raw-data reader ! Exiting...");
1462 if (!fEquipIdMap.IsNull() && fRawReader)
1463 fRawReader->LoadEquipmentIdsMap(fEquipIdMap);
1465 if (!fUseHLTData.IsNull()) {
1466 // create the RawReaderHLT which performs redirection of HLT input data for
1467 // the specified detectors
1468 AliRawReader* pRawReader=AliRawHLTManager::CreateRawReaderHLT(fRawReader, fUseHLTData.Data());
1470 fParentRawReader=fRawReader;
1471 fRawReader=pRawReader;
1473 AliError(Form("can not create Raw Reader for HLT input %s", fUseHLTData.Data()));
1476 AliSysInfo::AddStamp("CreateRawReader");
1479 //_____________________________________________________________________________
1480 void AliReconstruction::InitRun(const char* input)
1482 // Initialization of raw-reader,
1483 // run number, CDB etc.
1484 AliCodeTimerAuto("",0);
1485 AliSysInfo::AddStamp("Start");
1487 // Initialize raw-reader if any
1488 InitRawReader(input);
1490 // Initialize the CDB storage
1493 // Set run number in CDBManager (if it is not already set by the user)
1494 if (!SetRunNumberFromData()) {
1495 Abort("SetRunNumberFromData", TSelector::kAbortProcess);
1499 // Set CDB lock: from now on it is forbidden to reset the run number
1500 // or the default storage or to activate any further storage!
1505 //_____________________________________________________________________________
1506 void AliReconstruction::Begin(TTree *)
1508 // Initialize AlReconstruction before
1509 // going into the event loop
1510 // Should follow the TSelector convention
1511 // i.e. initialize only the object on the client side
1512 AliCodeTimerAuto("",0);
1514 AliReconstruction *reco = NULL;
1516 if ((reco = (AliReconstruction*)fInput->FindObject("AliReconstruction"))) {
1519 AliSysInfo::AddStamp("ReadInputInBegin");
1522 // Import ideal TGeo geometry and apply misalignment
1524 TString geom(gSystem->DirName(fGAliceFileName));
1525 geom += "/geometry.root";
1526 AliGeomManager::LoadGeometry(geom.Data());
1528 Abort("LoadGeometry", TSelector::kAbortProcess);
1531 AliSysInfo::AddStamp("LoadGeom");
1532 TString detsToCheck=fRunLocalReconstruction;
1533 if(!AliGeomManager::CheckSymNamesLUT(detsToCheck.Data())) {
1534 Abort("CheckSymNamesLUT", TSelector::kAbortProcess);
1537 AliSysInfo::AddStamp("CheckGeom");
1540 Bool_t toCDBSnapshot=kFALSE;
1541 TString snapshotFileOut(""); // we could use fSnapshotFileName if we are not interested
1542 // in reading from and writing to a snapshot file at the same time
1543 if(TString(gSystem->Getenv("OCDB_SNAPSHOT_CREATE")) == TString("kTRUE")){
1544 toCDBSnapshot=kTRUE;
1545 //fFromCDBSnapshot=kFALSE;
1546 TString snapshotFile(gSystem->Getenv("OCDB_SNAPSHOT_FILENAME"));
1547 if(!(snapshotFile.IsNull() || snapshotFile.IsWhitespace()))
1548 snapshotFileOut = snapshotFile;
1550 snapshotFileOut="OCDB.root";
1553 if (!MisalignGeometry(fLoadAlignData)) {
1554 Abort("MisalignGeometry", TSelector::kAbortProcess);
1557 AliCDBManager::Instance()->UnloadFromCache("GRP/Geometry/Data");
1558 if(!toCDBSnapshot) AliCDBManager::Instance()->UnloadFromCache("*/Align/*");
1559 AliSysInfo::AddStamp("MisalignGeom");
1562 Abort("InitGRP", TSelector::kAbortProcess);
1565 AliSysInfo::AddStamp("InitGRP");
1566 if(!toCDBSnapshot) AliCDBManager::Instance()->UnloadFromCache("GRP/Calib/CosmicTriggers");
1568 if(!fCDBSnapshotMode || toCDBSnapshot){
1570 Abort("LoadCDB", TSelector::kAbortProcess);
1573 AliSysInfo::AddStamp("LoadCDB");
1576 if (!LoadTriggerScalersCDB()) {
1577 Abort("LoadTriggerScalersCDB", TSelector::kAbortProcess);
1580 AliSysInfo::AddStamp("LoadTriggerScalersCDB");
1582 if (!LoadCTPTimeParamsCDB()) {
1583 Abort("LoadCTPTimeParamsCDB", TSelector::kAbortProcess);
1586 AliSysInfo::AddStamp("LoadCTPTimeParamsCDB");
1588 if (!ReadIntensityInfoCDB()) {
1589 Abort("ReadIntensityInfoCDB", TSelector::kAbortProcess);
1592 AliSysInfo::AddStamp("ReadIntensityInfoCDB");
1594 // Read the reconstruction parameters from OCDB
1595 if (!InitRecoParams()) {
1596 AliWarning("Not all detectors have correct RecoParam objects initialized");
1598 AliSysInfo::AddStamp("InitRecoParams");
1602 AliCDBManager::Instance()->DumpToSnapshotFile(snapshotFileOut.Data(),kFALSE);
1603 AliCDBManager::Instance()->UnloadFromCache("*/Align/*");
1604 AliCDBManager::Instance()->UnloadFromCache("GRP/Calib/CosmicTriggers");
1607 if (fInput && gProof) {
1608 if (reco) *reco = *this;
1610 gGeoManager->SetName("Geometry");
1611 gProof->AddInputData(gGeoManager,kTRUE);
1613 gProof->AddInputData(const_cast<TMap*>(AliCDBManager::Instance()->GetEntryCache()),kTRUE);
1614 fInput->Add(new TParameter<Int_t>("RunNumber",AliCDBManager::Instance()->GetRun()));
1615 AliMagF *magFieldMap = (AliMagF*)TGeoGlobalMagField::Instance()->GetField();
1616 magFieldMap->SetName("MagneticFieldMap");
1617 gProof->AddInputData(magFieldMap,kTRUE);
1619 fAnalysis->SetName("Analysis");
1620 gProof->AddInputData(fAnalysis,kTRUE);
1626 //_____________________________________________________________________________
1627 void AliReconstruction::SlaveBegin(TTree*)
1629 // Initialization related to run-loader,
1630 // vertexer, trackers, recontructors
1631 // In proof mode it is executed on the slave
1632 AliCodeTimerAuto("",0);
1634 TProofOutputFile *outProofFile = NULL;
1636 if (AliDebugLevel() > 0) fInput->Print();
1637 if (AliDebugLevel() > 10) fInput->Dump();
1638 if (AliReconstruction *reco = (AliReconstruction*)fInput->FindObject("AliReconstruction")) {
1641 if (TGeoManager *tgeo = (TGeoManager*)fInput->FindObject("Geometry")) {
1643 AliGeomManager::SetGeometry(tgeo);
1645 if (TMap *entryCache = (TMap*)fInput->FindObject("CDBEntryCache")) {
1646 Int_t runNumber = -1;
1647 if (TProof::GetParameter(fInput,"RunNumber",runNumber) == 0) {
1648 AliCDBManager *man = AliCDBManager::Instance(entryCache,runNumber);
1649 man->SetCacheFlag(kTRUE);
1650 man->SetLock(kTRUE);
1654 if (AliMagF *map = (AliMagF*)fInput->FindObject("MagneticFieldMap")) {
1655 AliMagF *newMap = new AliMagF(*map);
1656 if (!newMap->LoadParameterization()) {
1657 Abort("AliMagF::LoadParameterization", TSelector::kAbortProcess);
1660 TGeoGlobalMagField::Instance()->SetField(newMap);
1661 TGeoGlobalMagField::Instance()->Lock();
1664 // Attempt to get the analysis manager from the input list
1665 fAnalysis = (AliAnalysisManager*)fInput->FindObject("Analysis");
1666 if (fAnalysis) AliInfo("==== Analysis manager retrieved from input list ====");
1668 if (TNamed *outputFileName = (TNamed*)fInput->FindObject("PROOF_OUTPUTFILE"))
1669 fProofOutputFileName = outputFileName->GetTitle();
1670 if (TNamed *outputLocation = (TNamed*)fInput->FindObject("PROOF_OUTPUTFILE_LOCATION"))
1671 fProofOutputLocation = outputLocation->GetTitle();
1672 if (fInput->FindObject("PROOF_OUTPUTFILE_DATASET"))
1673 fProofOutputDataset = kTRUE;
1674 if (TNamed *archiveList = (TNamed*)fInput->FindObject("PROOF_OUTPUTFILE_ARCHIVE"))
1675 fProofOutputArchive = archiveList->GetTitle();
1676 if (!fProofOutputFileName.IsNull() &&
1677 !fProofOutputLocation.IsNull() &&
1678 fProofOutputArchive.IsNull()) {
1679 if (!fProofOutputDataset) {
1680 outProofFile = new TProofOutputFile(fProofOutputFileName.Data(),"M");
1681 outProofFile->SetOutputFileName(Form("%s%s",fProofOutputLocation.Data(),fProofOutputFileName.Data()));
1684 outProofFile = new TProofOutputFile(fProofOutputFileName.Data(),"DROV",fProofOutputLocation.Data());
1686 if (AliDebugLevel() > 0) outProofFile->Dump();
1687 fOutput->Add(outProofFile);
1689 AliSysInfo::AddStamp("ReadInputInSlaveBegin");
1691 // Check if analysis was requested in the reconstruction event loop
1693 // Attempt to connect in-memory singleton
1694 fAnalysis = AliAnalysisManager::GetAnalysisManager();
1695 if (fAnalysis) AliInfo(Form("==== Analysis manager <%s> found in memory ====", fAnalysis->GetName()));
1696 // Check if an analysis macro was specified
1697 if (!fAnalysis && !fAnalysisMacro.IsNull()) {
1698 // Run specified analysis macro
1699 gROOT->ProcessLine(Form(".x %s",fAnalysisMacro.Data()));
1700 fAnalysis = AliAnalysisManager::GetAnalysisManager();
1701 if (!fAnalysis) AliError(Form("No analysis manager produced by analysis macro %s", fAnalysisMacro.Data()));
1702 else AliInfo(Form("==== Analysis manager <%s> produced by analysis macro <%s> ====",
1703 fAnalysis->GetName(), fAnalysisMacro.Data()));
1707 // get the run loader
1708 if (!InitRunLoader()) {
1709 Abort("InitRunLoader", TSelector::kAbortProcess);
1712 AliSysInfo::AddStamp("LoadLoader");
1714 ftVertexer = new AliVertexerTracks(AliTracker::GetBz());
1717 if (!fRunTracking.IsNull() && !CreateTrackers(fRunTracking)) {
1718 Abort("CreateTrackers", TSelector::kAbortProcess);
1721 AliSysInfo::AddStamp("CreateTrackers");
1723 // create the ESD output file and tree
1724 if (!outProofFile) {
1725 ffile = TFile::Open("AliESDs.root", "RECREATE");
1726 ffile->SetCompressionLevel(2);
1727 if (!ffile->IsOpen()) {
1728 Abort("OpenESDFile", TSelector::kAbortProcess);
1733 AliInfo(Form("Opening output PROOF file: %s/%s",
1734 outProofFile->GetDir(), outProofFile->GetFileName()));
1735 if (!(ffile = outProofFile->OpenFile("RECREATE"))) {
1736 Abort(Form("Problems opening output PROOF file: %s/%s",
1737 outProofFile->GetDir(), outProofFile->GetFileName()),
1738 TSelector::kAbortProcess);
1743 ftree = new TTree("esdTree", "Tree with ESD objects");
1744 fesd = new AliESDEvent();
1745 fesd->CreateStdContent();
1746 // add a so far non-std object to the ESD, this will
1747 // become part of the std content
1748 fesd->AddObject(new AliESDHLTDecision);
1750 fesd->WriteToTree(ftree);
1751 if (fWriteESDfriend) {
1752 ffileF = TFile::Open("AliESDfriends.root", "RECREATE");
1753 ftreeF = new TTree("esdFriendTree", "Tree with ESD Friend objects");
1754 fesdf = new AliESDfriend();
1755 ftreeF->Branch("ESDfriend.","AliESDfriend", &fesdf);
1756 fesd->AddObject(fesdf);
1759 ftree->GetUserInfo()->Add(fesd);
1761 fhlttree = new TTree("HLTesdTree", "Tree with HLT ESD objects");
1762 fhltesd = new AliESDEvent();
1763 fhltesd->CreateStdContent();
1764 // read the ESD template from CDB
1765 // HLT is allowed to put non-std content to its ESD, the non-std
1766 // objects need to be created before invocation of WriteToTree in
1767 // order to create all branches. Initialization is done from an
1768 // ESD layout template in CDB
1769 AliCDBManager* man = AliCDBManager::Instance();
1770 AliCDBPath hltESDConfigPath("HLT/Calib/esdLayout");
1771 AliCDBEntry* hltESDConfig=NULL;
1772 if (man->GetId(hltESDConfigPath)!=NULL)
1773 hltESDConfig=man->Get(hltESDConfigPath);
1774 if (!hltESDConfig) {
1775 // try the alternative path
1776 // in Feb 2012 the object has been moved from ConfigHLT to Calib
1777 AliCDBPath hltESDConfigLegacyPath("HLT/ConfigHLT/esdLayout");
1778 AliInfo(Form("can not find HLT ESD config object in %s, trying legacy path %s",
1779 hltESDConfigPath.GetPath().Data(),
1780 hltESDConfigLegacyPath.GetPath().Data()));
1781 hltESDConfig=man->Get(hltESDConfigLegacyPath);
1784 AliESDEvent* pESDLayout=dynamic_cast<AliESDEvent*>(hltESDConfig->GetObject());
1786 // init all internal variables from the list of objects
1787 pESDLayout->GetStdContent();
1789 // copy content and create non-std objects
1790 *fhltesd=*pESDLayout;
1793 AliError(Form("error setting hltEsd layout from %s: invalid object type",
1794 hltESDConfigPath.GetPath().Data()));
1798 fhltesd->WriteToTree(fhlttree);
1799 fhlttree->GetUserInfo()->Add(fhltesd);
1801 ProcInfo_t procInfo;
1802 gSystem->GetProcInfo(&procInfo);
1803 AliInfo(Form("Current memory usage %ld %ld", procInfo.fMemResident, procInfo.fMemVirtual));
1806 //Initialize the QA and start of cycle
1807 if (fRunQA || fRunGlobalQA)
1810 //Initialize the Plane Efficiency framework
1811 if (fRunPlaneEff && !InitPlaneEff()) {
1812 Abort("InitPlaneEff", TSelector::kAbortProcess);
1816 if (strcmp(gProgName,"alieve") == 0)
1817 fRunAliEVE = InitAliEVE();
1818 // If we have an analysis manager, connect the AliRecoInputHandler here
1820 if (!dynamic_cast<AliRecoInputHandler*>(fAnalysis->GetInputEventHandler())) {
1821 AliError("Analysis manager used in reconstruction should use AliRecoInputHandler - \
1822 \n ->Replacing with AliRecoInputHandler instance.");
1823 delete fAnalysis->GetInputEventHandler();
1825 // Set the event and other data pointers
1826 fRecoHandler = new AliRecoInputHandler();
1827 // fRecoHandler->Init(ftree, "LOCAL");
1828 fRecoHandler->SetEvent(fesd);
1829 fRecoHandler->SetESDfriend(fesdf);
1830 fRecoHandler->SetHLTEvent(fhltesd);
1831 fRecoHandler->SetHLTTree(fhlttree);
1832 fAnalysis->SetInputEventHandler(fRecoHandler);
1833 // Enter external loop mode
1834 fAnalysis->SetExternalLoop(kTRUE);
1835 // Initialize analysis
1836 fAnalysis->SlaveBegin(ftree);
1837 fAnalysis->StartAnalysis("local", (TTree*)0);
1838 // Connect ESD tree with the input container
1839 fAnalysis->GetCommonInputContainer()->SetData(ftree);
1844 //_____________________________________________________________________________
1845 Bool_t AliReconstruction::Process(Long64_t entry)
1847 // run the reconstruction over a single entry
1848 // from the chain with raw data
1849 AliCodeTimerAuto("",0);
1851 TTree *currTree = fChain->GetTree();
1852 AliRawVEvent *event = NULL;
1853 currTree->SetBranchAddress("rawevent",&event);
1854 currTree->GetEntry(entry);
1855 fRawReader = new AliRawReaderRoot(event);
1856 // check if process has enough resources
1857 if (!HasEnoughResources(entry)) return kFALSE;
1858 fStatus = ProcessEvent(fRunLoader->GetNumberOfEvents());
1866 //_____________________________________________________________________________
1867 void AliReconstruction::Init(TTree *tree)
1869 // Implementation of TSelector::Init()
1872 AliError("The input tree is not found!");
1878 //_____________________________________________________________________________
1879 Bool_t AliReconstruction::ProcessEvent(Int_t iEvent)
1881 // run the reconstruction over a single event
1882 // The event loop is steered in Run method
1885 static Long_t oldMres=0;
1886 static Long_t oldMvir=0;
1887 static Float_t oldCPU=0;
1888 static Long_t aveDMres=0;
1889 static Long_t aveDMvir=0;
1890 static Float_t aveDCPU=0;
1892 AliCodeTimerAuto("",0);
1896 AliSysInfo::AddStamp(Form("StartEv_%d",iEvent), 0,0,iEvent);
1898 if (iEvent >= fRunLoader->GetNumberOfEvents()) {
1899 fRunLoader->SetEventNumber(iEvent);
1901 fRunLoader->GetHeader()->Reset(fRawReader->GetRunNumber(),
1903 fRunLoader->TreeE()->Fill();
1905 if (fRawReader && fRawReader->UseAutoSaveESD())
1906 fRunLoader->TreeE()->AutoSave("SaveSelf");
1909 if ((iEvent < fFirstEvent) || ((fLastEvent >= 0) && (iEvent > fLastEvent))) {
1914 fRunLoader->GetEvent(iEvent);
1916 // Fill Event-info object
1918 fRecoParam.SetEventSpecie(fRunInfo,fEventInfo,fListOfCosmicTriggers);
1920 ProcInfo_t procInfo;
1921 if(iEvent==fFirstEvent) {
1922 gSystem->GetProcInfo(&procInfo);
1923 oldMres=procInfo.fMemResident;
1924 oldMvir=procInfo.fMemVirtual;
1925 oldCPU=procInfo.fCpuUser+procInfo.fCpuSys;
1927 AliInfo(Form("================================= Processing event %d of type %-10s ==================================", iEvent,fRecoParam.PrintEventSpecie()));
1929 AliSysInfo::AddStamp(Form("StartReco_%d",iEvent), 0,0,iEvent);
1931 // Set the reco-params
1933 TString detStr = fLoadCDB;
1934 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
1935 if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
1936 AliReconstructor *reconstructor = GetReconstructor(iDet);
1937 if (reconstructor && fRecoParam.GetDetRecoParamArray(iDet)) {
1938 const AliDetectorRecoParam *par = fRecoParam.GetDetRecoParam(iDet);
1939 reconstructor->SetRecoParam(par);
1940 reconstructor->GetPidSettings(&pid);
1941 reconstructor->SetEventInfo(&fEventInfo);
1943 AliQAManager::QAManager()->SetEventInfo(&fEventInfo) ;
1944 AliQAManager::QAManager()->SetRecoParam(iDet, par) ;
1945 if (par) AliQAManager::QAManager()->SetEventSpecie(AliRecoParam::Convert(par->GetEventSpecie())) ;
1950 if (fRunQA || fRunGlobalQA) AliQADataMaker::SetEventTrigClasses(fEventInfo.GetTriggerClasses()); // RS: select which histo clones are to be filled
1953 const AliDetectorRecoParam *grppar = fRecoParam.GetDetRecoParam(kNDetectors);
1954 AliQAManager::QAManager()->SetRecoParam(AliQAv1::kGLOBAL, grppar) ;
1955 AliQAManager::QAManager()->SetEventSpecie(AliRecoParam::Convert(grppar->GetEventSpecie())) ;
1960 if (fRunQA && IsInTasks(AliQAv1::kRAWS)) {
1961 AliQAManager::QAManager()->SetEventSpecie(fRecoParam.GetEventSpecie()) ;
1962 AliQAManager::QAManager()->RunOneEvent(fRawReader) ;
1963 AliSysInfo::AddStamp(Form("RawQA_%d",iEvent), 0,0,iEvent);
1965 // local single event reconstruction
1966 if (!fRunLocalReconstruction.IsNull()) {
1967 TString detectors=fRunLocalReconstruction;
1968 // run HLT event reconstruction first
1969 // ;-( IsSelected changes the string
1970 if (IsSelected("HLT", detectors) &&
1971 !RunLocalEventReconstruction("HLT")) {
1972 if (fStopOnError) {CleanUp(); return kFALSE;}
1974 detectors=fRunLocalReconstruction;
1975 detectors.ReplaceAll("HLT", "");
1976 if (!RunLocalEventReconstruction(detectors)) {
1985 // fill Event header information from the RawEventHeader
1986 if (fRawReader){FillRawEventHeaderESD(fesd);}
1987 if (fRawReader){FillRawEventHeaderESD(fhltesd);}
1989 fesd->SetRunNumber(fRunLoader->GetHeader()->GetRun());
1990 fhltesd->SetRunNumber(fRunLoader->GetHeader()->GetRun());
1992 ((AliESDRun*)fesd->GetESDRun())->SetDetectorsInDAQ(fRunInfo->GetDetectorMask());
1993 ((AliESDRun*)fhltesd->GetESDRun())->SetDetectorsInDAQ(fRunInfo->GetDetectorMask());
1994 ((AliESDRun*)fesd->GetESDRun())->SetDetectorsInReco(AliDAQ::DetectorPatternOffline(fFillESD.Data()));
1995 ((AliESDRun*)fhltesd->GetESDRun())->SetDetectorsInReco(AliDAQ::DetectorPatternOffline(fFillESD.Data()));
1997 fesd->SetEventNumberInFile(fRunLoader->GetHeader()->GetEventNrInRun());
1998 fhltesd->SetEventNumberInFile(fRunLoader->GetHeader()->GetEventNrInRun());
2000 fesd->SetEventSpecie(fRecoParam.GetEventSpecie());
2001 fhltesd->SetEventSpecie(fRecoParam.GetEventSpecie());
2003 // Set magnetic field from the tracker
2004 fesd->SetMagneticField(AliTracker::GetBz());
2005 fhltesd->SetMagneticField(AliTracker::GetBz());
2007 AliESDRun *esdRun,*esdRunH;
2008 esdRun = (AliESDRun*)fesd->GetESDRun();
2009 esdRunH = (AliESDRun*)fhltesd->GetESDRun();
2010 esdRun->SetBeamEnergyIsSqrtSHalfGeV();
2011 esdRunH->SetBeamEnergyIsSqrtSHalfGeV();
2013 for (int ib=2;ib--;) for (int it=2;it--;) {
2014 esdRun->SetMeanIntensity(ib,it, fBeamInt[ib][it]);
2015 esdRunH->SetMeanIntensity(ib,it, fBeamInt[ib][it]);
2018 fesd->SetBeamEnergy(fGRPData->GetBeamEnergy());
2019 fesd->SetBeamType(fGRPData->GetBeamType().Data());
2020 fesd->SetBeamParticle(fGRPData->GetSingleBeamType(0).Atoi(),0);
2021 fesd->SetBeamParticle(fGRPData->GetSingleBeamType(1).Atoi(),1);
2022 fhltesd->SetBeamEnergy(fGRPData->GetBeamEnergy());
2023 fhltesd->SetBeamType(fGRPData->GetBeamType().Data());
2024 fhltesd->SetBeamParticle(fGRPData->GetSingleBeamType(0).Atoi(),0);
2025 fhltesd->SetBeamParticle(fGRPData->GetSingleBeamType(1).Atoi(),1);
2027 AliMagF* fld = (AliMagF*)TGeoGlobalMagField::Instance()->GetField();
2028 if (fld) { // set info needed for field initialization
2029 fesd->SetCurrentL3(fld->GetCurrentSol());
2030 fesd->SetCurrentDip(fld->GetCurrentDip());
2031 fesd->SetUniformBMap(fld->IsUniform());
2032 fesd->SetBInfoStored();
2034 fhltesd->SetCurrentL3(fld->GetCurrentSol());
2035 fhltesd->SetCurrentDip(fld->GetCurrentDip());
2036 fhltesd->SetUniformBMap(fld->IsUniform());
2037 fhltesd->SetBInfoStored();
2040 // Set most probable pt, for B=0 tracking
2041 // Get the global reco-params. They are atposition 16 inside the array of detectors in fRecoParam
2042 const AliGRPRecoParam *grpRecoParam = dynamic_cast<const AliGRPRecoParam*>(fRecoParam.GetDetRecoParam(kNDetectors));
2043 if (grpRecoParam) AliExternalTrackParam::SetMostProbablePt(grpRecoParam->GetMostProbablePt());
2045 // Fill raw-data error log into the ESD
2046 if (fRawReader) FillRawDataErrorLog(iEvent,fesd);
2048 AliSysInfo::AddStamp(Form("FillHeadErrs_%d",iEvent), 0,0,iEvent);
2051 if (fRunVertexFinder) {
2052 if (!RunVertexFinder(fesd)) {
2053 if (fStopOnError) {CleanUp(); return kFALSE;}
2055 AliSysInfo::AddStamp(Form("VtxFinder_%d",iEvent), 0,0,iEvent);
2058 // For Plane Efficiency: run the SPD trackleter
2059 if (fRunPlaneEff && fSPDTrackleter) {
2060 if (!RunSPDTrackleting(fesd)) {
2061 if (fStopOnError) {CleanUp(); return kFALSE;}
2063 AliSysInfo::AddStamp(Form("TrackletEff_%d",iEvent), 0,0,iEvent);
2067 if (!fRunTracking.IsNull()) {
2068 if (fRunMuonTracking) {
2069 if (!RunMuonTracking(fesd)) {
2070 if (fStopOnError) {CleanUp(); return kFALSE;}
2073 AliSysInfo::AddStamp(Form("TrackingMUON_%d",iEvent), 0,0,iEvent);
2077 if (!fRunTracking.IsNull()) {
2078 if (!RunTracking(fesd,pid)) {
2079 if (fStopOnError) {CleanUp(); return kFALSE;}
2084 if (!fFillESD.IsNull()) {
2085 TString detectors=fFillESD;
2086 // run HLT first and on hltesd
2087 // ;-( IsSelected changes the string
2088 if (IsSelected("HLT", detectors) &&
2089 !FillESD(fhltesd, "HLT")) {
2090 if (fStopOnError) {CleanUp(); return kFALSE;}
2093 // Temporary fix to avoid problems with HLT that overwrites the offline ESDs
2094 if (detectors.Contains("ALL")) {
2096 for (Int_t idet=0; idet<kNDetectors; ++idet){
2097 detectors += fgkDetectorName[idet];
2101 detectors.ReplaceAll("HLT", "");
2102 if (!FillESD(fesd, detectors)) {
2103 if (fStopOnError) {CleanUp(); return kFALSE;}
2111 // Propagate track to the beam pipe (if not already done by ITS)
2113 const Int_t ntracks = fesd->GetNumberOfTracks();
2114 const Double_t kRadius = 2.8; //something less than the beam pipe radius
2117 UShort_t selectedIdx[ntracks];
2119 for (Int_t itrack=0; itrack<ntracks; itrack++){
2120 const Double_t kMaxStep = 1; //max step over the material
2123 AliESDtrack *track = fesd->GetTrack(itrack);
2124 if (!track) continue;
2126 AliExternalTrackParam *tpcTrack =
2127 (AliExternalTrackParam *)track->GetTPCInnerParam();
2131 PropagateTrackToBxByBz(tpcTrack,kRadius,track->GetMass(),kMaxStep,kFALSE);
2134 Int_t n=trkArray.GetEntriesFast();
2135 selectedIdx[n]=track->GetID();
2136 trkArray.AddLast(tpcTrack);
2139 //Tracks refitted by ITS should already be at the SPD vertex
2140 if (track->IsOn(AliESDtrack::kITSrefit)) continue;
2143 PropagateTrackToBxByBz(track,kRadius,track->GetMass(),kMaxStep,kFALSE);
2144 Double_t x[3]; track->GetXYZ(x);
2145 Double_t b[3]; AliTracker::GetBxByBz(x,b);
2146 track->RelateToVertexBxByBz(fesd->GetPrimaryVertexSPD(), b, kVeryBig);
2149 AliSysInfo::AddStamp(Form("RelToSPDVtx_%d",iEvent), 0,0,iEvent);
2151 // Improve the reconstructed primary vertex position using the tracks
2153 Bool_t runVertexFinderTracks = fRunVertexFinderTracks;
2154 if(fesd->GetPrimaryVertexSPD()) {
2155 TString vtitle = fesd->GetPrimaryVertexSPD()->GetTitle();
2156 if(vtitle.Contains("cosmics")) {
2157 runVertexFinderTracks=kFALSE;
2161 if (runVertexFinderTracks) {
2162 // TPC + ITS primary vertex
2163 ftVertexer->SetITSMode();
2164 ftVertexer->SetConstraintOff();
2165 // get cuts for vertexer from AliGRPRecoParam
2166 Bool_t constrSPD=kFALSE;
2168 Int_t nCutsVertexer = grpRecoParam->GetVertexerTracksNCuts();
2169 Double_t *cutsVertexer = new Double_t[nCutsVertexer];
2170 grpRecoParam->GetVertexerTracksCutsITS(cutsVertexer,nCutsVertexer);
2171 ftVertexer->SetCuts(cutsVertexer,nCutsVertexer);
2172 delete [] cutsVertexer; cutsVertexer = NULL;
2173 if(grpRecoParam->GetVertexerTracksConstraintITS()) {
2174 if(fDiamondProfile && fDiamondProfile->GetXRes()<kRadius){
2175 ftVertexer->SetVtxStart(fDiamondProfile); // apply constraint only if sigmax is smaller than the beam pipe radius
2177 if(fDiamondProfileSPD && fDiamondProfileSPD->GetXRes()<kRadius){
2178 ftVertexer->SetVtxStart(fDiamondProfileSPD);
2184 AliESDVertex *pvtx=ftVertexer->FindPrimaryVertex(fesd);
2187 TString title=pvtx->GetTitle();
2188 title.Append("SPD");
2189 pvtx->SetTitle(title);
2191 if (pvtx->GetStatus()) {
2192 fesd->SetPrimaryVertexTracks(pvtx);
2193 for (Int_t i=0; i<ntracks; i++) {
2194 AliESDtrack *t = fesd->GetTrack(i);
2195 Double_t x[3]; t->GetXYZ(x);
2196 Double_t b[3]; AliTracker::GetBxByBz(x,b);
2197 t->RelateToVertexBxByBz(pvtx, b, kVeryBig);
2200 delete pvtx; pvtx=NULL;
2202 AliSysInfo::AddStamp(Form("VtxTrk_%d",iEvent), 0,0,iEvent);
2204 // TPC-only primary vertex
2205 ftVertexer->SetTPCMode();
2206 ftVertexer->SetConstraintOff();
2207 // get cuts for vertexer from AliGRPRecoParam
2209 Int_t nCutsVertexer = grpRecoParam->GetVertexerTracksNCuts();
2210 Double_t *cutsVertexer = new Double_t[nCutsVertexer];
2211 grpRecoParam->GetVertexerTracksCutsTPC(cutsVertexer,nCutsVertexer);
2212 ftVertexer->SetCuts(cutsVertexer,nCutsVertexer);
2213 delete [] cutsVertexer; cutsVertexer = NULL;
2214 if(fDiamondProfileTPC && grpRecoParam->GetVertexerTracksConstraintTPC()) {
2215 if(fDiamondProfileTPC->GetXRes()<kRadius) ftVertexer->SetVtxStart(fDiamondProfileTPC); // apply constraint only if sigmax is smaller than the beam pipe radius
2218 pvtx=ftVertexer->FindPrimaryVertex(&trkArray,selectedIdx);
2220 if (pvtx->GetStatus()) {
2221 fesd->SetPrimaryVertexTPC(pvtx);
2222 for (Int_t i=0; i<ntracks; i++) {
2223 AliESDtrack *t = fesd->GetTrack(i);
2224 Double_t x[3]; t->GetXYZ(x);
2225 Double_t b[3]; AliTracker::GetBxByBz(x,b);
2226 t->RelateToVertexTPCBxByBz(pvtx, b, kVeryBig);
2229 delete pvtx; pvtx=NULL;
2231 AliSysInfo::AddStamp(Form("VtxTPC_%d",iEvent), 0,0,iEvent);
2235 if(fDiamondProfile && fDiamondProfile->GetXRes()<kRadius) fesd->SetDiamond(fDiamondProfile);
2236 else fesd->SetDiamond(fDiamondProfileSPD);
2240 AliV0vertexer vtxer;
2241 // get cuts for V0vertexer from AliGRPRecoParam
2243 Int_t nCutsV0vertexer = grpRecoParam->GetVertexerV0NCuts();
2244 Double_t cutsV0vertexer[nCutsV0vertexer];
2245 grpRecoParam->GetVertexerV0Cuts(cutsV0vertexer);
2246 vtxer.SetCuts(cutsV0vertexer);
2248 vtxer.Tracks2V0vertices(fesd);
2249 AliSysInfo::AddStamp(Form("V0Finder_%d",iEvent), 0,0,iEvent);
2251 if (fRunCascadeFinder) {
2253 AliCascadeVertexer cvtxer;
2254 // get cuts for CascadeVertexer from AliGRPRecoParam
2256 Int_t nCutsCascadeVertexer = grpRecoParam->GetVertexerCascadeNCuts();
2257 Double_t cutsCascadeVertexer[nCutsCascadeVertexer];
2258 grpRecoParam->GetVertexerCascadeCuts(cutsCascadeVertexer);
2259 cvtxer.SetCuts(cutsCascadeVertexer);
2261 cvtxer.V0sTracks2CascadeVertices(fesd);
2262 AliSysInfo::AddStamp(Form("CascadeFinder_%d",iEvent), 0,0,iEvent);
2267 if (fReconstructor[3])
2268 GetReconstructor(3)->FillEventTimeWithTOF(fesd,&pid);
2273 if (fFillTriggerESD) {
2274 if (!FillTriggerESD(fesd)) {
2275 if (fStopOnError) {CleanUp(); return kFALSE;}
2278 // Always fill scalers
2279 if (!FillTriggerScalers(fesd)) {
2280 if (fStopOnError) {CleanUp(); return kFALSE;}
2283 AliSysInfo::AddStamp(Form("FillVaria_%d",iEvent), 0,0,iEvent);
2286 UInt_t specie = fesd->GetEventSpecie();
2287 Bool_t keepAll = (specie==AliRecoParam::kCosmic || specie==AliRecoParam::kCalib);
2288 if (fCleanESD && (!keepAll) ) {
2290 AliSysInfo::AddStamp(Form("CleanESD_%d",iEvent), 0,0,iEvent);
2293 // RS run updated trackleter: since we want to mark the clusters used by tracks and also mark the
2294 // tracks interpreted as primary, this step should be done in the very end, when full
2295 // ESD info is available (particulalry, V0s)
2297 if (fRunMultFinder) {
2298 if (!RunMultFinder(fesd)) {
2299 if (fStopOnError) {CleanUp(); return kFALSE;}
2301 AliSysInfo::AddStamp(Form("MultFinder_%d",iEvent), 0,0,iEvent);
2304 if (fRunQA && IsInTasks(AliQAv1::kESDS)) {
2305 AliQAManager::QAManager()->SetEventSpecie(fRecoParam.GetEventSpecie()) ;
2306 AliQAManager::QAManager()->RunOneEvent(fesd, fhltesd) ;
2307 AliSysInfo::AddStamp(Form("RunQA_%d",iEvent), 0,0,iEvent);
2310 AliQADataMaker *qadm = AliQAManager::QAManager()->GetQADataMaker(AliQAv1::kGLOBAL);
2312 qadm->SetEventSpecie(fRecoParam.GetEventSpecie()) ;
2313 if (qadm && IsInTasks(AliQAv1::kESDS))
2314 qadm->Exec(AliQAv1::kESDS, fesd);
2315 AliSysInfo::AddStamp(Form("RunGlobQA_%d",iEvent), 0,0,iEvent);
2318 // copy HLT decision from HLTesd to esd
2319 // the most relevant information is stored in a reduced container in the esd,
2320 // while the full information can be found in the HLTesd
2321 TObject* pHLTSrc=fhltesd->FindListObject(AliESDHLTDecision::Name());
2322 TObject* pHLTTgt=fesd->FindListObject(AliESDHLTDecision::Name());
2323 if (pHLTSrc && pHLTTgt) {
2324 pHLTSrc->Copy(*pHLTTgt);
2327 // Perform analysis of this event if requested
2328 // RS: Should be done before WriteESDfriend, since the latter may clean the esdfriend
2330 fRecoHandler->BeginEvent(iEvent);
2331 fAnalysis->ExecAnalysis();
2332 fRecoHandler->FinishEvent();
2333 AliSysInfo::AddStamp(Form("Analysis_%d",iEvent), 0,0,iEvent);
2336 if (fWriteESDfriend) {
2337 fesd->GetESDfriend(fesdf);
2338 AliSysInfo::AddStamp(Form("CreateFriend_%d",iEvent), 0,0,iEvent);
2343 AliSysInfo::AddStamp(Form("ESDFill_%d",iEvent), 0,0,iEvent);
2345 if (fWriteESDfriend) {
2347 AliSysInfo::AddStamp(Form("WriteFriend_%d",iEvent), 0,0,iEvent);
2351 // Auto-save the ESD tree in case of prompt reco @P2
2352 if (fRawReader && fRawReader->UseAutoSaveESD()) {
2353 ftree->AutoSave("SaveSelf");
2354 if (fWriteESDfriend) ftreeF->AutoSave("SaveSelf");
2360 if (fRunAliEVE) RunAliEVE();
2364 if (fWriteESDfriend) {
2365 fesdf->~AliESDfriend();
2366 new (fesdf) AliESDfriend(); // Reset...
2369 gSystem->GetProcInfo(&procInfo);
2370 Long_t dMres=(procInfo.fMemResident-oldMres)/1024;
2371 Long_t dMvir=(procInfo.fMemVirtual-oldMvir)/1024;
2372 Float_t dCPU=procInfo.fCpuUser+procInfo.fCpuSys-oldCPU;
2373 aveDMres+=(dMres-aveDMres)/(iEvent-fFirstEvent+1);
2374 aveDMvir+=(dMvir-aveDMvir)/(iEvent-fFirstEvent+1);
2375 aveDCPU+=(dCPU-aveDCPU)/(iEvent-fFirstEvent+1);
2376 AliInfo(Form("======================= End Event %d: Res %ld(%3ld <%3ld>) Vir %ld(%3ld <%3ld>) CPU %5.2f <%5.2f> ===================",
2377 iEvent, procInfo.fMemResident/1024, dMres, aveDMres, procInfo.fMemVirtual/1024, dMvir, aveDMvir, dCPU, aveDCPU));
2378 oldMres=procInfo.fMemResident;
2379 oldMvir=procInfo.fMemVirtual;
2380 oldCPU=procInfo.fCpuUser+procInfo.fCpuSys;
2383 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
2384 if (fReconstructor[iDet]) {
2385 fReconstructor[iDet]->SetRecoParam(NULL);
2386 fReconstructor[iDet]->SetEventInfo(NULL);
2388 if (fTracker[iDet]) fTracker[iDet]->SetEventInfo(NULL);
2391 if (fRunQA || fRunGlobalQA)
2392 AliQAManager::QAManager()->Increment() ;
2394 DeleteRecPoints(fDeleteRecPoints);
2395 DeleteDigits(fDeleteDigits);
2400 //_____________________________________________________________________________
2401 void AliReconstruction::SlaveTerminate()
2403 // Finalize the run on the slave side
2404 // Called after the exit
2405 // from the event loop
2406 AliCodeTimerAuto("",0);
2407 // If analysis was done during reconstruction, we need to call SlaveTerminate for it
2409 fAnalysis->PackOutput(fOutput);
2410 fAnalysis->SetSkipTerminate(kTRUE);
2411 fAnalysis->Terminate();
2414 if (fIsNewRunLoader) { // galice.root didn't exist
2415 fRunLoader->WriteHeader("OVERWRITE");
2416 fRunLoader->WriteTrigger("OVERWRITE");
2417 fRunLoader->CdGAFile();
2418 fRunLoader->Write(0, TObject::kOverwrite);
2421 const TMap *cdbMap = AliCDBManager::Instance()->GetStorageMap();
2422 const TList *cdbList = AliCDBManager::Instance()->GetRetrievedIds();
2424 TMap *cdbMapCopy = new TMap(cdbMap->GetEntries());
2425 cdbMapCopy->SetOwner(1);
2426 cdbMapCopy->SetName("cdbMap");
2427 TIter iter(cdbMap->GetTable());
2430 while((pair = dynamic_cast<TPair*> (iter.Next()))){
2431 TObjString* keyStr = dynamic_cast<TObjString*> (pair->Key());
2432 TObjString* valStr = dynamic_cast<TObjString*> (pair->Value());
2433 if (keyStr && valStr)
2434 cdbMapCopy->Add(new TObjString(keyStr->GetName()), new TObjString(valStr->GetName()));
2437 TList *cdbListCopy = new TList();
2438 cdbListCopy->SetOwner(1);
2439 cdbListCopy->SetName("cdbList");
2441 TIter iter2(cdbList);
2444 while((id = dynamic_cast<AliCDBId*> (iter2.Next()))){
2445 cdbListCopy->Add(new TObjString(id->ToString().Data()));
2448 ftree->GetUserInfo()->Add(cdbMapCopy);
2449 ftree->GetUserInfo()->Add(cdbListCopy);
2451 // Add the AliRoot version that created this file
2452 TString sVersion("aliroot ");
2453 sVersion += ALIROOT_SVN_BRANCH;
2455 sVersion += ALIROOT_SVN_REVISION;
2456 sVersion += "; root ";
2457 sVersion += ROOT_SVN_BRANCH;
2459 sVersion += ROOT_SVN_REVISION;
2460 sVersion += "; metadata ";
2461 sVersion += gSystem->Getenv("PRODUCTION_METADATA");
2464 TNamed * alirootVersion = new TNamed("alirootVersion",sVersion.Data());
2465 ftree->GetUserInfo()->Add(alirootVersion); // The list becomes owner of alirootVersion
2469 // we want to have only one tree version number
2470 ftree->Write(ftree->GetName(),TObject::kOverwrite);
2471 fhlttree->Write(fhlttree->GetName(),TObject::kOverwrite);
2473 if (fWriteESDfriend) {
2475 ftreeF->Write(ftreeF->GetName(),TObject::kOverwrite);
2478 // Finish with Plane Efficiency evaluation: before of CleanUp !!!
2479 if (fRunPlaneEff && !FinishPlaneEff()) {
2480 AliWarning("Finish PlaneEff evaluation failed");
2483 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
2484 if (fReconstructor[iDet]) fReconstructor[iDet]->Terminate();
2486 // End of cycle for the in-loop
2488 if (fRunQA || fRunGlobalQA) {
2489 AliQAManager::QAManager()->EndOfCycle() ;
2491 !fProofOutputLocation.IsNull() &&
2492 fProofOutputArchive.IsNull() &&
2493 !fProofOutputDataset) {
2494 TString qaOutputFile(Form("%sMerged.%s.Data.root",
2495 fProofOutputLocation.Data(),
2496 AliQAv1::GetQADataFileName()));
2497 TProofOutputFile *qaProofFile = new TProofOutputFile(Form("Merged.%s.Data.root",
2498 AliQAv1::GetQADataFileName()));
2499 qaProofFile->SetOutputFileName(qaOutputFile.Data());
2500 if (AliDebugLevel() > 0) qaProofFile->Dump();
2501 fOutput->Add(qaProofFile);
2502 MergeQA(qaProofFile->GetFileName());
2513 if (!fProofOutputFileName.IsNull() &&
2514 !fProofOutputLocation.IsNull() &&
2515 fProofOutputDataset &&
2516 !fProofOutputArchive.IsNull()) {
2517 TProofOutputFile *zipProofFile = new TProofOutputFile(fProofOutputFileName.Data(),
2519 fProofOutputLocation.Data());
2520 if (AliDebugLevel() > 0) zipProofFile->Dump();
2521 fOutput->Add(zipProofFile);
2522 TString fileList(fProofOutputArchive.Data());
2523 fileList.ReplaceAll(","," ");
2525 #if ROOT_SVN_REVISION >= 30174
2526 command.Form("zip -n root %s/%s %s",zipProofFile->GetDir(kTRUE),zipProofFile->GetFileName(),fileList.Data());
2528 command.Form("zip -n root %s/%s %s",zipProofFile->GetDir(),zipProofFile->GetFileName(),fileList.Data());
2530 AliInfo(Form("Executing: %s",command.Data()));
2531 gSystem->Exec(command.Data());
2536 //_____________________________________________________________________________
2537 void AliReconstruction::Terminate()
2539 // Create tags for the events in the ESD tree (the ESD tree is always present)
2540 // In case of empty events the tags will contain dummy values
2541 AliCodeTimerAuto("",0);
2543 // Do not call the ESD tag creator in case of PROOF-based reconstruction
2545 AliESDTagCreator *esdtagCreator = new AliESDTagCreator();
2546 esdtagCreator->CreateESDTags(fFirstEvent,fLastEvent,fGRPData, AliQAv1::Instance()->GetQA(), AliQAv1::Instance()->GetEventSpecies(), AliQAv1::kNDET, AliRecoParam::kNSpecies);
2547 delete esdtagCreator;
2550 // Cleanup of CDB manager: cache and active storages!
2551 AliCDBManager::Instance()->ClearCache();
2554 //_____________________________________________________________________________
2555 Bool_t AliReconstruction::RunLocalEventReconstruction(const TString& detectors)
2557 // run the local reconstruction
2559 static Int_t eventNr=0;
2560 AliCodeTimerAuto("",0)
2562 TString detStr = detectors;
2563 // execute HLT reconstruction first since other detector reconstruction
2564 // might depend on HLT data
2565 // key 'HLT' is removed from detStr by IsSelected
2566 if (!IsSelected("HLT", detStr)) {
2567 AliReconstructor* reconstructor = GetReconstructor(kNDetectors-1);
2568 if (reconstructor) {
2569 // there is no AliLoader for HLT, see
2570 // https://savannah.cern.ch/bugs/?35473
2571 AliInfo("running reconstruction for HLT");
2573 AliInfo("reconstructor->Reconstruct(fRawReader, NULL)");
2574 reconstructor->Reconstruct(fRawReader, NULL);
2577 AliInfo("reconstructor->Reconstruct(dummy, NULL)");
2579 reconstructor->Reconstruct(dummy, NULL);
2582 AliSysInfo::AddStamp(Form("LRecHLT_%d",eventNr), -1,1,eventNr);
2585 AliInfo(Form("kNDetectors = %d",kNDetectors));
2587 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
2588 if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
2589 AliDebug(1, Form("Detector: %s", fgkDetectorName[iDet]));
2590 AliReconstructor* reconstructor = GetReconstructor(iDet);
2591 if (!reconstructor) continue;
2592 AliLoader* loader = fLoader[iDet];
2594 AliWarning(Form("No loader is defined for %s!",fgkDetectorName[iDet]));
2597 // conversion of digits
2598 if (fRawReader && reconstructor->HasDigitConversion()) {
2599 AliInfo(Form("converting raw data digits into root objects for %s",
2600 fgkDetectorName[iDet]));
2601 // AliCodeTimerAuto(Form("converting raw data digits into root objects for %s",
2602 // fgkDetectorName[iDet]),0);
2603 loader->LoadDigits("update");
2604 loader->CleanDigits();
2605 loader->MakeDigitsContainer();
2606 TTree* digitsTree = loader->TreeD();
2607 reconstructor->ConvertDigits(fRawReader, digitsTree);
2608 loader->WriteDigits("OVERWRITE");
2609 loader->UnloadDigits();
2611 // local reconstruction
2612 AliInfo(Form("running reconstruction for %s", fgkDetectorName[iDet]));
2613 //AliCodeTimerAuto(Form("running reconstruction for %s", fgkDetectorName[iDet]),0);
2614 AliDebug(1, "Loading Rec Points");
2615 loader->LoadRecPoints("update");
2616 AliDebug(1, "Cleaning Rec Points");
2617 loader->CleanRecPoints();
2618 AliDebug(1, "Making Rec Points Container");
2619 loader->MakeRecPointsContainer();
2620 TTree* clustersTree = loader->TreeR();
2621 if (fRawReader && !reconstructor->HasDigitConversion()) {
2622 reconstructor->Reconstruct(fRawReader, clustersTree);
2625 AliDebug(1, "Loading Digits");
2626 loader->LoadDigits("read");
2627 TTree* digitsTree = loader->TreeD();
2628 AliDebug(1, Form("Digits Tree = %p",digitsTree));
2630 AliError(Form("Can't get the %s digits tree", fgkDetectorName[iDet]));
2635 AliDebug(1, "Digits -> Clusters");
2636 reconstructor->Reconstruct(digitsTree, clustersTree);
2637 if (fRunQA && IsInTasks(AliQAv1::kDIGITSR)) {
2638 AliQAManager::QAManager()->SetEventSpecie(fRecoParam.GetEventSpecie()) ;
2639 AliQAManager::QAManager()->RunOneEventInOneDetector(iDet, digitsTree) ;
2642 loader->UnloadDigits();
2644 if (fRunQA && IsInTasks(AliQAv1::kRECPOINTS)) {
2645 AliQAManager::QAManager()->SetEventSpecie(fRecoParam.GetEventSpecie()) ;
2646 AliQAManager::QAManager()->RunOneEventInOneDetector(iDet, clustersTree) ;
2648 loader->WriteRecPoints("OVERWRITE");
2649 loader->UnloadRecPoints();
2650 AliSysInfo::AddStamp(Form("LRec%s_%d",fgkDetectorName[iDet],eventNr), iDet,1,eventNr);
2652 if (!IsSelected("CTP", detStr)) AliDebug(10,"No CTP");
2653 if ((detStr.CompareTo("ALL") != 0) && !detStr.IsNull()) {
2654 AliError(Form("the following detectors were not found: %s",
2662 //_____________________________________________________________________________
2663 Bool_t AliReconstruction::RunSPDTrackleting(AliESDEvent*& esd)
2665 // run the SPD trackleting (for SPD efficiency purpouses)
2667 AliCodeTimerAuto("",0)
2669 Double_t vtxPos[3] = {0, 0, 0};
2670 Double_t vtxErr[3] = {0.0, 0.0, 0.0};
2676 if (fRunLoader->GetHeader() && fRunLoader->GetHeader()->GenEventHeader()) {
2677 fRunLoader->GetHeader()->GenEventHeader()->PrimaryVertex(mcVertex);
2678 for (Int_t i = 0; i < 3; i++) vtxPos[i] = mcVertex[i];
2681 const AliESDVertex *vertex = esd->GetVertex();
2683 AliWarning("Vertex not found");
2686 vertex->GetXYZ(vtxPos);
2687 vertex->GetSigmaXYZ(vtxErr);
2688 if (fSPDTrackleter) {
2689 AliInfo("running the SPD Trackleter for Plane Efficiency Evaluation");
2692 fLoader[0]->LoadRecPoints("read");
2693 TTree* tree = fLoader[0]->TreeR();
2695 AliError("Can't get the ITS cluster tree");
2698 fSPDTrackleter->LoadClusters(tree);
2699 fSPDTrackleter->SetVertex(vtxPos, vtxErr);
2701 if (fSPDTrackleter->Clusters2Tracks(esd) != 0) {
2702 AliWarning("AliITSTrackleterSPDEff Clusters2Tracks failed");
2703 // fLoader[0]->UnloadRecPoints();
2706 //fSPDTrackleter->UnloadRecPoints();
2708 AliWarning("SPDTrackleter not available");
2714 //_____________________________________________________________________________
2715 Bool_t AliReconstruction::RunVertexFinder(AliESDEvent*& esd)
2717 // run the barrel tracking
2719 AliCodeTimerAuto("",0)
2721 AliVertexer *vertexer = CreateVertexer();
2722 if (!vertexer) return kFALSE;
2724 AliInfo(Form("running the ITS vertex finder: %s",vertexer->ClassName()));
2725 AliESDVertex* vertex = NULL;
2727 fLoader[0]->LoadRecPoints();
2728 TTree* cltree = fLoader[0]->TreeR();
2730 if(fDiamondProfileSPD) vertexer->SetVtxStart(fDiamondProfileSPD);
2731 vertex = vertexer->FindVertexForCurrentEvent(cltree);
2734 AliError("Can't get the ITS cluster tree");
2736 fLoader[0]->UnloadRecPoints();
2739 AliError("Can't get the ITS loader");
2742 AliWarning("Vertex not found");
2743 vertex = new AliESDVertex();
2744 vertex->SetName("default");
2747 vertex->SetName("reconstructed");
2752 vertex->GetXYZ(vtxPos);
2753 vertex->GetSigmaXYZ(vtxErr);
2755 esd->SetPrimaryVertexSPD(vertex);
2756 AliESDVertex *vpileup = NULL;
2757 Int_t novertices = 0;
2758 vpileup = vertexer->GetAllVertices(novertices);
2760 for (Int_t kk=1; kk<novertices; kk++)esd->AddPileupVertexSPD(&vpileup[kk]);
2763 // if SPD multiplicity has been determined, it is stored in the ESD
2764 AliMultiplicity *mult = vertexer->GetMultiplicity();
2765 if(mult)esd->SetMultiplicity(mult);
2767 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
2768 if (fTracker[iDet]) fTracker[iDet]->SetVertex(vtxPos, vtxErr);
2777 //_____________________________________________________________________________
2778 Bool_t AliReconstruction::RunMultFinder(AliESDEvent*& esd)
2780 // run the trackleter for multiplicity study
2782 AliCodeTimerAuto("",0)
2784 AliTrackleter *trackleter = CreateMultFinder();
2785 if (!trackleter) return kFALSE;
2787 AliInfo(Form("running the ITS multiplicity finder: %s",trackleter->ClassName()));
2790 fLoader[0]->LoadRecPoints();
2791 TTree* cltree = fLoader[0]->TreeR();
2793 trackleter->Reconstruct(esd,cltree);
2794 AliMultiplicity *mult = trackleter->GetMultiplicity();
2795 if(mult) esd->SetMultiplicity(mult);
2798 AliError("Can't get the ITS cluster tree");
2800 fLoader[0]->UnloadRecPoints();
2803 AliError("Can't get the ITS loader");
2811 //_____________________________________________________________________________
2812 Bool_t AliReconstruction::RunHLTTracking(AliESDEvent*& esd)
2814 // run the HLT barrel tracking
2816 AliCodeTimerAuto("",0)
2819 AliError("Missing runLoader!");
2823 AliInfo("running HLT tracking");
2825 // Get a pointer to the HLT reconstructor
2826 AliReconstructor *reconstructor = GetReconstructor(kNDetectors-1);
2827 if (!reconstructor) return kFALSE;
2830 for (Int_t iDet = 1; iDet >= 0; iDet--) {
2831 TString detName = fgkDetectorName[iDet];
2832 AliDebug(1, Form("%s HLT tracking", detName.Data()));
2833 reconstructor->SetOption(detName.Data());
2834 AliTracker *tracker = reconstructor->CreateTracker();
2836 AliWarning(Form("couldn't create a HLT tracker for %s", detName.Data()));
2837 if (fStopOnError) return kFALSE;
2841 Double_t vtxErr[3]={0.005,0.005,0.010};
2842 const AliESDVertex *vertex = esd->GetVertex();
2843 vertex->GetXYZ(vtxPos);
2844 tracker->SetVertex(vtxPos,vtxErr);
2846 fLoader[iDet]->LoadRecPoints("read");
2847 TTree* tree = fLoader[iDet]->TreeR();
2849 AliError(Form("Can't get the %s cluster tree", detName.Data()));
2852 tracker->LoadClusters(tree);
2854 if (tracker->Clusters2Tracks(esd) != 0) {
2855 AliError(Form("HLT %s Clusters2Tracks failed", fgkDetectorName[iDet]));
2859 tracker->UnloadClusters();
2867 //_____________________________________________________________________________
2868 Bool_t AliReconstruction::RunMuonTracking(AliESDEvent*& esd)
2870 // run the muon spectrometer tracking
2872 AliCodeTimerAuto("",0)
2875 AliError("Missing runLoader!");
2878 Int_t iDet = GetDetIndex("MUON"); // for MUON
2880 // Get a pointer to the MUON reconstructor
2881 AliReconstructor *reconstructor = GetReconstructor(iDet);
2882 if (!reconstructor) return kFALSE;
2885 TString detName = fgkDetectorName[iDet];
2886 AliDebug(1, Form("%s tracking", detName.Data()));
2887 AliTracker *tracker = reconstructor->CreateTracker();
2889 AliWarning(Form("couldn't create a tracker for %s", detName.Data()));
2894 fLoader[iDet]->LoadRecPoints("read");
2896 tracker->LoadClusters(fLoader[iDet]->TreeR());
2898 Int_t rv = tracker->Clusters2Tracks(esd);
2900 fLoader[iDet]->UnloadRecPoints();
2902 tracker->UnloadClusters();
2906 AliError(Form("%s Clusters2Tracks failed", fgkDetectorName[iDet]));
2914 //_____________________________________________________________________________
2915 Bool_t AliReconstruction::RunTracking(AliESDEvent*& esd,AliESDpid &PID)
2917 // run the barrel tracking
2918 static Int_t eventNr=0;
2919 AliCodeTimerAuto("",0)
2921 AliInfo("running tracking");
2923 // Set the event info which is used
2924 // by the trackers in order to obtain
2925 // information about read-out detectors,
2927 AliDebug(1, "Setting event info");
2928 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
2929 if (!fTracker[iDet]) continue;
2930 fTracker[iDet]->SetEventInfo(&fEventInfo);
2933 //Fill the ESD with the T0 info (will be used by the TOF)
2934 if (fReconstructor[11] && fLoader[11]) {
2935 fLoader[11]->LoadRecPoints("READ");
2936 TTree *treeR = fLoader[11]->TreeR();
2938 GetReconstructor(11)->FillESD((TTree *)NULL,treeR,esd);
2942 // pass 1: TPC + ITS inwards
2943 for (Int_t iDet = 1; iDet >= 0; iDet--) {
2944 if (!fTracker[iDet]) continue;
2945 AliDebug(1, Form("%s tracking", fgkDetectorName[iDet]));
2948 fLoader[iDet]->LoadRecPoints("read");
2949 AliSysInfo::AddStamp(Form("RLoadCluster%s_%d",fgkDetectorName[iDet],eventNr),iDet,1, eventNr);
2950 TTree* tree = fLoader[iDet]->TreeR();
2952 AliError(Form("Can't get the %s cluster tree", fgkDetectorName[iDet]));
2955 fTracker[iDet]->LoadClusters(tree);
2956 AliSysInfo::AddStamp(Form("TLoadCluster%s_%d",fgkDetectorName[iDet],eventNr), iDet,2, eventNr);
2958 if (fTracker[iDet]->Clusters2Tracks(esd) != 0) {
2959 AliError(Form("%s Clusters2Tracks failed", fgkDetectorName[iDet]));
2962 AliSysInfo::AddStamp(Form("Tracking0%s_%d",fgkDetectorName[iDet],eventNr), iDet,3,eventNr);
2963 // preliminary PID in TPC needed by the ITS tracker
2965 GetReconstructor(1)->FillESD((TTree*)NULL, (TTree*)NULL, esd);
2966 PID.MakePID(esd,kTRUE);
2967 AliSysInfo::AddStamp(Form("MakePID0%s_%d",fgkDetectorName[iDet],eventNr), iDet,4,eventNr);
2971 // pass 2: ALL backwards
2973 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
2974 if (!fTracker[iDet]) continue;
2975 AliDebug(1, Form("%s back propagation", fgkDetectorName[iDet]));
2978 if (iDet > 1) { // all except ITS, TPC
2980 fLoader[iDet]->LoadRecPoints("read");
2981 AliSysInfo::AddStamp(Form("RLoadCluster0%s_%d",fgkDetectorName[iDet],eventNr), iDet,1, eventNr);
2982 tree = fLoader[iDet]->TreeR();
2984 AliError(Form("Can't get the %s cluster tree", fgkDetectorName[iDet]));
2987 fTracker[iDet]->LoadClusters(tree);
2988 AliSysInfo::AddStamp(Form("TLoadCluster0%s_%d",fgkDetectorName[iDet],eventNr), iDet,2, eventNr);
2992 if (iDet>1) // start filling residuals for the "outer" detectors
2994 AliTracker::SetFillResiduals(fRecoParam.GetEventSpecie(), kTRUE);
2995 TObjArray ** arr = AliTracker::GetResidualsArray() ;
2997 AliRecoParam::EventSpecie_t es=fRecoParam.GetEventSpecie();
2998 TObjArray * elem = arr[AliRecoParam::AConvert(es)];
2999 if ( elem && (! elem->At(0)) ) {
3000 AliQADataMaker *qadm = AliQAManager::QAManager()->GetQADataMaker(AliQAv1::kGLOBAL);
3001 if (qadm) qadm->InitRecPointsForTracker() ;
3004 // AliSysInfo::AddStamp(Form("QAInitResid%s_%d",fgkDetectorName[iDet],eventNr), iDet,0, eventNr);
3006 if (fTracker[iDet]->PropagateBack(esd) != 0) {
3007 AliError(Form("%s backward propagation failed", fgkDetectorName[iDet]));
3010 AliSysInfo::AddStamp(Form("Tracking1%s_%d",fgkDetectorName[iDet],eventNr), iDet,3, eventNr);
3013 if (iDet > 3) { // all except ITS, TPC, TRD and TOF
3014 fTracker[iDet]->UnloadClusters();
3015 fLoader[iDet]->UnloadRecPoints();
3017 // updated PID in TPC needed by the ITS tracker -MI
3019 //GetReconstructor(1)->FillESD((TTree*)NULL, (TTree*)NULL, esd);
3020 //AliESDpid::MakePID(esd);
3021 PID.MakePID(esd,kTRUE);
3022 AliSysInfo::AddStamp(Form("MakePID1%s_%d",fgkDetectorName[iDet],eventNr), iDet,4,eventNr);
3026 //stop filling residuals for the "outer" detectors
3027 if (fRunGlobalQA) AliTracker::SetFillResiduals(fRecoParam.GetEventSpecie(), kFALSE);
3029 // pass 3: TRD + TPC + ITS refit inwards
3031 for (Int_t iDet = 2; iDet >= 0; iDet--) {
3032 if (!fTracker[iDet]) continue;
3033 AliDebug(1, Form("%s inward refit", fgkDetectorName[iDet]));
3036 if (iDet<2) // start filling residuals for TPC and ITS
3038 AliTracker::SetFillResiduals(fRecoParam.GetEventSpecie(), kTRUE);
3039 TObjArray ** arr = AliTracker::GetResidualsArray() ;
3041 AliRecoParam::EventSpecie_t es=fRecoParam.GetEventSpecie();
3042 TObjArray * elem = arr[AliRecoParam::AConvert(es)];
3043 if ( elem && (! elem->At(0)) ) {
3044 AliQADataMaker *qadm = AliQAManager::QAManager()->GetQADataMaker(AliQAv1::kGLOBAL);
3045 if (qadm) qadm->InitRecPointsForTracker() ;
3050 if (fTracker[iDet]->RefitInward(esd) != 0) {
3051 AliError(Form("%s inward refit failed", fgkDetectorName[iDet]));
3054 // run postprocessing
3055 if (fTracker[iDet]->PostProcess(esd) != 0) {
3056 AliError(Form("%s postprocessing failed", fgkDetectorName[iDet]));
3059 AliSysInfo::AddStamp(Form("Tracking2%s_%d",fgkDetectorName[iDet],eventNr), iDet,3, eventNr);
3062 // write space-points to the ESD in case alignment data output
3064 if (fWriteAlignmentData) {
3065 WriteAlignmentData(esd);
3066 AliSysInfo::AddStamp(Form("WrtAlignData_%d",eventNr), 0,0, eventNr);
3069 for (Int_t iDet = 3; iDet >= 0; iDet--) {
3070 if (!fTracker[iDet]) continue;
3072 fTracker[iDet]->UnloadClusters();
3073 AliSysInfo::AddStamp(Form("TUnloadCluster%s_%d",fgkDetectorName[iDet],eventNr), iDet,4, eventNr);
3074 fLoader[iDet]->UnloadRecPoints();
3075 AliSysInfo::AddStamp(Form("RUnloadCluster%s_%d",fgkDetectorName[iDet],eventNr), iDet,5, eventNr);
3077 // stop filling residuals for TPC and ITS
3078 if (fRunGlobalQA) AliTracker::SetFillResiduals(fRecoParam.GetEventSpecie(), kFALSE);
3084 //_____________________________________________________________________________
3085 Bool_t AliReconstruction::CleanESD(AliESDEvent *esd){
3087 // Remove the data which are not needed for the physics analysis.
3090 Int_t nTracks=esd->GetNumberOfTracks();
3091 Int_t nV0s=esd->GetNumberOfV0s();
3093 (Form("Number of ESD tracks and V0s before cleaning: %d %d",nTracks,nV0s));
3095 Float_t cleanPars[]={fV0DCAmax,fV0CsPmin,fDmax,fZmax};
3096 Bool_t rc=esd->Clean(cleanPars);
3098 nTracks=esd->GetNumberOfTracks();
3099 nV0s=esd->GetNumberOfV0s();
3101 (Form("Number of ESD tracks and V0s after cleaning %d %d",nTracks,nV0s));
3106 //_____________________________________________________________________________
3107 Bool_t AliReconstruction::FillESD(AliESDEvent*& esd, const TString& detectors)
3109 // fill the event summary data
3111 AliCodeTimerAuto("",0)
3112 static Int_t eventNr=0;
3113 TString detStr = detectors;
3115 AliSysInfo::AddStamp(Form("FillESDb%d",eventNr), -19,-19, eventNr);
3116 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
3117 if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
3118 AliReconstructor* reconstructor = GetReconstructor(iDet);
3119 if (!reconstructor) continue;
3120 AliDebug(1, Form("filling ESD for %s", fgkDetectorName[iDet]));
3121 TTree* clustersTree = NULL;
3122 if (fLoader[iDet]) {
3123 fLoader[iDet]->LoadRecPoints("read");
3124 clustersTree = fLoader[iDet]->TreeR();
3125 if (!clustersTree) {
3126 AliError(Form("Can't get the %s clusters tree",
3127 fgkDetectorName[iDet]));
3128 if (fStopOnError) return kFALSE;
3131 if (fRawReader && !reconstructor->HasDigitConversion()) {
3132 reconstructor->FillESD(fRawReader, clustersTree, esd);
3134 TTree* digitsTree = NULL;
3135 if (fLoader[iDet]) {
3136 fLoader[iDet]->LoadDigits("read");
3137 digitsTree = fLoader[iDet]->TreeD();
3139 AliError(Form("Can't get the %s digits tree",
3140 fgkDetectorName[iDet]));
3141 if (fStopOnError) return kFALSE;
3144 reconstructor->FillESD(digitsTree, clustersTree, esd);
3145 if (fLoader[iDet]) fLoader[iDet]->UnloadDigits();
3147 if (fLoader[iDet]) {
3148 fLoader[iDet]->UnloadRecPoints();
3152 if (!IsSelected("CTP", detStr)) AliDebug(10,"No CTP");
3153 if ((detStr.CompareTo("ALL") != 0) && !detStr.IsNull()) {
3154 AliError(Form("the following detectors were not found: %s",
3156 if (fStopOnError) return kFALSE;
3158 AliSysInfo::AddStamp(Form("FillESDe%d",eventNr), -20,-20, eventNr);
3163 //_____________________________________________________________________________
3164 Bool_t AliReconstruction::FillTriggerESD(AliESDEvent*& esd)
3166 // Reads the trigger decision which is
3167 // stored in Trigger.root file and fills
3168 // the corresponding esd entries
3170 AliCodeTimerAuto("",0)
3172 AliInfo("Filling trigger information into the ESD");
3175 AliCTPRawStream input(fRawReader);
3176 if (!input.Next()) {
3177 AliWarning("No valid CTP (trigger) DDL raw data is found ! The trigger info is taken from the event header!");
3180 if (esd->GetTriggerMask() != input.GetClassMask())
3181 AliError(Form("Invalid trigger pattern found in CTP raw-data: %llx %llx",
3182 input.GetClassMask(),esd->GetTriggerMask()));
3183 if (esd->GetOrbitNumber() != input.GetOrbitID())
3184 AliError(Form("Invalid orbit id found in CTP raw-data: %x %x",
3185 input.GetOrbitID(),esd->GetOrbitNumber()));
3186 if (esd->GetBunchCrossNumber() != input.GetBCID())
3187 AliError(Form("Invalid bunch-crossing id found in CTP raw-data: %x %x",
3188 input.GetBCID(),esd->GetBunchCrossNumber()));
3189 AliESDHeader* esdheader = esd->GetHeader();
3190 esdheader->SetL0TriggerInputs(input.GetL0Inputs());
3191 esdheader->SetL1TriggerInputs(input.GetL1Inputs());
3192 esdheader->SetL2TriggerInputs(input.GetL2Inputs());
3194 // UInt_t orbit=input.GetOrbitID();
3195 for(Int_t i=0 ; i<input.GetNIRs() ; i++ ) {
3196 esdheader->AddTriggerIR(input.GetIR(i));
3198 AliCentralTrigger* rlCTP = fRunLoader->GetTrigger();
3200 rlCTP->SetL0TriggerInputs(input.GetL0Inputs());
3201 rlCTP->SetL1TriggerInputs(input.GetL1Inputs());
3202 rlCTP->SetL2TriggerInputs(input.GetL2Inputs());
3205 if (fIsNewRunLoader) fRunLoader->TreeCT()->Fill();
3209 //_____________________________________________________________________________
3210 Bool_t AliReconstruction::FillTriggerScalers(AliESDEvent*& esd)
3213 //fRunScalers->Print();
3214 if(fRunScalers && fRunScalers->CheckRunScalers()){
3215 AliTimeStamp* timestamp = new AliTimeStamp(esd->GetOrbitNumber(), esd->GetPeriodNumber(), esd->GetBunchCrossNumber());
3216 //AliTimeStamp* timestamp = new AliTimeStamp(10308000, 0, (ULong64_t)486238);
3217 AliESDHeader* esdheader = fesd->GetHeader();
3218 for(Int_t i=0;i<50;i++){
3219 if((1ull<<i) & esd->GetTriggerMask()){
3220 AliTriggerScalersESD* scalesd = fRunScalers->GetScalersForEventClass( timestamp, i+1);
3221 if(scalesd)esdheader->SetTriggerScalersRecord(scalesd);
3224 const AliTriggerScalersRecordESD* scalrecEvent = fRunScalers->GetScalersDeltaForEvent( timestamp);
3225 const AliTriggerScalersRecordESD* scalrecRun = fRunScalers->GetScalersDeltaForRun();
3226 if (scalrecEvent) esdheader->SetTriggerScalersDeltaEvent(scalrecEvent);
3227 if (scalrecRun) esdheader->SetTriggerScalersDeltaRun(scalrecRun);
3231 //_____________________________________________________________________________
3232 Bool_t AliReconstruction::FillRawEventHeaderESD(AliESDEvent*& esd)
3235 // Filling information from RawReader Header
3238 if (!fRawReader) return kFALSE;
3240 AliInfo("Filling information from RawReader Header");
3242 esd->SetBunchCrossNumber(fRawReader->GetBCID());
3243 esd->SetOrbitNumber(fRawReader->GetOrbitID());
3244 esd->SetPeriodNumber(fRawReader->GetPeriod());
3246 esd->SetTimeStamp(fRawReader->GetTimestamp());
3247 esd->SetEventType(fRawReader->GetType());
3253 //_____________________________________________________________________________
3254 Bool_t AliReconstruction::IsSelected(TString detName, TString& detectors) const
3256 // check whether detName is contained in detectors
3257 // if yes, it is removed from detectors
3259 // check if all detectors are selected
3260 if ((detectors.CompareTo("ALL") == 0) ||
3261 detectors.BeginsWith("ALL ") ||
3262 detectors.EndsWith(" ALL") ||
3263 detectors.Contains(" ALL ")) {
3268 // search for the given detector
3269 Bool_t result = kFALSE;
3270 if ((detectors.CompareTo(detName) == 0) ||
3271 detectors.BeginsWith(detName+" ") ||
3272 detectors.EndsWith(" "+detName) ||
3273 detectors.Contains(" "+detName+" ")) {
3274 detectors.ReplaceAll(detName, "");
3278 // clean up the detectors string
3279 while (detectors.Contains(" ")) detectors.ReplaceAll(" ", " ");
3280 while (detectors.BeginsWith(" ")) detectors.Remove(0, 1);
3281 while (detectors.EndsWith(" ")) detectors.Remove(detectors.Length()-1, 1);
3286 //_____________________________________________________________________________
3287 Bool_t AliReconstruction::InitRunLoader()
3289 // get or create the run loader
3291 if (gAlice) delete gAlice;
3294 TFile *gafile = TFile::Open(fGAliceFileName.Data());
3295 // if (!gSystem->AccessPathName(fGAliceFileName.Data())) { // galice.root exists
3296 if (gafile) { // galice.root exists
3300 // load all base libraries to get the loader classes
3301 TString libs = gSystem->GetLibraries();
3302 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
3303 TString detName = fgkDetectorName[iDet];
3304 if (detName == "HLT") continue;
3305 if (libs.Contains("lib" + detName + "base.so")) continue;
3306 gSystem->Load("lib" + detName + "base.so");
3308 fRunLoader = AliRunLoader::Open(fGAliceFileName.Data());
3310 AliError(Form("no run loader found in file %s", fGAliceFileName.Data()));
3315 fRunLoader->CdGAFile();
3316 fRunLoader->LoadgAlice();
3318 //PH This is a temporary fix to give access to the kinematics
3319 //PH that is needed for the labels of ITS clusters
3320 fRunLoader->LoadHeader();
3321 fRunLoader->LoadKinematics();
3323 } else { // galice.root does not exist
3325 AliError(Form("the file %s does not exist", fGAliceFileName.Data()));
3327 fRunLoader = AliRunLoader::Open(fGAliceFileName.Data(),
3328 AliConfig::GetDefaultEventFolderName(),
3331 AliError(Form("could not create run loader in file %s",
3332 fGAliceFileName.Data()));
3336 fIsNewRunLoader = kTRUE;
3337 fRunLoader->MakeTree("E");
3338 fRunLoader->MakeTree("GG");
3340 if (fNumberOfEventsPerFile > 0)
3341 fRunLoader->SetNumberOfEventsPerFile(fNumberOfEventsPerFile);
3343 fRunLoader->SetNumberOfEventsPerFile((UInt_t)-1);
3349 //_____________________________________________________________________________
3350 AliReconstructor* AliReconstruction::GetReconstructor(Int_t iDet)
3352 // get the reconstructor object and the loader for a detector
3354 if (fReconstructor[iDet]) {
3355 if (fRecoParam.GetDetRecoParamArray(iDet) && !AliReconstructor::GetRecoParam(iDet)) {
3356 const AliDetectorRecoParam *par = fRecoParam.GetDetRecoParam(iDet);
3357 fReconstructor[iDet]->SetRecoParam(par);
3358 fReconstructor[iDet]->SetRunInfo(fRunInfo);
3360 return fReconstructor[iDet];
3363 // load the reconstructor object
3364 TPluginManager* pluginManager = gROOT->GetPluginManager();
3365 TString detName = fgkDetectorName[iDet];
3366 TString recName = "Ali" + detName + "Reconstructor";
3368 if (!fIsNewRunLoader && !fRunLoader->GetLoader(detName+"Loader") && (detName != "HLT")) return NULL;
3370 AliReconstructor* reconstructor = NULL;
3371 // first check if a plugin is defined for the reconstructor
3372 TPluginHandler* pluginHandler =
3373 pluginManager->FindHandler("AliReconstructor", detName);
3374 // if not, add a plugin for it
3375 if (!pluginHandler) {
3376 AliDebug(1, Form("defining plugin for %s", recName.Data()));
3377 TString libs = gSystem->GetLibraries();
3378 if (libs.Contains("lib" + detName + "base.so") ||
3379 (gSystem->Load("lib" + detName + "base.so") >= 0)) {
3380 pluginManager->AddHandler("AliReconstructor", detName,
3381 recName, detName + "rec", recName + "()");
3383 pluginManager->AddHandler("AliReconstructor", detName,
3384 recName, detName, recName + "()");
3386 pluginHandler = pluginManager->FindHandler("AliReconstructor", detName);
3388 if (pluginHandler && (pluginHandler->LoadPlugin() == 0)) {
3389 reconstructor = (AliReconstructor*) pluginHandler->ExecPlugin(0);
3392 // check if the upgrade reconstructor should be used instead of the standard one
3393 if(fUpgradeMask[iDet]) {
3394 if(reconstructor) delete reconstructor;
3395 TClass *cl = new TClass(Form("Ali%sUpgradeReconstructor",fgkDetectorName[iDet]));
3396 reconstructor = (AliReconstructor*)(cl->New());
3399 if (reconstructor) {
3400 TObject* obj = fOptions.FindObject(detName.Data());
3401 if (obj) reconstructor->SetOption(obj->GetTitle());
3402 reconstructor->SetRunInfo(fRunInfo);
3403 reconstructor->Init();
3404 fReconstructor[iDet] = reconstructor;
3407 // get or create the loader
3408 if (detName != "HLT") {
3409 fLoader[iDet] = fRunLoader->GetLoader(detName + "Loader");
3410 if (!fLoader[iDet]) {
3411 AliConfig::Instance()
3412 ->CreateDetectorFolders(fRunLoader->GetEventFolder(),
3414 // first check if a plugin is defined for the loader
3416 pluginManager->FindHandler("AliLoader", detName);
3417 // if not, add a plugin for it
3418 if (!pluginHandler) {
3419 TString loaderName = "Ali" + detName + "Loader";
3420 AliDebug(1, Form("defining plugin for %s", loaderName.Data()));
3421 pluginManager->AddHandler("AliLoader", detName,
3422 loaderName, detName + "base",
3423 loaderName + "(const char*, TFolder*)");
3424 pluginHandler = pluginManager->FindHandler("AliLoader", detName);
3426 if (pluginHandler && (pluginHandler->LoadPlugin() == 0)) {
3428 (AliLoader*) pluginHandler->ExecPlugin(2, detName.Data(),
3429 fRunLoader->GetEventFolder());
3431 if (!fLoader[iDet]) { // use default loader
3432 fLoader[iDet] = new AliLoader(detName, fRunLoader->GetEventFolder());
3434 if (!fLoader[iDet]) {
3435 AliWarning(Form("couldn't get loader for %s", detName.Data()));
3436 if (fStopOnError) return NULL;
3438 fRunLoader->AddLoader(fLoader[iDet]);
3439 fRunLoader->CdGAFile();
3440 if (gFile && !gFile->IsWritable()) gFile->ReOpen("UPDATE");
3441 fRunLoader->Write(0, TObject::kOverwrite);
3446 if (fRecoParam.GetDetRecoParamArray(iDet) && !AliReconstructor::GetRecoParam(iDet)) {
3447 const AliDetectorRecoParam *par = fRecoParam.GetDetRecoParam(iDet);
3448 if (reconstructor) {
3449 reconstructor->SetRecoParam(par);
3450 reconstructor->SetRunInfo(fRunInfo);
3453 return reconstructor;
3456 //_____________________________________________________________________________
3457 AliVertexer* AliReconstruction::CreateVertexer()
3459 // create the vertexer
3460 // Please note that the caller is the owner of the
3463 AliVertexer* vertexer = NULL;
3464 AliReconstructor* itsReconstructor = GetReconstructor(0);
3465 if (itsReconstructor && ((fRunLocalReconstruction.Contains("ITS")) ||
3466 fRunTracking.Contains("ITS") || fFillESD.Contains("ITS") )) {
3467 vertexer = itsReconstructor->CreateVertexer();
3470 AliWarning("couldn't create a vertexer for ITS");
3476 //_____________________________________________________________________________
3477 AliTrackleter* AliReconstruction::CreateMultFinder()
3479 // create the ITS trackleter for mult. estimation
3480 // Please note that the caller is the owner of the
3483 AliTrackleter* trackleter = NULL;
3484 AliReconstructor* itsReconstructor = GetReconstructor(0);
3485 if (itsReconstructor && ((fRunLocalReconstruction.Contains("ITS")) ||
3486 fRunTracking.Contains("ITS") || fFillESD.Contains("ITS") )) {
3487 trackleter = itsReconstructor->CreateMultFinder();
3490 AliWarning("ITS is not in reconstruction, switching off RunMultFinder");
3491 fRunMultFinder = kFALSE;
3497 //_____________________________________________________________________________
3498 Bool_t AliReconstruction::CreateTrackers(const TString& detectors)
3500 // create the trackers
3501 AliInfo("Creating trackers");
3503 TString detStr = detectors;
3504 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
3505 if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
3506 AliReconstructor* reconstructor = GetReconstructor(iDet);
3507 if (!reconstructor) continue;
3508 TString detName = fgkDetectorName[iDet];
3509 if (detName == "HLT") {
3510 fRunHLTTracking = kTRUE;
3513 if (detName == "MUON") {
3514 fRunMuonTracking = kTRUE;
3518 fTracker[iDet] = reconstructor->CreateTracker();
3519 if (!fTracker[iDet] && (iDet < 7)) {
3520 AliWarning(Form("couldn't create a tracker for %s", detName.Data()));
3521 if (fStopOnError) return kFALSE;
3523 AliSysInfo::AddStamp(Form("LTracker%s",fgkDetectorName[iDet]), iDet,0);
3529 //_____________________________________________________________________________
3530 void AliReconstruction::CleanUp()
3532 // delete trackers and the run loader and close and delete the file
3534 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
3535 delete fReconstructor[iDet];
3536 fReconstructor[iDet] = NULL;
3537 fLoader[iDet] = NULL;
3538 delete fTracker[iDet];
3539 fTracker[iDet] = NULL;
3546 delete fSPDTrackleter;
3547 fSPDTrackleter = NULL;
3556 delete fParentRawReader;
3557 fParentRawReader=NULL;
3565 if (AliQAManager::QAManager())
3566 AliQAManager::QAManager()->ShowQA() ;
3567 // AliQAManager::Destroy() ;
3572 void AliReconstruction::WriteAlignmentData(AliESDEvent* esd)
3574 // Write space-points which are then used in the alignment procedures
3575 // For the moment only ITS, TPC, TRD and TOF
3577 Int_t ntracks = esd->GetNumberOfTracks();
3578 for (Int_t itrack = 0; itrack < ntracks; itrack++)
3580 AliESDtrack *track = esd->GetTrack(itrack);
3583 for (Int_t i=0; i<200; ++i) idx[i] = -1; //PH avoid uninitialized values
3584 for (Int_t iDet = 5; iDet >= 0; iDet--) {// TOF, TRD, TPC, ITS clusters
3585 nsp += (iDet==GetDetIndex("TRD")) ? track->GetTRDntracklets():track->GetNcls(iDet);
3587 if (iDet==GetDetIndex("ITS")) { // ITS "extra" clusters
3588 track->GetClusters(iDet,idx);
3589 for (Int_t i=6; i<12; i++) if(idx[i] >= 0) nsp++;
3594 AliTrackPointArray *sp = new AliTrackPointArray(nsp);
3595 track->SetTrackPointArray(sp);
3597 for (Int_t iDet = 5; iDet >= 0; iDet--) {
3598 AliTracker *tracker = fTracker[iDet];
3599 if (!tracker) continue;
3600 Int_t nspdet = (iDet==GetDetIndex("TRD")) ? track->GetTRDtracklets(idx):track->GetClusters(iDet,idx);
3602 if (iDet==GetDetIndex("ITS")) // ITS "extra" clusters
3603 for (Int_t i=6; i<12; i++) if(idx[i] >= 0) nspdet++;
3605 if (nspdet <= 0) continue;
3609 while (isp2 < nspdet) {
3610 Bool_t isvalid=kTRUE;
3612 Int_t index=idx[isp++];
3613 if (index < 0) continue;
3615 TString dets = fgkDetectorName[iDet];
3616 if ((fUseTrackingErrorsForAlignment.CompareTo(dets) == 0) ||
3617 fUseTrackingErrorsForAlignment.BeginsWith(dets+" ") ||
3618 fUseTrackingErrorsForAlignment.EndsWith(" "+dets) ||
3619 fUseTrackingErrorsForAlignment.Contains(" "+dets+" ")) {
3620 isvalid = tracker->GetTrackPointTrackingError(index,p,track);
3622 isvalid = tracker->GetTrackPoint(index,p);
3625 if (!isvalid) continue;
3626 if (iDet==GetDetIndex("ITS") && (isp-1)>=6) p.SetExtra();
3627 sp->AddPoint(isptrack,&p); isptrack++;
3634 //_____________________________________________________________________________
3635 void AliReconstruction::FillRawDataErrorLog(Int_t iEvent, AliESDEvent* esd)
3637 // The method reads the raw-data error log
3638 // accumulated within the rawReader.
3639 // It extracts the raw-data errors related to
3640 // the current event and stores them into
3641 // a TClonesArray inside the esd object.
3643 if (!fRawReader) return;
3645 for(Int_t i = 0; i < fRawReader->GetNumberOfErrorLogs(); i++) {
3647 AliRawDataErrorLog *log = fRawReader->GetErrorLog(i);
3649 if (iEvent != log->GetEventNumber()) continue;
3651 esd->AddRawDataErrorLog(log);
3656 //_____________________________________________________________________________
3657 // void AliReconstruction::CheckQA()
3659 // check the QA of SIM for this run and remove the detectors
3660 // with status Fatal
3662 // TString newRunLocalReconstruction ;
3663 // TString newRunTracking ;
3664 // TString newFillESD ;
3666 // for (Int_t iDet = 0; iDet < AliQAv1::kNDET; iDet++) {
3667 // TString detName(AliQAv1::GetDetName(iDet)) ;
3668 // AliQAv1 * qa = AliQAv1::Instance(AliQAv1::DETECTORINDEX_t(iDet)) ;
3669 // if ( qa->IsSet(AliQAv1::DETECTORINDEX_t(iDet), AliQAv1::kSIM, specie, AliQAv1::kFATAL)) {
3670 // AliInfo(Form("QA status for %s %s in Hits and/or SDIGITS and/or Digits was Fatal; No reconstruction performed",
3671 // detName.Data(), AliRecoParam::GetEventSpecieName(es))) ;
3673 // if ( fRunLocalReconstruction.Contains(AliQAv1::GetDetName(iDet)) ||
3674 // fRunLocalReconstruction.Contains("ALL") ) {
3675 // newRunLocalReconstruction += detName ;
3676 // newRunLocalReconstruction += " " ;
3678 // if ( fRunTracking.Contains(AliQAv1::GetDetName(iDet)) ||
3679 // fRunTracking.Contains("ALL") ) {
3680 // newRunTracking += detName ;
3681 // newRunTracking += " " ;
3683 // if ( fFillESD.Contains(AliQAv1::GetDetName(iDet)) ||
3684 // fFillESD.Contains("ALL") ) {
3685 // newFillESD += detName ;
3686 // newFillESD += " " ;
3690 // fRunLocalReconstruction = newRunLocalReconstruction ;
3691 // fRunTracking = newRunTracking ;
3692 // fFillESD = newFillESD ;
3695 //_____________________________________________________________________________
3696 Int_t AliReconstruction::GetDetIndex(const char* detector)
3698 // return the detector index corresponding to detector
3700 for (index = 0; index < kNDetectors ; index++) {
3701 if ( strcmp(detector, fgkDetectorName[index]) == 0 )
3706 //_____________________________________________________________________________
3707 Bool_t AliReconstruction::FinishPlaneEff() {
3709 // Here execute all the necessary operationis, at the end of the tracking phase,
3710 // in case that evaluation of PlaneEfficiencies was required for some detector.
3711 // E.g., write into a DataBase file the PlaneEfficiency which have been evaluated.
3713 // This Preliminary version works only FOR ITS !!!!!
3714 // other detectors (TOF,TRD, etc. have to develop their specific codes)
3717 // Return: kTRUE if all operations have been done properly, kFALSE otherwise
3720 TString detStr = fLoadCDB;
3721 //for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
3722 for (Int_t iDet = 0; iDet < 1; iDet++) { // for the time being only ITS
3723 if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
3724 if(fTracker[iDet] && fTracker[iDet]->GetPlaneEff()) {
3725 AliPlaneEff *planeeff=fTracker[iDet]->GetPlaneEff();
3726 TString name=planeeff->GetName();
3728 TFile* pefile = TFile::Open(name, "RECREATE");
3729 ret=(Bool_t)planeeff->Write();
3731 if(planeeff->GetCreateHistos()) {
3732 TString hname=planeeff->GetName();
3733 hname+="Histo.root";
3734 ret*=planeeff->WriteHistosToFile(hname,"RECREATE");
3737 if(fSPDTrackleter) {
3738 AliPlaneEff *planeeff=fSPDTrackleter->GetPlaneEff();
3739 TString name="AliITSPlaneEffSPDtracklet.root";
3740 TFile* pefile = TFile::Open(name, "RECREATE");
3741 ret=(Bool_t)planeeff->Write();
3743 AliESDEvent *dummy=NULL;
3744 ret=(Bool_t)fSPDTrackleter->PostProcess(dummy); // take care of writing other files
3749 //_____________________________________________________________________________
3750 Bool_t AliReconstruction::InitPlaneEff() {
3752 // Here execute all the necessary operations, before of the tracking phase,
3753 // for the evaluation of PlaneEfficiencies, in case required for some detectors.
3754 // E.g., read from a DataBase file a first evaluation of the PlaneEfficiency
3755 // which should be updated/recalculated.
3757 // This Preliminary version will work only FOR ITS !!!!!
3758 // other detectors (TOF,TRD, etc. have to develop their specific codes)
3761 // Return: kTRUE if all operations have been done properly, kFALSE otherwise
3764 fSPDTrackleter = NULL;
3765 TString detStr = fLoadCDB;
3766 if (IsSelected(fgkDetectorName[0], detStr)) {
3767 AliReconstructor* itsReconstructor = GetReconstructor(0);
3768 if (itsReconstructor) {
3769 fSPDTrackleter = itsReconstructor->CreateTrackleter(); // this is NULL unless required in RecoParam
3771 if (fSPDTrackleter) {
3772 AliInfo("Trackleter for SPD has been created");
3778 //_____________________________________________________________________________
3779 Bool_t AliReconstruction::InitAliEVE()
3781 // This method should be called only in case
3782 // AliReconstruction is run
3783 // within the alieve environment.
3784 // It will initialize AliEVE in a way
3785 // so that it can visualize event processed
3786 // by AliReconstruction.
3787 // The return flag shows whenever the
3788 // AliEVE initialization was successful or not.
3790 TString macroStr(gSystem->Getenv("ALIEVE_ONLINE_MACRO"));
3792 if (macroStr.IsNull())
3793 macroStr.Form("%s/EVE/macros/alieve_online.C",gSystem->ExpandPathName("$ALICE_ROOT"));
3795 AliInfo(Form("Loading AliEVE macro: %s",macroStr.Data()));
3797 if (gROOT->LoadMacro(macroStr.Data()) != 0) return kFALSE;
3799 gROOT->ProcessLine("if (!AliEveEventManager::GetMaster()){new AliEveEventManager();AliEveEventManager::GetMaster()->AddNewEventCommand(\"alieve_online_on_new_event()\");gEve->AddEvent(AliEveEventManager::GetMaster());};");
3800 gROOT->ProcessLine("alieve_online_init()");
3805 //_____________________________________________________________________________
3806 void AliReconstruction::RunAliEVE()
3808 // Runs AliEVE visualisation of
3809 // the current event.
3810 // Should be executed only after
3811 // successful initialization of AliEVE.
3813 AliInfo("Running AliEVE...");
3814 gROOT->ProcessLine(Form("AliEveEventManager::GetMaster()->SetEvent((AliRunLoader*)%p,(AliRawReader*)%p,(AliESDEvent*)%p,(AliESDfriend*)%p);",fRunLoader,fRawReader,fesd,fesdf));
3818 //_____________________________________________________________________________
3819 Bool_t AliReconstruction::SetRunQA(TString detAndAction)
3821 // Allows to run QA for a selected set of detectors
3822 // and a selected set of tasks among RAWS, DIGITSR, RECPOINTS and ESDS
3823 // all selected detectors run the same selected tasks
3825 if (!detAndAction.Contains(":")) {
3826 AliError( Form("%s is a wrong syntax, use \"DetectorList:ActionList\" \n", detAndAction.Data()) ) ;
3830 Int_t colon = detAndAction.Index(":") ;
3831 fQADetectors = detAndAction(0, colon) ;
3832 fQATasks = detAndAction(colon+1, detAndAction.Sizeof() ) ;
3833 if (fQATasks.Contains("ALL") ) {
3834 fQATasks = Form("%d %d %d %d", AliQAv1::kRAWS, AliQAv1::kDIGITSR, AliQAv1::kRECPOINTS, AliQAv1::kESDS) ;
3836 fQATasks.ToUpper() ;
3838 if ( fQATasks.Contains("RAW") )
3839 tempo = Form("%d ", AliQAv1::kRAWS) ;
3840 if ( fQATasks.Contains("DIGIT") )
3841 tempo += Form("%d ", AliQAv1::kDIGITSR) ;
3842 if ( fQATasks.Contains("RECPOINT") )
3843 tempo += Form("%d ", AliQAv1::kRECPOINTS) ;
3844 if ( fQATasks.Contains("ESD") )
3845 tempo += Form("%d ", AliQAv1::kESDS) ;
3847 if (fQATasks.IsNull()) {
3848 AliInfo("No QA requested\n") ;
3853 TString tempo(fQATasks) ;
3854 tempo.ReplaceAll(Form("%d", AliQAv1::kRAWS), AliQAv1::GetTaskName(AliQAv1::kRAWS)) ;
3855 tempo.ReplaceAll(Form("%d", AliQAv1::kDIGITSR), AliQAv1::GetTaskName(AliQAv1::kDIGITSR)) ;
3856 tempo.ReplaceAll(Form("%d", AliQAv1::kRECPOINTS), AliQAv1::GetTaskName(AliQAv1::kRECPOINTS)) ;
3857 tempo.ReplaceAll(Form("%d", AliQAv1::kESDS), AliQAv1::GetTaskName(AliQAv1::kESDS)) ;
3858 AliInfo( Form("QA will be done on \"%s\" for \"%s\"\n", fQADetectors.Data(), tempo.Data()) ) ;
3863 //_____________________________________________________________________________
3864 Bool_t AliReconstruction::InitRecoParams()
3866 // The method accesses OCDB and retrieves all
3867 // the available reco-param objects from there.
3869 Bool_t isOK = kTRUE;
3871 if (fRecoParam.GetDetRecoParamArray(kNDetectors)) {
3872 AliInfo("Using custom GRP reconstruction parameters");
3875 AliInfo("Loading GRP reconstruction parameter objects");
3877 AliCDBPath path("GRP","Calib","RecoParam");
3878 AliCDBEntry *entry=AliCDBManager::Instance()->Get(path.GetPath());
3880 AliWarning("Couldn't find GRP RecoParam entry in OCDB");
3884 TObject *recoParamObj = entry->GetObject();
3885 if (dynamic_cast<TObjArray*>(recoParamObj)) {
3886 // GRP has a normal TobjArray of AliDetectorRecoParam objects
3887 // Registering them in AliRecoParam
3888 fRecoParam.AddDetRecoParamArray(kNDetectors,dynamic_cast<TObjArray*>(recoParamObj));
3890 else if (dynamic_cast<AliDetectorRecoParam*>(recoParamObj)) {
3891 // GRP has only onse set of reco parameters
3892 // Registering it in AliRecoParam
3893 AliInfo("Single set of GRP reconstruction parameters found");
3894 dynamic_cast<AliDetectorRecoParam*>(recoParamObj)->SetAsDefault();
3895 fRecoParam.AddDetRecoParam(kNDetectors,dynamic_cast<AliDetectorRecoParam*>(recoParamObj));
3898 AliError("No valid GRP RecoParam object found in the OCDB");
3905 TString detStr = fLoadCDB;
3906 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
3908 if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
3910 if (fRecoParam.GetDetRecoParamArray(iDet)) {
3911 AliInfo(Form("Using custom reconstruction parameters for detector %s",fgkDetectorName[iDet]));
3915 AliInfo(Form("Loading reconstruction parameter objects for detector %s",fgkDetectorName[iDet]));
3917 AliCDBPath path(fgkDetectorName[iDet],"Calib","RecoParam");
3918 AliCDBEntry *entry=AliCDBManager::Instance()->Get(path.GetPath());
3920 AliWarning(Form("Couldn't find RecoParam entry in OCDB for detector %s",fgkDetectorName[iDet]));
3924 TObject *recoParamObj = entry->GetObject();
3925 if (dynamic_cast<TObjArray*>(recoParamObj)) {
3926 // The detector has a normal TobjArray of AliDetectorRecoParam objects
3927 // Registering them in AliRecoParam
3928 fRecoParam.AddDetRecoParamArray(iDet,dynamic_cast<TObjArray*>(recoParamObj));
3930 else if (dynamic_cast<AliDetectorRecoParam*>(recoParamObj)) {
3931 // The detector has only onse set of reco parameters
3932 // Registering it in AliRecoParam
3933 AliInfo(Form("Single set of reconstruction parameters found for detector %s",fgkDetectorName[iDet]));
3934 dynamic_cast<AliDetectorRecoParam*>(recoParamObj)->SetAsDefault();
3935 fRecoParam.AddDetRecoParam(iDet,dynamic_cast<AliDetectorRecoParam*>(recoParamObj));
3938 AliError(Form("No valid RecoParam object found in the OCDB for detector %s",fgkDetectorName[iDet]));
3942 // FIX ME: We have to disable the unloading of reco-param CDB
3943 // entries because QA framework is using them. Has to be fix in
3944 // a way that the QA takes the objects already constructed in
3946 // AliCDBManager::Instance()->UnloadFromCache(path.GetPath());
3950 if (AliDebugLevel() > 0) fRecoParam.Print();
3955 //_____________________________________________________________________________
3956 Bool_t AliReconstruction::GetEventInfo()
3958 // Fill the event info object
3960 AliCodeTimerAuto("",0)
3962 AliCentralTrigger *aCTP = NULL;
3964 fEventInfo.SetEventType(fRawReader->GetType());
3966 ULong64_t mask = fRawReader->GetClassMask();
3967 fEventInfo.SetTriggerMask(mask);
3968 UInt_t clmask = fRawReader->GetDetectorPattern()[0];
3969 fEventInfo.SetTriggerCluster(AliDAQ::ListOfTriggeredDetectors(clmask));
3971 aCTP = new AliCentralTrigger();
3972 TString configstr("");
3973 if (!aCTP->LoadConfiguration(configstr)) { // Load CTP config from OCDB
3974 AliError("No trigger configuration found in OCDB! The trigger configuration information will not be used!");
3978 aCTP->SetClassMask(mask);
3979 aCTP->SetClusterMask(clmask);
3981 AliCentralTrigger* rlCTP = fRunLoader->GetTrigger();
3983 rlCTP->SetClassMask(mask);
3984 rlCTP->SetClusterMask(clmask);
3988 fEventInfo.SetEventType(AliRawEventHeaderBase::kPhysicsEvent);
3990 if (fRunLoader && (!fRunLoader->LoadTrigger())) {
3991 aCTP = fRunLoader->GetTrigger();
3992 fEventInfo.SetTriggerMask(aCTP->GetClassMask());
3993 // get inputs from actp - just get
3994 AliESDHeader* esdheader = fesd->GetHeader();
3995 esdheader->SetL0TriggerInputs(aCTP->GetL0TriggerInputs());
3996 esdheader->SetL1TriggerInputs(aCTP->GetL1TriggerInputs());
3997 esdheader->SetL2TriggerInputs(aCTP->GetL2TriggerInputs());
3998 fEventInfo.SetTriggerCluster(AliDAQ::ListOfTriggeredDetectors(aCTP->GetClusterMask()));
4001 AliWarning("No trigger can be loaded! The trigger information will not be used!");
4006 AliTriggerConfiguration *config = aCTP->GetConfiguration();
4008 AliError("No trigger configuration has been found! The trigger configuration information will not be used!");
4009 if (fRawReader) delete aCTP;
4013 // Load trigger aliases and declare the trigger classes included in aliases
4014 AliCDBEntry * entry = AliCDBManager::Instance()->Get("GRP/CTP/Aliases");
4016 THashList * lst = dynamic_cast<THashList*>(entry->GetObject());
4018 lst->Sort(kSortDescending); // to avoid problems with substrungs
4019 if (fRawReader) fRawReader->LoadTriggerAlias(lst);
4020 // Now declare all the triggers present in the aliases
4023 while((nmd = dynamic_cast<TNamed*>(iter.Next()))){
4024 fDeclTriggerClasses += " ";
4025 fDeclTriggerClasses += nmd->GetName();
4029 AliError("Cannot cast the object with trigger aliases to THashList!");
4033 AliError("No OCDB ebtry for the trigger aliases!");
4035 // Load trigger classes for this run
4036 UChar_t clustmask = 0;
4038 ULong64_t trmask = fEventInfo.GetTriggerMask();
4039 const TObjArray& classesArray = config->GetClasses();
4040 Int_t nclasses = classesArray.GetEntriesFast();
4041 for( Int_t iclass=0; iclass < nclasses; iclass++ ) {
4042 AliTriggerClass* trclass = (AliTriggerClass*)classesArray.At(iclass);
4043 if (trclass && trclass->GetMask()>0) {
4044 Int_t trindex = TMath::Nint(TMath::Log2(trclass->GetMask()));
4045 fesd->SetTriggerClass(trclass->GetName(),trindex);
4046 if (fRawReader) fRawReader->LoadTriggerClass(trclass->GetName(),trindex);
4047 if (trmask & (1ull << trindex)) {
4049 trclasses += trclass->GetName();
4051 clustmask |= trclass->GetCluster()->GetClusterMask();
4055 fEventInfo.SetTriggerClasses(trclasses);
4056 // Now put the declared trigger classes (not present in the run)
4057 // to 0/false in the event selection
4058 if (!fDeclTriggerClasses.IsNull()) {
4059 TObjArray *tokens = fDeclTriggerClasses.Tokenize(" ");
4060 Int_t ntokens = tokens->GetEntriesFast();
4061 for (Int_t itoken = 0; itoken < ntokens; ++itoken) {
4062 if (fRawReader) fRawReader->LoadTriggerClass((((TObjString*)tokens->At(itoken))->String()).Data(),-1);
4067 // Write names of active trigger inputs in ESD Header
4068 const TObjArray& inputsArray = config->GetInputs();
4069 Int_t ninputs = inputsArray.GetEntriesFast();
4070 for( Int_t iinput=0; iinput < ninputs; iinput++ ) {
4071 AliTriggerInput* trginput = (AliTriggerInput*)inputsArray.At(iinput);
4072 if (trginput && trginput->GetMask()>0) {
4073 Int_t inputIndex = (Int_t)TMath::Nint(TMath::Log2(trginput->GetMask()));
4074 AliESDHeader* headeresd = fesd->GetHeader();
4075 Int_t trglevel = (Int_t)trginput->GetLevel();
4076 if (trglevel == 0) headeresd->SetActiveTriggerInputs(trginput->GetInputName(), inputIndex);
4077 if (trglevel == 1) headeresd->SetActiveTriggerInputs(trginput->GetInputName(), inputIndex+24);
4078 if (trglevel == 2) headeresd->SetActiveTriggerInputs(trginput->GetInputName(), inputIndex+48);
4082 // Set the information in ESD
4083 fesd->SetTriggerMask(trmask);
4084 fesd->SetTriggerCluster(clustmask);
4086 if (!aCTP->CheckTriggeredDetectors()) {
4087 if (fRawReader) delete aCTP;
4091 if (fRawReader) delete aCTP;
4093 // We have to fill also the HLT decision here!!
4099 const char *AliReconstruction::MatchDetectorList(const char *detectorList, UInt_t detectorMask)
4101 // Match the detector list found in the rec.C or the default 'ALL'
4102 // to the list found in the GRP (stored there by the shuttle PP which
4103 // gets the information from ECS)
4104 static TString resultList;
4105 TString detList = detectorList;
4109 for(Int_t iDet = 0; iDet < (AliDAQ::kNDetectors-1); iDet++) {
4110 if ((detectorMask >> iDet) & 0x1) {
4111 TString det = AliDAQ::OfflineModuleName(iDet);
4112 if ((detList.CompareTo("ALL") == 0) ||
4113 ((detList.BeginsWith("ALL ") ||
4114 detList.EndsWith(" ALL") ||
4115 detList.Contains(" ALL ")) &&
4116 !(detList.BeginsWith("-"+det+" ") ||
4117 detList.EndsWith(" -"+det) ||
4118 detList.Contains(" -"+det+" "))) ||
4119 (detList.CompareTo(det) == 0) ||
4120 detList.BeginsWith(det+" ") ||
4121 detList.EndsWith(" "+det) ||
4122 detList.Contains( " "+det+" " )) {
4123 if (!resultList.EndsWith(det + " ")) {
4132 if ((detectorMask >> AliDAQ::kHLTId) & 0x1) {
4133 TString hltDet = AliDAQ::OfflineModuleName(AliDAQ::kNDetectors-1);
4134 if ((detList.CompareTo("ALL") == 0) ||
4135 ((detList.BeginsWith("ALL ") ||
4136 detList.EndsWith(" ALL") ||
4137 detList.Contains(" ALL ")) &&
4138 !(detList.BeginsWith("-"+hltDet+" ") ||
4139 detList.EndsWith(" -"+hltDet) ||
4140 detList.Contains(" -"+hltDet+" "))) ||
4141 (detList.CompareTo(hltDet) == 0) ||
4142 detList.BeginsWith(hltDet+" ") ||
4143 detList.EndsWith(" "+hltDet) ||
4144 detList.Contains( " "+hltDet+" " )) {
4145 resultList += hltDet;
4149 return resultList.Data();
4153 //______________________________________________________________________________
4154 void AliReconstruction::Abort(const char *method, EAbort what)
4156 // Abort processing. If what = kAbortProcess, the Process() loop will be
4157 // aborted. If what = kAbortFile, the current file in a chain will be
4158 // aborted and the processing will continue with the next file, if there
4159 // is no next file then Process() will be aborted. Abort() can also be
4160 // called from Begin(), SlaveBegin(), Init() and Notify(). After abort
4161 // the SlaveTerminate() and Terminate() are always called. The abort flag
4162 // can be checked in these methods using GetAbort().
4164 // The method is overwritten in AliReconstruction for better handling of
4165 // reco specific errors
4167 if (!fStopOnError) return;
4171 TString whyMess = method;
4172 whyMess += " failed! Aborting...";
4174 AliError(whyMess.Data());
4177 TString mess = "Abort";
4178 if (fAbort == kAbortProcess)
4179 mess = "AbortProcess";
4180 else if (fAbort == kAbortFile)
4183 Info(mess.Data(), "%s", whyMess.Data());
4186 //______________________________________________________________________________
4187 Bool_t AliReconstruction::ProcessEvent(void* event)
4189 // Method that is used in case the event loop
4190 // is steered from outside, for example by AMORE
4191 // 'event' is a pointer to the DATE event in the memory
4193 if (fRawReader) delete fRawReader;
4194 fRawReader = new AliRawReaderDate(event);
4195 fStatus = ProcessEvent(fRunLoader->GetNumberOfEvents());
4202 //______________________________________________________________________________
4203 Bool_t AliReconstruction::ParseOutput()
4205 // The method parses the output file
4206 // location string in order to steer
4207 // properly the selector
4209 TPMERegexp re1("(\\w+\\.zip#\\w+\\.root):([,*\\w+\\.root,*]+)@dataset://(\\w++)");
4210 TPMERegexp re2("(\\w+\\.root)?@?dataset://(\\w++)");
4212 if (re1.Match(fESDOutput) == 4) {
4213 // root archive with output files stored and regustered
4215 gProof->AddInput(new TNamed("PROOF_OUTPUTFILE",re1[1].Data()));
4216 gProof->AddInput(new TNamed("PROOF_OUTPUTFILE_LOCATION",re1[3].Data()));
4217 gProof->AddInput(new TNamed("PROOF_OUTPUTFILE_DATASET",""));
4218 gProof->AddInput(new TNamed("PROOF_OUTPUTFILE_ARCHIVE",re1[2].Data()));
4219 AliInfo(Form("%s files will be stored within %s in dataset %s",
4224 else if (re2.Match(fESDOutput) == 3) {
4225 // output file stored and registered
4227 gProof->AddInput(new TNamed("PROOF_OUTPUTFILE",(re2[1].IsNull()) ? "AliESDs.root" : re2[1].Data()));
4228 gProof->AddInput(new TNamed("PROOF_OUTPUTFILE_LOCATION",re2[2].Data()));
4229 gProof->AddInput(new TNamed("PROOF_OUTPUTFILE_DATASET",""));
4230 AliInfo(Form("%s will be stored in dataset %s",
4231 (re2[1].IsNull()) ? "AliESDs.root" : re2[1].Data(),
4235 if (fESDOutput.IsNull()) {
4236 // Output location not given.
4237 // Assuming xrootd has been already started and
4238 // the output file has to be sent back
4239 // to the client machine
4240 TString esdUrl(Form("root://%s/%s/",
4241 TUrl(gSystem->HostName()).GetHostFQDN(),
4243 gProof->AddInput(new TNamed("PROOF_OUTPUTFILE","AliESDs.root"));
4244 gProof->AddInput(new TNamed("PROOF_OUTPUTFILE_LOCATION",esdUrl.Data()));
4245 AliInfo(Form("AliESDs.root will be stored in %s",
4249 // User specified an output location.
4250 // Ones has just to parse it here
4251 TUrl outputUrl(fESDOutput.Data());
4252 TString outputFile(gSystem->BaseName(outputUrl.GetFile()));
4253 gProof->AddInput(new TNamed("PROOF_OUTPUTFILE",outputFile.IsNull() ? "AliESDs.root" : outputFile.Data()));
4254 TString outputLocation(outputUrl.GetUrl());
4255 outputLocation.ReplaceAll(outputFile.Data(),"");
4256 gProof->AddInput(new TNamed("PROOF_OUTPUTFILE_LOCATION",outputLocation.Data()));
4257 AliInfo(Form("%s will be stored in %s",
4258 outputFile.IsNull() ? "AliESDs.root" : outputFile.Data(),
4259 outputLocation.Data()));
4266 //______________________________________________________________________________
4267 Bool_t AliReconstruction::IsHighPt() const {
4268 // Selection of events containing "high" pT tracks
4269 // If at least one track is found within 1.5 and 100 GeV (pT)
4270 // that was reconstructed by both ITS and TPC, the event is accepted
4273 const Double_t pTmin = 1.5;
4274 const Double_t pTmax = 100;
4276 mask |= (AliESDtrack::kITSrefit);
4277 mask |= (AliESDtrack::kTPCrefit);
4278 const Double_t pTminCosmic = 5.;
4279 const Double_t pTmaxCosmic = 100;
4280 ULong_t maskCosmic = 0;
4281 Int_t cosmicCount=0;
4282 maskCosmic |= (AliESDtrack::kTPCrefit);
4284 Bool_t isOK = kFALSE;
4286 if (fesd && fesd->GetEventType()==AliRawEventHeaderBase::kPhysicsEvent) {
4287 // Check if this ia a physics event (code 7)
4288 Int_t ntrk = fesd->GetNumberOfTracks();
4289 for (Int_t itrk=0; itrk<ntrk; ++itrk) {
4291 AliESDtrack * trk = fesd->GetTrack(itrk);
4293 && trk->Pt() > pTmin
4294 && trk->Pt() < pTmax
4295 && (trk->GetStatus() & mask) == mask ) {
4301 && trk->GetInnerParam()
4302 && trk->GetInnerParam()->Pt() > pTminCosmic
4303 && trk->GetInnerParam()->Pt() < pTmaxCosmic
4304 && (trk->GetStatus() & maskCosmic) == maskCosmic ) {
4310 if (cosmicCount>1) isOK=kTRUE;
4315 //______________________________________________________________________________
4316 Bool_t AliReconstruction::IsCosmicOrCalibSpecie() const {
4317 // Select cosmic or calibration events
4319 Bool_t isOK = kFALSE;
4321 if (fesd && fesd->GetEventType()==AliRawEventHeaderBase::kPhysicsEvent) {
4322 // Check if this ia a physics event (code 7)
4324 UInt_t specie = fesd->GetEventSpecie();
4325 if (specie==AliRecoParam::kCosmic || specie==AliRecoParam::kCalib) {
4332 //______________________________________________________________________________
4333 void AliReconstruction::WriteESDfriend() {
4334 // Fill the ESD friend in the tree. The required fraction of ESD friends is stored
4335 // in fFractionFriends. We select events where we store the ESD friends according
4336 // to the following algorithm:
4337 // 1. Store all Cosmic or Calibration events within the required fraction
4338 // 2. Sample "high Pt" events within the remaining fraction after step 1.
4339 // 3. Sample randomly events if we still have remaining slot
4342 Bool_t isSelected = kFALSE;
4344 // Store all friends for B field OFF
4345 if (TMath::Abs(AliTrackerBase::GetBz())<0.5) isSelected=kTRUE;
4347 if (IsCosmicOrCalibSpecie()) { // Selection of calib or cosmic events
4354 Double_t remainingFraction = fFractionFriends;
4355 remainingFraction -= ((Double_t)(fSspecie)/(Double_t)(fNall));
4357 if (IsHighPt()) { // Selection of "high Pt" events
4359 Double_t curentHighPtFraction = ((Double_t)(fNhighPt+1))/((Double_t)(fNall+1));
4360 // "Bayesian" estimate supposing that without events all the events are of the required type
4363 Double_t rnd = gRandom->Rndm()*curentHighPtFraction;
4364 if (rnd<remainingFraction) {
4370 remainingFraction -= ((Double_t)(fShighPt)/(Double_t)(fNall));
4372 // Random selection to fill the remaining fraction (if any)
4374 Double_t rnd = gRandom->Rndm();
4375 if (rnd<remainingFraction) {
4381 fesdf->~AliESDfriend();
4382 new (fesdf) AliESDfriend(); // Reset...
4383 fesdf->SetSkipBit(kTRUE);
4389 //_________________________________________________________________
4390 void AliReconstruction::DeleteDigits(const TString& detectors)
4392 // delete requested digit files produced at current event
4393 static int iEvent = 0;
4394 if (detectors.IsNull()) return;
4395 TString detStr = detectors;
4396 AliInfo(Form("Deleting Digits: %s",detectors.Data()));
4398 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
4399 gSystem->Exec(Form("if [ -e %s.Digits.root ]; then\nrm %s.Digits.root\nfi",
4400 fgkDetectorName[iDet],fgkDetectorName[iDet]));
4402 AliSysInfo::AddStamp(Form("DelDigits_%d",iEvent), 0,0,iEvent);
4406 //_________________________________________________________________
4407 void AliReconstruction::DeleteRecPoints(const TString& detectors)
4409 // delete requested recpoint files produced at current event
4410 static int iEvent = 0;
4411 if (detectors.IsNull()) return;
4412 TString detStr = detectors;
4413 AliInfo(Form("Deleting Recpoints: %s",detectors.Data()));
4415 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
4416 gSystem->Exec(Form("if [ -e %s.RecPoints.root ]; then\nrm %s.RecPoints.root\nfi",
4417 fgkDetectorName[iDet],fgkDetectorName[iDet]));
4419 AliSysInfo::AddStamp(Form("DelRecPoints_%d",iEvent), 0,0,iEvent);
4423 //_________________________________________________________________
4424 void AliReconstruction::SetStopOnResourcesExcess(Int_t vRSS,Int_t vVMEM)
4426 // require checking the resources left and stopping on excess
4427 // if 0 : no check is done
4428 // if >0 : stop reconstruction if exceeds this value
4429 // if <0 : use as margin to system limits
4431 const int kKB2MB = 1024;
4432 const int kInfMem = 9999999;
4435 int pgSize = getpagesize();
4439 AliInfo(Form("Setting max. RSS usage to user value %d MB",fMaxRSS));
4442 getrlimit(RLIMIT_RSS,&r);
4443 fMaxRSS = r.rlim_max==RLIM_INFINITY ? kInfMem : int(r.rlim_max*pgSize/kKB2MB/kKB2MB) + vRSS;
4444 AliInfo(Form("Setting max. RSS usage to system hard limit %d%s MB (%d margin)",fMaxRSS,r.rlim_max==RLIM_INFINITY ? "(inf)":"",-vRSS));
4446 else {AliInfo("No check on RSS memory usage will be applied");}
4450 AliInfo(Form("Setting max. VMEM usage to user value %d MB",fMaxVMEM));
4453 getrlimit(RLIMIT_AS,&r);
4454 fMaxVMEM = r.rlim_max==RLIM_INFINITY ? kInfMem : int(r.rlim_max*pgSize/kKB2MB/kKB2MB) + vVMEM;
4455 AliInfo(Form("Setting max. VMEM usage to system hard limit %d%s MB (%d margin)",fMaxVMEM,r.rlim_max==RLIM_INFINITY ? "(inf)":"",-vVMEM));
4457 else {AliInfo("No check on RSS memory usage will be applied");}
4461 //_________________________________________________________________
4462 Bool_t AliReconstruction::HasEnoughResources(int ev)
4464 // check if process consumed more than allowed resources
4465 const int kKB2MB = 1024;
4467 if (!fMaxRSS && !fMaxVMEM) return res;
4469 ProcInfo_t procInfo;
4470 gSystem->GetProcInfo(&procInfo);
4471 if (procInfo.fMemResident/kKB2MB > fMaxRSS) res = kFALSE;
4472 if (procInfo.fMemVirtual/kKB2MB > fMaxVMEM) res = kFALSE;
4475 AliInfo(Form("Job exceeded allowed limits: RSS:%d (%d) VMEM:%d (%d), will stop",
4476 int(procInfo.fMemResident/kKB2MB),fMaxRSS,
4477 int(procInfo.fMemVirtual/kKB2MB) ,fMaxVMEM));
4479 gSystem->Exec(Form("if [ -e %s ]; then\nrm %s\nfi\necho %d > %s",fgkStopEvFName,fgkStopEvFName,ev,fgkStopEvFName));