TrofeoGP_2025/merge_races.py

106 lines
4.1 KiB
Python
Raw Permalink Normal View History

2025-03-26 15:39:35 +01:00
#!/usr/bin/python
# -*- coding: utf-8 -*-
from pyiofload import *
import os
source_dir = 'xmls'
def do_merge_races(xmlfile1, xmlfile2, class_remap=None, club_ko=None, fiso_code=0):
race1 = Race()
race2 = Race()
race1.load_from_iofxml(filename_=xmlfile1, class_remap=class_remap, clubs_ko=club_ko, avoid_unk=True)
race2.load_from_iofxml(filename_=xmlfile2, class_remap=class_remap, clubs_ko=club_ko, avoid_unk=True)
# print(race1.name, race1.date)
# print(race2.name, race2.date)
classes1_set = set(race1.classes.keys())
classes2_set = set(race2.classes.keys())
classes_both = classes1_set & classes2_set
# print(len(classes1_set), len(classes2_set), len(classes_both))
# print(classes1_set == classes2_set)
if classes1_set != classes2_set:
raise Exception('Different classes!')
runners1_set = set(race1.runners.keys())
runners2_set = set(race2.runners.keys())
# print(len(runners1_set), runners1_set)
# print(len(runners2_set), runners2_set)
runners_both = runners1_set & runners2_set
# print(len(runners_both))
runners_one_only = runners1_set - runners_both
runners_two_only = runners2_set - runners_both
# print(runners_one_only)
# print(runners_two_only)
for id_to_remove in runners_one_only:
race1.runners.pop(id_to_remove, None)
for id_to_remove in runners_two_only:
race2.runners.pop(id_to_remove, None)
runners1_set = set(race1.runners.keys())
runners2_set = set(race2.runners.keys())
# print(len(runners1_set), runners1_set)
# print(len(runners2_set), runners2_set)
combined_race = Race(fiso_code=fiso_code)
combined_race.name = race1.name + '_' + race2.name
combined_race.date = race2.date
combined_race.classes = race2.classes
combined_race.clubs = {**race1.clubs, **race2.clubs}
combined_runners = {}
for rid in runners_both:
# print(race1.runners[rid])
# print(race2.runners[rid])
runner = Runner(name=race1.runners[rid].name,
family=race1.runners[rid].family,
fisoid=race1.runners[rid].fisoid,
class_=race1.runners[rid].class_,
club=race1.runners[rid].club,
clubid=race1.runners[rid].clubid,
sicard=race1.runners[rid].sicard,
total=race1.runners[rid].time + race2.runners[rid].time
)
combined_runners[rid] = runner
# print(runner)
combined_race.runners = combined_runners
for cid, class_ in combined_race.classes.items():
class_.min = None
class_.max = None
class_.avg = 0.0
class_.tot_t = 0.0
both_runners = [rid for rid in class_.runnersid if rid in combined_race.runners]
# print(both_runners)
both_runners.sort(key=lambda x: combined_race.runners[x].time)
# print(both_runners)
class_.runnersid = both_runners
if both_runners is None:
continue
for rank, rid in enumerate(class_.runnersid):
r = combined_race.runners[rid]
r.place = rank + 1
# print(r)
if class_.min is None or class_.min > r.time:
class_.min = r.time
if class_.max is None or class_.max < r.time:
class_.max = r.time
class_.tot_t += r.time
class_.avg = class_.tot_t / float(len(class_.runnersid))
# print(class_)
return combined_race, race1, race2
if __name__ == '__main__':
cf, r1, r2 = do_merge_races(os.path.join(source_dir, 'POC-1_2019109.xml'), os.path.join(source_dir, 'POC-2_2019110.xml'))
for cid, c in cf.classes.items():
print(c.name)
for rid in c.runnersid:
r = cf.runners[rid]
# print(r)
tt = time.strftime('%H:%M:%S', time.gmtime(r.time))
t1 = time.strftime('%H:%M:%S', time.gmtime(r1.runners[rid].time))
t2 = time.strftime('%H:%M:%S', time.gmtime(r2.runners[rid].time))
print('{:2} {:15} {:15} tempo_totale: {} ({} {})'.format(
r.place, r.name, r.family, tt, t1, t2)
)