Exemple #1
0
def check_primer_list(primerlist: list):
    """docstring."""
    pl = primerlist

    unique_seqs = set(str(p.seq).lower() for p in pl)

    msg = f"{len(pl)} primers, {len(unique_seqs)} unique primer sequences\n"

    defined = [p for p in pl if set(p.seq.lower()) != set("n")]

    msg += f"{len(pl) - len(defined)} primer(s) without sequence (N)"

    for i, p in enumerate(pl):
        if not p.name.startswith(str(i)):
            msg += f"\nWrong number: {i} {p.format('tab')}"

    dct = _defaultdict(list)

    for u in unique_seqs:
        for p in defined:
            if u == str(p.seq).lower():
                dct[u].append(p.name)

    for seq, names in dct.items():
        if len(names) > 1:
            msg += " ".join(names)
            msg += f" {seq}\n"

    return _pretty_str(msg.strip())
Exemple #2
0
    def list_features(self):
        """Print ASCII table with all features.

        Examples
        --------
        >>> from Bio.Seq import Seq
        >>> from pydna.seqrecord import SeqRecord
        >>> a=SeqRecord(Seq("atgtaa"))
        >>> a.add_feature(2,4)
        >>> print(a.list_features())
        +-----+---------------+-----+-----+-----+-----+------+------+
        | Ft# | Label or Note | Dir | Sta | End | Len | type | orf? |
        +-----+---------------+-----+-----+-----+-----+------+------+
        |   0 | L:ft2         | --> | 2   | 4   |   2 | misc |  no  |
        +-----+---------------+-----+-----+-----+-----+------+------+
        """
        x = _PrettyTable([
            "Ft#", "Label or Note", "Dir", "Sta", "End", "Len", "type", "orf?"
        ])
        x.align["Ft#"] = "r"  # Left align
        x.align["Label or Note"] = "l"  # Left align
        x.align["Len"] = "r"
        x.align["Sta"] = "l"
        x.align["End"] = "l"
        x.align["type"] = "l"
        x.padding_width = 1  # One space between column edges and contents
        for i, sf in enumerate(self.features):
            try:
                lbl = sf.qualifiers["label"]
            except KeyError:
                try:
                    lbl = sf.qualifiers["note"]
                except KeyError:
                    lbl = "nd"
                else:
                    lbl = "N:{}".format(" ".join(lbl).strip())
            else:
                lbl = "L:{}".format(" ".join(lbl).strip())
            x.add_row([
                i,
                lbl[:16],
                {
                    1: "-->",
                    -1: "<--",
                    0: "---",
                    None: "---"
                }[sf.strand],
                sf.location.start,
                sf.location.end,
                len(sf),
                sf.type,
                {
                    True: "yes",
                    False: "no"
                }[self.extract_feature(i).isorf()
                  or self.extract_feature(i).reverse_complement().isorf()],
            ])
        return _pretty_str(x)
Exemple #3
0
def delete_cache(delete=[ "amplify", "assembly", "genbank", "web", "synced" ]):
    msg = ""
    for file_ in delete:
        msg += file_
        try:
            _os.remove( _os.path.join( _os.environ["pydna_data_dir"], file_) )
            msg += " deleted.\n"
        except OSError as e:
            if e._errno == _errno.ENOENT:
                msg += " no file to delete.\n"
    return _pretty_str(msg)
Exemple #4
0
def program(amplicon, tm=tm_default, ta=ta_default):
    r"""Returns a string containing a text representation of a suggested
    PCR program using Taq or similar polymerase.

    ::

     |95°C|95°C               |    |tmf:59.5
     |____|_____          72°C|72°C|tmr:59.7
     |5min|30s  \ 59.1°C _____|____|30s/kb
     |    |      \______/ 0:32|5min|GC 51%
     |    |       30s         |    |1051bp

    """

    # Taq polymerase extension rate is set to 30 nt/s
    # see https://www.thermofisher.com/pt/en/home/life-science/pcr/pcr-enzymes-master-mixes/taq-dna-polymerase-enzymes/taq-dna-polymerase.html
    taq_extension_rate = 30  # seconds/kB PCR product length
    extension_time_taq = int(taq_extension_rate * len(amplicon) / 1000)  # seconds

    f = _textwrap.dedent(
        r"""
                            |95°C|95°C               |    |tmf:{tmf:.1f}
                            |____|_____          72°C|72°C|tmr:{tmr:.1f}
                            |5min|30s  \ {ta:.1f}°C _____|____|{rate}s/kb
                            |    |      \______/{0:2}:{1:2}|5min|GC {GC_prod}%
                            |    |       30s         |    |{size}bp
                            """[
            1:-1
        ].format(
            rate=taq_extension_rate,
            size=len(amplicon.seq),
            ta=round(
                ta(
                    amplicon.forward_primer.footprint,
                    amplicon.reverse_primer.footprint,
                    amplicon.seq,
                ),
                1,
            ),
            tmf=tm(amplicon.forward_primer.footprint),
            tmr=tm(amplicon.reverse_primer.footprint),
            GC_prod=int(amplicon.gc()),
            *map(int, divmod(extension_time_taq, 60)),
        )
    )

    return _pretty_str(f)
Exemple #5
0
def prepend_primerlist(newprimers: list, oldprimers: list):
    """docstring."""
    new = []
    found = []
    no = len(oldprimers)
    oldstrs = [str(p.seq).upper() for p in oldprimers]
    for p in newprimers[::-1]:
        try:
            i = oldstrs.index(str(p.seq).upper())
        except ValueError:
            i = no + len(new)
            suff = p.id.split(str(i))[-1]
            suff.lstrip("_")
            newprimer = _copy.copy(p)
            newprimer.id = f"{i}_{suff}"
            new.append(newprimer)
        else:
            found.append(oldprimers[i])
    new = new[::-1]
    return found[::-1] or _pretty_str("\n".join([p.format("fasta") for p in new]))
Exemple #6
0
try:
    del findsubstrings_suffix_arrays_python
except NameError:
    pass

def delete_cache(delete=[ "amplify", "assembly", "genbank", "web", "synced" ]):
    msg = ""
    for file_ in delete:
        msg += file_
        try:
            _os.remove( _os.path.join( _os.environ["pydna_data_dir"], file_) )
            msg += " deleted.\n"
        except OSError, e:
            if e._errno == _errno.ENOENT:
                msg += " no file to delete.\n"
    return _pretty_str(msg)

def open_cache_folder():
    _open_folder( _os.environ["pydna_data_dir"] )

def open_config_folder():
    _open_folder( _os.environ["pydna_config_dir"] )

def open_log_folder():
    _open_folder( _os.environ["pydna_log_dir"] )



def _open_folder(pth):
    if _sys.platform=='win32':
        _subprocess.Popen(['start', pth], shell= True)