Skip to content
Snippets Groups Projects
BasePlotGroup.java 10.8 KiB
Newer Older
  • Learn to ignore specific revisions
  • tjc's avatar
    tjc committed
    /* BasePlotGroup.java
     *
     * created: Tue Dec 15 1998
     *
     * 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/BasePlotGroup.java,v 1.2 2004-11-09 14:24:41 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.plot.*;
    
    import java.awt.*;
    import java.awt.event.*;
    import java.io.IOException;
    import java.io.File;
    import java.util.Vector;
    
    import javax.swing.*;
    
    /**
     *  This is a super-component containing several BasePlot components, each of
     *  which can toggled off and on.
     *
     *  @author Kim Rutherford
    
    tjc's avatar
    tjc committed
     *  @version $Id: BasePlotGroup.java,v 1.2 2004-11-09 14:24:41 tjc Exp $
    
    tjc's avatar
    tjc committed
     **/
    
    public class BasePlotGroup extends JPanel
    
    tjc's avatar
    tjc committed
                               implements DisplayAdjustmentListener 
    {
    
    tjc's avatar
    tjc committed
      /**
       *  Create a new BasePlotGroup component for the given EntryGroup.
       *  @param selection Used to set and display the current selection in the
       *    BasePlot.
       *  @param goto_event_source The object the we will call gotoBase () on.
       *    This allows the user to double click on a base in a BasePlot and have
       *    the FeatureDisplay follow.
       **/
    
    tjc's avatar
    tjc committed
      public BasePlotGroup(final EntryGroup entry_group,
                           final Component owning_component,
                           final Selection selection,
                           final GotoEventSource goto_event_source) 
      {
    
    tjc's avatar
    tjc committed
        this.owning_component = owning_component;
        this.entry_group = entry_group;
        this.selection = selection;
        this.goto_event_source = goto_event_source;
    
        final Strand forward_strand =
    
    tjc's avatar
    tjc committed
          entry_group.getBases().getForwardStrand();
    
    tjc's avatar
    tjc committed
    
        final Strand reverse_strand =
    
    tjc's avatar
    tjc committed
          entry_group.getBases().getReverseStrand();
    
    tjc's avatar
    tjc committed
    
        // the following arrays are from failed tests
        final float [] [] test_weights = {
          {1, 0,39,99,11}, // a
          {76,8,15,1,45}, // c
          {2,0,42,0,6}, // g
          {21,91,4,0,38}  // t
        };
    
        final float [] [] test_weights2 = {
          {11,11,10, 8,11,10,11,11, 7, 8,25, 3,100,  0,27},
          {29,33,30,30,32,34,37,38,39,36,26,75,  0,  0,14},
          {14,12,10,10, 9,11,10, 9, 7, 6,26, 1,  0,100,49},
          {46,44,50,52,48,45,42,43,47,51,23,21,  0,  0,10}
        };
    
        final float [] [] test_weights3 = {
          {0,0,1,0,0,0},
          {0,0,0,1,0,0},
          {1,0,0,0,1,0},
          {0,1,0,0,0,1},
        };
    
        final float [] cai_test = {
          0.113F, 1.0F,   0.117F, 1.0F,
          1.0F,   0.693F, 0.036F, 0.005F,
          0.071F, 1.0F,   0.0F,   0.0F,
          1.0F,   0.077F, 0.0F,   1.0F,
    
          0.006F, 0.003F, 0.039F, 0.003F,
          0.047F, 0.009F, 1.0F,   0.002F,
          0.245F, 1.0F,   1.0F,   0.007F,
          0.137F, 0.002F, 0.002F, 0.002F,
    
          0.823F, 1.0F,   0.003F, 1.0F,
          0.921F, 1.0F,   0.012F, 0.006F,
          0.053F, 1.0F,   0.135F, 1.0F,
          0.021F, 0.031F, 1.0F,   0.003F,
    
          1.0F,   0.831F, 0.002F, 0.018F,
          1.0F,   0.316F, 0.015F, 0.001F,
          0.554F, 1.0F,   1.0F,   0.016F,
          1.0F,   0.02F,  0.002F, 0.004F
        };
    
    
    tjc's avatar
    tjc committed
    //    plot_algorithms_temp.add(new CAIWindowAlgorithm(forward_strand, cai_test));
    //    plot_algorithms_temp.add(new UserBaseAlgorithm(forward_strand, "test", test_weights));
    //    plot_algorithms_temp.add(new UserBaseAlgorithm(forward_strand, "test2", test_weights2));
    //    plot_algorithms_temp.add(new UserBaseAlgorithm(forward_strand, "test3", test_weights3));
    
    tjc's avatar
    tjc committed
    
    
    tjc's avatar
    tjc committed
        setLayout(gridbag);
    
    tjc's avatar
    tjc committed
    
        c.fill = GridBagConstraints.HORIZONTAL;
        c.anchor = GridBagConstraints.NORTH;
        c.gridwidth = GridBagConstraints.REMAINDER;
        c.gridheight = 1;
        c.weightx = 1;
        c.weighty = 0;
    
    
    tjc's avatar
    tjc committed
        c.insets = new Insets(0,0,5,0);
    
        addAlgorithm(new GCWindowAlgorithm(forward_strand));
        addAlgorithm(new GCSDWindowAlgorithm(forward_strand));
        addAlgorithm(new AGWindowAlgorithm(forward_strand));
        addAlgorithm(new GCFrameAlgorithm(forward_strand));
        addAlgorithm(new GCFrameAlgorithm(reverse_strand));
        addAlgorithm(new Codon12CorrelationAlgorithm(forward_strand));
        addAlgorithm(new Codon12CorrelationAlgorithm(reverse_strand));
        addAlgorithm(new GCDeviationAlgorithm(forward_strand));
        addAlgorithm(new ATDeviationAlgorithm(forward_strand));
        addAlgorithm(new KarlinSigAlgorithm(forward_strand));
    
    tjc's avatar
    tjc committed
      }
    
    
    tjc's avatar
    tjc committed
     
      /**
      * 
      * Routine for printing graphs in artemis
      *
      */
      protected void printComponent(Graphics g)
      {
        final Component[] children = getComponents();
        for(int i = 0 ; i<children.length ; ++i)
          if(children[i] instanceof BasePlot)
          {
            BasePlot bp = (BasePlot)children[i];
            if(!bp.isVisible())
              continue;
            bp.paintCanvas(g);
            g.translate(0,bp.getHeight());
          }
      }
    
    
    
    tjc's avatar
    tjc committed
      /**
       *  Implementation of the DisplayAdjustmentListener interface.  Invoked when
       *  a component (FeatureDisplay) scrolls or changes the scale.  Sends the
       *  event to all the BasePlot components in this BasePlotGroup.
       **/
    
    tjc's avatar
    tjc committed
      public void displayAdjustmentValueChanged(DisplayAdjustmentEvent event) 
      {
        final Component[] children = getComponents();
    
        for(int i = 0 ; i<children.length ; ++i)
        {
          if(children[i] instanceof BasePlot) 
            ((BasePlot)children[i]).displayAdjustmentValueChanged(event);
    
    tjc's avatar
    tjc committed
        }
      }
    
      /**
       *  Add a new BasePlot component for the given algorithm.
       *  @return The new BasePlot
       **/
    
    tjc's avatar
    tjc committed
      public BasePlot addAlgorithm(final BaseAlgorithm algorithm) 
      {
        plot_value_producers.addElement(algorithm);
    
    tjc's avatar
    tjc committed
    
    
    tjc's avatar
    tjc committed
        return makePlot(algorithm, gridbag, c);
    
    tjc's avatar
    tjc committed
      }
    
      /**
       *  Return the first CodonUsageAlgorithm or null if there isn't one in the
       *  group.
       **/
    
    tjc's avatar
    tjc committed
      public CodonUsageAlgorithm getCodonUsageAlgorithm() 
      {
        for(int i = 0 ; i < plot_value_producers.size() ; ++i) 
        {
    
    tjc's avatar
    tjc committed
          final BaseAlgorithm this_algorithm =
    
    tjc's avatar
    tjc committed
            (BaseAlgorithm) plot_value_producers.elementAt(i);
    
    tjc's avatar
    tjc committed
    
    
    tjc's avatar
    tjc committed
          if(this_algorithm instanceof CodonUsageAlgorithm) 
    
    tjc's avatar
    tjc committed
            return (CodonUsageAlgorithm) this_algorithm;
        }
    
        return null;
      }
    
      /**
       *  Return an array containing the Algorithm objects of the BasePlot
       *  components in this BasePlotGroup.
       **/
    
    tjc's avatar
    tjc committed
      public BaseAlgorithm[] getPlotAlgorithms() 
      {
        final BaseAlgorithm[] return_array =
          new BaseAlgorithm[plot_value_producers.size ()];
    
    tjc's avatar
    tjc committed
    
    
    tjc's avatar
    tjc committed
        for(int i = 0 ; i < plot_value_producers.size () ; ++i) 
        {
    
    tjc's avatar
    tjc committed
          final BaseAlgorithm this_algorithm =
            (BaseAlgorithm) plot_value_producers.elementAt (i);
          return_array[i] = this_algorithm;
        }
    
        return return_array;
      }
    
      /**
       *  Return true if and only if the BasePlot for the given Algorithm is
       *  visible.
       **/
    
    tjc's avatar
    tjc committed
      public boolean basePlotIsVisible(final Algorithm algorithm) 
      {
        final Component base_plot = findPlotByAlgorithm(algorithm);
    
    tjc's avatar
    tjc committed
        return base_plot.isVisible ();
      }
    
      /**
       *  Given an Algorithm, find and set the visibility of the corresponding
       *  BasePlot component.
       **/
    
    tjc's avatar
    tjc committed
      public void setVisibleByAlgorithm(final Algorithm algorithm,
                                        final boolean visible) 
      {
        final JComponent base_plot = findPlotByAlgorithm(algorithm);
    
    tjc's avatar
    tjc committed
    
    
    tjc's avatar
    tjc committed
        base_plot.setVisible(visible);
    
    tjc's avatar
    tjc committed
        if (getParent () != null) {
          // XXX change to revalidate().
          getParent ().validate ();
        }
      }
    
      /**
       *  Find the BasePlot component in this BasePlotGroup object that is
       *  plotting the given Algorithm or null if no such BasePlot object exists.
       **/
    
    tjc's avatar
    tjc committed
      private JComponent findPlotByAlgorithm(final Algorithm algorithm) 
      {
        final Component[] children = getComponents();
    
        for(int i = 0 ; i < children.length ; ++i) 
        {
          if(children[i] instanceof BasePlot) 
          {
    
    tjc's avatar
    tjc committed
            final Algorithm component_algorithm =
    
    tjc's avatar
    tjc committed
                               ((BasePlot)children[i]).getAlgorithm ();
            if(component_algorithm == algorithm)
    
    tjc's avatar
    tjc committed
              return (JComponent)children[i];
          }
        }
    
        return null;
      }
    
    
    tjc's avatar
    tjc committed
    
    
    tjc's avatar
    tjc committed
      /**
       *  Create a Plot component for the given Algorithm and then make a button
       *  for it so that it can be shown and hidden.  Note that button making is
       *  currently disabled
       *  @param algorithm The Algorithm to create a Plot of.
       *  @param gridbag The GridBagLayout to use to lay out the Plot components.
       *  @param constraints The GridBagConstraints object to use to lay out the
       *    Plot components.
       *  @return The new BasePlot
       **/
    
    tjc's avatar
    tjc committed
      private BasePlot makePlot(BaseAlgorithm algorithm,
                                GridBagLayout gridbag,
                                GridBagConstraints constraints) 
      {
    
    tjc's avatar
    tjc committed
        final BasePlot new_base_plot =
    
    tjc's avatar
    tjc committed
          new BasePlot(algorithm, getSelection(), getGotoEventSource());
    
    tjc's avatar
    tjc committed
    
    
    tjc's avatar
    tjc committed
        gridbag.setConstraints(new_base_plot, constraints);
        add(new_base_plot);
        new_base_plot.setVisible(false);
    
    tjc's avatar
    tjc committed
    
    
    tjc's avatar
    tjc committed
        getSelection().addSelectionChangeListener(new_base_plot);
    
    tjc's avatar
    tjc committed
    
        if (getParent () != null) {
          // XXX change to revalidate().
          getParent ().validate ();
        }
    
        return new_base_plot;
      }
    
      /**
       *  Return the Selection object that was passed to the constructor.
       **/
    
    tjc's avatar
    tjc committed
      private Selection getSelection() 
      {
    
    tjc's avatar
    tjc committed
        return selection;
      }
    
      /**
       *  Return the EntryGroup object that was passed to the constructor.
       **/
    
    tjc's avatar
    tjc committed
      private EntryGroup getEntryGroup() 
      {
    
    tjc's avatar
    tjc committed
        return entry_group;
      }
    
      /**
       *  Return the GotoEventSource object that was passed to the constructor.
       **/
    
    tjc's avatar
    tjc committed
      private GotoEventSource getGotoEventSource()
      {
    
    tjc's avatar
    tjc committed
        return goto_event_source;
      }
    
      /**
       *  The EntryGroup that contains the sequence that this JComponent is
       *  displaying.
       **/
      private final EntryGroup entry_group;
    
      /**
       *  This array contains the Algorithm objects of the BasePlot components in
       *  this BasePlotGroup, as set by the constructor.
       **/
      private final Vector plot_value_producers = new Vector ();
    
      /**
       *  The layout object used by this component.
       **/
      private final GridBagLayout gridbag = new GridBagLayout();
    
      /**
       *  The constraints object used by this component.
       **/
      private final GridBagConstraints c = new GridBagConstraints();
    
      /**
       *  The Selection that was passed to the constructor.
       **/
      private Selection selection;
    
      /**
       *  The GotoEventSource that was passed to the constructor.
       **/
      private GotoEventSource goto_event_source;
    
      /**
       *  This is a reference to the parent Container of this BasePlot object.
       **/
      private Component owning_component;
    }