JAL-1807 Bob's JalviewJS prototype first commit
[jalviewjs.git] / site / j2s / jalview / util / MappingUtils.js
1 Clazz.declarePackage ("jalview.util");\r
2 Clazz.load (null, "jalview.util.MappingUtils", ["jalview.analysis.AlignmentSorter", "jalview.commands.EditCommand", "$.OrderCommand", "jalview.datamodel.AlignmentOrder", "$.ColumnSelection", "$.SearchResults", "$.Sequence", "$.SequenceGroup", "jalview.util.Comparison", "$.StringUtils", "java.util.ArrayList", "$.Collections", "$.HashMap"], function () {\r
3 c$ = Clazz.declareType (jalview.util, "MappingUtils");\r
4 c$.mapCutOrPaste = Clazz.defineMethod (c$, "mapCutOrPaste", \r
5 function (edit, undo, targetSeqs, result, mappings) {\r
6 var action = edit.getAction ();\r
7 if (undo) {\r
8 action = action.getUndoAction ();\r
9 }System.err.println ("MappingUtils.mapCutOrPaste not yet implemented");\r
10 }, "jalview.commands.EditCommand.Edit,~B,java.util.List,jalview.commands.EditCommand,java.util.Set");\r
11 c$.mapEditCommand = Clazz.defineMethod (c$, "mapEditCommand", \r
12 function (command, undo, mapTo, gapChar, mappings) {\r
13 if (!mapTo.isNucleotide ()) {\r
14 return null;\r
15 }var targetCopies =  new java.util.HashMap ();\r
16 for (var seq, $seq = mapTo.getSequences ().iterator (); $seq.hasNext () && ((seq = $seq.next ()) || true);) {\r
17 var ds = seq.getDatasetSequence ();\r
18 if (ds != null) {\r
19 var copy =  new jalview.datamodel.Sequence (seq);\r
20 copy.setDatasetSequence (ds);\r
21 targetCopies.put (ds, copy);\r
22 }}\r
23 var originalSequences = command.priorState (undo);\r
24 var result =  new jalview.commands.EditCommand ();\r
25 var edits = command.getEditIterator (!undo);\r
26 while (edits.hasNext ()) {\r
27 var edit = edits.next ();\r
28 if (edit.getAction () === jalview.commands.EditCommand.Action.CUT || edit.getAction () === jalview.commands.EditCommand.Action.PASTE) {\r
29 jalview.util.MappingUtils.mapCutOrPaste (edit, undo, mapTo.getSequences (), result, mappings);\r
30 } else if (edit.getAction () === jalview.commands.EditCommand.Action.INSERT_GAP || edit.getAction () === jalview.commands.EditCommand.Action.DELETE_GAP) {\r
31 jalview.util.MappingUtils.mapInsertOrDelete (edit, undo, originalSequences, mapTo.getSequences (), targetCopies, gapChar, result, mappings);\r
32 }}\r
33 return result.getSize () > 0 ? result : null;\r
34 }, "jalview.commands.EditCommand,~B,jalview.datamodel.AlignmentI,~S,java.util.Set");\r
35 c$.mapInsertOrDelete = Clazz.defineMethod (c$, "mapInsertOrDelete", \r
36 function (edit, undo, originalSequences, targetSeqs, targetCopies, gapChar, result, mappings) {\r
37 var action = edit.getAction ();\r
38 if (undo) {\r
39 action = action.getUndoAction ();\r
40 }var count = edit.getNumber ();\r
41 var editPos = edit.getPosition ();\r
42 for (var seq, $seq = 0, $$seq = edit.getSequences (); $seq < $$seq.length && ((seq = $$seq[$seq]) || true); $seq++) {\r
43 var ds = seq.getDatasetSequence ();\r
44 if (ds == null) {\r
45 continue;\r
46 }var actedOn = originalSequences.get (ds);\r
47 var seqpos = actedOn.findPosition (editPos);\r
48 var sr = jalview.util.MappingUtils.buildSearchResults (seq, seqpos, mappings);\r
49 if (!sr.isEmpty ()) {\r
50 for (var targetSeq, $targetSeq = targetSeqs.iterator (); $targetSeq.hasNext () && ((targetSeq = $targetSeq.next ()) || true);) {\r
51 ds = targetSeq.getDatasetSequence ();\r
52 if (ds == null) {\r
53 continue;\r
54 }var copyTarget = targetCopies.get (ds);\r
55 var match = sr.getResults (copyTarget, 0, copyTarget.getLength ());\r
56 if (match != null) {\r
57 var ratio = 3;\r
58 var mappedCount = count * 3;\r
59 var mappedEditPos = action === jalview.commands.EditCommand.Action.DELETE_GAP ? match[0] - mappedCount : match[0];\r
60 var e = resultClazz.innerTypeInstance (jalview.commands.EditCommand.Edit, this, null, action,  Clazz.newArray (-1, [targetSeq]), mappedEditPos, mappedCount, gapChar);\r
61 result.addEdit (e);\r
62 if (action === jalview.commands.EditCommand.Action.INSERT_GAP) {\r
63 copyTarget.setSequence ( String.instantialize (jalview.util.StringUtils.insertCharAt (copyTarget.getSequence (), mappedEditPos, mappedCount, gapChar)));\r
64 } else if (action === jalview.commands.EditCommand.Action.DELETE_GAP) {\r
65 copyTarget.setSequence ( String.instantialize (jalview.util.StringUtils.deleteChars (copyTarget.getSequence (), mappedEditPos, mappedEditPos + mappedCount)));\r
66 }}}\r
67 }if (action === jalview.commands.EditCommand.Action.INSERT_GAP) {\r
68 actedOn.setSequence ( String.instantialize (jalview.util.StringUtils.insertCharAt (actedOn.getSequence (), editPos, count, gapChar)));\r
69 } else if (action === jalview.commands.EditCommand.Action.DELETE_GAP) {\r
70 actedOn.setSequence ( String.instantialize (jalview.util.StringUtils.deleteChars (actedOn.getSequence (), editPos, editPos + count)));\r
71 }}\r
72 }, "jalview.commands.EditCommand.Edit,~B,java.util.Map,java.util.List,java.util.Map,~S,jalview.commands.EditCommand,java.util.Set");\r
73 c$.buildSearchResults = Clazz.defineMethod (c$, "buildSearchResults", \r
74 function (seq, index, seqmappings) {\r
75 var results =  new jalview.datamodel.SearchResults ();\r
76 jalview.util.MappingUtils.addSearchResults (results, seq, index, seqmappings);\r
77 return results;\r
78 }, "jalview.datamodel.SequenceI,~N,java.util.Set");\r
79 c$.addSearchResults = Clazz.defineMethod (c$, "addSearchResults", \r
80 function (results, seq, index, seqmappings) {\r
81 if (index >= seq.getStart () && index <= seq.getEnd ()) {\r
82 for (var acf, $acf = seqmappings.iterator (); $acf.hasNext () && ((acf = $acf.next ()) || true);) {\r
83 acf.markMappedRegion (seq, index, results);\r
84 }\r
85 }}, "jalview.datamodel.SearchResults,jalview.datamodel.SequenceI,~N,java.util.Set");\r
86 c$.mapSequenceGroup = Clazz.defineMethod (c$, "mapSequenceGroup", \r
87 function (sg, mapFrom, mapTo) {\r
88 var targetIsNucleotide = mapTo.isNucleotide ();\r
89 var protein = targetIsNucleotide ? mapFrom : mapTo;\r
90 var codonFrames = protein.getAlignment ().getCodonFrames ();\r
91 var mappedGroup =  new jalview.datamodel.SequenceGroup (sg);\r
92 mappedGroup.cs = mapTo.getGlobalColourScheme ();\r
93 mappedGroup.clear ();\r
94 var minStartCol = -1;\r
95 var maxEndCol = -1;\r
96 var selectionStartRes = sg.getStartRes ();\r
97 var selectionEndRes = sg.getEndRes ();\r
98 for (var selected, $selected = sg.getSequences ().iterator (); $selected.hasNext () && ((selected = $selected.next ()) || true);) {\r
99 var firstUngappedPos = selectionStartRes;\r
100 while (firstUngappedPos <= selectionEndRes && jalview.util.Comparison.isGap (selected.getCharAt (firstUngappedPos))) {\r
101 firstUngappedPos++;\r
102 }\r
103 if (firstUngappedPos > selectionEndRes) {\r
104 continue;\r
105 }var lastUngappedPos = selectionEndRes;\r
106 while (lastUngappedPos >= selectionStartRes && jalview.util.Comparison.isGap (selected.getCharAt (lastUngappedPos))) {\r
107 lastUngappedPos--;\r
108 }\r
109 var startResiduePos = selected.findPosition (firstUngappedPos);\r
110 var endResiduePos = selected.findPosition (lastUngappedPos);\r
111 for (var acf, $acf = codonFrames.iterator (); $acf.hasNext () && ((acf = $acf.next ()) || true);) {\r
112 var mappedSequence = targetIsNucleotide ? acf.getDnaForAaSeq (selected) : acf.getAaForDnaSeq (selected);\r
113 if (mappedSequence != null) {\r
114 for (var seq, $seq = mapTo.getAlignment ().getSequences ().iterator (); $seq.hasNext () && ((seq = $seq.next ()) || true);) {\r
115 var mappedStartResidue = 0;\r
116 var mappedEndResidue = 0;\r
117 if (seq.getDatasetSequence () === mappedSequence) {\r
118 var sr = jalview.util.MappingUtils.buildSearchResults (selected, startResiduePos, java.util.Collections.singleton (acf));\r
119 for (var m, $m = sr.getResults ().iterator (); $m.hasNext () && ((m = $m.next ()) || true);) {\r
120 mappedStartResidue = m.getStart ();\r
121 mappedEndResidue = m.getEnd ();\r
122 }\r
123 sr = jalview.util.MappingUtils.buildSearchResults (selected, endResiduePos, java.util.Collections.singleton (acf));\r
124 for (var m, $m = sr.getResults ().iterator (); $m.hasNext () && ((m = $m.next ()) || true);) {\r
125 mappedStartResidue = Math.min (mappedStartResidue, m.getStart ());\r
126 mappedEndResidue = Math.max (mappedEndResidue, m.getEnd ());\r
127 }\r
128 var mappedStartCol = seq.findIndex (mappedStartResidue) - 1;\r
129 minStartCol = minStartCol == -1 ? mappedStartCol : Math.min (minStartCol, mappedStartCol);\r
130 var mappedEndCol = seq.findIndex (mappedEndResidue) - 1;\r
131 maxEndCol = maxEndCol == -1 ? mappedEndCol : Math.max (maxEndCol, mappedEndCol);\r
132 mappedGroup.addSequence (seq, false);\r
133 break;\r
134 }}\r
135 }}\r
136 }\r
137 mappedGroup.setStartRes (minStartCol < 0 ? 0 : minStartCol);\r
138 mappedGroup.setEndRes (maxEndCol < 0 ? 0 : maxEndCol);\r
139 return mappedGroup;\r
140 }, "jalview.datamodel.SequenceGroup,jalview.api.AlignViewportI,jalview.api.AlignViewportI");\r
141 c$.mapOrderCommand = Clazz.defineMethod (c$, "mapOrderCommand", \r
142 function (command, undo, mapTo, mappings) {\r
143 var sortOrder = command.getSequenceOrder (undo);\r
144 var mappedOrder =  new java.util.ArrayList ();\r
145 var j = 0;\r
146 var mappingToNucleotide = mapTo.isNucleotide ();\r
147 for (var seq, $seq = 0, $$seq = sortOrder; $seq < $$seq.length && ((seq = $$seq[$seq]) || true); $seq++) {\r
148 for (var acf, $acf = mappings.iterator (); $acf.hasNext () && ((acf = $acf.next ()) || true);) {\r
149 var mappedSeq = mappingToNucleotide ? acf.getDnaForAaSeq (seq) : acf.getAaForDnaSeq (seq);\r
150 if (mappedSeq != null) {\r
151 for (var seq2, $seq2 = mapTo.getSequences ().iterator (); $seq2.hasNext () && ((seq2 = $seq2.next ()) || true);) {\r
152 if (seq2.getDatasetSequence () === mappedSeq) {\r
153 mappedOrder.add (seq2);\r
154 j++;\r
155 break;\r
156 }}\r
157 }}\r
158 }\r
159 if (j == 0) {\r
160 return null;\r
161 }if (j < mapTo.getHeight ()) {\r
162 for (var seq, $seq = mapTo.getSequences ().iterator (); $seq.hasNext () && ((seq = $seq.next ()) || true);) {\r
163 if (!mappedOrder.contains (seq)) {\r
164 mappedOrder.add (seq);\r
165 }}\r
166 }var mappedOrderArray = mappedOrder.toArray ( new Array (mappedOrder.size ()));\r
167 var oldOrder = mapTo.getSequencesArray ();\r
168 jalview.analysis.AlignmentSorter.sortBy (mapTo,  new jalview.datamodel.AlignmentOrder (mappedOrderArray));\r
169 var result =  new jalview.commands.OrderCommand (command.getDescription (), oldOrder, mapTo);\r
170 return result;\r
171 }, "jalview.commands.OrderCommand,~B,jalview.datamodel.AlignmentI,java.util.Set");\r
172 c$.mapColumnSelection = Clazz.defineMethod (c$, "mapColumnSelection", \r
173 function (colsel, mapFrom, mapTo) {\r
174 var targetIsNucleotide = mapTo.isNucleotide ();\r
175 var protein = targetIsNucleotide ? mapFrom : mapTo;\r
176 var codonFrames = protein.getAlignment ().getCodonFrames ();\r
177 var mappedColumns =  new jalview.datamodel.ColumnSelection ();\r
178 if (colsel == null) {\r
179 return mappedColumns;\r
180 }var fromGapChar = mapFrom.getAlignment ().getGapCharacter ();\r
181 for (var obj, $obj = colsel.getSelected ().iterator (); $obj.hasNext () && ((obj = $obj.next ()) || true);) {\r
182 var col = (obj).intValue ();\r
183 var mappedToMin = 2147483647;\r
184 var mappedToMax = -2147483648;\r
185 for (var fromSeq, $fromSeq = mapFrom.getAlignment ().getSequences ().iterator (); $fromSeq.hasNext () && ((fromSeq = $fromSeq.next ()) || true);) {\r
186 if (fromSeq.getCharAt (col) == fromGapChar) {\r
187 continue;\r
188 }var residuePos = fromSeq.findPosition (col);\r
189 var sr = jalview.util.MappingUtils.buildSearchResults (fromSeq, residuePos, codonFrames);\r
190 for (var m, $m = sr.getResults ().iterator (); $m.hasNext () && ((m = $m.next ()) || true);) {\r
191 var mappedStartResidue = m.getStart ();\r
192 var mappedEndResidue = m.getEnd ();\r
193 var mappedSeq = m.getSequence ();\r
194 for (var toSeq, $toSeq = mapTo.getAlignment ().getSequences ().iterator (); $toSeq.hasNext () && ((toSeq = $toSeq.next ()) || true);) {\r
195 if (toSeq.getDatasetSequence () === mappedSeq) {\r
196 var mappedStartCol = toSeq.findIndex (mappedStartResidue);\r
197 var mappedEndCol = toSeq.findIndex (mappedEndResidue);\r
198 mappedToMin = Math.min (mappedToMin, mappedStartCol);\r
199 mappedToMax = Math.max (mappedToMax, mappedEndCol);\r
200 break;\r
201 }}\r
202 }\r
203 }\r
204 for (var i = mappedToMin; i <= mappedToMax; i++) {\r
205 mappedColumns.addElement (i - 1);\r
206 }\r
207 }\r
208 return mappedColumns;\r
209 }, "jalview.datamodel.ColumnSelection,jalview.api.AlignViewportI,jalview.api.AlignViewportI");\r
210 c$.findCodonFor = Clazz.defineMethod (c$, "findCodonFor", \r
211 function (seq, col, mappings) {\r
212 var dsPos = seq.findPosition (col);\r
213 for (var mapping, $mapping = mappings.iterator (); $mapping.hasNext () && ((mapping = $mapping.next ()) || true);) {\r
214 if (mapping.involvesSequence (seq)) {\r
215 return mapping.getMappedCodon (seq.getDatasetSequence (), dsPos);\r
216 }}\r
217 return null;\r
218 }, "jalview.datamodel.SequenceI,~N,java.util.Set");\r
219 c$.flattenRanges = Clazz.defineMethod (c$, "flattenRanges", \r
220 function (ranges) {\r
221 var count = 0;\r
222 for (var i = 0; i < ranges.length - 1; i += 2) {\r
223 count += ranges[i + 1] - ranges[i] + 1;\r
224 }\r
225 var result =  Clazz.newIntArray (count, 0);\r
226 var k = 0;\r
227 for (var i = 0; i < ranges.length - 1; i += 2) {\r
228 for (var j = ranges[i]; j <= ranges[i + 1]; j++) {\r
229 result[k++] = j;\r
230 }\r
231 }\r
232 return result;\r
233 }, "~A");\r
234 c$.findMappingsForSequence = Clazz.defineMethod (c$, "findMappingsForSequence", \r
235 function (sequence, mappings) {\r
236 var result =  new java.util.ArrayList ();\r
237 if (sequence == null || mappings == null) {\r
238 return result;\r
239 }for (var mapping, $mapping = mappings.iterator (); $mapping.hasNext () && ((mapping = $mapping.next ()) || true);) {\r
240 if (mapping.involvesSequence (sequence)) {\r
241 result.add (mapping);\r
242 }}\r
243 return result;\r
244 }, "jalview.datamodel.SequenceI,java.util.Set");\r
245 });\r