Ejemplo n.º 1
0
def execute(output):

    sim = pt.Model(cell_volume=8e-16)
    sim.seed(34)
    sim.add_polymerase(name="rnapol", copy_number=10, speed=40, footprint=10)
    sim.add_ribosome(copy_number=100, speed=30, footprint=10)

    plasmid = pt.Genome(name="plasmid", length=605)

    plasmid.add_promoter(name="p1", start=1, stop=10,
                         interactions={"rnapol": 2e8})
    plasmid.add_terminator(name="t1", start=604, stop=605,
                           efficiency={"rnapol": 1.0})

    plasmid.add_gene(name="rnapol", start=26, stop=225,
                     rbs_start=(26 - 15), rbs_stop=26, rbs_strength=1e7)
    plasmid.add_gene(name="proteinX", start=241, stop=280,
                     rbs_start=(241 - 15), rbs_stop=241, rbs_strength=1e7)
    plasmid.add_gene(name="proteinY", start=296, stop=595,
                     rbs_start=(296 - 15), rbs_stop=296, rbs_strength=1e7)

    plasmid.add_weights([1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25,
                         0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 0.25, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0, 1.0])

    sim.register_genome(plasmid)

    sim.simulate(time_limit=60, time_step=1, output=output + "_counts.tsv")
Ejemplo n.º 2
0
    def test_overload(self):
        plasmid = pt.Genome(name="T7",
                            length=305,
                            transcript_degradation_rate=1e-2,
                            transcript_degradation_rate_ext=1e-2,
                            rnase_footprint=9,
                            rnase_speed=20)

        # Original method
        plasmid.add_rnase_site(start=100, stop=110)

        plasmid = pt.Genome(name="T7",
                            length=305,
                            transcript_degradation_rate_ext=1e-2,
                            rnase_footprint=9,
                            rnase_speed=20)

        # alternate method that takes a rnase binding affinity specific to
        # this site
        plasmid.add_rnase_site(name="R6.5", start=220, stop=230, rate=5e-3)
Ejemplo n.º 3
0
    def test_site_names_error_handling(self):
        # this time don't set transcript_degredation_rate
        plasmid = pt.Genome(name="T7",
                            length=305,
                            transcript_degradation_rate_ext=1e-2,
                            rnase_footprint=9,
                            rnase_speed=20)

        plasmid.add_rnase_site(name="R1", start=280, stop=290, rate=4e-3)
        # rnase binding site names must be unique
        with self.assertRaises(RuntimeError):
            plasmid.add_rnase_site(name="R1", start=220, stop=230, rate=5e-3)
Ejemplo n.º 4
0
    def test_rate_error_handling(self):
        plasmid = pt.Genome(name="T7",
                            length=305,
                            transcript_degradation_rate=1e-2,
                            transcript_degradation_rate_ext=1e-2,
                            rnase_footprint=9,
                            rnase_speed=20)

        # Shouldn't be able to specify a unique binding rate constant if
        # transcript_degredation_rate is set
        with self.assertRaises(RuntimeError):
            plasmid.add_rnase_site(name="R6.5", start=220, stop=230, rate=5e-3)
