Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Add classes for unioning multiple typed spaces
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
Showing
3 changed files
with
323 additions
and
0 deletions.
There are no files selected for viewing
145 changes: 145 additions & 0 deletions
145
meta/src/main/java/net/imglib2/meta/CombinedRealInterval.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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; } | ||
|
||
} | ||
|
||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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
51
meta/src/main/java/net/imglib2/meta/TypedRealInterval.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -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. | ||
} |