Skip to content

Commit

Permalink
Add classes for unioning multiple typed spaces
Browse files Browse the repository at this point in the history
The CombinedSpace provides a union of TypedSpaces.
The CombinedRealInterval provides a union of TypedRealIntervals.

The union is constructed by combining axes of the same AxisType.
In the case of the CombinedRealInterval, the realMin and realMax of each
dimension is computed by taking the lower and upper bounds,
respectively, of the constitent intervals' associated dimensions.
  • Loading branch information
ctrueden committed Jul 30, 2013
1 parent 725bd9b commit d3f8e64
Show file tree
Hide file tree
Showing 3 changed files with 323 additions and 0 deletions.
145 changes: 145 additions & 0 deletions meta/src/main/java/net/imglib2/meta/CombinedRealInterval.java
@@ -0,0 +1,145 @@
/*
* #%L
* ImgLib2: a general-purpose, multidimensional image processing library.
* %%
* Copyright (C) 2009 - 2013 Stephan Preibisch, Tobias Pietzsch, Barry DeZonia,
* Stephan Saalfeld, Albert Cardona, Curtis Rueden, Christian Dietz, Jean-Yves
* Tinevez, Johannes Schindelin, Lee Kamentsky, Larry Lindsey, Grant Harris,
* Mark Hiner, Aivar Grislis, Martin Horn, Nick Perry, Michael Zinsmaier,
* Steffen Jaensch, Jan Funke, Mark Longair, and Dimiter Prodanov.
* %%
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
* The views and conclusions contained in the software and documentation are
* those of the authors and should not be interpreted as representing official
* policies, either expressed or implied, of any organization.
* #L%
*/

package net.imglib2.meta;

import java.util.HashMap;

import net.imglib2.RealInterval;
import net.imglib2.RealPositionable;

/**
* A {@code CombinedRealInterval} is a {@link RealInterval} (specifically a
* {@link TypedRealInterval}) which is a union of other
* {@link TypedRealInterval}s. Dimensions with the same {@link AxisType} are
* combined; see {@link CombinedSpace} for further details.
* <p>
* The {@link #realMin} of a dimension will be the lower bound of all
* constituent interval {@link #realMin}s for dimensions of that type.
* Similarly, the {@link #realMax} of a dimension will be the upper bound of all
* constituent interval {@link #realMax}s.
* </p>
* <p>
* In the case of {@link TypedUnitRealInterval}s, no reconciliation is done to
* ensure that overlapping axes have equal units or calibrations; it is assumed
* that each axis has already been standardized to a common calibration via the
* {@link CalibratedViews#recalibrate} method.
* </p>
*
* @author Curtis Rueden
*/
public class CombinedRealInterval<A extends TypedAxis, S extends TypedRealInterval<A>>
extends CombinedSpace<A, S> implements TypedRealInterval<A>
{

/** Combined min and max values for each axis. */
private final HashMap<AxisType, MinMax> minMax =
new HashMap<AxisType, MinMax>();

// -- CombinedRealInterval methods --

@Override
public void update() {
minMax.clear();
super.update();
for (final TypedRealInterval<A> interval : this) {
for (int d = 0; d < interval.numDimensions(); d++) {
final AxisType axisType = interval.axis(d).type();
if (!minMax.containsKey(axisType)) {
// new axis; add to the hash
minMax.put(axisType, new MinMax());
}
final MinMax mm = minMax.get(axisType);
mm.expand(interval.realMin(d), interval.realMax(d));
}
}
}

// -- RealInterval methods --

@Override
public double realMin(final int d) {
return minMax.get(axis(d).type()).min();
}

@Override
public void realMin(final double[] min) {
for (int i = 0; i < min.length; i++)
min[i] = realMin(i);
}

@Override
public void realMin(final RealPositionable min) {
for (int i = 0; i < min.numDimensions(); i++)
min.setPosition(realMin(i), i);
}

@Override
public double realMax(final int d) {
return minMax.get(axis(d).type()).max();
}

@Override
public void realMax(final double[] max) {
for (int i = 0; i < max.length; i++)
max[i] = realMax(i);
}

@Override
public void realMax(final RealPositionable max) {
for (int i = 0; i < max.numDimensions(); i++)
max.setPosition(realMax(i), i);
}

// -- Helper classes --

protected class MinMax {

private double minMin = Double.POSITIVE_INFINITY;
private double maxMax = Double.NEGATIVE_INFINITY;

public void expand(final double min, final double max) {
if (min < minMin) minMin = min;
if (max > maxMax) maxMax = max;
}

public double min() { return minMin; }
public double max() { return maxMax; }

}

}
127 changes: 127 additions & 0 deletions meta/src/main/java/net/imglib2/meta/CombinedSpace.java
@@ -0,0 +1,127 @@
/*
* #%L
* ImgLib2: a general-purpose, multidimensional image processing library.
* %%
* Copyright (C) 2009 - 2013 Stephan Preibisch, Tobias Pietzsch, Barry DeZonia,
* Stephan Saalfeld, Albert Cardona, Curtis Rueden, Christian Dietz, Jean-Yves
* Tinevez, Johannes Schindelin, Lee Kamentsky, Larry Lindsey, Grant Harris,
* Mark Hiner, Aivar Grislis, Martin Horn, Nick Perry, Michael Zinsmaier,
* Steffen Jaensch, Jan Funke, Mark Longair, and Dimiter Prodanov.
* %%
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
* The views and conclusions contained in the software and documentation are
* those of the authors and should not be interpreted as representing official
* policies, either expressed or implied, of any organization.
* #L%
*/

