Calcul de dénormalisation des lots¶
Ce document décrit, pour les usagers des tables DENORMALIZED_BATCH et DENORMALIZED_BATCH_SORT_VAL, le fonctionnement du traitement de dénormalisation des lots implémenté dans SUMARiS Pod
et la manière dont sont calculés les champs clés (poids indirect, poids élevé, poids RTP/WLR, etc.).
NOTE: il peut y avoir des différences entre les valeurs calculées dans SUMARiS Pod et celles calculées par le traitement ETL.
1. Vocabulaire et notions¶
- Lot (Batch) : nœud de l’arbre des prises. Ex. « Catch » (capture totale), « Commercial » (MNZ), « Fraction » (lot échantillonné), « Espèce scientifique » (Lophius piscatorius).
- Arbre dénormalisé : même structure que l’arbre des lots, mais chaque nœud porte des attributs calculés (poids indirect, facteurs d’élévation, poids élevé, etc.).
- Poids « contexte » (context weight) : poids exprimé dans le contexte de présentation/état du lot (éviscéré, frais, …). C’est le poids « tel que saisi », ou reconstitué.
- Poids « vif » (alive/round weight) : poids plein/vif. On l’obtient à partir du poids contexte via un facteur de conversion « état-préservation ».
- RTP/WLR (Relation Taille–Poids) : méthode de calcul d’un poids à partir de longueurs mesurées et de la relation taille–poids disponible pour l’espèce, le sexe, la zone/temps, etc.
- Élévation (elevation) : application des coefficients d’échantillonnage cumulés le long du chemin jusqu’à la capture, afin d’estimer la totalité pêchée.
2. Vue d’ensemble de l’algorithme¶
La logique implémentée se trouve dans DenormalizedBatchServiceImpl.denormalize(...) et ses méthodes auxiliaires :
computeInheritedValuescomputeRtpWeightscomputeIndirectValuescomputeElevateFactorcomputeElevatedValuescomputeIndirectElevatedValues
Les résultats sont stockés dans l’entité DenormalizedBatch (table denormalized_batch) et ses valeurs de tri associées dans DenormalizedBatchSortingValue (table denormalized_batch_sort_val).
A partir du lot racine « Catch », denormalize(...) déroule les étapes suivantes :
1) Parcours et héritage
- Parcours de tout l’arbre (racine → feuilles) et création des DenormalizedBatchVO (méthode streamAllAndMap).
- computeInheritedValues copie/complète les informations héritées du parent (taxon, groupe commercial, drapaux qualité, etc.).
- Sur les feuilles, si l’option « poids vif » est activée, on pré‑calcule le facteur de conversion vers le poids vif (computeAliveWeightFactor).
2) Poids RTP (optionnel)
- Si activé, computeRtpWeights tente de calculer, pour chaque feuille, un poids « RTP contexte » à partir des longueurs et d’une relation taille–poids (computeRtpContextWeight).
- Le poids « RTP contexte » est éventuellement comparé au poids saisi ; un écart au‑delà d’un pourcentage autorisé est logué.
3) Valeurs « indirectes » (reconstitution)
- computeIndirectValues (feuilles → racine) calcule :
- indirect_context_weight : poids contexte reconstitué quand le poids n’est pas directement exploitable (échantillonnage, agrégation par enfants, etc.).
- indirect_rtp_context_weight (si RTP) : analogue en utilisant le poids RTP contexte.
- indirect_individual_count : nombre d’individus reconstitué par somme des enfants (si inventaire exhaustif).
- alive_weight_factor indirect sur les nœuds non feuilles.
4) Facteurs d’élévation
- computeElevateFactor (racine → feuilles) calcule les facteurs cumulés :
- sampling_factor = 1 / sampling_ratio.
- elevate_context_factor = sampling_factor × (facteur du parent).
- taxon_elevate_factor = idem mais seulement quand le nœud (ou son parent) porte un taxon/groupe taxon.
- elevate_factor = elevate_context_factor × alive_weight_factor (si connu), sinon = elevate_context_factor.
5) Valeurs élevées (à la capture)
- computeElevatedValues applique les facteurs :
- Base de calcul « contexte » = weight s’il existe, sinon indirect_context_weight.
- elevate_context_weight = base × elevate_context_factor.
- taxon_elevate_context_weight = base × taxon_elevate_factor (si présent).
- elevate_weight (poids vif élevé) = base × elevate_factor.
- Si RTP : elevate_rtp_context_weight, indirect_rtp_weight (= RTP contexte × facteur vif), elevate_rtp_weight (= RTP contexte × elevate_factor).
- Comptages : elevate_individual_count et taxon_elevate_individual_count.
6) Valeurs élevées « indirectes »
- computeIndirectElevatedValues complète les variantes « indirectes » à partir des précédents résultats quand nécessaire.
3. Détail des calculs essentiels¶
3.1. Poids indirect (indirect_context_weight)¶
Le calcul passe par computeIndirectWeight avec un jeu de règles :
- Si le lot est un lot d’échantillonnage :
computeSamplingWeightAndRatiocalculesampling_ratio,sampling_factoret retourne le poids de l’échantillon (base indirecte). - Si le lot est parent d’un lot d’échantillonnage :
computeParentSamplingWeightreconstitue le poids parent en utilisant le ratio du fils (incluant la notation texte « x/y » si disponible pour une meilleure précision). - Sinon, si le lot a des enfants : somme des poids (directs ou indirects) des enfants (
computeSumChildrenWeight). - Sinon (feuille) : on prend
weight(poids contexte saisi) tel quel.
Remarques :
- Quand
sampling_ratio_textvaut par ex. « 50/100 », on déduitsampling_ratio = 50 / 100etsampling_factor = 100 / 50(si > 0), ce qui améliore la précision par rapport à un ratio décimal arrondi. - Si l’inventaire du parent est exhaustif et que
weightdu fils est connu, on calculesampling_ratio = weight_fils / weight_parent.
3.2. Facteurs d’échantillonnage et d’élévation¶
sampling_ratioest le pourcentage du parent représenté par le lot d’échantillonnage (entre 0 et 1). Exemple : ratio 0,5 signifie 50 %.sampling_factor = 1 / sampling_ratio(0 → facteur 0).- Facteurs cumulés (racine → feuille) :
elevate_context_factor(child) = sampling_factor(child) × elevate_context_factor(parent)(1 pour la racine).taxon_elevate_factorsuit la même logique, seulement si le nœud a un taxon/groupe taxon (ou son parent en a un).elevate_factor = elevate_context_factor × alive_weight_factorquand le facteur « vif » est disponible.
3.3. Poids élevé (elevate_context_weight et elevate_weight)¶
A partir de la base « contexte » B = weight || indirect_context_weight :
elevate_context_weight = B × elevate_context_factor(arrondi à l’échelle poids).elevate_weight = B × elevate_factor→ poids vif élevé (sialive_weight_factorconnu, sinon identique àelevate_context_weight).- Variante taxon :
taxon_elevate_context_weight = B × taxon_elevate_factor.
3.4. RTP/WLR¶
Si l’option RTP est active :
rtp_context_weight(sur feuilles) viacomputeRtpContextWeight: on sélectionne la mesure de longueur pertinente, le sexe (ou non sexé), et une relation taille–poids valide (filtrée par mois/année, zone, taxon, statut). Le résultat est converti en poids « contexte » du lot (inverse du facteur « vif » si nécessaire).indirect_rtp_context_weightest reconstitué par les mêmes règles que 3.1.indirect_rtp_weight = rtp_context_weight × alive_weight_factor.elevate_rtp_weight = rtp_context_weight × elevate_factor.
3.5. Comptages d’individus¶
indirect_individual_count: somme des individus des enfants × leurssampling_factor, récursivement, uniquement si l’inventaire est exhaustif.elevate_individual_count = (individual_count || indirect_individual_count) × elevate_factor(arrondi à l’entier).taxon_elevate_individual_countsuittaxon_elevate_factor.
4. Correspondance avec les colonnes de denormalized_batch¶
Principales colonnes calculées :
weight: poids contexte saisi sur le lot (si présent).indirect_context_weight: poids contexte reconstitué (3.1).elevate_context_weight: poids contexte élevé (3.3).elevate_weight: poids vif élevé (3.3).indirect_rtp_weight,elevate_rtp_weight: variantes basées RTP (3.4).sampling_ratio,sampling_ratio_text,exhaustive_inventory: informations d’échantillonnage.individual_count,indirect_individual_count,elevate_individual_count,taxon_elevate_individual_count: comptages.taxon_elevate_context_weight: poids contexte élevé au niveau taxon.weight_method_fk: méthode de saisie (ex. RTP calculé), utile pour interpréter les écarts.
5. Valeurs de tri DENORMALIZED_BATCH_SORT_VAL¶
Les valeurs de tri (tailles, classes, etc.) issues des mesures du lot sont copiées et marquées comme héritées si elles proviennent d’un parent. Dans le traitement, lorsqu’une valeur est héritée, son rank_order est ajusté (division par 10) pour conserver un ordre stable parent → enfant.
6. Exemples chiffrés¶
6.1. Exemple d’arbre (MNZ)¶
- Lot catch (capture totale)
- Lot commercial MNZ, Présentation=Éviscéré, État=Frais, poids saisi = 100 kg, inventaire exhaustif = oui
- Lot fraction (échantillon), poids saisi = 50 kg,
sampling_ratio = 0,5(ousampling_ratio_text = "50/100")- Lot espèce scientifique « Lophius piscatorius », longueur 92 cm,
individual_count = 1
- Lot espèce scientifique « Lophius piscatorius », longueur 92 cm,
- Lot fraction (échantillon), poids saisi = 50 kg,
- Lot commercial MNZ, Présentation=Éviscéré, État=Frais, poids saisi = 100 kg, inventaire exhaustif = oui
Hypothèses :
- Facteur « vif » (Éviscéré/Frais → Vif/Frais) = 1,17 (exemple).
- La relation taille–poids donne un poids vif RTP = 8,362 kg pour 92 cm et 1 individu.
- Conversion en contexte (éviscéré/frais) : 8,362 / 1,17 = 7,147 kg (
rtp_context_weight).
Calculs :
- Pour la feuille (espèce) :
rtp_context_weight = 7,147 kg. Si aucunweightsaisi, la base contexte pour cette feuille est 7,147 kg. - Pour la fraction :
sampling_ratio = 50/100 = 0,5,sampling_factor = 1 / 0,5 = 2. elevate_context_factorau niveau « fraction » = 2 × (facteur du parent MNZ). Si MNZ est directement sous la capture et n’est pas un échantillon, son facteur = 1.elevate_factor=elevate_context_factor × alive_weight_factor. Icialive_weight_factorvaut 1,17 (conversion contexte→vif).elevate_context_weightde la feuille = 7,147 × 2 = 14,294 kg.elevate_weight(vif) de la feuille = 7,147 × 2 × 1,17 ≈ 16,723 kg.- Au niveau MNZ, si aucun poids saisi :
indirect_context_weight= somme des enfants (par ex. 50 kg si on agrège par le lot d’échantillon et/ou espèces). Sinonweight = 100 kgprime pour la base.
6.2. Parent d’un lot d’échantillonnage¶
- Si le parent ne possède pas de
weightmais que le fils asampling_ratio_text = "a/b"etweight(ouindirect_weight) = a, alors le parent peut être reconstitué à b (cf.computeParentSamplingWeight).
6.3. Comptage indirect des individus¶
- Parent exhaustif avec deux enfants :
- Enfant A :
individual_count = 10,sampling_ratio = 0,5→sampling_factor = 2→ contribution = 20. - Enfant B :
individual_count = 5, pas d’échantillonnage → contribution = 5. indirect_individual_count(parent) = 25.
- Enfant A :
7. Bonnes pratiques d’interprétation¶
- Toujours distinguer « poids contexte » et « poids vif ». La colonne
elevate_weightreprésente un poids élevé au vif, alors queelevate_context_weightreste dans le contexte de présentation/état. - En présence d’échantillonnage, la fiabilité de
sampling_ratio_textaméliore le calcul (évite les erreurs d’arrondi). - Les colonnes
*_rtp_*n’existent que si l’option RTP est activée et que des longueurs + relations valides sont disponibles. - En cas d’inventaire non exhaustif, certaines reconstitutions (poids/individus indirects) peuvent rester nulles.
8. Références code¶
- Méthode principale :
DenormalizedBatchServiceImpl.denormalize. - Indirects :
computeIndirectValues,computeIndirectWeight,computeSamplingWeightAndRatio,computeParentSamplingWeight,computeSumChildrenWeight. - Facteurs :
computeElevateFactor. - Élevations :
computeElevatedValues,computeIndirectElevatedValues. - RTP :
computeRtpWeights,computeRtpContextWeight.