Geant4  10.02.p03
CML2ExpVoxels Class Reference

#include <ML2ExpVoxels.hh>

Collaboration diagram for CML2ExpVoxels:

Public Member Functions

 CML2ExpVoxels (G4bool bHasExperimentalData, G4int saving_in_Selected_Voxels_every_events, G4int seed, G4String FileExperimentalData, G4String FileExperimentalDataOut)
 
 ~CML2ExpVoxels (void)
 
void add (G4ThreeVector pos, G4double depEnergy, G4double density)
 
void add (const G4Step *aStep)
 
std::vector< SvoxelgetVoxels ()
 
G4int getMinNumberOfEvents ()
 
G4int getMaxNumberOfEvents ()
 
G4bool loadData ()
 
void setRecycling (int recycling)
 
void saveResults (void)
 
void resetNEventsInVoxels ()
 

Private Member Functions

void saveHeader ()
 
void calculateNormalizedEd (std::vector< Svoxel > &voxels)
 

Private Attributes

std::vector< Svoxelvoxels
 
G4intnVoxelsgeometry
 
G4ThreeVector minZone
 
G4ThreeVector maxZone
 
G4int nCurves
 
G4intstartCurve
 
G4intstopCurve
 
G4doublechi2Factor
 
G4String headerText1
 
G4String headerText2
 
G4String fullFileIn
 
G4String fullFileOut
 
G4String seedName
 
G4String loopName
 
SGeneralDatageneralData
 
G4int nParticle
 
G4int nTotalEvents
 
G4int saving_in_Selected_Voxels_every_events
 
G4int nRecycling
 
G4bool bHasExperimentalData
 

Detailed Description

Definition at line 51 of file ML2ExpVoxels.hh.

Constructor & Destructor Documentation

◆ CML2ExpVoxels()

CML2ExpVoxels::CML2ExpVoxels ( G4bool  bHasExperimentalData,
G4int  saving_in_Selected_Voxels_every_events,
G4int  seed,
G4String  FileExperimentalData,
G4String  FileExperimentalDataOut 
)

Definition at line 48 of file ML2ExpVoxels.cc.

49  :startCurve(0),
50  stopCurve(0),chi2Factor(0)
51 {
52  char a[10];
53  sprintf(a,"%d", seed);
54  seedName=(G4String)a;
56  nRecycling=1;
57 
58 
59  fullFileOut=FileExperimentalDataOut+seedName+".m";
60  fullFileIn=FileExperimentalData;
62 
63 // define the extremes of global-volume containing all experimental voxels
64  G4double extr=100000000000.;
65  minZone.set(extr, extr, extr);
66  maxZone.set(-extr, -extr, -extr);
68 }
void set(double x, double y, double z)
G4ThreeVector maxZone
Definition: ML2ExpVoxels.hh:74
G4int saving_in_Selected_Voxels_every_events
Definition: ML2ExpVoxels.hh:82
G4ThreeVector minZone
Definition: ML2ExpVoxels.hh:74
G4double * chi2Factor
Definition: ML2ExpVoxels.hh:77
G4bool bHasExperimentalData
Definition: ML2ExpVoxels.hh:83
G4String fullFileOut
Definition: ML2ExpVoxels.hh:78
G4String seedName
Definition: ML2ExpVoxels.hh:79
G4int nTotalEvents
Definition: ML2ExpVoxels.hh:82
G4String fullFileIn
Definition: ML2ExpVoxels.hh:78
G4int * startCurve
Definition: ML2ExpVoxels.hh:76
double G4double
Definition: G4Types.hh:76
G4int * stopCurve
Definition: ML2ExpVoxels.hh:76
Here is the call graph for this function:

◆ ~CML2ExpVoxels()

CML2ExpVoxels::~CML2ExpVoxels ( void  )

Definition at line 70 of file ML2ExpVoxels.cc.

