/*
* #%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.api.matrix.IMatrixLayer;
import org.gitools.matrix.model.MatrixLayer;
import org.gitools.matrix.model.matrix.AnnotationMatrix;
import org.gitools.utils.readers.FileHeader;
import org.gitools.utils.readers.profile.TableReaderProfile;
import org.gitools.utils.translators.DoubleTranslator;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class TableReaderAssistant extends ReaderAssistant {
private String currentColId;
private TableReaderProfile profile;
private String currentRowId;
private String[] currentFields;
private Map<IMatrixLayer, Map<String,Integer>> factorMap;
private String[] rowAnnFieldNames;
private String[] rowAnnFields;
private String[] colAnnFieldNames;
private String[] colAnnFields;
public TableReaderAssistant(FlatTextImporter reader) {
super(reader);
factorMap = new HashMap<>();
}
@Override
public void fillMatrixAndAnnotations(IMatrix matrix, AnnotationMatrix rowAnnMatrix, AnnotationMatrix colAnnMatrix) {
processLine();
for (int i = 0; i < heatmapLayers.length; i++) {
Double value = DoubleTranslator.get().stringToValue(currentFields[i]);
if (value == null && !(currentFields[i].equals("") || currentFields[i].equals("-")) ) {
value = factorize(heatmapLayers[i],currentFields[i]);
}
matrix.set(heatmapLayers[i], value, currentRowId, currentColId);
}
if (hasRowAnnotation()) {
for (int i = 0; i < rowAnnFields.length; i++) {
rowAnnMatrix.setAnnotation(currentRowId, rowAnnFieldNames[i], rowAnnFields[i]);
}
}
if (hasColAnnotation()) {
for (int i = 0; i < colAnnFields.length; i++) {
rowAnnMatrix.setAnnotation(currentColId, colAnnFieldNames[i], colAnnFields[i]);
}
}
}
private Double factorize(MatrixLayer heatmapLayer, String value) {
Map<String, Integer> layerFactorMap;
if (!factorMap.containsKey(heatmapLayer)) {
layerFactorMap = new HashMap<>();
factorMap.put(heatmapLayer, layerFactorMap);
}
layerFactorMap = factorMap.get(heatmapLayer);
if (layerFactorMap.containsKey(value)) {
return (double) layerFactorMap.get(value);
} else {
int newFactor = layerFactorMap.values().size() + 1;
layerFactorMap.put(value, newFactor);
return (double) newFactor;
}
}
@Override
public String[] getHeatmapHeaders() {
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 getDataFields(headers);
}
@Override
public void update() {
this.profile = (TableReaderProfile) reader.getReaderProfile();
this.heatmapLayers = createHeatmapLayers();
this.updateAnnotationNames();
}
@Override
public boolean hasColAnnotation() {
return profile.getColumnAnnotationColumns().length > 0;
}
@Override
public boolean hasRowAnnotation() {
return profile.getRowAnnotationColumns().length > 0;
}
@Override
public void updateAnnotationNames() {
List<FileHeader> fileHeaders = reader.getFileHeaders();
if (hasRowAnnotation()) {
int[] idx = profile.getRowAnnotationColumns();
this.rowAnnFieldNames = new String[idx.length];
for (int i = 0; i < idx.length; i++) {
rowAnnFieldNames[i] = fileHeaders.get(i).toString();
}
}
if (hasColAnnotation()) {
int[] idx = profile.getColumnAnnotationColumns();
this.colAnnFieldNames = new String[idx.length];
for (int i = 0; i < idx.length; i++) {
colAnnFieldNames[i] = fileHeaders.get(i).toString();
}
}
}
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;
}
private void processLine() {
String[] currentLine = reader.getCurrentLine();
this.currentColId = getColId(currentLine);
this.currentRowId = getRowId(currentLine);
this.currentFields = getDataFields(currentLine);
this.rowAnnFields = getFields(currentLine, profile.getRowAnnotationColumns());
this.colAnnFields = getFields(currentLine, profile.getColumnAnnotationColumns());
}
public String[] getDataFields(String[] fields) {
int[] dataColumns = profile.getValueColumns();
String[] data = new String[dataColumns.length];
for (int i = 0; i < dataColumns.length; i++) {
data[i] = fields[dataColumns[i]];
}
return data;
}
private String[] getFields(String[] fields, int[] dataColumns) {
String[] data = new String[dataColumns.length];
for (int i = 0; i < dataColumns.length; i++) {
data[i] = fields[dataColumns[i]];
}
return data;
}
public String getColId(String[] fields) {
return composeId(fields, profile.getHeatmapColumnsIds());
}
public String getRowId(String[] fields) {
return composeId(fields, profile.getHeatmapRowsIds());
}
private String composeId(String[] fields, int[] indices) {
StringBuilder id = new StringBuilder("");
for (int i = 0; i < indices.length; i++) {
if (!id.toString().equals("")) {
id.append(profile.getFieldGlue());
}
id.append(fields[indices[i]]);
}
return id.toString();
}
public Map<IMatrixLayer, Map<String, Integer>> getFactorMap() {
return factorMap;
}
}