pyBADA 0.1.7__py3-none-any.whl → 0.1.8__py3-none-any.whl
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.
- pyBADA/TCL.py +3087 -9463
- pyBADA/bada4.py +1 -1
- pyBADA/badaAircraft.py +35 -0
- pyBADA/configuration.py +50 -0
- pyBADA/myTypes.py +204 -0
- pyBADA/trajectorySegments.py +9712 -0
- {pybada-0.1.7.dist-info → pybada-0.1.8.dist-info}/METADATA +16 -16
- {pybada-0.1.7.dist-info → pybada-0.1.8.dist-info}/RECORD +11 -8
- {pybada-0.1.7.dist-info → pybada-0.1.8.dist-info}/WHEEL +1 -1
- {pybada-0.1.7.dist-info → pybada-0.1.8.dist-info}/licenses/AUTHORS +0 -0
- {pybada-0.1.7.dist-info → pybada-0.1.8.dist-info}/licenses/LICENCE.txt +0 -0
pyBADA/bada4.py
CHANGED
pyBADA/badaAircraft.py
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"""Generic BADA Family Wrapper."""
|
|
2
|
+
|
|
3
|
+
from typing import Union
|
|
4
|
+
|
|
5
|
+
from pyBADA.bada3 import Bada3Aircraft
|
|
6
|
+
from pyBADA.bada4 import Bada4Aircraft
|
|
7
|
+
from pyBADA.badaH import BadaHAircraft
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class BadaAircraft:
|
|
11
|
+
"""
|
|
12
|
+
A wrapper to handle the instantiation of different BADA family models.
|
|
13
|
+
"""
|
|
14
|
+
|
|
15
|
+
_FAMILY_MAP = {
|
|
16
|
+
"BADA3": Bada3Aircraft,
|
|
17
|
+
"BADA4": Bada4Aircraft,
|
|
18
|
+
"BADAH": BadaHAircraft,
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
def __new__(
|
|
22
|
+
cls, badaFamily, badaVersion, acName, **kwargs
|
|
23
|
+
) -> Union[Bada3Aircraft, Bada4Aircraft, BadaHAircraft]:
|
|
24
|
+
target_class = cls._FAMILY_MAP.get(badaFamily)
|
|
25
|
+
|
|
26
|
+
if not target_class:
|
|
27
|
+
valid_keys = list(cls._FAMILY_MAP.keys())
|
|
28
|
+
raise ValueError(
|
|
29
|
+
f"Unknown BADA family: '{badaFamily}'. Valid options: {valid_keys}"
|
|
30
|
+
)
|
|
31
|
+
|
|
32
|
+
return target_class(badaVersion=badaVersion, acName=acName, **kwargs)
|
|
33
|
+
|
|
34
|
+
def __init__(self, *args, **kwargs):
|
|
35
|
+
pass
|
pyBADA/configuration.py
CHANGED
|
@@ -154,6 +154,56 @@ def getAircraftList(badaFamily, badaVersion):
|
|
|
154
154
|
return aircraftList
|
|
155
155
|
|
|
156
156
|
|
|
157
|
+
def getAircraftListAndCategory(badaFamily, badaVersion):
|
|
158
|
+
"""Retrieve a list of available aircraft for a given BADA family and
|
|
159
|
+
version with matching category from release file.
|
|
160
|
+
|
|
161
|
+
:param badaFamily: The BADA family (e.g., BADA3, BADA4) for which
|
|
162
|
+
aircraft are being retrieved.
|
|
163
|
+
:param badaVersion: The specific version of the BADA family (e.g.,
|
|
164
|
+
3.10, 4.2).
|
|
165
|
+
:type badaFamily: str.
|
|
166
|
+
:type badaVersion: str.
|
|
167
|
+
:returns: List of available aircraft names and categories.
|
|
168
|
+
:rtype: pandas dataframe.
|
|
169
|
+
"""
|
|
170
|
+
|
|
171
|
+
aircraft_names = getAircraftList(badaFamily, badaVersion)
|
|
172
|
+
|
|
173
|
+
if badaFamily == "BADA4":
|
|
174
|
+
path = getBadaVersionPath(badaFamily, badaVersion)
|
|
175
|
+
csv_path = os.path.join(path, "release.csv")
|
|
176
|
+
|
|
177
|
+
df_files = pd.DataFrame(aircraft_names, columns=["AIRCRAFT"])
|
|
178
|
+
|
|
179
|
+
if os.path.exists(csv_path):
|
|
180
|
+
df_csv = pd.read_csv(csv_path, sep=";")
|
|
181
|
+
df_csv = df_csv.rename(
|
|
182
|
+
columns={"filename": "AIRCRAFT", "category": "CATEGORY"}
|
|
183
|
+
)
|
|
184
|
+
df_result = pd.merge(
|
|
185
|
+
df_files,
|
|
186
|
+
df_csv[["AIRCRAFT", "CATEGORY"]],
|
|
187
|
+
on="AIRCRAFT",
|
|
188
|
+
how="left",
|
|
189
|
+
)
|
|
190
|
+
|
|
191
|
+
return df_result
|
|
192
|
+
|
|
193
|
+
else:
|
|
194
|
+
# Fallback: If CSV is missing, return list with None categories
|
|
195
|
+
df_files["CATEGORY"] = None
|
|
196
|
+
return df_files
|
|
197
|
+
|
|
198
|
+
elif badaFamily in ["BADA3", "BADAH", "BADAE"]:
|
|
199
|
+
data = []
|
|
200
|
+
for item in aircraft_names:
|
|
201
|
+
data.append({"AIRCRAFT": item, "CATEGORY": None})
|
|
202
|
+
return pd.DataFrame(data, columns=["AIRCRAFT", "CATEGORY"])
|
|
203
|
+
|
|
204
|
+
return pd.DataFrame(columns=["AIRCRAFT", "CATEGORY"])
|
|
205
|
+
|
|
206
|
+
|
|
157
207
|
def getBadaFamilyPath(badaFamily):
|
|
158
208
|
"""Get the full path to the specified BADA family directory.
|
|
159
209
|
|
pyBADA/myTypes.py
ADDED
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
from dataclasses import dataclass
|
|
2
|
+
from enum import StrEnum
|
|
3
|
+
from typing import Literal
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class CalculationType(StrEnum):
|
|
7
|
+
POINT = "POINT"
|
|
8
|
+
INTEGRATED = "INTEGRATED"
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class FlightPhase(StrEnum):
|
|
12
|
+
CLIMB = "CLIMB"
|
|
13
|
+
DESCENT = "DESCENT"
|
|
14
|
+
CRUISE = "CRUISE"
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
class AccelerationOption(StrEnum):
|
|
18
|
+
ROCD_ESF = "ROCD_ESF"
|
|
19
|
+
ROCD_ACC = "ROCD_ACC"
|
|
20
|
+
SLOPE_ACC = "SLOPE_ACC"
|
|
21
|
+
SLOPE_ESF = "SLOPE_ESF"
|
|
22
|
+
ROCD_RATING = "ROCD_RATING"
|
|
23
|
+
SLOPE_RATING = "SLOPE_RATING"
|
|
24
|
+
ESF_RATING = "ESF_RATING"
|
|
25
|
+
ACC_RATING = "ACC_RATING"
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
class SpeedType(StrEnum):
|
|
29
|
+
TAS = "TAS"
|
|
30
|
+
CAS = "CAS"
|
|
31
|
+
M = "M"
|
|
32
|
+
|
|
33
|
+
|
|
34
|
+
class AccelerationLevelKind(StrEnum):
|
|
35
|
+
AT = "AT"
|
|
36
|
+
BEFORE = "BEFORE"
|
|
37
|
+
AFTER = "AFTER"
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
@dataclass
|
|
41
|
+
class Speed:
|
|
42
|
+
speedType: SpeedType | None = None
|
|
43
|
+
accelerationLevelKind: AccelerationLevelKind | None = None
|
|
44
|
+
initSpeed: float | None = None
|
|
45
|
+
finalSpeed: float | None = None
|
|
46
|
+
stepSpeed: float | None = None
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
@dataclass
|
|
50
|
+
class SpeedBrakes:
|
|
51
|
+
deployed: float | None = None
|
|
52
|
+
value: float | None = None
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
@dataclass
|
|
56
|
+
class CASMACHSpeedSchedule:
|
|
57
|
+
CASbelowFL100: float | None = None
|
|
58
|
+
CASaboveFL100: float | None = None
|
|
59
|
+
Mach: float | None = None
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
@dataclass
|
|
63
|
+
class Meteo:
|
|
64
|
+
wS: float = 0.0 # Wind speed [kt], default to 0
|
|
65
|
+
deltaTemp: float = 0.0 # Temperature deviation [K], default to 0
|
|
66
|
+
|
|
67
|
+
|
|
68
|
+
@dataclass
|
|
69
|
+
class PressureAltitude:
|
|
70
|
+
initPressureAltitude: float | None = None
|
|
71
|
+
finalPressureAltitude: float | None = None
|
|
72
|
+
stepPressureAltitude: float | None = None
|
|
73
|
+
|
|
74
|
+
|
|
75
|
+
@dataclass
|
|
76
|
+
class ControlTarget:
|
|
77
|
+
ROCDtarget: float | None = None
|
|
78
|
+
slopetarget: float | None = None
|
|
79
|
+
acctarget: float | None = None
|
|
80
|
+
ESFtarget: float | None = None
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
class TakeOffProcedureType(StrEnum):
|
|
84
|
+
BADA = "BADA"
|
|
85
|
+
NADP1 = "NADP1"
|
|
86
|
+
NADP2 = "NADP2"
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
@dataclass
|
|
90
|
+
class TakeOffProcedureBADA:
|
|
91
|
+
type: Literal[TakeOffProcedureType.BADA] = TakeOffProcedureType.BADA
|
|
92
|
+
|
|
93
|
+
|
|
94
|
+
@dataclass
|
|
95
|
+
class TakeOffProcedureNADP1:
|
|
96
|
+
NADP1Threshold: float | None = None
|
|
97
|
+
type: Literal[TakeOffProcedureType.NADP1] = TakeOffProcedureType.NADP1
|
|
98
|
+
|
|
99
|
+
|
|
100
|
+
@dataclass
|
|
101
|
+
class TakeOffProcedureNADP2:
|
|
102
|
+
NADP2Threshold1: float | None = None
|
|
103
|
+
NADP2Threshold2: float | None = None
|
|
104
|
+
type: Literal[TakeOffProcedureType.NADP2] = TakeOffProcedureType.NADP2
|
|
105
|
+
|
|
106
|
+
|
|
107
|
+
TakeOffProcedure = (
|
|
108
|
+
TakeOffProcedureBADA | TakeOffProcedureNADP1 | TakeOffProcedureNADP2
|
|
109
|
+
)
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
class DepartureProfileType(StrEnum):
|
|
113
|
+
constCASbelow100 = "constCASbelow100"
|
|
114
|
+
calculatedCAS = "calculatedCAS"
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
@dataclass
|
|
118
|
+
class DepartureProfile:
|
|
119
|
+
departureProfileType: DepartureProfileType | None = None
|
|
120
|
+
|
|
121
|
+
|
|
122
|
+
class ArrivalProfileType(StrEnum):
|
|
123
|
+
constCASbelow100 = "constCASbelow100"
|
|
124
|
+
calculatedCAS = "calculatedCAS"
|
|
125
|
+
expedite = "expedite"
|
|
126
|
+
|
|
127
|
+
|
|
128
|
+
@dataclass
|
|
129
|
+
class ArrivalProfile:
|
|
130
|
+
arrivalProfileType: ArrivalProfileType | None = None
|
|
131
|
+
|
|
132
|
+
|
|
133
|
+
class ClimbType(StrEnum):
|
|
134
|
+
CASMACH = "CASMACH"
|
|
135
|
+
RATE = "RATE"
|
|
136
|
+
ACCELERATION = "ACCELERATION"
|
|
137
|
+
|
|
138
|
+
|
|
139
|
+
class DescentType(StrEnum):
|
|
140
|
+
CASMACH = "CASMACH"
|
|
141
|
+
RATE = "RATE"
|
|
142
|
+
SLOPE = "SLOPE"
|
|
143
|
+
ACCELERATION = "ACCELERATION"
|
|
144
|
+
EMERGENCY = "EMERGENCY"
|
|
145
|
+
|
|
146
|
+
|
|
147
|
+
class CruiseType(StrEnum):
|
|
148
|
+
CONSTANTSPEED = "CONSTANTSPEED"
|
|
149
|
+
ACCELERATION = "ACCELERATION"
|
|
150
|
+
|
|
151
|
+
|
|
152
|
+
class CruiseSpeedType(StrEnum):
|
|
153
|
+
TAS = "TAS"
|
|
154
|
+
CAS = "CAS"
|
|
155
|
+
M = "M"
|
|
156
|
+
MEC = "MEC"
|
|
157
|
+
LRC = "LRC"
|
|
158
|
+
MRC = "MRC"
|
|
159
|
+
ECON = "ECON"
|
|
160
|
+
|
|
161
|
+
|
|
162
|
+
class HDescentType(StrEnum):
|
|
163
|
+
ARPM = "ARPM"
|
|
164
|
+
RATE = "RATE"
|
|
165
|
+
SLOPE = "SLOPE"
|
|
166
|
+
ACCELERATION = "ACCELERATION"
|
|
167
|
+
EMERGENCY = "EMERGENCY"
|
|
168
|
+
|
|
169
|
+
|
|
170
|
+
class HClimbType(StrEnum):
|
|
171
|
+
RATE = "RATE"
|
|
172
|
+
ARPM = "ARPM"
|
|
173
|
+
ACCELERATION = "ACCELERATION"
|
|
174
|
+
|
|
175
|
+
|
|
176
|
+
class HRating(StrEnum):
|
|
177
|
+
MTKF = "MTKF"
|
|
178
|
+
MCNT = "MCNT"
|
|
179
|
+
ARPM = "ARPM"
|
|
180
|
+
|
|
181
|
+
|
|
182
|
+
class IntegrationType(StrEnum):
|
|
183
|
+
ALTITUDE = "ALTITUDE"
|
|
184
|
+
DISTANCE = "DISTANCE"
|
|
185
|
+
TIME = "TIME"
|
|
186
|
+
|
|
187
|
+
|
|
188
|
+
@dataclass
|
|
189
|
+
class HClimbRatingConfiguration:
|
|
190
|
+
rating: HRating | None = None
|
|
191
|
+
|
|
192
|
+
|
|
193
|
+
@dataclass
|
|
194
|
+
class ClimbCASMACHProfileConfiguration:
|
|
195
|
+
casMachSpeedSchedule: CASMACHSpeedSchedule | None = None
|
|
196
|
+
takeOffProcedure: TakeOffProcedure | None = None
|
|
197
|
+
departureProfile: DepartureProfile | None = None
|
|
198
|
+
reducedPower: bool = False
|
|
199
|
+
|
|
200
|
+
|
|
201
|
+
@dataclass
|
|
202
|
+
class DescentCASMACHProfileConfiguration:
|
|
203
|
+
casMachSpeedSchedule: CASMACHSpeedSchedule | None = None
|
|
204
|
+
arrivalProfile: ArrivalProfile | None = None
|