Ejemplo n.º 5
0
def pt_call(output_dir, genome_tracker_new, max_time):
    """
    pinetree python interface containing all the information needed to conduct a simulation.
    Input(s):
    output_dir is a string containing information of the path to the directory in which all the saved files are stored by the program.
    genome_tracker_new is the dataframe containing the most recently edited genomic data.
    max_time is the amount of time for the infection cycle that pinetree is simulating.
    Output(s):
    Saves file containing transcript abundances data over time.
    """

    sim = pt.Model(cell_volume=8e-16)
    sim.seed(random.randint(0, 10e6))
    sim.add_polymerase(name="rnapol", copy_number=4, speed=40, footprint=35)
    sim.add_ribosome(copy_number=100, speed=30, footprint=30)

    plasmid = pt.Genome(name="plasmid", length=genome_tracker_new['length_of_genome'],
                        transcript_degradation_rate_ext=1e-3,
                        rnase_speed=20,
                        rnase_footprint=10)
    #Promoters
    for i in range(genome_tracker_new['num_genes']):
        if genome_tracker_new['promoter_{}'.format(i)]['start'] > 0:
            plasmid.add_promoter(name="p{}".format(i), start=genome_tracker_new['promoter_{}'.format(i)]['start'], stop=genome_tracker_new['promoter_{}'.format(i)]['stop'],
                                 interactions={"rnapol": genome_tracker_new['promoter_{}'.format(i)]['current_strength']})

    #RNases
    for i in range(genome_tracker_new['num_genes']):
        if genome_tracker_new['rnase_{}'.format(i)]['start'] > 0:
            plasmid.add_rnase_site(name='r{}'.format(i), start=genome_tracker_new['rnase_{}'.format(i)]['start'], stop=genome_tracker_new['rnase_{}'.format(i)]['stop'], rate=genome_tracker_new['rnase_{}'.format(i)]['current_strength'])

    #Terminators
    for i in range(1, genome_tracker_new['num_genes']+1):
        if genome_tracker_new['terminator_{}'.format(i)]['start'] > 0:
            plasmid.add_terminator(name="t{}".format(i), start=genome_tracker_new['terminator_{}'.format(i)]['start'], stop=genome_tracker_new['terminator_{}'.format(i)]['stop'],
                                   efficiency={"rnapol": genome_tracker_new['terminator_{}'.format(i)]['current_strength']})

    #Genes
    for i in range(1, genome_tracker_new['num_genes']+1):
        if genome_tracker_new['gene_{}'.format(i)]['start'] > 0:
            plasmid.add_gene(name="protein{}".format(i), start=genome_tracker_new['gene_{}'.format(i)]['start'], stop=genome_tracker_new['gene_{}'.format(i)]['stop'],
                             rbs_start=(genome_tracker_new['gene_{}'.format(i)]['start']-30), rbs_stop=genome_tracker_new['gene_{}'.format(i)]['start']-1, rbs_strength=1e7)

    #Run pinetree simulation
    sim.register_genome(plasmid)
    supress = SupressOutput()
    with supress:
        sim.simulate(time_limit=max_time+1, time_step=1, output=output_dir+'expression_pattern.tsv')

    return
Ejemplo n.º 6
0
def execute(output):

    sim = pt.Model(cell_volume=8e-16)
    sim.seed(34)
    sim.add_polymerase(name="rnapol", copy_number=10, speed=30, footprint=10)
    sim.add_ribosome(copy_number=100,
                     speed=20, footprint=10)

    plasmid = pt.Genome(name="T7", length=305,
                        transcript_degradation_rate=1e-2,
                        transcript_degradation_rate_ext=1e-2,
                        rnase_footprint=9,
                        rnase_speed=20)

    # plasmid = pt.Genome(name="T7", length=305)

    plasmid.add_promoter(name="phi1", start=1, stop=10,
                         interactions={"rnapol": 2e8})
    plasmid.add_terminator(name="t1", start=304, stop=305,
                           efficiency={"rnapol": 1.0})
    plasmid.add_gene(name="proteinX", start=30, stop=99,
                     rbs_start=(30 - 10), rbs_stop=30, rbs_strength=1e7)
    # plasmid.add_promoter(name="phi2", start=100, stop=109,
    #                      interactions={"rnapol": 2e8})
    # plasmid.add_terminator(name="t1", start=98, stop=99,
    #                        efficiency={"rnapol": 1.0})
    # plasmid.add_rnase_site(100, 110)
    plasmid.add_gene(name="proteinY", start=120, stop=199,
                     rbs_start=(120 - 10), rbs_stop=120, rbs_strength=1e7)
    # plasmid.add_promoter(name="phi3", start=200, stop=209,
    #                     interactions={"rnapol": 2e8})
    plasmid.add_gene(name="proteinZ", start=220, stop=300,
                     rbs_start=(220 - 10), rbs_stop=220, rbs_strength=1e7)

    sim.register_genome(plasmid)

    sim.simulate(time_limit=500, time_step=1, output=output + "counts.tsv")
