Skip to content
Snippets Groups Projects

Compare revisions

Changes are shown as if the source revision was being merged into the target revision. Learn more about comparing revisions.

Source

Select target project
No results found

Target

Select target project
  • mdm-lab/wiki
  • hvaysset/wiki
  • jsousa/wiki
  • tclabby/wiki
4 results
Show changes
Commits on Source (53)
Showing
with 227 additions and 75 deletions
......@@ -203,15 +203,6 @@ lint:
--dir content/3.defense-systems/
--pfam public/pfam-a-hmm.csv
--output data/list-systems.json
- df-wiki-cli meilisearch delete-all-documents refseq
- >
df-wiki-cli
meilisearch
--host ${MEILI_HOST}
--key ${MEILI_MASTER_KEY}
index-update
refseq
sys_id
- >
df-wiki-cli
meilisearch
......@@ -328,7 +319,7 @@ get-zotero:
variables:
CONTEXT: "."
DOCKERFILE: "Dockerfile"
BASE_URL: /wiki/
BASE_URL: /
MEILI_HOST: "http://localhost:7700"
before_script:
- *docker-login
......@@ -337,7 +328,7 @@ get-zotero:
docker buildx build --pull -t "$CI_REGISTRY_IMAGE/$IMAGE_NAME:$CI_COMMIT_SHORT_SHA"
--build-arg "BASE_URL=$BASE_URL"
--build-arg "MEILI_HOST=$MEILI_HOST"
--build-arg "MEILI_API_KEY=$MEILI_API_KEY"
--build-arg "MEILI_API_KEY=$MEILI_API_KEY"
-f $DOCKERFILE $CONTEXT
- docker push "$CI_REGISTRY_IMAGE/$IMAGE_NAME:$CI_COMMIT_SHORT_SHA"
......@@ -350,6 +341,7 @@ build:dev:wiki:
# - get-pfam
variables:
BASE_URL: /wiki/
HOST_URL: https://${HOST_DEV}
before_script:
- *docker-login
# - "sed -i 's/MEILISEARCH_API_KEY/${$MEILI_API_KEY}/g' nuxt.config.ts"
......@@ -365,6 +357,8 @@ build:prod:wiki:
# - get-pfam
variables:
BASE_URL: /wiki/
HOST_URL: https://${HOST_PROD}
rules:
- if: $CI_COMMIT_BRANCH == "main"
......@@ -495,7 +489,7 @@ build:prod:wiki:
deploy:dev:
extends: .deploy
rules:
- if: $CI_COMMIT_BRANCH == "dev" || $CI_COMMIT_BRANCH == "refactor-facet-autocomplete"
- if: $CI_COMMIT_BRANCH == "dev" || $CI_COMMIT_BRANCH == "foldseek-pages"
needs:
- "build:dev:wiki"
when: manual
......
......@@ -15,14 +15,14 @@ FROM node:21.1-bookworm-slim as dev
ARG BASE_URL=/
ARG MEILI_HOST=http://localhost:7700
ARG MEILI_API_KEY=api_key
ARG HOST_URL
ENV NUXT_APP_BASE_URL=${BASE_URL}
# nuxt module
ENV NUXT_PUBLIC_MEILISEARCH_CLIENT_HOST_URL=${MEILI_HOST}
ENV NUXT_PUBLIC_MEILISEARCH_CLIENT_SEARCH_API_KEY=${MEILI_API_KEY}
ENV NUXT_PUBLIC_MEILI_HOST=${MEILI_HOST}
ENV NUXT_PUBLIC_MEILI_API_KEY=${MEILI_API_KEY}
ENV NUXT_PUBLIC_HOST_URL=${HOST_URL}
# ENV NUXT_PUBLIC_MEILI_HOST=${MEILI_HOST}
# ENV NUXT_PUBLIC_MEILI_API_KEY=${MEILI_API_KEY}
WORKDIR /usr/src/app
......@@ -43,10 +43,21 @@ RUN npm run build
### STAGE: serve ###
FROM node:21.1-bookworm-slim as serve
ARG BASE_URL=/
ARG MEILI_HOST=http://localhost:7700
ARG MEILI_API_KEY
ARG HOST_URL
WORKDIR /usr/src/app
COPY --from=build /usr/src/app/.output ./
ENV NUXT_APP_BASE_URL=${BASE_URL}
# nuxt module
ENV NUXT_PUBLIC_MEILISEARCH_CLIENT_HOST_URL=${MEILI_HOST}
ENV NUXT_PUBLIC_MEILISEARCH_CLIENT_SEARCH_API_KEY=${MEILI_API_KEY}
ENV NUXT_PUBLIC_HOST_URL=${HOST_URL}
WORKDIR /usr/src/app
COPY --chown=node:node --from=build /usr/src/app/.output ./
USER node
CMD [ "node", "server/index.mjs"]
......@@ -55,6 +66,7 @@ FROM node:21.1-bookworm-slim as generate
ARG BASE_URL=/
ARG MEILI_HOST=http://localhost:7700
ARG MEILI_API_KEY
ARG HOST_URL
ENV NODE_OPTIONS=--max_old_space_size=12288
ENV NUXT_APP_BASE_URL=${BASE_URL}
......@@ -62,9 +74,11 @@ ENV NUXT_APP_BASE_URL=${BASE_URL}
# nuxt module
ENV NUXT_PUBLIC_MEILISEARCH_CLIENT_HOST_URL=${MEILI_HOST}
ENV NUXT_PUBLIC_MEILISEARCH_CLIENT_SEARCH_API_KEY=${MEILI_API_KEY}
ENV NUXT_PUBLIC_HOST_URL=${HOST_URL}
ENV NUXT_PUBLIC_MEILI_HOST=${MEILI_HOST}
ENV NUXT_PUBLIC_MEILI_API_KEY=${MEILI_API_KEY}
# ENV NUXT_PUBLIC_MEILI_HOST=${MEILI_HOST}
# ENV NUXT_PUBLIC_MEILI_API_KEY=${MEILI_API_KEY}
WORKDIR /usr/src/app
......
assets/foldseek.png

