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 "AliCDBEntry.h"
137 #include "AliCDBManager.h"
138 #include "AliCDBStorage.h"
139 #include "AliCTPRawStream.h"
140 #include "AliCascadeVertexer.h"
141 #include "AliCentralTrigger.h"
142 #include "AliCodeTimer.h"
144 #include "AliDetectorRecoParam.h"
145 #include "AliESDCaloCells.h"
146 #include "AliESDCaloCluster.h"
147 #include "AliESDEvent.h"
148 #include "AliESDMuonTrack.h"
149 #include "AliESDPmdTrack.h"
150 #include "AliESDTagCreator.h"
151 #include "AliESDVertex.h"
152 #include "AliESDcascade.h"
153 #include "AliESDfriend.h"
154 #include "AliESDkink.h"
155 #include "AliESDpid.h"
156 #include "AliESDtrack.h"
157 #include "AliESDtrack.h"
158 #include "AliEventInfo.h"
159 #include "AliGRPObject.h"
160 #include "AliGRPRecoParam.h"
161 #include "AliGenEventHeader.h"
162 #include "AliGeomManager.h"
163 #include "AliGlobalQADataMaker.h"
164 #include "AliHeader.h"
167 #include "AliMultiplicity.h"
169 #include "AliPlaneEff.h"
171 #include "AliQADataMakerRec.h"
172 #include "AliQAManager.h"
173 #include "AliRawVEvent.h"
174 #include "AliRawEventHeaderBase.h"
175 #include "AliRawHLTManager.h"
176 #include "AliRawReaderDate.h"
177 #include "AliRawReaderFile.h"
178 #include "AliRawReaderRoot.h"
179 #include "AliReconstruction.h"
180 #include "AliReconstructor.h"
182 #include "AliRunInfo.h"
183 #include "AliRunLoader.h"
184 #include "AliSysInfo.h" // memory snapshots
185 #include "AliTrackPointArray.h"
186 #include "AliTracker.h"
187 #include "AliTriggerClass.h"
188 #include "AliTriggerCluster.h"
189 #include "AliTriggerIR.h"
190 #include "AliTriggerConfiguration.h"
191 #include "AliV0vertexer.h"
192 #include "AliVertexer.h"
193 #include "AliTrackleter.h"
194 #include "AliVertexerTracks.h"
195 #include "AliTriggerRunScalers.h"
196 #include "AliCTPTimeParams.h"
197 #include "AliESDHLTDecision.h"
198 #include "AliTriggerInput.h"
199 #include "AliLHCData.h"
200 ClassImp(AliReconstruction)
202 //_____________________________________________________________________________
203 const char* AliReconstruction::fgkDetectorName[AliReconstruction::kNDetectors] = {"ITS", "TPC", "TRD", "TOF", "PHOS", "HMPID", "EMCAL", "MUON", "FMD", "ZDC", "PMD", "T0", "VZERO", "ACORDE", "HLT"};
205 //_____________________________________________________________________________
206 AliReconstruction::AliReconstruction(const char* gAliceFilename) :
208 fRunVertexFinder(kTRUE),
209 fRunVertexFinderTracks(kTRUE),
210 fRunHLTTracking(kFALSE),
211 fRunMuonTracking(kFALSE),
213 fRunCascadeFinder(kTRUE),
214 fRunMultFinder(kTRUE),
216 fWriteAlignmentData(kFALSE),
217 fWriteESDfriend(kFALSE),
218 fFillTriggerESD(kTRUE),
226 fRunLocalReconstruction("ALL"),
230 fUseTrackingErrorsForAlignment(""),
231 fGAliceFileName(gAliceFilename),
234 fProofOutputFileName(""),
235 fProofOutputLocation(""),
236 fProofOutputDataset(kFALSE),
237 fProofOutputArchive(""),
241 fNumberOfEventsPerFile((UInt_t)-1),
242 fFractionFriends(0.04),
244 fLoadAlignFromCDB(kTRUE),
245 fLoadAlignData("ALL"),
250 fCTPTimeParams(NULL),
255 fParentRawReader(NULL),
259 fSPDTrackleter(NULL),
261 fDiamondProfileSPD(NULL),
262 fDiamondProfile(NULL),
263 fDiamondProfileTPC(NULL),
264 fListOfCosmicTriggers(NULL),
268 fAlignObjArray(NULL),
272 fInitCDBCalled(kFALSE),
273 fSetRunNumberFromDataCalled(kFALSE),
278 fSameQACycle(kFALSE),
279 fInitQACalled(kFALSE),
280 fWriteQAExpertData(kTRUE),
281 fRunPlaneEff(kFALSE),
292 fIsNewRunLoader(kFALSE),
302 // create reconstruction object with default parameters
305 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
306 fReconstructor[iDet] = NULL;
307 fUpgradeMask[iDet]=kFALSE;
308 fLoader[iDet] = NULL;
309 fTracker[iDet] = NULL;
311 for (Int_t iDet = 0; iDet < AliQAv1::kNDET; iDet++) {
312 fQACycles[iDet] = 999999 ;
313 fQAWriteExpert[iDet] = kFALSE ;
315 fBeamInt[0][0]=fBeamInt[0][1]=fBeamInt[1][0]=fBeamInt[1][1] = -1;
320 //_____________________________________________________________________________
321 AliReconstruction::AliReconstruction(const AliReconstruction& rec) :
323 fRunVertexFinder(rec.fRunVertexFinder),
324 fRunVertexFinderTracks(rec.fRunVertexFinderTracks),
325 fRunHLTTracking(rec.fRunHLTTracking),
326 fRunMuonTracking(rec.fRunMuonTracking),
327 fRunV0Finder(rec.fRunV0Finder),
328 fRunCascadeFinder(rec.fRunCascadeFinder),
329 fRunMultFinder(rec.fRunMultFinder),
330 fStopOnError(rec.fStopOnError),
331 fWriteAlignmentData(rec.fWriteAlignmentData),
332 fWriteESDfriend(rec.fWriteESDfriend),
333 fFillTriggerESD(rec.fFillTriggerESD),
335 fCleanESD(rec.fCleanESD),
336 fV0DCAmax(rec.fV0DCAmax),
337 fV0CsPmin(rec.fV0CsPmin),
341 fRunLocalReconstruction(rec.fRunLocalReconstruction),
342 fRunTracking(rec.fRunTracking),
343 fFillESD(rec.fFillESD),
344 fLoadCDB(rec.fLoadCDB),
345 fUseTrackingErrorsForAlignment(rec.fUseTrackingErrorsForAlignment),
346 fGAliceFileName(rec.fGAliceFileName),
347 fRawInput(rec.fRawInput),
348 fESDOutput(rec.fESDOutput),
349 fProofOutputFileName(rec.fProofOutputFileName),
350 fProofOutputLocation(rec.fProofOutputLocation),
351 fProofOutputDataset(rec.fProofOutputDataset),
352 fProofOutputArchive(rec.fProofOutputArchive),
353 fEquipIdMap(rec.fEquipIdMap),
354 fFirstEvent(rec.fFirstEvent),
355 fLastEvent(rec.fLastEvent),
356 fNumberOfEventsPerFile(rec.fNumberOfEventsPerFile),
357 fFractionFriends(rec.fFractionFriends),
359 fLoadAlignFromCDB(rec.fLoadAlignFromCDB),
360 fLoadAlignData(rec.fLoadAlignData),
361 fUseHLTData(rec.fUseHLTData),
365 fCTPTimeParams(NULL),
370 fParentRawReader(NULL),
372 fRecoParam(rec.fRecoParam),
374 fSPDTrackleter(NULL),
376 fDiamondProfileSPD(rec.fDiamondProfileSPD),
377 fDiamondProfile(rec.fDiamondProfile),
378 fDiamondProfileTPC(rec.fDiamondProfileTPC),
379 fListOfCosmicTriggers(NULL),
383 fAlignObjArray(rec.fAlignObjArray),
384 fCDBUri(rec.fCDBUri),
385 fQARefUri(rec.fQARefUri),
387 fInitCDBCalled(rec.fInitCDBCalled),
388 fSetRunNumberFromDataCalled(rec.fSetRunNumberFromDataCalled),
389 fQADetectors(rec.fQADetectors),
390 fQATasks(rec.fQATasks),
392 fRunGlobalQA(rec.fRunGlobalQA),
393 fSameQACycle(rec.fSameQACycle),
394 fInitQACalled(rec.fInitQACalled),
395 fWriteQAExpertData(rec.fWriteQAExpertData),
396 fRunPlaneEff(rec.fRunPlaneEff),
407 fIsNewRunLoader(rec.fIsNewRunLoader),
419 for (Int_t i = 0; i < rec.fOptions.GetEntriesFast(); i++) {
420 if (rec.fOptions[i]) fOptions.Add(rec.fOptions[i]->Clone());
422 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
423 fReconstructor[iDet] = NULL;
424 fUpgradeMask[iDet] = kFALSE;
425 fLoader[iDet] = NULL;
426 fTracker[iDet] = NULL;
429 for (Int_t iDet = 0; iDet < AliQAv1::kNDET; iDet++) {
430 fQACycles[iDet] = rec.fQACycles[iDet];
431 fQAWriteExpert[iDet] = rec.fQAWriteExpert[iDet] ;
434 for (Int_t i = 0; i < rec.fSpecCDBUri.GetEntriesFast(); i++) {
435 if (rec.fSpecCDBUri[i]) fSpecCDBUri.Add(rec.fSpecCDBUri[i]->Clone());
438 for (int i=2;i--;) for (int j=2;j--;) fBeamInt[i][j] = rec.fBeamInt[i][j];
442 //_____________________________________________________________________________
443 AliReconstruction& AliReconstruction::operator = (const AliReconstruction& rec)
445 // assignment operator
446 // Used in PROOF mode
447 // Be very careful while modifing it!
448 // Simple rules to follow:
449 // for persistent data members - use their assignment operators
450 // for non-persistent ones - do nothing or take the default values from constructor
451 // TSelector members should not be touched
452 if(&rec == this) return *this;
454 fRunVertexFinder = rec.fRunVertexFinder;
455 fRunVertexFinderTracks = rec.fRunVertexFinderTracks;
456 fRunHLTTracking = rec.fRunHLTTracking;
457 fRunMuonTracking = rec.fRunMuonTracking;
458 fRunV0Finder = rec.fRunV0Finder;
459 fRunCascadeFinder = rec.fRunCascadeFinder;
460 fRunMultFinder = rec.fRunMultFinder;
461 fStopOnError = rec.fStopOnError;
462 fWriteAlignmentData = rec.fWriteAlignmentData;
463 fWriteESDfriend = rec.fWriteESDfriend;
464 fFillTriggerESD = rec.fFillTriggerESD;
466 fCleanESD = rec.fCleanESD;
467 fV0DCAmax = rec.fV0DCAmax;
468 fV0CsPmin = rec.fV0CsPmin;
472 fRunLocalReconstruction = rec.fRunLocalReconstruction;
473 fRunTracking = rec.fRunTracking;
474 fFillESD = rec.fFillESD;
475 fLoadCDB = rec.fLoadCDB;
476 fUseTrackingErrorsForAlignment = rec.fUseTrackingErrorsForAlignment;
477 fGAliceFileName = rec.fGAliceFileName;
478 fRawInput = rec.fRawInput;
479 fESDOutput = rec.fESDOutput;
480 fProofOutputFileName = rec.fProofOutputFileName;
481 fProofOutputLocation = rec.fProofOutputLocation;
482 fProofOutputDataset = rec.fProofOutputDataset;
483 fProofOutputArchive = rec.fProofOutputArchive;
484 fEquipIdMap = rec.fEquipIdMap;
485 fFirstEvent = rec.fFirstEvent;
486 fLastEvent = rec.fLastEvent;
487 fNumberOfEventsPerFile = rec.fNumberOfEventsPerFile;
488 fFractionFriends = rec.fFractionFriends;
490 for (Int_t i = 0; i < rec.fOptions.GetEntriesFast(); i++) {
491 if (rec.fOptions[i]) fOptions.Add(rec.fOptions[i]->Clone());
494 fLoadAlignFromCDB = rec.fLoadAlignFromCDB;
495 fLoadAlignData = rec.fLoadAlignData;
496 fUseHLTData = rec.fUseHLTData;
498 delete fRunInfo; fRunInfo = NULL;
499 if (rec.fRunInfo) fRunInfo = new AliRunInfo(*rec.fRunInfo);
501 fEventInfo = rec.fEventInfo;
503 delete fRunScalers; fRunScalers = NULL;
504 if (rec.fRunScalers) fRunScalers = new AliTriggerRunScalers(*rec.fRunScalers);
506 delete fCTPTimeParams; fCTPTimeParams = NULL;
507 if (rec.fCTPTimeParams) fCTPTimeParams = new AliCTPTimeParams(*rec.fCTPTimeParams);
508 delete fCTPTimeAlign; fCTPTimeAlign = NULL;
509 if (rec.fCTPTimeAlign) fCTPTimeAlign = new AliCTPTimeParams(*rec.fCTPTimeAlign);
513 fParentRawReader = NULL;
515 fRecoParam = rec.fRecoParam;
517 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
518 fUpgradeMask[iDet] = kFALSE;
519 delete fReconstructor[iDet]; fReconstructor[iDet] = NULL;
520 delete fLoader[iDet]; fLoader[iDet] = NULL;
521 delete fTracker[iDet]; fTracker[iDet] = NULL;
524 for (Int_t iDet = 0; iDet < AliQAv1::kNDET; iDet++) {
525 fQACycles[iDet] = rec.fQACycles[iDet];
526 fQAWriteExpert[iDet] = rec.fQAWriteExpert[iDet] ;
529 delete fSPDTrackleter; fSPDTrackleter = NULL;
531 delete fDiamondProfileSPD; fDiamondProfileSPD = NULL;
532 if (rec.fDiamondProfileSPD) fDiamondProfileSPD = new AliESDVertex(*rec.fDiamondProfileSPD);
533 delete fDiamondProfile; fDiamondProfile = NULL;
534 if (rec.fDiamondProfile) fDiamondProfile = new AliESDVertex(*rec.fDiamondProfile);
535 delete fDiamondProfileTPC; fDiamondProfileTPC = NULL;
536 if (rec.fDiamondProfileTPC) fDiamondProfileTPC = new AliESDVertex(*rec.fDiamondProfileTPC);
538 delete fListOfCosmicTriggers; fListOfCosmicTriggers = NULL;
539 if (rec.fListOfCosmicTriggers) fListOfCosmicTriggers = (THashTable*)((rec.fListOfCosmicTriggers)->Clone());
541 delete fGRPData; fGRPData = NULL;
542 // if (rec.fGRPData) fGRPData = (TMap*)((rec.fGRPData)->Clone());
543 if (rec.fGRPData) fGRPData = (AliGRPObject*)((rec.fGRPData)->Clone());
545 delete fAlignObjArray; fAlignObjArray = NULL;
548 fQARefUri = rec.fQARefUri;
549 fSpecCDBUri.Delete();
550 fInitCDBCalled = rec.fInitCDBCalled;
551 fSetRunNumberFromDataCalled = rec.fSetRunNumberFromDataCalled;
552 fQADetectors = rec.fQADetectors;
553 fQATasks = rec.fQATasks;
555 fRunGlobalQA = rec.fRunGlobalQA;
556 fSameQACycle = rec.fSameQACycle;
557 fInitQACalled = rec.fInitQACalled;
558 fWriteQAExpertData = rec.fWriteQAExpertData;
559 fRunPlaneEff = rec.fRunPlaneEff;
560 for (int i=2;i--;) for (int j=2;j--;) fBeamInt[i][j] = rec.fBeamInt[i][j];
570 fIsNewRunLoader = rec.fIsNewRunLoader;
583 //_____________________________________________________________________________
584 AliReconstruction::~AliReconstruction()
589 if (fListOfCosmicTriggers) {
590 fListOfCosmicTriggers->Delete();
591 delete fListOfCosmicTriggers;
595 delete fCTPTimeParams;
596 delete fCTPTimeAlign;
598 if (fAlignObjArray) {
599 fAlignObjArray->Delete();
600 delete fAlignObjArray;
602 fSpecCDBUri.Delete();
604 AliCodeTimer::Instance()->Print();
607 //_____________________________________________________________________________
608 void AliReconstruction::InitQA()
610 //Initialize the QA and start of cycle
611 AliCodeTimerAuto("",0);
613 if (fInitQACalled) return;
614 fInitQACalled = kTRUE;
616 if (fGRPData) AliQADataMaker::SetCloningRequest( fGRPData->GetQATrigClasses(), fGRPData->GetQACloningRequest());
619 AliQAManager * qam = AliQAManager::QAManager(AliQAv1::kRECMODE) ;
620 if (fWriteQAExpertData)
621 qam->SetWriteExpert() ;
623 if (qam->IsDefaultStorageSet()) {
624 AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
625 AliWarning("Default QA reference storage has been already set !");
626 AliWarning(Form("Ignoring the default storage declared in AliReconstruction: %s",fQARefUri.Data()));
627 AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
628 fQARefUri = qam->GetDefaultStorage()->GetURI();
630 if (fQARefUri.Length() > 0) {
631 AliDebug(2,"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
632 AliDebug(2, Form("Default QA reference storage is set to: %s", fQARefUri.Data()));
633 AliDebug(2, "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
635 fQARefUri="local://$ALICE_ROOT/QAref";
636 AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
637 AliWarning("Default QA refeference storage not yet set !!!!");
638 AliWarning(Form("Setting it now to: %s", fQARefUri.Data()));
639 AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
642 qam->SetDefaultStorage(fQARefUri);
646 qam->SetActiveDetectors(fQADetectors) ;
647 for (Int_t det = 0 ; det < AliQAv1::kNDET ; det++) {
648 qam->SetCycleLength(AliQAv1::DETECTORINDEX_t(det), fQACycles[det]) ;
649 qam->SetWriteExpert(AliQAv1::DETECTORINDEX_t(det)) ;
651 if (!fRawReader && !fInput && IsInTasks(AliQAv1::kRAWS))
652 fQATasks.ReplaceAll(Form("%d",AliQAv1::kRAWS), "") ;
653 qam->SetTasks(fQATasks) ;
654 qam->InitQADataMaker(AliCDBManager::Instance()->GetRun()) ;
657 Bool_t sameCycle = kFALSE ;
658 AliQADataMaker *qadm = qam->GetQADataMaker(AliQAv1::kGLOBAL);
659 AliInfo(Form("Initializing the global QA data maker"));
660 if (IsInTasks(AliQAv1::kRECPOINTS)) {
661 qadm->StartOfCycle(AliQAv1::kRECPOINTS, AliCDBManager::Instance()->GetRun(), sameCycle) ;
662 TObjArray **arr=qadm->Init(AliQAv1::kRECPOINTS);
663 AliTracker::SetResidualsArray(arr);
666 if (IsInTasks(AliQAv1::kESDS)) {
667 qadm->StartOfCycle(AliQAv1::kESDS, AliCDBManager::Instance()->GetRun(), sameCycle) ;
668 qadm->Init(AliQAv1::kESDS);
671 AliSysInfo::AddStamp("InitQA") ;
674 //_____________________________________________________________________________
675 void AliReconstruction::MergeQA(const char *fileName)
677 //Initialize the QA and start of cycle
678 AliCodeTimerAuto("",0) ;
679 AliQAManager::QAManager()->Merge(AliCDBManager::Instance()->GetRun(),fileName) ;
680 AliSysInfo::AddStamp("MergeQA") ;
683 //_____________________________________________________________________________
684 void AliReconstruction::InitCDB()
686 // activate a default CDB storage
687 // First check if we have any CDB storage set, because it is used
688 // to retrieve the calibration and alignment constants
689 AliCodeTimerAuto("",0);
691 if (fInitCDBCalled) return;
692 fInitCDBCalled = kTRUE;
694 AliCDBManager* man = AliCDBManager::Instance();
695 if (man->IsDefaultStorageSet())
697 AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
698 AliWarning("Default CDB storage has been already set !");
699 AliWarning(Form("Ignoring the default storage declared in AliReconstruction: %s",fCDBUri.Data()));
700 AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
701 fCDBUri = man->GetDefaultStorage()->GetURI();
704 if (fCDBUri.Length() > 0)
706 AliDebug(2,"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
707 AliDebug(2, Form("Default CDB storage is set to: %s", fCDBUri.Data()));
708 AliDebug(2, "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
709 man->SetDefaultStorage(fCDBUri);
711 else if (!man->GetRaw()){
712 fCDBUri="local://$ALICE_ROOT/OCDB";
713 AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
714 AliWarning("Default CDB storage not yet set !!!!");
715 AliWarning(Form("Setting it now to: %s", fCDBUri.Data()));
716 AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
717 man->SetDefaultStorage(fCDBUri);
720 AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
721 AliWarning("Default storage will be set after setting the Run Number!!!");
722 AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
726 // Now activate the detector specific CDB storage locations
727 for (Int_t i = 0; i < fSpecCDBUri.GetEntriesFast(); i++) {
728 TObject* obj = fSpecCDBUri[i];
730 AliDebug(2, "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
731 AliDebug(2, Form("Specific CDB storage for %s is set to: %s",obj->GetName(),obj->GetTitle()));
732 AliDebug(2, "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
733 man->SetSpecificStorage(obj->GetName(), obj->GetTitle());
735 AliSysInfo::AddStamp("InitCDB");
738 //_____________________________________________________________________________
739 void AliReconstruction::SetDefaultStorage(const char* uri) {
740 // Store the desired default CDB storage location
741 // Activate it later within the Run() method
747 //_____________________________________________________________________________
748 void AliReconstruction::SetQARefDefaultStorage(const char* uri) {
749 // Store the desired default CDB storage location
750 // Activate it later within the Run() method
753 AliQAv1::SetQARefStorage(fQARefUri.Data()) ;
756 //_____________________________________________________________________________
757 void AliReconstruction::SetSpecificStorage(const char* calibType, const char* uri) {
758 // Store a detector-specific CDB storage location
759 // Activate it later within the Run() method
761 AliCDBPath aPath(calibType);
762 if(!aPath.IsValid()){
763 // if calibType is not wildcard but it is a valid detector, add "/*" to make it a valid path
764 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
765 if(!strcmp(calibType, fgkDetectorName[iDet])) {
766 aPath.SetPath(Form("%s/*", calibType));
767 AliInfo(Form("Path for specific storage set to %s", aPath.GetPath().Data()));
771 if(!aPath.IsValid()){
772 AliError(Form("Not a valid path or detector: %s", calibType));
777 // // check that calibType refers to a "valid" detector name
778 // Bool_t isDetector = kFALSE;
779 // for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
780 // TString detName = fgkDetectorName[iDet];
781 // if(aPath.GetLevel0() == detName) {
782 // isDetector = kTRUE;
788 // AliError(Form("Not a valid detector: %s", aPath.GetLevel0().Data()));
792 TObject* obj = fSpecCDBUri.FindObject(aPath.GetPath().Data());
793 if (obj) fSpecCDBUri.Remove(obj);
794 fSpecCDBUri.Add(new TNamed(aPath.GetPath().Data(), uri));
798 //_____________________________________________________________________________
799 Bool_t AliReconstruction::SetRunNumberFromData()
801 // The method is called in Run() in order
802 // to set a correct run number.
803 // In case of raw data reconstruction the
804 // run number is taken from the raw data header
806 if (fSetRunNumberFromDataCalled) return kTRUE;
807 fSetRunNumberFromDataCalled = kTRUE;
809 AliCDBManager* man = AliCDBManager::Instance();
812 if(fRawReader->NextEvent()) {
813 if(man->GetRun() > 0) {
814 AliWarning("Run number is taken from raw-event header! Ignoring settings in AliCDBManager!");
816 man->SetRun(fRawReader->GetRunNumber());
817 fRawReader->RewindEvents();
820 if(man->GetRun() > 0) {
821 AliWarning("No raw-data events are found ! Using settings in AliCDBManager !");
824 AliWarning("Neither raw events nor settings in AliCDBManager are found !");
830 AliRunLoader *rl = AliRunLoader::Open(fGAliceFileName.Data());
832 AliError(Form("No run loader found in file %s", fGAliceFileName.Data()));
837 // read run number from gAlice
838 if(rl->GetHeader()) {
839 man->SetRun(rl->GetHeader()->GetRun());
844 AliError("Neither run-loader header nor RawReader objects are found !");
856 //_____________________________________________________________________________
857 void AliReconstruction::SetCDBLock() {
858 // Set CDB lock: from now on it is forbidden to reset the run number
859 // or the default storage or to activate any further storage!
861 AliCDBManager::Instance()->SetLock(1);
864 //_____________________________________________________________________________
865 void AliReconstruction::MatchUpgradeDetector() {
866 // Translates detector name in a boolean.
867 // The boolean is used in GetReconstructor to load the
868 // upgrade reconstructor instead of the standard one.
869 for(Int_t iDet = 0; iDet < kNDetectors; iDet++) {
870 if(fUpgradeModule.Contains(fgkDetectorName[iDet])) fUpgradeMask[iDet]=kTRUE;
873 //_____________________________________________________________________________
874 Bool_t AliReconstruction::MisalignGeometry(const TString& detectors)
876 // Read the alignment objects from CDB.
877 // Each detector is supposed to have the
878 // alignment objects in DET/Align/Data CDB path.
879 // All the detector objects are then collected,
880 // sorted by geometry level (starting from ALIC) and
881 // then applied to the TGeo geometry.
882 // Finally an overlaps check is performed.
884 // Load alignment data from CDB and fill fAlignObjArray
885 if(fLoadAlignFromCDB){
887 TString detStr = detectors;
888 TString loadAlObjsListOfDets = "";
890 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
891 if(!IsSelected(fgkDetectorName[iDet], detStr)) continue;
892 if(!strcmp(fgkDetectorName[iDet],"HLT")) continue;
894 if(AliGeomManager::GetNalignable(fgkDetectorName[iDet]) != 0)
896 loadAlObjsListOfDets += fgkDetectorName[iDet];
897 loadAlObjsListOfDets += " ";
899 } // end loop over detectors
901 if(AliGeomManager::GetNalignable("GRP") != 0)
902 loadAlObjsListOfDets.Prepend("GRP "); //add alignment objects for non-sensitive modules
903 AliGeomManager::ApplyAlignObjsFromCDB(loadAlObjsListOfDets.Data());
904 AliCDBManager::Instance()->UnloadFromCache("*/Align/*");
906 // Check if the array with alignment objects was
907 // provided by the user. If yes, apply the objects
908 // to the present TGeo geometry
909 if (fAlignObjArray) {
910 if (gGeoManager && gGeoManager->IsClosed()) {
911 if (AliGeomManager::ApplyAlignObjsToGeom(*fAlignObjArray) == kFALSE) {
912 AliError("The misalignment of one or more volumes failed!"
913 "Compare the list of simulated detectors and the list of detector alignment data!");
918 AliError("Can't apply the misalignment! gGeoManager doesn't exist or it is still opened!");
924 if (fAlignObjArray) {
925 fAlignObjArray->Delete();
926 delete fAlignObjArray; fAlignObjArray=NULL;
932 //_____________________________________________________________________________
933 void AliReconstruction::SetGAliceFile(const char* fileName)
935 // set the name of the galice file
937 fGAliceFileName = fileName;
940 //_____________________________________________________________________________
941 void AliReconstruction::SetInput(const char* input)
943 // In case the input string starts with 'mem://', we run in an online mode
944 // and AliRawReaderDateOnline object is created. In all other cases a raw-data
945 // file is assumed. One can give as an input:
946 // mem://: - events taken from DAQ monitoring libs online
948 // mem://<filename> - emulation of the above mode (via DATE monitoring libs)
949 if (input) fRawInput = input;
952 //_____________________________________________________________________________
953 void AliReconstruction::SetOutput(const char* output)
955 // Set the output ESD filename
956 // 'output' is a normalt ROOT url
957 // The method is used in case of raw-data reco with PROOF
958 if (output) fESDOutput = output;
961 //_____________________________________________________________________________
962 void AliReconstruction::SetOption(const char* detector, const char* option)
964 // set options for the reconstruction of a detector
966 TObject* obj = fOptions.FindObject(detector);
967 if (obj) fOptions.Remove(obj);
968 fOptions.Add(new TNamed(detector, option));
971 //_____________________________________________________________________________
972 void AliReconstruction::SetRecoParam(const char* detector, AliDetectorRecoParam *par)
974 // Set custom reconstruction parameters for a given detector
975 // Single set of parameters for all the events
977 // First check if the reco-params are global
978 if(!strcmp(detector, "GRP")) {
980 fRecoParam.AddDetRecoParam(kNDetectors,par);
984 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
985 if(!strcmp(detector, fgkDetectorName[iDet])) {
987 fRecoParam.AddDetRecoParam(iDet,par);
994 //_____________________________________________________________________________
995 Bool_t AliReconstruction::InitGRP() {
996 //------------------------------------
997 // Initialization of the GRP entry
998 //------------------------------------
999 AliCDBEntry* entry = AliCDBManager::Instance()->Get("GRP/GRP/Data");
1003 TMap* m = dynamic_cast<TMap*>(entry->GetObject()); // old GRP entry
1006 AliInfo("Found a TMap in GRP/GRP/Data, converting it into an AliGRPObject");
1008 fGRPData = new AliGRPObject();
1009 fGRPData->ReadValuesFromMap(m);
1013 AliInfo("Found an AliGRPObject in GRP/GRP/Data, reading it");
1014 fGRPData = dynamic_cast<AliGRPObject*>(entry->GetObject()); // new GRP entry
1018 // FIX ME: The unloading of GRP entry is temporarily disabled
1019 // because ZDC and VZERO are using it in order to initialize
1020 // their reconstructor objects. In the future one has to think
1021 // of propagating AliRunInfo to the reconstructors.
1022 // AliCDBManager::Instance()->UnloadFromCache("GRP/GRP/Data");
1026 AliError("No GRP entry found in OCDB!");
1030 TString lhcState = fGRPData->GetLHCState();
1031 if (lhcState==AliGRPObject::GetInvalidString()) {
1032 AliError("GRP/GRP/Data entry: missing value for the LHC state ! Using UNKNOWN");
1033 lhcState = "UNKNOWN";
1036 TString beamType = fGRPData->GetBeamType();
1037 if (beamType==AliGRPObject::GetInvalidString()) {
1038 AliError("GRP/GRP/Data entry: missing value for the beam type ! Using UNKNOWN");
1039 beamType = "UNKNOWN";
1042 Float_t beamEnergy = fGRPData->GetBeamEnergy();
1043 if (beamEnergy==AliGRPObject::GetInvalidFloat()) {
1044 AliError("GRP/GRP/Data entry: missing value for the beam energy ! Using 0");
1048 TString runType = fGRPData->GetRunType();
1049 if (runType==AliGRPObject::GetInvalidString()) {
1050 AliError("GRP/GRP/Data entry: missing value for the run type ! Using UNKNOWN");
1051 runType = "UNKNOWN";
1054 Int_t activeDetectors = fGRPData->GetDetectorMask();
1055 if (activeDetectors==AliGRPObject::GetInvalidUInt()) {
1056 AliError("GRP/GRP/Data entry: missing value for the detector mask ! Using 1074790399");
1057 activeDetectors = 1074790399;
1060 fRunInfo = new AliRunInfo(lhcState, beamType, beamEnergy, runType, activeDetectors);
1064 // Process the list of active detectors
1065 if (activeDetectors) {
1066 UInt_t detMask = activeDetectors;
1067 fRunLocalReconstruction = MatchDetectorList(fRunLocalReconstruction,detMask);
1068 fRunTracking = MatchDetectorList(fRunTracking,detMask);
1069 fFillESD = MatchDetectorList(fFillESD,detMask);
1070 fQADetectors = MatchDetectorList(fQADetectors,detMask);
1071 fLoadCDB.Form("%s %s %s %s",
1072 fRunLocalReconstruction.Data(),
1073 fRunTracking.Data(),
1075 fQADetectors.Data());
1076 fLoadCDB = MatchDetectorList(fLoadCDB,detMask);
1077 if (!((detMask >> AliDAQ::DetectorID("ITSSPD")) & 0x1) &&
1078 !((detMask >> AliDAQ::DetectorID("ITSSDD")) & 0x1) &&
1079 !((detMask >> AliDAQ::DetectorID("ITSSSD")) & 0x1) ) {
1080 // switch off the vertexer
1081 AliInfo("SPD,SDD,SSD is not in the list of active detectors. Vertexer and Trackleter are switched off.");
1082 fRunVertexFinder = kFALSE;
1083 fRunMultFinder = kFALSE;
1085 if (!((detMask >> AliDAQ::DetectorID("TRG")) & 0x1)) {
1086 // switch off the reading of CTP raw-data payload
1087 if (fFillTriggerESD) {
1088 AliInfo("CTP is not in the list of active detectors. CTP data reading switched off.");
1089 fFillTriggerESD = kFALSE;
1094 AliInfo("===================================================================================");
1095 AliInfo(Form("Running local reconstruction for detectors: %s",fRunLocalReconstruction.Data()));
1096 AliInfo(Form("Running tracking for detectors: %s",fRunTracking.Data()));
1097 AliInfo(Form("Filling ESD for detectors: %s",fFillESD.Data()));
1098 AliInfo(Form("Quality assurance is active for detectors: %s",fQADetectors.Data()));
1099 AliInfo(Form("CDB and reconstruction parameters are loaded for detectors: %s",fLoadCDB.Data()));
1100 AliInfo("===================================================================================");
1102 //*** Dealing with the magnetic field map
1103 if ( TGeoGlobalMagField::Instance()->IsLocked() ) {
1104 if (TGeoGlobalMagField::Instance()->GetField()->TestBit(AliMagF::kOverrideGRP)) {
1105 AliInfo("ExpertMode!!! GRP information will be ignored !");
1106 AliInfo("ExpertMode!!! Running with the externally locked B field !");
1109 AliInfo("Destroying existing B field instance!");
1110 delete TGeoGlobalMagField::Instance();
1113 if ( !TGeoGlobalMagField::Instance()->IsLocked() ) {
1114 // Construct the field map out of the information retrieved from GRP.
1117 Float_t l3Current = fGRPData->GetL3Current((AliGRPObject::Stats)0);
1118 if (l3Current == AliGRPObject::GetInvalidFloat()) {
1119 AliError("GRP/GRP/Data entry: missing value for the L3 current !");
1123 Char_t l3Polarity = fGRPData->GetL3Polarity();
1124 if (l3Polarity == AliGRPObject::GetInvalidChar()) {
1125 AliError("GRP/GRP/Data entry: missing value for the L3 polarity !");
1130 Float_t diCurrent = fGRPData->GetDipoleCurrent((AliGRPObject::Stats)0);
1131 if (diCurrent == AliGRPObject::GetInvalidFloat()) {
1132 AliError("GRP/GRP/Data entry: missing value for the dipole current !");
1136 Char_t diPolarity = fGRPData->GetDipolePolarity();
1137 if (diPolarity == AliGRPObject::GetInvalidChar()) {
1138 AliError("GRP/GRP/Data entry: missing value for the dipole polarity !");
1142 // read special bits for the polarity convention and map type
1143 Int_t polConvention = fGRPData->IsPolarityConventionLHC() ? AliMagF::kConvLHC : AliMagF::kConvDCS2008;
1144 Bool_t uniformB = fGRPData->IsUniformBMap();
1147 AliMagF* fld = AliMagF::CreateFieldMap(TMath::Abs(l3Current) * (l3Polarity ? -1:1),
1148 TMath::Abs(diCurrent) * (diPolarity ? -1:1),
1149 polConvention,uniformB,beamEnergy, beamType.Data());
1151 TGeoGlobalMagField::Instance()->SetField( fld );
1152 TGeoGlobalMagField::Instance()->Lock();
1153 AliInfo("Running with the B field constructed out of GRP !");
1155 else AliFatal("Failed to create a B field map !");
1157 else AliFatal("B field is neither set nor constructed from GRP ! Exitig...");
1160 //*** Get the diamond profiles from OCDB
1161 entry = AliCDBManager::Instance()->Get("GRP/Calib/MeanVertexSPD");
1163 fDiamondProfileSPD = dynamic_cast<AliESDVertex*> (entry->GetObject());
1165 AliError("No SPD diamond profile found in OCDB!");
1168 entry = AliCDBManager::Instance()->Get("GRP/Calib/MeanVertex");
1170 fDiamondProfile = dynamic_cast<AliESDVertex*> (entry->GetObject());
1172 AliError("No diamond profile found in OCDB!");
1175 entry = AliCDBManager::Instance()->Get("GRP/Calib/MeanVertexTPC");
1177 fDiamondProfileTPC = dynamic_cast<AliESDVertex*> (entry->GetObject());
1179 AliError("No TPC diamond profile found in OCDB!");
1182 entry = AliCDBManager::Instance()->Get("GRP/Calib/CosmicTriggers");
1184 fListOfCosmicTriggers = dynamic_cast<THashTable*>(entry->GetObject());
1186 AliCDBManager::Instance()->UnloadFromCache("GRP/Calib/CosmicTriggers");
1189 if (!fListOfCosmicTriggers) {
1190 AliWarning("Can not get list of cosmic triggers from OCDB! Cosmic event specie will be effectively disabled!");
1196 //_____________________________________________________________________________
1197 Bool_t AliReconstruction::LoadCDB()
1199 // Load CDB entries for all active detectors.
1200 // By default we load all the entries in <det>/Calib
1203 AliCodeTimerAuto("",0);
1205 AliCDBManager::Instance()->Get("GRP/CTP/Config");
1207 AliCDBManager::Instance()->Get("GRP/Calib/LHCClockPhase");
1209 TString detStr = fLoadCDB;
1210 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
1211 if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
1212 AliCDBManager::Instance()->GetAll(Form("%s/Calib/*",fgkDetectorName[iDet]));
1215 // Temporary fix - one has to define the correct policy in order
1216 // to load the trigger OCDB entries only for the detectors that
1217 // in the trigger or that are needed in order to put correct
1218 // information in ESD
1219 AliCDBManager::Instance()->GetAll("TRIGGER/*/*");
1223 //_____________________________________________________________________________
1224 Bool_t AliReconstruction::LoadTriggerScalersCDB()
1226 // Load CTP scalers from OCDB.
1227 // The scalers are checked for consistency.
1229 AliCodeTimerAuto("",0);
1231 AliCDBEntry* entry = AliCDBManager::Instance()->Get("GRP/CTP/Scalers");
1235 AliInfo("Found an AliTriggerRunScalers in GRP/CTP/Scalers, reading it");
1236 fRunScalers = dynamic_cast<AliTriggerRunScalers*> (entry->GetObject());
1238 if (fRunScalers && (fRunScalers->CorrectScalersOverflow() == 0)) AliInfo("32bit Trigger counters corrected for overflow");
1243 //_____________________________________________________________________________
1244 Bool_t AliReconstruction::LoadCTPTimeParamsCDB()
1246 // Load CTP timing information (alignment)
1249 AliCDBEntry* entry = AliCDBManager::Instance()->Get("GRP/CTP/CTPtiming");
1250 if (!entry) return kFALSE;
1252 AliInfo("Found an AliCTPTimeParams in GRP/CTP/CTPtiming, reading it");
1253 fCTPTimeParams = dynamic_cast<AliCTPTimeParams*> (entry->GetObject());
1256 AliCDBEntry* entry2 = AliCDBManager::Instance()->Get("GRP/CTP/TimeAlign");
1257 if (!entry2) return kFALSE;
1259 AliInfo("Found an AliCTPTimeParams in GRP/CTP/TimeAlign, reading it");
1260 fCTPTimeAlign = dynamic_cast<AliCTPTimeParams*> (entry2->GetObject());
1261 entry2->SetOwner(0);
1266 //_____________________________________________________________________________
1267 Bool_t AliReconstruction::ReadIntensityInfoCDB()
1269 // Load LHC DIP data
1270 AliCDBEntry* entry = AliCDBManager::Instance()->Get("GRP/GRP/LHCData");
1273 AliInfo("Found an AliLHCData in GRP/GRP/LHCData, reading it");
1274 AliLHCData* dipData = dynamic_cast<AliLHCData*> (entry->GetObject());
1275 for (int ib=2;ib--;) {
1277 if (dipData && (dipData->GetMeanIntensity(ib,intI,intNI)>=0)) {
1278 fBeamInt[ib][0] = intI;
1279 fBeamInt[ib][1] = intNI;
1288 //_____________________________________________________________________________
1289 Bool_t AliReconstruction::Run(const char* input)
1292 AliCodeTimerAuto("",0);
1295 if (GetAbort() != TSelector::kContinue) return kFALSE;
1297 TChain *chain = NULL;
1298 if (fRawReader && (chain = fRawReader->GetChain())) {
1299 Long64_t nEntries = (fLastEvent < 0) ? (TChain::kBigNumber) : (fLastEvent - fFirstEvent + 1);
1302 // Temporary fix for long raw-data runs (until socket timeout handling in PROOF is revised)
1303 gProof->Exec("gEnv->SetValue(\"Proof.SocketActivityTimeout\",-1)", kTRUE);
1306 gProof->Exec("TGrid::Connect(\"alien://\")",kTRUE);
1308 TMessage::EnableSchemaEvolutionForAll(kTRUE);
1309 gProof->Exec("TMessage::EnableSchemaEvolutionForAll(kTRUE)",kTRUE);
1311 gProof->AddInput(this);
1313 if (!ParseOutput()) return kFALSE;
1315 gProof->SetParameter("PROOF_MaxSlavesPerNode", 9999);
1317 chain->Process("AliReconstruction","",nEntries,fFirstEvent);
1320 chain->Process(this,"",nEntries,fFirstEvent);
1325 if (GetAbort() != TSelector::kContinue) return kFALSE;
1327 if (GetAbort() != TSelector::kContinue) return kFALSE;
1328 //******* The loop over events
1329 AliInfo("Starting looping over events");
1331 while ((iEvent < fRunLoader->GetNumberOfEvents()) ||
1332 (fRawReader && fRawReader->NextEvent())) {
1333 if (!ProcessEvent(iEvent)) {
1334 Abort("ProcessEvent",TSelector::kAbortFile);
1340 if (GetAbort() != TSelector::kContinue) return kFALSE;
1342 if (GetAbort() != TSelector::kContinue) return kFALSE;
1348 //_____________________________________________________________________________
1349 void AliReconstruction::InitRawReader(const char* input)
1351 // Init raw-reader and
1352 // set the input in case of raw data
1354 AliCodeTimerAuto("",0);
1356 if (input) fRawInput = input;
1357 fRawReader = AliRawReader::Create(fRawInput.Data());
1359 if (fRawInput.IsNull()) {
1360 AliInfo("Reconstruction will run over digits");
1363 AliFatal("Can not create raw-data reader ! Exiting...");
1367 if (!fEquipIdMap.IsNull() && fRawReader)
1368 fRawReader->LoadEquipmentIdsMap(fEquipIdMap);
1370 if (!fUseHLTData.IsNull()) {
1371 // create the RawReaderHLT which performs redirection of HLT input data for
1372 // the specified detectors
1373 AliRawReader* pRawReader=AliRawHLTManager::CreateRawReaderHLT(fRawReader, fUseHLTData.Data());
1375 fParentRawReader=fRawReader;
1376 fRawReader=pRawReader;
1378 AliError(Form("can not create Raw Reader for HLT input %s", fUseHLTData.Data()));
1381 AliSysInfo::AddStamp("CreateRawReader");
1384 //_____________________________________________________________________________
1385 void AliReconstruction::InitRun(const char* input)
1387 // Initialization of raw-reader,
1388 // run number, CDB etc.
1389 AliCodeTimerAuto("",0);
1390 AliSysInfo::AddStamp("Start");
1392 // Initialize raw-reader if any
1393 InitRawReader(input);
1395 // Initialize the CDB storage
1398 // Set run number in CDBManager (if it is not already set by the user)
1399 if (!SetRunNumberFromData()) {
1400 Abort("SetRunNumberFromData", TSelector::kAbortProcess);
1404 // Set CDB lock: from now on it is forbidden to reset the run number
1405 // or the default storage or to activate any further storage!
1410 //_____________________________________________________________________________
1411 void AliReconstruction::Begin(TTree *)
1413 // Initialize AlReconstruction before
1414 // going into the event loop
1415 // Should follow the TSelector convention
1416 // i.e. initialize only the object on the client side
1417 AliCodeTimerAuto("",0);
1419 AliReconstruction *reco = NULL;
1421 if ((reco = (AliReconstruction*)fInput->FindObject("AliReconstruction"))) {
1424 AliSysInfo::AddStamp("ReadInputInBegin");
1427 // Import ideal TGeo geometry and apply misalignment
1429 TString geom(gSystem->DirName(fGAliceFileName));
1430 geom += "/geometry.root";
1431 AliGeomManager::LoadGeometry(geom.Data());
1433 Abort("LoadGeometry", TSelector::kAbortProcess);
1436 AliSysInfo::AddStamp("LoadGeom");
1437 TString detsToCheck=fRunLocalReconstruction;
1438 if(!AliGeomManager::CheckSymNamesLUT(detsToCheck.Data())) {
1439 Abort("CheckSymNamesLUT", TSelector::kAbortProcess);
1442 AliSysInfo::AddStamp("CheckGeom");
1445 if (!MisalignGeometry(fLoadAlignData)) {
1446 Abort("MisalignGeometry", TSelector::kAbortProcess);
1449 AliCDBManager::Instance()->UnloadFromCache("GRP/Geometry/Data");
1450 AliSysInfo::AddStamp("MisalignGeom");
1453 Abort("InitGRP", TSelector::kAbortProcess);
1456 AliSysInfo::AddStamp("InitGRP");
1459 Abort("LoadCDB", TSelector::kAbortProcess);
1462 AliSysInfo::AddStamp("LoadCDB");
1464 if (!LoadTriggerScalersCDB()) {
1465 Abort("LoadTriggerScalersCDB", TSelector::kAbortProcess);
1468 AliSysInfo::AddStamp("LoadTriggerScalersCDB");
1470 if (!LoadCTPTimeParamsCDB()) {
1471 Abort("LoadCTPTimeParamsCDB", TSelector::kAbortProcess);
1474 AliSysInfo::AddStamp("LoadCTPTimeParamsCDB");
1476 if (!ReadIntensityInfoCDB()) {
1477 Abort("ReadIntensityInfoCDB", TSelector::kAbortProcess);
1480 AliSysInfo::AddStamp("ReadIntensityInfoCDB");
1482 // Read the reconstruction parameters from OCDB
1483 if (!InitRecoParams()) {
1484 AliWarning("Not all detectors have correct RecoParam objects initialized");
1486 AliSysInfo::AddStamp("InitRecoParams");
1488 if (fInput && gProof) {
1489 if (reco) *reco = *this;
1491 gGeoManager->SetName("Geometry");
1492 gProof->AddInputData(gGeoManager,kTRUE);
1494 gProof->AddInputData(const_cast<TMap*>(AliCDBManager::Instance()->GetEntryCache()),kTRUE);
1495 fInput->Add(new TParameter<Int_t>("RunNumber",AliCDBManager::Instance()->GetRun()));
1496 AliMagF *magFieldMap = (AliMagF*)TGeoGlobalMagField::Instance()->GetField();
1497 magFieldMap->SetName("MagneticFieldMap");
1498 gProof->AddInputData(magFieldMap,kTRUE);
1503 //_____________________________________________________________________________
1504 void AliReconstruction::SlaveBegin(TTree*)
1506 // Initialization related to run-loader,
1507 // vertexer, trackers, recontructors
1508 // In proof mode it is executed on the slave
1509 AliCodeTimerAuto("",0);
1511 TProofOutputFile *outProofFile = NULL;
1513 if (AliDebugLevel() > 0) fInput->Print();
1514 if (AliDebugLevel() > 10) fInput->Dump();
1515 if (AliReconstruction *reco = (AliReconstruction*)fInput->FindObject("AliReconstruction")) {
1518 if (TGeoManager *tgeo = (TGeoManager*)fInput->FindObject("Geometry")) {
1520 AliGeomManager::SetGeometry(tgeo);
1522 if (TMap *entryCache = (TMap*)fInput->FindObject("CDBEntryCache")) {
1523 Int_t runNumber = -1;
1524 if (TProof::GetParameter(fInput,"RunNumber",runNumber) == 0) {
1525 AliCDBManager *man = AliCDBManager::Instance(entryCache,runNumber);
1526 man->SetCacheFlag(kTRUE);
1527 man->SetLock(kTRUE);
1531 if (AliMagF *map = (AliMagF*)fInput->FindObject("MagneticFieldMap")) {
1532 AliMagF *newMap = new AliMagF(*map);
1533 if (!newMap->LoadParameterization()) {
1534 Abort("AliMagF::LoadParameterization", TSelector::kAbortProcess);
1537 TGeoGlobalMagField::Instance()->SetField(newMap);
1538 TGeoGlobalMagField::Instance()->Lock();
1540 if (TNamed *outputFileName = (TNamed*)fInput->FindObject("PROOF_OUTPUTFILE"))
1541 fProofOutputFileName = outputFileName->GetTitle();
1542 if (TNamed *outputLocation = (TNamed*)fInput->FindObject("PROOF_OUTPUTFILE_LOCATION"))
1543 fProofOutputLocation = outputLocation->GetTitle();
1544 if (fInput->FindObject("PROOF_OUTPUTFILE_DATASET"))
1545 fProofOutputDataset = kTRUE;
1546 if (TNamed *archiveList = (TNamed*)fInput->FindObject("PROOF_OUTPUTFILE_ARCHIVE"))
1547 fProofOutputArchive = archiveList->GetTitle();
1548 if (!fProofOutputFileName.IsNull() &&
1549 !fProofOutputLocation.IsNull() &&
1550 fProofOutputArchive.IsNull()) {
1551 if (!fProofOutputDataset) {
1552 outProofFile = new TProofOutputFile(fProofOutputFileName.Data(),"M");
1553 outProofFile->SetOutputFileName(Form("%s%s",fProofOutputLocation.Data(),fProofOutputFileName.Data()));
1556 outProofFile = new TProofOutputFile(fProofOutputFileName.Data(),"DROV",fProofOutputLocation.Data());
1558 if (AliDebugLevel() > 0) outProofFile->Dump();
1559 fOutput->Add(outProofFile);
1561 AliSysInfo::AddStamp("ReadInputInSlaveBegin");
1564 // get the run loader
1565 if (!InitRunLoader()) {
1566 Abort("InitRunLoader", TSelector::kAbortProcess);
1569 AliSysInfo::AddStamp("LoadLoader");
1571 ftVertexer = new AliVertexerTracks(AliTracker::GetBz());
1574 if (!fRunTracking.IsNull() && !CreateTrackers(fRunTracking)) {
1575 Abort("CreateTrackers", TSelector::kAbortProcess);
1578 AliSysInfo::AddStamp("CreateTrackers");
1580 // create the ESD output file and tree
1581 if (!outProofFile) {
1582 ffile = TFile::Open("AliESDs.root", "RECREATE");
1583 ffile->SetCompressionLevel(2);
1584 if (!ffile->IsOpen()) {
1585 Abort("OpenESDFile", TSelector::kAbortProcess);
1590 AliInfo(Form("Opening output PROOF file: %s/%s",
1591 outProofFile->GetDir(), outProofFile->GetFileName()));
1592 if (!(ffile = outProofFile->OpenFile("RECREATE"))) {
1593 Abort(Form("Problems opening output PROOF file: %s/%s",
1594 outProofFile->GetDir(), outProofFile->GetFileName()),
1595 TSelector::kAbortProcess);
1600 ftree = new TTree("esdTree", "Tree with ESD objects");
1601 fesd = new AliESDEvent();
1602 fesd->CreateStdContent();
1603 // add a so far non-std object to the ESD, this will
1604 // become part of the std content
1605 fesd->AddObject(new AliESDHLTDecision);
1607 fesd->WriteToTree(ftree);
1608 if (fWriteESDfriend) {
1609 ffileF = TFile::Open("AliESDfriends.root", "RECREATE");
1610 ftreeF = new TTree("esdFriendTree", "Tree with ESD Friend objects");
1611 fesdf = new AliESDfriend();
1612 ftreeF->Branch("ESDfriend.","AliESDfriend", &fesdf);
1613 fesd->AddObject(fesdf);
1616 ftree->GetUserInfo()->Add(fesd);
1618 fhlttree = new TTree("HLTesdTree", "Tree with HLT ESD objects");
1619 fhltesd = new AliESDEvent();
1620 fhltesd->CreateStdContent();
1621 // read the ESD template from CDB
1622 // HLT is allowed to put non-std content to its ESD, the non-std
1623 // objects need to be created before invocation of WriteToTree in
1624 // order to create all branches. Initialization is done from an
1625 // ESD layout template in CDB
1626 AliCDBManager* man = AliCDBManager::Instance();
1627 AliCDBPath hltESDConfigPath("HLT/ConfigHLT/esdLayout");
1628 AliCDBEntry* hltESDConfig=NULL;
1629 if (man->GetId(hltESDConfigPath)!=NULL &&
1630 (hltESDConfig=man->Get(hltESDConfigPath))!=NULL) {
1631 AliESDEvent* pESDLayout=dynamic_cast<AliESDEvent*>(hltESDConfig->GetObject());
1633 // init all internal variables from the list of objects
1634 pESDLayout->GetStdContent();
1636 // copy content and create non-std objects
1637 *fhltesd=*pESDLayout;
1640 AliError(Form("error setting hltEsd layout from %s: invalid object type",
1641 hltESDConfigPath.GetPath().Data()));
1645 fhltesd->WriteToTree(fhlttree);
1646 fhlttree->GetUserInfo()->Add(fhltesd);
1648 ProcInfo_t procInfo;
1649 gSystem->GetProcInfo(&procInfo);
1650 AliInfo(Form("Current memory usage %ld %ld", procInfo.fMemResident, procInfo.fMemVirtual));
1653 //Initialize the QA and start of cycle
1654 if (fRunQA || fRunGlobalQA)
1657 //Initialize the Plane Efficiency framework
1658 if (fRunPlaneEff && !InitPlaneEff()) {
1659 Abort("InitPlaneEff", TSelector::kAbortProcess);
1663 if (strcmp(gProgName,"alieve") == 0)
1664 fRunAliEVE = InitAliEVE();
1669 //_____________________________________________________________________________
1670 Bool_t AliReconstruction::Process(Long64_t entry)
1672 // run the reconstruction over a single entry
1673 // from the chain with raw data
1674 AliCodeTimerAuto("",0);
1676 TTree *currTree = fChain->GetTree();
1677 AliRawVEvent *event = NULL;
1678 currTree->SetBranchAddress("rawevent",&event);
1679 currTree->GetEntry(entry);
1680 fRawReader = new AliRawReaderRoot(event);
1681 fStatus = ProcessEvent(fRunLoader->GetNumberOfEvents());
1689 //_____________________________________________________________________________
1690 void AliReconstruction::Init(TTree *tree)
1692 // Implementation of TSelector::Init()
1695 AliError("The input tree is not found!");
1701 //_____________________________________________________________________________
1702 Bool_t AliReconstruction::ProcessEvent(Int_t iEvent)
1704 // run the reconstruction over a single event
1705 // The event loop is steered in Run method
1708 static Long_t oldMres=0;
1709 static Long_t oldMvir=0;
1710 static Float_t oldCPU=0;
1711 static Long_t aveDMres=0;
1712 static Long_t aveDMvir=0;
1713 static Float_t aveDCPU=0;
1715 AliCodeTimerAuto("",0);
1719 if (iEvent >= fRunLoader->GetNumberOfEvents()) {
1720 fRunLoader->SetEventNumber(iEvent);
1722 fRunLoader->GetHeader()->Reset(fRawReader->GetRunNumber(),
1724 fRunLoader->TreeE()->Fill();
1726 if (fRawReader && fRawReader->UseAutoSaveESD())
1727 fRunLoader->TreeE()->AutoSave("SaveSelf");
1730 if ((iEvent < fFirstEvent) || ((fLastEvent >= 0) && (iEvent > fLastEvent))) {
1735 fRunLoader->GetEvent(iEvent);
1737 // Fill Event-info object
1739 fRecoParam.SetEventSpecie(fRunInfo,fEventInfo,fListOfCosmicTriggers);
1741 ProcInfo_t procInfo;
1742 if(iEvent==fFirstEvent) {
1743 gSystem->GetProcInfo(&procInfo);
1744 oldMres=procInfo.fMemResident;
1745 oldMvir=procInfo.fMemVirtual;
1746 oldCPU=procInfo.fCpuUser+procInfo.fCpuSys;
1748 AliInfo(Form("================================= Processing event %d of type %-10s ==================================", iEvent,fRecoParam.PrintEventSpecie()));
1750 // Set the reco-params
1752 TString detStr = fLoadCDB;
1753 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
1754 if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
1755 AliReconstructor *reconstructor = GetReconstructor(iDet);
1756 if (reconstructor && fRecoParam.GetDetRecoParamArray(iDet)) {
1757 const AliDetectorRecoParam *par = fRecoParam.GetDetRecoParam(iDet);
1758 reconstructor->SetRecoParam(par);
1759 reconstructor->GetPidSettings(&pid);
1760 reconstructor->SetEventInfo(&fEventInfo);
1762 AliQAManager::QAManager()->SetRecoParam(iDet, par) ;
1763 if (par) AliQAManager::QAManager()->SetEventSpecie(AliRecoParam::Convert(par->GetEventSpecie())) ;
1768 if (fRunQA || fRunGlobalQA) AliQADataMaker::SetEventTrigClasses(fEventInfo.GetTriggerClasses()); // RS: select which histo clones are to be filled
1771 const AliDetectorRecoParam *grppar = fRecoParam.GetDetRecoParam(kNDetectors);
1772 AliQAManager::QAManager()->SetRecoParam(AliQAv1::kGLOBAL, grppar) ;
1773 AliQAManager::QAManager()->SetEventSpecie(AliRecoParam::Convert(grppar->GetEventSpecie())) ;
1778 if (fRunQA && IsInTasks(AliQAv1::kRAWS)) {
1779 AliQAManager::QAManager()->SetEventSpecie(fRecoParam.GetEventSpecie()) ;
1780 AliQAManager::QAManager()->RunOneEvent(fRawReader) ;
1782 // local single event reconstruction
1783 if (!fRunLocalReconstruction.IsNull()) {
1784 TString detectors=fRunLocalReconstruction;
1785 // run HLT event reconstruction first
1786 // ;-( IsSelected changes the string
1787 if (IsSelected("HLT", detectors) &&
1788 !RunLocalEventReconstruction("HLT")) {
1789 if (fStopOnError) {CleanUp(); return kFALSE;}
1791 detectors=fRunLocalReconstruction;
1792 detectors.ReplaceAll("HLT", "");
1793 if (!RunLocalEventReconstruction(detectors)) {
1802 // fill Event header information from the RawEventHeader
1803 if (fRawReader){FillRawEventHeaderESD(fesd);}
1804 if (fRawReader){FillRawEventHeaderESD(fhltesd);}
1806 fesd->SetRunNumber(fRunLoader->GetHeader()->GetRun());
1807 fhltesd->SetRunNumber(fRunLoader->GetHeader()->GetRun());
1809 ((AliESDRun*)fesd->GetESDRun())->SetDetectorsInDAQ(fRunInfo->GetDetectorMask());
1810 ((AliESDRun*)fhltesd->GetESDRun())->SetDetectorsInDAQ(fRunInfo->GetDetectorMask());
1811 ((AliESDRun*)fesd->GetESDRun())->SetDetectorsInReco(AliDAQ::DetectorPatternOffline(fFillESD.Data()));
1812 ((AliESDRun*)fhltesd->GetESDRun())->SetDetectorsInReco(AliDAQ::DetectorPatternOffline(fFillESD.Data()));
1814 fesd->SetEventNumberInFile(fRunLoader->GetHeader()->GetEventNrInRun());
1815 fhltesd->SetEventNumberInFile(fRunLoader->GetHeader()->GetEventNrInRun());
1817 fesd->SetEventSpecie(fRecoParam.GetEventSpecie());
1818 fhltesd->SetEventSpecie(fRecoParam.GetEventSpecie());
1820 // Set magnetic field from the tracker
1821 fesd->SetMagneticField(AliTracker::GetBz());
1822 fhltesd->SetMagneticField(AliTracker::GetBz());
1824 AliESDRun *esdRun,*esdRunH;
1825 esdRun = (AliESDRun*)fesd->GetESDRun();
1826 esdRunH = (AliESDRun*)fhltesd->GetESDRun();
1827 esdRun->SetBeamEnergyIsSqrtSHalfGeV();
1828 esdRunH->SetBeamEnergyIsSqrtSHalfGeV();
1830 for (int ib=2;ib--;) for (int it=2;it--;) {
1831 esdRun->SetMeanIntensity(ib,it, fBeamInt[ib][it]);
1832 esdRunH->SetMeanIntensity(ib,it, fBeamInt[ib][it]);
1835 AliMagF* fld = (AliMagF*)TGeoGlobalMagField::Instance()->GetField();
1836 if (fld) { // set info needed for field initialization
1837 fesd->SetCurrentL3(fld->GetCurrentSol());
1838 fesd->SetCurrentDip(fld->GetCurrentDip());
1839 fesd->SetBeamEnergy(fld->GetBeamEnergy());
1840 fesd->SetBeamType(fld->GetBeamTypeText());
1841 fesd->SetUniformBMap(fld->IsUniform());
1842 fesd->SetBInfoStored();
1844 fhltesd->SetCurrentL3(fld->GetCurrentSol());
1845 fhltesd->SetCurrentDip(fld->GetCurrentDip());
1846 fhltesd->SetBeamEnergy(fld->GetBeamEnergy());
1847 fhltesd->SetBeamType(fld->GetBeamTypeText());
1848 fhltesd->SetUniformBMap(fld->IsUniform());
1849 fhltesd->SetBInfoStored();
1852 // Set most probable pt, for B=0 tracking
1853 // Get the global reco-params. They are atposition 16 inside the array of detectors in fRecoParam
1854 const AliGRPRecoParam *grpRecoParam = dynamic_cast<const AliGRPRecoParam*>(fRecoParam.GetDetRecoParam(kNDetectors));
1855 if (grpRecoParam) AliExternalTrackParam::SetMostProbablePt(grpRecoParam->GetMostProbablePt());
1857 // Fill raw-data error log into the ESD
1858 if (fRawReader) FillRawDataErrorLog(iEvent,fesd);
1861 if (fRunVertexFinder) {
1862 if (!RunVertexFinder(fesd)) {
1863 if (fStopOnError) {CleanUp(); return kFALSE;}
1867 // For Plane Efficiency: run the SPD trackleter
1868 if (fRunPlaneEff && fSPDTrackleter) {
1869 if (!RunSPDTrackleting(fesd)) {
1870 if (fStopOnError) {CleanUp(); return kFALSE;}
1875 if (!fRunTracking.IsNull()) {
1876 if (fRunMuonTracking) {
1877 if (!RunMuonTracking(fesd)) {
1878 if (fStopOnError) {CleanUp(); return kFALSE;}
1884 if (!fRunTracking.IsNull()) {
1885 if (!RunTracking(fesd,pid)) {
1886 if (fStopOnError) {CleanUp(); return kFALSE;}
1891 if (!fFillESD.IsNull()) {
1892 TString detectors=fFillESD;
1893 // run HLT first and on hltesd
1894 // ;-( IsSelected changes the string
1895 if (IsSelected("HLT", detectors) &&
1896 !FillESD(fhltesd, "HLT")) {
1897 if (fStopOnError) {CleanUp(); return kFALSE;}
1900 // Temporary fix to avoid problems with HLT that overwrites the offline ESDs
1901 if (detectors.Contains("ALL")) {
1903 for (Int_t idet=0; idet<kNDetectors; ++idet){
1904 detectors += fgkDetectorName[idet];
1908 detectors.ReplaceAll("HLT", "");
1909 if (!FillESD(fesd, detectors)) {
1910 if (fStopOnError) {CleanUp(); return kFALSE;}
1915 if (fReconstructor[3])
1916 GetReconstructor(3)->FillEventTimeWithTOF(fesd,&pid);
1921 if (fFillTriggerESD) {
1922 if (!FillTriggerESD(fesd)) {
1923 if (fStopOnError) {CleanUp(); return kFALSE;}
1926 // Always fill scalers
1927 if (!FillTriggerScalers(fesd)) {
1928 if (fStopOnError) {CleanUp(); return kFALSE;}
1935 // Propagate track to the beam pipe (if not already done by ITS)
1937 const Int_t ntracks = fesd->GetNumberOfTracks();
1938 const Double_t kRadius = 2.8; //something less than the beam pipe radius
1941 UShort_t *selectedIdx=new UShort_t[ntracks];
1943 for (Int_t itrack=0; itrack<ntracks; itrack++){
1944 const Double_t kMaxStep = 1; //max step over the material
1947 AliESDtrack *track = fesd->GetTrack(itrack);
1948 if (!track) continue;
1950 AliExternalTrackParam *tpcTrack =
1951 (AliExternalTrackParam *)track->GetTPCInnerParam();
1955 PropagateTrackToBxByBz(tpcTrack,kRadius,track->GetMass(),kMaxStep,kFALSE);
1958 Int_t n=trkArray.GetEntriesFast();
1959 selectedIdx[n]=track->GetID();
1960 trkArray.AddLast(tpcTrack);
1963 //Tracks refitted by ITS should already be at the SPD vertex
1964 if (track->IsOn(AliESDtrack::kITSrefit)) continue;
1967 PropagateTrackToBxByBz(track,kRadius,track->GetMass(),kMaxStep,kFALSE);
1968 Double_t x[3]; track->GetXYZ(x);
1969 Double_t b[3]; AliTracker::GetBxByBz(x,b);
1970 track->RelateToVertexBxByBz(fesd->GetPrimaryVertexSPD(), b, kVeryBig);
1975 // Improve the reconstructed primary vertex position using the tracks
1977 Bool_t runVertexFinderTracks = fRunVertexFinderTracks;
1978 if(fesd->GetPrimaryVertexSPD()) {
1979 TString vtitle = fesd->GetPrimaryVertexSPD()->GetTitle();
1980 if(vtitle.Contains("cosmics")) {
1981 runVertexFinderTracks=kFALSE;
1985 if (runVertexFinderTracks) {
1986 // TPC + ITS primary vertex
1987 ftVertexer->SetITSMode();
1988 ftVertexer->SetConstraintOff();
1989 // get cuts for vertexer from AliGRPRecoParam
1990 Bool_t constrSPD=kFALSE;
1992 Int_t nCutsVertexer = grpRecoParam->GetVertexerTracksNCuts();
1993 Double_t *cutsVertexer = new Double_t[nCutsVertexer];
1994 grpRecoParam->GetVertexerTracksCutsITS(cutsVertexer);
1995 ftVertexer->SetCuts(cutsVertexer);
1996 delete [] cutsVertexer; cutsVertexer = NULL;
1997 if(grpRecoParam->GetVertexerTracksConstraintITS()) {
1998 if(fDiamondProfile && fDiamondProfile->GetXRes()<kRadius){
1999 ftVertexer->SetVtxStart(fDiamondProfile); // apply constraint only if sigmax is smaller than the beam pipe radius
2001 if(fDiamondProfileSPD && fDiamondProfileSPD->GetXRes()<kRadius){
2002 ftVertexer->SetVtxStart(fDiamondProfileSPD);
2008 AliESDVertex *pvtx=ftVertexer->FindPrimaryVertex(fesd);
2011 TString title=pvtx->GetTitle();
2012 title.Append("SPD");
2013 pvtx->SetTitle(title);
2015 if (pvtx->GetStatus()) {
2016 fesd->SetPrimaryVertexTracks(pvtx);
2017 for (Int_t i=0; i<ntracks; i++) {
2018 AliESDtrack *t = fesd->GetTrack(i);
2019 Double_t x[3]; t->GetXYZ(x);
2020 Double_t b[3]; AliTracker::GetBxByBz(x,b);
2021 t->RelateToVertexBxByBz(pvtx, b, kVeryBig);
2024 delete pvtx; pvtx=NULL;
2027 // TPC-only primary vertex
2028 ftVertexer->SetTPCMode();
2029 ftVertexer->SetConstraintOff();
2030 // get cuts for vertexer from AliGRPRecoParam
2032 Int_t nCutsVertexer = grpRecoParam->GetVertexerTracksNCuts();
2033 Double_t *cutsVertexer = new Double_t[nCutsVertexer];
2034 grpRecoParam->GetVertexerTracksCutsTPC(cutsVertexer);
2035 ftVertexer->SetCuts(cutsVertexer);
2036 delete [] cutsVertexer; cutsVertexer = NULL;
2037 if(fDiamondProfileTPC && grpRecoParam->GetVertexerTracksConstraintTPC()) {
2038 if(fDiamondProfileTPC->GetXRes()<kRadius) ftVertexer->SetVtxStart(fDiamondProfileTPC); // apply constraint only if sigmax is smaller than the beam pipe radius
2041 pvtx=ftVertexer->FindPrimaryVertex(&trkArray,selectedIdx);
2043 if (pvtx->GetStatus()) {
2044 fesd->SetPrimaryVertexTPC(pvtx);
2045 for (Int_t i=0; i<ntracks; i++) {
2046 AliESDtrack *t = fesd->GetTrack(i);
2047 Double_t x[3]; t->GetXYZ(x);
2048 Double_t b[3]; AliTracker::GetBxByBz(x,b);
2049 t->RelateToVertexTPCBxByBz(pvtx, b, kVeryBig);
2052 delete pvtx; pvtx=NULL;
2056 delete[] selectedIdx;
2058 if(fDiamondProfile && fDiamondProfile->GetXRes()<kRadius) fesd->SetDiamond(fDiamondProfile);
2059 else fesd->SetDiamond(fDiamondProfileSPD);
2063 AliV0vertexer vtxer;
2064 // get cuts for V0vertexer from AliGRPRecoParam
2066 Int_t nCutsV0vertexer = grpRecoParam->GetVertexerV0NCuts();
2067 Double_t *cutsV0vertexer = new Double_t[nCutsV0vertexer];
2068 grpRecoParam->GetVertexerV0Cuts(cutsV0vertexer);
2069 vtxer.SetCuts(cutsV0vertexer);
2070 delete [] cutsV0vertexer; cutsV0vertexer = NULL;
2072 vtxer.Tracks2V0vertices(fesd);
2074 if (fRunCascadeFinder) {
2076 AliCascadeVertexer cvtxer;
2077 // get cuts for CascadeVertexer from AliGRPRecoParam
2079 Int_t nCutsCascadeVertexer = grpRecoParam->GetVertexerCascadeNCuts();
2080 Double_t *cutsCascadeVertexer = new Double_t[nCutsCascadeVertexer];
2081 grpRecoParam->GetVertexerCascadeCuts(cutsCascadeVertexer);
2082 cvtxer.SetCuts(cutsCascadeVertexer);
2083 delete [] cutsCascadeVertexer; cutsCascadeVertexer = NULL;
2085 cvtxer.V0sTracks2CascadeVertices(fesd);
2090 if (fCleanESD) CleanESD(fesd);
2092 // RS run updated trackleter: since we want to mark the clusters used by tracks and also mark the
2093 // tracks interpreted as primary, this step should be done in the very end, when full
2094 // ESD info is available (particulalry, V0s)
2096 if (fRunMultFinder) {
2097 if (!RunMultFinder(fesd)) {
2098 if (fStopOnError) {CleanUp(); return kFALSE;}
2102 if (fRunQA && IsInTasks(AliQAv1::kESDS)) {
2103 AliQAManager::QAManager()->SetEventSpecie(fRecoParam.GetEventSpecie()) ;
2104 AliQAManager::QAManager()->RunOneEvent(fesd, fhltesd) ;
2107 AliQADataMaker *qadm = AliQAManager::QAManager()->GetQADataMaker(AliQAv1::kGLOBAL);
2109 qadm->SetEventSpecie(fRecoParam.GetEventSpecie()) ;
2110 if (qadm && IsInTasks(AliQAv1::kESDS))
2111 qadm->Exec(AliQAv1::kESDS, fesd);
2114 // copy HLT decision from HLTesd to esd
2115 // the most relevant information is stored in a reduced container in the esd,
2116 // while the full information can be found in the HLTesd
2117 TObject* pHLTSrc=fhltesd->FindListObject(AliESDHLTDecision::Name());
2118 TObject* pHLTTgt=fesd->FindListObject(AliESDHLTDecision::Name());
2119 if (pHLTSrc && pHLTTgt) {
2120 pHLTSrc->Copy(*pHLTTgt);
2123 if (fWriteESDfriend)
2124 fesd->GetESDfriend(fesdf);
2127 if (fWriteESDfriend) {
2131 // Auto-save the ESD tree in case of prompt reco @P2
2132 if (fRawReader && fRawReader->UseAutoSaveESD()) {
2133 ftree->AutoSave("SaveSelf");
2134 if (fWriteESDfriend) ftreeF->AutoSave("SaveSelf");
2141 if (fRunAliEVE) RunAliEVE();
2145 if (fWriteESDfriend) {
2146 fesdf->~AliESDfriend();
2147 new (fesdf) AliESDfriend(); // Reset...
2150 gSystem->GetProcInfo(&procInfo);
2151 Long_t dMres=(procInfo.fMemResident-oldMres)/1024;
2152 Long_t dMvir=(procInfo.fMemVirtual-oldMvir)/1024;
2153 Float_t dCPU=procInfo.fCpuUser+procInfo.fCpuSys-oldCPU;
2154 aveDMres+=(dMres-aveDMres)/(iEvent-fFirstEvent+1);
2155 aveDMvir+=(dMvir-aveDMvir)/(iEvent-fFirstEvent+1);
2156 aveDCPU+=(dCPU-aveDCPU)/(iEvent-fFirstEvent+1);
2157 AliInfo(Form("======================= End Event %d: Res %ld(%3ld <%3ld>) Vir %ld(%3ld <%3ld>) CPU %5.2f <%5.2f> ===================",
2158 iEvent, procInfo.fMemResident/1024, dMres, aveDMres, procInfo.fMemVirtual/1024, dMvir, aveDMvir, dCPU, aveDCPU));
2159 oldMres=procInfo.fMemResident;
2160 oldMvir=procInfo.fMemVirtual;
2161 oldCPU=procInfo.fCpuUser+procInfo.fCpuSys;
2164 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
2165 if (fReconstructor[iDet]) {
2166 fReconstructor[iDet]->SetRecoParam(NULL);
2167 fReconstructor[iDet]->SetEventInfo(NULL);
2169 if (fTracker[iDet]) fTracker[iDet]->SetEventInfo(NULL);
2172 if (fRunQA || fRunGlobalQA)
2173 AliQAManager::QAManager()->Increment() ;
2178 //_____________________________________________________________________________
2179 void AliReconstruction::SlaveTerminate()
2181 // Finalize the run on the slave side
2182 // Called after the exit
2183 // from the event loop
2184 AliCodeTimerAuto("",0);
2186 if (fIsNewRunLoader) { // galice.root didn't exist
2187 fRunLoader->WriteHeader("OVERWRITE");
2188 fRunLoader->WriteTrigger("OVERWRITE");
2189 fRunLoader->CdGAFile();
2190 fRunLoader->Write(0, TObject::kOverwrite);
2193 const TMap *cdbMap = AliCDBManager::Instance()->GetStorageMap();
2194 const TList *cdbList = AliCDBManager::Instance()->GetRetrievedIds();
2196 TMap *cdbMapCopy = new TMap(cdbMap->GetEntries());
2197 cdbMapCopy->SetOwner(1);
2198 cdbMapCopy->SetName("cdbMap");
2199 TIter iter(cdbMap->GetTable());
2202 while((pair = dynamic_cast<TPair*> (iter.Next()))){
2203 TObjString* keyStr = dynamic_cast<TObjString*> (pair->Key());
2204 TObjString* valStr = dynamic_cast<TObjString*> (pair->Value());
2205 if (keyStr && valStr)
2206 cdbMapCopy->Add(new TObjString(keyStr->GetName()), new TObjString(valStr->GetName()));
2209 TList *cdbListCopy = new TList();
2210 cdbListCopy->SetOwner(1);
2211 cdbListCopy->SetName("cdbList");
2213 TIter iter2(cdbList);
2216 while((id = dynamic_cast<AliCDBId*> (iter2.Next()))){
2217 cdbListCopy->Add(new TObjString(id->ToString().Data()));
2220 ftree->GetUserInfo()->Add(cdbMapCopy);
2221 ftree->GetUserInfo()->Add(cdbListCopy);
2226 // we want to have only one tree version number
2227 ftree->Write(ftree->GetName(),TObject::kOverwrite);
2228 fhlttree->Write(fhlttree->GetName(),TObject::kOverwrite);
2230 if (fWriteESDfriend) {
2232 ftreeF->Write(ftreeF->GetName(),TObject::kOverwrite);
2235 // Finish with Plane Efficiency evaluation: before of CleanUp !!!
2236 if (fRunPlaneEff && !FinishPlaneEff()) {
2237 AliWarning("Finish PlaneEff evaluation failed");
2240 // End of cycle for the in-loop
2242 if (fRunQA || fRunGlobalQA) {
2243 AliQAManager::QAManager()->EndOfCycle() ;
2245 !fProofOutputLocation.IsNull() &&
2246 fProofOutputArchive.IsNull() &&
2247 !fProofOutputDataset) {
2248 TString qaOutputFile(Form("%sMerged.%s.Data.root",
2249 fProofOutputLocation.Data(),
2250 AliQAv1::GetQADataFileName()));
2251 TProofOutputFile *qaProofFile = new TProofOutputFile(Form("Merged.%s.Data.root",
2252 AliQAv1::GetQADataFileName()));
2253 qaProofFile->SetOutputFileName(qaOutputFile.Data());
2254 if (AliDebugLevel() > 0) qaProofFile->Dump();
2255 fOutput->Add(qaProofFile);
2256 MergeQA(qaProofFile->GetFileName());
2267 if (!fProofOutputFileName.IsNull() &&
2268 !fProofOutputLocation.IsNull() &&
2269 fProofOutputDataset &&
2270 !fProofOutputArchive.IsNull()) {
2271 TProofOutputFile *zipProofFile = new TProofOutputFile(fProofOutputFileName.Data(),
2273 fProofOutputLocation.Data());
2274 if (AliDebugLevel() > 0) zipProofFile->Dump();
2275 fOutput->Add(zipProofFile);
2276 TString fileList(fProofOutputArchive.Data());
2277 fileList.ReplaceAll(","," ");
2279 #if ROOT_SVN_REVISION >= 30174
2280 command.Form("zip -n root %s/%s %s",zipProofFile->GetDir(kTRUE),zipProofFile->GetFileName(),fileList.Data());
2282 command.Form("zip -n root %s/%s %s",zipProofFile->GetDir(),zipProofFile->GetFileName(),fileList.Data());
2284 AliInfo(Form("Executing: %s",command.Data()));
2285 gSystem->Exec(command.Data());
2290 //_____________________________________________________________________________
2291 void AliReconstruction::Terminate()
2293 // Create tags for the events in the ESD tree (the ESD tree is always present)
2294 // In case of empty events the tags will contain dummy values
2295 AliCodeTimerAuto("",0);
2297 // Do not call the ESD tag creator in case of PROOF-based reconstruction
2299 AliESDTagCreator *esdtagCreator = new AliESDTagCreator();
2300 esdtagCreator->CreateESDTags(fFirstEvent,fLastEvent,fGRPData, AliQAv1::Instance()->GetQA(), AliQAv1::Instance()->GetEventSpecies(), AliQAv1::kNDET, AliRecoParam::kNSpecies);
2301 delete esdtagCreator;
2304 // Cleanup of CDB manager: cache and active storages!
2305 AliCDBManager::Instance()->ClearCache();
2308 //_____________________________________________________________________________
2309 Bool_t AliReconstruction::RunLocalEventReconstruction(const TString& detectors)
2311 // run the local reconstruction
2313 static Int_t eventNr=0;
2314 AliCodeTimerAuto("",0)
2316 TString detStr = detectors;
2317 // execute HLT reconstruction first since other detector reconstruction
2318 // might depend on HLT data
2319 // key 'HLT' is removed from detStr by IsSelected
2320 if (!IsSelected("HLT", detStr)) {
2321 AliReconstructor* reconstructor = GetReconstructor(kNDetectors-1);
2322 if (reconstructor) {
2323 // there is no AliLoader for HLT, see
2324 // https://savannah.cern.ch/bugs/?35473
2325 AliInfo("running reconstruction for HLT");
2327 reconstructor->Reconstruct(fRawReader, NULL);
2330 reconstructor->Reconstruct(dummy, NULL);
2334 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
2335 if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
2336 AliReconstructor* reconstructor = GetReconstructor(iDet);
2337 if (!reconstructor) continue;
2338 AliLoader* loader = fLoader[iDet];
2340 AliWarning(Form("No loader is defined for %s!",fgkDetectorName[iDet]));
2343 // conversion of digits
2344 if (fRawReader && reconstructor->HasDigitConversion()) {
2345 AliInfo(Form("converting raw data digits into root objects for %s",
2346 fgkDetectorName[iDet]));
2347 // AliCodeTimerAuto(Form("converting raw data digits into root objects for %s",
2348 // fgkDetectorName[iDet]),0);
2349 loader->LoadDigits("update");
2350 loader->CleanDigits();
2351 loader->MakeDigitsContainer();
2352 TTree* digitsTree = loader->TreeD();
2353 reconstructor->ConvertDigits(fRawReader, digitsTree);
2354 loader->WriteDigits("OVERWRITE");
2355 loader->UnloadDigits();
2357 // local reconstruction
2358 AliInfo(Form("running reconstruction for %s", fgkDetectorName[iDet]));
2359 //AliCodeTimerAuto(Form("running reconstruction for %s", fgkDetectorName[iDet]),0);
2360 loader->LoadRecPoints("update");
2361 loader->CleanRecPoints();
2362 loader->MakeRecPointsContainer();
2363 TTree* clustersTree = loader->TreeR();
2364 if (fRawReader && !reconstructor->HasDigitConversion()) {
2365 reconstructor->Reconstruct(fRawReader, clustersTree);
2367 loader->LoadDigits("read");
2368 TTree* digitsTree = loader->TreeD();
2370 AliError(Form("Can't get the %s digits tree", fgkDetectorName[iDet]));
2374 reconstructor->Reconstruct(digitsTree, clustersTree);
2375 if (fRunQA && IsInTasks(AliQAv1::kDIGITSR)) {
2376 AliQAManager::QAManager()->SetEventSpecie(fRecoParam.GetEventSpecie()) ;
2377 AliQAManager::QAManager()->RunOneEventInOneDetector(iDet, digitsTree) ;
2380 loader->UnloadDigits();
2382 if (fRunQA && IsInTasks(AliQAv1::kRECPOINTS)) {
2383 AliQAManager::QAManager()->SetEventSpecie(fRecoParam.GetEventSpecie()) ;
2384 AliQAManager::QAManager()->RunOneEventInOneDetector(iDet, clustersTree) ;
2386 loader->WriteRecPoints("OVERWRITE");
2387 loader->UnloadRecPoints();
2388 AliSysInfo::AddStamp(Form("LRec%s_%d",fgkDetectorName[iDet],eventNr), iDet,1,eventNr);
2390 if (!IsSelected("CTP", detStr)) AliDebug(10,"No CTP");
2391 if ((detStr.CompareTo("ALL") != 0) && !detStr.IsNull()) {
2392 AliError(Form("the following detectors were not found: %s",
2400 //_____________________________________________________________________________
2401 Bool_t AliReconstruction::RunSPDTrackleting(AliESDEvent*& esd)
2403 // run the SPD trackleting (for SPD efficiency purpouses)
2405 AliCodeTimerAuto("",0)
2407 Double_t vtxPos[3] = {0, 0, 0};
2408 Double_t vtxErr[3] = {0.0, 0.0, 0.0};
2410 TArrayF mcVertex(3);
2412 if (fRunLoader->GetHeader() && fRunLoader->GetHeader()->GenEventHeader()) {
2413 fRunLoader->GetHeader()->GenEventHeader()->PrimaryVertex(mcVertex);
2414 for (Int_t i = 0; i < 3; i++) vtxPos[i] = mcVertex[i];
2417 const AliESDVertex *vertex = esd->GetVertex();
2419 AliWarning("Vertex not found");
2422 vertex->GetXYZ(vtxPos);
2423 vertex->GetSigmaXYZ(vtxErr);
2424 if (fSPDTrackleter) {
2425 AliInfo("running the SPD Trackleter for Plane Efficiency Evaluation");
2428 fLoader[0]->LoadRecPoints("read");
2429 TTree* tree = fLoader[0]->TreeR();
2431 AliError("Can't get the ITS cluster tree");
2434 fSPDTrackleter->LoadClusters(tree);
2435 fSPDTrackleter->SetVertex(vtxPos, vtxErr);
2437 if (fSPDTrackleter->Clusters2Tracks(esd) != 0) {
2438 AliWarning("AliITSTrackleterSPDEff Clusters2Tracks failed");
2439 // fLoader[0]->UnloadRecPoints();
2442 //fSPDTrackleter->UnloadRecPoints();
2444 AliWarning("SPDTrackleter not available");
2450 //_____________________________________________________________________________
2451 Bool_t AliReconstruction::RunVertexFinder(AliESDEvent*& esd)
2453 // run the barrel tracking
2455 AliCodeTimerAuto("",0)
2457 AliVertexer *vertexer = CreateVertexer();
2458 if (!vertexer) return kFALSE;
2460 AliInfo(Form("running the ITS vertex finder: %s",vertexer->ClassName()));
2461 AliESDVertex* vertex = NULL;
2463 fLoader[0]->LoadRecPoints();
2464 TTree* cltree = fLoader[0]->TreeR();
2466 if(fDiamondProfileSPD) vertexer->SetVtxStart(fDiamondProfileSPD);
2467 vertex = vertexer->FindVertexForCurrentEvent(cltree);
2470 AliError("Can't get the ITS cluster tree");
2472 fLoader[0]->UnloadRecPoints();
2475 AliError("Can't get the ITS loader");
2478 AliWarning("Vertex not found");
2479 vertex = new AliESDVertex();
2480 vertex->SetName("default");
2483 vertex->SetName("reconstructed");
2488 vertex->GetXYZ(vtxPos);
2489 vertex->GetSigmaXYZ(vtxErr);
2491 esd->SetPrimaryVertexSPD(vertex);
2492 AliESDVertex *vpileup = NULL;
2493 Int_t novertices = 0;
2494 vpileup = vertexer->GetAllVertices(novertices);
2496 for (Int_t kk=1; kk<novertices; kk++)esd->AddPileupVertexSPD(&vpileup[kk]);
2499 // if SPD multiplicity has been determined, it is stored in the ESD
2500 AliMultiplicity *mult = vertexer->GetMultiplicity();
2501 if(mult)esd->SetMultiplicity(mult);
2503 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
2504 if (fTracker[iDet]) fTracker[iDet]->SetVertex(vtxPos, vtxErr);
2513 //_____________________________________________________________________________
2514 Bool_t AliReconstruction::RunMultFinder(AliESDEvent*& esd)
2516 // run the trackleter for multiplicity study
2518 AliCodeTimerAuto("",0)
2520 AliTrackleter *trackleter = CreateMultFinder();
2521 if (!trackleter) return kFALSE;
2523 AliInfo(Form("running the ITS multiplicity finder: %s",trackleter->ClassName()));
2526 fLoader[0]->LoadRecPoints();
2527 TTree* cltree = fLoader[0]->TreeR();
2529 trackleter->Reconstruct(esd,cltree);
2530 AliMultiplicity *mult = trackleter->GetMultiplicity();
2531 if(mult) esd->SetMultiplicity(mult);
2534 AliError("Can't get the ITS cluster tree");
2536 fLoader[0]->UnloadRecPoints();
2539 AliError("Can't get the ITS loader");
2547 //_____________________________________________________________________________
2548 Bool_t AliReconstruction::RunHLTTracking(AliESDEvent*& esd)
2550 // run the HLT barrel tracking
2552 AliCodeTimerAuto("",0)
2555 AliError("Missing runLoader!");
2559 AliInfo("running HLT tracking");
2561 // Get a pointer to the HLT reconstructor
2562 AliReconstructor *reconstructor = GetReconstructor(kNDetectors-1);
2563 if (!reconstructor) return kFALSE;
2566 for (Int_t iDet = 1; iDet >= 0; iDet--) {
2567 TString detName = fgkDetectorName[iDet];
2568 AliDebug(1, Form("%s HLT tracking", detName.Data()));
2569 reconstructor->SetOption(detName.Data());
2570 AliTracker *tracker = reconstructor->CreateTracker();
2572 AliWarning(Form("couldn't create a HLT tracker for %s", detName.Data()));
2573 if (fStopOnError) return kFALSE;
2577 Double_t vtxErr[3]={0.005,0.005,0.010};
2578 const AliESDVertex *vertex = esd->GetVertex();
2579 vertex->GetXYZ(vtxPos);
2580 tracker->SetVertex(vtxPos,vtxErr);
2582 fLoader[iDet]->LoadRecPoints("read");
2583 TTree* tree = fLoader[iDet]->TreeR();
2585 AliError(Form("Can't get the %s cluster tree", detName.Data()));
2588 tracker->LoadClusters(tree);
2590 if (tracker->Clusters2Tracks(esd) != 0) {
2591 AliError(Form("HLT %s Clusters2Tracks failed", fgkDetectorName[iDet]));
2595 tracker->UnloadClusters();
2603 //_____________________________________________________________________________
2604 Bool_t AliReconstruction::RunMuonTracking(AliESDEvent*& esd)
2606 // run the muon spectrometer tracking
2608 AliCodeTimerAuto("",0)
2611 AliError("Missing runLoader!");
2614 Int_t iDet = 7; // for MUON
2616 AliInfo("is running...");
2618 // Get a pointer to the MUON reconstructor
2619 AliReconstructor *reconstructor = GetReconstructor(iDet);
2620 if (!reconstructor) return kFALSE;
2623 TString detName = fgkDetectorName[iDet];
2624 AliDebug(1, Form("%s tracking", detName.Data()));
2625 AliTracker *tracker = reconstructor->CreateTracker();
2627 AliWarning(Form("couldn't create a tracker for %s", detName.Data()));
2632 fLoader[iDet]->LoadRecPoints("read");
2634 tracker->LoadClusters(fLoader[iDet]->TreeR());
2636 Int_t rv = tracker->Clusters2Tracks(esd);
2638 fLoader[iDet]->UnloadRecPoints();
2640 tracker->UnloadClusters();
2646 AliError(Form("%s Clusters2Tracks failed", fgkDetectorName[iDet]));
2654 //_____________________________________________________________________________
2655 Bool_t AliReconstruction::RunTracking(AliESDEvent*& esd,AliESDpid &PID)
2657 // run the barrel tracking
2658 static Int_t eventNr=0;
2659 AliCodeTimerAuto("",0)
2661 AliInfo("running tracking");
2663 // Set the event info which is used
2664 // by the trackers in order to obtain
2665 // information about read-out detectors,
2667 AliDebug(1, "Setting event info");
2668 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
2669 if (!fTracker[iDet]) continue;
2670 fTracker[iDet]->SetEventInfo(&fEventInfo);
2673 //Fill the ESD with the T0 info (will be used by the TOF)
2674 if (fReconstructor[11] && fLoader[11]) {
2675 fLoader[11]->LoadRecPoints("READ");
2676 TTree *treeR = fLoader[11]->TreeR();
2678 GetReconstructor(11)->FillESD((TTree *)NULL,treeR,esd);
2682 // pass 1: TPC + ITS inwards
2683 for (Int_t iDet = 1; iDet >= 0; iDet--) {
2684 if (!fTracker[iDet]) continue;
2685 AliDebug(1, Form("%s tracking", fgkDetectorName[iDet]));
2688 fLoader[iDet]->LoadRecPoints("read");
2689 AliSysInfo::AddStamp(Form("RLoadCluster%s_%d",fgkDetectorName[iDet],eventNr),iDet,1, eventNr);
2690 TTree* tree = fLoader[iDet]->TreeR();
2692 AliError(Form("Can't get the %s cluster tree", fgkDetectorName[iDet]));
2695 fTracker[iDet]->LoadClusters(tree);
2696 AliSysInfo::AddStamp(Form("TLoadCluster%s_%d",fgkDetectorName[iDet],eventNr), iDet,2, eventNr);
2698 if (fTracker[iDet]->Clusters2Tracks(esd) != 0) {
2699 AliError(Form("%s Clusters2Tracks failed", fgkDetectorName[iDet]));
2702 // preliminary PID in TPC needed by the ITS tracker
2704 GetReconstructor(1)->FillESD((TTree*)NULL, (TTree*)NULL, esd);
2705 PID.MakePID(esd,kTRUE);
2707 AliSysInfo::AddStamp(Form("Tracking0%s_%d",fgkDetectorName[iDet],eventNr), iDet,3,eventNr);
2710 // pass 2: ALL backwards
2712 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
2713 if (!fTracker[iDet]) continue;
2714 AliDebug(1, Form("%s back propagation", fgkDetectorName[iDet]));
2717 if (iDet > 1) { // all except ITS, TPC
2719 fLoader[iDet]->LoadRecPoints("read");
2720 AliSysInfo::AddStamp(Form("RLoadCluster0%s_%d",fgkDetectorName[iDet],eventNr), iDet,1, eventNr);
2721 tree = fLoader[iDet]->TreeR();
2723 AliError(Form("Can't get the %s cluster tree", fgkDetectorName[iDet]));
2726 fTracker[iDet]->LoadClusters(tree);
2727 AliSysInfo::AddStamp(Form("TLoadCluster0%s_%d",fgkDetectorName[iDet],eventNr), iDet,2, eventNr);
2731 if (iDet>1) // start filling residuals for the "outer" detectors
2733 AliTracker::SetFillResiduals(fRecoParam.GetEventSpecie(), kTRUE);
2734 TObjArray ** arr = AliTracker::GetResidualsArray() ;
2736 AliRecoParam::EventSpecie_t es=fRecoParam.GetEventSpecie();
2737 TObjArray * elem = arr[AliRecoParam::AConvert(es)];
2738 if ( elem && (! elem->At(0)) ) {
2739 AliQADataMaker *qadm = AliQAManager::QAManager()->GetQADataMaker(AliQAv1::kGLOBAL);
2740 if (qadm) qadm->InitRecPointsForTracker() ;
2744 if (fTracker[iDet]->PropagateBack(esd) != 0) {
2745 AliError(Form("%s backward propagation failed", fgkDetectorName[iDet]));
2750 if (iDet > 3) { // all except ITS, TPC, TRD and TOF
2751 fTracker[iDet]->UnloadClusters();
2752 fLoader[iDet]->UnloadRecPoints();
2754 // updated PID in TPC needed by the ITS tracker -MI
2756 //GetReconstructor(1)->FillESD((TTree*)NULL, (TTree*)NULL, esd);
2757 //AliESDpid::MakePID(esd);
2758 PID.MakePID(esd,kTRUE);
2760 AliSysInfo::AddStamp(Form("Tracking1%s_%d",fgkDetectorName[iDet],eventNr), iDet,3, eventNr);
2762 //stop filling residuals for the "outer" detectors
2763 if (fRunGlobalQA) AliTracker::SetFillResiduals(fRecoParam.GetEventSpecie(), kFALSE);
2765 // pass 3: TRD + TPC + ITS refit inwards
2767 for (Int_t iDet = 2; iDet >= 0; iDet--) {
2768 if (!fTracker[iDet]) continue;
2769 AliDebug(1, Form("%s inward refit", fgkDetectorName[iDet]));
2772 if (iDet<2) // start filling residuals for TPC and ITS
2774 AliTracker::SetFillResiduals(fRecoParam.GetEventSpecie(), kTRUE);
2775 TObjArray ** arr = AliTracker::GetResidualsArray() ;
2777 AliRecoParam::EventSpecie_t es=fRecoParam.GetEventSpecie();
2778 TObjArray * elem = arr[AliRecoParam::AConvert(es)];
2779 if ( elem && (! elem->At(0)) ) {
2780 AliQADataMaker *qadm = AliQAManager::QAManager()->GetQADataMaker(AliQAv1::kGLOBAL);
2781 if (qadm) qadm->InitRecPointsForTracker() ;
2786 if (fTracker[iDet]->RefitInward(esd) != 0) {
2787 AliError(Form("%s inward refit failed", fgkDetectorName[iDet]));
2790 // run postprocessing
2791 if (fTracker[iDet]->PostProcess(esd) != 0) {
2792 AliError(Form("%s postprocessing failed", fgkDetectorName[iDet]));
2795 AliSysInfo::AddStamp(Form("Tracking2%s_%d",fgkDetectorName[iDet],eventNr), iDet,3, eventNr);
2798 // write space-points to the ESD in case alignment data output
2800 if (fWriteAlignmentData)
2801 WriteAlignmentData(esd);
2803 for (Int_t iDet = 3; iDet >= 0; iDet--) {
2804 if (!fTracker[iDet]) continue;
2806 fTracker[iDet]->UnloadClusters();
2807 AliSysInfo::AddStamp(Form("TUnloadCluster%s_%d",fgkDetectorName[iDet],eventNr), iDet,4, eventNr);
2808 fLoader[iDet]->UnloadRecPoints();
2809 AliSysInfo::AddStamp(Form("RUnloadCluster%s_%d",fgkDetectorName[iDet],eventNr), iDet,5, eventNr);
2811 // stop filling residuals for TPC and ITS
2812 if (fRunGlobalQA) AliTracker::SetFillResiduals(fRecoParam.GetEventSpecie(), kFALSE);
2818 //_____________________________________________________________________________
2819 Bool_t AliReconstruction::CleanESD(AliESDEvent *esd){
2821 // Remove the data which are not needed for the physics analysis.
2824 Int_t nTracks=esd->GetNumberOfTracks();
2825 Int_t nV0s=esd->GetNumberOfV0s();
2827 (Form("Number of ESD tracks and V0s before cleaning: %d %d",nTracks,nV0s));
2829 Float_t cleanPars[]={fV0DCAmax,fV0CsPmin,fDmax,fZmax};
2830 Bool_t rc=esd->Clean(cleanPars);
2832 nTracks=esd->GetNumberOfTracks();
2833 nV0s=esd->GetNumberOfV0s();
2835 (Form("Number of ESD tracks and V0s after cleaning %d %d",nTracks,nV0s));
2840 //_____________________________________________________________________________
2841 Bool_t AliReconstruction::FillESD(AliESDEvent*& esd, const TString& detectors)
2843 // fill the event summary data
2845 AliCodeTimerAuto("",0)
2846 static Int_t eventNr=0;
2847 TString detStr = detectors;
2849 AliSysInfo::AddStamp(Form("FillESDb%d",eventNr), -19,-19, eventNr);
2850 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
2851 if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
2852 AliReconstructor* reconstructor = GetReconstructor(iDet);
2853 if (!reconstructor) continue;
2854 AliDebug(1, Form("filling ESD for %s", fgkDetectorName[iDet]));
2855 TTree* clustersTree = NULL;
2856 if (fLoader[iDet]) {
2857 fLoader[iDet]->LoadRecPoints("read");
2858 clustersTree = fLoader[iDet]->TreeR();
2859 if (!clustersTree) {
2860 AliError(Form("Can't get the %s clusters tree",
2861 fgkDetectorName[iDet]));
2862 if (fStopOnError) return kFALSE;
2865 if (fRawReader && !reconstructor->HasDigitConversion()) {
2866 reconstructor->FillESD(fRawReader, clustersTree, esd);
2868 TTree* digitsTree = NULL;
2869 if (fLoader[iDet]) {
2870 fLoader[iDet]->LoadDigits("read");
2871 digitsTree = fLoader[iDet]->TreeD();
2873 AliError(Form("Can't get the %s digits tree",
2874 fgkDetectorName[iDet]));
2875 if (fStopOnError) return kFALSE;
2878 reconstructor->FillESD(digitsTree, clustersTree, esd);
2879 if (fLoader[iDet]) fLoader[iDet]->UnloadDigits();
2881 if (fLoader[iDet]) {
2882 fLoader[iDet]->UnloadRecPoints();
2886 if (!IsSelected("CTP", detStr)) AliDebug(10,"No CTP");
2887 if ((detStr.CompareTo("ALL") != 0) && !detStr.IsNull()) {
2888 AliError(Form("the following detectors were not found: %s",
2890 if (fStopOnError) return kFALSE;
2892 AliSysInfo::AddStamp(Form("FillESDe%d",eventNr), -20,-20, eventNr);
2897 //_____________________________________________________________________________
2898 Bool_t AliReconstruction::FillTriggerESD(AliESDEvent*& esd)
2900 // Reads the trigger decision which is
2901 // stored in Trigger.root file and fills
2902 // the corresponding esd entries
2904 AliCodeTimerAuto("",0)
2906 AliInfo("Filling trigger information into the ESD");
2909 AliCTPRawStream input(fRawReader);
2910 if (!input.Next()) {
2911 AliWarning("No valid CTP (trigger) DDL raw data is found ! The trigger info is taken from the event header!");
2914 if (esd->GetTriggerMask() != input.GetClassMask())
2915 AliError(Form("Invalid trigger pattern found in CTP raw-data: %llx %llx",
2916 input.GetClassMask(),esd->GetTriggerMask()));
2917 if (esd->GetOrbitNumber() != input.GetOrbitID())
2918 AliError(Form("Invalid orbit id found in CTP raw-data: %x %x",
2919 input.GetOrbitID(),esd->GetOrbitNumber()));
2920 if (esd->GetBunchCrossNumber() != input.GetBCID())
2921 AliError(Form("Invalid bunch-crossing id found in CTP raw-data: %x %x",
2922 input.GetBCID(),esd->GetBunchCrossNumber()));
2923 AliESDHeader* esdheader = esd->GetHeader();
2924 esdheader->SetL0TriggerInputs(input.GetL0Inputs());
2925 esdheader->SetL1TriggerInputs(input.GetL1Inputs());
2926 esdheader->SetL2TriggerInputs(input.GetL2Inputs());
2928 UInt_t orbit=input.GetOrbitID();
2929 for(Int_t i=0 ; i<input.GetNIRs() ; i++ )
2930 if(TMath::Abs(Int_t(orbit-(input.GetIR(i))->GetOrbit()))<=1){
2931 esdheader->AddTriggerIR(input.GetIR(i));
2933 AliCentralTrigger* rlCTP = fRunLoader->GetTrigger();
2934 rlCTP->SetL0TriggerInputs(input.GetL0Inputs());
2935 rlCTP->SetL1TriggerInputs(input.GetL1Inputs());
2936 rlCTP->SetL2TriggerInputs(input.GetL2Inputs());
2938 if (fIsNewRunLoader) fRunLoader->TreeCT()->Fill();
2942 //_____________________________________________________________________________
2943 Bool_t AliReconstruction::FillTriggerScalers(AliESDEvent*& esd)
2946 //fRunScalers->Print();
2947 if(fRunScalers && fRunScalers->CheckRunScalers()){
2948 AliTimeStamp* timestamp = new AliTimeStamp(esd->GetOrbitNumber(), esd->GetPeriodNumber(), esd->GetBunchCrossNumber());
2949 //AliTimeStamp* timestamp = new AliTimeStamp(10308000, 0, (ULong64_t)486238);
2950 AliESDHeader* esdheader = fesd->GetHeader();
2951 for(Int_t i=0;i<50;i++){
2952 if((1ull<<i) & esd->GetTriggerMask()){
2953 AliTriggerScalersESD* scalesd = fRunScalers->GetScalersForEventClass( timestamp, i+1);
2954 if(scalesd)esdheader->SetTriggerScalersRecord(scalesd);
2960 //_____________________________________________________________________________
2961 Bool_t AliReconstruction::FillRawEventHeaderESD(AliESDEvent*& esd)
2964 // Filling information from RawReader Header
2967 if (!fRawReader) return kFALSE;
2969 AliInfo("Filling information from RawReader Header");
2971 esd->SetBunchCrossNumber(fRawReader->GetBCID());
2972 esd->SetOrbitNumber(fRawReader->GetOrbitID());
2973 esd->SetPeriodNumber(fRawReader->GetPeriod());
2975 esd->SetTimeStamp(fRawReader->GetTimestamp());
2976 esd->SetEventType(fRawReader->GetType());
2982 //_____________________________________________________________________________
2983 Bool_t AliReconstruction::IsSelected(TString detName, TString& detectors) const
2985 // check whether detName is contained in detectors
2986 // if yes, it is removed from detectors
2988 // check if all detectors are selected
2989 if ((detectors.CompareTo("ALL") == 0) ||
2990 detectors.BeginsWith("ALL ") ||
2991 detectors.EndsWith(" ALL") ||
2992 detectors.Contains(" ALL ")) {
2997 // search for the given detector
2998 Bool_t result = kFALSE;
2999 if ((detectors.CompareTo(detName) == 0) ||
3000 detectors.BeginsWith(detName+" ") ||
3001 detectors.EndsWith(" "+detName) ||
3002 detectors.Contains(" "+detName+" ")) {
3003 detectors.ReplaceAll(detName, "");
3007 // clean up the detectors string
3008 while (detectors.Contains(" ")) detectors.ReplaceAll(" ", " ");
3009 while (detectors.BeginsWith(" ")) detectors.Remove(0, 1);
3010 while (detectors.EndsWith(" ")) detectors.Remove(detectors.Length()-1, 1);
3015 //_____________________________________________________________________________
3016 Bool_t AliReconstruction::InitRunLoader()
3018 // get or create the run loader
3020 if (gAlice) delete gAlice;
3023 TFile *gafile = TFile::Open(fGAliceFileName.Data());
3024 // if (!gSystem->AccessPathName(fGAliceFileName.Data())) { // galice.root exists
3025 if (gafile) { // galice.root exists
3029 // load all base libraries to get the loader classes
3030 TString libs = gSystem->GetLibraries();
3031 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
3032 TString detName = fgkDetectorName[iDet];
3033 if (detName == "HLT") continue;
3034 if (libs.Contains("lib" + detName + "base.so")) continue;
3035 gSystem->Load("lib" + detName + "base.so");
3037 fRunLoader = AliRunLoader::Open(fGAliceFileName.Data());
3039 AliError(Form("no run loader found in file %s", fGAliceFileName.Data()));
3044 fRunLoader->CdGAFile();
3045 fRunLoader->LoadgAlice();
3047 //PH This is a temporary fix to give access to the kinematics
3048 //PH that is needed for the labels of ITS clusters
3049 fRunLoader->LoadHeader();
3050 fRunLoader->LoadKinematics();
3052 } else { // galice.root does not exist
3054 AliError(Form("the file %s does not exist", fGAliceFileName.Data()));
3056 fRunLoader = AliRunLoader::Open(fGAliceFileName.Data(),
3057 AliConfig::GetDefaultEventFolderName(),
3060 AliError(Form("could not create run loader in file %s",
3061 fGAliceFileName.Data()));
3065 fIsNewRunLoader = kTRUE;
3066 fRunLoader->MakeTree("E");
3067 fRunLoader->MakeTree("GG");
3069 if (fNumberOfEventsPerFile > 0)
3070 fRunLoader->SetNumberOfEventsPerFile(fNumberOfEventsPerFile);
3072 fRunLoader->SetNumberOfEventsPerFile((UInt_t)-1);
3078 //_____________________________________________________________________________
3079 AliReconstructor* AliReconstruction::GetReconstructor(Int_t iDet)
3081 // get the reconstructor object and the loader for a detector
3083 if (fReconstructor[iDet]) {
3084 if (fRecoParam.GetDetRecoParamArray(iDet) && !AliReconstructor::GetRecoParam(iDet)) {
3085 const AliDetectorRecoParam *par = fRecoParam.GetDetRecoParam(iDet);
3086 fReconstructor[iDet]->SetRecoParam(par);
3087 fReconstructor[iDet]->SetRunInfo(fRunInfo);
3089 return fReconstructor[iDet];
3092 // load the reconstructor object
3093 TPluginManager* pluginManager = gROOT->GetPluginManager();
3094 TString detName = fgkDetectorName[iDet];
3095 TString recName = "Ali" + detName + "Reconstructor";
3097 if (!fIsNewRunLoader && !fRunLoader->GetLoader(detName+"Loader") && (detName != "HLT")) return NULL;
3099 AliReconstructor* reconstructor = NULL;
3100 // first check if a plugin is defined for the reconstructor
3101 TPluginHandler* pluginHandler =
3102 pluginManager->FindHandler("AliReconstructor", detName);
3103 // if not, add a plugin for it
3104 if (!pluginHandler) {
3105 AliDebug(1, Form("defining plugin for %s", recName.Data()));
3106 TString libs = gSystem->GetLibraries();
3107 if (libs.Contains("lib" + detName + "base.so") ||
3108 (gSystem->Load("lib" + detName + "base.so") >= 0)) {
3109 pluginManager->AddHandler("AliReconstructor", detName,
3110 recName, detName + "rec", recName + "()");
3112 pluginManager->AddHandler("AliReconstructor", detName,
3113 recName, detName, recName + "()");
3115 pluginHandler = pluginManager->FindHandler("AliReconstructor", detName);
3117 if (pluginHandler && (pluginHandler->LoadPlugin() == 0)) {
3118 reconstructor = (AliReconstructor*) pluginHandler->ExecPlugin(0);
3121 // check if the upgrade reconstructor should be used instead of the standard one
3122 if(fUpgradeMask[iDet]) {
3123 if(reconstructor) delete reconstructor;
3124 TClass *cl = new TClass(Form("Ali%sUpgradeReconstructor",fgkDetectorName[iDet]));
3125 reconstructor = (AliReconstructor*)(cl->New());
3128 if (reconstructor) {
3129 TObject* obj = fOptions.FindObject(detName.Data());
3130 if (obj) reconstructor->SetOption(obj->GetTitle());
3131 reconstructor->SetRunInfo(fRunInfo);
3132 reconstructor->Init();
3133 fReconstructor[iDet] = reconstructor;
3136 // get or create the loader
3137 if (detName != "HLT") {
3138 fLoader[iDet] = fRunLoader->GetLoader(detName + "Loader");
3139 if (!fLoader[iDet]) {
3140 AliConfig::Instance()
3141 ->CreateDetectorFolders(fRunLoader->GetEventFolder(),
3143 // first check if a plugin is defined for the loader
3145 pluginManager->FindHandler("AliLoader", detName);
3146 // if not, add a plugin for it
3147 if (!pluginHandler) {
3148 TString loaderName = "Ali" + detName + "Loader";
3149 AliDebug(1, Form("defining plugin for %s", loaderName.Data()));
3150 pluginManager->AddHandler("AliLoader", detName,
3151 loaderName, detName + "base",
3152 loaderName + "(const char*, TFolder*)");
3153 pluginHandler = pluginManager->FindHandler("AliLoader", detName);
3155 if (pluginHandler && (pluginHandler->LoadPlugin() == 0)) {
3157 (AliLoader*) pluginHandler->ExecPlugin(2, detName.Data(),
3158 fRunLoader->GetEventFolder());
3160 if (!fLoader[iDet]) { // use default loader
3161 fLoader[iDet] = new AliLoader(detName, fRunLoader->GetEventFolder());
3163 if (!fLoader[iDet]) {
3164 AliWarning(Form("couldn't get loader for %s", detName.Data()));
3165 if (fStopOnError) return NULL;
3167 fRunLoader->AddLoader(fLoader[iDet]);
3168 fRunLoader->CdGAFile();
3169 if (gFile && !gFile->IsWritable()) gFile->ReOpen("UPDATE");
3170 fRunLoader->Write(0, TObject::kOverwrite);
3175 if (fRecoParam.GetDetRecoParamArray(iDet) && !AliReconstructor::GetRecoParam(iDet)) {
3176 const AliDetectorRecoParam *par = fRecoParam.GetDetRecoParam(iDet);
3177 if (reconstructor) {
3178 reconstructor->SetRecoParam(par);
3179 reconstructor->SetRunInfo(fRunInfo);
3182 return reconstructor;
3185 //_____________________________________________________________________________
3186 AliVertexer* AliReconstruction::CreateVertexer()
3188 // create the vertexer
3189 // Please note that the caller is the owner of the
3192 AliVertexer* vertexer = NULL;
3193 AliReconstructor* itsReconstructor = GetReconstructor(0);
3194 if (itsReconstructor && ((fRunLocalReconstruction.Contains("ITS")) ||
3195 fRunTracking.Contains("ITS") || fFillESD.Contains("ITS") )) {
3196 vertexer = itsReconstructor->CreateVertexer();
3199 AliWarning("couldn't create a vertexer for ITS");
3205 //_____________________________________________________________________________
3206 AliTrackleter* AliReconstruction::CreateMultFinder()
3208 // create the ITS trackleter for mult. estimation
3209 // Please note that the caller is the owner of the
3212 AliTrackleter* trackleter = NULL;
3213 AliReconstructor* itsReconstructor = GetReconstructor(0);
3214 if (itsReconstructor && ((fRunLocalReconstruction.Contains("ITS")) ||
3215 fRunTracking.Contains("ITS") || fFillESD.Contains("ITS") )) {
3216 trackleter = itsReconstructor->CreateMultFinder();
3219 AliWarning("ITS is not in reconstruction, switching off RunMultFinder");
3220 fRunMultFinder = kFALSE;
3226 //_____________________________________________________________________________
3227 Bool_t AliReconstruction::CreateTrackers(const TString& detectors)
3229 // create the trackers
3230 AliInfo("Creating trackers");
3232 TString detStr = detectors;
3233 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
3234 if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
3235 AliReconstructor* reconstructor = GetReconstructor(iDet);
3236 if (!reconstructor) continue;
3237 TString detName = fgkDetectorName[iDet];
3238 if (detName == "HLT") {
3239 fRunHLTTracking = kTRUE;
3242 if (detName == "MUON") {
3243 fRunMuonTracking = kTRUE;
3247 fTracker[iDet] = reconstructor->CreateTracker();
3248 if (!fTracker[iDet] && (iDet < 7)) {
3249 AliWarning(Form("couldn't create a tracker for %s", detName.Data()));
3250 if (fStopOnError) return kFALSE;
3252 AliSysInfo::AddStamp(Form("LTracker%s",fgkDetectorName[iDet]), iDet,0);
3258 //_____________________________________________________________________________
3259 void AliReconstruction::CleanUp()
3261 // delete trackers and the run loader and close and delete the file
3263 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
3264 delete fReconstructor[iDet];
3265 fReconstructor[iDet] = NULL;
3266 fLoader[iDet] = NULL;
3267 delete fTracker[iDet];
3268 fTracker[iDet] = NULL;
3275 delete fSPDTrackleter;
3276 fSPDTrackleter = NULL;
3285 delete fParentRawReader;
3286 fParentRawReader=NULL;
3294 if (AliQAManager::QAManager())
3295 AliQAManager::QAManager()->ShowQA() ;
3296 // AliQAManager::Destroy() ;
3300 void AliReconstruction::WriteAlignmentData(AliESDEvent* esd)
3302 // Write space-points which are then used in the alignment procedures
3303 // For the moment only ITS, TPC, TRD and TOF
3305 Int_t ntracks = esd->GetNumberOfTracks();
3306 for (Int_t itrack = 0; itrack < ntracks; itrack++)
3308 AliESDtrack *track = esd->GetTrack(itrack);
3311 for (Int_t i=0; i<200; ++i) idx[i] = -1; //PH avoid uninitialized values
3312 for (Int_t iDet = 5; iDet >= 0; iDet--) {// TOF, TRD, TPC, ITS clusters
3313 nsp += (iDet==GetDetIndex("TRD")) ? track->GetTRDntracklets():track->GetNcls(iDet);
3315 if (iDet==GetDetIndex("ITS")) { // ITS "extra" clusters
3316 track->GetClusters(iDet,idx);
3317 for (Int_t i=6; i<12; i++) if(idx[i] >= 0) nsp++;
3322 AliTrackPointArray *sp = new AliTrackPointArray(nsp);
3323 track->SetTrackPointArray(sp);
3325 for (Int_t iDet = 5; iDet >= 0; iDet--) {
3326 AliTracker *tracker = fTracker[iDet];
3327 if (!tracker) continue;
3328 Int_t nspdet = (iDet==GetDetIndex("TRD")) ? track->GetTRDtracklets(idx):track->GetClusters(iDet,idx);
3330 if (iDet==GetDetIndex("ITS")) // ITS "extra" clusters
3331 for (Int_t i=6; i<12; i++) if(idx[i] >= 0) nspdet++;
3333 if (nspdet <= 0) continue;
3337 while (isp2 < nspdet) {
3338 Bool_t isvalid=kTRUE;
3340 Int_t index=idx[isp++];
3341 if (index < 0) continue;
3343 TString dets = fgkDetectorName[iDet];
3344 if ((fUseTrackingErrorsForAlignment.CompareTo(dets) == 0) ||
3345 fUseTrackingErrorsForAlignment.BeginsWith(dets+" ") ||
3346 fUseTrackingErrorsForAlignment.EndsWith(" "+dets) ||
3347 fUseTrackingErrorsForAlignment.Contains(" "+dets+" ")) {
3348 isvalid = tracker->GetTrackPointTrackingError(index,p,track);
3350 isvalid = tracker->GetTrackPoint(index,p);
3353 if (!isvalid) continue;
3354 if (iDet==GetDetIndex("ITS") && (isp-1)>=6) p.SetExtra();
3355 sp->AddPoint(isptrack,&p); isptrack++;
3362 //_____________________________________________________________________________
3363 void AliReconstruction::FillRawDataErrorLog(Int_t iEvent, AliESDEvent* esd)
3365 // The method reads the raw-data error log
3366 // accumulated within the rawReader.
3367 // It extracts the raw-data errors related to
3368 // the current event and stores them into
3369 // a TClonesArray inside the esd object.
3371 if (!fRawReader) return;
3373 for(Int_t i = 0; i < fRawReader->GetNumberOfErrorLogs(); i++) {
3375 AliRawDataErrorLog *log = fRawReader->GetErrorLog(i);
3377 if (iEvent != log->GetEventNumber()) continue;
3379 esd->AddRawDataErrorLog(log);
3384 //_____________________________________________________________________________
3385 // void AliReconstruction::CheckQA()
3387 // check the QA of SIM for this run and remove the detectors
3388 // with status Fatal
3390 // TString newRunLocalReconstruction ;
3391 // TString newRunTracking ;
3392 // TString newFillESD ;
3394 // for (Int_t iDet = 0; iDet < AliQAv1::kNDET; iDet++) {
3395 // TString detName(AliQAv1::GetDetName(iDet)) ;
3396 // AliQAv1 * qa = AliQAv1::Instance(AliQAv1::DETECTORINDEX_t(iDet)) ;
3397 // if ( qa->IsSet(AliQAv1::DETECTORINDEX_t(iDet), AliQAv1::kSIM, specie, AliQAv1::kFATAL)) {
3398 // AliInfo(Form("QA status for %s %s in Hits and/or SDIGITS and/or Digits was Fatal; No reconstruction performed",
3399 // detName.Data(), AliRecoParam::GetEventSpecieName(es))) ;
3401 // if ( fRunLocalReconstruction.Contains(AliQAv1::GetDetName(iDet)) ||
3402 // fRunLocalReconstruction.Contains("ALL") ) {
3403 // newRunLocalReconstruction += detName ;
3404 // newRunLocalReconstruction += " " ;
3406 // if ( fRunTracking.Contains(AliQAv1::GetDetName(iDet)) ||
3407 // fRunTracking.Contains("ALL") ) {
3408 // newRunTracking += detName ;
3409 // newRunTracking += " " ;
3411 // if ( fFillESD.Contains(AliQAv1::GetDetName(iDet)) ||
3412 // fFillESD.Contains("ALL") ) {
3413 // newFillESD += detName ;
3414 // newFillESD += " " ;
3418 // fRunLocalReconstruction = newRunLocalReconstruction ;
3419 // fRunTracking = newRunTracking ;
3420 // fFillESD = newFillESD ;
3423 //_____________________________________________________________________________
3424 Int_t AliReconstruction::GetDetIndex(const char* detector)
3426 // return the detector index corresponding to detector
3428 for (index = 0; index < kNDetectors ; index++) {
3429 if ( strcmp(detector, fgkDetectorName[index]) == 0 )
3434 //_____________________________________________________________________________
3435 Bool_t AliReconstruction::FinishPlaneEff() {
3437 // Here execute all the necessary operationis, at the end of the tracking phase,
3438 // in case that evaluation of PlaneEfficiencies was required for some detector.
3439 // E.g., write into a DataBase file the PlaneEfficiency which have been evaluated.
3441 // This Preliminary version works only FOR ITS !!!!!
3442 // other detectors (TOF,TRD, etc. have to develop their specific codes)
3445 // Return: kTRUE if all operations have been done properly, kFALSE otherwise
3448 TString detStr = fLoadCDB;
3449 //for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
3450 for (Int_t iDet = 0; iDet < 1; iDet++) { // for the time being only ITS
3451 if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
3452 if(fTracker[iDet] && fTracker[iDet]->GetPlaneEff()) {
3453 AliPlaneEff *planeeff=fTracker[iDet]->GetPlaneEff();
3454 TString name=planeeff->GetName();
3456 TFile* pefile = TFile::Open(name, "RECREATE");
3457 ret=(Bool_t)planeeff->Write();
3459 if(planeeff->GetCreateHistos()) {
3460 TString hname=planeeff->GetName();
3461 hname+="Histo.root";
3462 ret*=planeeff->WriteHistosToFile(hname,"RECREATE");
3465 if(fSPDTrackleter) {
3466 AliPlaneEff *planeeff=fSPDTrackleter->GetPlaneEff();
3467 TString name="AliITSPlaneEffSPDtracklet.root";
3468 TFile* pefile = TFile::Open(name, "RECREATE");
3469 ret=(Bool_t)planeeff->Write();
3471 AliESDEvent *dummy=NULL;
3472 ret=(Bool_t)fSPDTrackleter->PostProcess(dummy); // take care of writing other files
3477 //_____________________________________________________________________________
3478 Bool_t AliReconstruction::InitPlaneEff() {
3480 // Here execute all the necessary operations, before of the tracking phase,
3481 // for the evaluation of PlaneEfficiencies, in case required for some detectors.
3482 // E.g., read from a DataBase file a first evaluation of the PlaneEfficiency
3483 // which should be updated/recalculated.
3485 // This Preliminary version will work only FOR ITS !!!!!
3486 // other detectors (TOF,TRD, etc. have to develop their specific codes)
3489 // Return: kTRUE if all operations have been done properly, kFALSE otherwise
3492 fSPDTrackleter = NULL;
3493 TString detStr = fLoadCDB;
3494 if (IsSelected(fgkDetectorName[0], detStr)) {
3495 AliReconstructor* itsReconstructor = GetReconstructor(0);
3496 if (itsReconstructor) {
3497 fSPDTrackleter = itsReconstructor->CreateTrackleter(); // this is NULL unless required in RecoParam
3499 if (fSPDTrackleter) {
3500 AliInfo("Trackleter for SPD has been created");
3506 //_____________________________________________________________________________
3507 Bool_t AliReconstruction::InitAliEVE()
3509 // This method should be called only in case
3510 // AliReconstruction is run
3511 // within the alieve environment.
3512 // It will initialize AliEVE in a way
3513 // so that it can visualize event processed
3514 // by AliReconstruction.
3515 // The return flag shows whenever the
3516 // AliEVE initialization was successful or not.
3518 TString macroStr(gSystem->Getenv("ALIEVE_ONLINE_MACRO"));
3520 if (macroStr.IsNull())
3521 macroStr.Form("%s/EVE/macros/alieve_online.C",gSystem->ExpandPathName("$ALICE_ROOT"));
3523 AliInfo(Form("Loading AliEVE macro: %s",macroStr.Data()));
3525 if (gROOT->LoadMacro(macroStr.Data()) != 0) return kFALSE;
3527 gROOT->ProcessLine("if (!AliEveEventManager::GetMaster()){new AliEveEventManager();AliEveEventManager::GetMaster()->AddNewEventCommand(\"alieve_online_on_new_event()\");gEve->AddEvent(AliEveEventManager::GetMaster());};");
3528 gROOT->ProcessLine("alieve_online_init()");
3533 //_____________________________________________________________________________
3534 void AliReconstruction::RunAliEVE()
3536 // Runs AliEVE visualisation of
3537 // the current event.
3538 // Should be executed only after
3539 // successful initialization of AliEVE.
3541 AliInfo("Running AliEVE...");
3542 gROOT->ProcessLine(Form("AliEveEventManager::GetMaster()->SetEvent((AliRunLoader*)%p,(AliRawReader*)%p,(AliESDEvent*)%p,(AliESDfriend*)%p);",fRunLoader,fRawReader,fesd,fesdf));
3546 //_____________________________________________________________________________
3547 Bool_t AliReconstruction::SetRunQA(TString detAndAction)
3549 // Allows to run QA for a selected set of detectors
3550 // and a selected set of tasks among RAWS, DIGITSR, RECPOINTS and ESDS
3551 // all selected detectors run the same selected tasks
3553 if (!detAndAction.Contains(":")) {
3554 AliError( Form("%s is a wrong syntax, use \"DetectorList:ActionList\" \n", detAndAction.Data()) ) ;
3558 Int_t colon = detAndAction.Index(":") ;
3559 fQADetectors = detAndAction(0, colon) ;
3560 fQATasks = detAndAction(colon+1, detAndAction.Sizeof() ) ;
3561 if (fQATasks.Contains("ALL") ) {
3562 fQATasks = Form("%d %d %d %d", AliQAv1::kRAWS, AliQAv1::kDIGITSR, AliQAv1::kRECPOINTS, AliQAv1::kESDS) ;
3564 fQATasks.ToUpper() ;
3566 if ( fQATasks.Contains("RAW") )
3567 tempo = Form("%d ", AliQAv1::kRAWS) ;
3568 if ( fQATasks.Contains("DIGIT") )
3569 tempo += Form("%d ", AliQAv1::kDIGITSR) ;
3570 if ( fQATasks.Contains("RECPOINT") )
3571 tempo += Form("%d ", AliQAv1::kRECPOINTS) ;
3572 if ( fQATasks.Contains("ESD") )
3573 tempo += Form("%d ", AliQAv1::kESDS) ;
3575 if (fQATasks.IsNull()) {
3576 AliInfo("No QA requested\n") ;
3581 TString tempo(fQATasks) ;
3582 tempo.ReplaceAll(Form("%d", AliQAv1::kRAWS), AliQAv1::GetTaskName(AliQAv1::kRAWS)) ;
3583 tempo.ReplaceAll(Form("%d", AliQAv1::kDIGITSR), AliQAv1::GetTaskName(AliQAv1::kDIGITSR)) ;
3584 tempo.ReplaceAll(Form("%d", AliQAv1::kRECPOINTS), AliQAv1::GetTaskName(AliQAv1::kRECPOINTS)) ;
3585 tempo.ReplaceAll(Form("%d", AliQAv1::kESDS), AliQAv1::GetTaskName(AliQAv1::kESDS)) ;
3586 AliInfo( Form("QA will be done on \"%s\" for \"%s\"\n", fQADetectors.Data(), tempo.Data()) ) ;
3591 //_____________________________________________________________________________
3592 Bool_t AliReconstruction::InitRecoParams()
3594 // The method accesses OCDB and retrieves all
3595 // the available reco-param objects from there.
3597 Bool_t isOK = kTRUE;
3599 if (fRecoParam.GetDetRecoParamArray(kNDetectors)) {
3600 AliInfo("Using custom GRP reconstruction parameters");
3603 AliInfo("Loading GRP reconstruction parameter objects");
3605 AliCDBPath path("GRP","Calib","RecoParam");
3606 AliCDBEntry *entry=AliCDBManager::Instance()->Get(path.GetPath());
3608 AliWarning("Couldn't find GRP RecoParam entry in OCDB");
3612 TObject *recoParamObj = entry->GetObject();
3613 if (dynamic_cast<TObjArray*>(recoParamObj)) {
3614 // GRP has a normal TobjArray of AliDetectorRecoParam objects
3615 // Registering them in AliRecoParam
3616 fRecoParam.AddDetRecoParamArray(kNDetectors,dynamic_cast<TObjArray*>(recoParamObj));
3618 else if (dynamic_cast<AliDetectorRecoParam*>(recoParamObj)) {
3619 // GRP has only onse set of reco parameters
3620 // Registering it in AliRecoParam
3621 AliInfo("Single set of GRP reconstruction parameters found");
3622 dynamic_cast<AliDetectorRecoParam*>(recoParamObj)->SetAsDefault();
3623 fRecoParam.AddDetRecoParam(kNDetectors,dynamic_cast<AliDetectorRecoParam*>(recoParamObj));
3626 AliError("No valid GRP RecoParam object found in the OCDB");
3633 TString detStr = fLoadCDB;
3634 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
3636 if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
3638 if (fRecoParam.GetDetRecoParamArray(iDet)) {
3639 AliInfo(Form("Using custom reconstruction parameters for detector %s",fgkDetectorName[iDet]));
3643 AliInfo(Form("Loading reconstruction parameter objects for detector %s",fgkDetectorName[iDet]));
3645 AliCDBPath path(fgkDetectorName[iDet],"Calib","RecoParam");
3646 AliCDBEntry *entry=AliCDBManager::Instance()->Get(path.GetPath());
3648 AliWarning(Form("Couldn't find RecoParam entry in OCDB for detector %s",fgkDetectorName[iDet]));
3652 TObject *recoParamObj = entry->GetObject();
3653 if (dynamic_cast<TObjArray*>(recoParamObj)) {
3654 // The detector has a normal TobjArray of AliDetectorRecoParam objects
3655 // Registering them in AliRecoParam
3656 fRecoParam.AddDetRecoParamArray(iDet,dynamic_cast<TObjArray*>(recoParamObj));
3658 else if (dynamic_cast<AliDetectorRecoParam*>(recoParamObj)) {
3659 // The detector has only onse set of reco parameters
3660 // Registering it in AliRecoParam
3661 AliInfo(Form("Single set of reconstruction parameters found for detector %s",fgkDetectorName[iDet]));
3662 dynamic_cast<AliDetectorRecoParam*>(recoParamObj)->SetAsDefault();
3663 fRecoParam.AddDetRecoParam(iDet,dynamic_cast<AliDetectorRecoParam*>(recoParamObj));
3666 AliError(Form("No valid RecoParam object found in the OCDB for detector %s",fgkDetectorName[iDet]));
3670 // FIX ME: We have to disable the unloading of reco-param CDB
3671 // entries because QA framework is using them. Has to be fix in
3672 // a way that the QA takes the objects already constructed in
3674 // AliCDBManager::Instance()->UnloadFromCache(path.GetPath());
3678 if (AliDebugLevel() > 0) fRecoParam.Print();
3683 //_____________________________________________________________________________
3684 Bool_t AliReconstruction::GetEventInfo()
3686 // Fill the event info object
3688 AliCodeTimerAuto("",0)
3690 AliCentralTrigger *aCTP = NULL;
3692 fEventInfo.SetEventType(fRawReader->GetType());
3694 ULong64_t mask = fRawReader->GetClassMask();
3695 fEventInfo.SetTriggerMask(mask);
3696 UInt_t clmask = fRawReader->GetDetectorPattern()[0];
3697 fEventInfo.SetTriggerCluster(AliDAQ::ListOfTriggeredDetectors(clmask));
3699 aCTP = new AliCentralTrigger();
3700 TString configstr("");
3701 if (!aCTP->LoadConfiguration(configstr)) { // Load CTP config from OCDB
3702 AliError("No trigger configuration found in OCDB! The trigger configuration information will not be used!");
3706 aCTP->SetClassMask(mask);
3707 aCTP->SetClusterMask(clmask);
3709 AliCentralTrigger* rlCTP = fRunLoader->GetTrigger();
3710 rlCTP->SetClassMask(mask);
3711 rlCTP->SetClusterMask(clmask);
3714 fEventInfo.SetEventType(AliRawEventHeaderBase::kPhysicsEvent);
3716 if (fRunLoader && (!fRunLoader->LoadTrigger())) {
3717 aCTP = fRunLoader->GetTrigger();
3718 fEventInfo.SetTriggerMask(aCTP->GetClassMask());
3719 // get inputs from actp - just get
3720 AliESDHeader* esdheader = fesd->GetHeader();
3721 esdheader->SetL0TriggerInputs(aCTP->GetL0TriggerInputs());
3722 esdheader->SetL1TriggerInputs(aCTP->GetL1TriggerInputs());
3723 esdheader->SetL2TriggerInputs(aCTP->GetL2TriggerInputs());
3724 fEventInfo.SetTriggerCluster(AliDAQ::ListOfTriggeredDetectors(aCTP->GetClusterMask()));
3727 AliWarning("No trigger can be loaded! The trigger information will not be used!");
3732 AliTriggerConfiguration *config = aCTP->GetConfiguration();
3734 AliError("No trigger configuration has been found! The trigger configuration information will not be used!");
3735 if (fRawReader) delete aCTP;
3739 UChar_t clustmask = 0;
3741 ULong64_t trmask = fEventInfo.GetTriggerMask();
3742 const TObjArray& classesArray = config->GetClasses();
3743 Int_t nclasses = classesArray.GetEntriesFast();
3744 for( Int_t iclass=0; iclass < nclasses; iclass++ ) {
3745 AliTriggerClass* trclass = (AliTriggerClass*)classesArray.At(iclass);
3746 if (trclass && trclass->GetMask()>0) {
3747 Int_t trindex = TMath::Nint(TMath::Log2(trclass->GetMask()));
3748 fesd->SetTriggerClass(trclass->GetName(),trindex);
3749 if (fRawReader) fRawReader->LoadTriggerClass(trclass->GetName(),trindex);
3750 if (trmask & (1ull << trindex)) {
3752 trclasses += trclass->GetName();
3754 clustmask |= trclass->GetCluster()->GetClusterMask();
3758 fEventInfo.SetTriggerClasses(trclasses);
3760 // Write names of active trigger inputs in ESD Header
3761 const TObjArray& inputsArray = config->GetInputs();
3762 Int_t ninputs = inputsArray.GetEntriesFast();
3763 for( Int_t iinput=0; iinput < ninputs; iinput++ ) {
3764 AliTriggerInput* trginput = (AliTriggerInput*)inputsArray.At(iinput);
3765 if (trginput && trginput->GetMask()>0) {
3766 Int_t inputIndex = (Int_t)TMath::Nint(TMath::Log2(trginput->GetMask()));
3767 AliESDHeader* headeresd = fesd->GetHeader();
3768 Int_t trglevel = (Int_t)trginput->GetLevel();
3769 if (trglevel == 0) headeresd->SetActiveTriggerInputs(trginput->GetInputName(), inputIndex);
3770 if (trglevel == 1) headeresd->SetActiveTriggerInputs(trginput->GetInputName(), inputIndex+24);
3771 if (trglevel == 2) headeresd->SetActiveTriggerInputs(trginput->GetInputName(), inputIndex+48);
3775 // Set the information in ESD
3776 fesd->SetTriggerMask(trmask);
3777 fesd->SetTriggerCluster(clustmask);
3779 if (!aCTP->CheckTriggeredDetectors()) {
3780 if (fRawReader) delete aCTP;
3784 if (fRawReader) delete aCTP;
3786 // We have to fill also the HLT decision here!!
3792 const char *AliReconstruction::MatchDetectorList(const char *detectorList, UInt_t detectorMask)
3794 // Match the detector list found in the rec.C or the default 'ALL'
3795 // to the list found in the GRP (stored there by the shuttle PP which
3796 // gets the information from ECS)
3797 static TString resultList;
3798 TString detList = detectorList;
3802 for(Int_t iDet = 0; iDet < (AliDAQ::kNDetectors-1); iDet++) {
3803 if ((detectorMask >> iDet) & 0x1) {
3804 TString det = AliDAQ::OfflineModuleName(iDet);
3805 if ((detList.CompareTo("ALL") == 0) ||
3806 ((detList.BeginsWith("ALL ") ||
3807 detList.EndsWith(" ALL") ||
3808 detList.Contains(" ALL ")) &&
3809 !(detList.BeginsWith("-"+det+" ") ||
3810 detList.EndsWith(" -"+det) ||
3811 detList.Contains(" -"+det+" "))) ||
3812 (detList.CompareTo(det) == 0) ||
3813 detList.BeginsWith(det+" ") ||
3814 detList.EndsWith(" "+det) ||
3815 detList.Contains( " "+det+" " )) {
3816 if (!resultList.EndsWith(det + " ")) {
3825 if ((detectorMask >> AliDAQ::kHLTId) & 0x1) {
3826 TString hltDet = AliDAQ::OfflineModuleName(AliDAQ::kNDetectors-1);
3827 if ((detList.CompareTo("ALL") == 0) ||
3828 ((detList.BeginsWith("ALL ") ||
3829 detList.EndsWith(" ALL") ||
3830 detList.Contains(" ALL ")) &&
3831 !(detList.BeginsWith("-"+hltDet+" ") ||
3832 detList.EndsWith(" -"+hltDet) ||
3833 detList.Contains(" -"+hltDet+" "))) ||
3834 (detList.CompareTo(hltDet) == 0) ||
3835 detList.BeginsWith(hltDet+" ") ||
3836 detList.EndsWith(" "+hltDet) ||
3837 detList.Contains( " "+hltDet+" " )) {
3838 resultList += hltDet;
3842 return resultList.Data();
3846 //______________________________________________________________________________
3847 void AliReconstruction::Abort(const char *method, EAbort what)
3849 // Abort processing. If what = kAbortProcess, the Process() loop will be
3850 // aborted. If what = kAbortFile, the current file in a chain will be
3851 // aborted and the processing will continue with the next file, if there
3852 // is no next file then Process() will be aborted. Abort() can also be
3853 // called from Begin(), SlaveBegin(), Init() and Notify(). After abort
3854 // the SlaveTerminate() and Terminate() are always called. The abort flag
3855 // can be checked in these methods using GetAbort().
3857 // The method is overwritten in AliReconstruction for better handling of
3858 // reco specific errors
3860 if (!fStopOnError) return;
3864 TString whyMess = method;
3865 whyMess += " failed! Aborting...";
3867 AliError(whyMess.Data());
3870 TString mess = "Abort";
3871 if (fAbort == kAbortProcess)
3872 mess = "AbortProcess";
3873 else if (fAbort == kAbortFile)
3876 Info(mess, whyMess.Data());
3879 //______________________________________________________________________________
3880 Bool_t AliReconstruction::ProcessEvent(void* event)
3882 // Method that is used in case the event loop
3883 // is steered from outside, for example by AMORE
3884 // 'event' is a pointer to the DATE event in the memory
3886 if (fRawReader) delete fRawReader;
3887 fRawReader = new AliRawReaderDate(event);
3888 fStatus = ProcessEvent(fRunLoader->GetNumberOfEvents());
3895 //______________________________________________________________________________
3896 Bool_t AliReconstruction::ParseOutput()
3898 // The method parses the output file
3899 // location string in order to steer
3900 // properly the selector
3902 TPMERegexp re1("(\\w+\\.zip#\\w+\\.root):([,*\\w+\\.root,*]+)@dataset://(\\w++)");
3903 TPMERegexp re2("(\\w+\\.root)?@?dataset://(\\w++)");
3905 if (re1.Match(fESDOutput) == 4) {
3906 // root archive with output files stored and regustered
3908 gProof->AddInput(new TNamed("PROOF_OUTPUTFILE",re1[1].Data()));
3909 gProof->AddInput(new TNamed("PROOF_OUTPUTFILE_LOCATION",re1[3].Data()));
3910 gProof->AddInput(new TNamed("PROOF_OUTPUTFILE_DATASET",""));
3911 gProof->AddInput(new TNamed("PROOF_OUTPUTFILE_ARCHIVE",re1[2].Data()));
3912 AliInfo(Form("%s files will be stored within %s in dataset %s",
3917 else if (re2.Match(fESDOutput) == 3) {
3918 // output file stored and registered
3920 gProof->AddInput(new TNamed("PROOF_OUTPUTFILE",(re2[1].IsNull()) ? "AliESDs.root" : re2[1].Data()));
3921 gProof->AddInput(new TNamed("PROOF_OUTPUTFILE_LOCATION",re2[2].Data()));
3922 gProof->AddInput(new TNamed("PROOF_OUTPUTFILE_DATASET",""));
3923 AliInfo(Form("%s will be stored in dataset %s",
3924 (re2[1].IsNull()) ? "AliESDs.root" : re2[1].Data(),
3928 if (fESDOutput.IsNull()) {
3929 // Output location not given.
3930 // Assuming xrootd has been already started and
3931 // the output file has to be sent back
3932 // to the client machine
3933 TString esdUrl(Form("root://%s/%s/",
3934 TUrl(gSystem->HostName()).GetHostFQDN(),
3936 gProof->AddInput(new TNamed("PROOF_OUTPUTFILE","AliESDs.root"));
3937 gProof->AddInput(new TNamed("PROOF_OUTPUTFILE_LOCATION",esdUrl.Data()));
3938 AliInfo(Form("AliESDs.root will be stored in %s",
3942 // User specified an output location.
3943 // Ones has just to parse it here
3944 TUrl outputUrl(fESDOutput.Data());
3945 TString outputFile(gSystem->BaseName(outputUrl.GetFile()));
3946 gProof->AddInput(new TNamed("PROOF_OUTPUTFILE",outputFile.IsNull() ? "AliESDs.root" : outputFile.Data()));
3947 TString outputLocation(outputUrl.GetUrl());
3948 outputLocation.ReplaceAll(outputFile.Data(),"");
3949 gProof->AddInput(new TNamed("PROOF_OUTPUTFILE_LOCATION",outputLocation.Data()));
3950 AliInfo(Form("%s will be stored in %s",
3951 outputFile.IsNull() ? "AliESDs.root" : outputFile.Data(),
3952 outputLocation.Data()));
3959 //______________________________________________________________________________
3960 Bool_t AliReconstruction::IsHighPt() const {
3961 // Selection of events containing "high" pT tracks
3962 // If at least one track is found within 1.5 and 100 GeV (pT)
3963 // that was reconstructed by both ITS and TPC, the event is accepted
3966 const Double_t pTmin = 1.5;
3967 const Double_t pTmax = 100;
3969 mask |= (AliESDtrack::kITSrefit);
3970 mask |= (AliESDtrack::kTPCrefit);
3971 const Double_t pTminCosmic = 5.;
3972 const Double_t pTmaxCosmic = 100;
3973 ULong_t maskCosmic = 0;
3974 Int_t cosmicCount=0;
3975 maskCosmic |= (AliESDtrack::kTPCrefit);
3977 Bool_t isOK = kFALSE;
3979 if (fesd && fesd->GetEventType()==AliRawEventHeaderBase::kPhysicsEvent) {
3980 // Check if this ia a physics event (code 7)
3981 Int_t ntrk = fesd->GetNumberOfTracks();
3982 for (Int_t itrk=0; itrk<ntrk; ++itrk) {
3984 AliESDtrack * trk = fesd->GetTrack(itrk);
3986 && trk->Pt() > pTmin
3987 && trk->Pt() < pTmax
3988 && (trk->GetStatus() & mask) == mask ) {
3994 && trk->GetInnerParam()
3995 && trk->GetInnerParam()->Pt() > pTminCosmic
3996 && trk->GetInnerParam()->Pt() < pTmaxCosmic
3997 && (trk->GetStatus() & maskCosmic) == maskCosmic ) {
4003 if (cosmicCount>1) isOK=kTRUE;
4008 //______________________________________________________________________________
4009 Bool_t AliReconstruction::IsCosmicOrCalibSpecie() const {
4010 // Select cosmic or calibration events
4012 Bool_t isOK = kFALSE;
4014 if (fesd && fesd->GetEventType()==AliRawEventHeaderBase::kPhysicsEvent) {
4015 // Check if this ia a physics event (code 7)
4017 UInt_t specie = fesd->GetEventSpecie();
4018 if (specie==AliRecoParam::kCosmic || specie==AliRecoParam::kCalib) {
4025 //______________________________________________________________________________
4026 void AliReconstruction::WriteESDfriend() {
4027 // Fill the ESD friend in the tree. The required fraction of ESD friends is stored
4028 // in fFractionFriends. We select events where we store the ESD friends according
4029 // to the following algorithm:
4030 // 1. Store all Cosmic or Calibration events within the required fraction
4031 // 2. Sample "high Pt" events within the remaining fraction after step 1.
4032 // 3. Sample randomly events if we still have remaining slot
4035 Bool_t isSelected = kFALSE;
4037 // Store all friends for B field OFF
4038 if (TMath::Abs(AliTrackerBase::GetBz())<0.5) isSelected=kTRUE;
4040 if (IsCosmicOrCalibSpecie()) { // Selection of calib or cosmic events
4042 Double_t curentSpecieFraction = ((Double_t)(fNspecie+1))/((Double_t)(fNall+1));
4043 // "Bayesian" estimate supposing that without events all the events are of the required type
4045 Double_t rnd = gRandom->Rndm()*curentSpecieFraction;
4046 if (rnd<fFractionFriends) {
4052 Double_t remainingFraction = fFractionFriends;
4053 remainingFraction -= ((Double_t)(fSspecie)/(Double_t)(fNall));
4055 if (IsHighPt()) { // Selection of "high Pt" events
4057 Double_t curentHighPtFraction = ((Double_t)(fNhighPt+1))/((Double_t)(fNall+1));
4058 // "Bayesian" estimate supposing that without events all the events are of the required type
4061 Double_t rnd = gRandom->Rndm()*curentHighPtFraction;
4062 if (rnd<remainingFraction) {
4068 remainingFraction -= ((Double_t)(fShighPt)/(Double_t)(fNall));
4070 // Random selection to fill the remaining fraction (if any)
4072 Double_t rnd = gRandom->Rndm();
4073 if (rnd<remainingFraction) {
4079 fesdf->~AliESDfriend();
4080 new (fesdf) AliESDfriend(); // Reset...
4081 fesdf->SetSkipBit(kTRUE);