def exprl2alignment(exprl): """ @summary: Converts experiments into alignments @param exprl: The list of experiments to be converted into an alignment objects @type exprl: ListType @author: Vladimir Likic """ if not is_list(exprl): error("the argument is not a list") algts = [] for item in exprl: if not isinstance(item, Experiment): error("list items must be 'Experiment' instances") else: algt = Class.Alignment(item) algts.append(algt) return algts
def merge_alignments(A1, A2, traces): """ @summary: Merges two alignments with gaps added in from DP traceback @param A1: First alignment @param A2: Second alignment @param traces: DP traceback @return: A single alignment from A1 and A2 @author: Woon Wai Keen @author: Vladimir Likic @author: Qiao Wang """ # Create object to hold new merged alignment and fill in its expr_codes ma = Class.Alignment(None) ma.expr_code = A1.expr_code + A2.expr_code # create empty lists of dimension |A1| + |A2| dimension = len(A1.peakpos) + len(A2.peakpos) merged = [ [] for _ in range(dimension) ] A1 = A1.peakpos A2 = A2.peakpos idx1 = idx2 = 0 # trace can either be 0, 1, or 2 # if it is 0, there are no gaps. otherwise, if it is 1 or 2, # there is a gap in A2 or A1 respectively. for trace in traces: if trace == 0: for i in range(len(A1)): merged[i].append(A1[i][idx1]) for j in range(len(A2)): merged[1+i+j].append(A2[j][idx2]) idx1 = idx1 + 1 idx2 = idx2 + 1 elif trace == 1: for i in range(len(A1)): merged[i].append(A1[i][idx1]) for j in range(len(A2)): merged[1+i+j].append(None) idx1 = idx1 + 1 elif trace == 2: for i in range(len(A1)): merged[i].append(None) for j in range(len(A2)): merged[1+i+j].append(A2[j][idx2]) idx2 = idx2 + 1 ma.peakalgt = numpy.transpose(merged) # sort according to average peak ma.peakalgt = list(ma.peakalgt) ma.peakalgt.sort(Utils.alignment_compare) ma.peakpos = numpy.transpose(ma.peakalgt) return ma