142 KiB

<template>
<v-row>
<v-col>
<v-btn prepend-icon="mdi-gitlab" variant="text" size="small" :href="path" target="_blank">Edit on gitlab</v-btn>
<v-btn prepend-icon="i-vscode-icons:file-type-gitlab" variant="text" size="small" :href="path" target="_blank">Edit on gitlab</v-btn>
<v-divider> </v-divider>
</v-col>
</v-row>
......
<script setup lang="ts">
interface Props {
foldseekPath: string
title: string
}
const props = withDefaults(defineProps<Props>(), { title: "Result of Foldseek search" });
const { width, height } = useDisplay()
const dialog = ref(false)
const iframe = ref()
const layout = ref({
scrollbarWidth: 15,
paddingLeft: 24,
paddingRight: 24,
toolbarHeight: 48,
containerPaddingTop: 16,
containerPaddingBottom: 10
})
const xMargin = computed(() => {
const toValLayout = toValue(layout)
return toValLayout.scrollbarWidth + toValLayout.paddingLeft + toValLayout.paddingRight
})
const yMargin = computed(() => {
const toValLayout = toValue(layout)
return toValLayout.toolbarHeight + toValLayout.containerPaddingBottom + toValLayout.containerPaddingTop
})
const computedWidth = computed(() => {
return toValue(width) - toValue(xMargin)
})
const computedHeight = computed(() => {
return toValue(height) - toValue(yMargin)
})
function fullscreen() {
console.log(iframe.value)
iframe.value.requestFullscreen();
}
</script>
<template>
<v-dialog v-model="dialog" fullscreen transition="dialog-bottom-transition">
<template v-slot:activator="{ props }">
<v-avatar>
<v-img src="~/assets/foldseek.png" alt="Foldseek results" v-bind="props" class="cursor-pointer"></v-img>
<!-- <v-btn color="primary" dark v-bind="props">
<v-img src="~/assets/foldseek.png" alt="Foldseek results"></v-img>
</v-btn> -->
</v-avatar>
</template>
<v-card variant="flat">
<v-toolbar flat color="transparent" density="compact">
<v-btn variant="text" color="primary" prepend-icon="mdi-arrow-left" @click="dialog = false">
Return to structure list
</v-btn>
<v-divider vertical inset></v-divider>
<v-toolbar-title> {{ props.title }}</v-toolbar-title>
<v-spacer></v-spacer>
<v-toolbar-items>
<v-btn @click="fullscreen()" icon="md:fullscreen"></v-btn>
</v-toolbar-items>
</v-toolbar>
<v-card-text>
<iframe ref="iframe" :width="computedWidth" :height="computedHeight" allow="fullscreen" loading="eager"
:src="props.foldseekPath"></iframe>
</v-card-text>
</v-card>
</v-dialog>
</template>
<style scoped>
.cursor-pointer {
cursor: pointer
}
</style>
\ No newline at end of file
......@@ -9,6 +9,7 @@ export interface Props {
edit?: boolean
navDrawer?: boolean
title?: string
density?: 'compact' | 'prominent'
}
const props = withDefaults(defineProps<Props>(), {
......@@ -16,15 +17,31 @@ const props = withDefaults(defineProps<Props>(), {
toc: true,
edit: true,
navDrawer: true,
title: null
title: "",
density: undefined
});
const drawer = ref(true);
const { page } = useContent();
const scrollThreshold = ref(200)
const density = ref<'compact' | 'prominent'>("prominent")
onMounted(() => {
if (props?.density) {
density.value = props.density
} else {
density.value = "prominent"
}
})
function onScroll() {
if (window.scrollY > scrollThreshold.value) {
if (props?.density) {
return props.density
}
else if (window.scrollY > scrollThreshold.value) {
density.value = "compact"
}
else { density.value = "prominent" }
......@@ -36,9 +53,9 @@ function onScroll() {
<v-main style="min-height: 300px">
<v-container v-scroll="onScroll" :fluid="fluid">
<v-row justify="center">
<v-col cols="auto">
<v-col cols="auto" class="pa-0">
<v-card flat color="transparent" :min-width="mobile ? undefined : 900" :max-width="fluid ? undefined : 1500">
<v-card-text>
<v-card-text class="pa-0">
<slot />
</v-card-text>
<EditGitlab v-if="edit" />
......@@ -48,6 +65,10 @@ function onScroll() {
</v-row>
</v-container>
<!-- <Footer></Footer> -->
<!-- <div class="i-ph-anchor-simple-thin d-none" />
<div class="i-tabler:database d-none" />
<div class="i-mdi:book-education-outline d-none" />
<div class="i-tabler:help d-none" /> -->
</v-main>
<NavNavbar v-model:drawer="drawer" :title="title !== null ? title : undefined" :density="density"
:drawer-enabled="navDrawer" />
......
......@@ -54,16 +54,16 @@ const autocompleteMeiliFacetsProps = ref<AutocompleteMeiliFacetProps>({
db: toValue(dbName),
facets: [
{ title: "Defense System", type: "subheader" },
{ title: "System", value: "type", type: "facet", icon: "mdi-virus-outline", },
{ title: "Subsystem", value: "subtype", type: "facet", icon: "mdi-virus-outline" },
{ title: "System", value: "type", type: "facet", icon: "i-tabler:virus-off", },
{ title: "Subsystem", value: "subtype", type: "facet", icon: "i-tabler:virus-off" },
{ type: "divider" },
{ title: "Taxonomy", type: "subheader" },
{ title: "Superkingdom", value: "Superkingdom", type: "facet", icon: "mdi-family-tree" },
{ title: "Phylum", value: "phylum", type: "facet", icon: "mdi-family-tree" },
{ title: "Order", value: "order", type: "facet", icon: "mdi-family-tree" },
{ title: "Family", value: "family", type: "facet", icon: "mdi-family-tree" },
{ title: "Genus", value: "genus", type: "facet", icon: "mdi-family-tree" },
{ title: "Species", value: "species", type: "facet", icon: "mdi-family-tree" },
{ title: "Superkingdom", value: "Superkingdom", type: "facet", icon: "i-tabler:binary-tree" },
{ title: "Phylum", value: "phylum", type: "facet", icon: "i-tabler:binary-tree" },
{ title: "Order", value: "order", type: "facet", icon: "i-tabler:binary-tree" },
{ title: "Family", value: "family", type: "facet", icon: "i-tabler:binary-tree" },
{ title: "Genus", value: "genus", type: "facet", icon: "i-tabler:binary-tree" },
{ title: "Species", value: "species", type: "facet", icon: "i-tabler:binary-tree" },
{ type: "divider" },
{ title: "Replicon", value: "replicon", type: "facet", icon: "mdi-dna", },
......@@ -104,7 +104,7 @@ const availableTaxo: Ref<string[]> = ref([
]);
const scaleTypes = ref<string[]>(['linear', 'sqrt', 'log', 'symlog'])
const selectedTaxoRank = ref("phylum");
const selectedTaxoRank = ref("Superkingdom");
const headers = ref([
{ title: "Replicon", key: "replicon" },
......@@ -284,7 +284,7 @@ const binPlotOptions = ref({
grid: true,
x: { tickRotate: 90, tip: true, label: "Systems" },
// y: { tickFormat: 's' },
color: { scheme: "turbo", legend: true },
color: { scheme: "plasma", legend: true },
})
const binPlotDataOptions = computed(() => {
......
<script setup lang="ts">
import * as Plot from "@observablehq/plot";
import PlotFigure from "~/components/PlotFigure";
import type { SortItem, AutocompleteMeiliFacetProps } from "@/components/ServerDbTable.vue"
import { useNumericalFilter } from "@/composables/useNumericalfilter"
import type { FacetInputItem } from '@/components/AutocompleteMeiliFacets.vue'
import { useRefinedUrl } from "@/composables/useRefinedUrl"
import { ServerDbTable } from "#components"
import { withQuery, joinURL, withTrailingSlash } from 'ufo'
interface Item {
Foldseek_name: string
System_name_ok: string
}
const sortBy: Ref<SortItem[]> = ref([{ key: 'System', order: "asc" }])
const itemValue = ref("id");
const dbName = ref("structure")
......@@ -32,12 +36,12 @@ const autocompleteMeiliFacetsProps = ref<AutocompleteMeiliFacetProps>({
db: toValue(dbName),
facets: [
{ title: "Defense System", type: "subheader" },
{ title: "System", value: "System", type: "facet", icon: "mdi-virus-outline", },
{ title: "Subsystem", value: "subtype", type: "facet", icon: "mdi-virus-outline" },
{ title: "System", value: "System", type: "facet", icon: "i-tabler:virus-off", },
{ title: "Subsystem", value: "subtype", type: "facet", icon: "i-tabler:virus-off" },
{ type: "divider" },
{ title: "Gene name", value: "gene_name", type: "facet", icon: "mdi-dna" },
{ title: "Completed", value: "completed", type: "facet", icon: "md:done" },
{ title: "Prediction type", value: "prediction_type", type: "facet", icon: "mdi-molecule" },
{ title: "Prediction type", value: "prediction_type", type: "facet", icon: "i-gravity-ui:molecule" },
],
facetDistribution: undefined
})
......@@ -69,6 +73,7 @@ const computedAutocompleteMeiliFacetsProps = computed(() => {
const headers: Ref<Object[]> = ref([
{ title: 'Structure', key: 'structure', sortable: false, removable: false },
{ title: 'Foldseek', key: 'Foldseek_name', sortable: false },
{ title: "System", key: "System", removable: false },
{ title: "Gene name", key: "gene_name", removable: false },
{ title: "Subtype", key: "subtype", removable: false },
......@@ -99,9 +104,7 @@ function isString(item: Ref<string | undefined>): item is Ref<string> {
}
const numericalFilters = computed(() => {
console.log("je compute mes numerical filters")
const listFilters = [plddtsFilter, iptmFilter, pdockqFilter].filter(isString).map(f => toValue(f))
console.log(listFilters)
return listFilters.length > 0 ? listFilters : undefined
})
......@@ -119,6 +122,12 @@ const dataTableServerProps = computed(() => {
function toFolseekUrl(item: Item) {
const url = joinURL("/" + item.System_name_ok, item.Foldseek_name)
const { refinedUrl } = useRefinedUrl(url)
console.log(toValue(refinedUrl))
return toValue(refinedUrl)
}
function namesToCollapsibleChips(names: string[], systemDir: string, file: string | null = null) {
......@@ -146,7 +155,7 @@ function pdbNameToCif(pdbPath: string) {
pLDDT
</v-list-item-title>
<v-row>
<v-col class="pt-8 pl-8">
<v-col class="pt-8 pl-8" :lg="8">
<v-range-slider v-model="plddtsRange" strict density="compact" hide-details="auto" step="0.5"
:min="0" :max="100" thumb-label="always" @update:modelValue="search()">
<template #append>
......@@ -161,7 +170,7 @@ function pdbNameToCif(pdbPath: string) {
iptm+ptm
</v-list-item-title>
<v-row>
<v-col class="pt-8 pl-8">
<v-col class="pt-8 pl-8" :lg="8">
<v-range-slider v-model="iptmRange" strict density="compact" hide-details="auto" step="0.1"
:min="0" :max="1" thumb-label="always" @update:modelValue="search()">
<template #append>
......@@ -173,7 +182,7 @@ function pdbNameToCif(pdbPath: string) {
<v-list-item>
<v-list-item-title class="text-subtitle-1 text-medium-emphasis">pDockQ</v-list-item-title>
<v-row>
<v-col class="pt-8 pl-8">
<v-col class="pt-8 pl-8" :lg="8">
<v-range-slider v-model="pdockqRange" density="compact" strict hide-details="auto" step="0.1"
:min="0" :max="1" thumb-label="always" @update:modelValue="search()">
<template #append>
......@@ -184,7 +193,14 @@ function pdbNameToCif(pdbPath: string) {
</v-list-item>
</v-list>
</template>
<template #[`item.Foldseek_name`]="{ item }">
<FoldseekDialog v-if="item.Foldseek_name !== 'na'" :foldseek-path="toFolseekUrl(item)"></FoldseekDialog>
<!-- <NuxtLink v-if="item.Foldseek_name !== 'na'" :to="toFolseekUrl(item)" :external="false">
<v-avatar>
<v-img src="~/assets/foldseek.png" alt="Foldseek results"></v-img>
</v-avatar>
</NuxtLink> -->
</template>
<template #[`item.proteins_in_the_prediction`]="{ item }">
<CollapsibleChips
:items="namesToCollapsibleChips(item.proteins_in_the_prediction, item.System_name_ok, item.fasta_file)">
......
......@@ -23,22 +23,22 @@ const autocompleteMeiliFacetsProps = ref<AutocompleteMeiliFacetProps>({
db: toValue(dbName),
facets: [
{ title: "Defense System", type: "subheader" },
{ title: 'System', value: "title", type: "facet", icon: "mdi-virus-outline" },
{ title: 'System', value: "title", type: "facet", icon: "i-tabler:virus-off" },
{ type: "divider" },
{ title: "Mechanism", type: "subheader" },
{ title: 'Sensor', value: "Sensor", type: "facet", icon: "mdi-cog" },
{ title: 'Effector', value: "Effector", type: "facet", icon: "mdi-cog" },
{ title: 'Activator', value: "Activator", type: "facet", icon: "mdi-cog" },
{ title: 'Sensor', value: "Sensor", type: "facet", icon: "i-tabler:shield-cog" },
{ title: 'Effector', value: "Effector", type: "facet", icon: "i-tabler:shield-cog" },
{ title: 'Activator', value: "Activator", type: "facet", icon: "i-tabler:shield-cog" },
{ type: "divider" },
{ title: "PFAM", type: "subheader" },
{ title: 'Acession', value: "PFAM.AC", type: "facet", icon: "mdi-key" },
{ title: 'Description', value: "PFAM.DE", type: "facet", icon: "md:description" },
{ title: 'Acession', value: "PFAM.AC", type: "facet", icon: "i-tabler:circle-key" },
{ title: 'Description', value: "PFAM.DE", type: "facet", icon: "i-tabler:file-description" },
{ type: "divider" },
{ title: 'Contributor', value: "contributors", type: "facet", icon: "md:person" },
{ title: 'Contributor', value: "contributors", type: "facet", icon: "i-tabler:user-heart" },
],
facetDistribution: undefined
})
......@@ -118,4 +118,5 @@ const columnsToDownload = ref(['title', 'doi', 'Sensor', 'Activator', 'Effector'
<CollapsibleChips v-if="item?.contributors" :items="item.contributors.map(it => ({ title: it }))">
</CollapsibleChips>
</template>
</ServerDbTable></template>
\ No newline at end of file
</ServerDbTable>
</template>
\ No newline at end of file
......@@ -17,8 +17,8 @@ export async function useFetchMsDocument(
const runtimeConfig = useRuntimeConfig();
const client = new MeiliSearch({
host: runtimeConfig.public.meiliHost,
apiKey: runtimeConfig.public.meiliApiKey
host: runtimeConfig.public.meilisearchClient.hostUrl,
apiKey: runtimeConfig.public.meilisearchClient.searchApiKey
})
const pending = ref(false)
const filterError: Ref<string | null> = ref(null)
......
---
title: Contributing to the Wiki
layout: article
navigation:
---
# Contributing to the Wiki
......
navigation.icon: "md:help"
navigation.icon: 'i-tabler:help'
......@@ -19,6 +19,7 @@ relevantAbstracts:
- doi: 10.1038/s41579-023-00934-x
---
# Abortive Infection
The term abortive infection was coined in the 1950s :ref{doi=10.1128/jb.68.1.36-42.1954}
to describe the observations that a fraction of the bacterial population did not support phage replication.
......
......@@ -5,8 +5,9 @@ toc: true
contributors:
- Hugo Vaysset
---
# Defensive Domains
# What are protein domains ?
## What are protein domains ?
Proteins can typically be decomposed into a set of structural or functional units called "domains" where each individual domain has a specific biological function (e.g. catalyzing a chemical reaction or binding to another protein). The combination of one or several protein domains within a protein determines its biological function.
......@@ -14,10 +15,10 @@ Proteins can typically be decomposed into a set of structural or functional unit
To examplify this idea, the figure is a depiction of the ThsA protein involved in the [Thoeris](/defense-systems/thoeris) defense system in *Bacillus cereus*. The protein is composed of two domains : a SIR2-like domain (blue) and a SLOG domain (green). The SLOG domain of ThsA is able to bind to cyclic Adenosine Diphosphate Ribose (cADPR), a signalling molecule produced by ThsB upon phage infection. Binding of cADPR activates the Nicotinamide Adenine Dinucleotide (NAD) depletion activity of the SIR2-like domain which causes abortive infection. This shows how the presence of two domains in this protein allows it to be activated by the sensor component of the system (ThsB) and to trigger the immune response mechanism :ref{doi=10.1038/s41586-021-04098-7}.
# Domain characterization helps to understand the biological function of a protein
## Domain characterization helps to understand the biological function of a protein
Although a considerable diversity of molecular mechanisms have been described for defense systems, it is striking to observe that some functional domains are recurrently involved in antiphage defense :ref{doi=10.1038/s41586-021-04098-7}. When studying the presence of a new defense system, the *in silico* characterization of the domains present in the system can provide valuable information regarding the molecular mechanism of the system. If one protein of the system contains for example a TerB domain, this might indicate that the system is involved in membrane integrity surveillance as this domain was previously shown to be associated with the periplasmic membrane :ref{doi=10.1016/j.chom.2022.09.017}. If a protein of the system contains a TIR domain this might indicate that the system possess a NAD degradation activity or that the protein could multimerize as both functions have been shown for this domain in the past :ref{doi=10.3389/fimmu.2021.784484}.
# Domains can be conserved throughout evolution
## Domains can be conserved throughout evolution
It is clear that some defense systems can be conserved among different clades of bacteria but it was also observed that the unit of evolutionary conservation can be the protein domain :ref{doi=10.1038/s41467-022-30269-9}. As a consequence, it is frequent to find the same domain associated with a wide range of distinct other domains in different defense systems :ref{doi=10.1016/j.mib.2023.102312}. This is well illustrated by defense systems such [Avs](/defense-systems/avs) or [CBASS](/defense-systems/cbass) that can be constituted of diverse effector proteins which differ from each other based on the specific domains that compose them :ref{doi=10.1126/science.aba0372}, :ref{doi=10.1038/s41564-022-01239-0}, :ref{doi=10.1038/s41564-020-0777-y}. The modular aspect of protein domains fits with the concept of "evolution as tinkering" stating that already existing objects (here protein domains) can often be repurposed in new manners, allowing the efficient development of novel functions :ref{doi=10.1126/science.860134}.
......@@ -4,5 +4,6 @@ contributors:
- Marian Dominguez-Mirazo
layout: article
---
# Defense Systems and Mobile Genetic Elements
Mobile genetic elements (MGEs), such as plasmids, bacteriophages, and phage satellites, facilitate horizontal gene transfer (HGT) within microbial populations, playing a crucial role in the genetic diversity and genomic evolution of bacteria :ref{doi=10.1098/rstb.2020.0460}. These elements expedite the exchange of genetic material among bacterial cells, promoting the dissemination of advantageous traits like antibiotic resistance, virulence factors, and metabolic capabilities, allowing bacteria to adapt to dynamic environments :ref{doi=10.1098/rstb.2020.0460}. However, the presence of MGEs can impose a substantial fitness cost on the bacterial host, as in the case of lytic phage infections. To counteract parasitic genomic elements, including viruses and other MGEs, bacteria have evolved defense systems. These defense systems are often disadvantageous under low parasite pressure, leading to their occasional loss. However, as the pressure from parasites increases, these defense systems become advantageous. Consequently, defense systems in bacteria exhibit high mobility and transfer rates :ref{doi=10.1038/s41576-019-0172-9}. Interestingly, a large fraction of defense systems in bacteria are encoded by MGEs :ref{doi=10.1038/s41467-022-30269-9,10.1371/journal.pbio.3001514}. While sometimes the fitness interests of MGEs and the bacterial host are aligned, these systems are likely to be selected because they benefit the MGE encoding it rather than the host cell who :ref{doi=10.1371/journal.pbio.3001514,10.1038/s41576-019-0172-9}. This benefit may include preventing other mobile elements from infecting the same cell and competing for essential resources. The presence of defense systems can, in turn, have an effect in gene flow who :ref{doi=10.1371/journal.pbio.3001514}.
navigation.icon: "md:history_edu"
navigation.icon: 'i-mdi:book-education-outline'
title: Defense Systems
navigation.icon: 'md:list'
\ No newline at end of file
navigation.icon: 'i-tabler:virus-off'
\ No newline at end of file
......@@ -10,11 +10,22 @@ tableColumns:
Activator: Unknown
Effector: Unknown
PFAM: PF18928
contributors:
- Rachel Lavenir
relevantAbstracts:
- doi: 10.1016/j.chom.2022.09.017
---
# Aditi
## Description
Aditi was discovered among other systems in 2022 :ref{doi=10.1016/j.chom.2022.09.017}.
Aditi is composed of two genes: DitA, DitB. Both are of unknown function, and have no homology to any known domain.
Aditi is named after the Hindu guardian goddess of all life.
## Molecular mechanisms
As far as we are aware, the molecular mechanism is unknown.
## Example of genomic structure
The Aditi is composed of 2 proteins: DitA and DitB.
......@@ -47,7 +58,6 @@ height: 700
dataUrls:
- /aditi/Aditi.Aditi__DitB.0.V.cif
- /aditi/Aditi.Aditi__DitA.0.V.cif
---
::
......@@ -79,3 +89,4 @@ end
style Title4 fill:none,stroke:none,stroke-width:none
</mermaid>
......@@ -11,26 +11,35 @@ tableColumns:
Effector: Diverse effectors (Nucleic acid degrading, putative Nucleotide modifying, putative Membrane disrupting)
PFAM: PF00753, PF13289, PF13365
contributors:
- Alex Linyi Gao
- Nathalie Bechon
relevantAbstracts:
- doi: 10.1126/science.aba0372
- doi: 10.1126/science.abm4096
contributors:
- Alex Linyi Gao
---
# Avs
## Description
Avs proteins are members of the STAND (signal transduction ATPase with numerous domains) superfamily of P-loop NTPases, which play essential roles in innate immunity and programmed cell death in eukaryotes (E. V. Koonin et al., Cell Death Differ. 9, 394–404 (2002). doi: 10.1038/sj.cdd.4400991; D. D. Leipe et al., J. Mol. Biol. 343, 1–28 (2004). doi: 10.1016/j.jmb.2004.08.023). STAND ATPases include nucleotide-binding oligomerization domain-like receptors (NLRs) in animal inflammasomes and plant resistosomes. They share a common tripartite domain architecture, typically consisting of a central ATPase, a C-terminal sensor with superstructure-forming repeats, and an N-terminal effector involved in inflammation or cell death.
Avs proteins are members of the STAND (signal transduction ATPase with numerous domains) superfamily of P-loop NTPases, which play essential roles in innate immunity and programmed cell death in eukaryotes :ref{doi=10.1038/sj.cdd.4400991,10.1016/j.jmb.2004.08.023}. STAND ATPases include nucleotide-binding oligomerization domain-like receptors (NLRs) in animal inflammasomes and plant resistosomes. Bacterial Avs share a common tripartite domain architecture with eukaryotic NLR, typically consisting of a central ATPase, a C-terminal sensor with superstructure-forming repeats, and an N-terminal effector involved in inflammation or cell death. They are very similar to other bacterial defense systems: [bNACHT](/defense-systems/nlr), [CARD_NLR](/defense-systems/card_nlr) , [Rst_TIR-NLR](/defense-systems/rst_tir-nlr).
## Molecular mechanism
::info
Two classifications of Avs systems were proposed. The first one :ref{doi=10.1126/science.aba0372} distinguishes 5 types of Avs based on their effector domain. This is the classification used in Defense Finder right now, and in the following wiki entry unless stated otherwise. Considering the modular aspect of the effector domain, a new classification based on the homology of the NTPase and C terminal sensor domain, and not on the effector domain, has been proposed more recently :ref{doi=10.1126/science.abm4096} and is the one used in this description of the mechanism. This second classification defines 4 different types, that do not represent the whole diversity of Avs proteins but only the 4 characterized types.
::
Similar to their eukaryotic counterparts, Avs proteins utilize their C-terminal sensor domains to bind to pathogen-associated molecular patterns (PAMPs). Specifically, Avs1, Avs2, and Avs3 bind to monomers of the large terminase subunit of tailed phages, which account for approximately 96% of all phages, whereas Avs4 binds to monomers of the portal protein. The helical sensor domains of Avs1-4 can recognize diverse variants of terminase or portal proteins, with less than 5% sequence identity in some cases. Binding is mediated by shape complementarity across an extended interface, indicating fold recognition. Additionally, Avs3 directly recognizes active site residues and the ATP ligand of the large terminase.
Upon binding to their cognate phage protein, Avs1-4 assemble into tetramers that activate their N-terminal effector domains, which are often non-specific dsDNA endonucleases. The effector domains are thought to induce abortive infection to disrupt the production of progeny phage.
Avs systems sometimes include additional essential small genes on top of the canonical Avs gene, but the way they contribute to defense is not currently described.
## Example of genomic structure
A total of 5 subsystems have been described for the Avs system.
The Avs system have been describe in a total of 5 subsystems (in the old classification).
Here is some examples found in the RefSeq database:
......@@ -64,8 +73,6 @@ The system was detected in 366 different species.
Proportion of genome encoding the Avs system for the 14 phyla with more than 50 genomes in the RefSeq database.
## Structure
### AVAST_I
##### Example 1
......
......@@ -10,18 +10,21 @@ tableColumns:
Activator: Direct
Effector: Nucleic acid degrading (pyrophosphorylates tRNAs)
PFAM: PF04607
contributors:
- Héloïse Georjon
- Florian Tesson
relevantAbstracts:
- doi: 10.1038/s41586-022-05444-z
- doi: 10.1038/s41586-022-05444-z
---
# CapRel
## Description
CapRel is a fused toxin–antitoxin system that is active against diverse phages when expressed in *Escherichia coli*. CapRel belongs to the family of toxSAS toxin–antitoxin systems. CapRel is an Abortive infection system which is found in Cyanobacteria, Actinobacteria, and Proteobacteria, Spirochetes, Bacteroidetes, and Firmicutes, as well as in some temperate phages.
CapRel is a fused toxin-antitoxin system that is active against diverse phages when expressed in *Escherichia coli* :ref{doi=10.1038/s41586-022-05444-z}. CapRel belongs to the family of toxSAS toxin-antitoxin systems. CapRel is an Abortive infection system which is found in Cyanobacteria, Actinobacteria, and Proteobacteria, Spirochetes, Bacteroidetes, and Firmicutes, as well as in some temperate phages.
## Molecular mechanism
The CapRel system of Salmonella temperate phage SJ46 is normally found in a closed conformation, which is thought to maintain CapRel in an auto-inhibited state. However during phage SECPhi27 infection, binding of the major phage capsid protein (Gp57) to CapRel releases it from is inhibited state, allowing pyrophosphorylation of tRNAs by the toxin domain and resulting in translation inhibition. Other phage capsid proteins can be recognized by CapRel, as observed during infection by phage Bas8.
The CapRel system of Salmonella temperate phage SJ46 is normally found in a closed conformation, which is thought to maintain CapRel in an auto-inhibited state. However during phage SECPhi27 infection, binding of the major phage capsid protein (Gp57) to CapRel releases it from is inhibited state, allowing pyrophosphorylation of tRNAs by the toxin domain and resulting in translation inhibition :ref{doi=10.1038/s41586-022-05444-z}. Other phage capsid proteins can be recognized by CapRel, as observed during infection by phage Bas8.
Different CapRel homologues confer defense against different phages, suggesting variable phage specificity of CapRel system which seems to be mediated by the C-terminal region of CapRel.
......@@ -105,4 +108,3 @@ end
style Title3 fill:none,stroke:none,stroke-width:none
style Title4 fill:none,stroke:none,stroke-width:none
</mermaid>