Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
Binary file added assets/images/tijl.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
163 changes: 113 additions & 50 deletions publications/index.qmd
Original file line number Diff line number Diff line change
Expand Up @@ -33,11 +33,13 @@ if not (project_root / "data" / "publications.json").exists():
pub_file = project_root / "data" / "publications.json"

if not pub_file.exists():
display(HTML(
'<div class="callout callout-warning"><p>No publications data found. '
'Run <code>python publications/fetch_publications.py</code> to populate '
'<code>data/publications.json</code>, then re-render this page.</p></div>'
))
display(
HTML(
'<div class="callout callout-warning"><p>No publications data found. '
"Run <code>python publications/fetch_publications.py</code> to populate "
"<code>data/publications.json</code>, then re-render this page.</p></div>"
)
)
else:
publications = json.loads(pub_file.read_text(encoding="utf-8"))

Expand All @@ -58,13 +60,31 @@ else:
# Current CompOmics members (keep in sync with team/index.qmd). Used both for
# author highlighting and for the "by person" filter dropdown.
MEMBERS = [
"Lennart Martens", "Sakina Bombaywala", "Robbin Bouwmeester", "Tine Claeys",
"Arthur Declercq", "Ralf Gabriels", "Alexander Kensert", "Enrico Massignani",
"Pathmanaban Ramasamy", "Tim Van Den Bossche", "Pieter Verschaffelt",
"Toon Callens", "Robbe Devreese", "Sander Heyndrickx", "Sude Güneş",
"Caroline Jachmann", "Xuxa Malliet", "Alireza Nameni", "Harikrishnan Ramadasan",
"Sam Van Puyenbroeck", "Lyudmila Kovalchuke", "Patricia Lefèvre",
"Natalia Tichshenko", "Kevin Velghe", "Daria Fijalkowska", "Jasper Zuallaert",
"Lennart Martens",
"Robbin Bouwmeester",
"Tine Claeys",
"Arthur Declercq",
"Ralf Gabriels",
"Alexander Kensert",
"Enrico Massignani",
"Pathmanaban Ramasamy",
"Tim Van Den Bossche",
"Toon Callens",
"Robbe Devreese",
"Sander Heyndrickx",
"Sude Güneş",
"Caroline Jachmann",
"Xuxa Malliet",
"Alireza Nameni",
"Harikrishnan Ramadasan",
"Sam Van Puyenbroeck",
"Tijl Verween",
"Lyudmila Kovalchuke",
"Patricia Lefèvre",
"Natalia Tichshenko",
"Kevin Velghe",
"Daria Fijalkowska",
"Jasper Zuallaert",
]

# names for bold highlighting = team qmd titles (if any) ∪ the member list above
Expand Down Expand Up @@ -125,18 +145,25 @@ else:

# Preprint detection — by DOI prefix or journal/server name.
PREPRINT_DOI_PREFIXES = (
"10.1101", # bioRxiv / medRxiv (Cold Spring Harbor)
"10.26434", # ChemRxiv
"10.21203", # Research Square
"10.20944", # Preprints.org
"10.31219", # OSF Preprints
"10.31234", # PsyArXiv
"10.48550", # arXiv
"10.64898", # bioRxiv (newer prefix)
"10.1101", # bioRxiv / medRxiv (Cold Spring Harbor)
"10.26434", # ChemRxiv
"10.21203", # Research Square
"10.20944", # Preprints.org
"10.31219", # OSF Preprints
"10.31234", # PsyArXiv
"10.48550", # arXiv
"10.64898", # bioRxiv (newer prefix)
)
PREPRINT_JOURNAL_HINTS = (
"biorxiv", "medrxiv", "chemrxiv", "arxiv", "research square",
"preprints.org", "ssrn", "osf", "preprint",
"biorxiv",
"medrxiv",
"chemrxiv",
"arxiv",
"research square",
"preprints.org",
"ssrn",
"osf",
"preprint",
)

