///////////////////////////////////////////////////////////////////////////
#include <TObjArray.h>
+#include <TExMap.h>
+#include <TProcessID.h>
#include <AliVTrack.h>
#include <AliESDtrack.h>
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
//______________________________________________
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
//
fArrTrackP.Delete();
fArrTrackN.Delete();
- fArrVertexP.Delete();
- fArrVertexN.Delete();
+ fArrVertex.Delete();
fArrPairs.Delete();
}
//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){
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;
}
}
} 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;
}
}
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])
{
//
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);
+}