jaxspec 0.0.6__py3-none-any.whl → 0.0.7__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -5,9 +5,11 @@ from abc import ABC, abstractmethod
5
5
  import haiku as hk
6
6
  import jax.numpy as jnp
7
7
  import numpy as np
8
- import importlib.resources
9
- from haiku.initializers import Constant as HaikuConstant
8
+
10
9
  from astropy.table import Table
10
+ from haiku.initializers import Constant as HaikuConstant
11
+
12
+ from ..util.online_storage import table_manager
11
13
  from .abc import ModelComponent
12
14
 
13
15
 
@@ -15,8 +17,7 @@ class MultiplicativeComponent(ModelComponent, ABC):
15
17
  type = "multiplicative"
16
18
 
17
19
  @abstractmethod
18
- def continuum(self, energy):
19
- ...
20
+ def continuum(self, energy): ...
20
21
 
21
22
 
22
23
  class Expfac(MultiplicativeComponent):
@@ -62,11 +63,9 @@ class Tbabs(MultiplicativeComponent):
62
63
 
63
64
  """
64
65
 
65
- ref = importlib.resources.files("jaxspec") / "tables/xsect_tbabs_wilm.fits"
66
- with importlib.resources.as_file(ref) as path:
67
- table = Table.read(path)
68
- energy = jnp.asarray(np.array(table["ENERGY"]), dtype=np.float32)
69
- sigma = jnp.asarray(np.array(table["SIGMA"]), dtype=np.float32)
66
+ table = Table.read(table_manager.fetch("xsect_tbabs_wilm.fits"))
67
+ energy = jnp.asarray(np.array(table["ENERGY"]), dtype=np.float64)
68
+ sigma = jnp.asarray(np.array(table["SIGMA"]), dtype=np.float64)
70
69
 
71
70
  def continuum(self, energy):
72
71
  nh = hk.get_parameter("N_H", [], init=HaikuConstant(1))
@@ -85,11 +84,9 @@ class Phabs(MultiplicativeComponent):
85
84
 
86
85
  """
87
86
 
88
- ref = importlib.resources.files("jaxspec") / "tables/xsect_phabs_aspl.fits"
89
- with importlib.resources.as_file(ref) as path:
90
- table = Table.read(path)
91
- energy = jnp.asarray(np.array(table["ENERGY"]), dtype=np.float32)
92
- sigma = jnp.asarray(np.array(table["SIGMA"]), dtype=np.float32)
87
+ table = Table.read(table_manager.fetch("xsect_phabs_aspl.fits"))
88
+ energy = jnp.asarray(np.array(table["ENERGY"]), dtype=np.float64)
89
+ sigma = jnp.asarray(np.array(table["SIGMA"]), dtype=np.float64)
93
90
 
94
91
  def continuum(self, energy):
95
92
  nh = hk.get_parameter("N_H", [], init=HaikuConstant(1))
@@ -108,11 +105,9 @@ class Wabs(MultiplicativeComponent):
108
105
 
109
106
  """
110
107
 
111
- ref = importlib.resources.files("jaxspec") / "tables/xsect_wabs_angr.fits"
112
- with importlib.resources.as_file(ref) as path:
113
- table = Table.read(path)
114
- energy = jnp.asarray(np.array(table["ENERGY"]), dtype=np.float32)
115
- sigma = jnp.asarray(np.array(table["SIGMA"]), dtype=np.float32)
108
+ table = Table.read(table_manager.fetch("xsect_wabs_angr.fits"))
109
+ energy = jnp.asarray(np.array(table["ENERGY"]), dtype=np.float64)
110
+ sigma = jnp.asarray(np.array(table["SIGMA"]), dtype=np.float64)
116
111
 
117
112
  def continuum(self, energy):
118
113
  nh = hk.get_parameter("N_H", [], init=HaikuConstant(1))
@@ -145,7 +140,9 @@ class Gabs(MultiplicativeComponent):
145
140
  sigma = hk.get_parameter("sigma", [], init=HaikuConstant(1))
146
141
  center = hk.get_parameter("E_0", [], init=HaikuConstant(1))
147
142
 
148
- return jnp.exp(-tau / (jnp.sqrt(2 * jnp.pi) * sigma) * jnp.exp(-0.5 * ((energy - center) / sigma) ** 2))
143
+ return jnp.exp(
144
+ -tau / (jnp.sqrt(2 * jnp.pi) * sigma) * jnp.exp(-0.5 * ((energy - center) / sigma) ** 2)
145
+ )
149
146
 
150
147
 
151
148
  class Highecut(MultiplicativeComponent):
@@ -210,11 +207,9 @@ class Tbpcf(MultiplicativeComponent):
210
207
 
211
208
  """
