]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - EVGEN/AliGenCocktailAfterBurner.cxx
coverity fix
[u/mrichter/AliRoot.git] / EVGEN / AliGenCocktailAfterBurner.cxx
index edc5ddaa30e4e7ee153c41cdd0944c23c76fd881..947b203b45e1e96e08079236d3a25813590cc1f1 100644 (file)
@@ -43,6 +43,7 @@
 #include "AliCollisionGeometry.h"
 #include "AliStack.h"
 #include "AliMC.h"
+#include "AliRun.h"
 
 
 ClassImp(AliGenCocktailAfterBurner)
@@ -51,10 +52,11 @@ ClassImp(AliGenCocktailAfterBurner)
 
     AliGenCocktailAfterBurner::AliGenCocktailAfterBurner():
        fNAfterBurners(0),
-       fAfterBurnerEntries(new TList()),
+       fAfterBurnerEntries(0),
        fGenerationDone(kFALSE),
        fInternalStacks(0),
        fCollisionGeometries(0),
+       fHeaders(0),
        fCurrentEvent(0),
        fActiveStack(0),
        fActiveEvent(-1),
@@ -80,7 +82,17 @@ AliGenCocktailAfterBurner::~AliGenCocktailAfterBurner()
        delete fInternalStacks;
     }
     if (fAfterBurnerEntries) delete fAfterBurnerEntries; //delete entries
-    delete[] fCollisionGeometries;
+    Int_t numberOfEvents = AliRunLoader::Instance()->GetNumberOfEventsPerRun();
+    if (fCollisionGeometries) {
+      for (Int_t i = 0; i < (numberOfEvents + fNBgEvents); i++)
+       if (fCollisionGeometries[i]) delete fCollisionGeometries[i];
+      delete[] fCollisionGeometries;
+    }
+    if (fHeaders) {
+      for (Int_t i = 0; i < (numberOfEvents + fNBgEvents); i++)
+       if (fHeaders[i]) delete fHeaders[i];
+      delete[] fHeaders;
+    }
   }
 /*********************************************************************/ 
 /*********************************************************************/ 
@@ -111,6 +123,8 @@ AddAfterBurner(AliGenerator *AfterBurner, char* Name, Float_t RateExp)
     
     AliGenCocktailEntry *entry = 
        new AliGenCocktailEntry(AfterBurner, Name, RateExp);
+    if (!fAfterBurnerEntries) fAfterBurnerEntries = new TList();
+    
     fAfterBurnerEntries->Add(entry);
     fNAfterBurners++;
 //
