From da5ee05c79e0ab09ab6b66e1a9307aab38fef93a Mon Sep 17 00:00:00 2001 From: ansengarvin <45224464+ansengarvin@users.noreply.github.com> Date: Mon, 15 Apr 2024 13:11:55 -0700 Subject: [PATCH] Load Foldseek Data on TM Align Compare Page (#237) * Changed directory name in delete_all py script from string to os.join so it works on windows, and hopefully universally. * TM Align page now computes Foldseek data for compare protein * Changed loading text * Ruff reformat --- backend/src/api/search.py | 39 +++++++++++++++++ backend/src/data/pdbAlphaFold/.gitignore | 2 +- frontend/src/lib/openapi/core/ApiError.ts | 2 +- .../src/lib/openapi/core/ApiRequestOptions.ts | 2 +- frontend/src/lib/openapi/core/ApiResult.ts | 2 +- .../src/lib/openapi/core/CancelablePromise.ts | 8 ++-- frontend/src/lib/openapi/core/OpenAPI.ts | 2 +- frontend/src/lib/openapi/core/request.ts | 4 +- frontend/src/lib/openapi/index.ts | 2 +- frontend/src/lib/openapi/models/EditBody.ts | 2 +- .../lib/openapi/models/HTTPValidationError.ts | 2 +- frontend/src/lib/openapi/models/LoginBody.ts | 2 +- .../src/lib/openapi/models/LoginResponse.ts | 2 +- .../lib/openapi/models/ProteinEditSuccess.ts | 2 +- .../src/lib/openapi/models/ProteinEntry.ts | 2 +- .../src/lib/openapi/models/RangeFilter.ts | 2 +- .../lib/openapi/models/SearchProteinsBody.ts | 2 +- .../openapi/models/SearchProteinsResults.ts | 2 +- .../src/lib/openapi/models/SimilarProtein.ts | 2 +- frontend/src/lib/openapi/models/Tutorial.ts | 2 +- .../src/lib/openapi/models/TutorialEdit.ts | 2 +- .../src/lib/openapi/models/TutorialUpload.ts | 2 +- frontend/src/lib/openapi/models/UploadBody.ts | 2 +- .../src/lib/openapi/models/UploadError.ts | 2 +- .../src/lib/openapi/models/UploadPNGBody.ts | 2 +- .../src/lib/openapi/models/ValidationError.ts | 2 +- .../lib/openapi/services/DefaultService.ts | 25 ++++++++++- frontend/src/routes/Align.svelte | 43 ++++++++++++++++++- galaxy/delete_all.py | 2 +- 29 files changed, 135 insertions(+), 32 deletions(-) diff --git a/backend/src/api/search.py b/backend/src/api/search.py index b634246a..7846fb30 100644 --- a/backend/src/api/search.py +++ b/backend/src/api/search.py @@ -229,3 +229,42 @@ def search_venome_similar(protein_name: str): raise HTTPException(500, "Error getting protein descriptions") return formatted + + +@router.get( + "/search/venome/similar/{protein_name:str}/{protein_compare:str}", + response_model=SimilarProtein, +) +def search_venome_similar_compare(protein_name: str, protein_compare: str): + target = stored_pdb_file_name(protein_compare) + # ignore the first since it's itself as the most similar + try: + similar = easy_search( + stored_pdb_file_name(protein_name), + target, + out_format="target,prob,evalue,qstart,qend", + ) # qend,qstart refer to alignment + formatted = [ + SimilarProtein( + name=name.rstrip(".pdb"), + prob=prob, + evalue=evalue, + qstart=qstart, + qend=qend, + alntmscore=0, + ) + for [name, prob, evalue, qstart, qend] in similar + ] + except Exception: + raise HTTPException(404, "Error in 'foldseek easy-search' command") + + try: + # populate protein descriptions for the similar proteins + descriptions = get_descriptions([s.name for s in formatted]) + if descriptions is not None: + for f, d in zip(formatted, descriptions): + f.description = d + except Exception: + raise HTTPException(500, "Error getting protein descriptions") + + return formatted[0] diff --git a/backend/src/data/pdbAlphaFold/.gitignore b/backend/src/data/pdbAlphaFold/.gitignore index eadd157d..2da6d9aa 100644 --- a/backend/src/data/pdbAlphaFold/.gitignore +++ b/backend/src/data/pdbAlphaFold/.gitignore @@ -1 +1 @@ -*.pdb +*.pdb diff --git a/frontend/src/lib/openapi/core/ApiError.ts b/frontend/src/lib/openapi/core/ApiError.ts index d6b8fcc3..ec7b16af 100644 --- a/frontend/src/lib/openapi/core/ApiError.ts +++ b/frontend/src/lib/openapi/core/ApiError.ts @@ -1,4 +1,4 @@ -/* generated using openapi-typescript-codegen -- do no edit */ +/* generated using openapi-typescript-codegen -- do not edit */ /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ diff --git a/frontend/src/lib/openapi/core/ApiRequestOptions.ts b/frontend/src/lib/openapi/core/ApiRequestOptions.ts index c19adcc9..93143c3c 100644 --- a/frontend/src/lib/openapi/core/ApiRequestOptions.ts +++ b/frontend/src/lib/openapi/core/ApiRequestOptions.ts @@ -1,4 +1,4 @@ -/* generated using openapi-typescript-codegen -- do no edit */ +/* generated using openapi-typescript-codegen -- do not edit */ /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ diff --git a/frontend/src/lib/openapi/core/ApiResult.ts b/frontend/src/lib/openapi/core/ApiResult.ts index ad8fef2b..ee1126e2 100644 --- a/frontend/src/lib/openapi/core/ApiResult.ts +++ b/frontend/src/lib/openapi/core/ApiResult.ts @@ -1,4 +1,4 @@ -/* generated using openapi-typescript-codegen -- do no edit */ +/* generated using openapi-typescript-codegen -- do not edit */ /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ diff --git a/frontend/src/lib/openapi/core/CancelablePromise.ts b/frontend/src/lib/openapi/core/CancelablePromise.ts index eb02246c..d70de929 100644 --- a/frontend/src/lib/openapi/core/CancelablePromise.ts +++ b/frontend/src/lib/openapi/core/CancelablePromise.ts @@ -1,4 +1,4 @@ -/* generated using openapi-typescript-codegen -- do no edit */ +/* generated using openapi-typescript-codegen -- do not edit */ /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ @@ -85,9 +85,9 @@ export class CancelablePromise implements Promise { }); } - get [Symbol.toStringTag]() { - return "Cancellable Promise"; - } + get [Symbol.toStringTag]() { + return "Cancellable Promise"; + } public then( onFulfilled?: ((value: T) => TResult1 | PromiseLike) | null, diff --git a/frontend/src/lib/openapi/core/OpenAPI.ts b/frontend/src/lib/openapi/core/OpenAPI.ts index e357bb22..0cfae5db 100644 --- a/frontend/src/lib/openapi/core/OpenAPI.ts +++ b/frontend/src/lib/openapi/core/OpenAPI.ts @@ -1,4 +1,4 @@ -/* generated using openapi-typescript-codegen -- do no edit */ +/* generated using openapi-typescript-codegen -- do not edit */ /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ diff --git a/frontend/src/lib/openapi/core/request.ts b/frontend/src/lib/openapi/core/request.ts index 2201a0e6..f83d7119 100644 --- a/frontend/src/lib/openapi/core/request.ts +++ b/frontend/src/lib/openapi/core/request.ts @@ -1,4 +1,4 @@ -/* generated using openapi-typescript-codegen -- do no edit */ +/* generated using openapi-typescript-codegen -- do not edit */ /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ @@ -164,7 +164,7 @@ export const getHeaders = async (config: OpenAPIConfig, options: ApiRequestOptio headers['Authorization'] = `Basic ${credentials}`; } - if (options.body) { + if (options.body !== undefined) { if (options.mediaType) { headers['Content-Type'] = options.mediaType; } else if (isBlob(options.body)) { diff --git a/frontend/src/lib/openapi/index.ts b/frontend/src/lib/openapi/index.ts index 8852fd30..44a2b797 100644 --- a/frontend/src/lib/openapi/index.ts +++ b/frontend/src/lib/openapi/index.ts @@ -1,4 +1,4 @@ -/* generated using openapi-typescript-codegen -- do no edit */ +/* generated using openapi-typescript-codegen -- do not edit */ /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ diff --git a/frontend/src/lib/openapi/models/EditBody.ts b/frontend/src/lib/openapi/models/EditBody.ts index d7c56b56..68f8ef07 100644 --- a/frontend/src/lib/openapi/models/EditBody.ts +++ b/frontend/src/lib/openapi/models/EditBody.ts @@ -1,4 +1,4 @@ -/* generated using openapi-typescript-codegen -- do no edit */ +/* generated using openapi-typescript-codegen -- do not edit */ /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ diff --git a/frontend/src/lib/openapi/models/HTTPValidationError.ts b/frontend/src/lib/openapi/models/HTTPValidationError.ts index 892e4257..f9b1a79e 100644 --- a/frontend/src/lib/openapi/models/HTTPValidationError.ts +++ b/frontend/src/lib/openapi/models/HTTPValidationError.ts @@ -1,4 +1,4 @@ -/* generated using openapi-typescript-codegen -- do no edit */ +/* generated using openapi-typescript-codegen -- do not edit */ /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ diff --git a/frontend/src/lib/openapi/models/LoginBody.ts b/frontend/src/lib/openapi/models/LoginBody.ts index 5dc8041c..ff5c4ff6 100644 --- a/frontend/src/lib/openapi/models/LoginBody.ts +++ b/frontend/src/lib/openapi/models/LoginBody.ts @@ -1,4 +1,4 @@ -/* generated using openapi-typescript-codegen -- do no edit */ +/* generated using openapi-typescript-codegen -- do not edit */ /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ diff --git a/frontend/src/lib/openapi/models/LoginResponse.ts b/frontend/src/lib/openapi/models/LoginResponse.ts index 2f1faac8..1b25684a 100644 --- a/frontend/src/lib/openapi/models/LoginResponse.ts +++ b/frontend/src/lib/openapi/models/LoginResponse.ts @@ -1,4 +1,4 @@ -/* generated using openapi-typescript-codegen -- do no edit */ +/* generated using openapi-typescript-codegen -- do not edit */ /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ diff --git a/frontend/src/lib/openapi/models/ProteinEditSuccess.ts b/frontend/src/lib/openapi/models/ProteinEditSuccess.ts index e1a4aee7..da3d0969 100644 --- a/frontend/src/lib/openapi/models/ProteinEditSuccess.ts +++ b/frontend/src/lib/openapi/models/ProteinEditSuccess.ts @@ -1,4 +1,4 @@ -/* generated using openapi-typescript-codegen -- do no edit */ +/* generated using openapi-typescript-codegen -- do not edit */ /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ diff --git a/frontend/src/lib/openapi/models/ProteinEntry.ts b/frontend/src/lib/openapi/models/ProteinEntry.ts index 02779401..6c12f6df 100644 --- a/frontend/src/lib/openapi/models/ProteinEntry.ts +++ b/frontend/src/lib/openapi/models/ProteinEntry.ts @@ -1,4 +1,4 @@ -/* generated using openapi-typescript-codegen -- do no edit */ +/* generated using openapi-typescript-codegen -- do not edit */ /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ diff --git a/frontend/src/lib/openapi/models/RangeFilter.ts b/frontend/src/lib/openapi/models/RangeFilter.ts index 13a16880..f7cab08b 100644 --- a/frontend/src/lib/openapi/models/RangeFilter.ts +++ b/frontend/src/lib/openapi/models/RangeFilter.ts @@ -1,4 +1,4 @@ -/* generated using openapi-typescript-codegen -- do no edit */ +/* generated using openapi-typescript-codegen -- do not edit */ /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ diff --git a/frontend/src/lib/openapi/models/SearchProteinsBody.ts b/frontend/src/lib/openapi/models/SearchProteinsBody.ts index d739124f..1e6dc7a1 100644 --- a/frontend/src/lib/openapi/models/SearchProteinsBody.ts +++ b/frontend/src/lib/openapi/models/SearchProteinsBody.ts @@ -1,4 +1,4 @@ -/* generated using openapi-typescript-codegen -- do no edit */ +/* generated using openapi-typescript-codegen -- do not edit */ /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ diff --git a/frontend/src/lib/openapi/models/SearchProteinsResults.ts b/frontend/src/lib/openapi/models/SearchProteinsResults.ts index 76e1e22c..3ab92cf9 100644 --- a/frontend/src/lib/openapi/models/SearchProteinsResults.ts +++ b/frontend/src/lib/openapi/models/SearchProteinsResults.ts @@ -1,4 +1,4 @@ -/* generated using openapi-typescript-codegen -- do no edit */ +/* generated using openapi-typescript-codegen -- do not edit */ /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ diff --git a/frontend/src/lib/openapi/models/SimilarProtein.ts b/frontend/src/lib/openapi/models/SimilarProtein.ts index 16113600..340f9abc 100644 --- a/frontend/src/lib/openapi/models/SimilarProtein.ts +++ b/frontend/src/lib/openapi/models/SimilarProtein.ts @@ -1,4 +1,4 @@ -/* generated using openapi-typescript-codegen -- do no edit */ +/* generated using openapi-typescript-codegen -- do not edit */ /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ diff --git a/frontend/src/lib/openapi/models/Tutorial.ts b/frontend/src/lib/openapi/models/Tutorial.ts index 12717ea8..e93bb9fd 100644 --- a/frontend/src/lib/openapi/models/Tutorial.ts +++ b/frontend/src/lib/openapi/models/Tutorial.ts @@ -1,4 +1,4 @@ -/* generated using openapi-typescript-codegen -- do no edit */ +/* generated using openapi-typescript-codegen -- do not edit */ /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ diff --git a/frontend/src/lib/openapi/models/TutorialEdit.ts b/frontend/src/lib/openapi/models/TutorialEdit.ts index b180c057..b92d939e 100644 --- a/frontend/src/lib/openapi/models/TutorialEdit.ts +++ b/frontend/src/lib/openapi/models/TutorialEdit.ts @@ -1,4 +1,4 @@ -/* generated using openapi-typescript-codegen -- do no edit */ +/* generated using openapi-typescript-codegen -- do not edit */ /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ diff --git a/frontend/src/lib/openapi/models/TutorialUpload.ts b/frontend/src/lib/openapi/models/TutorialUpload.ts index 74bdcacd..87497606 100644 --- a/frontend/src/lib/openapi/models/TutorialUpload.ts +++ b/frontend/src/lib/openapi/models/TutorialUpload.ts @@ -1,4 +1,4 @@ -/* generated using openapi-typescript-codegen -- do no edit */ +/* generated using openapi-typescript-codegen -- do not edit */ /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ diff --git a/frontend/src/lib/openapi/models/UploadBody.ts b/frontend/src/lib/openapi/models/UploadBody.ts index 9d05cbcd..6b0884f3 100644 --- a/frontend/src/lib/openapi/models/UploadBody.ts +++ b/frontend/src/lib/openapi/models/UploadBody.ts @@ -1,4 +1,4 @@ -/* generated using openapi-typescript-codegen -- do no edit */ +/* generated using openapi-typescript-codegen -- do not edit */ /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ diff --git a/frontend/src/lib/openapi/models/UploadError.ts b/frontend/src/lib/openapi/models/UploadError.ts index 5240304b..9a91db09 100644 --- a/frontend/src/lib/openapi/models/UploadError.ts +++ b/frontend/src/lib/openapi/models/UploadError.ts @@ -1,4 +1,4 @@ -/* generated using openapi-typescript-codegen -- do no edit */ +/* generated using openapi-typescript-codegen -- do not edit */ /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ diff --git a/frontend/src/lib/openapi/models/UploadPNGBody.ts b/frontend/src/lib/openapi/models/UploadPNGBody.ts index c9e295c5..44dcfa5c 100644 --- a/frontend/src/lib/openapi/models/UploadPNGBody.ts +++ b/frontend/src/lib/openapi/models/UploadPNGBody.ts @@ -1,4 +1,4 @@ -/* generated using openapi-typescript-codegen -- do no edit */ +/* generated using openapi-typescript-codegen -- do not edit */ /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ diff --git a/frontend/src/lib/openapi/models/ValidationError.ts b/frontend/src/lib/openapi/models/ValidationError.ts index f2ff49a2..aaf1c921 100644 --- a/frontend/src/lib/openapi/models/ValidationError.ts +++ b/frontend/src/lib/openapi/models/ValidationError.ts @@ -1,4 +1,4 @@ -/* generated using openapi-typescript-codegen -- do no edit */ +/* generated using openapi-typescript-codegen -- do not edit */ /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ diff --git a/frontend/src/lib/openapi/services/DefaultService.ts b/frontend/src/lib/openapi/services/DefaultService.ts index f6a6e18b..1114558e 100644 --- a/frontend/src/lib/openapi/services/DefaultService.ts +++ b/frontend/src/lib/openapi/services/DefaultService.ts @@ -1,4 +1,4 @@ -/* generated using openapi-typescript-codegen -- do no edit */ +/* generated using openapi-typescript-codegen -- do not edit */ /* istanbul ignore file */ /* tslint:disable */ /* eslint-disable */ @@ -112,6 +112,29 @@ export class DefaultService { }, }); } + /** + * Search Venome Similar Compare + * @param proteinName + * @param proteinCompare + * @returns SimilarProtein Successful Response + * @throws ApiError + */ + public static searchVenomeSimilarCompare( + proteinName: string, + proteinCompare: string, + ): CancelablePromise { + return __request(OpenAPI, { + method: 'GET', + url: '/search/venome/similar/{protein_name}/{protein_compare}', + path: { + 'protein_name': proteinName, + 'protein_compare': proteinCompare, + }, + errors: { + 422: `Validation Error`, + }, + }); + } /** * Get Pdb File * @param proteinName diff --git a/frontend/src/routes/Align.svelte b/frontend/src/routes/Align.svelte index ecc246a3..2d9ae838 100644 --- a/frontend/src/routes/Align.svelte +++ b/frontend/src/routes/Align.svelte @@ -2,19 +2,22 @@ import TMAlignEntry from "./TMAlignEntry.svelte"; import { onMount } from "svelte"; - import { Backend, BACKEND_URL, type ProteinEntry } from "../lib/backend"; + import { Backend, BACKEND_URL, type SimilarProtein, type ProteinEntry } from "../lib/backend"; import Molstar from "../lib/Molstar.svelte"; import DelayedSpinner from "../lib/DelayedSpinner.svelte"; import { DownloadOutline } from "flowbite-svelte-icons"; import { Button } from "flowbite-svelte"; import * as d3 from "d3"; import { undoFormatProteinName } from "../lib/format"; + import AlignBlock from "../lib/AlignBlock.svelte"; export let proteinA: string; export let proteinB: string; let combined = proteinA + "/" + proteinB; let entryA: ProteinEntry | null = null; let entryB: ProteinEntry | null = null; + let foldseekData: SimilarProtein; + let foldseekError = false; let error = false; const dark2green = d3.schemeDark2[0]; @@ -34,6 +37,17 @@ entryA = await Backend.getProteinEntry(proteinA); entryB = await Backend.getProteinEntry(proteinB); + try { + foldseekData = await Backend.searchVenomeSimilarCompare(proteinA, proteinB) + } catch (e) { + console.error(e); + console.error( + "NEED TO DOWNLOAD FOLDSEEK IN THE SERVER. SEE THE SERVER ERROR MESSAGE." + ); + foldseekError = true; + } + + // if we could not find the entry, the id is garbo if (entryA == null || entryB == null) error = true; console.log(entryA, entryB); @@ -58,6 +72,33 @@ +

+ Foldseek Data +

+ {#if foldseekData === undefined && !foldseekError} + + {:else if foldseekData !== undefined} +
+ Prob. Match: {foldseekData.prob} +
+
+ E-Value: {foldseekData.evalue} +
+
+ Region of Similarity + +
+ {/if}