Skip to content
Snippets Groups Projects
WriteMenu.java 26.5 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.3 2004-12-07 15:07:01 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;
    
    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.3 2004-12-07 15:07:01 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) 
      {
        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
    
        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,
                       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");
    
    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");
    
    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
        }
      }
    
      /**
       *  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,
                              final String header,
                              final String default_output_filename,
                              final int output_type) 
      {
    
    tjc's avatar
    tjc committed
        final File write_file =
    
    tjc's avatar
    tjc committed
          getWriteFile("Select an output file name ...", default_output_filename);
    
    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:
              stream_sequence =
                new FastaStreamSequence(sequence, header);
              break;
    
            case StreamSequenceFactory.EMBL_FORMAT:
              stream_sequence =
                new EmblStreamSequence(sequence);
              break;
    
            case StreamSequenceFactory.GENBANK_FORMAT:
              stream_sequence =
                new GenbankStreamSequence(sequence);
              break;
    
            case StreamSequenceFactory.RAW_FORMAT:
            default:
              stream_sequence =
                new RawStreamSequence(sequence);
              break;
    
    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
        }
      }
    
      /**
       *  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;
    
        final File write_file =
    
    tjc's avatar
    tjc committed
          getWriteFile("Select an output file name ...", "bases");
    
    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 ...",
                             "upstream_" + getSequenceFileName(output_type));
    
    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 ...",
                             "downstream_" + getSequenceFileName(output_type));
    
    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 JFileChooser dialog = new StickyFileChooser();
    
    tjc's avatar
    tjc committed
    
    
    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;
          }
    
          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");
    
    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]);
                buffer.append(' ');
    
    tjc's avatar
    tjc committed
    
                final float per_thousand;
    
    
    tjc's avatar
    tjc committed
                if(codon_total > 0)
                {
    
    tjc's avatar
    tjc committed
                  per_thousand =
                    10000 * codon_counts[base1][base2][base3] / codon_total *
                    1.0F / 10;
    
    tjc's avatar
    tjc committed
                } 
                else
    
    tjc's avatar
    tjc committed
                  per_thousand = 0.0F;
    
    
    tjc's avatar
    tjc committed
                buffer.append(per_thousand);
                buffer.append("( ").append(codon_counts[base1][base2][base3]);
                buffer.append(")  ");
    
    tjc's avatar
    tjc committed
              }
    
    
    tjc's avatar
    tjc committed
              writer.println(buffer.toString());
    
    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
        }
      }
    
      /**
       *  The EntryGroup object that was passed to the constructor.
       **/
      private EntryGroup entry_group;
    }