Geant4  10.03.p03
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
HadrontherapyMatrix.hh
Go to the documentation of this file.
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 // Hadrontherapy advanced example for Geant4
27 // See more at: https://twiki.cern.ch/twiki/bin/view/Geant4/AdvancedExamplesHadrontherapy
28 
29 #ifndef HadrontherapyMatrix_H
30 #define HadrontherapyMatrix_H 1
31 #include <G4ParticleDefinition.hh>
32 #include "globals.hh"
33 #include <vector>
34 #include <fstream>
35 
36 // The information: energy deposit and position in the phantom
37 // is stored in a matrix
38 
39 // type struct useful to store nucludes data
40 struct ion
41 {
42  G4bool isPrimary; // true if particle is primary
43  G4int PDGencoding; // Particle data group id for the particle
44  //G4String extName; // AZ[excitation energy]: like He3[1277.4], He4[0.0], Li7[231.4], ...
45  G4String name; // simple name without excitation energy: He3, He4, Li7, ...
46  std::string::size_type len; // name length
47  G4int Z; // atomic number
48  G4int A; // mass number
49  G4double *dose; // pointer to dose matrix
50  unsigned int *fluence; // pointer to fluence matrix
51  //friend bool operator<(const ion& a, const ion& b) {return (a.Z == b.Z) ? b.A < a.A : b.Z < a.Z ;}
52  G4bool operator<(const ion& a) const{return (this->Z == a.Z) ? this-> A < a.A : this->Z < a.Z ;}
53 };
54 
56 {
57 private:
58  HadrontherapyMatrix(G4int numberOfVoxelAlongX,
59  G4int numberOfVoxelAlongY,
60  G4int numberOfVoxelAlongZ,
61  G4double massOfVoxel); //< this is supposed to be a singleton
62 
63 
64 public:
65 
67  // Get object instance only
69  // Make & Get instance
70  static HadrontherapyMatrix* GetInstance(G4int nX, G4int nY, G4int nZ, G4double mass);
71 
72  static G4bool secondary;
73  // Full list of generated nuclides
74  void PrintNuclides();
75  // Hit array marker (useful to avoid multiple counts of fluence)
76  void ClearHitTrack();
77  G4int* GetHitTrack(G4int i, G4int j, G4int k);
78 
79  // All the elements of the matrix are initialised to zero
80  void Initialize();
81  void Clear();
82  // Fill DOSE/fluence matrix for particle:
83  // if fluence parameter is true then fluence at voxel (i, j, k) is increased
84  // else energyDeposit fill the dose matrix for voxel (i,j,k)
85  G4bool Fill(G4int, G4ParticleDefinition* particleDef, G4int i, G4int j, G4int k, G4double energyDeposit, G4bool fluence=false);
86 
87  // Fill TOTAL DOSE matrix for primary particles only
88  void Fill(G4int i, G4int j, G4int k, G4double energyDeposit);
89  // The matrix is filled with the energy deposit
90  // in the element corresponding to the voxel of the phantom where
91  // the energy deposit was registered
92 
93  // Store the information of the matrix in a ntuple and in
94  // a 1D Histogram
95  void TotalEnergyDeposit();
96 
97  // Store single matrix data to filename
98  void StoreMatrix(G4String file, void* data,size_t psize);
99  // Store all fluence data to filenames
100  void StoreFluenceData();
101  // Store all dose data to filenames
102  void StoreDoseData();
103 
104  // Store all data (except the total dose) to ONE filename
105  void StoreDoseFluenceAscii(G4String filename = "");
106 
107 #ifdef G4ANALYSIS_USE_ROOT
108  void StoreDoseFluenceRoot();
109 #endif
110 
111  inline G4int Index(G4int i, G4int j, G4int k) { return (i * numberOfVoxelAlongY + j) * numberOfVoxelAlongZ + k; }
112  // Get a unique index from a three dimensional one
113 
114  G4double * GetMatrix(){return matrix;}
115 
116  G4int GetNvoxel(){return numberOfVoxelAlongX*numberOfVoxelAlongY*numberOfVoxelAlongZ;}
117  // Total number of voxels read only access
118  G4int GetNumberOfVoxelAlongX(){return numberOfVoxelAlongX;}
119  G4int GetNumberOfVoxelAlongY(){return numberOfVoxelAlongY;}
120  G4int GetNumberOfVoxelAlongZ(){return numberOfVoxelAlongZ;}
121 private:
122 
123  static HadrontherapyMatrix* instance;
124  G4int numberOfVoxelAlongX;
125  G4int numberOfVoxelAlongY;
126  G4int numberOfVoxelAlongZ;
127  G4double massOfVoxel;
128 
129  G4double* matrix;
130  G4int* hitTrack;
131  G4String stdFile, filename;
132  std::ofstream ofs;
133 
134  // Dose&fluence data store
135  std::vector <ion> ionStore;
136  // want secondary particles?
137  G4double doseUnit;
138 };
139 #endif
140 
std::string::size_type len
G4String name
G4bool operator<(const ion &a) const
G4double * dose
std::vector< ExP01TrackerHit * > a
Definition: ExP01Classes.hh:33
G4int Index(G4int i, G4int j, G4int k)
void StoreDoseFluenceAscii(G4String filename="")
int G4int
Definition: G4Types.hh:78
const XML_Char const XML_Char * data
Definition: expat.h:268
static HadrontherapyMatrix * GetInstance()
void StoreMatrix(G4String file, void *data, size_t psize)
unsigned int * fluence
bool G4bool
Definition: G4Types.hh:79
G4int * GetHitTrack(G4int i, G4int j, G4int k)
G4bool Fill(G4int, G4ParticleDefinition *particleDef, G4int i, G4int j, G4int k, G4double energyDeposit, G4bool fluence=false)
G4int PDGencoding
double G4double
Definition: G4Types.hh:76
G4bool isPrimary