Deze repository bevat scripts die als hulpmiddel dienen voor het uitvoeren van Onderdeel A van het Controleprotocol Centraal Stembureau. De scripts worden door Wonderbit op het platform teluitslagen uitgevoerd, waarbij een geüploadde .zip met tellingsbestanden (.eml) en proces verbalen in .odt formaat de trigger zijn.
De gemakkelijkste manier is met behulp van uv. Als uv geinstalleerd is, is hcp te draaien vanuit de root directory. Hiermee wordt automatisch de .odt en het .eml.xml bestand uit het zip bestand gehaald dat door OSV-2020 geproduceerd wordt gebruikt om hcp over te draaien. Bijvoorbeeld:
uv run hcp definitieve-documenten_tk2060_gemeente_juinen-20600607-152117.zip
De output wordt weggeschreven in de directory van waaruit hcp aangeroepen is als a.csv, b.csv en c.csv.
De code is ook direct vanuit Python aan te roepen. De functie create_csv_files in main.py is het ingangspunt voor de code. Parameters voor het aanroepen van deze functie zijn:
path_to_xml: het pad naar het.eml.xmlbestand waarover je de controle uit wilt voeren. Dit is dus een EML tellingsbestand (id=510[a-dqrs])dest_a,dest_b,dest_c: paden waar respectievelijk controlebestandena,bencweggeschreven moeten worden. De precieze inhoud van deze bestanden wordt hieronder beschrevenpath_to_odt: optionele parameter, pad naar een proces verbaal in.odtformaat. Geldige bestanden zijnModel_Na31-1.odtvoor een decentrale- enModel_Na31-2.odtvoor een centrale stemopneming.path_to_neighbourhood_data: optionele parameter, pad naar wijkdata in.parquetof.csvformaat. Indata/staat het meest recente beschikbare bestand. (CBS update deze eens in de zoveel tijd, dus deze zal niet altijd 100% up-to-date zijn).
Hieronder een korte beschrijving van de controles die onderdeel zijn van HCP. Deze zijn geïmplementeerd in protocol_checks.py en worden aangeroepen in EML::run_protocol in eml.py.
| Naam controle | Beschrijving | Output |
|---|---|---|
check_zero_votes |
Controleert of het totaal aantal stemmen (getelde + ongeldige + blanco stemmen) gelijk is aan 0 | In b.csv een "ja" in de kolom "Stembureau met nul stemmen" bij stembureaus waar dit het geval is |
check_inexplicable_difference |
Geeft de waarde terug die ingevuld is onder 'geen verklaring' in de EML | In a.csv een waarde in de kolom "Aantal geen verklaring voor verschil" bij stembureaus mits deze ongelijk is aan 0 |
check_explanation_sum_difference |
Geeft het verschil tussen (het totaal aantal stemmen en het aantal toegelaten kiezers) en de som van de ingevulde verklaringen. Dus bij 6 stemmen, 5 toegelaten kiezers en een som van verklaringen van 0 is deze waarde 1 ((6-5) - 0) |
In a.csv het aantal dat uit deze verschilberekening komt in de kolom "Aantal ontbrekende verklaringen voor verschil" mits deze ongelijk is aan 0 |
check_too_many_rejected_votes |
Controleert of het percentage blanco of ongeldige stemmen ten opzichte van het totaal aantal uitgebrachte stemmen groter of gelijk is aan een in te stellen percentage. | In b.csv een "ja ({percentage}%)" in de bijbehorende kolom bij stembureaus waar dit het geval is |
check_too_many_differences |
Controleert of het absolute verschil tussen toegelaten kiezers ten het totaal aantal uitgebrachte stemmen groter of gelijk is aan een in te stellen percentage of absoluuut aantal. | In b.csv een "ja ({percentage}%)" of "ja ({aantal})" in de bijbehorende kolom bij stembureaus waar dit het geval is |
check_parties_with_large_percentage_difference |
Controleert of er partijen zijn die bij een stembureau een percentage stemmen heeft behaald dat ten minste een in te stellen aantal percentagepunten verschilt van het gemiddelde in die gemeente. Voor de berekening van het gemiddelde in die gemeente wordt het betreffende stembureau niet meegenomen | In b.csv de namen van de partijen waarvoor dit het geval is, gescheiden door een komma bij de stembureaus waar dit het geval is |
check_potentially_switched_candidates |
Controleert of voorkeursstemmen tussen twee kandidaten op dezelfde lijst mogelijk verwisseld zijn. Dat wil zeggen dat een van de kandidaten veel meer (in te stellen hoeveel) stemmen heeft gekregen dan verwacht terwijl een ander veel minder gekregen heeft dan verwacht. | In b.csv de paren kandidaten waarvoor dit het geval is, gescheiden door een , in het formaat: "Mogelijke verwisseling op lijst i (lijstnaam). Kandidaat j had v_j stemmen maar verwachting was e_j. Kandidaat k had v_k stemmen maar verwachting was e_k" |
Naast de checks die hierboven beschreven zijn, kan ook het proces-verbaal dat bij een telbestand meegeleverd wordt geparsed worden. Het doel hiervan is om stembureau's te identificeren die al een hertelling uitgevoerd hebben. Als dit het geval is, dan wordt in a.csv de waarde "x of ja" toegevoegd aan de kolom "Al herteld". In alle gevallen moet zowel het nummer als de naam van het stembureau genoteerd staan om zeker te weten dat we deze koppelen aan het juiste stembureau in de EML. Is deze koppeling om welke reden dan ook niet mogelijk, dan gaat dit script er van uit dat er niet herteld is.
De informatie is afkomstig uit:
Stembureaus die onder 3b. of 3c. genoteerd staan.
Stembureaus die onder 7. genoteerd staan.