Skip to content
Snippets Groups Projects
GoBox.java 12.6 KiB
Newer Older
  • Learn to ignore specific revisions
  • tjc's avatar
    tjc committed
    /* GoBox.java
     *
     * created: 2007
     *
     * This file is part of Artemis
     *
     * Copyright (C) 2007  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.
     *
     **/
    
    package uk.ac.sanger.artemis.components.genebuilder.cv;
    
    
    tjc's avatar
    tjc committed
    import java.awt.Color;
    
    tjc's avatar
    tjc committed
    import java.awt.Dimension;
    
    tjc's avatar
    tjc committed
    import java.awt.Font;
    
    tjc's avatar
    tjc committed
    import java.util.Vector;
    
    import javax.swing.Box;
    import javax.swing.JLabel;
    import javax.swing.JTextField;
    
    import org.gmod.schema.cv.CvTerm;
    
    
    tjc's avatar
    tjc committed
    import uk.ac.sanger.artemis.components.genebuilder.JExtendedComboBox;
    
    tjc's avatar
    tjc committed
    import uk.ac.sanger.artemis.components.Splash;
    import uk.ac.sanger.artemis.io.Qualifier;
    import uk.ac.sanger.artemis.io.QualifierVector;
    import uk.ac.sanger.artemis.util.DatabaseDocument;
    import uk.ac.sanger.artemis.util.StringVector;
    
    
    tjc's avatar
    tjc committed
    public class GoBox extends AbstractCvBox
    
    tjc's avatar
    tjc committed
    {
      protected static String[][] evidenceCodes = 
      { 
    
    tjc's avatar
    tjc committed
         {"EXP", "IC", "IDA", "IEA", "IEP", "IGC", "IGI", 
          "IMP", "IPI", "ISA", "ISM", "ISO", "ISS", 
    
    tjc's avatar
    tjc committed
          "NAS", "ND", "RCA", "TAS", "NR" }, 
    
    tjc's avatar
    tjc committed
         {"EXP\t:: inferred from experiment",
          "IC \t:: inferred by curator",
    
          "IDA\t:: inferred from direct assay",
          "IEA\t:: inferred from electronic annotation",
          "IEP\t:: inferred from expression pattern",
    
    tjc's avatar
    tjc committed
          "IGC\t:: inferred from genomic context",
    
          "IGI\t:: inferred from genetic interaction",
          "IMP\t:: inferred from mutant phenotype",
          "IPI\t:: inferred from physical interaction",
    
    tjc's avatar
    tjc committed
          "ISA\t:: inferred from sequence alignment",
          "ISM\t:: inferred from sequence model",
          "ISO\t:: inferred from sequence ontology",
    
          "ISS\t:: inferred from sequence or structural similarity",
          "NAS\t:: non-traceable author statement",
          "ND \t:: no biological data available",
          "RCA\t:: inferred from reviewed computational analysis",
          "TAS\t:: traceable author statement",
          "NR \t:: not recorded"},
    
    tjc's avatar
    tjc committed
          { "inferred from experiment",
            "inferred by curator",
    
            "inferred from direct assay",
            "inferred from electronic annotation",
            "inferred from expression pattern",
    
    tjc's avatar
    tjc committed
            "inferred from genomic context",
    
            "inferred from genetic interaction",
            "inferred from mutant phenotype",
            "inferred from physical interaction",
    
    tjc's avatar
    tjc committed
            "inferred from sequence alignment",
            "inferred from sequence model",
            "inferred from sequence ontology",
    
            "inferred from sequence or structural similarity",
            "non-traceable author statement",
            "no biological data available",
            "inferred from reviewed computational analysis",
            "traceable author statement",
            "not recorded"}
    
    tjc's avatar
    tjc committed
      };
      
      private Dimension go_dimension;
    
    tjc's avatar
    tjc committed
      private static Dimension evidenceListDimension;
      
    
    tjc's avatar
    tjc committed
      private Box xBox;
      private int value_index;
      private JTextField withTextField;
      private JTextField dbxrefTextField;
      private JExtendedComboBox evidenceList;
      private JTextField qualfTextField;
    
    tjc's avatar
    tjc committed
      private DatePanel dateField;
    
    tjc's avatar
    tjc committed
      private String origQualifierString;
      private Qualifier origQualifier;
      
      protected GoBox(final Qualifier qualifier,
                      final String qualifierString,
                      final int value_index,
                      Dimension go_dimension, final Dimension dimension)
      {
        this.origQualifier = qualifier;
        this.origQualifierString = qualifierString;
        this.go_dimension = go_dimension;
        this.value_index  = value_index;
        this.xBox = Box.createHorizontalBox();
        
        Vector editable = new Vector(5);
        
        String goId = getField("GOid=", qualifierString);
        final String term = getField("term=", qualifierString);
        CvTerm cvTerm = DatabaseDocument.getCvTermByCvTermName(term);
    
    
    tjc's avatar
    tjc committed
        JLabel goTermField = new JLabel(goId);
        JLabel goAspect = null;
        
        Font font = goTermField.getFont().deriveFont(Font.BOLD);
        
    
    tjc's avatar
    tjc committed
        if(cvTerm.getCv().getName().indexOf("molecular_function")>-1)
    
    tjc's avatar
    tjc committed
        {
          goAspect = new JLabel(" [F] ");
          goAspect.setForeground(Color.RED);
          goAspect.setFont(font);
        }
    
    tjc's avatar
    tjc committed
        else if(cvTerm.getCv().getName().indexOf("biological_process")>-1)
    
    tjc's avatar
    tjc committed
        {
          goAspect = new JLabel(" [P] ");
          goAspect.setForeground(Color.GREEN);
          goAspect.setFont(font);
        }
    
    tjc's avatar
    tjc committed
        else if(cvTerm.getCv().getName().indexOf("cellular_component")>-1)
    
    tjc's avatar
    tjc committed
        {
          goAspect = new JLabel(" [C] ");
          goAspect.setForeground(Color.BLUE);
          goAspect.setFont(font);
        }
    
    tjc's avatar
    tjc committed
        else
        {
          goAspect = new JLabel(" [?] ");
          goAspect.setForeground(Color.BLACK);
          goAspect.setFont(font);
        }
    
    tjc's avatar
    tjc committed
        
        if(go_dimension == null)
    
    tjc's avatar
    tjc committed
          this.go_dimension = new Dimension(goTermField.getPreferredSize().width+
                                            goAspect.getPreferredSize().width,
    
    tjc's avatar
    tjc committed
                                            goTermField.getPreferredSize().height);
        goTermField.setToolTipText(term);
        xBox.add(goTermField);
    
    tjc's avatar
    tjc committed
        xBox.add(goAspect);
    
    tjc's avatar
    tjc committed
        
        // the WITH column is associated with one or more FeatureCvTermDbXRef
        String with = getField("with=", qualifierString);
        withTextField = new JTextField(with);
    
    tjc's avatar
    tjc committed
        withTextField.setToolTipText("with/from column");
    
    tjc's avatar
    tjc committed
        withTextField.setPreferredSize(dimension);
        withTextField.setMaximumSize(dimension);
        withTextField.setActionCommand("with=");
        editable.add(withTextField);
        xBox.add(withTextField);
     
    
        // N.B. for /GO the db_xref is a Pub (for primary pubs) 
        //      or FeatureCvTermPub (for others) in /GO
        String dbxref = getField("db_xref=", qualifierString);
        dbxrefTextField = new JTextField(dbxref);
        dbxrefTextField.setToolTipText("dbxref column");
        dbxrefTextField.setPreferredSize(dimension);
        dbxrefTextField.setMaximumSize(dimension);
        dbxrefTextField.setActionCommand("db_xref=");
        editable.add(dbxrefTextField);
        xBox.add(dbxrefTextField);
     
        // feature_cvterm_prop's
        String evidence = getField("evidence=", qualifierString);
        
        evidenceList = new JExtendedComboBox(evidenceCodes[1]);
    
    tjc's avatar
    tjc committed
        evidenceList.setOpaque(false);
    
    tjc's avatar
    tjc committed
        evidenceList.setToolTipText("evidence column");
    
        evidenceList.setSelectedIndex( getEvidenceIndex(evidence) );
    
    tjc's avatar
    tjc committed
      
    
    tjc's avatar
    tjc committed
        evidenceListDimension = evidenceList.getPreferredSize();
    
    tjc's avatar
    tjc committed
        evidenceListDimension = new Dimension(90,(int)evidenceListDimension.getHeight());
    
    tjc's avatar
    tjc committed
        evidenceList.setPreferredSize(evidenceListDimension);
        evidenceList.setMaximumSize(evidenceListDimension);
    
    tjc's avatar
    tjc committed
        evidenceList.setActionCommand("evidence=");
        editable.add(evidenceList);
        xBox.add(evidenceList);
        
        String qual = getField("qualifier=", qualifierString);
        qualfTextField = new JTextField(qual);      
        qualfTextField.setToolTipText("qualifier column");
        qualfTextField.setPreferredSize(dimension);
        qualfTextField.setMaximumSize(dimension);
        qualfTextField.setActionCommand("qualifier=");
        editable.add(qualfTextField);
        xBox.add(qualfTextField);
        
    
    tjc's avatar
    tjc committed
        dateField = new DatePanel( getField("date=", qualifierString), 
    
    tjc's avatar
    tjc committed
                                            dimension.height); 
    
    tjc's avatar
    tjc committed
        
    
    tjc's avatar
    tjc committed
        editable.add(dateField);
    
    tjc's avatar
    tjc committed
        xBox.add(dateField.getDateSpinner());
    
    tjc's avatar
    tjc committed
      }
      
    
    tjc's avatar
    tjc committed
      protected static int getEvidenceIndex(String evidence)
    
      {
        for(int i=0; i<evidenceCodes[2].length; i++)
        {
    
          // look for full text or abbreviation of the code
          if(evidenceCodes[2][i].equalsIgnoreCase(evidence) ||
             evidenceCodes[0][i].equalsIgnoreCase(evidence))
    
            return i;
        }
    
    tjc's avatar
    tjc committed
        
        // this is mainly to catch RCA
        // - reviewed computational analysis (inferred from missing)
        /*for(int i=0; i<evidenceCodes[2].length; i++)
        {
          if(evidenceCodes[2][i].indexOf(evidence) > -1)
            return i;
        }*/
    
    tjc's avatar
    tjc committed
      protected Dimension getGoDimension()
      {
        return go_dimension;
      }
      
      protected Box getBox()
      {
        return xBox;
      }
    
      protected boolean isQualifierChanged()
      {
        String old = getField("with=", origQualifierString);
        if(!old.equals(withTextField.getText().trim()))
          return true;
        
        old = getField("db_xref=", origQualifierString);
        if(!old.equals(dbxrefTextField.getText().trim()))
          return true;
        
        old = getField("evidence=", origQualifierString);
    
        
        if(evidenceList.getSelectedIndex() > -1 &&
           !old.equalsIgnoreCase(evidenceCodes[2][ evidenceList.getSelectedIndex() ]))
    
    tjc's avatar
    tjc committed
          return true;
        
        old = getField("qualifier=", origQualifierString);
        if(!old.equals(qualfTextField.getText()))
          return true;
        
        old = getField("date=", origQualifierString);
        if(!old.equals(dateField.getText()))
          return true;
        
        return false;
      }
      
      protected int getValueIndex()
      {
        return value_index;  
      }
      
      protected void updateQualifier(final QualifierVector qv)
      {
    
    tjc's avatar
    tjc committed
        int index = qv.indexOfQualifierWithName(origQualifier.getName());
        Qualifier newQualifier = qv.getQualifierByName(origQualifier.getName());
        
        final String goId = getField("GOid=", origQualifierString);
        
        StringVector values = newQualifier.getValues();
        
        int value_index = -10;
        
        for(int i=0; i<values.size(); i++)
        {
          String newGoId = getField("GOid=", (String)values.get(i));
          if(newGoId.equals(goId))
          {
            value_index = i;
            break;
          }
        }
        
        if(value_index > -1)
          values.remove(value_index);
        
    
    tjc's avatar
    tjc committed
        String updatedQualifierString = updateQualifierString();
        
        Splash.logger4j.debug(origQualifierString);
        Splash.logger4j.debug(updatedQualifierString);
        values.add(value_index, updatedQualifierString);
        
        origQualifier = new Qualifier(origQualifier.getName(), values);
        qv.remove(index);
        qv.add(index, origQualifier);
      }
      
      private String updateQualifierString()
      {
        String newQualifierString = origQualifierString;
        
        String old = getField("with=", origQualifierString);
        if(!old.equals(withTextField.getText().trim()))
        {
          newQualifierString = changeField("with=", withTextField.getText().trim(), 
                                           newQualifierString);
        }
        
        old = getField("db_xref=", origQualifierString);
        if(!old.equals(dbxrefTextField.getText().trim()))
    
    tjc's avatar
    tjc committed
        {    
    
    tjc's avatar
    tjc committed
          newQualifierString = changeField("db_xref=", dbxrefTextField.getText().trim(), 
                                           newQualifierString);
        }
        
        old = getField("evidence=", origQualifierString);
    
        if(!old.equals(evidenceCodes[2][ evidenceList.getSelectedIndex() ]))
    
    tjc's avatar
    tjc committed
        {
    
          newQualifierString = changeField("evidence=", evidenceCodes[2][ evidenceList.getSelectedIndex() ], 
    
    tjc's avatar
    tjc committed
                                           newQualifierString);
        }
        
        old = getField("qualifier=", origQualifierString);
        if(!old.equals(qualfTextField.getText()))
        {
          newQualifierString = changeField("qualifier=", qualfTextField.getText().trim(), 
                                           newQualifierString);
        }
        
        old = getField("date=", origQualifierString);
        if(!old.equals(dateField.getText()))
        {
          newQualifierString = changeField("date=", dateField.getText().trim(), 
                                           newQualifierString);
        }
        
        return newQualifierString;
      }
    
    tjc's avatar
    tjc committed
    
      public static Dimension getEvidenceListDimension()
      {
    
    tjc's avatar
    tjc committed
        if(evidenceListDimension == null)
        {
          JExtendedComboBox evidenceList = new JExtendedComboBox(evidenceCodes[1]);
          evidenceListDimension = evidenceList.getPreferredSize();
          evidenceListDimension = new Dimension(80,(int)evidenceListDimension.getHeight());
        }
        
    
    tjc's avatar
    tjc committed
        return evidenceListDimension;
      }
    
    tjc's avatar
    tjc committed
      
    
    tjc's avatar
    tjc committed
      /**
       * Given the string:
       * aspect=F;GOid=GO:0003674;term=molecular_function;evidence=No biological Data available
       * return the string:
       * aspect=F;GOid=GO:0003674;term=molecular_function;evidence=ND
       * @param goText
       * @return
       */
      public static String getEvidenceCodeGoTextFromText(String goText)
      {
        final String oldEvidence = getField("evidence=", goText); 
        String newEvidence = oldEvidence;
        
        for(int i=0; i<evidenceCodes[2].length; i++)
        {
          if(evidenceCodes[2][i].equalsIgnoreCase(oldEvidence.toLowerCase()))
          {
            newEvidence = evidenceCodes[0][i];
            break;
          }
        }
        
        if(!oldEvidence.equals(newEvidence))
          goText = goText.replaceAll(oldEvidence, newEvidence);
        return goText;
      }
      
    
    tjc's avatar
    tjc committed
    }