+ private HashMap<SeqIdName, List<SequenceI>> names;
+
+ private Map<SeqIdName, List<SequenceI>> excludes;
+
+ public SequenceIdMatcher(List<SequenceI> seqs)
+ {
+ names = new HashMap<>();
+ excludes = new HashMap<>();
+ addAll(seqs);
+ }
+
+ /**
+ * Adds sequences to this matcher
+ *
+ * @param seqs
+ */
+ public void addAll(List<SequenceI> seqs)
+ {
+ for (SequenceI seq : seqs)
+ {
+ add(seq);
+ }
+ }
+
+ /**
+ * Adds one sequence to this matcher
+ *
+ * @param seq
+ */
+ public void add(SequenceI seq)
+ {
+ SeqIdName key = new SeqIdName(seq.getDisplayId(true));
+ addMatchCandidate(key, seq);
+ SequenceI dbseq = seq;
+ while (dbseq.getDatasetSequence() != null)
+ {
+ dbseq = dbseq.getDatasetSequence();
+ }
+ // add in any interesting identifiers
+ if (dbseq.getDBRefs() != null)
+ {
+ DBRefEntry dbr[] = dbseq.getDBRefs();
+ for (int r = 0; r < dbr.length; r++)
+ {
+ DBRefEntry dbref = dbr[r];
+ SeqIdName sid = new SeqIdName(dbref.getAccessionId());
+ if (dbref.getMap() != null
+ && dbref.getMap().getMap().isTripletMap())
+ {
+ /*
+ * dbref with 3:1 or 1:3 mapping (e.g. CDS/protein);
+ * mark as not a valid match for this id
+ */
+ List<SequenceI> excluded = excludes.get(sid);
+ if (excluded == null)
+ {
+ excludes.put(sid, excluded = new ArrayList<>());
+ }
+ excluded.add(seq);
+ System.out.println("Excluding " + sid + "->" + seq);
+ continue;
+ }
+ addMatchCandidate(sid, seq);
+ }
+ }
+ }