# import elementMass as e
import pandas as pd
from typing_extensions import Self
from MagmaPandas.enums import Datatype, Unit
from MagmaPandas.MagmaFrames.magmaFrame import MagmaFrame
from MagmaPandas.parse_io import check_components
_endmember_required_elements = ["SiO2", "TiO2", "Al2O3", "FeO", "MnO", "MgO", "Cr2O3"]
[docs]
class Ilmenite(MagmaFrame):
"""
Subclass of :py:class:`~MagmaPandas.MagmaFrames.magmaFrame.MagmaFrame` extended with ilmenite specific methods.
"""
[docs]
def endmembers(self):
"""
Calculations according to Andersen et al. (1993), as implemented in QUILF
"""
composition = check_components(
composition=self, components=_endmember_required_elements
)
cations = composition.cations(norm_to=2)
hematite_moles = (cations[["Fe", "Mg", "Mn"]].sum(axis=1) - cations["Ti"]) / 2
Fe2 = cations["Ti"] - cations["Mg"] - cations["Mn"]
ilmenite_moles = Fe2 + cations["Al"] / 2
Fe3 = 2 * hematite_moles
total_components = (
hematite_moles + ilmenite_moles + cations[["Mn", "Mg"]].sum(axis=1)
)
hematite = hematite_moles / total_components
ilmenite = ilmenite_moles / total_components
geikielite = cations["Mg"] / total_components
pyrophanite = cations["Mn"] / total_components
return pd.DataFrame(
{
"hematite": hematite,
"ilmenite": ilmenite,
"geikielite": geikielite,
"pyrophanite": pyrophanite,
}
)
[docs]
def Fe_speciation(self, normalise=False) -> Self:
"""
Calculations according to Andersen et al. (1993), as implemented in QUILF
"""
units = self._units
datatype = self._datatype
elements = {Datatype.OXIDE: ("FeO", "Fe2O3"), Datatype.CATION: ("Fe", "Fe3")}[
datatype
]
if all(c in self.elements for c in elements):
return self
composition = check_components(
composition=self, components=_endmember_required_elements
)
cations = composition.cations(
normalise=False
) # convert to cation mol fractions
totals = cations["total"]
cations = cations.div(totals, axis=0).mul(2, axis=0)
hematite_moles = (cations[["Fe", "Mg", "Mn"]].sum(axis=1) - cations["Ti"]) / 2
Fe2 = cations["Ti"] - cations["Mg"] - cations["Mn"]
Fe3 = 2 * hematite_moles
cations["Fe"] = Fe2
cations["Fe3"] = Fe3
cations = cations.recalculate()
cations = cations.div(2, axis=0).mul(totals, axis=0) # revert normalisation
if units == Unit.MOL_FRACTIONS:
if datatype == Datatype.CATION:
return cations
return cations.oxides(normalise=normalise)
cations_wt_pc = cations.wt_pc(normalise=normalise)
if datatype == Datatype.CATION:
return cations_wt_pc
return cations_wt_pc.oxides(normalise=normalise)