# Novel object recognition: discrimination index against chance and between groups. Python 3.13, pandas, SciPy.
import numpy as np, pandas as pd
from scipy import stats

d = pd.read_csv("nor.csv")                           # columns: mouse, genotype, novel_s, familiar_s; one row per mouse
d["total"] = d.novel_s + d.familiar_s
excl = d[d.total < 20]
print(f"Excluded (total exploration < 20 s, rule set in advance): {', '.join(excl.mouse)}")
print("Mean total exploration, all mice before exclusion: " + "; ".join(f"{g} {d.total[d.genotype == g].mean():.1f} s" for g in ("WT", "KO")))
k = d[d.total >= 20].copy(); k["di"] = (k.novel_s - k.familiar_s) / k.total
for g in ("WT", "KO"):
    x = k.di[k.genotype == g]; t = stats.ttest_1samp(x, 0)
    hw = stats.t.ppf(0.975, len(x) - 1) * x.std(ddof=1) / np.sqrt(len(x))
    print(f"{g}: n = {len(x)}, mean DI {x.mean():.3f} (95% CI {x.mean() - hw:.3f} to {x.mean() + hw:.3f}); "
          f"one-sample t-test vs 0: t = {t.statistic:.2f}, p = {t.pvalue:.4f}; mean total exploration {k.total[k.genotype == g].mean():.1f} s")
w, ko = k.di[k.genotype == "WT"], k.di[k.genotype == "KO"]
t = stats.ttest_ind(ko, w, equal_var=False)
va, vb = w.var(ddof=1) / len(w), ko.var(ddof=1) / len(ko); df = (va + vb) ** 2 / (va ** 2 / (len(w) - 1) + vb ** 2 / (len(ko) - 1))
hw = stats.t.ppf(0.975, df) * np.sqrt(va + vb)
print(f"KO - WT difference in DI: {ko.mean() - w.mean():.3f} (95% CI {ko.mean() - w.mean() - hw:.3f} to {ko.mean() - w.mean() + hw:.3f}), Welch's t-test p = {t.pvalue:.4f}")
