Skip to content

Commit 89c36f8

Browse files
committed
Add AlphaMissense in Functional prediction
1 parent 562cc0d commit 89c36f8

File tree

5 files changed

+167
-32
lines changed

5 files changed

+167
-32
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@
2626
"classnames": "^2.2.6",
2727
"file-loader": "^4.3.0",
2828
"font-awesome": "^4.7.0",
29-
"genome-nexus-ts-api-client": "1.1.32",
29+
"genome-nexus-ts-api-client": "1.1.33",
3030
"lodash": "^4.17.21",
3131
"mobx": "^6.0.0",
3232
"mobx-react": "^6.0.0",

src/component/variantPage/FunctionalPrediction.tsx

Lines changed: 29 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@ import {
77
import MutationAssessor from './functionalPrediction/MutationAssesor';
88
import Sift from './functionalPrediction/Sift';
99
import PolyPhen2 from './functionalPrediction/PolyPhen2';
10-
import { SHOW_MUTATION_ASSESSOR } from '../../config/configDefaults';
10+
import AlphaMissense from './functionalPrediction/AlphaMissense';
11+
import { SHOW_ALPHAMISSENSE } from '../../config/configDefaults';
1112
import Separator from '../Separator';
1213
import { GENOME_BUILD } from '../../util/SearchUtils';
1314

@@ -25,6 +26,8 @@ interface IFunctionalImpactData {
2526
siftPrediction: string | undefined;
2627
polyPhenScore: number | undefined;
2728
polyPhenPrediction: string | undefined;
29+
amClass: string | undefined;
30+
amPathogenicityScore: number | undefined;
2831
}
2932

3033
@observer
@@ -52,8 +55,16 @@ class FunctionalPrediction extends React.Component<IFunctionalPredictionProps> {
5255
genomeNexusData &&
5356
genomeNexusData.transcript_consequences &&
5457
genomeNexusData.transcript_consequences[0].polyphen_prediction;
58+
const amClass =
59+
genomeNexusData?.annotation_summary?.transcriptConsequenceSummary
60+
?.alphaMissense?.pathogenicity || undefined;
61+
const amPathogenicityScore =
62+
genomeNexusData?.annotation_summary?.transcriptConsequenceSummary
63+
?.alphaMissense?.score || undefined;
5564

5665
return {
66+
amClass,
67+
amPathogenicityScore,
5768
mutationAssessor,
5869
siftScore,
5970
siftPrediction,
@@ -63,32 +74,34 @@ class FunctionalPrediction extends React.Component<IFunctionalPredictionProps> {
6374
}
6475
public render() {
6576
const data = this.getData(this.props.variantAnnotation);
66-
// Mutation Assessor only available in grch37
67-
const shouldShowMutationAssessor =
68-
SHOW_MUTATION_ASSESSOR &&
69-
this.props.genomeBuild === GENOME_BUILD.GRCh37;
77+
const shouldShowAlphaMissense = SHOW_ALPHAMISSENSE;
7078
return (
7179
<div>
7280
<PolyPhen2
7381
polyPhenScore={data.polyPhenScore}
7482
polyPhenPrediction={data.polyPhenPrediction}
7583
/>
7684
<Separator />
77-
{shouldShowMutationAssessor && (
78-
<>
79-
<MutationAssessor
80-
mutationAssessor={data.mutationAssessor}
81-
isCanonicalTranscriptSelected={
82-
this.props.isCanonicalTranscriptSelected
83-
}
84-
/>
85-
<Separator />
86-
</>
87-
)}
85+
<>
86+
<MutationAssessor
87+
mutationAssessor={data.mutationAssessor}
88+
isCanonicalTranscriptSelected={
89+
this.props.isCanonicalTranscriptSelected
90+
}
91+
/>
92+
<Separator />
93+
</>
8894
<Sift
8995
siftScore={data.siftScore}
9096
siftPrediction={data.siftPrediction}
9197
/>
98+
<Separator />
99+
{shouldShowAlphaMissense && (
100+
<AlphaMissense
101+
amClass={data.amClass}
102+
amPathogenicityScore={data.amPathogenicityScore}
103+
/>
104+
)}
92105
</div>
93106
);
94107
}
Lines changed: 120 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
import * as React from 'react';
2+
import { DefaultTooltip } from 'cbioportal-frontend-commons';
3+
import { makeObservable, observable } from 'mobx';
4+
import { observer } from 'mobx-react';
5+
import functionalGroupsStyle from '../functionalGroups.module.scss';
6+
7+
export interface IAlphaMissenseProps {
8+
amClass?: string;
9+
amPathogenicityScore?: number;
10+
}
11+
12+
const ALPHAMISSENSE_URL = 'https://www.science.org/doi/10.1126/science.adg7492';
13+
14+
const AlphaMissenseInfo: React.FunctionComponent = () => {
15+
return (
16+
<div>
17+
<a
18+
href={ALPHAMISSENSE_URL}
19+
target="_blank"
20+
rel="noopener noreferrer"
21+
>
22+
AlphaMissense
23+
</a>{' '}
24+
uses deep learning to assess the pathogenicity of missense variants,
25+
indicating how they might affect gene function and contribute to
26+
disease.
27+
<div>
28+
<b>Scores:</b>
29+
<ul>
30+
<li>
31+
<b>Pathogenic:</b> Score &gt; 0.564 – likely to cause
32+
disease.
33+
</li>
34+
<li>
35+
<b>Benign:</b> Score &lt; 0.34 – unlikely to cause
36+
disease.
37+
</li>
38+
<li>
39+
<b>Ambiguous:</b> Score between 0.34 and 0.564 – unclear
40+
impact; insufficient data.
41+
</li>
42+
</ul>
43+
</div>
44+
</div>
45+
);
46+
};
47+
48+
@observer
49+
export default class AlphaMissense extends React.Component<
50+
IAlphaMissenseProps,
51+
{}
52+
> {
53+
@observable showDetails = false;
54+
55+
constructor(props: IAlphaMissenseProps) {
56+
super(props);
57+
makeObservable(this);
58+
}
59+
60+
public render() {
61+
let alphaMissenseContent: JSX.Element;
62+
63+
const dataSource = (
64+
<>
65+
AlphaMissense&nbsp;
66+
<i className="fas fa-external-link-alt" />
67+
</>
68+
);
69+
if (
70+
this.props.amClass &&
71+
this.props.amClass.length > 0 &&
72+
this.props.amClass !== 'N/A'
73+
) {
74+
alphaMissenseContent = (
75+
<span>
76+
<p>
77+
{this.props.amClass + ' '}(
78+
{this.props.amPathogenicityScore})
79+
</p>{' '}
80+
</span>
81+
);
82+
} else {
83+
alphaMissenseContent = <span> N/A </span>;
84+
}
85+
86+
return (
87+
<div className={functionalGroupsStyle['functional-group']}>
88+
<div className={functionalGroupsStyle['data-source']}>
89+
<DefaultTooltip
90+
placement="top"
91+
overlay={
92+
<div style={{ maxWidth: 450 }}>
93+
<AlphaMissenseInfo />
94+
</div>
95+
}
96+
>
97+
<a
98+
href={ALPHAMISSENSE_URL}
99+
target="_blank"
100+
rel="noopener noreferrer"
101+
>
102+
{dataSource}
103+
</a>
104+
</DefaultTooltip>
105+
</div>
106+
<div>
107+
<span className={functionalGroupsStyle['data-with-link']}>
108+
<a
109+
href={ALPHAMISSENSE_URL}
110+
target="_blank"
111+
rel="noopener noreferrer"
112+
>
113+
{alphaMissenseContent}
114+
</a>
115+
</span>
116+
</div>
117+
</div>
118+
);
119+
}
120+
}

src/config/configDefaults.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,12 @@
11
export const SHOW_MUTATION_ASSESSOR = true;
2-
2+
export const SHOW_ALPHAMISSENSE = true;
33
export function annotationQueryFields() {
44
const fields = DEFAULT_ANNOTATION_QUERY_FIELDS;
55
if (SHOW_MUTATION_ASSESSOR) {
66
fields.push('mutation_assessor');
77
}
88
return fields;
99
}
10-
1110
export const DEFAULT_ANNOTATION_QUERY_FIELDS = [
1211
'hotspots',
1312
'annotation_summary',

yarn.lock

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -4260,15 +4260,10 @@ caniuse-db@^1.0.30000529, caniuse-db@^1.0.30000634, caniuse-db@^1.0.30000639:
42604260
resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30000985.tgz#208c723beb15123eb27cc6ad9bc285b4f27a3f87"
42614261
integrity sha512-1m3CC9+dYNh/FHd0V1/McOB73CxjmzzrcXi360x8mKoApUY8QIOYXg4bU5QeJmlenn++20GBI38EKw6qQpJ3kQ==
42624262

4263-
caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000984:
4264-
version "1.0.30000985"
4265-
resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000985.tgz#0eb40f6c8a8c219155cbe43c4975c0efb4a0f77f"
4266-
integrity sha512-1ngiwkgqAYPG0JSSUp3PUDGPKKY59EK7NrGGX+VOxaKCNzRbNc7uXMny+c3VJfZxtoK3wSImTvG9T9sXiTw2+w==
4267-
4268-
caniuse-lite@^1.0.30000981, caniuse-lite@^1.0.30001035, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001219:
4269-
version "1.0.30001245"
4270-
resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001245.tgz#45b941bbd833cb0fa53861ff2bae746b3c6ca5d4"
4271-
integrity sha512-768fM9j1PKXpOCKws6eTo3RHmvTUsG9UrpT4WoREFeZgJBTi4/X9g565azS/rVUGtqb8nt7FjLeF5u4kukERnA==
4263+
caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000981, caniuse-lite@^1.0.30000984, caniuse-lite@^1.0.30001035, caniuse-lite@^1.0.30001109, caniuse-lite@^1.0.30001219:
4264+
version "1.0.30001643"
4265+
resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001643.tgz"
4266+
integrity sha512-ERgWGNleEilSrHM6iUz/zJNSQTP8Mr21wDWpdgvRwcTXGAq6jMtOUPP4dqFPTdKqZ2wKTdtB+uucZ3MRpAUSmg==
42724267

42734268
canvg@1.5.3:
42744269
version "1.5.3"
@@ -7038,10 +7033,10 @@ gauge@~2.7.3:
70387033
strip-ansi "^3.0.1"
70397034
wide-align "^1.1.0"
70407035

7041-
genome-nexus-ts-api-client@1.1.32, genome-nexus-ts-api-client@^1.1.32:
7042-
version "1.1.32"
7043-
resolved "https://registry.yarnpkg.com/genome-nexus-ts-api-client/-/genome-nexus-ts-api-client-1.1.32.tgz#e8a9c70d6644e17ae7f76c803ecb0d3e1720c7d9"
7044-
integrity sha512-ELXH+50alvUVnRioxCOLvxf5VcN57YVheF80kEVFBXT5cnO178tvDLHdaqbmAlEvezHwptercQ9kqh8d9TTm5Q==
7036+
genome-nexus-ts-api-client@1.1.33:
7037+
version "1.1.33"
7038+
resolved "https://registry.yarnpkg.com/genome-nexus-ts-api-client/-/genome-nexus-ts-api-client-1.1.33.tgz#aea3eafe6ca59e0187c25c487b7fb9f9b704bdde"
7039+
integrity sha512-wrbDKoVjw9etDChfacrNStlORqWlS/k2dA5DzlxFEfen3WYO7QtXAFLVSxpjanA/3sGQnVqaxreZzjTPDXhs1A==
70457040
dependencies:
70467041
superagent "^3.8.3"
70477042
typescript "4.0.3"
@@ -7054,6 +7049,14 @@ genome-nexus-ts-api-client@^1.1.28:
70547049
superagent "^3.8.3"
70557050
typescript "4.0.3"
70567051

7052+
genome-nexus-ts-api-client@^1.1.32:
7053+
version "1.1.32"
7054+
resolved "https://registry.yarnpkg.com/genome-nexus-ts-api-client/-/genome-nexus-ts-api-client-1.1.32.tgz#e8a9c70d6644e17ae7f76c803ecb0d3e1720c7d9"
7055+
integrity sha512-ELXH+50alvUVnRioxCOLvxf5VcN57YVheF80kEVFBXT5cnO178tvDLHdaqbmAlEvezHwptercQ9kqh8d9TTm5Q==
7056+
dependencies:
7057+
superagent "^3.8.3"
7058+
typescript "4.0.3"
7059+
70577060
gensync@^1.0.0-beta.1:
70587061
version "1.0.0-beta.2"
70597062
resolved "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.2.tgz#32a6ee76c3d7f52d46b2b1ae5d93fea8580a25e0"

0 commit comments

Comments
 (0)