]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - STEER/AliReconstruction.cxx
turned off HLTError into Debug
[u/mrichter/AliRoot.git] / STEER / AliReconstruction.cxx
index 5b53f5094d520385bbbc05e89bfae41ad5e87dac..d66f9c8f1b000c4aa590bd5c67484e9f3fd08b92 100644 (file)
 #include <TGrid.h>
 #include <TMessage.h>
 #include <TUrl.h>
+#include <TRandom.h>
 
 #include "AliAlignObj.h"
 #include "AliCDBEntry.h"
@@ -238,6 +239,7 @@ AliReconstruction::AliReconstruction(const char* gAliceFilename) :
   fFirstEvent(0),
   fLastEvent(-1),
   fNumberOfEventsPerFile((UInt_t)-1),
+  fFractionFriends(0.04),
   fOptions(),
   fLoadAlignFromCDB(kTRUE),
   fLoadAlignData("ALL"),
@@ -246,6 +248,7 @@ AliReconstruction::AliReconstruction(const char* gAliceFilename) :
   fEventInfo(),
   fRunScalers(NULL),
   fCTPTimeParams(NULL),  
+  fCTPTimeAlign(NULL),  
 
   fRunLoader(NULL),
   fRawReader(NULL),
@@ -288,13 +291,20 @@ AliReconstruction::AliReconstruction(const char* gAliceFilename) :
   ftVertexer(NULL),
   fIsNewRunLoader(kFALSE),
   fRunAliEVE(kFALSE),
-  fChain(NULL)
+  fChain(NULL),
+  fNall(0),
+  fNspecie(0),
+  fSspecie(0),
+  fNhighPt(0),
+  fShighPt(0),
+  fUpgradeModule("") 
 {
 // create reconstruction object with default parameters
   gGeoManager = NULL;
   
   for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
     fReconstructor[iDet] = NULL;
+    fUpgradeMask[iDet]=kFALSE;
     fLoader[iDet] = NULL;
     fTracker[iDet] = NULL;
   }
@@ -344,6 +354,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),
@@ -352,6 +363,7 @@ AliReconstruction::AliReconstruction(const AliReconstruction& rec) :
   fEventInfo(),
   fRunScalers(NULL),
   fCTPTimeParams(NULL),
+  fCTPTimeAlign(NULL),
 
   fRunLoader(NULL),
   fRawReader(NULL),
@@ -394,7 +406,13 @@ AliReconstruction::AliReconstruction(const AliReconstruction& rec) :
   ftVertexer(NULL),
   fIsNewRunLoader(rec.fIsNewRunLoader),
   fRunAliEVE(kFALSE),
-  fChain(NULL)
+  fChain(NULL),
+  fNall(0),
+  fNspecie(0),
+  fSspecie(0),
+  fNhighPt(0),
+  fShighPt(0),
+  fUpgradeModule("")
 {
 // copy constructor
 
@@ -403,6 +421,7 @@ AliReconstruction::AliReconstruction(const AliReconstruction& rec) :
   }
   for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
     fReconstructor[iDet] = NULL;
+    fUpgradeMask[iDet] = kFALSE;
     fLoader[iDet] = NULL;
     fTracker[iDet] = NULL;
   }  
@@ -466,6 +485,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());
@@ -485,6 +505,8 @@ AliReconstruction& AliReconstruction::operator = (const AliReconstruction& rec)
 
   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;
@@ -493,6 +515,7 @@ AliReconstruction& AliReconstruction::operator = (const AliReconstruction& rec)
   fRecoParam = rec.fRecoParam;
 
   for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
+    fUpgradeMask[iDet] = kFALSE;
     delete fReconstructor[iDet]; fReconstructor[iDet] = NULL;
     delete fLoader[iDet]; fLoader[iDet] = NULL;
     delete fTracker[iDet]; fTracker[iDet] = NULL;
@@ -547,6 +570,12 @@ AliReconstruction& AliReconstruction::operator = (const AliReconstruction& rec)
   fIsNewRunLoader = rec.fIsNewRunLoader;
   fRunAliEVE = kFALSE;
   fChain = NULL;
+  fNall = 0;
+  fNspecie = 0;
+  fSspecie = 0;
+  fNhighPt = 0;
+  fShighPt = 0;
+  fUpgradeModule="";
 
   return *this;
 }
