package edu.stanford.rsl.conrad.phantom; import edu.stanford.rsl.conrad.geometry.shapes.simple.Cylinder; import edu.stanford.rsl.conrad.geometry.trajectories.Trajectory; import edu.stanford.rsl.conrad.geometry.transforms.Translation; import edu.stanford.rsl.conrad.numerics.SimpleVector; import edu.stanford.rsl.conrad.physics.PhysicalObject; import edu.stanford.rsl.conrad.physics.materials.database.MaterialsDB; import edu.stanford.rsl.conrad.utils.Configuration; /** * Creates a phantom that is scaled to the field of view of the trajectory with five disks in it. * With this phantom we can investigate the effect of increasing cone angle. * * @author akmaier * */ public class DefrisePhantom extends AnalyticPhantom { /** * */ private static final long serialVersionUID = 6331427750379955185L; @Override public String getBibtexCitation() { return "@book{Zeng10-MIR,\n" + " author={Zeng GL},\n" + " title={Medical Image Reconstruction: A Conceptual Tutorial},\n" + " publisher={Springer},\n" + " location={Berlin, Heidelberg},\n" + " year={2010}\n" + "}"; } @Override public String getMedlineCitation() { return "Zeng GL. Medical Image Reconstruction: A Conceptual Tutorial. Springer Berlin/Heidelberg, 2010."; } @Override public String getName() { return "Defrise Cylinder Phantom"; } public DefrisePhantom(){ Trajectory trajectory = Configuration.getGlobalConfiguration().getGeometry(); double sourceAxisDistance = trajectory.getSourceToAxisDistance(); double sourceDetectorDistance = trajectory.getSourceToDetectorDistance(); double detectorYAxis = trajectory.getDetectorHeight() * trajectory.getPixelDimensionY(); double detectorXAxis = trajectory.getDetectorWidth() * trajectory.getPixelDimensionX(); double fovRadius = detectorXAxis * sourceAxisDistance / sourceDetectorDistance / 2 * 0.95; double diskRadius = 4.0/5.0 * fovRadius; double fovHeight = detectorYAxis * sourceAxisDistance / sourceDetectorDistance; double diskHeight = fovHeight/15.0; double diskSpacing = fovHeight/15.0; int numDisks = 5; double diskStart =-(fovHeight / 2.0) + ((fovHeight - (numDisks*diskHeight+diskSpacing*(numDisks-1)))/2.0) + diskHeight/2.0; // Water Body Cylinder cyl = new Cylinder(fovRadius,fovRadius,fovHeight); cyl.setName("Water-like body of the phantom"); PhysicalObject po = new PhysicalObject(); po.setMaterial(MaterialsDB.getMaterialWithName("Water")); // D = 1.0 po.setShape(cyl); add(po); // Disk Inserts for (int i=0; i < numDisks; i++){ cyl = new Cylinder(diskRadius,diskRadius,diskHeight); cyl.setName("Disk"); cyl.applyTransform(new Translation(new SimpleVector(0, 0, diskStart + (diskSpacing+diskHeight)*i))); po = new PhysicalObject(); po.setMaterial(MaterialsDB.getMaterialWithName("Plexiglass")); // D = 1.95 po.setShape(cyl); add(po); } } } /* * Copyright (C) 2010-2014 Andreas Maier * CONRAD is developed as an Open Source project under the GNU General Public License (GPL). */