package org.knime.knip.tracking.data; import java.util.Map; import net.imagej.ImgPlus; import net.imglib2.type.logic.BitType; import fiji.plugin.trackmate.FeatureHolder; import fiji.plugin.trackmate.tracking.AbstractTrackableObject; public class TrackedNode<L extends Comparable<L>> extends AbstractTrackableObject<TrackedNode<L>> implements Comparable<TrackedNode<L>>, FeatureHolder { private final Map<String, Double> m_features; private final L m_label; private final ImgPlus<BitType> m_bitMask; private int m_frame; private boolean m_isVisible; public TrackedNode(final ImgPlus<BitType> bitMask, final double[] center, final L label, final int timeIdx, final Map<String, Double> features) { super(position(center, timeIdx), label.toString(), (int) center[timeIdx]); m_features = features; m_label = label; m_bitMask = bitMask; m_frame = (int) center[timeIdx]; m_isVisible = true; } private static double[] position(final double[] centroid, final int timeIdx) { final double[] positionWithoutTime = new double[centroid.length - 1]; int offset = 0; for (int i = 0; i < centroid.length; i++) { if (timeIdx == i) { offset = 1; continue; } positionWithoutTime[i - offset] = centroid[i]; } return positionWithoutTime; } @Override public int compareTo(final TrackedNode<L> o) { return m_label.compareTo(o.m_label); } @SuppressWarnings("unchecked") @Override public boolean equals(final Object obj) { if (obj instanceof TrackedNode) { return m_label.equals(((TrackedNode<L>) obj).m_label); } return false; } // same as above @Override public int hashCode() { return m_label.hashCode(); } @Override public int ID() { return m_label.hashCode(); } public ImgPlus<BitType> bitMask() { return m_bitMask; } public L label() { return m_label; } @Override public String getName() { return m_bitMask.toString(); } @Override public double radius() { // TODO find better solution here return Math.max(m_bitMask.dimension(0), m_bitMask.dimension(1)); } @Override public void setName(final String name) { throw new UnsupportedOperationException("can't set name"); } @Override public Double getFeature(final String feature) { return m_features.get(feature); } @Override public Map<String, Double> getFeatures() { return m_features; } @Override public void putFeature(final String feature, final Double value) { m_features.put(feature, value); } // FIXME (should be moved in abstract super class) @Override public int frame() { return m_frame; } @Override public void setFrame(final int frame) { this.m_frame = frame; } @Override public boolean isVisible() { return m_isVisible; } @Override public void setVisible(final boolean isVisible) { this.m_isVisible = isVisible; } }