def __getitem__(self, sl): answer = Dseqrecord(_copy.copy(self)) answer.seq = self.seq.__getitem__(sl) # answer.seq.alphabet = self.seq.alphabet sl_start = sl.start or 0 # 6 sl_stop = sl.stop or len(answer.seq) # 1 if self.linear or sl_start < sl_stop: answer.features = super().__getitem__(sl).features elif self.circular and sl_start > sl_stop: answer.features = self.shifted(sl_start).features answer.features = [ f for f in answer.features if f.location.parts[-1].end.position <= answer.seq.length ] else: x = len(answer.seq) answer.features = self.shifted(sl_start)[:x].features # answer.features = [f for f in answer.features if f.location.parts == sorted(f.location.parts)] identifier = "part_{id}".format(id=self.id) if answer.features: sf = max(answer.features, key=len) # default if "label" in sf.qualifiers: identifier = " ".join(sf.qualifiers["label"]) elif "note" in sf.qualifiers: identifier = " ".join(sf.qualifiers["note"]) answer.id = _identifier_from_string(identifier)[:16] answer.name = _identifier_from_string( "part_{name}".format(name=self.name))[:16] return answer
def __getitem__(self, sl): answer = Dseqrecord(_copy.copy(self)) answer.seq = self.seq.__getitem__(sl) answer.seq.alphabet = self.seq.alphabet sl_start = sl.start or 0 sl_stop = sl.stop or len(answer.seq) if self.linear or sl_start < sl_stop: answer.features = super().__getitem__(sl).features else: answer.features = self.shifted(sl_stop).features answer.features = [ f for f in answer.features if f.location.parts == sorted(f.location.parts) ] identifier = "part_{id}".format(id=self.id) if answer.features: sf = max(answer.features, key=len) # default if "label" in sf.qualifiers: identifier = " ".join(sf.qualifiers["label"]) elif "note" in sf.qualifiers: identifier = " ".join(sf.qualifiers["note"]) answer.id = _identifier_from_string(identifier)[:16] answer.name = answer.id return answer
def extract(self, parent_sequence): answer = super().extract(parent_sequence) identifier = "feat_{}".format(parent_sequence.id) if "label" in self.qualifiers: identifier = " ".join(self.qualifiers["label"]) elif "note" in self.qualifiers: identifier = " ".join(self.qualifiers["note"]) answer.name = answer.id = _identifier_from_string(identifier)[:16] return answer
def __getitem__(self, index): from pydna.utils import ( identifier_from_string as _identifier_from_string, ) # TODO: clean this up answer = super().__getitem__(index) if len(answer) < 2: return answer identifier = "part_{id}".format(id=self.id) if answer.features: sf = max(answer.features, key=len) # default if "label" in sf.qualifiers: identifier = " ".join(sf.qualifiers["label"]) elif "note" in sf.qualifiers: identifier = " ".join(sf.qualifiers["note"]) answer.id = _identifier_from_string(identifier)[:16] answer.name = _identifier_from_string(f"part_{self.name}")[:16] return answer
def products(self): if self._products: return self._products self._products = [] for fp in self.forward_primers: for rp in self.reverse_primers: if self.template.circular: tmpl = self.template.shifted(fp.position - fp._fp) tmpl = tmpl[:] * 2 for f in tmpl.features: for x, y in zip(f.location.parts, f.location.parts[1:]): if x.end == y.start + len(self.template): f.location = _FeatureLocation( x.start, y.end + len(self.template), strand=f.location.strand, ) if fp.position > rp.position: tmpl = tmpl[:len(self.template) - fp.position + rp.position + rp._fp + fp._fp] else: tmpl = tmpl[:rp.position + rp._fp - (fp.position - fp._fp)] else: tmpl = self.template[fp.position - fp._fp:rp.position + rp._fp] prd = (_Dseqrecord(fp.tail) + tmpl + _Dseqrecord(rp.tail).reverse_complement()) full_tmpl_features = [ f for f in tmpl.features if f.location.start == 0 and f.location.end == len(tmpl) ] new_identifier = "" if full_tmpl_features: ft = full_tmpl_features[0] if "label" in ft.qualifiers: new_identifier = " ".join(ft.qualifiers["label"]) elif "note" in ft.qualifiers: new_identifier = " ".join(ft.qualifiers["note"]) from pydna.utils import ( identifier_from_string as _identifier_from_string, ) # TODO: clean this up prd.name = (_identifier_from_string(new_identifier)[:16] or self.kwargs.get("name") or "{}bp_PCR_prod".format(len(prd))[:16]) prd.id = (_identifier_from_string(new_identifier)[:16] or self.kwargs.get("id") or "{}bp {}".format( str(len(prd))[:14], prd.seguid())) prd.description = self.kwargs.get( "description") or "pcr product_{}_{}".format( fp.description, rp.description) amplicon = _Amplicon(prd, template=self.template, forward_primer=fp, reverse_primer=rp, **self.kwargs) # amplicon.forward_primer.amplicon = amplicon # amplicon.reverse_primer.amplicon = amplicon self._products.append(amplicon) return self._products