]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - STEER/AliReconstruction.cxx
Inherits from AliPIDResponse
[u/mrichter/AliRoot.git] / STEER / AliReconstruction.cxx
index 24027ce72e7d564a6b8d161b6f5a5d1c31e9f0cf..3e1c2d2989ef8290296f97f6077eb95812bf610e 100644 (file)
 #include <THashTable.h>
 #include <TGrid.h>
 #include <TMessage.h>
+#include <TUrl.h>
+#include <TRandom.h>
 
 #include "AliAlignObj.h"
 #include "AliCDBEntry.h"
 #include "AliTriggerConfiguration.h"
 #include "AliV0vertexer.h"
 #include "AliVertexer.h"
+#include "AliTrackleter.h"
 #include "AliVertexerTracks.h"
-
+#include "AliTriggerRunScalers.h"
+#include "AliCTPTimeParams.h" 
+#include "AliESDHLTDecision.h"
+#include "AliTriggerInput.h"
+#include "AliLHCData.h"
 ClassImp(AliReconstruction)
 
 //_____________________________________________________________________________
@@ -204,7 +211,8 @@ AliReconstruction::AliReconstruction(const char* gAliceFilename) :
   fRunMuonTracking(kFALSE),
   fRunV0Finder(kTRUE),
   fRunCascadeFinder(kTRUE),
-  fStopOnError(kFALSE),
+  fRunMultFinder(kTRUE),
+  fStopOnError(kTRUE),
   fWriteAlignmentData(kFALSE),
   fWriteESDfriend(kFALSE),
   fFillTriggerESD(kTRUE),
@@ -231,6 +239,7 @@ AliReconstruction::AliReconstruction(const char* gAliceFilename) :
   fFirstEvent(0),
   fLastEvent(-1),
   fNumberOfEventsPerFile((UInt_t)-1),
+  fFractionFriends(0.04),
   fOptions(),
   fLoadAlignFromCDB(kTRUE),
   fLoadAlignData("ALL"),
@@ -238,6 +247,8 @@ AliReconstruction::AliReconstruction(const char* gAliceFilename) :
   fRunInfo(NULL),
   fEventInfo(),
   fRunScalers(NULL),
+  fCTPTimeParams(NULL),  
+  fCTPTimeAlign(NULL),  
 
   fRunLoader(NULL),
   fRawReader(NULL),
@@ -273,12 +284,19 @@ AliReconstruction::AliReconstruction(const char* gAliceFilename) :
   fhltesd(NULL),
   fesdf(NULL),
   ffile(NULL),
+  ffileF(NULL),
   ftree(NULL),
+  ftreeF(NULL),
   fhlttree(NULL),
   ftVertexer(NULL),
   fIsNewRunLoader(kFALSE),
   fRunAliEVE(kFALSE),
-  fChain(NULL)
+  fChain(NULL),
+  fNall(0),
+  fNspecie(0),
+  fSspecie(0),
+  fNhighPt(0),
+  fShighPt(0)
 {
 // create reconstruction object with default parameters
   gGeoManager = NULL;
@@ -292,7 +310,8 @@ AliReconstruction::AliReconstruction(const char* gAliceFilename) :
     fQACycles[iDet] = 999999 ;
     fQAWriteExpert[iDet] = kFALSE ; 
   }
-    
+  fBeamInt[0][0]=fBeamInt[0][1]=fBeamInt[1][0]=fBeamInt[1][1] = -1;
+
   AliPID pid;
 }
 
@@ -305,6 +324,7 @@ AliReconstruction::AliReconstruction(const AliReconstruction& rec) :
   fRunMuonTracking(rec.fRunMuonTracking),
   fRunV0Finder(rec.fRunV0Finder),
   fRunCascadeFinder(rec.fRunCascadeFinder),
+  fRunMultFinder(rec.fRunMultFinder),
   fStopOnError(rec.fStopOnError),
   fWriteAlignmentData(rec.fWriteAlignmentData),
   fWriteESDfriend(rec.fWriteESDfriend),
@@ -332,6 +352,7 @@ AliReconstruction::AliReconstruction(const AliReconstruction& rec) :
   fFirstEvent(rec.fFirstEvent),
   fLastEvent(rec.fLastEvent),
   fNumberOfEventsPerFile(rec.fNumberOfEventsPerFile),
+  fFractionFriends(rec.fFractionFriends),
   fOptions(),
   fLoadAlignFromCDB(rec.fLoadAlignFromCDB),
   fLoadAlignData(rec.fLoadAlignData),
@@ -339,6 +360,8 @@ AliReconstruction::AliReconstruction(const AliReconstruction& rec) :
   fRunInfo(NULL),
   fEventInfo(),
   fRunScalers(NULL),
+  fCTPTimeParams(NULL),
+  fCTPTimeAlign(NULL),
 
   fRunLoader(NULL),
   fRawReader(NULL),
@@ -374,12 +397,19 @@ AliReconstruction::AliReconstruction(const AliReconstruction& rec) :
   fhltesd(NULL),
   fesdf(NULL),
   ffile(NULL),
+  ffileF(NULL),
   ftree(NULL),
+  ftreeF(NULL),
   fhlttree(NULL),
   ftVertexer(NULL),
   fIsNewRunLoader(rec.fIsNewRunLoader),
   fRunAliEVE(kFALSE),
-  fChain(NULL)
+  fChain(NULL),
+  fNall(0),
+  fNspecie(0),
+  fSspecie(0),
+  fNhighPt(0),
+  fShighPt(0)
 {
 // copy constructor
 
@@ -400,6 +430,9 @@ AliReconstruction::AliReconstruction(const AliReconstruction& rec) :
   for (Int_t i = 0; i < rec.fSpecCDBUri.GetEntriesFast(); i++) {
     if (rec.fSpecCDBUri[i]) fSpecCDBUri.Add(rec.fSpecCDBUri[i]->Clone());
   }
+
+  for (int i=2;i--;) for (int j=2;j--;) fBeamInt[i][j] = rec.fBeamInt[i][j];
+
 }
 
 //_____________________________________________________________________________
@@ -420,6 +453,7 @@ AliReconstruction& AliReconstruction::operator = (const AliReconstruction& rec)
   fRunMuonTracking       = rec.fRunMuonTracking;
   fRunV0Finder           = rec.fRunV0Finder;
   fRunCascadeFinder      = rec.fRunCascadeFinder;
+  fRunMultFinder         = rec.fRunMultFinder;
   fStopOnError           = rec.fStopOnError;
   fWriteAlignmentData    = rec.fWriteAlignmentData;
   fWriteESDfriend        = rec.fWriteESDfriend;
@@ -447,6 +481,7 @@ AliReconstruction& AliReconstruction::operator = (const AliReconstruction& rec)
   fFirstEvent                    = rec.fFirstEvent;
   fLastEvent                     = rec.fLastEvent;
   fNumberOfEventsPerFile         = rec.fNumberOfEventsPerFile;
+  fFractionFriends               = rec.fFractionFriends;
 
   for (Int_t i = 0; i < rec.fOptions.GetEntriesFast(); i++) {
     if (rec.fOptions[i]) fOptions.Add(rec.fOptions[i]->Clone());
@@ -464,7 +499,11 @@ AliReconstruction& AliReconstruction::operator = (const AliReconstruction& rec)
   delete fRunScalers; fRunScalers = NULL;
   if (rec.fRunScalers) fRunScalers = new AliTriggerRunScalers(*rec.fRunScalers); 
 
-  
+  delete fCTPTimeParams; fCTPTimeParams = NULL;
+  if (rec.fCTPTimeParams) fCTPTimeParams = new AliCTPTimeParams(*rec.fCTPTimeParams);
+  delete fCTPTimeAlign; fCTPTimeAlign = NULL;
+  if (rec.fCTPTimeAlign) fCTPTimeAlign = new AliCTPTimeParams(*rec.fCTPTimeAlign);
+
   fRunLoader       = NULL;
   fRawReader       = NULL;
   fParentRawReader = NULL;
@@ -513,17 +552,24 @@ AliReconstruction& AliReconstruction::operator = (const AliReconstruction& rec)
   fInitQACalled                = rec.fInitQACalled;
   fWriteQAExpertData           = rec.fWriteQAExpertData;
   fRunPlaneEff                 = rec.fRunPlaneEff;
-
+  for (int i=2;i--;) for (int j=2;j--;) fBeamInt[i][j] = rec.fBeamInt[i][j];
   fesd     = NULL;
   fhltesd  = NULL;
   fesdf    = NULL;
   ffile    = NULL;
+  ffileF   = NULL;
   ftree    = NULL;
+  ftreeF   = NULL;
   fhlttree = NULL;
   ftVertexer = NULL;
   fIsNewRunLoader = rec.fIsNewRunLoader;
   fRunAliEVE = kFALSE;
   fChain = NULL;
+  fNall = 0;
+  fNspecie = 0;
+  fSspecie = 0;
+  fNhighPt = 0;
+  fShighPt = 0;
 
   return *this;
 }
@@ -540,6 +586,8 @@ AliReconstruction::~AliReconstruction()
   }
   delete fGRPData;
   delete fRunScalers;
