def get_divergence_diversity_sliding(aft, block_length, VERBOSE=0): '''Get local divergence and diversity in a sliding window''' cons_ind = Patient.get_initial_consensus_noinsertions(aft, return_ind=True) ind_N = cons_ind == 5 cons_ind[ind_N] = 0 aft_nonanc = 1.0 - aft[:, cons_ind, np.arange(aft.shape[2])] aft_nonanc[:, ind_N] = 0 aft_var = (aft * (1 - aft)).sum(axis=1) struct = np.ones(block_length) dg = np.ma.array(np.apply_along_axis(lambda x: np.convolve(x, struct, mode='valid'), axis=1, arr=aft_nonanc), hard_mask=True) ds = np.ma.array(np.apply_along_axis(lambda x: np.convolve(x, struct, mode='valid'), axis=1, arr=aft_var), hard_mask=True) # NOTE: normalization happens based on actual coverage norm = np.apply_along_axis(lambda x: np.convolve(x, struct, mode='valid'), axis=1, arr=(-aft[:, 0].mask)) dg.mask = norm < block_length dg /= norm ds.mask = norm < block_length ds /= norm x = np.arange(dg.shape[1]) + (block_length - 1) / 2.0 return (x, dg, ds)
def get_divergence_diversity_sliding(aft, block_length, VERBOSE=0): '''Get local divergence and diversity in a sliding window''' cons_ind = Patient.get_initial_consensus_noinsertions(aft, return_ind=True) ind_N = cons_ind == 5 cons_ind[ind_N] = 0 aft_nonanc = 1.0 - aft[:, cons_ind, np.arange(aft.shape[2])] aft_nonanc[:, ind_N] = 0 aft_var = (aft * (1 - aft)).sum(axis=1) struct = np.ones(block_length) dg = np.ma.array( np.apply_along_axis(lambda x: np.convolve(x, struct, mode='valid'), axis=1, arr=aft_nonanc), hard_mask=True) ds = np.ma.array(np.apply_along_axis( lambda x: np.convolve(x, struct, mode='valid'), axis=1, arr=aft_var), hard_mask=True) # NOTE: normalization happens based on actual coverage norm = np.apply_along_axis(lambda x: np.convolve(x, struct, mode='valid'), axis=1, arr=(-aft[:, 0].mask)) dg.mask = norm < block_length dg /= norm ds.mask = norm < block_length ds /= norm x = np.arange(dg.shape[1]) + (block_length - 1) / 2.0 return (x, dg, ds)
def get_divergence(aft): '''Get divergence from allele frequency trajectories''' cons_ind = Patient.get_initial_consensus_noinsertions(aft, return_ind=True) dg = 1 - aft[:, cons_ind, np.arange(aft.shape[2])].mean(axis=1) return dg