/******************************************************************************* * GenPlay, Einstein Genome Analyzer * Copyright (C) 2009, 2014 Albert Einstein College of Medicine * * 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/>. * Authors: Julien Lajugie <julien.lajugie@einstein.yu.edu> * Nicolas Fourel <nicolas.fourel@einstein.yu.edu> * Eric Bouhassira <eric.bouhassira@einstein.yu.edu> * * Website: <http://genplay.einstein.yu.edu> ******************************************************************************/ package edu.yu.einstein.genplay.gui.dialog.multiGenomeDialog.trackAction.export; import java.awt.Dimension; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.Insets; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.File; import java.util.ArrayList; import java.util.List; import javax.swing.BorderFactory; import javax.swing.ButtonGroup; import javax.swing.JButton; import javax.swing.JComboBox; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JRadioButton; import javax.swing.JTextField; import javax.swing.border.TitledBorder; import edu.yu.einstein.genplay.core.multiGenome.VCF.VCFFile.VCFFile; import edu.yu.einstein.genplay.core.multiGenome.VCF.VCFHeaderType.VCFHeaderType; import edu.yu.einstein.genplay.dataStructure.enums.CoordinateSystemType; import edu.yu.einstein.genplay.dataStructure.enums.VCFColumnName; import edu.yu.einstein.genplay.gui.dialog.multiGenomeDialog.trackAction.ExportSettings; import edu.yu.einstein.genplay.gui.dialog.multiGenomeDialog.trackAction.ExportUtils; import edu.yu.einstein.genplay.gui.dialog.multiGenomeDialog.trackAction.mainDialog.MultiGenomeTrackActionDialog; import edu.yu.einstein.genplay.gui.fileFilter.BedFilter; import edu.yu.einstein.genplay.gui.fileFilter.ExtendedFileFilter; import edu.yu.einstein.genplay.gui.track.layer.Layer; /** * @author Nicolas Fourel * @version 0.1 */ public class ExportBEDDialog extends MultiGenomeTrackActionDialog { /** Generated serial version ID */ private static final long serialVersionUID = -1321930230220361216L; private final static String DIALOG_TITLE = "Export as BED file"; private String genomeName; private JTextField jtfFile; // Text field for the path of the new VCF file private VCFHeaderType header; private CoordinateSystemType coordinateSystem; /** * Constructor of {@link ExportBEDDialog} * @param settings the export settings * @param layer the selected {@link Layer} */ public ExportBEDDialog(ExportSettings settings, Layer<?> layer) { super(settings, DIALOG_TITLE, layer); } /** * @return the panel to select a path to export the track */ private JPanel getBedPanel () { // Create the panel JPanel panel = new JPanel(); // Create the layout GridBagLayout layout = new GridBagLayout(); panel.setLayout(layout); GridBagConstraints gbc = new GridBagConstraints(); gbc.anchor = GridBagConstraints.FIRST_LINE_START; gbc.insets = new Insets(0, 0, 0, 0); gbc.weightx = 1; gbc.weighty = 0; gbc.gridx = 0; gbc.gridy = 0; // Create the title label JLabel label = new JLabel("Please select a destination file:"); // Create the text field jtfFile = new JTextField(); jtfFile.setEditable(false); // Create the button JButton button = new JButton("..."); button.setMargin(new Insets(0, 0, 0, 0)); button.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { ExtendedFileFilter[] filters = {new BedFilter()}; File file = ExportUtils.getFile(filters, false); if (file != null) { jtfFile.setText(file.getPath()); } } }); // Add components panel.add(label, gbc); gbc.gridy++; panel.add(jtfFile, gbc); gbc.gridx++; panel.add(button, gbc); return panel; } /** * @return the path of the selected BED */ public String getBEDPath () { return jtfFile.getText(); } /** * @return the coordinateSystem */ public CoordinateSystemType getCoordinateSystem() { return coordinateSystem; } @Override protected String getErrors() { String error = ""; String filePath = jtfFile.getText(); if (filePath == null) { error += "The path of the file has not been found."; } else if (filePath.isEmpty()){ error += "The path of the file has not been found."; } if (getDotValue() == null) { if (!error.isEmpty()) { error += "\n"; } error += "The defined constant for \".\" in genotype does not seem to be a valid number."; } return error; } /** * Creates the genome combo box. * @return the genome combo box */ private JComboBox getGenomeComboBox (List<String> genomeList) { // Creates the combo box JComboBox jcbGenome = new JComboBox(genomeList.toArray()); jcbGenome.setSelectedIndex(0); genomeName = jcbGenome.getSelectedItem().toString(); //Dimension int height = jcbGenome.getFontMetrics(jcbGenome.getFont()).getHeight() + 5; Dimension dimension = new Dimension(MIN_DIALOG_WIDTH - 50, height); jcbGenome.setPreferredSize(dimension); jcbGenome.setMinimumSize(dimension); jcbGenome.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent arg0) { genomeName = ((JComboBox) arg0.getSource()).getSelectedItem().toString(); } }); return jcbGenome; } /** * @return the selected genome name */ public String getGenomeName () { return genomeName; } private JPanel getGenomeSelectionPanel (List<String> genomeList) { // Create the panel JPanel panel = new JPanel(); // Create the labels JLabel genomeLabel = new JLabel("Select a genome to export:"); JLabel exportLabel = new JLabel("Select the genome coordinate system for start/stop positions:"); // Create the boxes JComboBox jcbGenome = getGenomeComboBox(genomeList); // Create the radios JRadioButton metaButton = new JRadioButton("Meta genome"); JRadioButton referenceButton = new JRadioButton("Reference genome"); JRadioButton currentButton = new JRadioButton("Current genome"); ButtonGroup group = new ButtonGroup(); group.add(metaButton); group.add(referenceButton); group.add(currentButton); currentButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent arg0) {coordinateSystem = CoordinateSystemType.CURRENT_GENOME;}}); referenceButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent arg0) {coordinateSystem = CoordinateSystemType.REFERENCE;}}); metaButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent arg0) {coordinateSystem = CoordinateSystemType.METAGENOME;}}); currentButton.setSelected(true); coordinateSystem = CoordinateSystemType.CURRENT_GENOME; // Create the layout GridBagLayout layout = new GridBagLayout(); panel.setLayout(layout); GridBagConstraints gbc = new GridBagConstraints(); gbc.anchor = GridBagConstraints.FIRST_LINE_START; gbc.insets = new Insets(0, 0, 0, 0); gbc.weightx = 1; gbc.weighty = 0; gbc.gridx = 0; // Insert the genome label gbc.gridy = 0; gbc.insets = new Insets(10, 0, 0, 0); panel.add(genomeLabel, gbc); // Insert the genome combo box gbc.gridy++; gbc.insets = new Insets(0, 10, 0, 0); panel.add(jcbGenome, gbc); // Insert the coordinate system label gbc.gridy++; gbc.insets = new Insets(10, 0, 0, 0); panel.add(exportLabel, gbc); // Insert the meta genome radio gbc.gridy++; gbc.insets = new Insets(0, 10, 0, 0); panel.add(metaButton, gbc); // Insert the reference genome radio gbc.gridy++; gbc.insets = new Insets(0, 10, 0, 0); panel.add(referenceButton, gbc); // Insert the current genome radio gbc.gridy++; gbc.insets = new Insets(0, 10, 5, 0); gbc.weighty = 1; panel.add(currentButton, gbc); return panel; } /** * @return the header */ public VCFHeaderType getHeader() { return header; } private JComboBox getIDComboBox (List<VCFHeaderType> headers) { JComboBox box = new JComboBox(headers.toArray()); box.setSelectedIndex(0); header = (VCFHeaderType) box.getSelectedItem(); box.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent arg0) { header = (VCFHeaderType)((JComboBox) arg0.getSource()).getSelectedItem(); } }); return box; } private JPanel getIDPanel (List<VCFFile> fileList) { // Create the panel JPanel panel = new JPanel(); // Create the label JLabel idLabel = new JLabel("Select the ID field to use as a score value:"); // Create the combo box JComboBox box = getIDComboBox(retrieveHeaderFields(fileList)); // Create the layout GridBagLayout layout = new GridBagLayout(); panel.setLayout(layout); GridBagConstraints gbc = new GridBagConstraints(); gbc.anchor = GridBagConstraints.FIRST_LINE_START; gbc.insets = new Insets(0, 0, 0, 0); gbc.weightx = 1; gbc.weighty = 0; gbc.gridx = 0; // Insert the genome label gbc.gridy = 0; gbc.insets = new Insets(10, 0, 0, 0); panel.add(idLabel, gbc); // Insert the header type combo box gbc.gridy++; gbc.weighty = 1; gbc.insets = new Insets(0, 10, 5, 0); panel.add(box, gbc); return panel; } @Override protected void initializeContentPanel() { // Initialize the content panel contentPanel = new JPanel(); // Create the field set effect TitledBorder titledBorder = BorderFactory.createTitledBorder("Export settings"); contentPanel.setBorder(titledBorder); // Create the layout GridBagLayout layout = new GridBagLayout(); contentPanel.setLayout(layout); GridBagConstraints gbc = new GridBagConstraints(); gbc.anchor = GridBagConstraints.FIRST_LINE_START; gbc.insets = new Insets(0, 0, 0, 0); gbc.weightx = 1; gbc.weighty = 0; gbc.gridx = 0; gbc.gridy = 0; contentPanel.add(getBedPanel(), gbc); gbc.gridy++; contentPanel.add(getGenomeSelectionPanel(settings.getGenomeNames()), gbc); gbc.gridy++; contentPanel.add(getIDPanel(settings.getFileList()), gbc); gbc.gridy++; gbc.weighty = 1; contentPanel.add(getOptionPanel(), gbc); } private List<VCFHeaderType> retrieveHeaderFields (List<VCFFile> fileList) { List<VCFHeaderType> result = new ArrayList<VCFHeaderType>(); for (VCFFile file: fileList) { List<VCFHeaderType> numberHeader = file.getHeader().getAllNumberHeader(); for (VCFHeaderType header: numberHeader) { /*if (header instanceof VCFHeaderAdvancedType) { VCFHeaderAdvancedType advancedHeader = (VCFHeaderAdvancedType) header; String number = advancedHeader.getNumber(); if (!number.equals("A") && !number.equals("G")) { int valueNumber = Integer.parseInt(number); if ((valueNumber == 1) || (valueNumber == 2)) { result.add(header); } } } else if (header.getColumnCategory() == VCFColumnName.QUAL) { result.add(header); }*/ if (!((header.getColumnCategory() == VCFColumnName.FORMAT) && header.getId().equals("PL"))) { result.add(header); } } } return result; } }