def assemble_parts(parts, part_types): 'We build the parts using the form data' part_types.append(VECTOR_TYPE_NAME) joined_seq = SeqRecord(Seq('', alphabet=generic_dna)) names = {'parts': []} for part_type in part_types: part_uniquename = parts[part_type] part = Feature.objects.get(uniquename=part_uniquename) gb_path = os.path.join(proj_settings.MEDIA_ROOT, part.genbank_file.name) part_record = SeqIO.read(gb_path, 'gb') seq = Seq(part.residues) # crispr targets are the unique parts that are not vectors # and does not have a verctor if part.vector is None and part.type.name != VECTOR_TYPE_NAME: pref_idx = 0 suf_idx = len(seq) - len(part.suffix) names['parts'].append(part.uniquename) else: if part.type.name == VECTOR_TYPE_NAME: enzyme = part.enzyme_in[0] names['vector'] = part.uniquename else: names['parts'].append(part.uniquename) enzyme = part.enzyme_out[0] pref_idx, suf_idx = get_prefix_and_suffix_index(seq, enzyme)[:2] # VECTOR must be always the last part to add if part.type.name == VECTOR_TYPE_NAME and part.direction == REVERSE: if suf_idx >= pref_idx and suf_idx + 4 < len(seq): part_sub_seq = part_record[pref_idx + 4:suf_idx + 4] else: part_sub_seq = part_record[pref_idx + 4:] part_sub_seq += part_record[:suf_idx + 4] joined_seq = joined_seq.reverse_complement() + part_sub_seq else: if suf_idx >= pref_idx: part_sub_seq = part_record[pref_idx:suf_idx] else: part_sub_seq = part_record[pref_idx:] part_sub_seq += part_record[:suf_idx] joined_seq += part_sub_seq try: count = Count.objects.get(name=ASSEMBLED_SEQ) except Count.DoesNotExist: count = Count.objects.create(name=ASSEMBLED_SEQ, value=1) next_value = count.next joined_seq.id = ASSEMBLED_SEQ + '_' + next_value joined_seq.name = joined_seq.id joined_seq.description = "({0}){1}".format(','.join(names['parts']), names['vector']) return joined_seq
def get_prefix_and_suffix(seq, enzyme): 'it gets the prefix and the suffix of the feature seq' try: result = get_prefix_and_suffix_index(seq, enzyme) prefix_index, suffix_index, prefix_size = result except RuntimeError as error: if str(error) == "No rec_site": return None, None else: raise return _get_pref_suff_from_index(seq, prefix_index, suffix_index, prefix_size)
def moclo_compatible(self): if not self.level or self.level != LEVEL_0 or self.type.name in (TARGET_DICOT, TARGET_MONOCOT): return 'not_evaluable' if self.vector.resistance not in (MOCLO_INCOMPATIBLE_RESISTANCES): enzyme = self.enzyme_out[0] residues = self.residues pref_idx, suf_idx = get_prefix_and_suffix_index(residues, enzyme)[:2] seq = residues[pref_idx:suf_idx + len(self.suffix)] # TODO: maybe we should look only to the part seq. not with the vector return not has_rec_sites(seq, enzymes=('BpiI', 'BsaI')) else: return False
def _get_stripped_vector_seq(): pupd = Feature.objects.get(uniquename=DOMESTICATED_VECTOR) vec_seq = pupd.residues pre_suf_size = get_prefix_and_suffix_index(vec_seq, pupd.enzyme_in[0]) prefix_index, suffix_index, prefix_size = pre_suf_size prefix_start = prefix_index suffix_end = suffix_index + prefix_size if prefix_start > suffix_end: stripped_seq = vec_seq[prefix_start:] stripped_seq += vec_seq[:suffix_end] else: stripped_seq = vec_seq[prefix_start:suffix_end] return stripped_seq