49 G4String FileExperimentalData,
G4String FileExperimentalDataOut):startCurve(0),
50 stopCurve(0),chi2Factor(0)
53 sprintf(a,
"%d", seed);
55 saving_in_Selected_Voxels_every_events=saveEvents;
59 fullFileOut=FileExperimentalDataOut+seedName+
".m";
60 fullFileIn=FileExperimentalData;
61 nParticle=nTotalEvents=0;
65 minZone.
set(extr, extr, extr);
66 maxZone.
set(-extr, -extr, -extr);
67 bHasExperimentalData=bData;
75 delete [] nVoxelsgeometry;
79 bHasExperimentalData=
true;
86 in.open(fullFileIn, std::ios::in);
91 in.getline(a,1000,
'\n'); headerText1=(
G4String)a;
92 in.getline(a,1000,
'\n');
94 startCurve=
new G4int[nCurves];
95 stopCurve=
new G4int[nCurves];
97 for (
int i=0; i< nCurves; i++)
104 in.getline(a,1000,
'\n');
105 in.getline(a,1000,
'\n'); headerText2=(
G4String)a;
111 if (bHasExperimentalData)
127 voxels.push_back(voxel);
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());}
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());}
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());}
149 std::cout <<
"ERROR I can't find the experimental data file" <<
G4endl;
154 nVoxelsgeometry=
new G4int[(
G4int) voxels.size()];
161 for (
int i=0; i<(
int) voxels.size(); i++ )
162 {nVoxelsgeometry[i]=0;}
168 G4double depEnergy, density, voxelVolume;
184 for (
int i=0; i<(
int)voxels.size(); i++)
186 minPos=voxels[i].pos-voxels[i].halfSize;
187 maxPos=voxels[i].pos+voxels[i].halfSize;
192 voxelVolume=voxels[i].halfSize.getX()*voxels[i].halfSize.getY()*voxels[i].halfSize.getZ()*8.;
193 voxelMass=density*voxelVolume;
195 dose=depEnergy/(voxelMass*nRecycling);
197 nVoxelsgeometry[i]++;
198 voxels[i].depEnergy+=dose;
199 voxels[i].depEnergy2+=dose*dose;
217 if (nTotalEvents%saving_in_Selected_Voxels_every_events==0 && nTotalEvents>0)
227 int n=voxels[0].nEvents;
228 for (
int i=0;i<(
int)voxels.size();i++)
230 if (n>voxels[i].nEvents){n = voxels[i].nEvents;}
236 int n=nVoxelsgeometry[0];
237 for (
int i=0;i<(
int)voxels.size();i++)
239 if (n<nVoxelsgeometry[i]){n = nVoxelsgeometry[i];}
243 void CML2ExpVoxels::saveHeader()
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++)
252 out << startCurve[i] <<
'\t';
253 out << stopCurve[i] <<
'\t';
254 out << chi2Factor[i]<<
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]";
266 calculateNormalizedEd(voxels);
270 out <<
"d"<< seedName<<
"=["<<
G4endl;
271 for (
int i=0; i<(
int)voxels.size(); i++)
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);
284 void CML2ExpVoxels::calculateNormalizedEd(std::vector <Svoxel> &vox)
291 for (j=0;j<nCurves;j++)
294 for (i=startCurve[j]-1;i<stopCurve[j];i++)
296 cs+=vox[i].depEnergy*vox[i].expDose;
297 cc+=vox[i].depEnergy*vox[i].depEnergy;
303 for (i=startCurve[j]-1;i<stopCurve[j];i++)
305 dd=vox[i].depEnergy*vox[i].depEnergy;
306 d2=vox[i].depEnergy2;
308 vox[i].depEnergyNorm=chi2Factor[j]*vox[i].depEnergy;
311 if (n>1){vox[i].depEnergyNormError=chi2Factor[j]*std::sqrt(v/(n-1));}
312 if (n==1){vox[i].depEnergyNormError=vox[i].depEnergyNorm;}
void set(double x, double y, double z)
G4ParticleDefinition * GetDefinition() const
static constexpr double mm
G4Material * GetMaterial() const
std::vector< ExP01TrackerHit * > a
G4double GetDensity() const
G4int GetPDGEncoding() const
G4int getMinNumberOfEvents()
G4StepPoint * GetPreStepPoint() const
const G4ThreeVector & GetMomentumDirection() const
void resetNEventsInVoxels()
G4VPhysicalVolume * GetPhysicalVolume() const
G4int primaryParticlePDGE
const G4ThreeVector & GetPosition() const
G4double depEnergyNormError
typedef int(XMLCALL *XML_NotStandaloneHandler)(void *userData)
static constexpr double kg
G4double GetTotalEnergyDeposit() const
G4LogicalVolume * GetLogicalVolume() const
static constexpr double joule
G4int getMaxNumberOfEvents()
CML2ExpVoxels(G4bool bHasExperimentalData, G4int saving_in_Selected_Voxels_every_events, G4int seed, G4String FileExperimentalData, G4String FileExperimentalDataOut)
void add(G4ThreeVector pos, G4double depEnergy, G4double density)
G4Track * GetTrack() const
static const G4double pos