1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
18 ///////////////////////////////////////////////////////////////////////////////
20 // class for running the reconstruction //
22 // Clusters and tracks are created for all detectors and all events by //
25 // AliReconstruction rec; //
28 // The Run method returns kTRUE in case of successful execution. //
30 // If the input to the reconstruction are not simulated digits but raw data, //
31 // this can be specified by an argument of the Run method or by the method //
33 // rec.SetInput("..."); //
35 // The input formats and the corresponding argument are: //
36 // - DDL raw data files: directory name, ends with "/" //
37 // - raw data root file: root file name, extension ".root" //
38 // - raw data DATE file: DATE file name, any other non-empty string //
39 // - MC root files : empty string, default //
41 // By default all events are reconstructed. The reconstruction can be //
42 // limited to a range of events by giving the index of the first and the //
43 // last event as an argument to the Run method or by calling //
45 // rec.SetEventRange(..., ...); //
47 // The index -1 (default) can be used for the last event to indicate no //
48 // upper limit of the event range. //
50 // In case of raw-data reconstruction the user can modify the default //
51 // number of events per digits/clusters/tracks file. In case the option //
52 // is not used the number is set 1. In case the user provides 0, than //
53 // the number of events is equal to the number of events inside the //
54 // raw-data file (i.e. one digits/clusters/tracks file): //
56 // rec.SetNumberOfEventsPerFile(...); //
59 // The name of the galice file can be changed from the default //
60 // "galice.root" by passing it as argument to the AliReconstruction //
61 // constructor or by //
63 // rec.SetGAliceFile("..."); //
65 // The local reconstruction can be switched on or off for individual //
68 // rec.SetRunLocalReconstruction("..."); //
70 // The argument is a (case sensitive) string with the names of the //
71 // detectors separated by a space. The special string "ALL" selects all //
72 // available detectors. This is the default. //
74 // The reconstruction of the primary vertex position can be switched off by //
76 // rec.SetRunVertexFinder(kFALSE); //
78 // The tracking and the creation of ESD tracks can be switched on for //
79 // selected detectors by //
81 // rec.SetRunTracking("..."); //
83 // Uniform/nonuniform field tracking switches (default: uniform field) //
85 // rec.SetUniformFieldTracking(); ( rec.SetUniformFieldTracking(kFALSE); ) //
87 // The filling of additional ESD information can be steered by //
89 // rec.SetFillESD("..."); //
91 // Again, for both methods the string specifies the list of detectors. //
92 // The default is "ALL". //
94 // The call of the shortcut method //
96 // rec.SetRunReconstruction("..."); //
98 // is equivalent to calling SetRunLocalReconstruction, SetRunTracking and //
99 // SetFillESD with the same detector selecting string as argument. //
101 // The reconstruction requires digits or raw data as input. For the creation //
102 // of digits and raw data have a look at the class AliSimulation. //
104 // The input data of a detector can be replaced by the corresponding HLT //
105 // data by calling (usual detector string) //
106 // SetUseHLTData("..."); //
109 ///////////////////////////////////////////////////////////////////////////////
116 #include <TGeoGlobalMagField.h>
117 #include <TGeoManager.h>
119 #include <TLorentzVector.h>
121 #include <TObjArray.h>
122 #include <TPRegexp.h>
123 #include <TParameter.h>
124 #include <TPluginManager.h>
126 #include <TProofOutputFile.h>
129 #include <THashTable.h>
131 #include <TMessage.h>
134 #include <THashList.h>
136 #include "AliAlignObj.h"
137 #include "AliAnalysisManager.h"
138 #include "AliAnalysisDataContainer.h"
139 #include "AliCDBEntry.h"
140 #include "AliCDBManager.h"
141 #include "AliCDBStorage.h"
142 #include "AliCTPRawStream.h"
143 #include "AliCascadeVertexer.h"
144 #include "AliCentralTrigger.h"
145 #include "AliCodeTimer.h"
147 #include "AliDetectorRecoParam.h"
148 #include "AliESDCaloCells.h"
149 #include "AliESDCaloCluster.h"
150 #include "AliESDEvent.h"
151 #include "AliESDMuonTrack.h"
152 #include "AliESDPmdTrack.h"
153 #include "AliESDTagCreator.h"
154 #include "AliESDVertex.h"
155 #include "AliESDcascade.h"
156 #include "AliESDfriend.h"
157 #include "AliESDkink.h"
158 #include "AliESDpid.h"
159 #include "AliESDtrack.h"
160 #include "AliESDtrack.h"
161 #include "AliEventInfo.h"
162 #include "AliGRPObject.h"
163 #include "AliGRPRecoParam.h"
164 #include "AliGenEventHeader.h"
165 #include "AliGeomManager.h"
166 #include "AliGlobalQADataMaker.h"
167 #include "AliHeader.h"
170 #include "AliMultiplicity.h"
172 #include "AliPlaneEff.h"
174 #include "AliQADataMakerRec.h"
175 #include "AliQAManager.h"
176 #include "AliRawVEvent.h"
177 #include "AliRawEventHeaderBase.h"
178 #include "AliRawHLTManager.h"
179 #include "AliRawReaderDate.h"
180 #include "AliRawReaderFile.h"
181 #include "AliRawReaderRoot.h"
182 #include "AliRecoInputHandler.h"
183 #include "AliReconstruction.h"
184 #include "AliReconstructor.h"
186 #include "AliRunInfo.h"
187 #include "AliRunLoader.h"
188 #include "AliSysInfo.h" // memory snapshots
189 #include "AliTrackPointArray.h"
190 #include "AliTracker.h"
191 #include "AliTriggerClass.h"
192 #include "AliTriggerCluster.h"
193 #include "AliTriggerIR.h"
194 #include "AliTriggerConfiguration.h"
195 #include "AliV0vertexer.h"
196 #include "AliVertexer.h"
197 #include "AliTrackleter.h"
198 #include "AliVertexerTracks.h"
199 #include "AliTriggerRunScalers.h"
200 #include "AliCTPTimeParams.h"
201 #include "AliESDHLTDecision.h"
202 #include "AliTriggerInput.h"
203 #include "AliLHCData.h"
204 #include "ARVersion.h"
205 #include <RVersion.h>
207 #include <sys/resource.h>
208 ClassImp(AliReconstruction)
212 //_____________________________________________________________________________
213 const char* AliReconstruction::fgkStopEvFName = "_stopEvent_";
214 const char* AliReconstruction::fgkDetectorName[AliReconstruction::kNDetectors] = {"ITS", "TPC", "TRD", "TOF", "PHOS", "HMPID", "EMCAL", "MUON", "FMD", "ZDC", "PMD", "T0", "VZERO", "ACORDE"
215 // #ifdef MFT_UPGRADE
222 //_____________________________________________________________________________
223 AliReconstruction::AliReconstruction(const char* gAliceFilename) :
225 fRunVertexFinder(kTRUE),
226 fRunVertexFinderTracks(kTRUE),
227 fRunHLTTracking(kFALSE),
228 fRunMuonTracking(kFALSE),
230 fRunCascadeFinder(kTRUE),
231 fRunMultFinder(kTRUE),
233 fWriteAlignmentData(kFALSE),
234 fWriteESDfriend(kFALSE),
235 fFillTriggerESD(kTRUE),
243 fRunLocalReconstruction("ALL"),
246 fDeleteRecPoints(""),
249 fUseTrackingErrorsForAlignment(""),
250 fGAliceFileName(gAliceFilename),
253 fProofOutputFileName(""),
254 fProofOutputLocation(""),
255 fProofOutputDataset(kFALSE),
256 fProofOutputArchive(""),
260 fNumberOfEventsPerFile((UInt_t)-1),
261 fFractionFriends(0.04),
263 fLoadAlignFromCDB(kTRUE),
264 fLoadAlignData("ALL"),
269 fCTPTimeParams(NULL),
274 fParentRawReader(NULL),
278 fSPDTrackleter(NULL),
280 fDiamondProfileSPD(NULL),
281 fDiamondProfile(NULL),
282 fDiamondProfileTPC(NULL),
283 fListOfCosmicTriggers(NULL),
287 fAlignObjArray(NULL),
291 fInitCDBCalled(kFALSE),
292 fCDBSnapshotMode(kFALSE),
293 fSetRunNumberFromDataCalled(kFALSE),
298 fSameQACycle(kFALSE),
299 fInitQACalled(kFALSE),
300 fWriteQAExpertData(kTRUE),
301 fRunPlaneEff(kFALSE),
312 fIsNewRunLoader(kFALSE),
324 fDeclTriggerClasses(""),
329 // create reconstruction object with default parameters
332 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
333 fReconstructor[iDet] = NULL;
334 fUpgradeMask[iDet]=kFALSE;
335 fLoader[iDet] = NULL;
336 fTracker[iDet] = NULL;
338 for (Int_t iDet = 0; iDet < AliQAv1::kNDET; iDet++) {
339 fQACycles[iDet] = 999999 ;
340 fQAWriteExpert[iDet] = kFALSE ;
342 fBeamInt[0][0]=fBeamInt[0][1]=fBeamInt[1][0]=fBeamInt[1][1] = -1;
347 //_____________________________________________________________________________
348 AliReconstruction::AliReconstruction(const AliReconstruction& rec) :
350 fRunVertexFinder(rec.fRunVertexFinder),
351 fRunVertexFinderTracks(rec.fRunVertexFinderTracks),
352 fRunHLTTracking(rec.fRunHLTTracking),
353 fRunMuonTracking(rec.fRunMuonTracking),
354 fRunV0Finder(rec.fRunV0Finder),
355 fRunCascadeFinder(rec.fRunCascadeFinder),
356 fRunMultFinder(rec.fRunMultFinder),
357 fStopOnError(rec.fStopOnError),
358 fWriteAlignmentData(rec.fWriteAlignmentData),
359 fWriteESDfriend(rec.fWriteESDfriend),
360 fFillTriggerESD(rec.fFillTriggerESD),
362 fCleanESD(rec.fCleanESD),
363 fV0DCAmax(rec.fV0DCAmax),
364 fV0CsPmin(rec.fV0CsPmin),
368 fRunLocalReconstruction(rec.fRunLocalReconstruction),
369 fRunTracking(rec.fRunTracking),
370 fFillESD(rec.fFillESD),
371 fDeleteRecPoints(""),
373 fLoadCDB(rec.fLoadCDB),
374 fUseTrackingErrorsForAlignment(rec.fUseTrackingErrorsForAlignment),
375 fGAliceFileName(rec.fGAliceFileName),
376 fRawInput(rec.fRawInput),
377 fESDOutput(rec.fESDOutput),
378 fProofOutputFileName(rec.fProofOutputFileName),
379 fProofOutputLocation(rec.fProofOutputLocation),
380 fProofOutputDataset(rec.fProofOutputDataset),
381 fProofOutputArchive(rec.fProofOutputArchive),
382 fEquipIdMap(rec.fEquipIdMap),
383 fFirstEvent(rec.fFirstEvent),
384 fLastEvent(rec.fLastEvent),
385 fNumberOfEventsPerFile(rec.fNumberOfEventsPerFile),
386 fFractionFriends(rec.fFractionFriends),
388 fLoadAlignFromCDB(rec.fLoadAlignFromCDB),
389 fLoadAlignData(rec.fLoadAlignData),
390 fUseHLTData(rec.fUseHLTData),
394 fCTPTimeParams(NULL),
399 fParentRawReader(NULL),
401 fRecoParam(rec.fRecoParam),
403 fSPDTrackleter(NULL),
405 fDiamondProfileSPD(rec.fDiamondProfileSPD),
406 fDiamondProfile(rec.fDiamondProfile),
407 fDiamondProfileTPC(rec.fDiamondProfileTPC),
408 fListOfCosmicTriggers(NULL),
412 fAlignObjArray(rec.fAlignObjArray),
413 fCDBUri(rec.fCDBUri),
414 fQARefUri(rec.fQARefUri),
416 fInitCDBCalled(rec.fInitCDBCalled),
417 fCDBSnapshotMode(rec.fCDBSnapshotMode),
418 fSetRunNumberFromDataCalled(rec.fSetRunNumberFromDataCalled),
419 fQADetectors(rec.fQADetectors),
420 fQATasks(rec.fQATasks),
422 fRunGlobalQA(rec.fRunGlobalQA),
423 fSameQACycle(rec.fSameQACycle),
424 fInitQACalled(rec.fInitQACalled),
425 fWriteQAExpertData(rec.fWriteQAExpertData),
426 fRunPlaneEff(rec.fRunPlaneEff),
437 fIsNewRunLoader(rec.fIsNewRunLoader),
446 fAnalysisMacro(rec.fAnalysisMacro),
449 fDeclTriggerClasses(rec.fDeclTriggerClasses),
456 for (Int_t i = 0; i < rec.fOptions.GetEntriesFast(); i++) {
457 if (rec.fOptions[i]) fOptions.Add(rec.fOptions[i]->Clone());
459 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
460 fReconstructor[iDet] = NULL;
461 fUpgradeMask[iDet] = kFALSE;
462 fLoader[iDet] = NULL;
463 fTracker[iDet] = NULL;
466 for (Int_t iDet = 0; iDet < AliQAv1::kNDET; iDet++) {
467 fQACycles[iDet] = rec.fQACycles[iDet];
468 fQAWriteExpert[iDet] = rec.fQAWriteExpert[iDet] ;
471 for (Int_t i = 0; i < rec.fSpecCDBUri.GetEntriesFast(); i++) {
472 if (rec.fSpecCDBUri[i]) fSpecCDBUri.Add(rec.fSpecCDBUri[i]->Clone());
475 for (int i=2;i--;) for (int j=2;j--;) fBeamInt[i][j] = rec.fBeamInt[i][j];
479 //_____________________________________________________________________________
480 AliReconstruction& AliReconstruction::operator = (const AliReconstruction& rec)
482 // assignment operator
483 // Used in PROOF mode
484 // Be very careful while modifing it!
485 // Simple rules to follow:
486 // for persistent data members - use their assignment operators
487 // for non-persistent ones - do nothing or take the default values from constructor
488 // TSelector members should not be touched
489 if(&rec == this) return *this;
491 fRunVertexFinder = rec.fRunVertexFinder;
492 fRunVertexFinderTracks = rec.fRunVertexFinderTracks;
493 fRunHLTTracking = rec.fRunHLTTracking;
494 fRunMuonTracking = rec.fRunMuonTracking;
495 fRunV0Finder = rec.fRunV0Finder;
496 fRunCascadeFinder = rec.fRunCascadeFinder;
497 fRunMultFinder = rec.fRunMultFinder;
498 fStopOnError = rec.fStopOnError;
499 fWriteAlignmentData = rec.fWriteAlignmentData;
500 fWriteESDfriend = rec.fWriteESDfriend;
501 fFillTriggerESD = rec.fFillTriggerESD;
503 fCleanESD = rec.fCleanESD;
504 fV0DCAmax = rec.fV0DCAmax;
505 fV0CsPmin = rec.fV0CsPmin;
509 fRunLocalReconstruction = rec.fRunLocalReconstruction;
510 fRunTracking = rec.fRunTracking;
511 fFillESD = rec.fFillESD;
512 fDeleteRecPoints = rec.fDeleteRecPoints;
513 fDeleteDigits = rec.fDeleteDigits;
514 fLoadCDB = rec.fLoadCDB;
515 fUseTrackingErrorsForAlignment = rec.fUseTrackingErrorsForAlignment;
516 fGAliceFileName = rec.fGAliceFileName;
517 fRawInput = rec.fRawInput;
518 fESDOutput = rec.fESDOutput;
519 fProofOutputFileName = rec.fProofOutputFileName;
520 fProofOutputLocation = rec.fProofOutputLocation;
521 fProofOutputDataset = rec.fProofOutputDataset;
522 fProofOutputArchive = rec.fProofOutputArchive;
523 fEquipIdMap = rec.fEquipIdMap;
524 fFirstEvent = rec.fFirstEvent;
525 fLastEvent = rec.fLastEvent;
526 fNumberOfEventsPerFile = rec.fNumberOfEventsPerFile;
527 fFractionFriends = rec.fFractionFriends;
529 for (Int_t i = 0; i < rec.fOptions.GetEntriesFast(); i++) {
530 if (rec.fOptions[i]) fOptions.Add(rec.fOptions[i]->Clone());
533 fLoadAlignFromCDB = rec.fLoadAlignFromCDB;
534 fLoadAlignData = rec.fLoadAlignData;
535 fUseHLTData = rec.fUseHLTData;
537 delete fRunInfo; fRunInfo = NULL;
538 if (rec.fRunInfo) fRunInfo = new AliRunInfo(*rec.fRunInfo);
540 fEventInfo = rec.fEventInfo;
542 delete fRunScalers; fRunScalers = NULL;
543 if (rec.fRunScalers) fRunScalers = new AliTriggerRunScalers(*rec.fRunScalers);
545 delete fCTPTimeParams; fCTPTimeParams = NULL;
546 if (rec.fCTPTimeParams) fCTPTimeParams = new AliCTPTimeParams(*rec.fCTPTimeParams);
547 delete fCTPTimeAlign; fCTPTimeAlign = NULL;
548 if (rec.fCTPTimeAlign) fCTPTimeAlign = new AliCTPTimeParams(*rec.fCTPTimeAlign);
552 fParentRawReader = NULL;
554 fRecoParam = rec.fRecoParam;
556 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
557 fUpgradeMask[iDet] = kFALSE;
558 delete fReconstructor[iDet]; fReconstructor[iDet] = NULL;
559 delete fLoader[iDet]; fLoader[iDet] = NULL;
560 delete fTracker[iDet]; fTracker[iDet] = NULL;
563 for (Int_t iDet = 0; iDet < AliQAv1::kNDET; iDet++) {
564 fQACycles[iDet] = rec.fQACycles[iDet];
565 fQAWriteExpert[iDet] = rec.fQAWriteExpert[iDet] ;
568 delete fSPDTrackleter; fSPDTrackleter = NULL;
570 delete fDiamondProfileSPD; fDiamondProfileSPD = NULL;
571 if (rec.fDiamondProfileSPD) fDiamondProfileSPD = new AliESDVertex(*rec.fDiamondProfileSPD);
572 delete fDiamondProfile; fDiamondProfile = NULL;
573 if (rec.fDiamondProfile) fDiamondProfile = new AliESDVertex(*rec.fDiamondProfile);
574 delete fDiamondProfileTPC; fDiamondProfileTPC = NULL;
575 if (rec.fDiamondProfileTPC) fDiamondProfileTPC = new AliESDVertex(*rec.fDiamondProfileTPC);
577 delete fListOfCosmicTriggers; fListOfCosmicTriggers = NULL;
578 if (rec.fListOfCosmicTriggers) fListOfCosmicTriggers = (THashTable*)((rec.fListOfCosmicTriggers)->Clone());
580 delete fGRPData; fGRPData = NULL;
581 // if (rec.fGRPData) fGRPData = (TMap*)((rec.fGRPData)->Clone());
582 if (rec.fGRPData) fGRPData = (AliGRPObject*)((rec.fGRPData)->Clone());
584 delete fAlignObjArray; fAlignObjArray = NULL;
587 fQARefUri = rec.fQARefUri;
588 fSpecCDBUri.Delete();
589 fInitCDBCalled = rec.fInitCDBCalled;
590 fCDBSnapshotMode = rec.fCDBSnapshotMode;
591 fSetRunNumberFromDataCalled = rec.fSetRunNumberFromDataCalled;
592 fQADetectors = rec.fQADetectors;
593 fQATasks = rec.fQATasks;
595 fRunGlobalQA = rec.fRunGlobalQA;
596 fSameQACycle = rec.fSameQACycle;
597 fInitQACalled = rec.fInitQACalled;
598 fWriteQAExpertData = rec.fWriteQAExpertData;
599 fRunPlaneEff = rec.fRunPlaneEff;
600 for (int i=2;i--;) for (int j=2;j--;) fBeamInt[i][j] = rec.fBeamInt[i][j];
610 fIsNewRunLoader = rec.fIsNewRunLoader;
619 fAnalysisMacro = rec.fAnalysisMacro;
622 fDeclTriggerClasses = rec.fDeclTriggerClasses;
627 //_____________________________________________________________________________
628 AliReconstruction::~AliReconstruction()
633 if (fListOfCosmicTriggers) {
634 fListOfCosmicTriggers->Delete();
635 delete fListOfCosmicTriggers;
639 delete fCTPTimeParams;
640 delete fCTPTimeAlign;
642 if (fAlignObjArray) {
643 fAlignObjArray->Delete();
644 delete fAlignObjArray;
646 fSpecCDBUri.Delete();
648 AliCodeTimer::Instance()->Print();
651 //_____________________________________________________________________________
652 void AliReconstruction::InitQA()
654 //Initialize the QA and start of cycle
655 AliCodeTimerAuto("",0);
657 if (fInitQACalled) return;
658 fInitQACalled = kTRUE;
660 if (fGRPData) AliQADataMaker::SetCloningRequest( fGRPData->GetQATrigClasses(), fGRPData->GetQACloningRequest());
663 AliQAManager * qam = AliQAManager::QAManager(AliQAv1::kRECMODE) ;
664 if (fWriteQAExpertData)
665 qam->SetWriteExpert() ;
667 if (qam->IsDefaultStorageSet()) {
668 AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
669 AliWarning("Default QA reference storage has been already set !");
670 AliWarning(Form("Ignoring the default storage declared in AliReconstruction: %s",fQARefUri.Data()));
671 AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
672 fQARefUri = qam->GetDefaultStorage()->GetURI();
674 if (fQARefUri.Length() > 0) {
675 AliDebug(2,"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
676 AliDebug(2, Form("Default QA reference storage is set to: %s", fQARefUri.Data()));
677 AliDebug(2, "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
679 fQARefUri="local://$ALICE_ROOT/QAref";
680 AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
681 AliWarning("Default QA refeference storage not yet set !!!!");
682 AliWarning(Form("Setting it now to: %s", fQARefUri.Data()));
683 AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
686 qam->SetDefaultStorage(fQARefUri);
690 qam->SetActiveDetectors(fQADetectors) ;
691 for (Int_t det = 0 ; det < AliQAv1::kNDET ; det++) {
692 qam->SetCycleLength(AliQAv1::DETECTORINDEX_t(det), fQACycles[det]) ;
693 qam->SetWriteExpert(AliQAv1::DETECTORINDEX_t(det)) ;
695 if (!fRawReader && !fInput && IsInTasks(AliQAv1::kRAWS))
696 fQATasks.ReplaceAll(Form("%d",AliQAv1::kRAWS), "") ;
697 qam->SetTasks(fQATasks) ;
698 qam->InitQADataMaker(AliCDBManager::Instance()->GetRun()) ;
701 Bool_t sameCycle = kFALSE ;
702 AliQADataMaker *qadm = qam->GetQADataMaker(AliQAv1::kGLOBAL);
703 AliInfo(Form("Initializing the global QA data maker"));
704 if (IsInTasks(AliQAv1::kRECPOINTS)) {
705 qadm->StartOfCycle(AliQAv1::kRECPOINTS, AliCDBManager::Instance()->GetRun(), sameCycle) ;
706 TObjArray **arr=qadm->Init(AliQAv1::kRECPOINTS);
707 AliTracker::SetResidualsArray(arr);
710 if (IsInTasks(AliQAv1::kESDS)) {
711 qadm->StartOfCycle(AliQAv1::kESDS, AliCDBManager::Instance()->GetRun(), sameCycle) ;
712 qadm->Init(AliQAv1::kESDS);
715 AliSysInfo::AddStamp("InitQA") ;
718 //_____________________________________________________________________________
719 void AliReconstruction::MergeQA(const char *fileName)
721 //Initialize the QA and start of cycle
722 AliCodeTimerAuto("",0) ;
723 AliQAManager::QAManager()->Merge(AliCDBManager::Instance()->GetRun(),fileName) ;
724 AliSysInfo::AddStamp("MergeQA") ;
727 //_____________________________________________________________________________
728 void AliReconstruction::InitCDB()
730 // activate a default CDB storage
731 // First check if we have any CDB storage set, because it is used
732 // to retrieve the calibration and alignment constants
733 AliCodeTimerAuto("",0);
735 if (fInitCDBCalled) return;
736 fInitCDBCalled = kTRUE;
738 AliCDBManager* man = AliCDBManager::Instance();
739 if (man->IsDefaultStorageSet())
741 AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
742 AliWarning("Default CDB storage has been already set !");
743 AliWarning(Form("Ignoring the default storage declared in AliReconstruction: %s",fCDBUri.Data()));
744 AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
745 fCDBUri = man->GetDefaultStorage()->GetURI();
748 if (fCDBUri.Length() > 0)
750 AliDebug(2,"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
751 AliDebug(2, Form("Default CDB storage is set to: %s", fCDBUri.Data()));
752 AliDebug(2, "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
753 man->SetDefaultStorage(fCDBUri);
755 else if (!man->GetRaw()){
756 fCDBUri="local://$ALICE_ROOT/OCDB";
757 AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
758 AliWarning("Default CDB storage not yet set !!!!");
759 AliWarning(Form("Setting it now to: %s", fCDBUri.Data()));
760 AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
761 man->SetDefaultStorage(fCDBUri);
764 AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
765 AliWarning("Default storage will be set after setting the Run Number!!!");
766 AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
770 // Now activate the detector specific CDB storage locations
771 for (Int_t i = 0; i < fSpecCDBUri.GetEntriesFast(); i++) {
772 TObject* obj = fSpecCDBUri[i];
774 AliDebug(2, "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
775 AliDebug(2, Form("Specific CDB storage for %s is set to: %s",obj->GetName(),obj->GetTitle()));
776 AliDebug(2, "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
777 man->SetSpecificStorage(obj->GetName(), obj->GetTitle());
779 AliSysInfo::AddStamp("InitCDB");
782 //_____________________________________________________________________________
783 void AliReconstruction::SetCDBSnapshotMode(const char* snapshotFileName) {
784 fCDBSnapshotMode = kTRUE;
785 AliCDBManager::Instance()->SetSnapshotMode(snapshotFileName);
788 //_____________________________________________________________________________
789 void AliReconstruction::SetDefaultStorage(const char* uri) {
790 // Store the desired default CDB storage location
791 // Activate it later within the Run() method
797 //_____________________________________________________________________________
798 void AliReconstruction::SetQARefDefaultStorage(const char* uri) {
799 // Store the desired default CDB storage location
800 // Activate it later within the Run() method
803 AliQAv1::SetQARefStorage(fQARefUri.Data()) ;
806 //_____________________________________________________________________________
807 void AliReconstruction::SetSpecificStorage(const char* calibType, const char* uri) {
808 // Store a detector-specific CDB storage location
809 // Activate it later within the Run() method
811 AliCDBPath aPath(calibType);
812 if(!aPath.IsValid()){
813 // if calibType is not wildcard but it is a valid detector, add "/*" to make it a valid path
814 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
815 if(!strcmp(calibType, fgkDetectorName[iDet])) {
816 aPath.SetPath(Form("%s/*", calibType));
817 AliInfo(Form("Path for specific storage set to %s", aPath.GetPath().Data()));
821 if(!aPath.IsValid()){
822 AliError(Form("Not a valid path or detector: %s", calibType));
827 // // check that calibType refers to a "valid" detector name
828 // Bool_t isDetector = kFALSE;
829 // for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
830 // TString detName = fgkDetectorName[iDet];
831 // if(aPath.GetLevel0() == detName) {
832 // isDetector = kTRUE;
838 // AliError(Form("Not a valid detector: %s", aPath.GetLevel0().Data()));
842 TObject* obj = fSpecCDBUri.FindObject(aPath.GetPath().Data());
843 if (obj) fSpecCDBUri.Remove(obj);
844 fSpecCDBUri.Add(new TNamed(aPath.GetPath().Data(), uri));
848 //_____________________________________________________________________________
849 Bool_t AliReconstruction::SetRunNumberFromData()
851 // The method is called in Run() in order
852 // to set a correct run number.
853 // In case of raw data reconstruction the
854 // run number is taken from the raw data header
856 if (fSetRunNumberFromDataCalled) return kTRUE;
857 fSetRunNumberFromDataCalled = kTRUE;
859 AliCDBManager* man = AliCDBManager::Instance();
862 if(fRawReader->NextEvent()) {
863 if(man->GetRun() > 0) {
864 AliWarning("Run number is taken from raw-event header! Ignoring settings in AliCDBManager!");
866 man->SetRun(fRawReader->GetRunNumber());
868 fRawReader->RewindEvents();
871 if(man->GetRun() > 0) {
872 AliWarning("No raw-data events are found ! Using settings in AliCDBManager !");
875 AliWarning("Neither raw events nor settings in AliCDBManager are found !");
881 AliRunLoader *rl = AliRunLoader::Open(fGAliceFileName.Data());
883 AliError(Form("No run loader found in file %s", fGAliceFileName.Data()));
888 // read run number from gAlice
889 if(rl->GetHeader()) {
890 man->SetRun(rl->GetHeader()->GetRun());
895 AliError("Neither run-loader header nor RawReader objects are found !");
907 //_____________________________________________________________________________
908 void AliReconstruction::SetCDBLock() {
909 // Set CDB lock: from now on it is forbidden to reset the run number
910 // or the default storage or to activate any further storage!
912 AliCDBManager::Instance()->SetLock(1);
915 //_____________________________________________________________________________
916 void AliReconstruction::MatchUpgradeDetector() {
917 // Translates detector name in a boolean.
918 // The boolean is used in GetReconstructor to load the
919 // upgrade reconstructor instead of the standard one.
920 for(Int_t iDet = 0; iDet < kNDetectors; iDet++) {
921 if(fUpgradeModule.Contains(fgkDetectorName[iDet])) fUpgradeMask[iDet]=kTRUE;
924 //_____________________________________________________________________________
925 Bool_t AliReconstruction::MisalignGeometry(const TString& detectors)
927 // Read the alignment objects from CDB.
928 // Each detector is supposed to have the
929 // alignment objects in DET/Align/Data CDB path.
930 // All the detector objects are then collected,
931 // sorted by geometry level (starting from ALIC) and
932 // then applied to the TGeo geometry.
933 // Finally an overlaps check is performed.
935 // Load alignment data from CDB and fill fAlignObjArray
936 if(fLoadAlignFromCDB){
938 TString detStr = detectors;
939 TString loadAlObjsListOfDets = "";
941 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
942 if(!IsSelected(fgkDetectorName[iDet], detStr)) continue;
943 if(!strcmp(fgkDetectorName[iDet],"HLT")) continue;
945 if(AliGeomManager::GetNalignable(fgkDetectorName[iDet]) != 0)
947 loadAlObjsListOfDets += fgkDetectorName[iDet];
948 loadAlObjsListOfDets += " ";
950 } // end loop over detectors
952 if(AliGeomManager::GetNalignable("GRP") != 0)
953 loadAlObjsListOfDets.Prepend("GRP "); //add alignment objects for non-sensitive modules
954 AliGeomManager::ApplyAlignObjsFromCDB(loadAlObjsListOfDets.Data());
956 // Check if the array with alignment objects was
957 // provided by the user. If yes, apply the objects
958 // to the present TGeo geometry
959 if (fAlignObjArray) {
960 if (gGeoManager && gGeoManager->IsClosed()) {
961 if (AliGeomManager::ApplyAlignObjsToGeom(*fAlignObjArray) == kFALSE) {
962 AliError("The misalignment of one or more volumes failed!"
963 "Compare the list of simulated detectors and the list of detector alignment data!");
968 AliError("Can't apply the misalignment! gGeoManager doesn't exist or it is still opened!");
974 if (fAlignObjArray) {
975 fAlignObjArray->Delete();
976 delete fAlignObjArray; fAlignObjArray=NULL;
982 //_____________________________________________________________________________
983 void AliReconstruction::SetGAliceFile(const char* fileName)
985 // set the name of the galice file
987 fGAliceFileName = fileName;
990 //_____________________________________________________________________________
991 void AliReconstruction::SetInput(const char* input)
993 // In case the input string starts with 'mem://', we run in an online mode
994 // and AliRawReaderDateOnline object is created. In all other cases a raw-data
995 // file is assumed. One can give as an input:
996 // mem://: - events taken from DAQ monitoring libs online
998 // mem://<filename> - emulation of the above mode (via DATE monitoring libs)
999 if (input) fRawInput = input;
1002 //_____________________________________________________________________________
1003 void AliReconstruction::SetOutput(const char* output)
1005 // Set the output ESD filename
1006 // 'output' is a normalt ROOT url
1007 // The method is used in case of raw-data reco with PROOF
1008 if (output) fESDOutput = output;
1011 //_____________________________________________________________________________
1012 void AliReconstruction::SetOption(const char* detector, const char* option)
1014 // set options for the reconstruction of a detector
1016 TObject* obj = fOptions.FindObject(detector);
1017 if (obj) fOptions.Remove(obj);
1018 fOptions.Add(new TNamed(detector, option));
1021 //_____________________________________________________________________________
1022 void AliReconstruction::SetRecoParam(const char* detector, AliDetectorRecoParam *par)
1024 // Set custom reconstruction parameters for a given detector
1025 // Single set of parameters for all the events
1027 // First check if the reco-params are global
1028 if(!strcmp(detector, "GRP")) {
1029 par->SetAsDefault();
1030 fRecoParam.AddDetRecoParam(kNDetectors,par);
1034 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
1035 if(!strcmp(detector, fgkDetectorName[iDet])) {
1036 par->SetAsDefault();
1037 fRecoParam.AddDetRecoParam(iDet,par);
1044 //_____________________________________________________________________________
1045 Bool_t AliReconstruction::InitGRP() {
1046 //------------------------------------
1047 // Initialization of the GRP entry
1048 //------------------------------------
1049 AliCDBEntry* entry = AliCDBManager::Instance()->Get("GRP/GRP/Data");
1053 TMap* m = dynamic_cast<TMap*>(entry->GetObject()); // old GRP entry
1056 AliInfo("Found a TMap in GRP/GRP/Data, converting it into an AliGRPObject");
1058 fGRPData = new AliGRPObject();
1059 fGRPData->ReadValuesFromMap(m);
1063 AliInfo("Found an AliGRPObject in GRP/GRP/Data, reading it");
1064 fGRPData = dynamic_cast<AliGRPObject*>(entry->GetObject()); // new GRP entry
1068 // FIX ME: The unloading of GRP entry is temporarily disabled
1069 // because ZDC and VZERO are using it in order to initialize
1070 // their reconstructor objects. In the future one has to think
1071 // of propagating AliRunInfo to the reconstructors.
1072 // AliCDBManager::Instance()->UnloadFromCache("GRP/GRP/Data");
1076 AliError("No GRP entry found in OCDB!");
1080 TString lhcState = fGRPData->GetLHCState();
1081 if (lhcState==AliGRPObject::GetInvalidString()) {
1082 AliError("GRP/GRP/Data entry: missing value for the LHC state ! Using UNKNOWN");
1083 lhcState = "UNKNOWN";
1086 TString beamType = fGRPData->GetBeamType();
1087 if (beamType==AliGRPObject::GetInvalidString()) {
1088 AliError("GRP/GRP/Data entry: missing value for the beam type ! Using UNKNOWN");
1089 beamType = "UNKNOWN";
1092 Float_t beamEnergy = fGRPData->GetBeamEnergy();
1093 if (beamEnergy==AliGRPObject::GetInvalidFloat()) {
1094 AliError("GRP/GRP/Data entry: missing value for the beam energy ! Using 0");
1098 TString runType = fGRPData->GetRunType();
1099 if (runType==AliGRPObject::GetInvalidString()) {
1100 AliError("GRP/GRP/Data entry: missing value for the run type ! Using UNKNOWN");
1101 runType = "UNKNOWN";
1104 Int_t activeDetectors = fGRPData->GetDetectorMask();
1105 if (activeDetectors==AliGRPObject::GetInvalidUInt()) {
1106 AliError("GRP/GRP/Data entry: missing value for the detector mask ! Using 1074790399");
1107 activeDetectors = 1074790399;
1109 AliDebug(1, Form("activeDetectors = %d", activeDetectors));
1111 fRunInfo = new AliRunInfo(lhcState, beamType, beamEnergy, runType, activeDetectors);
1115 // Process the list of active detectors
1116 if (activeDetectors) {
1117 UInt_t detMask = activeDetectors;
1118 AliDebug(1, Form("Detector List = %s", fRunLocalReconstruction.Data()));
1119 fRunLocalReconstruction = MatchDetectorList(fRunLocalReconstruction,detMask);
1120 AliDebug(1, Form("Detector List = %s", fRunLocalReconstruction.Data()));
1121 fRunTracking = MatchDetectorList(fRunTracking,detMask);
1122 fFillESD = MatchDetectorList(fFillESD,detMask);
1123 fQADetectors = MatchDetectorList(fQADetectors,detMask);
1124 fDeleteRecPoints = MatchDetectorList(fDeleteRecPoints,detMask);
1125 fDeleteDigits = MatchDetectorList(fDeleteDigits,detMask);
1126 fLoadCDB.Form("%s %s %s %s",
1127 fRunLocalReconstruction.Data(),
1128 fRunTracking.Data(),
1130 fQADetectors.Data());
1131 fLoadCDB = MatchDetectorList(fLoadCDB,detMask);
1132 if (!((detMask >> AliDAQ::DetectorID("ITSSPD")) & 0x1) &&
1133 !((detMask >> AliDAQ::DetectorID("ITSSDD")) & 0x1) &&
1134 !((detMask >> AliDAQ::DetectorID("ITSSSD")) & 0x1) ) {
1135 // switch off the vertexer
1136 AliInfo("SPD,SDD,SSD is not in the list of active detectors. Vertexer and Trackleter are switched off.");
1137 fRunVertexFinder = kFALSE;
1138 fRunMultFinder = kFALSE;
1140 if (!((detMask >> AliDAQ::DetectorID("TRG")) & 0x1)) {
1141 // switch off the reading of CTP raw-data payload
1142 if (fFillTriggerESD) {
1143 AliInfo("CTP is not in the list of active detectors. CTP data reading switched off.");
1144 fFillTriggerESD = kFALSE;
1149 AliInfo("===================================================================================");
1150 AliInfo(Form("Running local reconstruction for detectors: %s",fRunLocalReconstruction.Data()));
1151 AliInfo(Form("Running tracking for detectors: %s",fRunTracking.Data()));
1152 AliInfo(Form("Filling ESD for detectors: %s",fFillESD.Data()));
1153 AliInfo(Form("Quality assurance is active for detectors: %s",fQADetectors.Data()));
1154 AliInfo(Form("CDB and reconstruction parameters are loaded for detectors: %s",fLoadCDB.Data()));
1155 AliInfo("===================================================================================");
1157 //*** Dealing with the magnetic field map
1158 if ( TGeoGlobalMagField::Instance()->IsLocked() ) {
1159 if (TGeoGlobalMagField::Instance()->GetField()->TestBit(AliMagF::kOverrideGRP)) {
1160 AliInfo("ExpertMode!!! GRP information will be ignored !");
1161 AliInfo("ExpertMode!!! Running with the externally locked B field !");
1164 AliInfo("Destroying existing B field instance!");
1165 delete TGeoGlobalMagField::Instance();
1168 if ( !TGeoGlobalMagField::Instance()->IsLocked() ) {
1169 // Construct the field map out of the information retrieved from GRP.
1172 Float_t l3Current = fGRPData->GetL3Current((AliGRPObject::Stats)0);
1173 if (l3Current == AliGRPObject::GetInvalidFloat()) {
1174 AliError("GRP/GRP/Data entry: missing value for the L3 current !");
1178 Char_t l3Polarity = fGRPData->GetL3Polarity();
1179 if (l3Polarity == AliGRPObject::GetInvalidChar()) {
1180 AliError("GRP/GRP/Data entry: missing value for the L3 polarity !");
1185 Float_t diCurrent = fGRPData->GetDipoleCurrent((AliGRPObject::Stats)0);
1186 if (diCurrent == AliGRPObject::GetInvalidFloat()) {
1187 AliError("GRP/GRP/Data entry: missing value for the dipole current !");
1191 Char_t diPolarity = fGRPData->GetDipolePolarity();
1192 if (diPolarity == AliGRPObject::GetInvalidChar()) {
1193 AliError("GRP/GRP/Data entry: missing value for the dipole polarity !");
1197 // read special bits for the polarity convention and map type
1198 Int_t polConvention = fGRPData->IsPolarityConventionLHC() ? AliMagF::kConvLHC : AliMagF::kConvDCS2008;
1199 Bool_t uniformB = fGRPData->IsUniformBMap();
1202 AliMagF* fld = AliMagF::CreateFieldMap(TMath::Abs(l3Current) * (l3Polarity ? -1:1),
1203 TMath::Abs(diCurrent) * (diPolarity ? -1:1),
1204 polConvention,uniformB,beamEnergy, beamType.Data());
1206 TGeoGlobalMagField::Instance()->SetField( fld );
1207 TGeoGlobalMagField::Instance()->Lock();
1208 AliInfo("Running with the B field constructed out of GRP !");
1210 else AliFatal("Failed to create a B field map !");
1212 else AliFatal("B field is neither set nor constructed from GRP ! Exitig...");
1215 //*** Get the diamond profiles from OCDB
1216 entry = AliCDBManager::Instance()->Get("GRP/Calib/MeanVertexSPD");
1218 fDiamondProfileSPD = dynamic_cast<AliESDVertex*> (entry->GetObject());
1220 AliError("No SPD diamond profile found in OCDB!");
1223 entry = AliCDBManager::Instance()->Get("GRP/Calib/MeanVertex");
1225 fDiamondProfile = dynamic_cast<AliESDVertex*> (entry->GetObject());
1227 AliError("No diamond profile found in OCDB!");
1230 entry = AliCDBManager::Instance()->Get("GRP/Calib/MeanVertexTPC");
1232 fDiamondProfileTPC = dynamic_cast<AliESDVertex*> (entry->GetObject());
1234 AliError("No TPC diamond profile found in OCDB!");
1237 entry = AliCDBManager::Instance()->Get("GRP/Calib/CosmicTriggers");
1239 fListOfCosmicTriggers = dynamic_cast<THashTable*>(entry->GetObject());
1243 if (!fListOfCosmicTriggers) {
1244 AliWarning("Can not get list of cosmic triggers from OCDB! Cosmic event specie will be effectively disabled!");
1250 //_____________________________________________________________________________
1251 Bool_t AliReconstruction::LoadCDB()
1253 // Load CDB entries for all active detectors.
1254 // By default we load all the entries in <det>/Calib
1257 AliCodeTimerAuto("",0);
1259 AliCDBManager::Instance()->Get("GRP/CTP/Config");
1261 AliCDBManager::Instance()->Get("GRP/Calib/LHCClockPhase");
1263 TString detStr = fLoadCDB;
1264 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
1265 if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
1266 AliCDBManager::Instance()->GetAll(Form("%s/Calib/*",fgkDetectorName[iDet]));
1267 AliCDBManager::Instance()->GetAll(Form("%s/Trigger/*",fgkDetectorName[iDet]));
1270 // Temporary fix - one has to define the correct policy in order
1271 // to load the trigger OCDB entries only for the detectors that
1272 // in the trigger or that are needed in order to put correct
1273 // information in ESD
1274 AliCDBManager::Instance()->GetAll("TRIGGER/*/*");
1278 //_____________________________________________________________________________
1279 Bool_t AliReconstruction::LoadTriggerScalersCDB()
1281 // Load CTP scalers from OCDB.
1282 // The scalers are checked for consistency.
1284 AliCodeTimerAuto("",0);
1286 AliCDBEntry* entry = AliCDBManager::Instance()->Get("GRP/CTP/Scalers");
1290 AliInfo("Found an AliTriggerRunScalers in GRP/CTP/Scalers, reading it");
1291 fRunScalers = dynamic_cast<AliTriggerRunScalers*> (entry->GetObject());
1293 if (fRunScalers && (fRunScalers->CorrectScalersOverflow() == 0)) AliInfo("32bit Trigger counters corrected for overflow");
1298 //_____________________________________________________________________________
1299 Bool_t AliReconstruction::LoadCTPTimeParamsCDB()
1301 // Load CTP timing information (alignment)
1304 AliCDBEntry* entry = AliCDBManager::Instance()->Get("GRP/CTP/CTPtiming");
1305 if (!entry) return kFALSE;
1307 AliInfo("Found an AliCTPTimeParams in GRP/CTP/CTPtiming, reading it");
1308 fCTPTimeParams = dynamic_cast<AliCTPTimeParams*> (entry->GetObject());
1311 AliCDBEntry* entry2 = AliCDBManager::Instance()->Get("GRP/CTP/TimeAlign");
1312 if (!entry2) return kFALSE;
1314 AliInfo("Found an AliCTPTimeParams in GRP/CTP/TimeAlign, reading it");
1315 fCTPTimeAlign = dynamic_cast<AliCTPTimeParams*> (entry2->GetObject());
1316 entry2->SetOwner(0);
1321 //_____________________________________________________________________________
1322 Bool_t AliReconstruction::ReadIntensityInfoCDB()
1324 // Load LHC DIP data
1325 AliCDBEntry* entry = AliCDBManager::Instance()->Get("GRP/GRP/LHCData");
1326 AliCDBEntry* entryCTP = AliCDBManager::Instance()->Get("GRP/CTP/Config");
1328 if (!entry || !entryCTP) {
1329 AliError(Form("Failed to extract CDB objects GRP/GRP/LHCData: %p or GRP/CTP/Config: %p",entry,entryCTP));
1333 enum {kA,kB,kC,kE,kNMasks};
1334 AliTriggerConfiguration* conf = (AliTriggerConfiguration*)entryCTP->GetObject();
1335 const TObjArray& clArr = conf->GetClasses();
1336 TObjArray masks(kNMasks);
1338 AliTriggerClass* trClass = 0;
1340 masks.SetOwner(kFALSE);
1342 while ( (trClass=(AliTriggerClass*)next()) ) {
1343 TString trName = trClass->GetName();
1344 int ind = trName.Index("-"); // prefix in front of A,B,C,E
1345 if (ind<1) continue; // anomaly
1347 trName = trName.Data() + ind;
1348 AliTriggerBCMask* bcMask = trClass->GetBCMask();
1349 if (!bcMask) continue;
1351 if (trName.BeginsWith("-A-")) which |= 0x1<<kA;
1352 else if (trName.BeginsWith("-B-")) which |= 0x1<<kB;
1353 else if (trName.BeginsWith("-C-")) which |= 0x1<<kC;
1354 else if (trName.BeginsWith("-E-")) which |= 0x1<<kE;
1355 else if (trName.BeginsWith("-AC-")) which |= (0x1<<kA) | (0x1<<kC);
1356 else if (trName.BeginsWith("-CA-")) which |= (0x1<<kA) | (0x1<<kC);
1357 else { AliWarning(Form("Unknown trigger type %s\n",trClass->GetName())); continue;}
1359 for (int ip=kNMasks;ip--;) {
1360 if ( !(which&(0x1<<ip)) || masks[ip] ) continue; // does not match or already done
1361 masks[ip] = (TObject*)bcMask;
1364 if (nFound==kNMasks) break;
1367 AliInfo("Reading mean bunch intensities from GRP/GRP/LHCData");
1368 AliLHCData* dipData = dynamic_cast<AliLHCData*> (entry->GetObject());
1370 for (int ib=2;ib--;) {
1372 if (dipData && (dipData->GetMeanIntensity(ib,intI,intNI,&masks)>=0)) {
1373 fBeamInt[ib][0] = intI;
1374 fBeamInt[ib][1] = intNI;
1375 AliInfo(Form("Mean intensity for beam %d: Interacting:%.2e Non-Interacting:%.2e",ib,intI,intNI));
1383 //_____________________________________________________________________________
1384 Bool_t AliReconstruction::Run(const char* input)
1387 AliCodeTimerAuto("",0);
1390 if (GetAbort() != TSelector::kContinue) return kFALSE;
1392 TChain *chain = NULL;
1393 if (fRawReader && (chain = fRawReader->GetChain())) {
1394 Long64_t nEntries = (fLastEvent < 0) ? (TChain::kBigNumber) : (fLastEvent - fFirstEvent + 1);
1397 // Temporary fix for long raw-data runs (until socket timeout handling in PROOF is revised)
1398 gProof->Exec("gEnv->SetValue(\"Proof.SocketActivityTimeout\",-1)", kTRUE);
1401 gProof->Exec("TGrid::Connect(\"alien://\")",kTRUE);
1403 TMessage::EnableSchemaEvolutionForAll(kTRUE);
1404 gProof->Exec("TMessage::EnableSchemaEvolutionForAll(kTRUE)",kTRUE);
1406 gProof->AddInput(this);
1408 if (!ParseOutput()) return kFALSE;
1410 gProof->SetParameter("PROOF_MaxSlavesPerNode", 9999);
1412 chain->Process("AliReconstruction","",nEntries,fFirstEvent);
1415 chain->Process(this,"",nEntries,fFirstEvent);
1420 if (GetAbort() != TSelector::kContinue) return kFALSE;
1422 if (GetAbort() != TSelector::kContinue) return kFALSE;
1423 //******* The loop over events
1424 AliInfo("Starting looping over events");
1426 while ((iEvent < fRunLoader->GetNumberOfEvents()) ||
1427 (fRawReader && fRawReader->NextEvent())) {
1429 // check if process has enough resources
1430 if (!HasEnoughResources(iEvent)) break;
1431 if (!ProcessEvent(iEvent)) {
1432 Abort("ProcessEvent",TSelector::kAbortFile);
1437 if (!iEvent) AliWarning("No events passed trigger selection");
1439 if (GetAbort() != TSelector::kContinue) return kFALSE;
1441 if (GetAbort() != TSelector::kContinue) return kFALSE;
1447 //_____________________________________________________________________________
1448 void AliReconstruction::InitRawReader(const char* input)
1450 // Init raw-reader and
1451 // set the input in case of raw data
1453 AliCodeTimerAuto("",0);
1455 if (input) fRawInput = input;
1456 fRawReader = AliRawReader::Create(fRawInput.Data());
1458 if (fRawInput.IsNull()) {
1459 AliInfo("Reconstruction will run over digits");
1462 AliFatal("Can not create raw-data reader ! Exiting...");
1466 if (!fEquipIdMap.IsNull() && fRawReader)
1467 fRawReader->LoadEquipmentIdsMap(fEquipIdMap);
1469 if (!fUseHLTData.IsNull()) {
1470 // create the RawReaderHLT which performs redirection of HLT input data for
1471 // the specified detectors
1472 AliRawReader* pRawReader=AliRawHLTManager::CreateRawReaderHLT(fRawReader, fUseHLTData.Data());
1474 fParentRawReader=fRawReader;
1475 fRawReader=pRawReader;
1477 AliError(Form("can not create Raw Reader for HLT input %s", fUseHLTData.Data()));
1480 AliSysInfo::AddStamp("CreateRawReader");
1483 //_____________________________________________________________________________
1484 void AliReconstruction::InitRun(const char* input)
1486 // Initialization of raw-reader,
1487 // run number, CDB etc.
1488 AliCodeTimerAuto("",0);
1489 AliSysInfo::AddStamp("Start");
1491 // Initialize raw-reader if any
1492 InitRawReader(input);
1494 // Initialize the CDB storage
1497 // Set run number in CDBManager (if it is not already set by the user)
1498 if (!SetRunNumberFromData()) {
1499 Abort("SetRunNumberFromData", TSelector::kAbortProcess);
1503 // Set CDB lock: from now on it is forbidden to reset the run number
1504 // or the default storage or to activate any further storage!
1509 //_____________________________________________________________________________
1510 void AliReconstruction::Begin(TTree *)
1512 // Initialize AlReconstruction before
1513 // going into the event loop
1514 // Should follow the TSelector convention
1515 // i.e. initialize only the object on the client side
1516 AliCodeTimerAuto("",0);
1518 AliReconstruction *reco = NULL;
1520 if ((reco = (AliReconstruction*)fInput->FindObject("AliReconstruction"))) {
1523 AliSysInfo::AddStamp("ReadInputInBegin");
1526 // Import ideal TGeo geometry and apply misalignment
1528 TString geom(gSystem->DirName(fGAliceFileName));
1529 geom += "/geometry.root";
1530 AliGeomManager::LoadGeometry(geom.Data());
1532 Abort("LoadGeometry", TSelector::kAbortProcess);
1535 AliSysInfo::AddStamp("LoadGeom");
1536 TString detsToCheck=fRunLocalReconstruction;
1537 if(!AliGeomManager::CheckSymNamesLUT(detsToCheck.Data())) {
1538 Abort("CheckSymNamesLUT", TSelector::kAbortProcess);
1541 AliSysInfo::AddStamp("CheckGeom");
1544 Bool_t toCDBSnapshot=kFALSE;
1545 TString snapshotFileOut(""); // we could use fSnapshotFileName if we are not interested
1546 // in reading from and writing to a snapshot file at the same time
1547 if(TString(getenv("OCDB_SNAPSHOT_CREATE")) == TString("kTRUE")){
1548 toCDBSnapshot=kTRUE;
1549 //fFromCDBSnapshot=kFALSE;
1550 TString snapshotFile(getenv("OCDB_SNAPSHOT_FILENAME"));
1551 if(!(snapshotFile.IsNull() || snapshotFile.IsWhitespace()))
1552 snapshotFileOut = snapshotFile;
1554 snapshotFileOut="OCDB.root";
1557 if (!MisalignGeometry(fLoadAlignData)) {
1558 Abort("MisalignGeometry", TSelector::kAbortProcess);
1561 AliCDBManager::Instance()->UnloadFromCache("GRP/Geometry/Data");
1562 if(!toCDBSnapshot) AliCDBManager::Instance()->UnloadFromCache("*/Align/*");
1563 AliSysInfo::AddStamp("MisalignGeom");
1566 Abort("InitGRP", TSelector::kAbortProcess);
1569 AliSysInfo::AddStamp("InitGRP");
1570 if(!toCDBSnapshot) AliCDBManager::Instance()->UnloadFromCache("GRP/Calib/CosmicTriggers");
1572 if(!fCDBSnapshotMode || toCDBSnapshot){
1574 Abort("LoadCDB", TSelector::kAbortProcess);
1577 AliSysInfo::AddStamp("LoadCDB");
1580 if (!LoadTriggerScalersCDB()) {
1581 Abort("LoadTriggerScalersCDB", TSelector::kAbortProcess);
1584 AliSysInfo::AddStamp("LoadTriggerScalersCDB");
1586 if (!LoadCTPTimeParamsCDB()) {
1587 Abort("LoadCTPTimeParamsCDB", TSelector::kAbortProcess);
1590 AliSysInfo::AddStamp("LoadCTPTimeParamsCDB");
1592 if (!ReadIntensityInfoCDB()) {
1593 Abort("ReadIntensityInfoCDB", TSelector::kAbortProcess);
1596 AliSysInfo::AddStamp("ReadIntensityInfoCDB");
1598 // Read the reconstruction parameters from OCDB
1599 if (!InitRecoParams()) {
1600 AliWarning("Not all detectors have correct RecoParam objects initialized");
1602 AliSysInfo::AddStamp("InitRecoParams");
1606 AliCDBManager::Instance()->DumpToSnapshotFile(snapshotFileOut.Data(),kFALSE);
1607 AliCDBManager::Instance()->UnloadFromCache("*/Align/*");
1608 AliCDBManager::Instance()->UnloadFromCache("GRP/Calib/CosmicTriggers");
1611 if (fInput && gProof) {
1612 if (reco) *reco = *this;
1614 gGeoManager->SetName("Geometry");
1615 gProof->AddInputData(gGeoManager,kTRUE);
1617 gProof->AddInputData(const_cast<TMap*>(AliCDBManager::Instance()->GetEntryCache()),kTRUE);
1618 fInput->Add(new TParameter<Int_t>("RunNumber",AliCDBManager::Instance()->GetRun()));
1619 AliMagF *magFieldMap = (AliMagF*)TGeoGlobalMagField::Instance()->GetField();
1620 magFieldMap->SetName("MagneticFieldMap");
1621 gProof->AddInputData(magFieldMap,kTRUE);
1623 fAnalysis->SetName("Analysis");
1624 gProof->AddInputData(fAnalysis,kTRUE);
1630 //_____________________________________________________________________________
1631 void AliReconstruction::SlaveBegin(TTree*)
1633 // Initialization related to run-loader,
1634 // vertexer, trackers, recontructors
1635 // In proof mode it is executed on the slave
1636 AliCodeTimerAuto("",0);
1638 TProofOutputFile *outProofFile = NULL;
1640 if (AliDebugLevel() > 0) fInput->Print();
1641 if (AliDebugLevel() > 10) fInput->Dump();
1642 if (AliReconstruction *reco = (AliReconstruction*)fInput->FindObject("AliReconstruction")) {
1645 if (TGeoManager *tgeo = (TGeoManager*)fInput->FindObject("Geometry")) {
1647 AliGeomManager::SetGeometry(tgeo);
1649 if (TMap *entryCache = (TMap*)fInput->FindObject("CDBEntryCache")) {
1650 Int_t runNumber = -1;
1651 if (TProof::GetParameter(fInput,"RunNumber",runNumber) == 0) {
1652 AliCDBManager *man = AliCDBManager::Instance(entryCache,runNumber);
1653 man->SetCacheFlag(kTRUE);
1654 man->SetLock(kTRUE);
1658 if (AliMagF *map = (AliMagF*)fInput->FindObject("MagneticFieldMap")) {
1659 AliMagF *newMap = new AliMagF(*map);
1660 if (!newMap->LoadParameterization()) {
1661 Abort("AliMagF::LoadParameterization", TSelector::kAbortProcess);
1664 TGeoGlobalMagField::Instance()->SetField(newMap);
1665 TGeoGlobalMagField::Instance()->Lock();
1668 // Attempt to get the analysis manager from the input list
1669 fAnalysis = (AliAnalysisManager*)fInput->FindObject("Analysis");
1670 if (fAnalysis) AliInfo("==== Analysis manager retrieved from input list ====");
1672 if (TNamed *outputFileName = (TNamed*)fInput->FindObject("PROOF_OUTPUTFILE"))
1673 fProofOutputFileName = outputFileName->GetTitle();
1674 if (TNamed *outputLocation = (TNamed*)fInput->FindObject("PROOF_OUTPUTFILE_LOCATION"))
1675 fProofOutputLocation = outputLocation->GetTitle();
1676 if (fInput->FindObject("PROOF_OUTPUTFILE_DATASET"))
1677 fProofOutputDataset = kTRUE;
1678 if (TNamed *archiveList = (TNamed*)fInput->FindObject("PROOF_OUTPUTFILE_ARCHIVE"))
1679 fProofOutputArchive = archiveList->GetTitle();
1680 if (!fProofOutputFileName.IsNull() &&
1681 !fProofOutputLocation.IsNull() &&
1682 fProofOutputArchive.IsNull()) {
1683 if (!fProofOutputDataset) {
1684 outProofFile = new TProofOutputFile(fProofOutputFileName.Data(),"M");
1685 outProofFile->SetOutputFileName(Form("%s%s",fProofOutputLocation.Data(),fProofOutputFileName.Data()));
1688 outProofFile = new TProofOutputFile(fProofOutputFileName.Data(),"DROV",fProofOutputLocation.Data());
1690 if (AliDebugLevel() > 0) outProofFile->Dump();
1691 fOutput->Add(outProofFile);
1693 AliSysInfo::AddStamp("ReadInputInSlaveBegin");
1695 // Check if analysis was requested in the reconstruction event loop
1697 // Attempt to connect in-memory singleton
1698 fAnalysis = AliAnalysisManager::GetAnalysisManager();
1699 if (fAnalysis) AliInfo(Form("==== Analysis manager <%s> found in memory ====", fAnalysis->GetName()));
1700 // Check if an analysis macro was specified
1701 if (!fAnalysis && !fAnalysisMacro.IsNull()) {
1702 // Run specified analysis macro
1703 gROOT->ProcessLine(Form(".x %s",fAnalysisMacro.Data()));
1704 fAnalysis = AliAnalysisManager::GetAnalysisManager();
1705 if (!fAnalysis) AliError(Form("No analysis manager produced by analysis macro %s", fAnalysisMacro.Data()));
1706 else AliInfo(Form("==== Analysis manager <%s> produced by analysis macro <%s> ====",
1707 fAnalysis->GetName(), fAnalysisMacro.Data()));
1711 // get the run loader
1712 if (!InitRunLoader()) {
1713 Abort("InitRunLoader", TSelector::kAbortProcess);
1716 AliSysInfo::AddStamp("LoadLoader");
1718 ftVertexer = new AliVertexerTracks(AliTracker::GetBz());
1721 if (!fRunTracking.IsNull() && !CreateTrackers(fRunTracking)) {
1722 Abort("CreateTrackers", TSelector::kAbortProcess);
1725 AliSysInfo::AddStamp("CreateTrackers");
1727 // create the ESD output file and tree
1728 if (!outProofFile) {
1729 ffile = TFile::Open("AliESDs.root", "RECREATE");
1730 ffile->SetCompressionLevel(2);
1731 if (!ffile->IsOpen()) {
1732 Abort("OpenESDFile", TSelector::kAbortProcess);
1737 AliInfo(Form("Opening output PROOF file: %s/%s",
1738 outProofFile->GetDir(), outProofFile->GetFileName()));
1739 if (!(ffile = outProofFile->OpenFile("RECREATE"))) {
1740 Abort(Form("Problems opening output PROOF file: %s/%s",
1741 outProofFile->GetDir(), outProofFile->GetFileName()),
1742 TSelector::kAbortProcess);
1747 ftree = new TTree("esdTree", "Tree with ESD objects");
1748 fesd = new AliESDEvent();
1749 fesd->CreateStdContent();
1750 // add a so far non-std object to the ESD, this will
1751 // become part of the std content
1752 fesd->AddObject(new AliESDHLTDecision);
1754 fesd->WriteToTree(ftree);
1755 if (fWriteESDfriend) {
1756 ffileF = TFile::Open("AliESDfriends.root", "RECREATE");
1757 ftreeF = new TTree("esdFriendTree", "Tree with ESD Friend objects");
1758 fesdf = new AliESDfriend();
1759 ftreeF->Branch("ESDfriend.","AliESDfriend", &fesdf);
1760 fesd->AddObject(fesdf);
1763 ftree->GetUserInfo()->Add(fesd);
1765 fhlttree = new TTree("HLTesdTree", "Tree with HLT ESD objects");
1766 fhltesd = new AliESDEvent();
1767 fhltesd->CreateStdContent();
1768 // read the ESD template from CDB
1769 // HLT is allowed to put non-std content to its ESD, the non-std
1770 // objects need to be created before invocation of WriteToTree in
1771 // order to create all branches. Initialization is done from an
1772 // ESD layout template in CDB
1773 AliCDBManager* man = AliCDBManager::Instance();
1774 AliCDBEntry* hltESDConfig = man->Get("HLT/Calib/esdLayout");
1775 AliESDEvent* pESDLayout=dynamic_cast<AliESDEvent*>(hltESDConfig->GetObject());
1777 // init all internal variables from the list of objects
1778 pESDLayout->GetStdContent();
1780 // copy content and create non-std objects
1781 *fhltesd=*pESDLayout;
1784 AliError(Form("error setting hltEsd layout from \"HLT/Calib/esdLayout\": invalid object type"));
1787 fhltesd->WriteToTree(fhlttree);
1788 fhlttree->GetUserInfo()->Add(fhltesd);
1790 ProcInfo_t procInfo;
1791 gSystem->GetProcInfo(&procInfo);
1792 AliInfo(Form("Current memory usage %ld %ld", procInfo.fMemResident, procInfo.fMemVirtual));
1795 //Initialize the QA and start of cycle
1796 if (fRunQA || fRunGlobalQA)
1799 //Initialize the Plane Efficiency framework
1800 if (fRunPlaneEff && !InitPlaneEff()) {
1801 Abort("InitPlaneEff", TSelector::kAbortProcess);
1805 if (strcmp(gProgName,"alieve") == 0)
1806 fRunAliEVE = InitAliEVE();
1807 // If we have an analysis manager, connect the AliRecoInputHandler here
1809 if (!dynamic_cast<AliRecoInputHandler*>(fAnalysis->GetInputEventHandler())) {
1810 AliError("Analysis manager used in reconstruction should use AliRecoInputHandler - \
1811 \n ->Replacing with AliRecoInputHandler instance.");
1812 delete fAnalysis->GetInputEventHandler();
1814 // Set the event and other data pointers
1815 fRecoHandler = new AliRecoInputHandler();
1816 // fRecoHandler->Init(ftree, "LOCAL");
1817 fRecoHandler->SetEvent(fesd);
1818 fRecoHandler->SetESDfriend(fesdf);
1819 fRecoHandler->SetHLTEvent(fhltesd);
1820 fRecoHandler->SetHLTTree(fhlttree);
1821 fAnalysis->SetInputEventHandler(fRecoHandler);
1822 // Enter external loop mode
1823 fAnalysis->SetExternalLoop(kTRUE);
1824 // Initialize analysis
1825 fAnalysis->SlaveBegin(ftree);
1826 fAnalysis->StartAnalysis("local", (TTree*)0);
1827 // Connect ESD tree with the input container
1828 fAnalysis->GetCommonInputContainer()->SetData(ftree);
1833 //_____________________________________________________________________________
1834 Bool_t AliReconstruction::Process(Long64_t entry)
1836 // run the reconstruction over a single entry
1837 // from the chain with raw data
1838 AliCodeTimerAuto("",0);
1840 TTree *currTree = fChain->GetTree();
1841 AliRawVEvent *event = NULL;
1842 currTree->SetBranchAddress("rawevent",&event);
1843 currTree->GetEntry(entry);
1844 fRawReader = new AliRawReaderRoot(event);
1845 // check if process has enough resources
1846 if (!HasEnoughResources(entry)) return kFALSE;
1847 fStatus = ProcessEvent(fRunLoader->GetNumberOfEvents());
1855 //_____________________________________________________________________________
1856 void AliReconstruction::Init(TTree *tree)
1858 // Implementation of TSelector::Init()
1861 AliError("The input tree is not found!");
1867 //_____________________________________________________________________________
1868 Bool_t AliReconstruction::ProcessEvent(Int_t iEvent)
1870 // run the reconstruction over a single event
1871 // The event loop is steered in Run method
1874 static Long_t oldMres=0;
1875 static Long_t oldMvir=0;
1876 static Float_t oldCPU=0;
1877 static Long_t aveDMres=0;
1878 static Long_t aveDMvir=0;
1879 static Float_t aveDCPU=0;
1881 AliCodeTimerAuto("",0);
1885 AliSysInfo::AddStamp(Form("StartEv_%d",iEvent), 0,0,iEvent);
1887 if (iEvent >= fRunLoader->GetNumberOfEvents()) {
1888 fRunLoader->SetEventNumber(iEvent);
1890 fRunLoader->GetHeader()->Reset(fRawReader->GetRunNumber(),
1892 fRunLoader->TreeE()->Fill();
1894 if (fRawReader && fRawReader->UseAutoSaveESD())
1895 fRunLoader->TreeE()->AutoSave("SaveSelf");
1898 if ((iEvent < fFirstEvent) || ((fLastEvent >= 0) && (iEvent > fLastEvent))) {
1903 fRunLoader->GetEvent(iEvent);
1905 // Fill Event-info object
1907 fRecoParam.SetEventSpecie(fRunInfo,fEventInfo,fListOfCosmicTriggers);
1909 ProcInfo_t procInfo;
1910 if(iEvent==fFirstEvent) {
1911 gSystem->GetProcInfo(&procInfo);
1912 oldMres=procInfo.fMemResident;
1913 oldMvir=procInfo.fMemVirtual;
1914 oldCPU=procInfo.fCpuUser+procInfo.fCpuSys;
1916 AliInfo(Form("================================= Processing event %d of type %-10s ==================================", iEvent,fRecoParam.PrintEventSpecie()));
1918 AliSysInfo::AddStamp(Form("StartReco_%d",iEvent), 0,0,iEvent);
1920 // Set the reco-params
1922 TString detStr = fLoadCDB;
1923 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
1924 if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
1925 AliReconstructor *reconstructor = GetReconstructor(iDet);
1926 if (reconstructor && fRecoParam.GetDetRecoParamArray(iDet)) {
1927 const AliDetectorRecoParam *par = fRecoParam.GetDetRecoParam(iDet);
1928 reconstructor->SetRecoParam(par);
1929 reconstructor->GetPidSettings(&pid);
1930 reconstructor->SetEventInfo(&fEventInfo);
1932 AliQAManager::QAManager()->SetEventInfo(&fEventInfo) ;
1933 AliQAManager::QAManager()->SetRecoParam(iDet, par) ;
1934 if (par) AliQAManager::QAManager()->SetEventSpecie(AliRecoParam::Convert(par->GetEventSpecie())) ;
1939 if (fRunQA || fRunGlobalQA) AliQADataMaker::SetEventTrigClasses(fEventInfo.GetTriggerClasses()); // RS: select which histo clones are to be filled
1942 const AliDetectorRecoParam *grppar = fRecoParam.GetDetRecoParam(kNDetectors);
1943 AliQAManager::QAManager()->SetRecoParam(AliQAv1::kGLOBAL, grppar) ;
1944 AliQAManager::QAManager()->SetEventSpecie(AliRecoParam::Convert(grppar->GetEventSpecie())) ;
1949 if (fRunQA && IsInTasks(AliQAv1::kRAWS)) {
1950 AliQAManager::QAManager()->SetEventSpecie(fRecoParam.GetEventSpecie()) ;
1951 AliQAManager::QAManager()->RunOneEvent(fRawReader) ;
1952 AliSysInfo::AddStamp(Form("RawQA_%d",iEvent), 0,0,iEvent);
1954 // local single event reconstruction
1955 if (!fRunLocalReconstruction.IsNull()) {
1956 TString detectors=fRunLocalReconstruction;
1957 // run HLT event reconstruction first
1958 // ;-( IsSelected changes the string
1959 if (IsSelected("HLT", detectors) &&
1960 !RunLocalEventReconstruction("HLT")) {
1961 if (fStopOnError) {CleanUp(); return kFALSE;}
1963 detectors=fRunLocalReconstruction;
1964 detectors.ReplaceAll("HLT", "");
1965 if (!RunLocalEventReconstruction(detectors)) {
1974 // fill Event header information from the RawEventHeader
1975 if (fRawReader){FillRawEventHeaderESD(fesd);}
1976 if (fRawReader){FillRawEventHeaderESD(fhltesd);}
1978 fesd->SetRunNumber(fRunLoader->GetHeader()->GetRun());
1979 fhltesd->SetRunNumber(fRunLoader->GetHeader()->GetRun());
1981 ((AliESDRun*)fesd->GetESDRun())->SetDetectorsInDAQ(fRunInfo->GetDetectorMask());
1982 ((AliESDRun*)fhltesd->GetESDRun())->SetDetectorsInDAQ(fRunInfo->GetDetectorMask());
1983 ((AliESDRun*)fesd->GetESDRun())->SetDetectorsInReco(AliDAQ::DetectorPatternOffline(fFillESD.Data()));
1984 ((AliESDRun*)fhltesd->GetESDRun())->SetDetectorsInReco(AliDAQ::DetectorPatternOffline(fFillESD.Data()));
1986 fesd->SetEventNumberInFile(fRunLoader->GetHeader()->GetEventNrInRun());
1987 fhltesd->SetEventNumberInFile(fRunLoader->GetHeader()->GetEventNrInRun());
1989 fesd->SetEventSpecie(fRecoParam.GetEventSpecie());
1990 fhltesd->SetEventSpecie(fRecoParam.GetEventSpecie());
1992 // Set magnetic field from the tracker
1993 fesd->SetMagneticField(AliTracker::GetBz());
1994 fhltesd->SetMagneticField(AliTracker::GetBz());
1996 AliESDRun *esdRun,*esdRunH;
1997 esdRun = (AliESDRun*)fesd->GetESDRun();
1998 esdRunH = (AliESDRun*)fhltesd->GetESDRun();
1999 esdRun->SetBeamEnergyIsSqrtSHalfGeV();
2000 esdRunH->SetBeamEnergyIsSqrtSHalfGeV();
2002 for (int ib=2;ib--;) for (int it=2;it--;) {
2003 esdRun->SetMeanIntensity(ib,it, fBeamInt[ib][it]);
2004 esdRunH->SetMeanIntensity(ib,it, fBeamInt[ib][it]);
2007 fesd->SetBeamEnergy(fGRPData->GetBeamEnergy());
2008 fesd->SetBeamType(fGRPData->GetBeamType().Data());
2009 fesd->SetBeamParticle(fGRPData->GetSingleBeamType(0).Atoi(),0);
2010 fesd->SetBeamParticle(fGRPData->GetSingleBeamType(1).Atoi(),1);
2011 fhltesd->SetBeamEnergy(fGRPData->GetBeamEnergy());
2012 fhltesd->SetBeamType(fGRPData->GetBeamType().Data());
2013 fhltesd->SetBeamParticle(fGRPData->GetSingleBeamType(0).Atoi(),0);
2014 fhltesd->SetBeamParticle(fGRPData->GetSingleBeamType(1).Atoi(),1);
2016 AliMagF* fld = (AliMagF*)TGeoGlobalMagField::Instance()->GetField();
2017 if (fld) { // set info needed for field initialization
2018 fesd->SetCurrentL3(fld->GetCurrentSol());
2019 fesd->SetCurrentDip(fld->GetCurrentDip());
2020 fesd->SetUniformBMap(fld->IsUniform());
2021 fesd->SetBInfoStored();
2023 fhltesd->SetCurrentL3(fld->GetCurrentSol());
2024 fhltesd->SetCurrentDip(fld->GetCurrentDip());
2025 fhltesd->SetUniformBMap(fld->IsUniform());
2026 fhltesd->SetBInfoStored();
2029 // Set most probable pt, for B=0 tracking
2030 // Get the global reco-params. They are atposition 16 inside the array of detectors in fRecoParam
2031 const AliGRPRecoParam *grpRecoParam = dynamic_cast<const AliGRPRecoParam*>(fRecoParam.GetDetRecoParam(kNDetectors));
2032 if (grpRecoParam) AliExternalTrackParam::SetMostProbablePt(grpRecoParam->GetMostProbablePt());
2034 // Fill raw-data error log into the ESD
2035 if (fRawReader) FillRawDataErrorLog(iEvent,fesd);
2037 AliSysInfo::AddStamp(Form("FillHeadErrs_%d",iEvent), 0,0,iEvent);
2040 if (fRunVertexFinder) {
2041 if (!RunVertexFinder(fesd)) {
2042 if (fStopOnError) {CleanUp(); return kFALSE;}
2044 AliSysInfo::AddStamp(Form("VtxFinder_%d",iEvent), 0,0,iEvent);
2047 // For Plane Efficiency: run the SPD trackleter
2048 if (fRunPlaneEff && fSPDTrackleter) {
2049 if (!RunSPDTrackleting(fesd)) {
2050 if (fStopOnError) {CleanUp(); return kFALSE;}
2052 AliSysInfo::AddStamp(Form("TrackletEff_%d",iEvent), 0,0,iEvent);
2056 if (!fRunTracking.IsNull()) {
2057 if (fRunMuonTracking) {
2058 if (!RunMuonTracking(fesd)) {
2059 if (fStopOnError) {CleanUp(); return kFALSE;}
2062 AliSysInfo::AddStamp(Form("TrackingMUON_%d",iEvent), 0,0,iEvent);
2066 if (!fRunTracking.IsNull()) {
2067 if (!RunTracking(fesd,pid)) {
2068 if (fStopOnError) {CleanUp(); return kFALSE;}
2073 if (!fFillESD.IsNull()) {
2074 TString detectors=fFillESD;
2075 // run HLT first and on hltesd
2076 // ;-( IsSelected changes the string
2077 if (IsSelected("HLT", detectors) &&
2078 !FillESD(fhltesd, "HLT")) {
2079 if (fStopOnError) {CleanUp(); return kFALSE;}
2082 // Temporary fix to avoid problems with HLT that overwrites the offline ESDs
2083 if (detectors.Contains("ALL")) {
2085 for (Int_t idet=0; idet<kNDetectors; ++idet){
2086 detectors += fgkDetectorName[idet];
2090 detectors.ReplaceAll("HLT", "");
2091 if (!FillESD(fesd, detectors)) {
2092 if (fStopOnError) {CleanUp(); return kFALSE;}
2100 // Propagate track to the beam pipe (if not already done by ITS)
2102 const Int_t ntracks = fesd->GetNumberOfTracks();
2103 const Double_t kRadius = 2.8; //something less than the beam pipe radius
2106 UShort_t selectedIdx[ntracks];
2108 for (Int_t itrack=0; itrack<ntracks; itrack++){
2109 const Double_t kMaxStep = 1; //max step over the material
2112 AliESDtrack *track = fesd->GetTrack(itrack);
2113 if (!track) continue;
2115 AliExternalTrackParam *tpcTrack =
2116 (AliExternalTrackParam *)track->GetTPCInnerParam();
2120 PropagateTrackToBxByBz(tpcTrack,kRadius,track->GetMass(),kMaxStep,kFALSE);
2123 Int_t n=trkArray.GetEntriesFast();
2124 selectedIdx[n]=track->GetID();
2125 trkArray.AddLast(tpcTrack);
2128 //Tracks refitted by ITS should already be at the SPD vertex
2129 if (track->IsOn(AliESDtrack::kITSrefit)) continue;
2132 PropagateTrackToBxByBz(track,kRadius,track->GetMass(),kMaxStep,kFALSE);
2133 Double_t x[3]; track->GetXYZ(x);
2134 Double_t b[3]; AliTracker::GetBxByBz(x,b);
2135 track->RelateToVertexBxByBz(fesd->GetPrimaryVertexSPD(), b, kVeryBig);
2138 AliSysInfo::AddStamp(Form("RelToSPDVtx_%d",iEvent), 0,0,iEvent);
2140 // Improve the reconstructed primary vertex position using the tracks
2142 Bool_t runVertexFinderTracks = fRunVertexFinderTracks;
2143 if(fesd->GetPrimaryVertexSPD()) {
2144 TString vtitle = fesd->GetPrimaryVertexSPD()->GetTitle();
2145 if(vtitle.Contains("cosmics")) {
2146 runVertexFinderTracks=kFALSE;
2150 if (runVertexFinderTracks) {
2151 // TPC + ITS primary vertex
2152 ftVertexer->SetITSMode();
2153 ftVertexer->SetConstraintOff();
2154 // get cuts for vertexer from AliGRPRecoParam
2155 Bool_t constrSPD=kFALSE;
2157 Int_t nCutsVertexer = grpRecoParam->GetVertexerTracksNCuts();
2158 Double_t *cutsVertexer = new Double_t[nCutsVertexer];
2159 grpRecoParam->GetVertexerTracksCutsITS(cutsVertexer,nCutsVertexer);
2160 ftVertexer->SetCuts(cutsVertexer,nCutsVertexer);
2161 delete [] cutsVertexer; cutsVertexer = NULL;
2162 if(grpRecoParam->GetVertexerTracksConstraintITS()) {
2163 if(fDiamondProfile && fDiamondProfile->GetXRes()<kRadius){
2164 ftVertexer->SetVtxStart(fDiamondProfile); // apply constraint only if sigmax is smaller than the beam pipe radius
2166 if(fDiamondProfileSPD && fDiamondProfileSPD->GetXRes()<kRadius){
2167 ftVertexer->SetVtxStart(fDiamondProfileSPD);
2173 AliESDVertex *pvtx=ftVertexer->FindPrimaryVertex(fesd);
2176 TString title=pvtx->GetTitle();
2177 title.Append("SPD");
2178 pvtx->SetTitle(title);
2180 if (pvtx->GetStatus()) {
2181 fesd->SetPrimaryVertexTracks(pvtx);
2182 for (Int_t i=0; i<ntracks; i++) {
2183 AliESDtrack *t = fesd->GetTrack(i);
2184 Double_t x[3]; t->GetXYZ(x);
2185 Double_t b[3]; AliTracker::GetBxByBz(x,b);
2186 t->RelateToVertexBxByBz(pvtx, b, kVeryBig);
2189 delete pvtx; pvtx=NULL;
2191 AliSysInfo::AddStamp(Form("VtxTrk_%d",iEvent), 0,0,iEvent);
2193 // TPC-only primary vertex
2194 ftVertexer->SetTPCMode();
2195 ftVertexer->SetConstraintOff();
2196 // get cuts for vertexer from AliGRPRecoParam
2198 Int_t nCutsVertexer = grpRecoParam->GetVertexerTracksNCuts();
2199 Double_t *cutsVertexer = new Double_t[nCutsVertexer];
2200 grpRecoParam->GetVertexerTracksCutsTPC(cutsVertexer,nCutsVertexer);
2201 ftVertexer->SetCuts(cutsVertexer,nCutsVertexer);
2202 delete [] cutsVertexer; cutsVertexer = NULL;
2203 if(fDiamondProfileTPC && grpRecoParam->GetVertexerTracksConstraintTPC()) {
2204 if(fDiamondProfileTPC->GetXRes()<kRadius) ftVertexer->SetVtxStart(fDiamondProfileTPC); // apply constraint only if sigmax is smaller than the beam pipe radius
2207 pvtx=ftVertexer->FindPrimaryVertex(&trkArray,selectedIdx);
2209 if (pvtx->GetStatus()) {
2210 fesd->SetPrimaryVertexTPC(pvtx);
2211 for (Int_t i=0; i<ntracks; i++) {
2212 AliESDtrack *t = fesd->GetTrack(i);
2213 Double_t x[3]; t->GetXYZ(x);
2214 Double_t b[3]; AliTracker::GetBxByBz(x,b);
2215 t->RelateToVertexTPCBxByBz(pvtx, b, kVeryBig);
2218 delete pvtx; pvtx=NULL;
2220 AliSysInfo::AddStamp(Form("VtxTPC_%d",iEvent), 0,0,iEvent);
2224 if(fDiamondProfile && fDiamondProfile->GetXRes()<kRadius) fesd->SetDiamond(fDiamondProfile);
2225 else fesd->SetDiamond(fDiamondProfileSPD);
2229 AliV0vertexer vtxer;
2230 // get cuts for V0vertexer from AliGRPRecoParam
2232 Int_t nCutsV0vertexer = grpRecoParam->GetVertexerV0NCuts();
2233 Double_t cutsV0vertexer[nCutsV0vertexer];
2234 grpRecoParam->GetVertexerV0Cuts(cutsV0vertexer);
2235 vtxer.SetCuts(cutsV0vertexer);
2237 vtxer.Tracks2V0vertices(fesd);
2238 AliSysInfo::AddStamp(Form("V0Finder_%d",iEvent), 0,0,iEvent);
2240 if (fRunCascadeFinder) {
2242 AliCascadeVertexer cvtxer;
2243 // get cuts for CascadeVertexer from AliGRPRecoParam
2245 Int_t nCutsCascadeVertexer = grpRecoParam->GetVertexerCascadeNCuts();
2246 Double_t cutsCascadeVertexer[nCutsCascadeVertexer];
2247 grpRecoParam->GetVertexerCascadeCuts(cutsCascadeVertexer);
2248 cvtxer.SetCuts(cutsCascadeVertexer);
2250 cvtxer.V0sTracks2CascadeVertices(fesd);
2251 AliSysInfo::AddStamp(Form("CascadeFinder_%d",iEvent), 0,0,iEvent);
2256 if (fReconstructor[3])
2257 GetReconstructor(3)->FillEventTimeWithTOF(fesd,&pid);
2262 if (fFillTriggerESD) {
2263 if (!FillTriggerESD(fesd)) {
2264 if (fStopOnError) {CleanUp(); return kFALSE;}
2267 // Always fill scalers
2268 if (!FillTriggerScalers(fesd)) {
2269 if (fStopOnError) {CleanUp(); return kFALSE;}
2272 AliSysInfo::AddStamp(Form("FillVaria_%d",iEvent), 0,0,iEvent);
2275 UInt_t specie = fesd->GetEventSpecie();
2276 Bool_t keepAll = (specie==AliRecoParam::kCosmic || specie==AliRecoParam::kCalib);
2277 if (fCleanESD && (!keepAll) ) {
2279 AliSysInfo::AddStamp(Form("CleanESD_%d",iEvent), 0,0,iEvent);
2282 // RS run updated trackleter: since we want to mark the clusters used by tracks and also mark the
2283 // tracks interpreted as primary, this step should be done in the very end, when full
2284 // ESD info is available (particulalry, V0s)
2286 if (fRunMultFinder) {
2287 if (!RunMultFinder(fesd)) {
2288 if (fStopOnError) {CleanUp(); return kFALSE;}
2290 AliSysInfo::AddStamp(Form("MultFinder_%d",iEvent), 0,0,iEvent);
2293 if (fRunQA && IsInTasks(AliQAv1::kESDS)) {
2294 AliQAManager::QAManager()->SetEventSpecie(fRecoParam.GetEventSpecie()) ;
2295 AliQAManager::QAManager()->RunOneEvent(fesd, fhltesd) ;
2296 AliSysInfo::AddStamp(Form("RunQA_%d",iEvent), 0,0,iEvent);
2299 AliQADataMaker *qadm = AliQAManager::QAManager()->GetQADataMaker(AliQAv1::kGLOBAL);
2301 qadm->SetEventSpecie(fRecoParam.GetEventSpecie()) ;
2302 if (qadm && IsInTasks(AliQAv1::kESDS))
2303 qadm->Exec(AliQAv1::kESDS, fesd);
2304 AliSysInfo::AddStamp(Form("RunGlobQA_%d",iEvent), 0,0,iEvent);
2307 // copy HLT decision from HLTesd to esd
2308 // the most relevant information is stored in a reduced container in the esd,
2309 // while the full information can be found in the HLTesd
2310 TObject* pHLTSrc=fhltesd->FindListObject(AliESDHLTDecision::Name());
2311 TObject* pHLTTgt=fesd->FindListObject(AliESDHLTDecision::Name());
2312 if (pHLTSrc && pHLTTgt) {
2313 pHLTSrc->Copy(*pHLTTgt);
2316 // Perform analysis of this event if requested
2317 // RS: Should be done before WriteESDfriend, since the latter may clean the esdfriend
2319 fRecoHandler->BeginEvent(iEvent);
2320 fAnalysis->ExecAnalysis();
2321 fRecoHandler->FinishEvent();
2322 AliSysInfo::AddStamp(Form("Analysis_%d",iEvent), 0,0,iEvent);
2325 if (fWriteESDfriend) {
2326 fesd->GetESDfriend(fesdf);
2327 AliSysInfo::AddStamp(Form("CreateFriend_%d",iEvent), 0,0,iEvent);
2332 AliSysInfo::AddStamp(Form("ESDFill_%d",iEvent), 0,0,iEvent);
2334 if (fWriteESDfriend) {
2336 AliSysInfo::AddStamp(Form("WriteFriend_%d",iEvent), 0,0,iEvent);
2340 // Auto-save the ESD tree in case of prompt reco @P2
2341 if (fRawReader && fRawReader->UseAutoSaveESD()) {
2342 ftree->AutoSave("SaveSelf");
2343 if (fWriteESDfriend) ftreeF->AutoSave("SaveSelf");
2349 if (fRunAliEVE) RunAliEVE();
2353 if (fWriteESDfriend) {
2354 fesdf->~AliESDfriend();
2355 new (fesdf) AliESDfriend(); // Reset...
2358 gSystem->GetProcInfo(&procInfo);
2359 Long_t dMres=(procInfo.fMemResident-oldMres)/1024;
2360 Long_t dMvir=(procInfo.fMemVirtual-oldMvir)/1024;
2361 Float_t dCPU=procInfo.fCpuUser+procInfo.fCpuSys-oldCPU;
2362 aveDMres+=(dMres-aveDMres)/(iEvent-fFirstEvent+1);
2363 aveDMvir+=(dMvir-aveDMvir)/(iEvent-fFirstEvent+1);
2364 aveDCPU+=(dCPU-aveDCPU)/(iEvent-fFirstEvent+1);
2365 AliInfo(Form("======================= End Event %d: Res %ld(%3ld <%3ld>) Vir %ld(%3ld <%3ld>) CPU %5.2f <%5.2f> ===================",
2366 iEvent, procInfo.fMemResident/1024, dMres, aveDMres, procInfo.fMemVirtual/1024, dMvir, aveDMvir, dCPU, aveDCPU));
2367 oldMres=procInfo.fMemResident;
2368 oldMvir=procInfo.fMemVirtual;
2369 oldCPU=procInfo.fCpuUser+procInfo.fCpuSys;
2372 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
2373 if (fReconstructor[iDet]) {
2374 fReconstructor[iDet]->SetRecoParam(NULL);
2375 fReconstructor[iDet]->SetEventInfo(NULL);
2377 if (fTracker[iDet]) fTracker[iDet]->SetEventInfo(NULL);
2380 if (fRunQA || fRunGlobalQA)
2381 AliQAManager::QAManager()->Increment() ;
2383 DeleteRecPoints(fDeleteRecPoints);
2384 DeleteDigits(fDeleteDigits);
2389 //_____________________________________________________________________________
2390 void AliReconstruction::SlaveTerminate()
2392 // Finalize the run on the slave side
2393 // Called after the exit
2394 // from the event loop
2395 AliCodeTimerAuto("",0);
2396 // If analysis was done during reconstruction, we need to call SlaveTerminate for it
2398 fAnalysis->PackOutput(fOutput);
2399 fAnalysis->SetSkipTerminate(kTRUE);
2400 fAnalysis->Terminate();
2403 if (fIsNewRunLoader) { // galice.root didn't exist
2404 fRunLoader->WriteHeader("OVERWRITE");
2405 fRunLoader->WriteTrigger("OVERWRITE");
2406 fRunLoader->CdGAFile();
2407 fRunLoader->Write(0, TObject::kOverwrite);
2410 const TMap *cdbMap = AliCDBManager::Instance()->GetStorageMap();
2411 const TList *cdbList = AliCDBManager::Instance()->GetRetrievedIds();
2413 TMap *cdbMapCopy = new TMap(cdbMap->GetEntries());
2414 cdbMapCopy->SetOwner(1);
2415 cdbMapCopy->SetName("cdbMap");
2416 TIter iter(cdbMap->GetTable());
2419 while((pair = dynamic_cast<TPair*> (iter.Next()))){
2420 TObjString* keyStr = dynamic_cast<TObjString*> (pair->Key());
2421 TObjString* valStr = dynamic_cast<TObjString*> (pair->Value());
2422 if (keyStr && valStr)
2423 cdbMapCopy->Add(new TObjString(keyStr->GetName()), new TObjString(valStr->GetName()));
2426 TList *cdbListCopy = new TList();
2427 cdbListCopy->SetOwner(1);
2428 cdbListCopy->SetName("cdbList");
2430 TIter iter2(cdbList);
2433 while((id = dynamic_cast<AliCDBId*> (iter2.Next()))){
2434 cdbListCopy->Add(new TObjString(id->ToString().Data()));
2437 ftree->GetUserInfo()->Add(cdbMapCopy);
2438 ftree->GetUserInfo()->Add(cdbListCopy);
2440 // Add the AliRoot version that created this file
2441 TString sVersion("aliroot ");
2442 sVersion += ALIROOT_SVN_BRANCH;
2444 sVersion += ALIROOT_SVN_REVISION;
2445 sVersion += "; root ";
2446 sVersion += ROOT_SVN_BRANCH;
2448 sVersion += ROOT_SVN_REVISION;
2449 sVersion += "; metadata ";
2450 sVersion += getenv("PRODUCTION_METADATA");
2453 TNamed * alirootVersion = new TNamed("alirootVersion",sVersion.Data());
2454 ftree->GetUserInfo()->Add(alirootVersion); // The list becomes owner of alirootVersion
2458 // we want to have only one tree version number
2459 ftree->Write(ftree->GetName(),TObject::kOverwrite);
2460 fhlttree->Write(fhlttree->GetName(),TObject::kOverwrite);
2462 if (fWriteESDfriend) {
2464 ftreeF->Write(ftreeF->GetName(),TObject::kOverwrite);
2467 // Finish with Plane Efficiency evaluation: before of CleanUp !!!
2468 if (fRunPlaneEff && !FinishPlaneEff()) {
2469 AliWarning("Finish PlaneEff evaluation failed");
2472 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
2473 if (fReconstructor[iDet]) fReconstructor[iDet]->Terminate();
2475 // End of cycle for the in-loop
2477 if (fRunQA || fRunGlobalQA) {
2478 AliQAManager::QAManager()->EndOfCycle() ;
2480 !fProofOutputLocation.IsNull() &&
2481 fProofOutputArchive.IsNull() &&
2482 !fProofOutputDataset) {
2483 TString qaOutputFile(Form("%sMerged.%s.Data.root",
2484 fProofOutputLocation.Data(),
2485 AliQAv1::GetQADataFileName()));
2486 TProofOutputFile *qaProofFile = new TProofOutputFile(Form("Merged.%s.Data.root",
2487 AliQAv1::GetQADataFileName()));
2488 qaProofFile->SetOutputFileName(qaOutputFile.Data());
2489 if (AliDebugLevel() > 0) qaProofFile->Dump();
2490 fOutput->Add(qaProofFile);
2491 MergeQA(qaProofFile->GetFileName());
2502 if (!fProofOutputFileName.IsNull() &&
2503 !fProofOutputLocation.IsNull() &&
2504 fProofOutputDataset &&
2505 !fProofOutputArchive.IsNull()) {
2506 TProofOutputFile *zipProofFile = new TProofOutputFile(fProofOutputFileName.Data(),
2508 fProofOutputLocation.Data());
2509 if (AliDebugLevel() > 0) zipProofFile->Dump();
2510 fOutput->Add(zipProofFile);
2511 TString fileList(fProofOutputArchive.Data());
2512 fileList.ReplaceAll(","," ");
2514 #if ROOT_SVN_REVISION >= 30174
2515 command.Form("zip -n root %s/%s %s",zipProofFile->GetDir(kTRUE),zipProofFile->GetFileName(),fileList.Data());
2517 command.Form("zip -n root %s/%s %s",zipProofFile->GetDir(),zipProofFile->GetFileName(),fileList.Data());
2519 AliInfo(Form("Executing: %s",command.Data()));
2520 gSystem->Exec(command.Data());
2525 //_____________________________________________________________________________
2526 void AliReconstruction::Terminate()
2528 // Create tags for the events in the ESD tree (the ESD tree is always present)
2529 // In case of empty events the tags will contain dummy values
2530 AliCodeTimerAuto("",0);
2532 // Do not call the ESD tag creator in case of PROOF-based reconstruction
2534 AliESDTagCreator *esdtagCreator = new AliESDTagCreator();
2535 esdtagCreator->CreateESDTags(fFirstEvent,fLastEvent,fGRPData, AliQAv1::Instance()->GetQA(), AliQAv1::Instance()->GetEventSpecies(), AliQAv1::kNDET, AliRecoParam::kNSpecies);
2536 delete esdtagCreator;
2539 // Cleanup of CDB manager: cache and active storages!
2540 AliCDBManager::Instance()->ClearCache();
2543 //_____________________________________________________________________________
2544 Bool_t AliReconstruction::RunLocalEventReconstruction(const TString& detectors)
2546 // run the local reconstruction
2548 static Int_t eventNr=0;
2549 AliCodeTimerAuto("",0)
2551 TString detStr = detectors;
2552 // execute HLT reconstruction first since other detector reconstruction
2553 // might depend on HLT data
2554 // key 'HLT' is removed from detStr by IsSelected
2555 if (!IsSelected("HLT", detStr)) {
2556 AliReconstructor* reconstructor = GetReconstructor(kNDetectors-1);
2557 if (reconstructor) {
2558 // there is no AliLoader for HLT, see
2559 // https://savannah.cern.ch/bugs/?35473
2560 AliInfo("running reconstruction for HLT");
2562 AliInfo("reconstructor->Reconstruct(fRawReader, NULL)");
2563 reconstructor->Reconstruct(fRawReader, NULL);
2566 AliInfo("reconstructor->Reconstruct(dummy, NULL)");
2568 reconstructor->Reconstruct(dummy, NULL);
2571 AliSysInfo::AddStamp(Form("LRecHLT_%d",eventNr), -1,1,eventNr);
2574 AliInfo(Form("kNDetectors = %d",kNDetectors));
2576 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
2577 if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
2578 AliDebug(1, Form("Detector: %s", fgkDetectorName[iDet]));
2579 AliReconstructor* reconstructor = GetReconstructor(iDet);
2580 if (!reconstructor) continue;
2581 AliLoader* loader = fLoader[iDet];
2583 AliWarning(Form("No loader is defined for %s!",fgkDetectorName[iDet]));
2586 // conversion of digits
2587 if (fRawReader && reconstructor->HasDigitConversion()) {
2588 AliInfo(Form("converting raw data digits into root objects for %s",
2589 fgkDetectorName[iDet]));
2590 // AliCodeTimerAuto(Form("converting raw data digits into root objects for %s",
2591 // fgkDetectorName[iDet]),0);
2592 loader->LoadDigits("update");
2593 loader->CleanDigits();
2594 loader->MakeDigitsContainer();
2595 TTree* digitsTree = loader->TreeD();
2596 reconstructor->ConvertDigits(fRawReader, digitsTree);
2597 loader->WriteDigits("OVERWRITE");
2598 loader->UnloadDigits();
2600 // local reconstruction
2601 AliInfo(Form("running reconstruction for %s", fgkDetectorName[iDet]));
2602 //AliCodeTimerAuto(Form("running reconstruction for %s", fgkDetectorName[iDet]),0);
2603 AliDebug(1, "Loading Rec Points");
2604 loader->LoadRecPoints("update");
2605 AliDebug(1, "Cleaning Rec Points");
2606 loader->CleanRecPoints();
2607 AliDebug(1, "Making Rec Points Container");
2608 loader->MakeRecPointsContainer();
2609 TTree* clustersTree = loader->TreeR();
2610 if (fRawReader && !reconstructor->HasDigitConversion()) {
2611 reconstructor->Reconstruct(fRawReader, clustersTree);
2614 AliDebug(1, "Loading Digits");
2615 loader->LoadDigits("read");
2616 TTree* digitsTree = loader->TreeD();
2617 AliDebug(1, Form("Digits Tree = %p",digitsTree));
2619 AliError(Form("Can't get the %s digits tree", fgkDetectorName[iDet]));
2624 AliDebug(1, "Digits -> Clusters");
2625 reconstructor->Reconstruct(digitsTree, clustersTree);
2626 if (fRunQA && IsInTasks(AliQAv1::kDIGITSR)) {
2627 AliQAManager::QAManager()->SetEventSpecie(fRecoParam.GetEventSpecie()) ;
2628 AliQAManager::QAManager()->RunOneEventInOneDetector(iDet, digitsTree) ;
2631 loader->UnloadDigits();
2633 if (fRunQA && IsInTasks(AliQAv1::kRECPOINTS)) {
2634 AliQAManager::QAManager()->SetEventSpecie(fRecoParam.GetEventSpecie()) ;
2635 AliQAManager::QAManager()->RunOneEventInOneDetector(iDet, clustersTree) ;
2637 loader->WriteRecPoints("OVERWRITE");
2638 loader->UnloadRecPoints();
2639 AliSysInfo::AddStamp(Form("LRec%s_%d",fgkDetectorName[iDet],eventNr), iDet,1,eventNr);
2641 if (!IsSelected("CTP", detStr)) AliDebug(10,"No CTP");
2642 if ((detStr.CompareTo("ALL") != 0) && !detStr.IsNull()) {
2643 AliError(Form("the following detectors were not found: %s",
2651 //_____________________________________________________________________________
2652 Bool_t AliReconstruction::RunSPDTrackleting(AliESDEvent*& esd)
2654 // run the SPD trackleting (for SPD efficiency purpouses)
2656 AliCodeTimerAuto("",0)
2658 Double_t vtxPos[3] = {0, 0, 0};
2659 Double_t vtxErr[3] = {0.0, 0.0, 0.0};
2665 if (fRunLoader->GetHeader() && fRunLoader->GetHeader()->GenEventHeader()) {
2666 fRunLoader->GetHeader()->GenEventHeader()->PrimaryVertex(mcVertex);
2667 for (Int_t i = 0; i < 3; i++) vtxPos[i] = mcVertex[i];
2670 const AliESDVertex *vertex = esd->GetVertex();
2672 AliWarning("Vertex not found");
2675 vertex->GetXYZ(vtxPos);
2676 vertex->GetSigmaXYZ(vtxErr);
2677 if (fSPDTrackleter) {
2678 AliInfo("running the SPD Trackleter for Plane Efficiency Evaluation");
2681 fLoader[0]->LoadRecPoints("read");
2682 TTree* tree = fLoader[0]->TreeR();
2684 AliError("Can't get the ITS cluster tree");
2687 fSPDTrackleter->LoadClusters(tree);
2688 fSPDTrackleter->SetVertex(vtxPos, vtxErr);
2690 if (fSPDTrackleter->Clusters2Tracks(esd) != 0) {
2691 AliWarning("AliITSTrackleterSPDEff Clusters2Tracks failed");
2692 // fLoader[0]->UnloadRecPoints();
2695 //fSPDTrackleter->UnloadRecPoints();
2697 AliWarning("SPDTrackleter not available");
2703 //_____________________________________________________________________________
2704 Bool_t AliReconstruction::RunVertexFinder(AliESDEvent*& esd)
2706 // run the barrel tracking
2708 AliCodeTimerAuto("",0)
2710 AliVertexer *vertexer = CreateVertexer();
2711 if (!vertexer) return kFALSE;
2713 AliInfo(Form("running the ITS vertex finder: %s",vertexer->ClassName()));
2714 AliESDVertex* vertex = NULL;
2716 fLoader[0]->LoadRecPoints();
2717 TTree* cltree = fLoader[0]->TreeR();
2719 if(fDiamondProfileSPD) vertexer->SetVtxStart(fDiamondProfileSPD);
2720 vertex = vertexer->FindVertexForCurrentEvent(cltree);
2723 AliError("Can't get the ITS cluster tree");
2725 fLoader[0]->UnloadRecPoints();
2728 AliError("Can't get the ITS loader");
2731 AliWarning("Vertex not found");
2732 vertex = new AliESDVertex();
2733 vertex->SetName("default");
2736 vertex->SetName("reconstructed");
2741 vertex->GetXYZ(vtxPos);
2742 vertex->GetSigmaXYZ(vtxErr);
2744 esd->SetPrimaryVertexSPD(vertex);
2745 AliESDVertex *vpileup = NULL;
2746 Int_t novertices = 0;
2747 vpileup = vertexer->GetAllVertices(novertices);
2749 for (Int_t kk=1; kk<novertices; kk++)esd->AddPileupVertexSPD(&vpileup[kk]);
2752 // if SPD multiplicity has been determined, it is stored in the ESD
2753 AliMultiplicity *mult = vertexer->GetMultiplicity();
2754 if(mult)esd->SetMultiplicity(mult);
2756 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
2757 if (fTracker[iDet]) fTracker[iDet]->SetVertex(vtxPos, vtxErr);
2766 //_____________________________________________________________________________
2767 Bool_t AliReconstruction::RunMultFinder(AliESDEvent*& esd)
2769 // run the trackleter for multiplicity study
2771 AliCodeTimerAuto("",0)
2773 AliTrackleter *trackleter = CreateMultFinder();
2774 if (!trackleter) return kFALSE;
2776 AliInfo(Form("running the ITS multiplicity finder: %s",trackleter->ClassName()));
2779 fLoader[0]->LoadRecPoints();
2780 TTree* cltree = fLoader[0]->TreeR();
2782 trackleter->Reconstruct(esd,cltree);
2783 AliMultiplicity *mult = trackleter->GetMultiplicity();
2784 if(mult) esd->SetMultiplicity(mult);
2787 AliError("Can't get the ITS cluster tree");
2789 fLoader[0]->UnloadRecPoints();
2792 AliError("Can't get the ITS loader");
2800 //_____________________________________________________________________________
2801 Bool_t AliReconstruction::RunHLTTracking(AliESDEvent*& esd)
2803 // run the HLT barrel tracking
2805 AliCodeTimerAuto("",0)
2808 AliError("Missing runLoader!");
2812 AliInfo("running HLT tracking");
2814 // Get a pointer to the HLT reconstructor
2815 AliReconstructor *reconstructor = GetReconstructor(kNDetectors-1);
2816 if (!reconstructor) return kFALSE;
2819 for (Int_t iDet = 1; iDet >= 0; iDet--) {
2820 TString detName = fgkDetectorName[iDet];
2821 AliDebug(1, Form("%s HLT tracking", detName.Data()));
2822 reconstructor->SetOption(detName.Data());
2823 AliTracker *tracker = reconstructor->CreateTracker();
2825 AliWarning(Form("couldn't create a HLT tracker for %s", detName.Data()));
2826 if (fStopOnError) return kFALSE;
2830 Double_t vtxErr[3]={0.005,0.005,0.010};
2831 const AliESDVertex *vertex = esd->GetVertex();
2832 vertex->GetXYZ(vtxPos);
2833 tracker->SetVertex(vtxPos,vtxErr);
2835 fLoader[iDet]->LoadRecPoints("read");
2836 TTree* tree = fLoader[iDet]->TreeR();
2838 AliError(Form("Can't get the %s cluster tree", detName.Data()));
2841 tracker->LoadClusters(tree);
2843 if (tracker->Clusters2Tracks(esd) != 0) {
2844 AliError(Form("HLT %s Clusters2Tracks failed", fgkDetectorName[iDet]));
2848 tracker->UnloadClusters();
2856 //_____________________________________________________________________________
2857 Bool_t AliReconstruction::RunMuonTracking(AliESDEvent*& esd)
2859 // run the muon spectrometer tracking
2861 AliCodeTimerAuto("",0)
2864 AliError("Missing runLoader!");
2867 Int_t iDet = GetDetIndex("MUON"); // for MUON
2869 // Get a pointer to the MUON reconstructor
2870 AliReconstructor *reconstructor = GetReconstructor(iDet);
2871 if (!reconstructor) return kFALSE;
2874 TString detName = fgkDetectorName[iDet];
2875 AliDebug(1, Form("%s tracking", detName.Data()));
2876 AliTracker *tracker = reconstructor->CreateTracker();
2878 AliWarning(Form("couldn't create a tracker for %s", detName.Data()));
2883 fLoader[iDet]->LoadRecPoints("read");
2885 tracker->LoadClusters(fLoader[iDet]->TreeR());
2887 Int_t rv = tracker->Clusters2Tracks(esd);
2889 fLoader[iDet]->UnloadRecPoints();
2891 tracker->UnloadClusters();
2895 AliError(Form("%s Clusters2Tracks failed", fgkDetectorName[iDet]));
2903 //_____________________________________________________________________________
2904 Bool_t AliReconstruction::RunTracking(AliESDEvent*& esd,AliESDpid &PID)
2906 // run the barrel tracking
2907 static Int_t eventNr=0;
2908 AliCodeTimerAuto("",0)
2910 AliInfo("running tracking");
2912 // Set the event info which is used
2913 // by the trackers in order to obtain
2914 // information about read-out detectors,
2916 AliDebug(1, "Setting event info");
2917 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
2918 if (!fTracker[iDet]) continue;
2919 fTracker[iDet]->SetEventInfo(&fEventInfo);
2922 //Fill the ESD with the T0 info (will be used by the TOF)
2923 if (fReconstructor[11] && fLoader[11]) {
2924 fLoader[11]->LoadRecPoints("READ");
2925 TTree *treeR = fLoader[11]->TreeR();
2927 GetReconstructor(11)->FillESD((TTree *)NULL,treeR,esd);
2931 // pass 1: TPC + ITS inwards
2932 for (Int_t iDet = 1; iDet >= 0; iDet--) {
2933 if (!fTracker[iDet]) continue;
2934 AliDebug(1, Form("%s tracking", fgkDetectorName[iDet]));
2937 fLoader[iDet]->LoadRecPoints("read");
2938 AliSysInfo::AddStamp(Form("RLoadCluster%s_%d",fgkDetectorName[iDet],eventNr),iDet,1, eventNr);
2939 TTree* tree = fLoader[iDet]->TreeR();
2941 AliError(Form("Can't get the %s cluster tree", fgkDetectorName[iDet]));
2944 fTracker[iDet]->LoadClusters(tree);
2945 AliSysInfo::AddStamp(Form("TLoadCluster%s_%d",fgkDetectorName[iDet],eventNr), iDet,2, eventNr);
2947 if (fTracker[iDet]->Clusters2Tracks(esd) != 0) {
2948 AliError(Form("%s Clusters2Tracks failed", fgkDetectorName[iDet]));
2951 AliSysInfo::AddStamp(Form("Tracking0%s_%d",fgkDetectorName[iDet],eventNr), iDet,3,eventNr);
2952 // preliminary PID in TPC needed by the ITS tracker
2954 GetReconstructor(1)->FillESD((TTree*)NULL, (TTree*)NULL, esd);
2955 PID.MakePID(esd,kTRUE);
2956 AliSysInfo::AddStamp(Form("MakePID0%s_%d",fgkDetectorName[iDet],eventNr), iDet,4,eventNr);
2960 // pass 2: ALL backwards
2962 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
2963 if (!fTracker[iDet]) continue;
2964 AliDebug(1, Form("%s back propagation", fgkDetectorName[iDet]));
2967 if (iDet > 1) { // all except ITS, TPC
2969 fLoader[iDet]->LoadRecPoints("read");
2970 AliSysInfo::AddStamp(Form("RLoadCluster0%s_%d",fgkDetectorName[iDet],eventNr), iDet,1, eventNr);
2971 tree = fLoader[iDet]->TreeR();
2973 AliError(Form("Can't get the %s cluster tree", fgkDetectorName[iDet]));
2976 fTracker[iDet]->LoadClusters(tree);
2977 AliSysInfo::AddStamp(Form("TLoadCluster0%s_%d",fgkDetectorName[iDet],eventNr), iDet,2, eventNr);
2981 if (iDet>1) // start filling residuals for the "outer" detectors
2983 AliTracker::SetFillResiduals(fRecoParam.GetEventSpecie(), kTRUE);
2984 TObjArray ** arr = AliTracker::GetResidualsArray() ;
2986 AliRecoParam::EventSpecie_t es=fRecoParam.GetEventSpecie();
2987 TObjArray * elem = arr[AliRecoParam::AConvert(es)];
2988 if ( elem && (! elem->At(0)) ) {
2989 AliQADataMaker *qadm = AliQAManager::QAManager()->GetQADataMaker(AliQAv1::kGLOBAL);
2990 if (qadm) qadm->InitRecPointsForTracker() ;
2993 // AliSysInfo::AddStamp(Form("QAInitResid%s_%d",fgkDetectorName[iDet],eventNr), iDet,0, eventNr);
2995 if (fTracker[iDet]->PropagateBack(esd) != 0) {
2996 AliError(Form("%s backward propagation failed", fgkDetectorName[iDet]));
2999 AliSysInfo::AddStamp(Form("Tracking1%s_%d",fgkDetectorName[iDet],eventNr), iDet,3, eventNr);
3002 if (iDet > 3) { // all except ITS, TPC, TRD and TOF
3003 fTracker[iDet]->UnloadClusters();
3004 fLoader[iDet]->UnloadRecPoints();
3006 // updated PID in TPC needed by the ITS tracker -MI
3008 //GetReconstructor(1)->FillESD((TTree*)NULL, (TTree*)NULL, esd);
3009 //AliESDpid::MakePID(esd);
3010 PID.MakePID(esd,kTRUE);
3011 AliSysInfo::AddStamp(Form("MakePID1%s_%d",fgkDetectorName[iDet],eventNr), iDet,4,eventNr);
3015 //stop filling residuals for the "outer" detectors
3016 if (fRunGlobalQA) AliTracker::SetFillResiduals(fRecoParam.GetEventSpecie(), kFALSE);
3018 // pass 3: TRD + TPC + ITS refit inwards
3020 for (Int_t iDet = 2; iDet >= 0; iDet--) {
3021 if (!fTracker[iDet]) continue;
3022 AliDebug(1, Form("%s inward refit", fgkDetectorName[iDet]));
3025 if (iDet<2) // start filling residuals for TPC and ITS
3027 AliTracker::SetFillResiduals(fRecoParam.GetEventSpecie(), kTRUE);
3028 TObjArray ** arr = AliTracker::GetResidualsArray() ;
3030 AliRecoParam::EventSpecie_t es=fRecoParam.GetEventSpecie();
3031 TObjArray * elem = arr[AliRecoParam::AConvert(es)];
3032 if ( elem && (! elem->At(0)) ) {
3033 AliQADataMaker *qadm = AliQAManager::QAManager()->GetQADataMaker(AliQAv1::kGLOBAL);
3034 if (qadm) qadm->InitRecPointsForTracker() ;
3039 if (fTracker[iDet]->RefitInward(esd) != 0) {
3040 AliError(Form("%s inward refit failed", fgkDetectorName[iDet]));
3043 // run postprocessing
3044 if (fTracker[iDet]->PostProcess(esd) != 0) {
3045 AliError(Form("%s postprocessing failed", fgkDetectorName[iDet]));
3048 AliSysInfo::AddStamp(Form("Tracking2%s_%d",fgkDetectorName[iDet],eventNr), iDet,3, eventNr);
3051 // write space-points to the ESD in case alignment data output
3053 if (fWriteAlignmentData) {
3054 WriteAlignmentData(esd);
3055 AliSysInfo::AddStamp(Form("WrtAlignData_%d",eventNr), 0,0, eventNr);
3058 for (Int_t iDet = 3; iDet >= 0; iDet--) {
3059 if (!fTracker[iDet]) continue;
3061 fTracker[iDet]->UnloadClusters();
3062 AliSysInfo::AddStamp(Form("TUnloadCluster%s_%d",fgkDetectorName[iDet],eventNr), iDet,4, eventNr);
3063 fLoader[iDet]->UnloadRecPoints();
3064 AliSysInfo::AddStamp(Form("RUnloadCluster%s_%d",fgkDetectorName[iDet],eventNr), iDet,5, eventNr);
3066 // stop filling residuals for TPC and ITS
3067 if (fRunGlobalQA) AliTracker::SetFillResiduals(fRecoParam.GetEventSpecie(), kFALSE);
3073 //_____________________________________________________________________________
3074 Bool_t AliReconstruction::CleanESD(AliESDEvent *esd){
3076 // Remove the data which are not needed for the physics analysis.
3079 Int_t nTracks=esd->GetNumberOfTracks();
3080 Int_t nV0s=esd->GetNumberOfV0s();
3082 (Form("Number of ESD tracks and V0s before cleaning: %d %d",nTracks,nV0s));
3084 Float_t cleanPars[]={fV0DCAmax,fV0CsPmin,fDmax,fZmax};
3085 Bool_t rc=esd->Clean(cleanPars);
3087 nTracks=esd->GetNumberOfTracks();
3088 nV0s=esd->GetNumberOfV0s();
3090 (Form("Number of ESD tracks and V0s after cleaning %d %d",nTracks,nV0s));
3095 //_____________________________________________________________________________
3096 Bool_t AliReconstruction::FillESD(AliESDEvent*& esd, const TString& detectors)
3098 // fill the event summary data
3100 AliCodeTimerAuto("",0)
3101 static Int_t eventNr=0;
3102 TString detStr = detectors;
3104 AliSysInfo::AddStamp(Form("FillESDb%d",eventNr), -19,-19, eventNr);
3105 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
3106 if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
3107 AliReconstructor* reconstructor = GetReconstructor(iDet);
3108 if (!reconstructor) continue;
3109 AliDebug(1, Form("filling ESD for %s", fgkDetectorName[iDet]));
3110 TTree* clustersTree = NULL;
3111 if (fLoader[iDet]) {
3112 fLoader[iDet]->LoadRecPoints("read");
3113 clustersTree = fLoader[iDet]->TreeR();
3114 if (!clustersTree) {
3115 AliError(Form("Can't get the %s clusters tree",
3116 fgkDetectorName[iDet]));
3117 if (fStopOnError) return kFALSE;
3120 if (fRawReader && !reconstructor->HasDigitConversion()) {
3121 reconstructor->FillESD(fRawReader, clustersTree, esd);
3123 TTree* digitsTree = NULL;
3124 if (fLoader[iDet]) {
3125 fLoader[iDet]->LoadDigits("read");
3126 digitsTree = fLoader[iDet]->TreeD();
3128 AliError(Form("Can't get the %s digits tree",
3129 fgkDetectorName[iDet]));
3130 if (fStopOnError) return kFALSE;
3133 reconstructor->FillESD(digitsTree, clustersTree, esd);
3134 if (fLoader[iDet]) fLoader[iDet]->UnloadDigits();
3136 if (fLoader[iDet]) {
3137 fLoader[iDet]->UnloadRecPoints();
3141 if (!IsSelected("CTP", detStr)) AliDebug(10,"No CTP");
3142 if ((detStr.CompareTo("ALL") != 0) && !detStr.IsNull()) {
3143 AliError(Form("the following detectors were not found: %s",
3145 if (fStopOnError) return kFALSE;
3147 AliSysInfo::AddStamp(Form("FillESDe%d",eventNr), -20,-20, eventNr);
3152 //_____________________________________________________________________________
3153 Bool_t AliReconstruction::FillTriggerESD(AliESDEvent*& esd)
3155 // Reads the trigger decision which is
3156 // stored in Trigger.root file and fills
3157 // the corresponding esd entries
3159 AliCodeTimerAuto("",0)
3161 AliInfo("Filling trigger information into the ESD");
3164 AliCTPRawStream input(fRawReader);
3165 if (!input.Next()) {
3166 AliWarning("No valid CTP (trigger) DDL raw data is found ! The trigger info is taken from the event header!");
3169 if (esd->GetTriggerMask() != input.GetClassMask())
3170 AliError(Form("Invalid trigger pattern found in CTP raw-data: %llx %llx",
3171 input.GetClassMask(),esd->GetTriggerMask()));
3172 if (esd->GetOrbitNumber() != input.GetOrbitID())
3173 AliError(Form("Invalid orbit id found in CTP raw-data: %x %x",
3174 input.GetOrbitID(),esd->GetOrbitNumber()));
3175 if (esd->GetBunchCrossNumber() != input.GetBCID())
3176 AliError(Form("Invalid bunch-crossing id found in CTP raw-data: %x %x",
3177 input.GetBCID(),esd->GetBunchCrossNumber()));
3178 AliESDHeader* esdheader = esd->GetHeader();
3179 esdheader->SetL0TriggerInputs(input.GetL0Inputs());
3180 esdheader->SetL1TriggerInputs(input.GetL1Inputs());
3181 esdheader->SetL2TriggerInputs(input.GetL2Inputs());
3183 // UInt_t orbit=input.GetOrbitID();
3184 for(Int_t i=0 ; i<input.GetNIRs() ; i++ ) {
3185 esdheader->AddTriggerIR(input.GetIR(i));
3187 AliCentralTrigger* rlCTP = fRunLoader->GetTrigger();
3189 rlCTP->SetL0TriggerInputs(input.GetL0Inputs());
3190 rlCTP->SetL1TriggerInputs(input.GetL1Inputs());
3191 rlCTP->SetL2TriggerInputs(input.GetL2Inputs());
3194 if (fIsNewRunLoader) fRunLoader->TreeCT()->Fill();
3198 //_____________________________________________________________________________
3199 Bool_t AliReconstruction::FillTriggerScalers(AliESDEvent*& esd)
3202 //fRunScalers->Print();
3203 if(fRunScalers && fRunScalers->CheckRunScalers()){
3204 AliTimeStamp* timestamp = new AliTimeStamp(esd->GetOrbitNumber(), esd->GetPeriodNumber(), esd->GetBunchCrossNumber());
3205 //AliTimeStamp* timestamp = new AliTimeStamp(10308000, 0, (ULong64_t)486238);
3206 AliESDHeader* esdheader = fesd->GetHeader();
3207 for(Int_t i=0;i<50;i++){
3208 if((1ull<<i) & esd->GetTriggerMask()){
3209 AliTriggerScalersESD* scalesd = fRunScalers->GetScalersForEventClass( timestamp, i+1);
3210 if(scalesd)esdheader->SetTriggerScalersRecord(scalesd);
3213 const AliTriggerScalersRecordESD* scalrecEvent = fRunScalers->GetScalersDeltaForEvent( timestamp);
3214 const AliTriggerScalersRecordESD* scalrecRun = fRunScalers->GetScalersDeltaForRun();
3215 if (scalrecEvent) esdheader->SetTriggerScalersDeltaEvent(scalrecEvent);
3216 if (scalrecRun) esdheader->SetTriggerScalersDeltaRun(scalrecRun);
3220 //_____________________________________________________________________________
3221 Bool_t AliReconstruction::FillRawEventHeaderESD(AliESDEvent*& esd)
3224 // Filling information from RawReader Header
3227 if (!fRawReader) return kFALSE;
3229 AliInfo("Filling information from RawReader Header");
3231 esd->SetBunchCrossNumber(fRawReader->GetBCID());
3232 esd->SetOrbitNumber(fRawReader->GetOrbitID());
3233 esd->SetPeriodNumber(fRawReader->GetPeriod());
3235 esd->SetTimeStamp(fRawReader->GetTimestamp());
3236 esd->SetEventType(fRawReader->GetType());
3242 //_____________________________________________________________________________
3243 Bool_t AliReconstruction::IsSelected(TString detName, TString& detectors) const
3245 // check whether detName is contained in detectors
3246 // if yes, it is removed from detectors
3248 // check if all detectors are selected
3249 if ((detectors.CompareTo("ALL") == 0) ||
3250 detectors.BeginsWith("ALL ") ||
3251 detectors.EndsWith(" ALL") ||
3252 detectors.Contains(" ALL ")) {
3257 // search for the given detector
3258 Bool_t result = kFALSE;
3259 if ((detectors.CompareTo(detName) == 0) ||
3260 detectors.BeginsWith(detName+" ") ||
3261 detectors.EndsWith(" "+detName) ||
3262 detectors.Contains(" "+detName+" ")) {
3263 detectors.ReplaceAll(detName, "");
3267 // clean up the detectors string
3268 while (detectors.Contains(" ")) detectors.ReplaceAll(" ", " ");
3269 while (detectors.BeginsWith(" ")) detectors.Remove(0, 1);
3270 while (detectors.EndsWith(" ")) detectors.Remove(detectors.Length()-1, 1);
3275 //_____________________________________________________________________________
3276 Bool_t AliReconstruction::InitRunLoader()
3278 // get or create the run loader
3280 if (gAlice) delete gAlice;
3283 TFile *gafile = TFile::Open(fGAliceFileName.Data());
3284 // if (!gSystem->AccessPathName(fGAliceFileName.Data())) { // galice.root exists
3285 if (gafile) { // galice.root exists
3289 // load all base libraries to get the loader classes
3290 TString libs = gSystem->GetLibraries();
3291 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
3292 TString detName = fgkDetectorName[iDet];
3293 if (detName == "HLT") continue;
3294 if (libs.Contains("lib" + detName + "base.so")) continue;
3295 gSystem->Load("lib" + detName + "base.so");
3297 fRunLoader = AliRunLoader::Open(fGAliceFileName.Data());
3299 AliError(Form("no run loader found in file %s", fGAliceFileName.Data()));
3304 fRunLoader->CdGAFile();
3305 fRunLoader->LoadgAlice();
3307 //PH This is a temporary fix to give access to the kinematics
3308 //PH that is needed for the labels of ITS clusters
3309 fRunLoader->LoadHeader();
3310 fRunLoader->LoadKinematics();
3312 } else { // galice.root does not exist
3314 AliError(Form("the file %s does not exist", fGAliceFileName.Data()));
3316 fRunLoader = AliRunLoader::Open(fGAliceFileName.Data(),
3317 AliConfig::GetDefaultEventFolderName(),
3320 AliError(Form("could not create run loader in file %s",
3321 fGAliceFileName.Data()));
3325 fIsNewRunLoader = kTRUE;
3326 fRunLoader->MakeTree("E");
3327 fRunLoader->MakeTree("GG");
3329 if (fNumberOfEventsPerFile > 0)
3330 fRunLoader->SetNumberOfEventsPerFile(fNumberOfEventsPerFile);
3332 fRunLoader->SetNumberOfEventsPerFile((UInt_t)-1);
3338 //_____________________________________________________________________________
3339 AliReconstructor* AliReconstruction::GetReconstructor(Int_t iDet)
3341 // get the reconstructor object and the loader for a detector
3343 if (fReconstructor[iDet]) {
3344 if (fRecoParam.GetDetRecoParamArray(iDet) && !AliReconstructor::GetRecoParam(iDet)) {
3345 const AliDetectorRecoParam *par = fRecoParam.GetDetRecoParam(iDet);
3346 fReconstructor[iDet]->SetRecoParam(par);
3347 fReconstructor[iDet]->SetRunInfo(fRunInfo);
3349 return fReconstructor[iDet];
3352 // load the reconstructor object
3353 TPluginManager* pluginManager = gROOT->GetPluginManager();
3354 TString detName = fgkDetectorName[iDet];
3355 TString recName = "Ali" + detName + "Reconstructor";
3357 if (!fIsNewRunLoader && !fRunLoader->GetLoader(detName+"Loader") && (detName != "HLT")) return NULL;
3359 AliReconstructor* reconstructor = NULL;
3360 // first check if a plugin is defined for the reconstructor
3361 TPluginHandler* pluginHandler =
3362 pluginManager->FindHandler("AliReconstructor", detName);
3363 // if not, add a plugin for it
3364 if (!pluginHandler) {
3365 AliDebug(1, Form("defining plugin for %s", recName.Data()));
3366 TString libs = gSystem->GetLibraries();
3367 if (libs.Contains("lib" + detName + "base.so") ||
3368 (gSystem->Load("lib" + detName + "base.so") >= 0)) {
3369 pluginManager->AddHandler("AliReconstructor", detName,
3370 recName, detName + "rec", recName + "()");
3372 pluginManager->AddHandler("AliReconstructor", detName,
3373 recName, detName, recName + "()");
3375 pluginHandler = pluginManager->FindHandler("AliReconstructor", detName);
3377 if (pluginHandler && (pluginHandler->LoadPlugin() == 0)) {
3378 reconstructor = (AliReconstructor*) pluginHandler->ExecPlugin(0);
3381 // check if the upgrade reconstructor should be used instead of the standard one
3382 if(fUpgradeMask[iDet]) {
3383 if(reconstructor) delete reconstructor;
3384 TClass *cl = new TClass(Form("Ali%sUpgradeReconstructor",fgkDetectorName[iDet]));
3385 reconstructor = (AliReconstructor*)(cl->New());
3388 if (reconstructor) {
3389 TObject* obj = fOptions.FindObject(detName.Data());
3390 if (obj) reconstructor->SetOption(obj->GetTitle());
3391 reconstructor->SetRunInfo(fRunInfo);
3392 reconstructor->Init();
3393 fReconstructor[iDet] = reconstructor;
3396 // get or create the loader
3397 if (detName != "HLT") {
3398 fLoader[iDet] = fRunLoader->GetLoader(detName + "Loader");
3399 if (!fLoader[iDet]) {
3400 AliConfig::Instance()
3401 ->CreateDetectorFolders(fRunLoader->GetEventFolder(),
3403 // first check if a plugin is defined for the loader
3405 pluginManager->FindHandler("AliLoader", detName);
3406 // if not, add a plugin for it
3407 if (!pluginHandler) {
3408 TString loaderName = "Ali" + detName + "Loader";
3409 AliDebug(1, Form("defining plugin for %s", loaderName.Data()));
3410 pluginManager->AddHandler("AliLoader", detName,
3411 loaderName, detName + "base",
3412 loaderName + "(const char*, TFolder*)");
3413 pluginHandler = pluginManager->FindHandler("AliLoader", detName);
3415 if (pluginHandler && (pluginHandler->LoadPlugin() == 0)) {
3417 (AliLoader*) pluginHandler->ExecPlugin(2, detName.Data(),
3418 fRunLoader->GetEventFolder());
3420 if (!fLoader[iDet]) { // use default loader
3421 fLoader[iDet] = new AliLoader(detName, fRunLoader->GetEventFolder());
3423 if (!fLoader[iDet]) {
3424 AliWarning(Form("couldn't get loader for %s", detName.Data()));
3425 if (fStopOnError) return NULL;
3427 fRunLoader->AddLoader(fLoader[iDet]);
3428 fRunLoader->CdGAFile();
3429 if (gFile && !gFile->IsWritable()) gFile->ReOpen("UPDATE");
3430 fRunLoader->Write(0, TObject::kOverwrite);
3435 if (fRecoParam.GetDetRecoParamArray(iDet) && !AliReconstructor::GetRecoParam(iDet)) {
3436 const AliDetectorRecoParam *par = fRecoParam.GetDetRecoParam(iDet);
3437 if (reconstructor) {
3438 reconstructor->SetRecoParam(par);
3439 reconstructor->SetRunInfo(fRunInfo);
3442 return reconstructor;
3445 //_____________________________________________________________________________
3446 AliVertexer* AliReconstruction::CreateVertexer()
3448 // create the vertexer
3449 // Please note that the caller is the owner of the
3452 AliVertexer* vertexer = NULL;
3453 AliReconstructor* itsReconstructor = GetReconstructor(0);
3454 if (itsReconstructor && ((fRunLocalReconstruction.Contains("ITS")) ||
3455 fRunTracking.Contains("ITS") || fFillESD.Contains("ITS") )) {
3456 vertexer = itsReconstructor->CreateVertexer();
3459 AliWarning("couldn't create a vertexer for ITS");
3465 //_____________________________________________________________________________
3466 AliTrackleter* AliReconstruction::CreateMultFinder()
3468 // create the ITS trackleter for mult. estimation
3469 // Please note that the caller is the owner of the
3472 AliTrackleter* trackleter = NULL;
3473 AliReconstructor* itsReconstructor = GetReconstructor(0);
3474 if (itsReconstructor && ((fRunLocalReconstruction.Contains("ITS")) ||
3475 fRunTracking.Contains("ITS") || fFillESD.Contains("ITS") )) {
3476 trackleter = itsReconstructor->CreateMultFinder();
3479 AliWarning("ITS is not in reconstruction, switching off RunMultFinder");
3480 fRunMultFinder = kFALSE;
3486 //_____________________________________________________________________________
3487 Bool_t AliReconstruction::CreateTrackers(const TString& detectors)
3489 // create the trackers
3490 AliInfo("Creating trackers");
3492 TString detStr = detectors;
3493 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
3494 if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
3495 AliReconstructor* reconstructor = GetReconstructor(iDet);
3496 if (!reconstructor) continue;
3497 TString detName = fgkDetectorName[iDet];
3498 if (detName == "HLT") {
3499 fRunHLTTracking = kTRUE;
3502 if (detName == "MUON") {
3503 fRunMuonTracking = kTRUE;
3507 fTracker[iDet] = reconstructor->CreateTracker();
3508 if (!fTracker[iDet] && (iDet < 7)) {
3509 AliWarning(Form("couldn't create a tracker for %s", detName.Data()));
3510 if (fStopOnError) return kFALSE;
3512 AliSysInfo::AddStamp(Form("LTracker%s",fgkDetectorName[iDet]), iDet,0);
3518 //_____________________________________________________________________________
3519 void AliReconstruction::CleanUp()
3521 // delete trackers and the run loader and close and delete the file
3523 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
3524 delete fReconstructor[iDet];
3525 fReconstructor[iDet] = NULL;
3526 fLoader[iDet] = NULL;
3527 delete fTracker[iDet];
3528 fTracker[iDet] = NULL;
3535 delete fSPDTrackleter;
3536 fSPDTrackleter = NULL;
3545 delete fParentRawReader;
3546 fParentRawReader=NULL;
3554 if (AliQAManager::QAManager())
3555 AliQAManager::QAManager()->ShowQA() ;
3556 // AliQAManager::Destroy() ;
3561 void AliReconstruction::WriteAlignmentData(AliESDEvent* esd)
3563 // Write space-points which are then used in the alignment procedures
3564 // For the moment only ITS, TPC, TRD and TOF
3566 Int_t ntracks = esd->GetNumberOfTracks();
3567 for (Int_t itrack = 0; itrack < ntracks; itrack++)
3569 AliESDtrack *track = esd->GetTrack(itrack);
3572 for (Int_t i=0; i<200; ++i) idx[i] = -1; //PH avoid uninitialized values
3573 for (Int_t iDet = 5; iDet >= 0; iDet--) {// TOF, TRD, TPC, ITS clusters
3574 nsp += (iDet==GetDetIndex("TRD")) ? track->GetTRDntracklets():track->GetNcls(iDet);
3576 if (iDet==GetDetIndex("ITS")) { // ITS "extra" clusters
3577 track->GetClusters(iDet,idx);
3578 for (Int_t i=6; i<12; i++) if(idx[i] >= 0) nsp++;
3583 AliTrackPointArray *sp = new AliTrackPointArray(nsp);
3584 track->SetTrackPointArray(sp);
3586 for (Int_t iDet = 5; iDet >= 0; iDet--) {
3587 AliTracker *tracker = fTracker[iDet];
3588 if (!tracker) continue;
3589 Int_t nspdet = (iDet==GetDetIndex("TRD")) ? track->GetTRDtracklets(idx):track->GetClusters(iDet,idx);
3591 if (iDet==GetDetIndex("ITS")) // ITS "extra" clusters
3592 for (Int_t i=6; i<12; i++) if(idx[i] >= 0) nspdet++;
3594 if (nspdet <= 0) continue;
3598 while (isp2 < nspdet) {
3599 Bool_t isvalid=kTRUE;
3601 Int_t index=idx[isp++];
3602 if (index < 0) continue;
3604 TString dets = fgkDetectorName[iDet];
3605 if ((fUseTrackingErrorsForAlignment.CompareTo(dets) == 0) ||
3606 fUseTrackingErrorsForAlignment.BeginsWith(dets+" ") ||
3607 fUseTrackingErrorsForAlignment.EndsWith(" "+dets) ||
3608 fUseTrackingErrorsForAlignment.Contains(" "+dets+" ")) {
3609 isvalid = tracker->GetTrackPointTrackingError(index,p,track);
3611 isvalid = tracker->GetTrackPoint(index,p);
3614 if (!isvalid) continue;
3615 if (iDet==GetDetIndex("ITS") && (isp-1)>=6) p.SetExtra();
3616 sp->AddPoint(isptrack,&p); isptrack++;
3623 //_____________________________________________________________________________
3624 void AliReconstruction::FillRawDataErrorLog(Int_t iEvent, AliESDEvent* esd)
3626 // The method reads the raw-data error log
3627 // accumulated within the rawReader.
3628 // It extracts the raw-data errors related to
3629 // the current event and stores them into
3630 // a TClonesArray inside the esd object.
3632 if (!fRawReader) return;
3634 for(Int_t i = 0; i < fRawReader->GetNumberOfErrorLogs(); i++) {
3636 AliRawDataErrorLog *log = fRawReader->GetErrorLog(i);
3638 if (iEvent != log->GetEventNumber()) continue;
3640 esd->AddRawDataErrorLog(log);
3645 //_____________________________________________________________________________
3646 // void AliReconstruction::CheckQA()
3648 // check the QA of SIM for this run and remove the detectors
3649 // with status Fatal
3651 // TString newRunLocalReconstruction ;
3652 // TString newRunTracking ;
3653 // TString newFillESD ;
3655 // for (Int_t iDet = 0; iDet < AliQAv1::kNDET; iDet++) {
3656 // TString detName(AliQAv1::GetDetName(iDet)) ;
3657 // AliQAv1 * qa = AliQAv1::Instance(AliQAv1::DETECTORINDEX_t(iDet)) ;
3658 // if ( qa->IsSet(AliQAv1::DETECTORINDEX_t(iDet), AliQAv1::kSIM, specie, AliQAv1::kFATAL)) {
3659 // AliInfo(Form("QA status for %s %s in Hits and/or SDIGITS and/or Digits was Fatal; No reconstruction performed",
3660 // detName.Data(), AliRecoParam::GetEventSpecieName(es))) ;
3662 // if ( fRunLocalReconstruction.Contains(AliQAv1::GetDetName(iDet)) ||
3663 // fRunLocalReconstruction.Contains("ALL") ) {
3664 // newRunLocalReconstruction += detName ;
3665 // newRunLocalReconstruction += " " ;
3667 // if ( fRunTracking.Contains(AliQAv1::GetDetName(iDet)) ||
3668 // fRunTracking.Contains("ALL") ) {
3669 // newRunTracking += detName ;
3670 // newRunTracking += " " ;
3672 // if ( fFillESD.Contains(AliQAv1::GetDetName(iDet)) ||
3673 // fFillESD.Contains("ALL") ) {
3674 // newFillESD += detName ;
3675 // newFillESD += " " ;
3679 // fRunLocalReconstruction = newRunLocalReconstruction ;
3680 // fRunTracking = newRunTracking ;
3681 // fFillESD = newFillESD ;
3684 //_____________________________________________________________________________
3685 Int_t AliReconstruction::GetDetIndex(const char* detector)
3687 // return the detector index corresponding to detector
3689 for (index = 0; index < kNDetectors ; index++) {
3690 if ( strcmp(detector, fgkDetectorName[index]) == 0 )
3695 //_____________________________________________________________________________
3696 Bool_t AliReconstruction::FinishPlaneEff() {
3698 // Here execute all the necessary operationis, at the end of the tracking phase,
3699 // in case that evaluation of PlaneEfficiencies was required for some detector.
3700 // E.g., write into a DataBase file the PlaneEfficiency which have been evaluated.
3702 // This Preliminary version works only FOR ITS !!!!!
3703 // other detectors (TOF,TRD, etc. have to develop their specific codes)
3706 // Return: kTRUE if all operations have been done properly, kFALSE otherwise
3709 TString detStr = fLoadCDB;
3710 //for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
3711 for (Int_t iDet = 0; iDet < 1; iDet++) { // for the time being only ITS
3712 if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
3713 if(fTracker[iDet] && fTracker[iDet]->GetPlaneEff()) {
3714 AliPlaneEff *planeeff=fTracker[iDet]->GetPlaneEff();
3715 TString name=planeeff->GetName();
3717 TFile* pefile = TFile::Open(name, "RECREATE");
3718 ret=(Bool_t)planeeff->Write();
3720 if(planeeff->GetCreateHistos()) {
3721 TString hname=planeeff->GetName();
3722 hname+="Histo.root";
3723 ret*=planeeff->WriteHistosToFile(hname,"RECREATE");
3726 if(fSPDTrackleter) {
3727 AliPlaneEff *planeeff=fSPDTrackleter->GetPlaneEff();
3728 TString name="AliITSPlaneEffSPDtracklet.root";
3729 TFile* pefile = TFile::Open(name, "RECREATE");
3730 ret=(Bool_t)planeeff->Write();
3732 AliESDEvent *dummy=NULL;
3733 ret=(Bool_t)fSPDTrackleter->PostProcess(dummy); // take care of writing other files
3738 //_____________________________________________________________________________
3739 Bool_t AliReconstruction::InitPlaneEff() {
3741 // Here execute all the necessary operations, before of the tracking phase,
3742 // for the evaluation of PlaneEfficiencies, in case required for some detectors.
3743 // E.g., read from a DataBase file a first evaluation of the PlaneEfficiency
3744 // which should be updated/recalculated.
3746 // This Preliminary version will work only FOR ITS !!!!!
3747 // other detectors (TOF,TRD, etc. have to develop their specific codes)
3750 // Return: kTRUE if all operations have been done properly, kFALSE otherwise
3753 fSPDTrackleter = NULL;
3754 TString detStr = fLoadCDB;
3755 if (IsSelected(fgkDetectorName[0], detStr)) {
3756 AliReconstructor* itsReconstructor = GetReconstructor(0);
3757 if (itsReconstructor) {
3758 fSPDTrackleter = itsReconstructor->CreateTrackleter(); // this is NULL unless required in RecoParam
3760 if (fSPDTrackleter) {
3761 AliInfo("Trackleter for SPD has been created");
3767 //_____________________________________________________________________________
3768 Bool_t AliReconstruction::InitAliEVE()
3770 // This method should be called only in case
3771 // AliReconstruction is run
3772 // within the alieve environment.
3773 // It will initialize AliEVE in a way
3774 // so that it can visualize event processed
3775 // by AliReconstruction.
3776 // The return flag shows whenever the
3777 // AliEVE initialization was successful or not.
3779 TString macroStr(getenv("ALIEVE_ONLINE_MACRO"));
3781 if (macroStr.IsNull())
3782 macroStr.Form("%s/EVE/macros/alieve_online.C",gSystem->ExpandPathName("$ALICE_ROOT"));
3784 AliInfo(Form("Loading AliEVE macro: %s",macroStr.Data()));
3786 if (gROOT->LoadMacro(macroStr.Data()) != 0) return kFALSE;
3788 gROOT->ProcessLine("if (!AliEveEventManager::GetMaster()){new AliEveEventManager();AliEveEventManager::GetMaster()->AddNewEventCommand(\"alieve_online_on_new_event()\");gEve->AddEvent(AliEveEventManager::GetMaster());};");
3789 gROOT->ProcessLine("alieve_online_init()");
3794 //_____________________________________________________________________________
3795 void AliReconstruction::RunAliEVE()
3797 // Runs AliEVE visualisation of
3798 // the current event.
3799 // Should be executed only after
3800 // successful initialization of AliEVE.
3802 AliInfo("Running AliEVE...");
3803 gROOT->ProcessLine(Form("AliEveEventManager::GetMaster()->SetEvent((AliRunLoader*)%p,(AliRawReader*)%p,(AliESDEvent*)%p,(AliESDfriend*)%p);",fRunLoader,fRawReader,fesd,fesdf));
3807 //_____________________________________________________________________________
3808 Bool_t AliReconstruction::SetRunQA(TString detAndAction)
3810 // Allows to run QA for a selected set of detectors
3811 // and a selected set of tasks among RAWS, DIGITSR, RECPOINTS and ESDS
3812 // all selected detectors run the same selected tasks
3814 if (!detAndAction.Contains(":")) {
3815 AliError( Form("%s is a wrong syntax, use \"DetectorList:ActionList\" \n", detAndAction.Data()) ) ;
3819 Int_t colon = detAndAction.Index(":") ;
3820 fQADetectors = detAndAction(0, colon) ;
3821 fQATasks = detAndAction(colon+1, detAndAction.Sizeof() ) ;
3822 if (fQATasks.Contains("ALL") ) {
3823 fQATasks = Form("%d %d %d %d", AliQAv1::kRAWS, AliQAv1::kDIGITSR, AliQAv1::kRECPOINTS, AliQAv1::kESDS) ;
3825 fQATasks.ToUpper() ;
3827 if ( fQATasks.Contains("RAW") )
3828 tempo = Form("%d ", AliQAv1::kRAWS) ;
3829 if ( fQATasks.Contains("DIGIT") )
3830 tempo += Form("%d ", AliQAv1::kDIGITSR) ;
3831 if ( fQATasks.Contains("RECPOINT") )
3832 tempo += Form("%d ", AliQAv1::kRECPOINTS) ;
3833 if ( fQATasks.Contains("ESD") )
3834 tempo += Form("%d ", AliQAv1::kESDS) ;
3836 if (fQATasks.IsNull()) {
3837 AliInfo("No QA requested\n") ;
3842 TString tempo(fQATasks) ;
3843 tempo.ReplaceAll(Form("%d", AliQAv1::kRAWS), AliQAv1::GetTaskName(AliQAv1::kRAWS)) ;
3844 tempo.ReplaceAll(Form("%d", AliQAv1::kDIGITSR), AliQAv1::GetTaskName(AliQAv1::kDIGITSR)) ;
3845 tempo.ReplaceAll(Form("%d", AliQAv1::kRECPOINTS), AliQAv1::GetTaskName(AliQAv1::kRECPOINTS)) ;
3846 tempo.ReplaceAll(Form("%d", AliQAv1::kESDS), AliQAv1::GetTaskName(AliQAv1::kESDS)) ;
3847 AliInfo( Form("QA will be done on \"%s\" for \"%s\"\n", fQADetectors.Data(), tempo.Data()) ) ;
3852 //_____________________________________________________________________________
3853 Bool_t AliReconstruction::InitRecoParams()
3855 // The method accesses OCDB and retrieves all
3856 // the available reco-param objects from there.
3858 Bool_t isOK = kTRUE;
3860 if (fRecoParam.GetDetRecoParamArray(kNDetectors)) {
3861 AliInfo("Using custom GRP reconstruction parameters");
3864 AliInfo("Loading GRP reconstruction parameter objects");
3866 AliCDBPath path("GRP","Calib","RecoParam");
3867 AliCDBEntry *entry=AliCDBManager::Instance()->Get(path.GetPath());
3869 AliWarning("Couldn't find GRP RecoParam entry in OCDB");
3873 TObject *recoParamObj = entry->GetObject();
3874 if (dynamic_cast<TObjArray*>(recoParamObj)) {
3875 // GRP has a normal TobjArray of AliDetectorRecoParam objects
3876 // Registering them in AliRecoParam
3877 fRecoParam.AddDetRecoParamArray(kNDetectors,dynamic_cast<TObjArray*>(recoParamObj));
3879 else if (dynamic_cast<AliDetectorRecoParam*>(recoParamObj)) {
3880 // GRP has only onse set of reco parameters
3881 // Registering it in AliRecoParam
3882 AliInfo("Single set of GRP reconstruction parameters found");
3883 dynamic_cast<AliDetectorRecoParam*>(recoParamObj)->SetAsDefault();
3884 fRecoParam.AddDetRecoParam(kNDetectors,dynamic_cast<AliDetectorRecoParam*>(recoParamObj));
3887 AliError("No valid GRP RecoParam object found in the OCDB");
3894 TString detStr = fLoadCDB;
3895 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
3897 if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
3899 if (fRecoParam.GetDetRecoParamArray(iDet)) {
3900 AliInfo(Form("Using custom reconstruction parameters for detector %s",fgkDetectorName[iDet]));
3904 AliInfo(Form("Loading reconstruction parameter objects for detector %s",fgkDetectorName[iDet]));
3906 AliCDBPath path(fgkDetectorName[iDet],"Calib","RecoParam");
3907 AliCDBEntry *entry=AliCDBManager::Instance()->Get(path.GetPath());
3909 AliWarning(Form("Couldn't find RecoParam entry in OCDB for detector %s",fgkDetectorName[iDet]));
3913 TObject *recoParamObj = entry->GetObject();
3914 if (dynamic_cast<TObjArray*>(recoParamObj)) {
3915 // The detector has a normal TobjArray of AliDetectorRecoParam objects
3916 // Registering them in AliRecoParam
3917 fRecoParam.AddDetRecoParamArray(iDet,dynamic_cast<TObjArray*>(recoParamObj));
3919 else if (dynamic_cast<AliDetectorRecoParam*>(recoParamObj)) {
3920 // The detector has only onse set of reco parameters
3921 // Registering it in AliRecoParam
3922 AliInfo(Form("Single set of reconstruction parameters found for detector %s",fgkDetectorName[iDet]));
3923 dynamic_cast<AliDetectorRecoParam*>(recoParamObj)->SetAsDefault();
3924 fRecoParam.AddDetRecoParam(iDet,dynamic_cast<AliDetectorRecoParam*>(recoParamObj));
3927 AliError(Form("No valid RecoParam object found in the OCDB for detector %s",fgkDetectorName[iDet]));
3931 // FIX ME: We have to disable the unloading of reco-param CDB
3932 // entries because QA framework is using them. Has to be fix in
3933 // a way that the QA takes the objects already constructed in
3935 // AliCDBManager::Instance()->UnloadFromCache(path.GetPath());
3939 if (AliDebugLevel() > 0) fRecoParam.Print();
3944 //_____________________________________________________________________________
3945 Bool_t AliReconstruction::GetEventInfo()
3947 // Fill the event info object
3949 AliCodeTimerAuto("",0)
3951 AliCentralTrigger *aCTP = NULL;
3953 fEventInfo.SetEventType(fRawReader->GetType());
3955 ULong64_t mask = fRawReader->GetClassMask();
3956 fEventInfo.SetTriggerMask(mask);
3957 UInt_t clmask = fRawReader->GetDetectorPattern()[0];
3958 fEventInfo.SetTriggerCluster(AliDAQ::ListOfTriggeredDetectors(clmask));
3960 aCTP = new AliCentralTrigger();
3961 TString configstr("");
3962 if (!aCTP->LoadConfiguration(configstr)) { // Load CTP config from OCDB
3963 AliError("No trigger configuration found in OCDB! The trigger configuration information will not be used!");
3967 aCTP->SetClassMask(mask);
3968 aCTP->SetClusterMask(clmask);
3971 AliCentralTrigger* rlCTP = fRunLoader->GetTrigger();
3973 rlCTP->SetClassMask(mask);
3974 rlCTP->SetClusterMask(clmask);
3979 fEventInfo.SetEventType(AliRawEventHeaderBase::kPhysicsEvent);
3981 if (fRunLoader && (!fRunLoader->LoadTrigger())) {
3982 aCTP = fRunLoader->GetTrigger();
3983 fEventInfo.SetTriggerMask(aCTP->GetClassMask());
3984 // get inputs from actp - just get
3985 AliESDHeader* esdheader = fesd->GetHeader();
3986 esdheader->SetL0TriggerInputs(aCTP->GetL0TriggerInputs());
3987 esdheader->SetL1TriggerInputs(aCTP->GetL1TriggerInputs());
3988 esdheader->SetL2TriggerInputs(aCTP->GetL2TriggerInputs());
3989 fEventInfo.SetTriggerCluster(AliDAQ::ListOfTriggeredDetectors(aCTP->GetClusterMask()));
3992 AliWarning("No trigger can be loaded! The trigger information will not be used!");
3997 AliTriggerConfiguration *config = aCTP->GetConfiguration();
3999 AliError("No trigger configuration has been found! The trigger configuration information will not be used!");
4000 if (fRawReader) delete aCTP;
4004 // Load trigger aliases and declare the trigger classes included in aliases
4005 AliCDBEntry * entry = AliCDBManager::Instance()->Get("GRP/CTP/Aliases");
4007 THashList * lst = dynamic_cast<THashList*>(entry->GetObject());
4009 lst->Sort(kSortDescending); // to avoid problems with substrungs
4010 if (fRawReader) fRawReader->LoadTriggerAlias(lst);
4011 // Now declare all the triggers present in the aliases
4014 while((nmd = dynamic_cast<TNamed*>(iter.Next()))){
4015 fDeclTriggerClasses += " ";
4016 fDeclTriggerClasses += nmd->GetName();
4020 AliError("Cannot cast the object with trigger aliases to THashList!");
4024 AliError("No OCDB ebtry for the trigger aliases!");
4026 // Load trigger classes for this run
4027 UChar_t clustmask = 0;
4029 ULong64_t trmask = fEventInfo.GetTriggerMask();
4030 const TObjArray& classesArray = config->GetClasses();
4031 Int_t nclasses = classesArray.GetEntriesFast();
4032 for( Int_t iclass=0; iclass < nclasses; iclass++ ) {
4033 AliTriggerClass* trclass = (AliTriggerClass*)classesArray.At(iclass);
4034 if (trclass && trclass->GetMask()>0) {
4035 Int_t trindex = TMath::Nint(TMath::Log2(trclass->GetMask()));
4036 if (fesd) fesd->SetTriggerClass(trclass->GetName(),trindex);
4037 if (fRawReader) fRawReader->LoadTriggerClass(trclass->GetName(),trindex);
4038 if (trmask & (1ull << trindex)) {
4040 trclasses += trclass->GetName();
4042 clustmask |= trclass->GetCluster()->GetClusterMask();
4046 fEventInfo.SetTriggerClasses(trclasses);
4047 // Now put the declared trigger classes (not present in the run)
4048 // to 0/false in the event selection
4049 if (!fDeclTriggerClasses.IsNull()) {
4050 TObjArray *tokens = fDeclTriggerClasses.Tokenize(" ");
4051 Int_t ntokens = tokens->GetEntriesFast();
4052 for (Int_t itoken = 0; itoken < ntokens; ++itoken) {
4053 if (fRawReader) fRawReader->LoadTriggerClass((((TObjString*)tokens->At(itoken))->String()).Data(),-1);
4058 // Write names of active trigger inputs in ESD Header
4059 const TObjArray& inputsArray = config->GetInputs();
4060 Int_t ninputs = inputsArray.GetEntriesFast();
4061 for( Int_t iinput=0; iinput < ninputs; iinput++ ) {
4062 AliTriggerInput* trginput = (AliTriggerInput*)inputsArray.At(iinput);
4063 if (trginput && trginput->GetMask()>0) {
4064 Int_t inputIndex = (Int_t)TMath::Nint(TMath::Log2(trginput->GetMask()));
4065 AliESDHeader* headeresd = 0x0;
4066 if (fesd) headeresd = fesd->GetHeader();
4068 Int_t trglevel = (Int_t)trginput->GetLevel();
4069 if (trglevel == 0) headeresd->SetActiveTriggerInputs(trginput->GetInputName(), inputIndex);
4070 if (trglevel == 1) headeresd->SetActiveTriggerInputs(trginput->GetInputName(), inputIndex+24);
4071 if (trglevel == 2) headeresd->SetActiveTriggerInputs(trginput->GetInputName(), inputIndex+48);
4076 // Set the information in ESD
4078 fesd->SetTriggerMask(trmask);
4079 fesd->SetTriggerCluster(clustmask);
4082 if (!aCTP->CheckTriggeredDetectors()) {
4083 if (fRawReader) delete aCTP;
4087 if (fRawReader) delete aCTP;
4089 // We have to fill also the HLT decision here!!
4095 const char *AliReconstruction::MatchDetectorList(const char *detectorList, UInt_t detectorMask)
4097 // Match the detector list found in the rec.C or the default 'ALL'
4098 // to the list found in the GRP (stored there by the shuttle PP which
4099 // gets the information from ECS)
4100 static TString resultList;
4101 TString detList = detectorList;
4105 for(Int_t iDet = 0; iDet < (AliDAQ::kNDetectors-1); iDet++) {
4106 if ((detectorMask >> iDet) & 0x1) {
4107 TString det = AliDAQ::OfflineModuleName(iDet);
4108 if ((detList.CompareTo("ALL") == 0) ||
4109 ((detList.BeginsWith("ALL ") ||
4110 detList.EndsWith(" ALL") ||
4111 detList.Contains(" ALL ")) &&
4112 !(detList.BeginsWith("-"+det+" ") ||
4113 detList.EndsWith(" -"+det) ||
4114 detList.Contains(" -"+det+" "))) ||
4115 (detList.CompareTo(det) == 0) ||
4116 detList.BeginsWith(det+" ") ||
4117 detList.EndsWith(" "+det) ||
4118 detList.Contains( " "+det+" " )) {
4119 if (!resultList.EndsWith(det + " ")) {
4128 if ((detectorMask >> AliDAQ::kHLTId) & 0x1) {
4129 TString hltDet = AliDAQ::OfflineModuleName(AliDAQ::kNDetectors-1);
4130 if ((detList.CompareTo("ALL") == 0) ||
4131 ((detList.BeginsWith("ALL ") ||
4132 detList.EndsWith(" ALL") ||
4133 detList.Contains(" ALL ")) &&
4134 !(detList.BeginsWith("-"+hltDet+" ") ||
4135 detList.EndsWith(" -"+hltDet) ||
4136 detList.Contains(" -"+hltDet+" "))) ||
4137 (detList.CompareTo(hltDet) == 0) ||
4138 detList.BeginsWith(hltDet+" ") ||
4139 detList.EndsWith(" "+hltDet) ||
4140 detList.Contains( " "+hltDet+" " )) {
4141 resultList += hltDet;
4145 return resultList.Data();
4149 //______________________________________________________________________________
4150 void AliReconstruction::Abort(const char *method, EAbort what)
4152 // Abort processing. If what = kAbortProcess, the Process() loop will be
4153 // aborted. If what = kAbortFile, the current file in a chain will be
4154 // aborted and the processing will continue with the next file, if there
4155 // is no next file then Process() will be aborted. Abort() can also be
4156 // called from Begin(), SlaveBegin(), Init() and Notify(). After abort
4157 // the SlaveTerminate() and Terminate() are always called. The abort flag
4158 // can be checked in these methods using GetAbort().
4160 // The method is overwritten in AliReconstruction for better handling of
4161 // reco specific errors
4163 if (!fStopOnError) return;
4167 TString whyMess = method;
4168 whyMess += " failed! Aborting...";
4170 AliError(whyMess.Data());
4173 TString mess = "Abort";
4174 if (fAbort == kAbortProcess)
4175 mess = "AbortProcess";
4176 else if (fAbort == kAbortFile)
4179 Info(mess.Data(), "%s", whyMess.Data());
4182 //______________________________________________________________________________
4183 Bool_t AliReconstruction::ProcessEvent(void* event)
4185 // Method that is used in case the event loop
4186 // is steered from outside, for example by AMORE
4187 // 'event' is a pointer to the DATE event in the memory
4189 if (fRawReader) delete fRawReader;
4190 fRawReader = new AliRawReaderDate(event);
4191 fStatus = ProcessEvent(fRunLoader->GetNumberOfEvents());
4198 //______________________________________________________________________________
4199 Bool_t AliReconstruction::ParseOutput()
4201 // The method parses the output file
4202 // location string in order to steer
4203 // properly the selector
4205 TPMERegexp re1("(\\w+\\.zip#\\w+\\.root):([,*\\w+\\.root,*]+)@dataset://(\\w++)");
4206 TPMERegexp re2("(\\w+\\.root)?@?dataset://(\\w++)");
4208 if (re1.Match(fESDOutput) == 4) {
4209 // root archive with output files stored and regustered
4211 gProof->AddInput(new TNamed("PROOF_OUTPUTFILE",re1[1].Data()));
4212 gProof->AddInput(new TNamed("PROOF_OUTPUTFILE_LOCATION",re1[3].Data()));
4213 gProof->AddInput(new TNamed("PROOF_OUTPUTFILE_DATASET",""));
4214 gProof->AddInput(new TNamed("PROOF_OUTPUTFILE_ARCHIVE",re1[2].Data()));
4215 AliInfo(Form("%s files will be stored within %s in dataset %s",
4220 else if (re2.Match(fESDOutput) == 3) {
4221 // output file stored and registered
4223 gProof->AddInput(new TNamed("PROOF_OUTPUTFILE",(re2[1].IsNull()) ? "AliESDs.root" : re2[1].Data()));
4224 gProof->AddInput(new TNamed("PROOF_OUTPUTFILE_LOCATION",re2[2].Data()));
4225 gProof->AddInput(new TNamed("PROOF_OUTPUTFILE_DATASET",""));
4226 AliInfo(Form("%s will be stored in dataset %s",
4227 (re2[1].IsNull()) ? "AliESDs.root" : re2[1].Data(),
4231 if (fESDOutput.IsNull()) {
4232 // Output location not given.
4233 // Assuming xrootd has been already started and
4234 // the output file has to be sent back
4235 // to the client machine
4236 TString esdUrl(Form("root://%s/%s/",
4237 TUrl(gSystem->HostName()).GetHostFQDN(),
4239 gProof->AddInput(new TNamed("PROOF_OUTPUTFILE","AliESDs.root"));
4240 gProof->AddInput(new TNamed("PROOF_OUTPUTFILE_LOCATION",esdUrl.Data()));
4241 AliInfo(Form("AliESDs.root will be stored in %s",
4245 // User specified an output location.
4246 // Ones has just to parse it here
4247 TUrl outputUrl(fESDOutput.Data());
4248 TString outputFile(gSystem->BaseName(outputUrl.GetFile()));
4249 gProof->AddInput(new TNamed("PROOF_OUTPUTFILE",outputFile.IsNull() ? "AliESDs.root" : outputFile.Data()));
4250 TString outputLocation(outputUrl.GetUrl());
4251 outputLocation.ReplaceAll(outputFile.Data(),"");
4252 gProof->AddInput(new TNamed("PROOF_OUTPUTFILE_LOCATION",outputLocation.Data()));
4253 AliInfo(Form("%s will be stored in %s",
4254 outputFile.IsNull() ? "AliESDs.root" : outputFile.Data(),
4255 outputLocation.Data()));
4262 //______________________________________________________________________________
4263 Bool_t AliReconstruction::IsHighPt() const {
4264 // Selection of events containing "high" pT tracks
4265 // If at least one track is found within 1.5 and 100 GeV (pT)
4266 // that was reconstructed by both ITS and TPC, the event is accepted
4269 const Double_t pTmin = 1.5;
4270 const Double_t pTmax = 100;
4272 mask |= (AliESDtrack::kITSrefit);
4273 mask |= (AliESDtrack::kTPCrefit);
4274 const Double_t pTminCosmic = 5.;
4275 const Double_t pTmaxCosmic = 100;
4276 ULong_t maskCosmic = 0;
4277 Int_t cosmicCount=0;
4278 maskCosmic |= (AliESDtrack::kTPCrefit);
4280 Bool_t isOK = kFALSE;
4282 if (fesd && fesd->GetEventType()==AliRawEventHeaderBase::kPhysicsEvent) {
4283 // Check if this ia a physics event (code 7)
4284 Int_t ntrk = fesd->GetNumberOfTracks();
4285 for (Int_t itrk=0; itrk<ntrk; ++itrk) {
4287 AliESDtrack * trk = fesd->GetTrack(itrk);
4289 && trk->Pt() > pTmin
4290 && trk->Pt() < pTmax
4291 && (trk->GetStatus() & mask) == mask ) {
4297 && trk->GetInnerParam()
4298 && trk->GetInnerParam()->Pt() > pTminCosmic
4299 && trk->GetInnerParam()->Pt() < pTmaxCosmic
4300 && (trk->GetStatus() & maskCosmic) == maskCosmic ) {
4306 if (cosmicCount>1) isOK=kTRUE;
4311 //______________________________________________________________________________
4312 Bool_t AliReconstruction::IsCosmicOrCalibSpecie() const {
4313 // Select cosmic or calibration events
4315 Bool_t isOK = kFALSE;
4317 if (fesd && fesd->GetEventType()==AliRawEventHeaderBase::kPhysicsEvent) {
4318 // Check if this ia a physics event (code 7)
4320 UInt_t specie = fesd->GetEventSpecie();
4321 if (specie==AliRecoParam::kCosmic || specie==AliRecoParam::kCalib) {
4328 //______________________________________________________________________________
4329 void AliReconstruction::WriteESDfriend() {
4330 // Fill the ESD friend in the tree. The required fraction of ESD friends is stored
4331 // in fFractionFriends. We select events where we store the ESD friends according
4332 // to the following algorithm:
4333 // 1. Store all Cosmic or Calibration events within the required fraction
4334 // 2. Sample "high Pt" events within the remaining fraction after step 1.
4335 // 3. Sample randomly events if we still have remaining slot
4338 Bool_t isSelected = kFALSE;
4340 // Store all friends for B field OFF
4341 if (TMath::Abs(AliTrackerBase::GetBz())<0.5) isSelected=kTRUE;
4343 if (IsCosmicOrCalibSpecie()) { // Selection of calib or cosmic events
4350 Double_t remainingFraction = fFractionFriends;
4351 remainingFraction -= ((Double_t)(fSspecie)/(Double_t)(fNall));
4353 if (IsHighPt()) { // Selection of "high Pt" events
4355 Double_t curentHighPtFraction = ((Double_t)(fNhighPt+1))/((Double_t)(fNall+1));
4356 // "Bayesian" estimate supposing that without events all the events are of the required type
4359 Double_t rnd = gRandom->Rndm()*curentHighPtFraction;
4360 if (rnd<remainingFraction) {
4366 remainingFraction -= ((Double_t)(fShighPt)/(Double_t)(fNall));
4368 // Random selection to fill the remaining fraction (if any)
4370 Double_t rnd = gRandom->Rndm();
4371 if (rnd<remainingFraction) {
4377 fesdf->~AliESDfriend();
4378 new (fesdf) AliESDfriend(); // Reset...
4379 fesdf->SetSkipBit(kTRUE);
4385 //_________________________________________________________________
4386 void AliReconstruction::DeleteDigits(const TString& detectors)
4388 // delete requested digit files produced at current event
4389 static int iEvent = 0;
4390 if (detectors.IsNull()) return;
4391 TString detStr = detectors;
4392 AliInfo(Form("Deleting Digits: %s",detectors.Data()));
4394 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
4395 unlink(Form("%s.Digits.root",fgkDetectorName[iDet]));
4397 AliSysInfo::AddStamp(Form("DelDigits_%d",iEvent), 0,0,iEvent);
4401 //_________________________________________________________________
4402 void AliReconstruction::DeleteRecPoints(const TString& detectors)
4404 // delete requested recpoint files produced at current event
4405 static int iEvent = 0;
4406 if (detectors.IsNull()) return;
4407 TString detStr = detectors;
4408 AliInfo(Form("Deleting Recpoints: %s",detectors.Data()));
4410 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
4411 unlink(Form("%s.RecPoints.root",fgkDetectorName[iDet]));
4413 AliSysInfo::AddStamp(Form("DelRecPoints_%d",iEvent), 0,0,iEvent);
4417 //_________________________________________________________________
4418 void AliReconstruction::SetStopOnResourcesExcess(Int_t vRSS,Int_t vVMEM)
4420 // require checking the resources left and stopping on excess
4421 // if 0 : no check is done
4422 // if >0 : stop reconstruction if exceeds this value
4423 // if <0 : use as margin to system limits
4425 const int kKB2MB = 1024;
4426 const int kInfMem = 9999999;
4429 int pgSize = getpagesize();
4433 AliInfo(Form("Setting max. RSS usage to user value %d MB",fMaxRSS));
4436 getrlimit(RLIMIT_RSS,&r);
4437 fMaxRSS = r.rlim_max==RLIM_INFINITY ? kInfMem : int(r.rlim_max*pgSize/kKB2MB/kKB2MB) + vRSS;
4438 AliInfo(Form("Setting max. RSS usage to system hard limit %d%s MB (%d margin)",fMaxRSS,r.rlim_max==RLIM_INFINITY ? "(inf)":"",-vRSS));
4440 else {AliInfo("No check on RSS memory usage will be applied");}
4444 AliInfo(Form("Setting max. VMEM usage to user value %d MB",fMaxVMEM));
4447 getrlimit(RLIMIT_AS,&r);
4448 fMaxVMEM = r.rlim_max==RLIM_INFINITY ? kInfMem : int(r.rlim_max*pgSize/kKB2MB/kKB2MB) + vVMEM;
4449 AliInfo(Form("Setting max. VMEM usage to system hard limit %d%s MB (%d margin)",fMaxVMEM,r.rlim_max==RLIM_INFINITY ? "(inf)":"",-vVMEM));
4451 else {AliInfo("No check on RSS memory usage will be applied");}
4455 //_________________________________________________________________
4456 Bool_t AliReconstruction::HasEnoughResources(int ev)
4458 // check if process consumed more than allowed resources
4459 const int kKB2MB = 1024;
4461 if (!fMaxRSS && !fMaxVMEM) return res;
4463 ProcInfo_t procInfo;
4464 gSystem->GetProcInfo(&procInfo);
4465 if (procInfo.fMemResident/kKB2MB > fMaxRSS) res = kFALSE;
4466 if (procInfo.fMemVirtual/kKB2MB > fMaxVMEM) res = kFALSE;
4469 AliInfo(Form("Job exceeded allowed limits: RSS:%d (%d) VMEM:%d (%d), will stop",
4470 int(procInfo.fMemResident/kKB2MB),fMaxRSS,
4471 int(procInfo.fMemVirtual/kKB2MB) ,fMaxVMEM));
4473 unlink(Form("%s",fgkStopEvFName));
4474 ofstream outfile(fgkStopEvFName);
4475 outfile << ev << endl;