def phage_model(input,
                output=None,
                time=1500,
                verbose=True,
                seed=None,
                multiplicity=1,
                use_rnases=False):

    if (seed != None) and (0 > seed > 2147483647):
        raise ValueError(
            f"Seed must be between 0 and 2147483647. You used '{seed}'.")

    sim = pt.Model(cell_volume=CELL_VOLUME)

    if not output:
        output = ".".join(input.split(".")[:-1])
    # Make the directory for output if it doesnt exist
    output_dir = output.replace("\\", "/")
    output_dir = "/".join(output_dir.split("/")[:-1])
    if output_dir != '' and not os.path.exists(output_dir):
        os.makedirs(output_dir)

    # Log relevant information
    if output[-1] == "/" or output[-1] == ".":
        log_output = f"{output}pinetree.log"
    else:
        log_output = f"{output}.log"
    logger = Logger(log_output=f"{log_output}", verbose=verbose)

    # Use just the first record
    all_records = list(SeqIO.parse(input, "genbank"))
    if len(all_records) > 1:
        logger.normal("Ignored extra sequence records in input file.")
    record = all_records[0]
    genome_length = len(record.seq)

    start_time = datetime.datetime.utcnow()
    logger.normal("[Pinetree] Pinetree T7 Genome Simulation")
    logger.normal("barricklab/igem2020 Fork")
    # Try and find a git repo and log its last commit
    if os.path.exists(".git/refs/heads/master"):
        git_master_path = ".git/refs/heads/master"
    elif os.path.exists("../.git/refs/heads/master"):
        git_master_path = "../.git/refs/heads/master"
    else:
        git_master_path = ""
    if git_master_path:
        with open(git_master_path, 'r') as file:
            commit_hash = file.readline().strip()
            logger.normal(f"Last commit: {commit_hash}")
    logger.normal(f"Script and simulation started at {start_time} UTC")

    # --- Feature Acquisition and validation  VVV

    promoters = Promoters()

    feature_dict = {}
    for i, feature in enumerate(record.features):  # Accuasition
        start = feature.location.start.position + 1
        stop = feature.location.end.position
        name = ''
        feature_type = ''
        interactions = None
        skip = False
        source_feature = feature
        rate = 0
        if 'name' in feature.qualifiers:
            name = feature.qualifiers["name"][0]
        elif "note" in feature.qualifiers:
            name = feature.qualifiers["note"][0]
        if feature.type == "regulatory":
            if "promoter" in feature.qualifiers["regulatory_class"]:
                length = stop - start
                if length < 35:
                    start = start - 35
                interactions = promoters.get_interaction(name)
                feature_type = "promoter"
            if "terminator" in feature.qualifiers["regulatory_class"]:
                interactions = get_terminator_interactions(name)
                feature_type = "terminator"
        elif feature.type == "CDS":
            feature_type = "cds"
        elif feature.type == "misc_structure":
            feature_type = "misc"
            if "rnase" in name.lower():
                feature_type = "rnase_site"
                for site_name in RNAse_Table.keys():
                    if site_name == name.split(" ")[-1] or site_name == name:
                        rate = RNAse_Table[site_name]
                        if rate == 0:
                            skip = True

        else:
            feature_type = None

        if feature_type:
            feature_dict[i] = {
                "start": start,
                "stop": stop,
                "name": name,
                "type": feature_type,
                "interactions": interactions,
                "skip": skip,
                "source_feature": source_feature,
                "rate": rate
            }

    # TODO: Add more feature validation
    if use_rnases == False:
        logger.normal(
            "Not considering RNase activity (use flag -r to consider)")
    else:
        logger.normal(f"Considering RNase activity.")

    for feature in feature_dict.items():  # Validation
        feature = feature[1]
        if feature['skip']:
            continue
        if feature['name'] in IGNORE_REGULATORY or feature[
                'name'] in IGNORE_CDS:
            feature['skip'] = True
            logger.log(
                f"Ignored feature {feature['name']} ({feature['start']} - {feature['stop']})"
            )
            continue
        if 'pseudo' in feature['source_feature'].qualifiers.keys():
            logger.warn(
                f"Found {feature['name']} with flag 'pseudo'. Ignoring.")
            feature['skip'] = True
            continue
        if feature['stop'] - feature['start'] < 50 and feature['type'] in [
                'gene', 'cds'
        ]:
            logger.warn(
                f"Found {feature['type'], feature['name']} that is tiny! ({feature['start']} - {feature['stop']})"
            )
        if feature['type'] == "rnase_site" and use_rnases == False:
            feature['skip'] = True
            continue
        if feature['type'] == "rnase_site" and feature['rate'] == 0:
            logger.log(
                f"{feature['name']} has no explicit binding rate. Defaulting.")
            feature['rate'] = RNase_III["rate"]

    # -- Feature Acquisition Validation  ^^^

    # -- Set up masks
    mask_interactions = [
        "gp1", "gp1+gp3.5", "ecolipol", "ecolipol-p", "ecolipol-2",
        "ecolipol-2-p"
    ]

    logger.normal("Implemented masks and weighting")

    # -- Set up masks

    # -- Add Features to Sim  VVV
    phage_genomes = {}
    for infection in range(0, multiplicity):
        weights = [0.0] * len(record.seq)
        if use_rnases:
            phage_genomes[infection] = pt.Genome(
                name=f"phage_{infection}",
                length=genome_length,
                transcript_degradation_rate_ext=RNase_E['rate'],
                rnase_speed=RNase_E['speed'],
                rnase_footprint=RNase_E['footprint'])
        else:
            phage_genomes[infection] = pt.Genome(name=f"phage_{infection}",
                                                 length=genome_length)
        output_feature_dict = dict()
        for feature in feature_dict.items():
            feature_contents = feature[1]
            if feature_contents['skip']:
                continue
            elif feature_contents['type'] == "promoter":
                phage_genomes[infection].add_promoter(
                    feature_contents['name'], feature_contents['start'],
                    feature_contents['stop'], feature_contents['interactions'])
                logger.log(
                    f"Added promoter feature: {feature_contents['name']}, Start: {feature_contents['start']}, Stop: {feature_contents['stop']}"
                )
                output_feature_dict[copy.copy(feature[0])] = copy.deepcopy(
                    feature[1])
            elif feature_contents['type'] == "terminator":
                phage_genomes[infection].add_terminator(
                    feature_contents['name'], feature_contents['start'],
                    feature_contents['stop'], feature_contents['interactions'])
                logger.log(
                    f"Added terminator feature: {feature_contents['name']}, Start: {feature_contents['start']}, Stop: {feature_contents['stop']}"
                )
                output_feature_dict[copy.copy(feature[0])] = copy.deepcopy(
                    feature[1])
            elif feature_contents['type'] == "cds":
                phage_genomes[infection].add_gene(
                    name=feature_contents['name'],
                    start=feature_contents['start'],
                    stop=feature_contents['stop'],
                    rbs_start=feature_contents['start'] - 30,
                    rbs_stop=feature_contents['start'],
                    rbs_strength=1e7)
                weights = compute_cds_weights(
                    record, feature_contents['source_feature'], 1.0, weights)
                logger.log(
                    f"Added CDS feature: {feature_contents['name']}, Start: {feature_contents['start']}, Stop: {feature_contents['stop']}"
                )
                output_feature_dict[copy.copy(feature[0])] = copy.deepcopy(
                    feature[1])
            elif feature_contents['type'] == "rnase_site":
                phage_genomes[infection].add_rnase_site(
                    name=feature_contents['name'],
                    start=feature_contents['start'],
                    stop=feature_contents['stop'] + 10,
                    rate=feature_contents['rate'])
                logger.log(
                    f"Added RNase site: {feature_contents['name']}, Start: {feature_contents['start']}, Stop: {feature_contents['stop']}"
                )
                output_feature_dict[copy.copy(feature[0])] = copy.deepcopy(
                    feature[1])
            else:
                continue
        phage_genomes[infection].add_mask(500, mask_interactions)
        norm_weights = normalize_weights(weights)
        phage_genomes[infection].add_weights(norm_weights)
        sim.register_genome(phage_genomes[infection])
        logger.log(f"Registered phage genome #{infection+1}")
    # -- Add Featues to Sim  ^^^
    # -- Output Features to CSV VVVVV
    out_columns = ['name', 'type', 'start', 'end', 'strength']
    out_data = []
    for feature in feature_dict.items():
        feature_contents = feature[1]
        if feature_contents['skip'] == True:
            continue
        feature_contents['strength'] = None
        if feature_contents['type'] == "promoter":
            promoter_interaction_result = promoters.get_interaction(
                feature_contents['name'])
            if 'ecolipol' in promoter_interaction_result.keys():
                feature_contents['strength'] = promoter_interaction_result[
                    'ecolipol']
            elif 'gp1' in promoter_interaction_result.keys():
                feature_contents['strength'] = promoter_interaction_result[
                    'gp1']
            else:
                feature_contents['strength'] = 0
        elif feature_contents['type'] == "rnase_site":
            feature_contents['strength'] = feature_contents['rate']
        out_data.append({
            'name': feature_contents['name'],
            'type': feature_contents['type'],
            'start': feature_contents['start'],
            'end': feature_contents['stop'],
            'strength': feature_contents['strength']
        })
    if output[-1] == "/" or output[-1] == ".":
        out_features_filename = f"{output}features.csv"
    else:
        out_features_filename = f"{output}.features.csv"
    with open(out_features_filename, 'w') as csv_file_object:
        writer = csv.DictWriter(csv_file_object, fieldnames=out_columns)
        writer.writeheader()
        for contents in out_data:
            writer.writerow(contents)
    # -- Output Features to CSV ^^^^^

    logger.normal("Registered genome features")

    mask_interactions = [
        "gp1", "gp1+gp3.5", "ecolipol", "ecolipol-p", "ecolipol-2",
        "ecolipol-2-p"
    ]

    sim.add_polymerase("gp1", 35, 230, 0)
    sim.add_polymerase("gp1+gp3.5", 35, 230, 0)
    sim.add_polymerase("ecolipol", 35, 45, 0)
    sim.add_polymerase("ecolipol-p", 35, 45, 0)
    sim.add_polymerase("ecolipol-2", 35, 45, 0)
    sim.add_polymerase("ecolipol-2-p", 35, 45, 0)

    sim.add_ribosome(30, 30, 0)

    sim.add_species("bound_ribosome", 10000)

    sim.add_species("bound_ecolipol", 1800)
    sim.add_species("bound_ecolipol_p", 0)
    sim.add_species("ecoli_genome", 0)
    sim.add_species("ecoli_transcript", 0)

    sim.add_reaction(1e6, ["ecoli_transcript", "__ribosome"],
                     ["bound_ribosome"])

    sim.add_reaction(0.04, ["bound_ribosome"],
                     ["__ribosome", "ecoli_transcript"])

    sim.add_reaction(0.001925, ["ecoli_transcript"], ["degraded_transcript"])

    sim.add_reaction(1e7, ["ecolipol", "ecoli_genome"], ["bound_ecolipol"])

    sim.add_reaction(0.3e7, ["ecolipol-p", "ecoli_genome"],
                     ["bound_ecolipol_p"])

    sim.add_reaction(0.04, ["bound_ecolipol"],
                     ["ecolipol", "ecoli_genome", "ecoli_transcript"])

    sim.add_reaction(0.04, ["bound_ecolipol_p"],
                     ["ecolipol-p", "ecoli_genome", "ecoli_transcript"])

    sim.add_reaction(3.8e7, ["gp0.7", "ecolipol"], ["ecolipol-p", "gp0.7"])

    sim.add_reaction(3.8e7, ["gp0.7", "ecolipol+gp2"],
                     ["ecolipol+gp2-p", "gp0.7"])

    sim.add_reaction(3.8e7, ["gp2", "ecolipol"], ["ecolipol+gp2"])

    sim.add_reaction(3.8e7, ["gp2", "ecolipol-p"], ["ecolipol+gp2-p"])

    sim.add_reaction(1.1, ["ecolipol+gp2-p"], ["gp2", "ecolipol-p"])

    sim.add_reaction(1.1, ["ecolipol+gp2"], ["gp2", "ecolipol"])

    logger.normal("Registered reactions")

    logger.normal("Running simulation")

    if not seed:
        seed = random.randint(0, 2147483647)
    sim.seed(seed)
    logger.normal(f"Random seed was set to {seed}")

    if output[-1] == "/" or output[-1] == ".":
        sim_output = f"{output}phage.counts.tsv"
    else:
        sim_output = f"{output}.counts.tsv"

    # -- Running the actual sim. VVVV
    # Note: Multiprocessing necessary for working keyboard interrupts.
    try:
        sim_process = multiprocessing.Process(target=sim.simulate,
                                              kwargs={
                                                  'time_limit': time,
                                                  'time_step': 5,
                                                  'output': sim_output
                                              })
        sim_process.start()
        sim_process.join()
    except KeyboardInterrupt:
        sim_process.terminate()
        with open(sim_output, 'r') as outfile:
            for line in outfile:
                pass
            last_file_line = line
        interrupt_time = str(last_file_line).split("\t")[0]
        logger.warn(
            f'Received keyboard interruption. Simulation reached time {interrupt_time}'
        )
        finish_time = datetime.datetime.utcnow()
        run_time = (finish_time - start_time).total_seconds()
        logger.normal(f"Simulation interrupted after {run_time / 60} minutes.")
        exit(0)
    except TypeError:
        logger.warn(
            "There was a problem with multiprocessing. Keyboard Interrupts won't work, but the simulation should still run."
        )
        sim.simulate(time_limit=time, time_step=5, output=sim_output)

    finish_time = datetime.datetime.utcnow()
    run_time = (finish_time - start_time).total_seconds()

    logger.normal(f"Simulation completed in {run_time/60} minutes.")
