ECCE @ EIC Software
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
PrimaryGeneratorAction.cc
Go to the documentation of this file. Or view the newest version in sPHENIX GitHub for file PrimaryGeneratorAction.cc
1 //
2 // ********************************************************************
3 // * License and Disclaimer *
4 // * *
5 // * The Geant4 software is copyright of the Copyright Holders of *
6 // * the Geant4 Collaboration. It is provided under the terms and *
7 // * conditions of the Geant4 Software License, included in the file *
8 // * LICENSE and available at http://cern.ch/geant4/license . These *
9 // * include a list of copyright holders. *
10 // * *
11 // * Neither the authors of this software system, nor their employing *
12 // * institutes,nor the agencies providing financial support for this *
13 // * work make any representation or warranty, express or implied, *
14 // * regarding this software system or assume any liability for its *
15 // * use. Please see the license in the file LICENSE and URL above *
16 // * for the full disclaimer and the limitation of liability. *
17 // * *
18 // * This code implementation is the result of the scientific and *
19 // * technical work of the GEANT4 collaboration. *
20 // * By using, copying, modifying or distributing the software (or *
21 // * any work based on the software) you agree to acknowledge its *
22 // * use in resulting scientific publications, and indicate your *
23 // * acceptance of all terms of the Geant4 Software license. *
24 // ********************************************************************
25 //
26 // This example is provided by the Geant4-DNA collaboration
27 // Any report or published results obtained using the Geant4-DNA software
28 // shall cite the following Geant4-DNA collaboration publication:
29 // Med. Phys. 37 (2010) 4692-4708
30 // Delage et al. PDB4DNA: implementation of DNA geometry from the Protein Data
31 // Bank (PDB) description for Geant4-DNA Monte-Carlo
32 // simulations (submitted to Comput. Phys. Commun.)
33 // The Geant4-DNA web site is available at http://geant4-dna.org
34 //
35 //
38 
39 #include "PrimaryGeneratorAction.hh"
40 
41 #include "G4Box.hh"
42 #include "G4Event.hh"
43 #include "G4LogicalVolume.hh"
44 #include "G4LogicalVolumeStore.hh"
45 #include "G4ParticleDefinition.hh"
46 #include "G4ParticleGun.hh"
47 #include "G4ParticleTable.hh"
48 #include "G4PhysicalConstants.hh"
49 #include "G4PhysicalVolumeStore.hh"
50 #include "G4SystemOfUnits.hh"
51 
52 #include "Randomize.hh"
53 
54 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
55 
58 {
59  G4int n_particle = 1;
60  fpParticleGun = new G4ParticleGun(n_particle);
61 
62  // default particle kinematic
63 
70 }
71 
72 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
73 
75 {
76  delete fpParticleGun;
77 }
78 
79 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
80 
82 {
83  // In order to avoid dependence of PrimaryGeneratorAction
84  // on DetectorConstruction class we get world volume
85  // from G4LogicalVolumeStore
86  //
87  G4double boundXHalfLength = 0;
88  G4double boundYHalfLength = 0;
89  G4double boundZHalfLength = 0;
90 
91  G4VPhysicalVolume* boundPV
93 
94  G4ThreeVector boundPos;
95  if ( boundPV )
96  {
97  boundPos = boundPV->GetTranslation();
98  }
99 
100  G4LogicalVolume* boundLV
101  = G4LogicalVolumeStore::GetInstance()->GetVolume("BoundingLV");
102 
103  G4Box* boundBox = 0;
104  if ( boundLV )
105  {
106  boundBox = dynamic_cast< G4Box*>(boundLV->GetSolid());
107  }
108 
109  if ( boundBox )
110  {
111  boundXHalfLength = boundBox->GetXHalfLength();
112  boundYHalfLength = boundBox->GetYHalfLength();
113  boundZHalfLength = boundBox->GetZHalfLength();
114 
115  // Set gun position
116  // Select a starting position on a sphere including the target volume
117  //
118  G4double radius = std::sqrt(boundXHalfLength*boundXHalfLength+
119  boundYHalfLength*boundYHalfLength+
120  boundZHalfLength*boundZHalfLength);
121  G4double cosTheta = 2*G4UniformRand()-1;
122  G4double sinTheta = std::sqrt(1.-cosTheta*cosTheta);
124 
125  G4ThreeVector positionStart(boundPos.x()+radius*sinTheta*std::cos(phi),
126  boundPos.y()+radius*sinTheta*std::sin(phi),
127  boundPos.z()+radius*cosTheta);
128 
129  fpParticleGun->SetParticlePosition(positionStart);
130 
131  // Set gun direction
132  // To compute the direction, select a point inside the target volume
133  //
134  G4ThreeVector positionDir(
135  boundPos.x()+boundXHalfLength*(2*G4UniformRand()-1),
136  boundPos.y()+boundYHalfLength*(2*G4UniformRand()-1),
137  boundPos.z()+boundZHalfLength*(2*G4UniformRand()-1));
138 
140  (positionDir-positionStart).unit());
141  }
142  else
143  {
144  G4cerr << "Bounding volume not found." << G4endl;
145  G4cerr << "Default particle kinematic used" << G4endl;
146  }
147 
149 }