143 bool changed =
false;
147 std::string mapFuncPreview;
148 if (troposphereModelSelection.
zwdMappingFunction.first != std::get<1>(ModelDefaults(troposphereModelSelection.
zwdModel.first))
149 || troposphereModelSelection.
zhdMappingFunction.first != std::get<1>(ModelDefaults(troposphereModelSelection.
zhdModel.first)))
151 mapFuncPreview = fmt::format(
" + {}", troposphereModelSelection.
zhdMappingFunction.first);
155 mapFuncPreview += fmt::format(
" | {}", troposphereModelSelection.
zwdMappingFunction.first);
159 ImGui::SetNextItemWidth(width - BUTTON_WIDTH - 2 * ImGui::GetStyle().ItemInnerSpacing.x);
161 troposphereModelSelection.
zhdModel.first,
162 troposphereModelSelection.
zwdModel.first,
163 mapFuncPreview.c_str()))
165 std::tie(troposphereModelSelection.
zhdModel.second,
168 std::tie(troposphereModelSelection.
zwdModel.second,
174 if (ImGui::Button(fmt::format(
"...##{}", label).c_str(), ImVec2(BUTTON_WIDTH, 0)))
176 ImGui::OpenPopup(fmt::format(
"{} Popup", label).c_str());
178 if (ImGui::BeginPopup(fmt::format(
"{} Popup", label).c_str()))
181 if (ImGui::BeginTable(fmt::format(
"{} Table", label).c_str(), 5))
183 ImGui::TableSetupColumn(
"", ImGuiTableColumnFlags_WidthFixed);
184 ImGui::TableSetupColumn(
"", ImGuiTableColumnFlags_WidthFixed);
185 ImGui::TableSetupColumn(
"Pressure", ImGuiTableColumnFlags_WidthFixed);
186 ImGui::TableSetupColumn(
"Temperature", ImGuiTableColumnFlags_WidthFixed);
187 ImGui::TableSetupColumn(
"Water vapor", ImGuiTableColumnFlags_WidthFixed);
188 ImGui::TableHeadersRow();
190 ImGui::TableNextColumn();
191 ImGui::TextUnformatted(
"ZHD model");
192 ImGui::TableNextColumn();
193 ImGui::SetNextItemWidth(width);
196 std::tie(troposphereModelSelection.
zhdModel.second,
202 ImGui::TableNextColumn();
203 ImGui::SetNextItemWidth(ATMOSPHERE_COMBO_WIDTH);
204 changed |=
ComboPressureModel(fmt::format(
"##{} ZHD - Pressure", label).c_str(), troposphereModelSelection.
zhdModel.second.pressureModel);
205 ImGui::TableNextColumn();
206 ImGui::SetNextItemWidth(ATMOSPHERE_COMBO_WIDTH);
207 changed |=
ComboTemperatureModel(fmt::format(
"##{} ZHD - Temperature", label).c_str(), troposphereModelSelection.
zhdModel.second.temperatureModel);
208 ImGui::TableNextColumn();
209 ImGui::SetNextItemWidth(ATMOSPHERE_COMBO_WIDTH);
210 changed |=
ComboWaterVaporModel(fmt::format(
"##{} ZHD - Water vapor", label).c_str(), troposphereModelSelection.
zhdModel.second.waterVaporModel);
213 ImGui::TableNextColumn();
214 ImGui::TextUnformatted(
"ZWD model");
215 ImGui::TableNextColumn();
216 ImGui::SetNextItemWidth(width);
219 std::tie(troposphereModelSelection.
zwdModel.second,
225 ImGui::TableNextColumn();
226 ImGui::SetNextItemWidth(ATMOSPHERE_COMBO_WIDTH);
227 changed |=
ComboPressureModel(fmt::format(
"##{} ZWD - Pressure", label).c_str(), troposphereModelSelection.
zwdModel.second.pressureModel);
228 ImGui::TableNextColumn();
229 ImGui::SetNextItemWidth(ATMOSPHERE_COMBO_WIDTH);
230 changed |=
ComboTemperatureModel(fmt::format(
"##{} ZWD - Temperature", label).c_str(), troposphereModelSelection.
zwdModel.second.temperatureModel);
231 ImGui::TableNextColumn();
232 ImGui::SetNextItemWidth(ATMOSPHERE_COMBO_WIDTH);
233 changed |=
ComboWaterVaporModel(fmt::format(
"##{} ZWD - Water vapor", label).c_str(), troposphereModelSelection.
zwdModel.second.waterVaporModel);
237 ImGui::TableNextColumn();
238 ImGui::TextUnformatted(
"Mapping function ZHD");
239 ImGui::TableNextColumn();
240 ImGui::SetNextItemWidth(width);
248 ImGui::TableNextColumn();
249 ImGui::SetNextItemWidth(ATMOSPHERE_COMBO_WIDTH);
251 ImGui::TableNextColumn();
252 ImGui::SetNextItemWidth(ATMOSPHERE_COMBO_WIDTH);
254 ImGui::TableNextColumn();
255 ImGui::SetNextItemWidth(ATMOSPHERE_COMBO_WIDTH);
261 ImGui::TableNextColumn();
262 ImGui::TextUnformatted(
"Mapping function ZWD");
263 ImGui::TableNextColumn();
264 ImGui::SetNextItemWidth(width);
272 ImGui::TableNextColumn();
273 ImGui::SetNextItemWidth(ATMOSPHERE_COMBO_WIDTH);
275 ImGui::TableNextColumn();
276 ImGui::SetNextItemWidth(ATMOSPHERE_COMBO_WIDTH);
278 ImGui::TableNextColumn();
279 ImGui::SetNextItemWidth(ATMOSPHERE_COMBO_WIDTH);
290 ImGui::SameLine(0.0F, ImGui::GetStyle().ItemInnerSpacing.x);
291 std::string labelStr = label;
292 ImGui::TextUnformatted(labelStr.substr(0, labelStr.find(
'#')).c_str());
303 if (lla_pos(2) < -1000 || lla_pos(2) > 1e4 || std::isnan(elevation))
305 LOG_TRACE(
"{}: Not calculating tropospheric delay, due to altitude being invalid: {}m", nameId, lla_pos(2));
318 const std::array<std::reference_wrapper<const AtmosphereModels>,
COUNT> atmosphereModels = {
324 std::array<double, COUNT> pressure{};
325 std::array<double, COUNT> temperature{};
326 std::array<double, COUNT> waterVapor{};
331 auto epoch_temp =
InsTime(insTime) + std::chrono::duration<long double>(insTime.
leapGps2UTC());
332 double mjd =
static_cast<double>(epoch_temp.toMJD().mjd_day) +
static_cast<double>(epoch_temp.toMJD().mjd_frac);
338 || std::ranges::any_of(atmosphereModels,
339 [](
const auto& model) { return model.get().pressureModel == PressureModel::GPT2
340 || model.get().temperatureModel == TemperatureModel::GPT2
341 || model.get().waterVaporModel == WaterVaporModel::GPT2; }))
351 || std::ranges::any_of(atmosphereModels,
352 [](
const auto& model) { return model.get().pressureModel == PressureModel::GPT3
353 || model.get().temperatureModel == TemperatureModel::GPT3
354 || model.get().waterVaporModel == WaterVaporModel::GPT3; }))
364 for (
size_t i = 0; i <
COUNT; i++)
366 bool alreadyCalculated =
false;
367 for (
size_t j = 0; j < i; j++)
369 if (atmosphereModels.at(i).get().pressureModel == atmosphereModels.at(j).get().pressureModel)
371 pressure.at(i) = pressure.at(j);
372 alreadyCalculated =
true;
377 if (!alreadyCalculated)
381 pressure.at(i) = gpt2outputs.
p;
385 pressure.at(i) = gpt3outputs.
p;
389 pressure.at(i) =
calcTotalPressure(lla_pos(2), atmosphereModels.at(i).get().pressureModel);
395 alreadyCalculated =
false;
396 for (
size_t j = 0; j < i; j++)
398 if (atmosphereModels.at(i).get().temperatureModel == atmosphereModels.at(j).get().temperatureModel)
400 temperature.at(i) = temperature.at(j);
401 alreadyCalculated =
true;
406 if (!alreadyCalculated)
410 temperature.at(i) = gpt2outputs.
T;
414 temperature.at(i) = gpt3outputs.
T;
418 temperature.at(i) = atmosphereModels.at(i).get().temperatureModel.calcAbsoluteTemperature(lla_pos(2));
424 alreadyCalculated =
false;
425 for (
size_t j = 0; j < i; j++)
427 if (atmosphereModels.at(i).get().waterVaporModel == atmosphereModels.at(j).get().waterVaporModel)
429 waterVapor.at(i) = waterVapor.at(j);
430 alreadyCalculated =
true;
436 if (!alreadyCalculated)
440 waterVapor.at(i) = gpt2outputs.
e;
444 waterVapor.at(i) = gpt3outputs.
e;
456 switch (troposphereModels.
zhdModel.first)
469 switch (troposphereModels.
zwdModel.first)
475 zwd =
asknewet(waterVapor[ZWD], gpt2outputs.
Tm, gpt2outputs.
la);
478 zwd =
asknewet(waterVapor[ZWD], gpt3outputs.
Tm, gpt3outputs.
la);
485 double zhdMappingFactor = 1.0;
498 zhdMappingFactor =
vmf1h(gpt2outputs.
ah, mjd, lla_pos(0), lla_pos(2), M_PI / 2.0 - elevation);
501 zhdMappingFactor =
vmf1h(gpt3outputs.
ah, mjd, lla_pos(0), lla_pos(2), M_PI / 2.0 - elevation);
508 double zwdMappingFactor = 1.0;
521 zwdMappingFactor =
vmf1w(gpt2outputs.
aw, M_PI / 2.0 - elevation);
524 zwdMappingFactor =
vmf1w(gpt3outputs.
aw, M_PI / 2.0 - elevation);
534 .zhdMappingFactor = zhdMappingFactor,
535 .zwdMappingFactor = zwdMappingFactor };