def main():
    sim = pt.Model(cell_volume=CELL_VOLUME)

    # Download T7 wild-type genbank records
    Entrez.email = "*****@*****.**"
    handle = Entrez.efetch(db="nuccore",
                           id=["NC_001604"],
                           rettype="gb",
                           retmode="text")

    record = SeqIO.read(handle, "genbank")
    genome_length = len(record.seq)
    phage = pt.Genome(name="phage", length=genome_length)

    for feature in record.features:
        weights = [1.0] * len(record.seq)
        # Convert to inclusive genomic coordinates
        start = feature.location.start.position + 1
        stop = feature.location.end.position
        name = ''
        if "note" in feature.qualifiers:
            name = feature.qualifiers["note"][0]
        # Grab promoters and terminators
        if feature.type == "regulatory":
            if name in IGNORE_REGULATORY:
                continue
            # Construct promoter
            if "promoter" in feature.qualifiers["regulatory_class"]:
                length = stop - start
                if length < 35:
                    start = start - 35
                interactions = get_promoter_interactions(name)
                phage.add_promoter(name, start, stop, interactions)
            # Construct terminator params
            if "terminator" in feature.qualifiers["regulatory_class"]:
                interactions = get_terminator_interactions(name)
                phage.add_terminator(name, start, stop, interactions)
        # Grab genes/CDSes
        if feature.type == "gene":
            if name in IGNORE_GENES:
                continue
            if name in RELABEL_GENES:
                name = RELABEL_GENES[name]
            # Construct CDS parameters for this gene
            # print(name)
            phage.add_gene(name=name,
                           start=start,
                           stop=stop,
                           rbs_start=start - 30,
                           rbs_stop=start,
                           rbs_strength=1e7)
        # Recode gene 10A
        if name == "gene 10A":
            gene10_start = start
            gene10_stop = stop

    weights[gene10_start:gene10_stop] = [0.2] * (gene10_stop - gene10_start)

    mask_interactions = [
        "rnapol-1", "rnapol-3.5", "ecolipol", "ecolipol-p", "ecolipol-2",
        "ecolipol-2-p"
    ]
    phage.add_mask(500, mask_interactions)

    phage.add_weights(weights)

    sim.register_genome(phage)

    sim.add_polymerase("rnapol-1", 35, 230, 0)
    sim.add_polymerase("rnapol-3.5", 35, 230, 0)
    sim.add_polymerase("ecolipol", 35, 45, 0)
    sim.add_polymerase("ecolipol-p", 35, 45, 0)
    sim.add_polymerase("ecolipol-2", 35, 45, 0)
    sim.add_polymerase("ecolipol-2-p", 35, 45, 0)

    sim.add_ribosome(30, 30, 0)

    sim.add_species("bound_ribosome", 10000)

    sim.add_species("bound_ecolipol", 1800)
    sim.add_species("bound_ecolipol_p", 0)
    sim.add_species("ecoli_genome", 0)
    sim.add_species("ecoli_transcript", 0)

    sim.add_reaction(1e6, ["ecoli_transcript", "__ribosome"],
                     ["bound_ribosome"])

    sim.add_reaction(0.04, ["bound_ribosome"],
                     ["__ribosome", "ecoli_transcript"])

    sim.add_reaction(0.001925, ["ecoli_transcript"], ["degraded_transcript"])

    sim.add_reaction(1e7, ["ecolipol", "ecoli_genome"], ["bound_ecolipol"])

    sim.add_reaction(0.3e7, ["ecolipol-p", "ecoli_genome"],
                     ["bound_ecolipol_p"])

    sim.add_reaction(0.04, ["bound_ecolipol"],
                     ["ecolipol", "ecoli_genome", "ecoli_transcript"])

    sim.add_reaction(0.04, ["bound_ecolipol_p"],
                     ["ecolipol-p", "ecoli_genome", "ecoli_transcript"])

    sim.add_reaction(3.8e7, ["protein_kinase-0.7", "ecolipol"],
                     ["ecolipol-p", "protein_kinase-0.7"])

    sim.add_reaction(3.8e7, ["protein_kinase-0.7", "ecolipol-2"],
                     ["ecolipol-2-p", "protein_kinase-0.7"])

    sim.add_reaction(3.8e7, ["gp-2", "ecolipol"], ["ecolipol-2"])

    sim.add_reaction(3.8e7, ["gp-2", "ecolipol-p"], ["ecolipol-2-p"])

    sim.add_reaction(1.1, ["ecolipol-2-p"], ["gp-2", "ecolipol-p"])

    sim.add_reaction(1.1, ["ecolipol-2"], ["gp-2", "ecolipol"])

    sim.add_reaction(3.8e9, ["lysozyme-3.5", "rnapol-1"], ["rnapol-3.5"])

    sim.add_reaction(3.5, ["rnapol-3.5"], ["lysozyme-3.5", "rnapol-1"])

    sim.seed(54)

    sim.simulate(time_limit=1200,
                 time_step=5,
                 output="phage_model_knockout_recoded.tsv")
# Copy of Ben's three genes simulation setup, for reference
import pinetree as pt


sim = pt.Model(cell_volume=8e-16)
sim.seed(34)
sim.add_polymerase(name="rnapol", copy_number=4, speed=40, footprint=10)
sim.add_ribosome(copy_number=100, speed=30, footprint=10)

plasmid = pt.Genome(name="plasmid", length=450,
#                    transcript_degradation_rate=1e-2,
                    transcript_degradation_rate_ext=1e-3,
                    rnase_speed=20,
                    rnase_footprint=10)

plasmid.add_promoter(name="p1", start=1, stop=10, interactions={"rnapol": 2e10})
plasmid.add_terminator(name="t1", start=449, stop=450, efficiency={"rnapol": 1.0})
plasmid.add_gene(name="proteinX", start=26, stop=148, rbs_start=(26 - 15), rbs_stop=26, rbs_strength=1e7)
plasmid.add_gene(name="proteinY", start=26 + 150, stop=148 + 150, rbs_start=(26 - 15 + 150), rbs_stop=26 + 150, rbs_strength=1e7)
plasmid.add_promoter(name="p2", start=141 + 150, stop=150 + 150, interactions={"rnapol": 2e10})
plasmid.add_rnase_site(name="r1", start=150 + 150, stop=160 + 150, rate=1e-2)
plasmid.add_gene(name="proteinZ", start=165 + 150, stop=298 + 150, rbs_start=(165 - 15 + 150), rbs_stop=165 + 150, rbs_strength=1e7)

sim.register_genome(plasmid)

sim.simulate(time_limit=240, time_step=1, output="three_genes_rnase.tsv")
    
Ejemplo n.º 10
0
def main():
    sim = pt.Model(cell_volume=CELL_VOLUME)

    record = SeqIO.read("T7_genome.gb", "genbank")
    genome_length = len(record.seq)
    phage = pt.Genome(name="phage", length=genome_length)

    for feature in record.features:
        weights = [0.0] * len(record.seq)
        # Convert to inclusive genomic coordinates
        start = feature.location.start.position + 1
        stop = feature.location.end.position
        name = ''
        if "note" in feature.qualifiers:
            name = feature.qualifiers["note"][0]
        # Grab promoters and terminators
        if feature.type == "regulatory":
            if name in IGNORE_REGULATORY:
                continue
            # Construct promoter
            if "promoter" in feature.qualifiers["regulatory_class"]:
                length = stop - start
                if length < 35:
                    start = start - 35
                interactions = get_promoter_interactions(name)
                phage.add_promoter(name, start, stop, interactions)
            # Construct terminator params
            if "terminator" in feature.qualifiers["regulatory_class"]:
                interactions = get_terminator_interactions(name)
                phage.add_terminator(name, start, stop, interactions)
        # Grab genes/CDSes
        if feature.type == "gene":
            if name in IGNORE_GENES:
                continue
            if name in RELABEL_GENES:
                name = RELABEL_GENES[name]
            # Construct CDS parameters for this gene
            phage.add_gene(name=name, start=start, stop=stop,
                           rbs_start=start - 30, rbs_stop=start, rbs_strength=1e7)
        if feature.type == "CDS":
            weights = compute_cds_weights(record, feature, 1.0, weights)

    mask_interactions = ["rnapol-1", "rnapol-3.5",
                         "ecolipol", "ecolipol-p", "ecolipol-2", "ecolipol-2-p"]
    phage.add_mask(500, mask_interactions)

    norm_weights = normalize_weights(weights)
    phage.add_weights(norm_weights)

    sim.register_genome(phage)

    sim.add_polymerase("rnapol-1", 35, 230, 0)
    sim.add_polymerase("rnapol-3.5", 35, 230, 0)
    sim.add_polymerase("ecolipol", 35, 45, 0)
    sim.add_polymerase("ecolipol-p", 35, 45, 0)
    sim.add_polymerase("ecolipol-2", 35, 45, 0)
    sim.add_polymerase("ecolipol-2-p", 35, 45, 0)

    sim.add_ribosome(30, 30, 0)

    sim.add_species("bound_ribosome", 10000)

    sim.add_species("bound_ecolipol", 1800)
    sim.add_species("bound_ecolipol_p", 0)
    sim.add_species("ecoli_genome", 0)
    sim.add_species("ecoli_transcript", 0)

    sim.add_reaction(1e6, ["ecoli_transcript", "__ribosome"], [
                     "bound_ribosome"])

    sim.add_reaction(0.04, ["bound_ribosome"], [
                     "__ribosome", "ecoli_transcript"])

    sim.add_reaction(0.001925, ["ecoli_transcript"], ["degraded_transcript"])

    sim.add_reaction(1e7, ["ecolipol", "ecoli_genome"], ["bound_ecolipol"])

    sim.add_reaction(
        0.3e7, ["ecolipol-p", "ecoli_genome"], ["bound_ecolipol_p"])

    sim.add_reaction(0.04, ["bound_ecolipol"], [
                     "ecolipol", "ecoli_genome", "ecoli_transcript"])

    sim.add_reaction(0.04, ["bound_ecolipol_p"], [
                     "ecolipol-p", "ecoli_genome", "ecoli_transcript"])

    sim.add_reaction(3.8e7, ["protein_kinase-0.7", "ecolipol"],
                     ["ecolipol-p", "protein_kinase-0.7"])

    sim.add_reaction(3.8e7, ["protein_kinase-0.7", "ecolipol-2"],
                     ["ecolipol-2-p", "protein_kinase-0.7"])

    sim.add_reaction(3.8e7, ["gp-2", "ecolipol"], ["ecolipol-2"])

    sim.add_reaction(3.8e7, ["gp-2", "ecolipol-p"], ["ecolipol-2-p"])

    sim.add_reaction(1.1, ["ecolipol-2-p"], ["gp-2", "ecolipol-p"])

    sim.add_reaction(1.1, ["ecolipol-2"], ["gp-2", "ecolipol"])

    sim.add_reaction(3.8e9, ["lysozyme-3.5", "rnapol-1"], ["rnapol-3.5"])

    sim.add_reaction(3.5, ["rnapol-3.5"], ["lysozyme-3.5", "rnapol-1"])

    sim.seed(34)

    sim.simulate(time_limit=1500, time_step=5, output="phage_counts.tsv")
