Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
980f054
from-FoldSeek workflow. various UI/UX improvements
dannydoor Sep 30, 2025
65ac0cb
Build static server binaries
milot-mirdita Sep 17, 2025
47ff429
Add a -version switch to print git commit
milot-mirdita Sep 17, 2025
e73e5e7
allow overriding parameters like the GPU parameters in the cli
milot-mirdita Sep 18, 2025
3660bd5
1. Editted code style
dannydoor Oct 14, 2025
1802bf4
Merge branch 'master' into fromSeek
dannydoor Oct 14, 2025
ac2007a
Fixed prepending comment to support mmCIF format
dannydoor Oct 15, 2025
09e4768
Fixed issue with fetching structure files from pdb100 db
dannydoor Oct 15, 2025
372e225
Fixed select-all help icon be hidden when select-all button is checked
dannydoor Oct 15, 2025
8c2b5b0
Fixed Foldseek Multimer-to-FoldMason workflow: concatenate multiple c…
dannydoor Oct 17, 2025
11256d1
Added floating navigation button
dannydoor Oct 21, 2025
9527bf7
Navigation button now works properly
dannydoor Oct 22, 2025
afaccf3
Fixed NavigationButton file name
dannydoor Oct 22, 2025
b12bba4
Fixed select-to-send buttons style to be compatible with navigation b…
dannydoor Oct 22, 2025
cb1fe1c
Fixed file name, removed unnecessary logs
dannydoor Oct 22, 2025
8917b7f
Fixed the rest of the path in ResultFoldMason.vue
dannydoor Oct 22, 2025
62d613f
1. Fixed pulchra-related alignment structure loading bug.
dannydoor Nov 5, 2025
a7ee2b7
Refactored codes for optimization and easier maintenance.
dannydoor Nov 7, 2025
71a5baa
Fixed table mode switch button.
dannydoor Nov 7, 2025
41e0aff
Made the selection state switch lighter with only using vanilla JS fe…
dannydoor Nov 28, 2025
366807f
Applied style for sort feature
dannydoor Nov 28, 2025
2bbe389
Added sort feature styles.
dannydoor Dec 29, 2025
76c8d13
Implemented fromDisco Featrues
dannydoor Jan 4, 2026
b418ab8
Added skipped duplicated entries alert on FoldMason search page
dannydoor Jan 4, 2026
dec3b90
- Made the Folddisco-to-FoldMason workflow switchable with '?d2m=1' tag.
dannydoor Jan 5, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
61 changes: 61 additions & 0 deletions frontend/AllAtomPredictMixin.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
<script>
import axios from 'axios'

export default {
name : 'AllAtomPredictMixin',
data() {
return {
predictApi: axios.create({
baseURL: 'https://3di.foldseek.com/cg2all/predict',
responseType: 'text',
transformResponse: [(data) => data],
headers: {
'Content-Type': 'multipart/form-data',
'Accept': 'text/plain',
}
})
}
},
methods: {
async predictGivenPdb(pdbstr, signal=undefined) {
const formData = new FormData()
const blob = new Blob([pdbstr], {type: 'text/plain'})
formData.append('file', blob, 'tmp.pdb')

try {
const response = await this.predictApi.post('', formData, {
signal: signal ? signal : undefined,
responseType: 'text'
})
return this.prependRemark(response.data)
} catch (e) {
if (e.response) {
console.error('Server error: ', e.response.status, e.response.data);
} else if (e.request) {
console.error('No response: ', e.request);
} else if (axios.isCancel(e)) {
console.error('Aborted');
} else {
console.error('Config error: ', e.message);
}
throw e
}
},
prependRemark(pdbstr) {
let is_cif = false
if (pdbstr[0] == '#' || pdbstr.startsWith('data_')) {
is_cif = true
}

let prefix = is_cif ? '# ' : 'REMARK 90 '
let firstline = prefix + 'This model is rebuilt with cg2all(https://github.com/huhlim/cg2all)'
if (!is_cif && firstline.length > 79) {
firstline = firstline.slice(76) + '... '
}

firstline = firstline.padEnd(80, ' ') + '\n'
return firstline + pdbstr
},
}
}
</script>
106 changes: 103 additions & 3 deletions frontend/FoldMasonSearch.vue
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,17 @@
</template>
<template slot="content">
<div class="upload-outer-container w-44 gr-2 mb-2">
<v-alert
v-model="alert"
border="left"
close-text="Close Alert"
color="primary"
text
type="info"
dismissible
>
<strong>{{ skippedEntries }} duplicated entries</strong> have been skipped
</v-alert>
<DragUploadBox
class="drag-upload-box"
@uploadedFiles="upload"
Expand All @@ -38,7 +49,7 @@
@click:close="removeQuery(index)"
>
{{ q.name }}
</v-chip>
</v-chip>
</div>
</div>