212
209
 
213
- ref = importlib.resources.files("jaxspec") / "tables/xsect_tbabs_wilm.fits"
214
- with importlib.resources.as_file(ref) as path:
215
- table = Table.read(path)
216
- energy = jnp.asarray(np.array(table["ENERGY"]), dtype=np.float32)
217
- sigma = jnp.asarray(np.array(table["SIGMA"]), dtype=np.float32)
210
+ table = Table.read(table_manager.fetch("xsect_tbabs_wilm.fits"))
211
+ energy = jnp.asarray(np.array(table["ENERGY"]), dtype=np.float64)
212
+ sigma = jnp.asarray(np.array(table["SIGMA"]), dtype=np.float64)
218
213
 
219
214
  def continuum(self, energy):
220
215
  nh = hk.get_parameter("N_H", [], init=HaikuConstant(1))
jaxspec/util/__init__.py CHANGED
@@ -0,0 +1,45 @@
1
+ from collections.abc import Callable
2
+ from contextlib import contextmanager
3
+ from time import perf_counter
4
+
5
+ import haiku as hk
6
+
7
+ from jax.random import PRNGKey, split
8
+
9
+
10
+ @contextmanager
11
+ def catchtime(desc="Task", print_time=True) -> Callable[[], float]:
12
+ """
13
+ Context manager to measure time taken by a task.
14
+
15
+ Parameters
16
+ ----------
17
+ desc (str): Description of the task.
18
+ print_time (bool): Whether to print the time taken by the task.
19
+
20
+ Returns
21
+ -------
22
+ Callable[[], float]: Function to get the time taken by the task.
23
+ """
24
+
25
+ t1 = t2 = perf_counter()
26
+ yield lambda: t2 - t1
27
+ t2 = perf_counter()
28
+ if print_time:
29
+ print(f"{desc}: {t2 - t1:.3f} seconds")
30
+
31
+
32
+ def sample_prior(dict_of_prior, key=PRNGKey(0), flat_parameters=False):
33
+ """
34
+ Sample the prior distribution from a dict of distributions
35
+ """
36
+
37
+ parameters = dict(hk.data_structures.to_haiku_dict(dict_of_prior))
38
+ parameters_flat = {}
39
+
40
+ for m, n, distribution in hk.data_structures.traverse(dict_of_prior):
41
+ key, subkey = split(key)
42
+ parameters[m][n] = distribution.sample(subkey)
43
+ parameters_flat[m + "_" + n] = distribution.sample(subkey)
44
+
45
+ return parameters if not flat_parameters else parameters_flat
jaxspec/util/abundance.py CHANGED
@@ -1,9 +1,11 @@
1
- import importlib.resources
2
1
  import pandas as pd
3
- from mendeleev.fetch import fetch_table
2
+
4
3
  from astropy.io import ascii
4
+ from mendeleev.fetch import fetch_table
5
+
6
+ from .online_storage import table_manager
5
7
 
6
- abundance_table: pd.DataFrame = ascii.read(importlib.resources.files("jaxspec") / "tables/abundances.dat").to_pandas()
8
+ abundance_table: pd.DataFrame = ascii.read(table_manager.fetch("abundances.dat")).to_pandas()
7
9
  element_data: pd.DataFrame = fetch_table("elements")[0:30][
8
10
  ["symbol", "atomic_number", "atomic_radius", "atomic_volume", "atomic_weight"]
9
11
  ].rename(columns={"symbol": "Element"})
