content: package edu.stanford.rsl.conrad.phantom;
  
  import edu.stanford.rsl.conrad.geometry.shapes.simple.Cylinder;
  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;
  
  /**
   * Phantom to test Subtract-and-Shift (SaS). 
   * 
   * @author Chris Schwemmer
   *
   */
  public class CatheterPhantom extends AnalyticPhantom {
  
  	/**
  	 * 
  	 */
  	private static final long serialVersionUID = -144401635934271936L;
  
  	@Override
  	public String getBibtexCitation() {
  		return "To be published";
  	}
  
  	@Override
  	public String getMedlineCitation() {
  		return "To be published";
  	}
  
  	@Override
  	public String getName() {
  		return "Catheter Phantom";
  	}
  
  	public CatheterPhantom() {
  		// Parameters
  		double mainRadius = 80.0;
  		double mainLength = 120.0;
  		double centralRadius = 20.0;
  		double centralLength = 20.0;
  		double sat1Radius = 8.0;
  		double sat2Radius = 4.0;
  		double satLength = 70.0;
  		boolean doCentre = true;
  		
  		// Body of the phantom
  		Cylinder mainCylinder = new Cylinder(mainRadius, mainRadius, mainLength);
  		
  		PhysicalObject po = new PhysicalObject();
  		po.setMaterial(MaterialsDB.getMaterialWithName("Heart")); // D = 1.05
  		po.setShape(mainCylinder);
  		
  		add(po);
  		
  		// Central, high-density cylinder
  		if (doCentre) {
  			Cylinder centralCylinder = new Cylinder(centralRadius, centralRadius, centralLength);
  		
  			po = new PhysicalObject();
  			po.setMaterial(MaterialsDB.getMaterialWithName("LYSO")); // D = 5.37
  			po.setShape(centralCylinder);
  		
  			add(po);
  		}
  		
  		int prior = getHighestPriority() + 1;
  		
  		// Surrounding cylinders
  		for (int i = 0; i < 8; ++i) {
  			Cylinder aCylinder = new Cylinder(((i % 2) == 0) ? sat1Radius : sat2Radius,
  											  ((i % 2) == 0) ? sat1Radius : sat2Radius,
  											  satLength);
  			
  			double axisStep = (mainRadius - centralRadius) / 2.0 + centralRadius;
  			double diagStep = axisStep / Math.sqrt(2);
  
  			double dX = 0, dY = 0;
  			switch (i) {
  				case 0:
  					dY = -axisStep;
  					break;
  				case 1:
  					dX = diagStep;
  					dY = -diagStep;
  					break;
  				case 2:
  					dX = axisStep;
  					break;
  				case 3:
  					dX = diagStep;
  					dY = diagStep;
  					break;
  				case 4:
  					dY = axisStep;
  					break;
  				case 5:
  					dX = -diagStep;
  					dY = diagStep;
  					break;
  				case 6:
  					dX = -axisStep;
  					break;
  				case 7:
  					dX = -diagStep;
  					dY = -diagStep;
  					break;
  			}
  			
  			aCylinder.applyTransform(new Translation(new SimpleVector(dX, dY, 0)));
  			
  			po = new PhysicalObject();
  			po.setMaterial(MaterialsDB.getMaterialWithName("Bone")); // D = 1.92
  			po.setShape(aCylinder);
  			
  			add(po, prior);
  		}
  	}
  }
  /*
   * Copyright (C) 2010-2014 Chris Schwemmer
   * CONRAD is developed as an Open Source project under the GNU General Public License (GPL).
  */