]> git.uio.no Git - u/mrichter/AliRoot.git/blobdiff - AliGeant4/AliPrimaryGeneratorAction.cxx
Tell the linker that the executable file should be loaded in the lower 31-bit address...
[u/mrichter/AliRoot.git] / AliGeant4 / AliPrimaryGeneratorAction.cxx
index d990a4a92293f28368440d1de07ce1c4941102d3..b8d72342b90345500d706ffdc4b2550d23513141 100644 (file)
@@ -1,6 +1,10 @@
 // $Id$
 // Category: run
 //
+// Author: I. Hrivnacova
+//
+// Class AliPrimaryGeneratorAction
+// -------------------------------
 // See the class description in the header file.
 
 #include "AliPrimaryGeneratorAction.h"
@@ -12,7 +16,7 @@
 #include "AliRun.h"
 #include "AliGenerator.h"
 
-#include "TG3Units.h"
+#include "TG4G3Units.h"
 
 #include <G4Event.hh>
 #include <G4ParticleTable.hh>
 
 #include <TParticle.h>
 
+//_____________________________________________________________________________
 AliPrimaryGeneratorAction::AliPrimaryGeneratorAction()
   : fGenerator(kAliGenerator),
     fNofGunParticles(1),
     fVerboseLevel(0),
-    fParticleArray(0)
-{
+    fMessenger(this),
+    fParticleGun() {
 //
-  fParticleGun = new AliParticleGun();
-  fMessenger = new AliPrimaryGeneratorMessenger(this);
-}
-
-AliPrimaryGeneratorAction::AliPrimaryGeneratorAction(
-                                    const AliPrimaryGeneratorAction& right) {
-//                                 
-  AliGlobals::Exception(
-    "AliPrimaryGeneratorAction is protected from copying.");
 }
 
+//_____________________________________________________________________________
 AliPrimaryGeneratorAction::~AliPrimaryGeneratorAction() {
 //
-  delete fMessenger;
-  delete fParticleGun;
-}
-
-// operators
-
-AliPrimaryGeneratorAction& 
-AliPrimaryGeneratorAction::operator=(const AliPrimaryGeneratorAction &right)
-{
-  // check assignement to self
-  if (this == &right) return *this;
-  
-  AliGlobals::Exception(
-    "AliPrimaryGeneratorAction is protected from assigning.");
-
-  return *this;
 }
 
 // private methods
 
+//_____________________________________________________________________________
 void AliPrimaryGeneratorAction::ConstructGenerator()
 {
 // Constructs selected generator.
 // ---
 
-  fParticleArray = 0;
   switch (fGenerator) { 
     case kGun:
       // gun is constructed interactively      
@@ -84,6 +65,7 @@ void AliPrimaryGeneratorAction::ConstructGenerator()
   }
 }   
       
+//_____________________________________________________________________________
 void AliPrimaryGeneratorAction::ConstructGeantinoGenerator(G4bool isCharged)
 {
 // Geantino with random momentum direction
@@ -91,7 +73,7 @@ void AliPrimaryGeneratorAction::ConstructGeantinoGenerator(G4bool isCharged)
 // ---
 
   // reset gun
-  fParticleGun->Reset();     
+  fParticleGun.Reset();     
 
   G4ParticleTable* particleTable 
     = G4ParticleTable::GetParticleTable();
@@ -126,13 +108,14 @@ void AliPrimaryGeneratorAction::ConstructGeantinoGenerator(G4bool isCharged)
       = new AliGunParticle(particleDef, momentumDir, energy, position, time, 
               polarization);
 
-    fParticleGun->AddParticle(gunParticle);     
+    fParticleGun.AddParticle(gunParticle);     
   } 
   if (fVerboseLevel>1) { 
-    G4cout << "Geantino generator has been built." << endl; 
+    G4cout << "Geantino generator has been built." << G4endl; 
   }
 } 
             
+//_____________________________________________________________________________
 void AliPrimaryGeneratorAction::ConstructAliGenerator()
 {
 // Generator from AliRoot
@@ -146,11 +129,11 @@ void AliPrimaryGeneratorAction::ConstructAliGenerator()
     text = text + "   No AliGenerator is defined in gAlice.";
     AliGlobals::Exception(text);
   }  
-  // fill AliRun::fParticles array 
+  // fill AliRun::fParticleMap array 
   generator->Generate();
-  fParticleArray = gAlice->Particles();
 }
 
