Coach DrépanoCoach DrépanoSang et hémolyse
Transparence des algorithmes

Sang et hémolyse

L'hémoglobine par photo, le jaune de l'œil, l'hémolyse, les transfusions et le fer.

Chaque algorithme est décrit avec ce qu’il lit, ses étapes, les valeurs qu’il utilise (avec leur emplacement dans le code), ce qu’il affiche et ses limites.

Saisie et conversion des analyses de laboratoireÉvaluation de l'hémolyse : six marqueurs face à ta ligne de baseHemoSnap : hémoglobine estimée par photo du doigtJaune de la sclère : indice et bilirubine estiméeLecture d'un PDF de laboratoireRéponse de l'hémoglobine aux transfusionsSuivi du fer : ferritine, IRM et fraction d'éjectionSymptômes après une transfusion : niveau d'alerteHistorique des transfusions, intervalle et programme

← Tous les algorithmes

Saisie et conversion des analyses de laboratoire

Quand tu écris une valeur de laboratoire, ou quand Trévor en lit une dans un document, il la ramène à l'unité de son catalogue, vérifie qu'elle est plausible et qu'elle n'est pas déjà au dossier. Ces règles servent à l'hémolyse, au fer, à l'hémoglobine fœtale et à la créatinine. L'unité d'origine est gardée à côté de la valeur convertie.

Où tu le vois : Messages de confirmation (« Noté : LDH 320 U/L le 07.10.2026 »), refus avec raison, et affichage de chaque analyse dans l'unité que tu as choisie dans les réglages, avec l'unité d'origine entre parenthèses.

Ce que l’algorithme lit

Le calcul, étape par étape

1. Choisir l'unité à lireSi l'unité est écrite (avec le nombre ou à part), c'est elle quicompte.Sinon, un nombre seul est lu dans l'unité que tu as choisie dansles réglages (sinon dans celle du catalogue).2. Lire le nombreOn prend le premier nombre du texte (virgule ou point décimal).Pas de nombre : refus avec un exemple.Haptoglobine « indosable », « indétectable » ou « < 0,1 » : valeur0.L'unité est-elle reconnue ?ouinonLa valeur est multipliée parle facteur de l'unité (tableLABS de units.py).Refus : « unité non reconnue,j'attends X ». Un pourcentageest refusé pour lesréticulocytes (il faut lenombre absolu).3. Cas de l'hémoglobineSans unité et au-dessus de 25 : lue en g/L, divisée par 10 (112devient 11,2 g/dL).La valeur est-elle dans lesbornes ?ouinonElle est arrondie à 3décimales.Refus : « paraît hors deslimites possibles, vérifie lenombre et l'unité ».4. Date et doublonLa date doit être passée et de moins de 5 ans (10 ans pour lefer).Si le même type, le même jour et la même valeur existent déjà(écart sous un millionième), rien n'est ajouté et le message dit «Déjà dans ton dossier ».5. EnregistrerLa valeur est écrite au dossier dans l'unité du catalogue, avecl'unité d'origine à côté quand elle diffère.À l'affichage, la valeur est convertie dans l'unité préférée(nombre de décimales par unité).
Logigramme : Saisie et conversion des analyses de laboratoire

Les valeurs utilisées

Nom dans le codeValeurRôleOù
Hémoglobine3 à 20 g/dL ; g/L × 0,1Bornes et facteur.src/trevor/units.py:83-84
Bilirubine totale1 à 600 µmol/L ; mg/dL × 17,1Bornes (1 à 600) et facteur.src/trevor/units.py:85-86
Bilirubine indirecte0,5 à 600 µmol/L ; mg/dL × 17,1Bornes et facteur.src/trevor/units.py:87-88
Créatinine10 à 1500 µmol/L ; mg/dL × 88,4Bornes et facteur.src/trevor/units.py:89-90; src/trevor/royal/labs.py:22
Ferritine1 à 60000 µg/L ; ng/mL × 1 ; mg/L × 1000Bornes et facteurs.src/trevor/units.py:91-92
Haptoglobine0 à 8 g/L ; mg/dL × 0,01 ; mg/L × 0,001Bornes et facteurs.src/trevor/units.py:93-94
LDH30 à 6000 U/L ; UI/L × 1Bornes.src/trevor/units.py:95-96
Réticulocytes0,5 à 1500 ×10⁹/L ; /µL × 0,001 ; G/L × 1Bornes et facteurs.src/trevor/units.py:97-99
Hémoglobine S, hémoglobine fœtale0 à 100 %Bornes en pourcentage.src/trevor/units.py:100-101; src/trevor/royal/labs.py:21
MAX_BACK_DAYS5 ans (hémolyse, HbF, créatinine) ; 10 ans (fer)Ancienneté maximale d'une date saisie.src/trevor/hemolysis.py:262; src/trevor/royal/labs.py:19; src/trevor/iron.py:35
Hémoglobine sans unitéau-dessus de 25 : divisée par 10Heuristique g/L sans unité.src/trevor/hemolysis.py:289

Ce qui est affiché

Pour chaque saisie : soit la valeur enregistrée dans l'unité du catalogue avec une phrase de confirmation, soit un refus qui dit pourquoi en une phrase (pas de nombre, unité non reconnue, pourcentage refusé, hors bornes, date future ou trop ancienne, dossier non ouvert), soit « Déjà dans ton dossier ». Pas de niveau ni de seuil clinique ici.

Un exemple chiffré

« 2,5 mg/dL » de bilirubine totale devient 2,5 × 17,1 = 42,75 µmol/L. « 112 » d'hémoglobine sans unité devient 11,2 g/dL. « 2 % » de réticulocytes est refusé. « indosable » d'haptoglobine devient 0 g/L. « 95 g/L » d'hémoglobine devient 9,5 g/dL (résultats obtenus en exécutant normalize_lab).

Ce que cet algorithme ne sait pas faire

Validation. Les facteurs de conversion (bilirubine 17,1 ; créatinine 88,4 ; haptoglobine 100 mg/dL pour 1 g/L ; ferritine 1 pour 1) sont des conventions de laboratoire usuelles, signalées dans units.py comme des arrondis d'usage clinique. Les bornes de plausibilité sont des choix de l'auteur pour attraper les fautes de frappe, sans source citée. L'heuristique g/L de l'hémoglobine est une règle pratique.

Code : src/trevor/hemolysis.py (LAB_ENTRY, normalize_lab, add_lab, items_from_parsed), src/trevor/iron.py (normalize, add), src/trevor/royal/labs.py (LAB_EXTRA, normalize, add_lab), src/trevor/units.py (LABS, lab_factors, entry_unit, original_reading, lab_to_unit, lab, lab_pair)

Évaluation de l'hémolyse : six marqueurs face à ta ligne de base

