/*
* Copyright (C) 2011 Brockmann Consult GmbH (info@brockmann-consult.de)
*
* 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/
*/
package org.esa.snap.rcp.statistics;
import org.esa.snap.core.datamodel.Mask;
import org.esa.snap.core.datamodel.Product;
import org.esa.snap.core.util.io.FileUtils;
import org.esa.snap.core.util.io.SnapFileFilter;
import org.esa.snap.rcp.SnapApp;
import org.esa.snap.rcp.util.Dialogs;
import org.esa.snap.statistics.output.CsvStatisticsWriter;
import org.esa.snap.statistics.output.MetadataWriter;
import org.esa.snap.statistics.output.StatisticsOutputContext;
import org.esa.snap.ui.SnapFileChooser;
import javax.media.jai.Histogram;
import javax.swing.AbstractAction;
import javax.swing.JFileChooser;
import javax.swing.JOptionPane;
import java.awt.event.ActionEvent;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintStream;
import java.util.HashMap;
import java.util.Map;
/**
* @author Thomas Storm
*/
class ExportStatisticsAsCsvAction extends AbstractAction {
private static final String PROPERTY_KEY_EXPORT_DIR = "user.statistics.export.dir";
private Mask[] selectedMasks;
private final StatisticsDataProvider dataProvider;
public ExportStatisticsAsCsvAction(StatisticsDataProvider dataProvider) {
super("Export as CSV");
this.dataProvider = dataProvider;
}
@Override
public void actionPerformed(ActionEvent e) {
PrintStream metadataOutputStream = null;
PrintStream csvOutputStream = null;
String exportDir = SnapApp.getDefault().getPreferences().get(PROPERTY_KEY_EXPORT_DIR, null);
File baseDir = null;
if (exportDir != null) {
baseDir = new File(exportDir);
}
SnapFileChooser fileChooser = new SnapFileChooser(baseDir);
final SnapFileFilter snapFileFilter = new SnapFileFilter("CSV", new String[]{".csv", ".txt"}, "CSV files");
fileChooser.setFileFilter(snapFileFilter);
File outputAsciiFile;
int result = fileChooser.showSaveDialog(SnapApp.getDefault().getMainFrame());
if (result == JFileChooser.APPROVE_OPTION) {
outputAsciiFile = fileChooser.getSelectedFile();
SnapApp.getDefault().getPreferences().put(PROPERTY_KEY_EXPORT_DIR, outputAsciiFile.getParent());
} else {
return;
}
try {
final File metadataFile = new File(outputAsciiFile.getParent(),
FileUtils.getFilenameWithoutExtension(outputAsciiFile) + "_metadata.txt");
metadataOutputStream = new PrintStream(new FileOutputStream(metadataFile));
csvOutputStream = new PrintStream(new FileOutputStream(outputAsciiFile));
CsvStatisticsWriter csvStatisticsWriter = new CsvStatisticsWriter(csvOutputStream);
final MetadataWriter metadataWriter = new MetadataWriter(metadataOutputStream);
String[] regionIds;
if (selectedMasks != null) {
regionIds = new String[selectedMasks.length];
for (int i = 0; i < selectedMasks.length; i++) {
if (selectedMasks[i] != null) {
regionIds[i] = selectedMasks[i].getName();
} else {
regionIds[i] = "\t";
}
}
} else {
regionIds = new String[]{"full_scene"};
}
final String[] algorithmNames = {
"minimum",
"maximum",
"median",
"average",
"sigma",
"p90_threshold",
"p95_threshold",
"total"
};
final StatisticsOutputContext outputContext = StatisticsOutputContext.create(
new Product[]{dataProvider.getRasterDataNode().getProduct()}, algorithmNames, regionIds);
metadataWriter.initialiseOutput(outputContext);
csvStatisticsWriter.initialiseOutput(outputContext);
final Map<String, Number> statistics = new HashMap<>();
final Histogram[] histograms = dataProvider.getHistograms();
for (int i = 0; i < histograms.length; i++) {
final Histogram histogram = histograms[i];
statistics.put("minimum", histogram.getLowValue(0));
statistics.put("maximum", histogram.getHighValue(0));
statistics.put("median", histogram.getPTileThreshold(0.5)[0]);
statistics.put("average", histogram.getMean()[0]);
statistics.put("sigma", histogram.getStandardDeviation()[0]);
statistics.put("p90_threshold", histogram.getPTileThreshold(0.9)[0]);
statistics.put("p95_threshold", histogram.getPTileThreshold(0.95)[0]);
statistics.put("total", histogram.getTotals()[0]);
csvStatisticsWriter.addToOutput(dataProvider.getRasterDataNode().getName(), regionIds[i], statistics);
metadataWriter.addToOutput(dataProvider.getRasterDataNode().getName(), regionIds[i], statistics);
statistics.clear();
}
csvStatisticsWriter.finaliseOutput();
metadataWriter.finaliseOutput();
} catch (IOException exception) {
Dialogs.showMessage("Statistics export", "Failed to export statistics.\nAn error occurred:" +
exception.getMessage(), JOptionPane.ERROR_MESSAGE, null);
} finally {
if (metadataOutputStream != null) {
metadataOutputStream.close();
}
if (csvOutputStream != null) {
csvOutputStream.close();
}
}
// JOptionPane.showMessageDialog(VisatApp.getApp().getApplicationWindow(),
// "The statistics have successfully been exported to '" + outputAsciiFile +
// "'.",
// "Statistics export",
// JOptionPane.INFORMATION_MESSAGE);
Dialogs.showMessage("Statistics export", "The statistics have successfully been exported to '" +
outputAsciiFile + "'.", JOptionPane.INFORMATION_MESSAGE, null);
}
public void setSelectedMasks(Mask[] selectedMasks) {
this.selectedMasks = selectedMasks;
}
}