Creating Custom Materials
Table of Contents
Elements
Custom materials in Geant4 start from elements. An element stores the chemical symbol, atomic number $Z$, and atomic mass $A$. You only need to define an element yourself when it is not already available in the NIST database, or when you want to control the exact isotopic composition.
A typical element definition uses the G4Element class. You normally create elements as static objects or as data members in your detector construction, so they are built once when the geometry is initialized. The simplest constructor takes a name, a symbol, the atomic number, and the atomic mass.
For example, an element with a single isotope can be created like this:
#include "G4Element.hh"
#include "G4SystemOfUnits.hh"
auto elSi = new G4Element("Silicon", "Si", 14., 28.0855*g/mole);
The atomic mass must always be given in units of mass per mole, usually with *g/mole. Geant4 internally converts this to the correct units. It is usually sufficient to copy atomic masses from a reliable source such as the periodic table.
When you need isotopic control, for example for enriched materials, you use G4Isotope and then build the element from isotopes.
#include "G4Isotope.hh"
auto isoU235 = new G4Isotope("U235", 92, 235, 235.0439*g/mole);
auto isoU238 = new G4Isotope("U238", 92, 238, 238.0508*g/mole);
auto elU = new G4Element("Enriched Uranium", "U", 2);
elU->AddIsotope(isoU235, 80.*perCent);
elU->AddIsotope(isoU238, 20.*perCent);
The last argument in the G4Element constructor above is the number of isotopes. You then add isotopes with their abundance fractions. Geant4 provides the constant perCent to make fractions clearer in the code.
Always specify element masses in $g/mole$ and isotopic fractions that sum to 100% (or 1.0). Incorrect units or inconsistent fractions will silently produce wrong physics.
For many simulations you never need to define elements by hand, because you can use G4NistManager to get common materials that already contain their elements and isotopes. Custom element definitions are useful when you work with unusual compositions, enriched materials, or need reproducible definitions that do not depend on external databases.
Compounds
A compound in Geant4 is a material built from elements with fixed stoichiometric ratios, such as water, silicon dioxide, or organic scintillators. You define compounds with the G4Material class by specifying their density, number of components, and the relative composition in terms of either atoms or mass fractions.
The basic pattern for a compound with known chemical formula uses the AddElement method with a number of atoms per molecule. For example, water $H_2O$ can be created like this:
#include "G4Material.hh"
#include "G4SystemOfUnits.hh"
auto elH = new G4Element("Hydrogen", "H", 1., 1.008*g/mole);
auto elO = new G4Element("Oxygen", "O", 8., 16.00*g/mole);
G4double density = 1.0*g/cm3;
G4int nComponents = 2;
auto water = new G4Material("WaterCustom", density, nComponents);
water->AddElement(elH, 2); // 2 atoms of H
water->AddElement(elO, 1); // 1 atom of OHere the material is defined as a compound with two component elements, and the composition is given by the number of atoms per formula unit. Geant4 uses the atomic masses of the elements to derive mass fractions internally.
If you instead know the mass fractions directly, for example from a specification sheet, you can use the overload with a fraction by mass:
auto elC = new G4Element("Carbon", "C", 6., 12.011*g/mole);
auto elH2 = new G4Element("Hydrogen", "H", 1., 1.008*g/mole);
G4double plasticDensity = 1.03*g/cm3;
auto plastic = new G4Material("PlasticScintillator", plasticDensity, 2);
plastic->AddElement(elC, 91.5*perCent);
plastic->AddElement(elH2, 8.5*perCent);
You must choose one composition scheme for a material. For a given component element call either AddElement(el, nAtoms) or AddElement(el, fractionMass), not both.
In some cases it is convenient to let Geant4 compute the density from pressure and temperature, for gases. Then you use a constructor that takes Z, A, and density directly, or you derive density from the ideal gas law in your own code. For custom compounds in the solid state, you usually specify the density from data sheets, as it affects interaction probabilities and macroscopic cross sections.
Keep the density consistent with the composition. If you change the stoichiometry or mass fractions, update the density using reliable data. An incorrect density changes energy loss and interaction lengths throughout your simulation.
Compounds are a natural representation of well defined chemical substances, such as quartz, plastics, and most scintillators. Use them when your material has a fixed chemical formula or a small number of elements with known ratios.
Mixtures
Mixtures in Geant4 are materials built from other materials or elements combined by mass fraction or volume fraction, without implying a specific chemical compound. Examples are air as a mixture of nitrogen and oxygen, concrete as a mixture of several oxides and aggregates, or biological tissues built from water, proteins, and lipids.
In practice, Geant4 uses the same G4Material interface for compounds and mixtures. The difference is conceptual. A mixture is usually defined from mass fractions rather than integer stoichiometric ratios, and its components can be either elements or other materials.
A mixture built from elements by mass fraction looks like this:
auto elN = new G4Element("Nitrogen", "N", 7., 14.01*g/mole);
auto elO = new G4Element("Oxygen", "O", 8., 16.00*g/mole);
G4double airDensity = 1.29*mg/cm3;
auto airCustom = new G4Material("AirCustom", airDensity, 2);
airCustom->AddElement(elN, 70.*perCent);
airCustom->AddElement(elO, 30.*perCent);Here the numbers are approximate and only serve as an example. For realistic simulations you would use more precise fractions and possibly include argon and other trace gases.
You can also create a mixture from existing materials, for example a composite detector material made of a plastic scintillator and a small fraction of a high Z additive:
auto plastic = /* defined earlier */;
auto highZ = /* some lead glass or metal */;
G4double mixDensity = 1.20*g/cm3;
auto composite = new G4Material("CompositeDet", mixDensity, 2);
composite->AddMaterial(plastic, 95.*perCent);
composite->AddMaterial(highZ, 5.*perCent);This is useful for layered or doped materials where you prefer to express the composition in terms of already defined building blocks.
Geant4 also supports building mixtures with volume fractions, but this is less common for beginners and only appropriate if you know the relative volumes and the components have very different densities. In that case you would compute the resulting density yourself and still use mass fractions when calling AddMaterial or AddElement.
When you create realistic detector or shielding materials, such as concrete, bone, or tissue, you often start from a table of mass fractions and an experimentally measured density. You then map each chemical constituent in the table to either an element or a simple compound material, and add them to a new G4Material with their listed mass fractions.
For mixtures defined from mass fractions, the sum of all fractions must be exactly 100% (or 1.0). Always check the fractions and the final density against reference data for the material you want to model.
Mixtures are particularly important for simulations in medical physics and radiation protection, since human tissues, shielding concretes, and industrial materials rarely have simple chemical formulas. By building mixtures carefully from reliable composition and density data you achieve more realistic interaction cross sections and dose distributions in your Geant4 simulations.
Views: 12
KAHIBARO