Skip to content

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 :

  • computeInheritedValues
  • computeRtpWeights
  • computeIndirectValues
  • computeElevateFactor
  • computeElevatedValues
  • computeIndirectElevatedValues

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 : computeSamplingWeightAndRatio calcule sampling_ratio, sampling_factor et retourne le poids de l’échantillon (base indirecte).
  • Si le lot est parent d’un lot d’échantillonnage : computeParentSamplingWeight reconstitue 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_text vaut par ex. « 50/100 », on déduit sampling_ratio = 50 / 100 et sampling_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 weight du fils est connu, on calcule sampling_ratio = weight_fils / weight_parent.

3.2. Facteurs d’échantillonnage et d’élévation

  • sampling_ratio est 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_factor suit 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_factor quand 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é (si alive_weight_factor connu, 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) via computeRtpContextWeight : 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_weight est 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 × leurs sampling_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_count suit taxon_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 (ou sampling_ratio_text = "50/100")
        • Lot espèce scientifique « Lophius piscatorius », longueur 92 cm, individual_count = 1

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 aucun weight saisi, 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_factor au 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. Ici alive_weight_factor vaut 1,17 (conversion contexte→vif).
  • elevate_context_weight de 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). Sinon weight = 100 kg prime pour la base.

6.2. Parent d’un lot d’échantillonnage

  • Si le parent ne possède pas de weight mais que le fils a sampling_ratio_text = "a/b" et weight (ou indirect_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.

7. Bonnes pratiques d’interprétation

  • Toujours distinguer « poids contexte » et « poids vif ». La colonne elevate_weight représente un poids élevé au vif, alors que elevate_context_weight reste dans le contexte de présentation/état.
  • En présence d’échantillonnage, la fiabilité de sampling_ratio_text amé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.