X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fanalysis%2FCrossRef.java;h=95d23964f2f88ca582278e734fe44d37a8a3d59e;hb=ef80b989a1f514d58980401ddefffd2c25299ef7;hp=09f1bc6073714251ce86b1d44f226957b299ed8a;hpb=59d682209891099d46b960509907c79e3fb276fe;p=jalview.git diff --git a/src/jalview/analysis/CrossRef.java b/src/jalview/analysis/CrossRef.java index 09f1bc6..95d2396 100644 --- a/src/jalview/analysis/CrossRef.java +++ b/src/jalview/analysis/CrossRef.java @@ -1,37 +1,41 @@ /* - * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8) - * Copyright (C) 2012 J Procter, AM Waterhouse, LM Lui, J Engelhardt, G Barton, M Clamp, S Searle + * Jalview - A Sequence Alignment Editor and Viewer ($$Version-Rel$$) + * Copyright (C) $$Year-Rel$$ The Jalview Authors * * This file is part of Jalview. * * Jalview 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 3 of the License, or (at your option) any later version. + * as published by the Free Software Foundation, either version 3 + * of the License, or (at your option) any later version. * * Jalview 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 Jalview. If not, see . + * You should have received a copy of the GNU General Public License + * along with Jalview. If not, see . + * The Jalview Authors are detailed in the 'AUTHORS' file. */ package jalview.analysis; -import java.util.Enumeration; -import java.util.List; -import java.util.Vector; -import java.util.Hashtable; - import jalview.datamodel.AlignedCodonFrame; import jalview.datamodel.Alignment; import jalview.datamodel.AlignmentI; -import jalview.datamodel.DBRefSource; import jalview.datamodel.DBRefEntry; +import jalview.datamodel.DBRefSource; +import jalview.datamodel.Mapping; import jalview.datamodel.Sequence; import jalview.datamodel.SequenceI; +import jalview.util.DBRefUtils; import jalview.ws.SequenceFetcher; import jalview.ws.seqfetcher.ASequenceFetcher; +import java.util.ArrayList; +import java.util.List; +import java.util.Vector; + /** * Functions for cross-referencing sequence databases. user must first specify * if cross-referencing from protein or dna (set dna==true) @@ -42,39 +46,22 @@ import jalview.ws.seqfetcher.ASequenceFetcher; public class CrossRef { /** - * get the DNA or protein references for a protein or dna sequence + * Select just the DNA or protein references for a protein or dna sequence * - * @param dna - * @param rfs + * @param fromDna + * if true, select references from DNA (i.e. Protein databases), else + * DNA database references + * @param refs + * a set of references to select from * @return */ - public static DBRefEntry[] findXDbRefs(boolean dna, DBRefEntry[] rfs) - { - if (dna) - { - rfs = jalview.util.DBRefUtils.selectRefs(rfs, DBRefSource.PROTEINDBS); - } - else - { - rfs = jalview.util.DBRefUtils.selectRefs(rfs, - DBRefSource.DNACODINGDBS); // could attempt to find other cross - // refs and return here - ie PDB xrefs - // (not dna, not protein seq) - } - return rfs; - } - - public static Hashtable classifyDbRefs(DBRefEntry[] rfs) + public static DBRefEntry[] findXDbRefs(boolean fromDna, DBRefEntry[] refs) { - Hashtable classes = new Hashtable(); - classes.put(DBRefSource.PROTEINDBS, - jalview.util.DBRefUtils.selectRefs(rfs, DBRefSource.PROTEINDBS)); - classes.put(DBRefSource.DNACODINGDBS, jalview.util.DBRefUtils - .selectRefs(rfs, DBRefSource.DNACODINGDBS)); - classes.put(DBRefSource.DOMAINDBS, - jalview.util.DBRefUtils.selectRefs(rfs, DBRefSource.DOMAINDBS)); - // classes.put(OTHER, ) - return classes; + return DBRefUtils.selectRefs(refs, fromDna ? DBRefSource.PROTEINDBS + : DBRefSource.DNACODINGDBS); + // could attempt to find other cross + // refs here - ie PDB xrefs + // (not dna, not protein seq) } /** @@ -101,45 +88,55 @@ public class CrossRef SequenceI[] seqs, AlignmentI dataset) { String[] dbrefs = null; - Vector refs = new Vector(); - for (int s = 0; s < seqs.length; s++) + List refs = new ArrayList(); + for (SequenceI seq : seqs) { - if (seqs[s] != null) + if (seq != null) { - - SequenceI dss = seqs[s]; + SequenceI dss = seq; while (dss.getDatasetSequence() != null) { dss = dss.getDatasetSequence(); } DBRefEntry[] rfs = findXDbRefs(dna, dss.getDBRef()); - for (int r = 0; rfs != null && r < rfs.length; r++) + if (rfs != null) { - if (!refs.contains(rfs[r].getSource())) + for (DBRefEntry ref : rfs) { - refs.addElement(rfs[r].getSource()); + if (!refs.contains(ref.getSource())) + { + refs.add(ref.getSource()); + } } } if (dataset != null) { // search for references to this sequence's direct references. - DBRefEntry[] lrfs = CrossRef - .findXDbRefs(!dna, seqs[s].getDBRef()); - Vector rseqs = new Vector(); - CrossRef.searchDatasetXrefs(seqs[s], !dna, lrfs, dataset, rseqs, + DBRefEntry[] lrfs = CrossRef.findXDbRefs(!dna, seq.getDBRef()); + List rseqs = new ArrayList(); + CrossRef.searchDatasetXrefs(seq, !dna, lrfs, dataset, rseqs, null); // don't need to specify codon frame for mapping here - Enumeration lr = rseqs.elements(); - while (lr.hasMoreElements()) + for (SequenceI rs : rseqs) { - SequenceI rs = (SequenceI) lr.nextElement(); DBRefEntry[] xrs = findXDbRefs(dna, rs.getDBRef()); - for (int r = 0; rfs != null && r < rfs.length; r++) + if (xrs != null) { - if (!refs.contains(rfs[r].getSource())) + for (DBRefEntry ref : xrs) { - refs.addElement(rfs[r].getSource()); + if (!refs.contains(ref.getSource())) + { + refs.add(ref.getSource()); + } } } + // looks like copy and paste - change rfs to xrs? + // for (int r = 0; rfs != null && r < rfs.length; r++) + // { + // if (!refs.contains(rfs[r].getSource())) + // { + // refs.add(rfs[r].getSource()); + // } + // } } } } @@ -147,18 +144,14 @@ public class CrossRef if (refs.size() > 0) { dbrefs = new String[refs.size()]; - refs.copyInto(dbrefs); + refs.toArray(dbrefs); } return dbrefs; } - /* - * if (dna) { if (rfs[r].hasMap()) { // most likely this is a protein cross - * reference if (!refs.contains(rfs[r].getSource())) { - * refs.addElement(rfs[r].getSource()); } } } - */ public static boolean hasCdnaMap(SequenceI[] seqs) { + // TODO unused - remove? String[] reftypes = findSequenceXrefTypes(false, seqs); for (int s = 0; s < reftypes.length; s++) { @@ -173,6 +166,7 @@ public class CrossRef public static SequenceI[] getCdnaMap(SequenceI[] seqs) { + // TODO unused - remove? Vector cseqs = new Vector(); for (int s = 0; s < seqs.length; s++) { @@ -216,7 +210,9 @@ public class CrossRef /** * * @param seqs + * sequences whose xrefs are being retrieved * @param dna + * true if sequences are nucleotide * @param source * @param dataset * alignment to search for product sequences. @@ -225,12 +221,11 @@ public class CrossRef public static Alignment findXrefSequences(SequenceI[] seqs, boolean dna, String source, AlignmentI dataset) { - Vector rseqs = new Vector(); - Alignment ral = null; - AlignedCodonFrame cf = new AlignedCodonFrame(0); // nominal width - for (int s = 0; s < seqs.length; s++) + List rseqs = new ArrayList(); + AlignedCodonFrame cf = new AlignedCodonFrame(); + for (SequenceI seq : seqs) { - SequenceI dss = seqs[s]; + SequenceI dss = seq; while (dss.getDatasetSequence() != null) { dss = dss.getDatasetSequence(); @@ -240,14 +235,9 @@ public class CrossRef if ((xrfs == null || xrfs.length == 0) && dataset != null) { System.out.println("Attempting to find ds Xrefs refs."); - DBRefEntry[] lrfs = CrossRef.findXDbRefs(!dna, seqs[s].getDBRef()); // less - // ambiguous - // would - // be a - // 'find - // primary - // dbRefEntry' - // method. + // FIXME should be dss not seq here? + DBRefEntry[] lrfs = CrossRef.findXDbRefs(!dna, seq.getDBRef()); + // less ambiguous would be a 'find primary dbRefEntry' method. // filter for desired source xref here found = CrossRef.searchDatasetXrefs(dss, !dna, lrfs, dataset, rseqs, cf); @@ -255,13 +245,15 @@ public class CrossRef for (int r = 0; xrfs != null && r < xrfs.length; r++) { if (source != null && !source.equals(xrfs[r].getSource())) + { continue; + } if (xrfs[r].hasMap()) { if (xrfs[r].getMap().getTo() != null) { - Sequence rsq = new Sequence(xrfs[r].getMap().getTo()); - rseqs.addElement(rsq); + SequenceI rsq = new Sequence(xrfs[r].getMap().getTo()); + rseqs.add(rsq); if (xrfs[r].getMap().getMap().getFromRatio() != xrfs[r] .getMap().getMap().getToRatio()) { @@ -288,7 +280,9 @@ public class CrossRef { found |= searchDataset(dss, xrfs[r], dataset, rseqs, cf); // ,false,!dna); if (found) + { xrfs[r] = null; // we've recovered seqs for this one. + } } } } @@ -325,7 +319,9 @@ public class CrossRef for (int r = 0; r < xrfs.length; r++) { if (xrfs[r] != null) + { t[l++] = xrfs[r]; + } } xrfs = t; try @@ -338,7 +334,7 @@ public class CrossRef { System.err .println("Problem whilst retrieving cross references for Sequence : " - + seqs[s].getName()); + + seq.getName()); e.printStackTrace(); } if (retrieved != null) @@ -346,15 +342,14 @@ public class CrossRef for (int rs = 0; rs < retrieved.length; rs++) { // TODO: examine each sequence for 'redundancy' - jalview.datamodel.DBRefEntry[] dbr = retrieved[rs] - .getDBRef(); + DBRefEntry[] dbr = retrieved[rs].getDBRef(); if (dbr != null && dbr.length > 0) { for (int di = 0; di < dbr.length; di++) { // find any entry where we should put in the sequence being // cross-referenced into the map - jalview.datamodel.Mapping map = dbr[di].getMap(); + Mapping map = dbr[di].getMap(); if (map != null) { if (map.getTo() != null && map.getMap() != null) @@ -392,17 +387,19 @@ public class CrossRef } } retrieved[rs].updatePDBIds(); - rseqs.addElement(retrieved[rs]); + rseqs.add(retrieved[rs]); } } } } } } + + Alignment ral = null; if (rseqs.size() > 0) { SequenceI[] rsqs = new SequenceI[rseqs.size()]; - rseqs.copyInto(rsqs); + rseqs.toArray(rsqs); ral = new Alignment(rsqs); if (cf != null && cf.getProtMappings() != null) { @@ -424,12 +421,14 @@ public class CrossRef * @return true if matches were found. */ private static boolean searchDatasetXrefs(SequenceI sequenceI, - boolean dna, DBRefEntry[] lrfs, AlignmentI dataset, Vector rseqs, - AlignedCodonFrame cf) + boolean dna, DBRefEntry[] lrfs, AlignmentI dataset, + List rseqs, AlignedCodonFrame cf) { boolean found = false; if (lrfs == null) + { return false; + } for (int i = 0; i < lrfs.length; i++) { DBRefEntry xref = new DBRefEntry(lrfs[i]); @@ -454,7 +453,7 @@ public class CrossRef * @return true if one or more unique sequences were found and added */ public static boolean searchDataset(SequenceI sequenceI, DBRefEntry xrf, - AlignmentI dataset, Vector rseqs, AlignedCodonFrame cf) + AlignmentI dataset, List rseqs, AlignedCodonFrame cf) { return searchDataset(sequenceI, xrf, dataset, rseqs, cf, true, false); } @@ -475,13 +474,15 @@ public class CrossRef * @return true if relationship found and sequence added. */ public static boolean searchDataset(SequenceI sequenceI, DBRefEntry xrf, - AlignmentI dataset, Vector rseqs, AlignedCodonFrame cf, + AlignmentI dataset, List rseqs, AlignedCodonFrame cf, boolean direct, boolean dna) { boolean found = false; SequenceI[] typer = new SequenceI[1]; if (dataset == null) + { return false; + } if (dataset.getSequences() == null) { System.err.println("Empty dataset sequence set - NO VECTOR"); @@ -491,6 +492,7 @@ public class CrossRef synchronized (ds = dataset.getSequences()) { for (SequenceI nxt : ds) + { if (nxt != null) { if (nxt.getDatasetSequence() != null) @@ -526,10 +528,9 @@ public class CrossRef { if (!rseqs.contains(nxt)) { - rseqs.addElement(nxt); - boolean foundmap = cf != null; // don't search if we aren't - // given - // a codon map object + rseqs.add(nxt); + boolean foundmap = cf != null; + // don't search if we aren't given a codon map object for (int r = 0; foundmap && r < cands.length; r++) { if (cands[r].hasMap()) @@ -563,6 +564,7 @@ public class CrossRef } } + } } return found; }