def construct_genome(config_file):
    """
    Initialize a Genome object from a yaml config file.
    """
    data = _load_conf(config_file)

    constructor_args = data["genome"]
    genomes = []
    # if the simulation contains more than one phage, we'll create them all now
    for i in range(constructor_args["copy_number"]):
        if "transcript_degradation_rate_ext" in constructor_args:
            genome = pt.Genome(
                name=constructor_args["name"],
                length=constructor_args["length"],
                transcript_degradation_rate_ext=float(
                    constructor_args["transcript_degradation_rate_ext"]),
                rnase_speed=constructor_args["rnase_speed"],
                rnase_footprint=constructor_args["rnase_footprint"])
        else:
            genome = pt.Genome(name=constructor_args["name"],
                               length=constructor_args["length"])

        ## add elements to the genome

        if "promoters" in data:
            promoters = data["promoters"]
            for promoter in promoters:
                start = promoter["start"]
                stop = promoter["stop"]
                length = stop - start
                if length < 35:
                    start = start - 35
                genome.add_promoter(name=promoter["name"],
                                    start=start,
                                    stop=stop,
                                    interactions=promoter["interactions"])

        if "genes" in data:
            genes = data["genes"]
            for gene in genes:
                start = gene["start"]
                genome.add_gene(name=gene["name"],
                                start=start,
                                stop=gene["stop"],
                                rbs_start=start + gene["rbs"],
                                rbs_stop=start,
                                rbs_strength=float(gene["rbs_strength"]))

        if "terminators" in data:
            terminators = data["terminators"]
            for terminator in terminators:
                genome.add_terminator(name=terminator["name"],
                                      start=terminator["start"],
                                      stop=terminator["stop"],
                                      efficiency=terminator["interactions"])

        if "rnase_sites" in data:
            rnase_sites = data["rnase_sites"]
            for rnase_site in rnase_sites:
                genome.add_rnase_site(name=rnase_site["name"],
                                      start=rnase_site["start"],
                                      stop=rnase_site["start"] + 10,
                                      rate=float(rnase_site["rnase_strength"]))

        if "mask" in data:
            mask = data["mask"]
            genome.add_mask(start=mask["start"],
                            interactions=mask["interactions"])

        if "opt_codon_factor" in data:
            codon_weights = weights.t7_weights(data["opt_codon_factor"])
            genome.add_weights(codon_weights)

        genomes.append(genome)

    return genomes