]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - STEER/AliESDEvent.cxx
Adding TRD online tracks and trackets to ESD:
[u/mrichter/AliRoot.git] / STEER / AliESDEvent.cxx
index 7c9996e727f0ef1f4587e9754dfd78ae4623f573..fb103356b05f7fe7029ce23c16cd2cec36e4270d 100644 (file)
@@ -35,6 +35,8 @@
 #include "TList.h"
 #include "TRefArray.h"
 #include <TNamed.h>
+#include <TROOT.h>
+#include <TInterpreter.h>
 
 #include "AliESDEvent.h"
 #include "AliESDfriend.h"
@@ -48,7 +50,9 @@
 #include "AliESDcascade.h"
 #include "AliESDPmdTrack.h"
 #include "AliESDTrdTrack.h"
+#include "AliESDTrdTracklet.h"
 #include "AliESDVertex.h"
+#include "AliVertexerTracks.h"
 #include "AliESDcascade.h"
 #include "AliESDkink.h"
 #include "AliESDtrack.h"
 #include "AliRawDataErrorLog.h"
 #include "AliLog.h"
 #include "AliESDACORDE.h"
+#include "AliESDHLTDecision.h"
+#include "AliCentrality.h"
+#include "AliEventplane.h"
+
 ClassImp(AliESDEvent)
 
 
@@ -69,31 +77,33 @@ ClassImp(AliESDEvent)
 // here we define the names, some classes are no TNamed, therefore the classnames 
 // are the Names
   const char* AliESDEvent::fgkESDListName[kESDListN] = {"AliESDRun",
-                                                      "AliESDHeader",
-                                                      "AliESDZDC",
-                                                      "AliESDFMD",
-                                                      "AliESDVZERO",
-                                                      "AliESDTZERO",
-                                                      "TPCVertex",
-                                                      "SPDVertex",
-                                                      "PrimaryVertex",
-                                                      "AliMultiplicity",
-                                                      "PHOSTrigger",
-                                                      "EMCALTrigger",
-                                                      "SPDPileupVertices",
-                                                      "TrkPileupVertices",
-                                                      "Tracks",
-                                                      "MuonTracks",
-                                                      "PmdTracks",
-                                                      "TrdTracks",
-                                                      "V0s",
-                                                      "Cascades",
-                                                      "Kinks",
-                                                      "CaloClusters",
-                                                     "EMCALCells",
-                                                     "PHOSCells",
-                                                      "AliRawDataErrorLogs",
-                                                      "AliESDACORDE"};
+                                                       "AliESDHeader",
+                                                       "AliESDZDC",
+                                                       "AliESDFMD",
+                                                       "AliESDVZERO",
+                                                       "AliESDTZERO",
+                                                       "TPCVertex",
+                                                       "SPDVertex",
+                                                       "PrimaryVertex",
+                                                       "AliMultiplicity",
+                                                       "PHOSTrigger",
+                                                       "EMCALTrigger",
+                                                       "SPDPileupVertices",
+                                                       "TrkPileupVertices",
+                                                       "Tracks",
+                                                       "MuonTracks",
+                                                       "PmdTracks",
+                                                       "TrdTracks",
+                                                       "TrdTracklets",
+                                                       "V0s",
+                                                       "Cascades",
+                                                       "Kinks",
+                                                       "CaloClusters",
+                                                       "EMCALCells",
+                                                       "PHOSCells",
+                                                       "AliRawDataErrorLogs",
+                                                       "AliESDACORDE",
+                                                       "AliTOFHeader"};
 
 //______________________________________________________________________________
 AliESDEvent::AliESDEvent():
@@ -118,6 +128,7 @@ AliESDEvent::AliESDEvent():
   fMuonTracks(0),
   fPmdTracks(0),
   fTrdTracks(0),
+  fTrdTracklets(0),
   fV0s(0),  
   fCascades(0),
   fKinks(0),
@@ -128,10 +139,9 @@ AliESDEvent::AliESDEvent():
   fESDFriendOld(0),
   fConnected(kFALSE),
   fUseOwnList(kFALSE),
