package edu.stanford.rsl.conrad.phantom;
import edu.stanford.rsl.conrad.calibration.CalibrationBead;
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;
/**
* currently configured for testing issues
*
* @author Philipp Roser
*
*/
public class RandomizedHelixPhantom extends AbstractCalibrationPhantom {
/**
*
*/
private static final long serialVersionUID = 7656948673135057853L;
@Override
public String getBibtexCitation() {
// TODO Auto-generated method stub
return null;
}
@Override
public String getMedlineCitation() {
// TODO Auto-generated method stub
return null;
}
@Override
public String getName() {
return "Randomized Helix Phantom";
}
@Override
public void configure() {
try {
/*
* cylRadius = UserUtil.queryDouble("Cylinder radius", cylRadius);
* cylHeight = UserUtil.queryDouble("Cylinder height", cylHeight);
* beadRadius = UserUtil.queryDouble("Bead radius", beadRadius);
* numberOfBeads = UserUtil.queryInt("Number of beads",
* numberOfBeads); matBead = UserUtil.queryString("Bead material",
* matBead); matCyl = UserUtil.queryString("Cylinder material",
* matCyl);
*/
beadX = new double[] { -4.768299081419134, -28.583261815726104,
-33.15013444310283, -38.28462115806606,
-16.691248963830002, -3.4641518008626044,
24.506062699587993, 34.94577196573563, 40.74303660269249,
40.6571136293865, 25.47881093544778, 18.907670989310382 };
beadY = new double[] { -40.59592281091954, -29.219219171183443,
-23.913055250306428, 14.319686022513226, 37.31176534321907,
40.72794221785064, 32.71419441104827, 21.20279808701686,
-3.2818582223581454, -4.214823404029449,
-31.962412585968956, -36.23900664698179 };
beadZ = new double[] { 18.333333333333332, 15.0,
11.666666666666666, 8.333333333333334, 5.0,
1.6666666666666679, -1.6666666666666679, -5.0,
-8.333333333333332, -11.666666666666668, -15.0,
-18.333333333333336 };
buildPhantom();
} catch (Exception e) {
// TODO: handle exception
}
}
private void buildPhantom() {
Cylinder shape = new Cylinder(cylRadius, cylRadius, cylHeight);
PhysicalObject po = new PhysicalObject();
po.setMaterial(MaterialsDB.getMaterialWithName(matCyl));
po.setShape(shape);
add(po);
shape = new Cylinder(0.8 * cylRadius, 0.8 * cylRadius, cylHeight);
po = new PhysicalObject();
po.setMaterial(MaterialsDB.getMaterialWithName("vacuum"));
po.setShape(shape);
add(po);
//beadX = new double[numberOfBeads];
//beadY = new double[numberOfBeads];
//beadZ = new double[numberOfBeads];
//double phi = 2.0 * Math.PI * Math.random();
for (int i = 1; i <= numberOfBeads; i++) {
//double rand = Math.random();
// double phi = 2.0 * Math.PI * rand;
//phi += (rand); // --> randomized helix (actually
// best)
// phi += (2.0 * Math.PI * rand); // --> bad distribution
// double signum = rand - 0.5;
// phi += (2.0 * Math.PI * signum); // --> overlay
//double x = (cylRadius - 0.125) * Math.sin(phi);
//double y = (cylRadius - 0.125) * Math.cos(phi);
//double z = cylHeight / 2.0 - cylHeight * ((double) i - 0.5)
// / numberOfBeads;
// boolean largeBead = i % 2 == 0 ? true : false;
//beadX[i - 1] = x;
//beadY[i - 1] = y;
//beadZ[i - 1] = z;
// boolean largeBead = i % 2 == 0 ? false : true;
Sphere sp = new Sphere(beadRadius, new PointND(beadX[i - 1],
beadY[i - 1], beadZ[i - 1]));
po = new PhysicalObject();
po.setMaterial(MaterialsDB.getMaterialWithName(matBead));
po.setShape(sp);
add(po);
}
}
public void setBeadCoordinates(CalibrationBead bead, int id) {
bead.setX(beadX[id]);
bead.setY(beadY[id]);
bead.setZ(beadZ[id]);
}
public RandomizedHelixPhantom() {
beadX = new double[] { -4.768299081419134, -28.583261815726104,
-33.15013444310283, -38.28462115806606,
-16.691248963830002, -3.4641518008626044,
24.506062699587993, 34.94577196573563, 40.74303660269249,
40.6571136293865, 25.47881093544778, 18.907670989310382 };
beadY = new double[] { -40.59592281091954, -29.219219171183443,
-23.913055250306428, 14.319686022513226, 37.31176534321907,
40.72794221785064, 32.71419441104827, 21.20279808701686,
-3.2818582223581454, -4.214823404029449,
-31.962412585968956, -36.23900664698179 };
beadZ = new double[] { 18.333333333333332, 15.0,
11.666666666666666, 8.333333333333334, 5.0,
1.6666666666666679, -1.6666666666666679, -5.0,
-8.333333333333332, -11.666666666666668, -15.0,
-18.333333333333336 };
}
public double getX(int id) {
return beadX[id];
}
public double getY(int id) {
return beadY[id];
}
public double getZ(int id) {
return beadZ[id];
}
public int getNumberOfBeads() {
return numberOfBeads;
}
@Override
public void init() {
// TODO Auto-generated method stub
}
}