pyBADA 0.1.1__py3-none-any.whl → 0.1.2__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/bada3.py CHANGED
@@ -18,7 +18,7 @@ from pyBADA import constants as const
18
18
  from pyBADA import conversions as conv
19
19
  from pyBADA import atmosphere as atm
20
20
  from pyBADA import configuration as configuration
21
- from pyBADA.aircraft import Airplane, BadaFamily
21
+ from pyBADA.aircraft import Airplane, BadaFamily, Bada
22
22
 
23
23
 
24
24
  def proper_round(num, dec=0):
@@ -42,41 +42,13 @@ class Parser(object):
42
42
  pass
43
43
 
44
44
  @staticmethod
45
- def list_subfolders(folderPath):
46
- """
47
- Lists all subfolders within a specified directory.
48
-
49
- :param folderPath: Path to the directory where subfolders are to be listed.
50
- :type folderPath: str
51
- :returns: A list of subfolder names within the specified directory.
52
- :rtype: list of str
53
-
54
- This function retrieves all entries in the given directory and filters out
55
- the ones that are not directories. Only the names of the subfolders are returned.
56
- """
57
-
58
- # List all entries in the directory
59
- entries = os.listdir(folderPath)
60
-
61
- # Filter out entries that are directories
62
- subfolders = [
63
- entry
64
- for entry in entries
65
- if os.path.isdir(os.path.join(folderPath, entry))
66
- ]
67
-
68
- return subfolders
69
-
70
- @staticmethod
71
- def parseXML(filePath, badaVersion, acName):
45
+ def parseXML(filePath, acName):
72
46
  """
73
47
  Parses a BADA3 XML formatted file for aircraft performance data.
74
48
 
75
49
  :param filePath: Path to the XML file containing BADA data.
76
- :param badaVersion: Version of BADA to be parsed.
77
50
  :param acName: Name of the aircraft for which data is being parsed from the XML file.
78
51
  :type filePath: str
79
- :type badaVersion: str
80
52
  :type acName: str
81
53
  :raises IOError: If the file cannot be found or read.
82
54
  :raises ValueError: If the BADA version is unsupported or if parsing fails.
@@ -85,10 +57,7 @@ class Parser(object):
85
57
  :rtype: pd.DataFrame
86
58
  """
87
59
 
88
- filename = (
89
- os.path.join(filePath, "BADA3", badaVersion, acName, acName)
90
- + ".xml"
91
- )
60
+ filename = os.path.join(filePath, acName, acName) + ".xml"
92
61
 
93
62
  try:
94
63
  tree = ET.parse(filename)
@@ -391,15 +360,13 @@ class Parser(object):
391
360
  return f, line
392
361
 
393
362
  @staticmethod
394
- def parseOPF(filePath, badaVersion, acName):
363
+ def parseOPF(filePath, acName):
395
364
  """
396
365
  Parses a BADA3 OPF (Operational Performance File) ASCII formatted file for aircraft performance data.
397
366
 
398
367
  :param filePath: Path to the BADA3 OPF ASCII formatted file.
399
- :param badaVersion: BADA version being used.
400
368
  :param acName: ICAO aircraft designation (e.g., 'A320').
401
369
  :type filePath: str
402
- :type badaVersion: str
403
370
  :type acName: str
404
371
  :raises IOError: If the file cannot be opened or read.
405
372
  :returns: A pandas DataFrame containing the parsed aircraft performance data.
@@ -409,8 +376,6 @@ class Parser(object):
409
376
  filename = (
410
377
  os.path.join(
411
378
  filePath,
412
- "BADA3",
413
- badaVersion,
414
379
  acName,
415
380
  )
416
381
  + ".OPF"
@@ -624,24 +589,20 @@ class Parser(object):
624
589
  return df_single
625
590
 
626
591
  @staticmethod
627
- def parseAPF(filePath, badaVersion, acName):
592
+ def parseAPF(filePath, acName):
628
593
  """
629
594
  Parses a BADA3 APF ASCII formatted file for aircraft performance data.
630
595
 
631
596
  :param filePath: Path to the BADA3 APF ASCII formatted file.
632
- :param badaVersion: BADA version being used.
633
597
  :param acName: ICAO aircraft designation (e.g., 'A320').
634
598
  :type filePath: str
635
- :type badaVersion: str
636
599
  :type acName: str
637
600
  :raises IOError: If the file cannot be opened or read.
638
601
  :returns: A pandas DataFrame containing the parsed aircraft performance data.
639
602
  :rtype: pd.DataFrame
640
603
  """
641
604
 
642
- filename = (
643
- os.path.join(filePath, "BADA3", badaVersion, acName) + ".APF"
644
- )
605
+ filename = os.path.join(filePath, acName) + ".APF"
645
606
 
646
607
  dataLines = list()
647
608
  with open(filename, "r", encoding="latin-1") as f:
@@ -727,19 +688,17 @@ class Parser(object):
727
688
  return combined_df
728
689
 
729
690
  @staticmethod
730
- def readSynonym(filePath, badaVersion):
691
+ def readSynonym(filePath):
731
692
  """
732
693
  Reads a BADA3 SYNONYM.NEW ASCII file and returns a dictionary of model-synonym pairs.
733
694
 
734
695
  :param filePath: Path to the directory containing BADA3 files.
735
- :param badaVersion: BADA version being used.
736
696
  :type filePath: str
737
- :type badaVersion: str
738
697
  :returns: A dictionary where the keys are aircraft models and the values are the corresponding file names.
739
698
  :rtype: dict
740
699
  """
741
700
 
742
- filename = os.path.join(filePath, "BADA3", badaVersion, "SYNONYM.NEW")
701
+ filename = os.path.join(filePath, "SYNONYM.NEW")
743
702
 
744
703
  # synonym - file name pair dictionary
745
704
  synonym_fileName = {}
@@ -764,14 +723,12 @@ class Parser(object):
764
723
  return synonym_fileName
765
724
 
766
725
  @staticmethod
767
- def readSynonymXML(filePath, badaVersion):
726
+ def readSynonymXML(filePath):
768
727
  """
