/*-
* #%L
* Fiji distribution of ImageJ for the life sciences.
* %%
* Copyright (C) 2007 - 2017 Fiji developers.
* %%
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as
* published by the Free Software Foundation, either version 2 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public
* License along with this program. If not, see
* <http://www.gnu.org/licenses/gpl-2.0.html>.
* #L%
*/
package spim.fiji.spimdata.imgloaders;
import static mpicbg.spim.data.XmlHelpers.loadPath;
import static mpicbg.spim.data.XmlKeys.IMGLOADER_FORMAT_ATTRIBUTE_NAME;
import java.io.File;
import mpicbg.spim.data.XmlHelpers;
import mpicbg.spim.data.generic.sequence.AbstractSequenceDescription;
import mpicbg.spim.data.generic.sequence.ImgLoaderIo;
import mpicbg.spim.data.generic.sequence.XmlIoBasicImgLoader;
import net.imglib2.img.ImgFactory;
import net.imglib2.img.array.ArrayImgFactory;
import net.imglib2.img.cell.CellImgFactory;
import net.imglib2.img.planar.PlanarImgFactory;
import net.imglib2.type.NativeType;
import net.imglib2.type.numeric.real.FloatType;
import org.jdom2.Element;
public abstract class XmlIoStackImgLoader< T extends StackImgLoader< ? > > implements XmlIoBasicImgLoader< T >
{
public static final String DIRECTORY_TAG = "imagedirectory";
public static final String FILE_PATTERN_TAG = "filePattern";
public static final String IMGLIB2CONTAINER_PATTERN_TAG = "imglib2container";
public static final String LAYOUT_TP_TAG = "layoutTimepoints";
public static final String LAYOUT_CHANNEL_TAG = "layoutChannels";
public static final String LAYOUT_ILLUMINATION_TAG = "layoutIlluminations";
public static final String LAYOUT_ANGLE_TAG = "layoutAngles";
@Override
public Element toXml( final T imgLoader, final File basePath )
{
final Element elem = new Element( "ImageLoader" );
elem.setAttribute( IMGLOADER_FORMAT_ATTRIBUTE_NAME, this.getClass().getAnnotation( ImgLoaderIo.class ).format() );
elem.addContent( XmlHelpers.pathElement( DIRECTORY_TAG, imgLoader.getPath(), basePath ) );
elem.addContent( XmlHelpers.textElement( FILE_PATTERN_TAG, imgLoader.getFileNamePattern() ) );
elem.addContent( XmlHelpers.intElement( LAYOUT_TP_TAG, imgLoader.getLayoutTimePoints() ) );
elem.addContent( XmlHelpers.intElement( LAYOUT_CHANNEL_TAG, imgLoader.getLayoutChannels() ) );
elem.addContent( XmlHelpers.intElement( LAYOUT_ILLUMINATION_TAG, imgLoader.getLayoutIlluminations() ) );
elem.addContent( XmlHelpers.intElement( LAYOUT_ANGLE_TAG, imgLoader.getLayoutAngles() ) );
elem.addContent( XmlHelpers.textElement( IMGLIB2CONTAINER_PATTERN_TAG, imgLoader.getImgFactory().getClass().getSimpleName() ) );
return elem;
}
@Override
public T fromXml( final Element elem, final File basePath, final AbstractSequenceDescription< ?, ?, ? > sequenceDescription )
{
try
{
File path = loadPath( elem, DIRECTORY_TAG, basePath );
String fileNamePattern = XmlHelpers.getText( elem, FILE_PATTERN_TAG );
int layoutTP = XmlHelpers.getInt( elem, LAYOUT_TP_TAG );
int layoutChannels = XmlHelpers.getInt( elem, LAYOUT_CHANNEL_TAG );
int layoutIllum = XmlHelpers.getInt( elem, LAYOUT_ILLUMINATION_TAG );
int layoutAngles = XmlHelpers.getInt( elem, LAYOUT_ANGLE_TAG );
final String container = XmlHelpers.getText( elem, IMGLIB2CONTAINER_PATTERN_TAG );
ImgFactory< FloatType > imgFactory;
if ( container == null )
{
System.out.println( "WARNING: No Img implementation defined, using ArrayImg." );
// if no factory is defined we define an ArrayImgFactory
imgFactory = new ArrayImgFactory< FloatType >();
}
else
{
if ( container.toLowerCase().contains( "cellimg" ) )
{
imgFactory = new CellImgFactory< FloatType >( 256 );
}
else if ( container.toLowerCase().contains( "arrayimg" ) )
{
imgFactory = new ArrayImgFactory< FloatType >();
}
else if ( container.toLowerCase().contains( "planarimg" ) )
{
imgFactory = new PlanarImgFactory< FloatType >();
}
else
{
// if factory is unknown we define an ArrayImgFactory
imgFactory = new ArrayImgFactory< FloatType >();
System.out.println( "WARNING: Unknown Img implementation '" + container + "', using ArrayImg." );
}
}
return createImgLoader( path, fileNamePattern, imgFactory, layoutTP, layoutChannels, layoutIllum, layoutAngles, sequenceDescription );
}
catch ( final Exception e )
{
throw new RuntimeException( e );
}
}
protected abstract T createImgLoader(
final File path, final String fileNamePattern, final ImgFactory< ? extends NativeType< ? > > imgFactory,
final int layoutTP, final int layoutChannels, final int layoutIllum, final int layoutAngles,
final AbstractSequenceDescription< ?, ?, ? > sequenceDescription );
}