/*
*------------------------------------------------------------------------------
* Copyright (C) 2006-2016 University of Dundee. All rights reserved.
*
*
* 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, write to the Free Software Foundation, Inc.,
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*
*------------------------------------------------------------------------------
*/
package org.openmicroscopy.shoola.env.data.model;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import omero.constants.projection.ProjectionType;
import org.openmicroscopy.shoola.env.data.OmeroImageService;
import omero.gateway.model.DatasetData;
/**
* Utility class storing the projection's parameters.
*
* @author Jean-Marie Burel
* <a href="mailto:j.burel@dundee.ac.uk">j.burel@dundee.ac.uk</a>
* @author Donald MacDonald
* <a href="mailto:donald@lifesci.dundee.ac.uk">donald@lifesci.dundee.ac.uk</a>
* @since 3.0-Beta3
*/
public class ProjectionParam
{
/** The <code>Maximum</code> intensity projection (MIP) */
public static final int MAXIMUM_INTENSITY =
OmeroImageService.MAX_INTENSITY;
/** The <code>Mean</code> intensity projection */
public static final int MEAN_INTENSITY =
OmeroImageService.MEAN_INTENSITY;
/** The <code>Sum</code> intensity projection */
public static final int SUM_INTENSITY = OmeroImageService.SUM_INTENSITY;
/** Identifies the type used to store pixel values. */
public static final String INT_8 = OmeroImageService.INT_8;
/** Identifies the type used to store pixel values. */
public static final String UINT_8 = OmeroImageService.UINT_8;
/** Identifies the type used to store pixel values. */
public static final String INT_16 = OmeroImageService.INT_16;
/** Identifies the type used to store pixel values. */
public static final String UINT_16 = OmeroImageService.UINT_16;
/** Identifies the type used to store pixel values. */
public static final String INT_32 = OmeroImageService.INT_32;
/** Identifies the type used to store pixel values. */
public static final String UINT_32 = OmeroImageService.UINT_32;
/** Identifies the type used to store pixel values. */
public static final String FLOAT = OmeroImageService.FLOAT;
/** Identifies the type used to store pixel values. */
public static final String DOUBLE = OmeroImageService.DOUBLE;
/** The type of projections supported. */
public static final Map<Integer, String> PROJECTIONS;
static {
PROJECTIONS = new LinkedHashMap<Integer, String>();
PROJECTIONS.put(MAXIMUM_INTENSITY, "Maximum");
PROJECTIONS.put(MEAN_INTENSITY, "Mean");
}
/** The first timepoint to project. */
private int startT;
/** The last timepoint to project. */
private int endT;
/** The first z-section to project. */
private int startZ;
/** The last z-section to project. */
private int endZ;
/** The stepping used while projecting. Default is <code>1</code>. */
private int stepping;
/** The projection's algorithm. */
private int algorithm;
/** The collection of datasets where to store the projected image. */
private List<DatasetData> datasets;
/** The name of the projected image. */
private String name;
/** The description of the projected image. */
private String description;
/** The type of pixels. */
private String pixelsType;
/** The collection of channels to project. */
private List<Integer> channels;
/** The id of the pixels set to project. */
private long pixelsID;
/** The parent of the dataset to create. */
private omero.gateway.model.DataObject parent;
/**
* Checks if the passed algorithm is supported or not.
*
* @param value The value to check.
*/
static void checkProjectionAlgorithm(int value)
{
//for some strange reasons, cannot use a switch
if (value == MAXIMUM_INTENSITY) return;
if (value == MEAN_INTENSITY) return;
if (value == SUM_INTENSITY) return;
throw new IllegalArgumentException("Algorithm not valid");
}
/**
* Creates a new instance.
*
* @param pixelsID The id of the pixels set to project.
* @param startZ The first z-section to project. (zero based)
* @param endZ The last z-section to project. (zero based)
* @param stepping The stepping used while projecting.
* @param algorithm The projection's algorithm.
* @param startT The first timepoint to project.
* @param endT The last timepoint to project.
* @param channels The collection of channels to project.
* @param name The name of the projected image.
*/
public ProjectionParam(long pixelsID, int startZ, int endZ, int stepping,
int algorithm, int startT, int endT,
List<Integer> channels, String name)
{
if (pixelsID < 0)
throw new IllegalArgumentException("Pixels ID not valid.");
if (startZ > endZ)
throw new IllegalArgumentException("Optical Interval not valid.");
if (name == null)
throw new IllegalArgumentException("Image name cannot be null.");
checkProjectionAlgorithm(algorithm);
this.algorithm = algorithm;
if (stepping < 1) stepping = 1;
this.startZ = startZ;
this.endZ = endZ;
this.startT = startT;
this.endT = endT;
this.stepping = stepping;
this.name = name;
this.pixelsID = pixelsID;
this.channels = channels;
pixelsType = null;
}
/**
* Creates a new instance. This is constructor should only be used
* to host the parameters required to do a projection preview.
*
* @param pixelsID The id of the pixels set to project.
* @param startZ The first z-section to project.
* @param endZ The last z-section to project.
* @param stepping The stepping used while projecting.
* @param algorithm The projection's algorithm.
*/
public ProjectionParam(long pixelsID, int startZ, int endZ, int stepping,
int algorithm)
{
this(pixelsID, startZ, endZ, stepping, algorithm, -1, -1, null, "");
}
/**
* Sets the description of the projected image.
*
* @param description The value to set.
*/
public void setDescription(String description)
{
this.description = description;
}
/**
* Returns the first timepoint to project.
*
* @return See above.
*/
public int getStartT() { return startT; }
/**
* Returns the last timepoint to project.
*
* @return See above.
*/
public int getEndT() { return endT; }
/**
* Returns the first z-section to project. (zero based)
*
* @return See above.
*/
public int getStartZ() { return startZ; }
/**
* Returns the last z-section to project. (zero based)
*
* @return See above.
*/
public int getEndZ() { return endZ; }
/**
* Returns the projection's algorithm.
*
* @return See above.
*/
public int getAlgorithm() { return algorithm; }
/**
* Returns the gap between each step. Default is <code>1</code>.
*
* @return See above.
*/
public int getStepping() { return stepping; }
/**
* Returns the name of the projected image.
*
* @return See above.
*/
public String getName() { return name; }
/**
* Returns the id of the pixels set to project.
*
* @return See above.
*/
public long getPixelsID() { return pixelsID; }
/**
* Returns the type of the newly created pixels set.
* This value should only be set when the projection's algorithm is
* <code>Sum projection</code>.
*
* @return See above.
*/
public String getPixelsType() { return pixelsType; }
/**
* Returns the collection of datasets to add the created image to.
*
* @return See above.
*/
public List<DatasetData> getDatasets() { return datasets; }
/**
* Returns the collection of channels to project.
*
* @return See above
*/
public List<Integer> getChannels() { return channels; }
/**
* Sets the datasets to add the projected image to.
*
* @param datasets The value to set.
*/
public void setDatasets(List<DatasetData> datasets)
{
this.datasets = datasets;
}
/**
* Sets the parent of the dataset to create if a dataset has to be created.
*
* @param parent The value to set.
*/
public void setDatasetParent(omero.gateway.model.DataObject parent)
{
this.parent = parent;
}
/**
* Returns the parent of the dataset to create.
*
* @return See above.
*/
public omero.gateway.model.DataObject getDatasetParent() { return parent; }
/**
* Returns the description of the image.
*
* @return See above.
*/
public String getDescription() { return description; }
/**
* Sets the channels to project.
*
* @param channels The value to set.
*/
public void setChannels(List<Integer> channels)
{
this.channels = channels;
}
/**
* Sets the pixels type.
*
* @param type The value to set.
*/
public void setPixelsType(String type) { pixelsType = type; }
/**
* Returns the type of projection.
*
* @return See above.
*/
public ProjectionType getProjectionType()
{
return convertType(getAlgorithm());
}
/**
* Returns the {@link ProjectionType} constants corresponding to the passed
* value.
*
* @param type Identifier to the @link ProjectionType}.
* @return See above.
*/
public static ProjectionType convertType(int type)
{
if (ProjectionType.MAXIMUMINTENSITY.ordinal() == type)
return ProjectionType.MAXIMUMINTENSITY;
if (ProjectionType.MEANINTENSITY.ordinal() == type)
return ProjectionType.MEANINTENSITY;
if (ProjectionType.SUMINTENSITY.ordinal() == type)
return ProjectionType.SUMINTENSITY;
return null;
}
}