Trévor compare ta dernière valeur de chaque marqueur (bilirubine totale et indirecte, LDH, réticulocytes, haptoglobine, hémoglobine) à la médiane de tes valeurs précédentes. Il compte combien de marqueurs récents s'écartent dans le sens de l'hémolyse et en tire un niveau : stable, à surveiller ou évoque une poussée. Il décrit tes données et ne pose aucun diagnostic.

Où tu le vois : Écran Hémolyse du bot, page web du dossier et application : une phrase de niveau, la liste des marqueurs signalés (« • LDH : 410 U/L (ta base : 300) »), ce qui manque pour conclure et un rappel que ce ne sont pas des diagnostics.

Ce que l’algorithme lit

Le calcul, étape par étape

1. Rassembler les sériesUne série par marqueur, triée par date, sans doublon exact (mêmejour, même valeur).Une bilirubine en mg/dL est multipliée par 17,1.L'hémoglobine reprend aussi les valeurs de laboratoire de HemoSnap; une valeur au-dessus de 40 est lue en g/L et divisée par 10.Au moins 2 valeursantérieures ?ouinonOn calcule la médiane de cesvaleurs : ta ligne de base.Statut « pas de base » : lemarqueur est montré mais nepeut pas être signalé.Haptoglobine : la baseest-elle déjà de 0,1 g/L oumoins ?ouinonStatut « indétectable » : pasde comparaison, car unevaleur déjà effondrée ne peutplus baisser.On passe à la comparaison.3. Seuil du marqueurMarqueurs qui montent : signalé si dernière valeur ≥ base × (1 +seuil). Bilirubine totale et indirecte +30 %, LDH +25 %,réticulocytes +30 %.Haptoglobine : signalée si dernière valeur ≤ base × 0,5 (baisse de50 %).Hémoglobine : signalée si dernière valeur ≤ base - 1 g/dL.4 valeurs antérieures ouplus ?ouinonL'écart doit aussi atteindre2 écarts-types robustes :1,4826 × écart absolu médian,au minimum 8 % de la base.Le seuil relatif suffit.5. Compter le bilanLa date la plus récente de tous les marqueurs sert de repère.Un marqueur est « actuel » si sa dernière mesure date de 21 joursou moins avant ce repère.On compte les marqueurs actuels (quel que soit leur statut) etceux qui sont signalés.Moins de 2marqueurs actuelsNiveau « pas assezde données » : ilen faut au moinsdeux parmibilirubine, LDH,réticulocytes,haptoglobine,hémoglobine.Le bot dit ce quimanque et commentajouter desrésultats.2 marqueursactuels ou plus0 signalé : «stable ». 1signalé : « àsurveiller ». 2signalés ou plus :« évoque unepoussée d'hémolyse».Les marqueurssignalés sontlistés avec leurvaleur et ta base.TransfusionrécenteSi la dernièretransfusion datede 0 à 28 jours etque le niveau est« à surveiller »ou « poussée », unavertissementmentionne uneréaction retardéepossible etconseilled'appeler l'équipesoignante sansattendre.
Logigramme : Évaluation de l'hémolyse : six marqueurs face à ta ligne de base

Les valeurs utilisées

Nom dans le codeValeurRôleOù
PANEL_DAYS21Fenêtre, autour de la mesure la plus récente, dans laquelle les marqueurs comptent comme un même bilan.src/trevor/hemolysis.py:36
MIN_BASELINE2Valeurs antérieures nécessaires.src/trevor/hemolysis.py:37
ROBUST_FROM4Antécédents à partir desquels le test à 2 écarts-types robustes s'ajoute.src/trevor/hemolysis.py:38
AFTER_TRANSFUSION_DAYS28Durée après transfusion qui déclenche l'avertissement.src/trevor/hemolysis.py:39
MARKERS bilirubine / indirecte+30 % / +30 %Seuils relatifs de hausse.src/trevor/hemolysis.py:55-56
MARKERS LDH+25 %Seuil relatif de hausse.src/trevor/hemolysis.py:57
MARKERS réticulocytes+30 %Seuil relatif de hausse (nombre absolu).src/trevor/hemolysis.py:58
MARKERS haptoglobinebaisse de 50 %Seuil relatif de baisse.src/trevor/hemolysis.py:59
MARKERS hémoglobinebaisse de 1,0 g/dLBaisse absolue.src/trevor/hemolysis.py:60
HAPTO_UNDETECTABLE0.1 g/LBase en dessous de laquelle l'haptoglobine n'est plus comparée.src/trevor/hemolysis.py:62
Plancher de l'écart-type robuste0,08 × |base|L'écart-type robuste ne descend pas sous 8 % de la base.src/trevor/hemolysis.py:95-97

Ce qui est affiché

Cinq niveaux : « aucun » (pas de marqueur au dossier), « pas assez de données » (moins de 2 marqueurs actuels), « stable » (0 signalé), « à surveiller » (1 signalé) et « évoque une poussée d'hémolyse » (2 signalés ou plus). Les niveaux « à surveiller » et « poussée » invitent à en parler à l'équipe soignante ; « à surveiller » précise qu'un seul marqueur ne suffit pas pour conclure. La mention de réaction retardée apparaît seulement pour « à surveiller » et « poussée » dans les 28 jours après une transfusion.

Un exemple chiffré

Bilirubine totale : valeurs 50, 55, 52 puis 80 µmol/L. Base (médiane de 50, 55, 52) = 52. Seuil = 52 × 1,30 = 67,6. 80 dépasse ce seuil, et comme il y a seulement 3 antécédents, le test robuste ne s'applique pas : statut « signalé », +54 %. Avec LDH signalée aussi dans les 21 jours, le niveau devient « évoque une poussée d'hémolyse » (calculé en exécutant judge).

Ce que cet algorithme ne sait pas faire

Validation. Le principe (plusieurs marqueurs concordants, chacun comparé à ta propre base) est exposé dans le module comme logique clinique, sans référence citée. Les seuils (+30 %, +25 %, -50 %, -1 g/dL), la fenêtre de 21 jours et la règle des 2 écarts-types robustes sont des choix posés sans étude dans le dépôt. La documentation (docs/CALIBRAGE_HEMOLYSE.md, section 5) liste encore à faire l'accord du service d'hématologie sur les seuils et les textes.

Code : src/trevor/hemolysis.py (series, judge, lab_view, missing_markers), src/trevor/conversation/hemolysis_screens.py (_hemolysis_lines), src/trevor/transfusion.py (last_transfusion)

HemoSnap : hémoglobine estimée par photo du doigt

HemoSnap estime ton hémoglobine à partir de trois photos du bout du doigt posé sur l'objectif et le flash. Le chiffre n'apparaît qu'après un calibrage sur une de tes valeurs de laboratoire. C'est une fonction expérimentale, sans validation clinique, qui ne remplace pas une prise de sang.

