/* * Copyright 2006-2015 The MZmine 3 Development Team * * This file is part of MZmine 3. * * MZmine 3 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 2 of the * License, or (at your option) any later version. * * MZmine 3 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 MZmine 3; if not, * write to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 * USA */ package io.github.mzmine.modules.plots.msspectrum; import java.awt.BasicStroke; import java.awt.Font; import java.awt.Stroke; import java.awt.geom.Ellipse2D; import java.awt.geom.Rectangle2D; import java.io.File; import java.net.URL; import java.text.DecimalFormat; import java.util.ArrayList; import java.util.List; import java.util.Optional; import javax.annotation.Nonnull; import org.jfree.chart.JFreeChart; import org.jfree.chart.axis.NumberAxis; import org.jfree.chart.axis.ValueAxis; import org.jfree.chart.block.BlockBorder; import org.jfree.chart.labels.XYItemLabelGenerator; import org.jfree.chart.plot.DatasetRenderingOrder; import org.jfree.chart.plot.XYPlot; import org.jfree.chart.renderer.xy.AbstractXYItemRenderer; import org.jfree.chart.renderer.xy.StandardXYBarPainter; import org.jfree.chart.renderer.xy.XYBarRenderer; import org.jfree.chart.renderer.xy.XYItemRenderer; import org.jfree.chart.renderer.xy.XYLineAndShapeRenderer; import org.jfree.chart.title.LegendTitle; import org.jfree.chart.title.TextTitle; import org.jfree.data.RangeType; import org.jfree.ui.RectangleEdge; import org.jfree.ui.RectangleInsets; import com.google.common.base.Preconditions; import com.google.common.collect.Range; import io.github.msdk.datamodel.datastore.DataPointStore; import io.github.msdk.datamodel.datastore.DataPointStoreFactory; import io.github.msdk.datamodel.files.FileType; import io.github.msdk.datamodel.impl.MSDKObjectBuilder; import io.github.msdk.datamodel.msspectra.MsSpectrum; import io.github.msdk.datamodel.msspectra.MsSpectrumType; import io.github.msdk.datamodel.rawdata.IsolationInfo; import io.github.msdk.datamodel.rawdata.MsFunction; import io.github.msdk.datamodel.rawdata.MsScan; import io.github.msdk.datamodel.rawdata.RawDataFile; import io.github.msdk.io.mgf.MgfFileExportMethod; import io.github.msdk.io.msp.MspExportAlgorithm; import io.github.msdk.io.mzml.MzMLFileExportMethod; import io.github.msdk.io.txt.TxtExportAlgorithm; import io.github.msdk.io.txt.TxtImportAlgorithm; import io.github.msdk.spectra.isotopepattern.IsotopePatternGeneratorAlgorithm; import io.github.msdk.spectra.splash.SplashCalculationAlgorithm; import io.github.msdk.util.MsScanUtil; import io.github.mzmine.gui.MZmineGUI; import io.github.mzmine.main.MZmineCore; import io.github.mzmine.modules.plots.chromatogram.ChromatogramPlotModule; import io.github.mzmine.modules.plots.chromatogram.ChromatogramPlotParameters; import io.github.mzmine.modules.plots.isotopepattern.IsotopePatternPlotModule; import io.github.mzmine.modules.plots.isotopepattern.IsotopePatternPlotParameters; import io.github.mzmine.modules.plots.msspectrum.datasets.MsSpectrumDataSet; import io.github.mzmine.modules.plots.spectrumparser.SpectrumParserPlotModule; import io.github.mzmine.modules.plots.spectrumparser.SpectrumParserPlotParameters; import io.github.mzmine.parameters.ParameterSet; import io.github.mzmine.parameters.parametertypes.selectors.RawDataFilesSelection; import io.github.mzmine.parameters.parametertypes.selectors.ScanSelection; import io.github.mzmine.project.MZmineProject; import io.github.mzmine.util.JavaFXUtil; import io.github.mzmine.util.MsScanUtils; import io.github.mzmine.util.jfreechart.ChartNodeJFreeChart; import io.github.mzmine.util.jfreechart.IntelligentItemLabelGenerator; import io.github.mzmine.util.jfreechart.JFreeChartUtils; import io.github.mzmine.util.jfreechart.JFreeChartUtils.ImgFileType; import io.github.mzmine.util.jfreechart.ManualZoomDialog; import javafx.application.Platform; import javafx.beans.property.BooleanProperty; import javafx.beans.property.DoubleProperty; import javafx.beans.property.SimpleBooleanProperty; import javafx.beans.property.SimpleDoubleProperty; import javafx.collections.FXCollections; import javafx.collections.ListChangeListener.Change; import javafx.collections.ObservableList; import javafx.event.Event; import javafx.fxml.FXML; import javafx.fxml.FXMLLoader; import javafx.scene.Cursor; import javafx.scene.control.ButtonType; import javafx.scene.control.Menu; import javafx.scene.control.MenuItem; import javafx.scene.control.TextInputDialog; import javafx.scene.input.Clipboard; import javafx.scene.input.ClipboardContent; import javafx.scene.input.ContextMenuEvent; import javafx.scene.input.KeyCode; import javafx.scene.input.KeyEvent; import javafx.scene.layout.BorderPane; import javafx.scene.paint.Color; import javafx.stage.FileChooser; import javafx.stage.FileChooser.ExtensionFilter; import javafx.stage.Modality; import javafx.stage.Stage; import javafx.stage.Window; /** * MS spectrum plot window */ public class MsSpectrumPlotWindowController { // Colors private static final Color gridColor = Color.rgb(220, 220, 220, 0.5); private static final Color labelsColor = Color.BLACK; private static final Color backgroundColor = Color.WHITE; private static final Color[] plotColors = {Color.rgb(0, 0, 192), // blue Color.rgb(192, 0, 0), // red Color.rgb(0, 192, 0), // green Color.MAGENTA, Color.CYAN, Color.ORANGE}; private static final Font titleFont = new Font("SansSerif", Font.BOLD, 12); private static final String LAYERS_DIALOG_FXML = "MsSpectrumLayersDialog.fxml"; private final ObservableList<MsSpectrumDataSet> datasets = FXCollections.observableArrayList(); private int numberOfDataSets = 0; private final DoubleProperty mzShift = new SimpleDoubleProperty(this, "mzShift", 0.0); private final BooleanProperty itemLabelsVisible = new SimpleBooleanProperty(this, "itemLabelsVisible", true); private final BooleanProperty legendVisible = new SimpleBooleanProperty(this, "legendVisible", true); private File lastSaveDirectory; private TextTitle chartTitle, chartSubTitle; @FXML private BorderPane chartPane; @FXML private ChartNodeJFreeChart chartNode; @FXML private MenuItem setToMenuItem, showXICMenuItem; @FXML private Menu findMSMSMenu, removeDatasetMenu; public void initialize() { final JFreeChart chart = chartNode.getChart(); final XYPlot plot = chart.getXYPlot(); // Do not set colors and strokes dynamically. They are instead provided // by the dataset and configured in configureRenderer() plot.setDrawingSupplier(null); plot.setDomainGridlinePaint(JavaFXUtil.convertColorToAWT(gridColor)); plot.setRangeGridlinePaint(JavaFXUtil.convertColorToAWT(gridColor)); plot.setBackgroundPaint(JavaFXUtil.convertColorToAWT(backgroundColor)); plot.setAxisOffset(new RectangleInsets(5.0, 5.0, 5.0, 5.0)); plot.setDatasetRenderingOrder(DatasetRenderingOrder.FORWARD); plot.setDomainCrosshairVisible(false); plot.setRangeCrosshairVisible(false); // chart properties chart.setBackgroundPaint(JavaFXUtil.convertColorToAWT(backgroundColor)); // legend properties LegendTitle legend = chart.getLegend(); // legend.setItemFont(legendFont); legend.setFrame(BlockBorder.NONE); // set the X axis (m/z) properties NumberAxis xAxis = (NumberAxis) plot.getDomainAxis(); xAxis.setLabel("m/z"); xAxis.setUpperMargin(0.03); xAxis.setLowerMargin(0.03); xAxis.setRangeType(RangeType.POSITIVE); xAxis.setTickLabelInsets(new RectangleInsets(0, 0, 20, 20)); // set the Y axis (intensity) properties NumberAxis yAxis = (NumberAxis) plot.getRangeAxis(); yAxis.setLabel("Intensity"); yAxis.setRangeType(RangeType.POSITIVE); yAxis.setAutoRangeIncludesZero(true); // set the fixed number formats, because otherwise JFreeChart sometimes // shows exponent, sometimes it doesn't DecimalFormat mzFormat = MZmineCore.getConfiguration().getMZFormat(); xAxis.setNumberFormatOverride(mzFormat); DecimalFormat intensityFormat = MZmineCore.getConfiguration().getIntensityFormat(); yAxis.setNumberFormatOverride(intensityFormat); chartTitle = chartNode.getChart().getTitle(); chartTitle.setMargin(5, 0, 0, 0); chartTitle.setFont(titleFont); chartNode.setCursor(Cursor.CROSSHAIR); // Remove the dataset if it is removed from the list datasets.addListener((Change<? extends MsSpectrumDataSet> c) -> { while (c.next()) { if (c.wasRemoved()) { for (MsSpectrumDataSet ds : c.getRemoved()) { int index = plot.indexOf(ds); plot.setDataset(index, null); } } } }); itemLabelsVisible.addListener((prop, oldVal, newVal) -> { for (MsSpectrumDataSet dataset : datasets) { int datasetIndex = plot.indexOf(dataset); XYItemRenderer renderer = plot.getRenderer(datasetIndex); renderer.setBaseItemLabelsVisible(newVal); } }); legendVisible.addListener((prop, oldVal, newVal) -> { legend.setVisible(newVal); }); } /** * Add a new spectrum to the plot. * * @param spectrum */ public void addSpectrum(@Nonnull MsSpectrum spectrum, @Nonnull String name) { Preconditions.checkNotNull(spectrum); if (!Platform.isFxApplicationThread()) { throw new IllegalStateException( "Not on FX application thread; currentThread = " + Thread.currentThread().getName()); } MsSpectrumDataSet newDataSet = new MsSpectrumDataSet(spectrum, name); newDataSet.mzShiftProperty().bind(mzShift); datasets.add(newDataSet); final int datasetIndex = numberOfDataSets; numberOfDataSets++; final XYPlot plot = chartNode.getChart().getXYPlot(); final Color newColor = plotColors[datasetIndex % plotColors.length]; newDataSet.setColor(newColor); configureRenderer(newDataSet, datasetIndex); newDataSet.renderingTypeProperty().addListener(e -> { Platform.runLater(() -> configureRenderer(newDataSet, datasetIndex)); }); newDataSet.colorProperty().addListener(e -> { Platform.runLater(() -> configureRenderer(newDataSet, datasetIndex)); }); newDataSet.lineThicknessProperty().addListener(e -> { Platform.runLater(() -> configureRenderer(newDataSet, datasetIndex)); }); newDataSet.showDataPointsProperty().addListener(e -> { Platform.runLater(() -> configureRenderer(newDataSet, datasetIndex)); }); // Once everything is configured, add the dataset to the plot plot.setDataset(datasetIndex, newDataSet); } private void configureRenderer(MsSpectrumDataSet dataset, int datasetIndex) { final MsSpectrumType renderingType = dataset.getRenderingType(); final XYPlot plot = chartNode.getChart().getXYPlot(); // Set renderer AbstractXYItemRenderer newRenderer; switch (renderingType) { case PROFILE: case THRESHOLDED: XYLineAndShapeRenderer newLineRenderer = new XYLineAndShapeRenderer(); final int lineThickness = dataset.getLineThickness(); newLineRenderer.setBaseShape(new Ellipse2D.Double(-2 * lineThickness, -2 * lineThickness, 4 * lineThickness + 1, 4 * lineThickness + 1)); newLineRenderer.setBaseShapesFilled(true); newLineRenderer.setBaseShapesVisible(dataset.getShowDataPoints()); newLineRenderer.setDrawOutlines(false); Stroke baseStroke = new BasicStroke(lineThickness); newLineRenderer.setBaseStroke(baseStroke); newRenderer = newLineRenderer; break; case CENTROIDED: default: XYBarRenderer newBarRenderer = new XYBarRenderer(); // Avoid gradients newBarRenderer.setBarPainter(new StandardXYBarPainter()); newBarRenderer.setShadowVisible(false); newRenderer = newBarRenderer; break; } // Set tooltips for legend newRenderer.setLegendItemToolTipGenerator((ds, series) -> { if (ds instanceof MsSpectrumDataSet) { return ((MsSpectrumDataSet) ds).getDescription(); } else return null; }); // Set color Color baseColor = dataset.getColor(); newRenderer.setBasePaint(JavaFXUtil.convertColorToAWT(baseColor)); // Set label generator XYItemLabelGenerator intelligentLabelGenerator = new IntelligentItemLabelGenerator(chartNode, 100, dataset); newRenderer.setBaseItemLabelGenerator(intelligentLabelGenerator); newRenderer.setBaseItemLabelPaint(JavaFXUtil.convertColorToAWT(labelsColor)); newRenderer.setBaseItemLabelsVisible(itemLabelsVisible.get()); // Set tooltip generator newRenderer.setBaseToolTipGenerator(dataset); plot.setRenderer(datasetIndex, newRenderer); } public void handleAddScan(Event e) { ParameterSet parameters = MZmineCore.getConfiguration().getModuleParameters(MsSpectrumPlotModule.class); ButtonType exitCode = parameters.showSetupDialog("Add scan"); if (exitCode != ButtonType.OK) return; final RawDataFilesSelection fileSelection = parameters.getParameter(MsSpectrumPlotParameters.inputFiles).getValue(); final Integer scanNumber = parameters.getParameter(MsSpectrumPlotParameters.scanNumber).getValue(); final ScanSelection scanSelection = new ScanSelection(Range.singleton(scanNumber), null, null, null, null, null); final List<RawDataFile> dataFiles = fileSelection.getMatchingRawDataFiles(); boolean spectrumAdded = false; for (RawDataFile dataFile : dataFiles) { for (MsScan scan : scanSelection.getMatchingScans(dataFile)) { String title = MsScanUtils.createSingleLineMsScanDescription(scan); addSpectrum(scan, title); spectrumAdded = true; } } if (!spectrumAdded) { MZmineGUI.displayMessage("Scan not found"); } } public void handleAddSpectrumFromText(Event e) { ParameterSet parameters = MZmineCore.getConfiguration().getModuleParameters(SpectrumParserPlotModule.class); ButtonType exitCode = parameters.showSetupDialog("Parse spectrum"); if (exitCode != ButtonType.OK) return; final String spectrumText = parameters.getParameter(SpectrumParserPlotParameters.spectrumText).getValue(); final MsSpectrumType spectrumType = parameters.getParameter(SpectrumParserPlotParameters.spectrumType).getValue(); Preconditions.checkNotNull(spectrumText); Preconditions.checkNotNull(spectrumType); final MsSpectrum spectrum = TxtImportAlgorithm.parseMsSpectrum(spectrumText); spectrum.setSpectrumType(spectrumType); String spectrumName = "Manual spectrum"; addSpectrum(spectrum, spectrumName); } public void handleAddIsotopePattern(Event e) { ParameterSet parameters = MZmineCore.getConfiguration().getModuleParameters(IsotopePatternPlotModule.class); ButtonType exitCode = parameters.showSetupDialog("Add isotope pattern"); if (exitCode != ButtonType.OK) return; final String formula = parameters.getParameter(IsotopePatternPlotParameters.formula).getValue(); final Double mzTolerance = parameters.getParameter(IsotopePatternPlotParameters.mzTolerance).getValue(); final Double minAbundance = parameters.getParameter(IsotopePatternPlotParameters.minAbundance).getValue(); final Double normalizedIntensity = parameters.getParameter(IsotopePatternPlotParameters.normalizedIntensity).getValue(); final MsSpectrum pattern = IsotopePatternGeneratorAlgorithm.generateIsotopes(formula, minAbundance, normalizedIntensity.floatValue(), mzTolerance); addSpectrum(pattern, formula); } public void handlePreviousScan(Event e) { for (MsSpectrumDataSet dataset : datasets) { MsSpectrum spectrum = dataset.getSpectrum(); if (!(spectrum instanceof MsScan)) continue; MsScan scan = (MsScan) spectrum; RawDataFile rawFile = scan.getRawDataFile(); if (rawFile == null) return; int scanIndex = rawFile.getScans().indexOf(scan); if (scanIndex <= 0) return; MsScan prevScan = rawFile.getScans().get(scanIndex - 1); String title = MsScanUtils.createSingleLineMsScanDescription(prevScan); dataset.setSpectrum(prevScan, title); } } public void handleNextScan(Event e) { for (MsSpectrumDataSet dataset : datasets) { MsSpectrum spectrum = dataset.getSpectrum(); if (!(spectrum instanceof MsScan)) continue; MsScan scan = (MsScan) spectrum; RawDataFile rawFile = scan.getRawDataFile(); if (rawFile == null) return; int scanIndex = rawFile.getScans().indexOf(scan); if (scanIndex == rawFile.getScans().size() - 1) return; MsScan nextScan = rawFile.getScans().get(scanIndex + 1); String title = MsScanUtils.createSingleLineMsScanDescription(nextScan); dataset.setSpectrum(nextScan, title); } } public void handleChartKeyPressed(KeyEvent e) { final KeyCode key = e.getCode(); switch (key) { case RIGHT: handleNextScan(e); e.consume(); break; case LEFT: handlePreviousScan(e); e.consume(); break; case F: handleZoomOut(e); e.consume(); break; case M: handleManualZoom(e); e.consume(); break; case S: handleSetupLayers(e); e.consume(); break; default: } } public void handleChartMousePressed(Event e) { chartNode.requestFocus(); } public void handleSetupLayers(Event event) { try { URL layersDialogFXML = getClass().getResource(LAYERS_DIALOG_FXML); FXMLLoader loader = new FXMLLoader(layersDialogFXML); Stage layersDialog = loader.load(); MsSpectrumLayersDialogController controller = loader.getController(); controller.configure(datasets, this); layersDialog.initModality(Modality.APPLICATION_MODAL); layersDialog.show(); } catch (Exception e) { e.printStackTrace(); } } public void handleToggleLabels(Event event) { itemLabelsVisible.set(!itemLabelsVisible.get()); } public void handleToggleLegend(Event event) { legendVisible.set(!legendVisible.get()); } public void handleContextMenuShowing(ContextMenuEvent event) { // Calculate the m/z value of the clicked point final double clickedX = event.getX(); XYPlot plot = chartNode.getChart().getXYPlot(); Rectangle2D chartArea = chartNode.getRenderingInfo().getPlotInfo().getDataArea(); RectangleEdge axisEdge = plot.getDomainAxisEdge(); ValueAxis domainAxis = plot.getDomainAxis(); final double clickedMz = domainAxis.java2DToValue(clickedX, chartArea, axisEdge); final double clickedMzWithShift = Math.abs(clickedMz - mzShift.get()); // Update the m/z shift menu item DecimalFormat mzFormat = MZmineCore.getConfiguration().getMZFormat(); setToMenuItem.setText("Set to " + mzFormat.format(clickedMz) + " m/z"); setToMenuItem.setUserData(clickedMz); // Update the Show XIC menu item showXICMenuItem.setText("Show XIC of " + mzFormat.format(clickedMzWithShift) + " m/z"); showXICMenuItem.setUserData(clickedMzWithShift); // Update the MS/MS menu findMSMSMenu.setText("Find MS/MS of " + mzFormat.format(clickedMzWithShift) + " m/z"); final ObservableList<MenuItem> msmsItems = findMSMSMenu.getItems(); msmsItems.clear(); MZmineProject project = MZmineCore.getCurrentProject(); for (RawDataFile file : project.getRawDataFiles()) { scans: for (MsScan scan : file.getScans()) { if (scan.getMsFunction().getMsLevel() == 1) continue; for (IsolationInfo isolation : scan.getIsolations()) { if (!isolation.getIsolationMzRange().contains(clickedMzWithShift)) continue; String menuLabel = MsScanUtils.createSingleLineMsScanDescription(scan, isolation); MenuItem msmsItem = new MenuItem(menuLabel); msmsItem.setOnAction(e -> MsSpectrumPlotModule.showNewSpectrumWindow(scan)); msmsItems.add(msmsItem); continue scans; } } } if (msmsItems.isEmpty()) { MenuItem noneItem = new MenuItem("None"); noneItem.setDisable(true); msmsItems.add(noneItem); } // Update the Remove... menu final ObservableList<MenuItem> rmItems = removeDatasetMenu.getItems(); rmItems.clear(); for (MsSpectrumDataSet dataset : datasets) { MenuItem msmsItem = new MenuItem(dataset.getName()); msmsItem.setOnAction(e -> datasets.remove(dataset)); rmItems.add(msmsItem); } removeDatasetMenu.setDisable(rmItems.isEmpty()); } public void handleShowXIC(Event event) { Double xicMz = (Double) showXICMenuItem.getUserData(); if (xicMz == null) return; // Collect all displayed raw data files List<RawDataFile> rawDataFiles = new ArrayList<>(); for (MsSpectrumDataSet dataset : datasets) { if (dataset.getSpectrum() instanceof MsScan) { MsScan scan = (MsScan) dataset.getSpectrum(); RawDataFile rawFile = scan.getRawDataFile(); if (rawFile != null) rawDataFiles.add(rawFile); } } ParameterSet chromatogramParams = MZmineCore.getConfiguration().getModuleParameters(ChromatogramPlotModule.class); chromatogramParams.getParameter(ChromatogramPlotParameters.mzRange) .setValue(Range.closed(xicMz - 0.005, xicMz + 0.005)); if (!rawDataFiles.isEmpty()) { chromatogramParams.getParameter(ChromatogramPlotParameters.inputFiles) .setValue(new RawDataFilesSelection(rawDataFiles)); } chromatogramParams.showSetupDialog("Show XIC"); } public void handleSetMzShiftTo(Event event) { Double newMzShift = (Double) setToMenuItem.getUserData(); if (newMzShift == null) return; mzShift.set(newMzShift); } public void handleSetMzShiftManually(Event event) { DecimalFormat mzFormat = MZmineCore.getConfiguration().getMZFormat(); String newMzShiftString = "0.0"; Double newMzShift = (Double) setToMenuItem.getUserData(); if (newMzShift != null) newMzShiftString = mzFormat.format(newMzShift); TextInputDialog dialog = new TextInputDialog(newMzShiftString); dialog.setTitle("m/z shift"); dialog.setHeaderText("Set m/z shift value"); Optional<String> result = dialog.showAndWait(); result.ifPresent(value -> { try { double newValue = Double.parseDouble(value); mzShift.set(newValue); } catch (Exception e) { e.printStackTrace(); } }); } public void handleResetMzShift(Event event) { mzShift.set(0.0); } public void handlePrint(Event event) { JFreeChartUtils.printChart(chartNode); } public void handleNormalizeIntensityScale(Event event) { for (MsSpectrumDataSet dataset : datasets) { dataset.setIntensityScale(100.0); } } public void handleResetIntensityScale(Event event) { for (MsSpectrumDataSet dataset : datasets) { dataset.resetIntensityScale(); } } public void handleZoomOut(Event event) { XYPlot plot = chartNode.getChart().getXYPlot(); plot.getDomainAxis().setAutoRange(true); plot.getRangeAxis().setAutoRange(true); } public void handleManualZoom(Event event) { XYPlot plot = chartNode.getChart().getXYPlot(); Window parent = chartNode.getScene().getWindow(); ManualZoomDialog dialog = new ManualZoomDialog(parent, plot); dialog.show(); } public void handleCopyImage(Event event) { JFreeChartUtils.exportToClipboard(chartNode); } public void handleExportJPG(Event event) { JFreeChartUtils.showSaveDialog(chartNode, ImgFileType.JPG); } public void handleExportPNG(Event event) { JFreeChartUtils.showSaveDialog(chartNode, ImgFileType.PNG); } public void handleExportPDF(Event event) { JFreeChartUtils.showSaveDialog(chartNode, ImgFileType.PDF); } public void handleExportSVG(Event event) { JFreeChartUtils.showSaveDialog(chartNode, ImgFileType.SVG); } public void handleExportEMF(Event event) { JFreeChartUtils.showSaveDialog(chartNode, ImgFileType.EMF); } public void handleExportEPS(Event event) { JFreeChartUtils.showSaveDialog(chartNode, ImgFileType.EPS); } public void handleCopySpectra(Event event) { StringBuilder sb = new StringBuilder(); for (MsSpectrumDataSet dataset : datasets) { MsSpectrum spectrum = dataset.getSpectrum(); String spectrumString = TxtExportAlgorithm.spectrumToString(spectrum); String splash = SplashCalculationAlgorithm.calculateSplash(spectrum); sb.append("# "); sb.append(dataset.getName()); sb.append("\n"); sb.append("# SPLASH ID: "); sb.append(splash); sb.append("\n"); sb.append(spectrumString); sb.append("\n"); } final Clipboard clipboard = Clipboard.getSystemClipboard(); final ClipboardContent content = new ClipboardContent(); content.putString(sb.toString()); clipboard.setContent(content); } public void handleCopySplash(Event event) { StringBuilder sb = new StringBuilder(); for (MsSpectrumDataSet dataset : datasets) { MsSpectrum spectrum = dataset.getSpectrum(); String splash = SplashCalculationAlgorithm.calculateSplash(spectrum); sb.append(dataset.getName()); sb.append(" SPLASH ID: "); sb.append(splash); sb.append("\n"); } final Clipboard clipboard = Clipboard.getSystemClipboard(); final ClipboardContent content = new ClipboardContent(); content.putString(sb.toString()); clipboard.setContent(content); } public void handleExportMzML(Event event) { FileChooser fileChooser = new FileChooser(); fileChooser.setTitle("Export to mzML"); fileChooser.getExtensionFilters().add(new ExtensionFilter("mzML", "*.mzML")); // Remember last directory if (lastSaveDirectory != null && lastSaveDirectory.isDirectory()) fileChooser.setInitialDirectory(lastSaveDirectory); // Show the file chooser File file = fileChooser.showSaveDialog(chartNode.getScene().getWindow()); // If nothing was chosen, quit if (file == null) return; // Save the last open directory lastSaveDirectory = file.getParentFile(); final List<MsSpectrum> spectra = new ArrayList<>(); for (MsSpectrumDataSet dataset : datasets) { spectra.add(dataset.getSpectrum()); } // Do the export in a new thread final File finalFile = file; new Thread(() -> { try { // Create a temporary raw data file DataPointStore tmpStore = DataPointStoreFactory.getMemoryDataStore(); RawDataFile tmpRawFile = MSDKObjectBuilder.getRawDataFile("Exported spectra", null, FileType.UNKNOWN, tmpStore); int scanNum = 1; for (MsSpectrumDataSet dataset : datasets) { MsSpectrum spectrum = dataset.getSpectrum(); MsScan newScan; if (spectrum instanceof MsScan) { newScan = MsScanUtil.clone(tmpStore, (MsScan) spectrum, true); } else { MsFunction msf = MSDKObjectBuilder.getMsFunction(MsFunction.DEFAULT_MS_FUNCTION_NAME); newScan = MSDKObjectBuilder.getMsScan(tmpStore, scanNum, msf); } tmpRawFile.addScan(newScan); } MzMLFileExportMethod exporter = new MzMLFileExportMethod(tmpRawFile, finalFile); exporter.execute(); tmpRawFile.dispose(); } catch (Exception e) { MZmineGUI.displayMessage("Unable to export: " + e.getMessage()); e.printStackTrace(); } }).start(); } public void handleExportMGF(Event event) { FileChooser fileChooser = new FileChooser(); fileChooser.setTitle("Export to MGF"); fileChooser.getExtensionFilters() .add(new FileChooser.ExtensionFilter("Mascot Generic Format", "*.mgf")); // Remember last directory if (lastSaveDirectory != null && lastSaveDirectory.isDirectory()) fileChooser.setInitialDirectory(lastSaveDirectory); // Show the file chooser File file = fileChooser.showSaveDialog(chartNode.getScene().getWindow()); // If nothing was chosen, quit if (file == null) return; // Save the last open directory lastSaveDirectory = file.getParentFile(); final List<MsSpectrum> spectra = new ArrayList<>(); for (MsSpectrumDataSet dataset : datasets) { spectra.add(dataset.getSpectrum()); } // Do the export in a new thread final File finalFile = file; new Thread(() -> { try { MgfFileExportMethod mgfEx = new MgfFileExportMethod(spectra, finalFile); mgfEx.execute(); } catch (Exception e) { MZmineGUI.displayMessage("Unable to export: " + e.getMessage()); e.printStackTrace(); } }).start(); } public void handleExportMSP(Event event) { FileChooser fileChooser = new FileChooser(); fileChooser.setTitle("Export to MSP"); fileChooser.getExtensionFilters().add(new ExtensionFilter("NIST MSP format", "*.msp")); // Remember last directory if (lastSaveDirectory != null && lastSaveDirectory.isDirectory()) fileChooser.setInitialDirectory(lastSaveDirectory); // Show the file chooser File file = fileChooser.showSaveDialog(chartNode.getScene().getWindow()); // If nothing was chosen, quit if (file == null) return; // Save the last open directory lastSaveDirectory = file.getParentFile(); final List<MsSpectrum> spectra = new ArrayList<>(); for (MsSpectrumDataSet dataset : datasets) { spectra.add(dataset.getSpectrum()); } // Do the export in a new thread final File finalFile = file; new Thread(() -> { try { MspExportAlgorithm.exportSpectra(finalFile, spectra); } catch (Exception e) { MZmineGUI.displayMessage("Unable to export: " + e.getMessage()); e.printStackTrace(); } }).start(); } public void handleExportTXT(Event event) { FileChooser fileChooser = new FileChooser(); fileChooser.setTitle("Export to TXT"); fileChooser.getExtensionFilters().add(new ExtensionFilter("TXT", "*.txt")); // Remember last directory if (lastSaveDirectory != null && lastSaveDirectory.isDirectory()) fileChooser.setInitialDirectory(lastSaveDirectory); // Show the file chooser File file = fileChooser.showSaveDialog(chartNode.getScene().getWindow()); // If nothing was chosen, quit if (file == null) return; // Save the last open directory lastSaveDirectory = file.getParentFile(); final List<MsSpectrum> spectra = new ArrayList<>(); for (MsSpectrumDataSet dataset : datasets) { spectra.add(dataset.getSpectrum()); } // Do the export in a new thread final File finalFile = file; new Thread(() -> { try { TxtExportAlgorithm.exportSpectra(finalFile, spectra); } catch (Exception e) { MZmineGUI.displayMessage("Unable to export: " + e.getMessage()); e.printStackTrace(); } }).start(); } }