]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - PWGDQ/dielectron/AliDielectronEvent.cxx
Merge remote-tracking branch 'origin/master' into flatdev
[u/mrichter/AliRoot.git] / PWGDQ / dielectron / AliDielectronEvent.cxx
index d5b7bf7e138a117f85547b79c0d999f34d38c0c9..91950a6d58e6f33ce783be57689f90d72f0aa553 100644 (file)
@@ -26,6 +26,8 @@ Detailed description
 ///////////////////////////////////////////////////////////////////////////
 
 #include <TObjArray.h>
+#include <TExMap.h>
+#include <TProcessID.h>
 
 #include <AliVTrack.h>
 #include <AliESDtrack.h>
@@ -37,15 +39,16 @@ ClassImp(AliDielectronEvent)
 
 AliDielectronEvent::AliDielectronEvent() :
   TNamed(),
-  fArrTrackP("AliESDtrack",1000),
-  fArrTrackN("AliESDtrack",1000),
-  fArrVertexP("AliAODVertex",1000),
-  fArrVertexN("AliAODVertex",1000),
+  fArrTrackP(),
+  fArrTrackN(),
+  fArrVertex("AliAODVertex",10),
   fArrPairs("AliKFParticle",0),
   fNTracksP(0),
   fNTracksN(0),
   fIsAOD(kFALSE),
-  fEventData()
+  fEventData(),
+  fPID(0x0),
+  fPIDIndex(0)
 {
   //
   // Default Constructor
@@ -56,15 +59,16 @@ AliDielectronEvent::AliDielectronEvent() :
 //______________________________________________
 AliDielectronEvent::AliDielectronEvent(const char* name, const char* title) :
   TNamed(name, title),
-  fArrTrackP("AliESDtrack",1000),
-  fArrTrackN("AliESDtrack",1000),
-  fArrVertexP("AliAODVertex",1000),
-  fArrVertexN("AliAODVertex",1000),
+  fArrTrackP(),
+  fArrTrackN(),
+  fArrVertex("AliAODVertex",10),
   fArrPairs("AliKFParticle",0),
   fNTracksP(0),
   fNTracksN(0),
   fIsAOD(kFALSE),
-  fEventData()
+  fEventData(),
+  fPID(0x0),
+  fPIDIndex(0)
 {
   //
   // Named Constructor
@@ -79,8 +83,7 @@ AliDielectronEvent::~AliDielectronEvent()
   //
   fArrTrackP.Delete();
   fArrTrackN.Delete();
-  fArrVertexP.Delete();
-  fArrVertexN.Delete();
+  fArrVertex.Delete();
   fArrPairs.Delete();
 }
 
@@ -101,13 +104,13 @@ void AliDielectronEvent::SetTracks(const TObjArray &arrP, const TObjArray &arrN,
   //check size of the arrays
   if (fArrTrackP.GetSize()<arrP.GetSize()) {
     fArrTrackP.Expand(arrP.GetSize());
-    fArrVertexP.Expand(arrP.GetSize());
   }
   if (fArrTrackN.GetSize()<arrN.GetSize()) {
     fArrTrackN.Expand(arrN.GetSize());
-    fArrVertexN.Expand(arrN.GetSize());
   }
 
+  TExMap mapStoredVertices;
+  fPIDIndex=TProcessID::GetPIDs()->IndexOf(fPID);
   // fill particles
   Int_t tracks=0;
   for (Int_t itrack=0; itrack<arrP.GetEntriesFast(); ++itrack){
@@ -120,8 +123,24 @@ void AliDielectronEvent::SetTracks(const TObjArray &arrP, const TObjArray &arrN,
       AliAODTrack *track=dynamic_cast<AliAODTrack*>(arrP.At(itrack));
       if (!track) continue;
 
-      new (fArrTrackP[tracks]) AliAODTrack(*track);
-      new (fArrVertexP[tracks]) AliAODVertex(*(track->GetProdVertex()));
+      // buffer track
+      AliAODTrack   *ctrack = new (fArrTrackP[tracks]) AliAODTrack(*track);
+
+      // buffer vertex, don't duplicate
+      // most particles will be assiciated to the primary vertex ...
+      AliAODVertex *vtx=track->GetProdVertex();
+      AliAODVertex *cvertex = 0x0;
+      if (vtx){
+        cvertex = reinterpret_cast<AliAODVertex*>(mapStoredVertices.GetValue(reinterpret_cast<ULong64_t>(vtx)));
+        if (!cvertex) {
+          if (mapStoredVertices.Capacity()<=mapStoredVertices.GetSize()) mapStoredVertices.Expand(2*mapStoredVertices.GetSize());
+          if (fArrVertex.GetSize()<=fArrVertex.GetEntriesFast()) fArrVertex.Expand(2*fArrVertex.GetSize());
+          cvertex = new (fArrVertex[fArrVertex.GetEntriesFast()]) AliAODVertex(*vtx);
+          AssignID(cvertex);
+          mapStoredVertices.Add(reinterpret_cast<ULong64_t>(vtx),reinterpret_cast<ULong64_t>(cvertex));
+        }
+      }
+      ctrack->SetProdVertex(cvertex);
       ++tracks;
     }
   }
@@ -137,9 +156,25 @@ void AliDielectronEvent::SetTracks(const TObjArray &arrP, const TObjArray &arrN,
     } else {
       AliAODTrack *track=dynamic_cast<AliAODTrack*>(arrN.At(itrack));
       if (!track) continue;
+
+      //buffer track
+      AliAODTrack   *ctrack = new (fArrTrackN[tracks]) AliAODTrack(*track);
       
-      new (fArrTrackN[tracks]) AliAODTrack(*track);
-      new (fArrVertexN[tracks]) AliAODVertex(*(track->GetProdVertex()));
+      // buffer vertex, don't duplicate
+      // most particles will be assiciated to the primary vertex ...
+      AliAODVertex *vtx=track->GetProdVertex();
+      AliAODVertex *cvertex = 0x0;
+      if (vtx){
+        cvertex = reinterpret_cast<AliAODVertex*>(mapStoredVertices.GetValue(reinterpret_cast<ULong64_t>(vtx)));
+        if (!cvertex) {
+          if (mapStoredVertices.Capacity()<=mapStoredVertices.GetSize()) mapStoredVertices.Expand(2*mapStoredVertices.GetSize());
+          if (fArrVertex.GetSize()<=fArrVertex.GetEntriesFast()) fArrVertex.Expand(2*fArrVertex.GetSize());
+          cvertex = new (fArrVertex[fArrVertex.GetEntriesFast()]) AliAODVertex(*vtx);
+          AssignID(cvertex);
+          mapStoredVertices.Add(reinterpret_cast<ULong64_t>(vtx),reinterpret_cast<ULong64_t>(cvertex));
+        }
+      }
+      ctrack->SetProdVertex(cvertex);
       ++tracks;
     }
   }
@@ -159,29 +194,45 @@ void AliDielectronEvent::Clear(Option_t *opt)
 
   for (Int_t i=fArrTrackP.GetEntriesFast()-1; i>=0; --i){
     delete fArrTrackP.RemoveAt(i);
-    delete fArrVertexP.RemoveAt(i);
   }
   
   for (Int_t i=fArrTrackN.GetEntriesFast()-1; i>=0; --i){
     delete fArrTrackN.RemoveAt(i);
-    delete fArrVertexN.RemoveAt(i);
+  }
+
+  for (Int_t i=0; i<fArrVertex.GetEntriesFast(); ++i){
+    delete fArrVertex.RemoveAt(i);
   }
   
+  fArrTrackP.ExpandCreateFast(1);
+  fArrTrackN.ExpandCreateFast(1);
+  fArrVertex.ExpandCreateFast(1);
+
   fArrPairs.Clear(opt);
-  
 }
 
 //______________________________________________
