/**
*
*/
package plugins.kernel.roi.descriptor.measure;
import icy.roi.ROI;
import icy.roi.ROIDescriptor;
import icy.sequence.Sequence;
/**
* Interior ROI descriptor class (see {@link ROIDescriptor})
*
* @author Stephane
*/
public class ROIInteriorDescriptor extends ROIDescriptor
{
public static final String ID = "Interior";
public ROIInteriorDescriptor()
{
super(ID, "Interior", Double.class);
}
@Override
public String getUnit(Sequence sequence)
{
return "px";
}
@Override
public String getDescription()
{
return "Number of points for the interior";
}
@Override
public Object compute(ROI roi, Sequence sequence) throws UnsupportedOperationException
{
return Double.valueOf(computeInterior(roi));
}
/**
* Returns the number of point inside the specified ROI.
*
* @param roi
* the ROI on which we want to compute the number of contour point
* @return the number of point inside the ROI
*/
public static double computeInterior(ROI roi)
{
return roi.getNumberOfPoints();
}
/**
* Returns the interior size from a given number of interior points in the best unit (see
* {@link Sequence#getBestPixelSizeUnit(int, int)}) for the specified sequence and dimension.<br>
* <ul>
* Ex:
* <li>computeInterior(sequence, roi, 2) return the area value</li>
* <li>computeInterior(sequence, roi, 3) return the volume value</li>
* </ul>
* It may thrown an <code>UnsupportedOperationException</code> if the operation is not supported for that ROI.
*
* @param interiorPoints
* the number of interior points (override the ROI value)
* @param roi
* the ROI we want to compute the interior size
* @param sequence
* the input sequence used to retrieve operation unit by using pixel size information.
* @param dim
* the dimension for the interior size operation (2 = area, 3 = volume, ...)
* @return the number of point inside the ROI
* @see Sequence#getBestPixelSizeUnit(int, int)
* @throws UnsupportedOperationException
* if the interior calculation for the specified dimension is not supported by the ROI
*/
public static double computeInterior(double interiorPoints, ROI roi, Sequence sequence, int dim)
throws UnsupportedOperationException
{
final double mul = ROIBasicMeasureDescriptorsPlugin.getMultiplierFactor(sequence, roi, dim);
// 0 means the operation is not supported for this ROI
if (mul == 0d)
throw new UnsupportedOperationException("Can't process '" + ID + "' calculation for dimension " + dim
+ " on the ROI: " + roi.getName());
return sequence.calculateSizeBestUnit(interiorPoints * mul, dim, dim);
}
}