G4VPhysicalVolume * GeantDetectorConstruction::Construct()
{
    // World
    G4double worldSize = 5 * ( std::abs( gOptions->GetDetZ_cm() * cm ) + std::abs( gOptions->GetPartZ_cm() * cm ) ) ;
    G4Box * worldSolid = new G4Box("WorldS", worldSize, worldSize, worldSize);
    G4LogicalVolume * worldLV = new G4LogicalVolume( worldSolid, G4NistManager::Instance()->FindOrBuildMaterial("G4_Galactic"), "World");
    G4VPhysicalVolume * worldPV = new G4PVPlacement( 0, G4ThreeVector(0,0,0), worldLV, "WorldPV", 0, false, 0, true);

    // Scatterer plane
    G4Box * scatPlaneSolid = new G4Box("scatPlaneSolid", worldSize, worldSize, gOptions->GetScatThick_um() * um / 2  );
    G4Material * scatMat =  G4NistManager::Instance()->FindOrBuildMaterial("G4_Si");
    G4cout << "Scatterer material: " << scatMat->GetName() << " Radiation length = "<< scatMat->GetRadlen() / cm << " cm"<< G4endl;
    G4LogicalVolume * scatPlaneLV = new G4LogicalVolume( scatPlaneSolid, scatMat, "scatPlaneLV");
    new G4PVPlacement( 0, G4ThreeVector(0,0,0), scatPlaneLV, "scatPlanePV", worldLV, false, 0, true);

    // Detector plane
    G4Box * detPlaneSolid = new G4Box("detPlaneSolid", worldSize, worldSize, 1 * um );
    G4LogicalVolume * detPlaneLV = new G4LogicalVolume( detPlaneSolid, G4NistManager::Instance()->FindOrBuildMaterial("G4_Galactic"), "detPlaneLV");
    new G4PVPlacement( 0, G4ThreeVector( 0, 0, ( gOptions->GetDetZ_cm() + detPlaneSolid->GetZHalfLength() ) * cm ), detPlaneLV, "DetPlanePV", worldLV, false, 0, true);
    fDetPlaneSD = new GeantTrackerSD( 0 );
    SetSensitiveDetector( detPlaneLV, fDetPlaneSD );

    return worldPV;
}
void BuildMaterialTables() 
{
#ifdef DAGGEOMETRY_DEBUG
  std::cout << "==> FluDAG BuildMaterialTables()" << std::endl;
#endif

  //some terminal printout also
  std::cout << "\t* Storing information..." << std::endl;

  //The logic is the folloing:
  //Get the Material Table and:
  // 1) For materials with density <= 1.00e-10*g/cm3 assign vacuum
  // 2) For each single element material build a material equivalent
  // 3) For the rest:
  //   3.a) Build materials for each not already known element
  //   3.b) Build the compound out of them

  // initialize with predefined materials
  initmat = InitFlukaMat();
#ifdef DAGGEOMETRY_DEBUG
  std::cout << "end init predef mat  "  << std::endl;
#endif
  //Get the Material Table and iterate
  const G4MaterialTable* matTable = DagG4Material::GetMaterialTable();
  for (MatTableIterator i = matTable->begin(); i != matTable->end(); i++) {

    //Get some basic material information
    G4Material* material = (*i);
    DString matName = material->GetName();
    const G4double matDensity = material->GetDensity();
    const int nMatElements  = material->GetNumberOfElements();
#ifdef DAGGEOMETRY_DEBUG
    std::cout << " treating material " << matName    << std::endl;
#endif

    std::cout << " mat " << matName 
	   << ": dens. = " << matDensity/(g/cm3) << "g/cm3"
	   << ", nElem = " << nMatElements << std::endl;

    // 1) For materials with density <= 1.00e-10*g/cm3 assign vacuum
    //    FlukaMaterial* is  in that case
    if (matDensity <= 1.00e-10*g/cm3) {
#ifdef DAGGEOMETRY_DEBUG
    std::cout << " vacuum?  "<< matDensity    << std::endl;
#endif
      DString elemName("VACUUM");
      FlukaMaterial *flukamat = FlukaMaterial::GetFlukaMaterial(elemName);
      G4FlukaMaterialMap[material] = flukamat;
      std::cout << "\t\t  Stored as " << flukamat->GetRealName() << std::endl;
    }
    // 2) For each single element material build a material equivalent
    else if (nMatElements == 1) {
#ifdef DAGGEOMETRY_DEBUG
    std::cout << " single element "     << std::endl;
#endif
      
      FlukaMaterial *flukamat = 
	BuildFlukaMaterialFromElement(material->GetElement(0),
				      matDensity);
      
      G4FlukaMaterialMap[material] = flukamat;
      std::cout << "  Stored as " << flukamat->GetRealName() << std::endl;
      
    } //else if (material->GetNumberOfElements() == 1)
    
    // 3) For the rest:
    //   3.a) Build materials for each not already known element
    //   3.b) Build the compound out of them
    else {
#ifdef DAGGEOMETRY_DEBUG
      std::cout << " not  vacuum : call Comp. "<< matDensity/(g/cm3)   << std::endl;
#endif
      FlukaCompound* flukacomp = 
	BuildFlukaCompoundFromMaterial(material);
      G4FlukaCompoundMap[material] = flukacomp;
      std::cout << "\t\t  Stored as " << flukacomp->GetRealName() << std::endl;
    } //else for case 3)
  } //for (materials)
  
#ifdef DAGGEOMETRY_DEBUG
  std::cout << "<== Flugg FGeometryInit::BuildMaterialTables()" << std::endl;
#endif
}
示例#3
0
unsigned int GSMS::Geometry::defineMaterials()
{

	G4double	density,// density
			a,	// atomic mass
			z;	// atomic number
	G4double	G4d_density;
//	G4double	G4d_temp;
//	G4double	G4d_press;
	G4int	 	nelements;
	G4String	G4s_name;
	G4String	G4s_symbol;
	G4int		G4i_ncomp;

  G4Element* H = new G4Element("Hydrogen", "H", z=1., a=1.0079*g/mole);
  G4Element* C = new G4Element("Carbon", "C", z=6., a=12.011*g/mole);
  G4Element* N = new G4Element("Nitrogen", "N", 7., 14.00674*g/mole);
  G4Element* O = new G4Element("Oxygen", "O", 8., 16.00000*g/mole);
  G4Element* Na = new G4Element("Natrium", "Na", z=11., a=22.98977*g/mole);
  G4Element* Mg = new G4Element("Magnezium", "Mg", z=12., a=24.305*g/mole);
  G4Element* Al = new G4Element("Aluminium", "Al", z=13., a=26.981*g/mole);
  G4Element* Si = new G4Element("Silicium", "Si", z=14., a=28.086*g/mole);
  G4Element* P = new G4Element("Phosphorus", "P", z=15., a=30.973976*g/mole);
  G4Element* S = new G4Element("Sulfur", "S", z=16., a=32.06*g/mole);
  G4Element* Cl = new G4Element("Chlorine","Cl", z=17., a=35.453*g/mole);
  G4Element* K = new G4Element("Kalium", "K", z=19., a=39.098*g/mole);
  G4Element* Ca = new G4Element("Calcium", "Ca", z=20., a=40.08*g/mole);
  G4Element* Ti = new G4Element("Titanium", "Ti", z=22., a=47.9*g/mole);
  G4Element* Cr = new G4Element("Chrome", "Cr", z=24., a=51.996*g/mole);
  G4Element* Mn = new G4Element("Manganeze", "Mn", z=25., a=54.938*g/mole);
  G4Element* Fe = new G4Element("Ferrum", "Fe", z=26., a=55.847*g/mole);
  G4Element* Ni = new G4Element("Nickel", "Ni", z=28., a=58.7*g/mole);
  G4Element* Cu = new G4Element("Cuprum", "Cu", z=29., a=63.546*g/mole);
  G4Element* Zn = new G4Element("Zyncum", "Zn", z=30., a=65.38*g/mole);
  G4Element* Ge = new G4Element("Germanium", "Ge", z=32., a=72.59*g/mole);
  G4Element* Ag = new G4Element("Argentum", "Ag", z=47., a=107.8682*g/mole);  
  G4Element* I = new G4Element("Iodine", "I", z=53., a=126.904*g/mole);
  G4Element* Cs = new G4Element("Cesium", "Cs", z=55., a=132.905*g/mole);
  G4Element* Ba = new G4Element("Barium", "Ba", z=56., a=133.*g/mole);
  G4Element* W = new G4Element("Wolfram", "W", z=74., a=183.85*g/mole);
  G4Element* Pt = new G4Element("Platinum", "Pt", z=78., a=195.08*g/mole);  
  G4Element* Au = new G4Element("Aurum", "Au", z=79., a=196.9665*g/mole);  
  G4Element* Pb = new G4Element("Plumbum", "Pb", z=82., a=207.2*g/mole);
  G4Element* Bi = new G4Element("Bismuth", "Bi", z=83., a=208.9804*g/mole);

	G4Material*	mptr;
	std::string	name;

	try
	{
//vacuum
		name = "Vacuum";
		mptr = new G4Material(
				name.c_str(),	//name
				1,		//components
				1.00794*g/mole,	//1st component a/weight
				1.0E-25*g/cm3,	//density
				kStateGas,	//state
				0.1*kelvin,	//temp
				1.0E-19*pascal);//pressure
		m_materials.insert(std::pair<std::string,G4Material*>(name,mptr));
//air
		name = "Air";
		mptr = new G4Material(
				name,
				1.2929*kg/m3,
				2, 
				kStateGas,
				300.00*kelvin,
				1.0*atmosphere);
		mptr->AddElement(N,	0.8);
		mptr->AddElement(O,	0.2);
		m_materials.insert(std::pair<std::string,G4Material*>(name,mptr));
//aluminium
		name = "Aluminium";
		mptr = new G4Material(
				name,
				2.8*g/cm3,
				1);
		mptr->AddElement(Al,	1);
		m_materials.insert(std::pair<std::string,G4Material*>(name,mptr));
//lead
		name = "Lead";
		mptr = new G4Material(
				name,
				11.336*g/cm3,
				1);
		mptr->AddElement(Pb,	1);
		m_materials.insert(std::pair<std::string,G4Material*>(name,mptr));
//MgO
		name = "MgO";
		mptr = new G4Material(
			name, 
			0.7 * 2.506*g/cm3,
			2);
		mptr->AddElement(O,	1);
		mptr->AddElement(Mg,	1);
		m_materials.insert(std::pair<std::string,G4Material*>(name,mptr));
//glass
		name = "Glass";
		mptr = new G4Material(
			name, 
			2.6*g/cm3,
			7);
		mptr->AddElement(O,	59.8*perCent);
		mptr->AddElement(Si,	24.7*perCent);
		mptr->AddElement(Al,	1.4*perCent);
		mptr->AddElement(Mg,	1.4*perCent);
		mptr->AddElement(Ca,	2.3*perCent);
		mptr->AddElement(Na,	10.3*perCent);
		mptr->AddElement(Fe,	0.1*perCent);
		m_materials.insert(std::pair<std::string,G4Material*>(name,mptr));
//soil
		name = "Soil";
		mptr = new G4Material(
			name, 
			1.6*g/cm3,//1.3..2.0
			11);
		mptr->AddElement(O,	46.0*perCent);//46.7
		mptr->AddElement(Si,	27.0*perCent);
		mptr->AddElement(Al,	8.0*perCent);//8.0
		mptr->AddElement(Fe,	5.0*perCent);

		mptr->AddElement(Ca,	2.0*perCent);
		mptr->AddElement(Mg,	2.0*perCent);
		mptr->AddElement(K,	2.0*perCent);
		mptr->AddElement(Na,	2.0*perCent);
		mptr->AddElement(P,	2.0*perCent);
		mptr->AddElement(S,	2.0*perCent);
		mptr->AddElement(N,	2.0*perCent);
		m_materials.insert(std::pair<std::string,G4Material*>(name,mptr));
//steel
		name = "Steel";
		mptr = new G4Material(
			name, 
			7.81*g/cm3,
			7);
		mptr->AddElement(C,	0.0010);
		mptr->AddElement(Si,	0.0100);
		mptr->AddElement(Mn,	0.0065);
		mptr->AddElement(Cr,	0.0075);
		mptr->AddElement(Ni,	0.0065);
		mptr->AddElement(Cu,	0.0050);
		mptr->AddElement(Fe,	0.9635);
		m_materials.insert(std::pair<std::string,G4Material*>(name,mptr));

//stainless steel
		name = "H18N10";
		mptr = new G4Material(
			name, 
			7.81*g/cm3,
			7);
		mptr->AddElement(C,	0.001);
		mptr->AddElement(Si,	0.010);
		mptr->AddElement(Mn,	0.014);
		mptr->AddElement(Cr,	0.170);
		mptr->AddElement(Ni,	0.100);
		mptr->AddElement(Cu,	0.005);
		mptr->AddElement(Fe,	0.700);
		m_materials.insert(std::pair<std::string,G4Material*>(name,mptr));

//D16
		name = "D16";
		mptr = new G4Material(
			name, 
			2.8*g/cm3,
			9);
		mptr->AddElement(Al,	92.5*perCent);
		mptr->AddElement(Cu,	4.0*perCent);
		mptr->AddElement(Mg,	1.5*perCent);
		mptr->AddElement(Fe,	0.5*perCent);
		mptr->AddElement(Si,	0.5*perCent);
		mptr->AddElement(Mn,	0.5*perCent);
		mptr->AddElement(Zn,	0.3*perCent);
		mptr->AddElement(Ni,	0.1*perCent);
		mptr->AddElement(Ti,	0.1*perCent);
		m_materials.insert(std::pair<std::string,G4Material*>(name,mptr));
//plastic
		name = "Plastic";
		mptr = new G4Material(
			name,
			1.19*g/cm3,
			3);
		mptr->AddElement(H, 	0.08);
		mptr->AddElement(C, 	0.60);
		mptr->AddElement(O, 	0.32);
		m_materials.insert(std::pair<std::string,G4Material*>(name,mptr));
//GRP
		name = "GRP";
		mptr = new G4Material(
			name,
			1.7*g/cm3,
			4);
		mptr->AddElement(H, 	6);
		mptr->AddElement(C, 	45);
		mptr->AddElement(O, 	49);
		mptr->AddElement(Si, 	5);
		m_materials.insert(std::pair<std::string,G4Material*>(name,mptr));

//lavsan
		name = "Lavsan";
		mptr = new G4Material(
			name,
			1.38*g/cm3,
			3);
		mptr->AddElement(H, 	8);
		mptr->AddElement(C, 	10);
		mptr->AddElement(O, 	4);
		m_materials.insert(std::pair<std::string,G4Material*>(name,mptr));

		const int NUMENTRIES = 3;
		G4double PP[NUMENTRIES] =	{1.0*eV,	5.0*eV,	10.0*eV};

//CsI
		name = "CsI";
		mptr = new G4Material(
			name,
			4.51*g/cm3,
			2,
			kStateUndefined,
			273*kelvin);
		mptr->AddElement(Cs,	1);
		mptr->AddElement(I,	1);
		G4MaterialPropertiesTable*	Scn_Mt = new G4MaterialPropertiesTable();
		G4double CsI_RIND[NUMENTRIES] =	{1.79,		1.79,	1.79};
		G4double CsI_ABSL[NUMENTRIES] =	{71.*cm,	71*cm,	71.*cm};
		Scn_Mt->AddProperty("RINDEX",	PP, CsI_RIND, NUMENTRIES);
		Scn_Mt->AddProperty("ABSLENGTH",PP, CsI_ABSL, NUMENTRIES);
		Scn_Mt->AddConstProperty("SCINTILLATIONYIELD",	54000./MeV);
		Scn_Mt->AddConstProperty("RESOLUTIONSCALE",	0.0759);
		Scn_Mt->AddConstProperty("YIELDRATIO",		1.);
		Scn_Mt->AddConstProperty("EXCITATIONRATIO",	1.);
		mptr->SetMaterialPropertiesTable(Scn_Mt);
		m_materials.insert(std::pair<std::string,G4Material*>(name,mptr));
//NaI
		name = "NaI";
		mptr = new G4Material(
			name.c_str(),
			3.67*g/cm3,
			2,
			kStateUndefined,
			273*kelvin);
		mptr->AddElement(Na,	1);
		mptr->AddElement(I,	1);
		Scn_Mt = new G4MaterialPropertiesTable();
		G4double NaI_RIND[NUMENTRIES] =	{2.15,		2.15,	2.15};
		G4double NaI_ABSL[NUMENTRIES] =	{71.*cm,	71*cm,	71.*cm};
		Scn_Mt->AddProperty("RINDEX",	PP, NaI_RIND, NUMENTRIES);
		Scn_Mt->AddProperty("ABSLENGTH",PP, NaI_ABSL, NUMENTRIES);
		Scn_Mt->AddConstProperty("SCINTILLATIONYIELD",	38000./MeV);
		Scn_Mt->AddConstProperty("RESOLUTIONSCALE",	0.085);
		Scn_Mt->AddConstProperty("YIELDRATIO",		1.);
		Scn_Mt->AddConstProperty("EXCITATIONRATIO",	1.);
		mptr->SetMaterialPropertiesTable(Scn_Mt);
		m_materials.insert(std::pair<std::string,G4Material*>(name,mptr));
//BGO
		name = "BGO";
		mptr = new G4Material(
			name.c_str(),
			7.13*g/cm3,
			3,
			kStateUndefined,
			273*kelvin);
		mptr->AddElement(Bi,	4);
		mptr->AddElement(Ge,	3);
		mptr->AddElement(O,	12);
		Scn_Mt = new G4MaterialPropertiesTable();
		G4double BGO_RIND[NUMENTRIES] =	{2.15,		2.15,	2.15};
		G4double BGO_ABSL[NUMENTRIES] =	{71.*cm,	71*cm,	71.*cm};
		Scn_Mt->AddProperty("RINDEX",	PP, BGO_RIND, NUMENTRIES);
		Scn_Mt->AddProperty("ABSLENGTH",PP, BGO_ABSL, NUMENTRIES);
		Scn_Mt->AddConstProperty("SCINTILLATIONYIELD",	9000./MeV);
		Scn_Mt->AddConstProperty("RESOLUTIONSCALE",	0.11);
		Scn_Mt->AddConstProperty("YIELDRATIO",		1.);
		Scn_Mt->AddConstProperty("EXCITATIONRATIO",	1.);
		mptr->SetMaterialPropertiesTable(Scn_Mt);
		m_materials.insert(std::pair<std::string,G4Material*>(name,mptr));
//stylben
/*
		name = "Stylben";
		mptr = new G4Material(
			name.c_str(),
			1.16*g/cm3,
			2);
		mptr->AddElement(H,	12);
		mptr->AddElement(C,	14);
		Scn_Mt = new G4MaterialPropertiesTable();
		Scn_Mt->AddProperty("RINDEX",	Scn_PP, Scn_RIND, NUMENTRIES);
		Scn_Mt->AddProperty("ABSLENGTH",Scn_PP, Scn_ABSL, NUMENTRIES);
		Scn_Mt->AddConstProperty("SCINTILLATIONYIELD",	54000./MeV);
		Scn_Mt->AddConstProperty("RESOLUTIONSCALE",	0.0759);
		Scn_Mt->AddConstProperty("YIELDRATIO",		1.);
		Scn_Mt->AddConstProperty("EXCITATIONRATIO",	1.);
		mptr->SetMaterialPropertiesTable(Scn_Mt);
		m_materials.insert(std::pair<std::string,G4Material*>(name,mptr));
*/

	}
	catch(...)
	{
		return GSMS_ERR;
	}

	return GSMS_OK;
}