mappings.add(cdsToProteinMapping);
}
+ propagateDBRefsToCDS(cdsSeqDss, dnaSeq.getDatasetSequence(),
+ proteinProduct, aMapping);
/*
* add another mapping from original 'from' range to CDS
*/
SequenceI newSeq = new Sequence(seqId, newSeqChars, 1, newPos);
// newSeq.setDescription(mapFromId);
- propagateDBRefsToCDS(newSeq, seq, mapping);
-
return newSeq;
}
* @return list of DBRefEntrys added.
*/
public static List<DBRefEntry> propagateDBRefsToCDS(SequenceI cdsSeq,
- SequenceI contig, Mapping mapping)
+ SequenceI contig, SequenceI proteinProduct, Mapping mapping)
{
// gather direct refs from contig congrent with mapping
List<DBRefEntry> direct = new ArrayList<DBRefEntry>();
+ HashSet<String> directSources = new HashSet<String>();
if (contig.getDBRefs() != null)
{
for (DBRefEntry dbr : contig.getDBRefs())
if (mapping.getMap().equals(map))
{
direct.add(dbr);
+ directSources.add(dbr.getSource());
}
}
}
}
-
+ DBRefEntry[] onSource = DBRefUtils.selectRefs(
+ proteinProduct.getDBRefs(),
+ directSources.toArray(new String[0]));
List<DBRefEntry> propagated = new ArrayList<DBRefEntry>();
// and generate appropriate mappings
for (DBRefEntry cdsref : direct)
{
- Mapping cdsmap = cdsref.getMap();
+ // clone maplist and mapping
MapList cdsposmap = new MapList(Arrays.asList(new int[][] { new int[]
- { cdsSeq.getStart(), cdsSeq.getEnd() } }), cdsmap.getMap()
+ { cdsSeq.getStart(), cdsSeq.getEnd() } }), cdsref.getMap().getMap()
.getToRanges(), 3, 1);
+ Mapping cdsmap = new Mapping(cdsref.getMap().getTo(), cdsref.getMap()
+ .getMap());
+ // create dbref
DBRefEntry newref = new DBRefEntry(cdsref.getSource(),
cdsref.getVersion(), cdsref.getAccessionId(), new Mapping(
cdsmap.getTo(), cdsposmap));
+
+ // and see if we can map to the protein product for this mapping.
+ // onSource is the filtered set of accessions on protein that we are
+ // tranferring, so we assume accession is the same.
+ if (cdsmap.getTo() == null && onSource != null)
+ {
+ List<DBRefEntry> sourceRefs = DBRefUtils.searchRefs(onSource,
+ cdsref.getAccessionId());
+ if (sourceRefs != null)
+ {
+ for (DBRefEntry srcref : sourceRefs)
+ {
+ if (srcref.getSource().equalsIgnoreCase(cdsref.getSource()))
+ {
+ // we have found a complementary dbref on the protein product, so
+ // update mapping's getTo
+ newref.getMap().setTo(proteinProduct);
+ }
+ }
+ }
+ }
cdsSeq.addDBRef(newref);
propagated.add(newref);
}