"""Reader for the published MagNET-Zero/MagNET-PCM linear-scaling tables in this folder. These two CSV files (one per nucleus) ARE Supporting Information Tables S10 (proton) and S11 (carbon), verbatim: the reflection-symmetrized (n_passes=10, symmetrize=True) per-solvent coefficients that turn a MagNET-Zero gas-phase shielding plus a MagNET-PCM chloroform correction into a predicted shift. analysis/code/scaling_factors.py derives them; see its module docstring for the method. Each row is one solvent; columns are intercept, stationary (the MagNET-Zero slope), and pcm (the MagNET-PCM-correction slope). Predicted shift = intercept + stationary * shielding + pcm * correction. """ import os import pandas as pd HERE = os.path.dirname(os.path.abspath(__file__)) NUCLEI = ("H", "C") def _csv_path(nucleus): if nucleus not in NUCLEI: raise ValueError(f"nucleus must be one of {NUCLEI}, got {nucleus!r}") return os.path.join(HERE, f"scaling_factors_symmetrized_{nucleus}.csv") def load_symmetrized_tables(): """Returns {"H": DataFrame, "C": DataFrame}, each indexed by solvent with columns intercept / stationary / pcm.""" return {n: pd.read_csv(_csv_path(n)).set_index("solvent") for n in NUCLEI} def predict_shift(table, solvent, shielding, correction): """Chemical shift for one site: intercept + stationary * shielding + pcm * correction, using `table` (one nucleus' DataFrame from load_symmetrized_tables) and its `solvent` row.""" row = table.loc[solvent] return float(row["intercept"] + row["stationary"] * shielding + row["pcm"] * correction)