Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

MetropolisMonteCarloIntegrator does not work when I apply steps over time. #724

Open
BlackPianoCat opened this issue Feb 17, 2024 · 0 comments

Comments

@BlackPianoCat
Copy link

BlackPianoCat commented Feb 17, 2024

I am trying to create a Monte Carlo simulation that I have some structure and I apply Gaussian displacements over time. I thought that MetropolisMonteCarloIntegrator is appropriate class to do something like that. I have a code like the following one,

pdb = PDBxFile(self.save_path+'MultiEM_init.cif') if init_struct_path==None or build_init_mmcif else PDBxFile(init_struct_path)
self.mass_center = np.average(get_coordinates_mm(pdb.positions),axis=0)
forcefield = ForceField('forcefields/ff.xml')
self.system = forcefield.createSystem(pdb.topology)
integrator = MetropolisMonteCarloIntegrator(Temperature,0.2,5)
# integrator = mm.LangevinIntegrator(Temperature, 0.05, 10 * mm.unit.femtosecond)

 # Import forcefield
print('\nImporting forcefield...')
self.add_forcefield()
print('---Done!---')

# Run simulation / Energy minimization
print('\nEnergy minimization...')
platform = mm.Platform.getPlatformByName(pltf)
simulation = Simulation(pdb.topology, self.system, integrator, platform)
simulation.reporters.append(StateDataReporter(stdout, (MD_steps*sim_step)//20, step=True, totalEnergy=True, potentialEnergy=True, temperature=True))
simulation.reporters.append(DCDReporter(self.save_path+'MultiEM_annealing.dcd', 5))
simulation.context.setPositions(pdb.positions)
simulation.context.setVelocitiesToTemperature(Temperature, 0)
current_platform = simulation.context.getPlatform()
print(f"Simulation will run on platform: {current_platform.getName()}.")
start_time = time.time()
simulation.minimizeEnergy()
state = simulation.context.getState(getPositions=True)
PDBxFile.writeFile(pdb.topology, state.getPositions(), open(self.save_path+'MultiEM_minimized.cif', 'w'))
print(f"--- Energy minimization done!! Executed in {(time.time() - start_time)/60:.2f} minutes. :D ---\n")

Until here everything is ok. Energy is minimized. And now I do simulated annealing, and I use it as I use any other integrator in OpenMM,

print('Running Simulated Annealing...')
start = time.time()
for i in range(MD_steps):
    T_i  = Temperature-i/MD_steps*(Temperature-Temp_f)
    simulation.integrator.setTemperature(T_i)
    simulation.step(sim_step)
    if (i*sim_step)%10==0:
        self.state = simulation.context.getState(getPositions=True)
        PDBxFile.writeFile(pdb.topology, self.state.getPositions(), open(self.save_path+f'ensembles/ens_{i//100+1}.cif', 'w'))
end = time.time()
elapsed = end - start
state = simulation.context.getState(getPositions=True)
PDBxFile.writeFile(pdb.topology, state.getPositions(), open(self.save_path+'MultiEM_afterMD.cif', 'w'))
print(f'Everything is done! Simulation finished succesfully!\nMD finished in {elapsed/60:.2f} minutes.\n')

And here the structure remains unchanged and the potential energy remains the same.
what is wrong? Is there any simple way to integrate like Langevin integrator? Or should I use these samplers that you have in documentation, instead of Simulation class? I would like to have both .dcd trajectory and an ensemble of structures if it is possible.

@BlackPianoCat BlackPianoCat changed the title MetropolisMonteCarloIntegrator does not work when I apply time steps over time. MetropolisMonteCarloIntegrator does not work when I apply steps over time. Feb 17, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant