package edu.stanford.rsl.conrad.phantom.renderer;
import java.util.ArrayList;
import java.util.Collections;
import edu.stanford.rsl.conrad.parallel.ParallelThreadExecutor;
import edu.stanford.rsl.conrad.phantom.workers.AnalyticPhantomProjectorWorker;
import edu.stanford.rsl.conrad.phantom.workers.SliceWorker;
import edu.stanford.rsl.conrad.utils.CONRAD;
import edu.stanford.rsl.conrad.utils.ImageGridBuffer;
import ij.gui.GenericDialog;
/**
* Class to enable parallel processing of slices of the target volume.
*
* @author akmaier
*
*/
public class SliceParallelVolumePhantomRenderer extends StreamingPhantomRenderer {
protected SliceWorker modelWorker;
@Override
public void createPhantom() {
SliceWorker [] workers = new SliceWorker[CONRAD.getNumberOfThreads()];
for (int i = 0; i < workers.length; i++){
workers[i] = modelWorker.clone();
modelWorker.copyInternalElementsTo(workers[i]);
}
ParallelThreadExecutor executor = new ParallelThreadExecutor(workers);
executor.setShowStatus(false);
try {
executor.execute();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if (modelWorker instanceof AnalyticPhantomProjectorWorker){
AnalyticPhantomProjectorWorker projectorWorker = (AnalyticPhantomProjectorWorker) modelWorker;
projectorWorker.getDetector().notifyEndOfRendering();
}
}
@Override
public String toString() {
if (modelWorker != null) {
return modelWorker.toString();
} else {
return "Numeric Volume Phantom";
}
}
@Override
public String getBibtexCitation() {
return modelWorker.getBibtexCitation();
}
@Override
public String getMedlineCitation() {
return modelWorker.getMedlineCitation();
}
@Override
public void configure() throws Exception{
GenericDialog gd = createDimensionDialog();
projectionNumber = -1;
buffer = new ImageGridBuffer();
String [] names = SliceWorker.getAvailableWorkersAsString();
gd.addChoice("Select method:", names, names[0]);
gd.showDialog();
if (gd.wasCanceled()){
throw new RuntimeException("User cancelled selection.");
}
readDimensions(gd);
readWorker(gd);
configureWorkers();
configured = true;
}
/**
* reads the model worker from the dialog.
* @param gd
*/
protected void readWorker (GenericDialog gd){
modelWorker = SliceWorker.getWorkerFromString(gd.getNextChoice());
}
/**
* Configures the model worker and creates clones.
*
* @throws Exception
*/
protected void configureWorkers() throws Exception{
modelWorker.setImageProcessorBuffer(buffer);
modelWorker.configure();
ArrayList<Integer> processors = new ArrayList<Integer>();
for (int i = 0; i < dimz; i++){
processors.add(new Integer(i));
}
modelWorker.setSliceList(Collections.synchronizedList(processors).iterator());
}
/**
* @return the modelWorker
*/
public SliceWorker getModelWorker() {
return modelWorker;
}
/**
* @param modelWorker the modelWorker to set
*/
public void setModelWorker(SliceWorker modelWorker) {
this.modelWorker = modelWorker;
}
}
/*
* Copyright (C) 2010-2014 Andreas Maier
* CONRAD is developed as an Open Source project under the GNU General Public License (GPL).
*/