Skip to content

Commit

Permalink
Load Foldseek Data on TM Align Compare Page (#237)
Browse files Browse the repository at this point in the history
* 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
  • Loading branch information
ansengarvin authored Apr 15, 2024
1 parent de56683 commit da5ee05
Show file tree
Hide file tree
Showing 29 changed files with 135 additions and 32 deletions.
39 changes: 39 additions & 0 deletions backend/src/api/search.py
Original file line number Diff line number Diff line change
Expand Up @@ -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]
2 changes: 1 addition & 1 deletion backend/src/data/pdbAlphaFold/.gitignore
Original file line number Diff line number Diff line change
@@ -1 +1 @@
*.pdb
*.pdb
2 changes: 1 addition & 1 deletion frontend/src/lib/openapi/core/ApiError.ts
Original file line number Diff line number Diff line change
@@ -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 */
Expand Down
2 changes: 1 addition & 1 deletion frontend/src/lib/openapi/core/ApiRequestOptions.ts
Original file line number Diff line number Diff line change
@@ -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 */
Expand Down
2 changes: 1 addition & 1 deletion frontend/src/lib/openapi/core/ApiResult.ts
Original file line number Diff line number Diff line change
@@ -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 */
Expand Down
8 changes: 4 additions & 4 deletions frontend/src/lib/openapi/core/CancelablePromise.ts
Original file line number Diff line number Diff line change
@@ -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 */
Expand Down Expand Up @@ -85,9 +85,9 @@ export class CancelablePromise<T> implements Promise<T> {
});
}

get [Symbol.toStringTag]() {
return "Cancellable Promise";
}
get [Symbol.toStringTag]() {
return "Cancellable Promise";
}

public then<TResult1 = T, TResult2 = never>(
onFulfilled?: ((value: T) => TResult1 | PromiseLike<TResult1>) | null,
Expand Down
2 changes: 1 addition & 1 deletion frontend/src/lib/openapi/core/OpenAPI.ts
Original file line number Diff line number Diff line change
@@ -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 */
Expand Down
4 changes: 2 additions & 2 deletions frontend/src/lib/openapi/core/request.ts
Original file line number Diff line number Diff line change
@@ -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 */
Expand Down Expand Up @@ -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)) {
Expand Down
2 changes: 1 addition & 1 deletion frontend/src/lib/openapi/index.ts
Original file line number Diff line number Diff line change
@@ -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 */
Expand Down
2 changes: 1 addition & 1 deletion frontend/src/lib/openapi/models/EditBody.ts
Original file line number Diff line number Diff line change
@@ -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 */
Expand Down
2 changes: 1 addition & 1 deletion frontend/src/lib/openapi/models/HTTPValidationError.ts
Original file line number Diff line number Diff line change
@@ -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 */
Expand Down
2 changes: 1 addition & 1 deletion frontend/src/lib/openapi/models/LoginBody.ts
Original file line number Diff line number Diff line change
@@ -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 */
Expand Down
2 changes: 1 addition & 1 deletion frontend/src/lib/openapi/models/LoginResponse.ts
Original file line number Diff line number Diff line change
@@ -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 */
Expand Down
2 changes: 1 addition & 1 deletion frontend/src/lib/openapi/models/ProteinEditSuccess.ts
Original file line number Diff line number Diff line change
@@ -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 */
Expand Down
2 changes: 1 addition & 1 deletion frontend/src/lib/openapi/models/ProteinEntry.ts
Original file line number Diff line number Diff line change
@@ -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 */
Expand Down
2 changes: 1 addition & 1 deletion frontend/src/lib/openapi/models/RangeFilter.ts
Original file line number Diff line number Diff line change
@@ -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 */
Expand Down
2 changes: 1 addition & 1 deletion frontend/src/lib/openapi/models/SearchProteinsBody.ts
Original file line number Diff line number Diff line change
@@ -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 */
Expand Down
2 changes: 1 addition & 1 deletion frontend/src/lib/openapi/models/SearchProteinsResults.ts
Original file line number Diff line number Diff line change
@@ -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 */
Expand Down
2 changes: 1 addition & 1 deletion frontend/src/lib/openapi/models/SimilarProtein.ts
Original file line number Diff line number Diff line change
@@ -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 */
Expand Down
2 changes: 1 addition & 1 deletion frontend/src/lib/openapi/models/Tutorial.ts
Original file line number Diff line number Diff line change
@@ -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 */
Expand Down
2 changes: 1 addition & 1 deletion frontend/src/lib/openapi/models/TutorialEdit.ts
Original file line number Diff line number Diff line change
@@ -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 */
Expand Down
2 changes: 1 addition & 1 deletion frontend/src/lib/openapi/models/TutorialUpload.ts
Original file line number Diff line number Diff line change
@@ -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 */
Expand Down
2 changes: 1 addition & 1 deletion frontend/src/lib/openapi/models/UploadBody.ts
Original file line number Diff line number Diff line change
@@ -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 */
Expand Down
2 changes: 1 addition & 1 deletion frontend/src/lib/openapi/models/UploadError.ts
Original file line number Diff line number Diff line change
@@ -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 */
Expand Down
2 changes: 1 addition & 1 deletion frontend/src/lib/openapi/models/UploadPNGBody.ts
Original file line number Diff line number Diff line change
@@ -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 */
Expand Down
2 changes: 1 addition & 1 deletion frontend/src/lib/openapi/models/ValidationError.ts
Original file line number Diff line number Diff line change
@@ -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 */
Expand Down
25 changes: 24 additions & 1 deletion frontend/src/lib/openapi/services/DefaultService.ts
Original file line number Diff line number Diff line change
@@ -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 */
Expand Down Expand Up @@ -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<SimilarProtein> {
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
Expand Down
43 changes: 42 additions & 1 deletion frontend/src/routes/Align.svelte
Original file line number Diff line number Diff line change
Expand Up @@ -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];
Expand All @@ -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);
Expand All @@ -58,6 +72,33 @@
</div>
<TMAlignEntry entry={entryA} color={dark2green} />
<TMAlignEntry entry={entryB} color={dark2orange} />
<h1>
Foldseek Data
</h1>
{#if foldseekData === undefined && !foldseekError}
<DelayedSpinner
text="Loading Foldseek..."
textRight
msDelay={0}
/>
{:else if foldseekData !== undefined}
<div>
<b>Prob. Match:</b> {foldseekData.prob}
</div>
<div>
<b>E-Value:</b> {foldseekData.evalue}
</div>
<div>
<b>Region of Similarity</b>
<AlignBlock
width={260}
height={20}
ogLength={entryA.length}
qstart={foldseekData.qstart}
qend={foldseekData.qend}
/>
</div>
{/if}
<div style="width: 300px;" class="mt-3">
<Button href="{BACKEND_URL}/protein/pdb/{combined}"
>Download Aligned PDB File<DownloadOutline
Expand Down
2 changes: 1 addition & 1 deletion galaxy/delete_all.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import requests
import os

DIR = "../backend/src/data/pdbAlphaFold"
DIR = os.path.join('..', 'backend', 'src', 'data', 'pdbAlphaFold')


def delete_protein_files():
Expand Down

0 comments on commit da5ee05

Please sign in to comment.