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())
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)
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)
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)
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]))
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)