-  fEMCALClusters(0), 
-  fFirstEMCALCluster(-1),
-  fPHOSClusters(0), 
-  fFirstPHOSCluster(-1)
+  fTOFHeader(0),
+  fCentrality(0),
+  fEventplane(0)
 {
 }
 //______________________________________________________________________________
@@ -157,6 +167,7 @@ AliESDEvent::AliESDEvent(const AliESDEvent& esd):
   fMuonTracks(new TClonesArray(*esd.fMuonTracks)),
   fPmdTracks(new TClonesArray(*esd.fPmdTracks)),
   fTrdTracks(new TClonesArray(*esd.fTrdTracks)),
+  fTrdTracklets(new TClonesArray(*esd.fTrdTracklets)),
   fV0s(new TClonesArray(*esd.fV0s)),  
   fCascades(new TClonesArray(*esd.fCascades)),
   fKinks(new TClonesArray(*esd.fKinks)),
@@ -164,15 +175,13 @@ AliESDEvent::AliESDEvent(const AliESDEvent& esd):
   fEMCALCells(new AliESDCaloCells(*esd.fEMCALCells)),
   fPHOSCells(new AliESDCaloCells(*esd.fPHOSCells)),
   fErrorLogs(new TClonesArray(*esd.fErrorLogs)),
-  fESDOld(new AliESD(*esd.fESDOld)),
-  fESDFriendOld(new AliESDfriend(*esd.fESDFriendOld)),
+  fESDOld(esd.fESDOld ? new AliESD(*esd.fESDOld) : 0),
+  fESDFriendOld(esd.fESDFriendOld ? new AliESDfriend(*esd.fESDFriendOld) : 0),
   fConnected(esd.fConnected),
   fUseOwnList(esd.fUseOwnList),
-  fEMCALClusters(esd.fEMCALClusters), 
-  fFirstEMCALCluster(esd.fFirstEMCALCluster),
-  fPHOSClusters(esd.fPHOSClusters), 
-  fFirstPHOSCluster(esd.fFirstPHOSCluster)
-
+  fTOFHeader(new AliTOFHeader(*esd.fTOFHeader)),
+  fCentrality(new AliCentrality(*esd.fCentrality)),
+  fEventplane(new AliEventplane(*esd.fEventplane))
 {
   // CKB init in the constructor list and only add here ...
   AddObject(fESDRun);
@@ -193,6 +202,7 @@ AliESDEvent::AliESDEvent(const AliESDEvent& esd):
   AddObject(fMuonTracks);
   AddObject(fPmdTracks);
   AddObject(fTrdTracks);
+  AddObject(fTrdTracklets);
   AddObject(fV0s);
   AddObject(fCascades);
   AddObject(fKinks);
@@ -201,6 +211,7 @@ AliESDEvent::AliESDEvent(const AliESDEvent& esd):
   AddObject(fPHOSCells);
   AddObject(fErrorLogs);
   AddObject(fESDACORDE);
+  AddObject(fTOFHeader);
 
   GetStdContent();
 
@@ -252,8 +263,11 @@ AliESDEvent & AliESDEvent::operator=(const AliESDEvent& source) {
        ((TNamed*)mine)->SetName(name);
       }
       else if(mine->InheritsFrom("TCollection")){
-       if(mine->InheritsFrom("TClonesArray"))
-         dynamic_cast<TClonesArray*>(mine)->SetClass(dynamic_cast<TClonesArray*>(its)->GetClass());
+       if(mine->InheritsFrom("TClonesArray")) {
+         TClonesArray* tcits = dynamic_cast<TClonesArray*>(its);
+         if (tcits)
+           dynamic_cast<TClonesArray*>(mine)->SetClass(tcits->GetClass());
+       }
        dynamic_cast<TCollection*>(mine)->SetName(name);
       }
       AliDebug(1, Form("adding object %s of type %s", mine->GetName(), mine->ClassName()));
@@ -290,16 +304,13 @@ AliESDEvent & AliESDEvent::operator=(const AliESDEvent& source) {
     }
   }
 
-  fConnected = source.fConnected;
-  fUseOwnList = source.fUseOwnList;
-  fEMCALClusters = source.fEMCALClusters;
-  fFirstEMCALCluster = source.fFirstEMCALCluster;
-  fPHOSClusters = source.fPHOSClusters;
-  fFirstPHOSCluster = source.fFirstPHOSCluster;
+  fCentrality = source.fCentrality;
+  fEventplane = source.fEventplane;
 
+  fConnected  = source.fConnected;
+  fUseOwnList = source.fUseOwnList;
 
   return *this;
-
 }
 
 
@@ -318,7 +329,8 @@ AliESDEvent::~AliESDEvent()
       delete fESDObjects;
       fESDObjects = 0;
     }
-
+  if (fCentrality) delete fCentrality;
+  if (fEventplane) delete fEventplane;
   
 }
 
@@ -363,10 +375,18 @@ void AliESDEvent::Reset()
        ((TClonesArray*)pObject)->Delete();
       }
       else if(!pObject->InheritsFrom(TCollection::Class())){
-       ResetWithPlacementNew(pObject);
+       TClass *pClass = TClass::GetClass(pObject->ClassName());
+       if (pClass && pClass->GetListOfMethods()->FindObject("Clear")) {
+         AliDebug(1, Form("Clear for object %s class %s", pObject->GetName(), pObject->ClassName()));
+         pObject->Clear();
+       }
+       else {
+         AliDebug(1, Form("ResetWithPlacementNew for object %s class %s", pObject->GetName(), pObject->ClassName()));
+         ResetWithPlacementNew(pObject);
+       }
       }
       else{
-       AliWarning(Form("No reset for %s (%s)\n",
+       AliWarning(Form("No reset for %s \n",
                        pObject->ClassName()));
       }
     }
@@ -391,6 +411,8 @@ void AliESDEvent::ResetStdContent()
   // Reset the standard contents
   if(fESDRun) fESDRun->Reset();
   if(fHeader) fHeader->Reset();
+  if(fCentrality) fCentrality->Reset();
+  if(fEventplane) fEventplane->Reset();
   if(fESDZDC) fESDZDC->Reset();
   if(fESDFMD) {
     fESDFMD->Clear();
@@ -425,14 +447,20 @@ void AliESDEvent::ResetStdContent()
     fSPDMult->~AliMultiplicity();
     new (fSPDMult) AliMultiplicity();
   }
-  if(fPHOSTrigger)fPHOSTrigger->Reset(); 
-  if(fEMCALTrigger)fEMCALTrigger->Reset(); 
+  if(fTOFHeader){
+    fTOFHeader->~AliTOFHeader();
+    new (fTOFHeader) AliTOFHeader();
+    //fTOFHeader->SetName(fgkESDListName[kTOFHeader]);
+  }
+  if(fPHOSTrigger)fPHOSTrigger->DeAllocate(); 
+  if(fEMCALTrigger)fEMCALTrigger->DeAllocate(); 
   if(fSPDPileupVertices)fSPDPileupVertices->Delete();
   if(fTrkPileupVertices)fTrkPileupVertices->Delete();
   if(fTracks)fTracks->Delete();
   if(fMuonTracks)fMuonTracks->Delete();
   if(fPmdTracks)fPmdTracks->Delete();
   if(fTrdTracks)fTrdTracks->Delete();
+  if(fTrdTracklets)fTrdTracklets->Delete();
   if(fV0s)fV0s->Delete();
   if(fCascades)fCascades->Delete();
   if(fKinks)fKinks->Delete();
@@ -443,10 +471,6 @@ void AliESDEvent::ResetStdContent()
 
   // don't reset fconnected fConnected and the list
 
-  fEMCALClusters=0; 
-  fFirstEMCALCluster=-1; 
-  fPHOSClusters=0; 
-  fFirstPHOSCluster=-1; 
 }
 
 
@@ -475,23 +499,26 @@ void AliESDEvent::Print(Option_t *) const
         GetRunNumber(),
         GetTriggerMask(),
         GetMagneticField() );
