/*
*------------------------------------------------------------------------------
* Copyright (C) 2013-2015 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.util.file.modulo;
//Java imports
import java.util.List;
import org.apache.commons.collections.CollectionUtils;
import org.openmicroscopy.shoola.util.CommonsLangUtils;
/**
* Holds information about the modulo tag.
*
* @author Jean-Marie Burel
* <a href="mailto:j.burel@dundee.ac.uk">j.burel@dundee.ac.uk</a>
* @since 5.0
*/
public class ModuloInfo {
/** Identifies modulo along C.*/
public static final int C = 0;
/** Identifies modulo along Z.*/
public static final int Z = 1;
/** Identifies modulo along T.*/
public static final int T = 2;
/** Identifies the <code>ModuloAlongT</code>.*/
static final String MODULO_T = "ModuloAlongT";
/** Identifies the <code>ModuloAlongZ</code>.*/
static final String MODULO_Z = "ModuloAlongZ";
/** Identifies the <code>ModuloAlongC</code>.*/
static final String MODULO_C = "ModuloAlongC";
/** Identifies the <code>End</code>.*/
static final String END = "End";
/** Identifies the <code>Start</code>.*/
static final String START = "Start";
/** Identifies the <code>Step</code>.*/
static final String STEP = "Step";
/** Identifies the <code>Type</code>.*/
static final String TYPE = "Type";
/** Identifies the <code>TypeDescription</code>.*/
static final String TYPE_DESCRIPTION = "TypeDescription";
/** Identifies the <code>Unit</code>.*/
static final String UNIT = "Unit";
/** Identifies the <code>Label</code>.*/
static final String LABEL = "Label";
/** The value of the <code>End</code> tag.*/
private double end;
/** The value of the <code>Start</code> tag.*/
private double start;
/** The value of the <code>Unit</code> tag.*/
private String unit;
/** The value of the <code>Type</code> tag.*/
private String type;
/** The value of the <code>Step</code> tag.*/
private double step;
/** The value of the <code>TypeDescription</code> tag.*/
private String typeDescription;
/** Indicates along which dimension the modulo applies./*/
private int modulo;
/** The value of the label tags.*/
private List<Double> labels;
/**
* Creates a new instance and determines the dimension the modulo property
* applies to.
*
* @param moduloAlong
*/
ModuloInfo(String moduloAlong)
{
if (CommonsLangUtils.isEmpty(moduloAlong))
throw new IllegalArgumentException("Dimension not supported.");
modulo = -1;
if (MODULO_C.equals(moduloAlong))
modulo = C;
else if (MODULO_Z.equals(moduloAlong))
modulo = Z;
else if (MODULO_T.equals(moduloAlong))
modulo = T;
if (modulo == -1)
throw new IllegalArgumentException("Dimension not supported.");
}
/**
* Sets the labels.
*
* @param labels The value to set.
*/
public void setLabels(List<Double> labels)
{
this.labels = labels;
}
/**
* Returns the direction along which the modulo applies.
*
* @return See above.
*/
public int getModuloIndex() { return modulo; }
/**
* Sets the value of the <code>End</code> tag.
*
* @param value The value to set.
*/
public void setEnd(double value) { end = value; }
/**
* Sets the value of the <code>Start</code> tag.
*
* @param value The value to set.
*/
public void setStart(double value) { start = value; }
/**
* Sets the value of the <code>Type</code> tag.
*
* @param value The value to set.
*/
public void setType(String value) { type = value; }
/**
* Sets the value of the <code>TypeDescription</code> tag.
*
* @param value The value to set.
*/
public void setTypeDescription(String value) { typeDescription = value; }
/**
* Sets the value of the <code>Unit</code> tag.
*
* @param value The value to set.
*/
public void setUnit(String value) { unit = value; }
/**
* Sets the value of the <code>Step</code> tag.
*
* @param value The value to set.
*/
public void setStep(double value) { step = value; }
/**
* Returns value of the <code>End</code> tag.
*
* @return See above.
*/
public double getEnd() { return end; }
/**
* Returns value of the <code>Start</code> tag.
*
* @return See above.
*/
public double getStart() { return start; }
/**
* Returns value of the <code>Unit</code> tag.
*
* @return See above.
*/
public String getUnit() { return unit; }
/**
* Returns value of the <code>Step</code> tag.
*
* @return See above.
*/
public double getStep() { return step; }
/**
* Returns value of the <code>Type</code> tag.
*
* @return See above.
*/
public String getType() { return type; }
/**
* Returns value of the <code>TypeDescription</code> tag.
*
* @return See above.
*/
public String getTypeDescription() { return typeDescription; }
/**
* Returns the real value corresponding to the specified bin.
*
* @param bin The selected bin.
* @return See above.
*/
public double getRealValue(int bin)
{
if (CollectionUtils.isEmpty(labels)) return start+bin*step;
if (bin < 0) bin = 0;
if (bin >= labels.size()) bin = labels.size()-1;
return start+labels.get(bin);
}
/**
* Determines the modulo size.
*
* @return See above.
*/
public int getSize()
{
if (!CollectionUtils.isEmpty(labels)) return labels.size();
if (step == 0) step = 1;
return (int) ((end-start)/step)+1;
}
}