@@ -0,0 +1,15 @@
1
+ import pooch
2
+
3
+ table_manager = pooch.create(
4
+ # Use the default cache folder for the operating system
5
+ path=pooch.os_cache("jaxspec"),
6
+ base_url="https://github.com/renecotyfanboy/jaxspec-database/raw/main/",
7
+ # The registry specifies the files that can be fetched
8
+ registry={
9
+ "abundances.dat": "sha256:6a7826331f0de308af4631eed5c3b65accda99cd1aa8766f54119dd285b57992",
10
+ "apec.nc": "sha256:52e10e1e4147453890dac68845a1a629954283579eac602419634d43d3c101f9",
11
+ "xsect_tbabs_wilm.fits": "sha256:3cf45e45c9d671c4c4fc128314b7c3a68b30f096eede6b3eb08bf55224a44935",
12
+ "xsect_phabs_aspl.fits": "sha256:3eaffba2a62e3a611e0a4e1ff4a57342d7d576f023d7bbb632710dc75b9a5019",
13
+ "xsect_wabs_angr.fits": "sha256:9b3073a477a30b52e207f2c4bf79afc6ae19abba8f207190ac4c697024f74073",
14
+ },
15
+ )
jaxspec/util/typing.py ADDED
@@ -0,0 +1,43 @@
1
+ from typing import Any
2
+
3
+ import numpyro.distributions as dist
4
+
5
+ from jax import numpy as jnp
6
+ from jax.typing import ArrayLike
7
+ from pydantic import BaseModel, field_validator
8
+
9
+ PriorDictType = dict[str, dict[str, dist.Distribution | ArrayLike]]
10
+
11
+
12
+ class PriorDictModel(BaseModel):
13
+ """
14
+ Pydantic model for a nested dictionary of NumPyro distributions or JAX arrays.
15
+ The top level keys are strings, and the values are dictionaries with string keys and values that are either
16
+ NumPyro distributions or JAX arrays (or convertible to JAX arrays).
17
+ """
18
+
19
+ nested_dict: PriorDictType
20
+
21
+ class Config: # noqa D106
22
+ arbitrary_types_allowed = True
23
+
24
+ @field_validator("nested_dict", mode="before")
25
+ def check_and_cast_nested_dict(cls, value: dict[str, Any]):
26
+ if not isinstance(value, dict):
27
+ raise ValueError("The top level must be a dictionary")
28
+
29
+ for key, inner_dict in value.items():
30
+ if not isinstance(inner_dict, dict):
31
+ raise ValueError(f'The value for key "{key}" must be a dictionary')
32
+
33
+ for inner_key, obj in inner_dict.items():
34
+ if not isinstance(obj, dist.Distribution):
35
+ try:
36
+ # Attempt to cast to JAX array
37
+ value[key][inner_key] = jnp.array(obj, dtype=float)
38
+ except Exception as e:
39
+ raise ValueError(
40
+ f'The value for key "{inner_key}" in inner dictionary must '
41
+ f"be a NumPyro distribution or castable to JAX array. Error: {e}"
42
+ )
43
+ return value
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: jaxspec
3
- Version: 0.0.6
3
+ Version: 0.0.7
4
4
  Summary: jaxspec is a bayesian spectral fitting library for X-ray astronomy.
5
5
  License: MIT
6
6
  Author: sdupourque
@@ -16,18 +16,21 @@ Requires-Dist: chainconsumer (>=1.0.0,<2.0.0)
16
16
  Requires-Dist: cmasher (>=1.6.3,<2.0.0)
17
17
  Requires-Dist: dm-haiku (>=0.0.11,<0.0.13)
18
18
  Requires-Dist: gpjax (>=0.8.0,<0.9.0)
