This is it, thanks heaps for the prompt reply, Peter!
Here is what I did (in case anyone was interested):
import numpy as np
import msprime, pyslim
ts = pyslim.load(file).simplify()
# extra simplification step based on a list of individuals
keeper = np.genfromtxt(csvfile, delimiter=',')
# these are pedigree_ids which I need to convert to ids
keeper = keeper.astype(int).tolist()
keep_indivs = []
for i in ts.individuals():
pid = i.metadata["pedigree_id"]
if pid in keeper:
keep_indivs.append(
i.id)
keep_nodes = []
for i in keep_indivs:
keep_nodes.extend(ts.individual(i).nodes)
sts = ts.simplify(keep_nodes)
height_for_pos = np.zeros(int(sts.sequence_length))
hfp = []
for tree in sts.trees():
mean_height = np.mean([tree.time(root) for root in tree.roots])
left, right = map(int, tree.interval)
height_for_pos[left: right] = mean_height
hfp.append(mean_height)
mh = np.mean(height_for_pos)
In my slim simulation all basepairs are unlinked and so I calculate a tree for every single one and don't need to weight by span on genome (if I understood your comment right, Peter).
Many thanks again, Peter!
Cheers,
Greg