/* * #%L * gitools-core * %% * Copyright (C) 2013 Universitat Pompeu Fabra - Biomedical Genomics group * %% * 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 3 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-3.0.html>. * #L% */ package org.gitools.matrix.format; import org.gitools.api.PersistenceException; import org.gitools.api.analysis.IProgressMonitor; import org.gitools.api.matrix.IMatrix; import org.gitools.api.matrix.IMatrixDimension; import org.gitools.api.matrix.IMatrixLayer; import org.gitools.api.resource.IResourceLocator; import org.gitools.matrix.model.MatrixLayer; import org.gitools.matrix.model.MatrixLayers; import org.gitools.matrix.model.hashmatrix.HashMatrix; import org.gitools.utils.readers.text.CSVReader; import org.gitools.utils.translators.DoubleTranslator; import java.io.*; import java.util.Arrays; import java.util.HashSet; import java.util.Set; import static org.gitools.api.matrix.MatrixDimensionKey.COLUMNS; import static org.gitools.api.matrix.MatrixDimensionKey.ROWS; public abstract class AbstractCdmMatrixFormat extends AbstractMatrixFormat { private final int skipLines; private final Set<Integer> skipColumns; protected AbstractCdmMatrixFormat(String extension, int skipLines, Integer... skipColumns) { super(extension); this.skipLines = skipLines; this.skipColumns = new HashSet<>(Arrays.asList(skipColumns)); } @Override protected IMatrix readResource(IResourceLocator resourceLocator, IProgressMonitor progressMonitor) throws PersistenceException { progressMonitor.begin("Reading data ...", 1); MatrixLayer<Double> layer = new MatrixLayer<>("value", Double.class); HashMatrix matrix = new HashMatrix(new MatrixLayers<MatrixLayer>(layer), ROWS, COLUMNS); try { InputStream in = resourceLocator.openInputStream(progressMonitor); CSVReader parser = new CSVReader(new InputStreamReader(in)); if (skipLines > 0) { for (int s = 0; s < skipLines; s++) { parser.readNext(); } } // Read columns String columns[] = skipColumns(parser.readNext()); String[] fields; while ((fields = skipColumns(parser.readNext())) != null) { checkLine(fields, columns, parser.getLineNumber()); String rowId = fields[0]; for (int i = 1; i < fields.length; i++) { String columnId = columns[i]; Double value = DoubleTranslator.get().stringToValue(fields[i]); matrix.set(layer, value, rowId, columnId); } } in.close(); } catch (Exception e) { throw new PersistenceException(e); } return matrix; } private String[] skipColumns(String[] columns) { if (skipColumns.isEmpty()) { return columns; } if (columns == null || columns.length == 0) { return columns; } String[] result = new String[columns.length - skipColumns.size()]; int r = 0; for (int i = 0; i < columns.length; i++) { if (!skipColumns.contains(Integer.valueOf(i))) { result[r] = columns[i]; r++; if (r == result.length) { break; } } } return result; } @Override protected void writeResource(IResourceLocator resourceLocator, IMatrix matrix, IProgressMonitor monitor) throws PersistenceException { monitor.begin("Saving matrix...", matrix.getColumns().size()); try { OutputStream out = resourceLocator.openOutputStream(monitor); PrintWriter pw = new PrintWriter(new OutputStreamWriter(out)); IMatrixLayer<Double> layer = matrix.getLayers().iterator().next(); IMatrixDimension rows = matrix.getRows(); IMatrixDimension columns = matrix.getColumns(); for (String column : columns) { pw.print('\t'); pw.print(column); } pw.print('\n'); for (String row : rows) { pw.print(row); for (String column : columns) { pw.print('\t'); pw.print(layer.getTranslator().valueToString(matrix.get(layer, row, column))); } pw.print('\n'); monitor.worked(1); } pw.close(); out.close(); } catch (Exception e) { throw new PersistenceException(e); } } }