/**
*
*/
package icy.plugin.interface_;
import icy.roi.ROI;
import icy.roi.ROIDescriptor;
import icy.sequence.Sequence;
import java.util.List;
import java.util.Map;
/**
* Plugin interface providing the basic functionalities to compute various descriptors for regions
* of interest (ROI)
*
* @author Stephane Dallongeville, Alexandre Dufour
*/
public interface PluginROIDescriptor extends PluginNoEDTConstructor
{
/**
* Returns the list of {@link ROIDescriptor} available in this plug-in.<br/>
* While simple descriptors usually have just to return a single a real-valued number (e.g.
* volume), advanced descriptors may need to produce several results for a given ROI (e.g. a
* best-fitting ellipse is defined by multiple parameters), or adjust the name of the
* descriptor(s) based on the type of ROI (e.g. "surface" would only apply in 2D, while "volume"
* would only apply in 3D).<br/>
* Example:
*
* <pre>
* List<ROIDescriptor> result = ArrayList<ROIDescriptor>();
* result.add(new ROIDescriptor("area", Double.class));
* result.add(new ROIDescriptor("volume", Double.class));
* result.add(new ROIDescriptor("...", Double.class));
* </pre>
*/
public List<ROIDescriptor> getDescriptors();
/**
* Computes the descriptor(s) (declared in the {@link #getDescriptors()}) on the specified ROI.<br/>
* Depending on the type of descriptor and ROI, this method can return <code>null</code> for some of the
* descriptor results.<br/>
* Note that using this method may be faster than calling the <code>compute</code> method for
* each descriptor separately as some descriptor can group their calculation.
*
* @param roi
* the ROI on which the descriptor(s) should be computed
* @param sequence
* an optional sequence where the pixel informations can be retrieved
* @return a map where each entry associates a descriptor to its value (which can be <code>null</code> if the
* descriptor cannot be computed).
* @throws UnsupportedOperationException
* if the type of the given ROI is not supported by this descriptor or if <code>sequence</code> is
* <code>null</code> while the calculation requires it.
*/
public Map<ROIDescriptor, Object> compute(ROI roi, Sequence sequence) throws UnsupportedOperationException;
}