def is_preprint(doi, journal):
Expand All @@ -151,7 +178,9 @@ else:
parts = [authors_txt] if authors_txt else []
parts.append(f"({year})." if year else "")
parts.append(f"{title}.")
venue = journal + ((" " + location) if location else "") if journal else location
venue = (
journal + ((" " + location) if location else "") if journal else location
)
if venue:
parts.append(f"{venue}.")
if doi:
Expand All @@ -177,45 +206,63 @@ else:
'spellcheck="false" aria-label="Search publications">'
'<button type="button" class="pub-search-clear" id="pub-search-clear" '
'aria-label="Clear search" hidden>&times;</button>'
'</div>'
"</div>"
)
# person dropdown (current members, alphabetical by surname)
lines.append('<div class="pub-person">')
lines.append('<i class="bi bi-person pub-person-icon" aria-hidden="true"></i>')
lines.append('<select id="pub-person-select" class="pub-person-select" aria-label="Filter by person">')
lines.append(
'<select id="pub-person-select" class="pub-person-select" aria-label="Filter by person">'
)
lines.append('<option value="">All people</option>')
for name in sorted(MEMBERS, key=lambda n: n.split()[-1].lower()):
val = html.escape(name.lower(), quote=True)
lines.append(f'<option value="{val}">{html.escape(name)}</option>')
lines.append('</select>')
lines.append('</div>')
lines.append("</select>")
lines.append("</div>")

# type chips — peer-reviewed vs preprint
lines.append('<div class="pub-chips pub-type-chips" id="pub-type-chips" role="group" aria-label="Filter by type">')
lines.append('<button type="button" class="pub-chip is-active" data-type="all">All</button>')
lines.append('<button type="button" class="pub-chip" data-type="published">Peer-reviewed</button>')
lines.append('<button type="button" class="pub-chip" data-type="preprint">Preprint</button>')
lines.append('</div>')
lines.append(
'<div class="pub-chips pub-type-chips" id="pub-type-chips" role="group" aria-label="Filter by type">'
)
lines.append(
'<button type="button" class="pub-chip is-active" data-type="all">All</button>'
)
lines.append(
'<button type="button" class="pub-chip" data-type="published">Peer-reviewed</button>'
)
lines.append(
'<button type="button" class="pub-chip" data-type="preprint">Preprint</button>'
)
lines.append("</div>")

# year chips — individual chips for >= 2016, everything older folded into "< 2016"
YEAR_CAP = 2016
lines.append('<div class="pub-chips" id="pub-year-chips" role="group" aria-label="Filter by year">')
lines.append('<button type="button" class="pub-chip is-active" data-year="all">All</button>')
lines.append(
'<div class="pub-chips" id="pub-year-chips" role="group" aria-label="Filter by year">'
)
lines.append(
'<button type="button" class="pub-chip is-active" data-year="all">All</button>'
)
has_pre_cap = False
for year in years_sorted:
if isinstance(year, int) and year >= YEAR_CAP:
lines.append(f'<button type="button" class="pub-chip" data-year="{year}">{year}</button>')
lines.append(
f'<button type="button" class="pub-chip" data-year="{year}">{year}</button>'
)
else:
has_pre_cap = True
if has_pre_cap:
lines.append(f'<button type="button" class="pub-chip" data-year="pre{YEAR_CAP}">&lt; {YEAR_CAP}</button>')
lines.append('</div>')
lines.append('</div>')
lines.append(
f'<button type="button" class="pub-chip" data-year="pre{YEAR_CAP}">&lt; {YEAR_CAP}</button>'
)
lines.append("</div>")
lines.append("</div>")

lines.append('<div class="pub-countbar">')
lines.append('<div class="pub-count" id="pub-count" aria-live="polite"></div>')
lines.append('<div class="pub-active" id="pub-active" hidden></div>')
lines.append('</div>')
lines.append("</div>")

# ── Publication list, grouped by year ────────────────────────────────────
lines.append('<div class="pub-list-wrap" id="pub-list">')
Expand All @@ -240,30 +287,46 @@ else:
title_safe = html.escape(title)
title_html = (
f'<a href="https://doi.org/{html.escape(doi)}" target="_blank" rel="noopener noreferrer">{title_safe}</a>'
if doi else title_safe
if doi
else title_safe
)

preprint = is_preprint(doi, journal)

# venue pill: journal + location (volume(issue):pages)
venue_txt = journal + ((", " + location) if (journal and location) else (location or "")) if (journal or location) else ""
venue_txt = (
journal
+ ((", " + location) if (journal and location) else (location or ""))
if (journal or location)
else ""
)
venue_html = (
f'<span class="pub-venue">{html.escape(venue_txt)}</span>' if venue_txt else ""
f'<span class="pub-venue">{html.escape(venue_txt)}</span>'
if venue_txt
else ""
)
badge_html = (
'<span class="pub-badge pub-badge-preprint">Preprint</span>' if preprint else ""
'<span class="pub-badge pub-badge-preprint">Preprint</span>'
if preprint
else ""
)

