diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml
index 2be190d2f..0ebef677c 100644
--- a/.github/workflows/tests.yml
+++ b/.github/workflows/tests.yml
@@ -23,9 +23,11 @@ env:
CHIANTI_DB_VER: CHIANTI_v9.0.1_database.tar.gz
PYTEST_FLAGS: --remote-data --runslow --test-db=carsus-db/test_databases/test.db
--refdata=carsus-refdata --cov=carsus --cov-report=xml
- --cov-report=html
+ --cov-report=html --arraydiff --arraydiff-reference-path=carsus-refdata/arraydiff
NBCONVERT_CMD: jupyter nbconvert --execute --ExecutePreprocessor.timeout=600 --to html
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
+ CMFGEN_DL_URL: http://kookaburra.phyast.pitt.edu/hillier/cmfgen_files
+ CMFGEN_DB_VER: atomic_data_15nov16.tar.gz
jobs:
build:
@@ -77,6 +79,18 @@ jobs:
wget -q ${{ env.CHIANTI_DL_URL }}/${{ env.CHIANTI_DB_VER }} -O ${{ env.XUVTOP }}/chianti.tar.gz
tar -zxf ${{ env.XUVTOP }}/chianti.tar.gz -C ${{ env.XUVTOP }}
if: steps.chianti-cache.outputs.cache-hit != 'true'
+
+ - uses: actions/cache@v2
+ with:
+ path: /tmp/atomic
+ key: ${{ env.CMFGEN_DB_VER }}
+ id: cmfgen-cache
+
+ - name: Download CMFGEN database
+ run: |
+ wget -q -U "Mozilla/4.0" ${{ env.CMFGEN_DL_URL }}/${{ env.CMFGEN_DB_VER }} -O /tmp/atomic.tar.gz
+ tar -zxf /tmp/atomic.tar.gz -C /tmp
+ if: steps.cmfgen-cache.outputs.cache-hit != 'true'
- name: Setup environment
uses: conda-incubator/setup-miniconda@v2
diff --git a/README.rst b/README.rst
index 59f2a7a05..5aa54aa4a 100644
--- a/README.rst
+++ b/README.rst
@@ -17,8 +17,8 @@ sources and output them to file formats readable by radiative transfer codes.
:target: https://tardis-sn.github.io/carsus
:alt: docs
-.. image:: https://github.com/tardis-sn/carsus/actions/workflows/unit-tests.yml/badge.svg
- :target: https://github.com/tardis-sn/carsus/actions/workflows/unit-tests.yml
+.. image:: https://github.com/tardis-sn/carsus/actions/workflows/tests.yml/badge.svg
+ :target: https://github.com/tardis-sn/carsus/actions/workflows/tests.yml
:alt: tests
.. image:: https://badges.gitter.im/Join%20Chat.svg
diff --git a/carsus/data/cmfgen_config.yml b/carsus/data/cmfgen_config.yml
index b7235c8da..7101dcc58 100644
--- a/carsus/data/cmfgen_config.yml
+++ b/carsus/data/cmfgen_config.yml
@@ -89,7 +89,7 @@ atom:
Co:
ion_charge:
1:
- date: 30oct12
+ date: 15nov11
osc: fin_osc_bound
col: Co2_COL_DATA
pho:
@@ -113,7 +113,7 @@ atom:
- niphot_c.dat
- niphot_d.dat
1:
- date: 12sep12
+ date: 23jan06
osc: fin_osc
col: n2col.dat
pho:
diff --git a/carsus/io/__init__.py b/carsus/io/__init__.py
index 19c5d2dfd..fb7d2a1bd 100644
--- a/carsus/io/__init__.py
+++ b/carsus/io/__init__.py
@@ -1,6 +1,10 @@
+import os
from carsus.io.nist import NISTIonizationEnergiesParser, NISTIonizationEnergiesIngester,\
NISTWeightsCompPyparser, NISTWeightsCompIngester
-from carsus.io.chianti_ import ChiantiIonReader, ChiantiIngester
from carsus.io.kurucz import GFALLReader, GFALLIngester
from carsus.io.output import AtomData
from carsus.io.zeta import KnoxLongZetaIngester
+from carsus.io.atom_data_compare import AtomDataCompare
+
+if "XUVTOP" in os.environ:
+ from carsus.io.chianti_ import ChiantiIonReader, ChiantiIngester
diff --git a/carsus/io/atom_data_compare.py b/carsus/io/atom_data_compare.py
new file mode 100644
index 000000000..b7efdd8b6
--- /dev/null
+++ b/carsus/io/atom_data_compare.py
@@ -0,0 +1,443 @@
+import pandas as pd
+import numpy as np
+import functools
+import logging
+from carsus.util import parse_selected_species, convert_atomic_number2symbol
+from collections import defaultdict
+
+from collections import defaultdict
+import matplotlib.pyplot as plt
+
+logger = logging.getLogger(__name__)
+
+LIGHT_GREEN = "#BCF5A9"
+LIGHT_RED = "#F5A9A9"
+
+
+def highlight_values(val):
+ """
+ Return hex string of background color.
+
+ Parameters
+ ----------
+ val : bool
+
+ Returns
+ -------
+ string
+ """
+ if val == True:
+ return f"background-color: {LIGHT_GREEN}"
+ else:
+ return f"background-color: {LIGHT_RED}"
+
+
+class AtomDataCompare(object):
+ """
+ Differentiate between two Carsus atomic files.
+
+ Parameters
+ ----------
+ d1_path : string
+ Path to the first file.
+ d2_path : string
+ Path to the second file.
+ alt_keys : dict, optional
+ Alternate names to dataframes inside the atomic files.
+ For example, the `lines` dataframe was used to be called `lines_data` in earlier carsus versions.
+ """
+
+ def __init__(self, d1_path=None, d2_path=None, alt_keys={}):
+ self.d1_path = d1_path
+ self.d2_path = d2_path
+ self.alt_keys_default = {
+ "lines": ["lines_data", "lines"],
+ "levels": ["levels_data", "levels"],
+ "collisions": ["collisions_data", "collision_data"],
+ "photoionization_data": ["photoionization_data"],
+ }
+ self.alt_keys_default = defaultdict(list, self.alt_keys_default)
+ self.setup(alt_keys=alt_keys)
+
+ def set_keys_as_attributes(self, alt_keys={}):
+ """
+ Set dataframes as attributes.
+
+ Parameters
+ ----------
+ alt_keys : dict, optional
+ Alternate names to dataframes inside the atomic files. Defaults to {}.
+ """
+ # alt keys should be a subset of this self.alt_keys_default
+ # other keys would be ignored
+
+ for key, val in self.alt_keys_default.items():
+ if alt_keys.get(key, None):
+ self.alt_keys_default[key].extend(alt_keys[key])
+
+ for item in val:
+ if self.d1.get_node(item):
+ setattr(self, f"{key}1", self.d1[item])
+ if self.d2.get_node(item):
+ setattr(self, f"{key}2", self.d2[item])
+
+ def setup(self, alt_keys={}):
+ """
+ Opeb HDF files using Pandas HDFStore.
+
+ Parameters
+ ----------
+ alt_keys : dict, optional
+ Alternate names to dataframes inside the atomic files. Defaults to {}.
+ """
+ self.d1 = pd.HDFStore(self.d1_path)
+ self.d2 = pd.HDFStore(self.d2_path)
+ self.set_keys_as_attributes(alt_keys=alt_keys)
+
+ def teardown(self):
+ """
+ Close open HDF files.
+ """
+ self.d1.close()
+ self.d2.close()
+
+ def verify_key_diff(self, key_name):
+ """
+ Check if dataframes can be compared.
+
+ Parameters
+ ----------
+ key_name : string
+ """
+ try:
+ df1 = getattr(self, f"{key_name}1")
+ df2 = getattr(self, f"{key_name}2")
+ except AttributeError as exc:
+ raise Exception(
+ f"Either key_name: {key_name} is invalid or keys are not set. "
+ "Please use the set_keys_as_attributes method to set keys as attributes for comparison."
+ )
+
+ species1 = df1.index.get_level_values("atomic_number")
+ species1 = set([convert_atomic_number2symbol(item) for item in species1])
+
+ species2 = df2.index.get_level_values("atomic_number")
+ species2 = set([convert_atomic_number2symbol(item) for item in species2])
+
+ species_diff = species1.symmetric_difference(species2)
+ if len(species_diff):
+ print(f"Elements not in common in both dataframes: {species_diff}")
+
+ common_columns = df2.columns.intersection(df1.columns)
+ if common_columns.empty:
+ raise ValueError("There are no common columns for comparison. Exiting.")
+
+ mismatched_cols = df2.columns.symmetric_difference(df1.columns)
+ if not mismatched_cols.empty:
+ logger.warning("Columns do not match.")
+ logger.warning(f"Mismatched columns: {mismatched_cols}")
+ logger.info(f"Using common columns for comparison:{common_columns}")
+
+ if df1.index.names != df2.index.names:
+ raise ValueError("Index names do not match.")
+
+ setattr(self, f"{key_name}_columns", common_columns)
+
+ def ion_diff(
+ self,
+ key_name,
+ ion,
+ rtol=1e-07,
+ simplify_output=True,
+ return_summary=False,
+ style=True,
+ style_axis=0,
+ ):
+ """
+ Compare two dataframes- ion wise.
+
+ Parameters
+ ----------
+ key_name : string
+ ion: string or tuple
+ rtol: int
+ simplify_output: bool
+ return_summary: bool
+ style: bool
+ style_axis: int or None
+ """
+ try:
+ df1 = getattr(self, f"{key_name}1")
+ df2 = getattr(self, f"{key_name}2")
+ except AttributeError as exc:
+ raise Exception(
+ f"Either key_name: {key_name} is invalid or keys are not set."
+ "Please use the set_keys_as_attributes method to set keys as attributes for comparison."
+ )
+
+ if not hasattr(self, f"{key_name}_columns"):
+ self.verify_key_diff(key_name)
+
+ common_columns = getattr(self, f"{key_name}_columns")
+
+ if not isinstance(ion, tuple):
+ parsed_ion = parse_selected_species(ion)[0]
+ else:
+ parsed_ion = ion
+
+ try:
+ df1 = df1.loc[parsed_ion]
+ df2 = df2.loc[parsed_ion]
+ except KeyError as exc:
+ raise Exception(
+ "The element does not exist in one of the dataframes."
+ ) from exc
+
+ merged_df = pd.merge(
+ df1,
+ df2,
+ left_index=True,
+ right_index=True,
+ suffixes=["_1", "_2"],
+ )
+
+ non_numeric_cols = ["line_id", "metastable"] # TODO
+ common_cols_rearranged = []
+
+ for item in common_columns:
+ if item in non_numeric_cols:
+ merged_df[f"matches_{item}"] = (
+ merged_df[f"{item}_1"] == merged_df[f"{item}_2"]
+ )
+ common_cols_rearranged.extend(
+ [
+ f"{item}_1",
+ f"{item}_2",
+ f"matches_{item}",
+ ]
+ )
+ else:
+ merged_df[f"matches_{item}"] = np.isclose(
+ merged_df[f"{item}_1"], merged_df[f"{item}_2"], rtol=rtol
+ )
+ merged_df[f"pct_change_{item}"] = merged_df[
+ [f"{item}_1", f"{item}_2"]
+ ].pct_change(axis=1)[f"{item}_2"]
+
+ merged_df[f"pct_change_{item}"] = merged_df[
+ f"pct_change_{item}"
+ ].fillna(0)
+
+ common_cols_rearranged.extend(
+ [f"{item}_1", f"{item}_2", f"matches_{item}", f"pct_change_{item}"]
+ )
+
+ merged_df = merged_df[common_cols_rearranged]
+ merged_df = merged_df.sort_values(by=merged_df.index.names, axis=0)
+ merged_df.apply(
+ lambda column: column.abs() if column.dtype.kind in "iufc" else column
+ )
+
+ if return_summary:
+ summary_dict = {}
+ summary_dict["total_rows"] = len(merged_df)
+
+ for column in merged_df.copy().columns:
+ if column.startswith("matches_"):
+ summary_dict[column] = (
+ merged_df[column].copy().value_counts().get(True, 0)
+ )
+ summary_df = pd.DataFrame(summary_dict, index=["values"])
+ return summary_df
+
+ if simplify_output:
+ matches_cols = [
+ column for column in merged_df.columns if column.startswith("matches")
+ ]
+ conditions = [merged_df[column] != True for column in matches_cols]
+
+ merged_df = self.simplified_df(merged_df.copy()) # TODO
+ merged_df = merged_df[functools.reduce(np.logical_or, conditions)]
+
+ if merged_df.empty:
+ print("All the values in both the dataframes match.")
+ return None
+
+ merged_df = merged_df.drop(
+ columns=[
+ column
+ for column in merged_df.columns
+ if column.startswith("matches")
+ ]
+ )
+
+ if style:
+ pct_change_subset = [
+ column
+ for column in merged_df.columns
+ if column.startswith("pct_change")
+ ]
+ return merged_df.style.background_gradient(
+ cmap="Reds", subset=pct_change_subset, axis=style_axis
+ )
+
+ return merged_df
+
+ def key_diff(
+ self, key_name, rtol=1e-07, simplify_output=True, style=True, style_axis=0
+ ):
+ """
+ Compare two dataframes.
+
+ Parameters
+ ----------
+ key_name : string
+ simplify_output: bool
+ style: bool
+ style_axis: int or None
+ """
+ if not hasattr(self, f"{key_name}_columns"):
+ self.verify_key_diff(key_name)
+
+ df1 = getattr(self, f"{key_name}1")
+ df2 = getattr(self, f"{key_name}2")
+
+ ions1 = set(
+ [(atomic_number, ion_number) for atomic_number, ion_number, *_ in df1.index]
+ )
+ ions2 = set(
+ [(atomic_number, ion_number) for atomic_number, ion_number, *_ in df2.index]
+ )
+
+ ions = set(ions1).intersection(ions2)
+ ion_diffs = []
+ for ion in ions:
+ ion_diff = self.ion_diff(
+ key_name=key_name, ion=ion, rtol=rtol, return_summary=True
+ )
+ ion_diff["atomic_number"], ion_diff["ion_number"] = ion
+ ion_diff = ion_diff.set_index(["atomic_number", "ion_number"])
+ ion_diffs.append(ion_diff)
+ key_diff = pd.concat(ion_diffs)
+
+ columns = key_diff.columns
+ for column in columns:
+ if column.startswith("matches"):
+ key_diff[column] = key_diff["total_rows"] - key_diff[column]
+ key_diff = key_diff.rename(columns={column: f"not_{column}"})
+ key_diff = key_diff.sort_values(["atomic_number", "ion_number"])
+
+ subset = [
+ column for column in key_diff.columns if column.startswith("not_matches")
+ ]
+ conditions = [key_diff[column] != 0 for column in subset]
+
+ if simplify_output:
+ key_diff = key_diff[functools.reduce(np.logical_or, conditions)]
+
+ if style:
+ return key_diff.style.background_gradient(
+ cmap="Reds", subset=subset, axis=style_axis
+ )
+
+ return key_diff
+
+ def generate_comparison_table(self):
+ """
+ Generate empty comparison table.
+ """
+ for index, file in enumerate((self.d1, self.d2)):
+ # create a dict to contain names of keys in the file
+ # and their alternate(more recent) names
+ file_keys = {item[1:]: item[1:] for item in file.keys()}
+ for original_keyname in self.alt_keys_default.keys():
+ for file_key in file_keys.keys():
+ alt_key_names = self.alt_keys_default.get(original_keyname, [])
+
+ if file_key in alt_key_names:
+ # replace value with key name in self.alt_keys_default
+ file_keys[file_key] = original_keyname
+
+ # flip the dict to create the dataframe
+ file_keys = {v: k for k, v in file_keys.items()}
+ df = pd.DataFrame(file_keys, index=["file_keys"]).T
+ df["exists"] = True
+ setattr(self, f"d{index+1}_df", df)
+
+ joined_df = self.d1_df.join(self.d2_df, how="outer", lsuffix="_1", rsuffix="_2")
+ joined_df[["exists_1", "exists_2"]] = joined_df[
+ ["exists_1", "exists_2"]
+ ].fillna(False)
+ self.comparison_table = joined_df
+ self.comparison_table["match"] = None
+
+ def compare(self, exclude_correct_matches=False, drop_file_keys=True, style=True):
+ """
+ Compare the two HDF files.
+
+ Parameters
+ ----------
+ exclude_correct_matches : bool
+ drop_file_keys: bool
+ style: bool
+ """
+ if not hasattr(self, "comparison_table"):
+ self.generate_comparison_table()
+
+ for index, row in self.comparison_table.iterrows():
+ if row[["exists_1", "exists_2"]].all():
+ row1_df = self.d1[row["file_keys_1"]]
+ row2_df = self.d2[row["file_keys_2"]]
+ if row1_df.equals(row2_df):
+ self.comparison_table.at[index, "match"] = True
+ else:
+ self.comparison_table.at[index, "match"] = False
+ else:
+ self.comparison_table.at[index, "match"] = False
+
+ if exclude_correct_matches:
+ self.comparison_table = self.comparison_table[
+ self.comparison_table.match == False
+ ]
+ if drop_file_keys:
+ self.comparison_table = self.comparison_table.drop(
+ columns=["file_keys_1", "file_keys_2"]
+ )
+ if style:
+ return self.comparison_table.style.applymap(
+ highlight_values, subset=["exists_1", "exists_2", "match"]
+ )
+ return self.comparison_table
+
+ def simplified_df(self, df):
+ """
+ Drop additional columns belonging to the original dataframes but were used for comparison.
+
+ Parameters
+ ----------
+ df : pd.DataFrame
+ """
+ df_simplified = df.drop(df.filter(regex="_1$|_2$").columns, axis=1)
+ return df_simplified
+
+ def plot_ion_diff(self, key_name, ion, column):
+ """
+ Plot fractional difference between properties of ions.
+
+ Parameters
+ ----------
+ key_name : string
+ ion: string or tuple
+ column: string
+ """
+ df = self.ion_diff(
+ key_name=key_name, ion=ion, style=False, simplify_output=False
+ )
+ plt.scatter(
+ df[f"{column}_1"] / df[f"{column}_2"],
+ df[f"{column}_2"],
+ )
+
+ plt.xlabel(f"{column}$_1$/{column}$_2$")
+ plt.ylabel(f"{column}$_2$")
+ plt.show()
diff --git a/carsus/io/chianti_/chianti_.py b/carsus/io/chianti_/chianti_.py
index 192cbf9e7..df53b68ae 100644
--- a/carsus/io/chianti_/chianti_.py
+++ b/carsus/io/chianti_/chianti_.py
@@ -22,6 +22,7 @@
except ImportError:
# Shamefully copied from their GitHub source:
+ import chianti.core as ch
def versionRead():
"""
Read the version number of the CHIANTI database
@@ -32,7 +33,6 @@ def versionRead():
versionStr = vFile.readline()
vFile.close()
return versionStr.strip()
- import chianti.core as ch
logger = logging.getLogger(__name__)
diff --git a/carsus/io/cmfgen/base.py b/carsus/io/cmfgen/base.py
index d9be302bc..a4f3ed66f 100644
--- a/carsus/io/cmfgen/base.py
+++ b/carsus/io/cmfgen/base.py
@@ -932,7 +932,8 @@ def _get_levels_lines(self, data):
)
ionization_energies = ionization_energies.set_index(
["atomic_number", "ion_charge"]
- ).squeeze()
+ )
+ ionization_energies = ionization_energies["ionization_energy"]
self.ionization_energies = ionization_energies
if "cross_sections" in reader.keys():
@@ -1021,31 +1022,31 @@ def _get_collisions(
f"Entries having label(s): {', '.join(missing_labels)} will be dropped for ion: {ion}."
)
- collisions["level_number_lower"] = lower_level_index
- collisions["level_number_upper"] = upper_level_index
+ collisions["level_index_lower"] = lower_level_index
+ collisions["level_index_upper"] = upper_level_index
collisions["gi"] = gi
collisions = collisions.dropna(
- subset=["level_number_lower", "level_number_upper"]
+ subset=["level_index_lower", "level_index_upper"]
)
collisions["atomic_number"] = ion[0]
- collisions["ion_number"] = ion[1]
+ collisions["ion_charge"] = ion[1]
collisions = collisions.drop(columns=["label_lower", "label_upper"])
collisions = collisions.astype(
{
- "level_number_upper": int,
- "level_number_lower": int,
+ "level_index_upper": int,
+ "level_index_lower": int,
}
)
collisions = collisions.set_index(
[
"atomic_number",
- "ion_number",
- "level_number_lower",
- "level_number_upper",
+ "ion_charge",
+ "level_index_lower",
+ "level_index_upper",
]
)
# divide the dataframe by gi and remove the column
diff --git a/carsus/io/nist/ionization.py b/carsus/io/nist/ionization.py
index 09aad6858..9274d1ee0 100644
--- a/carsus/io/nist/ionization.py
+++ b/carsus/io/nist/ionization.py
@@ -59,6 +59,7 @@ def download_ionization_energies(
'unc_out': unc_out, 'biblio': biblio}
data = {k: v for k, v in data.items() if v is not False}
+ data = {k:"on" if v is True else v for k, v in data.items()}
logger.info("Downloading ionization energies from the NIST Atomic Spectra Database.")
r = requests.post(IONIZATION_ENERGIES_URL, data=data)
diff --git a/carsus/io/output/base.py b/carsus/io/output/base.py
index 8456fca30..2e83432be 100644
--- a/carsus/io/output/base.py
+++ b/carsus/io/output/base.py
@@ -1,15 +1,17 @@
-import re
+import copy
import logging
+import re
+
+import astropy.constants as const
+import astropy.units as u
import numpy as np
import pandas as pd
-import astropy.units as u
-import astropy.constants as const
from scipy import interpolate
+
+from carsus.model import MEDIUM_AIR, MEDIUM_VACUUM
from carsus.util import (convert_atomic_number2symbol,
- convert_wavelength_air2vacuum,
- serialize_pandas_object,
- hash_pandas_object)
-from carsus.model import MEDIUM_VACUUM, MEDIUM_AIR
+ convert_wavelength_air2vacuum, hash_pandas_object,
+ serialize_pandas_object)
# Wavelengths above this value are given in air
GFALL_AIR_THRESHOLD = 2000 * u.AA
@@ -51,7 +53,14 @@ def __init__(self,
):
self.atomic_weights = atomic_weights
- self.ionization_energies = ionization_energies
+
+ if (cmfgen_reader is not None) and hasattr(cmfgen_reader, 'ionization_energies'):
+ combined_ionization_energies = copy.deepcopy(ionization_energies)
+ combined_ionization_energies.base = cmfgen_reader.ionization_energies.combine_first(ionization_energies.base)
+ self.ionization_energies = combined_ionization_energies
+ else:
+ self.ionization_energies = ionization_energies
+
self.gfall_reader = gfall_reader
self.zeta_data = zeta_data
self.chianti_reader = chianti_reader
@@ -74,7 +83,12 @@ def __init__(self,
)
else:
if hasattr(cmfgen_reader, "collisions"):
- self.collisions = cmfgen_reader.collisions
+ collisions = cmfgen_reader.collisions.copy()
+ collisions.index = collisions.index.rename(
+ ['atomic_number', 'ion_number', 'level_number_lower', 'level_number_upper']
+ )
+
+ self.collisions = collisions
self.collisions_metadata = cmfgen_reader.collisional_metadata
elif hasattr(chianti_reader, "collisions"):
@@ -1000,10 +1014,12 @@ def to_hdf(self, fname):
"""
import hashlib
- import uuid
import platform
- import pytz
+ import uuid
from datetime import datetime
+
+ import pytz
+
from carsus import FORMAT_VERSION
with pd.HDFStore(fname, 'w') as f:
@@ -1023,6 +1039,12 @@ def to_hdf(self, fname):
if hasattr(self, 'cross_sections'):
f.put('/photoionization_data', self.cross_sections_prepared)
+ lines_metadata = pd.DataFrame(
+ data=[["format", "version", "1.0"]],
+ columns=["field", "key", "value"]
+ ).set_index(["field", "key"])
+ f.put('/lines_metadata', lines_metadata)
+
meta = []
meta.append(('format', 'version', FORMAT_VERSION))
diff --git a/carsus/io/tests/test_chianti.py b/carsus/io/tests/test_chianti.py
index 170b7dbc3..e828bf167 100644
--- a/carsus/io/tests/test_chianti.py
+++ b/carsus/io/tests/test_chianti.py
@@ -1,80 +1,113 @@
import pytest
from numpy.testing import assert_almost_equal
-from carsus.io.chianti_ import ChiantiIonReader, ChiantiIngester
+from carsus.io.chianti_ import ChiantiIonReader, ChiantiIngester, ChiantiReader
from carsus.model import Level, Ion, Line, ECollision
slow = pytest.mark.skipif(
- not pytest.config.getoption("--runslow"),
- reason="need --runslow option to run"
+ not pytest.config.getoption("--runslow"), reason="need --runslow option to run"
)
-@pytest.fixture(scope="module")
-def ch_ion_reader():
- return ChiantiIonReader("ne_2")
-
-
@pytest.fixture
def ch_ingester(memory_session):
- ions = 'ne 1; cl 3'
+ ions = "ne 1; cl 3"
ingester = ChiantiIngester(memory_session, ions=ions)
return ingester
-@pytest.mark.parametrize("ion_name", ["ne_2", "n_5"])
-def test_chianti_bound_levels(ion_name):
- ion_rdr = ChiantiIonReader(ion_name)
- bound_levels = ion_rdr.bound_levels.reset_index()
- assert bound_levels["level_index"].max() <= ion_rdr.last_bound_level
+class TestChiantiIonReader:
+ @pytest.fixture(scope="class", params=["ne_2", "n_5"])
+ def ch_ion_reader(self, request):
+ return ChiantiIonReader(request.param)
+ @pytest.mark.array_compare(file_format="pd_hdf")
+ def test_chianti_bound_levels(self, ch_ion_reader):
+ bound_levels = ch_ion_reader.bound_levels
+ return bound_levels
-@pytest.mark.parametrize("ion_name", ["ne_2", "n_5"])
-def test_chianti_bound_lines(ion_name):
- ion_rdr = ChiantiIonReader(ion_name)
- bound_lines = ion_rdr.bound_lines.reset_index()
- assert bound_lines["upper_level_index"].max() <= ion_rdr.last_bound_level
+ @pytest.mark.array_compare(file_format="pd_hdf")
+ def test_chianti_bound_lines(self, ch_ion_reader):
+ bound_lines = ch_ion_reader.bound_lines
+ return bound_lines
+ @pytest.mark.array_compare(file_format="pd_hdf")
+ def test_chianti_reader_read_levels(self, ch_ion_reader):
+ return ch_ion_reader.levels
-@pytest.mark.parametrize("level_index, energy, energy_theoretical",[
- (1, 0, 0),
- (21, 252953.5, 252954),
-])
-def test_chianti_reader_read_levels(ch_ion_reader, level_index, energy, energy_theoretical):
- row = ch_ion_reader.levels.loc[level_index]
- assert_almost_equal(row['energy'], energy)
- assert_almost_equal(row['energy_theoretical'], energy_theoretical)
+ @pytest.mark.array_compare(file_format="pd_hdf")
+ def test_chianti_reader_read_lines(self, ch_ion_reader):
+ return ch_ion_reader.lines
+
+ @pytest.mark.array_compare(file_format="pd_hdf")
+ def test_chianti_reader_read_collisions(self, ch_ion_reader):
+ return ch_ion_reader.collisions
@slow
-@pytest.mark.parametrize("atomic_number, ion_charge, levels_count",[
- (10, 1, 138),
- (17, 3, 5)
-])
-def test_chianti_ingest_levels_count(memory_session, ch_ingester, atomic_number, ion_charge, levels_count):
+@pytest.mark.parametrize(
+ "atomic_number, ion_charge, levels_count", [(10, 1, 138), (17, 3, 5)]
+)
+def test_chianti_ingest_levels_count(
+ memory_session, ch_ingester, atomic_number, ion_charge, levels_count
+):
ch_ingester.ingest(levels=True)
- ion = Ion.as_unique(memory_session, atomic_number=atomic_number, ion_charge=ion_charge)
+ ion = Ion.as_unique(
+ memory_session, atomic_number=atomic_number, ion_charge=ion_charge
+ )
assert len(ion.levels) == levels_count
@slow
-@pytest.mark.parametrize("atomic_number, ion_charge, lines_count",[
- (10, 1, 1999)
-])
-def test_chianti_ingest_lines_count(memory_session, ch_ingester, atomic_number, ion_charge, lines_count):
+@pytest.mark.parametrize("atomic_number, ion_charge, lines_count", [(10, 1, 1999)])
+def test_chianti_ingest_lines_count(
+ memory_session, ch_ingester, atomic_number, ion_charge, lines_count
+):
ch_ingester.ingest(levels=True, lines=True)
- ion = Ion.as_unique(memory_session, atomic_number=atomic_number, ion_charge=ion_charge)
- cnt = memory_session.query(Line).join(Line.lower_level).filter(Level.ion==ion).count()
+ ion = Ion.as_unique(
+ memory_session, atomic_number=atomic_number, ion_charge=ion_charge
+ )
+ cnt = (
+ memory_session.query(Line)
+ .join(Line.lower_level)
+ .filter(Level.ion == ion)
+ .count()
+ )
assert cnt == lines_count
@slow
-@pytest.mark.parametrize("atomic_number, ion_charge, e_col_count",[
- (10, 1, 9453)
-])
-def test_chianti_ingest_e_col_count(memory_session, ch_ingester, atomic_number, ion_charge, e_col_count):
+@pytest.mark.parametrize("atomic_number, ion_charge, e_col_count", [(10, 1, 9453)])
+def test_chianti_ingest_e_col_count(
+ memory_session, ch_ingester, atomic_number, ion_charge, e_col_count
+):
ch_ingester.ingest(levels=True, collisions=True)
- ion = Ion.as_unique(memory_session, atomic_number=atomic_number, ion_charge=ion_charge)
- cnt = memory_session.query(ECollision).join(ECollision.lower_level).filter(Level.ion==ion).count()
- assert cnt == e_col_count
\ No newline at end of file
+ ion = Ion.as_unique(
+ memory_session, atomic_number=atomic_number, ion_charge=ion_charge
+ )
+ cnt = (
+ memory_session.query(ECollision)
+ .join(ECollision.lower_level)
+ .filter(Level.ion == ion)
+ .count()
+ )
+ assert cnt == e_col_count
+
+
+class TestChiantiReader:
+ @pytest.fixture(scope="class", params=["H-He", "N"])
+ def ch_reader(self, request):
+ return ChiantiReader(ions=request.param, collisions=True, priority=20)
+
+ @pytest.mark.array_compare(file_format="pd_hdf")
+ def test_levels(self, ch_reader):
+ return ch_reader.levels
+
+ @pytest.mark.array_compare(file_format="pd_hdf")
+ def test_lines(self, ch_reader):
+ return ch_reader.lines
+
+ @pytest.mark.array_compare(file_format="pd_hdf")
+ def test_cols(self, ch_reader):
+ return ch_reader.collisions
diff --git a/carsus/io/tests/test_cmfgen.py b/carsus/io/tests/test_cmfgen.py
index faf2ea870..0f9867e42 100644
--- a/carsus/io/tests/test_cmfgen.py
+++ b/carsus/io/tests/test_cmfgen.py
@@ -1,250 +1,259 @@
import os
-import glob
import pytest
import numpy as np
import pandas as pd
-from io import StringIO
-from numpy.testing import assert_allclose
-from pandas.testing import assert_frame_equal
-from carsus.io.cmfgen import (CMFGENEnergyLevelsParser,
- CMFGENOscillatorStrengthsParser,
- CMFGENCollisionalStrengthsParser,
- CMFGENPhoCrossSectionsParser,
- CMFGENHydLParser,
- CMFGENHydGauntBfParser,
- CMFGENReader
- )
-
-with_refdata = pytest.mark.skipif(
- not pytest.config.getoption("--refdata"),
- reason="--refdata folder not specified"
+from carsus.io.cmfgen import (
+ CMFGENEnergyLevelsParser,
+ CMFGENOscillatorStrengthsParser,
+ CMFGENCollisionalStrengthsParser,
+ CMFGENPhoCrossSectionsParser,
+ CMFGENHydLParser,
+ CMFGENHydGauntBfParser,
+ CMFGENReader,
)
-si2_levels_head = """
-0.00 0.5 3s2_3p_2Po[1/2] meas 10
-287.24 1.5 3s2_3p_2Po[3/2] meas 10
-42824.29 0.5 3s_3p2_4Pe[1/2] meas 10
-42932.62 1.5 3s_3p2_4Pe[3/2] meas 10
-43107.91 2.5 3s_3p2_4Pe[5/2] meas 10
-"""
-
-si2_lines_head = """
-0.0 42824.29 1.148200e-05 0.5 0.5 233.5123
-0.0 42932.62 7.128000e-08 0.5 1.5 232.9231
-0.0 55309.35 1.527600e-03 0.5 1.5 180.8013
-0.0 65500.47 2.558000e-01 0.5 0.5 152.6707
-0.0 76665.35 2.124000e-01 0.5 0.5 130.4370
-"""
-
-si2_col_head = """
-3.1550 3.1150 3.0750 3.0450 3.0300 3.0100 2.9850 2.9450 2.8850 2.7900 2.5250 2.1800 1.835 1.5450
-0.2330 0.2530 0.2590 0.2575 0.2555 0.2535 0.2510 0.2480 0.2435 0.2380 0.2215 0.1995 0.172 0.1420
-0.4060 0.4090 0.4035 0.3945 0.3910 0.3875 0.3845 0.3805 0.3745 0.3665 0.3425 0.3075 0.264 0.2175
-0.3205 0.3115 0.3035 0.2975 0.2960 0.2955 0.2945 0.2925 0.2885 0.2815 0.2595 0.2290 0.194 0.1565
-1.3450 1.3800 1.3900 1.3700 1.3450 1.3050 1.2500 1.1850 1.1100 1.0300 0.8650 0.7150 0.585 0.4770
-"""
+from carsus.io.cmfgen.util import *
-@with_refdata
-@pytest.fixture()
-def si2_osc_kurucz_fname(refdata_path):
- return os.path.join(refdata_path, 'cmfgen', 'energy_levels', 'si2_osc_kurucz')
+with_refdata = pytest.mark.skipif(
+ not pytest.config.getoption("--refdata"), reason="--refdata folder not specified"
+)
+data_dir = os.path.join(os.path.dirname(__file__), "data")
-@with_refdata
-@pytest.fixture()
-def fevi_osc_kb_rk_fname(refdata_path):
- return os.path.join(refdata_path, 'cmfgen', 'oscillator_strengths', 'fevi_osc_kb_rk.dat')
@with_refdata
@pytest.fixture()
-def p2_osc_fname(refdata_path):
- return os.path.join(refdata_path, 'cmfgen', 'oscillator_strengths', 'p2_osc')
+def si1_reader():
+ return CMFGENReader.from_config(
+ "Si 0-1",
+ atomic_path="/tmp/atomic",
+ collisions=True,
+ cross_sections=True,
+ ionization_energies=True,
+ temperature_grid=np.arange(2000, 50000, 2000),
+ drop_mismatched_labels=True,
+ )
-@with_refdata
-@pytest.fixture()
-def vi_osc_fname(refdata_path):
- return os.path.join(refdata_path, 'cmfgen', 'oscillator_strengths', 'vi_osc')
-@with_refdata
@pytest.fixture()
-def he2_col_fname(refdata_path):
- return os.path.join(refdata_path, 'cmfgen', 'collisional_strengths', 'he2col.dat')
+def cmfgen_refdata_fname(refdata_path, path):
+ subdirectory, fname = path
+ return os.path.join(refdata_path, "cmfgen", subdirectory, fname)
-@with_refdata
-@pytest.fixture()
-def ariii_col_fname(refdata_path):
- return os.path.join(refdata_path, 'cmfgen', 'collisional_strengths', 'col_ariii')
@with_refdata
-@pytest.fixture()
-def si2_col_fname(refdata_path):
- return os.path.join(refdata_path, 'cmfgen', 'collisional_strengths', 'si2_col')
+@pytest.mark.array_compare(file_format="pd_hdf")
+@pytest.mark.parametrize(
+ "path",
+ [
+ ["energy_levels", "si2_osc_kurucz"],
+ ],
+)
+def test_CMFGENEnergyLevelsParser(cmfgen_refdata_fname):
+ parser = CMFGENEnergyLevelsParser(cmfgen_refdata_fname)
+ n = int(parser.header["Number of energy levels"])
+ assert parser.base.shape[0] == n
+ return parser.base
-@with_refdata
-@pytest.fixture()
-def si2_pho_fname(refdata_path):
- return os.path.join(refdata_path, 'cmfgen', 'photoionization_cross_sections', 'phot_nahar_A')
@with_refdata
-@pytest.fixture()
-def coiv_pho_fname(refdata_path):
- return os.path.join(refdata_path, 'cmfgen', 'photoionization_cross_sections', 'phot_data_gs')
+@pytest.mark.array_compare(file_format="pd_hdf")
+@pytest.mark.parametrize(
+ "path",
+ [
+ ["oscillator_strengths", "fevi_osc_kb_rk.dat"],
+ ["oscillator_strengths", "p2_osc"],
+ ["oscillator_strengths", "vi_osc"],
+ ],
+)
+def test_CMFGENOscillatorStrengthsParser(cmfgen_refdata_fname):
+ parser = CMFGENOscillatorStrengthsParser(cmfgen_refdata_fname)
+ n = int(parser.header["Number of transitions"])
+ assert parser.base.shape[0] == n
+ return parser.base
@with_refdata
-@pytest.fixture()
-def hyd_l_fname(refdata_path):
- return os.path.join(
- refdata_path,
- "cmfgen",
- "photoionization_cross_sections",
- "hyd_l_data.dat",
- )
+@pytest.mark.array_compare(file_format="pd_hdf")
+@pytest.mark.parametrize(
+ "path",
+ [
+ ["collisional_strengths", "he2col.dat"],
+ ["collisional_strengths", "col_ariii"],
+ ],
+)
+def test_CMFGENCollisionalStrengthsParser(cmfgen_refdata_fname):
+ parser = CMFGENCollisionalStrengthsParser(cmfgen_refdata_fname)
+ return parser.base
@with_refdata
-@pytest.fixture()
-def gbf_n_fname(refdata_path):
- return os.path.join(
- refdata_path,
- "cmfgen",
- "photoionization_cross_sections",
- "gbf_n_data.dat",
- )
+@pytest.mark.parametrize(
+ "path",
+ [
+ ["photoionization_cross_sections", "phot_nahar_A"],
+ ["photoionization_cross_sections", "phot_data_gs"],
+ ],
+)
+@pytest.mark.array_compare(file_format="pd_hdf")
+def test_CMFGENPhoCrossSectionsParser(cmfgen_refdata_fname):
+ parser = CMFGENPhoCrossSectionsParser(cmfgen_refdata_fname)
+ n = int(parser.header["Number of energy levels"])
+ assert len(parser.base) == n
+ return parser.base[0]
-@with_refdata
-@pytest.fixture()
-def si1_data_dict(si2_osc_kurucz_fname, si2_col_fname):
- si1_levels = CMFGENEnergyLevelsParser(si2_osc_kurucz_fname).base # (carsus) Si 1 == Si II
- si1_lines = CMFGENOscillatorStrengthsParser(si2_osc_kurucz_fname).base
- si1_col = CMFGENCollisionalStrengthsParser(si2_col_fname).base
- return {(14,1): dict(levels = si1_levels, lines = si1_lines, collisions = si1_col)}
@with_refdata
-@pytest.fixture()
-def si1_reader(si1_data_dict):
- return CMFGENReader(si1_data_dict, collisions=True)
+@pytest.mark.array_compare(file_format="pd_hdf")
+@pytest.mark.parametrize(
+ "path",
+ [
+ ["photoionization_cross_sections", "hyd_l_data.dat"],
+ ],
+)
+def test_CMFGENHydLParser(cmfgen_refdata_fname):
+ parser = CMFGENHydLParser(cmfgen_refdata_fname)
+ assert parser.header["Maximum principal quantum number"] == "30"
+ return parser.base
-@with_refdata
-@pytest.fixture()
-def si2_levels_head_df():
- return pd.read_csv(StringIO(si2_levels_head), delim_whitespace=True, names=['energy', 'j', 'label', 'method', 'priority'])
@with_refdata
-@pytest.fixture()
-def si2_lines_head_df():
- return pd.read_csv(StringIO(si2_lines_head), delim_whitespace=True, names=['energy_lower', 'energy_upper', 'gf', 'j_lower',
- 'j_upper', 'wavelength'])
-@with_refdata
-@pytest.fixture()
-def si2_col_head_df():
- return pd.read_csv(StringIO(si2_col_head), delim_whitespace=True, names=range(14))
+@pytest.mark.array_compare(file_format="pd_hdf")
+@pytest.mark.parametrize(
+ "path",
+ [
+ ["photoionization_cross_sections", "gbf_n_data.dat"],
+ ],
+)
+def test_CMFGENHydGauntBfParser(cmfgen_refdata_fname):
+ parser = CMFGENHydGauntBfParser(cmfgen_refdata_fname)
+ assert parser.header["Maximum principal quantum number"] == "30"
+ return parser.base
-@with_refdata
-def test_si2_osc_kurucz(si2_osc_kurucz_fname):
- parser = CMFGENEnergyLevelsParser(si2_osc_kurucz_fname)
- n = int(parser.header['Number of energy levels'])
- assert parser.base.shape[0] == n
- assert list(parser.base.columns) == ['label', 'g', 'E(cm^-1)', '10^15 Hz', 'eV', 'Lam(A)', 'ID', 'ARAD', 'C4', 'C6']
@with_refdata
-def test_fevi_osc_kb_rk(fevi_osc_kb_rk_fname):
- parser = CMFGENOscillatorStrengthsParser(fevi_osc_kb_rk_fname)
- n = int(parser.header['Number of transitions'])
- assert parser.base.shape[0] == n
- assert list(parser.base.columns) == ['label_lower', 'label_upper', 'f', 'A', 'Lam(A)', 'i', 'j', 'Lam(obs)', '% Acc']
- assert np.isclose(parser.base.iloc[0,2], 1.94e-02)
+@pytest.mark.array_compare(file_format="pd_hdf")
+def test_reader_lines(si1_reader):
+ return si1_reader.lines
-@with_refdata
-def test_p2_osc(p2_osc_fname):
- parser = CMFGENOscillatorStrengthsParser(p2_osc_fname)
- n = int(parser.header['Number of transitions'])
- assert parser.base.shape[0] == n
- assert list(parser.base.columns) == ['label_lower', 'label_upper', 'f', 'A', 'Lam(A)', 'i', 'j', 'Lam(obs)', '% Acc']
- assert np.isnan(parser.base.iloc[0,7])
- assert np.isclose(parser.base.iloc[0,8], 3.)
- assert np.isnan(parser.base.iloc[1,7])
- assert np.isclose(parser.base.iloc[1,8], 25.)
- assert np.isclose(parser.base.iloc[2,7], 1532.51)
- assert np.isclose(parser.base.iloc[3,7], 1301.87)
@with_refdata
-def test_vi_osc(vi_osc_fname):
- parser = CMFGENOscillatorStrengthsParser(vi_osc_fname)
- assert parser.base.empty
+@pytest.mark.array_compare(file_format="pd_hdf")
+def test_reader_levels(si1_reader):
+ return si1_reader.levels
-@with_refdata
-def test_he2_col(he2_col_fname):
- parser = CMFGENCollisionalStrengthsParser(he2_col_fname)
- assert parser.base.shape[0] == 465
- assert parser.base.shape[1] == 11
- assert parser.base.iloc[-1,0] == '30___'
- assert parser.base.iloc[-1,1] == 'I'
@with_refdata
-def test_ariii_col(ariii_col_fname):
- parser = CMFGENCollisionalStrengthsParser(ariii_col_fname)
- n = int(parser.header['Number of transitions'])
- assert parser.base.shape == (n, 13)
+@pytest.mark.array_compare(file_format="pd_hdf")
+def test_reader_collisions(si1_reader):
+ return si1_reader.collisions
-@with_refdata
-def test_si2_pho(si2_pho_fname):
- parser = CMFGENPhoCrossSectionsParser(si2_pho_fname)
- n = int(parser.header['Number of energy levels'])
- m = int(parser.base[0].attrs['Number of cross-section points'])
- assert len(parser.base) == n
- assert parser.base[0].shape == (m, 2)
@with_refdata
-def test_coiv_pho(coiv_pho_fname):
- parser = CMFGENPhoCrossSectionsParser(coiv_pho_fname)
- n = int(parser.header['Number of energy levels'])
- assert len(parser.base) == n
- assert parser.base[0].shape == (3, 8)
+@pytest.mark.array_compare(file_format="pd_hdf")
+def test_reader_cross_sections_squeeze(si1_reader):
+ return si1_reader.cross_sections
@with_refdata
-def test_hyd_l(hyd_l_fname):
- parser = CMFGENHydLParser(hyd_l_fname)
- assert parser.header["Maximum principal quantum number"] == "30"
- assert parser.base.shape == (465, 97)
- assert parser.base.loc[(11, 3)].values[5] == -6.226968
- assert parser.base.loc[(21, 20)].values[2] == -10.3071
- assert_allclose(
- parser.base.columns[:4], [1.1 ** 0, 1.1 ** 1, 1.1 ** 2, 1.1 ** 3]
+@pytest.mark.array_compare(file_format="pd_hdf")
+def test_reader_ionization_energies(si1_reader):
+ return si1_reader.ionization_energies.to_frame()
+
+
+@pytest.mark.array_compare
+@pytest.mark.parametrize("threshold_energy_ryd", [0.053130732819562695])
+@pytest.mark.parametrize("fit_coeff_list", [[34.4452, 1.0, 2.0]])
+def test_get_seaton_phixs_table(threshold_energy_ryd, fit_coeff_list):
+ phixs_table = get_seaton_phixs_table(threshold_energy_ryd, *fit_coeff_list)
+ return phixs_table
+
+
+@pytest.mark.array_compare
+@pytest.mark.parametrize("hyd_gaunt_energy_grid_ryd", [{1: list(range(1, 3))}])
+@pytest.mark.parametrize("hyd_gaunt_factor", [{1: list(range(3, 6))}])
+@pytest.mark.parametrize("threshold_energy_ryd", [0.5])
+@pytest.mark.parametrize("n", [1])
+def test_get_hydrogenic_n_phixs_table(
+ hyd_gaunt_energy_grid_ryd, hyd_gaunt_factor, threshold_energy_ryd, n
+):
+ hydrogenic_n_phixs_table = get_hydrogenic_n_phixs_table(
+ hyd_gaunt_energy_grid_ryd, hyd_gaunt_factor, threshold_energy_ryd, n
)
-
-@with_refdata
-def test_gbf_n(gbf_n_fname):
- parser = CMFGENHydGauntBfParser(gbf_n_fname)
- assert parser.header["Maximum principal quantum number"] == "30"
- assert parser.base.shape == (30, 145)
- assert (
- round(parser.base.loc[3].values[3], 7) == 0.9433558
- ) # Rounding is needed as a result of undoing the unit conversion
- assert round(parser.base.loc[18].values[11], 7) == 1.008855
- assert_allclose(
- parser.base.columns[:4], [1.1 ** 0, 1.1 ** 1, 1.1 ** 2, 1.1 ** 3]
+ return hydrogenic_n_phixs_table
+
+
+@pytest.mark.array_compare
+@pytest.mark.parametrize("hyd_phixs_energy_grid_ryd", [{(4, 1): np.linspace(1, 3, 5)}])
+@pytest.mark.parametrize("hyd_phixs", [{(4, 1): np.linspace(1, 3, 5)}])
+@pytest.mark.parametrize("threshold_energy_ryd", [2])
+@pytest.mark.parametrize("n", [4])
+@pytest.mark.parametrize("l_start", [1])
+@pytest.mark.parametrize("l_end", [1])
+@pytest.mark.parametrize("nu_0", [0.2])
+def test_get_hydrogenic_nl_phixs_table(
+ hyd_phixs_energy_grid_ryd, hyd_phixs, threshold_energy_ryd, n, l_start, l_end, nu_0
+):
+ phixs_table = get_hydrogenic_nl_phixs_table(
+ hyd_phixs_energy_grid_ryd,
+ hyd_phixs,
+ threshold_energy_ryd,
+ n,
+ l_start,
+ l_end,
+ nu_0,
)
+ return phixs_table
+
+
+@pytest.mark.array_compare
+@pytest.mark.parametrize("threshold_energy_ryd", [2])
+@pytest.mark.parametrize("vars", [[3, 4, 5, 6, 7]])
+@pytest.mark.parametrize("n_points", [50])
+def test_get_opproject_phixs_table(threshold_energy_ryd, vars, n_points):
+ phixs_table = get_opproject_phixs_table(threshold_energy_ryd, *vars, n_points)
+ return phixs_table
+
+
+@pytest.mark.array_compare
+@pytest.mark.parametrize("threshold_energy_ryd", [2])
+@pytest.mark.parametrize("vars", [[2, 3, 4, 5, 6, 7, 8, 9]])
+@pytest.mark.parametrize("n_points", [50])
+def test_get_hummer_phixs_table(threshold_energy_ryd, vars, n_points):
+ phixs_table = get_hummer_phixs_table(threshold_energy_ryd, *vars, n_points)
+ return phixs_table
+
+
+@pytest.mark.array_compare
+@pytest.mark.parametrize("threshold_energy_ryd", [10])
+@pytest.mark.parametrize(
+ "fit_coeff_table",
+ [
+ pd.DataFrame.from_dict(
+ {
+ "E": [1, 2],
+ "E_0": [1, 2],
+ "P": [2, 2],
+ "l": [2, 2],
+ "sigma_0": [1, 2],
+ "y(a)": [1, 3],
+ "y(w)": [1, 4],
+ }
+ )
+ ],
+)
+@pytest.mark.parametrize("n_points", [50])
+def test_get_vy95_phixs_table(threshold_energy_ryd, fit_coeff_table, n_points):
+ phixs_table = get_vy95_phixs_table(threshold_energy_ryd, fit_coeff_table, n_points)
+ return phixs_table
-@with_refdata
-def test_reader_levels_shape(si1_reader):
- assert si1_reader.levels.shape == (157, 5)
-@with_refdata
-def test_reader_lines_shape(si1_reader):
- assert si1_reader.lines.shape == (4196, 6)
+@pytest.mark.skip(reason="Not implemented yet")
+def test_get_leibowitz_phixs_table():
+ pass
-@with_refdata
-def test_reader_levels_head(si1_reader, si2_levels_head_df):
- assert_frame_equal(si1_reader.levels.head(5).reset_index(drop=True),
- si2_levels_head_df)
-@with_refdata
-def test_reader_lines_head(si1_reader, si2_lines_head_df):
- assert_frame_equal(si1_reader.lines.head(5).reset_index(drop=True),
- si2_lines_head_df)
-
-@with_refdata
-def test_reader_col_head(si1_reader, si2_col_head_df):
- assert_frame_equal(si1_reader.collisions.head(5).reset_index(drop=True),
- si2_col_head_df)
+@pytest.mark.array_compare
+@pytest.mark.parametrize("threshold_energy_ryd", [50])
+def test_get_null_phixs_table(threshold_energy_ryd):
+ phixs_table = get_null_phixs_table(threshold_energy_ryd)
+ return phixs_table
diff --git a/carsus_env3.yml b/carsus_env3.yml
index 2dc432dee..5c9284929 100644
--- a/carsus_env3.yml
+++ b/carsus_env3.yml
@@ -4,31 +4,30 @@ channels:
- conda-forge
dependencies:
- - python=3.6
+ - python =3.7
- setuptools
- setuptools_scm
- pip
- - numpy=1.15
- - pandas=1.0
- - astropy=3
- - chiantipy=0.8.4
- - typing-extensions=4.1 # https://github.com/python/typing/issues/1158
+ - numpy =1.15
+ - pandas =1.0
+ - astropy =3
+ - chiantipy =0.8.4
# I/O
- pyyaml
- uncertainties
- - pyparsing=2.2
- - sqlalchemy=1.0
+ - pyparsing =2.2
+ - sqlalchemy =1.2
- beautifulsoup4
- html5lib
- h5py
- pytables
- - pyarrow=0.14.1
- - glog=0.5 # https://github.com/google/glog/issues/814
+ - pyarrow =0.14.1
+ - glog =0.5 # https://github.com/google/glog/issues/814
- requests
- roman
-# --- Not required for conda-forge package ---
+# --- Not required for an hypothetical conda-forge package ---
# Analysis
- notebook
@@ -50,13 +49,10 @@ dependencies:
- pandoc
# Test/Coverage
- - pytest=4
+ - pytest =4
- pytest-cov
- pytest-astropy
-
- # ChiantiPy
- - scipy
- - ipyparallel
+ - epassaro::pytest-arraydiff
# Other
- git-lfs
diff --git a/docs/development/compare_atomic_files.ipynb b/docs/development/compare_atomic_files.ipynb
index 57f23b392..50e536d3c 100644
--- a/docs/development/compare_atomic_files.ipynb
+++ b/docs/development/compare_atomic_files.ipynb
@@ -6,279 +6,14756 @@
"source": [
"# Compare Atomic Files\n",
"\n",
- "This notebook shows how to compare the `levels_prepared` and `lines_prepared` DataFrames of the atomic files generated by Carsus.\n",
"\n",
- "\n",
- "Let's create two different TARDIS atomic files to use as examples."
+ "This notebook shows how to compare atomic files generated by Carsus."
]
},
{
"cell_type": "code",
- "execution_count": null,
- "metadata": {},
+ "execution_count": 20,
+ "metadata": {
+ "ExecuteTime": {
+ "end_time": "2022-10-19T08:24:10.056502Z",
+ "start_time": "2022-10-19T08:24:10.049836Z"
+ }
+ },
+ "outputs": [],
+ "source": [
+ "import os\n",
+ "import logging\n",
+ "from carsus.io import AtomDataCompare"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 21,
+ "metadata": {
+ "ExecuteTime": {
+ "end_time": "2022-10-19T08:24:10.203221Z",
+ "start_time": "2022-10-19T08:24:10.198932Z"
+ }
+ },
"outputs": [],
"source": [
- "from carsus.io.nist import NISTWeightsComp, NISTIonizationEnergies\n",
- "from carsus.io.kurucz import GFALLReader\n",
- "from carsus.io.zeta import KnoxLongZeta\n",
- "from carsus.io.chianti_ import ChiantiReader\n",
- "from carsus.io.output import TARDISAtomData"
+ "ATOM1_PATH = os.environ.get(\"ATOM1_PATH\", None)\n",
+ "ATOM2_PATH = os.environ.get(\"ATOM2_PATH\", None)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 23,
+ "metadata": {
+ "ExecuteTime": {
+ "end_time": "2022-10-19T08:24:19.499649Z",
+ "start_time": "2022-10-19T08:24:19.411768Z"
+ },
+ "scrolled": true
+ },
+ "outputs": [],
+ "source": [
+ "atc = AtomDataCompare(ATOM1_PATH, ATOM2_PATH)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
- "For the first atomic file we grab species `H-C` from GFALL and `H-He` from Chianti."
+ "A brief overview of what keys match can be seen using the comparison table."
]
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 24,
+ "metadata": {
+ "ExecuteTime": {
+ "end_time": "2022-10-19T08:29:05.309556Z",
+ "start_time": "2022-10-19T08:29:04.029450Z"
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "
exists_1 exists_2 match \n",
+ " \n",
+ " atom_data \n",
+ " True \n",
+ " True \n",
+ " False \n",
+ " \n",
+ " \n",
+ " collision_data_temperatures \n",
+ " False \n",
+ " True \n",
+ " False \n",
+ " \n",
+ " \n",
+ " collisions \n",
+ " False \n",
+ " True \n",
+ " False \n",
+ " \n",
+ " \n",
+ " ionization_data \n",
+ " True \n",
+ " True \n",
+ " False \n",
+ " \n",
+ " \n",
+ " levels \n",
+ " True \n",
+ " True \n",
+ " False \n",
+ " \n",
+ " \n",
+ " lines \n",
+ " True \n",
+ " True \n",
+ " False \n",
+ " \n",
+ " \n",
+ " macro_atom_data \n",
+ " True \n",
+ " True \n",
+ " False \n",
+ " \n",
+ " \n",
+ " macro_atom_references \n",
+ " True \n",
+ " True \n",
+ " False \n",
+ " \n",
+ " \n",
+ " metadata \n",
+ " True \n",
+ " False \n",
+ " False \n",
+ " \n",
+ " \n",
+ " zeta_data \n",
+ " True \n",
+ " True \n",
+ " True \n",
+ " \n",
+ "
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 24,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "atc.compare()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
"metadata": {},
- "outputs": [],
"source": [
- "atomic_weights = NISTWeightsComp()\n",
- "ionization_energies = NISTIonizationEnergies('H-C')\n",
- "gfall_reader = GFALLReader(ions='H-C')\n",
- "chianti_reader = ChiantiReader(ions='H-He', collisions=True, priority=20)\n",
- "zeta_data = KnoxLongZeta()"
+ "One can investigate further into the difference between the dataframes using the `key_diff` method. The `key_diff` method currently supports differentiating `levels`, `lines` and the `collisions` dataframes."
]
},
{
"cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
+ "execution_count": 6,
+ "metadata": {
+ "ExecuteTime": {
+ "end_time": "2022-10-19T08:22:28.873130Z",
+ "start_time": "2022-10-19T08:22:22.458457Z"
+ },
+ "scrolled": true
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ " total_rows not_matches_energy not_matches_g not_matches_metastable atomic_number ion_number \n",
+ " \n",
+ " 3 \n",
+ " 0 \n",
+ " 67 \n",
+ " 8 \n",
+ " 4 \n",
+ " 2 \n",
+ " \n",
+ " \n",
+ " 6 \n",
+ " 0 \n",
+ " 829 \n",
+ " 825 \n",
+ " 652 \n",
+ " 29 \n",
+ " \n",
+ " \n",
+ " 1 \n",
+ " 85 \n",
+ " 57 \n",
+ " 57 \n",
+ " 1 \n",
+ " \n",
+ " \n",
+ " 2 \n",
+ " 79 \n",
+ " 68 \n",
+ " 51 \n",
+ " 2 \n",
+ " \n",
+ " \n",
+ " 7 \n",
+ " 0 \n",
+ " 276 \n",
+ " 265 \n",
+ " 202 \n",
+ " 4 \n",
+ " \n",
+ " \n",
+ " 1 \n",
+ " 152 \n",
+ " 137 \n",
+ " 125 \n",
+ " 1 \n",
+ " \n",
+ " \n",
+ " 2 \n",
+ " 89 \n",
+ " 67 \n",
+ " 50 \n",
+ " 11 \n",
+ " \n",
+ " \n",
+ " 8 \n",
+ " 2 \n",
+ " 137 \n",
+ " 131 \n",
+ " 92 \n",
+ " 4 \n",
+ " \n",
+ " \n",
+ " 3 \n",
+ " 137 \n",
+ " 131 \n",
+ " 103 \n",
+ " 19 \n",
+ " \n",
+ " \n",
+ " 9 \n",
+ " 0 \n",
+ " 117 \n",
+ " 100 \n",
+ " 72 \n",
+ " 1 \n",
+ " \n",
+ " \n",
+ " 1 \n",
+ " 163 \n",
+ " 144 \n",
+ " 115 \n",
+ " 22 \n",
+ " \n",
+ " \n",
+ " 2 \n",
+ " 242 \n",
+ " 230 \n",
+ " 198 \n",
+ " 15 \n",
+ " \n",
+ " \n",
+ " 3 \n",
+ " 136 \n",
+ " 123 \n",
+ " 117 \n",
+ " 1 \n",
+ " \n",
+ " \n",
+ " 4 \n",
+ " 90 \n",
+ " 73 \n",
+ " 55 \n",
+ " 2 \n",
+ " \n",
+ " \n",
+ " 10 \n",
+ " 0 \n",
+ " 264 \n",
+ " 217 \n",
+ " 163 \n",
+ " 20 \n",
+ " \n",
+ " \n",
+ " 1 \n",
+ " 279 \n",
+ " 251 \n",
+ " 215 \n",
+ " 4 \n",
+ " \n",
+ " \n",
+ " 2 \n",
+ " 61 \n",
+ " 49 \n",
+ " 46 \n",
+ " 3 \n",
+ " \n",
+ " \n",
+ " 3 \n",
+ " 95 \n",
+ " 93 \n",
+ " 65 \n",
+ " 10 \n",
+ " \n",
+ " \n",
+ " 4 \n",
+ " 60 \n",
+ " 24 \n",
+ " 16 \n",
+ " 4 \n",
+ " \n",
+ " \n",
+ " 11 \n",
+ " 4 \n",
+ " 66 \n",
+ " 57 \n",
+ " 44 \n",
+ " 5 \n",
+ " \n",
+ " \n",
+ " 12 \n",
+ " 0 \n",
+ " 539 \n",
+ " 516 \n",
+ " 415 \n",
+ " 56 \n",
+ " \n",
+ " \n",
+ " 13 \n",
+ " 0 \n",
+ " 272 \n",
+ " 232 \n",
+ " 264 \n",
+ " 58 \n",
+ " \n",
+ " \n",
+ " 1 \n",
+ " 192 \n",
+ " 138 \n",
+ " 123 \n",
+ " 5 \n",
+ " \n",
+ " \n",
+ " 14 \n",
+ " 0 \n",
+ " 539 \n",
+ " 485 \n",
+ " 380 \n",
+ " 110 \n",
+ " \n",
+ " \n",
+ " 1 \n",
+ " 96 \n",
+ " 86 \n",
+ " 70 \n",
+ " 12 \n",
+ " \n",
+ " \n",
+ " 2 \n",
+ " 163 \n",
+ " 135 \n",
+ " 122 \n",
+ " 6 \n",
+ " \n",
+ " \n",
+ " 15 \n",
+ " 0 \n",
+ " 230 \n",
+ " 204 \n",
+ " 163 \n",
+ " 13 \n",
+ " \n",
+ " \n",
+ " 1 \n",
+ " 91 \n",
+ " 74 \n",
+ " 60 \n",
+ " 5 \n",
+ " \n",
+ " \n",
+ " 3 \n",
+ " 50 \n",
+ " 39 \n",
+ " 33 \n",
+ " 5 \n",
+ " \n",
+ " \n",
+ " 16 \n",
+ " 0 \n",
+ " 150 \n",
+ " 51 \n",
+ " 54 \n",
+ " 3 \n",
+ " \n",
+ " \n",
+ " 1 \n",
+ " 84 \n",
+ " 72 \n",
+ " 64 \n",
+ " 3 \n",
+ " \n",
+ " \n",
+ " 2 \n",
+ " 41 \n",
+ " 26 \n",
+ " 21 \n",
+ " 14 \n",
+ " \n",
+ " \n",
+ " 17 \n",
+ " 0 \n",
+ " 209 \n",
+ " 193 \n",
+ " 164 \n",
+ " 20 \n",
+ " \n",
+ " \n",
+ " 1 \n",
+ " 124 \n",
+ " 83 \n",
+ " 67 \n",
+ " 4 \n",
+ " \n",
+ " \n",
+ " 18 \n",
+ " 0 \n",
+ " 211 \n",
+ " 205 \n",
+ " 161 \n",
+ " 8 \n",
+ " \n",
+ " \n",
+ " 1 \n",
+ " 306 \n",
+ " 301 \n",
+ " 254 \n",
+ " 10 \n",
+ " \n",
+ " \n",
+ " 3 \n",
+ " 37 \n",
+ " 18 \n",
+ " 11 \n",
+ " 2 \n",
+ " \n",
+ " \n",
+ " 4 \n",
+ " 21 \n",
+ " 15 \n",
+ " 14 \n",
+ " 1 \n",
+ " \n",
+ " \n",
+ " 19 \n",
+ " 2 \n",
+ " 38 \n",
+ " 19 \n",
+ " 14 \n",
+ " 2 \n",
+ " \n",
+ " \n",
+ " 21 \n",
+ " 3 \n",
+ " 125 \n",
+ " 1 \n",
+ " 4 \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ " 25 \n",
+ " 0 \n",
+ " 321 \n",
+ " 248 \n",
+ " 255 \n",
+ " 5 \n",
+ " \n",
+ " \n",
+ " 29 \n",
+ " 1 \n",
+ " 245 \n",
+ " 102 \n",
+ " 95 \n",
+ " 3 \n",
+ " \n",
+ " \n",
+ " 30 \n",
+ " 2 \n",
+ " 250 \n",
+ " 204 \n",
+ " 171 \n",
+ " 27 \n",
+ " \n",
+ "
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 6,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
"source": [
- "atom_data_a = TARDISAtomData(atomic_weights,\n",
- " ionization_energies,\n",
- " gfall_reader,\n",
- " zeta_data,\n",
- " chianti_reader)"
+ "atc.key_diff(\"levels\")"
]
},
{
"cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
+ "execution_count": 7,
+ "metadata": {
+ "ExecuteTime": {
+ "end_time": "2022-10-19T08:22:56.466013Z",
+ "start_time": "2022-10-19T08:22:48.131462Z"
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ " total_rows not_matches_line_id not_matches_wavelength not_matches_f_ul not_matches_f_lu not_matches_nu not_matches_B_lu not_matches_B_ul not_matches_A_ul atomic_number ion_number \n",
+ " \n",
+ " 1 \n",
+ " 0 \n",
+ " 74 \n",
+ " 74 \n",
+ " 74 \n",
+ " 0 \n",
+ " 0 \n",
+ " 74 \n",
+ " 74 \n",
+ " 74 \n",
+ " 74 \n",
+ " \n",
+ " \n",
+ " 2 \n",
+ " 0 \n",
+ " 174 \n",
+ " 174 \n",
+ " 171 \n",
+ " 0 \n",
+ " 0 \n",
+ " 171 \n",
+ " 171 \n",
+ " 171 \n",
+ " 171 \n",
+ " \n",
+ " \n",
+ " 1 \n",
+ " 67 \n",
+ " 67 \n",
+ " 61 \n",
+ " 0 \n",
+ " 0 \n",
+ " 61 \n",
+ " 61 \n",
+ " 61 \n",
+ " 61 \n",
+ " \n",
+ " \n",
+ " 3 \n",
+ " 0 \n",
+ " 370 \n",
+ " 187 \n",
+ " 40 \n",
+ " 50 \n",
+ " 50 \n",
+ " 40 \n",
+ " 50 \n",
+ " 50 \n",
+ " 50 \n",
+ " \n",
+ " \n",
+ " 1 \n",
+ " 135 \n",
+ " 47 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ " 4 \n",
+ " 0 \n",
+ " 39 \n",
+ " 8 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ " 1 \n",
+ " 185 \n",
+ " 31 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ " 2 \n",
+ " 27 \n",
+ " 8 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ " 5 \n",
+ " 0 \n",
+ " 87 \n",
+ " 22 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ " 1 \n",
+ " 43 \n",
+ " 11 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ " 2 \n",
+ " 100 \n",
+ " 13 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ " 6 \n",
+ " 0 \n",
+ " 585 \n",
+ " 585 \n",
+ " 585 \n",
+ " 583 \n",
+ " 584 \n",
+ " 585 \n",
+ " 585 \n",
+ " 585 \n",
+ " 585 \n",
+ " \n",
+ " \n",
+ " 1 \n",
+ " 156 \n",
+ " 123 \n",
+ " 111 \n",
+ " 131 \n",
+ " 126 \n",
+ " 111 \n",
+ " 131 \n",
+ " 131 \n",
+ " 131 \n",
+ " \n",
+ " \n",
+ " 2 \n",
+ " 84 \n",
+ " 74 \n",
+ " 74 \n",
+ " 75 \n",
+ " 75 \n",
+ " 74 \n",
+ " 75 \n",
+ " 75 \n",
+ " 75 \n",
+ " \n",
+ " \n",
+ " 3 \n",
+ " 200 \n",
+ " 18 \n",
+ " 0 \n",
+ " 8 \n",
+ " 8 \n",
+ " 0 \n",
+ " 8 \n",
+ " 8 \n",
+ " 8 \n",
+ " \n",
+ " \n",
+ " 7 \n",
+ " 0 \n",
+ " 1093 \n",
+ " 1082 \n",
+ " 1082 \n",
+ " 1081 \n",
+ " 1082 \n",
+ " 1082 \n",
+ " 1082 \n",
+ " 1082 \n",
+ " 1082 \n",
+ " \n",
+ " \n",
+ " 1 \n",
+ " 427 \n",
+ " 415 \n",
+ " 415 \n",
+ " 415 \n",
+ " 414 \n",
+ " 415 \n",
+ " 415 \n",
+ " 415 \n",
+ " 415 \n",
+ " \n",
+ " \n",
+ " 2 \n",
+ " 65 \n",
+ " 13 \n",
+ " 13 \n",
+ " 13 \n",
+ " 13 \n",
+ " 13 \n",
+ " 13 \n",
+ " 13 \n",
+ " 13 \n",
+ " \n",
+ " \n",
+ " 3 \n",
+ " 404 \n",
+ " 26 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ " 4 \n",
+ " 229 \n",
+ " 6 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ " 5 \n",
+ " 24 \n",
+ " 12 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ " 8 \n",
+ " 0 \n",
+ " 854 \n",
+ " 399 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ " 1 \n",
+ " 1376 \n",
+ " 126 \n",
+ " 0 \n",
+ " 2 \n",
+ " 2 \n",
+ " 0 \n",
+ " 2 \n",
+ " 2 \n",
+ " 2 \n",
+ " \n",
+ " \n",
+ " 2 \n",
+ " 93 \n",
+ " 92 \n",
+ " 92 \n",
+ " 92 \n",
+ " 92 \n",
+ " 92 \n",
+ " 92 \n",
+ " 92 \n",
+ " 92 \n",
+ " \n",
+ " \n",
+ " 3 \n",
+ " 27 \n",
+ " 27 \n",
+ " 27 \n",
+ " 27 \n",
+ " 27 \n",
+ " 27 \n",
+ " 27 \n",
+ " 27 \n",
+ " 27 \n",
+ " \n",
+ " \n",
+ " 4 \n",
+ " 459 \n",
+ " 25 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ " 5 \n",
+ " 214 \n",
+ " 55 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ " 9 \n",
+ " 0 \n",
+ " 506 \n",
+ " 474 \n",
+ " 474 \n",
+ " 473 \n",
+ " 471 \n",
+ " 474 \n",
+ " 474 \n",
+ " 474 \n",
+ " 474 \n",
+ " \n",
+ " \n",
+ " 1 \n",
+ " 86 \n",
+ " 71 \n",
+ " 71 \n",
+ " 71 \n",
+ " 71 \n",
+ " 71 \n",
+ " 71 \n",
+ " 71 \n",
+ " 71 \n",
+ " \n",
+ " \n",
+ " 2 \n",
+ " 446 \n",
+ " 430 \n",
+ " 430 \n",
+ " 430 \n",
+ " 430 \n",
+ " 430 \n",
+ " 430 \n",
+ " 430 \n",
+ " 430 \n",
+ " \n",
+ " \n",
+ " 3 \n",
+ " 250 \n",
+ " 247 \n",
+ " 247 \n",
+ " 249 \n",
+ " 249 \n",
+ " 247 \n",
+ " 249 \n",
+ " 249 \n",
+ " 249 \n",
+ " \n",
+ " \n",
+ " 4 \n",
+ " 58 \n",
+ " 27 \n",
+ " 27 \n",
+ " 27 \n",
+ " 27 \n",
+ " 27 \n",
+ " 27 \n",
+ " 27 \n",
+ " 27 \n",
+ " \n",
+ " \n",
+ " 10 \n",
+ " 0 \n",
+ " 436 \n",
+ " 134 \n",
+ " 134 \n",
+ " 134 \n",
+ " 134 \n",
+ " 134 \n",
+ " 134 \n",
+ " 134 \n",
+ " 134 \n",
+ " \n",
+ " \n",
+ " 1 \n",
+ " 852 \n",
+ " 799 \n",
+ " 799 \n",
+ " 799 \n",
+ " 798 \n",
+ " 799 \n",
+ " 799 \n",
+ " 799 \n",
+ " 799 \n",
+ " \n",
+ " \n",
+ " 2 \n",
+ " 50 \n",
+ " 37 \n",
+ " 37 \n",
+ " 37 \n",
+ " 37 \n",
+ " 37 \n",
+ " 37 \n",
+ " 37 \n",
+ " 37 \n",
+ " \n",
+ " \n",
+ " 3 \n",
+ " 44 \n",
+ " 44 \n",
+ " 44 \n",
+ " 44 \n",
+ " 44 \n",
+ " 44 \n",
+ " 44 \n",
+ " 44 \n",
+ " 44 \n",
+ " \n",
+ " \n",
+ " 4 \n",
+ " 103 \n",
+ " 21 \n",
+ " 17 \n",
+ " 17 \n",
+ " 17 \n",
+ " 17 \n",
+ " 17 \n",
+ " 17 \n",
+ " 17 \n",
+ " \n",
+ " \n",
+ " 5 \n",
+ " 49 \n",
+ " 2 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ " 11 \n",
+ " 0 \n",
+ " 342 \n",
+ " 305 \n",
+ " 10 \n",
+ " 0 \n",
+ " 0 \n",
+ " 10 \n",
+ " 10 \n",
+ " 10 \n",
+ " 10 \n",
+ " \n",
+ " \n",
+ " 1 \n",
+ " 171 \n",
+ " 171 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ " 2 \n",
+ " 353 \n",
+ " 353 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ " 3 \n",
+ " 110 \n",
+ " 110 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ " 4 \n",
+ " 112 \n",
+ " 106 \n",
+ " 106 \n",
+ " 106 \n",
+ " 105 \n",
+ " 106 \n",
+ " 106 \n",
+ " 106 \n",
+ " 106 \n",
+ " \n",
+ " \n",
+ " 5 \n",
+ " 375 \n",
+ " 375 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ " 12 \n",
+ " 0 \n",
+ " 375 \n",
+ " 371 \n",
+ " 325 \n",
+ " 324 \n",
+ " 325 \n",
+ " 325 \n",
+ " 325 \n",
+ " 325 \n",
+ " 325 \n",
+ " \n",
+ " \n",
+ " 1 \n",
+ " 516 \n",
+ " 516 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ " 2 \n",
+ " 704 \n",
+ " 704 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ " 3 \n",
+ " 169 \n",
+ " 169 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ " 4 \n",
+ " 132 \n",
+ " 132 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ " 5 \n",
+ " 180 \n",
+ " 180 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ " 13 \n",
+ " 0 \n",
+ " 172 \n",
+ " 171 \n",
+ " 172 \n",
+ " 172 \n",
+ " 172 \n",
+ " 172 \n",
+ " 172 \n",
+ " 172 \n",
+ " 172 \n",
+ " \n",
+ " \n",
+ " 1 \n",
+ " 674 \n",
+ " 654 \n",
+ " 438 \n",
+ " 444 \n",
+ " 444 \n",
+ " 438 \n",
+ " 444 \n",
+ " 444 \n",
+ " 444 \n",
+ " \n",
+ " \n",
+ " 2 \n",
+ " 342 \n",
+ " 342 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ " 3 \n",
+ " 142 \n",
+ " 142 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ " 4 \n",
+ " 77 \n",
+ " 77 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ " 5 \n",
+ " 93 \n",
+ " 93 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ " 14 \n",
+ " 0 \n",
+ " 1009 \n",
+ " 1002 \n",
+ " 727 \n",
+ " 726 \n",
+ " 723 \n",
+ " 727 \n",
+ " 727 \n",
+ " 727 \n",
+ " 727 \n",
+ " \n",
+ " \n",
+ " 1 \n",
+ " 71 \n",
+ " 70 \n",
+ " 62 \n",
+ " 62 \n",
+ " 62 \n",
+ " 62 \n",
+ " 62 \n",
+ " 62 \n",
+ " 62 \n",
+ " \n",
+ " \n",
+ " 2 \n",
+ " 293 \n",
+ " 291 \n",
+ " 232 \n",
+ " 232 \n",
+ " 232 \n",
+ " 232 \n",
+ " 232 \n",
+ " 232 \n",
+ " 232 \n",
+ " \n",
+ " \n",
+ " 3 \n",
+ " 307 \n",
+ " 307 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ " 4 \n",
+ " 125 \n",
+ " 125 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ " 5 \n",
+ " 49 \n",
+ " 49 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ " 15 \n",
+ " 0 \n",
+ " 185 \n",
+ " 183 \n",
+ " 121 \n",
+ " 119 \n",
+ " 115 \n",
+ " 121 \n",
+ " 121 \n",
+ " 121 \n",
+ " 121 \n",
+ " \n",
+ " \n",
+ " 1 \n",
+ " 299 \n",
+ " 291 \n",
+ " 277 \n",
+ " 276 \n",
+ " 275 \n",
+ " 277 \n",
+ " 277 \n",
+ " 277 \n",
+ " 277 \n",
+ " \n",
+ " \n",
+ " 2 \n",
+ " 151 \n",
+ " 151 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ " 3 \n",
+ " 45 \n",
+ " 45 \n",
+ " 36 \n",
+ " 39 \n",
+ " 39 \n",
+ " 36 \n",
+ " 39 \n",
+ " 39 \n",
+ " 39 \n",
+ " \n",
+ " \n",
+ " 4 \n",
+ " 215 \n",
+ " 215 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ " 5 \n",
+ " 9 \n",
+ " 9 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ " 16 \n",
+ " 0 \n",
+ " 361 \n",
+ " 361 \n",
+ " 2 \n",
+ " 4 \n",
+ " 4 \n",
+ " 2 \n",
+ " 4 \n",
+ " 4 \n",
+ " 4 \n",
+ " \n",
+ " \n",
+ " 1 \n",
+ " 198 \n",
+ " 197 \n",
+ " 186 \n",
+ " 186 \n",
+ " 186 \n",
+ " 186 \n",
+ " 186 \n",
+ " 186 \n",
+ " 186 \n",
+ " \n",
+ " \n",
+ " 2 \n",
+ " 44 \n",
+ " 41 \n",
+ " 19 \n",
+ " 19 \n",
+ " 19 \n",
+ " 19 \n",
+ " 19 \n",
+ " 19 \n",
+ " 19 \n",
+ " \n",
+ " \n",
+ " 3 \n",
+ " 50 \n",
+ " 50 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ " 4 \n",
+ " 41 \n",
+ " 41 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ " 5 \n",
+ " 150 \n",
+ " 150 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ " 17 \n",
+ " 0 \n",
+ " 363 \n",
+ " 362 \n",
+ " 336 \n",
+ " 336 \n",
+ " 336 \n",
+ " 336 \n",
+ " 336 \n",
+ " 336 \n",
+ " 336 \n",
+ " \n",
+ " \n",
+ " 1 \n",
+ " 322 \n",
+ " 320 \n",
+ " 224 \n",
+ " 230 \n",
+ " 230 \n",
+ " 224 \n",
+ " 230 \n",
+ " 230 \n",
+ " 230 \n",
+ " \n",
+ " \n",
+ " 2 \n",
+ " 431 \n",
+ " 431 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ " 3 \n",
+ " 121 \n",
+ " 121 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ " 4 \n",
+ " 43 \n",
+ " 43 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ " 18 \n",
+ " 0 \n",
+ " 630 \n",
+ " 627 \n",
+ " 628 \n",
+ " 626 \n",
+ " 627 \n",
+ " 628 \n",
+ " 628 \n",
+ " 628 \n",
+ " 628 \n",
+ " \n",
+ " \n",
+ " 1 \n",
+ " 779 \n",
+ " 778 \n",
+ " 633 \n",
+ " 766 \n",
+ " 779 \n",
+ " 633 \n",
+ " 779 \n",
+ " 766 \n",
+ " 766 \n",
+ " \n",
+ " \n",
+ " 2 \n",
+ " 675 \n",
+ " 675 \n",
+ " 0 \n",
+ " 20 \n",
+ " 20 \n",
+ " 0 \n",
+ " 20 \n",
+ " 20 \n",
+ " 20 \n",
+ " \n",
+ " \n",
+ " 3 \n",
+ " 65 \n",
+ " 63 \n",
+ " 30 \n",
+ " 30 \n",
+ " 30 \n",
+ " 30 \n",
+ " 30 \n",
+ " 30 \n",
+ " 30 \n",
+ " \n",
+ " \n",
+ " 4 \n",
+ " 30 \n",
+ " 27 \n",
+ " 29 \n",
+ " 30 \n",
+ " 30 \n",
+ " 29 \n",
+ " 30 \n",
+ " 30 \n",
+ " 30 \n",
+ " \n",
+ " \n",
+ " 19 \n",
+ " 0 \n",
+ " 603 \n",
+ " 603 \n",
+ " 30 \n",
+ " 0 \n",
+ " 0 \n",
+ " 30 \n",
+ " 30 \n",
+ " 30 \n",
+ " 30 \n",
+ " \n",
+ " \n",
+ " 1 \n",
+ " 66 \n",
+ " 66 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ " 2 \n",
+ " 99 \n",
+ " 98 \n",
+ " 57 \n",
+ " 57 \n",
+ " 57 \n",
+ " 57 \n",
+ " 57 \n",
+ " 57 \n",
+ " 57 \n",
+ " \n",
+ " \n",
+ " 3 \n",
+ " 57 \n",
+ " 57 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ " 4 \n",
+ " 75 \n",
+ " 75 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ " 20 \n",
+ " 0 \n",
+ " 2906 \n",
+ " 2906 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ " 1 \n",
+ " 752 \n",
+ " 752 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ " 2 \n",
+ " 1766 \n",
+ " 1766 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ " 3 \n",
+ " 122 \n",
+ " 122 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ " 4 \n",
+ " 91 \n",
+ " 91 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ " 5 \n",
+ " 37 \n",
+ " 37 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ " 6 \n",
+ " 59 \n",
+ " 59 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ " 7 \n",
+ " 100 \n",
+ " 100 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ " 8 \n",
+ " 422 \n",
+ " 422 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ " 21 \n",
+ " 0 \n",
+ " 4221 \n",
+ " 4221 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ " 1 \n",
+ " 2215 \n",
+ " 2215 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ " 2 \n",
+ " 217 \n",
+ " 217 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ " 3 \n",
+ " 942 \n",
+ " 942 \n",
+ " 0 \n",
+ " 7 \n",
+ " 7 \n",
+ " 0 \n",
+ " 7 \n",
+ " 7 \n",
+ " 7 \n",
+ " \n",
+ " \n",
+ " 4 \n",
+ " 29 \n",
+ " 29 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ " 5 \n",
+ " 89 \n",
+ " 89 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ " 6 \n",
+ " 41 \n",
+ " 41 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ " 7 \n",
+ " 60 \n",
+ " 60 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ " 8 \n",
+ " 52 \n",
+ " 52 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ " 22 \n",
+ " 0 \n",
+ " 8771 \n",
+ " 8771 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ " 1 \n",
+ " 2597 \n",
+ " 2597 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ " 2 \n",
+ " 2289 \n",
+ " 2289 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ " 3 \n",
+ " 139 \n",
+ " 139 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ " 4 \n",
+ " 331 \n",
+ " 331 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ " 5 \n",
+ " 60 \n",
+ " 60 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ " 6 \n",
+ " 119 \n",
+ " 119 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ " 7 \n",
+ " 40 \n",
+ " 40 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ " 8 \n",
+ " 67 \n",
+ " 67 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ " 23 \n",
+ " 0 \n",
+ " 6995 \n",
+ " 6995 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ " 1 \n",
+ " 4545 \n",
+ " 4545 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ " 2 \n",
+ " 5304 \n",
+ " 5304 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ " 3 \n",
+ " 995 \n",
+ " 995 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ " 4 \n",
+ " 335 \n",
+ " 335 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ " 5 \n",
+ " 372 \n",
+ " 372 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ " 6 \n",
+ " 32 \n",
+ " 32 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ " 7 \n",
+ " 77 \n",
+ " 77 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ " 8 \n",
+ " 33 \n",
+ " 33 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ " 24 \n",
+ " 0 \n",
+ " 4172 \n",
+ " 4172 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ " 1 \n",
+ " 17224 \n",
+ " 17224 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ " 2 \n",
+ " 2122 \n",
+ " 2122 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ " 3 \n",
+ " 1717 \n",
+ " 1717 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ " 4 \n",
+ " 220 \n",
+ " 220 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ " 5 \n",
+ " 255 \n",
+ " 255 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ " 6 \n",
+ " 421 \n",
+ " 421 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ " 7 \n",
+ " 31 \n",
+ " 31 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ " 8 \n",
+ " 67 \n",
+ " 67 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ " 25 \n",
+ " 0 \n",
+ " 1078 \n",
+ " 1076 \n",
+ " 991 \n",
+ " 1044 \n",
+ " 1044 \n",
+ " 991 \n",
+ " 1044 \n",
+ " 1044 \n",
+ " 1044 \n",
+ " \n",
+ " \n",
+ " 1 \n",
+ " 8362 \n",
+ " 8362 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ " 2 \n",
+ " 5848 \n",
+ " 5848 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ " 3 \n",
+ " 677 \n",
+ " 677 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ " 4 \n",
+ " 602 \n",
+ " 602 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ " 5 \n",
+ " 1009 \n",
+ " 1009 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ " 6 \n",
+ " 58 \n",
+ " 58 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ " 7 \n",
+ " 97 \n",
+ " 97 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ " 8 \n",
+ " 5 \n",
+ " 5 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ " 26 \n",
+ " 0 \n",
+ " 22905 \n",
+ " 22905 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ " 1 \n",
+ " 21753 \n",
+ " 21753 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ " 2 \n",
+ " 9860 \n",
+ " 9860 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ " 3 \n",
+ " 3559 \n",
+ " 3559 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ " 4 \n",
+ " 1865 \n",
+ " 1865 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ " 5 \n",
+ " 660 \n",
+ " 660 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ " 6 \n",
+ " 477 \n",
+ " 477 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ " 7 \n",
+ " 59 \n",
+ " 59 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ " 8 \n",
+ " 109 \n",
+ " 109 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ " 27 \n",
+ " 0 \n",
+ " 5298 \n",
+ " 5298 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ " 1 \n",
+ " 2853 \n",
+ " 2853 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ " 2 \n",
+ " 2247 \n",
+ " 2247 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ " 3 \n",
+ " 4092 \n",
+ " 4092 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ " 4 \n",
+ " 3542 \n",
+ " 3542 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ " 5 \n",
+ " 1907 \n",
+ " 1907 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ " 6 \n",
+ " 289 \n",
+ " 289 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ " 7 \n",
+ " 234 \n",
+ " 234 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ " 8 \n",
+ " 48 \n",
+ " 48 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ " 28 \n",
+ " 0 \n",
+ " 2671 \n",
+ " 2671 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ " 1 \n",
+ " 17150 \n",
+ " 17150 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ " 2 \n",
+ " 5456 \n",
+ " 5456 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ " 3 \n",
+ " 2712 \n",
+ " 2712 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ " 4 \n",
+ " 4733 \n",
+ " 4733 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ " 6 \n",
+ " 174 \n",
+ " 174 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ " 7 \n",
+ " 153 \n",
+ " 153 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ " 8 \n",
+ " 66 \n",
+ " 66 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ " 29 \n",
+ " 0 \n",
+ " 253 \n",
+ " 253 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ " 1 \n",
+ " 1640 \n",
+ " 1639 \n",
+ " 555 \n",
+ " 555 \n",
+ " 555 \n",
+ " 555 \n",
+ " 555 \n",
+ " 555 \n",
+ " 555 \n",
+ " \n",
+ " \n",
+ " 30 \n",
+ " 0 \n",
+ " 98 \n",
+ " 98 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ " 1 \n",
+ " 6 \n",
+ " 6 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " 0 \n",
+ " \n",
+ " \n",
+ " 2 \n",
+ " 427 \n",
+ " 426 \n",
+ " 240 \n",
+ " 240 \n",
+ " 240 \n",
+ " 240 \n",
+ " 240 \n",
+ " 240 \n",
+ " 240 \n",
+ " \n",
+ "
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 7,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
"source": [
- "atom_data_a.to_hdf('A.h5')"
+ "atc.key_diff(\"lines\")"
]
},
{
"cell_type": "markdown",
- "metadata": {},
+ "metadata": {
+ "ExecuteTime": {
+ "end_time": "2022-09-30T14:56:28.398117Z",
+ "start_time": "2022-09-30T14:56:28.339229Z"
+ }
+ },
"source": [
- "For the second atomic file we grab species `H-C` from GFALL and `C` from Chianti."
+ "One can also investigate specific ions:"
]
},
{
"cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
+ "execution_count": 8,
+ "metadata": {
+ "ExecuteTime": {
+ "end_time": "2022-10-19T08:23:03.924742Z",
+ "start_time": "2022-10-19T08:23:03.262672Z"
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ " pct_change_wavelength pct_change_f_ul pct_change_f_lu pct_change_nu pct_change_B_lu pct_change_B_ul pct_change_A_ul level_number_lower level_number_upper \n",
+ " \n",
+ " 0 \n",
+ " 1 \n",
+ " 0.000002 \n",
+ " 0.000000 \n",
+ " 0.000000 \n",
+ " -0.000002 \n",
+ " 0.000002 \n",
+ " 0.000002 \n",
+ " -0.000003 \n",
+ " \n",
+ " \n",
+ " 3 \n",
+ " 0.000002 \n",
+ " 0.000000 \n",
+ " 0.000000 \n",
+ " -0.000002 \n",
+ " 0.000002 \n",
+ " 0.000002 \n",
+ " -0.000003 \n",
+ " \n",
+ " \n",
+ " 4 \n",
+ " 0.000002 \n",
+ " 0.000000 \n",
+ " 0.000000 \n",
+ " -0.000002 \n",
+ " 0.000002 \n",
+ " 0.000002 \n",
+ " -0.000004 \n",
+ " \n",
+ " \n",
+ " 6 \n",
+ " 0.000002 \n",
+ " 0.000000 \n",
+ " 0.000000 \n",
+ " -0.000002 \n",
+ " 0.000002 \n",
+ " 0.000002 \n",
+ " -0.000004 \n",
+ " \n",
+ " \n",
+ " 9 \n",
+ " 0.000002 \n",
+ " 0.000000 \n",
+ " 0.000000 \n",
+ " -0.000002 \n",
+ " 0.000002 \n",
+ " 0.000002 \n",
+ " -0.000004 \n",
+ " \n",
+ " \n",
+ " 11 \n",
+ " 0.000001 \n",
+ " 0.000000 \n",
+ " 0.000000 \n",
+ " -0.000001 \n",
+ " 0.000001 \n",
+ " 0.000001 \n",
+ " -0.000002 \n",
+ " \n",
+ " \n",
+ " 16 \n",
+ " 0.000002 \n",
+ " 0.000000 \n",
+ " 0.000000 \n",
+ " -0.000002 \n",
+ " 0.000002 \n",
+ " 0.000002 \n",
+ " -0.000004 \n",
+ " \n",
+ " \n",
+ " 18 \n",
+ " 0.000002 \n",
+ " 0.000000 \n",
+ " 0.000000 \n",
+ " -0.000002 \n",
+ " 0.000002 \n",
+ " 0.000002 \n",
+ " -0.000004 \n",
+ " \n",
+ " \n",
+ " 1 \n",
+ " 5 \n",
+ " 0.000002 \n",
+ " 0.000000 \n",
+ " 0.000000 \n",
+ " -0.000002 \n",
+ " 0.000002 \n",
+ " 0.000002 \n",
+ " -0.000004 \n",
+ " \n",
+ " \n",
+ " 7 \n",
+ " 0.000002 \n",
+ " 0.000000 \n",
+ " 0.000000 \n",
+ " -0.000002 \n",
+ " 0.000002 \n",
+ " 0.000002 \n",
+ " -0.000004 \n",
+ " \n",
+ " \n",
+ " 10 \n",
+ " 0.000002 \n",
+ " 0.000000 \n",
+ " 0.000000 \n",
+ " -0.000002 \n",
+ " 0.000002 \n",
+ " 0.000002 \n",
+ " -0.000004 \n",
+ " \n",
+ " \n",
+ " 12 \n",
+ " 0.000002 \n",
+ " 0.000000 \n",
+ " 0.000000 \n",
+ " -0.000002 \n",
+ " 0.000002 \n",
+ " 0.000002 \n",
+ " -0.000003 \n",
+ " \n",
+ " \n",
+ " 17 \n",
+ " 0.000002 \n",
+ " 0.000000 \n",
+ " 0.000000 \n",
+ " -0.000002 \n",
+ " 0.000002 \n",
+ " 0.000002 \n",
+ " -0.000004 \n",
+ " \n",
+ " \n",
+ " 19 \n",
+ " 0.000002 \n",
+ " 0.000000 \n",
+ " 0.000000 \n",
+ " -0.000002 \n",
+ " 0.000002 \n",
+ " 0.000002 \n",
+ " -0.000004 \n",
+ " \n",
+ " \n",
+ " 2 \n",
+ " 4 \n",
+ " 0.000002 \n",
+ " 0.000000 \n",
+ " 0.000000 \n",
+ " -0.000002 \n",
+ " 0.000002 \n",
+ " 0.000002 \n",
+ " -0.000004 \n",
+ " \n",
+ " \n",
+ " 6 \n",
+ " 0.000002 \n",
+ " 0.000000 \n",
+ " 0.000000 \n",
+ " -0.000002 \n",
+ " 0.000002 \n",
+ " 0.000002 \n",
+ " -0.000003 \n",
+ " \n",
+ " \n",
+ " 9 \n",
+ " 0.000002 \n",
+ " 0.000000 \n",
+ " 0.000000 \n",
+ " -0.000002 \n",
+ " 0.000002 \n",
+ " 0.000002 \n",
+ " -0.000003 \n",
+ " \n",
+ " \n",
+ " 11 \n",
+ " 0.000001 \n",
+ " 0.000000 \n",
+ " 0.000000 \n",
+ " -0.000001 \n",
+ " 0.000002 \n",
+ " 0.000002 \n",
+ " -0.000003 \n",
+ " \n",
+ " \n",
+ " 16 \n",
+ " 0.000002 \n",
+ " 0.000000 \n",
+ " 0.000000 \n",
+ " -0.000002 \n",
+ " 0.000002 \n",
+ " 0.000002 \n",
+ " -0.000003 \n",
+ " \n",
+ " \n",
+ " 18 \n",
+ " 0.000002 \n",
+ " 0.000000 \n",
+ " 0.000000 \n",
+ " -0.000002 \n",
+ " 0.000002 \n",
+ " 0.000002 \n",
+ " -0.000003 \n",
+ " \n",
+ " \n",
+ " 3 \n",
+ " 5 \n",
+ " 0.000002 \n",
+ " 0.000000 \n",
+ " 0.000000 \n",
+ " -0.000002 \n",
+ " 0.000002 \n",
+ " 0.000002 \n",
+ " -0.000004 \n",
+ " \n",
+ " \n",
+ " 7 \n",
+ " 0.000002 \n",
+ " 0.000000 \n",
+ " 0.000000 \n",
+ " -0.000002 \n",
+ " 0.000002 \n",
+ " 0.000002 \n",
+ " -0.000004 \n",
+ " \n",
+ " \n",
+ " 8 \n",
+ " 0.000002 \n",
+ " 0.000000 \n",
+ " 0.000000 \n",
+ " -0.000002 \n",
+ " 0.000002 \n",
+ " 0.000002 \n",
+ " -0.000004 \n",
+ " \n",
+ " \n",
+ " 10 \n",
+ " 0.000002 \n",
+ " 0.000000 \n",
+ " 0.000000 \n",
+ " -0.000002 \n",
+ " 0.000002 \n",
+ " 0.000002 \n",
+ " -0.000004 \n",
+ " \n",
+ " \n",
+ " 12 \n",
+ " 0.000002 \n",
+ " 0.000000 \n",
+ " 0.000000 \n",
+ " -0.000002 \n",
+ " 0.000002 \n",
+ " 0.000002 \n",
+ " -0.000004 \n",
+ " \n",
+ " \n",
+ " 13 \n",
+ " 0.000002 \n",
+ " 0.000000 \n",
+ " 0.000000 \n",
+ " -0.000002 \n",
+ " 0.000002 \n",
+ " 0.000002 \n",
+ " -0.000004 \n",
+ " \n",
+ " \n",
+ " 17 \n",
+ " 0.000002 \n",
+ " 0.000000 \n",
+ " 0.000000 \n",
+ " -0.000002 \n",
+ " 0.000002 \n",
+ " 0.000002 \n",
+ " -0.000004 \n",
+ " \n",
+ " \n",
+ " 19 \n",
+ " 0.000002 \n",
+ " 0.000000 \n",
+ " 0.000000 \n",
+ " -0.000002 \n",
+ " 0.000002 \n",
+ " 0.000002 \n",
+ " -0.000004 \n",
+ " \n",
+ " \n",
+ " 20 \n",
+ " 0.000002 \n",
+ " 0.000000 \n",
+ " 0.000000 \n",
+ " -0.000002 \n",
+ " 0.000002 \n",
+ " 0.000002 \n",
+ " -0.000004 \n",
+ " \n",
+ " \n",
+ " 4 \n",
+ " 10 \n",
+ " 0.000002 \n",
+ " 0.000000 \n",
+ " 0.000000 \n",
+ " -0.000002 \n",
+ " 0.000002 \n",
+ " 0.000002 \n",
+ " -0.000004 \n",
+ " \n",
+ " \n",
+ " 12 \n",
+ " 0.000001 \n",
+ " 0.000000 \n",
+ " 0.000000 \n",
+ " -0.000001 \n",
+ " 0.000001 \n",
+ " 0.000001 \n",
+ " -0.000002 \n",
+ " \n",
+ " \n",
+ " 17 \n",
+ " 0.000002 \n",
+ " 0.000000 \n",
+ " 0.000000 \n",
+ " -0.000002 \n",
+ " 0.000002 \n",
+ " 0.000002 \n",
+ " -0.000003 \n",
+ " \n",
+ " \n",
+ " 19 \n",
+ " 0.000001 \n",
+ " 0.000000 \n",
+ " 0.000000 \n",
+ " -0.000001 \n",
+ " 0.000001 \n",
+ " 0.000001 \n",
+ " -0.000002 \n",
+ " \n",
+ " \n",
+ " 5 \n",
+ " 9 \n",
+ " 0.000002 \n",
+ " 0.000000 \n",
+ " 0.000000 \n",
+ " -0.000002 \n",
+ " 0.000002 \n",
+ " 0.000002 \n",
+ " -0.000004 \n",
+ " \n",
+ " \n",
+ " 11 \n",
+ " 0.000002 \n",
+ " 0.000000 \n",
+ " 0.000000 \n",
+ " -0.000002 \n",
+ " 0.000002 \n",
+ " 0.000002 \n",
+ " -0.000004 \n",
+ " \n",
+ " \n",
+ " 16 \n",
+ " 0.000002 \n",
+ " 0.000000 \n",
+ " 0.000000 \n",
+ " -0.000002 \n",
+ " 0.000002 \n",
+ " 0.000002 \n",
+ " -0.000004 \n",
+ " \n",
+ " \n",
+ " 18 \n",
+ " 0.000002 \n",
+ " 0.000000 \n",
+ " 0.000000 \n",
+ " -0.000002 \n",
+ " 0.000002 \n",
+ " 0.000002 \n",
+ " -0.000004 \n",
+ " \n",
+ " \n",
+ " 6 \n",
+ " 10 \n",
+ " 0.000002 \n",
+ " 0.000000 \n",
+ " 0.000000 \n",
+ " -0.000002 \n",
+ " 0.000002 \n",
+ " 0.000002 \n",
+ " -0.000005 \n",
+ " \n",
+ " \n",
+ " 12 \n",
+ " 0.000001 \n",
+ " 0.000000 \n",
+ " 0.000000 \n",
+ " -0.000001 \n",
+ " 0.000001 \n",
+ " 0.000001 \n",
+ " -0.000002 \n",
+ " \n",
+ " \n",
+ " 13 \n",
+ " 0.000001 \n",
+ " 0.000000 \n",
+ " 0.000000 \n",
+ " -0.000001 \n",
+ " 0.000001 \n",
+ " 0.000001 \n",
+ " -0.000002 \n",
+ " \n",
+ " \n",
+ " 17 \n",
+ " 0.000002 \n",
+ " 0.000000 \n",
+ " 0.000000 \n",
+ " -0.000002 \n",
+ " 0.000002 \n",
+ " 0.000002 \n",
+ " -0.000004 \n",
+ " \n",
+ " \n",
+ " 19 \n",
+ " 0.000001 \n",
+ " 0.000000 \n",
+ " 0.000000 \n",
+ " -0.000001 \n",
+ " 0.000002 \n",
+ " 0.000002 \n",
+ " -0.000003 \n",
+ " \n",
+ " \n",
+ " 20 \n",
+ " 0.000001 \n",
+ " 0.000000 \n",
+ " 0.000000 \n",
+ " -0.000001 \n",
+ " 0.000002 \n",
+ " 0.000002 \n",
+ " -0.000003 \n",
+ " \n",
+ " \n",
+ " 7 \n",
+ " 9 \n",
+ " 0.000002 \n",
+ " 0.000000 \n",
+ " 0.000000 \n",
+ " -0.000002 \n",
+ " 0.000002 \n",
+ " 0.000002 \n",
+ " -0.000003 \n",
+ " \n",
+ " \n",
+ " 11 \n",
+ " 0.000001 \n",
+ " 0.000000 \n",
+ " 0.000000 \n",
+ " -0.000001 \n",
+ " 0.000001 \n",
+ " 0.000001 \n",
+ " -0.000002 \n",
+ " \n",
+ " \n",
+ " 14 \n",
+ " 0.000001 \n",
+ " 0.000000 \n",
+ " 0.000000 \n",
+ " -0.000001 \n",
+ " 0.000001 \n",
+ " 0.000001 \n",
+ " -0.000002 \n",
+ " \n",
+ " \n",
+ " 16 \n",
+ " 0.000002 \n",
+ " 0.000000 \n",
+ " 0.000000 \n",
+ " -0.000002 \n",
+ " 0.000002 \n",
+ " 0.000002 \n",
+ " -0.000003 \n",
+ " \n",
+ " \n",
+ " 18 \n",
+ " 0.000001 \n",
+ " 0.000000 \n",
+ " 0.000000 \n",
+ " -0.000001 \n",
+ " 0.000002 \n",
+ " 0.000002 \n",
+ " -0.000003 \n",
+ " \n",
+ " \n",
+ " 21 \n",
+ " 0.000001 \n",
+ " 0.000000 \n",
+ " 0.000000 \n",
+ " -0.000001 \n",
+ " 0.000002 \n",
+ " 0.000002 \n",
+ " -0.000003 \n",
+ " \n",
+ " \n",
+ " 8 \n",
+ " 11 \n",
+ " 0.000002 \n",
+ " 0.000000 \n",
+ " 0.000000 \n",
+ " -0.000002 \n",
+ " 0.000002 \n",
+ " 0.000002 \n",
+ " -0.000004 \n",
+ " \n",
+ " \n",
+ " 14 \n",
+ " 0.000002 \n",
+ " 0.000000 \n",
+ " 0.000000 \n",
+ " -0.000002 \n",
+ " 0.000002 \n",
+ " 0.000002 \n",
+ " -0.000003 \n",
+ " \n",
+ " \n",
+ " 15 \n",
+ " 0.000002 \n",
+ " 0.000000 \n",
+ " 0.000000 \n",
+ " -0.000002 \n",
+ " 0.000002 \n",
+ " 0.000002 \n",
+ " -0.000004 \n",
+ " \n",
+ " \n",
+ " 18 \n",
+ " 0.000002 \n",
+ " 0.000000 \n",
+ " 0.000000 \n",
+ " -0.000002 \n",
+ " 0.000002 \n",
+ " 0.000002 \n",
+ " -0.000004 \n",
+ " \n",
+ " \n",
+ " 21 \n",
+ " 0.000002 \n",
+ " 0.000000 \n",
+ " 0.000000 \n",
+ " -0.000002 \n",
+ " 0.000002 \n",
+ " 0.000002 \n",
+ " -0.000004 \n",
+ " \n",
+ " \n",
+ " 22 \n",
+ " 0.000002 \n",
+ " 0.000000 \n",
+ " 0.000000 \n",
+ " -0.000002 \n",
+ " 0.000002 \n",
+ " 0.000002 \n",
+ " -0.000005 \n",
+ " \n",
+ " \n",
+ " 9 \n",
+ " 17 \n",
+ " 0.000002 \n",
+ " 0.000000 \n",
+ " 0.000000 \n",
+ " -0.000002 \n",
+ " 0.000002 \n",
+ " 0.000002 \n",
+ " -0.000004 \n",
+ " \n",
+ " \n",
+ " 19 \n",
+ " 0.000001 \n",
+ " 0.000000 \n",
+ " 0.000000 \n",
+ " -0.000001 \n",
+ " 0.000001 \n",
+ " 0.000001 \n",
+ " -0.000002 \n",
+ " \n",
+ " \n",
+ " 10 \n",
+ " 16 \n",
+ " -0.000000 \n",
+ " 0.000000 \n",
+ " 0.000000 \n",
+ " 0.000000 \n",
+ " -0.000000 \n",
+ " -0.000000 \n",
+ " 0.000001 \n",
+ " \n",
+ " \n",
+ " 18 \n",
+ " -0.000000 \n",
+ " 0.000000 \n",
+ " 0.000000 \n",
+ " 0.000000 \n",
+ " -0.000000 \n",
+ " -0.000000 \n",
+ " 0.000001 \n",
+ " \n",
+ " \n",
+ " 11 \n",
+ " 17 \n",
+ " 0.000003 \n",
+ " 0.000000 \n",
+ " 0.000000 \n",
+ " -0.000003 \n",
+ " 0.000003 \n",
+ " 0.000003 \n",
+ " -0.000006 \n",
+ " \n",
+ " \n",
+ " 19 \n",
+ " 0.000002 \n",
+ " 0.000000 \n",
+ " 0.000000 \n",
+ " -0.000002 \n",
+ " 0.000002 \n",
+ " 0.000002 \n",
+ " -0.000004 \n",
+ " \n",
+ " \n",
+ " 20 \n",
+ " 0.000002 \n",
+ " 0.000000 \n",
+ " 0.000000 \n",
+ " -0.000002 \n",
+ " 0.000002 \n",
+ " 0.000002 \n",
+ " -0.000004 \n",
+ " \n",
+ " \n",
+ " 12 \n",
+ " 16 \n",
+ " 0.000002 \n",
+ " 0.000000 \n",
+ " 0.000000 \n",
+ " -0.000002 \n",
+ " 0.000002 \n",
+ " 0.000002 \n",
+ " -0.000004 \n",
+ " \n",
+ " \n",
+ " 18 \n",
+ " 0.000002 \n",
+ " 0.000000 \n",
+ " 0.000000 \n",
+ " -0.000002 \n",
+ " 0.000002 \n",
+ " 0.000002 \n",
+ " -0.000004 \n",
+ " \n",
+ " \n",
+ " 21 \n",
+ " 0.000002 \n",
+ " 0.000000 \n",
+ " 0.000000 \n",
+ " -0.000002 \n",
+ " 0.000002 \n",
+ " 0.000002 \n",
+ " -0.000004 \n",
+ " \n",
+ " \n",
+ " 13 \n",
+ " 18 \n",
+ " 0.000002 \n",
+ " 0.000000 \n",
+ " 0.000000 \n",
+ " -0.000002 \n",
+ " 0.000002 \n",
+ " 0.000002 \n",
+ " -0.000004 \n",
+ " \n",
+ " \n",
+ " 21 \n",
+ " 0.000002 \n",
+ " 0.000000 \n",
+ " 0.000000 \n",
+ " -0.000002 \n",
+ " 0.000002 \n",
+ " 0.000002 \n",
+ " -0.000004 \n",
+ " \n",
+ " \n",
+ " 22 \n",
+ " 0.000004 \n",
+ " 0.000000 \n",
+ " 0.000000 \n",
+ " -0.000004 \n",
+ " 0.000004 \n",
+ " 0.000004 \n",
+ " -0.000008 \n",
+ " \n",
+ " \n",
+ " 14 \n",
+ " 19 \n",
+ " 0.000002 \n",
+ " 0.000000 \n",
+ " 0.000000 \n",
+ " -0.000002 \n",
+ " 0.000002 \n",
+ " 0.000002 \n",
+ " -0.000004 \n",
+ " \n",
+ " \n",
+ " 20 \n",
+ " 0.000002 \n",
+ " 0.000000 \n",
+ " 0.000000 \n",
+ " -0.000002 \n",
+ " 0.000002 \n",
+ " 0.000002 \n",
+ " -0.000004 \n",
+ " \n",
+ " \n",
+ " 23 \n",
+ " 0.000004 \n",
+ " 0.000000 \n",
+ " 0.000000 \n",
+ " -0.000004 \n",
+ " 0.000004 \n",
+ " 0.000004 \n",
+ " -0.000008 \n",
+ " \n",
+ " \n",
+ " 15 \n",
+ " 20 \n",
+ " 0.000002 \n",
+ " 0.000000 \n",
+ " 0.000000 \n",
+ " -0.000002 \n",
+ " 0.000002 \n",
+ " 0.000002 \n",
+ " -0.000004 \n",
+ " \n",
+ " \n",
+ " 23 \n",
+ " 0.000004 \n",
+ " 0.000000 \n",
+ " 0.000000 \n",
+ " -0.000004 \n",
+ " 0.000004 \n",
+ " 0.000004 \n",
+ " -0.000008 \n",
+ " \n",
+ " \n",
+ " 24 \n",
+ " 0.000001 \n",
+ " 0.000000 \n",
+ " 0.000000 \n",
+ " -0.000001 \n",
+ " 0.000001 \n",
+ " 0.000001 \n",
+ " -0.000003 \n",
+ " \n",
+ "
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 8,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
"source": [
- "chianti_reader = ChiantiReader(ions='C', collisions=True, priority=20)"
+ "atc.ion_diff(\"lines\",(1,0))"
]
},
{
"cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
+ "execution_count": 10,
+ "metadata": {
+ "ExecuteTime": {
+ "end_time": "2022-10-19T08:23:13.807434Z",
+ "start_time": "2022-10-19T08:23:13.777754Z"
+ },
+ "scrolled": true
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ " pct_change_energy pct_change_g level_number \n",
+ " \n",
+ " 57 \n",
+ " -0.000000 \n",
+ " 0.000000 \n",
+ " \n",
+ " \n",
+ " 58 \n",
+ " -0.000000 \n",
+ " -0.333333 \n",
+ " \n",
+ " \n",
+ " 59 \n",
+ " -0.000013 \n",
+ " 0.000000 \n",
+ " \n",
+ " \n",
+ " 60 \n",
+ " -0.000013 \n",
+ " -0.250000 \n",
+ " \n",
+ " \n",
+ " 61 \n",
+ " -0.005822 \n",
+ " 2.000000 \n",
+ " \n",
+ " \n",
+ " 62 \n",
+ " -0.005822 \n",
+ " 1.000000 \n",
+ " \n",
+ " \n",
+ " 63 \n",
+ " -0.004462 \n",
+ " 0.000000 \n",
+ " \n",
+ " \n",
+ " 64 \n",
+ " -0.004462 \n",
+ " 0.000000 \n",
+ " \n",
+ " \n",
+ " 65 \n",
+ " -0.003512 \n",
+ " 0.000000 \n",
+ " \n",
+ " \n",
+ " 66 \n",
+ " -0.003512 \n",
+ " 0.000000 \n",
+ " \n",
+ "
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 10,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
"source": [
- "atom_data_b = TARDISAtomData(atomic_weights,\n",
- " ionization_energies,\n",
- " gfall_reader,\n",
- " zeta_data,\n",
- " chianti_reader)"
+ "atc.ion_diff(\"levels\",(3,0))"
]
},
{
"cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
+ "execution_count": 11,
+ "metadata": {
+ "ExecuteTime": {
+ "end_time": "2022-10-19T08:23:19.442031Z",
+ "start_time": "2022-10-19T08:23:19.425469Z"
+ }
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "All the values in both the dataframes match.\n"
+ ]
+ }
+ ],
"source": [
- "atom_data_b.to_hdf('B.h5')"
+ "atc.ion_diff(\"levels\",(1,0))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
- "Define the following functions to compare both dataframes."
+ "Both the `ion_diff` and `key_diff` methods allow displaying detailed information:"
]
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 12,
+ "metadata": {
+ "ExecuteTime": {
+ "end_time": "2022-10-19T08:23:25.414894Z",
+ "start_time": "2022-10-19T08:23:24.662887Z"
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ " line_id_1 line_id_2 matches_line_id wavelength_1 wavelength_2 matches_wavelength pct_change_wavelength f_ul_1 f_ul_2 matches_f_ul pct_change_f_ul f_lu_1 f_lu_2 matches_f_lu pct_change_f_lu nu_1 nu_2 matches_nu pct_change_nu B_lu_1 B_lu_2 matches_B_lu pct_change_B_lu B_ul_1 B_ul_2 matches_B_ul pct_change_B_ul A_ul_1 A_ul_2 matches_A_ul pct_change_A_ul level_number_lower level_number_upper \n",
+ " \n",
+ " 0 \n",
+ " 1 \n",
+ " 533125 \n",
+ " 533089 \n",
+ " False \n",
+ " 1215.674000 \n",
+ " 1215.676000 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 0.139000 \n",
+ " 0.139000 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 0.139000 \n",
+ " 0.139000 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 2466059634408567.000000 \n",
+ " 2466055577308427.000000 \n",
+ " False \n",
+ " -0.000002 \n",
+ " 2837052905.321615 \n",
+ " 2837057778.838667 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 2837052905.321615 \n",
+ " 2837057778.838667 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 627368588.243199 \n",
+ " 627366525.048786 \n",
+ " False \n",
+ " -0.000003 \n",
+ " \n",
+ " \n",
+ " 3 \n",
+ " 533126 \n",
+ " 533090 \n",
+ " False \n",
+ " 1215.668000 \n",
+ " 1215.670000 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 0.138750 \n",
+ " 0.138750 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 0.277500 \n",
+ " 0.277500 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 2466071805789080.500000 \n",
+ " 2466067748648893.000000 \n",
+ " False \n",
+ " -0.000002 \n",
+ " 5663872629.992867 \n",
+ " 5663882359.494301 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 2831936314.996433 \n",
+ " 2831941179.747150 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 626246409.178241 \n",
+ " 626244349.664110 \n",
+ " False \n",
+ " -0.000003 \n",
+ " \n",
+ " \n",
+ " 4 \n",
+ " 533127 \n",
+ " 533091 \n",
+ " False \n",
+ " 1025.723000 \n",
+ " 1025.725000 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 0.026350 \n",
+ " 0.026350 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 0.026350 \n",
+ " 0.026350 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 2922742865276493.000000 \n",
+ " 2922737166394501.000000 \n",
+ " False \n",
+ " -0.000002 \n",
+ " 453780907.571722 \n",
+ " 453781825.332716 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 453780907.571722 \n",
+ " 453781825.332716 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 167056223.131353 \n",
+ " 167055571.950010 \n",
+ " False \n",
+ " -0.000004 \n",
+ " \n",
+ " \n",
+ " 6 \n",
+ " 533128 \n",
+ " 533092 \n",
+ " False \n",
+ " 1025.722000 \n",
+ " 1025.724000 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 0.026250 \n",
+ " 0.026250 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 0.052500 \n",
+ " 0.052500 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 2922745714725822.000000 \n",
+ " 2922740015832719.000000 \n",
+ " False \n",
+ " -0.000002 \n",
+ " 904116676.336302 \n",
+ " 904118504.892298 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 452058338.168151 \n",
+ " 452059252.446149 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 166422558.167649 \n",
+ " 166421909.455684 \n",
+ " False \n",
+ " -0.000004 \n",
+ " \n",
+ " \n",
+ " 9 \n",
+ " 533129 \n",
+ " 533093 \n",
+ " False \n",
+ " 972.537000 \n",
+ " 972.539000 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 0.009650 \n",
+ " 0.009650 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 0.009650 \n",
+ " 0.009650 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 3082581516178818.500000 \n",
+ " 3082575176933778.000000 \n",
+ " False \n",
+ " -0.000002 \n",
+ " 157568337.295176 \n",
+ " 157568672.775322 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 157568337.295176 \n",
+ " 157568672.775322 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 68054566.848782 \n",
+ " 68054287.060014 \n",
+ " False \n",
+ " -0.000004 \n",
+ " \n",
+ " \n",
+ " 11 \n",
+ " 533130 \n",
+ " 533094 \n",
+ " False \n",
+ " 972.537000 \n",
+ " 972.538000 \n",
+ " False \n",
+ " 0.000001 \n",
+ " 0.009675 \n",
+ " 0.009675 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 0.019350 \n",
+ " 0.019350 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 3082581516178818.500000 \n",
+ " 3082578346553039.000000 \n",
+ " False \n",
+ " -0.000001 \n",
+ " 315953090.845768 \n",
+ " 315953438.669138 \n",
+ " False \n",
+ " 0.000001 \n",
+ " 157976545.422884 \n",
+ " 157976719.334569 \n",
+ " False \n",
+ " 0.000001 \n",
+ " 68230874.016784 \n",
+ " 68230733.817751 \n",
+ " False \n",
+ " -0.000002 \n",
+ " \n",
+ " \n",
+ " 16 \n",
+ " 533131 \n",
+ " 533095 \n",
+ " False \n",
+ " 949.743000 \n",
+ " 949.745000 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 0.004650 \n",
+ " 0.004650 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 0.004650 \n",
+ " 0.004650 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 3156564017844827.000000 \n",
+ " 3156557370662651.000000 \n",
+ " False \n",
+ " -0.000002 \n",
+ " 74147166.638423 \n",
+ " 74147328.165407 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 74147166.638423 \n",
+ " 74147328.165407 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 34386104.369040 \n",
+ " 34385959.605169 \n",
+ " False \n",
+ " -0.000004 \n",
+ " \n",
+ " \n",
+ " 18 \n",
+ " 533132 \n",
+ " 533096 \n",
+ " False \n",
+ " 949.743000 \n",
+ " 949.745000 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 0.004650 \n",
+ " 0.004650 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 0.009300 \n",
+ " 0.009300 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 3156564017844827.000000 \n",
+ " 3156557370662651.000000 \n",
+ " False \n",
+ " -0.000002 \n",
+ " 148294333.276846 \n",
+ " 148294656.330815 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 74147166.638423 \n",
+ " 74147328.165407 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 34386104.369040 \n",
+ " 34385959.605169 \n",
+ " False \n",
+ " -0.000004 \n",
+ " \n",
+ " \n",
+ " 1 \n",
+ " 5 \n",
+ " 533139 \n",
+ " 533103 \n",
+ " False \n",
+ " 6564.564000 \n",
+ " 6564.576000 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 0.013600 \n",
+ " 0.013600 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 0.013600 \n",
+ " 0.013600 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 456682969348764.000000 \n",
+ " 456682134535421.562500 \n",
+ " False \n",
+ " -0.000002 \n",
+ " 1498926373.529900 \n",
+ " 1498929222.431827 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 1498926373.529900 \n",
+ " 1498929222.431827 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 2105083.666798 \n",
+ " 2105075.974226 \n",
+ " False \n",
+ " -0.000004 \n",
+ " \n",
+ " \n",
+ " 7 \n",
+ " 533140 \n",
+ " 533104 \n",
+ " False \n",
+ " 6564.523000 \n",
+ " 6564.536000 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 0.347500 \n",
+ " 0.347500 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 0.695000 \n",
+ " 0.695000 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 456685821650712.437500 \n",
+ " 456684917258432.187500 \n",
+ " False \n",
+ " -0.000002 \n",
+ " 76599067880.042526 \n",
+ " 76599225135.918060 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 38299533940.021263 \n",
+ " 38299612567.959030 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 53788655.286609 \n",
+ " 53788442.338812 \n",
+ " False \n",
+ " -0.000004 \n",
+ " \n",
+ " \n",
+ " 10 \n",
+ " 533141 \n",
+ " 533105 \n",
+ " False \n",
+ " 4862.646000 \n",
+ " 4862.656000 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 0.003045 \n",
+ " 0.003045 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 0.003045 \n",
+ " 0.003045 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 616521247896721.250000 \n",
+ " 616519980027375.875000 \n",
+ " False \n",
+ " -0.000002 \n",
+ " 248596755.947285 \n",
+ " 248597285.240945 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 248596755.947285 \n",
+ " 248597285.240945 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 858982.300974 \n",
+ " 858978.769462 \n",
+ " False \n",
+ " -0.000004 \n",
+ " \n",
+ " \n",
+ " 12 \n",
+ " 533142 \n",
+ " 533106 \n",
+ " False \n",
+ " 4862.637000 \n",
+ " 4862.645000 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 0.061000 \n",
+ " 0.061000 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 0.122000 \n",
+ " 0.122000 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 616522388983590.625000 \n",
+ " 616521374683942.500000 \n",
+ " False \n",
+ " -0.000002 \n",
+ " 9960179997.267080 \n",
+ " 9960197107.159893 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 4980089998.633540 \n",
+ " 4980098553.579947 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 17207919.317153 \n",
+ " 17207862.725677 \n",
+ " False \n",
+ " -0.000003 \n",
+ " \n",
+ " \n",
+ " 17 \n",
+ " 533143 \n",
+ " 533107 \n",
+ " False \n",
+ " 4341.651000 \n",
+ " 4341.659000 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 0.001215 \n",
+ " 0.001215 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 0.001215 \n",
+ " 0.001215 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 690503354599437.000000 \n",
+ " 690502082268552.125000 \n",
+ " False \n",
+ " -0.000002 \n",
+ " 88565931.349961 \n",
+ " 88566100.975759 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 88565931.349961 \n",
+ " 88566100.975759 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 429940.823970 \n",
+ " 429939.240273 \n",
+ " False \n",
+ " -0.000004 \n",
+ " \n",
+ " \n",
+ " 19 \n",
+ " 533144 \n",
+ " 533108 \n",
+ " False \n",
+ " 4341.647000 \n",
+ " 4341.655000 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 0.022200 \n",
+ " 0.022200 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 0.044400 \n",
+ " 0.044400 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 690503990766637.500000 \n",
+ " 690502718433408.375000 \n",
+ " False \n",
+ " -0.000002 \n",
+ " 3236480435.433443 \n",
+ " 3236486634.104351 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 1618240217.716721 \n",
+ " 1618243317.052176 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 7855723.357507 \n",
+ " 7855694.420734 \n",
+ " False \n",
+ " -0.000004 \n",
+ " \n",
+ " \n",
+ " 2 \n",
+ " 4 \n",
+ " 533133 \n",
+ " 533097 \n",
+ " False \n",
+ " 6564.584000 \n",
+ " 6564.596000 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 0.145000 \n",
+ " 0.145000 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 0.145000 \n",
+ " 0.145000 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 456681577994888.875000 \n",
+ " 456680743186633.187500 \n",
+ " False \n",
+ " -0.000002 \n",
+ " 15981248995.314295 \n",
+ " 15981279369.639841 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 15981248995.314295 \n",
+ " 15981279369.639841 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 22443769.984281 \n",
+ " 22443687.968639 \n",
+ " False \n",
+ " -0.000004 \n",
+ " \n",
+ " \n",
+ " 6 \n",
+ " 533134 \n",
+ " 533098 \n",
+ " False \n",
+ " 6564.538000 \n",
+ " 6564.549000 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 0.145000 \n",
+ " 0.145000 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 0.290000 \n",
+ " 0.290000 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 456684778121476.312500 \n",
+ " 456684012869734.062500 \n",
+ " False \n",
+ " -0.000002 \n",
+ " 31962274019.862495 \n",
+ " 31962329899.567265 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 15981137009.931248 \n",
+ " 15981164949.783632 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 22444084.527982 \n",
+ " 22444009.348558 \n",
+ " False \n",
+ " -0.000003 \n",
+ " \n",
+ " \n",
+ " 9 \n",
+ " 533135 \n",
+ " 533099 \n",
+ " False \n",
+ " 4862.656000 \n",
+ " 4862.664000 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 0.034250 \n",
+ " 0.034250 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 0.034250 \n",
+ " 0.034250 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 616519980027376.000000 \n",
+ " 616518965735654.250000 \n",
+ " False \n",
+ " -0.000002 \n",
+ " 2796208998.713606 \n",
+ " 2796213802.106439 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 2796208998.713606 \n",
+ " 2796213802.106439 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 9661748.047312 \n",
+ " 9661716.272963 \n",
+ " False \n",
+ " -0.000003 \n",
+ " \n",
+ " \n",
+ " 11 \n",
+ " 533136 \n",
+ " 533100 \n",
+ " False \n",
+ " 4862.645000 \n",
+ " 4862.652000 \n",
+ " False \n",
+ " 0.000001 \n",
+ " 0.034250 \n",
+ " 0.034250 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 0.068500 \n",
+ " 0.068500 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 616521374683942.500000 \n",
+ " 616520487174488.250000 \n",
+ " False \n",
+ " -0.000001 \n",
+ " 5592405346.604705 \n",
+ " 5592413803.314594 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 2796202673.302352 \n",
+ " 2796206901.657297 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 9661791.759880 \n",
+ " 9661763.959180 \n",
+ " False \n",
+ " -0.000003 \n",
+ " \n",
+ " \n",
+ " 16 \n",
+ " 533137 \n",
+ " 533101 \n",
+ " False \n",
+ " 4341.658000 \n",
+ " 4341.665000 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 0.014000 \n",
+ " 0.014000 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 0.014000 \n",
+ " 0.014000 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 690502241309656.250000 \n",
+ " 690501128023465.500000 \n",
+ " False \n",
+ " -0.000002 \n",
+ " 1020514434.580109 \n",
+ " 1020516154.064373 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 1020514434.580109 \n",
+ " 1020516154.064373 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 4954034.671881 \n",
+ " 4954018.705686 \n",
+ " False \n",
+ " -0.000003 \n",
+ " \n",
+ " \n",
+ " 18 \n",
+ " 533138 \n",
+ " 533102 \n",
+ " False \n",
+ " 4341.654000 \n",
+ " 4341.661000 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 0.013975 \n",
+ " 0.013975 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 0.027950 \n",
+ " 0.027950 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 690502877474805.500000 \n",
+ " 690501764186563.500000 \n",
+ " False \n",
+ " -0.000002 \n",
+ " 2037382297.694657 \n",
+ " 2037385730.522034 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 1018691148.847329 \n",
+ " 1018692865.261017 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 4945197.293481 \n",
+ " 4945181.355753 \n",
+ " False \n",
+ " -0.000003 \n",
+ " \n",
+ " \n",
+ " 3 \n",
+ " 5 \n",
+ " 533145 \n",
+ " 533109 \n",
+ " False \n",
+ " 6564.722000 \n",
+ " 6564.734000 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 0.027200 \n",
+ " 0.027200 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 0.013600 \n",
+ " 0.013600 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 456671977884212.000000 \n",
+ " 456671143111053.562500 \n",
+ " False \n",
+ " -0.000002 \n",
+ " 1498962450.620019 \n",
+ " 1498965299.524566 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 2997924901.240037 \n",
+ " 2997930599.049132 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 4209964.675073 \n",
+ " 4209949.291040 \n",
+ " False \n",
+ " -0.000004 \n",
+ " \n",
+ " \n",
+ " 7 \n",
+ " 533146 \n",
+ " 533110 \n",
+ " False \n",
+ " 6564.680000 \n",
+ " 6564.694000 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 0.069750 \n",
+ " 0.069750 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 0.069750 \n",
+ " 0.069750 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 456674899614299.500000 \n",
+ " 456673925700116.312500 \n",
+ " False \n",
+ " -0.000002 \n",
+ " 7687644266.205519 \n",
+ " 7687661219.434911 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 7687644266.205519 \n",
+ " 7687661219.434911 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 10795911.525980 \n",
+ " 10795865.497218 \n",
+ " False \n",
+ " -0.000004 \n",
+ " \n",
+ " \n",
+ " 8 \n",
+ " 533147 \n",
+ " 533111 \n",
+ " False \n",
+ " 6564.665000 \n",
+ " 6564.677000 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 0.418333 \n",
+ " 0.418333 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 0.627500 \n",
+ " 0.627500 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 456675943098391.125000 \n",
+ " 456675108310736.312500 \n",
+ " False \n",
+ " -0.000002 \n",
+ " 69161086084.978104 \n",
+ " 69161217532.552353 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 46107390723.318733 \n",
+ " 46107478355.034904 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 64749968.374842 \n",
+ " 64749731.763761 \n",
+ " False \n",
+ " -0.000004 \n",
+ " \n",
+ " \n",
+ " 10 \n",
+ " 533148 \n",
+ " 533112 \n",
+ " False \n",
+ " 4862.733000 \n",
+ " 4862.743000 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 0.006100 \n",
+ " 0.006100 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 0.003050 \n",
+ " 0.003050 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 616510217608081.500000 \n",
+ " 616508949784103.125000 \n",
+ " False \n",
+ " -0.000002 \n",
+ " 249009415.871731 \n",
+ " 249009946.034833 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 498018831.743461 \n",
+ " 498019892.069666 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 1720723.988690 \n",
+ " 1720716.914448 \n",
+ " False \n",
+ " -0.000004 \n",
+ " \n",
+ " \n",
+ " 12 \n",
+ " 533149 \n",
+ " 533113 \n",
+ " False \n",
+ " 4862.723000 \n",
+ " 4862.732000 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 0.012175 \n",
+ " 0.012175 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 0.012175 \n",
+ " 0.012175 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 616511485437274.500000 \n",
+ " 616510344390766.250000 \n",
+ " False \n",
+ " -0.000002 \n",
+ " 993994558.590085 \n",
+ " 993996470.485633 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 993994558.590085 \n",
+ " 993996470.485633 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 3434409.955302 \n",
+ " 3434397.248261 \n",
+ " False \n",
+ " -0.000004 \n",
+ " \n",
+ " \n",
+ " 13 \n",
+ " 533150 \n",
+ " 533114 \n",
+ " False \n",
+ " 4862.720000 \n",
+ " 4862.729000 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 0.073000 \n",
+ " 0.073000 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 0.109500 \n",
+ " 0.109500 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 616511865787049.250000 \n",
+ " 616510724739132.875000 \n",
+ " False \n",
+ " -0.000002 \n",
+ " 8939822342.223238 \n",
+ " 8939839537.505178 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 5959881561.482159 \n",
+ " 5959893025.003451 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 20592380.787263 \n",
+ " 20592304.597061 \n",
+ " False \n",
+ " -0.000004 \n",
+ " \n",
+ " \n",
+ " 17 \n",
+ " 533151 \n",
+ " 533115 \n",
+ " False \n",
+ " 4341.720000 \n",
+ " 4341.729000 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 0.002430 \n",
+ " 0.002430 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 0.001215 \n",
+ " 0.001215 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 690492380899735.500000 \n",
+ " 690490949573315.000000 \n",
+ " False \n",
+ " -0.000002 \n",
+ " 88567338.890379 \n",
+ " 88567528.915417 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 177134677.780758 \n",
+ " 177135057.830834 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 859854.317131 \n",
+ " 859850.753800 \n",
+ " False \n",
+ " -0.000004 \n",
+ " \n",
+ " \n",
+ " 19 \n",
+ " 533152 \n",
+ " 533116 \n",
+ " False \n",
+ " 4341.716000 \n",
+ " 4341.724000 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 0.004450 \n",
+ " 0.004450 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 0.004450 \n",
+ " 0.004450 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 690493017046715.875000 \n",
+ " 690491744753927.125000 \n",
+ " False \n",
+ " -0.000002 \n",
+ " 324382135.767537 \n",
+ " 324382757.031099 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 324382135.767537 \n",
+ " 324382757.031099 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 1574633.235239 \n",
+ " 1574627.435127 \n",
+ " False \n",
+ " -0.000004 \n",
+ " \n",
+ " \n",
+ " 20 \n",
+ " 533153 \n",
+ " 533117 \n",
+ " False \n",
+ " 4341.715000 \n",
+ " 4341.723000 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 0.026667 \n",
+ " 0.026667 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 0.040000 \n",
+ " 0.040000 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 690493176083644.375000 \n",
+ " 690491903790269.375000 \n",
+ " False \n",
+ " -0.000002 \n",
+ " 2915793807.232810 \n",
+ " 2915799391.624333 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 1943862538.155207 \n",
+ " 1943866261.082889 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 9436008.752600 \n",
+ " 9435973.995347 \n",
+ " False \n",
+ " -0.000004 \n",
+ " \n",
+ " \n",
+ " 4 \n",
+ " 10 \n",
+ " 533158 \n",
+ " 533122 \n",
+ " False \n",
+ " 18755.948000 \n",
+ " 18755.988000 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 0.032250 \n",
+ " 0.032250 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 0.032250 \n",
+ " 0.032250 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 159838605865190.062500 \n",
+ " 159838264985027.687500 \n",
+ " False \n",
+ " -0.000002 \n",
+ " 10155568618.199112 \n",
+ " 10155591014.159319 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 10155568618.199112 \n",
+ " 10155591014.159319 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 611496.401547 \n",
+ " 611493.794371 \n",
+ " False \n",
+ " -0.000004 \n",
+ " \n",
+ " \n",
+ " 12 \n",
+ " 533159 \n",
+ " 533123 \n",
+ " False \n",
+ " 18755.804000 \n",
+ " 18755.822000 \n",
+ " False \n",
+ " 0.000001 \n",
+ " 0.310000 \n",
+ " 0.310000 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 0.620000 \n",
+ " 0.620000 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 159839833045813.437500 \n",
+ " 159839679647205.000000 \n",
+ " False \n",
+ " -0.000001 \n",
+ " 195237339592.654419 \n",
+ " 195237541142.933655 \n",
+ " False \n",
+ " 0.000001 \n",
+ " 97618669796.327209 \n",
+ " 97618770571.466827 \n",
+ " False \n",
+ " 0.000001 \n",
+ " 5878040.164065 \n",
+ " 5878028.891728 \n",
+ " False \n",
+ " -0.000002 \n",
+ " \n",
+ " \n",
+ " 17 \n",
+ " 533160 \n",
+ " 533124 \n",
+ " False \n",
+ " 12821.466000 \n",
+ " 12821.486000 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 0.007450 \n",
+ " 0.007450 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 0.007450 \n",
+ " 0.007450 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 233820733136132.781250 \n",
+ " 233820368403475.187500 \n",
+ " False \n",
+ " -0.000002 \n",
+ " 1603723391.333971 \n",
+ " 1603726009.437804 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 1603723391.333971 \n",
+ " 1603726009.437804 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 302289.546749 \n",
+ " 302288.604192 \n",
+ " False \n",
+ " -0.000003 \n",
+ " \n",
+ " \n",
+ " 19 \n",
+ " 533161 \n",
+ " 533125 \n",
+ " False \n",
+ " 12821.432000 \n",
+ " 12821.448000 \n",
+ " False \n",
+ " 0.000001 \n",
+ " 0.069750 \n",
+ " 0.069750 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 0.139500 \n",
+ " 0.139500 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 233821353184262.062500 \n",
+ " 233821061396497.437500 \n",
+ " False \n",
+ " -0.000001 \n",
+ " 30029371789.438007 \n",
+ " 30029411444.494228 \n",
+ " False \n",
+ " 0.000001 \n",
+ " 15014685894.719004 \n",
+ " 15014705722.247114 \n",
+ " False \n",
+ " 0.000001 \n",
+ " 2830175.531693 \n",
+ " 2830168.472905 \n",
+ " False \n",
+ " -0.000002 \n",
+ " \n",
+ " \n",
+ " 5 \n",
+ " 9 \n",
+ " 533154 \n",
+ " 533118 \n",
+ " False \n",
+ " 18756.001000 \n",
+ " 18756.043000 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 0.161500 \n",
+ " 0.161500 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 0.161500 \n",
+ " 0.161500 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 159838154199288.000000 \n",
+ " 159837796277178.468750 \n",
+ " False \n",
+ " -0.000002 \n",
+ " 50856712138.099579 \n",
+ " 50856829714.503868 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 50856712138.099579 \n",
+ " 50856829714.503868 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 3062204.983719 \n",
+ " 3062191.274681 \n",
+ " False \n",
+ " -0.000004 \n",
+ " \n",
+ " \n",
+ " 11 \n",
+ " 533155 \n",
+ " 533119 \n",
+ " False \n",
+ " 18755.842000 \n",
+ " 18755.877000 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 0.161750 \n",
+ " 0.161750 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 0.323500 \n",
+ " 0.323500 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 159839509204652.031250 \n",
+ " 159839210931059.062500 \n",
+ " False \n",
+ " -0.000002 \n",
+ " 101870011808.740829 \n",
+ " 101870209305.872345 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 50935005904.370415 \n",
+ " 50935104652.936172 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 3066997.238522 \n",
+ " 3066985.797211 \n",
+ " False \n",
+ " -0.000004 \n",
+ " \n",
+ " \n",
+ " 16 \n",
+ " 533156 \n",
+ " 533120 \n",
+ " False \n",
+ " 12821.488000 \n",
+ " 12821.513000 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 0.040350 \n",
+ " 0.040350 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 0.040350 \n",
+ " 0.040350 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 233820331930272.062500 \n",
+ " 233819876016192.406250 \n",
+ " False \n",
+ " -0.000002 \n",
+ " 8685953003.334278 \n",
+ " 8685970570.531132 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 8685953003.334278 \n",
+ " 8685970570.531132 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 1637227.027266 \n",
+ " 1637220.645368 \n",
+ " False \n",
+ " -0.000004 \n",
+ " \n",
+ " \n",
+ " 18 \n",
+ " 533157 \n",
+ " 533121 \n",
+ " False \n",
+ " 12821.450000 \n",
+ " 12821.474000 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 0.040250 \n",
+ " 0.040250 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 0.080500 \n",
+ " 0.080500 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 233821024923078.093750 \n",
+ " 233820587242933.187500 \n",
+ " False \n",
+ " -0.000002 \n",
+ " 17328801597.032982 \n",
+ " 17328835292.801041 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 8664400798.516491 \n",
+ " 8664417646.400520 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 1633179.144117 \n",
+ " 1633173.032734 \n",
+ " False \n",
+ " -0.000004 \n",
+ " \n",
+ " \n",
+ " 6 \n",
+ " 10 \n",
+ " 533162 \n",
+ " 533126 \n",
+ " False \n",
+ " 18756.328000 \n",
+ " 18756.373000 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 0.064500 \n",
+ " 0.064500 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 0.032250 \n",
+ " 0.032250 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 159835367562350.125000 \n",
+ " 159834984087808.437500 \n",
+ " False \n",
+ " -0.000002 \n",
+ " 10155774372.452374 \n",
+ " 10155799475.720526 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 20311548744.904747 \n",
+ " 20311598951.441051 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 1222943.248346 \n",
+ " 1222937.382299 \n",
+ " False \n",
+ " -0.000005 \n",
+ " \n",
+ " \n",
+ " 12 \n",
+ " 533163 \n",
+ " 533127 \n",
+ " False \n",
+ " 18756.184000 \n",
+ " 18756.207000 \n",
+ " False \n",
+ " 0.000001 \n",
+ " 0.061750 \n",
+ " 0.061750 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 0.061750 \n",
+ " 0.061750 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 159836594693248.843750 \n",
+ " 159836398691910.343750 \n",
+ " False \n",
+ " -0.000001 \n",
+ " 19445403189.128929 \n",
+ " 19445428446.646748 \n",
+ " False \n",
+ " 0.000001 \n",
+ " 19445403189.128929 \n",
+ " 19445428446.646748 \n",
+ " False \n",
+ " 0.000001 \n",
+ " 1170820.234800 \n",
+ " 1170817.365330 \n",
+ " False \n",
+ " -0.000002 \n",
+ " \n",
+ " \n",
+ " 13 \n",
+ " 533164 \n",
+ " 533128 \n",
+ " False \n",
+ " 18756.131000 \n",
+ " 18756.152000 \n",
+ " False \n",
+ " 0.000001 \n",
+ " 0.371667 \n",
+ " 0.371667 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 0.557500 \n",
+ " 0.557500 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 159837046350337.375000 \n",
+ " 159836867391563.031250 \n",
+ " False \n",
+ " -0.000001 \n",
+ " 175559216917.893555 \n",
+ " 175559426231.121490 \n",
+ " False \n",
+ " 0.000001 \n",
+ " 117039477945.262360 \n",
+ " 117039617487.414322 \n",
+ " False \n",
+ " 0.000001 \n",
+ " 7047081.995285 \n",
+ " 7047066.226986 \n",
+ " False \n",
+ " -0.000002 \n",
+ " \n",
+ " \n",
+ " 17 \n",
+ " 533165 \n",
+ " 533129 \n",
+ " False \n",
+ " 12821.644000 \n",
+ " 12821.667000 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 0.014850 \n",
+ " 0.014850 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 0.007425 \n",
+ " 0.007425 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 233817487055482.125000 \n",
+ " 233817067624670.000000 \n",
+ " False \n",
+ " -0.000002 \n",
+ " 1598363958.942763 \n",
+ " 1598366942.246820 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 3196727917.885525 \n",
+ " 3196733884.493641 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 602533.574569 \n",
+ " 602531.413900 \n",
+ " False \n",
+ " -0.000004 \n",
+ " \n",
+ " \n",
+ " 19 \n",
+ " 533166 \n",
+ " 533130 \n",
+ " False \n",
+ " 12821.609000 \n",
+ " 12821.628000 \n",
+ " False \n",
+ " 0.000001 \n",
+ " 0.013925 \n",
+ " 0.013925 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 0.013925 \n",
+ " 0.013925 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 233818125322648.656250 \n",
+ " 233817778834325.812500 \n",
+ " False \n",
+ " -0.000001 \n",
+ " 2997596952.381573 \n",
+ " 2997601612.161328 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 2997596952.381573 \n",
+ " 2997601612.161328 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 565005.106596 \n",
+ " 565003.433028 \n",
+ " False \n",
+ " -0.000003 \n",
+ " \n",
+ " \n",
+ " 20 \n",
+ " 533167 \n",
+ " 533131 \n",
+ " False \n",
+ " 12821.596000 \n",
+ " 12821.615000 \n",
+ " False \n",
+ " 0.000001 \n",
+ " 0.083667 \n",
+ " 0.083667 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 0.125500 \n",
+ " 0.125500 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 233818362394198.031250 \n",
+ " 233818015905172.593750 \n",
+ " False \n",
+ " -0.000001 \n",
+ " 27016016954.492298 \n",
+ " 27016058951.069077 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 18010677969.661533 \n",
+ " 18010705967.379383 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 3394771.258765 \n",
+ " 3394761.203306 \n",
+ " False \n",
+ " -0.000003 \n",
+ " \n",
+ " \n",
+ " 7 \n",
+ " 9 \n",
+ " 533168 \n",
+ " 533132 \n",
+ " False \n",
+ " 18756.342000 \n",
+ " 18756.373000 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 0.018350 \n",
+ " 0.018350 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 0.009175 \n",
+ " 0.009175 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 159835248258962.218750 \n",
+ " 159834984087808.437500 \n",
+ " False \n",
+ " -0.000002 \n",
+ " 2889280602.096209 \n",
+ " 2889285587.278631 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 5778561204.192417 \n",
+ " 5778571174.557261 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 347922.094676 \n",
+ " 347920.945197 \n",
+ " False \n",
+ " -0.000003 \n",
+ " \n",
+ " \n",
+ " 11 \n",
+ " 533169 \n",
+ " 533133 \n",
+ " False \n",
+ " 18756.184000 \n",
+ " 18756.207000 \n",
+ " False \n",
+ " 0.000001 \n",
+ " 0.001832 \n",
+ " 0.001832 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 0.001832 \n",
+ " 0.001832 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 159836594693248.843750 \n",
+ " 159836398691910.343750 \n",
+ " False \n",
+ " -0.000001 \n",
+ " 577063989.377794 \n",
+ " 577064738.922756 \n",
+ " False \n",
+ " 0.000001 \n",
+ " 577063989.377794 \n",
+ " 577064738.922756 \n",
+ " False \n",
+ " 0.000001 \n",
+ " 34745.394012 \n",
+ " 34745.308858 \n",
+ " False \n",
+ " -0.000002 \n",
+ " \n",
+ " \n",
+ " 14 \n",
+ " 533170 \n",
+ " 533134 \n",
+ " False \n",
+ " 18756.131000 \n",
+ " 18756.152000 \n",
+ " False \n",
+ " 0.000001 \n",
+ " 0.678333 \n",
+ " 0.678333 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 1.017500 \n",
+ " 1.017500 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 159837046350337.375000 \n",
+ " 159836867391563.031250 \n",
+ " False \n",
+ " -0.000001 \n",
+ " 320415252401.716064 \n",
+ " 320415634421.822632 \n",
+ " False \n",
+ " 0.000001 \n",
+ " 213610168267.810699 \n",
+ " 213610422947.881744 \n",
+ " False \n",
+ " 0.000001 \n",
+ " 12861714.673009 \n",
+ " 12861685.894095 \n",
+ " False \n",
+ " -0.000002 \n",
+ " \n",
+ " \n",
+ " 16 \n",
+ " 533171 \n",
+ " 533135 \n",
+ " False \n",
+ " 12821.647000 \n",
+ " 12821.667000 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 0.003685 \n",
+ " 0.003685 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 0.001842 \n",
+ " 0.001842 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 233817432347029.937500 \n",
+ " 233817067624670.000000 \n",
+ " False \n",
+ " -0.000002 \n",
+ " 396631149.281868 \n",
+ " 396631796.779767 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 793262298.563737 \n",
+ " 793263593.559533 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 149517.520758 \n",
+ " 149517.054560 \n",
+ " False \n",
+ " -0.000003 \n",
+ " \n",
+ " \n",
+ " 18 \n",
+ " 533172 \n",
+ " 533136 \n",
+ " False \n",
+ " 12821.609000 \n",
+ " 12821.628000 \n",
+ " False \n",
+ " 0.000001 \n",
+ " 0.000367 \n",
+ " 0.000367 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 0.000367 \n",
+ " 0.000367 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 233818125322648.656250 \n",
+ " 233817778834325.812500 \n",
+ " False \n",
+ " -0.000001 \n",
+ " 79110727.468598 \n",
+ " 79110850.446628 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 79110727.468598 \n",
+ " 79110850.446628 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 14911.265829 \n",
+ " 14911.221662 \n",
+ " False \n",
+ " -0.000003 \n",
+ " \n",
+ " \n",
+ " 21 \n",
+ " 533173 \n",
+ " 533137 \n",
+ " False \n",
+ " 12821.596000 \n",
+ " 12821.615000 \n",
+ " False \n",
+ " 0.000001 \n",
+ " 0.104500 \n",
+ " 0.104500 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 0.156750 \n",
+ " 0.156750 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 233818362394198.031250 \n",
+ " 233818015905172.593750 \n",
+ " False \n",
+ " -0.000001 \n",
+ " 33743112809.694561 \n",
+ " 33743165263.586277 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 22495408539.796375 \n",
+ " 22495443509.057514 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 4240082.827183 \n",
+ " 4240070.267874 \n",
+ " False \n",
+ " -0.000003 \n",
+ " \n",
+ " \n",
+ " 8 \n",
+ " 11 \n",
+ " 533174 \n",
+ " 533138 \n",
+ " False \n",
+ " 18756.310000 \n",
+ " 18756.344000 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 0.016500 \n",
+ " 0.016500 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 0.011000 \n",
+ " 0.011000 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 159835520952682.000000 \n",
+ " 159835231215635.593750 \n",
+ " False \n",
+ " -0.000002 \n",
+ " 3463981732.966854 \n",
+ " 3463988263.802550 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 5195972599.450280 \n",
+ " 5195982395.703824 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 312846.547714 \n",
+ " 312845.414040 \n",
+ " False \n",
+ " -0.000004 \n",
+ " \n",
+ " \n",
+ " 14 \n",
+ " 533175 \n",
+ " 533139 \n",
+ " False \n",
+ " 18756.258000 \n",
+ " 18756.289000 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 0.048500 \n",
+ " 0.048500 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 0.048500 \n",
+ " 0.048500 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 159835964081961.343750 \n",
+ " 159835699908441.343750 \n",
+ " False \n",
+ " -0.000002 \n",
+ " 15272968025.182159 \n",
+ " 15272994377.367657 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 15272968025.182159 \n",
+ " 15272994377.367657 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 919584.345215 \n",
+ " 919581.307041 \n",
+ " False \n",
+ " -0.000003 \n",
+ " \n",
+ " \n",
+ " 15 \n",
+ " 533176 \n",
+ " 533140 \n",
+ " False \n",
+ " 18756.229000 \n",
+ " 18756.262000 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 0.727500 \n",
+ " 0.727500 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 0.970000 \n",
+ " 0.970000 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 159836211212818.968750 \n",
+ " 159835929995006.437500 \n",
+ " False \n",
+ " -0.000002 \n",
+ " 305458888217.462585 \n",
+ " 305459447832.601318 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 229094166163.096924 \n",
+ " 229094585874.450989 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 13793807.832803 \n",
+ " 13793759.318299 \n",
+ " False \n",
+ " -0.000004 \n",
+ " \n",
+ " \n",
+ " 18 \n",
+ " 533177 \n",
+ " 533141 \n",
+ " False \n",
+ " 12821.668000 \n",
+ " 12821.692000 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 0.003325 \n",
+ " 0.003325 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 0.002217 \n",
+ " 0.002217 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 233817049388581.875000 \n",
+ " 233816611723320.125000 \n",
+ " False \n",
+ " -0.000002 \n",
+ " 477178012.252622 \n",
+ " 477178940.107694 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 715767018.378934 \n",
+ " 715768410.161542 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 134910.211132 \n",
+ " 134909.706304 \n",
+ " False \n",
+ " -0.000004 \n",
+ " \n",
+ " \n",
+ " 21 \n",
+ " 533178 \n",
+ " 533142 \n",
+ " False \n",
+ " 12821.655000 \n",
+ " 12821.680000 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 0.007467 \n",
+ " 0.007467 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 0.007467 \n",
+ " 0.007467 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 233817286457949.437500 \n",
+ " 233816830555746.125000 \n",
+ " False \n",
+ " -0.000002 \n",
+ " 1607334832.632292 \n",
+ " 1607338083.399690 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 1607334832.632292 \n",
+ " 1607338083.399690 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 302956.877935 \n",
+ " 302955.697027 \n",
+ " False \n",
+ " -0.000004 \n",
+ " \n",
+ " \n",
+ " 22 \n",
+ " 533179 \n",
+ " 533143 \n",
+ " False \n",
+ " 12821.649000 \n",
+ " 12821.680000 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 0.112000 \n",
+ " 0.112000 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 0.149333 \n",
+ " 0.149333 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 233817395874742.812500 \n",
+ " 233816830555746.125000 \n",
+ " False \n",
+ " -0.000002 \n",
+ " 32146681609.332008 \n",
+ " 32146761667.993801 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 24110011206.999004 \n",
+ " 24110071250.995354 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 4544357.422163 \n",
+ " 4544335.455401 \n",
+ " False \n",
+ " -0.000005 \n",
+ " \n",
+ " \n",
+ " 9 \n",
+ " 17 \n",
+ " 533182 \n",
+ " 533146 \n",
+ " False \n",
+ " 40522.218000 \n",
+ " 40522.305000 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 0.053000 \n",
+ " 0.053000 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 0.053000 \n",
+ " 0.053000 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 73982243025295.406250 \n",
+ " 73982084187955.234375 \n",
+ " False \n",
+ " -0.000002 \n",
+ " 36058244909.477638 \n",
+ " 36058324944.436989 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 36058244909.477638 \n",
+ " 36058324944.436989 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 215293.877258 \n",
+ " 215292.953168 \n",
+ " False \n",
+ " -0.000004 \n",
+ " \n",
+ " \n",
+ " 19 \n",
+ " 533183 \n",
+ " 533147 \n",
+ " False \n",
+ " 40521.873000 \n",
+ " 40521.922000 \n",
+ " False \n",
+ " 0.000001 \n",
+ " 0.305000 \n",
+ " 0.305000 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 0.610000 \n",
+ " 0.610000 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 73982872904221.375000 \n",
+ " 73982783442503.046875 \n",
+ " False \n",
+ " -0.000001 \n",
+ " 415006455248.867004 \n",
+ " 415006987227.073730 \n",
+ " False \n",
+ " 0.000001 \n",
+ " 207503227624.433502 \n",
+ " 207503493613.536865 \n",
+ " False \n",
+ " 0.000001 \n",
+ " 1238976.428213 \n",
+ " 1238973.433926 \n",
+ " False \n",
+ " -0.000002 \n",
+ " \n",
+ " \n",
+ " 10 \n",
+ " 16 \n",
+ " 533180 \n",
+ " 533144 \n",
+ " False \n",
+ " 40522.316000 \n",
+ " 40522.305000 \n",
+ " False \n",
+ " -0.000000 \n",
+ " 0.181500 \n",
+ " 0.181500 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 0.181500 \n",
+ " 0.181500 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 73982064105121.734375 \n",
+ " 73982084187955.234375 \n",
+ " False \n",
+ " 0.000000 \n",
+ " 123482778842.156128 \n",
+ " 123482754290.854965 \n",
+ " False \n",
+ " -0.000000 \n",
+ " 123482778842.156128 \n",
+ " 123482754290.854965 \n",
+ " False \n",
+ " -0.000000 \n",
+ " 737276.409790 \n",
+ " 737276.811319 \n",
+ " False \n",
+ " 0.000001 \n",
+ " \n",
+ " \n",
+ " 18 \n",
+ " 533181 \n",
+ " 533145 \n",
+ " False \n",
+ " 40521.939000 \n",
+ " 40521.922000 \n",
+ " False \n",
+ " -0.000000 \n",
+ " 0.181500 \n",
+ " 0.181500 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 0.363000 \n",
+ " 0.363000 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 73982752404814.578125 \n",
+ " 73982783442503.046875 \n",
+ " False \n",
+ " 0.000000 \n",
+ " 246963260036.387970 \n",
+ " 246963174366.275055 \n",
+ " False \n",
+ " -0.000000 \n",
+ " 123481630018.193985 \n",
+ " 123481587183.137527 \n",
+ " False \n",
+ " -0.000000 \n",
+ " 737290.128507 \n",
+ " 737290.748385 \n",
+ " False \n",
+ " 0.000001 \n",
+ " \n",
+ " \n",
+ " 11 \n",
+ " 17 \n",
+ " 533184 \n",
+ " 533148 \n",
+ " False \n",
+ " 40522.957000 \n",
+ " 40523.074000 \n",
+ " False \n",
+ " 0.000003 \n",
+ " 0.106000 \n",
+ " 0.106000 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 0.053000 \n",
+ " 0.053000 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 73980893842470.562500 \n",
+ " 73980680241582.843750 \n",
+ " False \n",
+ " -0.000003 \n",
+ " 36058902500.406845 \n",
+ " 36059009230.582169 \n",
+ " False \n",
+ " 0.000003 \n",
+ " 72117805000.813690 \n",
+ " 72118018461.164337 \n",
+ " False \n",
+ " 0.000003 \n",
+ " 430572.049766 \n",
+ " 430569.564168 \n",
+ " False \n",
+ " -0.000006 \n",
+ " \n",
+ " \n",
+ " 19 \n",
+ " 533185 \n",
+ " 533149 \n",
+ " False \n",
+ " 40522.612000 \n",
+ " 40522.691000 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 0.061000 \n",
+ " 0.061000 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 0.061000 \n",
+ " 0.061000 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 73981523698423.000000 \n",
+ " 73981379469591.484375 \n",
+ " False \n",
+ " -0.000002 \n",
+ " 41501402374.824081 \n",
+ " 41501486297.327301 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 41501402374.824081 \n",
+ " 41501486297.327301 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 247786.247773 \n",
+ " 247785.282064 \n",
+ " False \n",
+ " -0.000004 \n",
+ " \n",
+ " \n",
+ " 20 \n",
+ " 533186 \n",
+ " 533150 \n",
+ " False \n",
+ " 40522.481000 \n",
+ " 40522.562000 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 0.365000 \n",
+ " 0.365000 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 0.547500 \n",
+ " 0.547500 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 73981762863927.296875 \n",
+ " 73981614982784.156250 \n",
+ " False \n",
+ " -0.000002 \n",
+ " 372490890906.855286 \n",
+ " 372491662530.036926 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 248327260604.570190 \n",
+ " 248327775020.024567 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 1482665.003194 \n",
+ " 1482659.078363 \n",
+ " False \n",
+ " -0.000004 \n",
+ " \n",
+ " \n",
+ " 12 \n",
+ " 16 \n",
+ " 533187 \n",
+ " 533151 \n",
+ " False \n",
+ " 40522.990000 \n",
+ " 40523.074000 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 0.046400 \n",
+ " 0.046400 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 0.023200 \n",
+ " 0.023200 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 73980833595941.468750 \n",
+ " 73980680241582.843750 \n",
+ " False \n",
+ " -0.000002 \n",
+ " 15784287156.039282 \n",
+ " 15784321021.688795 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 31568574312.078564 \n",
+ " 31568642043.377590 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 188476.514811 \n",
+ " 188475.733749 \n",
+ " False \n",
+ " -0.000004 \n",
+ " \n",
+ " \n",
+ " 18 \n",
+ " 533188 \n",
+ " 533152 \n",
+ " False \n",
+ " 40522.612000 \n",
+ " 40522.691000 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 0.004650 \n",
+ " 0.004650 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 0.004650 \n",
+ " 0.004650 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 73981523698423.000000 \n",
+ " 73981379469591.484375 \n",
+ " False \n",
+ " -0.000002 \n",
+ " 3163631492.507081 \n",
+ " 3163637889.878229 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 3163631492.507081 \n",
+ " 3163637889.878229 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 18888.623806 \n",
+ " 18888.550190 \n",
+ " False \n",
+ " -0.000004 \n",
+ " \n",
+ " \n",
+ " 21 \n",
+ " 533189 \n",
+ " 533153 \n",
+ " False \n",
+ " 40522.481000 \n",
+ " 40522.562000 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 0.593333 \n",
+ " 0.593333 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 0.890000 \n",
+ " 0.890000 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 73981762863927.296875 \n",
+ " 73981614982784.156250 \n",
+ " False \n",
+ " -0.000002 \n",
+ " 605510306679.636963 \n",
+ " 605511561007.731201 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 403673537786.424683 \n",
+ " 403674374005.154175 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 2410176.900170 \n",
+ " 2410167.268936 \n",
+ " False \n",
+ " -0.000004 \n",
+ " \n",
+ " \n",
+ " 13 \n",
+ " 18 \n",
+ " 533190 \n",
+ " 533154 \n",
+ " False \n",
+ " 40522.858000 \n",
+ " 40522.945000 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 0.041750 \n",
+ " 0.041750 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 0.027833 \n",
+ " 0.027833 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 73981074582646.656250 \n",
+ " 73980915750323.656250 \n",
+ " False \n",
+ " -0.000002 \n",
+ " 18936547188.244686 \n",
+ " 18936589219.204178 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 28404820782.367031 \n",
+ " 28404883828.806267 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 169589.348234 \n",
+ " 169588.620329 \n",
+ " False \n",
+ " -0.000004 \n",
+ " \n",
+ " \n",
+ " 21 \n",
+ " 533191 \n",
+ " 533155 \n",
+ " False \n",
+ " 40522.727000 \n",
+ " 40522.816000 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 0.042500 \n",
+ " 0.042500 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 0.042500 \n",
+ " 0.042500 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 73981313745247.203125 \n",
+ " 73981151260563.921875 \n",
+ " False \n",
+ " -0.000002 \n",
+ " 28914993548.910950 \n",
+ " 28915059155.014347 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 28914993548.910950 \n",
+ " 28915059155.014347 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 172636.979652 \n",
+ " 172636.221623 \n",
+ " False \n",
+ " -0.000004 \n",
+ " \n",
+ " \n",
+ " 22 \n",
+ " 533192 \n",
+ " 533156 \n",
+ " False \n",
+ " 40522.661000 \n",
+ " 40522.816000 \n",
+ " False \n",
+ " 0.000004 \n",
+ " 0.636250 \n",
+ " 0.636250 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 0.848333 \n",
+ " 0.848333 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 73981434239967.593750 \n",
+ " 73981151260563.921875 \n",
+ " False \n",
+ " -0.000004 \n",
+ " 577165009623.355591 \n",
+ " 577167259211.854858 \n",
+ " False \n",
+ " 0.000004 \n",
+ " 432873757217.516663 \n",
+ " 432875444408.891174 \n",
+ " False \n",
+ " 0.000004 \n",
+ " 2584485.555332 \n",
+ " 2584465.788419 \n",
+ " False \n",
+ " -0.000008 \n",
+ " \n",
+ " \n",
+ " 14 \n",
+ " 19 \n",
+ " 533193 \n",
+ " 533157 \n",
+ " False \n",
+ " 40522.858000 \n",
+ " 40522.945000 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 0.012425 \n",
+ " 0.012425 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 0.008283 \n",
+ " 0.008283 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 73981074582646.656250 \n",
+ " 73980915750323.656250 \n",
+ " False \n",
+ " -0.000002 \n",
+ " 5635607157.220125 \n",
+ " 5635619665.835015 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 8453410735.830187 \n",
+ " 8453429498.752523 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 50470.602438 \n",
+ " 50470.385811 \n",
+ " False \n",
+ " -0.000004 \n",
+ " \n",
+ " \n",
+ " 20 \n",
+ " 533194 \n",
+ " 533158 \n",
+ " False \n",
+ " 40522.727000 \n",
+ " 40522.816000 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 0.000592 \n",
+ " 0.000592 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 0.000592 \n",
+ " 0.000592 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 73981313745247.203125 \n",
+ " 73981151260563.921875 \n",
+ " False \n",
+ " -0.000002 \n",
+ " 402542067.053466 \n",
+ " 402542980.393337 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 402542067.053466 \n",
+ " 402542980.393337 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 2403.377560 \n",
+ " 2403.367007 \n",
+ " False \n",
+ " -0.000004 \n",
+ " \n",
+ " \n",
+ " 23 \n",
+ " 533195 \n",
+ " 533159 \n",
+ " False \n",
+ " 40522.661000 \n",
+ " 40522.816000 \n",
+ " False \n",
+ " 0.000004 \n",
+ " 0.942500 \n",
+ " 0.942500 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 1.256667 \n",
+ " 1.256667 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 73981434239967.593750 \n",
+ " 73981151260563.921875 \n",
+ " False \n",
+ " -0.000004 \n",
+ " 854975279481.355713 \n",
+ " 854978611877.678955 \n",
+ " False \n",
+ " 0.000004 \n",
+ " 641231459611.016846 \n",
+ " 641233958908.259277 \n",
+ " False \n",
+ " 0.000004 \n",
+ " 3828491.372731 \n",
+ " 3828462.091292 \n",
+ " False \n",
+ " -0.000008 \n",
+ " \n",
+ " \n",
+ " 15 \n",
+ " 20 \n",
+ " 533196 \n",
+ " 533160 \n",
+ " False \n",
+ " 40522.858000 \n",
+ " 40522.945000 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 0.011833 \n",
+ " 0.011833 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 0.008875 \n",
+ " 0.008875 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 73981074582646.656250 \n",
+ " 73980915750323.656250 \n",
+ " False \n",
+ " -0.000002 \n",
+ " 6038150525.592990 \n",
+ " 6038163927.680373 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 8050867367.457321 \n",
+ " 8050885236.907165 \n",
+ " False \n",
+ " 0.000002 \n",
+ " 48067.240418 \n",
+ " 48067.034105 \n",
+ " False \n",
+ " -0.000004 \n",
+ " \n",
+ " \n",
+ " 23 \n",
+ " 533197 \n",
+ " 533161 \n",
+ " False \n",
+ " 40522.793000 \n",
+ " 40522.945000 \n",
+ " False \n",
+ " 0.000004 \n",
+ " 0.067375 \n",
+ " 0.067375 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 0.067375 \n",
+ " 0.067375 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 73981193250919.281250 \n",
+ " 73980915750323.656250 \n",
+ " False \n",
+ " -0.000004 \n",
+ " 45838843843.212334 \n",
+ " 45839019112.953827 \n",
+ " False \n",
+ " 0.000004 \n",
+ " 45838843843.212334 \n",
+ " 45839019112.953827 \n",
+ " False \n",
+ " 0.000004 \n",
+ " 273679.496838 \n",
+ " 273677.444184 \n",
+ " False \n",
+ " -0.000008 \n",
+ " \n",
+ " \n",
+ " 24 \n",
+ " 533198 \n",
+ " 533162 \n",
+ " False \n",
+ " 40522.760000 \n",
+ " 40522.816000 \n",
+ " False \n",
+ " 0.000001 \n",
+ " 1.080000 \n",
+ " 1.080000 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 1.350000 \n",
+ " 1.350000 \n",
+ " True \n",
+ " 0.000000 \n",
+ " 73981253498034.187500 \n",
+ " 73981151260563.921875 \n",
+ " False \n",
+ " -0.000001 \n",
+ " 918477013639.626953 \n",
+ " 918478349629.867432 \n",
+ " False \n",
+ " 0.000001 \n",
+ " 734781610911.701538 \n",
+ " 734782679703.893921 \n",
+ " False \n",
+ " 0.000001 \n",
+ " 4387003.161266 \n",
+ " 4386991.043602 \n",
+ " False \n",
+ " -0.000003 \n",
+ " \n",
+ "
"
+ ],
+ "text/plain": [
+ ""
+ ]
+ },
+ "execution_count": 12,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "atc.ion_diff(\"lines\",(1,0), simplify_output=False)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
"metadata": {},
- "outputs": [],
"source": [
- "import pandas as pd\n",
- "from carsus.util import parse_selected_species"
+ "But these complex dataframes can also be represented in smaller formats:"
]
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 13,
+ "metadata": {
+ "ExecuteTime": {
+ "end_time": "2022-10-19T08:23:26.515926Z",
+ "start_time": "2022-10-19T08:23:26.465650Z"
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " total_rows \n",
+ " matches_line_id \n",
+ " matches_wavelength \n",
+ " matches_f_ul \n",
+ " matches_f_lu \n",
+ " matches_nu \n",
+ " matches_B_lu \n",
+ " matches_B_ul \n",
+ " matches_A_ul \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " values \n",
+ " 174 \n",
+ " 0 \n",
+ " 3 \n",
+ " 174 \n",
+ " 174 \n",
+ " 3 \n",
+ " 3 \n",
+ " 3 \n",
+ " 3 \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
"
+ ],
+ "text/plain": [
+ " total_rows matches_line_id matches_wavelength matches_f_ul \\\n",
+ "values 174 0 3 174 \n",
+ "\n",
+ " matches_f_lu matches_nu matches_B_lu matches_B_ul matches_A_ul \n",
+ "values 174 3 3 3 3 "
+ ]
+ },
+ "execution_count": 13,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "atc.ion_diff(\"lines\",\"He\",return_summary=True)"
+ ]
+ },
+ {
+ "cell_type": "markdown",
"metadata": {},
- "outputs": [],
"source": [
- "def highlight_values(val):\n",
- " if val == True:\n",
- " return 'background-color: #BCF5A9'\n",
- " else:\n",
- " return 'background-color: #F5A9A9'\n",
- " \n",
- "def highlight_diff(val):\n",
- " if val == 0:\n",
- " return 'background-color: #BCF5A9'\n",
- " else:\n",
- " return 'background-color: #F5A9A9'"
+ "Specific columns can be plotted:"
]
},
{
"cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
+ "execution_count": 14,
+ "metadata": {
+ "ExecuteTime": {
+ "end_time": "2022-10-19T08:23:28.965585Z",
+ "start_time": "2022-10-19T08:23:28.526202Z"
+ },
+ "scrolled": true
+ },
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "[\u001b[1m py.warnings\u001b[0m][\u001b[1;33mWARNING\u001b[0m] - /home/atharva/workspace/code/tardis-main/carsus/carsus/io/atom_data_compare.py:189: PerformanceWarning: indexing past lexsort depth may impact performance.\n",
+ " df1 = df1.loc[parsed_ion]\n",
+ " (\u001b[1mwarnings.py\u001b[0m:110)\n",
+ "[\u001b[1m py.warnings\u001b[0m][\u001b[1;33mWARNING\u001b[0m] - /home/atharva/workspace/code/tardis-main/carsus/carsus/io/atom_data_compare.py:190: PerformanceWarning: indexing past lexsort depth may impact performance.\n",
+ " df2 = df2.loc[parsed_ion]\n",
+ " (\u001b[1mwarnings.py\u001b[0m:110)\n"
+ ]
+ },
+ {
+ "data": {
+ "image/png": "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\n",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {
+ "needs_background": "light"
+ },
+ "output_type": "display_data"
+ }
+ ],
"source": [
- "def compare_levels_lines(path_a, path_b, ions='H-Zn'):\n",
- " \n",
- " # Read data\n",
- " levels_a = pd.read_hdf(path_a, key='levels_data')\n",
- " levels_b = pd.read_hdf(path_b, key='levels_data')\n",
- " lines_a = pd.read_hdf(path_a, key='lines_data')\n",
- " lines_b = pd.read_hdf(path_b, key='lines_data')\n",
- " \n",
- " # Get ions list\n",
- " ions = parse_selected_species(ions)\n",
- " \n",
- " lvl_eq = []\n",
- " lns_eq = []\n",
- " for ion in ions:\n",
- " \n",
- " # How many levels per ion in A\n",
- " try:\n",
- " num_lvl_a = len(levels_a.loc[ion])\n",
- " \n",
- " except (KeyError, TypeError, ValueError):\n",
- " num_lvl_a = 0\n",
- " \n",
- " # How many levels per ion in B\n",
- " try:\n",
- " num_lvl_b = len(levels_b.loc[ion])\n",
- " \n",
- " except (KeyError, TypeError, ValueError):\n",
- " num_lvl_b = 0\n",
- "\n",
- " # If level number is the same in A and B (and not zero) \n",
- " # then compare cell against cell. `True` means all cells \n",
- " # are equal in both dataframes.\n",
- " if num_lvl_a == num_lvl_b:\n",
- " val_lvl = True\n",
- " \n",
- " if num_lvl_a != 0:\n",
- " try:\n",
- " k = levels_a.loc[ion].eq(levels_b.loc[ion]).sum().sum()\n",
- " if num_lvl_a*3 != k: # x3 because this df has three columns!\n",
- " val_lvl = False\n",
- " \n",
- " except (KeyError, TypeError, ValueError):\n",
- " pass\n",
- "\n",
- " else:\n",
- " val_lvl = False\n",
- " \n",
- " # Append the results\n",
- " lvl_eq.append((ion, num_lvl_a, num_lvl_b, val_lvl))\n",
- " \n",
- " \n",
- " # Same for lines\n",
- " try:\n",
- " num_lns_a = len(lines_a.loc[ion])\n",
- " \n",
- " except (KeyError, TypeError, ValueError):\n",
- " num_lns_a = 0\n",
- " \n",
- " try:\n",
- " num_lns_b = len(lines_b.loc[ion])\n",
- " \n",
- " except (KeyError, TypeError, ValueError):\n",
- " num_lns_b = 0\n",
- "\n",
- " if num_lns_a == num_lns_b:\n",
- " val_lns = True\n",
- " \n",
- " if num_lns_a != 0:\n",
- " try:\n",
- " k = lines_a.loc[ion].eq(lines_b.loc[ion]).sum().sum()\n",
- " if num_lns_a*8 != k:\n",
- " val_lvl = False\n",
- " \n",
- " except (KeyError, TypeError, ValueError):\n",
- " pass\n",
- " \n",
- " else:\n",
- " val_lns = False\n",
- " \n",
- " lns_eq.append((ion, num_lns_a, num_lns_b, val_lns))\n",
- " \n",
- " df_lvl = pd.DataFrame(lvl_eq, columns=['ion', 'num_lvl_a', 'num_lvl_b', 'val_lvl'])\n",
- " df_lns = pd.DataFrame(lns_eq, columns=['ion', 'num_lns_a', 'num_lns_b', 'val_lns'])\n",
- " df = pd.merge(df_lvl, df_lns).set_index('ion')\n",
- " \n",
- " df['diff_lvl'] = abs(df['num_lvl_b'] - df['num_lvl_a'])\n",
- " df['diff_lns'] = abs(df['num_lns_b'] - df['num_lns_a'])\n",
- " df = df[['num_lvl_a', 'num_lvl_b', 'diff_lvl', 'val_lvl', \n",
- " 'num_lns_a', 'num_lns_b', 'diff_lns', 'val_lns']]\n",
- "\n",
- " return df"
+ "atc.plot_ion_diff(key_name=\"lines\", ion=\"Fe\", column=\"wavelength\")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 15,
+ "metadata": {
+ "ExecuteTime": {
+ "end_time": "2022-10-19T08:23:30.380013Z",
+ "start_time": "2022-10-19T08:23:30.210549Z"
+ },
+ "scrolled": true
+ },
+ "outputs": [
+ {
+ "data": {
+ "image/png": "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\n",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {
+ "needs_background": "light"
+ },
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "atc.plot_ion_diff(key_name=\"lines\", ion=(23,0), column=\"f_ul\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
- "Then, the comparison is straightforward:"
+ "The dataframes are available as attributes as well:"
]
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 16,
"metadata": {
- "scrolled": false
+ "ExecuteTime": {
+ "end_time": "2022-10-19T08:23:31.825841Z",
+ "start_time": "2022-10-19T08:23:31.803467Z"
+ }
},
- "outputs": [],
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " line_id \n",
+ " wavelength \n",
+ " f_ul \n",
+ " f_lu \n",
+ " nu \n",
+ " B_lu \n",
+ " B_ul \n",
+ " A_ul \n",
+ " \n",
+ " \n",
+ " atomic_number \n",
+ " ion_number \n",
+ " level_number_lower \n",
+ " level_number_upper \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 3 \n",
+ " 0 \n",
+ " 22 \n",
+ " 66 \n",
+ " 1824 \n",
+ " 16404.816436 \n",
+ " 0.000458 \n",
+ " 0.000305 \n",
+ " 1.827466e+14 \n",
+ " 8.411155e+07 \n",
+ " 1.261673e+08 \n",
+ " 1.135375e+04 \n",
+ " \n",
+ " \n",
+ " 29 \n",
+ " 66 \n",
+ " 1925 \n",
+ " 27592.029652 \n",
+ " 0.001227 \n",
+ " 0.000818 \n",
+ " 1.086518e+14 \n",
+ " 3.790250e+08 \n",
+ " 5.685376e+08 \n",
+ " 1.075264e+04 \n",
+ " \n",
+ " \n",
+ " 37 \n",
+ " 66 \n",
+ " 2000 \n",
+ " 43823.900517 \n",
+ " 0.000276 \n",
+ " 0.000276 \n",
+ " 6.840844e+13 \n",
+ " 2.030891e+08 \n",
+ " 2.030891e+08 \n",
+ " 9.586502e+02 \n",
+ " \n",
+ " \n",
+ " 38 \n",
+ " 66 \n",
+ " 2002 \n",
+ " 43823.973537 \n",
+ " 0.002517 \n",
+ " 0.001678 \n",
+ " 6.840832e+13 \n",
+ " 1.234798e+09 \n",
+ " 1.852197e+09 \n",
+ " 8.742965e+03 \n",
+ " \n",
+ " \n",
+ " 44 \n",
+ " 66 \n",
+ " 2050 \n",
+ " 67909.408678 \n",
+ " 0.000619 \n",
+ " 0.000619 \n",
+ " 4.414594e+13 \n",
+ " 7.061638e+08 \n",
+ " 7.061638e+08 \n",
+ " 8.958233e+02 \n",
+ " \n",
+ " \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " \n",
+ " \n",
+ " 2 \n",
+ " 1 \n",
+ " 11 \n",
+ " 21 \n",
+ " 533438 \n",
+ " 10126.249000 \n",
+ " 0.593500 \n",
+ " 0.890250 \n",
+ " 2.960548e+14 \n",
+ " 1.513548e+11 \n",
+ " 1.009032e+11 \n",
+ " 3.860697e+07 \n",
+ " \n",
+ " \n",
+ " 13 \n",
+ " 21 \n",
+ " 533440 \n",
+ " 10126.499000 \n",
+ " 0.042400 \n",
+ " 0.042400 \n",
+ " 2.960475e+14 \n",
+ " 7.208762e+09 \n",
+ " 7.208762e+09 \n",
+ " 2.757969e+06 \n",
+ " \n",
+ " \n",
+ " 22 \n",
+ " 533441 \n",
+ " 10126.436000 \n",
+ " 0.636000 \n",
+ " 0.848000 \n",
+ " 2.960493e+14 \n",
+ " 1.441743e+11 \n",
+ " 1.081308e+11 \n",
+ " 4.137005e+07 \n",
+ " \n",
+ " \n",
+ " 14 \n",
+ " 23 \n",
+ " 533442 \n",
+ " 10126.436000 \n",
+ " 1.009500 \n",
+ " 1.346000 \n",
+ " 2.960493e+14 \n",
+ " 2.288428e+11 \n",
+ " 1.716321e+11 \n",
+ " 6.566521e+07 \n",
+ " \n",
+ " \n",
+ " 15 \n",
+ " 24 \n",
+ " 533443 \n",
+ " 10126.523000 \n",
+ " 1.047000 \n",
+ " 1.308750 \n",
+ " 2.960468e+14 \n",
+ " 2.225115e+11 \n",
+ " 1.780092e+11 \n",
+ " 6.810331e+07 \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
271771 rows × 8 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " line_id \\\n",
+ "atomic_number ion_number level_number_lower level_number_upper \n",
+ "3 0 22 66 1824 \n",
+ " 29 66 1925 \n",
+ " 37 66 2000 \n",
+ " 38 66 2002 \n",
+ " 44 66 2050 \n",
+ "... ... \n",
+ "2 1 11 21 533438 \n",
+ " 13 21 533440 \n",
+ " 22 533441 \n",
+ " 14 23 533442 \n",
+ " 15 24 533443 \n",
+ "\n",
+ " wavelength \\\n",
+ "atomic_number ion_number level_number_lower level_number_upper \n",
+ "3 0 22 66 16404.816436 \n",
+ " 29 66 27592.029652 \n",
+ " 37 66 43823.900517 \n",
+ " 38 66 43823.973537 \n",
+ " 44 66 67909.408678 \n",
+ "... ... \n",
+ "2 1 11 21 10126.249000 \n",
+ " 13 21 10126.499000 \n",
+ " 22 10126.436000 \n",
+ " 14 23 10126.436000 \n",
+ " 15 24 10126.523000 \n",
+ "\n",
+ " f_ul \\\n",
+ "atomic_number ion_number level_number_lower level_number_upper \n",
+ "3 0 22 66 0.000458 \n",
+ " 29 66 0.001227 \n",
+ " 37 66 0.000276 \n",
+ " 38 66 0.002517 \n",
+ " 44 66 0.000619 \n",
+ "... ... \n",
+ "2 1 11 21 0.593500 \n",
+ " 13 21 0.042400 \n",
+ " 22 0.636000 \n",
+ " 14 23 1.009500 \n",
+ " 15 24 1.047000 \n",
+ "\n",
+ " f_lu \\\n",
+ "atomic_number ion_number level_number_lower level_number_upper \n",
+ "3 0 22 66 0.000305 \n",
+ " 29 66 0.000818 \n",
+ " 37 66 0.000276 \n",
+ " 38 66 0.001678 \n",
+ " 44 66 0.000619 \n",
+ "... ... \n",
+ "2 1 11 21 0.890250 \n",
+ " 13 21 0.042400 \n",
+ " 22 0.848000 \n",
+ " 14 23 1.346000 \n",
+ " 15 24 1.308750 \n",
+ "\n",
+ " nu \\\n",
+ "atomic_number ion_number level_number_lower level_number_upper \n",
+ "3 0 22 66 1.827466e+14 \n",
+ " 29 66 1.086518e+14 \n",
+ " 37 66 6.840844e+13 \n",
+ " 38 66 6.840832e+13 \n",
+ " 44 66 4.414594e+13 \n",
+ "... ... \n",
+ "2 1 11 21 2.960548e+14 \n",
+ " 13 21 2.960475e+14 \n",
+ " 22 2.960493e+14 \n",
+ " 14 23 2.960493e+14 \n",
+ " 15 24 2.960468e+14 \n",
+ "\n",
+ " B_lu \\\n",
+ "atomic_number ion_number level_number_lower level_number_upper \n",
+ "3 0 22 66 8.411155e+07 \n",
+ " 29 66 3.790250e+08 \n",
+ " 37 66 2.030891e+08 \n",
+ " 38 66 1.234798e+09 \n",
+ " 44 66 7.061638e+08 \n",
+ "... ... \n",
+ "2 1 11 21 1.513548e+11 \n",
+ " 13 21 7.208762e+09 \n",
+ " 22 1.441743e+11 \n",
+ " 14 23 2.288428e+11 \n",
+ " 15 24 2.225115e+11 \n",
+ "\n",
+ " B_ul \\\n",
+ "atomic_number ion_number level_number_lower level_number_upper \n",
+ "3 0 22 66 1.261673e+08 \n",
+ " 29 66 5.685376e+08 \n",
+ " 37 66 2.030891e+08 \n",
+ " 38 66 1.852197e+09 \n",
+ " 44 66 7.061638e+08 \n",
+ "... ... \n",
+ "2 1 11 21 1.009032e+11 \n",
+ " 13 21 7.208762e+09 \n",
+ " 22 1.081308e+11 \n",
+ " 14 23 1.716321e+11 \n",
+ " 15 24 1.780092e+11 \n",
+ "\n",
+ " A_ul \n",
+ "atomic_number ion_number level_number_lower level_number_upper \n",
+ "3 0 22 66 1.135375e+04 \n",
+ " 29 66 1.075264e+04 \n",
+ " 37 66 9.586502e+02 \n",
+ " 38 66 8.742965e+03 \n",
+ " 44 66 8.958233e+02 \n",
+ "... ... \n",
+ "2 1 11 21 3.860697e+07 \n",
+ " 13 21 2.757969e+06 \n",
+ " 22 4.137005e+07 \n",
+ " 14 23 6.566521e+07 \n",
+ " 15 24 6.810331e+07 \n",
+ "\n",
+ "[271771 rows x 8 columns]"
+ ]
+ },
+ "execution_count": 16,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
"source": [
- "tt = compare_levels_lines('A.h5', 'B.h5', ions='H-C')"
+ "atc.lines1"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 17,
+ "metadata": {
+ "ExecuteTime": {
+ "end_time": "2022-10-19T08:23:32.047187Z",
+ "start_time": "2022-10-19T08:23:32.014781Z"
+ }
+ },
+ "outputs": [
+ {
+ "data": {
+ "text/html": [
+ "\n",
+ "\n",
+ "
\n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " line_id \n",
+ " wavelength \n",
+ " f_ul \n",
+ " f_lu \n",
+ " nu \n",
+ " B_lu \n",
+ " B_ul \n",
+ " A_ul \n",
+ " \n",
+ " \n",
+ " atomic_number \n",
+ " ion_number \n",
+ " level_number_lower \n",
+ " level_number_upper \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " \n",
+ " 3 \n",
+ " 0 \n",
+ " 21 \n",
+ " 67 \n",
+ " 1823 \n",
+ " 16404.775425 \n",
+ " 0.000503 \n",
+ " 0.000252 \n",
+ " 1.827471e+14 \n",
+ " 6.933393e+07 \n",
+ " 1.386679e+08 \n",
+ " 1.247877e+04 \n",
+ " \n",
+ " \n",
+ " 28 \n",
+ " 67 \n",
+ " 1923 \n",
+ " 27591.968635 \n",
+ " 0.001349 \n",
+ " 0.000674 \n",
+ " 1.086521e+14 \n",
+ " 3.124340e+08 \n",
+ " 6.248679e+08 \n",
+ " 1.181808e+04 \n",
+ " \n",
+ " \n",
+ " 37 \n",
+ " 67 \n",
+ " 2001 \n",
+ " 43823.900517 \n",
+ " 0.002767 \n",
+ " 0.001383 \n",
+ " 6.840844e+13 \n",
+ " 1.017857e+09 \n",
+ " 2.035713e+09 \n",
+ " 9.609265e+03 \n",
+ " \n",
+ " \n",
+ " 44 \n",
+ " 67 \n",
+ " 2052 \n",
+ " 67909.408678 \n",
+ " 0.006208 \n",
+ " 0.003104 \n",
+ " 4.414594e+13 \n",
+ " 3.539203e+09 \n",
+ " 7.078406e+09 \n",
+ " 8.979504e+03 \n",
+ " \n",
+ " \n",
+ " 51 \n",
+ " 67 \n",
+ " 2107 \n",
+ " 105557.600728 \n",
+ " 0.011721 \n",
+ " 0.005861 \n",
+ " 2.840084e+13 \n",
+ " 1.038640e+10 \n",
+ " 2.077280e+10 \n",
+ " 7.016705e+03 \n",
+ " \n",
+ " \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " ... \n",
+ " \n",
+ " \n",
+ " 2 \n",
+ " 1 \n",
+ " 11 \n",
+ " 21 \n",
+ " 533410 \n",
+ " 10126.280000 \n",
+ " 0.593500 \n",
+ " 0.890250 \n",
+ " 2.960539e+14 \n",
+ " 1.513552e+11 \n",
+ " 1.009035e+11 \n",
+ " 3.860674e+07 \n",
+ " \n",
+ " \n",
+ " 13 \n",
+ " 21 \n",
+ " 533412 \n",
+ " 10126.505000 \n",
+ " 0.042400 \n",
+ " 0.042400 \n",
+ " 2.960473e+14 \n",
+ " 7.208767e+09 \n",
+ " 7.208767e+09 \n",
+ " 2.757966e+06 \n",
+ " \n",
+ " \n",
+ " 22 \n",
+ " 533413 \n",
+ " 10126.440000 \n",
+ " 0.636000 \n",
+ " 0.848000 \n",
+ " 2.960492e+14 \n",
+ " 1.441744e+11 \n",
+ " 1.081308e+11 \n",
+ " 4.137002e+07 \n",
+ " \n",
+ " \n",
+ " 14 \n",
+ " 23 \n",
+ " 533414 \n",
+ " 10126.440000 \n",
+ " 1.009500 \n",
+ " 1.346000 \n",
+ " 2.960492e+14 \n",
+ " 2.288429e+11 \n",
+ " 1.716322e+11 \n",
+ " 6.566515e+07 \n",
+ " \n",
+ " \n",
+ " 15 \n",
+ " 24 \n",
+ " 533415 \n",
+ " 10126.537000 \n",
+ " 1.047000 \n",
+ " 1.308750 \n",
+ " 2.960464e+14 \n",
+ " 2.225119e+11 \n",
+ " 1.780095e+11 \n",
+ " 6.810312e+07 \n",
+ " \n",
+ " \n",
+ "
\n",
+ "
271741 rows × 8 columns
\n",
+ "
"
+ ],
+ "text/plain": [
+ " line_id \\\n",
+ "atomic_number ion_number level_number_lower level_number_upper \n",
+ "3 0 21 67 1823 \n",
+ " 28 67 1923 \n",
+ " 37 67 2001 \n",
+ " 44 67 2052 \n",
+ " 51 67 2107 \n",
+ "... ... \n",
+ "2 1 11 21 533410 \n",
+ " 13 21 533412 \n",
+ " 22 533413 \n",
+ " 14 23 533414 \n",
+ " 15 24 533415 \n",
+ "\n",
+ " wavelength \\\n",
+ "atomic_number ion_number level_number_lower level_number_upper \n",
+ "3 0 21 67 16404.775425 \n",
+ " 28 67 27591.968635 \n",
+ " 37 67 43823.900517 \n",
+ " 44 67 67909.408678 \n",
+ " 51 67 105557.600728 \n",
+ "... ... \n",
+ "2 1 11 21 10126.280000 \n",
+ " 13 21 10126.505000 \n",
+ " 22 10126.440000 \n",
+ " 14 23 10126.440000 \n",
+ " 15 24 10126.537000 \n",
+ "\n",
+ " f_ul \\\n",
+ "atomic_number ion_number level_number_lower level_number_upper \n",
+ "3 0 21 67 0.000503 \n",
+ " 28 67 0.001349 \n",
+ " 37 67 0.002767 \n",
+ " 44 67 0.006208 \n",
+ " 51 67 0.011721 \n",
+ "... ... \n",
+ "2 1 11 21 0.593500 \n",
+ " 13 21 0.042400 \n",
+ " 22 0.636000 \n",
+ " 14 23 1.009500 \n",
+ " 15 24 1.047000 \n",
+ "\n",
+ " f_lu \\\n",
+ "atomic_number ion_number level_number_lower level_number_upper \n",
+ "3 0 21 67 0.000252 \n",
+ " 28 67 0.000674 \n",
+ " 37 67 0.001383 \n",
+ " 44 67 0.003104 \n",
+ " 51 67 0.005861 \n",
+ "... ... \n",
+ "2 1 11 21 0.890250 \n",
+ " 13 21 0.042400 \n",
+ " 22 0.848000 \n",
+ " 14 23 1.346000 \n",
+ " 15 24 1.308750 \n",
+ "\n",
+ " nu \\\n",
+ "atomic_number ion_number level_number_lower level_number_upper \n",
+ "3 0 21 67 1.827471e+14 \n",
+ " 28 67 1.086521e+14 \n",
+ " 37 67 6.840844e+13 \n",
+ " 44 67 4.414594e+13 \n",
+ " 51 67 2.840084e+13 \n",
+ "... ... \n",
+ "2 1 11 21 2.960539e+14 \n",
+ " 13 21 2.960473e+14 \n",
+ " 22 2.960492e+14 \n",
+ " 14 23 2.960492e+14 \n",
+ " 15 24 2.960464e+14 \n",
+ "\n",
+ " B_lu \\\n",
+ "atomic_number ion_number level_number_lower level_number_upper \n",
+ "3 0 21 67 6.933393e+07 \n",
+ " 28 67 3.124340e+08 \n",
+ " 37 67 1.017857e+09 \n",
+ " 44 67 3.539203e+09 \n",
+ " 51 67 1.038640e+10 \n",
+ "... ... \n",
+ "2 1 11 21 1.513552e+11 \n",
+ " 13 21 7.208767e+09 \n",
+ " 22 1.441744e+11 \n",
+ " 14 23 2.288429e+11 \n",
+ " 15 24 2.225119e+11 \n",
+ "\n",
+ " B_ul \\\n",
+ "atomic_number ion_number level_number_lower level_number_upper \n",
+ "3 0 21 67 1.386679e+08 \n",
+ " 28 67 6.248679e+08 \n",
+ " 37 67 2.035713e+09 \n",
+ " 44 67 7.078406e+09 \n",
+ " 51 67 2.077280e+10 \n",
+ "... ... \n",
+ "2 1 11 21 1.009035e+11 \n",
+ " 13 21 7.208767e+09 \n",
+ " 22 1.081308e+11 \n",
+ " 14 23 1.716322e+11 \n",
+ " 15 24 1.780095e+11 \n",
+ "\n",
+ " A_ul \n",
+ "atomic_number ion_number level_number_lower level_number_upper \n",
+ "3 0 21 67 1.247877e+04 \n",
+ " 28 67 1.181808e+04 \n",
+ " 37 67 9.609265e+03 \n",
+ " 44 67 8.979504e+03 \n",
+ " 51 67 7.016705e+03 \n",
+ "... ... \n",
+ "2 1 11 21 3.860674e+07 \n",
+ " 13 21 2.757966e+06 \n",
+ " 22 4.137002e+07 \n",
+ " 14 23 6.566515e+07 \n",
+ " 15 24 6.810312e+07 \n",
+ "\n",
+ "[271741 rows x 8 columns]"
+ ]
+ },
+ "execution_count": 17,
+ "metadata": {},
+ "output_type": "execute_result"
+ }
+ ],
+ "source": [
+ "atc.lines2"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
- "```\n",
- "num_xxx_y (int) : number of levels/lines.\n",
- "diff_xxx (int) : difference in number of levels/lines.\n",
- "val_xxx (bool) : `True` if levels/lines have the same value.\n",
- "```"
+ "Finally, open HDF files can be closed."
]
},
{
"cell_type": "code",
- "execution_count": null,
+ "execution_count": 18,
"metadata": {
- "scrolled": false
+ "ExecuteTime": {
+ "end_time": "2022-10-19T08:23:33.716686Z",
+ "start_time": "2022-10-19T08:23:33.708798Z"
+ }
},
"outputs": [],
"source": [
- "tt.style.applymap(highlight_values, subset=['val_lvl', 'val_lns']).applymap(\n",
- " highlight_diff, subset=['diff_lvl', 'diff_lns'])"
+ "atc.teardown()"
]
}
],
@@ -298,7 +14775,41 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
- "version": "3.6.13"
+ "version": "3.7.12"
+ },
+ "varInspector": {
+ "cols": {
+ "lenName": 16,
+ "lenType": 16,
+ "lenVar": 40
+ },
+ "kernels_config": {
+ "python": {
+ "delete_cmd_postfix": "",
+ "delete_cmd_prefix": "del ",
+ "library": "var_list.py",
+ "varRefreshCmd": "print(var_dic_list())"
+ },
+ "r": {
+ "delete_cmd_postfix": ") ",
+ "delete_cmd_prefix": "rm(",
+ "library": "var_list.r",
+ "varRefreshCmd": "cat(var_dic_list()) "
+ }
+ },
+ "types_to_exclude": [
+ "module",
+ "function",
+ "builtin_function_or_method",
+ "instance",
+ "_Feature"
+ ],
+ "window_display": false
+ },
+ "vscode": {
+ "interpreter": {
+ "hash": "1594b6449aff2491ee84a7254c10f95be8345f93ea2e356d3f1569225a7f1028"
+ }
},
"widgets": {
"application/vnd.jupyter.widget-state+json": {
diff --git a/docs/development/testing.rst b/docs/development/testing.rst
index 0e2614b82..0c7617f22 100644
--- a/docs/development/testing.rst
+++ b/docs/development/testing.rst
@@ -34,6 +34,13 @@ A set of flags can be appended to the above command to run different kinds of te
- `--cov=carsus --cov-report=xml --cov-report=html`
Get code coverage results using the `pytest-cov `_ plugin.
+- `--arraydiff-generate-path=carsus-refdata/arraydiff`
+ Generate reference files for tests marked with ``@pytest.mark.array_compare`` decorator and save them in the
+ refdata folder.
+
+- `--arraydiff --arraydiff-reference-path=carsus-refdata/arraydiff`
+ Run tests marked with ``@pytest.mark.array_compare`` decorator.
+ The tests would look for reference files in the refdata folder which can be generated using the above option.
==============
Notebook Tests
diff --git a/docs/index.rst b/docs/index.rst
index 3a2ba0410..7ece083e3 100644
--- a/docs/index.rst
+++ b/docs/index.rst
@@ -10,6 +10,7 @@ Carsus is a package to manage atomic datasets. It can read data from a variety o
installation.rst
quickstart
+ development/compare_atomic_files
.. toctree::
:maxdepth: 2
diff --git a/docs/installation.rst b/docs/installation.rst
index 832688929..543ca38bd 100644
--- a/docs/installation.rst
+++ b/docs/installation.rst
@@ -7,7 +7,7 @@ Prerequisites
=============
#. Requires a valid Anaconda `or Miniconda `_ installation.
-#. Download and extract the `Chianti Atomic Database `_ **v9.0.1** and set the following environment variable in your shell configuration file:
+#. *(optional)*. Download and extract the `Chianti Atomic Database `_ **v9.0.1** and set the following environment variable in your shell configuration file:
.. code ::
diff --git a/docs/io/cmfgen.ipynb b/docs/io/cmfgen.ipynb
index a35252e9c..0a37a6847 100644
--- a/docs/io/cmfgen.ipynb
+++ b/docs/io/cmfgen.ipynb
@@ -277,7 +277,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "The values in the collisions dataframe are thermally-averaged effective collision strengths divided by the statistical weights of the lower levels. Please see Eq. A1 and A2 of [Przybilla & Butler, 2004](https://ui.adsabs.harvard.edu/abs/2004ApJ...609.1181P/abstract) for definitions. More information about the `collisions` table is stored inside the `collisional_metadata` attribute. "
+ "The values in the collisions dataframe are thermally-averaged effective collision strengths divided by the statistical weights of the lower levels. Please see Eq. A1 and A2 of Przybilla & Butler, 2004 for definitions. More information about the `collisions` table is stored inside the `collisional_metadata` attribute. "
]
},
{
diff --git a/docs/quickstart.ipynb b/docs/quickstart.ipynb
index c5860cef1..00f92b95a 100644
--- a/docs/quickstart.ipynb
+++ b/docs/quickstart.ipynb
@@ -10,9 +10,9 @@
"\n",
"\n",
"\n",
- "**Read first:**\n",
+ "**Note:**\n",
"\n",
- "Get familiar with [Notation in Carsus](development/notation.rst) and learn how to select different sets of ions.\n",
+ "Get familiar with the [Notation in Carsus](development/notation.rst) and learn how to correctly select ions.\n",
" \n",
"
"
]
@@ -21,7 +21,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "## Atomic Weights and Ionization Energies\n",
+ "## Atomic Weights and Ionization Energies (NIST)\n",
"\n",
"Download atomic weights and ionization energies from the National Institute of Standards and Technology (NIST)."
]
@@ -49,9 +49,9 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "## Levels, Lines, Collisions and Cross-sections\n",
+ "## Levels, Lines, Collisions & Cross-sections\n",
"\n",
- "Carsus supports three sources of energy levels and spectral lines: GFALL, CHIANTI and CMFGEN.\n",
+ "Carsus supports three sources of energy levels and spectral lines: **GFALL**, **CHIANTI** and **CMFGEN**.\n",
"\n",
"### GFALL\n",
"\n",
@@ -61,7 +61,7 @@
"\n",
"**Warning:**\n",
" \n",
- "Creating a `GFALLReader` instance is **required**. Other sources of levels and lines are **optional**.\n",
+ "Creating a `GFALLReader` instance is **required**.\n",
"\n",
""
]
@@ -83,7 +83,8 @@
"source": [
"from carsus.io.kurucz import GFALLReader\n",
"\n",
- "gfall_reader = GFALLReader('H-Zn', '/tmp/gfall.dat')"
+ "gfall_reader = GFALLReader('H-Zn',\n",
+ " '/tmp/gfall.dat')"
]
},
{
@@ -92,7 +93,15 @@
"source": [
"### CHIANTI\n",
"\n",
- "The Chianti Atomic Database reader provides levels and lines but also **collision strengths**."
+ "The Chianti Atomic Database reader provides levels and lines but also **collision strengths**.\n",
+ "\n",
+ "\n",
+ "\n",
+ "**Note:**\n",
+ "\n",
+ "Creating a `ChiantiReader` instance is **optional**. \n",
+ "\n",
+ "
"
]
},
{
@@ -103,7 +112,9 @@
"source": [
"from carsus.io.chianti_ import ChiantiReader\n",
"\n",
- "chianti_reader = ChiantiReader('H-He', collisions=True, priority=20)"
+ "chianti_reader = ChiantiReader('H-He', \n",
+ " collisions=True, \n",
+ " priority=20)"
]
},
{
@@ -119,24 +130,15 @@
"source": [
"### CMFGEN\n",
"\n",
- "The atomic database of [CMFGEN](http://kookaburra.phyast.pitt.edu/hillier/web/CMFGEN.htm) is a source of levels, lines and (optionally) **ionization energies**, **photoionization cross-sections** and **collisions** ."
- ]
- },
- {
- "cell_type": "code",
- "execution_count": null,
- "metadata": {},
- "outputs": [],
- "source": [
- "from carsus.io.cmfgen import CMFGENReader\n",
+ "The atomic database of [CMFGEN](http://kookaburra.phyast.pitt.edu/hillier/web/CMFGEN.htm) is a source of levels, lines and (optionally) **ionization energies**, **photoionization cross-sections** and **collisions**.\n",
"\n",
- "cmfgen_reader = CMFGENReader.from_config('Si 0-1', '/tmp/atomic', \n",
- " priority=30,\n",
- " ionization_energies=True,\n",
- " cross_sections=True,\n",
- " collisions=False,\n",
- " temperature_grid=None,\n",
- " drop_mismatched_labels=True)"
+ "\n",
+ " \n",
+ "**Note:**\n",
+ "\n",
+ "Creating a `CMFGENReader` instance is **optional**. \n",
+ "\n",
+ "
"
]
},
{
@@ -147,11 +149,9 @@
"\n",
"**Warning:**\n",
" \n",
- "Remember that cross-sections requires data from `H 0` so give this the reader enough `priority`. \n",
+ "Cross-sections require data from `H 0`, use this the reader with enough `priority` to select levels from this ion.\n",
"\n",
- "\n",
- "\n",
- "If you want to use the **ionization energies** from CMFGEN, you will need to apply this dirty hack to merge both sources:"
+ ""
]
},
{
@@ -160,11 +160,16 @@
"metadata": {},
"outputs": [],
"source": [
- "import copy\n",
- "import pandas as pd\n",
+ "from carsus.io.cmfgen import CMFGENReader\n",
"\n",
- "combined_ionization_energies = copy.deepcopy(ionization_energies)\n",
- "combined_ionization_energies.base = cmfgen_reader.ionization_energies.combine_first(ionization_energies.base)"
+ "cmfgen_reader = CMFGENReader.from_config('Si 0-1', \n",
+ " '/tmp/atomic', \n",
+ " priority=30,\n",
+ " ionization_energies=True,\n",
+ " cross_sections=True,\n",
+ " collisions=False,\n",
+ " temperature_grid=None,\n",
+ " drop_mismatched_labels=True)"
]
},
{
@@ -173,7 +178,7 @@
"source": [
"## Zeta Data\n",
"\n",
- "Knox S. Long's ground state recombinations fractions ($\\zeta$)."
+ "Long & Knigge's ground state recombinations fractions ($\\zeta$)."
]
},
{
@@ -191,7 +196,7 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "## Dump to HDF5\n",
+ "## Create an Atomic Data File\n",
"\n",
"Finally, create a `TARDISAtomData` object and dump the data with the `to_hdf` method."
]
@@ -207,7 +212,7 @@
"from carsus.io.output import TARDISAtomData\n",
"\n",
"atom_data = TARDISAtomData(atomic_weights,\n",
- " combined_ionization_energies,\n",
+ " ionization_energies,\n",
" gfall_reader,\n",
" zeta_data,\n",
" chianti_reader,\n",
@@ -234,9 +239,9 @@
"cell_type": "markdown",
"metadata": {},
"source": [
- "## Metadata\n",
+ "### Metadata\n",
"\n",
- "Carsus stores metadata inside the HDF5 files to ensure reproducibility. This metadata includes a checksum per `DataFrame`, the current version of every dataset and relevant software versions. "
+ "Carsus stores metadata inside the HDF5 files to ensure reproducibility. This metadata includes a checksum for each stored table, version number or checksum of selected datasets, and versions of relevant packages. "
]
},
{
@@ -254,13 +259,31 @@
"metadata": {},
"outputs": [],
"source": [
- "pd.read_hdf('kurucz_cd23_chianti_He_cmfgen_H_Si_I-II.h5', key='metadata')"
+ "store = pd.HDFStore('kurucz_cd23_chianti_He_cmfgen_H_Si_I-II.h5', key='metadata')"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "store[\"metadata\"]"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "store.root._v_attrs"
]
}
],
"metadata": {
"kernelspec": {
- "display_name": "Python 3 (ipykernel)",
+ "display_name": "Python 3",
"language": "python",
"name": "python3"
},
@@ -274,7 +297,7 @@
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
- "version": "3.8.13"
+ "version": "3.6.15"
},
"widgets": {
"application/vnd.jupyter.widget-state+json": {
diff --git a/docs/references.bib b/docs/references.bib
index f482626c2..6f60dd210 100644
--- a/docs/references.bib
+++ b/docs/references.bib
@@ -2,7 +2,7 @@
@ARTICLE{2002ApJ...579..725L,
author = {{Long}, Knox S. and {Knigge}, Christian},
title = "{Modeling the Spectral Signatures of Accretion Disk Winds: A New Monte Carlo Approach}",
- journal = {\apj},
+ journal = {Astrophysical Journal},
keywords = {Accretion, Accretion Disks, Stars: Binaries: Close, Stars: Novae, Cataclysmic Variables, Stars: Individual: Constellation Name: Z Camelopardalis, Stars: Mass Loss, Astrophysics},
year = 2002,
month = nov,
@@ -20,7 +20,7 @@ @ARTICLE{2002ApJ...579..725L
@ARTICLE{1997A&AS..125..149D,
author = {{Dere}, K.~P. and {Landi}, E. and {Mason}, H.~E. and {Monsignori Fossi}, B.~C. and {Young}, P.~R.},
title = "{CHIANTI - an atomic database for emission lines}",
- journal = {\aaps},
+ journal = {Astronomy & Astrophysics, Supplement},
keywords = {ATOMIC DATA, ASTRONOMICAL DATA BASES: MISCELLANEOUS, ULTRAVIOLET: GENERAL, SUN: ATMOSPHERE, STARS: ATMOSPHERE},
year = 1997,
month = oct,
@@ -34,7 +34,7 @@ @ARTICLE{1997A&AS..125..149D
@ARTICLE{2019ApJS..241...22D,
author = {{Dere}, K.~P. and {Del Zanna}, G. and {Young}, P.~R. and {Landi}, E. and {Sutherland}, R.~S.},
title = "{CHIANTI{\textemdash}An Atomic Database for Emission Lines. XV. Version 9, Improvements for the X-Ray Satellite Lines}",
- journal = {\apjs},
+ journal = {Astrophysical Journal, Supplement},
keywords = {atomic data, atomic processes, ultraviolet: general, X-rays: general, Astrophysics - Solar and Stellar Astrophysics, Astrophysics - High Energy Astrophysical Phenomena, Physics - Atomic Physics},
year = 2019,
month = apr,
@@ -49,3 +49,21 @@ @ARTICLE{2019ApJS..241...22D
adsurl = {https://ui.adsabs.harvard.edu/abs/2019ApJS..241...22D},
adsnote = {Provided by the SAO/NASA Astrophysics Data System}
}
+
+@ARTICLE{2004ApJ...609.1181P,
+ author = {{Przybilla}, Norbert and {Butler}, Keith},
+ title = "{Non-LTE Line Formation for Hydrogen Revisited}",
+ journal = {Astrophysical Journal},
+ keywords = {Atomic Data, Line: Formation, Stars: Early-Type, Stars: Fundamental Parameters, Astrophysics},
+ year = 2004,
+ month = jul,
+ volume = {609},
+ number = {2},
+ pages = {1181-1191},
+ doi = {10.1086/421316},
+archivePrefix = {arXiv},
+ eprint = {astro-ph/0406458},
+ primaryClass = {astro-ph},
+ adsurl = {https://ui.adsabs.harvard.edu/abs/2004ApJ...609.1181P},
+ adsnote = {Provided by the SAO/NASA Astrophysics Data System}
+}