package edu.stanford.rsl.conrad.phantom; import edu.stanford.rsl.conrad.geometry.shapes.simple.Cylinder; import edu.stanford.rsl.conrad.geometry.shapes.simple.PointND; import edu.stanford.rsl.conrad.geometry.shapes.simple.Sphere; import edu.stanford.rsl.conrad.physics.PhysicalObject; import edu.stanford.rsl.conrad.physics.materials.database.MaterialsDB; import edu.stanford.rsl.conrad.utils.CONRAD; import edu.stanford.rsl.jpop.utils.UserUtil; /** * Phantom to test forward and back projection resolution. * * Creates seven small beads of high contrast at several locations, encased in a water cylinder. * The material is set to Plexiglass (density of 1.95). * * @author Martin Berger * */ public class SevenBeadPhantom extends AnalyticPhantom { /** * */ private static final long serialVersionUID = 6633919775510507739L; double beadRadius = 0.5; double beadXYdist = 0.8; double beadZdist = 0.8; double cylRadius = 100; double cylHeight = 200; @Override public String getBibtexCitation() { return CONRAD.CONRADBibtex; } @Override public String getMedlineCitation() { return CONRAD.CONRADMedline; } @Override public String getName() { return "Seven Bead Phantom"; } @Override public void configure() { try { beadRadius = UserUtil.queryDouble("Bead radius", beadRadius); cylRadius = UserUtil.queryDouble("Radius of the cylinder", cylRadius); cylHeight = UserUtil.queryDouble("Height of the cylinder", cylHeight); beadXYdist = UserUtil.queryDouble("Bead x/y position as a fraction of the cylinder radius", beadXYdist); beadZdist = UserUtil.queryDouble("Bead z position as a fraction of the cylinder height", beadZdist); buildPhantom(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } } protected void buildPhantom(){ Cylinder s = new Cylinder(cylRadius, cylRadius, cylHeight); s.setName("Water Cylinder"); PhysicalObject po = new PhysicalObject(); po.setMaterial(MaterialsDB.getMaterialWithName("Water")); // D = 1.95 po.setShape(s); add(po); double beadPosXY = cylRadius * beadXYdist; double beadPosZ = (cylHeight / 2.0) * beadZdist; // Body of the phantom. PointND center = new PointND(0,0,0); // center bead Sphere sp = new Sphere(beadRadius, center); sp.setName("High Constrast Bead"); po = new PhysicalObject(); po.setMaterial(MaterialsDB.getMaterialWithName("Plexiglass")); // D = 1.95 po.setShape(sp); add(po); // left center = new PointND(beadPosXY,0,0); sp = new Sphere(beadRadius, center); sp.setName("High Constrast Bead"); po = new PhysicalObject(); po.setMaterial(MaterialsDB.getMaterialWithName("Plexiglass")); // D = 1.95 po.setShape(sp); add(po); // right center = new PointND(-beadPosXY,0,0); sp = new Sphere(beadRadius, center); sp.setName("High Constrast Bead"); po = new PhysicalObject(); po.setMaterial(MaterialsDB.getMaterialWithName("Plexiglass")); // D = 1.95 po.setShape(sp); add(po); // top center = new PointND(0, -beadPosXY,0); sp = new Sphere(beadRadius, center); sp.setName("High Constrast Bead"); po = new PhysicalObject(); po.setMaterial(MaterialsDB.getMaterialWithName("Plexiglass")); // D = 1.95 po.setShape(sp); add(po); // bottom center = new PointND(0, beadPosXY,0); sp = new Sphere(beadRadius, center); sp.setName("High Constrast Bead"); po = new PhysicalObject(); po.setMaterial(MaterialsDB.getMaterialWithName("Plexiglass")); // D = 1.95 po.setShape(sp); add(po); // down center = new PointND(0, 0, -beadPosZ); sp = new Sphere(beadRadius, center); sp.setName("High Constrast Bead"); po = new PhysicalObject(); po.setMaterial(MaterialsDB.getMaterialWithName("Plexiglass")); // D = 1.95 po.setShape(sp); add(po); // up center = new PointND(0, 0, beadPosZ); sp = new Sphere(beadRadius, center); sp.setName("High Constrast Bead"); po = new PhysicalObject(); po.setMaterial(MaterialsDB.getMaterialWithName("Plexiglass")); // D = 1.95 po.setShape(sp); add(po); } public SevenBeadPhantom() { } } /* * Copyright (C) 2010-2014 Martin Berger * CONRAD is developed as an Open Source project under the GNU General Public License (GPL). */