+  delete fCTPTimeParams;
+  delete fCTPTimeAlign;
   fOptions.Delete();
   if (fAlignObjArray) {
     fAlignObjArray->Delete();
@@ -554,7 +602,7 @@ AliReconstruction::~AliReconstruction()
 void AliReconstruction::InitQA()
 {
   //Initialize the QA and start of cycle 
-  AliCodeTimerAuto("");
+  AliCodeTimerAuto("",0);
   
   if (fInitQACalled) return;
   fInitQACalled = kTRUE;
@@ -591,7 +639,7 @@ void AliReconstruction::InitQA()
     qam->SetCycleLength(AliQAv1::DETECTORINDEX_t(det), fQACycles[det]) ;  
     qam->SetWriteExpert(AliQAv1::DETECTORINDEX_t(det)) ;
   }
-  if (!fRawReader && !fInput && fQATasks.Contains(AliQAv1::kRAWS))
+  if (!fRawReader && !fInput && IsInTasks(AliQAv1::kRAWS))
     fQATasks.ReplaceAll(Form("%d",AliQAv1::kRAWS), "") ;
   qam->SetTasks(fQATasks) ; 
   qam->InitQADataMaker(AliCDBManager::Instance()->GetRun()) ; 
@@ -600,13 +648,13 @@ void AliReconstruction::InitQA()
     Bool_t sameCycle = kFALSE ;
     AliQADataMaker *qadm = qam->GetQADataMaker(AliQAv1::kGLOBAL);
     AliInfo(Form("Initializing the global QA data maker"));
-    if (fQATasks.Contains(Form("%d", AliQAv1::kRECPOINTS))) {
+    if (IsInTasks(AliQAv1::kRECPOINTS)) {
       qadm->StartOfCycle(AliQAv1::kRECPOINTS, AliCDBManager::Instance()->GetRun(), sameCycle) ; 
       TObjArray **arr=qadm->Init(AliQAv1::kRECPOINTS);
       AliTracker::SetResidualsArray(arr);
       sameCycle = kTRUE ; 
     }
-    if (fQATasks.Contains(Form("%d", AliQAv1::kESDS))) {
+    if (IsInTasks(AliQAv1::kESDS)) {
       qadm->StartOfCycle(AliQAv1::kESDS, AliCDBManager::Instance()->GetRun(), sameCycle) ; 
       qadm->Init(AliQAv1::kESDS);
     }
@@ -618,7 +666,7 @@ void AliReconstruction::InitQA()
 void AliReconstruction::MergeQA(const char *fileName)
 {
   //Initialize the QA and start of cycle 
-  AliCodeTimerAuto("") ;
+  AliCodeTimerAuto("",0) ;
   AliQAManager::QAManager()->Merge(AliCDBManager::Instance()->GetRun(),fileName) ; 
   AliSysInfo::AddStamp("MergeQA") ; 
 }
@@ -629,7 +677,7 @@ void AliReconstruction::InitCDB()
 // activate a default CDB storage
 // First check if we have any CDB storage set, because it is used 
 // to retrieve the calibration and alignment constants
-  AliCodeTimerAuto("");
+  AliCodeTimerAuto("",0);
 
   if (fInitCDBCalled) return;
   fInitCDBCalled = kTRUE;
@@ -649,15 +697,21 @@ void AliReconstruction::InitCDB()
        AliDebug(2,"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
        AliDebug(2, Form("Default CDB storage is set to: %s", fCDBUri.Data()));
        AliDebug(2, "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
-    } else {
-       fCDBUri="local://$ALICE_ROOT/OCDB";
+       man->SetDefaultStorage(fCDBUri);
+    } 
+    else if (!man->GetRaw()){
+       fCDBUri="local://$ALICE_ROOT/OCDB";
        AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
        AliWarning("Default CDB storage not yet set !!!!");
        AliWarning(Form("Setting it now to: %s", fCDBUri.Data()));
        AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
-               
+       man->SetDefaultStorage(fCDBUri);
+    }
+    else {    
+       AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
+       AliWarning("Default storage will be set after setting the Run Number!!!");
+       AliWarning("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");                    
     }
-    man->SetDefaultStorage(fCDBUri);
   }
 
   // Now activate the detector specific CDB storage locations
@@ -920,90 +974,6 @@ void AliReconstruction::SetRecoParam(const char* detector, AliDetectorRecoParam
 }
 
 //_____________________________________________________________________________
-Bool_t AliReconstruction::SetFieldMap(Float_t l3Cur, Float_t diCur, Float_t l3Pol, 
-                                 Float_t diPol, Int_t convention, Bool_t uniform,
-                                 Float_t beamenergy, const Char_t *beamtype, const Char_t *path) 
-{
-  //------------------------------------------------
-  // The magnetic field map, defined externally...
-  // L3 current 30000 A  -> 0.5 T
-  // L3 current 12000 A  -> 0.2 T
-  // dipole current 6000 A
-  // The polarities must match the convention (LHC or DCS2008) 
-  // unless the special uniform map was used for MC
-  //------------------------------------------------
-  const Float_t l3NominalCurrent1=30000.; // (A)
-  const Float_t l3NominalCurrent2=12000.; // (A)
-  const Float_t diNominalCurrent =6000. ; // (A)
-
-  const Float_t tolerance=0.03; // relative current tolerance
-  const Float_t zero=77.;       // "zero" current (A)
-  //
-  AliMagF::BMap_t map;
-  double sclL3,sclDip;
-  //
-  l3Cur = TMath::Abs(l3Cur);
-  diCur = TMath::Abs(diCur);
-  //
-  if (TMath::Abs((sclDip=diCur/diNominalCurrent)-1.) > tolerance && !uniform) {
-    if (diCur <= zero) sclDip = 0.; // some small current.. -> Dipole OFF
-    else {
-      AliError(Form("Wrong dipole current (%f A)!",diCur));
-      return kFALSE;
-    }
-  }
-  //
-  if (uniform) { 
-    // special treatment of special MC with uniform mag field (normalized to 0.5 T)
-    // no check for scaling/polarities are done
-    map   = AliMagF::k5kGUniform;
-    sclL3 = l3Cur/l3NominalCurrent1; 
-  }
-  else {
-    if      (TMath::Abs((sclL3=l3Cur/l3NominalCurrent1)-1.) < tolerance) map  = AliMagF::k5kG;
-    else if (TMath::Abs((sclL3=l3Cur/l3NominalCurrent2)-1.) < tolerance) map  = AliMagF::k2kG;
-    else if (l3Cur <= zero)                                { sclL3 = 0;  map  = AliMagF::k5kGUniform;}
-    else {
-      AliError(Form("Wrong L3 current (%f A)!",l3Cur));
-      return kFALSE;
-    }
-  }
-  //
-  if (sclDip!=0 && (map==AliMagF::k5kG || map==AliMagF::k2kG) &&
-      ((convention==AliMagF::kConvLHC     && l3Pol!=diPol) ||
-       (convention==AliMagF::kConvDCS2008 && l3Pol==diPol)) ) { 
-    AliError(Form("Wrong combination for L3/Dipole polarities (%c/%c) in %s convention",
-                 l3Pol>0?'+':'-',diPol>0?'+':'-',convention==AliMagF::kConvDCS2008?"DCS2008":"LHC"));
-    return kFALSE;
-  }
-  //
-  if (l3Pol<0) sclL3  = -sclL3;
-  if (diPol<0) sclDip = -sclDip;
-  //
-  AliMagF::BeamType_t btype = AliMagF::kNoBeamField;
-  TString btypestr = beamtype;
-  btypestr.ToLower();
-  TPRegexp protonBeam("(proton|p)\\s*-?\\s*\\1");
-  TPRegexp ionBeam("(lead|pb|ion|a)\\s*-?\\s*\\1");
-  if (btypestr.Contains(ionBeam)) btype = AliMagF::kBeamTypeAA;
-  else if (btypestr.Contains(protonBeam)) btype = AliMagF::kBeamTypepp;
-  else AliInfo(Form("Assume no LHC magnet field for the beam type %s, ",beamtype));
-  //
-  char ttl[80];
-  sprintf(ttl,"L3: %+5d Dip: %+4d kA; %s | Polarities in %s convention",(int)TMath::Sign(l3Cur,float(sclL3)),
-         (int)TMath::Sign(diCur,float(sclDip)),uniform ? " Constant":"",
-         convention==AliMagF::kConvLHC ? "LHC":"DCS2008");
-  // LHC and DCS08 conventions have opposite dipole polarities
-  if ( AliMagF::GetPolarityConvention() != convention) sclDip = -sclDip;
-  //
-  AliMagF* fld = new AliMagF("MagneticFieldMap", ttl, 2, sclL3, sclDip, 10., map, path, 
-                            btype,beamenergy);
-  TGeoGlobalMagField::Instance()->SetField( fld );
-  TGeoGlobalMagField::Instance()->Lock();
-  //
-  return kTRUE;
-}
-
 Bool_t AliReconstruction::InitGRP() {
   //------------------------------------
   // Initialization of the GRP entry 
@@ -1056,8 +1026,6 @@ Bool_t AliReconstruction::InitGRP() {
     AliError("GRP/GRP/Data entry:  missing value for the beam energy ! Using 0");
     beamEnergy = 0;
   }
-  // LHC: "multiply by 120 to get the energy in MeV"
-  beamEnergy *= 0.120;
 
   TString runType = fGRPData->GetRunType();
   if (runType==AliGRPObject::GetInvalidString()) {
@@ -1088,10 +1056,13 @@ Bool_t AliReconstruction::InitGRP() {
                  fFillESD.Data(),
                  fQADetectors.Data());
     fLoadCDB = MatchDetectorList(fLoadCDB,detMask);
-    if (!((detMask >> AliDAQ::DetectorID("ITSSPD")) & 0x1)) {
+    if (!((detMask >> AliDAQ::DetectorID("ITSSPD")) & 0x1) &&
+       !((detMask >> AliDAQ::DetectorID("ITSSDD")) & 0x1) &&
+       !((detMask >> AliDAQ::DetectorID("ITSSSD")) & 0x1) ) {
       // switch off the vertexer
-      AliInfo("SPD is not in the list of active detectors. Vertexer switched off.");
+      AliInfo("SPD,SDD,SSD is not in the list of active detectors. Vertexer and Trackleter are switched off.");
       fRunVertexFinder = kFALSE;
+      fRunMultFinder = kFALSE;
     }
     if (!((detMask >> AliDAQ::DetectorID("TRG")) & 0x1)) {
       // switch off the reading of CTP raw-data payload
@@ -1155,10 +1126,15 @@ Bool_t AliReconstruction::InitGRP() {
     Bool_t uniformB = fGRPData->IsUniformBMap();
 
     if (ok) { 
-      if ( !SetFieldMap(l3Current, diCurrent, l3Polarity ? -1:1, diPolarity ? -1:1, 
-                       polConvention,uniformB,beamEnergy, beamType.Data()))
-       AliFatal("Failed to creat a B field map ! Exiting...");
-      AliInfo("Running with the B field constructed out of GRP !");
+      AliMagF* fld = AliMagF::CreateFieldMap(TMath::Abs(l3Current) * (l3Polarity ? -1:1), 
+                                            TMath::Abs(diCurrent) * (diPolarity ? -1:1), 
+                                            polConvention,uniformB,beamEnergy, beamType.Data());
+      if (fld) {
+       TGeoGlobalMagField::Instance()->SetField( fld );
+       TGeoGlobalMagField::Instance()->Lock();
+       AliInfo("Running with the B field constructed out of GRP !");
+      }
+      else AliFatal("Failed to create a B field map !");
     }
     else AliFatal("B field is neither set nor constructed from GRP ! Exitig...");
   }
@@ -1202,21 +1178,37 @@ Bool_t AliReconstruction::InitGRP() {
 //_____________________________________________________________________________
 Bool_t AliReconstruction::LoadCDB()
 {
-  AliCodeTimerAuto("");
+  // Load CDB entries for all active detectors.
+  // By default we load all the entries in <det>/Calib
+  // folder.
+
+  AliCodeTimerAuto("",0);
 
   AliCDBManager::Instance()->Get("GRP/CTP/Config");
 
+  AliCDBManager::Instance()->Get("GRP/Calib/LHCClockPhase");
+
   TString detStr = fLoadCDB;
   for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
     if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
     AliCDBManager::Instance()->GetAll(Form("%s/Calib/*",fgkDetectorName[iDet]));
   }
+
+  // Temporary fix - one has to define the correct policy in order
+  // to load the trigger OCDB entries only for the detectors that
+  // in the trigger or that are needed in order to put correct
+  // information in ESD
+  AliCDBManager::Instance()->GetAll("TRIGGER/*/*");
+
   return kTRUE;
 }
 //_____________________________________________________________________________
 Bool_t AliReconstruction::LoadTriggerScalersCDB()
 {
-  AliCodeTimerAuto("");
+  // Load CTP scalers from OCDB.
+  // The scalers are checked for consistency.
+
+  AliCodeTimerAuto("",0);
 
   AliCDBEntry* entry = AliCDBManager::Instance()->Get("GRP/CTP/Scalers");
 
@@ -1225,16 +1217,61 @@ Bool_t AliReconstruction::LoadTriggerScalersCDB()
        AliInfo("Found an AliTriggerRunScalers in GRP/CTP/Scalers, reading it");
        fRunScalers = dynamic_cast<AliTriggerRunScalers*> (entry->GetObject());
        entry->SetOwner(0);
-       if (fRunScalers->CorrectScalersOverflow() == 0) AliInfo("32bit Trigger counters corrected for overflow");
+       if (fRunScalers && (fRunScalers->CorrectScalersOverflow() == 0)) AliInfo("32bit Trigger counters corrected for overflow");
 
   }
   return kTRUE;
 }
+//_____________________________________________________________________________
+Bool_t AliReconstruction::LoadCTPTimeParamsCDB()
+{
+  // Load CTP timing information (alignment)
+  // from OCDB.
+
+  AliCDBEntry* entry = AliCDBManager::Instance()->Get("GRP/CTP/CTPtiming");
+  if (!entry) return kFALSE;
+
+  AliInfo("Found an AliCTPTimeParams in GRP/CTP/CTPtiming, reading it");
+  fCTPTimeParams = dynamic_cast<AliCTPTimeParams*> (entry->GetObject());
+  entry->SetOwner(0);
+
+  AliCDBEntry* entry2 = AliCDBManager::Instance()->Get("GRP/CTP/TimeAlign");
+  if (!entry2) return kFALSE;
+
+  AliInfo("Found an AliCTPTimeParams in GRP/CTP/TimeAlign, reading it");
+  fCTPTimeAlign = dynamic_cast<AliCTPTimeParams*> (entry2->GetObject());
+  entry2->SetOwner(0);
+
+  return kTRUE;
+}
+
+//_____________________________________________________________________________
+Bool_t AliReconstruction::ReadIntensityInfoCDB()
+{
+  // Load LHC DIP data
+  AliCDBEntry* entry = AliCDBManager::Instance()->Get("GRP/GRP/LHCData");
+
+  if (entry) { 
+    AliInfo("Found an AliLHCData in GRP/GRP/LHCData, reading it");
+    AliLHCData* dipData = dynamic_cast<AliLHCData*> (entry->GetObject());
+    for (int ib=2;ib--;) {
+      double intI,intNI;
+      if (dipData && (dipData->GetMeanIntensity(ib,intI,intNI)>=0)) {
+       fBeamInt[ib][0] = intI;
+       fBeamInt[ib][1] = intNI;        
+      }
+    }
+    return kTRUE;
+  }
+  return kFALSE;
+}
+
+
 //_____________________________________________________________________________
 Bool_t AliReconstruction::Run(const char* input)
 {
   // Run Run Run
-  AliCodeTimerAuto("");
+  AliCodeTimerAuto("",0);
 
   InitRun(input);
   if (GetAbort() != TSelector::kContinue) return kFALSE;
@@ -1244,6 +1281,8 @@ Bool_t AliReconstruction::Run(const char* input)
     Long64_t nEntries = (fLastEvent < 0) ? (TChain::kBigNumber) : (fLastEvent - fFirstEvent + 1);
     // Proof mode
     if (gProof) {
+      // Temporary fix for long raw-data runs (until socket timeout handling in PROOF is revised)
+      gProof->Exec("gEnv->SetValue(\"Proof.SocketActivityTimeout\",-1)", kTRUE);
 
       if (gGrid)
        gProof->Exec("TGrid::Connect(\"alien://\")",kTRUE);
@@ -1291,14 +1330,21 @@ Bool_t AliReconstruction::Run(const char* input)
 //_____________________________________________________________________________
 void AliReconstruction::InitRawReader(const char* input)
 {
-  AliCodeTimerAuto("");
-
   // Init raw-reader and
   // set the input in case of raw data
+
+  AliCodeTimerAuto("",0);
+
   if (input) fRawInput = input;
   fRawReader = AliRawReader::Create(fRawInput.Data());
-  if (!fRawReader)
-    AliInfo("Reconstruction will run over digits");
+  if (!fRawReader) {
+    if (fRawInput.IsNull()) {
+      AliInfo("Reconstruction will run over digits");
+    }
+    else {
+      AliFatal("Can not create raw-data reader ! Exiting..."); 
+    }
+  }
 
   if (!fEquipIdMap.IsNull() && fRawReader)
     fRawReader->LoadEquipmentIdsMap(fEquipIdMap);
@@ -1322,7 +1368,7 @@ void AliReconstruction::InitRun(const char* input)
 {
   // Initialization of raw-reader,
   // run number, CDB etc.
-  AliCodeTimerAuto("");
+  AliCodeTimerAuto("",0);
   AliSysInfo::AddStamp("Start");
 
   // Initialize raw-reader if any
@@ -1350,7 +1396,7 @@ void AliReconstruction::Begin(TTree *)
   // going into the event loop
   // Should follow the TSelector convention
   // i.e. initialize only the object on the client side
-  AliCodeTimerAuto("");
+  AliCodeTimerAuto("",0);
 
   AliReconstruction *reco = NULL;
   if (fInput) {
@@ -1403,6 +1449,17 @@ void AliReconstruction::Begin(TTree *)
   }
   AliSysInfo::AddStamp("LoadTriggerScalersCDB");
 
+  if (!LoadCTPTimeParamsCDB()) {
+    Abort("LoadCTPTimeParamsCDB", TSelector::kAbortProcess);
+    return;
+  }
+  AliSysInfo::AddStamp("LoadCTPTimeParamsCDB");
+
+  if (!ReadIntensityInfoCDB()) {
+    Abort("ReadIntensityInfoCDB", TSelector::kAbortProcess);
+    return;
+  }
+  AliSysInfo::AddStamp("ReadIntensityInfoCDB");
 
   // Read the reconstruction parameters from OCDB
   if (!InitRecoParams()) {
@@ -1431,11 +1488,12 @@ void AliReconstruction::SlaveBegin(TTree*)
   // Initialization related to run-loader,
   // vertexer, trackers, recontructors
   // In proof mode it is executed on the slave
-  AliCodeTimerAuto("");
+  AliCodeTimerAuto("",0);
 
   TProofOutputFile *outProofFile = NULL;
   if (fInput) {
     if (AliDebugLevel() > 0) fInput->Print();
+    if (AliDebugLevel() > 10) fInput->Dump();
     if (AliReconstruction *reco = (AliReconstruction*)fInput->FindObject("AliReconstruction")) {
       *this = *reco;
     }
@@ -1453,7 +1511,13 @@ void AliReconstruction::SlaveBegin(TTree*)
       }
     }
     if (AliMagF *map = (AliMagF*)fInput->FindObject("MagneticFieldMap")) {
-      TGeoGlobalMagField::Instance()->SetField(map);
+      AliMagF *newMap = new AliMagF(*map);
+      if (!newMap->LoadParameterization()) {
+       Abort("AliMagF::LoadParameterization", TSelector::kAbortProcess);
+       return;
+      }
+      TGeoGlobalMagField::Instance()->SetField(newMap);
+      TGeoGlobalMagField::Instance()->Lock();
     }
     if (TNamed *outputFileName = (TNamed*)fInput->FindObject("PROOF_OUTPUTFILE"))
       fProofOutputFileName = outputFileName->GetTitle();
@@ -1518,29 +1582,24 @@ void AliReconstruction::SlaveBegin(TTree*)
   ftree = new TTree("esdTree", "Tree with ESD objects");
   fesd = new AliESDEvent();
   fesd->CreateStdContent();
+  // add a so far non-std object to the ESD, this will
+  // become part of the std content
+  fesd->AddObject(new AliESDHLTDecision);
 
   fesd->WriteToTree(ftree);
   if (fWriteESDfriend) {
-    // careful:
-    // Since we add the branch manually we must 
-    // book and add it after WriteToTree
-    // otherwise it is created twice,
-    // once via writetotree and once here.
-    // The case for AliESDfriend is now 
-    // caught also in AlIESDEvent::WriteToTree but 
-    // be careful when changing the name (AliESDfriend is not 
-    // a TNamed so we had to hardwire it)
-    fesdf = new AliESDfriend();
-    TBranch *br=ftree->Branch("ESDfriend.","AliESDfriend", &fesdf);
-    br->SetFile("AliESDfriends.root");
+    ffileF = TFile::Open("AliESDfriends.root", "RECREATE");
+    ftreeF = new TTree("esdFriendTree", "Tree with ESD Friend objects");
+    fesdf  = new AliESDfriend();
+    ftreeF->Branch("ESDfriend.","AliESDfriend", &fesdf);
     fesd->AddObject(fesdf);
+    ffile->cd();
   }
   ftree->GetUserInfo()->Add(fesd);
 
   fhlttree = new TTree("HLTesdTree", "Tree with HLT ESD objects");
   fhltesd = new AliESDEvent();
   fhltesd->CreateStdContent();
-
   // read the ESD template from CDB
   // HLT is allowed to put non-std content to its ESD, the non-std
   // objects need to be created before invocation of WriteToTree in
@@ -1570,7 +1629,7 @@ void AliReconstruction::SlaveBegin(TTree*)
 
   ProcInfo_t procInfo;
   gSystem->GetProcInfo(&procInfo);
-  AliInfo(Form("Current memory usage %d %d", procInfo.fMemResident, procInfo.fMemVirtual));
+  AliInfo(Form("Current memory usage %ld %ld", procInfo.fMemResident, procInfo.fMemVirtual));
   
   //QA
   //Initialize the QA and start of cycle 
@@ -1594,7 +1653,7 @@ Bool_t AliReconstruction::Process(Long64_t entry)
 {
   // run the reconstruction over a single entry
   // from the chain with raw data
-  AliCodeTimerAuto("");
+  AliCodeTimerAuto("",0);
 
   TTree *currTree = fChain->GetTree();
   AliRawVEvent *event = NULL;
@@ -1612,6 +1671,8 @@ Bool_t AliReconstruction::Process(Long64_t entry)
 //_____________________________________________________________________________
 void AliReconstruction::Init(TTree *tree)
 {
+  // Implementation of TSelector::Init()
+  // method
   if (tree == 0) {
     AliError("The input tree is not found!");
     return;
@@ -1625,12 +1686,23 @@ Bool_t AliReconstruction::ProcessEvent(Int_t iEvent)
   // run the reconstruction over a single event
   // The event loop is steered in Run method
 
-  AliCodeTimerAuto("");
+
+  static Long_t oldMres=0;
+  static Long_t oldMvir=0;
+  static Float_t oldCPU=0;
+  static Long_t aveDMres=0;
+  static Long_t aveDMvir=0;
+  static Float_t aveDCPU=0;
+
+  AliCodeTimerAuto("",0);
+
+  AliESDpid pid;
 
   if (iEvent >= fRunLoader->GetNumberOfEvents()) {
     fRunLoader->SetEventNumber(iEvent);
-    fRunLoader->GetHeader()->Reset(fRawReader->GetRunNumber(), 
-                                  iEvent, iEvent);
+    if (fRawReader)
+      fRunLoader->GetHeader()->Reset(fRawReader->GetRunNumber(), 
+                                    iEvent, iEvent);
     fRunLoader->TreeE()->Fill();
     if (fRawReader && fRawReader->UseAutoSaveESD())
       fRunLoader->TreeE()->AutoSave("SaveSelf");
@@ -1640,14 +1712,21 @@ Bool_t AliReconstruction::ProcessEvent(Int_t iEvent)
     return kTRUE;
   }
 
-  AliInfo(Form("processing event %d", iEvent));
 
   fRunLoader->GetEvent(iEvent);
 
   // Fill Event-info object
   GetEventInfo();
   fRecoParam.SetEventSpecie(fRunInfo,fEventInfo,fListOfCosmicTriggers);
-  AliInfo(Form("Current event specie: %s",fRecoParam.PrintEventSpecie()));
+  
+  ProcInfo_t procInfo;
+  if(iEvent==fFirstEvent) {
+    gSystem->GetProcInfo(&procInfo);
+    oldMres=procInfo.fMemResident;
+    oldMvir=procInfo.fMemVirtual;
+    oldCPU=procInfo.fCpuUser+procInfo.fCpuSys;
+  }
+  AliInfo(Form("================================= Processing event %d of type %-10s ==================================", iEvent,fRecoParam.PrintEventSpecie()));
 
   // Set the reco-params
   {
@@ -1658,17 +1737,23 @@ Bool_t AliReconstruction::ProcessEvent(Int_t iEvent)
       if (reconstructor && fRecoParam.GetDetRecoParamArray(iDet)) {
         const AliDetectorRecoParam *par = fRecoParam.GetDetRecoParam(iDet);
         reconstructor->SetRecoParam(par);
+       reconstructor->GetPidSettings(&pid);
        reconstructor->SetEventInfo(&fEventInfo);
         if (fRunQA) {
           AliQAManager::QAManager()->SetRecoParam(iDet, par) ; 
-          AliQAManager::QAManager()->SetEventSpecie(AliRecoParam::Convert(par->GetEventSpecie())) ;
+          if (par) AliQAManager::QAManager()->SetEventSpecie(AliRecoParam::Convert(par->GetEventSpecie())) ;
         }
       }
     }
+    if (fRunQA) {
+      const AliDetectorRecoParam *grppar = fRecoParam.GetDetRecoParam(kNDetectors);
+      AliQAManager::QAManager()->SetRecoParam(AliQAv1::kGLOBAL, grppar) ; 
+      AliQAManager::QAManager()->SetEventSpecie(AliRecoParam::Convert(grppar->GetEventSpecie())) ;
+    }
   }
 
     // QA on single raw 
-  if (fRunQA) {
+  if (fRunQA && IsInTasks(AliQAv1::kRAWS)) {
     AliQAManager::QAManager()->SetEventSpecie(fRecoParam.GetEventSpecie()) ;
     AliQAManager::QAManager()->RunOneEvent(fRawReader) ;  
   }
@@ -1684,19 +1769,64 @@ Bool_t AliReconstruction::ProcessEvent(Int_t iEvent)
       detectors=fRunLocalReconstruction;
       detectors.ReplaceAll("HLT", "");
       if (!RunLocalEventReconstruction(detectors)) {
-       if (fStopOnError) {CleanUp(); return kFALSE;}
+        if (fStopOnError) {
+          CleanUp(); 
+          return kFALSE;
+        }
       }
     }
 
+  
+    // fill Event header information from the RawEventHeader
+    if (fRawReader){FillRawEventHeaderESD(fesd);}
+    if (fRawReader){FillRawEventHeaderESD(fhltesd);}
+
     fesd->SetRunNumber(fRunLoader->GetHeader()->GetRun());
     fhltesd->SetRunNumber(fRunLoader->GetHeader()->GetRun());
+    
+    ((AliESDRun*)fesd->GetESDRun())->SetDetectorsInDAQ(fRunInfo->GetDetectorMask());
+    ((AliESDRun*)fhltesd->GetESDRun())->SetDetectorsInDAQ(fRunInfo->GetDetectorMask());
+    ((AliESDRun*)fesd->GetESDRun())->SetDetectorsInReco(AliDAQ::DetectorPatternOffline(fFillESD.Data()));
+    ((AliESDRun*)fhltesd->GetESDRun())->SetDetectorsInReco(AliDAQ::DetectorPatternOffline(fFillESD.Data()));
+
     fesd->SetEventNumberInFile(fRunLoader->GetHeader()->GetEventNrInRun());
     fhltesd->SetEventNumberInFile(fRunLoader->GetHeader()->GetEventNrInRun());
+
+    fesd->SetEventSpecie(fRecoParam.GetEventSpecie());
+    fhltesd->SetEventSpecie(fRecoParam.GetEventSpecie());
     
     // Set magnetic field from the tracker
     fesd->SetMagneticField(AliTracker::GetBz());
     fhltesd->SetMagneticField(AliTracker::GetBz());
-
+    //
+    AliESDRun *esdRun,*esdRunH;
+    esdRun  = (AliESDRun*)fesd->GetESDRun();
+    esdRunH = (AliESDRun*)fhltesd->GetESDRun();
+    esdRun->SetBeamEnergyIsSqrtSHalfGeV();
+    esdRunH->SetBeamEnergyIsSqrtSHalfGeV();
+    //
+    for (int ib=2;ib--;) for (int it=2;it--;) {
+       esdRun->SetMeanIntensity(ib,it, fBeamInt[ib][it]); 
+       esdRunH->SetMeanIntensity(ib,it, fBeamInt[ib][it]); 
+      }
+    //
+    AliMagF* fld = (AliMagF*)TGeoGlobalMagField::Instance()->GetField();
+    if (fld) { // set info needed for field initialization
+      fesd->SetCurrentL3(fld->GetCurrentSol());
+      fesd->SetCurrentDip(fld->GetCurrentDip());
+      fesd->SetBeamEnergy(fld->GetBeamEnergy());
+      fesd->SetBeamType(fld->GetBeamTypeText());
+      fesd->SetUniformBMap(fld->IsUniform());
+      fesd->SetBInfoStored();
+      //
+      fhltesd->SetCurrentL3(fld->GetCurrentSol());
+      fhltesd->SetCurrentDip(fld->GetCurrentDip());
+      fhltesd->SetBeamEnergy(fld->GetBeamEnergy());
+      fhltesd->SetBeamType(fld->GetBeamTypeText());
+      fhltesd->SetUniformBMap(fld->IsUniform());
+      fhltesd->SetBInfoStored();
+    }
+    //
     // Set most probable pt, for B=0 tracking
     // Get the global reco-params. They are atposition 16 inside the array of detectors in fRecoParam
     const AliGRPRecoParam *grpRecoParam = dynamic_cast<const AliGRPRecoParam*>(fRecoParam.GetDetRecoParam(kNDetectors));
@@ -1730,7 +1860,7 @@ Bool_t AliReconstruction::ProcessEvent(Int_t iEvent)
 
     // barrel tracking
     if (!fRunTracking.IsNull()) {
-      if (!RunTracking(fesd)) {
+      if (!RunTracking(fesd,pid)) {
        if (fStopOnError) {CleanUp(); return kFALSE;}
       }
     }
@@ -1758,13 +1888,13 @@ Bool_t AliReconstruction::ProcessEvent(Int_t iEvent)
        if (fStopOnError) {CleanUp(); return kFALSE;}
       }
     }
-  
-    // fill Event header information from the RawEventHeader
-    if (fRawReader){FillRawEventHeaderESD(fesd);}
-    if (fRawReader){FillRawEventHeaderESD(fhltesd);}
+
+    // AdC+FN
+    if (fReconstructor[3])
+      GetReconstructor(3)->FillEventTimeWithTOF(fesd,&pid);
 
     // combined PID
-    AliESDpid::MakePID(fesd);
+    pid.MakePID(fesd);
 
     if (fFillTriggerESD) {
       if (!FillTriggerESD(fesd)) {
@@ -1835,17 +1965,31 @@ Bool_t AliReconstruction::ProcessEvent(Int_t iEvent)
        ftVertexer->SetITSMode();
        ftVertexer->SetConstraintOff();
        // get cuts for vertexer from AliGRPRecoParam
+       Bool_t constrSPD=kFALSE;
        if (grpRecoParam) {
         Int_t nCutsVertexer = grpRecoParam->GetVertexerTracksNCuts();
         Double_t *cutsVertexer = new Double_t[nCutsVertexer];
         grpRecoParam->GetVertexerTracksCutsITS(cutsVertexer);
         ftVertexer->SetCuts(cutsVertexer);
         delete [] cutsVertexer; cutsVertexer = NULL; 
-        if(fDiamondProfile && grpRecoParam->GetVertexerTracksConstraintITS())
-          ftVertexer->SetVtxStart(fDiamondProfile);
+        if(grpRecoParam->GetVertexerTracksConstraintITS()) { 
+          if(fDiamondProfile && fDiamondProfile->GetXRes()<kRadius){
+            ftVertexer->SetVtxStart(fDiamondProfile); // apply constraint only if sigmax is smaller than the beam pipe radius 
+          }else{
+            if(fDiamondProfileSPD && fDiamondProfileSPD->GetXRes()<kRadius){
+              ftVertexer->SetVtxStart(fDiamondProfileSPD);
+              constrSPD=kTRUE;
+            }
+          }
+        } 
        }
        AliESDVertex *pvtx=ftVertexer->FindPrimaryVertex(fesd);
        if (pvtx) {
+        if(constrSPD){
+          TString title=pvtx->GetTitle();
+          title.Append("SPD");
+          pvtx->SetTitle(title);
+        }
           if (pvtx->GetStatus()) {
              fesd->SetPrimaryVertexTracks(pvtx);
              for (Int_t i=0; i<ntracks; i++) {
@@ -1855,6 +1999,7 @@ Bool_t AliReconstruction::ProcessEvent(Int_t iEvent)
                  t->RelateToVertexBxByBz(pvtx, b, kVeryBig);
              } 
           }
+         delete pvtx; pvtx=NULL;
        }
 
        // TPC-only primary vertex
@@ -1867,8 +2012,9 @@ Bool_t AliReconstruction::ProcessEvent(Int_t iEvent)
         grpRecoParam->GetVertexerTracksCutsTPC(cutsVertexer);
         ftVertexer->SetCuts(cutsVertexer);
         delete [] cutsVertexer; cutsVertexer = NULL; 
-        if(fDiamondProfileTPC && grpRecoParam->GetVertexerTracksConstraintTPC())
-          ftVertexer->SetVtxStart(fDiamondProfileTPC);
+        if(fDiamondProfileTPC && grpRecoParam->GetVertexerTracksConstraintTPC()) { 
+          if(fDiamondProfileTPC->GetXRes()<kRadius) ftVertexer->SetVtxStart(fDiamondProfileTPC); // apply constraint only if sigmax is smaller than the beam pipe radius 
+        } 
        }
        pvtx=ftVertexer->FindPrimaryVertex(&trkArray,selectedIdx);
        if (pvtx) {
@@ -1881,52 +2027,89 @@ Bool_t AliReconstruction::ProcessEvent(Int_t iEvent)
                  t->RelateToVertexTPCBxByBz(pvtx, b, kVeryBig);
              } 
           }
+         delete pvtx; pvtx=NULL;
        }
 
     }
     delete[] selectedIdx;
 
-    if(fDiamondProfile) fesd->SetDiamond(fDiamondProfile);
-    
+    if(fDiamondProfile && fDiamondProfile->GetXRes()<kRadius) fesd->SetDiamond(fDiamondProfile);
+    else fesd->SetDiamond(fDiamondProfileSPD);
 
     if (fRunV0Finder) {
        // V0 finding
        AliV0vertexer vtxer;
+       // get cuts for V0vertexer from AliGRPRecoParam
+       if (grpRecoParam) {
+        Int_t nCutsV0vertexer = grpRecoParam->GetVertexerV0NCuts();
+        Double_t *cutsV0vertexer = new Double_t[nCutsV0vertexer];
+        grpRecoParam->GetVertexerV0Cuts(cutsV0vertexer);
+        vtxer.SetCuts(cutsV0vertexer);
+        delete [] cutsV0vertexer; cutsV0vertexer = NULL; 
+       }
        vtxer.Tracks2V0vertices(fesd);
 
        if (fRunCascadeFinder) {
           // Cascade finding
           AliCascadeVertexer cvtxer;
+         // get cuts for CascadeVertexer from AliGRPRecoParam
+         if (grpRecoParam) {
+           Int_t nCutsCascadeVertexer = grpRecoParam->GetVertexerCascadeNCuts();
+           Double_t *cutsCascadeVertexer = new Double_t[nCutsCascadeVertexer];
+           grpRecoParam->GetVertexerCascadeCuts(cutsCascadeVertexer);
+           cvtxer.SetCuts(cutsCascadeVertexer);
+           delete [] cutsCascadeVertexer; cutsCascadeVertexer = NULL; 
+         }
           cvtxer.V0sTracks2CascadeVertices(fesd);
        }
     }
+
     // write ESD
     if (fCleanESD) CleanESD(fesd);
+    // 
+    // RS run updated trackleter: since we want to mark the clusters used by tracks and also mark the 
+    // tracks interpreted as primary, this step should be done in the very end, when full 
+    // ESD info is available (particulalry, V0s)
+    // vertex finder
+    if (fRunMultFinder) {
+      if (!RunMultFinder(fesd)) {
+       if (fStopOnError) {CleanUp(); return kFALSE;}
+      }
+    }
 
-  if (fRunQA) {
+  if (fRunQA && IsInTasks(AliQAv1::kESDS)) {
     AliQAManager::QAManager()->SetEventSpecie(fRecoParam.GetEventSpecie()) ;
-    AliQAManager::QAManager()->RunOneEvent(fesd) ; 
+    AliQAManager::QAManager()->RunOneEvent(fesd, fhltesd) ; 
   }
   if (fRunGlobalQA) {
     AliQADataMaker *qadm = AliQAManager::QAManager()->GetQADataMaker(AliQAv1::kGLOBAL);
+    if (qadm)
       qadm->SetEventSpecie(fRecoParam.GetEventSpecie()) ;
-    if (qadm && fQATasks.Contains(Form("%d", AliQAv1::kESDS)))
+    if (qadm && IsInTasks(AliQAv1::kESDS))
       qadm->Exec(AliQAv1::kESDS, fesd);
   }
 
-    if (fWriteESDfriend) {
-      //      fesdf->~AliESDfriend();
-      //  new (fesdf) AliESDfriend(); // Reset...
+  // copy HLT decision from HLTesd to esd
+  // the most relevant information is stored in a reduced container in the esd,
+  // while the full information can be found in the HLTesd
+  TObject* pHLTSrc=fhltesd->FindListObject(AliESDHLTDecision::Name());
+  TObject* pHLTTgt=fesd->FindListObject(AliESDHLTDecision::Name());
+  if (pHLTSrc && pHLTTgt) {
+    pHLTSrc->Copy(*pHLTTgt);
+  }
+
+    if (fWriteESDfriend) 
       fesd->GetESDfriend(fesdf);
-    }
+
     ftree->Fill();
+    if (fWriteESDfriend) {
+      WriteESDfriend();
+    }
 
     // Auto-save the ESD tree in case of prompt reco @P2
     if (fRawReader && fRawReader->UseAutoSaveESD()) {
       ftree->AutoSave("SaveSelf");
-      TFile *friendfile = (TFile *)(gROOT->GetListOfFiles()->FindObject("AliESDfriends.root"));
-      if (friendfile) friendfile->Save();
+      if (fWriteESDfriend) ftreeF->AutoSave("SaveSelf");
     }
 
     // write HLT ESD
@@ -1942,9 +2125,18 @@ Bool_t AliReconstruction::ProcessEvent(Int_t iEvent)
       new (fesdf) AliESDfriend(); // Reset...
     }
  
-    ProcInfo_t procInfo;
     gSystem->GetProcInfo(&procInfo);
-    AliInfo(Form("Event %d -> Current memory usage %d %d",iEvent, procInfo.fMemResident, procInfo.fMemVirtual));
+    Long_t dMres=(procInfo.fMemResident-oldMres)/1024;
+    Long_t dMvir=(procInfo.fMemVirtual-oldMvir)/1024;
+    Float_t dCPU=procInfo.fCpuUser+procInfo.fCpuSys-oldCPU;
+    aveDMres+=(dMres-aveDMres)/(iEvent-fFirstEvent+1);
+    aveDMvir+=(dMvir-aveDMvir)/(iEvent-fFirstEvent+1);
+    aveDCPU+=(dCPU-aveDCPU)/(iEvent-fFirstEvent+1);
+    AliInfo(Form("======================= End Event %d: Res %ld(%3ld <%3ld>) Vir %ld(%3ld <%3ld>) CPU %5.2f <%5.2f> ===================",
+                iEvent, procInfo.fMemResident/1024, dMres, aveDMres, procInfo.fMemVirtual/1024, dMvir, aveDMvir, dCPU, aveDCPU));
+    oldMres=procInfo.fMemResident;
+    oldMvir=procInfo.fMemVirtual;
+    oldCPU=procInfo.fCpuUser+procInfo.fCpuSys;
   
     fEventInfo.Reset();
     for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
@@ -1967,7 +2159,7 @@ void AliReconstruction::SlaveTerminate()
   // Finalize the run on the slave side
   // Called after the exit
   // from the event loop
-  AliCodeTimerAuto("");
+  AliCodeTimerAuto("",0);
 
   if (fIsNewRunLoader) { // galice.root didn't exist
     fRunLoader->WriteHeader("OVERWRITE");
@@ -1986,8 +2178,9 @@ void AliReconstruction::SlaveTerminate()
    TPair* pair = 0;     
    while((pair = dynamic_cast<TPair*> (iter.Next()))){  
          TObjString* keyStr = dynamic_cast<TObjString*> (pair->Key());  
-         TObjString* valStr = dynamic_cast<TObjString*> (pair->Value());        
-         cdbMapCopy->Add(new TObjString(keyStr->GetName()), new TObjString(valStr->GetName()));         
+         TObjString* valStr = dynamic_cast<TObjString*> (pair->Value());
+        if (keyStr && valStr)
+          cdbMapCopy->Add(new TObjString(keyStr->GetName()), new TObjString(valStr->GetName()));        
    }    
         
    TList *cdbListCopy = new TList();    
@@ -2007,33 +2200,24 @@ void AliReconstruction::SlaveTerminate()
 
   ffile->cd();
 
-  if (fWriteESDfriend)
-    ftree->SetBranchStatus("ESDfriend*",0);
   // we want to have only one tree version number
   ftree->Write(ftree->GetName(),TObject::kOverwrite);
   fhlttree->Write(fhlttree->GetName(),TObject::kOverwrite);
 
+  if (fWriteESDfriend) {
+    ffileF->cd();
+    ftreeF->Write(ftreeF->GetName(),TObject::kOverwrite);
+  }
+
 // Finish with Plane Efficiency evaluation: before of CleanUp !!!
   if (fRunPlaneEff && !FinishPlaneEff()) {
    AliWarning("Finish PlaneEff evaluation failed");
   }
 
   // End of cycle for the in-loop  
-  if (fRunQA) 
-    AliQAManager::QAManager()->EndOfCycle() ;
-  
-  if (fRunGlobalQA) {
-    AliQADataMaker *qadm = AliQAManager::QAManager()->GetQADataMaker(AliQAv1::kGLOBAL);
-    if (qadm) {
-      if (fQATasks.Contains(Form("%d", AliQAv1::kRECPOINTS))) 
-        qadm->EndOfCycle(AliQAv1::kRECPOINTS);
-      if (fQATasks.Contains(Form("%d", AliQAv1::kESDS))) 
-        qadm->EndOfCycle(AliQAv1::kESDS);
-      qadm->Finish();
-    }
-  }
 
   if (fRunQA || fRunGlobalQA) {
+    AliQAManager::QAManager()->EndOfCycle() ;
     if (fInput &&
        !fProofOutputLocation.IsNull() &&
        fProofOutputArchive.IsNull() &&
@@ -2068,8 +2252,14 @@ void AliReconstruction::SlaveTerminate()
       fOutput->Add(zipProofFile);
       TString fileList(fProofOutputArchive.Data());
       fileList.ReplaceAll(","," ");
-      AliInfo(Form("Executing: zip -n root %s %s",zipProofFile->GetFileName(),fileList.Data()));
-      gSystem->Exec(Form("zip -n root %s %s",zipProofFile->GetFileName(),fileList.Data()));
+      TString command;
+#if ROOT_SVN_REVISION >= 30174
+      command.Form("zip -n root %s/%s %s",zipProofFile->GetDir(kTRUE),zipProofFile->GetFileName(),fileList.Data());
+#else
+      command.Form("zip -n root %s/%s %s",zipProofFile->GetDir(),zipProofFile->GetFileName(),fileList.Data());
+#endif
+      AliInfo(Form("Executing: %s",command.Data()));
+      gSystem->Exec(command.Data());
     }
   }
 }
@@ -2079,12 +2269,13 @@ void AliReconstruction::Terminate()
 {
   // Create tags for the events in the ESD tree (the ESD tree is always present)
   // In case of empty events the tags will contain dummy values
-  AliCodeTimerAuto("");
+  AliCodeTimerAuto("",0);
 
   // Do not call the ESD tag creator in case of PROOF-based reconstruction
   if (!fInput) {
     AliESDTagCreator *esdtagCreator = new AliESDTagCreator();
     esdtagCreator->CreateESDTags(fFirstEvent,fLastEvent,fGRPData, AliQAv1::Instance()->GetQA(), AliQAv1::Instance()->GetEventSpecies(), AliQAv1::kNDET, AliRecoParam::kNSpecies);
+    delete esdtagCreator;
   }
 
   // Cleanup of CDB manager: cache and active storages!
@@ -2097,7 +2288,7 @@ Bool_t AliReconstruction::RunLocalEventReconstruction(const TString& detectors)
 // run the local reconstruction
 
   static Int_t eventNr=0;
-  AliCodeTimerAuto("")
+  AliCodeTimerAuto("",0)
 
   TString detStr = detectors;
   for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
@@ -2125,7 +2316,7 @@ Bool_t AliReconstruction::RunLocalEventReconstruction(const TString& detectors)
       AliInfo(Form("converting raw data digits into root objects for %s", 
                   fgkDetectorName[iDet]));
 //      AliCodeTimerAuto(Form("converting raw data digits into root objects for %s", 
-//                            fgkDetectorName[iDet]));
+//                            fgkDetectorName[iDet]),0);
       loader->LoadDigits("update");
       loader->CleanDigits();
       loader->MakeDigitsContainer();
@@ -2136,7 +2327,7 @@ Bool_t AliReconstruction::RunLocalEventReconstruction(const TString& detectors)
     }
     // local reconstruction
     AliInfo(Form("running reconstruction for %s", fgkDetectorName[iDet]));
-    //AliCodeTimerAuto(Form("running reconstruction for %s", fgkDetectorName[iDet]));
+    //AliCodeTimerAuto(Form("running reconstruction for %s", fgkDetectorName[iDet]),0);
     loader->LoadRecPoints("update");
     loader->CleanRecPoints();
     loader->MakeRecPointsContainer();
@@ -2148,17 +2339,18 @@ Bool_t AliReconstruction::RunLocalEventReconstruction(const TString& detectors)
       TTree* digitsTree = loader->TreeD();
       if (!digitsTree) {
         AliError(Form("Can't get the %s digits tree", fgkDetectorName[iDet]));
-        if (fStopOnError) return kFALSE;
+        if (fStopOnError) 
+          return kFALSE;
       } else {
         reconstructor->Reconstruct(digitsTree, clustersTree);
-        if (fRunQA) {
+        if (fRunQA && IsInTasks(AliQAv1::kDIGITSR)) {
           AliQAManager::QAManager()->SetEventSpecie(fRecoParam.GetEventSpecie()) ;
           AliQAManager::QAManager()->RunOneEventInOneDetector(iDet, digitsTree) ; 
         }
       }
       loader->UnloadDigits();
     }
-               if (fRunQA) {
+               if (fRunQA && IsInTasks(AliQAv1::kRECPOINTS)) {
       AliQAManager::QAManager()->SetEventSpecie(fRecoParam.GetEventSpecie()) ;
                        AliQAManager::QAManager()->RunOneEventInOneDetector(iDet, clustersTree) ; 
     }
@@ -2166,10 +2358,12 @@ Bool_t AliReconstruction::RunLocalEventReconstruction(const TString& detectors)
     loader->UnloadRecPoints();
     AliSysInfo::AddStamp(Form("LRec%s_%d",fgkDetectorName[iDet],eventNr), iDet,1,eventNr);
   }
+  if (!IsSelected("CTP", detStr)) AliDebug(10,"No CTP");
   if ((detStr.CompareTo("ALL") != 0) && !detStr.IsNull()) {
     AliError(Form("the following detectors were not found: %s",
                   detStr.Data()));
-    if (fStopOnError) return kFALSE;
+    if (fStopOnError) 
+      return kFALSE;
   }
   eventNr++;
   return kTRUE;
@@ -2179,7 +2373,7 @@ Bool_t AliReconstruction::RunSPDTrackleting(AliESDEvent*& esd)
 {
 // run the SPD trackleting (for SPD efficiency purpouses)
 
-  AliCodeTimerAuto("")
+  AliCodeTimerAuto("",0)
 
   Double_t vtxPos[3] = {0, 0, 0};
   Double_t vtxErr[3] = {0.0, 0.0, 0.0};
@@ -2212,7 +2406,7 @@ Bool_t AliReconstruction::RunSPDTrackleting(AliESDEvent*& esd)
     fSPDTrackleter->SetVertex(vtxPos, vtxErr);
     // run trackleting
     if (fSPDTrackleter->Clusters2Tracks(esd) != 0) {
-      AliError("AliITSTrackleterSPDEff Clusters2Tracks failed");
+      AliWarning("AliITSTrackleterSPDEff Clusters2Tracks failed");
      // fLoader[0]->UnloadRecPoints();
       return kFALSE;
     }
@@ -2229,12 +2423,12 @@ Bool_t AliReconstruction::RunVertexFinder(AliESDEvent*& esd)
 {
 // run the barrel tracking
 
-  AliCodeTimerAuto("")
+  AliCodeTimerAuto("",0)
 
   AliVertexer *vertexer = CreateVertexer();
   if (!vertexer) return kFALSE;
 
-  AliInfo("running the ITS vertex finder");
+  AliInfo(Form("running the ITS vertex finder: %s",vertexer->ClassName()));
   AliESDVertex* vertex = NULL;
   if (fLoader[0]) {
     fLoader[0]->LoadRecPoints();
@@ -2272,10 +2466,11 @@ Bool_t AliReconstruction::RunVertexFinder(AliESDEvent*& esd)
   if(novertices>1){
     for (Int_t kk=1; kk<novertices; kk++)esd->AddPileupVertexSPD(&vpileup[kk]);
   }
+  /*
   // if SPD multiplicity has been determined, it is stored in the ESD
   AliMultiplicity *mult = vertexer->GetMultiplicity();
   if(mult)esd->SetMultiplicity(mult);
-
+  */
   for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
     if (fTracker[iDet]) fTracker[iDet]->SetVertex(vtxPos, vtxErr);
   }  
@@ -2286,12 +2481,46 @@ Bool_t AliReconstruction::RunVertexFinder(AliESDEvent*& esd)
   return kTRUE;
 }
 
+//_____________________________________________________________________________
+Bool_t AliReconstruction::RunMultFinder(AliESDEvent*& esd)
+{
+  // run the trackleter for multiplicity study
+
+  AliCodeTimerAuto("",0)
+
+  AliTrackleter *trackleter = CreateMultFinder();
+  if (!trackleter) return kFALSE;
+
+  AliInfo(Form("running the ITS multiplicity finder: %s",trackleter->ClassName()));
+
+  if (fLoader[0]) {
+    fLoader[0]->LoadRecPoints();
+    TTree* cltree = fLoader[0]->TreeR();
+    if (cltree) {
+      trackleter->Reconstruct(esd,cltree);
+      AliMultiplicity *mult = trackleter->GetMultiplicity();
+      if(mult) esd->SetMultiplicity(mult);
+    }
+    else {
+      AliError("Can't get the ITS cluster tree");
+    }
+    fLoader[0]->UnloadRecPoints();
+  }
+  else {
+    AliError("Can't get the ITS loader");
+  }
+
+  delete trackleter;
+
+  return kTRUE;
+}
+
 //_____________________________________________________________________________
 Bool_t AliReconstruction::RunHLTTracking(AliESDEvent*& esd)
 {
 // run the HLT barrel tracking
 
-  AliCodeTimerAuto("")
+  AliCodeTimerAuto("",0)
 
   if (!fRunLoader) {
     AliError("Missing runLoader!");
@@ -2347,7 +2576,7 @@ Bool_t AliReconstruction::RunMuonTracking(AliESDEvent*& esd)
 {
 // run the muon spectrometer tracking
 
-  AliCodeTimerAuto("")
+  AliCodeTimerAuto("",0)
 
   if (!fRunLoader) {
     AliError("Missing runLoader!");
@@ -2377,28 +2606,28 @@ Bool_t AliReconstruction::RunMuonTracking(AliESDEvent*& esd)
   
   Int_t rv = tracker->Clusters2Tracks(esd);
   
-  if ( rv )
-  {
-    AliError(Form("%s Clusters2Tracks failed", fgkDetectorName[iDet]));
-    return kFALSE;
-  }
-  
   fLoader[iDet]->UnloadRecPoints();
 
   tracker->UnloadClusters();
   
   delete tracker;
   
+  if ( rv )
+  {
+    AliError(Form("%s Clusters2Tracks failed", fgkDetectorName[iDet]));
+    return kFALSE;
+  }
+  
   return kTRUE;
 }
 
 
 //_____________________________________________________________________________
-Bool_t AliReconstruction::RunTracking(AliESDEvent*& esd)
+Bool_t AliReconstruction::RunTracking(AliESDEvent*& esd,AliESDpid &PID)
 {
 // run the barrel tracking
   static Int_t eventNr=0;
-  AliCodeTimerAuto("")
+  AliCodeTimerAuto("",0)
 
   AliInfo("running tracking");
 
@@ -2444,7 +2673,7 @@ Bool_t AliReconstruction::RunTracking(AliESDEvent*& esd)
     // preliminary PID in TPC needed by the ITS tracker
     if (iDet == 1) {
       GetReconstructor(1)->FillESD((TTree*)NULL, (TTree*)NULL, esd);
-      AliESDpid::MakePID(esd);
+      PID.MakePID(esd,kTRUE);
     } 
     AliSysInfo::AddStamp(Form("Tracking0%s_%d",fgkDetectorName[iDet],eventNr), iDet,3,eventNr);
   }
@@ -2495,8 +2724,9 @@ Bool_t AliReconstruction::RunTracking(AliESDEvent*& esd)
     }
     // updated PID in TPC needed by the ITS tracker -MI
     if (iDet == 1) {
-      GetReconstructor(1)->FillESD((TTree*)NULL, (TTree*)NULL, esd);
-      AliESDpid::MakePID(esd);
+      //GetReconstructor(1)->FillESD((TTree*)NULL, (TTree*)NULL, esd);
+      //AliESDpid::MakePID(esd);
+      PID.MakePID(esd,kTRUE);
     }
     AliSysInfo::AddStamp(Form("Tracking1%s_%d",fgkDetectorName[iDet],eventNr), iDet,3, eventNr);
   }
@@ -2583,10 +2813,11 @@ Bool_t AliReconstruction::FillESD(AliESDEvent*& esd, const TString& detectors)
 {
 // fill the event summary data
 
-  AliCodeTimerAuto("")
+  AliCodeTimerAuto("",0)
     static Int_t eventNr=0; 
   TString detStr = detectors;
   
+  AliSysInfo::AddStamp(Form("FillESDb%d",eventNr), -19,-19, eventNr);
   for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
   if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
     AliReconstructor* reconstructor = GetReconstructor(iDet);
@@ -2622,13 +2853,14 @@ Bool_t AliReconstruction::FillESD(AliESDEvent*& esd, const TString& detectors)
       fLoader[iDet]->UnloadRecPoints();
     }
   }
-
+  
+  if (!IsSelected("CTP", detStr)) AliDebug(10,"No CTP");
   if ((detStr.CompareTo("ALL") != 0) && !detStr.IsNull()) {
     AliError(Form("the following detectors were not found: %s", 
                   detStr.Data()));
     if (fStopOnError) return kFALSE;
   }
-  AliSysInfo::AddStamp(Form("FillESD%d",eventNr), 0,1, eventNr);
+  AliSysInfo::AddStamp(Form("FillESDe%d",eventNr), -20,-20, eventNr);
   eventNr++;
   return kTRUE;
 }
@@ -2640,7 +2872,7 @@ Bool_t AliReconstruction::FillTriggerESD(AliESDEvent*& esd)
   // stored in Trigger.root file and fills
   // the corresponding esd entries
 
-  AliCodeTimerAuto("")
+  AliCodeTimerAuto("",0)
   
   AliInfo("Filling trigger information into the ESD");
 
@@ -2683,7 +2915,7 @@ Bool_t AliReconstruction::FillTriggerScalers(AliESDEvent*& esd)
      //AliTimeStamp* timestamp = new AliTimeStamp(10308000, 0, (ULong64_t)486238);
      AliESDHeader* esdheader = fesd->GetHeader();
      for(Int_t i=0;i<50;i++){
-          if((1<<i) & esd->GetTriggerMask()){
+          if((1ull<<i) & esd->GetTriggerMask()){
           AliTriggerScalersESD* scalesd = fRunScalers->GetScalersForEventClass( timestamp, i+1);
           if(scalesd)esdheader->SetTriggerScalersRecord(scalesd);
         }
@@ -2899,8 +3131,10 @@ AliReconstructor* AliReconstruction::GetReconstructor(Int_t iDet)
       
   if (fRecoParam.GetDetRecoParamArray(iDet) && !AliReconstructor::GetRecoParam(iDet)) {
     const AliDetectorRecoParam *par = fRecoParam.GetDetRecoParam(iDet);
-    reconstructor->SetRecoParam(par);
-    reconstructor->SetRunInfo(fRunInfo);
+    if (reconstructor) {
+      reconstructor->SetRecoParam(par);
+      reconstructor->SetRunInfo(fRunInfo);
+    }
   }
   return reconstructor;
 }
@@ -2914,7 +3148,8 @@ AliVertexer* AliReconstruction::CreateVertexer()
 
   AliVertexer* vertexer = NULL;
   AliReconstructor* itsReconstructor = GetReconstructor(0);
-  if (itsReconstructor && ((fRunLocalReconstruction.Contains("ITS")) || fRunTracking.Contains("ITS"))) {
+  if (itsReconstructor && ((fRunLocalReconstruction.Contains("ITS")) || 
+                          fRunTracking.Contains("ITS") || fFillESD.Contains("ITS") )) {
     vertexer = itsReconstructor->CreateVertexer();
   }
   if (!vertexer) {
@@ -2924,6 +3159,27 @@ AliVertexer* AliReconstruction::CreateVertexer()
   return vertexer;
 }
 
+//_____________________________________________________________________________
+AliTrackleter* AliReconstruction::CreateMultFinder()
+{
+// create the ITS trackleter for mult. estimation
+// Please note that the caller is the owner of the
+// trackleter
+
+  AliTrackleter* trackleter = NULL;
+  AliReconstructor* itsReconstructor = GetReconstructor(0);
+  if (itsReconstructor && ((fRunLocalReconstruction.Contains("ITS")) || 
+                          fRunTracking.Contains("ITS") || fFillESD.Contains("ITS") )) {
+    trackleter = itsReconstructor->CreateMultFinder();
+  }
+  else {
+    AliWarning("ITS is not in reconstruction, switching off RunMultFinder");
+    fRunMultFinder = kFALSE;
+  }
+
+  return trackleter;
+}
+
 //_____________________________________________________________________________
 Bool_t AliReconstruction::CreateTrackers(const TString& detectors)
 {
@@ -2945,7 +3201,6 @@ Bool_t AliReconstruction::CreateTrackers(const TString& detectors)
       continue;
     }
 
-
     fTracker[iDet] = reconstructor->CreateTracker();
     if (!fTracker[iDet] && (iDet < 7)) {
       AliWarning(Form("couldn't create a tracker for %s", detName.Data()));
@@ -2995,7 +3250,6 @@ void AliReconstruction::CleanUp()
     AliQAManager::QAManager()->ShowQA() ; 
   AliQAManager::Destroy() ; 
   
-  TGeoGlobalMagField::Instance()->SetField(NULL);
 }
 
 void AliReconstruction::WriteAlignmentData(AliESDEvent* esd)
@@ -3011,9 +3265,9 @@ void AliReconstruction::WriteAlignmentData(AliESDEvent* esd)
       Int_t idx[200];
       for (Int_t i=0; i<200; ++i) idx[i] = -1; //PH avoid uninitialized values
       for (Int_t iDet = 5; iDet >= 0; iDet--) {// TOF, TRD, TPC, ITS clusters
-          nsp += track->GetNcls(iDet);
+          nsp += (iDet==GetDetIndex("TRD")) ? track->GetTRDntracklets():track->GetNcls(iDet);
 
-          if (iDet==0) { // ITS "extra" clusters
+          if (iDet==GetDetIndex("ITS")) { // ITS "extra" clusters
              track->GetClusters(iDet,idx);
              for (Int_t i=6; i<12; i++) if(idx[i] >= 0) nsp++;
           }  
@@ -3026,9 +3280,9 @@ void AliReconstruction::WriteAlignmentData(AliESDEvent* esd)
        for (Int_t iDet = 5; iDet >= 0; iDet--) {
          AliTracker *tracker = fTracker[iDet];
          if (!tracker) continue;
-         Int_t nspdet = track->GetClusters(iDet,idx);
+         Int_t nspdet = (iDet==GetDetIndex("TRD")) ? track->GetTRDtracklets(idx):track->GetClusters(iDet,idx);
 
-         if (iDet==0) // ITS "extra" clusters             
+         if (iDet==GetDetIndex("ITS")) // ITS "extra" clusters             
              for (Int_t i=6; i<12; i++) if(idx[i] >= 0) nspdet++;
 
          if (nspdet <= 0) continue;
@@ -3052,7 +3306,7 @@ void AliReconstruction::WriteAlignmentData(AliESDEvent* esd)
            } 
            isp2++;
            if (!isvalid) continue;
-           if (iDet==0 && (isp-1)>=6) p.SetExtra();
+           if (iDet==GetDetIndex("ITS") && (isp-1)>=6) p.SetExtra();
            sp->AddPoint(isptrack,&p); isptrack++;
          }
        }       
@@ -3083,8 +3337,8 @@ void AliReconstruction::FillRawDataErrorLog(Int_t iEvent, AliESDEvent* esd)
 }
 
 //_____________________________________________________________________________
-void AliReconstruction::CheckQA()
-{
+// void AliReconstruction::CheckQA()
+// {
 // check the QA of SIM for this run and remove the detectors 
 // with status Fatal
   
@@ -3119,7 +3373,7 @@ void AliReconstruction::CheckQA()
 //     fRunLocalReconstruction = newRunLocalReconstruction ; 
 //     fRunTracking            = newRunTracking ; 
 //     fFillESD                = newFillESD ; 
-}
+// }
 
 //_____________________________________________________________________________
 Int_t AliReconstruction::GetDetIndex(const char* detector)
@@ -3146,9 +3400,10 @@ Bool_t AliReconstruction::FinishPlaneEff() {
  //  Return: kTRUE if all operations have been done properly, kFALSE otherwise
  //
  Bool_t ret=kFALSE;
+ TString detStr = fLoadCDB;
  //for (Int_t iDet = 0; iDet < fgkNDetectors; iDet++) {
  for (Int_t iDet = 0; iDet < 1; iDet++) { // for the time being only ITS
-   //if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
+   if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
    if(fTracker[iDet] && fTracker[iDet]->GetPlaneEff()) {
       AliPlaneEff *planeeff=fTracker[iDet]->GetPlaneEff();
       TString name=planeeff->GetName();
@@ -3188,17 +3443,18 @@ Bool_t AliReconstruction::InitPlaneEff() {
  //  Input: none
  //  Return: kTRUE if all operations have been done properly, kFALSE otherwise
  //
- AliWarning(Form("Implementation of this method not yet completed !! Method return kTRUE"));
 
   fSPDTrackleter = NULL;
-  AliReconstructor* itsReconstructor = GetReconstructor(0);
-  if (itsReconstructor) {
-    fSPDTrackleter = itsReconstructor->CreateTrackleter(); // this is NULL unless required in RecoParam
-  }
-  if (fSPDTrackleter) { 
-    AliInfo("Trackleter for SPD has been created");
+  TString detStr = fLoadCDB;
+  if (IsSelected(fgkDetectorName[0], detStr)) {
+    AliReconstructor* itsReconstructor = GetReconstructor(0);
+    if (itsReconstructor) {
+      fSPDTrackleter = itsReconstructor->CreateTrackleter(); // this is NULL unless required in RecoParam
+    }
+    if (fSPDTrackleter) {
+      AliInfo("Trackleter for SPD has been created");
+    }
   }
-
  return kTRUE;
 }
 
@@ -3214,9 +3470,13 @@ Bool_t AliReconstruction::InitAliEVE()
   // The return flag shows whenever the
   // AliEVE initialization was successful or not.
 
-  TString macroStr;
-  macroStr.Form("%s/EVE/macros/alieve_online.C",gSystem->ExpandPathName("$ALICE_ROOT"));
+  TString macroStr(gSystem->Getenv("ALIEVE_ONLINE_MACRO"));
+
+  if (macroStr.IsNull())
+    macroStr.Form("%s/EVE/macros/alieve_online.C",gSystem->ExpandPathName("$ALICE_ROOT"));
+
   AliInfo(Form("Loading AliEVE macro: %s",macroStr.Data()));
+
   if (gROOT->LoadMacro(macroStr.Data()) != 0) return kFALSE;
 
   gROOT->ProcessLine("if (!AliEveEventManager::GetMaster()){new AliEveEventManager();AliEveEventManager::GetMaster()->AddNewEventCommand(\"alieve_online_on_new_event()\");gEve->AddEvent(AliEveEventManager::GetMaster());};");
@@ -3234,7 +3494,7 @@ void AliReconstruction::RunAliEVE()
   // successful initialization of AliEVE.
 
   AliInfo("Running AliEVE...");
-  gROOT->ProcessLine(Form("AliEveEventManager::GetMaster()->SetEvent((AliRunLoader*)0x%lx,(AliRawReader*)0x%lx,(AliESDEvent*)0x%lx,(AliESDfriend*)0x%lx);",fRunLoader,fRawReader,fesd,fesdf));
+  gROOT->ProcessLine(Form("AliEveEventManager::GetMaster()->SetEvent((AliRunLoader*)%p,(AliRawReader*)%p,(AliESDEvent*)%p,(AliESDfriend*)%p);",fRunLoader,fRawReader,fesd,fesdf));
   gSystem->Run();
 }
 
@@ -3252,9 +3512,7 @@ Bool_t AliReconstruction::SetRunQA(TString detAndAction)
        }
        Int_t colon = detAndAction.Index(":") ; 
        fQADetectors = detAndAction(0, colon) ; 
-       if (fQADetectors.Contains("ALL") )
-               fQADetectors = fFillESD ; 
-               fQATasks   = detAndAction(colon+1, detAndAction.Sizeof() ) ; 
+       fQATasks   = detAndAction(colon+1, detAndAction.Sizeof() ) ; 
        if (fQATasks.Contains("ALL") ) {
                fQATasks = Form("%d %d %d %d", AliQAv1::kRAWS, AliQAv1::kDIGITSR, AliQAv1::kRECPOINTS, AliQAv1::kESDS) ; 
        } else {
@@ -3382,7 +3640,7 @@ Bool_t AliReconstruction::GetEventInfo()
 {
   // Fill the event info object
   // ...
-  AliCodeTimerAuto("")
+  AliCodeTimerAuto("",0)
 
   AliCentralTrigger *aCTP = NULL;
   if (fRawReader) {
@@ -3436,7 +3694,7 @@ Bool_t AliReconstruction::GetEventInfo()
   Int_t nclasses = classesArray.GetEntriesFast();
   for( Int_t iclass=0; iclass < nclasses; iclass++ ) {
     AliTriggerClass* trclass = (AliTriggerClass*)classesArray.At(iclass);
-    if (trclass) {
+    if (trclass && trclass->GetMask()>0) {
       Int_t trindex = TMath::Nint(TMath::Log2(trclass->GetMask()));
       fesd->SetTriggerClass(trclass->GetName(),trindex);
       if (fRawReader) fRawReader->LoadTriggerClass(trclass->GetName(),trindex);
@@ -3450,6 +3708,21 @@ Bool_t AliReconstruction::GetEventInfo()
   }
   fEventInfo.SetTriggerClasses(trclasses);
 
+  // Write names of active trigger inputs in ESD Header
+  const TObjArray& inputsArray = config->GetInputs(); 
+  Int_t ninputs = inputsArray.GetEntriesFast();
+  for( Int_t iinput=0; iinput < ninputs; iinput++ ) {
+    AliTriggerInput* trginput = (AliTriggerInput*)inputsArray.At(iinput);
+    if (trginput && trginput->GetMask()>0) {
+      Int_t inputIndex = (Int_t)TMath::Nint(TMath::Log2(trginput->GetMask()));
+      AliESDHeader* headeresd = fesd->GetHeader();
+      Int_t trglevel = (Int_t)trginput->GetLevel();
+      if (trglevel == 0) headeresd->SetActiveTriggerInputs(trginput->GetInputName(), inputIndex);
+      if (trglevel == 1) headeresd->SetActiveTriggerInputs(trginput->GetInputName(), inputIndex+24);
+      if (trglevel == 2) headeresd->SetActiveTriggerInputs(trginput->GetInputName(), inputIndex+48);
+    }
+  }
+
   // Set the information in ESD
   fesd->SetTriggerMask(trmask);
   fesd->SetTriggerCluster(clustmask);
@@ -3633,3 +3906,115 @@ Bool_t AliReconstruction::ParseOutput()
 
   return kTRUE;
 }
+
+//______________________________________________________________________________
+Bool_t AliReconstruction::IsHighPt() const {
+  // Selection of events containing "high" pT tracks
+  // If at least one track is found within 1.5 and 100 GeV (pT)
+  // that was reconstructed by both ITS and TPC, the event is accepted
+
+  // Track cuts
+
+  const Double_t pTmin = 1.5;
+  const Double_t pTmax = 100;
+  ULong_t mask = 0;
+  mask |= (AliESDtrack::kITSrefit);
+  mask |= (AliESDtrack::kTPCrefit);
+
+  Bool_t isOK = kFALSE;
+
+  if (fesd && fesd->GetEventType()==AliRawEventHeaderBase::kPhysicsEvent) {
+    // Check if this ia a physics event (code 7)
+    Int_t ntrk = fesd->GetNumberOfTracks();
+    for (Int_t itrk=0; itrk<ntrk; ++itrk) {
+         
+      AliESDtrack * trk = fesd->GetTrack(itrk);
+      if (trk 
+         && trk->Pt() > pTmin 
+         && trk->Pt() < pTmax
+         && (trk->GetStatus() & mask) == mask ) {
+       
+       isOK = kTRUE;
+       break;
+      }
+    }
+  }
+  return isOK;
+}
+
+//______________________________________________________________________________
+Bool_t AliReconstruction::IsCosmicOrCalibSpecie() const {
+  // Select cosmic or calibration events
+
+  Bool_t isOK = kFALSE;
+
+  if (fesd && fesd->GetEventType()==AliRawEventHeaderBase::kPhysicsEvent) {
+      // Check if this ia a physics event (code 7)
+      
+      UInt_t specie = fesd->GetEventSpecie();
+      if (specie==AliRecoParam::kCosmic || specie==AliRecoParam::kCalib) {
+       isOK = kTRUE;
+      }
+  }
+  return isOK;
+}
+
+//______________________________________________________________________________
+void AliReconstruction::WriteESDfriend() {
+  // Fill the ESD friend in the tree. The required fraction of ESD friends is stored
+  // in fFractionFriends. We select events where we store the ESD friends according
+  // to the following algorithm:
+  // 1. Store all Cosmic or Calibration events within the required fraction
+  // 2. Sample "high Pt" events within the remaining fraction after step 1.
+  // 3. Sample randomly events if we still have remaining slot
+
+  fNall++;
+
+  Bool_t isSelected = kFALSE;
+
+  if (IsCosmicOrCalibSpecie()) { // Selection of calib or cosmic events
+    fNspecie++;
+    Double_t curentSpecieFraction = ((Double_t)(fNspecie+1))/((Double_t)(fNall+1)); 
+    // "Bayesian" estimate supposing that without events all the events are of the required type
+    
+    Double_t rnd = gRandom->Rndm()*curentSpecieFraction;
+    if (rnd<fFractionFriends) {
+      isSelected = kTRUE;
+      fSspecie++;
+    }
+  }
+  
+  Double_t remainingFraction = fFractionFriends;
+  remainingFraction -= ((Double_t)(fSspecie)/(Double_t)(fNall));
+  
+  if (IsHighPt())  { // Selection of "high Pt" events
+    fNhighPt++;
+    Double_t curentHighPtFraction = ((Double_t)(fNhighPt+1))/((Double_t)(fNall+1));
+    // "Bayesian" estimate supposing that without events all the events are of the required type
+    
+    if (!isSelected) {
+      Double_t rnd = gRandom->Rndm()*curentHighPtFraction;
+      if (rnd<remainingFraction) {
+       isSelected = kTRUE;
+       fShighPt++;
+      }
+    }
+  }
+  remainingFraction -= ((Double_t)(fShighPt)/(Double_t)(fNall));
+  
+  // Random selection to fill the remaining fraction (if any)
+  if (!isSelected) {
+    Double_t rnd = gRandom->Rndm();
+    if (rnd<remainingFraction) {       
+      isSelected = kTRUE;
+    }
+  }
+  
+  if (!isSelected) {
+    fesdf->~AliESDfriend();
+    new (fesdf) AliESDfriend(); // Reset...
+    fesdf->SetSkipBit(kTRUE);
+  }
+  
+  ftreeF->Fill();
+}