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
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified public/images/team/moustafa-amine-bezzahi/avatar-128.avif
Binary file not shown.
Binary file modified public/images/team/moustafa-amine-bezzahi/avatar-128.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified public/images/team/moustafa-amine-bezzahi/avatar-128.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified public/images/team/moustafa-amine-bezzahi/avatar-160.avif
Binary file not shown.
Binary file modified public/images/team/moustafa-amine-bezzahi/avatar-160.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified public/images/team/moustafa-amine-bezzahi/avatar-160.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified public/images/team/moustafa-amine-bezzahi/avatar-256.avif
Binary file not shown.
Binary file modified public/images/team/moustafa-amine-bezzahi/avatar-256.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified public/images/team/moustafa-amine-bezzahi/avatar-256.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified public/images/team/moustafa-amine-bezzahi/avatar-80.avif
Binary file not shown.
Binary file modified public/images/team/moustafa-amine-bezzahi/avatar-80.jpg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file modified public/images/team/moustafa-amine-bezzahi/avatar-80.webp
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
74 changes: 74 additions & 0 deletions src/components/FilterMenu/FilterMenu.jsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,74 @@
import { useEffect, useRef, useState } from "react";
import { SlidersHorizontal } from "lucide-react";
import { cn } from "../../lib/utils";

/**
* Round glass button that opens a checklist of filter options.
*/
export default function FilterMenu({ options, active, onToggle, label, className }) {
const [isOpen, setIsOpen] = useState(false);
const menuRef = useRef(null);

useEffect(() => {
const handleClick = (event) => {
if (!menuRef.current) return;
if (menuRef.current.contains(event.target)) return;
setIsOpen(false);
};

if (isOpen) {
document.addEventListener("mousedown", handleClick);
}

return () => document.removeEventListener("mousedown", handleClick);
}, [isOpen]);

return (
<>
{isOpen && (
<div className="fixed inset-0 z-20" onClick={() => setIsOpen(false)} aria-hidden="true" />
)}
<div ref={menuRef} className={cn("relative flex justify-end", className)}>
<button
type="button"
onClick={() => setIsOpen((prev) => !prev)}
className="h-12 w-12 rounded-full border border-white/10 bg-white/5 text-white shadow-[0_8px_32px_0_rgba(0,0,0,0.36)] backdrop-blur-xl flex items-center justify-center hover:text-primary transition-colors"
aria-label={label}
aria-expanded={isOpen}
>
<SlidersHorizontal className="h-5 w-5" />
</button>
<div
className={cn(
"absolute right-0 top-full mt-2 min-w-[220px] rounded-2xl border border-white/10 bg-white/5 backdrop-blur-xl shadow-[0_8px_32px_0_rgba(0,0,0,0.36)] transition-all duration-200 z-30",
isOpen
? "opacity-100 translate-y-0 pointer-events-auto"
: "opacity-0 translate-y-2 pointer-events-none"
)}
>
<div className="flex flex-col gap-2 px-4 py-4">
{options.map((option) => {
const isActive = active.includes(option);
return (
<button
key={option}
type="button"
onClick={() => onToggle(option)}
aria-pressed={isActive}
className={cn(
"text-left text-xs uppercase tracking-widest transition-colors cursor-pointer hover:text-primary",
isActive
? "text-white scale-[1.01] animate-scale-bounce"
: "text-muted-foreground scale-95 animate-scale-down-bounce"
)}
>
{option}
</button>
);
})}
</div>
</div>
</div>
</>
);
}
56 changes: 56 additions & 0 deletions src/components/RevealList/RevealList.css
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
/*
* "See more" reveal animation
*/

.reveal-list-extra {
display: grid;
grid-template-rows: 0fr;
overflow: hidden;
opacity: 0;
transform: translateY(-8px);
visibility: hidden;
transition:
grid-template-rows 420ms cubic-bezier(0.16, 1, 0.3, 1),
opacity 220ms ease,
transform 420ms cubic-bezier(0.16, 1, 0.3, 1),
visibility 0s linear 420ms;
}

