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")
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)
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)
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)
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
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")
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