-void AliDielectronEvent::SetAOD()
+void AliDielectronEvent::SetAOD(Int_t size)
 {
   //
   // use AOD as input
   //
-  //  fArrTrackP.SetClass("AliAODTrack"); //not needed since AODTracks are smaller than ESDtracks
-  //  fArrTrackN.SetClass("AliAODTrack");
+  fArrTrackP.SetClass("AliAODTrack",size);
+  fArrTrackN.SetClass("AliAODTrack",size);
   fIsAOD=kTRUE;
 }
 
+//______________________________________________
+void AliDielectronEvent::SetESD()
+{
+  //
+  // use ESD as input
+  //
+  fArrTrackP.SetClass("AliESDtrack",1000);
+  fArrTrackN.SetClass("AliESDtrack",1000);
+  fIsAOD=kFALSE;
+}
+
 //______________________________________________
 void AliDielectronEvent::SetEventData(const Double_t data[AliDielectronVarManager::kNMaxValues])
 {
@@ -190,3 +241,18 @@ void AliDielectronEvent::SetEventData(const Double_t data[AliDielectronVarManage
   //
   for (Int_t i=AliDielectronVarManager::kPairMax; i<AliDielectronVarManager::kNMaxValues;++i) fEventData[i]=data[i];
 }
+
+//______________________________________________
+void AliDielectronEvent::AssignID(TObject *obj)
+{
+  //
+  // Custom function to assign a uid to an object with an own process id
+  // to avoid problems buffering the vertices
+  //
+  UInt_t uid=1;
+  if (fPID->GetObjects()) uid=fPID->GetObjects()->GetEntriesFast();
+  uid+=(fPIDIndex<<24);
+  obj->SetBit(kIsReferenced);
+  obj->SetUniqueID(uid);
+  fPID->PutObjectWithID(obj);
+}