package net.imglib2.meta;

import java.util.ArrayList;

import net.imglib2.EuclideanSpace;

/**
* A {@code CombinedSpace} is a {@link EuclideanSpace} (specifically a
* {@link TypedSpace}) which is a union of other {@link TypedSpace}s. Common
* axes are merged as appropriate by matching the {@link AxisType}s of each
* {@link TypedAxis}.
* <p>
* For example, combining three spaces with dimensions (X, Y, Z, CHANNEL),
* (X, Y, CHANNEL, TIME) and (X, Z, LIFETIME, TIME) will result in a coordinate
* space with dimensions (X, Y, Z, CHANNEL, TIME, LIFETIME).
* </p>
*
* @author Curtis Rueden
*/
public class CombinedSpace<A extends TypedAxis, S extends TypedSpace<A>>
extends ArrayList<S> implements TypedSpace<A>
{

/** List of axis types for the combined space. */
private final ArrayList<AxisType> axisTypes = new ArrayList<AxisType>();

// -- CombinedSpace methods --

/** Recomputes the combined space based on its current constituents. */
public void update() {
axisTypes.clear();
for (final TypedSpace<A> space : this) {
for (int d = 0; d < space.numDimensions(); d++) {
final AxisType axisType = space.axis(d).type();
if (!axisTypes.contains(axisType)) {
// new axis; add to the list
axisTypes.add(axisType);
}
}
}
}

// -- TypedSpace methods --

@Override
public int dimensionIndex(final AxisType axis) {
return axisTypes.indexOf(axis);
}

// -- AnnotatedSpace methods --

@Override
public A axis(final int d) {
final AxisType type = axisTypes.get(d);

// find the first axis of a constituent space that matches the type
for (final TypedSpace<A> space : this) {
final int id = space.dimensionIndex(type);
if (id < 0) continue;
return space.axis(id);
}
throw new IllegalStateException("No compatible constituent space");
}

@Override
public void axes(final A[] axes) {
for (int i = 0; i < axes.length; i++)
axes[i] = axis(i);
}

@Override
public void setAxis(final A axis, final int d) {
final AxisType type = axisTypes.get(d);

// assign the axis to all constituent spaces of matching type
for (final TypedSpace<A> space : this) {
final int id = space.dimensionIndex(type);
if (id < 0) continue;
space.setAxis(axis, id);
}
}

// -- EuclideanSpace methods --

@Override
public int numDimensions() {
return axisTypes.size();
}

}
51 changes: 51 additions & 0 deletions meta/src/main/java/net/imglib2/meta/TypedRealInterval.java
@@ -0,0 +1,51 @@
/*
* #%L
* ImgLib2: a general-purpose, multidimensional image processing library.
* %%
* Copyright (C) 2009 - 2013 Stephan Preibisch, Tobias Pietzsch, Barry DeZonia,
* Stephan Saalfeld, Albert Cardona, Curtis Rueden, Christian Dietz, Jean-Yves
* Tinevez, Johannes Schindelin, Lee Kamentsky, Larry Lindsey, Grant Harris,
* Mark Hiner, Aivar Grislis, Martin Horn, Nick Perry, Michael Zinsmaier,
* Steffen Jaensch, Jan Funke, Mark Longair, and Dimiter Prodanov.
* %%
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
* The views and conclusions contained in the software and documentation are
* those of the authors and should not be interpreted as representing official
* policies, either expressed or implied, of any organization.
* #L%
*/

package net.imglib2.meta;

import net.imglib2.RealInterval;

/**
* A {@link RealInterval} over a {@link TypedSpace}.
*
* @author Curtis Rueden
*/
public interface TypedRealInterval<A extends TypedAxis> extends RealInterval,
TypedSpace<A>
{
// NB: Marker interface.
}

0 comments on commit d3f8e64

Please sign in to comment.