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