diff --git a/screening/source/java/ch/systemsx/cisd/openbis/dss/etl/IImagingDatasetLoader.java b/screening/source/java/ch/systemsx/cisd/openbis/dss/etl/IImagingDatasetLoader.java index 3757838a304d8f80807927236532116dd4fd1fdf..52c02e208ce337460fff81445ecc7ca5e571dd1a 100644 --- a/screening/source/java/ch/systemsx/cisd/openbis/dss/etl/IImagingDatasetLoader.java +++ b/screening/source/java/ch/systemsx/cisd/openbis/dss/etl/IImagingDatasetLoader.java @@ -55,6 +55,17 @@ public interface IImagingDatasetLoader extends IImageDatasetLoader AbsoluteImageReference tryGetRepresentativeImage(String channelCode, Location wellLocationOrNull, RequestedImageSize imageSize); + /** + * Tries to find a representative thumbnail of this dataset in a given channel. Returns NULL if + * no thumbnail was found. + * + * @param channelCode channel code for which representative image is requested + * @param wellLocationOrNull if not null the returned images are restricted to one well. + * Otherwise the dataset is assumed to have no container and spots. + */ + AbsoluteImageReference tryGetRepresentativeThumbnail(String channelCode, + Location wellLocationOrNull); + /** * Returns the stored thumbnail for the given parameters, or <code>null</code>, if no thumbnail * has been stored. @@ -63,7 +74,7 @@ public interface IImagingDatasetLoader extends IImageDatasetLoader * It will just plain give you the byte array that has been stored for the thumbnail. * * @param channelCode The code of the channel to get the thumbnail for. - * @param channelStackReference Specifies well and tile of the thumbnail. + * @param channelStackReference Specifies well and tile of the thumbnail. */ IContent tryGetThumbnail(String channelCode, ImageChannelStackReference channelStackReference); diff --git a/screening/source/java/ch/systemsx/cisd/openbis/dss/etl/dataaccess/ImagingDatasetLoader.java b/screening/source/java/ch/systemsx/cisd/openbis/dss/etl/dataaccess/ImagingDatasetLoader.java index 61d3b65910563964a2495f1708b271c342c1113b..336c98e63c3ca2babdd623d99b8ac7c3d037b729 100644 --- a/screening/source/java/ch/systemsx/cisd/openbis/dss/etl/dataaccess/ImagingDatasetLoader.java +++ b/screening/source/java/ch/systemsx/cisd/openbis/dss/etl/dataaccess/ImagingDatasetLoader.java @@ -295,6 +295,37 @@ public class ImagingDatasetLoader extends HCSDatasetLoader implements IImagingDa return createAbsoluteImageReference(imageDTO, channel, imageSize, useNativeImageLibrary); } + private ImgImageDTO tryGetRepresentativeThumbnailImageDTO(long channelId, + Location wellLocationOrNull) + { + if (wellLocationOrNull == null) + { + return query.tryGetMicroscopyRepresentativeThumbnail(dataset.getId(), channelId); + } else + { + return query.tryGetHCSRepresentativeThumbnail(dataset.getId(), wellLocationOrNull, + channelId); + } + } + + public AbsoluteImageReference tryGetRepresentativeThumbnail(String channelCode, + Location wellLocationOrNull) + { + ImgChannelDTO channel = tryLoadChannel(channelCode); + if (channel == null) + { + return null; + } + ImgImageDTO imageDTO = + tryGetRepresentativeThumbnailImageDTO(channel.getId(), wellLocationOrNull); + if (imageDTO == null) + { + return null; + } + return createAbsoluteImageReference(imageDTO, channel, new RequestedImageSize( + Size.NULL_SIZE, false), false); + } + public IContent tryGetThumbnail(String channelCode, ImageChannelStackReference channelStackReference) { @@ -338,4 +369,5 @@ public class ImagingDatasetLoader extends HCSDatasetLoader implements IImagingDa return null; } } + } \ No newline at end of file diff --git a/screening/source/java/ch/systemsx/cisd/openbis/dss/screening/server/DssServiceRpcScreening.java b/screening/source/java/ch/systemsx/cisd/openbis/dss/screening/server/DssServiceRpcScreening.java index 1bba06c2d246fa2802f8558c319f23826842490b..2ccee7a932e492e658d5f06fe922005026593e02 100644 --- a/screening/source/java/ch/systemsx/cisd/openbis/dss/screening/server/DssServiceRpcScreening.java +++ b/screening/source/java/ch/systemsx/cisd/openbis/dss/screening/server/DssServiceRpcScreening.java @@ -104,10 +104,6 @@ public class DssServiceRpcScreening extends AbstractDssServiceRpc<IDssServiceRpc */ public static final int MINOR_VERSION = 8; - /** - * NULL_SIZE encodes for "no thumbnails available" - */ - private final static Size NULL_SIZE = new Size(0, 0); static { @@ -221,8 +217,8 @@ public class DssServiceRpcScreening extends AbstractDssServiceRpc<IDssServiceRpc { final IImagingDatasetLoader imageAccessor = createImageLoader(dataset.getDatasetCode(), datasetRoot); - final Size imageSize = getImageSize(dataset, imageAccessor, false); - final Size thumbnailSize = getImageSize(dataset, imageAccessor, true); + final Size imageSize = getOriginalImageSize(dataset, imageAccessor); + final Size thumbnailSize = getThumbnailImageSize(dataset, imageAccessor); final ImageDatasetParameters params = imageAccessor.getImageParameters(); return new ImageDatasetMetadata(dataset, params.getChannelsCodes(), params.getChannelsLabels(), params.getTileRowsNum(), params.getTileColsNum(), @@ -230,31 +226,56 @@ public class DssServiceRpcScreening extends AbstractDssServiceRpc<IDssServiceRpc thumbnailSize.getHeight()); } - private static Size getImageSize(IImageDatasetIdentifier dataset, - IImagingDatasetLoader imageAccessor, boolean thumbnailsRequired) + private static Size getOriginalImageSize(IImageDatasetIdentifier dataset, + IImagingDatasetLoader imageAccessor) { - BufferedImage image = getAnyImage(imageAccessor, dataset, thumbnailsRequired); + BufferedImage image = getAnyImage(imageAccessor, dataset); Size imageSize = new Size(image.getWidth(), image.getHeight()); return imageSize; } + private static Size getThumbnailImageSize(IImageDatasetIdentifier dataset, + IImagingDatasetLoader imageAccessor) + { + BufferedImage image = getAnyThumbnailImage(imageAccessor, dataset); + if (image != null) + { + return new Size(image.getWidth(), image.getHeight()); + } else + { + return Size.NULL_SIZE; + } + } + private static BufferedImage getAnyImage(IImagingDatasetLoader imageAccessor, - IImageDatasetIdentifier dataset, boolean thumbnailsRequired) + IImageDatasetIdentifier dataset) { if (imageAccessor.getImageParameters().tryGetRowsNum() == null) { - return getAnyMicroscopyImage(imageAccessor, dataset, thumbnailsRequired); + return getAnyMicroscopyImage(imageAccessor, dataset); } else { - return getAnyHCSImage(imageAccessor, dataset, thumbnailsRequired); + return getAnyHCSImage(imageAccessor, dataset); + } + } + + private static BufferedImage getAnyThumbnailImage(IImagingDatasetLoader imageAccessor, + IImageDatasetIdentifier dataset) + { + if (imageAccessor.getImageParameters().tryGetRowsNum() == null) + { + return getAnyMicroscopyThumbnail(imageAccessor, dataset); + } else + { + return getAnyHCSThumbnail(imageAccessor, dataset); } } private static BufferedImage getAnyMicroscopyImage(IImagingDatasetLoader imageAccessor, - IImageDatasetIdentifier dataset, boolean thumbnailsRequired) + IImageDatasetIdentifier dataset) { ImageDatasetParameters params = imageAccessor.getImageParameters(); - RequestedImageSize originalOrThumbnail = createOriginalOrThumbnail(thumbnailsRequired); + RequestedImageSize originalOrThumbnail = RequestedImageSize.createOriginal(); for (String channelCode : params.getChannelsCodes()) { AbsoluteImageReference image = @@ -267,19 +288,50 @@ public class DssServiceRpcScreening extends AbstractDssServiceRpc<IDssServiceRpc throw new IllegalStateException("Cannot find any image in a dataset: " + dataset); } - private static RequestedImageSize createOriginalOrThumbnail(boolean thumbnailsRequired) + private static BufferedImage getAnyMicroscopyThumbnail(IImagingDatasetLoader imageAccessor, + IImageDatasetIdentifier dataset) + { + ImageDatasetParameters params = imageAccessor.getImageParameters(); + for (String channelCode : params.getChannelsCodes()) + { + AbsoluteImageReference image = + imageAccessor.tryGetRepresentativeThumbnail(channelCode, null); + if (image != null) + { + return image.getImage(); + } + } + return null; + } + + private static BufferedImage getAnyHCSThumbnail(IImagingDatasetLoader imageAccessor, + IImageDatasetIdentifier dataset) { - // exact thumbnail size does not matter, we just want to mark that we do not want the - // original image - return thumbnailsRequired ? new RequestedImageSize(NULL_SIZE, false) : RequestedImageSize - .createOriginal(); + ImageDatasetParameters params = imageAccessor.getImageParameters(); + for (int row = 1; row <= params.tryGetRowsNum(); row++) + { + for (int col = 1; col <= params.tryGetColsNum(); col++) + { + for (String channelCode : params.getChannelsCodes()) + { + AbsoluteImageReference image = + imageAccessor.tryGetRepresentativeThumbnail(channelCode, new Location( + col, row)); + if (image != null) + { + return image.getImage(); + } + } + } + } + return null; } private static BufferedImage getAnyHCSImage(IImagingDatasetLoader imageAccessor, - IImageDatasetIdentifier dataset, boolean thumbnailsRequired) + IImageDatasetIdentifier dataset) { ImageDatasetParameters params = imageAccessor.getImageParameters(); - RequestedImageSize originalOrThumbnail = createOriginalOrThumbnail(thumbnailsRequired); + RequestedImageSize originalOrThumbnail = RequestedImageSize.createOriginal(); for (int row = 1; row <= params.tryGetRowsNum(); row++) { for (int col = 1; col <= params.tryGetColsNum(); col++) diff --git a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/api/v1/dto/ImageDatasetMetadata.java b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/api/v1/dto/ImageDatasetMetadata.java index 9b18f60695b436774b5c9d94b47389776eb08729..c659c22e0aa7264e3ca529507ebbab9c7dba3ba7 100644 --- a/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/api/v1/dto/ImageDatasetMetadata.java +++ b/screening/source/java/ch/systemsx/cisd/openbis/plugin/screening/shared/api/v1/dto/ImageDatasetMetadata.java @@ -176,12 +176,7 @@ public class ImageDatasetMetadata implements Serializable */ public boolean hasThumbnails() { - return isInRange(thumbnailHeight, 0, height) && isInRange(thumbnailWidth, 0, width); - } - - private boolean isInRange(int value, int lowerBound, int upperBound) - { - return lowerBound < value && value < upperBound; + return thumbnailHeight > 0 && thumbnailWidth > 0; } @Override diff --git a/screening/sourceTest/java/ch/systemsx/cisd/openbis/plugin/screening/client/api/v1/ScreeningOpenbisServiceFacadeTest.java b/screening/sourceTest/java/ch/systemsx/cisd/openbis/plugin/screening/client/api/v1/ScreeningOpenbisServiceFacadeTest.java index b14cd12f54399f79b30b7b6f20e179954b75e9a9..d9f049aaadc135e4d9b8d3afff2e59483372a6e9 100644 --- a/screening/sourceTest/java/ch/systemsx/cisd/openbis/plugin/screening/client/api/v1/ScreeningOpenbisServiceFacadeTest.java +++ b/screening/sourceTest/java/ch/systemsx/cisd/openbis/plugin/screening/client/api/v1/ScreeningOpenbisServiceFacadeTest.java @@ -921,8 +921,8 @@ public class ScreeningOpenbisServiceFacadeTest extends AbstractFileSystemTestCas ImageDatasetMetadata imgMetaData = new ImageDatasetMetadata(imageDataSetId, Collections - .<String> emptyList(), - Collections.<String> emptyList(), 3, 3, 1024, 768, 1024, 768); + .<String> emptyList(), Collections.<String> emptyList(), 3, 3, + 1024, 768, 0, 0); will(returnValue(Arrays.asList(imgMetaData))); }