react-msaview 1.2.9 → 1.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (66) hide show
  1. package/bundle/colorSchemes.d.ts +16 -0
  2. package/bundle/colorSchemes.js +455 -0
  3. package/bundle/components/AboutDlg.d.ts +5 -0
  4. package/bundle/components/AboutDlg.js +47 -0
  5. package/bundle/components/AddTrackDlg.d.ts +8 -0
  6. package/bundle/components/AddTrackDlg.js +26 -0
  7. package/bundle/components/AnnotationDlg.d.ts +11 -0
  8. package/bundle/components/AnnotationDlg.js +77 -0
  9. package/bundle/components/BoxTrack.d.ts +7 -0
  10. package/bundle/components/BoxTrack.js +143 -0
  11. package/bundle/components/DetailsDlg.d.ts +8 -0
  12. package/bundle/components/DetailsDlg.js +12 -0
  13. package/bundle/components/Header.d.ts +6 -0
  14. package/bundle/components/Header.js +63 -0
  15. package/bundle/components/ImportForm.d.ts +6 -0
  16. package/bundle/components/ImportForm.js +89 -0
  17. package/bundle/components/MSACanvas.d.ts +6 -0
  18. package/bundle/components/MSACanvas.js +210 -0
  19. package/bundle/components/MSAView.d.ts +6 -0
  20. package/bundle/components/MSAView.js +88 -0
  21. package/bundle/components/MoreInfoDlg.d.ts +6 -0
  22. package/bundle/components/MoreInfoDlg.js +11 -0
  23. package/bundle/components/ResizeHandles.d.ts +8 -0
  24. package/bundle/components/ResizeHandles.js +110 -0
  25. package/bundle/components/Rubberband.d.ts +7 -0
  26. package/bundle/components/Rubberband.js +196 -0
  27. package/bundle/components/Ruler.d.ts +20 -0
  28. package/bundle/components/Ruler.js +121 -0
  29. package/bundle/components/SettingsDlg.d.ts +8 -0
  30. package/bundle/components/SettingsDlg.js +40 -0
  31. package/bundle/components/TextTrack.d.ts +7 -0
  32. package/bundle/components/TextTrack.js +72 -0
  33. package/bundle/components/Track.d.ts +11 -0
  34. package/bundle/components/Track.js +81 -0
  35. package/bundle/components/TrackInfoDlg.d.ts +6 -0
  36. package/bundle/components/TrackInfoDlg.js +33 -0
  37. package/bundle/components/TracklistDlg.d.ts +8 -0
  38. package/bundle/components/TracklistDlg.js +18 -0
  39. package/bundle/components/TreeCanvas.d.ts +6 -0
  40. package/bundle/components/TreeCanvas.js +431 -0
  41. package/bundle/components/TreeRuler.d.ts +6 -0
  42. package/bundle/components/TreeRuler.js +8 -0
  43. package/bundle/components/data/seq2.d.ts +3 -0
  44. package/bundle/components/data/seq2.js +3 -0
  45. package/bundle/index.d.ts +4 -0
  46. package/bundle/index.js +97266 -0
  47. package/bundle/layout.d.ts +23 -0
  48. package/bundle/layout.js +53 -0
  49. package/bundle/model.d.ts +364 -0
  50. package/bundle/model.js +894 -0
  51. package/bundle/parseNewick.d.ts +64 -0
  52. package/bundle/parseNewick.js +94 -0
  53. package/bundle/parsers/ClustalMSA.d.ts +39 -0
  54. package/bundle/parsers/ClustalMSA.js +77 -0
  55. package/bundle/parsers/FastaMSA.d.ts +26 -0
  56. package/bundle/parsers/FastaMSA.js +78 -0
  57. package/bundle/parsers/StockholmMSA.d.ts +75 -0
  58. package/bundle/parsers/StockholmMSA.js +142 -0
  59. package/bundle/util.d.ts +17 -0
  60. package/bundle/util.js +33 -0
  61. package/dist/components/AboutDlg.js +1 -1
  62. package/dist/components/ImportForm.js +9 -1
  63. package/dist/components/package.json +13 -7
  64. package/dist/model.d.ts +78 -5
  65. package/dist/model.js +19 -3
  66. package/package.json +13 -7
