Friedrich-Alexander-Universität
Friedrich-Alexander-Universität
Stanford Radiology

Custom Materials

Preliminaries

One convenient thing about CONRAD is that we have a complete API for the NIST X-ray attenuation databases (http://www.nist.gov/pml/data/xraycoef/index.cfm). Thus, we are able to access all elemental and compound data in the database. However, CONRAD is not just restricted to the materials in that database. CONRAD also features capabilities to model other materials quite accurately. In order to do so, you only require the elemental composition of the material that you intend to model and its density as it will appear in your simulation.

Modeling of a Custom Contrast Agent

In this tutorial, we will model a contrast agent as it is commonly used in clinical practice. In this case, we chose iopromide which is available commercially under the name “Ultravist®” (http://bayerimaging.com/products/ultravist/). Doing a small background check gave us two very valuable sources. rxlist.com (http://www.rxlist.com/ultravist-drug.htm) reports the concentration of iopromide in different versions of Ultravist® and Wikipedia (http://en.wikipedia.org/wiki/Iopromide) tells us that the composition of iopromide is C18H24I3N3O8.With these sources, we have enough information to create a quite accurate simulation of Ultravist’s absorption characteristics.

Creation of Compound Materials using the API

Using the chemical formula of Iopromide, we can create a custom material. At first we need to decode the chemical formula to its weighted atomic composition:

WeightedAtomicComposition wacIopromide = new WeightedAtomicComposition("C18H24I3N3O8");

Next, we can create a new Material using this atomic composition:

MaterialUtils.newMaterial("iopromide", density, wacIopromide);

This will create a new material that behaves as iopromide with respect to x-ray absorption. The example above, however, has two flaws:

  • We do not know the density of iopromide.

  • Iopromide appears as solution in water in the contrast agent. Thus, we also need to model this aspect in our simulation.

Creation of Mixtures of Compounds

In order to create a solution consisting of water and iopromide, we employ again the weighted atomic composition API. But first, we need to remember a couple of basics from chemistry. In order to be able to compute the correct parameters for the mixing, we need to know how many particles we need from the one compound (here water) and how many from the other compound (iopromide).

Fortunately, the API gives us the means to do so. First we need to determine how many moles, i.e. particles are in one gram of water. Thus, we require the molar mass of water. This can be computed with two API calls:

WeightedAtomicComposition water = new WeightedAtomicComposition("H2O");

double molarMassWater = MaterialUtils.computeMolarMass(water);

The number of moles is then computed as:

double waterParticlesIn1Gram = 1 / molarMassWater;

Next, we do the same for iopromide:            

WeightedAtomicComposition wacIopromide = new WeightedAtomicComposition("C18H24I3N3O8");

double molarMassIopromide = MaterialUtils.computeMolarMass(wacIopromide);

From rxlist.com, we learned that Ultravist150 contains 311.7 mg of iopromide. Thus we need to compute the number of moles for this mass:

double iopromideParticles = 0.3117 / molarMassIopromide;

Now, we can create a micture with the appropriate weighting:

WeightedAtomicComposition wacUltravist = new WeightedAtomicComposition("H2O", waterParticlesIn1Gram);

wacUltravist.add(formularIopromideString, iopromideParticles);

Based on this atomic composition, we can now create the respective mixture:                              

Mixture iopromideSolution = new Mixture();

iopromideSolution.setDensity(1.157);

iopromideSolution.setName("Ultravist150”);

iopromideSolution.setWeightedAtomicComposition(wacUltravist);

In order to save the material for later use, we can now embed it in our local material database:

MaterialsDB.put(iopromideSolution);

Result

Energy-dependent X-ray absorption values for four different materials.

The figure on the right shows the interpolated absorption values as mu / rho (i.e. normalized with its density). You can clearly see the differences between water, pure iodine, and two versions of Ultravist.

Code

The code for this example is found in edu.stanford.rsl.tutorial.physics in CreateCustomMaterial.java.