]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - STEER/AliMCEvent.cxx
Reduce memory used by SDD calibration objects in OCDB (F. Prino)
[u/mrichter/AliRoot.git] / STEER / AliMCEvent.cxx
index 59ff7af5e81bcfa7dddbc470397bcf848957fafd..fe1775601d4024d6a9a45aedc71f1c1408e74270 100644 (file)
 #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():
@@ -41,7 +42,8 @@ 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),
@@ -57,12 +59,13 @@ AliMCEvent::AliMCEvent(const AliMCEvent& mcEvnt) :
     fMCParticles(0),
     fMCParticleMap(0),
     fHeader(0),
+    fTRBuffer(0),
     fTrackReferences(0),
     fTreeTR(0),
     fTmpTreeTR(0),
     fTmpFileTR(0),
     fNprimaries(-1),
-    fNparticles(-1) 
+    fNparticles(-1)
 { 
 // Copy constructor
 }
@@ -94,16 +97,20 @@ void AliMCEvent::ConnectTreeK (TTree* tree)
     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)
@@ -120,7 +127,7 @@ void AliMCEvent::ConnectTreeTR (TTree* tree)
        ReorderAndExpandTreeTR();
     } else {
        // New format 
-       fTreeTR->SetBranchAddress("TrackReferences", &fTrackReferences);
+       fTreeTR->SetBranchAddress("TrackReferences", &fTRBuffer);
     }
 }
 
@@ -136,7 +143,7 @@ Int_t AliMCEvent::GetParticleAndTR(Int_t i, TParticle*& particle, TClonesArray*&
     particle = fStack->Particle(i);
     if (fTreeTR) {
        fTreeTR->GetEntry(fStack->TreeKEntry(i));
-       trefs    = fTrackReferences;
+       trefs    = fTRBuffer;
        return trefs->GetEntries();
     } else {
        trefs = 0;
@@ -148,29 +155,35 @@ Int_t AliMCEvent::GetParticleAndTR(Int_t i, TParticle*& particle, TClonesArray*&
 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)
 {
     //
@@ -186,14 +199,14 @@ 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);
     }
@@ -213,7 +226,7 @@ void AliMCEvent::DrawCheck(Int_t i, Int_t search)
     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);
@@ -232,8 +245,8 @@ void AliMCEvent::ReorderAndExpandTreeTR()
 
     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);
     
 
 //
@@ -357,14 +370,14 @@ void AliMCEvent::ReorderAndExpandTreeTR()
                        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
@@ -392,8 +405,8 @@ void AliMCEvent::ReorderAndExpandTreeTR()
                    
                    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
@@ -401,7 +414,7 @@ void AliMCEvent::ReorderAndExpandTreeTR()
        } // entries
        it++;
        fTmpTreeTR->Fill();
-       fTrackReferences->Clear();
+       fTRBuffer->Delete();
        ifills++;
     } // tracks
     // Check
@@ -429,9 +442,11 @@ void AliMCEvent::ReorderAndExpandTreeTR()
 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"));
@@ -440,21 +455,37 @@ AliMCParticle* AliMCEvent::GetTrack(Int_t i) const
     }
     
 
-    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)