54 abs_lines.erase(std::remove_if(abs_lines.begin(), abs_lines.end(),
55 [](
auto& x){return x.NumLines() == 0;}),
64 for (
Index i=0; i<n; i++) {
67 for (
Index j=i+1; j<n; j++) {
68 if (band.
Match(abs_lines[j]).first) {
69 for (
auto& line: abs_lines[j].lines) {
72 abs_lines[j].lines.clear();
84 for (
auto& abs_lines: abs_lines_per_species)
abs_linesFlatten(abs_lines, verbosity);
103 std::find_if(abs_lines.begin(), abs_lines.end(), [&](
const auto& li) {
104 return li.MatchWithExternal(sline, global_qid);
106 if (band not_eq abs_lines.end()) {
107 band->AppendSingleLine(sline.
line);
134 for (
auto& band : local_lines) {
135 if (
auto ptr = std::find_first_of(
140 [](
const auto& abs_band,
const auto& local_band) {
141 return abs_band.Match(local_band).first;
143 ptr == abs_lines.end())
144 abs_lines.push_back(band);
146 for (
auto& line : band.lines) ptr->lines.push_back(line);
175 if (qnstr ==
"DEFAULT_GLOBAL") {
178 if (qnstr ==
"DEFAULT_LOCAL") {
182 const Index N = count_items(qnstr);
184 for (
Index i = 0; i <
N; i++) {
185 nums[i] = toTypeOrThrow(items(qnstr, i));
193 for (
auto qn: local_state)
if (common_value_type(common_value_type(qn), ValueType::H) not_eq ValueType::H)
return false;
199 const String& artscat_file,
202 const String& globalquantumnumbers,
203 const String& localquantumnumbers,
204 const String& normalization_option,
205 const String& mirroring_option,
206 const String& population_option,
207 const String& lineshapetype_option,
208 const String& cutoff_option,
210 const Numeric& linemixinglimit_value,
228 shared_ptr<istream> ifs =
nullptr;
230 istream& is_xml = *ifs;
244 for (
Index i=0; i<num_arrays; i++) {
253 Index artscat_version;
255 if (version ==
"3") {
257 }
else if (version.substr(0, 8) !=
"ARTSCAT-") {
259 "The ARTS line file you are trying to read does not contain a valid version tag.\n"
260 "Probably it was created with an older version of ARTS that used different units.")
262 istringstream is(version.substr(8));
263 is >> artscat_version;
267 "Unknown ARTS line file version: ", version)
276 switch(artscat_version) {
291 if (sline.
line.
F0 < fmin)
continue;
292 if (sline.
line.
F0 > fmax) {go_on =
false;
continue;}
300 for(
auto qn: local_nums) {
309 local_bands.resize(0);
313 getline(is_xml, line);
336 const String& artscat_file,
339 const String& globalquantumnumbers,
340 const String& localquantumnumbers,
341 const String& normalization_option,
342 const String& mirroring_option,
343 const String& population_option,
344 const String& lineshapetype_option,
345 const String& cutoff_option,
347 const Numeric& linemixinglimit_value,
365 shared_ptr<istream> ifs =
nullptr;
367 istream& is_xml = *ifs;
382 Index artscat_version;
384 if (version ==
"3") {
386 }
else if (version.substr(0, 8) !=
"ARTSCAT-") {
388 "The ARTS line file you are trying to read does not contain a valid version tag.\n"
389 "Probably it was created with an older version of ARTS that used different units.")
391 istringstream is(version.substr(8));
392 is >> artscat_version;
396 "Unknown ARTS line file version: ", version)
406 switch(artscat_version) {
421 if (sline.
line.
F0 < fmin)
continue;
422 if (sline.
line.
F0 > fmax) {go_on =
false;
continue;}
430 for(
auto qn: local_nums) {
439 local_bands.resize(0);
443 getline(is_xml, line);
466 const String& globalquantumnumbers,
467 const String& localquantumnumbers,
468 const Index& ignore_missing,
469 const String& normalization_option,
470 const String& mirroring_option,
471 const String& population_option,
472 const String& lineshapetype_option,
473 const String& cutoff_option,
475 const Numeric& linemixinglimit_value,
481 const std::set<Species::Species> unique_species =
lbl_species(abs_species);
483 String tmpbasename = basename;
484 if (basename.length() && basename[basename.length() - 1] !=
'/') {
491 for (
auto& spec: unique_species) {
496 tmpbasename +
String(Species::toShortName(spec)) +
".xml",
499 globalquantumnumbers,
501 normalization_option,
504 lineshapetype_option,
507 linemixinglimit_value,
511 for (
auto& newband: more_abs_lines) {
513 for (
auto& band: abs_lines) {
514 if (band.Match(newband).first) {
515 for (
Index k=0; k<newband.NumLines(); k++) {
516 band.AppendSingleLine(newband.lines[k]);
522 abs_lines.push_back(newband);
525 }
catch (
const std::exception& e) {
527 "Errors in calls by *propmat_clearskyAddZeeman*:\n",
533 for (
auto& band: abs_lines)
534 band.sort_by_frequency();
539 const String& hitran_file,
542 const String& globalquantumnumbers,
543 const String& localquantumnumbers,
544 const String& hitran_type,
545 const String& normalization_option,
546 const String& mirroring_option,
547 const String& population_option,
548 const String& lineshapetype_option,
549 const String& cutoff_option,
551 const Numeric& linemixinglimit_value,
564 const Options::HitranType hitran_version = Options::toHitranTypeOrThrow(hitran_type);
575 switch (hitran_version) {
576 case Options::HitranType::Post2004:
579 case Options::HitranType::Pre2004:
582 case Options::HitranType::Online:
586 ARTS_ASSERT(
false,
"The HitranType enum class has to be fully updated!\n");
592 ARTS_USER_ERROR(
"Cannot read line ", nelem(abs_lines) + nelem(local_bands) + 1);
606 for(
auto qn: local_nums) {
616 local_bands.resize(0);
632 const String& lblrtm_file,
635 const String& globalquantumnumbers,
636 const String& localquantumnumbers,
637 const String& normalization_option,
638 const String& mirroring_option,
639 const String& population_option,
640 const String& lineshapetype_option,
641 const String& cutoff_option,
643 const Numeric& linemixinglimit_value,
659 std::vector<Absorption::SingleLineExternal>
v(0);
668 }
else if (
v.back().line.F0 < fmin) {
670 }
else if (
v.back().line.F0 > fmax) {
681 abs_lines.reserve(x.size());
683 abs_lines.push_back(x.back());
684 abs_lines.back().sort_by_frequency();
701 const String& globalquantumnumbers,
702 const String& localquantumnumbers,
703 const String& normalization_option,
704 const String& mirroring_option,
705 const String& population_option,
706 const String& lineshapetype_option,
707 const String& cutoff_option,
709 const Numeric& linemixinglimit_value,
725 std::vector<Absorption::SingleLineExternal>
v(0);
734 }
else if (
v.back().line.F0 < fmin) {
736 }
else if (
v.back().line.F0 > fmax) {
747 abs_lines.reserve(x.size());
749 abs_lines.push_back(x.back());
750 abs_lines.back().sort_by_frequency();
772 String true_basename = basename;
773 if (not(true_basename.back() ==
'.' or true_basename.back() ==
'/'))
774 true_basename +=
'.';
778 for (
auto& band: abs_lines) {
779 auto specname = band.SpeciesName();
782 for (
auto& thisname: specs) {
784 if (thisname == specname) any =
true;
788 specs.push_back(specname);
802 auto& name = specs[i];
803 auto& lines = alps[i];
806 true_basename + name +
".xml",
807 0,
"",
"",
"", verbosity);
818 for (
auto& lines: abs_lines_per_species) {
819 for (
auto& band: lines) {
820 abs_lines.push_back(band);
836 std::size_t bands_found{0};
838 String tmpbasename = basename;
839 if (basename.length() && basename[basename.length() - 1] !=
'/') {
846 String filename = tmpbasename + ir.FullName() +
".xml";
850 for (
auto& band: speclines) {
851 abs_lines.push_back(band);
858 "Cannot find any bands in the directory you are reading");
859 out3 <<
"Found " << bands_found <<
" bands\n";
868 abs_lines_per_species.resize(0);
873 const std::set<Species::Species> unique_species =
lbl_species(abs_species);
875 String tmpbasename = basename;
876 if (basename.length() && basename[basename.length() - 1] !=
'/') {
885 std::atomic_bool error{
false};
887 #pragma omp parallel for schedule(dynamic) if (!arts_omp_in_parallel())
888 for (std::size_t ispec=0; ispec<unique_species.size(); ispec++) {
891 const auto& spec = *std::next(unique_species.cbegin(), ispec);
894 if (not error.load()) {
896 for (
const auto& isot: isots) {
897 String filename = tmpbasename + isot.FullName() +
".xml";
901 for (
auto& band: speclines) {
902 par_abs_lines[i].push_back(std::move(band));
906 }
catch (std::exception& e) {
910 errors.push_back(
var_string(
"\n\nError in thread ", i,
" for species ", spec,
":\n", e.what(),
"\n\n"));
917 const Index bands_found = nelem(par_abs_lines);
919 "Cannot find any bands in the directory you are reading");
920 out3 <<
"Found " << bands_found <<
" bands\n";
923 abs_lines.reserve(bands_found);
924 for (
auto& lines: par_abs_lines) {
925 for (
auto& band: lines) {
926 abs_lines.push_back(std::move(band));
940 for (
auto& rlines: replacing_lines) {
941 Index number_of_matching_bands = 0;
942 for (
auto& tlines: abs_lines) {
943 if (tlines.Match(rlines).first) {
944 number_of_matching_bands++;
945 for (
auto& rline: rlines.lines) {
946 Index number_of_matching_single_lines = 0;
947 for (
auto& tline: tlines.lines) {
948 if (tline.localquanta.val.check_match(rline.localquanta.val)) {
949 number_of_matching_single_lines++;
955 "Error: Did not match to a single single line. "
956 "This means the input data has not been understood. "
957 "This function needs exactly one match.");
959 tlines.sort_by_frequency();
964 "Error: Did not match to a single set of absorption lines. "
965 "This means the input data has not been understood. "
966 "This function needs exactly one match.");
974 std::vector<AbsorptionLines> addedlines(0);
976 for (
auto& alines: appending_lines) {
977 Index number_of_matching_bands = 0;
978 for (
auto& tlines: abs_lines) {
979 if (tlines.Match(alines).first) {
980 number_of_matching_bands++;
981 for (
auto& aline: alines.lines) {
982 Index number_of_matching_single_lines = 0;
983 for (
auto& tline: tlines.lines) {
984 if (tline.localquanta.val.check_match(aline.localquanta.val)) {
985 number_of_matching_single_lines++;
989 "Error: Did match to a single single line. "
990 "This means the input data has not been understood. "
991 "This function needs exactly zero matches.");
992 tlines.AppendSingleLine(aline);
994 tlines.sort_by_frequency();
998 if (number_of_matching_bands == 0) addedlines.push_back(alines);
1000 "Error: Did not match to a single set of absorption lines. "
1001 "This means the input data has not been understood. "
1002 "This function needs exactly one or zero matches.");
1005 for (
auto& lines: addedlines) {
1006 abs_lines.push_back(std::move(lines));
1009 for (
auto& band: appending_lines)
1010 abs_lines.push_back(band);
1017 for (
auto& lines: abs_lines) {
1018 std::vector<Index> hits;
1019 for (
Index i=0; i<lines.NumLines(); i++) {
1020 if (lower and lines.lines[i].F0 < f0)
1022 else if (not lower and lines.lines[i].F0 > f0)
1027 std::sort(hits.begin(), hits.end());
1028 while(not hits.empty()) {
1029 lines.RemoveLine(hits.back());
1038 for (
auto& dlines: deleting_lines) {
1039 for (
auto& tlines: abs_lines) {
1040 std::vector<Index> hits(0);
1042 if (tlines.Match(dlines).first) {
1043 for (
auto& dline: dlines.lines) {
1044 for (
Index i=0; i<tlines.NumLines(); i++) {
1045 if (tlines.lines[i].localquanta.val.check_match(dline.localquanta.val)) {
1052 std::sort(hits.begin(), hits.end());
1053 auto n = hits.size();
1054 hits.erase(std::unique(hits.begin(), hits.end()), hits.end());
1056 "Removing the same line more than once is not accepted");
1059 while(not hits.empty()) {
1060 tlines.RemoveLine(hits.back());
1071 for (
auto& band: abs_lines) {
1072 std::array<bool, LineShape::nVars> var_is_empty;
1075 for (
Index ispec=0; ispec<band.NumBroadeners(); ispec++) {
1076 var_is_empty.fill(
true);
1079 for (
Index iline=0; iline<band.NumLines(); iline++) {
1082 var_is_empty[ivar] =
false;
1088 for (
Index iline=0; iline<band.NumLines(); iline++) {
1090 if (var_is_empty[ivar]) {
1091 band.lines[iline].lineshape.Data()[ispec].Data()[ivar].type = LineShape::TemperatureModel::None;
1101 for (
auto& band: abs_lines) {
1103 while (lt not_eq Quantum::Number::StateMatchType::Full and band.NumLines()) {
1112 for (
Index i=0; i<nb; i++) {
1113 for (
Index j=i+1; j<nb; j++) {
1116 Quantum::Number::StateMatchType::Full,
1117 "Not unique, these bands match:\n", lines[i],
"\nand\n", lines[j])
1125 for (
auto& replacement: replacing_bands) {
1126 struct {
Index band;} pos{-1};
1129 auto& band = abs_lines[i];
1132 Quantum::Number::StateMatchType::Full) {
1133 ARTS_USER_ERROR_IF (pos.band not_eq -1,
"Duplicate band matches for replacement line:\n",
1134 replacement,
"\nThese are for band indexes ", pos.band,
" and ", i)
1141 "There is no match for replacement band:\n", replacement,
1142 "\nYou need to append the entire band")
1143 abs_lines[pos.band] = replacement;
1152 for (
auto& replacement: replacing_lines) {
1153 const Index nl=replacement.NumLines();
1157 for (
Index i=0; i<nb; i++) {
1158 auto& band = abs_lines[i];
1161 Quantum::Number::StateMatchType::Full) {
1162 ARTS_USER_ERROR_IF (pos.band not_eq -1,
"Duplicate band matches for replacement line:\n",
1163 replacement,
"\nThese are for band indexes ", pos.band,
" and ", i,
'\n',
1164 "ID ", i,
": ", band.quantumidentity,
'\n',
1165 "ID ", pos.band,
": ", abs_lines[pos.band].quantumidentity,
'\n',
1166 "ID target: ", replacement.quantumidentity,
'\n')
1170 for (
Index k=0; k<band.NumLines(); k++) {
1171 for (
Index j=0; j<nl; j++) {
1172 if (replacement.lines[j].localquanta.val.check_match(band.lines[k].localquanta.val)) {
1174 ARTS_USER_ERROR_IF(pos.lines[j] not_eq -1 or std::any_of(pos.lines.begin(), pos.lines.end(), [k](
auto&
a){return a == k;}),
1175 "Found multiple matches of lines in:\n", replacement,
"\n\nin mathcing band:\n", band)
1184 ARTS_USER_ERROR_IF(pos.band == -1 or std::any_of(pos.lines.begin(), pos.lines.end(), [](
auto&
a){return a == -1;}),
1185 "There is no match for replacement line:\n", replacement,
1186 "\nYou need to append the entire band")
1189 auto& band = abs_lines[pos.band];
1190 if (
const auto [match, nullable] = band.Match(replacement); nullable) {
1191 for (
Index j=0; j<nl; j++) band.lines[pos.lines[j]] = replacement.lines[j];
1192 band.MakeLineShapeModelCommon();
1195 std::sort(pos.lines.begin(), pos.lines.end(), std::greater<>());
1196 for (
auto& k: pos.lines) band.RemoveLine(k);
1197 abs_lines.push_back(replacement);
1215 auto t = Absorption::toCutoffTypeOrThrow(type);
1216 for (
auto& lines : abs_lines) {
1218 lines.cutofffreq = x;
1228 for (
auto& abs_lines : abs_lines_per_species)
1238 auto t = Absorption::toCutoffTypeOrThrow(type);
1239 for (
auto& band : abs_lines) {
1241 if (lt == Quantum::Number::StateMatchType::Full) {
1243 band.cutofffreq = x;
1255 for (
auto& lines : abs_lines_per_species) {
1266 const String& species_tag,
1271 for (
Index ispec = 0; ispec < abs_species.
nelem(); ispec++) {
1272 if (std::equal(abs_species[ispec].begin(),
1273 abs_species[ispec].end(),
1274 target_species[0].begin())) {
1288 auto t = Absorption::toMirroringTypeOrThrow(type);
1289 for (
auto& lines : abs_lines) lines.mirroring = t;
1297 for (
auto& abs_lines : abs_lines_per_species)
1306 auto t = Absorption::toMirroringTypeOrThrow(type);
1307 for (
auto& band : abs_lines) {
1309 if (lt == Quantum::Number::StateMatchType::Full) {
1321 for (
auto& abs_lines : abs_lines_per_species)
1330 const String& species_tag,
1335 for (
Index ispec = 0; ispec < abs_species.
nelem(); ispec++) {
1336 if (std::equal(abs_species[ispec].begin(),
1337 abs_species[ispec].end(),
1338 target_species[0].begin())) {
1349 band.mirroring = Absorption::MirroringType::Manual;
1353 std::find_if(abs_lines_copy.cbegin(),
1354 abs_lines_copy.cend(),
1356 return band.Match(li).first;
1357 }) not_eq abs_lines_copy.cend(),
1358 "Dual bands with same setup is not allowed for mirroring of band:\n",
1362 for (
auto& line : band.lines) {
1366 abs_lines.emplace_back(std::move(band));
1374 for (
auto& abs_lines : abs_lines_per_species)
1385 "Mismatch abs_species and abs_lines_per_species sizes [",
1388 abs_lines_per_species.size(),
1391 if (
auto ind = std::distance(
1392 abs_species.cbegin(),
1393 std::find(abs_species.cbegin(), abs_species.cend(), species));
1394 ind not_eq abs_species.
nelem()) {
1399 "\nIn abs_species: [",
1413 auto t = Absorption::toPopulationTypeOrThrow(type);
1414 for (
auto& lines : abs_lines) lines.population = t;
1422 for (
auto& abs_lines : abs_lines_per_species)
1431 auto t = Absorption::toPopulationTypeOrThrow(type);
1432 for (
auto& lines : abs_lines) {
1434 if (lt == Quantum::Number::StateMatchType::Full) {
1435 lines.population = t;
1446 for (
auto& abs_lines : abs_lines_per_species)
1455 const String& species_tag,
1460 for (
Index ispec = 0; ispec < abs_species.
nelem(); ispec++) {
1461 if (std::equal(abs_species[ispec].begin(),
1462 abs_species[ispec].end(),
1463 target_species[0].begin())) {
1477 auto t = Absorption::toNormalizationTypeOrThrow(type);
1478 for (
auto& lines : abs_lines) lines.normalization = t;
1486 for (
auto& abs_lines : abs_lines_per_species)
1495 auto t = Absorption::toNormalizationTypeOrThrow(type);
1496 for (
auto& lines : abs_lines) {
1498 if (lt == Quantum::Number::StateMatchType::Full) {
1499 lines.normalization = t;
1510 for (
auto& abs_lines : abs_lines_per_species)
1519 const String& species_tag,
1524 for (
Index ispec = 0; ispec < abs_species.
nelem(); ispec++) {
1525 if (std::equal(abs_species[ispec].begin(),
1526 abs_species[ispec].end(),
1527 target_species[0].begin())) {
1541 auto t = LineShape::toType(type);
1543 for (
auto& lines : abs_lines) lines.lineshapetype = t;
1551 for (
auto& abs_lines : abs_lines_per_species)
1560 auto t = LineShape::toTypeOrThrow(type);
1561 for (
auto& lines : abs_lines) {
1563 if (lt == Quantum::Number::StateMatchType::Full) {
1564 lines.lineshapetype = t;
1575 for (
auto& abs_lines : abs_lines_per_species)
1584 const String& species_tag,
1589 for (
Index ispec = 0; ispec < abs_species.
nelem(); ispec++) {
1590 if (std::equal(abs_species[ispec].begin(),
1591 abs_species[ispec].end(),
1592 target_species[0].begin())) {
1606 for (
auto& lines : abs_lines) lines.linemixinglimit = x;
1614 for (
auto& abs_lines : abs_lines_per_species)
1623 for (
auto& lines : abs_lines) {
1625 if (lt == Quantum::Number::StateMatchType::Full) {
1626 lines.linemixinglimit = x;
1637 for (
auto& abs_lines : abs_lines_per_species)
1646 const String& species_tag,
1651 for (
Index ispec = 0; ispec < abs_species.
nelem(); ispec++) {
1652 if (std::equal(abs_species[ispec].begin(),
1653 abs_species[ispec].end(),
1654 target_species[0].begin())) {
1668 for (
auto& lines : abs_lines) lines.T0 = x;
1676 for (
auto& abs_lines : abs_lines_per_species)
abs_linesT0(abs_lines, x,
v);
1684 for (
auto& lines : abs_lines) {
1686 if (lt == Quantum::Number::StateMatchType::Full) {
1698 for (
auto& abs_lines : abs_lines_per_species)
1707 const String& species_tag,
1712 for (
Index ispec = 0; ispec < abs_species.
nelem(); ispec++) {
1713 if (std::equal(abs_species[ispec].begin(),
1714 abs_species[ispec].end(),
1715 target_species[0].begin())) {
1716 abs_linesT0(abs_lines_per_species[ispec], x, verbosity);
1728 const String& parameter_name,
1730 const Index& relative,
1733 Index parameter_switch = -1;
1736 "parameter_name is empty.\n");
1738 if (parameter_name ==
"Central Frequency" or
1739 parameter_name ==
"Line Center")
1740 parameter_switch = 0;
1741 else if (parameter_name ==
"Line Strength")
1742 parameter_switch = 1;
1743 else if (parameter_name ==
"Lower State Energy")
1744 parameter_switch = 4;
1745 else if (parameter_name ==
"Einstein Coefficient")
1746 parameter_switch = 5;
1747 else if (parameter_name ==
"Lower Statistical Weight")
1748 parameter_switch = 6;
1749 else if (parameter_name ==
"Upper Statistical Weight")
1750 parameter_switch = 7;
1751 else if (parameter_name ==
"Lower Zeeman Coefficient")
1752 parameter_switch = 8;
1753 else if (parameter_name ==
"Upper Zeeman Coefficient")
1754 parameter_switch = 9;
1756 for (
auto& band: abs_lines) {
1757 for (
Index k=0; k<band.NumLines(); k++) {
1759 if (lt == Quantum::Number::StateMatchType::Full) {
1760 switch (parameter_switch) {
1763 band.lines[k].F0 += change;
1765 band.lines[k].F0 *= 1.0e0 + change;
1769 band.lines[k].I0 += change;
1771 band.lines[k].I0 *= 1.0e0 + change;
1775 band.lines[k].E0 += change;
1777 band.lines[k].E0 *= 1.0e0 + change;
1781 band.lines[k].A += change;
1783 band.lines[k].A *= 1.0e0 + change;
1787 band.lines[k].glow += change;
1789 band.lines[k].glow *= 1.0e0 + change;
1793 band.lines[k].gupp += change;
1795 band.lines[k].gupp *= 1.0e0 + change;
1799 band.lines[k].zeeman.gl() += change;
1801 band.lines[k].zeeman.gl() *= 1.0e0 + change;
1805 band.lines[k].zeeman.gu() += change;
1807 band.lines[k].zeeman.gu() *= 1.0e0 + change;
1811 "Usupported paramter_name\n", parameter_name,
1812 "\nSee method description for supported parameter names.\n")
1823 const String& parameter_name,
1825 const Index& relative,
1828 for (
auto& lines: abs_lines_per_species)
1837 const String& parameter_name,
1839 const Index& relative,
1840 const String& species_tag,
1846 for (
Index ispec=0; ispec<abs_species.
nelem(); ispec++) {
1847 if (std::equal(abs_species[ispec].begin(), abs_species[ispec].end(), target_species[0].begin())) {
1856 const String& parameter_name,
1859 Index parameter_switch = -1;
1863 if (parameter_name ==
"Central Frequency" or parameter_name ==
"Line Center")
1864 parameter_switch = 0;
1865 else if (parameter_name ==
"Line Strength")
1866 parameter_switch = 1;
1867 else if (parameter_name ==
"Lower State Energy")
1868 parameter_switch = 4;
1869 else if (parameter_name ==
"Einstein Coefficient")
1870 parameter_switch = 5;
1871 else if (parameter_name ==
"Lower Statistical Weight")
1872 parameter_switch = 6;
1873 else if (parameter_name ==
"Upper Statistical Weight")
1874 parameter_switch = 7;
1875 else if (parameter_name ==
"Lower Zeeman Coefficient")
1876 parameter_switch = 8;
1877 else if (parameter_name ==
"Upper Zeeman Coefficient")
1878 parameter_switch = 9;
1880 for (
auto& band : abs_lines) {
1881 for (
Index k = 0; k < band.NumLines(); k++) {
1883 QI, band.lines[k].localquanta, band.quantumidentity);
1884 if (lt == Quantum::Number::StateMatchType::Full) {
1885 switch (parameter_switch) {
1887 band.lines[k].F0 = x;
1890 band.lines[k].I0 = x;
1893 band.lines[k].E0 = x;
1896 band.lines[k].A = x;
1899 band.lines[k].glow = x;
1902 band.lines[k].gupp = x;
1905 band.lines[k].zeeman.gl() = x;
1908 band.lines[k].zeeman.gu() = x;
1912 "Usupported paramter_name\n",
1914 "\nSee method description for supported parameter names.\n")
1926 const String& parameter_name,
1929 for (
auto& lines : abs_lines_per_species)
1931 lines, QI, parameter_name, change, verbosity);
1939 const String& parameter_name,
1941 const String& species_tag,
1946 for (
Index ispec = 0; ispec < abs_species.
nelem(); ispec++) {
1947 if (std::equal(abs_species[ispec].begin(),
1948 abs_species[ispec].end(),
1949 target_species[0].begin())) {
1951 abs_lines_per_species[ispec], QI, parameter_name, change, verbosity);
1962 const String& temperaturemodel,
1963 const Vector& new_values,
1971 const Species::Species spec = do_self ? Species::Species::FINAL
1972 : do_bath ? Species::Species::Bath
1975 const LineShape::Variable var = LineShape::toVariableOrThrow(parameter);
1978 "Mismatch between input and expected number of variables\n"
1981 " long but expects: ",
1986 newdata.
type = LineShape::toTemperatureModelOrThrow(temperaturemodel);
1987 newdata.
X0 = new_values[0];
1988 newdata.
X1 = new_values[1];
1989 newdata.
X2 = new_values[2];
1990 newdata.
X3 = new_values[3];
1992 for (
auto& band : abs_lines) {
1993 for (
Index k = 0; k < band.NumLines(); k++) {
1995 QI, band.lines[k].localquanta, band.quantumidentity);
1996 if (lt == Quantum::Number::StateMatchType::Full) {
1997 if (do_self and band.selfbroadening) {
1998 out3 <<
"Changing self\n";
1999 band.lines[k].lineshape.Data().front().Data()[
Index(var)] = newdata;
2000 }
else if (do_bath and band.bathbroadening) {
2001 out3 <<
"Changing bath\n";
2002 band.lines[k].lineshape.Data().back().Data()[
Index(var)] = newdata;
2004 for (
Index i = band.selfbroadening;
2005 i < band.broadeningspecies.nelem() - band.bathbroadening;
2007 if (spec == band.broadeningspecies[i]) {
2008 out3 <<
"Changing species: " << Species::toShortName(spec)
2010 band.lines[k].lineshape.Data()[i].Data()[
Index(var)] = newdata;
2025 const String& temperaturemodel,
2026 const Vector& new_values,
2028 for (
auto& lines : abs_lines_per_species)
2030 lines, QI, parameter, species, temperaturemodel, new_values, verbosity);
2040 const String& parameter_name,
2042 const Index& relative,
2045 Index parameter_switch = -1;
2048 "parameter_name is empty.\n");
2049 if (parameter_name ==
"Statistical Weight")
2050 parameter_switch = 1;
2051 else if (parameter_name ==
"Zeeman Coefficient")
2052 parameter_switch = 2;
2054 for (
auto& band: abs_lines) {
2055 for (
Index k=0; k<band.NumLines(); k++) {
2057 if (lt == Quantum::Number::StateMatchType::Level and lt.low) {
2058 switch (parameter_switch) {
2061 band.lines[k].glow += change;
2063 band.lines[k].glow *= 1.0e0 + change;
2067 band.lines[k].zeeman.gl() += change;
2069 band.lines[k].zeeman.gl() *= 1.0e0 + change;
2073 "Usupported paramter_name\n", parameter_name,
2074 "\nSee method description for supported parameter names.\n")
2079 if (lt == Quantum::Number::StateMatchType::Level and lt.upp) {
2080 switch (parameter_switch) {
2083 band.lines[k].gupp += change;
2085 band.lines[k].gupp *= 1.0e0 + change;
2089 band.lines[k].zeeman.gu() += change;
2091 band.lines[k].zeeman.gu() *= 1.0e0 + change;
2095 "Usupported paramter_name\n", parameter_name,
2096 "\nSee method description for supported parameter names.\n")
2107 const String& parameter_name,
2109 const Index& relative,
2112 for (
auto& lines: abs_lines_per_species)
2119 const String& parameter_name,
2121 const Index& relative,
2125 "Mismatch between QID and change input lengths not allowed");
2134 const String& parameter_name,
2136 const Index& relative,
2140 "Mismatch between QID and change input lengths not allowed");
2143 for (
auto& lines: abs_lines_per_species)
2150 const String& parameter_name,
2153 Index parameter_switch = -1;
2156 if (parameter_name ==
"Statistical Weight")
2157 parameter_switch = 1;
2158 else if (parameter_name ==
"Zeeman Coefficient")
2159 parameter_switch = 2;
2161 for (
auto& band : abs_lines) {
2162 for (
Index k = 0; k < band.NumLines(); k++) {
2164 QI, band.lines[k].localquanta, band.quantumidentity);
2165 if (lt == Quantum::Number::StateMatchType::Level and lt.low) {
2166 switch (parameter_switch) {
2168 band.lines[k].glow = x;
2171 band.lines[k].zeeman.gl() = x;
2175 "Usupported paramter_name\n",
2177 "\nSee method description for supported parameter names.\n")
2182 if (lt == Quantum::Number::StateMatchType::Level and lt.upp) {
2183 switch (parameter_switch) {
2185 band.lines[k].gupp = x;
2188 band.lines[k].zeeman.gu() = x;
2192 "Usupported paramter_name\n",
2194 "\nSee method description for supported parameter names.\n")
2206 const String& parameter_name,
2209 for (
auto& lines : abs_lines_per_species)
2211 lines, QI, parameter_name, change, verbosity);
2217 const String& parameter_name,
2222 "Mismatch between QID and change input lengths not allowed");
2226 abs_lines, QID[iq], parameter_name, change[iq], verbosity);
2233 const String& parameter_name,
2238 "Mismatch between QID and change input lengths not allowed");
2241 for (
auto& lines : abs_lines_per_species)
2243 lines, QID[iq], parameter_name, change[iq], verbosity);
2264 const Absorption::PopulationType poptyp =
2266 : Absorption::PopulationType::VibTemps;
2268 for (
auto& spec_lines : abs_lines_per_species) {
2269 for (
auto& band : spec_lines) {
2270 Index low = 0, upp = 0;
2271 for (
auto&
id : nlte_field.
levels) {
2272 for (
auto& line : band.lines) {
2274 poptyp == Absorption::PopulationType::NLTE
2276 id, line.localquanta, band.quantumidentity)
2284 not(low == 0 or low == band.NumLines()) or
2285 not(upp == 0 or upp == band.NumLines()),
2286 "The band with metadata:\n",
2288 "\n\nwith lines:\n",
2290 "\n\nThe number of levels don't add upp correctly.\n There are ",
2292 " lines but there are ",
2294 " lower level matches and ",
2296 " upper level matches.")
2298 if (upp or low) band.population = poptyp;
2324 for (
auto& band : abs_lines) {
2325 for (
Index k = band.NumLines() - 1; k >= 0; k--) {
2326 const Numeric fcut_upp = band.CutoffFreq(k);
2327 const Numeric fcut_low = band.CutoffFreqMinus(k);
2329 if (fmax < fcut_low or fmin > fcut_upp) {
2341 for (
auto& lines : abs_lines_per_species) {
2350 for (
Index i = 0; i < abs_lines.
nelem(); i++) {
2352 if (lt == Quantum::Number::StateMatchType::Full) {
2353 abs_lines.erase(abs_lines.begin() + i);
2365 T s, T e,
typename std::vector<T>::size_type count)
noexcept {
2366 std::vector<T> ls(count);
2368 if (count == 0)
return ls;
2370 ls.front() = (e + s) / 2;
2373 const T step = (e - s) / T(count - 1);
2376 for (
typename std::vector<T>::size_type i = 1; i < count - 1; ++i)
2377 ls[i] = s + step * T(i);
2387 const Index& num_freqs,
2389 const Index n = nelem(abs_lines_per_species);
2392 "The lower frequency delta has to be smaller "
2393 "than the upper frequency delta");
2396 "No lines found. Error? Use *VectorSet* "
2397 "to resize *f_grid*");
2399 std::vector<Numeric> fout(0);
2400 for (
auto& lines : abs_lines_per_species) {
2401 for (
auto& band : lines) {
2402 for (
Index k = 0; k < band.NumLines(); k++) {
2403 if (num_freqs > 1) {
2405 linspace<Numeric>(band.lines[k].F0 + delta_f_low,
2406 band.lines[k].F0 + delta_f_upp,
2407 std::vector<Numeric>::size_type(num_freqs));
2408 for (
auto& f : ftmp) {
2409 if (f > 0) fout.push_back(f);
2412 fout.push_back(band.lines[k].F0);
2418 std::sort(fout.begin(), fout.end());
2419 fout.erase(std::unique(fout.begin(), fout.end()), fout.end());
2420 f_grid.
resize(fout.size());
2421 for (
Index i = 0; i < f_grid.
nelem(); i++) f_grid[i] = fout[i];
2430 const Numeric lower_frequency,
2431 const Numeric upper_frequency,
2432 const Numeric lower_intensity,
2434 const Index flip_flims,
2436 const bool care_about_species = species.
nelem();
2438 for (
auto& band : abs_lines) {
2439 if (care_about_species and
2440 species[0].Isotopologue() not_eq band.Isotopologue())
2443 auto& lines = band.lines;
2446 std::vector<std::size_t> rem;
2448 for (std::size_t i=lines.size()-1; i<lines.size(); i--) {
2449 auto& line = lines[i];
2450 if ((line.F0 >= lower_frequency and
2451 line.F0 <= upper_frequency) or
2452 line.I0 < lower_intensity)
2456 for (std::size_t i = lines.size() - 1; i < lines.size(); i--) {
2457 auto& line = lines[i];
2458 if (line.F0 < lower_frequency or line.F0 > upper_frequency or
2459 line.I0 < lower_intensity)
2463 for (
auto i : rem) band.RemoveLine(i);
2466 "Not allowed to combine GINs flip_flims and safe.")
2467 const bool all_low = std::all_of(
2468 lines.begin(), lines.end(), [lower_frequency](
auto& line) {
2469 return line.F0 < lower_frequency;
2471 const bool all_upp = std::all_of(
2472 lines.begin(), lines.end(), [upper_frequency](
auto& line) {
2473 return line.F0 > upper_frequency;
2475 const bool low_int = std::all_of(
2476 lines.begin(), lines.end(), [lower_intensity](
auto& line) {
2477 return line.I0 < lower_intensity;
2479 if (all_low or all_upp or low_int) lines.resize(0);
2488 const Numeric& lower_frequency,
2489 const Numeric& upper_frequency,
2490 const Numeric& lower_intensity,
2492 const Index& flip_flims,
2506 const Numeric& lower_frequency,
2507 const Numeric& upper_frequency,
2508 const Numeric& lower_intensity,
2510 const Index& flip_flims,
2512 for (
auto& abs_lines : abs_lines_per_species)
2524 const Numeric& lower_frequency,
2525 const Numeric& upper_frequency,
2526 const Numeric& lower_intensity,
2528 const Index& flip_flims,
2531 species.
nelem() not_eq 1,
"Must have a single species, got: ", species)
2533 "Cannot give joker species, got: ",
2549 const Numeric& lower_frequency,
2550 const Numeric& upper_frequency,
2551 const Numeric& lower_intensity,
2553 const Index& flip_flims,
2555 for (
auto& abs_lines : abs_lines_per_species)
2569 const auto opt = Options::toSortingOptionOrThrow(
option);
2574 case Options::SortingOption::ByFrequency:
2575 for (
auto& band : abs_lines) band.sort_by_frequency();
2576 std::sort(abs_lines.begin(), abs_lines.end(), [](
auto&
a,
auto&
b) {
2577 return a.lines[0].F0 <= b.lines[0].F0;
2580 case Options::SortingOption::ByEinstein:
2581 for (
auto& band : abs_lines) band.sort_by_einstein();
2582 std::sort(abs_lines.begin(), abs_lines.end(), [](
auto&
a,
auto&
b) {
2583 return a.lines[0].A <= b.lines[0].A;
2586 case Options::SortingOption::FINAL: {
2593 for (
auto& band : abs_lines) {
2594 for (
auto& line : band.lines) {
2595 for (
auto& slsm : line.lineshape) {
2608 for (
auto& abs_lines : abs_lines_per_species) {
Contains the absorption namespace.
Array< ArrayOfAbsorptionLines > ArrayOfArrayOfAbsorptionLines
This file contains the definition of Array.
Array< Index > ArrayOfIndex
An array of Index.
base max(const Array< base > &x)
Max function.
base min(const Array< base > &x)
Min function.
int arts_omp_get_max_threads()
Wrapper for omp_get_max_threads.
int arts_omp_get_thread_num()
Wrapper for omp_get_thread_num.
Header file for helper functions for OpenMP.
Stuff related to time in ARTS.
This can be used to make arrays out of anything.
Index nelem() const ARTS_NOEXCEPT
void get_attribute_value(const String &aname, SpeciesTag &value)
Returns value of attribute as type SpeciesTag.
bool empty() const noexcept
Index nelem() const noexcept
Returns the number of elements.
bool empty() const noexcept
Returns true if variable size is zero.
void set(Value v)
Sets the value if it exists or adds it otherwise.
bool has(Types... ts) const ARTS_NOEXCEPT
Returns whether all the Types are part of the list, the types must be sorted.
void resize(Index n)
Resize function.
void check_name(const String &expected_name)
Check tag name.
void read_from_stream(istream &is)
Reads next XML tag.
Helper macros for debugging.
#define ARTS_ASSERT(condition,...)
#define ARTS_USER_ERROR(...)
std::string var_string(Args &&... args)
#define ARTS_USER_ERROR_IF(condition,...)
constexpr void check_enum_error(EnumType type, Messages... args)
Checks if the enum class type is good and otherwise throws an error message composed by variadic inpu...
bool find_xml_file_existence(String &filename)
As find_xml_file but does not throw in the main body.
void open_input_file(ifstream &file, const std::string_view name)
Open a file for reading.
This file contains basic functions to handle ASCII files.
Contains the line shape namespace.
void abs_lines_per_speciesCreateFromLines(ArrayOfArrayOfAbsorptionLines &abs_lines_per_species, const ArrayOfAbsorptionLines &abs_lines, const ArrayOfArrayOfSpeciesTag &abs_species, const Verbosity &)
WORKSPACE METHOD: abs_lines_per_speciesCreateFromLines.
void abs_speciesSet(ArrayOfArrayOfSpeciesTag &abs_species, Index &propmat_clearsky_agenda_checked, const ArrayOfString &names, const Verbosity &verbosity)
WORKSPACE METHOD: abs_speciesSet.
QuantumIdentifier global_quantumidentifier(const Array< QuantumNumberType > &qns, const QuantumIdentifier &qid)
Selects the global quantum numbers.
void abs_linesCutoff(ArrayOfAbsorptionLines &abs_lines, const String &type, const Numeric &x, const Verbosity &)
WORKSPACE METHOD: abs_linesCutoff.
void abs_lines_per_speciesManualMirroringSpecies(ArrayOfArrayOfAbsorptionLines &abs_lines_per_species, const ArrayOfArrayOfSpeciesTag &abs_species, const ArrayOfSpeciesTag &species, const Verbosity &verbosity)
WORKSPACE METHOD: abs_lines_per_speciesManualMirroringSpecies.
void abs_lines_per_speciesBaseParameterMatchingLines(ArrayOfArrayOfAbsorptionLines &abs_lines_per_species, const QuantumIdentifier &QI, const String ¶meter_name, const Numeric &change, const Verbosity &verbosity)
void abs_lines_per_speciesChangeBaseParameterForMatchingLevel(ArrayOfArrayOfAbsorptionLines &abs_lines_per_species, const QuantumIdentifier &QI, const String ¶meter_name, const Numeric &change, const Index &relative, const Verbosity &verbosity)
WORKSPACE METHOD: abs_lines_per_speciesChangeBaseParameterForMatchingLevel.
void abs_lines_per_speciesPopulation(ArrayOfArrayOfAbsorptionLines &abs_lines_per_species, const String &type, const Verbosity &v)
WORKSPACE METHOD: abs_lines_per_speciesPopulation.
void abs_linesPopulationMatch(ArrayOfAbsorptionLines &abs_lines, const String &type, const QuantumIdentifier &QI, const Verbosity &)
WORKSPACE METHOD: abs_linesPopulationMatch.
void abs_linesDeleteBadF0(ArrayOfAbsorptionLines &abs_lines, const Numeric &f0, const Index &lower, const Verbosity &)
WORKSPACE METHOD: abs_linesDeleteBadF0.
void abs_linesNormalization(ArrayOfAbsorptionLines &abs_lines, const String &type, const Verbosity &)
WORKSPACE METHOD: abs_linesNormalization.
void abs_linesT0(ArrayOfAbsorptionLines &abs_lines, const Numeric &x, const Verbosity &)
WORKSPACE METHOD: abs_linesT0.
void abs_linesFlatten(ArrayOfAbsorptionLines &abs_lines, const Verbosity &verbosity)
WORKSPACE METHOD: abs_linesFlatten.
void abs_linesNormalizationMatch(ArrayOfAbsorptionLines &abs_lines, const String &type, const QuantumIdentifier &QI, const Verbosity &)
WORKSPACE METHOD: abs_linesNormalizationMatch.
void abs_lines_per_speciesLinemixingLimitSpecies(ArrayOfArrayOfAbsorptionLines &abs_lines_per_species, const ArrayOfArrayOfSpeciesTag &abs_species, const Numeric &x, const String &species_tag, const Verbosity &verbosity)
WORKSPACE METHOD: abs_lines_per_speciesLinemixingLimitSpecies.
bool check_local(const Array< QuantumNumberType > &local_state)
void abs_lines_per_speciesChangeBaseParameterForMatchingLines(ArrayOfArrayOfAbsorptionLines &abs_lines_per_species, const QuantumIdentifier &QI, const String ¶meter_name, const Numeric &change, const Index &relative, const Verbosity &verbosity)
WORKSPACE METHOD: abs_lines_per_speciesChangeBaseParameterForMatchingLines.
void abs_lines_per_speciesTurnOffLineMixing(ArrayOfArrayOfAbsorptionLines &abs_lines_per_species, const Verbosity &verbosity)
WORKSPACE METHOD: abs_lines_per_speciesTurnOffLineMixing.
void abs_linesKeepBand(ArrayOfAbsorptionLines &abs_lines, const QuantumIdentifier &qid, const Verbosity &)
WORKSPACE METHOD: abs_linesKeepBand.
void abs_lines_per_speciesLineShapeModelParametersMatchingLines(ArrayOfArrayOfAbsorptionLines &abs_lines_per_species, const QuantumIdentifier &QI, const String ¶meter, const String &species, const String &temperaturemodel, const Vector &new_values, const Verbosity &verbosity)
WORKSPACE METHOD: abs_lines_per_speciesLineShapeModelParametersMatchingLines.
void abs_lines_per_speciesLineShapeTypeMatch(ArrayOfArrayOfAbsorptionLines &abs_lines_per_species, const String &type, const QuantumIdentifier &QI, const Verbosity &v)
WORKSPACE METHOD: abs_lines_per_speciesLineShapeTypeMatch.
void abs_linesMirroringMatch(ArrayOfAbsorptionLines &abs_lines, const String &type, const QuantumIdentifier &QI, const Verbosity &)
WORKSPACE METHOD: abs_linesMirroringMatch.
void ReadARTSCAT(ArrayOfAbsorptionLines &abs_lines, const String &artscat_file, const Numeric &fmin, const Numeric &fmax, const String &globalquantumnumbers, const String &localquantumnumbers, const String &normalization_option, const String &mirroring_option, const String &population_option, const String &lineshapetype_option, const String &cutoff_option, const Numeric &cutoff_value, const Numeric &linemixinglimit_value, const Verbosity &verbosity)
WORKSPACE METHOD: ReadARTSCAT.
void abs_lines_per_speciesChangeBaseParameterForSpecies(ArrayOfArrayOfAbsorptionLines &abs_lines_per_species, const ArrayOfArrayOfSpeciesTag &abs_species, const QuantumIdentifier &QI, const String ¶meter_name, const Numeric &change, const Index &relative, const String &species_tag, const Verbosity &verbosity)
WORKSPACE METHOD: abs_lines_per_speciesChangeBaseParameterForSpecies.
void abs_lines_per_speciesPopulationNlteField(Index &nlte_do, ArrayOfArrayOfAbsorptionLines &abs_lines_per_species, const EnergyLevelMap &nlte_field, const Verbosity &)
WORKSPACE METHOD: abs_lines_per_speciesPopulationNlteField.
void abs_linesTurnOffLineMixing(ArrayOfAbsorptionLines &abs_lines, const Verbosity &)
WORKSPACE METHOD: abs_linesTurnOffLineMixing.
void abs_lines_per_speciesCutoff(ArrayOfArrayOfAbsorptionLines &abs_lines_per_species, const String &type, const Numeric &x, const Verbosity &v)
WORKSPACE METHOD: abs_lines_per_speciesCutoff.
void abs_lines_per_speciesLinemixingLimit(ArrayOfArrayOfAbsorptionLines &abs_lines_per_species, const Numeric &x, const Verbosity &v)
WORKSPACE METHOD: abs_lines_per_speciesLinemixingLimit.
void abs_lines_per_speciesLinemixingLimitMatch(ArrayOfArrayOfAbsorptionLines &abs_lines_per_species, const Numeric &x, const QuantumIdentifier &QI, const Verbosity &v)
WORKSPACE METHOD: abs_lines_per_speciesLinemixingLimitMatch.
void abs_linesChangeBaseParameterForMatchingLines(ArrayOfAbsorptionLines &abs_lines, const QuantumIdentifier &QI, const String ¶meter_name, const Numeric &change, const Index &relative, const Verbosity &)
WORKSPACE METHOD: abs_linesChangeBaseParameterForMatchingLines.
void abs_linesEmptyBroadeningParameters(ArrayOfAbsorptionLines &abs_lines, const Verbosity &)
WORKSPACE METHOD: abs_linesEmptyBroadeningParameters.
void abs_lines_per_speciesT0(ArrayOfArrayOfAbsorptionLines &abs_lines_per_species, const Numeric &x, const Verbosity &v)
WORKSPACE METHOD: abs_lines_per_speciesT0.
void abs_lines_per_speciesMirroringMatch(ArrayOfArrayOfAbsorptionLines &abs_lines_per_species, const String &type, const QuantumIdentifier &QI, const Verbosity &v)
WORKSPACE METHOD: abs_lines_per_speciesMirroringMatch.
void abs_lines_per_speciesReadSpeciesSplitCatalog(ArrayOfArrayOfAbsorptionLines &abs_lines_per_species, const ArrayOfArrayOfSpeciesTag &abs_species, const String &basename, const Index &robust, const Verbosity &verbosity)
WORKSPACE METHOD: abs_lines_per_speciesReadSpeciesSplitCatalog.
void ReadJPL(ArrayOfAbsorptionLines &abs_lines, const String &jpl_file, const Numeric &fmin, const Numeric &fmax, const String &globalquantumnumbers, const String &localquantumnumbers, const String &normalization_option, const String &mirroring_option, const String &population_option, const String &lineshapetype_option, const String &cutoff_option, const Numeric &cutoff_value, const Numeric &linemixinglimit_value, const Verbosity &verbosity)
WORKSPACE METHOD: ReadJPL.
void abs_lines_per_speciesManualMirroring(ArrayOfArrayOfAbsorptionLines &abs_lines_per_species, const Verbosity &verbosity)
WORKSPACE METHOD: abs_lines_per_speciesManualMirroring.
void abs_linesReplaceLines(ArrayOfAbsorptionLines &abs_lines, const ArrayOfAbsorptionLines &replacing_lines, const Verbosity &)
WORKSPACE METHOD: abs_linesReplaceLines.
void abs_linesLineShapeModelParametersMatchingLines(ArrayOfAbsorptionLines &abs_lines, const QuantumIdentifier &QI, const String ¶meter, const String &species, const String &temperaturemodel, const Vector &new_values, const Verbosity &verbosity)
WORKSPACE METHOD: abs_linesLineShapeModelParametersMatchingLines.
void abs_linesCompact(ArrayOfAbsorptionLines &abs_lines, const Vector &f_grid, const Verbosity &)
WORKSPACE METHOD: abs_linesCompact.
void remove_impl(ArrayOfAbsorptionLines &abs_lines, const ArrayOfSpeciesTag &species, const Numeric lower_frequency, const Numeric upper_frequency, const Numeric lower_intensity, const Index safe, const Index flip_flims, const Verbosity &verbosity)
void abs_linesRemoveBand(ArrayOfAbsorptionLines &abs_lines, const QuantumIdentifier &qid, const Verbosity &)
WORKSPACE METHOD: abs_linesRemoveBand.
constexpr Index merge_local_lines_size
void abs_linesCutoffMatch(ArrayOfAbsorptionLines &abs_lines, const String &type, const Numeric &x, const QuantumIdentifier &QI, const Verbosity &)
WORKSPACE METHOD: abs_linesCutoffMatch.
void abs_linesChangeBaseParameterForMatchingLevels(ArrayOfAbsorptionLines &abs_lines, const ArrayOfQuantumIdentifier &QID, const String ¶meter_name, const Vector &change, const Index &relative, const Verbosity &verbosity)
WORKSPACE METHOD: abs_linesChangeBaseParameterForMatchingLevels.
void abs_linesBaseParameterMatchingLevels(ArrayOfAbsorptionLines &abs_lines, const ArrayOfQuantumIdentifier &QID, const String ¶meter_name, const Vector &change, const Verbosity &verbosity)
WORKSPACE METHOD: abs_linesBaseParameterMatchingLevels.
void abs_lines_per_speciesRemoveLinesFromSpecies(ArrayOfArrayOfAbsorptionLines &abs_lines_per_species, const ArrayOfSpeciesTag &species, const Numeric &lower_frequency, const Numeric &upper_frequency, const Numeric &lower_intensity, const Index &safe, const Index &flip_flims, const Verbosity &verbosity)
WORKSPACE METHOD: abs_lines_per_speciesRemoveLinesFromSpecies.
void abs_linesRemoveEmptyBands(ArrayOfAbsorptionLines &abs_lines, const Verbosity &)
WORKSPACE METHOD: abs_linesRemoveEmptyBands.
void abs_lines_per_speciesNormalizationSpecies(ArrayOfArrayOfAbsorptionLines &abs_lines_per_species, const ArrayOfArrayOfSpeciesTag &abs_species, const String &type, const String &species_tag, const Verbosity &verbosity)
WORKSPACE METHOD: abs_lines_per_speciesNormalizationSpecies.
void ReadArrayOfARTSCAT(ArrayOfAbsorptionLines &abs_lines, const String &artscat_file, const Numeric &fmin, const Numeric &fmax, const String &globalquantumnumbers, const String &localquantumnumbers, const String &normalization_option, const String &mirroring_option, const String &population_option, const String &lineshapetype_option, const String &cutoff_option, const Numeric &cutoff_value, const Numeric &linemixinglimit_value, const Verbosity &verbosity)
WORKSPACE METHOD: ReadArrayOfARTSCAT.
void abs_linesDeleteWithLines(ArrayOfAbsorptionLines &abs_lines, const ArrayOfAbsorptionLines &deleting_lines, const Verbosity &)
void ReadSplitARTSCAT(ArrayOfAbsorptionLines &abs_lines, const ArrayOfArrayOfSpeciesTag &abs_species, const String &basename, const Numeric &fmin, const Numeric &fmax, const String &globalquantumnumbers, const String &localquantumnumbers, const Index &ignore_missing, const String &normalization_option, const String &mirroring_option, const String &population_option, const String &lineshapetype_option, const String &cutoff_option, const Numeric &cutoff_value, const Numeric &linemixinglimit_value, const Verbosity &verbosity)
WORKSPACE METHOD: ReadSplitARTSCAT.
void abs_linesPopulation(ArrayOfAbsorptionLines &abs_lines, const String &type, const Verbosity &)
WORKSPACE METHOD: abs_linesPopulation.
void abs_lines_per_speciesT0Species(ArrayOfArrayOfAbsorptionLines &abs_lines_per_species, const ArrayOfArrayOfSpeciesTag &abs_species, const Numeric &x, const String &species_tag, const Verbosity &verbosity)
WORKSPACE METHOD: abs_lines_per_speciesT0Species.
void abs_lines_per_speciesNormalization(ArrayOfArrayOfAbsorptionLines &abs_lines_per_species, const String &type, const Verbosity &v)
WORKSPACE METHOD: abs_lines_per_speciesNormalization.
void abs_lines_per_speciesRemoveLines(ArrayOfArrayOfAbsorptionLines &abs_lines_per_species, const Numeric &lower_frequency, const Numeric &upper_frequency, const Numeric &lower_intensity, const Index &safe, const Index &flip_flims, const Verbosity &verbosity)
WORKSPACE METHOD: abs_lines_per_speciesRemoveLines.
void abs_linesAppendWithLines(ArrayOfAbsorptionLines &abs_lines, const ArrayOfAbsorptionLines &appending_lines, const Index &safe, const Verbosity &)
void abs_lines_per_speciesMirroring(ArrayOfArrayOfAbsorptionLines &abs_lines_per_species, const String &type, const Verbosity &v)
WORKSPACE METHOD: abs_lines_per_speciesMirroring.
void abs_lines_per_speciesCutoffSpecies(ArrayOfArrayOfAbsorptionLines &abs_lines_per_species, const ArrayOfArrayOfSpeciesTag &abs_species, const String &type, const Numeric &x, const String &species_tag, const Verbosity &verbosity)
WORKSPACE METHOD: abs_lines_per_speciesCutoffSpecies.
void abs_linesLineShapeTypeMatch(ArrayOfAbsorptionLines &abs_lines, const String &type, const QuantumIdentifier &QI, const Verbosity &)
WORKSPACE METHOD: abs_linesLineShapeTypeMatch.
Array< QuantumNumberType > string2vecqn(std::string_view qnstr)
Get a list of quantum numbers from a string.
void abs_linesChangeBaseParameterForMatchingLevel(ArrayOfAbsorptionLines &abs_lines, const QuantumIdentifier &QI, const String ¶meter_name, const Numeric &change, const Index &relative, const Verbosity &)
WORKSPACE METHOD: abs_linesChangeBaseParameterForMatchingLevel.
void abs_lines_per_speciesNormalizationMatch(ArrayOfArrayOfAbsorptionLines &abs_lines_per_species, const String &type, const QuantumIdentifier &QI, const Verbosity &v)
WORKSPACE METHOD: abs_lines_per_speciesNormalizationMatch.
void abs_lines_per_speciesPopulationMatch(ArrayOfArrayOfAbsorptionLines &abs_lines_per_species, const String &type, const QuantumIdentifier &QI, const Verbosity &v)
WORKSPACE METHOD: abs_lines_per_speciesPopulationMatch.
void ReadLBLRTM(ArrayOfAbsorptionLines &abs_lines, const String &lblrtm_file, const Numeric &fmin, const Numeric &fmax, const String &globalquantumnumbers, const String &localquantumnumbers, const String &normalization_option, const String &mirroring_option, const String &population_option, const String &lineshapetype_option, const String &cutoff_option, const Numeric &cutoff_value, const Numeric &linemixinglimit_value, const Verbosity &verbosity)
WORKSPACE METHOD: ReadLBLRTM.
void abs_linesBaseParameterMatchingLevel(ArrayOfAbsorptionLines &abs_lines, const QuantumIdentifier &QI, const String ¶meter_name, const Numeric &x, const Verbosity &)
WORKSPACE METHOD: abs_linesBaseParameterMatchingLevel.
void abs_linesT0Match(ArrayOfAbsorptionLines &abs_lines, const Numeric &x, const QuantumIdentifier &QI, const Verbosity &)
WORKSPACE METHOD: abs_linesT0Match.
void abs_linesRemoveLines(ArrayOfAbsorptionLines &abs_lines, const Numeric &lower_frequency, const Numeric &upper_frequency, const Numeric &lower_intensity, const Index &safe, const Index &flip_flims, const Verbosity &verbosity)
WORKSPACE METHOD: abs_linesRemoveLines.
void abs_lines_per_speciesPopulationSpecies(ArrayOfArrayOfAbsorptionLines &abs_lines_per_species, const ArrayOfArrayOfSpeciesTag &abs_species, const String &type, const String &species_tag, const Verbosity &verbosity)
WORKSPACE METHOD: abs_lines_per_speciesPopulationSpecies.
void abs_linesManualMirroring(ArrayOfAbsorptionLines &abs_lines, const Verbosity &)
WORKSPACE METHOD: abs_linesManualMirroring.
void ReadHITRAN(ArrayOfAbsorptionLines &abs_lines, const String &hitran_file, const Numeric &fmin, const Numeric &fmax, const String &globalquantumnumbers, const String &localquantumnumbers, const String &hitran_type, const String &normalization_option, const String &mirroring_option, const String &population_option, const String &lineshapetype_option, const String &cutoff_option, const Numeric &cutoff_value, const Numeric &linemixinglimit_value, const Verbosity &verbosity)
WORKSPACE METHOD: ReadHITRAN.
void abs_lines_per_speciesT0Match(ArrayOfArrayOfAbsorptionLines &abs_lines_per_species, const Numeric &x, const QuantumIdentifier &QI, const Verbosity &v)
WORKSPACE METHOD: abs_lines_per_speciesT0Match.
void abs_lines_per_speciesSetEmpty(ArrayOfArrayOfAbsorptionLines &abs_lines_per_species, const ArrayOfArrayOfSpeciesTag &abs_species, const Verbosity &)
WORKSPACE METHOD: abs_lines_per_speciesSetEmpty.
void abs_lines_per_speciesBaseParameterMatchingLevel(ArrayOfArrayOfAbsorptionLines &abs_lines_per_species, const QuantumIdentifier &QI, const String ¶meter_name, const Numeric &change, const Verbosity &verbosity)
WORKSPACE METHOD: abs_lines_per_speciesBaseParameterMatchingLevel.
void merge_external_line(ArrayOfAbsorptionLines &abs_lines, const Absorption::SingleLineExternal &sline, const QuantumIdentifier &global_qid)
Merge an external line to abs_lines.
void abs_lines_per_speciesBaseParameterMatchingLevels(ArrayOfArrayOfAbsorptionLines &abs_lines_per_species, const ArrayOfQuantumIdentifier &QID, const String ¶meter_name, const Vector &change, const Verbosity &verbosity)
WORKSPACE METHOD: abs_lines_per_speciesBaseParameterMatchingLevels.
void abs_linesReplaceWithLines(ArrayOfAbsorptionLines &abs_lines, const ArrayOfAbsorptionLines &replacing_lines, const Verbosity &)
void abs_lines_per_speciesMirroringSpecies(ArrayOfArrayOfAbsorptionLines &abs_lines_per_species, const ArrayOfArrayOfSpeciesTag &abs_species, const String &type, const String &species_tag, const Verbosity &verbosity)
WORKSPACE METHOD: abs_lines_per_speciesMirroringSpecies.
void abs_linesLinemixingLimit(ArrayOfAbsorptionLines &abs_lines, const Numeric &x, const Verbosity &)
WORKSPACE METHOD: abs_linesLinemixingLimit.
void abs_lines_per_speciesCutoffMatch(ArrayOfArrayOfAbsorptionLines &abs_lines_per_species, const String &type, const Numeric &x, const QuantumIdentifier &QI, const Verbosity &verbosity)
WORKSPACE METHOD: abs_lines_per_speciesCutoffMatch.
void abs_linesRemoveLinesFromSpecies(ArrayOfAbsorptionLines &abs_lines, const ArrayOfSpeciesTag &species, const Numeric &lower_frequency, const Numeric &upper_frequency, const Numeric &lower_intensity, const Index &safe, const Index &flip_flims, const Verbosity &verbosity)
WORKSPACE METHOD: abs_linesRemoveLinesFromSpecies.
void abs_lines_per_speciesFlatten(ArrayOfArrayOfAbsorptionLines &abs_lines_per_species, const Verbosity &verbosity)
WORKSPACE METHOD: abs_lines_per_speciesFlatten.
void abs_linesBaseParameterMatchingLines(ArrayOfAbsorptionLines &abs_lines, const QuantumIdentifier &QI, const String ¶meter_name, const Numeric &x, const Verbosity &)
WORKSPACE METHOD: abs_linesBaseParameterMatchingLines.
void abs_lines_per_speciesWriteSpeciesSplitCatalog(const String &output_format, const ArrayOfArrayOfAbsorptionLines &abs_lines_per_species, const String &basename, const Verbosity &verbosity)
WORKSPACE METHOD: abs_lines_per_speciesWriteSpeciesSplitCatalog.
void abs_linesLineShapeType(ArrayOfAbsorptionLines &abs_lines, const String &type, const Verbosity &)
WORKSPACE METHOD: abs_linesLineShapeType.
void abs_lines_per_speciesChangeBaseParameterForMatchingLevels(ArrayOfArrayOfAbsorptionLines &abs_lines_per_species, const ArrayOfQuantumIdentifier &QID, const String ¶meter_name, const Vector &change, const Index &relative, const Verbosity &verbosity)
WORKSPACE METHOD: abs_lines_per_speciesChangeBaseParameterForMatchingLevels.
void abs_linesReplaceBands(ArrayOfAbsorptionLines &abs_lines, const ArrayOfAbsorptionLines &replacing_bands, const Verbosity &)
WORKSPACE METHOD: abs_linesReplaceBands.
void abs_lines_per_speciesLineShapeType(ArrayOfArrayOfAbsorptionLines &abs_lines_per_species, const String &type, const Verbosity &v)
WORKSPACE METHOD: abs_lines_per_speciesLineShapeType.
void abs_linesMirroring(ArrayOfAbsorptionLines &abs_lines, const String &type, const Verbosity &)
WORKSPACE METHOD: abs_linesMirroring.
void f_gridFromAbsorptionLines(Vector &f_grid, const ArrayOfArrayOfAbsorptionLines &abs_lines_per_species, const Numeric &delta_f_low, const Numeric &delta_f_upp, const Index &num_freqs, const Verbosity &)
WORKSPACE METHOD: f_gridFromAbsorptionLines.
void abs_linesLinemixingLimitMatch(ArrayOfAbsorptionLines &abs_lines, const Numeric &x, const QuantumIdentifier &QI, const Verbosity &)
WORKSPACE METHOD: abs_linesLinemixingLimitMatch.
void abs_linesSort(ArrayOfAbsorptionLines &abs_lines, const String &option, const Verbosity &verbosity)
WORKSPACE METHOD: abs_linesSort.
void merge_local_lines(ArrayOfAbsorptionLines &abs_lines, const ArrayOfAbsorptionLines &local_lines)
Merge lines to abs_lines.
void abs_linesWriteSpeciesSplitCatalog(const String &output_format, const ArrayOfAbsorptionLines &abs_lines, const String &basename, const Verbosity &verbosity)
WORKSPACE METHOD: abs_linesWriteSpeciesSplitCatalog.
void abs_lines_per_speciesLineShapeTypeSpecies(ArrayOfArrayOfAbsorptionLines &abs_lines_per_species, const ArrayOfArrayOfSpeciesTag &abs_species, const String &type, const String &species_tag, const Verbosity &verbosity)
WORKSPACE METHOD: abs_lines_per_speciesLineShapeTypeSpecies.
std::vector< T > linspace(T s, T e, typename std::vector< T >::size_type count) noexcept
void CheckUnique(const ArrayOfAbsorptionLines &lines, const Verbosity &)
WORKSPACE METHOD: CheckUnique.
void abs_linesReadSpeciesSplitCatalog(ArrayOfAbsorptionLines &abs_lines, const String &basename, const Index &robust, const Verbosity &verbosity)
WORKSPACE METHOD: abs_linesReadSpeciesSplitCatalog.
void abs_lines_per_speciesCompact(ArrayOfArrayOfAbsorptionLines &abs_lines_per_species, const Vector &f_grid, const Verbosity &verbosity)
WORKSPACE METHOD: abs_lines_per_speciesCompact.
Workspace methods and template functions for supergeneric XML IO.
void WriteXML(const String &file_format, const T &v, const String &f, const Index &no_clobber, const String &v_name, const String &f_name, const String &no_clobber_name, const Verbosity &verbosity)
WORKSPACE METHOD: WriteXML.
NUMERIC Numeric
The type to use for all floating point numbers.
INDEX Index
The type to use for all integer numbers and indices.
my_basic_string< char > String
The String type for ARTS.
SingleLineExternal ReadFromHitranOnlineStream(istream &is)
Read from HITRAN online.
SingleLineExternal ReadFromJplStream(istream &is)
Read from JPL.
SingleLineExternal ReadFromArtscat3Stream(istream &is)
Read from ARTSCAT-3.
SingleLineExternal ReadFromLBLRTMStream(istream &is)
Read from LBLRTM.
SingleLineExternal ReadFromArtscat5Stream(istream &is)
Read from ARTSCAT-5.
SingleLineExternal ReadFromHitran2004Stream(istream &is)
Read from newer HITRAN.
SingleLineExternal ReadFromHitran2001Stream(istream &is)
Read from HITRAN before 2004.
SingleLineExternal ReadFromArtscat4Stream(istream &is)
Read from ARTSCAT-4.
std::vector< Lines > split_list_of_external_lines(std::vector< SingleLineExternal > &external_lines, const std::vector< QuantumNumberType > &localquantas={}, const std::vector< QuantumNumberType > &globalquantas={})
Splits a list of lines into proper Lines.
constexpr std::string_view bath_broadening
Name for bath broadening in printing and reading user input.
constexpr bool modelparameterEmpty(const ModelParameters mp) noexcept
constexpr std::string_view self_broadening
Name for self broadening in printing and reading user input.
constexpr Index nVars
Current max number of line shape variables.
constexpr std::array Isotopologues
A list of all ARTS isotopologues, note how the species enum class input HAS to be sorted.
consteval std::array< IsotopeRecord, count_isotopologues< spec >()> isotopologues() noexcept
Model GetAdvancedModel(const QuantumIdentifier &qid) ARTS_NOEXCEPT
Returns an advanced Zeeman model.
Index NumLines() const noexcept
Number of lines.
std::pair< bool, bool > Match(const Lines &l) const noexcept
Checks if another line list matches this structure.
void AppendSingleLine(SingleLine &&sl)
Appends a single line to the absorption lines.
Single line reading output.
QuantumIdentifier quantumidentity
PopulationType population
NormalizationType normalization
LineShape::Type lineshapetype
Numeric F0
Central frequency.
Quantum::Number::LocalState localquanta
Local quantum numbers.
Zeeman::Model zeeman
Zeeman model.
ArrayOfQuantumIdentifier levels
void ThrowIfNotOK() const ARTS_NOEXCEPT
Coefficients and temperature model for SingleSpeciesModel.
A logical struct for global quantum numbers with species identifiers.
Species::IsotopeRecord Isotopologue() const noexcept
StateMatchType operates so that a check less than a level should be 'better', bar None.
void xml_find_and_open_input_file(std::shared_ptr< istream > &ifs, const String &filename, const Verbosity &verbosity)
Open plain or zipped xml file.
void xml_read_from_file(const String &filename, T &type, const Verbosity &verbosity)
Reads data from XML file.
void xml_read_header_from_stream(istream &is, FileType &ftype, NumericType &ntype, EndianType &etype, const Verbosity &verbosity)
Reads XML header and root tag.