-  printf("Vertex: (%.4f +- %.4f, %.4f +- %.4f, %.4f +- %.4f) cm\n",
+  if (fPrimaryVertex)
+    printf("Vertex: (%.4f +- %.4f, %.4f +- %.4f, %.4f +- %.4f) cm\n",
           fPrimaryVertex->GetXv(), fPrimaryVertex->GetXRes(),
           fPrimaryVertex->GetYv(), fPrimaryVertex->GetYRes(),
           fPrimaryVertex->GetZv(), fPrimaryVertex->GetZRes());
-    printf("Mean vertex in RUN: X=%.4f Y=%.4f cm\n",
-          GetDiamondX(),GetDiamondY());
+  printf("Mean vertex in RUN: X=%.4f Y=%.4f Z=%.4f cm\n",
+        GetDiamondX(),GetDiamondY(),GetDiamondZ());
+  if(fSPDMult)
     printf("SPD Multiplicity. Number of tracklets %d \n",
            fSPDMult->GetNumberOfTracklets());
   printf("Number of pileup primary vertices reconstructed with SPD %d\n", 
-        GetNumberOfPileupVerticesSPD());
+        GetNumberOfPileupVerticesSPD());
   printf("Number of pileup primary vertices reconstructed using the tracks %d\n",
-        GetNumberOfPileupVerticesTracks());
+        GetNumberOfPileupVerticesTracks());
   printf("Number of tracks: \n");
   printf("                 charged   %d\n", GetNumberOfTracks());
   printf("                 muon      %d\n", GetNumberOfMuonTracks());
   printf("                 pmd       %d\n", GetNumberOfPmdTracks());
   printf("                 trd       %d\n", GetNumberOfTrdTracks());
+  printf("                 trd trkl  %d\n", GetNumberOfTrdTracklets());
   printf("                 v0        %d\n", GetNumberOfV0s());
   printf("                 cascades  %d\n", GetNumberOfCascades());
   printf("                 kinks     %d\n", GetNumberOfKinks());
@@ -500,10 +527,11 @@ void AliESDEvent::Print(Option_t *) const
   if(fEMCALCells)printf("                 EMCALCells %d\n", fEMCALCells->GetNumberOfCells());
   else printf("                 EMCALCells not in the Event\n");
   printf("                 CaloClusters %d\n", GetNumberOfCaloClusters());
-  printf("                 phos      %d\n", GetNumberOfPHOSClusters());
-  printf("                 emcal     %d\n", GetNumberOfEMCALClusters());
   printf("                 FMD       %s\n", (fESDFMD ? "yes" : "no"));
   printf("                 VZERO     %s\n", (fESDVZERO ? "yes" : "no"));
+  TObject* pHLTDecision=GetHLTTriggerDecision();
+  printf("HLT trigger decision: %s\n", pHLTDecision?pHLTDecision->GetOption():"not available");
+  if (pHLTDecision) pHLTDecision->Print("compact");
 
   return;
 }
@@ -893,6 +921,15 @@ Int_t  AliESDEvent::AddTrack(const AliESDtrack *t)
     return  track->GetID();    
 }
 
+AliESDtrack*  AliESDEvent::NewTrack() 
+{
+    // Add a new track
+    TClonesArray &ftr = *fTracks;
+    AliESDtrack * track = new(ftr[fTracks->GetEntriesFast()])AliESDtrack();
+    track->SetID(fTracks->GetEntriesFast()-1);
+    return  track;
+}
+
  void AliESDEvent::AddMuonTrack(const AliESDMuonTrack *t) 
 {
     TClonesArray &fmu = *fMuonTracks;
@@ -911,8 +948,10 @@ void AliESDEvent::AddTrdTrack(const AliESDTrdTrack *t)
   new(ftrd[fTrdTracks->GetEntriesFast()]) AliESDTrdTrack(*t);
 }
 
