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;
import edu.stanford.rsl.conrad.utils.UserUtil;
/**
*
* currently configured for testing issues
*
* @author Philipp Roser
*
*/
public class RandomDistributionPhantom extends AbstractCalibrationPhantom {
/**
*
*/
private static final long serialVersionUID = -789819488764215415L;
@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 "Random Distribution 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[] { 33.463596785306244, -39.354934605273954,
-19.149697733008153, -29.706338119346714, 4.39305803441938,
-11.062200522021858, -40.57471779970433, 28.918966257925426,
-24.55910340306199, -22.19410314081742, -18.590045202218406,
40.453397715849235 };
beadY = new double[] { -23.4723947476699, 11.043312329849718,
-36.111697574808396, -28.076664697557085, 40.638241424872504,
-39.349629535874655, 4.945492945537007, 28.88700426788785,
-32.67439463919277, 34.32473467886909, 36.40296477458225,
-5.855615957636211 };
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 scale() {
}
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);
// 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;
// --> overlay // 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 RandomDistributionPhantom() {
beadX = new double[] { 33.463596785306244, -39.354934605273954,
-19.149697733008153, -29.706338119346714, 4.39305803441938,
-11.062200522021858, -40.57471779970433, 28.918966257925426,
-24.55910340306199, -22.19410314081742, -18.590045202218406,
40.453397715849235 };
beadY = new double[] { -23.4723947476699, 11.043312329849718,
-36.111697574808396, -28.076664697557085, 40.638241424872504,
-39.349629535874655, 4.945492945537007, 28.88700426788785,
-32.67439463919277, 34.32473467886909, 36.40296477458225,
-5.855615957636211 };
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
}
/*public static void main(String[] args) {
RandomPhantom phantom = new RandomPhantom();
phantom.buildPhantom();
System.out.print("beadX = {");
for (int i = 0; i < phantom.numberOfBeads; i++) {
System.out.print(" " + phantom.beadX[i]);
if (i != phantom.numberOfBeads - 1) {
System.out.print(",");
} else {
System.out.println("};");
}
}
System.out.print("beadY = {");
for (int i = 0; i < phantom.numberOfBeads; i++) {
System.out.print(" " + phantom.beadY[i]);
if (i != phantom.numberOfBeads - 1) {
System.out.print(",");
} else {
System.out.println("};");
}
}
System.out.print("beadZ = {");
for (int i = 0; i < phantom.numberOfBeads; i++) {
System.out.print(" " + phantom.beadZ[i]);
if (i != phantom.numberOfBeads - 1) {
System.out.print(",");
} else {
System.out.println("};");
}
}
}*/
}