package edu.stanford.rsl.conrad.phantom.renderer;
import java.util.ArrayList;
import java.util.Collections;
import edu.stanford.rsl.conrad.phantom.AnalyticPhantom;
import edu.stanford.rsl.conrad.phantom.workers.AnalyticPhantomProjectorWorker;
import edu.stanford.rsl.conrad.phantom.workers.SliceWorker;
import edu.stanford.rsl.conrad.physics.absorption.AbsorptionModel;
import edu.stanford.rsl.conrad.physics.detector.XRayDetector;
import edu.stanford.rsl.conrad.utils.Configuration;
import edu.stanford.rsl.conrad.utils.ImageGridBuffer;
/**
* Class to enable parallel processing of slices of the target volume.
*
* @author akmaier
*
*/
public class ParallelProjectionPhantomRenderer extends SliceParallelVolumePhantomRenderer {
@Override
public String toString() {
if (modelWorker != null) {
return modelWorker.toString();
} else {
return "Projection Phantom";
}
}
@Override
public void configure() throws Exception{
buffer = new ImageGridBuffer();
projectionNumber = -1;
dimx = Configuration.getGlobalConfiguration().getGeometry().getDetectorWidth();
dimy = Configuration.getGlobalConfiguration().getGeometry().getDetectorHeight();
dimz = Configuration.getGlobalConfiguration().getGeometry().getProjectionStackSize() * Configuration.getGlobalConfiguration().getNumSweeps();
originIndexX = (int) Configuration.getGlobalConfiguration().getGeometry().getOriginInPixelsX();
originIndexY = (int) Configuration.getGlobalConfiguration().getGeometry().getOriginInPixelsY();
originIndexZ = (int) Configuration.getGlobalConfiguration().getGeometry().getOriginInPixelsZ();
modelWorker = new AnalyticPhantomProjectorWorker();
configureWorkers();
configured = true;
}
public void configure(AnalyticPhantom phan, XRayDetector model) throws Exception{
buffer = new ImageGridBuffer();
projectionNumber = -1;
dimx = Configuration.getGlobalConfiguration().getGeometry().getDetectorWidth();
dimy = Configuration.getGlobalConfiguration().getGeometry().getDetectorHeight();
dimz = Configuration.getGlobalConfiguration().getGeometry().getProjectionStackSize() * Configuration.getGlobalConfiguration().getNumSweeps();
originIndexX = (int) Configuration.getGlobalConfiguration().getGeometry().getOriginInPixelsX();
originIndexY = (int) Configuration.getGlobalConfiguration().getGeometry().getOriginInPixelsY();
originIndexZ = (int) Configuration.getGlobalConfiguration().getGeometry().getOriginInPixelsZ();
modelWorker = new AnalyticPhantomProjectorWorker();
configureWorkers(phan, model);
configured = true;
}
protected void configureWorkers(AnalyticPhantom phan, XRayDetector model) throws Exception{
modelWorker.setImageProcessorBuffer(buffer);
AnalyticPhantomProjectorWorker worker = (AnalyticPhantomProjectorWorker)modelWorker;
worker.configure(phan, model);
ArrayList<Integer> processors = new ArrayList<Integer>();
for (int i = 0; i < dimz; i++){
processors.add(new Integer(i));
}
modelWorker.setSliceList(Collections.synchronizedList(processors).iterator());
}
/**
* Reports a list of all known subclasses of SliceWorker
* @return the worker list.
*/
public static SliceWorker [] getAvailableSliceWorkers(){
return new SliceWorker [] {
new AnalyticPhantomProjectorWorker()
};
}
}
/*
* Copyright (C) 2010-2014 Andreas Maier
* CONRAD is developed as an Open Source project under the GNU General Public License (GPL).
*/