import numpy as np
# CORSIKA-style atmosphere parameters
# Data storage for atmosphere parameters
# Each key is a tuple (location, season), and value is a dict of parameters.
_cosika_atmosphere_params = {
("USStd", None): {
"_aatm": np.array([-186.5562, -94.919, 0.61289, 0.0, 0.01128292]),
"_batm": np.array([1222.6562, 1144.9069, 1305.5948, 540.1778, 1.0]),
"_catm": np.array([994186.38, 878153.55, 636143.04, 772170.0, 1.0e9]),
"_thickl": np.array([1036.102549, 631.100309, 271.700230, 3.039494, 0.001280]),
"_hlay": np.array([0.0, 4.0e5, 1.0e6, 4.0e6, 1.0e7]),
},
("BK_USStd", None): {
"_aatm": np.array(
[-149.801663, -57.932486, 0.63631894, 4.3545369e-4, 0.01128292]
),
"_batm": np.array([1183.6071, 1143.0425, 1322.9748, 655.69307, 1.0]),
"_catm": np.array([954248.34, 800005.34, 629568.93, 737521.77, 1.0e9]),
"_thickl": np.array([1033.804941, 418.557770, 216.981635, 4.344861, 0.001280]),
"_hlay": np.array([0.0, 7.0e5, 1.14e6, 3.7e6, 1.0e7]),
},
("Karlsruhe", None): {
"_aatm": np.array([-118.1277, -154.258, 0.4191499, 5.4094056e-4, 0.01128292]),
"_batm": np.array([1173.9861, 1205.7625, 1386.7807, 555.8935, 1.0]),
"_catm": np.array([919546.0, 963267.92, 614315.0, 739059.6, 1.0e9]),
"_thickl": np.array([1055.858707, 641.755364, 272.720974, 2.480633, 0.001280]),
"_hlay": np.array([0.0, 4.0e5, 1.0e6, 4.0e6, 1.0e7]),
},
("KM3NeT", None): { # Averaged over detector and season
"_aatm": np.array(
[
-141.31449999999998,
-8.256029999999999,
0.6132505,
-0.025998975,
0.4024275,
]
),
"_batm": np.array(
[1153.0349999999999, 1263.3325, 1257.0724999999998, 404.85974999999996, 1.0]
),
"_catm": np.array([967990.75, 668591.75, 636790.0, 814070.75, 21426175.0]),
"_thickl": np.array(
[
1011.8521512499999,
275.84507575000003,
51.0230705,
2.983134,
0.21927724999999998,
]
),
"_hlay": np.array([0.0, 993750.0, 2081250.0, 4150000.0, 6877500.0]),
},
("ANTARES/KM3NeT-ORCA", "Summer"): {
"_aatm": np.array([-158.85, -5.38682, 0.889893, -0.0286665, 0.50035]),
"_batm": np.array([1145.62, 1176.79, 1248.92, 415.543, 1.0]),
"_catm": np.array([998469.0, 677398.0, 636790.0, 823489.0, 16090500.0]),
"_thickl": np.array([986.951713, 306.4668, 40.546793, 4.288721, 0.277182]),
"_hlay": np.array([0, 9.0e5, 22.0e5, 38.0e5, 68.2e5]),
},
("ANTARES/KM3NeT-ORCA", "Winter"): {
"_aatm": np.array([-132.16, -2.4787, 0.298031, -0.0220264, 0.348021]),
"_batm": np.array([1120.45, 1203.97, 1163.28, 360.027, 1.0]),
"_catm": np.array([933697.0, 643957.0, 636790.0, 804486.0, 23109000.0]),
"_thickl": np.array([988.431172, 273.033464, 37.185105, 1.162987, 0.192998]),
"_hlay": np.array([0, 9.5e5, 22.0e5, 47.0e5, 68.2e5]),
},
("KM3NeT-ARCA", "Summer"): {
"_aatm": np.array([-157.857, -28.7524, 0.790275, -0.0286999, 0.481114]),
"_batm": np.array([1190.44, 1171.0, 1344.78, 445.357, 1.0]),
"_catm": np.array([1006100.0, 758614.0, 636790.0, 817384.0, 16886800.0]),
"_thickl": np.array([1032.679434, 328.978681, 80.601135, 4.420745, 0.264112]),
"_hlay": np.array([0, 9.0e5, 18.0e5, 38.0e5, 68.2e5]),
},
("KM3NeT-ARCA", "Winter"): {
"_aatm": np.array([-116.391, 3.5938, 0.474803, -0.0246031, 0.280225]),
"_batm": np.array([1155.63, 1501.57, 1271.31, 398.512, 1.0]),
"_catm": np.array([933697.0, 594398.0, 636790.0, 810924.0, 29618400.0]),
"_thickl": np.array([1039.346286, 194.901358, 45.759249, 2.060083, 0.142817]),
"_hlay": np.array([0, 12.25e5, 21.25e5, 43.0e5, 70.5e5]),
},
("SouthPole", "December"): { # MSIS-90-E for Dec
"_aatm": np.array([-128.601, -39.5548, 1.13088, -0.00264960, 0.00192534]),
"_batm": np.array([1139.99, 1073.82, 1052.96, 492.503, 1.0]),
"_catm": np.array([861913.0, 744955.0, 675928.0, 829627.0, 5.8587010e9]),
"_thickl": np.array([1011.398804, 588.128367, 240.955360, 3.964546, 0.000218]),
"_hlay": np.array([0.0, 4.0e5, 1.0e6, 4.0e6, 1.0e7]),
},
("SouthPole", "June"): { # MSIS-90-E for June
"_aatm": np.array([-163.331, -65.3713, 0.402903, -0.000479198, 0.00188667]),
"_batm": np.array([1183.70, 1108.06, 1424.02, 207.595, 1.0]),
"_catm": np.array([875221.0, 753213.0, 545846.0, 793043.0, 5.9787908e9]),
"_thickl": np.array([1020.370363, 586.143464, 228.374393, 1.338258, 0.000214]),
"_hlay": np.array([0.0, 4.0e5, 1.0e6, 4.0e6, 1.0e7]),
},
("PL_SouthPole", "January"): { # P. Lipari\'s Jan
"_aatm": np.array([-113.139, -7.930635e06, -54.3888, -0.0, 0.00421033]),
"_batm": np.array([1133.10, 1101.20, 1085.00, 1098.00, 1.0]),
"_catm": np.array([861730.0, 826340.0, 790950.0, 682800.0, 2.6798156e9]),
"_thickl": np.array(
[1019.966898, 718.071682, 498.659703, 340.222344, 0.000478]
),
"_hlay": np.array([0.0, 2.67e5, 5.33e5, 8.0e5, 1.0e7]),
},
("PL_SouthPole", "August"): { # P. Lipari\'s Aug
"_aatm": np.array([-59.0293, -21.5794, -7.14839, 0.0, 0.000190175]),
"_batm": np.array([1079.0, 1071.90, 1182.0, 1647.1, 1.0]),
"_catm": np.array([764170.0, 699910.0, 635650.0, 551010.0, 59.329575e9]),
"_thickl": np.array([1019.946057, 391.739652, 138.023515, 43.687992, 0.000022]),
"_hlay": np.array([0.0, 6.67e5, 13.33e5, 2.0e6, 1.0e7]),
},
("SDR_SouthPole", "January"): {
"_aatm": np.array([-91.6956, 7.01491, 0.505452, -0.00181302, 0.00207722]),
"_batm": np.array([1125.71, 1149.81, 1032.68, 490.789, 1.0]),
"_catm": np.array([821621.0, 635444.0, 682968.0, 807327.0, 5.4303203e9]),
"_thickl": np.array([1034.012527, 343.944792, 94.067894, 3.291329, 0.000236]),
"_hlay": np.array([0.0, 7.8e5, 1.64e6, 4.04e6, 1.0e7]),
},
("SDR_SouthPole", "February"): {
"_aatm": np.array([-72.1988, 22.7002, 0.430171, -0.0012030, 0.00207722]),
"_batm": np.array([1108.19, 1159.77, 1079.25, 523.956, 1.0]),
"_catm": np.array([786271.0, 599986.0, 667432.0, 780919.0, 5.4303203e9]),
"_thickl": np.array([1035.987489, 328.422968, 220.918411, 2.967188, 0.000236]),
"_hlay": np.array([0.0, 8.0e5, 1.06e6, 4.04e6, 1.0e7]),
},
("SDR_SouthPole", "March"): {
"_aatm": np.array([-63.7290, -1.02799, 0.324414, -0.000490772, 0.00207722]),
"_batm": np.array([1102.66, 1093.56, 1198.93, 589.827, 1.0]),
"_catm": np.array([764831.0, 660389.0, 636118.0, 734909.0, 5.4303203e9]),
"_thickl": np.array([1038.92306, 395.458197, 35.764007, 2.416571, 0.000236]),
"_hlay": np.array([0.0, 6.7e5, 2.24e6, 4.04e6, 1.0e7]),
},
("SDR_SouthPole", "April"): {
"_aatm": np.array([-69.7259, -2.79781, 0.262692, -0.0000841695, 0.00207722]),
"_batm": np.array([1111.70, 1128.64, 1413.98, 587.688, 1.0]),
"_catm": np.array([766099.0, 641716.0, 588082.0, 693300.0, 5.4303203e9]),
"_thickl": np.array([1041.972041, 342.512757, 33.817874, 1.731426, 0.000236]),
"_hlay": np.array([0.0, 7.6e5, 2.2e6, 4.04e6, 1.0e7]),
},
("SDR_SouthPole", "May"): {
"_aatm": np.array([-78.5551, -5.33239, 0.312889, -0.0000920472, 0.00152236]),
"_batm": np.array([1118.46, 1169.09, 1577.71, 452.177, 1.0]),
"_catm": np.array([776648.0, 626683.0, 553087.0, 696835.0, 7.4095699e9]),
"_thickl": np.array([1039.912752, 300.670386, 42.734726, 1.517136, 0.000173]),
"_hlay": np.array([0.0, 8.4e5, 2.0e6, 3.97e6, 1.0e7]),
},
("SDR_SouthPole", "June"): {
"_aatm": np.array([-92.6125, -8.56450, 0.363986, 0.00207722, 0.00152236]),
"_batm": np.array([1129.88, 1191.98, 1619.82, 411.586, 1.0]),
"_catm": np.array([791177.0, 618840.0, 535235.0, 692253.0, 5.4303203e9]),
"_thickl": np.array([1037.258545, 293.258798, 57.517838, 1.604677, 0.000236]),
"_hlay": np.array([0.0, 8.5e5, 1.79e6, 3.84e6, 1.0e7]),
},
("SDR_SouthPole", "July"): {
"_aatm": np.array([-89.9639, -13.9697, 0.441631, -0.0000146525, 0.00207722]),
"_batm": np.array([1125.73, 1180.47, 1581.43, 373.796, 1.0]),
"_catm": np.array([784553.0, 628042.0, 531652.0, 703417.0, 5.4303203e9]),
"_thickl": np.array([1035.760962, 291.018963, 79.913857, 1.808649, 0.000236]),
"_hlay": np.array([0.0, 8.5e5, 1.59e6, 3.75e6, 1.0e7]),
},
("SDR_SouthPole", "August"): {
"_aatm": np.array([-90.4253, -18.7154, 0.513930, -0.00021565, 0.00152336]),
"_batm": np.array([1125.01, 1175.60, 1518.03, 299.006, 1.0]),
"_catm": np.array([781628.0, 633793.0, 533269.0, 737794.0, 7.4095699e9]),
"_thickl": np.array([1034.576882, 288.770552, 102.500845, 1.854518, 0.000173]),
"_hlay": np.array([0.0, 8.5e5, 1.44e6, 3.75e6, 1.0e7]),
},
("SDR_SouthPole", "September"): {
"_aatm": np.array([-91.6860, -23.3519, 0.891302, -0.000765666, 0.00207722]),
"_batm": np.array([1125.53, 1169.77, 1431.26, 247.030, 1.0]),
"_catm": np.array([786017.0, 645241.0, 545022.0, 805419.0, 5.4303203e9]),
"_thickl": np.array([1033.830437, 289.992106, 132.664890, 2.758468, 0.000236]),
"_hlay": np.array([0.0, 8.5e5, 1.3e6, 3.62e6, 1.0e7]),
},
("SDR_SouthPole", "October"): {
"_aatm": np.array([451.616, -85.5456, 2.06082, -0.0010760, 0.00207722]),
"_batm": np.array([849.239, 1113.16, 1322.28, 372.242, 1.0]),
"_catm": np.array([225286.0, 789340.0, 566132.0, 796434.0, 5.4303203e9]),
"_thickl": np.array([1300.861796, 666.125666, 224.149961, 7.129645, 0.000236]),
"_hlay": np.array([0.0, 3.1e5, 1.01e6, 3.15e6, 1.0e7]),
},
("SDR_SouthPole", "November"): {
"_aatm": np.array([-152.853, 4.22741, 1.38352, -0.00115014, 0.00207722]),
"_batm": np.array([1174.09, 1272.49, 975.906, 481.615, 1.0]),
"_catm": np.array([891602.0, 582119.0, 643130.0, 783786.0, 5.4303203e9]),
"_thickl": np.array([1021.228204, 299.692876, 31.360220, 7.715379, 0.000236]),
"_hlay": np.array([0.0, 8.5e5, 2.24e6, 3.24e6, 1.0e7]),
},
("SDR_SouthPole", "December"): {
"_aatm": np.array([-100.386, 5.43849, 0.399465, -0.00175472, 0.00207722]),
"_batm": np.array([1128.71, 1198.10, 858.522, 480.142, 1.0]),
"_catm": np.array([829352.0, 612649.0, 706104.0, 806875.0, 5.4303203e9]),
"_thickl": np.array([1028.319337, 304.628519, 38.473287, 3.210929, 0.000236]),
"_hlay": np.array([0.0, 8.5e5, 2.2e6, 4.04e6, 1.0e7]),
},
}
_corsika_reference_table = """\
+---------------------+-------------------+------------------------------+
| location | CORSIKA MODATM | Description/season |
+=====================+===================+==============================+
| "USStd" | 1 | US Standard atmosphere |
+---------------------+-------------------+------------------------------+
| "BK_USStd" | 17 | Bianca Keilhauer's USStd |
+---------------------+-------------------+------------------------------+
| "Karlsruhe" | 2 | AT115 / Karlsruhe |
+---------------------+-------------------+------------------------------+
| "SouthPole" | 14 and 12 | MSIS-90-E for Dec and June |
+---------------------+-------------------+------------------------------+
|"PL_SouthPole" | 15 and 16 | P. Lipari's Jan and Aug |
+---------------------+-------------------+------------------------------+
|"SDR_SouthPole" | 30 to 41 | S. De Ridder, every month |
+---------------------+-------------------+------------------------------+
|"ANTARES/KM3NeT-ORCA"| NA | PhD T. Heid |
+---------------------+-------------------+------------------------------+
| "KM3NeT-ARCA" | NA | PhD T. Heid |
+---------------------+-------------------+------------------------------+
"""
# NRLMSISE-00 related parameters
MONTH_TO_DAY_OF_YEAR = {
"January": 1,
"February": 32,
"March": 60,
"April": 91,
"May": 121,
"June": 152,
"July": 182,
"August": 213,
"September": 244,
"October": 274,
"November": 305,
"December": 335,
}
# Longitude, latitude, height (in cm)
LOCATIONS = {
"SouthPole": (0.0, -90.0, 2834.0 * 100.0),
"Karlsruhe": (8.4, 49.0, 110.0 * 100.0),
"Geneva": (6.1, 46.2, 370.0 * 100.0),
"Tokyo": (139.0, 35.0, 5.0 * 100.0),
"GranSasso": (13.5, 42.4, 5.0 * 100.0),
"TelAviv": (34.8, 32.1, 5.0 * 100.0),
"KSC": (-80.7, 32.1, 5.0 * 100.0), # Kennedy Space Center
"SoudanMine": (-92.2, 47.8, 5.0 * 100.0),
"Tsukuba": (140.1, 36.2, 30.0 * 100.0),
"LynnLake": (-101.1, 56.9, 360.0 * 100.0),
"PeaceRiver": (-117.2, 56.15, 36000.0 * 100.0),
"FtSumner": (-104.2, 34.5, 31000.0 * 100.0),
}
DAY_TIMES_SEC = {
"day": 43200.0, # 12:00 PM in seconds from midnight
"night": 0.0, # Midnight in seconds
}
# Default geophysical parameters for NRLMSISE-00
DEFAULT_F107A = 150.0
DEFAULT_F107 = 150.0
DEFAULT_AP = 4.0
[docs]
def list_available_corsika_atmospheres(
print_reference_table=False, format_output=False
): # Renamed from list_available_corsika_atmospheres
"""Returns a list of available (location, season) tuples for CORSIKA-style models.
Args:
print_reference_table (bool): If True, prints the reference table
for CORSIKA-style atmospheres.
"""
if print_reference_table:
print("Available CORSIKA-style atmosphere models and their references:")
print(_corsika_reference_table)
if format_output:
print("Formatted output:")
# Collect which seasons are available for each location and print
# formatted output with seasons list listed with one tab in each line
locations = {}
for location, season in _cosika_atmosphere_params:
if location not in locations:
locations[location] = []
if season is not None and season not in locations[location]:
locations[location].append(season)
for location, seasons in locations.items():
print(f"{location}:")
for season in seasons:
print(f"\t{season}")
return list(_cosika_atmosphere_params.keys())
[docs]
def get_atmosphere_parameters(
location, season
): # Renamed from get_corsika_atmosphere_parameters
(
"""
Returns the atmospheric parameters for a given location and season for CORSIKA-style models.
Parameters are based on CORSIKA parameterizations.
Reference Table:
"""
+ _corsika_reference_table
+ """
Args:
location (str): The location identifier.
season (str or None): The season identifier.
Returns:
tuple: (_aatm, _batm, _catm, _thickl, _hlay) numpy arrays.
Raises:
KeyError: if the (location, season) combination is not found.
"""
)
params = _cosika_atmosphere_params.get((location, season))
if params is None:
raise KeyError(
f"CORSIKA atmosphere parameters not found for location='{location}', season='{season}'"
)
return (
params["_aatm"],
params["_batm"],
params["_catm"],
params["_thickl"],
params["_hlay"],
)
[docs]
def get_nrlmsise00_defaults():
"""Returns the default geophysical parameters for NRLMSISE-00."""
return DEFAULT_F107A, DEFAULT_F107, DEFAULT_AP
[docs]
def get_location_data(location_name):
"""Returns longitude, latitude, and height for a given location name."""
return LOCATIONS.get(location_name)
[docs]
def get_month_day_of_year(month_name):
"""Returns the day of the year for a given month name."""
return MONTH_TO_DAY_OF_YEAR.get(month_name)
[docs]
def get_day_time_seconds(day_time_name):
"""Returns the time in seconds from midnight for a given day time name (e.g., 'day', 'night')."""
return DAY_TIMES_SEC.get(day_time_name)