@@ -122,6 +136,7 @@ AddAfterBurner(AliGenerator *AfterBurner, char* Name, Float_t RateExp)
 void AliGenCocktailAfterBurner::Init()
 {
 // Initialisation
+  Int_t numberOfEvents = AliRunLoader::Instance()->GetNumberOfEventsPerRun();
     fGenerationDone = kFALSE;
     if (fInternalStacks) //delete stacks
      { 
@@ -129,8 +144,17 @@ void AliGenCocktailAfterBurner::Init()
        fInternalStacks->Delete(); //clean after previous generation cycle
      }
 
-    if (fCollisionGeometries) delete[] fCollisionGeometries;
-    
+    if (fCollisionGeometries) {
+      for (Int_t i = 0; i < (numberOfEvents + fNBgEvents); i++)
+       if (fCollisionGeometries[i]) delete fCollisionGeometries[i];
+      delete[] fCollisionGeometries;
+    }
+    if (fHeaders) {
+      for (Int_t i = 0; i < (numberOfEvents + fNBgEvents); i++)
+       if (fHeaders[i]) delete fHeaders[i];
+      delete[] fHeaders;
+    }
+
     this->AliGenCocktail::Init(); 
     
     if (gDebug>0) cout<<"AliGenCocktailAfterBurner::Init"<<endl;
@@ -162,17 +186,7 @@ void AliGenCocktailAfterBurner::Generate()
           <<"#AliGenCocktailAfterBurner::Generate#"<<endl
           <<"#####################################"<<endl;
     // Initialize header
-    if (fHeader) delete fHeader;
-    fHeader = new AliGenCocktailEventHeader("Cocktail Header");
     //
-    //
-//  Generate the vertex position used by all generators
-//    
-    if(fVertexSmear == kPerEvent) Vertex();
-    TArrayF eventVertex;
-    eventVertex.Set(3);
-    for (Int_t j=0; j < 3; j++) eventVertex[j] = fVertex[j];
-
     Int_t i; //iterator
     AliStack * stack;
     
@@ -180,23 +194,32 @@ void AliGenCocktailAfterBurner::Generate()
     {//if generation is done (in first call) 
      //just copy particles from the stack to the gAlice
       SetTracks(++fCurrentEvent);
-      cout<<"Returning event "<<fCurrentEvent<<endl;
+      fHeader = fHeaders[fCurrentEvent];
+      gAlice->SetGenEventHeader(fHeader); 
+      cout<<"Returning event " << fCurrentEvent<<endl;
       return;  
     }
     else
     { //Here we are in the first call of the method
-      fCurrentEvent=0;
-      Int_t numberOfEvents = AliRunLoader::Instance()->GetNumberOfEventsPerRun();
-      cout << "Number of events per run" <<  numberOfEvents << endl;
-      
+       Int_t numberOfEvents = AliRunLoader::Instance()->GetNumberOfEventsPerRun();
+       cout << "Number of events per run" <<  numberOfEvents << endl;
+       TArrayF eventVertex;
+       eventVertex.Set(3 * (numberOfEvents + fNBgEvents));
+       fCurrentEvent=0;
       //Create stacks
-      fInternalStacks      = new TObjArray(numberOfEvents + fNBgEvents); //Create array of internal stacks
-      fCollisionGeometries = new AliCollisionGeometry*[numberOfEvents + fNBgEvents]; //Create array of collision geometries
-      for(i=0;i<numberOfEvents + fNBgEvents;i++) 
+       fInternalStacks      = new TObjArray(numberOfEvents + fNBgEvents); //Create array of internal stacks
+       fCollisionGeometries = new AliCollisionGeometry*[numberOfEvents + fNBgEvents]; //Create array of collision geometries
+       fHeaders             = new AliGenCocktailEventHeader*[numberOfEvents + fNBgEvents]; //Create array of headers   
+
+       for(i = 0; i < numberOfEvents + fNBgEvents; i++) 
        {       
-        stack = new AliStack(10000);
-        stack->Reset();
-        fInternalStacks->Add(stack);
+          stack = new AliStack(10000);
+          stack->Reset();
+          fInternalStacks->Add(stack);
+          Vertex();
+          for (Int_t j = 0; j < 3; j++) eventVertex[3 * i +  j] = fVertex[j];
+          fHeaders[i] = new AliGenCocktailEventHeader();
+          fCollisionGeometries[i] = 0;
        }
 /*********************************************************************/ 
       TIter next(fEntries);
@@ -213,7 +236,7 @@ void AliGenCocktailAfterBurner::Generate()
         cout<<"Generator "<<igen<<"  : "<<entry->GetName()<<endl;
 /***********************************************/
 //First generator for all evenets, than second for all events, etc...
-        for(i=0;i<numberOfEvents + fNBgEvents;i++) 
+        for(i = 0; i < numberOfEvents + fNBgEvents; i++) 
        {  
            cout<<"                  EVENT "<<i << endl;
             stack = GetStack(i);
@@ -228,15 +251,25 @@ void AliGenCocktailAfterBurner::Generate()
            {
                 entry->SetFirst((partArray->GetEntriesFast())+1);
            }
-           fCurrentGenerator->SetVertex(fVertex.At(0), fVertex.At(1), fVertex.At(2));
+           // Set the vertex for the generator
+           Int_t ioff = 3 * i;
+           fCurrentGenerator->SetVertex(eventVertex.At(ioff), eventVertex.At(ioff + 1), eventVertex.At(ioff + 2));
+           fHeader = fHeaders[i];
+           // Set the vertex for the cocktail
+           TArrayF v(3);
+           for (Int_t j=0; j<3; j++) v[j] = eventVertex.At(ioff + j);
+           fHeader->SetPrimaryVertex(v);
+           // Generate event
            fCurrentGenerator->Generate();
+           //
            entry->SetLast(partArray->GetEntriesFast());
            
-           if (fCurrentGenerator->ProvidesCollisionGeometry())  fCollisionGeometries[i] = fCurrentGenerator->CollisionGeometry();
-           
-       }
+           if (fCurrentGenerator->ProvidesCollisionGeometry())  
+             fCollisionGeometries[i] = 
+               new AliCollisionGeometry(*(fCurrentGenerator->CollisionGeometry()));
+       } // event loop
 /***********************************************/
-      }
+      } // generator loop
       next.Reset();
       while((entry = (AliGenCocktailEntry*)next())) 
         {
@@ -279,9 +312,9 @@ void AliGenCocktailAfterBurner::Generate()
        
 /*********************************************************************/
       // Pass the header to gAlice
-      fHeader->SetPrimaryVertex(eventVertex);
+      fHeader = fHeaders[0];
       gAlice->SetGenEventHeader(fHeader); 
-    }//else generated
+    } //else generated
 }
 /*********************************************************************/
 /*********************************************************************/ 
@@ -371,9 +404,7 @@ void AliGenCocktailAfterBurner::SetTracks(Int_t stackno)
 
       gAlice->GetMCApp()->PushTrack(done, parent, pdg, px, py, pz, e, vx, vy, vz, tof,polx, poly, polz, mech, ntr, weight);
 
-// ANDREAS MORSCH ---------------------------------------------------(
       SetHighWaterMark(ntr) ; 
-// ANDREAS MORSCH ---------------------------------------------------)
 
     }
 }