71 {
72  delete [] startCurve;
73  delete [] stopCurve;
74  delete [] chi2Factor;
75  delete [] nVoxelsgeometry;
76 }
G4int * nVoxelsgeometry
Definition: ML2ExpVoxels.hh:73
G4double * chi2Factor
Definition: ML2ExpVoxels.hh:77
G4int * startCurve
Definition: ML2ExpVoxels.hh:76
G4int * stopCurve
Definition: ML2ExpVoxels.hh:76

Member Function Documentation

◆ add() [1/2]

void CML2ExpVoxels::add ( G4ThreeVector  pos,
G4double  depEnergy,
G4double  density 
)
Here is the caller graph for this function:

◆ add() [2/2]

void CML2ExpVoxels::add ( const G4Step *  aStep)

Definition at line 165 of file ML2ExpVoxels.cc.

166 {
168  G4double depEnergy, density, voxelVolume;
169 
170  pos=aStep->GetPreStepPoint()->GetPosition();
171  depEnergy=aStep->GetTotalEnergyDeposit();
172  density=aStep->GetPreStepPoint()->GetPhysicalVolume()->GetLogicalVolume()->GetMaterial()->GetDensity();
173 
174  G4ThreeVector minPos, maxPos;
175  G4bool newEvent=false;
176  G4double voxelMass, dose;
177 
178 // check if the event is inside the global-volume
179  if (minZone.getX()<= pos.getX() && pos.getX()<maxZone.getX() &&
180  minZone.getY()<= pos.getY() && pos.getY()<maxZone.getY() &&
181  minZone.getZ()<= pos.getZ() && pos.getZ()<maxZone.getZ())
182  {
183 // look for the voxel containing the event
184  for (int i=0; i<(int)voxels.size(); i++)
185  {
186  minPos=voxels[i].pos-voxels[i].halfSize;
187  maxPos=voxels[i].pos+voxels[i].halfSize;
188  if (minPos.getX()<= pos.getX() && pos.getX()<maxPos.getX() &&
189  minPos.getY()<= pos.getY() && pos.getY()<maxPos.getY() &&
190  minPos.getZ()<= pos.getZ() && pos.getZ()<maxPos.getZ())
191  {
192  voxelVolume=voxels[i].halfSize.getX()*voxels[i].halfSize.getY()*voxels[i].halfSize.getZ()*8.;
193  voxelMass=density*voxelVolume;
194 // calculate the dose
195  dose=depEnergy/(voxelMass*nRecycling);
196  voxels[i].nEvents++;
197  nVoxelsgeometry[i]++;
198  voxels[i].depEnergy+=dose;
199  voxels[i].depEnergy2+=dose*dose;
200  newEvent=true;
201 
202  Sparticle *particle=new Sparticle;
203  particle->dir=aStep->GetPreStepPoint()->GetMomentumDirection();
204  particle->pos=aStep->GetPreStepPoint()->GetPosition();
205  particle->kinEnergy=dose; // I use the same kinEnergy name to store the dose
206  particle->nPrimaryPart=-1;
207  particle->partPDGE=aStep->GetTrack()->GetDefinition()->GetPDGEncoding();
208  particle->primaryParticlePDGE=-1;
209  particle->volumeId=i; // voxel index where the dose is accumulating
210  particle->volumeName="-1";
211  }
212  }
213  if (newEvent)
214  {
215 // save data
216  nTotalEvents++;
218  {
219  saveResults();
220  }
221  }
222  }
223 }
G4ThreeVector maxZone
Definition: ML2ExpVoxels.hh:74
G4int * nVoxelsgeometry
Definition: ML2ExpVoxels.hh:73
Float_t dose
G4int partPDGE
G4int saving_in_Selected_Voxels_every_events
Definition: ML2ExpVoxels.hh:82
G4ThreeVector dir
G4ThreeVector minZone
Definition: ML2ExpVoxels.hh:74
G4int nPrimaryPart
G4double density
Definition: TRTMaterials.hh:39
double getY() const
G4int primaryParticlePDGE
double getX() const
bool G4bool
Definition: G4Types.hh:79
double getZ() const
G4ThreeVector pos
G4double kinEnergy
G4String volumeName
std::vector< Svoxel > voxels
Definition: ML2ExpVoxels.hh:72
G4int nTotalEvents
Definition: ML2ExpVoxels.hh:82
G4int volumeId
void saveResults(void)
double G4double
Definition: G4Types.hh:76
static const G4double pos
Here is the call graph for this function:

◆ calculateNormalizedEd()

void CML2ExpVoxels::calculateNormalizedEd ( std::vector< Svoxel > &  voxels)
private

Definition at line 284 of file ML2ExpVoxels.cc.

285 {
286  int i,j;
287  G4double cs, cc;
288  int n;
289  G4double d2, dd;
290  G4double v;
291  for (j=0;j<nCurves;j++)
292  {
293  cs=cc=0.;
294  for (i=startCurve[j]-1;i<stopCurve[j];i++)
295  {
296  cs+=vox[i].depEnergy*vox[i].expDose;
297  cc+=vox[i].depEnergy*vox[i].depEnergy;
298  }
299  if (cc>0.)
300  {
301  chi2Factor[j]=cs/cc;
302  }
303  for (i=startCurve[j]-1;i<stopCurve[j];i++)
304  {
305  dd=vox[i].depEnergy*vox[i].depEnergy;
306  d2=vox[i].depEnergy2;
307  n=vox[i].nEvents;
308  vox[i].depEnergyNorm=chi2Factor[j]*vox[i].depEnergy;
309  v=n*d2-dd;
310  if (v<0.){v=0;}
311  if (n>1){vox[i].depEnergyNormError=chi2Factor[j]*std::sqrt(v/(n-1));}
312  if (n==1){vox[i].depEnergyNormError=vox[i].depEnergyNorm;}
313  }
314  }
315 }
G4double * chi2Factor
Definition: ML2ExpVoxels.hh:77
Char_t n[5]
Float_t vox
G4int * startCurve
Definition: ML2ExpVoxels.hh:76
double G4double
Definition: G4Types.hh:76
static const G4double d2
G4int * stopCurve
Definition: ML2ExpVoxels.hh:76
Here is the caller graph for this function:

◆ getMaxNumberOfEvents()

G4int CML2ExpVoxels::getMaxNumberOfEvents ( )

Definition at line 234 of file ML2ExpVoxels.cc.

235 {
236  int n=nVoxelsgeometry[0];
237  for (int i=0;i<(int)voxels.size();i++)
238  {
239  if (n<nVoxelsgeometry[i]){n = nVoxelsgeometry[i];}
240  }
241  return n;
242 }
G4int * nVoxelsgeometry
Definition: ML2ExpVoxels.hh:73
Char_t n[5]
std::vector< Svoxel > voxels
Definition: ML2ExpVoxels.hh:72
Here is the caller graph for this function:

◆ getMinNumberOfEvents()

G4int CML2ExpVoxels::getMinNumberOfEvents ( )

Definition at line 225 of file ML2ExpVoxels.cc.

226 {
227  int n=voxels[0].nEvents;
228  for (int i=0;i<(int)voxels.size();i++)
229  {
230  if (n>voxels[i].nEvents){n = voxels[i].nEvents;}
231  }
232  return n;
233 }
Char_t n[5]
std::vector< Svoxel > voxels
Definition: ML2ExpVoxels.hh:72
Here is the caller graph for this function:

◆ getVoxels()

std::vector<Svoxel> CML2ExpVoxels::getVoxels ( )
inline

Definition at line 59 of file ML2ExpVoxels.hh.

59 {return voxels;}
std::vector< Svoxel > voxels
Definition: ML2ExpVoxels.hh:72
Here is the call graph for this function:

◆ loadData()

G4bool CML2ExpVoxels::loadData ( void  )