@@ -564,6 +593,7 @@ AliReconstruction::~AliReconstruction()
   delete fGRPData;
   delete fRunScalers;
   delete fCTPTimeParams;
+  delete fCTPTimeAlign;
   fOptions.Delete();
   if (fAlignObjArray) {
     fAlignObjArray->Delete();
@@ -828,6 +858,15 @@ void AliReconstruction::SetCDBLock() {
   AliCDBManager::Instance()->SetLock(1);
 }
 
+//_____________________________________________________________________________
+void AliReconstruction::MatchUpgradeDetector() {
+  // Translates detector name in a boolean.
+  // The boolean is used in GetReconstructor to load the 
+  // upgrade reconstructor instead of the standard one.
+   for(Int_t iDet = 0; iDet < kNDetectors; iDet++) {
+    if(fUpgradeModule.Contains(fgkDetectorName[iDet])) fUpgradeMask[iDet]=kTRUE;
+   }
+}
 //_____________________________________________________________________________
 Bool_t AliReconstruction::MisalignGeometry(const TString& detectors)
 {
@@ -1162,6 +1201,8 @@ Bool_t AliReconstruction::LoadCDB()
 
   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;
@@ -1191,7 +1232,7 @@ 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;
@@ -1203,16 +1244,20 @@ Bool_t AliReconstruction::LoadCTPTimeParamsCDB()
   // from OCDB.
 
   AliCDBEntry* entry = AliCDBManager::Instance()->Get("GRP/CTP/CTPtiming");
+  if (!entry) return kFALSE;
 
-  if (entry) {
+  AliInfo("Found an AliCTPTimeParams in GRP/CTP/CTPtiming, reading it");
+  fCTPTimeParams = dynamic_cast<AliCTPTimeParams*> (entry->GetObject());
+  entry->SetOwner(0);
 
-       AliInfo("Found an AliCTPTimeParams in GRP/CTP/CTPtiming, reading it");
-       fCTPTimeParams = dynamic_cast<AliCTPTimeParams*> (entry->GetObject());
-       entry->SetOwner(0);
-       return kTRUE;
-  }
-  
-  return kFALSE; 
+  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;
 }
 
 //_____________________________________________________________________________
@@ -1226,7 +1271,7 @@ Bool_t AliReconstruction::ReadIntensityInfoCDB()
     AliLHCData* dipData = dynamic_cast<AliLHCData*> (entry->GetObject());
     for (int ib=2;ib--;) {
       double intI,intNI;
-      if (dipData->GetMeanIntensity(ib,intI,intNI)>=0) {
+      if (dipData && (dipData->GetMeanIntensity(ib,intI,intNI)>=0)) {
        fBeamInt[ib][0] = intI;
        fBeamInt[ib][1] = intNI;        
       }
@@ -1599,7 +1644,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 
@@ -1670,9 +1715,11 @@ Bool_t AliReconstruction::ProcessEvent(Int_t iEvent)
 
   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");
   }
@@ -1857,7 +1904,11 @@ Bool_t AliReconstruction::ProcessEvent(Int_t iEvent)
        if (fStopOnError) {CleanUp(); return kFALSE;}
       }
     }
+
+    // AdC+FN
+    if (fReconstructor[3])
+      GetReconstructor(3)->FillEventTimeWithTOF(fesd,&pid);
+
     // combined PID
     pid.MakePID(fesd);
 
@@ -2004,15 +2055,34 @@ Bool_t AliReconstruction::ProcessEvent(Int_t iEvent)
     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)
@@ -2023,15 +2093,13 @@ Bool_t AliReconstruction::ProcessEvent(Int_t iEvent)
       }
     }
 
