/** * Handle UTR joins * * @param feature * @param key * @param qualifiers * @return */ private Location joinUtrs(Feature feature, Key key, QualifierVector qualifiers) { Location location = feature.getLocation(); if (key.getKeyString().equals("5'UTR") || key.getKeyString().equals("3'UTR")) { ChadoCanonicalGene gene = ((GFFStreamFeature) feature).getChadoGene(); String utrName = GeneUtils.getUniqueName(feature); String transcriptName = gene.getTranscriptFromName(utrName); List<Feature> utrs; if (key.getKeyString().equals("5'UTR")) utrs = gene.get5UtrOfTranscript(transcriptName); else utrs = gene.get3UtrOfTranscript(transcriptName); if (utrs.size() > 1) { int start = Integer.MAX_VALUE; RangeVector ranges = new RangeVector(); for (int i = 0; i < utrs.size(); i++) { Feature utr = utrs.get(i); Range range = utr.getLocation().getTotalRange(); if (start > range.getStart()) start = range.getStart(); ranges.add(range); } if (start != feature.getLocation().getTotalRange().getStart()) return null; location = new Location(ranges, feature.getLocation().isComplement()); } int ntranscripts = gene.getTranscripts().size(); if (ntranscripts == 1) transcriptName = gene.getGeneUniqueName(); qualifiers.setQualifier(new Qualifier("locus_tag", transcriptName)); qualifiers.removeQualifierByName("ID"); } return location; }
/** * Create a new FeatureChangeEvent object. * * @param source The object that generated the event. * @param feature This Feature object that this event refers to. * @param key The key before the Feature changed or null if the key hasn't changed. * @param location The Location before the Feature changed or null if the location hasn't changed. * @param key The Qualifiers before the Feature changed or null if the qualifiers have't changed. * @param type This type of the event. */ public FeatureChangeEvent( Object source, Feature feature, Key old_key, Location old_location, QualifierVector old_qualifiers, int type) { super(source); this.feature = feature; this.type = type; this.old_key = old_key; this.old_location = old_location; this.old_qualifiers = old_qualifiers; this.new_key = feature.getKey(); this.new_location = feature.getLocation(); this.new_qualifiers = feature.getQualifiers(); }
/** * Map GFF features to EMBL/Genbank * * @param feature * @return */ private Object mapGffToNativeFeature(final Feature feature) { if (DATABASE_MAP_KEYS == null) initDatabaseMappings(); Key key = feature.getKey(); QualifierVector qualifiers = feature.getQualifiers().copy(); // ignore if obsolete if (IGNORE_OBSOLETE_FEATURES) { Qualifier isObsoleteQualifier = qualifiers.getQualifierByName("isObsolete"); if (isObsoleteQualifier != null) { String value = (String) isObsoleteQualifier.getValues().get(0); if (Boolean.parseBoolean(value)) return null; } } key = map(key, qualifiers); if (getEntryInformation().isValidQualifier((String) DATABASE_QUALIFIERS_TO_REMOVE[0])) { try { if (this instanceof EmblDocumentEntry) return new EmblStreamFeature(key, feature.getLocation(), qualifiers); else return new GenbankStreamFeature(key, feature.getLocation(), qualifiers); } catch (InvalidRelationException e) { // TODO Auto-generated catch block e.printStackTrace(); } } Location location = joinUtrs(feature, key, qualifiers); if (location == null) return null; // flatten gene model - combining qualifiers if (key.getKeyString().equals(DatabaseDocument.EXONMODEL)) { ChadoCanonicalGene chadoGene = ((GFFStreamFeature) feature).getChadoGene(); final String name = GeneUtils.getUniqueName(feature); final String transcriptName = chadoGene.getTranscriptFromName(name); StringVector sv = new StringVector(); sv.add(transcriptName); final Feature transcript = chadoGene.containsTranscript(sv); if (transcript != null && GeneUtils.isNonCodingTranscripts(transcript.getKey())) return null; qualifiers.removeQualifierByName("ID"); int ntranscripts = 0; // add transcript & protein qualifiers to CDS try { final Feature protein = chadoGene.getProteinOfTranscript(transcriptName); if (protein != null) combineQualifiers(qualifiers, protein.getQualifiers().copy(), false); if (transcript != null) ntranscripts = handleTranscripts(qualifiers, transcript, ntranscripts, chadoGene); } catch (NullPointerException npe) { } // add gene qualifiers to CDS QualifierVector geneQualifiers = chadoGene.getGene().getQualifiers().copy(); // multiple transcripts if (ntranscripts > 1 && geneQualifiers.getQualifierByName("ID") != null) { Qualifier newIDQualifier = new Qualifier( "shared_id", (String) geneQualifiers.getQualifierByName("ID").getValues().get(0)); addNewQualifier(qualifiers, newIDQualifier); geneQualifiers.removeQualifierByName("ID"); } combineQualifiers(qualifiers, geneQualifiers, true); } else if (GeneUtils.isNonCodingTranscripts(key)) { // use gene id for non-coding transcripts ChadoCanonicalGene chadoGene = ((GFFStreamFeature) feature).getChadoGene(); if (chadoGene != null) { qualifiers.removeQualifierByName("ID"); QualifierVector geneQualifiers = chadoGene.getGene().getQualifiers().copy(); combineQualifiers(qualifiers, geneQualifiers, true); } } try { for (int i = 0; i < DATABASE_QUALIFIERS_TO_MAP.length; i++) { if (!getEntryInformation().isValidQualifier(DATABASE_QUALIFIERS_TO_MAP[i][0])) { changeQualifierName( qualifiers, DATABASE_QUALIFIERS_TO_MAP[i][0], DATABASE_QUALIFIERS_TO_MAP[i][1]); } } if (qualifiers.getQualifierByName("stop_codon_redefined_as_selenocysteine") != null) { handleSelenocysteine(qualifiers, feature); } for (int i = 0; i < DATABASE_QUALIFIERS_TO_REMOVE.length; i++) { if (!getEntryInformation().isValidQualifier((String) DATABASE_QUALIFIERS_TO_REMOVE[i])) qualifiers.removeQualifierByName((String) DATABASE_QUALIFIERS_TO_REMOVE[i]); } if (key.getKeyString().equals("polypeptide")) return null; else if (key.getKeyString().equals("gene")) return null; else if (key.getKeyString().equals("centromere")) return null; else if (key.getKeyString().equals("transcript") || key.getKeyString().equals("mRNA")) return null; if (this instanceof EmblDocumentEntry) return new EmblStreamFeature(key, location, qualifiers); else return new GenbankStreamFeature(key, location, qualifiers); } catch (InvalidRelationException e) { e.printStackTrace(); if (feature instanceof DatabaseStreamFeature) return new EmblStreamFeature(); else return new GenbankStreamFeature(); } }