diff --git a/assets/data/SOT/flightscope_SoT.csv b/assets/data/SOT/flightscope_SoT.csv index a261135..eaf28db 100644 --- a/assets/data/SOT/flightscope_SoT.csv +++ b/assets/data/SOT/flightscope_SoT.csv @@ -1,7 +1,6 @@ shot_name,filename,speed_mph,vla_deg,hla_deg,total_spin_rpm,spin_axis_deg,backspin_rpm,sidespin_rpm,carry_yd,total_yd,rollout_yd,apex_ft 5iron,5iron.json,102.10,17.40,1.50,5391.0,12.30,5266.0,1151.0,138.1,142.2,0.0,59.6 approach_mid_iron_test_shot,approach_mid_iron_test_shot.json,93.90,22.90,-2.60,5375.0,2.00,5375.0,0.0,125.8,128.5,0.0,69.3 -approach_test_shot,approach_test_shot.json,81.05,30.50,1.35,10489.8,5.74,10454.8,699.3,92.2,91.5,0.0,72.2 bump_and_run,bump_and_run.json,58.27,15.57,-0.85,1850.1,2.31,1700.4,75.7,43.8,62,0.0,10.1 bump_and_run_slow,bump_and_run_slow.json,30.27,15.57,-0.85,1850.1,2.31,1700.4,75.7,0.0,0.0,0.0,0.0 bump_test_shot,bump_test_shot.json,78.27,5.57,-0.85,1850.1,2.31,1700.4,75.7,39,74,0.0,3.1 diff --git a/assets/data/approach_test_shot.json b/assets/data/approach_test_shot.json deleted file mode 100644 index b061251..0000000 --- a/assets/data/approach_test_shot.json +++ /dev/null @@ -1,35 +0,0 @@ -{ - "DeviceID": "PiTrac LM 0.1", - "Units": "Yards", - "ShotNumber": 13, - "APIversion": "1", - "BallData" : { - "Speed": 105, - "SpinAxis": -1.0, - "TotalSpin": 6825, - "BackSpin": 6825, - "SideSpin": 0, - "HLA": 8.0, - "VLA": 22.41, - "CarryDistance": 0.0 - }, - "ClubData": { - "Speed": 0.0, - "AngleOfAttack": 0.0, - "FaceToTarget": 0.0, - "Lie": 0.0, - "Loft": 0.0, - "Path": 0.0, - "SpeedAtImpact": 0.0, - "VerticalFaceImpact": 0.0, - "HorizontalFaceImpact": 0.0, - "ClosureRate": 0.0 - }, - "ShotDataOptions": { - "ContainsBallData": true, - "ContainsClubData": false, - "LaunchMonitorIsReady": true, - "LaunchMonitorBallDetected": true, - "IsHeartBeat": false - } -} diff --git a/assets/data/calibration/flightscope.csv b/assets/data/calibration/flightscope.csv index 703e806..0fcc3f9 100644 --- a/assets/data/calibration/flightscope.csv +++ b/assets/data/calibration/flightscope.csv @@ -1,7 +1,6 @@ shot_name,filename,speed_mph,vla_deg,hla_deg,total_spin_rpm,spin_axis_deg,backspin_rpm,sidespin_rpm,carry_yd,total_yd,rollout_yd,apex_ft 5iron,5iron.json,102.10,17.40,1.50,5391.0,12.30,5266.0,1151.0,138.1,142.2,0.0,59.6 approach_mid_iron_test_shot,approach_mid_iron_test_shot.json,93.90,22.90,-2.60,5375.0,2.00,5375.0,0.0,125.8,128.5,0.0,69.3 -approach_test_shot,approach_test_shot.json,81.05,30.50,1.35,10489.8,5.74,10454.8,699.3,92.2,91.5,0.0,72.2 bump_and_run,bump_and_run.json,58.27,15.57,-0.85,1850.1,2.31,1700.4,75.7,43.8,62,0.0,10.1 bump_and_run_slow,bump_and_run_slow.json,30.27,15.57,-0.85,1850.1,2.31,1700.4,75.7,0.0,0.0,0.0,0.0 bump_test_shot,bump_test_shot.json,78.27,5.57,-0.85,1850.1,2.31,1700.4,75.7,39,74,0.0,3.1 @@ -40,3 +39,65 @@ s2_shot_24,shot_24.json,121.48,14.53,-11.23,3172.9,-6.80,3150.6,-375.5,183.0,192 s2_shot_26,shot_26.json,116.97,18.42,-2.02,5035.4,9.70,4963.4,848.2,170.7,174.2,3.5,88.1 s2_shot_27,shot_27.json,112.96,17.59,-2.26,4291.5,12.21,4194.4,907.8,164.5,169.6,5.1,73.6 s2_shot_9,shot_9.json,94.41,20.07,2.40,4020.4,16.33,3858.1,1130.8,126.5,132.5,6.0,54.8 +s3_shot_3w_18,shot_3w_18.json,47.91,45.81,33.98,7491.0,30.00,6487.4,3745.5,0.0,0.0,0.0,0.0 +s3_shot_3w_19,shot_3w_19.json,121.33,5.59,-4.84,1661.5,-11.89,1625.9,-342.2,120.6,165.8,45.2,12.2 +s3_shot_3w_21,shot_3w_21.json,119.40,5.31,-3.43,1759.7,-10.46,1730.5,-319.5,114.6,160.5,45.9,10.9 +s3_shot_3w_22,shot_3w_22.json,108.89,5.62,-7.25,2500.8,-1.78,2499.6,-77.5,103.2,141.3,38.1,10.5 +s3_shot_3w_23,shot_3w_23.json,115.83,8.90,-0.78,2804.3,2.19,2802.2,107.3,147.7,170.9,23.2,28.0 +s3_shot_3w_24,shot_3w_24.json,123.42,6.29,-5.42,2751.6,-13.27,2678.1,-631.8,145.9,176.7,30.8,19.8 +s3_shot_5i_10,shot_5i_10.json,87.96,14.22,1.21,4064.7,8.41,4021.0,594.4,103.1,116.7,13.6,28.4 +s3_shot_5i_11,shot_5i_11.json,90.59,14.45,-0.21,3360.4,7.80,3329.3,456.2,108.8,124.1,15.3,29.8 +s3_shot_5i_12,shot_5i_12.json,74.19,10.23,-1.67,3321.4,15.75,3196.7,901.5,58.4,81.9,23.5,9.4 +s3_shot_5i_13,shot_5i_13.json,75.04,8.01,2.53,3921.4,3.42,3914.4,234.0,53.9,78.9,25.0,6.8 +s3_shot_5i_15,shot_5i_15.json,86.90,9.35,-4.02,2508.9,-4.94,2499.6,-216.2,78.6,106.6,28.0,12.1 +s3_shot_5i_16,shot_5i_16.json,97.99,9.13,-2.08,3775.9,1.68,3774.3,110.7,109.1,130.0,20.9,19.7 +s3_shot_5i_17,shot_5i_17.json,56.46,9.97,24.15,5178.3,29.12,4523.9,2519.7,30.6,46.9,16.3,4.5 +s3_shot_6i_35,shot_6i_35.json,80.55,15.35,-1.30,4667.1,-0.03,4667.1,-2.8,90.0,101.5,11.5,26.4 +s3_shot_6i_36,shot_6i_36.json,78.86,10.40,16.08,4166.0,25.12,3771.9,1768.7,67.8,89.1,21.3,11.8 +s3_shot_6i_37,shot_6i_37.json,82.57,10.16,11.01,3041.1,25.35,2748.4,1301.8,71.5,97.2,25.7,11.8 +s3_shot_6i_38,shot_6i_38.json,79.12,13.35,3.04,3186.9,11.59,3121.9,640.2,79.2,97.5,18.3,18.0 +s3_shot_6i_39,shot_6i_39.json,60.98,6.14,10.35,3284.8,22.03,3044.9,1232.2,24.0,47.3,23.3,2.1 +s3_shot_6i_40,shot_6i_40.json,62.11,6.80,27.01,2768.0,30.00,2397.2,1384.0,26.2,51.1,24.9,2.5 +s3_shot_6i_41,shot_6i_41.json,82.53,9.88,-2.28,2620.2,13.56,2547.1,614.5,71.3,97.9,26.6,11.3 +s3_shot_6i_42,shot_6i_42.json,77.19,13.14,-3.42,4057.2,4.14,4046.6,293.2,76.6,92.9,16.3,17.5 +s3_shot_6i_43,shot_6i_43.json,94.06,13.88,-4.68,4616.2,1.70,4614.2,137.0,117.3,128.6,11.3,35.0 +s3_shot_6i_44,shot_6i_44.json,114.96,9.46,-6.67,2314.5,15.10,2234.6,602.8,142.3,168.2,25.9,26.6 +s3_shot_6i_45,shot_6i_45.json,109.32,6.42,-9.00,2509.9,-10.87,2464.9,-473.5,109.6,145.4,35.8,12.9 +s3_shot_6i_46,shot_6i_46.json,116.33,13.65,0.34,3007.9,10.67,2955.8,557.1,167.3,179.3,12.0,51.6 +s3_shot_6i_47,shot_6i_47.json,99.48,14.78,-2.86,4810.7,4.69,4794.6,393.7,131.2,137.7,6.5,45.0 +s3_shot_6i_48,shot_6i_48.json,101.73,15.23,-3.03,4631.0,4.26,4618.2,344.4,137.1,143.5,6.4,48.9 +s3_shot_6i_49,shot_6i_49.json,71.25,7.70,16.05,2624.7,30.00,2273.0,1312.3,39.9,70.3,30.4,4.5 +s3_shot_6i_50,shot_6i_50.json,82.80,14.85,-1.42,3783.4,2.81,3778.8,185.4,93.2,107.4,14.2,25.6 +s3_shot_7i_25,shot_7i_25.json,83.34,13.18,2.98,3409.5,17.79,3246.5,1041.7,86.9,104.8,17.9,20.1 +s3_shot_7i_26,shot_7i_26.json,73.37,10.85,15.40,3560.9,30.00,3083.8,1780.4,56.6,79.3,22.7,9.6 +s3_shot_7i_27,shot_7i_27.json,93.74,17.06,-1.45,4611.6,2.63,4606.7,211.8,122.3,128.3,6.0,46.0 +s3_shot_7i_28,shot_7i_28.json,92.09,16.41,-3.60,4216.7,-0.44,4216.6,-32.4,117.9,125.6,7.7,40.6 +s3_shot_7i_29,shot_7i_29.json,107.59,13.82,-6.05,3633.3,4.72,3621.0,298.7,148.4,158.3,9.9,46.3 +s3_shot_7i_30,shot_7i_30.json,90.17,17.56,-3.83,4508.5,-0.21,4508.5,-16.5,115.4,121.7,6.3,43.1 +s3_shot_7i_31,shot_7i_31.json,76.36,17.52,-0.54,5122.2,1.84,5119.5,164.7,85.0,94.5,9.5,28.4 +s3_shot_7i_32,shot_7i_32.json,93.10,16.96,-1.03,3762.5,4.20,3752.4,275.6,121.2,129.8,8.6,42.5 +s3_shot_7i_33,shot_7i_33.json,92.36,16.96,-0.58,3851.7,2.81,3847.1,188.9,119.7,128.0,8.3,42.0 +s3_shot_7i_34,shot_7i_34.json,104.19,14.67,-4.63,4081.2,1.90,4079.0,135.0,142.5,150.6,8.1,48.2 +s3_shot_9i_1,shot_9i_1.json,88.98,15.10,-0.50,3563.2,11.26,3494.6,695.8,106.7,120.8,14.1,30.8 +s3_shot_9i_2,shot_9i_2.json,71.29,23.93,5.51,4085.5,8.31,4042.7,590.2,82.1,87.4,5.3,36.8 +s3_shot_9i_3,shot_9i_3.json,90.11,21.67,2.80,5243.0,11.20,5143.3,1018.1,117.3,120.7,3.4,57.7 +s3_shot_9i_5,shot_9i_5.json,84.02,19.37,3.82,5352.1,11.48,5245.0,1065.2,102.7,107.2,4.5,41.8 +s3_shot_9i_7,shot_9i_7.json,83.03,22.51,5.26,7008.5,9.70,6908.3,1181.2,101.1,102.6,1.5,51.5 +s3_shot_9i_8,shot_9i_8.json,92.21,21.95,-6.31,5042.3,0.73,5041.8,64.2,122.9,126.4,3.5,62.6 +s3_shot_9i_9,shot_9i_9.json,90.06,22.14,-3.09,5351.1,1.21,5349.9,113.3,118.1,121.1,3.0,60.1 +s3_shot_driver_51,shot_driver_51.json,116.17,21.74,2.17,6409.0,3.23,6398.8,360.7,162.9,164.3,1.4,108.7 +s3_shot_driver_52,shot_driver_52.json,102.11,31.33,3.09,8442.2,6.26,8391.8,921.1,124.5,124.1,-0.4,119.3 +s3_shot_driver_53,shot_driver_53.json,97.23,30.63,2.23,8925.8,5.99,8877.1,931.1,117.6,117.1,-0.5,105.8 +s3_shot_driver_54,shot_driver_54.json,121.50,12.88,-5.26,3410.9,-9.97,3359.4,-590.5,178.2,188.7,10.5,56.5 +s3_shot_driver_55,shot_driver_55.json,117.48,7.48,-8.33,2150.0,-27.19,1912.4,-982.4,125.6,161.8,36.2,17.2 +s3_shot_driver_56,shot_driver_56.json,118.70,17.12,-1.80,4553.8,2.81,4548.4,222.9,176.6,180.9,4.3,83.2 +s3_shot_driver_57,shot_driver_57.json,120.93,14.10,-5.16,1544.1,-7.96,1529.2,-213.7,177.6,197.0,19.4,50.9 +s3_shot_driver_58,shot_driver_58.json,119.27,23.59,2.48,7093.4,3.26,7081.9,403.5,163.2,163.9,0.7,125.7 +s3_shot_driver_59,shot_driver_59.json,80.96,44.91,8.87,6735.0,12.36,6578.8,1442.0,83.7,83.2,-0.5,107.8 +s3_shot_driver_60,shot_driver_60.json,107.39,11.67,-8.62,3268.6,-14.80,3160.1,-835.0,138.5,153.8,15.3,34.0 +s3_shot_pw_64,shot_pw_64.json,69.63,28.57,0.16,5327.2,5.10,5306.2,473.4,80.1,82.4,2.3,46.4 +s3_shot_pw_65,shot_pw_65.json,81.25,28.38,2.89,6959.4,9.38,6866.3,1134.7,98.5,99.4,0.9,65.6 +s3_shot_pw_66,shot_pw_66.json,75.71,27.32,-1.17,6605.0,3.99,6589.0,460.1,89.7,90.8,1.1,53.5 +s3_shot_pw_67,shot_pw_67.json,81.66,28.12,6.34,6509.6,12.74,6349.4,1435.1,100.0,101.1,1.1,65.0 +s3_shot_pw_68,shot_pw_68.json,88.55,23.37,-0.05,6637.4,6.04,6600.5,698.8,112.7,114.1,1.4,63.4 +s3_shot_pw_69,shot_pw_69.json,74.06,23.61,0.18,5880.4,8.45,5816.5,864.4,86.0,88.8,2.8,41.2 diff --git a/assets/data/calibration/history/iteration_023.json b/assets/data/calibration/history/iteration_023.json new file mode 100644 index 0000000..ebad37a --- /dev/null +++ b/assets/data/calibration/history/iteration_023.json @@ -0,0 +1,341 @@ +{ + "iteration": 23, + "timestamp": "2026-03-13T15:08:17.411831", + "profile_overrides": { + "Flight": { + "HighLaunchDragVlaStartDeg": 26.0, + "HighLaunchDragVlaFullDeg": 33.0, + "HighLaunchDragBoostMax": 1.2, + "SpinDragProgressiveCapSrStart": 0.33, + "SpinDragProgressiveCapSrEnd": 0.5, + "SpinDragProgressiveCapBoostMax": 0.25, + "HighReMidSpinGain": 16.0, + "MidSpinClBoostSrStart": 0.17, + "MidSpinClBoostSrEnd": 0.31, + "MidSpinClBoostMax": 0.5 + } + }, + "summary": { + "pass": 8, + "moderate": 11, + "severe": 20, + "no_reference": 2 + }, + "per_shot": { + "5iron": { + "diff_carry_yd": 5.6, + "diff_total_yd": 12.1, + "diff_apex_ft": 5.0, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "approach_mid_iron_test_shot": { + "diff_carry_yd": 0.0, + "diff_total_yd": 7.9, + "diff_apex_ft": -4.7, + "status": "moderate", + "error_pattern": "ROLLOUT_TOO_LONG" + }, + "approach_test_shot": { + "diff_carry_yd": 62.1, + "diff_total_yd": 74.5, + "diff_apex_ft": 10.8, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "bump_and_run": { + "diff_carry_yd": -9.1, + "diff_total_yd": -27.5, + "diff_apex_ft": -2.1, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_SHORT" + }, + "bump_and_run_slow": { + "diff_carry_yd": null, + "diff_total_yd": null, + "diff_apex_ft": null, + "status": "pass", + "error_pattern": null + }, + "bump_test_shot": { + "diff_carry_yd": -2.1, + "diff_total_yd": 12.8, + "diff_apex_ft": -0.1, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_LONG" + }, + "checked_test_shot": { + "diff_carry_yd": -0.6, + "diff_total_yd": 1.1, + "diff_apex_ft": -8.7, + "status": "pass", + "error_pattern": null + }, + "chip_test_shot": { + "diff_carry_yd": null, + "diff_total_yd": null, + "diff_apex_ft": null, + "status": "pass", + "error_pattern": null + }, + "drive_test_shot": { + "diff_carry_yd": 1.0, + "diff_total_yd": 0.8, + "diff_apex_ft": -0.6, + "status": "pass", + "error_pattern": null + }, + "driver1": { + "diff_carry_yd": 0.3, + "diff_total_yd": -25.7, + "diff_apex_ft": -0.7, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_SHORT" + }, + "driver2": { + "diff_carry_yd": 8.9, + "diff_total_yd": 8.6, + "diff_apex_ft": -2.7, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "driver3": { + "diff_carry_yd": 6.2, + "diff_total_yd": 23.3, + "diff_apex_ft": 21.1, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "driver4": { + "diff_carry_yd": 7.7, + "diff_total_yd": 16.3, + "diff_apex_ft": 4.4, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "flop_test_shot": { + "diff_carry_yd": 0.9, + "diff_total_yd": 2.8, + "diff_apex_ft": -7.6, + "status": "pass", + "error_pattern": null + }, + "p_wedge_shot_1": { + "diff_carry_yd": -4.3, + "diff_total_yd": 2.2, + "diff_apex_ft": -5.4, + "status": "moderate", + "error_pattern": "CARRY_TOO_SHORT" + }, + "s2_shot_10": { + "diff_carry_yd": 4.0, + "diff_total_yd": 10.7, + "diff_apex_ft": -5.8, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "s2_shot_11": { + "diff_carry_yd": -1.7, + "diff_total_yd": 2.0, + "diff_apex_ft": -4.4, + "status": "pass", + "error_pattern": null + }, + "s2_shot_12": { + "diff_carry_yd": 5.2, + "diff_total_yd": 9.5, + "diff_apex_ft": -5.1, + "status": "moderate", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "s2_shot_13": { + "diff_carry_yd": 1.8, + "diff_total_yd": 3.0, + "diff_apex_ft": -5.9, + "status": "pass", + "error_pattern": null + }, + "s2_shot_14": { + "diff_carry_yd": 0.2, + "diff_total_yd": 1.6, + "diff_apex_ft": -5.9, + "status": "pass", + "error_pattern": null + }, + "s2_shot_15": { + "diff_carry_yd": -0.6, + "diff_total_yd": -12.3, + "diff_apex_ft": -1.9, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_SHORT" + }, + "s2_shot_16": { + "diff_carry_yd": 0.4, + "diff_total_yd": 2.2, + "diff_apex_ft": -3.2, + "status": "pass", + "error_pattern": null + }, + "s2_shot_17": { + "diff_carry_yd": 7.2, + "diff_total_yd": 9.2, + "diff_apex_ft": -3.6, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "s2_shot_18": { + "diff_carry_yd": 5.1, + "diff_total_yd": 16.6, + "diff_apex_ft": 3.1, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "s2_shot_19": { + "diff_carry_yd": 3.3, + "diff_total_yd": -4.4, + "diff_apex_ft": -0.9, + "status": "moderate", + "error_pattern": "CARRY_TOO_LONG" + }, + "s2_shot_20": { + "diff_carry_yd": 7.2, + "diff_total_yd": 11.1, + "diff_apex_ft": -1.8, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "s2_shot_21": { + "diff_carry_yd": 5.8, + "diff_total_yd": 28.8, + "diff_apex_ft": 1.8, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "s2_shot_22": { + "diff_carry_yd": 5.7, + "diff_total_yd": 3.5, + "diff_apex_ft": -1.4, + "status": "moderate", + "error_pattern": "CARRY_TOO_LONG" + }, + "s2_shot_23": { + "diff_carry_yd": 4.2, + "diff_total_yd": -18.9, + "diff_apex_ft": 0.1, + "status": "severe", + "error_pattern": "CARRY_TOO_LONG" + }, + "s2_shot_24": { + "diff_carry_yd": 5.7, + "diff_total_yd": 2.7, + "diff_apex_ft": -1.6, + "status": "moderate", + "error_pattern": "CARRY_TOO_LONG" + }, + "s2_shot_26": { + "diff_carry_yd": 2.6, + "diff_total_yd": 23.1, + "diff_apex_ft": 24.2, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_LONG" + }, + "s2_shot_27": { + "diff_carry_yd": 3.6, + "diff_total_yd": 13.8, + "diff_apex_ft": 5.0, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "s2_shot_9": { + "diff_carry_yd": -2.8, + "diff_total_yd": 3.5, + "diff_apex_ft": 7.3, + "status": "pass", + "error_pattern": null + }, + "topped_test_shot": { + "diff_carry_yd": -0.6, + "diff_total_yd": 13.9, + "diff_apex_ft": -0.1, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_LONG" + }, + "wedge_shot_1": { + "diff_carry_yd": -5.1, + "diff_total_yd": -0.7, + "diff_apex_ft": -2.4, + "status": "moderate", + "error_pattern": "CARRY_TOO_SHORT" + }, + "wedge_shot_2": { + "diff_carry_yd": -6.1, + "diff_total_yd": 2.7, + "diff_apex_ft": -4.2, + "status": "moderate", + "error_pattern": "CARRY_TOO_SHORT" + }, + "wedge_test_shot": { + "diff_carry_yd": -5.0, + "diff_total_yd": 3.6, + "diff_apex_ft": -3.2, + "status": "moderate", + "error_pattern": "CARRY_TOO_SHORT" + }, + "wedge_test_shot2": { + "diff_carry_yd": -5.4, + "diff_total_yd": 3.1, + "diff_apex_ft": -2.0, + "status": "moderate", + "error_pattern": "CARRY_TOO_SHORT" + }, + "wood1": { + "diff_carry_yd": 12.7, + "diff_total_yd": -3.2, + "diff_apex_ft": 3.2, + "status": "severe", + "error_pattern": "CARRY_TOO_LONG" + }, + "wood2": { + "diff_carry_yd": 4.8, + "diff_total_yd": 0.7, + "diff_apex_ft": -1.6, + "status": "moderate", + "error_pattern": "CARRY_TOO_LONG" + }, + "wood_low_test_shot": { + "diff_carry_yd": 1.8, + "diff_total_yd": 22.9, + "diff_apex_ft": 0.4, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_LONG" + } + }, + "regressions": [ + { + "shot": "approach_test_shot", + "was": "pass", + "now": "severe", + "prev_total_diff": 1.8, + "curr_total_diff": 74.5 + } + ], + "conflicts": [ + "Bounce.FlightTangentialRetentionBase", + "Bounce.FlightSpinFactorMin", + "Bounce.FlightSpinFactorDivisor", + "Rollout.MidSpinMultiplierMax", + "Rollout.HighSpinMultiplierMax", + "Rollout.FrictionBlendSpeed", + "KineticFrictionMultiplier", + "Bounce.RolloutHighSpinRetention", + "Bounce.CorBaseA", + "Rollout.LowSpinMultiplierMax", + "Rollout.LowSpinThreshold", + "RollingFrictionMultiplier", + "Bounce.RolloutLowSpinRetention", + "Flight.ClMaxBase", + "Flight.CdMin", + "DragScaleMultiplier", + "LiftScaleMultiplier" + ] +} diff --git a/assets/data/calibration/history/iteration_024.json b/assets/data/calibration/history/iteration_024.json new file mode 100644 index 0000000..dbd2dfe --- /dev/null +++ b/assets/data/calibration/history/iteration_024.json @@ -0,0 +1,333 @@ +{ + "iteration": 24, + "timestamp": "2026-03-13T15:21:02.289795", + "profile_overrides": { + "Flight": { + "HighLaunchDragVlaStartDeg": 26.0, + "HighLaunchDragVlaFullDeg": 33.0, + "HighLaunchDragBoostMax": 1.2, + "SpinDragProgressiveCapSrStart": 0.33, + "SpinDragProgressiveCapSrEnd": 0.5, + "SpinDragProgressiveCapBoostMax": 0.25, + "HighReMidSpinGain": 16.0, + "MidSpinClBoostSrStart": 0.17, + "MidSpinClBoostSrEnd": 0.31, + "MidSpinClBoostMax": 0.5 + } + }, + "summary": { + "pass": 8, + "moderate": 11, + "severe": 20, + "no_reference": 2 + }, + "per_shot": { + "5iron": { + "diff_carry_yd": 5.6, + "diff_total_yd": 12.1, + "diff_apex_ft": 5.0, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "approach_mid_iron_test_shot": { + "diff_carry_yd": 0.0, + "diff_total_yd": 7.9, + "diff_apex_ft": -4.7, + "status": "moderate", + "error_pattern": "ROLLOUT_TOO_LONG" + }, + "approach_test_shot": { + "diff_carry_yd": 62.1, + "diff_total_yd": 74.5, + "diff_apex_ft": 10.8, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "bump_and_run": { + "diff_carry_yd": -9.1, + "diff_total_yd": -27.5, + "diff_apex_ft": -2.1, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_SHORT" + }, + "bump_and_run_slow": { + "diff_carry_yd": null, + "diff_total_yd": null, + "diff_apex_ft": null, + "status": "pass", + "error_pattern": null + }, + "bump_test_shot": { + "diff_carry_yd": -2.1, + "diff_total_yd": 12.8, + "diff_apex_ft": -0.1, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_LONG" + }, + "checked_test_shot": { + "diff_carry_yd": -0.6, + "diff_total_yd": 1.1, + "diff_apex_ft": -8.7, + "status": "pass", + "error_pattern": null + }, + "chip_test_shot": { + "diff_carry_yd": null, + "diff_total_yd": null, + "diff_apex_ft": null, + "status": "pass", + "error_pattern": null + }, + "drive_test_shot": { + "diff_carry_yd": 1.0, + "diff_total_yd": 0.8, + "diff_apex_ft": -0.6, + "status": "pass", + "error_pattern": null + }, + "driver1": { + "diff_carry_yd": 0.3, + "diff_total_yd": -25.7, + "diff_apex_ft": -0.7, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_SHORT" + }, + "driver2": { + "diff_carry_yd": 8.9, + "diff_total_yd": 8.6, + "diff_apex_ft": -2.7, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "driver3": { + "diff_carry_yd": 6.2, + "diff_total_yd": 23.3, + "diff_apex_ft": 21.1, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "driver4": { + "diff_carry_yd": 7.7, + "diff_total_yd": 16.3, + "diff_apex_ft": 4.4, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "flop_test_shot": { + "diff_carry_yd": 0.9, + "diff_total_yd": 2.8, + "diff_apex_ft": -7.6, + "status": "pass", + "error_pattern": null + }, + "p_wedge_shot_1": { + "diff_carry_yd": -4.3, + "diff_total_yd": 2.2, + "diff_apex_ft": -5.4, + "status": "moderate", + "error_pattern": "CARRY_TOO_SHORT" + }, + "s2_shot_10": { + "diff_carry_yd": 4.0, + "diff_total_yd": 10.7, + "diff_apex_ft": -5.8, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "s2_shot_11": { + "diff_carry_yd": -1.7, + "diff_total_yd": 2.0, + "diff_apex_ft": -4.4, + "status": "pass", + "error_pattern": null + }, + "s2_shot_12": { + "diff_carry_yd": 5.2, + "diff_total_yd": 9.5, + "diff_apex_ft": -5.1, + "status": "moderate", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "s2_shot_13": { + "diff_carry_yd": 1.8, + "diff_total_yd": 3.0, + "diff_apex_ft": -5.9, + "status": "pass", + "error_pattern": null + }, + "s2_shot_14": { + "diff_carry_yd": 0.2, + "diff_total_yd": 1.6, + "diff_apex_ft": -5.9, + "status": "pass", + "error_pattern": null + }, + "s2_shot_15": { + "diff_carry_yd": -0.6, + "diff_total_yd": -12.3, + "diff_apex_ft": -1.9, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_SHORT" + }, + "s2_shot_16": { + "diff_carry_yd": 0.4, + "diff_total_yd": 2.2, + "diff_apex_ft": -3.2, + "status": "pass", + "error_pattern": null + }, + "s2_shot_17": { + "diff_carry_yd": 7.2, + "diff_total_yd": 9.2, + "diff_apex_ft": -3.6, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "s2_shot_18": { + "diff_carry_yd": 5.1, + "diff_total_yd": 16.6, + "diff_apex_ft": 3.1, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "s2_shot_19": { + "diff_carry_yd": 3.3, + "diff_total_yd": -4.4, + "diff_apex_ft": -0.9, + "status": "moderate", + "error_pattern": "CARRY_TOO_LONG" + }, + "s2_shot_20": { + "diff_carry_yd": 7.2, + "diff_total_yd": 11.1, + "diff_apex_ft": -1.8, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "s2_shot_21": { + "diff_carry_yd": 5.8, + "diff_total_yd": 28.8, + "diff_apex_ft": 1.8, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "s2_shot_22": { + "diff_carry_yd": 5.7, + "diff_total_yd": 3.5, + "diff_apex_ft": -1.4, + "status": "moderate", + "error_pattern": "CARRY_TOO_LONG" + }, + "s2_shot_23": { + "diff_carry_yd": 4.2, + "diff_total_yd": -18.9, + "diff_apex_ft": 0.1, + "status": "severe", + "error_pattern": "CARRY_TOO_LONG" + }, + "s2_shot_24": { + "diff_carry_yd": 5.7, + "diff_total_yd": 2.7, + "diff_apex_ft": -1.6, + "status": "moderate", + "error_pattern": "CARRY_TOO_LONG" + }, + "s2_shot_26": { + "diff_carry_yd": 2.6, + "diff_total_yd": 23.1, + "diff_apex_ft": 24.2, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_LONG" + }, + "s2_shot_27": { + "diff_carry_yd": 3.6, + "diff_total_yd": 13.8, + "diff_apex_ft": 5.0, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "s2_shot_9": { + "diff_carry_yd": -2.8, + "diff_total_yd": 3.5, + "diff_apex_ft": 7.3, + "status": "pass", + "error_pattern": null + }, + "topped_test_shot": { + "diff_carry_yd": -0.6, + "diff_total_yd": 13.9, + "diff_apex_ft": -0.1, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_LONG" + }, + "wedge_shot_1": { + "diff_carry_yd": -5.1, + "diff_total_yd": -0.7, + "diff_apex_ft": -2.4, + "status": "moderate", + "error_pattern": "CARRY_TOO_SHORT" + }, + "wedge_shot_2": { + "diff_carry_yd": -6.1, + "diff_total_yd": 2.7, + "diff_apex_ft": -4.2, + "status": "moderate", + "error_pattern": "CARRY_TOO_SHORT" + }, + "wedge_test_shot": { + "diff_carry_yd": -5.0, + "diff_total_yd": 3.6, + "diff_apex_ft": -3.2, + "status": "moderate", + "error_pattern": "CARRY_TOO_SHORT" + }, + "wedge_test_shot2": { + "diff_carry_yd": -5.4, + "diff_total_yd": 3.1, + "diff_apex_ft": -2.0, + "status": "moderate", + "error_pattern": "CARRY_TOO_SHORT" + }, + "wood1": { + "diff_carry_yd": 12.7, + "diff_total_yd": -3.2, + "diff_apex_ft": 3.2, + "status": "severe", + "error_pattern": "CARRY_TOO_LONG" + }, + "wood2": { + "diff_carry_yd": 4.8, + "diff_total_yd": 0.7, + "diff_apex_ft": -1.6, + "status": "moderate", + "error_pattern": "CARRY_TOO_LONG" + }, + "wood_low_test_shot": { + "diff_carry_yd": 1.8, + "diff_total_yd": 22.9, + "diff_apex_ft": 0.4, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_LONG" + } + }, + "regressions": [], + "conflicts": [ + "Bounce.FlightTangentialRetentionBase", + "Bounce.FlightSpinFactorMin", + "Bounce.FlightSpinFactorDivisor", + "Rollout.MidSpinMultiplierMax", + "Rollout.HighSpinMultiplierMax", + "Rollout.FrictionBlendSpeed", + "KineticFrictionMultiplier", + "Bounce.RolloutHighSpinRetention", + "Bounce.CorBaseA", + "Rollout.LowSpinMultiplierMax", + "Rollout.LowSpinThreshold", + "RollingFrictionMultiplier", + "Bounce.RolloutLowSpinRetention", + "Flight.ClMaxBase", + "Flight.CdMin", + "DragScaleMultiplier", + "LiftScaleMultiplier" + ] +} diff --git a/assets/data/calibration/history/iteration_025.json b/assets/data/calibration/history/iteration_025.json new file mode 100644 index 0000000..602ec92 --- /dev/null +++ b/assets/data/calibration/history/iteration_025.json @@ -0,0 +1,320 @@ +{ + "iteration": 25, + "timestamp": "2026-03-13T17:50:08.360891", + "profile_overrides": {}, + "summary": { + "pass": 8, + "moderate": 11, + "severe": 20, + "no_reference": 2 + }, + "per_shot": { + "5iron": { + "diff_carry_yd": 5.6, + "diff_total_yd": 12.1, + "diff_apex_ft": 5.0, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "approach_mid_iron_test_shot": { + "diff_carry_yd": 0.0, + "diff_total_yd": 7.9, + "diff_apex_ft": -4.7, + "status": "moderate", + "error_pattern": "ROLLOUT_TOO_LONG" + }, + "approach_test_shot": { + "diff_carry_yd": 62.1, + "diff_total_yd": 74.5, + "diff_apex_ft": 10.8, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "bump_and_run": { + "diff_carry_yd": -9.1, + "diff_total_yd": -27.5, + "diff_apex_ft": -2.1, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_SHORT" + }, + "bump_and_run_slow": { + "diff_carry_yd": null, + "diff_total_yd": null, + "diff_apex_ft": null, + "status": "pass", + "error_pattern": null + }, + "bump_test_shot": { + "diff_carry_yd": -2.1, + "diff_total_yd": 12.8, + "diff_apex_ft": -0.1, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_LONG" + }, + "checked_test_shot": { + "diff_carry_yd": -0.6, + "diff_total_yd": 1.1, + "diff_apex_ft": -8.7, + "status": "pass", + "error_pattern": null + }, + "chip_test_shot": { + "diff_carry_yd": null, + "diff_total_yd": null, + "diff_apex_ft": null, + "status": "pass", + "error_pattern": null + }, + "drive_test_shot": { + "diff_carry_yd": 1.0, + "diff_total_yd": 0.8, + "diff_apex_ft": -0.6, + "status": "pass", + "error_pattern": null + }, + "driver1": { + "diff_carry_yd": 0.3, + "diff_total_yd": -25.7, + "diff_apex_ft": -0.7, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_SHORT" + }, + "driver2": { + "diff_carry_yd": 8.9, + "diff_total_yd": 8.6, + "diff_apex_ft": -2.7, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "driver3": { + "diff_carry_yd": 6.2, + "diff_total_yd": 23.3, + "diff_apex_ft": 21.1, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "driver4": { + "diff_carry_yd": 7.7, + "diff_total_yd": 16.3, + "diff_apex_ft": 4.4, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "flop_test_shot": { + "diff_carry_yd": 0.9, + "diff_total_yd": 2.8, + "diff_apex_ft": -7.6, + "status": "pass", + "error_pattern": null + }, + "p_wedge_shot_1": { + "diff_carry_yd": -4.3, + "diff_total_yd": 2.2, + "diff_apex_ft": -5.4, + "status": "moderate", + "error_pattern": "CARRY_TOO_SHORT" + }, + "s2_shot_10": { + "diff_carry_yd": 4.0, + "diff_total_yd": 10.7, + "diff_apex_ft": -5.8, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "s2_shot_11": { + "diff_carry_yd": -1.7, + "diff_total_yd": 2.0, + "diff_apex_ft": -4.4, + "status": "pass", + "error_pattern": null + }, + "s2_shot_12": { + "diff_carry_yd": 5.2, + "diff_total_yd": 9.5, + "diff_apex_ft": -5.1, + "status": "moderate", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "s2_shot_13": { + "diff_carry_yd": 1.8, + "diff_total_yd": 3.0, + "diff_apex_ft": -5.9, + "status": "pass", + "error_pattern": null + }, + "s2_shot_14": { + "diff_carry_yd": 0.2, + "diff_total_yd": 1.6, + "diff_apex_ft": -5.9, + "status": "pass", + "error_pattern": null + }, + "s2_shot_15": { + "diff_carry_yd": -0.6, + "diff_total_yd": -12.3, + "diff_apex_ft": -1.9, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_SHORT" + }, + "s2_shot_16": { + "diff_carry_yd": 0.4, + "diff_total_yd": 2.2, + "diff_apex_ft": -3.2, + "status": "pass", + "error_pattern": null + }, + "s2_shot_17": { + "diff_carry_yd": 7.2, + "diff_total_yd": 9.2, + "diff_apex_ft": -3.6, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "s2_shot_18": { + "diff_carry_yd": 5.1, + "diff_total_yd": 16.6, + "diff_apex_ft": 3.1, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "s2_shot_19": { + "diff_carry_yd": 3.3, + "diff_total_yd": -4.4, + "diff_apex_ft": -0.9, + "status": "moderate", + "error_pattern": "CARRY_TOO_LONG" + }, + "s2_shot_20": { + "diff_carry_yd": 7.2, + "diff_total_yd": 11.1, + "diff_apex_ft": -1.8, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "s2_shot_21": { + "diff_carry_yd": 5.8, + "diff_total_yd": 28.8, + "diff_apex_ft": 1.8, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "s2_shot_22": { + "diff_carry_yd": 5.7, + "diff_total_yd": 3.5, + "diff_apex_ft": -1.4, + "status": "moderate", + "error_pattern": "CARRY_TOO_LONG" + }, + "s2_shot_23": { + "diff_carry_yd": 4.2, + "diff_total_yd": -18.9, + "diff_apex_ft": 0.1, + "status": "severe", + "error_pattern": "CARRY_TOO_LONG" + }, + "s2_shot_24": { + "diff_carry_yd": 5.7, + "diff_total_yd": 2.7, + "diff_apex_ft": -1.6, + "status": "moderate", + "error_pattern": "CARRY_TOO_LONG" + }, + "s2_shot_26": { + "diff_carry_yd": 2.6, + "diff_total_yd": 23.1, + "diff_apex_ft": 24.2, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_LONG" + }, + "s2_shot_27": { + "diff_carry_yd": 3.6, + "diff_total_yd": 13.8, + "diff_apex_ft": 5.0, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "s2_shot_9": { + "diff_carry_yd": -2.8, + "diff_total_yd": 3.5, + "diff_apex_ft": 7.3, + "status": "pass", + "error_pattern": null + }, + "topped_test_shot": { + "diff_carry_yd": -0.6, + "diff_total_yd": 13.9, + "diff_apex_ft": -0.1, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_LONG" + }, + "wedge_shot_1": { + "diff_carry_yd": -5.1, + "diff_total_yd": -0.7, + "diff_apex_ft": -2.4, + "status": "moderate", + "error_pattern": "CARRY_TOO_SHORT" + }, + "wedge_shot_2": { + "diff_carry_yd": -6.1, + "diff_total_yd": 2.7, + "diff_apex_ft": -4.2, + "status": "moderate", + "error_pattern": "CARRY_TOO_SHORT" + }, + "wedge_test_shot": { + "diff_carry_yd": -5.0, + "diff_total_yd": 3.6, + "diff_apex_ft": -3.2, + "status": "moderate", + "error_pattern": "CARRY_TOO_SHORT" + }, + "wedge_test_shot2": { + "diff_carry_yd": -5.4, + "diff_total_yd": 3.1, + "diff_apex_ft": -2.0, + "status": "moderate", + "error_pattern": "CARRY_TOO_SHORT" + }, + "wood1": { + "diff_carry_yd": 12.7, + "diff_total_yd": -3.2, + "diff_apex_ft": 3.2, + "status": "severe", + "error_pattern": "CARRY_TOO_LONG" + }, + "wood2": { + "diff_carry_yd": 4.8, + "diff_total_yd": 0.7, + "diff_apex_ft": -1.6, + "status": "moderate", + "error_pattern": "CARRY_TOO_LONG" + }, + "wood_low_test_shot": { + "diff_carry_yd": 1.8, + "diff_total_yd": 22.9, + "diff_apex_ft": 0.4, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_LONG" + } + }, + "regressions": [], + "conflicts": [ + "Bounce.FlightTangentialRetentionBase", + "Bounce.FlightSpinFactorMin", + "Bounce.FlightSpinFactorDivisor", + "Rollout.MidSpinMultiplierMax", + "Rollout.HighSpinMultiplierMax", + "Rollout.FrictionBlendSpeed", + "KineticFrictionMultiplier", + "Bounce.RolloutHighSpinRetention", + "Bounce.CorBaseA", + "Rollout.LowSpinMultiplierMax", + "Rollout.LowSpinThreshold", + "RollingFrictionMultiplier", + "Bounce.RolloutLowSpinRetention", + "Flight.ClMaxBase", + "Flight.CdMin", + "DragScaleMultiplier", + "LiftScaleMultiplier" + ] +} diff --git a/assets/data/calibration/history/iteration_026.json b/assets/data/calibration/history/iteration_026.json new file mode 100644 index 0000000..82403e7 --- /dev/null +++ b/assets/data/calibration/history/iteration_026.json @@ -0,0 +1,320 @@ +{ + "iteration": 26, + "timestamp": "2026-03-13T17:56:13.484174", + "profile_overrides": {}, + "summary": { + "pass": 8, + "moderate": 11, + "severe": 20, + "no_reference": 2 + }, + "per_shot": { + "5iron": { + "diff_carry_yd": 5.6, + "diff_total_yd": 12.1, + "diff_apex_ft": 5.0, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "approach_mid_iron_test_shot": { + "diff_carry_yd": 0.0, + "diff_total_yd": 7.9, + "diff_apex_ft": -4.7, + "status": "moderate", + "error_pattern": "ROLLOUT_TOO_LONG" + }, + "approach_test_shot": { + "diff_carry_yd": 62.1, + "diff_total_yd": 74.5, + "diff_apex_ft": 10.8, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "bump_and_run": { + "diff_carry_yd": -9.1, + "diff_total_yd": -27.5, + "diff_apex_ft": -2.1, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_SHORT" + }, + "bump_and_run_slow": { + "diff_carry_yd": null, + "diff_total_yd": null, + "diff_apex_ft": null, + "status": "pass", + "error_pattern": null + }, + "bump_test_shot": { + "diff_carry_yd": -2.1, + "diff_total_yd": 12.8, + "diff_apex_ft": -0.1, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_LONG" + }, + "checked_test_shot": { + "diff_carry_yd": -0.6, + "diff_total_yd": 1.1, + "diff_apex_ft": -8.7, + "status": "pass", + "error_pattern": null + }, + "chip_test_shot": { + "diff_carry_yd": null, + "diff_total_yd": null, + "diff_apex_ft": null, + "status": "pass", + "error_pattern": null + }, + "drive_test_shot": { + "diff_carry_yd": 1.0, + "diff_total_yd": 0.8, + "diff_apex_ft": -0.6, + "status": "pass", + "error_pattern": null + }, + "driver1": { + "diff_carry_yd": 0.3, + "diff_total_yd": -25.7, + "diff_apex_ft": -0.7, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_SHORT" + }, + "driver2": { + "diff_carry_yd": 8.9, + "diff_total_yd": 8.6, + "diff_apex_ft": -2.7, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "driver3": { + "diff_carry_yd": 6.2, + "diff_total_yd": 23.3, + "diff_apex_ft": 21.1, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "driver4": { + "diff_carry_yd": 7.7, + "diff_total_yd": 16.3, + "diff_apex_ft": 4.4, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "flop_test_shot": { + "diff_carry_yd": 0.9, + "diff_total_yd": 2.8, + "diff_apex_ft": -7.6, + "status": "pass", + "error_pattern": null + }, + "p_wedge_shot_1": { + "diff_carry_yd": -4.3, + "diff_total_yd": 2.2, + "diff_apex_ft": -5.4, + "status": "moderate", + "error_pattern": "CARRY_TOO_SHORT" + }, + "s2_shot_10": { + "diff_carry_yd": 4.0, + "diff_total_yd": 10.7, + "diff_apex_ft": -5.8, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "s2_shot_11": { + "diff_carry_yd": -1.7, + "diff_total_yd": 2.0, + "diff_apex_ft": -4.4, + "status": "pass", + "error_pattern": null + }, + "s2_shot_12": { + "diff_carry_yd": 5.2, + "diff_total_yd": 9.5, + "diff_apex_ft": -5.1, + "status": "moderate", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "s2_shot_13": { + "diff_carry_yd": 1.8, + "diff_total_yd": 3.0, + "diff_apex_ft": -5.9, + "status": "pass", + "error_pattern": null + }, + "s2_shot_14": { + "diff_carry_yd": 0.2, + "diff_total_yd": 1.6, + "diff_apex_ft": -5.9, + "status": "pass", + "error_pattern": null + }, + "s2_shot_15": { + "diff_carry_yd": -0.6, + "diff_total_yd": -12.3, + "diff_apex_ft": -1.9, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_SHORT" + }, + "s2_shot_16": { + "diff_carry_yd": 0.4, + "diff_total_yd": 2.2, + "diff_apex_ft": -3.2, + "status": "pass", + "error_pattern": null + }, + "s2_shot_17": { + "diff_carry_yd": 7.2, + "diff_total_yd": 9.2, + "diff_apex_ft": -3.6, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "s2_shot_18": { + "diff_carry_yd": 5.1, + "diff_total_yd": 16.6, + "diff_apex_ft": 3.1, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "s2_shot_19": { + "diff_carry_yd": 3.3, + "diff_total_yd": -4.4, + "diff_apex_ft": -0.9, + "status": "moderate", + "error_pattern": "CARRY_TOO_LONG" + }, + "s2_shot_20": { + "diff_carry_yd": 7.2, + "diff_total_yd": 11.1, + "diff_apex_ft": -1.8, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "s2_shot_21": { + "diff_carry_yd": 5.8, + "diff_total_yd": 28.8, + "diff_apex_ft": 1.8, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "s2_shot_22": { + "diff_carry_yd": 5.7, + "diff_total_yd": 3.5, + "diff_apex_ft": -1.4, + "status": "moderate", + "error_pattern": "CARRY_TOO_LONG" + }, + "s2_shot_23": { + "diff_carry_yd": 4.2, + "diff_total_yd": -18.9, + "diff_apex_ft": 0.1, + "status": "severe", + "error_pattern": "CARRY_TOO_LONG" + }, + "s2_shot_24": { + "diff_carry_yd": 5.7, + "diff_total_yd": 2.7, + "diff_apex_ft": -1.6, + "status": "moderate", + "error_pattern": "CARRY_TOO_LONG" + }, + "s2_shot_26": { + "diff_carry_yd": 2.6, + "diff_total_yd": 23.1, + "diff_apex_ft": 24.2, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_LONG" + }, + "s2_shot_27": { + "diff_carry_yd": 3.6, + "diff_total_yd": 13.8, + "diff_apex_ft": 5.0, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "s2_shot_9": { + "diff_carry_yd": -2.8, + "diff_total_yd": 3.5, + "diff_apex_ft": 7.3, + "status": "pass", + "error_pattern": null + }, + "topped_test_shot": { + "diff_carry_yd": -0.6, + "diff_total_yd": 13.9, + "diff_apex_ft": -0.1, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_LONG" + }, + "wedge_shot_1": { + "diff_carry_yd": -5.1, + "diff_total_yd": -0.7, + "diff_apex_ft": -2.4, + "status": "moderate", + "error_pattern": "CARRY_TOO_SHORT" + }, + "wedge_shot_2": { + "diff_carry_yd": -6.1, + "diff_total_yd": 2.7, + "diff_apex_ft": -4.2, + "status": "moderate", + "error_pattern": "CARRY_TOO_SHORT" + }, + "wedge_test_shot": { + "diff_carry_yd": -5.0, + "diff_total_yd": 3.6, + "diff_apex_ft": -3.2, + "status": "moderate", + "error_pattern": "CARRY_TOO_SHORT" + }, + "wedge_test_shot2": { + "diff_carry_yd": -5.4, + "diff_total_yd": 3.1, + "diff_apex_ft": -2.0, + "status": "moderate", + "error_pattern": "CARRY_TOO_SHORT" + }, + "wood1": { + "diff_carry_yd": 12.7, + "diff_total_yd": -3.2, + "diff_apex_ft": 3.2, + "status": "severe", + "error_pattern": "CARRY_TOO_LONG" + }, + "wood2": { + "diff_carry_yd": 4.8, + "diff_total_yd": 0.7, + "diff_apex_ft": -1.6, + "status": "moderate", + "error_pattern": "CARRY_TOO_LONG" + }, + "wood_low_test_shot": { + "diff_carry_yd": 1.8, + "diff_total_yd": 22.9, + "diff_apex_ft": 0.4, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_LONG" + } + }, + "regressions": [], + "conflicts": [ + "Bounce.FlightTangentialRetentionBase", + "Bounce.FlightSpinFactorMin", + "Bounce.FlightSpinFactorDivisor", + "Rollout.MidSpinMultiplierMax", + "Rollout.HighSpinMultiplierMax", + "Rollout.FrictionBlendSpeed", + "KineticFrictionMultiplier", + "Bounce.RolloutHighSpinRetention", + "Bounce.CorBaseA", + "Rollout.LowSpinMultiplierMax", + "Rollout.LowSpinThreshold", + "RollingFrictionMultiplier", + "Bounce.RolloutLowSpinRetention", + "Flight.ClMaxBase", + "Flight.CdMin", + "DragScaleMultiplier", + "LiftScaleMultiplier" + ] +} diff --git a/assets/data/calibration/history/iteration_027.json b/assets/data/calibration/history/iteration_027.json new file mode 100644 index 0000000..c7d0a76 --- /dev/null +++ b/assets/data/calibration/history/iteration_027.json @@ -0,0 +1,320 @@ +{ + "iteration": 27, + "timestamp": "2026-03-13T17:56:32.270799", + "profile_overrides": {}, + "summary": { + "pass": 8, + "moderate": 11, + "severe": 20, + "no_reference": 2 + }, + "per_shot": { + "5iron": { + "diff_carry_yd": 5.6, + "diff_total_yd": 12.1, + "diff_apex_ft": 5.0, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "approach_mid_iron_test_shot": { + "diff_carry_yd": 0.0, + "diff_total_yd": 7.9, + "diff_apex_ft": -4.7, + "status": "moderate", + "error_pattern": "ROLLOUT_TOO_LONG" + }, + "approach_test_shot": { + "diff_carry_yd": 62.1, + "diff_total_yd": 74.5, + "diff_apex_ft": 10.8, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "bump_and_run": { + "diff_carry_yd": -9.1, + "diff_total_yd": -27.5, + "diff_apex_ft": -2.1, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_SHORT" + }, + "bump_and_run_slow": { + "diff_carry_yd": null, + "diff_total_yd": null, + "diff_apex_ft": null, + "status": "pass", + "error_pattern": null + }, + "bump_test_shot": { + "diff_carry_yd": -2.1, + "diff_total_yd": 12.8, + "diff_apex_ft": -0.1, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_LONG" + }, + "checked_test_shot": { + "diff_carry_yd": -0.6, + "diff_total_yd": 1.1, + "diff_apex_ft": -8.7, + "status": "pass", + "error_pattern": null + }, + "chip_test_shot": { + "diff_carry_yd": null, + "diff_total_yd": null, + "diff_apex_ft": null, + "status": "pass", + "error_pattern": null + }, + "drive_test_shot": { + "diff_carry_yd": 1.0, + "diff_total_yd": 0.8, + "diff_apex_ft": -0.6, + "status": "pass", + "error_pattern": null + }, + "driver1": { + "diff_carry_yd": 0.3, + "diff_total_yd": -25.7, + "diff_apex_ft": -0.7, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_SHORT" + }, + "driver2": { + "diff_carry_yd": 8.9, + "diff_total_yd": 8.6, + "diff_apex_ft": -2.7, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "driver3": { + "diff_carry_yd": 6.2, + "diff_total_yd": 23.3, + "diff_apex_ft": 21.1, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "driver4": { + "diff_carry_yd": 7.7, + "diff_total_yd": 16.3, + "diff_apex_ft": 4.4, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "flop_test_shot": { + "diff_carry_yd": 0.9, + "diff_total_yd": 2.8, + "diff_apex_ft": -7.6, + "status": "pass", + "error_pattern": null + }, + "p_wedge_shot_1": { + "diff_carry_yd": -4.3, + "diff_total_yd": 2.2, + "diff_apex_ft": -5.4, + "status": "moderate", + "error_pattern": "CARRY_TOO_SHORT" + }, + "s2_shot_10": { + "diff_carry_yd": 4.0, + "diff_total_yd": 10.7, + "diff_apex_ft": -5.8, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "s2_shot_11": { + "diff_carry_yd": -1.7, + "diff_total_yd": 2.0, + "diff_apex_ft": -4.4, + "status": "pass", + "error_pattern": null + }, + "s2_shot_12": { + "diff_carry_yd": 5.2, + "diff_total_yd": 9.5, + "diff_apex_ft": -5.1, + "status": "moderate", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "s2_shot_13": { + "diff_carry_yd": 1.8, + "diff_total_yd": 3.0, + "diff_apex_ft": -5.9, + "status": "pass", + "error_pattern": null + }, + "s2_shot_14": { + "diff_carry_yd": 0.2, + "diff_total_yd": 1.6, + "diff_apex_ft": -5.9, + "status": "pass", + "error_pattern": null + }, + "s2_shot_15": { + "diff_carry_yd": -0.6, + "diff_total_yd": -12.3, + "diff_apex_ft": -1.9, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_SHORT" + }, + "s2_shot_16": { + "diff_carry_yd": 0.4, + "diff_total_yd": 2.2, + "diff_apex_ft": -3.2, + "status": "pass", + "error_pattern": null + }, + "s2_shot_17": { + "diff_carry_yd": 7.2, + "diff_total_yd": 9.2, + "diff_apex_ft": -3.6, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "s2_shot_18": { + "diff_carry_yd": 5.1, + "diff_total_yd": 16.6, + "diff_apex_ft": 3.1, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "s2_shot_19": { + "diff_carry_yd": 3.3, + "diff_total_yd": -4.4, + "diff_apex_ft": -0.9, + "status": "moderate", + "error_pattern": "CARRY_TOO_LONG" + }, + "s2_shot_20": { + "diff_carry_yd": 7.2, + "diff_total_yd": 11.1, + "diff_apex_ft": -1.8, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "s2_shot_21": { + "diff_carry_yd": 5.8, + "diff_total_yd": 28.8, + "diff_apex_ft": 1.8, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "s2_shot_22": { + "diff_carry_yd": 5.7, + "diff_total_yd": 3.5, + "diff_apex_ft": -1.4, + "status": "moderate", + "error_pattern": "CARRY_TOO_LONG" + }, + "s2_shot_23": { + "diff_carry_yd": 4.2, + "diff_total_yd": -18.9, + "diff_apex_ft": 0.1, + "status": "severe", + "error_pattern": "CARRY_TOO_LONG" + }, + "s2_shot_24": { + "diff_carry_yd": 5.7, + "diff_total_yd": 2.7, + "diff_apex_ft": -1.6, + "status": "moderate", + "error_pattern": "CARRY_TOO_LONG" + }, + "s2_shot_26": { + "diff_carry_yd": 2.6, + "diff_total_yd": 23.1, + "diff_apex_ft": 24.2, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_LONG" + }, + "s2_shot_27": { + "diff_carry_yd": 3.6, + "diff_total_yd": 13.8, + "diff_apex_ft": 5.0, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "s2_shot_9": { + "diff_carry_yd": -2.8, + "diff_total_yd": 3.5, + "diff_apex_ft": 7.3, + "status": "pass", + "error_pattern": null + }, + "topped_test_shot": { + "diff_carry_yd": -0.6, + "diff_total_yd": 13.9, + "diff_apex_ft": -0.1, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_LONG" + }, + "wedge_shot_1": { + "diff_carry_yd": -5.1, + "diff_total_yd": -0.7, + "diff_apex_ft": -2.4, + "status": "moderate", + "error_pattern": "CARRY_TOO_SHORT" + }, + "wedge_shot_2": { + "diff_carry_yd": -6.1, + "diff_total_yd": 2.7, + "diff_apex_ft": -4.2, + "status": "moderate", + "error_pattern": "CARRY_TOO_SHORT" + }, + "wedge_test_shot": { + "diff_carry_yd": -5.0, + "diff_total_yd": 3.6, + "diff_apex_ft": -3.2, + "status": "moderate", + "error_pattern": "CARRY_TOO_SHORT" + }, + "wedge_test_shot2": { + "diff_carry_yd": -5.4, + "diff_total_yd": 3.1, + "diff_apex_ft": -2.0, + "status": "moderate", + "error_pattern": "CARRY_TOO_SHORT" + }, + "wood1": { + "diff_carry_yd": 12.7, + "diff_total_yd": -3.2, + "diff_apex_ft": 3.2, + "status": "severe", + "error_pattern": "CARRY_TOO_LONG" + }, + "wood2": { + "diff_carry_yd": 4.8, + "diff_total_yd": 0.7, + "diff_apex_ft": -1.6, + "status": "moderate", + "error_pattern": "CARRY_TOO_LONG" + }, + "wood_low_test_shot": { + "diff_carry_yd": 1.8, + "diff_total_yd": 22.9, + "diff_apex_ft": 0.4, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_LONG" + } + }, + "regressions": [], + "conflicts": [ + "Bounce.FlightTangentialRetentionBase", + "Bounce.FlightSpinFactorMin", + "Bounce.FlightSpinFactorDivisor", + "Rollout.MidSpinMultiplierMax", + "Rollout.HighSpinMultiplierMax", + "Rollout.FrictionBlendSpeed", + "KineticFrictionMultiplier", + "Bounce.RolloutHighSpinRetention", + "Bounce.CorBaseA", + "Rollout.LowSpinMultiplierMax", + "Rollout.LowSpinThreshold", + "RollingFrictionMultiplier", + "Bounce.RolloutLowSpinRetention", + "Flight.ClMaxBase", + "Flight.CdMin", + "DragScaleMultiplier", + "LiftScaleMultiplier" + ] +} diff --git a/assets/data/calibration/history/iteration_028.json b/assets/data/calibration/history/iteration_028.json new file mode 100644 index 0000000..5520376 --- /dev/null +++ b/assets/data/calibration/history/iteration_028.json @@ -0,0 +1,761 @@ +{ + "iteration": 28, + "timestamp": "2026-03-13T18:00:04.478342", + "profile_overrides": { + "Flight": { + "HighLaunchDragVlaStartDeg": 26.0, + "HighLaunchDragVlaFullDeg": 33.0, + "HighLaunchDragBoostMax": 1.2, + "SpinDragProgressiveCapSrStart": 0.33, + "SpinDragProgressiveCapSrEnd": 0.5, + "SpinDragProgressiveCapBoostMax": 0.25, + "HighReMidSpinGain": 16.0, + "MidSpinClBoostSrStart": 0.17, + "MidSpinClBoostSrEnd": 0.31, + "MidSpinClBoostMax": 0.5 + } + }, + "summary": { + "pass": 20, + "moderate": 24, + "severe": 55, + "no_reference": 3 + }, + "per_shot": { + "5iron": { + "diff_carry_yd": 5.6, + "diff_total_yd": 12.1, + "diff_apex_ft": 5.0, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "approach_mid_iron_test_shot": { + "diff_carry_yd": 0.0, + "diff_total_yd": 7.9, + "diff_apex_ft": -4.7, + "status": "moderate", + "error_pattern": "ROLLOUT_TOO_LONG" + }, + "bump_and_run": { + "diff_carry_yd": -9.1, + "diff_total_yd": -27.5, + "diff_apex_ft": -2.1, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_SHORT" + }, + "bump_and_run_slow": { + "diff_carry_yd": null, + "diff_total_yd": null, + "diff_apex_ft": null, + "status": "pass", + "error_pattern": null + }, + "bump_test_shot": { + "diff_carry_yd": -2.1, + "diff_total_yd": 12.8, + "diff_apex_ft": -0.1, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_LONG" + }, + "checked_test_shot": { + "diff_carry_yd": -0.6, + "diff_total_yd": 1.1, + "diff_apex_ft": -8.7, + "status": "pass", + "error_pattern": null + }, + "chip_test_shot": { + "diff_carry_yd": null, + "diff_total_yd": null, + "diff_apex_ft": null, + "status": "pass", + "error_pattern": null + }, + "drive_test_shot": { + "diff_carry_yd": 1.0, + "diff_total_yd": 0.8, + "diff_apex_ft": -0.6, + "status": "pass", + "error_pattern": null + }, + "driver1": { + "diff_carry_yd": 0.3, + "diff_total_yd": -25.7, + "diff_apex_ft": -0.7, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_SHORT" + }, + "driver2": { + "diff_carry_yd": 8.9, + "diff_total_yd": 8.6, + "diff_apex_ft": -2.7, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "driver3": { + "diff_carry_yd": 6.2, + "diff_total_yd": 23.3, + "diff_apex_ft": 21.1, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "driver4": { + "diff_carry_yd": 7.7, + "diff_total_yd": 16.3, + "diff_apex_ft": 4.4, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "flop_test_shot": { + "diff_carry_yd": 0.9, + "diff_total_yd": 2.8, + "diff_apex_ft": -7.6, + "status": "pass", + "error_pattern": null + }, + "p_wedge_shot_1": { + "diff_carry_yd": -4.3, + "diff_total_yd": 2.2, + "diff_apex_ft": -5.4, + "status": "moderate", + "error_pattern": "CARRY_TOO_SHORT" + }, + "s2_shot_10": { + "diff_carry_yd": 4.0, + "diff_total_yd": 10.7, + "diff_apex_ft": -5.8, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "s2_shot_11": { + "diff_carry_yd": -1.7, + "diff_total_yd": 2.0, + "diff_apex_ft": -4.4, + "status": "pass", + "error_pattern": null + }, + "s2_shot_12": { + "diff_carry_yd": 5.2, + "diff_total_yd": 9.5, + "diff_apex_ft": -5.1, + "status": "moderate", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "s2_shot_13": { + "diff_carry_yd": 1.8, + "diff_total_yd": 3.0, + "diff_apex_ft": -5.9, + "status": "pass", + "error_pattern": null + }, + "s2_shot_14": { + "diff_carry_yd": 0.2, + "diff_total_yd": 1.6, + "diff_apex_ft": -5.9, + "status": "pass", + "error_pattern": null + }, + "s2_shot_15": { + "diff_carry_yd": -0.6, + "diff_total_yd": -12.3, + "diff_apex_ft": -1.9, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_SHORT" + }, + "s2_shot_16": { + "diff_carry_yd": 0.4, + "diff_total_yd": 2.2, + "diff_apex_ft": -3.2, + "status": "pass", + "error_pattern": null + }, + "s2_shot_17": { + "diff_carry_yd": 7.2, + "diff_total_yd": 9.2, + "diff_apex_ft": -3.6, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "s2_shot_18": { + "diff_carry_yd": 5.1, + "diff_total_yd": 16.6, + "diff_apex_ft": 3.1, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "s2_shot_19": { + "diff_carry_yd": 3.3, + "diff_total_yd": -4.4, + "diff_apex_ft": -0.9, + "status": "moderate", + "error_pattern": "CARRY_TOO_LONG" + }, + "s2_shot_20": { + "diff_carry_yd": 7.2, + "diff_total_yd": 11.1, + "diff_apex_ft": -1.8, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "s2_shot_21": { + "diff_carry_yd": 5.8, + "diff_total_yd": 28.8, + "diff_apex_ft": 1.8, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "s2_shot_22": { + "diff_carry_yd": 5.7, + "diff_total_yd": 3.5, + "diff_apex_ft": -1.4, + "status": "moderate", + "error_pattern": "CARRY_TOO_LONG" + }, + "s2_shot_23": { + "diff_carry_yd": 4.2, + "diff_total_yd": -18.9, + "diff_apex_ft": 0.1, + "status": "severe", + "error_pattern": "CARRY_TOO_LONG" + }, + "s2_shot_24": { + "diff_carry_yd": 5.7, + "diff_total_yd": 2.7, + "diff_apex_ft": -1.6, + "status": "moderate", + "error_pattern": "CARRY_TOO_LONG" + }, + "s2_shot_26": { + "diff_carry_yd": 2.6, + "diff_total_yd": 23.1, + "diff_apex_ft": 24.2, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_LONG" + }, + "s2_shot_27": { + "diff_carry_yd": 3.6, + "diff_total_yd": 13.8, + "diff_apex_ft": 5.0, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "s2_shot_9": { + "diff_carry_yd": -2.8, + "diff_total_yd": 3.5, + "diff_apex_ft": 7.3, + "status": "pass", + "error_pattern": null + }, + "s3_shot_3w_18": { + "diff_carry_yd": null, + "diff_total_yd": null, + "diff_apex_ft": null, + "status": "pass", + "error_pattern": null + }, + "s3_shot_3w_19": { + "diff_carry_yd": -0.1, + "diff_total_yd": 16.7, + "diff_apex_ft": 0.1, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_LONG" + }, + "s3_shot_3w_21": { + "diff_carry_yd": 1.1, + "diff_total_yd": 16.6, + "diff_apex_ft": 0.3, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_LONG" + }, + "s3_shot_3w_22": { + "diff_carry_yd": 3.1, + "diff_total_yd": 20.2, + "diff_apex_ft": 0.5, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "s3_shot_3w_23": { + "diff_carry_yd": 0.8, + "diff_total_yd": -22.7, + "diff_apex_ft": -1.2, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_SHORT" + }, + "s3_shot_3w_24": { + "diff_carry_yd": 7.9, + "diff_total_yd": 29.6, + "diff_apex_ft": 1.9, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "s3_shot_5i_10": { + "diff_carry_yd": 3.0, + "diff_total_yd": -7.1, + "diff_apex_ft": 5.9, + "status": "moderate", + "error_pattern": "ROLLOUT_TOO_SHORT" + }, + "s3_shot_5i_11": { + "diff_carry_yd": -3.2, + "diff_total_yd": -17.2, + "diff_apex_ft": -1.3, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_SHORT" + }, + "s3_shot_5i_12": { + "diff_carry_yd": 1.2, + "diff_total_yd": -23.5, + "diff_apex_ft": 1.1, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_SHORT" + }, + "s3_shot_5i_13": { + "diff_carry_yd": 2.6, + "diff_total_yd": 10.1, + "diff_apex_ft": 0.6, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_LONG" + }, + "s3_shot_5i_15": { + "diff_carry_yd": -4.5, + "diff_total_yd": 14.7, + "diff_apex_ft": -1.1, + "status": "severe", + "error_pattern": "CARRY_TOO_SHORT" + }, + "s3_shot_5i_16": { + "diff_carry_yd": 1.1, + "diff_total_yd": -20.8, + "diff_apex_ft": -0.2, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_SHORT" + }, + "s3_shot_5i_17": { + "diff_carry_yd": -2.0, + "diff_total_yd": -1.9, + "diff_apex_ft": -0.3, + "status": "pass", + "error_pattern": null + }, + "s3_shot_6i_35": { + "diff_carry_yd": -5.1, + "diff_total_yd": -16.6, + "diff_apex_ft": -3.3, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_SHORT" + }, + "s3_shot_6i_36": { + "diff_carry_yd": 2.1, + "diff_total_yd": -20.8, + "diff_apex_ft": 0.6, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_SHORT" + }, + "s3_shot_6i_37": { + "diff_carry_yd": -3.6, + "diff_total_yd": 12.2, + "diff_apex_ft": -0.8, + "status": "severe", + "error_pattern": "CARRY_TOO_SHORT" + }, + "s3_shot_6i_38": { + "diff_carry_yd": -3.2, + "diff_total_yd": -21.3, + "diff_apex_ft": 0.1, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_SHORT" + }, + "s3_shot_6i_39": { + "diff_carry_yd": -0.5, + "diff_total_yd": 6.4, + "diff_apex_ft": 0.0, + "status": "moderate", + "error_pattern": "ROLLOUT_TOO_LONG" + }, + "s3_shot_6i_40": { + "diff_carry_yd": -1.2, + "diff_total_yd": 7.8, + "diff_apex_ft": 0.1, + "status": "moderate", + "error_pattern": "ROLLOUT_TOO_LONG" + }, + "s3_shot_6i_41": { + "diff_carry_yd": -4.6, + "diff_total_yd": 13.2, + "diff_apex_ft": -1.0, + "status": "severe", + "error_pattern": "CARRY_TOO_SHORT" + }, + "s3_shot_6i_42": { + "diff_carry_yd": -1.1, + "diff_total_yd": -17.4, + "diff_apex_ft": 0.8, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_SHORT" + }, + "s3_shot_6i_43": { + "diff_carry_yd": 6.4, + "diff_total_yd": 0.9, + "diff_apex_ft": 8.1, + "status": "moderate", + "error_pattern": "CARRY_TOO_LONG" + }, + "s3_shot_6i_44": { + "diff_carry_yd": -1.2, + "diff_total_yd": -27.4, + "diff_apex_ft": -1.3, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_SHORT" + }, + "s3_shot_6i_45": { + "diff_carry_yd": 3.5, + "diff_total_yd": 21.1, + "diff_apex_ft": 0.6, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "s3_shot_6i_46": { + "diff_carry_yd": 3.8, + "diff_total_yd": -3.5, + "diff_apex_ft": -1.5, + "status": "moderate", + "error_pattern": "CARRY_TOO_LONG" + }, + "s3_shot_6i_47": { + "diff_carry_yd": 7.0, + "diff_total_yd": 10.8, + "diff_apex_ft": 11.8, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "s3_shot_6i_48": { + "diff_carry_yd": 6.1, + "diff_total_yd": 11.1, + "diff_apex_ft": 14.2, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "s3_shot_6i_49": { + "diff_carry_yd": -2.5, + "diff_total_yd": 7.0, + "diff_apex_ft": -0.3, + "status": "moderate", + "error_pattern": "ROLLOUT_TOO_LONG" + }, + "s3_shot_6i_50": { + "diff_carry_yd": -0.4, + "diff_total_yd": -12.1, + "diff_apex_ft": 3.9, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_SHORT" + }, + "s3_shot_7i_25": { + "diff_carry_yd": -0.5, + "diff_total_yd": -18.0, + "diff_apex_ft": 0.9, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_SHORT" + }, + "s3_shot_7i_26": { + "diff_carry_yd": 1.8, + "diff_total_yd": -21.8, + "diff_apex_ft": 1.1, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_SHORT" + }, + "s3_shot_7i_27": { + "diff_carry_yd": 1.8, + "diff_total_yd": 4.3, + "diff_apex_ft": 8.0, + "status": "pass", + "error_pattern": null + }, + "s3_shot_7i_28": { + "diff_carry_yd": 1.2, + "diff_total_yd": 1.2, + "diff_apex_ft": 8.3, + "status": "pass", + "error_pattern": null + }, + "s3_shot_7i_29": { + "diff_carry_yd": 1.0, + "diff_total_yd": -5.8, + "diff_apex_ft": -3.5, + "status": "moderate", + "error_pattern": "ROLLOUT_TOO_SHORT" + }, + "s3_shot_7i_30": { + "diff_carry_yd": -0.2, + "diff_total_yd": 1.5, + "diff_apex_ft": 5.5, + "status": "pass", + "error_pattern": null + }, + "s3_shot_7i_31": { + "diff_carry_yd": -4.8, + "diff_total_yd": -14.3, + "diff_apex_ft": -4.1, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_SHORT" + }, + "s3_shot_7i_32": { + "diff_carry_yd": -1.8, + "diff_total_yd": -2.2, + "diff_apex_ft": 3.1, + "status": "pass", + "error_pattern": null + }, + "s3_shot_7i_33": { + "diff_carry_yd": -1.6, + "diff_total_yd": -1.3, + "diff_apex_ft": 4.7, + "status": "pass", + "error_pattern": null + }, + "s3_shot_7i_34": { + "diff_carry_yd": 4.4, + "diff_total_yd": 2.6, + "diff_apex_ft": 3.1, + "status": "moderate", + "error_pattern": "CARRY_TOO_LONG" + }, + "s3_shot_9i_1": { + "diff_carry_yd": -1.4, + "diff_total_yd": -12.6, + "diff_apex_ft": 1.3, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_SHORT" + }, + "s3_shot_9i_2": { + "diff_carry_yd": -8.0, + "diff_total_yd": -9.1, + "diff_apex_ft": -3.0, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_SHORT" + }, + "s3_shot_9i_3": { + "diff_carry_yd": -1.4, + "diff_total_yd": 1.1, + "diff_apex_ft": -5.3, + "status": "pass", + "error_pattern": null + }, + "s3_shot_9i_5": { + "diff_carry_yd": -2.6, + "diff_total_yd": -5.5, + "diff_apex_ft": -5.5, + "status": "moderate", + "error_pattern": "ROLLOUT_TOO_SHORT" + }, + "s3_shot_9i_7": { + "diff_carry_yd": 1.1, + "diff_total_yd": 1.6, + "diff_apex_ft": -4.2, + "status": "pass", + "error_pattern": null + }, + "s3_shot_9i_8": { + "diff_carry_yd": -1.6, + "diff_total_yd": 4.1, + "diff_apex_ft": -1.5, + "status": "pass", + "error_pattern": null + }, + "s3_shot_9i_9": { + "diff_carry_yd": -1.2, + "diff_total_yd": 1.9, + "diff_apex_ft": -6.1, + "status": "pass", + "error_pattern": null + }, + "s3_shot_driver_51": { + "diff_carry_yd": 11.4, + "diff_total_yd": 29.6, + "diff_apex_ft": 0.6, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "s3_shot_driver_52": { + "diff_carry_yd": 9.4, + "diff_total_yd": 25.3, + "diff_apex_ft": -1.4, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "s3_shot_driver_53": { + "diff_carry_yd": 6.5, + "diff_total_yd": 17.9, + "diff_apex_ft": -3.8, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "s3_shot_driver_54": { + "diff_carry_yd": 5.4, + "diff_total_yd": 0.0, + "diff_apex_ft": -2.2, + "status": "moderate", + "error_pattern": "CARRY_TOO_LONG" + }, + "s3_shot_driver_55": { + "diff_carry_yd": 2.5, + "diff_total_yd": 22.6, + "diff_apex_ft": 0.4, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_LONG" + }, + "s3_shot_driver_56": { + "diff_carry_yd": 4.8, + "diff_total_yd": 20.7, + "diff_apex_ft": 9.7, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "s3_shot_driver_57": { + "diff_carry_yd": -5.1, + "diff_total_yd": -19.7, + "diff_apex_ft": -3.5, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_SHORT" + }, + "s3_shot_driver_58": { + "diff_carry_yd": 18.0, + "diff_total_yd": 37.0, + "diff_apex_ft": -4.8, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "s3_shot_driver_59": { + "diff_carry_yd": -0.9, + "diff_total_yd": 17.7, + "diff_apex_ft": -3.8, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_LONG" + }, + "s3_shot_driver_60": { + "diff_carry_yd": 0.0, + "diff_total_yd": -14.9, + "diff_apex_ft": -2.4, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_SHORT" + }, + "s3_shot_pw_64": { + "diff_carry_yd": -4.4, + "diff_total_yd": 9.6, + "diff_apex_ft": -3.7, + "status": "moderate", + "error_pattern": "CARRY_TOO_SHORT" + }, + "s3_shot_pw_65": { + "diff_carry_yd": -0.1, + "diff_total_yd": 4.7, + "diff_apex_ft": -3.8, + "status": "pass", + "error_pattern": null + }, + "s3_shot_pw_66": { + "diff_carry_yd": -2.6, + "diff_total_yd": 11.3, + "diff_apex_ft": -3.7, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_LONG" + }, + "s3_shot_pw_67": { + "diff_carry_yd": 0.0, + "diff_total_yd": 5.7, + "diff_apex_ft": -4.0, + "status": "moderate", + "error_pattern": "ROLLOUT_TOO_LONG" + }, + "s3_shot_pw_68": { + "diff_carry_yd": 3.4, + "diff_total_yd": 6.1, + "diff_apex_ft": -6.2, + "status": "moderate", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "s3_shot_pw_69": { + "diff_carry_yd": -2.8, + "diff_total_yd": -3.9, + "diff_apex_ft": -3.8, + "status": "pass", + "error_pattern": null + }, + "topped_test_shot": { + "diff_carry_yd": -0.6, + "diff_total_yd": 13.9, + "diff_apex_ft": -0.1, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_LONG" + }, + "wedge_shot_1": { + "diff_carry_yd": -5.1, + "diff_total_yd": -0.7, + "diff_apex_ft": -2.4, + "status": "moderate", + "error_pattern": "CARRY_TOO_SHORT" + }, + "wedge_shot_2": { + "diff_carry_yd": -6.1, + "diff_total_yd": 2.7, + "diff_apex_ft": -4.2, + "status": "moderate", + "error_pattern": "CARRY_TOO_SHORT" + }, + "wedge_test_shot": { + "diff_carry_yd": -5.0, + "diff_total_yd": 3.6, + "diff_apex_ft": -3.2, + "status": "moderate", + "error_pattern": "CARRY_TOO_SHORT" + }, + "wedge_test_shot2": { + "diff_carry_yd": -5.4, + "diff_total_yd": 3.1, + "diff_apex_ft": -2.0, + "status": "moderate", + "error_pattern": "CARRY_TOO_SHORT" + }, + "wood1": { + "diff_carry_yd": 12.7, + "diff_total_yd": -3.2, + "diff_apex_ft": 3.2, + "status": "severe", + "error_pattern": "CARRY_TOO_LONG" + }, + "wood2": { + "diff_carry_yd": 4.8, + "diff_total_yd": 0.7, + "diff_apex_ft": -1.6, + "status": "moderate", + "error_pattern": "CARRY_TOO_LONG" + }, + "wood_low_test_shot": { + "diff_carry_yd": 1.8, + "diff_total_yd": 22.9, + "diff_apex_ft": 0.4, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_LONG" + } + }, + "regressions": [], + "conflicts": [ + "Bounce.FlightTangentialRetentionBase", + "Bounce.FlightSpinFactorMin", + "Bounce.FlightSpinFactorDivisor", + "Rollout.MidSpinMultiplierMax", + "Rollout.HighSpinMultiplierMax", + "Rollout.FrictionBlendSpeed", + "KineticFrictionMultiplier", + "Bounce.RolloutHighSpinRetention", + "Bounce.CorBaseA", + "Rollout.LowSpinMultiplierMax", + "Rollout.LowSpinThreshold", + "RollingFrictionMultiplier", + "Bounce.RolloutLowSpinRetention", + "Flight.ClMaxBase", + "Flight.CdMin", + "Flight.HighLaunchDragBoostMax", + "DragScaleMultiplier", + "LiftScaleMultiplier" + ] +} diff --git a/assets/data/calibration/history/iteration_029.json b/assets/data/calibration/history/iteration_029.json new file mode 100644 index 0000000..93b7af4 --- /dev/null +++ b/assets/data/calibration/history/iteration_029.json @@ -0,0 +1,748 @@ +{ + "iteration": 29, + "timestamp": "2026-03-13T18:00:33.707063", + "profile_overrides": {}, + "summary": { + "pass": 20, + "moderate": 24, + "severe": 55, + "no_reference": 3 + }, + "per_shot": { + "5iron": { + "diff_carry_yd": 5.6, + "diff_total_yd": 12.1, + "diff_apex_ft": 5.0, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "approach_mid_iron_test_shot": { + "diff_carry_yd": 0.0, + "diff_total_yd": 7.9, + "diff_apex_ft": -4.7, + "status": "moderate", + "error_pattern": "ROLLOUT_TOO_LONG" + }, + "bump_and_run": { + "diff_carry_yd": -9.1, + "diff_total_yd": -27.5, + "diff_apex_ft": -2.1, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_SHORT" + }, + "bump_and_run_slow": { + "diff_carry_yd": null, + "diff_total_yd": null, + "diff_apex_ft": null, + "status": "pass", + "error_pattern": null + }, + "bump_test_shot": { + "diff_carry_yd": -2.1, + "diff_total_yd": 12.8, + "diff_apex_ft": -0.1, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_LONG" + }, + "checked_test_shot": { + "diff_carry_yd": -0.6, + "diff_total_yd": 1.1, + "diff_apex_ft": -8.7, + "status": "pass", + "error_pattern": null + }, + "chip_test_shot": { + "diff_carry_yd": null, + "diff_total_yd": null, + "diff_apex_ft": null, + "status": "pass", + "error_pattern": null + }, + "drive_test_shot": { + "diff_carry_yd": 1.0, + "diff_total_yd": 0.8, + "diff_apex_ft": -0.6, + "status": "pass", + "error_pattern": null + }, + "driver1": { + "diff_carry_yd": 0.3, + "diff_total_yd": -25.7, + "diff_apex_ft": -0.7, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_SHORT" + }, + "driver2": { + "diff_carry_yd": 8.9, + "diff_total_yd": 8.6, + "diff_apex_ft": -2.7, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "driver3": { + "diff_carry_yd": 6.2, + "diff_total_yd": 23.3, + "diff_apex_ft": 21.1, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "driver4": { + "diff_carry_yd": 7.7, + "diff_total_yd": 16.3, + "diff_apex_ft": 4.4, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "flop_test_shot": { + "diff_carry_yd": 0.9, + "diff_total_yd": 2.8, + "diff_apex_ft": -7.6, + "status": "pass", + "error_pattern": null + }, + "p_wedge_shot_1": { + "diff_carry_yd": -4.3, + "diff_total_yd": 2.2, + "diff_apex_ft": -5.4, + "status": "moderate", + "error_pattern": "CARRY_TOO_SHORT" + }, + "s2_shot_10": { + "diff_carry_yd": 4.0, + "diff_total_yd": 10.7, + "diff_apex_ft": -5.8, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "s2_shot_11": { + "diff_carry_yd": -1.7, + "diff_total_yd": 2.0, + "diff_apex_ft": -4.4, + "status": "pass", + "error_pattern": null + }, + "s2_shot_12": { + "diff_carry_yd": 5.2, + "diff_total_yd": 9.5, + "diff_apex_ft": -5.1, + "status": "moderate", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "s2_shot_13": { + "diff_carry_yd": 1.8, + "diff_total_yd": 3.0, + "diff_apex_ft": -5.9, + "status": "pass", + "error_pattern": null + }, + "s2_shot_14": { + "diff_carry_yd": 0.2, + "diff_total_yd": 1.6, + "diff_apex_ft": -5.9, + "status": "pass", + "error_pattern": null + }, + "s2_shot_15": { + "diff_carry_yd": -0.6, + "diff_total_yd": -12.3, + "diff_apex_ft": -1.9, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_SHORT" + }, + "s2_shot_16": { + "diff_carry_yd": 0.4, + "diff_total_yd": 2.2, + "diff_apex_ft": -3.2, + "status": "pass", + "error_pattern": null + }, + "s2_shot_17": { + "diff_carry_yd": 7.2, + "diff_total_yd": 9.2, + "diff_apex_ft": -3.6, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "s2_shot_18": { + "diff_carry_yd": 5.1, + "diff_total_yd": 16.6, + "diff_apex_ft": 3.1, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "s2_shot_19": { + "diff_carry_yd": 3.3, + "diff_total_yd": -4.4, + "diff_apex_ft": -0.9, + "status": "moderate", + "error_pattern": "CARRY_TOO_LONG" + }, + "s2_shot_20": { + "diff_carry_yd": 7.2, + "diff_total_yd": 11.1, + "diff_apex_ft": -1.8, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "s2_shot_21": { + "diff_carry_yd": 5.8, + "diff_total_yd": 28.8, + "diff_apex_ft": 1.8, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "s2_shot_22": { + "diff_carry_yd": 5.7, + "diff_total_yd": 3.5, + "diff_apex_ft": -1.4, + "status": "moderate", + "error_pattern": "CARRY_TOO_LONG" + }, + "s2_shot_23": { + "diff_carry_yd": 4.2, + "diff_total_yd": -18.9, + "diff_apex_ft": 0.1, + "status": "severe", + "error_pattern": "CARRY_TOO_LONG" + }, + "s2_shot_24": { + "diff_carry_yd": 5.7, + "diff_total_yd": 2.7, + "diff_apex_ft": -1.6, + "status": "moderate", + "error_pattern": "CARRY_TOO_LONG" + }, + "s2_shot_26": { + "diff_carry_yd": 2.6, + "diff_total_yd": 23.1, + "diff_apex_ft": 24.2, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_LONG" + }, + "s2_shot_27": { + "diff_carry_yd": 3.6, + "diff_total_yd": 13.8, + "diff_apex_ft": 5.0, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "s2_shot_9": { + "diff_carry_yd": -2.8, + "diff_total_yd": 3.5, + "diff_apex_ft": 7.3, + "status": "pass", + "error_pattern": null + }, + "s3_shot_3w_18": { + "diff_carry_yd": null, + "diff_total_yd": null, + "diff_apex_ft": null, + "status": "pass", + "error_pattern": null + }, + "s3_shot_3w_19": { + "diff_carry_yd": -0.1, + "diff_total_yd": 16.7, + "diff_apex_ft": 0.1, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_LONG" + }, + "s3_shot_3w_21": { + "diff_carry_yd": 1.1, + "diff_total_yd": 16.6, + "diff_apex_ft": 0.3, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_LONG" + }, + "s3_shot_3w_22": { + "diff_carry_yd": 3.1, + "diff_total_yd": 20.2, + "diff_apex_ft": 0.5, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "s3_shot_3w_23": { + "diff_carry_yd": 0.8, + "diff_total_yd": -22.7, + "diff_apex_ft": -1.2, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_SHORT" + }, + "s3_shot_3w_24": { + "diff_carry_yd": 7.9, + "diff_total_yd": 29.6, + "diff_apex_ft": 1.9, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "s3_shot_5i_10": { + "diff_carry_yd": 3.0, + "diff_total_yd": -7.1, + "diff_apex_ft": 5.9, + "status": "moderate", + "error_pattern": "ROLLOUT_TOO_SHORT" + }, + "s3_shot_5i_11": { + "diff_carry_yd": -3.2, + "diff_total_yd": -17.2, + "diff_apex_ft": -1.3, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_SHORT" + }, + "s3_shot_5i_12": { + "diff_carry_yd": 1.2, + "diff_total_yd": -23.5, + "diff_apex_ft": 1.1, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_SHORT" + }, + "s3_shot_5i_13": { + "diff_carry_yd": 2.6, + "diff_total_yd": 10.1, + "diff_apex_ft": 0.6, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_LONG" + }, + "s3_shot_5i_15": { + "diff_carry_yd": -4.5, + "diff_total_yd": 14.7, + "diff_apex_ft": -1.1, + "status": "severe", + "error_pattern": "CARRY_TOO_SHORT" + }, + "s3_shot_5i_16": { + "diff_carry_yd": 1.1, + "diff_total_yd": -20.8, + "diff_apex_ft": -0.2, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_SHORT" + }, + "s3_shot_5i_17": { + "diff_carry_yd": -2.0, + "diff_total_yd": -1.9, + "diff_apex_ft": -0.3, + "status": "pass", + "error_pattern": null + }, + "s3_shot_6i_35": { + "diff_carry_yd": -5.1, + "diff_total_yd": -16.6, + "diff_apex_ft": -3.3, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_SHORT" + }, + "s3_shot_6i_36": { + "diff_carry_yd": 2.1, + "diff_total_yd": -20.8, + "diff_apex_ft": 0.6, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_SHORT" + }, + "s3_shot_6i_37": { + "diff_carry_yd": -3.6, + "diff_total_yd": 12.2, + "diff_apex_ft": -0.8, + "status": "severe", + "error_pattern": "CARRY_TOO_SHORT" + }, + "s3_shot_6i_38": { + "diff_carry_yd": -3.2, + "diff_total_yd": -21.3, + "diff_apex_ft": 0.1, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_SHORT" + }, + "s3_shot_6i_39": { + "diff_carry_yd": -0.5, + "diff_total_yd": 6.4, + "diff_apex_ft": 0.0, + "status": "moderate", + "error_pattern": "ROLLOUT_TOO_LONG" + }, + "s3_shot_6i_40": { + "diff_carry_yd": -1.2, + "diff_total_yd": 7.8, + "diff_apex_ft": 0.1, + "status": "moderate", + "error_pattern": "ROLLOUT_TOO_LONG" + }, + "s3_shot_6i_41": { + "diff_carry_yd": -4.6, + "diff_total_yd": 13.2, + "diff_apex_ft": -1.0, + "status": "severe", + "error_pattern": "CARRY_TOO_SHORT" + }, + "s3_shot_6i_42": { + "diff_carry_yd": -1.1, + "diff_total_yd": -17.4, + "diff_apex_ft": 0.8, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_SHORT" + }, + "s3_shot_6i_43": { + "diff_carry_yd": 6.4, + "diff_total_yd": 0.9, + "diff_apex_ft": 8.1, + "status": "moderate", + "error_pattern": "CARRY_TOO_LONG" + }, + "s3_shot_6i_44": { + "diff_carry_yd": -1.2, + "diff_total_yd": -27.4, + "diff_apex_ft": -1.3, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_SHORT" + }, + "s3_shot_6i_45": { + "diff_carry_yd": 3.5, + "diff_total_yd": 21.1, + "diff_apex_ft": 0.6, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "s3_shot_6i_46": { + "diff_carry_yd": 3.8, + "diff_total_yd": -3.5, + "diff_apex_ft": -1.5, + "status": "moderate", + "error_pattern": "CARRY_TOO_LONG" + }, + "s3_shot_6i_47": { + "diff_carry_yd": 7.0, + "diff_total_yd": 10.8, + "diff_apex_ft": 11.8, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "s3_shot_6i_48": { + "diff_carry_yd": 6.1, + "diff_total_yd": 11.1, + "diff_apex_ft": 14.2, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "s3_shot_6i_49": { + "diff_carry_yd": -2.5, + "diff_total_yd": 7.0, + "diff_apex_ft": -0.3, + "status": "moderate", + "error_pattern": "ROLLOUT_TOO_LONG" + }, + "s3_shot_6i_50": { + "diff_carry_yd": -0.4, + "diff_total_yd": -12.1, + "diff_apex_ft": 3.9, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_SHORT" + }, + "s3_shot_7i_25": { + "diff_carry_yd": -0.5, + "diff_total_yd": -18.0, + "diff_apex_ft": 0.9, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_SHORT" + }, + "s3_shot_7i_26": { + "diff_carry_yd": 1.8, + "diff_total_yd": -21.8, + "diff_apex_ft": 1.1, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_SHORT" + }, + "s3_shot_7i_27": { + "diff_carry_yd": 1.8, + "diff_total_yd": 4.3, + "diff_apex_ft": 8.0, + "status": "pass", + "error_pattern": null + }, + "s3_shot_7i_28": { + "diff_carry_yd": 1.2, + "diff_total_yd": 1.2, + "diff_apex_ft": 8.3, + "status": "pass", + "error_pattern": null + }, + "s3_shot_7i_29": { + "diff_carry_yd": 1.0, + "diff_total_yd": -5.8, + "diff_apex_ft": -3.5, + "status": "moderate", + "error_pattern": "ROLLOUT_TOO_SHORT" + }, + "s3_shot_7i_30": { + "diff_carry_yd": -0.2, + "diff_total_yd": 1.5, + "diff_apex_ft": 5.5, + "status": "pass", + "error_pattern": null + }, + "s3_shot_7i_31": { + "diff_carry_yd": -4.8, + "diff_total_yd": -14.3, + "diff_apex_ft": -4.1, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_SHORT" + }, + "s3_shot_7i_32": { + "diff_carry_yd": -1.8, + "diff_total_yd": -2.2, + "diff_apex_ft": 3.1, + "status": "pass", + "error_pattern": null + }, + "s3_shot_7i_33": { + "diff_carry_yd": -1.6, + "diff_total_yd": -1.3, + "diff_apex_ft": 4.7, + "status": "pass", + "error_pattern": null + }, + "s3_shot_7i_34": { + "diff_carry_yd": 4.4, + "diff_total_yd": 2.6, + "diff_apex_ft": 3.1, + "status": "moderate", + "error_pattern": "CARRY_TOO_LONG" + }, + "s3_shot_9i_1": { + "diff_carry_yd": -1.4, + "diff_total_yd": -12.6, + "diff_apex_ft": 1.3, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_SHORT" + }, + "s3_shot_9i_2": { + "diff_carry_yd": -8.0, + "diff_total_yd": -9.1, + "diff_apex_ft": -3.0, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_SHORT" + }, + "s3_shot_9i_3": { + "diff_carry_yd": -1.4, + "diff_total_yd": 1.1, + "diff_apex_ft": -5.3, + "status": "pass", + "error_pattern": null + }, + "s3_shot_9i_5": { + "diff_carry_yd": -2.6, + "diff_total_yd": -5.5, + "diff_apex_ft": -5.5, + "status": "moderate", + "error_pattern": "ROLLOUT_TOO_SHORT" + }, + "s3_shot_9i_7": { + "diff_carry_yd": 1.1, + "diff_total_yd": 1.6, + "diff_apex_ft": -4.2, + "status": "pass", + "error_pattern": null + }, + "s3_shot_9i_8": { + "diff_carry_yd": -1.6, + "diff_total_yd": 4.1, + "diff_apex_ft": -1.5, + "status": "pass", + "error_pattern": null + }, + "s3_shot_9i_9": { + "diff_carry_yd": -1.2, + "diff_total_yd": 1.9, + "diff_apex_ft": -6.1, + "status": "pass", + "error_pattern": null + }, + "s3_shot_driver_51": { + "diff_carry_yd": 11.4, + "diff_total_yd": 29.6, + "diff_apex_ft": 0.6, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "s3_shot_driver_52": { + "diff_carry_yd": 9.4, + "diff_total_yd": 25.3, + "diff_apex_ft": -1.4, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "s3_shot_driver_53": { + "diff_carry_yd": 6.5, + "diff_total_yd": 17.9, + "diff_apex_ft": -3.8, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "s3_shot_driver_54": { + "diff_carry_yd": 5.4, + "diff_total_yd": 0.0, + "diff_apex_ft": -2.2, + "status": "moderate", + "error_pattern": "CARRY_TOO_LONG" + }, + "s3_shot_driver_55": { + "diff_carry_yd": 2.5, + "diff_total_yd": 22.6, + "diff_apex_ft": 0.4, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_LONG" + }, + "s3_shot_driver_56": { + "diff_carry_yd": 4.8, + "diff_total_yd": 20.7, + "diff_apex_ft": 9.7, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "s3_shot_driver_57": { + "diff_carry_yd": -5.1, + "diff_total_yd": -19.7, + "diff_apex_ft": -3.5, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_SHORT" + }, + "s3_shot_driver_58": { + "diff_carry_yd": 18.0, + "diff_total_yd": 37.0, + "diff_apex_ft": -4.8, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "s3_shot_driver_59": { + "diff_carry_yd": -0.9, + "diff_total_yd": 17.7, + "diff_apex_ft": -3.8, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_LONG" + }, + "s3_shot_driver_60": { + "diff_carry_yd": 0.0, + "diff_total_yd": -14.9, + "diff_apex_ft": -2.4, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_SHORT" + }, + "s3_shot_pw_64": { + "diff_carry_yd": -4.4, + "diff_total_yd": 9.6, + "diff_apex_ft": -3.7, + "status": "moderate", + "error_pattern": "CARRY_TOO_SHORT" + }, + "s3_shot_pw_65": { + "diff_carry_yd": -0.1, + "diff_total_yd": 4.7, + "diff_apex_ft": -3.8, + "status": "pass", + "error_pattern": null + }, + "s3_shot_pw_66": { + "diff_carry_yd": -2.6, + "diff_total_yd": 11.3, + "diff_apex_ft": -3.7, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_LONG" + }, + "s3_shot_pw_67": { + "diff_carry_yd": 0.0, + "diff_total_yd": 5.7, + "diff_apex_ft": -4.0, + "status": "moderate", + "error_pattern": "ROLLOUT_TOO_LONG" + }, + "s3_shot_pw_68": { + "diff_carry_yd": 3.4, + "diff_total_yd": 6.1, + "diff_apex_ft": -6.2, + "status": "moderate", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "s3_shot_pw_69": { + "diff_carry_yd": -2.8, + "diff_total_yd": -3.9, + "diff_apex_ft": -3.8, + "status": "pass", + "error_pattern": null + }, + "topped_test_shot": { + "diff_carry_yd": -0.6, + "diff_total_yd": 13.9, + "diff_apex_ft": -0.1, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_LONG" + }, + "wedge_shot_1": { + "diff_carry_yd": -5.1, + "diff_total_yd": -0.7, + "diff_apex_ft": -2.4, + "status": "moderate", + "error_pattern": "CARRY_TOO_SHORT" + }, + "wedge_shot_2": { + "diff_carry_yd": -6.1, + "diff_total_yd": 2.7, + "diff_apex_ft": -4.2, + "status": "moderate", + "error_pattern": "CARRY_TOO_SHORT" + }, + "wedge_test_shot": { + "diff_carry_yd": -5.0, + "diff_total_yd": 3.6, + "diff_apex_ft": -3.2, + "status": "moderate", + "error_pattern": "CARRY_TOO_SHORT" + }, + "wedge_test_shot2": { + "diff_carry_yd": -5.4, + "diff_total_yd": 3.1, + "diff_apex_ft": -2.0, + "status": "moderate", + "error_pattern": "CARRY_TOO_SHORT" + }, + "wood1": { + "diff_carry_yd": 12.7, + "diff_total_yd": -3.2, + "diff_apex_ft": 3.2, + "status": "severe", + "error_pattern": "CARRY_TOO_LONG" + }, + "wood2": { + "diff_carry_yd": 4.8, + "diff_total_yd": 0.7, + "diff_apex_ft": -1.6, + "status": "moderate", + "error_pattern": "CARRY_TOO_LONG" + }, + "wood_low_test_shot": { + "diff_carry_yd": 1.8, + "diff_total_yd": 22.9, + "diff_apex_ft": 0.4, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_LONG" + } + }, + "regressions": [], + "conflicts": [ + "Bounce.FlightTangentialRetentionBase", + "Bounce.FlightSpinFactorMin", + "Bounce.FlightSpinFactorDivisor", + "Rollout.MidSpinMultiplierMax", + "Rollout.HighSpinMultiplierMax", + "Rollout.FrictionBlendSpeed", + "KineticFrictionMultiplier", + "Bounce.RolloutHighSpinRetention", + "Bounce.CorBaseA", + "Rollout.LowSpinMultiplierMax", + "Rollout.LowSpinThreshold", + "RollingFrictionMultiplier", + "Bounce.RolloutLowSpinRetention", + "Flight.ClMaxBase", + "Flight.CdMin", + "Flight.HighLaunchDragBoostMax", + "DragScaleMultiplier", + "LiftScaleMultiplier" + ] +} diff --git a/assets/data/calibration/history/iteration_030.json b/assets/data/calibration/history/iteration_030.json new file mode 100644 index 0000000..416b35c --- /dev/null +++ b/assets/data/calibration/history/iteration_030.json @@ -0,0 +1,748 @@ +{ + "iteration": 30, + "timestamp": "2026-03-13T18:13:04.689420", + "profile_overrides": {}, + "summary": { + "pass": 20, + "moderate": 24, + "severe": 55, + "no_reference": 3 + }, + "per_shot": { + "5iron": { + "diff_carry_yd": 5.6, + "diff_total_yd": 12.1, + "diff_apex_ft": 5.0, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "approach_mid_iron_test_shot": { + "diff_carry_yd": 0.0, + "diff_total_yd": 7.9, + "diff_apex_ft": -4.7, + "status": "moderate", + "error_pattern": "ROLLOUT_TOO_LONG" + }, + "bump_and_run": { + "diff_carry_yd": -9.1, + "diff_total_yd": -27.5, + "diff_apex_ft": -2.1, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_SHORT" + }, + "bump_and_run_slow": { + "diff_carry_yd": null, + "diff_total_yd": null, + "diff_apex_ft": null, + "status": "pass", + "error_pattern": null + }, + "bump_test_shot": { + "diff_carry_yd": -2.1, + "diff_total_yd": 12.8, + "diff_apex_ft": -0.1, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_LONG" + }, + "checked_test_shot": { + "diff_carry_yd": -0.6, + "diff_total_yd": 1.1, + "diff_apex_ft": -8.7, + "status": "pass", + "error_pattern": null + }, + "chip_test_shot": { + "diff_carry_yd": null, + "diff_total_yd": null, + "diff_apex_ft": null, + "status": "pass", + "error_pattern": null + }, + "drive_test_shot": { + "diff_carry_yd": 1.0, + "diff_total_yd": 0.8, + "diff_apex_ft": -0.6, + "status": "pass", + "error_pattern": null + }, + "driver1": { + "diff_carry_yd": 0.3, + "diff_total_yd": -25.7, + "diff_apex_ft": -0.7, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_SHORT" + }, + "driver2": { + "diff_carry_yd": 8.9, + "diff_total_yd": 8.6, + "diff_apex_ft": -2.7, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "driver3": { + "diff_carry_yd": 6.2, + "diff_total_yd": 23.3, + "diff_apex_ft": 21.1, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "driver4": { + "diff_carry_yd": 7.7, + "diff_total_yd": 16.3, + "diff_apex_ft": 4.4, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "flop_test_shot": { + "diff_carry_yd": 0.9, + "diff_total_yd": 2.8, + "diff_apex_ft": -7.6, + "status": "pass", + "error_pattern": null + }, + "p_wedge_shot_1": { + "diff_carry_yd": -4.3, + "diff_total_yd": 2.2, + "diff_apex_ft": -5.4, + "status": "moderate", + "error_pattern": "CARRY_TOO_SHORT" + }, + "s2_shot_10": { + "diff_carry_yd": 4.0, + "diff_total_yd": 10.7, + "diff_apex_ft": -5.8, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "s2_shot_11": { + "diff_carry_yd": -1.7, + "diff_total_yd": 2.0, + "diff_apex_ft": -4.4, + "status": "pass", + "error_pattern": null + }, + "s2_shot_12": { + "diff_carry_yd": 5.2, + "diff_total_yd": 9.5, + "diff_apex_ft": -5.1, + "status": "moderate", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "s2_shot_13": { + "diff_carry_yd": 1.8, + "diff_total_yd": 3.0, + "diff_apex_ft": -5.9, + "status": "pass", + "error_pattern": null + }, + "s2_shot_14": { + "diff_carry_yd": 0.2, + "diff_total_yd": 1.6, + "diff_apex_ft": -5.9, + "status": "pass", + "error_pattern": null + }, + "s2_shot_15": { + "diff_carry_yd": -0.6, + "diff_total_yd": -12.3, + "diff_apex_ft": -1.9, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_SHORT" + }, + "s2_shot_16": { + "diff_carry_yd": 0.4, + "diff_total_yd": 2.2, + "diff_apex_ft": -3.2, + "status": "pass", + "error_pattern": null + }, + "s2_shot_17": { + "diff_carry_yd": 7.2, + "diff_total_yd": 9.2, + "diff_apex_ft": -3.6, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "s2_shot_18": { + "diff_carry_yd": 5.1, + "diff_total_yd": 16.6, + "diff_apex_ft": 3.1, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "s2_shot_19": { + "diff_carry_yd": 3.3, + "diff_total_yd": -4.4, + "diff_apex_ft": -0.9, + "status": "moderate", + "error_pattern": "CARRY_TOO_LONG" + }, + "s2_shot_20": { + "diff_carry_yd": 7.2, + "diff_total_yd": 11.1, + "diff_apex_ft": -1.8, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "s2_shot_21": { + "diff_carry_yd": 5.8, + "diff_total_yd": 28.8, + "diff_apex_ft": 1.8, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "s2_shot_22": { + "diff_carry_yd": 5.7, + "diff_total_yd": 3.5, + "diff_apex_ft": -1.4, + "status": "moderate", + "error_pattern": "CARRY_TOO_LONG" + }, + "s2_shot_23": { + "diff_carry_yd": 4.2, + "diff_total_yd": -18.9, + "diff_apex_ft": 0.1, + "status": "severe", + "error_pattern": "CARRY_TOO_LONG" + }, + "s2_shot_24": { + "diff_carry_yd": 5.7, + "diff_total_yd": 2.7, + "diff_apex_ft": -1.6, + "status": "moderate", + "error_pattern": "CARRY_TOO_LONG" + }, + "s2_shot_26": { + "diff_carry_yd": 2.6, + "diff_total_yd": 23.1, + "diff_apex_ft": 24.2, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_LONG" + }, + "s2_shot_27": { + "diff_carry_yd": 3.6, + "diff_total_yd": 13.8, + "diff_apex_ft": 5.0, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "s2_shot_9": { + "diff_carry_yd": -2.8, + "diff_total_yd": 3.5, + "diff_apex_ft": 7.3, + "status": "pass", + "error_pattern": null + }, + "s3_shot_3w_18": { + "diff_carry_yd": null, + "diff_total_yd": null, + "diff_apex_ft": null, + "status": "pass", + "error_pattern": null + }, + "s3_shot_3w_19": { + "diff_carry_yd": -0.1, + "diff_total_yd": 16.7, + "diff_apex_ft": 0.1, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_LONG" + }, + "s3_shot_3w_21": { + "diff_carry_yd": 1.1, + "diff_total_yd": 16.6, + "diff_apex_ft": 0.3, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_LONG" + }, + "s3_shot_3w_22": { + "diff_carry_yd": 3.1, + "diff_total_yd": 20.2, + "diff_apex_ft": 0.5, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "s3_shot_3w_23": { + "diff_carry_yd": 0.8, + "diff_total_yd": -22.7, + "diff_apex_ft": -1.2, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_SHORT" + }, + "s3_shot_3w_24": { + "diff_carry_yd": 7.9, + "diff_total_yd": 29.6, + "diff_apex_ft": 1.9, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "s3_shot_5i_10": { + "diff_carry_yd": 3.0, + "diff_total_yd": -7.1, + "diff_apex_ft": 5.9, + "status": "moderate", + "error_pattern": "ROLLOUT_TOO_SHORT" + }, + "s3_shot_5i_11": { + "diff_carry_yd": -3.2, + "diff_total_yd": -17.2, + "diff_apex_ft": -1.3, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_SHORT" + }, + "s3_shot_5i_12": { + "diff_carry_yd": 1.2, + "diff_total_yd": -23.5, + "diff_apex_ft": 1.1, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_SHORT" + }, + "s3_shot_5i_13": { + "diff_carry_yd": 2.6, + "diff_total_yd": 10.1, + "diff_apex_ft": 0.6, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_LONG" + }, + "s3_shot_5i_15": { + "diff_carry_yd": -4.5, + "diff_total_yd": 14.7, + "diff_apex_ft": -1.1, + "status": "severe", + "error_pattern": "CARRY_TOO_SHORT" + }, + "s3_shot_5i_16": { + "diff_carry_yd": 1.1, + "diff_total_yd": -20.8, + "diff_apex_ft": -0.2, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_SHORT" + }, + "s3_shot_5i_17": { + "diff_carry_yd": -2.0, + "diff_total_yd": -1.9, + "diff_apex_ft": -0.3, + "status": "pass", + "error_pattern": null + }, + "s3_shot_6i_35": { + "diff_carry_yd": -5.1, + "diff_total_yd": -16.6, + "diff_apex_ft": -3.3, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_SHORT" + }, + "s3_shot_6i_36": { + "diff_carry_yd": 2.1, + "diff_total_yd": -20.8, + "diff_apex_ft": 0.6, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_SHORT" + }, + "s3_shot_6i_37": { + "diff_carry_yd": -3.6, + "diff_total_yd": 12.2, + "diff_apex_ft": -0.8, + "status": "severe", + "error_pattern": "CARRY_TOO_SHORT" + }, + "s3_shot_6i_38": { + "diff_carry_yd": -3.2, + "diff_total_yd": -21.3, + "diff_apex_ft": 0.1, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_SHORT" + }, + "s3_shot_6i_39": { + "diff_carry_yd": -0.5, + "diff_total_yd": 6.4, + "diff_apex_ft": 0.0, + "status": "moderate", + "error_pattern": "ROLLOUT_TOO_LONG" + }, + "s3_shot_6i_40": { + "diff_carry_yd": -1.2, + "diff_total_yd": 7.8, + "diff_apex_ft": 0.1, + "status": "moderate", + "error_pattern": "ROLLOUT_TOO_LONG" + }, + "s3_shot_6i_41": { + "diff_carry_yd": -4.6, + "diff_total_yd": 13.2, + "diff_apex_ft": -1.0, + "status": "severe", + "error_pattern": "CARRY_TOO_SHORT" + }, + "s3_shot_6i_42": { + "diff_carry_yd": -1.1, + "diff_total_yd": -17.4, + "diff_apex_ft": 0.8, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_SHORT" + }, + "s3_shot_6i_43": { + "diff_carry_yd": 6.4, + "diff_total_yd": 0.9, + "diff_apex_ft": 8.1, + "status": "moderate", + "error_pattern": "CARRY_TOO_LONG" + }, + "s3_shot_6i_44": { + "diff_carry_yd": -1.2, + "diff_total_yd": -27.4, + "diff_apex_ft": -1.3, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_SHORT" + }, + "s3_shot_6i_45": { + "diff_carry_yd": 3.5, + "diff_total_yd": 21.1, + "diff_apex_ft": 0.6, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "s3_shot_6i_46": { + "diff_carry_yd": 3.8, + "diff_total_yd": -3.5, + "diff_apex_ft": -1.5, + "status": "moderate", + "error_pattern": "CARRY_TOO_LONG" + }, + "s3_shot_6i_47": { + "diff_carry_yd": 7.0, + "diff_total_yd": 10.8, + "diff_apex_ft": 11.8, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "s3_shot_6i_48": { + "diff_carry_yd": 6.1, + "diff_total_yd": 11.1, + "diff_apex_ft": 14.2, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "s3_shot_6i_49": { + "diff_carry_yd": -2.5, + "diff_total_yd": 7.0, + "diff_apex_ft": -0.3, + "status": "moderate", + "error_pattern": "ROLLOUT_TOO_LONG" + }, + "s3_shot_6i_50": { + "diff_carry_yd": -0.4, + "diff_total_yd": -12.1, + "diff_apex_ft": 3.9, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_SHORT" + }, + "s3_shot_7i_25": { + "diff_carry_yd": -0.5, + "diff_total_yd": -18.0, + "diff_apex_ft": 0.9, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_SHORT" + }, + "s3_shot_7i_26": { + "diff_carry_yd": 1.8, + "diff_total_yd": -21.8, + "diff_apex_ft": 1.1, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_SHORT" + }, + "s3_shot_7i_27": { + "diff_carry_yd": 1.8, + "diff_total_yd": 4.3, + "diff_apex_ft": 8.0, + "status": "pass", + "error_pattern": null + }, + "s3_shot_7i_28": { + "diff_carry_yd": 1.2, + "diff_total_yd": 1.2, + "diff_apex_ft": 8.3, + "status": "pass", + "error_pattern": null + }, + "s3_shot_7i_29": { + "diff_carry_yd": 1.0, + "diff_total_yd": -5.8, + "diff_apex_ft": -3.5, + "status": "moderate", + "error_pattern": "ROLLOUT_TOO_SHORT" + }, + "s3_shot_7i_30": { + "diff_carry_yd": -0.2, + "diff_total_yd": 1.5, + "diff_apex_ft": 5.5, + "status": "pass", + "error_pattern": null + }, + "s3_shot_7i_31": { + "diff_carry_yd": -4.8, + "diff_total_yd": -14.3, + "diff_apex_ft": -4.1, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_SHORT" + }, + "s3_shot_7i_32": { + "diff_carry_yd": -1.8, + "diff_total_yd": -2.2, + "diff_apex_ft": 3.1, + "status": "pass", + "error_pattern": null + }, + "s3_shot_7i_33": { + "diff_carry_yd": -1.6, + "diff_total_yd": -1.3, + "diff_apex_ft": 4.7, + "status": "pass", + "error_pattern": null + }, + "s3_shot_7i_34": { + "diff_carry_yd": 4.4, + "diff_total_yd": 2.6, + "diff_apex_ft": 3.1, + "status": "moderate", + "error_pattern": "CARRY_TOO_LONG" + }, + "s3_shot_9i_1": { + "diff_carry_yd": -1.4, + "diff_total_yd": -12.6, + "diff_apex_ft": 1.3, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_SHORT" + }, + "s3_shot_9i_2": { + "diff_carry_yd": -8.0, + "diff_total_yd": -9.1, + "diff_apex_ft": -3.0, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_SHORT" + }, + "s3_shot_9i_3": { + "diff_carry_yd": -1.4, + "diff_total_yd": 1.1, + "diff_apex_ft": -5.3, + "status": "pass", + "error_pattern": null + }, + "s3_shot_9i_5": { + "diff_carry_yd": -2.6, + "diff_total_yd": -5.5, + "diff_apex_ft": -5.5, + "status": "moderate", + "error_pattern": "ROLLOUT_TOO_SHORT" + }, + "s3_shot_9i_7": { + "diff_carry_yd": 1.1, + "diff_total_yd": 1.6, + "diff_apex_ft": -4.2, + "status": "pass", + "error_pattern": null + }, + "s3_shot_9i_8": { + "diff_carry_yd": -1.6, + "diff_total_yd": 4.1, + "diff_apex_ft": -1.5, + "status": "pass", + "error_pattern": null + }, + "s3_shot_9i_9": { + "diff_carry_yd": -1.2, + "diff_total_yd": 1.9, + "diff_apex_ft": -6.1, + "status": "pass", + "error_pattern": null + }, + "s3_shot_driver_51": { + "diff_carry_yd": 11.4, + "diff_total_yd": 29.6, + "diff_apex_ft": 0.6, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "s3_shot_driver_52": { + "diff_carry_yd": 9.4, + "diff_total_yd": 25.3, + "diff_apex_ft": -1.4, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "s3_shot_driver_53": { + "diff_carry_yd": 6.5, + "diff_total_yd": 17.9, + "diff_apex_ft": -3.8, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "s3_shot_driver_54": { + "diff_carry_yd": 5.4, + "diff_total_yd": 0.0, + "diff_apex_ft": -2.2, + "status": "moderate", + "error_pattern": "CARRY_TOO_LONG" + }, + "s3_shot_driver_55": { + "diff_carry_yd": 2.5, + "diff_total_yd": 22.6, + "diff_apex_ft": 0.4, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_LONG" + }, + "s3_shot_driver_56": { + "diff_carry_yd": 4.8, + "diff_total_yd": 20.7, + "diff_apex_ft": 9.7, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "s3_shot_driver_57": { + "diff_carry_yd": -5.1, + "diff_total_yd": -19.7, + "diff_apex_ft": -3.5, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_SHORT" + }, + "s3_shot_driver_58": { + "diff_carry_yd": 18.0, + "diff_total_yd": 37.0, + "diff_apex_ft": -4.8, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "s3_shot_driver_59": { + "diff_carry_yd": -0.9, + "diff_total_yd": 17.7, + "diff_apex_ft": -3.8, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_LONG" + }, + "s3_shot_driver_60": { + "diff_carry_yd": 0.0, + "diff_total_yd": -14.9, + "diff_apex_ft": -2.4, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_SHORT" + }, + "s3_shot_pw_64": { + "diff_carry_yd": -4.4, + "diff_total_yd": 9.6, + "diff_apex_ft": -3.7, + "status": "moderate", + "error_pattern": "CARRY_TOO_SHORT" + }, + "s3_shot_pw_65": { + "diff_carry_yd": -0.1, + "diff_total_yd": 4.7, + "diff_apex_ft": -3.8, + "status": "pass", + "error_pattern": null + }, + "s3_shot_pw_66": { + "diff_carry_yd": -2.6, + "diff_total_yd": 11.3, + "diff_apex_ft": -3.7, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_LONG" + }, + "s3_shot_pw_67": { + "diff_carry_yd": 0.0, + "diff_total_yd": 5.7, + "diff_apex_ft": -4.0, + "status": "moderate", + "error_pattern": "ROLLOUT_TOO_LONG" + }, + "s3_shot_pw_68": { + "diff_carry_yd": 3.4, + "diff_total_yd": 6.1, + "diff_apex_ft": -6.2, + "status": "moderate", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "s3_shot_pw_69": { + "diff_carry_yd": -2.8, + "diff_total_yd": -3.9, + "diff_apex_ft": -3.8, + "status": "pass", + "error_pattern": null + }, + "topped_test_shot": { + "diff_carry_yd": -0.6, + "diff_total_yd": 13.9, + "diff_apex_ft": -0.1, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_LONG" + }, + "wedge_shot_1": { + "diff_carry_yd": -5.1, + "diff_total_yd": -0.7, + "diff_apex_ft": -2.4, + "status": "moderate", + "error_pattern": "CARRY_TOO_SHORT" + }, + "wedge_shot_2": { + "diff_carry_yd": -6.1, + "diff_total_yd": 2.7, + "diff_apex_ft": -4.2, + "status": "moderate", + "error_pattern": "CARRY_TOO_SHORT" + }, + "wedge_test_shot": { + "diff_carry_yd": -5.0, + "diff_total_yd": 3.6, + "diff_apex_ft": -3.2, + "status": "moderate", + "error_pattern": "CARRY_TOO_SHORT" + }, + "wedge_test_shot2": { + "diff_carry_yd": -5.4, + "diff_total_yd": 3.1, + "diff_apex_ft": -2.0, + "status": "moderate", + "error_pattern": "CARRY_TOO_SHORT" + }, + "wood1": { + "diff_carry_yd": 12.7, + "diff_total_yd": -3.2, + "diff_apex_ft": 3.2, + "status": "severe", + "error_pattern": "CARRY_TOO_LONG" + }, + "wood2": { + "diff_carry_yd": 4.8, + "diff_total_yd": 0.7, + "diff_apex_ft": -1.6, + "status": "moderate", + "error_pattern": "CARRY_TOO_LONG" + }, + "wood_low_test_shot": { + "diff_carry_yd": 1.8, + "diff_total_yd": 22.9, + "diff_apex_ft": 0.4, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_LONG" + } + }, + "regressions": [], + "conflicts": [ + "Bounce.FlightTangentialRetentionBase", + "Bounce.FlightSpinFactorMin", + "Bounce.FlightSpinFactorDivisor", + "Rollout.MidSpinMultiplierMax", + "Rollout.HighSpinMultiplierMax", + "Rollout.FrictionBlendSpeed", + "KineticFrictionMultiplier", + "Bounce.RolloutHighSpinRetention", + "Bounce.CorBaseA", + "Rollout.LowSpinMultiplierMax", + "Rollout.LowSpinThreshold", + "RollingFrictionMultiplier", + "Bounce.RolloutLowSpinRetention", + "Flight.ClMaxBase", + "Flight.CdMin", + "Flight.HighLaunchDragBoostMax", + "DragScaleMultiplier", + "LiftScaleMultiplier" + ] +} diff --git a/assets/data/calibration/history/iteration_031.json b/assets/data/calibration/history/iteration_031.json new file mode 100644 index 0000000..5c66c0e --- /dev/null +++ b/assets/data/calibration/history/iteration_031.json @@ -0,0 +1,748 @@ +{ + "iteration": 31, + "timestamp": "2026-03-13T18:27:05.268006", + "profile_overrides": {}, + "summary": { + "pass": 20, + "moderate": 24, + "severe": 55, + "no_reference": 3 + }, + "per_shot": { + "5iron": { + "diff_carry_yd": 5.6, + "diff_total_yd": 12.1, + "diff_apex_ft": 5.0, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "approach_mid_iron_test_shot": { + "diff_carry_yd": 0.0, + "diff_total_yd": 7.9, + "diff_apex_ft": -4.7, + "status": "moderate", + "error_pattern": "ROLLOUT_TOO_LONG" + }, + "bump_and_run": { + "diff_carry_yd": -9.1, + "diff_total_yd": -27.5, + "diff_apex_ft": -2.1, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_SHORT" + }, + "bump_and_run_slow": { + "diff_carry_yd": null, + "diff_total_yd": null, + "diff_apex_ft": null, + "status": "pass", + "error_pattern": null + }, + "bump_test_shot": { + "diff_carry_yd": -2.1, + "diff_total_yd": 12.8, + "diff_apex_ft": -0.1, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_LONG" + }, + "checked_test_shot": { + "diff_carry_yd": -0.6, + "diff_total_yd": 1.1, + "diff_apex_ft": -8.7, + "status": "pass", + "error_pattern": null + }, + "chip_test_shot": { + "diff_carry_yd": null, + "diff_total_yd": null, + "diff_apex_ft": null, + "status": "pass", + "error_pattern": null + }, + "drive_test_shot": { + "diff_carry_yd": 1.0, + "diff_total_yd": 0.8, + "diff_apex_ft": -0.6, + "status": "pass", + "error_pattern": null + }, + "driver1": { + "diff_carry_yd": 0.3, + "diff_total_yd": -25.7, + "diff_apex_ft": -0.7, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_SHORT" + }, + "driver2": { + "diff_carry_yd": 8.9, + "diff_total_yd": 8.6, + "diff_apex_ft": -2.7, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "driver3": { + "diff_carry_yd": 6.2, + "diff_total_yd": 23.3, + "diff_apex_ft": 21.1, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "driver4": { + "diff_carry_yd": 7.7, + "diff_total_yd": 16.3, + "diff_apex_ft": 4.4, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "flop_test_shot": { + "diff_carry_yd": 0.9, + "diff_total_yd": 2.8, + "diff_apex_ft": -7.6, + "status": "pass", + "error_pattern": null + }, + "p_wedge_shot_1": { + "diff_carry_yd": -4.3, + "diff_total_yd": 2.2, + "diff_apex_ft": -5.4, + "status": "moderate", + "error_pattern": "CARRY_TOO_SHORT" + }, + "s2_shot_10": { + "diff_carry_yd": 4.0, + "diff_total_yd": 10.7, + "diff_apex_ft": -5.8, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "s2_shot_11": { + "diff_carry_yd": -1.7, + "diff_total_yd": 2.0, + "diff_apex_ft": -4.4, + "status": "pass", + "error_pattern": null + }, + "s2_shot_12": { + "diff_carry_yd": 5.2, + "diff_total_yd": 9.5, + "diff_apex_ft": -5.1, + "status": "moderate", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "s2_shot_13": { + "diff_carry_yd": 1.8, + "diff_total_yd": 3.0, + "diff_apex_ft": -5.9, + "status": "pass", + "error_pattern": null + }, + "s2_shot_14": { + "diff_carry_yd": 0.2, + "diff_total_yd": 1.6, + "diff_apex_ft": -5.9, + "status": "pass", + "error_pattern": null + }, + "s2_shot_15": { + "diff_carry_yd": -0.6, + "diff_total_yd": -12.3, + "diff_apex_ft": -1.9, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_SHORT" + }, + "s2_shot_16": { + "diff_carry_yd": 0.4, + "diff_total_yd": 2.2, + "diff_apex_ft": -3.2, + "status": "pass", + "error_pattern": null + }, + "s2_shot_17": { + "diff_carry_yd": 7.2, + "diff_total_yd": 9.2, + "diff_apex_ft": -3.6, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "s2_shot_18": { + "diff_carry_yd": 5.1, + "diff_total_yd": 16.6, + "diff_apex_ft": 3.1, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "s2_shot_19": { + "diff_carry_yd": 3.3, + "diff_total_yd": -4.4, + "diff_apex_ft": -0.9, + "status": "moderate", + "error_pattern": "CARRY_TOO_LONG" + }, + "s2_shot_20": { + "diff_carry_yd": 7.2, + "diff_total_yd": 11.1, + "diff_apex_ft": -1.8, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "s2_shot_21": { + "diff_carry_yd": 5.8, + "diff_total_yd": 28.8, + "diff_apex_ft": 1.8, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "s2_shot_22": { + "diff_carry_yd": 5.7, + "diff_total_yd": 3.5, + "diff_apex_ft": -1.4, + "status": "moderate", + "error_pattern": "CARRY_TOO_LONG" + }, + "s2_shot_23": { + "diff_carry_yd": 4.2, + "diff_total_yd": -18.9, + "diff_apex_ft": 0.1, + "status": "severe", + "error_pattern": "CARRY_TOO_LONG" + }, + "s2_shot_24": { + "diff_carry_yd": 5.7, + "diff_total_yd": 2.7, + "diff_apex_ft": -1.6, + "status": "moderate", + "error_pattern": "CARRY_TOO_LONG" + }, + "s2_shot_26": { + "diff_carry_yd": 2.6, + "diff_total_yd": 23.1, + "diff_apex_ft": 24.2, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_LONG" + }, + "s2_shot_27": { + "diff_carry_yd": 3.6, + "diff_total_yd": 13.8, + "diff_apex_ft": 5.0, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "s2_shot_9": { + "diff_carry_yd": -2.8, + "diff_total_yd": 3.5, + "diff_apex_ft": 7.3, + "status": "pass", + "error_pattern": null + }, + "s3_shot_3w_18": { + "diff_carry_yd": null, + "diff_total_yd": null, + "diff_apex_ft": null, + "status": "pass", + "error_pattern": null + }, + "s3_shot_3w_19": { + "diff_carry_yd": -0.1, + "diff_total_yd": 16.7, + "diff_apex_ft": 0.1, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_LONG" + }, + "s3_shot_3w_21": { + "diff_carry_yd": 1.1, + "diff_total_yd": 16.6, + "diff_apex_ft": 0.3, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_LONG" + }, + "s3_shot_3w_22": { + "diff_carry_yd": 3.1, + "diff_total_yd": 20.2, + "diff_apex_ft": 0.5, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "s3_shot_3w_23": { + "diff_carry_yd": 0.8, + "diff_total_yd": -22.7, + "diff_apex_ft": -1.2, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_SHORT" + }, + "s3_shot_3w_24": { + "diff_carry_yd": 7.9, + "diff_total_yd": 29.6, + "diff_apex_ft": 1.9, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "s3_shot_5i_10": { + "diff_carry_yd": 3.0, + "diff_total_yd": -7.1, + "diff_apex_ft": 5.9, + "status": "moderate", + "error_pattern": "ROLLOUT_TOO_SHORT" + }, + "s3_shot_5i_11": { + "diff_carry_yd": -3.2, + "diff_total_yd": -17.2, + "diff_apex_ft": -1.3, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_SHORT" + }, + "s3_shot_5i_12": { + "diff_carry_yd": 1.2, + "diff_total_yd": -23.5, + "diff_apex_ft": 1.1, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_SHORT" + }, + "s3_shot_5i_13": { + "diff_carry_yd": 2.6, + "diff_total_yd": 10.1, + "diff_apex_ft": 0.6, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_LONG" + }, + "s3_shot_5i_15": { + "diff_carry_yd": -4.5, + "diff_total_yd": 14.7, + "diff_apex_ft": -1.1, + "status": "severe", + "error_pattern": "CARRY_TOO_SHORT" + }, + "s3_shot_5i_16": { + "diff_carry_yd": 1.1, + "diff_total_yd": -20.8, + "diff_apex_ft": -0.2, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_SHORT" + }, + "s3_shot_5i_17": { + "diff_carry_yd": -2.0, + "diff_total_yd": -1.9, + "diff_apex_ft": -0.3, + "status": "pass", + "error_pattern": null + }, + "s3_shot_6i_35": { + "diff_carry_yd": -5.1, + "diff_total_yd": -16.6, + "diff_apex_ft": -3.3, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_SHORT" + }, + "s3_shot_6i_36": { + "diff_carry_yd": 2.1, + "diff_total_yd": -20.8, + "diff_apex_ft": 0.6, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_SHORT" + }, + "s3_shot_6i_37": { + "diff_carry_yd": -3.6, + "diff_total_yd": 12.2, + "diff_apex_ft": -0.8, + "status": "severe", + "error_pattern": "CARRY_TOO_SHORT" + }, + "s3_shot_6i_38": { + "diff_carry_yd": -3.2, + "diff_total_yd": -21.3, + "diff_apex_ft": 0.1, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_SHORT" + }, + "s3_shot_6i_39": { + "diff_carry_yd": -0.5, + "diff_total_yd": 6.4, + "diff_apex_ft": 0.0, + "status": "moderate", + "error_pattern": "ROLLOUT_TOO_LONG" + }, + "s3_shot_6i_40": { + "diff_carry_yd": -1.2, + "diff_total_yd": 7.8, + "diff_apex_ft": 0.1, + "status": "moderate", + "error_pattern": "ROLLOUT_TOO_LONG" + }, + "s3_shot_6i_41": { + "diff_carry_yd": -4.6, + "diff_total_yd": 13.2, + "diff_apex_ft": -1.0, + "status": "severe", + "error_pattern": "CARRY_TOO_SHORT" + }, + "s3_shot_6i_42": { + "diff_carry_yd": -1.1, + "diff_total_yd": -17.4, + "diff_apex_ft": 0.8, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_SHORT" + }, + "s3_shot_6i_43": { + "diff_carry_yd": 6.4, + "diff_total_yd": 0.9, + "diff_apex_ft": 8.1, + "status": "moderate", + "error_pattern": "CARRY_TOO_LONG" + }, + "s3_shot_6i_44": { + "diff_carry_yd": -1.2, + "diff_total_yd": -27.4, + "diff_apex_ft": -1.3, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_SHORT" + }, + "s3_shot_6i_45": { + "diff_carry_yd": 3.5, + "diff_total_yd": 21.1, + "diff_apex_ft": 0.6, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "s3_shot_6i_46": { + "diff_carry_yd": 3.8, + "diff_total_yd": -3.5, + "diff_apex_ft": -1.5, + "status": "moderate", + "error_pattern": "CARRY_TOO_LONG" + }, + "s3_shot_6i_47": { + "diff_carry_yd": 7.0, + "diff_total_yd": 10.8, + "diff_apex_ft": 11.8, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "s3_shot_6i_48": { + "diff_carry_yd": 6.1, + "diff_total_yd": 11.1, + "diff_apex_ft": 14.2, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "s3_shot_6i_49": { + "diff_carry_yd": -2.5, + "diff_total_yd": 7.0, + "diff_apex_ft": -0.3, + "status": "moderate", + "error_pattern": "ROLLOUT_TOO_LONG" + }, + "s3_shot_6i_50": { + "diff_carry_yd": -0.4, + "diff_total_yd": -12.1, + "diff_apex_ft": 3.9, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_SHORT" + }, + "s3_shot_7i_25": { + "diff_carry_yd": -0.5, + "diff_total_yd": -18.0, + "diff_apex_ft": 0.9, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_SHORT" + }, + "s3_shot_7i_26": { + "diff_carry_yd": 1.8, + "diff_total_yd": -21.8, + "diff_apex_ft": 1.1, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_SHORT" + }, + "s3_shot_7i_27": { + "diff_carry_yd": 1.8, + "diff_total_yd": 4.3, + "diff_apex_ft": 8.0, + "status": "pass", + "error_pattern": null + }, + "s3_shot_7i_28": { + "diff_carry_yd": 1.2, + "diff_total_yd": 1.2, + "diff_apex_ft": 8.3, + "status": "pass", + "error_pattern": null + }, + "s3_shot_7i_29": { + "diff_carry_yd": 1.0, + "diff_total_yd": -5.8, + "diff_apex_ft": -3.5, + "status": "moderate", + "error_pattern": "ROLLOUT_TOO_SHORT" + }, + "s3_shot_7i_30": { + "diff_carry_yd": -0.2, + "diff_total_yd": 1.5, + "diff_apex_ft": 5.5, + "status": "pass", + "error_pattern": null + }, + "s3_shot_7i_31": { + "diff_carry_yd": -4.8, + "diff_total_yd": -14.3, + "diff_apex_ft": -4.1, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_SHORT" + }, + "s3_shot_7i_32": { + "diff_carry_yd": -1.8, + "diff_total_yd": -2.2, + "diff_apex_ft": 3.1, + "status": "pass", + "error_pattern": null + }, + "s3_shot_7i_33": { + "diff_carry_yd": -1.6, + "diff_total_yd": -1.3, + "diff_apex_ft": 4.7, + "status": "pass", + "error_pattern": null + }, + "s3_shot_7i_34": { + "diff_carry_yd": 4.4, + "diff_total_yd": 2.6, + "diff_apex_ft": 3.1, + "status": "moderate", + "error_pattern": "CARRY_TOO_LONG" + }, + "s3_shot_9i_1": { + "diff_carry_yd": -1.4, + "diff_total_yd": -12.6, + "diff_apex_ft": 1.3, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_SHORT" + }, + "s3_shot_9i_2": { + "diff_carry_yd": -8.0, + "diff_total_yd": -9.1, + "diff_apex_ft": -3.0, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_SHORT" + }, + "s3_shot_9i_3": { + "diff_carry_yd": -1.4, + "diff_total_yd": 1.1, + "diff_apex_ft": -5.3, + "status": "pass", + "error_pattern": null + }, + "s3_shot_9i_5": { + "diff_carry_yd": -2.6, + "diff_total_yd": -5.5, + "diff_apex_ft": -5.5, + "status": "moderate", + "error_pattern": "ROLLOUT_TOO_SHORT" + }, + "s3_shot_9i_7": { + "diff_carry_yd": 1.1, + "diff_total_yd": 1.6, + "diff_apex_ft": -4.2, + "status": "pass", + "error_pattern": null + }, + "s3_shot_9i_8": { + "diff_carry_yd": -1.6, + "diff_total_yd": 4.1, + "diff_apex_ft": -1.5, + "status": "pass", + "error_pattern": null + }, + "s3_shot_9i_9": { + "diff_carry_yd": -1.2, + "diff_total_yd": 1.9, + "diff_apex_ft": -6.1, + "status": "pass", + "error_pattern": null + }, + "s3_shot_driver_51": { + "diff_carry_yd": 11.4, + "diff_total_yd": 29.6, + "diff_apex_ft": 0.6, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "s3_shot_driver_52": { + "diff_carry_yd": 9.4, + "diff_total_yd": 25.3, + "diff_apex_ft": -1.4, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "s3_shot_driver_53": { + "diff_carry_yd": 6.5, + "diff_total_yd": 17.9, + "diff_apex_ft": -3.8, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "s3_shot_driver_54": { + "diff_carry_yd": 5.4, + "diff_total_yd": 0.0, + "diff_apex_ft": -2.2, + "status": "moderate", + "error_pattern": "CARRY_TOO_LONG" + }, + "s3_shot_driver_55": { + "diff_carry_yd": 2.5, + "diff_total_yd": 22.6, + "diff_apex_ft": 0.4, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_LONG" + }, + "s3_shot_driver_56": { + "diff_carry_yd": 4.8, + "diff_total_yd": 20.7, + "diff_apex_ft": 9.7, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "s3_shot_driver_57": { + "diff_carry_yd": -5.1, + "diff_total_yd": -19.7, + "diff_apex_ft": -3.5, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_SHORT" + }, + "s3_shot_driver_58": { + "diff_carry_yd": 18.0, + "diff_total_yd": 37.0, + "diff_apex_ft": -4.8, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "s3_shot_driver_59": { + "diff_carry_yd": -0.9, + "diff_total_yd": 17.7, + "diff_apex_ft": -3.8, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_LONG" + }, + "s3_shot_driver_60": { + "diff_carry_yd": 0.0, + "diff_total_yd": -14.9, + "diff_apex_ft": -2.4, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_SHORT" + }, + "s3_shot_pw_64": { + "diff_carry_yd": -4.4, + "diff_total_yd": 9.6, + "diff_apex_ft": -3.7, + "status": "moderate", + "error_pattern": "CARRY_TOO_SHORT" + }, + "s3_shot_pw_65": { + "diff_carry_yd": -0.1, + "diff_total_yd": 4.7, + "diff_apex_ft": -3.8, + "status": "pass", + "error_pattern": null + }, + "s3_shot_pw_66": { + "diff_carry_yd": -2.6, + "diff_total_yd": 11.3, + "diff_apex_ft": -3.7, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_LONG" + }, + "s3_shot_pw_67": { + "diff_carry_yd": 0.0, + "diff_total_yd": 5.7, + "diff_apex_ft": -4.0, + "status": "moderate", + "error_pattern": "ROLLOUT_TOO_LONG" + }, + "s3_shot_pw_68": { + "diff_carry_yd": 3.4, + "diff_total_yd": 6.1, + "diff_apex_ft": -6.2, + "status": "moderate", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "s3_shot_pw_69": { + "diff_carry_yd": -2.8, + "diff_total_yd": -3.9, + "diff_apex_ft": -3.8, + "status": "pass", + "error_pattern": null + }, + "topped_test_shot": { + "diff_carry_yd": -0.6, + "diff_total_yd": 13.9, + "diff_apex_ft": -0.1, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_LONG" + }, + "wedge_shot_1": { + "diff_carry_yd": -5.1, + "diff_total_yd": -0.7, + "diff_apex_ft": -2.4, + "status": "moderate", + "error_pattern": "CARRY_TOO_SHORT" + }, + "wedge_shot_2": { + "diff_carry_yd": -6.1, + "diff_total_yd": 2.7, + "diff_apex_ft": -4.2, + "status": "moderate", + "error_pattern": "CARRY_TOO_SHORT" + }, + "wedge_test_shot": { + "diff_carry_yd": -5.0, + "diff_total_yd": 3.6, + "diff_apex_ft": -3.2, + "status": "moderate", + "error_pattern": "CARRY_TOO_SHORT" + }, + "wedge_test_shot2": { + "diff_carry_yd": -5.4, + "diff_total_yd": 3.1, + "diff_apex_ft": -2.0, + "status": "moderate", + "error_pattern": "CARRY_TOO_SHORT" + }, + "wood1": { + "diff_carry_yd": 12.7, + "diff_total_yd": -3.2, + "diff_apex_ft": 3.2, + "status": "severe", + "error_pattern": "CARRY_TOO_LONG" + }, + "wood2": { + "diff_carry_yd": 4.8, + "diff_total_yd": 0.7, + "diff_apex_ft": -1.6, + "status": "moderate", + "error_pattern": "CARRY_TOO_LONG" + }, + "wood_low_test_shot": { + "diff_carry_yd": 1.8, + "diff_total_yd": 22.9, + "diff_apex_ft": 0.4, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_LONG" + } + }, + "regressions": [], + "conflicts": [ + "Bounce.FlightTangentialRetentionBase", + "Bounce.FlightSpinFactorMin", + "Bounce.FlightSpinFactorDivisor", + "Rollout.MidSpinMultiplierMax", + "Rollout.HighSpinMultiplierMax", + "Rollout.FrictionBlendSpeed", + "KineticFrictionMultiplier", + "Bounce.RolloutHighSpinRetention", + "Bounce.CorBaseA", + "Rollout.LowSpinMultiplierMax", + "Rollout.LowSpinThreshold", + "RollingFrictionMultiplier", + "Bounce.RolloutLowSpinRetention", + "Flight.ClMaxBase", + "Flight.CdMin", + "Flight.HighLaunchDragBoostMax", + "DragScaleMultiplier", + "LiftScaleMultiplier" + ] +} diff --git a/assets/data/calibration/history/iteration_032.json b/assets/data/calibration/history/iteration_032.json new file mode 100644 index 0000000..070fc4e --- /dev/null +++ b/assets/data/calibration/history/iteration_032.json @@ -0,0 +1,748 @@ +{ + "iteration": 32, + "timestamp": "2026-03-13T20:06:10.071466", + "profile_overrides": {}, + "summary": { + "pass": 20, + "moderate": 24, + "severe": 55, + "no_reference": 3 + }, + "per_shot": { + "5iron": { + "diff_carry_yd": 5.6, + "diff_total_yd": 12.1, + "diff_apex_ft": 5.0, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "approach_mid_iron_test_shot": { + "diff_carry_yd": 0.0, + "diff_total_yd": 7.9, + "diff_apex_ft": -4.7, + "status": "moderate", + "error_pattern": "ROLLOUT_TOO_LONG" + }, + "bump_and_run": { + "diff_carry_yd": -9.1, + "diff_total_yd": -27.5, + "diff_apex_ft": -2.1, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_SHORT" + }, + "bump_and_run_slow": { + "diff_carry_yd": null, + "diff_total_yd": null, + "diff_apex_ft": null, + "status": "pass", + "error_pattern": null + }, + "bump_test_shot": { + "diff_carry_yd": -2.1, + "diff_total_yd": 12.8, + "diff_apex_ft": -0.1, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_LONG" + }, + "checked_test_shot": { + "diff_carry_yd": -0.6, + "diff_total_yd": 1.1, + "diff_apex_ft": -8.7, + "status": "pass", + "error_pattern": null + }, + "chip_test_shot": { + "diff_carry_yd": null, + "diff_total_yd": null, + "diff_apex_ft": null, + "status": "pass", + "error_pattern": null + }, + "drive_test_shot": { + "diff_carry_yd": 1.0, + "diff_total_yd": 0.8, + "diff_apex_ft": -0.6, + "status": "pass", + "error_pattern": null + }, + "driver1": { + "diff_carry_yd": 0.3, + "diff_total_yd": -25.7, + "diff_apex_ft": -0.7, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_SHORT" + }, + "driver2": { + "diff_carry_yd": 8.9, + "diff_total_yd": 8.6, + "diff_apex_ft": -2.7, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "driver3": { + "diff_carry_yd": 6.2, + "diff_total_yd": 23.3, + "diff_apex_ft": 21.1, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "driver4": { + "diff_carry_yd": 7.7, + "diff_total_yd": 16.3, + "diff_apex_ft": 4.4, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "flop_test_shot": { + "diff_carry_yd": 0.9, + "diff_total_yd": 2.8, + "diff_apex_ft": -7.6, + "status": "pass", + "error_pattern": null + }, + "p_wedge_shot_1": { + "diff_carry_yd": -4.3, + "diff_total_yd": 2.2, + "diff_apex_ft": -5.4, + "status": "moderate", + "error_pattern": "CARRY_TOO_SHORT" + }, + "s2_shot_10": { + "diff_carry_yd": 4.0, + "diff_total_yd": 10.7, + "diff_apex_ft": -5.8, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "s2_shot_11": { + "diff_carry_yd": -1.7, + "diff_total_yd": 2.0, + "diff_apex_ft": -4.4, + "status": "pass", + "error_pattern": null + }, + "s2_shot_12": { + "diff_carry_yd": 5.2, + "diff_total_yd": 9.5, + "diff_apex_ft": -5.1, + "status": "moderate", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "s2_shot_13": { + "diff_carry_yd": 1.8, + "diff_total_yd": 3.0, + "diff_apex_ft": -5.9, + "status": "pass", + "error_pattern": null + }, + "s2_shot_14": { + "diff_carry_yd": 0.2, + "diff_total_yd": 1.6, + "diff_apex_ft": -5.9, + "status": "pass", + "error_pattern": null + }, + "s2_shot_15": { + "diff_carry_yd": -0.6, + "diff_total_yd": -12.3, + "diff_apex_ft": -1.9, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_SHORT" + }, + "s2_shot_16": { + "diff_carry_yd": 0.4, + "diff_total_yd": 2.2, + "diff_apex_ft": -3.2, + "status": "pass", + "error_pattern": null + }, + "s2_shot_17": { + "diff_carry_yd": 7.2, + "diff_total_yd": 9.2, + "diff_apex_ft": -3.6, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "s2_shot_18": { + "diff_carry_yd": 5.1, + "diff_total_yd": 16.6, + "diff_apex_ft": 3.1, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "s2_shot_19": { + "diff_carry_yd": 3.3, + "diff_total_yd": -4.4, + "diff_apex_ft": -0.9, + "status": "moderate", + "error_pattern": "CARRY_TOO_LONG" + }, + "s2_shot_20": { + "diff_carry_yd": 7.2, + "diff_total_yd": 11.1, + "diff_apex_ft": -1.8, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "s2_shot_21": { + "diff_carry_yd": 5.8, + "diff_total_yd": 28.8, + "diff_apex_ft": 1.8, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "s2_shot_22": { + "diff_carry_yd": 5.7, + "diff_total_yd": 3.5, + "diff_apex_ft": -1.4, + "status": "moderate", + "error_pattern": "CARRY_TOO_LONG" + }, + "s2_shot_23": { + "diff_carry_yd": 4.2, + "diff_total_yd": -18.9, + "diff_apex_ft": 0.1, + "status": "severe", + "error_pattern": "CARRY_TOO_LONG" + }, + "s2_shot_24": { + "diff_carry_yd": 5.7, + "diff_total_yd": 2.7, + "diff_apex_ft": -1.6, + "status": "moderate", + "error_pattern": "CARRY_TOO_LONG" + }, + "s2_shot_26": { + "diff_carry_yd": 2.6, + "diff_total_yd": 23.1, + "diff_apex_ft": 24.2, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_LONG" + }, + "s2_shot_27": { + "diff_carry_yd": 3.6, + "diff_total_yd": 13.8, + "diff_apex_ft": 5.0, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "s2_shot_9": { + "diff_carry_yd": -2.8, + "diff_total_yd": 3.5, + "diff_apex_ft": 7.3, + "status": "pass", + "error_pattern": null + }, + "s3_shot_3w_18": { + "diff_carry_yd": null, + "diff_total_yd": null, + "diff_apex_ft": null, + "status": "pass", + "error_pattern": null + }, + "s3_shot_3w_19": { + "diff_carry_yd": -0.1, + "diff_total_yd": 16.7, + "diff_apex_ft": 0.1, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_LONG" + }, + "s3_shot_3w_21": { + "diff_carry_yd": 1.1, + "diff_total_yd": 16.6, + "diff_apex_ft": 0.3, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_LONG" + }, + "s3_shot_3w_22": { + "diff_carry_yd": 3.1, + "diff_total_yd": 20.2, + "diff_apex_ft": 0.5, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "s3_shot_3w_23": { + "diff_carry_yd": 0.8, + "diff_total_yd": -22.7, + "diff_apex_ft": -1.2, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_SHORT" + }, + "s3_shot_3w_24": { + "diff_carry_yd": 7.9, + "diff_total_yd": 29.6, + "diff_apex_ft": 1.9, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "s3_shot_5i_10": { + "diff_carry_yd": 3.0, + "diff_total_yd": -7.1, + "diff_apex_ft": 5.9, + "status": "moderate", + "error_pattern": "ROLLOUT_TOO_SHORT" + }, + "s3_shot_5i_11": { + "diff_carry_yd": -3.2, + "diff_total_yd": -17.2, + "diff_apex_ft": -1.3, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_SHORT" + }, + "s3_shot_5i_12": { + "diff_carry_yd": 1.2, + "diff_total_yd": -23.5, + "diff_apex_ft": 1.1, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_SHORT" + }, + "s3_shot_5i_13": { + "diff_carry_yd": 2.6, + "diff_total_yd": 10.1, + "diff_apex_ft": 0.6, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_LONG" + }, + "s3_shot_5i_15": { + "diff_carry_yd": -4.5, + "diff_total_yd": 14.7, + "diff_apex_ft": -1.1, + "status": "severe", + "error_pattern": "CARRY_TOO_SHORT" + }, + "s3_shot_5i_16": { + "diff_carry_yd": 1.1, + "diff_total_yd": -20.8, + "diff_apex_ft": -0.2, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_SHORT" + }, + "s3_shot_5i_17": { + "diff_carry_yd": -2.0, + "diff_total_yd": -1.9, + "diff_apex_ft": -0.3, + "status": "pass", + "error_pattern": null + }, + "s3_shot_6i_35": { + "diff_carry_yd": -5.1, + "diff_total_yd": -16.6, + "diff_apex_ft": -3.3, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_SHORT" + }, + "s3_shot_6i_36": { + "diff_carry_yd": 2.1, + "diff_total_yd": -20.8, + "diff_apex_ft": 0.6, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_SHORT" + }, + "s3_shot_6i_37": { + "diff_carry_yd": -3.6, + "diff_total_yd": 12.2, + "diff_apex_ft": -0.8, + "status": "severe", + "error_pattern": "CARRY_TOO_SHORT" + }, + "s3_shot_6i_38": { + "diff_carry_yd": -3.2, + "diff_total_yd": -21.3, + "diff_apex_ft": 0.1, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_SHORT" + }, + "s3_shot_6i_39": { + "diff_carry_yd": -0.5, + "diff_total_yd": 6.4, + "diff_apex_ft": 0.0, + "status": "moderate", + "error_pattern": "ROLLOUT_TOO_LONG" + }, + "s3_shot_6i_40": { + "diff_carry_yd": -1.2, + "diff_total_yd": 7.8, + "diff_apex_ft": 0.1, + "status": "moderate", + "error_pattern": "ROLLOUT_TOO_LONG" + }, + "s3_shot_6i_41": { + "diff_carry_yd": -4.6, + "diff_total_yd": 13.2, + "diff_apex_ft": -1.0, + "status": "severe", + "error_pattern": "CARRY_TOO_SHORT" + }, + "s3_shot_6i_42": { + "diff_carry_yd": -1.1, + "diff_total_yd": -17.4, + "diff_apex_ft": 0.8, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_SHORT" + }, + "s3_shot_6i_43": { + "diff_carry_yd": 6.4, + "diff_total_yd": 0.9, + "diff_apex_ft": 8.1, + "status": "moderate", + "error_pattern": "CARRY_TOO_LONG" + }, + "s3_shot_6i_44": { + "diff_carry_yd": -1.2, + "diff_total_yd": -27.4, + "diff_apex_ft": -1.3, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_SHORT" + }, + "s3_shot_6i_45": { + "diff_carry_yd": 3.5, + "diff_total_yd": 21.1, + "diff_apex_ft": 0.6, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "s3_shot_6i_46": { + "diff_carry_yd": 3.8, + "diff_total_yd": -3.5, + "diff_apex_ft": -1.5, + "status": "moderate", + "error_pattern": "CARRY_TOO_LONG" + }, + "s3_shot_6i_47": { + "diff_carry_yd": 7.0, + "diff_total_yd": 10.8, + "diff_apex_ft": 11.8, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "s3_shot_6i_48": { + "diff_carry_yd": 6.1, + "diff_total_yd": 11.1, + "diff_apex_ft": 14.2, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "s3_shot_6i_49": { + "diff_carry_yd": -2.5, + "diff_total_yd": 7.0, + "diff_apex_ft": -0.3, + "status": "moderate", + "error_pattern": "ROLLOUT_TOO_LONG" + }, + "s3_shot_6i_50": { + "diff_carry_yd": -0.4, + "diff_total_yd": -12.1, + "diff_apex_ft": 3.9, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_SHORT" + }, + "s3_shot_7i_25": { + "diff_carry_yd": -0.5, + "diff_total_yd": -18.0, + "diff_apex_ft": 0.9, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_SHORT" + }, + "s3_shot_7i_26": { + "diff_carry_yd": 1.8, + "diff_total_yd": -21.8, + "diff_apex_ft": 1.1, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_SHORT" + }, + "s3_shot_7i_27": { + "diff_carry_yd": 1.8, + "diff_total_yd": 4.3, + "diff_apex_ft": 8.0, + "status": "pass", + "error_pattern": null + }, + "s3_shot_7i_28": { + "diff_carry_yd": 1.2, + "diff_total_yd": 1.2, + "diff_apex_ft": 8.3, + "status": "pass", + "error_pattern": null + }, + "s3_shot_7i_29": { + "diff_carry_yd": 1.0, + "diff_total_yd": -5.8, + "diff_apex_ft": -3.5, + "status": "moderate", + "error_pattern": "ROLLOUT_TOO_SHORT" + }, + "s3_shot_7i_30": { + "diff_carry_yd": -0.2, + "diff_total_yd": 1.5, + "diff_apex_ft": 5.5, + "status": "pass", + "error_pattern": null + }, + "s3_shot_7i_31": { + "diff_carry_yd": -4.8, + "diff_total_yd": -14.3, + "diff_apex_ft": -4.1, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_SHORT" + }, + "s3_shot_7i_32": { + "diff_carry_yd": -1.8, + "diff_total_yd": -2.2, + "diff_apex_ft": 3.1, + "status": "pass", + "error_pattern": null + }, + "s3_shot_7i_33": { + "diff_carry_yd": -1.6, + "diff_total_yd": -1.3, + "diff_apex_ft": 4.7, + "status": "pass", + "error_pattern": null + }, + "s3_shot_7i_34": { + "diff_carry_yd": 4.4, + "diff_total_yd": 2.6, + "diff_apex_ft": 3.1, + "status": "moderate", + "error_pattern": "CARRY_TOO_LONG" + }, + "s3_shot_9i_1": { + "diff_carry_yd": -1.4, + "diff_total_yd": -12.6, + "diff_apex_ft": 1.3, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_SHORT" + }, + "s3_shot_9i_2": { + "diff_carry_yd": -8.0, + "diff_total_yd": -9.1, + "diff_apex_ft": -3.0, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_SHORT" + }, + "s3_shot_9i_3": { + "diff_carry_yd": -1.4, + "diff_total_yd": 1.1, + "diff_apex_ft": -5.3, + "status": "pass", + "error_pattern": null + }, + "s3_shot_9i_5": { + "diff_carry_yd": -2.6, + "diff_total_yd": -5.5, + "diff_apex_ft": -5.5, + "status": "moderate", + "error_pattern": "ROLLOUT_TOO_SHORT" + }, + "s3_shot_9i_7": { + "diff_carry_yd": 1.1, + "diff_total_yd": 1.6, + "diff_apex_ft": -4.2, + "status": "pass", + "error_pattern": null + }, + "s3_shot_9i_8": { + "diff_carry_yd": -1.6, + "diff_total_yd": 4.1, + "diff_apex_ft": -1.5, + "status": "pass", + "error_pattern": null + }, + "s3_shot_9i_9": { + "diff_carry_yd": -1.2, + "diff_total_yd": 1.9, + "diff_apex_ft": -6.1, + "status": "pass", + "error_pattern": null + }, + "s3_shot_driver_51": { + "diff_carry_yd": 11.4, + "diff_total_yd": 29.6, + "diff_apex_ft": 0.6, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "s3_shot_driver_52": { + "diff_carry_yd": 9.4, + "diff_total_yd": 25.3, + "diff_apex_ft": -1.4, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "s3_shot_driver_53": { + "diff_carry_yd": 6.5, + "diff_total_yd": 17.9, + "diff_apex_ft": -3.8, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "s3_shot_driver_54": { + "diff_carry_yd": 5.4, + "diff_total_yd": 0.0, + "diff_apex_ft": -2.2, + "status": "moderate", + "error_pattern": "CARRY_TOO_LONG" + }, + "s3_shot_driver_55": { + "diff_carry_yd": 2.5, + "diff_total_yd": 22.6, + "diff_apex_ft": 0.4, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_LONG" + }, + "s3_shot_driver_56": { + "diff_carry_yd": 4.8, + "diff_total_yd": 20.7, + "diff_apex_ft": 9.7, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "s3_shot_driver_57": { + "diff_carry_yd": -5.1, + "diff_total_yd": -19.7, + "diff_apex_ft": -3.5, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_SHORT" + }, + "s3_shot_driver_58": { + "diff_carry_yd": 18.0, + "diff_total_yd": 37.0, + "diff_apex_ft": -4.8, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "s3_shot_driver_59": { + "diff_carry_yd": -0.9, + "diff_total_yd": 17.7, + "diff_apex_ft": -3.8, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_LONG" + }, + "s3_shot_driver_60": { + "diff_carry_yd": 0.0, + "diff_total_yd": -14.9, + "diff_apex_ft": -2.4, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_SHORT" + }, + "s3_shot_pw_64": { + "diff_carry_yd": -4.4, + "diff_total_yd": 9.6, + "diff_apex_ft": -3.7, + "status": "moderate", + "error_pattern": "CARRY_TOO_SHORT" + }, + "s3_shot_pw_65": { + "diff_carry_yd": -0.1, + "diff_total_yd": 4.7, + "diff_apex_ft": -3.8, + "status": "pass", + "error_pattern": null + }, + "s3_shot_pw_66": { + "diff_carry_yd": -2.6, + "diff_total_yd": 11.3, + "diff_apex_ft": -3.7, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_LONG" + }, + "s3_shot_pw_67": { + "diff_carry_yd": 0.0, + "diff_total_yd": 5.7, + "diff_apex_ft": -4.0, + "status": "moderate", + "error_pattern": "ROLLOUT_TOO_LONG" + }, + "s3_shot_pw_68": { + "diff_carry_yd": 3.4, + "diff_total_yd": 6.1, + "diff_apex_ft": -6.2, + "status": "moderate", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "s3_shot_pw_69": { + "diff_carry_yd": -2.8, + "diff_total_yd": -3.9, + "diff_apex_ft": -3.8, + "status": "pass", + "error_pattern": null + }, + "topped_test_shot": { + "diff_carry_yd": -0.6, + "diff_total_yd": 13.9, + "diff_apex_ft": -0.1, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_LONG" + }, + "wedge_shot_1": { + "diff_carry_yd": -5.1, + "diff_total_yd": -0.7, + "diff_apex_ft": -2.4, + "status": "moderate", + "error_pattern": "CARRY_TOO_SHORT" + }, + "wedge_shot_2": { + "diff_carry_yd": -6.1, + "diff_total_yd": 2.7, + "diff_apex_ft": -4.2, + "status": "moderate", + "error_pattern": "CARRY_TOO_SHORT" + }, + "wedge_test_shot": { + "diff_carry_yd": -5.0, + "diff_total_yd": 3.6, + "diff_apex_ft": -3.2, + "status": "moderate", + "error_pattern": "CARRY_TOO_SHORT" + }, + "wedge_test_shot2": { + "diff_carry_yd": -5.4, + "diff_total_yd": 3.1, + "diff_apex_ft": -2.0, + "status": "moderate", + "error_pattern": "CARRY_TOO_SHORT" + }, + "wood1": { + "diff_carry_yd": 12.7, + "diff_total_yd": -3.2, + "diff_apex_ft": 3.2, + "status": "severe", + "error_pattern": "CARRY_TOO_LONG" + }, + "wood2": { + "diff_carry_yd": 4.8, + "diff_total_yd": 0.7, + "diff_apex_ft": -1.6, + "status": "moderate", + "error_pattern": "CARRY_TOO_LONG" + }, + "wood_low_test_shot": { + "diff_carry_yd": 1.8, + "diff_total_yd": 22.9, + "diff_apex_ft": 0.4, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_LONG" + } + }, + "regressions": [], + "conflicts": [ + "Bounce.FlightTangentialRetentionBase", + "Bounce.FlightSpinFactorMin", + "Bounce.FlightSpinFactorDivisor", + "Rollout.MidSpinMultiplierMax", + "Rollout.HighSpinMultiplierMax", + "Rollout.FrictionBlendSpeed", + "KineticFrictionMultiplier", + "Bounce.RolloutHighSpinRetention", + "Bounce.CorBaseA", + "Rollout.LowSpinMultiplierMax", + "Rollout.LowSpinThreshold", + "RollingFrictionMultiplier", + "Bounce.RolloutLowSpinRetention", + "Flight.ClMaxBase", + "Flight.CdMin", + "Flight.HighLaunchDragBoostMax", + "DragScaleMultiplier", + "LiftScaleMultiplier" + ] +} diff --git a/assets/data/calibration/physics.csv b/assets/data/calibration/physics.csv index bab9ed0..e42f57b 100644 --- a/assets/data/calibration/physics.csv +++ b/assets/data/calibration/physics.csv @@ -1,7 +1,6 @@ shot_name,filename,speed_mph,vla_deg,hla_deg,total_spin_rpm,spin_axis_deg,backspin_rpm,sidespin_rpm,carry_yd,total_yd,rollout_yd,apex_ft,hang_time_s,landing_speed_mps,landing_angle_deg,initial_re,initial_spin_ratio,initial_cd,initial_cl,peak_cl,carry_only_yd 5iron,5iron.json,102.10,17.40,1.50,5391.0,12.30,5266.0,1151.0,143.7,154.3,10.7,64.6,4.86,23.86,45.06,124951.4,0.263855,0.223365,0.298854,0.298854,143.7 approach_mid_iron_test_shot,approach_mid_iron_test_shot.json,93.90,22.90,-2.60,5375.0,2.00,5375.0,0.0,125.8,136.4,10.6,64.6,4.66,22.98,47.03,114916.1,0.286081,0.227772,0.251433,0.268000,125.8 -approach_test_shot,approach_test_shot.json,81.05,30.50,1.35,10489.8,5.74,10454.8,699.3,92.5,93.3,0.9,64.0,4.43,20.23,50.62,99195.9,0.646073,0.312878,0.261523,0.310921,92.5 bump_and_run,bump_and_run.json,58.27,15.57,-0.85,1850.1,2.31,1700.4,75.7,34.7,34.5,-0.2,8.0,1.43,20.83,18.52,71314.6,0.145977,0.336605,0.122924,0.122924,34.7 bump_and_run_slow,bump_and_run_slow.json,30.27,15.57,-0.85,1850.1,2.31,1700.4,75.7,10.0,27.1,17.0,2.2,0.73,12.54,16.52,37047.8,0.280996,0.484456,0.002156,0.002156,10.0 bump_test_shot,bump_test_shot.json,78.27,5.57,-0.85,1850.1,2.31,1700.4,75.7,36.9,86.8,49.9,3.0,1.05,29.99,6.63,95790.9,0.108677,0.227686,0.175567,0.175567,36.9 @@ -40,3 +39,65 @@ s2_shot_24,shot_24.json,121.48,14.53,-11.23,3172.9,-6.80,3150.6,-375.5,188.7,195 s2_shot_26,shot_26.json,116.97,18.42,-2.02,5035.4,9.70,4963.4,848.2,173.3,197.3,24.0,112.3,6.17,25.92,58.01,143143.6,0.215155,0.226139,0.284498,0.319321,173.3 s2_shot_27,shot_27.json,112.96,17.59,-2.26,4291.5,12.21,4194.4,907.8,168.1,183.4,15.2,78.6,5.31,25.81,46.45,138244.2,0.189868,0.215786,0.222482,0.261454,168.1 s2_shot_9,shot_9.json,94.41,20.07,2.40,4020.4,16.33,3858.1,1130.8,123.7,136.0,12.3,62.1,4.47,23.57,46.46,115543.8,0.212823,0.223713,0.279055,0.314843,123.7 +s3_shot_3w_18,shot_3w_18.json,47.91,45.81,33.98,7491.0,30.00,6487.4,3745.5,36.7,41.7,4.9,34.7,2.95,16.10,54.61,58633.5,0.781418,0.569061,0.273498,0.273498,36.7 +s3_shot_3w_19,shot_3w_19.json,121.33,5.59,-4.84,1661.5,-11.89,1625.9,-342.2,120.5,182.5,62.0,12.3,2.53,36.70,10.00,148481.0,0.068442,0.197251,0.151288,0.151438,120.5 +s3_shot_3w_21,shot_3w_21.json,119.40,5.31,-3.43,1759.7,-10.46,1730.5,-319.5,115.7,177.1,61.3,11.2,2.44,36.62,9.45,146120.2,0.073659,0.196519,0.156580,0.156660,115.7 +s3_shot_3w_22,shot_3w_22.json,108.89,5.62,-7.25,2500.8,-1.78,2499.6,-77.5,106.3,161.5,55.2,11.0,2.44,33.74,10.12,133261.1,0.114780,0.196784,0.187398,0.187398,106.3 +s3_shot_3w_23,shot_3w_23.json,115.83,8.90,-0.78,2804.3,2.19,2802.2,107.3,148.5,148.2,-0.2,26.8,3.56,30.87,18.14,141755.6,0.120995,0.201268,0.178166,0.178473,148.5 +s3_shot_3w_24,shot_3w_24.json,123.42,6.29,-5.42,2751.6,-13.27,2678.1,-631.8,153.8,206.3,52.5,21.7,3.44,32.73,15.04,151037.8,0.111429,0.204726,0.185432,0.185915,153.8 +s3_shot_5i_10,shot_5i_10.json,87.96,14.22,1.21,4064.7,8.41,4021.0,594.4,106.1,109.6,3.5,34.3,3.59,23.03,34.08,107642.0,0.230959,0.235986,0.312469,0.319148,106.1 +s3_shot_5i_11,shot_5i_11.json,90.59,14.45,-0.21,3360.4,7.80,3329.3,456.2,105.6,106.9,1.4,28.5,3.26,25.16,26.29,110866.8,0.185386,0.219679,0.213438,0.218752,105.6 +s3_shot_5i_12,shot_5i_12.json,74.19,10.23,-1.67,3321.4,15.75,3196.7,901.5,59.6,58.4,-1.1,10.5,2.01,23.70,17.43,90789.2,0.223756,0.276466,0.301989,0.305482,59.6 +s3_shot_5i_13,shot_5i_13.json,75.04,8.01,2.53,3921.4,3.42,3914.4,234.0,56.5,89.0,32.5,7.4,1.83,24.58,12.26,91830.0,0.261184,0.272955,0.303437,0.305909,56.5 +s3_shot_5i_15,shot_5i_15.json,86.90,9.35,-4.02,2508.9,-4.94,2499.6,-216.2,74.1,121.3,47.2,11.0,2.08,28.55,13.08,106345.9,0.144296,0.214825,0.187102,0.187102,74.1 +s3_shot_5i_16,shot_5i_16.json,97.99,9.13,-2.08,3775.9,1.68,3774.3,110.7,110.2,109.2,-1.0,19.5,3.01,27.62,17.58,119926.2,0.192576,0.215013,0.229128,0.229955,110.2 +s3_shot_5i_17,shot_5i_17.json,56.46,9.97,24.15,5178.3,29.12,4523.9,2519.7,28.6,45.0,16.5,4.2,1.18,20.23,12.26,69096.2,0.458380,0.402994,0.309595,0.311075,28.6 +s3_shot_6i_35,shot_6i_35.json,80.55,15.35,-1.30,4667.1,-0.03,4667.1,-2.8,84.9,84.9,0.0,23.1,2.92,22.73,25.52,98572.3,0.289590,0.253612,0.244343,0.268976,84.9 +s3_shot_6i_36,shot_6i_36.json,78.86,10.40,16.08,4166.0,25.12,3771.9,1768.7,69.9,68.3,-1.6,12.4,2.27,24.22,16.75,96505.8,0.264030,0.258934,0.298537,0.298652,69.9 +s3_shot_6i_37,shot_6i_37.json,82.57,10.16,11.01,3041.1,25.35,2748.4,1301.8,67.9,109.4,41.5,11.0,2.03,26.95,14.28,101052.9,0.184068,0.234572,0.211057,0.211332,67.9 +s3_shot_6i_38,shot_6i_38.json,79.12,13.35,3.04,3186.9,11.59,3121.9,640.2,76.0,76.2,0.2,18.1,2.53,23.84,23.45,96827.7,0.201308,0.249920,0.250057,0.258223,76.0 +s3_shot_6i_39,shot_6i_39.json,60.98,6.14,10.35,3284.8,22.03,3044.9,1232.2,23.5,53.7,30.3,2.1,0.86,23.39,7.64,74625.7,0.269219,0.351554,0.288673,0.291348,23.5 +s3_shot_6i_40,shot_6i_40.json,62.11,6.80,27.01,2768.0,30.00,2397.2,1384.0,25.0,58.9,33.9,2.6,0.90,23.67,8.85,76009.9,0.222738,0.343045,0.300173,0.300559,25.0 +s3_shot_6i_41,shot_6i_41.json,82.53,9.88,-2.28,2620.2,13.56,2547.1,614.5,66.7,111.1,44.4,10.3,1.97,27.41,13.39,100996.8,0.158675,0.227492,0.192268,0.192269,66.7 +s3_shot_6i_42,shot_6i_42.json,77.19,13.14,-3.42,4057.2,4.14,4046.6,293.2,75.5,75.5,-0.0,18.3,2.63,22.59,23.99,94471.3,0.262673,0.264689,0.300938,0.300938,75.5 +s3_shot_6i_43,shot_6i_43.json,94.06,13.88,-4.68,4616.2,1.70,4614.2,137.0,123.7,129.5,5.7,43.1,4.12,23.23,37.74,115112.4,0.245275,0.227614,0.319007,0.319007,123.7 +s3_shot_6i_44,shot_6i_44.json,114.96,9.46,-6.67,2314.5,15.10,2234.6,602.8,141.1,140.8,-0.3,25.3,3.34,31.77,17.37,140686.5,0.100621,0.197318,0.165322,0.165551,141.1 +s3_shot_6i_45,shot_6i_45.json,109.32,6.42,-9.00,2509.9,-10.87,2464.9,-473.5,113.1,166.5,53.4,13.5,2.63,33.03,11.70,133784.2,0.114749,0.196925,0.187380,0.187381,113.1 +s3_shot_6i_46,shot_6i_46.json,116.33,13.65,0.34,3007.9,10.67,2955.8,557.1,171.1,175.8,4.6,50.1,4.53,28.25,28.55,142368.0,0.129223,0.203147,0.180634,0.181714,171.1 +s3_shot_6i_47,shot_6i_47.json,99.48,14.78,-2.86,4810.7,4.69,4794.6,393.7,138.2,148.5,10.3,56.8,4.64,23.60,43.56,121740.5,0.241695,0.224018,0.319265,0.319321,138.2 +s3_shot_6i_48,shot_6i_48.json,101.73,15.23,-3.03,4631.0,4.26,4618.2,344.4,143.2,154.6,11.4,63.1,4.83,23.90,45.83,124502.8,0.227503,0.223418,0.307983,0.319321,143.2 +s3_shot_6i_49,shot_6i_49.json,71.25,7.70,16.05,2624.7,30.00,2273.0,1312.3,37.4,77.3,39.9,4.2,1.20,26.22,9.47,87197.7,0.184102,0.274179,0.211348,0.211348,37.4 +s3_shot_6i_50,shot_6i_50.json,82.80,14.85,-1.42,3783.4,2.81,3778.8,185.4,92.8,95.3,2.6,29.5,3.23,22.65,32.23,101335.6,0.228355,0.247284,0.309186,0.318160,92.8 +s3_shot_7i_25,shot_7i_25.json,83.34,13.18,2.98,3409.5,17.79,3246.5,1041.7,86.4,86.8,0.4,21.0,2.80,24.19,24.28,101997.9,0.204455,0.239178,0.258137,0.266132,86.4 +s3_shot_7i_26,shot_7i_26.json,73.37,10.85,15.40,3560.9,30.00,3083.8,1780.4,58.4,57.5,-1.0,10.7,2.00,23.45,17.67,89787.0,0.242568,0.279987,0.319319,0.319321,58.4 +s3_shot_7i_27,shot_7i_27.json,93.74,17.06,-1.45,4611.6,2.63,4606.7,211.8,124.1,132.6,8.4,54.0,4.37,23.10,43.53,114719.5,0.245870,0.227933,0.318841,0.318841,124.1 +s3_shot_7i_28,shot_7i_28.json,92.09,16.41,-3.60,4216.7,-0.44,4216.6,-32.4,119.1,126.8,7.7,48.9,4.15,23.11,41.48,112696.8,0.228852,0.229779,0.309859,0.319321,119.1 +s3_shot_7i_29,shot_7i_29.json,107.59,13.82,-6.05,3633.3,4.72,3621.0,298.7,149.4,152.5,3.1,42.8,4.18,26.85,28.20,131669.7,0.168773,0.207825,0.195575,0.196678,149.4 +s3_shot_7i_30,shot_7i_30.json,90.17,17.56,-3.83,4508.5,-0.21,4508.5,-16.5,115.2,123.2,8.0,48.6,4.11,22.75,41.66,110355.9,0.249879,0.232360,0.316829,0.316829,115.2 +s3_shot_7i_31,shot_7i_31.json,76.36,17.52,-0.54,5122.2,1.84,5119.5,164.7,80.2,80.2,-0.0,24.3,2.94,21.68,27.18,93445.7,0.335263,0.264659,0.225889,0.268000,80.2 +s3_shot_7i_32,shot_7i_32.json,93.10,16.96,-1.03,3762.5,4.20,3752.4,275.6,119.4,127.6,8.2,45.6,3.98,23.95,38.50,113935.9,0.201982,0.221595,0.251784,0.278687,119.4 +s3_shot_7i_33,shot_7i_33.json,92.36,16.96,-0.58,3851.7,2.81,3847.1,188.9,118.1,126.7,8.6,46.7,4.02,23.60,39.60,113026.5,0.208434,0.224441,0.268276,0.297243,118.1 +s3_shot_7i_34,shot_7i_34.json,104.19,14.67,-4.63,4081.2,1.90,4079.0,135.0,146.9,153.2,6.3,51.3,4.49,25.08,37.02,127515.3,0.195758,0.214592,0.236115,0.255285,146.9 +s3_shot_9i_1,shot_9i_1.json,88.98,15.10,-0.50,3563.2,11.26,3494.6,695.8,105.3,108.2,2.9,32.1,3.42,24.11,30.94,108898.1,0.200130,0.226454,0.247047,0.261228,105.3 +s3_shot_9i_2,shot_9i_2.json,71.29,23.93,5.51,4085.5,8.31,4042.7,590.2,74.1,78.3,4.3,33.8,3.18,20.15,39.23,87241.3,0.286429,0.289562,0.250705,0.268796,74.1 +s3_shot_9i_3,shot_9i_3.json,90.11,21.67,2.80,5243.0,11.20,5143.3,1018.1,115.9,121.8,5.9,52.4,4.23,22.62,42.09,110277.5,0.290796,0.232455,0.242056,0.268000,115.9 +s3_shot_9i_5,shot_9i_5.json,84.02,19.37,3.82,5352.1,11.48,5245.0,1065.2,100.1,101.7,1.6,36.3,3.59,22.21,33.44,102827.9,0.318347,0.244171,0.224019,0.268000,100.1 +s3_shot_9i_7,shot_9i_7.json,83.03,22.51,5.26,7008.5,9.70,6908.3,1181.2,102.2,104.2,2.0,47.3,4.09,20.95,40.06,101607.9,0.421882,0.272085,0.254654,0.311339,102.2 +s3_shot_9i_8,shot_9i_8.json,92.21,21.95,-6.31,5042.3,0.73,5041.8,64.2,121.3,130.5,9.2,61.1,4.51,22.86,46.52,112846.1,0.273294,0.229631,0.279723,0.279723,121.3 +s3_shot_9i_9,shot_9i_9.json,90.06,22.14,-3.09,5351.1,1.21,5349.9,113.3,116.9,123.0,6.2,54.0,4.30,22.54,42.88,110212.5,0.296965,0.232535,0.231941,0.268000,116.9 +s3_shot_driver_51,shot_driver_51.json,116.17,21.74,2.17,6409.0,3.23,6398.8,360.7,174.3,193.9,19.6,109.3,6.16,25.54,56.27,142164.9,0.275733,0.228395,0.274312,0.274312,174.3 +s3_shot_driver_52,shot_driver_52.json,102.11,31.33,3.09,8442.2,6.26,8391.8,921.1,133.9,149.4,15.5,117.9,6.13,24.16,60.49,124959.2,0.413216,0.245899,0.250095,0.301073,133.9 +s3_shot_driver_53,shot_driver_53.json,97.23,30.63,2.23,8925.8,5.99,8877.1,931.1,124.1,135.0,10.9,102.0,5.69,23.10,56.94,118995.0,0.458786,0.265083,0.272631,0.310595,124.1 +s3_shot_driver_54,shot_driver_54.json,121.50,12.88,-5.26,3410.9,-9.97,3359.4,-590.5,183.6,188.7,5.1,54.3,4.79,28.21,29.58,148697.8,0.140300,0.208998,0.185406,0.186904,183.6 +s3_shot_driver_55,shot_driver_55.json,117.48,7.48,-8.33,2150.0,-27.19,1912.4,-982.4,128.1,184.4,56.3,17.6,2.86,34.26,13.30,143773.2,0.091462,0.197519,0.168768,0.168932,128.1 +s3_shot_driver_56,shot_driver_56.json,118.70,17.12,-1.80,4553.8,2.81,4548.4,222.9,181.4,201.6,20.2,92.9,5.78,26.15,50.62,145271.0,0.191729,0.220111,0.226607,0.281042,181.4 +s3_shot_driver_57,shot_driver_57.json,120.93,14.10,-5.16,1544.1,-7.96,1529.2,-213.7,172.5,177.3,4.8,47.4,4.23,30.71,26.13,147990.8,0.063815,0.196505,0.135395,0.136410,172.5 +s3_shot_driver_58,shot_driver_58.json,119.27,23.59,2.48,7093.4,3.26,7081.9,403.5,181.2,200.9,19.8,120.9,6.49,25.88,57.65,145965.8,0.297231,0.230714,0.231575,0.268541,181.2 +s3_shot_driver_59,shot_driver_59.json,80.96,44.91,8.87,6735.0,12.36,6578.8,1442.0,82.8,100.9,18.1,104.0,5.29,22.79,66.05,99079.0,0.415764,0.270301,0.251426,0.310684,82.8 +s3_shot_driver_60,shot_driver_60.json,107.39,11.67,-8.62,3268.6,-14.80,3160.1,-835.0,138.5,138.9,0.4,31.6,3.65,28.48,22.04,131422.8,0.152117,0.203783,0.189954,0.190320,138.5 +s3_shot_pw_64,shot_pw_64.json,69.63,28.57,0.16,5327.2,5.10,5306.2,473.4,75.7,92.0,16.3,42.7,3.64,19.40,45.17,85210.2,0.382385,0.293489,0.235700,0.308511,75.7 +s3_shot_pw_65,shot_pw_65.json,81.25,28.38,2.89,6959.4,9.38,6866.3,1134.7,98.4,104.1,5.7,61.8,4.47,20.80,48.82,99433.7,0.428086,0.274904,0.257944,0.311155,98.4 +s3_shot_pw_66,shot_pw_66.json,75.71,27.32,-1.17,6605.0,3.99,6589.0,460.1,87.1,102.1,15.0,49.8,4.00,19.95,45.08,92652.6,0.436020,0.278812,0.262117,0.311327,87.1 +s3_shot_pw_67,shot_pw_67.json,81.66,28.12,6.34,6509.6,12.74,6349.4,1435.1,100.0,106.8,6.7,61.0,4.46,20.93,48.83,99936.4,0.398402,0.263562,0.242678,0.311339,100.0 +s3_shot_pw_68,shot_pw_68.json,88.55,23.37,-0.05,6637.4,6.04,6600.5,698.8,116.1,120.2,4.1,57.2,4.48,21.93,42.94,108370.9,0.374608,0.243285,0.232885,0.292326,116.1 +s3_shot_pw_69,shot_pw_69.json,74.06,23.61,0.18,5880.4,8.45,5816.5,864.4,83.2,84.9,1.7,37.4,3.54,20.04,38.24,90634.2,0.396828,0.275008,0.241935,0.304135,83.2 diff --git a/assets/data/calibration/shot_diff_analysis.csv b/assets/data/calibration/shot_diff_analysis.csv index 4795d78..53d616c 100644 --- a/assets/data/calibration/shot_diff_analysis.csv +++ b/assets/data/calibration/shot_diff_analysis.csv @@ -1,7 +1,6 @@ shot_name,speed_mph,vla_deg,hla_deg,total_spin_rpm,spin_axis_deg,physics_carry_yd,flightscope_carry_yd,diff_carry_yd,physics_total_yd,flightscope_total_yd,diff_total_yd,rollout_physics_yd,rollout_flightscope_yd,diff_rollout_yd,physics_apex_ft,flightscope_apex_ft,diff_apex_ft,status 5iron,102.1,17.4,1.5,5391,12.3,143.7,138.1,5.6,154.3,142.2,12.1,10.6,4.1,6.5,64.6,59.6,5.0,severe approach_mid_iron_test_shot,93.9,22.9,-2.6,5375,2.0,125.8,125.8,0.0,136.4,128.5,7.9,10.6,2.7,7.9,64.6,69.3,-4.7,moderate -approach_test_shot,81.0,30.5,1.4,10490,5.7,92.5,92.2,0.3,93.3,91.5,1.8,0.8,-0.7,1.5,64.0,72.2,-8.2,pass bump_and_run,58.3,15.6,-0.8,1850,2.3,34.7,43.8,-9.1,34.5,62.0,-27.5,-0.2,18.2,-18.4,8.0,10.1,-2.1,severe bump_and_run_slow,30.3,15.6,-0.8,1850,2.3,10.0,,,27.1,,,17.1,,,2.2,,, bump_test_shot,78.3,5.6,-0.8,1850,2.3,36.9,39.0,-2.1,86.8,74.0,12.8,49.9,35.0,14.9,3.0,3.1,-0.1,severe @@ -32,6 +31,68 @@ s2_shot_24,121.5,14.5,-11.2,3173,-6.8,188.7,183.0,5.7,195.5,192.8,2.7,6.8,9.8,-3 s2_shot_26,117.0,18.4,-2.0,5035,9.7,173.3,170.7,2.6,197.3,174.2,23.1,24.0,3.5,20.5,112.3,88.1,24.2,severe s2_shot_27,113.0,17.6,-2.3,4292,12.2,168.1,164.5,3.6,183.4,169.6,13.8,15.3,5.1,10.2,78.6,73.6,5.0,severe s2_shot_9,94.4,20.1,2.4,4020,16.3,123.7,126.5,-2.8,136.0,132.5,3.5,12.3,6.0,6.3,62.1,54.8,7.3,pass +s3_shot_3w_18,47.9,45.8,34.0,7491,30.0,36.7,,,41.7,,,5.0,,,34.7,,, +s3_shot_3w_19,121.3,5.6,-4.8,1662,-11.9,120.5,120.6,-0.1,182.5,165.8,16.7,62.0,45.2,16.8,12.3,12.2,0.1,severe +s3_shot_3w_21,119.4,5.3,-3.4,1760,-10.5,115.7,114.6,1.1,177.1,160.5,16.6,61.4,45.9,15.5,11.2,10.9,0.3,severe +s3_shot_3w_22,108.9,5.6,-7.2,2501,-1.8,106.3,103.2,3.1,161.5,141.3,20.2,55.2,38.1,17.1,11.0,10.5,0.5,severe +s3_shot_3w_23,115.8,8.9,-0.8,2804,2.2,148.5,147.7,0.8,148.2,170.9,-22.7,-0.3,23.2,-23.5,26.8,28.0,-1.2,severe +s3_shot_3w_24,123.4,6.3,-5.4,2752,-13.3,153.8,145.9,7.9,206.3,176.7,29.6,52.5,30.8,21.7,21.7,19.8,1.9,severe +s3_shot_5i_10,88.0,14.2,1.2,4065,8.4,106.1,103.1,3.0,109.6,116.7,-7.1,3.5,13.6,-10.1,34.3,28.4,5.9,moderate +s3_shot_5i_11,90.6,14.4,-0.2,3360,7.8,105.6,108.8,-3.2,106.9,124.1,-17.2,1.3,15.3,-14.0,28.5,29.8,-1.3,severe +s3_shot_5i_12,74.2,10.2,-1.7,3321,15.8,59.6,58.4,1.2,58.4,81.9,-23.5,-1.2,23.5,-24.7,10.5,9.4,1.1,severe +s3_shot_5i_13,75.0,8.0,2.5,3921,3.4,56.5,53.9,2.6,89.0,78.9,10.1,32.5,25.0,7.5,7.4,6.8,0.6,severe +s3_shot_5i_15,86.9,9.3,-4.0,2509,-4.9,74.1,78.6,-4.5,121.3,106.6,14.7,47.2,28.0,19.2,11.0,12.1,-1.1,severe +s3_shot_5i_16,98.0,9.1,-2.1,3776,1.7,110.2,109.1,1.1,109.2,130.0,-20.8,-1.0,20.9,-21.9,19.5,19.7,-0.2,severe +s3_shot_5i_17,56.5,10.0,24.1,5178,29.1,28.6,30.6,-2.0,45.0,46.9,-1.9,16.4,16.3,0.1,4.2,4.5,-0.3,pass +s3_shot_6i_35,80.5,15.3,-1.3,4667,-0.0,84.9,90.0,-5.1,84.9,101.5,-16.6,0.0,11.5,-11.5,23.1,26.4,-3.3,severe +s3_shot_6i_36,78.9,10.4,16.1,4166,25.1,69.9,67.8,2.1,68.3,89.1,-20.8,-1.6,21.3,-22.9,12.4,11.8,0.6,severe +s3_shot_6i_37,82.6,10.2,11.0,3041,25.4,67.9,71.5,-3.6,109.4,97.2,12.2,41.5,25.7,15.8,11.0,11.8,-0.8,severe +s3_shot_6i_38,79.1,13.3,3.0,3187,11.6,76.0,79.2,-3.2,76.2,97.5,-21.3,0.2,18.3,-18.1,18.1,18.0,0.1,severe +s3_shot_6i_39,61.0,6.1,10.3,3285,22.0,23.5,24.0,-0.5,53.7,47.3,6.4,30.2,23.3,6.9,2.1,2.1,0.0,moderate +s3_shot_6i_40,62.1,6.8,27.0,2768,30.0,25.0,26.2,-1.2,58.9,51.1,7.8,33.9,24.9,9.0,2.6,2.5,0.1,moderate +s3_shot_6i_41,82.5,9.9,-2.3,2620,13.6,66.7,71.3,-4.6,111.1,97.9,13.2,44.4,26.6,17.8,10.3,11.3,-1.0,severe +s3_shot_6i_42,77.2,13.1,-3.4,4057,4.1,75.5,76.6,-1.1,75.5,92.9,-17.4,0.0,16.3,-16.3,18.3,17.5,0.8,severe +s3_shot_6i_43,94.1,13.9,-4.7,4616,1.7,123.7,117.3,6.4,129.5,128.6,0.9,5.8,11.3,-5.5,43.1,35.0,8.1,moderate +s3_shot_6i_44,115.0,9.5,-6.7,2314,15.1,141.1,142.3,-1.2,140.8,168.2,-27.4,-0.3,25.9,-26.2,25.3,26.6,-1.3,severe +s3_shot_6i_45,109.3,6.4,-9.0,2510,-10.9,113.1,109.6,3.5,166.5,145.4,21.1,53.4,35.8,17.6,13.5,12.9,0.6,severe +s3_shot_6i_46,116.3,13.7,0.3,3008,10.7,171.1,167.3,3.8,175.8,179.3,-3.5,4.7,12.0,-7.3,50.1,51.6,-1.5,moderate +s3_shot_6i_47,99.5,14.8,-2.9,4811,4.7,138.2,131.2,7.0,148.5,137.7,10.8,10.3,6.5,3.8,56.8,45.0,11.8,severe +s3_shot_6i_48,101.7,15.2,-3.0,4631,4.3,143.2,137.1,6.1,154.6,143.5,11.1,11.4,6.4,5.0,63.1,48.9,14.2,severe +s3_shot_6i_49,71.2,7.7,16.1,2625,30.0,37.4,39.9,-2.5,77.3,70.3,7.0,39.9,30.4,9.5,4.2,4.5,-0.3,moderate +s3_shot_6i_50,82.8,14.8,-1.4,3783,2.8,92.8,93.2,-0.4,95.3,107.4,-12.1,2.5,14.2,-11.7,29.5,25.6,3.9,severe +s3_shot_7i_25,83.3,13.2,3.0,3410,17.8,86.4,86.9,-0.5,86.8,104.8,-18.0,0.4,17.9,-17.5,21.0,20.1,0.9,severe +s3_shot_7i_26,73.4,10.8,15.4,3561,30.0,58.4,56.6,1.8,57.5,79.3,-21.8,-0.9,22.7,-23.6,10.7,9.6,1.1,severe +s3_shot_7i_27,93.7,17.1,-1.4,4612,2.6,124.1,122.3,1.8,132.6,128.3,4.3,8.5,6.0,2.5,54.0,46.0,8.0,pass +s3_shot_7i_28,92.1,16.4,-3.6,4217,-0.4,119.1,117.9,1.2,126.8,125.6,1.2,7.7,7.7,0.0,48.9,40.6,8.3,pass +s3_shot_7i_29,107.6,13.8,-6.0,3633,4.7,149.4,148.4,1.0,152.5,158.3,-5.8,3.1,9.9,-6.8,42.8,46.3,-3.5,moderate +s3_shot_7i_30,90.2,17.6,-3.8,4508,-0.2,115.2,115.4,-0.2,123.2,121.7,1.5,8.0,6.3,1.7,48.6,43.1,5.5,pass +s3_shot_7i_31,76.4,17.5,-0.5,5122,1.8,80.2,85.0,-4.8,80.2,94.5,-14.3,0.0,9.5,-9.5,24.3,28.4,-4.1,severe +s3_shot_7i_32,93.1,17.0,-1.0,3762,4.2,119.4,121.2,-1.8,127.6,129.8,-2.2,8.2,8.6,-0.4,45.6,42.5,3.1,pass +s3_shot_7i_33,92.4,17.0,-0.6,3852,2.8,118.1,119.7,-1.6,126.7,128.0,-1.3,8.6,8.3,0.3,46.7,42.0,4.7,pass +s3_shot_7i_34,104.2,14.7,-4.6,4081,1.9,146.9,142.5,4.4,153.2,150.6,2.6,6.3,8.1,-1.8,51.3,48.2,3.1,moderate +s3_shot_9i_1,89.0,15.1,-0.5,3563,11.3,105.3,106.7,-1.4,108.2,120.8,-12.6,2.9,14.1,-11.2,32.1,30.8,1.3,severe +s3_shot_9i_2,71.3,23.9,5.5,4086,8.3,74.1,82.1,-8.0,78.3,87.4,-9.1,4.2,5.3,-1.1,33.8,36.8,-3.0,severe +s3_shot_9i_3,90.1,21.7,2.8,5243,11.2,115.9,117.3,-1.4,121.8,120.7,1.1,5.9,3.4,2.5,52.4,57.7,-5.3,pass +s3_shot_9i_5,84.0,19.4,3.8,5352,11.5,100.1,102.7,-2.6,101.7,107.2,-5.5,1.6,4.5,-2.9,36.3,41.8,-5.5,moderate +s3_shot_9i_7,83.0,22.5,5.3,7008,9.7,102.2,101.1,1.1,104.2,102.6,1.6,2.0,1.5,0.5,47.3,51.5,-4.2,pass +s3_shot_9i_8,92.2,21.9,-6.3,5042,0.7,121.3,122.9,-1.6,130.5,126.4,4.1,9.2,3.5,5.7,61.1,62.6,-1.5,pass +s3_shot_9i_9,90.1,22.1,-3.1,5351,1.2,116.9,118.1,-1.2,123.0,121.1,1.9,6.1,3.0,3.1,54.0,60.1,-6.1,pass +s3_shot_driver_51,116.2,21.7,2.2,6409,3.2,174.3,162.9,11.4,193.9,164.3,29.6,19.6,1.4,18.2,109.3,108.7,0.6,severe +s3_shot_driver_52,102.1,31.3,3.1,8442,6.3,133.9,124.5,9.4,149.4,124.1,25.3,15.5,-0.4,15.9,117.9,119.3,-1.4,severe +s3_shot_driver_53,97.2,30.6,2.2,8926,6.0,124.1,117.6,6.5,135.0,117.1,17.9,10.9,-0.5,11.4,102.0,105.8,-3.8,severe +s3_shot_driver_54,121.5,12.9,-5.3,3411,-10.0,183.6,178.2,5.4,188.7,188.7,0.0,5.1,10.5,-5.4,54.3,56.5,-2.2,moderate +s3_shot_driver_55,117.5,7.5,-8.3,2150,-27.2,128.1,125.6,2.5,184.4,161.8,22.6,56.3,36.2,20.1,17.6,17.2,0.4,severe +s3_shot_driver_56,118.7,17.1,-1.8,4554,2.8,181.4,176.6,4.8,201.6,180.9,20.7,20.2,4.3,15.9,92.9,83.2,9.7,severe +s3_shot_driver_57,120.9,14.1,-5.2,1544,-8.0,172.5,177.6,-5.1,177.3,197.0,-19.7,4.8,19.4,-14.6,47.4,50.9,-3.5,severe +s3_shot_driver_58,119.3,23.6,2.5,7093,3.3,181.2,163.2,18.0,200.9,163.9,37.0,19.7,0.7,19.0,120.9,125.7,-4.8,severe +s3_shot_driver_59,81.0,44.9,8.9,6735,12.4,82.8,83.7,-0.9,100.9,83.2,17.7,18.1,-0.5,18.6,104.0,107.8,-3.8,severe +s3_shot_driver_60,107.4,11.7,-8.6,3269,-14.8,138.5,138.5,0.0,138.9,153.8,-14.9,0.4,15.3,-14.9,31.6,34.0,-2.4,severe +s3_shot_pw_64,69.6,28.6,0.2,5327,5.1,75.7,80.1,-4.4,92.0,82.4,9.6,16.3,2.3,14.0,42.7,46.4,-3.7,moderate +s3_shot_pw_65,81.2,28.4,2.9,6959,9.4,98.4,98.5,-0.1,104.1,99.4,4.7,5.7,0.9,4.8,61.8,65.6,-3.8,pass +s3_shot_pw_66,75.7,27.3,-1.2,6605,4.0,87.1,89.7,-2.6,102.1,90.8,11.3,15.0,1.1,13.9,49.8,53.5,-3.7,severe +s3_shot_pw_67,81.7,28.1,6.3,6510,12.7,100.0,100.0,0.0,106.8,101.1,5.7,6.8,1.1,5.7,61.0,65.0,-4.0,moderate +s3_shot_pw_68,88.5,23.4,-0.1,6637,6.0,116.1,112.7,3.4,120.2,114.1,6.1,4.1,1.4,2.7,57.2,63.4,-6.2,moderate +s3_shot_pw_69,74.1,23.6,0.2,5880,8.4,83.2,86.0,-2.8,84.9,88.8,-3.9,1.7,2.8,-1.1,37.4,41.2,-3.8,pass topped_test_shot,91.8,5.0,-0.9,2195,16.2,55.6,56.2,-0.6,109.2,95.3,13.9,53.6,39.1,14.5,4.2,4.3,-0.1,severe wedge_shot_1,48.7,29.0,-1.3,5684,11.1,37.5,42.6,-5.1,46.2,46.9,-0.7,8.7,4.3,4.4,18.9,21.3,-2.4,moderate wedge_shot_2,51.8,37.0,2.4,5652,9.1,43.0,49.1,-6.1,52.8,50.1,2.7,9.8,1.0,8.8,31.1,35.3,-4.2,moderate diff --git a/assets/data/openfairway_accuracy_summary_20260313_2006.json b/assets/data/openfairway_accuracy_summary_20260313_2006.json new file mode 100644 index 0000000..0291e6f --- /dev/null +++ b/assets/data/openfairway_accuracy_summary_20260313_2006.json @@ -0,0 +1,58 @@ +{ + "timestamp": "2026-03-13T20:06", + "total_shots": 102, + "shots_with_reference": 99, + "carry_accuracy": { + "avg_error_yd": 1.2, + "avg_off_yd": 3.6, + "typical_off_yd": 2.8, + "consistency_yd": 4.5, + "worst_off_yd": 18.0, + "within_pct_yd": { + "1": 20.2, + "2": 40.4, + "3": 51.5, + "5": 71.7, + "7": 88.9, + "10": 97.0, + "15": 99.0, + "20": 100.0 + } + }, + "total_accuracy": { + "avg_error_yd": 2.7, + "avg_off_yd": 11.5, + "typical_off_yd": 10.7, + "consistency_yd": 14.2, + "worst_off_yd": 37.0, + "within_pct_yd": { + "1": 5.1, + "2": 15.2, + "3": 23.2, + "5": 34.3, + "7": 40.4, + "10": 48.5, + "15": 66.7, + "20": 78.8 + } + }, + "apex_accuracy": { + "avg_error_ft": -0.1, + "avg_off_ft": 3.6, + "typical_off_ft": 3.1, + "consistency_ft": 5.2, + "worst_off_ft": 24.2, + "within_pct_ft": { + "1": 25.3, + "2": 43.4, + "3": 49.5, + "5": 77.8, + "7": 88.9, + "10": 96.0, + "13": 97.0, + "15": 98.0, + "20": 98.0, + "50": 100.0 + } + } +} diff --git a/assets/data/openfairway_critical_carry_20260313_2006.csv b/assets/data/openfairway_critical_carry_20260313_2006.csv new file mode 100644 index 0000000..0279cc8 --- /dev/null +++ b/assets/data/openfairway_critical_carry_20260313_2006.csv @@ -0,0 +1,100 @@ +shot_name,speed_mph,vla_deg,hla_deg,total_spin_rpm,spin_axis_deg,physics_carry_yd,flightscope_carry_yd,diff_carry_yd,physics_total_yd,flightscope_total_yd,diff_total_yd,rollout_physics_yd,rollout_flightscope_yd,diff_rollout_yd,physics_apex_ft,flightscope_apex_ft,diff_apex_ft,status +s3_shot_driver_58,119.3,23.6,2.5,7093,3.3,181.2,163.2,18.0,200.9,163.9,37.0,19.7,0.7,19.0,120.9,125.7,-4.8,severe +wood1,124.2,6.7,-8.1,4528,4.8,178.2,165.5,12.7,178.7,181.9,-3.2,0.5,16.4,-15.9,36.0,32.8,3.2,severe +s3_shot_driver_51,116.2,21.7,2.2,6409,3.2,174.3,162.9,11.4,193.9,164.3,29.6,19.6,1.4,18.2,109.3,108.7,0.6,severe +s3_shot_driver_52,102.1,31.3,3.1,8442,6.3,133.9,124.5,9.4,149.4,124.1,25.3,15.5,-0.4,15.9,117.9,119.3,-1.4,severe +bump_and_run,58.3,15.6,-0.8,1850,2.3,34.7,43.8,-9.1,34.5,62.0,-27.5,-0.2,18.2,-18.4,8.0,10.1,-2.1,severe +driver2,124.6,13.2,-6.8,3994,-6.1,193.7,184.8,8.9,200.9,192.3,8.6,7.2,7.5,-0.3,63.1,65.8,-2.7,severe +s3_shot_9i_2,71.3,23.9,5.5,4086,8.3,74.1,82.1,-8.0,78.3,87.4,-9.1,4.2,5.3,-1.1,33.8,36.8,-3.0,severe +s3_shot_3w_24,123.4,6.3,-5.4,2752,-13.3,153.8,145.9,7.9,206.3,176.7,29.6,52.5,30.8,21.7,21.7,19.8,1.9,severe +driver4,119.0,15.5,-10.2,4454,-7.8,183.3,175.6,7.7,197.2,180.9,16.3,13.9,5.3,8.6,78.2,73.8,4.4,severe +s2_shot_17,122.9,14.4,-1.3,4119,6.7,191.2,184.0,7.2,199.5,190.3,9.2,8.3,6.3,2.0,68.2,71.8,-3.6,severe +s2_shot_20,120.9,15.0,-3.0,4245,9.6,186.6,179.4,7.2,196.4,185.3,11.1,9.8,5.9,3.9,70.5,72.3,-1.8,severe +s3_shot_6i_47,99.5,14.8,-2.9,4811,4.7,138.2,131.2,7.0,148.5,137.7,10.8,10.3,6.5,3.8,56.8,45.0,11.8,severe +s3_shot_driver_53,97.2,30.6,2.2,8926,6.0,124.1,117.6,6.5,135.0,117.1,17.9,10.9,-0.5,11.4,102.0,105.8,-3.8,severe +s3_shot_6i_43,94.1,13.9,-4.7,4616,1.7,123.7,117.3,6.4,129.5,128.6,0.9,5.8,11.3,-5.5,43.1,35.0,8.1,moderate +driver3,119.1,16.0,-8.9,4935,-9.4,180.3,174.1,6.2,201.8,178.5,23.3,21.5,4.4,17.1,99.6,78.5,21.1,severe +s3_shot_6i_48,101.7,15.2,-3.0,4631,4.3,143.2,137.1,6.1,154.6,143.5,11.1,11.4,6.4,5.0,63.1,48.9,14.2,severe +wedge_shot_2,51.8,37.0,2.4,5652,9.1,43.0,49.1,-6.1,52.8,50.1,2.7,9.8,1.0,8.8,31.1,35.3,-4.2,moderate +s2_shot_21,127.3,7.2,-11.5,2321,-19.5,160.7,154.9,5.8,215.3,186.5,28.8,54.6,31.6,23.0,24.9,23.1,1.8,severe +s2_shot_22,123.3,14.0,-6.1,3104,10.0,191.1,185.4,5.7,199.0,195.5,3.5,7.9,10.1,-2.2,61.6,63.0,-1.4,moderate +s2_shot_24,121.5,14.5,-11.2,3173,-6.8,188.7,183.0,5.7,195.5,192.8,2.7,6.8,9.8,-3.0,63.0,64.6,-1.6,moderate +5iron,102.1,17.4,1.5,5391,12.3,143.7,138.1,5.6,154.3,142.2,12.1,10.6,4.1,6.5,64.6,59.6,5.0,severe +s3_shot_driver_54,121.5,12.9,-5.3,3411,-10.0,183.6,178.2,5.4,188.7,188.7,0.0,5.1,10.5,-5.4,54.3,56.5,-2.2,moderate +wedge_test_shot2,54.7,26.8,1.6,4976,5.7,46.8,52.2,-5.4,60.8,57.7,3.1,14.0,5.5,8.5,22.4,24.4,-2.0,moderate +s2_shot_12,90.8,24.5,-3.9,7261,4.9,120.6,115.4,5.2,125.9,116.4,9.5,5.3,1.0,4.3,66.4,71.5,-5.1,moderate +s2_shot_18,105.7,20.5,-1.7,5667,8.2,151.9,146.8,5.1,166.0,149.4,16.6,14.1,2.6,11.5,83.5,80.4,3.1,severe +s3_shot_6i_35,80.5,15.3,-1.3,4667,-0.0,84.9,90.0,-5.1,84.9,101.5,-16.6,0.0,11.5,-11.5,23.1,26.4,-3.3,severe +s3_shot_driver_57,120.9,14.1,-5.2,1544,-8.0,172.5,177.6,-5.1,177.3,197.0,-19.7,4.8,19.4,-14.6,47.4,50.9,-3.5,severe +wedge_shot_1,48.7,29.0,-1.3,5684,11.1,37.5,42.6,-5.1,46.2,46.9,-0.7,8.7,4.3,4.4,18.9,21.3,-2.4,moderate +wedge_test_shot,66.4,23.2,-1.4,6449,7.1,65.6,70.6,-5.0,79.4,75.8,3.6,13.8,5.2,8.6,28.0,31.2,-3.2,moderate +s3_shot_7i_31,76.4,17.5,-0.5,5122,1.8,80.2,85.0,-4.8,80.2,94.5,-14.3,0.0,9.5,-9.5,24.3,28.4,-4.1,severe +s3_shot_driver_56,118.7,17.1,-1.8,4554,2.8,181.4,176.6,4.8,201.6,180.9,20.7,20.2,4.3,15.9,92.9,83.2,9.7,severe +wood2,118.8,14.5,-3.3,3026,11.2,180.4,175.6,4.8,186.8,186.1,0.7,6.4,10.5,-4.1,57.7,59.3,-1.6,moderate +s3_shot_6i_41,82.5,9.9,-2.3,2620,13.6,66.7,71.3,-4.6,111.1,97.9,13.2,44.4,26.6,17.8,10.3,11.3,-1.0,severe +s3_shot_5i_15,86.9,9.3,-4.0,2509,-4.9,74.1,78.6,-4.5,121.3,106.6,14.7,47.2,28.0,19.2,11.0,12.1,-1.1,severe +s3_shot_7i_34,104.2,14.7,-4.6,4081,1.9,146.9,142.5,4.4,153.2,150.6,2.6,6.3,8.1,-1.8,51.3,48.2,3.1,moderate +s3_shot_pw_64,69.6,28.6,0.2,5327,5.1,75.7,80.1,-4.4,92.0,82.4,9.6,16.3,2.3,14.0,42.7,46.4,-3.7,moderate +p_wedge_shot_1,82.3,26.5,-3.1,4946,6.7,100.2,104.5,-4.3,109.5,107.3,2.2,9.3,2.8,6.5,55.1,60.5,-5.4,moderate +s2_shot_23,125.5,8.6,-14.3,3062,-23.9,166.1,161.9,4.2,166.1,185.0,-18.9,0.0,23.1,-23.1,31.1,31.0,0.1,severe +s2_shot_10,89.7,25.5,-3.1,6446,6.2,119.1,115.1,4.0,127.1,116.4,10.7,8.0,1.3,6.7,66.2,72.0,-5.8,severe +s3_shot_6i_46,116.3,13.7,0.3,3008,10.7,171.1,167.3,3.8,175.8,179.3,-3.5,4.7,12.0,-7.3,50.1,51.6,-1.5,moderate +s2_shot_27,113.0,17.6,-2.3,4292,12.2,168.1,164.5,3.6,183.4,169.6,13.8,15.3,5.1,10.2,78.6,73.6,5.0,severe +s3_shot_6i_37,82.6,10.2,11.0,3041,25.4,67.9,71.5,-3.6,109.4,97.2,12.2,41.5,25.7,15.8,11.0,11.8,-0.8,severe +s3_shot_6i_45,109.3,6.4,-9.0,2510,-10.9,113.1,109.6,3.5,166.5,145.4,21.1,53.4,35.8,17.6,13.5,12.9,0.6,severe +s3_shot_pw_68,88.5,23.4,-0.1,6637,6.0,116.1,112.7,3.4,120.2,114.1,6.1,4.1,1.4,2.7,57.2,63.4,-6.2,moderate +s2_shot_19,128.6,12.5,-8.4,2514,5.1,197.8,194.5,3.3,204.3,208.7,-4.4,6.5,14.2,-7.7,56.4,57.3,-0.9,moderate +s3_shot_5i_11,90.6,14.4,-0.2,3360,7.8,105.6,108.8,-3.2,106.9,124.1,-17.2,1.3,15.3,-14.0,28.5,29.8,-1.3,severe +s3_shot_6i_38,79.1,13.3,3.0,3187,11.6,76.0,79.2,-3.2,76.2,97.5,-21.3,0.2,18.3,-18.1,18.1,18.0,0.1,severe +s3_shot_3w_22,108.9,5.6,-7.2,2501,-1.8,106.3,103.2,3.1,161.5,141.3,20.2,55.2,38.1,17.1,11.0,10.5,0.5,severe +s3_shot_5i_10,88.0,14.2,1.2,4065,8.4,106.1,103.1,3.0,109.6,116.7,-7.1,3.5,13.6,-10.1,34.3,28.4,5.9,moderate +s2_shot_9,94.4,20.1,2.4,4020,16.3,123.7,126.5,-2.8,136.0,132.5,3.5,12.3,6.0,6.3,62.1,54.8,7.3,pass +s3_shot_pw_69,74.1,23.6,0.2,5880,8.4,83.2,86.0,-2.8,84.9,88.8,-3.9,1.7,2.8,-1.1,37.4,41.2,-3.8,pass +s2_shot_26,117.0,18.4,-2.0,5035,9.7,173.3,170.7,2.6,197.3,174.2,23.1,24.0,3.5,20.5,112.3,88.1,24.2,severe +s3_shot_5i_13,75.0,8.0,2.5,3921,3.4,56.5,53.9,2.6,89.0,78.9,10.1,32.5,25.0,7.5,7.4,6.8,0.6,severe +s3_shot_9i_5,84.0,19.4,3.8,5352,11.5,100.1,102.7,-2.6,101.7,107.2,-5.5,1.6,4.5,-2.9,36.3,41.8,-5.5,moderate +s3_shot_pw_66,75.7,27.3,-1.2,6605,4.0,87.1,89.7,-2.6,102.1,90.8,11.3,15.0,1.1,13.9,49.8,53.5,-3.7,severe +s3_shot_6i_49,71.2,7.7,16.1,2625,30.0,37.4,39.9,-2.5,77.3,70.3,7.0,39.9,30.4,9.5,4.2,4.5,-0.3,moderate +s3_shot_driver_55,117.5,7.5,-8.3,2150,-27.2,128.1,125.6,2.5,184.4,161.8,22.6,56.3,36.2,20.1,17.6,17.2,0.4,severe +bump_test_shot,78.3,5.6,-0.8,1850,2.3,36.9,39.0,-2.1,86.8,74.0,12.8,49.9,35.0,14.9,3.0,3.1,-0.1,severe +s3_shot_6i_36,78.9,10.4,16.1,4166,25.1,69.9,67.8,2.1,68.3,89.1,-20.8,-1.6,21.3,-22.9,12.4,11.8,0.6,severe +s3_shot_5i_17,56.5,10.0,24.1,5178,29.1,28.6,30.6,-2.0,45.0,46.9,-1.9,16.4,16.3,0.1,4.2,4.5,-0.3,pass +s2_shot_13,95.2,19.6,-1.1,5610,12.2,127.1,125.3,1.8,131.7,128.7,3.0,4.6,3.4,1.2,52.5,58.4,-5.9,pass +s3_shot_7i_26,73.4,10.8,15.4,3561,30.0,58.4,56.6,1.8,57.5,79.3,-21.8,-0.9,22.7,-23.6,10.7,9.6,1.1,severe +s3_shot_7i_27,93.7,17.1,-1.4,4612,2.6,124.1,122.3,1.8,132.6,128.3,4.3,8.5,6.0,2.5,54.0,46.0,8.0,pass +s3_shot_7i_32,93.1,17.0,-1.0,3762,4.2,119.4,121.2,-1.8,127.6,129.8,-2.2,8.2,8.6,-0.4,45.6,42.5,3.1,pass +wood_low_test_shot,114.5,7.0,-0.6,1932,-1.4,124.4,122.6,1.8,181.8,158.9,22.9,57.4,36.3,21.1,16.1,15.7,0.4,severe +s2_shot_11,78.5,29.6,4.3,7350,10.7,91.3,93.0,-1.7,95.6,93.6,2.0,4.3,0.6,3.7,59.6,64.0,-4.4,pass +s3_shot_7i_33,92.4,17.0,-0.6,3852,2.8,118.1,119.7,-1.6,126.7,128.0,-1.3,8.6,8.3,0.3,46.7,42.0,4.7,pass +s3_shot_9i_8,92.2,21.9,-6.3,5042,0.7,121.3,122.9,-1.6,130.5,126.4,4.1,9.2,3.5,5.7,61.1,62.6,-1.5,pass +s3_shot_9i_1,89.0,15.1,-0.5,3563,11.3,105.3,106.7,-1.4,108.2,120.8,-12.6,2.9,14.1,-11.2,32.1,30.8,1.3,severe +s3_shot_9i_3,90.1,21.7,2.8,5243,11.2,115.9,117.3,-1.4,121.8,120.7,1.1,5.9,3.4,2.5,52.4,57.7,-5.3,pass +s3_shot_5i_12,74.2,10.2,-1.7,3321,15.8,59.6,58.4,1.2,58.4,81.9,-23.5,-1.2,23.5,-24.7,10.5,9.4,1.1,severe +s3_shot_6i_40,62.1,6.8,27.0,2768,30.0,25.0,26.2,-1.2,58.9,51.1,7.8,33.9,24.9,9.0,2.6,2.5,0.1,moderate +s3_shot_6i_44,115.0,9.5,-6.7,2314,15.1,141.1,142.3,-1.2,140.8,168.2,-27.4,-0.3,25.9,-26.2,25.3,26.6,-1.3,severe +s3_shot_7i_28,92.1,16.4,-3.6,4217,-0.4,119.1,117.9,1.2,126.8,125.6,1.2,7.7,7.7,0.0,48.9,40.6,8.3,pass +s3_shot_9i_9,90.1,22.1,-3.1,5351,1.2,116.9,118.1,-1.2,123.0,121.1,1.9,6.1,3.0,3.1,54.0,60.1,-6.1,pass +s3_shot_3w_21,119.4,5.3,-3.4,1760,-10.5,115.7,114.6,1.1,177.1,160.5,16.6,61.4,45.9,15.5,11.2,10.9,0.3,severe +s3_shot_5i_16,98.0,9.1,-2.1,3776,1.7,110.2,109.1,1.1,109.2,130.0,-20.8,-1.0,20.9,-21.9,19.5,19.7,-0.2,severe +s3_shot_6i_42,77.2,13.1,-3.4,4057,4.1,75.5,76.6,-1.1,75.5,92.9,-17.4,0.0,16.3,-16.3,18.3,17.5,0.8,severe +s3_shot_9i_7,83.0,22.5,5.3,7008,9.7,102.2,101.1,1.1,104.2,102.6,1.6,2.0,1.5,0.5,47.3,51.5,-4.2,pass +drive_test_shot,150.0,12.5,1.5,2335,-9.9,245.0,244.0,1.0,256.8,256.0,0.8,11.8,12.0,-0.2,80.0,80.6,-0.6,pass +s3_shot_7i_29,107.6,13.8,-6.0,3633,4.7,149.4,148.4,1.0,152.5,158.3,-5.8,3.1,9.9,-6.8,42.8,46.3,-3.5,moderate +flop_test_shot,68.0,45.0,0.5,12000,0.8,62.7,61.8,0.9,63.1,60.3,2.8,0.4,-1.5,1.9,69.2,76.8,-7.6,pass +s3_shot_driver_59,81.0,44.9,8.9,6735,12.4,82.8,83.7,-0.9,100.9,83.2,17.7,18.1,-0.5,18.6,104.0,107.8,-3.8,severe +s3_shot_3w_23,115.8,8.9,-0.8,2804,2.2,148.5,147.7,0.8,148.2,170.9,-22.7,-0.3,23.2,-23.5,26.8,28.0,-1.2,severe +checked_test_shot,75.0,38.5,1.4,10701,5.7,77.0,77.6,-0.6,78.6,77.5,1.1,1.6,-0.1,1.7,70.8,79.5,-8.7,pass +s2_shot_15,88.1,14.2,-0.3,4985,19.4,100.7,101.3,-0.6,100.8,113.1,-12.3,0.1,11.8,-11.7,27.0,28.9,-1.9,severe +topped_test_shot,91.8,5.0,-0.9,2195,16.2,55.6,56.2,-0.6,109.2,95.3,13.9,53.6,39.1,14.5,4.2,4.3,-0.1,severe +s3_shot_6i_39,61.0,6.1,10.3,3285,22.0,23.5,24.0,-0.5,53.7,47.3,6.4,30.2,23.3,6.9,2.1,2.1,0.0,moderate +s3_shot_7i_25,83.3,13.2,3.0,3410,17.8,86.4,86.9,-0.5,86.8,104.8,-18.0,0.4,17.9,-17.5,21.0,20.1,0.9,severe +s2_shot_16,94.1,19.1,-5.9,5291,5.0,124.7,124.3,0.4,130.3,128.1,2.2,5.6,3.8,1.8,52.1,55.3,-3.2,pass +s3_shot_6i_50,82.8,14.8,-1.4,3783,2.8,92.8,93.2,-0.4,95.3,107.4,-12.1,2.5,14.2,-11.7,29.5,25.6,3.9,severe +driver1,124.0,9.4,-9.5,2322,-24.8,158.3,158.0,0.3,158.3,184.0,-25.7,0.0,26.0,-26.0,29.5,30.2,-0.7,severe +s2_shot_14,87.1,22.4,-2.0,5660,11.4,111.1,110.9,0.2,115.3,113.7,1.6,4.2,2.8,1.4,50.0,55.9,-5.9,pass +s3_shot_7i_30,90.2,17.6,-3.8,4508,-0.2,115.2,115.4,-0.2,123.2,121.7,1.5,8.0,6.3,1.7,48.6,43.1,5.5,pass +s3_shot_3w_19,121.3,5.6,-4.8,1662,-11.9,120.5,120.6,-0.1,182.5,165.8,16.7,62.0,45.2,16.8,12.3,12.2,0.1,severe +s3_shot_pw_65,81.2,28.4,2.9,6959,9.4,98.4,98.5,-0.1,104.1,99.4,4.7,5.7,0.9,4.8,61.8,65.6,-3.8,pass +approach_mid_iron_test_shot,93.9,22.9,-2.6,5375,2.0,125.8,125.8,0.0,136.4,128.5,7.9,10.6,2.7,7.9,64.6,69.3,-4.7,moderate +s3_shot_driver_60,107.4,11.7,-8.6,3269,-14.8,138.5,138.5,0.0,138.9,153.8,-14.9,0.4,15.3,-14.9,31.6,34.0,-2.4,severe +s3_shot_pw_67,81.7,28.1,6.3,6510,12.7,100.0,100.0,0.0,106.8,101.1,5.7,6.8,1.1,5.7,61.0,65.0,-4.0,moderate diff --git a/assets/data/openfairway_critical_overall_20260313_2006.csv b/assets/data/openfairway_critical_overall_20260313_2006.csv new file mode 100644 index 0000000..5f119a5 --- /dev/null +++ b/assets/data/openfairway_critical_overall_20260313_2006.csv @@ -0,0 +1,100 @@ +shot_name,speed_mph,vla_deg,hla_deg,total_spin_rpm,spin_axis_deg,physics_carry_yd,flightscope_carry_yd,diff_carry_yd,physics_total_yd,flightscope_total_yd,diff_total_yd,rollout_physics_yd,rollout_flightscope_yd,diff_rollout_yd,physics_apex_ft,flightscope_apex_ft,diff_apex_ft,status +s3_shot_driver_58,119.3,23.6,2.5,7093,3.3,181.2,163.2,18.0,200.9,163.9,37.0,19.7,0.7,19.0,120.9,125.7,-4.8,severe +s3_shot_3w_24,123.4,6.3,-5.4,2752,-13.3,153.8,145.9,7.9,206.3,176.7,29.6,52.5,30.8,21.7,21.7,19.8,1.9,severe +s3_shot_driver_51,116.2,21.7,2.2,6409,3.2,174.3,162.9,11.4,193.9,164.3,29.6,19.6,1.4,18.2,109.3,108.7,0.6,severe +s2_shot_21,127.3,7.2,-11.5,2321,-19.5,160.7,154.9,5.8,215.3,186.5,28.8,54.6,31.6,23.0,24.9,23.1,1.8,severe +bump_and_run,58.3,15.6,-0.8,1850,2.3,34.7,43.8,-9.1,34.5,62.0,-27.5,-0.2,18.2,-18.4,8.0,10.1,-2.1,severe +s3_shot_6i_44,115.0,9.5,-6.7,2314,15.1,141.1,142.3,-1.2,140.8,168.2,-27.4,-0.3,25.9,-26.2,25.3,26.6,-1.3,severe +driver1,124.0,9.4,-9.5,2322,-24.8,158.3,158.0,0.3,158.3,184.0,-25.7,0.0,26.0,-26.0,29.5,30.2,-0.7,severe +s3_shot_driver_52,102.1,31.3,3.1,8442,6.3,133.9,124.5,9.4,149.4,124.1,25.3,15.5,-0.4,15.9,117.9,119.3,-1.4,severe +s3_shot_5i_12,74.2,10.2,-1.7,3321,15.8,59.6,58.4,1.2,58.4,81.9,-23.5,-1.2,23.5,-24.7,10.5,9.4,1.1,severe +driver3,119.1,16.0,-8.9,4935,-9.4,180.3,174.1,6.2,201.8,178.5,23.3,21.5,4.4,17.1,99.6,78.5,21.1,severe +s2_shot_26,117.0,18.4,-2.0,5035,9.7,173.3,170.7,2.6,197.3,174.2,23.1,24.0,3.5,20.5,112.3,88.1,24.2,severe +wood_low_test_shot,114.5,7.0,-0.6,1932,-1.4,124.4,122.6,1.8,181.8,158.9,22.9,57.4,36.3,21.1,16.1,15.7,0.4,severe +s3_shot_3w_23,115.8,8.9,-0.8,2804,2.2,148.5,147.7,0.8,148.2,170.9,-22.7,-0.3,23.2,-23.5,26.8,28.0,-1.2,severe +s3_shot_driver_55,117.5,7.5,-8.3,2150,-27.2,128.1,125.6,2.5,184.4,161.8,22.6,56.3,36.2,20.1,17.6,17.2,0.4,severe +s3_shot_7i_26,73.4,10.8,15.4,3561,30.0,58.4,56.6,1.8,57.5,79.3,-21.8,-0.9,22.7,-23.6,10.7,9.6,1.1,severe +s3_shot_6i_38,79.1,13.3,3.0,3187,11.6,76.0,79.2,-3.2,76.2,97.5,-21.3,0.2,18.3,-18.1,18.1,18.0,0.1,severe +s3_shot_6i_45,109.3,6.4,-9.0,2510,-10.9,113.1,109.6,3.5,166.5,145.4,21.1,53.4,35.8,17.6,13.5,12.9,0.6,severe +s3_shot_5i_16,98.0,9.1,-2.1,3776,1.7,110.2,109.1,1.1,109.2,130.0,-20.8,-1.0,20.9,-21.9,19.5,19.7,-0.2,severe +s3_shot_6i_36,78.9,10.4,16.1,4166,25.1,69.9,67.8,2.1,68.3,89.1,-20.8,-1.6,21.3,-22.9,12.4,11.8,0.6,severe +s3_shot_driver_56,118.7,17.1,-1.8,4554,2.8,181.4,176.6,4.8,201.6,180.9,20.7,20.2,4.3,15.9,92.9,83.2,9.7,severe +s3_shot_3w_22,108.9,5.6,-7.2,2501,-1.8,106.3,103.2,3.1,161.5,141.3,20.2,55.2,38.1,17.1,11.0,10.5,0.5,severe +s3_shot_driver_57,120.9,14.1,-5.2,1544,-8.0,172.5,177.6,-5.1,177.3,197.0,-19.7,4.8,19.4,-14.6,47.4,50.9,-3.5,severe +s2_shot_23,125.5,8.6,-14.3,3062,-23.9,166.1,161.9,4.2,166.1,185.0,-18.9,0.0,23.1,-23.1,31.1,31.0,0.1,severe +s3_shot_7i_25,83.3,13.2,3.0,3410,17.8,86.4,86.9,-0.5,86.8,104.8,-18.0,0.4,17.9,-17.5,21.0,20.1,0.9,severe +s3_shot_driver_53,97.2,30.6,2.2,8926,6.0,124.1,117.6,6.5,135.0,117.1,17.9,10.9,-0.5,11.4,102.0,105.8,-3.8,severe +s3_shot_driver_59,81.0,44.9,8.9,6735,12.4,82.8,83.7,-0.9,100.9,83.2,17.7,18.1,-0.5,18.6,104.0,107.8,-3.8,severe +s3_shot_6i_42,77.2,13.1,-3.4,4057,4.1,75.5,76.6,-1.1,75.5,92.9,-17.4,0.0,16.3,-16.3,18.3,17.5,0.8,severe +s3_shot_5i_11,90.6,14.4,-0.2,3360,7.8,105.6,108.8,-3.2,106.9,124.1,-17.2,1.3,15.3,-14.0,28.5,29.8,-1.3,severe +s3_shot_3w_19,121.3,5.6,-4.8,1662,-11.9,120.5,120.6,-0.1,182.5,165.8,16.7,62.0,45.2,16.8,12.3,12.2,0.1,severe +s2_shot_18,105.7,20.5,-1.7,5667,8.2,151.9,146.8,5.1,166.0,149.4,16.6,14.1,2.6,11.5,83.5,80.4,3.1,severe +s3_shot_3w_21,119.4,5.3,-3.4,1760,-10.5,115.7,114.6,1.1,177.1,160.5,16.6,61.4,45.9,15.5,11.2,10.9,0.3,severe +s3_shot_6i_35,80.5,15.3,-1.3,4667,-0.0,84.9,90.0,-5.1,84.9,101.5,-16.6,0.0,11.5,-11.5,23.1,26.4,-3.3,severe +driver4,119.0,15.5,-10.2,4454,-7.8,183.3,175.6,7.7,197.2,180.9,16.3,13.9,5.3,8.6,78.2,73.8,4.4,severe +s3_shot_driver_60,107.4,11.7,-8.6,3269,-14.8,138.5,138.5,0.0,138.9,153.8,-14.9,0.4,15.3,-14.9,31.6,34.0,-2.4,severe +s3_shot_5i_15,86.9,9.3,-4.0,2509,-4.9,74.1,78.6,-4.5,121.3,106.6,14.7,47.2,28.0,19.2,11.0,12.1,-1.1,severe +s3_shot_7i_31,76.4,17.5,-0.5,5122,1.8,80.2,85.0,-4.8,80.2,94.5,-14.3,0.0,9.5,-9.5,24.3,28.4,-4.1,severe +topped_test_shot,91.8,5.0,-0.9,2195,16.2,55.6,56.2,-0.6,109.2,95.3,13.9,53.6,39.1,14.5,4.2,4.3,-0.1,severe +s2_shot_27,113.0,17.6,-2.3,4292,12.2,168.1,164.5,3.6,183.4,169.6,13.8,15.3,5.1,10.2,78.6,73.6,5.0,severe +s3_shot_6i_41,82.5,9.9,-2.3,2620,13.6,66.7,71.3,-4.6,111.1,97.9,13.2,44.4,26.6,17.8,10.3,11.3,-1.0,severe +bump_test_shot,78.3,5.6,-0.8,1850,2.3,36.9,39.0,-2.1,86.8,74.0,12.8,49.9,35.0,14.9,3.0,3.1,-0.1,severe +wood1,124.2,6.7,-8.1,4528,4.8,178.2,165.5,12.7,178.7,181.9,-3.2,0.5,16.4,-15.9,36.0,32.8,3.2,severe +s3_shot_9i_1,89.0,15.1,-0.5,3563,11.3,105.3,106.7,-1.4,108.2,120.8,-12.6,2.9,14.1,-11.2,32.1,30.8,1.3,severe +s2_shot_15,88.1,14.2,-0.3,4985,19.4,100.7,101.3,-0.6,100.8,113.1,-12.3,0.1,11.8,-11.7,27.0,28.9,-1.9,severe +s3_shot_6i_37,82.6,10.2,11.0,3041,25.4,67.9,71.5,-3.6,109.4,97.2,12.2,41.5,25.7,15.8,11.0,11.8,-0.8,severe +5iron,102.1,17.4,1.5,5391,12.3,143.7,138.1,5.6,154.3,142.2,12.1,10.6,4.1,6.5,64.6,59.6,5.0,severe +s3_shot_6i_50,82.8,14.8,-1.4,3783,2.8,92.8,93.2,-0.4,95.3,107.4,-12.1,2.5,14.2,-11.7,29.5,25.6,3.9,severe +s3_shot_pw_66,75.7,27.3,-1.2,6605,4.0,87.1,89.7,-2.6,102.1,90.8,11.3,15.0,1.1,13.9,49.8,53.5,-3.7,severe +s2_shot_20,120.9,15.0,-3.0,4245,9.6,186.6,179.4,7.2,196.4,185.3,11.1,9.8,5.9,3.9,70.5,72.3,-1.8,severe +s3_shot_6i_48,101.7,15.2,-3.0,4631,4.3,143.2,137.1,6.1,154.6,143.5,11.1,11.4,6.4,5.0,63.1,48.9,14.2,severe +s3_shot_6i_47,99.5,14.8,-2.9,4811,4.7,138.2,131.2,7.0,148.5,137.7,10.8,10.3,6.5,3.8,56.8,45.0,11.8,severe +s2_shot_10,89.7,25.5,-3.1,6446,6.2,119.1,115.1,4.0,127.1,116.4,10.7,8.0,1.3,6.7,66.2,72.0,-5.8,severe +s3_shot_5i_13,75.0,8.0,2.5,3921,3.4,56.5,53.9,2.6,89.0,78.9,10.1,32.5,25.0,7.5,7.4,6.8,0.6,severe +s3_shot_pw_64,69.6,28.6,0.2,5327,5.1,75.7,80.1,-4.4,92.0,82.4,9.6,16.3,2.3,14.0,42.7,46.4,-3.7,moderate +s2_shot_12,90.8,24.5,-3.9,7261,4.9,120.6,115.4,5.2,125.9,116.4,9.5,5.3,1.0,4.3,66.4,71.5,-5.1,moderate +s2_shot_17,122.9,14.4,-1.3,4119,6.7,191.2,184.0,7.2,199.5,190.3,9.2,8.3,6.3,2.0,68.2,71.8,-3.6,severe +s3_shot_9i_2,71.3,23.9,5.5,4086,8.3,74.1,82.1,-8.0,78.3,87.4,-9.1,4.2,5.3,-1.1,33.8,36.8,-3.0,severe +driver2,124.6,13.2,-6.8,3994,-6.1,193.7,184.8,8.9,200.9,192.3,8.6,7.2,7.5,-0.3,63.1,65.8,-2.7,severe +approach_mid_iron_test_shot,93.9,22.9,-2.6,5375,2.0,125.8,125.8,0.0,136.4,128.5,7.9,10.6,2.7,7.9,64.6,69.3,-4.7,moderate +s3_shot_6i_40,62.1,6.8,27.0,2768,30.0,25.0,26.2,-1.2,58.9,51.1,7.8,33.9,24.9,9.0,2.6,2.5,0.1,moderate +s3_shot_5i_10,88.0,14.2,1.2,4065,8.4,106.1,103.1,3.0,109.6,116.7,-7.1,3.5,13.6,-10.1,34.3,28.4,5.9,moderate +s3_shot_6i_49,71.2,7.7,16.1,2625,30.0,37.4,39.9,-2.5,77.3,70.3,7.0,39.9,30.4,9.5,4.2,4.5,-0.3,moderate +s3_shot_6i_39,61.0,6.1,10.3,3285,22.0,23.5,24.0,-0.5,53.7,47.3,6.4,30.2,23.3,6.9,2.1,2.1,0.0,moderate +s3_shot_6i_43,94.1,13.9,-4.7,4616,1.7,123.7,117.3,6.4,129.5,128.6,0.9,5.8,11.3,-5.5,43.1,35.0,8.1,moderate +s3_shot_pw_68,88.5,23.4,-0.1,6637,6.0,116.1,112.7,3.4,120.2,114.1,6.1,4.1,1.4,2.7,57.2,63.4,-6.2,moderate +wedge_shot_2,51.8,37.0,2.4,5652,9.1,43.0,49.1,-6.1,52.8,50.1,2.7,9.8,1.0,8.8,31.1,35.3,-4.2,moderate +s3_shot_7i_29,107.6,13.8,-6.0,3633,4.7,149.4,148.4,1.0,152.5,158.3,-5.8,3.1,9.9,-6.8,42.8,46.3,-3.5,moderate +s2_shot_22,123.3,14.0,-6.1,3104,10.0,191.1,185.4,5.7,199.0,195.5,3.5,7.9,10.1,-2.2,61.6,63.0,-1.4,moderate +s2_shot_24,121.5,14.5,-11.2,3173,-6.8,188.7,183.0,5.7,195.5,192.8,2.7,6.8,9.8,-3.0,63.0,64.6,-1.6,moderate +s3_shot_pw_67,81.7,28.1,6.3,6510,12.7,100.0,100.0,0.0,106.8,101.1,5.7,6.8,1.1,5.7,61.0,65.0,-4.0,moderate +s3_shot_9i_5,84.0,19.4,3.8,5352,11.5,100.1,102.7,-2.6,101.7,107.2,-5.5,1.6,4.5,-2.9,36.3,41.8,-5.5,moderate +s3_shot_driver_54,121.5,12.9,-5.3,3411,-10.0,183.6,178.2,5.4,188.7,188.7,0.0,5.1,10.5,-5.4,54.3,56.5,-2.2,moderate +wedge_test_shot2,54.7,26.8,1.6,4976,5.7,46.8,52.2,-5.4,60.8,57.7,3.1,14.0,5.5,8.5,22.4,24.4,-2.0,moderate +wedge_shot_1,48.7,29.0,-1.3,5684,11.1,37.5,42.6,-5.1,46.2,46.9,-0.7,8.7,4.3,4.4,18.9,21.3,-2.4,moderate +wedge_test_shot,66.4,23.2,-1.4,6449,7.1,65.6,70.6,-5.0,79.4,75.8,3.6,13.8,5.2,8.6,28.0,31.2,-3.2,moderate +wood2,118.8,14.5,-3.3,3026,11.2,180.4,175.6,4.8,186.8,186.1,0.7,6.4,10.5,-4.1,57.7,59.3,-1.6,moderate +s3_shot_pw_65,81.2,28.4,2.9,6959,9.4,98.4,98.5,-0.1,104.1,99.4,4.7,5.7,0.9,4.8,61.8,65.6,-3.8,pass +s2_shot_19,128.6,12.5,-8.4,2514,5.1,197.8,194.5,3.3,204.3,208.7,-4.4,6.5,14.2,-7.7,56.4,57.3,-0.9,moderate +s3_shot_7i_34,104.2,14.7,-4.6,4081,1.9,146.9,142.5,4.4,153.2,150.6,2.6,6.3,8.1,-1.8,51.3,48.2,3.1,moderate +p_wedge_shot_1,82.3,26.5,-3.1,4946,6.7,100.2,104.5,-4.3,109.5,107.3,2.2,9.3,2.8,6.5,55.1,60.5,-5.4,moderate +s3_shot_7i_27,93.7,17.1,-1.4,4612,2.6,124.1,122.3,1.8,132.6,128.3,4.3,8.5,6.0,2.5,54.0,46.0,8.0,pass +s3_shot_9i_8,92.2,21.9,-6.3,5042,0.7,121.3,122.9,-1.6,130.5,126.4,4.1,9.2,3.5,5.7,61.1,62.6,-1.5,pass +s3_shot_pw_69,74.1,23.6,0.2,5880,8.4,83.2,86.0,-2.8,84.9,88.8,-3.9,1.7,2.8,-1.1,37.4,41.2,-3.8,pass +s3_shot_6i_46,116.3,13.7,0.3,3008,10.7,171.1,167.3,3.8,175.8,179.3,-3.5,4.7,12.0,-7.3,50.1,51.6,-1.5,moderate +s2_shot_9,94.4,20.1,2.4,4020,16.3,123.7,126.5,-2.8,136.0,132.5,3.5,12.3,6.0,6.3,62.1,54.8,7.3,pass +s2_shot_13,95.2,19.6,-1.1,5610,12.2,127.1,125.3,1.8,131.7,128.7,3.0,4.6,3.4,1.2,52.5,58.4,-5.9,pass +flop_test_shot,68.0,45.0,0.5,12000,0.8,62.7,61.8,0.9,63.1,60.3,2.8,0.4,-1.5,1.9,69.2,76.8,-7.6,pass +s2_shot_16,94.1,19.1,-5.9,5291,5.0,124.7,124.3,0.4,130.3,128.1,2.2,5.6,3.8,1.8,52.1,55.3,-3.2,pass +s3_shot_7i_32,93.1,17.0,-1.0,3762,4.2,119.4,121.2,-1.8,127.6,129.8,-2.2,8.2,8.6,-0.4,45.6,42.5,3.1,pass +s2_shot_11,78.5,29.6,4.3,7350,10.7,91.3,93.0,-1.7,95.6,93.6,2.0,4.3,0.6,3.7,59.6,64.0,-4.4,pass +s3_shot_5i_17,56.5,10.0,24.1,5178,29.1,28.6,30.6,-2.0,45.0,46.9,-1.9,16.4,16.3,0.1,4.2,4.5,-0.3,pass +s3_shot_9i_9,90.1,22.1,-3.1,5351,1.2,116.9,118.1,-1.2,123.0,121.1,1.9,6.1,3.0,3.1,54.0,60.1,-6.1,pass +s2_shot_14,87.1,22.4,-2.0,5660,11.4,111.1,110.9,0.2,115.3,113.7,1.6,4.2,2.8,1.4,50.0,55.9,-5.9,pass +s3_shot_7i_33,92.4,17.0,-0.6,3852,2.8,118.1,119.7,-1.6,126.7,128.0,-1.3,8.6,8.3,0.3,46.7,42.0,4.7,pass +s3_shot_9i_7,83.0,22.5,5.3,7008,9.7,102.2,101.1,1.1,104.2,102.6,1.6,2.0,1.5,0.5,47.3,51.5,-4.2,pass +s3_shot_7i_30,90.2,17.6,-3.8,4508,-0.2,115.2,115.4,-0.2,123.2,121.7,1.5,8.0,6.3,1.7,48.6,43.1,5.5,pass +s3_shot_9i_3,90.1,21.7,2.8,5243,11.2,115.9,117.3,-1.4,121.8,120.7,1.1,5.9,3.4,2.5,52.4,57.7,-5.3,pass +s3_shot_7i_28,92.1,16.4,-3.6,4217,-0.4,119.1,117.9,1.2,126.8,125.6,1.2,7.7,7.7,0.0,48.9,40.6,8.3,pass +checked_test_shot,75.0,38.5,1.4,10701,5.7,77.0,77.6,-0.6,78.6,77.5,1.1,1.6,-0.1,1.7,70.8,79.5,-8.7,pass +drive_test_shot,150.0,12.5,1.5,2335,-9.9,245.0,244.0,1.0,256.8,256.0,0.8,11.8,12.0,-0.2,80.0,80.6,-0.6,pass diff --git a/assets/data/shot_session_2/history/iteration_013.json b/assets/data/shot_session_2/history/iteration_013.json new file mode 100644 index 0000000..298d9ec --- /dev/null +++ b/assets/data/shot_session_2/history/iteration_013.json @@ -0,0 +1,222 @@ +{ + "iteration": 13, + "timestamp": "2026-03-13T17:55:59.083236", + "profile_overrides": { + "Flight": { + "HighLaunchDragVlaStartDeg": 26.0, + "HighLaunchDragVlaFullDeg": 33.0, + "HighLaunchDragBoostMax": 1.2, + "SpinDragProgressiveCapSrStart": 0.33, + "SpinDragProgressiveCapSrEnd": 0.5, + "SpinDragProgressiveCapBoostMax": 0.25, + "HighReMidSpinGain": 16.0, + "MidSpinClBoostSrStart": 0.17, + "MidSpinClBoostSrEnd": 0.31, + "MidSpinClBoostMax": 0.5 + } + }, + "summary": { + "pass": 5, + "moderate": 4, + "severe": 9, + "no_reference": 9 + }, + "per_shot": { + "shot_1": { + "diff_carry_yd": null, + "diff_total_yd": null, + "diff_apex_ft": null, + "status": "pass", + "error_pattern": null + }, + "shot_10": { + "diff_carry_yd": 4.0, + "diff_total_yd": 10.7, + "diff_apex_ft": -5.8, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "shot_11": { + "diff_carry_yd": -1.7, + "diff_total_yd": 2.0, + "diff_apex_ft": -4.4, + "status": "pass", + "error_pattern": null + }, + "shot_12": { + "diff_carry_yd": 5.2, + "diff_total_yd": 9.5, + "diff_apex_ft": -5.1, + "status": "moderate", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "shot_13": { + "diff_carry_yd": 1.8, + "diff_total_yd": 3.0, + "diff_apex_ft": -5.9, + "status": "pass", + "error_pattern": null + }, + "shot_14": { + "diff_carry_yd": 0.2, + "diff_total_yd": 1.6, + "diff_apex_ft": -5.9, + "status": "pass", + "error_pattern": null + }, + "shot_15": { + "diff_carry_yd": -0.6, + "diff_total_yd": -12.3, + "diff_apex_ft": -1.9, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_SHORT" + }, + "shot_16": { + "diff_carry_yd": 0.4, + "diff_total_yd": 2.2, + "diff_apex_ft": -3.2, + "status": "pass", + "error_pattern": null + }, + "shot_17": { + "diff_carry_yd": 7.2, + "diff_total_yd": 9.2, + "diff_apex_ft": -3.6, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "shot_18": { + "diff_carry_yd": 5.1, + "diff_total_yd": 16.6, + "diff_apex_ft": 3.1, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "shot_19": { + "diff_carry_yd": 3.3, + "diff_total_yd": -4.4, + "diff_apex_ft": -0.9, + "status": "moderate", + "error_pattern": "CARRY_TOO_LONG" + }, + "shot_2": { + "diff_carry_yd": null, + "diff_total_yd": null, + "diff_apex_ft": null, + "status": "pass", + "error_pattern": null + }, + "shot_20": { + "diff_carry_yd": 7.2, + "diff_total_yd": 11.1, + "diff_apex_ft": -1.8, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "shot_21": { + "diff_carry_yd": 5.8, + "diff_total_yd": 28.8, + "diff_apex_ft": 1.8, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "shot_22": { + "diff_carry_yd": 5.7, + "diff_total_yd": 3.5, + "diff_apex_ft": -1.4, + "status": "moderate", + "error_pattern": "CARRY_TOO_LONG" + }, + "shot_23": { + "diff_carry_yd": 4.2, + "diff_total_yd": -18.9, + "diff_apex_ft": 0.1, + "status": "severe", + "error_pattern": "CARRY_TOO_LONG" + }, + "shot_24": { + "diff_carry_yd": 5.7, + "diff_total_yd": 2.7, + "diff_apex_ft": -1.6, + "status": "moderate", + "error_pattern": "CARRY_TOO_LONG" + }, + "shot_25": { + "diff_carry_yd": null, + "diff_total_yd": null, + "diff_apex_ft": null, + "status": "pass", + "error_pattern": null + }, + "shot_26": { + "diff_carry_yd": 2.6, + "diff_total_yd": 23.1, + "diff_apex_ft": 24.2, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_LONG" + }, + "shot_27": { + "diff_carry_yd": 3.6, + "diff_total_yd": 13.8, + "diff_apex_ft": 5.0, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "shot_3": { + "diff_carry_yd": null, + "diff_total_yd": null, + "diff_apex_ft": null, + "status": "pass", + "error_pattern": null + }, + "shot_4": { + "diff_carry_yd": null, + "diff_total_yd": null, + "diff_apex_ft": null, + "status": "pass", + "error_pattern": null + }, + "shot_5": { + "diff_carry_yd": null, + "diff_total_yd": null, + "diff_apex_ft": null, + "status": "pass", + "error_pattern": null + }, + "shot_6": { + "diff_carry_yd": null, + "diff_total_yd": null, + "diff_apex_ft": null, + "status": "pass", + "error_pattern": null + }, + "shot_7": { + "diff_carry_yd": null, + "diff_total_yd": null, + "diff_apex_ft": null, + "status": "pass", + "error_pattern": null + }, + "shot_8": { + "diff_carry_yd": null, + "diff_total_yd": null, + "diff_apex_ft": null, + "status": "pass", + "error_pattern": null + }, + "shot_9": { + "diff_carry_yd": -2.8, + "diff_total_yd": 3.5, + "diff_apex_ft": 7.3, + "status": "pass", + "error_pattern": null + } + }, + "regressions": [], + "conflicts": [ + "Bounce.FlightSpinFactorMin", + "Bounce.FlightSpinFactorDivisor", + "Rollout.HighSpinMultiplierMax", + "Bounce.RolloutHighSpinRetention" + ] +} diff --git a/assets/data/shot_session_3/flightscope.csv b/assets/data/shot_session_3/flightscope.csv new file mode 100644 index 0000000..ac3422e --- /dev/null +++ b/assets/data/shot_session_3/flightscope.csv @@ -0,0 +1,70 @@ +shot_name,filename,speed_mph,vla_deg,hla_deg,total_spin_rpm,spin_axis_deg,backspin_rpm,sidespin_rpm,carry_yd,total_yd,rollout_yd,apex_ft +shot_3w_18,shot_3w_18.json,47.91,45.81,33.98,7491.0,30.00,6487.4,3745.5,0.0,0.0,0.0,0.0 +shot_3w_19,shot_3w_19.json,121.33,5.59,-4.84,1661.5,-11.89,1625.9,-342.2,120.6,165.8,45.2,12.2 +shot_3w_20,shot_3w_20.json,116.03,4.40,2.29,2026.0,9.97,1995.4,350.7,0.0,0.0,0.0,0.0 +shot_3w_21,shot_3w_21.json,119.40,5.31,-3.43,1759.7,-10.46,1730.5,-319.5,114.6,160.5,45.9,10.9 +shot_3w_22,shot_3w_22.json,108.89,5.62,-7.25,2500.8,-1.78,2499.6,-77.5,103.2,141.3,38.1,10.5 +shot_3w_23,shot_3w_23.json,115.83,8.90,-0.78,2804.3,2.19,2802.2,107.3,147.7,170.9,23.2,28.0 +shot_3w_24,shot_3w_24.json,123.42,6.29,-5.42,2751.6,-13.27,2678.1,-631.8,145.9,176.7,30.8,19.8 +shot_5i_10,shot_5i_10.json,87.96,14.22,1.21,4064.7,8.41,4021.0,594.4,103.1,116.7,13.6,28.4 +shot_5i_11,shot_5i_11.json,90.59,14.45,-0.21,3360.4,7.80,3329.3,456.2,108.8,124.1,15.3,29.8 +shot_5i_12,shot_5i_12.json,74.19,10.23,-1.67,3321.4,15.75,3196.7,901.5,58.4,81.9,23.5,9.4 +shot_5i_13,shot_5i_13.json,75.04,8.01,2.53,3921.4,3.42,3914.4,234.0,53.9,78.9,25.0,6.8 +shot_5i_14,shot_5i_14.json,87.69,4.53,-7.68,3390.3,1.80,3388.6,106.5,0.0,0.0,0.0,0.0 +shot_5i_15,shot_5i_15.json,86.90,9.35,-4.02,2508.9,-4.94,2499.6,-216.2,78.6,106.6,28.0,12.1 +shot_5i_16,shot_5i_16.json,97.99,9.13,-2.08,3775.9,1.68,3774.3,110.7,109.1,130.0,20.9,19.7 +shot_5i_17,shot_5i_17.json,56.46,9.97,24.15,5178.3,29.12,4523.9,2519.7,30.6,46.9,16.3,4.5 +shot_6i_35,shot_6i_35.json,80.55,15.35,-1.30,4667.1,-0.03,4667.1,-2.8,90.0,101.5,11.5,26.4 +shot_6i_36,shot_6i_36.json,78.86,10.40,16.08,4166.0,25.12,3771.9,1768.7,67.8,89.1,21.3,11.8 +shot_6i_37,shot_6i_37.json,82.57,10.16,11.01,3041.1,25.35,2748.4,1301.8,71.5,97.2,25.7,11.8 +shot_6i_38,shot_6i_38.json,79.12,13.35,3.04,3186.9,11.59,3121.9,640.2,79.2,97.5,18.3,18.0 +shot_6i_39,shot_6i_39.json,60.98,6.14,10.35,3284.8,22.03,3044.9,1232.2,24.0,47.3,23.3,2.1 +shot_6i_40,shot_6i_40.json,62.11,6.80,27.01,2768.0,30.00,2397.2,1384.0,26.2,51.1,24.9,2.5 +shot_6i_41,shot_6i_41.json,82.53,9.88,-2.28,2620.2,13.56,2547.1,614.5,71.3,97.9,26.6,11.3 +shot_6i_42,shot_6i_42.json,77.19,13.14,-3.42,4057.2,4.14,4046.6,293.2,76.6,92.9,16.3,17.5 +shot_6i_43,shot_6i_43.json,94.06,13.88,-4.68,4616.2,1.70,4614.2,137.0,117.3,128.6,11.3,35.0 +shot_6i_44,shot_6i_44.json,114.96,9.46,-6.67,2314.5,15.10,2234.6,602.8,142.3,168.2,25.9,26.6 +shot_6i_45,shot_6i_45.json,109.32,6.42,-9.00,2509.9,-10.87,2464.9,-473.5,109.6,145.4,35.8,12.9 +shot_6i_46,shot_6i_46.json,116.33,13.65,0.34,3007.9,10.67,2955.8,557.1,167.3,179.3,12.0,51.6 +shot_6i_47,shot_6i_47.json,99.48,14.78,-2.86,4810.7,4.69,4794.6,393.7,131.2,137.7,6.5,45.0 +shot_6i_48,shot_6i_48.json,101.73,15.23,-3.03,4631.0,4.26,4618.2,344.4,137.1,143.5,6.4,48.9 +shot_6i_49,shot_6i_49.json,71.25,7.70,16.05,2624.7,30.00,2273.0,1312.3,39.9,70.3,30.4,4.5 +shot_6i_50,shot_6i_50.json,82.80,14.85,-1.42,3783.4,2.81,3778.8,185.4,93.2,107.4,14.2,25.6 +shot_7i_25,shot_7i_25.json,83.34,13.18,2.98,3409.5,17.79,3246.5,1041.7,86.9,104.8,17.9,20.1 +shot_7i_26,shot_7i_26.json,73.37,10.85,15.40,3560.9,30.00,3083.8,1780.4,56.6,79.3,22.7,9.6 +shot_7i_27,shot_7i_27.json,93.74,17.06,-1.45,4611.6,2.63,4606.7,211.8,122.3,128.3,6.0,46.0 +shot_7i_28,shot_7i_28.json,92.09,16.41,-3.60,4216.7,-0.44,4216.6,-32.4,117.9,125.6,7.7,40.6 +shot_7i_29,shot_7i_29.json,107.59,13.82,-6.05,3633.3,4.72,3621.0,298.7,148.4,158.3,9.9,46.3 +shot_7i_30,shot_7i_30.json,90.17,17.56,-3.83,4508.5,-0.21,4508.5,-16.5,115.4,121.7,6.3,43.1 +shot_7i_31,shot_7i_31.json,76.36,17.52,-0.54,5122.2,1.84,5119.5,164.7,85.0,94.5,9.5,28.4 +shot_7i_32,shot_7i_32.json,93.10,16.96,-1.03,3762.5,4.20,3752.4,275.6,121.2,129.8,8.6,42.5 +shot_7i_33,shot_7i_33.json,92.36,16.96,-0.58,3851.7,2.81,3847.1,188.9,119.7,128.0,8.3,42.0 +shot_7i_34,shot_7i_34.json,104.19,14.67,-4.63,4081.2,1.90,4079.0,135.0,142.5,150.6,8.1,48.2 +shot_9i_1,shot_9i_1.json,88.98,15.10,-0.50,3563.2,11.26,3494.6,695.8,106.7,120.8,14.1,30.8 +shot_9i_2,shot_9i_2.json,71.29,23.93,5.51,4085.5,8.31,4042.7,590.2,82.1,87.4,5.3,36.8 +shot_9i_3,shot_9i_3.json,90.11,21.67,2.80,5243.0,11.20,5143.3,1018.1,117.3,120.7,3.4,57.7 +shot_9i_4,shot_9i_4.json,95.73,4.75,-6.78,2312.1,6.03,2299.3,242.8,0.0,0.0,0.0,0.0 +shot_9i_5,shot_9i_5.json,84.02,19.37,3.82,5352.1,11.48,5245.0,1065.2,102.7,107.2,4.5,41.8 +shot_9i_6,shot_9i_6.json,94.70,0.00,3.68,2200.5,28.95,1925.4,1065.3,0.0,0.0,0.0,0.0 +shot_9i_7,shot_9i_7.json,83.03,22.51,5.26,7008.5,9.70,6908.3,1181.2,101.1,102.6,1.5,51.5 +shot_9i_8,shot_9i_8.json,92.21,21.95,-6.31,5042.3,0.73,5041.8,64.2,122.9,126.4,3.5,62.6 +shot_9i_9,shot_9i_9.json,90.06,22.14,-3.09,5351.1,1.21,5349.9,113.3,118.1,121.1,3.0,60.1 +shot_driver_51,shot_driver_51.json,116.17,21.74,2.17,6409.0,3.23,6398.8,360.7,162.9,164.3,1.4,108.7 +shot_driver_52,shot_driver_52.json,102.11,31.33,3.09,8442.2,6.26,8391.8,921.1,124.5,124.1,-0.4,119.3 +shot_driver_53,shot_driver_53.json,97.23,30.63,2.23,8925.8,5.99,8877.1,931.1,117.6,117.1,-0.5,105.8 +shot_driver_54,shot_driver_54.json,121.50,12.88,-5.26,3410.9,-9.97,3359.4,-590.5,178.2,188.7,10.5,56.5 +shot_driver_55,shot_driver_55.json,117.48,7.48,-8.33,2150.0,-27.19,1912.4,-982.4,125.6,161.8,36.2,17.2 +shot_driver_56,shot_driver_56.json,118.70,17.12,-1.80,4553.8,2.81,4548.4,222.9,176.6,180.9,4.3,83.2 +shot_driver_57,shot_driver_57.json,120.93,14.10,-5.16,1544.1,-7.96,1529.2,-213.7,177.6,197.0,19.4,50.9 +shot_driver_58,shot_driver_58.json,119.27,23.59,2.48,7093.4,3.26,7081.9,403.5,163.2,163.9,0.7,125.7 +shot_driver_59,shot_driver_59.json,80.96,44.91,8.87,6735.0,12.36,6578.8,1442.0,83.7,83.2,-0.5,107.8 +shot_driver_60,shot_driver_60.json,107.39,11.67,-8.62,3268.6,-14.80,3160.1,-835.0,138.5,153.8,15.3,34.0 +shot_pw_61,shot_pw_61.json,31.89,25.35,-1.26,3867.9,0.00,3867.9,0.0,0.0,0.0,0.0,0.0 +shot_pw_62,shot_pw_62.json,39.63,23.69,0.60,3843.5,2.08,3840.9,139.6,0.0,0.0,0.0,0.0 +shot_pw_63,shot_pw_63.json,37.15,24.01,1.83,3913.8,0.00,3913.8,0.0,0.0,0.0,0.0,0.0 +shot_pw_64,shot_pw_64.json,69.63,28.57,0.16,5327.2,5.10,5306.2,473.4,80.1,82.4,2.3,46.4 +shot_pw_65,shot_pw_65.json,81.25,28.38,2.89,6959.4,9.38,6866.3,1134.7,98.5,99.4,0.9,65.6 +shot_pw_66,shot_pw_66.json,75.71,27.32,-1.17,6605.0,3.99,6589.0,460.1,89.7,90.8,1.1,53.5 +shot_pw_67,shot_pw_67.json,81.66,28.12,6.34,6509.6,12.74,6349.4,1435.1,100.0,101.1,1.1,65.0 +shot_pw_68,shot_pw_68.json,88.55,23.37,-0.05,6637.4,6.04,6600.5,698.8,112.7,114.1,1.4,63.4 +shot_pw_69,shot_pw_69.json,74.06,23.61,0.18,5880.4,8.45,5816.5,864.4,86.0,88.8,2.8,41.2 diff --git a/assets/data/shot_session_3/flightscope_reference.json b/assets/data/shot_session_3/flightscope_reference.json new file mode 100644 index 0000000..3692836 --- /dev/null +++ b/assets/data/shot_session_3/flightscope_reference.json @@ -0,0 +1,866 @@ +{ + "shot_3w_18": { + "filename": "shot_3w_18.json", + "speed_mph": 47.910438537597656, + "vla_deg": 45.80533981323242, + "hla_deg": 33.98442840576172, + "total_spin_rpm": 7490.96484375, + "spin_axis_deg": 30, + "_status": "failed", + "_reason": "submit_not_clickable" + }, + "shot_3w_19": { + "filename": "shot_3w_19.json", + "speed_mph": 121.3264389038086, + "vla_deg": 5.5909037590026855, + "hla_deg": -4.835934162139893, + "total_spin_rpm": 1661.5179443359375, + "spin_axis_deg": -11.886557579040527, + "carry_yd": 120.6, + "roll_yd": 45.2, + "total_yd": 165.8, + "lateral_yd": 14.1, + "time_s": 2.6, + "apex_ft": 12.2 + }, + "shot_3w_21": { + "filename": "shot_3w_21.json", + "speed_mph": 119.39741516113281, + "vla_deg": 5.3101420402526855, + "hla_deg": -3.432490348815918, + "total_spin_rpm": 1759.7186279296875, + "spin_axis_deg": -10.459320068359375, + "carry_yd": 114.6, + "roll_yd": 45.9, + "total_yd": 160.5, + "lateral_yd": 10.1, + "time_s": 2.5, + "apex_ft": 10.9 + }, + "shot_3w_22": { + "filename": "shot_3w_22.json", + "speed_mph": 108.89000701904297, + "vla_deg": 5.6167826652526855, + "hla_deg": -7.248828887939453, + "total_spin_rpm": 2500.794189453125, + "spin_axis_deg": -1.7757200002670288, + "carry_yd": 103.2, + "roll_yd": 38.1, + "total_yd": 141.3, + "lateral_yd": 13.5, + "time_s": 2.5, + "apex_ft": 10.5 + }, + "shot_3w_23": { + "filename": "shot_3w_23.json", + "speed_mph": 115.83103942871094, + "vla_deg": 8.904770851135254, + "hla_deg": -0.7794083952903748, + "total_spin_rpm": 2804.254638671875, + "spin_axis_deg": 2.1936216354370117, + "carry_yd": 147.7, + "roll_yd": 23.3, + "total_yd": 170.9, + "lateral_yd": 3.6, + "time_s": 3.8, + "apex_ft": 28.0 + }, + "shot_3w_24": { + "filename": "shot_3w_24.json", + "speed_mph": 123.41571044921875, + "vla_deg": 6.293036937713623, + "hla_deg": -5.422914028167725, + "total_spin_rpm": 2751.643310546875, + "spin_axis_deg": -13.27297592163086, + "carry_yd": 145.9, + "roll_yd": 30.8, + "total_yd": 176.7, + "lateral_yd": 21.8, + "time_s": 3.4, + "apex_ft": 19.8 + }, + "shot_5i_10": { + "filename": "shot_5i_10.json", + "speed_mph": 87.95623779296875, + "vla_deg": 14.219791412353516, + "hla_deg": 1.2086073160171509, + "total_spin_rpm": 4064.680419921875, + "spin_axis_deg": 8.409174919128418, + "carry_yd": 103.1, + "roll_yd": 13.6, + "total_yd": 116.7, + "lateral_yd": 6.0, + "time_s": 3.5, + "apex_ft": 28.4 + }, + "shot_5i_11": { + "filename": "shot_5i_11.json", + "speed_mph": 90.59127044677734, + "vla_deg": 14.447543144226074, + "hla_deg": -0.2112649530172348, + "total_spin_rpm": 3360.378173828125, + "spin_axis_deg": 7.803199768066406, + "carry_yd": 108.8, + "roll_yd": 15.3, + "total_yd": 124.1, + "lateral_yd": 4.0, + "time_s": 3.5, + "apex_ft": 29.8 + }, + "shot_5i_12": { + "filename": "shot_5i_12.json", + "speed_mph": 74.1854476928711, + "vla_deg": 10.231616020202637, + "hla_deg": -1.6741827726364136, + "total_spin_rpm": 3321.373046875, + "spin_axis_deg": 15.748629570007324, + "carry_yd": 58.4, + "roll_yd": 23.5, + "total_yd": 81.9, + "lateral_yd": 3.9, + "time_s": 1.9, + "apex_ft": 9.4 + }, + "shot_5i_13": { + "filename": "shot_5i_13.json", + "speed_mph": 75.03592681884766, + "vla_deg": 8.008757591247559, + "hla_deg": 2.528409004211426, + "total_spin_rpm": 3921.38916015625, + "spin_axis_deg": 3.4204583168029785, + "carry_yd": 53.9, + "roll_yd": 25.0, + "total_yd": 78.9, + "lateral_yd": 2.8, + "time_s": 1.7, + "apex_ft": 6.8 + }, + "shot_5i_15": { + "filename": "shot_5i_15.json", + "speed_mph": 86.89714813232422, + "vla_deg": 9.352163314819336, + "hla_deg": -4.017830848693848, + "total_spin_rpm": 2508.89990234375, + "spin_axis_deg": -4.943783283233643, + "carry_yd": 78.6, + "roll_yd": 28.0, + "total_yd": 106.6, + "lateral_yd": 6.5, + "time_s": 2.3, + "apex_ft": 12.1 + }, + "shot_5i_16": { + "filename": "shot_5i_16.json", + "speed_mph": 97.99386596679688, + "vla_deg": 9.131645202636719, + "hla_deg": -2.0793614387512207, + "total_spin_rpm": 3775.940673828125, + "spin_axis_deg": 1.680374264717102, + "carry_yd": 109.1, + "roll_yd": 21.0, + "total_yd": 130.0, + "lateral_yd": 4.8, + "time_s": 3.1, + "apex_ft": 19.7 + }, + "shot_5i_17": { + "filename": "shot_5i_17.json", + "speed_mph": 56.45970916748047, + "vla_deg": 9.96929931640625, + "hla_deg": 24.147518157958984, + "total_spin_rpm": 5178.31494140625, + "spin_axis_deg": 29.116588592529297, + "carry_yd": 30.6, + "roll_yd": 16.3, + "total_yd": 46.9, + "lateral_yd": 13.8, + "time_s": 1.3, + "apex_ft": 4.5 + }, + "shot_6i_35": { + "filename": "shot_6i_35.json", + "speed_mph": 80.54517364501953, + "vla_deg": 15.354228973388672, + "hla_deg": -1.2998002767562866, + "total_spin_rpm": 4667.10546875, + "spin_axis_deg": -0.03472926467657089, + "carry_yd": 90.0, + "roll_yd": 11.5, + "total_yd": 101.5, + "lateral_yd": 2.0, + "time_s": 3.3, + "apex_ft": 26.4 + }, + "shot_6i_36": { + "filename": "shot_6i_36.json", + "speed_mph": 78.85662078857422, + "vla_deg": 10.401652336120605, + "hla_deg": 16.080949783325195, + "total_spin_rpm": 4165.97021484375, + "spin_axis_deg": 25.122739791870117, + "carry_yd": 67.8, + "roll_yd": 21.3, + "total_yd": 89.1, + "lateral_yd": 23.5, + "time_s": 2.2, + "apex_ft": 11.8 + }, + "shot_6i_37": { + "filename": "shot_6i_37.json", + "speed_mph": 82.57211303710938, + "vla_deg": 10.160353660583496, + "hla_deg": 11.010269165039062, + "total_spin_rpm": 3041.13916015625, + "spin_axis_deg": 25.345022201538086, + "carry_yd": 71.5, + "roll_yd": 25.8, + "total_yd": 97.2, + "lateral_yd": 18.2, + "time_s": 2.2, + "apex_ft": 11.8 + }, + "shot_6i_38": { + "filename": "shot_6i_38.json", + "speed_mph": 79.1196060180664, + "vla_deg": 13.352584838867188, + "hla_deg": 3.0407917499542236, + "total_spin_rpm": 3186.907470703125, + "spin_axis_deg": 11.58816909790039, + "carry_yd": 79.2, + "roll_yd": 18.4, + "total_yd": 97.5, + "lateral_yd": 7.0, + "time_s": 2.7, + "apex_ft": 18.0 + }, + "shot_6i_39": { + "filename": "shot_6i_39.json", + "speed_mph": 60.977989196777344, + "vla_deg": 6.142360210418701, + "hla_deg": 10.34990119934082, + "total_spin_rpm": 3284.7568359375, + "spin_axis_deg": 22.03131675720215, + "carry_yd": 24.0, + "roll_yd": 23.2, + "total_yd": 47.3, + "lateral_yd": 4.8, + "time_s": 0.9, + "apex_ft": 2.1 + }, + "shot_6i_40": { + "filename": "shot_6i_40.json", + "speed_mph": 62.1090087890625, + "vla_deg": 6.798625946044922, + "hla_deg": 27.012741088867188, + "total_spin_rpm": 2768.042236328125, + "spin_axis_deg": 30, + "carry_yd": 26.2, + "roll_yd": 25.0, + "total_yd": 51.1, + "lateral_yd": 12.6, + "time_s": 0.9, + "apex_ft": 2.5 + }, + "shot_6i_41": { + "filename": "shot_6i_41.json", + "speed_mph": 82.52630615234375, + "vla_deg": 9.875736236572266, + "hla_deg": -2.284115791320801, + "total_spin_rpm": 2620.150146484375, + "spin_axis_deg": 13.564412117004395, + "carry_yd": 71.3, + "roll_yd": 26.6, + "total_yd": 97.9, + "lateral_yd": 5.2, + "time_s": 2.2, + "apex_ft": 11.3 + }, + "shot_6i_42": { + "filename": "shot_6i_42.json", + "speed_mph": 77.19420623779297, + "vla_deg": 13.144353866577148, + "hla_deg": -3.420778512954712, + "total_spin_rpm": 4057.180908203125, + "spin_axis_deg": 4.143872261047363, + "carry_yd": 76.6, + "roll_yd": 16.4, + "total_yd": 92.9, + "lateral_yd": 5.6, + "time_s": 2.7, + "apex_ft": 17.5 + }, + "shot_6i_43": { + "filename": "shot_6i_43.json", + "speed_mph": 94.06039428710938, + "vla_deg": 13.880871772766113, + "hla_deg": -4.6828203201293945, + "total_spin_rpm": 4616.18994140625, + "spin_axis_deg": 1.7003158330917358, + "carry_yd": 117.3, + "roll_yd": 11.2, + "total_yd": 128.6, + "lateral_yd": 10.7, + "time_s": 3.9, + "apex_ft": 35.0 + }, + "shot_6i_44": { + "filename": "shot_6i_44.json", + "speed_mph": 114.95743560791016, + "vla_deg": 9.460525512695312, + "hla_deg": -6.673015594482422, + "total_spin_rpm": 2314.4580078125, + "spin_axis_deg": 15.0968599319458, + "carry_yd": 142.3, + "roll_yd": 26.0, + "total_yd": 168.2, + "lateral_yd": 25.1, + "time_s": 3.6, + "apex_ft": 26.6 + }, + "shot_6i_45": { + "filename": "shot_6i_45.json", + "speed_mph": 109.31747436523438, + "vla_deg": 6.417369365692139, + "hla_deg": -8.999531745910645, + "total_spin_rpm": 2509.944091796875, + "spin_axis_deg": -10.873051643371582, + "carry_yd": 109.6, + "roll_yd": 35.8, + "total_yd": 145.4, + "lateral_yd": 20.9, + "time_s": 2.6, + "apex_ft": 12.9 + }, + "shot_6i_46": { + "filename": "shot_6i_46.json", + "speed_mph": 116.33138275146484, + "vla_deg": 13.646748542785645, + "hla_deg": 0.33850419521331787, + "total_spin_rpm": 3007.8779296875, + "spin_axis_deg": 10.673794746398926, + "carry_yd": 167.3, + "roll_yd": 12.0, + "total_yd": 179.3, + "lateral_yd": 10.8, + "time_s": 4.8, + "apex_ft": 51.6 + }, + "shot_6i_47": { + "filename": "shot_6i_47.json", + "speed_mph": 99.47631072998047, + "vla_deg": 14.783981323242188, + "hla_deg": -2.863499402999878, + "total_spin_rpm": 4810.73583984375, + "spin_axis_deg": 4.693967342376709, + "carry_yd": 131.2, + "roll_yd": 6.5, + "total_yd": 137.7, + "lateral_yd": 10.3, + "time_s": 4.4, + "apex_ft": 45.0 + }, + "shot_6i_48": { + "filename": "shot_6i_48.json", + "speed_mph": 101.73347473144531, + "vla_deg": 15.22943115234375, + "hla_deg": -3.0343129634857178, + "total_spin_rpm": 4630.994140625, + "spin_axis_deg": 4.2645134925842285, + "carry_yd": 137.1, + "roll_yd": 6.4, + "total_yd": 143.5, + "lateral_yd": 10.8, + "time_s": 4.6, + "apex_ft": 48.9 + }, + "shot_6i_49": { + "filename": "shot_6i_49.json", + "speed_mph": 71.25074768066406, + "vla_deg": 7.704961776733398, + "hla_deg": 16.047260284423828, + "total_spin_rpm": 2624.658447265625, + "spin_axis_deg": 30, + "carry_yd": 39.9, + "roll_yd": 30.4, + "total_yd": 70.3, + "lateral_yd": 12.6, + "time_s": 1.3, + "apex_ft": 4.5 + }, + "shot_6i_50": { + "filename": "shot_6i_50.json", + "speed_mph": 82.80308532714844, + "vla_deg": 14.85204792022705, + "hla_deg": -1.4181873798370361, + "total_spin_rpm": 3783.392578125, + "spin_axis_deg": 2.8091838359832764, + "carry_yd": 93.2, + "roll_yd": 14.2, + "total_yd": 107.4, + "lateral_yd": 3.3, + "time_s": 3.2, + "apex_ft": 25.6 + }, + "shot_7i_25": { + "filename": "shot_7i_25.json", + "speed_mph": 83.34427642822266, + "vla_deg": 13.178397178649902, + "hla_deg": 2.9794626235961914, + "total_spin_rpm": 3409.548828125, + "spin_axis_deg": 17.788898468017578, + "carry_yd": 86.9, + "roll_yd": 18.0, + "total_yd": 104.8, + "lateral_yd": 9.8, + "time_s": 2.8, + "apex_ft": 20.1 + }, + "shot_7i_26": { + "filename": "shot_7i_26.json", + "speed_mph": 73.36651611328125, + "vla_deg": 10.84724235534668, + "hla_deg": 15.397870063781738, + "total_spin_rpm": 3560.867919921875, + "spin_axis_deg": 30, + "carry_yd": 56.6, + "roll_yd": 22.7, + "total_yd": 79.3, + "lateral_yd": 18.7, + "time_s": 1.9, + "apex_ft": 9.6 + }, + "shot_7i_27": { + "filename": "shot_7i_27.json", + "speed_mph": 93.73928833007812, + "vla_deg": 17.06036376953125, + "hla_deg": -1.4469140768051147, + "total_spin_rpm": 4611.6044921875, + "spin_axis_deg": 2.632032632827759, + "carry_yd": 122.3, + "roll_yd": 6.0, + "total_yd": 128.3, + "lateral_yd": 4.8, + "time_s": 4.3, + "apex_ft": 46.0 + }, + "shot_7i_28": { + "filename": "shot_7i_28.json", + "speed_mph": 92.08656311035156, + "vla_deg": 16.409210205078125, + "hla_deg": -3.5975778102874756, + "total_spin_rpm": 4216.72216796875, + "spin_axis_deg": -0.4406474828720093, + "carry_yd": 117.9, + "roll_yd": 7.8, + "total_yd": 125.6, + "lateral_yd": 7.6, + "time_s": 4.1, + "apex_ft": 40.6 + }, + "shot_7i_29": { + "filename": "shot_7i_29.json", + "speed_mph": 107.58966064453125, + "vla_deg": 13.82080078125, + "hla_deg": -6.054408550262451, + "total_spin_rpm": 3633.266357421875, + "spin_axis_deg": 4.716331481933594, + "carry_yd": 148.4, + "roll_yd": 9.9, + "total_yd": 158.3, + "lateral_yd": 19.7, + "time_s": 4.5, + "apex_ft": 46.3 + }, + "shot_7i_30": { + "filename": "shot_7i_30.json", + "speed_mph": 90.17376708984375, + "vla_deg": 17.55555534362793, + "hla_deg": -3.8281779289245605, + "total_spin_rpm": 4508.52734375, + "spin_axis_deg": -0.20976150035858154, + "carry_yd": 115.4, + "roll_yd": 6.3, + "total_yd": 121.7, + "lateral_yd": 7.8, + "time_s": 4.2, + "apex_ft": 43.1 + }, + "shot_7i_31": { + "filename": "shot_7i_31.json", + "speed_mph": 76.35610961914062, + "vla_deg": 17.519079208374023, + "hla_deg": -0.5438334345817566, + "total_spin_rpm": 5122.1640625, + "spin_axis_deg": 1.8421508073806763, + "carry_yd": 85.0, + "roll_yd": 9.5, + "total_yd": 94.5, + "lateral_yd": 1.4, + "time_s": 3.3, + "apex_ft": 28.4 + }, + "shot_7i_32": { + "filename": "shot_7i_32.json", + "speed_mph": 93.09901428222656, + "vla_deg": 16.958356857299805, + "hla_deg": -1.0266743898391724, + "total_spin_rpm": 3762.546875, + "spin_axis_deg": 4.201261043548584, + "carry_yd": 121.2, + "roll_yd": 8.6, + "total_yd": 129.8, + "lateral_yd": 4.7, + "time_s": 4.1, + "apex_ft": 42.5 + }, + "shot_7i_33": { + "filename": "shot_7i_33.json", + "speed_mph": 92.35597229003906, + "vla_deg": 16.959016799926758, + "hla_deg": -0.5763412117958069, + "total_spin_rpm": 3851.744873046875, + "spin_axis_deg": 2.811332941055298, + "carry_yd": 119.7, + "roll_yd": 8.3, + "total_yd": 128.0, + "lateral_yd": 3.0, + "time_s": 4.1, + "apex_ft": 42.0 + }, + "shot_7i_34": { + "filename": "shot_7i_34.json", + "speed_mph": 104.19499206542969, + "vla_deg": 14.670660018920898, + "hla_deg": -4.631562232971191, + "total_spin_rpm": 4081.22021484375, + "spin_axis_deg": 1.8956630229949951, + "carry_yd": 142.5, + "roll_yd": 8.1, + "total_yd": 150.6, + "lateral_yd": 13.0, + "time_s": 4.6, + "apex_ft": 48.2 + }, + "shot_9i_1": { + "filename": "shot_9i_1.json", + "speed_mph": 88.98261260986328, + "vla_deg": 15.103304862976074, + "hla_deg": -0.5036899447441101, + "total_spin_rpm": 3563.205078125, + "spin_axis_deg": 11.261311531066895, + "carry_yd": 106.7, + "roll_yd": 14.1, + "total_yd": 120.8, + "lateral_yd": 6.1, + "time_s": 3.5, + "apex_ft": 30.8 + }, + "shot_9i_2": { + "filename": "shot_9i_2.json", + "speed_mph": 71.28638458251953, + "vla_deg": 23.930543899536133, + "hla_deg": 5.505329608917236, + "total_spin_rpm": 4085.5244140625, + "spin_axis_deg": 8.305668830871582, + "carry_yd": 82.1, + "roll_yd": 5.3, + "total_yd": 87.4, + "lateral_yd": 10.6, + "time_s": 3.6, + "apex_ft": 36.8 + }, + "shot_9i_3": { + "filename": "shot_9i_3.json", + "speed_mph": 90.10971069335938, + "vla_deg": 21.67161750793457, + "hla_deg": 2.8021600246429443, + "total_spin_rpm": 5243.0498046875, + "spin_axis_deg": 11.196942329406738, + "carry_yd": 117.3, + "roll_yd": 3.4, + "total_yd": 120.7, + "lateral_yd": 13.7, + "time_s": 4.6, + "apex_ft": 57.7 + }, + "shot_9i_5": { + "filename": "shot_9i_5.json", + "speed_mph": 84.02252960205078, + "vla_deg": 19.373619079589844, + "hla_deg": 3.8161818981170654, + "total_spin_rpm": 5352.05859375, + "spin_axis_deg": 11.480364799499512, + "carry_yd": 102.7, + "roll_yd": 4.6, + "total_yd": 107.2, + "lateral_yd": 13.0, + "time_s": 4.0, + "apex_ft": 41.8 + }, + "shot_9i_7": { + "filename": "shot_9i_7.json", + "speed_mph": 83.02562713623047, + "vla_deg": 22.507925033569336, + "hla_deg": 5.2613043785095215, + "total_spin_rpm": 7008.54296875, + "spin_axis_deg": 9.702858924865723, + "carry_yd": 101.1, + "roll_yd": 1.5, + "total_yd": 102.6, + "lateral_yd": 15.2, + "time_s": 4.3, + "apex_ft": 51.5 + }, + "shot_9i_8": { + "filename": "shot_9i_8.json", + "speed_mph": 92.2085189819336, + "vla_deg": 21.950105667114258, + "hla_deg": -6.307239055633545, + "total_spin_rpm": 5042.2568359375, + "spin_axis_deg": 0.7292595505714417, + "carry_yd": 122.9, + "roll_yd": 3.4, + "total_yd": 126.4, + "lateral_yd": 14.0, + "time_s": 4.8, + "apex_ft": 62.6 + }, + "shot_9i_9": { + "filename": "shot_9i_9.json", + "speed_mph": 90.05659484863281, + "vla_deg": 22.136898040771484, + "hla_deg": -3.085085391998291, + "total_spin_rpm": 5351.11767578125, + "spin_axis_deg": 1.2128459215164185, + "carry_yd": 118.1, + "roll_yd": 3.0, + "total_yd": 121.1, + "lateral_yd": 7.3, + "time_s": 4.7, + "apex_ft": 60.1 + }, + "shot_driver_51": { + "filename": "shot_driver_51.json", + "speed_mph": 116.16547393798828, + "vla_deg": 21.736244201660156, + "hla_deg": 2.1719987392425537, + "total_spin_rpm": 6408.99853515625, + "spin_axis_deg": 3.2259302139282227, + "carry_yd": 162.9, + "roll_yd": 1.5, + "total_yd": 164.3, + "lateral_yd": 10.9, + "time_s": 6.4, + "apex_ft": 108.7 + }, + "shot_driver_52": { + "filename": "shot_driver_52.json", + "speed_mph": 102.10639953613281, + "vla_deg": 31.329727172851562, + "hla_deg": 3.0872905254364014, + "total_spin_rpm": 8442.173828125, + "spin_axis_deg": 6.263795852661133, + "carry_yd": 124.5, + "roll_yd": 0.4, + "total_yd": 124.1, + "lateral_yd": 13.9, + "time_s": 6.3, + "apex_ft": 119.3 + }, + "shot_driver_53": { + "filename": "shot_driver_53.json", + "speed_mph": 97.23294830322266, + "vla_deg": 30.626953125, + "hla_deg": 2.234292507171631, + "total_spin_rpm": 8925.802734375, + "spin_axis_deg": 5.987576961517334, + "carry_yd": 117.6, + "roll_yd": 0.5, + "total_yd": 117.1, + "lateral_yd": 10.6, + "time_s": 6.0, + "apex_ft": 105.8 + }, + "shot_driver_54": { + "filename": "shot_driver_54.json", + "speed_mph": 121.50360870361328, + "vla_deg": 12.884439468383789, + "hla_deg": -5.258639812469482, + "total_spin_rpm": 3410.91943359375, + "spin_axis_deg": -9.969074249267578, + "carry_yd": 178.2, + "roll_yd": 10.5, + "total_yd": 188.7, + "lateral_yd": 27.4, + "time_s": 5.1, + "apex_ft": 56.5 + }, + "shot_driver_55": { + "filename": "shot_driver_55.json", + "speed_mph": 117.4796371459961, + "vla_deg": 7.477628231048584, + "hla_deg": -8.326677322387695, + "total_spin_rpm": 2149.954833984375, + "spin_axis_deg": -27.1912899017334, + "carry_yd": 125.6, + "roll_yd": 36.3, + "total_yd": 161.8, + "lateral_yd": 29.0, + "time_s": 2.9, + "apex_ft": 17.2 + }, + "shot_driver_56": { + "filename": "shot_driver_56.json", + "speed_mph": 118.70352935791016, + "vla_deg": 17.121259689331055, + "hla_deg": -1.8021036386489868, + "total_spin_rpm": 4553.8095703125, + "spin_axis_deg": 2.805424213409424, + "carry_yd": 176.6, + "roll_yd": 4.3, + "total_yd": 180.9, + "lateral_yd": 9.3, + "time_s": 5.9, + "apex_ft": 83.2 + }, + "shot_driver_57": { + "filename": "shot_driver_57.json", + "speed_mph": 120.92591094970703, + "vla_deg": 14.096846580505371, + "hla_deg": -5.161539554595947, + "total_spin_rpm": 1544.0667724609375, + "spin_axis_deg": -7.955880641937256, + "carry_yd": 177.6, + "roll_yd": 19.4, + "total_yd": 197.0, + "lateral_yd": 22.3, + "time_s": 4.6, + "apex_ft": 50.9 + }, + "shot_driver_58": { + "filename": "shot_driver_58.json", + "speed_mph": 119.27122497558594, + "vla_deg": 23.59177589416504, + "hla_deg": 2.4788992404937744, + "total_spin_rpm": 7093.390625, + "spin_axis_deg": 3.2609012126922607, + "carry_yd": 163.2, + "roll_yd": 0.7, + "total_yd": 163.9, + "lateral_yd": 12.3, + "time_s": 6.8, + "apex_ft": 125.7 + }, + "shot_driver_59": { + "filename": "shot_driver_59.json", + "speed_mph": 80.9592056274414, + "vla_deg": 44.9072151184082, + "hla_deg": 8.870377540588379, + "total_spin_rpm": 6735.0009765625, + "spin_axis_deg": 12.36318302154541, + "carry_yd": 83.7, + "roll_yd": 0.5, + "total_yd": 83.2, + "lateral_yd": 20.3, + "time_s": 5.6, + "apex_ft": 107.8 + }, + "shot_driver_60": { + "filename": "shot_driver_60.json", + "speed_mph": 107.3879165649414, + "vla_deg": 11.672699928283691, + "hla_deg": -8.616562843322754, + "total_spin_rpm": 3268.56591796875, + "spin_axis_deg": -14.801515579223633, + "carry_yd": 138.5, + "roll_yd": 15.4, + "total_yd": 153.8, + "lateral_yd": 30.5, + "time_s": 3.9, + "apex_ft": 34.0 + }, + "shot_pw_64": { + "filename": "shot_pw_64.json", + "speed_mph": 69.62680053710938, + "vla_deg": 28.56521987915039, + "hla_deg": 0.15743345022201538, + "total_spin_rpm": 5327.2353515625, + "spin_axis_deg": 5.097789764404297, + "carry_yd": 80.1, + "roll_yd": 2.3, + "total_yd": 82.4, + "lateral_yd": 2.2, + "time_s": 3.9, + "apex_ft": 46.4 + }, + "shot_pw_65": { + "filename": "shot_pw_65.json", + "speed_mph": 81.2490463256836, + "vla_deg": 28.376514434814453, + "hla_deg": 2.8924813270568848, + "total_spin_rpm": 6959.42578125, + "spin_axis_deg": 9.383454322814941, + "carry_yd": 98.5, + "roll_yd": 0.9, + "total_yd": 99.4, + "lateral_yd": 10.8, + "time_s": 4.7, + "apex_ft": 65.6 + }, + "shot_pw_66": { + "filename": "shot_pw_66.json", + "speed_mph": 75.70809173583984, + "vla_deg": 27.31566047668457, + "hla_deg": -1.1749275922775269, + "total_spin_rpm": 6605.00732421875, + "spin_axis_deg": 3.994753360748291, + "carry_yd": 89.7, + "roll_yd": 1.2, + "total_yd": 90.8, + "lateral_yd": 3.9, + "time_s": 4.3, + "apex_ft": 53.5 + }, + "shot_pw_67": { + "filename": "shot_pw_67.json", + "speed_mph": 81.65978240966797, + "vla_deg": 28.12111473083496, + "hla_deg": 6.339990615844727, + "total_spin_rpm": 6509.591796875, + "spin_axis_deg": 12.735650062561035, + "carry_yd": 100.0, + "roll_yd": 1.1, + "total_yd": 101.1, + "lateral_yd": 18.7, + "time_s": 4.7, + "apex_ft": 65.0 + }, + "shot_pw_68": { + "filename": "shot_pw_68.json", + "speed_mph": 88.55177307128906, + "vla_deg": 23.366304397583008, + "hla_deg": -0.05428417772054672, + "total_spin_rpm": 6637.41455078125, + "spin_axis_deg": 6.043060302734375, + "carry_yd": 112.7, + "roll_yd": 1.4, + "total_yd": 114.1, + "lateral_yd": 4.7, + "time_s": 4.8, + "apex_ft": 63.4 + }, + "shot_pw_69": { + "filename": "shot_pw_69.json", + "speed_mph": 74.05879211425781, + "vla_deg": 23.611677169799805, + "hla_deg": 0.17648263275623322, + "total_spin_rpm": 5880.3515625, + "spin_axis_deg": 8.452945709228516, + "carry_yd": 86.0, + "roll_yd": 2.8, + "total_yd": 88.8, + "lateral_yd": 3.9, + "time_s": 3.8, + "apex_ft": 41.2 + } +} \ No newline at end of file diff --git a/assets/data/shot_session_3/history/iteration_001.json b/assets/data/shot_session_3/history/iteration_001.json new file mode 100644 index 0000000..d49c464 --- /dev/null +++ b/assets/data/shot_session_3/history/iteration_001.json @@ -0,0 +1,529 @@ +{ + "iteration": 1, + "timestamp": "2026-03-13T17:39:39.165470", + "profile_overrides": { + "Flight": { + "HighLaunchDragVlaStartDeg": 26.0, + "HighLaunchDragVlaFullDeg": 33.0, + "HighLaunchDragBoostMax": 1.2, + "SpinDragProgressiveCapSrStart": 0.33, + "SpinDragProgressiveCapSrEnd": 0.5, + "SpinDragProgressiveCapBoostMax": 0.25, + "HighReMidSpinGain": 16.0, + "MidSpinClBoostSrStart": 0.17, + "MidSpinClBoostSrEnd": 0.31, + "MidSpinClBoostMax": 0.5 + } + }, + "summary": { + "pass": 12, + "moderate": 13, + "severe": 36, + "no_reference": 8 + }, + "per_shot": { + "shot_3w_18": { + "diff_carry_yd": null, + "diff_total_yd": null, + "diff_apex_ft": null, + "status": "pass", + "error_pattern": null + }, + "shot_3w_19": { + "diff_carry_yd": -0.1, + "diff_total_yd": 16.7, + "diff_apex_ft": 0.1, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_LONG" + }, + "shot_3w_20": { + "diff_carry_yd": null, + "diff_total_yd": null, + "diff_apex_ft": null, + "status": "pass", + "error_pattern": null + }, + "shot_3w_21": { + "diff_carry_yd": 1.1, + "diff_total_yd": 16.6, + "diff_apex_ft": 0.3, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_LONG" + }, + "shot_3w_22": { + "diff_carry_yd": 3.1, + "diff_total_yd": 20.2, + "diff_apex_ft": 0.5, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "shot_3w_23": { + "diff_carry_yd": 0.8, + "diff_total_yd": -22.7, + "diff_apex_ft": -1.2, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_SHORT" + }, + "shot_3w_24": { + "diff_carry_yd": 7.9, + "diff_total_yd": 29.6, + "diff_apex_ft": 1.9, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "shot_5i_10": { + "diff_carry_yd": 3.0, + "diff_total_yd": -7.1, + "diff_apex_ft": 5.9, + "status": "moderate", + "error_pattern": "ROLLOUT_TOO_SHORT" + }, + "shot_5i_11": { + "diff_carry_yd": -3.2, + "diff_total_yd": -17.2, + "diff_apex_ft": -1.3, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_SHORT" + }, + "shot_5i_12": { + "diff_carry_yd": 1.2, + "diff_total_yd": -23.5, + "diff_apex_ft": 1.1, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_SHORT" + }, + "shot_5i_13": { + "diff_carry_yd": 2.6, + "diff_total_yd": 10.1, + "diff_apex_ft": 0.6, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_LONG" + }, + "shot_5i_14": { + "diff_carry_yd": null, + "diff_total_yd": null, + "diff_apex_ft": null, + "status": "pass", + "error_pattern": null + }, + "shot_5i_15": { + "diff_carry_yd": -4.5, + "diff_total_yd": 14.7, + "diff_apex_ft": -1.1, + "status": "severe", + "error_pattern": "CARRY_TOO_SHORT" + }, + "shot_5i_16": { + "diff_carry_yd": 1.1, + "diff_total_yd": -20.8, + "diff_apex_ft": -0.2, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_SHORT" + }, + "shot_5i_17": { + "diff_carry_yd": -2.0, + "diff_total_yd": -1.9, + "diff_apex_ft": -0.3, + "status": "pass", + "error_pattern": null + }, + "shot_6i_35": { + "diff_carry_yd": -5.1, + "diff_total_yd": -16.6, + "diff_apex_ft": -3.3, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_SHORT" + }, + "shot_6i_36": { + "diff_carry_yd": 2.1, + "diff_total_yd": -20.8, + "diff_apex_ft": 0.6, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_SHORT" + }, + "shot_6i_37": { + "diff_carry_yd": -3.6, + "diff_total_yd": 12.2, + "diff_apex_ft": -0.8, + "status": "severe", + "error_pattern": "CARRY_TOO_SHORT" + }, + "shot_6i_38": { + "diff_carry_yd": -3.2, + "diff_total_yd": -21.3, + "diff_apex_ft": 0.1, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_SHORT" + }, + "shot_6i_39": { + "diff_carry_yd": -0.5, + "diff_total_yd": 6.4, + "diff_apex_ft": 0.0, + "status": "moderate", + "error_pattern": "ROLLOUT_TOO_LONG" + }, + "shot_6i_40": { + "diff_carry_yd": -1.2, + "diff_total_yd": 7.8, + "diff_apex_ft": 0.1, + "status": "moderate", + "error_pattern": "ROLLOUT_TOO_LONG" + }, + "shot_6i_41": { + "diff_carry_yd": -4.6, + "diff_total_yd": 13.2, + "diff_apex_ft": -1.0, + "status": "severe", + "error_pattern": "CARRY_TOO_SHORT" + }, + "shot_6i_42": { + "diff_carry_yd": -1.1, + "diff_total_yd": -17.4, + "diff_apex_ft": 0.8, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_SHORT" + }, + "shot_6i_43": { + "diff_carry_yd": 6.4, + "diff_total_yd": 0.9, + "diff_apex_ft": 8.1, + "status": "moderate", + "error_pattern": "CARRY_TOO_LONG" + }, + "shot_6i_44": { + "diff_carry_yd": -1.2, + "diff_total_yd": -27.4, + "diff_apex_ft": -1.3, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_SHORT" + }, + "shot_6i_45": { + "diff_carry_yd": 3.5, + "diff_total_yd": 21.1, + "diff_apex_ft": 0.6, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "shot_6i_46": { + "diff_carry_yd": 3.8, + "diff_total_yd": -3.5, + "diff_apex_ft": -1.5, + "status": "moderate", + "error_pattern": "CARRY_TOO_LONG" + }, + "shot_6i_47": { + "diff_carry_yd": 7.0, + "diff_total_yd": 10.8, + "diff_apex_ft": 11.8, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "shot_6i_48": { + "diff_carry_yd": 6.1, + "diff_total_yd": 11.1, + "diff_apex_ft": 14.2, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "shot_6i_49": { + "diff_carry_yd": -2.5, + "diff_total_yd": 7.0, + "diff_apex_ft": -0.3, + "status": "moderate", + "error_pattern": "ROLLOUT_TOO_LONG" + }, + "shot_6i_50": { + "diff_carry_yd": -0.4, + "diff_total_yd": -12.1, + "diff_apex_ft": 3.9, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_SHORT" + }, + "shot_7i_25": { + "diff_carry_yd": -0.5, + "diff_total_yd": -18.0, + "diff_apex_ft": 0.9, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_SHORT" + }, + "shot_7i_26": { + "diff_carry_yd": 1.8, + "diff_total_yd": -21.8, + "diff_apex_ft": 1.1, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_SHORT" + }, + "shot_7i_27": { + "diff_carry_yd": 1.8, + "diff_total_yd": 4.3, + "diff_apex_ft": 8.0, + "status": "pass", + "error_pattern": null + }, + "shot_7i_28": { + "diff_carry_yd": 1.2, + "diff_total_yd": 1.2, + "diff_apex_ft": 8.3, + "status": "pass", + "error_pattern": null + }, + "shot_7i_29": { + "diff_carry_yd": 1.0, + "diff_total_yd": -5.8, + "diff_apex_ft": -3.5, + "status": "moderate", + "error_pattern": "ROLLOUT_TOO_SHORT" + }, + "shot_7i_30": { + "diff_carry_yd": -0.2, + "diff_total_yd": 1.5, + "diff_apex_ft": 5.5, + "status": "pass", + "error_pattern": null + }, + "shot_7i_31": { + "diff_carry_yd": -4.8, + "diff_total_yd": -14.3, + "diff_apex_ft": -4.1, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_SHORT" + }, + "shot_7i_32": { + "diff_carry_yd": -1.8, + "diff_total_yd": -2.2, + "diff_apex_ft": 3.1, + "status": "pass", + "error_pattern": null + }, + "shot_7i_33": { + "diff_carry_yd": -1.6, + "diff_total_yd": -1.3, + "diff_apex_ft": 4.7, + "status": "pass", + "error_pattern": null + }, + "shot_7i_34": { + "diff_carry_yd": 4.4, + "diff_total_yd": 2.6, + "diff_apex_ft": 3.1, + "status": "moderate", + "error_pattern": "CARRY_TOO_LONG" + }, + "shot_9i_1": { + "diff_carry_yd": -1.4, + "diff_total_yd": -12.6, + "diff_apex_ft": 1.3, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_SHORT" + }, + "shot_9i_2": { + "diff_carry_yd": -8.0, + "diff_total_yd": -9.1, + "diff_apex_ft": -3.0, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_SHORT" + }, + "shot_9i_3": { + "diff_carry_yd": -1.4, + "diff_total_yd": 1.1, + "diff_apex_ft": -5.3, + "status": "pass", + "error_pattern": null + }, + "shot_9i_4": { + "diff_carry_yd": null, + "diff_total_yd": null, + "diff_apex_ft": null, + "status": "pass", + "error_pattern": null + }, + "shot_9i_5": { + "diff_carry_yd": -2.6, + "diff_total_yd": -5.5, + "diff_apex_ft": -5.5, + "status": "moderate", + "error_pattern": "ROLLOUT_TOO_SHORT" + }, + "shot_9i_6": { + "diff_carry_yd": null, + "diff_total_yd": null, + "diff_apex_ft": null, + "status": "pass", + "error_pattern": null + }, + "shot_9i_7": { + "diff_carry_yd": 1.1, + "diff_total_yd": 1.6, + "diff_apex_ft": -4.2, + "status": "pass", + "error_pattern": null + }, + "shot_9i_8": { + "diff_carry_yd": -1.6, + "diff_total_yd": 4.1, + "diff_apex_ft": -1.5, + "status": "pass", + "error_pattern": null + }, + "shot_9i_9": { + "diff_carry_yd": -1.2, + "diff_total_yd": 1.9, + "diff_apex_ft": -6.1, + "status": "pass", + "error_pattern": null + }, + "shot_driver_51": { + "diff_carry_yd": 11.4, + "diff_total_yd": 29.6, + "diff_apex_ft": 0.6, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "shot_driver_52": { + "diff_carry_yd": 9.4, + "diff_total_yd": 25.3, + "diff_apex_ft": -1.4, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "shot_driver_53": { + "diff_carry_yd": 6.5, + "diff_total_yd": 17.9, + "diff_apex_ft": -3.8, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "shot_driver_54": { + "diff_carry_yd": 5.4, + "diff_total_yd": 0.0, + "diff_apex_ft": -2.2, + "status": "moderate", + "error_pattern": "CARRY_TOO_LONG" + }, + "shot_driver_55": { + "diff_carry_yd": 2.5, + "diff_total_yd": 22.6, + "diff_apex_ft": 0.4, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_LONG" + }, + "shot_driver_56": { + "diff_carry_yd": 4.8, + "diff_total_yd": 20.7, + "diff_apex_ft": 9.7, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "shot_driver_57": { + "diff_carry_yd": -5.1, + "diff_total_yd": -19.7, + "diff_apex_ft": -3.5, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_SHORT" + }, + "shot_driver_58": { + "diff_carry_yd": 18.0, + "diff_total_yd": 37.0, + "diff_apex_ft": -4.8, + "status": "severe", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "shot_driver_59": { + "diff_carry_yd": -0.9, + "diff_total_yd": 17.7, + "diff_apex_ft": -3.8, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_LONG" + }, + "shot_driver_60": { + "diff_carry_yd": 0.0, + "diff_total_yd": -14.9, + "diff_apex_ft": -2.4, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_SHORT" + }, + "shot_pw_61": { + "diff_carry_yd": null, + "diff_total_yd": null, + "diff_apex_ft": null, + "status": "pass", + "error_pattern": null + }, + "shot_pw_62": { + "diff_carry_yd": null, + "diff_total_yd": null, + "diff_apex_ft": null, + "status": "pass", + "error_pattern": null + }, + "shot_pw_63": { + "diff_carry_yd": null, + "diff_total_yd": null, + "diff_apex_ft": null, + "status": "pass", + "error_pattern": null + }, + "shot_pw_64": { + "diff_carry_yd": -4.4, + "diff_total_yd": 9.6, + "diff_apex_ft": -3.7, + "status": "moderate", + "error_pattern": "CARRY_TOO_SHORT" + }, + "shot_pw_65": { + "diff_carry_yd": -0.1, + "diff_total_yd": 4.7, + "diff_apex_ft": -3.8, + "status": "pass", + "error_pattern": null + }, + "shot_pw_66": { + "diff_carry_yd": -2.6, + "diff_total_yd": 11.3, + "diff_apex_ft": -3.7, + "status": "severe", + "error_pattern": "ROLLOUT_TOO_LONG" + }, + "shot_pw_67": { + "diff_carry_yd": 0.0, + "diff_total_yd": 5.7, + "diff_apex_ft": -4.0, + "status": "moderate", + "error_pattern": "ROLLOUT_TOO_LONG" + }, + "shot_pw_68": { + "diff_carry_yd": 3.4, + "diff_total_yd": 6.1, + "diff_apex_ft": -6.2, + "status": "moderate", + "error_pattern": "CARRY_AND_ROLLOUT_LONG" + }, + "shot_pw_69": { + "diff_carry_yd": -2.8, + "diff_total_yd": -3.9, + "diff_apex_ft": -3.8, + "status": "pass", + "error_pattern": null + } + }, + "regressions": [], + "conflicts": [ + "Bounce.FlightTangentialRetentionBase", + "Bounce.CorBaseA", + "Rollout.LowSpinMultiplierMax", + "Rollout.LowSpinThreshold", + "Rollout.FrictionBlendSpeed", + "KineticFrictionMultiplier", + "RollingFrictionMultiplier", + "Bounce.RolloutLowSpinRetention", + "Bounce.FlightSpinFactorMin", + "Bounce.FlightSpinFactorDivisor", + "Rollout.HighSpinMultiplierMax", + "Bounce.RolloutHighSpinRetention", + "Flight.ClMaxBase", + "Flight.CdMin", + "Flight.HighLaunchDragBoostMax", + "DragScaleMultiplier", + "LiftScaleMultiplier" + ] +} diff --git a/assets/data/shot_session_3/physics.csv b/assets/data/shot_session_3/physics.csv new file mode 100644 index 0000000..d2b39f5 --- /dev/null +++ b/assets/data/shot_session_3/physics.csv @@ -0,0 +1,70 @@ +shot_name,filename,speed_mph,vla_deg,hla_deg,total_spin_rpm,spin_axis_deg,backspin_rpm,sidespin_rpm,carry_yd,total_yd,rollout_yd,apex_ft,hang_time_s,landing_speed_mps,landing_angle_deg,initial_re,initial_spin_ratio,initial_cd,initial_cl,peak_cl,carry_only_yd +shot_3w_18,shot_3w_18.json,47.91,45.81,33.98,7491.0,30.00,6487.4,3745.5,36.7,41.7,4.9,34.7,2.95,16.10,54.61,58633.5,0.781418,0.569061,0.273498,0.273498,36.7 +shot_3w_19,shot_3w_19.json,121.33,5.59,-4.84,1661.5,-11.89,1625.9,-342.2,120.5,182.5,62.0,12.3,2.53,36.70,10.00,148481.0,0.068442,0.197251,0.151288,0.151438,120.5 +shot_3w_20,shot_3w_20.json,116.03,4.40,2.29,2026.0,9.97,1995.4,350.7,103.0,162.9,59.8,8.2,2.18,36.97,7.77,141993.6,0.087270,0.196043,0.168655,0.168660,103.0 +shot_3w_21,shot_3w_21.json,119.40,5.31,-3.43,1759.7,-10.46,1730.5,-319.5,115.7,177.1,61.3,11.2,2.44,36.62,9.45,146120.2,0.073659,0.196519,0.156580,0.156660,115.7 +shot_3w_22,shot_3w_22.json,108.89,5.62,-7.25,2500.8,-1.78,2499.6,-77.5,106.3,161.5,55.2,11.0,2.44,33.74,10.12,133261.1,0.114780,0.196784,0.187398,0.187398,106.3 +shot_3w_23,shot_3w_23.json,115.83,8.90,-0.78,2804.3,2.19,2802.2,107.3,148.5,148.2,-0.2,26.8,3.56,30.87,18.14,141755.6,0.120995,0.201268,0.178166,0.178473,148.5 +shot_3w_24,shot_3w_24.json,123.42,6.29,-5.42,2751.6,-13.27,2678.1,-631.8,153.8,206.3,52.5,21.7,3.44,32.73,15.04,151037.8,0.111429,0.204726,0.185432,0.185915,153.8 +shot_5i_10,shot_5i_10.json,87.96,14.22,1.21,4064.7,8.41,4021.0,594.4,106.1,109.6,3.5,34.3,3.59,23.03,34.08,107642.0,0.230959,0.235986,0.312469,0.319148,106.1 +shot_5i_11,shot_5i_11.json,90.59,14.45,-0.21,3360.4,7.80,3329.3,456.2,105.6,106.9,1.4,28.5,3.26,25.16,26.29,110866.8,0.185386,0.219679,0.213438,0.218752,105.6 +shot_5i_12,shot_5i_12.json,74.19,10.23,-1.67,3321.4,15.75,3196.7,901.5,59.6,58.4,-1.1,10.5,2.01,23.70,17.43,90789.2,0.223756,0.276466,0.301989,0.305482,59.6 +shot_5i_13,shot_5i_13.json,75.04,8.01,2.53,3921.4,3.42,3914.4,234.0,56.5,89.0,32.5,7.4,1.83,24.58,12.26,91830.0,0.261184,0.272955,0.303437,0.305909,56.5 +shot_5i_14,shot_5i_14.json,87.69,4.53,-7.68,3390.3,1.80,3388.6,106.5,54.4,98.1,43.7,4.0,1.43,31.18,6.66,107310.8,0.193234,0.226498,0.243331,0.243331,54.4 +shot_5i_15,shot_5i_15.json,86.90,9.35,-4.02,2508.9,-4.94,2499.6,-216.2,74.1,121.3,47.2,11.0,2.08,28.55,13.08,106345.9,0.144296,0.214825,0.187102,0.187102,74.1 +shot_5i_16,shot_5i_16.json,97.99,9.13,-2.08,3775.9,1.68,3774.3,110.7,110.2,109.2,-1.0,19.5,3.01,27.62,17.58,119926.2,0.192576,0.215013,0.229128,0.229955,110.2 +shot_5i_17,shot_5i_17.json,56.46,9.97,24.15,5178.3,29.12,4523.9,2519.7,28.6,45.0,16.5,4.2,1.18,20.23,12.26,69096.2,0.458380,0.402994,0.309595,0.311075,28.6 +shot_6i_35,shot_6i_35.json,80.55,15.35,-1.30,4667.1,-0.03,4667.1,-2.8,84.9,84.9,0.0,23.1,2.92,22.73,25.52,98572.3,0.289590,0.253612,0.244343,0.268976,84.9 +shot_6i_36,shot_6i_36.json,78.86,10.40,16.08,4166.0,25.12,3771.9,1768.7,69.9,68.3,-1.6,12.4,2.27,24.22,16.75,96505.8,0.264030,0.258934,0.298537,0.298652,69.9 +shot_6i_37,shot_6i_37.json,82.57,10.16,11.01,3041.1,25.35,2748.4,1301.8,67.9,109.4,41.5,11.0,2.03,26.95,14.28,101052.9,0.184068,0.234572,0.211057,0.211332,67.9 +shot_6i_38,shot_6i_38.json,79.12,13.35,3.04,3186.9,11.59,3121.9,640.2,76.0,76.2,0.2,18.1,2.53,23.84,23.45,96827.7,0.201308,0.249920,0.250057,0.258223,76.0 +shot_6i_39,shot_6i_39.json,60.98,6.14,10.35,3284.8,22.03,3044.9,1232.2,23.5,53.7,30.3,2.1,0.86,23.39,7.64,74625.7,0.269219,0.351554,0.288673,0.291348,23.5 +shot_6i_40,shot_6i_40.json,62.11,6.80,27.01,2768.0,30.00,2397.2,1384.0,25.0,58.9,33.9,2.6,0.90,23.67,8.85,76009.9,0.222738,0.343045,0.300173,0.300559,25.0 +shot_6i_41,shot_6i_41.json,82.53,9.88,-2.28,2620.2,13.56,2547.1,614.5,66.7,111.1,44.4,10.3,1.97,27.41,13.39,100996.8,0.158675,0.227492,0.192268,0.192269,66.7 +shot_6i_42,shot_6i_42.json,77.19,13.14,-3.42,4057.2,4.14,4046.6,293.2,75.5,75.5,-0.0,18.3,2.63,22.59,23.99,94471.3,0.262673,0.264689,0.300938,0.300938,75.5 +shot_6i_43,shot_6i_43.json,94.06,13.88,-4.68,4616.2,1.70,4614.2,137.0,123.7,129.5,5.7,43.1,4.12,23.23,37.74,115112.4,0.245275,0.227614,0.319007,0.319007,123.7 +shot_6i_44,shot_6i_44.json,114.96,9.46,-6.67,2314.5,15.10,2234.6,602.8,141.1,140.8,-0.3,25.3,3.34,31.77,17.37,140686.5,0.100621,0.197318,0.165322,0.165551,141.1 +shot_6i_45,shot_6i_45.json,109.32,6.42,-9.00,2509.9,-10.87,2464.9,-473.5,113.1,166.5,53.4,13.5,2.63,33.03,11.70,133784.2,0.114749,0.196925,0.187380,0.187381,113.1 +shot_6i_46,shot_6i_46.json,116.33,13.65,0.34,3007.9,10.67,2955.8,557.1,171.1,175.8,4.6,50.1,4.53,28.25,28.55,142368.0,0.129223,0.203147,0.180634,0.181714,171.1 +shot_6i_47,shot_6i_47.json,99.48,14.78,-2.86,4810.7,4.69,4794.6,393.7,138.2,148.5,10.3,56.8,4.64,23.60,43.56,121740.5,0.241695,0.224018,0.319265,0.319321,138.2 +shot_6i_48,shot_6i_48.json,101.73,15.23,-3.03,4631.0,4.26,4618.2,344.4,143.2,154.6,11.4,63.1,4.83,23.90,45.83,124502.8,0.227503,0.223418,0.307983,0.319321,143.2 +shot_6i_49,shot_6i_49.json,71.25,7.70,16.05,2624.7,30.00,2273.0,1312.3,37.4,77.3,39.9,4.2,1.20,26.22,9.47,87197.7,0.184102,0.274179,0.211348,0.211348,37.4 +shot_6i_50,shot_6i_50.json,82.80,14.85,-1.42,3783.4,2.81,3778.8,185.4,92.8,95.3,2.6,29.5,3.23,22.65,32.23,101335.6,0.228355,0.247284,0.309186,0.318160,92.8 +shot_7i_25,shot_7i_25.json,83.34,13.18,2.98,3409.5,17.79,3246.5,1041.7,86.4,86.8,0.4,21.0,2.80,24.19,24.28,101997.9,0.204455,0.239178,0.258137,0.266132,86.4 +shot_7i_26,shot_7i_26.json,73.37,10.85,15.40,3560.9,30.00,3083.8,1780.4,58.4,57.5,-1.0,10.7,2.00,23.45,17.67,89787.0,0.242568,0.279987,0.319319,0.319321,58.4 +shot_7i_27,shot_7i_27.json,93.74,17.06,-1.45,4611.6,2.63,4606.7,211.8,124.1,132.6,8.4,54.0,4.37,23.10,43.53,114719.5,0.245870,0.227933,0.318841,0.318841,124.1 +shot_7i_28,shot_7i_28.json,92.09,16.41,-3.60,4216.7,-0.44,4216.6,-32.4,119.1,126.8,7.7,48.9,4.15,23.11,41.48,112696.8,0.228852,0.229779,0.309859,0.319321,119.1 +shot_7i_29,shot_7i_29.json,107.59,13.82,-6.05,3633.3,4.72,3621.0,298.7,149.4,152.5,3.1,42.8,4.18,26.85,28.20,131669.7,0.168773,0.207825,0.195575,0.196678,149.4 +shot_7i_30,shot_7i_30.json,90.17,17.56,-3.83,4508.5,-0.21,4508.5,-16.5,115.2,123.2,8.0,48.6,4.11,22.75,41.66,110355.9,0.249879,0.232360,0.316829,0.316829,115.2 +shot_7i_31,shot_7i_31.json,76.36,17.52,-0.54,5122.2,1.84,5119.5,164.7,80.2,80.2,-0.0,24.3,2.94,21.68,27.18,93445.7,0.335263,0.264659,0.225889,0.268000,80.2 +shot_7i_32,shot_7i_32.json,93.10,16.96,-1.03,3762.5,4.20,3752.4,275.6,119.4,127.6,8.2,45.6,3.98,23.95,38.50,113935.9,0.201982,0.221595,0.251784,0.278687,119.4 +shot_7i_33,shot_7i_33.json,92.36,16.96,-0.58,3851.7,2.81,3847.1,188.9,118.1,126.7,8.6,46.7,4.02,23.60,39.60,113026.5,0.208434,0.224441,0.268276,0.297243,118.1 +shot_7i_34,shot_7i_34.json,104.19,14.67,-4.63,4081.2,1.90,4079.0,135.0,146.9,153.2,6.3,51.3,4.49,25.08,37.02,127515.3,0.195758,0.214592,0.236115,0.255285,146.9 +shot_9i_1,shot_9i_1.json,88.98,15.10,-0.50,3563.2,11.26,3494.6,695.8,105.3,108.2,2.9,32.1,3.42,24.11,30.94,108898.1,0.200130,0.226454,0.247047,0.261228,105.3 +shot_9i_2,shot_9i_2.json,71.29,23.93,5.51,4085.5,8.31,4042.7,590.2,74.1,78.3,4.3,33.8,3.18,20.15,39.23,87241.3,0.286429,0.289562,0.250705,0.268796,74.1 +shot_9i_3,shot_9i_3.json,90.11,21.67,2.80,5243.0,11.20,5143.3,1018.1,115.9,121.8,5.9,52.4,4.23,22.62,42.09,110277.5,0.290796,0.232455,0.242056,0.268000,115.9 +shot_9i_4,shot_9i_4.json,95.73,4.75,-6.78,2312.1,6.03,2299.3,242.8,63.8,118.0,54.2,4.8,1.54,34.03,6.71,117157.2,0.120704,0.199445,0.190698,0.190698,63.8 +shot_9i_5,shot_9i_5.json,84.02,19.37,3.82,5352.1,11.48,5245.0,1065.2,100.1,101.7,1.6,36.3,3.59,22.21,33.44,102827.9,0.318347,0.244171,0.224019,0.268000,100.1 +shot_9i_6,shot_9i_6.json,94.70,0.00,3.68,2200.5,28.95,1925.4,1065.3,4.2,70.0,65.8,0.1,0.09,41.74,0.55,115895.5,0.116130,0.199385,0.188169,0.188169,4.2 +shot_9i_7,shot_9i_7.json,83.03,22.51,5.26,7008.5,9.70,6908.3,1181.2,102.2,104.2,2.0,47.3,4.09,20.95,40.06,101607.9,0.421882,0.272085,0.254654,0.311339,102.2 +shot_9i_8,shot_9i_8.json,92.21,21.95,-6.31,5042.3,0.73,5041.8,64.2,121.3,130.5,9.2,61.1,4.51,22.86,46.52,112846.1,0.273294,0.229631,0.279723,0.279723,121.3 +shot_9i_9,shot_9i_9.json,90.06,22.14,-3.09,5351.1,1.21,5349.9,113.3,116.9,123.0,6.2,54.0,4.30,22.54,42.88,110212.5,0.296965,0.232535,0.231941,0.268000,116.9 +shot_driver_51,shot_driver_51.json,116.17,21.74,2.17,6409.0,3.23,6398.8,360.7,174.3,193.9,19.6,109.3,6.16,25.54,56.27,142164.9,0.275733,0.228395,0.274312,0.274312,174.3 +shot_driver_52,shot_driver_52.json,102.11,31.33,3.09,8442.2,6.26,8391.8,921.1,133.9,149.4,15.5,117.9,6.13,24.16,60.49,124959.2,0.413216,0.245899,0.250095,0.301073,133.9 +shot_driver_53,shot_driver_53.json,97.23,30.63,2.23,8925.8,5.99,8877.1,931.1,124.1,135.0,10.9,102.0,5.69,23.10,56.94,118995.0,0.458786,0.265083,0.272631,0.310595,124.1 +shot_driver_54,shot_driver_54.json,121.50,12.88,-5.26,3410.9,-9.97,3359.4,-590.5,183.6,188.7,5.1,54.3,4.79,28.21,29.58,148697.8,0.140300,0.208998,0.185406,0.186904,183.6 +shot_driver_55,shot_driver_55.json,117.48,7.48,-8.33,2150.0,-27.19,1912.4,-982.4,128.1,184.4,56.3,17.6,2.86,34.26,13.30,143773.2,0.091462,0.197519,0.168768,0.168932,128.1 +shot_driver_56,shot_driver_56.json,118.70,17.12,-1.80,4553.8,2.81,4548.4,222.9,181.4,201.6,20.2,92.9,5.78,26.15,50.62,145271.0,0.191729,0.220111,0.226607,0.281042,181.4 +shot_driver_57,shot_driver_57.json,120.93,14.10,-5.16,1544.1,-7.96,1529.2,-213.7,172.5,177.3,4.8,47.4,4.23,30.71,26.13,147990.8,0.063815,0.196505,0.135395,0.136410,172.5 +shot_driver_58,shot_driver_58.json,119.27,23.59,2.48,7093.4,3.26,7081.9,403.5,181.2,200.9,19.8,120.9,6.49,25.88,57.65,145965.8,0.297231,0.230714,0.231575,0.268541,181.2 +shot_driver_59,shot_driver_59.json,80.96,44.91,8.87,6735.0,12.36,6578.8,1442.0,82.8,100.9,18.1,104.0,5.29,22.79,66.05,99079.0,0.415764,0.270301,0.251426,0.310684,82.8 +shot_driver_60,shot_driver_60.json,107.39,11.67,-8.62,3268.6,-14.80,3160.1,-835.0,138.5,138.9,0.4,31.6,3.65,28.48,22.04,131422.8,0.152117,0.203783,0.189954,0.190320,138.5 +shot_pw_61,shot_pw_61.json,31.89,25.35,-1.26,3867.9,-0.00,3867.9,-0.0,16.0,26.8,10.7,6.0,1.23,12.61,27.50,39031.5,0.606110,0.529434,0.122952,0.122952,16.0 +shot_pw_62,shot_pw_62.json,39.63,23.69,0.60,3843.5,2.08,3840.9,139.6,23.7,37.9,14.2,8.7,1.52,14.57,28.02,48495.7,0.484743,0.588556,0.304642,0.304642,23.7 +shot_pw_63,shot_pw_63.json,37.15,24.01,1.83,3913.8,-0.00,3913.8,-0.0,20.9,33.6,12.7,7.6,1.40,13.99,27.34,45463.9,0.526531,0.578946,0.254152,0.254152,20.9 +shot_pw_64,shot_pw_64.json,69.63,28.57,0.16,5327.2,5.10,5306.2,473.4,75.7,92.0,16.3,42.7,3.64,19.40,45.17,85210.2,0.382385,0.293489,0.235700,0.308511,75.7 +shot_pw_65,shot_pw_65.json,81.25,28.38,2.89,6959.4,9.38,6866.3,1134.7,98.4,104.1,5.7,61.8,4.47,20.80,48.82,99433.7,0.428086,0.274904,0.257944,0.311155,98.4 +shot_pw_66,shot_pw_66.json,75.71,27.32,-1.17,6605.0,3.99,6589.0,460.1,87.1,102.1,15.0,49.8,4.00,19.95,45.08,92652.6,0.436020,0.278812,0.262117,0.311327,87.1 +shot_pw_67,shot_pw_67.json,81.66,28.12,6.34,6509.6,12.74,6349.4,1435.1,100.0,106.8,6.7,61.0,4.46,20.93,48.83,99936.4,0.398402,0.263562,0.242678,0.311339,100.0 +shot_pw_68,shot_pw_68.json,88.55,23.37,-0.05,6637.4,6.04,6600.5,698.8,116.1,120.2,4.1,57.2,4.48,21.93,42.94,108370.9,0.374608,0.243285,0.232885,0.292326,116.1 +shot_pw_69,shot_pw_69.json,74.06,23.61,0.18,5880.4,8.45,5816.5,864.4,83.2,84.9,1.7,37.4,3.54,20.04,38.24,90634.2,0.396828,0.275008,0.241935,0.304135,83.2 diff --git a/assets/data/shot_session_3/shot_3w_18.json b/assets/data/shot_session_3/shot_3w_18.json new file mode 100644 index 0000000..2c4aaee --- /dev/null +++ b/assets/data/shot_session_3/shot_3w_18.json @@ -0,0 +1,15 @@ +{ + "BallData": { + "Speed": 47.910438537597656, + "SpinAxis": 30, + "TotalSpin": 7490.96484375, + "BackSpin": 6487.36572265625, + "SideSpin": 3745.482421875, + "HLA": 33.98442840576172, + "VLA": 45.80533981323242, + "CarryDistance": 0 + }, + "ShotDataOptions": { + "ContainsBallData": true + } +} \ No newline at end of file diff --git a/assets/data/shot_session_3/shot_3w_19.json b/assets/data/shot_session_3/shot_3w_19.json new file mode 100644 index 0000000..a9499b8 --- /dev/null +++ b/assets/data/shot_session_3/shot_3w_19.json @@ -0,0 +1,15 @@ +{ + "BallData": { + "Speed": 121.3264389038086, + "SpinAxis": -11.886557579040527, + "TotalSpin": 1661.5179443359375, + "BackSpin": 1625.890625, + "SideSpin": -342.2304992675781, + "HLA": -4.835934162139893, + "VLA": 5.5909037590026855, + "CarryDistance": 0 + }, + "ShotDataOptions": { + "ContainsBallData": true + } +} \ No newline at end of file diff --git a/assets/data/shot_session_3/shot_3w_20.json b/assets/data/shot_session_3/shot_3w_20.json new file mode 100644 index 0000000..4222ab2 --- /dev/null +++ b/assets/data/shot_session_3/shot_3w_20.json @@ -0,0 +1,15 @@ +{ + "BallData": { + "Speed": 116.02548217773438, + "SpinAxis": 9.966802597045898, + "TotalSpin": 2026.020751953125, + "BackSpin": 1995.4444580078125, + "SideSpin": 350.65869140625, + "HLA": 2.2949562072753906, + "VLA": 4.395872116088867, + "CarryDistance": 0 + }, + "ShotDataOptions": { + "ContainsBallData": true + } +} \ No newline at end of file diff --git a/assets/data/shot_session_3/shot_3w_21.json b/assets/data/shot_session_3/shot_3w_21.json new file mode 100644 index 0000000..d93ed13 --- /dev/null +++ b/assets/data/shot_session_3/shot_3w_21.json @@ -0,0 +1,15 @@ +{ + "BallData": { + "Speed": 119.39741516113281, + "SpinAxis": -10.459320068359375, + "TotalSpin": 1759.7186279296875, + "BackSpin": 1730.479248046875, + "SideSpin": -319.4546813964844, + "HLA": -3.432490348815918, + "VLA": 5.3101420402526855, + "CarryDistance": 0 + }, + "ShotDataOptions": { + "ContainsBallData": true + } +} \ No newline at end of file diff --git a/assets/data/shot_session_3/shot_3w_22.json b/assets/data/shot_session_3/shot_3w_22.json new file mode 100644 index 0000000..b39db6a --- /dev/null +++ b/assets/data/shot_session_3/shot_3w_22.json @@ -0,0 +1,15 @@ +{ + "BallData": { + "Speed": 108.89000701904297, + "SpinAxis": -1.7757200002670288, + "TotalSpin": 2500.794189453125, + "BackSpin": 2499.59326171875, + "SideSpin": -77.49260711669922, + "HLA": -7.248828887939453, + "VLA": 5.6167826652526855, + "CarryDistance": 0 + }, + "ShotDataOptions": { + "ContainsBallData": true + } +} \ No newline at end of file diff --git a/assets/data/shot_session_3/shot_3w_23.json b/assets/data/shot_session_3/shot_3w_23.json new file mode 100644 index 0000000..dd90b67 --- /dev/null +++ b/assets/data/shot_session_3/shot_3w_23.json @@ -0,0 +1,15 @@ +{ + "BallData": { + "Speed": 115.83103942871094, + "SpinAxis": 2.1936216354370117, + "TotalSpin": 2804.254638671875, + "BackSpin": 2802.19970703125, + "SideSpin": 107.33724212646484, + "HLA": -0.7794083952903748, + "VLA": 8.904770851135254, + "CarryDistance": 0 + }, + "ShotDataOptions": { + "ContainsBallData": true + } +} \ No newline at end of file diff --git a/assets/data/shot_session_3/shot_3w_24.json b/assets/data/shot_session_3/shot_3w_24.json new file mode 100644 index 0000000..4156979 --- /dev/null +++ b/assets/data/shot_session_3/shot_3w_24.json @@ -0,0 +1,15 @@ +{ + "BallData": { + "Speed": 123.41571044921875, + "SpinAxis": -13.27297592163086, + "TotalSpin": 2751.643310546875, + "BackSpin": 2678.139404296875, + "SideSpin": -631.751708984375, + "HLA": -5.422914028167725, + "VLA": 6.293036937713623, + "CarryDistance": 0 + }, + "ShotDataOptions": { + "ContainsBallData": true + } +} \ No newline at end of file diff --git a/assets/data/shot_session_3/shot_5i_10.json b/assets/data/shot_session_3/shot_5i_10.json new file mode 100644 index 0000000..1fa439c --- /dev/null +++ b/assets/data/shot_session_3/shot_5i_10.json @@ -0,0 +1,15 @@ +{ + "BallData": { + "Speed": 87.95623779296875, + "SpinAxis": 8.409174919128418, + "TotalSpin": 4064.680419921875, + "BackSpin": 4020.980712890625, + "SideSpin": 594.4247436523438, + "HLA": 1.2086073160171509, + "VLA": 14.219791412353516, + "CarryDistance": 0 + }, + "ShotDataOptions": { + "ContainsBallData": true + } +} \ No newline at end of file diff --git a/assets/data/shot_session_3/shot_5i_11.json b/assets/data/shot_session_3/shot_5i_11.json new file mode 100644 index 0000000..db56e4e --- /dev/null +++ b/assets/data/shot_session_3/shot_5i_11.json @@ -0,0 +1,15 @@ +{ + "BallData": { + "Speed": 90.59127044677734, + "SpinAxis": 7.803199768066406, + "TotalSpin": 3360.378173828125, + "BackSpin": 3329.261962890625, + "SideSpin": 456.2415771484375, + "HLA": -0.2112649530172348, + "VLA": 14.447543144226074, + "CarryDistance": 0 + }, + "ShotDataOptions": { + "ContainsBallData": true + } +} \ No newline at end of file diff --git a/assets/data/shot_session_3/shot_5i_12.json b/assets/data/shot_session_3/shot_5i_12.json new file mode 100644 index 0000000..ca189dc --- /dev/null +++ b/assets/data/shot_session_3/shot_5i_12.json @@ -0,0 +1,15 @@ +{ + "BallData": { + "Speed": 74.1854476928711, + "SpinAxis": 15.748629570007324, + "TotalSpin": 3321.373046875, + "BackSpin": 3196.6943359375, + "SideSpin": 901.478515625, + "HLA": -1.6741827726364136, + "VLA": 10.231616020202637, + "CarryDistance": 0 + }, + "ShotDataOptions": { + "ContainsBallData": true + } +} \ No newline at end of file diff --git a/assets/data/shot_session_3/shot_5i_13.json b/assets/data/shot_session_3/shot_5i_13.json new file mode 100644 index 0000000..1bc9569 --- /dev/null +++ b/assets/data/shot_session_3/shot_5i_13.json @@ -0,0 +1,15 @@ +{ + "BallData": { + "Speed": 75.03592681884766, + "SpinAxis": 3.4204583168029785, + "TotalSpin": 3921.38916015625, + "BackSpin": 3914.403564453125, + "SideSpin": 233.96107482910156, + "HLA": 2.528409004211426, + "VLA": 8.008757591247559, + "CarryDistance": 0 + }, + "ShotDataOptions": { + "ContainsBallData": true + } +} \ No newline at end of file diff --git a/assets/data/shot_session_3/shot_5i_14.json b/assets/data/shot_session_3/shot_5i_14.json new file mode 100644 index 0000000..ed000f3 --- /dev/null +++ b/assets/data/shot_session_3/shot_5i_14.json @@ -0,0 +1,15 @@ +{ + "BallData": { + "Speed": 87.68553161621094, + "SpinAxis": 1.7997634410858154, + "TotalSpin": 3390.28271484375, + "BackSpin": 3388.6103515625, + "SideSpin": 106.47736358642578, + "HLA": -7.676884651184082, + "VLA": 4.525229454040527, + "CarryDistance": 0 + }, + "ShotDataOptions": { + "ContainsBallData": true + } +} \ No newline at end of file diff --git a/assets/data/shot_session_3/shot_5i_15.json b/assets/data/shot_session_3/shot_5i_15.json new file mode 100644 index 0000000..1288974 --- /dev/null +++ b/assets/data/shot_session_3/shot_5i_15.json @@ -0,0 +1,15 @@ +{ + "BallData": { + "Speed": 86.89714813232422, + "SpinAxis": -4.943783283233643, + "TotalSpin": 2508.89990234375, + "BackSpin": 2499.566162109375, + "SideSpin": -216.212646484375, + "HLA": -4.017830848693848, + "VLA": 9.352163314819336, + "CarryDistance": 0 + }, + "ShotDataOptions": { + "ContainsBallData": true + } +} \ No newline at end of file diff --git a/assets/data/shot_session_3/shot_5i_16.json b/assets/data/shot_session_3/shot_5i_16.json new file mode 100644 index 0000000..4234f88 --- /dev/null +++ b/assets/data/shot_session_3/shot_5i_16.json @@ -0,0 +1,15 @@ +{ + "BallData": { + "Speed": 97.99386596679688, + "SpinAxis": 1.680374264717102, + "TotalSpin": 3775.940673828125, + "BackSpin": 3774.31689453125, + "SideSpin": 110.72515106201172, + "HLA": -2.0793614387512207, + "VLA": 9.131645202636719, + "CarryDistance": 0 + }, + "ShotDataOptions": { + "ContainsBallData": true + } +} \ No newline at end of file diff --git a/assets/data/shot_session_3/shot_5i_17.json b/assets/data/shot_session_3/shot_5i_17.json new file mode 100644 index 0000000..b87736f --- /dev/null +++ b/assets/data/shot_session_3/shot_5i_17.json @@ -0,0 +1,15 @@ +{ + "BallData": { + "Speed": 56.45970916748047, + "SpinAxis": 29.116588592529297, + "TotalSpin": 5178.31494140625, + "BackSpin": 4523.9384765625, + "SideSpin": 2519.707763671875, + "HLA": 24.147518157958984, + "VLA": 9.96929931640625, + "CarryDistance": 0 + }, + "ShotDataOptions": { + "ContainsBallData": true + } +} \ No newline at end of file diff --git a/assets/data/shot_session_3/shot_6i_35.json b/assets/data/shot_session_3/shot_6i_35.json new file mode 100644 index 0000000..01567b7 --- /dev/null +++ b/assets/data/shot_session_3/shot_6i_35.json @@ -0,0 +1,15 @@ +{ + "BallData": { + "Speed": 80.54517364501953, + "SpinAxis": -0.03472926467657089, + "TotalSpin": 4667.10546875, + "BackSpin": 4667.1044921875, + "SideSpin": -2.8289191722869873, + "HLA": -1.2998002767562866, + "VLA": 15.354228973388672, + "CarryDistance": 0 + }, + "ShotDataOptions": { + "ContainsBallData": true + } +} \ No newline at end of file diff --git a/assets/data/shot_session_3/shot_6i_36.json b/assets/data/shot_session_3/shot_6i_36.json new file mode 100644 index 0000000..bf34a22 --- /dev/null +++ b/assets/data/shot_session_3/shot_6i_36.json @@ -0,0 +1,15 @@ +{ + "BallData": { + "Speed": 78.85662078857422, + "SpinAxis": 25.122739791870117, + "TotalSpin": 4165.97021484375, + "BackSpin": 3771.87109375, + "SideSpin": 1768.6993408203125, + "HLA": 16.080949783325195, + "VLA": 10.401652336120605, + "CarryDistance": 0 + }, + "ShotDataOptions": { + "ContainsBallData": true + } +} \ No newline at end of file diff --git a/assets/data/shot_session_3/shot_6i_37.json b/assets/data/shot_session_3/shot_6i_37.json new file mode 100644 index 0000000..85fb290 --- /dev/null +++ b/assets/data/shot_session_3/shot_6i_37.json @@ -0,0 +1,15 @@ +{ + "BallData": { + "Speed": 82.57211303710938, + "SpinAxis": 25.345022201538086, + "TotalSpin": 3041.13916015625, + "BackSpin": 2748.418701171875, + "SideSpin": 1301.8148193359375, + "HLA": 11.010269165039062, + "VLA": 10.160353660583496, + "CarryDistance": 0 + }, + "ShotDataOptions": { + "ContainsBallData": true + } +} \ No newline at end of file diff --git a/assets/data/shot_session_3/shot_6i_38.json b/assets/data/shot_session_3/shot_6i_38.json new file mode 100644 index 0000000..77d27db --- /dev/null +++ b/assets/data/shot_session_3/shot_6i_38.json @@ -0,0 +1,15 @@ +{ + "BallData": { + "Speed": 79.1196060180664, + "SpinAxis": 11.58816909790039, + "TotalSpin": 3186.907470703125, + "BackSpin": 3121.947998046875, + "SideSpin": 640.172119140625, + "HLA": 3.0407917499542236, + "VLA": 13.352584838867188, + "CarryDistance": 0 + }, + "ShotDataOptions": { + "ContainsBallData": true + } +} \ No newline at end of file diff --git a/assets/data/shot_session_3/shot_6i_39.json b/assets/data/shot_session_3/shot_6i_39.json new file mode 100644 index 0000000..20c85a6 --- /dev/null +++ b/assets/data/shot_session_3/shot_6i_39.json @@ -0,0 +1,15 @@ +{ + "BallData": { + "Speed": 60.977989196777344, + "SpinAxis": 22.03131675720215, + "TotalSpin": 3284.7568359375, + "BackSpin": 3044.900390625, + "SideSpin": 1232.156005859375, + "HLA": 10.34990119934082, + "VLA": 6.142360210418701, + "CarryDistance": 0 + }, + "ShotDataOptions": { + "ContainsBallData": true + } +} \ No newline at end of file diff --git a/assets/data/shot_session_3/shot_6i_40.json b/assets/data/shot_session_3/shot_6i_40.json new file mode 100644 index 0000000..11f2b92 --- /dev/null +++ b/assets/data/shot_session_3/shot_6i_40.json @@ -0,0 +1,15 @@ +{ + "BallData": { + "Speed": 62.1090087890625, + "SpinAxis": 30, + "TotalSpin": 2768.042236328125, + "BackSpin": 2397.19482421875, + "SideSpin": 1384.0211181640625, + "HLA": 27.012741088867188, + "VLA": 6.798625946044922, + "CarryDistance": 0 + }, + "ShotDataOptions": { + "ContainsBallData": true + } +} \ No newline at end of file diff --git a/assets/data/shot_session_3/shot_6i_41.json b/assets/data/shot_session_3/shot_6i_41.json new file mode 100644 index 0000000..fa1c060 --- /dev/null +++ b/assets/data/shot_session_3/shot_6i_41.json @@ -0,0 +1,15 @@ +{ + "BallData": { + "Speed": 82.52630615234375, + "SpinAxis": 13.564412117004395, + "TotalSpin": 2620.150146484375, + "BackSpin": 2547.06591796875, + "SideSpin": 614.5256958007812, + "HLA": -2.284115791320801, + "VLA": 9.875736236572266, + "CarryDistance": 0 + }, + "ShotDataOptions": { + "ContainsBallData": true + } +} \ No newline at end of file diff --git a/assets/data/shot_session_3/shot_6i_42.json b/assets/data/shot_session_3/shot_6i_42.json new file mode 100644 index 0000000..dc6634c --- /dev/null +++ b/assets/data/shot_session_3/shot_6i_42.json @@ -0,0 +1,15 @@ +{ + "BallData": { + "Speed": 77.19420623779297, + "SpinAxis": 4.143872261047363, + "TotalSpin": 4057.180908203125, + "BackSpin": 4046.574462890625, + "SideSpin": 293.1766662597656, + "HLA": -3.420778512954712, + "VLA": 13.144353866577148, + "CarryDistance": 0 + }, + "ShotDataOptions": { + "ContainsBallData": true + } +} \ No newline at end of file diff --git a/assets/data/shot_session_3/shot_6i_43.json b/assets/data/shot_session_3/shot_6i_43.json new file mode 100644 index 0000000..d762787 --- /dev/null +++ b/assets/data/shot_session_3/shot_6i_43.json @@ -0,0 +1,15 @@ +{ + "BallData": { + "Speed": 94.06039428710938, + "SpinAxis": 1.7003158330917358, + "TotalSpin": 4616.18994140625, + "BackSpin": 4614.1572265625, + "SideSpin": 136.970458984375, + "HLA": -4.6828203201293945, + "VLA": 13.880871772766113, + "CarryDistance": 0 + }, + "ShotDataOptions": { + "ContainsBallData": true + } +} \ No newline at end of file diff --git a/assets/data/shot_session_3/shot_6i_44.json b/assets/data/shot_session_3/shot_6i_44.json new file mode 100644 index 0000000..376d506 --- /dev/null +++ b/assets/data/shot_session_3/shot_6i_44.json @@ -0,0 +1,15 @@ +{ + "BallData": { + "Speed": 114.95743560791016, + "SpinAxis": 15.0968599319458, + "TotalSpin": 2314.4580078125, + "BackSpin": 2234.578857421875, + "SideSpin": 602.8042602539062, + "HLA": -6.673015594482422, + "VLA": 9.460525512695312, + "CarryDistance": 0 + }, + "ShotDataOptions": { + "ContainsBallData": true + } +} \ No newline at end of file diff --git a/assets/data/shot_session_3/shot_6i_45.json b/assets/data/shot_session_3/shot_6i_45.json new file mode 100644 index 0000000..a059c42 --- /dev/null +++ b/assets/data/shot_session_3/shot_6i_45.json @@ -0,0 +1,15 @@ +{ + "BallData": { + "Speed": 109.31747436523438, + "SpinAxis": -10.873051643371582, + "TotalSpin": 2509.944091796875, + "BackSpin": 2464.884521484375, + "SideSpin": -473.459716796875, + "HLA": -8.999531745910645, + "VLA": 6.417369365692139, + "CarryDistance": 0 + }, + "ShotDataOptions": { + "ContainsBallData": true + } +} \ No newline at end of file diff --git a/assets/data/shot_session_3/shot_6i_46.json b/assets/data/shot_session_3/shot_6i_46.json new file mode 100644 index 0000000..d81689c --- /dev/null +++ b/assets/data/shot_session_3/shot_6i_46.json @@ -0,0 +1,15 @@ +{ + "BallData": { + "Speed": 116.33138275146484, + "SpinAxis": 10.673794746398926, + "TotalSpin": 3007.8779296875, + "BackSpin": 2955.83447265625, + "SideSpin": 557.1106567382812, + "HLA": 0.33850419521331787, + "VLA": 13.646748542785645, + "CarryDistance": 0 + }, + "ShotDataOptions": { + "ContainsBallData": true + } +} \ No newline at end of file diff --git a/assets/data/shot_session_3/shot_6i_47.json b/assets/data/shot_session_3/shot_6i_47.json new file mode 100644 index 0000000..f6b7bf9 --- /dev/null +++ b/assets/data/shot_session_3/shot_6i_47.json @@ -0,0 +1,15 @@ +{ + "BallData": { + "Speed": 99.47631072998047, + "SpinAxis": 4.693967342376709, + "TotalSpin": 4810.73583984375, + "BackSpin": 4794.6005859375, + "SideSpin": 393.6796875, + "HLA": -2.863499402999878, + "VLA": 14.783981323242188, + "CarryDistance": 0 + }, + "ShotDataOptions": { + "ContainsBallData": true + } +} \ No newline at end of file diff --git a/assets/data/shot_session_3/shot_6i_48.json b/assets/data/shot_session_3/shot_6i_48.json new file mode 100644 index 0000000..e58da3e --- /dev/null +++ b/assets/data/shot_session_3/shot_6i_48.json @@ -0,0 +1,15 @@ +{ + "BallData": { + "Speed": 101.73347473144531, + "SpinAxis": 4.2645134925842285, + "TotalSpin": 4630.994140625, + "BackSpin": 4618.1728515625, + "SideSpin": 344.3658142089844, + "HLA": -3.0343129634857178, + "VLA": 15.22943115234375, + "CarryDistance": 0 + }, + "ShotDataOptions": { + "ContainsBallData": true + } +} \ No newline at end of file diff --git a/assets/data/shot_session_3/shot_6i_49.json b/assets/data/shot_session_3/shot_6i_49.json new file mode 100644 index 0000000..3c0b643 --- /dev/null +++ b/assets/data/shot_session_3/shot_6i_49.json @@ -0,0 +1,15 @@ +{ + "BallData": { + "Speed": 71.25074768066406, + "SpinAxis": 30, + "TotalSpin": 2624.658447265625, + "BackSpin": 2273.02099609375, + "SideSpin": 1312.3292236328125, + "HLA": 16.047260284423828, + "VLA": 7.704961776733398, + "CarryDistance": 0 + }, + "ShotDataOptions": { + "ContainsBallData": true + } +} \ No newline at end of file diff --git a/assets/data/shot_session_3/shot_6i_50.json b/assets/data/shot_session_3/shot_6i_50.json new file mode 100644 index 0000000..5362d96 --- /dev/null +++ b/assets/data/shot_session_3/shot_6i_50.json @@ -0,0 +1,15 @@ +{ + "BallData": { + "Speed": 82.80308532714844, + "SpinAxis": 2.8091838359832764, + "TotalSpin": 3783.392578125, + "BackSpin": 3778.845947265625, + "SideSpin": 185.42356872558594, + "HLA": -1.4181873798370361, + "VLA": 14.85204792022705, + "CarryDistance": 0 + }, + "ShotDataOptions": { + "ContainsBallData": true + } +} \ No newline at end of file diff --git a/assets/data/shot_session_3/shot_7i_25.json b/assets/data/shot_session_3/shot_7i_25.json new file mode 100644 index 0000000..76af73a --- /dev/null +++ b/assets/data/shot_session_3/shot_7i_25.json @@ -0,0 +1,15 @@ +{ + "BallData": { + "Speed": 83.34427642822266, + "SpinAxis": 17.788898468017578, + "TotalSpin": 3409.548828125, + "BackSpin": 3246.533447265625, + "SideSpin": 1041.654052734375, + "HLA": 2.9794626235961914, + "VLA": 13.178397178649902, + "CarryDistance": 0 + }, + "ShotDataOptions": { + "ContainsBallData": true + } +} \ No newline at end of file diff --git a/assets/data/shot_session_3/shot_7i_26.json b/assets/data/shot_session_3/shot_7i_26.json new file mode 100644 index 0000000..40a74e5 --- /dev/null +++ b/assets/data/shot_session_3/shot_7i_26.json @@ -0,0 +1,15 @@ +{ + "BallData": { + "Speed": 73.36651611328125, + "SpinAxis": 30, + "TotalSpin": 3560.867919921875, + "BackSpin": 3083.802001953125, + "SideSpin": 1780.4339599609375, + "HLA": 15.397870063781738, + "VLA": 10.84724235534668, + "CarryDistance": 0 + }, + "ShotDataOptions": { + "ContainsBallData": true + } +} \ No newline at end of file diff --git a/assets/data/shot_session_3/shot_7i_27.json b/assets/data/shot_session_3/shot_7i_27.json new file mode 100644 index 0000000..f8d1dbc --- /dev/null +++ b/assets/data/shot_session_3/shot_7i_27.json @@ -0,0 +1,15 @@ +{ + "BallData": { + "Speed": 93.73928833007812, + "SpinAxis": 2.632032632827759, + "TotalSpin": 4611.6044921875, + "BackSpin": 4606.7392578125, + "SideSpin": 211.77169799804688, + "HLA": -1.4469140768051147, + "VLA": 17.06036376953125, + "CarryDistance": 0 + }, + "ShotDataOptions": { + "ContainsBallData": true + } +} \ No newline at end of file diff --git a/assets/data/shot_session_3/shot_7i_28.json b/assets/data/shot_session_3/shot_7i_28.json new file mode 100644 index 0000000..e10142c --- /dev/null +++ b/assets/data/shot_session_3/shot_7i_28.json @@ -0,0 +1,15 @@ +{ + "BallData": { + "Speed": 92.08656311035156, + "SpinAxis": -0.4406474828720093, + "TotalSpin": 4216.72216796875, + "BackSpin": 4216.59765625, + "SideSpin": -32.42943572998047, + "HLA": -3.5975778102874756, + "VLA": 16.409210205078125, + "CarryDistance": 0 + }, + "ShotDataOptions": { + "ContainsBallData": true + } +} \ No newline at end of file diff --git a/assets/data/shot_session_3/shot_7i_29.json b/assets/data/shot_session_3/shot_7i_29.json new file mode 100644 index 0000000..c63cc22 --- /dev/null +++ b/assets/data/shot_session_3/shot_7i_29.json @@ -0,0 +1,15 @@ +{ + "BallData": { + "Speed": 107.58966064453125, + "SpinAxis": 4.716331481933594, + "TotalSpin": 3633.266357421875, + "BackSpin": 3620.964111328125, + "SideSpin": 298.7365417480469, + "HLA": -6.054408550262451, + "VLA": 13.82080078125, + "CarryDistance": 0 + }, + "ShotDataOptions": { + "ContainsBallData": true + } +} \ No newline at end of file diff --git a/assets/data/shot_session_3/shot_7i_30.json b/assets/data/shot_session_3/shot_7i_30.json new file mode 100644 index 0000000..d5d8286 --- /dev/null +++ b/assets/data/shot_session_3/shot_7i_30.json @@ -0,0 +1,15 @@ +{ + "BallData": { + "Speed": 90.17376708984375, + "SpinAxis": -0.20976150035858154, + "TotalSpin": 4508.52734375, + "BackSpin": 4508.4970703125, + "SideSpin": -16.50581169128418, + "HLA": -3.8281779289245605, + "VLA": 17.55555534362793, + "CarryDistance": 0 + }, + "ShotDataOptions": { + "ContainsBallData": true + } +} \ No newline at end of file diff --git a/assets/data/shot_session_3/shot_7i_31.json b/assets/data/shot_session_3/shot_7i_31.json new file mode 100644 index 0000000..c66910b --- /dev/null +++ b/assets/data/shot_session_3/shot_7i_31.json @@ -0,0 +1,15 @@ +{ + "BallData": { + "Speed": 76.35610961914062, + "SpinAxis": 1.8421508073806763, + "TotalSpin": 5122.1640625, + "BackSpin": 5119.5166015625, + "SideSpin": 164.65737915039062, + "HLA": -0.5438334345817566, + "VLA": 17.519079208374023, + "CarryDistance": 0 + }, + "ShotDataOptions": { + "ContainsBallData": true + } +} \ No newline at end of file diff --git a/assets/data/shot_session_3/shot_7i_32.json b/assets/data/shot_session_3/shot_7i_32.json new file mode 100644 index 0000000..33465ff --- /dev/null +++ b/assets/data/shot_session_3/shot_7i_32.json @@ -0,0 +1,15 @@ +{ + "BallData": { + "Speed": 93.09901428222656, + "SpinAxis": 4.201261043548584, + "TotalSpin": 3762.546875, + "BackSpin": 3752.4365234375, + "SideSpin": 275.6447448730469, + "HLA": -1.0266743898391724, + "VLA": 16.958356857299805, + "CarryDistance": 0 + }, + "ShotDataOptions": { + "ContainsBallData": true + } +} \ No newline at end of file diff --git a/assets/data/shot_session_3/shot_7i_33.json b/assets/data/shot_session_3/shot_7i_33.json new file mode 100644 index 0000000..849a6c4 --- /dev/null +++ b/assets/data/shot_session_3/shot_7i_33.json @@ -0,0 +1,15 @@ +{ + "BallData": { + "Speed": 92.35597229003906, + "SpinAxis": 2.811332941055298, + "TotalSpin": 3851.744873046875, + "BackSpin": 3847.109130859375, + "SideSpin": 188.9178009033203, + "HLA": -0.5763412117958069, + "VLA": 16.959016799926758, + "CarryDistance": 0 + }, + "ShotDataOptions": { + "ContainsBallData": true + } +} \ No newline at end of file diff --git a/assets/data/shot_session_3/shot_7i_34.json b/assets/data/shot_session_3/shot_7i_34.json new file mode 100644 index 0000000..9021fcd --- /dev/null +++ b/assets/data/shot_session_3/shot_7i_34.json @@ -0,0 +1,15 @@ +{ + "BallData": { + "Speed": 104.19499206542969, + "SpinAxis": 1.8956630229949951, + "TotalSpin": 4081.22021484375, + "BackSpin": 4078.986572265625, + "SideSpin": 135.00482177734375, + "HLA": -4.631562232971191, + "VLA": 14.670660018920898, + "CarryDistance": 0 + }, + "ShotDataOptions": { + "ContainsBallData": true + } +} \ No newline at end of file diff --git a/assets/data/shot_session_3/shot_9i_1.json b/assets/data/shot_session_3/shot_9i_1.json new file mode 100644 index 0000000..222a8cc --- /dev/null +++ b/assets/data/shot_session_3/shot_9i_1.json @@ -0,0 +1,15 @@ +{ + "BallData": { + "Speed": 88.98261260986328, + "SpinAxis": 11.261311531066895, + "TotalSpin": 3563.205078125, + "BackSpin": 3494.601806640625, + "SideSpin": 695.8367309570312, + "HLA": -0.5036899447441101, + "VLA": 15.103304862976074, + "CarryDistance": 0 + }, + "ShotDataOptions": { + "ContainsBallData": true + } +} \ No newline at end of file diff --git a/assets/data/shot_session_3/shot_9i_2.json b/assets/data/shot_session_3/shot_9i_2.json new file mode 100644 index 0000000..3adcdda --- /dev/null +++ b/assets/data/shot_session_3/shot_9i_2.json @@ -0,0 +1,15 @@ +{ + "BallData": { + "Speed": 71.28638458251953, + "SpinAxis": 8.305668830871582, + "TotalSpin": 4085.5244140625, + "BackSpin": 4042.67333984375, + "SideSpin": 590.1707763671875, + "HLA": 5.505329608917236, + "VLA": 23.930543899536133, + "CarryDistance": 0 + }, + "ShotDataOptions": { + "ContainsBallData": true + } +} \ No newline at end of file diff --git a/assets/data/shot_session_3/shot_9i_3.json b/assets/data/shot_session_3/shot_9i_3.json new file mode 100644 index 0000000..3e166dd --- /dev/null +++ b/assets/data/shot_session_3/shot_9i_3.json @@ -0,0 +1,15 @@ +{ + "BallData": { + "Speed": 90.10971069335938, + "SpinAxis": 11.196942329406738, + "TotalSpin": 5243.0498046875, + "BackSpin": 5143.2509765625, + "SideSpin": 1018.1058959960938, + "HLA": 2.8021600246429443, + "VLA": 21.67161750793457, + "CarryDistance": 0 + }, + "ShotDataOptions": { + "ContainsBallData": true + } +} \ No newline at end of file diff --git a/assets/data/shot_session_3/shot_9i_4.json b/assets/data/shot_session_3/shot_9i_4.json new file mode 100644 index 0000000..f7ad358 --- /dev/null +++ b/assets/data/shot_session_3/shot_9i_4.json @@ -0,0 +1,15 @@ +{ + "BallData": { + "Speed": 95.73126220703125, + "SpinAxis": 6.028021335601807, + "TotalSpin": 2312.071044921875, + "BackSpin": 2299.286865234375, + "SideSpin": 242.8017578125, + "HLA": -6.780673027038574, + "VLA": 4.748410701751709, + "CarryDistance": 0 + }, + "ShotDataOptions": { + "ContainsBallData": true + } +} \ No newline at end of file diff --git a/assets/data/shot_session_3/shot_9i_5.json b/assets/data/shot_session_3/shot_9i_5.json new file mode 100644 index 0000000..b2b6bfa --- /dev/null +++ b/assets/data/shot_session_3/shot_9i_5.json @@ -0,0 +1,15 @@ +{ + "BallData": { + "Speed": 84.02252960205078, + "SpinAxis": 11.480364799499512, + "TotalSpin": 5352.05859375, + "BackSpin": 5244.97998046875, + "SideSpin": 1065.2314453125, + "HLA": 3.8161818981170654, + "VLA": 19.373619079589844, + "CarryDistance": 0 + }, + "ShotDataOptions": { + "ContainsBallData": true + } +} \ No newline at end of file diff --git a/assets/data/shot_session_3/shot_9i_6.json b/assets/data/shot_session_3/shot_9i_6.json new file mode 100644 index 0000000..ae92b47 --- /dev/null +++ b/assets/data/shot_session_3/shot_9i_6.json @@ -0,0 +1,15 @@ +{ + "BallData": { + "Speed": 94.70030212402344, + "SpinAxis": 28.95497703552246, + "TotalSpin": 2200.49462890625, + "BackSpin": 1925.4337158203125, + "SideSpin": 1065.308349609375, + "HLA": 3.677737236022949, + "VLA": 0, + "CarryDistance": 0 + }, + "ShotDataOptions": { + "ContainsBallData": true + } +} \ No newline at end of file diff --git a/assets/data/shot_session_3/shot_9i_7.json b/assets/data/shot_session_3/shot_9i_7.json new file mode 100644 index 0000000..ad73556 --- /dev/null +++ b/assets/data/shot_session_3/shot_9i_7.json @@ -0,0 +1,15 @@ +{ + "BallData": { + "Speed": 83.02562713623047, + "SpinAxis": 9.702858924865723, + "TotalSpin": 7008.54296875, + "BackSpin": 6908.2861328125, + "SideSpin": 1181.209716796875, + "HLA": 5.2613043785095215, + "VLA": 22.507925033569336, + "CarryDistance": 0 + }, + "ShotDataOptions": { + "ContainsBallData": true + } +} \ No newline at end of file diff --git a/assets/data/shot_session_3/shot_9i_8.json b/assets/data/shot_session_3/shot_9i_8.json new file mode 100644 index 0000000..9d63463 --- /dev/null +++ b/assets/data/shot_session_3/shot_9i_8.json @@ -0,0 +1,15 @@ +{ + "BallData": { + "Speed": 92.2085189819336, + "SpinAxis": 0.7292595505714417, + "TotalSpin": 5042.2568359375, + "BackSpin": 5041.8486328125, + "SideSpin": 64.17601013183594, + "HLA": -6.307239055633545, + "VLA": 21.950105667114258, + "CarryDistance": 0 + }, + "ShotDataOptions": { + "ContainsBallData": true + } +} \ No newline at end of file diff --git a/assets/data/shot_session_3/shot_9i_9.json b/assets/data/shot_session_3/shot_9i_9.json new file mode 100644 index 0000000..4b362ed --- /dev/null +++ b/assets/data/shot_session_3/shot_9i_9.json @@ -0,0 +1,15 @@ +{ + "BallData": { + "Speed": 90.05659484863281, + "SpinAxis": 1.2128459215164185, + "TotalSpin": 5351.11767578125, + "BackSpin": 5349.9189453125, + "SideSpin": 113.26482391357422, + "HLA": -3.085085391998291, + "VLA": 22.136898040771484, + "CarryDistance": 0 + }, + "ShotDataOptions": { + "ContainsBallData": true + } +} \ No newline at end of file diff --git a/assets/data/shot_session_3/shot_diff_analysis.csv b/assets/data/shot_session_3/shot_diff_analysis.csv new file mode 100644 index 0000000..17b4314 --- /dev/null +++ b/assets/data/shot_session_3/shot_diff_analysis.csv @@ -0,0 +1,70 @@ +shot_name,speed_mph,vla_deg,hla_deg,total_spin_rpm,spin_axis_deg,physics_carry_yd,flightscope_carry_yd,diff_carry_yd,physics_total_yd,flightscope_total_yd,diff_total_yd,rollout_physics_yd,rollout_flightscope_yd,diff_rollout_yd,physics_apex_ft,flightscope_apex_ft,diff_apex_ft,status +shot_3w_18,47.9,45.8,34.0,7491,30.0,36.7,,,41.7,,,5.0,,,34.7,,, +shot_3w_19,121.3,5.6,-4.8,1662,-11.9,120.5,120.6,-0.1,182.5,165.8,16.7,62.0,45.2,16.8,12.3,12.2,0.1,severe +shot_3w_20,116.0,4.4,2.3,2026,10.0,103.0,,,162.9,,,59.9,,,8.2,,, +shot_3w_21,119.4,5.3,-3.4,1760,-10.5,115.7,114.6,1.1,177.1,160.5,16.6,61.4,45.9,15.5,11.2,10.9,0.3,severe +shot_3w_22,108.9,5.6,-7.2,2501,-1.8,106.3,103.2,3.1,161.5,141.3,20.2,55.2,38.1,17.1,11.0,10.5,0.5,severe +shot_3w_23,115.8,8.9,-0.8,2804,2.2,148.5,147.7,0.8,148.2,170.9,-22.7,-0.3,23.2,-23.5,26.8,28.0,-1.2,severe +shot_3w_24,123.4,6.3,-5.4,2752,-13.3,153.8,145.9,7.9,206.3,176.7,29.6,52.5,30.8,21.7,21.7,19.8,1.9,severe +shot_5i_10,88.0,14.2,1.2,4065,8.4,106.1,103.1,3.0,109.6,116.7,-7.1,3.5,13.6,-10.1,34.3,28.4,5.9,moderate +shot_5i_11,90.6,14.4,-0.2,3360,7.8,105.6,108.8,-3.2,106.9,124.1,-17.2,1.3,15.3,-14.0,28.5,29.8,-1.3,severe +shot_5i_12,74.2,10.2,-1.7,3321,15.8,59.6,58.4,1.2,58.4,81.9,-23.5,-1.2,23.5,-24.7,10.5,9.4,1.1,severe +shot_5i_13,75.0,8.0,2.5,3921,3.4,56.5,53.9,2.6,89.0,78.9,10.1,32.5,25.0,7.5,7.4,6.8,0.6,severe +shot_5i_14,87.7,4.5,-7.7,3390,1.8,54.4,,,98.1,,,43.7,,,4.0,,, +shot_5i_15,86.9,9.3,-4.0,2509,-4.9,74.1,78.6,-4.5,121.3,106.6,14.7,47.2,28.0,19.2,11.0,12.1,-1.1,severe +shot_5i_16,98.0,9.1,-2.1,3776,1.7,110.2,109.1,1.1,109.2,130.0,-20.8,-1.0,20.9,-21.9,19.5,19.7,-0.2,severe +shot_5i_17,56.5,10.0,24.1,5178,29.1,28.6,30.6,-2.0,45.0,46.9,-1.9,16.4,16.3,0.1,4.2,4.5,-0.3,pass +shot_6i_35,80.5,15.3,-1.3,4667,-0.0,84.9,90.0,-5.1,84.9,101.5,-16.6,0.0,11.5,-11.5,23.1,26.4,-3.3,severe +shot_6i_36,78.9,10.4,16.1,4166,25.1,69.9,67.8,2.1,68.3,89.1,-20.8,-1.6,21.3,-22.9,12.4,11.8,0.6,severe +shot_6i_37,82.6,10.2,11.0,3041,25.4,67.9,71.5,-3.6,109.4,97.2,12.2,41.5,25.7,15.8,11.0,11.8,-0.8,severe +shot_6i_38,79.1,13.3,3.0,3187,11.6,76.0,79.2,-3.2,76.2,97.5,-21.3,0.2,18.3,-18.1,18.1,18.0,0.1,severe +shot_6i_39,61.0,6.1,10.3,3285,22.0,23.5,24.0,-0.5,53.7,47.3,6.4,30.2,23.3,6.9,2.1,2.1,0.0,moderate +shot_6i_40,62.1,6.8,27.0,2768,30.0,25.0,26.2,-1.2,58.9,51.1,7.8,33.9,24.9,9.0,2.6,2.5,0.1,moderate +shot_6i_41,82.5,9.9,-2.3,2620,13.6,66.7,71.3,-4.6,111.1,97.9,13.2,44.4,26.6,17.8,10.3,11.3,-1.0,severe +shot_6i_42,77.2,13.1,-3.4,4057,4.1,75.5,76.6,-1.1,75.5,92.9,-17.4,0.0,16.3,-16.3,18.3,17.5,0.8,severe +shot_6i_43,94.1,13.9,-4.7,4616,1.7,123.7,117.3,6.4,129.5,128.6,0.9,5.8,11.3,-5.5,43.1,35.0,8.1,moderate +shot_6i_44,115.0,9.5,-6.7,2314,15.1,141.1,142.3,-1.2,140.8,168.2,-27.4,-0.3,25.9,-26.2,25.3,26.6,-1.3,severe +shot_6i_45,109.3,6.4,-9.0,2510,-10.9,113.1,109.6,3.5,166.5,145.4,21.1,53.4,35.8,17.6,13.5,12.9,0.6,severe +shot_6i_46,116.3,13.7,0.3,3008,10.7,171.1,167.3,3.8,175.8,179.3,-3.5,4.7,12.0,-7.3,50.1,51.6,-1.5,moderate +shot_6i_47,99.5,14.8,-2.9,4811,4.7,138.2,131.2,7.0,148.5,137.7,10.8,10.3,6.5,3.8,56.8,45.0,11.8,severe +shot_6i_48,101.7,15.2,-3.0,4631,4.3,143.2,137.1,6.1,154.6,143.5,11.1,11.4,6.4,5.0,63.1,48.9,14.2,severe +shot_6i_49,71.2,7.7,16.1,2625,30.0,37.4,39.9,-2.5,77.3,70.3,7.0,39.9,30.4,9.5,4.2,4.5,-0.3,moderate +shot_6i_50,82.8,14.8,-1.4,3783,2.8,92.8,93.2,-0.4,95.3,107.4,-12.1,2.5,14.2,-11.7,29.5,25.6,3.9,severe +shot_7i_25,83.3,13.2,3.0,3410,17.8,86.4,86.9,-0.5,86.8,104.8,-18.0,0.4,17.9,-17.5,21.0,20.1,0.9,severe +shot_7i_26,73.4,10.8,15.4,3561,30.0,58.4,56.6,1.8,57.5,79.3,-21.8,-0.9,22.7,-23.6,10.7,9.6,1.1,severe +shot_7i_27,93.7,17.1,-1.4,4612,2.6,124.1,122.3,1.8,132.6,128.3,4.3,8.5,6.0,2.5,54.0,46.0,8.0,pass +shot_7i_28,92.1,16.4,-3.6,4217,-0.4,119.1,117.9,1.2,126.8,125.6,1.2,7.7,7.7,0.0,48.9,40.6,8.3,pass +shot_7i_29,107.6,13.8,-6.0,3633,4.7,149.4,148.4,1.0,152.5,158.3,-5.8,3.1,9.9,-6.8,42.8,46.3,-3.5,moderate +shot_7i_30,90.2,17.6,-3.8,4508,-0.2,115.2,115.4,-0.2,123.2,121.7,1.5,8.0,6.3,1.7,48.6,43.1,5.5,pass +shot_7i_31,76.4,17.5,-0.5,5122,1.8,80.2,85.0,-4.8,80.2,94.5,-14.3,0.0,9.5,-9.5,24.3,28.4,-4.1,severe +shot_7i_32,93.1,17.0,-1.0,3762,4.2,119.4,121.2,-1.8,127.6,129.8,-2.2,8.2,8.6,-0.4,45.6,42.5,3.1,pass +shot_7i_33,92.4,17.0,-0.6,3852,2.8,118.1,119.7,-1.6,126.7,128.0,-1.3,8.6,8.3,0.3,46.7,42.0,4.7,pass +shot_7i_34,104.2,14.7,-4.6,4081,1.9,146.9,142.5,4.4,153.2,150.6,2.6,6.3,8.1,-1.8,51.3,48.2,3.1,moderate +shot_9i_1,89.0,15.1,-0.5,3563,11.3,105.3,106.7,-1.4,108.2,120.8,-12.6,2.9,14.1,-11.2,32.1,30.8,1.3,severe +shot_9i_2,71.3,23.9,5.5,4086,8.3,74.1,82.1,-8.0,78.3,87.4,-9.1,4.2,5.3,-1.1,33.8,36.8,-3.0,severe +shot_9i_3,90.1,21.7,2.8,5243,11.2,115.9,117.3,-1.4,121.8,120.7,1.1,5.9,3.4,2.5,52.4,57.7,-5.3,pass +shot_9i_4,95.7,4.8,-6.8,2312,6.0,63.8,,,118.0,,,54.2,,,4.8,,, +shot_9i_5,84.0,19.4,3.8,5352,11.5,100.1,102.7,-2.6,101.7,107.2,-5.5,1.6,4.5,-2.9,36.3,41.8,-5.5,moderate +shot_9i_6,94.7,0.0,3.7,2200,28.9,4.2,,,70.0,,,65.8,,,0.1,,, +shot_9i_7,83.0,22.5,5.3,7008,9.7,102.2,101.1,1.1,104.2,102.6,1.6,2.0,1.5,0.5,47.3,51.5,-4.2,pass +shot_9i_8,92.2,21.9,-6.3,5042,0.7,121.3,122.9,-1.6,130.5,126.4,4.1,9.2,3.5,5.7,61.1,62.6,-1.5,pass +shot_9i_9,90.1,22.1,-3.1,5351,1.2,116.9,118.1,-1.2,123.0,121.1,1.9,6.1,3.0,3.1,54.0,60.1,-6.1,pass +shot_driver_51,116.2,21.7,2.2,6409,3.2,174.3,162.9,11.4,193.9,164.3,29.6,19.6,1.4,18.2,109.3,108.7,0.6,severe +shot_driver_52,102.1,31.3,3.1,8442,6.3,133.9,124.5,9.4,149.4,124.1,25.3,15.5,-0.4,15.9,117.9,119.3,-1.4,severe +shot_driver_53,97.2,30.6,2.2,8926,6.0,124.1,117.6,6.5,135.0,117.1,17.9,10.9,-0.5,11.4,102.0,105.8,-3.8,severe +shot_driver_54,121.5,12.9,-5.3,3411,-10.0,183.6,178.2,5.4,188.7,188.7,0.0,5.1,10.5,-5.4,54.3,56.5,-2.2,moderate +shot_driver_55,117.5,7.5,-8.3,2150,-27.2,128.1,125.6,2.5,184.4,161.8,22.6,56.3,36.2,20.1,17.6,17.2,0.4,severe +shot_driver_56,118.7,17.1,-1.8,4554,2.8,181.4,176.6,4.8,201.6,180.9,20.7,20.2,4.3,15.9,92.9,83.2,9.7,severe +shot_driver_57,120.9,14.1,-5.2,1544,-8.0,172.5,177.6,-5.1,177.3,197.0,-19.7,4.8,19.4,-14.6,47.4,50.9,-3.5,severe +shot_driver_58,119.3,23.6,2.5,7093,3.3,181.2,163.2,18.0,200.9,163.9,37.0,19.7,0.7,19.0,120.9,125.7,-4.8,severe +shot_driver_59,81.0,44.9,8.9,6735,12.4,82.8,83.7,-0.9,100.9,83.2,17.7,18.1,-0.5,18.6,104.0,107.8,-3.8,severe +shot_driver_60,107.4,11.7,-8.6,3269,-14.8,138.5,138.5,0.0,138.9,153.8,-14.9,0.4,15.3,-14.9,31.6,34.0,-2.4,severe +shot_pw_61,31.9,25.4,-1.3,3868,-0.0,16.0,,,26.8,,,10.8,,,6.0,,, +shot_pw_62,39.6,23.7,0.6,3844,2.1,23.7,,,37.9,,,14.2,,,8.7,,, +shot_pw_63,37.1,24.0,1.8,3914,-0.0,20.9,,,33.6,,,12.7,,,7.6,,, +shot_pw_64,69.6,28.6,0.2,5327,5.1,75.7,80.1,-4.4,92.0,82.4,9.6,16.3,2.3,14.0,42.7,46.4,-3.7,moderate +shot_pw_65,81.2,28.4,2.9,6959,9.4,98.4,98.5,-0.1,104.1,99.4,4.7,5.7,0.9,4.8,61.8,65.6,-3.8,pass +shot_pw_66,75.7,27.3,-1.2,6605,4.0,87.1,89.7,-2.6,102.1,90.8,11.3,15.0,1.1,13.9,49.8,53.5,-3.7,severe +shot_pw_67,81.7,28.1,6.3,6510,12.7,100.0,100.0,0.0,106.8,101.1,5.7,6.8,1.1,5.7,61.0,65.0,-4.0,moderate +shot_pw_68,88.5,23.4,-0.1,6637,6.0,116.1,112.7,3.4,120.2,114.1,6.1,4.1,1.4,2.7,57.2,63.4,-6.2,moderate +shot_pw_69,74.1,23.6,0.2,5880,8.4,83.2,86.0,-2.8,84.9,88.8,-3.9,1.7,2.8,-1.1,37.4,41.2,-3.8,pass diff --git a/assets/data/shot_session_3/shot_driver_51.json b/assets/data/shot_session_3/shot_driver_51.json new file mode 100644 index 0000000..0c78288 --- /dev/null +++ b/assets/data/shot_session_3/shot_driver_51.json @@ -0,0 +1,15 @@ +{ + "BallData": { + "Speed": 116.16547393798828, + "SpinAxis": 3.2259302139282227, + "TotalSpin": 6408.99853515625, + "BackSpin": 6398.8427734375, + "SideSpin": 360.6558837890625, + "HLA": 2.1719987392425537, + "VLA": 21.736244201660156, + "CarryDistance": 0 + }, + "ShotDataOptions": { + "ContainsBallData": true + } +} \ No newline at end of file diff --git a/assets/data/shot_session_3/shot_driver_52.json b/assets/data/shot_session_3/shot_driver_52.json new file mode 100644 index 0000000..97bccfc --- /dev/null +++ b/assets/data/shot_session_3/shot_driver_52.json @@ -0,0 +1,15 @@ +{ + "BallData": { + "Speed": 102.10639953613281, + "SpinAxis": 6.263795852661133, + "TotalSpin": 8442.173828125, + "BackSpin": 8391.7744140625, + "SideSpin": 921.0936889648438, + "HLA": 3.0872905254364014, + "VLA": 31.329727172851562, + "CarryDistance": 0 + }, + "ShotDataOptions": { + "ContainsBallData": true + } +} \ No newline at end of file diff --git a/assets/data/shot_session_3/shot_driver_53.json b/assets/data/shot_session_3/shot_driver_53.json new file mode 100644 index 0000000..c303133 --- /dev/null +++ b/assets/data/shot_session_3/shot_driver_53.json @@ -0,0 +1,15 @@ +{ + "BallData": { + "Speed": 97.23294830322266, + "SpinAxis": 5.987576961517334, + "TotalSpin": 8925.802734375, + "BackSpin": 8877.1083984375, + "SideSpin": 931.07568359375, + "HLA": 2.234292507171631, + "VLA": 30.626953125, + "CarryDistance": 0 + }, + "ShotDataOptions": { + "ContainsBallData": true + } +} \ No newline at end of file diff --git a/assets/data/shot_session_3/shot_driver_54.json b/assets/data/shot_session_3/shot_driver_54.json new file mode 100644 index 0000000..b82697a --- /dev/null +++ b/assets/data/shot_session_3/shot_driver_54.json @@ -0,0 +1,15 @@ +{ + "BallData": { + "Speed": 121.50360870361328, + "SpinAxis": -9.969074249267578, + "TotalSpin": 3410.91943359375, + "BackSpin": 3359.419189453125, + "SideSpin": -590.4867553710938, + "HLA": -5.258639812469482, + "VLA": 12.884439468383789, + "CarryDistance": 0 + }, + "ShotDataOptions": { + "ContainsBallData": true + } +} \ No newline at end of file diff --git a/assets/data/shot_session_3/shot_driver_55.json b/assets/data/shot_session_3/shot_driver_55.json new file mode 100644 index 0000000..9e38653 --- /dev/null +++ b/assets/data/shot_session_3/shot_driver_55.json @@ -0,0 +1,15 @@ +{ + "BallData": { + "Speed": 117.4796371459961, + "SpinAxis": -27.1912899017334, + "TotalSpin": 2149.954833984375, + "BackSpin": 1912.3543701171875, + "SideSpin": -982.44921875, + "HLA": -8.326677322387695, + "VLA": 7.477628231048584, + "CarryDistance": 0 + }, + "ShotDataOptions": { + "ContainsBallData": true + } +} \ No newline at end of file diff --git a/assets/data/shot_session_3/shot_driver_56.json b/assets/data/shot_session_3/shot_driver_56.json new file mode 100644 index 0000000..6d7da5e --- /dev/null +++ b/assets/data/shot_session_3/shot_driver_56.json @@ -0,0 +1,15 @@ +{ + "BallData": { + "Speed": 118.70352935791016, + "SpinAxis": 2.805424213409424, + "TotalSpin": 4553.8095703125, + "BackSpin": 4548.35205078125, + "SideSpin": 222.88314819335938, + "HLA": -1.8021036386489868, + "VLA": 17.121259689331055, + "CarryDistance": 0 + }, + "ShotDataOptions": { + "ContainsBallData": true + } +} \ No newline at end of file diff --git a/assets/data/shot_session_3/shot_driver_57.json b/assets/data/shot_session_3/shot_driver_57.json new file mode 100644 index 0000000..b08cec1 --- /dev/null +++ b/assets/data/shot_session_3/shot_driver_57.json @@ -0,0 +1,15 @@ +{ + "BallData": { + "Speed": 120.92591094970703, + "SpinAxis": -7.955880641937256, + "TotalSpin": 1544.0667724609375, + "BackSpin": 1529.205078125, + "SideSpin": -213.715087890625, + "HLA": -5.161539554595947, + "VLA": 14.096846580505371, + "CarryDistance": 0 + }, + "ShotDataOptions": { + "ContainsBallData": true + } +} \ No newline at end of file diff --git a/assets/data/shot_session_3/shot_driver_58.json b/assets/data/shot_session_3/shot_driver_58.json new file mode 100644 index 0000000..8c00656 --- /dev/null +++ b/assets/data/shot_session_3/shot_driver_58.json @@ -0,0 +1,15 @@ +{ + "BallData": { + "Speed": 119.27122497558594, + "SpinAxis": 3.2609012126922607, + "TotalSpin": 7093.390625, + "BackSpin": 7081.9052734375, + "SideSpin": 403.49151611328125, + "HLA": 2.4788992404937744, + "VLA": 23.59177589416504, + "CarryDistance": 0 + }, + "ShotDataOptions": { + "ContainsBallData": true + } +} \ No newline at end of file diff --git a/assets/data/shot_session_3/shot_driver_59.json b/assets/data/shot_session_3/shot_driver_59.json new file mode 100644 index 0000000..8703cf5 --- /dev/null +++ b/assets/data/shot_session_3/shot_driver_59.json @@ -0,0 +1,15 @@ +{ + "BallData": { + "Speed": 80.9592056274414, + "SpinAxis": 12.36318302154541, + "TotalSpin": 6735.0009765625, + "BackSpin": 6578.81689453125, + "SideSpin": 1442.0155029296875, + "HLA": 8.870377540588379, + "VLA": 44.9072151184082, + "CarryDistance": 0 + }, + "ShotDataOptions": { + "ContainsBallData": true + } +} \ No newline at end of file diff --git a/assets/data/shot_session_3/shot_driver_60.json b/assets/data/shot_session_3/shot_driver_60.json new file mode 100644 index 0000000..a6aee6d --- /dev/null +++ b/assets/data/shot_session_3/shot_driver_60.json @@ -0,0 +1,15 @@ +{ + "BallData": { + "Speed": 107.3879165649414, + "SpinAxis": -14.801515579223633, + "TotalSpin": 3268.56591796875, + "BackSpin": 3160.10400390625, + "SideSpin": -835.02490234375, + "HLA": -8.616562843322754, + "VLA": 11.672699928283691, + "CarryDistance": 0 + }, + "ShotDataOptions": { + "ContainsBallData": true + } +} \ No newline at end of file diff --git a/assets/data/shot_session_3/shot_pw_61.json b/assets/data/shot_session_3/shot_pw_61.json new file mode 100644 index 0000000..09cfc49 --- /dev/null +++ b/assets/data/shot_session_3/shot_pw_61.json @@ -0,0 +1,15 @@ +{ + "BallData": { + "Speed": 31.893327713012695, + "SpinAxis": -0, + "TotalSpin": 3867.899169921875, + "BackSpin": 3867.899169921875, + "SideSpin": -0, + "HLA": -1.259826421737671, + "VLA": 25.35186195373535, + "CarryDistance": 0 + }, + "ShotDataOptions": { + "ContainsBallData": true + } +} \ No newline at end of file diff --git a/assets/data/shot_session_3/shot_pw_62.json b/assets/data/shot_session_3/shot_pw_62.json new file mode 100644 index 0000000..2b518e6 --- /dev/null +++ b/assets/data/shot_session_3/shot_pw_62.json @@ -0,0 +1,15 @@ +{ + "BallData": { + "Speed": 39.62671661376953, + "SpinAxis": 2.082167387008667, + "TotalSpin": 3843.46923828125, + "BackSpin": 3840.931640625, + "SideSpin": 139.64352416992188, + "HLA": 0.6018989086151123, + "VLA": 23.693159103393555, + "CarryDistance": 0 + }, + "ShotDataOptions": { + "ContainsBallData": true + } +} \ No newline at end of file diff --git a/assets/data/shot_session_3/shot_pw_63.json b/assets/data/shot_session_3/shot_pw_63.json new file mode 100644 index 0000000..84b1d6c --- /dev/null +++ b/assets/data/shot_session_3/shot_pw_63.json @@ -0,0 +1,15 @@ +{ + "BallData": { + "Speed": 37.149356842041016, + "SpinAxis": -0, + "TotalSpin": 3913.80419921875, + "BackSpin": 3913.80419921875, + "SideSpin": -0, + "HLA": 1.8256330490112305, + "VLA": 24.00528335571289, + "CarryDistance": 0 + }, + "ShotDataOptions": { + "ContainsBallData": true + } +} \ No newline at end of file diff --git a/assets/data/shot_session_3/shot_pw_64.json b/assets/data/shot_session_3/shot_pw_64.json new file mode 100644 index 0000000..62398fc --- /dev/null +++ b/assets/data/shot_session_3/shot_pw_64.json @@ -0,0 +1,15 @@ +{ + "BallData": { + "Speed": 69.62680053710938, + "SpinAxis": 5.097789764404297, + "TotalSpin": 5327.2353515625, + "BackSpin": 5306.16357421875, + "SideSpin": 473.35614013671875, + "HLA": 0.15743345022201538, + "VLA": 28.56521987915039, + "CarryDistance": 0 + }, + "ShotDataOptions": { + "ContainsBallData": true + } +} \ No newline at end of file diff --git a/assets/data/shot_session_3/shot_pw_65.json b/assets/data/shot_session_3/shot_pw_65.json new file mode 100644 index 0000000..b303bf8 --- /dev/null +++ b/assets/data/shot_session_3/shot_pw_65.json @@ -0,0 +1,15 @@ +{ + "BallData": { + "Speed": 81.2490463256836, + "SpinAxis": 9.383454322814941, + "TotalSpin": 6959.42578125, + "BackSpin": 6866.3037109375, + "SideSpin": 1134.672119140625, + "HLA": 2.8924813270568848, + "VLA": 28.376514434814453, + "CarryDistance": 0 + }, + "ShotDataOptions": { + "ContainsBallData": true + } +} \ No newline at end of file diff --git a/assets/data/shot_session_3/shot_pw_66.json b/assets/data/shot_session_3/shot_pw_66.json new file mode 100644 index 0000000..3b224e2 --- /dev/null +++ b/assets/data/shot_session_3/shot_pw_66.json @@ -0,0 +1,15 @@ +{ + "BallData": { + "Speed": 75.70809173583984, + "SpinAxis": 3.994753360748291, + "TotalSpin": 6605.00732421875, + "BackSpin": 6588.9599609375, + "SideSpin": 460.138671875, + "HLA": -1.1749275922775269, + "VLA": 27.31566047668457, + "CarryDistance": 0 + }, + "ShotDataOptions": { + "ContainsBallData": true + } +} \ No newline at end of file diff --git a/assets/data/shot_session_3/shot_pw_67.json b/assets/data/shot_session_3/shot_pw_67.json new file mode 100644 index 0000000..45f4169 --- /dev/null +++ b/assets/data/shot_session_3/shot_pw_67.json @@ -0,0 +1,15 @@ +{ + "BallData": { + "Speed": 81.65978240966797, + "SpinAxis": 12.735650062561035, + "TotalSpin": 6509.591796875, + "BackSpin": 6349.43994140625, + "SideSpin": 1435.06005859375, + "HLA": 6.339990615844727, + "VLA": 28.12111473083496, + "CarryDistance": 0 + }, + "ShotDataOptions": { + "ContainsBallData": true + } +} \ No newline at end of file diff --git a/assets/data/shot_session_3/shot_pw_68.json b/assets/data/shot_session_3/shot_pw_68.json new file mode 100644 index 0000000..e71af03 --- /dev/null +++ b/assets/data/shot_session_3/shot_pw_68.json @@ -0,0 +1,15 @@ +{ + "BallData": { + "Speed": 88.55177307128906, + "SpinAxis": 6.043060302734375, + "TotalSpin": 6637.41455078125, + "BackSpin": 6600.53076171875, + "SideSpin": 698.759521484375, + "HLA": -0.05428417772054672, + "VLA": 23.366304397583008, + "CarryDistance": 0 + }, + "ShotDataOptions": { + "ContainsBallData": true + } +} \ No newline at end of file diff --git a/assets/data/shot_session_3/shot_pw_69.json b/assets/data/shot_session_3/shot_pw_69.json new file mode 100644 index 0000000..681c064 --- /dev/null +++ b/assets/data/shot_session_3/shot_pw_69.json @@ -0,0 +1,15 @@ +{ + "BallData": { + "Speed": 74.05879211425781, + "SpinAxis": 8.452945709228516, + "TotalSpin": 5880.3515625, + "BackSpin": 5816.47265625, + "SideSpin": 864.394775390625, + "HLA": 0.17648263275623322, + "VLA": 23.611677169799805, + "CarryDistance": 0 + }, + "ShotDataOptions": { + "ContainsBallData": true + } +} \ No newline at end of file diff --git a/run_benchmarks.gd b/run_benchmarks.gd index 5ded522..a26dc0c 100644 --- a/run_benchmarks.gd +++ b/run_benchmarks.gd @@ -13,7 +13,6 @@ var shots := { "Wedge S2": "res://assets/data/wedge_shot_2.json", "Bump": "res://assets/data/bump_test_shot.json", "Bump & Run": "res://assets/data/bump_and_run.json", - "Approach": "res://assets/data/approach_test_shot.json", "Mid Iron": "res://assets/data/approach_mid_iron_test_shot.json", "Topped": "res://assets/data/topped_test_shot.json", "Checked": "res://assets/data/checked_test_shot.json", diff --git a/tests/PhysicsTests/ApproachShotTests.cs b/tests/PhysicsTests/ApproachShotTests.cs index c2e8b64..9334718 100644 --- a/tests/PhysicsTests/ApproachShotTests.cs +++ b/tests/PhysicsTests/ApproachShotTests.cs @@ -7,8 +7,6 @@ namespace OpenFairway.Tests [TestFixture] public class ApproachShotTests { - private const string SHOT_PATH = "res://assets/data/approach_test_shot.json"; - private readonly PhysicsAdapter _adapter = new(); private Dictionary LoadJson(string path) @@ -27,25 +25,6 @@ private Dictionary LoadJson(string path) return (Dictionary)data; } - [Test] - public void TestApproachShotCarryAndTotal() - { - var shot = LoadJson(SHOT_PATH); - - var result = _adapter.SimulateShotFromJson(shot); - - Assert.That(result.ContainsKey("carry_yd"), Is.True, "Result missing carry_yd"); - Assert.That(result.ContainsKey("total_yd"), Is.True, "Result missing total_yd"); - - float carry = (float)result["carry_yd"]; - float total = (float)result["total_yd"]; - - // Replace these with your expected ranges once you see real output. - // Start wide, then tighten. - Assert.That(carry, Is.InRange(10.0f, 200.0f), "Carry out of expected range"); - Assert.That(total, Is.InRange(carry, 260.0f), "Total out of expected range (should be >= carry)"); - } - [Test] public void TestWoodLowShotBounce() { diff --git a/tests/PhysicsTests/DistanceBenchmarkTests.cs b/tests/PhysicsTests/DistanceBenchmarkTests.cs index 7e30c8a..dc3c579 100644 --- a/tests/PhysicsTests/DistanceBenchmarkTests.cs +++ b/tests/PhysicsTests/DistanceBenchmarkTests.cs @@ -69,18 +69,7 @@ public void WoodLowShot_Benchmark() tolerance: 10.0f); } - [Test] - public void ApproachShot_Benchmark() - { - // 81 mph, 10478 RPM, 30.5° VLA (high spin wedge) - // Should check up and stop quickly - AssertDistance("Approach Shot", "approach_test_shot.json", - targetCarry: 106.4f, - targetTotal: 108.9f, // Updated 2026-02-18 after surface retuning - tolerance: 5.0f); - } - - [Test] +[Test] public void DriveShot_Benchmark() { // Full driver shot @@ -108,7 +97,6 @@ public void RunFullBenchmark() ChipShot_Benchmark(); WoodLowShot_Benchmark(); - ApproachShot_Benchmark(); DriveShot_Benchmark(); FlopShot_Benchmark(); diff --git a/tests/PhysicsTests/FlightScopeCarryRegressionTests.cs b/tests/PhysicsTests/FlightScopeCarryRegressionTests.cs index 14dea4e..4f1b9e9 100644 --- a/tests/PhysicsTests/FlightScopeCarryRegressionTests.cs +++ b/tests/PhysicsTests/FlightScopeCarryRegressionTests.cs @@ -26,8 +26,6 @@ public static IEnumerable CarryCases() .SetName("Drive_CarryMatchesFlightScope"); yield return new TestCaseData("Wood Low", "wood_low_test_shot.json", 122.2f, 0.0f, false) .SetName("WoodLow_CarryMatchesFlightScope"); - yield return new TestCaseData("Approach", "approach_test_shot.json", 92.3f, 72.4f, true) - .SetName("Approach_CarryMatchesFlightScope"); yield return new TestCaseData("Approach Mid Iron", "approach_mid_iron_test_shot.json", 125.8f, 69.3f, true) .SetName("ApproachMidIron_CarryMatchesFlightScope"); yield return new TestCaseData("Wedge", "wedge_test_shot.json", 70.6f, 31.2f, true) diff --git a/tests/PhysicsTests/GarminCarryWindowRegressionTests.cs b/tests/PhysicsTests/GarminCarryWindowRegressionTests.cs index 8b2c0e3..a1af7aa 100644 --- a/tests/PhysicsTests/GarminCarryWindowRegressionTests.cs +++ b/tests/PhysicsTests/GarminCarryWindowRegressionTests.cs @@ -118,7 +118,6 @@ public static IEnumerable NonWedgeGuardrailCases() { yield return CreateGuardrailCase("Drive", "drive_test_shot.json", 244.1f); yield return CreateGuardrailCase("Wood Low", "wood_low_test_shot.json", 122.2f); - yield return CreateGuardrailCase("Approach", "approach_test_shot.json", 92.3f); yield return CreateGuardrailCase("Approach Mid", "approach_mid_iron_test_shot.json", 125.8f); yield return CreateGuardrailCase("Checked", "checked_test_shot.json", 77.9f); yield return CreateGuardrailCase("Flop", "flop_test_shot.json", 61.8f); diff --git a/tests/PhysicsTests/RolloutPhysicsTests.cs b/tests/PhysicsTests/RolloutPhysicsTests.cs index 2717502..49e76f0 100644 --- a/tests/PhysicsTests/RolloutPhysicsTests.cs +++ b/tests/PhysicsTests/RolloutPhysicsTests.cs @@ -484,19 +484,7 @@ public void WoodLowShot_Distance_Baseline() Assert.Pass("Baseline: 122.5/180.1 yd (wood_low_test_shot.json)"); } - [Test] - [Explicit("Requires manual validation in Godot - cannot run in dotnet test")] - [Category("DistanceBenchmark")] - public void ApproachShot_Distance_Baseline() - { - // approach_test_shot.json: 81.1 mph, 10490 RPM, 30.5° VLA - // Validated: 2026-02-18 - // Expected: 106.4 yd carry / 108.9 yd total - - Assert.Pass("Baseline: 106.4/108.9 yd (approach_test_shot.json)"); - } - - [Test] +[Test] [Explicit("Requires manual validation in Godot - cannot run in dotnet test")] [Category("DistanceBenchmark")] public void FlopShot_Distance_Baseline() diff --git a/tools/shot_calibration/README.md b/tools/shot_calibration/README.md index 066a58b..31341ca 100644 --- a/tools/shot_calibration/README.md +++ b/tools/shot_calibration/README.md @@ -1,359 +1,174 @@ # Shot Calibration Tools -Tools for comparing OpenFairway physics output against FlightScope reference data, diagnosing divergence, and iteratively tuning physics parameters. - -## Table of Contents - -- [Prerequisites](#prerequisites) -- [Overview](#overview) -- [Directory Layout](#directory-layout) -- [Shot Data Source](#shot-data-source) -- [FlightScope Reference](#flightscope-reference) -- [Tools](#tools) - - [physics_export_data.gd](#physics_export_datagd) - - [export_physics_json.gd](#export_physics_jsongd) - - [export_physics_csv.gd](#export_physics_csvgd) - - [export_flightscope_csv.py](#export_flightscope_csvpy) - - [compare_csv.py](#compare_csvpy) - - [calibration_analyzer.py](#calibration_analyzerpy) - - [generate_profile.py](#generate_profilepy) - - [calibrate.py](#calibratepy) - - [flightscope_scraper.py](#flightscope_scraperpy) - - [flightscope_discover.py](#flightscope_discoverpy) -- [Profile Override System](#profile-override-system) - - [Profile JSON Schema](#profile-json-schema) - - [How Overrides Work](#how-overrides-work) - - [Available Profile Parameters](#available-profile-parameters) -- [Calibration Workflow](#calibration-workflow) - - [Quick Start (Automated)](#quick-start-automated) - - [Manual Step-by-Step](#manual-step-by-step) - - [Iterative Tuning Loop](#iterative-tuning-loop) -- [Session Calibration](#session-calibration) - - [Session Directory Layout](#session-directory-layout) - - [Session Quick Start](#session-quick-start) - - [Session Tool Usage](#session-tool-usage) - - [FlightScope Scraper Workaround](#flightscope-scraper-workaround) -- [Diagnostic Report](#diagnostic-report) - - [Status Thresholds](#status-thresholds) - - [Error Patterns](#error-patterns) - - [Shot Regimes](#shot-regimes) - - [Conflict Detection](#conflict-detection) -- [Iteration History](#iteration-history) -- [Output Columns](#output-columns) +Compare OpenFairway physics output against FlightScope reference data, find where shots are off, and tune physics parameters to close the gap. ## Prerequisites -The Python calibration tools require a virtual environment with the project dependencies. - ```bash # Create and activate the venv (one-time setup) python -m venv .venv source .venv/bin/activate - -# Install dependencies pip install -r tools/shot_calibration/requirements.txt ``` -Always activate the venv before running any Python calibration tool: - -```bash -source .venv/bin/activate -``` - -The GDScript tools (`export_physics_csv.gd`, `export_physics_json.gd`) require Godot 4.5+ runtime and do not need the Python venv. - -## Overview +Always activate the venv before running Python tools. GDScript tools (`export_physics_csv.gd`) need Godot 4.5+ and don't need the venv. -The calibration system compares OpenFairway physics simulation output against FlightScope trajectory optimizer data (source of truth). The pipeline: +## Quick Start -1. **Simulate** — Run all shot files through `PhysicsAdapter` headlessly (Godot) -2. **Compare** — Diff physics output against FlightScope reference values -3. **Diagnose** — Classify error patterns, tag shot regimes, suggest parameter adjustments -4. **Generate** — Produce a profile override JSON with conservative adjustments -5. **Repeat** — Re-simulate with the profile override, compare again +### Run Everything (simulate + scrape + compare + diagnose) -Profile overrides are loaded from JSON at runtime, eliminating the C# rebuild cycle. The orchestrator (`calibrate.py`) automates the full loop and tracks iteration history with regression guards. - -## Directory Layout +```bash +# All shots (standard + all shot sessions combined) +python tools/shot_calibration/calibrate.py run -``` -assets/data/ -├── *.json # Shot input files (BallData from launch monitors) -├── SOT/ -│ └── flightscope_reference.json # Source-of-truth reference data -├── shot_session_N/ # Session directories (from ShotRecordingService) -│ ├── shot_1.json # Recorded shot files -│ ├── shot_2.json -│ ├── physics.csv # Session physics export (via --session) -│ ├── flightscope_reference.json # Session FlightScope reference (via --session) -│ ├── flightscope.csv # Session FlightScope CSV (via --session) -│ ├── shot_diff_analysis.csv # Session diff CSV (via --session) -│ └── history/ # Session iteration history (via --session) -│ └── iteration_001.json -└── calibration/ - ├── physics.json # Physics simulation JSON export - ├── physics.csv # Physics simulation CSV export - ├── flightscope.csv # FlightScope reference CSV - ├── shot_diff_analysis.csv # Physics vs FlightScope diff CSV - ├── calibration_profile.json # Current profile override (optional) - └── history/ - ├── iteration_001.json # Iteration snapshots - ├── iteration_002.json - └── ... +# One session only (outputs stay in that session's directory) +python tools/shot_calibration/calibrate.py run --session assets/data/shot_session_3 ``` -## Shot Data Source +### Analyze (compare + diagnose + accuracy reports) -Shot input files live in `assets/data/*.json` using the BallData format from launch monitors (R10, Garmin, etc.): +Use this when `physics.csv` and `flightscope.csv` already exist (e.g., you scraped FlightScope separately): -```json -{ - "BallData": { - "Speed": 150.0, - "VLA": 12.5, - "HLA": -0.5, - "TotalSpin": 2800.0, - "SpinAxis": -3.0, - "BackSpin": 2796.0, - "SideSpin": -146.5 - } -} -``` - -| Field | Unit | Description | -|-------|------|-------------| -| `Speed` | mph | Ball speed | -| `VLA` | degrees | Vertical launch angle | -| `HLA` | degrees | Horizontal launch angle | -| `TotalSpin` | RPM | Total spin | -| `SpinAxis` | degrees | Spin axis (negative = draw) | -| `BackSpin` | RPM | Backspin component | -| `SideSpin` | RPM | Sidespin component | - -## FlightScope Reference +```bash +# All shots +python tools/shot_calibration/calibrate.py analyze -`assets/data/SOT/flightscope_reference.json` contains known-good carry/total/apex values from FlightScope's trajectory optimizer, indexed by shot filename: +# One session +python tools/shot_calibration/calibrate.py analyze --session assets/data/shot_session_3 -```json -{ - "driver1": { - "filename": "driver1.json", - "speed_mph": 150.0, - "carry_yd": 245.0, - "total_yd": 270.0, - "apex_ft": 95.0 - } -} +# Rebuild FlightScope CSV from reference JSON before comparing +python tools/shot_calibration/calibrate.py analyze --session assets/data/shot_session_3 --flightscope-export ``` -Populate this file manually from [FlightScope Trajectory Optimizer](https://trajectory.flightscope.com/) or use the scraper tool. - -## Tools +The `analyze` command: +1. Compares `physics.csv` vs `flightscope.csv` → `shot_diff_analysis.csv` +2. Prints a diagnostic report +3. Writes accuracy reports to `assets/data/`: + - `openfairway_accuracy_summary_.json` — carry + total + apex accuracy stats + - `openfairway_critical_carry_.csv` — top 20 worst shots by carry error + - `openfairway_critical_overall_.csv` — top 20 worst shots by max(carry, total) error +4. Saves an iteration snapshot to history -### `physics_export_data.gd` +**Accuracy report field reference:** -Shared helper module (`PhysicsExportData`) preloaded by both `export_physics_json.gd` and `export_physics_csv.gd`. Handles shot file discovery, `PhysicsAdapter` invocation, and row collection. Not run directly. +| Field | What it means | +|-------|---------------| +| `avg_error` | Average error (positive = physics flies long, negative = short) | +| `avg_off` | Average how far off, ignoring direction | +| `typical_off` | Typical how far off (middle value, less affected by outliers) | +| `consistency` | How spread out errors are (lower = more consistent) | +| `worst_off` | Single worst shot error | +| `within_pct_yd` | Distribution of shots within N yards of reference (N = 1, 2, 3, 5, 7, 10, 15, 20) | +| `within_pct_ft` | Distribution of shots within N feet of reference (N = 1, 2, 3, 5, 7, 10, 13, 15, 20, 50) | -### `export_physics_json.gd` +Fields end in `_yd` (yards) for carry/total or `_ft` (feet) for apex. -Runs every shot file through OpenFairway's `PhysicsAdapter` headless simulation and outputs JSON keyed by shot name. +### Iteration History ```bash -godot --headless --script tools/shot_calibration/export_physics_json.gd -godot --headless --script tools/shot_calibration/export_physics_json.gd -- --output=res://assets/data/calibration/physics.json -``` - -Requires Godot runtime. Writes `res://assets/data/calibration/physics.json` by default. If Godot reports a missing `PhysicsAdapter` method, rebuild the C# project first with `godot --headless --build-solutions --quit`. - -### `export_physics_csv.gd` - -Runs every shot file through the physics export path and emits a CSV. Supports profile overrides via `--profile` and session directories via `--session`. - -```bash -# Default export -godot --headless --script tools/shot_calibration/export_physics_csv.gd - -# With custom output path -godot --headless --script tools/shot_calibration/export_physics_csv.gd -- --output=res://assets/data/calibration/physics.csv +# List all iterations +python tools/shot_calibration/calibrate.py history -# With profile override (no C# rebuild needed) -godot --headless --script tools/shot_calibration/export_physics_csv.gd -- --profile=assets/data/calibration/calibration_profile.json +# Compare two iterations side-by-side +python tools/shot_calibration/calibrate.py diff 1 3 -# Export from a session directory (reads shots from session dir, writes physics.csv there) -godot --headless --script tools/shot_calibration/export_physics_csv.gd -- --session=assets/data/shot_session_2 +# Show the latest iteration +python tools/shot_calibration/calibrate.py status ``` -Requires Godot runtime. Outputs columns: shot_name, filename, speed, VLA, HLA, spin, carry, total, rollout, apex, hang time, landing speed/angle, Re, spin ratio, Cd, Cl, peak Cl, carry-only. - -### `export_flightscope_csv.py` - -Exports FlightScope reference values as a matching CSV. Reads shot inputs from `assets/data/*.json` and merges reference carry/total/apex from `flightscope_reference.json`. +### Tuning Loop ```bash -python tools/shot_calibration/export_flightscope_csv.py > assets/data/calibration/flightscope.csv -python tools/shot_calibration/export_flightscope_csv.py --reference assets/data/SOT/flightscope_reference.json - -# Export from a session directory (reads shots + reference from session dir, outputs to stdout) -python tools/shot_calibration/export_flightscope_csv.py --session assets/data/shot_session_2 > assets/data/shot_session_2/flightscope.csv -``` - -No Godot runtime required. +# 1. Run calibration +python tools/shot_calibration/calibrate.py run -### `compare_csv.py` +# 2. Auto-generate a profile with suggested tweaks +python tools/shot_calibration/generate_profile.py -Generates a comparison CSV with carry/total/rollout/apex deltas and per-shot status classification. +# 3. Re-run (picks up calibration_profile.json automatically) +python tools/shot_calibration/calibrate.py run -```bash -python tools/shot_calibration/compare_csv.py assets/data/calibration/physics.csv assets/data/calibration/flightscope.csv -python tools/shot_calibration/compare_csv.py assets/data/calibration/physics.csv assets/data/calibration/flightscope.csv --output /tmp/shot_diff_analysis.csv +# 4. Compare before/after +python tools/shot_calibration/calibrate.py diff 1 2 ``` -Default output: `assets/data/calibration/shot_diff_analysis.csv` - -Output includes `rollout_physics_yd`, `rollout_flightscope_yd`, `diff_rollout_yd`, and `status` (pass/moderate/severe) columns alongside carry/total/apex diffs. +Profile overrides are JSON files loaded at runtime — no C# rebuild needed between iterations. See [Profile Override System](#profile-override-system). -### `calibration_analyzer.py` - -Diagnostic analyzer that reads `shot_diff_analysis.csv` and produces a structured report with error classification, shot regime tagging, parameter suggestions, and conflict detection. - -```bash -# Text report (default — writes diagnostic_report.txt next to input file) -python tools/shot_calibration/calibration_analyzer.py - -# Custom input path (report written next to input: path/to/diagnostic_report.txt) -python tools/shot_calibration/calibration_analyzer.py --input path/to/shot_diff_analysis.csv - -# Explicit output path -python tools/shot_calibration/calibration_analyzer.py --input path/to/shot_diff_analysis.csv --output /tmp/diagnostic_report.txt +## Directory Layout -# JSON output (writes diagnostic_report.json next to input) -python tools/shot_calibration/calibration_analyzer.py --json ``` - -The report includes: -- **Summary** — Count of pass/moderate/severe/no-reference shots -- **Per-shot diagnostics** — Error pattern, regime tags, diffs, suggested knobs -- **Parameter conflicts** — Flags when failing shots need opposite adjustments to the same parameter - -See [Diagnostic Report](#diagnostic-report) for details on classification logic. - -### `generate_profile.py` - -Generates a calibration profile JSON from diagnostic analysis. Applies conservative step-size adjustments to non-conflicting parameters. - -```bash -# Generate from current diff analysis -python tools/shot_calibration/generate_profile.py - -# Incremental: adjust from an existing base profile -python tools/shot_calibration/generate_profile.py --base assets/data/calibration/calibration_profile.json - -# Target specific shots only -python tools/shot_calibration/generate_profile.py --target bump_and_run,driver1 - -# Preview adjustments without writing -python tools/shot_calibration/generate_profile.py --dry-run - -# Custom output path -python tools/shot_calibration/generate_profile.py --output /tmp/profile.json +assets/data/ +├── *.json # Shot input files (from launch monitors) +├── SOT/ +│ ├── flightscope_SoT.csv # FlightScope reference CSV (standard shots) +│ └── flightscope_reference.json # FlightScope reference data +├── openfairway_*_.* # Accuracy reports (from analyze) +├── shot_session_N/ # Session directories (from ShotRecordingService) +│ ├── shot_*.json # Recorded shot files +│ ├── physics.csv # Physics simulation output +│ ├── flightscope_reference.json # FlightScope reference (from scraper) +│ ├── flightscope.csv # FlightScope reference CSV +│ ├── shot_diff_analysis.csv # Physics vs FlightScope diff +│ └── history/ # Iteration history for this session +│ └── iteration_001.json +└── calibration/ + ├── physics.csv # Combined physics output (all shots) + ├── flightscope.csv # Combined FlightScope reference (all shots) + ├── shot_diff_analysis.csv # Combined diff (all shots) + ├── calibration_profile.json # Current profile override (optional) + └── history/ + ├── iteration_001.json # Iteration snapshots + └── ... ``` -Default output: `assets/data/calibration/calibration_profile.json` +## FlightScope Scraper -The generator: -- Reads the diff CSV and runs the analyzer internally -- Applies one step-size adjustment per parameter in the direction needed -- Skips parameters with conflicting requirements (flags them for manual review) -- Clamps all values to safe ranges defined in the knowledge base - -### `calibrate.py` - -Orchestrator for the full calibration iteration loop. Automates simulate-compare-analyze and tracks history. +Scrapes [FlightScope Trajectory Optimizer](https://trajectory.flightscope.com/) to get reference carry/total/apex values. If interrupted, re-running the same command picks up where it left off. ```bash -# Run a full iteration (Godot export + FlightScope CSV + compare + analyze) -python tools/shot_calibration/calibrate.py run +# Scrape a session (visible browser recommended) +python tools/shot_calibration/flightscope_scraper.py --session assets/data/shot_session_3 --visible -# Run with a specific profile override -python tools/shot_calibration/calibrate.py run --profile assets/data/calibration/calibration_profile.json +# Scrape standard shots +python tools/shot_calibration/flightscope_scraper.py --visible -# Skip Godot export (reuse existing physics.csv) -python tools/shot_calibration/calibrate.py run --skip-godot +# Retry shots that failed last time +python tools/shot_calibration/flightscope_scraper.py --session assets/data/shot_session_3 --retry-failed -# Run against a session directory (all outputs in session dir) -python tools/shot_calibration/calibrate.py run --session assets/data/shot_session_2 - -# Show last iteration summary -python tools/shot_calibration/calibrate.py status - -# Show all iteration summaries -python tools/shot_calibration/calibrate.py history - -# Compare two iterations side-by-side -python tools/shot_calibration/calibrate.py diff 1 3 +# Start over from scratch +python tools/shot_calibration/flightscope_scraper.py --session assets/data/shot_session_3 --visible --force ``` -The `run` subcommand: -1. Detects `calibration_profile.json` (or uses `--profile`) -2. Exports physics CSV via Godot headless (with profile override if present) -3. Exports FlightScope reference CSV -4. Runs `compare_csv.py` to generate the diff -5. Runs the diagnostic analyzer -6. Saves an iteration snapshot to `assets/data/calibration/history/` -7. Prints the diagnostic report with regression warnings +Requires Chrome or Brave in your `PATH`. -### `flightscope_scraper.py` +### reCAPTCHA Workaround -Automated scraper for [FlightScope Trajectory Optimizer](https://trajectory.flightscope.com/). Uses Selenium to fill shot parameters, submit, and read carry/total/apex results. +The scraper uses `undetected-chromedriver` with a browser profile saved at `~/.config/openfairway/scraper-profile`. If it still gets blocked by reCAPTCHA, attach to a real Chrome session instead: -```bash -# Scrape all default shots (headless) -python tools/shot_calibration/flightscope_scraper.py - -# Scrape specific shots with visible browser -python tools/shot_calibration/flightscope_scraper.py --shots driver1.json wood1.json --visible - -# Scrape all shots from a session directory -python tools/shot_calibration/flightscope_scraper.py --session assets/data/shot_session_2 --visible - -# Attach to an existing Chrome instance (see "FlightScope Scraper Workaround" below) -python tools/shot_calibration/flightscope_scraper.py --session assets/data/shot_session_2 --debug-port 9222 +**Terminal 1** — Launch Chrome with remote debugging: -# Generate empty template for manual entry -python tools/shot_calibration/flightscope_scraper.py --template +```bash +google-chrome --incognito --remote-debugging-port=9222 --user-data-dir=~/.config/openfairway/scraper-profile ``` -Requires the project venv (see [Prerequisites](#prerequisites)) and Chrome or Brave in your `PATH`. - -### `flightscope_discover.py` +Open https://trajectory.flightscope.com/ manually the first time so reCAPTCHA sees a real user. -Discovery/debugging script for the FlightScope page. Dumps interactive elements and captures screenshots. +**Terminal 2** — Run the scraper against that browser: ```bash -python tools/shot_calibration/flightscope_discover.py -python tools/shot_calibration/flightscope_discover.py --fill-test-shot -python tools/shot_calibration/flightscope_discover.py --headless +python tools/shot_calibration/flightscope_scraper.py --session assets/data/shot_session_3 --debug-port 9222 ``` -Requires the project venv (see [Prerequisites](#prerequisites)). +The browser stays open when scraping finishes — you can scrape more sessions without restarting it. Use `brave-browser` instead of `google-chrome` if using Brave. ## Profile Override System -Profile overrides eliminate the C# edit/rebuild bottleneck. After the one-time C# build, all tuning iterations are Godot-only. - -### Profile JSON Schema - -Only keys you want to override need to be present. Unspecified keys keep their defaults. +Tweak physics parameters via JSON without rebuilding C#. Only include the keys you want to change — everything else keeps its default. ```json { "DragScaleMultiplier": 1.0, "LiftScaleMultiplier": 1.0, - "KineticFrictionMultiplier": 1.0, - "RollingFrictionMultiplier": 1.0, - "GrassViscosityMultiplier": 1.0, - "CriticalAngleOffsetRadians": 0.0, - "SpinbackThetaBoostMultiplier": 1.0, "Flight": { "ClMaxBase": 0.268, "CdMin": 0.22, @@ -361,39 +176,25 @@ Only keys you want to override need to be present. Unspecified keys keep their d }, "Bounce": { "FlightTangentialRetentionBase": 0.55, - "CorBaseA": 0.45, - "RolloutLowSpinRetention": 0.85, - "RolloutHighSpinRetention": 0.70 + "CorBaseA": 0.45 }, "Rollout": { "LowSpinMultiplierMax": 1.15, "MidSpinMultiplierMax": 2.25, - "HighSpinMultiplierMax": 2.50, - "ChipVelocityScaleMin": 0.60, - "ChipVelocityScaleMax": 0.87 + "HighSpinMultiplierMax": 2.50 } } ``` -A minimal override targeting only rollout: +`generate_profile.py` builds a profile from the diagnostic report: -```json -{ - "Rollout": { - "LowSpinMultiplierMax": 1.25 - } -} +```bash +python tools/shot_calibration/generate_profile.py # Generate from current diff +python tools/shot_calibration/generate_profile.py --dry-run # Preview without writing +python tools/shot_calibration/generate_profile.py --base assets/data/calibration/calibration_profile.json # Build on existing ``` -### How Overrides Work - -1. `export_physics_csv.gd` accepts `--profile=` on the command line -2. The JSON is read and passed to `PhysicsAdapter.LoadProfileFromJson()` -3. `BallPhysicsProfile.FromJson()` parses the JSON — only present keys override defaults -4. All subsequent `SimulateShotFromJson()` calls use the overridden profile -5. Sub-profiles (`Flight`, `Bounce`, `Rollout`) are independently partial-merged - -### Available Profile Parameters +### Available Parameters #### Root-Level Multipliers @@ -409,7 +210,7 @@ A minimal override targeting only rollout: #### Flight Profile -Controls aerodynamic drag and lift during ball flight. Key tuning parameters: +Controls drag and lift during ball flight. Key parameters: | Parameter | Default | Description | |-----------|---------|-------------| @@ -423,14 +224,14 @@ Full list: see `addons/openfairway/physics/FlightProfile.cs` (45+ parameters). #### Bounce Profile -Controls coefficient of restitution and tangential velocity retention at impact. +Controls how much energy and speed the ball keeps after hitting the ground. | Parameter | Default | Description | |-----------|---------|-------------| -| `FlightTangentialRetentionBase` | 0.55 | First-bounce tangential retention | +| `FlightTangentialRetentionBase` | 0.55 | First-bounce forward speed retention | | `FlightSpinFactorMin` | 0.40 | Min retention at high spin | | `FlightSpinFactorDivisor` | 8000 | Spin RPM divisor for retention curve | -| `CorBaseA` | 0.45 | Base COR (vertical bounce energy) | +| `CorBaseA` | 0.45 | Base bounce energy (vertical) | | `RolloutLowSpinRetention` | 0.85 | Rollout bounce retention (low spin) | | `RolloutHighSpinRetention` | 0.70 | Rollout bounce retention (high spin) | @@ -438,7 +239,7 @@ Full list: see `addons/openfairway/physics/BounceProfile.cs` (20+ parameters). #### Rollout Profile -Controls friction and velocity scaling during ground rollout. +Controls friction and velocity during ground roll. | Parameter | Default | Description | |-----------|---------|-------------| @@ -451,175 +252,6 @@ Controls friction and velocity scaling during ground rollout. Full list: see `addons/openfairway/physics/RolloutProfile.cs` (11 parameters). -## Calibration Workflow - -### Quick Start (Automated) - -```bash -# 1. Run full calibration iteration (simulate + compare + diagnose) -python tools/shot_calibration/calibrate.py run - -# 2. Review the diagnostic report printed to stdout -# Iteration snapshot saved to assets/data/calibration/history/iteration_NNN.json - -# 3. Generate a profile override from diagnostics -python tools/shot_calibration/generate_profile.py - -# 4. Re-run with the generated profile -python tools/shot_calibration/calibrate.py run - -# 5. Compare iterations -python tools/shot_calibration/calibrate.py diff 1 2 -``` - -### Manual Step-by-Step - -```bash -# 1. Export physics CSV (requires Godot) -godot --headless --script tools/shot_calibration/export_physics_csv.gd - -# 2. Export FlightScope CSV -python tools/shot_calibration/export_flightscope_csv.py > assets/data/calibration/flightscope.csv - -# 3. Compare -python tools/shot_calibration/compare_csv.py assets/data/calibration/physics.csv assets/data/calibration/flightscope.csv - -# 4. Diagnose -python tools/shot_calibration/calibration_analyzer.py - -# 5. Generate profile override -python tools/shot_calibration/generate_profile.py --dry-run -python tools/shot_calibration/generate_profile.py - -# 6. Re-export with profile override -godot --headless --script tools/shot_calibration/export_physics_csv.gd -- --profile=assets/data/calibration/calibration_profile.json - -# 7. Re-compare and re-diagnose -python tools/shot_calibration/compare_csv.py assets/data/calibration/physics.csv assets/data/calibration/flightscope.csv -python tools/shot_calibration/calibration_analyzer.py -``` - -### Iterative Tuning Loop - -The typical workflow cycles through: - -``` - Edit profile JSON ──> Godot export (--profile) ──> Compare ──> Diagnose - ^ │ - └──────────────────────────────────────────────────────────────────┘ -``` - -Each iteration is tracked in `assets/data/calibration/history/`. The orchestrator warns if previously-passing shots regress. - -## Session Calibration - -Session directories (`assets/data/shot_session_N/`) are created by `ShotRecordingService` during gameplay. The `--session` flag lets you run the full calibration pipeline against a session's shots, with all output kept inside that session directory. - -### Session Directory Layout - -After running a full session calibration, the session directory contains: - -``` -assets/data/shot_session_2/ -├── shot_1.json # Recorded shot inputs -├── shot_2.json -├── ... -├── physics.csv # Physics simulation output -├── flightscope_reference.json # FlightScope scraped reference data -├── flightscope.csv # FlightScope reference CSV -├── shot_diff_analysis.csv # Physics vs FlightScope diff -└── history/ - └── iteration_001.json # Iteration snapshot -``` - -### Session Quick Start - -```bash -# Full pipeline: physics export + FlightScope scrape + compare + diagnose -python tools/shot_calibration/calibrate.py run --session assets/data/shot_session_2 - -# Skip Godot if physics.csv already exists in the session dir -python tools/shot_calibration/calibrate.py run --session assets/data/shot_session_2 --skip-godot -``` - -The `run --session` command: -1. Exports physics CSV from the session's shot files (Godot headless) -2. Scrapes FlightScope for each session shot (via `flightscope_scraper.py --session`) -3. Exports FlightScope reference CSV (via `export_flightscope_csv.py --session`) -4. Compares physics vs FlightScope (via `compare_csv.py`) -5. Runs diagnostic analysis and saves iteration to `/history/` - -### Session Tool Usage - -Each tool supports `--session` independently for step-by-step use: - -```bash -# Physics export only -godot --headless --script tools/shot_calibration/export_physics_csv.gd -- --session=assets/data/shot_session_2 - -# FlightScope scrape only (visible browser recommended) -python tools/shot_calibration/flightscope_scraper.py --session assets/data/shot_session_2 --visible - -# FlightScope CSV export only (outputs to stdout, redirect to session dir) -python tools/shot_calibration/export_flightscope_csv.py --session assets/data/shot_session_2 > assets/data/shot_session_2/flightscope.csv - -# Compare (default output is assets/data/calibration/; use --output for session dir) -python tools/shot_calibration/compare_csv.py assets/data/shot_session_2/physics.csv assets/data/shot_session_2/flightscope.csv --output assets/data/shot_session_2/shot_diff_analysis.csv - -# Diagnose (works with any diff CSV path) -python tools/shot_calibration/calibration_analyzer.py --input assets/data/shot_session_2/shot_diff_analysis.csv -``` - -Session mode auto-discovers all `*.json` files in the session directory as shots (no hardcoded shot map needed). The existing non-session workflow is unchanged — omitting `--session` uses the default `assets/data/` paths. - -### FlightScope Scraper Workaround - -The scraper uses `undetected-chromedriver` to avoid reCAPTCHA v3 bot detection. By default it creates a **persistent browser profile** at `~/.config/openfairway/scraper-profile` so reCAPTCHA can build engagement history across runs (fresh profiles score near 0.1, profiles with history score 0.7+). - -#### Standard Mode (persistent profile) - -```bash -source .venv/bin/activate - -# Uses default persistent profile at ~/.config/openfairway/scraper-profile -python tools/shot_calibration/flightscope_scraper.py --session assets/data/shot_session_2 --visible - -# Use a custom profile directory -python tools/shot_calibration/flightscope_scraper.py --browser-profile /tmp/my-profile --visible -``` - -> **Tip:** On first use, run a few manual shots with `--visible` to warm up the profile's reCAPTCHA score before running batch scrapes. - -#### Debug-Port Mode (attach to existing Chrome) - -If the standard mode still gets blocked, use `--debug-port` to attach to a real Chrome session with an established browsing profile. - -**Terminal 1** — Launch Chrome with remote debugging enabled: - -```bash -google-chrome --remote-debugging-port=9222 --user-data-dir=~/.config/openfairway/scraper-profile -``` - -Leave this running. On first use, navigate to https://trajectory.flightscope.com/ manually to establish a reCAPTCHA session. - -**Terminal 2** — Activate the venv and run the scraper attached to that browser: - -```bash -source .venv/bin/activate - -# Scrape session shots using the running Chrome instance -python tools/shot_calibration/flightscope_scraper.py --session assets/data/shot_session_2 --debug-port 9222 - -# Or scrape the default shot set -python tools/shot_calibration/flightscope_scraper.py --debug-port 9222 -``` - -The scraper navigates and fills forms in the already-running browser. When it finishes, the browser stays open (it is not quit by the script). You can re-run the scraper against different sessions without restarting Chrome. - -> **Tip:** If using Brave instead of Chrome, replace `google-chrome` with `brave-browser` in Terminal 1. The `--user-data-dir` path can be anything — it creates a dedicated profile that won't interfere with your normal browsing. - -For parameters flagged as conflicting (e.g., `FlightTangentialRetentionBase` needed higher for `driver1` but lower for `wood_low_test_shot`), manual review is required. These usually indicate the physics model needs a regime-specific fix in the C# code rather than a single-value tweak. - ## Diagnostic Report ### Status Thresholds @@ -630,22 +262,22 @@ For parameters flagged as conflicting (e.g., `FlightTangentialRetentionBase` nee | `total_diff` | +/- 5 yd | 5-10 yd | > 10 yd | | `apex_diff` | +/- 5 ft | 5-10 ft | > 10 ft | -A shot's status is the worst of its carry and total classifications. +A shot's status is the worst of its carry and total grades. ### Error Patterns | Pattern | Meaning | |---------|---------| -| `ROLLOUT_TOO_LONG` | Carry close, total overshoots | -| `ROLLOUT_TOO_SHORT` | Carry close, total undershoots | +| `ROLLOUT_TOO_LONG` | Carry is close, but total overshoots | +| `ROLLOUT_TOO_SHORT` | Carry is close, but total undershoots | | `CARRY_TOO_LONG` | Physics carry exceeds reference | -| `CARRY_TOO_SHORT` | Physics carry under reference | +| `CARRY_TOO_SHORT` | Physics carry falls short of reference | | `CARRY_AND_ROLLOUT_LONG` | Both carry and rollout overshoot | | `CARRY_AND_ROLLOUT_SHORT` | Both carry and rollout undershoot | ### Shot Regimes -Shots are tagged by their input characteristics: +Shots are tagged by their input characteristics to help suggest the right parameters to tweak: | Regime | Criteria | |--------|----------| @@ -656,53 +288,53 @@ Shots are tagged by their input characteristics: | `mid-iron` | Speed 85-110 mph and VLA 15-25 degrees | | `high-loft-wedge` | VLA > 30 degrees and spin > 8000 RPM | -Regime tags help the analyzer suggest parameters that specifically affect that shot type. +### Conflicts -### Conflict Detection +When different failing shots need opposite adjustments to the same parameter, it's flagged as a conflict. `generate_profile.py` skips conflicting parameters — they usually need a regime-specific fix in C# rather than a single-value tweak. -The analyzer flags parameters where different failing shots need opposite adjustments. For example, if `bump_test_shot` (ROLLOUT_TOO_LONG) needs `FlightTangentialRetentionBase` decreased while `driver1` (ROLLOUT_TOO_SHORT) needs it increased, the parameter is flagged as conflicting. +## Tool Reference -Conflicting parameters are: -- Skipped by `generate_profile.py` (not auto-adjusted) -- Listed in the diagnostic report for manual review -- Tracked in iteration history snapshots +`calibrate.py` is the main entry point. These tools run under the hood but can also be used standalone (all support `--help` and most support `--session`): -## Iteration History +| Tool | What it does | Needs | +|------|--------------|-------| +| `export_physics_csv.gd` | Simulate all shots, write CSV | Godot | +| `export_physics_json.gd` | Simulate all shots, write JSON | Godot | +| `physics_export_data.gd` | Shared helper for shot discovery | (not run directly) | +| `export_flightscope_csv.py` | Export FlightScope reference as CSV | Python | +| `compare_csv.py` | Diff physics vs FlightScope → `shot_diff_analysis.csv` | Python | +| `calibration_analyzer.py` | Generate diagnostic report from diff CSV | Python | +| `generate_profile.py` | Build profile override JSON from diagnostics | Python | +| `flightscope_scraper.py` | Scrape FlightScope trajectory optimizer | Python + Chrome/Brave | +| `flightscope_discover.py` | Debug helper for FlightScope page | Python + Chrome/Brave | -Each `calibrate.py run` saves a snapshot to `assets/data/calibration/history/iteration_NNN.json`: +## Shot Data Format + +Shot files use the BallData format from launch monitors (R10, Garmin, etc.): ```json { - "iteration": 1, - "timestamp": "2026-03-11T14:30:00", - "profile_overrides": { "Rollout": { "LowSpinMultiplierMax": 1.20 } }, - "summary": { "pass": 18, "moderate": 4, "severe": 4, "no_reference": 3 }, - "per_shot": { - "drive_test_shot": { - "diff_carry_yd": 1.0, - "diff_total_yd": 0.8, - "status": "pass", - "error_pattern": null - } - }, - "regressions": [], - "conflicts": ["Bounce.FlightTangentialRetentionBase"] + "BallData": { + "Speed": 150.0, + "VLA": 12.5, + "HLA": -0.5, + "TotalSpin": 2800.0, + "SpinAxis": -3.0, + "BackSpin": 2796.0, + "SideSpin": -146.5 + } } ``` -View history: - -```bash -python tools/shot_calibration/calibrate.py history -``` - -``` - # Timestamp Pass Mod Sev Regr -------------------------------------------------- - 1 2026-03-11T14:30:00 4 9 9 0 - 2 2026-03-11T15:00:00 7 8 7 0 - 3 2026-03-11T15:30:00 10 7 5 1 -``` +| Field | Unit | Description | +|-------|------|-------------| +| `Speed` | mph | Ball speed | +| `VLA` | degrees | Vertical launch angle | +| `HLA` | degrees | Horizontal launch angle | +| `TotalSpin` | RPM | Total spin | +| `SpinAxis` | degrees | Spin axis (negative = draw) | +| `BackSpin` | RPM | Backspin component | +| `SideSpin` | RPM | Sidespin component | ## Output Columns diff --git a/tools/shot_calibration/calibrate.py b/tools/shot_calibration/calibrate.py index a9539c0..a108ab1 100644 --- a/tools/shot_calibration/calibrate.py +++ b/tools/shot_calibration/calibrate.py @@ -6,6 +6,8 @@ Usage: python tools/shot_calibration/calibrate.py run python tools/shot_calibration/calibrate.py run --profile assets/data/calibration/calibration_profile.json + python tools/shot_calibration/calibrate.py analyze + python tools/shot_calibration/calibrate.py analyze --session assets/data/shot_session_3 python tools/shot_calibration/calibrate.py status python tools/shot_calibration/calibrate.py history python tools/shot_calibration/calibrate.py diff 1 3 @@ -15,6 +17,7 @@ import csv import datetime import json +import math import os import shutil import subprocess @@ -268,7 +271,7 @@ def save_iteration(iteration_num, profile_overrides, analysis_result, prev_itera def cmd_run(args): """Run a full calibration iteration.""" - # Resolve session mode: override all path constants when --session is provided + # Override all path constants when --session is provided session_dir = None physics_csv = PHYSICS_CSV flightscope_csv = FLIGHTSCOPE_CSV @@ -281,7 +284,7 @@ def cmd_run(args): flightscope_csv = os.path.join(session_dir, "flightscope.csv") diff_csv = os.path.join(session_dir, "shot_diff_analysis.csv") history_dir = os.path.join(session_dir, "history") - print(f"Session mode: {session_dir}") + print(f"Session: {session_dir}") profile_path = args.profile if not profile_path and os.path.exists(DEFAULT_PROFILE): @@ -293,13 +296,13 @@ def cmd_run(args): with open(profile_path, "r") as f: profile_overrides = json.load(f) - # Discover session directories for unified mode (default, non-session) + # Discover session directories (default: include all sessions) session_dirs = [] if not session_dir and not args.no_sessions: session_dirs = discover_session_dirs() if session_dirs: prefixes = [session_prefix(sd) for sd in session_dirs] - print(f"Unified mode: including {len(session_dirs)} session(s): {', '.join(prefixes)}") + print(f"Including {len(session_dirs)} session(s): {', '.join(prefixes)}") # Step 1: Export physics CSV (requires Godot) godot = find_godot() @@ -325,7 +328,7 @@ def cmd_run(args): # Step 2: FlightScope reference CSV os.makedirs(os.path.dirname(flightscope_csv), exist_ok=True) if session_dir: - # Session mode: scrape FlightScope for session shots, then export CSV + # Scrape FlightScope for session shots, then export CSV print(f"\n--- Generating FlightScope reference for session ---") scraper_cmd = [ sys.executable, os.path.join(SCRIPT_DIR, "flightscope_scraper.py"), @@ -453,6 +456,257 @@ def cmd_run(args): print(f"Summary: {summary['pass']} pass, {summary['moderate']} moderate, {summary['severe']} severe") +def _compute_accuracy_stats(diffs, thresholds): + """Compute accuracy statistics from a list of diff values. + + Args: + diffs: List of numeric diff values (physics - reference). + thresholds: List of threshold values for within-X percentages. + + Returns: + Dict with avg_error, avg_off, typical_off, consistency, worst_off, + and within_pct (dict mapping threshold to percentage). + """ + if not diffs: + return {} + + n = len(diffs) + abs_diffs = [abs(d) for d in diffs] + mean_error = sum(diffs) / n + mean_abs = sum(abs_diffs) / n + sorted_abs = sorted(abs_diffs) + if n % 2 == 1: + median_abs = sorted_abs[n // 2] + else: + median_abs = (sorted_abs[n // 2 - 1] + sorted_abs[n // 2]) / 2 + variance = sum((d - mean_error) ** 2 for d in diffs) / n + std_dev = math.sqrt(variance) + max_abs = max(abs_diffs) + + within_pct = {} + for threshold in thresholds: + count = sum(1 for ad in abs_diffs if ad <= threshold) + within_pct[str(threshold)] = round(count / n * 100, 1) + + return { + "avg_error": round(mean_error, 1), + "avg_off": round(mean_abs, 1), + "typical_off": round(median_abs, 1), + "consistency": round(std_dev, 1), + "worst_off": round(max_abs, 1), + "within_pct": within_pct, + } + + +def _generate_accuracy_reports(diff_csv, output_dir, top_n=20): + """Read shot_diff_analysis.csv and generate accuracy report files. + + Returns list of paths written. + """ + with open(diff_csv, "r") as f: + reader = csv.DictReader(f) + all_rows = list(reader) + + # Filter to shots with reference data (non-zero flightscope carry or total) + ref_rows = [ + r for r in all_rows + if float(r.get("flightscope_carry_yd", 0) or 0) > 0 + or float(r.get("flightscope_total_yd", 0) or 0) > 0 + ] + + carry_diffs = [float(r["diff_carry_yd"]) for r in ref_rows if r.get("diff_carry_yd")] + total_diffs = [float(r["diff_total_yd"]) for r in ref_rows if r.get("diff_total_yd")] + apex_diffs = [float(r["diff_apex_ft"]) for r in ref_rows if r.get("diff_apex_ft")] + + timestamp = datetime.datetime.now().strftime("%Y%m%d_%H%M") + os.makedirs(output_dir, exist_ok=True) + written = [] + + # --- 1. Full accuracy summary (carry + total + apex) --- + _YD_THRESHOLDS = [1, 2, 3, 5, 7, 10, 15, 20] + _FT_THRESHOLDS = [1, 2, 3, 5, 7, 10, 13, 15, 20, 50] + + carry_stats = _compute_accuracy_stats(carry_diffs, _YD_THRESHOLDS) + carry_accuracy = {f"{k}_yd": v for k, v in carry_stats.items() if k != "within_pct"} + carry_accuracy["within_pct_yd"] = carry_stats.get("within_pct", {}) + + total_stats = _compute_accuracy_stats(total_diffs, _YD_THRESHOLDS) + total_accuracy = {f"{k}_yd": v for k, v in total_stats.items() if k != "within_pct"} + total_accuracy["within_pct_yd"] = total_stats.get("within_pct", {}) + + apex_stats = _compute_accuracy_stats(apex_diffs, _FT_THRESHOLDS) + apex_accuracy = {f"{k}_ft": v for k, v in apex_stats.items() if k != "within_pct"} + apex_accuracy["within_pct_ft"] = apex_stats.get("within_pct", {}) + + full_summary = { + "timestamp": datetime.datetime.now().strftime("%Y-%m-%dT%H:%M"), + "total_shots": len(all_rows), + "shots_with_reference": len(ref_rows), + "carry_accuracy": carry_accuracy, + "total_accuracy": total_accuracy, + "apex_accuracy": apex_accuracy, + } + full_path = os.path.join(output_dir, f"openfairway_accuracy_summary_{timestamp}.json") + with open(full_path, "w") as f: + json.dump(full_summary, f, indent=2) + f.write("\n") + written.append(full_path) + + # --- 2. Critical carry CSV (top 20 by |diff_carry_yd|) --- + sorted_by_carry = sorted( + ref_rows, + key=lambda r: abs(float(r.get("diff_carry_yd", 0) or 0)), + reverse=True, + )[:top_n] + carry_csv_path = os.path.join(output_dir, f"openfairway_critical_carry_{timestamp}.csv") + if sorted_by_carry: + fieldnames = list(all_rows[0].keys()) + with open(carry_csv_path, "w", newline="") as f: + writer = csv.DictWriter(f, fieldnames=fieldnames) + writer.writeheader() + writer.writerows(sorted_by_carry) + written.append(carry_csv_path) + + # --- 3. Critical overall CSV (top 20 by max(|diff_carry|, |diff_total|)) --- + sorted_by_overall = sorted( + ref_rows, + key=lambda r: max( + abs(float(r.get("diff_carry_yd", 0) or 0)), + abs(float(r.get("diff_total_yd", 0) or 0)), + ), + reverse=True, + )[:top_n] + overall_csv_path = os.path.join(output_dir, f"openfairway_critical_overall_{timestamp}.csv") + if sorted_by_overall: + fieldnames = list(all_rows[0].keys()) + with open(overall_csv_path, "w", newline="") as f: + writer = csv.DictWriter(f, fieldnames=fieldnames) + writer.writeheader() + writer.writerows(sorted_by_overall) + written.append(overall_csv_path) + + return written + + +def cmd_analyze(args): + """Post-scrape analysis: compare, diagnose, generate accuracy reports, save iteration.""" + # Resolve paths based on --session flag + session_dir = None + physics_csv = PHYSICS_CSV + flightscope_csv = FLIGHTSCOPE_CSV + diff_csv = DIFF_CSV + history_dir = HISTORY_DIR + report_output_dir = DATA_DIR + + if args.session: + session_dir = ( + os.path.normpath(os.path.join(PROJECT_ROOT, args.session)) + if not os.path.isabs(args.session) + else os.path.normpath(args.session) + ) + physics_csv = os.path.join(session_dir, "physics.csv") + flightscope_csv = os.path.join(session_dir, "flightscope.csv") + diff_csv = os.path.join(session_dir, "shot_diff_analysis.csv") + history_dir = os.path.join(session_dir, "history") + print(f"Session: {session_dir}") + + # Discover session directories (default: include all sessions) + session_dirs = [] + if not session_dir and not args.no_sessions: + session_dirs = discover_session_dirs() + if session_dirs: + prefixes = [session_prefix(sd) for sd in session_dirs] + print(f"Including {len(session_dirs)} session(s): {', '.join(prefixes)}") + + # Validate physics.csv exists + if not os.path.exists(physics_csv): + print(f"ERROR: Physics CSV not found at {physics_csv}", file=sys.stderr) + print(" Run 'calibrate.py run' or Godot export first.", file=sys.stderr) + sys.exit(1) + + # Step 1: FlightScope CSV (optional re-export, or validate existence) + if args.flightscope_export: + if session_dir: + export_cmd = [ + sys.executable, os.path.join(SCRIPT_DIR, "export_flightscope_csv.py"), + "--session", session_dir, + ] + result = subprocess.run( + export_cmd, cwd=PROJECT_ROOT, capture_output=True, text=True + ) + if result.returncode != 0: + print(f"ERROR: FlightScope CSV export failed: {result.stderr}", file=sys.stderr) + sys.exit(1) + os.makedirs(os.path.dirname(flightscope_csv), exist_ok=True) + with open(flightscope_csv, "w") as f: + f.write(result.stdout) + print(f" Exported FlightScope CSV -> {flightscope_csv}") + elif session_dirs: + merged_rows = build_merged_flightscope_csv(SOT_CSV, session_dirs, flightscope_csv) + print(f" Merged FlightScope CSV: {len(merged_rows)} rows -> {flightscope_csv}") + else: + shutil.copy2(SOT_CSV, flightscope_csv) + print(f" Copied {SOT_CSV} -> {flightscope_csv}") + else: + if not os.path.exists(flightscope_csv): + print(f"ERROR: FlightScope CSV not found at {flightscope_csv}", file=sys.stderr) + print(" Use --flightscope-export to generate it, or run scraper first.", file=sys.stderr) + sys.exit(1) + + # Filter physics CSV to only include shots with FlightScope reference + if session_dirs and not session_dir: + with open(flightscope_csv, "r") as f: + reader = csv.DictReader(f) + ref_names = {row["shot_name"] for row in reader} + filter_physics_csv(physics_csv, ref_names) + print(f" Filtered physics CSV to {len(ref_names)} referenced shots") + + # Step 2: Compare physics vs FlightScope -> shot_diff_analysis.csv + compare_cmd = [ + sys.executable, os.path.join(SCRIPT_DIR, "compare_csv.py"), + physics_csv, flightscope_csv, + "--output", diff_csv, + ] + if not run_command(compare_cmd, "Comparing physics vs FlightScope"): + sys.exit(1) + + # Step 3: Run diagnostic analyzer + print("\n--- Running diagnostic analysis ---") + rows = load_diff_csv(diff_csv) + if not rows: + print("ERROR: No rows in diff CSV", file=sys.stderr) + sys.exit(1) + + analysis_result = analyze(rows) + print(format_report(analysis_result)) + + # Step 4: Generate accuracy reports + print("\n--- Generating accuracy reports ---") + report_paths = _generate_accuracy_reports(diff_csv, report_output_dir, top_n=args.show) + for p in report_paths: + print(f" {p}") + + # Step 5: Save iteration snapshot + os.makedirs(history_dir, exist_ok=True) + iteration_num = _get_next_iteration(history_dir) + prev_iteration = _load_iteration(history_dir, iteration_num - 1) if iteration_num > 1 else None + snapshot = _save_iteration(history_dir, iteration_num, {}, analysis_result, prev_iteration) + + if snapshot["regressions"]: + print("\n" + "!" * 70) + print("REGRESSIONS DETECTED") + print("!" * 70) + for reg in snapshot["regressions"]: + print( + f" {reg['shot']}: {reg['was']} -> {reg['now']} " + f"(total_diff: {reg['prev_total_diff']} -> {reg['curr_total_diff']})" + ) + + print(f"\nIteration {iteration_num} saved to {history_dir}/iteration_{iteration_num:03d}.json") + summary = analysis_result["summary"] + print(f"Summary: {summary['pass']} pass, {summary['moderate']} moderate, {summary['severe']} severe") + + def cmd_status(args): """Show the last iteration summary.""" iteration_num = get_next_iteration() - 1 @@ -572,6 +826,12 @@ def parse_args(): run_parser.add_argument("--session", default=None, help="Session directory path (all outputs go into session dir)") run_parser.add_argument("--no-sessions", action="store_true", help="Exclude session directories (standard shots only)") + analyze_parser = subparsers.add_parser("analyze", help="Post-scrape analysis: compare, diagnose, generate accuracy reports") + analyze_parser.add_argument("--session", default=None, help="Session directory path") + analyze_parser.add_argument("--no-sessions", action="store_true", help="Exclude session directories (standard shots only)") + analyze_parser.add_argument("--flightscope-export", action="store_true", help="Re-export FlightScope CSV before comparing") + analyze_parser.add_argument("--show", type=int, default=20, help="Number of worst shots to include in critical CSVs (default: 20)") + subparsers.add_parser("status", help="Show last iteration summary") subparsers.add_parser("history", help="Show all iteration summaries") @@ -586,11 +846,12 @@ def main(): args = parse_args() if args.command is None: - print("Usage: calibrate.py {run|status|history|diff}", file=sys.stderr) + print("Usage: calibrate.py {run|analyze|status|history|diff}", file=sys.stderr) sys.exit(1) commands = { "run": cmd_run, + "analyze": cmd_analyze, "status": cmd_status, "history": cmd_history, "diff": cmd_diff, diff --git a/tools/shot_calibration/flightscope_scraper.py b/tools/shot_calibration/flightscope_scraper.py index b122b93..912a981 100644 --- a/tools/shot_calibration/flightscope_scraper.py +++ b/tools/shot_calibration/flightscope_scraper.py @@ -15,6 +15,9 @@ python tools/shot_calibration/flightscope_scraper.py --shots driver2 --visible python tools/shot_calibration/flightscope_scraper.py --shots driver1.json wood1.json python tools/shot_calibration/flightscope_scraper.py --visible + python tools/shot_calibration/flightscope_scraper.py --session assets/data/shot_session_3 --visible + python tools/shot_calibration/flightscope_scraper.py --retry-failed # re-attempt failed shots + python tools/shot_calibration/flightscope_scraper.py --force # ignore existing, start fresh """ import argparse @@ -75,7 +78,6 @@ "wedge2": "wedge_test_shot2.json", "wood_low": "wood_low_test_shot.json", "approach_mid": "approach_mid_iron_test_shot.json", - "approach_test_shot": "approach_test_shot.json", "bump_and_run": "bump_and_run.json", "bump_and_run_slow": "bump_and_run_slow.json", "bump_test_shot": "bump_test_shot.json", @@ -162,15 +164,24 @@ def load_shot_data(filename: str, data_dir: Path = None) -> dict: sidespin = total_spin * math.sin(axis_rad) # Filter out shots outside FlightScope's useful input range - if speed <= 45: - print(f" SKIP: {filename} — speed {speed:.1f} mph <= 45 mph") + if speed < 45: + print(f" SKIP: {filename} — speed {speed:.1f} mph < 45 mph") return None if vla <= 5: print(f" SKIP: {filename} — VLA {vla:.1f}° <= 5°") return None + if vla > 45: + print(f" SKIP: {filename} — VLA {vla:.1f}° > 45° (too steep for FlightScope)") + return None if total_spin < 1000 or total_spin > 12000: print(f" SKIP: {filename} — total spin {total_spin:.0f} RPM outside 1000–12000 range") return None + if hla <= -45 or hla >= 45: + print(f" SKIP: {filename} — HLA {hla:.1f}° outside ±45° range") + return None + if spin_axis <= -45 or spin_axis >= 45: + print(f" SKIP: {filename} — spin axis {spin_axis:.1f}° outside ±45° range") + return None return { "speed_mph": speed, @@ -909,22 +920,40 @@ def _save_results(results: dict, output_path: Path): json.dump(results, f, indent=2) +def _load_existing_results(output_path: Path) -> dict: + """Load previously scraped results from output file, if it exists.""" + if output_path and output_path.exists(): + with open(output_path) as f: + return json.load(f) + return {} + + +def _is_completed(entry: dict) -> bool: + """Check if a result entry represents a successful scrape (has carry data, no failure status).""" + return entry.get("carry_yd") is not None and entry.get("_status") != "failed" + + def scrape_flightscope( shots: dict, visible: bool = False, debug_port: int = None, output_path: Path = None, browser_profile: str = None, + existing_results: dict = None, + retry_failed: bool = False, ) -> dict: """ Automate FlightScope trajectory optimizer to get carry/total/apex. When *debug_port* is set, attaches to an existing browser and leaves it running after scraping completes. + + When *existing_results* is provided, already-completed shots are skipped. + Failed shots are also skipped unless *retry_failed* is True. """ driver = _create_driver(visible, debug_port=debug_port, browser_profile=browser_profile) wait = WebDriverWait(driver, 15) - results = {} + results = dict(existing_results or {}) shot_statuses = {} try: @@ -958,6 +987,15 @@ def scrape_flightscope( if shot_data is None: continue + if shot_name in results: + existing = results[shot_name] + if _is_completed(existing): + _log(f"Skipping {shot_name} (already completed)") + continue + if existing.get("_status") == "failed" and not retry_failed: + _log(f"Skipping {shot_name} (previously failed, use --retry-failed to re-attempt)") + continue + _log(f"Processing {shot_name}: speed={shot_data['speed_mph']:.1f} mph, " f"VLA={shot_data['vla_deg']:.1f}, spin={shot_data['total_spin_rpm']:.0f} rpm, " f"axis={shot_data['spin_axis_deg']:.1f}") @@ -1150,6 +1188,8 @@ def main(): help="Chrome user-data-dir for persistent profile (default: ~/.config/openfairway/scraper-profile)", ) parser.add_argument("--output", type=str, default=None, help="Output file path") + parser.add_argument("--retry-failed", action="store_true", help="Re-scrape shots that previously failed") + parser.add_argument("--force", action="store_true", help="Ignore existing results and start from scratch") args = parser.parse_args() # Resolve session mode @@ -1181,19 +1221,28 @@ def main(): print(f"Loaded {len(shots)} shots") + # Load existing results for resume capability + existing_results = {} if args.force else _load_existing_results(output_path) + + if existing_results: + completed = sum(1 for e in existing_results.values() if _is_completed(e)) + failed = sum(1 for e in existing_results.values() if e.get("_status") == "failed") + remaining = len(shots) - completed - (0 if args.retry_failed else failed) + print(f"Resume: {completed} completed, {failed} failed, {remaining} remaining") + if args.template: results = create_manual_reference(shots) + # Write template output + output_path.parent.mkdir(parents=True, exist_ok=True) + with open(output_path, "w") as f: + json.dump(results, f, indent=2) else: results = scrape_flightscope( shots, visible=args.visible, debug_port=args.debug_port, output_path=output_path, browser_profile=args.browser_profile, + existing_results=existing_results, retry_failed=args.retry_failed, ) - # Write output - output_path.parent.mkdir(parents=True, exist_ok=True) - with open(output_path, "w") as f: - json.dump(results, f, indent=2) - print(f"\nWrote {len(results)} entries to {output_path}") diff --git a/utils/TestShots.cs b/utils/TestShots.cs index af9fded..d38e1fa 100644 --- a/utils/TestShots.cs +++ b/utils/TestShots.cs @@ -21,7 +21,6 @@ public static class TestShots { "Bump", "res://assets/data/bump_test_shot.json" }, { "Bump & Run", "res://assets/data/bump_and_run.json" }, { "Bump & Run SL", "res://assets/data/bump_and_run_slow.json" }, - { "Approach", "res://assets/data/approach_test_shot.json" }, { "Approach Mid", "res://assets/data/approach_mid_iron_test_shot.json" }, { "Topped", "res://assets/data/topped_test_shot.json" }, { "Checked", "res://assets/data/checked_test_shot.json" },