/*
* A grid item in a 0fr track keeps an automatic minimum size unless its own
* overflow is clipped.
*/
.reveal-list-extra > div {
min-height: 0;
overflow: hidden;
}

.reveal-list.is-open .reveal-list-extra {
grid-template-rows: 1fr;
opacity: 1;
transform: translateY(0);
visibility: visible;
transition-delay: var(--reveal-list-delay, 0ms);
}

.reveal-list-toggle:hover {
text-decoration: underline;
text-decoration-thickness: 2px;
text-underline-offset: 4px;
}

.reveal-list-toggle:focus-visible {
border-radius: 2px;
outline: 2px solid currentcolor;
outline-offset: 3px;
}

@media (prefers-reduced-motion: reduce) {
.reveal-list-extra {
transition-duration: 0.01ms;
}

.reveal-list.is-open .reveal-list-extra {
transition-delay: 0ms;
}
}
69 changes: 69 additions & 0 deletions src/components/RevealList/RevealList.jsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
import { Children, cloneElement, isValidElement, useId, useState } from "react";
import { cn } from "../../lib/utils";
import "./RevealList.css";

const STAGGER_MS = 45;

/**
* Shows the first `visibleCount` children and hides the rest behind a
* "See more" toggle, revealing them with a staggered slide-down.
*/
export default function RevealList({
children,
visibleCount = 3,
moreLabel = "See more",
lessLabel = "See less",
className,
toggleClassName,
}) {
const [isOpen, setIsOpen] = useState(false);
const listId = useId();

const items = Children.toArray(children);
const hiddenCount = Math.max(0, items.length - visibleCount);

return (
<>
<ul id={listId} className={cn("reveal-list", isOpen && "is-open", className)}>
{items.map((child, index) => {
const isExtra = index >= visibleCount;
const isHidden = isExtra && !isOpen;

return (
<li
key={child.key ?? index}
className={isExtra ? "reveal-list-extra" : undefined}
aria-hidden={isExtra ? !isOpen : undefined}
style={
isExtra
? { "--reveal-list-delay": `${(index - visibleCount) * STAGGER_MS}ms` }
: undefined
}
>
{/* Plain wrapper so the collapsing track has something with no
padding. */}
<div>
{isHidden && isValidElement(child) ? cloneElement(child, { tabIndex: -1 }) : child}
</div>
</li>
);
})}
</ul>

{hiddenCount > 0 && (
<button
type="button"
className={cn(
"reveal-list-toggle mt-6 text-xs uppercase tracking-widest text-muted-foreground transition-colors hover:text-primary",
toggleClassName
)}
aria-expanded={isOpen}
aria-controls={listId}
onClick={() => setIsOpen((current) => !current)}
>
{isOpen ? lessLabel : `${moreLabel} (+${hiddenCount})`}
</button>
)}
</>
);
}
15 changes: 15 additions & 0 deletions src/content/community/news/2026-03-31-post-med3pa-article.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
![MED3pa article featured image](/images/albums/2026-03-31-post-med3pa-article/featured.png)

Congratulations to [Olivier Lefebvre](/team/olivier-lefebvre) and
[Martin Vallières](/team/martin-vallieres) for the publication of their paper entitled
"Predictive performance precision analysis in medicine: identification of low-confidence predictions
at patient and profile levels (MED3pa I)" in the
_Journal of the American Medical Informatics Association (JAMIA)_.

