From e4828ba500b09d9e1ddcaee996a6eef128b92bd3 Mon Sep 17 00:00:00 2001 From: apolignano Date: Thu, 2 Apr 2026 15:23:28 +0200 Subject: [PATCH 1/6] v1 --- .../Structure3DModel/3DModel/index.tsx | 115 ++++++++++++++---- .../AlphaFoldStructuresTable/index.tsx | 72 +++++++++++ src/types/external-payloads.d.ts | 28 ++++- 3 files changed, 192 insertions(+), 23 deletions(-) create mode 100644 src/components/Structure3DModel/AlphaFoldStructuresTable/index.tsx diff --git a/src/components/Structure3DModel/3DModel/index.tsx b/src/components/Structure3DModel/3DModel/index.tsx index dc42a22f1..b66184ae5 100644 --- a/src/components/Structure3DModel/3DModel/index.tsx +++ b/src/components/Structure3DModel/3DModel/index.tsx @@ -23,6 +23,7 @@ import ipro from 'styles/interpro-vf.css'; import fonts from 'EBI-Icon-fonts/fonts.css'; import style from './style.css'; import buttonBar from 'components/Structure/ViewerAndEntries/button-bar.css'; +import AlphaFoldStructuresTable from '../AlphaFoldStructuresTable'; const css = cssBinder(style, buttonBar, ipro, fonts); @@ -49,6 +50,43 @@ const confidenceColors = [ }, ]; +type PredictionLoaderProps = { + entryId: string | null; + onLoaded: (model: AlphafoldModelInfo) => void; +}; +interface LoadedPredictionProps + extends PredictionLoaderProps, + LoadDataProps {} + +const PredictionLoader = ({ data, onLoaded }: LoadedPredictionProps) => { + useEffect(() => { + const model = data?.payload?.[0]; + if (model) onLoaded(model); + }, [data?.payload]); + return null; +}; + +const getPredictionUrl = createSelector( + (state: GlobalState) => state.settings.alphafold, + (_: GlobalState, props?: PredictionLoaderProps) => props?.entryId, + ( + { protocol, hostname, port, root }: ParsedURLServer, + entryId: string | null | undefined, + ) => { + if (!entryId) return null; + return format({ + protocol, + hostname, + port, + pathname: `${root}api/prediction/${entryId}`, + }); + }, +); + +const ConnectedPredictionLoader = loadData({ + getUrl: getPredictionUrl, +} as LoadDataParameters)(PredictionLoader); + type Props = { proteinAcc: string; hasMultipleProteins: boolean; @@ -66,7 +104,7 @@ type Props = { isSplitScreen: boolean; onSplitScreenChange?: (v: boolean) => void; }; -interface LoadedProps extends Props, LoadDataProps {} +interface LoadedProps extends Props, LoadDataProps {} const Structure3DModel = ({ proteinAcc, @@ -93,6 +131,10 @@ const Structure3DModel = ({ const [isPDBLoading, setIsPDBLoading] = useState(false); const [isPDBAvailable, setIsPDBAvailable] = useState(false); const [bfvdURL, setBfvdURL] = useState(bfvd || ''); + const [selectedEntryId, setSelectedEntryId] = useState(null); + const [selectedModel, setSelectedModel] = useState( + null, + ); useEffect(() => { const selectedValueToKey: Record = { @@ -154,6 +196,14 @@ const Structure3DModel = ({ } }, [shouldResetViewer]); + useEffect(() => { + const docs = data?.payload?.docs || []; + if (docs.length > 0 && selectedEntryId === null) { + const first = docs[0]; + setSelectedEntryId(first.entryId); + } + }, [data]); + // Show warning if PDB is not available if (bfvd) { if (isPDBLoading) { @@ -170,7 +220,7 @@ const Structure3DModel = ({ } else { if (data?.loading) return ; - if ((data?.payload || []).length === 0) { + if ((data?.payload?.docs || []).length === 0) { return (

Structure prediction

@@ -180,8 +230,6 @@ const Structure3DModel = ({ } } - const models = data?.payload || []; - const modelInfo = models.find((x) => x.uniprotAccession === proteinAcc); const elementId = 'new-structure-model-viewer'; return ( @@ -192,7 +240,9 @@ const Structure3DModel = ({ {bfvd ? 'BFVD Structure Prediction' : 'AlphaFold Structure Prediction'} - {models.length > 1 || hasMultipleProteins ? 's' : ''} + {(data?.payload?.docs || []).length > 1 || hasMultipleProteins + ? 's' + : ''}

The protein structure below has been predicted{' '} @@ -230,8 +280,8 @@ const Structure3DModel = ({ {!bfvd && ( )} @@ -278,10 +328,10 @@ const Structure3DModel = ({

  • - {modelInfo !== undefined ? ( + {selectedModel !== null ? ( <> Organism - {modelInfo.organismScientificName} + {selectedModel.organismScientificName} ) : ( '' @@ -305,7 +355,7 @@ const Structure3DModel = ({ >
  • + + {!bfvd && ( + <> + + + + )} ); }; -const getModelInfoUrl = (isUrlToApi: boolean) => +const getModelsInfoUrl = (isUrlToApi: boolean) => createSelector( (state: GlobalState) => state.settings.alphafold, (state: GlobalState) => state.customLocation.description, (_: GlobalState, props?: Props) => { const proteinFromPayload = - (props as LoadedProps)?.data?.payload?.[0]?.uniprotAccession || ''; + (props as LoadedProps)?.data?.payload?.docs[0]?.uniprotAccession || ''; return props?.proteinAcc || proteinFromPayload; }, ( @@ -412,7 +478,11 @@ const getModelInfoUrl = (isUrlToApi: boolean) => description: InterProDescription, accession: string, ) => { - let modelUrl = null; + let modelsUrl = null; + + const url = new URL(`${root}api/search`, window.location.origin); + url.searchParams.set('q', `(uniprotAccession:${accession})`); + url.searchParams.set('type', 'main'); if ( description['main']['key'] === 'entry' || @@ -422,23 +492,26 @@ const getModelInfoUrl = (isUrlToApi: boolean) => description[description['main']['key']]['detail'] === 'alphafold' || description[description['main']['key']]['detail'] === 'bfvd' ) { - modelUrl = format({ + modelsUrl = format({ protocol, hostname, port, pathname: isUrlToApi - ? `${root}api/prediction/${accession}` + ? `${root}api/search` : `${root}entry/${accession}`, + search: isUrlToApi + ? `?q=(uniprotAccession:${accession})&type=main` + : undefined, }); } } - if (isUrlToApi) return modelUrl; - return { modelUrl }; + if (isUrlToApi) return modelsUrl; + return { modelsUrl }; }, ); export default loadData({ - getUrl: getModelInfoUrl(true), - mapStateToProps: getModelInfoUrl(false), + getUrl: getModelsInfoUrl(true), + mapStateToProps: getModelsInfoUrl(false), } as LoadDataParameters)(Structure3DModel); diff --git a/src/components/Structure3DModel/AlphaFoldStructuresTable/index.tsx b/src/components/Structure3DModel/AlphaFoldStructuresTable/index.tsx new file mode 100644 index 000000000..d2c513d23 --- /dev/null +++ b/src/components/Structure3DModel/AlphaFoldStructuresTable/index.tsx @@ -0,0 +1,72 @@ +import React, { useState } from 'react'; +import cssBinder from 'styles/cssBinder'; +import tableStyles from 'components/Table/style.css'; + +const css = cssBinder(tableStyles); + +type Props = { + docs: AlphafoldSearchDoc[]; + onSelect: (entryId: string) => void; + selectedId: string | null; +}; + +const AlphaFoldStructuresTable = ({ docs, onSelect, selectedId }: Props) => { + const [isVisible, setIsVisible] = useState(true); + + if (docs.length === 0) return null; + + return ( +
    +
    + Available structures ({docs.length}){' '} + +
    + {isVisible && ( + + + + + + + + + + + + {docs.map((doc) => ( + onSelect(doc.entryId)} + style={{ + cursor: 'pointer', + fontWeight: doc.entryId === selectedId ? 'bold' : 'normal', + }} + > + + + + + + + ))} + +
    Model nameUniProt startUniProt endProviderOligomeric state
    {doc.entryId}{doc.uniprotStart}{doc.uniprotEnd}{doc.provider || 'AlphaFold'}{doc.oligomericState || '-'}
    + )} +
    + ); +}; + +export default AlphaFoldStructuresTable; diff --git a/src/types/external-payloads.d.ts b/src/types/external-payloads.d.ts index 867a079c0..0cdaffc1d 100644 --- a/src/types/external-payloads.d.ts +++ b/src/types/external-payloads.d.ts @@ -157,18 +157,42 @@ type RfamPayload = { [key: string]: unknown; }; -type AlphafoldPayload = Array<{ +type MultimerAlphafoldPayload = { + docs: AlphafoldSearchDoc[]; +}; + +type AlphafoldSearchDoc = { + entryId: string; + uniprotAccession: string; + uniprotStart: number; + uniprotEnd: number; + oligomericState: string; + latestVersion: number; + provider?: string; +}; + +type AlphafoldModelInfo = { + entryId: string; modelEntityId: string; uniprotAccession: string; uniprotId: string; uniprotDescription: string; taxId: number; organismScientificName: string; + isComplex: boolean; + uniprotStart: number; + uniprotEnd: number; + oligomericState?: string; + latestVersion?: number; + provider?: string; sequence: string; modelCreatedDate: string; cifUrl: string; pdbUrl: string; -}>; +}; + +type AlphafoldPayload = Array; + type AlphafoldConfidencePayload = { residueNumber: Array; confidenceScore: Array; From d09a523312d7748d1a4a4cc1da5abd75881fc030 Mon Sep 17 00:00:00 2001 From: apolignano Date: Thu, 2 Apr 2026 15:28:46 +0200 Subject: [PATCH 2/6] v2 bfvd --- src/menuConfig.ts | 2 +- src/subPages/BFVDModelSubPage/index.tsx | 8 +------- 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/src/menuConfig.ts b/src/menuConfig.ts index 651744abf..2804466db 100644 --- a/src/menuConfig.ts +++ b/src/menuConfig.ts @@ -486,7 +486,7 @@ export const singleEntity: Map = new Map([ main: { key }, [key]: { ...customLocation.description[key], - detail: 'bfvd', + detail: 'alphafold', }, }, }; diff --git a/src/subPages/BFVDModelSubPage/index.tsx b/src/subPages/BFVDModelSubPage/index.tsx index 76b857628..03b636cb2 100644 --- a/src/subPages/BFVDModelSubPage/index.tsx +++ b/src/subPages/BFVDModelSubPage/index.tsx @@ -45,7 +45,7 @@ const BFVDModelSubPage = ({ const [selectionsInModel, setSelectionsInModel] = useState | null>(null); const [proteinAcc, setProteinAcc] = useState(''); - const [colorBy, setColorBy] = useState('bfvd'); + const [colorBy, setColorBy] = useState('af'); const [colorMap, setColorMap] = useState>({}); const [hasTED, setHasTED] = useState(false); const [hasRepresentativeData, setHasRepresentativeData] = useState<{ @@ -82,10 +82,6 @@ const BFVDModelSubPage = ({ if (data?.loading) return ; - // Generate BFVD URL here but let the 3DModel component handle availability check - const bfvdURL = proteinAcc - ? `https://bfvd.steineggerlab.workers.dev/pdb/${proteinAcc}.pdb` - : ''; const hasMultipleProteins = mainType === 'entry' && (data?.payload?.count || 0) > 1; @@ -105,7 +101,6 @@ const BFVDModelSubPage = ({ hasMultipleProteins={hasMultipleProteins} onModelChange={handleModelChange} modelId={modelId} - bfvd={bfvdURL} onColorChange={onColorChange} colorBy={colorBy} selections={selectionsInModel} @@ -124,7 +119,6 @@ const BFVDModelSubPage = ({ Date: Thu, 2 Apr 2026 16:00:15 +0200 Subject: [PATCH 3/6] v3 with plddt track --- .../index.tsx | 16 +++++- .../Structure3DModel/3DModel/index.tsx | 53 ++++++++++++------- src/components/Structure3DModel/selectors.ts | 18 ++++--- src/subPages/AlphaFoldModelSubPage/index.tsx | 5 ++ src/types/external-payloads.d.ts | 8 +++ 5 files changed, 74 insertions(+), 26 deletions(-) diff --git a/src/components/Structure/ViewerAndEntries/ProteinViewerForPredictedStructure/index.tsx b/src/components/Structure/ViewerAndEntries/ProteinViewerForPredictedStructure/index.tsx index 77898981d..d2be9824a 100644 --- a/src/components/Structure/ViewerAndEntries/ProteinViewerForPredictedStructure/index.tsx +++ b/src/components/Structure/ViewerAndEntries/ProteinViewerForPredictedStructure/index.tsx @@ -175,7 +175,20 @@ export const addConfidenceTrack = ( type === 'alphafold' && dataConfidence?.payload?.confidenceCategory ) { - confidenceCategories = dataConfidence.payload.confidenceCategory; + const chains = dataConfidence.payload.chains; + if (chains && chains.length > 1) { + // For multimers, restrict to the first chain only โ€” both chains map to + // the same UniProt sequence (sequenceStart/End are identical for homodimers), + // but residueNumber runs continuously across all chains (1โ†’N*chainLength). + const firstChain = chains[0]; + const chainLength = firstChain.sequenceEnd - firstChain.sequenceStart + 1; + confidenceCategories = dataConfidence.payload.confidenceCategory.slice( + 0, + chainLength, + ); + } else { + confidenceCategories = dataConfidence.payload.confidenceCategory; + } } if (dataConfidence?.payload?.confidenceCategory?.length) { @@ -203,6 +216,7 @@ type Props = { hasRepresentativeData?: { family: boolean | null; domain: boolean | null }; isSplitScreen: boolean; bfvd?: string; + selectedCifUrl?: string; dataInterProNMatches?: Record; matchTypeSettings?: MatchTypeUISettings; colorDomainsBy?: string; diff --git a/src/components/Structure3DModel/3DModel/index.tsx b/src/components/Structure3DModel/3DModel/index.tsx index b66184ae5..7c11027ef 100644 --- a/src/components/Structure3DModel/3DModel/index.tsx +++ b/src/components/Structure3DModel/3DModel/index.tsx @@ -103,6 +103,7 @@ type Props = { parentElement?: HTMLElement | null; isSplitScreen: boolean; onSplitScreenChange?: (v: boolean) => void; + onModelLoaded?: (cifUrl: string) => void; }; interface LoadedProps extends Props, LoadDataProps {} @@ -123,6 +124,7 @@ const Structure3DModel = ({ parentElement, isSplitScreen, onSplitScreenChange, + onModelLoaded, }: LoadedProps) => { const [shouldResetViewer, setShouldResetViewer] = useState(false); const [isReady, setReady] = useState(false); @@ -232,6 +234,15 @@ const Structure3DModel = ({ const elementId = 'new-structure-model-viewer'; + // Derive cifUrl immediately from the already-loaded search doc so the + // structure viewer updates on click without waiting for the prediction API. + const selectedDoc = (data?.payload?.docs || []).find( + (d) => d.entryId === selectedEntryId, + ); + const selectedCifUrl = selectedDoc + ? `${config.root.alphafold.href}files/${selectedDoc.entryId}-model_v${selectedDoc.latestVersion}.cif` + : selectedModel?.cifUrl; + return (
    {!isSplitScreen && ( @@ -355,7 +366,11 @@ const Structure3DModel = ({ > {isSplitScreen && renderLegend('inline-legend')} + {!bfvd && ( + <> + { + setSelectedModel(model); + onModelLoaded?.(model.cifUrl); + }} + /> + + + )}
    - - {!bfvd && ( - <> - - - - )} ); }; diff --git a/src/components/Structure3DModel/selectors.ts b/src/components/Structure3DModel/selectors.ts index d4fad5f92..3ce87eb64 100644 --- a/src/components/Structure3DModel/selectors.ts +++ b/src/components/Structure3DModel/selectors.ts @@ -24,17 +24,23 @@ export const getConfidenceURLFromPayload = (namespace: string) => createSelector( ( state: GlobalState, - props: { [d: StartsWithData]: RequestedData }, + props: { + [d: StartsWithData]: RequestedData; + selectedCifUrl?: string; + }, ) => ({ dataPrediction: props[`data${namespace}`], accession: state.customLocation.description.protein.accession, search: state.customLocation.search, + selectedCifUrl: props.selectedCifUrl, }), - ({ dataPrediction, accession, search }) => { - const isoformAccession = (search.isoform as string) || accession; - const cifURL = dataPrediction?.payload?.find( - (item) => item.uniprotAccession === isoformAccession, - )?.cifUrl; + ({ dataPrediction, accession, search, selectedCifUrl }) => { + const cifURL = + selectedCifUrl || + dataPrediction?.payload?.find( + (item) => + item.uniprotAccession === ((search.isoform as string) || accession), + )?.cifUrl; return cifURL?.length ? cifURL.replace('-model', '-confidence').replace('.cif', '.json') diff --git a/src/subPages/AlphaFoldModelSubPage/index.tsx b/src/subPages/AlphaFoldModelSubPage/index.tsx index d1ddcb929..88b7511b5 100644 --- a/src/subPages/AlphaFoldModelSubPage/index.tsx +++ b/src/subPages/AlphaFoldModelSubPage/index.tsx @@ -51,6 +51,9 @@ const AlphaFoldModelSubPage = ({ const [isSplitScreen, setSplitScreen] = useState(false); const [colorBy, setColorBy] = useState('af'); const [colorMap, setColorMap] = useState>({}); + const [selectedCifUrl, setSelectedCifUrl] = useState( + undefined, + ); const [hasTED, setHasTED] = useState(false); const [hasRepresentativeData, setHasRepresentativeData] = useState<{ family: boolean | null; @@ -100,6 +103,7 @@ const AlphaFoldModelSubPage = ({ hasRepresentativeData={hasRepresentativeData} hasMultipleProteins={hasMultipleProteins} onModelChange={handleModelChange} + onModelLoaded={setSelectedCifUrl} onColorChange={onColorChange} colorBy={colorBy} modelId={modelId} @@ -120,6 +124,7 @@ const AlphaFoldModelSubPage = ({ setColorMap={setColorMap} setHasTED={setHasTED} protein={proteinAcc} + selectedCifUrl={selectedCifUrl} matchTypeSettings={matchTypeSettings} colorBy={colorBy} colorDomainsBy={colorDomainsBy} diff --git a/src/types/external-payloads.d.ts b/src/types/external-payloads.d.ts index 0cdaffc1d..c4405748a 100644 --- a/src/types/external-payloads.d.ts +++ b/src/types/external-payloads.d.ts @@ -193,10 +193,18 @@ type AlphafoldModelInfo = { type AlphafoldPayload = Array; +type AlphafoldConfidenceChain = { + name: string; + label_asym_id: string; + sequenceStart: number; + sequenceEnd: number; +}; + type AlphafoldConfidencePayload = { residueNumber: Array; confidenceScore: Array; confidenceCategory: Array; + chains?: Array; }; type RepeatsDBAnnotation = { From 4209aa95c82baa6c64406fb173394daa84f1dbc8 Mon Sep 17 00:00:00 2001 From: apolignano Date: Thu, 2 Apr 2026 16:12:50 +0200 Subject: [PATCH 4/6] v4, standardize plddt score --- .../index.tsx | 26 +++++++------------ 1 file changed, 10 insertions(+), 16 deletions(-) diff --git a/src/components/Structure/ViewerAndEntries/ProteinViewerForPredictedStructure/index.tsx b/src/components/Structure/ViewerAndEntries/ProteinViewerForPredictedStructure/index.tsx index d2be9824a..0514d2d66 100644 --- a/src/components/Structure/ViewerAndEntries/ProteinViewerForPredictedStructure/index.tsx +++ b/src/components/Structure/ViewerAndEntries/ProteinViewerForPredictedStructure/index.tsx @@ -40,7 +40,7 @@ const ProteinViewer = loadable({ loading: null, }); -export const addBFVDConfidenceTrack = async ( +export const addConfidenceTrackFromPDB = async ( pdbURL: string, tracks: ProteinViewerDataObject, dataProtein: ProteinMetadata, @@ -98,7 +98,7 @@ export const addBFVDConfidenceTrack = async ( tracks['bfvd_confidence'] = []; tracks['bfvd_confidence'][0] = { accession: `confidence_bfvd_${protein}`, - data: mapBFactorsToLetters(residueAverageBFactors), + data: mapBFactorsToCategories(residueAverageBFactors), type: 'confidence', protein, source_database: 'bfvd', @@ -111,7 +111,7 @@ export const addBFVDConfidenceTrack = async ( } }; -export const mapBFactorsToLetters = (bFactors: number[]): string => { +export const mapBFactorsToCategories = (bFactors: number[]): string => { // Map B-factor values to letters return bFactors .map((bFactor) => { @@ -138,7 +138,7 @@ export const addConfidenceTrack = ( tracks: ProteinViewerDataObject, type: string, ) => { - const bfvdScoreToCategory = (score: number): string => { + const scoreToCategory = (score: number): string => { if (score <= 50) return 'D'; else if (score <= 70) return 'L'; else if (score <= 90) return 'M'; @@ -169,12 +169,10 @@ export const addConfidenceTrack = ( } else { score = -1; } - confidenceCategories.push(bfvdScoreToCategory(score)); + confidenceCategories.push(scoreToCategory(score)); } - } else if ( - type === 'alphafold' && - dataConfidence?.payload?.confidenceCategory - ) { + } else if (type === 'alphafold' && dataConfidence?.payload?.confidenceScore) { + let scores = dataConfidence.payload.confidenceScore; const chains = dataConfidence.payload.chains; if (chains && chains.length > 1) { // For multimers, restrict to the first chain only โ€” both chains map to @@ -182,16 +180,12 @@ export const addConfidenceTrack = ( // but residueNumber runs continuously across all chains (1โ†’N*chainLength). const firstChain = chains[0]; const chainLength = firstChain.sequenceEnd - firstChain.sequenceStart + 1; - confidenceCategories = dataConfidence.payload.confidenceCategory.slice( - 0, - chainLength, - ); - } else { - confidenceCategories = dataConfidence.payload.confidenceCategory; + scores = scores.slice(0, chainLength); } + confidenceCategories = scores.map(scoreToCategory); } - if (dataConfidence?.payload?.confidenceCategory?.length) { + if (confidenceCategories.length) { tracks[`${type}_confidence`] = []; tracks[`${type}_confidence`][0] = { accession: `confidence_af_${protein}`, From dc4963870ae03b425cb9f4e47d1d764bd9ccff20 Mon Sep 17 00:00:00 2001 From: apolignano Date: Wed, 8 Apr 2026 11:26:37 +0200 Subject: [PATCH 5/6] Remove BFVD --- config/dev_config.yml | 3 - config/master_config.yml | 3 - config/staging_config.yml | 3 - src/components/BreadCrumbs/index.tsx | 1 - .../EntryMenu/EntryMenuLink/index.tsx | 6 - .../ExtLink/patternLinkWrapper/index.tsx | 5 - src/components/Matches/index.tsx | 24 +-- .../Menu/SideMenu/ServerStatus/index.tsx | 1 - .../Protein/Isoforms/Viewer/index.tsx | 2 +- src/components/Protein/Summary/index.tsx | 28 --- .../LabelsInTrack/ExceptionalLabels/index.tsx | 16 +- src/components/ProteinViewer/index.tsx | 1 - src/components/ProteinViewer/utils.ts | 1 - .../DomainsOnProteinLoaded/index.tsx | 3 +- .../DomainsOnProteinLoaded/utils.ts | 1 - src/components/Structure/Viewer/index.tsx | 8 - .../index.tsx | 110 +--------- .../Structure3DModel/3DModel/index.tsx | 179 +++++----------- src/higherOrder/loadData/defaults/index.js | 1 - src/menuConfig.ts | 21 -- src/pages/Protein/index.tsx | 17 +- src/pages/Settings/index.js | 9 - src/reducers/settings/category/index.ts | 8 - src/reducers/settings/index.ts | 1 - src/reducers/status/servers/index.ts | 2 - src/store/enhancer/status-middleware/index.js | 7 +- src/subPages/BFVDModelSubPage/index.tsx | 192 ------------------ src/subPages/SimilarProteins/Table/index.tsx | 24 +-- src/subPages/index.js | 6 - src/types/interpro-payloads.d.ts | 2 - src/types/state.d.ts | 2 - 31 files changed, 68 insertions(+), 619 deletions(-) delete mode 100644 src/subPages/BFVDModelSubPage/index.tsx diff --git a/config/dev_config.yml b/config/dev_config.yml index b0b919123..18d29bcac 100644 --- a/config/dev_config.yml +++ b/config/dev_config.yml @@ -9,7 +9,6 @@ root: wikipedia: https://en.wikipedia.org/w/api.php readthedocs: https://interpro-documentation.readthedocs.io/en/latest/ alphafold: https://alphafold.ebi.ac.uk/ - bfvd: https://bfvd.foldseek.com/ repeatsDB: https://repeatsdb.org/api/production/annotations/ disprot: https://disprot.org/api/ LLMFeedback: https://docs.google.com/forms/d/e/1FAIpQLSc9lPkgGOZBpnyLiHF87AbUYdAWyx_3YFTNNg4MGQEcqAK4jQ/viewform?usp=pp_url&entry.128814244= @@ -52,7 +51,6 @@ pages: - proteome - model - alphafold - - bfvd - logo - entry_alignments - interactions @@ -68,7 +66,6 @@ pages: - structure - sequence - alphafold - - bfvd - similar_proteins structure: subPages: diff --git a/config/master_config.yml b/config/master_config.yml index 3dd5d5f60..a35d90d9c 100644 --- a/config/master_config.yml +++ b/config/master_config.yml @@ -9,7 +9,6 @@ root: readthedocs: https://interpro-documentation.readthedocs.io/en/latest/ wikipedia: https://en.wikipedia.org/w/api.php alphafold: https://alphafold.ebi.ac.uk/ - bfvd: https://bfvd.foldseek.com/ repeatsDB: https://repeatsdb.org/api/production/annotations/ disprot: https://disprot.org/api/ LLMFeedback: https://docs.google.com/forms/d/e/1FAIpQLSc9lPkgGOZBpnyLiHF87AbUYdAWyx_3YFTNNg4MGQEcqAK4jQ/viewform?usp=pp_url&entry.128814244= @@ -52,7 +51,6 @@ pages: - structure - logo - alphafold - - bfvd - entry_alignments - interactions - pathways @@ -66,7 +64,6 @@ pages: - isoform - structure - alphafold - - bfvd - sequence - similar_proteins structure: diff --git a/config/staging_config.yml b/config/staging_config.yml index 9dba15a86..eca161da8 100644 --- a/config/staging_config.yml +++ b/config/staging_config.yml @@ -9,7 +9,6 @@ root: readthedocs: https://interpro-documentation.readthedocs.io/en/latest/ wikipedia: https://en.wikipedia.org/w/api.php alphafold: https://alphafold.ebi.ac.uk/ - bfvd: https://bfvd.foldseek.com/ repeatsDB: https://repeatsdb.org/api/production/annotations/ disprot: https://disprot.org/api/ LLMFeedback: https://docs.google.com/forms/d/e/1FAIpQLSc9lPkgGOZBpnyLiHF87AbUYdAWyx_3YFTNNg4MGQEcqAK4jQ/viewform?usp=pp_url&entry.128814244= @@ -53,7 +52,6 @@ pages: - model - logo - alphafold - - bfvd - entry_alignments - interactions - pathways @@ -66,7 +64,6 @@ pages: - isoform - structure - alphafold - - bfvd - sequence - similar_proteins structure: diff --git a/src/components/BreadCrumbs/index.tsx b/src/components/BreadCrumbs/index.tsx index 36a18689c..1b39a199d 100644 --- a/src/components/BreadCrumbs/index.tsx +++ b/src/components/BreadCrumbs/index.tsx @@ -197,7 +197,6 @@ const BreadCrumbForEntityDetail = ({ if (detail) { if (detailToRender?.includes('alphafold')) detailToRender = 'AlphaFold'; - else if (detailToRender?.includes('bfvd')) detailToRender = 'BFVD'; } return ( diff --git a/src/components/EntryMenu/EntryMenuLink/index.tsx b/src/components/EntryMenu/EntryMenuLink/index.tsx index 40d8e48cf..0053ac132 100644 --- a/src/components/EntryMenu/EntryMenuLink/index.tsx +++ b/src/components/EntryMenu/EntryMenuLink/index.tsx @@ -88,13 +88,7 @@ export const EntryMenuLink = ({ name.toLowerCase() === 'alphafold' ) { value = (payload.metadata as EntryMetadata).in_alphafold ? 1 : 0; - } else if ( - mainKey?.toLowerCase() === 'protein' && - name.toLowerCase() === 'bfvd' - ) { - value = (payload.metadata as EntryMetadata).in_bfvd ? 1 : 0; } - /** * Enabling the menuitems that appear in the entry_annotations array, * i.e. only enable the menu item if there is info for it. diff --git a/src/components/ExtLink/patternLinkWrapper/index.tsx b/src/components/ExtLink/patternLinkWrapper/index.tsx index 09ddcd59f..c3b532529 100644 --- a/src/components/ExtLink/patternLinkWrapper/index.tsx +++ b/src/components/ExtLink/patternLinkWrapper/index.tsx @@ -29,9 +29,4 @@ export const AlphafoldLink = patternLinkWrapper( ); AlphafoldLink.displayName = 'AlphafoldLink'; -export const BFVDLink = patternLinkWrapper( - 'https://bfvd.foldseek.com/cluster/{id}', -); -BFVDLink.displayName = 'BFVDLink'; - export default patternLinkWrapper; diff --git a/src/components/Matches/index.tsx b/src/components/Matches/index.tsx index 1312f7f77..f6e113e25 100644 --- a/src/components/Matches/index.tsx +++ b/src/components/Matches/index.tsx @@ -553,11 +553,8 @@ const Matches = ({ - inAlphafold ? ( + renderer={(inAlphafold: boolean, { accession }: ProteinMetadata) => + inAlphafold && ( AlphaFold - ) : in_bfvd ? ( - - BFVD - - ) : null + ) } > Predicted structure diff --git a/src/components/Menu/SideMenu/ServerStatus/index.tsx b/src/components/Menu/SideMenu/ServerStatus/index.tsx index 659d6d458..08b97a183 100644 --- a/src/components/Menu/SideMenu/ServerStatus/index.tsx +++ b/src/components/Menu/SideMenu/ServerStatus/index.tsx @@ -18,7 +18,6 @@ const mapEndpointToName = new Map([ ['ipScan', 'InterProScan API'], ['wikipedia', 'Wikipedia API'], ['alphafold', 'AlphaFold API'], - ['bfvd', 'BFVD API'], ]); type BrowserProps = { diff --git a/src/components/Protein/Isoforms/Viewer/index.tsx b/src/components/Protein/Isoforms/Viewer/index.tsx index 71b6e11ce..5b4295acd 100644 --- a/src/components/Protein/Isoforms/Viewer/index.tsx +++ b/src/components/Protein/Isoforms/Viewer/index.tsx @@ -160,7 +160,7 @@ const Viewer = ({ protein, isoform, data, dataConfidence }: LoadedProps) => { dataConfidence, accession, proteinDataRecord, - protein.in_bfvd ? 'bfvd' : 'alphafold', + 'alphafold', ); } proteinDataRecord = sectionsReorganization(proteinDataRecord); diff --git a/src/components/Protein/Summary/index.tsx b/src/components/Protein/Summary/index.tsx index 116b5cb0b..6ad5fd988 100644 --- a/src/components/Protein/Summary/index.tsx +++ b/src/components/Protein/Summary/index.tsx @@ -233,34 +233,6 @@ export const SummaryProtein = ({ data, loading }: LoadedProps) => { UniProt - {metadata.in_bfvd ? ( - <> -
  • - {' '} - - Alphafold DB - -
  • -
  • - - Foldseek - -
  • - - ) : null} {metadata.in_alphafold ? ( <>
  • diff --git a/src/components/ProteinViewer/LabelsInTrack/ExceptionalLabels/index.tsx b/src/components/ProteinViewer/LabelsInTrack/ExceptionalLabels/index.tsx index 2a85c6281..2e0a1f119 100644 --- a/src/components/ProteinViewer/LabelsInTrack/ExceptionalLabels/index.tsx +++ b/src/components/ProteinViewer/LabelsInTrack/ExceptionalLabels/index.tsx @@ -3,11 +3,7 @@ import React from 'react'; import { NOT_MEMBER_DBS } from 'menuConfig'; import Link from 'components/generic/Link'; -import { - AlphafoldLink, - PTMLink, - BFVDLink, -} from 'components/ExtLink/patternLinkWrapper'; +import { AlphafoldLink, PTMLink } from 'components/ExtLink/patternLinkWrapper'; import Tooltip from 'components/SimpleCommonComponents/Tooltip'; import { FunFamLink } from 'subPages/Subfamilies'; @@ -120,16 +116,6 @@ const ExceptionalLabels = ({ entry, isPrinting, databases }: PropsEL) => { ); } - if (entry.source_database === 'bfvd') { - return isPrinting ? ( - pLDDT - ) : ( - - pLDDT - - ); - } - if (entry.source_database === 'ptm') { return isPrinting ? ( UniProt diff --git a/src/components/ProteinViewer/index.tsx b/src/components/ProteinViewer/index.tsx index 61d5a149b..aaabe7e6d 100644 --- a/src/components/ProteinViewer/index.tsx +++ b/src/components/ProteinViewer/index.tsx @@ -149,7 +149,6 @@ export const ProteinViewer = ({ const [isPrinting, setPrinting] = useState(false); const mainTracks = [ - 'bfvd confidence', 'alphafold confidence', 'domain', 'family', diff --git a/src/components/ProteinViewer/utils.ts b/src/components/ProteinViewer/utils.ts index 55db2a318..2fd129c8d 100644 --- a/src/components/ProteinViewer/utils.ts +++ b/src/components/ProteinViewer/utils.ts @@ -49,7 +49,6 @@ export type ExtendedFeature = Feature & { }; export const typeNameToSectionName: Record = { - 'bfvd confidence': 'BFVD Confidence', 'alphafold confidence': 'AlphaFold Confidence', family: 'Families', domain: 'Domains', diff --git a/src/components/Related/DomainsOnProtein/DomainsOnProteinLoaded/index.tsx b/src/components/Related/DomainsOnProtein/DomainsOnProteinLoaded/index.tsx index ce9065196..5abcccbf9 100644 --- a/src/components/Related/DomainsOnProtein/DomainsOnProteinLoaded/index.tsx +++ b/src/components/Related/DomainsOnProtein/DomainsOnProteinLoaded/index.tsx @@ -225,7 +225,7 @@ const DomainsOnProteinLoaded = ({ dataConfidence, protein.accession, processedDataMerged, - protein.in_bfvd ? 'bfvd' : 'alphafold', + 'alphafold', ); let interpro_NMatchesCount = 0; @@ -240,7 +240,6 @@ const DomainsOnProteinLoaded = ({ const interProNData = dataInterProNMatches.payload; const allTracks = Object.keys(processedDataMerged); const unaffectedTracks = [ - 'bfvd_confidence', 'alphafold_confidence', 'intrinsically_disordered_regions', 'funfam', diff --git a/src/components/Related/DomainsOnProtein/DomainsOnProteinLoaded/utils.ts b/src/components/Related/DomainsOnProtein/DomainsOnProteinLoaded/utils.ts index 2c05276d7..4a0d47b59 100644 --- a/src/components/Related/DomainsOnProtein/DomainsOnProteinLoaded/utils.ts +++ b/src/components/Related/DomainsOnProtein/DomainsOnProteinLoaded/utils.ts @@ -9,7 +9,6 @@ export const UNDERSCORE = /_/g; const FIRST_IN_ORDER = [ 'alphafold_confidence', - 'bfvd_confidence', 'secondary_structure', 'family', 'domain', diff --git a/src/components/Structure/Viewer/index.tsx b/src/components/Structure/Viewer/index.tsx index 330ea44f8..c4533fc3e 100644 --- a/src/components/Structure/Viewer/index.tsx +++ b/src/components/Structure/Viewer/index.tsx @@ -23,7 +23,6 @@ import Labels from './Labels'; import { Selection } from '../ViewerAndEntries'; import { AfConfidenceProvider } from './af-confidence/prop'; import { AfConfidenceColorThemeProvider } from './af-confidence/color'; -import { BFactorColorThemeProvider } from './bfvd-confidence/color'; import { CustomThemeProvider } from './custom/color'; import cssBinder from 'styles/cssBinder'; @@ -101,10 +100,6 @@ class StructureView extends PureComponent { this.viewer.representation.structure.themes.colorThemeRegistry.add( CustomThemeProvider, ); - - this.viewer.representation.structure.themes.colorThemeRegistry.add( - BFactorColorThemeProvider, - ); } // mouseover ????? // window.viewer = this.viewer; @@ -305,9 +300,6 @@ class StructureView extends PureComponent { case 'af': colouringTheme = AfConfidenceColorThemeProvider.name; break; - case 'bfvd': - colouringTheme = BFactorColorThemeProvider.name; - break; case 'ted': colouringTheme = CustomThemeProvider.name; break; diff --git a/src/components/Structure/ViewerAndEntries/ProteinViewerForPredictedStructure/index.tsx b/src/components/Structure/ViewerAndEntries/ProteinViewerForPredictedStructure/index.tsx index 0514d2d66..6453297ef 100644 --- a/src/components/Structure/ViewerAndEntries/ProteinViewerForPredictedStructure/index.tsx +++ b/src/components/Structure/ViewerAndEntries/ProteinViewerForPredictedStructure/index.tsx @@ -40,77 +40,6 @@ const ProteinViewer = loadable({ loading: null, }); -export const addConfidenceTrackFromPDB = async ( - pdbURL: string, - tracks: ProteinViewerDataObject, - dataProtein: ProteinMetadata, -): Promise => { - try { - // Fetch the PDB file - const response = await fetch(pdbURL); - if (!response.ok) { - throw new Error(`Failed to fetch PDB file: ${response.status}`); - } - - const protein = dataProtein.name; - const sequence = dataProtein.sequence; - const pdbText = await response.text(); - const lines = pdbText.split('\n'); - - const residueBFactors: Map = new Map(); - const aminoacidNumbers = [...Array(sequence.length).keys()]; - aminoacidNumbers.forEach((num) => residueBFactors.set(num, [-1])); - - for (const line of lines) { - if (line.startsWith('ATOM') || line.startsWith('HETATM')) { - const residueNumStr = line.substring(22, 26).trim(); - const residueNum = parseInt(residueNumStr); - - const bFactorStr = line.substring(60, 66).trim(); - const bFactor = parseFloat(bFactorStr); - - if (!isNaN(residueNum) && !isNaN(bFactor)) { - if (residueBFactors.get(residueNum)?.[0] == -1) { - residueBFactors.set(residueNum, []); - } - residueBFactors.get(residueNum)?.push(bFactor); - } - } - } - - // Second pass: calculate average B-factor for each residue - const residueAverageBFactors: number[] = []; - - // Sort residue numbers to ensure correct order - const sortedResidueNumbers = Array.from(residueBFactors.keys()).sort( - (a, b) => a - b, - ); - - for (const residueNum of sortedResidueNumbers) { - const bFactors = residueBFactors.get(residueNum) || []; - // Calculate average B-factor for this residue - const averageBFactor = - bFactors.reduce((sum, bf) => sum + bf, 0) / bFactors.length; - residueAverageBFactors.push(averageBFactor); - } - - // Add the track with amino acid-based B-factors - tracks['bfvd_confidence'] = []; - tracks['bfvd_confidence'][0] = { - accession: `confidence_bfvd_${protein}`, - data: mapBFactorsToCategories(residueAverageBFactors), - type: 'confidence', - protein, - source_database: 'bfvd', - }; - - return tracks; - } catch (error) { - console.error('Error extracting B-factors:', error); - throw error; - } -}; - export const mapBFactorsToCategories = (bFactors: number[]): string => { // Map B-factor values to letters return bFactors @@ -146,32 +75,8 @@ export const addConfidenceTrack = ( }; let confidenceCategories: string[] = []; - if (type === 'bfvd' && dataConfidence?.payload?.confidenceCategory) { - // Create map of index/residues to handle missing scores. Missing scores will be set to -1. - let indexToAminoacid: Map = new Map(); - dataConfidence.payload.residueNumber.map((resNum, index) => - indexToAminoacid.set(resNum, index), - ); - // Available scores get converted to categories as defined above, - // overriding the category system returned by the API - for ( - let i = 1; - i <= Math.max(...dataConfidence.payload.residueNumber); - i++ - ) { - let score: number = 0; - if (indexToAminoacid.has(i)) { - score = - dataConfidence.payload.confidenceScore[ - indexToAminoacid.get(i) as number - ]; - } else { - score = -1; - } - confidenceCategories.push(scoreToCategory(score)); - } - } else if (type === 'alphafold' && dataConfidence?.payload?.confidenceScore) { + if (type === 'alphafold' && dataConfidence?.payload?.confidenceScore) { let scores = dataConfidence.payload.confidenceScore; const chains = dataConfidence.payload.chains; if (chains && chains.length > 1) { @@ -209,7 +114,6 @@ type Props = { }) => void; hasRepresentativeData?: { family: boolean | null; domain: boolean | null }; isSplitScreen: boolean; - bfvd?: string; selectedCifUrl?: string; dataInterProNMatches?: Record; matchTypeSettings?: MatchTypeUISettings; @@ -226,7 +130,6 @@ interface LoadedProps const ProteinViewerForAlphafold = ({ data, protein, - bfvd, dataProtein, dataInterProNMatches, dataConfidence, @@ -291,16 +194,11 @@ const ProteinViewerForAlphafold = ({ const newGroups = { ...groups }; if (dataConfidence) { - addConfidenceTrack( - dataConfidence, - protein, - newGroups, - bfvd && dataProtein?.payload ? 'bfvd' : 'alphafold', - ); + addConfidenceTrack(dataConfidence, protein, newGroups, 'alphafold'); } // For synchronous operations, we can set state immediately setProcessedTracks(newGroups); - }, [processedData, dataConfidence, bfvd, protein]); + }, [processedData, dataConfidence, protein]); useEffect(() => { const currentTrack = trackRef.current; @@ -378,7 +276,6 @@ const ProteinViewerForAlphafold = ({ const colorToObj: Record = { af: [] as Feature[], - bfvd: [] as Feature[], repr_families: representativeDataForStructure['family'], repr_domains: representativeDataForStructure['domain'] as Feature[], ted: tedFeatures as Feature[], @@ -431,7 +328,6 @@ const ProteinViewerForAlphafold = ({ const allTracks = Object.keys({ ...groups }); const unaffectedTracks = [ - 'bfvd_confidence', 'alphafold_confidence', 'intrinsically_disordered_regions', 'funfam', diff --git a/src/components/Structure3DModel/3DModel/index.tsx b/src/components/Structure3DModel/3DModel/index.tsx index 7c11027ef..469d4ad45 100644 --- a/src/components/Structure3DModel/3DModel/index.tsx +++ b/src/components/Structure3DModel/3DModel/index.tsx @@ -98,7 +98,6 @@ type Props = { hasRepresentativeData?: { family: boolean | null; domain: boolean | null }; modelId: string | null; modelUrl?: string; - bfvd?: string; selections: Selection[] | null; parentElement?: HTMLElement | null; isSplitScreen: boolean; @@ -118,7 +117,6 @@ const Structure3DModel = ({ hasRepresentativeData, modelId, modelUrl, - bfvd, data, selections, parentElement, @@ -128,11 +126,6 @@ const Structure3DModel = ({ }: LoadedProps) => { const [shouldResetViewer, setShouldResetViewer] = useState(false); const [isReady, setReady] = useState(false); - - // Added states for PDB availability check (moved from BFVDModelSubPage) - const [isPDBLoading, setIsPDBLoading] = useState(false); - const [isPDBAvailable, setIsPDBAvailable] = useState(false); - const [bfvdURL, setBfvdURL] = useState(bfvd || ''); const [selectedEntryId, setSelectedEntryId] = useState(null); const [selectedModel, setSelectedModel] = useState( null, @@ -149,14 +142,14 @@ const Structure3DModel = ({ hasRepresentativeData[selectedValueToKey[colorBy]] === null && onColorChange ) { - onColorChange(bfvd ? 'bfvd' : 'af'); + onColorChange('af'); } }, [colorBy, hasRepresentativeData]); const renderLegend = (display: string = '') => { return (
    - {(colorBy === 'af' || colorBy === 'bfvd') && ( + {colorBy === 'af' && ( <> Model Confidence
      @@ -173,25 +166,6 @@ const Structure3DModel = ({ ); }; - // Effect to check PDB availability (moved from BFVDModelSubPage) - useEffect(() => { - setIsPDBLoading(true); - if (bfvd && proteinAcc.length > 0) { - setBfvdURL(bfvd); - fetch(bfvd, { method: 'GET' }) - .then((res) => { - if (res.ok) { - setIsPDBAvailable(true); - } - setIsPDBLoading(false); - }) - .catch((error) => { - setIsPDBLoading(false); - setIsPDBAvailable(false); - }); - } - }, [proteinAcc, bfvd]); - useEffect(() => { if (shouldResetViewer) { requestAnimationFrame(() => setShouldResetViewer(false)); @@ -206,30 +180,15 @@ const Structure3DModel = ({ } }, [data]); - // Show warning if PDB is not available - if (bfvd) { - if (isPDBLoading) { - return ; - } else { - if (!isPDBAvailable) { - return ( - - Structure Viewer currently not available for this entry. - - ); - } - } - } else { - if (data?.loading) return ; + if (data?.loading) return ; - if ((data?.payload?.docs || []).length === 0) { - return ( -
      -

      Structure prediction

      -

      There is no structural model associated to {proteinAcc}.

      -
      - ); - } + if ((data?.payload?.docs || []).length === 0) { + return ( +
      +

      Structure prediction

      +

      There is no structural model associated to {proteinAcc}.

      +
      + ); } const elementId = 'new-structure-model-viewer'; @@ -248,36 +207,19 @@ const Structure3DModel = ({ {!isSplitScreen && ( <>

      - {bfvd - ? 'BFVD Structure Prediction' - : 'AlphaFold Structure Prediction'} + AlphaFold Structure Prediction {(data?.payload?.docs || []).length > 1 || hasMultipleProteins ? 's' : ''}

      - The protein structure below has been predicted{' '} - {bfvd ? ( - <> - by the{' '} - Steinegger Lab{' '} - using ColabFold ( - - Kim, R et al. 2024 - - ) - - ) : ( - <> - by Google DeepMind{' '} - using AlphaFold ( - - Jumper, J et al. 2021 - - ) - - )} - . + The protein structure below has been predicted by{' '} + Google DeepMind using + AlphaFold ( + + Jumper, J et al. 2021 + + )

      )} @@ -288,13 +230,11 @@ const Structure3DModel = ({ ) : null} - {!bfvd && ( - - )} +
      {!isSplitScreen && ( @@ -328,9 +268,7 @@ const Structure3DModel = ({
      Find similar structures with{' '} @@ -367,9 +305,7 @@ const Structure3DModel = ({ @@ -379,19 +315,17 @@ const Structure3DModel = ({ />  PDB file - {!bfvd && ( - - -  mmCIF file - - )} + + +  mmCIF file +
    @@ -503,10 +435,7 @@ const getModelsInfoUrl = (isUrlToApi: boolean) => description['main']['key'] === 'entry' || description['main']['key'] === 'protein' ) { - if ( - description[description['main']['key']]['detail'] === 'alphafold' || - description[description['main']['key']]['detail'] === 'bfvd' - ) { + if (description[description['main']['key']]['detail'] === 'alphafold') { modelsUrl = format({ protocol, hostname, diff --git a/src/higherOrder/loadData/defaults/index.js b/src/higherOrder/loadData/defaults/index.js index 2932d4632..a1f973db0 100644 --- a/src/higherOrder/loadData/defaults/index.js +++ b/src/higherOrder/loadData/defaults/index.js @@ -237,7 +237,6 @@ export const getUrlForApi = (...parameters) => .replace('/entry_alignments', '/') .replace('/logo', '/') .replace('/alphafold', '/') - .replace('/bfvd', '/') .replace('/domain_architecture', '/') .replace('/interactions', '/') .replace('/subfamilies', '/') diff --git a/src/menuConfig.ts b/src/menuConfig.ts index 2804466db..acd0fad27 100644 --- a/src/menuConfig.ts +++ b/src/menuConfig.ts @@ -475,26 +475,6 @@ export const singleEntity: Map = new Map([ counter: 'structural_models.alphafold', }, ], - [ - 'bfvd', - { - to(customLocation: InterProLocation) { - const key = customLocation.description.main.key as Endpoint; - return { - description: { - ...getEmptyDescription(), - main: { key }, - [key]: { - ...customLocation.description[key], - detail: 'alphafold', - }, - }, - }; - }, - name: 'BFVD', - counter: 'structural_models.bfvd', - }, - ], [ 'entry_alignments', { @@ -868,7 +848,6 @@ const _NOT_MEMBER_DBS = [ 'CATH-FUNFAM', 'PFAM-N', 'ALPHAFOLD', - 'BFVD', 'ELM', ]; diff --git a/src/pages/Protein/index.tsx b/src/pages/Protein/index.tsx index f1294dc0a..9637602e1 100644 --- a/src/pages/Protein/index.tsx +++ b/src/pages/Protein/index.tsx @@ -335,7 +335,7 @@ const List = ({ data, customLocation, isStale, dataBase }: LoadedProps) => { + renderer={(inAlphafold, { accession }: ProteinMetadata) => inAlphafold ? ( { > AlphaFold - ) : in_bfvd ? ( - - BFVD - ) : null } > diff --git a/src/pages/Settings/index.js b/src/pages/Settings/index.js index 8542abee6..e81772086 100644 --- a/src/pages/Settings/index.js +++ b/src/pages/Settings/index.js @@ -611,9 +611,6 @@ const WikipediaEndpointSettings = connect(getStatusForEndpoint('wikipedia'))( const AlphaFoldEndpointSettings = connect(getStatusForEndpoint('alphafold'))( EndpointSettings, ); -const BFVDEndpointSettings = connect(getStatusForEndpoint('bfvd'))( - EndpointSettings, -); const SchemaOrgData = loadable({ loader: () => import(/* webpackChunkName: "schemaOrg" */ 'schema_org'), @@ -741,7 +738,6 @@ type SettingsProps = { disprot: Object, wikipedia: Object, alphafold: Object, - bfvd: Object, proteinsAPI: Object, }, changeSettings: function, @@ -766,7 +762,6 @@ class Settings extends PureComponent /*:: */ { ipScan: T.object.isRequired, wikipedia: T.object.isRequired, alphafold: T.object.isRequired, - bfvd: T.object.isRequired, }).isRequired, changeSettings: T.func.isRequired, changeSettingsRaw: T.func.isRequired, @@ -816,7 +811,6 @@ class Settings extends PureComponent /*:: */ { ipScan = {}, wikipedia = {}, alphafold = {}, - bfvd = {}, }, changeSettings, changeSettingsRaw, @@ -910,9 +904,6 @@ class Settings extends PureComponent /*:: */ { AlphaFold API Settings{' '} {!DEV && '(modification temporarily disabled)'} - - BFVD API Settings -