+//_____________________________________________________________________________
 void AliPrimaryGeneratorAction::GenerateAliGeneratorPrimaries(G4Event* event)
 {
 // Creates a new G4PrimaryVertex objects for each TParticle
@@ -163,89 +146,85 @@ void AliPrimaryGeneratorAction::GenerateAliGeneratorPrimaries(G4Event* event)
 
   G4int nofParticles = gAlice->GetNtrack();
   // add verbose
-  //G4cout << " nofParticles: " <<  nofParticles << endl;
+  //G4cout << " nofParticles: " <<  nofParticles << G4endl;
   for( G4int i=0; i<nofParticles; i++ ) {    
   
-    // get particle from TClonesArray
-    TObject* particleTObject
-      = fParticleArray->UncheckedAt(i);      
-    TParticle* particle
-      = dynamic_cast<TParticle*>(particleTObject);
-
-    // check particle type
-    if (!particle) {
-      G4String text =
-        "AliPrimaryGeneratorAction::GenerateAliGeneratorPrimaries\n";
-      text = text + "Unknown particle type";           
-      AliGlobals::Exception(text);
-    }  
-     
-    // get particle definition from G4ParticleTable
-    G4int pdgEncoding = particle->GetPdgCode();
-    G4ParticleTable* particleTable 
-      = G4ParticleTable::GetParticleTable();                
-    G4ParticleDefinition* particleDefinition = 0;    
-    if (pdgEncoding != 0) 
-      particleDefinition = particleTable->FindParticle(pdgEncoding);
-    else {
-      G4String name = particle->GetName();
-      if (name == "Rootino")   
-        particleDefinition = particleTable->FindParticle("geantino");
-    }  
+    // get the particle from AliRun stack
+    TParticle* particle = gAlice->Particle(i);
+
+    
+    if (!particle->TestBit(kDoneBit)) {
+      // only particles that didn't die (decay) in primary generator
+      // will be transformed to G4 objects   
+
+      // get particle definition from G4ParticleTable
+      G4int pdgEncoding = particle->GetPdgCode();
+      G4ParticleTable* particleTable 
+        = G4ParticleTable::GetParticleTable();                        
+      G4ParticleDefinition* particleDefinition = 0;      
+      if (pdgEncoding != 0) 
+        particleDefinition = particleTable->FindParticle(pdgEncoding);
+      else {
+        G4String name = particle->GetName();
+        if (name == "Rootino") 
+            particleDefinition = particleTable->FindParticle("geantino");
+      }        
   
-    if (particleDefinition==0) {
-      G4cout << "pdgEncoding: " << pdgEncoding << endl;
-      G4String text = 
-        "AliPrimaryGeneratorAction::GenerateAliGeneratorPrimaries:\n";
-      text = text + "   G4ParticleTable::FindParticle() failed.";
-      AliGlobals::Exception(text);
-    }  
-
-    // get/create vertex
-    G4ThreeVector position 
-      = G4ThreeVector(particle->Vx()*TG3Units::Length(),
-                      particle->Vy()*TG3Units::Length(),
-                     particle->Vz()*TG3Units::Length());
-    G4double time = particle->T()*TG3Units::Time(); 
-    G4PrimaryVertex* vertex;
-    if ( i==0 || position != previousPosition || time != previousTime ) {   
-      // create a new vertex 
-      // in case position and time of gun particle are different from 
-      // previous values
-      // (vertex objects are destroyed in G4EventManager::ProcessOneEvent()
-      // when event is deleted)  
-      vertex = new G4PrimaryVertex(position, time);
-      event->AddPrimaryVertex(vertex);
-
-      previousVertex = vertex;
-      previousPosition = position;
-      previousTime = time;
-    }
-    else 
-      vertex = previousVertex;
-
-    // create a primary particle and add it to the vertex
-    // (primaryParticle objects are destroyed in G4EventManager::ProcessOneEvent()
-    // when event and then vertex is deleted)
-    G4double px = particle->Px()*TG3Units::Energy();
-    G4double py = particle->Py()*TG3Units::Energy();
-    G4double pz = particle->Pz()*TG3Units::Energy();
-    G4PrimaryParticle* primaryParticle 
-      = new G4PrimaryParticle(particleDefinition, px, py, pz);
-      
-    // set polarization
-    TVector3 polarization;
-    particle->GetPolarisation(polarization);
-    primaryParticle
-      ->SetPolarization(polarization.X(), polarization.Y(), polarization.Z());    
+      if (particleDefinition==0) {
+        G4cout << "pdgEncoding: " << pdgEncoding << G4endl;
+        G4String text = 
+            "AliPrimaryGeneratorAction::GenerateAliGeneratorPrimaries:\n";
+        text = text + "   G4ParticleTable::FindParticle() failed.";
+        AliGlobals::Exception(text);
+      }        
+
+      // get/create vertex
+      G4ThreeVector position 
+        = G4ThreeVector(particle->Vx()*TG4G3Units::Length(),
+                        particle->Vy()*TG4G3Units::Length(),
+                       particle->Vz()*TG4G3Units::Length());
+      G4double time = particle->T()*TG4G3Units::Time(); 
+      G4PrimaryVertex* vertex;
+      if ( i==0 || position != previousPosition || time != previousTime ) {   
+        // create a new vertex 
+        // in case position and time of gun particle are different from 
+        // previous values
+        // (vertex objects are destroyed in G4EventManager::ProcessOneEvent()
+        // when event is deleted)  
+        vertex = new G4PrimaryVertex(position, time);
+        event->AddPrimaryVertex(vertex);
+
+        previousVertex = vertex;
+        previousPosition = position;
+        previousTime = time;
+      }
+      else 
+        vertex = previousVertex;
+
+      // create a primary particle and add it to the vertex
+      // (primaryParticle objects are destroyed in G4EventManager::ProcessOneEvent()
+      // when event and then vertex is deleted)
+      G4double px = particle->Px()*TG4G3Units::Energy();
+      G4double py = particle->Py()*TG4G3Units::Energy();
+      G4double pz = particle->Pz()*TG4G3Units::Energy();
+      G4PrimaryParticle* primaryParticle 
+        = new G4PrimaryParticle(particleDefinition, px, py, pz);
+        
+      // set polarization
+      TVector3 polarization;
+      particle->GetPolarisation(polarization);
+      primaryParticle
+        ->SetPolarization(polarization.X(), polarization.Y(), polarization.Z());    
     
-    // add primary particle to the vertex
-    vertex->SetPrimary(primaryParticle);
+      // add primary particle to the vertex
+      vertex->SetPrimary(primaryParticle);
+    }   
   }
 }
 
 // public methods
 