19
- Requires-Dist: jax (>=0.4.23,<0.5.0)
20
- Requires-Dist: jaxlib (>=0.4.23,<0.5.0)
19
+ Requires-Dist: jax (>=0.4.29,<0.5.0)
20
+ Requires-Dist: jaxlib (>=0.4.29,<0.5.0)
21
+ Requires-Dist: jaxns (>=2.5.1,<3.0.0)
21
22
  Requires-Dist: jaxopt (>=0.8.1,<0.9.0)
22
23
  Requires-Dist: matplotlib (>=3.8.0,<4.0.0)
23
- Requires-Dist: mendeleev (>=0.15.0,<0.16.0)
24
- Requires-Dist: mkdocstrings (>=0.24.0,<0.25.0)
24
+ Requires-Dist: mendeleev (>=0.15,<0.17)
25
+ Requires-Dist: mkdocstrings (>=0.24,<0.26)
25
26
  Requires-Dist: networkx (>=3.1,<4.0)
26
27
  Requires-Dist: numpy (>=1.26.1,<2.0.0)
27
- Requires-Dist: numpyro (>=0.13.2,<0.15.0)
28
+ Requires-Dist: numpyro (>=0.15.0,<0.16.0)
29
+ Requires-Dist: optimistix (>=0.0.7,<0.0.8)
28
30
  Requires-Dist: pandas (>=2.2.0,<3.0.0)
29
- Requires-Dist: pyzmq (<26)
30
- Requires-Dist: scipy (<1.13)
31
+ Requires-Dist: pooch (>=1.8.2,<2.0.0)
32
+ Requires-Dist: pyzmq (<27)
33
+ Requires-Dist: scipy (<1.14)
31
34
  Requires-Dist: seaborn (>=0.13.1,<0.14.0)
32
35
  Requires-Dist: simpleeval (>=0.9.13,<0.10.0)
33
36
  Requires-Dist: sparse (>=0.15.1,<0.16.0)
@@ -1,8 +1,8 @@
1
1
  jaxspec/__init__.py,sha256=Sbn02lX6Y-zNXk17N8dec22c5jeypiS0LkHmGfz7lWA,126
2
2
  jaxspec/analysis/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
3
3
  jaxspec/analysis/compare.py,sha256=g2UFhmR9Zt-7cz5gQFOB6lXuklXB3yTyUvjTypOzoSY,725
4
- jaxspec/analysis/results.py,sha256=jZmmUBFfdHIkTy4JI6j2X9hHKa6fdvxccBHQWJIIgRs,20968
5
- jaxspec/data/__init__.py,sha256=5MmiOFyDBg_lBMN0piUY0ULN0gD_mW33rurVOYXebdA,497
4
+ jaxspec/analysis/results.py,sha256=58IM_HS3q8xgW0espGgh11eBdIJYa-m2XccW_-pO2to,24495
5
+ jaxspec/data/__init__.py,sha256=aantcYKC9kZFvaE-V2SIwSuLhIld17Kjrd9CIUu___Y,415
6
6
  jaxspec/data/example_data/MOS1.arf,sha256=kBetpqOR1G-bVpuNAzj7q7YqU5fnwp6woW5OAtSGgVk,34560
7
7
  jaxspec/data/example_data/MOS1.pha,sha256=fh_2ZFRbq0_c4e-UdocVtNh6ObJSth4HDnFCflyGkqw,83520
8
8
  jaxspec/data/example_data/MOS1.rmf,sha256=LRE40iwxxTmKTu0RcLC4iwc1Ds_senrvT1UIcctDCa4,14846400
@@ -21,28 +21,26 @@ jaxspec/data/example_data/PNbackground_spectrum.fits,sha256=VeAX4MGbMkJF_vBJ3_Kn
21
21
  jaxspec/data/example_data/fakeit.pha,sha256=IhkeWkE-b3ELECd_Uasjo9h3cXgcjCYH20wDpXJ8LMk,60480
22
22
  jaxspec/data/grouping.py,sha256=hhgBt-voiH0DDSyePacaIGsaMnrYbJM_-ZeU66keC7I,622
