#include <TFile.h>
#include <TParticle.h>
#include <TClonesArray.h>
-#include <TObjArray.h>
+#include <TRefArray.h>
#include "AliLog.h"
#include "AliMCEvent.h"
#include "AliStack.h"
#include "AliTrackReference.h"
#include "AliHeader.h"
+#include "AliGenEventHeader.h"
AliMCEvent::AliMCEvent():
fMCParticles(new TClonesArray("AliMCParticle",1000)),
fMCParticleMap(0),
fHeader(0),
- fTrackReferences(0),
+ fTRBuffer(0),
+ fTrackReferences(new TClonesArray("AliTrackReference", 1000)),
fTreeTR(0),
fTmpTreeTR(0),
fTmpFileTR(0),
fMCParticles(0),
fMCParticleMap(0),
fHeader(0),
+ fTRBuffer(0),
fTrackReferences(0),
fTreeTR(0),
fTmpTreeTR(0),
fTmpFileTR(0),
fNprimaries(-1),
- fNparticles(-1)
+ fNparticles(-1)
{
// Copy constructor
}
fStack->GetEvent();
fNparticles = fStack->GetNtrack();
fNprimaries = fStack->GetNprimary();
- AliInfo(Form("AliMCEvent: Number of particles: %5d (all) %5d (primaries)\n",
- fNparticles, fNprimaries));
+ Int_t iev = fHeader->GetEvent();
+ Int_t ievr = fHeader->GetEventNrInRun();
+
+ AliInfo(Form("AliMCEvent# %5d %5d: Number of particles: %5d (all) %5d (primaries)\n",
+ iev, ievr, fNparticles, fNprimaries));
// This is a cache for the TParticles converted to MCParticles on user request
if (fMCParticleMap) {
fMCParticleMap->Clear();
- if (fNparticles>0) fMCParticleMap->Expand(fNparticles);}
+ fMCParticles->Delete();
+ if (fNparticles>0) fMCParticleMap->Expand(fNparticles);
+ }
else
- fMCParticleMap = new TObjArray(fNparticles);
- fMCParticles->Clear();
+ fMCParticleMap = new TRefArray(fNparticles);
}
void AliMCEvent::ConnectTreeTR (TTree* tree)
ReorderAndExpandTreeTR();
} else {
// New format
- fTreeTR->SetBranchAddress("TrackReferences", &fTrackReferences);
+ fTreeTR->SetBranchAddress("TrackReferences", &fTRBuffer);
}
}
particle = fStack->Particle(i);
if (fTreeTR) {
fTreeTR->GetEntry(fStack->TreeKEntry(i));
- trefs = fTrackReferences;
+ trefs = fTRBuffer;
return trefs->GetEntries();
} else {
trefs = 0;
void AliMCEvent::Clean()
{
// Clean-up before new trees are connected
-
if (fHeader) {
delete fHeader;
fHeader = 0;
}
-
- delete fStack;
+
+ delete fStack; fStack = 0;
// Clear TR
- if (fTrackReferences) {
- fTrackReferences->Clear();
- delete fTrackReferences;
- fTrackReferences = 0;
+ if (fTRBuffer) {
+ fTRBuffer->Delete();
+ delete fTRBuffer;
+ fTRBuffer = 0;
}
}
void AliMCEvent::FinishEvent()
{
- // Clean-up after event
- fStack->Reset(0);
+ // Clean-up after event
+ //
+ fStack->Reset(0);
+ fMCParticles->Delete();
+ fMCParticleMap->Clear();
+ if (fTRBuffer)
+ fTRBuffer->Delete();
+ fTrackReferences->Delete();
}
+
void AliMCEvent::DrawCheck(Int_t i, Int_t search)
{
//
AliWarning("AliMCEvent::GetEntry: Index out of range");
}
- Int_t nh = fTrackReferences->GetEntries();
+ Int_t nh = fTRBuffer->GetEntries();
if (search) {
while(nh <= search && i < fNparticles - 1) {
i++;
fTreeTR->GetEntry(fStack->TreeKEntry(i));
- nh = fTrackReferences->GetEntries();
+ nh = fTRBuffer->GetEntries();
}
printf("Found Hits at %5d\n", i);
}
a->Draw();
for (Int_t ih = 0; ih < nh; ih++) {
- AliTrackReference* ref = (AliTrackReference*) fTrackReferences->At(ih);
+ AliTrackReference* ref = (AliTrackReference*) fTRBuffer->At(ih);
TMarker* m = new TMarker(ref->X(), ref->Y(), 20);
m->Draw();
m->SetMarkerSize(0.4);
fTmpFileTR = new TFile("TrackRefsTmp.root", "recreate");
fTmpTreeTR = new TTree("TreeTR", "TrackReferences");
- if (!fTrackReferences) fTrackReferences = new TClonesArray("AliTrackReference", 100);
- fTmpTreeTR->Branch("TrackReferences", "TClonesArray", &fTrackReferences, 32000, 0);
+ if (!fTRBuffer) fTRBuffer = new TClonesArray("AliTrackReference", 100);
+ fTmpTreeTR->Branch("TrackReferences", "TClonesArray", &fTRBuffer, 32000, 0);
//
if (label == id) {
// secondary found
tr->SetDetectorId(ib-1);
- Int_t nref = fTrackReferences->GetEntriesFast();
- TClonesArray &lref = *fTrackReferences;
+ Int_t nref = fTRBuffer->GetEntriesFast();
+ TClonesArray &lref = *fTRBuffer;
new(lref[nref]) AliTrackReference(*tr);
}
} // hits
} // branches
fTmpTreeTR->Fill();
- fTrackReferences->Clear();
+ fTRBuffer->Delete();
ifills++;
} // daughters
} // has hits
if (label == ip) {
tr->SetDetectorId(ib-1);
- Int_t nref = fTrackReferences->GetEntriesFast();
- TClonesArray &lref = *fTrackReferences;
+ Int_t nref = fTRBuffer->GetEntriesFast();
+ TClonesArray &lref = *fTRBuffer;
new(lref[nref]) AliTrackReference(*tr);
}
} // hits
} // entries
it++;
fTmpTreeTR->Fill();
- fTrackReferences->Clear();
+ fTRBuffer->Delete();
ifills++;
} // tracks
// Check
AliMCParticle* AliMCEvent::GetTrack(Int_t i) const
{
// Get MC Particle i
- AliMCParticle *mcParticle;
- TParticle *particle;
-
+ AliMCParticle *mcParticle = 0;
+ TParticle *particle = 0;
+ TClonesArray *trefs = 0;
+ Int_t ntref = 0;
+ TRefArray *rarray = 0;
// Out of range check
if (i < 0 || i >= fNparticles) {
AliWarning(Form("AliMCEvent::GetEntry: Index out of range"));
}
- particle = fStack->Particle(i);
//
// First check of the MC Particle has been already cached
if(!fMCParticleMap->At(i)) {
+ // Get particle from the stack
+ particle = fStack->Particle(i);
+ // Get track references from Tree TR
+ if (fTreeTR) {
+ fTreeTR->GetEntry(fStack->TreeKEntry(i));
+ trefs = fTRBuffer;
+ ntref = trefs->GetEntriesFast();
+ rarray = new TRefArray(ntref);
+ Int_t nen = fTrackReferences->GetEntriesFast();
+ for (Int_t j = 0; j < ntref; j++) {
+ // Save the track references in a TClonesArray
+ AliTrackReference* ref = dynamic_cast<AliTrackReference*>((*fTRBuffer)[j]);
+ // Save the pointer in a TRefArray
+ new ((*fTrackReferences)[nen]) AliTrackReference(*ref);
+ rarray->AddAt((*fTrackReferences)[nen], j);
+ nen++;
+ } // loop over track references for entry i
+ } // if TreeTR available
Int_t nentries = fMCParticles->GetEntriesFast();
- new ((*fMCParticles)[nentries]) AliMCParticle(particle);
+ new ((*fMCParticles)[nentries]) AliMCParticle(particle, rarray, i);
mcParticle = dynamic_cast<AliMCParticle*>((*fMCParticles)[nentries]);
fMCParticleMap->AddAt(mcParticle, i);
} else {
mcParticle = dynamic_cast<AliMCParticle*>(fMCParticleMap->At(i));
}
-
return mcParticle;
}
-inline AliGenEventHeader* AliMCEvent::GenEventHeader() {return (fHeader->GenEventHeader());}
+ AliGenEventHeader* AliMCEvent::GenEventHeader() {return (fHeader->GenEventHeader());}
ClassImp(AliMCEvent)