Où tu le vois : Dans le bot, menu Ma santé, entrée HemoSnap : avertissement, écran d'accueil, prise des trois photos, résultat avec fourchette, puis calibrage (valeur de laboratoire, date, lien avec une transfusion). Le même calcul sert à l'application du téléphone (signals.py).

Ce que l’algorithme lit

Le calcul, étape par étape

1. Lire la photoOn garde le centre de l'image (de 20 % à 80 % en largeur et enhauteur), réduit à 64 par 64 pixels.On écarte les pixels trop sombres (luminance de 15 ou moins) oubrûlés (250 ou plus).Il faut au moins 50 pixels utiles, sinon la photo est illisible.La photo est-elle un doigtbien éclairé ?ouinonOn calcule l'indice optique :logarithme de (rouge médian +1) divisé par (vert médian +1).La photo est refusée avec unconseil : illisible, tropsombre (luminosité médianesous 40), trop claire(au-dessus de 240), pas undoigt (moins de la moitié despixels dominés par le rouge)ou vert presque éteint (vertmédian sous 35). Tu refais lecliché.2. Trois clichés, un indiceLe bot garde les indices des clichés valides jusqu'à en avoir 3.L'indice retenu est la médiane des 3, ce qui réduit le bruit demesure.As-tu déjà un calibrage ?ouinonLa droite personnelletransforme l'indice enhémoglobine (étape 3).Aucun chiffre n'est donné. Lebot demande ta dernièrehémoglobine de laboratoirepour calibrer, puis sa date,puis le lien avec unetransfusion.3. Ajuster la droiteHémoglobine = pente × indice + ordonnée.Un point de laboratoire : la pente reste celle de population (9,0)et seule l'ordonnée est recalée.Deux points ou plus : moindres carrés. Une pente négative ou nulleest remplacée par 9,0 ; une pente hors de 3 à 18 est ramenée à laborne, la droite passant par la moyenne des points.L'estimation est-elle entre4 et 19 g/dL ?ouinonLe chiffre est affiché, avecune fourchette (étape 4).Rien n'est affiché nienregistré, et le bot tedemande de refaire la photo.Le chiffre n'est jamaisramené de force à une borne.4. Fourchette d'incertitudeDemi-largeur = racine de (modèle au carré + mesure au carré).Modèle : 1,4 g/dL avec 1 point de laboratoire, 0,8 avec 2 ou 3,0,6 avec 4 ou plus.Mesure : 0,8 divisé par la racine du nombre de clichés.La fourchette affichée est bornée entre 3 et 20 g/dL.Ajouter un point de calibrageTu donnes la valeur delaboratoire (3 à 20), sa date(JJ.MM.AAAA ou Aujourd'hui) etle lien avec une transfusion.Le couple (indice, valeur)rejoint la droite.Message après une transfusionSi tu réponds « juste après »,un texte précise que la valeurest momentanément haute.Avec un seul point, un textet'invite à ajouter un point àun autre niveau d'hémoglobine.
Logigramme : HemoSnap : hémoglobine estimée par photo du doigt

Les valeurs utilisées

Nom dans le codeValeurRôleOù
POP_SLOPE9.0Pente de population (g/dL par unité d'indice), utilisée avec un seul point.src/trevor/media/hemosnap.py:30
POP_INTERCEPT6.0Ordonnée de population. Elle n'entre dans aucun calcul d'estimation tant qu'il n'y a pas de point : sans point, aucun chiffre n'est donné.src/trevor/media/hemosnap.py:31
HB_MIN, HB_MAX3.0 et 20.0 g/dLBornes de la valeur de laboratoire saisie et de la fourchette affichée.src/trevor/media/hemosnap.py:32
PLAUSIBLE(4.0, 19.0) g/dLUne estimation hors de cette plage n'est pas affichée.src/trevor/media/hemosnap.py:33
GREEN_MIN35.0Vert médian minimal (0 à 255) : en dessous, l'indice explose.src/trevor/media/hemosnap.py:34
SLOPE_RANGE(3.0, 18.0)Pente personnelle plausible.src/trevor/media/hemosnap.py:35
MODEL_BAND_1PT / 2PT / 4PT1.4 / 0.8 / 0.6 g/dLPart « modèle » de l'incertitude selon le nombre de points (1, 2 à 3, 4 ou plus).src/trevor/media/hemosnap.py:42-44
MEAS_BAND_1SHOT0.8 g/dLBruit d'un cliché, divisé par la racine du nombre de clichés.src/trevor/media/hemosnap.py:45
HEMO_SHOTS_NEEDED3Nombre de clichés d'affilée dans le bot.src/trevor/conversation/wearables_screen.py:792
Seuils de qualitéluminosité 40 à 240, part rouge 0,5, vert 35, marge rouge 8Conditions de quality_check ; un pixel compte comme rouge si le rouge dépasse le vert et le bleu de plus de 8.src/trevor/media/hemosnap.py:91,105-111

Ce qui est affiché

Le résultat dit : « Estimation : environ X g/dL, dans une fourchette de A à B g/dL », suivi du nombre de valeurs de laboratoire du calibrage et d'une note disant que la fonction est expérimentale, non validée et moins fiable sur peau foncée. Niveaux internes : non calibré (aucun chiffre), hors plage (aucun chiffre), calibré avec 1, 2 ou plus de points. Chaque estimation chiffrée est enregistrée avec son indice.

Un exemple chiffré

Un point de laboratoire : indice 0,5 pour 9,0 g/dL. La pente reste 9,0 et l'ordonnée devient 4,5. Trois clichés donnent l'indice médian 0,6 : 9,0 × 0,6 + 4,5 = 9,9 g/dL. Demi-largeur : racine de (1,4² + 0,8²/3) = 1,5. Affichage : 9,9 g/dL, fourchette 8,4 à 11,4 (calculé en exécutant le code).

Ce que cet algorithme ne sait pas faire

Validation. La pente de population (9,0) et l'ordonnée (6,0) sont décrites dans le code comme un a priori volontairement prudent, sans source citée ni donnée d'apprentissage : valeurs posées sans étude. Les largeurs de bande (1,4 ; 0,8 ; 0,6 ; 0,8) sont des choix de l'auteur, sans mesure publiée. Les seuils de qualité de photo sont des réglages empiriques (le commentaire de GREEN_MIN cite un cas observé à 22 à 30 g/dL). L'indice en logarithme du rapport rouge sur vert s'appuie sur l'absorption de l'hémoglobine dans le vert, énoncée dans le module sans référence. Aucune validation clinique n'est établie.

Code : src/trevor/media/hemosnap.py (extract_features, quality_check, fit_calibration, uncertainty_band, estimate), src/trevor/conversation/wearables_screen.py (hemosnap_process, on_hemosnap_calibrate, on_hemosnap_cal_date, on_hemosnap_cal_transf), src/trevor/storage/database.py (hemo_calibration_points), src/trevor/signals.py (_hemoglobin, hemosnap_reading)

Jaune de la sclère : indice et bilirubine estimée

Trévor mesure le jaune du blanc de ton œil sur une photo et en tire un indice. Après plusieurs couples photo et prise de sang, il traduit l'indice en bilirubine estimée avec un intervalle. Sans calibrage, il indique seulement si tu es plus jaune, pareil ou moins jaune que d'habitude.

Où tu le vois : Dans l'écran Hémolyse du bot (ligne « Jaune de l'œil ») et dans la page web : indice enregistré, bilirubine estimée avec fourchette, « pas de jaune net », tendance, et le nombre de couples de calibrage sur 5.

