use of loci.formats.FilePattern in project bioformats by openmicroscopy.
the class ImagePlusReader method constructImageTitle.
private String constructImageTitle(IFormatReader r, String file, String seriesName, boolean groupFiles) {
String[] used = r.getUsedFiles();
String title = file.substring(file.lastIndexOf(File.separator) + 1);
if (used.length > 1 && groupFiles) {
FilePattern fp = new FilePattern(new Location(file));
title = fp.getPattern();
if (title == null) {
title = file;
if (title.indexOf('.') != -1) {
title = title.substring(0, title.lastIndexOf("."));
}
}
title = title.substring(title.lastIndexOf(File.separator) + 1);
}
if (seriesName != null && !file.endsWith(seriesName) && r.getSeriesCount() > 1) {
title += " - " + seriesName;
}
if (title.length() > 128) {
String a = title.substring(0, 62);
String b = title.substring(title.length() - 62);
title = a + "..." + b;
}
return title;
}
use of loci.formats.FilePattern in project bioformats by openmicroscopy.
the class LeicaReader method parseFilenames.
private void parseFilenames(int seriesIndex) throws IOException {
int maxPlanes = 0;
final List<String> f = new ArrayList<String>();
int tempImages = in.readInt();
if (((long) tempImages * nameLength) > in.length()) {
in.order(!isLittleEndian());
tempImages = in.readInt();
in.order(isLittleEndian());
}
CoreMetadata ms = core.get(seriesIndex);
ms.sizeX = in.readInt();
ms.sizeY = in.readInt();
in.skipBytes(4);
int samplesPerPixel = in.readInt();
ms.rgb = samplesPerPixel > 1;
ms.sizeC = samplesPerPixel;
boolean tiffsExist = false;
String dirPrefix = new Location(currentId).getAbsoluteFile().getParent();
if (!dirPrefix.endsWith(File.separator))
dirPrefix += File.separator;
String prefix = "";
for (int j = 0; j < tempImages; j++) {
// read in each filename
prefix = getString(nameLength);
f.add(dirPrefix + prefix);
// test to make sure the path is valid
Location test = new Location(f.get(f.size() - 1)).getAbsoluteFile();
LOGGER.debug("Expected to find TIFF file {}", test.getAbsolutePath());
if (!test.exists()) {
LOGGER.debug(" file does not exist");
}
if (!tiffsExist)
tiffsExist = test.exists();
}
if (!tiffsExist) {
// Strategy for handling renamed files:
// 1) Assume that files for each series follow a pattern.
// 2) Assign each file group to the first series with the correct count.
LOGGER.info("Handling renamed TIFF files");
String[] listing = getTIFFList();
// grab the file patterns
final List<String> filePatterns = new ArrayList<String>();
for (String q : listing) {
Location l = new Location(q).getAbsoluteFile();
if (!l.exists()) {
l = new Location(dirPrefix, q).getAbsoluteFile();
}
FilePattern pattern = new FilePattern(l);
if (!pattern.isValid())
continue;
AxisGuesser guess = new AxisGuesser(pattern, "XYZCT", 1, 1, 1, false);
String fp = pattern.getPattern();
if (guess.getAxisCountS() >= 1) {
String pre = pattern.getPrefix(guess.getAxisCountS());
final List<String> fileList = new ArrayList<String>();
for (int n = 0; n < listing.length; n++) {
Location p = new Location(dirPrefix, listing[n]);
if (p.getAbsolutePath().startsWith(pre)) {
fileList.add(listing[n]);
}
}
fp = FilePattern.findPattern(l.getAbsolutePath(), dirPrefix, fileList.toArray(new String[fileList.size()]));
}
if (fp != null && !filePatterns.contains(fp)) {
filePatterns.add(fp);
}
}
for (String q : filePatterns) {
String[] pattern = new FilePattern(q).getFiles();
if (pattern.length == tempImages) {
// make sure that this pattern hasn't already been used
boolean validPattern = true;
for (int n = 0; n < seriesIndex; n++) {
if (files[n] == null)
continue;
if (files[n].contains(pattern[0])) {
validPattern = false;
break;
}
}
if (validPattern) {
files[seriesIndex] = new ArrayList<String>();
files[seriesIndex].addAll(Arrays.asList(pattern));
}
}
}
} else {
files[seriesIndex] = f;
for (int s = 0; s < seriesIndex; s++) {
if (files[s] != null) {
if (files[s].get(0).equals(f.get(0))) {
valid[s] = false;
files[s] = null;
}
}
}
}
if (files[seriesIndex] == null)
valid[seriesIndex] = false;
else {
ms.imageCount = files[seriesIndex].size();
maxPlanes = (int) Math.max(maxPlanes, ms.imageCount);
}
}
use of loci.formats.FilePattern in project bioformats by openmicroscopy.
the class MIASReader method initFile.
// -- Internal FormatReader API methods --
/* @see loci.formats.FormatReader#initFile(String) */
@Override
protected void initFile(String id) throws FormatException, IOException {
super.initFile(id);
if (checkSuffix(id, "txt")) {
// first need to find a relevant TIFF file
Location base = new Location(id).getAbsoluteFile();
Location plate = null;
if (base.getParentFile().getName().equals("Batchresults")) {
Location experiment = base.getParentFile().getParentFile();
String[] plates = experiment.list(true);
Arrays.sort(plates);
plate = new Location(experiment, plates[0]);
} else {
plate = base.getParentFile();
if (plate.getName().equals("results"))
plate = plate.getParentFile();
}
String[] list = plate.list(true);
for (String f : list) {
if (f.startsWith("Well")) {
Location well = new Location(plate, f);
String[] wellList = well.list(true);
for (String file : wellList) {
String path = new Location(well, file).getAbsolutePath();
if (isThisType(path) && checkSuffix(path, new String[] { "tif", "tiff" })) {
initFile(path);
return;
}
}
}
}
throw new FormatException("Could not locate an appropriate TIFF file.");
}
if (!isGroupFiles()) {
tiffs = new String[][] { { id } };
readers = new MinimalTiffReader[1][1];
readers[0][0] = new MinimalTiffReader();
TiffReader r = new TiffReader();
r.setMetadataStore(getMetadataStore());
r.setId(tiffs[0][0]);
core = new ArrayList<CoreMetadata>(r.getCoreMetadataList());
metadataStore = r.getMetadataStore();
final Map<String, Object> globalMetadata = r.getGlobalMetadata();
for (final Map.Entry<String, Object> entry : globalMetadata.entrySet()) {
addGlobalMeta(entry.getKey(), entry.getValue());
}
r.close();
tileRows = 1;
tileCols = 1;
return;
}
analysisFiles = new ArrayList<AnalysisFile>();
// MIAS is a high content screening format which supports multiple plates,
// wells and fields.
// Most of the metadata comes from the directory hierarchy, as very little
// metadata is present in the actual files.
//
// The directory hierarchy is either:
//
// <experiment name> top level experiment directory
// Batchresults analysis results for experiment
// <plate number>_<plate barcode> one directory for each plate
// results analysis results for plate
// Well<xxxx> one directory for each well
// mode<x>_z<xxx>_t<xxx>_im<x>_<x>.tif
//
// or:
//
// <experiment name> top level experiment directory
// <plate number> plate directory (3 digits)
// <well number> well directory (4 digits)
// <channel number> channel directory (1 digit)
// <tile row>_<tile col>_<Z>_<T>.tif
//
// Each TIFF file contains a single grayscale plane. The "mode" block
// refers to the channel number; the "z" and "t" blocks refer to the
// Z section and timepoint, respectively. The "im<x>_<x>" block gives
// the row and column coordinates of the image within a mosaic.
//
// We are initially given one of these TIFF files; from there, we need
// to find the top level experiment directory and work our way down to
// determine how many plates and wells are present.
LOGGER.info("Building list of TIFF files");
Location baseFile = new Location(id).getAbsoluteFile();
Location plate = baseFile.getParentFile().getParentFile();
String plateName = plate.getName();
if (!(plateName.length() == 3 || (plateName.length() > 3 && plateName.replaceAll("\\d", "").startsWith("-")))) {
plate = plate.getParentFile();
plateName = plate.getName();
}
int plateNumber = Integer.parseInt(plateName.substring(0, 3));
Location experiment = plate.getParentFile();
String[] directories = experiment.list(true);
Arrays.sort(directories);
for (String dir : directories) {
Location f = new Location(experiment, dir);
if (dir.equals("Batchresults")) {
String[] results = f.list(true);
for (String result : results) {
Location file = new Location(f, result);
if (result.startsWith("NEO_Results")) {
resultFile = file.getAbsolutePath();
AnalysisFile af = new AnalysisFile();
af.filename = resultFile;
analysisFiles.add(af);
} else if (result.startsWith("NEO_PlateOutput_")) {
int plateIndex = Integer.parseInt(result.substring(16, 19));
if (plateIndex == plateNumber) {
AnalysisFile af = new AnalysisFile();
af.filename = file.getAbsolutePath();
af.plate = 0;
analysisFiles.add(af);
}
}
}
}
}
String[] list = plate.list(true);
Arrays.sort(list);
final List<String> wellDirectories = new ArrayList<String>();
for (String dir : list) {
Location f = new Location(plate, dir);
if (f.getName().startsWith("Well") || f.getName().length() == 4) {
// directory name is valid, but we need to make sure that the
// directory contains a TIFF or a subdirectory
String[] wellList = f.list(true);
if (wellList != null) {
boolean validWell = false;
for (String potentialTIFF : wellList) {
if (potentialTIFF.toLowerCase().endsWith(".tif") || new Location(f, potentialTIFF).isDirectory()) {
validWell = true;
break;
}
}
if (validWell)
wellDirectories.add(f.getAbsolutePath());
}
} else if (f.getName().equals("results")) {
String[] resultsList = f.list(true);
for (String result : resultsList) {
// exclude proprietary program state files
if (!result.endsWith(".sav") && !result.endsWith(".dsv") && !result.endsWith(".dat")) {
Location r = new Location(f, result);
AnalysisFile af = new AnalysisFile();
af.filename = r.getAbsolutePath();
af.plate = 0;
if (result.toLowerCase().startsWith("well")) {
af.well = Integer.parseInt(result.substring(4, 8)) - 1;
}
analysisFiles.add(af);
}
}
} else if (f.getName().equals("Nugenesistemplate.txt")) {
templateFile = f.getAbsolutePath();
}
}
int nWells = wellDirectories.size();
LOGGER.debug("Found {} wells.", nWells);
readers = new MinimalTiffReader[nWells][];
tiffs = new String[nWells][];
int[] zCount = new int[nWells];
int[] cCount = new int[nWells];
int[] tCount = new int[nWells];
String[] order = new String[nWells];
wellNumber = new int[nWells];
String[] wells = wellDirectories.toArray(new String[nWells]);
Arrays.sort(wells);
for (int j = 0; j < nWells; j++) {
Location well = new Location(wells[j]);
String wellName = well.getName().replaceAll("Well", "");
wellNumber[j] = Integer.parseInt(wellName) - 1;
String[] tiffFiles = well.list(true);
final List<String> tmpFiles = new ArrayList<String>();
for (String tiff : tiffFiles) {
String name = tiff.toLowerCase();
if (name.endsWith(".tif") || name.endsWith(".tiff")) {
tmpFiles.add(new Location(well, tiff).getAbsolutePath());
}
}
if (tmpFiles.size() == 0) {
LOGGER.debug("No TIFFs in well directory {}", wells[j]);
// directories which contain the TIFFs
for (String dir : tiffFiles) {
Location file = new Location(well, dir);
if (dir.length() == 1 && file.isDirectory()) {
cCount[j]++;
String[] tiffs = file.list(true);
for (String tiff : tiffs) {
String name = tiff.toLowerCase();
if (name.endsWith(".tif") || name.endsWith(".tiff")) {
tmpFiles.add(new Location(file, tiff).getAbsolutePath());
}
}
}
}
}
tiffFiles = tmpFiles.toArray(new String[0]);
if (ArrayUtils.isEmpty(tiffFiles)) {
throw new FormatException("Empty dataset - No tiff files were found.");
}
Location firstTiff = new Location(tiffFiles[0]);
List<String> names = new ArrayList<String>();
for (Location f : firstTiff.getParentFile().listFiles()) {
names.add(f.getName());
}
FilePattern fp = new FilePattern(FilePattern.findPattern(firstTiff.getName(), null, names.toArray(new String[names.size()])));
String[] blocks = fp.getPrefixes();
order[j] = "XY";
int[] count = fp.getCount();
for (int block = blocks.length - 1; block >= 0; block--) {
blocks[block] = blocks[block].toLowerCase();
blocks[block] = blocks[block].substring(blocks[block].lastIndexOf("_") + 1);
if (blocks[block].equals("z")) {
zCount[j] = count[block];
order[j] += 'Z';
} else if (blocks[block].equals("t")) {
tCount[j] = count[block];
order[j] += 'T';
} else if (blocks[block].equals("mode")) {
cCount[j] = count[block];
order[j] += 'C';
} else if (blocks[block].equals("im"))
tileRows = count[block];
else if (blocks[block].equals(""))
tileCols = count[block];
else if (blocks[block].replaceAll("\\d", "").length() == 0) {
if (block == 3)
tileRows = count[block];
else if (block == 2)
tileCols = count[block];
else if (block == 0) {
zCount[j] = count[block];
order[j] += 'Z';
} else if (block == 1) {
tCount[j] = count[block];
order[j] += 'T';
}
} else {
throw new FormatException("Unsupported block '" + blocks[block]);
}
}
Arrays.sort(tiffFiles);
tiffs[j] = tiffFiles;
LOGGER.debug("Well {} has {} files.", j, tiffFiles.length);
readers[j] = new MinimalTiffReader[tiffFiles.length];
for (int k = 0; k < tiffFiles.length; k++) {
readers[j][k] = new MinimalTiffReader();
}
}
// Populate core metadata
LOGGER.info("Populating core metadata");
int nSeries = tiffs.length;
bpp = new int[nSeries];
if (readers.length == 0) {
throw new FormatException("No wells were found.");
}
// assume that all wells have the same width, height, and pixel type
readers[0][0].setId(tiffs[0][0]);
tileWidth = readers[0][0].getSizeX();
tileHeight = readers[0][0].getSizeY();
if (tileCols == 0)
tileCols = 1;
if (tileRows == 0)
tileRows = 1;
core.clear();
for (int i = 0; i < nSeries; i++) {
CoreMetadata ms = new CoreMetadata();
core.add(ms);
ms.sizeZ = zCount[i];
ms.sizeC = cCount[i];
ms.sizeT = tCount[i];
if (ms.sizeZ == 0)
ms.sizeZ = 1;
if (ms.sizeC == 0)
ms.sizeC = 1;
if (ms.sizeT == 0)
ms.sizeT = 1;
ms.sizeX = tileWidth * tileCols;
ms.sizeY = tileHeight * tileRows;
ms.pixelType = readers[0][0].getPixelType();
ms.sizeC *= readers[0][0].getSizeC();
ms.rgb = readers[0][0].isRGB();
ms.littleEndian = readers[0][0].isLittleEndian();
ms.interleaved = readers[0][0].isInterleaved();
ms.indexed = readers[0][0].isIndexed();
ms.falseColor = readers[0][0].isFalseColor();
ms.dimensionOrder = order[i];
if (ms.dimensionOrder.indexOf('Z') == -1) {
ms.dimensionOrder += 'Z';
}
if (ms.dimensionOrder.indexOf('C') == -1) {
ms.dimensionOrder += 'C';
}
if (ms.dimensionOrder.indexOf('T') == -1) {
ms.dimensionOrder += 'T';
}
ms.imageCount = ms.sizeZ * ms.sizeT * cCount[i];
if (ms.imageCount == 0) {
ms.imageCount = 1;
}
bpp[i] = FormatTools.getBytesPerPixel(ms.pixelType);
}
// Populate metadata hashtable
LOGGER.info("Populating metadata hashtable");
if (resultFile != null && getMetadataOptions().getMetadataLevel() != MetadataLevel.MINIMUM) {
String[] cols = null;
final List<String> rows = new ArrayList<String>();
boolean doKeyValue = true;
int nStarLines = 0;
String analysisResults = DataTools.readFile(resultFile);
String[] lines = analysisResults.split("\n");
for (String line : lines) {
line = line.trim();
if (line.length() == 0)
continue;
if (line.startsWith("******") && line.endsWith("******"))
nStarLines++;
if (doKeyValue) {
String[] n = line.split("\t");
if (n[0].endsWith(":"))
n[0] = n[0].substring(0, n[0].length() - 1);
if (n.length >= 2)
addGlobalMeta(n[0], n[1]);
} else {
if (cols == null)
cols = line.split("\t");
else
rows.add(line);
}
if (nStarLines == 2)
doKeyValue = false;
}
for (String row : rows) {
String[] d = row.split("\t");
for (int col = 3; col < cols.length; col++) {
addGlobalMeta("Plate " + d[0] + ", Well " + d[2] + " " + cols[col], d[col]);
if (cols[col].equals("AreaCode")) {
String wellID = d[col].replaceAll("\\D", "");
wellColumns = Integer.parseInt(wellID);
}
}
}
}
// Populate MetadataStore
LOGGER.info("Populating MetadataStore");
MetadataStore store = makeFilterMetadata();
MetadataTools.populatePixels(store, this, true);
// assume that a 96 well plate is 8x12, and a 384 well plate is 16x24
if (wellColumns == 0) {
if (nWells == 96) {
wellColumns = 12;
} else if (nWells == 384) {
wellColumns = 24;
} else {
LOGGER.warn("Could not determine the plate dimensions.");
wellColumns = 24;
}
}
store.setPlateID(MetadataTools.createLSID("Plate", 0), 0);
String plateAcqId = MetadataTools.createLSID("PlateAcquisition", 0, 0);
store.setPlateAcquisitionID(plateAcqId, 0, 0);
store.setPlateAcquisitionMaximumFieldCount(new PositiveInteger(1), 0, 0);
for (int well = 0; well < nWells; well++) {
int wellIndex = wellNumber[well];
int row = wellIndex / wellColumns;
int wellCol = (wellIndex % wellColumns) + 1;
char wellRow = (char) ('A' + row);
store.setWellID(MetadataTools.createLSID("Well", 0, well), 0, well);
store.setWellRow(new NonNegativeInteger(row), 0, well);
store.setWellColumn(new NonNegativeInteger(wellCol - 1), 0, well);
String imageID = MetadataTools.createLSID("Image", well);
String wellSampleID = MetadataTools.createLSID("WellSample", 0, well, 0);
store.setWellSampleID(wellSampleID, 0, well, 0);
store.setWellSampleIndex(new NonNegativeInteger(well), 0, well, 0);
store.setImageID(imageID, well);
store.setImageName("Well " + wellRow + wellCol, well);
store.setWellSampleImageRef(imageID, 0, well, 0);
store.setPlateAcquisitionWellSampleRef(wellSampleID, 0, 0, well);
}
MetadataLevel level = getMetadataOptions().getMetadataLevel();
if (level != MetadataLevel.MINIMUM) {
String experimentID = MetadataTools.createLSID("Experiment", 0);
store.setExperimentID(experimentID, 0);
store.setExperimentType(getExperimentType("Other"), 0);
store.setExperimentDescription(experiment.getName(), 0);
// populate SPW metadata
store.setPlateColumnNamingConvention(getNamingConvention("Number"), 0);
store.setPlateRowNamingConvention(getNamingConvention("Letter"), 0);
parseTemplateFile(store);
plateName = plateName.substring(plateName.indexOf('-') + 1);
store.setPlateName(plateName, 0);
store.setPlateExternalIdentifier(plateName, 0);
for (int well = 0; well < nWells; well++) {
// populate Image/Pixels metadata
store.setImageExperimentRef(experimentID, well);
String instrumentID = MetadataTools.createLSID("Instrument", 0);
store.setInstrumentID(instrumentID, 0);
store.setImageInstrumentRef(instrumentID, well);
}
roiFiles = new ArrayList<AnalysisFile>();
for (AnalysisFile af : analysisFiles) {
String file = af.filename;
String name = new Location(file).getName();
if (!name.startsWith("Well"))
continue;
if (name.endsWith("AllModesOverlay.tif")) {
roiFiles.add(af);
} else if (name.endsWith("overlay.tif")) {
roiFiles.add(af);
}
}
if (level != MetadataLevel.NO_OVERLAYS) {
// populate image-level ROIs
Color[] colors = new Color[getSizeC()];
int nextROI = 0;
for (AnalysisFile af : analysisFiles) {
String file = af.filename;
String name = new Location(file).getName();
if (!name.startsWith("Well"))
continue;
int[] position = getPositionFromFile(file);
int well = position[0];
if (name.endsWith("detail.txt")) {
String data = DataTools.readFile(file);
String[] lines = data.split("\n");
int start = 0;
while (start < lines.length && !lines[start].startsWith("Label")) {
start++;
}
if (start >= lines.length)
continue;
String[] columns = lines[start].split("\t");
List<String> columnNames = Arrays.asList(columns);
for (int j = start + 1; j < lines.length; j++) {
populateROI(columnNames, lines[j].split("\t"), well, nextROI++, position[1], position[2], store);
}
} else if (name.endsWith("AllModesOverlay.tif")) {
// results/Well<nnnn>_mode<n>_z<nnn>_t<nnn>_AllModesOverlay.tif
if (colors[position[3]] != null)
continue;
try {
colors[position[3]] = getChannelColorFromFile(file);
} catch (IOException e) {
}
if (colors[position[3]] == null)
continue;
for (int s = 0; s < getSeriesCount(); s++) {
store.setChannelColor(colors[position[3]], s, position[3]);
}
if (position[3] == 0) {
nextROI += parseMasks(store, well, nextROI, file);
}
} else if (name.endsWith("overlay.tif")) {
nextROI += parseMasks(store, well, nextROI, file);
}
}
}
}
}
use of loci.formats.FilePattern in project bioformats by openmicroscopy.
the class FilePatternTest method testVarDir.
@Test
public void testVarDir() {
String[] prefixes = { "z" };
String[] blocks = { "<0-1>" };
String suffix = SEPARATOR + "foo.tif";
String pattern = mkPattern(prefixes, blocks, suffix);
FilePattern fp = new FilePattern(pattern);
assertTrue(fp.isValid());
assertFalse(fp.isRegex());
assertEquals(fp.getPattern(), pattern);
assertEquals(fp.getPrefixes(), prefixes);
for (int i = 0; i < prefixes.length; i++) {
assertEquals(fp.getPrefix(i), prefixes[i]);
}
assertEquals(fp.getPrefix(), prefixes[0]);
assertEquals(fp.getBlocks(), blocks);
for (int i = 0; i < blocks.length; i++) {
assertEquals(fp.getBlock(i), blocks[i]);
}
assertEquals(fp.getSuffix(), suffix);
assertEquals(fp.getCount(), new int[] { 2 });
assertEquals(fp.getElements(), new String[][] { { "0", "1" } });
assertEqualsNoOrder(fp.getFiles(), new String[] { "z0" + suffix, "z1" + suffix });
assertEquals(fp.getFirst(), new BigInteger[] { BigInteger.ZERO });
assertEquals(fp.getLast(), new BigInteger[] { BigInteger.ONE });
assertEquals(fp.getStep(), new BigInteger[] { BigInteger.ONE });
}
use of loci.formats.FilePattern in project bioformats by openmicroscopy.
the class FilePatternTest method testNonRegex.
@Test
public void testNonRegex() {
String[] prefixes = { "z", "c", "t" };
String[] blocks = { "<0-1>", "<R,G,B>", "<10-30:10>" };
String suffix = ".tif";
String pattern = mkPattern(prefixes, blocks, suffix);
FilePattern fp = new FilePattern(pattern);
assertTrue(fp.isValid());
assertFalse(fp.isRegex());
assertEquals(fp.getPattern(), pattern);
assertEquals(fp.getPrefixes(), prefixes);
for (int i = 0; i < prefixes.length; i++) {
assertEquals(fp.getPrefix(i), prefixes[i]);
}
assertEquals(fp.getPrefix(), prefixes[0]);
assertEquals(fp.getBlocks(), blocks);
for (int i = 0; i < blocks.length; i++) {
assertEquals(fp.getBlock(i), blocks[i]);
}
assertEquals(fp.getSuffix(), suffix);
assertEquals(fp.getCount(), new int[] { 2, 3, 3 });
assertEquals(fp.getElements(), new String[][] { { "0", "1" }, { "R", "G", "B" }, { "10", "20", "30" } });
assertEqualsNoOrder(fp.getFiles(), new String[] { "z0cRt10.tif", "z0cRt20.tif", "z0cRt30.tif", "z0cGt10.tif", "z0cGt20.tif", "z0cGt30.tif", "z0cBt10.tif", "z0cBt20.tif", "z0cBt30.tif", "z1cRt10.tif", "z1cRt20.tif", "z1cRt30.tif", "z1cGt10.tif", "z1cGt20.tif", "z1cGt30.tif", "z1cBt10.tif", "z1cBt20.tif", "z1cBt30.tif" });
assertEquals(fp.getFirst(), new BigInteger[] { new BigInteger("0"), null, new BigInteger("10") });
assertEquals(fp.getLast(), new BigInteger[] { new BigInteger("1"), null, new BigInteger("30") });
assertEquals(fp.getStep(), new BigInteger[] { new BigInteger("1"), null, new BigInteger("10") });
}
Aggregations