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).
*/