Aller au contenu

Fiche data manager - ACP (Compte-rendu d'Anatomie et Cytologie Pathologiques)

Nom technique : acp

📥 Télécharger un modèle de CSV

Le signalement ACP correspond au compte-rendu d’anatomie et cytologie pathologiques produit par un laboratoire d’anapath à partir d’un prélèvement (biopsie, pièce opératoire, cytologie). C’est la source la plus riche du registre - elle porte à la fois une codification structurée (codes ADICAP ou SNOMED) et le texte du CR (conclusion, description, texte complet) - et une source à fort volume. Elle provient des laboratoires publics et privés du territoire, dans des formats très hétérogènes (CSV plat, XML CRAP/DIAMIC, PDF, XLS) qu’il faut remapper vers le CSV canonique. On en attend l’identification des cancers incidents et leur caractérisation morphologique/topographique.

Séparateur de colonnes : ; (point-virgule). Le , est également accepté (auto-détection) ; entourez de guillemets "…" toute cellule contenant le séparateur, un retour ligne ou un ; interne (cf. ligne FOURNIER/ROBERT du CSV d’exemple où la conclusion contient un ;).

Colonnes packées (adicap_codes, snomed_codes) : plusieurs valeurs dans une seule cellule, séparées par | (jamais ;). Pour SNOMED, chaque entrée est un couple atomique « T-xxxxx M-yyyyy » (topo + morpho séparés par une espace).

Toutes les colonnes ci-dessous sont des champs fournis par le data manager (sauf les 3 contrôles d’import en fin de tableau), dans l’ordre du manifeste.

Colonne (csvKey)LibelléFormat attenduObligatoireNature
patient_last_nameNomtexteouiIdentité patient
patient_first_namePrénomtexte-Identité patient
patient_birth_nameNom naissancetexte-Identité patient
patient_birth_dateDate naissancedate (JJ/MM/AAAA ou AAAA-MM-JJ)-Identité patient
patient_sexSexetexte (M/F)-Identité patient
patient_nipNIPtexte-Identifiant patient source
patient_secuN° Secu (NIR)NIR (seuls les 10 premiers chiffres conservés)-Identité patient
patient_addressAdressetexte-Adresse patient
patient_postal_codeCode postalcode postal (zéros de tête restaurés)-Adresse patient
patient_cityVilletexte-Adresse patient
patient_birth_communeCommune de naissancetexte-Lieu de naissance
patient_birth_postal_codeCode postal de naissancecode postal (zéros de tête restaurés)-Lieu de naissance
patient_birth_insee_codeCode INSEE de naissancetexte-Lieu de naissance
ndaNDAtexte-Prélèvement
sampling_dateDate prélèvementdate (JJ/MM/AAAA ou AAAA-MM-JJ)-Prélèvement
registration_dateDate enregistrementdate (JJ/MM/AAAA ou AAAA-MM-JJ)-Prélèvement
validation_dateDate validationdate (JJ/MM/AAAA ou AAAA-MM-JJ)-Prélèvement
source_exam_idN° CR ANAPATtexteouiIdentifiant CR (clé dédup)
service_nameServicetexte-Source
prescriber_namePrescripteurtexte-Prescripteur
prescriber_addressAdresse prescripteurtexte-Prescripteur
prescriber_postal_codeCP prescripteurcode postal (zéros de tête restaurés)-Prescripteur
prescriber_cityVille prescripteurtexte-Prescripteur
prescriber_rppsRPPS prescripteurcode (majuscules, points/espaces retirés)-Prescripteur
adicap_codesCodes ADICAPvaleur packée - codes ADICAP séparés par |-Codification (table fille)
snomed_codesCodes SNOMEDvaleur packée - couples T-xxxxx M-yyyyy séparés par |-Codification (table fille)
sampling_topography_textTopographie (texte)texte libre-Anapath
sampling_morphology_textMorphologie (texte)texte libre-Anapath
lateralityLatéralitétexte : G gauche, D droite, B bilatéral, M médian-Anapath
cr_conclusionConclusiontexte libre-Compte-rendu
cr_descriptionDescriptiontexte libre-Compte-rendu
cr_raw_contentTexte complet CRvaleur brute (texte)-Compte-rendu
can_create_patientPeut créer un patientoui/non-Contrôle import
can_create_tumorPeut créer une tumeuroui/non-Contrôle import
excludedExcluentier (0/vide, 1, ≥2)-Contrôle import

Télécharger un modèle de CSV au format attendu

Travail concret pour passer de l’export labo (CSV plat, XML CRAP/DIAMIC, PDF, XLS) au CSV canonique :

  1. Identifier l’identifiant de ligne. source_exam_id (N° CR ANAPAT) est obligatoire avec patient_last_name. Si la source n’expose pas de numéro d’examen exploitable, construire une clé stable par concaténation : nom + prénom + sexe + date de naissance + date anapath + code. Cette clé doit être reproductible d’un export à l’autre (sinon le réimport recrée des doublons).

  2. Mapper les colonnes locales vers les csvKey du tableau Format canonique d’import. L’auto-mapping reconnaît aussi quelques alias de libellé (NIR pour patient_secu, Commune naissance, CP naissance, Code INSEE naissance). Un seul identifiant patient est attendu : patient_nip (libellé « NIP »).

  3. Normaliser les dates au format JJ/MM/AAAA (l’anapath utilise surtout les slashs ; AAAA-MM-JJ est aussi accepté). Toute autre forme (texte, JJ-MM-AAAA, heure accolée…) rejette la ligne si c’est un champ obligatoire, et est silencieusement vidée sinon.

  4. Préparer le NIR. Le système ne conserve que les 10 premiers chiffres (garde-fou : espaces et caractères non numériques retirés, troncature à 10 chiffres). Inutile de le tronquer à la main.

  5. Packer les codes de codification dans une seule cellule, séparés par | :

    • ADICAP : adicap_codes = BHGS0F2A|PHAS0AA1.
    • SNOMED : snomed_codes = T-04000 M-81403|T-08000 M-80703 (un couple = topo + morpho, séparés par une espace).
    • Un CR n’a généralement qu’une seule des deux colonnes renseignée (ADICAP ou SNOMED selon le labo).
  6. Normaliser l’ADICAP sur 8 caractères. Cas de longueur source : 2 = organe seul, 6 = organe + lésion, 8 = complet.

    • Si la partie organisation D1/D2 manque (code à 6 caractères), padder en préfixe par XXXX + 6 = 8.
    • Si la source fournit 10 caractères, tronquer à 8 (le surplus n’est pas exploité).
  7. Codes hémato (lésion commençant par H, ex. H580) : les pousser tels quels. Ils sont acceptés mais pas transcodés en CIM-O-3, faute des tables de transcodage adéquates. Ne pas les convertir à la main.

  8. Filtrer les codes non-cancer EN AMONT. Le SI ne le fait pas. Retirer du fichier les codes ADICAP/SNOMED bénins hors champ du registre.

  9. Latéralité : une seule valeur par ligne (G gauche, D droite, B bilatéral, M médian), appliquée à tous les codes de la ligne.

  10. Texte du CR : alimenter cr_conclusion, cr_description et cr_raw_content selon ce que la source distingue. Si la source ne sépare pas, mettre le texte complet dans cr_raw_content. Échapper avec des guillemets toute cellule contenant ; ou un retour ligne.

  11. Ne PAS dédupliquer côté data manager : voir Spécificités. Laisser les codes identiques, le SI les collapse.

Par défaut pour la typologie ACP : can_create_patient = oui et can_create_tumor = oui. La typologie n’est donc pas en « rattachement seul » : un CR anapath porte un diagnostic histologique fiable, il peut donc à la fois créer un patient inconnu et ouvrir une nouvelle tumeur.

Surcharge par ligne : renseigner les colonnes can_create_patient / can_create_tumor avec oui/non (aussi acceptés : 1/0, o/n, true/false, vrai/faux, x). Mettre non pour forcer un simple rattachement sur une ligne donnée (ex. ligne dont on ne veut pas qu’elle crée une tumeur isolée).

Colonne excluded :

  • 0 ou vide = ligne non exclue ;
  • 1 (ou une valeur vraie sans numéro : oui/x/true) = exclusion avec le motif par défaut (motif global n°1) ;
  • ≥ 2 = motif spécifique du catalogue d’exclusion du registre. Un numéro inconnu du catalogue fait rejeter la ligne.

Une fois votre fichier déposé, le système traite chaque ligne en trois temps :

  1. Validation - il contrôle les champs obligatoires et les formats (dates, couples SNOMED…). Une ligne invalide est rejetée, avec son motif affiché dans l’aperçu avant import.
  2. Transcodage et mise en qualité - il éclate les codes ADICAP/SNOMED, les traduit en CIM-O-3 (topographie + morphologie) et calcule les groupes (Berg, IARC).
  3. Enregistrement - les lignes valides deviennent des signalements, avec leurs tables filles de codes.

Le rapprochement avec un patient (réconciliation) se fait ensuite, dans une étape séparée : rien à préparer pour ça dans le CSV.

  • Tables filles : les codes packés alimentent deux tables 1:N - report_acp_adicap_codes (un code = une ligne) et report_acp_snomed_codes (un couple T/M = une ligne). Le SI éclate lui-même la cellule packée.
  • Déduplication : clé = structure source + source_exam_id. La structure n’étant pas dans le CSV (choisie à l’interface), c’est bien le couple qui forme le dedup_hash. Au sein d’un même CR, le SI collapse automatiquement les codes ADICAP/SNOMED strictement identiques → ne pas dédupliquer côté data manager.
  • Réimport (export typiquement sur 2 mois glissants) : un même N° de CR → même hash → la ligne en doublon est ignorée (skip), pas réinsérée. La mise à jour d’un CR amendé (relu/complété) n’est pas encore implémentée - stratégie à définir.
  • Transcodage : ADICAP D3 → CIM-O-3 topo, D45678 → CIM-O-3 morpho ; SNOMED via les tables ref_snomed_to_cimo3_*. Codes hémato GFHC reconnus mais non transcodés.
  • Rejet de ligne : patient_last_name ou source_exam_id absent/vide → ligne rejetée. Date obligatoire malformée → rejet (ici aucune date n’est obligatoire, mais une date mal formée part vide). Couple SNOMED malformé (T ou M manquant, format hors [TM]-xxxxx) → rejet de la ligne. Numéro d’exclusion inconnu du catalogue → rejet.
  • Séparateur packé : ; dans adicap_codes/snomed_codes casse le parsing (interprété comme fin de colonne). Toujours |.
  • ADICAP non normalisé : code à 6 caractères non préfixé par XX, ou code à 10 non tronqué → éclatement D1/D2/D3 faussé, donc transcodage CIM-O-3 erroné.
  • Codes hémato H… : reconnus mais droppés du transcodage (pas de morpho CIM-O-3, pas de groupe Berg) → ces lignes n’auront pas de classification tant que la correspondance n’est pas livrée.
  • Codes non-cancer non filtrés : le SI ne les écarte pas → ils créent du bruit (voire des tumeurs parasites). Filtrage obligatoire en amont, en conservant dysplasies/borderline.
  • Topo CIM-O-3 inconnue : fallback C80 (site primitif inconnu) - vérifier que la topographie est bien codée si on veut éviter ce fallback.
  • Clé instable : si source_exam_id change entre deux exports pour le même CR (ex. clé reconstruite non reproductible), le réimport crée un doublon au lieu d’être ignoré.
  • Latéralité unique : une seule latéralité par ligne s’applique à tous les codes - si une ligne mêle deux organes de côtés différents, scinder en deux lignes (deux source_exam_id ou clés distinctes).