-    // write ESD
-    if (fCleanESD) CleanESD(fesd);
-
   if (fRunQA && IsInTasks(AliQAv1::kESDS)) {
     AliQAManager::QAManager()->SetEventSpecie(fRecoParam.GetEventSpecie()) ;
     AliQAManager::QAManager()->RunOneEvent(fesd, fhltesd) ; 
   }
   if (fRunGlobalQA) {
     AliQADataMaker *qadm = AliQAManager::QAManager()->GetQADataMaker(AliQAv1::kGLOBAL);
+    if (qadm)
       qadm->SetEventSpecie(fRecoParam.GetEventSpecie()) ;
     if (qadm && IsInTasks(AliQAv1::kESDS))
       qadm->Exec(AliQAv1::kESDS, fesd);
@@ -2050,14 +2118,14 @@ Bool_t AliReconstruction::ProcessEvent(Int_t iEvent)
       fesd->GetESDfriend(fesdf);
 
     ftree->Fill();
-    if (fWriteESDfriend) ftreeF->Fill();
+    if (fWriteESDfriend) {
+      WriteESDfriend();
+    }
 
     // Auto-save the ESD tree in case of prompt reco @P2
     if (fRawReader && fRawReader->UseAutoSaveESD()) {
       ftree->AutoSave("SaveSelf");
       if (fWriteESDfriend) ftreeF->AutoSave("SaveSelf");
-      TFile *friendfile = (TFile *)(gROOT->GetListOfFiles()->FindObject("AliESDfriends.root"));
-      if (friendfile) friendfile->Save();
     }
 
     // write HLT ESD
@@ -2080,7 +2148,7 @@ Bool_t AliReconstruction::ProcessEvent(Int_t iEvent)
     aveDMres+=(dMres-aveDMres)/(iEvent-fFirstEvent+1);
     aveDMvir+=(dMvir-aveDMvir)/(iEvent-fFirstEvent+1);
     aveDCPU+=(dCPU-aveDCPU)/(iEvent-fFirstEvent+1);
-    AliInfo(Form("======================= End Event %d: Res %d(%3d <%3d>) Vir %d(%3d <%3d>) CPU %5.2f <%5.2f> ===================",
+    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;
@@ -2111,6 +2179,7 @@ void AliReconstruction::SlaveTerminate()
 
   if (fIsNewRunLoader) { // galice.root didn't exist
     fRunLoader->WriteHeader("OVERWRITE");
+    fRunLoader->WriteTrigger("OVERWRITE");
     fRunLoader->CdGAFile();
     fRunLoader->Write(0, TObject::kOverwrite);
   }
@@ -2126,8 +2195,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();    
@@ -2238,22 +2308,28 @@ Bool_t AliReconstruction::RunLocalEventReconstruction(const TString& detectors)
   AliCodeTimerAuto("",0)
 
   TString detStr = detectors;
-  for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
-    if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
-    AliReconstructor* reconstructor = GetReconstructor(iDet);
-    if (!reconstructor) continue;
-    AliLoader* loader = fLoader[iDet];
-    // Matthias April 2008: temporary fix to run HLT reconstruction
-    // although the HLT loader is missing
-    if (strcmp(fgkDetectorName[iDet], "HLT")==0) {
+  // execute HLT reconstruction first since other detector reconstruction
+  // might depend on HLT data
+  // key 'HLT' is removed from detStr by IsSelected
+  if (!IsSelected("HLT", detStr)) {
+    AliReconstructor* reconstructor = GetReconstructor(kNDetectors-1);
+    if (reconstructor) {
+      // there is no AliLoader for HLT, see
+      // https://savannah.cern.ch/bugs/?35473
+      AliInfo("running reconstruction for HLT");
       if (fRawReader) {
         reconstructor->Reconstruct(fRawReader, NULL);
       } else {
         TTree* dummy=NULL;
         reconstructor->Reconstruct(dummy, NULL);
       }
-      continue;
     }
+  }
+  for (Int_t iDet = 0; iDet < kNDetectors; iDet++) {
+    if (!IsSelected(fgkDetectorName[iDet], detStr)) continue;
+    AliReconstructor* reconstructor = GetReconstructor(iDet);
+    if (!reconstructor) continue;
+    AliLoader* loader = fLoader[iDet];
     if (!loader) {
       AliWarning(Form("No loader is defined for %s!",fgkDetectorName[iDet]));
       continue;
@@ -2305,7 +2381,7 @@ Bool_t AliReconstruction::RunLocalEventReconstruction(const TString& detectors)
     loader->UnloadRecPoints();
     AliSysInfo::AddStamp(Form("LRec%s_%d",fgkDetectorName[iDet],eventNr), iDet,1,eventNr);
   }
-  IsSelected("CTP", detStr);
+  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()));
@@ -2801,7 +2877,7 @@ Bool_t AliReconstruction::FillESD(AliESDEvent*& esd, const TString& detectors)
     }
   }
   
-  IsSelected("CTP", detStr);
+  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()));
@@ -2848,7 +2924,12 @@ Bool_t AliReconstruction::FillTriggerESD(AliESDEvent*& esd)
           if(TMath::Abs(Int_t(orbit-(input.GetIR(i))->GetOrbit()))<=1){
             esdheader->AddTriggerIR(input.GetIR(i));
          }
