package edu.stanford.rsl.conrad.phantom.electrondensity; import edu.stanford.rsl.conrad.phantom.AnalyticPhantom; import edu.stanford.rsl.conrad.physics.materials.database.MaterialsDB; import edu.stanford.rsl.conrad.utils.Configuration; import edu.stanford.rsl.conrad.utils.RegKeys; /** * <p>This class models <a href = "http://www.cirsinc.com/pdfs/062cp.pdf"> CRIS's Electron Density Phantom Model 062 </a>.<br/> * This phantom enables precise correlation of CT data in hounsfield units to electron density and includes eight different tissue references.<br/> * Model 062 consists of a small cylindrical disk (Inner) nested within a large spherical disk (Outer).<br/> * Phantom can be configured to simulate head or abdomen, by positioning tissue equivalent samples at 17 different locations within the scan field. * * <p>The outer disks inserts are evenly spaced and labeled from 0 - 7. Assuming the face of the outer disk is a perfect circle, then Insert 0 represents the insert at (x,y,theta) = (x,0,0)<br/> * The inner disk inserts are evenly spaced and labeled from 0 - 8. Assuming the face of the inner disk is a perfect circle, then Insert 0 represents the insert at (x,y,theta) = (x,0,0), while Insert 9 represents the insert at (x,y,theta) = (0,0,0). * * [TO BE COMPLETED] * * @author Rotimi X Ojo */ public class CrisEDPhantomM062 extends AnalyticPhantom { /** * */ private static final long serialVersionUID = -7299055837928247210L; public static int OUTER_RING = 1; public static int INNER_RING = 2; private Insert[] innerDiskIns = new Insert[9]; private Insert[] outerDiskIns = new Insert[8]; private boolean useInnerDisk= true; private boolean useOuterDisk = true; private boolean useBoneRing = true; private double centralInsertDiameter; private double insertOneDiameter; private EDInnerDisk inner = new EDInnerDisk(); private EDOuterDisk outer = new EDOuterDisk(); public CrisEDPhantomM062(){ } @Override public void configure() throws Exception{ super.configure(); useBoneRing = Boolean.parseBoolean(Configuration.getGlobalConfiguration().getRegistryEntry(RegKeys.ED_PHANTOM_BONE_RING)); centralInsertDiameter = Double.parseDouble(Configuration.getGlobalConfiguration().getRegistryEntry(RegKeys.ED_PHANTOM_CENTERAL_BUFFER_DIAMETER)); insertOneDiameter = Double.parseDouble(Configuration.getGlobalConfiguration().getRegistryEntry(RegKeys.ED_PHANTOM_INSERT_1_BUFFER_DIAMETER)); for(int i = 0; i < 9; i++){ innerDiskIns[i] = new Insert( MaterialsDB.getMaterial("vacuum"), Insert.UNBUFFERED_INSERT); } for(int i = 0; i < 8; i++){ outerDiskIns[i] = new Insert( MaterialsDB.getMaterial("vacuum"), Insert.UNBUFFERED_INSERT); } new CrisEDPhantomGUI(this); initDisks(); } public void setRingState(int ring, boolean state){ if(ring == OUTER_RING){ useOuterDisk = state; }else{ useInnerDisk = state; } } public boolean getRingState(int ring){ if(ring == OUTER_RING){ return useOuterDisk; }else{ return useInnerDisk; } } public String getInsertValue(int ring, int index){ if(ring == OUTER_RING){ return outerDiskIns[index].toString(); }else{ return innerDiskIns[index].toString(); } } public int getInsertBufferState(int ring, int index) { if(ring == OUTER_RING){ return outerDiskIns[index].getBufferState(); }else{ return innerDiskIns[index].getBufferState(); } } public void setInsert(int ring, int index, Insert ins){ if(ring == OUTER_RING){ outerDiskIns[index] = ins; }else{ innerDiskIns[index] = ins; } } private void initDisks() { if(useOuterDisk){ for(int i = 0; i < outerDiskIns.length; i++){ outer.addInsert(outerDiskIns[i], i); } addAll(outer); } else { if (useBoneRing){ double dx = 95, dy = 95, dz = 50/2; QuadricDisk disk = new QuadricDisk(dx, dy, dz); disk.setMaterial(MaterialsDB.getMaterial("Bone")); add(disk); } } if(useInnerDisk){ for(int i = 0; i < innerDiskIns.length; i++){ inner.addInsert(innerDiskIns[i], i); } addAll(inner); } } @Override public String getName() { return "CRIS Phantom M062"; } @Override public String getBibtexCitation() { // TODO Auto-generated method stub return null; } @Override public String getMedlineCitation() { // TODO Auto-generated method stub return null; } } /* * Copyright (C) 2010-2014 Rotimi X Ojo * CONRAD is developed as an Open Source project under the GNU General Public License (GPL). */