# searchable haystack (plain text, attribute-escaped)
haystack = " ".join([title, " ".join(authors_list), journal, ylabel]).lower()
haystack = " ".join(
[title, " ".join(authors_list), journal, ylabel]
).lower()
haystack = html.escape(haystack, quote=True)

# pipe-delimited member names for the person filter (with edge pipes)
hits = matched_members(authors_list)
members_attr = ("|" + "|".join(m.lower() for m in hits) + "|") if hits else ""
members_attr = (
("|" + "|".join(m.lower() for m in hits) + "|") if hits else ""
)
members_attr = html.escape(members_attr, quote=True)

citation = build_citation(authors_list, ylabel if year else "", title, journal, location, doi)
citation = build_citation(
authors_list, ylabel if year else "", title, journal, location, doi
)
cite_attr = html.escape(citation, quote=True)
type_attr = "preprint" if preprint else "published"

Expand All @@ -280,9 +343,9 @@ else:
f'<span class="pub-title">{title_html}</span>'
f'<span class="pub-authors">{authors_str}</span>'
f'<div class="pub-tags">{badge_html}{venue_html}</div>'
f'</div>'
f'{cite_btn}'
f'</li>'
f"</div>"
f"{cite_btn}"
f"</li>"
)
lines.append("</ol>")
lines.append("</section>")
Expand All @@ -291,7 +354,7 @@ else:
lines.append(
'<div class="pub-empty" id="pub-empty" hidden>'
'<i class="bi bi-search"></i><p>No publications match your search.</p>'
'</div>'
"</div>"
)

display(HTML("\n".join(lines)))
Expand Down
30 changes: 15 additions & 15 deletions team/index.qmd
Original file line number Diff line number Diff line change
Expand Up @@ -45,13 +45,6 @@ toc: false
</div>

<h3 class="team-section-title">Postdoctoral Researchers</h3>
<div class="team-grid team-grid-selectors">
<div class="team-card-wrap">
<button type="button" class="team-card" data-member="sakina">
<img src="../assets/images/sakina.jpg" class="team-photo" alt="Sakina Bombaywala">
<div class="team-name">Sakina Bombaywala</div>
</button>
</div>
<div class="team-card-wrap">
<button type="button" class="team-card" data-member="robbin">
<img src="../assets/images/robbin.jpg" class="team-photo" alt="Robbin Bouwmeester">
Expand Down Expand Up @@ -100,12 +93,6 @@ toc: false
<div class="team-name">Tim Van Den Bossche</div>
</button>
</div>
<div class="team-card-wrap">
<button type="button" class="team-card" data-member="pieter">
<img src="../assets/images/pieter.jpg" class="team-photo" alt="Pieter Verschaffelt">
<div class="team-name">Pieter Verschaffelt</div>
</button>
</div>
</div>

<h3 class="team-section-title">Predoctoral Researchers</h3>
Expand Down Expand Up @@ -164,6 +151,12 @@ toc: false
<div class="team-name">Sam van Puyenbroeck</div>
</button>
</div>
<div class="team-card-wrap">
<button type="button" class="team-card" data-member="tijl">
<img src="../assets/images/tijl.jpg" class="team-photo" alt="Tijl Verween">
<div class="team-name">Tijl Verween</div>
</button>
</div>
</div>

