def logl(theta, time, rv, err, ins, staract, starflag, kplanets, nins, MOAV, totcornum):
i, lnl = 0, 0
ndat = len(time)
model_params = kplanets * 5
ins_params = nins * 2 * (MOAV + 1)
jitter, offset, macoef, timescale = sp.zeros(ndat), sp.zeros(ndat), sp.array([sp.zeros(ndat) for i in range(MOAV)]), sp.array([sp.zeros(ndat) for i in range(MOAV)])
ACC = theta[model_params] * (time - time[0])
residuals = sp.zeros(ndat)
for i in range(ndat):
jitpos = int(model_params + ins[i] * 2 * (MOAV+1) + 1)
jitter[i], offset[i] = theta[jitpos], theta[jitpos + 1] # jitt
for j in range(MOAV):
macoef[j][i], timescale[j][i] = theta[jitpos + 2*(j+1)], theta[jitpos + 2*(j+1) + 1]
a1 = (theta[:model_params])
if totcornum:
COR = sp.array([sp.array([sp.zeros(ndat) for k in range(len(starflag[i]))]) for i in range(len(starflag))])
SA = theta[model_params+ins_params+1:]
assert len(SA) == totcornum, 'error in correlations'
AR = 0.0 # just to remember to add this
counter = -1
for i in range(nins):
for j in range(len(starflag[i])):
counter += 1
passer = -1
for k in range(ndat):
if starflag[i][j] == ins[k]: #
passer += 1
COR[i][j][k] = SA[counter] * staract[i][j][passer]
FMC = 0
for i in range(len(COR)):
for j in range(len(COR[i])):
FMC += COR[i][j]
else:
FMC = 0
MODEL = model(a1, time, kplanets) + offset + ACC + FMC
for i in range(ndat):
residuals[i] = rv[i] - MODEL[i]
for c in range(MOAV):
if i > c:
MA = macoef[c][i] * sp.exp(-sp.fabs(time[i-1] - time[i]) / timescale[c][i]) * residuals[i-1]
residuals[i] -= MA
inv_sigma2 = 1.0 / (err**2 + jitter**2)
lnl = sp.sum(residuals ** 2 * inv_sigma2 - sp.log(inv_sigma2)) + sp.log(2*sp.pi) * ndat
return -0.5 * lnl
评论列表
文章目录