Skip to content
Snippets Groups Projects
WriteMenu.java 30.3 KiB
Newer Older
  • Learn to ignore specific revisions
  • tjc's avatar
    tjc committed
    /* WriteMenu.java
     *
     * created: Mon Jan 11 1999
     *
     * This file is part of Artemis
     *
     * Copyright (C) 1998,1999,2000  Genome Research Limited
     *
     * 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 2
     * 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, write to the Free Software
     * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
     *
    
    tjc's avatar
    tjc committed
     * $Header: //tmp/pathsoft/artemis/uk/ac/sanger/artemis/components/WriteMenu.java,v 1.5 2006-01-06 19:13:10 tjc Exp $
    
    tjc's avatar
    tjc committed
     **/
    
    package uk.ac.sanger.artemis.components;
    
    import uk.ac.sanger.artemis.*;
    import uk.ac.sanger.artemis.sequence.*;
    
    import uk.ac.sanger.artemis.io.Sequence;
    import uk.ac.sanger.artemis.io.StreamSequence;
    import uk.ac.sanger.artemis.io.FastaStreamSequence;
    import uk.ac.sanger.artemis.io.RawStreamSequence;
    import uk.ac.sanger.artemis.io.EmblStreamSequence;
    import uk.ac.sanger.artemis.io.GenbankStreamSequence;
    import uk.ac.sanger.artemis.io.StreamSequenceFactory;
    
    tjc's avatar
    tjc committed
    import uk.ac.sanger.artemis.io.Range;
    
    tjc's avatar
    tjc committed
    
    import java.awt.*;
    import java.awt.event.*;
    import java.io.*;
    import javax.swing.*;
    
    /**
     *  A menu of commands for writing out protein and bases.
     *
     *  @author Kim Rutherford
    
    tjc's avatar
    tjc committed
     *  @version $Id: WriteMenu.java,v 1.5 2006-01-06 19:13:10 tjc Exp $
    
    tjc's avatar
    tjc committed
     **/
    
    tjc's avatar
    tjc committed
    public class WriteMenu extends SelectionMenu 
    {
    
    tjc's avatar
    tjc committed
      /**
       *  Create a new WriteMenu component.
       *  @param frame The JFrame that owns this JMenu.
       *  @param selection The Selection that the commands in the menu will
       *    operate on.
       *  @param entry_group The EntryGroup object to use when writing a sequence.
       *  @param menu_name The name of the new menu.
       **/
    
    tjc's avatar
    tjc committed
      public WriteMenu(final JFrame frame, final Selection selection,
                       final EntryGroup entry_group, final String menu_name)
    
    tjc's avatar
    tjc committed
      {
        super(frame, menu_name, selection);
    
    tjc's avatar
    tjc committed
    
        this.entry_group = entry_group;
    
    
    tjc's avatar
    tjc committed
        final JMenuItem aa_item = new JMenuItem("Amino Acids Of Selected Features");
        aa_item.addActionListener(new ActionListener()
        {
          public void actionPerformed(ActionEvent event) 
          {
            writeAminoAcids();
    
    tjc's avatar
    tjc committed
          }
        });
    
    
    tjc's avatar
    tjc committed
        add(aa_item);
    
    tjc's avatar
    tjc committed
    
        final JMenuItem pir_item =
    
    tjc's avatar
    tjc committed
          new JMenuItem("PIR Database Of Selected Features");
        pir_item.addActionListener(new ActionListener() 
        {
          public void actionPerformed(ActionEvent event) 
          {
            writePIRDataBase();
    
    tjc's avatar
    tjc committed
          }
        });
    
    
    tjc's avatar
    tjc committed
        add(pir_item);
        addSeparator();
    
    tjc's avatar
    tjc committed
    
    
    tjc's avatar
    tjc committed
        final JMenu bases_menu = new JMenu("Bases Of Selection");
        final JMenuItem raw_bases_item = new JMenuItem("Raw Format");
        raw_bases_item.addActionListener(new ActionListener() 
        {
          public void actionPerformed(ActionEvent event) 
          {
            writeBasesOfSelection(StreamSequenceFactory.RAW_FORMAT);
    
    tjc's avatar
    tjc committed
          }
        });
    
    
    tjc's avatar
    tjc committed
        bases_menu.add(raw_bases_item);
    
    tjc's avatar
    tjc committed
    
    
    tjc's avatar
    tjc committed
        final JMenuItem fasta_bases_item = new JMenuItem("FASTA Format");
        fasta_bases_item.addActionListener(new ActionListener() 
        {
          public void actionPerformed(ActionEvent event) 
          {
            writeBasesOfSelection(StreamSequenceFactory.FASTA_FORMAT);
    
    tjc's avatar
    tjc committed
          }
        });
    
    
    tjc's avatar
    tjc committed
        bases_menu.add(fasta_bases_item);
    
    tjc's avatar
    tjc committed
    
    
    tjc's avatar
    tjc committed
        final JMenuItem embl_bases_item = new JMenuItem("EMBL Format");
        embl_bases_item.addActionListener(new ActionListener()
        {
          public void actionPerformed(ActionEvent event) 
          {
            writeBasesOfSelection(StreamSequenceFactory.EMBL_FORMAT);
    
    tjc's avatar
    tjc committed
          }
        });
    
    
    tjc's avatar
    tjc committed
        bases_menu.add(embl_bases_item);
    
    tjc's avatar
    tjc committed
    
    
    tjc's avatar
    tjc committed
        final JMenuItem genbank_bases_item = new JMenuItem("Genbank Format");
        genbank_bases_item.addActionListener(new ActionListener()
        {
          public void actionPerformed(ActionEvent event) 
          {
            writeBasesOfSelection(StreamSequenceFactory.GENBANK_FORMAT);
    
    tjc's avatar
    tjc committed
          }
        });
    
    
    tjc's avatar
    tjc committed
        bases_menu.add(genbank_bases_item);
        add(bases_menu);
    
    tjc's avatar
    tjc committed
    
    
    tjc's avatar
    tjc committed
        final JMenu exons_menu = new JMenu("Exons Of Selection");
        final JMenuItem fasta_exons_item = new JMenuItem("Multiple FASTA Format");
        fasta_exons_item.addActionListener(new ActionListener()
        {
          public void actionPerformed(ActionEvent event)
          {
            writeExonsOfSelection(StreamSequenceFactory.FASTA_FORMAT);
          }
        });
        exons_menu.add(fasta_exons_item);
        add(exons_menu);
    
    
    tjc's avatar
    tjc committed
        final JMenu upstream_bases_menu =
    
    tjc's avatar
    tjc committed
          new JMenu("Upstream Bases Of Selected Features");
    
        final JMenuItem raw_upstream_bases_item = new JMenuItem("Raw Format");
        raw_upstream_bases_item.addActionListener(new ActionListener()
        {
          public void actionPerformed(ActionEvent event) 
          {
            writeUpstreamBases(StreamSequenceFactory.RAW_FORMAT);
    
    tjc's avatar
    tjc committed
          }
        });
    
    
    tjc's avatar
    tjc committed
        upstream_bases_menu.add(raw_upstream_bases_item);
    
    tjc's avatar
    tjc committed
    
    
    tjc's avatar
    tjc committed
        final JMenuItem fasta_upstream_bases_item = new JMenuItem("FASTA Format");
        fasta_upstream_bases_item.addActionListener(new ActionListener()
        {
          public void actionPerformed(ActionEvent event) 
          {
            writeUpstreamBases(StreamSequenceFactory.FASTA_FORMAT);
    
    tjc's avatar
    tjc committed
          }
        });
    
    
    tjc's avatar
    tjc committed
        upstream_bases_menu.add(fasta_upstream_bases_item);
        final JMenuItem embl_upstream_bases_item = new JMenuItem("EMBL Format");
        embl_upstream_bases_item.addActionListener(new ActionListener()
        {
          public void actionPerformed(ActionEvent event)
          {
            writeUpstreamBases(StreamSequenceFactory.EMBL_FORMAT);
    
    tjc's avatar
    tjc committed
          }
        });
    
    
    tjc's avatar
    tjc committed
        upstream_bases_menu.add(embl_upstream_bases_item);
    
    tjc's avatar
    tjc committed
    
    
    tjc's avatar
    tjc committed
        final JMenuItem genbank_upstream_bases_item = new JMenuItem("Genbank Format");
        genbank_upstream_bases_item.addActionListener(new ActionListener() 
        {
          public void actionPerformed(ActionEvent event) 
          {
            writeUpstreamBases(StreamSequenceFactory.GENBANK_FORMAT);
    
    tjc's avatar
    tjc committed
          }
        });
    
    
    tjc's avatar
    tjc committed
        upstream_bases_menu.add(genbank_upstream_bases_item);
    
    tjc's avatar
    tjc committed
    
    
    tjc's avatar
    tjc committed
        add(upstream_bases_menu);
    
    tjc's avatar
    tjc committed
    
        final JMenu downstream_bases_menu =
    
    tjc's avatar
    tjc committed
          new JMenu("Downstream Bases Of Selected Features");
    
        final JMenuItem raw_downstream_bases_item = new JMenuItem("Raw Format");
        raw_downstream_bases_item.addActionListener(new ActionListener() 
        {
          public void actionPerformed(ActionEvent event) 
          {
            writeDownstreamBases(StreamSequenceFactory.RAW_FORMAT);
    
    tjc's avatar
    tjc committed
          }
        });
    
    
    tjc's avatar
    tjc committed
        downstream_bases_menu.add(raw_downstream_bases_item);
    
    tjc's avatar
    tjc committed
    
    
    tjc's avatar
    tjc committed
        final JMenuItem fasta_downstream_bases_item = new JMenuItem("FASTA Format");
        fasta_downstream_bases_item.addActionListener(new ActionListener()
        {
          public void actionPerformed(ActionEvent event) 
          {
            writeDownstreamBases(StreamSequenceFactory.FASTA_FORMAT);
    
    tjc's avatar
    tjc committed
          }
        });
    
    
    tjc's avatar
    tjc committed
        downstream_bases_menu.add(fasta_downstream_bases_item);
    
    tjc's avatar
    tjc committed
    
    
    tjc's avatar
    tjc committed
        final JMenuItem embl_downstream_bases_item = new JMenuItem("EMBL Format");
        embl_downstream_bases_item.addActionListener(new ActionListener()
        {
          public void actionPerformed(ActionEvent event) 
          {
            writeDownstreamBases(StreamSequenceFactory.EMBL_FORMAT);
    
    tjc's avatar
    tjc committed
          }
        });
    
    
    tjc's avatar
    tjc committed
        downstream_bases_menu.add(embl_downstream_bases_item);
    
    tjc's avatar
    tjc committed
    
        final JMenuItem genbank_downstream_bases_item =
    
    tjc's avatar
    tjc committed
          new JMenuItem("Genbank Format");
        genbank_downstream_bases_item.addActionListener(new ActionListener()
        {
          public void actionPerformed(ActionEvent event) 
          {
            writeDownstreamBases(StreamSequenceFactory.GENBANK_FORMAT);
    
    tjc's avatar
    tjc committed
          }
        });
    
    
    tjc's avatar
    tjc committed
        downstream_bases_menu.add(genbank_downstream_bases_item);
    
    tjc's avatar
    tjc committed
    
    
    tjc's avatar
    tjc committed
        add(downstream_bases_menu);
    
    tjc's avatar
    tjc committed
    
    
    tjc's avatar
    tjc committed
        addSeparator();
    
    tjc's avatar
    tjc committed
    
    
    tjc's avatar
    tjc committed
        final JMenu write_all_bases_menu = new JMenu("Write All Bases");
    
    tjc's avatar
    tjc committed
    
    
    tjc's avatar
    tjc committed
        final JMenuItem write_raw_item = new JMenuItem("Raw Format");
        write_raw_item.addActionListener(new ActionListener()
        {
          public void actionPerformed(ActionEvent event) 
          {
            writeAllSequence(StreamSequenceFactory.RAW_FORMAT);
    
    tjc's avatar
    tjc committed
          }
        });
    
    
    tjc's avatar
    tjc committed
        write_all_bases_menu.add(write_raw_item);
    
    tjc's avatar
    tjc committed
    
    
    tjc's avatar
    tjc committed
        final JMenuItem write_fasta_item = new JMenuItem("FASTA Format");
        write_fasta_item.addActionListener(new ActionListener() 
        {
          public void actionPerformed(ActionEvent event) 
          {
            writeAllSequence(StreamSequenceFactory.FASTA_FORMAT);
    
    tjc's avatar
    tjc committed
          }
        });
    
    
    tjc's avatar
    tjc committed
        write_all_bases_menu.add(write_fasta_item);
    
    tjc's avatar
    tjc committed
    
    
    tjc's avatar
    tjc committed
        final JMenuItem write_embl_item = new JMenuItem("EMBL Format");
        write_embl_item.addActionListener(new ActionListener()
        {
          public void actionPerformed(ActionEvent event) 
          {
            writeAllSequence(StreamSequenceFactory.EMBL_FORMAT);
    
    tjc's avatar
    tjc committed
          }
        });
    
    
    tjc's avatar
    tjc committed
        write_all_bases_menu.add(write_embl_item);
    
    tjc's avatar
    tjc committed
    
    
    tjc's avatar
    tjc committed
        final JMenuItem write_genbank_item = new JMenuItem("Genbank Format");
        write_genbank_item.addActionListener(new ActionListener()
        {
          public void actionPerformed(ActionEvent event) 
          {
            writeAllSequence(StreamSequenceFactory.GENBANK_FORMAT);
    
    tjc's avatar
    tjc committed
          }
        });
    
    
    tjc's avatar
    tjc committed
        write_all_bases_menu.add(write_genbank_item);
    
    tjc's avatar
    tjc committed
    
    
    tjc's avatar
    tjc committed
        add(write_all_bases_menu);
    
    tjc's avatar
    tjc committed
    
    
    tjc's avatar
    tjc committed
        addSeparator();
    
    tjc's avatar
    tjc committed
    
        final JMenuItem codon_usage_item =
    
    tjc's avatar
    tjc committed
          new JMenuItem("Write Codon Usage of Selected Features");
        codon_usage_item.addActionListener(new ActionListener()
        {
          public void actionPerformed(ActionEvent event)
          {
            writeCodonUsage();
    
    tjc's avatar
    tjc committed
          }
        });
    
    
    tjc's avatar
    tjc committed
        add(codon_usage_item);
    
    tjc's avatar
    tjc committed
      }
    
      /**
       *  Create a new WriteMenu component.
       *  @param frame The JFrame that owns this JMenu.
       *  @param selection The Selection that the commands in the menu will
       *    operate on.
       *  @param entry_group The EntryGroup object to use when writing a sequence.
       **/
    
    tjc's avatar
    tjc committed
      public WriteMenu(final JFrame frame, final Selection selection,
    
    tjc's avatar
    tjc committed
                       final EntryGroup entry_group) 
      {
        this(frame, selection, entry_group, "Write");
    
    tjc's avatar
    tjc committed
      }
      
      /**
       *  Write a PIR database of the selected features to a file choosen by the
       *  user.
       **/
    
    tjc's avatar
    tjc committed
      private void writePIRDataBase()
      {
        if(!checkForSelectionFeatures()) 
    
    tjc's avatar
    tjc committed
          return;
    
        final File write_file =
    
    tjc's avatar
    tjc committed
          getWriteFile("Select a PIR output file name ...", "cosmid.pir", null);
    
    tjc's avatar
    tjc committed
    
    
    tjc's avatar
    tjc committed
        if(write_file == null)
    
    tjc's avatar
    tjc committed
          return;
    
    
    tjc's avatar
    tjc committed
        try 
        {
          final FileWriter writer = new FileWriter(write_file);
    
    tjc's avatar
    tjc committed
    
          final FeatureVector features_to_write =
    
    tjc's avatar
    tjc committed
            getSelection().getAllFeatures();
    
    tjc's avatar
    tjc committed
    
    
    tjc's avatar
    tjc committed
          for(int i = 0; i < features_to_write.size() ; ++i)
          {
            final Feature selection_feature = features_to_write.elementAt(i);
            selection_feature.writePIROfFeature(writer);
    
    tjc's avatar
    tjc committed
          }
    
    
    tjc's avatar
    tjc committed
          writer.close();
        }
        catch(IOException e) 
        {
          new MessageDialog(getParentFrame(),
                            "error while writing: " + e.getMessage());
    
    tjc's avatar
    tjc committed
        }
      }
    
      /**
       *  Write the amino acid symbols of the selected features to a file choosen
       *  by the user.
       **/
    
    tjc's avatar
    tjc committed
      private void writeAminoAcids()
      {
        if(!checkForSelectionFeatures())
    
    tjc's avatar
    tjc committed
          return;
    
        final File write_file =
    
    tjc's avatar
    tjc committed
          getWriteFile("Select an output file name..", "amino_acids", null);
    
    tjc's avatar
    tjc committed
    
    
    tjc's avatar
    tjc committed
        if(write_file == null)
    
    tjc's avatar
    tjc committed
          return;
    
    
    tjc's avatar
    tjc committed
        try
        {
          final FileWriter writer = new FileWriter(write_file);
    
    tjc's avatar
    tjc committed
    
          final FeatureVector features_to_write =
    
    tjc's avatar
    tjc committed
            getSelection().getAllFeatures();
    
    tjc's avatar
    tjc committed
    
    
    tjc's avatar
    tjc committed
          for(int i = 0; i < features_to_write.size(); ++i) 
          {
            final Feature selection_feature = features_to_write.elementAt(i);
            selection_feature.writeAminoAcidsOfFeature(writer);
    
    tjc's avatar
    tjc committed
          }
    
    
    tjc's avatar
    tjc committed
          writer.close();
        } 
        catch(IOException e) 
        {
          new MessageDialog(getParentFrame(),
                            "error while writing: " + e.getMessage());
    
    tjc's avatar
    tjc committed
        }
      }
    
      /**
       *  Write the bases of the selection to a file choosen by the user.
       *  @param output_type One of EMBL_FORMAT, RAW_FORMAT etc.
       **/
    
    tjc's avatar
    tjc committed
      private void writeBasesOfSelection(final int output_type) 
      {
        final MarkerRange marker_range = getSelection().getMarkerRange();
    
    tjc's avatar
    tjc committed
    
    
    tjc's avatar
    tjc committed
        if(marker_range == null) 
    
    tjc's avatar
    tjc committed
          writeFeatureBases (output_type);
    
    tjc's avatar
    tjc committed
        else  
        {
          final String selection_bases = Strand.markerRangeBases(marker_range);
    
    tjc's avatar
    tjc committed
    
    
    tjc's avatar
    tjc committed
          writeBases(selection_bases, "selected bases",
                     getSequenceFileName(output_type),
                     output_type);
    
    tjc's avatar
    tjc committed
        }
      }
    
    
    tjc's avatar
    tjc committed
      /**
       *  Write the bases of the selected features to a file choosen by the user
       *  or show a message and return immediately if there are no selected
       *  features.
       *  @param sequence The sequence to be written.
       *  @param header The header line that will be used on those output formats
       *    that need it.
       *  @param default_output_filename The filename that is passed to
    
    tjc's avatar
    tjc committed
       *    getWriteFile()
    
    tjc's avatar
    tjc committed
       *  @param output_type One of EMBL_FORMAT, RAW_FORMAT etc.
       **/
    
    tjc's avatar
    tjc committed
      private void writeBases(final String sequence, String header,
    
    tjc's avatar
    tjc committed
                              final String default_output_filename,
                              final int output_type) 
      {
    
    tjc's avatar
    tjc committed
        JTextField headerField = null;
    
        if(output_type == StreamSequenceFactory.FASTA_FORMAT ||
           output_type == StreamSequenceFactory.EMBL_FORMAT)
          headerField = new JTextField(header);
    
        final File write_file = getWriteFile("Select an output file name ...",
                                        default_output_filename, headerField);
    
    tjc's avatar
    tjc committed
    
    
    tjc's avatar
    tjc committed
        if(write_file == null)
    
    tjc's avatar
    tjc committed
          return;
    
    
    tjc's avatar
    tjc committed
        try 
        {
          final FileWriter writer = new FileWriter(write_file);
    
    tjc's avatar
    tjc committed
          final StreamSequence stream_sequence;
    
    
    tjc's avatar
    tjc committed
          switch(output_type) 
          {
            case StreamSequenceFactory.FASTA_FORMAT:
    
    tjc's avatar
    tjc committed
              if(headerField != null && !headerField.getText().equals(""))
                header = headerField.getText().trim();
    
              stream_sequence = new FastaStreamSequence(sequence, header);
    
    tjc's avatar
    tjc committed
              break;
    
            case StreamSequenceFactory.EMBL_FORMAT:
    
    tjc's avatar
    tjc committed
              stream_sequence = new EmblStreamSequence(sequence);
    
              if(headerField != null && !headerField.getText().equals(""))
              {
                header = "ID   "+headerField.getText().trim();
                header = header.concat("\nFH   Key             "+
                                       "Location/Qualifiers\nFH\n");
                ((EmblStreamSequence)stream_sequence).setHeader(header);
              }
    
    
    tjc's avatar
    tjc committed
              break;
    
            case StreamSequenceFactory.GENBANK_FORMAT:
    
    tjc's avatar
    tjc committed
              stream_sequence = new GenbankStreamSequence(sequence);
    
    tjc's avatar
    tjc committed
              break;
    
            case StreamSequenceFactory.RAW_FORMAT:
            default:
    
    tjc's avatar
    tjc committed
              stream_sequence = new RawStreamSequence(sequence);
    
    tjc's avatar
    tjc committed
              break;
    
    tjc's avatar
    tjc committed
          }
    
    
    tjc's avatar
    tjc committed
          stream_sequence.writeToStream(writer);
          writer.close();
        } 
        catch(IOException e) 
        {
          new MessageDialog(getParentFrame(),
                            "error while writing: " + e.getMessage());
    
    tjc's avatar
    tjc committed
        }
      }
    
    
    tjc's avatar
    tjc committed
      /**
      *
      * Write selected exons to a mutiple FASTA file.
      *
      */
      private void writeExonsOfSelection(final int output_type)
      {
        if(!checkForSelectionFeatures())
          return;
    
        final File write_file =
          getWriteFile("Select an output file name ...", "exons", null);
    
        if(write_file == null)
          return;
    
        try
        {
          final FileWriter writer = new FileWriter(write_file);
          final FeatureVector features_to_write =
                               getSelection().getAllFeatures();
          for(int i = 0; i < features_to_write.size(); ++i)
          {
            final Feature selection_feature = features_to_write.elementAt(i);
            final StringBuffer header_buffer = new StringBuffer();
    
            header_buffer.append(selection_feature.getSystematicName());
            header_buffer.append(" ");
            header_buffer.append(selection_feature.getIDString());
            header_buffer.append(" ");
    
            final String product = selection_feature.getProductString();
    
            if(product == null)
              header_buffer.append("undefined product");
            else
              header_buffer.append(product);
    
            int seg_size = selection_feature.getSegments().size();
            for(int j = 0; j < seg_size; ++j)
            {
              String bases = selection_feature.getSegments().elementAt(j).getBases();
              Range range = selection_feature.getSegments().elementAt(j).getRawRange();
    
              String s_range = " "+range.getStart()+":"+range.getEnd();
              if(selection_feature.isForwardFeature())
                s_range = s_range+" forward";
              else
                s_range = s_range+" reverse";
    
              final StreamSequence stream_sequence =
                getStreamSequence(bases,
                                  header_buffer.toString()+s_range,
                                  output_type);
    
              stream_sequence.writeToStream(writer);
            }
          }
          writer.close();
        }
        catch(IOException e)
        {
          new MessageDialog(getParentFrame(),
                            "error while writing: " + e.getMessage());
        }
      }
    
    
    tjc's avatar
    tjc committed
      /**
       *  Write the bases of the selected features to a file choosen by the user
       *  or show a message and return immediately if there are no selected
       *  features.
       *  @param output_type One of EMBL_FORMAT, RAW_FORMAT etc.
       **/
    
    tjc's avatar
    tjc committed
      private void writeFeatureBases(final int output_type) 
      {
        if(!checkForSelectionFeatures())
    
    tjc's avatar
    tjc committed
          return;
    
    
    tjc's avatar
    tjc committed
    
    
    tjc's avatar
    tjc committed
        final File write_file =
    
    tjc's avatar
    tjc committed
          getWriteFile("Select an output file name ...", "bases", null);
    
    tjc's avatar
    tjc committed
    
    
    tjc's avatar
    tjc committed
        if(write_file == null)
    
    tjc's avatar
    tjc committed
          return;
    
    
    tjc's avatar
    tjc committed
        try 
        {
          final FileWriter writer = new FileWriter(write_file);
    
    tjc's avatar
    tjc committed
          final FeatureVector features_to_write =
    
    tjc's avatar
    tjc committed
            getSelection().getAllFeatures();
    
    tjc's avatar
    tjc committed
    
    
    tjc's avatar
    tjc committed
          for(int i = 0; i < features_to_write.size(); ++i) 
          {
            final Feature selection_feature = features_to_write.elementAt(i);
            final StringBuffer header_buffer = new StringBuffer();
    
    tjc's avatar
    tjc committed
    
    
    tjc's avatar
    tjc committed
            header_buffer.append(selection_feature.getSystematicName());
            header_buffer.append(" ");
            header_buffer.append(selection_feature.getIDString());
            header_buffer.append(" ");
    
    tjc's avatar
    tjc committed
    
    
    tjc's avatar
    tjc committed
            final String product = selection_feature.getProductString();
    
    tjc's avatar
    tjc committed
    
    
    tjc's avatar
    tjc committed
            if(product == null) 
              header_buffer.append("undefined product");
            else 
              header_buffer.append(product);
    
    tjc's avatar
    tjc committed
            
    
    tjc's avatar
    tjc committed
            header_buffer.append(" ").append(selection_feature.getWriteRange());
    
    tjc's avatar
    tjc committed
    
            final StreamSequence stream_sequence =
    
    tjc's avatar
    tjc committed
              getStreamSequence(selection_feature.getBases(),
                                header_buffer.toString(),
                                output_type);
    
    tjc's avatar
    tjc committed
    
    
    tjc's avatar
    tjc committed
            stream_sequence.writeToStream(writer);
    
    tjc's avatar
    tjc committed
          }
    
    
    tjc's avatar
    tjc committed
          writer.close();
        } 
        catch(IOException e) 
        {
          new MessageDialog(getParentFrame(),
                            "error while writing: " + e.getMessage());
    
    tjc's avatar
    tjc committed
        }
      }
    
      /**
       *  Return a StreamSequence object for the given sequence string and the
       *  given type.
       *  @param sequence A String containing the sequence.
       *  @param header The header line that will be used on those output formats
       *    that need it.
       *  @param output_type One of EMBL_FORMAT, RAW_FORMAT etc.
       **/
    
    tjc's avatar
    tjc committed
      private StreamSequence getStreamSequence(final String sequence,
                                               final String header,
                                               final int output_type) 
      {
        switch(output_type)
        {
          case StreamSequenceFactory.FASTA_FORMAT:
            return new FastaStreamSequence (sequence, header);
    
    tjc's avatar
    tjc committed
    
    
    tjc's avatar
    tjc committed
          case StreamSequenceFactory.EMBL_FORMAT:
            return new EmblStreamSequence (sequence);
    
    tjc's avatar
    tjc committed
    
    
    tjc's avatar
    tjc committed
          case StreamSequenceFactory.GENBANK_FORMAT:
            return new GenbankStreamSequence (sequence);
    
    tjc's avatar
    tjc committed
    
    
    tjc's avatar
    tjc committed
          case StreamSequenceFactory.RAW_FORMAT:
          default:
            return new RawStreamSequence (sequence);
    
    tjc's avatar
    tjc committed
        }
      }
    
      /**
       *  Write the upstream bases of the selected features to a file choosen by
       *  the user.  The user can also choose the number of upstream base to
       *  write.
       *  @param output_type One of EMBL_FORMAT, RAW_FORMAT etc.
       **/
    
    tjc's avatar
    tjc committed
      private void writeUpstreamBases(final int output_type) 
      {
        if(!checkForSelectionFeatures()) 
    
    tjc's avatar
    tjc committed
          return;
    
        final TextRequester text_requester =
    
    tjc's avatar
    tjc committed
          new TextRequester("write how many bases upstream of each feature?",
                            18, "");
    
        text_requester.addTextRequesterListener(new TextRequesterListener() 
        {
          public void actionPerformed(final TextRequesterEvent event) 
          {
            if(event.getType() == TextRequesterEvent.CANCEL)
    
    tjc's avatar
    tjc committed
              return;
    
    
    tjc's avatar
    tjc committed
            final String base_count_string = event.getRequesterText().trim();
    
    tjc's avatar
    tjc committed
    
    
    tjc's avatar
    tjc committed
            if(base_count_string.length() == 0)
            {
              new MessageDialog(getParentFrame(), "no bases written");
    
    tjc's avatar
    tjc committed
              return;
            }
    
    
    tjc's avatar
    tjc committed
            try 
            {
    
    tjc's avatar
    tjc committed
              final int base_count =
    
    tjc's avatar
    tjc committed
                Integer.valueOf(base_count_string).intValue();
    
    tjc's avatar
    tjc committed
    
              final File write_file =
    
    tjc's avatar
    tjc committed
                getWriteFile("Select an output file name ...",
    
    tjc's avatar
    tjc committed
                             "upstream_" + getSequenceFileName(output_type), null);
    
    tjc's avatar
    tjc committed
    
    
    tjc's avatar
    tjc committed
              if(write_file == null)
    
    tjc's avatar
    tjc committed
                return;
    
    
    tjc's avatar
    tjc committed
              try 
              {
                final FileWriter writer = new FileWriter(write_file);
    
    tjc's avatar
    tjc committed
    
                final FeatureVector features_to_write =
    
    tjc's avatar
    tjc committed
                  getSelection().getAllFeatures();
    
    tjc's avatar
    tjc committed
    
    
    tjc's avatar
    tjc committed
                for(int i = 0; i < features_to_write.size(); ++i)
                {
    
    tjc's avatar
    tjc committed
                  final Feature selection_feature =
    
    tjc's avatar
    tjc committed
                    features_to_write.elementAt(i);
    
    tjc's avatar
    tjc committed
    
                  final String sequence_string =
    
    tjc's avatar
    tjc committed
                    selection_feature.getUpstreamBases(base_count);
    
    tjc's avatar
    tjc committed
    
    
                  final String header_line =
    
    tjc's avatar
    tjc committed
                    selection_feature.getIDString() + " - " +
                    sequence_string.length() + " bases upstream";
    
    tjc's avatar
    tjc committed
    
                  final StreamSequence stream_sequence =
    
    tjc's avatar
    tjc committed
                    getStreamSequence(sequence_string,
    
    tjc's avatar
    tjc committed
                                       header_line,
                                       output_type);
                  
    
    tjc's avatar
    tjc committed
                  stream_sequence.writeToStream(writer);
    
    tjc's avatar
    tjc committed
                }
    
    
    tjc's avatar
    tjc committed
                writer.close();
              }
              catch(IOException e) 
              {
                new MessageDialog(getParentFrame(),
                                  "error while writing: " + e.getMessage());
    
    tjc's avatar
    tjc committed
              }
    
    tjc's avatar
    tjc committed
            } 
            catch(NumberFormatException e)
            {
              new MessageDialog(getParentFrame(),
                                "this is not a number: " + base_count_string);
    
    tjc's avatar
    tjc committed
            }
          }
        });
    
    
        text_requester.setVisible(true);
    
    tjc's avatar
    tjc committed
      }
    
      /**
       *  Write the downstream bases of the selected features to a file choosen by
       *  the user.  The user can also choose the number of downstream base to
       *  write.
       *  @param output_type One of EMBL_FORMAT, RAW_FORMAT etc.
       **/
    
    tjc's avatar
    tjc committed
      private void writeDownstreamBases(final int output_type) 
      {
        if(!checkForSelectionFeatures())
    
    tjc's avatar
    tjc committed
          return;
    
        final TextRequester text_requester =
    
    tjc's avatar
    tjc committed
          new TextRequester("write how many bases downstream of each feature?",
    
    tjc's avatar
    tjc committed
                             18, "");
    
    
    tjc's avatar
    tjc committed
        text_requester.addTextRequesterListener(new TextRequesterListener()
        {
          public void actionPerformed(final TextRequesterEvent event) 
          {
            if(event.getType() == TextRequesterEvent.CANCEL)
    
    tjc's avatar
    tjc committed
              return;
    
    
    tjc's avatar
    tjc committed
            final String base_count_string = event.getRequesterText().trim();
    
    tjc's avatar
    tjc committed
    
    
    tjc's avatar
    tjc committed
            if(base_count_string.length() == 0) 
            {
              new MessageDialog(getParentFrame(), "no bases written");
    
    tjc's avatar
    tjc committed
              return;
            }
    
    
    tjc's avatar
    tjc committed
            try 
            {
    
    tjc's avatar
    tjc committed
              final int base_count =
    
    tjc's avatar
    tjc committed
                Integer.valueOf(base_count_string).intValue();
    
    tjc's avatar
    tjc committed
    
              final File write_file =
    
    tjc's avatar
    tjc committed
                getWriteFile("Select an output file name ...",
    
    tjc's avatar
    tjc committed
                             "downstream_" + getSequenceFileName(output_type), null);
    
    tjc's avatar
    tjc committed
    
    
    tjc's avatar
    tjc committed
              if(write_file == null)
    
    tjc's avatar
    tjc committed
                return;
    
    
    tjc's avatar
    tjc committed
              try 
              {
                final FileWriter writer = new FileWriter(write_file);
    
    tjc's avatar
    tjc committed
                final FeatureVector features_to_write =
    
    tjc's avatar
    tjc committed
                  getSelection().getAllFeatures();
    
    tjc's avatar
    tjc committed
    
    
    tjc's avatar
    tjc committed
                for(int i = 0; i < features_to_write.size(); ++i) 
                {
    
    tjc's avatar
    tjc committed
                  final Feature selection_feature =
    
    tjc's avatar
    tjc committed
                    features_to_write.elementAt(i);
    
    tjc's avatar
    tjc committed
    
                  final String sequence_string =
    
    tjc's avatar
    tjc committed
                    selection_feature.getDownstreamBases(base_count);
    
    tjc's avatar
    tjc committed
    
    
                  final String header_line =
    
    tjc's avatar
    tjc committed
                    selection_feature.getIDString() + " - " +
                    sequence_string.length() + " bases downstream ";
    
    tjc's avatar
    tjc committed
    
                  final StreamSequence stream_sequence =
    
    tjc's avatar
    tjc committed
                    getStreamSequence(sequence_string,
                                      header_line,
                                      output_type);
    
    tjc's avatar
    tjc committed
                  
    
    tjc's avatar
    tjc committed
                  stream_sequence.writeToStream(writer);
    
    tjc's avatar
    tjc committed
                }
    
    
    tjc's avatar
    tjc committed
                writer.close();
              } 
              catch(IOException e) 
              {
                new MessageDialog(getParentFrame(),
                                  "error while writing: " + e.getMessage());
    
    tjc's avatar
    tjc committed
              }
    
    tjc's avatar
    tjc committed
            }
            catch(NumberFormatException e) 
            {
              new MessageDialog(getParentFrame(),
                                "this is not a number: " + base_count_string);
    
    tjc's avatar
    tjc committed
            }
          }
        });
    
    
        text_requester.setVisible(true);
    
    tjc's avatar
    tjc committed
      }
    
      /**
    
    tjc's avatar
    tjc committed
       *  Helper method for writeFeatureBases(), writeUpstreamBases() and
       *  writeDownstreamBases(). 
    
    tjc's avatar
    tjc committed
       *  @return A string of the form "100:200 reverse" or "1:2222 forward".
       **/
    
    tjc's avatar
    tjc committed
      private static String getWriteRange(final Feature feature) 
      {
        return (feature.isForwardFeature() ?
                feature.getFirstCodingBaseMarker().getRawPosition() + ":" +
                feature.getLastBaseMarker().getRawPosition() +
    
    tjc's avatar
    tjc committed
                " forward" :
    
    tjc's avatar
    tjc committed
                feature.getLastBaseMarker().getRawPosition() + ":" +
                feature.getFirstCodingBaseMarker().getRawPosition() +
    
    tjc's avatar
    tjc committed
                " reverse");
      }
    
      
      /**
       *  Return a sensible file name to write sequence of the given type to.
       *  @param output_type One of EMBL_FORMAT, RAW_FORMAT etc.
       **/
    
    tjc's avatar
    tjc committed
      private String getSequenceFileName(final int output_type) 
      {
        switch(output_type) 
        {
    
    tjc's avatar
    tjc committed
          case StreamSequenceFactory.FASTA_FORMAT:
            return "sequence.dna";
    
          case StreamSequenceFactory.EMBL_FORMAT:
            return "sequence.embl";
    
          case StreamSequenceFactory.GENBANK_FORMAT:
            return "sequence.genbank";
    
          case StreamSequenceFactory.RAW_FORMAT:
          default:
            return "sequence.seq";
        }
      }
      
      /**
       *  Write the bases from entry_group as raw sequence.
       *  @param output_type One of EMBL_FORMAT, RAW_FORMAT etc.
       **/
    
    tjc's avatar
    tjc committed
      private void writeAllSequence(final int output_type) 
      {
        final String file_name = getSequenceFileName(output_type);
    
    tjc's avatar
    tjc committed
    
    
    tjc's avatar
    tjc committed
        writeBases(entry_group.getBases().toString(),
                   "all_bases", file_name, output_type);
    
    tjc's avatar
    tjc committed
      }
    
      /**
       *  Popup a requester and ask for a file name to write to.  If the file
       *  exists ask the user whether to overwrite.
       *  @param title The title of the new FileDialog JFrame.
       *  @param default_name The name to put in the FileDialog as a default.
       **/
    
    tjc's avatar
    tjc committed
      private File getWriteFile(final String title, final String default_name,
                                final JTextField idField) 
    
    tjc's avatar
    tjc committed
      {
        final JFileChooser dialog = new StickyFileChooser();
    
    tjc's avatar
    tjc committed
    
    
    tjc's avatar
    tjc committed
        JCheckBox header = new JCheckBox("Add Header", false);
        if(idField != null)
          dialog.setAccessory(header);
    
    
    tjc's avatar
    tjc committed
        dialog.setDialogTitle(title);
        dialog.setFileSelectionMode(JFileChooser.FILES_ONLY);
        dialog.setSelectedFile(new File(default_name));
        dialog.setDialogType(JFileChooser.SAVE_DIALOG);
        final int status = dialog.showSaveDialog(getParentFrame());
    
    tjc's avatar
    tjc committed
    
    
    tjc's avatar
    tjc committed
        if(status != JFileChooser.APPROVE_OPTION)
    
    tjc's avatar
    tjc committed
          return null;
    
    
    tjc's avatar
    tjc committed
        if(dialog.getSelectedFile() == null) 
    
    tjc's avatar
    tjc committed
          return null;
    
    tjc's avatar
    tjc committed
        else
        {
          final File write_file = dialog.getSelectedFile();
    
    tjc's avatar
    tjc committed
    
    
    tjc's avatar
    tjc committed
          if(write_file.exists())
          {
    
    tjc's avatar
    tjc committed
            final YesNoDialog yes_no_dialog =
    
    tjc's avatar
    tjc committed
              new YesNoDialog(getParentFrame(),
                              "this file exists: " + write_file +
                              " overwrite it?");
    
    tjc's avatar
    tjc committed
            
    
    tjc's avatar
    tjc committed
            if(!yes_no_dialog.getResult())
    
    tjc's avatar
    tjc committed
              return null;
          }
    
    
    tjc's avatar
    tjc committed
          // request user to provide header
          if(idField != null)
          {
            if(header.isSelected())
            {
              Box bdown = Box.createVerticalBox();
              bdown.add(idField);
    
              int n = JOptionPane.showConfirmDialog(null, bdown,
                                "Enter the entry ID",
                                JOptionPane.OK_CANCEL_OPTION,
                                JOptionPane.QUESTION_MESSAGE);
    
              if(n == JOptionPane.CANCEL_OPTION)
                idField.setText("");
            }
            else
              idField.setText("");
          }
    
    tjc's avatar
    tjc committed
          return write_file;
        }
      }
    
      /**
       *  Write a table of codon usage for the selected features to a file choosen
       *  by the user.
       **/
    
    tjc's avatar
    tjc committed
      private void writeCodonUsage()
      {
        if(!checkForSelectionFeatures())
    
    tjc's avatar
    tjc committed
          return;
    
        final File write_file =
    
    tjc's avatar
    tjc committed
          getWriteFile("Select a codon usage output file ...", "usage", null);
    
    tjc's avatar
    tjc committed
    
    
    tjc's avatar
    tjc committed
        if(write_file == null)
    
    tjc's avatar
    tjc committed
          return;
    
    
    tjc's avatar
    tjc committed
        try 
        {
          final PrintWriter writer = new PrintWriter(new FileWriter(write_file));
    
    tjc's avatar
    tjc committed
    
    
    tjc's avatar
    tjc committed
          final int[][][] codon_counts = new int[4][4][4];
    
    tjc's avatar
    tjc committed
    
          final FeatureVector features_to_write =
    
    tjc's avatar
    tjc committed
            getSelection().getAllFeatures();
    
    tjc's avatar
    tjc committed
    
          int codon_total = 0;
    
    
    tjc's avatar
    tjc committed
          for(int i = 0; i < features_to_write.size(); ++i) 
          {
            final Feature selection_feature = features_to_write.elementAt(i);
    
    tjc's avatar
    tjc committed
    
    
    tjc's avatar
    tjc committed
            for(int base1 = 0 ; base1 < 4 ; ++base1) 
            {
              for(int base2 = 0 ; base2 < 4 ; ++base2) 
              {
                for(int base3 = 0 ; base3 < 4 ; ++base3) 
                {
    
    tjc's avatar
    tjc committed
                  codon_counts[base1][base2][base3] +=
    
    tjc's avatar
    tjc committed
                    selection_feature.getCodonCount(base1, base2, base3);
    
    tjc's avatar
    tjc committed
                }
              }
            }
    
    
    tjc's avatar
    tjc committed
            codon_total += selection_feature.getTranslationBasesLength() / 3;
    
    tjc's avatar
    tjc committed
          }
    
    
    tjc's avatar
    tjc committed
          for(int base1 = 0 ; base1 < 4 ; ++base1) 
          {
            for(int base3 = 0 ; base3 < 4 ; ++base3) 
            {
              final StringBuffer buffer = new StringBuffer();
    
    tjc's avatar
    tjc committed
    
    
    tjc's avatar
    tjc committed
              for(int base2 = 0 ; base2 < 4 ; ++base2) 
              {
                buffer.append(Bases.letter_index[base1]);
                buffer.append(Bases.letter_index[base2]);
                buffer.append(Bases.letter_index[base3]);