Exemplo n.º 1
0
    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
Exemplo n.º 2
0
    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
Exemplo n.º 3
0
 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
Exemplo n.º 4
0
    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
Exemplo n.º 5
0
    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