#include <TFile.h>
#include <TParticle.h>
#include <TClonesArray.h>
-#include <TRefArray.h>
+//#include <TRefArray.h>
#include <TList.h>
#include <TArrayF.h>
fStack->GetEvent();
fNparticles = fStack->GetNtrack();
fNprimaries = fStack->GetNprimary();
+
Int_t iev = fHeader->GetEvent();
Int_t ievr = fHeader->GetEventNrInRun();
-
- AliInfo(Form("AliMCEvent# %5d %5d: Number of particles: %5d (all) %5d (primaries)\n",
+ AliDebug(1, 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 (fNparticles>0) fMCParticleMap->Expand(fNparticles);
}
else
- fMCParticleMap = new TRefArray(fNparticles);
+ fMCParticleMap = new TObjArray(fNparticles);
}
void AliMCEvent::ConnectTreeTR (TTree* tree)
delete fTRBuffer;
fTRBuffer = 0;
}
- if (fVertex) {
- delete fVertex;
- fVertex = 0;
- }
-
}
+#include <iostream>
+
void AliMCEvent::FinishEvent()
{
// Clean-up after event
//
- fStack->Reset(0);
+ if (fStack) fStack->Reset(0);
fMCParticles->Delete();
- fMCParticleMap->Clear();
- if (fTRBuffer)
+
+ if (fMCParticleMap)
+ fMCParticleMap->Clear();
+ if (fTRBuffer) {
fTRBuffer->Delete();
- fTrackReferences->Delete();
+ }
+ // fTrackReferences->Delete();
+ fTrackReferences->Clear();
fNparticles = -1;
fNprimaries = -1;
fStack = 0;
fTmpFileTR = new TFile("TrackRefsTmp.root", "recreate");
fTmpTreeTR = new TTree("TreeTR", "TrackReferences");
if (!fTRBuffer) fTRBuffer = new TClonesArray("AliTrackReference", 100);
- fTmpTreeTR->Branch("TrackReferences", "TClonesArray", &fTRBuffer, 32000, 0);
+ fTmpTreeTR->Branch("TrackReferences", "TClonesArray", &fTRBuffer, 64000, 0);
//
// Activate the used branches only. Otherwisw we get a bad memory leak.
- fTreeTR->SetBranchStatus("*", 0);
- fTreeTR->SetBranchStatus("AliRun.*", 1);
- fTreeTR->SetBranchStatus("ITS.*", 1);
- fTreeTR->SetBranchStatus("TPC.*", 1);
- fTreeTR->SetBranchStatus("TRD.*", 1);
- fTreeTR->SetBranchStatus("TOF.*", 1);
- fTreeTR->SetBranchStatus("FRAME.*", 1);
- fTreeTR->SetBranchStatus("MUON.*", 1);
+ if (fTreeTR) {
+ fTreeTR->SetBranchStatus("*", 0);
+ fTreeTR->SetBranchStatus("AliRun.*", 1);
+ fTreeTR->SetBranchStatus("ITS.*", 1);
+ fTreeTR->SetBranchStatus("TPC.*", 1);
+ fTreeTR->SetBranchStatus("TRD.*", 1);
+ fTreeTR->SetBranchStatus("TOF.*", 1);
+ fTreeTR->SetBranchStatus("FRAME.*", 1);
+ fTreeTR->SetBranchStatus("MUON.*", 1);
+ }
+
//
// Connect the active branches
TClonesArray* trefs[7];
// 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++;
+ if (ref) {
+ 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, rarray, i);
- mcParticle = dynamic_cast<AliMCParticle*>((*fMCParticles)[nentries]);
+ mcParticle = new ((*fMCParticles)[nentries]) AliMCParticle(particle, rarray, i);
fMCParticleMap->AddAt(mcParticle, i);
-
- TParticle* part = mcParticle->Particle();
- Int_t imo = part->GetFirstMother();
- Int_t id1 = part->GetFirstDaughter();
- Int_t id2 = part->GetLastDaughter();
- if (fPrimaryOffset > 0 || fSecondaryOffset > 0) {
- // Remapping of the mother and daughter indices
- if (imo < fNprimaries) {
- mcParticle->SetMother(imo + fPrimaryOffset);
- } else {
- mcParticle->SetMother(imo + fSecondaryOffset - fNprimaries);
- }
-
- if (id1 < fNprimaries) {
- mcParticle->SetFirstDaughter(id1 + fPrimaryOffset);
- mcParticle->SetLastDaughter (id2 + fPrimaryOffset);
- } else {
- mcParticle->SetFirstDaughter(id1 + fSecondaryOffset - fNprimaries);
- mcParticle->SetLastDaughter (id2 + fSecondaryOffset - fNprimaries);
- }
-
-
- if (i > fNprimaries) {
- mcParticle->SetLabel(i + fPrimaryOffset);
+ if (mcParticle) {
+ TParticle* part = mcParticle->Particle();
+ Int_t imo = part->GetFirstMother();
+ Int_t id1 = part->GetFirstDaughter();
+ Int_t id2 = part->GetLastDaughter();
+ if (fPrimaryOffset > 0 || fSecondaryOffset > 0) {
+ // Remapping of the mother and daughter indices
+ if (imo < fNprimaries) {
+ mcParticle->SetMother(imo + fPrimaryOffset);
+ } else {
+ mcParticle->SetMother(imo + fSecondaryOffset - fNprimaries);
+ }
+
+ if (id1 < fNprimaries) {
+ mcParticle->SetFirstDaughter(id1 + fPrimaryOffset);
+ mcParticle->SetLastDaughter (id2 + fPrimaryOffset);
+ } else {
+ mcParticle->SetFirstDaughter(id1 + fSecondaryOffset - fNprimaries);
+ mcParticle->SetLastDaughter (id2 + fSecondaryOffset - fNprimaries);
+ }
+
+
+ if (i > fNprimaries) {
+ mcParticle->SetLabel(i + fPrimaryOffset);
+ } else {
+ mcParticle->SetLabel(i + fSecondaryOffset - fNprimaries);
+ }
} else {
- mcParticle->SetLabel(i + fSecondaryOffset - fNprimaries);
+ mcParticle->SetFirstDaughter(id1);
+ mcParticle->SetLastDaughter (id2);
+ mcParticle->SetMother (imo);
}
-
-
- } else {
- mcParticle->SetFirstDaughter(id1);
- mcParticle->SetLastDaughter (id2);
- mcParticle->SetMother (imo);
}
-
} else {
mcParticle = dynamic_cast<AliMCParticle*>(fMCParticleMap->At(i));
}
-
-
return mcParticle;
}
while((event = (AliMCEvent*)next())) {
if (oldidx < (event->GetPrimaryOffset() + event->GetNumberOfPrimaries())) break;
}
- return (oldidx - event->GetPrimaryOffset());
+ if (event) {
+ return (oldidx - event->GetPrimaryOffset());
+ } else {
+ return (-1);
+ }
} else {
while((event = (AliMCEvent*)next())) {
if (oldidx < (event->GetSecondaryOffset() + (event->GetNumberOfTracks() - event->GetNumberOfPrimaries()))) break;
}
- return (oldidx - event->GetSecondaryOffset() + event->GetNumberOfPrimaries());
+ if (event) {
+ return (oldidx - event->GetSecondaryOffset() + event->GetNumberOfPrimaries());
+ } else {
+ return (-1);
+ }
}
}
}
}
}
+
void AliMCEvent::PreReadAll()
{
// Preread the MC information
{
GetTrack(i);
}
-
-
}
-
const AliVVertex * AliMCEvent::GetPrimaryVertex() const
{
// Create a MCVertex object from the MCHeader information
+ TArrayF v;
+ GenEventHeader()->PrimaryVertex(v) ;
if (!fVertex) {
- TArrayF v;
- GenEventHeader()->PrimaryVertex(v) ;
fVertex = new AliMCVertex(v[0], v[1], v[2]);
+ } else {
+ ((AliMCVertex*) fVertex)->SetPosition(v[0], v[1], v[2]);
}
-
return fVertex;
}