The article can be found at:
[https://doi.org/10.1093/jamia/ocag034](https://doi.org/10.1093/jamia/ocag034)

## Links

- [Details](/publications/predictive-performance-precision-analysis-in-medicine-identification-of-low-confidence-predictions-at-patient-and-profile-levels-med3pa-i-2026)
- [Article link](https://doi.org/10.1093/jamia/ocag034)
2 changes: 1 addition & 1 deletion src/content/community/research/project-active/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ banner:
### General

- [Development of the _MEDomics_ platform](/research/medomics-platform)
- [Development of the _MEDimage_ package](/research/medimage)
- [Development of the _MEDiml_ package](/research/mediml)

### Doctorate

Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
---
title: "Project: Development of the MEDimage package"
title: "Project: Development of the MEDiml package"

type: book

Expand All @@ -11,7 +11,7 @@ authors:
- Mohammed Benabbassi
---

![Schematic diagram of the MEDimage package](/images/albums/research-medimage/medimage-overview.png "Schematic diagram of the MEDimage package")
![Schematic diagram of the MEDiml package](/images/albums/research-mediml/mediml-overview.png "Schematic diagram of the MEDiml package")

## Status

Expand All @@ -33,10 +33,10 @@ General

## Description

[MEDimage](https://github.com/MahdiAll99/MEDimage) is an _open-source_ software for medical image processing and radiomic calculations. It was created by our laboratory in collaboration with the international consortium of medical scientists (<https://medomics.ai>). The software is based on the Python programming language and built with different layers of flexibility via modules, classes and parameters option that allow to load, process, medical images and calculate radiomic features from them. The intrinsic workflow of MEDimage is designed to be adequate to these tasks and offers a [documentation](https://www.mediml.app) rich in tutorials, demonstrations and instructions that are able to introduce novice users to the software. With this software, we aim to provide an open-source platform tested, maintained and standardized with the international norms defined by the [IBSI](https://theibsi.github.io/) for easy and reproducible image processing and radiomics extraction.
[MEDiml](https://github.com/MEDomicsLab/MEDiml) is an _open-source_ software for medical image processing and radiomic calculations. It was created by our laboratory in collaboration with the international consortium of medical scientists (<https://medomics.ai>). The software is based on the Python programming language and built with different layers of flexibility via modules, classes and parameters option that allow to load, process, medical images and calculate radiomic features from them. The intrinsic workflow of MEDiml is designed to be adequate to these tasks and offers a [documentation](https://www.mediml.app) rich in tutorials, demonstrations and instructions that are able to introduce novice users to the software. With this software, we aim to provide an open-source platform tested, maintained and standardized with the international norms defined by the [IBSI](https://theibsi.github.io/) for easy and reproducible image processing and radiomics extraction.

Here is a video made by our intern [Corentin Gauthier](/team/corentin-gauthier)
which presents what he realized during his internship as well as the MEDimage project.
which presents what he realized during his internship as well as the MEDiml project.

<p align="center">
<iframe width="560" height="315" src="https://www.youtube.com/embed/ODJ3TD5H11Q" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@ General
[//]: # 'the following data analysis techniques should increase the impact of the "multi-omics" prediction models that are '
[//]: # "built from these databases:"
[//]: #
[//]: # "1. _Image analysis_: extraction of radiomic features allows us to better characterize tumor heterogeneity. The [MEDimage](/research/medimage) package is the dedicated component for this task."
[//]: # "1. _Image analysis_: extraction of radiomic features allows us to better characterize tumor heterogeneity. The [MEDiml](/research/mediml) package is the dedicated component for this task."
[//]: # "2. _Machine learning_: some learning techniques allow us to better combine data from different categories (such as multi-omics)."
[//]: # "3. _Deep learning_: the multitude of deep neural network architectures offers several possibilities for the automatic learning of different tasks in medicine. The performance of some networks is sometimes superior to that of humans."
[//]: # "4. _Automatic text processing_: automatic processing and coding of textual reports from electronic patient records would allow for better integration of information relevant to multi-omics modeling throughout the patient management period."
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ increasing complexity in the precision oncology spectrum.

## Issue and objective

Recent advances in "omics" technology have created opportunities to characterize biological processes correlated with tumor phenotypes. We anticipate that integrative modeling of available oncology data will provide the ability to make accurate tumor phenotype predictions, which in turn would allow for better monitoring and tailoring of patient-specific treatments (i.e. "precision oncology"). To potentially improve radiomic analysis (i.e.: Quantitative extraction of useful data from all types of medical images), radiomic features of the tumor region can be extracted from medical images filtered with different types of filters (e.g.: texture filtering or texture smoothing). These features can be extracted using the [MEDimage](/research/medimage) package, but they expose different levels of complexity, which leads us to investigate in this project, the spectrum of complexity of medical images for the resolving of several problems in precision oncology and study the changes in these different levels of complexity from an image modality to another.
Recent advances in "omics" technology have created opportunities to characterize biological processes correlated with tumor phenotypes. We anticipate that integrative modeling of available oncology data will provide the ability to make accurate tumor phenotype predictions, which in turn would allow for better monitoring and tailoring of patient-specific treatments (i.e. "precision oncology"). To potentially improve radiomic analysis (i.e.: Quantitative extraction of useful data from all types of medical images), radiomic features of the tumor region can be extracted from medical images filtered with different types of filters (e.g.: texture filtering or texture smoothing). These features can be extracted using the [MEDiml](/research/mediml) package, but they expose different levels of complexity, which leads us to investigate in this project, the spectrum of complexity of medical images for the resolving of several problems in precision oncology and study the changes in these different levels of complexity from an image modality to another.

## Database

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
![First Publication Award certificate](/images/albums/2026-first-med3pa-presentation/certificat.png)

## Date

2026-04-29

## Authors

- [Olivier Lefebvre](/team/olivier-lefebvre)

## Summary

Olivier Lefebvre received the First Publication Award from the Faculty of Science, which highlights publications that distinguished themselves both within their field and among all entries submitted for the competition. The award was presented during the Kaféfak conference, where he was invited to give a three-minute presentation to make his research accessible to a broad audience. A $200 prize accompanies the award.

## Abstract

**Objectives**

Artificial Intelligence models are increasingly used in health care, yet global performance metrics can mask variations in reliability across individual patients or subgroups with shared attributes, called patient profiles. This study introduces predictive performance precision analysis in medicine (MED3pa), a method that identifies when models are less reliable, allowing clinicians to better assess model limitations.

**Materials and Methods**

We propose a framework that estimates predictive confidence using 3 combined approaches: individualized (IPC), aggregated (APC), and mixed predictive confidence (MPC). Individualized predictive confidence estimates confidence for each patient, APC assesses it across profiles, and MPC combines both. We evaluate our method on 4 datasets: 1 simulated, 2 public, and 1 private clinical dataset. Metrics by declaration rate curves show how performance changes when retaining only the most confident predictions, while interpretable decision trees reveal profiles with higher or lower model confidence.

**Results**

We demonstrate our method in internal, temporal, and external validation settings, as well as through a clinical example. In internal validation, limiting predictions to the 93% most confident cases improved sensitivity by 14.3% and the area under the receiver operating characteristic curve by 5.1%. In the clinical example, MED3pa identified a patient profile with high misclassification risk, demonstrating its potential for safer deployment.

**Discussion**

By identifying low-confidence predictions, our framework improves model reliability in clinical settings. It can be integrated into decision support systems to help clinicians make more informed decisions. Confidence thresholds help balance model performance with the proportion of patients for whom predictions are considered reliable.

**Conclusion**

Better leveraging confidence in model predictions could improve reliability and trustworthiness, supporting safer and more effective use in health care.

## Poster

<iframe src="/publications/2026-first-med3pa-presentation/Lefebvre_olivier_kafefak_2026.pdf" width="100%" height="600px" style="border: none; background: transparent;"></iframe>

## Links

- [Awarded paper in JAMIA](https://doi.org/10.1093/jamia/ocag034)
Loading
Loading