protvista-uniprot 4.0.0 → 4.2.0
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.
- package/dist/protvista-uniprot.mjs +25990 -30637
- package/dist/protvista-uniprot.mjs.map +1 -1
- package/dist/types/adapters/ptm-exchange-adapter.d.ts +1 -1
- package/dist/types/adapters/rna-editing-adapter.d.ts +6 -0
- package/dist/types/adapters/rna-editing-graph-adapter.d.ts +11 -0
- package/dist/types/adapters/types/rna-editing.d.ts +69 -0
- package/dist/types/config.d.ts +1 -1
- package/dist/types/tooltips/ptmTooltip.d.ts +5 -0
- package/dist/types/tooltips/rnaEditingTooltip.d.ts +3 -0
- package/package.json +11 -11
- package/src/.vscode/settings.json +3 -0
- package/src/adapters/ptm-exchange-adapter.ts +4 -52
- package/src/adapters/rna-editing-adapter.ts +29 -0
- package/src/adapters/rna-editing-graph-adapter.ts +48 -0
- package/src/adapters/types/rna-editing.ts +175 -0
- package/src/adapters/variation-adapter.ts +1 -3
- package/src/adapters/variation-graph-adapter.ts +5 -6
- package/src/config.ts +35 -1
- package/src/protvista-uniprot.ts +7 -5
- package/src/tooltips/featureTooltip.ts +9 -16
- package/src/tooltips/ptmTooltip.ts +86 -0
- package/src/tooltips/rnaEditingTooltip.ts +54 -0
- package/src/tooltips/structureTooltip.ts +9 -1
- package/src/tooltips/variationTooltip.ts +32 -46
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
export type RnaEditing = {
|
|
2
|
+
accession: string;
|
|
3
|
+
entryName: string;
|
|
4
|
+
sequence: string;
|
|
5
|
+
sequenceChecksum: string;
|
|
6
|
+
taxid: number;
|
|
7
|
+
features: RnaEditingFeature[];
|
|
8
|
+
};
|
|
9
|
+
export type RnaEditingFeature = {
|
|
10
|
+
type: Type;
|
|
11
|
+
xrefs: Xref[];
|
|
12
|
+
dbReferenceType: DBReferenceType[];
|
|
13
|
+
variantType: VariantType;
|
|
14
|
+
rnaEditingInfo: RnaEditingInfo;
|
|
15
|
+
locationType: LocationType;
|
|
16
|
+
variantlocation: string[];
|
|
17
|
+
};
|
|
18
|
+
export type TransformedRnaEditing = RnaEditingFeature & {
|
|
19
|
+
accession: string;
|
|
20
|
+
variant: string;
|
|
21
|
+
start: number;
|
|
22
|
+
end: number;
|
|
23
|
+
tooltipContent: string;
|
|
24
|
+
consequenceType: string;
|
|
25
|
+
};
|
|
26
|
+
type DBReferenceType = {
|
|
27
|
+
id: string;
|
|
28
|
+
type: Type;
|
|
29
|
+
};
|
|
30
|
+
type Type = 'rna_editing';
|
|
31
|
+
type LocationType = {
|
|
32
|
+
position: Position;
|
|
33
|
+
};
|
|
34
|
+
type Position = {
|
|
35
|
+
position: number;
|
|
36
|
+
status: Status;
|
|
37
|
+
};
|
|
38
|
+
type Status = 'certain';
|
|
39
|
+
type RnaEditingInfo = {
|
|
40
|
+
nedBS: number;
|
|
41
|
+
nsamples: number;
|
|
42
|
+
nbodySites: number;
|
|
43
|
+
ntissues: number;
|
|
44
|
+
nedInd: number;
|
|
45
|
+
};
|
|
46
|
+
type VariantType = {
|
|
47
|
+
genomicLocation: string[];
|
|
48
|
+
variantLocation: VariantLocation[];
|
|
49
|
+
codon: Codon;
|
|
50
|
+
consequenceType: ConsequenceType;
|
|
51
|
+
wildType: DType;
|
|
52
|
+
mutatedType: DType;
|
|
53
|
+
somaticStatus: boolean;
|
|
54
|
+
sourceType: SourceType;
|
|
55
|
+
};
|
|
56
|
+
type Codon = 'aCa' | 'aCg' | 'aCc' | 'aCu' | 'aGa' | 'aGc' | 'aGg' | 'aGu' | 'auG' | 'cCa' | 'cCg' | 'cCc' | 'cCu' | 'Cga' | 'cGa' | 'cGc' | 'cGg' | 'cGu' | 'Cac' | 'Cag' | 'Cau' | 'Cca' | 'Ccc' | 'Ccg' | 'Ccu' | 'Cgc' | 'Cgg' | 'Cgu' | 'Cuc' | 'Cuu' | 'gCa' | 'Gcc' | 'gCg' | 'gCc' | 'gCu' | 'gGa' | 'gGc' | 'gGg' | 'gGu' | 'Gaa' | 'Gac' | 'Gag' | 'Gau' | 'Gca' | 'Gcg' | 'Gcu' | 'Gga' | 'Ggc' | 'Ggg' | 'Ggu' | 'Gua' | 'Guc' | 'Gug' | 'Guu' | 'uCa' | 'uCg' | 'uCc' | 'uCu' | 'uGc' | 'uGu' | 'ugG';
|
|
57
|
+
type ConsequenceType = 'missense';
|
|
58
|
+
type DType = 'A' | 'C' | 'D' | 'E' | 'F' | 'G' | 'H' | 'I' | 'K' | 'L' | 'M' | 'N' | 'P' | 'Q' | 'R' | 'S' | 'T' | 'U' | 'V' | 'W' | 'Y';
|
|
59
|
+
type SourceType = 'Rna Editing';
|
|
60
|
+
type VariantLocation = {
|
|
61
|
+
loc: string;
|
|
62
|
+
seqId: string;
|
|
63
|
+
source: Source;
|
|
64
|
+
};
|
|
65
|
+
type Source = 'Ensembl';
|
|
66
|
+
type Xref = {
|
|
67
|
+
id: string;
|
|
68
|
+
};
|
|
69
|
+
export {};
|
package/dist/types/config.d.ts
CHANGED
|
@@ -7,7 +7,7 @@ export type ProtvistaTrackConfig = {
|
|
|
7
7
|
trackType: TrackType;
|
|
8
8
|
data: {
|
|
9
9
|
url: string | string[];
|
|
10
|
-
adapter?: 'feature-adapter' | 'structure-adapter' | 'proteomics-adapter' | 'variation-adapter' | 'variation-graph-adapter' | 'interpro-adapter' | 'alphafold-confidence-adapter' | 'alphamissense-pathogenicity-adapter' | 'alphamissense-heatmap-adapter' | 'proteomics-ptm-adapter';
|
|
10
|
+
adapter?: 'feature-adapter' | 'structure-adapter' | 'proteomics-adapter' | 'variation-adapter' | 'variation-graph-adapter' | 'interpro-adapter' | 'alphafold-confidence-adapter' | 'alphamissense-pathogenicity-adapter' | 'alphamissense-heatmap-adapter' | 'proteomics-ptm-adapter' | 'rna-editing-adapter' | 'rna-editing-graph-adapter';
|
|
11
11
|
}[];
|
|
12
12
|
tooltip: string;
|
|
13
13
|
color?: string;
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import { PTM } from '../adapters/ptm-exchange-adapter';
|
|
2
|
+
export declare const phosphorylate: (aa: string) => string;
|
|
3
|
+
export declare const sumoylate: (aa: string) => string;
|
|
4
|
+
declare const formatTooltip: (ptms: PTM[], aa: string, confidenceScore: string) => string;
|
|
5
|
+
export default formatTooltip;
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "protvista-uniprot",
|
|
3
3
|
"description": "ProtVista tool for the UniProt website",
|
|
4
|
-
"version": "4.
|
|
4
|
+
"version": "4.2.0",
|
|
5
5
|
"files": [
|
|
6
6
|
"dist",
|
|
7
7
|
"src"
|
|
@@ -29,17 +29,17 @@
|
|
|
29
29
|
"author": "Xavier Watkins <xwatkins@ebi.ac.uk>",
|
|
30
30
|
"license": "MIT",
|
|
31
31
|
"dependencies": {
|
|
32
|
-
"@nightingale-elements/nightingale-colored-sequence": "5.
|
|
33
|
-
"@nightingale-elements/nightingale-filter": "5.
|
|
34
|
-
"@nightingale-elements/nightingale-interpro-track": "5.
|
|
35
|
-
"@nightingale-elements/nightingale-linegraph-track": "5.
|
|
36
|
-
"@nightingale-elements/nightingale-manager": "5.
|
|
37
|
-
"@nightingale-elements/nightingale-navigation": "5.
|
|
38
|
-
"@nightingale-elements/nightingale-sequence": "5.
|
|
32
|
+
"@nightingale-elements/nightingale-colored-sequence": "5.4.0",
|
|
33
|
+
"@nightingale-elements/nightingale-filter": "5.4.0",
|
|
34
|
+
"@nightingale-elements/nightingale-interpro-track": "5.4.0",
|
|
35
|
+
"@nightingale-elements/nightingale-linegraph-track": "5.4.0",
|
|
36
|
+
"@nightingale-elements/nightingale-manager": "5.4.0",
|
|
37
|
+
"@nightingale-elements/nightingale-navigation": "5.4.0",
|
|
38
|
+
"@nightingale-elements/nightingale-sequence": "5.4.0",
|
|
39
39
|
"@nightingale-elements/nightingale-sequence-heatmap": "5.4.0",
|
|
40
|
-
"@nightingale-elements/nightingale-structure": "5.
|
|
41
|
-
"@nightingale-elements/nightingale-track": "5.
|
|
42
|
-
"@nightingale-elements/nightingale-variation": "5.
|
|
40
|
+
"@nightingale-elements/nightingale-structure": "5.4.0",
|
|
41
|
+
"@nightingale-elements/nightingale-track": "5.4.0",
|
|
42
|
+
"@nightingale-elements/nightingale-variation": "5.4.0",
|
|
43
43
|
"color-hash": "2.0.2",
|
|
44
44
|
"core-js": "3.13.0",
|
|
45
45
|
"lit": "3.1.3",
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import formatTooltip from "../tooltips/ptmTooltip";
|
|
2
|
+
|
|
1
3
|
type ProteomicsPtm = {
|
|
2
4
|
accession: string;
|
|
3
5
|
entryName: string;
|
|
@@ -34,7 +36,7 @@ type Xref = {
|
|
|
34
36
|
url: string;
|
|
35
37
|
};
|
|
36
38
|
|
|
37
|
-
type PTM = {
|
|
39
|
+
export type PTM = {
|
|
38
40
|
name: string;
|
|
39
41
|
position: number;
|
|
40
42
|
sources: string[];
|
|
@@ -52,34 +54,11 @@ enum ConfidenceScoreColors {
|
|
|
52
54
|
Bronze = '#a65708',
|
|
53
55
|
}
|
|
54
56
|
|
|
55
|
-
const aaToPhosphorylated = {
|
|
56
|
-
R: 'Phosphoarginine',
|
|
57
|
-
C: 'Phosphocysteine',
|
|
58
|
-
H: 'Phosphohistidine',
|
|
59
|
-
S: 'Phosphoserine',
|
|
60
|
-
T: 'Phosphothreonine',
|
|
61
|
-
Y: 'Phosphotyrosine',
|
|
62
|
-
};
|
|
63
|
-
|
|
64
|
-
const phosphorylate = (aa: string) => {
|
|
65
|
-
const AA = aa.toUpperCase();
|
|
66
|
-
if (AA in aaToPhosphorylated) {
|
|
67
|
-
return aaToPhosphorylated[AA as keyof typeof aaToPhosphorylated];
|
|
68
|
-
}
|
|
69
|
-
console.error(`${AA} not a valid amino acid for phosphorylation`);
|
|
70
|
-
return '';
|
|
71
|
-
};
|
|
72
|
-
|
|
73
57
|
const convertPtmExchangePtms = (
|
|
74
58
|
ptms: PTM[],
|
|
75
59
|
aa: string,
|
|
76
60
|
absolutePosition: number
|
|
77
61
|
) => {
|
|
78
|
-
const evidences = [
|
|
79
|
-
...ptms.flatMap(({ dbReferences }) =>
|
|
80
|
-
dbReferences?.flatMap(({ id }) => [id])
|
|
81
|
-
),
|
|
82
|
-
];
|
|
83
62
|
const confidenceScores = new Set(
|
|
84
63
|
ptms.flatMap(({ dbReferences }) =>
|
|
85
64
|
dbReferences?.map(({ properties }) => properties['Confidence score'])
|
|
@@ -97,40 +76,13 @@ const convertPtmExchangePtms = (
|
|
|
97
76
|
[confidenceScore] = confidenceScores;
|
|
98
77
|
}
|
|
99
78
|
|
|
100
|
-
const tooltip = `
|
|
101
|
-
<h5>Description</h5><p>${phosphorylate(aa)}</p>
|
|
102
|
-
${
|
|
103
|
-
confidenceScore
|
|
104
|
-
? `<h5 data-article-id="mod_res_large_scale#confidence-score">Confidence Score</h5><p>${confidenceScore}</p>`
|
|
105
|
-
: ''
|
|
106
|
-
}
|
|
107
|
-
${
|
|
108
|
-
evidences
|
|
109
|
-
? `<h5>Evidence</h5><ul class="no-bullet">${evidences
|
|
110
|
-
.map((id) => {
|
|
111
|
-
const datasetID = id === 'Glue project' ? 'PXD012174' : id;
|
|
112
|
-
return `<li title='${datasetID}' style="padding: .25rem 0">${datasetID}
|
|
113
|
-
(<a href="https://proteomecentral.proteomexchange.org/dataset/${datasetID}" style="color:#FFF" target="_blank">ProteomeXchange</a>)
|
|
114
|
-
</li>
|
|
115
|
-
${
|
|
116
|
-
id === 'Glue project'
|
|
117
|
-
? `<li title="publication" style="padding: .25rem 0">Publication: 31819260 (<a href="https://pubmed.ncbi.nlm.nih.gov/31819260" style="color:#FFF" target="_blank">PubMed</a>)</li>`
|
|
118
|
-
: ''
|
|
119
|
-
}
|
|
120
|
-
`;
|
|
121
|
-
})
|
|
122
|
-
.join('')}</ul>`
|
|
123
|
-
: ''
|
|
124
|
-
}
|
|
125
|
-
`;
|
|
126
|
-
|
|
127
79
|
return {
|
|
128
80
|
source: 'PTMeXchange',
|
|
129
81
|
type: 'MOD_RES_LS',
|
|
130
82
|
start: absolutePosition,
|
|
131
83
|
end: absolutePosition,
|
|
132
84
|
shape: 'triangle',
|
|
133
|
-
tooltipContent:
|
|
85
|
+
tooltipContent: formatTooltip(ptms, aa, confidenceScore),
|
|
134
86
|
color:
|
|
135
87
|
(confidenceScore && ConfidenceScoreColors[confidenceScore]) || 'black',
|
|
136
88
|
};
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { AminoAcid } from '@nightingale-elements/nightingale-variation';
|
|
2
|
+
|
|
3
|
+
import { RnaEditing, TransformedRnaEditing } from './types/rna-editing';
|
|
4
|
+
import formatTooltip from '../tooltips/rnaEditingTooltip';
|
|
5
|
+
|
|
6
|
+
const transformData = ({
|
|
7
|
+
sequence,
|
|
8
|
+
features = [],
|
|
9
|
+
}: RnaEditing): {
|
|
10
|
+
sequence: string;
|
|
11
|
+
variants: TransformedRnaEditing[];
|
|
12
|
+
} => ({
|
|
13
|
+
sequence,
|
|
14
|
+
variants: features.map((feature) => {
|
|
15
|
+
const transformed: TransformedRnaEditing = {
|
|
16
|
+
...feature,
|
|
17
|
+
accession: feature.variantType.genomicLocation?.join(', '),
|
|
18
|
+
variant: feature.variantType.mutatedType || AminoAcid.Empty,
|
|
19
|
+
start: +feature.locationType.position.position,
|
|
20
|
+
end: +feature.locationType.position.position,
|
|
21
|
+
consequenceType: feature.variantType.consequenceType,
|
|
22
|
+
tooltipContent: '', // Set with transformed feature below,
|
|
23
|
+
};
|
|
24
|
+
transformed.tooltipContent = formatTooltip(transformed);
|
|
25
|
+
return transformed;
|
|
26
|
+
}),
|
|
27
|
+
});
|
|
28
|
+
|
|
29
|
+
export default transformData;
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { RnaEditing } from './types/rna-editing';
|
|
2
|
+
|
|
3
|
+
const transformData = (data: RnaEditing) => {
|
|
4
|
+
if (data.sequence && data.features.length) {
|
|
5
|
+
const total = new Uint8ClampedArray(data.sequence.length);
|
|
6
|
+
const missense = new Uint8ClampedArray(data.sequence.length);
|
|
7
|
+
const synonymous = new Uint8ClampedArray(data.sequence.length);
|
|
8
|
+
for (const feature of data.features) {
|
|
9
|
+
const index = +feature.locationType.position.position;
|
|
10
|
+
const consequence = feature.variantType.consequenceType;
|
|
11
|
+
if (index >= 0 && index <= data.sequence.length) {
|
|
12
|
+
total[index] += 1;
|
|
13
|
+
if (consequence === 'missense') {
|
|
14
|
+
missense[index] += 1;
|
|
15
|
+
} else if (consequence === 'synonymous') {
|
|
16
|
+
// TODO: at present the data contains only missense
|
|
17
|
+
synonymous[index] += 1;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
const range = [0, Math.max(...total)];
|
|
23
|
+
const graphData = [
|
|
24
|
+
{
|
|
25
|
+
name: 'missense',
|
|
26
|
+
range,
|
|
27
|
+
color: 'darkgrey',
|
|
28
|
+
values: [...missense].map((value, index) => ({
|
|
29
|
+
position: index,
|
|
30
|
+
value: value,
|
|
31
|
+
})),
|
|
32
|
+
},
|
|
33
|
+
// TODO: at present the data contains only missense
|
|
34
|
+
// {
|
|
35
|
+
// name: 'synonymous',
|
|
36
|
+
// range,
|
|
37
|
+
// color: 'red',
|
|
38
|
+
// values: [...synonymous].map((value, index) => ({
|
|
39
|
+
// position: index,
|
|
40
|
+
// value: value,
|
|
41
|
+
// })),
|
|
42
|
+
// },
|
|
43
|
+
];
|
|
44
|
+
return graphData;
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
export default transformData;
|
|
@@ -0,0 +1,175 @@
|
|
|
1
|
+
// Yvonne Lussi: This first dataset is for human proteins, and we decided to only show
|
|
2
|
+
// the RNA editing events that have missense consequence. It may be possible to import
|
|
3
|
+
// the synonymous events at a later timepoint.
|
|
4
|
+
// Fetch all of the available human rna-editing entries
|
|
5
|
+
// Source: https://www.ebi.ac.uk/proteins/api/rna-editing?offset=0&size=-1&taxid=9606
|
|
6
|
+
// Save above request to rna-editing.json then using quicktype tool (https://github.com/glideapps/quicktype):
|
|
7
|
+
// quicktype rna-editing.json -o rna-editing.ts --just-types
|
|
8
|
+
// Changed interfaces for types and replaced enums string literal types
|
|
9
|
+
|
|
10
|
+
export type RnaEditing = {
|
|
11
|
+
accession: string;
|
|
12
|
+
entryName: string;
|
|
13
|
+
sequence: string;
|
|
14
|
+
sequenceChecksum: string;
|
|
15
|
+
taxid: number;
|
|
16
|
+
features: RnaEditingFeature[];
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
export type RnaEditingFeature = {
|
|
20
|
+
type: Type;
|
|
21
|
+
xrefs: Xref[];
|
|
22
|
+
dbReferenceType: DBReferenceType[];
|
|
23
|
+
variantType: VariantType;
|
|
24
|
+
rnaEditingInfo: RnaEditingInfo;
|
|
25
|
+
locationType: LocationType;
|
|
26
|
+
variantlocation: string[];
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
export type TransformedRnaEditing = RnaEditingFeature & {
|
|
30
|
+
accession: string;
|
|
31
|
+
variant: string;
|
|
32
|
+
start: number;
|
|
33
|
+
end: number;
|
|
34
|
+
tooltipContent: string;
|
|
35
|
+
consequenceType: string;
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
type DBReferenceType = {
|
|
39
|
+
id: string;
|
|
40
|
+
type: Type;
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
type Type = 'rna_editing';
|
|
44
|
+
|
|
45
|
+
type LocationType = {
|
|
46
|
+
position: Position;
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
type Position = {
|
|
50
|
+
position: number;
|
|
51
|
+
status: Status;
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
type Status = 'certain';
|
|
55
|
+
|
|
56
|
+
type RnaEditingInfo = {
|
|
57
|
+
nedBS: number;
|
|
58
|
+
nsamples: number;
|
|
59
|
+
nbodySites: number;
|
|
60
|
+
ntissues: number;
|
|
61
|
+
nedInd: number;
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
type VariantType = {
|
|
65
|
+
genomicLocation: string[];
|
|
66
|
+
variantLocation: VariantLocation[];
|
|
67
|
+
codon: Codon;
|
|
68
|
+
consequenceType: ConsequenceType;
|
|
69
|
+
wildType: DType;
|
|
70
|
+
mutatedType: DType;
|
|
71
|
+
somaticStatus: boolean;
|
|
72
|
+
sourceType: SourceType;
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
type Codon =
|
|
76
|
+
| 'aCa'
|
|
77
|
+
| 'aCg'
|
|
78
|
+
| 'aCc'
|
|
79
|
+
| 'aCu'
|
|
80
|
+
| 'aGa'
|
|
81
|
+
| 'aGc'
|
|
82
|
+
| 'aGg'
|
|
83
|
+
| 'aGu'
|
|
84
|
+
| 'auG'
|
|
85
|
+
| 'cCa'
|
|
86
|
+
| 'cCg'
|
|
87
|
+
| 'cCc'
|
|
88
|
+
| 'cCu'
|
|
89
|
+
| 'Cga'
|
|
90
|
+
| 'cGa'
|
|
91
|
+
| 'cGc'
|
|
92
|
+
| 'cGg'
|
|
93
|
+
| 'cGu'
|
|
94
|
+
| 'Cac'
|
|
95
|
+
| 'Cag'
|
|
96
|
+
| 'Cau'
|
|
97
|
+
| 'Cca'
|
|
98
|
+
| 'Ccc'
|
|
99
|
+
| 'Ccg'
|
|
100
|
+
| 'Ccu'
|
|
101
|
+
| 'Cgc'
|
|
102
|
+
| 'Cgg'
|
|
103
|
+
| 'Cgu'
|
|
104
|
+
| 'Cuc'
|
|
105
|
+
| 'Cuu'
|
|
106
|
+
| 'gCa'
|
|
107
|
+
| 'Gcc'
|
|
108
|
+
| 'gCg'
|
|
109
|
+
| 'gCc'
|
|
110
|
+
| 'gCu'
|
|
111
|
+
| 'gGa'
|
|
112
|
+
| 'gGc'
|
|
113
|
+
| 'gGg'
|
|
114
|
+
| 'gGu'
|
|
115
|
+
| 'Gaa'
|
|
116
|
+
| 'Gac'
|
|
117
|
+
| 'Gag'
|
|
118
|
+
| 'Gau'
|
|
119
|
+
| 'Gca'
|
|
120
|
+
| 'Gcg'
|
|
121
|
+
| 'Gcu'
|
|
122
|
+
| 'Gga'
|
|
123
|
+
| 'Ggc'
|
|
124
|
+
| 'Ggg'
|
|
125
|
+
| 'Ggu'
|
|
126
|
+
| 'Gua'
|
|
127
|
+
| 'Guc'
|
|
128
|
+
| 'Gug'
|
|
129
|
+
| 'Guu'
|
|
130
|
+
| 'uCa'
|
|
131
|
+
| 'uCg'
|
|
132
|
+
| 'uCc'
|
|
133
|
+
| 'uCu'
|
|
134
|
+
| 'uGc'
|
|
135
|
+
| 'uGu'
|
|
136
|
+
| 'ugG';
|
|
137
|
+
|
|
138
|
+
type ConsequenceType = 'missense';
|
|
139
|
+
|
|
140
|
+
type DType =
|
|
141
|
+
| 'A'
|
|
142
|
+
| 'C'
|
|
143
|
+
| 'D'
|
|
144
|
+
| 'E'
|
|
145
|
+
| 'F'
|
|
146
|
+
| 'G'
|
|
147
|
+
| 'H'
|
|
148
|
+
| 'I'
|
|
149
|
+
| 'K'
|
|
150
|
+
| 'L'
|
|
151
|
+
| 'M'
|
|
152
|
+
| 'N'
|
|
153
|
+
| 'P'
|
|
154
|
+
| 'Q'
|
|
155
|
+
| 'R'
|
|
156
|
+
| 'S'
|
|
157
|
+
| 'T'
|
|
158
|
+
| 'U'
|
|
159
|
+
| 'V'
|
|
160
|
+
| 'W'
|
|
161
|
+
| 'Y';
|
|
162
|
+
|
|
163
|
+
type SourceType = 'Rna Editing';
|
|
164
|
+
|
|
165
|
+
type VariantLocation = {
|
|
166
|
+
loc: string;
|
|
167
|
+
seqId: string;
|
|
168
|
+
source: Source;
|
|
169
|
+
};
|
|
170
|
+
|
|
171
|
+
type Source = 'Ensembl';
|
|
172
|
+
|
|
173
|
+
type Xref = {
|
|
174
|
+
id: string;
|
|
175
|
+
};
|
|
@@ -29,9 +29,7 @@ const transformData = (
|
|
|
29
29
|
const variants = features.map((variant) => ({
|
|
30
30
|
...variant,
|
|
31
31
|
accession: variant.genomicLocation?.join(', '),
|
|
32
|
-
variant: variant.alternativeSequence
|
|
33
|
-
? variant.alternativeSequence
|
|
34
|
-
: AminoAcid.Empty,
|
|
32
|
+
variant: variant.alternativeSequence || AminoAcid.Empty,
|
|
35
33
|
start: +variant.begin,
|
|
36
34
|
xrefNames: getSourceType(variant.xrefs, variant.sourceType),
|
|
37
35
|
hasPredictions: variant.predictions && variant.predictions.length > 0,
|
|
@@ -15,22 +15,21 @@ const transformData = (data) => {
|
|
|
15
15
|
// eslint-disable-next-line no-continue
|
|
16
16
|
if (index < 1 || index > data.sequence.length) continue;
|
|
17
17
|
|
|
18
|
-
|
|
19
|
-
total[index]++;
|
|
18
|
+
total[index] += 1;
|
|
20
19
|
|
|
21
20
|
// eslint-disable-next-line no-continue
|
|
22
21
|
if (!association) continue;
|
|
23
22
|
const hasDisease = association.find(
|
|
24
23
|
(association) => association.disease === true
|
|
25
24
|
);
|
|
26
|
-
|
|
27
|
-
if (hasDisease) diseaseTotal[index]++;
|
|
25
|
+
if (hasDisease) diseaseTotal[index] += 1;
|
|
28
26
|
}
|
|
29
27
|
|
|
28
|
+
const range = [0, Math.max(Math.max(...total), Math.max(...diseaseTotal))];
|
|
30
29
|
const graphData = [
|
|
31
30
|
{
|
|
32
31
|
name: 'variant',
|
|
33
|
-
range
|
|
32
|
+
range,
|
|
34
33
|
color: 'darkgrey',
|
|
35
34
|
values: [...total].map((value, index) => ({
|
|
36
35
|
position: index,
|
|
@@ -39,7 +38,7 @@ const transformData = (data) => {
|
|
|
39
38
|
},
|
|
40
39
|
{
|
|
41
40
|
name: 'disease causing variant',
|
|
42
|
-
range
|
|
41
|
+
range,
|
|
43
42
|
color: 'red',
|
|
44
43
|
values: [...diseaseTotal].map((value, index) => ({
|
|
45
44
|
position: index,
|
package/src/config.ts
CHANGED
|
@@ -41,7 +41,9 @@ export type ProtvistaTrackConfig = {
|
|
|
41
41
|
| 'alphafold-confidence-adapter'
|
|
42
42
|
| 'alphamissense-pathogenicity-adapter'
|
|
43
43
|
| 'alphamissense-heatmap-adapter'
|
|
44
|
-
| 'proteomics-ptm-adapter'
|
|
44
|
+
| 'proteomics-ptm-adapter'
|
|
45
|
+
| 'rna-editing-adapter'
|
|
46
|
+
| 'rna-editing-graph-adapter';
|
|
45
47
|
}[];
|
|
46
48
|
tooltip: string;
|
|
47
49
|
color?: string;
|
|
@@ -676,6 +678,38 @@ const config: ProtvistaConfig = {
|
|
|
676
678
|
},
|
|
677
679
|
],
|
|
678
680
|
},
|
|
681
|
+
{
|
|
682
|
+
name: 'RNA_EDITING',
|
|
683
|
+
label: 'RNA Editing',
|
|
684
|
+
trackType: 'nightingale-linegraph-track',
|
|
685
|
+
tracks: [
|
|
686
|
+
{
|
|
687
|
+
name: 'rna_editing_graph',
|
|
688
|
+
label: 'Counts',
|
|
689
|
+
trackType: 'nightingale-linegraph-track',
|
|
690
|
+
data: [
|
|
691
|
+
{
|
|
692
|
+
adapter: 'rna-editing-graph-adapter',
|
|
693
|
+
url: `${proteinsApi}rna-editing/{accession}`,
|
|
694
|
+
},
|
|
695
|
+
],
|
|
696
|
+
tooltip:
|
|
697
|
+
'RNA editing events leading to one or more amino acid changes compared to the translation of the non-edited RNA version.',
|
|
698
|
+
},
|
|
699
|
+
{
|
|
700
|
+
name: 'RNA Editing',
|
|
701
|
+
trackType: 'nightingale-variation',
|
|
702
|
+
data: [
|
|
703
|
+
{
|
|
704
|
+
adapter: 'rna-editing-adapter',
|
|
705
|
+
url: `${proteinsApi}rna-editing/{accession}`,
|
|
706
|
+
},
|
|
707
|
+
],
|
|
708
|
+
tooltip:
|
|
709
|
+
'RNA editing events leading to one or more amino acid changes compared to the translation of the non-edited RNA version.',
|
|
710
|
+
},
|
|
711
|
+
],
|
|
712
|
+
},
|
|
679
713
|
{
|
|
680
714
|
name: 'PROTEOMICS',
|
|
681
715
|
label: 'Proteomics',
|
package/src/protvista-uniprot.ts
CHANGED
|
@@ -27,6 +27,8 @@ import variationAdapter, {
|
|
|
27
27
|
} from './adapters/variation-adapter';
|
|
28
28
|
import interproAdapter from './adapters/interpro-adapter';
|
|
29
29
|
import variationGraphAdapter from './adapters/variation-graph-adapter';
|
|
30
|
+
import rnaEditingGraphAdapter from './adapters/rna-editing-graph-adapter';
|
|
31
|
+
import rnaEditingAdapter from './adapters/rna-editing-adapter';
|
|
30
32
|
import proteomicsPTMApdapter from './adapters/ptm-exchange-adapter';
|
|
31
33
|
import alphaFoldConfidenceAdapter from './adapters/alphafold-confidence-adapter';
|
|
32
34
|
import alphaMissensePathogenicityAdapter from './adapters/alphamissense-pathogenicity-adapter';
|
|
@@ -56,6 +58,8 @@ const adapters = {
|
|
|
56
58
|
'structure-adapter': structureAdapter,
|
|
57
59
|
'variation-adapter': variationAdapter,
|
|
58
60
|
'variation-graph-adapter': variationGraphAdapter,
|
|
61
|
+
'rna-editing-adapter': rnaEditingAdapter,
|
|
62
|
+
'rna-editing-graph-adapter': rnaEditingGraphAdapter,
|
|
59
63
|
'proteomics-ptm-adapter': proteomicsPTMApdapter,
|
|
60
64
|
'alphafold-confidence-adapter': alphaFoldConfidenceAdapter,
|
|
61
65
|
'alphamissense-pathogenicity-adapter': alphaMissensePathogenicityAdapter,
|
|
@@ -99,8 +103,8 @@ class ProtvistaUniprot extends LitElement {
|
|
|
99
103
|
this.data = {};
|
|
100
104
|
this.rawData = {};
|
|
101
105
|
this.displayCoordinates = {};
|
|
102
|
-
|
|
103
|
-
|
|
106
|
+
this.transformedVariants = { sequence: '', variants: [] };
|
|
107
|
+
this.addStyles();
|
|
104
108
|
}
|
|
105
109
|
|
|
106
110
|
static get properties() {
|
|
@@ -117,9 +121,7 @@ class ProtvistaUniprot extends LitElement {
|
|
|
117
121
|
}
|
|
118
122
|
|
|
119
123
|
addStyles() {
|
|
120
|
-
// We are not using static get styles()
|
|
121
|
-
// as we are not using the shadowDOM
|
|
122
|
-
// because of Mol*
|
|
124
|
+
// We are not using static get styles() as we are not using the shadowDOM because of Mol*
|
|
123
125
|
const styleTag = document.createElement('style');
|
|
124
126
|
styleTag.innerHTML = `${protvistaStyles.toString()} ${loaderStyles.toString()}`;
|
|
125
127
|
document.querySelector('head')?.append(styleTag);
|