/*- * #%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 java.util.HashMap; import java.util.List; import mpicbg.spim.data.SpimData; import mpicbg.spim.data.legacy.LegacyImgLoader; import mpicbg.spim.data.sequence.FinalVoxelDimensions; import mpicbg.spim.data.sequence.ViewId; import mpicbg.spim.data.sequence.ViewSetup; import mpicbg.spim.data.sequence.VoxelDimensions; import net.imglib2.Dimensions; import net.imglib2.FinalDimensions; import net.imglib2.img.Img; import net.imglib2.type.numeric.integer.UnsignedShortType; import net.imglib2.type.numeric.real.FloatType; import spim.fiji.ImgLib2Temp.Pair; import spim.fiji.ImgLib2Temp.ValuePair; public abstract class AbstractImgLoader implements LegacyImgLoader< UnsignedShortType > { private final HashMap< ViewId, Pair< Dimensions, VoxelDimensions > > imageMetaDataCache; private final HashMap< Integer, ViewId > viewIdLookUp; protected AbstractImgLoader() { imageMetaDataCache = new HashMap< ViewId, Pair< Dimensions, VoxelDimensions > >(); viewIdLookUp = new HashMap< Integer, ViewId >(); } /** * Updates the cached imageMetaData */ protected void updateMetaDataCache( final ViewId viewId, final int w, final int h, final int d, final double calX, final double calY, final double calZ ) { imageMetaDataCache.put( viewId, new ValuePair< Dimensions, VoxelDimensions >( new FinalDimensions( new long[] { w, h, d } ), new FinalVoxelDimensions( "", calX, calY, calZ ) ) ); // links the viewSetupId to the last added viewId, overwrites earlier entries viewIdLookUp.put( viewId.getViewSetupId(), viewId ); } /** * Loads only the metadata from the image, should call updateMetaDataCache( ... ) * @param view */ protected abstract void loadMetaData( final ViewId view ); @Override public Dimensions getImageSize( final ViewId view ) { // if there is no data for the viewId if ( !imageMetaDataCache.containsKey( view ) ) { // check if the data is present for the same viewsetup of another timepoint if ( !viewIdLookUp.containsKey( view.getViewSetupId() ) ) loadMetaData( view ); else return imageMetaDataCache.get( viewIdLookUp.get( view.getViewSetupId() ) ).getA(); } return imageMetaDataCache.get( view ).getA(); } @Override public VoxelDimensions getVoxelSize( final ViewId view ) { // if there is no data for the viewId if ( !imageMetaDataCache.containsKey( view ) ) { // check if the data is present for the same viewsetup of another timepoint if ( !viewIdLookUp.containsKey( view.getViewSetupId() ) ) loadMetaData( view ); else return imageMetaDataCache.get( viewIdLookUp.get( view.getViewSetupId() ) ).getB(); } return imageMetaDataCache.get( view ).getB(); } @Override public UnsignedShortType getImageType() { return new UnsignedShortType(); } /** * Updates the ViewSetups using the imageMetaDataCache * * @param data - the {@link SpimData} object that contains all {@link ViewSetup}s can could be potentially updated * @param forceUpdate - overwrite the data if it is already present */ public void updateXMLMetaData( final SpimData data, final boolean forceUpdate ) { updateXMLMetaData( data.getSequenceDescription().getViewSetupsOrdered(), forceUpdate ); } /** * Updates a list of ViewSetups using the imageMetaDataCache * * @param setups - a list of {@link ViewSetup}s can could be potentially updated * @param forceUpdate - overwrite the data if it is already present */ public void updateXMLMetaData( final List< ? extends ViewSetup > setups, final boolean forceUpdate ) { for ( final ViewSetup setup : setups ) updateXMLMetaData( setup, forceUpdate ); } /** * Updates one specific ViewSetup using the imageMetaDataCache * * @param setup - {@link ViewSetup}s that can potentially be updated if it is in the cache * @param forceUpdate - overwrite the data if it is already present * @return true if something was updated, false if it was not in the cache or if could have been updated but was already there */ public boolean updateXMLMetaData( final ViewSetup setup, final boolean forceUpdate ) { boolean updated = false; if ( viewIdLookUp.containsKey( setup.getId() ) ) { // look up the metadata using the ViewId linked by the ViewSetupId final Pair< Dimensions, VoxelDimensions > metaData = imageMetaDataCache.get( viewIdLookUp.get( setup.getId() ) ); if ( !setup.hasSize() || forceUpdate ) { setup.setSize( metaData.getA() ); updated = true; } if ( !setup.hasVoxelSize() || forceUpdate ) { setup.setVoxelSize( metaData.getB() ); updated = true; } } return updated; } protected static final void normalize( final Img< FloatType > img ) { float min = Float.MAX_VALUE; float max = -Float.MAX_VALUE; for ( final FloatType t : img ) { final float v = t.get(); if ( v < min ) min = v; if ( v > max ) max = v; } for ( final FloatType t : img ) t.set( ( t.get() - min ) / ( max - min ) ); } }