package plugins.kernel.roi.descriptor.measure;
import icy.plugin.abstract_.Plugin;
import icy.plugin.interface_.PluginROIDescriptor;
import icy.roi.ROI;
import icy.roi.ROIDescriptor;
import icy.roi.ROIIterator;
import icy.sequence.Sequence;
import icy.type.point.Point5D;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* This {@link PluginROIDescriptor} implements the mass center ROI descriptors:<br/>
* <li>Mass center X (in pixel)</li><br/>
* <li>Mass center Y (in pixel)</li><br/>
* <li>Mass center C (in pixel)</li><br/>
* <li>Mass center Z (in pixel)</li><br/>
* <li>Mass center T (in pixel)</li>
*
* @author Stephane
*/
public class ROIMassCenterDescriptorsPlugin extends Plugin implements PluginROIDescriptor
{
public static final String ID_MASS_CENTER_X = ROIMassCenterXDescriptor.ID;
public static final String ID_MASS_CENTER_Y = ROIMassCenterYDescriptor.ID;
public static final String ID_MASS_CENTER_Z = ROIMassCenterZDescriptor.ID;
public static final String ID_MASS_CENTER_T = ROIMassCenterTDescriptor.ID;
public static final String ID_MASS_CENTER_C = ROIMassCenterCDescriptor.ID;
public static final ROIMassCenterXDescriptor massCenterXDescriptor = new ROIMassCenterXDescriptor();
public static final ROIMassCenterYDescriptor massCenterYDescriptor = new ROIMassCenterYDescriptor();
public static final ROIMassCenterZDescriptor massCenterZDescriptor = new ROIMassCenterZDescriptor();
public static final ROIMassCenterTDescriptor massCenterTDescriptor = new ROIMassCenterTDescriptor();
public static final ROIMassCenterCDescriptor massCenterCDescriptor = new ROIMassCenterCDescriptor();
/**
* Compute and returns the mass center of specified ROI.
*/
public static Point5D computeMassCenter(ROI roi)
{
final ROIIterator it = new ROIIterator(roi, true);
double x, y, z, t, c;
long numPts;
x = 0d;
y = 0d;
z = 0d;
t = 0d;
c = 0d;
numPts = 0;
while (!it.done())
{
x += it.getX();
y += it.getY();
z += it.getZ();
t += it.getT();
c += it.getC();
it.next();
numPts++;
}
if (numPts == 0)
return new Point5D.Double();
return new Point5D.Double(x / numPts, y / numPts, z / numPts, t / numPts, c / numPts);
}
@Override
public List<ROIDescriptor> getDescriptors()
{
final List<ROIDescriptor> result = new ArrayList<ROIDescriptor>();
result.add(massCenterXDescriptor);
result.add(massCenterYDescriptor);
result.add(massCenterZDescriptor);
result.add(massCenterTDescriptor);
result.add(massCenterCDescriptor);
return result;
}
@Override
public Map<ROIDescriptor, Object> compute(ROI roi, Sequence sequence) throws UnsupportedOperationException
{
final Map<ROIDescriptor, Object> result = new HashMap<ROIDescriptor, Object>();
try
{
// compute mass center descriptors
final Point5D massCenter = computeMassCenter(roi);
result.put(massCenterXDescriptor, Double.valueOf(ROIMassCenterXDescriptor.getMassCenterX(massCenter)));
result.put(massCenterYDescriptor, Double.valueOf(ROIMassCenterYDescriptor.getMassCenterY(massCenter)));
result.put(massCenterZDescriptor, Double.valueOf(ROIMassCenterZDescriptor.getMassCenterZ(massCenter)));
result.put(massCenterTDescriptor, Double.valueOf(ROIMassCenterTDescriptor.getMassCenterT(massCenter)));
result.put(massCenterCDescriptor, Double.valueOf(ROIMassCenterCDescriptor.getMassCenterC(massCenter)));
}
catch (Exception e)
{
final String mess = getClass().getSimpleName() + ": cannot compute descriptors for '" + roi.getName() + "'";
throw new UnsupportedOperationException(mess, e);
}
return result;
}
}