1 /**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
7 * Permission to use, copy, modify and distribute this software and its *
8 * documentation strictly for non-commercial purposes is hereby granted *
9 * without fee, provided that the above copyright notice appears in all *
10 * copies and that both the copyright notice and this permission notice *
11 * appear in the supporting documentation. The authors make no claims *
12 * about the suitability of this software for any purpose. It is *
13 * provided "as is" without express or implied warranty. *
14 **************************************************************************/
18 ///////////////////////////////////////////////////////////////////////////////
20 // class for running the reconstruction //
22 // Clusters and tracks are created for all detectors and all events by //
25 // AliReconstruction rec; //
28 // The Run method returns kTRUE in case of successful execution. //
30 // If the input to the reconstruction are not simulated digits but raw data, //
31 // this can be specified by an argument of the Run method or by the method //
33 // rec.SetInput("..."); //
35 // The input formats and the corresponding argument are: //
36 // - DDL raw data files: directory name, ends with "/" //
37 // - raw data root file: root file name, extension ".root" //
38 // - raw data DATE file: DATE file name, any other non-empty string //
39 // - MC root files : empty string, default //
41 // By default all events are reconstructed. The reconstruction can be //
42 // limited to a range of events by giving the index of the first and the //
43 // last event as an argument to the Run method or by calling //
45 // rec.SetEventRange(..., ...); //
47 // The index -1 (default) can be used for the last event to indicate no //
48 // upper limit of the event range. //
50 // In case of raw-data reconstruction the user can modify the default //
51 // number of events per digits/clusters/tracks file. In case the option //
52 // is not used the number is set 1. In case the user provides 0, than //
53 // the number of events is equal to the number of events inside the //
54 // raw-data file (i.e. one digits/clusters/tracks file): //
56 // rec.SetNumberOfEventsPerFile(...); //
59 // The name of the galice file can be changed from the default //
60 // "galice.root" by passing it as argument to the AliReconstruction //
61 // constructor or by //
63 // rec.SetGAliceFile("..."); //
65 // The local reconstruction can be switched on or off for individual //
68 // rec.SetRunLocalReconstruction("..."); //
70 // The argument is a (case sensitive) string with the names of the //
71 // detectors separated by a space. The special string "ALL" selects all //
72 // available detectors. This is the default. //
74 // The reconstruction of the primary vertex position can be switched off by //
76 // rec.SetRunVertexFinder(kFALSE); //
78 // The tracking and the creation of ESD tracks can be switched on for //
79 // selected detectors by //
81 // rec.SetRunTracking("..."); //
83 // Uniform/nonuniform field tracking switches (default: uniform field) //
85 // rec.SetUniformFieldTracking(); ( rec.SetUniformFieldTracking(kFALSE); ) //
87 // The filling of additional ESD information can be steered by //
89 // rec.SetFillESD("..."); //
91 // Again, for both methods the string specifies the list of detectors. //
92 // The default is "ALL". //
94 // The call of the shortcut method //
96 // rec.SetRunReconstruction("..."); //
98 // is equivalent to calling SetRunLocalReconstruction, SetRunTracking and //
99 // SetFillESD with the same detector selecting string as argument. //
101 // The reconstruction requires digits or raw data as input. For the creation //
102 // of digits and raw data have a look at the class AliSimulation. //
104 // The input data of a detector can be replaced by the corresponding HLT //
105 // data by calling (usual detector string) //
106 // SetUseHLTData("..."); //
109 ///////////////////////////////////////////////////////////////////////////////
116 #include <TGeoGlobalMagField.h>
117 #include <TGeoManager.h>
119 #include <TLorentzVector.h>
121 #include <TObjArray.h>
122 #include <TPRegexp.h>
123 #include <TParameter.h>
124 #include <TPluginManager.h>
126 #include <TProofOutputFile.h>
129 #include <THashTable.h>
131 #include <TMessage.h>
135 #include "AliAlignObj.h"
136 #include "AliAnalysisManager.h"
137 #include "AliAnalysisDataContainer.h"
138 #include "AliCDBEntry.h"
139 #include "AliCDBManager.h"
140 #include "AliCDBStorage.h"
141 #include "AliCTPRawStream.h"
142 #include "AliCascadeVertexer.h"
143 #include "AliCentralTrigger.h"
144 #include "AliCodeTimer.h"
146 #include "AliDetectorRecoParam.h"
147 #include "AliESDCaloCells.h"
148 #include "AliESDCaloCluster.h"
149 #include "AliESDEvent.h"
150 #include "AliESDMuonTrack.h"
151 #include "AliESDPmdTrack.h"
152 #include "AliESDTagCreator.h"
153 #include "AliESDVertex.h"
154 #include "AliESDcascade.h"
155 #include "AliESDfriend.h"
156 #include "AliESDkink.h"
157 #include "AliESDpid.h"
158 #include "AliESDtrack.h"
159 #include "AliESDtrack.h"
160 #include "AliEventInfo.h"
161 #include "AliGRPObject.h"
162 #include "AliGRPRecoParam.h"
163 #include "AliGenEventHeader.h"
164 #include "AliGeomManager.h"
165 #include "AliGlobalQADataMaker.h"
166 #include "AliHeader.h"
169 #include "AliMultiplicity.h"
171 #include "AliPlaneEff.h"
173 #include "AliQADataMakerRec.h"
174 #include "AliQAManager.h"
175 #include "AliRawVEvent.h"
176 #include "AliRawEventHeaderBase.h"
177 #include "AliRawHLTManager.h"
178 #include "AliRawReaderDate.h"
179 #include "AliRawReaderFile.h"
180 #include "AliRawReaderRoot.h"
181 #include "AliRecoInputHandler.h"
182 #include "AliReconstruction.h"
183 #include "AliReconstructor.h"
185 #include "AliRunInfo.h"
186 #include "AliRunLoader.h"
187 #include "AliSysInfo.h" // memory snapshots
188 #include "AliTrackPointArray.h"
189 #include "AliTracker.h"
190 #include "AliTriggerClass.h"
191 #include "AliTriggerCluster.h"
192 #include "AliTriggerIR.h"
193 #include "AliTriggerConfiguration.h"
194 #include "AliV0vertexer.h"
195 #include "AliVertexer.h"
196 #include "AliTrackleter.h"
197 #include "AliVertexerTracks.h"
198 #include "AliTriggerRunScalers.h"
199 #include "AliCTPTimeParams.h"
200 #include "AliESDHLTDecision.h"
201 #include "AliTriggerInput.h"
202 #include "AliLHCData.h"
203 #include "ARVersion.h"
204 #include <RVersion.h>
205 ClassImp(AliReconstruction)
207 //_____________________________________________________________________________
208 const char* AliReconstruction::fgkDetectorName[AliReconstruction::kNDetectors] = {"ITS", "TPC", "TRD", "TOF", "PHOS", "HMPID", "EMCAL", "MUON", "FMD", "ZDC", "PMD", "T0", "VZERO", "ACORDE"
209 // #ifdef MFT_UPGRADE
216 //_____________________________________________________________________________
217 AliReconstruction::AliReconstruction(const char* gAliceFilename) :
219 fRunVertexFinder(kTRUE),
220 fRunVertexFinderTracks(kTRUE),
221 fRunHLTTracking(kFALSE),
222 fRunMuonTracking(kFALSE),
224 fRunCascadeFinder(kTRUE),
225 fRunMultFinder(kTRUE),
227 fWriteAlignmentData(kFALSE),
228 fWriteESDfriend(kFALSE),
229 fFillTriggerESD(kTRUE),
237 fRunLocalReconstruction("ALL"),
241 fUseTrackingErrorsForAlignment(""),
242 fGAliceFileName(gAliceFilename),
245 fProofOutputFileName(""),
246 fProofOutputLocation(""),
247 fProofOutputDataset(kFALSE),
248 fProofOutputArchive(""),
252 fNumberOfEventsPerFile((UInt_t)-1),
253 fFractionFriends(0.04),
255 fLoadAlignFromCDB(kTRUE),
256 fLoadAlignData("ALL"),
261 fCTPTimeParams(NULL),
266 fParentRawReader(NULL),
270 fSPDTrackleter(NULL),
272 fDiamondProfileSPD(NULL),
273 fDiamondProfile(NULL),
274 fDiamondProfileTPC(NULL),
275 fListOfCosmicTriggers(NULL),
279 fAlignObjArray(NULL),
283 fInitCDBCalled(kFALSE),
284 fFromCDBSnapshot(kFALSE),
285 fSnapshotFileName(""),
286 fSetRunNumberFromDataCalled(kFALSE),
291 fSameQACycle(kFALSE),
292 fInitQACalled(kFALSE),
293 fWriteQAExpertData(kTRUE),
294 fRunPlaneEff(kFALSE),
305 fIsNewRunLoader(kFALSE),
318 // create reconstruction object with default parameters
321 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
322 fReconstructor[iDet] = NULL;
323 fUpgradeMask[iDet]=kFALSE;
324 fLoader[iDet] = NULL;
325 fTracker[iDet] = NULL;
327 for (Int_t iDet = 0; iDet < AliQAv1::kNDET; iDet++) {
328 fQACycles[iDet] = 999999 ;
329 fQAWriteExpert[iDet] = kFALSE ;
331 fBeamInt[0][0]=fBeamInt[0][1]=fBeamInt[1][0]=fBeamInt[1][1] = -1;
336 //_____________________________________________________________________________
337 AliReconstruction::AliReconstruction(const AliReconstruction& rec) :
339 fRunVertexFinder(rec.fRunVertexFinder),
340 fRunVertexFinderTracks(rec.fRunVertexFinderTracks),
341 fRunHLTTracking(rec.fRunHLTTracking),
342 fRunMuonTracking(rec.fRunMuonTracking),
343 fRunV0Finder(rec.fRunV0Finder),
344 fRunCascadeFinder(rec.fRunCascadeFinder),
345 fRunMultFinder(rec.fRunMultFinder),
346 fStopOnError(rec.fStopOnError),
347 fWriteAlignmentData(rec.fWriteAlignmentData),
348 fWriteESDfriend(rec.fWriteESDfriend),
349 fFillTriggerESD(rec.fFillTriggerESD),
351 fCleanESD(rec.fCleanESD),
352 fV0DCAmax(rec.fV0DCAmax),
353 fV0CsPmin(rec.fV0CsPmin),
357 fRunLocalReconstruction(rec.fRunLocalReconstruction),
358 fRunTracking(rec.fRunTracking),
359 fFillESD(rec.fFillESD),
360 fLoadCDB(rec.fLoadCDB),
361 fUseTrackingErrorsForAlignment(rec.fUseTrackingErrorsForAlignment),
362 fGAliceFileName(rec.fGAliceFileName),
363 fRawInput(rec.fRawInput),
364 fESDOutput(rec.fESDOutput),
365 fProofOutputFileName(rec.fProofOutputFileName),
366 fProofOutputLocation(rec.fProofOutputLocation),
367 fProofOutputDataset(rec.fProofOutputDataset),
368 fProofOutputArchive(rec.fProofOutputArchive),
369 fEquipIdMap(rec.fEquipIdMap),
370 fFirstEvent(rec.fFirstEvent),
371 fLastEvent(rec.fLastEvent),
372 fNumberOfEventsPerFile(rec.fNumberOfEventsPerFile),
373 fFractionFriends(rec.fFractionFriends),
375 fLoadAlignFromCDB(rec.fLoadAlignFromCDB),
376 fLoadAlignData(rec.fLoadAlignData),
377 fUseHLTData(rec.fUseHLTData),
381 fCTPTimeParams(NULL),
386 fParentRawReader(NULL),
388 fRecoParam(rec.fRecoParam),
390 fSPDTrackleter(NULL),
392 fDiamondProfileSPD(rec.fDiamondProfileSPD),
393 fDiamondProfile(rec.fDiamondProfile),
394 fDiamondProfileTPC(rec.fDiamondProfileTPC),
395 fListOfCosmicTriggers(NULL),
399 fAlignObjArray(rec.fAlignObjArray),
400 fCDBUri(rec.fCDBUri),
401 fQARefUri(rec.fQARefUri),
403 fInitCDBCalled(rec.fInitCDBCalled),
404 fFromCDBSnapshot(rec.fFromCDBSnapshot),
405 fSnapshotFileName(rec.fSnapshotFileName),
406 fSetRunNumberFromDataCalled(rec.fSetRunNumberFromDataCalled),
407 fQADetectors(rec.fQADetectors),
408 fQATasks(rec.fQATasks),
410 fRunGlobalQA(rec.fRunGlobalQA),
411 fSameQACycle(rec.fSameQACycle),
412 fInitQACalled(rec.fInitQACalled),
413 fWriteQAExpertData(rec.fWriteQAExpertData),
414 fRunPlaneEff(rec.fRunPlaneEff),
425 fIsNewRunLoader(rec.fIsNewRunLoader),
434 fAnalysisMacro(rec.fAnalysisMacro),
440 for (Int_t i = 0; i < rec.fOptions.GetEntriesFast(); i++) {
441 if (rec.fOptions[i]) fOptions.Add(rec.fOptions[i]->Clone());
443 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
444 fReconstructor[iDet] = NULL;
445 fUpgradeMask[iDet] = kFALSE;
446 fLoader[iDet] = NULL;
447 fTracker[iDet] = NULL;
450 for (Int_t iDet = 0; iDet < AliQAv1::kNDET; iDet++) {
451 fQACycles[iDet] = rec.fQACycles[iDet];
452 fQAWriteExpert[iDet] = rec.fQAWriteExpert[iDet] ;
455 for (Int_t i = 0; i < rec.fSpecCDBUri.GetEntriesFast(); i++) {
456 if (rec.fSpecCDBUri[i]) fSpecCDBUri.Add(rec.fSpecCDBUri[i]->Clone());
459 for (int i=2;i--;) for (int j=2;j--;) fBeamInt[i][j] = rec.fBeamInt[i][j];
463 //_____________________________________________________________________________
464 AliReconstruction& AliReconstruction::operator = (const AliReconstruction& rec)
466 // assignment operator
467 // Used in PROOF mode
468 // Be very careful while modifing it!
469 // Simple rules to follow:
470 // for persistent data members - use their assignment operators
471 // for non-persistent ones - do nothing or take the default values from constructor
472 // TSelector members should not be touched
473 if(&rec == this) return *this;
475 fRunVertexFinder = rec.fRunVertexFinder;
476 fRunVertexFinderTracks = rec.fRunVertexFinderTracks;
477 fRunHLTTracking = rec.fRunHLTTracking;
478 fRunMuonTracking = rec.fRunMuonTracking;
479 fRunV0Finder = rec.fRunV0Finder;
480 fRunCascadeFinder = rec.fRunCascadeFinder;
481 fRunMultFinder = rec.fRunMultFinder;
482 fStopOnError = rec.fStopOnError;
483 fWriteAlignmentData = rec.fWriteAlignmentData;
484 fWriteESDfriend = rec.fWriteESDfriend;
485 fFillTriggerESD = rec.fFillTriggerESD;
487 fCleanESD = rec.fCleanESD;
488 fV0DCAmax = rec.fV0DCAmax;
489 fV0CsPmin = rec.fV0CsPmin;
493 fRunLocalReconstruction = rec.fRunLocalReconstruction;
494 fRunTracking = rec.fRunTracking;
495 fFillESD = rec.fFillESD;
496 fLoadCDB = rec.fLoadCDB;
497 fUseTrackingErrorsForAlignment = rec.fUseTrackingErrorsForAlignment;
498 fGAliceFileName = rec.fGAliceFileName;
499 fRawInput = rec.fRawInput;
500 fESDOutput = rec.fESDOutput;
501 fProofOutputFileName = rec.fProofOutputFileName;
502 fProofOutputLocation = rec.fProofOutputLocation;
503 fProofOutputDataset = rec.fProofOutputDataset;
504 fProofOutputArchive = rec.fProofOutputArchive;
505 fEquipIdMap = rec.fEquipIdMap;
506 fFirstEvent = rec.fFirstEvent;
507 fLastEvent = rec.fLastEvent;
508 fNumberOfEventsPerFile = rec.fNumberOfEventsPerFile;
509 fFractionFriends = rec.fFractionFriends;
511 for (Int_t i = 0; i < rec.fOptions.GetEntriesFast(); i++) {
512 if (rec.fOptions[i]) fOptions.Add(rec.fOptions[i]->Clone());
515 fLoadAlignFromCDB = rec.fLoadAlignFromCDB;
516 fLoadAlignData = rec.fLoadAlignData;
517 fUseHLTData = rec.fUseHLTData;
519 delete fRunInfo; fRunInfo = NULL;
520 if (rec.fRunInfo) fRunInfo = new AliRunInfo(*rec.fRunInfo);
522 fEventInfo = rec.fEventInfo;
524 delete fRunScalers; fRunScalers = NULL;
525 if (rec.fRunScalers) fRunScalers = new AliTriggerRunScalers(*rec.fRunScalers);
527 delete fCTPTimeParams; fCTPTimeParams = NULL;
528 if (rec.fCTPTimeParams) fCTPTimeParams = new AliCTPTimeParams(*rec.fCTPTimeParams);
529 delete fCTPTimeAlign; fCTPTimeAlign = NULL;
530 if (rec.fCTPTimeAlign) fCTPTimeAlign = new AliCTPTimeParams(*rec.fCTPTimeAlign);
534 fParentRawReader = NULL;
536 fRecoParam = rec.fRecoParam;
538 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
539 fUpgradeMask[iDet] = kFALSE;
540 delete fReconstructor[iDet]; fReconstructor[iDet] = NULL;
541 delete fLoader[iDet]; fLoader[iDet] = NULL;
542 delete fTracker[iDet]; fTracker[iDet] = NULL;
545 for (Int_t iDet = 0; iDet < AliQAv1::kNDET; iDet++) {
546 fQACycles[iDet] = rec.fQACycles[iDet];
547 fQAWriteExpert[iDet] = rec.fQAWriteExpert[iDet] ;
550 delete fSPDTrackleter; fSPDTrackleter = NULL;
552 delete fDiamondProfileSPD; fDiamondProfileSPD = NULL;
553 if (rec.fDiamondProfileSPD) fDiamondProfileSPD = new AliESDVertex(*rec.fDiamondProfileSPD);
554 delete fDiamondProfile; fDiamondProfile = NULL;
555 if (rec.fDiamondProfile) fDiamondProfile = new AliESDVertex(*rec.fDiamondProfile);
556 delete fDiamondProfileTPC; fDiamondProfileTPC = NULL;
557 if (rec.fDiamondProfileTPC) fDiamondProfileTPC = new AliESDVertex(*rec.fDiamondProfileTPC);
559 delete fListOfCosmicTriggers; fListOfCosmicTriggers = NULL;
560 if (rec.fListOfCosmicTriggers) fListOfCosmicTriggers = (THashTable*)((rec.fListOfCosmicTriggers)->Clone());
562 delete fGRPData; fGRPData = NULL;
563 // if (rec.fGRPData) fGRPData = (TMap*)((rec.fGRPData)->Clone());
564 if (rec.fGRPData) fGRPData = (AliGRPObject*)((rec.fGRPData)->Clone());
566 delete fAlignObjArray; fAlignObjArray = NULL;
569 fQARefUri = rec.fQARefUri;
570 fSpecCDBUri.Delete();
571 fInitCDBCalled = rec.fInitCDBCalled;
572 fFromCDBSnapshot = rec.fFromCDBSnapshot;
573 fSnapshotFileName = rec.fSnapshotFileName;
574 fSetRunNumberFromDataCalled = rec.fSetRunNumberFromDataCalled;
575 fQADetectors = rec.fQADetectors;
576 fQATasks = rec.fQATasks;
578 fRunGlobalQA = rec.fRunGlobalQA;
579 fSameQACycle = rec.fSameQACycle;
580 fInitQACalled = rec.fInitQACalled;
581 fWriteQAExpertData = rec.fWriteQAExpertData;
582 fRunPlaneEff = rec.fRunPlaneEff;
583 for (int i=2;i--;) for (int j=2;j--;) fBeamInt[i][j] = rec.fBeamInt[i][j];
593 fIsNewRunLoader = rec.fIsNewRunLoader;
602 fAnalysisMacro = rec.fAnalysisMacro;
609 //_____________________________________________________________________________
610 AliReconstruction::~AliReconstruction()
615 if (fListOfCosmicTriggers) {
616 fListOfCosmicTriggers->Delete();
617 delete fListOfCosmicTriggers;
621 delete fCTPTimeParams;
622 delete fCTPTimeAlign;
624 if (fAlignObjArray) {
625 fAlignObjArray->Delete();
626 delete fAlignObjArray;
628 fSpecCDBUri.Delete();
630 AliCodeTimer::Instance()->Print();
633 //_____________________________________________________________________________
634 void AliReconstruction::InitQA()
636 //Initialize the QA and start of cycle
637 AliCodeTimerAuto("",0);
639 if (fInitQACalled) return;
640 fInitQACalled = kTRUE;
642 if (fGRPData) AliQADataMaker::SetCloningRequest( fGRPData->GetQATrigClasses(), fGRPData->GetQACloningRequest());
645 AliQAManager * qam = AliQAManager::QAManager(AliQAv1::kRECMODE) ;
646 if (fWriteQAExpertData)
647 qam->SetWriteExpert() ;
649 if (qam->IsDefaultStorageSet()) {
650 AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
651 AliWarning("Default QA reference storage has been already set !");
652 AliWarning(Form("Ignoring the default storage declared in AliReconstruction: %s",fQARefUri.Data()));
653 AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
654 fQARefUri = qam->GetDefaultStorage()->GetURI();
656 if (fQARefUri.Length() > 0) {
657 AliDebug(2,"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
658 AliDebug(2, Form("Default QA reference storage is set to: %s", fQARefUri.Data()));
659 AliDebug(2, "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
661 fQARefUri="local://$ALICE_ROOT/QAref";
662 AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
663 AliWarning("Default QA refeference storage not yet set !!!!");
664 AliWarning(Form("Setting it now to: %s", fQARefUri.Data()));
665 AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
668 qam->SetDefaultStorage(fQARefUri);
672 qam->SetActiveDetectors(fQADetectors) ;
673 for (Int_t det = 0 ; det < AliQAv1::kNDET ; det++) {
674 qam->SetCycleLength(AliQAv1::DETECTORINDEX_t(det), fQACycles[det]) ;
675 qam->SetWriteExpert(AliQAv1::DETECTORINDEX_t(det)) ;
677 if (!fRawReader && !fInput && IsInTasks(AliQAv1::kRAWS))
678 fQATasks.ReplaceAll(Form("%d",AliQAv1::kRAWS), "") ;
679 qam->SetTasks(fQATasks) ;
680 qam->InitQADataMaker(AliCDBManager::Instance()->GetRun()) ;
683 Bool_t sameCycle = kFALSE ;
684 AliQADataMaker *qadm = qam->GetQADataMaker(AliQAv1::kGLOBAL);
685 AliInfo(Form("Initializing the global QA data maker"));
686 if (IsInTasks(AliQAv1::kRECPOINTS)) {
687 qadm->StartOfCycle(AliQAv1::kRECPOINTS, AliCDBManager::Instance()->GetRun(), sameCycle) ;
688 TObjArray **arr=qadm->Init(AliQAv1::kRECPOINTS);
689 AliTracker::SetResidualsArray(arr);
692 if (IsInTasks(AliQAv1::kESDS)) {
693 qadm->StartOfCycle(AliQAv1::kESDS, AliCDBManager::Instance()->GetRun(), sameCycle) ;
694 qadm->Init(AliQAv1::kESDS);
697 AliSysInfo::AddStamp("InitQA") ;
700 //_____________________________________________________________________________
701 void AliReconstruction::MergeQA(const char *fileName)
703 //Initialize the QA and start of cycle
704 AliCodeTimerAuto("",0) ;
705 AliQAManager::QAManager()->Merge(AliCDBManager::Instance()->GetRun(),fileName) ;
706 AliSysInfo::AddStamp("MergeQA") ;
709 //_____________________________________________________________________________
710 void AliReconstruction::InitCDB()
712 // activate a default CDB storage
713 // First check if we have any CDB storage set, because it is used
714 // to retrieve the calibration and alignment constants
715 AliCodeTimerAuto("",0);
717 if (fInitCDBCalled) return;
718 fInitCDBCalled = kTRUE;
720 AliCDBManager* man = AliCDBManager::Instance();
721 if (man->IsDefaultStorageSet())
723 AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
724 AliWarning("Default CDB storage has been already set !");
725 AliWarning(Form("Ignoring the default storage declared in AliReconstruction: %s",fCDBUri.Data()));
726 AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
727 fCDBUri = man->GetDefaultStorage()->GetURI();
730 if (fCDBUri.Length() > 0)
732 AliDebug(2,"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
733 AliDebug(2, Form("Default CDB storage is set to: %s", fCDBUri.Data()));
734 AliDebug(2, "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
735 man->SetDefaultStorage(fCDBUri);
737 else if (!man->GetRaw()){
738 fCDBUri="local://$ALICE_ROOT/OCDB";
739 AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
740 AliWarning("Default CDB storage not yet set !!!!");
741 AliWarning(Form("Setting it now to: %s", fCDBUri.Data()));
742 AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
743 man->SetDefaultStorage(fCDBUri);
746 AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
747 AliWarning("Default storage will be set after setting the Run Number!!!");
748 AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
752 // Now activate the detector specific CDB storage locations
753 for (Int_t i = 0; i < fSpecCDBUri.GetEntriesFast(); i++) {
754 TObject* obj = fSpecCDBUri[i];
756 AliDebug(2, "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
757 AliDebug(2, Form("Specific CDB storage for %s is set to: %s",obj->GetName(),obj->GetTitle()));
758 AliDebug(2, "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
759 man->SetSpecificStorage(obj->GetName(), obj->GetTitle());
761 AliSysInfo::AddStamp("InitCDB");
764 //_____________________________________________________________________________
765 void AliReconstruction::SetDefaultStorage(const char* uri) {
766 // Store the desired default CDB storage location
767 // Activate it later within the Run() method
773 //_____________________________________________________________________________
774 void AliReconstruction::SetQARefDefaultStorage(const char* uri) {
775 // Store the desired default CDB storage location
776 // Activate it later within the Run() method
779 AliQAv1::SetQARefStorage(fQARefUri.Data()) ;
782 //_____________________________________________________________________________
783 void AliReconstruction::SetSpecificStorage(const char* calibType, const char* uri) {
784 // Store a detector-specific CDB storage location
785 // Activate it later within the Run() method
787 AliCDBPath aPath(calibType);
788 if(!aPath.IsValid()){
789 // if calibType is not wildcard but it is a valid detector, add "/*" to make it a valid path
790 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
791 if(!strcmp(calibType, fgkDetectorName[iDet])) {
792 aPath.SetPath(Form("%s/*", calibType));
793 AliInfo(Form("Path for specific storage set to %s", aPath.GetPath().Data()));
797 if(!aPath.IsValid()){
798 AliError(Form("Not a valid path or detector: %s", calibType));
803 // // check that calibType refers to a "valid" detector name
804 // Bool_t isDetector = kFALSE;
805 // for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
806 // TString detName = fgkDetectorName[iDet];
807 // if(aPath.GetLevel0() == detName) {
808 // isDetector = kTRUE;
814 // AliError(Form("Not a valid detector: %s", aPath.GetLevel0().Data()));
818 TObject* obj = fSpecCDBUri.FindObject(aPath.GetPath().Data());
819 if (obj) fSpecCDBUri.Remove(obj);
820 fSpecCDBUri.Add(new TNamed(aPath.GetPath().Data(), uri));
824 //_____________________________________________________________________________
825 Bool_t AliReconstruction::SetRunNumberFromData()
827 // The method is called in Run() in order
828 // to set a correct run number.
829 // In case of raw data reconstruction the
830 // run number is taken from the raw data header
832 if (fSetRunNumberFromDataCalled) return kTRUE;
833 fSetRunNumberFromDataCalled = kTRUE;
835 AliCDBManager* man = AliCDBManager::Instance();
838 if(fRawReader->NextEvent()) {
839 if(man->GetRun() > 0) {
840 AliWarning("Run number is taken from raw-event header! Ignoring settings in AliCDBManager!");
842 man->SetRun(fRawReader->GetRunNumber());
843 fRawReader->RewindEvents();
846 if(man->GetRun() > 0) {
847 AliWarning("No raw-data events are found ! Using settings in AliCDBManager !");
850 AliWarning("Neither raw events nor settings in AliCDBManager are found !");
856 AliRunLoader *rl = AliRunLoader::Open(fGAliceFileName.Data());
858 AliError(Form("No run loader found in file %s", fGAliceFileName.Data()));
863 // read run number from gAlice
864 if(rl->GetHeader()) {
865 man->SetRun(rl->GetHeader()->GetRun());
870 AliError("Neither run-loader header nor RawReader objects are found !");
882 //_____________________________________________________________________________
883 void AliReconstruction::SetCDBLock() {
884 // Set CDB lock: from now on it is forbidden to reset the run number
885 // or the default storage or to activate any further storage!
887 AliCDBManager::Instance()->SetLock(1);
890 //_____________________________________________________________________________
891 void AliReconstruction::MatchUpgradeDetector() {
892 // Translates detector name in a boolean.
893 // The boolean is used in GetReconstructor to load the
894 // upgrade reconstructor instead of the standard one.
895 for(Int_t iDet = 0; iDet < kNDetectors; iDet++) {
896 if(fUpgradeModule.Contains(fgkDetectorName[iDet])) fUpgradeMask[iDet]=kTRUE;
899 //_____________________________________________________________________________
900 Bool_t AliReconstruction::MisalignGeometry(const TString& detectors)
902 // Read the alignment objects from CDB.
903 // Each detector is supposed to have the
904 // alignment objects in DET/Align/Data CDB path.
905 // All the detector objects are then collected,
906 // sorted by geometry level (starting from ALIC) and
907 // then applied to the TGeo geometry.
908 // Finally an overlaps check is performed.
910 // Load alignment data from CDB and fill fAlignObjArray
911 if(fLoadAlignFromCDB){
913 TString detStr = detectors;
914 TString loadAlObjsListOfDets = "";
916 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
917 if(!IsSelected(fgkDetectorName[iDet], detStr)) continue;
918 if(!strcmp(fgkDetectorName[iDet],"HLT")) continue;
920 if(AliGeomManager::GetNalignable(fgkDetectorName[iDet]) != 0)
922 loadAlObjsListOfDets += fgkDetectorName[iDet];
923 loadAlObjsListOfDets += " ";
925 } // end loop over detectors
927 if(AliGeomManager::GetNalignable("GRP") != 0)
928 loadAlObjsListOfDets.Prepend("GRP "); //add alignment objects for non-sensitive modules
929 AliGeomManager::ApplyAlignObjsFromCDB(loadAlObjsListOfDets.Data());
930 AliCDBManager::Instance()->UnloadFromCache("*/Align/*");
932 // Check if the array with alignment objects was
933 // provided by the user. If yes, apply the objects
934 // to the present TGeo geometry
935 if (fAlignObjArray) {
936 if (gGeoManager && gGeoManager->IsClosed()) {
937 if (AliGeomManager::ApplyAlignObjsToGeom(*fAlignObjArray) == kFALSE) {
938 AliError("The misalignment of one or more volumes failed!"
939 "Compare the list of simulated detectors and the list of detector alignment data!");
944 AliError("Can't apply the misalignment! gGeoManager doesn't exist or it is still opened!");
950 if (fAlignObjArray) {
951 fAlignObjArray->Delete();
952 delete fAlignObjArray; fAlignObjArray=NULL;
958 //_____________________________________________________________________________
959 void AliReconstruction::SetGAliceFile(const char* fileName)
961 // set the name of the galice file
963 fGAliceFileName = fileName;
966 //_____________________________________________________________________________
967 void AliReconstruction::SetInput(const char* input)
969 // In case the input string starts with 'mem://', we run in an online mode
970 // and AliRawReaderDateOnline object is created. In all other cases a raw-data
971 // file is assumed. One can give as an input:
972 // mem://: - events taken from DAQ monitoring libs online
974 // mem://<filename> - emulation of the above mode (via DATE monitoring libs)
975 if (input) fRawInput = input;
978 //_____________________________________________________________________________
979 void AliReconstruction::SetOutput(const char* output)
981 // Set the output ESD filename
982 // 'output' is a normalt ROOT url
983 // The method is used in case of raw-data reco with PROOF
984 if (output) fESDOutput = output;
987 //_____________________________________________________________________________
988 void AliReconstruction::SetOption(const char* detector, const char* option)
990 // set options for the reconstruction of a detector
992 TObject* obj = fOptions.FindObject(detector);
993 if (obj) fOptions.Remove(obj);
994 fOptions.Add(new TNamed(detector, option));
997 //_____________________________________________________________________________
998 void AliReconstruction::SetRecoParam(const char* detector, AliDetectorRecoParam *par)
1000 // Set custom reconstruction parameters for a given detector
1001 // Single set of parameters for all the events
1003 // First check if the reco-params are global
1004 if(!strcmp(detector, "GRP")) {
1005 par->SetAsDefault();
1006 fRecoParam.AddDetRecoParam(kNDetectors,par);
1010 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
1011 if(!strcmp(detector, fgkDetectorName[iDet])) {
1012 par->SetAsDefault();
1013 fRecoParam.AddDetRecoParam(iDet,par);
1020 //_____________________________________________________________________________
1021 Bool_t AliReconstruction::InitGRP() {
1022 //------------------------------------
1023 // Initialization of the GRP entry
1024 //------------------------------------
1025 AliCDBEntry* entry = AliCDBManager::Instance()->Get("GRP/GRP/Data");
1029 TMap* m = dynamic_cast<TMap*>(entry->GetObject()); // old GRP entry
1032 AliInfo("Found a TMap in GRP/GRP/Data, converting it into an AliGRPObject");
1034 fGRPData = new AliGRPObject();
1035 fGRPData->ReadValuesFromMap(m);
1039 AliInfo("Found an AliGRPObject in GRP/GRP/Data, reading it");
1040 fGRPData = dynamic_cast<AliGRPObject*>(entry->GetObject()); // new GRP entry
1044 // FIX ME: The unloading of GRP entry is temporarily disabled
1045 // because ZDC and VZERO are using it in order to initialize
1046 // their reconstructor objects. In the future one has to think
1047 // of propagating AliRunInfo to the reconstructors.
1048 // AliCDBManager::Instance()->UnloadFromCache("GRP/GRP/Data");
1052 AliError("No GRP entry found in OCDB!");
1056 TString lhcState = fGRPData->GetLHCState();
1057 if (lhcState==AliGRPObject::GetInvalidString()) {
1058 AliError("GRP/GRP/Data entry: missing value for the LHC state ! Using UNKNOWN");
1059 lhcState = "UNKNOWN";
1062 TString beamType = fGRPData->GetBeamType();
1063 if (beamType==AliGRPObject::GetInvalidString()) {
1064 AliError("GRP/GRP/Data entry: missing value for the beam type ! Using UNKNOWN");
1065 beamType = "UNKNOWN";
1068 Float_t beamEnergy = fGRPData->GetBeamEnergy();
1069 if (beamEnergy==AliGRPObject::GetInvalidFloat()) {
1070 AliError("GRP/GRP/Data entry: missing value for the beam energy ! Using 0");
1074 TString runType = fGRPData->GetRunType();
1075 if (runType==AliGRPObject::GetInvalidString()) {
1076 AliError("GRP/GRP/Data entry: missing value for the run type ! Using UNKNOWN");
1077 runType = "UNKNOWN";
1080 Int_t activeDetectors = fGRPData->GetDetectorMask();
1081 if (activeDetectors==AliGRPObject::GetInvalidUInt()) {
1082 AliError("GRP/GRP/Data entry: missing value for the detector mask ! Using 1074790399");
1083 activeDetectors = 1074790399;
1085 AliDebug(1, Form("activeDetectors = %d", activeDetectors));
1087 fRunInfo = new AliRunInfo(lhcState, beamType, beamEnergy, runType, activeDetectors);
1091 // Process the list of active detectors
1092 if (activeDetectors) {
1093 UInt_t detMask = activeDetectors;
1094 AliDebug(1, Form("Detector List = %s", fRunLocalReconstruction.Data()));
1095 fRunLocalReconstruction = MatchDetectorList(fRunLocalReconstruction,detMask);
1096 AliDebug(1, Form("Detector List = %s", fRunLocalReconstruction.Data()));
1097 fRunTracking = MatchDetectorList(fRunTracking,detMask);
1098 fFillESD = MatchDetectorList(fFillESD,detMask);
1099 fQADetectors = MatchDetectorList(fQADetectors,detMask);
1100 fLoadCDB.Form("%s %s %s %s",
1101 fRunLocalReconstruction.Data(),
1102 fRunTracking.Data(),
1104 fQADetectors.Data());
1105 fLoadCDB = MatchDetectorList(fLoadCDB,detMask);
1106 if (!((detMask >> AliDAQ::DetectorID("ITSSPD")) & 0x1) &&
1107 !((detMask >> AliDAQ::DetectorID("ITSSDD")) & 0x1) &&
1108 !((detMask >> AliDAQ::DetectorID("ITSSSD")) & 0x1) ) {
1109 // switch off the vertexer
1110 AliInfo("SPD,SDD,SSD is not in the list of active detectors. Vertexer and Trackleter are switched off.");
1111 fRunVertexFinder = kFALSE;
1112 fRunMultFinder = kFALSE;
1114 if (!((detMask >> AliDAQ::DetectorID("TRG")) & 0x1)) {
1115 // switch off the reading of CTP raw-data payload
1116 if (fFillTriggerESD) {
1117 AliInfo("CTP is not in the list of active detectors. CTP data reading switched off.");
1118 fFillTriggerESD = kFALSE;
1123 AliInfo("===================================================================================");
1124 AliInfo(Form("Running local reconstruction for detectors: %s",fRunLocalReconstruction.Data()));
1125 AliInfo(Form("Running tracking for detectors: %s",fRunTracking.Data()));
1126 AliInfo(Form("Filling ESD for detectors: %s",fFillESD.Data()));
1127 AliInfo(Form("Quality assurance is active for detectors: %s",fQADetectors.Data()));
1128 AliInfo(Form("CDB and reconstruction parameters are loaded for detectors: %s",fLoadCDB.Data()));
1129 AliInfo("===================================================================================");
1131 //*** Dealing with the magnetic field map
1132 if ( TGeoGlobalMagField::Instance()->IsLocked() ) {
1133 if (TGeoGlobalMagField::Instance()->GetField()->TestBit(AliMagF::kOverrideGRP)) {
1134 AliInfo("ExpertMode!!! GRP information will be ignored !");
1135 AliInfo("ExpertMode!!! Running with the externally locked B field !");
1138 AliInfo("Destroying existing B field instance!");
1139 delete TGeoGlobalMagField::Instance();
1142 if ( !TGeoGlobalMagField::Instance()->IsLocked() ) {
1143 // Construct the field map out of the information retrieved from GRP.
1146 Float_t l3Current = fGRPData->GetL3Current((AliGRPObject::Stats)0);
1147 if (l3Current == AliGRPObject::GetInvalidFloat()) {
1148 AliError("GRP/GRP/Data entry: missing value for the L3 current !");
1152 Char_t l3Polarity = fGRPData->GetL3Polarity();
1153 if (l3Polarity == AliGRPObject::GetInvalidChar()) {
1154 AliError("GRP/GRP/Data entry: missing value for the L3 polarity !");
1159 Float_t diCurrent = fGRPData->GetDipoleCurrent((AliGRPObject::Stats)0);
1160 if (diCurrent == AliGRPObject::GetInvalidFloat()) {
1161 AliError("GRP/GRP/Data entry: missing value for the dipole current !");
1165 Char_t diPolarity = fGRPData->GetDipolePolarity();
1166 if (diPolarity == AliGRPObject::GetInvalidChar()) {
1167 AliError("GRP/GRP/Data entry: missing value for the dipole polarity !");
1171 // read special bits for the polarity convention and map type
1172 Int_t polConvention = fGRPData->IsPolarityConventionLHC() ? AliMagF::kConvLHC : AliMagF::kConvDCS2008;
1173 Bool_t uniformB = fGRPData->IsUniformBMap();
1176 AliMagF* fld = AliMagF::CreateFieldMap(TMath::Abs(l3Current) * (l3Polarity ? -1:1),
1177 TMath::Abs(diCurrent) * (diPolarity ? -1:1),
1178 polConvention,uniformB,beamEnergy, beamType.Data());
1180 TGeoGlobalMagField::Instance()->SetField( fld );
1181 TGeoGlobalMagField::Instance()->Lock();
1182 AliInfo("Running with the B field constructed out of GRP !");
1184 else AliFatal("Failed to create a B field map !");
1186 else AliFatal("B field is neither set nor constructed from GRP ! Exitig...");
1189 //*** Get the diamond profiles from OCDB
1190 entry = AliCDBManager::Instance()->Get("GRP/Calib/MeanVertexSPD");
1192 fDiamondProfileSPD = dynamic_cast<AliESDVertex*> (entry->GetObject());
1194 AliError("No SPD diamond profile found in OCDB!");
1197 entry = AliCDBManager::Instance()->Get("GRP/Calib/MeanVertex");
1199 fDiamondProfile = dynamic_cast<AliESDVertex*> (entry->GetObject());
1201 AliError("No diamond profile found in OCDB!");
1204 entry = AliCDBManager::Instance()->Get("GRP/Calib/MeanVertexTPC");
1206 fDiamondProfileTPC = dynamic_cast<AliESDVertex*> (entry->GetObject());
1208 AliError("No TPC diamond profile found in OCDB!");
1211 entry = AliCDBManager::Instance()->Get("GRP/Calib/CosmicTriggers");
1213 fListOfCosmicTriggers = dynamic_cast<THashTable*>(entry->GetObject());
1215 AliCDBManager::Instance()->UnloadFromCache("GRP/Calib/CosmicTriggers");
1218 if (!fListOfCosmicTriggers) {
1219 AliWarning("Can not get list of cosmic triggers from OCDB! Cosmic event specie will be effectively disabled!");
1225 //_____________________________________________________________________________
1226 Bool_t AliReconstruction::LoadCDB()
1228 // Load CDB entries for all active detectors.
1229 // By default we load all the entries in <det>/Calib
1232 AliCodeTimerAuto("",0);
1234 AliCDBManager::Instance()->Get("GRP/CTP/Config");
1236 AliCDBManager::Instance()->Get("GRP/Calib/LHCClockPhase");
1238 TString detStr = fLoadCDB;
1239 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
1240 if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
1241 AliCDBManager::Instance()->GetAll(Form("%s/Calib/*",fgkDetectorName[iDet]));
1244 // Temporary fix - one has to define the correct policy in order
1245 // to load the trigger OCDB entries only for the detectors that
1246 // in the trigger or that are needed in order to put correct
1247 // information in ESD
1248 AliCDBManager::Instance()->GetAll("TRIGGER/*/*");
1252 //_____________________________________________________________________________
1253 Bool_t AliReconstruction::LoadTriggerScalersCDB()
1255 // Load CTP scalers from OCDB.
1256 // The scalers are checked for consistency.
1258 AliCodeTimerAuto("",0);
1260 AliCDBEntry* entry = AliCDBManager::Instance()->Get("GRP/CTP/Scalers");
1264 AliInfo("Found an AliTriggerRunScalers in GRP/CTP/Scalers, reading it");
1265 fRunScalers = dynamic_cast<AliTriggerRunScalers*> (entry->GetObject());
1267 if (fRunScalers && (fRunScalers->CorrectScalersOverflow() == 0)) AliInfo("32bit Trigger counters corrected for overflow");
1272 //_____________________________________________________________________________
1273 Bool_t AliReconstruction::LoadCTPTimeParamsCDB()
1275 // Load CTP timing information (alignment)
1278 AliCDBEntry* entry = AliCDBManager::Instance()->Get("GRP/CTP/CTPtiming");
1279 if (!entry) return kFALSE;
1281 AliInfo("Found an AliCTPTimeParams in GRP/CTP/CTPtiming, reading it");
1282 fCTPTimeParams = dynamic_cast<AliCTPTimeParams*> (entry->GetObject());
1285 AliCDBEntry* entry2 = AliCDBManager::Instance()->Get("GRP/CTP/TimeAlign");
1286 if (!entry2) return kFALSE;
1288 AliInfo("Found an AliCTPTimeParams in GRP/CTP/TimeAlign, reading it");
1289 fCTPTimeAlign = dynamic_cast<AliCTPTimeParams*> (entry2->GetObject());
1290 entry2->SetOwner(0);
1295 //_____________________________________________________________________________
1296 Bool_t AliReconstruction::ReadIntensityInfoCDB()
1298 // Load LHC DIP data
1299 AliCDBEntry* entry = AliCDBManager::Instance()->Get("GRP/GRP/LHCData");
1300 AliCDBEntry* entryCTP = AliCDBManager::Instance()->Get("GRP/CTP/Config");
1302 if (!entry || !entryCTP) {
1303 AliError(Form("Failed to extract CDB objects GRP/GRP/LHCData: %p or GRP/CTP/Config: %p",entry,entryCTP));
1307 enum {kA,kB,kC,kE,kNMasks};
1308 AliTriggerConfiguration* conf = (AliTriggerConfiguration*)entryCTP->GetObject();
1309 const TObjArray& clArr = conf->GetClasses();
1310 TObjArray masks(kNMasks);
1312 AliTriggerClass* trClass = 0;
1314 masks.SetOwner(kFALSE);
1316 while ( (trClass=(AliTriggerClass*)next()) ) {
1317 TString trName = trClass->GetName();
1318 int ind = trName.Index("-"); // prefix in front of A,B,C,E
1319 if (ind<1) continue; // anomaly
1321 trName = trName.Data() + ind;
1322 AliTriggerBCMask* bcMask = trClass->GetBCMask();
1323 if (!bcMask) continue;
1325 if (trName.BeginsWith("-A-")) which |= 0x1<<kA;
1326 else if (trName.BeginsWith("-B-")) which |= 0x1<<kB;
1327 else if (trName.BeginsWith("-C-")) which |= 0x1<<kC;
1328 else if (trName.BeginsWith("-E-")) which |= 0x1<<kE;
1329 else if (trName.BeginsWith("-AC-")) which |= (0x1<<kA) | (0x1<<kC);
1330 else if (trName.BeginsWith("-CA-")) which |= (0x1<<kA) | (0x1<<kC);
1331 else { AliWarning(Form("Unknown trigger type %s\n",trClass->GetName())); continue;}
1333 for (int ip=kNMasks;ip--;) {
1334 if ( !(which&(0x1<<ip)) || masks[ip] ) continue; // does not match or already done
1335 masks[ip] = (TObject*)bcMask;
1338 if (nFound==kNMasks) break;
1341 AliInfo("Reading mean bunch intensities from GRP/GRP/LHCData");
1342 AliLHCData* dipData = dynamic_cast<AliLHCData*> (entry->GetObject());
1344 for (int ib=2;ib--;) {
1346 if (dipData && (dipData->GetMeanIntensity(ib,intI,intNI,&masks)>=0)) {
1347 fBeamInt[ib][0] = intI;
1348 fBeamInt[ib][1] = intNI;
1349 AliInfo(Form("Mean intensity for beam %d: Interacting:%.2e Non-Interacting:%.2e",ib,intI,intNI));
1357 //_____________________________________________________________________________
1358 Bool_t AliReconstruction::Run(const char* input)
1361 AliCodeTimerAuto("",0);
1364 if (GetAbort() != TSelector::kContinue) return kFALSE;
1366 TChain *chain = NULL;
1367 if (fRawReader && (chain = fRawReader->GetChain())) {
1368 Long64_t nEntries = (fLastEvent < 0) ? (TChain::kBigNumber) : (fLastEvent - fFirstEvent + 1);
1371 // Temporary fix for long raw-data runs (until socket timeout handling in PROOF is revised)
1372 gProof->Exec("gEnv->SetValue(\"Proof.SocketActivityTimeout\",-1)", kTRUE);
1375 gProof->Exec("TGrid::Connect(\"alien://\")",kTRUE);
1377 TMessage::EnableSchemaEvolutionForAll(kTRUE);
1378 gProof->Exec("TMessage::EnableSchemaEvolutionForAll(kTRUE)",kTRUE);
1380 gProof->AddInput(this);
1382 if (!ParseOutput()) return kFALSE;
1384 gProof->SetParameter("PROOF_MaxSlavesPerNode", 9999);
1386 chain->Process("AliReconstruction","",nEntries,fFirstEvent);
1389 chain->Process(this,"",nEntries,fFirstEvent);
1394 if (GetAbort() != TSelector::kContinue) return kFALSE;
1396 if (GetAbort() != TSelector::kContinue) return kFALSE;
1397 //******* The loop over events
1398 AliInfo("Starting looping over events");
1400 while ((iEvent < fRunLoader->GetNumberOfEvents()) ||
1401 (fRawReader && fRawReader->NextEvent())) {
1402 if (!ProcessEvent(iEvent)) {
1403 Abort("ProcessEvent",TSelector::kAbortFile);
1409 if (GetAbort() != TSelector::kContinue) return kFALSE;
1411 if (GetAbort() != TSelector::kContinue) return kFALSE;
1417 //_____________________________________________________________________________
1418 void AliReconstruction::InitRawReader(const char* input)
1420 // Init raw-reader and
1421 // set the input in case of raw data
1423 AliCodeTimerAuto("",0);
1425 if (input) fRawInput = input;
1426 fRawReader = AliRawReader::Create(fRawInput.Data());
1428 if (fRawInput.IsNull()) {
1429 AliInfo("Reconstruction will run over digits");
1432 AliFatal("Can not create raw-data reader ! Exiting...");
1436 if (!fEquipIdMap.IsNull() && fRawReader)
1437 fRawReader->LoadEquipmentIdsMap(fEquipIdMap);
1439 if (!fUseHLTData.IsNull()) {
1440 // create the RawReaderHLT which performs redirection of HLT input data for
1441 // the specified detectors
1442 AliRawReader* pRawReader=AliRawHLTManager::CreateRawReaderHLT(fRawReader, fUseHLTData.Data());
1444 fParentRawReader=fRawReader;
1445 fRawReader=pRawReader;
1447 AliError(Form("can not create Raw Reader for HLT input %s", fUseHLTData.Data()));
1450 AliSysInfo::AddStamp("CreateRawReader");
1453 //_____________________________________________________________________________
1454 void AliReconstruction::InitRun(const char* input)
1456 // Initialization of raw-reader,
1457 // run number, CDB etc.
1458 AliCodeTimerAuto("",0);
1459 AliSysInfo::AddStamp("Start");
1461 // Initialize raw-reader if any
1462 InitRawReader(input);
1464 // Initialize the CDB storage
1467 // Set run number in CDBManager (if it is not already set by the user)
1468 if (!SetRunNumberFromData()) {
1469 Abort("SetRunNumberFromData", TSelector::kAbortProcess);
1473 // Set CDB lock: from now on it is forbidden to reset the run number
1474 // or the default storage or to activate any further storage!
1479 //_____________________________________________________________________________
1480 void AliReconstruction::Begin(TTree *)
1482 // Initialize AlReconstruction before
1483 // going into the event loop
1484 // Should follow the TSelector convention
1485 // i.e. initialize only the object on the client side
1486 AliCodeTimerAuto("",0);
1488 AliReconstruction *reco = NULL;
1490 if ((reco = (AliReconstruction*)fInput->FindObject("AliReconstruction"))) {
1493 AliSysInfo::AddStamp("ReadInputInBegin");
1496 // Import ideal TGeo geometry and apply misalignment
1498 TString geom(gSystem->DirName(fGAliceFileName));
1499 geom += "/geometry.root";
1500 AliGeomManager::LoadGeometry(geom.Data());
1502 Abort("LoadGeometry", TSelector::kAbortProcess);
1505 AliSysInfo::AddStamp("LoadGeom");
1506 TString detsToCheck=fRunLocalReconstruction;
1507 if(!AliGeomManager::CheckSymNamesLUT(detsToCheck.Data())) {
1508 Abort("CheckSymNamesLUT", TSelector::kAbortProcess);
1511 AliSysInfo::AddStamp("CheckGeom");
1514 if(fFromCDBSnapshot){
1515 AliDebug(2,"Initializing from a CDB snapshot");
1516 if(!AliCDBManager::Instance()->InitFromSnapshot(fSnapshotFileName.Data())){
1517 Abort("InitFromSnapshot", TSelector::kAbortProcess);
1522 if (!MisalignGeometry(fLoadAlignData)) {
1523 Abort("MisalignGeometry", TSelector::kAbortProcess);
1526 AliCDBManager::Instance()->UnloadFromCache("GRP/Geometry/Data");
1527 AliSysInfo::AddStamp("MisalignGeom");
1530 Abort("InitGRP", TSelector::kAbortProcess);
1533 AliSysInfo::AddStamp("InitGRP");
1535 if(!fFromCDBSnapshot){
1537 Abort("LoadCDB", TSelector::kAbortProcess);
1540 AliSysInfo::AddStamp("LoadCDB");
1543 if (!LoadTriggerScalersCDB()) {
1544 Abort("LoadTriggerScalersCDB", TSelector::kAbortProcess);
1547 AliSysInfo::AddStamp("LoadTriggerScalersCDB");
1549 if (!LoadCTPTimeParamsCDB()) {
1550 Abort("LoadCTPTimeParamsCDB", TSelector::kAbortProcess);
1553 AliSysInfo::AddStamp("LoadCTPTimeParamsCDB");
1555 if (!ReadIntensityInfoCDB()) {
1556 Abort("ReadIntensityInfoCDB", TSelector::kAbortProcess);
1559 AliSysInfo::AddStamp("ReadIntensityInfoCDB");
1561 // Read the reconstruction parameters from OCDB
1562 if (!InitRecoParams()) {
1563 AliWarning("Not all detectors have correct RecoParam objects initialized");
1565 AliSysInfo::AddStamp("InitRecoParams");
1567 if (fInput && gProof) {
1568 if (reco) *reco = *this;
1570 gGeoManager->SetName("Geometry");
1571 gProof->AddInputData(gGeoManager,kTRUE);
1573 gProof->AddInputData(const_cast<TMap*>(AliCDBManager::Instance()->GetEntryCache()),kTRUE);
1574 fInput->Add(new TParameter<Int_t>("RunNumber",AliCDBManager::Instance()->GetRun()));
1575 AliMagF *magFieldMap = (AliMagF*)TGeoGlobalMagField::Instance()->GetField();
1576 magFieldMap->SetName("MagneticFieldMap");
1577 gProof->AddInputData(magFieldMap,kTRUE);
1579 fAnalysis->SetName("Analysis");
1580 gProof->AddInputData(fAnalysis,kTRUE);
1586 //_____________________________________________________________________________
1587 void AliReconstruction::SlaveBegin(TTree*)
1589 // Initialization related to run-loader,
1590 // vertexer, trackers, recontructors
1591 // In proof mode it is executed on the slave
1592 AliCodeTimerAuto("",0);
1594 TProofOutputFile *outProofFile = NULL;
1596 if (AliDebugLevel() > 0) fInput->Print();
1597 if (AliDebugLevel() > 10) fInput->Dump();
1598 if (AliReconstruction *reco = (AliReconstruction*)fInput->FindObject("AliReconstruction")) {
1601 if (TGeoManager *tgeo = (TGeoManager*)fInput->FindObject("Geometry")) {
1603 AliGeomManager::SetGeometry(tgeo);
1605 if (TMap *entryCache = (TMap*)fInput->FindObject("CDBEntryCache")) {
1606 Int_t runNumber = -1;
1607 if (TProof::GetParameter(fInput,"RunNumber",runNumber) == 0) {
1608 AliCDBManager *man = AliCDBManager::Instance(entryCache,runNumber);
1609 man->SetCacheFlag(kTRUE);
1610 man->SetLock(kTRUE);
1614 if (AliMagF *map = (AliMagF*)fInput->FindObject("MagneticFieldMap")) {
1615 AliMagF *newMap = new AliMagF(*map);
1616 if (!newMap->LoadParameterization()) {
1617 Abort("AliMagF::LoadParameterization", TSelector::kAbortProcess);
1620 TGeoGlobalMagField::Instance()->SetField(newMap);
1621 TGeoGlobalMagField::Instance()->Lock();
1624 // Attempt to get the analysis manager from the input list
1625 fAnalysis = (AliAnalysisManager*)fInput->FindObject("Analysis");
1626 if (fAnalysis) AliInfo("==== Analysis manager retrieved from input list ====");
1628 if (TNamed *outputFileName = (TNamed*)fInput->FindObject("PROOF_OUTPUTFILE"))
1629 fProofOutputFileName = outputFileName->GetTitle();
1630 if (TNamed *outputLocation = (TNamed*)fInput->FindObject("PROOF_OUTPUTFILE_LOCATION"))
1631 fProofOutputLocation = outputLocation->GetTitle();
1632 if (fInput->FindObject("PROOF_OUTPUTFILE_DATASET"))
1633 fProofOutputDataset = kTRUE;
1634 if (TNamed *archiveList = (TNamed*)fInput->FindObject("PROOF_OUTPUTFILE_ARCHIVE"))
1635 fProofOutputArchive = archiveList->GetTitle();
1636 if (!fProofOutputFileName.IsNull() &&
1637 !fProofOutputLocation.IsNull() &&
1638 fProofOutputArchive.IsNull()) {
1639 if (!fProofOutputDataset) {
1640 outProofFile = new TProofOutputFile(fProofOutputFileName.Data(),"M");
1641 outProofFile->SetOutputFileName(Form("%s%s",fProofOutputLocation.Data(),fProofOutputFileName.Data()));
1644 outProofFile = new TProofOutputFile(fProofOutputFileName.Data(),"DROV",fProofOutputLocation.Data());
1646 if (AliDebugLevel() > 0) outProofFile->Dump();
1647 fOutput->Add(outProofFile);
1649 AliSysInfo::AddStamp("ReadInputInSlaveBegin");
1651 // Check if analysis was requested in the reconstruction event loop
1653 // Attempt to connect in-memory singleton
1654 fAnalysis = AliAnalysisManager::GetAnalysisManager();
1655 if (fAnalysis) AliInfo(Form("==== Analysis manager <%s> found in memory ====", fAnalysis->GetName()));
1656 // Check if an analysis macro was specified
1657 if (!fAnalysis && !fAnalysisMacro.IsNull()) {
1658 // Run specified analysis macro
1659 gROOT->ProcessLine(Form(".x %s",fAnalysisMacro.Data()));
1660 fAnalysis = AliAnalysisManager::GetAnalysisManager();
1661 if (!fAnalysis) AliError(Form("No analysis manager produced by analysis macro %s", fAnalysisMacro.Data()));
1662 else AliInfo(Form("==== Analysis manager <%s> produced by analysis macro <%s> ====",
1663 fAnalysis->GetName(), fAnalysisMacro.Data()));
1667 // get the run loader
1668 if (!InitRunLoader()) {
1669 Abort("InitRunLoader", TSelector::kAbortProcess);
1672 AliSysInfo::AddStamp("LoadLoader");
1674 ftVertexer = new AliVertexerTracks(AliTracker::GetBz());
1677 if (!fRunTracking.IsNull() && !CreateTrackers(fRunTracking)) {
1678 Abort("CreateTrackers", TSelector::kAbortProcess);
1681 AliSysInfo::AddStamp("CreateTrackers");
1683 // create the ESD output file and tree
1684 if (!outProofFile) {
1685 ffile = TFile::Open("AliESDs.root", "RECREATE");
1686 ffile->SetCompressionLevel(2);
1687 if (!ffile->IsOpen()) {
1688 Abort("OpenESDFile", TSelector::kAbortProcess);
1693 AliInfo(Form("Opening output PROOF file: %s/%s",
1694 outProofFile->GetDir(), outProofFile->GetFileName()));
1695 if (!(ffile = outProofFile->OpenFile("RECREATE"))) {
1696 Abort(Form("Problems opening output PROOF file: %s/%s",
1697 outProofFile->GetDir(), outProofFile->GetFileName()),
1698 TSelector::kAbortProcess);
1703 ftree = new TTree("esdTree", "Tree with ESD objects");
1704 fesd = new AliESDEvent();
1705 fesd->CreateStdContent();
1706 // add a so far non-std object to the ESD, this will
1707 // become part of the std content
1708 fesd->AddObject(new AliESDHLTDecision);
1710 fesd->WriteToTree(ftree);
1711 if (fWriteESDfriend) {
1712 ffileF = TFile::Open("AliESDfriends.root", "RECREATE");
1713 ftreeF = new TTree("esdFriendTree", "Tree with ESD Friend objects");
1714 fesdf = new AliESDfriend();
1715 ftreeF->Branch("ESDfriend.","AliESDfriend", &fesdf);
1716 fesd->AddObject(fesdf);
1719 ftree->GetUserInfo()->Add(fesd);
1721 fhlttree = new TTree("HLTesdTree", "Tree with HLT ESD objects");
1722 fhltesd = new AliESDEvent();
1723 fhltesd->CreateStdContent();
1724 // read the ESD template from CDB
1725 // HLT is allowed to put non-std content to its ESD, the non-std
1726 // objects need to be created before invocation of WriteToTree in
1727 // order to create all branches. Initialization is done from an
1728 // ESD layout template in CDB
1729 AliCDBManager* man = AliCDBManager::Instance();
1730 AliCDBPath hltESDConfigPath("HLT/ConfigHLT/esdLayout");
1731 AliCDBEntry* hltESDConfig=NULL;
1732 if (man->GetId(hltESDConfigPath)!=NULL &&
1733 (hltESDConfig=man->Get(hltESDConfigPath))!=NULL) {
1734 AliESDEvent* pESDLayout=dynamic_cast<AliESDEvent*>(hltESDConfig->GetObject());
1736 // init all internal variables from the list of objects
1737 pESDLayout->GetStdContent();
1739 // copy content and create non-std objects
1740 *fhltesd=*pESDLayout;
1743 AliError(Form("error setting hltEsd layout from %s: invalid object type",
1744 hltESDConfigPath.GetPath().Data()));
1748 fhltesd->WriteToTree(fhlttree);
1749 fhlttree->GetUserInfo()->Add(fhltesd);
1751 ProcInfo_t procInfo;
1752 gSystem->GetProcInfo(&procInfo);
1753 AliInfo(Form("Current memory usage %ld %ld", procInfo.fMemResident, procInfo.fMemVirtual));
1756 //Initialize the QA and start of cycle
1757 if (fRunQA || fRunGlobalQA)
1760 //Initialize the Plane Efficiency framework
1761 if (fRunPlaneEff && !InitPlaneEff()) {
1762 Abort("InitPlaneEff", TSelector::kAbortProcess);
1766 if (strcmp(gProgName,"alieve") == 0)
1767 fRunAliEVE = InitAliEVE();
1768 // If we have an analysis manager, connect the AliRecoInputHandler here
1770 if (!dynamic_cast<AliRecoInputHandler*>(fAnalysis->GetInputEventHandler())) {
1771 AliError("Analysis manager used in reconstruction should use AliRecoInputHandler - \
1772 \n ->Replacing with AliRecoInputHandler instance.");
1773 delete fAnalysis->GetInputEventHandler();
1775 // Set the event and other data pointers
1776 fRecoHandler = new AliRecoInputHandler();
1777 fRecoHandler->Init(ftree, "LOCAL");
1778 fRecoHandler->SetEvent(fesd);
1779 fRecoHandler->SetESDfriend(fesdf);
1780 fRecoHandler->SetHLTEvent(fhltesd);
1781 fRecoHandler->SetHLTTree(fhlttree);
1782 fAnalysis->SetInputEventHandler(fRecoHandler);
1783 // Enter external loop mode
1784 fAnalysis->SetExternalLoop(kTRUE);
1785 // Initialize analysis
1786 fAnalysis->StartAnalysis("local", (TTree*)0);
1787 // Connect ESD tree with the input container
1788 fAnalysis->GetCommonInputContainer()->SetData(ftree);
1793 //_____________________________________________________________________________
1794 Bool_t AliReconstruction::Process(Long64_t entry)
1796 // run the reconstruction over a single entry
1797 // from the chain with raw data
1798 AliCodeTimerAuto("",0);
1800 TTree *currTree = fChain->GetTree();
1801 AliRawVEvent *event = NULL;
1802 currTree->SetBranchAddress("rawevent",&event);
1803 currTree->GetEntry(entry);
1804 fRawReader = new AliRawReaderRoot(event);
1805 fStatus = ProcessEvent(fRunLoader->GetNumberOfEvents());
1813 //_____________________________________________________________________________
1814 void AliReconstruction::Init(TTree *tree)
1816 // Implementation of TSelector::Init()
1819 AliError("The input tree is not found!");
1825 //_____________________________________________________________________________
1826 Bool_t AliReconstruction::ProcessEvent(Int_t iEvent)
1828 // run the reconstruction over a single event
1829 // The event loop is steered in Run method
1832 static Long_t oldMres=0;
1833 static Long_t oldMvir=0;
1834 static Float_t oldCPU=0;
1835 static Long_t aveDMres=0;
1836 static Long_t aveDMvir=0;
1837 static Float_t aveDCPU=0;
1839 AliCodeTimerAuto("",0);
1843 if (iEvent >= fRunLoader->GetNumberOfEvents()) {
1844 fRunLoader->SetEventNumber(iEvent);
1846 fRunLoader->GetHeader()->Reset(fRawReader->GetRunNumber(),
1848 fRunLoader->TreeE()->Fill();
1850 if (fRawReader && fRawReader->UseAutoSaveESD())
1851 fRunLoader->TreeE()->AutoSave("SaveSelf");
1854 if ((iEvent < fFirstEvent) || ((fLastEvent >= 0) && (iEvent > fLastEvent))) {
1859 fRunLoader->GetEvent(iEvent);
1861 // Fill Event-info object
1863 fRecoParam.SetEventSpecie(fRunInfo,fEventInfo,fListOfCosmicTriggers);
1865 ProcInfo_t procInfo;
1866 if(iEvent==fFirstEvent) {
1867 gSystem->GetProcInfo(&procInfo);
1868 oldMres=procInfo.fMemResident;
1869 oldMvir=procInfo.fMemVirtual;
1870 oldCPU=procInfo.fCpuUser+procInfo.fCpuSys;
1872 AliInfo(Form("================================= Processing event %d of type %-10s ==================================", iEvent,fRecoParam.PrintEventSpecie()));
1874 // Set the reco-params
1876 TString detStr = fLoadCDB;
1877 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
1878 if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
1879 AliReconstructor *reconstructor = GetReconstructor(iDet);
1880 if (reconstructor && fRecoParam.GetDetRecoParamArray(iDet)) {
1881 const AliDetectorRecoParam *par = fRecoParam.GetDetRecoParam(iDet);
1882 reconstructor->SetRecoParam(par);
1883 reconstructor->GetPidSettings(&pid);
1884 reconstructor->SetEventInfo(&fEventInfo);
1886 AliQAManager::QAManager()->SetEventInfo(&fEventInfo) ;
1887 AliQAManager::QAManager()->SetRecoParam(iDet, par) ;
1888 if (par) AliQAManager::QAManager()->SetEventSpecie(AliRecoParam::Convert(par->GetEventSpecie())) ;
1893 if (fRunQA || fRunGlobalQA) AliQADataMaker::SetEventTrigClasses(fEventInfo.GetTriggerClasses()); // RS: select which histo clones are to be filled
1896 const AliDetectorRecoParam *grppar = fRecoParam.GetDetRecoParam(kNDetectors);
1897 AliQAManager::QAManager()->SetRecoParam(AliQAv1::kGLOBAL, grppar) ;
1898 AliQAManager::QAManager()->SetEventSpecie(AliRecoParam::Convert(grppar->GetEventSpecie())) ;
1903 if (fRunQA && IsInTasks(AliQAv1::kRAWS)) {
1904 AliQAManager::QAManager()->SetEventSpecie(fRecoParam.GetEventSpecie()) ;
1905 AliQAManager::QAManager()->RunOneEvent(fRawReader) ;
1907 // local single event reconstruction
1908 if (!fRunLocalReconstruction.IsNull()) {
1909 TString detectors=fRunLocalReconstruction;
1910 // run HLT event reconstruction first
1911 // ;-( IsSelected changes the string
1912 if (IsSelected("HLT", detectors) &&
1913 !RunLocalEventReconstruction("HLT")) {
1914 if (fStopOnError) {CleanUp(); return kFALSE;}
1916 detectors=fRunLocalReconstruction;
1917 detectors.ReplaceAll("HLT", "");
1918 if (!RunLocalEventReconstruction(detectors)) {
1927 // fill Event header information from the RawEventHeader
1928 if (fRawReader){FillRawEventHeaderESD(fesd);}
1929 if (fRawReader){FillRawEventHeaderESD(fhltesd);}
1931 fesd->SetRunNumber(fRunLoader->GetHeader()->GetRun());
1932 fhltesd->SetRunNumber(fRunLoader->GetHeader()->GetRun());
1934 ((AliESDRun*)fesd->GetESDRun())->SetDetectorsInDAQ(fRunInfo->GetDetectorMask());
1935 ((AliESDRun*)fhltesd->GetESDRun())->SetDetectorsInDAQ(fRunInfo->GetDetectorMask());
1936 ((AliESDRun*)fesd->GetESDRun())->SetDetectorsInReco(AliDAQ::DetectorPatternOffline(fFillESD.Data()));
1937 ((AliESDRun*)fhltesd->GetESDRun())->SetDetectorsInReco(AliDAQ::DetectorPatternOffline(fFillESD.Data()));
1939 fesd->SetEventNumberInFile(fRunLoader->GetHeader()->GetEventNrInRun());
1940 fhltesd->SetEventNumberInFile(fRunLoader->GetHeader()->GetEventNrInRun());
1942 fesd->SetEventSpecie(fRecoParam.GetEventSpecie());
1943 fhltesd->SetEventSpecie(fRecoParam.GetEventSpecie());
1945 // Set magnetic field from the tracker
1946 fesd->SetMagneticField(AliTracker::GetBz());
1947 fhltesd->SetMagneticField(AliTracker::GetBz());
1949 AliESDRun *esdRun,*esdRunH;
1950 esdRun = (AliESDRun*)fesd->GetESDRun();
1951 esdRunH = (AliESDRun*)fhltesd->GetESDRun();
1952 esdRun->SetBeamEnergyIsSqrtSHalfGeV();
1953 esdRunH->SetBeamEnergyIsSqrtSHalfGeV();
1955 for (int ib=2;ib--;) for (int it=2;it--;) {
1956 esdRun->SetMeanIntensity(ib,it, fBeamInt[ib][it]);
1957 esdRunH->SetMeanIntensity(ib,it, fBeamInt[ib][it]);
1960 AliMagF* fld = (AliMagF*)TGeoGlobalMagField::Instance()->GetField();
1961 if (fld) { // set info needed for field initialization
1962 fesd->SetCurrentL3(fld->GetCurrentSol());
1963 fesd->SetCurrentDip(fld->GetCurrentDip());
1964 fesd->SetBeamEnergy(fld->GetBeamEnergy());
1965 fesd->SetBeamType(fld->GetBeamTypeText());
1966 fesd->SetUniformBMap(fld->IsUniform());
1967 fesd->SetBInfoStored();
1969 fhltesd->SetCurrentL3(fld->GetCurrentSol());
1970 fhltesd->SetCurrentDip(fld->GetCurrentDip());
1971 fhltesd->SetBeamEnergy(fld->GetBeamEnergy());
1972 fhltesd->SetBeamType(fld->GetBeamTypeText());
1973 fhltesd->SetUniformBMap(fld->IsUniform());
1974 fhltesd->SetBInfoStored();
1977 // Set most probable pt, for B=0 tracking
1978 // Get the global reco-params. They are atposition 16 inside the array of detectors in fRecoParam
1979 const AliGRPRecoParam *grpRecoParam = dynamic_cast<const AliGRPRecoParam*>(fRecoParam.GetDetRecoParam(kNDetectors));
1980 if (grpRecoParam) AliExternalTrackParam::SetMostProbablePt(grpRecoParam->GetMostProbablePt());
1982 // Fill raw-data error log into the ESD
1983 if (fRawReader) FillRawDataErrorLog(iEvent,fesd);
1986 if (fRunVertexFinder) {
1987 if (!RunVertexFinder(fesd)) {
1988 if (fStopOnError) {CleanUp(); return kFALSE;}
1992 // For Plane Efficiency: run the SPD trackleter
1993 if (fRunPlaneEff && fSPDTrackleter) {
1994 if (!RunSPDTrackleting(fesd)) {
1995 if (fStopOnError) {CleanUp(); return kFALSE;}
2000 if (!fRunTracking.IsNull()) {
2001 if (fRunMuonTracking) {
2002 if (!RunMuonTracking(fesd)) {
2003 if (fStopOnError) {CleanUp(); return kFALSE;}
2009 if (!fRunTracking.IsNull()) {
2010 if (!RunTracking(fesd,pid)) {
2011 if (fStopOnError) {CleanUp(); return kFALSE;}
2016 if (!fFillESD.IsNull()) {
2017 TString detectors=fFillESD;
2018 // run HLT first and on hltesd
2019 // ;-( IsSelected changes the string
2020 if (IsSelected("HLT", detectors) &&
2021 !FillESD(fhltesd, "HLT")) {
2022 if (fStopOnError) {CleanUp(); return kFALSE;}
2025 // Temporary fix to avoid problems with HLT that overwrites the offline ESDs
2026 if (detectors.Contains("ALL")) {
2028 for (Int_t idet=0; idet<kNDetectors; ++idet){
2029 detectors += fgkDetectorName[idet];
2033 detectors.ReplaceAll("HLT", "");
2034 if (!FillESD(fesd, detectors)) {
2035 if (fStopOnError) {CleanUp(); return kFALSE;}
2043 // Propagate track to the beam pipe (if not already done by ITS)
2045 const Int_t ntracks = fesd->GetNumberOfTracks();
2046 const Double_t kRadius = 2.8; //something less than the beam pipe radius
2049 UShort_t *selectedIdx=new UShort_t[ntracks];
2051 for (Int_t itrack=0; itrack<ntracks; itrack++){
2052 const Double_t kMaxStep = 1; //max step over the material
2055 AliESDtrack *track = fesd->GetTrack(itrack);
2056 if (!track) continue;
2058 AliExternalTrackParam *tpcTrack =
2059 (AliExternalTrackParam *)track->GetTPCInnerParam();
2063 PropagateTrackToBxByBz(tpcTrack,kRadius,track->GetMass(),kMaxStep,kFALSE);
2066 Int_t n=trkArray.GetEntriesFast();
2067 selectedIdx[n]=track->GetID();
2068 trkArray.AddLast(tpcTrack);
2071 //Tracks refitted by ITS should already be at the SPD vertex
2072 if (track->IsOn(AliESDtrack::kITSrefit)) continue;
2075 PropagateTrackToBxByBz(track,kRadius,track->GetMass(),kMaxStep,kFALSE);
2076 Double_t x[3]; track->GetXYZ(x);
2077 Double_t b[3]; AliTracker::GetBxByBz(x,b);
2078 track->RelateToVertexBxByBz(fesd->GetPrimaryVertexSPD(), b, kVeryBig);
2083 // Improve the reconstructed primary vertex position using the tracks
2085 Bool_t runVertexFinderTracks = fRunVertexFinderTracks;
2086 if(fesd->GetPrimaryVertexSPD()) {
2087 TString vtitle = fesd->GetPrimaryVertexSPD()->GetTitle();
2088 if(vtitle.Contains("cosmics")) {
2089 runVertexFinderTracks=kFALSE;
2093 if (runVertexFinderTracks) {
2094 // TPC + ITS primary vertex
2095 ftVertexer->SetITSMode();
2096 ftVertexer->SetConstraintOff();
2097 // get cuts for vertexer from AliGRPRecoParam
2098 Bool_t constrSPD=kFALSE;
2100 Int_t nCutsVertexer = grpRecoParam->GetVertexerTracksNCuts();
2101 Double_t *cutsVertexer = new Double_t[nCutsVertexer];
2102 grpRecoParam->GetVertexerTracksCutsITS(cutsVertexer,nCutsVertexer);
2103 ftVertexer->SetCuts(cutsVertexer,nCutsVertexer);
2104 delete [] cutsVertexer; cutsVertexer = NULL;
2105 if(grpRecoParam->GetVertexerTracksConstraintITS()) {
2106 if(fDiamondProfile && fDiamondProfile->GetXRes()<kRadius){
2107 ftVertexer->SetVtxStart(fDiamondProfile); // apply constraint only if sigmax is smaller than the beam pipe radius
2109 if(fDiamondProfileSPD && fDiamondProfileSPD->GetXRes()<kRadius){
2110 ftVertexer->SetVtxStart(fDiamondProfileSPD);
2116 AliESDVertex *pvtx=ftVertexer->FindPrimaryVertex(fesd);
2119 TString title=pvtx->GetTitle();
2120 title.Append("SPD");
2121 pvtx->SetTitle(title);
2123 if (pvtx->GetStatus()) {
2124 fesd->SetPrimaryVertexTracks(pvtx);
2125 for (Int_t i=0; i<ntracks; i++) {
2126 AliESDtrack *t = fesd->GetTrack(i);
2127 Double_t x[3]; t->GetXYZ(x);
2128 Double_t b[3]; AliTracker::GetBxByBz(x,b);
2129 t->RelateToVertexBxByBz(pvtx, b, kVeryBig);
2132 delete pvtx; pvtx=NULL;
2135 // TPC-only primary vertex
2136 ftVertexer->SetTPCMode();
2137 ftVertexer->SetConstraintOff();
2138 // get cuts for vertexer from AliGRPRecoParam
2140 Int_t nCutsVertexer = grpRecoParam->GetVertexerTracksNCuts();
2141 Double_t *cutsVertexer = new Double_t[nCutsVertexer];
2142 grpRecoParam->GetVertexerTracksCutsTPC(cutsVertexer,nCutsVertexer);
2143 ftVertexer->SetCuts(cutsVertexer,nCutsVertexer);
2144 delete [] cutsVertexer; cutsVertexer = NULL;
2145 if(fDiamondProfileTPC && grpRecoParam->GetVertexerTracksConstraintTPC()) {
2146 if(fDiamondProfileTPC->GetXRes()<kRadius) ftVertexer->SetVtxStart(fDiamondProfileTPC); // apply constraint only if sigmax is smaller than the beam pipe radius
2149 pvtx=ftVertexer->FindPrimaryVertex(&trkArray,selectedIdx);
2151 if (pvtx->GetStatus()) {
2152 fesd->SetPrimaryVertexTPC(pvtx);
2153 for (Int_t i=0; i<ntracks; i++) {
2154 AliESDtrack *t = fesd->GetTrack(i);
2155 Double_t x[3]; t->GetXYZ(x);
2156 Double_t b[3]; AliTracker::GetBxByBz(x,b);
2157 t->RelateToVertexTPCBxByBz(pvtx, b, kVeryBig);
2160 delete pvtx; pvtx=NULL;
2164 delete[] selectedIdx;
2166 if(fDiamondProfile && fDiamondProfile->GetXRes()<kRadius) fesd->SetDiamond(fDiamondProfile);
2167 else fesd->SetDiamond(fDiamondProfileSPD);
2171 AliV0vertexer vtxer;
2172 // get cuts for V0vertexer from AliGRPRecoParam
2174 Int_t nCutsV0vertexer = grpRecoParam->GetVertexerV0NCuts();
2175 Double_t *cutsV0vertexer = new Double_t[nCutsV0vertexer];
2176 grpRecoParam->GetVertexerV0Cuts(cutsV0vertexer);
2177 vtxer.SetCuts(cutsV0vertexer);
2178 delete [] cutsV0vertexer; cutsV0vertexer = NULL;
2180 vtxer.Tracks2V0vertices(fesd);
2182 if (fRunCascadeFinder) {
2184 AliCascadeVertexer cvtxer;
2185 // get cuts for CascadeVertexer from AliGRPRecoParam
2187 Int_t nCutsCascadeVertexer = grpRecoParam->GetVertexerCascadeNCuts();
2188 Double_t *cutsCascadeVertexer = new Double_t[nCutsCascadeVertexer];
2189 grpRecoParam->GetVertexerCascadeCuts(cutsCascadeVertexer);
2190 cvtxer.SetCuts(cutsCascadeVertexer);
2191 delete [] cutsCascadeVertexer; cutsCascadeVertexer = NULL;
2193 cvtxer.V0sTracks2CascadeVertices(fesd);
2198 if (fReconstructor[3])
2199 GetReconstructor(3)->FillEventTimeWithTOF(fesd,&pid);
2204 if (fFillTriggerESD) {
2205 if (!FillTriggerESD(fesd)) {
2206 if (fStopOnError) {CleanUp(); return kFALSE;}
2209 // Always fill scalers
2210 if (!FillTriggerScalers(fesd)) {
2211 if (fStopOnError) {CleanUp(); return kFALSE;}
2215 if (fCleanESD) CleanESD(fesd);
2217 // RS run updated trackleter: since we want to mark the clusters used by tracks and also mark the
2218 // tracks interpreted as primary, this step should be done in the very end, when full
2219 // ESD info is available (particulalry, V0s)
2221 if (fRunMultFinder) {
2222 if (!RunMultFinder(fesd)) {
2223 if (fStopOnError) {CleanUp(); return kFALSE;}
2227 if (fRunQA && IsInTasks(AliQAv1::kESDS)) {
2228 AliQAManager::QAManager()->SetEventSpecie(fRecoParam.GetEventSpecie()) ;
2229 AliQAManager::QAManager()->RunOneEvent(fesd, fhltesd) ;
2232 AliQADataMaker *qadm = AliQAManager::QAManager()->GetQADataMaker(AliQAv1::kGLOBAL);
2234 qadm->SetEventSpecie(fRecoParam.GetEventSpecie()) ;
2235 if (qadm && IsInTasks(AliQAv1::kESDS))
2236 qadm->Exec(AliQAv1::kESDS, fesd);
2239 // copy HLT decision from HLTesd to esd
2240 // the most relevant information is stored in a reduced container in the esd,
2241 // while the full information can be found in the HLTesd
2242 TObject* pHLTSrc=fhltesd->FindListObject(AliESDHLTDecision::Name());
2243 TObject* pHLTTgt=fesd->FindListObject(AliESDHLTDecision::Name());
2244 if (pHLTSrc && pHLTTgt) {
2245 pHLTSrc->Copy(*pHLTTgt);
2248 // Perform analysis of this event if requested
2249 // RS: Should be done before WriteESDfriend, since the latter may clean the esdfriend
2251 fRecoHandler->BeginEvent(iEvent);
2252 fAnalysis->ExecAnalysis();
2253 fRecoHandler->FinishEvent();
2256 if (fWriteESDfriend)
2257 fesd->GetESDfriend(fesdf);
2260 if (fWriteESDfriend) {
2263 // Auto-save the ESD tree in case of prompt reco @P2
2264 if (fRawReader && fRawReader->UseAutoSaveESD()) {
2265 ftree->AutoSave("SaveSelf");
2266 if (fWriteESDfriend) ftreeF->AutoSave("SaveSelf");
2273 if (fRunAliEVE) RunAliEVE();
2277 if (fWriteESDfriend) {
2278 fesdf->~AliESDfriend();
2279 new (fesdf) AliESDfriend(); // Reset...
2282 gSystem->GetProcInfo(&procInfo);
2283 Long_t dMres=(procInfo.fMemResident-oldMres)/1024;
2284 Long_t dMvir=(procInfo.fMemVirtual-oldMvir)/1024;
2285 Float_t dCPU=procInfo.fCpuUser+procInfo.fCpuSys-oldCPU;
2286 aveDMres+=(dMres-aveDMres)/(iEvent-fFirstEvent+1);
2287 aveDMvir+=(dMvir-aveDMvir)/(iEvent-fFirstEvent+1);
2288 aveDCPU+=(dCPU-aveDCPU)/(iEvent-fFirstEvent+1);
2289 AliInfo(Form("======================= End Event %d: Res %ld(%3ld <%3ld>) Vir %ld(%3ld <%3ld>) CPU %5.2f <%5.2f> ===================",
2290 iEvent, procInfo.fMemResident/1024, dMres, aveDMres, procInfo.fMemVirtual/1024, dMvir, aveDMvir, dCPU, aveDCPU));
2291 oldMres=procInfo.fMemResident;
2292 oldMvir=procInfo.fMemVirtual;
2293 oldCPU=procInfo.fCpuUser+procInfo.fCpuSys;
2296 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
2297 if (fReconstructor[iDet]) {
2298 fReconstructor[iDet]->SetRecoParam(NULL);
2299 fReconstructor[iDet]->SetEventInfo(NULL);
2301 if (fTracker[iDet]) fTracker[iDet]->SetEventInfo(NULL);
2304 if (fRunQA || fRunGlobalQA)
2305 AliQAManager::QAManager()->Increment() ;
2310 //_____________________________________________________________________________
2311 void AliReconstruction::SlaveTerminate()
2313 // Finalize the run on the slave side
2314 // Called after the exit
2315 // from the event loop
2316 AliCodeTimerAuto("",0);
2317 // If analysis was done during reconstruction, we need to call SlaveTerminate for it
2319 fAnalysis->PackOutput(fOutput);
2320 fAnalysis->SetSkipTerminate(kTRUE);
2321 fAnalysis->Terminate();
2324 if (fIsNewRunLoader) { // galice.root didn't exist
2325 fRunLoader->WriteHeader("OVERWRITE");
2326 fRunLoader->WriteTrigger("OVERWRITE");
2327 fRunLoader->CdGAFile();
2328 fRunLoader->Write(0, TObject::kOverwrite);
2331 const TMap *cdbMap = AliCDBManager::Instance()->GetStorageMap();
2332 const TList *cdbList = AliCDBManager::Instance()->GetRetrievedIds();
2334 TMap *cdbMapCopy = new TMap(cdbMap->GetEntries());
2335 cdbMapCopy->SetOwner(1);
2336 cdbMapCopy->SetName("cdbMap");
2337 TIter iter(cdbMap->GetTable());
2340 while((pair = dynamic_cast<TPair*> (iter.Next()))){
2341 TObjString* keyStr = dynamic_cast<TObjString*> (pair->Key());
2342 TObjString* valStr = dynamic_cast<TObjString*> (pair->Value());
2343 if (keyStr && valStr)
2344 cdbMapCopy->Add(new TObjString(keyStr->GetName()), new TObjString(valStr->GetName()));
2347 TList *cdbListCopy = new TList();
2348 cdbListCopy->SetOwner(1);
2349 cdbListCopy->SetName("cdbList");
2351 TIter iter2(cdbList);
2354 while((id = dynamic_cast<AliCDBId*> (iter2.Next()))){
2355 cdbListCopy->Add(new TObjString(id->ToString().Data()));
2358 ftree->GetUserInfo()->Add(cdbMapCopy);
2359 ftree->GetUserInfo()->Add(cdbListCopy);
2361 // Add the AliRoot version that created this file
2362 TString sVersion("aliroot ");
2363 sVersion += ALIROOT_SVN_BRANCH;
2365 sVersion += ALIROOT_SVN_REVISION;
2366 sVersion += "; root ";
2367 sVersion += ROOT_SVN_BRANCH;
2369 sVersion += ROOT_SVN_REVISION;
2370 sVersion += "; metadata ";
2371 sVersion += gSystem->Getenv("PRODUCTION_METADATA");
2374 TNamed * alirootVersion = new TNamed("alirootVersion",sVersion.Data());
2375 ftree->GetUserInfo()->Add(alirootVersion); // The list becomes owner of alirootVersion
2379 // we want to have only one tree version number
2380 ftree->Write(ftree->GetName(),TObject::kOverwrite);
2381 fhlttree->Write(fhlttree->GetName(),TObject::kOverwrite);
2383 if (fWriteESDfriend) {
2385 ftreeF->Write(ftreeF->GetName(),TObject::kOverwrite);
2388 // Finish with Plane Efficiency evaluation: before of CleanUp !!!
2389 if (fRunPlaneEff && !FinishPlaneEff()) {
2390 AliWarning("Finish PlaneEff evaluation failed");
2393 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
2394 if (fReconstructor[iDet]) fReconstructor[iDet]->Terminate();
2396 // End of cycle for the in-loop
2398 if (fRunQA || fRunGlobalQA) {
2399 AliQAManager::QAManager()->EndOfCycle() ;
2401 !fProofOutputLocation.IsNull() &&
2402 fProofOutputArchive.IsNull() &&
2403 !fProofOutputDataset) {
2404 TString qaOutputFile(Form("%sMerged.%s.Data.root",
2405 fProofOutputLocation.Data(),
2406 AliQAv1::GetQADataFileName()));
2407 TProofOutputFile *qaProofFile = new TProofOutputFile(Form("Merged.%s.Data.root",
2408 AliQAv1::GetQADataFileName()));
2409 qaProofFile->SetOutputFileName(qaOutputFile.Data());
2410 if (AliDebugLevel() > 0) qaProofFile->Dump();
2411 fOutput->Add(qaProofFile);
2412 MergeQA(qaProofFile->GetFileName());
2423 if (!fProofOutputFileName.IsNull() &&
2424 !fProofOutputLocation.IsNull() &&
2425 fProofOutputDataset &&
2426 !fProofOutputArchive.IsNull()) {
2427 TProofOutputFile *zipProofFile = new TProofOutputFile(fProofOutputFileName.Data(),
2429 fProofOutputLocation.Data());
2430 if (AliDebugLevel() > 0) zipProofFile->Dump();
2431 fOutput->Add(zipProofFile);
2432 TString fileList(fProofOutputArchive.Data());
2433 fileList.ReplaceAll(","," ");
2435 #if ROOT_SVN_REVISION >= 30174
2436 command.Form("zip -n root %s/%s %s",zipProofFile->GetDir(kTRUE),zipProofFile->GetFileName(),fileList.Data());
2438 command.Form("zip -n root %s/%s %s",zipProofFile->GetDir(),zipProofFile->GetFileName(),fileList.Data());
2440 AliInfo(Form("Executing: %s",command.Data()));
2441 gSystem->Exec(command.Data());
2446 //_____________________________________________________________________________
2447 void AliReconstruction::Terminate()
2449 // Create tags for the events in the ESD tree (the ESD tree is always present)
2450 // In case of empty events the tags will contain dummy values
2451 AliCodeTimerAuto("",0);
2453 // Do not call the ESD tag creator in case of PROOF-based reconstruction
2455 AliESDTagCreator *esdtagCreator = new AliESDTagCreator();
2456 esdtagCreator->CreateESDTags(fFirstEvent,fLastEvent,fGRPData, AliQAv1::Instance()->GetQA(), AliQAv1::Instance()->GetEventSpecies(), AliQAv1::kNDET, AliRecoParam::kNSpecies);
2457 delete esdtagCreator;
2460 // Cleanup of CDB manager: cache and active storages!
2461 AliCDBManager::Instance()->ClearCache();
2464 //_____________________________________________________________________________
2465 Bool_t AliReconstruction::RunLocalEventReconstruction(const TString& detectors)
2467 // run the local reconstruction
2469 static Int_t eventNr=0;
2470 AliCodeTimerAuto("",0)
2472 TString detStr = detectors;
2473 // execute HLT reconstruction first since other detector reconstruction
2474 // might depend on HLT data
2475 // key 'HLT' is removed from detStr by IsSelected
2476 if (!IsSelected("HLT", detStr)) {
2477 AliReconstructor* reconstructor = GetReconstructor(kNDetectors-1);
2478 if (reconstructor) {
2479 // there is no AliLoader for HLT, see
2480 // https://savannah.cern.ch/bugs/?35473
2481 AliInfo("running reconstruction for HLT");
2483 AliInfo("reconstructor->Reconstruct(fRawReader, NULL)");
2484 reconstructor->Reconstruct(fRawReader, NULL);
2487 AliInfo("reconstructor->Reconstruct(dummy, NULL)");
2489 reconstructor->Reconstruct(dummy, NULL);
2494 AliInfo(Form("kNDetectors = %d",kNDetectors));
2496 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
2497 if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
2498 AliDebug(1, Form("Detector: %s", fgkDetectorName[iDet]));
2499 AliReconstructor* reconstructor = GetReconstructor(iDet);
2500 if (!reconstructor) continue;
2501 AliLoader* loader = fLoader[iDet];
2503 AliWarning(Form("No loader is defined for %s!",fgkDetectorName[iDet]));
2506 // conversion of digits
2507 if (fRawReader && reconstructor->HasDigitConversion()) {
2508 AliInfo(Form("converting raw data digits into root objects for %s",
2509 fgkDetectorName[iDet]));
2510 // AliCodeTimerAuto(Form("converting raw data digits into root objects for %s",
2511 // fgkDetectorName[iDet]),0);
2512 loader->LoadDigits("update");
2513 loader->CleanDigits();
2514 loader->MakeDigitsContainer();
2515 TTree* digitsTree = loader->TreeD();
2516 reconstructor->ConvertDigits(fRawReader, digitsTree);
2517 loader->WriteDigits("OVERWRITE");
2518 loader->UnloadDigits();
2520 // local reconstruction
2521 AliInfo(Form("running reconstruction for %s", fgkDetectorName[iDet]));
2522 //AliCodeTimerAuto(Form("running reconstruction for %s", fgkDetectorName[iDet]),0);
2523 AliDebug(1, "Loading Rec Points");
2524 loader->LoadRecPoints("update");
2525 AliDebug(1, "Cleaning Rec Points");
2526 loader->CleanRecPoints();
2527 AliDebug(1, "Making Rec Points Container");
2528 loader->MakeRecPointsContainer();
2529 TTree* clustersTree = loader->TreeR();
2530 if (fRawReader && !reconstructor->HasDigitConversion()) {
2531 reconstructor->Reconstruct(fRawReader, clustersTree);
2534 AliDebug(1, "Loading Digits");
2535 loader->LoadDigits("read");
2536 TTree* digitsTree = loader->TreeD();
2537 AliDebug(1, Form("Digits Tree = %p",digitsTree));
2539 AliError(Form("Can't get the %s digits tree", fgkDetectorName[iDet]));
2544 AliDebug(1, "Digits -> Clusters");
2545 reconstructor->Reconstruct(digitsTree, clustersTree);
2546 if (fRunQA && IsInTasks(AliQAv1::kDIGITSR)) {
2547 AliQAManager::QAManager()->SetEventSpecie(fRecoParam.GetEventSpecie()) ;
2548 AliQAManager::QAManager()->RunOneEventInOneDetector(iDet, digitsTree) ;
2551 loader->UnloadDigits();
2553 if (fRunQA && IsInTasks(AliQAv1::kRECPOINTS)) {
2554 AliQAManager::QAManager()->SetEventSpecie(fRecoParam.GetEventSpecie()) ;
2555 AliQAManager::QAManager()->RunOneEventInOneDetector(iDet, clustersTree) ;
2557 loader->WriteRecPoints("OVERWRITE");
2558 loader->UnloadRecPoints();
2559 AliSysInfo::AddStamp(Form("LRec%s_%d",fgkDetectorName[iDet],eventNr), iDet,1,eventNr);
2561 if (!IsSelected("CTP", detStr)) AliDebug(10,"No CTP");
2562 if ((detStr.CompareTo("ALL") != 0) && !detStr.IsNull()) {
2563 AliError(Form("the following detectors were not found: %s",
2571 //_____________________________________________________________________________
2572 Bool_t AliReconstruction::RunSPDTrackleting(AliESDEvent*& esd)
2574 // run the SPD trackleting (for SPD efficiency purpouses)
2576 AliCodeTimerAuto("",0)
2578 Double_t vtxPos[3] = {0, 0, 0};
2579 Double_t vtxErr[3] = {0.0, 0.0, 0.0};
2585 if (fRunLoader->GetHeader() && fRunLoader->GetHeader()->GenEventHeader()) {
2586 fRunLoader->GetHeader()->GenEventHeader()->PrimaryVertex(mcVertex);
2587 for (Int_t i = 0; i < 3; i++) vtxPos[i] = mcVertex[i];
2590 const AliESDVertex *vertex = esd->GetVertex();
2592 AliWarning("Vertex not found");
2595 vertex->GetXYZ(vtxPos);
2596 vertex->GetSigmaXYZ(vtxErr);
2597 if (fSPDTrackleter) {
2598 AliInfo("running the SPD Trackleter for Plane Efficiency Evaluation");
2601 fLoader[0]->LoadRecPoints("read");
2602 TTree* tree = fLoader[0]->TreeR();
2604 AliError("Can't get the ITS cluster tree");
2607 fSPDTrackleter->LoadClusters(tree);
2608 fSPDTrackleter->SetVertex(vtxPos, vtxErr);
2610 if (fSPDTrackleter->Clusters2Tracks(esd) != 0) {
2611 AliWarning("AliITSTrackleterSPDEff Clusters2Tracks failed");
2612 // fLoader[0]->UnloadRecPoints();
2615 //fSPDTrackleter->UnloadRecPoints();
2617 AliWarning("SPDTrackleter not available");
2623 //_____________________________________________________________________________
2624 Bool_t AliReconstruction::RunVertexFinder(AliESDEvent*& esd)
2626 // run the barrel tracking
2628 AliCodeTimerAuto("",0)
2630 AliVertexer *vertexer = CreateVertexer();
2631 if (!vertexer) return kFALSE;
2633 AliInfo(Form("running the ITS vertex finder: %s",vertexer->ClassName()));
2634 AliESDVertex* vertex = NULL;
2636 fLoader[0]->LoadRecPoints();
2637 TTree* cltree = fLoader[0]->TreeR();
2639 if(fDiamondProfileSPD) vertexer->SetVtxStart(fDiamondProfileSPD);
2640 vertex = vertexer->FindVertexForCurrentEvent(cltree);
2643 AliError("Can't get the ITS cluster tree");
2645 fLoader[0]->UnloadRecPoints();
2648 AliError("Can't get the ITS loader");
2651 AliWarning("Vertex not found");
2652 vertex = new AliESDVertex();
2653 vertex->SetName("default");
2656 vertex->SetName("reconstructed");
2661 vertex->GetXYZ(vtxPos);
2662 vertex->GetSigmaXYZ(vtxErr);
2664 esd->SetPrimaryVertexSPD(vertex);
2665 AliESDVertex *vpileup = NULL;
2666 Int_t novertices = 0;
2667 vpileup = vertexer->GetAllVertices(novertices);
2669 for (Int_t kk=1; kk<novertices; kk++)esd->AddPileupVertexSPD(&vpileup[kk]);
2672 // if SPD multiplicity has been determined, it is stored in the ESD
2673 AliMultiplicity *mult = vertexer->GetMultiplicity();
2674 if(mult)esd->SetMultiplicity(mult);
2676 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
2677 if (fTracker[iDet]) fTracker[iDet]->SetVertex(vtxPos, vtxErr);
2686 //_____________________________________________________________________________
2687 Bool_t AliReconstruction::RunMultFinder(AliESDEvent*& esd)
2689 // run the trackleter for multiplicity study
2691 AliCodeTimerAuto("",0)
2693 AliTrackleter *trackleter = CreateMultFinder();
2694 if (!trackleter) return kFALSE;
2696 AliInfo(Form("running the ITS multiplicity finder: %s",trackleter->ClassName()));
2699 fLoader[0]->LoadRecPoints();
2700 TTree* cltree = fLoader[0]->TreeR();
2702 trackleter->Reconstruct(esd,cltree);
2703 AliMultiplicity *mult = trackleter->GetMultiplicity();
2704 if(mult) esd->SetMultiplicity(mult);
2707 AliError("Can't get the ITS cluster tree");
2709 fLoader[0]->UnloadRecPoints();
2712 AliError("Can't get the ITS loader");
2720 //_____________________________________________________________________________
2721 Bool_t AliReconstruction::RunHLTTracking(AliESDEvent*& esd)
2723 // run the HLT barrel tracking
2725 AliCodeTimerAuto("",0)
2728 AliError("Missing runLoader!");
2732 AliInfo("running HLT tracking");
2734 // Get a pointer to the HLT reconstructor
2735 AliReconstructor *reconstructor = GetReconstructor(kNDetectors-1);
2736 if (!reconstructor) return kFALSE;
2739 for (Int_t iDet = 1; iDet >= 0; iDet--) {
2740 TString detName = fgkDetectorName[iDet];
2741 AliDebug(1, Form("%s HLT tracking", detName.Data()));
2742 reconstructor->SetOption(detName.Data());
2743 AliTracker *tracker = reconstructor->CreateTracker();
2745 AliWarning(Form("couldn't create a HLT tracker for %s", detName.Data()));
2746 if (fStopOnError) return kFALSE;
2750 Double_t vtxErr[3]={0.005,0.005,0.010};
2751 const AliESDVertex *vertex = esd->GetVertex();
2752 vertex->GetXYZ(vtxPos);
2753 tracker->SetVertex(vtxPos,vtxErr);
2755 fLoader[iDet]->LoadRecPoints("read");
2756 TTree* tree = fLoader[iDet]->TreeR();
2758 AliError(Form("Can't get the %s cluster tree", detName.Data()));
2761 tracker->LoadClusters(tree);
2763 if (tracker->Clusters2Tracks(esd) != 0) {
2764 AliError(Form("HLT %s Clusters2Tracks failed", fgkDetectorName[iDet]));
2768 tracker->UnloadClusters();
2776 //_____________________________________________________________________________
2777 Bool_t AliReconstruction::RunMuonTracking(AliESDEvent*& esd)
2779 // run the muon spectrometer tracking
2781 AliCodeTimerAuto("",0)
2784 AliError("Missing runLoader!");
2787 Int_t iDet = GetDetIndex("MUON"); // for MUON
2789 // Get a pointer to the MUON reconstructor
2790 AliReconstructor *reconstructor = GetReconstructor(iDet);
2791 if (!reconstructor) return kFALSE;
2794 TString detName = fgkDetectorName[iDet];
2795 AliDebug(1, Form("%s tracking", detName.Data()));
2796 AliTracker *tracker = reconstructor->CreateTracker();
2798 AliWarning(Form("couldn't create a tracker for %s", detName.Data()));
2803 fLoader[iDet]->LoadRecPoints("read");
2805 tracker->LoadClusters(fLoader[iDet]->TreeR());
2807 Int_t rv = tracker->Clusters2Tracks(esd);
2809 fLoader[iDet]->UnloadRecPoints();
2811 tracker->UnloadClusters();
2815 AliError(Form("%s Clusters2Tracks failed", fgkDetectorName[iDet]));
2823 //_____________________________________________________________________________
2824 Bool_t AliReconstruction::RunTracking(AliESDEvent*& esd,AliESDpid &PID)
2826 // run the barrel tracking
2827 static Int_t eventNr=0;
2828 AliCodeTimerAuto("",0)
2830 AliInfo("running tracking");
2832 // Set the event info which is used
2833 // by the trackers in order to obtain
2834 // information about read-out detectors,
2836 AliDebug(1, "Setting event info");
2837 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
2838 if (!fTracker[iDet]) continue;
2839 fTracker[iDet]->SetEventInfo(&fEventInfo);
2842 //Fill the ESD with the T0 info (will be used by the TOF)
2843 if (fReconstructor[11] && fLoader[11]) {
2844 fLoader[11]->LoadRecPoints("READ");
2845 TTree *treeR = fLoader[11]->TreeR();
2847 GetReconstructor(11)->FillESD((TTree *)NULL,treeR,esd);
2851 // pass 1: TPC + ITS inwards
2852 for (Int_t iDet = 1; iDet >= 0; iDet--) {
2853 if (!fTracker[iDet]) continue;
2854 AliDebug(1, Form("%s tracking", fgkDetectorName[iDet]));
2857 fLoader[iDet]->LoadRecPoints("read");
2858 AliSysInfo::AddStamp(Form("RLoadCluster%s_%d",fgkDetectorName[iDet],eventNr),iDet,1, eventNr);
2859 TTree* tree = fLoader[iDet]->TreeR();
2861 AliError(Form("Can't get the %s cluster tree", fgkDetectorName[iDet]));
2864 fTracker[iDet]->LoadClusters(tree);
2865 AliSysInfo::AddStamp(Form("TLoadCluster%s_%d",fgkDetectorName[iDet],eventNr), iDet,2, eventNr);
2867 if (fTracker[iDet]->Clusters2Tracks(esd) != 0) {
2868 AliError(Form("%s Clusters2Tracks failed", fgkDetectorName[iDet]));
2871 // preliminary PID in TPC needed by the ITS tracker
2873 GetReconstructor(1)->FillESD((TTree*)NULL, (TTree*)NULL, esd);
2874 PID.MakePID(esd,kTRUE);
2876 AliSysInfo::AddStamp(Form("Tracking0%s_%d",fgkDetectorName[iDet],eventNr), iDet,3,eventNr);
2879 // pass 2: ALL backwards
2881 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
2882 if (!fTracker[iDet]) continue;
2883 AliDebug(1, Form("%s back propagation", fgkDetectorName[iDet]));
2886 if (iDet > 1) { // all except ITS, TPC
2888 fLoader[iDet]->LoadRecPoints("read");
2889 AliSysInfo::AddStamp(Form("RLoadCluster0%s_%d",fgkDetectorName[iDet],eventNr), iDet,1, eventNr);
2890 tree = fLoader[iDet]->TreeR();
2892 AliError(Form("Can't get the %s cluster tree", fgkDetectorName[iDet]));
2895 fTracker[iDet]->LoadClusters(tree);
2896 AliSysInfo::AddStamp(Form("TLoadCluster0%s_%d",fgkDetectorName[iDet],eventNr), iDet,2, eventNr);
2900 if (iDet>1) // start filling residuals for the "outer" detectors
2902 AliTracker::SetFillResiduals(fRecoParam.GetEventSpecie(), kTRUE);
2903 TObjArray ** arr = AliTracker::GetResidualsArray() ;
2905 AliRecoParam::EventSpecie_t es=fRecoParam.GetEventSpecie();
2906 TObjArray * elem = arr[AliRecoParam::AConvert(es)];
2907 if ( elem && (! elem->At(0)) ) {
2908 AliQADataMaker *qadm = AliQAManager::QAManager()->GetQADataMaker(AliQAv1::kGLOBAL);
2909 if (qadm) qadm->InitRecPointsForTracker() ;
2913 if (fTracker[iDet]->PropagateBack(esd) != 0) {
2914 AliError(Form("%s backward propagation failed", fgkDetectorName[iDet]));
2919 if (iDet > 3) { // all except ITS, TPC, TRD and TOF
2920 fTracker[iDet]->UnloadClusters();
2921 fLoader[iDet]->UnloadRecPoints();
2923 // updated PID in TPC needed by the ITS tracker -MI
2925 //GetReconstructor(1)->FillESD((TTree*)NULL, (TTree*)NULL, esd);
2926 //AliESDpid::MakePID(esd);
2927 PID.MakePID(esd,kTRUE);
2929 AliSysInfo::AddStamp(Form("Tracking1%s_%d",fgkDetectorName[iDet],eventNr), iDet,3, eventNr);
2931 //stop filling residuals for the "outer" detectors
2932 if (fRunGlobalQA) AliTracker::SetFillResiduals(fRecoParam.GetEventSpecie(), kFALSE);
2934 // pass 3: TRD + TPC + ITS refit inwards
2936 for (Int_t iDet = 2; iDet >= 0; iDet--) {
2937 if (!fTracker[iDet]) continue;
2938 AliDebug(1, Form("%s inward refit", fgkDetectorName[iDet]));
2941 if (iDet<2) // start filling residuals for TPC and ITS
2943 AliTracker::SetFillResiduals(fRecoParam.GetEventSpecie(), kTRUE);
2944 TObjArray ** arr = AliTracker::GetResidualsArray() ;
2946 AliRecoParam::EventSpecie_t es=fRecoParam.GetEventSpecie();
2947 TObjArray * elem = arr[AliRecoParam::AConvert(es)];
2948 if ( elem && (! elem->At(0)) ) {
2949 AliQADataMaker *qadm = AliQAManager::QAManager()->GetQADataMaker(AliQAv1::kGLOBAL);
2950 if (qadm) qadm->InitRecPointsForTracker() ;
2955 if (fTracker[iDet]->RefitInward(esd) != 0) {
2956 AliError(Form("%s inward refit failed", fgkDetectorName[iDet]));
2959 // run postprocessing
2960 if (fTracker[iDet]->PostProcess(esd) != 0) {
2961 AliError(Form("%s postprocessing failed", fgkDetectorName[iDet]));
2964 AliSysInfo::AddStamp(Form("Tracking2%s_%d",fgkDetectorName[iDet],eventNr), iDet,3, eventNr);
2967 // write space-points to the ESD in case alignment data output
2969 if (fWriteAlignmentData)
2970 WriteAlignmentData(esd);
2972 for (Int_t iDet = 3; iDet >= 0; iDet--) {
2973 if (!fTracker[iDet]) continue;
2975 fTracker[iDet]->UnloadClusters();
2976 AliSysInfo::AddStamp(Form("TUnloadCluster%s_%d",fgkDetectorName[iDet],eventNr), iDet,4, eventNr);
2977 fLoader[iDet]->UnloadRecPoints();
2978 AliSysInfo::AddStamp(Form("RUnloadCluster%s_%d",fgkDetectorName[iDet],eventNr), iDet,5, eventNr);
2980 // stop filling residuals for TPC and ITS
2981 if (fRunGlobalQA) AliTracker::SetFillResiduals(fRecoParam.GetEventSpecie(), kFALSE);
2987 //_____________________________________________________________________________
2988 Bool_t AliReconstruction::CleanESD(AliESDEvent *esd){
2990 // Remove the data which are not needed for the physics analysis.
2993 Int_t nTracks=esd->GetNumberOfTracks();
2994 Int_t nV0s=esd->GetNumberOfV0s();
2996 (Form("Number of ESD tracks and V0s before cleaning: %d %d",nTracks,nV0s));
2998 Float_t cleanPars[]={fV0DCAmax,fV0CsPmin,fDmax,fZmax};
2999 Bool_t rc=esd->Clean(cleanPars);
3001 nTracks=esd->GetNumberOfTracks();
3002 nV0s=esd->GetNumberOfV0s();
3004 (Form("Number of ESD tracks and V0s after cleaning %d %d",nTracks,nV0s));
3009 //_____________________________________________________________________________
3010 Bool_t AliReconstruction::FillESD(AliESDEvent*& esd, const TString& detectors)
3012 // fill the event summary data
3014 AliCodeTimerAuto("",0)
3015 static Int_t eventNr=0;
3016 TString detStr = detectors;
3018 AliSysInfo::AddStamp(Form("FillESDb%d",eventNr), -19,-19, eventNr);
3019 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
3020 if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
3021 AliReconstructor* reconstructor = GetReconstructor(iDet);
3022 if (!reconstructor) continue;
3023 AliDebug(1, Form("filling ESD for %s", fgkDetectorName[iDet]));
3024 TTree* clustersTree = NULL;
3025 if (fLoader[iDet]) {
3026 fLoader[iDet]->LoadRecPoints("read");
3027 clustersTree = fLoader[iDet]->TreeR();
3028 if (!clustersTree) {
3029 AliError(Form("Can't get the %s clusters tree",
3030 fgkDetectorName[iDet]));
3031 if (fStopOnError) return kFALSE;
3034 if (fRawReader && !reconstructor->HasDigitConversion()) {
3035 reconstructor->FillESD(fRawReader, clustersTree, esd);
3037 TTree* digitsTree = NULL;
3038 if (fLoader[iDet]) {
3039 fLoader[iDet]->LoadDigits("read");
3040 digitsTree = fLoader[iDet]->TreeD();
3042 AliError(Form("Can't get the %s digits tree",
3043 fgkDetectorName[iDet]));
3044 if (fStopOnError) return kFALSE;
3047 reconstructor->FillESD(digitsTree, clustersTree, esd);
3048 if (fLoader[iDet]) fLoader[iDet]->UnloadDigits();
3050 if (fLoader[iDet]) {
3051 fLoader[iDet]->UnloadRecPoints();
3055 if (!IsSelected("CTP", detStr)) AliDebug(10,"No CTP");
3056 if ((detStr.CompareTo("ALL") != 0) && !detStr.IsNull()) {
3057 AliError(Form("the following detectors were not found: %s",
3059 if (fStopOnError) return kFALSE;
3061 AliSysInfo::AddStamp(Form("FillESDe%d",eventNr), -20,-20, eventNr);
3066 //_____________________________________________________________________________
3067 Bool_t AliReconstruction::FillTriggerESD(AliESDEvent*& esd)
3069 // Reads the trigger decision which is
3070 // stored in Trigger.root file and fills
3071 // the corresponding esd entries
3073 AliCodeTimerAuto("",0)
3075 AliInfo("Filling trigger information into the ESD");
3078 AliCTPRawStream input(fRawReader);
3079 if (!input.Next()) {
3080 AliWarning("No valid CTP (trigger) DDL raw data is found ! The trigger info is taken from the event header!");
3083 if (esd->GetTriggerMask() != input.GetClassMask())
3084 AliError(Form("Invalid trigger pattern found in CTP raw-data: %llx %llx",
3085 input.GetClassMask(),esd->GetTriggerMask()));
3086 if (esd->GetOrbitNumber() != input.GetOrbitID())
3087 AliError(Form("Invalid orbit id found in CTP raw-data: %x %x",
3088 input.GetOrbitID(),esd->GetOrbitNumber()));
3089 if (esd->GetBunchCrossNumber() != input.GetBCID())
3090 AliError(Form("Invalid bunch-crossing id found in CTP raw-data: %x %x",
3091 input.GetBCID(),esd->GetBunchCrossNumber()));
3092 AliESDHeader* esdheader = esd->GetHeader();
3093 esdheader->SetL0TriggerInputs(input.GetL0Inputs());
3094 esdheader->SetL1TriggerInputs(input.GetL1Inputs());
3095 esdheader->SetL2TriggerInputs(input.GetL2Inputs());
3097 UInt_t orbit=input.GetOrbitID();
3098 for(Int_t i=0 ; i<input.GetNIRs() ; i++ )
3099 if(TMath::Abs(Int_t(orbit-(input.GetIR(i))->GetOrbit()))<=1){
3100 esdheader->AddTriggerIR(input.GetIR(i));
3102 AliCentralTrigger* rlCTP = fRunLoader->GetTrigger();
3103 rlCTP->SetL0TriggerInputs(input.GetL0Inputs());
3104 rlCTP->SetL1TriggerInputs(input.GetL1Inputs());
3105 rlCTP->SetL2TriggerInputs(input.GetL2Inputs());
3107 if (fIsNewRunLoader) fRunLoader->TreeCT()->Fill();
3111 //_____________________________________________________________________________
3112 Bool_t AliReconstruction::FillTriggerScalers(AliESDEvent*& esd)
3115 //fRunScalers->Print();
3116 if(fRunScalers && fRunScalers->CheckRunScalers()){
3117 AliTimeStamp* timestamp = new AliTimeStamp(esd->GetOrbitNumber(), esd->GetPeriodNumber(), esd->GetBunchCrossNumber());
3118 //AliTimeStamp* timestamp = new AliTimeStamp(10308000, 0, (ULong64_t)486238);
3119 AliESDHeader* esdheader = fesd->GetHeader();
3120 for(Int_t i=0;i<50;i++){
3121 if((1ull<<i) & esd->GetTriggerMask()){
3122 AliTriggerScalersESD* scalesd = fRunScalers->GetScalersForEventClass( timestamp, i+1);
3123 if(scalesd)esdheader->SetTriggerScalersRecord(scalesd);
3126 const AliTriggerScalersRecordESD* scalrecEvent = fRunScalers->GetScalersDeltaForEvent( timestamp);
3127 const AliTriggerScalersRecordESD* scalrecRun = fRunScalers->GetScalersDeltaForRun();
3128 if (scalrecEvent) esdheader->SetTriggerScalersDeltaEvent(scalrecEvent);
3129 if (scalrecRun) esdheader->SetTriggerScalersDeltaRun(scalrecRun);
3133 //_____________________________________________________________________________
3134 Bool_t AliReconstruction::FillRawEventHeaderESD(AliESDEvent*& esd)
3137 // Filling information from RawReader Header
3140 if (!fRawReader) return kFALSE;
3142 AliInfo("Filling information from RawReader Header");
3144 esd->SetBunchCrossNumber(fRawReader->GetBCID());
3145 esd->SetOrbitNumber(fRawReader->GetOrbitID());
3146 esd->SetPeriodNumber(fRawReader->GetPeriod());
3148 esd->SetTimeStamp(fRawReader->GetTimestamp());
3149 esd->SetEventType(fRawReader->GetType());
3155 //_____________________________________________________________________________
3156 Bool_t AliReconstruction::IsSelected(TString detName, TString& detectors) const
3158 // check whether detName is contained in detectors
3159 // if yes, it is removed from detectors
3161 // check if all detectors are selected
3162 if ((detectors.CompareTo("ALL") == 0) ||
3163 detectors.BeginsWith("ALL ") ||
3164 detectors.EndsWith(" ALL") ||
3165 detectors.Contains(" ALL ")) {
3170 // search for the given detector
3171 Bool_t result = kFALSE;
3172 if ((detectors.CompareTo(detName) == 0) ||
3173 detectors.BeginsWith(detName+" ") ||
3174 detectors.EndsWith(" "+detName) ||
3175 detectors.Contains(" "+detName+" ")) {
3176 detectors.ReplaceAll(detName, "");
3180 // clean up the detectors string
3181 while (detectors.Contains(" ")) detectors.ReplaceAll(" ", " ");
3182 while (detectors.BeginsWith(" ")) detectors.Remove(0, 1);
3183 while (detectors.EndsWith(" ")) detectors.Remove(detectors.Length()-1, 1);
3188 //_____________________________________________________________________________
3189 Bool_t AliReconstruction::InitRunLoader()
3191 // get or create the run loader
3193 if (gAlice) delete gAlice;
3196 TFile *gafile = TFile::Open(fGAliceFileName.Data());
3197 // if (!gSystem->AccessPathName(fGAliceFileName.Data())) { // galice.root exists
3198 if (gafile) { // galice.root exists
3202 // load all base libraries to get the loader classes
3203 TString libs = gSystem->GetLibraries();
3204 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
3205 TString detName = fgkDetectorName[iDet];
3206 if (detName == "HLT") continue;
3207 if (libs.Contains("lib" + detName + "base.so")) continue;
3208 gSystem->Load("lib" + detName + "base.so");
3210 fRunLoader = AliRunLoader::Open(fGAliceFileName.Data());
3212 AliError(Form("no run loader found in file %s", fGAliceFileName.Data()));
3217 fRunLoader->CdGAFile();
3218 fRunLoader->LoadgAlice();
3220 //PH This is a temporary fix to give access to the kinematics
3221 //PH that is needed for the labels of ITS clusters
3222 fRunLoader->LoadHeader();
3223 fRunLoader->LoadKinematics();
3225 } else { // galice.root does not exist
3227 AliError(Form("the file %s does not exist", fGAliceFileName.Data()));
3229 fRunLoader = AliRunLoader::Open(fGAliceFileName.Data(),
3230 AliConfig::GetDefaultEventFolderName(),
3233 AliError(Form("could not create run loader in file %s",
3234 fGAliceFileName.Data()));
3238 fIsNewRunLoader = kTRUE;
3239 fRunLoader->MakeTree("E");
3240 fRunLoader->MakeTree("GG");
3242 if (fNumberOfEventsPerFile > 0)
3243 fRunLoader->SetNumberOfEventsPerFile(fNumberOfEventsPerFile);
3245 fRunLoader->SetNumberOfEventsPerFile((UInt_t)-1);
3251 //_____________________________________________________________________________
3252 AliReconstructor* AliReconstruction::GetReconstructor(Int_t iDet)
3254 // get the reconstructor object and the loader for a detector
3256 if (fReconstructor[iDet]) {
3257 if (fRecoParam.GetDetRecoParamArray(iDet) && !AliReconstructor::GetRecoParam(iDet)) {
3258 const AliDetectorRecoParam *par = fRecoParam.GetDetRecoParam(iDet);
3259 fReconstructor[iDet]->SetRecoParam(par);
3260 fReconstructor[iDet]->SetRunInfo(fRunInfo);
3262 return fReconstructor[iDet];
3265 // load the reconstructor object
3266 TPluginManager* pluginManager = gROOT->GetPluginManager();
3267 TString detName = fgkDetectorName[iDet];
3268 TString recName = "Ali" + detName + "Reconstructor";
3270 if (!fIsNewRunLoader && !fRunLoader->GetLoader(detName+"Loader") && (detName != "HLT")) return NULL;
3272 AliReconstructor* reconstructor = NULL;
3273 // first check if a plugin is defined for the reconstructor
3274 TPluginHandler* pluginHandler =
3275 pluginManager->FindHandler("AliReconstructor", detName);
3276 // if not, add a plugin for it
3277 if (!pluginHandler) {
3278 AliDebug(1, Form("defining plugin for %s", recName.Data()));
3279 TString libs = gSystem->GetLibraries();
3280 if (libs.Contains("lib" + detName + "base.so") ||
3281 (gSystem->Load("lib" + detName + "base.so") >= 0)) {
3282 pluginManager->AddHandler("AliReconstructor", detName,
3283 recName, detName + "rec", recName + "()");
3285 pluginManager->AddHandler("AliReconstructor", detName,
3286 recName, detName, recName + "()");
3288 pluginHandler = pluginManager->FindHandler("AliReconstructor", detName);
3290 if (pluginHandler && (pluginHandler->LoadPlugin() == 0)) {
3291 reconstructor = (AliReconstructor*) pluginHandler->ExecPlugin(0);
3294 // check if the upgrade reconstructor should be used instead of the standard one
3295 if(fUpgradeMask[iDet]) {
3296 if(reconstructor) delete reconstructor;
3297 TClass *cl = new TClass(Form("Ali%sUpgradeReconstructor",fgkDetectorName[iDet]));
3298 reconstructor = (AliReconstructor*)(cl->New());
3301 if (reconstructor) {
3302 TObject* obj = fOptions.FindObject(detName.Data());
3303 if (obj) reconstructor->SetOption(obj->GetTitle());
3304 reconstructor->SetRunInfo(fRunInfo);
3305 reconstructor->Init();
3306 fReconstructor[iDet] = reconstructor;
3309 // get or create the loader
3310 if (detName != "HLT") {
3311 fLoader[iDet] = fRunLoader->GetLoader(detName + "Loader");
3312 if (!fLoader[iDet]) {
3313 AliConfig::Instance()
3314 ->CreateDetectorFolders(fRunLoader->GetEventFolder(),
3316 // first check if a plugin is defined for the loader
3318 pluginManager->FindHandler("AliLoader", detName);
3319 // if not, add a plugin for it
3320 if (!pluginHandler) {
3321 TString loaderName = "Ali" + detName + "Loader";
3322 AliDebug(1, Form("defining plugin for %s", loaderName.Data()));
3323 pluginManager->AddHandler("AliLoader", detName,
3324 loaderName, detName + "base",
3325 loaderName + "(const char*, TFolder*)");
3326 pluginHandler = pluginManager->FindHandler("AliLoader", detName);
3328 if (pluginHandler && (pluginHandler->LoadPlugin() == 0)) {
3330 (AliLoader*) pluginHandler->ExecPlugin(2, detName.Data(),
3331 fRunLoader->GetEventFolder());
3333 if (!fLoader[iDet]) { // use default loader
3334 fLoader[iDet] = new AliLoader(detName, fRunLoader->GetEventFolder());
3336 if (!fLoader[iDet]) {
3337 AliWarning(Form("couldn't get loader for %s", detName.Data()));
3338 if (fStopOnError) return NULL;
3340 fRunLoader->AddLoader(fLoader[iDet]);
3341 fRunLoader->CdGAFile();
3342 if (gFile && !gFile->IsWritable()) gFile->ReOpen("UPDATE");
3343 fRunLoader->Write(0, TObject::kOverwrite);
3348 if (fRecoParam.GetDetRecoParamArray(iDet) && !AliReconstructor::GetRecoParam(iDet)) {
3349 const AliDetectorRecoParam *par = fRecoParam.GetDetRecoParam(iDet);
3350 if (reconstructor) {
3351 reconstructor->SetRecoParam(par);
3352 reconstructor->SetRunInfo(fRunInfo);
3355 return reconstructor;
3358 //_____________________________________________________________________________
3359 AliVertexer* AliReconstruction::CreateVertexer()
3361 // create the vertexer
3362 // Please note that the caller is the owner of the
3365 AliVertexer* vertexer = NULL;
3366 AliReconstructor* itsReconstructor = GetReconstructor(0);
3367 if (itsReconstructor && ((fRunLocalReconstruction.Contains("ITS")) ||
3368 fRunTracking.Contains("ITS") || fFillESD.Contains("ITS") )) {
3369 vertexer = itsReconstructor->CreateVertexer();
3372 AliWarning("couldn't create a vertexer for ITS");
3378 //_____________________________________________________________________________
3379 AliTrackleter* AliReconstruction::CreateMultFinder()
3381 // create the ITS trackleter for mult. estimation
3382 // Please note that the caller is the owner of the
3385 AliTrackleter* trackleter = NULL;
3386 AliReconstructor* itsReconstructor = GetReconstructor(0);
3387 if (itsReconstructor && ((fRunLocalReconstruction.Contains("ITS")) ||
3388 fRunTracking.Contains("ITS") || fFillESD.Contains("ITS") )) {
3389 trackleter = itsReconstructor->CreateMultFinder();
3392 AliWarning("ITS is not in reconstruction, switching off RunMultFinder");
3393 fRunMultFinder = kFALSE;
3399 //_____________________________________________________________________________
3400 Bool_t AliReconstruction::CreateTrackers(const TString& detectors)
3402 // create the trackers
3403 AliInfo("Creating trackers");
3405 TString detStr = detectors;
3406 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
3407 if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
3408 AliReconstructor* reconstructor = GetReconstructor(iDet);
3409 if (!reconstructor) continue;
3410 TString detName = fgkDetectorName[iDet];
3411 if (detName == "HLT") {
3412 fRunHLTTracking = kTRUE;
3415 if (detName == "MUON") {
3416 fRunMuonTracking = kTRUE;
3420 fTracker[iDet] = reconstructor->CreateTracker();
3421 if (!fTracker[iDet] && (iDet < 7)) {
3422 AliWarning(Form("couldn't create a tracker for %s", detName.Data()));
3423 if (fStopOnError) return kFALSE;
3425 AliSysInfo::AddStamp(Form("LTracker%s",fgkDetectorName[iDet]), iDet,0);
3431 //_____________________________________________________________________________
3432 void AliReconstruction::CleanUp()
3434 // delete trackers and the run loader and close and delete the file
3436 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
3437 delete fReconstructor[iDet];
3438 fReconstructor[iDet] = NULL;
3439 fLoader[iDet] = NULL;
3440 delete fTracker[iDet];
3441 fTracker[iDet] = NULL;
3448 delete fSPDTrackleter;
3449 fSPDTrackleter = NULL;
3458 delete fParentRawReader;
3459 fParentRawReader=NULL;
3467 if (AliQAManager::QAManager())
3468 AliQAManager::QAManager()->ShowQA() ;
3469 // AliQAManager::Destroy() ;
3474 void AliReconstruction::WriteAlignmentData(AliESDEvent* esd)
3476 // Write space-points which are then used in the alignment procedures
3477 // For the moment only ITS, TPC, TRD and TOF
3479 Int_t ntracks = esd->GetNumberOfTracks();
3480 for (Int_t itrack = 0; itrack < ntracks; itrack++)
3482 AliESDtrack *track = esd->GetTrack(itrack);
3485 for (Int_t i=0; i<200; ++i) idx[i] = -1; //PH avoid uninitialized values
3486 for (Int_t iDet = 5; iDet >= 0; iDet--) {// TOF, TRD, TPC, ITS clusters
3487 nsp += (iDet==GetDetIndex("TRD")) ? track->GetTRDntracklets():track->GetNcls(iDet);
3489 if (iDet==GetDetIndex("ITS")) { // ITS "extra" clusters
3490 track->GetClusters(iDet,idx);
3491 for (Int_t i=6; i<12; i++) if(idx[i] >= 0) nsp++;
3496 AliTrackPointArray *sp = new AliTrackPointArray(nsp);
3497 track->SetTrackPointArray(sp);
3499 for (Int_t iDet = 5; iDet >= 0; iDet--) {
3500 AliTracker *tracker = fTracker[iDet];
3501 if (!tracker) continue;
3502 Int_t nspdet = (iDet==GetDetIndex("TRD")) ? track->GetTRDtracklets(idx):track->GetClusters(iDet,idx);
3504 if (iDet==GetDetIndex("ITS")) // ITS "extra" clusters
3505 for (Int_t i=6; i<12; i++) if(idx[i] >= 0) nspdet++;
3507 if (nspdet <= 0) continue;
3511 while (isp2 < nspdet) {
3512 Bool_t isvalid=kTRUE;
3514 Int_t index=idx[isp++];
3515 if (index < 0) continue;
3517 TString dets = fgkDetectorName[iDet];
3518 if ((fUseTrackingErrorsForAlignment.CompareTo(dets) == 0) ||
3519 fUseTrackingErrorsForAlignment.BeginsWith(dets+" ") ||
3520 fUseTrackingErrorsForAlignment.EndsWith(" "+dets) ||
3521 fUseTrackingErrorsForAlignment.Contains(" "+dets+" ")) {
3522 isvalid = tracker->GetTrackPointTrackingError(index,p,track);
3524 isvalid = tracker->GetTrackPoint(index,p);
3527 if (!isvalid) continue;
3528 if (iDet==GetDetIndex("ITS") && (isp-1)>=6) p.SetExtra();
3529 sp->AddPoint(isptrack,&p); isptrack++;
3536 //_____________________________________________________________________________
3537 void AliReconstruction::FillRawDataErrorLog(Int_t iEvent, AliESDEvent* esd)
3539 // The method reads the raw-data error log
3540 // accumulated within the rawReader.
3541 // It extracts the raw-data errors related to
3542 // the current event and stores them into
3543 // a TClonesArray inside the esd object.
3545 if (!fRawReader) return;
3547 for(Int_t i = 0; i < fRawReader->GetNumberOfErrorLogs(); i++) {
3549 AliRawDataErrorLog *log = fRawReader->GetErrorLog(i);
3551 if (iEvent != log->GetEventNumber()) continue;
3553 esd->AddRawDataErrorLog(log);
3558 //_____________________________________________________________________________
3559 // void AliReconstruction::CheckQA()
3561 // check the QA of SIM for this run and remove the detectors
3562 // with status Fatal
3564 // TString newRunLocalReconstruction ;
3565 // TString newRunTracking ;
3566 // TString newFillESD ;
3568 // for (Int_t iDet = 0; iDet < AliQAv1::kNDET; iDet++) {
3569 // TString detName(AliQAv1::GetDetName(iDet)) ;
3570 // AliQAv1 * qa = AliQAv1::Instance(AliQAv1::DETECTORINDEX_t(iDet)) ;
3571 // if ( qa->IsSet(AliQAv1::DETECTORINDEX_t(iDet), AliQAv1::kSIM, specie, AliQAv1::kFATAL)) {
3572 // AliInfo(Form("QA status for %s %s in Hits and/or SDIGITS and/or Digits was Fatal; No reconstruction performed",
3573 // detName.Data(), AliRecoParam::GetEventSpecieName(es))) ;
3575 // if ( fRunLocalReconstruction.Contains(AliQAv1::GetDetName(iDet)) ||
3576 // fRunLocalReconstruction.Contains("ALL") ) {
3577 // newRunLocalReconstruction += detName ;
3578 // newRunLocalReconstruction += " " ;
3580 // if ( fRunTracking.Contains(AliQAv1::GetDetName(iDet)) ||
3581 // fRunTracking.Contains("ALL") ) {
3582 // newRunTracking += detName ;
3583 // newRunTracking += " " ;
3585 // if ( fFillESD.Contains(AliQAv1::GetDetName(iDet)) ||
3586 // fFillESD.Contains("ALL") ) {
3587 // newFillESD += detName ;
3588 // newFillESD += " " ;
3592 // fRunLocalReconstruction = newRunLocalReconstruction ;
3593 // fRunTracking = newRunTracking ;
3594 // fFillESD = newFillESD ;
3597 //_____________________________________________________________________________
3598 Int_t AliReconstruction::GetDetIndex(const char* detector)
3600 // return the detector index corresponding to detector
3602 for (index = 0; index < kNDetectors ; index++) {
3603 if ( strcmp(detector, fgkDetectorName[index]) == 0 )
3608 //_____________________________________________________________________________
3609 Bool_t AliReconstruction::FinishPlaneEff() {
3611 // Here execute all the necessary operationis, at the end of the tracking phase,
3612 // in case that evaluation of PlaneEfficiencies was required for some detector.
3613 // E.g., write into a DataBase file the PlaneEfficiency which have been evaluated.
3615 // This Preliminary version works only FOR ITS !!!!!
3616 // other detectors (TOF,TRD, etc. have to develop their specific codes)
3619 // Return: kTRUE if all operations have been done properly, kFALSE otherwise
3622 TString detStr = fLoadCDB;
3623 //for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
3624 for (Int_t iDet = 0; iDet < 1; iDet++) { // for the time being only ITS
3625 if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
3626 if(fTracker[iDet] && fTracker[iDet]->GetPlaneEff()) {
3627 AliPlaneEff *planeeff=fTracker[iDet]->GetPlaneEff();
3628 TString name=planeeff->GetName();
3630 TFile* pefile = TFile::Open(name, "RECREATE");
3631 ret=(Bool_t)planeeff->Write();
3633 if(planeeff->GetCreateHistos()) {
3634 TString hname=planeeff->GetName();
3635 hname+="Histo.root";
3636 ret*=planeeff->WriteHistosToFile(hname,"RECREATE");
3639 if(fSPDTrackleter) {
3640 AliPlaneEff *planeeff=fSPDTrackleter->GetPlaneEff();
3641 TString name="AliITSPlaneEffSPDtracklet.root";
3642 TFile* pefile = TFile::Open(name, "RECREATE");
3643 ret=(Bool_t)planeeff->Write();
3645 AliESDEvent *dummy=NULL;
3646 ret=(Bool_t)fSPDTrackleter->PostProcess(dummy); // take care of writing other files
3651 //_____________________________________________________________________________
3652 Bool_t AliReconstruction::InitPlaneEff() {
3654 // Here execute all the necessary operations, before of the tracking phase,
3655 // for the evaluation of PlaneEfficiencies, in case required for some detectors.
3656 // E.g., read from a DataBase file a first evaluation of the PlaneEfficiency
3657 // which should be updated/recalculated.
3659 // This Preliminary version will work only FOR ITS !!!!!
3660 // other detectors (TOF,TRD, etc. have to develop their specific codes)
3663 // Return: kTRUE if all operations have been done properly, kFALSE otherwise
3666 fSPDTrackleter = NULL;
3667 TString detStr = fLoadCDB;
3668 if (IsSelected(fgkDetectorName[0], detStr)) {
3669 AliReconstructor* itsReconstructor = GetReconstructor(0);
3670 if (itsReconstructor) {
3671 fSPDTrackleter = itsReconstructor->CreateTrackleter(); // this is NULL unless required in RecoParam
3673 if (fSPDTrackleter) {
3674 AliInfo("Trackleter for SPD has been created");
3680 //_____________________________________________________________________________
3681 Bool_t AliReconstruction::InitAliEVE()
3683 // This method should be called only in case
3684 // AliReconstruction is run
3685 // within the alieve environment.
3686 // It will initialize AliEVE in a way
3687 // so that it can visualize event processed
3688 // by AliReconstruction.
3689 // The return flag shows whenever the
3690 // AliEVE initialization was successful or not.
3692 TString macroStr(gSystem->Getenv("ALIEVE_ONLINE_MACRO"));
3694 if (macroStr.IsNull())
3695 macroStr.Form("%s/EVE/macros/alieve_online.C",gSystem->ExpandPathName("$ALICE_ROOT"));
3697 AliInfo(Form("Loading AliEVE macro: %s",macroStr.Data()));
3699 if (gROOT->LoadMacro(macroStr.Data()) != 0) return kFALSE;
3701 gROOT->ProcessLine("if (!AliEveEventManager::GetMaster()){new AliEveEventManager();AliEveEventManager::GetMaster()->AddNewEventCommand(\"alieve_online_on_new_event()\");gEve->AddEvent(AliEveEventManager::GetMaster());};");
3702 gROOT->ProcessLine("alieve_online_init()");
3707 //_____________________________________________________________________________
3708 void AliReconstruction::RunAliEVE()
3710 // Runs AliEVE visualisation of
3711 // the current event.
3712 // Should be executed only after
3713 // successful initialization of AliEVE.
3715 AliInfo("Running AliEVE...");
3716 gROOT->ProcessLine(Form("AliEveEventManager::GetMaster()->SetEvent((AliRunLoader*)%p,(AliRawReader*)%p,(AliESDEvent*)%p,(AliESDfriend*)%p);",fRunLoader,fRawReader,fesd,fesdf));
3720 //_____________________________________________________________________________
3721 Bool_t AliReconstruction::SetRunQA(TString detAndAction)
3723 // Allows to run QA for a selected set of detectors
3724 // and a selected set of tasks among RAWS, DIGITSR, RECPOINTS and ESDS
3725 // all selected detectors run the same selected tasks
3727 if (!detAndAction.Contains(":")) {
3728 AliError( Form("%s is a wrong syntax, use \"DetectorList:ActionList\" \n", detAndAction.Data()) ) ;
3732 Int_t colon = detAndAction.Index(":") ;
3733 fQADetectors = detAndAction(0, colon) ;
3734 fQATasks = detAndAction(colon+1, detAndAction.Sizeof() ) ;
3735 if (fQATasks.Contains("ALL") ) {
3736 fQATasks = Form("%d %d %d %d", AliQAv1::kRAWS, AliQAv1::kDIGITSR, AliQAv1::kRECPOINTS, AliQAv1::kESDS) ;
3738 fQATasks.ToUpper() ;
3740 if ( fQATasks.Contains("RAW") )
3741 tempo = Form("%d ", AliQAv1::kRAWS) ;
3742 if ( fQATasks.Contains("DIGIT") )
3743 tempo += Form("%d ", AliQAv1::kDIGITSR) ;
3744 if ( fQATasks.Contains("RECPOINT") )
3745 tempo += Form("%d ", AliQAv1::kRECPOINTS) ;
3746 if ( fQATasks.Contains("ESD") )
3747 tempo += Form("%d ", AliQAv1::kESDS) ;
3749 if (fQATasks.IsNull()) {
3750 AliInfo("No QA requested\n") ;
3755 TString tempo(fQATasks) ;
3756 tempo.ReplaceAll(Form("%d", AliQAv1::kRAWS), AliQAv1::GetTaskName(AliQAv1::kRAWS)) ;
3757 tempo.ReplaceAll(Form("%d", AliQAv1::kDIGITSR), AliQAv1::GetTaskName(AliQAv1::kDIGITSR)) ;
3758 tempo.ReplaceAll(Form("%d", AliQAv1::kRECPOINTS), AliQAv1::GetTaskName(AliQAv1::kRECPOINTS)) ;
3759 tempo.ReplaceAll(Form("%d", AliQAv1::kESDS), AliQAv1::GetTaskName(AliQAv1::kESDS)) ;
3760 AliInfo( Form("QA will be done on \"%s\" for \"%s\"\n", fQADetectors.Data(), tempo.Data()) ) ;
3765 //_____________________________________________________________________________
3766 Bool_t AliReconstruction::InitRecoParams()
3768 // The method accesses OCDB and retrieves all
3769 // the available reco-param objects from there.
3771 Bool_t isOK = kTRUE;
3773 if (fRecoParam.GetDetRecoParamArray(kNDetectors)) {
3774 AliInfo("Using custom GRP reconstruction parameters");
3777 AliInfo("Loading GRP reconstruction parameter objects");
3779 AliCDBPath path("GRP","Calib","RecoParam");
3780 AliCDBEntry *entry=AliCDBManager::Instance()->Get(path.GetPath());
3782 AliWarning("Couldn't find GRP RecoParam entry in OCDB");
3786 TObject *recoParamObj = entry->GetObject();
3787 if (dynamic_cast<TObjArray*>(recoParamObj)) {
3788 // GRP has a normal TobjArray of AliDetectorRecoParam objects
3789 // Registering them in AliRecoParam
3790 fRecoParam.AddDetRecoParamArray(kNDetectors,dynamic_cast<TObjArray*>(recoParamObj));
3792 else if (dynamic_cast<AliDetectorRecoParam*>(recoParamObj)) {
3793 // GRP has only onse set of reco parameters
3794 // Registering it in AliRecoParam
3795 AliInfo("Single set of GRP reconstruction parameters found");
3796 dynamic_cast<AliDetectorRecoParam*>(recoParamObj)->SetAsDefault();
3797 fRecoParam.AddDetRecoParam(kNDetectors,dynamic_cast<AliDetectorRecoParam*>(recoParamObj));
3800 AliError("No valid GRP RecoParam object found in the OCDB");
3807 TString detStr = fLoadCDB;
3808 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
3810 if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
3812 if (fRecoParam.GetDetRecoParamArray(iDet)) {
3813 AliInfo(Form("Using custom reconstruction parameters for detector %s",fgkDetectorName[iDet]));
3817 AliInfo(Form("Loading reconstruction parameter objects for detector %s",fgkDetectorName[iDet]));
3819 AliCDBPath path(fgkDetectorName[iDet],"Calib","RecoParam");
3820 AliCDBEntry *entry=AliCDBManager::Instance()->Get(path.GetPath());
3822 AliWarning(Form("Couldn't find RecoParam entry in OCDB for detector %s",fgkDetectorName[iDet]));
3826 TObject *recoParamObj = entry->GetObject();
3827 if (dynamic_cast<TObjArray*>(recoParamObj)) {
3828 // The detector has a normal TobjArray of AliDetectorRecoParam objects
3829 // Registering them in AliRecoParam
3830 fRecoParam.AddDetRecoParamArray(iDet,dynamic_cast<TObjArray*>(recoParamObj));
3832 else if (dynamic_cast<AliDetectorRecoParam*>(recoParamObj)) {
3833 // The detector has only onse set of reco parameters
3834 // Registering it in AliRecoParam
3835 AliInfo(Form("Single set of reconstruction parameters found for detector %s",fgkDetectorName[iDet]));
3836 dynamic_cast<AliDetectorRecoParam*>(recoParamObj)->SetAsDefault();
3837 fRecoParam.AddDetRecoParam(iDet,dynamic_cast<AliDetectorRecoParam*>(recoParamObj));
3840 AliError(Form("No valid RecoParam object found in the OCDB for detector %s",fgkDetectorName[iDet]));
3844 // FIX ME: We have to disable the unloading of reco-param CDB
3845 // entries because QA framework is using them. Has to be fix in
3846 // a way that the QA takes the objects already constructed in
3848 // AliCDBManager::Instance()->UnloadFromCache(path.GetPath());
3852 if (AliDebugLevel() > 0) fRecoParam.Print();
3857 //_____________________________________________________________________________
3858 Bool_t AliReconstruction::GetEventInfo()
3860 // Fill the event info object
3862 AliCodeTimerAuto("",0)
3864 AliCentralTrigger *aCTP = NULL;
3866 fEventInfo.SetEventType(fRawReader->GetType());
3868 ULong64_t mask = fRawReader->GetClassMask();
3869 fEventInfo.SetTriggerMask(mask);
3870 UInt_t clmask = fRawReader->GetDetectorPattern()[0];
3871 fEventInfo.SetTriggerCluster(AliDAQ::ListOfTriggeredDetectors(clmask));
3873 aCTP = new AliCentralTrigger();
3874 TString configstr("");
3875 if (!aCTP->LoadConfiguration(configstr)) { // Load CTP config from OCDB
3876 AliError("No trigger configuration found in OCDB! The trigger configuration information will not be used!");
3880 aCTP->SetClassMask(mask);
3881 aCTP->SetClusterMask(clmask);
3883 AliCentralTrigger* rlCTP = fRunLoader->GetTrigger();
3884 rlCTP->SetClassMask(mask);
3885 rlCTP->SetClusterMask(clmask);
3888 fEventInfo.SetEventType(AliRawEventHeaderBase::kPhysicsEvent);
3890 if (fRunLoader && (!fRunLoader->LoadTrigger())) {
3891 aCTP = fRunLoader->GetTrigger();
3892 fEventInfo.SetTriggerMask(aCTP->GetClassMask());
3893 // get inputs from actp - just get
3894 AliESDHeader* esdheader = fesd->GetHeader();
3895 esdheader->SetL0TriggerInputs(aCTP->GetL0TriggerInputs());
3896 esdheader->SetL1TriggerInputs(aCTP->GetL1TriggerInputs());
3897 esdheader->SetL2TriggerInputs(aCTP->GetL2TriggerInputs());
3898 fEventInfo.SetTriggerCluster(AliDAQ::ListOfTriggeredDetectors(aCTP->GetClusterMask()));
3901 AliWarning("No trigger can be loaded! The trigger information will not be used!");
3906 AliTriggerConfiguration *config = aCTP->GetConfiguration();
3908 AliError("No trigger configuration has been found! The trigger configuration information will not be used!");
3909 if (fRawReader) delete aCTP;
3913 UChar_t clustmask = 0;
3915 ULong64_t trmask = fEventInfo.GetTriggerMask();
3916 const TObjArray& classesArray = config->GetClasses();
3917 Int_t nclasses = classesArray.GetEntriesFast();
3918 for( Int_t iclass=0; iclass < nclasses; iclass++ ) {
3919 AliTriggerClass* trclass = (AliTriggerClass*)classesArray.At(iclass);
3920 if (trclass && trclass->GetMask()>0) {
3921 Int_t trindex = TMath::Nint(TMath::Log2(trclass->GetMask()));
3922 fesd->SetTriggerClass(trclass->GetName(),trindex);
3923 if (fRawReader) fRawReader->LoadTriggerClass(trclass->GetName(),trindex);
3924 if (trmask & (1ull << trindex)) {
3926 trclasses += trclass->GetName();
3928 clustmask |= trclass->GetCluster()->GetClusterMask();
3932 fEventInfo.SetTriggerClasses(trclasses);
3934 // Write names of active trigger inputs in ESD Header
3935 const TObjArray& inputsArray = config->GetInputs();
3936 Int_t ninputs = inputsArray.GetEntriesFast();
3937 for( Int_t iinput=0; iinput < ninputs; iinput++ ) {
3938 AliTriggerInput* trginput = (AliTriggerInput*)inputsArray.At(iinput);
3939 if (trginput && trginput->GetMask()>0) {
3940 Int_t inputIndex = (Int_t)TMath::Nint(TMath::Log2(trginput->GetMask()));
3941 AliESDHeader* headeresd = fesd->GetHeader();
3942 Int_t trglevel = (Int_t)trginput->GetLevel();
3943 if (trglevel == 0) headeresd->SetActiveTriggerInputs(trginput->GetInputName(), inputIndex);
3944 if (trglevel == 1) headeresd->SetActiveTriggerInputs(trginput->GetInputName(), inputIndex+24);
3945 if (trglevel == 2) headeresd->SetActiveTriggerInputs(trginput->GetInputName(), inputIndex+48);
3949 // Set the information in ESD
3950 fesd->SetTriggerMask(trmask);
3951 fesd->SetTriggerCluster(clustmask);
3953 if (!aCTP->CheckTriggeredDetectors()) {
3954 if (fRawReader) delete aCTP;
3958 if (fRawReader) delete aCTP;
3960 // We have to fill also the HLT decision here!!
3966 const char *AliReconstruction::MatchDetectorList(const char *detectorList, UInt_t detectorMask)
3968 // Match the detector list found in the rec.C or the default 'ALL'
3969 // to the list found in the GRP (stored there by the shuttle PP which
3970 // gets the information from ECS)
3971 static TString resultList;
3972 TString detList = detectorList;
3976 for(Int_t iDet = 0; iDet < (AliDAQ::kNDetectors-1); iDet++) {
3977 if ((detectorMask >> iDet) & 0x1) {
3978 TString det = AliDAQ::OfflineModuleName(iDet);
3979 if ((detList.CompareTo("ALL") == 0) ||
3980 ((detList.BeginsWith("ALL ") ||
3981 detList.EndsWith(" ALL") ||
3982 detList.Contains(" ALL ")) &&
3983 !(detList.BeginsWith("-"+det+" ") ||
3984 detList.EndsWith(" -"+det) ||
3985 detList.Contains(" -"+det+" "))) ||
3986 (detList.CompareTo(det) == 0) ||
3987 detList.BeginsWith(det+" ") ||
3988 detList.EndsWith(" "+det) ||
3989 detList.Contains( " "+det+" " )) {
3990 if (!resultList.EndsWith(det + " ")) {
3999 if ((detectorMask >> AliDAQ::kHLTId) & 0x1) {
4000 TString hltDet = AliDAQ::OfflineModuleName(AliDAQ::kNDetectors-1);
4001 if ((detList.CompareTo("ALL") == 0) ||
4002 ((detList.BeginsWith("ALL ") ||
4003 detList.EndsWith(" ALL") ||
4004 detList.Contains(" ALL ")) &&
4005 !(detList.BeginsWith("-"+hltDet+" ") ||
4006 detList.EndsWith(" -"+hltDet) ||
4007 detList.Contains(" -"+hltDet+" "))) ||
4008 (detList.CompareTo(hltDet) == 0) ||
4009 detList.BeginsWith(hltDet+" ") ||
4010 detList.EndsWith(" "+hltDet) ||
4011 detList.Contains( " "+hltDet+" " )) {
4012 resultList += hltDet;
4016 return resultList.Data();
4020 //______________________________________________________________________________
4021 void AliReconstruction::Abort(const char *method, EAbort what)
4023 // Abort processing. If what = kAbortProcess, the Process() loop will be
4024 // aborted. If what = kAbortFile, the current file in a chain will be
4025 // aborted and the processing will continue with the next file, if there
4026 // is no next file then Process() will be aborted. Abort() can also be
4027 // called from Begin(), SlaveBegin(), Init() and Notify(). After abort
4028 // the SlaveTerminate() and Terminate() are always called. The abort flag
4029 // can be checked in these methods using GetAbort().
4031 // The method is overwritten in AliReconstruction for better handling of
4032 // reco specific errors
4034 if (!fStopOnError) return;
4038 TString whyMess = method;
4039 whyMess += " failed! Aborting...";
4041 AliError(whyMess.Data());
4044 TString mess = "Abort";
4045 if (fAbort == kAbortProcess)
4046 mess = "AbortProcess";
4047 else if (fAbort == kAbortFile)
4050 Info(mess, whyMess.Data());
4053 //______________________________________________________________________________
4054 Bool_t AliReconstruction::ProcessEvent(void* event)
4056 // Method that is used in case the event loop
4057 // is steered from outside, for example by AMORE
4058 // 'event' is a pointer to the DATE event in the memory
4060 if (fRawReader) delete fRawReader;
4061 fRawReader = new AliRawReaderDate(event);
4062 fStatus = ProcessEvent(fRunLoader->GetNumberOfEvents());
4069 //______________________________________________________________________________
4070 Bool_t AliReconstruction::ParseOutput()
4072 // The method parses the output file
4073 // location string in order to steer
4074 // properly the selector
4076 TPMERegexp re1("(\\w+\\.zip#\\w+\\.root):([,*\\w+\\.root,*]+)@dataset://(\\w++)");
4077 TPMERegexp re2("(\\w+\\.root)?@?dataset://(\\w++)");
4079 if (re1.Match(fESDOutput) == 4) {
4080 // root archive with output files stored and regustered
4082 gProof->AddInput(new TNamed("PROOF_OUTPUTFILE",re1[1].Data()));
4083 gProof->AddInput(new TNamed("PROOF_OUTPUTFILE_LOCATION",re1[3].Data()));
4084 gProof->AddInput(new TNamed("PROOF_OUTPUTFILE_DATASET",""));
4085 gProof->AddInput(new TNamed("PROOF_OUTPUTFILE_ARCHIVE",re1[2].Data()));
4086 AliInfo(Form("%s files will be stored within %s in dataset %s",
4091 else if (re2.Match(fESDOutput) == 3) {
4092 // output file stored and registered
4094 gProof->AddInput(new TNamed("PROOF_OUTPUTFILE",(re2[1].IsNull()) ? "AliESDs.root" : re2[1].Data()));
4095 gProof->AddInput(new TNamed("PROOF_OUTPUTFILE_LOCATION",re2[2].Data()));
4096 gProof->AddInput(new TNamed("PROOF_OUTPUTFILE_DATASET",""));
4097 AliInfo(Form("%s will be stored in dataset %s",
4098 (re2[1].IsNull()) ? "AliESDs.root" : re2[1].Data(),
4102 if (fESDOutput.IsNull()) {
4103 // Output location not given.
4104 // Assuming xrootd has been already started and
4105 // the output file has to be sent back
4106 // to the client machine
4107 TString esdUrl(Form("root://%s/%s/",
4108 TUrl(gSystem->HostName()).GetHostFQDN(),
4110 gProof->AddInput(new TNamed("PROOF_OUTPUTFILE","AliESDs.root"));
4111 gProof->AddInput(new TNamed("PROOF_OUTPUTFILE_LOCATION",esdUrl.Data()));
4112 AliInfo(Form("AliESDs.root will be stored in %s",
4116 // User specified an output location.
4117 // Ones has just to parse it here
4118 TUrl outputUrl(fESDOutput.Data());
4119 TString outputFile(gSystem->BaseName(outputUrl.GetFile()));
4120 gProof->AddInput(new TNamed("PROOF_OUTPUTFILE",outputFile.IsNull() ? "AliESDs.root" : outputFile.Data()));
4121 TString outputLocation(outputUrl.GetUrl());
4122 outputLocation.ReplaceAll(outputFile.Data(),"");
4123 gProof->AddInput(new TNamed("PROOF_OUTPUTFILE_LOCATION",outputLocation.Data()));
4124 AliInfo(Form("%s will be stored in %s",
4125 outputFile.IsNull() ? "AliESDs.root" : outputFile.Data(),
4126 outputLocation.Data()));
4133 //______________________________________________________________________________
4134 Bool_t AliReconstruction::IsHighPt() const {
4135 // Selection of events containing "high" pT tracks
4136 // If at least one track is found within 1.5 and 100 GeV (pT)
4137 // that was reconstructed by both ITS and TPC, the event is accepted
4140 const Double_t pTmin = 1.5;
4141 const Double_t pTmax = 100;
4143 mask |= (AliESDtrack::kITSrefit);
4144 mask |= (AliESDtrack::kTPCrefit);
4145 const Double_t pTminCosmic = 5.;
4146 const Double_t pTmaxCosmic = 100;
4147 ULong_t maskCosmic = 0;
4148 Int_t cosmicCount=0;
4149 maskCosmic |= (AliESDtrack::kTPCrefit);
4151 Bool_t isOK = kFALSE;
4153 if (fesd && fesd->GetEventType()==AliRawEventHeaderBase::kPhysicsEvent) {
4154 // Check if this ia a physics event (code 7)
4155 Int_t ntrk = fesd->GetNumberOfTracks();
4156 for (Int_t itrk=0; itrk<ntrk; ++itrk) {
4158 AliESDtrack * trk = fesd->GetTrack(itrk);
4160 && trk->Pt() > pTmin
4161 && trk->Pt() < pTmax
4162 && (trk->GetStatus() & mask) == mask ) {
4168 && trk->GetInnerParam()
4169 && trk->GetInnerParam()->Pt() > pTminCosmic
4170 && trk->GetInnerParam()->Pt() < pTmaxCosmic
4171 && (trk->GetStatus() & maskCosmic) == maskCosmic ) {
4177 if (cosmicCount>1) isOK=kTRUE;
4182 //______________________________________________________________________________
4183 Bool_t AliReconstruction::IsCosmicOrCalibSpecie() const {
4184 // Select cosmic or calibration events
4186 Bool_t isOK = kFALSE;
4188 if (fesd && fesd->GetEventType()==AliRawEventHeaderBase::kPhysicsEvent) {
4189 // Check if this ia a physics event (code 7)
4191 UInt_t specie = fesd->GetEventSpecie();
4192 if (specie==AliRecoParam::kCosmic || specie==AliRecoParam::kCalib) {
4199 //______________________________________________________________________________
4200 void AliReconstruction::WriteESDfriend() {
4201 // Fill the ESD friend in the tree. The required fraction of ESD friends is stored
4202 // in fFractionFriends. We select events where we store the ESD friends according
4203 // to the following algorithm:
4204 // 1. Store all Cosmic or Calibration events within the required fraction
4205 // 2. Sample "high Pt" events within the remaining fraction after step 1.
4206 // 3. Sample randomly events if we still have remaining slot
4209 Bool_t isSelected = kFALSE;
4211 // Store all friends for B field OFF
4212 if (TMath::Abs(AliTrackerBase::GetBz())<0.5) isSelected=kTRUE;
4214 if (IsCosmicOrCalibSpecie()) { // Selection of calib or cosmic events
4216 Double_t curentSpecieFraction = ((Double_t)(fNspecie+1))/((Double_t)(fNall+1));
4217 // "Bayesian" estimate supposing that without events all the events are of the required type
4219 Double_t rnd = gRandom->Rndm()*curentSpecieFraction;
4220 if (rnd<fFractionFriends) {
4226 Double_t remainingFraction = fFractionFriends;
4227 remainingFraction -= ((Double_t)(fSspecie)/(Double_t)(fNall));
4229 if (IsHighPt()) { // Selection of "high Pt" events
4231 Double_t curentHighPtFraction = ((Double_t)(fNhighPt+1))/((Double_t)(fNall+1));
4232 // "Bayesian" estimate supposing that without events all the events are of the required type
4235 Double_t rnd = gRandom->Rndm()*curentHighPtFraction;
4236 if (rnd<remainingFraction) {
4242 remainingFraction -= ((Double_t)(fShighPt)/(Double_t)(fNall));
4244 // Random selection to fill the remaining fraction (if any)
4246 Double_t rnd = gRandom->Rndm();
4247 if (rnd<remainingFraction) {
4253 fesdf->~AliESDfriend();
4254 new (fesdf) AliESDfriend(); // Reset...
4255 fesdf->SetSkipBit(kTRUE);