Ce que l’algorithme lit

Le calcul, étape par étape

1. Trouver le blanc de l'œilLa photo est réduite à 96 pixels au plus, convertie en couleursCIELAB.Un pixel compte s'il est clair mais pas brûlé (luminosité L de 50à moins de 97), peu rouge (a* de 8 ou moins) et peu saturé (chromade 45 ou moins).On garde la plus grande zone d'un seul tenant.La photo est-elle utilisable?ouinonOn garde la moitié la plusclaire de la zone, on prendle b* médian et son étalement(écart interquartile).La photo est refusée avec uneraison : illisible, troppetite (moins de 24 pixels),trop peu de blanc (zone sous2 % de l'image), lumière tropforte (plus de 30 % del'image brûlée, ou plus de 25% de pixels brûlés autour dela zone), trop sombre(luminosité médiane sous 58),ou teinte irrégulière(étalement de b* au-dessus de8).2. Feuille blanche (facultative)On lit le centre de la feuille (de 25 % à 75 %). Elle est refuséesi sa luminosité médiane est sous 45 ou si l'étalement de b*dépasse 6.Une feuille refusée est écartée : l'indice est calculé sans elleet le message le dit.3. Indice de jauneAvec feuille valide : indice = b* de l'œil moins b* de la feuille.Sans feuille : indice = b* de l'œil.Seuls l'indice, la luminosité, la date et l'indicateur « feuille »sont enregistrés ; l'image n'est pas gardée.4. Couples de calibrageUne photo avec une bilirubine saisie donne un couple (indice,bilirubine).Sinon on cherche une bilirubine totale du dossier à 2 jours oumoins ; la plus proche dans le temps est prise.Une bilirubine en mg/dL est multipliée par 17,1.Combien de couples ?ouinon3 ou 4 : estimationprovisoire. 5 ou plus aveccorrélation d'au moins 0,6 :estimation calibrée. Entreces cas, une corrélation sous0,3 ou une pente négativedonne le palier « insuffisant» sans chiffre.0 à 2 couples : aucunchiffre. Si tu as au moins 4mesures, seule la tendanceest montrée.5. Droite et intervalleBilirubine = pente × indice + ordonnée (moindres carrés).Intervalle de prédiction à 95 % : t de Student × écart-typerésiduel × racine de (1 + 1/n + (indice - moyenne)²/somme descarrés), avec un plancher de 8 µmol/L.Valeur et bornes sont ramenées entre 3 et 400 µmol/L.Affichage du chiffre« Bilirubine estimée environ Vµmol/L (entre B1 et B2) ».Si la valeur est sous 35 et laborne haute sous 43 : « pas dejaune net (sous 35 µmol/L) ».TendanceIl faut au moins 3 mesuresavant la dernière.On compare la dernière à lamédiane des précédentes :seuil = le plus grand de 1,5et de 2 écarts absolus médians(× 1,4826).Plus haut, pareil ou plus bas.
Logigramme : Jaune de la sclère : indice et bilirubine estimée

Les valeurs utilisées

Nom dans le codeValeurRôleOù
MIN_POINTS_PROVISIONAL3Couples minimaux pour un chiffre provisoire.src/trevor/media/scleral.py:37
MIN_POINTS_CALIBRATED5Couples pour un chiffre calibré.src/trevor/media/scleral.py:38
MIN_R_CALIBRATED0.6Corrélation minimale pour « calibré » (en dessous de 0,3 ou pente négative : « insuffisant »).src/trevor/media/scleral.py:39,218-224
BAND_FLOOR8.0 µmol/LDemi-largeur minimale de l'intervalle.src/trevor/media/scleral.py:40
VISIBLE_ICTERUS35.0 µmol/LSous cette bilirubine, la sclère reste blanche à l'œil.src/trevor/media/scleral.py:41
BILI_MIN, BILI_MAX3.0 et 400.0 µmol/LBornes d'affichage et de saisie.src/trevor/media/scleral.py:42
MG_DL_TO_UMOL17.1Conversion mg/dL vers µmol/L.src/trevor/media/scleral.py:43
TREND_MIN_SHIFT, TREND_MIN_HISTORY1.5 unité de b* ; 3 mesuresÉcart minimal et historique minimal pour la tendance.src/trevor/media/scleral.py:44-45
MIN_SCLERA_FRACTION0.02Part minimale de l'image occupée par le blanc de l'œil.src/trevor/media/scleral.py:46
EYE_MIN_L, BLOWN_L, EYE_MIN_LIGHT50 ; 97 ; 58Luminosité minimale d'un pixel, seuil de brûlé, luminosité médiane minimale.src/trevor/media/scleral.py:47-49
MAX_BLOWN_IMAGE, MAX_GLARE, MAX_SPREAD0.30 ; 0.25 ; 8.0Part d'image brûlée, part de reflet autour du blanc, étalement maximal de b*.src/trevor/media/scleral.py:50-52
EYE_PAIR_DAYS2Écart maximal entre la photo et une bilirubine du dossier.src/trevor/hemolysis.py:41

Ce qui est affiché

Trois niveaux de calibrage : aucun (moins de 3 couples, tendance seule), provisoire (3 ou 4 couples), calibré (5 couples ou plus, corrélation d'au moins 0,6), plus le palier « insuffisant » (pente négative ou corrélation sous 0,3, aucun chiffre). Le chiffre est la bilirubine estimée arrondie en µmol/L avec ses bornes. Sans estimation, la tendance dit « plus jaune », « comme d'habitude » ou « moins jaune ». Un texte rappelle que la photo n'estime que la bilirubine et pose aucun diagnostic.

Un exemple chiffré

Cinq couples (indice, bilirubine) : (1, 20), (2, 30), (3, 41), (4, 52), (5, 60). Pente 10,2, ordonnée 10, corrélation 0,999 : palier calibré. Nouvel indice 3,5 : 10,2 × 3,5 + 10 = 45,7, soit 46 µmol/L. L'intervalle calculé est d'environ 3,4, donc le plancher de 8 s'applique : de 38 à 54 µmol/L. Indice 0 : 10 µmol/L, sous 35, donc « pas de jaune net » (exécuté avec le code).

Ce que cet algorithme ne sait pas faire

Validation. Le calcul de b* en CIELAB D65 et la table de Student à 95 % sont des méthodes standard. Le seuil de 34 à 35 µmol/L (2 mg/dL) pour l'ictère visible est donné dans la documentation du module comme signe clinique de référence, sans citation. Les seuils d'image (luminosités, parts, étalements) et les paliers 3 et 5 couples sont des réglages de l'auteur, sans étude publiée dans le dépôt. Aucune validation de précision n'est établie.

Code : src/trevor/media/scleral.py (extract_eye, extract_paper, index_of, fit, estimate, trend, to_umol), src/trevor/hemolysis.py (record_eye, save_eye, calibration_points, eye_view, set_lab), src/trevor/conversation/hemolysis_screens.py (_hemolysis_lines), src/trevor/signals.py (eye_numbers)

Lecture d'un PDF de laboratoire

Trévor lit les mots et leur position dans un PDF de laboratoire qui contient du texte, retrouve les marqueurs d'hémolyse et rattache chaque valeur à sa date de prélèvement. Rien n'est inventé : une valeur n'est retenue que si elle est alignée sous une date. Tu relis le résultat avant tout enregistrement.

Où tu le vois : Écran de relecture après l'envoi du PDF : une case par valeur lue, que tu coches ou décoches avant l'enregistrement.

Ce que l’algorithme lit

Le calcul, étape par étape

1. Lire les motsChaque page donne ses mots avec leurs coordonnées.Plus de 300 pages : refus clair, rien n'est ignoré en silence.PDF scanné ou sans texte : liste vide, et Trévor passe à lalecture par l'assistant.2. Former les lignesLes mots dont le centre vertical diffère de 3 points ou moinsforment une ligne, triée de gauche à droite.La page a-t-elle descolonnes datées ?ouinonMode tableau : une ligned'en-tête avec au moins 2dates, qui forment au moins80 % des mots de la ligne.Chaque valeur va à la datedont le centre est le plusproche, à 45 % de l'écartentre colonnes près (14points au minimum). Unen-tête absent est repris dela page précédente.Mode ligne : le résultatcourant prend la date deprélèvement de l'en-tête («Ent.Dat. », « Prélèvement »,« Abnahme »), le résultatantérieur la date écrite àcôté.3. Reconnaître le marqueurLe libellé, sans accent ni majuscule, doit correspondre exactementà un motif : hémoglobine, hémoglobine S, bilirubine totale,bilirubine indirecte, LDH, réticulocytes (nombre absolu),haptoglobine.Réticulocytes en o/oo ou en % : ignorés. Hémoglobine S hors % :ignorée.Les analyses voisines (hémoglobine libre, glyquée...) necorrespondent à aucun motif et sont ignorées.4. Écarter les référencesLes plages de référence (« 7 - 25 », « 135-172 », « < 3,0 ») nesont jamais prises pour une valeur.Les valeurs à gauche de la première colonne sont ignorées.5. Normaliser et dédoublonnerChaque valeur passe par la normalisation du catalogue (unités,bornes). Une valeur refusée disparaît.Pour un même marqueur et une même date, la dernière lue remplaceles précédentes.Les dates futures sont écartées. Le résultat est trié par datepuis par marqueur.6. RelectureAu plus 60 valeurs, les plus récentes d'abord gardées, passent àl'écran de relecture.Un signe « < » est conservé comme indicateur de valeur inférieureà la limite, mais la valeur lue reste le nombre écrit.
Logigramme : Lecture d'un PDF de laboratoire

Les valeurs utilisées

Nom dans le codeValeurRôleOù
MAX_PAGES300Au-delà, refus.src/trevor/media/lab_pdf.py:36
Tolérance de ligne3.0 pointsÉcart vertical maximal dans une ligne.src/trevor/media/lab_pdf.py:121
Tolérance de colonnemax(14, 0,45 × écart minimal entre colonnes)Distance maximale entre une valeur et sa colonne.src/trevor/media/lab_pdf.py:166-167
Part de dates d'en-têteau moins 2 dates et 80 % de la ligneCondition d'une ligne d'en-tête.src/trevor/media/lab_pdf.py:155
Dédoublonnage des colonnes8 pointsDeux dates à moins de 8 points de centre forment une seule colonne.src/trevor/media/lab_pdf.py:158
Plafond de valeurs60Valeurs gardées au retour.src/trevor/hemolysis.py:365

Ce qui est affiché

Une liste de valeurs (marqueur, valeur dans l'unité du catalogue, unité, date, indicateur « inférieur à », unité d'origine) à relire. Aucun niveau ni seuil clinique.

Un exemple chiffré

aucun (la lecture dépend de la mise en page d'un vrai PDF, qui n'est pas dans le dépôt). Seule la reconnaissance du libellé a été exécutée : « Bilirubine totale » en µmol/l devient bilirubine ; « Réticulocytes nb.abs. » en o/oo et « Hémoglobine libre » ne donnent rien.

Ce que cet algorithme ne sait pas faire

Validation. Méthode de lecture par coordonnées écrite pour les rapports HUG et alémaniques cités dans le module, sans jeu de test public dans le dépôt vu ici. Les tolérances (3 points, 45 %, 80 %, 8 points) sont des réglages empiriques. La relecture par la personne est le garde-fou prévu.

Code : src/trevor/media/lab_pdf.py (read_lab_pdf, marker_of, _read_table, _read_inline, _columns, _split), src/trevor/hemolysis.py (read_pdf_items, normalize_lab)

Réponse de l'hémoglobine aux transfusions

Trévor compare ton hémoglobine d'avant et d'après chaque transfusion pour estimer ce que te donne un culot, combien de temps le gain se maintient, et si les échanges respectent la dose et l'intervalle de leur protocole. Il décrit tes données et ne recommande aucune dose.

Où tu le vois : Carte « Réponse à tes transfusions » : page web du tableau de bord, application et export.

Ce que l’algorithme lit

Le calcul, étape par étape

1. Mesures d'hémoglobineLaboratoire : erreur de mesure 0,25 g/dL. Estimation HemoSnap :1,0 g/dL.Si un relevé HemoSnap a une valeur de labo, c'est elle qui compte,pas l'estimation.Une valeur au-dessus de 30 est lue en g/L et divisée par 10.2. Paires avant et aprèsUne paire par séance qui a au moins 1 culot.Avant : la mesure la plus proche dans les 7 jours qui précèdent(jour même compris).Après : la mesure la plus proche dans les jours 1 à 7 qui suivent.Sans mesure d'un côté, pas de paire.3. Saut par culotSur les transfusions simples seulement : delta = après - avant,modélisé par delta = b × culots (droite par l'origine, pondéréepar 1/variance).Erreur standard = la plus grande de l'erreur de mesure et de ladispersion observée (dispersion calculée dès 3 paires).4. Rapprochement vers un repèreMoyenne pondérée par 1/variance entre ta pente et un repèred'adulte de 1,0 g/dL par culot (écart-type 0,4).Avec peu de paires, le repère domine ; avec beaucoup, ta pentedomine.Moins de 3 paires : « provisoire » ; 3 ou plus : « assez » pourafficher un chiffre personnel.5. MaintienPour la dernière transfusion simple avec culots et paire : onprend les mesures des jours 1 à 60 dont l'excès sur l'hémoglobined'avant dépasse 0,3 g/dL.Régression de log(excès) sur les jours : la demi-vie est ln 2divisé par la vitesse de décroissance.Il faut au moins 2 mesures et une décroissance positive, sinonrien.DoseCible de culots :échangeautomatique 6 à 9pour 77 kg,échange manuel 3 à5, mises àl'échelle du poidsquand il estconnu.Statut : « endessous » siculots + 0,5 estsous le minimum, «au-dessus » siculots - 0,5dépasse lemaximum, sinon «dans la cible ».IntervalleCible : échangeautomatique 5 à 6semaines, manuel 2à 3 semaines.Médiane desintervalles entreéchanges ; « court» sous le minimum- 0,5, « long »au-dessus dumaximum + 0,5,sinon « dans lacible ».Hémoglobine SDernier dosageface au repère de30 %.Pente en points de% par culot surles échanges avecdosage dans lesfenêtres.
Logigramme : Réponse de l'hémoglobine aux transfusions

Les valeurs utilisées

Nom dans le codeValeurRôleOù
PRIOR_PER_UNIT1.0 g/dL par culotRepère d'adulte.src/trevor/transfusion_response.py:35
PRIOR_SD0.4Incertitude du repère.src/trevor/transfusion_response.py:36
LAB_SD, ESTIMATE_SD0.25 ; 1.0 g/dLErreur de mesure d'un laboratoire et d'une estimation HemoSnap.src/trevor/transfusion_response.py:37
HBS_SD2.0 points de %Erreur d'un dosage d'hémoglobine S.src/trevor/transfusion_response.py:38
HBS_TARGET30.0 %Repère sous lequel on cherche à garder l'hémoglobine S entre deux échanges ; le code précise « à confirmer avec l'hématologie ».src/trevor/transfusion_response.py:39
PRE_WINDOW, POST_WINDOW7 jours avant ; jours 1 à 7 aprèsFenêtres de recherche.src/trevor/transfusion_response.py:40-41
MIN_PAIRS_INDIVIDUAL3Paires pour un chiffre personnel non provisoire.src/trevor/transfusion_response.py:42
RECENT_EXCHANGES6Échanges pris en compte pour la part dans la cible.src/trevor/transfusion_response.py:43
PROTOCOLS exchangeculots 6 à 9 (pour 77 kg), semaines 5 à 6Cibles de l'échange automatique.src/trevor/transfusion_response.py:49
PROTOCOLS exchange_manualculots 3 à 5 (pour 77 kg), semaines 2 à 3Cibles de l'échange manuel.src/trevor/transfusion_response.py:50
Demi-viejours 1 à 60, excès > 0,3 g/dL, décroissance > 0,0001 par jourConditions du calcul.src/trevor/transfusion_response.py:216-225

Ce qui est affiché

Gain par culot en g/dL avec son erreur standard, la pente brute, le nombre de paires et le drapeau « provisoire » ; demi-vie en jours ; pour chaque modalité d'échange : dernier nombre de culots et statut (en dessous, dans la cible, au-dessus), cible en culots, part des 6 derniers échanges dans la cible, intervalle médian et son statut (court, dans la cible, long), culots par kg ; hémoglobine S : dernier dosage, repère de 30 %, pente par culot. Les chiffres personnels ne sont déclarés « assez » qu'avec 3 paires de transfusions simples.

Un exemple chiffré

Trois transfusions simples : 2 culots (7,0 puis 9,0 g/dL), 2 culots (7,4 puis 9,1), 3 culots (6,8 puis 10,1). Pente brute 1,018 g/dL par culot, erreur standard 0,086. Après rapprochement vers 1,0 (écart-type 0,4) : 1,017 avec erreur 0,084. Échange automatique pour 70 kg : cible 5,5 à 8,2 culots ; 6 culots est dans la cible ; intervalle médian de 7 semaines : « long » (plus de 6,5) ; 6,5 semaines : dans la cible (exécuté avec le code).

Ce que cet algorithme ne sait pas faire

Validation. Le repère d'adulte de 1 g/dL par culot et son écart-type de 0,4 sont posés dans le code sans référence. L'erreur de mesure du laboratoire (0,25), de l'estimation (1,0) et de l'hémoglobine S (2,0) sont des choix de l'auteur. Les cibles par modalité sont des valeurs de départ à confirmer par l'hématologie. La documentation liste la validation sur une cohorte avec accord de l'hématologie comme piste à venir. La méthode statistique (moindres carrés pondérés, rapprochement bayésien) est standard.

Code : src/trevor/transfusion_response.py (hb_readings, make_pairs, slope_through_origin, shrink, half_life_days, units_target, dose_status, interval_status, build), src/trevor/transfusion.py (payload, _response), src/trevor/dashboard/data.py

Suivi du fer : ferritine, IRM et fraction d'éjection

Trévor note les mesures de fer que ton équipe de soins te donne (ferritine, T2* du cœur et du foie, fer du foie, fraction d'éjection), les met en courbe et les lit face à des repères de la Thalassaemia International Federation. Chaque saisie remet à jour le rappel de l'examen annuel. Il ne donne aucune consigne de traitement.

Où tu le vois : Écran et page du suivi du fer pour les maladies concernées (thalassémie) : une ligne par type de mesure avec la dernière valeur, sa date, une phrase de repère, le sens depuis la mesure précédente et une petite courbe.

Ce que l’algorithme lit

Le calcul, étape par étape

1. SaisirLe nombre est lu avec une éventuelle unité (ferritine : µg/L,ng/mL ou mg/L ; T2* : ms ; LIC : mg/g ; fraction d'éjection : %).Ferritine acceptée de 1 à 60 000 ; T2* du cœur de 1 à 80 ; T2* dufoie de 0,1 à 80 ; LIC de 0,1 à 80 ; fraction d'éjection de 10 à90.Date passée et de moins de 10 ans. Même type, même jour, mêmevaleur : « déjà noté ».2. Rappel d'examenLa date du rappel (ferritine tous les 3 mois, IRM annuelle) repartde la mesure la plus récente.3. Une valeur par jourPour chaque type, une seule valeur par jour est gardée (ladernière enregistrée ce jour-là), triée par date.Ferritine2 500 µg/L ou plus: repère élevé,contacter l'équipede soins.1 000 à moins de 2500 : surveillanceplus rapprochée.Sous 1 000 : sousle repère.T2* du cœurSous 10 ms :repère de risqueélevé pour lecœur.10 à moins de 20ms : valeurconsidéréeanormale.20 ms ou plus :au-dessus durepère d'anomalie.Fer du foie (LIC)15 mg/g ou plus :surcharge sévère.7 à moins de 15 :surcharge modérée.Sous 7 : sous lerepère.4. Sens et courbeSens : on compare les deux dernières valeurs ; écart de moins de10 % : « stable », sinon « en hausse » ou « en baisse ». Une seulemesure : rien.Courbe : au plus les 8 dernières valeurs, transformées en 8hauteurs de barre entre le minimum et le maximum ; valeurs touteségales : barres à mi-hauteur.
Logigramme : Suivi du fer : ferritine, IRM et fraction d'éjection

Les valeurs utilisées

Nom dans le codeValeurRôleOù
FERRITIN_THAL_WATCH1000.0 µg/LFerritine à surveiller.src/trevor/value_alerts.py:48
FERRITIN_THAL_REPORT2500.0 µg/LFerritine à signaler.src/trevor/value_alerts.py:49
CARDIAC_T2_ABNORMAL_MS20.0 msT2* du cœur anormal en dessous.src/trevor/iron.py:30
CARDIAC_T2_HIGH_RISK_MS10.0 msT2* du cœur à risque élevé en dessous.src/trevor/iron.py:31
LIC_MODERATE, LIC_SEVERE7.0 ; 15.0 mg/gSeuils de surcharge modérée et sévère.src/trevor/iron.py:32-33
FLAT_PERCENT10.0Écart sous lequel deux mesures se lisent « stable ».src/trevor/iron.py:34
MAX_BACK_DAYS3650Ancienneté maximale d'une date saisie.src/trevor/iron.py:35

Ce qui est affiché

Par type de mesure : dernière valeur, date, phrase de repère, sens et courbe. Ferritine : 3 niveaux (sous 1 000, 1 000 à 2 499, 2 500 ou plus). T2* du cœur : 3 niveaux (20 ou plus, 10 à moins de 20, sous 10). LIC : 3 niveaux (sous 7, 7 à moins de 15, 15 ou plus). T2* du foie et fraction d'éjection : aucun repère, valeur seulement notée et mise en courbe. Les phrases invitent à en parler avec l'équipe de soins.

Un exemple chiffré

Ferritine 1 450 µg/L : niveau « à surveiller » (entre 1 000 et 2 500). Deux dernières ferritines 1 000 puis 1 080 : écart 8 %, sous 10 %, donc « stable » ; 1 000 puis 1 200 : 20 %, donc « en hausse ». T2* du cœur 15 ms : « anormal ». Courbe de 1, 2, 3, 5 : ▁▃▅█ (exécuté avec le code).

Ce que cet algorithme ne sait pas faire

Validation. Les repères viennent de la TIF 2021 (Thalassaemia International Federation), d'après le module : T2* du cœur 10 et 20 ms, LIC 7 et 15 mg/g, ferritine 1 000 et 2 500 µg/L (chapitre 3 pour la ferritine selon value_alerts.py). Le code précise qu'ils sont à valider par un hématologue (docs/THALASSEMIE_AUDIT.md, sections 5 et 8, non lue). Le seuil de 10 % pour « stable » est un choix de l'auteur.

Code : src/trevor/iron.py (normalize, reading, trend, spark, series, build, add), src/trevor/value_alerts.py (FERRITIN_THAL_WATCH, FERRITIN_THAL_REPORT), src/trevor/conversation/iron_screens.py, src/trevor/dashboard/phone_care_routes.py

Symptômes après une transfusion : niveau d'alerte

Tu coches les symptômes que tu ressens depuis une transfusion. Le serveur donne à la déclaration le niveau du symptôme le plus grave coché : signe d'alerte, à signaler ou noté. Il te dit alors qui appeler, et signale qu'une réaction retardée est possible si le signe et le délai s'y prêtent.

Où tu le vois : Écran « Après ma transfusion » : liste des symptômes, texte de conseil selon le niveau, historique des déclarations. Le niveau est calculé par le serveur et le client ne le choisit pas.

Ce que l’algorithme lit

Le calcul, étape par étape

1. FiltrerSeuls les symptômes du catalogue sont gardés, dans l'ordre ducatalogue, sans doublon.Aucun symptôme, date illisible, future ou de plus de 730 jours :la déclaration est refusée.2. NiveauNiveau = le plus élevé des symptômes cochés (note < à signaler <urgent).Urgent : fièvre, difficulté à respirer, douleur dans la poitrine,gonflement du visage, malaise ou confusion, urines foncées.À signaler : frissons, plaques rouges, douleur dans le dos,douleur inhabituelle, peau ou yeux jaunes, fatigue ou pâleur,jambes gonflées, cœur très rapide.Noté : mal de tête, nausées, autre.3. Relier à une transfusionLa transfusion liée est la plus récente connue le jour dessymptômes ou avant.Délai = jours entre la transfusion et le début des symptômes.Réaction retardée possible ?ouinonOui si le délai est de 1 à 28jours et qu'un de ces signesest coché : urines foncées,peau ou yeux jaunes, fatigue,douleur inhabituelle, fièvre,douleur dans le dos.Pas de mention de réactionretardée.4. ConseilUrgent : « appelle » le numéro d'urgence de ton pays, dis que tuas été transfusé·e et donne la date.À signaler : appelle ton équipe soignante aujourd'hui, même si lessymptômes te semblent légers ; si l'état s'aggrave, le numérod'urgence.Noté : en parler au prochain contact, plus tôt si ça dure.Pour urgent et à signaler, le texte de réaction retardée s'ajoutesi elle est possible.
Logigramme : Symptômes après une transfusion : niveau d'alerte

Les valeurs utilisées

Nom dans le codeValeurRôleOù
DELAYED_HINTSdark_urine, jaundice, fatigue, pain, fever, back_painSignes qui évoquent une destruction retardée des globules rouges transfusés.src/trevor/transfusion.py:62
DELAYED_WINDOW_DAYS(1, 28)Fenêtre du lendemain à quatre semaines.src/trevor/transfusion.py:63
RECENT_DAYS30Une déclaration plus ancienne ne remonte plus dans le bandeau du dossier.src/trevor/transfusion.py:64
MAX_NOTE280Caractères de la note.src/trevor/transfusion.py:66
INTENSITIES0, 1, 2, 3Inconnue, léger, gênant, très fort.src/trevor/transfusion.py:68
SYMPTOMS6 urgent, 8 à signaler, 3 notéCatalogue et niveaux.src/trevor/transfusion.py:40-57

Ce qui est affiché

Trois niveaux : « signe d'alerte » (urgent), « à signaler », « noté ». Le texte d'urgence dit d'appeler le numéro d'urgence du pays de la personne. La mention de réaction retardée s'ajoute pour urgent et à signaler quand le délai est de 1 à 28 jours avec un signe évocateur.

Un exemple chiffré

Symptômes cochés : fièvre et nausées. Fièvre est « urgent », nausées « noté » : le niveau est « urgent ». Coche seulement « plaques rouges » : « à signaler ». « Peau ou yeux jaunes » 10 jours après la transfusion : réaction retardée possible ; le même signe le jour même (délai 0) : non (exécuté avec le code).

Ce que cet algorithme ne sait pas faire

Validation. Le module affirme reprendre les signes classiques d'une réaction transfusionnelle et la règle du protocole d'hématologie des HUG pour la fièvre. Le catalogue, le classement par niveau et la fenêtre de 1 à 28 jours sont des choix de l'auteur, non vérifiés ici contre ce protocole. Une relecture par l'hématologie est annoncée comme à faire (docs/conformite/AIPD_TREVOR.md, citée par le module, non lue).

Code : src/trevor/transfusion.py (SYMPTOMS, tier_of, delayed_possible, linked_transfusion, record_reaction, advice_lines)

Historique des transfusions, intervalle et programme

Trévor retrouve ta dernière transfusion à partir de plusieurs endroits où tu peux l'avoir notée, compte les jours écoulés, calcule l'intervalle moyen entre transfusions et, si tu as un programme régulier, dit si tu es en retard ou à l'heure. Il note aussi le nombre de culots et la durée de chaque séance.

Où tu le vois : Écran « Mon programme transfusionnel » du bot (statut, jours et semaines écoulés, nombre de transfusions, intervalle moyen, retard ou prochaine date), puis questions sur le nombre de culots et la durée. Mêmes données sur la page web et dans l'application (transfusion.payload).

Ce que l’algorithme lit

Le calcul, étape par étape

1. Noter la séanceTu appuies sur « J'ai été transfusé·e aujourd'hui » ou tu écrisune date.La date doit être passée ou du jour, et de moins de 730 jours(deux ans).Type : transfusion, échange automatique ou échange manuel.2. Culots et duréeCulots : boutons 1 à 6 ou un nombre écrit ; entre 1 et 30 sinon 0(inconnu).Durée : boutons de 1 à 8 heures ou une durée écrite jusqu'à 24heures ; hors de 1 à 1440 minutes, 0 (inconnue).Renoter la même date complète la séance déjà notée.3. Dernière transfusionTrois sources sont lues : l'historique des séances, la date duprofil et la ligne « Dernière transfusion » de la carte.Les dates futures sont écartées ; la plus récente gagne.Les jours écoulés comptent depuis le fuseau de Genève dans leservice, depuis l'heure de la personne dans l'écran du bot.4. Historique et intervalleLes dates sont dédoublonnées ; l'écart en jours avec latransfusion précédente est calculé pour chacune.Intervalle moyen = moyenne des écarts entre dates distinctes del'historique, en semaines (1 décimale).Le nombre de transfusions est le nombre de dates distinctes.Programme régulier actif ?ouinonIntervalle du programme (aumoins 1 semaine, 4 pardéfaut). Retard = semainesécoulées moins intervalle ; àpartir de 0,5 semaine, le botaffiche le retard.Pas de message de retard nide date prévue.5. Prochaine dateSous 0,5 semaine de retard, le bot affiche la prochaine date :dernière transfusion + intervalle en semaines, et les semainesrestantes (0 au minimum).
Logigramme : Historique des transfusions, intervalle et programme

Les valeurs utilisées

Nom dans le codeValeurRôleOù
MAX_BACK_DAYS730Ancienneté maximale d'une transfusion notée.src/trevor/transfusion.py:65
MAX_UNITS30Culots maximum par séance.src/trevor/transfusion.py:67
MAX_MINUTES1440Durée maximale d'une séance.src/trevor/transfusion.py:111
DURATION_CHOICES_HOURS1 à 8 heuresBoutons de durée.src/trevor/conversation/carnet_screens.py:26
Seuil de retard0,5 semaineÀ partir de ce retard, le bot affiche un message de retard.src/trevor/conversation/wearables_screen.py:644-650
Intervalle par défaut4 semainesUtilisé si l'intervalle du programme est vide ou nul dans l'écran du bot.src/trevor/conversation/wearables_screen.py:644
Boutons de culots1 à 6, nombre écrit jusqu'à 30Choix proposés.src/trevor/conversation/wearables_screen.py:701-712

Ce qui est affiché

Pour chaque transfusion : date, type, culots, durée, source de la date (historique, profil ou carte) et jours depuis la précédente. Pour l'ensemble : date de la dernière, jours et semaines écoulés, nombre, intervalle moyen en semaines, régularité (écart-type des intervalles en jours, calculé mais non affiché dans l'écran du bot). Si tu as un programme : « en retard de X semaines (intervalle prévu Y) » ou « prochaine transfusion le JJ.MM.AAAA dans Z semaines ». Aucun seuil clinique.

Un exemple chiffré

aucun (le calcul d'écart se lit directement dans le code ; aucun jeu de données n'a été exécuté). Lecture du code : programme de 6 semaines, dernière transfusion il y a 45 jours, soit 6,4 semaines ; retard = 6,4 - 6 = 0,4 semaine, sous 0,5, donc le bot affiche la prochaine date.

Ce que cet algorithme ne sait pas faire

Validation. Ce sont des règles de comptage et de saisie, sans modèle statistique. Les plafonds (30 culots, 24 heures, 730 jours) et le seuil de 0,5 semaine sont des choix de l'auteur pour attraper les fautes de frappe, sans source citée.

Code : src/trevor/transfusion.py (transfusion_dates, last_transfusion, history, record_transfusion, clean_units, clean_minutes), src/trevor/conversation/wearables_screen.py (screen_transfusion, on_transfusion_units), src/trevor/conversation/carnet_screens.py (screen_transfusion_minutes, on_transfusion_minutes), src/trevor/storage/database.py (transfusion_stats)

Important. Ces calculs orientent, ils ne posent aucun diagnostic et ne remplacent pas l'avis de l'équipe soignante. En cas de douleur forte, de fièvre ou d'essoufflement, il faut appeler le 144 sans attendre.