EXTRACT band-aware Farbschlag: deep bands (gen>=2) have no colour cell
Julian-confirmed against the real xlsx (Kentucky, Akio Kids): pedigree blocks have two shapes. EARLY bands (gen 0-1, cols B/E/H) are 5-cell Name/DOB/Farbschlag/Genotype/Zucht — real Farbschlag present. DEEP bands (gen>=2, cols K/N/Q...) are 3-cell Name/DOB/Genotype with NO Farbschlag — the colour is derived from the genotype. The old extractor grabbed the NEXT block's name or a stray health note (e.g. "DD-Tumor", "Chronische Ohrenentzündung...") as the deep-band Farbschlag — source of the D1 'name-in-Farbschlag' conflicts and a big chunk of farbschlagUnmatched. Fix: gen_of(col)>=2 => never assign a Farbschlag in that block (Name/DOB/Genotype only); the cell is left for the next block's name search. Deep-band animals load with empty Farbschlag and the UI computes 'Errechnet' from the stored genotype (lossless). Dedup already prefers a real (non-empty) early-band Farbschlag, so an animal appearing in both an early band (Chesnut -> 'Kohlfuchsschimmel') and deep bands keeps the real value; Chesnut and Tennessee stay separate (distinct genotype + name+DOB key). Result: 248/306 loadable animals now have empty Farbschlag (genotype- derived), 0 suspicious name/note values remain, 0 Farbschlag-based conflicts (D1 dissolved). Regression test test_extract.py builds a two-band xlsx and asserts the deep band yields no Farbschlag + the stray note doesn't bleed. Extractor-only (no C# change). python test_genotype + test_extract green; dotnet 118/118. Batches with Kevin's GEN-3f seed for one re-import. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -211,6 +211,11 @@ def extract_stammbaum(path):
|
||||
farbschlag = ""
|
||||
geno = geno0
|
||||
breeder = ""
|
||||
# BAND-AWARE (Julian-confirmed): early bands (gen 0-1, cols B/E/H) are 5-cell blocks
|
||||
# WITH a Farbschlag cell; deep bands (gen >= 2, cols K/N/Q...) are 3-cell blocks
|
||||
# (Name/DOB/Genotype) with NO Farbschlag — colour is derived from the genotype. So in
|
||||
# deep bands we must NOT grab the next block's name or a stray health note as Farbschlag.
|
||||
deep_band = gen_of(c) >= 2
|
||||
for rr in range(r + 1, r + 4):
|
||||
cell = cells.get((c, rr))
|
||||
if not cell:
|
||||
@@ -221,7 +226,7 @@ def extract_stammbaum(path):
|
||||
elif re.search(r"\b(Zucht|Privatzucht)\b", cell) or cell.startswith("("):
|
||||
breeder = cell
|
||||
used.add((c, rr))
|
||||
elif not farbschlag and not re.match(r"^\*?\s?\d", cell) \
|
||||
elif not deep_band and not farbschlag and not re.match(r"^\*?\s?\d", cell) \
|
||||
and not looks_like_animal_name(cell):
|
||||
farbschlag = cell
|
||||
used.add((c, rr))
|
||||
|
||||
Reference in New Issue
Block a user