Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/examples/advanced/lAr_calorimeter/src/FCALPrimaryGeneratorAction.cc

Version: [ ReleaseNotes ] [ 1.0 ] [ 1.1 ] [ 2.0 ] [ 3.0 ] [ 3.1 ] [ 3.2 ] [ 4.0 ] [ 4.0.p1 ] [ 4.0.p2 ] [ 4.1 ] [ 4.1.p1 ] [ 5.0 ] [ 5.0.p1 ] [ 5.1 ] [ 5.1.p1 ] [ 5.2 ] [ 5.2.p1 ] [ 5.2.p2 ] [ 6.0 ] [ 6.0.p1 ] [ 6.1 ] [ 6.2 ] [ 6.2.p1 ] [ 6.2.p2 ] [ 7.0 ] [ 7.0.p1 ] [ 7.1 ] [ 7.1.p1 ] [ 8.0 ] [ 8.0.p1 ] [ 8.1 ] [ 8.1.p1 ] [ 8.1.p2 ] [ 8.2 ] [ 8.2.p1 ] [ 8.3 ] [ 8.3.p1 ] [ 8.3.p2 ] [ 9.0 ] [ 9.0.p1 ] [ 9.0.p2 ] [ 9.1 ] [ 9.1.p1 ] [ 9.1.p2 ] [ 9.1.p3 ] [ 9.2 ] [ 9.2.p1 ] [ 9.2.p2 ] [ 9.2.p3 ] [ 9.2.p4 ] [ 9.3 ] [ 9.3.p1 ] [ 9.3.p2 ] [ 9.4 ] [ 9.4.p1 ] [ 9.4.p2 ] [ 9.4.p3 ] [ 9.4.p4 ] [ 9.5 ] [ 9.5.p1 ] [ 9.5.p2 ] [ 9.6 ] [ 9.6.p1 ] [ 9.6.p2 ] [ 9.6.p3 ] [ 9.6.p4 ] [ 10.0 ] [ 10.0.p1 ] [ 10.0.p2 ] [ 10.0.p3 ] [ 10.0.p4 ] [ 10.1 ] [ 10.1.p1 ] [ 10.1.p2 ] [ 10.1.p3 ] [ 10.2 ] [ 10.2.p1 ] [ 10.2.p2 ] [ 10.2.p3 ] [ 10.3 ] [ 10.3.p1 ] [ 10.3.p2 ] [ 10.3.p3 ] [ 10.4 ] [ 10.4.p1 ] [ 10.4.p2 ] [ 10.4.p3 ] [ 10.5 ] [ 10.5.p1 ] [ 10.6 ] [ 10.6.p1 ] [ 10.6.p2 ] [ 10.6.p3 ] [ 10.7 ] [ 10.7.p1 ] [ 10.7.p2 ] [ 10.7.p3 ] [ 10.7.p4 ] [ 11.0 ] [ 11.0.p1 ] [ 11.0.p2 ] [ 11.0.p3, ] [ 11.0.p4 ] [ 11.1 ] [ 11.1.1 ] [ 11.1.2 ] [ 11.1.3 ] [ 11.2 ] [ 11.2.1 ] [ 11.2.2 ] [ 11.3.0 ]

  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 //
 27 // 
 28 
 29 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
 30 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
 31 
 32 #include <fstream>
 33 #include <cstdlib>
 34 
 35 #include "FCALPrimaryGeneratorAction.hh"
 36 
 37 #include "G4SystemOfUnits.hh"
 38 #include "G4Event.hh"
 39 #include "G4ParticleGun.hh"
 40 #include "G4ParticleTable.hh"
 41 #include "G4ParticleDefinition.hh"
 42 #include "Randomize.hh"
 43 #include "G4DataVector.hh"
 44 #include "G4AutoLock.hh"
 45 
 46 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
 47 
 48 
 49 // Migration to MT: there is a single input file that is read by all threads.
 50 // The idea is that the events are read by a single thread and processed
 51 // by all threads. Threads ask for the next ID to be processed. When
 52 // events are all processed we start over from the beginning of the file
 53 namespace {
 54     G4bool isFileRead = false;
 55     G4Mutex mFileRead = G4MUTEX_INITIALIZER;
 56     //Primary kinematics
 57     G4DataVector fX;
 58     G4DataVector fY;
 59     G4DataVector fZ;
 60     G4DataVector fCosX;
 61     G4DataVector fCosY;
 62     G4DataVector fCosZ;
 63     size_t nextEventId = 0;
 64     G4Mutex mNextEventId = G4MUTEX_INITIALIZER;
 65 
 66     size_t GetNextId() {
 67         G4AutoLock l(&mNextEventId);
 68         if ( nextEventId >= fX.size() ) //file data are over,  restart file
 69             {
 70                 G4Exception("FCALPrimaryGeneratorAction::GeneratePrimaries","lAr002",
 71                             JustWarning,"Data file with kinematics is over, restart it");
 72                 nextEventId=0;
 73             }
 74         return nextEventId++;
 75     }
 76     
 77     void ReadKinematicFromFile(G4double energy) {
 78         //Only one thread shoud read input file
 79         G4AutoLock l(&mFileRead);
 80         if ( isFileRead ) return;
 81         // Read Kinematics from file
 82         G4String file_name = "data-tracks/tracks-80GeV.dat";
 83         if (energy < 30*GeV)
 84             file_name = "data-tracks/tracks-20GeV.dat";
 85         else if (energy < 50*GeV)
 86             file_name = "data-tracks/tracks-40GeV.dat";
 87         else if (energy < 70*GeV)
 88             file_name = "data-tracks/tracks-60GeV.dat";
 89         else if (energy < 90*GeV)
 90             file_name = "data-tracks/tracks-80GeV.dat";
 91         else if (energy < 150*GeV)
 92             file_name = "data-tracks/tracks-120GeV.dat";
 93         else
 94             file_name = "data-tracks/tracks-200GeV.dat";
 95         std::ifstream Traks_file(file_name);
 96         if(!Traks_file)
 97         {
 98             G4ExceptionDescription ed;
 99             ed << "Failed to open file " << file_name << G4endl;
100             G4Exception("FCALPrimaryGeneratorAction::FCALPrimaryGeneratorAction()",
101                         "lAr001",FatalException,ed);
102         }
103         G4double xx=0,yy=0,zz=0,c1=0,c2=0,c3=0;
104         G4int iev = 0;
105         while(!(Traks_file.eof())) {
106             Traks_file >> iev >> xx >> yy >> zz >> c1 >> c2 >> c3;
107             fX.push_back(xx*cm);
108             fY.push_back(yy*cm);
109             fZ.push_back(zz*cm);
110             fCosX.push_back(c1);
111             fCosY.push_back(c2);
112             fCosZ.push_back(c3);
113         }
114         G4cout << "Read " << fX.size() << " events from file " << file_name << G4endl;
115         isFileRead= true;
116         Traks_file.close();
117         return;
118     }
119 }
120 
121 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
122 
123 FCALPrimaryGeneratorAction::FCALPrimaryGeneratorAction() : 
124   fVerbosity(0)
125 {
126   particleGun  = new G4ParticleGun();
127 
128   // default Particle
129   G4String particleName;
130   G4ParticleTable* particleTable = G4ParticleTable::GetParticleTable();  
131   G4ParticleDefinition* particle = particleTable->FindParticle(particleName="e-");
132   particleGun->SetParticleDefinition(particle);
133 
134   // default Energy
135   particleGun->SetParticleEnergy(20*GeV);
136 }
137 
138 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
139 
140 FCALPrimaryGeneratorAction::~FCALPrimaryGeneratorAction()
141 {
142   delete particleGun;
143 }
144 
145 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
146 
147 void FCALPrimaryGeneratorAction::GeneratePrimaries(G4Event* anEvent)
148 {
149   //this function is called at the begining of event
150   ReadKinematicFromFile(particleGun->GetParticleEnergy());
151     
152     //Get next event to be processed
153     size_t nEvent = GetNextId();
154     particleGun->SetParticlePosition(G4ThreeVector(fX[nEvent],fY[nEvent],fZ[nEvent]));
155   particleGun->SetParticleMomentumDirection(G4ThreeVector(-1.0*fCosX[nEvent],
156                 fCosY[nEvent],
157                 -1.0*fCosZ[nEvent]));
158 
159   particleGun->GeneratePrimaryVertex(anEvent);
160 
161   if (fVerbosity)
162     {
163         G4cout<< " Event  "<<anEvent->GetEventID()<< " Generated Vertex : "
164             <<anEvent->GetEventID() <<" (x,y,z)=(" << fX[nEvent] << ","
165             <<fY[nEvent] << "," << fZ[nEvent]<< ") (cosX,cosY,cosZ)=("
166             << -1.*fCosX[nEvent] << "," << fCosY[nEvent]
167             <<"," << -1.*fCosZ[nEvent] << ")"<<G4endl;
168     }
169 
170 }
171 
172 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo....
173 
174 
175