61    fPartialPhantomParam(0),
 
  118     std::ifstream finDF(dataFile.c_str());
 
  120     if(finDF.good() != 1 ) {
 
  121         G4Exception(
" DicomPartialDetectorConstruction::ReadPhantomData",
 
  124                     " Problem reading data file: Data.dat");
 
  128     finDF >> compression; 
 
  132     if( numFiles != 1 ) {
 
  133         G4Exception(
"DicomPartialDetectorConstruction::ReadPhantomData",
 
  136                     "More than 1 DICOM file is not supported");
 
  138     for(
G4int i = 0; i < numFiles; i++ ) {
 
  154   G4cout << 
" DicomDetectorConstruction::ReadPhantomDataFile opening file " 
  157   std::ifstream fin(fname.c_str(), std::ios_base::in);
 
  158   if( !fin.is_open() ) {
 
  159     G4Exception(
"DicomPartialDetectorConstruction::ReadPhantomDataFile",
 
  162                 G4String(
"File not found " + fname).c_str());
 
  168   for( 
G4int ii = 0; ii < nMaterials; ii++ ){
 
  169     fin >> nmate >> stemp;
 
  170     G4cout << 
"DicomPartialDetectorConstruction::ReadPhantomData reading nmate " 
  171     << ii << 
" = " << nmate << 
" mate " << stemp << 
G4endl;
 
  173       G4Exception(
"DicomPartialDetectorConstruction::ReadPhantomData",
 
  176                   "Material number should be in increasing order: \ 
  177                           wrong material number ");
 
  182   G4cout << 
"DicomPartialDetectorConstruction::ReadPhantomData nVoxel X/Y/Z " 
  189   fDimZ = (fDimZ - 
fOffsetZ)/fNVoxelZ;
 
  190   G4cout << 
"DicomPartialDetectorConstruction::ReadPhantomData voxelDimX " 
  192   G4cout << 
"DicomPartialDetectorConstruction::ReadPhantomData voxelDimY " 
  194   G4cout << 
"DicomPartialDetectorConstruction::ReadPhantomData voxelDimZ " 
  202   int ifxmin1, ifxmax1;
 
  204     std::map< G4int, G4int > ifmin, ifmax;
 
  206       fin >> ifxmin1 >> ifxmax1;
 
  211       G4int ifxdiff = ifxmax1-ifxmin1+1;
 
  212       if( ifxmax1 == -1 && ifxmin1 == -1 ) ifxdiff = 0;
 
  214       G4cout << 
"DicomPartialDetectorConstruction::ReadPhantomData insert "  
  215              << 
" FilledIDs "  << ifxdiff+
fNVoxels-1 << 
" min " << ifxmin1 
 
  219         if( ix >= 
G4int(ifxmin1) && ix <= 
G4int(ifxmax1) ) {
 
  240         if( ix >= 
G4int(ifxmin1) && ix <= 
G4int(ifxmax1) ) {
 
  242           if( mateID1 < 0 || mateID1 >= nMaterials ) {
 
  243             G4Exception(
"DicomPartialDetectorConstruction::ReadPhantomData",
 
  246             G4String(
"Wrong index in phantom file: It should be between 0 and " 
  266     std::map<G4int, std::pair<G4double,G4double> > densiMinMax;
 
  267     std::map<G4int, std::pair<G4double,G4double> >::iterator mpite;
 
  274     char* part = getenv( 
"DICOM_CHANGE_MATERIAL_DENSITY" );
 
  277     std::map<G4int,G4double> densityDiffs;
 
  278     if( densityDiff != -1. ) {
 
  280             densityDiffs[ii] = densityDiff; 
 
  293   std::map< std::pair<G4Material*,G4int>, 
matInfo* > newMateDens;
 
  296   size_t ifxmin1, ifxmax1;
 
  307         if( ix >= 
G4int(ifxmin1) && ix <= 
G4int(ifxmax1) ) {
 
  311           mpite = densiMinMax.find( 
fMateIDs[copyNo] );
 
  312           if( dens1 < (*mpite).second.first ) (*mpite).second.first = dens1;
 
  313           if( dens1 > (*mpite).second.second ) (*mpite).second.second = dens1;
 
  320           if( std::fabs(dens1 - mate->
GetDensity()/
g*
cm3 ) < 1.e-9 ) 
continue;
 
  327           G4int densityBin = 0;
 
  331           if( densityDiff != -1.) {
 
  332             densityBin = (
G4int(dens1/densityDiffs[mateID]));
 
  338           std::pair<G4Material*,G4int> matdens(mate, densityBin );
 
  340           std::map< std::pair<G4Material*,G4int>, 
matInfo* >::iterator mppite
 
  341           = newMateDens.find( matdens );
 
  342           if( mppite != newMateDens.end() ){
 
  343             matInfo* mi = (*mppite).second;
 
  353             mi->
id = newMateDens.size()+1;
 
  354             newMateDens[matdens] = mi;
 
  370   std::vector<G4Material*>::const_iterator mimite;
 
  377   std::map< std::pair<G4Material*,G4int>, 
matInfo* >::iterator mppite;
 
  378   for( mppite= newMateDens.begin(); mppite != newMateDens.end(); mppite++ ){
 
  379     G4double averdens = (*mppite).second->
sumdens/(*mppite).second->nvoxels;
 
  381     G4cout << 
"GmReadPhantomGeometry::ReadVoxelDensities AVER DENS "  
  382            << averdens << 
" -> " << saverdens << 
" -> "  
  383            << 
G4int(1000*averdens) << 
" " << 
G4int(1000*averdens)/1000 << 
" " 
  386     G4cout << 
"GmReadPhantomGeometry::ReadVoxelDensities AVER DENS "  
  387            << averdens << 
" -> "  << saverdens << 
" -> "  
  389     <<(*mppite).second->nvoxels << 
G4endl;
 
  390     G4String mateName = ((*mppite).first).first->GetName() + 
"_" +
 
  393                                   (*mppite).first.first,
 
  394     averdens, mateName ) );
 
  406   G4String contname= 
"PhantomContainer";
 
  409   G4Tubs* container_tube = 
new G4Tubs(contname,0., 200., 100., 0., 360*
deg);
 
  436   G4bool bSkipEqualMaterials = 0;
 
  437   G4int regStructureID = 2;
 
  476   if( OptimAxis == 
"kUndefined" ) {
 
  480   } 
else   if( OptimAxis == 
"kXAxis" ) {
 
  488     G4Exception(
"GmReadPhantomGeometry::ConstructPhantom",
 
  491                 G4String(
"Wrong argument to parameter \ 
  492          GmReadPhantomGeometry:Phantom:OptimAxis: \ 
  493          Only allowed 'kUndefined' or 'kXAxis', it is: "+OptimAxis).c_str());
 
std::vector< G4Material * > fPhantomMaterials
 
std::map< G4int, std::map< G4int, G4int > > fFilledMins
 
CLHEP::Hep3Vector G4ThreeVector
 
CLHEP::HepRotation G4RotationMatrix
 
G4LogicalVolume * fWorld_logic
 
const G4String & GetName() const 
 
G4double GetDensity() const 
 
static G4String ConvertToString(G4bool boolVal)
 
void SetFilledIDs(std::multimap< G4int, G4int > fid)
 
void ConstructPhantomContainer()
 
G4PartialPhantomParameterisation * fPartialPhantomParam
 
std::multimap< G4int, G4int > fFilledIDs
 
G4LogicalVolume * fContainer_logic
 
void InitialisationOfMaterials()
 
~DicomPartialDetectorConstruction()
 
void ReadVoxelDensitiesPartial(std::ifstream &fin, std::map< G4int, std::map< G4int, G4int > > ifxmin, std::map< G4int, std::map< G4int, G4int > > ifxmax)
 
void ReadPhantomDataFile(const G4String &fname)
 
G4Material * BuildMaterialWithChangingDensity(const G4Material *origMate, float density, G4String newMateName)
 
G4GLOB_DLL std::ostream G4cout
 
void SetVoxelDimensions(G4double halfx, G4double halfy, G4double halfz)
 
Definition of the DicomPartialDetectorConstruction class. 
 
void SetFilledMins(std::map< G4int, std::map< G4int, G4int > > fmins)
 
static G4double ConvertToDouble(const char *st)
 
void G4Exception(const char *originOfException, const char *exceptionCode, G4ExceptionSeverity severity, const char *comments)
 
virtual void SetRegularStructureId(G4int Code)
 
G4VPhysicalVolume * fContainer_phys
 
virtual G4VPhysicalVolume * Construct()
 
void SetSmartless(G4double s)
 
void BuildContainerWalls()
 
std::map< G4int, std::map< G4int, G4int > > fFilledMaxs
 
void SetNoVoxel(size_t nx, size_t ny, size_t nz)
 
virtual void ReadPhantomData()
 
Dicom detector construction. 
 
void SetMaterialIndices(size_t *matInd)
 
DicomPartialDetectorConstruction()
 
void SetMaterials(std::vector< G4Material * > &mates)
 
std::vector< G4Material * > fMaterials
 
std::vector< G4Material * > fOriginalMaterials
 
void SetVisAttributes(const G4VisAttributes *pVA)
 
void SetSkipEqualMaterials(G4bool skip)
 
virtual void ConstructPhantom()