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 **************************************************************************/
16 /* $Id: AliReconstruction.cxx 63911 2013-08-19 16:46:41Z hristov $ */
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>
208 #include <sys/resource.h>
209 ClassImp(AliReconstruction)
213 //_____________________________________________________________________________
214 const char* AliReconstruction::fgkStopEvFName = "_stopEvent_";
215 const char* AliReconstruction::fgkDetectorName[AliReconstruction::kNDetectors] = {"ITS", "TPC", "TRD",
217 "HMPID", "EMCAL", "MUON", "FMD", "ZDC", "PMD", "T0", "VZERO", "ACORDE","AD","FIT","MFT", "HLT"};
219 //_____________________________________________________________________________
220 AliReconstruction::AliReconstruction(const char* gAliceFilename) :
222 fRunVertexFinder(kTRUE),
223 fRunVertexFinderTracks(kTRUE),
224 fRunMuonTracking(kFALSE),
225 fRunMFTTrackingMU(kFALSE),
227 fRunCascadeFinder(kTRUE),
228 fRunMultFinder(kTRUE),
230 fStopOnMissingTriggerFile(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 fCheckRecoCDBvsSimuCDB(),
290 fInitCDBCalled(kFALSE),
291 fCDBSnapshotMode(kFALSE),
292 fSetRunNumberFromDataCalled(kFALSE),
297 fSameQACycle(kFALSE),
298 fInitQACalled(kFALSE),
299 fWriteQAExpertData(kTRUE),
300 fRunPlaneEff(kFALSE),
313 fIsNewRunLoader(kFALSE),
322 fTreeBuffSize(30000000),
331 fDeclTriggerClasses(""),
336 // create reconstruction object with default parameters
337 AliGeomManager::Destroy();
339 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
340 fReconstructor[iDet] = NULL;
341 fUpgradeMask[iDet]=kFALSE;
342 fLoader[iDet] = NULL;
343 fTracker[iDet] = NULL;
345 for (Int_t iDet = 0; iDet < AliQAv1::kNDET; iDet++) {
346 fQACycles[iDet] = 999999 ;
347 fQAWriteExpert[iDet] = kFALSE ;
349 fBeamInt[0][0]=fBeamInt[0][1]=fBeamInt[1][0]=fBeamInt[1][1] = -1;
351 AddCheckRecoCDBvsSimuCDB("TPC/Calib/RecoParam"); // check for similarity in the sim and rec
356 //_____________________________________________________________________________
357 AliReconstruction::AliReconstruction(const AliReconstruction& rec) :
359 fRunVertexFinder(rec.fRunVertexFinder),
360 fRunVertexFinderTracks(rec.fRunVertexFinderTracks),
361 fRunMuonTracking(rec.fRunMuonTracking),
362 fRunMFTTrackingMU(rec.fRunMFTTrackingMU),
363 fRunV0Finder(rec.fRunV0Finder),
364 fRunCascadeFinder(rec.fRunCascadeFinder),
365 fRunMultFinder(rec.fRunMultFinder),
366 fStopOnError(rec.fStopOnError),
367 fStopOnMissingTriggerFile(rec.fStopOnMissingTriggerFile),
368 fWriteAlignmentData(rec.fWriteAlignmentData),
369 fWriteESDfriend(rec.fWriteESDfriend),
370 fFillTriggerESD(rec.fFillTriggerESD),
372 fCleanESD(rec.fCleanESD),
373 fV0DCAmax(rec.fV0DCAmax),
374 fV0CsPmin(rec.fV0CsPmin),
378 fRunLocalReconstruction(rec.fRunLocalReconstruction),
379 fRunTracking(rec.fRunTracking),
380 fFillESD(rec.fFillESD),
381 fDeleteRecPoints(""),
383 fLoadCDB(rec.fLoadCDB),
384 fUseTrackingErrorsForAlignment(rec.fUseTrackingErrorsForAlignment),
385 fGAliceFileName(rec.fGAliceFileName),
386 fRawInput(rec.fRawInput),
387 fESDOutput(rec.fESDOutput),
388 fProofOutputFileName(rec.fProofOutputFileName),
389 fProofOutputLocation(rec.fProofOutputLocation),
390 fProofOutputDataset(rec.fProofOutputDataset),
391 fProofOutputArchive(rec.fProofOutputArchive),
392 fEquipIdMap(rec.fEquipIdMap),
393 fFirstEvent(rec.fFirstEvent),
394 fLastEvent(rec.fLastEvent),
395 fNumberOfEventsPerFile(rec.fNumberOfEventsPerFile),
396 fFractionFriends(rec.fFractionFriends),
398 fLoadAlignFromCDB(rec.fLoadAlignFromCDB),
399 fLoadAlignData(rec.fLoadAlignData),
400 fUseHLTData(rec.fUseHLTData),
404 fCTPTimeParams(NULL),
409 fParentRawReader(NULL),
411 fRecoParam(rec.fRecoParam),
413 fSPDTrackleter(NULL),
415 fDiamondProfileSPD(rec.fDiamondProfileSPD),
416 fDiamondProfile(rec.fDiamondProfile),
417 fDiamondProfileTPC(rec.fDiamondProfileTPC),
418 fListOfCosmicTriggers(NULL),
422 fAlignObjArray(rec.fAlignObjArray),
423 fCDBUri(rec.fCDBUri),
424 fQARefUri(rec.fQARefUri),
426 fCheckRecoCDBvsSimuCDB(),
427 fInitCDBCalled(rec.fInitCDBCalled),
428 fCDBSnapshotMode(rec.fCDBSnapshotMode),
429 fSetRunNumberFromDataCalled(rec.fSetRunNumberFromDataCalled),
430 fQADetectors(rec.fQADetectors),
431 fQATasks(rec.fQATasks),
433 fRunGlobalQA(rec.fRunGlobalQA),
434 fSameQACycle(rec.fSameQACycle),
435 fInitQACalled(rec.fInitQACalled),
436 fWriteQAExpertData(rec.fWriteQAExpertData),
437 fRunPlaneEff(rec.fRunPlaneEff),
450 fIsNewRunLoader(rec.fIsNewRunLoader),
459 fTreeBuffSize(rec.fTreeBuffSize),
465 fAnalysisMacro(rec.fAnalysisMacro),
468 fDeclTriggerClasses(rec.fDeclTriggerClasses),
475 for (Int_t i = 0; i < rec.fOptions.GetEntriesFast(); i++) {
476 if (rec.fOptions[i]) fOptions.Add(rec.fOptions[i]->Clone());
478 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
479 fReconstructor[iDet] = NULL;
480 fUpgradeMask[iDet] = kFALSE;
481 fLoader[iDet] = NULL;
482 fTracker[iDet] = NULL;
485 for (Int_t iDet = 0; iDet < AliQAv1::kNDET; iDet++) {
486 fQACycles[iDet] = rec.fQACycles[iDet];
487 fQAWriteExpert[iDet] = rec.fQAWriteExpert[iDet] ;
490 for (Int_t i = 0; i < rec.fSpecCDBUri.GetEntriesFast(); i++) {
491 if (rec.fSpecCDBUri[i]) fSpecCDBUri.Add(rec.fSpecCDBUri[i]->Clone());
494 for (Int_t i = 0; i < rec.fCheckRecoCDBvsSimuCDB.GetEntriesFast(); i++) {
495 if (rec.fCheckRecoCDBvsSimuCDB[i]) fCheckRecoCDBvsSimuCDB.AddLast(rec.fCheckRecoCDBvsSimuCDB[i]->Clone());
498 for (int i=2;i--;) for (int j=2;j--;) fBeamInt[i][j] = rec.fBeamInt[i][j];
502 //_____________________________________________________________________________
503 AliReconstruction& AliReconstruction::operator = (const AliReconstruction& rec)
505 // assignment operator
506 // Used in PROOF mode
507 // Be very careful while modifing it!
508 // Simple rules to follow:
509 // for persistent data members - use their assignment operators
510 // for non-persistent ones - do nothing or take the default values from constructor
511 // TSelector members should not be touched
512 if(&rec == this) return *this;
514 fRunVertexFinder = rec.fRunVertexFinder;
515 fRunVertexFinderTracks = rec.fRunVertexFinderTracks;
516 fRunMuonTracking = rec.fRunMuonTracking;
517 fRunMFTTrackingMU = rec.fRunMFTTrackingMU;
518 fRunV0Finder = rec.fRunV0Finder;
519 fRunCascadeFinder = rec.fRunCascadeFinder;
520 fRunMultFinder = rec.fRunMultFinder;
521 fStopOnError = rec.fStopOnError;
522 fStopOnMissingTriggerFile = rec.fStopOnMissingTriggerFile;
523 fWriteAlignmentData = rec.fWriteAlignmentData;
524 fWriteESDfriend = rec.fWriteESDfriend;
525 fFillTriggerESD = rec.fFillTriggerESD;
527 fCleanESD = rec.fCleanESD;
528 fV0DCAmax = rec.fV0DCAmax;
529 fV0CsPmin = rec.fV0CsPmin;
533 fRunLocalReconstruction = rec.fRunLocalReconstruction;
534 fRunTracking = rec.fRunTracking;
535 fFillESD = rec.fFillESD;
536 fDeleteRecPoints = rec.fDeleteRecPoints;
537 fDeleteDigits = rec.fDeleteDigits;
538 fLoadCDB = rec.fLoadCDB;
539 fUseTrackingErrorsForAlignment = rec.fUseTrackingErrorsForAlignment;
540 fGAliceFileName = rec.fGAliceFileName;
541 fRawInput = rec.fRawInput;
542 fESDOutput = rec.fESDOutput;
543 fProofOutputFileName = rec.fProofOutputFileName;
544 fProofOutputLocation = rec.fProofOutputLocation;
545 fProofOutputDataset = rec.fProofOutputDataset;
546 fProofOutputArchive = rec.fProofOutputArchive;
547 fEquipIdMap = rec.fEquipIdMap;
548 fFirstEvent = rec.fFirstEvent;
549 fLastEvent = rec.fLastEvent;
550 fNumberOfEventsPerFile = rec.fNumberOfEventsPerFile;
551 fFractionFriends = rec.fFractionFriends;
553 for (Int_t i = 0; i < rec.fOptions.GetEntriesFast(); i++) {
554 if (rec.fOptions[i]) fOptions.Add(rec.fOptions[i]->Clone());
557 fLoadAlignFromCDB = rec.fLoadAlignFromCDB;
558 fLoadAlignData = rec.fLoadAlignData;
559 fUseHLTData = rec.fUseHLTData;
561 delete fRunInfo; fRunInfo = NULL;
562 if (rec.fRunInfo) fRunInfo = new AliRunInfo(*rec.fRunInfo);
564 fEventInfo = rec.fEventInfo;
566 delete fRunScalers; fRunScalers = NULL;
567 if (rec.fRunScalers) fRunScalers = new AliTriggerRunScalers(*rec.fRunScalers);
569 delete fCTPTimeParams; fCTPTimeParams = NULL;
570 if (rec.fCTPTimeParams) fCTPTimeParams = new AliCTPTimeParams(*rec.fCTPTimeParams);
571 delete fCTPTimeAlign; fCTPTimeAlign = NULL;
572 if (rec.fCTPTimeAlign) fCTPTimeAlign = new AliCTPTimeParams(*rec.fCTPTimeAlign);
576 fParentRawReader = NULL;
578 fRecoParam = rec.fRecoParam;
580 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
581 fUpgradeMask[iDet] = kFALSE;
582 delete fReconstructor[iDet]; fReconstructor[iDet] = NULL;
583 delete fLoader[iDet]; fLoader[iDet] = NULL;
584 delete fTracker[iDet]; fTracker[iDet] = NULL;
587 for (Int_t iDet = 0; iDet < AliQAv1::kNDET; iDet++) {
588 fQACycles[iDet] = rec.fQACycles[iDet];
589 fQAWriteExpert[iDet] = rec.fQAWriteExpert[iDet] ;
592 delete fSPDTrackleter; fSPDTrackleter = NULL;
594 delete fDiamondProfileSPD; fDiamondProfileSPD = NULL;
595 if (rec.fDiamondProfileSPD) fDiamondProfileSPD = new AliESDVertex(*rec.fDiamondProfileSPD);
596 delete fDiamondProfile; fDiamondProfile = NULL;
597 if (rec.fDiamondProfile) fDiamondProfile = new AliESDVertex(*rec.fDiamondProfile);
598 delete fDiamondProfileTPC; fDiamondProfileTPC = NULL;
599 if (rec.fDiamondProfileTPC) fDiamondProfileTPC = new AliESDVertex(*rec.fDiamondProfileTPC);
601 delete fListOfCosmicTriggers; fListOfCosmicTriggers = NULL;
602 if (rec.fListOfCosmicTriggers) fListOfCosmicTriggers = (THashTable*)((rec.fListOfCosmicTriggers)->Clone());
604 delete fGRPData; fGRPData = NULL;
605 // if (rec.fGRPData) fGRPData = (TMap*)((rec.fGRPData)->Clone());
606 if (rec.fGRPData) fGRPData = (AliGRPObject*)((rec.fGRPData)->Clone());
608 delete fAlignObjArray; fAlignObjArray = NULL;
611 fQARefUri = rec.fQARefUri;
612 fSpecCDBUri.Delete();
613 fCheckRecoCDBvsSimuCDB.Delete();
615 for (Int_t i = 0; i < rec.fCheckRecoCDBvsSimuCDB.GetEntriesFast(); i++) {
616 if (rec.fCheckRecoCDBvsSimuCDB[i]) fCheckRecoCDBvsSimuCDB.AddLast(rec.fCheckRecoCDBvsSimuCDB[i]->Clone());
619 fInitCDBCalled = rec.fInitCDBCalled;
620 fCDBSnapshotMode = rec.fCDBSnapshotMode;
621 fSetRunNumberFromDataCalled = rec.fSetRunNumberFromDataCalled;
622 fQADetectors = rec.fQADetectors;
623 fQATasks = rec.fQATasks;
625 fRunGlobalQA = rec.fRunGlobalQA;
626 fSameQACycle = rec.fSameQACycle;
627 fInitQACalled = rec.fInitQACalled;
628 fWriteQAExpertData = rec.fWriteQAExpertData;
629 fRunPlaneEff = rec.fRunPlaneEff;
630 for (int i=2;i--;) for (int j=2;j--;) fBeamInt[i][j] = rec.fBeamInt[i][j];
641 fIsNewRunLoader = rec.fIsNewRunLoader;
650 fTreeBuffSize = rec.fTreeBuffSize;
656 fAnalysisMacro = rec.fAnalysisMacro;
659 fDeclTriggerClasses = rec.fDeclTriggerClasses;
664 //_____________________________________________________________________________
665 AliReconstruction::~AliReconstruction()
670 if (fListOfCosmicTriggers) {
671 fListOfCosmicTriggers->Delete();
672 delete fListOfCosmicTriggers;
676 delete fCTPTimeParams;
677 delete fCTPTimeAlign;
679 if (fAlignObjArray) {
680 fAlignObjArray->Delete();
681 delete fAlignObjArray;
683 fSpecCDBUri.Delete();
684 fCheckRecoCDBvsSimuCDB.Delete();
685 AliCodeTimer::Instance()->Print();
688 //_____________________________________________________________________________
689 void AliReconstruction::InitQA()
691 //Initialize the QA and start of cycle
692 AliCodeTimerAuto("",0);
694 if (fInitQACalled) return;
695 fInitQACalled = kTRUE;
697 if (fGRPData) AliQADataMaker::SetCloningRequest( fGRPData->GetQATrigClasses(), fGRPData->GetQACloningRequest());
700 AliQAManager * qam = AliQAManager::QAManager(AliQAv1::kRECMODE) ;
701 qam->SetSaveData(kTRUE);
702 qam->SetCycleLength(AliQAv1::kITS, 5) ;
703 if (fWriteQAExpertData)
704 qam->SetWriteExpert() ;
706 if (qam->IsDefaultStorageSet()) {
707 AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
708 AliWarning("Default QA reference storage has been already set !");
709 AliWarning(Form("Ignoring the default storage declared in AliReconstruction: %s",fQARefUri.Data()));
710 AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
711 fQARefUri = qam->GetDefaultStorage()->GetURI();
713 if (fQARefUri.Length() > 0) {
714 AliDebug(2,"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
715 AliDebug(2, Form("Default QA reference storage is set to: %s", fQARefUri.Data()));
716 AliDebug(2, "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
718 fQARefUri="local://$ALICE_ROOT/QAref";
719 AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
720 AliWarning("Default QA refeference storage not yet set !!!!");
721 AliWarning(Form("Setting it now to: %s", fQARefUri.Data()));
722 AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
725 qam->SetDefaultStorage(fQARefUri);
729 qam->SetActiveDetectors(fQADetectors) ;
730 qam->SetActiveOnlineDetectors(fRunInfo->GetActiveDetectors());
732 for (Int_t det = 0 ; det < AliQAv1::kNDET ; det++) {
733 qam->SetCycleLength(AliQAv1::DETECTORINDEX_t(det), fQACycles[det]) ;
734 qam->SetWriteExpert(AliQAv1::DETECTORINDEX_t(det)) ;
736 if (!fRawReader && !fInput && IsInTasks(AliQAv1::kRAWS))
737 fQATasks.ReplaceAll(Form("%d",AliQAv1::kRAWS), "") ;
738 qam->SetTasks(fQATasks) ;
739 qam->InitQADataMaker(AliCDBManager::Instance()->GetRun()) ;
742 Bool_t sameCycle = kFALSE ;
743 AliQADataMaker *qadm = qam->GetQADataMaker(AliQAv1::kGLOBAL);
744 AliInfo(Form("Initializing the global QA data maker"));
745 if (IsInTasks(AliQAv1::kRECPOINTS)) {
746 qadm->StartOfCycle(AliQAv1::kRECPOINTS, AliCDBManager::Instance()->GetRun(), sameCycle) ;
747 TObjArray **arr=qadm->Init(AliQAv1::kRECPOINTS);
748 AliTracker::SetResidualsArray(arr);
751 if (IsInTasks(AliQAv1::kESDS)) {
752 qadm->StartOfCycle(AliQAv1::kESDS, AliCDBManager::Instance()->GetRun(), sameCycle) ;
753 qadm->Init(AliQAv1::kESDS);
756 AliSysInfo::AddStamp("InitQA") ;
759 //_____________________________________________________________________________
760 void AliReconstruction::MergeQA(const char *fileName)
762 //Initialize the QA and start of cycle
763 AliCodeTimerAuto("",0) ;
764 AliQAManager::QAManager()->Merge(AliCDBManager::Instance()->GetRun(),fileName) ;
765 AliSysInfo::AddStamp("MergeQA") ;
768 //_____________________________________________________________________________
769 void AliReconstruction::InitCDB()
771 // activate a default CDB storage
772 // First check if we have any CDB storage set, because it is used
773 // to retrieve the calibration and alignment constants
774 AliCodeTimerAuto("",0);
776 if (fInitCDBCalled) return;
777 fInitCDBCalled = kTRUE;
779 AliCDBManager* man = AliCDBManager::Instance();
780 if (man->IsDefaultStorageSet())
782 AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
783 AliWarning("Default CDB storage has been already set !");
784 AliWarning(Form("Ignoring the default storage declared in AliReconstruction: %s",fCDBUri.Data()));
785 AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
786 fCDBUri = man->GetDefaultStorage()->GetURI();
789 if (fCDBUri.Length() > 0)
791 AliDebug(2,"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
792 AliDebug(2, Form("Default CDB storage is set to: %s", fCDBUri.Data()));
793 AliDebug(2, "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
794 man->SetDefaultStorage(fCDBUri);
796 else if (!man->GetRaw()){
797 fCDBUri="local://$ALICE_ROOT/OCDB";
798 AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
799 AliWarning("Default CDB storage not yet set !!!!");
800 AliWarning(Form("Setting it now to: %s", fCDBUri.Data()));
801 AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
802 man->SetDefaultStorage(fCDBUri);
805 AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
806 AliWarning("Default storage will be set after setting the Run Number!!!");
807 AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
811 // Now activate the detector specific CDB storage locations
812 for (Int_t i = 0; i < fSpecCDBUri.GetEntriesFast(); i++) {
813 TObject* obj = fSpecCDBUri[i];
815 AliDebug(2, "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
816 AliDebug(2, Form("Specific CDB storage for %s is set to: %s",obj->GetName(),obj->GetTitle()));
817 AliDebug(2, "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
818 man->SetSpecificStorage(obj->GetName(), obj->GetTitle());
820 AliSysInfo::AddStamp("InitCDB");
823 //_____________________________________________________________________________
824 void AliReconstruction::SetCDBSnapshotMode(const char* snapshotFileName) {
825 fCDBSnapshotMode = kTRUE;
826 AliCDBManager::Instance()->SetSnapshotMode(snapshotFileName);
829 //_____________________________________________________________________________
830 void AliReconstruction::SetDefaultStorage(const char* uri) {
831 // Store the desired default CDB storage location
832 // Activate it later within the Run() method
838 //_____________________________________________________________________________
839 void AliReconstruction::SetQARefDefaultStorage(const char* uri) {
840 // Store the desired default CDB storage location
841 // Activate it later within the Run() method
844 AliQAv1::SetQARefStorage(fQARefUri.Data()) ;
848 //_____________________________________________________________________________
849 void AliReconstruction::SetSpecificStorage(const char* calibType, const char* uri) {
850 // Store a detector-specific CDB storage location
851 // Activate it later within the Run() method
853 AliCDBPath aPath(calibType);
854 if(!aPath.IsValid()){
855 // if calibType is not wildcard but it is a valid detector, add "/*" to make it a valid path
856 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
857 if(!strcmp(calibType, fgkDetectorName[iDet])) {
858 aPath.SetPath(Form("%s/*", calibType));
859 AliInfo(Form("Path for specific storage set to %s", aPath.GetPath().Data()));
863 if(!aPath.IsValid()){
864 AliError(Form("Not a valid path or detector: %s", calibType));
869 // // check that calibType refers to a "valid" detector name
870 // Bool_t isDetector = kFALSE;
871 // for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
872 // TString detName = fgkDetectorName[iDet];
873 // if(aPath.GetLevel0() == detName) {
874 // isDetector = kTRUE;
880 // AliError(Form("Not a valid detector: %s", aPath.GetLevel0().Data()));
884 TObject* obj = fSpecCDBUri.FindObject(aPath.GetPath().Data());
885 if (obj) fSpecCDBUri.Remove(obj);
886 fSpecCDBUri.Add(new TNamed(aPath.GetPath().Data(), uri));
890 //_____________________________________________________________________________
891 void AliReconstruction::AddCheckRecoCDBvsSimuCDB(const char* cdbpath,const char* comment)
893 // require the cdb item to be the same in the rec as in the sim
894 // Activate it later within the Run() method
895 TString newent = cdbpath;
896 if (newent.IsNull()) return;
897 TIter nextit(&fCheckRecoCDBvsSimuCDB);
899 while ((cdbent=(TNamed*)nextit())) {
900 TString str = cdbent->GetName();
902 AliInfo(Form("%s is already in the list to check",cdbpath));
906 fCheckRecoCDBvsSimuCDB.AddLast(new TNamed(cdbpath,comment));
910 //_____________________________________________________________________________
911 void AliReconstruction::RemCheckRecoCDBvsSimuCDB(const char* cdbpath)
913 // require the cdb item to be the same in the rec as in the sim
914 // Activate it later within the Run() method
915 TString newent = cdbpath;
916 if (newent.IsNull()) return;
917 TIter nextit(&fCheckRecoCDBvsSimuCDB);
919 while ((cdbent=(TNamed*)nextit())) {
920 TString str = cdbent->GetName();
922 AliInfo(Form("Removing %s from the list to check",cdbpath));
923 delete fCheckRecoCDBvsSimuCDB.Remove(cdbent);
924 fCheckRecoCDBvsSimuCDB.Compress();
928 AliInfo(Form("%s is not in the list to check",cdbpath));
932 //_____________________________________________________________________________
933 Bool_t AliReconstruction::SetRunNumberFromData()
935 // The method is called in Run() in order
936 // to set a correct run number.
937 // In case of raw data reconstruction the
938 // run number is taken from the raw data header
940 if (fSetRunNumberFromDataCalled) return kTRUE;
941 fSetRunNumberFromDataCalled = kTRUE;
943 AliCDBManager* man = AliCDBManager::Instance();
946 if(fRawReader->NextEvent()) {
947 if(man->GetRun() > 0) {
948 AliWarning("Run number is taken from raw-event header! Ignoring settings in AliCDBManager!");
950 man->SetRun(fRawReader->GetRunNumber());
952 fRawReader->RewindEvents();
955 if(man->GetRun() > 0) {
956 AliWarning("No raw-data events are found ! Using settings in AliCDBManager !");
959 AliWarning("Neither raw events nor settings in AliCDBManager are found !");
965 AliRunLoader *rl = AliRunLoader::Open(fGAliceFileName.Data());
967 AliError(Form("No run loader found in file %s", fGAliceFileName.Data()));
972 // read run number from gAlice
973 if(rl->GetHeader()) {
974 man->SetRun(rl->GetHeader()->GetRun());
979 AliError("Neither run-loader header nor RawReader objects are found !");
991 //_____________________________________________________________________________
992 void AliReconstruction::SetCDBLock() {
993 // Set CDB lock: from now on it is forbidden to reset the run number
994 // or the default storage or to activate any further storage!
996 AliCDBManager::Instance()->SetLock(1);
999 //_____________________________________________________________________________
1000 void AliReconstruction::MatchUpgradeDetector() {
1001 // Translates detector name in a boolean.
1002 // The boolean is used in GetReconstructor to load the
1003 // upgrade reconstructor instead of the standard one.
1004 for(Int_t iDet = 0; iDet < kNDetectors; iDet++) {
1005 if(fUpgradeModule.Contains(fgkDetectorName[iDet])) fUpgradeMask[iDet]=kTRUE;
1008 //_____________________________________________________________________________
1009 Bool_t AliReconstruction::MisalignGeometry(const TString& detectors)
1011 // Read the alignment objects from CDB.
1012 // Each detector is supposed to have the
1013 // alignment objects in DET/Align/Data CDB path.
1014 // All the detector objects are then collected,
1015 // sorted by geometry level (starting from ALIC) and
1016 // then applied to the TGeo geometry.
1017 // Finally an overlaps check is performed.
1019 // Load alignment data from CDB and fill fAlignObjArray
1020 if(fLoadAlignFromCDB){
1022 TString detStr = detectors;
1023 TString loadAlObjsListOfDets = "";
1025 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
1026 if(!IsSelected(fgkDetectorName[iDet], detStr)) continue;
1027 if(!strcmp(fgkDetectorName[iDet],"HLT")) continue;
1029 if(AliGeomManager::GetNalignable(fgkDetectorName[iDet]) != 0)
1031 loadAlObjsListOfDets += fgkDetectorName[iDet];
1032 loadAlObjsListOfDets += " ";
1034 } // end loop over detectors
1036 if(AliGeomManager::GetNalignable("GRP") != 0)
1037 loadAlObjsListOfDets.Prepend("GRP "); //add alignment objects for non-sensitive modules
1038 AliGeomManager::ApplyAlignObjsFromCDB(loadAlObjsListOfDets.Data());
1040 // Check if the array with alignment objects was
1041 // provided by the user. If yes, apply the objects
1042 // to the present TGeo geometry
1043 if (fAlignObjArray) {
1044 if (gGeoManager && gGeoManager->IsClosed()) {
1045 if (AliGeomManager::ApplyAlignObjsToGeom(*fAlignObjArray) == kFALSE) {
1046 AliError("The misalignment of one or more volumes failed!"
1047 "Compare the list of simulated detectors and the list of detector alignment data!");
1052 AliError("Can't apply the misalignment! gGeoManager doesn't exist or it is still opened!");
1058 if (fAlignObjArray) {
1059 fAlignObjArray->Delete();
1060 delete fAlignObjArray; fAlignObjArray=NULL;
1066 //_____________________________________________________________________________
1067 void AliReconstruction::SetGAliceFile(const char* fileName)
1069 // set the name of the galice file
1071 fGAliceFileName = fileName;
1074 //_____________________________________________________________________________
1075 void AliReconstruction::SetInput(const char* input)
1077 // In case the input string starts with 'mem://', we run in an online mode
1078 // and AliRawReaderDateOnline object is created. In all other cases a raw-data
1079 // file is assumed. One can give as an input:
1080 // mem://: - events taken from DAQ monitoring libs online
1082 // mem://<filename> - emulation of the above mode (via DATE monitoring libs)
1083 if (input) fRawInput = input;
1086 //_____________________________________________________________________________
1087 void AliReconstruction::SetOutput(const char* output)
1089 // Set the output ESD filename
1090 // 'output' is a normalt ROOT url
1091 // The method is used in case of raw-data reco with PROOF
1092 if (output) fESDOutput = output;
1095 //_____________________________________________________________________________
1096 void AliReconstruction::SetOption(const char* detector, const char* option)
1098 // set options for the reconstruction of a detector
1100 TObject* obj = fOptions.FindObject(detector);
1101 if (obj) fOptions.Remove(obj);
1102 fOptions.Add(new TNamed(detector, option));
1105 //_____________________________________________________________________________
1106 void AliReconstruction::SetRecoParam(const char* detector, AliDetectorRecoParam *par)
1108 // Set custom reconstruction parameters for a given detector
1109 // Single set of parameters for all the events
1111 // First check if the reco-params are global
1112 if(!strcmp(detector, "GRP")) {
1113 par->SetAsDefault();
1114 fRecoParam.AddDetRecoParam(kNDetectors,par);
1118 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
1119 if(!strcmp(detector, fgkDetectorName[iDet])) {
1120 par->SetAsDefault();
1121 fRecoParam.AddDetRecoParam(iDet,par);
1128 //_____________________________________________________________________________
1129 Bool_t AliReconstruction::InitGRP() {
1130 //------------------------------------
1131 // Initialization of the GRP entry
1132 //------------------------------------
1133 AliCDBEntry* entry = AliCDBManager::Instance()->Get("GRP/GRP/Data");
1137 TMap* m = dynamic_cast<TMap*>(entry->GetObject()); // old GRP entry
1140 AliInfo("Found a TMap in GRP/GRP/Data, converting it into an AliGRPObject");
1142 fGRPData = new AliGRPObject();
1143 fGRPData->ReadValuesFromMap(m);
1147 AliInfo("Found an AliGRPObject in GRP/GRP/Data, reading it");
1148 fGRPData = dynamic_cast<AliGRPObject*>(entry->GetObject()); // new GRP entry
1152 // FIX ME: The unloading of GRP entry is temporarily disabled
1153 // because ZDC and VZERO are using it in order to initialize
1154 // their reconstructor objects. In the future one has to think
1155 // of propagating AliRunInfo to the reconstructors.
1156 // AliCDBManager::Instance()->UnloadFromCache("GRP/GRP/Data");
1160 AliError("No GRP entry found in OCDB!");
1164 TString lhcState = fGRPData->GetLHCState();
1165 if (lhcState==AliGRPObject::GetInvalidString()) {
1166 AliError("GRP/GRP/Data entry: missing value for the LHC state ! Using UNKNOWN");
1167 lhcState = "UNKNOWN";
1170 TString beamType = fGRPData->GetBeamType();
1171 if (beamType==AliGRPObject::GetInvalidString()) {
1172 AliError("GRP/GRP/Data entry: missing value for the beam type ! Using UNKNOWN");
1173 beamType = "UNKNOWN";
1176 Float_t beamEnergy = fGRPData->GetBeamEnergy();
1177 if (beamEnergy==AliGRPObject::GetInvalidFloat()) {
1178 AliError("GRP/GRP/Data entry: missing value for the beam energy ! Using 0");
1182 TString runType = fGRPData->GetRunType();
1183 if (runType==AliGRPObject::GetInvalidString()) {
1184 AliError("GRP/GRP/Data entry: missing value for the run type ! Using UNKNOWN");
1185 runType = "UNKNOWN";
1188 Int_t activeDetectors = fGRPData->GetDetectorMask();
1189 if (activeDetectors==AliGRPObject::GetInvalidUInt()) {
1190 AliError("GRP/GRP/Data entry: missing value for the detector mask ! Using 1074790399");
1191 activeDetectors = 1074790399;
1193 AliDebug(1, Form("activeDetectors = %d", activeDetectors));
1195 fRunInfo = new AliRunInfo(lhcState, beamType, beamEnergy, runType, activeDetectors);
1199 // Process the list of active detectors
1200 if (activeDetectors) {
1201 UInt_t detMask = activeDetectors;
1202 AliDebug(1, Form("Detector List = %s", fRunLocalReconstruction.Data()));
1203 fRunLocalReconstruction = MatchDetectorList(fRunLocalReconstruction,detMask);
1204 AliDebug(1, Form("Detector List = %s", fRunLocalReconstruction.Data()));
1205 fRunTracking = MatchDetectorList(fRunTracking,detMask);
1206 fFillESD = MatchDetectorList(fFillESD,detMask);
1207 fQADetectors = MatchDetectorList(fQADetectors,detMask);
1208 AliInfo(Form("fQADetectors=%s",fQADetectors.Data()));
1209 fDeleteRecPoints = MatchDetectorList(fDeleteRecPoints,detMask);
1210 fDeleteDigits = MatchDetectorList(fDeleteDigits,detMask);
1211 fLoadCDB.Form("%s %s %s %s",
1212 fRunLocalReconstruction.Data(),
1213 fRunTracking.Data(),
1215 fQADetectors.Data());
1216 fLoadCDB = MatchDetectorList(fLoadCDB,detMask);
1217 if (!((detMask >> AliDAQ::DetectorID("ITSSPD")) & 0x1) &&
1218 !((detMask >> AliDAQ::DetectorID("ITSSDD")) & 0x1) &&
1219 !((detMask >> AliDAQ::DetectorID("ITSSSD")) & 0x1) ) {
1220 // switch off the vertexer
1221 AliInfo("SPD,SDD,SSD is not in the list of active detectors. Vertexer and Trackleter are switched off.");
1222 fRunVertexFinder = kFALSE;
1223 fRunMultFinder = kFALSE;
1225 if (!((detMask >> AliDAQ::DetectorID("TRG")) & 0x1)) {
1226 // switch off the reading of CTP raw-data payload
1227 if (fFillTriggerESD) {
1228 AliInfo("CTP is not in the list of active detectors. CTP data reading switched off.");
1229 fFillTriggerESD = kFALSE;
1234 AliInfo("===================================================================================");
1235 AliInfo(Form("Running local reconstruction for detectors: %s",fRunLocalReconstruction.Data()));
1236 AliInfo(Form("Running tracking for detectors: %s",fRunTracking.Data()));
1237 AliInfo(Form("Filling ESD for detectors: %s",fFillESD.Data()));
1238 AliInfo(Form("Quality assurance is active for detectors: %s",fQADetectors.Data()));
1239 AliInfo(Form("CDB and reconstruction parameters are loaded for detectors: %s",fLoadCDB.Data()));
1240 AliInfo("===================================================================================");
1242 //*** Dealing with the magnetic field map
1243 if ( TGeoGlobalMagField::Instance()->IsLocked() ) {
1244 if (TGeoGlobalMagField::Instance()->GetField()->TestBit(AliMagF::kOverrideGRP)) {
1245 AliInfo("ExpertMode!!! GRP information will be ignored !");
1246 AliInfo("ExpertMode!!! Running with the externally locked B field !");
1249 AliInfo("Destroying existing B field instance!");
1250 delete TGeoGlobalMagField::Instance();
1253 if ( !TGeoGlobalMagField::Instance()->IsLocked() ) {
1254 // Construct the field map out of the information retrieved from GRP.
1257 Float_t l3Current = fGRPData->GetL3Current((AliGRPObject::Stats)0);
1258 if (l3Current == AliGRPObject::GetInvalidFloat()) {
1259 AliError("GRP/GRP/Data entry: missing value for the L3 current !");
1263 Char_t l3Polarity = fGRPData->GetL3Polarity();
1264 if (l3Polarity == AliGRPObject::GetInvalidChar()) {
1265 AliError("GRP/GRP/Data entry: missing value for the L3 polarity !");
1270 Float_t diCurrent = fGRPData->GetDipoleCurrent((AliGRPObject::Stats)0);
1271 if (diCurrent == AliGRPObject::GetInvalidFloat()) {
1272 AliError("GRP/GRP/Data entry: missing value for the dipole current !");
1276 Char_t diPolarity = fGRPData->GetDipolePolarity();
1277 if (diPolarity == AliGRPObject::GetInvalidChar()) {
1278 AliError("GRP/GRP/Data entry: missing value for the dipole polarity !");
1282 // read special bits for the polarity convention and map type
1283 Int_t polConvention = fGRPData->IsPolarityConventionLHC() ? AliMagF::kConvLHC : AliMagF::kConvDCS2008;
1284 Bool_t uniformB = fGRPData->IsUniformBMap();
1287 AliMagF* fld = AliMagF::CreateFieldMap(TMath::Abs(l3Current) * (l3Polarity ? -1:1),
1288 TMath::Abs(diCurrent) * (diPolarity ? -1:1),
1289 polConvention,uniformB,beamEnergy, beamType.Data());
1291 TGeoGlobalMagField::Instance()->SetField( fld );
1292 TGeoGlobalMagField::Instance()->Lock();
1293 AliInfo("Running with the B field constructed out of GRP !");
1295 else AliFatal("Failed to create a B field map !");
1297 else AliFatal("B field is neither set nor constructed from GRP ! Exitig...");
1300 //*** Get the diamond profiles from OCDB
1301 entry = AliCDBManager::Instance()->Get("GRP/Calib/MeanVertexSPD");
1303 fDiamondProfileSPD = dynamic_cast<AliESDVertex*> (entry->GetObject());
1305 AliError("No SPD diamond profile found in OCDB!");
1308 entry = AliCDBManager::Instance()->Get("GRP/Calib/MeanVertex");
1310 fDiamondProfile = dynamic_cast<AliESDVertex*> (entry->GetObject());
1312 AliError("No diamond profile found in OCDB!");
1315 entry = AliCDBManager::Instance()->Get("GRP/Calib/MeanVertexTPC");
1317 fDiamondProfileTPC = dynamic_cast<AliESDVertex*> (entry->GetObject());
1319 AliError("No TPC diamond profile found in OCDB!");
1322 entry = AliCDBManager::Instance()->Get("GRP/Calib/CosmicTriggers");
1324 fListOfCosmicTriggers = dynamic_cast<THashTable*>(entry->GetObject());
1328 if (!fListOfCosmicTriggers) {
1329 AliWarning("Can not get list of cosmic triggers from OCDB! Cosmic event specie will be effectively disabled!");
1335 //_____________________________________________________________________________
1336 Bool_t AliReconstruction::LoadCDB()
1338 // Load CDB entries for all active detectors.
1339 // By default we load all the entries in <det>/Calib
1342 AliCodeTimerAuto("",0);
1344 AliCDBManager::Instance()->Get("GRP/CTP/Config");
1346 AliCDBManager::Instance()->Get("GRP/Calib/LHCClockPhase");
1348 TString detStr = fLoadCDB;
1349 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
1350 if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
1351 AliCDBManager::Instance()->GetAll(Form("%s/Calib/*",fgkDetectorName[iDet]));
1352 AliCDBManager::Instance()->GetAll(Form("%s/Trigger/*",fgkDetectorName[iDet]));
1355 // Temporary fix - one has to define the correct policy in order
1356 // to load the trigger OCDB entries only for the detectors that
1357 // in the trigger or that are needed in order to put correct
1358 // information in ESD
1359 AliCDBManager::Instance()->GetAll("TRIGGER/*/*");
1360 AliCDBManager::Instance()->GetAll("HLT/*/*");
1364 //_____________________________________________________________________________
1365 Bool_t AliReconstruction::LoadTriggerScalersCDB()
1367 // Load CTP scalers from OCDB.
1368 // The scalers are checked for consistency.
1370 AliCodeTimerAuto("",0);
1372 AliCDBEntry* entry = AliCDBManager::Instance()->Get("GRP/CTP/Scalers");
1376 AliInfo("Found an AliTriggerRunScalers in GRP/CTP/Scalers, reading it");
1377 fRunScalers = dynamic_cast<AliTriggerRunScalers*> (entry->GetObject());
1379 if (fRunScalers && (fRunScalers->CorrectScalersOverflow() == 0)) AliInfo("32bit Trigger counters corrected for overflow");
1384 //_____________________________________________________________________________
1385 Bool_t AliReconstruction::LoadCTPTimeParamsCDB()
1387 // Load CTP timing information (alignment)
1390 AliCDBEntry* entry = AliCDBManager::Instance()->Get("GRP/CTP/CTPtiming");
1391 if (!entry) return kFALSE;
1393 AliInfo("Found an AliCTPTimeParams in GRP/CTP/CTPtiming, reading it");
1394 fCTPTimeParams = dynamic_cast<AliCTPTimeParams*> (entry->GetObject());
1397 AliCDBEntry* entry2 = AliCDBManager::Instance()->Get("GRP/CTP/TimeAlign");
1398 if (!entry2) return kFALSE;
1400 AliInfo("Found an AliCTPTimeParams in GRP/CTP/TimeAlign, reading it");
1401 fCTPTimeAlign = dynamic_cast<AliCTPTimeParams*> (entry2->GetObject());
1402 entry2->SetOwner(0);
1407 //_____________________________________________________________________________
1408 Bool_t AliReconstruction::ReadIntensityInfoCDB()
1410 // Load LHC DIP data
1411 AliCDBEntry* entry = AliCDBManager::Instance()->Get("GRP/GRP/LHCData");
1412 AliCDBEntry* entryCTP = AliCDBManager::Instance()->Get("GRP/CTP/Config");
1414 if (!entry || !entryCTP) {
1415 AliError(Form("Failed to extract CDB objects GRP/GRP/LHCData: %p or GRP/CTP/Config: %p",entry,entryCTP));
1419 enum {kA,kB,kC,kE,kNMasks};
1420 AliTriggerConfiguration* conf = (AliTriggerConfiguration*)entryCTP->GetObject();
1421 const TObjArray& clArr = conf->GetClasses();
1422 TObjArray masks(kNMasks);
1424 AliTriggerClass* trClass = 0;
1426 masks.SetOwner(kFALSE);
1428 while ( (trClass=(AliTriggerClass*)next()) ) {
1429 TString trName = trClass->GetName();
1430 int ind = trName.Index("-"); // prefix in front of A,B,C,E
1431 if (ind<1) continue; // anomaly
1433 trName = trName.Data() + ind;
1434 AliTriggerBCMask* bcMask = trClass->GetBCMask();
1435 if (!bcMask) continue;
1437 if (trName.BeginsWith("-A-")) which |= 0x1<<kA;
1438 else if (trName.BeginsWith("-B-")) which |= 0x1<<kB;
1439 else if (trName.BeginsWith("-C-")) which |= 0x1<<kC;
1440 else if (trName.BeginsWith("-E-")) which |= 0x1<<kE;
1441 else if (trName.BeginsWith("-AC-")) which |= (0x1<<kA) | (0x1<<kC);
1442 else if (trName.BeginsWith("-CA-")) which |= (0x1<<kA) | (0x1<<kC);
1443 else { AliWarning(Form("Unknown trigger type %s\n",trClass->GetName())); continue;}
1445 for (int ip=kNMasks;ip--;) {
1446 if ( !(which&(0x1<<ip)) || masks[ip] ) continue; // does not match or already done
1447 masks[ip] = (TObject*)bcMask;
1450 if (nFound==kNMasks) break;
1453 AliInfo("Reading mean bunch intensities from GRP/GRP/LHCData");
1454 AliLHCData* dipData = dynamic_cast<AliLHCData*> (entry->GetObject());
1456 for (int ib=2;ib--;) {
1458 if (dipData && (dipData->GetMeanIntensity(ib,intI,intNI,&masks)>=0)) {
1459 fBeamInt[ib][0] = intI;
1460 fBeamInt[ib][1] = intNI;
1461 AliInfo(Form("Mean intensity for beam %d: Interacting:%.2e Non-Interacting:%.2e",ib,intI,intNI));
1469 //_____________________________________________________________________________
1470 Bool_t AliReconstruction::Run(const char* input)
1473 AliCodeTimerAuto("",0);
1476 if (GetAbort() != TSelector::kContinue) return kFALSE;
1478 TChain *chain = NULL;
1479 if (fRawReader && (chain = fRawReader->GetChain())) {
1480 Long64_t nEntries = (fLastEvent < 0) ? (TChain::kBigNumber) : (fLastEvent - fFirstEvent + 1);
1483 // Temporary fix for long raw-data runs (until socket timeout handling in PROOF is revised)
1484 gProof->Exec("gEnv->SetValue(\"Proof.SocketActivityTimeout\",-1)", kTRUE);
1487 gProof->Exec("TGrid::Connect(\"alien://\")",kTRUE);
1489 TMessage::EnableSchemaEvolutionForAll(kTRUE);
1490 gProof->Exec("TMessage::EnableSchemaEvolutionForAll(kTRUE)",kTRUE);
1492 gProof->AddInput(this);
1494 if (!ParseOutput()) return kFALSE;
1496 gProof->SetParameter("PROOF_MaxSlavesPerNode", 9999);
1498 chain->Process("AliReconstruction","",nEntries,fFirstEvent);
1501 chain->Process(this,"",nEntries,fFirstEvent);
1506 if (GetAbort() != TSelector::kContinue) return kFALSE;
1508 if (GetAbort() != TSelector::kContinue) return kFALSE;
1509 //******* The loop over events
1510 AliInfo("Starting looping over events");
1512 while ((iEvent < fRunLoader->GetNumberOfEvents()) ||
1513 (fRawReader && fRawReader->NextEvent())) {
1515 // check if process has enough resources
1516 if (!HasEnoughResources(iEvent)) break;
1517 if (!ProcessEvent(iEvent)) {
1518 Abort("ProcessEvent",TSelector::kAbortFile);
1521 CleanProcessedEvent();
1524 if (!iEvent) AliWarning("No events passed trigger selection");
1526 if (GetAbort() != TSelector::kContinue) return kFALSE;
1528 if (GetAbort() != TSelector::kContinue) return kFALSE;
1534 //_____________________________________________________________________________
1535 void AliReconstruction::InitRawReader(const char* input)
1537 // Init raw-reader and
1538 // set the input in case of raw data
1540 AliCodeTimerAuto("",0);
1542 if (input) fRawInput = input;
1543 fRawReader = AliRawReader::Create(fRawInput.Data());
1545 if (fRawInput.IsNull()) {
1546 AliInfo("Reconstruction will run over digits");
1549 AliFatal("Can not create raw-data reader ! Exiting...");
1553 if (!fEquipIdMap.IsNull() && fRawReader)
1554 fRawReader->LoadEquipmentIdsMap(fEquipIdMap);
1556 if (!fUseHLTData.IsNull()) {
1557 // create the RawReaderHLT which performs redirection of HLT input data for
1558 // the specified detectors
1559 AliRawReader* pRawReader=AliRawHLTManager::CreateRawReaderHLT(fRawReader, fUseHLTData.Data());
1561 fParentRawReader=fRawReader;
1562 fRawReader=pRawReader;
1564 AliError(Form("can not create Raw Reader for HLT input %s", fUseHLTData.Data()));
1567 AliSysInfo::AddStamp("CreateRawReader");
1570 //_____________________________________________________________________________
1571 void AliReconstruction::InitRun(const char* input)
1573 // Initialization of raw-reader,
1574 // run number, CDB etc.
1575 AliCodeTimerAuto("",0);
1576 AliSysInfo::AddStamp("Start");
1578 // Initialize raw-reader if any
1579 InitRawReader(input);
1581 // Initialize the CDB storage
1584 // Set run number in CDBManager (if it is not already set by the user)
1585 if (!SetRunNumberFromData()) {
1586 Abort("SetRunNumberFromData", TSelector::kAbortProcess);
1590 // Set CDB lock: from now on it is forbidden to reset the run number
1591 // or the default storage or to activate any further storage!
1596 //_____________________________________________________________________________
1597 void AliReconstruction::Begin(TTree *)
1599 // Initialize AlReconstruction before
1600 // going into the event loop
1601 // Should follow the TSelector convention
1602 // i.e. initialize only the object on the client side
1603 AliCodeTimerAuto("",0);
1605 AliReconstruction *reco = NULL;
1607 if ((reco = (AliReconstruction*)fInput->FindObject("AliReconstruction"))) {
1610 AliSysInfo::AddStamp("ReadInputInBegin");
1613 // Import ideal TGeo geometry and apply misalignment
1614 if (!AliGeomManager::GetGeometry()) {
1615 TString geom(gSystem->DirName(fGAliceFileName));
1616 geom += "/geometry.root";
1617 AliGeomManager::LoadGeometry(geom.Data());
1619 Abort("LoadGeometry", TSelector::kAbortProcess);
1622 AliSysInfo::AddStamp("LoadGeom");
1623 TString detsToCheck=fRunLocalReconstruction;
1624 if(!AliGeomManager::CheckSymNamesLUT(detsToCheck.Data())) {
1625 Abort("CheckSymNamesLUT", TSelector::kAbortProcess);
1628 AliSysInfo::AddStamp("CheckGeom");
1631 Bool_t toCDBSnapshot=kFALSE;
1632 TString snapshotFileOut(""); // we could use fSnapshotFileName if we are not interested
1633 // in reading from and writing to a snapshot file at the same time
1634 if(TString(getenv("OCDB_SNAPSHOT_CREATE")) == TString("kTRUE")){
1635 toCDBSnapshot=kTRUE;
1636 //fFromCDBSnapshot=kFALSE;
1637 TString snapshotFile(getenv("OCDB_SNAPSHOT_FILENAME"));
1638 if(!(snapshotFile.IsNull() || snapshotFile.IsWhitespace()))
1639 snapshotFileOut = snapshotFile;
1641 snapshotFileOut="OCDB.root";
1644 TString detStr(fLoadAlignData);
1645 if (!toCDBSnapshot) {
1646 if (!MisalignGeometry(fLoadAlignData)) {
1647 Abort("MisalignGeometry", TSelector::kAbortProcess);
1651 // when creating the snapshot, load the CDB alignment objects without applying them to the geometry
1652 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
1653 if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
1654 if (!strcmp(fgkDetectorName[iDet],"HLT")) continue;
1655 if (AliGeomManager::GetNalignable(fgkDetectorName[iDet]) != 0)
1657 TString detAlignPath = fgkDetectorName[iDet];
1658 detAlignPath += "/Align/Data";
1659 AliCDBManager::Instance()->Get(detAlignPath);
1661 } // end loop over detectors
1662 if(AliGeomManager::GetNalignable("GRP") != 0)
1663 AliCDBManager::Instance()->Get("GRP/Align/Data");
1666 const TMap* cdbCache = AliCDBManager::Instance()->GetEntryCache();
1667 if(!toCDBSnapshot) {
1668 if(cdbCache->Contains("GRP/Geometry/Data"))
1669 AliCDBManager::Instance()->UnloadFromCache("GRP/Geometry/Data");
1670 AliCDBManager::Instance()->UnloadFromCache("*/Align/*");
1672 AliSysInfo::AddStamp("MisalignGeom");
1675 Abort("InitGRP", TSelector::kAbortProcess);
1678 AliSysInfo::AddStamp("InitGRP");
1680 if(cdbCache->Contains("GRP/Calib/CosmicTriggers"))
1681 AliCDBManager::Instance()->UnloadFromCache("GRP/Calib/CosmicTriggers");
1683 if(!fCDBSnapshotMode || toCDBSnapshot){
1685 Abort("LoadCDB", TSelector::kAbortProcess);
1688 AliSysInfo::AddStamp("LoadCDB");
1691 if (!LoadTriggerScalersCDB()) {
1692 Abort("LoadTriggerScalersCDB", TSelector::kAbortProcess);
1695 AliSysInfo::AddStamp("LoadTriggerScalersCDB");
1697 if (!LoadCTPTimeParamsCDB()) {
1698 Abort("LoadCTPTimeParamsCDB", TSelector::kAbortProcess);
1701 AliSysInfo::AddStamp("LoadCTPTimeParamsCDB");
1703 if (!ReadIntensityInfoCDB()) {
1704 Abort("ReadIntensityInfoCDB", TSelector::kAbortProcess);
1707 AliSysInfo::AddStamp("ReadIntensityInfoCDB");
1709 // Read the reconstruction parameters from OCDB
1710 if (!InitRecoParams()) {
1711 AliWarning("Not all detectors have correct RecoParam objects initialized");
1713 AliSysInfo::AddStamp("InitRecoParams");
1717 AliCDBManager::Instance()->DumpToSnapshotFile(snapshotFileOut.Data(),kFALSE);
1721 if (fInput && gProof) {
1722 if (reco) *reco = *this;
1724 gGeoManager->SetName("Geometry");
1725 gProof->AddInputData(gGeoManager,kTRUE);
1727 gProof->AddInputData(const_cast<TMap*>(AliCDBManager::Instance()->GetEntryCache()),kTRUE);
1728 fInput->Add(new TParameter<Int_t>("RunNumber",AliCDBManager::Instance()->GetRun()));
1729 AliMagF *magFieldMap = (AliMagF*)TGeoGlobalMagField::Instance()->GetField();
1730 magFieldMap->SetName("MagneticFieldMap");
1731 gProof->AddInputData(magFieldMap,kTRUE);
1733 fAnalysis->SetName("Analysis");
1734 gProof->AddInputData(fAnalysis,kTRUE);
1740 //_____________________________________________________________________________
1741 void AliReconstruction::SlaveBegin(TTree*)
1743 // Initialization related to run-loader,
1744 // vertexer, trackers, recontructors
1745 // In proof mode it is executed on the slave
1746 AliCodeTimerAuto("",0);
1748 TProofOutputFile *outProofFile = NULL;
1750 if (AliDebugLevel() > 0) fInput->Print();
1751 if (AliDebugLevel() > 10) fInput->Dump();
1752 if (AliReconstruction *reco = (AliReconstruction*)fInput->FindObject("AliReconstruction")) {
1755 if (TGeoManager *tgeo = (TGeoManager*)fInput->FindObject("Geometry")) {
1757 AliGeomManager::SetGeometry(tgeo);
1759 if (TMap *entryCache = (TMap*)fInput->FindObject("CDBEntryCache")) {
1760 Int_t runNumber = -1;
1761 if (TProof::GetParameter(fInput,"RunNumber",runNumber) == 0) {
1762 AliCDBManager *man = AliCDBManager::Instance(entryCache,runNumber);
1763 man->SetCacheFlag(kTRUE);
1764 man->SetLock(kTRUE);
1768 if (AliMagF *map = (AliMagF*)fInput->FindObject("MagneticFieldMap")) {
1769 AliMagF *newMap = new AliMagF(*map);
1770 if (!newMap->LoadParameterization()) {
1771 Abort("AliMagF::LoadParameterization", TSelector::kAbortProcess);
1774 TGeoGlobalMagField::Instance()->SetField(newMap);
1775 TGeoGlobalMagField::Instance()->Lock();
1778 // Attempt to get the analysis manager from the input list
1779 fAnalysis = (AliAnalysisManager*)fInput->FindObject("Analysis");
1780 if (fAnalysis) AliInfo("==== Analysis manager retrieved from input list ====");
1782 if (TNamed *outputFileName = (TNamed*)fInput->FindObject("PROOF_OUTPUTFILE"))
1783 fProofOutputFileName = outputFileName->GetTitle();
1784 if (TNamed *outputLocation = (TNamed*)fInput->FindObject("PROOF_OUTPUTFILE_LOCATION"))
1785 fProofOutputLocation = outputLocation->GetTitle();
1786 if (fInput->FindObject("PROOF_OUTPUTFILE_DATASET"))
1787 fProofOutputDataset = kTRUE;
1788 if (TNamed *archiveList = (TNamed*)fInput->FindObject("PROOF_OUTPUTFILE_ARCHIVE"))
1789 fProofOutputArchive = archiveList->GetTitle();
1790 if (!fProofOutputFileName.IsNull() &&
1791 !fProofOutputLocation.IsNull() &&
1792 fProofOutputArchive.IsNull()) {
1793 if (!fProofOutputDataset) {
1794 outProofFile = new TProofOutputFile(fProofOutputFileName.Data(),"M");
1795 outProofFile->SetOutputFileName(Form("%s%s",fProofOutputLocation.Data(),fProofOutputFileName.Data()));
1798 outProofFile = new TProofOutputFile(fProofOutputFileName.Data(),"DROV",fProofOutputLocation.Data());
1800 if (AliDebugLevel() > 0) outProofFile->Dump();
1801 fOutput->Add(outProofFile);
1803 AliSysInfo::AddStamp("ReadInputInSlaveBegin");
1805 // Check if analysis was requested in the reconstruction event loop
1807 // Attempt to connect in-memory singleton
1808 fAnalysis = AliAnalysisManager::GetAnalysisManager();
1809 if (fAnalysis) AliInfo(Form("==== Analysis manager <%s> found in memory ====", fAnalysis->GetName()));
1810 // Check if an analysis macro was specified
1811 if (!fAnalysis && !fAnalysisMacro.IsNull()) {
1812 // Run specified analysis macro
1813 gROOT->ProcessLine(Form(".x %s",fAnalysisMacro.Data()));
1814 fAnalysis = AliAnalysisManager::GetAnalysisManager();
1815 if (!fAnalysis) AliError(Form("No analysis manager produced by analysis macro %s", fAnalysisMacro.Data()));
1816 else AliInfo(Form("==== Analysis manager <%s> produced by analysis macro <%s> ====",
1817 fAnalysis->GetName(), fAnalysisMacro.Data()));
1821 // get the run loader
1822 if (!InitRunLoader()) {
1823 Abort("InitRunLoader", TSelector::kAbortProcess);
1826 AliSysInfo::AddStamp("LoadLoader");
1828 CheckRecoCDBvsSimuCDB();
1830 ftVertexer = new AliVertexerTracks(AliTracker::GetBz());
1833 if (!fRunTracking.IsNull() && !CreateTrackers(fRunTracking)) {
1834 Abort("CreateTrackers", TSelector::kAbortProcess);
1837 AliSysInfo::AddStamp("CreateTrackers");
1839 // create the ESD output file and tree
1840 if (!outProofFile) {
1841 ffile = TFile::Open("AliESDs.root", "RECREATE");
1842 ffile->SetCompressionLevel(2);
1843 if (!ffile->IsOpen()) {
1844 Abort("OpenESDFile", TSelector::kAbortProcess);
1849 AliInfo(Form("Opening output PROOF file: %s/%s",
1850 outProofFile->GetDir(), outProofFile->GetFileName()));
1851 if (!(ffile = outProofFile->OpenFile("RECREATE"))) {
1852 Abort(Form("Problems opening output PROOF file: %s/%s",
1853 outProofFile->GetDir(), outProofFile->GetFileName()),
1854 TSelector::kAbortProcess);
1859 ftree = new TTree("esdTree", "Tree with ESD objects");
1860 fesd = new AliESDEvent();
1861 fesd->CreateStdContent();
1862 // add a so far non-std object to the ESD, this will
1863 // become part of the std content
1864 fesd->AddObject(new AliESDHLTDecision);
1866 fesd->WriteToTree(ftree);
1867 if (fWriteESDfriend) {
1868 ffileF = TFile::Open("AliESDfriends.root", "RECREATE");
1869 ftreeF = new TTree("esdFriendTree", "Tree with ESD Friend objects");
1870 fesdf = new AliESDfriend();
1871 ftreeF->Branch("ESDfriend.","AliESDfriend", &fesdf);
1872 fesd->AddObject(fesdf);
1875 ftree->GetUserInfo()->Add(fesd);
1877 fhlttree = new TTree("HLTesdTree", "Tree with HLT ESD objects");
1878 fhltesd = new AliESDEvent();
1879 fhltesd->CreateStdContent();
1880 // read the ESD template from CDB
1881 // HLT is allowed to put non-std content to its ESD, the non-std
1882 // objects need to be created before invocation of WriteToTree in
1883 // order to create all branches. Initialization is done from an
1884 // ESD layout template in CDB
1885 AliCDBManager* man = AliCDBManager::Instance();
1886 AliCDBEntry* hltESDConfig = man->Get("HLT/Calib/esdLayout");
1888 AliError(Form("Error getting \"HLT/Calib/esdLayout\""));
1891 AliESDEvent* pESDLayout=dynamic_cast<AliESDEvent*>(hltESDConfig->GetObject());
1893 // init all internal variables from the list of objects
1894 pESDLayout->GetStdContent();
1896 // copy content and create non-std objects
1897 *fhltesd=*pESDLayout;
1900 AliError(Form("error setting hltEsd layout from \"HLT/Calib/esdLayout\": invalid object type"));
1903 fhltesd->WriteToTree(fhlttree);
1904 fhlttree->GetUserInfo()->Add(fhltesd);
1906 ProcInfo_t procInfo;
1907 gSystem->GetProcInfo(&procInfo);
1908 AliInfo(Form("Current memory usage %ld %ld", procInfo.fMemResident, procInfo.fMemVirtual));
1911 fESDpid = new AliESDpid();
1914 //Initialize the QA and start of cycle
1915 if (fRunQA || fRunGlobalQA)
1918 //Initialize the Plane Efficiency framework
1919 if (fRunPlaneEff && !InitPlaneEff()) {
1920 Abort("InitPlaneEff", TSelector::kAbortProcess);
1924 if (strcmp(gProgName,"alieve") == 0)
1925 fRunAliEVE = InitAliEVE();
1926 // If we have an analysis manager, connect the AliRecoInputHandler here
1928 if (!dynamic_cast<AliRecoInputHandler*>(fAnalysis->GetInputEventHandler())) {
1929 AliError("Analysis manager used in reconstruction should use AliRecoInputHandler - \
1930 \n ->Replacing with AliRecoInputHandler instance.");
1931 delete fAnalysis->GetInputEventHandler();
1933 // Set the event and other data pointers
1934 fRecoHandler = new AliRecoInputHandler();
1935 // fRecoHandler->Init(ftree, "LOCAL");
1936 fRecoHandler->SetEvent(fesd);
1937 fRecoHandler->SetESDfriend(fesdf);
1938 fRecoHandler->SetHLTEvent(fhltesd);
1939 fRecoHandler->SetHLTTree(fhlttree);
1940 fAnalysis->SetInputEventHandler(fRecoHandler);
1941 // Enter external loop mode
1942 fAnalysis->SetExternalLoop(kTRUE);
1943 // Initialize analysis
1944 fAnalysis->SlaveBegin(ftree);
1945 fAnalysis->StartAnalysis("local", (TTree*)0);
1946 // Connect ESD tree with the input container
1947 fAnalysis->GetCommonInputContainer()->SetData(ftree);
1952 //_____________________________________________________________________________
1953 Bool_t AliReconstruction::Process(Long64_t entry)
1955 // run the reconstruction over a single entry
1956 // from the chain with raw data
1957 AliCodeTimerAuto("",0);
1959 TTree *currTree = fChain->GetTree();
1960 AliRawVEvent *event = NULL;
1961 currTree->SetBranchAddress("rawevent",&event);
1962 currTree->GetEntry(entry);
1963 fRawReader = new AliRawReaderRoot(event);
1964 // check if process has enough resources
1965 if (!HasEnoughResources(entry)) return kFALSE;
1966 fStatus = ProcessEvent(fRunLoader->GetNumberOfEvents());
1974 //_____________________________________________________________________________
1975 void AliReconstruction::Init(TTree *tree)
1977 // Implementation of TSelector::Init()
1980 AliError("The input tree is not found!");
1986 //_____________________________________________________________________________
1987 Bool_t AliReconstruction::ProcessEvent(Int_t iEvent)
1989 // run the reconstruction over a single event
1990 // The event loop is steered in Run method
1993 static Long_t oldMres=0;
1994 static Long_t oldMvir=0;
1995 static Float_t oldCPU=0;
1996 static Long_t aveDMres=0;
1997 static Long_t aveDMvir=0;
1998 static Float_t aveDCPU=0;
2000 AliCodeTimerAuto("",0);
2002 AliSysInfo::AddStamp(Form("StartEv_%d",iEvent), 0,0,iEvent);
2004 if (iEvent >= fRunLoader->GetNumberOfEvents()) {
2005 fRunLoader->SetEventNumber(iEvent);
2007 fRunLoader->GetHeader()->Reset(fRawReader->GetRunNumber(),
2009 fRunLoader->TreeE()->Fill();
2011 if (fRawReader && fRawReader->UseAutoSaveESD())
2012 fRunLoader->TreeE()->AutoSave("SaveSelf");
2015 if ((iEvent < fFirstEvent) || ((fLastEvent >= 0) && (iEvent > fLastEvent))) {
2020 fRunLoader->GetEvent(iEvent);
2022 // Fill Event-info object
2024 fRecoParam.SetEventSpecie(fRunInfo,fEventInfo,fListOfCosmicTriggers);
2026 ProcInfo_t procInfo;
2027 if(iEvent==fFirstEvent) {
2028 gSystem->GetProcInfo(&procInfo);
2029 oldMres=procInfo.fMemResident;
2030 oldMvir=procInfo.fMemVirtual;
2031 oldCPU=procInfo.fCpuUser+procInfo.fCpuSys;
2033 AliInfo(Form("================================= Processing event %d of type %-10s ==================================", iEvent,fRecoParam.PrintEventSpecie()));
2035 AliSysInfo::AddStamp(Form("StartReco_%d",iEvent), 0,0,iEvent);
2037 // Set the reco-params
2039 TString detStr = fLoadCDB;
2040 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
2041 if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
2042 AliReconstructor *reconstructor = GetReconstructor(iDet);
2043 if (reconstructor && fRecoParam.GetDetRecoParamArray(iDet)) {
2044 const AliDetectorRecoParam *par = fRecoParam.GetDetRecoParam(iDet);
2045 reconstructor->SetRecoParam(par);
2046 reconstructor->GetPidSettings(fESDpid);
2047 reconstructor->SetEventInfo(&fEventInfo);
2049 AliQAManager::QAManager()->SetEventInfo(&fEventInfo) ;
2050 AliQAManager::QAManager()->SetRecoParam(iDet, par) ;
2051 if (par) AliQAManager::QAManager()->SetEventSpecie(AliRecoParam::Convert(par->GetEventSpecie())) ;
2056 if (fRunQA || fRunGlobalQA) AliQADataMaker::SetEventTrigClasses(fEventInfo.GetTriggerClasses()); // RS: select which histo clones are to be filled
2059 const AliDetectorRecoParam *grppar = fRecoParam.GetDetRecoParam(kNDetectors);
2060 AliQAManager::QAManager()->SetRecoParam(AliQAv1::kGLOBAL, grppar) ;
2061 AliQAManager::QAManager()->SetEventSpecie(AliRecoParam::Convert(grppar->GetEventSpecie())) ;
2066 if (fRunQA && IsInTasks(AliQAv1::kRAWS)) {
2067 AliQAManager::QAManager()->SetEventSpecie(fRecoParam.GetEventSpecie()) ;
2068 AliQAManager::QAManager()->RunOneEvent(fRawReader) ;
2069 AliSysInfo::AddStamp(Form("RawQA_%d",iEvent), 0,0,iEvent);
2072 // fill Event header information from the RawEventHeader
2073 if (fRawReader){FillRawEventHeaderESD(fesd);}
2074 if (fRawReader){FillRawEventHeaderESD(fhltesd);}
2076 // Store DAQ detector pattern and attributes
2077 fesd->SetDAQDetectorPattern(fRawReader->GetDetectorPattern()[0]);
2078 fesd->SetDAQAttributes(fRawReader->GetAttributes()[2]);
2081 fesd->SetRunNumber(fRunLoader->GetHeader()->GetRun());
2082 fhltesd->SetRunNumber(fRunLoader->GetHeader()->GetRun());
2084 ((AliESDRun*)fesd->GetESDRun())->SetDetectorsInDAQ(fRunInfo->GetDetectorMask());
2085 ((AliESDRun*)fhltesd->GetESDRun())->SetDetectorsInDAQ(fRunInfo->GetDetectorMask());
2086 ((AliESDRun*)fesd->GetESDRun())->SetDetectorsInReco(AliDAQ::DetectorPatternOffline(fFillESD.Data()));
2087 ((AliESDRun*)fhltesd->GetESDRun())->SetDetectorsInReco(AliDAQ::DetectorPatternOffline(fFillESD.Data()));
2089 fesd->SetEventNumberInFile(fRunLoader->GetHeader()->GetEventNrInRun());
2090 fhltesd->SetEventNumberInFile(fRunLoader->GetHeader()->GetEventNrInRun());
2092 fesd->SetEventSpecie(fRecoParam.GetEventSpecie());
2093 fhltesd->SetEventSpecie(fRecoParam.GetEventSpecie());
2095 // Set magnetic field from the tracker
2096 fesd->SetMagneticField(AliTracker::GetBz());
2097 fhltesd->SetMagneticField(AliTracker::GetBz());
2099 AliESDRun *esdRun,*esdRunH;
2100 esdRun = (AliESDRun*)fesd->GetESDRun();
2101 esdRunH = (AliESDRun*)fhltesd->GetESDRun();
2102 esdRun->SetBeamEnergyIsSqrtSHalfGeV();
2103 esdRunH->SetBeamEnergyIsSqrtSHalfGeV();
2105 for (int ib=2;ib--;) for (int it=2;it--;) {
2106 esdRun->SetMeanIntensity(ib,it, fBeamInt[ib][it]);
2107 esdRunH->SetMeanIntensity(ib,it, fBeamInt[ib][it]);
2110 fesd->SetBeamEnergy(fGRPData->GetBeamEnergy());
2111 fesd->SetBeamType(fGRPData->GetBeamType().Data());
2112 fesd->SetBeamParticle(fGRPData->GetSingleBeamType(0).Atoi(),0);
2113 fesd->SetBeamParticle(fGRPData->GetSingleBeamType(1).Atoi(),1);
2114 fhltesd->SetBeamEnergy(fGRPData->GetBeamEnergy());
2115 fhltesd->SetBeamType(fGRPData->GetBeamType().Data());
2116 fhltesd->SetBeamParticle(fGRPData->GetSingleBeamType(0).Atoi(),0);
2117 fhltesd->SetBeamParticle(fGRPData->GetSingleBeamType(1).Atoi(),1);
2119 AliMagF* fld = (AliMagF*)TGeoGlobalMagField::Instance()->GetField();
2120 if (fld) { // set info needed for field initialization
2121 fesd->SetCurrentL3(fld->GetCurrentSol());
2122 fesd->SetCurrentDip(fld->GetCurrentDip());
2123 fesd->SetUniformBMap(fld->IsUniform());
2124 fesd->SetBInfoStored();
2126 fhltesd->SetCurrentL3(fld->GetCurrentSol());
2127 fhltesd->SetCurrentDip(fld->GetCurrentDip());
2128 fhltesd->SetUniformBMap(fld->IsUniform());
2129 fhltesd->SetBInfoStored();
2133 // run full HLT reconstruction first
2136 TString detectors=fRunLocalReconstruction;
2137 if (IsSelected("HLT", detectors) &&
2138 !RunLocalEventReconstruction("HLT")) {
2139 if (fStopOnError) {CleanUp(); return kFALSE;}
2142 // run HLT on hltesd
2143 if (IsSelected("HLT", detectors) &&
2144 !FillESD(fhltesd, "HLT")) {
2145 if (fStopOnError) {CleanUp(); return kFALSE;}
2149 // local single event reconstruction
2150 if (!fRunLocalReconstruction.IsNull()) {
2151 TString detectors=fRunLocalReconstruction;
2152 // the logic for selection and correct sequence of reconstruction relies on the
2153 // full list of detectors. Keyword 'ALL' should have been replaced at this point.
2154 if (detectors.Contains("ALL")) {
2155 AliFatal("Keyword 'ALL' needs to be replaced by the full list of detectors in "
2156 "fRunLocalReconstruction. This should have been done by the framework");
2158 detectors.ReplaceAll("HLT", "");
2159 if (!RunLocalEventReconstruction(detectors)) {
2169 // Set most probable pt, for B=0 tracking
2170 // Get the global reco-params. They are atposition 16 inside the array of detectors in fRecoParam
2171 const AliGRPRecoParam *grpRecoParam = dynamic_cast<const AliGRPRecoParam*>(fRecoParam.GetDetRecoParam(kNDetectors));
2172 if (grpRecoParam) AliExternalTrackParam::SetMostProbablePt(grpRecoParam->GetMostProbablePt());
2174 // Fill raw-data error log into the ESD
2175 if (fRawReader) FillRawDataErrorLog(iEvent,fesd);
2177 AliSysInfo::AddStamp(Form("FillHeadErrs_%d",iEvent), 0,0,iEvent);
2180 if (fRunVertexFinder) {
2181 if (!RunVertexFinder(fesd)) {
2182 if (fStopOnError) {CleanUp(); return kFALSE;}
2184 AliSysInfo::AddStamp(Form("VtxFinder_%d",iEvent), 0,0,iEvent);
2187 // For Plane Efficiency: run the SPD trackleter
2188 if (fRunPlaneEff && fSPDTrackleter) {
2189 if (!RunSPDTrackleting(fesd)) {
2190 if (fStopOnError) {CleanUp(); return kFALSE;}
2192 AliSysInfo::AddStamp(Form("TrackletEff_%d",iEvent), 0,0,iEvent);
2196 if (!fRunTracking.IsNull()) {
2197 if (fRunMuonTracking) {
2198 if (!RunMuonTracking(fesd)) {
2199 if (fStopOnError) {CleanUp(); return kFALSE;}
2202 AliSysInfo::AddStamp(Form("TrackingMUON_%d",iEvent), 0,0,iEvent);
2205 //---------------- AU From here...
2207 // MFT tracking of MUON tracks
2208 if (!fRunTracking.IsNull()) {
2209 if (fRunMFTTrackingMU && fRunMuonTracking) {
2210 if (!RunMFTTrackingMU(fesd)) {
2211 if (fStopOnError) {CleanUp(); return kFALSE;}
2214 AliSysInfo::AddStamp(Form("TrackingMFT_MUON_%d",iEvent), 0,0,iEvent);
2217 //---------------- ...to here
2220 if (!fRunTracking.IsNull()) {
2221 if (!RunTracking(fesd,*fESDpid)) {
2222 if (fStopOnError) {CleanUp(); return kFALSE;}
2227 if (!fFillESD.IsNull()) {
2228 TString detectors=fFillESD;
2229 // the logic for selection and correct sequence of reconstruction relies on the
2230 // full list of detectors. Keyword 'ALL' should have been replaced at this point.
2231 if (detectors.Contains("ALL")) {
2232 AliFatal("Keyword 'ALL' needs to be replaced by the full list of detectors in "
2233 "fFillESD. This should have been done by the framework");
2235 // remove HLT as this has been executed at the beginning of the event reconstruction
2236 detectors.ReplaceAll("HLT", "");
2237 if (!FillESD(fesd, detectors)) {
2238 if (fStopOnError) {CleanUp(); return kFALSE;}
2245 // Propagate track to the beam pipe (if not already done by ITS)
2247 const Int_t ntracks = fesd->GetNumberOfTracks();
2248 const Double_t kRadius = 2.8; //something less than the beam pipe radius
2251 UShort_t selectedIdx[ntracks];
2253 for (Int_t itrack=0; itrack<ntracks; itrack++){
2254 const Double_t kMaxStep = 1; //max step over the material
2257 AliESDtrack *track = fesd->GetTrack(itrack);
2258 if (!track) continue;
2260 AliExternalTrackParam *tpcTrack =
2261 (AliExternalTrackParam *)track->GetTPCInnerParam();
2265 PropagateTrackToBxByBz(tpcTrack,kRadius,track->GetMassForTracking(),kMaxStep,kFALSE);
2268 Int_t n=trkArray.GetEntriesFast();
2269 selectedIdx[n]=track->GetID();
2270 trkArray.AddLast(tpcTrack);
2273 //Tracks refitted by ITS should already be at the SPD vertex
2274 if (track->IsOn(AliESDtrack::kITSrefit)) continue;
2277 PropagateTrackToBxByBz(track,kRadius,track->GetMassForTracking(),kMaxStep,kFALSE);
2278 Double_t x[3]; track->GetXYZ(x);
2279 Double_t b[3]; AliTracker::GetBxByBz(x,b);
2280 track->RelateToVertexBxByBz(fesd->GetPrimaryVertexSPD(), b, kVeryBig);
2283 AliSysInfo::AddStamp(Form("RelToSPDVtx_%d",iEvent), 0,0,iEvent);
2285 // Improve the reconstructed primary vertex position using the tracks
2287 Bool_t runVertexFinderTracks = fRunVertexFinderTracks;
2288 if(fesd->GetPrimaryVertexSPD()) {
2289 TString vtitle = fesd->GetPrimaryVertexSPD()->GetTitle();
2290 if(vtitle.Contains("cosmics")) {
2291 runVertexFinderTracks=kFALSE;
2295 if (runVertexFinderTracks) {
2296 // TPC + ITS primary vertex
2297 ftVertexer->SetITSMode();
2298 ftVertexer->SetConstraintOff();
2299 // get cuts for vertexer from AliGRPRecoParam
2300 Bool_t constrSPD=kFALSE;
2302 Int_t nCutsVertexer = grpRecoParam->GetVertexerTracksNCuts();
2303 Double_t *cutsVertexer = new Double_t[nCutsVertexer];
2304 grpRecoParam->GetVertexerTracksCutsITS(cutsVertexer,nCutsVertexer);
2305 ftVertexer->SetCuts(cutsVertexer,nCutsVertexer);
2306 delete [] cutsVertexer; cutsVertexer = NULL;
2307 if(grpRecoParam->GetVertexerTracksConstraintITS()) {
2308 if(fDiamondProfile && fDiamondProfile->GetXRes()<kRadius){
2309 ftVertexer->SetVtxStart(fDiamondProfile); // apply constraint only if sigmax is smaller than the beam pipe radius
2311 if(fDiamondProfileSPD && fDiamondProfileSPD->GetXRes()<kRadius){
2312 ftVertexer->SetVtxStart(fDiamondProfileSPD);
2318 AliESDVertex *pvtx=ftVertexer->FindPrimaryVertex(fesd);
2321 TString title=pvtx->GetTitle();
2322 title.Append("SPD");
2323 pvtx->SetTitle(title);
2325 if (pvtx->GetStatus()) {
2326 fesd->SetPrimaryVertexTracks(pvtx);
2327 for (Int_t i=0; i<ntracks; i++) {
2328 AliESDtrack *t = fesd->GetTrack(i);
2329 Double_t x[3]; t->GetXYZ(x);
2330 Double_t b[3]; AliTracker::GetBxByBz(x,b);
2331 t->RelateToVertexBxByBz(pvtx, b, kVeryBig);
2334 delete pvtx; pvtx=NULL;
2336 AliSysInfo::AddStamp(Form("VtxTrk_%d",iEvent), 0,0,iEvent);
2338 // TPC-only primary vertex
2339 ftVertexer->SetTPCMode();
2340 ftVertexer->SetConstraintOff();
2341 // get cuts for vertexer from AliGRPRecoParam
2343 Int_t nCutsVertexer = grpRecoParam->GetVertexerTracksNCuts();
2344 Double_t *cutsVertexer = new Double_t[nCutsVertexer];
2345 grpRecoParam->GetVertexerTracksCutsTPC(cutsVertexer,nCutsVertexer);
2346 ftVertexer->SetCuts(cutsVertexer,nCutsVertexer);
2347 delete [] cutsVertexer; cutsVertexer = NULL;
2348 if(fDiamondProfileTPC && grpRecoParam->GetVertexerTracksConstraintTPC()) {
2349 if(fDiamondProfileTPC->GetXRes()<kRadius) ftVertexer->SetVtxStart(fDiamondProfileTPC); // apply constraint only if sigmax is smaller than the beam pipe radius
2352 pvtx=ftVertexer->FindPrimaryVertex(&trkArray,selectedIdx);
2354 if (pvtx->GetStatus()) {
2355 fesd->SetPrimaryVertexTPC(pvtx);
2356 for (Int_t i=0; i<ntracks; i++) {
2357 AliESDtrack *t = fesd->GetTrack(i);
2358 Double_t x[3]; t->GetXYZ(x);
2359 Double_t b[3]; AliTracker::GetBxByBz(x,b);
2360 t->RelateToVertexTPCBxByBz(pvtx, b, kVeryBig);
2363 delete pvtx; pvtx=NULL;
2365 AliSysInfo::AddStamp(Form("VtxTPC_%d",iEvent), 0,0,iEvent);
2369 if(fDiamondProfile && fDiamondProfile->GetXRes()<kRadius) fesd->SetDiamond(fDiamondProfile);
2370 else fesd->SetDiamond(fDiamondProfileSPD);
2374 AliV0vertexer vtxer;
2375 // get cuts for V0vertexer from AliGRPRecoParam
2377 Int_t nCutsV0vertexer = grpRecoParam->GetVertexerV0NCuts();
2378 Double_t cutsV0vertexer[nCutsV0vertexer];
2379 grpRecoParam->GetVertexerV0Cuts(cutsV0vertexer);
2380 vtxer.SetCuts(cutsV0vertexer);
2382 vtxer.Tracks2V0vertices(fesd);
2383 AliSysInfo::AddStamp(Form("V0Finder_%d",iEvent), 0,0,iEvent);
2385 if (fRunCascadeFinder) {
2387 AliCascadeVertexer cvtxer;
2388 // get cuts for CascadeVertexer from AliGRPRecoParam
2390 Int_t nCutsCascadeVertexer = grpRecoParam->GetVertexerCascadeNCuts();
2391 Double_t cutsCascadeVertexer[nCutsCascadeVertexer];
2392 grpRecoParam->GetVertexerCascadeCuts(cutsCascadeVertexer);
2393 cvtxer.SetCuts(cutsCascadeVertexer);
2395 cvtxer.V0sTracks2CascadeVertices(fesd);
2396 AliSysInfo::AddStamp(Form("CascadeFinder_%d",iEvent), 0,0,iEvent);
2401 if (fReconstructor[3])
2402 GetReconstructor(3)->FillEventTimeWithTOF(fesd,fESDpid);
2405 // fESDpid->MakePID(fesd);
2407 if (fFillTriggerESD) {
2408 if (!FillTriggerESD(fesd)) {
2409 if (fStopOnError) {CleanUp(); return kFALSE;}
2412 // Always fill scalers
2413 if (!FillTriggerScalers(fesd)) {
2414 if (fStopOnError) {CleanUp(); return kFALSE;}
2417 AliSysInfo::AddStamp(Form("FillVaria_%d",iEvent), 0,0,iEvent);
2420 UInt_t specie = fesd->GetEventSpecie();
2421 Bool_t keepAll = (specie==AliRecoParam::kCosmic || specie==AliRecoParam::kCalib);
2422 if (fCleanESD && (!keepAll) ) {
2424 AliSysInfo::AddStamp(Form("CleanESD_%d",iEvent), 0,0,iEvent);
2427 // RS run updated trackleter: since we want to mark the clusters used by tracks and also mark the
2428 // tracks interpreted as primary, this step should be done in the very end, when full
2429 // ESD info is available (particulalry, V0s)
2431 if (fRunMultFinder) {
2432 if (!RunMultFinder(fesd)) {
2433 if (fStopOnError) {CleanUp(); return kFALSE;}
2435 AliSysInfo::AddStamp(Form("MultFinder_%d",iEvent), 0,0,iEvent);
2438 if (fRunQA && IsInTasks(AliQAv1::kESDS)) {
2439 AliQAManager::QAManager()->SetEventSpecie(fRecoParam.GetEventSpecie()) ;
2440 AliQAManager::QAManager()->RunOneEvent(fesd, fhltesd) ;
2441 AliSysInfo::AddStamp(Form("RunQA_%d",iEvent), 0,0,iEvent);
2444 AliQADataMaker *qadm = AliQAManager::QAManager()->GetQADataMaker(AliQAv1::kGLOBAL);
2446 qadm->SetEventSpecie(fRecoParam.GetEventSpecie()) ;
2447 if (qadm && IsInTasks(AliQAv1::kESDS))
2448 qadm->Exec(AliQAv1::kESDS, fesd);
2449 AliSysInfo::AddStamp(Form("RunGlobQA_%d",iEvent), 0,0,iEvent);
2452 // copy HLT decision from HLTesd to esd
2453 // the most relevant information is stored in a reduced container in the esd,
2454 // while the full information can be found in the HLTesd
2455 TObject* pHLTSrc=fhltesd->FindListObject(AliESDHLTDecision::Name());
2456 TObject* pHLTTgt=fesd->FindListObject(AliESDHLTDecision::Name());
2457 if (pHLTSrc && pHLTTgt) {
2458 pHLTSrc->Copy(*pHLTTgt);
2461 // Perform analysis of this event if requested
2462 // RS: Should be done before WriteESDfriend, since the latter may clean the esdfriend
2464 fRecoHandler->BeginEvent(iEvent);
2465 fAnalysis->ExecAnalysis();
2466 fRecoHandler->FinishEvent();
2467 AliSysInfo::AddStamp(Form("Analysis_%d",iEvent), 0,0,iEvent);
2470 if (fWriteESDfriend) {
2471 fesd->GetESDfriend(fesdf);
2472 AliSysInfo::AddStamp(Form("CreateFriend_%d",iEvent), 0,0,iEvent);
2477 nbf = ftree->Fill();
2478 if (fTreeBuffSize>0 && ftree->GetAutoFlush()<0 && (fMemCountESD += nbf)>fTreeBuffSize ) { // default limit is still not reached
2479 nbf = ftree->GetZipBytes();
2480 if (nbf>0) nbf = -nbf;
2481 else nbf = ftree->GetEntries();
2482 ftree->SetAutoFlush(nbf);
2483 AliInfo(Form("Calling ftree->SetAutoFlush(%lld) | W:%lld T:%lld Z:%lld",
2484 nbf,fMemCountESD,ftree->GetTotBytes(),ftree->GetZipBytes()));
2486 AliSysInfo::AddStamp(Form("ESDFill_%d",iEvent), 0,0,iEvent);
2488 if (fWriteESDfriend) {
2490 AliSysInfo::AddStamp(Form("WriteFriend_%d",iEvent), 0,0,iEvent);
2494 // Auto-save the ESD tree in case of prompt reco @P2
2495 if (fRawReader && fRawReader->UseAutoSaveESD()) {
2496 ftree->AutoSave("SaveSelf");
2497 if (fWriteESDfriend) ftreeF->AutoSave("SaveSelf");
2501 nbf = fhlttree->Fill();
2502 if (fTreeBuffSize>0 && fhlttree->GetAutoFlush()<0 && (fMemCountESDHLT += nbf)>fTreeBuffSize ) { // default limit is still not reached
2503 nbf = fhlttree->GetZipBytes();
2504 if (nbf>0) nbf = -nbf;
2505 else nbf = fhlttree->GetEntries();
2506 fhlttree->SetAutoFlush(nbf);
2507 AliInfo(Form("Calling fhlttree->SetAutoFlush(%lld) | W:%lld T:%lld Z:%lld",
2508 nbf,fMemCountESDHLT,fhlttree->GetTotBytes(),fhlttree->GetZipBytes()));
2511 gSystem->GetProcInfo(&procInfo);
2512 Long_t dMres=(procInfo.fMemResident-oldMres)/1024;
2513 Long_t dMvir=(procInfo.fMemVirtual-oldMvir)/1024;
2514 Float_t dCPU=procInfo.fCpuUser+procInfo.fCpuSys-oldCPU;
2515 aveDMres+=(dMres-aveDMres)/(iEvent-fFirstEvent+1);
2516 aveDMvir+=(dMvir-aveDMvir)/(iEvent-fFirstEvent+1);
2517 aveDCPU+=(dCPU-aveDCPU)/(iEvent-fFirstEvent+1);
2518 AliInfo(Form("======================= End Event %d: Res %ld(%3ld <%3ld>) Vir %ld(%3ld <%3ld>) CPU %5.2f <%5.2f> ===================",
2519 iEvent, procInfo.fMemResident/1024, dMres, aveDMres, procInfo.fMemVirtual/1024, dMvir, aveDMvir, dCPU, aveDCPU));
2520 oldMres=procInfo.fMemResident;
2521 oldMvir=procInfo.fMemVirtual;
2522 oldCPU=procInfo.fCpuUser+procInfo.fCpuSys;
2528 void AliReconstruction::CleanProcessedEvent()
2533 if (fWriteESDfriend) {
2534 fesdf->~AliESDfriend();
2535 new (fesdf) AliESDfriend(); // Reset...
2538 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
2539 if (fReconstructor[iDet]) fReconstructor[iDet]->FinishEvent();
2542 AliInfo("======================= End Event ===================");
2545 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
2546 if (fReconstructor[iDet]) {
2547 fReconstructor[iDet]->SetRecoParam(NULL);
2548 fReconstructor[iDet]->SetEventInfo(NULL);
2550 if (fTracker[iDet]) fTracker[iDet]->SetEventInfo(NULL);
2553 if (fRunQA || fRunGlobalQA)
2554 AliQAManager::QAManager()->Increment() ;
2556 DeleteRecPoints(fDeleteRecPoints);
2557 DeleteDigits(fDeleteDigits);
2562 //_____________________________________________________________________________
2563 void AliReconstruction::SlaveTerminate()
2565 // Finalize the run on the slave side
2566 // Called after the exit
2567 // from the event loop
2568 AliCodeTimerAuto("",0);
2569 // If analysis was done during reconstruction, we need to call SlaveTerminate for it
2571 fAnalysis->PackOutput(fOutput);
2572 fAnalysis->SetSkipTerminate(kTRUE);
2573 fAnalysis->Terminate();
2576 if (fIsNewRunLoader) { // galice.root didn't exist
2577 fRunLoader->WriteHeader("OVERWRITE");
2578 fRunLoader->WriteTrigger("OVERWRITE");
2579 fRunLoader->CdGAFile();
2580 fRunLoader->Write(0, TObject::kOverwrite);
2583 const TMap *cdbMap = AliCDBManager::Instance()->GetStorageMap();
2584 const TList *cdbList = AliCDBManager::Instance()->GetRetrievedIds();
2586 TMap *cdbMapCopy = new TMap(cdbMap->GetEntries());
2587 cdbMapCopy->SetOwner(1);
2588 cdbMapCopy->SetName("cdbMap");
2589 TIter iter(cdbMap->GetTable());
2592 while((pair = dynamic_cast<TPair*> (iter.Next()))){
2593 TObjString* keyStr = dynamic_cast<TObjString*> (pair->Key());
2594 TObjString* valStr = dynamic_cast<TObjString*> (pair->Value());
2595 if (keyStr && valStr)
2596 cdbMapCopy->Add(new TObjString(keyStr->GetName()), new TObjString(valStr->GetName()));
2599 TList *cdbListCopy = new TList();
2600 cdbListCopy->SetOwner(1);
2601 cdbListCopy->SetName("cdbList");
2603 TIter iter2(cdbList);
2606 while((id = dynamic_cast<AliCDBId*> (iter2.Next()))){
2607 cdbListCopy->Add(new TObjString(id->ToString().Data()));
2610 ftree->GetUserInfo()->Add(cdbMapCopy);
2611 ftree->GetUserInfo()->Add(cdbListCopy);
2613 // Add the AliRoot version that created this file
2614 TString sVersion("aliroot ");
2615 sVersion += ALIROOT_BRANCH;
2617 sVersion += ALIROOT_REVISION;
2618 sVersion += "; root ";
2619 #ifdef ROOT_SVN_BRANCH
2620 sVersion += ROOT_SVN_BRANCH;
2621 #elif defined(ROOT_GIT_BRANCH)
2622 sVersion += ROOT_GIT_BRANCH;
2627 #ifdef ROOT_SVN_REVSION
2628 sVersion += ROOT_SVN_REVISION;
2629 #elif defined(ROOT_GIT_COMMIT)
2630 sVersion += ROOT_GIT_COMMIT;
2634 sVersion += "; metadata ";
2635 sVersion += getenv("PRODUCTION_METADATA");
2638 TNamed * alirootVersion = new TNamed("alirootVersion",sVersion.Data());
2639 ftree->GetUserInfo()->Add(alirootVersion); // The list becomes owner of alirootVersion
2643 // we want to have only one tree version number
2644 ftree->Write(ftree->GetName(),TObject::kOverwrite);
2645 fhlttree->Write(fhlttree->GetName(),TObject::kOverwrite);
2647 if (fWriteESDfriend) {
2649 ftreeF->Write(ftreeF->GetName(),TObject::kOverwrite);
2652 // Finish with Plane Efficiency evaluation: before of CleanUp !!!
2653 if (fRunPlaneEff && !FinishPlaneEff()) {
2654 AliWarning("Finish PlaneEff evaluation failed");
2657 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
2658 if (fReconstructor[iDet]) fReconstructor[iDet]->Terminate();
2660 // End of cycle for the in-loop
2662 if (fRunQA || fRunGlobalQA) {
2663 AliQAManager::QAManager()->EndOfCycle() ;
2665 !fProofOutputLocation.IsNull() &&
2666 fProofOutputArchive.IsNull() &&
2667 !fProofOutputDataset) {
2668 TString qaOutputFile(Form("%sMerged.%s.Data.root",
2669 fProofOutputLocation.Data(),
2670 AliQAv1::GetQADataFileName()));
2671 TProofOutputFile *qaProofFile = new TProofOutputFile(Form("Merged.%s.Data.root",
2672 AliQAv1::GetQADataFileName()));
2673 qaProofFile->SetOutputFileName(qaOutputFile.Data());
2674 if (AliDebugLevel() > 0) qaProofFile->Dump();
2675 fOutput->Add(qaProofFile);
2676 MergeQA(qaProofFile->GetFileName());
2687 if (!fProofOutputFileName.IsNull() &&
2688 !fProofOutputLocation.IsNull() &&
2689 fProofOutputDataset &&
2690 !fProofOutputArchive.IsNull()) {
2691 TProofOutputFile *zipProofFile = new TProofOutputFile(fProofOutputFileName.Data(),
2693 fProofOutputLocation.Data());
2694 if (AliDebugLevel() > 0) zipProofFile->Dump();
2695 fOutput->Add(zipProofFile);
2696 TString fileList(fProofOutputArchive.Data());
2697 fileList.ReplaceAll(","," ");
2699 #if ROOT_SVN_REVISION >= 30174
2700 command.Form("zip -n root %s/%s %s",zipProofFile->GetDir(kTRUE),zipProofFile->GetFileName(),fileList.Data());
2702 command.Form("zip -n root %s/%s %s",zipProofFile->GetDir(),zipProofFile->GetFileName(),fileList.Data());
2704 AliInfo(Form("Executing: %s",command.Data()));
2705 gSystem->Exec(command.Data());
2710 //_____________________________________________________________________________
2711 void AliReconstruction::Terminate()
2713 // Create tags for the events in the ESD tree (the ESD tree is always present)
2714 // In case of empty events the tags will contain dummy values
2715 AliCodeTimerAuto("",0);
2717 // Do not call the ESD tag creator in case of PROOF-based reconstruction
2719 AliESDTagCreator *esdtagCreator = new AliESDTagCreator();
2720 esdtagCreator->CreateESDTags(fFirstEvent,fLastEvent,fGRPData, AliQAv1::Instance()->GetQA(), AliQAv1::Instance()->GetEventSpecies(), AliQAv1::kNDET, AliRecoParam::kNSpecies);
2721 delete esdtagCreator;
2724 // Cleanup of CDB manager: cache and active storages!
2725 AliCDBManager::Instance()->ClearCache();
2728 //_____________________________________________________________________________
2729 Bool_t AliReconstruction::RunLocalEventReconstruction(const TString& detectors)
2731 // run the local reconstruction
2733 static Int_t eventNr=0;
2734 AliCodeTimerAuto("",0)
2736 TString detStr = detectors;
2737 // execute HLT reconstruction first since other detector reconstruction
2738 // might depend on HLT data
2739 // key 'HLT' is removed from detStr by IsSelected
2740 if (IsSelected("HLT", detStr)) {
2741 AliReconstructor* reconstructor = GetReconstructor(kNDetectors-1);
2742 if (reconstructor) {
2743 // there is no AliLoader for HLT, see
2744 // https://savannah.cern.ch/bugs/?35473
2745 AliInfo("running reconstruction for HLT");
2747 AliInfo("reconstructor->Reconstruct(fRawReader, NULL)");
2748 reconstructor->Reconstruct(fRawReader, NULL);
2751 AliInfo("reconstructor->Reconstruct(dummy, NULL)");
2753 reconstructor->Reconstruct(dummy, NULL);
2756 AliSysInfo::AddStamp(Form("LRecHLT_%d",eventNr), -1,1,eventNr);
2759 AliInfo(Form("kNDetectors = %d",kNDetectors));
2761 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
2762 if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
2763 AliDebug(1, Form("Detector: %s", fgkDetectorName[iDet]));
2764 AliReconstructor* reconstructor = GetReconstructor(iDet);
2765 if (!reconstructor) continue;
2766 AliLoader* loader = fLoader[iDet];
2768 AliWarning(Form("No loader is defined for %s!",fgkDetectorName[iDet]));
2771 // conversion of digits
2772 if (fRawReader && reconstructor->HasDigitConversion()) {
2773 AliInfo(Form("converting raw data digits into root objects for %s",
2774 fgkDetectorName[iDet]));
2775 // AliCodeTimerAuto(Form("converting raw data digits into root objects for %s",
2776 // fgkDetectorName[iDet]),0);
2777 loader->LoadDigits("update");
2778 loader->CleanDigits();
2779 loader->MakeDigitsContainer();
2780 TTree* digitsTree = loader->TreeD();
2781 reconstructor->ConvertDigits(fRawReader, digitsTree);
2782 loader->WriteDigits("OVERWRITE");
2783 loader->UnloadDigits();
2785 // local reconstruction
2786 AliInfo(Form("running reconstruction for %s", fgkDetectorName[iDet]));
2787 //AliCodeTimerAuto(Form("running reconstruction for %s", fgkDetectorName[iDet]),0);
2788 AliDebug(1, "Loading Rec Points");
2789 loader->LoadRecPoints("update");
2790 AliDebug(1, "Cleaning Rec Points");
2791 loader->CleanRecPoints();
2792 AliDebug(1, "Making Rec Points Container");
2793 loader->MakeRecPointsContainer();
2794 TTree* clustersTree = loader->TreeR();
2795 if (fRawReader && !reconstructor->HasDigitConversion()) {
2796 reconstructor->Reconstruct(fRawReader, clustersTree);
2799 AliDebug(1, "Loading Digits");
2800 loader->LoadDigits("read");
2801 TTree* digitsTree = loader->TreeD();
2802 AliDebug(1, Form("Digits Tree = %p",digitsTree));
2804 AliError(Form("Can't get the %s digits tree", fgkDetectorName[iDet]));
2809 AliDebug(1, "Digits -> Clusters");
2810 reconstructor->Reconstruct(digitsTree, clustersTree);
2811 if (fRunQA && IsInTasks(AliQAv1::kDIGITSR)) {
2812 AliQAManager::QAManager()->SetEventSpecie(fRecoParam.GetEventSpecie()) ;
2813 AliQAManager::QAManager()->RunOneEventInOneDetector(iDet, digitsTree) ;
2816 loader->UnloadDigits();
2818 if (fRunQA && IsInTasks(AliQAv1::kRECPOINTS)) {
2819 AliQAManager::QAManager()->SetEventSpecie(fRecoParam.GetEventSpecie()) ;
2820 AliQAManager::QAManager()->RunOneEventInOneDetector(iDet, clustersTree) ;
2822 loader->WriteRecPoints("OVERWRITE");
2823 loader->UnloadRecPoints();
2824 AliSysInfo::AddStamp(Form("LRec%s_%d",fgkDetectorName[iDet],eventNr), iDet,1,eventNr);
2826 if (!IsSelected("CTP", detStr)) AliDebug(10,"No CTP");
2827 if ((detStr.CompareTo("ALL") != 0) && !detStr.IsNull()) {
2828 AliError(Form("the following detectors were not found: %s",
2836 //_____________________________________________________________________________
2837 Bool_t AliReconstruction::RunSPDTrackleting(AliESDEvent*& esd)
2839 // run the SPD trackleting (for SPD efficiency purpouses)
2841 AliCodeTimerAuto("",0)
2843 Double_t vtxPos[3] = {0, 0, 0};
2844 Double_t vtxErr[3] = {0.0, 0.0, 0.0};
2850 if (fRunLoader->GetHeader() && fRunLoader->GetHeader()->GenEventHeader()) {
2851 fRunLoader->GetHeader()->GenEventHeader()->PrimaryVertex(mcVertex);
2852 for (Int_t i = 0; i < 3; i++) vtxPos[i] = mcVertex[i];
2855 const AliESDVertex *vertex = esd->GetVertex();
2857 AliWarning("Vertex not found");
2860 vertex->GetXYZ(vtxPos);
2861 vertex->GetSigmaXYZ(vtxErr);
2862 if (fSPDTrackleter) {
2863 AliInfo("running the SPD Trackleter for Plane Efficiency Evaluation");
2866 fLoader[0]->LoadRecPoints("read");
2867 TTree* tree = fLoader[0]->TreeR();
2869 AliError("Can't get the ITS cluster tree");
2872 fSPDTrackleter->LoadClusters(tree);
2873 fSPDTrackleter->SetVertex(vtxPos, vtxErr);
2875 if (fSPDTrackleter->Clusters2Tracks(esd) != 0) {
2876 AliWarning("AliITSTrackleterSPDEff Clusters2Tracks failed");
2877 // fLoader[0]->UnloadRecPoints();
2880 //fSPDTrackleter->UnloadRecPoints();
2882 AliWarning("SPDTrackleter not available");
2888 //_____________________________________________________________________________
2889 Bool_t AliReconstruction::RunVertexFinder(AliESDEvent*& esd)
2891 // run the barrel tracking
2893 AliCodeTimerAuto("",0)
2895 AliVertexer *vertexer = CreateVertexer();
2896 if (!vertexer) return kFALSE;
2898 AliInfo(Form("running the ITS vertex finder: %s",vertexer->ClassName()));
2899 AliESDVertex* vertex = NULL;
2901 fLoader[0]->LoadRecPoints();
2902 TTree* cltree = fLoader[0]->TreeR();
2904 if(fDiamondProfileSPD) vertexer->SetVtxStart(fDiamondProfileSPD);
2905 vertex = vertexer->FindVertexForCurrentEvent(cltree);
2908 AliError("Can't get the ITS cluster tree");
2910 fLoader[0]->UnloadRecPoints();
2913 AliError("Can't get the ITS loader");
2916 AliWarning("Vertex not found");
2917 vertex = new AliESDVertex();
2918 vertex->SetName("default");
2921 vertex->SetName("reconstructed");
2926 vertex->GetXYZ(vtxPos);
2927 vertex->GetSigmaXYZ(vtxErr);
2929 esd->SetPrimaryVertexSPD(vertex);
2930 AliESDVertex *vpileup = NULL;
2931 Int_t novertices = 0;
2932 vpileup = vertexer->GetAllVertices(novertices);
2934 for (Int_t kk=1; kk<novertices; kk++)esd->AddPileupVertexSPD(&vpileup[kk]);
2937 // if SPD multiplicity has been determined, it is stored in the ESD
2938 AliMultiplicity *mult = vertexer->GetMultiplicity();
2939 if(mult)esd->SetMultiplicity(mult);
2941 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
2942 if (fTracker[iDet]) fTracker[iDet]->SetVertex(vtxPos, vtxErr);
2951 //_____________________________________________________________________________
2952 Bool_t AliReconstruction::RunMultFinder(AliESDEvent*& esd)
2954 // run the trackleter for multiplicity study
2956 AliCodeTimerAuto("",0)
2958 AliTrackleter *trackleter = CreateMultFinder();
2959 if (!trackleter) return kFALSE;
2961 AliInfo(Form("running the ITS multiplicity finder: %s",trackleter->ClassName()));
2964 fLoader[0]->LoadRecPoints();
2965 TTree* cltree = fLoader[0]->TreeR();
2967 trackleter->Reconstruct(esd,cltree);
2968 AliMultiplicity *mult = trackleter->GetMultiplicity();
2969 if(mult) esd->SetMultiplicity(mult);
2972 AliError("Can't get the ITS cluster tree");
2974 fLoader[0]->UnloadRecPoints();
2977 AliError("Can't get the ITS loader");
2985 //_____________________________________________________________________________
2986 Bool_t AliReconstruction::RunMuonTracking(AliESDEvent*& esd)
2988 // run the muon spectrometer tracking
2990 AliCodeTimerAuto("",0)
2993 AliError("Missing runLoader!");
2996 Int_t iDet = GetDetIndex("MUON"); // for MUON
2998 // Get a pointer to the MUON reconstructor
2999 AliReconstructor *reconstructor = GetReconstructor(iDet);
3000 if (!reconstructor) return kFALSE;
3003 TString detName = fgkDetectorName[iDet];
3004 AliDebug(1, Form("%s tracking", detName.Data()));
3005 AliTracker *tracker = reconstructor->CreateTracker();
3007 AliWarning(Form("couldn't create a tracker for %s", detName.Data()));
3012 fLoader[iDet]->LoadRecPoints("read");
3014 tracker->LoadClusters(fLoader[iDet]->TreeR());
3016 Int_t rv = tracker->Clusters2Tracks(esd);
3018 fLoader[iDet]->UnloadRecPoints();
3020 tracker->UnloadClusters();
3024 AliError(Form("%s Clusters2Tracks failed", fgkDetectorName[iDet]));
3032 //_____________________________________________________________________________
3033 Bool_t AliReconstruction::RunMFTTrackingMU(AliESDEvent*& esd) {
3037 // run the global muon tracking: matching the MUON tracks with the MFT clusters
3039 AliCodeTimerAuto("",0)
3042 AliError("Missing runLoader!");
3045 Int_t iDet = GetDetIndex("MFT"); // for MFT
3047 // Get a pointer to the MFT reconstructor
3048 AliReconstructor *reconstructor = GetReconstructor(iDet);
3049 if (!reconstructor) return kFALSE;
3051 TString detName = fgkDetectorName[iDet];
3052 AliDebug(1, Form("%s tracking for muon tracks", detName.Data()));
3053 AliTracker *tracker = reconstructor->CreateTracker();
3055 AliWarning(Form("couldn't create a Muon tracker for %s", detName.Data()));
3060 fLoader[iDet]->LoadRecPoints("read");
3062 tracker->LoadClusters(fLoader[iDet]->TreeR());
3064 Int_t rv = tracker->Clusters2Tracks(esd);
3066 fLoader[iDet]->UnloadRecPoints();
3068 tracker->UnloadClusters();
3071 AliError(Form("%s Clusters2Tracks failed", fgkDetectorName[iDet]));
3079 //_____________________________________________________________________________
3080 Bool_t AliReconstruction::RunTracking(AliESDEvent*& esd,AliESDpid &PID)
3082 // run the barrel tracking
3083 static Int_t eventNr=0;
3084 AliCodeTimerAuto("",0)
3086 AliInfo("running tracking");
3088 // Set the event info which is used
3089 // by the trackers in order to obtain
3090 // information about read-out detectors,
3092 AliDebug(1, "Setting event info");
3093 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
3094 if (!fTracker[iDet]) continue;
3095 fTracker[iDet]->SetEventInfo(&fEventInfo);
3098 //Fill the ESD with the T0 info (will be used by the TOF)
3099 if (fReconstructor[11] && fLoader[11]) {
3100 fLoader[11]->LoadRecPoints("READ");
3101 TTree *treeR = fLoader[11]->TreeR();
3103 GetReconstructor(11)->FillESD((TTree *)NULL,treeR,esd);
3107 // pass 1: TPC + ITS inwards
3108 for (Int_t iDet = 1; iDet >= 0; iDet--) {
3109 if (!fTracker[iDet]) continue;
3110 AliDebug(1, Form("%s tracking", fgkDetectorName[iDet]));
3113 fLoader[iDet]->LoadRecPoints("read");
3114 AliSysInfo::AddStamp(Form("RLoadCluster%s_%d",fgkDetectorName[iDet],eventNr),iDet,1, eventNr);
3115 TTree* tree = fLoader[iDet]->TreeR();
3117 AliError(Form("Can't get the %s cluster tree", fgkDetectorName[iDet]));
3120 fTracker[iDet]->LoadClusters(tree);
3121 AliSysInfo::AddStamp(Form("TLoadCluster%s_%d",fgkDetectorName[iDet],eventNr), iDet,2, eventNr);
3123 if (fTracker[iDet]->Clusters2TracksHLT(esd, fhltesd) != 0) {
3124 AliError(Form("%s Clusters2Tracks failed", fgkDetectorName[iDet]));
3127 AliSysInfo::AddStamp(Form("Tracking0%s_%d",fgkDetectorName[iDet],eventNr), iDet,3,eventNr);
3128 // preliminary PID in TPC needed by the ITS tracker
3130 GetReconstructor(1)->FillESD((TTree*)NULL, (TTree*)NULL, esd);
3131 PID.MakePIDForTracking(esd);
3132 AliSysInfo::AddStamp(Form("MakePID0%s_%d",fgkDetectorName[iDet],eventNr), iDet,4,eventNr);
3136 // pass 2: ALL backwards
3138 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
3139 if (!fTracker[iDet]) continue;
3140 AliDebug(1, Form("%s back propagation", fgkDetectorName[iDet]));
3143 if (iDet > 1) { // all except ITS, TPC
3145 fLoader[iDet]->LoadRecPoints("read");
3146 AliSysInfo::AddStamp(Form("RLoadCluster0%s_%d",fgkDetectorName[iDet],eventNr), iDet,1, eventNr);
3147 tree = fLoader[iDet]->TreeR();
3149 AliError(Form("Can't get the %s cluster tree", fgkDetectorName[iDet]));
3152 fTracker[iDet]->LoadClusters(tree);
3153 AliSysInfo::AddStamp(Form("TLoadCluster0%s_%d",fgkDetectorName[iDet],eventNr), iDet,2, eventNr);
3157 if (iDet>1) // start filling residuals for the "outer" detectors
3159 AliTracker::SetFillResiduals(fRecoParam.GetEventSpecie(), kTRUE);
3160 TObjArray ** arr = AliTracker::GetResidualsArray() ;
3162 AliRecoParam::EventSpecie_t es=fRecoParam.GetEventSpecie();
3163 TObjArray * elem = arr[AliRecoParam::AConvert(es)];
3164 if ( elem && (! elem->At(0)) ) {
3165 AliQADataMaker *qadm = AliQAManager::QAManager()->GetQADataMaker(AliQAv1::kGLOBAL);
3166 if (qadm) qadm->InitRecPointsForTracker() ;
3169 // AliSysInfo::AddStamp(Form("QAInitResid%s_%d",fgkDetectorName[iDet],eventNr), iDet,0, eventNr);
3171 if (fTracker[iDet]->PropagateBack(esd) != 0) {
3172 AliError(Form("%s backward propagation failed", fgkDetectorName[iDet]));
3175 AliSysInfo::AddStamp(Form("Tracking1%s_%d",fgkDetectorName[iDet],eventNr), iDet,3, eventNr);
3178 if (iDet > 3) { // all except ITS, TPC, TRD and TOF
3179 fTracker[iDet]->UnloadClusters();
3180 fLoader[iDet]->UnloadRecPoints();
3182 // updated PID in TPC needed by the ITS tracker -MI
3184 //GetReconstructor(1)->FillESD((TTree*)NULL, (TTree*)NULL, esd);
3185 //AliESDpid::MakePID(esd);
3186 PID.MakePIDForTracking(esd);
3187 AliSysInfo::AddStamp(Form("MakePID1%s_%d",fgkDetectorName[iDet],eventNr), iDet,4,eventNr);
3191 //stop filling residuals for the "outer" detectors
3192 if (fRunGlobalQA) AliTracker::SetFillResiduals(fRecoParam.GetEventSpecie(), kFALSE);
3194 // pass 3: TRD + TPC + ITS refit inwards
3196 for (Int_t iDet = 2; iDet >= 0; iDet--) {
3197 if (!fTracker[iDet]) continue;
3198 AliDebug(1, Form("%s inward refit", fgkDetectorName[iDet]));
3201 if (iDet<2) // start filling residuals for TPC and ITS
3203 AliTracker::SetFillResiduals(fRecoParam.GetEventSpecie(), kTRUE);
3204 TObjArray ** arr = AliTracker::GetResidualsArray() ;
3206 AliRecoParam::EventSpecie_t es=fRecoParam.GetEventSpecie();
3207 TObjArray * elem = arr[AliRecoParam::AConvert(es)];
3208 if ( elem && (! elem->At(0)) ) {
3209 AliQADataMaker *qadm = AliQAManager::QAManager()->GetQADataMaker(AliQAv1::kGLOBAL);
3210 if (qadm) qadm->InitRecPointsForTracker() ;
3215 if (fTracker[iDet]->RefitInward(esd) != 0) {
3216 AliError(Form("%s inward refit failed", fgkDetectorName[iDet]));
3219 // run postprocessing
3220 if (fTracker[iDet]->PostProcess(esd) != 0) {
3221 AliError(Form("%s postprocessing failed", fgkDetectorName[iDet]));
3224 AliSysInfo::AddStamp(Form("Tracking2%s_%d",fgkDetectorName[iDet],eventNr), iDet,3, eventNr);
3227 // write space-points to the ESD in case alignment data output
3229 if (fWriteAlignmentData) {
3230 WriteAlignmentData(esd);
3231 AliSysInfo::AddStamp(Form("WrtAlignData_%d",eventNr), 0,0, eventNr);
3234 for (Int_t iDet = 3; iDet >= 0; iDet--) {
3235 if (!fTracker[iDet]) continue;
3237 fTracker[iDet]->UnloadClusters();
3238 AliSysInfo::AddStamp(Form("TUnloadCluster%s_%d",fgkDetectorName[iDet],eventNr), iDet,4, eventNr);
3239 fLoader[iDet]->UnloadRecPoints();
3240 AliSysInfo::AddStamp(Form("RUnloadCluster%s_%d",fgkDetectorName[iDet],eventNr), iDet,5, eventNr);
3242 // stop filling residuals for TPC and ITS
3243 if (fRunGlobalQA) AliTracker::SetFillResiduals(fRecoParam.GetEventSpecie(), kFALSE);
3249 //_____________________________________________________________________________
3250 Bool_t AliReconstruction::CleanESD(AliESDEvent *esd){
3252 // Remove the data which are not needed for the physics analysis.
3255 Int_t nTracks=esd->GetNumberOfTracks();
3256 Int_t nV0s=esd->GetNumberOfV0s();
3258 (Form("Number of ESD tracks and V0s before cleaning: %d %d",nTracks,nV0s));
3260 Float_t cleanPars[]={fV0DCAmax,fV0CsPmin,fDmax,fZmax};
3261 Bool_t rc=esd->Clean(cleanPars);
3263 nTracks=esd->GetNumberOfTracks();
3264 nV0s=esd->GetNumberOfV0s();
3266 (Form("Number of ESD tracks and V0s after cleaning %d %d",nTracks,nV0s));
3271 //_____________________________________________________________________________
3272 Bool_t AliReconstruction::FillESD(AliESDEvent*& esd, const TString& detectors)
3274 // fill the event summary data
3276 AliCodeTimerAuto("",0)
3277 static Int_t eventNr=0;
3278 TString detStr = detectors;
3280 AliSysInfo::AddStamp(Form("FillESDb%d",eventNr), -19,-19, eventNr);
3281 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
3282 if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
3283 AliReconstructor* reconstructor = GetReconstructor(iDet);
3284 if (!reconstructor) continue;
3285 AliDebug(1, Form("filling ESD for %s", fgkDetectorName[iDet]));
3286 TTree* clustersTree = NULL;
3287 if (fLoader[iDet]) {
3288 fLoader[iDet]->LoadRecPoints("read");
3289 clustersTree = fLoader[iDet]->TreeR();
3290 if (!clustersTree) {
3291 AliError(Form("Can't get the %s clusters tree",
3292 fgkDetectorName[iDet]));
3293 if (fStopOnError) return kFALSE;
3296 if (fRawReader && !reconstructor->HasDigitConversion()) {
3297 reconstructor->FillESD(fRawReader, clustersTree, esd);
3299 TTree* digitsTree = NULL;
3300 if (fLoader[iDet]) {
3301 fLoader[iDet]->LoadDigits("read");
3302 digitsTree = fLoader[iDet]->TreeD();
3304 AliError(Form("Can't get the %s digits tree",
3305 fgkDetectorName[iDet]));
3306 if (fStopOnError) return kFALSE;
3309 reconstructor->FillESD(digitsTree, clustersTree, esd);
3310 if (fLoader[iDet]) fLoader[iDet]->UnloadDigits();
3312 if (fLoader[iDet]) {
3313 fLoader[iDet]->UnloadRecPoints();
3317 if (!IsSelected("CTP", detStr)) AliDebug(10,"No CTP");
3318 if ((detStr.CompareTo("ALL") != 0) && !detStr.IsNull()) {
3319 AliError(Form("the following detectors were not found: %s",
3321 if (fStopOnError) return kFALSE;
3323 AliSysInfo::AddStamp(Form("FillESDe%d",eventNr), -20,-20, eventNr);
3328 //_____________________________________________________________________________
3329 Bool_t AliReconstruction::FillTriggerESD(AliESDEvent*& esd)
3331 // Reads the trigger decision which is
3332 // stored in Trigger.root file and fills
3333 // the corresponding esd entries
3335 AliCodeTimerAuto("",0)
3337 AliInfo("Filling trigger information into the ESD");
3340 AliCTPRawStream input(fRawReader);
3341 if (!input.Next()) {
3342 AliWarning("No valid CTP (trigger) DDL raw data is found ! The trigger info is taken from the event header!");
3345 if (esd->GetTriggerMask() != input.GetClassMask())
3346 AliError(Form("Invalid trigger pattern found in CTP raw-data: %llx %llx",
3347 input.GetClassMask(),esd->GetTriggerMask()));
3348 if (esd->GetTriggerMaskNext50() != input.GetClassMaskNext50())
3349 AliError(Form("Invalid trigger pattern found in CTP raw-data Next50: %llx %llx",
3350 input.GetClassMaskNext50(),esd->GetTriggerMaskNext50()));
3351 if (esd->GetOrbitNumber() != input.GetOrbitID())
3352 AliError(Form("Invalid orbit id found in CTP raw-data: %x %x",
3353 input.GetOrbitID(),esd->GetOrbitNumber()));
3354 if (esd->GetBunchCrossNumber() != input.GetBCID())
3355 AliError(Form("Invalid bunch-crossing id found in CTP raw-data: %x %x",
3356 input.GetBCID(),esd->GetBunchCrossNumber()));
3357 AliESDHeader* esdheader = esd->GetHeader();
3358 esdheader->SetL0TriggerInputs(input.GetL0Inputs());
3359 esdheader->SetL1TriggerInputs(input.GetL1Inputs());
3360 esdheader->SetL2TriggerInputs(input.GetL2Inputs());
3362 // UInt_t orbit=input.GetOrbitID();
3363 for(Int_t i=0 ; i<input.GetNIRs() ; i++ ) {
3364 esdheader->AddTriggerIR(input.GetIR(i));
3366 AliCentralTrigger* rlCTP = fRunLoader->GetTrigger();
3368 rlCTP->SetL0TriggerInputs(input.GetL0Inputs());
3369 rlCTP->SetL1TriggerInputs(input.GetL1Inputs());
3370 rlCTP->SetL2TriggerInputs(input.GetL2Inputs());
3373 if (fIsNewRunLoader) fRunLoader->TreeCT()->Fill();
3377 //_____________________________________________________________________________
3378 Bool_t AliReconstruction::FillTriggerScalers(AliESDEvent*& esd)
3381 //fRunScalers->Print();
3382 if(fRunScalers && fRunScalers->CheckRunScalers()){
3383 AliTimeStamp* timestamp = new AliTimeStamp(esd->GetOrbitNumber(), esd->GetPeriodNumber(), esd->GetBunchCrossNumber());
3384 //AliTimeStamp* timestamp = new AliTimeStamp(10308000, 0, (ULong64_t)486238);
3385 AliESDHeader* esdheader = fesd->GetHeader();
3386 for(Int_t i=0;i<50;i++){
3387 if((1ull<<i) & esd->GetTriggerMask()){
3388 AliTriggerScalersESD* scalesd = fRunScalers->GetScalersForEventClass( timestamp, i+1);
3389 if(scalesd)esdheader->SetTriggerScalersRecord(scalesd);
3392 for(Int_t i=0;i<50;i++){
3393 if((1ull<<i) & esd->GetTriggerMaskNext50()){
3394 AliTriggerScalersESD* scalesd = fRunScalers->GetScalersForEventClass( timestamp, i+51);
3395 if(scalesd)esdheader->SetTriggerScalersRecord(scalesd);
3398 const AliTriggerScalersRecordESD* scalrecEvent = fRunScalers->GetScalersDeltaForEvent( timestamp);
3399 const AliTriggerScalersRecordESD* scalrecRun = fRunScalers->GetScalersDeltaForRun();
3400 if (scalrecEvent) esdheader->SetTriggerScalersDeltaEvent(scalrecEvent);
3401 if (scalrecRun) esdheader->SetTriggerScalersDeltaRun(scalrecRun);
3405 //_____________________________________________________________________________
3406 Bool_t AliReconstruction::FillRawEventHeaderESD(AliESDEvent*& esd)
3409 // Filling information from RawReader Header
3412 if (!fRawReader) return kFALSE;
3414 AliInfo("Filling information from RawReader Header");
3416 esd->SetBunchCrossNumber(fRawReader->GetBCID());
3417 esd->SetOrbitNumber(fRawReader->GetOrbitID());
3418 esd->SetPeriodNumber(fRawReader->GetPeriod());
3420 esd->SetTimeStamp(fRawReader->GetTimestamp());
3421 esd->SetEventType(fRawReader->GetType());
3427 //_____________________________________________________________________________
3428 Bool_t AliReconstruction::IsSelected(TString detName, TString& detectors) const
3430 // check whether detName is contained in detectors
3431 // if yes, it is removed from detectors
3433 // check if all detectors are selected
3434 if ((detectors.CompareTo("ALL") == 0) ||
3435 detectors.BeginsWith("ALL ") ||
3436 detectors.EndsWith(" ALL") ||
3437 detectors.Contains(" ALL ")) {
3442 // search for the given detector
3443 Bool_t result = kFALSE;
3444 if ((detectors.CompareTo(detName) == 0) ||
3445 detectors.BeginsWith(detName+" ") ||
3446 detectors.EndsWith(" "+detName) ||
3447 detectors.Contains(" "+detName+" ")) {
3448 detectors.ReplaceAll(detName, "");
3452 // clean up the detectors string
3453 while (detectors.Contains(" ")) detectors.ReplaceAll(" ", " ");
3454 while (detectors.BeginsWith(" ")) detectors.Remove(0, 1);
3455 while (detectors.EndsWith(" ")) detectors.Remove(detectors.Length()-1, 1);
3460 //_____________________________________________________________________________
3461 Bool_t AliReconstruction::InitRunLoader()
3463 // get or create the run loader
3465 if (gAlice) delete gAlice;
3468 TFile *gafile = TFile::Open(fGAliceFileName.Data());
3469 // if (!gSystem->AccessPathName(fGAliceFileName.Data())) { // galice.root exists
3470 if (gafile) { // galice.root exists
3474 // load all base libraries to get the loader classes
3475 TString libs = gSystem->GetLibraries();
3476 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
3477 TString detName = fgkDetectorName[iDet];
3478 if (libs.Contains("lib" + detName + "base.so")) continue;
3479 gSystem->Load("lib" + detName + "base");
3481 fRunLoader = AliRunLoader::Open(fGAliceFileName.Data());
3483 AliError(Form("no run loader found in file %s", fGAliceFileName.Data()));
3488 fRunLoader->CdGAFile();
3489 fRunLoader->LoadgAlice();
3491 //PH This is a temporary fix to give access to the kinematics
3492 //PH that is needed for the labels of ITS clusters
3493 fRunLoader->LoadHeader();
3494 fRunLoader->LoadKinematics();
3496 } else { // galice.root does not exist
3498 AliError(Form("the file %s does not exist", fGAliceFileName.Data()));
3500 fRunLoader = AliRunLoader::Open(fGAliceFileName.Data(),
3501 AliConfig::GetDefaultEventFolderName(),
3504 AliError(Form("could not create run loader in file %s",
3505 fGAliceFileName.Data()));
3509 fIsNewRunLoader = kTRUE;
3510 fRunLoader->MakeTree("E");
3511 fRunLoader->MakeTree("GG");
3513 if (fNumberOfEventsPerFile > 0)
3514 fRunLoader->SetNumberOfEventsPerFile(fNumberOfEventsPerFile);
3516 fRunLoader->SetNumberOfEventsPerFile((UInt_t)-1);
3522 //_____________________________________________________________________________
3523 AliReconstructor* AliReconstruction::GetReconstructor(Int_t iDet)
3525 // get the reconstructor object and the loader for a detector
3527 if (fReconstructor[iDet]) {
3528 if (fRecoParam.GetDetRecoParamArray(iDet) && !AliReconstructor::GetRecoParam(iDet)) {
3529 const AliDetectorRecoParam *par = fRecoParam.GetDetRecoParam(iDet);
3530 fReconstructor[iDet]->SetRecoParam(par);
3531 fReconstructor[iDet]->SetRunInfo(fRunInfo);
3533 return fReconstructor[iDet];
3536 // load the reconstructor object
3537 TPluginManager* pluginManager = gROOT->GetPluginManager();
3538 TString detName = fgkDetectorName[iDet];
3539 TString recName = "Ali" + detName + "Reconstructor";
3541 if (!fIsNewRunLoader && !fRunLoader->GetLoader(detName+"Loader") && (detName != "HLT")) return NULL;
3543 AliReconstructor* reconstructor = NULL;
3544 // first check if a plugin is defined for the reconstructor
3545 TPluginHandler* pluginHandler =
3546 pluginManager->FindHandler("AliReconstructor", detName);
3547 // if not, add a plugin for it
3548 if (!pluginHandler) {
3549 AliDebug(1, Form("defining plugin for %s", recName.Data()));
3550 TString libs = gSystem->GetLibraries();
3551 if (libs.Contains("lib" + detName + "base.so") ||
3552 (gSystem->Load("lib" + detName + "base") >= 0)) {
3553 pluginManager->AddHandler("AliReconstructor", detName,
3554 recName, detName + "rec", recName + "()");
3556 pluginManager->AddHandler("AliReconstructor", detName,
3557 recName, detName, recName + "()");
3559 pluginHandler = pluginManager->FindHandler("AliReconstructor", detName);
3561 if (pluginHandler && (pluginHandler->LoadPlugin() == 0)) {
3562 reconstructor = (AliReconstructor*) pluginHandler->ExecPlugin(0);
3565 // check if the upgrade reconstructor should be used instead of the standard one
3566 if(fUpgradeMask[iDet]) {
3567 if(reconstructor) delete reconstructor;
3568 TClass *cl = new TClass(Form("Ali%sUpgradeReconstructor",fgkDetectorName[iDet]));
3569 reconstructor = (AliReconstructor*)(cl->New());
3572 if (reconstructor) {
3573 TObject* obj = fOptions.FindObject(detName.Data());
3574 if (obj) reconstructor->SetOption(obj->GetTitle());
3575 reconstructor->SetRunInfo(fRunInfo);
3576 reconstructor->SetHLTESD(fhltesd);
3577 reconstructor->Init();
3578 fReconstructor[iDet] = reconstructor;
3581 // get or create the loader
3582 if (detName != "HLT") {
3583 fLoader[iDet] = fRunLoader->GetLoader(detName + "Loader");
3584 if (!fLoader[iDet]) {
3585 AliConfig::Instance()
3586 ->CreateDetectorFolders(fRunLoader->GetEventFolder(),
3588 // first check if a plugin is defined for the loader
3590 pluginManager->FindHandler("AliLoader", detName);
3591 // if not, add a plugin for it
3592 if (!pluginHandler) {
3593 TString loaderName = "Ali" + detName + "Loader";
3594 AliDebug(1, Form("defining plugin for %s", loaderName.Data()));
3595 pluginManager->AddHandler("AliLoader", detName,
3596 loaderName, detName + "base",
3597 loaderName + "(const char*, TFolder*)");
3598 pluginHandler = pluginManager->FindHandler("AliLoader", detName);
3600 if (pluginHandler && (pluginHandler->LoadPlugin() == 0)) {
3602 (AliLoader*) pluginHandler->ExecPlugin(2, detName.Data(),
3603 fRunLoader->GetEventFolder());
3605 if (!fLoader[iDet]) { // use default loader
3606 fLoader[iDet] = new AliLoader(detName, fRunLoader->GetEventFolder());
3608 if (!fLoader[iDet]) {
3609 AliWarning(Form("couldn't get loader for %s", detName.Data()));
3610 if (fStopOnError) return NULL;
3612 fRunLoader->AddLoader(fLoader[iDet]);
3613 fRunLoader->CdGAFile();
3614 if (gFile && !gFile->IsWritable()) gFile->ReOpen("UPDATE");
3615 fRunLoader->Write(0, TObject::kOverwrite);
3620 if (fRecoParam.GetDetRecoParamArray(iDet) && !AliReconstructor::GetRecoParam(iDet)) {
3621 const AliDetectorRecoParam *par = fRecoParam.GetDetRecoParam(iDet);
3622 if (reconstructor) {
3623 reconstructor->SetRecoParam(par);
3624 reconstructor->SetRunInfo(fRunInfo);
3627 return reconstructor;
3630 //_____________________________________________________________________________
3631 AliVertexer* AliReconstruction::CreateVertexer()
3633 // create the vertexer
3634 // Please note that the caller is the owner of the
3637 AliVertexer* vertexer = NULL;
3638 AliReconstructor* itsReconstructor = GetReconstructor(0);
3639 if (itsReconstructor && ((fRunLocalReconstruction.Contains("ITS")) ||
3640 fRunTracking.Contains("ITS") || fFillESD.Contains("ITS") )) {
3641 vertexer = itsReconstructor->CreateVertexer();
3644 AliWarning("couldn't create a vertexer for ITS");
3650 //_____________________________________________________________________________
3651 AliTrackleter* AliReconstruction::CreateMultFinder()
3653 // create the ITS trackleter for mult. estimation
3654 // Please note that the caller is the owner of the
3657 AliTrackleter* trackleter = NULL;
3658 AliReconstructor* itsReconstructor = GetReconstructor(0);
3659 if (itsReconstructor && ((fRunLocalReconstruction.Contains("ITS")) ||
3660 fRunTracking.Contains("ITS") || fFillESD.Contains("ITS") )) {
3661 trackleter = itsReconstructor->CreateMultFinder();
3664 AliWarning("ITS is not in reconstruction, switching off RunMultFinder");
3665 fRunMultFinder = kFALSE;
3671 //_____________________________________________________________________________
3672 Bool_t AliReconstruction::CreateTrackers(const TString& detectors)
3674 // create the trackers
3675 AliInfo("Creating trackers");
3677 TString detStr = detectors;
3678 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
3679 if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
3680 AliReconstructor* reconstructor = GetReconstructor(iDet);
3681 if (!reconstructor) continue;
3682 TString detName = fgkDetectorName[iDet];
3683 if (detName == "MUON") {
3684 fRunMuonTracking = kTRUE;
3687 if (detName == "MFT") { // AU
3688 fRunMFTTrackingMU = kTRUE; // AU
3692 fTracker[iDet] = reconstructor->CreateTracker();
3693 if (!fTracker[iDet] && (iDet < 7)) {
3694 AliWarning(Form("couldn't create a tracker for %s", detName.Data()));
3695 if (fStopOnError) return kFALSE;
3697 AliSysInfo::AddStamp(Form("LTracker%s",fgkDetectorName[iDet]), iDet,0);
3703 //_____________________________________________________________________________
3704 void AliReconstruction::CleanUp()
3706 // delete trackers and the run loader and close and delete the file
3707 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
3708 if (fReconstructor[iDet]) fReconstructor[iDet]->SetRecoParam(NULL);
3709 delete fReconstructor[iDet];
3710 fReconstructor[iDet] = NULL;
3711 fLoader[iDet] = NULL;
3712 delete fTracker[iDet];
3713 fTracker[iDet] = NULL;
3719 delete fSPDTrackleter;
3720 fSPDTrackleter = NULL;
3729 delete fParentRawReader;
3730 fParentRawReader=NULL;
3741 if (AliQAManager::QAManager())
3742 AliQAManager::QAManager()->ShowQA() ;
3743 // AliQAManager::Destroy() ;
3748 void AliReconstruction::WriteAlignmentData(AliESDEvent* esd)
3750 // Write space-points which are then used in the alignment procedures
3751 // For the moment only ITS, TPC, TRD and TOF
3753 Int_t ntracks = esd->GetNumberOfTracks();
3754 for (Int_t itrack = 0; itrack < ntracks; itrack++)
3756 AliESDtrack *track = esd->GetTrack(itrack);
3759 for (Int_t i=0; i<200; ++i) idx[i] = -1; //PH avoid uninitialized values
3760 for (Int_t iDet = 5; iDet >= 0; iDet--) {// TOF, TRD, TPC, ITS clusters
3761 nsp += (iDet==GetDetIndex("TRD")) ? track->GetTRDntracklets():track->GetNcls(iDet);
3763 if (iDet==GetDetIndex("ITS")) { // ITS "extra" clusters
3764 track->GetClusters(iDet,idx);
3765 for (Int_t i=6; i<12; i++) if(idx[i] >= 0) nsp++;
3770 AliTrackPointArray *sp = new AliTrackPointArray(nsp);
3771 track->SetTrackPointArray(sp);
3773 for (Int_t iDet = 5; iDet >= 0; iDet--) {
3774 AliTracker *tracker = fTracker[iDet];
3775 if (!tracker) continue;
3776 Int_t nspdet = (iDet==GetDetIndex("TRD")) ? track->GetTRDtracklets(idx):track->GetClusters(iDet,idx);
3778 if (iDet==GetDetIndex("ITS")) // ITS "extra" clusters
3779 for (Int_t i=6; i<12; i++) if(idx[i] >= 0) nspdet++;
3781 if (nspdet <= 0) continue;
3785 while (isp2 < nspdet) {
3786 Bool_t isvalid=kTRUE;
3788 Int_t index=idx[isp++];
3789 if (index < 0) continue;
3791 TString dets = fgkDetectorName[iDet];
3792 if ((fUseTrackingErrorsForAlignment.CompareTo(dets) == 0) ||
3793 fUseTrackingErrorsForAlignment.BeginsWith(dets+" ") ||
3794 fUseTrackingErrorsForAlignment.EndsWith(" "+dets) ||
3795 fUseTrackingErrorsForAlignment.Contains(" "+dets+" ")) {
3796 isvalid = tracker->GetTrackPointTrackingError(index,p,track);
3798 isvalid = tracker->GetTrackPoint(index,p);
3801 if (!isvalid) continue;
3802 if (iDet==GetDetIndex("ITS") && (isp-1)>=6) p.SetExtra();
3803 sp->AddPoint(isptrack,&p); isptrack++;
3810 //_____________________________________________________________________________
3811 void AliReconstruction::FillRawDataErrorLog(Int_t iEvent, AliESDEvent* esd)
3813 // The method reads the raw-data error log
3814 // accumulated within the rawReader.
3815 // It extracts the raw-data errors related to
3816 // the current event and stores them into
3817 // a TClonesArray inside the esd object.
3819 if (!fRawReader) return;
3821 for(Int_t i = 0; i < fRawReader->GetNumberOfErrorLogs(); i++) {
3823 AliRawDataErrorLog *log = fRawReader->GetErrorLog(i);
3825 if (iEvent != log->GetEventNumber()) continue;
3827 esd->AddRawDataErrorLog(log);
3832 //_____________________________________________________________________________
3833 // void AliReconstruction::CheckQA()
3835 // check the QA of SIM for this run and remove the detectors
3836 // with status Fatal
3838 // TString newRunLocalReconstruction ;
3839 // TString newRunTracking ;
3840 // TString newFillESD ;
3842 // for (Int_t iDet = 0; iDet < AliQAv1::kNDET; iDet++) {
3843 // TString detName(AliQAv1::GetDetName(iDet)) ;
3844 // AliQAv1 * qa = AliQAv1::Instance(AliQAv1::DETECTORINDEX_t(iDet)) ;
3845 // if ( qa->IsSet(AliQAv1::DETECTORINDEX_t(iDet), AliQAv1::kSIM, specie, AliQAv1::kFATAL)) {
3846 // AliInfo(Form("QA status for %s %s in Hits and/or SDIGITS and/or Digits was Fatal; No reconstruction performed",
3847 // detName.Data(), AliRecoParam::GetEventSpecieName(es))) ;
3849 // if ( fRunLocalReconstruction.Contains(AliQAv1::GetDetName(iDet)) ||
3850 // fRunLocalReconstruction.Contains("ALL") ) {
3851 // newRunLocalReconstruction += detName ;
3852 // newRunLocalReconstruction += " " ;
3854 // if ( fRunTracking.Contains(AliQAv1::GetDetName(iDet)) ||
3855 // fRunTracking.Contains("ALL") ) {
3856 // newRunTracking += detName ;
3857 // newRunTracking += " " ;
3859 // if ( fFillESD.Contains(AliQAv1::GetDetName(iDet)) ||
3860 // fFillESD.Contains("ALL") ) {
3861 // newFillESD += detName ;
3862 // newFillESD += " " ;
3866 // fRunLocalReconstruction = newRunLocalReconstruction ;
3867 // fRunTracking = newRunTracking ;
3868 // fFillESD = newFillESD ;
3871 //_____________________________________________________________________________
3872 Int_t AliReconstruction::GetDetIndex(const char* detector)
3874 // return the detector index corresponding to detector
3876 for (index = 0; index < kNDetectors ; index++) {
3877 if ( strcmp(detector, fgkDetectorName[index]) == 0 )
3882 //_____________________________________________________________________________
3883 Bool_t AliReconstruction::FinishPlaneEff() {
3885 // Here execute all the necessary operationis, at the end of the tracking phase,
3886 // in case that evaluation of PlaneEfficiencies was required for some detector.
3887 // E.g., write into a DataBase file the PlaneEfficiency which have been evaluated.
3889 // This Preliminary version works only FOR ITS !!!!!
3890 // other detectors (TOF,TRD, etc. have to develop their specific codes)
3893 // Return: kTRUE if all operations have been done properly, kFALSE otherwise
3896 TString detStr = fLoadCDB;
3897 //for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
3898 for (Int_t iDet = 0; iDet < 1; iDet++) { // for the time being only ITS
3899 if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
3900 if(fTracker[iDet] && fTracker[iDet]->GetPlaneEff()) {
3901 AliPlaneEff *planeeff=fTracker[iDet]->GetPlaneEff();
3902 TString name=planeeff->GetName();
3904 TFile* pefile = TFile::Open(name, "RECREATE");
3905 ret=(Bool_t)planeeff->Write();
3907 if(planeeff->GetCreateHistos()) {
3908 TString hname=planeeff->GetName();
3909 hname+="Histo.root";
3910 ret*=planeeff->WriteHistosToFile(hname,"RECREATE");
3913 if(fSPDTrackleter) {
3914 AliPlaneEff *planeeff=fSPDTrackleter->GetPlaneEff();
3915 TString name="AliITSPlaneEffSPDtracklet.root";
3916 TFile* pefile = TFile::Open(name, "RECREATE");
3917 ret=(Bool_t)planeeff->Write();
3919 AliESDEvent *dummy=NULL;
3920 ret=(Bool_t)fSPDTrackleter->PostProcess(dummy); // take care of writing other files
3925 //_____________________________________________________________________________
3926 Bool_t AliReconstruction::InitPlaneEff() {
3928 // Here execute all the necessary operations, before of the tracking phase,
3929 // for the evaluation of PlaneEfficiencies, in case required for some detectors.
3930 // E.g., read from a DataBase file a first evaluation of the PlaneEfficiency
3931 // which should be updated/recalculated.
3933 // This Preliminary version will work only FOR ITS !!!!!
3934 // other detectors (TOF,TRD, etc. have to develop their specific codes)
3937 // Return: kTRUE if all operations have been done properly, kFALSE otherwise
3940 fSPDTrackleter = NULL;
3941 TString detStr = fLoadCDB;
3942 if (IsSelected(fgkDetectorName[0], detStr)) {
3943 AliReconstructor* itsReconstructor = GetReconstructor(0);
3944 if (itsReconstructor) {
3945 fSPDTrackleter = itsReconstructor->CreateTrackleter(); // this is NULL unless required in RecoParam
3947 if (fSPDTrackleter) {
3948 AliInfo("Trackleter for SPD has been created");
3954 //_____________________________________________________________________________
3955 Bool_t AliReconstruction::InitAliEVE()
3957 // This method should be called only in case
3958 // AliReconstruction is run
3959 // within the alieve environment.
3960 // It will initialize AliEVE in a way
3961 // so that it can visualize event processed
3962 // by AliReconstruction.
3963 // The return flag shows whenever the
3964 // AliEVE initialization was successful or not.
3966 TString macroStr(getenv("ALIEVE_ONLINE_MACRO"));
3968 if (macroStr.IsNull())
3969 macroStr.Form("%s/EVE/macros/alieve_online.C",gSystem->ExpandPathName("$ALICE_ROOT"));
3971 AliInfo(Form("Loading AliEVE macro: %s",macroStr.Data()));
3973 if (gROOT->LoadMacro(macroStr.Data()) != 0) return kFALSE;
3975 gROOT->ProcessLine("if (!AliEveEventManager::GetMaster()){new AliEveEventManager();AliEveEventManager::GetMaster()->AddNewEventCommand(\"alieve_online_on_new_event()\");gEve->AddEvent(AliEveEventManager::GetMaster());};");
3976 gROOT->ProcessLine("alieve_online_init()");
3981 //_____________________________________________________________________________
3982 void AliReconstruction::RunAliEVE()
3984 // Runs AliEVE visualisation of
3985 // the current event.
3986 // Should be executed only after
3987 // successful initialization of AliEVE.
3989 AliInfo("Running AliEVE...");
3990 gROOT->ProcessLine(Form("AliEveEventManager::GetMaster()->SetEvent((AliRunLoader*)%p,(AliRawReader*)%p,(AliESDEvent*)%p,(AliESDfriend*)%p);",fRunLoader,fRawReader,fesd,fesdf));
3994 //_____________________________________________________________________________
3995 Bool_t AliReconstruction::SetRunQA(TString detAndAction)
3997 // Allows to run QA for a selected set of detectors
3998 // and a selected set of tasks among RAWS, DIGITSR, RECPOINTS and ESDS
3999 // all selected detectors run the same selected tasks
4001 if (!detAndAction.Contains(":")) {
4002 AliError( Form("%s is a wrong syntax, use \"DetectorList:ActionList\" \n", detAndAction.Data()) ) ;
4006 Int_t colon = detAndAction.Index(":") ;
4007 fQADetectors = detAndAction(0, colon) ;
4008 fQATasks = detAndAction(colon+1, detAndAction.Sizeof() ) ;
4009 if (fQATasks.Contains("ALL") ) {
4010 fQATasks = Form("%d %d %d %d", AliQAv1::kRAWS, AliQAv1::kDIGITSR, AliQAv1::kRECPOINTS, AliQAv1::kESDS) ;
4012 fQATasks.ToUpper() ;
4014 if ( fQATasks.Contains("RAW") )
4015 tempo = Form("%d ", AliQAv1::kRAWS) ;
4016 if ( fQATasks.Contains("DIGIT") )
4017 tempo += Form("%d ", AliQAv1::kDIGITSR) ;
4018 if ( fQATasks.Contains("RECPOINT") )
4019 tempo += Form("%d ", AliQAv1::kRECPOINTS) ;
4020 if ( fQATasks.Contains("ESD") )
4021 tempo += Form("%d ", AliQAv1::kESDS) ;
4023 if (fQATasks.IsNull()) {
4024 AliInfo("No QA requested\n") ;
4029 TString tempo(fQATasks) ;
4030 tempo.ReplaceAll(Form("%d", AliQAv1::kRAWS), AliQAv1::GetTaskName(AliQAv1::kRAWS)) ;
4031 tempo.ReplaceAll(Form("%d", AliQAv1::kDIGITSR), AliQAv1::GetTaskName(AliQAv1::kDIGITSR)) ;
4032 tempo.ReplaceAll(Form("%d", AliQAv1::kRECPOINTS), AliQAv1::GetTaskName(AliQAv1::kRECPOINTS)) ;
4033 tempo.ReplaceAll(Form("%d", AliQAv1::kESDS), AliQAv1::GetTaskName(AliQAv1::kESDS)) ;
4034 AliInfo( Form("QA will be done on \"%s\" for \"%s\"\n", fQADetectors.Data(), tempo.Data()) ) ;
4039 //_____________________________________________________________________________
4040 Bool_t AliReconstruction::InitRecoParams()
4042 // The method accesses OCDB and retrieves all
4043 // the available reco-param objects from there.
4045 Bool_t isOK = kTRUE;
4047 if (fRecoParam.GetDetRecoParamArray(kNDetectors)) {
4048 AliInfo("Using custom GRP reconstruction parameters");
4051 AliInfo("Loading GRP reconstruction parameter objects");
4053 AliCDBPath path("GRP","Calib","RecoParam");
4054 AliCDBEntry *entry=AliCDBManager::Instance()->Get(path.GetPath());
4056 AliWarning("Couldn't find GRP RecoParam entry in OCDB");
4060 TObject *recoParamObj = entry->GetObject();
4061 if (dynamic_cast<TObjArray*>(recoParamObj)) {
4062 // GRP has a normal TobjArray of AliDetectorRecoParam objects
4063 // Registering them in AliRecoParam
4064 fRecoParam.AddDetRecoParamArray(kNDetectors,dynamic_cast<TObjArray*>(recoParamObj));
4066 else if (dynamic_cast<AliDetectorRecoParam*>(recoParamObj)) {
4067 // GRP has only onse set of reco parameters
4068 // Registering it in AliRecoParam
4069 AliInfo("Single set of GRP reconstruction parameters found");
4070 dynamic_cast<AliDetectorRecoParam*>(recoParamObj)->SetAsDefault();
4071 fRecoParam.AddDetRecoParam(kNDetectors,dynamic_cast<AliDetectorRecoParam*>(recoParamObj));
4074 AliError("No valid GRP RecoParam object found in the OCDB");
4081 TString detStr = fLoadCDB;
4082 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
4084 if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
4086 if (fRecoParam.GetDetRecoParamArray(iDet)) {
4087 AliInfo(Form("Using custom reconstruction parameters for detector %s",fgkDetectorName[iDet]));
4091 AliInfo(Form("Loading reconstruction parameter objects for detector %s",fgkDetectorName[iDet]));
4093 AliCDBPath path(fgkDetectorName[iDet],"Calib","RecoParam");
4094 AliCDBEntry *entry=AliCDBManager::Instance()->Get(path.GetPath());
4096 AliWarning(Form("Couldn't find RecoParam entry in OCDB for detector %s",fgkDetectorName[iDet]));
4100 TObject *recoParamObj = entry->GetObject();
4101 if (dynamic_cast<TObjArray*>(recoParamObj)) {
4102 // The detector has a normal TobjArray of AliDetectorRecoParam objects
4103 // Registering them in AliRecoParam
4104 fRecoParam.AddDetRecoParamArray(iDet,dynamic_cast<TObjArray*>(recoParamObj));
4106 else if (dynamic_cast<AliDetectorRecoParam*>(recoParamObj)) {
4107 // The detector has only onse set of reco parameters
4108 // Registering it in AliRecoParam
4109 AliInfo(Form("Single set of reconstruction parameters found for detector %s",fgkDetectorName[iDet]));
4110 dynamic_cast<AliDetectorRecoParam*>(recoParamObj)->SetAsDefault();
4111 fRecoParam.AddDetRecoParam(iDet,dynamic_cast<AliDetectorRecoParam*>(recoParamObj));
4114 AliError(Form("No valid RecoParam object found in the OCDB for detector %s",fgkDetectorName[iDet]));
4118 // FIX ME: We have to disable the unloading of reco-param CDB
4119 // entries because QA framework is using them. Has to be fix in
4120 // a way that the QA takes the objects already constructed in
4122 // AliCDBManager::Instance()->UnloadFromCache(path.GetPath());
4126 if (AliDebugLevel() > 0) fRecoParam.Print();
4131 //_____________________________________________________________________________
4132 Bool_t AliReconstruction::GetEventInfo()
4134 // Fill the event info object
4136 AliCodeTimerAuto("",0)
4138 AliCentralTrigger *aCTP = NULL;
4140 fEventInfo.SetEventType(fRawReader->GetType());
4142 ULong64_t mask = fRawReader->GetClassMask();
4143 ULong64_t maskNext50 = fRawReader->GetClassMaskNext50();
4144 fEventInfo.SetTriggerMask(mask);
4145 fEventInfo.SetTriggerMaskNext50(maskNext50);
4146 UInt_t clmask = fRawReader->GetDetectorPattern()[0];
4147 fEventInfo.SetTriggerCluster(AliDAQ::ListOfTriggeredDetectors(clmask));
4149 aCTP = new AliCentralTrigger();
4150 TString configstr("");
4151 if (!aCTP->LoadConfiguration(configstr)) { // Load CTP config from OCDB
4152 AliError("No trigger configuration found in OCDB! The trigger configuration information will not be used!");
4156 aCTP->SetClassMask(mask);
4157 aCTP->SetClusterMask(clmask);
4160 AliCentralTrigger* rlCTP = fRunLoader->GetTrigger();
4162 rlCTP->SetClassMask(mask);
4163 rlCTP->SetClusterMask(clmask);
4168 fEventInfo.SetEventType(AliRawEventHeaderBase::kPhysicsEvent);
4170 if (fRunLoader && (!fRunLoader->LoadTrigger())) {
4171 aCTP = fRunLoader->GetTrigger();
4172 fEventInfo.SetTriggerMask(aCTP->GetClassMask());
4173 fEventInfo.SetTriggerMaskNext50(aCTP->GetClassMaskNext50());
4174 // get inputs from actp - just get
4175 AliESDHeader* esdheader = fesd->GetHeader();
4176 esdheader->SetL0TriggerInputs(aCTP->GetL0TriggerInputs());
4177 esdheader->SetL1TriggerInputs(aCTP->GetL1TriggerInputs());
4178 esdheader->SetL2TriggerInputs(aCTP->GetL2TriggerInputs());
4179 fEventInfo.SetTriggerCluster(AliDAQ::ListOfTriggeredDetectors(aCTP->GetClusterMask()));
4182 if (fStopOnMissingTriggerFile) AliFatal("No trigger can be loaded! Stopping reconstruction!");
4183 AliWarning("No trigger can be loaded! The trigger information will not be used!");
4188 AliTriggerConfiguration *config = aCTP->GetConfiguration();
4190 AliError("No trigger configuration has been found! The trigger configuration information will not be used!");
4191 if (fRawReader) delete aCTP;
4195 // Load trigger aliases and declare the trigger classes included in aliases
4196 //PH Why do we do it in each event and not only once in the beginning of the chunk??
4197 //PH Temporary fix for #99725: AliReconstruction::GetEventInfo bug
4198 fDeclTriggerClasses.Clear();
4199 AliCDBEntry * entry = AliCDBManager::Instance()->Get("GRP/CTP/Aliases");
4201 THashList * lst = dynamic_cast<THashList*>(entry->GetObject());
4203 lst->Sort(kSortDescending); // to avoid problems with substrungs
4204 if (fRawReader) fRawReader->LoadTriggerAlias(lst);
4205 // Now declare all the triggers present in the aliases
4208 while((nmd = dynamic_cast<TNamed*>(iter.Next()))){
4209 fDeclTriggerClasses += " ";
4210 fDeclTriggerClasses += nmd->GetName();
4214 AliError("Cannot cast the object with trigger aliases to THashList!");
4218 AliError("No OCDB ebtry for the trigger aliases!");
4220 // Load trigger classes for this run
4221 UChar_t clustmask = 0;
4223 ULong64_t trmask = fEventInfo.GetTriggerMask();
4224 ULong64_t trmaskNext50 = fEventInfo.GetTriggerMaskNext50();
4225 const TObjArray& classesArray = config->GetClasses();
4226 Int_t nclasses = classesArray.GetEntriesFast();
4227 for( Int_t iclass=0; iclass < nclasses; iclass++ ) {
4228 AliTriggerClass* trclass = (AliTriggerClass*)classesArray.At(iclass);
4229 if (trclass && trclass->GetMask()>0) {
4230 Int_t trindex = TMath::Nint(TMath::Log2(trclass->GetMask()));
4231 if (fesd) fesd->SetTriggerClass(trclass->GetName(),trindex);
4232 if (fRawReader) fRawReader->LoadTriggerClass(trclass->GetName(),trindex);
4233 if (trmask & (1ull << trindex)) {
4235 trclasses += trclass->GetName();
4237 clustmask |= trclass->GetCluster()->GetClusterMask();
4240 if (trclass && trclass->GetMaskNext50()>0) {
4241 Int_t trindex = TMath::Nint(TMath::Log2(trclass->GetMaskNext50()))+50;
4242 if (fesd) fesd->SetTriggerClass(trclass->GetName(),trindex);
4243 if (fRawReader) fRawReader->LoadTriggerClass(trclass->GetName(),trindex);
4244 if (trmaskNext50 & (1ull << (trindex-50))) {
4246 trclasses += trclass->GetName();
4248 clustmask |= trclass->GetCluster()->GetClusterMask();
4252 fEventInfo.SetTriggerClasses(trclasses);
4253 // Now put the declared trigger classes (not present in the run)
4254 // to 0/false in the event selection
4255 if (!fDeclTriggerClasses.IsNull()) {
4256 TObjArray *tokens = fDeclTriggerClasses.Tokenize(" ");
4257 Int_t ntokens = tokens->GetEntriesFast();
4258 for (Int_t itoken = 0; itoken < ntokens; ++itoken) {
4259 if (fRawReader) fRawReader->LoadTriggerClass((((TObjString*)tokens->At(itoken))->String()).Data(),-1);
4264 // Write names of active trigger inputs in ESD Header
4265 const TObjArray& inputsArray = config->GetInputs();
4266 Int_t ninputs = inputsArray.GetEntriesFast();
4267 for( Int_t iinput=0; iinput < ninputs; iinput++ ) {
4268 AliTriggerInput* trginput = (AliTriggerInput*)inputsArray.At(iinput);
4269 if (trginput && trginput->GetMask()>0) {
4270 Int_t inputIndex = (Int_t)TMath::Nint(TMath::Log2(trginput->GetMask()));
4271 AliESDHeader* headeresd = 0x0;
4272 if (fesd) headeresd = fesd->GetHeader();
4274 Int_t trglevel = (Int_t)trginput->GetLevel();
4275 if (trglevel == 0) headeresd->SetActiveTriggerInputs(trginput->GetInputName(), inputIndex);
4276 if (trglevel == 1) headeresd->SetActiveTriggerInputs(trginput->GetInputName(), inputIndex+24);
4277 if (trglevel == 2) headeresd->SetActiveTriggerInputs(trginput->GetInputName(), inputIndex+48);
4282 // Set the information in ESD
4284 fesd->SetTriggerMask(trmask);
4285 fesd->SetTriggerMaskNext50(trmaskNext50);
4286 fesd->SetTriggerCluster(clustmask);
4289 if (!aCTP->CheckTriggeredDetectors()) {
4290 if (fRawReader) delete aCTP;
4294 if (fRawReader) delete aCTP;
4296 // We have to fill also the HLT decision here!!
4302 const char *AliReconstruction::MatchDetectorList(const char *detectorList, UInt_t detectorMask)
4304 // Match the detector list found in the rec.C or the default 'ALL'
4305 // to the list found in the GRP (stored there by the shuttle PP which
4306 // gets the information from ECS)
4307 static TString resultList;
4308 TString detList = detectorList;
4312 for(Int_t iDet = 0; iDet < (AliDAQ::kNDetectors-1); iDet++) {
4313 if ((detectorMask >> iDet) & 0x1) {
4314 TString det = AliDAQ::OfflineModuleName(iDet);
4315 if ((detList.CompareTo("ALL") == 0) ||
4316 ((detList.BeginsWith("ALL ") ||
4317 detList.EndsWith(" ALL") ||
4318 detList.Contains(" ALL ")) &&
4319 !(detList.BeginsWith("-"+det+" ") ||
4320 detList.EndsWith(" -"+det) ||
4321 detList.Contains(" -"+det+" "))) ||
4322 (detList.CompareTo(det) == 0) ||
4323 detList.BeginsWith(det+" ") ||
4324 detList.EndsWith(" "+det) ||
4325 detList.Contains( " "+det+" " )) {
4326 if (!resultList.EndsWith(det + " ")) {
4335 if ((detectorMask >> AliDAQ::kHLTId) & 0x1) {
4336 TString hltDet = AliDAQ::OfflineModuleName(AliDAQ::kNDetectors-1);
4337 if ((detList.CompareTo("ALL") == 0) ||
4338 ((detList.BeginsWith("ALL ") ||
4339 detList.EndsWith(" ALL") ||
4340 detList.Contains(" ALL ")) &&
4341 !(detList.BeginsWith("-"+hltDet+" ") ||
4342 detList.EndsWith(" -"+hltDet) ||
4343 detList.Contains(" -"+hltDet+" "))) ||
4344 (detList.CompareTo(hltDet) == 0) ||
4345 detList.BeginsWith(hltDet+" ") ||
4346 detList.EndsWith(" "+hltDet) ||
4347 detList.Contains( " "+hltDet+" " )) {
4348 resultList += hltDet;
4352 return resultList.Data();
4356 //______________________________________________________________________________
4357 void AliReconstruction::Abort(const char *method, EAbort what)
4359 // Abort processing. If what = kAbortProcess, the Process() loop will be
4360 // aborted. If what = kAbortFile, the current file in a chain will be
4361 // aborted and the processing will continue with the next file, if there
4362 // is no next file then Process() will be aborted. Abort() can also be
4363 // called from Begin(), SlaveBegin(), Init() and Notify(). After abort
4364 // the SlaveTerminate() and Terminate() are always called. The abort flag
4365 // can be checked in these methods using GetAbort().
4367 // The method is overwritten in AliReconstruction for better handling of
4368 // reco specific errors
4370 if (!fStopOnError) return;
4374 TString whyMess = method;
4375 whyMess += " failed! Aborting...";
4377 AliError(whyMess.Data());
4380 TString mess = "Abort";
4381 if (fAbort == kAbortProcess)
4382 mess = "AbortProcess";
4383 else if (fAbort == kAbortFile)
4386 Info(mess.Data(), "%s", whyMess.Data());
4389 //______________________________________________________________________________
4390 Bool_t AliReconstruction::ProcessEvent(void* event)
4392 // Method that is used in case the event loop
4393 // is steered from outside, for example by AMORE
4394 // 'event' is a pointer to the DATE event in the memory
4396 if (fRawReader) delete fRawReader;
4397 fRawReader = new AliRawReaderDate(event);
4398 fStatus = ProcessEvent(fRunLoader->GetNumberOfEvents());
4405 //______________________________________________________________________________
4406 Bool_t AliReconstruction::ParseOutput()
4408 // The method parses the output file
4409 // location string in order to steer
4410 // properly the selector
4412 TPMERegexp re1("(\\w+\\.zip#\\w+\\.root):([,*\\w+\\.root,*]+)@dataset://(\\w++)");
4413 TPMERegexp re2("(\\w+\\.root)?@?dataset://(\\w++)");
4415 if (re1.Match(fESDOutput) == 4) {
4416 // root archive with output files stored and regustered
4418 gProof->AddInput(new TNamed("PROOF_OUTPUTFILE",re1[1].Data()));
4419 gProof->AddInput(new TNamed("PROOF_OUTPUTFILE_LOCATION",re1[3].Data()));
4420 gProof->AddInput(new TNamed("PROOF_OUTPUTFILE_DATASET",""));
4421 gProof->AddInput(new TNamed("PROOF_OUTPUTFILE_ARCHIVE",re1[2].Data()));
4422 AliInfo(Form("%s files will be stored within %s in dataset %s",
4427 else if (re2.Match(fESDOutput) == 3) {
4428 // output file stored and registered
4430 gProof->AddInput(new TNamed("PROOF_OUTPUTFILE",(re2[1].IsNull()) ? "AliESDs.root" : re2[1].Data()));
4431 gProof->AddInput(new TNamed("PROOF_OUTPUTFILE_LOCATION",re2[2].Data()));
4432 gProof->AddInput(new TNamed("PROOF_OUTPUTFILE_DATASET",""));
4433 AliInfo(Form("%s will be stored in dataset %s",
4434 (re2[1].IsNull()) ? "AliESDs.root" : re2[1].Data(),
4438 if (fESDOutput.IsNull()) {
4439 // Output location not given.
4440 // Assuming xrootd has been already started and
4441 // the output file has to be sent back
4442 // to the client machine
4443 TString esdUrl(Form("root://%s/%s/",
4444 TUrl(gSystem->HostName()).GetHostFQDN(),
4446 gProof->AddInput(new TNamed("PROOF_OUTPUTFILE","AliESDs.root"));
4447 gProof->AddInput(new TNamed("PROOF_OUTPUTFILE_LOCATION",esdUrl.Data()));
4448 AliInfo(Form("AliESDs.root will be stored in %s",
4452 // User specified an output location.
4453 // Ones has just to parse it here
4454 TUrl outputUrl(fESDOutput.Data());
4455 TString outputFile(gSystem->BaseName(outputUrl.GetFile()));
4456 gProof->AddInput(new TNamed("PROOF_OUTPUTFILE",outputFile.IsNull() ? "AliESDs.root" : outputFile.Data()));
4457 TString outputLocation(outputUrl.GetUrl());
4458 outputLocation.ReplaceAll(outputFile.Data(),"");
4459 gProof->AddInput(new TNamed("PROOF_OUTPUTFILE_LOCATION",outputLocation.Data()));
4460 AliInfo(Form("%s will be stored in %s",
4461 outputFile.IsNull() ? "AliESDs.root" : outputFile.Data(),
4462 outputLocation.Data()));
4469 //______________________________________________________________________________
4470 Bool_t AliReconstruction::IsHighPt() const {
4471 // Selection of events containing "high" pT tracks
4472 // If at least one track is found within 1.5 and 100 GeV (pT)
4473 // that was reconstructed by both ITS and TPC, the event is accepted
4476 const Double_t pTmin = 1.5;
4477 const Double_t pTmax = 100;
4479 mask |= (AliESDtrack::kITSrefit);
4480 mask |= (AliESDtrack::kTPCrefit);
4481 const Double_t pTminCosmic = 5.;
4482 const Double_t pTmaxCosmic = 100;
4483 ULong_t maskCosmic = 0;
4484 Int_t cosmicCount=0;
4485 maskCosmic |= (AliESDtrack::kTPCrefit);
4487 Bool_t isOK = kFALSE;
4489 if (fesd && fesd->GetEventType()==AliRawEventHeaderBase::kPhysicsEvent) {
4490 // Check if this ia a physics event (code 7)
4491 Int_t ntrk = fesd->GetNumberOfTracks();
4492 for (Int_t itrk=0; itrk<ntrk; ++itrk) {
4494 AliESDtrack * trk = fesd->GetTrack(itrk);
4496 && trk->Pt() > pTmin
4497 && trk->Pt() < pTmax
4498 && (trk->GetStatus() & mask) == mask ) {
4504 && trk->GetInnerParam()
4505 && trk->GetInnerParam()->Pt() > pTminCosmic
4506 && trk->GetInnerParam()->Pt() < pTmaxCosmic
4507 && (trk->GetStatus() & maskCosmic) == maskCosmic ) {
4513 if (cosmicCount>1) isOK=kTRUE;
4518 //______________________________________________________________________________
4519 Bool_t AliReconstruction::IsCosmicOrCalibSpecie() const {
4520 // Select cosmic or calibration events
4522 Bool_t isOK = kFALSE;
4524 if (fesd && fesd->GetEventType()==AliRawEventHeaderBase::kPhysicsEvent) {
4525 // Check if this ia a physics event (code 7)
4527 UInt_t specie = fesd->GetEventSpecie();
4528 if (specie==AliRecoParam::kCosmic || specie==AliRecoParam::kCalib) {
4535 //______________________________________________________________________________
4536 void AliReconstruction::WriteESDfriend() {
4537 // Fill the ESD friend in the tree. The required fraction of ESD friends is stored
4538 // in fFractionFriends. We select events where we store the ESD friends according
4539 // to the following algorithm:
4540 // 1. Store all Cosmic or Calibration events within the required fraction
4541 // 2. Sample "high Pt" events within the remaining fraction after step 1.
4542 // 3. Sample randomly events if we still have remaining slot
4545 Bool_t isSelected = kFALSE;
4547 // Store all friends for B field OFF
4548 if (TMath::Abs(AliTrackerBase::GetBz())<0.5) isSelected=kTRUE;
4550 if (IsCosmicOrCalibSpecie()) { // Selection of calib or cosmic events
4557 Double_t remainingFraction = fFractionFriends;
4558 remainingFraction -= ((Double_t)(fSspecie)/(Double_t)(fNall));
4560 if (IsHighPt()) { // Selection of "high Pt" events
4562 Double_t curentHighPtFraction = ((Double_t)(fNhighPt+1))/((Double_t)(fNall+1));
4563 // "Bayesian" estimate supposing that without events all the events are of the required type
4566 Double_t rnd = gRandom->Rndm()*curentHighPtFraction;
4567 if (rnd<remainingFraction) {
4573 remainingFraction -= ((Double_t)(fShighPt)/(Double_t)(fNall));
4575 // Random selection to fill the remaining fraction (if any)
4577 Double_t rnd = gRandom->Rndm();
4578 if (rnd<remainingFraction) {
4584 fesdf->~AliESDfriend();
4585 new (fesdf) AliESDfriend(); // Reset...
4586 fesdf->SetSkipBit(kTRUE);
4589 Long64_t nbf = ftreeF->Fill();
4590 if (fTreeBuffSize>0 && ftreeF->GetAutoFlush()<0 && (fMemCountESDF += nbf)>fTreeBuffSize ) { // default limit is still not reached
4591 nbf = ftreeF->GetZipBytes();
4592 if (nbf>0) nbf = -nbf;
4593 else nbf = ftreeF->GetEntries();
4594 ftreeF->SetAutoFlush(nbf);
4595 AliInfo(Form("Calling ftreeF->SetAutoFlush(%lld) | W:%lld T:%lld Z:%lld",
4596 nbf,fMemCountESDF,ftreeF->GetTotBytes(),ftreeF->GetZipBytes()));
4601 //_________________________________________________________________
4602 void AliReconstruction::DeleteDigits(const TString& detectors)
4604 // delete requested digit files produced at current event
4605 static int iEvent = 0;
4606 if (detectors.IsNull()) return;
4607 TString detStr = detectors;
4608 AliInfo(Form("Deleting Digits: %s",detectors.Data()));
4610 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
4611 if(!IsSelected(fgkDetectorName[iDet], detStr)) continue;
4612 unlink(Form("%s.Digits.root",fgkDetectorName[iDet]));
4614 AliSysInfo::AddStamp(Form("DelDigits_%d",iEvent), 0,0,iEvent);
4618 //_________________________________________________________________
4619 void AliReconstruction::DeleteRecPoints(const TString& detectors)
4621 // delete requested recpoint files produced at current event
4622 static int iEvent = 0;
4623 if (detectors.IsNull()) return;
4624 TString detStr = detectors;
4625 AliInfo(Form("Deleting Recpoints: %s",detectors.Data()));
4627 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
4628 if(!IsSelected(fgkDetectorName[iDet], detStr)) continue;
4629 unlink(Form("%s.RecPoints.root",fgkDetectorName[iDet]));
4631 AliSysInfo::AddStamp(Form("DelRecPoints_%d",iEvent), 0,0,iEvent);
4635 //_________________________________________________________________
4636 void AliReconstruction::SetStopOnResourcesExcess(Int_t vRSS,Int_t vVMEM)
4638 // require checking the resources left and stopping on excess
4639 // if 0 : no check is done
4640 // if >0 : stop reconstruction if exceeds this value
4641 // if <0 : use as margin to system limits
4643 const int kKB2MB = 1024;
4644 const int kInfMem = 9999999;
4647 int pgSize = getpagesize();
4651 AliInfo(Form("Setting max. RSS usage to user value %d MB",fMaxRSS));
4654 getrlimit(RLIMIT_RSS,&r);
4655 fMaxRSS = r.rlim_max==RLIM_INFINITY ? kInfMem : int(r.rlim_max*pgSize/kKB2MB/kKB2MB) + vRSS;
4656 AliInfo(Form("Setting max. RSS usage to system hard limit %d%s MB (%d margin)",fMaxRSS,r.rlim_max==RLIM_INFINITY ? "(inf)":"",-vRSS));
4658 else {AliInfo("No check on RSS memory usage will be applied");}
4662 AliInfo(Form("Setting max. VMEM usage to user value %d MB",fMaxVMEM));
4665 getrlimit(RLIMIT_AS,&r);
4666 fMaxVMEM = r.rlim_max==RLIM_INFINITY ? kInfMem : int(r.rlim_max*pgSize/kKB2MB/kKB2MB) + vVMEM;
4667 AliInfo(Form("Setting max. VMEM usage to system hard limit %d%s MB (%d margin)",fMaxVMEM,r.rlim_max==RLIM_INFINITY ? "(inf)":"",-vVMEM));
4669 else {AliInfo("No check on RSS memory usage will be applied");}
4673 //_________________________________________________________________
4674 Bool_t AliReconstruction::HasEnoughResources(int ev)
4676 // check if process consumed more than allowed resources
4677 const int kKB2MB = 1024;
4679 if (!fMaxRSS && !fMaxVMEM) return res;
4681 ProcInfo_t procInfo;
4682 gSystem->GetProcInfo(&procInfo);
4683 if (procInfo.fMemResident/kKB2MB > fMaxRSS) res = kFALSE;
4684 if (procInfo.fMemVirtual/kKB2MB > fMaxVMEM) res = kFALSE;
4687 AliInfo(Form("Job exceeded allowed limits: RSS:%d (%d) VMEM:%d (%d), will stop",
4688 int(procInfo.fMemResident/kKB2MB),fMaxRSS,
4689 int(procInfo.fMemVirtual/kKB2MB) ,fMaxVMEM));
4691 unlink(Form("%s",fgkStopEvFName));
4692 ofstream outfile(fgkStopEvFName);
4693 outfile << ev << std::endl;
4700 Bool_t AliReconstruction::HasNextEventAfter(Int_t eventId)
4702 return ( (eventId < fRunLoader->GetNumberOfEvents()) ||
4703 (fRawReader && fRawReader->NextEvent()) );
4706 //_________________________________________________________________
4707 void AliReconstruction::CheckRecoCDBvsSimuCDB()
4709 // if some CDB entries must be the same in the simulation
4710 // and reconstruction, check here
4711 int nent = fCheckRecoCDBvsSimuCDB.GetEntriesFast();
4712 AliInfo(Form("Check %d entries for matching between sim and rec",nent));
4714 // get simulation CDB
4715 fRunLoader->CdGAFile();
4716 TMap* cdbMapSim = (TMap*)gDirectory->Get("cdbMap");
4717 TList* cdbListSim = (TList*)gDirectory->Get("cdbList");
4718 if (!(cdbMapSim && cdbListSim)) {
4719 AliInfo(Form("No CDBMap/List found in %s, nothing to check",fGAliceFileName.Data()));
4722 // read the requested objects to make sure they will appear in the reco list
4723 for (Int_t i=0;i<nent;i++) {
4724 TNamed* cdbent = (TNamed*) fCheckRecoCDBvsSimuCDB[i];
4725 if (!cdbent) continue;
4726 AliCDBManager::Instance()->Get(cdbent->GetName());
4728 // get default path for simulation
4731 pair = (TPair*)cdbMapSim->FindObject("default");
4732 if (!pair) {AliFatal("Did not find default storage used for simulations"); return;}
4733 TString defSimStore = ((TObjString*)pair->Value())->GetString();
4734 RectifyCDBurl(defSimStore);
4736 // get reconstruction CDB
4737 const TMap *cdbMapRec = AliCDBManager::Instance()->GetStorageMap();
4738 const TList *cdbListRec = AliCDBManager::Instance()->GetRetrievedIds();
4740 // get default path for reconstruction
4741 pair = (TPair*)cdbMapRec->FindObject("default");
4742 if (!pair) {AliFatal("Did not find default storage used for reconstruction"); return;}
4743 TString defRecStore = ((TObjString*)pair->Value())->GetString();
4744 RectifyCDBurl(defRecStore);
4746 for (Int_t i=0;i<nent;i++) {
4747 TNamed* cdbent = (TNamed*) fCheckRecoCDBvsSimuCDB[i];
4748 if (!cdbent) continue;
4750 AliInfo(Form("#%d Checking %s",i,cdbent->GetName()));
4752 // find cdbID used for sim
4753 TString idSim="",storSim="";
4754 TIter nextSim(cdbListSim);
4755 while ((stro=(TObjString*)nextSim())) {
4756 if (stro->GetString().Contains(cdbent->GetName())) {
4757 idSim = stro->GetString();
4761 // find the storage used for sim
4762 // check in the simuCDB special paths
4763 pair = (TPair*)cdbMapSim->FindObject(cdbent->GetName());
4764 if (pair) { // specific path is used
4765 storSim = ((TObjString*)pair->Value())->GetString();
4766 RectifyCDBurl(storSim);
4768 else storSim = defSimStore; // default storage list is used
4770 if (!idSim.IsNull()) AliInfo(Form("Sim. used %s from %s",idSim.Data(), storSim.Data()));
4771 else AliInfo("Sim. did not use this object");
4773 // find cdbID used for rec
4774 TString idRec="",storRec="";
4775 TIter nextRec(cdbListRec);
4777 while ((id=(AliCDBId*)nextRec())) {
4778 idRec = id->ToString();
4779 if (idRec.Contains(cdbent->GetName())) break;
4783 // find storage used for the rec
4784 pair = (TPair*)cdbMapRec->FindObject(cdbent->GetName());
4785 if (pair) { // specific path is used
4786 storRec = ((TObjString*)pair->Value())->GetString();
4787 RectifyCDBurl(storRec);
4789 else storRec = defRecStore; // default storage list is used
4791 if (!idRec.IsNull()) AliInfo(Form("Rec. used %s from %s",idRec.Data(), storRec.Data()));
4792 else AliInfo("Rec. did not use this object");
4794 if (!idSim.IsNull() && !idRec.IsNull() && ((idSim!=idRec) || (storSim!=storRec)) )
4795 AliFatal("Different objects were used in sim and rec");
4800 //_________________________________________________________
4801 void AliReconstruction::RectifyCDBurl(TString& url)
4804 // remove everything but the url
4806 if (!(sbs=url("\\?User=[^?]*")).IsNull()) url.ReplaceAll(sbs,"");
4807 if (!(sbs=url("\\?DBFolder=[^?]*")).IsNull()) url.ReplaceAll("?DB","");
4808 if (!(sbs=url("\\?SE=[^?]*")).IsNull()) url.ReplaceAll(sbs,"");
4809 if (!(sbs=url("\\?CacheFolder=[^?]*")).IsNull()) url.ReplaceAll(sbs,"");
4810 if (!(sbs=url("\\?OperateDisconnected=[^?]*")).IsNull()) url.ReplaceAll(sbs,"");
4811 if (!(sbs=url("\\?CacheSize=[^?]*")).IsNull()) url.ReplaceAll(sbs,"");
4812 if (!(sbs=url("\\?CleanupInterval=[^?]*")).IsNull()) url.ReplaceAll(sbs,"");
4813 Bool_t slash=kFALSE,space=kFALSE;
4814 while ( (slash=url.EndsWith("/")) || (space=url.EndsWith(" ")) ) {
4815 if (slash) url = url.Strip(TString::kTrailing,'/');
4816 if (space) url = url.Strip(TString::kTrailing,' ');