/*
* #%L
* org.gitools.ui.app
* %%
* Copyright (C) 2013 - 2014 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.ui.app.fileimport.wizard.text.reader;
import org.gitools.api.matrix.IMatrix;
import org.gitools.matrix.model.MatrixLayer;
import org.gitools.matrix.model.matrix.AnnotationMatrix;
import org.gitools.utils.readers.FileHeader;
import org.gitools.utils.readers.MatrixReaderProfile;
import org.gitools.utils.translators.DoubleTranslator;
import java.util.List;
public class MatrixReaderAssistant extends ReaderAssistant {
private String[] columnHeaders;
private MatrixReaderProfile profile;
private String currentRowId;
private String[] currentFields;
public MatrixReaderAssistant(FlatTextImporter reader) {
super(reader);
}
@Override
public void fillMatrixAndAnnotations(IMatrix matrix, AnnotationMatrix rowAnnMatrix, AnnotationMatrix colAnnMatrix) {
processLine();
for (int i = 0; i < currentFields.length; i++) {
Double value = DoubleTranslator.get().stringToValue(currentFields[i]);
matrix.set(heatmapLayers[0], value, currentRowId, columnHeaders[i]);
}
}
private void processLine() {
String[] currentLine = reader.getCurrentLine();
currentFields = extractFields(currentLine, profile.getValueColumns());
currentRowId = currentLine[profile.getRowIdsPosition()];
}
private String[] extractFields(String[] fields, int[] indices) {
String[] extracted = new String[indices.length];
for (int i = 0; i < indices.length; i++) {
extracted[i] = fields[indices[i]];
}
return extracted;
}
@Override
public String[] getHeatmapHeaders() {
return new String[]{profile.getDataName()};
}
@Override
public void update() {
this.profile = (MatrixReaderProfile) reader.getReaderProfile();
this.heatmapLayers = createHeatmapLayers();
this.columnHeaders = getColumnHeaders();
}
@Override
public boolean hasColAnnotation() {
return false;
}
@Override
public boolean hasRowAnnotation() {
return false;
}
@Override
public void updateAnnotationNames() {
//TODO
}
private String[] getColumnHeaders() {
List<FileHeader> fileHeaders = reader.getFileHeaders();
String[] headers = new String[fileHeaders.size()];
for (int i = 0; i < headers.length; i++) {
headers[i] = fileHeaders.get(i).getLabel();
}
return extractFields(headers, profile.getValueColumns());
}
protected MatrixLayer[] createHeatmapLayers() {
MatrixLayer[] heatmapLayers;
String[] heatmapHeaders = getHeatmapHeaders();
heatmapLayers = new MatrixLayer[profile.getValueColumnsNumber()];
for (int i = 0; i < heatmapHeaders.length; i++) {
heatmapLayers[i] = new MatrixLayer<>(heatmapHeaders[i], Double.class);
}
return heatmapLayers;
}
}