X-Git-Url: http://source.jalview.org/gitweb/?a=blobdiff_plain;f=src%2Fjalview%2Fanalysis%2FCrossRef.java;h=83317c19ece9cda1cd7f1b323b2e304f38593883;hb=17e77c3f2949a0729322b4a8d907f3f34b6a9914;hp=17658b3aba7f3073be7b39e11f4a5c091fad62d5;hpb=865a855a4ca87eadb3e5ff284ed32ed307d9c34b;p=jalview.git diff --git a/src/jalview/analysis/CrossRef.java b/src/jalview/analysis/CrossRef.java index 17658b3..83317c1 100644 --- a/src/jalview/analysis/CrossRef.java +++ b/src/jalview/analysis/CrossRef.java @@ -1,38 +1,40 @@ /* - * Jalview - A Sequence Alignment Editor and Viewer (Version 2.8.0b1) - * Copyright (C) 2014 The Jalview Authors + * Jalview - A Sequence Alignment Editor and Viewer (Version 2.9) + * Copyright (C) 2015 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.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) @@ -43,39 +45,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) + public static DBRefEntry[] findXDbRefs(boolean fromDna, DBRefEntry[] refs) { - 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) - { - 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) } /** @@ -102,12 +87,11 @@ public class CrossRef SequenceI[] seqs, AlignmentI dataset) { String[] dbrefs = null; - Vector refs = new Vector(); + List refs = new ArrayList(); for (int s = 0; s < seqs.length; s++) { if (seqs[s] != null) { - SequenceI dss = seqs[s]; while (dss.getDatasetSequence() != null) { @@ -118,7 +102,7 @@ public class CrossRef { if (!refs.contains(rfs[r].getSource())) { - refs.addElement(rfs[r].getSource()); + refs.add(rfs[r].getSource()); } } if (dataset != null) @@ -126,19 +110,17 @@ public class CrossRef // search for references to this sequence's direct references. DBRefEntry[] lrfs = CrossRef .findXDbRefs(!dna, seqs[s].getDBRef()); - Vector rseqs = new Vector(); + List rseqs = new ArrayList(); CrossRef.searchDatasetXrefs(seqs[s], !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()); + DBRefEntry[] xrs = findXDbRefs(dna, rs.getDBRef()); // not used?? for (int r = 0; rfs != null && r < rfs.length; r++) { if (!refs.contains(rfs[r].getSource())) { - refs.addElement(rfs[r].getSource()); + refs.add(rfs[r].getSource()); } } } @@ -148,7 +130,7 @@ public class CrossRef if (refs.size() > 0) { dbrefs = new String[refs.size()]; - refs.copyInto(dbrefs); + refs.toArray(dbrefs); } return dbrefs; } @@ -226,9 +208,9 @@ public class CrossRef public static Alignment findXrefSequences(SequenceI[] seqs, boolean dna, String source, AlignmentI dataset) { - Vector rseqs = new Vector(); + List rseqs = new ArrayList(); Alignment ral = null; - AlignedCodonFrame cf = new AlignedCodonFrame(0); // nominal width + AlignedCodonFrame cf = new AlignedCodonFrame(); // nominal width for (int s = 0; s < seqs.length; s++) { SequenceI dss = seqs[s]; @@ -241,14 +223,8 @@ 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. + DBRefEntry[] lrfs = CrossRef.findXDbRefs(!dna, seqs[s].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); @@ -256,13 +232,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()) { @@ -289,7 +267,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. + } } } } @@ -326,7 +306,9 @@ public class CrossRef for (int r = 0; r < xrfs.length; r++) { if (xrfs[r] != null) + { t[l++] = xrfs[r]; + } } xrfs = t; try @@ -393,7 +375,7 @@ public class CrossRef } } retrieved[rs].updatePDBIds(); - rseqs.addElement(retrieved[rs]); + rseqs.add(retrieved[rs]); } } } @@ -403,7 +385,7 @@ public class CrossRef 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) { @@ -425,12 +407,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]); @@ -455,7 +439,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); } @@ -476,13 +460,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"); @@ -492,6 +478,7 @@ public class CrossRef synchronized (ds = dataset.getSequences()) { for (SequenceI nxt : ds) + { if (nxt != null) { if (nxt.getDatasetSequence() != null) @@ -527,10 +514,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()) @@ -564,6 +550,7 @@ public class CrossRef } } + } } return found; }