/* * Copyright 2004-2010 Information & Software Engineering Group (188/1) * Institute of Software Technology and Interactive Systems * Vienna University of Technology, Austria * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.ifs.tuwien.ac.at/dm/somtoolbox/license.html * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package at.tuwien.ifs.somtoolbox.apps; import java.awt.image.BufferedImage; import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.HashMap; import javax.imageio.ImageIO; import org.apache.commons.lang.ArrayUtils; import com.martiansoftware.jsap.JSAPResult; import com.martiansoftware.jsap.Parameter; import at.tuwien.ifs.somtoolbox.SOMToolboxException; import at.tuwien.ifs.somtoolbox.apps.config.OptionFactory; import at.tuwien.ifs.somtoolbox.apps.viewer.CommonSOMViewerStateData; import at.tuwien.ifs.somtoolbox.data.SharedSOMVisualisationData; import at.tuwien.ifs.somtoolbox.input.SOMLibFileFormatException; import at.tuwien.ifs.somtoolbox.input.SOMLibFormatInputReader; import at.tuwien.ifs.somtoolbox.layers.GrowingLayer; import at.tuwien.ifs.somtoolbox.models.GrowingSOM; import at.tuwien.ifs.somtoolbox.util.FileUtils; import at.tuwien.ifs.somtoolbox.util.VisualisationUtils; import at.tuwien.ifs.somtoolbox.visualization.BackgroundImageVisualizer; import at.tuwien.ifs.somtoolbox.visualization.BackgroundImageVisualizerInstance; import at.tuwien.ifs.somtoolbox.visualization.Palettes; import at.tuwien.ifs.somtoolbox.visualization.Visualizations; /** * Save Visualisations of a map to an image file. * * @author Jakob Frank * @author Rudolf Mayer * @version $Id: VisualisationImageSaver.java 3666 2010-07-15 08:59:32Z frank $ */ public class VisualisationImageSaver implements SOMToolboxApp { public static final Parameter[] OPTIONS = { OptionFactory.getOptUnitDescriptionFile(true), OptionFactory.getOptWeightVectorFile(true), OptionFactory.getOptInputVectorFile(false), OptionFactory.getOptTemplateVectorFile(false), OptionFactory.getOptDataWinnerMappingFile(false), OptionFactory.getOptClassInformationFile(false), OptionFactory.getOptBaseName(false), OptionFactory.getOptWidth(false), OptionFactory.getOptHeight(false), OptionFactory.getOptImageFileType(false), OptionFactory.getOptDrawUnitGrid(false), OptionFactory.getOptVisualisations(false) }; public static final String DESCRIPTION = "Save Visualisations of a map as images to a file."; public static final String LONG_DESCRIPTION = "Provides a batch mode to save several/all visualisations of a map to image files."; public static final Type APPLICATION_TYPE = Type.Utils; public static void main(String[] args) { JSAPResult res = OptionFactory.parseResults(args, OPTIONS); String uFile = res.getString("unitDescriptionFile"); String wFile = res.getString("weightVectorFile"); String dwmFile = res.getString("dataWinnerMappingFile"); String cFile = res.getString("classInformationFile"); String vFile = res.getString("inputVectorFile"); String tFile = res.getString("templateVectorFile"); String ftype = res.getString("filetype"); boolean unitGrid = res.getBoolean("unitGrid"); String basename = res.getString("basename"); if (basename == null) { basename = FileUtils.extractSOMLibInputPrefix(uFile); } basename = new File(basename).getAbsolutePath(); int unitW = res.getInt("width"); int unitH = res.getInt("height", unitW); String[] vizs = res.getStringArray("vis"); GrowingSOM gsom = null; CommonSOMViewerStateData state = CommonSOMViewerStateData.getInstance(); try { SOMLibFormatInputReader inputReader = new SOMLibFormatInputReader(wFile, uFile, null); gsom = new GrowingSOM(inputReader); SharedSOMVisualisationData d = new SharedSOMVisualisationData(cFile, null, null, dwmFile, vFile, tFile, null); d.readAvailableData(); state.inputDataObjects = d; gsom.setSharedInputObjects(d); Visualizations.initVisualizations(d, inputReader, 0, Palettes.getDefaultPalette(), Palettes.getAvailablePalettes()); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); System.exit(1); } catch (SOMLibFileFormatException e) { // TODO Auto-generated catch block e.printStackTrace(); System.exit(1); } if (ArrayUtils.isEmpty(vizs)) { System.out.println("No specific visualisation specified - saving all available visualisations."); vizs = Visualizations.getReadyVisualizationNames(); System.out.println("Found " + vizs.length + ": " + Arrays.toString(vizs)); } for (String viz : vizs) { BackgroundImageVisualizerInstance v = Visualizations.getVisualizationByName(viz); if (v == null) { System.out.println("Visualization '" + viz + "' not found!"); continue; } BackgroundImageVisualizer i = v.getVis(); GrowingLayer layer = gsom.getLayer(); try { int height = unitH * layer.getYSize(); int width = unitW * layer.getXSize(); HashMap<String, BufferedImage> visualizationFlavours = i.getVisualizationFlavours(v.getVariant(), gsom, width, height); ArrayList<String> keys = new ArrayList<String>(visualizationFlavours.keySet()); Collections.sort(keys); // if the visualisation has more than 5 flavours, we create a sub-dir for it String subDirName = ""; String oldBasename = basename; // save original base name for later if (keys.size() > 5) { String parentDir = new File(basename).getParentFile().getPath(); // get the parent path String filePrefix = basename.substring(parentDir.length()); // end the file name prefix subDirName = parentDir + File.separator + filePrefix + "_" + viz + File.separator; // compose a new // subdir name new File(subDirName).mkdir(); // create the dir basename = subDirName + filePrefix; // and extend the base name by the subdir } for (String key : keys) { File out = new File(basename + "_" + viz + key + "." + ftype); System.out.println("Generating visualisation '" + viz + "' as '" + out.getPath() + "'."); BufferedImage image = visualizationFlavours.get(key); if (unitGrid) { VisualisationUtils.drawUnitGrid(image, gsom, width, height); } ImageIO.write(image, ftype, out); } basename = oldBasename; // reset base name } catch (SOMToolboxException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } System.exit(0); } }