Definition at line 77 of file ML2ExpVoxels.cc.

78 {
80  std::ifstream in;
81 
82  Svoxel voxel; voxel.volumeId=0;
83  G4ThreeVector pos, halfSize;
84  G4double expDose;
85 
86  in.open(fullFileIn, std::ios::in);
87  if (in)
88  {
89  G4String appo;
90  char a[1000];
91  in.getline(a,1000,'\n'); headerText1=(G4String)a;
92  in.getline(a,1000,'\n');
93  in >> nCurves;
95  stopCurve=new G4int[nCurves];
97  for (int i=0; i< nCurves; i++)
98  {
99  chi2Factor[i]=0.;
100  in >> startCurve[i];
101  in >> stopCurve[i];
102  in >> chi2Factor[i];
103  }
104  in.getline(a,1000,'\n');
105  in.getline(a,1000,'\n'); headerText2=(G4String)a;
106 
107  while (!in.eof())
108  {
109  in >> pos;
110  in >> halfSize;
112  {
113  in >> expDose;
114  voxel.expDose=expDose/100.*(joule/kg); // input data in cGy
115  }
116  else
117  {
118  voxel.expDose=0.;
119  }
120  voxel.pos=pos;
121  voxel.halfSize=halfSize;
122  voxel.depEnergy=0.;
123  voxel.depEnergy2=0.;
124  voxel.nEvents=0;
125  voxel.depEnergyNorm=0.;
126  voxel.depEnergyNormError=0.;
127  voxels.push_back(voxel);
128 
129 // calculate the actual extremes of the global-volume containing all the experimental data
130  if (minZone.getX()>pos.getX()-halfSize.getX())
131  {minZone.setX(pos.getX()-halfSize.getX());}
132  if (maxZone.getX()<pos.getX()+halfSize.getX())
133  {maxZone.setX(pos.getX()+halfSize.getX());}
134 
135  if (minZone.getY()>pos.getY()-halfSize.getY())
136  {minZone.setY(pos.getY()-halfSize.getY());}
137  if (maxZone.getY()<pos.getY()+halfSize.getY())
138  {maxZone.setY(pos.getY()+halfSize.getY());}
139 
140  if (minZone.getZ()>pos.getZ()-halfSize.getZ())
141  {minZone.setZ(pos.getZ()-halfSize.getZ());}
142  if (maxZone.getZ()<pos.getZ()+halfSize.getZ())
143  {maxZone.setZ(pos.getZ()+halfSize.getZ());}
144 
145  }
146  }
147  else
148  {
149  std::cout << "ERROR I can't find the experimental data file" << G4endl;
150  return false;
151  }
152  in.close();
153 
154  nVoxelsgeometry=new G4int[(G4int) voxels.size()];
156 
157  return true;
158 }
G4int nEvents
G4double depEnergyNorm
G4double depEnergy
G4double depEnergy2
G4ThreeVector maxZone
Definition: ML2ExpVoxels.hh:74
G4int * nVoxelsgeometry
Definition: ML2ExpVoxels.hh:73
ifstream in
Definition: comparison.C:7
G4int volumeId
static const double joule
Definition: G4SIunits.hh:201
G4ThreeVector minZone
Definition: ML2ExpVoxels.hh:74
int G4int
Definition: G4Types.hh:78
void setY(double)
void setZ(double)
void setX(double)
G4double expDose
G4double * chi2Factor
Definition: ML2ExpVoxels.hh:77
G4bool bHasExperimentalData
Definition: ML2ExpVoxels.hh:83
double getY() const
void resetNEventsInVoxels()
G4ThreeVector pos
double getX() const
G4double depEnergyNormError
static const double kg
Definition: G4SIunits.hh:179
double getZ() const
G4String headerText1
Definition: ML2ExpVoxels.hh:78
std::vector< Svoxel > voxels
Definition: ML2ExpVoxels.hh:72
#define G4endl
Definition: G4ios.hh:61
G4String fullFileIn
Definition: ML2ExpVoxels.hh:78
G4int * startCurve
Definition: ML2ExpVoxels.hh:76
double G4double
Definition: G4Types.hh:76
G4ThreeVector halfSize
G4int * stopCurve
Definition: ML2ExpVoxels.hh:76
G4String headerText2
Definition: ML2ExpVoxels.hh:78
static const G4double pos
Here is the call graph for this function:
Here is the caller graph for this function:

◆ resetNEventsInVoxels()

void CML2ExpVoxels::resetNEventsInVoxels ( )

Definition at line 159 of file ML2ExpVoxels.cc.

160 {
161  for (int i=0; i<(int) voxels.size(); i++ )
162  {nVoxelsgeometry[i]=0;}
163 }
G4int * nVoxelsgeometry
Definition: ML2ExpVoxels.hh:73
std::vector< Svoxel > voxels
Definition: ML2ExpVoxels.hh:72
Here is the caller graph for this function:

◆ saveHeader()

void CML2ExpVoxels::saveHeader ( )
private

Definition at line 243 of file ML2ExpVoxels.cc.

244 {
245  std::ofstream out;
246  out.open(fullFileOut, std::ios::out);
247  out <<"% "<< headerText1 << G4endl;
248  out <<"n"<< seedName<<"="<< nCurves<<";" << G4endl;
249  out <<"fh"<< seedName<<"=["<< G4endl;
250  for (int i=0; i< nCurves; i++)
251  {
252  out << startCurve[i] << '\t';
253  out << stopCurve[i] << '\t';
254  out << chi2Factor[i]<< G4endl;
255  }
256  out << "];"<<G4endl;
257  out <<"% x [mm], y [mm], z [mm], Dx [mm], Dy [mm], Dz [mm], expDose [Gy], Calculated dose [Gy], Calculated dose2 [Gy^2], nEvents, normDose [Gy], normDoseError [Gy]";
258  out << G4endl;
259  out.close();
260 }
G4double * chi2Factor
Definition: ML2ExpVoxels.hh:77
G4String fullFileOut
Definition: ML2ExpVoxels.hh:78
G4String headerText1
Definition: ML2ExpVoxels.hh:78
G4String seedName
Definition: ML2ExpVoxels.hh:79
#define G4endl
Definition: G4ios.hh:61
G4int * startCurve
Definition: ML2ExpVoxels.hh:76
G4int * stopCurve
Definition: ML2ExpVoxels.hh:76
Here is the caller graph for this function:

◆ saveResults()

void CML2ExpVoxels::saveResults ( void  )

Definition at line 262 of file ML2ExpVoxels.cc.

263 {
264  if (nTotalEvents>0)
265  {
267  saveHeader();
268  std::ofstream out;
269  out.open(fullFileOut, std::ios::app);
270  out <<"d"<< seedName<<"=["<< G4endl;
271  for (int i=0; i<(int)voxels.size(); i++)
272  {
273  out <<voxels[i].pos.getX()/mm<<'\t'<<voxels[i].pos.getY()/mm<<'\t'<<voxels[i].pos.getZ()/mm<<'\t';
274  out <<voxels[i].halfSize.getX()/mm<<'\t'<<voxels[i].halfSize.getY()/mm<<'\t'<<voxels[i].halfSize.getZ()/mm<<'\t';
275  out <<voxels[i].expDose/(joule/kg)<<'\t'<<voxels[i].depEnergy/(joule/kg)<<'\t'<<voxels[i].depEnergy2/((joule/kg)*(joule/kg))<<'\t'<<voxels[i].nEvents<< '\t';
276  out <<voxels[i].depEnergyNorm/(joule/kg)<<'\t'<<voxels[i].depEnergyNormError/(joule/kg);
277  out << G4endl;
278  }
279  out << "];"<<G4endl;
280  out.close();
281  }
282 }
void calculateNormalizedEd(std::vector< Svoxel > &voxels)
static const double joule
Definition: G4SIunits.hh:201
G4String fullFileOut
Definition: ML2ExpVoxels.hh:78
static const double kg
Definition: G4SIunits.hh:179
G4String seedName
Definition: ML2ExpVoxels.hh:79
std::vector< Svoxel > voxels
Definition: ML2ExpVoxels.hh:72
G4int nTotalEvents
Definition: ML2ExpVoxels.hh:82
#define G4endl
Definition: G4ios.hh:61
static const double mm
Definition: G4SIunits.hh:114
Here is the call graph for this function:
Here is the caller graph for this function:

◆ setRecycling()

void CML2ExpVoxels::setRecycling ( int  recycling)
inline

Definition at line 66 of file ML2ExpVoxels.hh.

66 {nRecycling=recycling;}
Here is the call graph for this function:
Here is the caller graph for this function:

Member Data Documentation

◆ bHasExperimentalData

G4bool CML2ExpVoxels::bHasExperimentalData
private

Definition at line 83 of file ML2ExpVoxels.hh.

◆ chi2Factor

G4double* CML2ExpVoxels::chi2Factor
private

Definition at line 77 of file ML2ExpVoxels.hh.

◆ fullFileIn

G4String CML2ExpVoxels::fullFileIn
private

Definition at line 78 of file ML2ExpVoxels.hh.

◆ fullFileOut

G4String CML2ExpVoxels::fullFileOut
private

Definition at line 78 of file ML2ExpVoxels.hh.

◆ generalData

SGeneralData* CML2ExpVoxels::generalData
private

Definition at line 80 of file ML2ExpVoxels.hh.

◆ headerText1

G4String CML2ExpVoxels::headerText1
private

Definition at line 78 of file ML2ExpVoxels.hh.

◆ headerText2

G4String CML2ExpVoxels::headerText2
private

Definition at line 78 of file ML2ExpVoxels.hh.

◆ loopName

G4String CML2ExpVoxels::loopName
private

Definition at line 79 of file ML2ExpVoxels.hh.

◆ maxZone

G4ThreeVector CML2ExpVoxels::maxZone
private

Definition at line 74 of file ML2ExpVoxels.hh.

◆ minZone

G4ThreeVector CML2ExpVoxels::minZone
private

Definition at line 74 of file ML2ExpVoxels.hh.

◆ nCurves

G4int CML2ExpVoxels::nCurves
private

Definition at line 75 of file ML2ExpVoxels.hh.

◆ nParticle

G4int CML2ExpVoxels::nParticle
private

Definition at line 81 of file ML2ExpVoxels.hh.

◆ nRecycling

G4int CML2ExpVoxels::nRecycling
private

Definition at line 82 of file ML2ExpVoxels.hh.

◆ nTotalEvents

G4int CML2ExpVoxels::nTotalEvents
private

Definition at line 82 of file ML2ExpVoxels.hh.

◆ nVoxelsgeometry

G4int* CML2ExpVoxels::nVoxelsgeometry
private

Definition at line 73 of file ML2ExpVoxels.hh.

◆ saving_in_Selected_Voxels_every_events

G4int CML2ExpVoxels::saving_in_Selected_Voxels_every_events
private

Definition at line 82 of file ML2ExpVoxels.hh.

◆ seedName

G4String CML2ExpVoxels::seedName
private

Definition at line 79 of file ML2ExpVoxels.hh.

◆ startCurve

G4int* CML2ExpVoxels::startCurve
private

Definition at line 76 of file ML2ExpVoxels.hh.

◆ stopCurve

G4int * CML2ExpVoxels::stopCurve
private

Definition at line 76 of file ML2ExpVoxels.hh.

◆ voxels

std::vector<Svoxel> CML2ExpVoxels::voxels
private

Definition at line 72 of file ML2ExpVoxels.hh.


The documentation for this class was generated from the following files: