/* GeneUtils.java * * 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; import java.awt.BorderLayout; import java.awt.Cursor; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.Collection; import java.util.Enumeration; import java.util.Hashtable; import java.util.Iterator; import java.util.List; import java.util.Set; import java.util.Vector; import javax.swing.Box; import javax.swing.DefaultListModel; import javax.swing.JButton; import javax.swing.JCheckBox; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JList; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.JScrollPane; import org.gmod.schema.general.DbXRef; import org.gmod.schema.sequence.FeatureCvTerm; import org.gmod.schema.sequence.FeatureDbXRef; import org.gmod.schema.sequence.FeaturePub; import org.gmod.schema.sequence.FeatureSynonym; import uk.ac.sanger.artemis.chado.ClusterLazyQualifierValue; import uk.ac.sanger.artemis.chado.FeatureForUpdatingResidues; import uk.ac.sanger.artemis.chado.FeatureLocLazyQualifierValue; import uk.ac.sanger.artemis.components.EditMenu; import uk.ac.sanger.artemis.components.MessageDialog; import uk.ac.sanger.artemis.components.SelectionMenu; import uk.ac.sanger.artemis.io.ChadoCanonicalGene; import uk.ac.sanger.artemis.io.DatabaseDocumentEntry; import uk.ac.sanger.artemis.io.DatabaseInferredFeature; import uk.ac.sanger.artemis.io.DocumentEntry; import uk.ac.sanger.artemis.io.EntryInformationException; import uk.ac.sanger.artemis.io.Feature; import uk.ac.sanger.artemis.io.GFF3Encoder; import uk.ac.sanger.artemis.io.GFFDocumentEntry; import uk.ac.sanger.artemis.io.GFFStreamFeature; import uk.ac.sanger.artemis.io.InvalidRelationException; import uk.ac.sanger.artemis.io.Key; import uk.ac.sanger.artemis.io.KeyVector; import uk.ac.sanger.artemis.io.Location; import uk.ac.sanger.artemis.io.Qualifier; import uk.ac.sanger.artemis.io.QualifierLazyLoading; import uk.ac.sanger.artemis.io.QualifierVector; import uk.ac.sanger.artemis.io.Range; import uk.ac.sanger.artemis.io.RangeVector; import uk.ac.sanger.artemis.sequence.MarkerRange; import uk.ac.sanger.artemis.util.ByteBuffer; import uk.ac.sanger.artemis.util.DatabaseDocument; import uk.ac.sanger.artemis.util.OutOfRangeException; import uk.ac.sanger.artemis.util.ReadOnlyException; import uk.ac.sanger.artemis.util.StringVector; import uk.ac.sanger.artemis.Entry; import uk.ac.sanger.artemis.EntryGroup; import uk.ac.sanger.artemis.EntryVector; import uk.ac.sanger.artemis.FeatureKeyQualifierPredicate; import uk.ac.sanger.artemis.FeaturePredicate; import uk.ac.sanger.artemis.FeatureVector; import uk.ac.sanger.artemis.GotoEventSource; import uk.ac.sanger.artemis.Options; import uk.ac.sanger.artemis.Selection; public class GeneUtils { private static Vector hideFeatures = new Vector(); private static JCheckBox showObsolete = new JCheckBox("Show Obsolete Features",false); private static String nonCodingTranscripts[] = { "tRNA", "rRNA", "snRNA", "snoRNA", "ncRNA", "scRNA" }; private static StringVector featuresToUpdateResidues = Options.getOptions().getOptionValues("sequence_update_features"); static { hideFeatures.add("polypeptide"); hideFeatures.add(DatabaseDocument.TRANSCRIPT); hideFeatures.add("pseudogenic_transcript"); } /** * Used when a whole sequence is loaded in and the features are loaded * lazily * @param feature */ public static void addLazyQualifiers(final GFFStreamFeature feature) { if(feature.isLazyLoaded() || feature.getChadoLazyFeature() == null) return; // synonyms final Collection featureSynonyms = feature.getChadoLazyFeature().getFeatureSynonyms(); final Iterator it = featureSynonyms.iterator(); while(it.hasNext()) { final FeatureSynonym featureSynonym = (FeatureSynonym) it.next(); final String name = featureSynonym.getSynonym().getCvTerm().getName(); String value = featureSynonym.getSynonym().getName(); if(!featureSynonym.isCurrent()) value.concat(GFF3Encoder.encode(";current=false")); Qualifier qualifier = feature.getQualifiers().getQualifierByName(name); if(qualifier == null) qualifier = new Qualifier(name, value); else qualifier.addValue(value); feature.getQualifiers().setQualifier(qualifier); } // dbxrefs if(feature.getQualifierByName("Dbxref") == null) { DbXRef dbxref = feature.getChadoLazyFeature().getDbXRef(); if(dbxref != null) { String value = dbxref.getDb().getName() + ":" + dbxref.getAccession(); feature.getQualifiers().setQualifier(new Qualifier("Dbxref", value)); if(feature.isReadOnly() && feature.getKey().equals("polypeptide_domain")) { value= "protein motif:"+value; feature.getQualifiers().setQualifier(new Qualifier("inference", value)); } } } final Collection featureDbXRefs = feature.getChadoLazyFeature().getFeatureDbXRefs(); final Iterator it2 = featureDbXRefs.iterator(); while(it2.hasNext()) { final FeatureDbXRef featureDbXRef = (FeatureDbXRef) it2.next(); String value = featureDbXRef.getDbXRef().getDb().getName() + ":" + featureDbXRef.getDbXRef().getAccession(); Qualifier qualifier = feature.getQualifiers().getQualifierByName("Dbxref"); if(qualifier == null) qualifier = new Qualifier("Dbxref", value); else qualifier.addValue(value); feature.getQualifiers().setQualifier(qualifier); } // feature cvterms (GO, product....) final Collection featureCvTerms = feature.getChadoLazyFeature().getFeatureCvTerms(); if(featureCvTerms != null) { final Iterator it3 = featureCvTerms.iterator(); while(it3.hasNext()) { FeatureCvTerm featureCvTerm = (FeatureCvTerm)it3.next(); List featureCvTermDbXRefList = null; if(featureCvTerm.getFeatureCvTermDbXRefs() != null) featureCvTermDbXRefList = new Vector(featureCvTerm.getFeatureCvTermDbXRefs()); List featureCvTermPubList = null; if(featureCvTerm.getFeatureCvTermPubs() != null) featureCvTermPubList = new Vector(featureCvTerm.getFeatureCvTermPubs()); ByteBuffer this_buff = new ByteBuffer(); DatabaseDocument.appendControlledVocabulary(this_buff, null, featureCvTerm, featureCvTermDbXRefList,featureCvTermPubList, null, false); final String qualifierString = new String(this_buff.getBytes()); int ind = qualifierString.indexOf('='); final String name = qualifierString.substring(0, ind); final String value = GFF3Encoder.decode( qualifierString.substring(ind+1, qualifierString.length()-1)); Qualifier qualifier = feature.getQualifiers().getQualifierByName(name); if(qualifier == null) qualifier = new Qualifier(name, value); else qualifier.addValue(value); feature.getQualifiers().setQualifier(qualifier); } } // feature pubs - literature final Collection featurePubs = feature.getChadoLazyFeature().getFeaturePubs(); if(featurePubs != null) { final Iterator it4 = featurePubs.iterator(); while(it4.hasNext()) { FeaturePub featurePub = (FeaturePub) it4.next(); Qualifier qualifier = feature.getQualifiers().getQualifierByName( "literature"); if(qualifier == null) qualifier = new Qualifier("literature", featurePub.getPub() .getUniqueName()); else qualifier.addValue(featurePub.getPub().getUniqueName()); feature.getQualifiers().setQualifier(qualifier); } } feature.setLazyLoaded(true); } /** * Used to reverse complement all the gene model features * @param chadoGene */ public static void complementGeneModel(final ChadoCanonicalGene chadoGene) { if(chadoGene == null) return; try { final Feature gene = chadoGene.getGene(); final boolean complement = gene.getLocation().isComplement(); gene.setLocation(gene.getLocation().getComplement()); final Set kids = chadoGene.getChildren(gene); final Iterator it = kids.iterator(); while(it.hasNext()) { final Feature f = (Feature)it.next(); final RangeVector rv = f.getLocation().getRanges(); rv.reverse(); f.setLocation(new Location(rv, !complement)); } } catch(ReadOnlyException e) { e.printStackTrace(); } catch(OutOfRangeException e) { e.printStackTrace(); } } public static void addSegment(final GFFStreamFeature feature, final RangeVector rangesToAdd, final String transcriptName) throws ReadOnlyException, EntryInformationException { // add new ID final Hashtable id_store = feature.getSegmentRangeStore(); String prefix[] = null; Enumeration enum_ids = id_store.keys(); while(enum_ids.hasMoreElements()) { String id = (String) enum_ids.nextElement(); prefix = feature.getPrefix(id, ':'); if(prefix[0] != null) break; } // USE PREFIX TO CREATE NEW ID RangeVector rv = (RangeVector)feature.getLocation().getRanges().clone(); for(int i=0; i 0 || lazyClusterValues.size() > 0) { int n = JOptionPane.YES_OPTION; if(parent != null) n = JOptionPane.showConfirmDialog(parent, "Load and write to file all qualifers from the database?"+ "\nThis may take a few minutes.", "Load All Data", JOptionPane.YES_NO_OPTION); if(n == JOptionPane.YES_OPTION) { if(parent != null) parent.setCursor(new Cursor(Cursor.WAIT_CURSOR)); final DatabaseDocument document = (DatabaseDocument)((DocumentEntry)entry.getEMBLEntry()).getDocument(); if(lazySimilarityValues.size() > 0) FeatureLocLazyQualifierValue.bulkRetrieve(lazySimilarityValues,document); if(lazyClusterValues.size() > 0) ClusterLazyQualifierValue.setClusterFromValueList(lazyClusterValues, document); for(int i=0; i