<h3 class="team-section-title">Support Staff</h3>
Expand Down Expand Up @@ -376,15 +369,15 @@ toc: false
email: 'toon.callens@ugent.be',
about: 'Toon obtained his Master\'s degree in Biomedical Sciences, with a major in Systems Biology, in 2019. His interest in the informatics courses within his programme led him to apply to Prof. Lennart Martens to pursue a PhD in the CompOmics group. Outside research, Toon has a passion for soccer and even used to be a semi-professional soccer player until injuries prevented him from continuing. To still enjoy his passion for the sport, he now plays walking football.',
currentWork: 'He is a predoctoral researcher shared between CompOmics and the Ghent University De Preter group. During his PhD, he has worked on a large citizen science project integrated into a mobile game, and on multi-omics tissue prediction. Next to that, he also serves as a teaching assistant for bioinformatics in the Biomedical Sciences programme.',
recognition: 'In 2024 Toon won the EuBIC best flash talk prize in Winterberg.'
recognition: 'In 2024 Toon won the EuBIC-MS best flash talk prize in Winterberg.'
},
robbe: {
title: 'Robbe Devreese',
role: 'Predoctoral Researcher',
email: 'robbe.devreese@ugent.be',
about: 'Robbe obtained his Master\'s degree in Biomedical Sciences, with a major in Systems Biology, in 2023. He carried out his Master\'s thesis in CompOmics, where he investigated the oxidation landscape using open modification searches and, having discovered his love for data science (and his dislike for the wet lab), accepted an invitation from Dr. Robbin Bouwmeester and Prof. Lennart Martens to perform a PhD in the group. Outside of work, Robbe enjoys going to concerts and the theatre, and watching football.',
currentWork: 'His PhD work focuses on benchmarking, MS imaging, and improving bioinformatics workflows for ion mobility-enabled mass spectrometry. He is the main developer of IM2Deep, and has contributed to MS²Rescore and ProteoBench.',
recognition: 'Robbe was a finalist for the Three-Minute-Thesis competition at HUPO 2024 and has been awarded an EMBO Scientific Exchange Grant.',
recognition: 'Robbe was a finalist for the Three-Minute-Thesis competition at HUPO 2024 and has been awarded an EMBO Scientific Exchange Grant.',
publications: [
{ title: 'Collisional Cross-Section Prediction for Multiconformational Peptide Ions with IM2Deep', url: 'https://doi.org/10.1021/acs.analchem.5c01142', venue: 'Analytical Chemistry · 2025' },
{ title: 'TIMS²Rescore: A DDA-PASEF-Optimized Data-Driven Rescoring Pipeline Based on MS²Rescore', url: 'https://doi.org/10.1021/acs.jproteome.4c00609', venue: 'Journal of Proteome Research · 2025' },
Expand Down Expand Up @@ -524,6 +517,13 @@ toc: false
{ title:'Massively parallel interrogation of protein fragment secretability using SECRiFY reveals features influencing secretory system transit', url: 'https://doi.org/10.1038/s41467-021-26720-y', venue: 'Nature Communications · 2021' },
{ title:'SpliceRover: interpretable convolutional neural networks for improved splice site prediction', url: 'https://doi.org/10.1093/bioinformatics/bty497', venue: 'Bioinformatics · 2018' },
]
},
tijl: {
title: 'Tijl Verween',
role: 'Predoctoral Researcher',
email: 'tijl.verween@ugent.be',
about: 'Tijl obtained his Master\'s degree in Biochemistry and Biotechnology, with a major in Bioinformatics and Systems Biology, from Ghent University in 2026. He carried out his Master\'s thesis in the CompOmics group and continued in the same group as a PhD student. Outside research, he enjoys learning to play different musical instruments.',
currentWork: 'Tijl\'s PhD research focuses on immunopeptidomics. He studies how data-independent acquisition (DIA) can be applied in this field and improves the computational workflows involved, from acquisition method optimization to data analysis.'
}
};

Expand Down
2 changes: 2 additions & 0 deletions team/network.qmd
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,7 @@ toc: false
<h3 class="team-section-title">Alumni &amp; Former Colleagues</h3>
<div class="network-chips">
<span class="network-chip"><span class="network-chip-name">Dr. Andrea Argentini</span></span>
<span class="network-chip"><span class="network-chip-name">Dr. Sakina Bombaywala</span></span>
<span class="network-chip"><span class="network-chip-name">Dr. Niklaas Colaert</span></span>
<span class="network-chip"><span class="network-chip-name">Dr. Sven Degroeve</span></span>
<span class="network-chip"><span class="network-chip-name">Dr. Nina Demeulemeester</span></span>
Expand All @@ -109,6 +110,7 @@ toc: false
<span class="network-chip"><span class="network-chip-name">Dr. Elien Vandermarliere</span></span>
<span class="network-chip"><span class="network-chip-name">Dr. Kenneth Verheggen</span></span>
<span class="network-chip"><span class="network-chip-name">Dr. Tessa Vermeire</span></span>
<span class="network-chip"><span class="network-chip-name">Dr. Pieter Verschaffelt</span></span>
<span class="network-chip"><span class="network-chip-name">Dr. Pieter-Jan Volders</span></span>
<span class="network-chip"><span class="network-chip-name">Dr. Şule Yılmaz</span></span>
<span class="network-chip"><span class="network-chip-name">Genet Abay Shiferaw</span></span>
Expand Down
Loading