23
23
  jaxspec/data/instrument.py,sha256=0pSf1p82g7syDMmKm13eVbYih-Veiq5DnwsyZe6_b4g,3890
24
- jaxspec/data/obsconf.py,sha256=tnXCXim6eBjZbvNbx2ViRJ3wzQhNacXRcCrLZlPTdY0,7378
24
+ jaxspec/data/obsconf.py,sha256=0X9jR-pV-Pk4-EVuUdlVWgl_gBx8ZurVkRNrfKQWdC4,8663
25
25
  jaxspec/data/observation.py,sha256=1UnFu5ihZp9z-vP_I7tsFY8jhhIJunv46JyuE-acrg0,6394
26
26
  jaxspec/data/ogip.py,sha256=sv9p00qHS5pzw61pzWyyF0nV-E-RXySdSFK2tUavokA,9545
27
- jaxspec/data/util.py,sha256=3aNhsfIU6U4uTCcdtpx8ykneBgkDnvS4ocUWVMvYG-w,8221
28
- jaxspec/fit.py,sha256=32M1W2ieVrv55AtRPvj_LpaNuwstrQRa03oWTRsdaAQ,13547
29
- jaxspec/model/__init__.py,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1
27
+ jaxspec/data/util.py,sha256=TZg_zrH2qk3LiPmn7yw5nMN-XT3z23R9pq8HMYBB_uE,8231
28
+ jaxspec/fit.py,sha256=yfP1INuHYfjpXvZfmkgJ84TbeGWuFg1nvkXduMfxgyk,22057
29
+ jaxspec/model/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
30
30
  jaxspec/model/_additive/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
31
- jaxspec/model/_additive/apec.py,sha256=nDOGpWyLgfL88D6B6OuAkPLpHuGRKdZa5DszvDF02C8,16038
32
- jaxspec/model/_additive/apec_loaders.py,sha256=0vXoqujjRaJmDc4S_SKfautxy6WdpfhfOHiAtBftoik,3610
31
+ jaxspec/model/_additive/apec.py,sha256=r7CQqscAgR0BXC_AJqF6B7CPq3Byoo65Z-h9XgACZeU,12460
32
+ jaxspec/model/_additive/apec_loaders.py,sha256=jkUoH0ezeYdaNw3oV10V0L-jt848SKp2thanLWLWp9k,2412
33
33
  jaxspec/model/abc.py,sha256=SWjKOOsqU5UJsVy63Tt9dDq8H2eTIbvK2C9iqgiR0cY,19817
34
- jaxspec/model/additive.py,sha256=YbBZe0iBfFQ3FtwHHM32vfCn5ndi99mtwOI-I--WcH4,16744
35
- jaxspec/model/background.py,sha256=zej99rVfcRb75T85o3u4qeYQIgnFwGtxK8niZJ8S5mM,6872
34
+ jaxspec/model/additive.py,sha256=ayGkL0ftmK-MVndYoHorPZVpNopi1MyyEtymLlBRl-o,16885
35
+ jaxspec/model/background.py,sha256=QSFFiuyUEvuzXBx3QfkvVneUR8KKEP-VaANEVXcavDE,7865
36
36
  jaxspec/model/list.py,sha256=0RPAoscVz_zM1CWdx_Gd5wfrQWV5Nv4Kd4bSXu2ayUA,860
