Geant4 Cross Reference

Cross-Referencing   Geant4
Geant4/examples/advanced/stim_pixe_tomography/src/Run.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 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
 29 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
 30 
 31 #include "Run.hh"
 32 
 33 #include "PrimaryGeneratorAction.hh"
 34 
 35 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
 36 Run::Run(G4bool isP, G4int nbProjs, G4int nbS, G4int nbP, G4int resumeProjIndex)
 37   : G4Run(),
 38     isPIXE(isP),
 39     fProjectionIndex(0),
 40     fSliceIndex(0),
 41     fPixelIndex(0),
 42     fNbProjections(nbProjs),
 43     fNbSlices(nbS),
 44     fNbPixels(nbP),
 45     fResumeProjIndex(resumeProjIndex)
 46 {}
 47 
 48 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
 49 
 50 Run::~Run() = default;
 51 
 52 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
 53 
 54 void Run::Merge(const G4Run* run)
 55 {
 56   G4cout << "--------------Merge is called---------------" << G4endl;
 57   const Run* localRun = static_cast<const Run*>(run);
 58 
 59   for (size_t i = 0; i != localRun->gammaAtExit.size(); i++) {
 60     gammaAtExit.push_back(localRun->gammaAtExit[i]);
 61   }
 62   for (size_t i = 0; i != localRun->gammaAtCreation.size(); i++) {
 63     gammaAtCreation.push_back(localRun->gammaAtCreation[i]);
 64   }
 65 
 66   for (size_t i = 0; i != localRun->protonAtExit.size(); i++) {
 67     protonAtExit.push_back(localRun->protonAtExit[i]);
 68   }
 69 
 70   G4Run::Merge(run);
 71 }
 72 
 73 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
 74 
 75 void Run::EndOfRun()
 76 {
 77   // Write X-ray data or proton data into files
 78   //    G4int runID = GetRunID();
 79   fProjectionIndex = GetCurrentProjection();
 80   fSliceIndex = GetCurrentSlice();
 81   fPixelIndex = GetCurrentPixel();
 82 
 83   RunInfo runInfo((uint8_t)fProjectionIndex, (uint16_t)fSliceIndex, (uint16_t)fPixelIndex);
 84 
 85   if (isPIXE) {
 86     runInfo.nbParticle = (uint32_t)gammaAtCreation.size();
 87     WriteFile("GammaAtCreation.dat", runInfo, gammaAtCreation);
 88 
 89     runInfo.nbParticle = (uint32_t)gammaAtExit.size();
 90     WriteFile("GammaAtExit.dat", runInfo, gammaAtExit);
 91   }
 92   else {
 93     runInfo.nbParticle = (uint32_t)protonAtExit.size();
 94     WriteFile("ProtonAtExit.dat", runInfo, protonAtExit);
 95   }
 96 
 97   ClearVecs();
 98 }
 99 
100 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
101 
102 G4bool Run::GetIsPIXE()
103 {
104   return isPIXE;
105 }
106 
107 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
108 
109 void Run::FillGammaAtExit(ParticleInfo gammaInfo)
110 {
111   gammaAtExit.push_back(gammaInfo);
112 }
113 
114 void Run::FillGammaAtCreation(ParticleInfo gammaInfo)
115 {
116   gammaAtCreation.push_back(gammaInfo);
117 }
118 
119 void Run::FillProtonAtExit(ParticleInfo protonInfo)
120 {
121   protonAtExit.push_back(protonInfo);
122 }
123 
124 void Run::ClearVecs()
125 {
126   if (gammaAtExit.size()) {
127     gammaAtExit.clear();
128   }
129   if (gammaAtCreation.size()) {
130     gammaAtCreation.clear();
131   }
132   if (protonAtExit.size()) {
133     protonAtExit.clear();
134   }
135 }
136 
137 void Run::WriteFile(const std::string fName, RunInfo& runInfo, std::vector<ParticleInfo>& vec)
138 {
139   std::ofstream ofs;
140   if (runID) {
141     ofs.open(fName.c_str(),
142              std::ios::out | std::ios::app | std::ios::binary);  // appendix
143   }
144   else {
145     // if runId ==0, delete the existing file and create a new file
146     ofs.open(fName.c_str(), std::ios::out | std::ios::trunc | std::ios::binary);
147   }
148   ofs.write((const char*)&runInfo, sizeof(RunInfo));
149   if (vec.size()) {
150     ofs.write((const char*)vec.data(), sizeof(ParticleInfo) * vec.size());
151   }
152 
153   ofs.close();
154 }
155 G4int Run::GetCurrentProjection()
156 {
157   if (fResumeProjIndex > fNbProjections - 1) {
158     G4Exception("fResumeProjIndex", "Run::GetCurrentProjection()", FatalException,
159                 "To resume a simulation, the start of index of projection must be lower than the "
160                 "maximal index");
161   }
162   G4int projIndex = fResumeProjIndex + runID / (fNbSlices * fNbPixels);
163   return projIndex;
164 }
165 G4int Run::GetCurrentSlice()
166 {
167   G4int remain = runID % (fNbSlices * fNbPixels);
168   return remain / fNbPixels;
169 }
170 
171 G4int Run::GetCurrentPixel()
172 {
173   G4int remain = runID % (fNbSlices * fNbPixels);
174   return remain % fNbPixels;
175 }
176 
177 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
178