From 66ae3e4d6c9b3290a8d649f1f3bb9267c500631f Mon Sep 17 00:00:00 2001 From: jatkinson1000 <109271713+jatkinson1000@users.noreply.github.com> Date: Wed, 21 Jun 2023 16:11:30 +0100 Subject: [PATCH 1/3] Add clout round data files and handle reading. --- archeryutils/load_rounds.py | 10 ++++++ archeryutils/round_data_files/AGB_clout.json | 32 +++++++++++++++++ archeryutils/round_data_files/WA_clout.json | 38 ++++++++++++++++++++ archeryutils/targets.py | 4 +++ 4 files changed, 84 insertions(+) create mode 100644 archeryutils/round_data_files/AGB_clout.json create mode 100644 archeryutils/round_data_files/WA_clout.json diff --git a/archeryutils/load_rounds.py b/archeryutils/load_rounds.py index d7cae07..11a793b 100644 --- a/archeryutils/load_rounds.py +++ b/archeryutils/load_rounds.py @@ -79,6 +79,14 @@ def read_json_to_round_dict(json_filelist: Union[str, List[str]]) -> Dict[str, R ): round_i["indoor"] = False round_i["location"] = "field" + elif round_i["location"] in ( + "c", + "C", + "clout", + "Clout", + ): + round_i["indoor"] = False + round_i["location"] = "clout" else: warnings.warn( f"Location not recognised for round {round_i['name']}. " @@ -190,8 +198,10 @@ def _make_rounds_dict(json_name: str) -> DotDict: AGB_outdoor_imperial = _make_rounds_dict("AGB_outdoor_imperial.json") AGB_outdoor_metric = _make_rounds_dict("AGB_outdoor_metric.json") AGB_indoor = _make_rounds_dict("AGB_indoor.json") +AGB_clout = _make_rounds_dict("AGB_clout.json") WA_outdoor = _make_rounds_dict("WA_outdoor.json") WA_indoor = _make_rounds_dict("WA_indoor.json") +WA_clout = _make_rounds_dict("WA_clout.json") WA_field = _make_rounds_dict("WA_field.json") IFAA_field = _make_rounds_dict("IFAA_field.json") WA_VI = _make_rounds_dict("WA_VI.json") diff --git a/archeryutils/round_data_files/AGB_clout.json b/archeryutils/round_data_files/AGB_clout.json new file mode 100644 index 0000000..fe4f482 --- /dev/null +++ b/archeryutils/round_data_files/AGB_clout.json @@ -0,0 +1,32 @@ +[ + {"name" : "Imperial Clout (180y)", + "codename" : "imperial_clout_180", + "location" : "clout", + "body" : "WA", + "passes" : [{"n_arrows" : 36, "diameter" : 365.76, "scoring" : "imperial_clout", "distance" : 180, "dist_unit" : "yard"}] + }, + {"name" : "Imperial Clout (140y)", + "codename" : "imperial_clout_140", + "location" : "clout", + "body" : "WA", + "passes" : [{"n_arrows" : 36, "diameter" : 365.76, "scoring" : "imperial_clout", "distance" : 140, "dist_unit" : "yard"}] + }, + {"name" : "Imperial Clout (120y)", + "codename" : "imperial_clout_120", + "location" : "clout", + "body" : "WA", + "passes" : [{"n_arrows" : 36, "diameter" : 365.76, "scoring" : "imperial_clout", "distance" : 120, "dist_unit" : "yard"}] + }, + {"name" : "Imperial Clout (100y)", + "codename" : "imperial_clout_100", + "location" : "clout", + "body" : "AGB", + "passes" : [{"n_arrows" : 36, "diameter" : 365.76, "scoring" : "imperial_clout", "distance" : 100, "dist_unit" : "yard"}] + }, + {"name" : "Imperial Clout (80y)", + "codename" : "imperial_clout_80", + "location" : "clout", + "body" : "AGB", + "passes" : [{"n_arrows" : 36, "diameter" : 365.76, "scoring" : "imperial_clout", "distance" : 80, "dist_unit" : "yard"}] + } +] diff --git a/archeryutils/round_data_files/WA_clout.json b/archeryutils/round_data_files/WA_clout.json new file mode 100644 index 0000000..4af137d --- /dev/null +++ b/archeryutils/round_data_files/WA_clout.json @@ -0,0 +1,38 @@ +[ + {"name" : "WA Clout (185m)", + "codename" : "wa_clout_185", + "location" : "clout", + "body" : "WA", + "passes" : [{"n_arrows" : 36, "diameter" : 1500, "scoring" : "metric_clout", "distance" : 185, "dist_unit" : "metre"}] + }, + {"name" : "WA Clout (165m)", + "codename" : "wa_clout_165", + "location" : "clout", + "body" : "WA", + "passes" : [{"n_arrows" : 36, "diameter" : 1500, "scoring" : "metric_clout", "distance" : 165, "dist_unit" : "metre"}] + }, + {"name" : "WA Clout (125m)", + "codename" : "wa_clout_125", + "location" : "clout", + "body" : "WA", + "passes" : [{"n_arrows" : 36, "diameter" : 1500, "scoring" : "metric_clout", "distance" : 125, "dist_unit" : "metre"}] + }, + {"name" : "Metric Clout (110m)", + "codename" : "metric_clout_110", + "location" : "clout", + "body" : "AGB", + "passes" : [{"n_arrows" : 36, "diameter" : 1500, "scoring" : "metric_clout", "distance" : 110, "dist_unit" : "metre"}] + }, + {"name" : "Metric Clout (90m)", + "codename" : "wa_clout_90", + "location" : "clout", + "body" : "AGB", + "passes" : [{"n_arrows" : 36, "diameter" : 1500, "scoring" : "metric_clout", "distance" : 90, "dist_unit" : "metre"}] + }, + {"name" : "Metric Clout (75m)", + "codename" : "wa_clout_75", + "location" : "clout", + "body" : "AGB", + "passes" : [{"n_arrows" : 36, "diameter" : 1500, "scoring" : "metric_clout", "distance" : 75, "dist_unit" : "metre"}] + } +] diff --git a/archeryutils/targets.py b/archeryutils/targets.py index f8d986f..89e5fe7 100644 --- a/archeryutils/targets.py +++ b/archeryutils/targets.py @@ -47,6 +47,8 @@ def __init__( "Beiter_hit_miss", "Worcester", "Worcester_2_ring", + "imperial_clout", + "metric_clout", ] if scoring_system not in systems: @@ -120,6 +122,8 @@ def max_score(self) -> float: "IFAA_field_expert", "Worcester", "Worcester_2_ring", + "imperial_clout", + "metric_clout", ): return 5.0 if self.scoring_system in ("Beiter_hit_miss"): From e444201dc026dc8c8d82ab2cd82f6ace7915ac22 Mon Sep 17 00:00:00 2001 From: jatkinson1000 <109271713+jatkinson1000@users.noreply.github.com> Date: Wed, 21 Jun 2023 16:28:45 +0100 Subject: [PATCH 2/3] Add clout scoring systems. --- archeryutils/handicaps/handicap_equations.py | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/archeryutils/handicaps/handicap_equations.py b/archeryutils/handicaps/handicap_equations.py index c7343ef..8f2ffb5 100644 --- a/archeryutils/handicaps/handicap_equations.py +++ b/archeryutils/handicaps/handicap_equations.py @@ -20,7 +20,9 @@ - IFAA_field - Beiter-hit-miss - Worcester - - Worcester 2-ring) + - Worcester (2-ring) + - Imperial Clout + - WA/Metric Clout Routine Listings ---------------- @@ -443,7 +445,7 @@ def arrow_score( # pylint: disable=too-many-branches elif target.scoring_system == "Beiter_hit_miss": s_bar = 1.0 - np.exp(-((((tar_dia / 2.0) + arw_rad) / sig_r) ** 2)) - elif target.scoring_system in ("Worcester", "IFAA_field_expert"): + elif target.scoring_system in ("Worcester", "IFAA_field_expert", "metric_clout"): s_bar = 5.0 - sum( np.exp(-((((n * tar_dia / 10.0) + arw_rad) / sig_r) ** 2)) for n in range(1, 6) @@ -456,6 +458,16 @@ def arrow_score( # pylint: disable=too-many-branches - 4.0 * np.exp(-((((2 * tar_dia / 10.0) + arw_rad) / sig_r) ** 2)) ) + elif target.scoring_system == "imperial_clout": + s_bar = ( + 5.0 + - np.exp(-((((tar_dia / 16.0) + arw_rad) / sig_r) ** 2)) + - sum( + np.exp(-((((n * tar_dia / 8.0) + arw_rad) / sig_r) ** 2)) + for n in range(2, 6) + ) + ) + else: raise ValueError( f"No rule for calculating scoring for face type {target.scoring_system}." From bc9d6ecb2d03cc35b81e99ee0245a9a5b6fcbaae Mon Sep 17 00:00:00 2001 From: jatkinson1000 <109271713+jatkinson1000@users.noreply.github.com> Date: Wed, 21 Jun 2023 16:31:17 +0100 Subject: [PATCH 3/3] Add clout abbreviations. --- archeryutils/handicaps/handicap_functions.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/archeryutils/handicaps/handicap_functions.py b/archeryutils/handicaps/handicap_functions.py index 944cfc1..53b362e 100644 --- a/archeryutils/handicaps/handicap_functions.py +++ b/archeryutils/handicaps/handicap_functions.py @@ -82,6 +82,9 @@ def print_handicap_table( "Small": "Sm", "Gents": "G", "Ladies": "L", + "Imperial": "I.", + "Metric Clout": "M. Clt", + "Clout": "Clt", } if not isinstance(hcs, np.ndarray):