769
728
  Reads a BADA3 SYNONYM.xml file and returns a dictionary of model-synonym pairs.
770
729
 
771
730
  :param filePath: Path to the directory containing BADA3 files.
772
- :param badaVersion: BADA version being used.
773
731
  :type filePath: str
774
- :type badaVersion: str
775
732
  :returns: A dictionary where the keys are aircraft models (codes) and the values are the corresponding file names.
776
733
  :rtype: dict
777
734
  :raises IOError: If the XML file is not found or cannot be read.
@@ -780,7 +737,7 @@ class Parser(object):
780
737
  If the XML file is not found or is improperly formatted, an IOError is raised.
781
738
  """
782
739
 
783
- filename = os.path.join(filePath, "BADA3", badaVersion, "SYNONYM.xml")
740
+ filename = os.path.join(filePath, "SYNONYM.xml")
784
741
 
785
742
  # synonym - file name pair dictionary
786
743
  synonym_fileName = {}
@@ -803,15 +760,13 @@ class Parser(object):
803
760
  return synonym_fileName
804
761
 
805
762
  @staticmethod
806
- def parseSynonym(filePath, badaVersion, acName):
763
+ def parseSynonym(filePath, acName):
807
764
  """
808
765
  Parses either the ASCII or XML synonym file and returns the file name corresponding to the aircraft.
809
766
 
810
767
  :param filePath: Path to the directory containing BADA3 files.
811
- :param badaVersion: BADA version being used.
812
768
  :param acName: ICAO aircraft designation for which the file name is needed.
813
769
  :type filePath: str
814
- :type badaVersion: str
815
770
  :type acName: str
816
771
  :returns: The file name corresponding to the aircraft, or None if not found.
817
772
  :rtype: str or None
@@ -821,11 +776,11 @@ class Parser(object):
821
776
  It returns the associated file name or None if the aircraft synonym is not found.
822
777
  """
823
778
 
824
- synonym_fileName = Parser.readSynonym(filePath, badaVersion)
779
+ synonym_fileName = Parser.readSynonym(filePath)
825
780
 
826
781
  # if ASCI synonym does not exist, try XML synonym file
827
782
  if not synonym_fileName:
828
- synonym_fileName = Parser.readSynonymXML(filePath, badaVersion)
783
+ synonym_fileName = Parser.readSynonymXML(filePath)
829
784
 
830
785
  if synonym_fileName and acName in synonym_fileName:
831
786
  fileName = synonym_fileName[acName]
@@ -834,19 +789,18 @@ class Parser(object):
834
789
  return None
835
790
 
836
791
  @staticmethod
837
- def readGPF(filePath, badaVersion):
792
+ def readGPF(filePath):
838
793
  """
839
794
  Parses a BADA3 GPF ASCII formatted file.
840
795
 
841
796
  :param filePath: Path to the directory containing BADA3 files.
842
- :param badaVersion: BADA version being used.
843
797
  :type filePath: str
844
798
  :raises IOError: If the GPF file cannot be opened or read.
845
799
  :returns: A list of dictionaries, each containing GPF parameters like engine type, flight phase, and parameter values.
846
800
  :rtype: list of dict
847
801
  """
848
802
 
849
- filename = os.path.join(filePath, "BADA3", badaVersion, "BADA.GPF")
803
+ filename = os.path.join(filePath, "BADA.GPF")
850
804
 
851
805
  GPFparamList = list()
852
806
 
@@ -873,12 +827,11 @@ class Parser(object):
873
827
  return GPFparamList
874
828
 
875
829
  @staticmethod
876
- def readGPFXML(filePath, badaVersion):
830
+ def readGPFXML(filePath):
877
831
  """
878
832
  Parses a BADA3 GPF XML formatted file.
879
833
 
880
834
  :param filePath: Path to the directory containing BADA3 files.
881
- :param badaVersion: BADA version being used.
882
835
  :type filePath: str
883
836
  :raises IOError: If the XML file is not found or cannot be read.
884
837
  :returns: A list of dictionaries, each containing GPF parameters such as engine type, flight phase, and performance values.
@@ -889,7 +842,7 @@ class Parser(object):
889
842
  It parses the XML structure and returns a list of dictionaries representing these parameters.
890
843
  """
891
844
 
892
- filename = os.path.join(filePath, "BADA3", badaVersion, "GPF.xml")
845
+ filename = os.path.join(filePath, "GPF.xml")
893
846
 
894
847
  GPFparamList = list()
895
848
 
@@ -1430,23 +1383,21 @@ class Parser(object):
1430
1383
  return GPFparamList
1431
1384
 
1432
1385
  @staticmethod
1433
- def parseGPF(filePath, badaVersion):
1386
+ def parseGPF(filePath):
1434
1387
  """
1435
1388
  Parses a BADA3 (GPF) from either ASCII or XML format.
1436
1389
 
1437
1390
  :param filePath: Path to the directory containing BADA3 files.
1438
- :param badaVersion: BADA version being used.
1439
1391
  :type filePath: str
1440
- :type badaVersion: str
1441
1392
  :returns: A pandas DataFrame containing GPF data.
1442
1393
  :rtype: pd.DataFrame
1443
1394
  """
1444
1395
 
1445
- GPFdata = Parser.readGPF(filePath, badaVersion)
1396
+ GPFdata = Parser.readGPF(filePath)
1446
1397
 
1447
1398
  # if ASCI GPF does not exist, try XML GPF file
1448
1399
  if not GPFdata:
1449
- GPFdata = Parser.readGPFXML(filePath, badaVersion)
1400
+ GPFdata = Parser.readGPFXML(filePath)
1450
1401
 
1451
1402
  # Single row dataframe
1452
1403
  data = {"GPFdata": [GPFdata]}
@@ -1532,31 +1483,32 @@ class Parser(object):
1532
1483
  """
1533
1484
 
1534
1485
  if filePath == None:
1535
- filePath = configuration.getAircraftPath()
1486
+ filePath = configuration.getBadaVersionPath(
1487
+ badaFamily="BADA3", badaVersion=badaVersion
1488
+ )
1536
1489
  else:
1537
1490
  filePath = filePath
1538
1491
 
1539
1492
  # parsing GPF file
1540
- GPFparsedDataframe = Parser.parseGPF(filePath, badaVersion)
1493
+ GPFparsedDataframe = Parser.parseGPF(filePath)
1541
1494
 
1542
1495
  # try to get subfolders, if they exist
1543
1496
  # get names of all the folders in the main BADA model folder to search for XML files
1544
- folderPath = os.path.join(filePath, "BADA3", badaVersion)
1545
- subfolders = Parser.list_subfolders(folderPath)
1497
+ subfolders = configuration.list_subfolders(filePath)
1546
1498
 
1547
1499
  if not subfolders:
1548
1500
  # use APF and OPF files
1549
1501
  merged_df = pd.DataFrame()
1550
1502
 
1551
1503
  # get synonym-filename pairs
1552
- synonym_fileName = Parser.readSynonym(filePath, badaVersion)
1504
+ synonym_fileName = Parser.readSynonym(filePath)
1553
1505
 
1554
1506
  for synonym in synonym_fileName:
1555
1507
  file = synonym_fileName[synonym]
1556
1508
 
1557
1509
  # parse the original data of a model
1558
- OPFDataFrame = Parser.parseOPF(filePath, badaVersion, file)
1559
- APFDataFrame = Parser.parseAPF(filePath, badaVersion, file)
1510
+ OPFDataFrame = Parser.parseOPF(filePath, file)
1511
+ APFDataFrame = Parser.parseAPF(filePath, file)
1560
1512
 
1561
1513
  df = Parser.combineOPF_APF(OPFDataFrame, APFDataFrame)
1562
1514
 
@@ -1578,14 +1530,14 @@ class Parser(object):
1578
1530
  merged_df = pd.DataFrame()
1579
1531
 
1580
1532
  # get synonym-filename pairs
1581
- synonym_fileName = Parser.readSynonymXML(filePath, badaVersion)
1533
+ synonym_fileName = Parser.readSynonymXML(filePath)
1582
1534
 
1583
1535
  for synonym in synonym_fileName:
1584
1536
  file = synonym_fileName[synonym]
1585
1537
 
1586
1538
  if file in subfolders:
1587
1539
  # parse the original XML of a model
1588
- df = Parser.parseXML(filePath, badaVersion, file)
1540
+ df = Parser.parseXML(filePath, file)
1589
1541
 
1590
1542
  # rename acName in the dateaframe to match the synonym model name
1591
1543
  df.at[0, "acName"] = synonym
@@ -1602,72 +1554,8 @@ class Parser(object):
1602
1554
 
1603
1555
  return merged_df
1604
1556
 
1605
- @staticmethod
1606
- def getBADAParameters(df, acName, parameters):
1607
- """
1608
- Retrieves specified parameters for a given aircraft name from a DataFrame.
1609
-
1610
- :param df: DataFrame containing BADA aircraft data.
1611
- :param acName: Name of the aircraft or list of aircraft names to search for.
1612
- :param parameters: List of column names (or a single column name) to retrieve.
1613
- :type df: pd.DataFrame
1614
- :type acName: list or str
1615
- :type parameters: list or str
1616
- :returns: A DataFrame containing the specified parameters for the given aircraft.
1617
- :rtype: pd.DataFrame
1618
- :raises ValueError: If any of the specified columns or aircraft names are not found.
1619
- """
1620
-
1621
- # Ensure parameters is a list
1622
- if isinstance(parameters, str):
1623
- parameters = [parameters]
1624
-
1625
- # Ensure acName is a list
1626
- if isinstance(acName, str):
1627
- acName = [acName]
1628
-
1629
- # Ensure all requested parameters exist in the DataFrame
1630
- missing_cols = [col for col in parameters if col not in df.columns]
1631
- if missing_cols:
1632
- raise ValueError(
1633
- f"The following parameters are not in the DataFrame columns: {missing_cols}"
1634
- )
1635
-
1636
- # Filter rows where 'acName' matches any of the specified aircraft names
1637
- filtered_df = df[df["acName"].isin(acName)]
1638
-
1639
- # Check if any rows were found
1640
- if filtered_df.empty:
1641
- raise ValueError(f"No entries found for aircraft(s): {acName}.")
1642
- else:
1643
- # Select the required columns
1644
- result_df = filtered_df[["acName"] + parameters].reset_index(
1645
- drop=True
1646
- )
1647
- return result_df
1648
-
1649
- @staticmethod
1650
- def safe_get(df, column_name, default_value=None):
1651
- """
1652
- Safely retrieves a column's value from a DataFrame, returning a default value if the column does not exist.
1653
-
1654
- :param df: DataFrame to retrieve the value from.
1655
- :param column_name: Name of the column to retrieve.
1656
- :param default_value: Value to return if the column does not exist. Default is None.
1657
- :type df: pd.DataFrame
1658
- :type column_name: str
1659
- :type default_value: any
1660
- :returns: The value from the specified column or the default value if the column is missing.
1661
- :rtype: any
1662
- """
1663
-
1664
- if column_name in df.columns:
1665
- return df[column_name].iloc[0]
1666
- else:
1667
- return default_value
1668
-
1669
1557
 
