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/bada4.py CHANGED
@@ -2489,7 +2489,7 @@ class FlightEnvelope(BADA4):
2489
2489
  x1=np.array([0]),
2490
2490
  x2=np.array([conv.ft2m(hMax)]),
2491
2491
  disp=False,
2492
- )
2492
+ ).item()
2493
2493
  )
2494
2494
 
2495
2495
  return hMax
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