/*-
* #%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.plugin;
import ij.ImageJ;
import ij.gui.GenericDialog;
import ij.plugin.PlugIn;
import java.util.List;
import mpicbg.spim.data.generic.AbstractSpimData;
import mpicbg.spim.data.sequence.Angle;
import mpicbg.spim.data.sequence.Channel;
import mpicbg.spim.data.sequence.Illumination;
import mpicbg.spim.data.sequence.ImgLoader;
import mpicbg.spim.data.sequence.TimePoint;
import mpicbg.spim.data.sequence.ViewDescription;
import mpicbg.spim.data.sequence.ViewId;
import mpicbg.spim.io.IOFunctions;
import net.imglib2.RandomAccessibleInterval;
import net.imglib2.img.ImgFactory;
import net.imglib2.img.imageplus.ImagePlusImgFactory;
import net.imglib2.type.NativeType;
import net.imglib2.type.numeric.integer.UnsignedShortType;
import net.imglib2.type.numeric.real.FloatType;
import spim.fiji.plugin.queryXML.LoadParseQueryXML;
import spim.fiji.spimdata.SpimData2;
import spim.fiji.spimdata.imgloaders.AbstractImgFactoryImgLoader;
import spim.process.fusion.boundingbox.BoundingBoxGUI;
import spim.process.fusion.export.DisplayImage;
public class Display_View implements PlugIn
{
public static int defaultAngleChoice = 0;
public static int defaultChannelChoice = 0;
public static int defaultIlluminationChoice = 0;
public static int defaultTimepointChoice = 0;
public static int defaultPixelType = 0;
@Override
public void run(String arg0)
{
// ask for everything but the channels
final LoadParseQueryXML result = new LoadParseQueryXML();
if ( !result.queryXML( "displaying a view", false, false, false, false ) )
return;
final GenericDialog gd = new GenericDialog( "Select View" );
final List< TimePoint > timepoints = result.getTimePointsToProcess();
final String[] timepointNames = new String[ timepoints.size() ];
for ( int i = 0; i < timepointNames.length; ++i )
timepointNames[ i ] = result.getTimePointsToProcess().get( i ).getName();
final List< Angle > angles = result.getData().getSequenceDescription().getAllAnglesOrdered();
final String[] angleNames = new String[ angles.size() ];
for ( int i = 0; i < angles.size(); ++i )
angleNames[ i ] = angles.get( i ).getName();
final List< Channel > channels = result.getData().getSequenceDescription().getAllChannelsOrdered();
final String[] channelNames = new String[ channels.size() ];
for ( int i = 0; i < channels.size(); ++i )
channelNames[ i ] = channels.get( i ).getName();
final List< Illumination > illuminations = result.getData().getSequenceDescription().getAllIlluminationsOrdered();
final String[] illuminationNames = new String[ illuminations.size() ];
for ( int i = 0; i < illuminations.size(); ++i )
illuminationNames[ i ] = illuminations.get( i ).getName();
gd.addChoice( "Angle", angleNames, angleNames[ defaultAngleChoice ] );
gd.addChoice( "Channel", channelNames, channelNames[ defaultChannelChoice ] );
gd.addChoice( "Illumination", illuminationNames, illuminationNames[ defaultIlluminationChoice ] );
gd.addChoice( "Timepoint", timepointNames, timepointNames[ defaultTimepointChoice ] );
gd.addMessage( "" );
gd.addChoice( "Pixel_type", BoundingBoxGUI.pixelTypes, BoundingBoxGUI.pixelTypes[ defaultPixelType ] );
gd.showDialog();
if ( gd.wasCanceled() )
return;
final Angle angle = angles.get( defaultAngleChoice = gd.getNextChoiceIndex() );
final Channel channel = channels.get( defaultChannelChoice = gd.getNextChoiceIndex() );
final Illumination illumination = illuminations.get( defaultIlluminationChoice = gd.getNextChoiceIndex() );
final TimePoint tp = timepoints.get( defaultTimepointChoice = gd.getNextChoiceIndex() );
final int pixelType = defaultPixelType = gd.getNextChoiceIndex();
// get the corresponding viewid
final ViewId viewId = SpimData2.getViewId( result.getData().getSequenceDescription(), tp, channel, angle, illumination );
final String name = name( result.getData().getSequenceDescription().getViewDescription( viewId ) );
// this happens only if a viewsetup is not present in any timepoint
// (e.g. after appending fusion to a dataset)
if ( viewId == null )
{
IOFunctions.println( "This ViewSetup is not present for this timepoint: angle: " + name );
return;
}
// get the viewdescription
final ViewDescription viewDescription = result.getData().getSequenceDescription().getViewDescription(
viewId.getTimePointId(), viewId.getViewSetupId() );
// check if this viewid is present in the current timepoint
if ( !viewDescription.isPresent() )
{
IOFunctions.println( "This ViewSetup is not present for this timepoint: angle: " + name );
return;
}
// display it
display( result.getData(), viewId, pixelType, name, false );
}
public static String name( final ViewDescription vd )
{
final Angle angle = vd.getViewSetup().getAngle();
final Channel channel = vd.getViewSetup().getChannel();
final Illumination illumination = vd.getViewSetup().getIllumination();
final TimePoint tp = vd.getTimePoint();
return "angle: " + angle.getName() + " channel: " + channel.getName() + " illum: " + illumination.getName() + " timepoint: " + tp.getName();
}
public static void display( final AbstractSpimData< ? > spimData, final ViewId viewId, final int pixelType, final String name, final boolean virtual )
{
final ImgLoader imgLoader = (ImgLoader)spimData.getSequenceDescription().getImgLoader();
final ImgFactory< ? extends NativeType< ? > > factory;
final AbstractImgFactoryImgLoader il;
// load as ImagePlus directly if possible
if ( AbstractImgFactoryImgLoader.class.isInstance( imgLoader ) )
{
il = (AbstractImgFactoryImgLoader)imgLoader;
factory = il.getImgFactory();
il.setImgFactory( new ImagePlusImgFactory< FloatType >());
}
else
{
il = null;
factory = null;
}
// display it
DisplayImage export = new DisplayImage( virtual );
if ( pixelType == 0 )
export.exportImage( ((ImgLoader)spimData.getSequenceDescription().getImgLoader()).getSetupImgLoader( viewId.getViewSetupId() ).getFloatImage( viewId.getTimePointId(), false ), name );
else
{
@SuppressWarnings( "unchecked" )
RandomAccessibleInterval< UnsignedShortType > img =
( RandomAccessibleInterval< UnsignedShortType > ) ((ImgLoader)spimData.getSequenceDescription().getImgLoader()).getSetupImgLoader( viewId.getViewSetupId() ).getImage( viewId.getTimePointId() );
export.exportImage( img, name );
}
if ( factory != null && il != null )
il.setImgFactory( factory );
}
public static void main( String[] args )
{
new ImageJ();
new Display_View().run( null );
}
}