Expand Down Expand Up @@ -131,6 +142,9 @@ import { HistoryMixin } from './lib/HistoryMixin.js';
import Databases from './Databases.vue';
import QueryTextarea from "./QueryTextarea.vue";
import DragUploadBox from "./DragUploadBox.vue";
import { BlobDatabase } from "./lib/BlobDatabase.js";

const db = BlobDatabase();

export default {
name: "FoldMasonSearch",
Expand All @@ -155,13 +169,16 @@ export default {
queries: [], // [ { name: "file", text: "ATOM..." }, { name: "file", text: "ATOM..." } ...]
inFileDrag: false,
accessionLoading: false,
alert: false,
skippedEntries: 0,
};
},
async mounted() {
if (this.preloadAccessions.length > 0) {
this.queries = [];
return;
}
this.retrieveAndClean()
return;
},
computed: {
alignDisabled() {
Expand Down Expand Up @@ -253,7 +270,7 @@ export default {
async removeQuery(index) {
this.queries.splice(index, 1);
},
async addFiles(newFiles) {
addFiles(newFiles) {
for (const newFile of newFiles) {
if (!this.fileNameSet.has(newFile.name)) {
this.queries.push(newFile);
Expand Down Expand Up @@ -297,6 +314,89 @@ export default {
);
fr.readAsText(file)
},
resetParams() {
this.params = structuredClone(defaultParams);
},
async retrieveAndClean() {
const clean = async (size) => {
// return
await db.removeItem('msa.query.size')
await db.removeItem('msa.query.names')
for (let i = 0; i < size; i++) {
await db.removeItem(`msa.query.chunk:${i}`)
}
}

// await clean(2)
// return

const SEP = '\0'

let size = await db.getItem('msa.query.size')
if (!size || size.length == 0) {
await clean()
return
}

size = parseInt(size)

const texts = []
let names = await db.getItem('msa.query.names')
if (!names || names.length == 0) {
console.warn("MSA query name has not been passed")
await clean(size)
return
}
names = names.split(SEP)

for (let i = 0; i < size; i++) {
const entry = await db.getItem(`msa.query.chunk:${i}`)
if (!entry || entry.length == 0) {
console.warn(`MSA query chunk ${i} is missing`)
await clean(size)
return
}

texts.push(...( ( await entry.text() ).split(SEP) ))
}

if (names.length != texts.length) {
console.warn("MSA query entries and names size differs")
console.log(`names length: ${names.length}`)
console.log(`texts length: ${texts.length}`)
console.log(texts)
await clean(size)
return
}

const files = []

for (let i = 0; i < texts.length; i++) {
files.push({text: texts[i], name: names[i]})
}

// Calculate overlapping entries
files.sort((a, b) => {return a.name.localeCompare(b.name)})
let dupCount = 0
let prev = ""

for (let f of files) {
if (f.name == prev) {
dupCount++
} else {
prev = f.name
}
}

if (dupCount > 0) {
this.alert = true
this.skippedEntries = dupCount
}

this.addFiles(files)

await clean(size)
}
}
};
</script>
Expand Down
6 changes: 3 additions & 3 deletions frontend/History.vue
Original file line number Diff line number Diff line change
Expand Up @@ -5,9 +5,9 @@
<v-list-item-title>
History
</v-list-item-title>
<v-list-item-subtitle v-if="drawer" class="ml-n1" @click.prevent>
<button :style="{'opacity' : page == 0 ? 0.6 : 1}" @click.prevent="previous();"><v-icon style="transform:inherit">{{ $MDI.ChevronLeft }}</v-icon></button>
<button :style="{'opacity' : (page + 1) * limit >= items.length ? 0.6 : 1}" @click.prevent="next();"><v-icon style="transform:inherit">{{ $MDI.ChevronRight }}</v-icon></button>
<v-list-item-subtitle v-if="drawer" class="ml-n1" @click.stop>
<button :style="{'opacity' : page == 0 ? 0.6 : 1}" @click.stop="previous();"><v-icon style="transform:inherit">{{ $MDI.ChevronLeft }}</v-icon></button>
<button :style="{'opacity' : (page + 1) * limit >= items.length ? 0.6 : 1}" @click.stop="next();"><v-icon style="transform:inherit">{{ $MDI.ChevronRight }}</v-icon></button>
</v-list-item-subtitle>
</v-list-item-content>
</template>
Expand Down
Loading