/******************************************************************************* * 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.newCurveLayerDialog; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.Insets; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.text.NumberFormat; import javax.swing.BorderFactory; import javax.swing.ButtonGroup; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JComboBox; import javax.swing.JFormattedTextField; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.JRadioButton; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import javax.swing.text.NumberFormatter; import net.sf.samtools.SAMReadGroupRecord; import edu.yu.einstein.genplay.core.IO.extractor.SAMExtractor; import edu.yu.einstein.genplay.gui.dialog.TextDialog; import edu.yu.einstein.genplay.util.Images; /** * Panel for the option for SAM / BAM files. * @author Julien Lajugie */ class SAMPanel extends JPanel { /** Generated serial ID */ private static final long serialVersionUID = 3121403025053985776L; private final SAMExtractor samExtractor; // sam extractor with infos about read groups, programs used etc.. private final JLabel jlReadGroups; // label read groups private final JComboBox jcbReadGroups; // combo box to choose read groups private final JCheckBox jcbRemoveDuplicates; // check box remove duplicates private final JLabel jlRemoveDuplicatesHelp; // label help remove duplicates private final JRadioButton jrbSingleEnd; // radio button single end private final JLabel jlSingleEndHelp; // label help single end private final JRadioButton jrbPairedEnd; // radio button paired end private final JLabel jlPairedEndHelp; // label help paired ends private final ButtonGroup readParityRadioGroup; // group with the single end / pair end radio buttons private final JFormattedTextField jftfMappingQuality; // input text field for the mapping quality private final JLabel jlMappingQuality; // label for the mapping quality private final JLabel jlAlignmentsToExtract; // label reads to extract private final JRadioButton jrbUniqueAlignments; // radio button unique matches private final JRadioButton jrbPrimaryAlignments; // radio button primary alignment private final JRadioButton jrbAllAlignments; // radio all reads private final ButtonGroup readUniquenessGroup; // group with the reads to extract radio buttons private final JButton jbHeader; // button to show the header of the SAM/BAM file private static int defaultMapQual = 0; // default mapping quality private static boolean isRemoveDuplicatesSelected = true; // remove duplicates check-box default value private static boolean isSingleEndSelected = true; // single-end radio button default state private static boolean isPairedEndSelected = false; // paired-end radio button default state private static boolean isUniqueAlignmentsSelected = false; // unique radio button default state private static boolean isPrimaryAligmentSelected = false; // primary alignment radio button default state private static boolean isAllAlignmentsSelected = true; // all reads radio button default state /** * Creates an instance of {@link SAMPanel} */ SAMPanel(SAMExtractor samExtractor) { this.samExtractor = samExtractor; // mapping quality field jlMappingQuality = new JLabel("Mapping Quality (0 - 255) \u2265"); // \u2265 is the code for the superior or equal char jftfMappingQuality = new JFormattedTextField(NumberFormat.getIntegerInstance()); jftfMappingQuality.setColumns(5); ((NumberFormatter) jftfMappingQuality.getFormatter()).setMinimum(0); ((NumberFormatter) jftfMappingQuality.getFormatter()).setMaximum(255); jftfMappingQuality.setValue(defaultMapQual); jlAlignmentsToExtract = new JLabel("Choose Alignments to Extract (BWA only):"); jrbAllAlignments = new JRadioButton("All Alignments"); jrbAllAlignments.setSelected(isAllAlignmentsSelected); jrbPrimaryAlignments = new JRadioButton("Unique + Primary Alignments"); jrbPrimaryAlignments.setSelected(isPrimaryAligmentSelected); jrbUniqueAlignments = new JRadioButton("Unique Alignments Only"); jrbUniqueAlignments.setSelected(isUniqueAlignmentsSelected); readUniquenessGroup = new ButtonGroup(); readUniquenessGroup.add(jrbUniqueAlignments); readUniquenessGroup.add(jrbPrimaryAlignments); readUniquenessGroup.add(jrbAllAlignments); jrbSingleEnd = new JRadioButton("Single-End Reads"); jrbSingleEnd.setSelected(isSingleEndSelected); // add lister that activate / deactivate the different single end options when // the single end mode is enabled / disabled jrbSingleEnd.addChangeListener(new ChangeListener() { @Override public void stateChanged(ChangeEvent e) { jlAlignmentsToExtract.setEnabled(jrbSingleEnd.isSelected()); jrbUniqueAlignments.setEnabled(jrbSingleEnd.isSelected()); jlMappingQuality.setEnabled(jrbSingleEnd.isSelected()); jrbPrimaryAlignments.setEnabled(jrbSingleEnd.isSelected()); jrbAllAlignments.setEnabled(jrbSingleEnd.isSelected()); jftfMappingQuality.setEnabled(jrbSingleEnd.isSelected()); } }); // tooltip jlSingleEndHelp = new JLabel(new ImageIcon(Images.getHelpImage())); jlSingleEndHelp.setToolTipText("<html>Choose this option to extract each mapped read separatly.</html>"); jrbPairedEnd = new JRadioButton("Paired-End Reads"); jrbPairedEnd.setSelected(isPairedEndSelected); // tooltip jlPairedEndHelp = new JLabel(new ImageIcon(Images.getHelpImage())); jlPairedEndHelp.setToolTipText("<html>Choose this option to only extract fragments with both ends mapped and properly paired.</html>"); readParityRadioGroup = new ButtonGroup(); readParityRadioGroup.add(jrbSingleEnd); readParityRadioGroup.add(jrbPairedEnd); readParityRadioGroup.setSelected(jrbSingleEnd.getModel(), true); if (samExtractor.getReadGroups() == null) { jcbReadGroups = null; jlReadGroups = null; } else { jcbReadGroups = new JComboBox(); jcbReadGroups.addItem("All Read-Groups"); for (SAMReadGroupRecord currentReadGroupe: samExtractor.getReadGroups()) { jcbReadGroups.addItem(currentReadGroupe.getId()); } jlReadGroups = new JLabel("Read-Group to Extract:"); } jcbRemoveDuplicates = new JCheckBox("Remove Duplicates"); jcbRemoveDuplicates.setSelected(isRemoveDuplicatesSelected); // tooltip jlRemoveDuplicatesHelp = new JLabel(new ImageIcon(Images.getHelpImage())); jlRemoveDuplicatesHelp.setToolTipText("<html>Choose this option to exclude marked PCR and optical duplicates.</html>"); jbHeader = new JButton("Show Header"); jbHeader.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { String header = SAMPanel.this.samExtractor.getHeaderString(); TextDialog.showDialog(SAMPanel.this, "SAM/BAM Header", header); } }); JPanel jpSingleEndOptions = new JPanel(); jpSingleEndOptions.setLayout(new GridBagLayout()); GridBagConstraints gbc = new GridBagConstraints(); gbc.anchor = GridBagConstraints.LINE_START; gbc.insets = new Insets(10, 0, 10, 0); jpSingleEndOptions.add(jlMappingQuality, gbc); gbc.gridx = 1; jpSingleEndOptions.add(jftfMappingQuality, gbc); gbc.gridx = 0; gbc.gridy = 1; gbc.gridwidth = 2; gbc.insets = new Insets(10, 0, 0, 0); jpSingleEndOptions.add(jlAlignmentsToExtract, gbc); gbc.gridy = 2; gbc.insets = new Insets(0, 0, 0, 0); jpSingleEndOptions.add(jrbAllAlignments, gbc); gbc.gridy = 3; jpSingleEndOptions.add(jrbPrimaryAlignments, gbc); gbc.gridy = 4; jpSingleEndOptions.add(jrbUniqueAlignments, gbc); setLayout(new GridBagLayout()); gbc = new GridBagConstraints(); gbc.anchor = GridBagConstraints.LINE_START; gbc.gridy = -1; if (jcbReadGroups != null) { gbc.gridy++; gbc.gridwidth = 1; add(jlReadGroups, gbc); gbc.gridx = 1; add(jcbReadGroups, gbc); } gbc.gridx = 0; gbc.gridy++; gbc.insets = new Insets(10, 0, 0, 0); add(jcbRemoveDuplicates, gbc); gbc.gridx = 1; add(jlRemoveDuplicatesHelp, gbc); gbc.gridx = 0; gbc.gridy++; add(jrbSingleEnd, gbc); gbc.gridx = 1; add(jlSingleEndHelp, gbc); gbc.gridx = 0; gbc.gridy++; gbc.gridwidth = 2; gbc.insets = new Insets(0, 25, 0, 0); add(jpSingleEndOptions, gbc); gbc.gridy++; gbc.gridwidth = 1; gbc.insets = new Insets(10, 0, 0, 0); add(jrbPairedEnd, gbc); gbc.gridx = 1; gbc.anchor = GridBagConstraints.LINE_START; add(jlPairedEndHelp, gbc); gbc.gridx = 0; gbc.gridy++; gbc.gridwidth = 2; gbc.anchor = GridBagConstraints.CENTER; add(jbHeader, gbc); setBorder(BorderFactory.createTitledBorder("SAM/BAM Options")); } /** * @return the minimum mapping quality to extract */ int getMappingQuality() { return ((Number) jftfMappingQuality.getValue()).intValue(); } /** * @return the selected read group, null if all read-groups are selected */ SAMReadGroupRecord getSelectedReadGroup() { int selectedIndex = jcbReadGroups.getSelectedIndex(); if (selectedIndex == 0) { return null; } else { return samExtractor.getReadGroups()[selectedIndex - 1]; } } /** * @return true if all the reads should be extracted */ boolean isAllReadsSelected() { return jrbAllAlignments.isSelected(); } /** * @return true if the pair end mode is selected */ boolean isPairedEndSelected() { return jrbPairedEnd.isSelected(); } /** * @return true if the unique reads and the primary alignments should be extracted */ boolean isPrimaryAligmentSelected() { return jrbPrimaryAlignments.isSelected(); } /** * @return true if the remove duplicates options is selected */ public boolean isRemoveDuplicatesSelected() { return jcbRemoveDuplicates.isSelected(); } /** * @return true if the extraction should be done in single end mode */ boolean isSingleEndSelected() { return jrbSingleEnd.isSelected(); } /** * @return true if only the unique reads should be extracted */ boolean isUniqueSelected() { return jrbUniqueAlignments.isSelected(); } /** * Saves the default value for next time the window will become visible */ void saveDefault() { defaultMapQual = getMappingQuality(); isRemoveDuplicatesSelected = isRemoveDuplicatesSelected(); isAllAlignmentsSelected = isAllReadsSelected(); isPairedEndSelected = isPairedEndSelected(); isPrimaryAligmentSelected = isPrimaryAligmentSelected(); isSingleEndSelected = isSingleEndSelected(); isUniqueAlignmentsSelected = isUniqueSelected(); } }