-
-
+void AliESDEvent::AddTrdTracklet(const AliESDTrdTracklet *trkl)
+{
+  new ((*fTrdTracklets)[fTrdTracklets->GetEntriesFast()]) AliESDTrdTracklet(*trkl);
+}
 
 Int_t AliESDEvent::AddKink(const AliESDkink *c) 
 {
@@ -946,6 +985,13 @@ void  AliESDEvent::AddRawDataErrorLog(const AliRawDataErrorLog *log) const {
   new(errlogs[errlogs.GetEntriesFast()])  AliRawDataErrorLog(*log);
 }
 
+void AliESDEvent::SetZDCData(AliESDZDC * obj)
+{ 
+  // use already allocated space
+  if(fESDZDC)
+    *fESDZDC = *obj;
+}
+
 void  AliESDEvent::SetPrimaryVertexTPC(const AliESDVertex *vertex) 
 {
   // Set the TPC vertex
@@ -993,6 +1039,31 @@ const AliESDVertex * AliESDEvent::GetPrimaryVertex() const
   return fSPDVertex;
 }
 
+AliESDVertex * AliESDEvent::PrimaryVertexTracksUnconstrained() const 
+{
+  //
+  // Removes diamond constraint from fPrimaryVertex (reconstructed with tracks)
+  // Returns a AliESDVertex which has to be deleted by the user
+  //
+  if(!fPrimaryVertex) {
+    AliWarning("No primary vertex from tracks available.");
+    return 0;
+  }
+  if(!fPrimaryVertex->GetStatus()) {
+    AliWarning("No primary vertex from tracks available.");
+    return 0;
+  }
+
+  AliVertexerTracks vertexer(GetMagneticField());
+  Float_t diamondxyz[3]={(Float_t)GetDiamondX(),(Float_t)GetDiamondY(),0.};
+  Float_t diamondcovxy[3]; GetDiamondCovXY(diamondcovxy);
+  Float_t diamondcov[6]={diamondcovxy[0],diamondcovxy[1],diamondcovxy[2],0.,0.,7.};
+  AliESDVertex *vertex = 
+    (AliESDVertex*)vertexer.RemoveConstraintFromVertex(fPrimaryVertex,diamondxyz,diamondcov);
+
+  return vertex;
+}
+
 void AliESDEvent::SetMultiplicity(const AliMultiplicity *mul) 
 {
   // Set the SPD Multiplicity
@@ -1079,6 +1150,7 @@ void AliESDEvent::GetStdContent()
   fMuonTracks = (TClonesArray*)fESDObjects->FindObject(fgkESDListName[kMuonTracks]);
   fPmdTracks = (TClonesArray*)fESDObjects->FindObject(fgkESDListName[kPmdTracks]);
   fTrdTracks = (TClonesArray*)fESDObjects->FindObject(fgkESDListName[kTrdTracks]);
+  fTrdTracklets = (TClonesArray*)fESDObjects->FindObject(fgkESDListName[kTrdTracklets]);
   fV0s = (TClonesArray*)fESDObjects->FindObject(fgkESDListName[kV0s]);
   fCascades = (TClonesArray*)fESDObjects->FindObject(fgkESDListName[kCascades]);
   fKinks = (TClonesArray*)fESDObjects->FindObject(fgkESDListName[kKinks]);
@@ -1087,7 +1159,7 @@ void AliESDEvent::GetStdContent()
   fPHOSCells = (AliESDCaloCells*)fESDObjects->FindObject(fgkESDListName[kPHOSCells]);
   fErrorLogs = (TClonesArray*)fESDObjects->FindObject(fgkESDListName[kErrorLogs]);
   fESDACORDE = (AliESDACORDE*)fESDObjects->FindObject(fgkESDListName[kESDACORDE]);
-
+  fTOFHeader = (AliTOFHeader*)fESDObjects->FindObject(fgkESDListName[kTOFHeader]);
 }
 
 void AliESDEvent::SetStdNames(){
@@ -1138,6 +1210,7 @@ void AliESDEvent::CreateStdContent()
   AddObject(new TClonesArray("AliESDMuonTrack",0));
   AddObject(new TClonesArray("AliESDPmdTrack",0));
   AddObject(new TClonesArray("AliESDTrdTrack",0));
+  AddObject(new TClonesArray("AliESDTrdTracklet",0));
   AddObject(new TClonesArray("AliESDv0",0));
   AddObject(new TClonesArray("AliESDcascade",0));
   AddObject(new TClonesArray("AliESDkink",0));
@@ -1146,6 +1219,7 @@ void AliESDEvent::CreateStdContent()
   AddObject(new AliESDCaloCells());
   AddObject(new TClonesArray("AliRawDataErrorLog",0));
   AddObject(new AliESDACORDE()); 
+  AddObject(new AliTOFHeader());
 
   // check the order of the indices against enum...
 
@@ -1155,7 +1229,7 @@ void AliESDEvent::CreateStdContent()
   GetStdContent();
 }
 
-TObject* AliESDEvent::FindListObject(const char *name){
+TObject* AliESDEvent::FindListObject(const char *name) const {
 //
 // Find object with name "name" in the list of branches
 //
@@ -1222,8 +1296,10 @@ void AliESDEvent::WriteToTree(TTree* tree) const {
       if(!branchname.EndsWith("."))branchname += ".";
     }
     if (!tree->FindBranch(branchname)) {
-      tree->Bronch(branchname, obj->ClassName(), fESDObjects->GetObjectRef(obj),
-                  kBufsize, kSplitlevel - 1);
+      // For the custom streamer to be called splitlevel
+      // has to be negative, only needed for HLT
+      Int_t splitLevel = (TString(obj->ClassName()) == "AliHLTGlobalTriggerDecision") ? -1 : kSplitlevel - 1;
+      tree->Bronch(branchname, obj->ClassName(), fESDObjects->GetObjectRef(obj),kBufsize, splitLevel);
     }
   }
 }
@@ -1301,7 +1377,7 @@ void AliESDEvent::ReadFromTree(TTree *tree, Option_t* opt){
     if(fESDFriendOld)AddObject(fESDFriendOld);
     // we are not owner of the list objects 
     // must not delete it
-    fESDObjects->SetOwner(kFALSE);
+    fESDObjects->SetOwner(kTRUE);
     fESDObjects->SetName("ESDObjectsConnectedToTree");
     tree->GetUserInfo()->Add(fESDObjects);
     fConnected = true;
@@ -1316,6 +1392,7 @@ void AliESDEvent::ReadFromTree(TTree *tree, Option_t* opt){
   esdEvent = (AliESDEvent*)tree->GetTree()->GetUserInfo()->FindObject("AliESDEvent");
   if(esdEvent){   
       // Check if already connected to tree
+    esdEvent->Reset();
     TList* connectedList = (TList*) (tree->GetUserInfo()->FindObject("ESDObjectsConnectedToTree"));
 
     
@@ -1330,15 +1407,13 @@ void AliESDEvent::ReadFromTree(TTree *tree, Option_t* opt){
 
     // Connect to tree
     // prevent a memory leak when reading back the TList
-    if (!(strcmp(opt, "reconnect"))) fESDObjects->Delete();
+    // if (!(strcmp(opt, "reconnect"))) fESDObjects->Delete();
     
     if(!fUseOwnList){
-      delete fESDObjects;
-      fESDObjects = 0;
       // create a new TList from the UserInfo TList... 
       // copy constructor does not work...
       fESDObjects = (TList*)(esdEvent->GetList()->Clone());
-      fESDObjects->SetOwner(kFALSE);
+      fESDObjects->SetOwner(kTRUE);
     }
     else if ( fESDObjects->GetEntries()==0){
       // at least create the std content if we want to read to our list
@@ -1361,7 +1436,8 @@ void AliESDEvent::ReadFromTree(TTree *tree, Option_t* opt){
       if(bname.CompareTo("AliESDfriend")==0)
        {
          // AliESDfriend does not have a name ...
-         tree->SetBranchAddress("ESDfriend.",fESDObjects->GetObjectRef(el));
+           TBranch *br = tree->GetBranch("ESDfriend.");
+           if (br) tree->SetBranchAddress("ESDfriend.",fESDObjects->GetObjectRef(el));
        }
       else{
        // check if branch exists under this Name
@@ -1384,13 +1460,14 @@ void AliESDEvent::ReadFromTree(TTree *tree, Option_t* opt){
     GetStdContent();
     // when reading back we are not owner of the list 
     // must not delete it
-    fESDObjects->SetOwner(kFALSE);
+    fESDObjects->SetOwner(kTRUE);
     fESDObjects->SetName("ESDObjectsConnectedToTree");
     // we are not owner of the list objects 
     // must not delete it
     tree->GetUserInfo()->Add(fESDObjects);
+    tree->GetUserInfo()->SetOwner(kFALSE);
     fConnected = true;
-  }// no esdEvent
+  }// no esdEvent -->
   else {
     // we can't get the list from the user data, create standard content
     // and set it by hand (no ESDfriend at the moment
@@ -1413,7 +1490,7 @@ void AliESDEvent::ReadFromTree(TTree *tree, Option_t* opt){
     GetStdContent();
     // when reading back we are not owner of the list 
     // must not delete it
-    fESDObjects->SetOwner(kFALSE);
+    fESDObjects->SetOwner(kTRUE);
   }
 }
 
@@ -1512,6 +1589,37 @@ void AliESDEvent::CopyFromOldESD()
   }// if fesdold
 }
 
+Bool_t AliESDEvent::IsEventSelected(const char *trigExpr) const
+{
+  // Check if the event satisfies the trigger
+  // selection expression trigExpr.
+  // trigExpr can be any logical expression
+  // of the trigger classes defined in AliESDRun
+  // In case of wrong syntax return kTRUE.
+
+  TString expr(trigExpr);
+  if (expr.IsNull()) return kTRUE;
+
+  ULong64_t mask = GetTriggerMask();
+  for(Int_t itrig = 0; itrig < AliESDRun::kNTriggerClasses; itrig++) {
+    if (mask & (1ull << itrig)) {
+      expr.ReplaceAll(GetESDRun()->GetTriggerClass(itrig),"1");
+    }
+    else {
+      expr.ReplaceAll(GetESDRun()->GetTriggerClass(itrig),"0");
+    }
+  }
+
+  Int_t error;
+  if ((gROOT->ProcessLineFast(expr.Data(),&error) == 0) &&
+      (error == TInterpreter::kNoError)) {
+    return kFALSE;
+  }
+
+  return kTRUE;
+
+}
+
 TObject*  AliESDEvent::GetHLTTriggerDecision() const
 {
   // get the HLT trigger decission object
@@ -1554,4 +1662,124 @@ Bool_t    AliESDEvent::IsHLTTriggerFired(const char* name) const
   return kTRUE;
 }
 
+//______________________________________________________________________________
+Bool_t  AliESDEvent::IsPileupFromSPD(Int_t minContributors, 
+                                    Double_t minZdist, 
+                                    Double_t nSigmaZdist, 
+                                    Double_t nSigmaDiamXY, 
+                                    Double_t nSigmaDiamZ) const{
+  //
+  // This function checks if there was a pile up
+  // reconstructed with SPD
+  //
+  Int_t nc1=fSPDVertex->GetNContributors();
+  if(nc1<1) return kFALSE;
+  Int_t nPileVert=GetNumberOfPileupVerticesSPD();
+  if(nPileVert==0) return kFALSE;
+  
+  for(Int_t i=0; i<nPileVert;i++){
+    const AliESDVertex* pv=GetPileupVertexSPD(i);
+    Int_t nc2=pv->GetNContributors();
+    if(nc2>=minContributors){
+      Double_t z1=fSPDVertex->GetZ();
+      Double_t z2=pv->GetZ();
+      Double_t distZ=TMath::Abs(z2-z1);
+      Double_t distZdiam=TMath::Abs(z2-GetDiamondZ());
+      Double_t cutZdiam=nSigmaDiamZ*TMath::Sqrt(GetSigma2DiamondZ());
+      if(GetSigma2DiamondZ()<0.0001)cutZdiam=99999.; //protection for missing z diamond information
+      if(distZ>minZdist && distZdiam<cutZdiam){
+       Double_t x2=pv->GetX();
+       Double_t y2=pv->GetY();
+       Double_t distXdiam=TMath::Abs(x2-GetDiamondX());
+       Double_t distYdiam=TMath::Abs(y2-GetDiamondY());
+       Double_t cov1[6],cov2[6];       
+       fSPDVertex->GetCovarianceMatrix(cov1);
+       pv->GetCovarianceMatrix(cov2);
+       Double_t errxDist=TMath::Sqrt(cov2[0]+GetSigma2DiamondX());
+       Double_t erryDist=TMath::Sqrt(cov2[2]+GetSigma2DiamondY());
+       Double_t errzDist=TMath::Sqrt(cov1[5]+cov2[5]);
+       Double_t cutXdiam=nSigmaDiamXY*errxDist;
+       if(GetSigma2DiamondX()<0.0001)cutXdiam=99999.; //protection for missing diamond information
+       Double_t cutYdiam=nSigmaDiamXY*erryDist;
+       if(GetSigma2DiamondY()<0.0001)cutYdiam=99999.; //protection for missing diamond information
+       if( (distXdiam<cutXdiam) && (distYdiam<cutYdiam) && (distZ>nSigmaZdist*errzDist) ){
+         return kTRUE;
+       }
+      }
+    }
+  }
+  return kFALSE;
+}
 
+//______________________________________________________________________________
+void AliESDEvent::EstimateMultiplicity(Int_t &tracklets, Int_t &trITSTPC, Int_t &trITSSApure, Double_t eta, Bool_t useDCAFlag,Bool_t useV0Flag) const
+{
+  //
+  // calculates 3 estimators for the multiplicity in the -eta:eta range
+  // tracklets   : using SPD tracklets only
+  // trITSTPC    : using TPC/ITS + complementary ITS SA tracks + tracklets from clusters not used by tracks
+  // trITSSApure : using ITS standalone tracks + tracklets from clusters not used by tracks
+  // if useDCAFlag is true: account for the ESDtrack flag marking the tracks with large DCA
+  // if useV0Flag  is true: account for the ESDtrack flag marking conversion and K0's V0s
+  tracklets = trITSSApure = trITSTPC = 0;
+  int ntr = fSPDMult ? fSPDMult->GetNumberOfTracklets() : 0;
+  //
+  // count tracklets
+  for (int itr=ntr;itr--;) { 
+    if (TMath::Abs(fSPDMult->GetEta(itr))>eta) continue;
+    tracklets++;
+    if (fSPDMult->FreeClustersTracklet(itr,0)) trITSTPC++;    // not used in ITS/TPC or ITS_SA track
+    if (fSPDMult->FreeClustersTracklet(itr,1)) trITSSApure++; // not used in ITS_SA_Pure track
+  }
+  //
+  // count real tracks
+  ntr = GetNumberOfTracks();
+  for (int itr=ntr;itr--;) {
+    AliESDtrack *t = GetTrack(itr);
+    if (TMath::Abs(t->Eta())>eta) continue;
+    if (!t->IsOn(AliESDtrack::kITSin)) continue;
+    if (useDCAFlag && t->IsOn(AliESDtrack::kMultSec))  continue;
+    if (useV0Flag  && t->IsOn(AliESDtrack::kMultInV0)) continue;    
+    if (t->IsOn(AliESDtrack::kITSpureSA)) trITSSApure++;
+    else                                  trITSTPC++;
+  }
+  //
+}
+
+Bool_t AliESDEvent::IsPileupFromSPDInMultBins() const {
+    Int_t nTracklets=GetMultiplicity()->GetNumberOfTracklets();
+    if(nTracklets<20) return IsPileupFromSPD(3,0.8);
+    else if(nTracklets<50) return IsPileupFromSPD(4,0.8);
+    else return IsPileupFromSPD(5,0.8);
+}
+
+void  AliESDEvent::SetTOFHeader(const AliTOFHeader *header)
+{
+  //
+  // Set the TOF event_time
+  //
+
+  if (fTOFHeader) {
+    *fTOFHeader=*header;
+    //fTOFHeader->SetName(fgkESDListName[kTOFHeader]);
+  }
+  else {
+    // for analysis of reconstructed events
+    // when this information is not avaliable
+    fTOFHeader = new AliTOFHeader(*header);
+    //AddObject(fTOFHeader);
+  }
+
+}
+
+AliCentrality* AliESDEvent::GetCentrality()
+{
+    if (!fCentrality) fCentrality = new AliCentrality();
+    return  fCentrality;
+}
+
+AliEventplane* AliESDEvent::GetEventplane()
+{
+    if (!fEventplane) fEventplane = new AliEventplane();
+    return  fEventplane;
+}