def finish_initialization(experiment): """Finish an initialization""" # Sharing is already started and the structures and energies have already # been loaded into the Experiment # Make the initial experiment summary experiment["Summary"] = "Initial Calculations\n" # Determine when they started f = open(experiment["Folder"]+"initialize/Group1/Group1_Summary.txt","r") for line in f: if line.startswith("Started"): experiment["Summary"] += line break f.close() # Include the energies of each Design Group for group in experiment: experiment["Summary"] += SHARING.format_energies(\ experiment["Energies"][group.number], group.number, False) # Create the initial folder in results SHARING.output_best(experiment, 0, None) # Figure out the name of the output file if experiment["Type"] == "Mutator": folder = experiment["Folder"] + "results/wildtype/" else: folder = experiment["Folder"] + "results/initial/" # List the energies of each Target Molecule, too if experiment["Energy Calculation"] == "Binding": for molecule in experiment[0]: if not molecule.design: name = experiment["Folder"] + "initialize/Current/Molecule" name += molecule.name + "_Energy.txt" f = open(name, "r") energy = f.readline().split()[2] f.close() experiment["Summary"] += "The energy of Target Molecule " experiment["Summary"] += molecule.name + " is " + energy experiment["Summary"] += " kcal / mol\n" # Copy the file to the output folder os.system("cp " + name + " " + folder) # Move to the Experiment's folder os.chdir(experiment["Folder"]) # Try to make the current folder try: os.mkdir("Current") except OSError: pass # Write the Structures to the Current folder SHARING.output_Current(experiment, "./Current/", None, 0) experiment["Last Update"] = 0 # Start a refinment REFINEMENT.Start(experiment, 0, None) # Create the initial summary file experiment["Summary"] += "Ended" + SHARING.time_stamp() name = SHARING.summary_name(experiment["Folder"]) f = open(name, "w") f.write(experiment["Summary"]) f.close() # Remove the initialization folder os.system("rm -rf initialize") # End the sharing that was started elsewhere SHARING.End(experiment)
def Calculate_Energy(experiment, gn = None): """Calculate the energies of an IPRO iteration""" # Do the standard introductory checks if not isinstance(experiment, EXPERIMENT.Experiment): text = "The Calculate Energy function requires an Experiment class " text += "object as its input." raise IPRO_Error(text) refinement = refinement_check(experiment, gn) if refinement: return {}, refinement # Start timing startTime = time.time() # Store the energies here energies = {} # Loop through the Design Groups for group in experiment: if gn not in [None, group.number]: continue # Time the group groupTime = time.time() # initialize the dictionary energies[group.number] = {} # If there are no Target Molecules, it is impossible to calculate an # interaction energy do = False for molecule in group: if not molecule.design: do = True break # Calculate the energies if experiment["Force Field"] == "CHARMM": complex = CHARMM.Energy(group, experiment, "all") energies[group.number]["Complex"] = complex if do: design = CHARMM.Energy(group, experiment, True) target = CHARMM.Energy(group, experiment, False) energies[group.number]["Interaction"] = complex-design-target else: text = "The Calculate Energy function does not support the " text += str(experiment["Force Field"]) + " force field." raise IPRO_Error(text) # update the summary if gn == None: experiment["Summary"] += SHARING.summary_update(groupTime, \ "Energy Calculation for Design Group " + str(group.number)) experiment["Summary"] +=SHARING.format_energies(energies[group.number],\ group.number, False) experiment["Summary"] += SHARING.summary_update(startTime, \ "The Calculate Energy function") return energies, refinement
def initialize_molecule(experiment, mn): """Initialize a Molecule""" # Create the folder's name folder = "Molecule" + mn do = SHARING.claim_calculations(folder) # If this processor is doing the calculations if do: # Make a summary experiment["Summary"] = "Started" + SHARING.time_stamp() # Move into the folder os.chdir(folder) SHARING.copy_standard_files(experiment) # Get a unique copy of the Molecule molecule = experiment[0][mn].duplicate() for residue in molecule: residue.freedom = "FREE" # Store the calculated energies here energies = {} # Do a relaxation and energy calculation if experiment["Force Field"] == "CHARMM": CHARMM.Relaxation(molecule, experiment) energies["Complex"] = CHARMM.Energy(molecule, experiment) else: text = "The initialize molecule function does not support the " text += str(experiment["Force Field"]) + " force field." raise IPRO_Error(text) # Format the energy text = SHARING.format_energies(energies) experiment["Summary"] += text # Create the summary file for the Molecule experiment["Summary"] += "Ended" + SHARING.time_stamp() name = SHARING.summary_name(SHARING.get_current()) f = open(name, "w") f.write(experiment["Summary"]) f.close() # Leave this folder, then start sharing os.chdir('../') SHARING.Start(experiment) # Output the Molecule's structure name = "./Current/" + molecule.generate_name() molecule.output(name, molecule.fileFormat, experiment["User"]) # Output the Complex energy f = open("./Current/Molecule" + mn + "_Energy.txt", "w") f.write(text) f.close() # End sharing SHARING.End(experiment)
def Finish(experiment, mn): """Finish the initial creation of a mutant""" # Sharing was started in check finish # Load the structures and energies SHARING.update_Current(experiment, "./Current/") SHARING.update_Energies(experiment, "./Current/") # Create a brief summary of the information experiment["Summary"] = '\nMutant ' + str(mn) + " Creation\n" f = open("Group1/Group1_Summary.txt", "r") for line in f: if line.startswith("Started"): experiment["Summary"] += line break f.close() # Include information about the energies for group in experiment: experiment["Summary"] += \ SHARING.format_energies(experiment["Energies"][group.number], \ group.number, False) # Put this in the overall summary os.chdir(experiment["Folder"]) name = SHARING.summary_name(SHARING.get_current()) f = open(name, "a") f.write(experiment["Summary"]) f.close() # Make a folder to do the structure refinements in folder = "mutant" + str(mn) os.mkdir(folder) folder += "/Current/" os.mkdir(folder) SHARING.output_Current(experiment, folder) SHARING.output_Energies(experiment, folder) f = open(folder + "iteration.txt", "w") f.write(str(mn)) f.close() # Delete the current folder name = "initial_mutant" + str(mn) os.system("rm -rf " + name) # End sharing SHARING.End(experiment)
def make_extra_group(experiment): """Create an extra Design Group with no Target Molecules""" # Only do this if Binding energy calculations are being done if experiment["Energy Calculation"] == "Binding": # Get all of the Design Molecules from Design Group 1 molecules = [] for molecule in experiment[1]: if molecule.design: molecules.append(molecule) # Make and store a new Design Group (which duplicates these Molecules # for run independence reasons) N = len(experiment) + 1 group = MOLECULES.DesignGroup(N, molecules, experiment["Force Field"], \ experiment["File Format"]) experiment._groupOrder.append(N) experiment._groups[N] = group n = len(experiment) # Update the Current dictionary, too experiment["Current"][n] = {} for molecule in experiment[n]: new = molecule.duplicate() experiment["Current"][n][new.name] = new # Those structures are essentially place holders at this point. However, # we do need to run an energy minimization and calculate an initial # energy for that group name = "Group" + str(n) + "_Energies.txt" SHARING.Start(experiment) # If another processor already did the calculation, we're fine if name not in os.listdir("./Current/"): # Try to make a temp directory to do the calculations in if "temp" not in os.listdir("./"): # Make the directory and move into it os.mkdir("temp") os.chdir("temp") # Stop sharing SHARING.End(experiment) # Copy in the relevant files SHARING.copy_standard_files(experiment, False) # Relax the Design Group refinement = IPRO_FUNCTIONS.Relaxation(experiment, n, True) # And calculate the energies energies, refinement = \ IPRO_FUNCTIONS.Calculate_Energy(experiment, n) # Move back up a folder os.chdir("../") # Start sharing SHARING.Start(experiment) # Store the energy text = SHARING.format_energies(energies[n]) f = open("./Current/" + name, "w") f.write(text) f.close() SHARING.output_Current(experiment, "./Current/", n) # Delete the temp folder os.system("rm -rf temp") # Otherwise, just wait else: SHARING.End(experiment) SHARING.Wait("temp", "./") SHARING.Start(experiment) # Store that complex energy f = open("./Current/" + name, "r") experiment["Energies"][n] = {"Complex": float(f.readline().split()[2])} f.close() SHARING.End(experiment)
def make_extra_group(experiment): """Create an extra Design Group with no Target Molecules""" # Only do this if Binding energy calculations are being done if experiment["Energy Calculation"] == "Binding": # Get all of the Design Molecules from Design Group 1 molecules = [] for molecule in experiment[1]: if molecule.design: molecules.append(molecule) # Make and store a new Design Group (which duplicates these Molecules # for run independence reasons) N = len(experiment) + 1 group = MOLECULES.DesignGroup(N, molecules, experiment["Force Field"], \ experiment["File Format"]) experiment._groupOrder.append(N) experiment._groups[N] = group n = len(experiment) # Update the Current dictionary, too experiment["Current"][n] = {} for molecule in experiment[n]: new = molecule.duplicate() experiment["Current"][n][new.name] = new # Those structures are essentially place holders at this point. However, # we do need to run an energy minimization and calculate an initial # energy for that group name = "Group" + str(n) + "_Energies.txt" SHARING.Start(experiment) # If another processor already did the calculation, we're fine if name not in os.listdir("./Current/"): # Try to make a temp directory to do the calculations in if "temp" not in os.listdir("./"): # Make the directory and move into it os.mkdir("temp") os.chdir("temp") # Stop sharing SHARING.End(experiment) # Copy in the relevant files SHARING.copy_standard_files(experiment, False) # Relax the Design Group refinement = IPRO_FUNCTIONS.Relaxation(experiment, n, True) # And calculate the energies energies, refinement = \ IPRO_FUNCTIONS.Calculate_Energy(experiment, n) # Move back up a folder os.chdir("../") # Start sharing SHARING.Start(experiment) # Store the energy text = SHARING.format_energies(energies[n]) f = open("./Current/" + name, "w") f.write(text) f.close() SHARING.output_Current(experiment, "./Current/", n) # Delete the temp folder os.system("rm -rf temp") # Otherwise, just wait else: SHARING.End(experiment) SHARING.Wait("temp", "./") SHARING.Start(experiment) # Store that complex energy f = open("./Current/" + name, "r") experiment["Energies"][n] = {"Complex":float(f.readline().split()[2])} f.close() SHARING.End(experiment)