@@ -0,0 +1,894 @@
1
+ var __assign = (this && this.__assign) || function () {
2
+ __assign = Object.assign || function(t) {
3
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
4
+ s = arguments[i];
5
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
6
+ t[p] = s[p];
7
+ }
8
+ return t;
9
+ };
10
+ return __assign.apply(this, arguments);
11
+ };
12
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
13
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
14
+ return new (P || (P = Promise))(function (resolve, reject) {
15
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
16
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
17
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
18
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
19
+ });
20
+ };
21
+ var __generator = (this && this.__generator) || function (thisArg, body) {
22
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
23
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
24
+ function verb(n) { return function (v) { return step([n, v]); }; }
25
+ function step(op) {
26
+ if (f) throw new TypeError("Generator is already executing.");
27
+ while (_) try {
28
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
29
+ if (y = 0, t) op = [op[0] & 2, t.value];
30
+ switch (op[0]) {
31
+ case 0: case 1: t = op; break;
32
+ case 4: _.label++; return { value: op[1], done: false };
33
+ case 5: _.label++; y = op[1]; op = [0]; continue;
34
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
35
+ default:
36
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
37
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
38
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
39
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
40
+ if (t[2]) _.ops.pop();
41
+ _.trys.pop(); continue;
42
+ }
43
+ op = body.call(thisArg, _);
44
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
45
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
46
+ }
47
+ };
48
+ var __rest = (this && this.__rest) || function (s, e) {
49
+ var t = {};
50
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
51
+ t[p] = s[p];
52
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
53
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
54
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
55
+ t[p[i]] = s[p[i]];
56
+ }
57
+ return t;
58
+ };
59
+ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
60
+ if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
61
+ if (ar || !(i in from)) {
62
+ if (!ar) ar = Array.prototype.slice.call(from, 0, i);
63
+ ar[i] = from[i];
64
+ }
65
+ }
66
+ return to.concat(ar || Array.prototype.slice.call(from));
67
+ };
68
+ import { cast, types, addDisposer } from 'mobx-state-tree';
69
+ import { hierarchy, cluster } from 'd3-hierarchy';
70
+ import { ascending, max } from 'd3-array';
71
+ import { FileLocation, ElementId } from '@jbrowse/core/util/types/mst';
72
+ import { openLocation } from '@jbrowse/core/util/io';
73
+ import { autorun } from 'mobx';
74
+ import BaseViewModel from '@jbrowse/core/pluggableElementTypes/models/BaseViewModel';
75
+ import Stockholm from 'stockholm-js';
76
+ import ClustalMSA from './parsers/ClustalMSA';
77
+ import StockholmMSA from './parsers/StockholmMSA';
78
+ import FastaMSA from './parsers/FastaMSA';
79
+ import parseNewick from './parseNewick';
80
+ import colorSchemes from './colorSchemes';
81
+ import { generateNodeIds } from './util';
82
+ import TextTrack from './components/TextTrack';
83
+ import BoxTrack from './components/BoxTrack';
84
+ function skipBlanks(blanks, arg) {
85
+ var s = '';
86
+ var b = 0;
87
+ for (var j = 0; j < arg.length; j++) {
88
+ if (j === blanks[b]) {
89
+ b++;
90
+ }
91
+ else {
92
+ s += arg[j];
93
+ }
94
+ }
95
+ return s;
96
+ }
97
+ function setBrLength(d, y0, k) {
98
+ var _a;
99
+ //@ts-ignore
100
+ d.len = (y0 += Math.max(d.data.length || 0, 0)) * k;
101
+ (_a = d.children) === null || _a === void 0 ? void 0 : _a.forEach(function (d) {
102
+ setBrLength(d, y0, k);
103
+ });
104
+ }
105
+ function maxLength(d) {
106
+ return (d.data.length || 1) + (d.children ? max(d.children, maxLength) : 0);
107
+ }
108
+ // Collapse the node and all it's children, from
109
+ // https://bl.ocks.org/d3noob/43a860bc0024792f8803bba8ca0d5ecd
110
+ function collapse(d) {
111
+ if (d.children) {
112
+ //@ts-ignore
113
+ d._children = d.children;
114
+ //@ts-ignore
115
+ d._children.forEach(collapse);
116
+ //@ts-ignore
117
+ d.children = null;
118
+ }
119
+ }
120
+ function clamp(min, num, max) {
121
+ return Math.min(Math.max(num, min), max);
122
+ }
123
+ var StructureModel = types.model({
124
+ id: types.identifier,
125
+ structure: types.model({
126
+ pdb: types.string,
127
+ startPos: types.number,
128
+ endPos: types.number,
129
+ }),
130
+ range: types.maybe(types.string),
131
+ });
132
+ var UniprotTrack = types
133
+ .model({
134
+ id: types.string,
135
+ accession: types.string,
136
+ name: types.string,
137
+ associatedRowName: types.string,
138
+ height: types.optional(types.number, 100),
139
+ })
140
+ .volatile(function () { return ({
141
+ error: undefined,
142
+ data: undefined,
143
+ }); })
144
+ .actions(function (self) { return ({
145
+ setError: function (error) {
146
+ self.error = error;
147
+ },
148
+ setData: function (data) {
149
+ self.data = data;
150
+ },
151
+ }); })
152
+ .actions(function (self) { return ({
153
+ afterCreate: function () {
154
+ var _this = this;
155
+ addDisposer(self, autorun(function () { return __awaiter(_this, void 0, void 0, function () {
156
+ var accession, url, response, text, e_1;
157
+ return __generator(this, function (_a) {
158
+ switch (_a.label) {
159
+ case 0:
160
+ _a.trys.push([0, 3, , 4]);
161
+ accession = self.accession;
162
+ url = "https://www.uniprot.org/uniprot/" + accession + ".gff";
163
+ return [4 /*yield*/, fetch(url)];
164
+ case 1:
165
+ response = _a.sent();
166
+ if (!response.ok) {
167
+ throw new Error("HTTP " + response.status + " " + response.statusText + " fetching " + url);
168
+ }
169
+ return [4 /*yield*/, response.text()];
170
+ case 2:
171
+ text = _a.sent();
172
+ self.setData(text);
173
+ return [3 /*break*/, 4];
174
+ case 3:
175
+ e_1 = _a.sent();
176
+ self.setError(e_1);
177
+ return [3 /*break*/, 4];
178
+ case 4: return [2 /*return*/];
179
+ }
180
+ });
181
+ }); }));
182
+ },
183
+ }); })
184
+ .views(function (self) { return ({
185
+ get loading() {
186
+ return !self.data;
187
+ },
188
+ get features() {
189
+ var _a;
190
+ return (_a = self.data) === null || _a === void 0 ? void 0 : _a.split('\n').map(function (f) { return f.trim(); }).filter(function (f) { return !!f; }).filter(function (f) { return !f.startsWith('#'); }).map(function (f) {
191
+ var _a = f.split('\t'), seq_id = _a[0], source = _a[1], type = _a[2], start = _a[3], end = _a[4], score = _a[5], strand = _a[6], phase = _a[7], col9 = _a[8];
192
+ return __assign({ seq_id: seq_id, source: source, type: type, start: +start, end: +end, score: +score, strand: strand, phase: phase }, Object.fromEntries(col9
193
+ .split(';')
194
+ .map(function (f) { return f.trim(); })
195
+ .filter(function (f) { return !!f; })
196
+ .map(function (f) { return f.split('='); })
197
+ .map(function (_a) {
198
+ var key = _a[0], val = _a[1];
199
+ return [
200
+ key.trim(),
201
+ decodeURIComponent(val).trim().split(',').join(' '),
202
+ ];
203
+ })));
204
+ });
205
+ },
206
+ }); });
207
+ var MSAModel = types
208
+ .model('MsaView', {
209
+ id: ElementId,
210
+ type: types.literal('MsaView'),
211
+ height: types.optional(types.number, 550),
212
+ treeAreaWidth: types.optional(types.number, 400),
213
+ treeWidth: types.optional(types.number, 300),
214
+ rowHeight: 20,
215
+ scrollY: 0,
216
+ scrollX: 0,
217
+ resizeHandleWidth: 5,
218
+ blockSize: 1000,
219
+ mouseRow: types.maybe(types.number),
220
+ mouseCol: types.maybe(types.number),
221
+ selectedStructures: types.array(StructureModel),
222
+ labelsAlignRight: false,
223
+ colWidth: 16,
224
+ showBranchLen: true,
225
+ bgColor: true,
226
+ drawTree: true,
227
+ drawNodeBubbles: true,
228
+ highResScaleFactor: 2,
229
+ colorSchemeName: 'maeditor',
230
+ treeFilehandle: types.maybe(FileLocation),
231
+ msaFilehandle: types.maybe(FileLocation),
232
+ currentAlignment: 0,
233
+ collapsed: types.array(types.string),
234
+ showOnly: types.maybe(types.string),
235
+ boxTracks: types.array(UniprotTrack),
236
+ turnedOffTracks: types.map(types.boolean),
237
+ annotatedRegions: types.array(types.model({
238
+ start: types.number,
239
+ end: types.number,
240
+ attributes: types.frozen(),
241
+ })),
242
+ data: types.optional(types
243
+ .model({
244
+ tree: types.maybe(types.string),
245
+ msa: types.maybe(types.string),
246
+ })
247
+ .actions(function (self) { return ({
248
+ setTree: function (tree) {
249
+ self.tree = tree;
250
+ },
251
+ setMSA: function (msa) {
252
+ self.msa = msa;
253
+ },
254
+ }); }), { tree: '', msa: '' }),
255
+ })
256
+ .volatile(function () { return ({
257
+ error: undefined,
258
+ margin: { left: 20, top: 20 },
259
+ //eslint-disable-next-line @typescript-eslint/no-explicit-any
260
+ DialogComponent: undefined,
261
+ //eslint-disable-next-line @typescript-eslint/no-explicit-any
262
+ DialogProps: undefined,
263
+ // annotations
264
+ annotPos: undefined,
265
+ }); })
266
+ .actions(function (self) { return ({
267
+ //eslint-disable-next-line @typescript-eslint/no-explicit-any
268
+ setDialogComponent: function (dlg, props) {
269
+ self.DialogComponent = dlg;
270
+ self.DialogProps = props;
271
+ },
272
+ setHeight: function (height) {
273
+ self.height = height;
274
+ },
275
+ addStructureToSelection: function (elt) {
276
+ self.selectedStructures.push(elt);
277
+ },
278
+ removeStructureFromSelection: function (elt) {
279
+ var r = self.selectedStructures.find(function (node) { return node.id === elt.id; });
280
+ if (r) {
281
+ self.selectedStructures.remove(r);
282
+ }
283
+ },
284
+ toggleStructureSelection: function (elt) {
285
+ var r = self.selectedStructures.find(function (node) { return node.id === elt.id; });
286
+ if (r) {
287
+ self.selectedStructures.remove(r);
288
+ }
289
+ else {
290
+ self.selectedStructures.push(elt);
291
+ }
292
+ },
293
+ clearSelectedStructures: function () {
294
+ //@ts-ignore
295
+ self.selectedStructures = [];
296
+ },
297
+ setError: function (error) {
298
+ console.error(error);
299
+ self.error = error;
300
+ },
301
+ setMousePos: function (col, row) {
302
+ self.mouseCol = col;
303
+ self.mouseRow = row;
304
+ },
305
+ setRowHeight: function (n) {
306
+ self.rowHeight = n;
307
+ },
308
+ setColWidth: function (n) {
309
+ self.colWidth = n;
310
+ },
311
+ setColorSchemeName: function (name) {
312
+ self.colorSchemeName = name;
313
+ },
314
+ setScrollY: function (n) {
315
+ self.scrollY = n;
316
+ },
317
+ setScrollX: function (n) {
318
+ self.scrollX = n;
319
+ },
320
+ setTreeAreaWidth: function (n) {
321
+ self.treeAreaWidth = n;
322
+ },
323
+ setTreeWidth: function (n) {
324
+ self.treeWidth = n;
325
+ },
326
+ setCurrentAlignment: function (n) {
327
+ self.currentAlignment = n;
328
+ },
329
+ toggleLabelsAlignRight: function () {
330
+ self.labelsAlignRight = !self.labelsAlignRight;
331
+ },
332
+ toggleDrawTree: function () {
333
+ self.drawTree = !self.drawTree;
334
+ },
335
+ toggleCollapsed: function (node) {
336
+ if (self.collapsed.includes(node)) {
337
+ self.collapsed.remove(node);
338
+ }
339
+ else {
340
+ self.collapsed.push(node);
341
+ }
342
+ },
343
+ setShowOnly: function (node) {
344
+ self.showOnly = node;
345
+ },
346
+ toggleBranchLen: function () {
347
+ self.showBranchLen = !self.showBranchLen;
348
+ },
349
+ toggleBgColor: function () {
350
+ self.bgColor = !self.bgColor;
351
+ },
352
+ toggleNodeBubbles: function () {
353
+ self.drawNodeBubbles = !self.drawNodeBubbles;
354
+ },
355
+ setData: function (data) {
356
+ self.data = cast(data);
357
+ },
358
+ setMSAFilehandle: function (msaFilehandle) {
359
+ return __awaiter(this, void 0, void 0, function () {
360
+ return __generator(this, function (_a) {
361
+ self.msaFilehandle = msaFilehandle;
362
+ return [2 /*return*/];
363
+ });
364
+ });
365
+ },
366
+ setTreeFilehandle: function (treeFilehandle) {
367
+ return __awaiter(this, void 0, void 0, function () {
368
+ var r;
369
+ return __generator(this, function (_a) {
370
+ switch (_a.label) {
371
+ case 0:
372
+ if (!(treeFilehandle && 'blobId' in treeFilehandle)) return [3 /*break*/, 2];
373
+ return [4 /*yield*/, openLocation(treeFilehandle).readFile('utf8')];
374
+ case 1:
375
+ r = (_a.sent());
376
+ this.setTree(r);
377
+ return [3 /*break*/, 3];
378
+ case 2:
379
+ self.treeFilehandle = treeFilehandle;
380
+ _a.label = 3;
381
+ case 3: return [2 /*return*/];
382
+ }
383
+ });
384
+ });
385
+ },
386
+ setMSA: function (result) {
387
+ self.data.setMSA(result);
388
+ },
389
+ setTree: function (result) {
390
+ self.data.setTree(result);
391
+ },
392
+ afterCreate: function () {
393
+ var _this = this;
394
+ addDisposer(self, autorun(function () { return __awaiter(_this, void 0, void 0, function () {
395
+ var treeFilehandle, _a, e_2;
396
+ return __generator(this, function (_b) {
397
+ switch (_b.label) {
398
+ case 0:
399
+ treeFilehandle = self.treeFilehandle;
400
+ if (!treeFilehandle) return [3 /*break*/, 4];
401
+ _b.label = 1;
402
+ case 1:
403
+ _b.trys.push([1, 3, , 4]);
404
+ _a = this.setTree;
405
+ return [4 /*yield*/, openLocation(treeFilehandle).readFile('utf8')];
406
+ case 2:
407
+ _a.apply(this, [(_b.sent())]);
408
+ return [3 /*break*/, 4];
409
+ case 3:
410
+ e_2 = _b.sent();
411
+ this.setError(e_2);
412
+ return [3 /*break*/, 4];
413
+ case 4: return [2 /*return*/];
414
+ }
415
+ });
416
+ }); }));
417
+ addDisposer(self, autorun(function () { return __awaiter(_this, void 0, void 0, function () {
418
+ var msaFilehandle, _a, e_3;
419
+ return __generator(this, function (_b) {
420
+ switch (_b.label) {
421
+ case 0:
422
+ msaFilehandle = self.msaFilehandle;
423
+ if (!msaFilehandle) return [3 /*break*/, 4];
424
+ _b.label = 1;
425
+ case 1:
426
+ _b.trys.push([1, 3, , 4]);
427
+ _a = this.setMSA;
428
+ return [4 /*yield*/, openLocation(msaFilehandle).readFile('utf8')];
429
+ case 2:
430
+ _a.apply(this, [(_b.sent())]);
431
+ return [3 /*break*/, 4];
432
+ case 3:
433
+ e_3 = _b.sent();
434
+ this.setError(e_3);
435
+ return [3 /*break*/, 4];
436
+ case 4: return [2 /*return*/];
437
+ }
438
+ });
439
+ }); }));
440
+ },
441
+ }); })
442
+ .views(function (self) {
443
+ var oldBlocksX = [];
444
+ var oldBlocksY = [];
445
+ var oldValX = 0;
446
+ var oldValY = 0;
447
+ return {
448
+ get initialized() {
449
+ return ((self.data.msa ||
450
+ self.data.tree ||
451
+ self.msaFilehandle ||
452
+ self.treeFilehandle) &&
453
+ !self.error);
454
+ },
455
+ get blocksX() {
456
+ var scrollX = self.scrollX, size = self.blockSize, colWidth = self.colWidth;
457
+ var ret = -(size * Math.floor(scrollX / size)) - size;
458
+ var b = [];
459
+ for (var i = ret; i < ret + size * 3; i += size) {
460
+ if (i + size > 0) {
461
+ b.push(i);
462
+ }
463
+ }
464
+ if (JSON.stringify(b) !== JSON.stringify(oldBlocksX) ||
465
+ colWidth !== oldValX) {
466
+ oldBlocksX = b;
467
+ oldValX = colWidth;
468
+ }
469
+ return oldBlocksX;
470
+ },
471
+ get blocksY() {
472
+ var scrollY = self.scrollY, size = self.blockSize, rowHeight = self.rowHeight;
473
+ var ret = -(size * Math.floor(scrollY / size)) - 2 * size;
474
+ var b = [];
475
+ for (var i = ret; i < ret + size * 3; i += size) {
476
+ if (i + size > 0) {
477
+ b.push(i);
478
+ }
479
+ }
480
+ if (JSON.stringify(b) !== JSON.stringify(oldBlocksY) ||
481
+ rowHeight !== oldValY) {
482
+ oldBlocksY = b;
483
+ oldValY = rowHeight;
484
+ }
485
+ return oldBlocksY;
486
+ },
487
+ };
488
+ })
489
+ .views(function (self) { return ({
490
+ get blocks2d() {
491
+ return self.blocksY.map(function (by) { return self.blocksX.map(function (bx) { return [bx, by]; }); }).flat();
492
+ },
493
+ get done() {
494
+ return self.initialized && (self.data.msa || self.data.tree);
495
+ },
496
+ get colorScheme() {
497
+ return colorSchemes[self.colorSchemeName];
498
+ },
499
+ get alignmentDetails() {
500
+ var _a;
501
+ return ((_a = this.MSA) === null || _a === void 0 ? void 0 : _a.getDetails()) || {};
502
+ },
503
+ getRowDetails: function (name) {
504
+ var _a;
505
+ //@ts-ignore
506
+ var details = (_a = this.MSA) === null || _a === void 0 ? void 0 : _a.getRowDetails(name);
507
+ var matches = name.match(/\S+\/(\d+)-(\d+)/);
508
+ return __assign(__assign({}, details), (matches && { range: { start: +matches[1], end: +matches[2] } }));
509
+ },
510
+ get currentAlignmentName() {
511
+ return this.alignmentNames[self.currentAlignment];
512
+ },
513
+ get alignmentNames() {
514
+ var _a;
515
+ return ((_a = this.MSA) === null || _a === void 0 ? void 0 : _a.alignmentNames) || [];
516
+ },
517
+ get noTree() {
518
+ return !!this.tree.noTree;
519
+ },
520
+ get menuItems() {
521
+ return [];
522
+ },
523
+ get MSA() {
524
+ var text = self.data.msa;
525
+ if (text) {
526
+ if (Stockholm.sniff(text)) {
527
+ return new StockholmMSA(text, self.currentAlignment);
528
+ }
529
+ else if (text.startsWith('>')) {
530
+ return new FastaMSA(text);
531
+ }
532
+ else {
533
+ return new ClustalMSA(text);
534
+ }
535
+ }
536
+ return null;
537
+ },
538
+ get numColumns() {
539
+ var _a;
540
+ return ((((_a = this.MSA) === null || _a === void 0 ? void 0 : _a.getWidth()) || 0) - this.blanks.length) * self.colWidth;
541
+ },
542
+ get tree() {
543
+ var _a;
544
+ return self.data.tree
545
+ ? generateNodeIds(parseNewick(self.data.tree))
546
+ : ((_a = this.MSA) === null || _a === void 0 ? void 0 : _a.getTree()) || { noTree: true };
547
+ },
548
+ get rowNames() {
549
+ return this.hierarchy.leaves().map(function (node) { return node.data.name; });
550
+ },
551
+ get mouseOverRowName() {
552
+ return self.mouseRow !== undefined
553
+ ? this.rowNames[self.mouseRow]
554
+ : undefined;
555
+ },
556
+ getMouseOverResidue: function (rowName) {
557
+ return this.columns[rowName];
558
+ },
559
+ get root() {
560
+ var hier = hierarchy(this.tree, function (d) { return d.branchset; })
561
+ .sum(function (d) { return (d.branchset ? 0 : 1); })
562
+ .sort(function (a, b) {
563
+ return ascending(a.data.length || 1, b.data.length || 1);
564
+ });
565
+ if (self.showOnly) {
566
+ var res = hier.find(function (node) { return node.data.id === self.showOnly; });
567
+ if (res) {
568
+ hier = res;
569
+ }
570
+ }
571
+ if (self.collapsed.length) {
572
+ self.collapsed
573
+ .map(function (collapsedId) {
574
+ return hier.find(function (node) { return node.data.id === collapsedId; });
575
+ })
576
+ .filter(function (f) { return !!f; })
577
+ .map(function (node) { return collapse(node); });
578
+ }
579
+ return hier;
580
+ },
581
+ get structures() {
582
+ var _a;
583
+ return ((_a = this.MSA) === null || _a === void 0 ? void 0 : _a.getStructures()) || {};
584
+ },
585
+ get inverseStructures() {
586
+ var map = Object.entries(this.structures)
587
+ .map(function (_a) {
588
+ var key = _a[0], val = _a[1];
589
+ return val.map(function (pdbEntry) { return [pdbEntry.pdb, { id: key }]; });
590
+ })
591
+ .flat();
592
+ return Object.fromEntries(map);
593
+ },
594
+ get msaAreaWidth() {
595
+ //@ts-ignore
596
+ return self.width - self.treeAreaWidth;
597
+ },
598
+ get blanks() {
599
+ var _this = this;
600
+ var _a;
601
+ var blanks = [];
602
+ var strs = this.hierarchy
603
+ .leaves()
604
+ .map(function (_a) {
605
+ var _b;
606
+ var data = _a.data;
607
+ return (_b = _this.MSA) === null || _b === void 0 ? void 0 : _b.getRow(data.name);
608
+ })
609
+ .filter(function (item) { return !!item; });
610
+ for (var i = 0; i < ((_a = strs[0]) === null || _a === void 0 ? void 0 : _a.length); i++) {
611
+ var counter = 0;
612
+ for (var j = 0; j < strs.length; j++) {
613
+ if (strs[j][i] === '-') {
614
+ counter++;
615
+ }
616
+ }
617
+ if (counter === strs.length) {
618
+ blanks.push(i);
619
+ }
620
+ }
621
+ return blanks;
622
+ },
623
+ get rows() {
624
+ var _this = this;
625
+ return this.hierarchy
626
+ .leaves()
627
+ .map(function (_a) {
628
+ var _b;
629
+ var data = _a.data;
630
+ return [data.name, (_b = _this.MSA) === null || _b === void 0 ? void 0 : _b.getRow(data.name)];
631
+ })
632
+ .filter(function (f) { return !!f[1]; });
633
+ },
634
+ get columns() {
635
+ var rows = this.rows;
636
+ var cols = this.columns2d;
637
+ return Object.fromEntries(rows.map(function (row, index) { return [row[0], cols[index]]; }));
638
+ },
639
+ get columns2d() {
640
+ var strs = this.rows.map(function (r) { return r[1]; });
641
+ var ret = [];
642
+ for (var i = 0; i < strs.length; i++) {
643
+ ret.push(skipBlanks(this.blanks, strs[i]));
644
+ }
645
+ return ret;
646
+ },
647
+ get colStats() {
648
+ var r = [];
649
+ var m = this.columns2d;
650
+ for (var i = 0; i < m.length; i++) {
651
+ for (var j = 0; j < m[i].length; j++) {
652
+ var l = r[j] || {};
653
+ if (!l[m[i][j]]) {
654
+ l[m[i][j]] = 0;
655
+ }
656
+ l[m[i][j]]++;
657
+ r[j] = l;
658
+ }
659
+ }
660
+ return r;
661
+ },
662
+ // generates a new tree that is clustered with x,y positions
663
+ get hierarchy() {
664
+ var root = this.root;
665
+ var clust = cluster()
666
+ .size([this.totalHeight, self.treeWidth])
667
+ .separation(function () { return 1; });
668
+ clust(root);
669
+ setBrLength(root,
670
+ //@ts-ignore
671
+ (root.data.length = 0), self.treeWidth / maxLength(root));
672
+ return root;
673
+ },
674
+ get totalHeight() {
675
+ return this.root.leaves().length * self.rowHeight;
676
+ },
677
+ }); })
678
+ .actions(function (self) { return ({
679
+ addUniprotTrack: function (node) {
680
+ if (self.boxTracks.find(function (t) { return t.name === node.name; })) {
681
+ if (self.turnedOffTracks.has(node.name)) {
682
+ this.toggleTrack(node.name);
683
+ }
684
+ }
685
+ else {
686
+ self.boxTracks.push(__assign(__assign({}, node), { id: node.name, associatedRowName: node.name }));
687
+ }
688
+ },
689
+ doScrollY: function (deltaY) {
690
+ self.scrollY = clamp(-self.totalHeight + 10, self.scrollY + deltaY, 0);
691
+ },
692
+ doScrollX: function (deltaX) {
693
+ self.scrollX = clamp(-self.numColumns + (self.msaAreaWidth - 100), self.scrollX + deltaX, 0);
694
+ },
695
+ setMouseoveredColumn: function (n, chain, file) {
696
+ var _a;
697
+ var j = 0;
698
+ var i = 0;
699
+ var id = (self.inverseStructures[file.slice(0, -4)] || {}).id;
700
+ var row = (_a = self.MSA) === null || _a === void 0 ? void 0 : _a.getRow(id);
701
+ if (row) {
702
+ for (i = 0; i < row.length && j < n; i++) {
703
+ if (row[i] !== '-') {
704
+ j++;
705
+ }
706
+ }
707
+ self.mouseCol = j + 1;
708
+ }
709
+ else {
710
+ self.mouseCol = undefined;
711
+ }
712
+ },
713
+ toggleTrack: function (id) {
714
+ if (self.turnedOffTracks.has(id)) {
715
+ self.turnedOffTracks.delete(id);
716
+ }
717
+ else {
718
+ self.turnedOffTracks.set(id, true);
719
+ }
720
+ },
721
+ }); })
722
+ .views(function (self) { return ({
723
+ get secondaryStructureConsensus() {
724
+ var _a;
725
+ return (_a = self.MSA) === null || _a === void 0 ? void 0 : _a.secondaryStructureConsensus;
726
+ },
727
+ get seqConsensus() {
728
+ var _a;
729
+ return (_a = self.MSA) === null || _a === void 0 ? void 0 : _a.seqConsensus;
730
+ },
731
+ get conservation() {
732
+ var m = self.columns2d;
733
+ if (m.length) {
734
+ for (var i = 0; i < m[0].length; i++) {
735
+ var col = [];
736
+ for (var j = 0; j < m.length; j++) {
737
+ col.push(m[j][i]);
738
+ }
739
+ }
740
+ }
741
+ return ['a'];
742
+ },
743
+ get tracks() {
744
+ var blanks = self.blanks;
745
+ var adapterTracks = self.MSA
746
+ ? self.MSA.tracks.map(function (track) {
747
+ var data = track.data;
748
+ return {
749
+ model: __assign(__assign({}, track), { data: data ? skipBlanks(blanks, data) : undefined, height: self.rowHeight }),
750
+ ReactComponent: TextTrack,
751
+ };
752
+ })
753
+ : [];
754
+ var boxTracks = self.boxTracks
755
+ // filter out tracks that are associated with hidden rows
756
+ .filter(function (track) { return !!self.rows.find(function (row) { return row[0] === track.name; }); })
757
+ .map(function (track) { return ({
758
+ model: track,
759
+ ReactComponent: BoxTrack,
760
+ }); });
761
+ var annotationTracks = self.annotatedRegions.length > 0
762
+ ? [
763
+ {
764
+ model: {
765
+ features: self.annotatedRegions,
766
+ height: 100,
767
+ id: 'annotations',
768
+ name: 'User-created annotations',
769
+ data: self.annotatedRegions
770
+ .map(function (region) {
771
+ var attrs = region.attributes
772
+ ? Object.entries(region.attributes)
773
+ .map(function (_a) {
774
+ var k = _a[0], v = _a[1];
775
+ return k + "=" + v.join(',');
776
+ })
777
+ .join(';')
778
+ : '.';
779
+ return [
780
+ 'MSA_refcoord',
781
+ '.',
782
+ '.',
783
+ region.start,
784
+ region.end,
785
+ '.',
786
+ '.',
787
+ '.',
788
+ attrs,
789
+ ].join('\t');
790
+ })
791
+ .join('\n'),
792
+ },
793
+ ReactComponent: BoxTrack,
794
+ },
795
+ ]
796
+ : [];
797
+ return __spreadArray(__spreadArray(__spreadArray([], adapterTracks, true), boxTracks, true), annotationTracks, true);
798
+ },
799
+ get turnedOnTracks() {
800
+ return this.tracks.filter(function (f) { return !self.turnedOffTracks.has(f.model.id); });
801
+ },
802
+ // returns coordinate in the current relative coordinate scheme
803
+ pxToBp: function (coord) {
804
+ return Math.floor((coord - self.scrollX) / self.colWidth);
805
+ },
806
+ rowSpecificBpToPx: function (rowName, position) {
807
+ var _a;
808
+ var rowNames = self.rowNames, rows = self.rows, blanks = self.blanks;
809
+ var index = rowNames.indexOf(rowName);
810
+ var row = rows[index][1];
811
+ var details = self.getRowDetails(rowName);
812
+ var offset = ((_a = details.range) === null || _a === void 0 ? void 0 : _a.start) || 0;
813
+ var current = position - offset;
814
+ if (current < 0) {
815
+ return 0;
816
+ }
817
+ var j = 0;
818
+ var i = 0;
819
+ for (; i < row.length; i++) {
820
+ if (row[i] !== '-' && j++ === current) {
821
+ break;
822
+ }
823
+ }
824
+ var count = 0;
825
+ for (var k = 0; k < row.length; k++) {
826
+ if (blanks.indexOf(k) !== -1 && k < i + 1) {
827
+ count++;
828
+ }
829
+ }
830
+ return i - count;
831
+ },
832
+ globalBpToPx: function (position) {
833
+ var _a;
834
+ var count = 0;
835
+ for (var k = 0; k < ((_a = self.rows[0]) === null || _a === void 0 ? void 0 : _a[1].length); k++) {
836
+ if (self.blanks.indexOf(k) !== -1 && k < position + 1) {
837
+ count++;
838
+ }
839
+ }
840
+ return position - count;
841
+ },
842
+ relativePxToBp: function (rowName, position) {
843
+ var rowNames = self.rowNames, rows = self.rows;
844
+ var index = rowNames.indexOf(rowName);
845
+ var row = rows[index][1];
846
+ var k = 0;
847
+ for (var i = 0; i < position; i++) {
848
+ if (row[i] !== '-') {
849
+ k++;
850
+ }
851
+ else if (k >= position) {
852
+ break;
853
+ }
854
+ }
855
+ return k;
856
+ },
857
+ getPos: function (pos) {
858
+ var j = 0;
859
+ for (var i = 0, k = 0; i < pos; i++, j++) {
860
+ while (j === self.blanks[k]) {
861
+ k++;
862
+ j++;
863
+ }
864
+ }
865
+ return j;
866
+ },
867
+ }); })
868
+ .actions(function (self) { return ({
869
+ addAnnotation: function (start, end, attributes) {
870
+ self.annotatedRegions.push({
871
+ start: self.getPos(start),
872
+ end: self.getPos(end),
873
+ attributes: attributes,
874
+ });
875
+ },
876
+ setOffsets: function (left, right) {
877
+ self.annotPos = { left: left, right: right };
878
+ },
879
+ clearAnnotPos: function () {
880
+ self.annotPos = undefined;
881
+ },
882
+ }); });
883
+ var model = types.snapshotProcessor(types.compose(BaseViewModel, MSAModel), {
884
+ postProcessor: function (result) {
885
+ var _a = result.data, tree = _a.tree, msa = _a.msa, rest = __rest(result
886
+ // remove the MSA/tree data from the tree if the filehandle available in
887
+ // which case it can be reloaded on refresh
888
+ , ["data"]);
889
+ // remove the MSA/tree data from the tree if the filehandle available in
890
+ // which case it can be reloaded on refresh
891
+ return __assign({ data: __assign(__assign({}, (!result.treeFilehandle && { tree: tree })), (!result.msaFilehandle && { msa: msa })) }, rest);
892
+ },
893
+ });
894
+ export default model;