+//_____________________________________________________________________________
 void AliPrimaryGeneratorAction::GeneratePrimaries(G4Event* event)
 {
 // Generates primary particles by the selected generator.
@@ -258,7 +237,7 @@ void AliPrimaryGeneratorAction::GeneratePrimaries(G4Event* event)
   ConstructGenerator();
   
   // generate primary vertices
-  if (fParticleArray)  {
+  if (fGenerator == kAliGenerator)  {
     // use AliGenerator if set
     GenerateAliGeneratorPrimaries(event);
 
@@ -266,19 +245,20 @@ void AliPrimaryGeneratorAction::GeneratePrimaries(G4Event* event)
     // (they would be stored twice)
     AliTrackingAction* trackingAction
       =  AliTrackingAction::Instance();
-    trackingAction->SetSavePrimaries(false);
+    if (trackingAction) trackingAction->SetSavePrimaries(false);
   }  
   else {
     // use particle gun otherwise
-    fParticleGun->GeneratePrimaryVertex(event);
+    fParticleGun.GeneratePrimaryVertex(event);
 
     // primary particles have to be saved
     AliTrackingAction* trackingAction
       =  AliTrackingAction::Instance();
-    trackingAction->SetSavePrimaries(true);
+    if (trackingAction) trackingAction->SetSavePrimaries(true);
   }  
 }
 
+//_____________________________________________________________________________
 void AliPrimaryGeneratorAction::SetGenerator(AliPrimaryGenerator generator)
 { 
 // Sets generator.
@@ -287,6 +267,7 @@ void AliPrimaryGeneratorAction::SetGenerator(AliPrimaryGenerator generator)
   fGenerator = generator; 
 }
 
+//_____________________________________________________________________________
 void AliPrimaryGeneratorAction::SetNofGunParticles(G4int nofParticles)
 { 
 // Sets number of primary particles.
@@ -296,9 +277,3 @@ void AliPrimaryGeneratorAction::SetNofGunParticles(G4int nofParticles)
 
   fNofGunParticles = nofParticles;
 }
-
-
-
-
-
-