|
3 | 3 | <div class="msa-wrapper" ref="msaWrapper"> |
4 | 4 | <div v-for="([start, end], i) in blockRanges" class="msa-block-wrapper"> |
5 | 5 | <div class="msa-block" @mousemove="onBlockMouseMove($event, start, end)" @mouseleave="onBlockMouseLeave" @click="onBlockClick($event, start, end)"> |
6 | | - <span class="conservation-label">Conservation</span> |
7 | | - <svg |
8 | | - class="conservation-track" |
9 | | - :viewBox="`0 0 ${end - start} ${conservationHeight}`" |
10 | | - :style="{ |
11 | | - gridColumn: 2, |
12 | | - gridRow: 1, |
13 | | - width: 'calc((1ch + 4px) * ' + String(end - start) + ')', |
14 | | - height: conservationHeight + 'px', |
15 | | - transform: 'translateX(-2px)' |
16 | | - }" |
17 | | - preserveAspectRatio="none" |
18 | | - > |
19 | | - <path :d="conservationPath(getConservationRange(start, end))" /> |
20 | | - <g :transform="`scale(${1 / conservationScaleX}, 1)`"> |
21 | | - <text |
22 | | - v-for="(idx) in getConservationMaxCols(start, end)" |
23 | | - :key="`cons-max-${i}-${idx}`" |
24 | | - class="conservation-max" |
25 | | - :x="(idx + 0.5) * conservationScaleX" |
26 | | - y="0" |
27 | | - text-anchor="middle" |
28 | | - dominant-baseline="hanging" |
29 | | - >*</text> |
30 | | - </g> |
31 | | - </svg> |
32 | | - <!-- <SequenceLogo |
33 | | - :sequences="getEntryRanges(start, end, makeGradients=false)" |
34 | | - :alphabet="alphabet" |
35 | | - :lineLen="lineLen" |
36 | | - /> --> |
37 | | - <template v-for="({ name, aa, ss, seqStart, css }, j) in getEntryRanges(start, end)"> |
38 | | - <span class="header" :title="name" :style="headerStyle(j)" @click="handleClickHeader($event, j)">{{ |
39 | | - name }}</span> |
40 | | - <div class="sequence-wrapper" :style="sequenceStyle(j)"> |
41 | | - <span class="sequence" |
42 | | - :style="[css, { 'color': sequenceColor, 'font-weight': fontWeight }]">{{ |
43 | | - alphabet == 'aa' ? aa : ss }}</span> |
44 | | - </div> |
45 | | - <div class="column-wrapper" v-if="j == 0" :style="overlayStyle(aa.length)"> |
46 | | - <div |
47 | | - v-for="idx in getBlockHighlights(start, end)" |
48 | | - :key="`sel-${i}-${idx}`" |
49 | | - class="column-marker column-active" |
50 | | - :style="columnMarkerStyle(idx, end - start)" |
51 | | - ></div> |
52 | | - <div |
53 | | - v-if="getHoverLocalIndex(start, end) !== null" |
54 | | - class="column-marker column-hover" |
55 | | - :style="columnMarkerStyle(getHoverLocalIndex(start, end), end - start)" |
56 | | - ></div> |
57 | | - <div |
58 | | - v-if="getPreviewLocalIndex(start, end) !== null" |
59 | | - class="column-marker column-preview" |
60 | | - :style="columnMarkerStyle(getPreviewLocalIndex(start, end), end - start)" |
61 | | - ></div> |
62 | | - <div |
63 | | - v-if="hoverInfo && hoverInfo.start === start && hoverInfo.rowIndex !== null" |
64 | | - class="residue-hover" |
65 | | - :style="residueMarkerStyle(hoverInfo, end - start)" |
66 | | - ></div> |
67 | | - </div> |
68 | | - <span class="count" :style="countStyle(j)">{{ countSequence(aa, seqStart).toString() }}</span> |
69 | | - </template> |
| 6 | + <span class="conservation-label">Conservation</span> |
| 7 | + <svg |
| 8 | + class="conservation-track" |
| 9 | + :viewBox="`0 0 ${end - start} ${conservationHeight}`" |
| 10 | + :style="{ |
| 11 | + gridColumn: 2, |
| 12 | + gridRow: 1, |
| 13 | + width: 'calc((1ch + 4px) * ' + String(end - start) + ')', |
| 14 | + height: conservationHeight + 'px', |
| 15 | + transform: 'translateX(-2px)' |
| 16 | + }" |
| 17 | + preserveAspectRatio="none" |
| 18 | + > |
| 19 | + <path :d="conservationPath(getConservationRange(start, end))" /> |
| 20 | + <g :transform="`scale(${1 / conservationScaleX}, 1)`"> |
| 21 | + <text |
| 22 | + v-for="(idx) in getConservationMaxCols(start, end)" |
| 23 | + :key="`cons-max-${i}-${idx}`" |
| 24 | + class="conservation-max" |
| 25 | + :x="(idx + 0.5) * conservationScaleX" |
| 26 | + y="0" |
| 27 | + text-anchor="middle" |
| 28 | + dominant-baseline="hanging" |
| 29 | + >*</text> |
| 30 | + </g> |
| 31 | + </svg> |
| 32 | + <!-- <SequenceLogo |
| 33 | + :sequences="getEntryRanges(start, end, makeGradients=false)" |
| 34 | + :alphabet="alphabet" |
| 35 | + :lineLen="lineLen" |
| 36 | + /> --> |
| 37 | + <template v-for="({ name, aa, ss, seqStart, css }, j) in getEntryRanges(start, end)"> |
| 38 | + <span class="header" :title="name" :style="headerStyle(j)" @click="handleClickHeader($event, j)">{{ |
| 39 | + name }}</span> |
| 40 | + <div class="sequence-wrapper" :style="sequenceStyle(j)"> |
| 41 | + <span class="sequence" |
| 42 | + :style="[css, { 'color': sequenceColor, 'font-weight': fontWeight }]">{{ |
| 43 | + alphabet == 'aa' ? aa : ss }}</span> |
| 44 | + </div> |
| 45 | + <div class="column-wrapper" v-if="j == 0" :style="overlayStyle(aa.length)"> |
| 46 | + <div |
| 47 | + v-for="idx in getBlockHighlights(start, end)" |
| 48 | + :key="`sel-${i}-${idx}`" |
| 49 | + class="column-marker column-active" |
| 50 | + :style="columnMarkerStyle(idx, end - start)" |
| 51 | + ></div> |
| 52 | + <div |
| 53 | + v-if="getHoverLocalIndex(start, end) !== null" |
| 54 | + class="column-marker column-hover" |
| 55 | + :style="columnMarkerStyle(getHoverLocalIndex(start, end), end - start)" |
| 56 | + ></div> |
| 57 | + <div |
| 58 | + v-if="getPreviewLocalIndex(start, end) !== null" |
| 59 | + class="column-marker column-preview" |
| 60 | + :style="columnMarkerStyle(getPreviewLocalIndex(start, end), end - start)" |
| 61 | + ></div> |
| 62 | + <div |
| 63 | + v-if="hoverInfo && hoverInfo.start === start && hoverInfo.rowIndex !== null" |
| 64 | + class="residue-hover" |
| 65 | + :style="residueMarkerStyle(hoverInfo, end - start)" |
| 66 | + ></div> |
| 67 | + </div> |
| 68 | + <span class="count" :style="countStyle(j)">{{ countSequence(aa, seqStart).toString() }}</span> |
| 69 | + </template> |
70 | 70 | </div> |
71 | 71 | </div> |
72 | 72 | </div> |
@@ -476,9 +476,18 @@ export default { |
476 | 476 | handleUpdateEntries() { |
477 | 477 | this.actualResno.length = 0 |
478 | 478 | this.entries.forEach((e, i) => { |
| 479 | + const isMultimer = !e.suffix ? false : true |
479 | 480 | let acc = 0 |
480 | 481 | const nums = [...e.aa].map((c, j) => { |
481 | | - if (c !== '-') return c + String(++acc) |
| 482 | + if (c !== '-') { |
| 483 | + if (isMultimer) { |
| 484 | + const chain = e.chains[++acc] |
| 485 | + const resn = acc - e.offsets[chain] |
| 486 | + return chain + ':' + c + String(resn) |
| 487 | + } else { |
| 488 | + return c + String(++acc) |
| 489 | + } |
| 490 | + } |
482 | 491 | else return "" |
483 | 492 | }) |
484 | 493 | this.actualResno.push(nums) |
@@ -990,11 +999,11 @@ export default { |
990 | 999 | content: ""; |
991 | 1000 | position: absolute; |
992 | 1001 | left: 50%; |
993 | | - top: -12px; |
| 1002 | + bottom: -12px; |
994 | 1003 | transform: translateX(-50%); |
995 | 1004 | border-left: 4px solid transparent; |
996 | 1005 | border-right: 4px solid transparent; |
997 | | - border-top: 6px solid rgba(0, 0, 0, 0.7); |
| 1006 | + border-bottom: 6px solid rgba(0, 0, 0, 0.7); |
998 | 1007 | } |
999 | 1008 | .theme--dark .column-active { |
1000 | 1009 | background-color: rgba(255, 255, 255, 0.4); |
|
0 commit comments