+       AliCentralTrigger* rlCTP = fRunLoader->GetTrigger();
+       rlCTP->SetL0TriggerInputs(input.GetL0Inputs());
+       rlCTP->SetL1TriggerInputs(input.GetL1Inputs());
+       rlCTP->SetL2TriggerInputs(input.GetL2Inputs());
     }
+    if (fIsNewRunLoader) fRunLoader->TreeCT()->Fill();
   }
   return kTRUE;
 }
@@ -2977,6 +3058,7 @@ Bool_t AliReconstruction::InitRunLoader()
     }
     fIsNewRunLoader = kTRUE;
     fRunLoader->MakeTree("E");
+    fRunLoader->MakeTree("GG");
 
     if (fNumberOfEventsPerFile > 0)
       fRunLoader->SetNumberOfEventsPerFile(fNumberOfEventsPerFile);
@@ -3029,6 +3111,14 @@ AliReconstructor* AliReconstruction::GetReconstructor(Int_t iDet)
   if (pluginHandler && (pluginHandler->LoadPlugin() == 0)) {
     reconstructor = (AliReconstructor*) pluginHandler->ExecPlugin(0);
   }
+
+   // check if the upgrade reconstructor should be used instead of the standard one
+  if(fUpgradeMask[iDet]) {
+    if(reconstructor) delete reconstructor;
+    TClass *cl = new TClass(Form("Ali%sUpgradeReconstructor",fgkDetectorName[iDet]));
+    reconstructor = (AliReconstructor*)(cl->New());
+   }
+
   if (reconstructor) {
     TObject* obj = fOptions.FindObject(detName.Data());
     if (obj) reconstructor->SetOption(obj->GetTitle());
@@ -3078,8 +3168,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;
 }
@@ -3093,7 +3185,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) {
@@ -3112,11 +3205,13 @@ AliTrackleter* AliReconstruction::CreateMultFinder()
 
   AliTrackleter* trackleter = NULL;
   AliReconstructor* itsReconstructor = GetReconstructor(0);
-  if (itsReconstructor && ((fRunLocalReconstruction.Contains("ITS")) || fRunTracking.Contains("ITS"))) {
+  if (itsReconstructor && ((fRunLocalReconstruction.Contains("ITS")) || 
+                          fRunTracking.Contains("ITS") || fFillESD.Contains("ITS") )) {
     trackleter = itsReconstructor->CreateMultFinder();
   }
-  if (!trackleter) {
-    AliWarning("couldn't create a trackleter for ITS");
+  else {
+    AliWarning("ITS is not in reconstruction, switching off RunMultFinder");
+    fRunMultFinder = kFALSE;
   }
 
   return trackleter;
@@ -3412,9 +3507,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());};");
@@ -3432,7 +3531,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();
 }
 
@@ -3598,6 +3697,10 @@ Bool_t AliReconstruction::GetEventInfo()
     }
     aCTP->SetClassMask(mask);
     aCTP->SetClusterMask(clmask);
+
+    AliCentralTrigger* rlCTP = fRunLoader->GetTrigger();
+    rlCTP->SetClassMask(mask);
+    rlCTP->SetClusterMask(clmask);
   }
   else {
     fEventInfo.SetEventType(AliRawEventHeaderBase::kPhysicsEvent);
@@ -3844,3 +3947,131 @@ 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);
+  const Double_t pTminCosmic = 5.;
+  const Double_t pTmaxCosmic = 100;
+  ULong_t maskCosmic = 0;
+  Int_t cosmicCount=0;
+  maskCosmic |= (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;
+      }
+      if (trk 
+         && trk->GetInnerParam()
+         && trk->GetInnerParam()->Pt() > pTminCosmic 
+         && trk->GetInnerParam()->Pt() < pTmaxCosmic
+         && (trk->GetStatus() & maskCosmic) == maskCosmic ) {
+       
+       cosmicCount++;
+       break;
+      }
+    }
+    if (cosmicCount>1) isOK=kTRUE;
+  }
+  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;
+  //
+  // Store all friends for B field OFF 
+  if (TMath::Abs(AliTrackerBase::GetBz())<0.5) isSelected=kTRUE;
+
+  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();
+}