Commit 75dac419 authored by John Bogovic's avatar John Bogovic Committed by pietzsch
Browse files

fix issue arising from duplicate setupIds

parent aacb7291
......@@ -56,21 +56,8 @@ public class OpenImagePlusPlugIn implements Command
{
System.setProperty( "apple.laf.useScreenMenuBar", "true" );
new ImageJ();
// IJ.run("Confocal Series (2.2MB)");
// IJ.run("Confocal Series (2.2MB)");
// IJ.run("Fly Brain (1MB)");
// ImagePlus ip1 = IJ.openImage("/groups/saalfeld/home/bogovicj/tmp/mri-stack.tif");
// ImagePlus ip2 = IJ.openImage("/groups/saalfeld/home/bogovicj/tmp/flybrain.tif");
ImagePlus ip1 = IJ.openImage("/groups/saalfeld/home/bogovicj/tmp/confocal-series.tif");
ImagePlus ip2 = IJ.openImage("/groups/saalfeld/home/bogovicj/tmp/confocal_grad.tif");
ip1.show();
ip2.show();
IJ.run( "Confocal Series (2.2MB)" );
// IJ.run( "Fly Brain (1MB)" );
new OpenImagePlusPlugIn().run();
}
......@@ -109,17 +96,19 @@ public class OpenImagePlusPlugIn implements Command
AbstractSpimData< ? > spimData;
CacheControl cache = null;
int setup_id_offset = 0;
ArrayList<ImagePlus> imgList = new ArrayList<ImagePlus>();
for( int i = 0; i < nImages; i++ )
{
if( !gd.getNextBoolean() )
continue;
ImagePlus imp = WindowManager.getImage( idList[ i ]);
imgList.add( imp );
spimData = load( imp, converterSetups, sources, setup_id_offset );
if( spimData != null )
cache = ( ( ViewerImgLoader ) spimData.getSequenceDescription().getImgLoader() ).getCacheControl();
setup_id_offset += imp.getChannel();
setup_id_offset += imp.getNChannels();
}
int nTimepoints = 1;
......@@ -131,17 +120,15 @@ public class OpenImagePlusPlugIn implements Command
final VisibilityAndGrouping vg = bdv.getViewer().getVisibilityAndGrouping();
vg.setFusedEnabled( true );
int channel_offset = 0;
for( int i = 0; i < nImages; i++ )
int channelOffset = 0;
for( ImagePlus imp : imgList )
{
ImagePlus imp = WindowManager.getImage( idList[ i ]);
if ( imp.isComposite() )
{
transferChannelSettings( channel_offset, ( CompositeImage ) imp, sa, vg );
channel_offset += imp.getNChannels();
}
transferChannelSettings( channelOffset, ( CompositeImage ) imp, sa, vg );
else
transferImpSettings( imp, sa );
transferImpSettings( channelOffset, imp, sa );
channelOffset += imp.getNChannels();
}
}
......@@ -184,9 +171,6 @@ public class OpenImagePlusPlugIn implements Command
// propose reasonable mipmap settings
// final ExportMipmapInfo autoMipmapSettings = ProposeMipmaps.proposeMipmaps( new BasicViewSetup( 0, "", size, voxelSize ) );
// imp.getDisplayRangeMin();
// imp.getDisplayRangeMax();
// create ImgLoader wrapping the image
final BasicImgLoader imgLoader;
if ( imp.getStack().isVirtual() )
......@@ -194,17 +178,17 @@ public class OpenImagePlusPlugIn implements Command
switch ( imp.getType() )
{
case ImagePlus.GRAY8:
imgLoader = VirtualStackImageLoader.createUnsignedByteInstance( imp );
imgLoader = VirtualStackImageLoader.createUnsignedByteInstance( imp, setup_id_offset );
break;
case ImagePlus.GRAY16:
imgLoader = VirtualStackImageLoader.createUnsignedShortInstance( imp );
imgLoader = VirtualStackImageLoader.createUnsignedShortInstance( imp, setup_id_offset );
break;
case ImagePlus.GRAY32:
imgLoader = VirtualStackImageLoader.createFloatInstance( imp );
imgLoader = VirtualStackImageLoader.createFloatInstance( imp, setup_id_offset );
break;
case ImagePlus.COLOR_RGB:
default:
imgLoader = VirtualStackImageLoader.createARGBInstance( imp );
imgLoader = VirtualStackImageLoader.createARGBInstance( imp, setup_id_offset );
break;
}
}
......@@ -213,17 +197,17 @@ public class OpenImagePlusPlugIn implements Command
switch ( imp.getType() )
{
case ImagePlus.GRAY8:
imgLoader = ImageStackImageLoader.createUnsignedByteInstance( imp );
imgLoader = ImageStackImageLoader.createUnsignedByteInstance( imp, setup_id_offset );
break;
case ImagePlus.GRAY16:
imgLoader = ImageStackImageLoader.createUnsignedShortInstance( imp );
imgLoader = ImageStackImageLoader.createUnsignedShortInstance( imp, setup_id_offset );
break;
case ImagePlus.GRAY32:
imgLoader = ImageStackImageLoader.createFloatInstance( imp );
imgLoader = ImageStackImageLoader.createFloatInstance( imp, setup_id_offset );
break;
case ImagePlus.COLOR_RGB:
default:
imgLoader = ImageStackImageLoader.createARGBInstance( imp );
imgLoader = ImageStackImageLoader.createARGBInstance( imp, setup_id_offset );
break;
}
}
......@@ -235,9 +219,9 @@ public class OpenImagePlusPlugIn implements Command
final HashMap< Integer, BasicViewSetup > setups = new HashMap<>( numSetups );
for ( int s = 0; s < numSetups; ++s )
{
final BasicViewSetup setup = new BasicViewSetup( s, String.format( imp.getTitle() + " channel %d", s + 1 ), size, voxelSize );
setup.setAttribute( new Channel( setup_id_offset + s + 1 ) );
setups.put( s, setup );
final BasicViewSetup setup = new BasicViewSetup( setup_id_offset + s, String.format( imp.getTitle() + " channel %d", s + 1 ), size, voxelSize );
setup.setAttribute( new Channel( s + 1 ) );
setups.put( setup_id_offset + s, setup );
}
// create timepoints
......@@ -252,7 +236,7 @@ public class OpenImagePlusPlugIn implements Command
final ArrayList< ViewRegistration > registrations = new ArrayList<>();
for ( int t = 0; t < numTimepoints; ++t )
for ( int s = 0; s < numSetups; ++s )
registrations.add( new ViewRegistration( t, s, sourceTransform ) );
registrations.add( new ViewRegistration( t, setup_id_offset + s, sourceTransform ) );
final File basePath = new File(".");
final AbstractSpimData< ? > spimData = new SpimDataMinimal( basePath, seq, new ViewRegistrations( registrations ) );
......@@ -262,7 +246,7 @@ public class OpenImagePlusPlugIn implements Command
return spimData;
}
protected void transferChannelSettings( int channel_offset, final CompositeImage ci, final SetupAssignments setupAssignments, final VisibilityAndGrouping visibility )
protected void transferChannelSettings( int channelOffset, final CompositeImage ci, final SetupAssignments setupAssignments, final VisibilityAndGrouping visibility )
{
final int nChannels = ci.getNChannels();
final int mode = ci.getCompositeMode();
......@@ -270,7 +254,7 @@ public class OpenImagePlusPlugIn implements Command
for ( int c = 0; c < nChannels; ++c )
{
final LUT lut = ci.getChannelLut( c + 1 );
final ConverterSetup setup = setupAssignments.getConverterSetups().get( channel_offset + c );
final ConverterSetup setup = setupAssignments.getConverterSetups().get( channelOffset + c );
if ( transferColor )
setup.setColor( new ARGBType( lut.getRGB( 255 ) ) );
setup.setDisplayRange( lut.min, lut.max );
......@@ -286,9 +270,9 @@ public class OpenImagePlusPlugIn implements Command
visibility.setCurrentSource( ci.getChannel() - 1 );
}
protected void transferImpSettings( final ImagePlus imp, final SetupAssignments setupAssignments )
protected void transferImpSettings( int setupIndex, final ImagePlus imp, final SetupAssignments setupAssignments )
{
final ConverterSetup setup = setupAssignments.getConverterSetups().get( 0 );
final ConverterSetup setup = setupAssignments.getConverterSetups().get( setupIndex );
setup.setDisplayRange( imp.getDisplayRangeMin(), imp.getDisplayRangeMax() );
}
}
package bdv.img.imagestack;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.function.Function;
import net.imglib2.RandomAccessibleInterval;
......@@ -28,22 +29,42 @@ public class ImageStackImageLoader< T extends NumericType< T > & NativeType< T >
{
public static ImageStackImageLoader< UnsignedByteType, ByteArray > createUnsignedByteInstance( final ImagePlus imp )
{
return new ImageStackImageLoader<>( new UnsignedByteType(), imp, array -> new ByteArray( ( byte[] ) array ) );
return createUnsignedByteInstance( imp, 0 );
}
public static ImageStackImageLoader< UnsignedByteType, ByteArray > createUnsignedByteInstance( final ImagePlus imp, int offset )
{
return new ImageStackImageLoader<>( new UnsignedByteType(), imp, array -> new ByteArray( ( byte[] ) array ), offset );
}
public static ImageStackImageLoader< UnsignedShortType, ShortArray > createUnsignedShortInstance( final ImagePlus imp )
{
return new ImageStackImageLoader<>( new UnsignedShortType(), imp, array -> new ShortArray( ( short[] ) array ) );
return createUnsignedShortInstance( imp, 0 );
}
public static ImageStackImageLoader< UnsignedShortType, ShortArray > createUnsignedShortInstance( final ImagePlus imp, int offset )
{
return new ImageStackImageLoader<>( new UnsignedShortType(), imp, array -> new ShortArray( ( short[] ) array ), offset );
}
public static ImageStackImageLoader< FloatType, FloatArray > createFloatInstance( final ImagePlus imp )
{
return new ImageStackImageLoader<>( new FloatType(), imp, array -> new FloatArray( ( float[] ) array ) );
return createFloatInstance( imp, 0 );
}
public static ImageStackImageLoader< FloatType, FloatArray > createFloatInstance( final ImagePlus imp, int offset )
{
return new ImageStackImageLoader<>( new FloatType(), imp, array -> new FloatArray( ( float[] ) array ), offset );
}
public static ImageStackImageLoader< ARGBType, IntArray > createARGBInstance( final ImagePlus imp )
{
return new ImageStackImageLoader<>( new ARGBType(), imp, array -> new IntArray( ( int[] ) array ) );
return createARGBInstance( imp, 0 );
}
public static ImageStackImageLoader< ARGBType, IntArray > createARGBInstance( final ImagePlus imp, int offset )
{
return new ImageStackImageLoader<>( new ARGBType(), imp, array -> new IntArray( ( int[] ) array ), offset );
}
private final T type;
......@@ -52,35 +73,39 @@ public class ImageStackImageLoader< T extends NumericType< T > & NativeType< T >
private final long[] dim;
private final ArrayList< SetupImgLoader > setupImgLoaders;
private final HashMap< Integer, SetupImgLoader > setupImgLoaders;
private final Function< Object, A > wrapPixels;
public ImageStackImageLoader( final T type, final ImagePlus imp, final Function< Object, A > wrapPixels )
public ImageStackImageLoader( final T type, final ImagePlus imp, final Function< Object, A > wrapPixels, int setup_id_offset )
{
this.type = type;
this.imp = imp;
this.wrapPixels = wrapPixels;
this.dim = new long[] { imp.getWidth(), imp.getHeight(), imp.getNSlices() };
final int numSetups = imp.getNChannels();
setupImgLoaders = new ArrayList<>();
for ( int setupId = 0; setupId < numSetups; ++setupId )
setupImgLoaders.add( new SetupImgLoader( setupId ) );
setupImgLoaders = new HashMap<>();
for ( int c = 0; c < numSetups; ++c )
setupImgLoaders.put( (setup_id_offset + c), new SetupImgLoader( c ) );
}
public ImageStackImageLoader( final T type, final ImagePlus imp, final Function< Object, A > wrapPixels )
{
this( type, imp, wrapPixels, 0 );
}
public class SetupImgLoader implements BasicSetupImgLoader< T >
{
private final int setupId;
private final int channel;
public SetupImgLoader( final int setupId )
public SetupImgLoader( final int channel )
{
this.setupId = setupId;
this.channel = channel + 1;
}
@Override
public RandomAccessibleInterval< T > getImage( final int timepointId, final ImgLoaderHint... hints )
{
final int channel = setupId + 1;
final int frame = timepointId + 1;
final ArrayList< A > slices = new ArrayList<>();
for ( int slice = 1; slice <= dim[ 2 ]; ++slice )
......
package bdv.img.virtualstack;
import java.util.ArrayList;
import java.util.HashMap;
import bdv.AbstractViewerSetupImgLoader;
import bdv.ViewerImgLoader;
......@@ -62,9 +63,14 @@ public abstract class VirtualStackImageLoader< T extends NativeType< T >, V exte
implements ViewerImgLoader, TypedBasicImgLoader< T >
{
public static VirtualStackImageLoader< FloatType, VolatileFloatType, VolatileFloatArray > createFloatInstance( final ImagePlus imp )
{
return createFloatInstance( imp, 0 );
}
public static VirtualStackImageLoader< FloatType, VolatileFloatType, VolatileFloatArray > createFloatInstance( final ImagePlus imp, final int offset )
{
return new VirtualStackImageLoader< FloatType, VolatileFloatType, VolatileFloatArray >(
imp, new VirtualStackVolatileFloatArrayLoader( imp ), new FloatType(), new VolatileFloatType() )
imp, new VirtualStackVolatileFloatArrayLoader( imp ), new FloatType(), new VolatileFloatType(), offset )
{
@Override
protected void linkType( final CachedCellImg< FloatType, VolatileFloatArray > img )
......@@ -81,9 +87,14 @@ public abstract class VirtualStackImageLoader< T extends NativeType< T >, V exte
}
public static VirtualStackImageLoader< UnsignedShortType, VolatileUnsignedShortType, VolatileShortArray > createUnsignedShortInstance( final ImagePlus imp )
{
return createUnsignedShortInstance( imp, 0 );
}
public static VirtualStackImageLoader< UnsignedShortType, VolatileUnsignedShortType, VolatileShortArray > createUnsignedShortInstance( final ImagePlus imp, final int offset )
{
return new VirtualStackImageLoader< UnsignedShortType, VolatileUnsignedShortType, VolatileShortArray >(
imp, new VirtualStackVolatileShortArrayLoader( imp ), new UnsignedShortType(), new VolatileUnsignedShortType() )
imp, new VirtualStackVolatileShortArrayLoader( imp ), new UnsignedShortType(), new VolatileUnsignedShortType(), offset )
{
@Override
protected void linkType( final CachedCellImg< UnsignedShortType, VolatileShortArray > img )
......@@ -100,9 +111,14 @@ public abstract class VirtualStackImageLoader< T extends NativeType< T >, V exte
}
public static VirtualStackImageLoader< UnsignedByteType, VolatileUnsignedByteType, VolatileByteArray > createUnsignedByteInstance( final ImagePlus imp )
{
return createUnsignedByteInstance( imp, 0 );
}
public static VirtualStackImageLoader< UnsignedByteType, VolatileUnsignedByteType, VolatileByteArray > createUnsignedByteInstance( final ImagePlus imp, final int offset )
{
return new VirtualStackImageLoader< UnsignedByteType, VolatileUnsignedByteType, VolatileByteArray >(
imp, new VirtualStackVolatileByteArrayLoader( imp ), new UnsignedByteType(), new VolatileUnsignedByteType() )
imp, new VirtualStackVolatileByteArrayLoader( imp ), new UnsignedByteType(), new VolatileUnsignedByteType(), offset )
{
@Override
protected void linkType( final CachedCellImg< UnsignedByteType, VolatileByteArray > img )
......@@ -119,9 +135,14 @@ public abstract class VirtualStackImageLoader< T extends NativeType< T >, V exte
}
public static VirtualStackImageLoader< ARGBType, VolatileARGBType, VolatileIntArray > createARGBInstance( final ImagePlus imp )
{
return createARGBInstance( imp, 0 );
}
public static VirtualStackImageLoader< ARGBType, VolatileARGBType, VolatileIntArray > createARGBInstance( final ImagePlus imp, final int offset )
{
return new VirtualStackImageLoader< ARGBType, VolatileARGBType, VolatileIntArray >(
imp, new VirtualStackVolatileARGBArrayLoader( imp ), new ARGBType(), new VolatileARGBType() )
imp, new VirtualStackVolatileARGBArrayLoader( imp ), new ARGBType(), new VolatileARGBType(), offset )
{
@Override
protected void linkType( final CachedCellImg< ARGBType, VolatileIntArray > img )
......@@ -149,18 +170,23 @@ public abstract class VirtualStackImageLoader< T extends NativeType< T >, V exte
private final int[] cellDimensions;
private final ArrayList< SetupImgLoader > setupImgLoaders;
private final HashMap< Integer, SetupImgLoader > setupImgLoaders;
protected VirtualStackImageLoader( final ImagePlus imp, final CacheArrayLoader< A > loader, final T type, final V volatileType )
protected VirtualStackImageLoader( final ImagePlus imp, final CacheArrayLoader< A > loader, final T type, final V volatileType, int setupOffset )
{
this.loader = loader;
dimensions = new long[] { imp.getWidth(), imp.getHeight(), imp.getNSlices() };
cellDimensions = new int[] { imp.getWidth(), imp.getHeight(), 1 };
final int numSetups = imp.getNChannels();
cache = new VolatileGlobalCellCache( 1, 1 );
setupImgLoaders = new ArrayList<>();
setupImgLoaders = new HashMap<>();
for ( int setupId = 0; setupId < numSetups; ++setupId )
setupImgLoaders.add( new SetupImgLoader( setupId, type, volatileType ) );
setupImgLoaders.put( setupOffset + setupId, new SetupImgLoader( setupId, type, volatileType ) );
}
protected VirtualStackImageLoader( final ImagePlus imp, final CacheArrayLoader< A > loader, final T type, final V volatileType )
{
this( imp, loader, type, volatileType, 0 );
}
protected abstract void linkType( CachedCellImg< T, A > img );
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment