Geant4  10.02.p02
DicomDetectorConstruction.cc
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 // $Id: DicomDetectorConstruction.cc 92820 2015-09-17 15:22:14Z gcosmo $
27 //
30 //
31 
32 #include "globals.hh"
33 
34 #include "G4Box.hh"
35 #include "G4LogicalVolume.hh"
36 #include "G4VPhysicalVolume.hh"
37 #include "G4PVPlacement.hh"
38 #include "G4Material.hh"
39 #include "G4Element.hh"
40 #include "G4UIcommand.hh"
41 #include "G4PhysicalConstants.hh"
42 #include "G4SystemOfUnits.hh"
43 
46 
47 #include "DicomRunAction.hh"
48 #include "DicomRun.hh"
49 
50 #include "G4VisAttributes.hh"
51 
52 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
55  fAir(0),
56 
57  fWorld_solid(0),
58  fWorld_logic(0),
59  fWorld_phys(0),
60 
61  fContainer_solid(0),
62  fContainer_logic(0),
63  fContainer_phys(0),
64 
65  fNoFiles(0),
66  fMateIDs(0),
67 
68  fZSliceHeaderMerged(0),
69 
70  fNVoxelX(0),
71  fNVoxelY(0),
72  fNVoxelZ(0),
73  fVoxelHalfDimX(0),
74  fVoxelHalfDimY(0),
75  fVoxelHalfDimZ(0),
76 
77  fConstructed(false)
78 {
79 
80 }
81 
82 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
84 {
85 }
86 
87 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
89 {
90  if(!fConstructed || fWorld_phys == 0) {
91  fConstructed = true;
93 
94  //----- Build world
95  G4double worldXDimension = 1.*m;
96  G4double worldYDimension = 1.*m;
97  G4double worldZDimension = 1.*m;
98 
99  fWorld_solid = new G4Box( "WorldSolid",
100  worldXDimension,
101  worldYDimension,
102  worldZDimension );
103 
105  fAir,
106  "WorldLogical",
107  0, 0, 0 );
108 
109  fWorld_phys = new G4PVPlacement( 0,
110  G4ThreeVector(0,0,0),
111  "World",
112  fWorld_logic,
113  0,
114  false,
115  0 );
116 
117  ReadPhantomData();
118 
121  }
122  return fWorld_phys;
123 }
124 
125 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
127 {
128  // Creating elements :
129  G4double z, a, density;
131 
132  G4Element* elC = new G4Element( name = "Carbon",
133  symbol = "C",
134  z = 6.0, a = 12.011 * g/mole );
135  G4Element* elH = new G4Element( name = "Hydrogen",
136  symbol = "H",
137  z = 1.0, a = 1.008 * g/mole );
138  G4Element* elN = new G4Element( name = "Nitrogen",
139  symbol = "N",
140  z = 7.0, a = 14.007 * g/mole );
141  G4Element* elO = new G4Element( name = "Oxygen",
142  symbol = "O",
143  z = 8.0, a = 16.00 * g/mole );
144  G4Element* elNa = new G4Element( name = "Sodium",
145  symbol = "Na",
146  z= 11.0, a = 22.98977* g/mole );
147  G4Element* elS = new G4Element( name = "Sulfur",
148  symbol = "S",
149  z = 16.0,a = 32.065* g/mole );
150  G4Element* elCl = new G4Element( name = "Chlorine",
151  symbol = "P",
152  z = 17.0, a = 35.453* g/mole );
153  G4Element* elK = new G4Element( name = "Potassium",
154  symbol = "P",
155  z = 19.0, a = 30.0983* g/mole );
156  G4Element* elP = new G4Element( name = "Phosphorus",
157  symbol = "P",
158  z = 30.0, a = 30.973976* g/mole );
159  G4Element* elFe = new G4Element( name = "Iron",
160  symbol = "Fe",
161  z = 26, a = 56.845* g/mole );
162  G4Element* elMg = new G4Element( name = "Magnesium",
163  symbol = "Mg",
164  z = 12.0, a = 24.3050* g/mole );
165  G4Element* elCa = new G4Element( name="Calcium",
166  symbol = "Ca",
167  z = 20.0, a = 40.078* g/mole );
168 
169  // Creating Materials :
170  G4int numberofElements;
171 
172  // Air
173  fAir = new G4Material( "Air",
174  1.290*mg/cm3,
175  numberofElements = 2 );
176  fAir->AddElement(elN, 0.7);
177  fAir->AddElement(elO, 0.3);
178 
179  // Lung Inhale
180  G4Material* lunginhale = new G4Material( "LungInhale",
181  density = 0.217*g/cm3,
182  numberofElements = 9);
183  lunginhale->AddElement(elH,0.103);
184  lunginhale->AddElement(elC,0.105);
185  lunginhale->AddElement(elN,0.031);
186  lunginhale->AddElement(elO,0.749);
187  lunginhale->AddElement(elNa,0.002);
188  lunginhale->AddElement(elP,0.002);
189  lunginhale->AddElement(elS,0.003);
190  lunginhale->AddElement(elCl,0.002);
191  lunginhale->AddElement(elK,0.003);
192 
193  // Lung exhale
194  G4Material* lungexhale = new G4Material( "LungExhale",
195  density = 0.508*g/cm3,
196  numberofElements = 9 );
197  lungexhale->AddElement(elH,0.103);
198  lungexhale->AddElement(elC,0.105);
199  lungexhale->AddElement(elN,0.031);
200  lungexhale->AddElement(elO,0.749);
201  lungexhale->AddElement(elNa,0.002);
202  lungexhale->AddElement(elP,0.002);
203  lungexhale->AddElement(elS,0.003);
204  lungexhale->AddElement(elCl,0.002);
205  lungexhale->AddElement(elK,0.003);
206 
207  // Adipose tissue
208  G4Material* adiposeTissue = new G4Material( "AdiposeTissue",
209  density = 0.967*g/cm3,
210  numberofElements = 7);
211  adiposeTissue->AddElement(elH,0.114);
212  adiposeTissue->AddElement(elC,0.598);
213  adiposeTissue->AddElement(elN,0.007);
214  adiposeTissue->AddElement(elO,0.278);
215  adiposeTissue->AddElement(elNa,0.001);
216  adiposeTissue->AddElement(elS,0.001);
217  adiposeTissue->AddElement(elCl,0.001);
218 
219  // Breast
220  G4Material* breast = new G4Material( "Breast",
221  density = 0.990*g/cm3,
222  numberofElements = 8 );
223  breast->AddElement(elH,0.109);
224  breast->AddElement(elC,0.506);
225  breast->AddElement(elN,0.023);
226  breast->AddElement(elO,0.358);
227  breast->AddElement(elNa,0.001);
228  breast->AddElement(elP,0.001);
229  breast->AddElement(elS,0.001);
230  breast->AddElement(elCl,0.001);
231 
232  // Water
233  G4Material* water = new G4Material( "Water",
234  density = 1.0*g/cm3,
235  numberofElements = 2 );
236  water->AddElement(elH,0.112);
237  water->AddElement(elO,0.888);
238 
239  // Muscle
240  G4Material* muscle = new G4Material( "Muscle",
241  density = 1.061*g/cm3,
242  numberofElements = 9 );
243  muscle->AddElement(elH,0.102);
244  muscle->AddElement(elC,0.143);
245  muscle->AddElement(elN,0.034);
246  muscle->AddElement(elO,0.710);
247  muscle->AddElement(elNa,0.001);
248  muscle->AddElement(elP,0.002);
249  muscle->AddElement(elS,0.003);
250  muscle->AddElement(elCl,0.001);
251  muscle->AddElement(elK,0.004);
252 
253  // Liver
254  G4Material* liver = new G4Material( "Liver",
255  density = 1.071*g/cm3,
256  numberofElements = 9);
257  liver->AddElement(elH,0.102);
258  liver->AddElement(elC,0.139);
259  liver->AddElement(elN,0.030);
260  liver->AddElement(elO,0.716);
261  liver->AddElement(elNa,0.002);
262  liver->AddElement(elP,0.003);
263  liver->AddElement(elS,0.003);
264  liver->AddElement(elCl,0.002);
265  liver->AddElement(elK,0.003);
266 
267  // Trabecular Bone
268  G4Material* trabecularBone = new G4Material( "TrabecularBone",
269  density = 1.159*g/cm3,
270  numberofElements = 12 );
271  trabecularBone->AddElement(elH,0.085);
272  trabecularBone->AddElement(elC,0.404);
273  trabecularBone->AddElement(elN,0.058);
274  trabecularBone->AddElement(elO,0.367);
275  trabecularBone->AddElement(elNa,0.001);
276  trabecularBone->AddElement(elMg,0.001);
277  trabecularBone->AddElement(elP,0.034);
278  trabecularBone->AddElement(elS,0.002);
279  trabecularBone->AddElement(elCl,0.002);
280  trabecularBone->AddElement(elK,0.001);
281  trabecularBone->AddElement(elCa,0.044);
282  trabecularBone->AddElement(elFe,0.001);
283 
284  // Dense Bone
285  G4Material* denseBone = new G4Material( "DenseBone",
286  density = 1.575*g/cm3,
287  numberofElements = 11 );
288  denseBone->AddElement(elH,0.056);
289  denseBone->AddElement(elC,0.235);
290  denseBone->AddElement(elN,0.050);
291  denseBone->AddElement(elO,0.434);
292  denseBone->AddElement(elNa,0.001);
293  denseBone->AddElement(elMg,0.001);
294  denseBone->AddElement(elP,0.072);
295  denseBone->AddElement(elS,0.003);
296  denseBone->AddElement(elCl,0.001);
297  denseBone->AddElement(elK,0.001);
298  denseBone->AddElement(elCa,0.146);
299 
300  //----- Put the materials in a vector
301  fOriginalMaterials.push_back(fAir); // rho = 0.00129
302  fOriginalMaterials.push_back(lunginhale); // rho = 0.217
303  fOriginalMaterials.push_back(lungexhale); // rho = 0.508
304  fOriginalMaterials.push_back(adiposeTissue); // rho = 0.967
305  fOriginalMaterials.push_back(breast ); // rho = 0.990
306  fOriginalMaterials.push_back(water); // rho = 1.018
307  fOriginalMaterials.push_back(muscle); // rho = 1.061
308  fOriginalMaterials.push_back(liver); // rho = 1.071
309  fOriginalMaterials.push_back(trabecularBone); // rho = 1.159
310  fOriginalMaterials.push_back(denseBone); // rho = 1.575
311 
312 }
313 
314 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
316 {
317 
318  G4String dataFile = "Data.dat";
319  std::ifstream finDF(dataFile.c_str());
320  G4String fname;
321  if(finDF.good() != 1 ) {
322  G4String descript = "Problem reading data file: "+dataFile;
323  G4Exception(" DicomDetectorConstruction::ReadPhantomData",
324  "",
326  descript);
327  }
328 
329  G4int compression;
330  finDF >> compression; // not used here
331 
332  finDF >> fNoFiles;
333  for(G4int i = 0; i < fNoFiles; i++ ) {
334  finDF >> fname;
335  //--- Read one data file
336  fname += ".g4dcm";
337  ReadPhantomDataFile(fname);
338  }
339 
340  //----- Merge data headers
342 
343  finDF.close();
344 
345 }
346 
347 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
349 {
350 #ifdef G4VERBOSE
351  G4cout << " DicomDetectorConstruction::ReadPhantomDataFile opening file "
352  << fname << G4endl;
353 #endif
354  std::ifstream fin(fname.c_str(), std::ios_base::in);
355  if( !fin.is_open() ) {
356  G4Exception("DicomDetectorConstruction::ReadPhantomDataFile",
357  "",
359  G4String("File not found " + fname ).c_str());
360  }
361  //----- Define density differences (maximum density difference to create
362  // a new material)
363  char* part = getenv( "DICOM_CHANGE_MATERIAL_DENSITY" );
364  G4double densityDiff = -1.;
365  if( part ) densityDiff = G4UIcommand::ConvertToDouble(part);
366  if( densityDiff != -1. ) {
367  for( unsigned int ii = 0; ii < fOriginalMaterials.size(); ii++ ){
368  fDensityDiffs[ii] = densityDiff; //currently all materials with
369  // same difference
370  }
371  }else {
372  if( fMaterials.size() == 0 ) { // do it only for first slice
373  for( unsigned int ii = 0; ii < fOriginalMaterials.size(); ii++ ){
374  fMaterials.push_back( fOriginalMaterials[ii] );
375  }
376  }
377  }
378 
379  //----- Read data header
380  DicomPhantomZSliceHeader* sliceHeader = new DicomPhantomZSliceHeader( fin );
381  fZSliceHeaders.push_back( sliceHeader );
382 
383  //----- Read material indices
384  G4int nVoxels = sliceHeader->GetNoVoxels();
385 
386  //--- If first slice, initiliaze fMateIDs
387  if( fZSliceHeaders.size() == 1 ) {
388  //fMateIDs = new unsigned int[fNoFiles*nVoxels];
389  fMateIDs = new size_t[fNoFiles*nVoxels];
390 
391  }
392 
393  unsigned int mateID;
394  // number of voxels from previously read slices
395  G4int voxelCopyNo = (fZSliceHeaders.size()-1)*nVoxels;
396  for( G4int ii = 0; ii < nVoxels; ii++, voxelCopyNo++ ){
397  fin >> mateID;
398  fMateIDs[voxelCopyNo] = mateID;
399  }
400 
401  //----- Read material densities and build new materials if two voxels have
402  // same material but its density is in a different density interval
403  // (size of density intervals defined by densityDiff)
405  // number of voxels from previously read slices
406  voxelCopyNo = (fZSliceHeaders.size()-1)*nVoxels;
407  for( G4int ii = 0; ii < nVoxels; ii++, voxelCopyNo++ ){
408  fin >> density;
409 
410  //-- Get material from list of original materials
411  mateID = fMateIDs[voxelCopyNo];
412  G4Material* mateOrig = fOriginalMaterials[mateID];
413 
414  //-- Get density bin: middle point of the bin in which the current
415  // density is included
416  G4String newMateName = mateOrig->GetName();
417  float densityBin = 0.;
418  if( densityDiff != -1.) {
419  densityBin = fDensityDiffs[mateID] *
420  (G4int(density/fDensityDiffs[mateID])+0.5);
421  //-- Build the new material name
422  newMateName += G4UIcommand::ConvertToString(densityBin);
423  }
424 
425  //-- Look if a material with this name is already created
426  // (because a previous voxel was already in this density bin)
427  unsigned int im;
428  for( im = 0; im < fMaterials.size(); im++ ){
429  if( fMaterials[im]->GetName() == newMateName ) {
430  break;
431  }
432  }
433  //-- If material is already created use index of this material
434  if( im != fMaterials.size() ) {
435  fMateIDs[voxelCopyNo] = im;
436  //-- else, create the material
437  } else {
438  if( densityDiff != -1.) {
439  fMaterials.push_back( BuildMaterialWithChangingDensity( mateOrig,
440  densityBin, newMateName ) );
441  fMateIDs[voxelCopyNo] = fMaterials.size()-1;
442  } else {
443  G4cerr << " im " << im << " < " << fMaterials.size() << " name "
444  << newMateName << G4endl;
445  G4Exception("DicomDetectorConstruction::ReadPhantomDataFile",
446  "",
448  "Wrong index in material"); //it should never reach here
449  }
450  }
451  }
452 
453 }
454 
455 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
457 {
458  //----- Images must have the same dimension ...
460  for( unsigned int ii = 1; ii < fZSliceHeaders.size(); ii++ ) {
462  };
463 
464 }
465 
466 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
468  const G4Material* origMate, float density, G4String newMateName )
469 {
470  //----- Copy original material, but with new density
471  G4int nelem = origMate->GetNumberOfElements();
472  G4Material* mate = new G4Material( newMateName, density*g/cm3, nelem,
473  kStateUndefined, STP_Temperature );
474 
475  for( G4int ii = 0; ii < nelem; ii++ ){
476  G4double frac = origMate->GetFractionVector()[ii];
477  G4Element* elem = const_cast<G4Element*>(origMate->GetElement(ii));
478  mate->AddElement( elem, frac );
479  }
480 
481  return mate;
482 }
483 
484 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
486 {
487  //---- Extract number of voxels and voxel dimensions
491 
495 #ifdef G4VERBOSE
496  G4cout << " fNVoxelX " << fNVoxelX << " fVoxelHalfDimX " << fVoxelHalfDimX
497  <<G4endl;
498  G4cout << " fNVoxelY " << fNVoxelY << " fVoxelHalfDimY " << fVoxelHalfDimY
499  <<G4endl;
500  G4cout << " fNVoxelZ " << fNVoxelZ << " fVoxelHalfDimZ " << fVoxelHalfDimZ
501  <<G4endl;
502  G4cout << " totalPixels " << fNVoxelX*fNVoxelY*fNVoxelZ << G4endl;
503 #endif
504 
505  //----- Define the volume that contains all the voxels
506  fContainer_solid = new G4Box("phantomContainer",fNVoxelX*fVoxelHalfDimX,
511  //the material is not important, it will be fully filled by the voxels
512  fMaterials[0],
513  "phantomContainer",
514  0, 0, 0 );
515  //--- Place it on the world
516  G4double fOffsetX = (fZSliceHeaderMerged->GetMaxX() +
517  fZSliceHeaderMerged->GetMinX() ) /2.;
518  G4double fOffsetY = (fZSliceHeaderMerged->GetMaxY() +
519  fZSliceHeaderMerged->GetMinY() ) /2.;
520  G4double fOffsetZ = (fZSliceHeaderMerged->GetMaxZ() +
521  fZSliceHeaderMerged->GetMinZ() ) /2.;
522  G4ThreeVector posCentreVoxels(fOffsetX,fOffsetY,fOffsetZ);
523 #ifdef G4VERBOSE
524  G4cout << " placing voxel container volume at " << posCentreVoxels << G4endl;
525 #endif
527  new G4PVPlacement(0, // rotation
528  posCentreVoxels,
529  fContainer_logic, // The logic volume
530  "phantomContainer", // Name
531  fWorld_logic, // Mother
532  false, // No op. bool.
533  1); // Copy number
534 
535  //fContainer_logic->SetVisAttributes(new G4VisAttributes(G4Colour(1.,0.,0.)));
536 }
537 
538 #include "G4SDManager.hh"
540 #include "G4PSDoseDeposit.hh"
541 #include "G4PSDoseDeposit3D.hh"
542 
543 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
545 {
546 
547  G4cout << "\n\n\n\n\t SET SCORER : " << voxel_logic->GetName()
548  << " \n\n\n" << G4endl;
549 
550  fScorers.insert(voxel_logic);
551 
552 }
553 
554 //....oooOO0OOooo........oooOO0OOooo........oooOO0OOooo........oooOO0OOooo......
555 
557 {
558 
559  G4cout << "\n\n\n\n\t CONSTRUCT SD AND FIELD \n\n\n" << G4endl;
560 
561  //G4SDManager* SDman = G4SDManager::GetSDMpointer();
562 
563  //SDman->SetVerboseLevel(1);
564 
565  //
566  // Sensitive Detector Name
567  G4String concreteSDname = "phantomSD";
568  std::vector<G4String> scorer_names;
569  scorer_names.push_back(concreteSDname);
570  //------------------------
571  // MultiFunctionalDetector
572  //------------------------
573  //
574  // Define MultiFunctionalDetector with name.
575  // declare MFDet as a MultiFunctionalDetector scorer
576  G4MultiFunctionalDetector* MFDet =
577  new G4MultiFunctionalDetector(concreteSDname);
578  //SDman->AddNewDetector( MFDet ); // Register SD to SDManager
579  //G4VPrimitiveScorer* dosedep = new G4PSDoseDeposit("DoseDeposit");
580  G4VPrimitiveScorer* dosedep =
581  new G4PSDoseDeposit3D("DoseDeposit", fNVoxelX, fNVoxelY, fNVoxelZ);
582  MFDet->RegisterPrimitive(dosedep);
583 
584  for(std::set<G4LogicalVolume*>::iterator ite = fScorers.begin();
585  ite != fScorers.end(); ++ite) {
586  SetSensitiveDetector(*ite, MFDet);
587  }
588 
589  /*if(DicomRunAction::Instance()->GetDicomRun()) {
590  DicomRunAction::Instance()->GetDicomRun()->ConstructMFD(scorer_names);
591  }*/
592 
593 }
G4bool RegisterPrimitive(G4VPrimitiveScorer *)
void SetScorer(G4LogicalVolume *voxel_logic)
Definition of the DicomDetectorConstruction class.
G4String symbol
Definition: TRTMaterials.hh:40
std::set< G4LogicalVolume * > fScorers
CLHEP::Hep3Vector G4ThreeVector
G4double z
Definition: TRTMaterials.hh:39
Definition: G4Box.hh:64
Definition of the DicomRunAction class.
G4String name
Definition: TRTMaterials.hh:40
const G4String & GetName() const
Definition: G4Material.hh:178
std::vector< DicomPhantomZSliceHeader * > fZSliceHeaders
G4Element * elC
Definition: TRTMaterials.hh:48
static G4String ConvertToString(G4bool boolVal)
Definition: G4UIcommand.cc:371
virtual G4VPhysicalVolume * Construct()
G4double a
Definition: TRTMaterials.hh:39
static const double mg
Definition: G4SIunits.hh:181
const G4Element * GetElement(G4int iel) const
Definition: G4Material.hh:202
int G4int
Definition: G4Types.hh:78
Definition of the DicomRun class.
DicomPhantomZSliceHeader * fZSliceHeaderMerged
G4Element * elN
Definition: TRTMaterials.hh:44
G4Element * elH
Definition: TRTMaterials.hh:50
G4double density
Definition: TRTMaterials.hh:39
G4Material * BuildMaterialWithChangingDensity(const G4Material *origMate, float density, G4String newMateName)
G4GLOB_DLL std::ostream G4cout
G4Element * elO
Definition: TRTMaterials.hh:46
DicomPhantomZSliceHeader class.
static G4double ConvertToDouble(const char *st)
Definition: G4UIcommand.cc:443
static const double cm3
Definition: G4SIunits.hh:120
void SetSensitiveDetector(const G4String &logVolName, G4VSensitiveDetector *aSD, G4bool multi=false)
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *comments)
Definition: G4Exception.cc:41
static const double g
Definition: G4SIunits.hh:180
static const double mole
Definition: G4SIunits.hh:283
#define G4endl
Definition: G4ios.hh:61
static const double m
Definition: G4SIunits.hh:128
void AddElement(G4Element *element, G4int nAtoms)
Definition: G4Material.cc:364
size_t GetNumberOfElements() const
Definition: G4Material.hh:186
Definition of the DicomPhantomZSliceHeader class.
const G4String & GetName() const
double G4double
Definition: G4Types.hh:76
std::vector< G4Material * > fMaterials
std::vector< G4Material * > fOriginalMaterials
void ReadPhantomDataFile(const G4String &fname)
const G4double * GetFractionVector() const
Definition: G4Material.hh:194
virtual void ConstructPhantom()=0
G4GLOB_DLL std::ostream G4cerr
std::map< G4int, G4double > fDensityDiffs