Skip to content
Snippets Groups Projects
ValidateViewer.java 8.1 KiB
Newer Older
  • Learn to ignore specific revisions
  • tcarver's avatar
    tcarver committed
    /* ValidateViewer
     *
     * created: 2013
     *
     * This file is part of Artemis
     *
     * Copyright(C) 2013 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.
     *
     */
    
    tcarver's avatar
    tcarver committed
    package uk.ac.sanger.artemis.components;
    
    
    import java.awt.GridLayout;
    
    tcarver's avatar
    tcarver committed
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    
    tcarver's avatar
    tcarver committed
    import java.awt.event.ItemEvent;
    import java.awt.event.ItemListener;
    
    tcarver's avatar
    tcarver committed
    
    import javax.swing.JButton;
    
    tcarver's avatar
    tcarver committed
    import javax.swing.JCheckBox;
    
    import javax.swing.JOptionPane;
    import javax.swing.JPanel;
    import javax.swing.SwingUtilities;
    
    tcarver's avatar
    tcarver committed
    
    import uk.ac.sanger.artemis.EntryGroup;
    import uk.ac.sanger.artemis.EntryGroupChangeEvent;
    import uk.ac.sanger.artemis.EntryGroupChangeListener;
    
    tcarver's avatar
    tcarver committed
    import uk.ac.sanger.artemis.Feature;
    
    import uk.ac.sanger.artemis.FeatureChangeEvent;
    import uk.ac.sanger.artemis.FeatureChangeListener;
    
    tcarver's avatar
    tcarver committed
    import uk.ac.sanger.artemis.FeatureVector;
    import uk.ac.sanger.artemis.components.genebuilder.GeneUtils;
    import uk.ac.sanger.artemis.io.ChadoCanonicalGene;
    
    tcarver's avatar
    tcarver committed
    import uk.ac.sanger.artemis.io.EntryInformationException;
    
    tcarver's avatar
    tcarver committed
    import uk.ac.sanger.artemis.io.GFFStreamFeature;
    
    tcarver's avatar
    tcarver committed
    import uk.ac.sanger.artemis.io.Qualifier;
    
    tcarver's avatar
    tcarver committed
    import uk.ac.sanger.artemis.io.ValidateFeature;
    
    import uk.ac.sanger.artemis.util.ReadOnlyException;
    
    tcarver's avatar
    tcarver committed
    
    
    
    tcarver's avatar
    tcarver committed
    public class ValidateViewer extends FileViewer implements EntryGroupChangeListener
    
    tcarver's avatar
    tcarver committed
    {
      private static final long serialVersionUID = 1L;
      private EntryGroup entryGrp;
    
      private FeatureVector selectedFeatures;
    
    tcarver's avatar
    tcarver committed
      private JCheckBox showFailedFeatures = new JCheckBox("Show only failed features", true);
    
      private boolean inAutoFix = false;
    
    tcarver's avatar
    tcarver committed
      private String seqName;
      
      public ValidateViewer(final EntryGroup entryGrp,
                            final FeatureVector selectedFeatures)
      {
        this(entryGrp, selectedFeatures, null);
      }
      
    
      /**
       * Viewer to display validation results
       * @param entryGrp
       * @param features
       */
      public ValidateViewer(final EntryGroup entryGrp,
    
    tcarver's avatar
    tcarver committed
                            final FeatureVector selectedFeatures,
                            final String seqName)
    
    tcarver's avatar
    tcarver committed
      {
    
    tcarver's avatar
    tcarver committed
        super("Validation Report :: "+ (seqName!=null? seqName:""), false, false, true);
    
    tcarver's avatar
    tcarver committed
        this.entryGrp = entryGrp;
    
        this.selectedFeatures = selectedFeatures;
    
    tcarver's avatar
    tcarver committed
        this.seqName = seqName;
    
    tcarver's avatar
    tcarver committed
        //final boolean allFeatures = (selectedFeatures == null);
    
    tcarver's avatar
    tcarver committed
    
    
        update();
    
    tcarver's avatar
    tcarver committed
        setVisible(true);
    
    tcarver's avatar
    tcarver committed
    
    
        final JButton fixButton = new JButton("Auto-Fix");
        fixButton.addActionListener(new ActionListener() 
    
    tcarver's avatar
    tcarver committed
        {
    
          public void actionPerformed(ActionEvent e) 
    
    tcarver's avatar
    tcarver committed
          {
    
    tcarver's avatar
    tcarver committed
            final JPanel options = new JPanel( new GridLayout(3,1) );
    
            final JCheckBox extendToNextStop = new JCheckBox("Fix stop codon", true);
            options.add(extendToNextStop);
            final JCheckBox boundary = new JCheckBox("Gene Model boundaries", true);
            options.add(boundary);
    
    tcarver's avatar
    tcarver committed
            final JCheckBox cdsPhase = new JCheckBox("CDS phase", true);
            options.add(cdsPhase);
    
            if( entryGrp != null && !GeneUtils.isGFFEntry( entryGrp ) )
    
    tcarver's avatar
    tcarver committed
            {
    
              boundary.setSelected(false);
              boundary.setEnabled(false);
    
    tcarver's avatar
    tcarver committed
              cdsPhase.setSelected(false);
              cdsPhase.setEnabled(false);
            }
            
            if(GeneUtils.isDatabaseEntry(entryGrp))
            {
              cdsPhase.setSelected(false);
              cdsPhase.setEnabled(false);
    
            }
            
            int status = 
                JOptionPane.showConfirmDialog(ValidateViewer.this, options, 
                    "Auto-Fix", JOptionPane.OK_CANCEL_OPTION);
            if(status == JOptionPane.CANCEL_OPTION)
              return;
              
            try
            {
              ValidateFeature validate = new ValidateFeature(entryGrp);
              entryGrp.getActionController().startAction();
              inAutoFix = true;
              final FeatureVector features = getFeatures();
              for(int i=0; i<features.size(); i++)
    
    tcarver's avatar
    tcarver committed
              {
    
                final Feature f = features.elementAt(i);
                if( extendToNextStop.isSelected() && 
                    !validate.hasValidStop(f.getEmblFeature()) )
                  f.fixStopCodon();
                
                if(boundary.isSelected())
                  fixBoundary(f);
    
    tcarver's avatar
    tcarver committed
                
                if(cdsPhase.isSelected())
                  fixCDSPhase(f);
    
    tcarver's avatar
    tcarver committed
              }
    
    tcarver's avatar
    tcarver committed
            }
    
            catch (ReadOnlyException e1)
            {
              JOptionPane.showMessageDialog(ValidateViewer.this, 
                  "Read only entry", "Error", JOptionPane.ERROR_MESSAGE);
            }
            finally
            {
              inAutoFix = false;
              entryGrp.getActionController().endAction();
              update();
            }
          }
        });
    
    tcarver's avatar
    tcarver committed
        
        if(entryGrp.getDefaultEntry().isReadOnly())
          fixButton.setEnabled(false);
    
        button_panel.add(fixButton);
    
    
    tcarver's avatar
    tcarver committed
        
        button_panel.add(showFailedFeatures);
        showFailedFeatures.addItemListener(new ItemListener(){
          public void itemStateChanged(ItemEvent arg0)
          {
    
            update();
    
    tcarver's avatar
    tcarver committed
          }
        });
        
    
    tcarver's avatar
    tcarver committed
        entryGrp.addEntryGroupChangeListener(new EntryGroupChangeListener(){
          public void entryGroupChanged(EntryGroupChangeEvent event)
          {
            switch(event.getType())
            {
              case EntryGroupChangeEvent.DONE_GONE:
                entryGrp.removeEntryGroupChangeListener(this);
                dispose();
                break;
            }
          }
        });
    
        
        entryGrp.addFeatureChangeListener(new FeatureChangeListener(){
          public void featureChanged(FeatureChangeEvent event)
          {
            if(inAutoFix)
              return;
    
            inAutoFix = true;
            ValidateViewer.this.selectedFeatures = null;
    
            SwingUtilities.invokeLater(new Runnable() 
            {
              public void run() 
              {
                update();
                inAutoFix = false;
              }
            });
          }
        });
    
    tcarver's avatar
    tcarver committed
      }
      
    
      private void update()
    
    tcarver's avatar
    tcarver committed
      {
    
        final FeatureVector features = getFeatures();
    
    tcarver's avatar
    tcarver committed
        super.setText("");
        final ValidateFeature gffTest = new ValidateFeature(entryGrp);
    
    tcarver's avatar
    tcarver committed
        int nfail = 0;
    
    tcarver's avatar
    tcarver committed
        for(int i=0; i<features.size(); i++)
    
    tcarver's avatar
    tcarver committed
        {
          if(!gffTest.featureValidate(features.elementAt(i).getEmblFeature(), 
              this, showFailedFeatures.isSelected()))
            nfail++;
        }
    
    tcarver's avatar
    tcarver committed
        setTitle("Validation Report :: "+ (seqName!=null? seqName:"")+ " :: "+features.size()+
    
    tcarver's avatar
    tcarver committed
            " feature(s) Pass: "+(features.size()-nfail)+" Failed: "+nfail);
    
    tcarver's avatar
    tcarver committed
      }
      
    
      private FeatureVector getFeatures()
      {
        if(selectedFeatures == null)
          selectedFeatures = entryGrp.getAllFeatures();
        return selectedFeatures;
      }
    
    
    tcarver's avatar
    tcarver committed
      private void fixCDSPhase(final Feature feature) throws ReadOnlyException
      {
        if( !(feature.getEmblFeature() instanceof GFFStreamFeature) ||
            GeneUtils.isDatabaseEntry(entryGrp) ||
            !feature.isCDS())
          return;
        
        final GFFStreamFeature gffFeature = (GFFStreamFeature) feature.getEmblFeature();
        if(ValidateFeature.isCDSPhaseOK(gffFeature))
          return;
        
        Qualifier q = new Qualifier("codon_start", "1");
        try
        {
          gffFeature.setQualifier(q);
        }
        catch (EntryInformationException e)
        {
          e.printStackTrace();
        }
      }
      
    
    tcarver's avatar
    tcarver committed
      private void fixBoundary(final Feature feature)
    
    tcarver's avatar
    tcarver committed
      {
    
    tcarver's avatar
    tcarver committed
        if( ! (feature.getEmblFeature() instanceof GFFStreamFeature) )
          return;
        
        final GFFStreamFeature gffFeature = (GFFStreamFeature) feature.getEmblFeature();
    
    tcarver's avatar
    tcarver committed
        final ChadoCanonicalGene gene = gffFeature.getChadoGene();
        if(gene != null && !gene.getGene().isReadOnly() && GeneUtils.isBoundaryOK(gene) > 0)
        {
    
    tcarver's avatar
    tcarver committed
          //updatedFeatures.add(feature);
    
    tcarver's avatar
    tcarver committed
          
    
    tcarver's avatar
    tcarver committed
          GeneUtils.checkGeneBoundary(gene, false);
    
    tcarver's avatar
    tcarver committed
        }
      }
    
      public void entryGroupChanged(EntryGroupChangeEvent event)
      {
        entryGrp.removeEntryGroupChangeListener(ValidateViewer.this);
        dispose();
      }
    }