1670
- class BADA3(Airplane):
1558
+ class BADA3(Airplane, Bada):
1671
1559
  """This class implements the part of BADA3 performance model that will be used in other classes following the BADA3 manual.
1672
1560
 
1673
1561
  :param AC: Aircraft object {BADA3}.
@@ -4827,7 +4715,9 @@ class Bada3Aircraft(BADA3):
4827
4715
  self.BADAVersion = badaVersion
4828
4716
 
4829
4717
  if filePath == None:
4830
- self.filePath = configuration.getAircraftPath()
4718
+ self.filePath = configuration.getBadaVersionPath(
4719
+ badaFamily="BADA3", badaVersion=badaVersion
4720
+ )
4831
4721
  else:
4832
4722
  self.filePath = filePath
4833
4723
 
@@ -4835,69 +4725,83 @@ class Bada3Aircraft(BADA3):
4835
4725
  if allData is not None and acName in allData["acName"].values:
4836
4726
  filtered_df = allData[allData["acName"] == acName]
4837
4727
 
4838
- self.acName = Parser.safe_get(filtered_df, "acName", None)
4839
- self.xmlFiles = Parser.safe_get(filtered_df, "xmlFiles", None)
4728
+ self.acName = configuration.safe_get(filtered_df, "acName", None)
4729
+ self.xmlFiles = configuration.safe_get(
4730
+ filtered_df, "xmlFiles", None
4731
+ )
4840
4732
 
4841
- self.modificationDateOPF = Parser.safe_get(
4733
+ self.modificationDateOPF = configuration.safe_get(
4842
4734
  filtered_df, "modificationDateOPF", None
4843
4735
  )
4844
- self.modificationDateAPF = Parser.safe_get(
4736
+ self.modificationDateAPF = configuration.safe_get(
4845
4737
  filtered_df, "modificationDateAPF", None
4846
4738
  )
4847
4739
 
4848
- self.ICAO = Parser.safe_get(filtered_df, "ICAO", None)
4849
- self.numberOfEngines = Parser.safe_get(
4740
+ self.ICAO = configuration.safe_get(filtered_df, "ICAO", None)
4741
+ self.numberOfEngines = configuration.safe_get(
4850
4742
  filtered_df, "numberOfEngines", None
4851
4743
  )
4852
- self.engineType = Parser.safe_get(filtered_df, "engineType", None)
4853
- self.engines = Parser.safe_get(filtered_df, "engines", None)
4854
- self.WTC = Parser.safe_get(filtered_df, "WTC", None)
4855
- self.mass = Parser.safe_get(filtered_df, "mass", None)
4856
-
4857
- self.MTOW = Parser.safe_get(filtered_df, "MTOW", None)
4858
- self.OEW = Parser.safe_get(filtered_df, "OEW", None)
4859
- self.MPL = Parser.safe_get(filtered_df, "MPL", None)
4860
- self.MREF = Parser.safe_get(filtered_df, "MREF", None)
4861
- self.VMO = Parser.safe_get(filtered_df, "VMO", None)
4862
- self.MMO = Parser.safe_get(filtered_df, "MMO", None)
4863
- self.hmo = Parser.safe_get(filtered_df, "hmo", None)
4864
- self.Hmax = Parser.safe_get(filtered_df, "Hmax", None)
4865
- self.tempGrad = Parser.safe_get(filtered_df, "tempGrad", None)
4866
-
4867
- self.S = Parser.safe_get(filtered_df, "S", None)
4868
- self.Clbo = Parser.safe_get(filtered_df, "Clbo", None)
4869
- self.k = Parser.safe_get(filtered_df, "k", None)
4870
- self.Vstall = Parser.safe_get(filtered_df, "Vstall", None)
4871
- self.CD0 = Parser.safe_get(filtered_df, "CD0", None)
4872
- self.CD2 = Parser.safe_get(filtered_df, "CD2", None)
4873
- self.HLids = Parser.safe_get(filtered_df, "HLids", None)
4874
- self.Ct = Parser.safe_get(filtered_df, "Ct", None)
4875
- self.CTdeslow = Parser.safe_get(filtered_df, "CTdeslow", None)
4876
- self.CTdeshigh = Parser.safe_get(filtered_df, "CTdeshigh", None)
4877
- self.CTdesapp = Parser.safe_get(filtered_df, "CTdesapp", None)
4878
- self.CTdesld = Parser.safe_get(filtered_df, "CTdesld", None)
4879
- self.HpDes = Parser.safe_get(filtered_df, "HpDes", None)
4880
- self.Cf = Parser.safe_get(filtered_df, "Cf", None)
4881
- self.CfDes = Parser.safe_get(filtered_df, "CfDes", None)
4882
- self.CfCrz = Parser.safe_get(filtered_df, "CfCrz", None)
4883
- self.TOL = Parser.safe_get(filtered_df, "TOL", None)
4884
- self.LDL = Parser.safe_get(filtered_df, "LDL", None)
4885
- self.span = Parser.safe_get(filtered_df, "span", None)
4886
- self.length = Parser.safe_get(filtered_df, "length", None)
4887
-
4888
- self.V1 = Parser.safe_get(filtered_df, "V1", None)
4889
- self.V2 = Parser.safe_get(filtered_df, "V2", None)
4890
- self.M = Parser.safe_get(filtered_df, "M", None)
4891
-
4892
- self.GPFdata = Parser.safe_get(filtered_df, "GPFdata", None)
4893
-
4894
- self.drone = Parser.safe_get(filtered_df, "drone", None)
4895
-
4896
- self.DeltaCD = Parser.safe_get(filtered_df, "DeltaCD", None)
4897
- self.speedSchedule = Parser.safe_get(
4744
+ self.engineType = configuration.safe_get(
4745
+ filtered_df, "engineType", None
4746
+ )
4747
+ self.engines = configuration.safe_get(filtered_df, "engines", None)
4748
+ self.WTC = configuration.safe_get(filtered_df, "WTC", None)
4749
+ self.mass = configuration.safe_get(filtered_df, "mass", None)
4750
+
4751
+ self.MTOW = configuration.safe_get(filtered_df, "MTOW", None)
4752
+ self.OEW = configuration.safe_get(filtered_df, "OEW", None)
4753
+ self.MPL = configuration.safe_get(filtered_df, "MPL", None)
4754
+ self.MREF = configuration.safe_get(filtered_df, "MREF", None)
4755
+ self.VMO = configuration.safe_get(filtered_df, "VMO", None)
4756
+ self.MMO = configuration.safe_get(filtered_df, "MMO", None)
4757
+ self.hmo = configuration.safe_get(filtered_df, "hmo", None)
4758
+ self.Hmax = configuration.safe_get(filtered_df, "Hmax", None)
4759
+ self.tempGrad = configuration.safe_get(
4760
+ filtered_df, "tempGrad", None
4761
+ )
4762
+
4763
+ self.S = configuration.safe_get(filtered_df, "S", None)
4764
+ self.Clbo = configuration.safe_get(filtered_df, "Clbo", None)
4765
+ self.k = configuration.safe_get(filtered_df, "k", None)
4766
+ self.Vstall = configuration.safe_get(filtered_df, "Vstall", None)
4767
+ self.CD0 = configuration.safe_get(filtered_df, "CD0", None)
4768
+ self.CD2 = configuration.safe_get(filtered_df, "CD2", None)
4769
+ self.HLids = configuration.safe_get(filtered_df, "HLids", None)
4770
+ self.Ct = configuration.safe_get(filtered_df, "Ct", None)
4771
+ self.CTdeslow = configuration.safe_get(
4772
+ filtered_df, "CTdeslow", None
4773
+ )
4774
+ self.CTdeshigh = configuration.safe_get(
4775
+ filtered_df, "CTdeshigh", None
4776
+ )
4777
+ self.CTdesapp = configuration.safe_get(
4778
+ filtered_df, "CTdesapp", None
4779
+ )
4780
+ self.CTdesld = configuration.safe_get(filtered_df, "CTdesld", None)
4781
+ self.HpDes = configuration.safe_get(filtered_df, "HpDes", None)
4782
+ self.Cf = configuration.safe_get(filtered_df, "Cf", None)
4783
+ self.CfDes = configuration.safe_get(filtered_df, "CfDes", None)
4784
+ self.CfCrz = configuration.safe_get(filtered_df, "CfCrz", None)
4785
+ self.TOL = configuration.safe_get(filtered_df, "TOL", None)
4786
+ self.LDL = configuration.safe_get(filtered_df, "LDL", None)
4787
+ self.span = configuration.safe_get(filtered_df, "span", None)
4788
+ self.length = configuration.safe_get(filtered_df, "length", None)
4789
+
4790
+ self.V1 = configuration.safe_get(filtered_df, "V1", None)
4791
+ self.V2 = configuration.safe_get(filtered_df, "V2", None)
4792
+ self.M = configuration.safe_get(filtered_df, "M", None)
4793
+
4794
+ self.GPFdata = configuration.safe_get(filtered_df, "GPFdata", None)
4795
+
4796
+ self.drone = configuration.safe_get(filtered_df, "drone", None)
4797
+
4798
+ self.DeltaCD = configuration.safe_get(filtered_df, "DeltaCD", None)
4799
+ self.speedSchedule = configuration.safe_get(
4898
4800
  filtered_df, "speedSchedule", None
4899
4801
  )
4900
- self.aeroConfig = Parser.safe_get(filtered_df, "aeroConfig", None)
4802
+ self.aeroConfig = configuration.safe_get(
4803
+ filtered_df, "aeroConfig", None
4804
+ )
4901
4805
 
4902
4806
  self.flightEnvelope = FlightEnvelope(self)
4903
4807
  self.ARPM = ARPM(self)
@@ -4906,20 +4810,17 @@ class Bada3Aircraft(BADA3):
4906
4810
 
4907
4811
  else:
4908
4812
  # read BADA3 GPF file
4909
- GPFDataFrame = Parser.parseGPF(self.filePath, badaVersion)
4813
+ GPFDataFrame = Parser.parseGPF(self.filePath)
4910
4814
 
4911
4815
  # check if SYNONYM file exist
4912
- synonymFile = os.path.join(
4913
- self.filePath, "BADA3", badaVersion, "SYNONYM.NEW"
4914
- )
4915
- synonymFileXML = os.path.join(
4916
- self.filePath, "BADA3", badaVersion, "SYNONYM.xml"
4917
- )
4816
+ synonymFile = os.path.join(self.filePath, "SYNONYM.NEW")
4817
+ synonymFileXML = os.path.join(self.filePath, "SYNONYM.xml")
4818
+
4918
4819
  if os.path.isfile(synonymFile) or os.path.isfile(synonymFileXML):
4919
4820
  self.synonymFileAvailable = True
4920
4821
 
4921
4822
  self.SearchedACName = Parser.parseSynonym(
4922
- self.filePath, badaVersion, acName
4823
+ self.filePath, acName
4923
4824
  )
4924
4825
 
4925
4826
  if self.SearchedACName == None:
@@ -4940,8 +4841,6 @@ class Bada3Aircraft(BADA3):
4940
4841
  OPFfile = (
4941
4842
  os.path.join(
4942
4843
  self.filePath,
4943
- "BADA3",
4944
- badaVersion,
4945
4844
  self.SearchedACName,
4946
4845
  )
4947
4846
  + ".OPF"
@@ -4949,8 +4848,6 @@ class Bada3Aircraft(BADA3):
4949
4848
  APFfile = (
4950
4849
  os.path.join(
4951
4850
  self.filePath,
4952
- "BADA3",
4953
- badaVersion,
4954
4851
  self.SearchedACName,
4955
4852
  )
4956
4853
  + ".APF"
@@ -4964,10 +4861,10 @@ class Bada3Aircraft(BADA3):
4964
4861
  self.ACModelAvailable = True
4965
4862
 
4966
4863
  OPFDataFrame = Parser.parseOPF(
4967
- self.filePath, badaVersion, self.SearchedACName
4864
+ self.filePath, self.SearchedACName
4968
4865
  )
4969
4866
  APFDataFrame = Parser.parseAPF(
4970
- self.filePath, badaVersion, self.SearchedACName
4867
+ self.filePath, self.SearchedACName
4971
4868
  )
4972
4869
 
4973
4870
  OPF_APF_combined_df = Parser.combineOPF_APF(
@@ -4977,89 +4874,119 @@ class Bada3Aircraft(BADA3):
4977
4874
  OPF_APF_combined_df, GPFDataFrame
4978
4875
  )
4979
4876
 
4980
- self.acName = Parser.safe_get(combined_df, "acName", None)
4981
- self.xmlFiles = Parser.safe_get(
4877
+ self.acName = configuration.safe_get(
4878
+ combined_df, "acName", None
4879
+ )
4880
+ self.xmlFiles = configuration.safe_get(
4982
4881
  combined_df, "xmlFiles", None
4983
4882
  )
4984
4883
 
4985
- self.modificationDateOPF = Parser.safe_get(
4884
+ self.modificationDateOPF = configuration.safe_get(
4986
4885
  combined_df, "modificationDateOPF", None
4987
4886
  )
4988
- self.modificationDateAPF = Parser.safe_get(
4887
+ self.modificationDateAPF = configuration.safe_get(
4989
4888
  combined_df, "modificationDateAPF", None
4990
4889
  )
4991
4890
 
4992
- self.ICAO = Parser.safe_get(combined_df, "ICAO", None)
4993
- self.numberOfEngines = Parser.safe_get(
4891
+ self.ICAO = configuration.safe_get(
4892
+ combined_df, "ICAO", None
4893
+ )
4894
+ self.numberOfEngines = configuration.safe_get(
4994
4895
  combined_df, "numberOfEngines", None
4995
4896
  )
4996
- self.engineType = Parser.safe_get(
4897
+ self.engineType = configuration.safe_get(
4997
4898
  combined_df, "engineType", None
4998
4899
  )
4999
- self.engines = Parser.safe_get(
4900
+ self.engines = configuration.safe_get(
5000
4901
  combined_df, "engines", None
5001
4902
  )
5002
- self.WTC = Parser.safe_get(combined_df, "WTC", None)
5003
- self.mass = Parser.safe_get(combined_df, "mass", None)
5004
-
5005
- self.MTOW = Parser.safe_get(combined_df, "MTOW", None)
5006
- self.OEW = Parser.safe_get(combined_df, "OEW", None)
5007
- self.MPL = Parser.safe_get(combined_df, "MPL", None)
5008
- self.MREF = Parser.safe_get(combined_df, "MREF", None)
5009
- self.VMO = Parser.safe_get(combined_df, "VMO", None)
5010
- self.MMO = Parser.safe_get(combined_df, "MMO", None)
5011
- self.hmo = Parser.safe_get(combined_df, "hmo", None)
5012
- self.Hmax = Parser.safe_get(combined_df, "Hmax", None)
5013
- self.tempGrad = Parser.safe_get(
4903
+ self.WTC = configuration.safe_get(combined_df, "WTC", None)
4904
+ self.mass = configuration.safe_get(
4905
+ combined_df, "mass", None
4906
+ )
4907
+
4908
+ self.MTOW = configuration.safe_get(
4909
+ combined_df, "MTOW", None
4910
+ )
4911
+ self.OEW = configuration.safe_get(combined_df, "OEW", None)
4912
+ self.MPL = configuration.safe_get(combined_df, "MPL", None)
4913
+ self.MREF = configuration.safe_get(
4914
+ combined_df, "MREF", None
4915
+ )
4916
+ self.VMO = configuration.safe_get(combined_df, "VMO", None)
4917
+ self.MMO = configuration.safe_get(combined_df, "MMO", None)
4918
+ self.hmo = configuration.safe_get(combined_df, "hmo", None)
4919
+ self.Hmax = configuration.safe_get(
4920
+ combined_df, "Hmax", None
4921
+ )
4922
+ self.tempGrad = configuration.safe_get(
5014
4923
  combined_df, "tempGrad", None
5015
4924
  )
5016
4925
 
5017
- self.S = Parser.safe_get(combined_df, "S", None)
5018
- self.Clbo = Parser.safe_get(combined_df, "Clbo", None)
5019
- self.k = Parser.safe_get(combined_df, "k", None)
5020
- self.Vstall = Parser.safe_get(combined_df, "Vstall", None)
5021
- self.CD0 = Parser.safe_get(combined_df, "CD0", None)
5022
- self.CD2 = Parser.safe_get(combined_df, "CD2", None)
5023
- self.HLids = Parser.safe_get(combined_df, "HLids", None)
5024
- self.Ct = Parser.safe_get(combined_df, "Ct", None)
5025
- self.CTdeslow = Parser.safe_get(
4926
+ self.S = configuration.safe_get(combined_df, "S", None)
4927
+ self.Clbo = configuration.safe_get(
4928
+ combined_df, "Clbo", None
4929
+ )
4930
+ self.k = configuration.safe_get(combined_df, "k", None)
4931
+ self.Vstall = configuration.safe_get(
4932
+ combined_df, "Vstall", None
4933
+ )
4934
+ self.CD0 = configuration.safe_get(combined_df, "CD0", None)
4935
+ self.CD2 = configuration.safe_get(combined_df, "CD2", None)
4936
+ self.HLids = configuration.safe_get(
4937
+ combined_df, "HLids", None
4938
+ )
4939
+ self.Ct = configuration.safe_get(combined_df, "Ct", None)
4940
+ self.CTdeslow = configuration.safe_get(
5026
4941
  combined_df, "CTdeslow", None
5027
4942
  )
5028
- self.CTdeshigh = Parser.safe_get(
4943
+ self.CTdeshigh = configuration.safe_get(
5029
4944
  combined_df, "CTdeshigh", None
5030
4945
  )
5031
- self.CTdesapp = Parser.safe_get(
4946
+ self.CTdesapp = configuration.safe_get(
5032
4947
  combined_df, "CTdesapp", None
5033
4948
  )
5034
- self.CTdesld = Parser.safe_get(
4949
+ self.CTdesld = configuration.safe_get(
5035
4950
  combined_df, "CTdesld", None
5036
4951
  )
5037
- self.HpDes = Parser.safe_get(combined_df, "HpDes", None)
5038
- self.Cf = Parser.safe_get(combined_df, "Cf", None)
5039
- self.CfDes = Parser.safe_get(combined_df, "CfDes", None)
5040
- self.CfCrz = Parser.safe_get(combined_df, "CfCrz", None)
5041
- self.TOL = Parser.safe_get(combined_df, "TOL", None)
5042
- self.LDL = Parser.safe_get(combined_df, "LDL", None)
5043
- self.span = Parser.safe_get(combined_df, "span", None)
5044
- self.length = Parser.safe_get(combined_df, "length", None)
5045
-
5046
- self.V1 = Parser.safe_get(combined_df, "V1", None)
5047
- self.V2 = Parser.safe_get(combined_df, "V2", None)
5048
- self.M = Parser.safe_get(combined_df, "M", None)
5049
-
5050
- self.GPFdata = Parser.safe_get(
4952
+ self.HpDes = configuration.safe_get(
4953
+ combined_df, "HpDes", None
4954
+ )
4955
+ self.Cf = configuration.safe_get(combined_df, "Cf", None)
4956
+ self.CfDes = configuration.safe_get(
4957
+ combined_df, "CfDes", None
4958
+ )
4959
+ self.CfCrz = configuration.safe_get(
4960
+ combined_df, "CfCrz", None
4961
+ )
4962
+ self.TOL = configuration.safe_get(combined_df, "TOL", None)
4963
+ self.LDL = configuration.safe_get(combined_df, "LDL", None)
4964
+ self.span = configuration.safe_get(
4965
+ combined_df, "span", None
4966
+ )
4967
+ self.length = configuration.safe_get(
4968
+ combined_df, "length", None
4969
+ )
4970
+
4971
+ self.V1 = configuration.safe_get(combined_df, "V1", None)
4972
+ self.V2 = configuration.safe_get(combined_df, "V2", None)
4973
+ self.M = configuration.safe_get(combined_df, "M", None)
4974
+
4975
+ self.GPFdata = configuration.safe_get(
5051
4976
  combined_df, "GPFdata", None
5052
4977
  )
5053
4978
 
5054
- self.drone = Parser.safe_get(combined_df, "drone", None)
4979
+ self.drone = configuration.safe_get(
4980
+ combined_df, "drone", None
4981
+ )
5055
4982
 
5056
- self.DeltaCD = Parser.safe_get(
4983
+ self.DeltaCD = configuration.safe_get(
5057
4984
  combined_df, "DeltaCD", None
5058
4985
  )
5059
- self.speedSchedule = Parser.safe_get(
4986
+ self.speedSchedule = configuration.safe_get(
5060
4987
  combined_df, "speedSchedule", None
5061
4988
  )
5062
- self.aeroConfig = Parser.safe_get(
4989
+ self.aeroConfig = configuration.safe_get(
5063
4990
  combined_df, "aeroConfig", None
5064
4991
  )
5065
4992
 
@@ -5072,96 +4999,126 @@ class Bada3Aircraft(BADA3):
5072
4999
  # search for xml files
5073
5000
 
5074
5001
  XMLDataFrame = Parser.parseXML(
5075
- self.filePath, badaVersion, self.SearchedACName
5002
+ self.filePath, self.SearchedACName
5076
5003
  )
5077
5004
 
5078
5005
  combined_df = Parser.combineACDATA_GPF(
5079
5006
  XMLDataFrame, GPFDataFrame
5080
5007
  )
5081
5008
 
5082
- self.acName = Parser.safe_get(combined_df, "acName", None)
5083
- self.xmlFiles = Parser.safe_get(
5009
+ self.acName = configuration.safe_get(
5010
+ combined_df, "acName", None
5011
+ )
5012
+ self.xmlFiles = configuration.safe_get(
5084
5013
  combined_df, "xmlFiles", None
5085
5014
  )
5086
5015
 
5087
- self.modificationDateOPF = Parser.safe_get(
5016
+ self.modificationDateOPF = configuration.safe_get(
5088
5017
  combined_df, "modificationDateOPF", None
5089
5018
  )
5090
- self.modificationDateAPF = Parser.safe_get(
5019
+ self.modificationDateAPF = configuration.safe_get(
5091
5020
  combined_df, "modificationDateAPF", None
5092
5021
  )
5093
5022
 
5094
- self.ICAO = Parser.safe_get(combined_df, "ICAO", None)
5095
- self.numberOfEngines = Parser.safe_get(
5023
+ self.ICAO = configuration.safe_get(
5024
+ combined_df, "ICAO", None
5025
+ )
5026
+ self.numberOfEngines = configuration.safe_get(
5096
5027
  combined_df, "numberOfEngines", None
5097
5028
  )
5098
- self.engineType = Parser.safe_get(
5029
+ self.engineType = configuration.safe_get(
5099
5030
  combined_df, "engineType", None
5100
5031
  )
5101
- self.engines = Parser.safe_get(
5032
+ self.engines = configuration.safe_get(
5102
5033
  combined_df, "engines", None
5103
5034
  )
5104
- self.WTC = Parser.safe_get(combined_df, "WTC", None)
5105
- self.mass = Parser.safe_get(combined_df, "mass", None)
5106
-
5107
- self.MTOW = Parser.safe_get(combined_df, "MTOW", None)
5108
- self.OEW = Parser.safe_get(combined_df, "OEW", None)
5109
- self.MPL = Parser.safe_get(combined_df, "MPL", None)
5110
- self.MREF = Parser.safe_get(combined_df, "MREF", None)
5111
- self.VMO = Parser.safe_get(combined_df, "VMO", None)
5112
- self.MMO = Parser.safe_get(combined_df, "MMO", None)
5113
- self.hmo = Parser.safe_get(combined_df, "hmo", None)
5114
- self.Hmax = Parser.safe_get(combined_df, "Hmax", None)
5115
- self.tempGrad = Parser.safe_get(
5035
+ self.WTC = configuration.safe_get(combined_df, "WTC", None)
5036
+ self.mass = configuration.safe_get(
5037
+ combined_df, "mass", None
5038
+ )
5039
+
5040
+ self.MTOW = configuration.safe_get(
5041
+ combined_df, "MTOW", None
5042
+ )
5043
+ self.OEW = configuration.safe_get(combined_df, "OEW", None)
5044
+ self.MPL = configuration.safe_get(combined_df, "MPL", None)
5045
+ self.MREF = configuration.safe_get(
5046
+ combined_df, "MREF", None
5047
+ )
5048
+ self.VMO = configuration.safe_get(combined_df, "VMO", None)
5049
+ self.MMO = configuration.safe_get(combined_df, "MMO", None)
5050
+ self.hmo = configuration.safe_get(combined_df, "hmo", None)
5051
+ self.Hmax = configuration.safe_get(
5052
+ combined_df, "Hmax", None
5053
+ )
5054
+ self.tempGrad = configuration.safe_get(
5116
5055
  combined_df, "tempGrad", None
5117
5056
  )
5118
5057
 
5119
- self.S = Parser.safe_get(combined_df, "S", None)
5120
- self.Clbo = Parser.safe_get(combined_df, "Clbo", None)
5121
- self.k = Parser.safe_get(combined_df, "k", None)
5122
- self.Vstall = Parser.safe_get(combined_df, "Vstall", None)
5123
- self.CD0 = Parser.safe_get(combined_df, "CD0", None)
5124
- self.CD2 = Parser.safe_get(combined_df, "CD2", None)
5125
- self.HLids = Parser.safe_get(combined_df, "HLids", None)
5126
- self.Ct = Parser.safe_get(combined_df, "Ct", None)
5127
- self.CTdeslow = Parser.safe_get(
5058
+ self.S = configuration.safe_get(combined_df, "S", None)
5059
+ self.Clbo = configuration.safe_get(
5060
+ combined_df, "Clbo", None
5061
+ )
5062
+ self.k = configuration.safe_get(combined_df, "k", None)
5063
+ self.Vstall = configuration.safe_get(
5064
+ combined_df, "Vstall", None
5065
+ )
5066
+ self.CD0 = configuration.safe_get(combined_df, "CD0", None)
5067
+ self.CD2 = configuration.safe_get(combined_df, "CD2", None)
5068
+ self.HLids = configuration.safe_get(
5069
+ combined_df, "HLids", None
5070
+ )
5071
+ self.Ct = configuration.safe_get(combined_df, "Ct", None)
5072
+ self.CTdeslow = configuration.safe_get(
5128
5073
  combined_df, "CTdeslow", None
5129
5074
  )
5130
- self.CTdeshigh = Parser.safe_get(
5075
+ self.CTdeshigh = configuration.safe_get(
5131
5076
  combined_df, "CTdeshigh", None
5132
5077
  )
5133
- self.CTdesapp = Parser.safe_get(
5078
+ self.CTdesapp = configuration.safe_get(
5134
5079
  combined_df, "CTdesapp", None
5135
5080
  )
5136
- self.CTdesld = Parser.safe_get(
5081
+ self.CTdesld = configuration.safe_get(
5137
5082
  combined_df, "CTdesld", None
5138
5083
  )
5139
- self.HpDes = Parser.safe_get(combined_df, "HpDes", None)
5140
- self.Cf = Parser.safe_get(combined_df, "Cf", None)
5141
- self.CfDes = Parser.safe_get(combined_df, "CfDes", None)
5142
- self.CfCrz = Parser.safe_get(combined_df, "CfCrz", None)
5143
- self.TOL = Parser.safe_get(combined_df, "TOL", None)
5144
- self.LDL = Parser.safe_get(combined_df, "LDL", None)
5145
- self.span = Parser.safe_get(combined_df, "span", None)
5146
- self.length = Parser.safe_get(combined_df, "length", None)
5147
-
5148
- self.V1 = Parser.safe_get(combined_df, "V1", None)
5149
- self.V2 = Parser.safe_get(combined_df, "V2", None)
5150
- self.M = Parser.safe_get(combined_df, "M", None)
5151
-
5152
- self.GPFdata = Parser.safe_get(
5084
+ self.HpDes = configuration.safe_get(
5085
+ combined_df, "HpDes", None
5086
+ )
5087
+ self.Cf = configuration.safe_get(combined_df, "Cf", None)
5088
+ self.CfDes = configuration.safe_get(
5089
+ combined_df, "CfDes", None
5090
+ )
5091
+ self.CfCrz = configuration.safe_get(
5092
+ combined_df, "CfCrz", None
5093
+ )
5094
+ self.TOL = configuration.safe_get(combined_df, "TOL", None)
5095
+ self.LDL = configuration.safe_get(combined_df, "LDL", None)
5096
+ self.span = configuration.safe_get(
5097
+ combined_df, "span", None
5098
+ )
5099
+ self.length = configuration.safe_get(
5100
+ combined_df, "length", None
5101
+ )
5102
+
5103
+ self.V1 = configuration.safe_get(combined_df, "V1", None)
5104
+ self.V2 = configuration.safe_get(combined_df, "V2", None)
5105
+ self.M = configuration.safe_get(combined_df, "M", None)
5106
+
5107
+ self.GPFdata = configuration.safe_get(
5153
5108
  combined_df, "GPFdata", None
5154
5109
  )
5155
5110
 
5156
- self.drone = Parser.safe_get(combined_df, "drone", None)
5111
+ self.drone = configuration.safe_get(
5112
+ combined_df, "drone", None
5113
+ )
5157
5114
 
5158
- self.DeltaCD = Parser.safe_get(
5115
+ self.DeltaCD = configuration.safe_get(
5159
5116
  combined_df, "DeltaCD", None
5160
5117
  )
5161
- self.speedSchedule = Parser.safe_get(
5118
+ self.speedSchedule = configuration.safe_get(
5162
5119
  combined_df, "speedSchedule", None
5163
5120
  )
5164
- self.aeroConfig = Parser.safe_get(
5121
+ self.aeroConfig = configuration.safe_get(
5165
5122
  combined_df, "aeroConfig", None
5166
5123
  )
5167
5124