From 1f73fc0dcdb44e37e662886442760c94303ce9ec Mon Sep 17 00:00:00 2001 From: Peter Vegh Date: Wed, 6 Oct 2021 19:30:59 +0100 Subject: [PATCH] Update docs --- docs/images/plasma_logo.png | Bin 0 -> 25522 bytes docs/images/plasma_logo.svg | 938 ++++++ docs/images/plasma_report_screenshot.png | Bin 0 -> 293828 bytes docs/index.html | 20 +- .../plasmid_assessor/Assessment/index.html | 2757 ++++++++++++++--- .../plasmid_assessor/reports/index.html | 76 +- docs/search/search_index.json | 2 +- docs/sitemap.xml | 10 +- docs/sitemap.xml.gz | Bin 197 -> 197 bytes 9 files changed, 3353 insertions(+), 450 deletions(-) create mode 100644 docs/images/plasma_logo.png create mode 100644 docs/images/plasma_logo.svg create mode 100644 docs/images/plasma_report_screenshot.png diff --git a/docs/images/plasma_logo.png b/docs/images/plasma_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..3cfc99c5a113d54a11a357f624ce96164f930f2d GIT binary patch literal 25522 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 C3fSxb literal 0 HcmV?d00001 diff --git a/docs/images/plasma_logo.svg b/docs/images/plasma_logo.svg new file mode 100644 index 0000000..c2aaf8a --- /dev/null +++ b/docs/images/plasma_logo.svg @@ -0,0 +1,938 @@ + +image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/docs/images/plasma_report_screenshot.png b/docs/images/plasma_report_screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..73d74b66ca0703cd2b424b94fbecbc259457102c GIT binary patch literal 293828 zcmeFZhgVbE7c~kZs34*uARwU9q$|Bh5e239-c)+;El5#Ru2kvLdkHPlArKG{5RguY zbfqWs5=v-q$J>5)jQ7U-{(vuI+;MLXIp^%X_S$RBHP_ttgSzTda#A`{0s;bZg=bGR z2?&V45D;ACyhsAB6g1RyfPbBLmsQZd2tKbaTKoaN(|XA1duTaZd3e8Yvm~%~a(1-j zaW{9fv~+T}arW3CYL+4(xJ{t&
d>gtrY4|3t;Yzsv@Mt@!YcKFrXs|e!r?VOLV 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ÿUG!Du9aw-X;d>;jOgv3bad6s7;u`9 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 assessor +

    +Plasma logo +

    + +

    Plasmid assessor

    Plasmid assessment for Golden Gate cloning. An important task in DNA assembly is creating or adapting a plasmid to serve as a backbone for the assembled parts. This package provides tools for quickly checking a few basic backbone requirements on a plasmid sequence.

    @@ -456,13 +460,14 @@

    Usage

    import plasmid_assessor as plasma
     
     # Load your Genbank or FASTA file as a Biopython SeqRecord, or create a new one:
    -from Bio.SeqRecord import SeqRecord
    -from Bio.Seq import Seq
    -sequence = SeqRecord(Seq("CGTCTCAACTG" + "AAA" + "TATCAGAGACG" + "AGGTCTC"), annotations={"topology": "circular"})
    +from Bio import SeqIO
    +sequence = SeqIO.read("HC_Amp_ccdB.gb", "genbank")
    +# sequence.annotations["topology"] = "circular"  # make sure it's circular
    +# sequence.id = "HC_Amp_ccdB"  # can specify a name for the plasmid
     
     # Evaluate plasmid:
     design = plasma.Assessment(sequence, "BsmBI")
    -design.assess_plasmid(other_enzymes=["BsaI"])  # also check for the enzyme of the 2nd level assembly
    +design.assess_plasmid(other_enzymes=["BsaI"])  # also check for the enzyme(s) of the 2nd (3rd..) level assembly
     # Results are stored in:
     design.results
     # Save as a PDF report:
    @@ -470,6 +475,11 @@ 

    Usage

    +

    Plasmid assessor checks the properties listed in the introduction and if the plamid passes, then it gets a green ☑ symbol; if there are errors, it's flagged with a red ☒ symbol. Warning comments are marked with a yellow ⚠ sign.

    +

    +Plasma report +

    +

    Versioning

    Plasmid assessor uses the semantic versioning scheme.

    License = MIT

    diff --git a/docs/reference/plasmid_assessor/Assessment/index.html b/docs/reference/plasmid_assessor/Assessment/index.html index 8754b25..f242252 100644 --- a/docs/reference/plasmid_assessor/Assessment/index.html +++ b/docs/reference/plasmid_assessor/Assessment/index.html @@ -302,6 +302,13 @@ + + +
  1. + + Parameters + +
  2. @@ -468,6 +654,13 @@ + + + + + + + + +
  3. + + Parameters + + +
  4. + + + + + + + + + +
    +
    + + + + + + + + + + +

    Module plasmid_assessor.Assessment

    +
    View Source
    import re
    +
    +import matplotlib.pyplot as plt
    +
    +import Bio
    +
    +import Bio.Restriction
    +
    +from Bio.Seq import Seq
    +
    +from Bio.SeqFeature import SeqFeature, FeatureLocation
    +
    +import dnacauldron as dc
    +
    +try:
    +
    +    from dna_features_viewer import BiopythonTranslator
    +
    +except ImportError:
    +
    +    class AssessmentTranslator:
    +
    +        """Please install dna_features_viewer to use this class."""
    +
    +        def __init__(self):
    +
    +            raise Exception("Please install dna_features_viewer to use this class.")
    +
    +else:
    +
    +    class AssessmentTranslator(BiopythonTranslator):
    +
    +        """Custom translator for highlighting key features."""
    +
    +        def compute_feature_color(self, feature):
    +
    +            assessment_ref = "plasmid_assessment"
    +
    +            if assessment_ref in feature.qualifiers:
    +
    +                if feature.qualifiers[assessment_ref] == "enzyme":
    +
    +                    return "red"
    +
    +                elif feature.qualifiers[assessment_ref] == "excised":
    +
    +                    return "yellow"
    +
    +                elif feature.qualifiers[assessment_ref] == "backbone":
    +
    +                    return "tab:cyan"
    +
    +                else:
    +
    +                    return "tab:blue"  # default dna_features_viewer color
    +
    +            else:
    +
    +                return "tab:blue"
    +
    +class Assessment:
    +
    +    """The plasmid assessment class.
    +
    +    **Parameters**
    +
    +    **record**
    +
    +    > A Biopython `SeqRecord`.
    +
    +    **enzyme**
    +
    +    > A restriction enzyme (`str`). A Biopython `RestrictionType` will be looked
    +
    +    up using the string.
    +
    +    """
    +
    +    UNKNOWN_IDS = [
    +
    +        "None",
    +
    +        "",
    +
    +        "<unknown id>",
    +
    +        ".",
    +
    +        "EXPORTED",
    +
    +        "<unknown name>",
    +
    +        "Exported",
    +
    +    ]
    +
    +    def __init__(self, record, enzyme):
    +
    +        self.record = record
    +
    +        self.enzyme = Bio.Restriction.__dict__[enzyme]
    +
    +        self.enzyme_name = str(self.enzyme)
    +
    +        self.results = {}
    +
    +    def assess_plasmid(self, other_enzymes=None):
    +
    +        """Evaluate plasmid for Golden Gate.
    +
    +        **Parameters**
    +
    +        **other_enzymes**
    +
    +        > List of enzymes used in higher level assemblies (`list`).
    +
    +        """
    +
    +        if other_enzymes:
    +
    +            self.other_enzymes = ", ".join([str(enz) for enz in other_enzymes])
    +
    +        self.add_name()
    +
    +        self.check_circularity()
    +
    +        self.get_number_of_sites()
    +
    +        self.evaluate_orientation()
    +
    +        self.digest_plasmid()
    +
    +        self.count_other_sites(other_enzymes)
    +
    +        self.check_enzyme_site_locations()
    +
    +        self.sum_results()
    +
    +        self.plot_plasmid()
    +
    +    def add_name(self):
    +
    +        """Set a name for the assessment."""
    +
    +        # To display on the report:
    +
    +        if str(self.record.id).strip() in self.UNKNOWN_IDS:
    +
    +            self.name = "Unnamed plasmid"
    +
    +        else:
    +
    +            if len(self.record.id) > 16:  # Genbank limit, also for width in report
    +
    +                self.name = self.record.id[:16] + "..."
    +
    +            else:
    +
    +                self.name = self.record.id
    +
    +    def check_circularity(self):
    +
    +        if "topology" not in self.record.annotations:
    +
    +            self.results["is_circular"] = False
    +
    +        elif self.record.annotations["topology"] == "circular":
    +
    +            self.results["is_circular"] = True
    +
    +        else:
    +
    +            self.results["is_circular"] = False
    +
    +    def get_number_of_sites(self):
    +
    +        if "is_circular" in self.results:
    +
    +            is_linear = not self.results["is_circular"]
    +
    +        else:
    +
    +            is_linear = False
    +
    +        restriction_batch = Bio.Restriction.RestrictionBatch([self.enzyme])
    +
    +        analysis = Bio.Restriction.Analysis(
    +
    +            restriction_batch, sequence=self.record.seq, linear=is_linear
    +
    +        )
    +
    +        self.analysis_results = analysis.full(linear=is_linear)
    +
    +        self.results["number_of_sites"] = len(self.analysis_results[self.enzyme])
    +
    +        # Add as features for plot in report:
    +
    +        for enzyme, sites in self.analysis_results.items():
    +
    +            for site in sites:
    +
    +                self.record.features.append(
    +
    +                    SeqFeature(
    +
    +                        FeatureLocation(site, site + 1),
    +
    +                        id=str(enzyme),
    +
    +                        type="misc_feature",
    +
    +                        qualifiers={
    +
    +                            "label": str(enzyme),
    +
    +                            "plasmid_assessment": "enzyme",
    +
    +                        },
    +
    +                    )
    +
    +                )
    +
    +    def evaluate_orientation(self):
    +
    +        self.results["is_site_orientation_correct"] = False  # default
    +
    +        # Forward strand:
    +
    +        self.iter_forward = [
    +
    +            match.end() for match in re.finditer(self.enzyme.site, str(self.record.seq))
    +
    +        ]
    +
    +        if sum(1 for _ in self.iter_forward) == 1:
    +
    +            self.forward_enzyme = self.iter_forward[0]
    +
    +            # rev_complement_site = str(self.record.seq.reverse_complement())
    +
    +            rev_complement_site = str(Seq(self.enzyme.site).reverse_complement())
    +
    +            self.iter_reverse = [
    +
    +                m.start()
    +
    +                for m in re.finditer(rev_complement_site, str(self.record.seq))
    +
    +            ]
    +
    +            if sum(1 for _ in self.iter_reverse) == 1:  # 1 site in both strands:
    +
    +                self.results["is_site_orientation_correct"] = True
    +
    +                self.reverse_enzyme = self.iter_reverse[0]
    +
    +        if self.results["is_site_orientation_correct"]:
    +
    +            if self.reverse_enzyme < self.forward_enzyme:
    +
    +                self.record.features.append(
    +
    +                    SeqFeature(
    +
    +                        FeatureLocation(
    +
    +                            self.reverse_enzyme - 1, self.forward_enzyme + 1
    +
    +                        ),
    +
    +                        id=str(self.enzyme),
    +
    +                        type="misc_feature",
    +
    +                        qualifiers={
    +
    +                            "label": "Excised",
    +
    +                            "plasmid_assessment": "excised",
    +
    +                        },
    +
    +                    )
    +
    +                )
    +
    +            else:  # put annotation together from two pieces:
    +
    +                self.record.features.append(
    +
    +                    SeqFeature(
    +
    +                        FeatureLocation(0, self.forward_enzyme + 1),
    +
    +                        id=str(self.enzyme),
    +
    +                        type="misc_feature",
    +
    +                        qualifiers={
    +
    +                            "label": "Excised",
    +
    +                            "plasmid_assessment": "excised",
    +
    +                        },
    +
    +                    )
    +
    +                )
    +
    +                self.record.features.append(
    +
    +                    SeqFeature(
    +
    +                        FeatureLocation(self.reverse_enzyme - 1, len(self.record)),
    +
    +                        id=str(self.enzyme),
    +
    +                        type="misc_feature",
    +
    +                        qualifiers={
    +
    +                            "label": "Excised",
    +
    +                            "plasmid_assessment": "excised",
    +
    +                        },
    +
    +                    )
    +
    +                )
    +
    +    def digest_plasmid(self):
    +
    +        # Obtain fragments and get the backbone's overhangs.
    +
    +        # This method has two assumptions:
    +
    +        # - the sequence has two, correctly oriented enzyme sites.
    +
    +        # - the sequence is circular.
    +
    +        # Therefore there will be exactly two fragments, with one containing both sites.
    +
    +        self.results["digest"] = {}
    +
    +        if not self.results["is_circular"]:
    +
    +            return
    +
    +        if not self.results["is_site_orientation_correct"]:
    +
    +            return
    +
    +        record_fragments = dc.StickyEndFragment.list_from_record_digestion(
    +
    +            record=self.record, enzyme=self.enzyme, linear=False
    +
    +        )
    +
    +        if self.enzyme.site in record_fragments[0].to_standard_string():
    +
    +            backbone_index = 1  # there are only two fragments
    +
    +            excise_index = 0
    +
    +        else:
    +
    +            backbone_index = 0
    +
    +            excise_index = 1  # reversed
    +
    +        self.results["digest"]["backbone_seq"] = record_fragments[backbone_index]
    +
    +        self.results["digest"]["excised_seq"] = record_fragments[excise_index]
    +
    +        self.results["digest"]["first_overhang"] = str(
    +
    +            record_fragments[excise_index].seq.left_end
    +
    +        )
    +
    +        self.results["digest"]["last_overhang"] = str(
    +
    +            record_fragments[excise_index].seq.right_end
    +
    +        )
    +
    +    def count_other_sites(self, other_enzymes):
    +
    +        self.results["other_sites"] = {}
    +
    +        self.results["other_sites"]["has_any_other_sites"] = False
    +
    +        if other_enzymes is None:
    +
    +            return
    +
    +        bio_enzymes = [Bio.Restriction.__dict__[enzyme] for enzyme in other_enzymes]
    +
    +        restriction_batch = Bio.Restriction.RestrictionBatch(bio_enzymes)
    +
    +        # Work with the assumption that the sequence is circular:
    +
    +        analysis = Bio.Restriction.Analysis(
    +
    +            restriction_batch, sequence=self.record.seq, linear=False
    +
    +        )
    +
    +        self.results["other_sites"]["enzyme"] = analysis.full(linear=False)
    +
    +        for enzyme, matches in self.results["other_sites"]["enzyme"].items():
    +
    +            if len(matches) != 0:
    +
    +                self.results["other_sites"]["has_any_other_sites"] = True
    +
    +                # Also add as features for plot in report:
    +
    +                for site in matches:
    +
    +                    self.record.features.append(
    +
    +                        SeqFeature(
    +
    +                            FeatureLocation(site, site + 1),
    +
    +                            id=str(enzyme),
    +
    +                            type="misc_feature",
    +
    +                            qualifiers={
    +
    +                                "label": str(enzyme),
    +
    +                                "plasmid_assessment": "enzyme",
    +
    +                            },
    +
    +                        )
    +
    +                    )
    +
    +    def check_enzyme_site_locations(self):
    +
    +        """Flag enzyme sites that are within the retained backbone."""
    +
    +        try:
    +
    +            self.results["other_sites"]["has_any_other_sites"]
    +
    +            self.results["is_site_orientation_correct"]
    +
    +        except KeyError:
    +
    +            print("Run assessment methods first!")
    +
    +        else:
    +
    +            self.sites_outside_excised_region = {}
    +
    +            if (
    +
    +                self.results["other_sites"]["has_any_other_sites"]
    +
    +                and self.results["is_site_orientation_correct"]
    +
    +            ):
    +
    +                # if there are no other sites, no need to run:
    +
    +                if self.reverse_enzyme < self.forward_enzyme:
    +
    +                    # orientation = reverse -> forward
    +
    +                    for enzyme, sites in self.results["other_sites"]["enzyme"].items():
    +
    +                        problem_sites = []
    +
    +                        for site in sites:
    +
    +                            if self.reverse_enzyme < site < self.forward_enzyme:
    +
    +                                pass
    +
    +                            else:
    +
    +                                problem_sites += [str(site)]
    +
    +                        if problem_sites != []:
    +
    +                            self.sites_outside_excised_region[
    +
    +                                str(enzyme)
    +
    +                            ] = problem_sites
    +
    +                    txt = ""  # for the pdf report
    +
    +                    for (
    +
    +                        enzyme,
    +
    +                        problem_sites,
    +
    +                    ) in self.sites_outside_excised_region.items():
    +
    +                        txt += enzyme + ": " + " ".join(problem_sites) + ";"
    +
    +                    self.sites_outside_excised_region_txt = txt
    +
    +                else:
    +
    +                    # orientation = forward -> reverse
    +
    +                    for enzyme, sites in self.results["other_sites"]["enzyme"].items():
    +
    +                        problem_sites = []
    +
    +                        for site in sites:
    +
    +                            if self.forward_enzyme < site < self.reverse_enzyme:
    +
    +                                # in this case the site is within the retained backbone
    +
    +                                problem_sites += [str(site)]
    +
    +                        if problem_sites != []:
    +
    +                            self.sites_outside_excised_region[
    +
    +                                str(enzyme)
    +
    +                            ] = problem_sites
    +
    +                    txt = ""  # for the pdf report
    +
    +                    for (
    +
    +                        enzyme,
    +
    +                        problem_sites,
    +
    +                    ) in self.sites_outside_excised_region.items():
    +
    +                        txt += enzyme + ": " + " ".join(problem_sites) + ";"
    +
    +                    self.sites_outside_excised_region_txt = txt
    +
    +            else:  # no other sites or orientation not correct
    +
    +                self.sites_outside_excised_region_txt = ""
    +
    +    def sum_results(self):
    +
    +        self.results["pass"] = True
    +
    +        if self.results["is_circular"] is False:
    +
    +            self.results["pass"] = False
    +
    +            return
    +
    +        if self.results["is_site_orientation_correct"] is False:
    +
    +            # implicitly checks number of sites too
    +
    +            self.results["pass"] = False
    +
    +            return
    +
    +        if self.sites_outside_excised_region_txt:
    +
    +            self.results["pass"] = False
    +
    +            return
    +
    +        # if self.results["other_sites"]["has_any_other_sites"]:
    +
    +        #     self.results["pass"] = False
    +
    +        #     return
    +
    +    def plot_plasmid(self):
    +
    +        """Plot an outline of the plasmid."""
    +
    +        fig, ax = plt.subplots(figsize=(7, 4))
    +
    +        graphic_record = AssessmentTranslator().translate_record(self.record)
    +
    +        graphic_record.plot(ax=ax, with_ruler=False, strand_in_label_threshold=2)
    +
    +        self.fig = fig
    +
    + + +
    +

    Classes

    +

    Assessment

    +
    class Assessment(
    +    record,
    +    enzyme
    +)
    +
    + + +

    The plasmid assessment class.

    +

    Parameters

    +

    record

    +
    +

    A Biopython SeqRecord.

    +
    +

    enzyme

    +
    +

    A restriction enzyme (str). A Biopython RestrictionType will be looked +up using the string.

    +
    +
    View Source
    class Assessment:
    +
    +    """The plasmid assessment class.
    +
    +    **Parameters**
    +
    +    **record**
    +
    +    > A Biopython `SeqRecord`.
    +
    +    **enzyme**
    +
    +    > A restriction enzyme (`str`). A Biopython `RestrictionType` will be looked
    +
    +    up using the string.
    +
    +    """
    +
    +    UNKNOWN_IDS = [
    +
    +        "None",
    +
    +        "",
    +
    +        "<unknown id>",
    +
    +        ".",
    +
    +        "EXPORTED",
    +
    +        "<unknown name>",
    +
    +        "Exported",
    +
    +    ]
    +
    +    def __init__(self, record, enzyme):
    +
    +        self.record = record
    +
    +        self.enzyme = Bio.Restriction.__dict__[enzyme]
    +
    +        self.enzyme_name = str(self.enzyme)
    +
    +        self.results = {}
    +
    +    def assess_plasmid(self, other_enzymes=None):
    +
    +        """Evaluate plasmid for Golden Gate.
    +
    +        **Parameters**
    +
    +        **other_enzymes**
    +
    +        > List of enzymes used in higher level assemblies (`list`).
    +
    +        """
    +
    +        if other_enzymes:
    +
    +            self.other_enzymes = ", ".join([str(enz) for enz in other_enzymes])
    +
    +        self.add_name()
    +
    +        self.check_circularity()
    +
    +        self.get_number_of_sites()
    +
    +        self.evaluate_orientation()
    +
    +        self.digest_plasmid()
    +
    +        self.count_other_sites(other_enzymes)
    +
    +        self.check_enzyme_site_locations()
    +
    +        self.sum_results()
    +
    +        self.plot_plasmid()
    +
    +    def add_name(self):
    +
    +        """Set a name for the assessment."""
    +
    +        # To display on the report:
    +
    +        if str(self.record.id).strip() in self.UNKNOWN_IDS:
    +
    +            self.name = "Unnamed plasmid"
    +
    +        else:
    +
    +            if len(self.record.id) > 16:  # Genbank limit, also for width in report
    +
    +                self.name = self.record.id[:16] + "..."
    +
    +            else:
    +
    +                self.name = self.record.id
    +
    +    def check_circularity(self):
    +
    +        if "topology" not in self.record.annotations:
    +
    +            self.results["is_circular"] = False
    +
    +        elif self.record.annotations["topology"] == "circular":
    +
    +            self.results["is_circular"] = True
    +
    +        else:
    +
    +            self.results["is_circular"] = False
    +
    +    def get_number_of_sites(self):
    +
    +        if "is_circular" in self.results:
    +
    +            is_linear = not self.results["is_circular"]
    +
    +        else:
    +
    +            is_linear = False
    +
    +        restriction_batch = Bio.Restriction.RestrictionBatch([self.enzyme])
    +
    +        analysis = Bio.Restriction.Analysis(
    +
    +            restriction_batch, sequence=self.record.seq, linear=is_linear
    +
    +        )
    +
    +        self.analysis_results = analysis.full(linear=is_linear)
    +
    +        self.results["number_of_sites"] = len(self.analysis_results[self.enzyme])
    +
    +        # Add as features for plot in report:
    +
    +        for enzyme, sites in self.analysis_results.items():
    +
    +            for site in sites:
    +
    +                self.record.features.append(
    +
    +                    SeqFeature(
    +
    +                        FeatureLocation(site, site + 1),
    +
    +                        id=str(enzyme),
    +
    +                        type="misc_feature",
    +
    +                        qualifiers={
    +
    +                            "label": str(enzyme),
    +
    +                            "plasmid_assessment": "enzyme",
    +
    +                        },
    +
    +                    )
    +
    +                )
    +
    +    def evaluate_orientation(self):
    +
    +        self.results["is_site_orientation_correct"] = False  # default
    +
    +        # Forward strand:
    +
    +        self.iter_forward = [
    +
    +            match.end() for match in re.finditer(self.enzyme.site, str(self.record.seq))
    +
    +        ]
    +
    +        if sum(1 for _ in self.iter_forward) == 1:
    +
    +            self.forward_enzyme = self.iter_forward[0]
    +
    +            # rev_complement_site = str(self.record.seq.reverse_complement())
    +
    +            rev_complement_site = str(Seq(self.enzyme.site).reverse_complement())
    +
    +            self.iter_reverse = [
    +
    +                m.start()
    +
    +                for m in re.finditer(rev_complement_site, str(self.record.seq))
    +
    +            ]
    +
    +            if sum(1 for _ in self.iter_reverse) == 1:  # 1 site in both strands:
    +
    +                self.results["is_site_orientation_correct"] = True
    +
    +                self.reverse_enzyme = self.iter_reverse[0]
    +
    +        if self.results["is_site_orientation_correct"]:
    +
    +            if self.reverse_enzyme < self.forward_enzyme:
    +
    +                self.record.features.append(
    +
    +                    SeqFeature(
    +
    +                        FeatureLocation(
    +
    +                            self.reverse_enzyme - 1, self.forward_enzyme + 1
    +
    +                        ),
    +
    +                        id=str(self.enzyme),
    +
    +                        type="misc_feature",
    +
    +                        qualifiers={
    +
    +                            "label": "Excised",
    +
    +                            "plasmid_assessment": "excised",
    +
    +                        },
    +
    +                    )
    +
    +                )
    +
    +            else:  # put annotation together from two pieces:
    +
    +                self.record.features.append(
    +
    +                    SeqFeature(
    +
    +                        FeatureLocation(0, self.forward_enzyme + 1),
    +
    +                        id=str(self.enzyme),
    +
    +                        type="misc_feature",
    +
    +                        qualifiers={
    +
    +                            "label": "Excised",
    +
    +                            "plasmid_assessment": "excised",
    +
    +                        },
    +
    +                    )
    +
    +                )
    +
    +                self.record.features.append(
    +
    +                    SeqFeature(
    +
    +                        FeatureLocation(self.reverse_enzyme - 1, len(self.record)),
    +
    +                        id=str(self.enzyme),
    +
    +                        type="misc_feature",
    +
    +                        qualifiers={
    +
    +                            "label": "Excised",
    +
    +                            "plasmid_assessment": "excised",
    +
    +                        },
    +
    +                    )
    +
    +                )
    +
    +    def digest_plasmid(self):
    +
    +        # Obtain fragments and get the backbone's overhangs.
    +
    +        # This method has two assumptions:
    +
    +        # - the sequence has two, correctly oriented enzyme sites.
    +
    +        # - the sequence is circular.
    +
    +        # Therefore there will be exactly two fragments, with one containing both sites.
    +
    +        self.results["digest"] = {}
    +
    +        if not self.results["is_circular"]:
    +
    +            return
    +
    +        if not self.results["is_site_orientation_correct"]:
    +
    +            return
    +
    +        record_fragments = dc.StickyEndFragment.list_from_record_digestion(
    +
    +            record=self.record, enzyme=self.enzyme, linear=False
    +
    +        )
    +
    +        if self.enzyme.site in record_fragments[0].to_standard_string():
    +
    +            backbone_index = 1  # there are only two fragments
    +
    +            excise_index = 0
    +
    +        else:
    +
    +            backbone_index = 0
    +
    +            excise_index = 1  # reversed
    +
    +        self.results["digest"]["backbone_seq"] = record_fragments[backbone_index]
    +
    +        self.results["digest"]["excised_seq"] = record_fragments[excise_index]
    +
    +        self.results["digest"]["first_overhang"] = str(
    +
    +            record_fragments[excise_index].seq.left_end
    +
    +        )
    +
    +        self.results["digest"]["last_overhang"] = str(
    +
    +            record_fragments[excise_index].seq.right_end
    +
    +        )
    +
    +    def count_other_sites(self, other_enzymes):
    +
    +        self.results["other_sites"] = {}
    +
    +        self.results["other_sites"]["has_any_other_sites"] = False
    +
    +        if other_enzymes is None:
    +
    +            return
    +
    +        bio_enzymes = [Bio.Restriction.__dict__[enzyme] for enzyme in other_enzymes]
    +
    +        restriction_batch = Bio.Restriction.RestrictionBatch(bio_enzymes)
    +
    +        # Work with the assumption that the sequence is circular:
    +
    +        analysis = Bio.Restriction.Analysis(
    +
    +            restriction_batch, sequence=self.record.seq, linear=False
    +
    +        )
    +
    +        self.results["other_sites"]["enzyme"] = analysis.full(linear=False)
    +
    +        for enzyme, matches in self.results["other_sites"]["enzyme"].items():
    +
    +            if len(matches) != 0:
    +
    +                self.results["other_sites"]["has_any_other_sites"] = True
    +
    +                # Also add as features for plot in report:
    +
    +                for site in matches:
    +
    +                    self.record.features.append(
    +
    +                        SeqFeature(
    +
    +                            FeatureLocation(site, site + 1),
    +
    +                            id=str(enzyme),
    +
    +                            type="misc_feature",
    +
    +                            qualifiers={
    +
    +                                "label": str(enzyme),
    +
    +                                "plasmid_assessment": "enzyme",
    +
    +                            },
    +
    +                        )
    +
    +                    )
    +
    +    def check_enzyme_site_locations(self):
    +
    +        """Flag enzyme sites that are within the retained backbone."""
    +
    +        try:
    +
    +            self.results["other_sites"]["has_any_other_sites"]
    +
    +            self.results["is_site_orientation_correct"]
    +
    +        except KeyError:
    +
    +            print("Run assessment methods first!")
    +
    +        else:
    +
    +            self.sites_outside_excised_region = {}
    +
    +            if (
    +
    +                self.results["other_sites"]["has_any_other_sites"]
    +
    +                and self.results["is_site_orientation_correct"]
    +
    +            ):
    +
    +                # if there are no other sites, no need to run:
    +
    +                if self.reverse_enzyme < self.forward_enzyme:
    +
    +                    # orientation = reverse -> forward
    +
    +                    for enzyme, sites in self.results["other_sites"]["enzyme"].items():
    +
    +                        problem_sites = []
    +
    +                        for site in sites:
    +
    +                            if self.reverse_enzyme < site < self.forward_enzyme:
    +
    +                                pass
    +
    +                            else:
    +
    +                                problem_sites += [str(site)]
    +
    +                        if problem_sites != []:
    +
    +                            self.sites_outside_excised_region[
    +
    +                                str(enzyme)
    +
    +                            ] = problem_sites
    +
    +                    txt = ""  # for the pdf report
    +
    +                    for (
    +
    +                        enzyme,
    +
    +                        problem_sites,
    +
    +                    ) in self.sites_outside_excised_region.items():
    +
    +                        txt += enzyme + ": " + " ".join(problem_sites) + ";"
    +
    +                    self.sites_outside_excised_region_txt = txt
    +
    +                else:
    +
    +                    # orientation = forward -> reverse
    +
    +                    for enzyme, sites in self.results["other_sites"]["enzyme"].items():
    +
    +                        problem_sites = []
    +
    +                        for site in sites:
    +
    +                            if self.forward_enzyme < site < self.reverse_enzyme:
    +
    +                                # in this case the site is within the retained backbone
    +
    +                                problem_sites += [str(site)]
    +
    +                        if problem_sites != []:
    +
    +                            self.sites_outside_excised_region[
    +
    +                                str(enzyme)
    +
    +                            ] = problem_sites
    +
    +                    txt = ""  # for the pdf report
    +
    +                    for (
    +
    +                        enzyme,
    +
    +                        problem_sites,
    +
    +                    ) in self.sites_outside_excised_region.items():
    +
    +                        txt += enzyme + ": " + " ".join(problem_sites) + ";"
    +
    +                    self.sites_outside_excised_region_txt = txt
    +
    +            else:  # no other sites or orientation not correct
    +
    +                self.sites_outside_excised_region_txt = ""
    +
    +    def sum_results(self):
    +
    +        self.results["pass"] = True
    +
    +        if self.results["is_circular"] is False:
    +
    +            self.results["pass"] = False
    +
    +            return
    +
    +        if self.results["is_site_orientation_correct"] is False:
    +
    +            # implicitly checks number of sites too
    +
    +            self.results["pass"] = False
    +
    +            return
    +
    +        if self.sites_outside_excised_region_txt:
    +
    +            self.results["pass"] = False
    +
    +            return
    +
    +        # if self.results["other_sites"]["has_any_other_sites"]:
    +
    +        #     self.results["pass"] = False
    +
    +        #     return
    +
    +    def plot_plasmid(self):
    +
    +        """Plot an outline of the plasmid."""
    +
    +        fig, ax = plt.subplots(figsize=(7, 4))
    +
    +        graphic_record = AssessmentTranslator().translate_record(self.record)
    +
    +        graphic_record.plot(ax=ax, with_ruler=False, strand_in_label_threshold=2)
    +
    +        self.fig = fig
    +
    + + +
    +
    +

    Class variables

    +
    UNKNOWN_IDS
    +
    + + +

    Methods

    +
    add_name
    +
    def add_name(
    +    self
    +)
    +
    + + +

    Set a name for the assessment.

    +
    View Source
        def add_name(self):
    +
    +        """Set a name for the assessment."""
    +
    +        # To display on the report:
    +
    +        if str(self.record.id).strip() in self.UNKNOWN_IDS:
    +
    +            self.name = "Unnamed plasmid"
    +
    +        else:
    +
    +            if len(self.record.id) > 16:  # Genbank limit, also for width in report
    +
    +                self.name = self.record.id[:16] + "..."
    +
    +            else:
    +
    +                self.name = self.record.id
    +
    + + +
    +
    assess_plasmid
    +
    def assess_plasmid(
    +    self,
    +    other_enzymes=None
    +)
    +
    + + +

    Evaluate plasmid for Golden Gate.

    +

    Parameters

    +

    other_enzymes

    +
    +

    List of enzymes used in higher level assemblies (list).

    +
    +
    View Source
        def assess_plasmid(self, other_enzymes=None):
    +
    +        """Evaluate plasmid for Golden Gate.
    +
    +        **Parameters**
    +
    +        **other_enzymes**
    +
    +        > List of enzymes used in higher level assemblies (`list`).
    +
    +        """
    +
    +        if other_enzymes:
    +
    +            self.other_enzymes = ", ".join([str(enz) for enz in other_enzymes])
    +
    +        self.add_name()
    +
    +        self.check_circularity()
    +
    +        self.get_number_of_sites()
    +
    +        self.evaluate_orientation()
    +
    +        self.digest_plasmid()
    +
    +        self.count_other_sites(other_enzymes)
    +
    +        self.check_enzyme_site_locations()
    +
    +        self.sum_results()
    +
    +        self.plot_plasmid()
    +
    + + +
    +
    check_circularity
    +
    def check_circularity(
    +    self
    +)
    +
    + + +
    View Source
        def check_circularity(self):
    +
    +        if "topology" not in self.record.annotations:
    +
    +            self.results["is_circular"] = False
    +
    +        elif self.record.annotations["topology"] == "circular":
    +
    +            self.results["is_circular"] = True
    +
    +        else:
    +
    +            self.results["is_circular"] = False
    +
    + + +
    +
    check_enzyme_site_locations
    +
    def check_enzyme_site_locations(
    +    self
    +)
    +
    + + +

    Flag enzyme sites that are within the retained backbone.

    +
    View Source
        def check_enzyme_site_locations(self):
    +
    +        """Flag enzyme sites that are within the retained backbone."""
    +
    +        try:
    +
    +            self.results["other_sites"]["has_any_other_sites"]
    +
    +            self.results["is_site_orientation_correct"]
    +
    +        except KeyError:
    +
    +            print("Run assessment methods first!")
    +
    +        else:
    +
    +            self.sites_outside_excised_region = {}
    +
    +            if (
    +
    +                self.results["other_sites"]["has_any_other_sites"]
    +
    +                and self.results["is_site_orientation_correct"]
    +
    +            ):
    +
    +                # if there are no other sites, no need to run:
    +
    +                if self.reverse_enzyme < self.forward_enzyme:
    +
    +                    # orientation = reverse -> forward
    +
    +                    for enzyme, sites in self.results["other_sites"]["enzyme"].items():
    +
    +                        problem_sites = []
    +
    +                        for site in sites:
    +
    +                            if self.reverse_enzyme < site < self.forward_enzyme:
    +
    +                                pass
    +
    +                            else:
    +
    +                                problem_sites += [str(site)]
    +
    +                        if problem_sites != []:
    +
    +                            self.sites_outside_excised_region[
    +
    +                                str(enzyme)
    +
    +                            ] = problem_sites
    +
    +                    txt = ""  # for the pdf report
    +
    +                    for (
    +
    +                        enzyme,
    +
    +                        problem_sites,
    +
    +                    ) in self.sites_outside_excised_region.items():
    +
    +                        txt += enzyme + ": " + " ".join(problem_sites) + ";"
    +
    +                    self.sites_outside_excised_region_txt = txt
    +
    +                else:
    +
    +                    # orientation = forward -> reverse
    +
    +                    for enzyme, sites in self.results["other_sites"]["enzyme"].items():
    +
    +                        problem_sites = []
    +
    +                        for site in sites:
    +
    +                            if self.forward_enzyme < site < self.reverse_enzyme:
    +
    +                                # in this case the site is within the retained backbone
    +
    +                                problem_sites += [str(site)]
    +
    +                        if problem_sites != []:
    +
    +                            self.sites_outside_excised_region[
    +
    +                                str(enzyme)
    +
    +                            ] = problem_sites
    +
    +                    txt = ""  # for the pdf report
    +
    +                    for (
    +
    +                        enzyme,
    +
    +                        problem_sites,
    +
    +                    ) in self.sites_outside_excised_region.items():
    +
    +                        txt += enzyme + ": " + " ".join(problem_sites) + ";"
    +
    +                    self.sites_outside_excised_region_txt = txt
    +
    +            else:  # no other sites or orientation not correct
    +
    +                self.sites_outside_excised_region_txt = ""
    +
    + + +
    +
    count_other_sites
    +
    def count_other_sites(
    +    self,
    +    other_enzymes
    +)
    +
    + + +
    View Source
        def count_other_sites(self, other_enzymes):
    +
    +        self.results["other_sites"] = {}
    +
    +        self.results["other_sites"]["has_any_other_sites"] = False
    +
    +        if other_enzymes is None:
    +
    +            return
    +
    +        bio_enzymes = [Bio.Restriction.__dict__[enzyme] for enzyme in other_enzymes]
    +
    +        restriction_batch = Bio.Restriction.RestrictionBatch(bio_enzymes)
    +
    +        # Work with the assumption that the sequence is circular:
    +
    +        analysis = Bio.Restriction.Analysis(
    +
    +            restriction_batch, sequence=self.record.seq, linear=False
     
    -        self.evaluate_orientation()
    +        )
     
    -        self.digest_plasmid()
    +        self.results["other_sites"]["enzyme"] = analysis.full(linear=False)
     
    -        self.count_other_sites(other_enzymes)
    +        for enzyme, matches in self.results["other_sites"]["enzyme"].items():
     
    -        self.sum_results()
    +            if len(matches) != 0:
     
    -    def check_circularity(self):
    +                self.results["other_sites"]["has_any_other_sites"] = True
     
    -        if "topology" not in self.record.annotations:
    +                # Also add as features for plot in report:
     
    -            self.results["is_circular"] = False
    +                for site in matches:
     
    -        elif self.record.annotations["topology"] == "circular":
    +                    self.record.features.append(
     
    -            self.results["is_circular"] = True
    +                        SeqFeature(
     
    -        else:
    +                            FeatureLocation(site, site + 1),
     
    -            self.results["is_circular"] = False
    +                            id=str(enzyme),
     
    -    def get_number_of_sites(self):
    +                            type="misc_feature",
     
    -        if "is_circular" in self.results:
    +                            qualifiers={
     
    -            is_linear = not self.results["is_circular"]
    +                                "label": str(enzyme),
     
    -        else:
    +                                "plasmid_assessment": "enzyme",
     
    -            is_linear = False
    +                            },
     
    -        restriction_batch = Bio.Restriction.RestrictionBatch([self.enzyme])
    +                        )
     
    -        analysis = Bio.Restriction.Analysis(
    +                    )
    +
    - restriction_batch, sequence=self.record.seq, linear=is_linear - ) +
    +
    digest_plasmid
    +
    def digest_plasmid(
    +    self
    +)
    +
    - analysis_results = analysis.full(linear=is_linear) - self.results["number_of_sites"] = len(analysis_results[self.enzyme]) +
    View Source
        def digest_plasmid(self):
     
    -    def evaluate_orientation(self):
    +        # Obtain fragments and get the backbone's overhangs.
     
    -        self.results["is_site_orientation_correct"] = False  # default
    +        # This method has two assumptions:
     
    -        # Forward strand:
    +        # - the sequence has two, correctly oriented enzyme sites.
     
    -        iter = (match for match in re.finditer(self.enzyme.site, str(self.record.seq)))
    +        # - the sequence is circular.
     
    -        if sum(1 for _ in iter) == 1:
    +        # Therefore there will be exactly two fragments, with one containing both sites.
     
    -            rev_complement = str(self.record.seq.reverse_complement())
    +        self.results["digest"] = {}
     
    -            iter_reverse = (m for m in re.finditer(self.enzyme.site, rev_complement))
    +        if not self.results["is_circular"]:
     
    -            if sum(1 for _ in iter_reverse) == 1:  # 1 site in both strands:
    +            return
     
    -                self.results["is_site_orientation_correct"] = True
    +        if not self.results["is_site_orientation_correct"]:
     
    -    def digest_plasmid(self):
    +            return
     
    -        # Obtain fragments and get the backbone's overhangs.
    +        record_fragments = dc.StickyEndFragment.list_from_record_digestion(
     
    -        # This method has two assumptions:
    +            record=self.record, enzyme=self.enzyme, linear=False
     
    -        # - the sequence has two, correctly oriented enzyme sites.
    +        )
     
    -        # - the sequence is circular.
    +        if self.enzyme.site in record_fragments[0].to_standard_string():
     
    -        # Therefore there will be exactly two fragments, with one containing both sites.
    +            backbone_index = 1  # there are only two fragments
     
    -        self.results["digest"] = {}
    +            excise_index = 0
     
    -        if not self.results["is_circular"]:
    +        else:
     
    -            return
    +            backbone_index = 0
     
    -        if not self.results["is_site_orientation_correct"]:
    +            excise_index = 1  # reversed
     
    -            return
    +        self.results["digest"]["backbone_seq"] = record_fragments[backbone_index]
     
    -        record_fragments = dc.StickyEndFragment.list_from_record_digestion(
    +        self.results["digest"]["excised_seq"] = record_fragments[excise_index]
     
    -            record=self.record, enzyme=self.enzyme, linear=False
    +        self.results["digest"]["first_overhang"] = str(
     
    -        )
    +            record_fragments[excise_index].seq.left_end
     
    -        if self.enzyme.site in record_fragments[0].to_standard_string():
    +        )
     
    -            backbone_index = 1  # there are only two fragments
    +        self.results["digest"]["last_overhang"] = str(
     
    -            excise_index = 0
    +            record_fragments[excise_index].seq.right_end
     
    -        else:
    +        )
    +
    - backbone_index = 0 - excise_index = 1 # reversed +
    +
    evaluate_orientation
    +
    def evaluate_orientation(
    +    self
    +)
    +
    - self.results["digest"]["backbone_seq"] = record_fragments[backbone_index] - self.results["digest"]["excised_seq"] = record_fragments[excise_index] +
    View Source
        def evaluate_orientation(self):
     
    -        self.results["digest"]["first_overhang"] = str(
    +        self.results["is_site_orientation_correct"] = False  # default
     
    -            record_fragments[excise_index].seq.left_end
    +        # Forward strand:
     
    -        )
    +        self.iter_forward = [
     
    -        self.results["digest"]["last_overhang"] = str(
    +            match.end() for match in re.finditer(self.enzyme.site, str(self.record.seq))
     
    -            record_fragments[excise_index].seq.right_end
    +        ]
     
    -        )
    +        if sum(1 for _ in self.iter_forward) == 1:
     
    -    def count_other_sites(self, other_enzymes):
    +            self.forward_enzyme = self.iter_forward[0]
     
    -        self.results["other_sites"] = {}
    +            # rev_complement_site = str(self.record.seq.reverse_complement())
     
    -        if other_enzymes is None:
    +            rev_complement_site = str(Seq(self.enzyme.site).reverse_complement())
     
    -            return
    +            self.iter_reverse = [
     
    -        bio_enzymes = [Bio.Restriction.__dict__[enzyme] for enzyme in other_enzymes]
    +                m.start()
     
    -        restriction_batch = Bio.Restriction.RestrictionBatch(bio_enzymes)
    +                for m in re.finditer(rev_complement_site, str(self.record.seq))
     
    -        # Work with the assumption that the sequence is circular:
    +            ]
     
    -        analysis = Bio.Restriction.Analysis(
    +            if sum(1 for _ in self.iter_reverse) == 1:  # 1 site in both strands:
     
    -            restriction_batch, sequence=self.record.seq, linear=False
    +                self.results["is_site_orientation_correct"] = True
     
    -        )
    +                self.reverse_enzyme = self.iter_reverse[0]
     
    -        self.results["other_sites"]["enzyme"] = analysis.full(linear=False)
    +        if self.results["is_site_orientation_correct"]:
     
    -        self.results["other_sites"]["has_any_other_sites"] = False
    +            if self.reverse_enzyme < self.forward_enzyme:
     
    -        for enzyme, matches in self.results["other_sites"]["enzyme"].items():
    +                self.record.features.append(
     
    -            if len(matches) != 0:
    +                    SeqFeature(
     
    -                self.results["other_sites"]["has_any_other_sites"] = True
    +                        FeatureLocation(
     
    -    def sum_results(self):
    +                            self.reverse_enzyme - 1, self.forward_enzyme + 1
     
    -        self.results["pass"] = True
    +                        ),
     
    -        if self.results["is_circular"] is False:
    +                        id=str(self.enzyme),
     
    -            self.results["pass"] = False
    +                        type="misc_feature",
     
    -            return
    +                        qualifiers={
     
    -        if self.results["is_site_orientation_correct"] is False:
    +                            "label": "Excised",
     
    -            # implicitly checks number of sites too
    +                            "plasmid_assessment": "excised",
     
    -            self.results["pass"] = False
    +                        },
     
    -            return
    +                    )
     
    -        if self.results["other_sites"]["has_any_other_sites"]:
    +                )
     
    -            self.results["pass"] = False
    +            else:  # put annotation together from two pieces:
     
    -            return
    +                self.record.features.append(
    +
    +                    SeqFeature(
    +
    +                        FeatureLocation(0, self.forward_enzyme + 1),
    +
    +                        id=str(self.enzyme),
    +
    +                        type="misc_feature",
    +
    +                        qualifiers={
    +
    +                            "label": "Excised",
    +
    +                            "plasmid_assessment": "excised",
    +
    +                        },
    +
    +                    )
    +
    +                )
    +
    +                self.record.features.append(
    +
    +                    SeqFeature(
    +
    +                        FeatureLocation(self.reverse_enzyme - 1, len(self.record)),
    +
    +                        id=str(self.enzyme),
    +
    +                        type="misc_feature",
    +
    +                        qualifiers={
    +
    +                            "label": "Excised",
    +
    +                            "plasmid_assessment": "excised",
    +
    +                        },
    +
    +                    )
    +
    +                )
     
    -

    Classes

    -

    Assessment

    -
    class Assessment(
    -    record,
    -    enzyme
    +
    get_number_of_sites
    +
    def get_number_of_sites(
    +    self
     )
     
    -

    The plasmid assessment class.

    -

    Parameters

    -

    record

    -
    -

    A Biopython SeqRecord.

    -
    -

    enzyme

    -
    -

    A restriction enzyme (str). A Biopython RestrictionType will be looked -up using the string.

    -
    -
    View Source
    class Assessment:
    +
    View Source
        def get_number_of_sites(self):
     
    -    """The plasmid assessment class.
    +        if "is_circular" in self.results:
     
    -    **Parameters**
    +            is_linear = not self.results["is_circular"]
     
    -    **record**
    +        else:
     
    -    > A Biopython `SeqRecord`.
    +            is_linear = False
     
    -    **enzyme**
    +        restriction_batch = Bio.Restriction.RestrictionBatch([self.enzyme])
     
    -    > A restriction enzyme (`str`). A Biopython `RestrictionType` will be looked
    +        analysis = Bio.Restriction.Analysis(
     
    -    up using the string.
    +            restriction_batch, sequence=self.record.seq, linear=is_linear
     
    -    """
    +        )
     
    -    def __init__(self, record, enzyme):
    +        self.analysis_results = analysis.full(linear=is_linear)
     
    -        self.record = record
    +        self.results["number_of_sites"] = len(self.analysis_results[self.enzyme])
     
    -        self.enzyme = Bio.Restriction.__dict__[enzyme]
    +        # Add as features for plot in report:
     
    -        self.results = {}
    +        for enzyme, sites in self.analysis_results.items():
     
    -    def assess_plasmid(self, other_enzymes=None):
    +            for site in sites:
     
    -        """Evaluate plasmid for Golden Gate.
    +                self.record.features.append(
     
    -        **Parameters**
    +                    SeqFeature(
     
    -        **other_enzymes**
    +                        FeatureLocation(site, site + 1),
     
    -        > List of enzymes used in higher level assemblies (`list`).
    +                        id=str(enzyme),
     
    -        """
    +                        type="misc_feature",
     
    -        self.check_circularity()
    +                        qualifiers={
     
    -        self.get_number_of_sites()
    +                            "label": str(enzyme),
     
    -        self.evaluate_orientation()
    +                            "plasmid_assessment": "enzyme",
     
    -        self.digest_plasmid()
    +                        },
     
    -        self.count_other_sites(other_enzymes)
    +                    )
     
    -        self.sum_results()
    +                )
    +
    - def check_circularity(self): - if "topology" not in self.record.annotations: +
    +
    plot_plasmid
    +
    def plot_plasmid(
    +    self
    +)
    +
    - self.results["is_circular"] = False - elif self.record.annotations["topology"] == "circular": +

    Plot an outline of the plasmid.

    +
    View Source
        def plot_plasmid(self):
     
    -            self.results["is_circular"] = True
    +        """Plot an outline of the plasmid."""
     
    -        else:
    +        fig, ax = plt.subplots(figsize=(7, 4))
     
    -            self.results["is_circular"] = False
    +        graphic_record = AssessmentTranslator().translate_record(self.record)
     
    -    def get_number_of_sites(self):
    +        graphic_record.plot(ax=ax, with_ruler=False, strand_in_label_threshold=2)
     
    -        if "is_circular" in self.results:
    +        self.fig = fig
    +
    - is_linear = not self.results["is_circular"] - else: +
    +
    sum_results
    +
    def sum_results(
    +    self
    +)
    +
    - is_linear = False - restriction_batch = Bio.Restriction.RestrictionBatch([self.enzyme]) +
    View Source
        def sum_results(self):
     
    -        analysis = Bio.Restriction.Analysis(
    +        self.results["pass"] = True
     
    -            restriction_batch, sequence=self.record.seq, linear=is_linear
    +        if self.results["is_circular"] is False:
     
    -        )
    +            self.results["pass"] = False
     
    -        analysis_results = analysis.full(linear=is_linear)
    +            return
     
    -        self.results["number_of_sites"] = len(analysis_results[self.enzyme])
    +        if self.results["is_site_orientation_correct"] is False:
     
    -    def evaluate_orientation(self):
    +            # implicitly checks number of sites too
     
    -        self.results["is_site_orientation_correct"] = False  # default
    +            self.results["pass"] = False
    +
    +            return
    +
    +        if self.sites_outside_excised_region_txt:
    +
    +            self.results["pass"] = False
    +
    +            return
    +
    + + +
    +

    AssessmentTranslator

    +
    class AssessmentTranslator(
    +    features_filters=(),
    +    features_properties=None
    +)
    +
    - # Forward strand: - iter = (match for match in re.finditer(self.enzyme.site, str(self.record.seq))) +

    Custom translator for highlighting key features.

    +
    View Source
        class AssessmentTranslator:
    +
    +        """Please install dna_features_viewer to use this class."""
    +
    +        def __init__(self):
    +
    +            raise Exception("Please install dna_features_viewer to use this class.")
    +
    + + +
    +
    +

    Ancestors (in MRO)

    +
      +
    • dna_features_viewer.BiopythonTranslator.BiopythonTranslator.BiopythonTranslator
    • +
    • dna_features_viewer.BiopythonTranslator.BiopythonTranslatorBase.BiopythonTranslatorBase
    • +
    +

    Class variables

    +
    default_feature_color
    +
    - if sum(1 for _ in iter) == 1: - rev_complement = str(self.record.seq.reverse_complement()) +
    graphic_record_parameters
    +
    - iter_reverse = (m for m in re.finditer(self.enzyme.site, rev_complement)) - if sum(1 for _ in iter_reverse) == 1: # 1 site in both strands: +
    ignored_features_types
    +
    - self.results["is_site_orientation_correct"] = True - def digest_plasmid(self): +
    label_fields
    +
    - # Obtain fragments and get the backbone's overhangs. - # This method has two assumptions: +

    Static methods

    +
    quick_class_plot
    +
    def quick_class_plot(
    +    record,
    +    figure_width=12,
    +    **kwargs
    +)
    +
    - # - the sequence has two, correctly oriented enzyme sites. - # - the sequence is circular. +

    Allows super quick and dirty plotting of Biopython records.

    +

    This is really meant for use in a Jupyter/Ipython notebook with +the "%matplotlib inline" setting.

    +
    +
    +
    +

    from dna_features_viewer import BiopythonTranslator +BiopythonTranslator.quick_plot(my_record)

    +
    +
    +
    +
    View Source
        @classmethod
     
    -        # Therefore there will be exactly two fragments, with one containing both sites.
    +    def quick_class_plot(cls, record, figure_width=12, **kwargs):
     
    -        self.results["digest"] = {}
    +        """Allows super quick and dirty plotting of Biopython records.
     
    -        if not self.results["is_circular"]:
    +        This is really meant for use in a Jupyter/Ipython notebook with
     
    -            return
    +        the "%matplotlib inline" setting.
     
    -        if not self.results["is_site_orientation_correct"]:
    +        >>> from dna_features_viewer import BiopythonTranslator
     
    -            return
    +        >>> BiopythonTranslator.quick_plot(my_record)
     
    -        record_fragments = dc.StickyEndFragment.list_from_record_digestion(
    +        """
     
    -            record=self.record, enzyme=self.enzyme, linear=False
    +        graphic_record = cls().translate_record(record)
     
    -        )
    +        ax, _ = graphic_record.plot(figure_width=figure_width, **kwargs)
     
    -        if self.enzyme.site in record_fragments[0].to_standard_string():
    +        return ax
    +
    - backbone_index = 1 # there are only two fragments - excise_index = 0 +
    +

    Methods

    +
    compute_feature_box_color
    +
    def compute_feature_box_color(
    +    self,
    +    feature
    +)
    +
    - else: - backbone_index = 0 +

    Compute a box_color for this feature.

    +
    View Source
        def compute_feature_box_color(self, feature):
     
    -            excise_index = 1  # reversed
    +        """Compute a box_color for this feature."""
     
    -        self.results["digest"]["backbone_seq"] = record_fragments[backbone_index]
    +        return "auto"
    +
    - self.results["digest"]["excised_seq"] = record_fragments[excise_index] - self.results["digest"]["first_overhang"] = str( +
    +
    compute_feature_box_linewidth
    +
    def compute_feature_box_linewidth(
    +    self,
    +    feature
    +)
    +
    - record_fragments[excise_index].seq.left_end - ) +

    Compute a box_linewidth for this feature.

    +
    View Source
        def compute_feature_box_linewidth(self, feature):
     
    -        self.results["digest"]["last_overhang"] = str(
    +        """Compute a box_linewidth for this feature."""
     
    -            record_fragments[excise_index].seq.right_end
    +        return 0.3
    +
    - ) - def count_other_sites(self, other_enzymes): +
    +
    compute_feature_color
    +
    def compute_feature_color(
    +    self,
    +    feature
    +)
    +
    - self.results["other_sites"] = {} - if other_enzymes is None: +

    Compute a color for this feature.

    +

    If the feature has a color qualifier it will be used. Otherwise, +the classe's default_feature_color is used.

    +

    To change the behaviour, create a subclass of BiopythonTranslator +and overwrite this method.

    +
    View Source
            def compute_feature_color(self, feature):
     
    -            return
    +            assessment_ref = "plasmid_assessment"
     
    -        bio_enzymes = [Bio.Restriction.__dict__[enzyme] for enzyme in other_enzymes]
    +            if assessment_ref in feature.qualifiers:
     
    -        restriction_batch = Bio.Restriction.RestrictionBatch(bio_enzymes)
    +                if feature.qualifiers[assessment_ref] == "enzyme":
     
    -        # Work with the assumption that the sequence is circular:
    +                    return "red"
     
    -        analysis = Bio.Restriction.Analysis(
    +                elif feature.qualifiers[assessment_ref] == "excised":
     
    -            restriction_batch, sequence=self.record.seq, linear=False
    +                    return "yellow"
     
    -        )
    +                elif feature.qualifiers[assessment_ref] == "backbone":
     
    -        self.results["other_sites"]["enzyme"] = analysis.full(linear=False)
    +                    return "tab:cyan"
     
    -        self.results["other_sites"]["has_any_other_sites"] = False
    +                else:
     
    -        for enzyme, matches in self.results["other_sites"]["enzyme"].items():
    +                    return "tab:blue"  # default dna_features_viewer color
     
    -            if len(matches) != 0:
    +            else:
     
    -                self.results["other_sites"]["has_any_other_sites"] = True
    +                return "tab:blue"
    +
    - def sum_results(self): - self.results["pass"] = True +
    +
    compute_feature_fontdict
    +
    def compute_feature_fontdict(
    +    self,
    +    feature
    +)
    +
    - if self.results["is_circular"] is False: - self.results["pass"] = False +

    Compute a font dict for this feature.

    +
    View Source
        def compute_feature_fontdict(self, feature):
     
    -            return
    +        """Compute a font dict for this feature."""
     
    -        if self.results["is_site_orientation_correct"] is False:
    +        return None
    +
    - # implicitly checks number of sites too - self.results["pass"] = False +
    +
    compute_feature_html
    +
    def compute_feature_html(
    +    self,
    +    feature
    +)
    +
    - return - if self.results["other_sites"]["has_any_other_sites"]: +

    Gets the 'label' of the feature.

    +
    View Source
        def compute_feature_html(self, feature):
     
    -            self.results["pass"] = False
    +        """Gets the 'label' of the feature."""
     
    -            return
    +        return self.compute_feature_label(feature)
     
    -
    -

    Methods

    -
    assess_plasmid
    -
    def assess_plasmid(
    +
    compute_feature_label
    +
    def compute_feature_label(
         self,
    -    other_enzymes=None
    +    feature
     )
     
    -

    Evaluate plasmid for Golden Gate.

    -

    Parameters

    -

    other_enzymes

    -
    -

    List of enzymes used in higher level assemblies (list).

    -
    -
    View Source
        def assess_plasmid(self, other_enzymes=None):
    -
    -        """Evaluate plasmid for Golden Gate.
    -
    -        **Parameters**
    +

    Compute the label of the feature.

    +
    View Source
        def compute_feature_label(self, feature):
     
    -        **other_enzymes**
    +        """Compute the label of the feature."""
     
    -        > List of enzymes used in higher level assemblies (`list`).
    +        label = feature.type
     
    -        """
    +        for key in self.label_fields:
     
    -        self.check_circularity()
    +            if key in feature.qualifiers and len(feature.qualifiers[key]):
     
    -        self.get_number_of_sites()
    +                label = feature.qualifiers[key]
     
    -        self.evaluate_orientation()
    +                break
     
    -        self.digest_plasmid()
    +        if isinstance(label, list):
     
    -        self.count_other_sites(other_enzymes)
    +            label = "|".join(label)
     
    -        self.sum_results()
    +        return label
     
    -
    check_circularity
    -
    def check_circularity(
    -    self
    +
    +
    def compute_feature_label_link_color(
    +    self,
    +    feature
     )
     
    -
    View Source
        def check_circularity(self):
    +

    Compute the color of the line linking the label to its feature.

    +
    View Source
        def compute_feature_label_link_color(self, feature):
     
    -        if "topology" not in self.record.annotations:
    +        """Compute the color of the line linking the label to its feature."""
     
    -            self.results["is_circular"] = False
    +        return "black"
    +
    - elif self.record.annotations["topology"] == "circular": - self.results["is_circular"] = True +
    +
    compute_feature_legend_text
    +
    def compute_feature_legend_text(
    +    self,
    +    feature
    +)
    +
    - else: - self.results["is_circular"] = False +
    View Source
        def compute_feature_legend_text(self, feature):
    +
    +        return None
     
    -
    count_other_sites
    -
    def count_other_sites(
    +
    compute_feature_linewidth
    +
    def compute_feature_linewidth(
         self,
    -    other_enzymes
    +    feature
     )
     
    -
    View Source
        def count_other_sites(self, other_enzymes):
    +

    Compute the edge width of the feature's arrow/rectangle.

    +
    View Source
        def compute_feature_linewidth(self, feature):
     
    -        self.results["other_sites"] = {}
    +        """Compute the edge width of the feature's arrow/rectangle."""
     
    -        if other_enzymes is None:
    +        return 1.0
    +
    - return - bio_enzymes = [Bio.Restriction.__dict__[enzyme] for enzyme in other_enzymes] +
    +
    compute_filtered_features
    +
    def compute_filtered_features(
    +    self,
    +    features
    +)
    +
    - restriction_batch = Bio.Restriction.RestrictionBatch(bio_enzymes) - # Work with the assumption that the sequence is circular: +

    Return the list of features minus the ignored ones.

    +

    By the method keeps any feature whose type is not in +ignored_features_types and for which all filter(f) pass.

    +
    View Source
        def compute_filtered_features(self, features):
     
    -        analysis = Bio.Restriction.Analysis(
    +        """Return the list of features minus the ignored ones.
     
    -            restriction_batch, sequence=self.record.seq, linear=False
    +        By the method keeps any feature whose type is not in
     
    -        )
    +        ignored_features_types and for which all filter(f) pass.
     
    -        self.results["other_sites"]["enzyme"] = analysis.full(linear=False)
    +        """
     
    -        self.results["other_sites"]["has_any_other_sites"] = False
    +        return [
     
    -        for enzyme, matches in self.results["other_sites"]["enzyme"].items():
    +            f
     
    -            if len(matches) != 0:
    +            for f in features
     
    -                self.results["other_sites"]["has_any_other_sites"] = True
    +            if all([fl(f) for fl in self.features_filters])
    +
    +            and f.type not in self.ignored_features_types
    +
    +        ]
     
    -
    digest_plasmid
    -
    def digest_plasmid(
    -    self
    +
    quick_plot
    +
    def quick_plot(
    +    self,
    +    record,
    +    figure_width=12,
    +    **kwargs
     )
     
    -
    View Source
        def digest_plasmid(self):
    -
    -        # Obtain fragments and get the backbone's overhangs.
    -
    -        # This method has two assumptions:
    -
    -        # - the sequence has two, correctly oriented enzyme sites.
    +

    Allows super quick and dirty plotting of Biopython records.

    +

    This is really meant for use in a Jupyter/Ipython notebook with +the "%matplotlib inline" setting.

    +
    +
    +
    +

    from dna_features_viewer import BiopythonTranslator +BiopythonTranslator.quick_plot(my_record)

    +
    +
    +
    +
    View Source
        def quick_plot(self, record, figure_width=12, **kwargs):
     
    -        # - the sequence is circular.
    +        """Allows super quick and dirty plotting of Biopython records.
     
    -        # Therefore there will be exactly two fragments, with one containing both sites.
    +        This is really meant for use in a Jupyter/Ipython notebook with
     
    -        self.results["digest"] = {}
    +        the "%matplotlib inline" setting.
     
    -        if not self.results["is_circular"]:
    +        >>> from dna_features_viewer import BiopythonTranslator
     
    -            return
    +        >>> BiopythonTranslator.quick_plot(my_record)
     
    -        if not self.results["is_site_orientation_correct"]:
    +        """
     
    -            return
    +        graphic_record = self.translate_record(record)
     
    -        record_fragments = dc.StickyEndFragment.list_from_record_digestion(
    +        ax, _ = graphic_record.plot(figure_width=figure_width, **kwargs)
     
    -            record=self.record, enzyme=self.enzyme, linear=False
    +        return ax
    +
    - ) - if self.enzyme.site in record_fragments[0].to_standard_string(): +
    +
    translate_feature
    +
    def translate_feature(
    +    self,
    +    feature
    +)
    +
    - backbone_index = 1 # there are only two fragments - excise_index = 0 +

    Translate a Biopython feature into a Dna Features Viewer feature.

    +
    View Source
        def translate_feature(self, feature):
     
    -        else:
    +        """Translate a Biopython feature into a Dna Features Viewer feature."""
     
    -            backbone_index = 0
    +        properties = dict(
     
    -            excise_index = 1  # reversed
    +            label=self.compute_feature_label(feature),
     
    -        self.results["digest"]["backbone_seq"] = record_fragments[backbone_index]
    +            color=self.compute_feature_color(feature),
     
    -        self.results["digest"]["excised_seq"] = record_fragments[excise_index]
    +            html=self.compute_feature_html(feature),
     
    -        self.results["digest"]["first_overhang"] = str(
    +            fontdict=self.compute_feature_fontdict(feature),
     
    -            record_fragments[excise_index].seq.left_end
    +            box_linewidth=self.compute_feature_box_linewidth(feature),
     
    -        )
    +            box_color=self.compute_feature_box_color(feature),
     
    -        self.results["digest"]["last_overhang"] = str(
    +            linewidth=self.compute_feature_linewidth(feature),
     
    -            record_fragments[excise_index].seq.right_end
    +            label_link_color=self.compute_feature_label_link_color(feature),
     
    -        )
    -
    + legend_text=self.compute_feature_legend_text(feature), + ) -
    -
    evaluate_orientation
    -
    def evaluate_orientation(
    -    self
    -)
    -
    + if self.features_properties is not None: + other_properties = self.features_properties -
    View Source
        def evaluate_orientation(self):
    +            if hasattr(other_properties, "__call__"):
     
    -        self.results["is_site_orientation_correct"] = False  # default
    +                other_properties = other_properties(feature)
     
    -        # Forward strand:
    +            properties.update(other_properties)
     
    -        iter = (match for match in re.finditer(self.enzyme.site, str(self.record.seq)))
    +        return GraphicFeature(
     
    -        if sum(1 for _ in iter) == 1:
    +            start=feature.location.start,
     
    -            rev_complement = str(self.record.seq.reverse_complement())
    +            end=feature.location.end,
     
    -            iter_reverse = (m for m in re.finditer(self.enzyme.site, rev_complement))
    +            strand=feature.location.strand,
     
    -            if sum(1 for _ in iter_reverse) == 1:  # 1 site in both strands:
    +            **properties
     
    -                self.results["is_site_orientation_correct"] = True
    +        )
     
    -
    get_number_of_sites
    -
    def get_number_of_sites(
    -    self
    +
    translate_record
    +
    def translate_record(
    +    self,
    +    record,
    +    record_class=None,
    +    filetype=None
     )
     
    -
    View Source
        def get_number_of_sites(self):
    +

    Create a new GraphicRecord from a BioPython Record object.

    +

    Parameters

    +

    record + A BioPython Record object or the path to a Genbank or a GFF file.

    +

    record_class + The graphic record class to use, e.g. GraphicRecord (default) or + CircularGraphicRecord. Strings 'circular' and 'linear' can also be + provided.

    +

    filetype + Used only when a Genbank or a GFF file is provided; one of "genbank" + or "gff" to be used. Default None infers from file extension.

    +
    View Source
        def translate_record(self, record, record_class=None, filetype=None):
     
    -        if "is_circular" in self.results:
    +        """Create a new GraphicRecord from a BioPython Record object.
     
    -            is_linear = not self.results["is_circular"]
    +        Parameters
     
    -        else:
    +        ----------
     
    -            is_linear = False
    +        record
     
    -        restriction_batch = Bio.Restriction.RestrictionBatch([self.enzyme])
    +          A BioPython Record object or the path to a Genbank or a GFF file.
     
    -        analysis = Bio.Restriction.Analysis(
    +        record_class
     
    -            restriction_batch, sequence=self.record.seq, linear=is_linear
    +          The graphic record class to use, e.g. GraphicRecord (default) or
     
    -        )
    +          CircularGraphicRecord. Strings 'circular' and 'linear' can also be
     
    -        analysis_results = analysis.full(linear=is_linear)
    +          provided.
     
    -        self.results["number_of_sites"] = len(analysis_results[self.enzyme])
    -
    + filetype + Used only when a Genbank or a GFF file is provided; one of "genbank" -
    -
    sum_results
    -
    def sum_results(
    -    self
    -)
    -
    + or "gff" to be used. Default None infers from file extension. + + """ + classes = { -
    View Source
        def sum_results(self):
    +            "linear": GraphicRecord,
     
    -        self.results["pass"] = True
    +            "circular": CircularGraphicRecord,
     
    -        if self.results["is_circular"] is False:
    +            None: GraphicRecord,
     
    -            self.results["pass"] = False
    +        }
     
    -            return
    +        if record_class in classes:
     
    -        if self.results["is_site_orientation_correct"] is False:
    +            record_class = classes[record_class]
     
    -            # implicitly checks number of sites too
    +        if isinstance(record, str) or hasattr(record, "read"):
     
    -            self.results["pass"] = False
    +            record = load_record(record, filetype=filetype)
     
    -            return
    +        filtered_features = self.compute_filtered_features(record.features)
     
    -        if self.results["other_sites"]["has_any_other_sites"]:
    +        return record_class(
     
    -            self.results["pass"] = False
    +            sequence_length=len(record),
     
    -            return
    +            sequence=str(record.seq),
    +
    +            features=[
    +
    +                self.translate_feature(feature)
    +
    +                for feature in filtered_features
    +
    +                if feature.location is not None
    +
    +            ],
    +
    +            **self.graphic_record_parameters
    +
    +        )
     
    diff --git a/docs/reference/plasmid_assessor/reports/index.html b/docs/reference/plasmid_assessor/reports/index.html index d5f6926..f3d73e9 100644 --- a/docs/reference/plasmid_assessor/reports/index.html +++ b/docs/reference/plasmid_assessor/reports/index.html @@ -457,25 +457,33 @@

    Module plasmid_assessor.reports

    import os -import matplotlib.pyplot as plt +try: -import pandas + import pdf_reports.tools as pdf_tools -from pdf_reports import ( + from pdf_reports import ( - add_css_class, + add_css_class, - dataframe_to_html, + dataframe_to_html, - pug_to_html, + pug_to_html, - style_table_rows, + style_table_rows, - write_report, + write_report, -) + ) + + import pandas + + import matplotlib + + REPORT_PKGS_AVAILABLE = True -import pdf_reports.tools as pdf_tools +except ImportError: + + REPORT_PKGS_AVAILABLE = False from .version import __version__ @@ -497,7 +505,7 @@

    Module plasmid_assessor.reports

    % (now, __version__), - "plasma_logo_url": os.path.join(ASSETS_PATH, "imgs", "logo.png"), + "plasma_logo_url": os.path.join(ASSETS_PATH, "imgs", "plasma_logo.png"), } @@ -525,7 +533,15 @@

    Module plasmid_assessor.reports

    """ - # assessment.figure_data = pdf_tools.figure_data(assessment.fig, fmt="svg") + if not REPORT_PKGS_AVAILABLE: + + raise ImportError( + + "Install extra packages with `pip install plasmid_assessor[report]`" + + ) + + assessment.figure_data = pdf_tools.figure_data(assessment.fig, fmt="svg") html = end_pug_to_html(REPORT_TEMPLATE, assessment=assessment,) @@ -539,6 +555,10 @@

    Variables

    +
    REPORT_PKGS_AVAILABLE
    +
    + +
    REPORT_TEMPLATE
     
    @@ -570,7 +590,7 @@

    end_pug_to_html

    % (now, __version__), - "plasma_logo_url": os.path.join(ASSETS_PATH, "imgs", "logo.png"), + "plasma_logo_url": os.path.join(ASSETS_PATH, "imgs", "plasma_logo.png"), } @@ -603,27 +623,35 @@

    write_pdf_report

    Assessment instance.

    -
    View Source
    def write_pdf_report(target, assessment):
    +
    View Source
    def write_pdf_report(target, assessment):
     
    -    """Write an assessment report with a PDF summary.
    +    """Write an assessment report with a PDF summary.
     
    -    **Parameters**
    +    **Parameters**
     
    -    **target**
    +    **target**
     
    -    > Path for PDF file.
    +    > Path for PDF file.
     
    -    **assessment**
    +    **assessment**
     
    -    > Assessment instance.
    +    > Assessment instance.
     
    -    """
    +    """
     
    -    # assessment.figure_data = pdf_tools.figure_data(assessment.fig, fmt="svg")
    +    if not REPORT_PKGS_AVAILABLE:
     
    -    html = end_pug_to_html(REPORT_TEMPLATE, assessment=assessment,)
    +        raise ImportError(
     
    -    write_report(html, target, extra_stylesheets=(STYLESHEET,))
    +            "Install extra packages with `pip install plasmid_assessor[report]`"
    +
    +        )
    +
    +    assessment.figure_data = pdf_tools.figure_data(assessment.fig, fmt="svg")
    +
    +    html = end_pug_to_html(REPORT_TEMPLATE, assessment=assessment,)
    +
    +    write_report(html, target, extra_stylesheets=(STYLESHEET,))
     
    diff --git a/docs/search/search_index.json b/docs/search/search_index.json index 60c23ed..5afa69c 100644 --- a/docs/search/search_index.json +++ b/docs/search/search_index.json @@ -1 +1 @@ -{"config":{"lang":["en"],"min_search_length":3,"prebuild_index":false,"separator":"[\\s\\-]+"},"docs":[{"location":"","text":"Plasmid assessor Plasmid assessment for Golden Gate cloning. An important task in DNA assembly is creating or adapting a plasmid to serve as a backbone for the assembled parts. This package provides tools for quickly checking a few basic backbone requirements on a plasmid sequence. The most important steps of vector (backbone) adaptation are ensuring that there are: two sites for the chosen restriction enzyme, flanking the insert segment no other sites for the restriction enzyme The choice of the two backbone overhangs are also important, because they will be involved in all assemblies using that plasmid. Additionally, we can add selection for proper assembly (for example, by including a ccdB suicide cassette at the insertion location) and for presence of plasmid in the bacterium (for example, by using antibiotic resistance). Finally, we can check that the replicon and the partitioning system in the plasmid suits the strain, compatibility and other requirements. Install pip install plasmid_assessor # pip install plasmid_assessor [ report ] # install with dependencies for pdf reports Usage import plasmid_assessor as plasma # Load your Genbank or FASTA file as a Biopython SeqRecord, or create a new one: from Bio.SeqRecord import SeqRecord from Bio.Seq import Seq sequence = SeqRecord ( Seq ( \"CGTCTCAACTG\" + \"AAA\" + \"TATCAGAGACG\" + \"AGGTCTC\" ), annotations = { \"topology\" : \"circular\" }) # Evaluate plasmid: design = plasma . Assessment ( sequence , \"BsmBI\" ) design . assess_plasmid ( other_enzymes = [ \"BsaI\" ]) # also check for the enzyme of the 2nd level assembly # Results are stored in: design . results # Save as a PDF report: plasma . write_pdf_report ( \"report.pdf\" , design ) Versioning Plasmid assessor uses the semantic versioning scheme. License = MIT Plasmid assessor is free/libre and open-source software, which means the users have the freedom to run, study, change and distribute the software. Plasmid assessor was written at the Edinburgh Genome Foundry by Peter Vegh . Copyright 2021 Edinburgh Genome Foundry, University of Edinburgh","title":"Home"},{"location":"#plasmid-assessor","text":"Plasmid assessment for Golden Gate cloning. An important task in DNA assembly is creating or adapting a plasmid to serve as a backbone for the assembled parts. This package provides tools for quickly checking a few basic backbone requirements on a plasmid sequence. The most important steps of vector (backbone) adaptation are ensuring that there are: two sites for the chosen restriction enzyme, flanking the insert segment no other sites for the restriction enzyme The choice of the two backbone overhangs are also important, because they will be involved in all assemblies using that plasmid. Additionally, we can add selection for proper assembly (for example, by including a ccdB suicide cassette at the insertion location) and for presence of plasmid in the bacterium (for example, by using antibiotic resistance). Finally, we can check that the replicon and the partitioning system in the plasmid suits the strain, compatibility and other requirements.","title":"Plasmid assessor"},{"location":"#install","text":"pip install plasmid_assessor # pip install plasmid_assessor [ report ] # install with dependencies for pdf reports","title":"Install"},{"location":"#usage","text":"import plasmid_assessor as plasma # Load your Genbank or FASTA file as a Biopython SeqRecord, or create a new one: from Bio.SeqRecord import SeqRecord from Bio.Seq import Seq sequence = SeqRecord ( Seq ( \"CGTCTCAACTG\" + \"AAA\" + \"TATCAGAGACG\" + \"AGGTCTC\" ), annotations = { \"topology\" : \"circular\" }) # Evaluate plasmid: design = plasma . Assessment ( sequence , \"BsmBI\" ) design . assess_plasmid ( other_enzymes = [ \"BsaI\" ]) # also check for the enzyme of the 2nd level assembly # Results are stored in: design . results # Save as a PDF report: plasma . write_pdf_report ( \"report.pdf\" , design )","title":"Usage"},{"location":"#versioning","text":"Plasmid assessor uses the semantic versioning scheme.","title":"Versioning"},{"location":"#license-mit","text":"Plasmid assessor is free/libre and open-source software, which means the users have the freedom to run, study, change and distribute the software. Plasmid assessor was written at the Edinburgh Genome Foundry by Peter Vegh . Copyright 2021 Edinburgh Genome Foundry, University of Edinburgh","title":"License = MIT"},{"location":"reference/plasmid_assessor/","text":"Module plasmid_assessor View Source from .Assessment import Assessment from .reports import write_pdf_report Sub-modules plasmid_assessor.Assessment plasmid_assessor.reports plasmid_assessor.version","title":"Index"},{"location":"reference/plasmid_assessor/#module-plasmid_assessor","text":"View Source from .Assessment import Assessment from .reports import write_pdf_report","title":"Module plasmid_assessor"},{"location":"reference/plasmid_assessor/#sub-modules","text":"plasmid_assessor.Assessment plasmid_assessor.reports plasmid_assessor.version","title":"Sub-modules"},{"location":"reference/plasmid_assessor/Assessment/","text":"Module plasmid_assessor.Assessment View Source import re import Bio import Bio.Restriction import dnacauldron as dc class Assessment : \"\"\"The plasmid assessment class. **Parameters** **record** > A Biopython `SeqRecord`. **enzyme** > A restriction enzyme (`str`). A Biopython `RestrictionType` will be looked up using the string. \"\"\" def __init__ ( self , record , enzyme ): self . record = record self . enzyme = Bio . Restriction . __dict__ [ enzyme ] self . results = {} def assess_plasmid ( self , other_enzymes = None ): \"\"\"Evaluate plasmid for Golden Gate. **Parameters** **other_enzymes** > List of enzymes used in higher level assemblies (`list`). \"\"\" self . check_circularity () self . get_number_of_sites () self . evaluate_orientation () self . digest_plasmid () self . count_other_sites ( other_enzymes ) self . sum_results () def check_circularity ( self ): if \"topology\" not in self . record . annotations : self . results [ \"is_circular\" ] = False elif self . record . annotations [ \"topology\" ] == \"circular\" : self . results [ \"is_circular\" ] = True else : self . results [ \"is_circular\" ] = False def get_number_of_sites ( self ): if \"is_circular\" in self . results : is_linear = not self . results [ \"is_circular\" ] else : is_linear = False restriction_batch = Bio . Restriction . RestrictionBatch ([ self . enzyme ]) analysis = Bio . Restriction . Analysis ( restriction_batch , sequence = self . record . seq , linear = is_linear ) analysis_results = analysis . full ( linear = is_linear ) self . results [ \"number_of_sites\" ] = len ( analysis_results [ self . enzyme ]) def evaluate_orientation ( self ): self . results [ \"is_site_orientation_correct\" ] = False # default # Forward strand: iter = ( match for match in re . finditer ( self . enzyme . site , str ( self . record . seq ))) if sum ( 1 for _ in iter ) == 1 : rev_complement = str ( self . record . seq . reverse_complement ()) iter_reverse = ( m for m in re . finditer ( self . enzyme . site , rev_complement )) if sum ( 1 for _ in iter_reverse ) == 1 : # 1 site in both strands: self . results [ \"is_site_orientation_correct\" ] = True def digest_plasmid ( self ): # Obtain fragments and get the backbone's overhangs. # This method has two assumptions: # - the sequence has two, correctly oriented enzyme sites. # - the sequence is circular. # Therefore there will be exactly two fragments, with one containing both sites. self . results [ \"digest\" ] = {} if not self . results [ \"is_circular\" ]: return if not self . results [ \"is_site_orientation_correct\" ]: return record_fragments = dc . StickyEndFragment . list_from_record_digestion ( record = self . record , enzyme = self . enzyme , linear = False ) if self . enzyme . site in record_fragments [ 0 ] . to_standard_string (): backbone_index = 1 # there are only two fragments excise_index = 0 else : backbone_index = 0 excise_index = 1 # reversed self . results [ \"digest\" ][ \"backbone_seq\" ] = record_fragments [ backbone_index ] self . results [ \"digest\" ][ \"excised_seq\" ] = record_fragments [ excise_index ] self . results [ \"digest\" ][ \"first_overhang\" ] = str ( record_fragments [ excise_index ] . seq . left_end ) self . results [ \"digest\" ][ \"last_overhang\" ] = str ( record_fragments [ excise_index ] . seq . right_end ) def count_other_sites ( self , other_enzymes ): self . results [ \"other_sites\" ] = {} if other_enzymes is None : return bio_enzymes = [ Bio . Restriction . __dict__ [ enzyme ] for enzyme in other_enzymes ] restriction_batch = Bio . Restriction . RestrictionBatch ( bio_enzymes ) # Work with the assumption that the sequence is circular: analysis = Bio . Restriction . Analysis ( restriction_batch , sequence = self . record . seq , linear = False ) self . results [ \"other_sites\" ][ \"enzyme\" ] = analysis . full ( linear = False ) self . results [ \"other_sites\" ][ \"has_any_other_sites\" ] = False for enzyme , matches in self . results [ \"other_sites\" ][ \"enzyme\" ] . items (): if len ( matches ) != 0 : self . results [ \"other_sites\" ][ \"has_any_other_sites\" ] = True def sum_results ( self ): self . results [ \"pass\" ] = True if self . results [ \"is_circular\" ] is False : self . results [ \"pass\" ] = False return if self . results [ \"is_site_orientation_correct\" ] is False : # implicitly checks number of sites too self . results [ \"pass\" ] = False return if self . results [ \"other_sites\" ][ \"has_any_other_sites\" ]: self . results [ \"pass\" ] = False return Classes Assessment class Assessment ( record , enzyme ) The plasmid assessment class. Parameters record A Biopython SeqRecord . enzyme A restriction enzyme ( str ). A Biopython RestrictionType will be looked up using the string. View Source class Assessment : \"\"\"The plasmid assessment class. **Parameters** **record** > A Biopython `SeqRecord`. **enzyme** > A restriction enzyme (`str`). A Biopython `RestrictionType` will be looked up using the string. \"\"\" def __init__ ( self , record , enzyme ) : self . record = record self . enzyme = Bio . Restriction . __dict__ [ enzyme ] self . results = {} def assess_plasmid ( self , other_enzymes = None ) : \"\"\"Evaluate plasmid for Golden Gate. **Parameters** **other_enzymes** > List of enzymes used in higher level assemblies (`list`). \"\"\" self . check_circularity () self . get_number_of_sites () self . evaluate_orientation () self . digest_plasmid () self . count_other_sites ( other_enzymes ) self . sum_results () def check_circularity ( self ) : if \"topology\" not in self . record . annotations : self . results [ \"is_circular\" ] = False elif self . record . annotations [ \"topology\" ] == \"circular\" : self . results [ \"is_circular\" ] = True else : self . results [ \"is_circular\" ] = False def get_number_of_sites ( self ) : if \"is_circular\" in self . results : is_linear = not self . results [ \"is_circular\" ] else : is_linear = False restriction_batch = Bio . Restriction . RestrictionBatch ( [ self.enzyme ] ) analysis = Bio . Restriction . Analysis ( restriction_batch , sequence = self . record . seq , linear = is_linear ) analysis_results = analysis . full ( linear = is_linear ) self . results [ \"number_of_sites\" ] = len ( analysis_results [ self.enzyme ] ) def evaluate_orientation ( self ) : self . results [ \"is_site_orientation_correct\" ] = False # default # Forward strand : iter = ( match for match in re . finditer ( self . enzyme . site , str ( self . record . seq ))) if sum ( 1 for _ in iter ) == 1 : rev_complement = str ( self . record . seq . reverse_complement ()) iter_reverse = ( m for m in re . finditer ( self . enzyme . site , rev_complement )) if sum ( 1 for _ in iter_reverse ) == 1 : # 1 site in both strands : self . results [ \"is_site_orientation_correct\" ] = True def digest_plasmid ( self ) : # Obtain fragments and get the backbone ' s overhangs . # This method has two assumptions : # - the sequence has two , correctly oriented enzyme sites . # - the sequence is circular . # Therefore there will be exactly two fragments , with one containing both sites . self . results [ \"digest\" ] = {} if not self . results [ \"is_circular\" ] : return if not self . results [ \"is_site_orientation_correct\" ] : return record_fragments = dc . StickyEndFragment . list_from_record_digestion ( record = self . record , enzyme = self . enzyme , linear = False ) if self . enzyme . site in record_fragments [ 0 ] . to_standard_string () : backbone_index = 1 # there are only two fragments excise_index = 0 else : backbone_index = 0 excise_index = 1 # reversed self . results [ \"digest\" ][ \"backbone_seq\" ] = record_fragments [ backbone_index ] self . results [ \"digest\" ][ \"excised_seq\" ] = record_fragments [ excise_index ] self . results [ \"digest\" ][ \"first_overhang\" ] = str ( record_fragments [ excise_index ] . seq . left_end ) self . results [ \"digest\" ][ \"last_overhang\" ] = str ( record_fragments [ excise_index ] . seq . right_end ) def count_other_sites ( self , other_enzymes ) : self . results [ \"other_sites\" ] = {} if other_enzymes is None : return bio_enzymes = [ Bio.Restriction.__dict__[enzyme ] for enzyme in other_enzymes ] restriction_batch = Bio . Restriction . RestrictionBatch ( bio_enzymes ) # Work with the assumption that the sequence is circular : analysis = Bio . Restriction . Analysis ( restriction_batch , sequence = self . record . seq , linear = False ) self . results [ \"other_sites\" ][ \"enzyme\" ] = analysis . full ( linear = False ) self . results [ \"other_sites\" ][ \"has_any_other_sites\" ] = False for enzyme , matches in self . results [ \"other_sites\" ][ \"enzyme\" ] . items () : if len ( matches ) != 0 : self . results [ \"other_sites\" ][ \"has_any_other_sites\" ] = True def sum_results ( self ) : self . results [ \"pass\" ] = True if self . results [ \"is_circular\" ] is False : self . results [ \"pass\" ] = False return if self . results [ \"is_site_orientation_correct\" ] is False : # implicitly checks number of sites too self . results [ \"pass\" ] = False return if self . results [ \"other_sites\" ][ \"has_any_other_sites\" ] : self . results [ \"pass\" ] = False return Methods assess_plasmid def assess_plasmid ( self , other_enzymes = None ) Evaluate plasmid for Golden Gate. Parameters other_enzymes List of enzymes used in higher level assemblies ( list ). View Source def assess_plasmid ( self , other_enzymes = None ) : \" \"\" Evaluate plasmid for Golden Gate. **Parameters** **other_enzymes** > List of enzymes used in higher level assemblies (`list`). \"\" \" self . check_circularity () self . get_number_of_sites () self . evaluate_orientation () self . digest_plasmid () self . count_other_sites ( other_enzymes ) self . sum_results () check_circularity def check_circularity ( self ) View Source def check_circularity ( self ) : if \" topology \" not in self . record . annotations : self . results [ \" is_circular \" ] = False elif self . record . annotations [ \" topology \" ] == \" circular \" : self . results [ \" is_circular \" ] = True else : self . results [ \" is_circular \" ] = False count_other_sites def count_other_sites ( self , other_enzymes ) View Source def count_other_sites ( self , other_enzymes ) : self . results [ \"other_sites\" ] = {} if other_enzymes is None : return bio_enzymes = [ Bio.Restriction.__dict__[enzyme ] for enzyme in other_enzymes ] restriction_batch = Bio . Restriction . RestrictionBatch ( bio_enzymes ) # Work with the assumption that the sequence is circular : analysis = Bio . Restriction . Analysis ( restriction_batch , sequence = self . record . seq , linear = False ) self . results [ \"other_sites\" ][ \"enzyme\" ] = analysis . full ( linear = False ) self . results [ \"other_sites\" ][ \"has_any_other_sites\" ] = False for enzyme , matches in self . results [ \"other_sites\" ][ \"enzyme\" ] . items () : if len ( matches ) != 0 : self . results [ \"other_sites\" ][ \"has_any_other_sites\" ] = True digest_plasmid def digest_plasmid ( self ) View Source def digest_plasmid ( self ) : # Obtain fragments and get the backbone ' s overhangs . # This method has two assumptions : # - the sequence has two , correctly oriented enzyme sites . # - the sequence is circular . # Therefore there will be exactly two fragments , with one containing both sites . self . results [ \"digest\" ] = {} if not self . results [ \"is_circular\" ] : return if not self . results [ \"is_site_orientation_correct\" ] : return record_fragments = dc . StickyEndFragment . list_from_record_digestion ( record = self . record , enzyme = self . enzyme , linear = False ) if self . enzyme . site in record_fragments [ 0 ] . to_standard_string () : backbone_index = 1 # there are only two fragments excise_index = 0 else : backbone_index = 0 excise_index = 1 # reversed self . results [ \"digest\" ][ \"backbone_seq\" ] = record_fragments [ backbone_index ] self . results [ \"digest\" ][ \"excised_seq\" ] = record_fragments [ excise_index ] self . results [ \"digest\" ][ \"first_overhang\" ] = str ( record_fragments [ excise_index ] . seq . left_end ) self . results [ \"digest\" ][ \"last_overhang\" ] = str ( record_fragments [ excise_index ] . seq . right_end ) evaluate_orientation def evaluate_orientation ( self ) View Source def evaluate_orientation ( self ) : self . results [ \" is_site_orientation_correct \" ] = False # default # Forward strand : iter = ( match for match in re . finditer ( self . enzyme . site , str ( self . record . seq ))) if sum ( 1 for _ in iter ) == 1 : rev_complement = str ( self . record . seq . reverse_complement ()) iter_reverse = ( m for m in re . finditer ( self . enzyme . site , rev_complement )) if sum ( 1 for _ in iter_reverse ) == 1 : # 1 site in both strands : self . results [ \" is_site_orientation_correct \" ] = True get_number_of_sites def get_number_of_sites ( self ) View Source def get_number_of_sites ( self ) : if \" is_circular \" in self . results : is_linear = not self . results [ \" is_circular \" ] else : is_linear = False restriction_batch = Bio . Restriction . RestrictionBatch ( [ self . enzyme ] ) analysis = Bio . Restriction . Analysis ( restriction_batch , sequence = self . record . seq , linear = is_linear ) analysis_results = analysis . full ( linear = is_linear ) self . results [ \" number_of_sites \" ] = len ( analysis_results [ self . enzyme ] ) sum_results def sum_results ( self ) View Source def sum_results ( self ) : self . results [ \" pass \" ] = True if self . results [ \" is_circular \" ] is False : self . results [ \" pass \" ] = False return if self . results [ \" is_site_orientation_correct \" ] is False : # implicitly checks number of sites too self . results [ \" pass \" ] = False return if self . results [ \" other_sites \" ][ \" has_any_other_sites \" ]: self . results [ \" pass \" ] = False return","title":"Assessment"},{"location":"reference/plasmid_assessor/Assessment/#module-plasmid_assessorassessment","text":"View Source import re import Bio import Bio.Restriction import dnacauldron as dc class Assessment : \"\"\"The plasmid assessment class. **Parameters** **record** > A Biopython `SeqRecord`. **enzyme** > A restriction enzyme (`str`). A Biopython `RestrictionType` will be looked up using the string. \"\"\" def __init__ ( self , record , enzyme ): self . record = record self . enzyme = Bio . Restriction . __dict__ [ enzyme ] self . results = {} def assess_plasmid ( self , other_enzymes = None ): \"\"\"Evaluate plasmid for Golden Gate. **Parameters** **other_enzymes** > List of enzymes used in higher level assemblies (`list`). \"\"\" self . check_circularity () self . get_number_of_sites () self . evaluate_orientation () self . digest_plasmid () self . count_other_sites ( other_enzymes ) self . sum_results () def check_circularity ( self ): if \"topology\" not in self . record . annotations : self . results [ \"is_circular\" ] = False elif self . record . annotations [ \"topology\" ] == \"circular\" : self . results [ \"is_circular\" ] = True else : self . results [ \"is_circular\" ] = False def get_number_of_sites ( self ): if \"is_circular\" in self . results : is_linear = not self . results [ \"is_circular\" ] else : is_linear = False restriction_batch = Bio . Restriction . RestrictionBatch ([ self . enzyme ]) analysis = Bio . Restriction . Analysis ( restriction_batch , sequence = self . record . seq , linear = is_linear ) analysis_results = analysis . full ( linear = is_linear ) self . results [ \"number_of_sites\" ] = len ( analysis_results [ self . enzyme ]) def evaluate_orientation ( self ): self . results [ \"is_site_orientation_correct\" ] = False # default # Forward strand: iter = ( match for match in re . finditer ( self . enzyme . site , str ( self . record . seq ))) if sum ( 1 for _ in iter ) == 1 : rev_complement = str ( self . record . seq . reverse_complement ()) iter_reverse = ( m for m in re . finditer ( self . enzyme . site , rev_complement )) if sum ( 1 for _ in iter_reverse ) == 1 : # 1 site in both strands: self . results [ \"is_site_orientation_correct\" ] = True def digest_plasmid ( self ): # Obtain fragments and get the backbone's overhangs. # This method has two assumptions: # - the sequence has two, correctly oriented enzyme sites. # - the sequence is circular. # Therefore there will be exactly two fragments, with one containing both sites. self . results [ \"digest\" ] = {} if not self . results [ \"is_circular\" ]: return if not self . results [ \"is_site_orientation_correct\" ]: return record_fragments = dc . StickyEndFragment . list_from_record_digestion ( record = self . record , enzyme = self . enzyme , linear = False ) if self . enzyme . site in record_fragments [ 0 ] . to_standard_string (): backbone_index = 1 # there are only two fragments excise_index = 0 else : backbone_index = 0 excise_index = 1 # reversed self . results [ \"digest\" ][ \"backbone_seq\" ] = record_fragments [ backbone_index ] self . results [ \"digest\" ][ \"excised_seq\" ] = record_fragments [ excise_index ] self . results [ \"digest\" ][ \"first_overhang\" ] = str ( record_fragments [ excise_index ] . seq . left_end ) self . results [ \"digest\" ][ \"last_overhang\" ] = str ( record_fragments [ excise_index ] . seq . right_end ) def count_other_sites ( self , other_enzymes ): self . results [ \"other_sites\" ] = {} if other_enzymes is None : return bio_enzymes = [ Bio . Restriction . __dict__ [ enzyme ] for enzyme in other_enzymes ] restriction_batch = Bio . Restriction . RestrictionBatch ( bio_enzymes ) # Work with the assumption that the sequence is circular: analysis = Bio . Restriction . Analysis ( restriction_batch , sequence = self . record . seq , linear = False ) self . results [ \"other_sites\" ][ \"enzyme\" ] = analysis . full ( linear = False ) self . results [ \"other_sites\" ][ \"has_any_other_sites\" ] = False for enzyme , matches in self . results [ \"other_sites\" ][ \"enzyme\" ] . items (): if len ( matches ) != 0 : self . results [ \"other_sites\" ][ \"has_any_other_sites\" ] = True def sum_results ( self ): self . results [ \"pass\" ] = True if self . results [ \"is_circular\" ] is False : self . results [ \"pass\" ] = False return if self . results [ \"is_site_orientation_correct\" ] is False : # implicitly checks number of sites too self . results [ \"pass\" ] = False return if self . results [ \"other_sites\" ][ \"has_any_other_sites\" ]: self . results [ \"pass\" ] = False return","title":"Module plasmid_assessor.Assessment"},{"location":"reference/plasmid_assessor/Assessment/#classes","text":"","title":"Classes"},{"location":"reference/plasmid_assessor/Assessment/#assessment","text":"class Assessment ( record , enzyme ) The plasmid assessment class. Parameters record A Biopython SeqRecord . enzyme A restriction enzyme ( str ). A Biopython RestrictionType will be looked up using the string. View Source class Assessment : \"\"\"The plasmid assessment class. **Parameters** **record** > A Biopython `SeqRecord`. **enzyme** > A restriction enzyme (`str`). A Biopython `RestrictionType` will be looked up using the string. \"\"\" def __init__ ( self , record , enzyme ) : self . record = record self . enzyme = Bio . Restriction . __dict__ [ enzyme ] self . results = {} def assess_plasmid ( self , other_enzymes = None ) : \"\"\"Evaluate plasmid for Golden Gate. **Parameters** **other_enzymes** > List of enzymes used in higher level assemblies (`list`). \"\"\" self . check_circularity () self . get_number_of_sites () self . evaluate_orientation () self . digest_plasmid () self . count_other_sites ( other_enzymes ) self . sum_results () def check_circularity ( self ) : if \"topology\" not in self . record . annotations : self . results [ \"is_circular\" ] = False elif self . record . annotations [ \"topology\" ] == \"circular\" : self . results [ \"is_circular\" ] = True else : self . results [ \"is_circular\" ] = False def get_number_of_sites ( self ) : if \"is_circular\" in self . results : is_linear = not self . results [ \"is_circular\" ] else : is_linear = False restriction_batch = Bio . Restriction . RestrictionBatch ( [ self.enzyme ] ) analysis = Bio . Restriction . Analysis ( restriction_batch , sequence = self . record . seq , linear = is_linear ) analysis_results = analysis . full ( linear = is_linear ) self . results [ \"number_of_sites\" ] = len ( analysis_results [ self.enzyme ] ) def evaluate_orientation ( self ) : self . results [ \"is_site_orientation_correct\" ] = False # default # Forward strand : iter = ( match for match in re . finditer ( self . enzyme . site , str ( self . record . seq ))) if sum ( 1 for _ in iter ) == 1 : rev_complement = str ( self . record . seq . reverse_complement ()) iter_reverse = ( m for m in re . finditer ( self . enzyme . site , rev_complement )) if sum ( 1 for _ in iter_reverse ) == 1 : # 1 site in both strands : self . results [ \"is_site_orientation_correct\" ] = True def digest_plasmid ( self ) : # Obtain fragments and get the backbone ' s overhangs . # This method has two assumptions : # - the sequence has two , correctly oriented enzyme sites . # - the sequence is circular . # Therefore there will be exactly two fragments , with one containing both sites . self . results [ \"digest\" ] = {} if not self . results [ \"is_circular\" ] : return if not self . results [ \"is_site_orientation_correct\" ] : return record_fragments = dc . StickyEndFragment . list_from_record_digestion ( record = self . record , enzyme = self . enzyme , linear = False ) if self . enzyme . site in record_fragments [ 0 ] . to_standard_string () : backbone_index = 1 # there are only two fragments excise_index = 0 else : backbone_index = 0 excise_index = 1 # reversed self . results [ \"digest\" ][ \"backbone_seq\" ] = record_fragments [ backbone_index ] self . results [ \"digest\" ][ \"excised_seq\" ] = record_fragments [ excise_index ] self . results [ \"digest\" ][ \"first_overhang\" ] = str ( record_fragments [ excise_index ] . seq . left_end ) self . results [ \"digest\" ][ \"last_overhang\" ] = str ( record_fragments [ excise_index ] . seq . right_end ) def count_other_sites ( self , other_enzymes ) : self . results [ \"other_sites\" ] = {} if other_enzymes is None : return bio_enzymes = [ Bio.Restriction.__dict__[enzyme ] for enzyme in other_enzymes ] restriction_batch = Bio . Restriction . RestrictionBatch ( bio_enzymes ) # Work with the assumption that the sequence is circular : analysis = Bio . Restriction . Analysis ( restriction_batch , sequence = self . record . seq , linear = False ) self . results [ \"other_sites\" ][ \"enzyme\" ] = analysis . full ( linear = False ) self . results [ \"other_sites\" ][ \"has_any_other_sites\" ] = False for enzyme , matches in self . results [ \"other_sites\" ][ \"enzyme\" ] . items () : if len ( matches ) != 0 : self . results [ \"other_sites\" ][ \"has_any_other_sites\" ] = True def sum_results ( self ) : self . results [ \"pass\" ] = True if self . results [ \"is_circular\" ] is False : self . results [ \"pass\" ] = False return if self . results [ \"is_site_orientation_correct\" ] is False : # implicitly checks number of sites too self . results [ \"pass\" ] = False return if self . results [ \"other_sites\" ][ \"has_any_other_sites\" ] : self . results [ \"pass\" ] = False return","title":"Assessment"},{"location":"reference/plasmid_assessor/Assessment/#methods","text":"","title":"Methods"},{"location":"reference/plasmid_assessor/Assessment/#assess_plasmid","text":"def assess_plasmid ( self , other_enzymes = None ) Evaluate plasmid for Golden Gate. Parameters other_enzymes List of enzymes used in higher level assemblies ( list ). View Source def assess_plasmid ( self , other_enzymes = None ) : \" \"\" Evaluate plasmid for Golden Gate. **Parameters** **other_enzymes** > List of enzymes used in higher level assemblies (`list`). \"\" \" self . check_circularity () self . get_number_of_sites () self . evaluate_orientation () self . digest_plasmid () self . count_other_sites ( other_enzymes ) self . sum_results ()","title":"assess_plasmid"},{"location":"reference/plasmid_assessor/Assessment/#check_circularity","text":"def check_circularity ( self ) View Source def check_circularity ( self ) : if \" topology \" not in self . record . annotations : self . results [ \" is_circular \" ] = False elif self . record . annotations [ \" topology \" ] == \" circular \" : self . results [ \" is_circular \" ] = True else : self . results [ \" is_circular \" ] = False","title":"check_circularity"},{"location":"reference/plasmid_assessor/Assessment/#count_other_sites","text":"def count_other_sites ( self , other_enzymes ) View Source def count_other_sites ( self , other_enzymes ) : self . results [ \"other_sites\" ] = {} if other_enzymes is None : return bio_enzymes = [ Bio.Restriction.__dict__[enzyme ] for enzyme in other_enzymes ] restriction_batch = Bio . Restriction . RestrictionBatch ( bio_enzymes ) # Work with the assumption that the sequence is circular : analysis = Bio . Restriction . Analysis ( restriction_batch , sequence = self . record . seq , linear = False ) self . results [ \"other_sites\" ][ \"enzyme\" ] = analysis . full ( linear = False ) self . results [ \"other_sites\" ][ \"has_any_other_sites\" ] = False for enzyme , matches in self . results [ \"other_sites\" ][ \"enzyme\" ] . items () : if len ( matches ) != 0 : self . results [ \"other_sites\" ][ \"has_any_other_sites\" ] = True","title":"count_other_sites"},{"location":"reference/plasmid_assessor/Assessment/#digest_plasmid","text":"def digest_plasmid ( self ) View Source def digest_plasmid ( self ) : # Obtain fragments and get the backbone ' s overhangs . # This method has two assumptions : # - the sequence has two , correctly oriented enzyme sites . # - the sequence is circular . # Therefore there will be exactly two fragments , with one containing both sites . self . results [ \"digest\" ] = {} if not self . results [ \"is_circular\" ] : return if not self . results [ \"is_site_orientation_correct\" ] : return record_fragments = dc . StickyEndFragment . list_from_record_digestion ( record = self . record , enzyme = self . enzyme , linear = False ) if self . enzyme . site in record_fragments [ 0 ] . to_standard_string () : backbone_index = 1 # there are only two fragments excise_index = 0 else : backbone_index = 0 excise_index = 1 # reversed self . results [ \"digest\" ][ \"backbone_seq\" ] = record_fragments [ backbone_index ] self . results [ \"digest\" ][ \"excised_seq\" ] = record_fragments [ excise_index ] self . results [ \"digest\" ][ \"first_overhang\" ] = str ( record_fragments [ excise_index ] . seq . left_end ) self . results [ \"digest\" ][ \"last_overhang\" ] = str ( record_fragments [ excise_index ] . seq . right_end )","title":"digest_plasmid"},{"location":"reference/plasmid_assessor/Assessment/#evaluate_orientation","text":"def evaluate_orientation ( self ) View Source def evaluate_orientation ( self ) : self . results [ \" is_site_orientation_correct \" ] = False # default # Forward strand : iter = ( match for match in re . finditer ( self . enzyme . site , str ( self . record . seq ))) if sum ( 1 for _ in iter ) == 1 : rev_complement = str ( self . record . seq . reverse_complement ()) iter_reverse = ( m for m in re . finditer ( self . enzyme . site , rev_complement )) if sum ( 1 for _ in iter_reverse ) == 1 : # 1 site in both strands : self . results [ \" is_site_orientation_correct \" ] = True","title":"evaluate_orientation"},{"location":"reference/plasmid_assessor/Assessment/#get_number_of_sites","text":"def get_number_of_sites ( self ) View Source def get_number_of_sites ( self ) : if \" is_circular \" in self . results : is_linear = not self . results [ \" is_circular \" ] else : is_linear = False restriction_batch = Bio . Restriction . RestrictionBatch ( [ self . enzyme ] ) analysis = Bio . Restriction . Analysis ( restriction_batch , sequence = self . record . seq , linear = is_linear ) analysis_results = analysis . full ( linear = is_linear ) self . results [ \" number_of_sites \" ] = len ( analysis_results [ self . enzyme ] )","title":"get_number_of_sites"},{"location":"reference/plasmid_assessor/Assessment/#sum_results","text":"def sum_results ( self ) View Source def sum_results ( self ) : self . results [ \" pass \" ] = True if self . results [ \" is_circular \" ] is False : self . results [ \" pass \" ] = False return if self . results [ \" is_site_orientation_correct \" ] is False : # implicitly checks number of sites too self . results [ \" pass \" ] = False return if self . results [ \" other_sites \" ][ \" has_any_other_sites \" ]: self . results [ \" pass \" ] = False return","title":"sum_results"},{"location":"reference/plasmid_assessor/reports/","text":"Module plasmid_assessor.reports View Source from datetime import datetime import os import matplotlib.pyplot as plt import pandas from pdf_reports import ( add_css_class , dataframe_to_html , pug_to_html , style_table_rows , write_report , ) import pdf_reports.tools as pdf_tools from .version import __version__ THIS_PATH = os . path . dirname ( os . path . realpath ( __file__ )) ASSETS_PATH = os . path . join ( THIS_PATH , \"report_assets\" ) REPORT_TEMPLATE = os . path . join ( ASSETS_PATH , \"assessment_report.pug\" ) STYLESHEET = os . path . join ( ASSETS_PATH , \"report_style.css\" ) def end_pug_to_html ( template , ** context ): now = datetime . now () . strftime ( \"%Y-%m- %d \" ) defaults = { \"sidebar_text\" : \"Generated on %s by EGF's Plasmid assessor (version %s )\" % ( now , __version__ ), \"plasma_logo_url\" : os . path . join ( ASSETS_PATH , \"imgs\" , \"logo.png\" ), } for k in defaults : if k not in context : context [ k ] = defaults [ k ] return pug_to_html ( template , ** context ) def write_pdf_report ( target , assessment ): \"\"\"Write an assessment report with a PDF summary. **Parameters** **target** > Path for PDF file. **assessment** > Assessment instance. \"\"\" # assessment.figure_data = pdf_tools.figure_data(assessment.fig, fmt=\"svg\") html = end_pug_to_html ( REPORT_TEMPLATE , assessment = assessment ,) write_report ( html , target , extra_stylesheets = ( STYLESHEET ,)) Variables ASSETS_PATH REPORT_TEMPLATE STYLESHEET THIS_PATH Functions end_pug_to_html def end_pug_to_html ( template , ** context ) View Source def end_pug_to_html ( template , ** context ) : now = datetime . now (). strftime ( \"%Y-%m-%d\" ) defaults = { \"sidebar_text\" : \"Generated on %s by EGF's Plasmid assessor (version %s)\" % ( now , __version__ ), \"plasma_logo_url\" : os . path . join ( ASSETS_PATH , \"imgs\" , \"logo.png\" ), } for k in defaults : if k not in context : context [ k ] = defaults [ k ] return pug_to_html ( template , ** context ) write_pdf_report def write_pdf_report ( target , assessment ) Write an assessment report with a PDF summary. Parameters target Path for PDF file. assessment Assessment instance. View Source def write_pdf_report ( target , assessment ): \"\"\"Write an assessment report with a PDF summary. **Parameters** **target** > Path for PDF file. **assessment** > Assessment instance. \"\"\" # assessment.figure_data = pdf_tools.figure_data(assessment.fig, fmt=\"svg\") html = end_pug_to_html ( REPORT_TEMPLATE , assessment = assessment ,) write_report ( html , target , extra_stylesheets = ( STYLESHEET ,))","title":"Reports"},{"location":"reference/plasmid_assessor/reports/#module-plasmid_assessorreports","text":"View Source from datetime import datetime import os import matplotlib.pyplot as plt import pandas from pdf_reports import ( add_css_class , dataframe_to_html , pug_to_html , style_table_rows , write_report , ) import pdf_reports.tools as pdf_tools from .version import __version__ THIS_PATH = os . path . dirname ( os . path . realpath ( __file__ )) ASSETS_PATH = os . path . join ( THIS_PATH , \"report_assets\" ) REPORT_TEMPLATE = os . path . join ( ASSETS_PATH , \"assessment_report.pug\" ) STYLESHEET = os . path . join ( ASSETS_PATH , \"report_style.css\" ) def end_pug_to_html ( template , ** context ): now = datetime . now () . strftime ( \"%Y-%m- %d \" ) defaults = { \"sidebar_text\" : \"Generated on %s by EGF's Plasmid assessor (version %s )\" % ( now , __version__ ), \"plasma_logo_url\" : os . path . join ( ASSETS_PATH , \"imgs\" , \"logo.png\" ), } for k in defaults : if k not in context : context [ k ] = defaults [ k ] return pug_to_html ( template , ** context ) def write_pdf_report ( target , assessment ): \"\"\"Write an assessment report with a PDF summary. **Parameters** **target** > Path for PDF file. **assessment** > Assessment instance. \"\"\" # assessment.figure_data = pdf_tools.figure_data(assessment.fig, fmt=\"svg\") html = end_pug_to_html ( REPORT_TEMPLATE , assessment = assessment ,) write_report ( html , target , extra_stylesheets = ( STYLESHEET ,))","title":"Module plasmid_assessor.reports"},{"location":"reference/plasmid_assessor/reports/#variables","text":"ASSETS_PATH REPORT_TEMPLATE STYLESHEET THIS_PATH","title":"Variables"},{"location":"reference/plasmid_assessor/reports/#functions","text":"","title":"Functions"},{"location":"reference/plasmid_assessor/reports/#end_pug_to_html","text":"def end_pug_to_html ( template , ** context ) View Source def end_pug_to_html ( template , ** context ) : now = datetime . now (). strftime ( \"%Y-%m-%d\" ) defaults = { \"sidebar_text\" : \"Generated on %s by EGF's Plasmid assessor (version %s)\" % ( now , __version__ ), \"plasma_logo_url\" : os . path . join ( ASSETS_PATH , \"imgs\" , \"logo.png\" ), } for k in defaults : if k not in context : context [ k ] = defaults [ k ] return pug_to_html ( template , ** context )","title":"end_pug_to_html"},{"location":"reference/plasmid_assessor/reports/#write_pdf_report","text":"def write_pdf_report ( target , assessment ) Write an assessment report with a PDF summary. Parameters target Path for PDF file. assessment Assessment instance. View Source def write_pdf_report ( target , assessment ): \"\"\"Write an assessment report with a PDF summary. **Parameters** **target** > Path for PDF file. **assessment** > Assessment instance. \"\"\" # assessment.figure_data = pdf_tools.figure_data(assessment.fig, fmt=\"svg\") html = end_pug_to_html ( REPORT_TEMPLATE , assessment = assessment ,) write_report ( html , target , extra_stylesheets = ( STYLESHEET ,))","title":"write_pdf_report"},{"location":"reference/plasmid_assessor/version/","text":"Module plasmid_assessor.version View Source __version__ = \"0.1.0\"","title":"Version"},{"location":"reference/plasmid_assessor/version/#module-plasmid_assessorversion","text":"View Source __version__ = \"0.1.0\"","title":"Module plasmid_assessor.version"}]} \ No newline at end of file +{"config":{"lang":["en"],"min_search_length":3,"prebuild_index":false,"separator":"[\\s\\-]+"},"docs":[{"location":"","text":"Plasmid assessor Plasmid assessment for Golden Gate cloning. An important task in DNA assembly is creating or adapting a plasmid to serve as a backbone for the assembled parts. This package provides tools for quickly checking a few basic backbone requirements on a plasmid sequence. The most important steps of vector (backbone) adaptation are ensuring that there are: two sites for the chosen restriction enzyme, flanking the insert segment no other sites for the restriction enzyme The choice of the two backbone overhangs are also important, because they will be involved in all assemblies using that plasmid. Additionally, we can add selection for proper assembly (for example, by including a ccdB suicide cassette at the insertion location) and for presence of plasmid in the bacterium (for example, by using antibiotic resistance). Finally, we can check that the replicon and the partitioning system in the plasmid suits the strain, compatibility and other requirements. Install pip install plasmid_assessor # pip install plasmid_assessor [ report ] # install with dependencies for pdf reports Usage import plasmid_assessor as plasma # Load your Genbank or FASTA file as a Biopython SeqRecord, or create a new one: from Bio import SeqIO sequence = SeqIO . read ( \"HC_Amp_ccdB.gb\" , \"genbank\" ) # sequence.annotations[\"topology\"] = \"circular\" # make sure it's circular # sequence.id = \"HC_Amp_ccdB\" # can specify a name for the plasmid # Evaluate plasmid: design = plasma . Assessment ( sequence , \"BsmBI\" ) design . assess_plasmid ( other_enzymes = [ \"BsaI\" ]) # also check for the enzyme(s) of the 2nd (3rd..) level assembly # Results are stored in: design . results # Save as a PDF report: plasma . write_pdf_report ( \"report.pdf\" , design ) Plasmid assessor checks the properties listed in the introduction and if the plamid passes, then it gets a green \u2611 symbol; if there are errors, it's flagged with a red \u2612 symbol. Warning comments are marked with a yellow \u26a0 sign. Versioning Plasmid assessor uses the semantic versioning scheme. License = MIT Plasmid assessor is free/libre and open-source software, which means the users have the freedom to run, study, change and distribute the software. Plasmid assessor was written at the Edinburgh Genome Foundry by Peter Vegh . Copyright 2021 Edinburgh Genome Foundry, University of Edinburgh","title":"Home"},{"location":"#plasmid-assessor","text":"Plasmid assessment for Golden Gate cloning. An important task in DNA assembly is creating or adapting a plasmid to serve as a backbone for the assembled parts. This package provides tools for quickly checking a few basic backbone requirements on a plasmid sequence. The most important steps of vector (backbone) adaptation are ensuring that there are: two sites for the chosen restriction enzyme, flanking the insert segment no other sites for the restriction enzyme The choice of the two backbone overhangs are also important, because they will be involved in all assemblies using that plasmid. Additionally, we can add selection for proper assembly (for example, by including a ccdB suicide cassette at the insertion location) and for presence of plasmid in the bacterium (for example, by using antibiotic resistance). Finally, we can check that the replicon and the partitioning system in the plasmid suits the strain, compatibility and other requirements.","title":"Plasmid assessor"},{"location":"#install","text":"pip install plasmid_assessor # pip install plasmid_assessor [ report ] # install with dependencies for pdf reports","title":"Install"},{"location":"#usage","text":"import plasmid_assessor as plasma # Load your Genbank or FASTA file as a Biopython SeqRecord, or create a new one: from Bio import SeqIO sequence = SeqIO . read ( \"HC_Amp_ccdB.gb\" , \"genbank\" ) # sequence.annotations[\"topology\"] = \"circular\" # make sure it's circular # sequence.id = \"HC_Amp_ccdB\" # can specify a name for the plasmid # Evaluate plasmid: design = plasma . Assessment ( sequence , \"BsmBI\" ) design . assess_plasmid ( other_enzymes = [ \"BsaI\" ]) # also check for the enzyme(s) of the 2nd (3rd..) level assembly # Results are stored in: design . results # Save as a PDF report: plasma . write_pdf_report ( \"report.pdf\" , design ) Plasmid assessor checks the properties listed in the introduction and if the plamid passes, then it gets a green \u2611 symbol; if there are errors, it's flagged with a red \u2612 symbol. Warning comments are marked with a yellow \u26a0 sign.","title":"Usage"},{"location":"#versioning","text":"Plasmid assessor uses the semantic versioning scheme.","title":"Versioning"},{"location":"#license-mit","text":"Plasmid assessor is free/libre and open-source software, which means the users have the freedom to run, study, change and distribute the software. Plasmid assessor was written at the Edinburgh Genome Foundry by Peter Vegh . Copyright 2021 Edinburgh Genome Foundry, University of Edinburgh","title":"License = MIT"},{"location":"reference/plasmid_assessor/","text":"Module plasmid_assessor View Source from .Assessment import Assessment from .reports import write_pdf_report Sub-modules plasmid_assessor.Assessment plasmid_assessor.reports plasmid_assessor.version","title":"Index"},{"location":"reference/plasmid_assessor/#module-plasmid_assessor","text":"View Source from .Assessment import Assessment from .reports import write_pdf_report","title":"Module plasmid_assessor"},{"location":"reference/plasmid_assessor/#sub-modules","text":"plasmid_assessor.Assessment plasmid_assessor.reports plasmid_assessor.version","title":"Sub-modules"},{"location":"reference/plasmid_assessor/Assessment/","text":"Module plasmid_assessor.Assessment View Source import re import matplotlib.pyplot as plt import Bio import Bio.Restriction from Bio.Seq import Seq from Bio.SeqFeature import SeqFeature , FeatureLocation import dnacauldron as dc try : from dna_features_viewer import BiopythonTranslator except ImportError : class AssessmentTranslator : \"\"\"Please install dna_features_viewer to use this class.\"\"\" def __init__ ( self ): raise Exception ( \"Please install dna_features_viewer to use this class.\" ) else : class AssessmentTranslator ( BiopythonTranslator ): \"\"\"Custom translator for highlighting key features.\"\"\" def compute_feature_color ( self , feature ): assessment_ref = \"plasmid_assessment\" if assessment_ref in feature . qualifiers : if feature . qualifiers [ assessment_ref ] == \"enzyme\" : return \"red\" elif feature . qualifiers [ assessment_ref ] == \"excised\" : return \"yellow\" elif feature . qualifiers [ assessment_ref ] == \"backbone\" : return \"tab:cyan\" else : return \"tab:blue\" # default dna_features_viewer color else : return \"tab:blue\" class Assessment : \"\"\"The plasmid assessment class. **Parameters** **record** > A Biopython `SeqRecord`. **enzyme** > A restriction enzyme (`str`). A Biopython `RestrictionType` will be looked up using the string. \"\"\" UNKNOWN_IDS = [ \"None\" , \"\" , \"\" , \".\" , \"EXPORTED\" , \"\" , \"Exported\" , ] def __init__ ( self , record , enzyme ): self . record = record self . enzyme = Bio . Restriction . __dict__ [ enzyme ] self . enzyme_name = str ( self . enzyme ) self . results = {} def assess_plasmid ( self , other_enzymes = None ): \"\"\"Evaluate plasmid for Golden Gate. **Parameters** **other_enzymes** > List of enzymes used in higher level assemblies (`list`). \"\"\" if other_enzymes : self . other_enzymes = \", \" . join ([ str ( enz ) for enz in other_enzymes ]) self . add_name () self . check_circularity () self . get_number_of_sites () self . evaluate_orientation () self . digest_plasmid () self . count_other_sites ( other_enzymes ) self . check_enzyme_site_locations () self . sum_results () self . plot_plasmid () def add_name ( self ): \"\"\"Set a name for the assessment.\"\"\" # To display on the report: if str ( self . record . id ) . strip () in self . UNKNOWN_IDS : self . name = \"Unnamed plasmid\" else : if len ( self . record . id ) > 16 : # Genbank limit, also for width in report self . name = self . record . id [: 16 ] + \"...\" else : self . name = self . record . id def check_circularity ( self ): if \"topology\" not in self . record . annotations : self . results [ \"is_circular\" ] = False elif self . record . annotations [ \"topology\" ] == \"circular\" : self . results [ \"is_circular\" ] = True else : self . results [ \"is_circular\" ] = False def get_number_of_sites ( self ): if \"is_circular\" in self . results : is_linear = not self . results [ \"is_circular\" ] else : is_linear = False restriction_batch = Bio . Restriction . RestrictionBatch ([ self . enzyme ]) analysis = Bio . Restriction . Analysis ( restriction_batch , sequence = self . record . seq , linear = is_linear ) self . analysis_results = analysis . full ( linear = is_linear ) self . results [ \"number_of_sites\" ] = len ( self . analysis_results [ self . enzyme ]) # Add as features for plot in report: for enzyme , sites in self . analysis_results . items (): for site in sites : self . record . features . append ( SeqFeature ( FeatureLocation ( site , site + 1 ), id = str ( enzyme ), type = \"misc_feature\" , qualifiers = { \"label\" : str ( enzyme ), \"plasmid_assessment\" : \"enzyme\" , }, ) ) def evaluate_orientation ( self ): self . results [ \"is_site_orientation_correct\" ] = False # default # Forward strand: self . iter_forward = [ match . end () for match in re . finditer ( self . enzyme . site , str ( self . record . seq )) ] if sum ( 1 for _ in self . iter_forward ) == 1 : self . forward_enzyme = self . iter_forward [ 0 ] # rev_complement_site = str(self.record.seq.reverse_complement()) rev_complement_site = str ( Seq ( self . enzyme . site ) . reverse_complement ()) self . iter_reverse = [ m . start () for m in re . finditer ( rev_complement_site , str ( self . record . seq )) ] if sum ( 1 for _ in self . iter_reverse ) == 1 : # 1 site in both strands: self . results [ \"is_site_orientation_correct\" ] = True self . reverse_enzyme = self . iter_reverse [ 0 ] if self . results [ \"is_site_orientation_correct\" ]: if self . reverse_enzyme < self . forward_enzyme : self . record . features . append ( SeqFeature ( FeatureLocation ( self . reverse_enzyme - 1 , self . forward_enzyme + 1 ), id = str ( self . enzyme ), type = \"misc_feature\" , qualifiers = { \"label\" : \"Excised\" , \"plasmid_assessment\" : \"excised\" , }, ) ) else : # put annotation together from two pieces: self . record . features . append ( SeqFeature ( FeatureLocation ( 0 , self . forward_enzyme + 1 ), id = str ( self . enzyme ), type = \"misc_feature\" , qualifiers = { \"label\" : \"Excised\" , \"plasmid_assessment\" : \"excised\" , }, ) ) self . record . features . append ( SeqFeature ( FeatureLocation ( self . reverse_enzyme - 1 , len ( self . record )), id = str ( self . enzyme ), type = \"misc_feature\" , qualifiers = { \"label\" : \"Excised\" , \"plasmid_assessment\" : \"excised\" , }, ) ) def digest_plasmid ( self ): # Obtain fragments and get the backbone's overhangs. # This method has two assumptions: # - the sequence has two, correctly oriented enzyme sites. # - the sequence is circular. # Therefore there will be exactly two fragments, with one containing both sites. self . results [ \"digest\" ] = {} if not self . results [ \"is_circular\" ]: return if not self . results [ \"is_site_orientation_correct\" ]: return record_fragments = dc . StickyEndFragment . list_from_record_digestion ( record = self . record , enzyme = self . enzyme , linear = False ) if self . enzyme . site in record_fragments [ 0 ] . to_standard_string (): backbone_index = 1 # there are only two fragments excise_index = 0 else : backbone_index = 0 excise_index = 1 # reversed self . results [ \"digest\" ][ \"backbone_seq\" ] = record_fragments [ backbone_index ] self . results [ \"digest\" ][ \"excised_seq\" ] = record_fragments [ excise_index ] self . results [ \"digest\" ][ \"first_overhang\" ] = str ( record_fragments [ excise_index ] . seq . left_end ) self . results [ \"digest\" ][ \"last_overhang\" ] = str ( record_fragments [ excise_index ] . seq . right_end ) def count_other_sites ( self , other_enzymes ): self . results [ \"other_sites\" ] = {} self . results [ \"other_sites\" ][ \"has_any_other_sites\" ] = False if other_enzymes is None : return bio_enzymes = [ Bio . Restriction . __dict__ [ enzyme ] for enzyme in other_enzymes ] restriction_batch = Bio . Restriction . RestrictionBatch ( bio_enzymes ) # Work with the assumption that the sequence is circular: analysis = Bio . Restriction . Analysis ( restriction_batch , sequence = self . record . seq , linear = False ) self . results [ \"other_sites\" ][ \"enzyme\" ] = analysis . full ( linear = False ) for enzyme , matches in self . results [ \"other_sites\" ][ \"enzyme\" ] . items (): if len ( matches ) != 0 : self . results [ \"other_sites\" ][ \"has_any_other_sites\" ] = True # Also add as features for plot in report: for site in matches : self . record . features . append ( SeqFeature ( FeatureLocation ( site , site + 1 ), id = str ( enzyme ), type = \"misc_feature\" , qualifiers = { \"label\" : str ( enzyme ), \"plasmid_assessment\" : \"enzyme\" , }, ) ) def check_enzyme_site_locations ( self ): \"\"\"Flag enzyme sites that are within the retained backbone.\"\"\" try : self . results [ \"other_sites\" ][ \"has_any_other_sites\" ] self . results [ \"is_site_orientation_correct\" ] except KeyError : print ( \"Run assessment methods first!\" ) else : self . sites_outside_excised_region = {} if ( self . results [ \"other_sites\" ][ \"has_any_other_sites\" ] and self . results [ \"is_site_orientation_correct\" ] ): # if there are no other sites, no need to run: if self . reverse_enzyme < self . forward_enzyme : # orientation = reverse -> forward for enzyme , sites in self . results [ \"other_sites\" ][ \"enzyme\" ] . items (): problem_sites = [] for site in sites : if self . reverse_enzyme < site < self . forward_enzyme : pass else : problem_sites += [ str ( site )] if problem_sites != []: self . sites_outside_excised_region [ str ( enzyme ) ] = problem_sites txt = \"\" # for the pdf report for ( enzyme , problem_sites , ) in self . sites_outside_excised_region . items (): txt += enzyme + \": \" + \" \" . join ( problem_sites ) + \";\" self . sites_outside_excised_region_txt = txt else : # orientation = forward -> reverse for enzyme , sites in self . results [ \"other_sites\" ][ \"enzyme\" ] . items (): problem_sites = [] for site in sites : if self . forward_enzyme < site < self . reverse_enzyme : # in this case the site is within the retained backbone problem_sites += [ str ( site )] if problem_sites != []: self . sites_outside_excised_region [ str ( enzyme ) ] = problem_sites txt = \"\" # for the pdf report for ( enzyme , problem_sites , ) in self . sites_outside_excised_region . items (): txt += enzyme + \": \" + \" \" . join ( problem_sites ) + \";\" self . sites_outside_excised_region_txt = txt else : # no other sites or orientation not correct self . sites_outside_excised_region_txt = \"\" def sum_results ( self ): self . results [ \"pass\" ] = True if self . results [ \"is_circular\" ] is False : self . results [ \"pass\" ] = False return if self . results [ \"is_site_orientation_correct\" ] is False : # implicitly checks number of sites too self . results [ \"pass\" ] = False return if self . sites_outside_excised_region_txt : self . results [ \"pass\" ] = False return # if self.results[\"other_sites\"][\"has_any_other_sites\"]: # self.results[\"pass\"] = False # return def plot_plasmid ( self ): \"\"\"Plot an outline of the plasmid.\"\"\" fig , ax = plt . subplots ( figsize = ( 7 , 4 )) graphic_record = AssessmentTranslator () . translate_record ( self . record ) graphic_record . plot ( ax = ax , with_ruler = False , strand_in_label_threshold = 2 ) self . fig = fig Classes Assessment class Assessment ( record , enzyme ) The plasmid assessment class. Parameters record A Biopython SeqRecord . enzyme A restriction enzyme ( str ). A Biopython RestrictionType will be looked up using the string. View Source class Assessment : \"\"\"The plasmid assessment class. **Parameters** **record** > A Biopython `SeqRecord`. **enzyme** > A restriction enzyme (`str`). A Biopython `RestrictionType` will be looked up using the string. \"\"\" UNKNOWN_IDS = [ \"None\", \"\", \"\", \".\", \"EXPORTED\", \"\", \"Exported\", ] def __init__ ( self , record , enzyme ) : self . record = record self . enzyme = Bio . Restriction . __dict__ [ enzyme ] self . enzyme_name = str ( self . enzyme ) self . results = {} def assess_plasmid ( self , other_enzymes = None ) : \"\"\"Evaluate plasmid for Golden Gate. **Parameters** **other_enzymes** > List of enzymes used in higher level assemblies (`list`). \"\"\" if other_enzymes : self . other_enzymes = \", \" . join ( [ str(enz) for enz in other_enzymes ] ) self . add_name () self . check_circularity () self . get_number_of_sites () self . evaluate_orientation () self . digest_plasmid () self . count_other_sites ( other_enzymes ) self . check_enzyme_site_locations () self . sum_results () self . plot_plasmid () def add_name ( self ) : \"\"\"Set a name for the assessment.\"\"\" # To display on the report : if str ( self . record . id ). strip () in self . UNKNOWN_IDS : self . name = \"Unnamed plasmid\" else : if len ( self . record . id ) > 16 : # Genbank limit , also for width in report self . name = self . record . id [ :16 ] + \"...\" else : self . name = self . record . id def check_circularity ( self ) : if \"topology\" not in self . record . annotations : self . results [ \"is_circular\" ] = False elif self . record . annotations [ \"topology\" ] == \"circular\" : self . results [ \"is_circular\" ] = True else : self . results [ \"is_circular\" ] = False def get_number_of_sites ( self ) : if \"is_circular\" in self . results : is_linear = not self . results [ \"is_circular\" ] else : is_linear = False restriction_batch = Bio . Restriction . RestrictionBatch ( [ self.enzyme ] ) analysis = Bio . Restriction . Analysis ( restriction_batch , sequence = self . record . seq , linear = is_linear ) self . analysis_results = analysis . full ( linear = is_linear ) self . results [ \"number_of_sites\" ] = len ( self . analysis_results [ self.enzyme ] ) # Add as features for plot in report : for enzyme , sites in self . analysis_results . items () : for site in sites : self . record . features . append ( SeqFeature ( FeatureLocation ( site , site + 1 ), id = str ( enzyme ), type = \"misc_feature\" , qualifiers = { \"label\" : str ( enzyme ), \"plasmid_assessment\" : \"enzyme\" , } , ) ) def evaluate_orientation ( self ) : self . results [ \"is_site_orientation_correct\" ] = False # default # Forward strand : self . iter_forward = [ match.end() for match in re.finditer(self.enzyme.site, str(self.record.seq)) ] if sum ( 1 for _ in self . iter_forward ) == 1 : self . forward_enzyme = self . iter_forward [ 0 ] # rev_complement_site = str ( self . record . seq . reverse_complement ()) rev_complement_site = str ( Seq ( self . enzyme . site ). reverse_complement ()) self . iter_reverse = [ m.start() for m in re.finditer(rev_complement_site, str(self.record.seq)) ] if sum ( 1 for _ in self . iter_reverse ) == 1 : # 1 site in both strands : self . results [ \"is_site_orientation_correct\" ] = True self . reverse_enzyme = self . iter_reverse [ 0 ] if self . results [ \"is_site_orientation_correct\" ] : if self . reverse_enzyme < self . forward_enzyme : self . record . features . append ( SeqFeature ( FeatureLocation ( self . reverse_enzyme - 1 , self . forward_enzyme + 1 ), id = str ( self . enzyme ), type = \"misc_feature\" , qualifiers = { \"label\" : \"Excised\" , \"plasmid_assessment\" : \"excised\" , } , ) ) else : # put annotation together from two pieces : self . record . features . append ( SeqFeature ( FeatureLocation ( 0 , self . forward_enzyme + 1 ), id = str ( self . enzyme ), type = \"misc_feature\" , qualifiers = { \"label\" : \"Excised\" , \"plasmid_assessment\" : \"excised\" , } , ) ) self . record . features . append ( SeqFeature ( FeatureLocation ( self . reverse_enzyme - 1 , len ( self . record )), id = str ( self . enzyme ), type = \"misc_feature\" , qualifiers = { \"label\" : \"Excised\" , \"plasmid_assessment\" : \"excised\" , } , ) ) def digest_plasmid ( self ) : # Obtain fragments and get the backbone ' s overhangs . # This method has two assumptions : # - the sequence has two , correctly oriented enzyme sites . # - the sequence is circular . # Therefore there will be exactly two fragments , with one containing both sites . self . results [ \"digest\" ] = {} if not self . results [ \"is_circular\" ] : return if not self . results [ \"is_site_orientation_correct\" ] : return record_fragments = dc . StickyEndFragment . list_from_record_digestion ( record = self . record , enzyme = self . enzyme , linear = False ) if self . enzyme . site in record_fragments [ 0 ] . to_standard_string () : backbone_index = 1 # there are only two fragments excise_index = 0 else : backbone_index = 0 excise_index = 1 # reversed self . results [ \"digest\" ][ \"backbone_seq\" ] = record_fragments [ backbone_index ] self . results [ \"digest\" ][ \"excised_seq\" ] = record_fragments [ excise_index ] self . results [ \"digest\" ][ \"first_overhang\" ] = str ( record_fragments [ excise_index ] . seq . left_end ) self . results [ \"digest\" ][ \"last_overhang\" ] = str ( record_fragments [ excise_index ] . seq . right_end ) def count_other_sites ( self , other_enzymes ) : self . results [ \"other_sites\" ] = {} self . results [ \"other_sites\" ][ \"has_any_other_sites\" ] = False if other_enzymes is None : return bio_enzymes = [ Bio.Restriction.__dict__[enzyme ] for enzyme in other_enzymes ] restriction_batch = Bio . Restriction . RestrictionBatch ( bio_enzymes ) # Work with the assumption that the sequence is circular : analysis = Bio . Restriction . Analysis ( restriction_batch , sequence = self . record . seq , linear = False ) self . results [ \"other_sites\" ][ \"enzyme\" ] = analysis . full ( linear = False ) for enzyme , matches in self . results [ \"other_sites\" ][ \"enzyme\" ] . items () : if len ( matches ) != 0 : self . results [ \"other_sites\" ][ \"has_any_other_sites\" ] = True # Also add as features for plot in report : for site in matches : self . record . features . append ( SeqFeature ( FeatureLocation ( site , site + 1 ), id = str ( enzyme ), type = \"misc_feature\" , qualifiers = { \"label\" : str ( enzyme ), \"plasmid_assessment\" : \"enzyme\" , } , ) ) def check_enzyme_site_locations ( self ) : \"\"\"Flag enzyme sites that are within the retained backbone.\"\"\" try : self . results [ \"other_sites\" ][ \"has_any_other_sites\" ] self . results [ \"is_site_orientation_correct\" ] except KeyError : print ( \"Run assessment methods first!\" ) else : self . sites_outside_excised_region = {} if ( self . results [ \"other_sites\" ][ \"has_any_other_sites\" ] and self . results [ \"is_site_orientation_correct\" ] ) : # if there are no other sites , no need to run : if self . reverse_enzyme < self . forward_enzyme : # orientation = reverse -> forward for enzyme , sites in self . results [ \"other_sites\" ][ \"enzyme\" ] . items () : problem_sites = [] for site in sites : if self . reverse_enzyme < site < self . forward_enzyme : pass else : problem_sites += [ str(site) ] if problem_sites != []: self . sites_outside_excised_region [ str(enzyme) ] = problem_sites txt = \"\" # for the pdf report for ( enzyme , problem_sites , ) in self . sites_outside_excised_region . items () : txt += enzyme + \": \" + \" \" . join ( problem_sites ) + \";\" self . sites_outside_excised_region_txt = txt else : # orientation = forward -> reverse for enzyme , sites in self . results [ \"other_sites\" ][ \"enzyme\" ] . items () : problem_sites = [] for site in sites : if self . forward_enzyme < site < self . reverse_enzyme : # in this case the site is within the retained backbone problem_sites += [ str(site) ] if problem_sites != []: self . sites_outside_excised_region [ str(enzyme) ] = problem_sites txt = \"\" # for the pdf report for ( enzyme , problem_sites , ) in self . sites_outside_excised_region . items () : txt += enzyme + \": \" + \" \" . join ( problem_sites ) + \";\" self . sites_outside_excised_region_txt = txt else : # no other sites or orientation not correct self . sites_outside_excised_region_txt = \"\" def sum_results ( self ) : self . results [ \"pass\" ] = True if self . results [ \"is_circular\" ] is False : self . results [ \"pass\" ] = False return if self . results [ \"is_site_orientation_correct\" ] is False : # implicitly checks number of sites too self . results [ \"pass\" ] = False return if self . sites_outside_excised_region_txt : self . results [ \"pass\" ] = False return # if self . results [ \"other_sites\" ][ \"has_any_other_sites\" ] : # self . results [ \"pass\" ] = False # return def plot_plasmid ( self ) : \"\"\"Plot an outline of the plasmid.\"\"\" fig , ax = plt . subplots ( figsize = ( 7 , 4 )) graphic_record = AssessmentTranslator (). translate_record ( self . record ) graphic_record . plot ( ax = ax , with_ruler = False , strand_in_label_threshold = 2 ) self . fig = fig Class variables UNKNOWN_IDS Methods add_name def add_name ( self ) Set a name for the assessment. View Source def add_name ( self ) : \"\"\" Set a name for the assessment. \"\"\" # To display on the report : if str ( self . record . id ) . strip () in self . UNKNOWN_IDS : self . name = \" Unnamed plasmid \" else : if len ( self . record . id ) > 16 : # Genbank limit , also for width in report self . name = self . record . id [: 16 ] + \" ... \" else : self . name = self . record . id assess_plasmid def assess_plasmid ( self , other_enzymes = None ) Evaluate plasmid for Golden Gate. Parameters other_enzymes List of enzymes used in higher level assemblies ( list ). View Source def assess_plasmid ( self , other_enzymes = None ) : \" \"\" Evaluate plasmid for Golden Gate. **Parameters** **other_enzymes** > List of enzymes used in higher level assemblies (`list`). \"\" \" if other_enzymes : self . other_enzymes = \", \" . join ( [ str ( enz ) for enz in other_enzymes ] ) self . add_name () self . check_circularity () self . get_number_of_sites () self . evaluate_orientation () self . digest_plasmid () self . count_other_sites ( other_enzymes ) self . check_enzyme_site_locations () self . sum_results () self . plot_plasmid () check_circularity def check_circularity ( self ) View Source def check_circularity ( self ) : if \" topology \" not in self . record . annotations : self . results [ \" is_circular \" ] = False elif self . record . annotations [ \" topology \" ] == \" circular \" : self . results [ \" is_circular \" ] = True else : self . results [ \" is_circular \" ] = False check_enzyme_site_locations def check_enzyme_site_locations ( self ) Flag enzyme sites that are within the retained backbone. View Source def check_enzyme_site_locations ( self ) : \"\"\"Flag enzyme sites that are within the retained backbone.\"\"\" try: self . results [ \"other_sites\" ][ \"has_any_other_sites\" ] self . results [ \"is_site_orientation_correct\" ] except KeyError: print ( \"Run assessment methods first!\" ) else : self . sites_outside_excised_region = {} if ( self . results [ \"other_sites\" ][ \"has_any_other_sites\" ] and self . results [ \"is_site_orientation_correct\" ] ) : # if there are no other sites , no need to run: if self . reverse_enzyme < self . forward_enzyme: # orientation = reverse -> forward for enzyme , sites in self . results [ \"other_sites\" ][ \"enzyme\" ]. items () : problem_sites = [] for site in sites: if self . reverse_enzyme < site < self . forward_enzyme: pass else : problem_sites += [ str ( site )] if problem_sites != [] : self . sites_outside_excised_region [ str ( enzyme ) ] = problem_sites txt = \"\" # for the pdf report for ( enzyme , problem_sites , ) in self . sites_outside_excised_region . items () : txt += enzyme + \": \" + \" \" . join ( problem_sites ) + \";\" self . sites_outside_excised_region_txt = txt else : # orientation = forward -> reverse for enzyme , sites in self . results [ \"other_sites\" ][ \"enzyme\" ]. items () : problem_sites = [] for site in sites: if self . forward_enzyme < site < self . reverse_enzyme: # in this case the site is within the retained backbone problem_sites += [ str ( site )] if problem_sites != [] : self . sites_outside_excised_region [ str ( enzyme ) ] = problem_sites txt = \"\" # for the pdf report for ( enzyme , problem_sites , ) in self . sites_outside_excised_region . items () : txt += enzyme + \": \" + \" \" . join ( problem_sites ) + \";\" self . sites_outside_excised_region_txt = txt else : # no other sites or orientation not correct self . sites_outside_excised_region_txt = \"\" count_other_sites def count_other_sites ( self , other_enzymes ) View Source def count_other_sites ( self , other_enzymes ) : self . results [ \"other_sites\" ] = {} self . results [ \"other_sites\" ][ \"has_any_other_sites\" ] = False if other_enzymes is None : return bio_enzymes = [ Bio.Restriction.__dict__[enzyme ] for enzyme in other_enzymes ] restriction_batch = Bio . Restriction . RestrictionBatch ( bio_enzymes ) # Work with the assumption that the sequence is circular : analysis = Bio . Restriction . Analysis ( restriction_batch , sequence = self . record . seq , linear = False ) self . results [ \"other_sites\" ][ \"enzyme\" ] = analysis . full ( linear = False ) for enzyme , matches in self . results [ \"other_sites\" ][ \"enzyme\" ] . items () : if len ( matches ) != 0 : self . results [ \"other_sites\" ][ \"has_any_other_sites\" ] = True # Also add as features for plot in report : for site in matches : self . record . features . append ( SeqFeature ( FeatureLocation ( site , site + 1 ), id = str ( enzyme ), type = \"misc_feature\" , qualifiers = { \"label\" : str ( enzyme ), \"plasmid_assessment\" : \"enzyme\" , } , ) ) digest_plasmid def digest_plasmid ( self ) View Source def digest_plasmid ( self ) : # Obtain fragments and get the backbone ' s overhangs . # This method has two assumptions : # - the sequence has two , correctly oriented enzyme sites . # - the sequence is circular . # Therefore there will be exactly two fragments , with one containing both sites . self . results [ \"digest\" ] = {} if not self . results [ \"is_circular\" ] : return if not self . results [ \"is_site_orientation_correct\" ] : return record_fragments = dc . StickyEndFragment . list_from_record_digestion ( record = self . record , enzyme = self . enzyme , linear = False ) if self . enzyme . site in record_fragments [ 0 ] . to_standard_string () : backbone_index = 1 # there are only two fragments excise_index = 0 else : backbone_index = 0 excise_index = 1 # reversed self . results [ \"digest\" ][ \"backbone_seq\" ] = record_fragments [ backbone_index ] self . results [ \"digest\" ][ \"excised_seq\" ] = record_fragments [ excise_index ] self . results [ \"digest\" ][ \"first_overhang\" ] = str ( record_fragments [ excise_index ] . seq . left_end ) self . results [ \"digest\" ][ \"last_overhang\" ] = str ( record_fragments [ excise_index ] . seq . right_end ) evaluate_orientation def evaluate_orientation ( self ) View Source def evaluate_orientation ( self ) : self . results [ \" is_site_orientation_correct \" ] = False # default # Forward strand : self . iter_forward = [ match . end () for match in re . finditer ( self . enzyme . site , str ( self . record . seq )) ] if sum ( 1 for _ in self . iter_forward ) == 1 : self . forward_enzyme = self . iter_forward [ 0 ] # rev_complement_site = str ( self . record . seq . reverse_complement ()) rev_complement_site = str ( Seq ( self . enzyme . site ) . reverse_complement ()) self . iter_reverse = [ m . start () for m in re . finditer ( rev_complement_site , str ( self . record . seq )) ] if sum ( 1 for _ in self . iter_reverse ) == 1 : # 1 site in both strands : self . results [ \" is_site_orientation_correct \" ] = True self . reverse_enzyme = self . iter_reverse [ 0 ] if self . results [ \" is_site_orientation_correct \" ]: if self . reverse_enzyme < self . forward_enzyme : self . record . features . append ( SeqFeature ( FeatureLocation ( self . reverse_enzyme - 1 , self . forward_enzyme + 1 ) , id = str ( self . enzyme ) , type = \" misc_feature \" , qualifiers = { \" label \" : \" Excised \" , \" plasmid_assessment \" : \" excised \" , }, ) ) else : # put annotation together from two pieces : self . record . features . append ( SeqFeature ( FeatureLocation ( 0 , self . forward_enzyme + 1 ) , id = str ( self . enzyme ) , type = \" misc_feature \" , qualifiers = { \" label \" : \" Excised \" , \" plasmid_assessment \" : \" excised \" , }, ) ) self . record . features . append ( SeqFeature ( FeatureLocation ( self . reverse_enzyme - 1 , len ( self . record )) , id = str ( self . enzyme ) , type = \" misc_feature \" , qualifiers = { \" label \" : \" Excised \" , \" plasmid_assessment \" : \" excised \" , }, ) ) get_number_of_sites def get_number_of_sites ( self ) View Source def get_number_of_sites ( self ) : if \" is_circular \" in self . results : is_linear = not self . results [ \" is_circular \" ] else : is_linear = False restriction_batch = Bio . Restriction . RestrictionBatch ( [ self . enzyme ] ) analysis = Bio . Restriction . Analysis ( restriction_batch , sequence = self . record . seq , linear = is_linear ) self . analysis_results = analysis . full ( linear = is_linear ) self . results [ \" number_of_sites \" ] = len ( self . analysis_results [ self . enzyme ] ) # Add as features for plot in report : for enzyme , sites in self . analysis_results . items () : for site in sites : self . record . features . append ( SeqFeature ( FeatureLocation ( site , site + 1 ) , id = str ( enzyme ) , type = \" misc_feature \" , qualifiers = { \" label \" : str ( enzyme ) , \" plasmid_assessment \" : \" enzyme \" , }, ) ) plot_plasmid def plot_plasmid ( self ) Plot an outline of the plasmid. View Source def plot_plasmid(self): \"\"\"Plot an outline of the plasmid.\"\"\" fig, ax = plt.subplots(figsize=(7, 4)) graphic_record = AssessmentTranslator().translate_record(self.record) graphic_record.plot(ax=ax, with_ruler=False, strand_in_label_threshold=2) self.fig = fig sum_results def sum_results ( self ) View Source def sum_results ( self ) : self . results [ \"pass\" ] = True if self . results [ \"is_circular\" ] is False: self . results [ \"pass\" ] = False return if self . results [ \"is_site_orientation_correct\" ] is False: # implicitly checks number of sites too self . results [ \"pass\" ] = False return if self . sites_outside_excised_region_txt: self . results [ \"pass\" ] = False return AssessmentTranslator class AssessmentTranslator ( features_filters = (), features_properties = None ) Custom translator for highlighting key features. View Source class AssessmentTranslator: \"\"\"Please install dna_features_viewer to use this class.\"\"\" def __init__ ( self ): raise Exception ( \"Please install dna_features_viewer to use this class.\" ) Ancestors (in MRO) dna_features_viewer.BiopythonTranslator.BiopythonTranslator.BiopythonTranslator dna_features_viewer.BiopythonTranslator.BiopythonTranslatorBase.BiopythonTranslatorBase Class variables default_feature_color graphic_record_parameters ignored_features_types label_fields Static methods quick_class_plot def quick_class_plot ( record , figure_width = 12 , ** kwargs ) Allows super quick and dirty plotting of Biopython records. This is really meant for use in a Jupyter/Ipython notebook with the \"%matplotlib inline\" setting. from dna_features_viewer import BiopythonTranslator BiopythonTranslator.quick_plot(my_record) View Source @classmethod def quick_class_plot ( cls , record , figure_width = 12 , ** kwargs ): \"\"\"Allows super quick and dirty plotting of Biopython records. This is really meant for use in a Jupyter/Ipython notebook with the \"%matplotlib inline\" setting. >>> from dna_features_viewer import BiopythonTranslator >>> BiopythonTranslator.quick_plot(my_record) \"\"\" graphic_record = cls () . translate_record ( record ) ax , _ = graphic_record . plot ( figure_width = figure_width , ** kwargs ) return ax Methods compute_feature_box_color def compute_feature_box_color ( self , feature ) Compute a box_color for this feature. View Source def compute_feature_box_color ( self , feature ) : \"\"\" Compute a box_color for this feature. \"\"\" return \" auto \" compute_feature_box_linewidth def compute_feature_box_linewidth ( self , feature ) Compute a box_linewidth for this feature. View Source def compute_feature_box_linewidth ( self , feature ) : \"\"\" Compute a box_linewidth for this feature. \"\"\" return 0 . 3 compute_feature_color def compute_feature_color ( self , feature ) Compute a color for this feature. If the feature has a color qualifier it will be used. Otherwise, the classe's default_feature_color is used. To change the behaviour, create a subclass of BiopythonTranslator and overwrite this method. View Source def compute_feature_color ( self , feature ) : assessment_ref = \"plasmid_assessment\" if assessment_ref in feature . qualifiers : if feature . qualifiers [ assessment_ref ] == \"enzyme\" : return \"red\" elif feature . qualifiers [ assessment_ref ] == \"excised\" : return \"yellow\" elif feature . qualifiers [ assessment_ref ] == \"backbone\" : return \"tab:cyan\" else : return \"tab:blue\" # default dna_features_viewer color else : return \"tab:blue\" compute_feature_fontdict def compute_feature_fontdict ( self , feature ) Compute a font dict for this feature. View Source def compute_feature_fontdict ( self , feature ) : \"\"\" Compute a font dict for this feature. \"\"\" return None compute_feature_html def compute_feature_html ( self , feature ) Gets the 'label' of the feature. View Source def compute_feature_html ( self , feature ) : \"\"\" Gets the 'label' of the feature. \"\"\" return self . compute_feature_label ( feature ) compute_feature_label def compute_feature_label ( self , feature ) Compute the label of the feature. View Source def compute_feature_label ( self , feature ) : \"\"\"Compute the label of the feature.\"\"\" label = feature . type for key in self . label_fields : if key in feature . qualifiers and len ( feature . qualifiers [ key ] ) : label = feature . qualifiers [ key ] break if isinstance ( label , list ) : label = \"|\" . join ( label ) return label compute_feature_label_link_color def compute_feature_label_link_color ( self , feature ) Compute the color of the line linking the label to its feature. View Source def compute_feature_label_link_color ( self , feature ) : \"\"\" Compute the color of the line linking the label to its feature. \"\"\" return \" black \" compute_feature_legend_text def compute_feature_legend_text ( self , feature ) View Source def compute_feature_legend_text ( self , feature ) : return None compute_feature_linewidth def compute_feature_linewidth ( self , feature ) Compute the edge width of the feature's arrow/rectangle. View Source def compute_feature_linewidth ( self , feature ) : \"\"\" Compute the edge width of the feature's arrow/rectangle. \"\"\" return 1 . 0 compute_filtered_features def compute_filtered_features ( self , features ) Return the list of features minus the ignored ones. By the method keeps any feature whose type is not in ignored_features_types and for which all filter(f) pass. View Source def compute_filtered_features ( self , features ) : \"\"\" Return the list of features minus the ignored ones. By the method keeps any feature whose type is not in ignored_features_types and for which all filter ( f ) pass . \"\"\" return [ f for f in features if all ( [ fl ( f ) for fl in self . features_filters ] ) and f . type not in self . ignored_features_types ] quick_plot def quick_plot ( self , record , figure_width = 12 , ** kwargs ) Allows super quick and dirty plotting of Biopython records. This is really meant for use in a Jupyter/Ipython notebook with the \"%matplotlib inline\" setting. from dna_features_viewer import BiopythonTranslator BiopythonTranslator.quick_plot(my_record) View Source def quick_plot ( self , record , figure_width = 12 , ** kwargs ): \"\"\"Allows super quick and dirty plotting of Biopython records. This is really meant for use in a Jupyter/Ipython notebook with the \"%matplotlib inline\" setting. >>> from dna_features_viewer import BiopythonTranslator >>> BiopythonTranslator.quick_plot(my_record) \"\"\" graphic_record = self . translate_record ( record ) ax , _ = graphic_record . plot ( figure_width = figure_width , ** kwargs ) return ax translate_feature def translate_feature ( self , feature ) Translate a Biopython feature into a Dna Features Viewer feature. View Source def translate_feature ( self , feature ) : \"\"\" Translate a Biopython feature into a Dna Features Viewer feature. \"\"\" properties = dict ( label = self . compute_feature_label ( feature ) , color = self . compute_feature_color ( feature ) , html = self . compute_feature_html ( feature ) , fontdict = self . compute_feature_fontdict ( feature ) , box_linewidth = self . compute_feature_box_linewidth ( feature ) , box_color = self . compute_feature_box_color ( feature ) , linewidth = self . compute_feature_linewidth ( feature ) , label_link_color = self . compute_feature_label_link_color ( feature ) , legend_text = self . compute_feature_legend_text ( feature ) , ) if self . features_properties is not None : other_properties = self . features_properties if hasattr ( other_properties , \" __call__ \" ) : other_properties = other_properties ( feature ) properties . update ( other_properties ) return GraphicFeature ( start = feature . location . start , end = feature . location . end , strand = feature . location . strand , ** properties ) translate_record def translate_record ( self , record , record_class = None , filetype = None ) Create a new GraphicRecord from a BioPython Record object. Parameters record A BioPython Record object or the path to a Genbank or a GFF file. record_class The graphic record class to use, e.g. GraphicRecord (default) or CircularGraphicRecord. Strings 'circular' and 'linear' can also be provided. filetype Used only when a Genbank or a GFF file is provided; one of \"genbank\" or \"gff\" to be used. Default None infers from file extension. View Source def translate_record ( self , record , record_class = None , filetype = None ) : \"\"\"Create a new GraphicRecord from a BioPython Record object. Parameters ---------- record A BioPython Record object or the path to a Genbank or a GFF file. record_class The graphic record class to use, e.g. GraphicRecord (default) or CircularGraphicRecord. Strings 'circular' and 'linear' can also be provided. filetype Used only when a Genbank or a GFF file is provided; one of \" genbank \" or \" gff \" to be used. Default None infers from file extension. \"\"\" classes = { \"linear\" : GraphicRecord , \"circular\" : CircularGraphicRecord , None : GraphicRecord , } if record_class in classes : record_class = classes [ record_class ] if isinstance ( record , str ) or hasattr ( record , \"read\" ) : record = load_record ( record , filetype = filetype ) filtered_features = self . compute_filtered_features ( record . features ) return record_class ( sequence_length = len ( record ), sequence = str ( record . seq ), features =[ self.translate_feature(feature) for feature in filtered_features if feature.location is not None ] , ** self . graphic_record_parameters )","title":"Assessment"},{"location":"reference/plasmid_assessor/Assessment/#module-plasmid_assessorassessment","text":"View Source import re import matplotlib.pyplot as plt import Bio import Bio.Restriction from Bio.Seq import Seq from Bio.SeqFeature import SeqFeature , FeatureLocation import dnacauldron as dc try : from dna_features_viewer import BiopythonTranslator except ImportError : class AssessmentTranslator : \"\"\"Please install dna_features_viewer to use this class.\"\"\" def __init__ ( self ): raise Exception ( \"Please install dna_features_viewer to use this class.\" ) else : class AssessmentTranslator ( BiopythonTranslator ): \"\"\"Custom translator for highlighting key features.\"\"\" def compute_feature_color ( self , feature ): assessment_ref = \"plasmid_assessment\" if assessment_ref in feature . qualifiers : if feature . qualifiers [ assessment_ref ] == \"enzyme\" : return \"red\" elif feature . qualifiers [ assessment_ref ] == \"excised\" : return \"yellow\" elif feature . qualifiers [ assessment_ref ] == \"backbone\" : return \"tab:cyan\" else : return \"tab:blue\" # default dna_features_viewer color else : return \"tab:blue\" class Assessment : \"\"\"The plasmid assessment class. **Parameters** **record** > A Biopython `SeqRecord`. **enzyme** > A restriction enzyme (`str`). A Biopython `RestrictionType` will be looked up using the string. \"\"\" UNKNOWN_IDS = [ \"None\" , \"\" , \"\" , \".\" , \"EXPORTED\" , \"\" , \"Exported\" , ] def __init__ ( self , record , enzyme ): self . record = record self . enzyme = Bio . Restriction . __dict__ [ enzyme ] self . enzyme_name = str ( self . enzyme ) self . results = {} def assess_plasmid ( self , other_enzymes = None ): \"\"\"Evaluate plasmid for Golden Gate. **Parameters** **other_enzymes** > List of enzymes used in higher level assemblies (`list`). \"\"\" if other_enzymes : self . other_enzymes = \", \" . join ([ str ( enz ) for enz in other_enzymes ]) self . add_name () self . check_circularity () self . get_number_of_sites () self . evaluate_orientation () self . digest_plasmid () self . count_other_sites ( other_enzymes ) self . check_enzyme_site_locations () self . sum_results () self . plot_plasmid () def add_name ( self ): \"\"\"Set a name for the assessment.\"\"\" # To display on the report: if str ( self . record . id ) . strip () in self . UNKNOWN_IDS : self . name = \"Unnamed plasmid\" else : if len ( self . record . id ) > 16 : # Genbank limit, also for width in report self . name = self . record . id [: 16 ] + \"...\" else : self . name = self . record . id def check_circularity ( self ): if \"topology\" not in self . record . annotations : self . results [ \"is_circular\" ] = False elif self . record . annotations [ \"topology\" ] == \"circular\" : self . results [ \"is_circular\" ] = True else : self . results [ \"is_circular\" ] = False def get_number_of_sites ( self ): if \"is_circular\" in self . results : is_linear = not self . results [ \"is_circular\" ] else : is_linear = False restriction_batch = Bio . Restriction . RestrictionBatch ([ self . enzyme ]) analysis = Bio . Restriction . Analysis ( restriction_batch , sequence = self . record . seq , linear = is_linear ) self . analysis_results = analysis . full ( linear = is_linear ) self . results [ \"number_of_sites\" ] = len ( self . analysis_results [ self . enzyme ]) # Add as features for plot in report: for enzyme , sites in self . analysis_results . items (): for site in sites : self . record . features . append ( SeqFeature ( FeatureLocation ( site , site + 1 ), id = str ( enzyme ), type = \"misc_feature\" , qualifiers = { \"label\" : str ( enzyme ), \"plasmid_assessment\" : \"enzyme\" , }, ) ) def evaluate_orientation ( self ): self . results [ \"is_site_orientation_correct\" ] = False # default # Forward strand: self . iter_forward = [ match . end () for match in re . finditer ( self . enzyme . site , str ( self . record . seq )) ] if sum ( 1 for _ in self . iter_forward ) == 1 : self . forward_enzyme = self . iter_forward [ 0 ] # rev_complement_site = str(self.record.seq.reverse_complement()) rev_complement_site = str ( Seq ( self . enzyme . site ) . reverse_complement ()) self . iter_reverse = [ m . start () for m in re . finditer ( rev_complement_site , str ( self . record . seq )) ] if sum ( 1 for _ in self . iter_reverse ) == 1 : # 1 site in both strands: self . results [ \"is_site_orientation_correct\" ] = True self . reverse_enzyme = self . iter_reverse [ 0 ] if self . results [ \"is_site_orientation_correct\" ]: if self . reverse_enzyme < self . forward_enzyme : self . record . features . append ( SeqFeature ( FeatureLocation ( self . reverse_enzyme - 1 , self . forward_enzyme + 1 ), id = str ( self . enzyme ), type = \"misc_feature\" , qualifiers = { \"label\" : \"Excised\" , \"plasmid_assessment\" : \"excised\" , }, ) ) else : # put annotation together from two pieces: self . record . features . append ( SeqFeature ( FeatureLocation ( 0 , self . forward_enzyme + 1 ), id = str ( self . enzyme ), type = \"misc_feature\" , qualifiers = { \"label\" : \"Excised\" , \"plasmid_assessment\" : \"excised\" , }, ) ) self . record . features . append ( SeqFeature ( FeatureLocation ( self . reverse_enzyme - 1 , len ( self . record )), id = str ( self . enzyme ), type = \"misc_feature\" , qualifiers = { \"label\" : \"Excised\" , \"plasmid_assessment\" : \"excised\" , }, ) ) def digest_plasmid ( self ): # Obtain fragments and get the backbone's overhangs. # This method has two assumptions: # - the sequence has two, correctly oriented enzyme sites. # - the sequence is circular. # Therefore there will be exactly two fragments, with one containing both sites. self . results [ \"digest\" ] = {} if not self . results [ \"is_circular\" ]: return if not self . results [ \"is_site_orientation_correct\" ]: return record_fragments = dc . StickyEndFragment . list_from_record_digestion ( record = self . record , enzyme = self . enzyme , linear = False ) if self . enzyme . site in record_fragments [ 0 ] . to_standard_string (): backbone_index = 1 # there are only two fragments excise_index = 0 else : backbone_index = 0 excise_index = 1 # reversed self . results [ \"digest\" ][ \"backbone_seq\" ] = record_fragments [ backbone_index ] self . results [ \"digest\" ][ \"excised_seq\" ] = record_fragments [ excise_index ] self . results [ \"digest\" ][ \"first_overhang\" ] = str ( record_fragments [ excise_index ] . seq . left_end ) self . results [ \"digest\" ][ \"last_overhang\" ] = str ( record_fragments [ excise_index ] . seq . right_end ) def count_other_sites ( self , other_enzymes ): self . results [ \"other_sites\" ] = {} self . results [ \"other_sites\" ][ \"has_any_other_sites\" ] = False if other_enzymes is None : return bio_enzymes = [ Bio . Restriction . __dict__ [ enzyme ] for enzyme in other_enzymes ] restriction_batch = Bio . Restriction . RestrictionBatch ( bio_enzymes ) # Work with the assumption that the sequence is circular: analysis = Bio . Restriction . Analysis ( restriction_batch , sequence = self . record . seq , linear = False ) self . results [ \"other_sites\" ][ \"enzyme\" ] = analysis . full ( linear = False ) for enzyme , matches in self . results [ \"other_sites\" ][ \"enzyme\" ] . items (): if len ( matches ) != 0 : self . results [ \"other_sites\" ][ \"has_any_other_sites\" ] = True # Also add as features for plot in report: for site in matches : self . record . features . append ( SeqFeature ( FeatureLocation ( site , site + 1 ), id = str ( enzyme ), type = \"misc_feature\" , qualifiers = { \"label\" : str ( enzyme ), \"plasmid_assessment\" : \"enzyme\" , }, ) ) def check_enzyme_site_locations ( self ): \"\"\"Flag enzyme sites that are within the retained backbone.\"\"\" try : self . results [ \"other_sites\" ][ \"has_any_other_sites\" ] self . results [ \"is_site_orientation_correct\" ] except KeyError : print ( \"Run assessment methods first!\" ) else : self . sites_outside_excised_region = {} if ( self . results [ \"other_sites\" ][ \"has_any_other_sites\" ] and self . results [ \"is_site_orientation_correct\" ] ): # if there are no other sites, no need to run: if self . reverse_enzyme < self . forward_enzyme : # orientation = reverse -> forward for enzyme , sites in self . results [ \"other_sites\" ][ \"enzyme\" ] . items (): problem_sites = [] for site in sites : if self . reverse_enzyme < site < self . forward_enzyme : pass else : problem_sites += [ str ( site )] if problem_sites != []: self . sites_outside_excised_region [ str ( enzyme ) ] = problem_sites txt = \"\" # for the pdf report for ( enzyme , problem_sites , ) in self . sites_outside_excised_region . items (): txt += enzyme + \": \" + \" \" . join ( problem_sites ) + \";\" self . sites_outside_excised_region_txt = txt else : # orientation = forward -> reverse for enzyme , sites in self . results [ \"other_sites\" ][ \"enzyme\" ] . items (): problem_sites = [] for site in sites : if self . forward_enzyme < site < self . reverse_enzyme : # in this case the site is within the retained backbone problem_sites += [ str ( site )] if problem_sites != []: self . sites_outside_excised_region [ str ( enzyme ) ] = problem_sites txt = \"\" # for the pdf report for ( enzyme , problem_sites , ) in self . sites_outside_excised_region . items (): txt += enzyme + \": \" + \" \" . join ( problem_sites ) + \";\" self . sites_outside_excised_region_txt = txt else : # no other sites or orientation not correct self . sites_outside_excised_region_txt = \"\" def sum_results ( self ): self . results [ \"pass\" ] = True if self . results [ \"is_circular\" ] is False : self . results [ \"pass\" ] = False return if self . results [ \"is_site_orientation_correct\" ] is False : # implicitly checks number of sites too self . results [ \"pass\" ] = False return if self . sites_outside_excised_region_txt : self . results [ \"pass\" ] = False return # if self.results[\"other_sites\"][\"has_any_other_sites\"]: # self.results[\"pass\"] = False # return def plot_plasmid ( self ): \"\"\"Plot an outline of the plasmid.\"\"\" fig , ax = plt . subplots ( figsize = ( 7 , 4 )) graphic_record = AssessmentTranslator () . translate_record ( self . record ) graphic_record . plot ( ax = ax , with_ruler = False , strand_in_label_threshold = 2 ) self . fig = fig","title":"Module plasmid_assessor.Assessment"},{"location":"reference/plasmid_assessor/Assessment/#classes","text":"","title":"Classes"},{"location":"reference/plasmid_assessor/Assessment/#assessment","text":"class Assessment ( record , enzyme ) The plasmid assessment class. Parameters record A Biopython SeqRecord . enzyme A restriction enzyme ( str ). A Biopython RestrictionType will be looked up using the string. View Source class Assessment : \"\"\"The plasmid assessment class. **Parameters** **record** > A Biopython `SeqRecord`. **enzyme** > A restriction enzyme (`str`). A Biopython `RestrictionType` will be looked up using the string. \"\"\" UNKNOWN_IDS = [ \"None\", \"\", \"\", \".\", \"EXPORTED\", \"\", \"Exported\", ] def __init__ ( self , record , enzyme ) : self . record = record self . enzyme = Bio . Restriction . __dict__ [ enzyme ] self . enzyme_name = str ( self . enzyme ) self . results = {} def assess_plasmid ( self , other_enzymes = None ) : \"\"\"Evaluate plasmid for Golden Gate. **Parameters** **other_enzymes** > List of enzymes used in higher level assemblies (`list`). \"\"\" if other_enzymes : self . other_enzymes = \", \" . join ( [ str(enz) for enz in other_enzymes ] ) self . add_name () self . check_circularity () self . get_number_of_sites () self . evaluate_orientation () self . digest_plasmid () self . count_other_sites ( other_enzymes ) self . check_enzyme_site_locations () self . sum_results () self . plot_plasmid () def add_name ( self ) : \"\"\"Set a name for the assessment.\"\"\" # To display on the report : if str ( self . record . id ). strip () in self . UNKNOWN_IDS : self . name = \"Unnamed plasmid\" else : if len ( self . record . id ) > 16 : # Genbank limit , also for width in report self . name = self . record . id [ :16 ] + \"...\" else : self . name = self . record . id def check_circularity ( self ) : if \"topology\" not in self . record . annotations : self . results [ \"is_circular\" ] = False elif self . record . annotations [ \"topology\" ] == \"circular\" : self . results [ \"is_circular\" ] = True else : self . results [ \"is_circular\" ] = False def get_number_of_sites ( self ) : if \"is_circular\" in self . results : is_linear = not self . results [ \"is_circular\" ] else : is_linear = False restriction_batch = Bio . Restriction . RestrictionBatch ( [ self.enzyme ] ) analysis = Bio . Restriction . Analysis ( restriction_batch , sequence = self . record . seq , linear = is_linear ) self . analysis_results = analysis . full ( linear = is_linear ) self . results [ \"number_of_sites\" ] = len ( self . analysis_results [ self.enzyme ] ) # Add as features for plot in report : for enzyme , sites in self . analysis_results . items () : for site in sites : self . record . features . append ( SeqFeature ( FeatureLocation ( site , site + 1 ), id = str ( enzyme ), type = \"misc_feature\" , qualifiers = { \"label\" : str ( enzyme ), \"plasmid_assessment\" : \"enzyme\" , } , ) ) def evaluate_orientation ( self ) : self . results [ \"is_site_orientation_correct\" ] = False # default # Forward strand : self . iter_forward = [ match.end() for match in re.finditer(self.enzyme.site, str(self.record.seq)) ] if sum ( 1 for _ in self . iter_forward ) == 1 : self . forward_enzyme = self . iter_forward [ 0 ] # rev_complement_site = str ( self . record . seq . reverse_complement ()) rev_complement_site = str ( Seq ( self . enzyme . site ). reverse_complement ()) self . iter_reverse = [ m.start() for m in re.finditer(rev_complement_site, str(self.record.seq)) ] if sum ( 1 for _ in self . iter_reverse ) == 1 : # 1 site in both strands : self . results [ \"is_site_orientation_correct\" ] = True self . reverse_enzyme = self . iter_reverse [ 0 ] if self . results [ \"is_site_orientation_correct\" ] : if self . reverse_enzyme < self . forward_enzyme : self . record . features . append ( SeqFeature ( FeatureLocation ( self . reverse_enzyme - 1 , self . forward_enzyme + 1 ), id = str ( self . enzyme ), type = \"misc_feature\" , qualifiers = { \"label\" : \"Excised\" , \"plasmid_assessment\" : \"excised\" , } , ) ) else : # put annotation together from two pieces : self . record . features . append ( SeqFeature ( FeatureLocation ( 0 , self . forward_enzyme + 1 ), id = str ( self . enzyme ), type = \"misc_feature\" , qualifiers = { \"label\" : \"Excised\" , \"plasmid_assessment\" : \"excised\" , } , ) ) self . record . features . append ( SeqFeature ( FeatureLocation ( self . reverse_enzyme - 1 , len ( self . record )), id = str ( self . enzyme ), type = \"misc_feature\" , qualifiers = { \"label\" : \"Excised\" , \"plasmid_assessment\" : \"excised\" , } , ) ) def digest_plasmid ( self ) : # Obtain fragments and get the backbone ' s overhangs . # This method has two assumptions : # - the sequence has two , correctly oriented enzyme sites . # - the sequence is circular . # Therefore there will be exactly two fragments , with one containing both sites . self . results [ \"digest\" ] = {} if not self . results [ \"is_circular\" ] : return if not self . results [ \"is_site_orientation_correct\" ] : return record_fragments = dc . StickyEndFragment . list_from_record_digestion ( record = self . record , enzyme = self . enzyme , linear = False ) if self . enzyme . site in record_fragments [ 0 ] . to_standard_string () : backbone_index = 1 # there are only two fragments excise_index = 0 else : backbone_index = 0 excise_index = 1 # reversed self . results [ \"digest\" ][ \"backbone_seq\" ] = record_fragments [ backbone_index ] self . results [ \"digest\" ][ \"excised_seq\" ] = record_fragments [ excise_index ] self . results [ \"digest\" ][ \"first_overhang\" ] = str ( record_fragments [ excise_index ] . seq . left_end ) self . results [ \"digest\" ][ \"last_overhang\" ] = str ( record_fragments [ excise_index ] . seq . right_end ) def count_other_sites ( self , other_enzymes ) : self . results [ \"other_sites\" ] = {} self . results [ \"other_sites\" ][ \"has_any_other_sites\" ] = False if other_enzymes is None : return bio_enzymes = [ Bio.Restriction.__dict__[enzyme ] for enzyme in other_enzymes ] restriction_batch = Bio . Restriction . RestrictionBatch ( bio_enzymes ) # Work with the assumption that the sequence is circular : analysis = Bio . Restriction . Analysis ( restriction_batch , sequence = self . record . seq , linear = False ) self . results [ \"other_sites\" ][ \"enzyme\" ] = analysis . full ( linear = False ) for enzyme , matches in self . results [ \"other_sites\" ][ \"enzyme\" ] . items () : if len ( matches ) != 0 : self . results [ \"other_sites\" ][ \"has_any_other_sites\" ] = True # Also add as features for plot in report : for site in matches : self . record . features . append ( SeqFeature ( FeatureLocation ( site , site + 1 ), id = str ( enzyme ), type = \"misc_feature\" , qualifiers = { \"label\" : str ( enzyme ), \"plasmid_assessment\" : \"enzyme\" , } , ) ) def check_enzyme_site_locations ( self ) : \"\"\"Flag enzyme sites that are within the retained backbone.\"\"\" try : self . results [ \"other_sites\" ][ \"has_any_other_sites\" ] self . results [ \"is_site_orientation_correct\" ] except KeyError : print ( \"Run assessment methods first!\" ) else : self . sites_outside_excised_region = {} if ( self . results [ \"other_sites\" ][ \"has_any_other_sites\" ] and self . results [ \"is_site_orientation_correct\" ] ) : # if there are no other sites , no need to run : if self . reverse_enzyme < self . forward_enzyme : # orientation = reverse -> forward for enzyme , sites in self . results [ \"other_sites\" ][ \"enzyme\" ] . items () : problem_sites = [] for site in sites : if self . reverse_enzyme < site < self . forward_enzyme : pass else : problem_sites += [ str(site) ] if problem_sites != []: self . sites_outside_excised_region [ str(enzyme) ] = problem_sites txt = \"\" # for the pdf report for ( enzyme , problem_sites , ) in self . sites_outside_excised_region . items () : txt += enzyme + \": \" + \" \" . join ( problem_sites ) + \";\" self . sites_outside_excised_region_txt = txt else : # orientation = forward -> reverse for enzyme , sites in self . results [ \"other_sites\" ][ \"enzyme\" ] . items () : problem_sites = [] for site in sites : if self . forward_enzyme < site < self . reverse_enzyme : # in this case the site is within the retained backbone problem_sites += [ str(site) ] if problem_sites != []: self . sites_outside_excised_region [ str(enzyme) ] = problem_sites txt = \"\" # for the pdf report for ( enzyme , problem_sites , ) in self . sites_outside_excised_region . items () : txt += enzyme + \": \" + \" \" . join ( problem_sites ) + \";\" self . sites_outside_excised_region_txt = txt else : # no other sites or orientation not correct self . sites_outside_excised_region_txt = \"\" def sum_results ( self ) : self . results [ \"pass\" ] = True if self . results [ \"is_circular\" ] is False : self . results [ \"pass\" ] = False return if self . results [ \"is_site_orientation_correct\" ] is False : # implicitly checks number of sites too self . results [ \"pass\" ] = False return if self . sites_outside_excised_region_txt : self . results [ \"pass\" ] = False return # if self . results [ \"other_sites\" ][ \"has_any_other_sites\" ] : # self . results [ \"pass\" ] = False # return def plot_plasmid ( self ) : \"\"\"Plot an outline of the plasmid.\"\"\" fig , ax = plt . subplots ( figsize = ( 7 , 4 )) graphic_record = AssessmentTranslator (). translate_record ( self . record ) graphic_record . plot ( ax = ax , with_ruler = False , strand_in_label_threshold = 2 ) self . fig = fig","title":"Assessment"},{"location":"reference/plasmid_assessor/Assessment/#class-variables","text":"UNKNOWN_IDS","title":"Class variables"},{"location":"reference/plasmid_assessor/Assessment/#methods","text":"","title":"Methods"},{"location":"reference/plasmid_assessor/Assessment/#add_name","text":"def add_name ( self ) Set a name for the assessment. View Source def add_name ( self ) : \"\"\" Set a name for the assessment. \"\"\" # To display on the report : if str ( self . record . id ) . strip () in self . UNKNOWN_IDS : self . name = \" Unnamed plasmid \" else : if len ( self . record . id ) > 16 : # Genbank limit , also for width in report self . name = self . record . id [: 16 ] + \" ... \" else : self . name = self . record . id","title":"add_name"},{"location":"reference/plasmid_assessor/Assessment/#assess_plasmid","text":"def assess_plasmid ( self , other_enzymes = None ) Evaluate plasmid for Golden Gate. Parameters other_enzymes List of enzymes used in higher level assemblies ( list ). View Source def assess_plasmid ( self , other_enzymes = None ) : \" \"\" Evaluate plasmid for Golden Gate. **Parameters** **other_enzymes** > List of enzymes used in higher level assemblies (`list`). \"\" \" if other_enzymes : self . other_enzymes = \", \" . join ( [ str ( enz ) for enz in other_enzymes ] ) self . add_name () self . check_circularity () self . get_number_of_sites () self . evaluate_orientation () self . digest_plasmid () self . count_other_sites ( other_enzymes ) self . check_enzyme_site_locations () self . sum_results () self . plot_plasmid ()","title":"assess_plasmid"},{"location":"reference/plasmid_assessor/Assessment/#check_circularity","text":"def check_circularity ( self ) View Source def check_circularity ( self ) : if \" topology \" not in self . record . annotations : self . results [ \" is_circular \" ] = False elif self . record . annotations [ \" topology \" ] == \" circular \" : self . results [ \" is_circular \" ] = True else : self . results [ \" is_circular \" ] = False","title":"check_circularity"},{"location":"reference/plasmid_assessor/Assessment/#check_enzyme_site_locations","text":"def check_enzyme_site_locations ( self ) Flag enzyme sites that are within the retained backbone. View Source def check_enzyme_site_locations ( self ) : \"\"\"Flag enzyme sites that are within the retained backbone.\"\"\" try: self . results [ \"other_sites\" ][ \"has_any_other_sites\" ] self . results [ \"is_site_orientation_correct\" ] except KeyError: print ( \"Run assessment methods first!\" ) else : self . sites_outside_excised_region = {} if ( self . results [ \"other_sites\" ][ \"has_any_other_sites\" ] and self . results [ \"is_site_orientation_correct\" ] ) : # if there are no other sites , no need to run: if self . reverse_enzyme < self . forward_enzyme: # orientation = reverse -> forward for enzyme , sites in self . results [ \"other_sites\" ][ \"enzyme\" ]. items () : problem_sites = [] for site in sites: if self . reverse_enzyme < site < self . forward_enzyme: pass else : problem_sites += [ str ( site )] if problem_sites != [] : self . sites_outside_excised_region [ str ( enzyme ) ] = problem_sites txt = \"\" # for the pdf report for ( enzyme , problem_sites , ) in self . sites_outside_excised_region . items () : txt += enzyme + \": \" + \" \" . join ( problem_sites ) + \";\" self . sites_outside_excised_region_txt = txt else : # orientation = forward -> reverse for enzyme , sites in self . results [ \"other_sites\" ][ \"enzyme\" ]. items () : problem_sites = [] for site in sites: if self . forward_enzyme < site < self . reverse_enzyme: # in this case the site is within the retained backbone problem_sites += [ str ( site )] if problem_sites != [] : self . sites_outside_excised_region [ str ( enzyme ) ] = problem_sites txt = \"\" # for the pdf report for ( enzyme , problem_sites , ) in self . sites_outside_excised_region . items () : txt += enzyme + \": \" + \" \" . join ( problem_sites ) + \";\" self . sites_outside_excised_region_txt = txt else : # no other sites or orientation not correct self . sites_outside_excised_region_txt = \"\"","title":"check_enzyme_site_locations"},{"location":"reference/plasmid_assessor/Assessment/#count_other_sites","text":"def count_other_sites ( self , other_enzymes ) View Source def count_other_sites ( self , other_enzymes ) : self . results [ \"other_sites\" ] = {} self . results [ \"other_sites\" ][ \"has_any_other_sites\" ] = False if other_enzymes is None : return bio_enzymes = [ Bio.Restriction.__dict__[enzyme ] for enzyme in other_enzymes ] restriction_batch = Bio . Restriction . RestrictionBatch ( bio_enzymes ) # Work with the assumption that the sequence is circular : analysis = Bio . Restriction . Analysis ( restriction_batch , sequence = self . record . seq , linear = False ) self . results [ \"other_sites\" ][ \"enzyme\" ] = analysis . full ( linear = False ) for enzyme , matches in self . results [ \"other_sites\" ][ \"enzyme\" ] . items () : if len ( matches ) != 0 : self . results [ \"other_sites\" ][ \"has_any_other_sites\" ] = True # Also add as features for plot in report : for site in matches : self . record . features . append ( SeqFeature ( FeatureLocation ( site , site + 1 ), id = str ( enzyme ), type = \"misc_feature\" , qualifiers = { \"label\" : str ( enzyme ), \"plasmid_assessment\" : \"enzyme\" , } , ) )","title":"count_other_sites"},{"location":"reference/plasmid_assessor/Assessment/#digest_plasmid","text":"def digest_plasmid ( self ) View Source def digest_plasmid ( self ) : # Obtain fragments and get the backbone ' s overhangs . # This method has two assumptions : # - the sequence has two , correctly oriented enzyme sites . # - the sequence is circular . # Therefore there will be exactly two fragments , with one containing both sites . self . results [ \"digest\" ] = {} if not self . results [ \"is_circular\" ] : return if not self . results [ \"is_site_orientation_correct\" ] : return record_fragments = dc . StickyEndFragment . list_from_record_digestion ( record = self . record , enzyme = self . enzyme , linear = False ) if self . enzyme . site in record_fragments [ 0 ] . to_standard_string () : backbone_index = 1 # there are only two fragments excise_index = 0 else : backbone_index = 0 excise_index = 1 # reversed self . results [ \"digest\" ][ \"backbone_seq\" ] = record_fragments [ backbone_index ] self . results [ \"digest\" ][ \"excised_seq\" ] = record_fragments [ excise_index ] self . results [ \"digest\" ][ \"first_overhang\" ] = str ( record_fragments [ excise_index ] . seq . left_end ) self . results [ \"digest\" ][ \"last_overhang\" ] = str ( record_fragments [ excise_index ] . seq . right_end )","title":"digest_plasmid"},{"location":"reference/plasmid_assessor/Assessment/#evaluate_orientation","text":"def evaluate_orientation ( self ) View Source def evaluate_orientation ( self ) : self . results [ \" is_site_orientation_correct \" ] = False # default # Forward strand : self . iter_forward = [ match . end () for match in re . finditer ( self . enzyme . site , str ( self . record . seq )) ] if sum ( 1 for _ in self . iter_forward ) == 1 : self . forward_enzyme = self . iter_forward [ 0 ] # rev_complement_site = str ( self . record . seq . reverse_complement ()) rev_complement_site = str ( Seq ( self . enzyme . site ) . reverse_complement ()) self . iter_reverse = [ m . start () for m in re . finditer ( rev_complement_site , str ( self . record . seq )) ] if sum ( 1 for _ in self . iter_reverse ) == 1 : # 1 site in both strands : self . results [ \" is_site_orientation_correct \" ] = True self . reverse_enzyme = self . iter_reverse [ 0 ] if self . results [ \" is_site_orientation_correct \" ]: if self . reverse_enzyme < self . forward_enzyme : self . record . features . append ( SeqFeature ( FeatureLocation ( self . reverse_enzyme - 1 , self . forward_enzyme + 1 ) , id = str ( self . enzyme ) , type = \" misc_feature \" , qualifiers = { \" label \" : \" Excised \" , \" plasmid_assessment \" : \" excised \" , }, ) ) else : # put annotation together from two pieces : self . record . features . append ( SeqFeature ( FeatureLocation ( 0 , self . forward_enzyme + 1 ) , id = str ( self . enzyme ) , type = \" misc_feature \" , qualifiers = { \" label \" : \" Excised \" , \" plasmid_assessment \" : \" excised \" , }, ) ) self . record . features . append ( SeqFeature ( FeatureLocation ( self . reverse_enzyme - 1 , len ( self . record )) , id = str ( self . enzyme ) , type = \" misc_feature \" , qualifiers = { \" label \" : \" Excised \" , \" plasmid_assessment \" : \" excised \" , }, ) )","title":"evaluate_orientation"},{"location":"reference/plasmid_assessor/Assessment/#get_number_of_sites","text":"def get_number_of_sites ( self ) View Source def get_number_of_sites ( self ) : if \" is_circular \" in self . results : is_linear = not self . results [ \" is_circular \" ] else : is_linear = False restriction_batch = Bio . Restriction . RestrictionBatch ( [ self . enzyme ] ) analysis = Bio . Restriction . Analysis ( restriction_batch , sequence = self . record . seq , linear = is_linear ) self . analysis_results = analysis . full ( linear = is_linear ) self . results [ \" number_of_sites \" ] = len ( self . analysis_results [ self . enzyme ] ) # Add as features for plot in report : for enzyme , sites in self . analysis_results . items () : for site in sites : self . record . features . append ( SeqFeature ( FeatureLocation ( site , site + 1 ) , id = str ( enzyme ) , type = \" misc_feature \" , qualifiers = { \" label \" : str ( enzyme ) , \" plasmid_assessment \" : \" enzyme \" , }, ) )","title":"get_number_of_sites"},{"location":"reference/plasmid_assessor/Assessment/#plot_plasmid","text":"def plot_plasmid ( self ) Plot an outline of the plasmid. View Source def plot_plasmid(self): \"\"\"Plot an outline of the plasmid.\"\"\" fig, ax = plt.subplots(figsize=(7, 4)) graphic_record = AssessmentTranslator().translate_record(self.record) graphic_record.plot(ax=ax, with_ruler=False, strand_in_label_threshold=2) self.fig = fig","title":"plot_plasmid"},{"location":"reference/plasmid_assessor/Assessment/#sum_results","text":"def sum_results ( self ) View Source def sum_results ( self ) : self . results [ \"pass\" ] = True if self . results [ \"is_circular\" ] is False: self . results [ \"pass\" ] = False return if self . results [ \"is_site_orientation_correct\" ] is False: # implicitly checks number of sites too self . results [ \"pass\" ] = False return if self . sites_outside_excised_region_txt: self . results [ \"pass\" ] = False return","title":"sum_results"},{"location":"reference/plasmid_assessor/Assessment/#assessmenttranslator","text":"class AssessmentTranslator ( features_filters = (), features_properties = None ) Custom translator for highlighting key features. View Source class AssessmentTranslator: \"\"\"Please install dna_features_viewer to use this class.\"\"\" def __init__ ( self ): raise Exception ( \"Please install dna_features_viewer to use this class.\" )","title":"AssessmentTranslator"},{"location":"reference/plasmid_assessor/Assessment/#ancestors-in-mro","text":"dna_features_viewer.BiopythonTranslator.BiopythonTranslator.BiopythonTranslator dna_features_viewer.BiopythonTranslator.BiopythonTranslatorBase.BiopythonTranslatorBase","title":"Ancestors (in MRO)"},{"location":"reference/plasmid_assessor/Assessment/#class-variables_1","text":"default_feature_color graphic_record_parameters ignored_features_types label_fields","title":"Class variables"},{"location":"reference/plasmid_assessor/Assessment/#static-methods","text":"","title":"Static methods"},{"location":"reference/plasmid_assessor/Assessment/#quick_class_plot","text":"def quick_class_plot ( record , figure_width = 12 , ** kwargs ) Allows super quick and dirty plotting of Biopython records. This is really meant for use in a Jupyter/Ipython notebook with the \"%matplotlib inline\" setting. from dna_features_viewer import BiopythonTranslator BiopythonTranslator.quick_plot(my_record) View Source @classmethod def quick_class_plot ( cls , record , figure_width = 12 , ** kwargs ): \"\"\"Allows super quick and dirty plotting of Biopython records. This is really meant for use in a Jupyter/Ipython notebook with the \"%matplotlib inline\" setting. >>> from dna_features_viewer import BiopythonTranslator >>> BiopythonTranslator.quick_plot(my_record) \"\"\" graphic_record = cls () . translate_record ( record ) ax , _ = graphic_record . plot ( figure_width = figure_width , ** kwargs ) return ax","title":"quick_class_plot"},{"location":"reference/plasmid_assessor/Assessment/#methods_1","text":"","title":"Methods"},{"location":"reference/plasmid_assessor/Assessment/#compute_feature_box_color","text":"def compute_feature_box_color ( self , feature ) Compute a box_color for this feature. View Source def compute_feature_box_color ( self , feature ) : \"\"\" Compute a box_color for this feature. \"\"\" return \" auto \"","title":"compute_feature_box_color"},{"location":"reference/plasmid_assessor/Assessment/#compute_feature_box_linewidth","text":"def compute_feature_box_linewidth ( self , feature ) Compute a box_linewidth for this feature. View Source def compute_feature_box_linewidth ( self , feature ) : \"\"\" Compute a box_linewidth for this feature. \"\"\" return 0 . 3","title":"compute_feature_box_linewidth"},{"location":"reference/plasmid_assessor/Assessment/#compute_feature_color","text":"def compute_feature_color ( self , feature ) Compute a color for this feature. If the feature has a color qualifier it will be used. Otherwise, the classe's default_feature_color is used. To change the behaviour, create a subclass of BiopythonTranslator and overwrite this method. View Source def compute_feature_color ( self , feature ) : assessment_ref = \"plasmid_assessment\" if assessment_ref in feature . qualifiers : if feature . qualifiers [ assessment_ref ] == \"enzyme\" : return \"red\" elif feature . qualifiers [ assessment_ref ] == \"excised\" : return \"yellow\" elif feature . qualifiers [ assessment_ref ] == \"backbone\" : return \"tab:cyan\" else : return \"tab:blue\" # default dna_features_viewer color else : return \"tab:blue\"","title":"compute_feature_color"},{"location":"reference/plasmid_assessor/Assessment/#compute_feature_fontdict","text":"def compute_feature_fontdict ( self , feature ) Compute a font dict for this feature. View Source def compute_feature_fontdict ( self , feature ) : \"\"\" Compute a font dict for this feature. \"\"\" return None","title":"compute_feature_fontdict"},{"location":"reference/plasmid_assessor/Assessment/#compute_feature_html","text":"def compute_feature_html ( self , feature ) Gets the 'label' of the feature. View Source def compute_feature_html ( self , feature ) : \"\"\" Gets the 'label' of the feature. \"\"\" return self . compute_feature_label ( feature )","title":"compute_feature_html"},{"location":"reference/plasmid_assessor/Assessment/#compute_feature_label","text":"def compute_feature_label ( self , feature ) Compute the label of the feature. View Source def compute_feature_label ( self , feature ) : \"\"\"Compute the label of the feature.\"\"\" label = feature . type for key in self . label_fields : if key in feature . qualifiers and len ( feature . qualifiers [ key ] ) : label = feature . qualifiers [ key ] break if isinstance ( label , list ) : label = \"|\" . join ( label ) return label","title":"compute_feature_label"},{"location":"reference/plasmid_assessor/Assessment/#compute_feature_label_link_color","text":"def compute_feature_label_link_color ( self , feature ) Compute the color of the line linking the label to its feature. View Source def compute_feature_label_link_color ( self , feature ) : \"\"\" Compute the color of the line linking the label to its feature. \"\"\" return \" black \"","title":"compute_feature_label_link_color"},{"location":"reference/plasmid_assessor/Assessment/#compute_feature_legend_text","text":"def compute_feature_legend_text ( self , feature ) View Source def compute_feature_legend_text ( self , feature ) : return None","title":"compute_feature_legend_text"},{"location":"reference/plasmid_assessor/Assessment/#compute_feature_linewidth","text":"def compute_feature_linewidth ( self , feature ) Compute the edge width of the feature's arrow/rectangle. View Source def compute_feature_linewidth ( self , feature ) : \"\"\" Compute the edge width of the feature's arrow/rectangle. \"\"\" return 1 . 0","title":"compute_feature_linewidth"},{"location":"reference/plasmid_assessor/Assessment/#compute_filtered_features","text":"def compute_filtered_features ( self , features ) Return the list of features minus the ignored ones. By the method keeps any feature whose type is not in ignored_features_types and for which all filter(f) pass. View Source def compute_filtered_features ( self , features ) : \"\"\" Return the list of features minus the ignored ones. By the method keeps any feature whose type is not in ignored_features_types and for which all filter ( f ) pass . \"\"\" return [ f for f in features if all ( [ fl ( f ) for fl in self . features_filters ] ) and f . type not in self . ignored_features_types ]","title":"compute_filtered_features"},{"location":"reference/plasmid_assessor/Assessment/#quick_plot","text":"def quick_plot ( self , record , figure_width = 12 , ** kwargs ) Allows super quick and dirty plotting of Biopython records. This is really meant for use in a Jupyter/Ipython notebook with the \"%matplotlib inline\" setting. from dna_features_viewer import BiopythonTranslator BiopythonTranslator.quick_plot(my_record) View Source def quick_plot ( self , record , figure_width = 12 , ** kwargs ): \"\"\"Allows super quick and dirty plotting of Biopython records. This is really meant for use in a Jupyter/Ipython notebook with the \"%matplotlib inline\" setting. >>> from dna_features_viewer import BiopythonTranslator >>> BiopythonTranslator.quick_plot(my_record) \"\"\" graphic_record = self . translate_record ( record ) ax , _ = graphic_record . plot ( figure_width = figure_width , ** kwargs ) return ax","title":"quick_plot"},{"location":"reference/plasmid_assessor/Assessment/#translate_feature","text":"def translate_feature ( self , feature ) Translate a Biopython feature into a Dna Features Viewer feature. View Source def translate_feature ( self , feature ) : \"\"\" Translate a Biopython feature into a Dna Features Viewer feature. \"\"\" properties = dict ( label = self . compute_feature_label ( feature ) , color = self . compute_feature_color ( feature ) , html = self . compute_feature_html ( feature ) , fontdict = self . compute_feature_fontdict ( feature ) , box_linewidth = self . compute_feature_box_linewidth ( feature ) , box_color = self . compute_feature_box_color ( feature ) , linewidth = self . compute_feature_linewidth ( feature ) , label_link_color = self . compute_feature_label_link_color ( feature ) , legend_text = self . compute_feature_legend_text ( feature ) , ) if self . features_properties is not None : other_properties = self . features_properties if hasattr ( other_properties , \" __call__ \" ) : other_properties = other_properties ( feature ) properties . update ( other_properties ) return GraphicFeature ( start = feature . location . start , end = feature . location . end , strand = feature . location . strand , ** properties )","title":"translate_feature"},{"location":"reference/plasmid_assessor/Assessment/#translate_record","text":"def translate_record ( self , record , record_class = None , filetype = None ) Create a new GraphicRecord from a BioPython Record object.","title":"translate_record"},{"location":"reference/plasmid_assessor/Assessment/#parameters","text":"record A BioPython Record object or the path to a Genbank or a GFF file. record_class The graphic record class to use, e.g. GraphicRecord (default) or CircularGraphicRecord. Strings 'circular' and 'linear' can also be provided. filetype Used only when a Genbank or a GFF file is provided; one of \"genbank\" or \"gff\" to be used. Default None infers from file extension. View Source def translate_record ( self , record , record_class = None , filetype = None ) : \"\"\"Create a new GraphicRecord from a BioPython Record object. Parameters ---------- record A BioPython Record object or the path to a Genbank or a GFF file. record_class The graphic record class to use, e.g. GraphicRecord (default) or CircularGraphicRecord. Strings 'circular' and 'linear' can also be provided. filetype Used only when a Genbank or a GFF file is provided; one of \" genbank \" or \" gff \" to be used. Default None infers from file extension. \"\"\" classes = { \"linear\" : GraphicRecord , \"circular\" : CircularGraphicRecord , None : GraphicRecord , } if record_class in classes : record_class = classes [ record_class ] if isinstance ( record , str ) or hasattr ( record , \"read\" ) : record = load_record ( record , filetype = filetype ) filtered_features = self . compute_filtered_features ( record . features ) return record_class ( sequence_length = len ( record ), sequence = str ( record . seq ), features =[ self.translate_feature(feature) for feature in filtered_features if feature.location is not None ] , ** self . graphic_record_parameters )","title":"Parameters"},{"location":"reference/plasmid_assessor/reports/","text":"Module plasmid_assessor.reports View Source from datetime import datetime import os try : import pdf_reports.tools as pdf_tools from pdf_reports import ( add_css_class , dataframe_to_html , pug_to_html , style_table_rows , write_report , ) import pandas import matplotlib REPORT_PKGS_AVAILABLE = True except ImportError : REPORT_PKGS_AVAILABLE = False from .version import __version__ THIS_PATH = os . path . dirname ( os . path . realpath ( __file__ )) ASSETS_PATH = os . path . join ( THIS_PATH , \"report_assets\" ) REPORT_TEMPLATE = os . path . join ( ASSETS_PATH , \"assessment_report.pug\" ) STYLESHEET = os . path . join ( ASSETS_PATH , \"report_style.css\" ) def end_pug_to_html ( template , ** context ): now = datetime . now () . strftime ( \"%Y-%m- %d \" ) defaults = { \"sidebar_text\" : \"Generated on %s by EGF's Plasmid assessor (version %s )\" % ( now , __version__ ), \"plasma_logo_url\" : os . path . join ( ASSETS_PATH , \"imgs\" , \"plasma_logo.png\" ), } for k in defaults : if k not in context : context [ k ] = defaults [ k ] return pug_to_html ( template , ** context ) def write_pdf_report ( target , assessment ): \"\"\"Write an assessment report with a PDF summary. **Parameters** **target** > Path for PDF file. **assessment** > Assessment instance. \"\"\" if not REPORT_PKGS_AVAILABLE : raise ImportError ( \"Install extra packages with `pip install plasmid_assessor[report]`\" ) assessment . figure_data = pdf_tools . figure_data ( assessment . fig , fmt = \"svg\" ) html = end_pug_to_html ( REPORT_TEMPLATE , assessment = assessment ,) write_report ( html , target , extra_stylesheets = ( STYLESHEET ,)) Variables ASSETS_PATH REPORT_PKGS_AVAILABLE REPORT_TEMPLATE STYLESHEET THIS_PATH Functions end_pug_to_html def end_pug_to_html ( template , ** context ) View Source def end_pug_to_html ( template , ** context ) : now = datetime . now (). strftime ( \"%Y-%m-%d\" ) defaults = { \"sidebar_text\" : \"Generated on %s by EGF's Plasmid assessor (version %s)\" % ( now , __version__ ), \"plasma_logo_url\" : os . path . join ( ASSETS_PATH , \"imgs\" , \"plasma_logo.png\" ), } for k in defaults : if k not in context : context [ k ] = defaults [ k ] return pug_to_html ( template , ** context ) write_pdf_report def write_pdf_report ( target , assessment ) Write an assessment report with a PDF summary. Parameters target Path for PDF file. assessment Assessment instance. View Source def write_pdf_report ( target , assessment ) : \"\"\"Write an assessment report with a PDF summary. **Parameters** **target** > Path for PDF file. **assessment** > Assessment instance. \"\"\" if not REPORT_PKGS_AVAILABLE : raise ImportError ( \"Install extra packages with `pip install plasmid_assessor[report]`\" ) assessment . figure_data = pdf_tools . figure_data ( assessment . fig , fmt = \"svg\" ) html = end_pug_to_html ( REPORT_TEMPLATE , assessment = assessment ,) write_report ( html , target , extra_stylesheets = ( STYLESHEET ,))","title":"Reports"},{"location":"reference/plasmid_assessor/reports/#module-plasmid_assessorreports","text":"View Source from datetime import datetime import os try : import pdf_reports.tools as pdf_tools from pdf_reports import ( add_css_class , dataframe_to_html , pug_to_html , style_table_rows , write_report , ) import pandas import matplotlib REPORT_PKGS_AVAILABLE = True except ImportError : REPORT_PKGS_AVAILABLE = False from .version import __version__ THIS_PATH = os . path . dirname ( os . path . realpath ( __file__ )) ASSETS_PATH = os . path . join ( THIS_PATH , \"report_assets\" ) REPORT_TEMPLATE = os . path . join ( ASSETS_PATH , \"assessment_report.pug\" ) STYLESHEET = os . path . join ( ASSETS_PATH , \"report_style.css\" ) def end_pug_to_html ( template , ** context ): now = datetime . now () . strftime ( \"%Y-%m- %d \" ) defaults = { \"sidebar_text\" : \"Generated on %s by EGF's Plasmid assessor (version %s )\" % ( now , __version__ ), \"plasma_logo_url\" : os . path . join ( ASSETS_PATH , \"imgs\" , \"plasma_logo.png\" ), } for k in defaults : if k not in context : context [ k ] = defaults [ k ] return pug_to_html ( template , ** context ) def write_pdf_report ( target , assessment ): \"\"\"Write an assessment report with a PDF summary. **Parameters** **target** > Path for PDF file. **assessment** > Assessment instance. \"\"\" if not REPORT_PKGS_AVAILABLE : raise ImportError ( \"Install extra packages with `pip install plasmid_assessor[report]`\" ) assessment . figure_data = pdf_tools . figure_data ( assessment . fig , fmt = \"svg\" ) html = end_pug_to_html ( REPORT_TEMPLATE , assessment = assessment ,) write_report ( html , target , extra_stylesheets = ( STYLESHEET ,))","title":"Module plasmid_assessor.reports"},{"location":"reference/plasmid_assessor/reports/#variables","text":"ASSETS_PATH REPORT_PKGS_AVAILABLE REPORT_TEMPLATE STYLESHEET THIS_PATH","title":"Variables"},{"location":"reference/plasmid_assessor/reports/#functions","text":"","title":"Functions"},{"location":"reference/plasmid_assessor/reports/#end_pug_to_html","text":"def end_pug_to_html ( template , ** context ) View Source def end_pug_to_html ( template , ** context ) : now = datetime . now (). strftime ( \"%Y-%m-%d\" ) defaults = { \"sidebar_text\" : \"Generated on %s by EGF's Plasmid assessor (version %s)\" % ( now , __version__ ), \"plasma_logo_url\" : os . path . join ( ASSETS_PATH , \"imgs\" , \"plasma_logo.png\" ), } for k in defaults : if k not in context : context [ k ] = defaults [ k ] return pug_to_html ( template , ** context )","title":"end_pug_to_html"},{"location":"reference/plasmid_assessor/reports/#write_pdf_report","text":"def write_pdf_report ( target , assessment ) Write an assessment report with a PDF summary. Parameters target Path for PDF file. assessment Assessment instance. View Source def write_pdf_report ( target , assessment ) : \"\"\"Write an assessment report with a PDF summary. **Parameters** **target** > Path for PDF file. **assessment** > Assessment instance. \"\"\" if not REPORT_PKGS_AVAILABLE : raise ImportError ( \"Install extra packages with `pip install plasmid_assessor[report]`\" ) assessment . figure_data = pdf_tools . figure_data ( assessment . fig , fmt = \"svg\" ) html = end_pug_to_html ( REPORT_TEMPLATE , assessment = assessment ,) write_report ( html , target , extra_stylesheets = ( STYLESHEET ,))","title":"write_pdf_report"},{"location":"reference/plasmid_assessor/version/","text":"Module plasmid_assessor.version View Source __version__ = \"0.1.0\"","title":"Version"},{"location":"reference/plasmid_assessor/version/#module-plasmid_assessorversion","text":"View Source __version__ = \"0.1.0\"","title":"Module plasmid_assessor.version"}]} \ No newline at end of file diff --git a/docs/sitemap.xml b/docs/sitemap.xml index 2fa95b4..c21d9a9 100644 --- a/docs/sitemap.xml +++ b/docs/sitemap.xml @@ -1,23 +1,23 @@ None - 2021-09-29 + 2021-10-06 daily None - 2021-09-29 + 2021-10-06 daily None - 2021-09-29 + 2021-10-06 daily None - 2021-09-29 + 2021-10-06 daily None - 2021-09-29 + 2021-10-06 daily \ No newline at end of file diff --git a/docs/sitemap.xml.gz b/docs/sitemap.xml.gz index 6b058a9fe1821fbc8ba546146ac412ebeb0e2882..d7e8123fab496d7c16a1058f92b8c3d7786a7f6e 100644 GIT binary patch literal 197 zcmV;$06PC4iwFqm>Rn+1|8r?{Wo=<_E_iKh0PT`74#F@DMfaW}%HBBbfB>cG#>fN* zh}zIbN|O=?3b!XgMdAubc(MKbzy4y;J|;`V_Fba2%PPx%wAcLT*CTJ9=+27^7MfUo4a0W47e30~+r-TC<80?UWyk8#{VF9m*Z;MZs^u zqK+hq9d>kzaoGc`>&nnXJ

    build coverage