import json,csv,os,math
import numpy as np
from scipy.optimize import minimize_scalar
from scipy.stats import t
from scipy.special import gammaln
rows=list(csv.DictReader(open('data/reviewer_effects.csv')));trials={x['trial']:x for x in json.load(open('data/trials.json'))};ex={x['trial']:x for x in json.load(open('data/extraction.json'))}
def pool(rs,reg=False):
 y=np.array([float(r['yi']) for r in rs]);v=np.array([float(r['vi']) for r in rs]);X=np.array([[1.,float(r['group']=='awake'),float(r['selected']=='TRUE')] if reg else [1.] for r in rs]);k,p=X.shape
 def calc(tau):
  w=1/(v+tau);A=X.T@(w[:,None]*X);B=np.linalg.solve(A,X.T@(w*y));res=y-X@B;Q=np.dot(w,res*res);obj=np.log(v+tau).sum()+np.linalg.slogdet(A)[1]+Q
  return obj,B,A,Q
 fit=minimize_scalar(lambda z:calc(z)[0],bounds=(0,5),method='bounded',options={'xatol':1e-12});tau=fit.x if calc(fit.x)[0]<calc(0)[0] else 0;_,B,A,Q=calc(tau);cov=np.linalg.inv(A)*Q/(k-p);idx=1 if reg else 0;se=math.sqrt(cov[idx,idx]);crit=t.ppf(.975,k-p)
 return {'k':k,'g':B[idx],'lo':B[idx]-crit*se,'hi':B[idx]+crit*se,'tau2':tau,'p':2*t.sf(abs(B[idx]/se),k-p)}
early=[r for r in rows if r['outcome']=='depression' and r['window']=='early'];masked=[r for r in early if r['group']=='masked'];surgery=[r for r in early if r['setting']=='surgery' and r['group'] in ['masked','awake']];unknown=[r['trial'] for r in masked if trials[r['parent']]['design'].get('late_dosing') is None]
strictknown=[r for r in masked if r['late']=='FALSE' and r['trial'] not in unknown]
# T097 uses its after-induction arm, explicitly coded not late.
result={'conditional_P1':pool(masked),'conditional_P2':pool(surgery,True),'unknown_late_in_P1':unknown,'strict_known_only':pool(strictknown),'pain_measures':sorted(set(r['measure'] for r in rows if r['outcome']=='pain'))}
vals=next(x for x in ex['T097']['depression'] if x['day']==1 and x['form']=='mean_sd')['values'];a,b=vals['Pre-ESK group'],vals['Post-ESK group'];n1,n0=int(a['n']),int(b['n']);df=n1+n0-2;sd=math.sqrt(((n1-1)*float(a['sd'])**2+(n0-1)*float(b['sd'])**2)/df);J=math.exp(gammaln(df/2)-.5*math.log(df/2)-gammaln((df-1)/2));g=J*(float(a['mean'])-float(b['mean']))/sd
result['T097_independent_g']={'g':g,'mean_difference':float(a['mean'])-float(b['mean']),'n':n1+n0}
os.makedirs('results',exist_ok=True);json.dump(result,open('results/reviewer_check.json','w'),indent=2);print(json.dumps(result,indent=2))