37
- jaxspec/model/multiplicative.py,sha256=sAKDkiplhdY7TsaPk7gwkR18dcXmU2nytgBCiHNBPMk,7537
38
- jaxspec/tables/abundances.dat,sha256=angmMx8N4wivRjHu1cO2Wszamc0aqHZvVBGd0oW1eZI,3193
39
- jaxspec/tables/xsect_phabs_aspl.fits,sha256=Pq_7oqYuOmEeCk4f9KVzQtfVdvAj17u2MnENx1uaUBk,86400
40
- jaxspec/tables/xsect_tbabs_wilm.fits,sha256=PPReRcnWccTE_BKDFLfDposw8Jbu3ms-sIv1UiSkSTU,86400
41
- jaxspec/tables/xsect_wabs_angr.fits,sha256=mzBzpHejC1LiB_LEv3mvxq4Zq7qPIHGQrExpcCT3QHM,86400
42
- jaxspec/util/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
43
- jaxspec/util/abundance.py,sha256=G-oNT1sxUQj7MwZx7SkQUOq1VZVn-TEBciKWkGhq2is,8554
37
+ jaxspec/model/multiplicative.py,sha256=8S7_agz32fdX-qxYnkL7fGXW2CnuwRGBZ5pYV4-b_5k,7194
38
+ jaxspec/util/__init__.py,sha256=vKurfp7p2hxHptJjXhXqFAXAikAGXAqISMJUqPeiGTw,1259
39
+ jaxspec/util/abundance.py,sha256=fsC313taIlGzQsZNwbYsJupDWm7ZbqzGhY66Ku394Mw,8546
44
40
  jaxspec/util/integrate.py,sha256=_Ax_knpC7d4et2-QFkOUzVtNeQLX1-cwLvm-FRBxYcw,4505
