package edu.stanford.rsl.conrad.pipeline;
import java.util.concurrent.CountDownLatch;
import edu.stanford.rsl.conrad.data.numeric.Grid2D;
import edu.stanford.rsl.conrad.data.numeric.Grid3D;
import edu.stanford.rsl.conrad.geometry.trajectories.MultiSweepTrajectory;
import edu.stanford.rsl.conrad.parallel.NamedParallelizableRunnable;
import edu.stanford.rsl.conrad.parallel.ParallelThreadExecutor;
public class ParallelProjectionDataSinkFeeder implements NamedParallelizableRunnable{
private Grid2D projection = null;
private int projectionNumber = 0;
private ProjectionSink sink = null;
public Grid2D getProjection() {
return projection;
}
public void setProjection(Grid2D projection) {
this.projection = projection;
}
public int getProjectionNumber() {
return projectionNumber;
}
public void setProjectionNumber(int projectionNumber) {
this.projectionNumber = projectionNumber;
}
public ProjectionSink getSink() {
return sink;
}
public void setSink(ProjectionSink sink) {
this.sink = sink;
}
@Override
public String getProcessName() {
String revan = "Parallel Projector";
if (sink != null){
revan += " " + sink.getName();
}
return revan;
}
@Override
public void run() {
try {
sink.process(projection, projectionNumber);
} catch (Exception e){
e.printStackTrace();
}
latch.countDown();
}
protected CountDownLatch latch = null;
@Override
public void setLatch(CountDownLatch latch) {
this.latch = latch;
}
public static void projectParallel(Grid3D projections, ProjectionSink sink, boolean showStatus){
ParallelProjectionDataSinkFeeder [] threads = new ParallelProjectionDataSinkFeeder[projections.getSize()[2]];
for (int p = 0; p < projections.getSize()[2]; p++){ // for all projections
Grid2D currentProjection = projections.getSubGrid(p);
threads[p] = new ParallelProjectionDataSinkFeeder();
threads[p].setProjection(currentProjection);
threads[p].setSink(sink);
threads[p].setProjectionNumber(MultiSweepTrajectory.getImageIndexInSingleSweepGeometry(p));
}
ParallelThreadExecutor exec = new ParallelThreadExecutor(threads);
try {
exec.setShowStatus(showStatus);
exec.execute();
sink.close();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
/*
* Copyright (C) 2010-2014 Andreas Maier
* CONRAD is developed as an Open Source project under the GNU General Public License (GPL).
*/