]> git.uio.no Git - u/mrichter/AliRoot.git/blame - STEER/AliReconstruction.cxx
added TOF calibration library and code for pass0/passX calibration
[u/mrichter/AliRoot.git] / STEER / AliReconstruction.cxx
CommitLineData
596a855f 1/**************************************************************************
2 * Copyright(c) 1998-1999, ALICE Experiment at CERN, All rights reserved. *
fc07289e 3 * *
596a855f 4 * Author: The ALICE Off-line Project. *
5 * Contributors are mentioned in the code where appropriate. *
6 * *
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 **************************************************************************/
15
16/* $Id$ */
17
18///////////////////////////////////////////////////////////////////////////////
19// //
20// class for running the reconstruction //
21// //
22// Clusters and tracks are created for all detectors and all events by //
23// typing: //
24// //
25// AliReconstruction rec; //
26// rec.Run(); //
27// //
28// The Run method returns kTRUE in case of successful execution. //
c71de921 29// //
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 //
32// //
33// rec.SetInput("..."); //
34// //
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 //
40// //
b26c3770 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 //
44// //
45// rec.SetEventRange(..., ...); //
46// //
47// The index -1 (default) can be used for the last event to indicate no //
48// upper limit of the event range. //
49// //
973388c2 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): //
55// //
56// rec.SetNumberOfEventsPerFile(...); //
57// //
58// //
596a855f 59// The name of the galice file can be changed from the default //
e583c30d 60// "galice.root" by passing it as argument to the AliReconstruction //
61// constructor or by //
596a855f 62// //
63// rec.SetGAliceFile("..."); //
64// //
59697224 65// The local reconstruction can be switched on or off for individual //
66// detectors by //
596a855f 67// //
59697224 68// rec.SetRunLocalReconstruction("..."); //
596a855f 69// //
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. //
73// //
c71de921 74// The reconstruction of the primary vertex position can be switched off by //
75// //
76// rec.SetRunVertexFinder(kFALSE); //
77// //
b8cd5251 78// The tracking and the creation of ESD tracks can be switched on for //
79// selected detectors by //
596a855f 80// //
b8cd5251 81// rec.SetRunTracking("..."); //
596a855f 82// //
c84a5e9e 83// Uniform/nonuniform field tracking switches (default: uniform field) //
84// //
1d99986f 85// rec.SetUniformFieldTracking(); ( rec.SetUniformFieldTracking(kFALSE); ) //
c84a5e9e 86// //
596a855f 87// The filling of additional ESD information can be steered by //
88// //
89// rec.SetFillESD("..."); //
90// //
b8cd5251 91// Again, for both methods the string specifies the list of detectors. //
92// The default is "ALL". //
93// //
94// The call of the shortcut method //
95// //
96// rec.SetRunReconstruction("..."); //
97// //
98// is equivalent to calling SetRunLocalReconstruction, SetRunTracking and //
99// SetFillESD with the same detector selecting string as argument. //
596a855f 100// //
c71de921 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. //
596a855f 103// //
cd0b062e 104// The input data of a detector can be replaced by the corresponding HLT //
105// data by calling (usual detector string) //
106// SetUseHLTData("..."); //
107// //
24f7a148 108// //
596a855f 109///////////////////////////////////////////////////////////////////////////////
110
f7a1cc68 111#include <TArrayD.h>
024a7e64 112#include <TArrayF.h>
f7a1cc68 113#include <TArrayS.h>
114#include <TChain.h>
024a7e64 115#include <TFile.h>
f7a1cc68 116#include <TGeoGlobalMagField.h>
3103d196 117#include <TGeoManager.h>
f7a1cc68 118#include <TList.h>
2bdb9d38 119#include <TLorentzVector.h>
325aa76f 120#include <TMap.h>
f7a1cc68 121#include <TObjArray.h>
122#include <TPRegexp.h>
123#include <TParameter.h>
124#include <TPluginManager.h>
4b71572b 125#include <TProof.h>
db4aeca1 126#include <TProofOutputFile.h>
f7a1cc68 127#include <TROOT.h>
128#include <TSystem.h>
77ba28ba 129#include <THashTable.h>
6c6f2624 130#include <TGrid.h>
131#include <TMessage.h>
0a035be5 132#include <TUrl.h>
fc01854a 133#include <TRandom.h>
596a855f 134
f7a1cc68 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"
87932dab 142#include "AliCodeTimer.h"
f7a1cc68 143#include "AliDAQ.h"
144#include "AliDetectorRecoParam.h"
145#include "AliESDCaloCells.h"
146#include "AliESDCaloCluster.h"
af885e0f 147#include "AliESDEvent.h"
faffd83e 148#include "AliESDMuonTrack.h"
f7a1cc68 149#include "AliESDPmdTrack.h"
150#include "AliESDTagCreator.h"
2257f27e 151#include "AliESDVertex.h"
faffd83e 152#include "AliESDcascade.h"
f7a1cc68 153#include "AliESDfriend.h"
faffd83e 154#include "AliESDkink.h"
596a855f 155#include "AliESDpid.h"
ff8bb5ae 156#include "AliESDtrack.h"
f7a1cc68 157#include "AliESDtrack.h"
158#include "AliEventInfo.h"
159#include "AliGRPObject.h"
160#include "AliGRPRecoParam.h"
161#include "AliGenEventHeader.h"
25be1e5c 162#include "AliGeomManager.h"
aa3c69a9 163#include "AliGlobalQADataMaker.h"
f7a1cc68 164#include "AliHeader.h"
165#include "AliLog.h"
166#include "AliMagF.h"
167#include "AliMultiplicity.h"
168#include "AliPID.h"
169#include "AliPlaneEff.h"
4e25ac79 170#include "AliQAv1.h"
f7a1cc68 171#include "AliQADataMakerRec.h"
b03591ab 172#include "AliQAManager.h"
33314186 173#include "AliRawVEvent.h"
f7a1cc68 174#include "AliRawEventHeaderBase.h"
cd0b062e 175#include "AliRawHLTManager.h"
f7a1cc68 176#include "AliRawReaderDate.h"
177#include "AliRawReaderFile.h"
178#include "AliRawReaderRoot.h"
179#include "AliReconstruction.h"
180#include "AliReconstructor.h"
181#include "AliRun.h"
7e88424f 182#include "AliRunInfo.h"
f7a1cc68 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"
a6dd87ad 189#include "AliTriggerIR.h"
f7a1cc68 190#include "AliTriggerConfiguration.h"
191#include "AliV0vertexer.h"
192#include "AliVertexer.h"
1f9831ab 193#include "AliTrackleter.h"
f7a1cc68 194#include "AliVertexerTracks.h"
52dd4a8c 195#include "AliTriggerRunScalers.h"
196#include "AliCTPTimeParams.h"
8b12d288 197#include "AliESDHLTDecision.h"
6ef9caeb 198#include "AliTriggerInput.h"
3d84ad67 199#include "AliLHCData.h"
596a855f 200ClassImp(AliReconstruction)
201
c757bafd 202//_____________________________________________________________________________
ac4a7581 203const char* AliReconstruction::fgkDetectorName[AliReconstruction::kNDetectors] = {"ITS", "TPC", "TRD", "TOF", "PHOS", "HMPID", "EMCAL", "MUON", "FMD", "ZDC", "PMD", "T0", "VZERO", "ACORDE", "HLT"};
c757bafd 204
596a855f 205//_____________________________________________________________________________
4b71572b 206AliReconstruction::AliReconstruction(const char* gAliceFilename) :
207 TSelector(),
2257f27e 208 fRunVertexFinder(kTRUE),
a84e2607 209 fRunVertexFinderTracks(kTRUE),
1f46a9ae 210 fRunHLTTracking(kFALSE),
e66fbafb 211 fRunMuonTracking(kFALSE),
d1683eef 212 fRunV0Finder(kTRUE),
213 fRunCascadeFinder(kTRUE),
1f9831ab 214 fRunMultFinder(kTRUE),
c8025cc8 215 fStopOnError(kTRUE),
1d99986f 216 fWriteAlignmentData(kFALSE),
217 fWriteESDfriend(kFALSE),
b647652d 218 fFillTriggerESD(kTRUE),
1d99986f 219
7f68891d 220 fCleanESD(kTRUE),
a023d8d8 221 fV0DCAmax(3.),
222 fV0CsPmin(0.),
7f68891d 223 fDmax(50.),
224 fZmax(50.),
225
1d99986f 226 fRunLocalReconstruction("ALL"),
b8cd5251 227 fRunTracking("ALL"),
e583c30d 228 fFillESD("ALL"),
7d566c20 229 fLoadCDB(""),
48ce48d1 230 fUseTrackingErrorsForAlignment(""),
e583c30d 231 fGAliceFileName(gAliceFilename),
4b71572b 232 fRawInput(""),
975320a0 233 fESDOutput(""),
81d57268 234 fProofOutputFileName(""),
235 fProofOutputLocation(""),
236 fProofOutputDataset(kFALSE),
237 fProofOutputArchive(""),
35042093 238 fEquipIdMap(""),
b26c3770 239 fFirstEvent(0),
240 fLastEvent(-1),
9d705769 241 fNumberOfEventsPerFile((UInt_t)-1),
fc01854a 242 fFractionFriends(0.04),
b8cd5251 243 fOptions(),
6bae477a 244 fLoadAlignFromCDB(kTRUE),
245 fLoadAlignData("ALL"),
cd0b062e 246 fUseHLTData(),
7e88424f 247 fRunInfo(NULL),
248 fEventInfo(),
522fdd91 249 fRunScalers(NULL),
52dd4a8c 250 fCTPTimeParams(NULL),
c7ff1a33 251 fCTPTimeAlign(NULL),
e583c30d 252
253 fRunLoader(NULL),
b649205a 254 fRawReader(NULL),
cd0b062e 255 fParentRawReader(NULL),
b8cd5251 256
7e88424f 257 fRecoParam(),
258
58e8dc31 259 fSPDTrackleter(NULL),
260
f2a195c1 261 fDiamondProfileSPD(NULL),
9178838a 262 fDiamondProfile(NULL),
43c9dae1 263 fDiamondProfileTPC(NULL),
77ba28ba 264 fListOfCosmicTriggers(NULL),
f2a195c1 265
6b6e4472 266 fGRPData(NULL),
444753c6 267
6bae477a 268 fAlignObjArray(NULL),
795e4a22 269 fCDBUri(),
f1c1204d 270 fQARefUri(),
759c1df1 271 fSpecCDBUri(),
795e4a22 272 fInitCDBCalled(kFALSE),
273 fSetRunNumberFromDataCalled(kFALSE),
ce43afbe 274 fQADetectors("ALL"),
275 fQATasks("ALL"),
7e963665 276 fRunQA(kTRUE),
6b150027 277 fRunGlobalQA(kTRUE),
e4a998ed 278 fSameQACycle(kFALSE),
f1c1204d 279 fInitQACalled(kFALSE),
75373542 280 fWriteQAExpertData(kTRUE),
21a3aa09 281 fRunPlaneEff(kFALSE),
282
283 fesd(NULL),
284 fhltesd(NULL),
285 fesdf(NULL),
286 ffile(NULL),
ee7c441c 287 ffileF(NULL),
21a3aa09 288 ftree(NULL),
ee7c441c 289 ftreeF(NULL),
21a3aa09 290 fhlttree(NULL),
21a3aa09 291 ftVertexer(NULL),
14dd053c 292 fIsNewRunLoader(kFALSE),
4b71572b 293 fRunAliEVE(kFALSE),
f00558b6 294 fChain(NULL),
295 fNall(0),
296 fNspecie(0),
297 fSspecie(0),
298 fNhighPt(0),
299 fShighPt(0)
596a855f 300{
301// create reconstruction object with default parameters
002c9d1b 302 gGeoManager = NULL;
b8cd5251 303
ac4a7581 304 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
b8cd5251 305 fReconstructor[iDet] = NULL;
306 fLoader[iDet] = NULL;
307 fTracker[iDet] = NULL;
308 }
4e25ac79 309 for (Int_t iDet = 0; iDet < AliQAv1::kNDET; iDet++) {
252f8aa8 310 fQACycles[iDet] = 999999 ;
311 fQAWriteExpert[iDet] = kFALSE ;
312 }
3d84ad67 313 fBeamInt[0][0]=fBeamInt[0][1]=fBeamInt[1][0]=fBeamInt[1][1] = -1;
314
e47c4c2e 315 AliPID pid;
596a855f 316}
317
318//_____________________________________________________________________________
319AliReconstruction::AliReconstruction(const AliReconstruction& rec) :
4b71572b 320 TSelector(),
2257f27e 321 fRunVertexFinder(rec.fRunVertexFinder),
a84e2607 322 fRunVertexFinderTracks(rec.fRunVertexFinderTracks),
1f46a9ae 323 fRunHLTTracking(rec.fRunHLTTracking),
e66fbafb 324 fRunMuonTracking(rec.fRunMuonTracking),
d1683eef 325 fRunV0Finder(rec.fRunV0Finder),
326 fRunCascadeFinder(rec.fRunCascadeFinder),
1f9831ab 327 fRunMultFinder(rec.fRunMultFinder),
1d99986f 328 fStopOnError(rec.fStopOnError),
329 fWriteAlignmentData(rec.fWriteAlignmentData),
330 fWriteESDfriend(rec.fWriteESDfriend),
b647652d 331 fFillTriggerESD(rec.fFillTriggerESD),
1d99986f 332
7f68891d 333 fCleanESD(rec.fCleanESD),
a023d8d8 334 fV0DCAmax(rec.fV0DCAmax),
5e5c1aa9 335 fV0CsPmin(rec.fV0CsPmin),
7f68891d 336 fDmax(rec.fDmax),
337 fZmax(rec.fZmax),
338
1d99986f 339 fRunLocalReconstruction(rec.fRunLocalReconstruction),
e583c30d 340 fRunTracking(rec.fRunTracking),
341 fFillESD(rec.fFillESD),
7d566c20 342 fLoadCDB(rec.fLoadCDB),
48ce48d1 343 fUseTrackingErrorsForAlignment(rec.fUseTrackingErrorsForAlignment),
e583c30d 344 fGAliceFileName(rec.fGAliceFileName),
4b71572b 345 fRawInput(rec.fRawInput),
975320a0 346 fESDOutput(rec.fESDOutput),
81d57268 347 fProofOutputFileName(rec.fProofOutputFileName),
348 fProofOutputLocation(rec.fProofOutputLocation),
349 fProofOutputDataset(rec.fProofOutputDataset),
350 fProofOutputArchive(rec.fProofOutputArchive),
35042093 351 fEquipIdMap(rec.fEquipIdMap),
b26c3770 352 fFirstEvent(rec.fFirstEvent),
353 fLastEvent(rec.fLastEvent),
973388c2 354 fNumberOfEventsPerFile(rec.fNumberOfEventsPerFile),
fc01854a 355 fFractionFriends(rec.fFractionFriends),
b8cd5251 356 fOptions(),
6bae477a 357 fLoadAlignFromCDB(rec.fLoadAlignFromCDB),
358 fLoadAlignData(rec.fLoadAlignData),
2972d4eb 359 fUseHLTData(rec.fUseHLTData),
7e88424f 360 fRunInfo(NULL),
361 fEventInfo(),
522fdd91 362 fRunScalers(NULL),
52dd4a8c 363 fCTPTimeParams(NULL),
c7ff1a33 364 fCTPTimeAlign(NULL),
e583c30d 365
366 fRunLoader(NULL),
b649205a 367 fRawReader(NULL),
2972d4eb 368 fParentRawReader(NULL),
b8cd5251 369
4b71572b 370 fRecoParam(rec.fRecoParam),
7e88424f 371
58e8dc31 372 fSPDTrackleter(NULL),
373
f2a195c1 374 fDiamondProfileSPD(rec.fDiamondProfileSPD),
4b71572b 375 fDiamondProfile(rec.fDiamondProfile),
376 fDiamondProfileTPC(rec.fDiamondProfileTPC),
77ba28ba 377 fListOfCosmicTriggers(NULL),
f2a195c1 378
6b6e4472 379 fGRPData(NULL),
444753c6 380
6bae477a 381 fAlignObjArray(rec.fAlignObjArray),
ec92bee0 382 fCDBUri(rec.fCDBUri),
f1c1204d 383 fQARefUri(rec.fQARefUri),
7e963665 384 fSpecCDBUri(),
795e4a22 385 fInitCDBCalled(rec.fInitCDBCalled),
386 fSetRunNumberFromDataCalled(rec.fSetRunNumberFromDataCalled),
ce43afbe 387 fQADetectors(rec.fQADetectors),
388 fQATasks(rec.fQATasks),
aa3c69a9 389 fRunQA(rec.fRunQA),
390 fRunGlobalQA(rec.fRunGlobalQA),
e4a998ed 391 fSameQACycle(rec.fSameQACycle),
f1c1204d 392 fInitQACalled(rec.fInitQACalled),
75373542 393 fWriteQAExpertData(rec.fWriteQAExpertData),
21a3aa09 394 fRunPlaneEff(rec.fRunPlaneEff),
395
396 fesd(NULL),
397 fhltesd(NULL),
398 fesdf(NULL),
399 ffile(NULL),
ee7c441c 400 ffileF(NULL),
21a3aa09 401 ftree(NULL),
ee7c441c 402 ftreeF(NULL),
21a3aa09 403 fhlttree(NULL),
21a3aa09 404 ftVertexer(NULL),
14dd053c 405 fIsNewRunLoader(rec.fIsNewRunLoader),
4b71572b 406 fRunAliEVE(kFALSE),
f00558b6 407 fChain(NULL),
408 fNall(0),
409 fNspecie(0),
410 fSspecie(0),
411 fNhighPt(0),
412 fShighPt(0)
596a855f 413{
414// copy constructor
415
ec92bee0 416 for (Int_t i = 0; i < rec.fOptions.GetEntriesFast(); i++) {
efd2085e 417 if (rec.fOptions[i]) fOptions.Add(rec.fOptions[i]->Clone());
418 }
ac4a7581 419 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
b8cd5251 420 fReconstructor[iDet] = NULL;
421 fLoader[iDet] = NULL;
422 fTracker[iDet] = NULL;
b1af1125 423 }
424
4e25ac79 425 for (Int_t iDet = 0; iDet < AliQAv1::kNDET; iDet++) {
b1af1125 426 fQACycles[iDet] = rec.fQACycles[iDet];
252f8aa8 427 fQAWriteExpert[iDet] = rec.fQAWriteExpert[iDet] ;
428 }
b1af1125 429
ec92bee0 430 for (Int_t i = 0; i < rec.fSpecCDBUri.GetEntriesFast(); i++) {
431 if (rec.fSpecCDBUri[i]) fSpecCDBUri.Add(rec.fSpecCDBUri[i]->Clone());
432 }
3d84ad67 433
434 for (int i=2;i--;) for (int j=2;j--;) fBeamInt[i][j] = rec.fBeamInt[i][j];
435
596a855f 436}
437
438//_____________________________________________________________________________
439AliReconstruction& AliReconstruction::operator = (const AliReconstruction& rec)
440{
441// assignment operator
4b71572b 442// Used in PROOF mode
443// Be very careful while modifing it!
444// Simple rules to follow:
445// for persistent data members - use their assignment operators
446// for non-persistent ones - do nothing or take the default values from constructor
447// TSelector members should not be touched
448 if(&rec == this) return *this;
449
4b71572b 450 fRunVertexFinder = rec.fRunVertexFinder;
451 fRunVertexFinderTracks = rec.fRunVertexFinderTracks;
452 fRunHLTTracking = rec.fRunHLTTracking;
453 fRunMuonTracking = rec.fRunMuonTracking;
454 fRunV0Finder = rec.fRunV0Finder;
455 fRunCascadeFinder = rec.fRunCascadeFinder;
1f9831ab 456 fRunMultFinder = rec.fRunMultFinder;
4b71572b 457 fStopOnError = rec.fStopOnError;
458 fWriteAlignmentData = rec.fWriteAlignmentData;
459 fWriteESDfriend = rec.fWriteESDfriend;
460 fFillTriggerESD = rec.fFillTriggerESD;
461
462 fCleanESD = rec.fCleanESD;
463 fV0DCAmax = rec.fV0DCAmax;
464 fV0CsPmin = rec.fV0CsPmin;
465 fDmax = rec.fDmax;
466 fZmax = rec.fZmax;
467
468 fRunLocalReconstruction = rec.fRunLocalReconstruction;
469 fRunTracking = rec.fRunTracking;
470 fFillESD = rec.fFillESD;
7d566c20 471 fLoadCDB = rec.fLoadCDB;
4b71572b 472 fUseTrackingErrorsForAlignment = rec.fUseTrackingErrorsForAlignment;
473 fGAliceFileName = rec.fGAliceFileName;
474 fRawInput = rec.fRawInput;
975320a0 475 fESDOutput = rec.fESDOutput;
81d57268 476 fProofOutputFileName = rec.fProofOutputFileName;
477 fProofOutputLocation = rec.fProofOutputLocation;
478 fProofOutputDataset = rec.fProofOutputDataset;
479 fProofOutputArchive = rec.fProofOutputArchive;
4b71572b 480 fEquipIdMap = rec.fEquipIdMap;
481 fFirstEvent = rec.fFirstEvent;
482 fLastEvent = rec.fLastEvent;
483 fNumberOfEventsPerFile = rec.fNumberOfEventsPerFile;
fc01854a 484 fFractionFriends = rec.fFractionFriends;
4b71572b 485
486 for (Int_t i = 0; i < rec.fOptions.GetEntriesFast(); i++) {
487 if (rec.fOptions[i]) fOptions.Add(rec.fOptions[i]->Clone());
488 }
489
490 fLoadAlignFromCDB = rec.fLoadAlignFromCDB;
491 fLoadAlignData = rec.fLoadAlignData;
4b71572b 492 fUseHLTData = rec.fUseHLTData;
493
494 delete fRunInfo; fRunInfo = NULL;
495 if (rec.fRunInfo) fRunInfo = new AliRunInfo(*rec.fRunInfo);
496
497 fEventInfo = rec.fEventInfo;
498
522fdd91 499 delete fRunScalers; fRunScalers = NULL;
500 if (rec.fRunScalers) fRunScalers = new AliTriggerRunScalers(*rec.fRunScalers);
501
52dd4a8c 502 delete fCTPTimeParams; fCTPTimeParams = NULL;
503 if (rec.fCTPTimeParams) fCTPTimeParams = new AliCTPTimeParams(*rec.fCTPTimeParams);
c7ff1a33 504 delete fCTPTimeAlign; fCTPTimeAlign = NULL;
505 if (rec.fCTPTimeAlign) fCTPTimeAlign = new AliCTPTimeParams(*rec.fCTPTimeAlign);
52dd4a8c 506
4b71572b 507 fRunLoader = NULL;
508 fRawReader = NULL;
509 fParentRawReader = NULL;
510
511 fRecoParam = rec.fRecoParam;
512
ac4a7581 513 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
4b71572b 514 delete fReconstructor[iDet]; fReconstructor[iDet] = NULL;
515 delete fLoader[iDet]; fLoader[iDet] = NULL;
516 delete fTracker[iDet]; fTracker[iDet] = NULL;
4b71572b 517 }
b1af1125 518
4e25ac79 519 for (Int_t iDet = 0; iDet < AliQAv1::kNDET; iDet++) {
b1af1125 520 fQACycles[iDet] = rec.fQACycles[iDet];
252f8aa8 521 fQAWriteExpert[iDet] = rec.fQAWriteExpert[iDet] ;
522 }
58e8dc31 523
524 delete fSPDTrackleter; fSPDTrackleter = NULL;
252f8aa8 525
f2a195c1 526 delete fDiamondProfileSPD; fDiamondProfileSPD = NULL;
527 if (rec.fDiamondProfileSPD) fDiamondProfileSPD = new AliESDVertex(*rec.fDiamondProfileSPD);
4b71572b 528 delete fDiamondProfile; fDiamondProfile = NULL;
529 if (rec.fDiamondProfile) fDiamondProfile = new AliESDVertex(*rec.fDiamondProfile);
530 delete fDiamondProfileTPC; fDiamondProfileTPC = NULL;
531 if (rec.fDiamondProfileTPC) fDiamondProfileTPC = new AliESDVertex(*rec.fDiamondProfileTPC);
4b71572b 532
77ba28ba 533 delete fListOfCosmicTriggers; fListOfCosmicTriggers = NULL;
534 if (rec.fListOfCosmicTriggers) fListOfCosmicTriggers = (THashTable*)((rec.fListOfCosmicTriggers)->Clone());
535
4b71572b 536 delete fGRPData; fGRPData = NULL;
44e45fac 537 // if (rec.fGRPData) fGRPData = (TMap*)((rec.fGRPData)->Clone());
538 if (rec.fGRPData) fGRPData = (AliGRPObject*)((rec.fGRPData)->Clone());
4b71572b 539
540 delete fAlignObjArray; fAlignObjArray = NULL;
541
542 fCDBUri = "";
f1c1204d 543 fQARefUri = rec.fQARefUri;
4b71572b 544 fSpecCDBUri.Delete();
545 fInitCDBCalled = rec.fInitCDBCalled;
546 fSetRunNumberFromDataCalled = rec.fSetRunNumberFromDataCalled;
547 fQADetectors = rec.fQADetectors;
4b71572b 548 fQATasks = rec.fQATasks;
549 fRunQA = rec.fRunQA;
550 fRunGlobalQA = rec.fRunGlobalQA;
4b71572b 551 fSameQACycle = rec.fSameQACycle;
f1c1204d 552 fInitQACalled = rec.fInitQACalled;
75373542 553 fWriteQAExpertData = rec.fWriteQAExpertData;
4b71572b 554 fRunPlaneEff = rec.fRunPlaneEff;
3d84ad67 555 for (int i=2;i--;) for (int j=2;j--;) fBeamInt[i][j] = rec.fBeamInt[i][j];
4b71572b 556 fesd = NULL;
557 fhltesd = NULL;
558 fesdf = NULL;
559 ffile = NULL;
ee7c441c 560 ffileF = NULL;
4b71572b 561 ftree = NULL;
ee7c441c 562 ftreeF = NULL;
4b71572b 563 fhlttree = NULL;
564 ftVertexer = NULL;
565 fIsNewRunLoader = rec.fIsNewRunLoader;
566 fRunAliEVE = kFALSE;
567 fChain = NULL;
f00558b6 568 fNall = 0;
569 fNspecie = 0;
570 fSspecie = 0;
571 fNhighPt = 0;
572 fShighPt = 0;
596a855f 573
596a855f 574 return *this;
575}
576
577//_____________________________________________________________________________
578AliReconstruction::~AliReconstruction()
579{
580// clean up
581
e583c30d 582 CleanUp();
77ba28ba 583 if (fListOfCosmicTriggers) {
584 fListOfCosmicTriggers->Delete();
585 delete fListOfCosmicTriggers;
586 }
4f3c479a 587 delete fGRPData;
522fdd91 588 delete fRunScalers;
52dd4a8c 589 delete fCTPTimeParams;
c7ff1a33 590 delete fCTPTimeAlign;
efd2085e 591 fOptions.Delete();
4b71572b 592 if (fAlignObjArray) {
593 fAlignObjArray->Delete();
594 delete fAlignObjArray;
595 }
ec92bee0 596 fSpecCDBUri.Delete();
e6d66370 597
87932dab 598 AliCodeTimer::Instance()->Print();
596a855f 599}
600
f1c1204d 601//_____________________________________________________________________________
602void AliReconstruction::InitQA()
603{
604 //Initialize the QA and start of cycle
52dd4a8c 605 AliCodeTimerAuto("",0);
f1c1204d 606
607 if (fInitQACalled) return;
608 fInitQACalled = kTRUE;
609
634696f5 610 AliQAManager * qam = AliQAManager::QAManager(AliQAv1::kRECMODE) ;
75373542 611 if (fWriteQAExpertData)
eca4fa66 612 qam->SetWriteExpert() ;
75373542 613
eca4fa66 614 if (qam->IsDefaultStorageSet()) {
f1c1204d 615 AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
616 AliWarning("Default QA reference storage has been already set !");
617 AliWarning(Form("Ignoring the default storage declared in AliReconstruction: %s",fQARefUri.Data()));
618 AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
eca4fa66 619 fQARefUri = qam->GetDefaultStorage()->GetURI();
f1c1204d 620 } else {
621 if (fQARefUri.Length() > 0) {
622 AliDebug(2,"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
623 AliDebug(2, Form("Default QA reference storage is set to: %s", fQARefUri.Data()));
624 AliDebug(2, "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
625 } else {
626 fQARefUri="local://$ALICE_ROOT/QAref";
627 AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
628 AliWarning("Default QA refeference storage not yet set !!!!");
629 AliWarning(Form("Setting it now to: %s", fQARefUri.Data()));
630 AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
631
632 }
eca4fa66 633 qam->SetDefaultStorage(fQARefUri);
f1c1204d 634 }
635
636 if (fRunQA) {
eca4fa66 637 qam->SetActiveDetectors(fQADetectors) ;
4e25ac79 638 for (Int_t det = 0 ; det < AliQAv1::kNDET ; det++) {
eca4fa66 639 qam->SetCycleLength(AliQAv1::DETECTORINDEX_t(det), fQACycles[det]) ;
640 qam->SetWriteExpert(AliQAv1::DETECTORINDEX_t(det)) ;
f1c1204d 641 }
514cb8c7 642 if (!fRawReader && !fInput && IsInTasks(AliQAv1::kRAWS))
4e25ac79 643 fQATasks.ReplaceAll(Form("%d",AliQAv1::kRAWS), "") ;
eca4fa66 644 qam->SetTasks(fQATasks) ;
645 qam->InitQADataMaker(AliCDBManager::Instance()->GetRun()) ;
f1c1204d 646 }
647 if (fRunGlobalQA) {
648 Bool_t sameCycle = kFALSE ;
eca4fa66 649 AliQADataMaker *qadm = qam->GetQADataMaker(AliQAv1::kGLOBAL);
f1c1204d 650 AliInfo(Form("Initializing the global QA data maker"));
514cb8c7 651 if (IsInTasks(AliQAv1::kRECPOINTS)) {
4e25ac79 652 qadm->StartOfCycle(AliQAv1::kRECPOINTS, AliCDBManager::Instance()->GetRun(), sameCycle) ;
653 TObjArray **arr=qadm->Init(AliQAv1::kRECPOINTS);
f1c1204d 654 AliTracker::SetResidualsArray(arr);
655 sameCycle = kTRUE ;
656 }
514cb8c7 657 if (IsInTasks(AliQAv1::kESDS)) {
4e25ac79 658 qadm->StartOfCycle(AliQAv1::kESDS, AliCDBManager::Instance()->GetRun(), sameCycle) ;
659 qadm->Init(AliQAv1::kESDS);
f1c1204d 660 }
f1c1204d 661 }
fc07289e 662 AliSysInfo::AddStamp("InitQA") ;
f1c1204d 663}
664
fc07289e 665//_____________________________________________________________________________
87da0921 666void AliReconstruction::MergeQA(const char *fileName)
fc07289e 667{
668 //Initialize the QA and start of cycle
52dd4a8c 669 AliCodeTimerAuto("",0) ;
eca4fa66 670 AliQAManager::QAManager()->Merge(AliCDBManager::Instance()->GetRun(),fileName) ;
fc07289e 671 AliSysInfo::AddStamp("MergeQA") ;
672}
673
024cf675 674//_____________________________________________________________________________
795e4a22 675void AliReconstruction::InitCDB()
024cf675 676{
677// activate a default CDB storage
678// First check if we have any CDB storage set, because it is used
679// to retrieve the calibration and alignment constants
52dd4a8c 680 AliCodeTimerAuto("",0);
024cf675 681
795e4a22 682 if (fInitCDBCalled) return;
683 fInitCDBCalled = kTRUE;
684
024cf675 685 AliCDBManager* man = AliCDBManager::Instance();
ec92bee0 686 if (man->IsDefaultStorageSet())
024cf675 687 {
688 AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
ec92bee0 689 AliWarning("Default CDB storage has been already set !");
690 AliWarning(Form("Ignoring the default storage declared in AliReconstruction: %s",fCDBUri.Data()));
024cf675 691 AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
795e4a22 692 fCDBUri = man->GetDefaultStorage()->GetURI();
ec92bee0 693 }
694 else {
795e4a22 695 if (fCDBUri.Length() > 0)
696 {
697 AliDebug(2,"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
698 AliDebug(2, Form("Default CDB storage is set to: %s", fCDBUri.Data()));
699 AliDebug(2, "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
52dd4a8c 700 man->SetDefaultStorage(fCDBUri);
701 }
702 else if (!man->GetRaw()){
703 fCDBUri="local://$ALICE_ROOT/OCDB";
795e4a22 704 AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
705 AliWarning("Default CDB storage not yet set !!!!");
706 AliWarning(Form("Setting it now to: %s", fCDBUri.Data()));
707 AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
52dd4a8c 708 man->SetDefaultStorage(fCDBUri);
709 }
710 else {
711 AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
712 AliWarning("Default storage will be set after setting the Run Number!!!");
713 AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
795e4a22 714 }
ec92bee0 715 }
716
717 // Now activate the detector specific CDB storage locations
c3a7b59a 718 for (Int_t i = 0; i < fSpecCDBUri.GetEntriesFast(); i++) {
719 TObject* obj = fSpecCDBUri[i];
720 if (!obj) continue;
b8ec52f6 721 AliDebug(2, "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
722 AliDebug(2, Form("Specific CDB storage for %s is set to: %s",obj->GetName(),obj->GetTitle()));
723 AliDebug(2, "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
c3a7b59a 724 man->SetSpecificStorage(obj->GetName(), obj->GetTitle());
ec92bee0 725 }
002c9d1b 726 AliSysInfo::AddStamp("InitCDB");
024cf675 727}
728
729//_____________________________________________________________________________
730void AliReconstruction::SetDefaultStorage(const char* uri) {
ec92bee0 731// Store the desired default CDB storage location
732// Activate it later within the Run() method
024cf675 733
ec92bee0 734 fCDBUri = uri;
024cf675 735
736}
737
f1c1204d 738//_____________________________________________________________________________
739void AliReconstruction::SetQARefDefaultStorage(const char* uri) {
740 // Store the desired default CDB storage location
741 // Activate it later within the Run() method
742
743 fQARefUri = uri;
4e25ac79 744 AliQAv1::SetQARefStorage(fQARefUri.Data()) ;
f1c1204d 745
746}
00aa02d5 747//_____________________________________________________________________________
c3a7b59a 748void AliReconstruction::SetSpecificStorage(const char* calibType, const char* uri) {
ec92bee0 749// Store a detector-specific CDB storage location
750// Activate it later within the Run() method
024cf675 751
c3a7b59a 752 AliCDBPath aPath(calibType);
753 if(!aPath.IsValid()){
754 // if calibType is not wildcard but it is a valid detector, add "/*" to make it a valid path
ac4a7581 755 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
c3a7b59a 756 if(!strcmp(calibType, fgkDetectorName[iDet])) {
757 aPath.SetPath(Form("%s/*", calibType));
758 AliInfo(Form("Path for specific storage set to %s", aPath.GetPath().Data()));
759 break;
760 }
761 }
762 if(!aPath.IsValid()){
763 AliError(Form("Not a valid path or detector: %s", calibType));
764 return;
765 }
766 }
767
53dd3c3d 768// // check that calibType refers to a "valid" detector name
769// Bool_t isDetector = kFALSE;
ac4a7581 770// for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
53dd3c3d 771// TString detName = fgkDetectorName[iDet];
772// if(aPath.GetLevel0() == detName) {
773// isDetector = kTRUE;
774// break;
775// }
776// }
777//
778// if(!isDetector) {
779// AliError(Form("Not a valid detector: %s", aPath.GetLevel0().Data()));
780// return;
781// }
c3a7b59a 782
783 TObject* obj = fSpecCDBUri.FindObject(aPath.GetPath().Data());
ec92bee0 784 if (obj) fSpecCDBUri.Remove(obj);
c3a7b59a 785 fSpecCDBUri.Add(new TNamed(aPath.GetPath().Data(), uri));
024cf675 786
787}
788
6bae477a 789//_____________________________________________________________________________
795e4a22 790Bool_t AliReconstruction::SetRunNumberFromData()
6bae477a 791{
792 // The method is called in Run() in order
793 // to set a correct run number.
794 // In case of raw data reconstruction the
795 // run number is taken from the raw data header
796
795e4a22 797 if (fSetRunNumberFromDataCalled) return kTRUE;
798 fSetRunNumberFromDataCalled = kTRUE;
799
800 AliCDBManager* man = AliCDBManager::Instance();
4b71572b 801
802 if(fRawReader) {
803 if(fRawReader->NextEvent()) {
804 if(man->GetRun() > 0) {
21a3aa09 805 AliWarning("Run number is taken from raw-event header! Ignoring settings in AliCDBManager!");
4b71572b 806 }
807 man->SetRun(fRawReader->GetRunNumber());
808 fRawReader->RewindEvents();
809 }
810 else {
811 if(man->GetRun() > 0) {
812 AliWarning("No raw-data events are found ! Using settings in AliCDBManager !");
813 }
814 else {
815 AliWarning("Neither raw events nor settings in AliCDBManager are found !");
816 return kFALSE;
817 }
818 }
819 }
820 else {
821 AliRunLoader *rl = AliRunLoader::Open(fGAliceFileName.Data());
822 if (!rl) {
823 AliError(Form("No run loader found in file %s", fGAliceFileName.Data()));
6bae477a 824 return kFALSE;
825 }
ec92bee0 826 else {
4b71572b 827 rl->LoadHeader();
828 // read run number from gAlice
829 if(rl->GetHeader()) {
830 man->SetRun(rl->GetHeader()->GetRun());
831 rl->UnloadHeader();
832 delete rl;
ec92bee0 833 }
834 else {
4b71572b 835 AliError("Neither run-loader header nor RawReader objects are found !");
836 delete rl;
ec92bee0 837 return kFALSE;
838 }
4b71572b 839 }
6bae477a 840 }
795e4a22 841
842 man->Print();
843
6bae477a 844 return kTRUE;
845}
846
795e4a22 847//_____________________________________________________________________________
848void AliReconstruction::SetCDBLock() {
849 // Set CDB lock: from now on it is forbidden to reset the run number
850 // or the default storage or to activate any further storage!
851
852 AliCDBManager::Instance()->SetLock(1);
853}
854
6bae477a 855//_____________________________________________________________________________
856Bool_t AliReconstruction::MisalignGeometry(const TString& detectors)
857{
858 // Read the alignment objects from CDB.
859 // Each detector is supposed to have the
860 // alignment objects in DET/Align/Data CDB path.
861 // All the detector objects are then collected,
862 // sorted by geometry level (starting from ALIC) and
863 // then applied to the TGeo geometry.
864 // Finally an overlaps check is performed.
865
866 // Load alignment data from CDB and fill fAlignObjArray
867 if(fLoadAlignFromCDB){
6bae477a 868
25be1e5c 869 TString detStr = detectors;
870 TString loadAlObjsListOfDets = "";
871
ac4a7581 872 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
8cb26cdf 873 if(!IsSelected(fgkDetectorName[iDet], detStr)) continue;
f12d42ce 874 if(!strcmp(fgkDetectorName[iDet],"HLT")) continue;
4fbb8e9d 875
876 if(AliGeomManager::GetNalignable(fgkDetectorName[iDet]) != 0)
8cb26cdf 877 {
878 loadAlObjsListOfDets += fgkDetectorName[iDet];
879 loadAlObjsListOfDets += " ";
880 }
25be1e5c 881 } // end loop over detectors
4fbb8e9d 882
883 if(AliGeomManager::GetNalignable("GRP") != 0)
8cb26cdf 884 loadAlObjsListOfDets.Prepend("GRP "); //add alignment objects for non-sensitive modules
98e303d9 885 AliGeomManager::ApplyAlignObjsFromCDB(loadAlObjsListOfDets.Data());
e30a9b4d 886 AliCDBManager::Instance()->UnloadFromCache("*/Align/*");
25be1e5c 887 }else{
888 // Check if the array with alignment objects was
889 // provided by the user. If yes, apply the objects
890 // to the present TGeo geometry
891 if (fAlignObjArray) {
892 if (gGeoManager && gGeoManager->IsClosed()) {
98e303d9 893 if (AliGeomManager::ApplyAlignObjsToGeom(*fAlignObjArray) == kFALSE) {
25be1e5c 894 AliError("The misalignment of one or more volumes failed!"
895 "Compare the list of simulated detectors and the list of detector alignment data!");
896 return kFALSE;
897 }
898 }
899 else {
900 AliError("Can't apply the misalignment! gGeoManager doesn't exist or it is still opened!");
6bae477a 901 return kFALSE;
902 }
903 }
6bae477a 904 }
25be1e5c 905
4b71572b 906 if (fAlignObjArray) {
907 fAlignObjArray->Delete();
908 delete fAlignObjArray; fAlignObjArray=NULL;
909 }
a03b0371 910
6bae477a 911 return kTRUE;
912}
596a855f 913
914//_____________________________________________________________________________
915void AliReconstruction::SetGAliceFile(const char* fileName)
916{
917// set the name of the galice file
918
919 fGAliceFileName = fileName;
920}
921
21a3aa09 922//_____________________________________________________________________________
b58710ef 923void AliReconstruction::SetInput(const char* input)
21a3aa09 924{
b58710ef 925 // In case the input string starts with 'mem://', we run in an online mode
926 // and AliRawReaderDateOnline object is created. In all other cases a raw-data
927 // file is assumed. One can give as an input:
928 // mem://: - events taken from DAQ monitoring libs online
929 // or
930 // mem://<filename> - emulation of the above mode (via DATE monitoring libs)
4b71572b 931 if (input) fRawInput = input;
21a3aa09 932}
933
975320a0 934//_____________________________________________________________________________
935void AliReconstruction::SetOutput(const char* output)
936{
937 // Set the output ESD filename
938 // 'output' is a normalt ROOT url
939 // The method is used in case of raw-data reco with PROOF
81d57268 940 if (output) fESDOutput = output;
975320a0 941}
942
efd2085e 943//_____________________________________________________________________________
944void AliReconstruction::SetOption(const char* detector, const char* option)
945{
946// set options for the reconstruction of a detector
947
948 TObject* obj = fOptions.FindObject(detector);
949 if (obj) fOptions.Remove(obj);
950 fOptions.Add(new TNamed(detector, option));
951}
952
7e88424f 953//_____________________________________________________________________________
954void AliReconstruction::SetRecoParam(const char* detector, AliDetectorRecoParam *par)
955{
956 // Set custom reconstruction parameters for a given detector
957 // Single set of parameters for all the events
a00021a7 958
959 // First check if the reco-params are global
960 if(!strcmp(detector, "GRP")) {
961 par->SetAsDefault();
ac4a7581 962 fRecoParam.AddDetRecoParam(kNDetectors,par);
a00021a7 963 return;
964 }
965
ac4a7581 966 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
7e88424f 967 if(!strcmp(detector, fgkDetectorName[iDet])) {
968 par->SetAsDefault();
969 fRecoParam.AddDetRecoParam(iDet,par);
970 break;
971 }
972 }
973
974}
975
61807e09 976//_____________________________________________________________________________
61807e09 977Bool_t AliReconstruction::InitGRP() {
978 //------------------------------------
979 // Initialization of the GRP entry
980 //------------------------------------
981 AliCDBEntry* entry = AliCDBManager::Instance()->Get("GRP/GRP/Data");
982
4b71572b 983 if (entry) {
44e45fac 984
985 TMap* m = dynamic_cast<TMap*>(entry->GetObject()); // old GRP entry
986
987 if (m) {
988 AliInfo("Found a TMap in GRP/GRP/Data, converting it into an AliGRPObject");
989 m->Print();
990 fGRPData = new AliGRPObject();
991 fGRPData->ReadValuesFromMap(m);
992 }
993
994 else {
995 AliInfo("Found an AliGRPObject in GRP/GRP/Data, reading it");
996 fGRPData = dynamic_cast<AliGRPObject*>(entry->GetObject()); // new GRP entry
997 entry->SetOwner(0);
998 }
999
f168abba 1000 // FIX ME: The unloading of GRP entry is temporarily disabled
1001 // because ZDC and VZERO are using it in order to initialize
1002 // their reconstructor objects. In the future one has to think
1003 // of propagating AliRunInfo to the reconstructors.
1004 // AliCDBManager::Instance()->UnloadFromCache("GRP/GRP/Data");
4b71572b 1005 }
61807e09 1006
1007 if (!fGRPData) {
1008 AliError("No GRP entry found in OCDB!");
1009 return kFALSE;
1010 }
1011
44e45fac 1012 TString lhcState = fGRPData->GetLHCState();
1013 if (lhcState==AliGRPObject::GetInvalidString()) {
7e88424f 1014 AliError("GRP/GRP/Data entry: missing value for the LHC state ! Using UNKNOWN");
44e45fac 1015 lhcState = "UNKNOWN";
7e88424f 1016 }
1017
44e45fac 1018 TString beamType = fGRPData->GetBeamType();
1019 if (beamType==AliGRPObject::GetInvalidString()) {
7e88424f 1020 AliError("GRP/GRP/Data entry: missing value for the beam type ! Using UNKNOWN");
44e45fac 1021 beamType = "UNKNOWN";
7e88424f 1022 }
1023
44e45fac 1024 Float_t beamEnergy = fGRPData->GetBeamEnergy();
1025 if (beamEnergy==AliGRPObject::GetInvalidFloat()) {
7e88424f 1026 AliError("GRP/GRP/Data entry: missing value for the beam energy ! Using 0");
44e45fac 1027 beamEnergy = 0;
7e88424f 1028 }
1029
44e45fac 1030 TString runType = fGRPData->GetRunType();
1031 if (runType==AliGRPObject::GetInvalidString()) {
7e88424f 1032 AliError("GRP/GRP/Data entry: missing value for the run type ! Using UNKNOWN");
44e45fac 1033 runType = "UNKNOWN";
7e88424f 1034 }
1035
44e45fac 1036 Int_t activeDetectors = fGRPData->GetDetectorMask();
a5dede5c 1037 if (activeDetectors==AliGRPObject::GetInvalidUInt()) {
7e88424f 1038 AliError("GRP/GRP/Data entry: missing value for the detector mask ! Using 1074790399");
44e45fac 1039 activeDetectors = 1074790399;
7e88424f 1040 }
1041
44e45fac 1042 fRunInfo = new AliRunInfo(lhcState, beamType, beamEnergy, runType, activeDetectors);
44e45fac 1043 fRunInfo->Dump();
1044
7e88424f 1045
1046 // Process the list of active detectors
44e45fac 1047 if (activeDetectors) {
1048 UInt_t detMask = activeDetectors;
7a317bef 1049 fRunLocalReconstruction = MatchDetectorList(fRunLocalReconstruction,detMask);
1050 fRunTracking = MatchDetectorList(fRunTracking,detMask);
1051 fFillESD = MatchDetectorList(fFillESD,detMask);
1052 fQADetectors = MatchDetectorList(fQADetectors,detMask);
7d566c20 1053 fLoadCDB.Form("%s %s %s %s",
1054 fRunLocalReconstruction.Data(),
1055 fRunTracking.Data(),
1056 fFillESD.Data(),
1057 fQADetectors.Data());
7d566c20 1058 fLoadCDB = MatchDetectorList(fLoadCDB,detMask);
d0f84c42 1059 if (!((detMask >> AliDAQ::DetectorID("ITSSPD")) & 0x1) &&
1060 !((detMask >> AliDAQ::DetectorID("ITSSDD")) & 0x1) &&
1061 !((detMask >> AliDAQ::DetectorID("ITSSSD")) & 0x1) ) {
91e2f025 1062 // switch off the vertexer
1f9831ab 1063 AliInfo("SPD,SDD,SSD is not in the list of active detectors. Vertexer and Trackleter are switched off.");
91e2f025 1064 fRunVertexFinder = kFALSE;
1f9831ab 1065 fRunMultFinder = kFALSE;
91e2f025 1066 }
304d7f0b 1067 if (!((detMask >> AliDAQ::DetectorID("TRG")) & 0x1)) {
1068 // switch off the reading of CTP raw-data payload
1069 if (fFillTriggerESD) {
1070 AliInfo("CTP is not in the list of active detectors. CTP data reading switched off.");
1071 fFillTriggerESD = kFALSE;
1072 }
1073 }
7e88424f 1074 }
1075
1076 AliInfo("===================================================================================");
1077 AliInfo(Form("Running local reconstruction for detectors: %s",fRunLocalReconstruction.Data()));
1078 AliInfo(Form("Running tracking for detectors: %s",fRunTracking.Data()));
1079 AliInfo(Form("Filling ESD for detectors: %s",fFillESD.Data()));
ca13fb87 1080 AliInfo(Form("Quality assurance is active for detectors: %s",fQADetectors.Data()));
7d566c20 1081 AliInfo(Form("CDB and reconstruction parameters are loaded for detectors: %s",fLoadCDB.Data()));
7e88424f 1082 AliInfo("===================================================================================");
61807e09 1083
1084 //*** Dealing with the magnetic field map
5a004fb4 1085 if ( TGeoGlobalMagField::Instance()->IsLocked() ) {
1086 if (TGeoGlobalMagField::Instance()->GetField()->TestBit(AliMagF::kOverrideGRP)) {
1087 AliInfo("ExpertMode!!! GRP information will be ignored !");
1088 AliInfo("ExpertMode!!! Running with the externally locked B field !");
1089 }
1090 else {
1091 AliInfo("Destroying existing B field instance!");
1092 delete TGeoGlobalMagField::Instance();
1093 }
1094 }
1095 if ( !TGeoGlobalMagField::Instance()->IsLocked() ) {
61807e09 1096 // Construct the field map out of the information retrieved from GRP.
856024f0 1097 Bool_t ok = kTRUE;
61807e09 1098 // L3
44e45fac 1099 Float_t l3Current = fGRPData->GetL3Current((AliGRPObject::Stats)0);
1100 if (l3Current == AliGRPObject::GetInvalidFloat()) {
1101 AliError("GRP/GRP/Data entry: missing value for the L3 current !");
1102 ok = kFALSE;
1103 }
f7a1cc68 1104
44e45fac 1105 Char_t l3Polarity = fGRPData->GetL3Polarity();
1106 if (l3Polarity == AliGRPObject::GetInvalidChar()) {
1107 AliError("GRP/GRP/Data entry: missing value for the L3 polarity !");
1108 ok = kFALSE;
1109 }
1110
1111 // Dipole
1112 Float_t diCurrent = fGRPData->GetDipoleCurrent((AliGRPObject::Stats)0);
1113 if (diCurrent == AliGRPObject::GetInvalidFloat()) {
1114 AliError("GRP/GRP/Data entry: missing value for the dipole current !");
1115 ok = kFALSE;
1116 }
1117
1118 Char_t diPolarity = fGRPData->GetDipolePolarity();
1119 if (diPolarity == AliGRPObject::GetInvalidChar()) {
1120 AliError("GRP/GRP/Data entry: missing value for the dipole polarity !");
1121 ok = kFALSE;
1122 }
1123
99c7d495 1124 // read special bits for the polarity convention and map type
1125 Int_t polConvention = fGRPData->IsPolarityConventionLHC() ? AliMagF::kConvLHC : AliMagF::kConvDCS2008;
1126 Bool_t uniformB = fGRPData->IsUniformBMap();
61807e09 1127
856024f0 1128 if (ok) {
33fe5eb1 1129 AliMagF* fld = AliMagF::CreateFieldMap(TMath::Abs(l3Current) * (l3Polarity ? -1:1),
1130 TMath::Abs(diCurrent) * (diPolarity ? -1:1),
1131 polConvention,uniformB,beamEnergy, beamType.Data());
1132 if (fld) {
1133 TGeoGlobalMagField::Instance()->SetField( fld );
1134 TGeoGlobalMagField::Instance()->Lock();
1135 AliInfo("Running with the B field constructed out of GRP !");
1136 }
1137 else AliFatal("Failed to create a B field map !");
856024f0 1138 }
f7a1cc68 1139 else AliFatal("B field is neither set nor constructed from GRP ! Exitig...");
61807e09 1140 }
f7a1cc68 1141
f2a195c1 1142 //*** Get the diamond profiles from OCDB
1143 entry = AliCDBManager::Instance()->Get("GRP/Calib/MeanVertexSPD");
1144 if (entry) {
1145 fDiamondProfileSPD = dynamic_cast<AliESDVertex*> (entry->GetObject());
1146 } else {
1147 AliError("No SPD diamond profile found in OCDB!");
1148 }
1149
61807e09 1150 entry = AliCDBManager::Instance()->Get("GRP/Calib/MeanVertex");
1151 if (entry) {
f2a195c1 1152 fDiamondProfile = dynamic_cast<AliESDVertex*> (entry->GetObject());
61807e09 1153 } else {
1154 AliError("No diamond profile found in OCDB!");
1155 }
1156
1157 entry = AliCDBManager::Instance()->Get("GRP/Calib/MeanVertexTPC");
1158 if (entry) {
f2a195c1 1159 fDiamondProfileTPC = dynamic_cast<AliESDVertex*> (entry->GetObject());
61807e09 1160 } else {
f2a195c1 1161 AliError("No TPC diamond profile found in OCDB!");
61807e09 1162 }
1163
77ba28ba 1164 entry = AliCDBManager::Instance()->Get("GRP/Calib/CosmicTriggers");
1165 if (entry) {
1166 fListOfCosmicTriggers = dynamic_cast<THashTable*>(entry->GetObject());
1167 entry->SetOwner(0);
1168 AliCDBManager::Instance()->UnloadFromCache("GRP/Calib/CosmicTriggers");
1169 }
1170
1171 if (!fListOfCosmicTriggers) {
1172 AliWarning("Can not get list of cosmic triggers from OCDB! Cosmic event specie will be effectively disabled!");
1173 }
1174
61807e09 1175 return kTRUE;
1176}
1177
4b71572b 1178//_____________________________________________________________________________
1179Bool_t AliReconstruction::LoadCDB()
1180{
0a035be5 1181 // Load CDB entries for all active detectors.
1182 // By default we load all the entries in <det>/Calib
1183 // folder.
1184
52dd4a8c 1185 AliCodeTimerAuto("",0);
4b71572b 1186
1187 AliCDBManager::Instance()->Get("GRP/CTP/Config");
1188
30d5d647 1189 AliCDBManager::Instance()->Get("GRP/Calib/LHCClockPhase");
1190
7d566c20 1191 TString detStr = fLoadCDB;
ac4a7581 1192 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
4b71572b 1193 if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
1194 AliCDBManager::Instance()->GetAll(Form("%s/Calib/*",fgkDetectorName[iDet]));
1195 }
e122592f 1196
1197 // Temporary fix - one has to define the correct policy in order
1198 // to load the trigger OCDB entries only for the detectors that
1199 // in the trigger or that are needed in order to put correct
1200 // information in ESD
1201 AliCDBManager::Instance()->GetAll("TRIGGER/*/*");
1202
4b71572b 1203 return kTRUE;
1204}
522fdd91 1205//_____________________________________________________________________________
1206Bool_t AliReconstruction::LoadTriggerScalersCDB()
1207{
0a035be5 1208 // Load CTP scalers from OCDB.
1209 // The scalers are checked for consistency.
1210
52dd4a8c 1211 AliCodeTimerAuto("",0);
522fdd91 1212
1213 AliCDBEntry* entry = AliCDBManager::Instance()->Get("GRP/CTP/Scalers");
4b71572b 1214
522fdd91 1215 if (entry) {
1216
1217 AliInfo("Found an AliTriggerRunScalers in GRP/CTP/Scalers, reading it");
1218 fRunScalers = dynamic_cast<AliTriggerRunScalers*> (entry->GetObject());
1219 entry->SetOwner(0);
c7a22819 1220 if (fRunScalers && (fRunScalers->CorrectScalersOverflow() == 0)) AliInfo("32bit Trigger counters corrected for overflow");
82ebedd6 1221
522fdd91 1222 }
1223 return kTRUE;
1224}
596a855f 1225//_____________________________________________________________________________
52dd4a8c 1226Bool_t AliReconstruction::LoadCTPTimeParamsCDB()
1227{
0a035be5 1228 // Load CTP timing information (alignment)
1229 // from OCDB.
1230
52dd4a8c 1231 AliCDBEntry* entry = AliCDBManager::Instance()->Get("GRP/CTP/CTPtiming");
c7ff1a33 1232 if (!entry) return kFALSE;
52dd4a8c 1233
c7ff1a33 1234 AliInfo("Found an AliCTPTimeParams in GRP/CTP/CTPtiming, reading it");
1235 fCTPTimeParams = dynamic_cast<AliCTPTimeParams*> (entry->GetObject());
1236 entry->SetOwner(0);
52dd4a8c 1237
c7ff1a33 1238 AliCDBEntry* entry2 = AliCDBManager::Instance()->Get("GRP/CTP/TimeAlign");
1239 if (!entry2) return kFALSE;
1240
1241 AliInfo("Found an AliCTPTimeParams in GRP/CTP/TimeAlign, reading it");
028be258 1242 fCTPTimeAlign = dynamic_cast<AliCTPTimeParams*> (entry2->GetObject());
1243 entry2->SetOwner(0);
c7ff1a33 1244
1245 return kTRUE;
52dd4a8c 1246}
3d84ad67 1247
1248//_____________________________________________________________________________
1249Bool_t AliReconstruction::ReadIntensityInfoCDB()
1250{
1251 // Load LHC DIP data
1252 AliCDBEntry* entry = AliCDBManager::Instance()->Get("GRP/GRP/LHCData");
1253
1254 if (entry) {
1255 AliInfo("Found an AliLHCData in GRP/GRP/LHCData, reading it");
1256 AliLHCData* dipData = dynamic_cast<AliLHCData*> (entry->GetObject());
1257 for (int ib=2;ib--;) {
1258 double intI,intNI;
c7a22819 1259 if (dipData && (dipData->GetMeanIntensity(ib,intI,intNI)>=0)) {
3d84ad67 1260 fBeamInt[ib][0] = intI;
1261 fBeamInt[ib][1] = intNI;
1262 }
1263 }
1264 return kTRUE;
1265 }
1266 return kFALSE;
1267}
1268
1269
52dd4a8c 1270//_____________________________________________________________________________
21a3aa09 1271Bool_t AliReconstruction::Run(const char* input)
596a855f 1272{
21a3aa09 1273 // Run Run Run
52dd4a8c 1274 AliCodeTimerAuto("",0);
596a855f 1275
4b71572b 1276 InitRun(input);
1277 if (GetAbort() != TSelector::kContinue) return kFALSE;
1278
1279 TChain *chain = NULL;
1280 if (fRawReader && (chain = fRawReader->GetChain())) {
2a284cef 1281 Long64_t nEntries = (fLastEvent < 0) ? (TChain::kBigNumber) : (fLastEvent - fFirstEvent + 1);
4b71572b 1282 // Proof mode
1283 if (gProof) {
52dd4a8c 1284 // Temporary fix for long raw-data runs (until socket timeout handling in PROOF is revised)
1285 gProof->Exec("gEnv->SetValue(\"Proof.SocketActivityTimeout\",-1)", kTRUE);
6c6f2624 1286
1287 if (gGrid)
1288 gProof->Exec("TGrid::Connect(\"alien://\")",kTRUE);
1289
1290 TMessage::EnableSchemaEvolutionForAll(kTRUE);
1291 gProof->Exec("TMessage::EnableSchemaEvolutionForAll(kTRUE)",kTRUE);
1292
4b71572b 1293 gProof->AddInput(this);
81d57268 1294
1295 if (!ParseOutput()) return kFALSE;
1296
975320a0 1297 gProof->SetParameter("PROOF_MaxSlavesPerNode", 9999);
4b71572b 1298 chain->SetProof();
2a284cef 1299 chain->Process("AliReconstruction","",nEntries,fFirstEvent);
4b71572b 1300 }
1301 else {
2a284cef 1302 chain->Process(this,"",nEntries,fFirstEvent);
4b71572b 1303 }
1304 }
1305 else {
1306 Begin(NULL);
1307 if (GetAbort() != TSelector::kContinue) return kFALSE;
1308 SlaveBegin(NULL);
1309 if (GetAbort() != TSelector::kContinue) return kFALSE;
1310 //******* The loop over events
44e45fac 1311 AliInfo("Starting looping over events");
4b71572b 1312 Int_t iEvent = 0;
1313 while ((iEvent < fRunLoader->GetNumberOfEvents()) ||
1314 (fRawReader && fRawReader->NextEvent())) {
1315 if (!ProcessEvent(iEvent)) {
930e6e3e 1316 Abort("ProcessEvent",TSelector::kAbortFile);
1317 return kFALSE;
4b71572b 1318 }
1319 iEvent++;
1320 }
1321 SlaveTerminate();
1322 if (GetAbort() != TSelector::kContinue) return kFALSE;
1323 Terminate();
1324 if (GetAbort() != TSelector::kContinue) return kFALSE;
21a3aa09 1325 }
21a3aa09 1326
1327 return kTRUE;
1328}
1329
1330//_____________________________________________________________________________
4b71572b 1331void AliReconstruction::InitRawReader(const char* input)
21a3aa09 1332{
4b71572b 1333 // Init raw-reader and
21a3aa09 1334 // set the input in case of raw data
0a035be5 1335
1336 AliCodeTimerAuto("",0);
1337
4b71572b 1338 if (input) fRawInput = input;
1339 fRawReader = AliRawReader::Create(fRawInput.Data());
c35f192e 1340 if (!fRawReader) {
1341 if (fRawInput.IsNull()) {
1342 AliInfo("Reconstruction will run over digits");
1343 }
1344 else {
1345 AliFatal("Can not create raw-data reader ! Exiting...");
1346 }
1347 }
e0027792 1348
35042093 1349 if (!fEquipIdMap.IsNull() && fRawReader)
1350 fRawReader->LoadEquipmentIdsMap(fEquipIdMap);
1351
cd0b062e 1352 if (!fUseHLTData.IsNull()) {
1353 // create the RawReaderHLT which performs redirection of HLT input data for
1354 // the specified detectors
1355 AliRawReader* pRawReader=AliRawHLTManager::CreateRawReaderHLT(fRawReader, fUseHLTData.Data());
1356 if (pRawReader) {
1357 fParentRawReader=fRawReader;
1358 fRawReader=pRawReader;
1359 } else {
1360 AliError(Form("can not create Raw Reader for HLT input %s", fUseHLTData.Data()));
1361 }
1362 }
4b71572b 1363 AliSysInfo::AddStamp("CreateRawReader");
1364}
cd0b062e 1365
4b71572b 1366//_____________________________________________________________________________
1367void AliReconstruction::InitRun(const char* input)
1368{
1369 // Initialization of raw-reader,
1370 // run number, CDB etc.
52dd4a8c 1371 AliCodeTimerAuto("",0);
4b71572b 1372 AliSysInfo::AddStamp("Start");
1373
002c9d1b 1374 // Initialize raw-reader if any
4b71572b 1375 InitRawReader(input);
596a855f 1376
ec92bee0 1377 // Initialize the CDB storage
795e4a22 1378 InitCDB();
ec92bee0 1379
6bae477a 1380 // Set run number in CDBManager (if it is not already set by the user)
4b71572b 1381 if (!SetRunNumberFromData()) {
1382 Abort("SetRunNumberFromData", TSelector::kAbortProcess);
1383 return;
1384 }
002c9d1b 1385
795e4a22 1386 // Set CDB lock: from now on it is forbidden to reset the run number
1387 // or the default storage or to activate any further storage!
1388 SetCDBLock();
1389
002c9d1b 1390}
1391
1392//_____________________________________________________________________________
1393void AliReconstruction::Begin(TTree *)
1394{
1395 // Initialize AlReconstruction before
1396 // going into the event loop
1397 // Should follow the TSelector convention
1398 // i.e. initialize only the object on the client side
52dd4a8c 1399 AliCodeTimerAuto("",0);
db4aeca1 1400
b4fef0d2 1401 AliReconstruction *reco = NULL;
002c9d1b 1402 if (fInput) {
8fb1f1dc 1403 if ((reco = (AliReconstruction*)fInput->FindObject("AliReconstruction"))) {
002c9d1b 1404 *this = *reco;
002c9d1b 1405 }
1406 AliSysInfo::AddStamp("ReadInputInBegin");
1407 }
1408
6bae477a 1409 // Import ideal TGeo geometry and apply misalignment
1410 if (!gGeoManager) {
1411 TString geom(gSystem->DirName(fGAliceFileName));
1412 geom += "/geometry.root";
98e303d9 1413 AliGeomManager::LoadGeometry(geom.Data());
4b71572b 1414 if (!gGeoManager) {
1415 Abort("LoadGeometry", TSelector::kAbortProcess);
1416 return;
1417 }
281270d3 1418 AliSysInfo::AddStamp("LoadGeom");
ff5970a3 1419 TString detsToCheck=fRunLocalReconstruction;
4b71572b 1420 if(!AliGeomManager::CheckSymNamesLUT(detsToCheck.Data())) {
1421 Abort("CheckSymNamesLUT", TSelector::kAbortProcess);
1422 return;
1423 }
281270d3 1424 AliSysInfo::AddStamp("CheckGeom");
6bae477a 1425 }
8e245d15 1426
4b71572b 1427 if (!MisalignGeometry(fLoadAlignData)) {
1428 Abort("MisalignGeometry", TSelector::kAbortProcess);
1429 return;
1430 }
1431 AliCDBManager::Instance()->UnloadFromCache("GRP/Geometry/Data");
281270d3 1432 AliSysInfo::AddStamp("MisalignGeom");
6bae477a 1433
8cb26cdf 1434 if (!InitGRP()) {
1435 Abort("InitGRP", TSelector::kAbortProcess);
1436 return;
1437 }
1438 AliSysInfo::AddStamp("InitGRP");
1439
4b71572b 1440 if (!LoadCDB()) {
1441 Abort("LoadCDB", TSelector::kAbortProcess);
1442 return;
1443 }
1444 AliSysInfo::AddStamp("LoadCDB");
325aa76f 1445
a6dd87ad 1446 if (!LoadTriggerScalersCDB()) {
1447 Abort("LoadTriggerScalersCDB", TSelector::kAbortProcess);
1448 return;
1449 }
1450 AliSysInfo::AddStamp("LoadTriggerScalersCDB");
1451
52dd4a8c 1452 if (!LoadCTPTimeParamsCDB()) {
1453 Abort("LoadCTPTimeParamsCDB", TSelector::kAbortProcess);
1454 return;
1455 }
1456 AliSysInfo::AddStamp("LoadCTPTimeParamsCDB");
a6dd87ad 1457
bd26f597 1458 if (!ReadIntensityInfoCDB()) {
1459 Abort("ReadIntensityInfoCDB", TSelector::kAbortProcess);
1460 return;
1461 }
1462 AliSysInfo::AddStamp("ReadIntensityInfoCDB");
1463
7e88424f 1464 // Read the reconstruction parameters from OCDB
1465 if (!InitRecoParams()) {
002c9d1b 1466 AliWarning("Not all detectors have correct RecoParam objects initialized");
4b71572b 1467 }
1468 AliSysInfo::AddStamp("InitRecoParams");
1469
fd2b273c 1470 if (fInput && gProof) {
b4fef0d2 1471 if (reco) *reco = *this;
fd2b273c 1472
45a6dee6 1473 gGeoManager->SetName("Geometry");
fd2b273c 1474 gProof->AddInputData(gGeoManager,kTRUE);
002c9d1b 1475 gGeoManager = NULL;
fd2b273c 1476 gProof->AddInputData(const_cast<TMap*>(AliCDBManager::Instance()->GetEntryCache()),kTRUE);
002c9d1b 1477 fInput->Add(new TParameter<Int_t>("RunNumber",AliCDBManager::Instance()->GetRun()));
f7a1cc68 1478 AliMagF *magFieldMap = (AliMagF*)TGeoGlobalMagField::Instance()->GetField();
ead7b391 1479 magFieldMap->SetName("MagneticFieldMap");
fd2b273c 1480 gProof->AddInputData(magFieldMap,kTRUE);
002c9d1b 1481 }
4b71572b 1482
1483}
1484
1485//_____________________________________________________________________________
1486void AliReconstruction::SlaveBegin(TTree*)
1487{
1488 // Initialization related to run-loader,
1489 // vertexer, trackers, recontructors
1490 // In proof mode it is executed on the slave
52dd4a8c 1491 AliCodeTimerAuto("",0);
4b71572b 1492
db4aeca1 1493 TProofOutputFile *outProofFile = NULL;
81d57268 1494 if (fInput) {
1495 if (AliDebugLevel() > 0) fInput->Print();
ef5e52f6 1496 if (AliDebugLevel() > 10) fInput->Dump();
db4aeca1 1497 if (AliReconstruction *reco = (AliReconstruction*)fInput->FindObject("AliReconstruction")) {
1498 *this = *reco;
1499 }
4b71572b 1500 if (TGeoManager *tgeo = (TGeoManager*)fInput->FindObject("Geometry")) {
1501 gGeoManager = tgeo;
1502 AliGeomManager::SetGeometry(tgeo);
7e88424f 1503 }
281270d3 1504 if (TMap *entryCache = (TMap*)fInput->FindObject("CDBEntryCache")) {
1505 Int_t runNumber = -1;
1506 if (TProof::GetParameter(fInput,"RunNumber",runNumber) == 0) {
1507 AliCDBManager *man = AliCDBManager::Instance(entryCache,runNumber);
1508 man->SetCacheFlag(kTRUE);
1509 man->SetLock(kTRUE);
1510 man->Print();
1511 }
4b71572b 1512 }
ead7b391 1513 if (AliMagF *map = (AliMagF*)fInput->FindObject("MagneticFieldMap")) {
ef5e52f6 1514 AliMagF *newMap = new AliMagF(*map);
1515 if (!newMap->LoadParameterization()) {
1516 Abort("AliMagF::LoadParameterization", TSelector::kAbortProcess);
1517 return;
1518 }
1519 TGeoGlobalMagField::Instance()->SetField(newMap);
1520 TGeoGlobalMagField::Instance()->Lock();
4b71572b 1521 }
81d57268 1522 if (TNamed *outputFileName = (TNamed*)fInput->FindObject("PROOF_OUTPUTFILE"))
1523 fProofOutputFileName = outputFileName->GetTitle();
1524 if (TNamed *outputLocation = (TNamed*)fInput->FindObject("PROOF_OUTPUTFILE_LOCATION"))
1525 fProofOutputLocation = outputLocation->GetTitle();
1526 if (fInput->FindObject("PROOF_OUTPUTFILE_DATASET"))
1527 fProofOutputDataset = kTRUE;
1528 if (TNamed *archiveList = (TNamed*)fInput->FindObject("PROOF_OUTPUTFILE_ARCHIVE"))
1529 fProofOutputArchive = archiveList->GetTitle();
1530 if (!fProofOutputFileName.IsNull() &&
1531 !fProofOutputLocation.IsNull() &&
1532 fProofOutputArchive.IsNull()) {
1533 if (!fProofOutputDataset) {
1534 outProofFile = new TProofOutputFile(fProofOutputFileName.Data(),"M");
1535 outProofFile->SetOutputFileName(Form("%s%s",fProofOutputLocation.Data(),fProofOutputFileName.Data()));
1536 }
1537 else {
1538 outProofFile = new TProofOutputFile(fProofOutputFileName.Data(),"DROV",fProofOutputLocation.Data());
1539 }
1540 if (AliDebugLevel() > 0) outProofFile->Dump();
db4aeca1 1541 fOutput->Add(outProofFile);
4b71572b 1542 }
002c9d1b 1543 AliSysInfo::AddStamp("ReadInputInSlaveBegin");
7e88424f 1544 }
325aa76f 1545
4b71572b 1546 // get the run loader
1547 if (!InitRunLoader()) {
1548 Abort("InitRunLoader", TSelector::kAbortProcess);
1549 return;
1550 }
1551 AliSysInfo::AddStamp("LoadLoader");
1552
325aa76f 1553 ftVertexer = new AliVertexerTracks(AliTracker::GetBz());
2257f27e 1554
f08fc9f5 1555 // get trackers
b8cd5251 1556 if (!fRunTracking.IsNull() && !CreateTrackers(fRunTracking)) {
4b71572b 1557 Abort("CreateTrackers", TSelector::kAbortProcess);
1558 return;
1559 }
1560 AliSysInfo::AddStamp("CreateTrackers");
24f7a148 1561
36711aa4 1562 // create the ESD output file and tree
db4aeca1 1563 if (!outProofFile) {
1564 ffile = TFile::Open("AliESDs.root", "RECREATE");
1565 ffile->SetCompressionLevel(2);
1566 if (!ffile->IsOpen()) {
1567 Abort("OpenESDFile", TSelector::kAbortProcess);
1568 return;
1569 }
1570 }
1571 else {
81d57268 1572 AliInfo(Form("Opening output PROOF file: %s/%s",
1573 outProofFile->GetDir(), outProofFile->GetFileName()));
db4aeca1 1574 if (!(ffile = outProofFile->OpenFile("RECREATE"))) {
1575 Abort(Form("Problems opening output PROOF file: %s/%s",
1576 outProofFile->GetDir(), outProofFile->GetFileName()),
1577 TSelector::kAbortProcess);
1578 return;
1579 }
596a855f 1580 }
46698ae4 1581
21a3aa09 1582 ftree = new TTree("esdTree", "Tree with ESD objects");
1583 fesd = new AliESDEvent();
1584 fesd->CreateStdContent();
8b12d288 1585 // add a so far non-std object to the ESD, this will
1586 // become part of the std content
1587 fesd->AddObject(new AliESDHLTDecision);
1588
32ba9c61 1589 fesd->WriteToTree(ftree);
1d99986f 1590 if (fWriteESDfriend) {
ee7c441c 1591 ffileF = TFile::Open("AliESDfriends.root", "RECREATE");
03a8000a 1592 ftreeF = new TTree("esdFriendTree", "Tree with ESD Friend objects");
ee7c441c 1593 fesdf = new AliESDfriend();
03a8000a 1594 ftreeF->Branch("ESDfriend.","AliESDfriend", &fesdf);
21a3aa09 1595 fesd->AddObject(fesdf);
ee7c441c 1596 ffile->cd();
1d99986f 1597 }
f9604a22 1598 ftree->GetUserInfo()->Add(fesd);
1599
1600 fhlttree = new TTree("HLTesdTree", "Tree with HLT ESD objects");
1601 fhltesd = new AliESDEvent();
1602 fhltesd->CreateStdContent();
7491aea6 1603 // read the ESD template from CDB
1604 // HLT is allowed to put non-std content to its ESD, the non-std
1605 // objects need to be created before invocation of WriteToTree in
1606 // order to create all branches. Initialization is done from an
1607 // ESD layout template in CDB
1608 AliCDBManager* man = AliCDBManager::Instance();
1609 AliCDBPath hltESDConfigPath("HLT/ConfigHLT/esdLayout");
1610 AliCDBEntry* hltESDConfig=NULL;
1611 if (man->GetId(hltESDConfigPath)!=NULL &&
1612 (hltESDConfig=man->Get(hltESDConfigPath))!=NULL) {
1613 AliESDEvent* pESDLayout=dynamic_cast<AliESDEvent*>(hltESDConfig->GetObject());
1614 if (pESDLayout) {
1615 // init all internal variables from the list of objects
1616 pESDLayout->GetStdContent();
1617
1618 // copy content and create non-std objects
1619 *fhltesd=*pESDLayout;
1620 fhltesd->Reset();
1621 } else {
1622 AliError(Form("error setting hltEsd layout from %s: invalid object type",
1623 hltESDConfigPath.GetPath().Data()));
1624 }
1625 }
1626
f9604a22 1627 fhltesd->WriteToTree(fhlttree);
1628 fhlttree->GetUserInfo()->Add(fhltesd);
5728d3d5 1629
ac4a7581 1630 ProcInfo_t procInfo;
1631 gSystem->GetProcInfo(&procInfo);
73bbf779 1632 AliInfo(Form("Current memory usage %ld %ld", procInfo.fMemResident, procInfo.fMemVirtual));
8661738e 1633
325aa76f 1634 //QA
930e6e3e 1635 //Initialize the QA and start of cycle
f1c1204d 1636 if (fRunQA || fRunGlobalQA)
1637 InitQA() ;
aa3c69a9 1638
7167ae53 1639 //Initialize the Plane Efficiency framework
1640 if (fRunPlaneEff && !InitPlaneEff()) {
4b71572b 1641 Abort("InitPlaneEff", TSelector::kAbortProcess);
1642 return;
7167ae53 1643 }
aa3c69a9 1644
14dd053c 1645 if (strcmp(gProgName,"alieve") == 0)
1646 fRunAliEVE = InitAliEVE();
1647
4b71572b 1648 return;
21a3aa09 1649}
1650
1651//_____________________________________________________________________________
4b71572b 1652Bool_t AliReconstruction::Process(Long64_t entry)
1653{
1654 // run the reconstruction over a single entry
1655 // from the chain with raw data
52dd4a8c 1656 AliCodeTimerAuto("",0);
4b71572b 1657
1658 TTree *currTree = fChain->GetTree();
33314186 1659 AliRawVEvent *event = NULL;
4b71572b 1660 currTree->SetBranchAddress("rawevent",&event);
1661 currTree->GetEntry(entry);
1662 fRawReader = new AliRawReaderRoot(event);
1663 fStatus = ProcessEvent(fRunLoader->GetNumberOfEvents());
1664 delete fRawReader;
1665 fRawReader = NULL;
1666 delete event;
1667
1668 return fStatus;
1669}
1670
1671//_____________________________________________________________________________
1672void AliReconstruction::Init(TTree *tree)
1673{
0a035be5 1674 // Implementation of TSelector::Init()
1675 // method
4b71572b 1676 if (tree == 0) {
1677 AliError("The input tree is not found!");
1678 return;
1679 }
1680 fChain = tree;
1681}
1682
1683//_____________________________________________________________________________
1684Bool_t AliReconstruction::ProcessEvent(Int_t iEvent)
21a3aa09 1685{
1686 // run the reconstruction over a single event
1687 // The event loop is steered in Run method
1688
10d100d4 1689
470f88b0 1690 static Long_t oldMres=0;
1691 static Long_t oldMvir=0;
1692 static Float_t oldCPU=0;
d97f1dbe 1693 static Long_t aveDMres=0;
1694 static Long_t aveDMvir=0;
1695 static Float_t aveDCPU=0;
470f88b0 1696
52dd4a8c 1697 AliCodeTimerAuto("",0);
21a3aa09 1698
0a035be5 1699 AliESDpid pid;
10d100d4 1700
21a3aa09 1701 if (iEvent >= fRunLoader->GetNumberOfEvents()) {
1702 fRunLoader->SetEventNumber(iEvent);
4018c387 1703 if (fRawReader)
1704 fRunLoader->GetHeader()->Reset(fRawReader->GetRunNumber(),
1705 iEvent, iEvent);
21a3aa09 1706 fRunLoader->TreeE()->Fill();
396f89bc 1707 if (fRawReader && fRawReader->UseAutoSaveESD())
4b71572b 1708 fRunLoader->TreeE()->AutoSave("SaveSelf");
21a3aa09 1709 }
1710
1711 if ((iEvent < fFirstEvent) || ((fLastEvent >= 0) && (iEvent > fLastEvent))) {
21a3aa09 1712 return kTRUE;
1713 }
1714
aa3c69a9 1715
16447f18 1716 fRunLoader->GetEvent(iEvent);
1717
7e88424f 1718 // Fill Event-info object
1719 GetEventInfo();
77ba28ba 1720 fRecoParam.SetEventSpecie(fRunInfo,fEventInfo,fListOfCosmicTriggers);
d97f1dbe 1721
1722 ProcInfo_t procInfo;
1723 if(iEvent==fFirstEvent) {
1724 gSystem->GetProcInfo(&procInfo);
1725 oldMres=procInfo.fMemResident;
1726 oldMvir=procInfo.fMemVirtual;
1727 oldCPU=procInfo.fCpuUser+procInfo.fCpuSys;
1728 }
470f88b0 1729 AliInfo(Form("================================= Processing event %d of type %-10s ==================================", iEvent,fRecoParam.PrintEventSpecie()));
7e88424f 1730
a00021a7 1731 // Set the reco-params
1732 {
1733 TString detStr = fLoadCDB;
ac4a7581 1734 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
a00021a7 1735 if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
1736 AliReconstructor *reconstructor = GetReconstructor(iDet);
1737 if (reconstructor && fRecoParam.GetDetRecoParamArray(iDet)) {
57acd2d2 1738 const AliDetectorRecoParam *par = fRecoParam.GetDetRecoParam(iDet);
1739 reconstructor->SetRecoParam(par);
0a035be5 1740 reconstructor->GetPidSettings(&pid);
10d100d4 1741 reconstructor->SetEventInfo(&fEventInfo);
57acd2d2 1742 if (fRunQA) {
eca4fa66 1743 AliQAManager::QAManager()->SetRecoParam(iDet, par) ;
619aafe6 1744 if (par) AliQAManager::QAManager()->SetEventSpecie(AliRecoParam::Convert(par->GetEventSpecie())) ;
57acd2d2 1745 }
a00021a7 1746 }
1747 }
9dad1020 1748 if (fRunQA) {
1749 const AliDetectorRecoParam *grppar = fRecoParam.GetDetRecoParam(kNDetectors);
1750 AliQAManager::QAManager()->SetRecoParam(AliQAv1::kGLOBAL, grppar) ;
1751 AliQAManager::QAManager()->SetEventSpecie(AliRecoParam::Convert(grppar->GetEventSpecie())) ;
1752 }
a00021a7 1753 }
1754
ca13fb87 1755 // QA on single raw
514cb8c7 1756 if (fRunQA && IsInTasks(AliQAv1::kRAWS)) {
eca4fa66 1757 AliQAManager::QAManager()->SetEventSpecie(fRecoParam.GetEventSpecie()) ;
1758 AliQAManager::QAManager()->RunOneEvent(fRawReader) ;
57acd2d2 1759 }
d506c543 1760 // local single event reconstruction
b26c3770 1761 if (!fRunLocalReconstruction.IsNull()) {
d506c543 1762 TString detectors=fRunLocalReconstruction;
a441bf51 1763 // run HLT event reconstruction first
d506c543 1764 // ;-( IsSelected changes the string
1765 if (IsSelected("HLT", detectors) &&
1766 !RunLocalEventReconstruction("HLT")) {
4b71572b 1767 if (fStopOnError) {CleanUp(); return kFALSE;}
a441bf51 1768 }
1769 detectors=fRunLocalReconstruction;
1770 detectors.ReplaceAll("HLT", "");
1771 if (!RunLocalEventReconstruction(detectors)) {
13effe3f 1772 if (fStopOnError) {
1773 CleanUp();
1774 return kFALSE;
1775 }
b26c3770 1776 }
1777 }
1778
6b3a883f 1779
1780 // fill Event header information from the RawEventHeader
1781 if (fRawReader){FillRawEventHeaderESD(fesd);}
1782 if (fRawReader){FillRawEventHeaderESD(fhltesd);}
1783
21a3aa09 1784 fesd->SetRunNumber(fRunLoader->GetHeader()->GetRun());
1785 fhltesd->SetRunNumber(fRunLoader->GetHeader()->GetRun());
7b649c02 1786
1787 ((AliESDRun*)fesd->GetESDRun())->SetDetectorsInDAQ(fRunInfo->GetDetectorMask());
1788 ((AliESDRun*)fhltesd->GetESDRun())->SetDetectorsInDAQ(fRunInfo->GetDetectorMask());
1789 ((AliESDRun*)fesd->GetESDRun())->SetDetectorsInReco(AliDAQ::DetectorPatternOffline(fFillESD.Data()));
1790 ((AliESDRun*)fhltesd->GetESDRun())->SetDetectorsInReco(AliDAQ::DetectorPatternOffline(fFillESD.Data()));
1791
21a3aa09 1792 fesd->SetEventNumberInFile(fRunLoader->GetHeader()->GetEventNrInRun());
1793 fhltesd->SetEventNumberInFile(fRunLoader->GetHeader()->GetEventNrInRun());
fd2e2210 1794
1795 fesd->SetEventSpecie(fRecoParam.GetEventSpecie());
1796 fhltesd->SetEventSpecie(fRecoParam.GetEventSpecie());
46698ae4 1797
d6ee376f 1798 // Set magnetic field from the tracker
21a3aa09 1799 fesd->SetMagneticField(AliTracker::GetBz());
1800 fhltesd->SetMagneticField(AliTracker::GetBz());
33fe5eb1 1801 //
3d84ad67 1802 AliESDRun *esdRun,*esdRunH;
1803 esdRun = (AliESDRun*)fesd->GetESDRun();
1804 esdRunH = (AliESDRun*)fhltesd->GetESDRun();
1805 esdRun->SetBeamEnergyIsSqrtSHalfGeV();
1806 esdRunH->SetBeamEnergyIsSqrtSHalfGeV();
1807 //
1808 for (int ib=2;ib--;) for (int it=2;it--;) {
1809 esdRun->SetMeanIntensity(ib,it, fBeamInt[ib][it]);
1810 esdRunH->SetMeanIntensity(ib,it, fBeamInt[ib][it]);
1811 }
c587bcde 1812 //
33fe5eb1 1813 AliMagF* fld = (AliMagF*)TGeoGlobalMagField::Instance()->GetField();
1814 if (fld) { // set info needed for field initialization
1815 fesd->SetCurrentL3(fld->GetCurrentSol());
1816 fesd->SetCurrentDip(fld->GetCurrentDip());
1817 fesd->SetBeamEnergy(fld->GetBeamEnergy());
1818 fesd->SetBeamType(fld->GetBeamTypeText());
1819 fesd->SetUniformBMap(fld->IsUniform());
1820 fesd->SetBInfoStored();
1821 //
1822 fhltesd->SetCurrentL3(fld->GetCurrentSol());
1823 fhltesd->SetCurrentDip(fld->GetCurrentDip());
1824 fhltesd->SetBeamEnergy(fld->GetBeamEnergy());
1825 fhltesd->SetBeamType(fld->GetBeamTypeText());
1826 fhltesd->SetUniformBMap(fld->IsUniform());
1827 fhltesd->SetBInfoStored();
1828 }
1829 //
71f6cda4 1830 // Set most probable pt, for B=0 tracking
9257a1bd 1831 // Get the global reco-params. They are atposition 16 inside the array of detectors in fRecoParam
ac4a7581 1832 const AliGRPRecoParam *grpRecoParam = dynamic_cast<const AliGRPRecoParam*>(fRecoParam.GetDetRecoParam(kNDetectors));
71f6cda4 1833 if (grpRecoParam) AliExternalTrackParam::SetMostProbablePt(grpRecoParam->GetMostProbablePt());
46698ae4 1834
2e3550da 1835 // Fill raw-data error log into the ESD
21a3aa09 1836 if (fRawReader) FillRawDataErrorLog(iEvent,fesd);
2e3550da 1837
2257f27e 1838 // vertex finder
1839 if (fRunVertexFinder) {
4b71572b 1840 if (!RunVertexFinder(fesd)) {
1841 if (fStopOnError) {CleanUp(); return kFALSE;}
2257f27e 1842 }
1843 }
1844
58e8dc31 1845 // For Plane Efficiency: run the SPD trackleter
1846 if (fRunPlaneEff && fSPDTrackleter) {
1847 if (!RunSPDTrackleting(fesd)) {
1848 if (fStopOnError) {CleanUp(); return kFALSE;}
1849 }
1850 }
1851
e66fbafb 1852 // Muon tracking
b8cd5251 1853 if (!fRunTracking.IsNull()) {
e66fbafb 1854 if (fRunMuonTracking) {
21a3aa09 1855 if (!RunMuonTracking(fesd)) {
4b71572b 1856 if (fStopOnError) {CleanUp(); return kFALSE;}
24f7a148 1857 }
596a855f 1858 }
1859 }
1860
e66fbafb 1861 // barrel tracking
1862 if (!fRunTracking.IsNull()) {
0a035be5 1863 if (!RunTracking(fesd,pid)) {
4b71572b 1864 if (fStopOnError) {CleanUp(); return kFALSE;}
e66fbafb 1865 }
1866 }
21c573b7 1867
596a855f 1868 // fill ESD
1869 if (!fFillESD.IsNull()) {
d506c543 1870 TString detectors=fFillESD;
f6806ad3 1871 // run HLT first and on hltesd
d506c543 1872 // ;-( IsSelected changes the string
1873 if (IsSelected("HLT", detectors) &&
1874 !FillESD(fhltesd, "HLT")) {
4b71572b 1875 if (fStopOnError) {CleanUp(); return kFALSE;}
f6806ad3 1876 }
1877 detectors=fFillESD;
d5105682 1878 // Temporary fix to avoid problems with HLT that overwrites the offline ESDs
1879 if (detectors.Contains("ALL")) {
1880 detectors="";
ac4a7581 1881 for (Int_t idet=0; idet<kNDetectors; ++idet){
d5105682 1882 detectors += fgkDetectorName[idet];
1883 detectors += " ";
1884 }
1885 }
f6806ad3 1886 detectors.ReplaceAll("HLT", "");
1887 if (!FillESD(fesd, detectors)) {
4b71572b 1888 if (fStopOnError) {CleanUp(); return kFALSE;}
596a855f 1889 }
1890 }
f858b00e 1891
1892 // AdC+FN
bc334fcd 1893 if (fReconstructor[3])
1894 GetReconstructor(3)->FillEventTimeWithTOF(fesd,&pid);
f858b00e 1895
596a855f 1896 // combined PID
0a035be5 1897 pid.MakePID(fesd);
596a855f 1898
b647652d 1899 if (fFillTriggerESD) {
4b71572b 1900 if (!FillTriggerESD(fesd)) {
1901 if (fStopOnError) {CleanUp(); return kFALSE;}
b647652d 1902 }
1903 }
f7812afc 1904 // Always fill scalers
1905 if (!FillTriggerScalers(fesd)) {
1906 if (fStopOnError) {CleanUp(); return kFALSE;}
1907 }
1908
b647652d 1909
21a3aa09 1910 ffile->cd();
a6ee503a 1911
3c3709c4 1912 //
67be5c77 1913 // Propagate track to the beam pipe (if not already done by ITS)
3c3709c4 1914 //
21a3aa09 1915 const Int_t ntracks = fesd->GetNumberOfTracks();
3c3709c4 1916 const Double_t kRadius = 2.8; //something less than the beam pipe radius
1917
1918 TObjArray trkArray;
1919 UShort_t *selectedIdx=new UShort_t[ntracks];
1920
1921 for (Int_t itrack=0; itrack<ntracks; itrack++){
98a50ff3 1922 const Double_t kMaxStep = 1; //max step over the material
3c3709c4 1923 Bool_t ok;
1924
21a3aa09 1925 AliESDtrack *track = fesd->GetTrack(itrack);
3c3709c4 1926 if (!track) continue;
1927
1928 AliExternalTrackParam *tpcTrack =
1929 (AliExternalTrackParam *)track->GetTPCInnerParam();
bcabd6af 1930 ok = kFALSE;
1931 if (tpcTrack)
1932 ok = AliTracker::
52dd4a8c 1933 PropagateTrackToBxByBz(tpcTrack,kRadius,track->GetMass(),kMaxStep,kFALSE);
43c9dae1 1934
3c3709c4 1935 if (ok) {
1936 Int_t n=trkArray.GetEntriesFast();
1937 selectedIdx[n]=track->GetID();
1938 trkArray.AddLast(tpcTrack);
1939 }
1940
3d65e645 1941 //Tracks refitted by ITS should already be at the SPD vertex
1942 if (track->IsOn(AliESDtrack::kITSrefit)) continue;
1943
1944 AliTracker::
52dd4a8c 1945 PropagateTrackToBxByBz(track,kRadius,track->GetMass(),kMaxStep,kFALSE);
1946 Double_t x[3]; track->GetXYZ(x);
1947 Double_t b[3]; AliTracker::GetBxByBz(x,b);
1948 track->RelateToVertexBxByBz(fesd->GetPrimaryVertexSPD(), b, kVeryBig);
3c3709c4 1949
3c3709c4 1950 }
1951
1952 //
1953 // Improve the reconstructed primary vertex position using the tracks
1954 //
59224b2b 1955 Bool_t runVertexFinderTracks = fRunVertexFinderTracks;
1956 if(fesd->GetPrimaryVertexSPD()) {
1957 TString vtitle = fesd->GetPrimaryVertexSPD()->GetTitle();
1958 if(vtitle.Contains("cosmics")) {
1959 runVertexFinderTracks=kFALSE;
1960 }
c060d7fe 1961 }
a00021a7 1962
1963 if (runVertexFinderTracks) {
3c3709c4 1964 // TPC + ITS primary vertex
f09c879d 1965 ftVertexer->SetITSMode();
f2a195c1 1966 ftVertexer->SetConstraintOff();
a00021a7 1967 // get cuts for vertexer from AliGRPRecoParam
1c7554f9 1968 Bool_t constrSPD=kFALSE;
a00021a7 1969 if (grpRecoParam) {
1970 Int_t nCutsVertexer = grpRecoParam->GetVertexerTracksNCuts();
1971 Double_t *cutsVertexer = new Double_t[nCutsVertexer];
1972 grpRecoParam->GetVertexerTracksCutsITS(cutsVertexer);
1973 ftVertexer->SetCuts(cutsVertexer);
1974 delete [] cutsVertexer; cutsVertexer = NULL;
1c7554f9 1975 if(grpRecoParam->GetVertexerTracksConstraintITS()) {
1976 if(fDiamondProfile && fDiamondProfile->GetXRes()<kRadius){
1977 ftVertexer->SetVtxStart(fDiamondProfile); // apply constraint only if sigmax is smaller than the beam pipe radius
1978 }else{
1979 if(fDiamondProfileSPD && fDiamondProfileSPD->GetXRes()<kRadius){
1980 ftVertexer->SetVtxStart(fDiamondProfileSPD);
1981 constrSPD=kTRUE;
1982 }
1983 }
dd15203b 1984 }
43c9dae1 1985 }
21a3aa09 1986 AliESDVertex *pvtx=ftVertexer->FindPrimaryVertex(fesd);
3c3709c4 1987 if (pvtx) {
1c7554f9 1988 if(constrSPD){
1989 TString title=pvtx->GetTitle();
1990 title.Append("SPD");
1991 pvtx->SetTitle(title);
1992 }
3c3709c4 1993 if (pvtx->GetStatus()) {
c264b61b 1994 fesd->SetPrimaryVertexTracks(pvtx);
3c3709c4 1995 for (Int_t i=0; i<ntracks; i++) {
21a3aa09 1996 AliESDtrack *t = fesd->GetTrack(i);
52dd4a8c 1997 Double_t x[3]; t->GetXYZ(x);
1998 Double_t b[3]; AliTracker::GetBxByBz(x,b);
1999 t->RelateToVertexBxByBz(pvtx, b, kVeryBig);
3c3709c4 2000 }
2001 }
9bcaa1d7 2002 delete pvtx; pvtx=NULL;
3c3709c4 2003 }
2004
2005 // TPC-only primary vertex
f09c879d 2006 ftVertexer->SetTPCMode();
f2a195c1 2007 ftVertexer->SetConstraintOff();
a00021a7 2008 // get cuts for vertexer from AliGRPRecoParam
2009 if (grpRecoParam) {
2010 Int_t nCutsVertexer = grpRecoParam->GetVertexerTracksNCuts();
2011 Double_t *cutsVertexer = new Double_t[nCutsVertexer];
2012 grpRecoParam->GetVertexerTracksCutsTPC(cutsVertexer);
2013 ftVertexer->SetCuts(cutsVertexer);
2014 delete [] cutsVertexer; cutsVertexer = NULL;
dd15203b 2015 if(fDiamondProfileTPC && grpRecoParam->GetVertexerTracksConstraintTPC()) {
2016 if(fDiamondProfileTPC->GetXRes()<kRadius) ftVertexer->SetVtxStart(fDiamondProfileTPC); // apply constraint only if sigmax is smaller than the beam pipe radius
2017 }
43c9dae1 2018 }
21a3aa09 2019 pvtx=ftVertexer->FindPrimaryVertex(&trkArray,selectedIdx);
3c3709c4 2020 if (pvtx) {
2021 if (pvtx->GetStatus()) {
21a3aa09 2022 fesd->SetPrimaryVertexTPC(pvtx);
3d65e645 2023 for (Int_t i=0; i<ntracks; i++) {
2024 AliESDtrack *t = fesd->GetTrack(i);
52dd4a8c 2025 Double_t x[3]; t->GetXYZ(x);
2026 Double_t b[3]; AliTracker::GetBxByBz(x,b);
2027 t->RelateToVertexTPCBxByBz(pvtx, b, kVeryBig);
3c3709c4 2028 }
2029 }
9bcaa1d7 2030 delete pvtx; pvtx=NULL;
3c3709c4 2031 }
2032
2033 }
2034 delete[] selectedIdx;
2035
1c7554f9 2036 if(fDiamondProfile && fDiamondProfile->GetXRes()<kRadius) fesd->SetDiamond(fDiamondProfile);
2037 else fesd->SetDiamond(fDiamondProfileSPD);
c5e3e5d1 2038
d1683eef 2039 if (fRunV0Finder) {
2040 // V0 finding
2041 AliV0vertexer vtxer;
61a14552 2042 // get cuts for V0vertexer from AliGRPRecoParam
2043 if (grpRecoParam) {
2044 Int_t nCutsV0vertexer = grpRecoParam->GetVertexerV0NCuts();
2045 Double_t *cutsV0vertexer = new Double_t[nCutsV0vertexer];
2046 grpRecoParam->GetVertexerV0Cuts(cutsV0vertexer);
2047 vtxer.SetCuts(cutsV0vertexer);
2048 delete [] cutsV0vertexer; cutsV0vertexer = NULL;
2049 }
21a3aa09 2050 vtxer.Tracks2V0vertices(fesd);
5e4ff34d 2051
d1683eef 2052 if (fRunCascadeFinder) {
2053 // Cascade finding
2054 AliCascadeVertexer cvtxer;
61a14552 2055 // get cuts for CascadeVertexer from AliGRPRecoParam
2056 if (grpRecoParam) {
2057 Int_t nCutsCascadeVertexer = grpRecoParam->GetVertexerCascadeNCuts();
2058 Double_t *cutsCascadeVertexer = new Double_t[nCutsCascadeVertexer];
2059 grpRecoParam->GetVertexerCascadeCuts(cutsCascadeVertexer);
2060 cvtxer.SetCuts(cutsCascadeVertexer);
2061 delete [] cutsCascadeVertexer; cutsCascadeVertexer = NULL;
2062 }
21a3aa09 2063 cvtxer.V0sTracks2CascadeVertices(fesd);
d1683eef 2064 }
5e4ff34d 2065 }
c8122432 2066
2067 // write ESD
2068 if (fCleanESD) CleanESD(fesd);
2069 //
1f9831ab 2070 // RS run updated trackleter: since we want to mark the clusters used by tracks and also mark the
2071 // tracks interpreted as primary, this step should be done in the very end, when full
2072 // ESD info is available (particulalry, V0s)
2073 // vertex finder
c8122432 2074 if (fRunMultFinder) {
2075 if (!RunMultFinder(fesd)) {
2076 if (fStopOnError) {CleanUp(); return kFALSE;}
2077 }
2078 }
854c6476 2079
514cb8c7 2080 if (fRunQA && IsInTasks(AliQAv1::kESDS)) {
eca4fa66 2081 AliQAManager::QAManager()->SetEventSpecie(fRecoParam.GetEventSpecie()) ;
aeb8fc30 2082 AliQAManager::QAManager()->RunOneEvent(fesd, fhltesd) ;
57acd2d2 2083 }
bea94759 2084 if (fRunGlobalQA) {
eca4fa66 2085 AliQADataMaker *qadm = AliQAManager::QAManager()->GetQADataMaker(AliQAv1::kGLOBAL);
4018c387 2086 if (qadm)
57acd2d2 2087 qadm->SetEventSpecie(fRecoParam.GetEventSpecie()) ;
514cb8c7 2088 if (qadm && IsInTasks(AliQAv1::kESDS))
4e25ac79 2089 qadm->Exec(AliQAv1::kESDS, fesd);
b03591ab 2090 }
854c6476 2091
8b12d288 2092 // copy HLT decision from HLTesd to esd
2093 // the most relevant information is stored in a reduced container in the esd,
2094 // while the full information can be found in the HLTesd
2095 TObject* pHLTSrc=fhltesd->FindListObject(AliESDHLTDecision::Name());
2096 TObject* pHLTTgt=fesd->FindListObject(AliESDHLTDecision::Name());
2097 if (pHLTSrc && pHLTTgt) {
2098 pHLTSrc->Copy(*pHLTTgt);
2099 }
2100
ee7c441c 2101 if (fWriteESDfriend)
21a3aa09 2102 fesd->GetESDfriend(fesdf);
ee7c441c 2103
21a3aa09 2104 ftree->Fill();
fc01854a 2105 if (fWriteESDfriend) {
f00558b6 2106 WriteESDfriend();
fc01854a 2107 }
500d54ab 2108
2d91a353 2109 // Auto-save the ESD tree in case of prompt reco @P2
396f89bc 2110 if (fRawReader && fRawReader->UseAutoSaveESD()) {
2d91a353 2111 ftree->AutoSave("SaveSelf");
ee7c441c 2112 if (fWriteESDfriend) ftreeF->AutoSave("SaveSelf");
be103ac8 2113 }
2d91a353 2114
500d54ab 2115 // write HLT ESD
21a3aa09 2116 fhlttree->Fill();
1d99986f 2117
14dd053c 2118 // call AliEVE
2119 if (fRunAliEVE) RunAliEVE();
2120
21a3aa09 2121 fesd->Reset();
2122 fhltesd->Reset();
5728d3d5 2123 if (fWriteESDfriend) {
21a3aa09 2124 fesdf->~AliESDfriend();
2125 new (fesdf) AliESDfriend(); // Reset...
5728d3d5 2126 }
a5fa6165 2127
ac4a7581 2128 gSystem->GetProcInfo(&procInfo);
d97f1dbe 2129 Long_t dMres=(procInfo.fMemResident-oldMres)/1024;
2130 Long_t dMvir=(procInfo.fMemVirtual-oldMvir)/1024;
2131 Float_t dCPU=procInfo.fCpuUser+procInfo.fCpuSys-oldCPU;
2132 aveDMres+=(dMres-aveDMres)/(iEvent-fFirstEvent+1);
2133 aveDMvir+=(dMvir-aveDMvir)/(iEvent-fFirstEvent+1);
2134 aveDCPU+=(dCPU-aveDCPU)/(iEvent-fFirstEvent+1);
73bbf779 2135 AliInfo(Form("======================= End Event %d: Res %ld(%3ld <%3ld>) Vir %ld(%3ld <%3ld>) CPU %5.2f <%5.2f> ===================",
d97f1dbe 2136 iEvent, procInfo.fMemResident/1024, dMres, aveDMres, procInfo.fMemVirtual/1024, dMvir, aveDMvir, dCPU, aveDCPU));
470f88b0 2137 oldMres=procInfo.fMemResident;
2138 oldMvir=procInfo.fMemVirtual;
2139 oldCPU=procInfo.fCpuUser+procInfo.fCpuSys;
a5fa6165 2140
ca13fb87 2141 fEventInfo.Reset();
ac4a7581 2142 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
42ec5d3d 2143 if (fReconstructor[iDet]) {
a00021a7 2144 fReconstructor[iDet]->SetRecoParam(NULL);
42ec5d3d 2145 fReconstructor[iDet]->SetEventInfo(NULL);
2146 }
1f26f3e7 2147 if (fTracker[iDet]) fTracker[iDet]->SetEventInfo(NULL);
ca13fb87 2148 }
2149
53c8f690 2150 if (fRunQA || fRunGlobalQA)
eca4fa66 2151 AliQAManager::QAManager()->Increment() ;
53c8f690 2152
ca13fb87 2153 return kTRUE;
21a3aa09 2154}
2155
21a3aa09 2156//_____________________________________________________________________________
4b71572b 2157void AliReconstruction::SlaveTerminate()
21a3aa09 2158{
4b71572b 2159 // Finalize the run on the slave side
21a3aa09 2160 // Called after the exit
2161 // from the event loop
52dd4a8c 2162 AliCodeTimerAuto("",0);
21a3aa09 2163
2164 if (fIsNewRunLoader) { // galice.root didn't exist
2165 fRunLoader->WriteHeader("OVERWRITE");
2166 fRunLoader->CdGAFile();
2167 fRunLoader->Write(0, TObject::kOverwrite);
2168 }
2169
f747912b 2170 const TMap *cdbMap = AliCDBManager::Instance()->GetStorageMap();
2171 const TList *cdbList = AliCDBManager::Instance()->GetRetrievedIds();
2172
2173 TMap *cdbMapCopy = new TMap(cdbMap->GetEntries());
2174 cdbMapCopy->SetOwner(1);
2175 cdbMapCopy->SetName("cdbMap");
2176 TIter iter(cdbMap->GetTable());
2177
2178 TPair* pair = 0;
2179 while((pair = dynamic_cast<TPair*> (iter.Next()))){
2180 TObjString* keyStr = dynamic_cast<TObjString*> (pair->Key());
c7a22819 2181 TObjString* valStr = dynamic_cast<TObjString*> (pair->Value());
2182 if (keyStr && valStr)
2183 cdbMapCopy->Add(new TObjString(keyStr->GetName()), new TObjString(valStr->GetName()));
f747912b 2184 }
2185
2186 TList *cdbListCopy = new TList();
2187 cdbListCopy->SetOwner(1);
2188 cdbListCopy->SetName("cdbList");
2189
2190 TIter iter2(cdbList);
2191
b940cb9b 2192 AliCDBId* id=0;
e84c88f5 2193 while((id = dynamic_cast<AliCDBId*> (iter2.Next()))){
a4970db9 2194 cdbListCopy->Add(new TObjString(id->ToString().Data()));
f747912b 2195 }
2196
21a3aa09 2197 ftree->GetUserInfo()->Add(cdbMapCopy);
2198 ftree->GetUserInfo()->Add(cdbListCopy);
abe0c04e 2199
46698ae4 2200
21a3aa09 2201 ffile->cd();
aa3c69a9 2202
562dd0b4 2203 // we want to have only one tree version number
21a3aa09 2204 ftree->Write(ftree->GetName(),TObject::kOverwrite);
63314086 2205 fhlttree->Write(fhlttree->GetName(),TObject::kOverwrite);
f3a97c86 2206
ee7c441c 2207 if (fWriteESDfriend) {
2208 ffileF->cd();
2209 ftreeF->Write(ftreeF->GetName(),TObject::kOverwrite);
2210 }
2211
a7a1e1c7 2212// Finish with Plane Efficiency evaluation: before of CleanUp !!!
2213 if (fRunPlaneEff && !FinishPlaneEff()) {
2214 AliWarning("Finish PlaneEff evaluation failed");
2215 }
2216
930e6e3e 2217 // End of cycle for the in-loop
87da0921 2218
2219 if (fRunQA || fRunGlobalQA) {
5cbed243 2220 AliQAManager::QAManager()->EndOfCycle() ;
81d57268 2221 if (fInput &&
2222 !fProofOutputLocation.IsNull() &&
2223 fProofOutputArchive.IsNull() &&
2224 !fProofOutputDataset) {
2225 TString qaOutputFile(Form("%sMerged.%s.Data.root",
2226 fProofOutputLocation.Data(),
2227 AliQAv1::GetQADataFileName()));
2228 TProofOutputFile *qaProofFile = new TProofOutputFile(Form("Merged.%s.Data.root",
2229 AliQAv1::GetQADataFileName()));
2230 qaProofFile->SetOutputFileName(qaOutputFile.Data());
2231 if (AliDebugLevel() > 0) qaProofFile->Dump();
2232 fOutput->Add(qaProofFile);
2233 MergeQA(qaProofFile->GetFileName());
87da0921 2234 }
2235 else {
2236 MergeQA();
2237 }
2238 }
2239
4b71572b 2240 gROOT->cd();
2241 CleanUp();
81d57268 2242
2243 if (fInput) {
2244 if (!fProofOutputFileName.IsNull() &&
2245 !fProofOutputLocation.IsNull() &&
2246 fProofOutputDataset &&
2247 !fProofOutputArchive.IsNull()) {
2248 TProofOutputFile *zipProofFile = new TProofOutputFile(fProofOutputFileName.Data(),
2249 "DROV",
2250 fProofOutputLocation.Data());
2251 if (AliDebugLevel() > 0) zipProofFile->Dump();
2252 fOutput->Add(zipProofFile);
2253 TString fileList(fProofOutputArchive.Data());
2254 fileList.ReplaceAll(","," ");
38c18bf1 2255 TString command;
2256#if ROOT_SVN_REVISION >= 30174
2257 command.Form("zip -n root %s/%s %s",zipProofFile->GetDir(kTRUE),zipProofFile->GetFileName(),fileList.Data());
2258#else
2259 command.Form("zip -n root %s/%s %s",zipProofFile->GetDir(),zipProofFile->GetFileName(),fileList.Data());
2260#endif
2261 AliInfo(Form("Executing: %s",command.Data()));
2262 gSystem->Exec(command.Data());
81d57268 2263 }
2264 }
4b71572b 2265}
2266
2267//_____________________________________________________________________________
2268void AliReconstruction::Terminate()
2269{
f3a97c86 2270 // Create tags for the events in the ESD tree (the ESD tree is always present)
2271 // In case of empty events the tags will contain dummy values
52dd4a8c 2272 AliCodeTimerAuto("",0);
4b71572b 2273
e6d66370 2274 // Do not call the ESD tag creator in case of PROOF-based reconstruction
2275 if (!fInput) {
2276 AliESDTagCreator *esdtagCreator = new AliESDTagCreator();
2277 esdtagCreator->CreateESDTags(fFirstEvent,fLastEvent,fGRPData, AliQAv1::Instance()->GetQA(), AliQAv1::Instance()->GetEventSpecies(), AliQAv1::kNDET, AliRecoParam::kNSpecies);
9bcaa1d7 2278 delete esdtagCreator;
e6d66370 2279 }
e84c88f5 2280
795e4a22 2281 // Cleanup of CDB manager: cache and active storages!
2282 AliCDBManager::Instance()->ClearCache();
596a855f 2283}
2284
b26c3770 2285//_____________________________________________________________________________
2286Bool_t AliReconstruction::RunLocalEventReconstruction(const TString& detectors)
2287{
2288// run the local reconstruction
aa3c69a9 2289
0f88822a 2290 static Int_t eventNr=0;
52dd4a8c 2291 AliCodeTimerAuto("",0)
b26c3770 2292
2293 TString detStr = detectors;
ac4a7581 2294 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
b26c3770 2295 if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
2296 AliReconstructor* reconstructor = GetReconstructor(iDet);
2297 if (!reconstructor) continue;
2298 AliLoader* loader = fLoader[iDet];
f6806ad3 2299 // Matthias April 2008: temporary fix to run HLT reconstruction
2300 // although the HLT loader is missing
2301 if (strcmp(fgkDetectorName[iDet], "HLT")==0) {
2302 if (fRawReader) {
44ed7a66 2303 reconstructor->Reconstruct(fRawReader, NULL);
f6806ad3 2304 } else {
44ed7a66 2305 TTree* dummy=NULL;
2306 reconstructor->Reconstruct(dummy, NULL);
f6806ad3 2307 }
2308 continue;
2309 }
d76c31f4 2310 if (!loader) {
2311 AliWarning(Form("No loader is defined for %s!",fgkDetectorName[iDet]));
2312 continue;
2313 }
b26c3770 2314 // conversion of digits
2315 if (fRawReader && reconstructor->HasDigitConversion()) {
2316 AliInfo(Form("converting raw data digits into root objects for %s",
2317 fgkDetectorName[iDet]));
30bbd491 2318// AliCodeTimerAuto(Form("converting raw data digits into root objects for %s",
52dd4a8c 2319// fgkDetectorName[iDet]),0);
b26c3770 2320 loader->LoadDigits("update");
2321 loader->CleanDigits();
2322 loader->MakeDigitsContainer();
2323 TTree* digitsTree = loader->TreeD();
2324 reconstructor->ConvertDigits(fRawReader, digitsTree);
2325 loader->WriteDigits("OVERWRITE");
2326 loader->UnloadDigits();
b26c3770 2327 }
b26c3770 2328 // local reconstruction
b26c3770 2329 AliInfo(Form("running reconstruction for %s", fgkDetectorName[iDet]));
52dd4a8c 2330 //AliCodeTimerAuto(Form("running reconstruction for %s", fgkDetectorName[iDet]),0);
b26c3770 2331 loader->LoadRecPoints("update");
2332 loader->CleanRecPoints();
2333 loader->MakeRecPointsContainer();
2334 TTree* clustersTree = loader->TreeR();
2335 if (fRawReader && !reconstructor->HasDigitConversion()) {
2336 reconstructor->Reconstruct(fRawReader, clustersTree);
2337 } else {
2338 loader->LoadDigits("read");
2339 TTree* digitsTree = loader->TreeD();
2340 if (!digitsTree) {
44ed7a66 2341 AliError(Form("Can't get the %s digits tree", fgkDetectorName[iDet]));
13effe3f 2342 if (fStopOnError)
2343 return kFALSE;
b26c3770 2344 } else {
44ed7a66 2345 reconstructor->Reconstruct(digitsTree, clustersTree);
514cb8c7 2346 if (fRunQA && IsInTasks(AliQAv1::kDIGITSR)) {
eca4fa66 2347 AliQAManager::QAManager()->SetEventSpecie(fRecoParam.GetEventSpecie()) ;
2348 AliQAManager::QAManager()->RunOneEventInOneDetector(iDet, digitsTree) ;
44ed7a66 2349 }
b26c3770 2350 }
2351 loader->UnloadDigits();
2352 }
514cb8c7 2353 if (fRunQA && IsInTasks(AliQAv1::kRECPOINTS)) {
eca4fa66 2354 AliQAManager::QAManager()->SetEventSpecie(fRecoParam.GetEventSpecie()) ;
2355 AliQAManager::QAManager()->RunOneEventInOneDetector(iDet, clustersTree) ;
57acd2d2 2356 }
eca4fa66 2357 loader->WriteRecPoints("OVERWRITE");
2358 loader->UnloadRecPoints();
2359 AliSysInfo::AddStamp(Form("LRec%s_%d",fgkDetectorName[iDet],eventNr), iDet,1,eventNr);
a00021a7 2360 }
c7a22819 2361 if (!IsSelected("CTP", detStr)) AliDebug(10,"No CTP");
a00021a7 2362 if ((detStr.CompareTo("ALL") != 0) && !detStr.IsNull()) {
b26c3770 2363 AliError(Form("the following detectors were not found: %s",
2364 detStr.Data()));
13effe3f 2365 if (fStopOnError)
2366 return kFALSE;
b26c3770 2367 }
0f88822a 2368 eventNr++;
b26c3770 2369 return kTRUE;
2370}
58e8dc31 2371//_____________________________________________________________________________
2372Bool_t AliReconstruction::RunSPDTrackleting(AliESDEvent*& esd)
2373{
2374// run the SPD trackleting (for SPD efficiency purpouses)
2375
52dd4a8c 2376 AliCodeTimerAuto("",0)
58e8dc31 2377
2378 Double_t vtxPos[3] = {0, 0, 0};
2379 Double_t vtxErr[3] = {0.0, 0.0, 0.0};
2380/*
2381 TArrayF mcVertex(3);
2382 // if(MC)
2383 if (fRunLoader->GetHeader() && fRunLoader->GetHeader()->GenEventHeader()) {
2384 fRunLoader->GetHeader()->GenEventHeader()->PrimaryVertex(mcVertex);
2385 for (Int_t i = 0; i < 3; i++) vtxPos[i] = mcVertex[i];
2386 }
2387*/
2388 const AliESDVertex *vertex = esd->GetVertex();
2389 if(!vertex){
2390 AliWarning("Vertex not found");
2391 return kFALSE;
2392 }
2393 vertex->GetXYZ(vtxPos);
2394 vertex->GetSigmaXYZ(vtxErr);
2395 if (fSPDTrackleter) {
2396 AliInfo("running the SPD Trackleter for Plane Efficiency Evaluation");
2397
2398 // load clusters
2399 fLoader[0]->LoadRecPoints("read");
2400 TTree* tree = fLoader[0]->TreeR();
2401 if (!tree) {
2402 AliError("Can't get the ITS cluster tree");
2403 return kFALSE;
2404 }
2405 fSPDTrackleter->LoadClusters(tree);
2406 fSPDTrackleter->SetVertex(vtxPos, vtxErr);
2407 // run trackleting
2408 if (fSPDTrackleter->Clusters2Tracks(esd) != 0) {
84290fcc 2409 AliWarning("AliITSTrackleterSPDEff Clusters2Tracks failed");
58e8dc31 2410 // fLoader[0]->UnloadRecPoints();
2411 return kFALSE;
2412 }
2413//fSPDTrackleter->UnloadRecPoints();
2414 } else {
2415 AliWarning("SPDTrackleter not available");
2416 return kFALSE;
2417 }
2418 return kTRUE;
2419}
b26c3770 2420
596a855f 2421//_____________________________________________________________________________
af885e0f 2422Bool_t AliReconstruction::RunVertexFinder(AliESDEvent*& esd)
596a855f 2423{
2424// run the barrel tracking
2425
52dd4a8c 2426 AliCodeTimerAuto("",0)
030b532d 2427
92bffc4d 2428 AliVertexer *vertexer = CreateVertexer();
2429 if (!vertexer) return kFALSE;
2430
3c99b88f 2431 AliInfo(Form("running the ITS vertex finder: %s",vertexer->ClassName()));
2257f27e 2432 AliESDVertex* vertex = NULL;
92bffc4d 2433 if (fLoader[0]) {
2434 fLoader[0]->LoadRecPoints();
2435 TTree* cltree = fLoader[0]->TreeR();
2436 if (cltree) {
2437 if(fDiamondProfileSPD) vertexer->SetVtxStart(fDiamondProfileSPD);
2438 vertex = vertexer->FindVertexForCurrentEvent(cltree);
308c2f7c 2439 }
2440 else {
92bffc4d 2441 AliError("Can't get the ITS cluster tree");
308c2f7c 2442 }
92bffc4d 2443 fLoader[0]->UnloadRecPoints();
2257f27e 2444 }
92bffc4d 2445 else {
2446 AliError("Can't get the ITS loader");
2447 }
2448 if(!vertex){
2449 AliWarning("Vertex not found");
2450 vertex = new AliESDVertex();
2451 vertex->SetName("default");
2452 }
2453 else {
2454 vertex->SetName("reconstructed");
2257f27e 2455 }
92bffc4d 2456
2457 Double_t vtxPos[3];
2458 Double_t vtxErr[3];
2459 vertex->GetXYZ(vtxPos);
2460 vertex->GetSigmaXYZ(vtxErr);
2461
06cc9d95 2462 esd->SetPrimaryVertexSPD(vertex);
73c51de2 2463 AliESDVertex *vpileup = NULL;
2464 Int_t novertices = 0;
2465 vpileup = vertexer->GetAllVertices(novertices);
2466 if(novertices>1){
2467 for (Int_t kk=1; kk<novertices; kk++)esd->AddPileupVertexSPD(&vpileup[kk]);
2468 }
1f9831ab 2469 /*
32e449be 2470 // if SPD multiplicity has been determined, it is stored in the ESD
92bffc4d 2471 AliMultiplicity *mult = vertexer->GetMultiplicity();
32e449be 2472 if(mult)esd->SetMultiplicity(mult);
1f9831ab 2473 */
ac4a7581 2474 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
b8cd5251 2475 if (fTracker[iDet]) fTracker[iDet]->SetVertex(vtxPos, vtxErr);
2476 }
2257f27e 2477 delete vertex;
2478
92bffc4d 2479 delete vertexer;
2480
2257f27e 2481 return kTRUE;
2482}
2483
1f9831ab 2484//_____________________________________________________________________________
2485Bool_t AliReconstruction::RunMultFinder(AliESDEvent*& esd)
2486{
2487 // run the trackleter for multiplicity study
2488
2489 AliCodeTimerAuto("",0)
2490
2491 AliTrackleter *trackleter = CreateMultFinder();
2492 if (!trackleter) return kFALSE;
2493
2494 AliInfo(Form("running the ITS multiplicity finder: %s",trackleter->ClassName()));
2495
2496 if (fLoader[0]) {
2497 fLoader[0]->LoadRecPoints();
2498 TTree* cltree = fLoader[0]->TreeR();
2499 if (cltree) {
2500 trackleter->Reconstruct(esd,cltree);
2501 AliMultiplicity *mult = trackleter->GetMultiplicity();
2502 if(mult) esd->SetMultiplicity(mult);
2503 }
2504 else {
2505 AliError("Can't get the ITS cluster tree");
2506 }
2507 fLoader[0]->UnloadRecPoints();
2508 }
2509 else {
2510 AliError("Can't get the ITS loader");
2511 }
2512
2513 delete trackleter;
2514
2515 return kTRUE;
2516}
2517
1f46a9ae 2518//_____________________________________________________________________________
af885e0f 2519Bool_t AliReconstruction::RunHLTTracking(AliESDEvent*& esd)
1f46a9ae 2520{
2521// run the HLT barrel tracking
2522
52dd4a8c 2523 AliCodeTimerAuto("",0)
1f46a9ae 2524
2525 if (!fRunLoader) {
2526 AliError("Missing runLoader!");
2527 return kFALSE;
2528 }
2529
2530 AliInfo("running HLT tracking");
2531
2532 // Get a pointer to the HLT reconstructor
ac4a7581 2533 AliReconstructor *reconstructor = GetReconstructor(kNDetectors-1);
1f46a9ae 2534 if (!reconstructor) return kFALSE;
2535
2536 // TPC + ITS
2537 for (Int_t iDet = 1; iDet >= 0; iDet--) {
2538 TString detName = fgkDetectorName[iDet];
2539 AliDebug(1, Form("%s HLT tracking", detName.Data()));
2540 reconstructor->SetOption(detName.Data());
d76c31f4 2541 AliTracker *tracker = reconstructor->CreateTracker();
1f46a9ae 2542 if (!tracker) {
2543 AliWarning(Form("couldn't create a HLT tracker for %s", detName.Data()));
2544 if (fStopOnError) return kFALSE;
9dcc06e1 2545 continue;
1f46a9ae 2546 }
2547 Double_t vtxPos[3];
2548 Double_t vtxErr[3]={0.005,0.005,0.010};
2549 const AliESDVertex *vertex = esd->GetVertex();
2550 vertex->GetXYZ(vtxPos);
2551 tracker->SetVertex(vtxPos,vtxErr);
2552 if(iDet != 1) {
2553 fLoader[iDet]->LoadRecPoints("read");
2554 TTree* tree = fLoader[iDet]->TreeR();
2555 if (!tree) {
2556 AliError(Form("Can't get the %s cluster tree", detName.Data()));
2557 return kFALSE;
2558 }
2559 tracker->LoadClusters(tree);
2560 }
2561 if (tracker->Clusters2Tracks(esd) != 0) {
2562 AliError(Form("HLT %s Clusters2Tracks failed", fgkDetectorName[iDet]));
2563 return kFALSE;
2564 }
2565 if(iDet != 1) {
2566 tracker->UnloadClusters();
2567 }
2568 delete tracker;
2569 }
2570
1f46a9ae 2571 return kTRUE;
2572}
2573
e66fbafb 2574//_____________________________________________________________________________
af885e0f 2575Bool_t AliReconstruction::RunMuonTracking(AliESDEvent*& esd)
e66fbafb 2576{
2577// run the muon spectrometer tracking
2578
52dd4a8c 2579 AliCodeTimerAuto("",0)
e66fbafb 2580
2581 if (!fRunLoader) {
2582 AliError("Missing runLoader!");
2583 return kFALSE;
2584 }
2585 Int_t iDet = 7; // for MUON
2586
2587 AliInfo("is running...");
2588
2589 // Get a pointer to the MUON reconstructor
2590 AliReconstructor *reconstructor = GetReconstructor(iDet);
2591 if (!reconstructor) return kFALSE;
2592
2593
2594 TString detName = fgkDetectorName[iDet];
2595 AliDebug(1, Form("%s tracking", detName.Data()));
d76c31f4 2596 AliTracker *tracker = reconstructor->CreateTracker();
e66fbafb 2597 if (!tracker) {
2598 AliWarning(Form("couldn't create a tracker for %s", detName.Data()));
2599 return kFALSE;
2600 }
2601
e66fbafb 2602 // read RecPoints
761350a6 2603 fLoader[iDet]->LoadRecPoints("read");
c1954ee5 2604
761350a6 2605 tracker->LoadClusters(fLoader[iDet]->TreeR());
2606
2607 Int_t rv = tracker->Clusters2Tracks(esd);
2608
e66fbafb 2609 fLoader[iDet]->UnloadRecPoints();
2610
c1954ee5 2611 tracker->UnloadClusters();
2612
e66fbafb 2613 delete tracker;
2614
cb23c6ca 2615 if ( rv )
2616 {
2617 AliError(Form("%s Clusters2Tracks failed", fgkDetectorName[iDet]));
2618 return kFALSE;
2619 }
2620
e66fbafb 2621 return kTRUE;
2622}
2623
2624
2257f27e 2625//_____________________________________________________________________________
10d100d4 2626Bool_t AliReconstruction::RunTracking(AliESDEvent*& esd,AliESDpid &PID)
2257f27e 2627{
2628// run the barrel tracking
0f88822a 2629 static Int_t eventNr=0;
52dd4a8c 2630 AliCodeTimerAuto("",0)
24f7a148 2631
815c2b38 2632 AliInfo("running tracking");
596a855f 2633
1f26f3e7 2634 // Set the event info which is used
2635 // by the trackers in order to obtain
2636 // information about read-out detectors,
2637 // trigger etc.
2638 AliDebug(1, "Setting event info");
2639 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
2640 if (!fTracker[iDet]) continue;
2641 fTracker[iDet]->SetEventInfo(&fEventInfo);
2642 }
2643
91b876d1 2644 //Fill the ESD with the T0 info (will be used by the TOF)
d76c31f4 2645 if (fReconstructor[11] && fLoader[11]) {
2646 fLoader[11]->LoadRecPoints("READ");
2647 TTree *treeR = fLoader[11]->TreeR();
89916438 2648 if (treeR) {
2649 GetReconstructor(11)->FillESD((TTree *)NULL,treeR,esd);
2650 }
d76c31f4 2651 }
91b876d1 2652
b8cd5251 2653 // pass 1: TPC + ITS inwards
2654 for (Int_t iDet = 1; iDet >= 0; iDet--) {
2655 if (!fTracker[iDet]) continue;
2656 AliDebug(1, Form("%s tracking", fgkDetectorName[iDet]));
24f7a148 2657
b8cd5251 2658 // load clusters
2659 fLoader[iDet]->LoadRecPoints("read");
6efecea1 2660 AliSysInfo::AddStamp(Form("RLoadCluster%s_%d",fgkDetectorName[iDet],eventNr),iDet,1, eventNr);
b8cd5251 2661 TTree* tree = fLoader[iDet]->TreeR();
2662 if (!tree) {
2663 AliError(Form("Can't get the %s cluster tree", fgkDetectorName[iDet]));
24f7a148 2664 return kFALSE;
2665 }
b8cd5251 2666 fTracker[iDet]->LoadClusters(tree);
6efecea1 2667 AliSysInfo::AddStamp(Form("TLoadCluster%s_%d",fgkDetectorName[iDet],eventNr), iDet,2, eventNr);
b8cd5251 2668 // run tracking
2669 if (fTracker[iDet]->Clusters2Tracks(esd) != 0) {
2670 AliError(Form("%s Clusters2Tracks failed", fgkDetectorName[iDet]));
24f7a148 2671 return kFALSE;
2672 }
878e1fe1 2673 // preliminary PID in TPC needed by the ITS tracker
2674 if (iDet == 1) {
b26c3770 2675 GetReconstructor(1)->FillESD((TTree*)NULL, (TTree*)NULL, esd);
10d100d4 2676 PID.MakePID(esd,kTRUE);
0f88822a 2677 }
6efecea1 2678 AliSysInfo::AddStamp(Form("Tracking0%s_%d",fgkDetectorName[iDet],eventNr), iDet,3,eventNr);
b8cd5251 2679 }
596a855f 2680
b8cd5251 2681 // pass 2: ALL backwards
aa3c69a9 2682
ac4a7581 2683 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
b8cd5251 2684 if (!fTracker[iDet]) continue;
2685 AliDebug(1, Form("%s back propagation", fgkDetectorName[iDet]));
2686
2687 // load clusters
2688 if (iDet > 1) { // all except ITS, TPC
2689 TTree* tree = NULL;
7b61cd9c 2690 fLoader[iDet]->LoadRecPoints("read");
6efecea1 2691 AliSysInfo::AddStamp(Form("RLoadCluster0%s_%d",fgkDetectorName[iDet],eventNr), iDet,1, eventNr);
7b61cd9c 2692 tree = fLoader[iDet]->TreeR();
b8cd5251 2693 if (!tree) {
eca4fa66 2694 AliError(Form("Can't get the %s cluster tree", fgkDetectorName[iDet]));
2695 return kFALSE;
24f7a148 2696 }
0f88822a 2697 fTracker[iDet]->LoadClusters(tree);
6efecea1 2698 AliSysInfo::AddStamp(Form("TLoadCluster0%s_%d",fgkDetectorName[iDet],eventNr), iDet,2, eventNr);
b8cd5251 2699 }
24f7a148 2700
b8cd5251 2701 // run tracking
283f39c6 2702 if (iDet>1) // start filling residuals for the "outer" detectors
eca4fa66 2703 if (fRunGlobalQA) {
2704 AliTracker::SetFillResiduals(fRecoParam.GetEventSpecie(), kTRUE);
2705 TObjArray ** arr = AliTracker::GetResidualsArray() ;
c9526f68 2706 if (arr) {
0a349581 2707 AliRecoParam::EventSpecie_t es=fRecoParam.GetEventSpecie();
2708 TObjArray * elem = arr[AliRecoParam::AConvert(es)];
c9526f68 2709 if ( elem && (! elem->At(0)) ) {
2710 AliQADataMaker *qadm = AliQAManager::QAManager()->GetQADataMaker(AliQAv1::kGLOBAL);
2711 if (qadm) qadm->InitRecPointsForTracker() ;
2712 }
2713 }
eca4fa66 2714 }
b8cd5251 2715 if (fTracker[iDet]->PropagateBack(esd) != 0) {
2716 AliError(Form("%s backward propagation failed", fgkDetectorName[iDet]));
49dfd67a 2717 // return kFALSE;
b8cd5251 2718 }
24f7a148 2719
b8cd5251 2720 // unload clusters
6e65648b 2721 if (iDet > 3) { // all except ITS, TPC, TRD and TOF
b8cd5251 2722 fTracker[iDet]->UnloadClusters();
7b61cd9c 2723 fLoader[iDet]->UnloadRecPoints();
b8cd5251 2724 }
8f37df88 2725 // updated PID in TPC needed by the ITS tracker -MI
2726 if (iDet == 1) {
10d100d4 2727 //GetReconstructor(1)->FillESD((TTree*)NULL, (TTree*)NULL, esd);
2728 //AliESDpid::MakePID(esd);
2729 PID.MakePID(esd,kTRUE);
8f37df88 2730 }
6efecea1 2731 AliSysInfo::AddStamp(Form("Tracking1%s_%d",fgkDetectorName[iDet],eventNr), iDet,3, eventNr);
b8cd5251 2732 }
283f39c6 2733 //stop filling residuals for the "outer" detectors
57acd2d2 2734 if (fRunGlobalQA) AliTracker::SetFillResiduals(fRecoParam.GetEventSpecie(), kFALSE);
596a855f 2735
b8cd5251 2736 // pass 3: TRD + TPC + ITS refit inwards
aa3c69a9 2737
b8cd5251 2738 for (Int_t iDet = 2; iDet >= 0; iDet--) {
2739 if (!fTracker[iDet]) continue;
2740 AliDebug(1, Form("%s inward refit", fgkDetectorName[iDet]));
596a855f 2741
b8cd5251 2742 // run tracking
283f39c6 2743 if (iDet<2) // start filling residuals for TPC and ITS
eca4fa66 2744 if (fRunGlobalQA) {
2745 AliTracker::SetFillResiduals(fRecoParam.GetEventSpecie(), kTRUE);
2746 TObjArray ** arr = AliTracker::GetResidualsArray() ;
c9526f68 2747 if (arr) {
0a349581 2748 AliRecoParam::EventSpecie_t es=fRecoParam.GetEventSpecie();
2749 TObjArray * elem = arr[AliRecoParam::AConvert(es)];
c9526f68 2750 if ( elem && (! elem->At(0)) ) {
2751 AliQADataMaker *qadm = AliQAManager::QAManager()->GetQADataMaker(AliQAv1::kGLOBAL);
2752 if (qadm) qadm->InitRecPointsForTracker() ;
2753 }
2754 }
eca4fa66 2755 }
2756
b8cd5251 2757 if (fTracker[iDet]->RefitInward(esd) != 0) {
2758 AliError(Form("%s inward refit failed", fgkDetectorName[iDet]));
49dfd67a 2759 // return kFALSE;
b8cd5251 2760 }
db2368d0 2761 // run postprocessing
2762 if (fTracker[iDet]->PostProcess(esd) != 0) {
2763 AliError(Form("%s postprocessing failed", fgkDetectorName[iDet]));
2764 // return kFALSE;
2765 }
6efecea1 2766 AliSysInfo::AddStamp(Form("Tracking2%s_%d",fgkDetectorName[iDet],eventNr), iDet,3, eventNr);
6e65648b 2767 }
2768
2769 // write space-points to the ESD in case alignment data output
2770 // is switched on
2771 if (fWriteAlignmentData)
2772 WriteAlignmentData(esd);
2773
2774 for (Int_t iDet = 3; iDet >= 0; iDet--) {
2775 if (!fTracker[iDet]) continue;
b8cd5251 2776 // unload clusters
2777 fTracker[iDet]->UnloadClusters();
6efecea1 2778 AliSysInfo::AddStamp(Form("TUnloadCluster%s_%d",fgkDetectorName[iDet],eventNr), iDet,4, eventNr);
b8cd5251 2779 fLoader[iDet]->UnloadRecPoints();
6efecea1 2780 AliSysInfo::AddStamp(Form("RUnloadCluster%s_%d",fgkDetectorName[iDet],eventNr), iDet,5, eventNr);
b8cd5251 2781 }
283f39c6 2782 // stop filling residuals for TPC and ITS
57acd2d2 2783 if (fRunGlobalQA) AliTracker::SetFillResiduals(fRecoParam.GetEventSpecie(), kFALSE);
854c6476 2784
0f88822a 2785 eventNr++;
596a855f 2786 return kTRUE;
2787}
2788
d64bd07d 2789//_____________________________________________________________________________
2790Bool_t AliReconstruction::CleanESD(AliESDEvent *esd){
2791 //
2792 // Remove the data which are not needed for the physics analysis.
2793 //
2794
d64bd07d 2795 Int_t nTracks=esd->GetNumberOfTracks();
18571674 2796 Int_t nV0s=esd->GetNumberOfV0s();
cf37fd88 2797 AliInfo
2798 (Form("Number of ESD tracks and V0s before cleaning: %d %d",nTracks,nV0s));
d64bd07d 2799
18571674 2800 Float_t cleanPars[]={fV0DCAmax,fV0CsPmin,fDmax,fZmax};
7f68891d 2801 Bool_t rc=esd->Clean(cleanPars);
d64bd07d 2802
7f68891d 2803 nTracks=esd->GetNumberOfTracks();
18571674 2804 nV0s=esd->GetNumberOfV0s();
cf37fd88 2805 AliInfo
ae5d5566 2806 (Form("Number of ESD tracks and V0s after cleaning %d %d",nTracks,nV0s));
d64bd07d 2807
7f68891d 2808 return rc;
d64bd07d 2809}
2810
596a855f 2811//_____________________________________________________________________________
af885e0f 2812Bool_t AliReconstruction::FillESD(AliESDEvent*& esd, const TString& detectors)
596a855f 2813{
2814// fill the event summary data
2815
52dd4a8c 2816 AliCodeTimerAuto("",0)
0f88822a 2817 static Int_t eventNr=0;
596a855f 2818 TString detStr = detectors;
abe0c04e 2819
f1640d23 2820 AliSysInfo::AddStamp(Form("FillESDb%d",eventNr), -19,-19, eventNr);
ac4a7581 2821 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
abe0c04e 2822 if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
b8cd5251 2823 AliReconstructor* reconstructor = GetReconstructor(iDet);
2824 if (!reconstructor) continue;
4b71572b 2825 AliDebug(1, Form("filling ESD for %s", fgkDetectorName[iDet]));
2826 TTree* clustersTree = NULL;
2827 if (fLoader[iDet]) {
2828 fLoader[iDet]->LoadRecPoints("read");
2829 clustersTree = fLoader[iDet]->TreeR();
2830 if (!clustersTree) {
2831 AliError(Form("Can't get the %s clusters tree",
2832 fgkDetectorName[iDet]));
2833 if (fStopOnError) return kFALSE;
2834 }
2835 }
2836 if (fRawReader && !reconstructor->HasDigitConversion()) {
2837 reconstructor->FillESD(fRawReader, clustersTree, esd);
2838 } else {
2839 TTree* digitsTree = NULL;
d76c31f4 2840 if (fLoader[iDet]) {
4b71572b 2841 fLoader[iDet]->LoadDigits("read");
2842 digitsTree = fLoader[iDet]->TreeD();
2843 if (!digitsTree) {
2844 AliError(Form("Can't get the %s digits tree",
b26c3770 2845 fgkDetectorName[iDet]));
2846 if (fStopOnError) return kFALSE;
2847 }
2848 }
4b71572b 2849 reconstructor->FillESD(digitsTree, clustersTree, esd);
2850 if (fLoader[iDet]) fLoader[iDet]->UnloadDigits();
2851 }
2852 if (fLoader[iDet]) {
2853 fLoader[iDet]->UnloadRecPoints();
596a855f 2854 }
2855 }
13effe3f 2856
c7a22819 2857 if (!IsSelected("CTP", detStr)) AliDebug(10,"No CTP");
596a855f 2858 if ((detStr.CompareTo("ALL") != 0) && !detStr.IsNull()) {
815c2b38 2859 AliError(Form("the following detectors were not found: %s",
2860 detStr.Data()));
596a855f 2861 if (fStopOnError) return kFALSE;
2862 }
f1640d23 2863 AliSysInfo::AddStamp(Form("FillESDe%d",eventNr), -20,-20, eventNr);
0f88822a 2864 eventNr++;
596a855f 2865 return kTRUE;
2866}
2867
b647652d 2868//_____________________________________________________________________________
af885e0f 2869Bool_t AliReconstruction::FillTriggerESD(AliESDEvent*& esd)
b647652d 2870{
2871 // Reads the trigger decision which is
2872 // stored in Trigger.root file and fills
2873 // the corresponding esd entries
2874
52dd4a8c 2875 AliCodeTimerAuto("",0)
87932dab 2876
b647652d 2877 AliInfo("Filling trigger information into the ESD");
2878
2879 if (fRawReader) {
2880 AliCTPRawStream input(fRawReader);
2881 if (!input.Next()) {
7e88424f 2882 AliWarning("No valid CTP (trigger) DDL raw data is found ! The trigger info is taken from the event header!");
b647652d 2883 }
2884 else {
7e88424f 2885 if (esd->GetTriggerMask() != input.GetClassMask())
2886 AliError(Form("Invalid trigger pattern found in CTP raw-data: %llx %llx",
2887 input.GetClassMask(),esd->GetTriggerMask()));
2888 if (esd->GetOrbitNumber() != input.GetOrbitID())
2889 AliError(Form("Invalid orbit id found in CTP raw-data: %x %x",
2890 input.GetOrbitID(),esd->GetOrbitNumber()));
2891 if (esd->GetBunchCrossNumber() != input.GetBCID())
2892 AliError(Form("Invalid bunch-crossing id found in CTP raw-data: %x %x",
2893 input.GetBCID(),esd->GetBunchCrossNumber()));
e61ed4b1 2894 AliESDHeader* esdheader = esd->GetHeader();
2895 esdheader->SetL0TriggerInputs(input.GetL0Inputs());
2896 esdheader->SetL1TriggerInputs(input.GetL1Inputs());
2897 esdheader->SetL2TriggerInputs(input.GetL2Inputs());
a6dd87ad 2898 // IR
2899 UInt_t orbit=input.GetOrbitID();
2900 for(Int_t i=0 ; i<input.GetNIRs() ; i++ )
2901 if(TMath::Abs(Int_t(orbit-(input.GetIR(i))->GetOrbit()))<=1){
2902 esdheader->AddTriggerIR(input.GetIR(i));
2903 }
b647652d 2904 }
b024fd7f 2905 }
f7812afc 2906 return kTRUE;
2907}
2908//_____________________________________________________________________________
2909Bool_t AliReconstruction::FillTriggerScalers(AliESDEvent*& esd)
2910{
522fdd91 2911 //Scalers
82ebedd6 2912 //fRunScalers->Print();
2913 if(fRunScalers && fRunScalers->CheckRunScalers()){
a6dd87ad 2914 AliTimeStamp* timestamp = new AliTimeStamp(esd->GetOrbitNumber(), esd->GetPeriodNumber(), esd->GetBunchCrossNumber());
82ebedd6 2915 //AliTimeStamp* timestamp = new AliTimeStamp(10308000, 0, (ULong64_t)486238);
522fdd91 2916 AliESDHeader* esdheader = fesd->GetHeader();
2917 for(Int_t i=0;i<50;i++){
1e78ae8c 2918 if((1ull<<i) & esd->GetTriggerMask()){
6863d231 2919 AliTriggerScalersESD* scalesd = fRunScalers->GetScalersForEventClass( timestamp, i+1);
82ebedd6 2920 if(scalesd)esdheader->SetTriggerScalersRecord(scalesd);
522fdd91 2921 }
2922 }
2923 }
b647652d 2924 return kTRUE;
2925}
001397cd 2926//_____________________________________________________________________________
af885e0f 2927Bool_t AliReconstruction::FillRawEventHeaderESD(AliESDEvent*& esd)
001397cd 2928{
2929 //
2930 // Filling information from RawReader Header
2931 //
2932
151bea4e 2933 if (!fRawReader) return kFALSE;
2934
001397cd 2935 AliInfo("Filling information from RawReader Header");
151bea4e 2936
2937 esd->SetBunchCrossNumber(fRawReader->GetBCID());
2938 esd->SetOrbitNumber(fRawReader->GetOrbitID());
2939 esd->SetPeriodNumber(fRawReader->GetPeriod());
2940
2941 esd->SetTimeStamp(fRawReader->GetTimestamp());
2942 esd->SetEventType(fRawReader->GetType());
001397cd 2943
2944 return kTRUE;
2945}
2946
2947
596a855f 2948//_____________________________________________________________________________
2949Bool_t AliReconstruction::IsSelected(TString detName, TString& detectors) const
2950{
2951// check whether detName is contained in detectors
2952// if yes, it is removed from detectors
2953
2954 // check if all detectors are selected
2955 if ((detectors.CompareTo("ALL") == 0) ||
2956 detectors.BeginsWith("ALL ") ||
2957 detectors.EndsWith(" ALL") ||
2958 detectors.Contains(" ALL ")) {
2959 detectors = "ALL";
2960 return kTRUE;
2961 }
2962
2963 // search for the given detector
2964 Bool_t result = kFALSE;
2965 if ((detectors.CompareTo(detName) == 0) ||
2966 detectors.BeginsWith(detName+" ") ||
2967 detectors.EndsWith(" "+detName) ||
2968 detectors.Contains(" "+detName+" ")) {
2969 detectors.ReplaceAll(detName, "");
2970 result = kTRUE;
2971 }
2972
2973 // clean up the detectors string
2974 while (detectors.Contains(" ")) detectors.ReplaceAll(" ", " ");
2975 while (detectors.BeginsWith(" ")) detectors.Remove(0, 1);
2976 while (detectors.EndsWith(" ")) detectors.Remove(detectors.Length()-1, 1);
2977
2978 return result;
2979}
e583c30d 2980
f08fc9f5 2981//_____________________________________________________________________________
2982Bool_t AliReconstruction::InitRunLoader()
2983{
2984// get or create the run loader
2985
2986 if (gAlice) delete gAlice;
2987 gAlice = NULL;
2988
52dd4a8c 2989 TFile *gafile = TFile::Open(fGAliceFileName.Data());
2990 // if (!gSystem->AccessPathName(fGAliceFileName.Data())) { // galice.root exists
2991 if (gafile) { // galice.root exists
2992 gafile->Close();
2993 delete gafile;
2994
b26c3770 2995 // load all base libraries to get the loader classes
2996 TString libs = gSystem->GetLibraries();
ac4a7581 2997 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
b26c3770 2998 TString detName = fgkDetectorName[iDet];
2999 if (detName == "HLT") continue;
3000 if (libs.Contains("lib" + detName + "base.so")) continue;
3001 gSystem->Load("lib" + detName + "base.so");
3002 }
f08fc9f5 3003 fRunLoader = AliRunLoader::Open(fGAliceFileName.Data());
3004 if (!fRunLoader) {
3005 AliError(Form("no run loader found in file %s", fGAliceFileName.Data()));
3006 CleanUp();
3007 return kFALSE;
3008 }
325aa76f 3009
b26c3770 3010 fRunLoader->CdGAFile();
325aa76f 3011 fRunLoader->LoadgAlice();
f08fc9f5 3012
6cae184e 3013 //PH This is a temporary fix to give access to the kinematics
3014 //PH that is needed for the labels of ITS clusters
f2ee4290 3015 fRunLoader->LoadHeader();
6cae184e 3016 fRunLoader->LoadKinematics();
3017
f08fc9f5 3018 } else { // galice.root does not exist
3019 if (!fRawReader) {
3020 AliError(Form("the file %s does not exist", fGAliceFileName.Data()));
f08fc9f5 3021 }
3022 fRunLoader = AliRunLoader::Open(fGAliceFileName.Data(),
3023 AliConfig::GetDefaultEventFolderName(),
3024 "recreate");
3025 if (!fRunLoader) {
3026 AliError(Form("could not create run loader in file %s",
3027 fGAliceFileName.Data()));
3028 CleanUp();
3029 return kFALSE;
3030 }
21a3aa09 3031 fIsNewRunLoader = kTRUE;
f08fc9f5 3032 fRunLoader->MakeTree("E");
21a3aa09 3033
973388c2 3034 if (fNumberOfEventsPerFile > 0)
3035 fRunLoader->SetNumberOfEventsPerFile(fNumberOfEventsPerFile);
3036 else
21a3aa09 3037 fRunLoader->SetNumberOfEventsPerFile((UInt_t)-1);
f08fc9f5 3038 }
3039
3040 return kTRUE;
3041}
3042
c757bafd 3043//_____________________________________________________________________________
b8cd5251 3044AliReconstructor* AliReconstruction::GetReconstructor(Int_t iDet)
c757bafd 3045{
f08fc9f5 3046// get the reconstructor object and the loader for a detector
c757bafd 3047
7e88424f 3048 if (fReconstructor[iDet]) {
3049 if (fRecoParam.GetDetRecoParamArray(iDet) && !AliReconstructor::GetRecoParam(iDet)) {
3050 const AliDetectorRecoParam *par = fRecoParam.GetDetRecoParam(iDet);
3051 fReconstructor[iDet]->SetRecoParam(par);
42ec5d3d 3052 fReconstructor[iDet]->SetRunInfo(fRunInfo);
7e88424f 3053 }
3054 return fReconstructor[iDet];
3055 }
b8cd5251 3056
3057 // load the reconstructor object
3058 TPluginManager* pluginManager = gROOT->GetPluginManager();
3059 TString detName = fgkDetectorName[iDet];
3060 TString recName = "Ali" + detName + "Reconstructor";
f0999a9a 3061
3062 if (!fIsNewRunLoader && !fRunLoader->GetLoader(detName+"Loader") && (detName != "HLT")) return NULL;
b8cd5251 3063
b8cd5251 3064 AliReconstructor* reconstructor = NULL;
3065 // first check if a plugin is defined for the reconstructor
3066 TPluginHandler* pluginHandler =
3067 pluginManager->FindHandler("AliReconstructor", detName);
f08fc9f5 3068 // if not, add a plugin for it
3069 if (!pluginHandler) {
b8cd5251 3070 AliDebug(1, Form("defining plugin for %s", recName.Data()));
b26c3770 3071 TString libs = gSystem->GetLibraries();
3072 if (libs.Contains("lib" + detName + "base.so") ||
3073 (gSystem->Load("lib" + detName + "base.so") >= 0)) {
b8cd5251 3074 pluginManager->AddHandler("AliReconstructor", detName,
3075 recName, detName + "rec", recName + "()");
3076 } else {
3077 pluginManager->AddHandler("AliReconstructor", detName,
3078 recName, detName, recName + "()");
c757bafd 3079 }
b8cd5251 3080 pluginHandler = pluginManager->FindHandler("AliReconstructor", detName);
3081 }
3082 if (pluginHandler && (pluginHandler->LoadPlugin() == 0)) {
3083 reconstructor = (AliReconstructor*) pluginHandler->ExecPlugin(0);
c757bafd 3084 }
b8cd5251 3085 if (reconstructor) {
3086 TObject* obj = fOptions.FindObject(detName.Data());
3087 if (obj) reconstructor->SetOption(obj->GetTitle());
1e500f25 3088 reconstructor->SetRunInfo(fRunInfo);
d76c31f4 3089 reconstructor->Init();
b8cd5251 3090 fReconstructor[iDet] = reconstructor;
3091 }
3092
f08fc9f5 3093 // get or create the loader
3094 if (detName != "HLT") {
3095 fLoader[iDet] = fRunLoader->GetLoader(detName + "Loader");
3096 if (!fLoader[iDet]) {
3097 AliConfig::Instance()
3098 ->CreateDetectorFolders(fRunLoader->GetEventFolder(),
3099 detName, detName);
3100 // first check if a plugin is defined for the loader
bb0901a4 3101 pluginHandler =
f08fc9f5 3102 pluginManager->FindHandler("AliLoader", detName);
3103 // if not, add a plugin for it
3104 if (!pluginHandler) {
3105 TString loaderName = "Ali" + detName + "Loader";
3106 AliDebug(1, Form("defining plugin for %s", loaderName.Data()));
3107 pluginManager->AddHandler("AliLoader", detName,
3108 loaderName, detName + "base",
3109 loaderName + "(const char*, TFolder*)");
3110 pluginHandler = pluginManager->FindHandler("AliLoader", detName);
3111 }
3112 if (pluginHandler && (pluginHandler->LoadPlugin() == 0)) {
3113 fLoader[iDet] =
3114 (AliLoader*) pluginHandler->ExecPlugin(2, detName.Data(),
3115 fRunLoader->GetEventFolder());
3116 }
3117 if (!fLoader[iDet]) { // use default loader
3118 fLoader[iDet] = new AliLoader(detName, fRunLoader->GetEventFolder());
3119 }
3120 if (!fLoader[iDet]) {
3121 AliWarning(Form("couldn't get loader for %s", detName.Data()));
6667b602 3122 if (fStopOnError) return NULL;
f08fc9f5 3123 } else {
3124 fRunLoader->AddLoader(fLoader[iDet]);
3125 fRunLoader->CdGAFile();
3126 if (gFile && !gFile->IsWritable()) gFile->ReOpen("UPDATE");
3127 fRunLoader->Write(0, TObject::kOverwrite);
3128 }
3129 }
3130 }
3131
7e88424f 3132 if (fRecoParam.GetDetRecoParamArray(iDet) && !AliReconstructor::GetRecoParam(iDet)) {
3133 const AliDetectorRecoParam *par = fRecoParam.GetDetRecoParam(iDet);
c7a22819 3134 if (reconstructor) {
3135 reconstructor->SetRecoParam(par);
3136 reconstructor->SetRunInfo(fRunInfo);
3137 }
7e88424f 3138 }
b8cd5251 3139 return reconstructor;
c757bafd 3140}
3141
2257f27e 3142//_____________________________________________________________________________
92bffc4d 3143AliVertexer* AliReconstruction::CreateVertexer()
2257f27e 3144{
3145// create the vertexer
92bffc4d 3146// Please note that the caller is the owner of the
3147// vertexer
2257f27e 3148
92bffc4d 3149 AliVertexer* vertexer = NULL;
b8cd5251 3150 AliReconstructor* itsReconstructor = GetReconstructor(0);
903b1262 3151 if (itsReconstructor && ((fRunLocalReconstruction.Contains("ITS")) ||
3152 fRunTracking.Contains("ITS") || fFillESD.Contains("ITS") )) {
92bffc4d 3153 vertexer = itsReconstructor->CreateVertexer();
2257f27e 3154 }
92bffc4d 3155 if (!vertexer) {
815c2b38 3156 AliWarning("couldn't create a vertexer for ITS");
2257f27e 3157 }
3158
92bffc4d 3159 return vertexer;
2257f27e 3160}
3161
1f9831ab 3162//_____________________________________________________________________________
3163AliTrackleter* AliReconstruction::CreateMultFinder()
3164{
3165// create the ITS trackleter for mult. estimation
3166// Please note that the caller is the owner of the
3167// trackleter
3168
3169 AliTrackleter* trackleter = NULL;
3170 AliReconstructor* itsReconstructor = GetReconstructor(0);
903b1262 3171 if (itsReconstructor && ((fRunLocalReconstruction.Contains("ITS")) ||
3172 fRunTracking.Contains("ITS") || fFillESD.Contains("ITS") )) {
1f9831ab 3173 trackleter = itsReconstructor->CreateMultFinder();
3174 }
a0ef2c64 3175 else {
3176 AliWarning("ITS is not in reconstruction, switching off RunMultFinder");
3177 fRunMultFinder = kFALSE;
1f9831ab 3178 }
3179
3180 return trackleter;
3181}
3182
24f7a148 3183//_____________________________________________________________________________
b8cd5251 3184Bool_t AliReconstruction::CreateTrackers(const TString& detectors)
24f7a148 3185{
f08fc9f5 3186// create the trackers
44e45fac 3187 AliInfo("Creating trackers");
24f7a148 3188
b8cd5251 3189 TString detStr = detectors;
ac4a7581 3190 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
b8cd5251 3191 if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
3192 AliReconstructor* reconstructor = GetReconstructor(iDet);
3193 if (!reconstructor) continue;
3194 TString detName = fgkDetectorName[iDet];
1f46a9ae 3195 if (detName == "HLT") {
3196 fRunHLTTracking = kTRUE;
3197 continue;
3198 }
e66fbafb 3199 if (detName == "MUON") {
3200 fRunMuonTracking = kTRUE;
3201 continue;
3202 }
3203
d76c31f4 3204 fTracker[iDet] = reconstructor->CreateTracker();
f08fc9f5 3205 if (!fTracker[iDet] && (iDet < 7)) {
3206 AliWarning(Form("couldn't create a tracker for %s", detName.Data()));
8250d5f5 3207 if (fStopOnError) return kFALSE;
3208 }
6efecea1 3209 AliSysInfo::AddStamp(Form("LTracker%s",fgkDetectorName[iDet]), iDet,0);
8250d5f5 3210 }
3211
24f7a148 3212 return kTRUE;
3213}
3214
e583c30d 3215//_____________________________________________________________________________
4b71572b 3216void AliReconstruction::CleanUp()
e583c30d 3217{
3218// delete trackers and the run loader and close and delete the file
3219
ac4a7581 3220 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
b8cd5251 3221 delete fReconstructor[iDet];
3222 fReconstructor[iDet] = NULL;
3223 fLoader[iDet] = NULL;
3224 delete fTracker[iDet];
3225 fTracker[iDet] = NULL;
3226 }
4b71572b 3227 delete fRunInfo;
7e88424f 3228 fRunInfo = NULL;
3229
58e8dc31 3230 delete fSPDTrackleter;
3231 fSPDTrackleter = NULL;
3232
4b71572b 3233 delete ftVertexer;
21a3aa09 3234 ftVertexer = NULL;
795e4a22 3235
e583c30d 3236 delete fRunLoader;
3237 fRunLoader = NULL;
b649205a 3238 delete fRawReader;
3239 fRawReader = NULL;
4b71572b 3240 delete fParentRawReader;
cd0b062e 3241 fParentRawReader=NULL;
e583c30d 3242
4b71572b 3243 if (ffile) {
3244 ffile->Close();
3245 delete ffile;
3246 ffile = NULL;
24f7a148 3247 }
87da0921 3248
bf76b847 3249 if (AliQAManager::QAManager())
3250 AliQAManager::QAManager()->ShowQA() ;
eca4fa66 3251 AliQAManager::Destroy() ;
3252
24f7a148 3253}
f3a97c86 3254
af885e0f 3255void AliReconstruction::WriteAlignmentData(AliESDEvent* esd)
98937d93 3256{
3257 // Write space-points which are then used in the alignment procedures
6e65648b 3258 // For the moment only ITS, TPC, TRD and TOF
98937d93 3259
98937d93 3260 Int_t ntracks = esd->GetNumberOfTracks();
3261 for (Int_t itrack = 0; itrack < ntracks; itrack++)
3262 {
3263 AliESDtrack *track = esd->GetTrack(itrack);
3264 Int_t nsp = 0;
ef7253ac 3265 Int_t idx[200];
76741755 3266 for (Int_t i=0; i<200; ++i) idx[i] = -1; //PH avoid uninitialized values
81aa7a0d 3267 for (Int_t iDet = 5; iDet >= 0; iDet--) {// TOF, TRD, TPC, ITS clusters
0ad488b0 3268 nsp += (iDet==GetDetIndex("TRD")) ? track->GetTRDntracklets():track->GetNcls(iDet);
6e65648b 3269
0ad488b0 3270 if (iDet==GetDetIndex("ITS")) { // ITS "extra" clusters
6e65648b 3271 track->GetClusters(iDet,idx);
3272 for (Int_t i=6; i<12; i++) if(idx[i] >= 0) nsp++;
3273 }
3274 }
3275
98937d93 3276 if (nsp) {
3277 AliTrackPointArray *sp = new AliTrackPointArray(nsp);
3278 track->SetTrackPointArray(sp);
3279 Int_t isptrack = 0;
81aa7a0d 3280 for (Int_t iDet = 5; iDet >= 0; iDet--) {
98937d93 3281 AliTracker *tracker = fTracker[iDet];
3282 if (!tracker) continue;
0ad488b0 3283 Int_t nspdet = (iDet==GetDetIndex("TRD")) ? track->GetTRDtracklets(idx):track->GetClusters(iDet,idx);
6e65648b 3284
0ad488b0 3285 if (iDet==GetDetIndex("ITS")) // ITS "extra" clusters
6e65648b 3286 for (Int_t i=6; i<12; i++) if(idx[i] >= 0) nspdet++;
3287
98937d93 3288 if (nspdet <= 0) continue;
98937d93 3289 AliTrackPoint p;
3290 Int_t isp = 0;
3291 Int_t isp2 = 0;
4ed6fb1c 3292 while (isp2 < nspdet) {
f3c6e4c9 3293 Bool_t isvalid=kTRUE;
3294
3295 Int_t index=idx[isp++];
3296 if (index < 0) continue;
3297
c12b6e44 3298 TString dets = fgkDetectorName[iDet];
3299 if ((fUseTrackingErrorsForAlignment.CompareTo(dets) == 0) ||
3300 fUseTrackingErrorsForAlignment.BeginsWith(dets+" ") ||
3301 fUseTrackingErrorsForAlignment.EndsWith(" "+dets) ||
3302 fUseTrackingErrorsForAlignment.Contains(" "+dets+" ")) {
f3c6e4c9 3303 isvalid = tracker->GetTrackPointTrackingError(index,p,track);
48ce48d1 3304 } else {
f3c6e4c9 3305 isvalid = tracker->GetTrackPoint(index,p);
48ce48d1 3306 }
3307 isp2++;
98937d93 3308 if (!isvalid) continue;
0ad488b0 3309 if (iDet==GetDetIndex("ITS") && (isp-1)>=6) p.SetExtra();
f3c6e4c9 3310 sp->AddPoint(isptrack,&p); isptrack++;
98937d93 3311 }
98937d93 3312 }
3313 }
3314 }
98937d93 3315}
2e3550da 3316
3317//_____________________________________________________________________________
af885e0f 3318void AliReconstruction::FillRawDataErrorLog(Int_t iEvent, AliESDEvent* esd)
2e3550da 3319{
3320 // The method reads the raw-data error log
3321 // accumulated within the rawReader.
3322 // It extracts the raw-data errors related to
3323 // the current event and stores them into
3324 // a TClonesArray inside the esd object.
3325
3326 if (!fRawReader) return;
3327
3328 for(Int_t i = 0; i < fRawReader->GetNumberOfErrorLogs(); i++) {
3329
3330 AliRawDataErrorLog *log = fRawReader->GetErrorLog(i);
3331 if (!log) continue;
3332 if (iEvent != log->GetEventNumber()) continue;
3333
3334 esd->AddRawDataErrorLog(log);
3335 }
3336
3337}
46698ae4 3338
8661738e 3339//_____________________________________________________________________________
0a035be5 3340// void AliReconstruction::CheckQA()
3341// {
8661738e 3342// check the QA of SIM for this run and remove the detectors
3343// with status Fatal
3344
57acd2d2 3345// TString newRunLocalReconstruction ;
3346// TString newRunTracking ;
3347// TString newFillESD ;
3348//
4e25ac79 3349// for (Int_t iDet = 0; iDet < AliQAv1::kNDET; iDet++) {
3350// TString detName(AliQAv1::GetDetName(iDet)) ;
3351// AliQAv1 * qa = AliQAv1::Instance(AliQAv1::DETECTORINDEX_t(iDet)) ;
3352// if ( qa->IsSet(AliQAv1::DETECTORINDEX_t(iDet), AliQAv1::kSIM, specie, AliQAv1::kFATAL)) {
57acd2d2 3353// AliInfo(Form("QA status for %s %s in Hits and/or SDIGITS and/or Digits was Fatal; No reconstruction performed",
3354// detName.Data(), AliRecoParam::GetEventSpecieName(es))) ;
3355// } else {
4e25ac79 3356// if ( fRunLocalReconstruction.Contains(AliQAv1::GetDetName(iDet)) ||
57acd2d2 3357// fRunLocalReconstruction.Contains("ALL") ) {
3358// newRunLocalReconstruction += detName ;
3359// newRunLocalReconstruction += " " ;
3360// }
4e25ac79 3361// if ( fRunTracking.Contains(AliQAv1::GetDetName(iDet)) ||
57acd2d2 3362// fRunTracking.Contains("ALL") ) {
3363// newRunTracking += detName ;
3364// newRunTracking += " " ;
3365// }
4e25ac79 3366// if ( fFillESD.Contains(AliQAv1::GetDetName(iDet)) ||
57acd2d2 3367// fFillESD.Contains("ALL") ) {
3368// newFillESD += detName ;
3369// newFillESD += " " ;
3370// }
3371// }
3372// }
3373// fRunLocalReconstruction = newRunLocalReconstruction ;
3374// fRunTracking = newRunTracking ;
3375// fFillESD = newFillESD ;
0a035be5 3376// }
5b188f2f 3377
3378//_____________________________________________________________________________
3379Int_t AliReconstruction::GetDetIndex(const char* detector)
3380{
3381 // return the detector index corresponding to detector
3382 Int_t index = -1 ;
ac4a7581 3383 for (index = 0; index < kNDetectors ; index++) {
5b188f2f 3384 if ( strcmp(detector, fgkDetectorName[index]) == 0 )
3385 break ;
3386 }
3387 return index ;
3388}
7167ae53 3389//_____________________________________________________________________________
3390Bool_t AliReconstruction::FinishPlaneEff() {
3391 //
3392 // Here execute all the necessary operationis, at the end of the tracking phase,
d7f8fd68 3393 // in case that evaluation of PlaneEfficiencies was required for some detector.
3394 // E.g., write into a DataBase file the PlaneEfficiency which have been evaluated.
7167ae53 3395 //
3396 // This Preliminary version works only FOR ITS !!!!!
3397 // other detectors (TOF,TRD, etc. have to develop their specific codes)
3398 //
3399 // Input: none
d7f8fd68 3400 // Return: kTRUE if all operations have been done properly, kFALSE otherwise
7167ae53 3401 //
3402 Bool_t ret=kFALSE;
5ee13eb5 3403 TString detStr = fLoadCDB;
58e8dc31 3404 //for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
d7f8fd68 3405 for (Int_t iDet = 0; iDet < 1; iDet++) { // for the time being only ITS
5ee13eb5 3406 if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
58e8dc31 3407 if(fTracker[iDet] && fTracker[iDet]->GetPlaneEff()) {
d7f8fd68 3408 AliPlaneEff *planeeff=fTracker[iDet]->GetPlaneEff();
3409 TString name=planeeff->GetName();
3410 name+=".root";
3411 TFile* pefile = TFile::Open(name, "RECREATE");
3412 ret=(Bool_t)planeeff->Write();
3413 pefile->Close();
5fbd4fd6 3414 if(planeeff->GetCreateHistos()) {
d7f8fd68 3415 TString hname=planeeff->GetName();
3416 hname+="Histo.root";
3417 ret*=planeeff->WriteHistosToFile(hname,"RECREATE");
5fbd4fd6 3418 }
3419 }
58e8dc31 3420 if(fSPDTrackleter) {
3421 AliPlaneEff *planeeff=fSPDTrackleter->GetPlaneEff();
3422 TString name="AliITSPlaneEffSPDtracklet.root";
3423 TFile* pefile = TFile::Open(name, "RECREATE");
3424 ret=(Bool_t)planeeff->Write();
3425 pefile->Close();
3426 AliESDEvent *dummy=NULL;
3427 ret=(Bool_t)fSPDTrackleter->PostProcess(dummy); // take care of writing other files
3428 }
7167ae53 3429 }
3430 return ret;
3431}
3432//_____________________________________________________________________________
3433Bool_t AliReconstruction::InitPlaneEff() {
3434//
3435 // Here execute all the necessary operations, before of the tracking phase,
3436 // for the evaluation of PlaneEfficiencies, in case required for some detectors.
58e8dc31 3437 // E.g., read from a DataBase file a first evaluation of the PlaneEfficiency
7167ae53 3438 // which should be updated/recalculated.
3439 //
3440 // This Preliminary version will work only FOR ITS !!!!!
3441 // other detectors (TOF,TRD, etc. have to develop their specific codes)
3442 //
3443 // Input: none
3444 // Return: kTRUE if all operations have been done properly, kFALSE otherwise
3445 //
58e8dc31 3446
3447 fSPDTrackleter = NULL;
b8604b34 3448 TString detStr = fLoadCDB;
3449 if (IsSelected(fgkDetectorName[0], detStr)) {
3450 AliReconstructor* itsReconstructor = GetReconstructor(0);
3451 if (itsReconstructor) {
3452 fSPDTrackleter = itsReconstructor->CreateTrackleter(); // this is NULL unless required in RecoParam
3453 }
3454 if (fSPDTrackleter) {
3455 AliInfo("Trackleter for SPD has been created");
3456 }
58e8dc31 3457 }
7167ae53 3458 return kTRUE;
7520312d 3459}
14dd053c 3460
3461//_____________________________________________________________________________
3462Bool_t AliReconstruction::InitAliEVE()
3463{
3464 // This method should be called only in case
3465 // AliReconstruction is run
3466 // within the alieve environment.
3467 // It will initialize AliEVE in a way
3468 // so that it can visualize event processed
3469 // by AliReconstruction.
3470 // The return flag shows whenever the
3471 // AliEVE initialization was successful or not.
3472
5239ebd6 3473 TString macroStr(gSystem->Getenv("ALIEVE_ONLINE_MACRO"));
3474
3475 if (macroStr.IsNull())
3476 macroStr.Form("%s/EVE/macros/alieve_online.C",gSystem->ExpandPathName("$ALICE_ROOT"));
3477
3478 AliInfo(Form("Loading AliEVE macro: %s",macroStr.Data()));
3479
14dd053c 3480 if (gROOT->LoadMacro(macroStr.Data()) != 0) return kFALSE;
3481
6a840f1e 3482 gROOT->ProcessLine("if (!AliEveEventManager::GetMaster()){new AliEveEventManager();AliEveEventManager::GetMaster()->AddNewEventCommand(\"alieve_online_on_new_event()\");gEve->AddEvent(AliEveEventManager::GetMaster());};");
de33999e 3483 gROOT->ProcessLine("alieve_online_init()");
14dd053c 3484
3485 return kTRUE;
3486}
3487
3488//_____________________________________________________________________________
3489void AliReconstruction::RunAliEVE()
3490{
3491 // Runs AliEVE visualisation of
3492 // the current event.
3493 // Should be executed only after
3494 // successful initialization of AliEVE.
3495
3496 AliInfo("Running AliEVE...");
72c084a0 3497 gROOT->ProcessLine(Form("AliEveEventManager::GetMaster()->SetEvent((AliRunLoader*)%p,(AliRawReader*)%p,(AliESDEvent*)%p,(AliESDfriend*)%p);",fRunLoader,fRawReader,fesd,fesdf));
14dd053c 3498 gSystem->Run();
3499}
ce43afbe 3500
3501//_____________________________________________________________________________
3502Bool_t AliReconstruction::SetRunQA(TString detAndAction)
3503{
3504 // Allows to run QA for a selected set of detectors
44ed7a66 3505 // and a selected set of tasks among RAWS, DIGITSR, RECPOINTS and ESDS
ce43afbe 3506 // all selected detectors run the same selected tasks
3507
3508 if (!detAndAction.Contains(":")) {
3509 AliError( Form("%s is a wrong syntax, use \"DetectorList:ActionList\" \n", detAndAction.Data()) ) ;
3510 fRunQA = kFALSE ;
3511 return kFALSE ;
3512 }
3513 Int_t colon = detAndAction.Index(":") ;
3514 fQADetectors = detAndAction(0, colon) ;
59b1e631 3515 fQATasks = detAndAction(colon+1, detAndAction.Sizeof() ) ;
ce43afbe 3516 if (fQATasks.Contains("ALL") ) {
44ed7a66 3517 fQATasks = Form("%d %d %d %d", AliQAv1::kRAWS, AliQAv1::kDIGITSR, AliQAv1::kRECPOINTS, AliQAv1::kESDS) ;
ce43afbe 3518 } else {
3519 fQATasks.ToUpper() ;
3520 TString tempo("") ;
3521 if ( fQATasks.Contains("RAW") )
4e25ac79 3522 tempo = Form("%d ", AliQAv1::kRAWS) ;
44ed7a66 3523 if ( fQATasks.Contains("DIGIT") )
3524 tempo += Form("%d ", AliQAv1::kDIGITSR) ;
ce43afbe 3525 if ( fQATasks.Contains("RECPOINT") )
4e25ac79 3526 tempo += Form("%d ", AliQAv1::kRECPOINTS) ;
ce43afbe 3527 if ( fQATasks.Contains("ESD") )
4e25ac79 3528 tempo += Form("%d ", AliQAv1::kESDS) ;
ce43afbe 3529 fQATasks = tempo ;
3530 if (fQATasks.IsNull()) {
3531 AliInfo("No QA requested\n") ;
3532 fRunQA = kFALSE ;
3533 return kTRUE ;
3534 }
3535 }
3536 TString tempo(fQATasks) ;
4e25ac79 3537 tempo.ReplaceAll(Form("%d", AliQAv1::kRAWS), AliQAv1::GetTaskName(AliQAv1::kRAWS)) ;
44ed7a66 3538 tempo.ReplaceAll(Form("%d", AliQAv1::kDIGITSR), AliQAv1::GetTaskName(AliQAv1::kDIGITSR)) ;
4e25ac79 3539 tempo.ReplaceAll(Form("%d", AliQAv1::kRECPOINTS), AliQAv1::GetTaskName(AliQAv1::kRECPOINTS)) ;
3540 tempo.ReplaceAll(Form("%d", AliQAv1::kESDS), AliQAv1::GetTaskName(AliQAv1::kESDS)) ;
ce43afbe 3541 AliInfo( Form("QA will be done on \"%s\" for \"%s\"\n", fQADetectors.Data(), tempo.Data()) ) ;
3542 fRunQA = kTRUE ;
3543 return kTRUE;
3544}
3545
7e88424f 3546//_____________________________________________________________________________
3547Bool_t AliReconstruction::InitRecoParams()
3548{
3549 // The method accesses OCDB and retrieves all
3550 // the available reco-param objects from there.
3551
3552 Bool_t isOK = kTRUE;
3553
8b26452d 3554 if (fRecoParam.GetDetRecoParamArray(kNDetectors)) {
3555 AliInfo("Using custom GRP reconstruction parameters");
3556 }
3557 else {
3558 AliInfo("Loading GRP reconstruction parameter objects");
3559
3560 AliCDBPath path("GRP","Calib","RecoParam");
3561 AliCDBEntry *entry=AliCDBManager::Instance()->Get(path.GetPath());
3562 if(!entry){
3563 AliWarning("Couldn't find GRP RecoParam entry in OCDB");
3564 isOK = kFALSE;
3565 }
3566 else {
3567 TObject *recoParamObj = entry->GetObject();
3568 if (dynamic_cast<TObjArray*>(recoParamObj)) {
3569 // GRP has a normal TobjArray of AliDetectorRecoParam objects
3570 // Registering them in AliRecoParam
3571 fRecoParam.AddDetRecoParamArray(kNDetectors,dynamic_cast<TObjArray*>(recoParamObj));
3572 }
3573 else if (dynamic_cast<AliDetectorRecoParam*>(recoParamObj)) {
3574 // GRP has only onse set of reco parameters
3575 // Registering it in AliRecoParam
3576 AliInfo("Single set of GRP reconstruction parameters found");
3577 dynamic_cast<AliDetectorRecoParam*>(recoParamObj)->SetAsDefault();
3578 fRecoParam.AddDetRecoParam(kNDetectors,dynamic_cast<AliDetectorRecoParam*>(recoParamObj));
3579 }
3580 else {
3581 AliError("No valid GRP RecoParam object found in the OCDB");
3582 isOK = kFALSE;
3583 }
3584 entry->SetOwner(0);
3585 }
3586 }
3587
7d566c20 3588 TString detStr = fLoadCDB;
ac4a7581 3589 for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
7e88424f 3590
7d566c20 3591 if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
3592
7e88424f 3593 if (fRecoParam.GetDetRecoParamArray(iDet)) {
3594 AliInfo(Form("Using custom reconstruction parameters for detector %s",fgkDetectorName[iDet]));
3595 continue;
3596 }
3597
ac232c75 3598 AliInfo(Form("Loading reconstruction parameter objects for detector %s",fgkDetectorName[iDet]));
7e88424f 3599
3600 AliCDBPath path(fgkDetectorName[iDet],"Calib","RecoParam");
3601 AliCDBEntry *entry=AliCDBManager::Instance()->Get(path.GetPath());
3602 if(!entry){
3603 AliWarning(Form("Couldn't find RecoParam entry in OCDB for detector %s",fgkDetectorName[iDet]));
3604 isOK = kFALSE;
3605 }
3606 else {
3607 TObject *recoParamObj = entry->GetObject();
3608 if (dynamic_cast<TObjArray*>(recoParamObj)) {
3609 // The detector has a normal TobjArray of AliDetectorRecoParam objects
3610 // Registering them in AliRecoParam
3611 fRecoParam.AddDetRecoParamArray(iDet,dynamic_cast<TObjArray*>(recoParamObj));
3612 }
3613 else if (dynamic_cast<AliDetectorRecoParam*>(recoParamObj)) {
3614 // The detector has only onse set of reco parameters
3615 // Registering it in AliRecoParam
ac232c75 3616 AliInfo(Form("Single set of reconstruction parameters found for detector %s",fgkDetectorName[iDet]));
7e88424f 3617 dynamic_cast<AliDetectorRecoParam*>(recoParamObj)->SetAsDefault();
3618 fRecoParam.AddDetRecoParam(iDet,dynamic_cast<AliDetectorRecoParam*>(recoParamObj));
3619 }
3620 else {
3621 AliError(Form("No valid RecoParam object found in the OCDB for detector %s",fgkDetectorName[iDet]));
3622 isOK = kFALSE;
3623 }
3624 entry->SetOwner(0);
f168abba 3625 // FIX ME: We have to disable the unloading of reco-param CDB
3626 // entries because QA framework is using them. Has to be fix in
3627 // a way that the QA takes the objects already constructed in
3628 // this method.
3629 // AliCDBManager::Instance()->UnloadFromCache(path.GetPath());
7e88424f 3630 }
3631 }
3632
e30a9b4d 3633 if (AliDebugLevel() > 0) fRecoParam.Print();
ac232c75 3634
7e88424f 3635 return isOK;
3636}
3637
3638//_____________________________________________________________________________
3639Bool_t AliReconstruction::GetEventInfo()
3640{
3641 // Fill the event info object
3642 // ...
52dd4a8c 3643 AliCodeTimerAuto("",0)
7e88424f 3644
3645 AliCentralTrigger *aCTP = NULL;
3646 if (fRawReader) {
3647 fEventInfo.SetEventType(fRawReader->GetType());
3648
3649 ULong64_t mask = fRawReader->GetClassMask();
3650 fEventInfo.SetTriggerMask(mask);
3651 UInt_t clmask = fRawReader->GetDetectorPattern()[0];
3652 fEventInfo.SetTriggerCluster(AliDAQ::ListOfTriggeredDetectors(clmask));
3653
3654 aCTP = new AliCentralTrigger();
3655 TString configstr("");
3656 if (!aCTP->LoadConfiguration(configstr)) { // Load CTP config from OCDB
3657 AliError("No trigger configuration found in OCDB! The trigger configuration information will not be used!");
3658 delete aCTP;
3659 return kFALSE;
3660 }
3661 aCTP->SetClassMask(mask);
3662 aCTP->SetClusterMask(clmask);
3663 }
3664 else {
3665 fEventInfo.SetEventType(AliRawEventHeaderBase::kPhysicsEvent);
3666
3667 if (fRunLoader && (!fRunLoader->LoadTrigger())) {
3668 aCTP = fRunLoader->GetTrigger();
3669 fEventInfo.SetTriggerMask(aCTP->GetClassMask());
e61ed4b1 3670 // get inputs from actp - just get
3671 AliESDHeader* esdheader = fesd->GetHeader();
3672 esdheader->SetL0TriggerInputs(aCTP->GetL0TriggerInputs());
3673 esdheader->SetL1TriggerInputs(aCTP->GetL1TriggerInputs());
3674 esdheader->SetL2TriggerInputs(aCTP->GetL2TriggerInputs());
7e88424f 3675 fEventInfo.SetTriggerCluster(AliDAQ::ListOfTriggeredDetectors(aCTP->GetClusterMask()));
3676 }
3677 else {
3678 AliWarning("No trigger can be loaded! The trigger information will not be used!");
3679 return kFALSE;
3680 }
3681 }
3682
3683 AliTriggerConfiguration *config = aCTP->GetConfiguration();
3684 if (!config) {
3685 AliError("No trigger configuration has been found! The trigger configuration information will not be used!");
3686 if (fRawReader) delete aCTP;
3687 return kFALSE;
3688 }
3689
a0c2cf2d 3690 UChar_t clustmask = 0;
7e88424f 3691 TString trclasses;
3692 ULong64_t trmask = fEventInfo.GetTriggerMask();
3693 const TObjArray& classesArray = config->GetClasses();
3694 Int_t nclasses = classesArray.GetEntriesFast();
3695 for( Int_t iclass=0; iclass < nclasses; iclass++ ) {
3696 AliTriggerClass* trclass = (AliTriggerClass*)classesArray.At(iclass);
a2ec4f82 3697 if (trclass && trclass->GetMask()>0) {
a4b0683d 3698 Int_t trindex = TMath::Nint(TMath::Log2(trclass->GetMask()));
7e88424f 3699 fesd->SetTriggerClass(trclass->GetName(),trindex);
8a933107 3700 if (fRawReader) fRawReader->LoadTriggerClass(trclass->GetName(),trindex);
e61ed4b1 3701 if (trmask & (1ull << trindex)) {
7e88424f 3702 trclasses += " ";
3703 trclasses += trclass->GetName();
3704 trclasses += " ";
a0c2cf2d 3705 clustmask |= trclass->GetCluster()->GetClusterMask();
7e88424f 3706 }
3707 }
3708 }
3709 fEventInfo.SetTriggerClasses(trclasses);
3710
6ef9caeb 3711 // Write names of active trigger inputs in ESD Header
3712 const TObjArray& inputsArray = config->GetInputs();
3713 Int_t ninputs = inputsArray.GetEntriesFast();
3714 for( Int_t iinput=0; iinput < ninputs; iinput++ ) {
3715 AliTriggerInput* trginput = (AliTriggerInput*)inputsArray.At(iinput);
a2ec4f82 3716 if (trginput && trginput->GetMask()>0) {
6ef9caeb 3717 Int_t inputIndex = (Int_t)TMath::Nint(TMath::Log2(trginput->GetMask()));
3718 AliESDHeader* headeresd = fesd->GetHeader();
3719 Int_t trglevel = (Int_t)trginput->GetLevel();
3720 if (trglevel == 0) headeresd->SetActiveTriggerInputs(trginput->GetInputName(), inputIndex);
3721 if (trglevel == 1) headeresd->SetActiveTriggerInputs(trginput->GetInputName(), inputIndex+24);
3722 if (trglevel == 2) headeresd->SetActiveTriggerInputs(trginput->GetInputName(), inputIndex+48);
3723 }
3724 }
3725
a0c2cf2d 3726 // Set the information in ESD
3727 fesd->SetTriggerMask(trmask);
3728 fesd->SetTriggerCluster(clustmask);
3729
7e88424f 3730 if (!aCTP->CheckTriggeredDetectors()) {
3731 if (fRawReader) delete aCTP;
3732 return kFALSE;
3733 }
3734
3735 if (fRawReader) delete aCTP;
3736
3737 // We have to fill also the HLT decision here!!
3738 // ...
3739
3740 return kTRUE;
3741}
3742
3743const char *AliReconstruction::MatchDetectorList(const char *detectorList, UInt_t detectorMask)
3744{
3745 // Match the detector list found in the rec.C or the default 'ALL'
3746 // to the list found in the GRP (stored there by the shuttle PP which
3747 // gets the information from ECS)
3748 static TString resultList;
3749 TString detList = detectorList;
3750
3751 resultList = "";
3752
3753 for(Int_t iDet = 0; iDet < (AliDAQ::kNDetectors-1); iDet++) {
3754 if ((detectorMask >> iDet) & 0x1) {
3755 TString det = AliDAQ::OfflineModuleName(iDet);
3756 if ((detList.CompareTo("ALL") == 0) ||
a101e1dd 3757 ((detList.BeginsWith("ALL ") ||
3758 detList.EndsWith(" ALL") ||
3759 detList.Contains(" ALL ")) &&
3760 !(detList.BeginsWith("-"+det+" ") ||
3761 detList.EndsWith(" -"+det) ||
3762 detList.Contains(" -"+det+" "))) ||
7e88424f 3763 (detList.CompareTo(det) == 0) ||
a101e1dd 3764 detList.BeginsWith(det+" ") ||
3765 detList.EndsWith(" "+det) ||
7e88424f 3766 detList.Contains( " "+det+" " )) {
3767 if (!resultList.EndsWith(det + " ")) {
3768 resultList += det;
3769 resultList += " ";
3770 }
3771 }
3772 }
3773 }
3774
3775 // HLT
3776 if ((detectorMask >> AliDAQ::kHLTId) & 0x1) {
3777 TString hltDet = AliDAQ::OfflineModuleName(AliDAQ::kNDetectors-1);
3778 if ((detList.CompareTo("ALL") == 0) ||
a101e1dd 3779 ((detList.BeginsWith("ALL ") ||
3780 detList.EndsWith(" ALL") ||
3781 detList.Contains(" ALL ")) &&
3782 !(detList.BeginsWith("-"+hltDet+" ") ||
3783 detList.EndsWith(" -"+hltDet) ||
3784 detList.Contains(" -"+hltDet+" "))) ||
7e88424f 3785 (detList.CompareTo(hltDet) == 0) ||
a101e1dd 3786 detList.BeginsWith(hltDet+" ") ||
3787 detList.EndsWith(" "+hltDet) ||
7e88424f 3788 detList.Contains( " "+hltDet+" " )) {
3789 resultList += hltDet;
3790 }
3791 }
3792
3793 return resultList.Data();
3794
3795}
4b71572b 3796
3797//______________________________________________________________________________
3798void AliReconstruction::Abort(const char *method, EAbort what)
3799{
3800 // Abort processing. If what = kAbortProcess, the Process() loop will be
3801 // aborted. If what = kAbortFile, the current file in a chain will be
3802 // aborted and the processing will continue with the next file, if there
3803 // is no next file then Process() will be aborted. Abort() can also be
3804 // called from Begin(), SlaveBegin(), Init() and Notify(). After abort
3805 // the SlaveTerminate() and Terminate() are always called. The abort flag
3806 // can be checked in these methods using GetAbort().
3807 //
3808 // The method is overwritten in AliReconstruction for better handling of
3809 // reco specific errors
3810
3811 if (!fStopOnError) return;
3812
3813 CleanUp();
3814
3815 TString whyMess = method;
3816 whyMess += " failed! Aborting...";
3817
3818 AliError(whyMess.Data());
3819
3820 fAbort = what;
3821 TString mess = "Abort";
3822 if (fAbort == kAbortProcess)
3823 mess = "AbortProcess";
3824 else if (fAbort == kAbortFile)
3825 mess = "AbortFile";
3826
3827 Info(mess, whyMess.Data());
3828}
3829
2f954aba 3830//______________________________________________________________________________
3831Bool_t AliReconstruction::ProcessEvent(void* event)
3832{
3833 // Method that is used in case the event loop
3834 // is steered from outside, for example by AMORE
3835 // 'event' is a pointer to the DATE event in the memory
3836
3837 if (fRawReader) delete fRawReader;
3838 fRawReader = new AliRawReaderDate(event);
3839 fStatus = ProcessEvent(fRunLoader->GetNumberOfEvents());
3840 delete fRawReader;
3841 fRawReader = NULL;
3842
3843 return fStatus;
3844}
81d57268 3845
3846//______________________________________________________________________________
3847Bool_t AliReconstruction::ParseOutput()
3848{
3849 // The method parses the output file
3850 // location string in order to steer
3851 // properly the selector
3852
3853 TPMERegexp re1("(\\w+\\.zip#\\w+\\.root):([,*\\w+\\.root,*]+)@dataset://(\\w++)");
3854 TPMERegexp re2("(\\w+\\.root)?@?dataset://(\\w++)");
3855
3856 if (re1.Match(fESDOutput) == 4) {
3857 // root archive with output files stored and regustered
3858 // in proof dataset
3859 gProof->AddInput(new TNamed("PROOF_OUTPUTFILE",re1[1].Data()));
3860 gProof->AddInput(new TNamed("PROOF_OUTPUTFILE_LOCATION",re1[3].Data()));
3861 gProof->AddInput(new TNamed("PROOF_OUTPUTFILE_DATASET",""));
3862 gProof->AddInput(new TNamed("PROOF_OUTPUTFILE_ARCHIVE",re1[2].Data()));
3863 AliInfo(Form("%s files will be stored within %s in dataset %s",
3864 re1[2].Data(),
3865 re1[1].Data(),
3866 re1[3].Data()));
3867 }
3868 else if (re2.Match(fESDOutput) == 3) {
3869 // output file stored and registered
3870 // in proof dataset
3871 gProof->AddInput(new TNamed("PROOF_OUTPUTFILE",(re2[1].IsNull()) ? "AliESDs.root" : re2[1].Data()));
3872 gProof->AddInput(new TNamed("PROOF_OUTPUTFILE_LOCATION",re2[2].Data()));
3873 gProof->AddInput(new TNamed("PROOF_OUTPUTFILE_DATASET",""));
3874 AliInfo(Form("%s will be stored in dataset %s",
3875 (re2[1].IsNull()) ? "AliESDs.root" : re2[1].Data(),
3876 re2[2].Data()));
3877 }
3878 else {
3879 if (fESDOutput.IsNull()) {
3880 // Output location not given.
3881 // Assuming xrootd has been already started and
3882 // the output file has to be sent back
3883 // to the client machine
3884 TString esdUrl(Form("root://%s/%s/",
3885 TUrl(gSystem->HostName()).GetHostFQDN(),
3886 gSystem->pwd()));
3887 gProof->AddInput(new TNamed("PROOF_OUTPUTFILE","AliESDs.root"));
3888 gProof->AddInput(new TNamed("PROOF_OUTPUTFILE_LOCATION",esdUrl.Data()));
3889 AliInfo(Form("AliESDs.root will be stored in %s",
3890 esdUrl.Data()));
3891 }
3892 else {
3893 // User specified an output location.
3894 // Ones has just to parse it here
3895 TUrl outputUrl(fESDOutput.Data());
3896 TString outputFile(gSystem->BaseName(outputUrl.GetFile()));
3897 gProof->AddInput(new TNamed("PROOF_OUTPUTFILE",outputFile.IsNull() ? "AliESDs.root" : outputFile.Data()));
3898 TString outputLocation(outputUrl.GetUrl());
3899 outputLocation.ReplaceAll(outputFile.Data(),"");
3900 gProof->AddInput(new TNamed("PROOF_OUTPUTFILE_LOCATION",outputLocation.Data()));
3901 AliInfo(Form("%s will be stored in %s",
3902 outputFile.IsNull() ? "AliESDs.root" : outputFile.Data(),
3903 outputLocation.Data()));
3904 }
3905 }
3906
3907 return kTRUE;
3908}
f00558b6 3909
3910//______________________________________________________________________________
3911Bool_t AliReconstruction::IsHighPt() const {
3912 // Selection of events containing "high" pT tracks
3913 // If at least one track is found within 1.5 and 100 GeV (pT)
3914 // that was reconstructed by both ITS and TPC, the event is accepted
3915
3916 // Track cuts
3917
3918 const Double_t pTmin = 1.5;
3919 const Double_t pTmax = 100;
3920 ULong_t mask = 0;
3921 mask |= (AliESDtrack::kITSrefit);
3922 mask |= (AliESDtrack::kTPCrefit);
3923
3924 Bool_t isOK = kFALSE;
3925
3926 if (fesd && fesd->GetEventType()==AliRawEventHeaderBase::kPhysicsEvent) {
3927 // Check if this ia a physics event (code 7)
3928 Int_t ntrk = fesd->GetNumberOfTracks();
3929 for (Int_t itrk=0; itrk<ntrk; ++itrk) {
3930
3931 AliESDtrack * trk = fesd->GetTrack(itrk);
3932 if (trk
3933 && trk->Pt() > pTmin
3934 && trk->Pt() < pTmax
3935 && (trk->GetStatus() & mask) == mask ) {
3936
3937 isOK = kTRUE;
3938 break;
3939 }
3940 }
3941 }
3942 return isOK;
3943}
3944
3945//______________________________________________________________________________
3946Bool_t AliReconstruction::IsCosmicOrCalibSpecie() const {
3947 // Select cosmic or calibration events
3948
3949 Bool_t isOK = kFALSE;
3950
3951 if (fesd && fesd->GetEventType()==AliRawEventHeaderBase::kPhysicsEvent) {
3952 // Check if this ia a physics event (code 7)
3953
3954 UInt_t specie = fesd->GetEventSpecie();
3955 if (specie==AliRecoParam::kCosmic || specie==AliRecoParam::kCalib) {
3956 isOK = kTRUE;
3957 }
3958 }
3959 return isOK;
3960}
3961
3962//______________________________________________________________________________
3963void AliReconstruction::WriteESDfriend() {
3964 // Fill the ESD friend in the tree. The required fraction of ESD friends is stored
3965 // in fFractionFriends. We select events where we store the ESD friends according
3966 // to the following algorithm:
3967 // 1. Store all Cosmic or Calibration events within the required fraction
3968 // 2. Sample "high Pt" events within the remaining fraction after step 1.
3969 // 3. Sample randomly events if we still have remaining slot
3970
3971 fNall++;
3972
3973 Bool_t isSelected = kFALSE;
3974
3975 if (IsCosmicOrCalibSpecie()) { // Selection of calib or cosmic events
3976 fNspecie++;
3977 Double_t curentSpecieFraction = ((Double_t)(fNspecie+1))/((Double_t)(fNall+1));
3978 // "Bayesian" estimate supposing that without events all the events are of the required type
3979
3980 Double_t rnd = gRandom->Rndm()*curentSpecieFraction;
3981 if (rnd<fFractionFriends) {
3982 isSelected = kTRUE;
3983 fSspecie++;
3984 }
3985 }
3986
3987 Double_t remainingFraction = fFractionFriends;
3988 remainingFraction -= ((Double_t)(fSspecie)/(Double_t)(fNall));
3989
3990 if (IsHighPt()) { // Selection of "high Pt" events
3991 fNhighPt++;
3992 Double_t curentHighPtFraction = ((Double_t)(fNhighPt+1))/((Double_t)(fNall+1));
3993 // "Bayesian" estimate supposing that without events all the events are of the required type
3994
3995 if (!isSelected) {
3996 Double_t rnd = gRandom->Rndm()*curentHighPtFraction;
3997 if (rnd<remainingFraction) {
3998 isSelected = kTRUE;
3999 fShighPt++;
4000 }
4001 }
4002 }
4003 remainingFraction -= ((Double_t)(fShighPt)/(Double_t)(fNall));
4004
4005 // Random selection to fill the remaining fraction (if any)
4006 if (!isSelected) {
4007 Double_t rnd = gRandom->Rndm();
4008 if (rnd<remainingFraction) {
4009 isSelected = kTRUE;
4010 }
4011 }
4012
4013 if (!isSelected) {
4014 fesdf->~AliESDfriend();
4015 new (fesdf) AliESDfriend(); // Reset...
4016 fesdf->SetSkipBit(kTRUE);
4017 }
4018
4019 ftreeF->Fill();
4020}