flightanalysis 0.2.18__tar.gz → 0.3.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {flightanalysis-0.2.18 → flightanalysis-0.3.0}/PKG-INFO +7 -5
- flightanalysis-0.3.0/create_schedules.py +24 -0
- flightanalysis-0.3.0/examples/make_manoeuvre.py +40 -0
- {flightanalysis-0.2.18 → flightanalysis-0.3.0}/flightanalysis/analysis/el_analysis.py +2 -3
- {flightanalysis-0.2.18 → flightanalysis-0.3.0}/flightanalysis/analysis/manoeuvre_analysis/alignment.py +44 -36
- {flightanalysis-0.2.18 → flightanalysis-0.3.0}/flightanalysis/analysis/manoeuvre_analysis/basic.py +58 -41
- flightanalysis-0.3.0/flightanalysis/analysis/manoeuvre_analysis/complete.py +317 -0
- flightanalysis-0.3.0/flightanalysis/analysis/sch_analysis.py +151 -0
- flightanalysis-0.3.0/flightanalysis/base/ref_funcs.py +65 -0
- {flightanalysis-0.2.18 → flightanalysis-0.3.0}/flightanalysis/data/f3a_a25_schedule.json +1163 -670
- {flightanalysis-0.2.18 → flightanalysis-0.3.0}/flightanalysis/data/f3a_f25_schedule.json +1531 -1283
- {flightanalysis-0.2.18 → flightanalysis-0.3.0}/flightanalysis/data/f3a_p23_schedule.json +1386 -1072
- {flightanalysis-0.2.18 → flightanalysis-0.3.0}/flightanalysis/data/f3a_p25_schedule.json +1581 -1261
- {flightanalysis-0.2.18 → flightanalysis-0.3.0}/flightanalysis/data/f3auk_clubman_schedule.json +877 -475
- {flightanalysis-0.2.18 → flightanalysis-0.3.0}/flightanalysis/data/f3auk_inter_schedule.json +840 -457
- {flightanalysis-0.2.18 → flightanalysis-0.3.0}/flightanalysis/definition/__init__.py +0 -1
- {flightanalysis-0.2.18 → flightanalysis-0.3.0}/flightanalysis/definition/builders/elbuilders.py +34 -77
- flightanalysis-0.3.0/flightanalysis/definition/builders/manbuilder.py +322 -0
- {flightanalysis-0.2.18/examples/schedule_construction → flightanalysis-0.3.0/flightanalysis/definition/builders/schedules}/AMA_Intermediate2024.py +7 -4
- {flightanalysis-0.2.18/examples/schedule_construction → flightanalysis-0.3.0/flightanalysis/definition/builders/schedules}/f3a_a25.py +7 -6
- {flightanalysis-0.2.18/examples/schedule_construction → flightanalysis-0.3.0/flightanalysis/definition/builders/schedules}/f3a_f25.py +19 -13
- {flightanalysis-0.2.18/examples/schedule_construction → flightanalysis-0.3.0/flightanalysis/definition/builders/schedules}/f3a_p23.py +13 -11
- {flightanalysis-0.2.18/examples/schedule_construction → flightanalysis-0.3.0/flightanalysis/definition/builders/schedules}/f3a_p25.py +12 -8
- {flightanalysis-0.2.18/examples/schedule_construction → flightanalysis-0.3.0/flightanalysis/definition/builders/schedules}/f3auk_clubman.py +9 -7
- {flightanalysis-0.2.18/examples/schedule_construction → flightanalysis-0.3.0/flightanalysis/definition/builders/schedules}/f3auk_intermediate.py +3 -2
- {flightanalysis-0.2.18/examples/schedule_construction → flightanalysis-0.3.0/flightanalysis/definition/builders/schedules}/imac_sport2024.py +7 -1
- {flightanalysis-0.2.18/examples/schedule_construction → flightanalysis-0.3.0/flightanalysis/definition/builders/schedules}/imac_unlim2024.py +9 -3
- {flightanalysis-0.2.18/examples/schedule_construction → flightanalysis-0.3.0/flightanalysis/definition/builders/schedules}/nsrca_inter2024.py +7 -5
- {flightanalysis-0.2.18 → flightanalysis-0.3.0}/flightanalysis/definition/collectors.py +1 -1
- {flightanalysis-0.2.18 → flightanalysis-0.3.0}/flightanalysis/definition/eldef.py +48 -47
- {flightanalysis-0.2.18 → flightanalysis-0.3.0}/flightanalysis/definition/mandef.py +81 -65
- {flightanalysis-0.2.18 → flightanalysis-0.3.0}/flightanalysis/definition/manparm.py +113 -59
- {flightanalysis-0.2.18 → flightanalysis-0.3.0}/flightanalysis/definition/operations/funopp.py +0 -1
- {flightanalysis-0.2.18 → flightanalysis-0.3.0}/flightanalysis/definition/operations/operation.py +4 -2
- {flightanalysis-0.2.18 → flightanalysis-0.3.0}/flightanalysis/definition/operations/sumopp.py +2 -2
- {flightanalysis-0.2.18 → flightanalysis-0.3.0}/flightanalysis/definition/scheddef.py +1 -0
- flightanalysis-0.3.0/flightanalysis/elements/__init__.py +6 -0
- {flightanalysis-0.2.18 → flightanalysis-0.3.0}/flightanalysis/elements/element.py +9 -47
- {flightanalysis-0.2.18 → flightanalysis-0.3.0}/flightanalysis/elements/line.py +2 -2
- {flightanalysis-0.2.18 → flightanalysis-0.3.0}/flightanalysis/elements/loop.py +31 -33
- flightanalysis-0.3.0/flightanalysis/elements/snap.py +116 -0
- flightanalysis-0.3.0/flightanalysis/elements/spin.py +128 -0
- {flightanalysis-0.2.18 → flightanalysis-0.3.0}/flightanalysis/fcjson.py +29 -18
- flightanalysis-0.3.0/flightanalysis/manoeuvre.py +129 -0
- {flightanalysis-0.2.18 → flightanalysis-0.3.0}/flightanalysis/scoring/criteria/__init__.py +3 -2
- {flightanalysis-0.2.18 → flightanalysis-0.3.0}/flightanalysis/scoring/criteria/criteria.py +6 -4
- flightanalysis-0.3.0/flightanalysis/scoring/criteria/exponential.py +37 -0
- flightanalysis-0.3.0/flightanalysis/scoring/criteria/f3a_criteria.py +81 -0
- flightanalysis-0.3.0/flightanalysis/scoring/criteria/inter/comparison.py +17 -0
- {flightanalysis-0.2.18 → flightanalysis-0.3.0}/flightanalysis/scoring/criteria/intra/bounded.py +31 -26
- flightanalysis-0.3.0/flightanalysis/scoring/criteria/intra/continuous.py +76 -0
- flightanalysis-0.3.0/flightanalysis/scoring/criteria/intra/peak.py +20 -0
- flightanalysis-0.3.0/flightanalysis/scoring/criteria/intra/single.py +26 -0
- flightanalysis-0.3.0/flightanalysis/scoring/downgrade.py +98 -0
- flightanalysis-0.3.0/flightanalysis/scoring/f3a_downgrades.py +73 -0
- flightanalysis-0.3.0/flightanalysis/scoring/measurement.py +444 -0
- flightanalysis-0.3.0/flightanalysis/scoring/results.py +377 -0
- flightanalysis-0.3.0/flightanalysis/scoring/selectors.py +102 -0
- flightanalysis-0.3.0/flightanalysis/scoring/smoothing.py +73 -0
- flightanalysis-0.3.0/flightanalysis/scoring/visibility.py +21 -0
- {flightanalysis-0.2.18 → flightanalysis-0.3.0}/flightanalysis/scripts/collect_scores.py +47 -38
- flightanalysis-0.3.0/flightanalysis/scripts/plot_scores.py +51 -0
- {flightanalysis-0.2.18 → flightanalysis-0.3.0}/flightanalysis.egg-info/PKG-INFO +7 -5
- {flightanalysis-0.2.18 → flightanalysis-0.3.0}/flightanalysis.egg-info/SOURCES.txt +24 -19
- {flightanalysis-0.2.18 → flightanalysis-0.3.0}/flightanalysis.egg-info/requires.txt +6 -4
- {flightanalysis-0.2.18 → flightanalysis-0.3.0}/requirements-dev.txt +4 -3
- flightanalysis-0.3.0/requirements.txt +11 -0
- flightanalysis-0.3.0/tests/data/scored_fcj.json +250110 -0
- {flightanalysis-0.2.18 → flightanalysis-0.3.0}/tests/data/unscored_fcj.json +0 -2279
- {flightanalysis-0.2.18 → flightanalysis-0.3.0}/tests/test_criiteria.py +7 -7
- {flightanalysis-0.2.18 → flightanalysis-0.3.0}/tests/test_fcjscore.py +15 -6
- flightanalysis-0.3.0/tests/test_rfuncs.py +24 -0
- flightanalysis-0.3.0/tests/test_schedule/test_element/test_schedule_element_snap.py +40 -0
- flightanalysis-0.3.0/tests/test_schedule/test_element/test_schedule_element_spin.py +41 -0
- {flightanalysis-0.2.18 → flightanalysis-0.3.0}/tests/test_schedule/test_measurement.py +1 -20
- flightanalysis-0.3.0/tests/test_selectors.py +27 -0
- flightanalysis-0.2.18/examples/schedule_construction/create_all.py +0 -21
- flightanalysis-0.2.18/examples/schedule_construction/make_manoeuvre.py +0 -48
- flightanalysis-0.2.18/examples/scoring/f3a_criteria_maker.py +0 -69
- flightanalysis-0.2.18/examples/scoring/temp.py +0 -24
- flightanalysis-0.2.18/flightanalysis/analysis/manoeuvre_analysis/complete.py +0 -248
- flightanalysis-0.2.18/flightanalysis/analysis/sch_analysis.py +0 -117
- flightanalysis-0.2.18/flightanalysis/definition/builders/manbuilder.py +0 -310
- flightanalysis-0.2.18/flightanalysis/elements/__init__.py +0 -8
- flightanalysis-0.2.18/flightanalysis/elements/autorotation.py +0 -65
- flightanalysis-0.2.18/flightanalysis/elements/nose_drop.py +0 -51
- flightanalysis-0.2.18/flightanalysis/elements/pitch_break.py +0 -48
- flightanalysis-0.2.18/flightanalysis/elements/recovery.py +0 -35
- flightanalysis-0.2.18/flightanalysis/manoeuvre.py +0 -169
- flightanalysis-0.2.18/flightanalysis/scoring/criteria/exponential.py +0 -33
- flightanalysis-0.2.18/flightanalysis/scoring/criteria/f3a_criteria.py +0 -41
- flightanalysis-0.2.18/flightanalysis/scoring/criteria/inter/comparison.py +0 -20
- flightanalysis-0.2.18/flightanalysis/scoring/criteria/intra/continuous.py +0 -116
- flightanalysis-0.2.18/flightanalysis/scoring/criteria/intra/single.py +0 -34
- flightanalysis-0.2.18/flightanalysis/scoring/downgrade.py +0 -45
- flightanalysis-0.2.18/flightanalysis/scoring/f3a_downgrades.py +0 -48
- flightanalysis-0.2.18/flightanalysis/scoring/measurement.py +0 -401
- flightanalysis-0.2.18/flightanalysis/scoring/results.py +0 -253
- flightanalysis-0.2.18/flightanalysis/scripts/plot_scores.py +0 -22
- flightanalysis-0.2.18/requirements.txt +0 -10
- flightanalysis-0.2.18/tests/data/scored_fcj.json +0 -1
- {flightanalysis-0.2.18 → flightanalysis-0.3.0}/.github/workflows/publish_pypi.yml +0 -0
- {flightanalysis-0.2.18 → flightanalysis-0.3.0}/.gitignore +0 -0
- {flightanalysis-0.2.18 → flightanalysis-0.3.0}/LICENSE +0 -0
- {flightanalysis-0.2.18 → flightanalysis-0.3.0}/MANIFEST.in +0 -0
- {flightanalysis-0.2.18 → flightanalysis-0.3.0}/README.md +0 -0
- {flightanalysis-0.2.18 → flightanalysis-0.3.0}/examples/__init__.py +0 -0
- {flightanalysis-0.2.18 → flightanalysis-0.3.0}/examples/data/__init__.py +0 -0
- {flightanalysis-0.2.18 → flightanalysis-0.3.0}/examples/data/manual_F3A_F23_22_04_28_00000231.json +0 -0
- {flightanalysis-0.2.18 → flightanalysis-0.3.0}/examples/data/manual_F3A_P23_22_05_31_00000350.json +0 -0
- {flightanalysis-0.2.18 → flightanalysis-0.3.0}/examples/data/manual_F3A_P23_23_08_11_00000094.json +0 -0
- {flightanalysis-0.2.18 → flightanalysis-0.3.0}/examples/scoring/__init__.py +0 -0
- {flightanalysis-0.2.18 → flightanalysis-0.3.0}/examples/scoring/judging.py +0 -0
- {flightanalysis-0.2.18/examples/schedule_construction → flightanalysis-0.3.0/examples/scoring/manoeuvres}/__init__.py +0 -0
- {flightanalysis-0.2.18 → flightanalysis-0.3.0}/examples/scoring/manoeuvres/inter_analysis.py +0 -0
- {flightanalysis-0.2.18 → flightanalysis-0.3.0}/examples/scoring/manoeuvres/intra_analysis.py +0 -0
- {flightanalysis-0.2.18/examples/scoring/manoeuvres → flightanalysis-0.3.0/examples/scoring/manoeuvres/mans}/__init__.py +0 -0
- {flightanalysis-0.2.18 → flightanalysis-0.3.0}/examples/scoring/manoeuvres/mans/extract_mans.py +0 -0
- {flightanalysis-0.2.18 → flightanalysis-0.3.0}/examples/scoring/manoeuvres/mans/tHat.json +0 -0
- {flightanalysis-0.2.18 → flightanalysis-0.3.0}/examples/scoring/manoeuvres/positioning_analysis.py +0 -0
- {flightanalysis-0.2.18 → flightanalysis-0.3.0}/flightanalysis/__init__.py +0 -0
- {flightanalysis-0.2.18 → flightanalysis-0.3.0}/flightanalysis/analysis/__init__.py +0 -0
- {flightanalysis-0.2.18 → flightanalysis-0.3.0}/flightanalysis/analysis/manoeuvre_analysis/__init__.py +0 -0
- {flightanalysis-0.2.18 → flightanalysis-0.3.0}/flightanalysis/analysis/manoeuvre_analysis/analysis.py +0 -0
- {flightanalysis-0.2.18 → flightanalysis-0.3.0}/flightanalysis/analysis/manoeuvre_analysis/scored.py +0 -0
- {flightanalysis-0.2.18 → flightanalysis-0.3.0}/flightanalysis/base/utils.py +0 -0
- {flightanalysis-0.2.18 → flightanalysis-0.3.0}/flightanalysis/data/IMAC_Unlimited2024_schedule.json +0 -0
- {flightanalysis-0.2.18 → flightanalysis-0.3.0}/flightanalysis/data/__init__.py +0 -0
- {flightanalysis-0.2.18/examples/scoring/manoeuvres/mans → flightanalysis-0.3.0/flightanalysis/definition/builders}/__init__.py +0 -0
- {flightanalysis-0.2.18/flightanalysis/definition/builders → flightanalysis-0.3.0/flightanalysis/definition/builders/schedules}/__init__.py +0 -0
- {flightanalysis-0.2.18 → flightanalysis-0.3.0}/flightanalysis/definition/maninfo.py +0 -0
- {flightanalysis-0.2.18 → flightanalysis-0.3.0}/flightanalysis/definition/manoption.py +0 -0
- {flightanalysis-0.2.18 → flightanalysis-0.3.0}/flightanalysis/definition/operations/__init__.py +0 -0
- {flightanalysis-0.2.18 → flightanalysis-0.3.0}/flightanalysis/definition/operations/itemopp.py +0 -0
- {flightanalysis-0.2.18 → flightanalysis-0.3.0}/flightanalysis/definition/operations/mathopp.py +0 -0
- {flightanalysis-0.2.18 → flightanalysis-0.3.0}/flightanalysis/definition/scheduleinfo.py +0 -0
- {flightanalysis-0.2.18 → flightanalysis-0.3.0}/flightanalysis/elements/stall_turn.py +0 -0
- {flightanalysis-0.2.18 → flightanalysis-0.3.0}/flightanalysis/schedule.py +0 -0
- {flightanalysis-0.2.18 → flightanalysis-0.3.0}/flightanalysis/scoring/__init__.py +0 -0
- {flightanalysis-0.2.18 → flightanalysis-0.3.0}/flightanalysis/scoring/criteria/inter/__init__.py +0 -0
- {flightanalysis-0.2.18 → flightanalysis-0.3.0}/flightanalysis/scoring/criteria/inter/combination.py +0 -0
- {flightanalysis-0.2.18 → flightanalysis-0.3.0}/flightanalysis/scoring/criteria/intra/__init__.py +0 -0
- {flightanalysis-0.2.18 → flightanalysis-0.3.0}/flightanalysis/version.py +0 -0
- {flightanalysis-0.2.18 → flightanalysis-0.3.0}/flightanalysis.egg-info/dependency_links.txt +0 -0
- {flightanalysis-0.2.18 → flightanalysis-0.3.0}/flightanalysis.egg-info/entry_points.txt +0 -0
- {flightanalysis-0.2.18 → flightanalysis-0.3.0}/flightanalysis.egg-info/top_level.txt +0 -0
- {flightanalysis-0.2.18 → flightanalysis-0.3.0}/pyproject.toml +0 -0
- {flightanalysis-0.2.18 → flightanalysis-0.3.0}/setup.cfg +0 -0
- {flightanalysis-0.2.18 → flightanalysis-0.3.0}/tests/EmailedBox.f3a +0 -0
- {flightanalysis-0.2.18 → flightanalysis-0.3.0}/tests/__init__.py +0 -0
- {flightanalysis-0.2.18 → flightanalysis-0.3.0}/tests/conftest.py +0 -0
- {flightanalysis-0.2.18 → flightanalysis-0.3.0}/tests/data/manual_F3A_P23.json +0 -0
- {flightanalysis-0.2.18 → flightanalysis-0.3.0}/tests/data/old_json.json +0 -0
- {flightanalysis-0.2.18 → flightanalysis-0.3.0}/tests/data/p23.BIN +0 -0
- {flightanalysis-0.2.18 → flightanalysis-0.3.0}/tests/data/p23_box.f3a +0 -0
- {flightanalysis-0.2.18 → flightanalysis-0.3.0}/tests/data/p23_fc.json +0 -0
- {flightanalysis-0.2.18 → flightanalysis-0.3.0}/tests/data/p23_flight.json +0 -0
- {flightanalysis-0.2.18 → flightanalysis-0.3.0}/tests/test_data.py +0 -0
- {flightanalysis-0.2.18 → flightanalysis-0.3.0}/tests/test_schedule/__init__.py +0 -0
- {flightanalysis-0.2.18 → flightanalysis-0.3.0}/tests/test_schedule/test_definition/__init__.py +0 -0
- {flightanalysis-0.2.18 → flightanalysis-0.3.0}/tests/test_schedule/test_definition/test_definition_eldef.py +0 -0
- {flightanalysis-0.2.18 → flightanalysis-0.3.0}/tests/test_schedule/test_definition/test_definition_manparm.py +0 -0
- {flightanalysis-0.2.18 → flightanalysis-0.3.0}/tests/test_schedule/test_definition/test_definition_mpopp.py +0 -0
- {flightanalysis-0.2.18 → flightanalysis-0.3.0}/tests/test_schedule/test_definition/test_schedule_definition.py +0 -0
- {flightanalysis-0.2.18 → flightanalysis-0.3.0}/tests/test_schedule/test_definition/test_schedule_definition_maninfo.py +0 -0
- {flightanalysis-0.2.18 → flightanalysis-0.3.0}/tests/test_schedule/test_element/__init__.py +0 -0
- {flightanalysis-0.2.18 → flightanalysis-0.3.0}/tests/test_schedule/test_element/loop_analysis.json +0 -0
- {flightanalysis-0.2.18 → flightanalysis-0.3.0}/tests/test_schedule/test_element/p23_th_e0.csv +0 -0
- {flightanalysis-0.2.18 → flightanalysis-0.3.0}/tests/test_schedule/test_element/p23_th_e0.json +0 -0
- {flightanalysis-0.2.18 → flightanalysis-0.3.0}/tests/test_schedule/test_element/p23_th_e0_template.csv +0 -0
- {flightanalysis-0.2.18 → flightanalysis-0.3.0}/tests/test_schedule/test_element/test_schedule_element.py +0 -0
- {flightanalysis-0.2.18 → flightanalysis-0.3.0}/tests/test_schedule/test_element/test_schedule_element_line.py +0 -0
- {flightanalysis-0.2.18 → flightanalysis-0.3.0}/tests/test_schedule/test_element/test_schedule_element_loop.py +0 -0
- {flightanalysis-0.2.18 → flightanalysis-0.3.0}/tests/test_schedule/test_element/test_schedule_element_nose_drop.py +0 -0
- {flightanalysis-0.2.18 → flightanalysis-0.3.0}/tests/test_schedule/test_element/test_schedule_element_pitch_break.py +0 -0
- {flightanalysis-0.2.18 → flightanalysis-0.3.0}/tests/test_schedule/test_element/test_schedule_element_recovery.py +0 -0
- {flightanalysis-0.2.18 → flightanalysis-0.3.0}/tests/test_schedule/test_element/test_schedule_element_stallturn.py +0 -0
- {flightanalysis-0.2.18 → flightanalysis-0.3.0}/tests/test_schedule/test_schedule_manoeuvre.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: flightanalysis
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.3.0
|
|
4
4
|
Summary: A package for analysing flight data
|
|
5
5
|
Author-email: Thomas David <thomasdavid0@gmail.com>
|
|
6
6
|
License: GNU GPL v3
|
|
@@ -15,9 +15,10 @@ Requires-Dist: fastdtw
|
|
|
15
15
|
Requires-Dist: simplejson
|
|
16
16
|
Requires-Dist: loguru
|
|
17
17
|
Requires-Dist: joblib
|
|
18
|
-
Requires-Dist: pfc-geometry>=0.2.
|
|
19
|
-
Requires-Dist: flightdata>=0.2.
|
|
18
|
+
Requires-Dist: pfc-geometry>=0.2.9
|
|
19
|
+
Requires-Dist: flightdata>=0.2.17
|
|
20
20
|
Requires-Dist: GitPython
|
|
21
|
+
Requires-Dist: pyperclip
|
|
21
22
|
Provides-Extra: dev
|
|
22
23
|
Requires-Dist: numpy; extra == "dev"
|
|
23
24
|
Requires-Dist: pandas; extra == "dev"
|
|
@@ -26,11 +27,12 @@ Requires-Dist: fastdtw; extra == "dev"
|
|
|
26
27
|
Requires-Dist: simplejson; extra == "dev"
|
|
27
28
|
Requires-Dist: loguru; extra == "dev"
|
|
28
29
|
Requires-Dist: joblib; extra == "dev"
|
|
29
|
-
Requires-Dist: pfc-geometry>=0.2.
|
|
30
|
-
Requires-Dist: flightdata>=0.2.
|
|
30
|
+
Requires-Dist: pfc-geometry>=0.2.9; extra == "dev"
|
|
31
|
+
Requires-Dist: flightdata>=0.2.17; extra == "dev"
|
|
31
32
|
Requires-Dist: ardupilot_log_reader>=0.3.3; extra == "dev"
|
|
32
33
|
Requires-Dist: pymavlink; extra == "dev"
|
|
33
34
|
Requires-Dist: GitPython; extra == "dev"
|
|
35
|
+
Requires-Dist: pyperclip; extra == "dev"
|
|
34
36
|
|
|
35
37
|
# FlightAnalysis
|
|
36
38
|
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
from flightanalysis.definition.builders.schedules.f3a_p23 import p23_def
|
|
2
|
+
from flightanalysis.definition.builders.schedules.f3a_a25 import a25_def
|
|
3
|
+
from flightanalysis.definition.builders.schedules.f3a_p25 import p25_def
|
|
4
|
+
from flightanalysis.definition.builders.schedules.f3a_f25 import f25_def
|
|
5
|
+
#from imac_unlim2024 import sdef as imac_unl2024_def
|
|
6
|
+
from flightanalysis.definition.builders.schedules.f3auk_clubman import clubman_def as f3auk_club_def
|
|
7
|
+
from flightanalysis.definition.builders.schedules.f3auk_intermediate import intermediate_def as f3auk_int_def
|
|
8
|
+
|
|
9
|
+
sdefs = {
|
|
10
|
+
'f3a_p23_schedule': p23_def,
|
|
11
|
+
'f3a_a25_schedule': a25_def,
|
|
12
|
+
'f3a_p25_schedule': p25_def,
|
|
13
|
+
'f3a_f25_schedule': f25_def,
|
|
14
|
+
#'IMAC_Unlimited2024_schedule': imac_unl2024_def,
|
|
15
|
+
'f3auk_clubman_schedule': f3auk_club_def,
|
|
16
|
+
'f3auk_inter_schedule': f3auk_int_def
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
def create_all():
|
|
20
|
+
for k, sdef in sdefs.items():
|
|
21
|
+
sdef.to_json(f"flightanalysis/data/{k}.json")
|
|
22
|
+
|
|
23
|
+
if __name__ == '__main__':
|
|
24
|
+
create_all()
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
from flightplotting import plotsec, plot_regions
|
|
2
|
+
from flightplotting.traces import axis_rate_trace
|
|
3
|
+
from flightanalysis import (
|
|
4
|
+
ManDef, BoxLocation, Position, Height, Direction,
|
|
5
|
+
Orientation, ManInfo, r, MBTags, c45, centred, ManParm, Combination)
|
|
6
|
+
import numpy as np
|
|
7
|
+
from flightanalysis.definition import f3amb
|
|
8
|
+
from flightdata import NumpyEncoder
|
|
9
|
+
import plotly.graph_objects as go
|
|
10
|
+
from json import dumps
|
|
11
|
+
import geometry as g
|
|
12
|
+
|
|
13
|
+
mdef: ManDef = f3amb.create(ManInfo(
|
|
14
|
+
"Spin", "iSpin", k=3, position=Position.CENTRE,
|
|
15
|
+
start=BoxLocation(Height.TOP, Direction.UPWIND, Orientation.INVERTED),
|
|
16
|
+
end=BoxLocation(Height.BTM),
|
|
17
|
+
),[
|
|
18
|
+
MBTags.CENTRE,
|
|
19
|
+
f3amb.spin(r(2)),
|
|
20
|
+
f3amb.roll(r(0.5), line_length=165),
|
|
21
|
+
f3amb.loop(np.pi/2),
|
|
22
|
+
])
|
|
23
|
+
|
|
24
|
+
data = mdef.to_dict()
|
|
25
|
+
print(dumps(data, indent=2, cls=NumpyEncoder))
|
|
26
|
+
mdef = ManDef.from_dict(data)
|
|
27
|
+
|
|
28
|
+
it = g.Transformation(g.Point(-20,150,50), mdef.info.initial_transform(150, 1).rotation)
|
|
29
|
+
|
|
30
|
+
man = mdef.create()
|
|
31
|
+
|
|
32
|
+
tp = man.create_template(it)
|
|
33
|
+
|
|
34
|
+
fig = plot_regions(tp, 'element', span=5)
|
|
35
|
+
fig = plotsec(tp, fig=fig, nmodels=10, scale=5)
|
|
36
|
+
#fig.add_traces(boxtrace())
|
|
37
|
+
fig.show()
|
|
38
|
+
|
|
39
|
+
fig = go.Figure(data=axis_rate_trace(tp))
|
|
40
|
+
fig.show()
|
|
@@ -2,7 +2,6 @@ from __future__ import annotations
|
|
|
2
2
|
from flightdata import State
|
|
3
3
|
from typing import Self
|
|
4
4
|
from flightanalysis import ElDef, Element, ManParms
|
|
5
|
-
import numpy as np
|
|
6
5
|
from dataclasses import dataclass
|
|
7
6
|
import geometry as g
|
|
8
7
|
|
|
@@ -18,7 +17,7 @@ class ElementAnalysis:
|
|
|
18
17
|
|
|
19
18
|
def plot_3d(self, **kwargs):
|
|
20
19
|
from flightplotting import plotsec
|
|
21
|
-
return plotsec(
|
|
20
|
+
return plotsec(dict(fl=self.fl, tp=self.tp), **kwargs)
|
|
22
21
|
|
|
23
22
|
def to_dict(self):
|
|
24
23
|
return {k: v.to_dict() for k, v in self.__dict__.items()}
|
|
@@ -36,5 +35,5 @@ class ElementAnalysis:
|
|
|
36
35
|
)
|
|
37
36
|
|
|
38
37
|
def intra_score(self):
|
|
39
|
-
return self.edef.dgs.apply(self.el, self.fl, self.tp)
|
|
38
|
+
return self.edef.dgs.apply(self.el.uid, self.fl, self.tp) #[dg.apply(self.el.uid + (f'_{k}' if len(k) > 0 else ''), self.fl, self.tp) for k, dg in self.edef.dgs.items()]
|
|
40
39
|
|
|
@@ -2,64 +2,73 @@ from __future__ import annotations
|
|
|
2
2
|
from dataclasses import dataclass
|
|
3
3
|
from flightdata import State
|
|
4
4
|
from flightanalysis.manoeuvre import Manoeuvre
|
|
5
|
+
from flightanalysis.elements import Element
|
|
5
6
|
from loguru import logger
|
|
6
7
|
from .basic import Basic
|
|
7
8
|
from flightanalysis.definition import ManDef, ScheduleInfo
|
|
8
9
|
from ..el_analysis import ElementAnalysis
|
|
9
10
|
|
|
11
|
+
|
|
10
12
|
@dataclass
|
|
11
13
|
class Alignment(Basic):
|
|
12
14
|
manoeuvre: Manoeuvre | None
|
|
13
15
|
template: State | None
|
|
14
16
|
|
|
15
17
|
def __getattr__(self, name) -> ElementAnalysis:
|
|
18
|
+
el: Element = self.manoeuvre.elements.data[name]
|
|
16
19
|
return ElementAnalysis(
|
|
17
20
|
self.mdef.eds.data[name],
|
|
18
21
|
self.mdef.mps,
|
|
19
|
-
|
|
20
|
-
self.flown
|
|
21
|
-
self.template
|
|
22
|
-
self.template
|
|
22
|
+
el,
|
|
23
|
+
el.get_data(self.flown),
|
|
24
|
+
el.get_data(self.template),
|
|
25
|
+
el.get_data(self.template)[0].transform,
|
|
23
26
|
)
|
|
24
27
|
|
|
25
|
-
def run_all(
|
|
26
|
-
|
|
28
|
+
def run_all(
|
|
29
|
+
self, optimise_aligment=True, force=False
|
|
30
|
+
) -> Alignment | Complete | Scored:
|
|
31
|
+
if self.__class__.__name__ == "Scored" and force:
|
|
27
32
|
self = self.downgrade()
|
|
28
33
|
new = self
|
|
29
|
-
while self.__class__.__name__ !=
|
|
30
|
-
new =
|
|
34
|
+
while self.__class__.__name__ != "Scored":
|
|
35
|
+
new = (
|
|
36
|
+
self.run(optimise_aligment)
|
|
37
|
+
if isinstance(self, Complete)
|
|
38
|
+
else self.run()
|
|
39
|
+
)
|
|
31
40
|
if new.__class__.__name__ == self.__class__.__name__:
|
|
32
41
|
break
|
|
33
42
|
self = new
|
|
34
43
|
return new
|
|
35
|
-
|
|
44
|
+
|
|
36
45
|
@staticmethod
|
|
37
46
|
def from_dict(data: dict, fallback=True):
|
|
38
47
|
ia = Basic.from_dict(data)
|
|
39
|
-
try:
|
|
48
|
+
try:
|
|
40
49
|
ia = Alignment(
|
|
41
|
-
manoeuvre=Manoeuvre.from_dict(data[
|
|
42
|
-
template=State.from_dict(data[
|
|
43
|
-
**ia.__dict__
|
|
50
|
+
manoeuvre=Manoeuvre.from_dict(data["manoeuvre"]),
|
|
51
|
+
template=State.from_dict(data["template"]),
|
|
52
|
+
**ia.__dict__,
|
|
44
53
|
)
|
|
45
54
|
except Exception as e:
|
|
46
55
|
if fallback:
|
|
47
|
-
logger.debug(f
|
|
56
|
+
logger.debug(f"Failed to parse Alignment {repr(e)}")
|
|
48
57
|
else:
|
|
49
58
|
raise e
|
|
50
59
|
return ia
|
|
51
60
|
|
|
52
61
|
def run(self) -> Alignment | Complete:
|
|
53
|
-
if
|
|
62
|
+
if "element" not in self.flown.data.columns:
|
|
54
63
|
try:
|
|
55
64
|
self = self._run(True)[1]
|
|
56
65
|
except Exception as e:
|
|
57
|
-
logger.error(f
|
|
66
|
+
logger.error(f"Failed to run alignment stage 1: {repr(e)}")
|
|
58
67
|
return self
|
|
59
68
|
try:
|
|
60
69
|
return self._run(False)[1].proceed()
|
|
61
70
|
except Exception as e:
|
|
62
|
-
logger.error(f
|
|
71
|
+
logger.error(f"Failed to run alignment stage 2: {repr(e)}")
|
|
63
72
|
return self
|
|
64
73
|
|
|
65
74
|
def _run(self, mirror=False, radius=10) -> Alignment:
|
|
@@ -72,33 +81,32 @@ class Alignment(Basic):
|
|
|
72
81
|
return Alignment(self.id, mdef, aligned, self.direction, man, tp)
|
|
73
82
|
|
|
74
83
|
def _proceed(self) -> Complete:
|
|
75
|
-
if
|
|
76
|
-
correction = self.mdef.create(
|
|
84
|
+
if "element" in self.flown.data.columns:
|
|
85
|
+
correction = self.mdef.create()
|
|
77
86
|
return Complete(
|
|
78
|
-
self.id,
|
|
79
|
-
self.
|
|
80
|
-
|
|
87
|
+
self.id,
|
|
88
|
+
self.mdef,
|
|
89
|
+
self.flown,
|
|
90
|
+
self.direction,
|
|
91
|
+
self.manoeuvre,
|
|
92
|
+
self.template,
|
|
93
|
+
correction,
|
|
94
|
+
correction.create_template(self.template[0], self.flown),
|
|
81
95
|
)
|
|
82
96
|
else:
|
|
83
97
|
return self
|
|
84
98
|
|
|
85
|
-
def to_mindict(self, sinfo: ScheduleInfo=None, full=False):
|
|
86
|
-
data = dict(
|
|
87
|
-
els = self.flown.label_ranges('element').to_dict('records')
|
|
88
|
-
)
|
|
99
|
+
def to_mindict(self, sinfo: ScheduleInfo = None, full=False):
|
|
100
|
+
data = dict(els=self.flown.label_ranges("element").to_dict("records"))
|
|
89
101
|
if full:
|
|
90
|
-
data = dict(
|
|
91
|
-
**super().to_mindict(sinfo),
|
|
92
|
-
**data
|
|
93
|
-
)
|
|
102
|
+
data = dict(**super().to_mindict(sinfo), **data)
|
|
94
103
|
return data
|
|
95
104
|
|
|
96
105
|
def fcj_results(self):
|
|
97
|
-
df = self.flown.label_ranges(
|
|
98
|
-
df.columns = [
|
|
99
|
-
return dict(
|
|
100
|
-
|
|
101
|
-
)
|
|
106
|
+
df = self.flown.label_ranges("element").iloc[:, :3]
|
|
107
|
+
df.columns = ["name", "start", "stop"]
|
|
108
|
+
return dict(els=df.to_dict("records"))
|
|
109
|
+
|
|
102
110
|
|
|
103
111
|
from .complete import Complete # noqa: E402
|
|
104
|
-
from .scored import Scored # noqa: E402
|
|
112
|
+
from .scored import Scored # noqa: E402
|
{flightanalysis-0.2.18 → flightanalysis-0.3.0}/flightanalysis/analysis/manoeuvre_analysis/basic.py
RENAMED
|
@@ -23,54 +23,64 @@ class Basic(Analysis):
|
|
|
23
23
|
def run_all(self, optimise_aligment=True, force=False) -> Scored:
|
|
24
24
|
"""Run the analysis to the final stage, for the case where the elements have not been labelled"""
|
|
25
25
|
drs = [r._run(True) for r in self.run()]
|
|
26
|
-
|
|
26
|
+
|
|
27
27
|
dr = drs[np.argmin([dr[0] for dr in drs])]
|
|
28
28
|
|
|
29
29
|
return dr[1].run_all(optimise_aligment, force)
|
|
30
30
|
|
|
31
31
|
def proceed(self) -> Complete:
|
|
32
32
|
"""Proceed the analysis to the final stage for the case where the elements have already been labelled"""
|
|
33
|
-
if
|
|
33
|
+
if "element" not in self.flown.data.columns:
|
|
34
34
|
return self
|
|
35
35
|
mopt = ManOption([self.mdef]) if isinstance(self.mdef, ManDef) else self.mdef
|
|
36
|
-
elnames = self.flown.data.element.unique()
|
|
36
|
+
elnames = self.flown.data.element.unique().astype(str)
|
|
37
37
|
for md in mopt:
|
|
38
|
-
if np.all(
|
|
38
|
+
if np.all(
|
|
39
|
+
[np.any(np.char.startswith(elnames, k)) for k in md.eds.data.keys()]
|
|
40
|
+
):
|
|
39
41
|
mdef = md
|
|
40
42
|
break
|
|
41
43
|
else:
|
|
42
|
-
raise ValueError(
|
|
44
|
+
raise ValueError(
|
|
45
|
+
f"{self.mdef.info.short_name} element sequence doesn't agree with {self.flown.data.element.unique()}"
|
|
46
|
+
)
|
|
43
47
|
|
|
44
48
|
itrans = self.create_itrans()
|
|
45
|
-
man, tp =
|
|
46
|
-
|
|
47
|
-
|
|
49
|
+
man, tp = (
|
|
50
|
+
mdef.create()
|
|
51
|
+
.add_lines()
|
|
52
|
+
.match_intention(State.from_transform(itrans), self.flown)
|
|
48
53
|
)
|
|
49
54
|
mdef = ManDef(mdef.info, mdef.mps.update_defaults(man), mdef.eds)
|
|
50
|
-
corr = mdef.create(
|
|
55
|
+
corr = mdef.create().add_lines()
|
|
51
56
|
return Complete(
|
|
52
|
-
self.id,
|
|
53
|
-
|
|
57
|
+
self.id,
|
|
58
|
+
mdef,
|
|
59
|
+
self.flown,
|
|
60
|
+
self.direction,
|
|
61
|
+
man,
|
|
62
|
+
tp,
|
|
63
|
+
corr,
|
|
64
|
+
corr.create_template(itrans, self.flown),
|
|
54
65
|
)
|
|
55
66
|
|
|
56
67
|
@classmethod
|
|
57
|
-
def from_dict(Cls, data:dict) -> Basic:
|
|
68
|
+
def from_dict(Cls, data: dict) -> Basic:
|
|
58
69
|
return Basic(
|
|
59
70
|
-1,
|
|
60
71
|
ManDef.from_dict(data["mdef"]),
|
|
61
72
|
State.from_dict(data["flown"]),
|
|
62
|
-
data[
|
|
73
|
+
data["direction"],
|
|
63
74
|
)
|
|
64
75
|
|
|
65
76
|
def create_itrans(self) -> g.Transformation:
|
|
66
|
-
return g.Transformation(
|
|
67
|
-
self.flown[0].pos,
|
|
68
|
-
self.mdef.info.start.initial_rotation(self.direction)
|
|
77
|
+
return g.Transformation(
|
|
78
|
+
self.flown[0].pos, self.mdef.info.start.initial_rotation(self.direction)
|
|
69
79
|
)
|
|
70
80
|
|
|
71
81
|
@staticmethod
|
|
72
82
|
def from_fcj(file: str, mid: int):
|
|
73
|
-
with open(file,
|
|
83
|
+
with open(file, "r") as f:
|
|
74
84
|
data = load(f)
|
|
75
85
|
flight = Flight.from_fc_json(data)
|
|
76
86
|
box = Origin.from_fcjson_parmameters(data["parameters"])
|
|
@@ -78,23 +88,28 @@ class Basic(Analysis):
|
|
|
78
88
|
sdef = SchedDef.load(data["parameters"]["schedule"][1])
|
|
79
89
|
|
|
80
90
|
state = State.from_flight(flight, box).splitter_labels(
|
|
81
|
-
data["mans"],
|
|
82
|
-
[m.info.short_name for m in sdef]
|
|
91
|
+
data["mans"], [m.info.short_name for m in sdef]
|
|
83
92
|
)
|
|
84
|
-
mdef= sdef[mid]
|
|
93
|
+
mdef = sdef[mid]
|
|
85
94
|
return Basic(mid, mdef, state.get_manoeuvre(mdef.uid))
|
|
86
95
|
|
|
87
96
|
def run(self) -> list[Alignment]:
|
|
88
97
|
itrans = self.create_itrans()
|
|
89
98
|
mopt = ManOption([self.mdef]) if isinstance(self.mdef, ManDef) else self.mdef
|
|
90
99
|
|
|
91
|
-
als = []
|
|
100
|
+
als = []
|
|
92
101
|
for mdef in mopt:
|
|
93
|
-
man = mdef.create(
|
|
94
|
-
als.append(
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
102
|
+
man = mdef.create().add_lines()
|
|
103
|
+
als.append(
|
|
104
|
+
Alignment(
|
|
105
|
+
self.id,
|
|
106
|
+
mdef,
|
|
107
|
+
self.flown,
|
|
108
|
+
self.direction,
|
|
109
|
+
man,
|
|
110
|
+
man.create_template(itrans),
|
|
111
|
+
)
|
|
112
|
+
)
|
|
98
113
|
return als
|
|
99
114
|
|
|
100
115
|
def to_mindict(self, sinfo: ScheduleInfo):
|
|
@@ -102,30 +117,32 @@ class Basic(Analysis):
|
|
|
102
117
|
**super().to_mindict(sinfo),
|
|
103
118
|
name=self.name,
|
|
104
119
|
id=self.id,
|
|
105
|
-
data=self.flown._create_json_data().to_dict(
|
|
120
|
+
data=self.flown._create_json_data().to_dict("records"),
|
|
106
121
|
direction=self.direction,
|
|
107
|
-
)
|
|
122
|
+
)
|
|
108
123
|
return data
|
|
109
124
|
|
|
110
125
|
@staticmethod
|
|
111
126
|
def from_mindict(data: dict):
|
|
112
127
|
info = ScheduleInfo.from_str(data["parameters"]["schedule"][1])
|
|
113
|
-
|
|
128
|
+
|
|
114
129
|
st = State.from_flight(
|
|
115
|
-
Flight.from_fc_json(data),
|
|
116
|
-
Origin.from_fcjson_parmameters(data["parameters"])
|
|
130
|
+
Flight.from_fc_json(data),
|
|
131
|
+
Origin.from_fcjson_parmameters(data["parameters"]),
|
|
117
132
|
)
|
|
118
|
-
|
|
119
|
-
mdef = SchedDef.load(info)[data['id']]
|
|
120
|
-
|
|
121
|
-
if 'els' in data:
|
|
122
|
-
df = pd.DataFrame(data['els'])
|
|
123
|
-
df.columns = ['name', 'start', 'stop', 'length']
|
|
124
|
-
st = st.splitter_labels(df.to_dict('records'), target_col='element').label(manoeuvre=data['name'])
|
|
125
133
|
|
|
126
|
-
|
|
127
|
-
|
|
134
|
+
mdef = SchedDef.load(info)[data["id"]]
|
|
135
|
+
|
|
136
|
+
if "els" in data:
|
|
137
|
+
df = pd.DataFrame(data["els"])
|
|
138
|
+
df.columns = ["name", "start", "stop", "length"]
|
|
139
|
+
st = st.splitter_labels(df.to_dict("records"), target_col="element").label(
|
|
140
|
+
manoeuvre=data["name"]
|
|
141
|
+
)
|
|
142
|
+
|
|
143
|
+
return Basic(data["id"], mdef, st, data["direction"])
|
|
144
|
+
|
|
128
145
|
|
|
129
146
|
from .alignment import Alignment # noqa: E402
|
|
130
147
|
from .complete import Complete # noqa: E402
|
|
131
|
-
from .scored import Scored # noqa: E402
|
|
148
|
+
from .scored import Scored # noqa: E402
|