45
- jaxspec-0.0.6.dist-info/LICENSE.md,sha256=2q5XoWzddts5IqzIcgYYMOL21puU3MfO8gvT3Ype1eQ,1073
46
- jaxspec-0.0.6.dist-info/METADATA,sha256=aieG8nelwQ5Vsw7e3HA-qGO9x9VHP9kuHdqeCPXKd5M,3264
47
- jaxspec-0.0.6.dist-info/WHEEL,sha256=d2fvjOD7sXsVzChCqf0Ty0JbHKBaLYwDbGQDwQTnJ50,88
48
- jaxspec-0.0.6.dist-info/RECORD,,
41
+ jaxspec/util/online_storage.py,sha256=cJGHsgPh3CukRwwlOcxV9eGvrainDOIP5AQP60tWLN4,818
42
+ jaxspec/util/typing.py,sha256=qwZMKHivZlozoo0ESsiaQNkG99Dh3PE2Z-5aOQD9zc0,1650
43
+ jaxspec-0.0.7.dist-info/LICENSE.md,sha256=2q5XoWzddts5IqzIcgYYMOL21puU3MfO8gvT3Ype1eQ,1073
44
+ jaxspec-0.0.7.dist-info/METADATA,sha256=MX7-CIwPDBVjZtjRP3BMQnm0gKEcN5Z91yYW4n5PvXA,3375
45
+ jaxspec-0.0.7.dist-info/WHEEL,sha256=d2fvjOD7sXsVzChCqf0Ty0JbHKBaLYwDbGQDwQTnJ50,88
46
+ jaxspec-0.0.7.dist-info/RECORD,,
@@ -1,31 +0,0 @@
1
- Element angr aspl feld aneb grsa wilm lodd lgpp lgps
2
- H 1.00e+00 1.00e+00 1.00e+00 1.00e+00 1.00e+00 1.00e+00 1.00e+00 1.00E+00 1.00E+00
3
- He 9.77e-02 8.51e-02 9.77e-02 8.01e-02 8.51e-02 9.77e-02 7.92e-02 8.41E-02 9.69E-02
4
- Li 1.45e-11 1.12e-11 1.26e-11 2.19e-09 1.26e-11 0.00 1.90e-09 1.26E-11 2.15E-09
5
- Be 1.41e-11 2.40e-11 2.51e-11 2.87e-11 2.51e-11 0.00 2.57e-11 2.40E-11 2.36E-11
6
- B 3.98e-10 5.01e-10 3.55e-10 8.82e-10 3.55e-10 0.00 6.03e-10 5.01E-10 7.26E-10
7
- C 3.63e-04 2.69e-04 3.98e-04 4.45e-04 3.31e-04 2.40e-04 2.45e-04 2.45E-04 2.78E-04
8
- N 1.12e-04 6.76e-05 1.00e-04 9.12e-05 8.32e-05 7.59e-05 6.76e-05 7.24E-05 8.19E-05
9
- O 8.51e-04 4.90e-04 8.51e-04 7.39e-04 6.76e-04 4.90e-04 4.90e-04 5.37E-04 6.06E-04
10
- F 3.63e-08 3.63e-08 3.63e-08 3.10e-08 3.63e-08 0.00 2.88e-08 3.63E-08 3.10E-08
11
- Ne 1.23e-04 8.51e-05 1.29e-04 1.38e-04 1.20e-04 8.71e-05 7.41e-05 1.12E-04 1.27E-04
12
- Na 2.14e-06 1.74e-06 2.14e-06 2.10e-06 2.14e-06 1.45e-06 1.99e-06 2.00E-06 2.23E-06
13
- Mg 3.80e-05 3.98e-05 3.80e-05 3.95e-05 3.80e-05 2.51e-05 3.55e-05 3.47E-05 3.98E-05
14
- Al 2.95e-06 2.82e-06 2.95e-06 3.12e-06 2.95e-06 2.14e-06 2.88e-06 2.95E-06 3.27E-06
15
- Si 3.55e-05 3.24e-05 3.55e-05 3.68e-05 3.55e-05 1.86e-05 3.47e-05 3.31E-05 3.86E-05
16
- P 2.82e-07 2.57e-07 2.82e-07 3.82e-07 2.82e-07 2.63e-07 2.88e-07 2.88E-07 3.20E-07
17
- S 1.62e-05 1.32e-05 1.62e-05 1.89e-05 2.14e-05 1.23e-05 1.55e-05 1.38E-05 1.63E-05
18
- Cl 3.16e-07 3.16e-07 3.16e-07 1.93e-07 3.16e-07 1.32e-07 1.82e-07 3.16E-07 2.00E-07
19
- Ar 3.63e-06 2.51e-06 4.47e-06 3.82e-06 2.51e-06 2.57e-06 3.55e-06 3.16E-06 3.58E-06
20
- K 1.32e-07 1.07e-07 1.32e-07 1.39e-07 1.32e-07 0.00 1.29e-07 1.32E-07 1.45E-07
21
- Ca 2.29e-06 2.19e-06 2.29e-06 2.25e-06 2.29e-06 1.58e-06 2.19e-06 2.14E-06 2.33E-06
22
- Sc 1.26e-09 1.41e-09 1.48e-09 1.24e-09 1.48e-09 0.00 1.17e-09 1.26E-09 1.33E-09
23
- Ti 9.77e-08 8.91e-08 1.05e-07 8.82e-08 1.05e-07 6.46e-08 8.32e-08 7.94E-08 9.54E-08
24
- V 1.00e-08 8.51e-09 1.00e-08 1.08e-08 1.00e-08 0.00 1.00e-08 1.00E-08 1.11E-08
25
- Cr 4.68e-07 4.37e-07 4.68e-07 4.93e-07 4.68e-07 3.24e-07 4.47e-07 4.37E-07 5.06E-07
26
- Mn 2.45e-07 2.69e-07 2.45e-07 3.50e-07 2.45e-07 2.19e-07 3.16e-07 2.34E-07 3.56E-07
27
- Fe 4.68e-05 3.16e-05 3.24e-05 3.31e-05 3.16e-05 2.69e-05 2.95e-05 2.82E-05 3.27E-05
28
- Co 8.32e-08 9.77e-08 8.32e-08 8.27e-08 8.32e-08 8.32e-08 8.13e-08 8.32E-08 9.07E-08
29
- Ni 1.78e-06 1.66e-06 1.78e-06 1.81e-06 1.78e-06 1.12e-06 1.66e-06 1.70E-06 1.89E-06
30
- Cu 1.62e-08 1.55e-08 1.62e-08 1.89e-08 1.62e-08 0.00 1.82e-08 1.62E-08 2.09E-08
31
- Zn 3.98e-08 3.63e-08 3.98e-08 4.63e-08 3.98e-08 0.00 4.27e-08 4.17E-08 5.02E-08
Binary file
Binary file
Binary file