18 from io
import StringIO
20 from random
import random
22 kB = (1.381 * 6.02214) / 4184.0
27 def __init__(self, cont, md, n_md_steps):
30 self.n_md_steps = n_md_steps
37 for i
in range(self.cont.get_number_of_particles()):
38 p = self.cont.get_particle(i)
40 self.oldcoords.append(d.get_coordinates())
42 def propose_move(self, prob):
43 self.md.optimize(self.n_md_steps)
46 for i
in range(self.cont.get_number_of_particles()):
47 p = self.cont.get_particle(i)
51 d.set_coordinates(self.oldcoords[i])
53 def get_number_of_steps(self):
54 return self.n_md_steps
56 def set_number_of_steps(self, nsteps):
57 self.n_md_steps = nsteps
63 def __init__(self, model):
66 def add_mover(self, mv):
72 def set_return_best(self, thing):
75 def set_move_probability(self, thing):
79 pot = self.m.evaluate(
False)
81 kin = self.mv.md.get_kinetic_energy()
84 def metropolis(self, old, new):
87 print(
": old %f new %f deltaE %f new_epot: %f"
88 % (old, new, deltaE, self.m.evaluate(
False)), end=
' ')
93 return exp(-deltaE / kT) > random()
95 def optimize(self, nsteps):
97 print(
"=== new MC call")
100 for i
in range(nsteps):
101 print(
"MC step %d " % i, end=
' ')
103 self.mv.md.assign_velocities(self.kT / kB)
105 old = self.get_energy()
107 self.mv.propose_move(1)
109 new = self.get_energy()
110 if self.metropolis(old, new):
120 def get_number_of_forward_steps(self):
126 """nonspecific methods used across all shared function objects.
128 - Their name starts with the name of the parent function (e.g.
130 - they don't store anything in the class, but instead
131 return all created objects.
132 Exceptions: the model, which is self._m
133 the statistics class, which is self.stat
134 - they store what they have to store in the model (e.g. restraints)
135 - they don't print out anything except for long routines (e.g. NOE
137 - the prior RestraintSet is added to the model when it is created, so
138 that when it is passed to another function, it is not added twice.
144 def set_checklevel(self, value):
147 def set_loglevel(self, value):
150 def m(self, name, *args, **kw):
151 "wrapper to call methods of m"
152 func = getattr(self._m, name)
153 return func(*args, **kw)
156 "moves to wd and creates model"
162 self, initpdb, top, par, selector, pairscore,
163 ff_temp=300.0, disulfides=
None, representation=
'custom'):
164 """creates a CHARMM protein representation.
165 creates the charmm force field, bonded and nonbonded.
166 - initpdb: initial structure in pdb format
167 - top is a CHARMM top.lib, read if representation=='custom' (default)
168 - par is a CHARMM par.lib
169 - selector is an instance of
170 one of the selectors of IMP.atom, for example
171 IMP.atom.NonWaterNonHydrogenPDBSelector().
172 - pairscore is an instance of a Pair Score to score the interaction
173 between two atoms. usually, it's either
174 LennardJonesDistancePairScore(0,1) or
175 RepulsiveDistancePairScore(0,1)
176 - ff_temp is the temperature at which the force field should be
178 - disulfides: if not None, a list of tuples corresponding to residue
179 numbers that should be cross-linked. Residues should be
180 cysteines, and residue numbering should start at 0.
181 - representation: 'full' : all-atom CHARMM force field
182 'heavy': heavy atom CHARMM forcefield with polar H
183 'calpha': only C alphas, ball and stick model with
184 bondlength 3.78 angstrom, beads at VdW
185 contact, and harmonic restraint between
187 'custom' (default) : read given CHARMM top and par
189 Returns: prot, ff, rsb, rs
191 - ff: the force field
192 - rsb: the RestraintSet on bonded interactions
193 - rs: the RestraintSet on nonbonded interactions. Both are weighted
198 if not prot.get_is_valid(
True):
199 raise ValueError(
"invalid hierarchy!")
200 if representation ==
'custom':
203 elif representation ==
'heavy':
205 elif representation ==
'full':
207 elif representation ==
'calpha':
210 raise NotImplementedError(representation)
211 if representation ==
'calpha':
212 print(
"setting up simplified C alpha force field")
214 for ca
in IMP.atom.get_by_type(prot, IMP.atom.ATOM_TYPE):
219 for chain
in prot.get_children():
220 residues = [(chain.get_child(i), chain.get_child(i + 1))
221 for i
in range(chain.get_number_of_children() - 1)]
222 residues = [(i.get_child(0).get_particle(),
223 j.get_child(0).get_particle())
224 for (i, j)
in residues]
225 pairs.extend(residues)
245 rsb.add_restraint(br)
246 rsb.set_weight(1.0 / (kB * ff_temp))
248 nonbonded_pair_filter.set_bonds(bonds)
251 print(
"setting up CHARMM forcefield")
256 topology = ff.create_topology(prot)
261 topology.apply_default_patches()
264 s = topology.get_segment(0)
265 dis = ff.get_patch(
'DISU')
266 for (i, j)
in disulfides:
269 r0 = s.get_residue(i)
270 r1 = s.get_residue(j)
272 r0.set_patched(
False)
274 r1.set_patched(
False)
276 print(
"added disulfide bridge between cysteines %d and %d"
283 topology.setup_hierarchy(prot)
295 ff.add_well_depths(prot)
296 nonbonded_pair_filter = r.get_pair_filter()
298 atoms = IMP.atom.get_by_type(prot, IMP.atom.ATOM_TYPE)
310 nbl.add_pair_filter(nonbonded_pair_filter)
315 return prot, ff, rsb, rs
318 """sets up a Scale particle to the initial default value. It can
319 optionally be constrained between two positive bounds, or else its
320 range is 0 to infinity.
325 scale.set_lower(lower)
327 scale.set_upper(upper)
331 """given a list of scales, returns a RestraintSet('prior') with weight
332 1.0 that contains a list of vonMisesKappaJeffreysRestraint on each
333 scale. If argument prior_rs is used, add them to that RestraintSet
338 prior_rs.set_weight(1.0)
344 """given a list of scales, returns a RestraintSet('prior') with weight
345 1.0 that contains a list of JeffreysRestraint on each scale.
346 If argument prior_rs is used, add them to that RestraintSet instead.
352 prior_rs.add_restraint(jr)
356 """given a list of scales, returns a RestraintSet('prior') with weight
357 1.0 that contains a list of vonMisesKappaConjugateRestraint on each
358 scale. If argument prior_rs is used, add them to that RestraintSet
361 if not (0 <= R <= c):
362 raise ValueError(
"parameters R and c should satisfy 0 <= R <= c")
366 prior_rs.add_restraint(
371 """scans the prot hierarchy and tries to find atom = (resno, name)
372 assumes that resno follows the same numbering as the sequence.
373 Stores already found atoms for increased speed.
375 if not hasattr(self,
'__memoized'):
376 self.__memoized = {prot: {}}
378 return self.__memoized[prot][atom]
383 residue_index=atom[0],
385 ).get_selected_particles()
387 print(
"found multiple atoms for atom %d %s!" % atom)
391 print(
"atom %d %s not found" % atom)
393 self.__memoized[prot][atom] = p0
398 Sets up a vonMises torsion angle restraint using the given kappa
399 particle as concentration parameter. Returns the restraint.
400 data is a list of observations.
406 Sets up a vonMises torsion angle restraint using the given kappa
407 particle as concentration parameter. Returns the restraint.
408 data is (mean, standard deviation).
410 raise NotImplementedError
414 Sets up a lognormal distance restraint using the given sigma and gamma.
415 Returns the restraint.
416 assumes atoms = (atom1, atom2)
417 where atom1 is (resno, atomname) and resno is the residue sequence
435 """Reads an ambiguous NOE restraint. contributions is a list of
436 (atom1, atom2) pairs, where atom1 is (resno, atomname). Sets up a
437 lognormal distance restraint using the given sigma and gamma.
438 Returns the restraint.
441 pairs = [(self.
find_atom(i, prot).get_particle(),
442 self.
find_atom(j, prot).get_particle())
for (i, j)
in
447 pairs, sigma, gamma, distance ** (-6))
451 self, prot, seqfile, tblfile, name=
'NOE', prior_rs=
None,
452 bounds_sigma=(1.0, 0.1, 100), bounds_gamma=(1.0, 0.1, 100),
453 verbose=
True, sequence_match=(1, 1)):
454 """read TBL file and store NOE restraints, using one sigma and one
455 gamma for the whole dataset. Creates the necessary uninformative
457 - prot: protein hierarchy
458 - seqfile: a file with 3-letter sequence
459 - tblfile: a TBL file with the restraints
460 - name: an optional name for the restraintset
461 - prior_rs: when not None, add new sigma and gamma to this
462 RestraintSet instance.
463 - bounds_sigma or gamma: tuple of (initial value, lower, upper bound)
464 bounds can be -1 to set to default range [0,+inf]
465 - verbose: be verbose (default True)
466 - sequence_match : (noe_start, sequence_start)
467 Returns: data_rs, prior_rs, sigma, gamma
471 print(
"Prior for the NOE Scales")
479 seqfile, first_residue_number=sequence_match[1])
480 tblr = IMP.isd.TBLReader.TBLReader(sequence,
481 sequence_match=sequence_match)
482 restraints = tblr.read_distances(tblfile,
'NOE')[
'NOE']
483 for i, restraint
in enumerate(restraints):
484 if verbose
and i % 100 == 0:
485 print(
"\r%d" % i, end=
' ')
490 if len(restraint[0]) > 1:
493 restraint[1], sigma, gamma)
496 restraint[1], sigma, gamma)
499 print(
"\r%d NOE restraints read" % i)
502 return rs, prior_rs, sigma, gamma
505 verbose=
True, sequence_match=(1, 1)):
506 """read TBL file and store NOE restraints, using the marginal of the
507 lognormal with one sigma and one gamma, for the whole dataset.
508 - prot: protein hierarchy
509 - seqfile: a file with 3-letter sequence
510 - tblfile: a TBL file with the restraints
511 - name: an optional name for the restraintset
512 - verbose: be verbose (default True)
513 - sequence_match : (noe_start, sequence_start)
520 seqfile, first_residue_number=sequence_match[1])
521 tblr = IMP.isd.TBLReader.TBLReader(sequence,
522 sequence_match=sequence_match)
523 restraints = tblr.read_distances(tblfile,
'NOE')[
'NOE']
525 for i, restraint
in enumerate(restraints):
526 if verbose
and i % 100 == 0:
527 print(
"\r%d" % i, end=
' ')
533 pairs = [(self.
find_atom(i, prot).get_particle(),
534 self.
find_atom(j, prot).get_particle())
for (i, j)
in
537 ln.add_contribution(pairs, restraint[4])
540 print(
"\r%d NOE contributions added" % (len(restraints)))
545 """read TBL file and store lognormal restraints, using the marginal
546 of the lognormal with one sigma and gamma=1, for the whole dataset.
547 - prot: protein hierarchy
548 - seqfile: a file with 3-letter sequence
549 - tblfile: a TBL file with the restraints
550 - name: an optional name for the restraintset
551 - verbose: be verbose (default True)
558 tblr = IMP.isd.TBLReader.TBLReader(sequence)
559 restraints = tblr.read_distances(tblfile,
'HBond')[
'HBond']
561 for i, restraint
in enumerate(restraints):
562 if verbose
and i % 100 == 0:
563 print(
"\r%d" % i, end=
' ')
569 pairs = [(self.
find_atom(i, prot).get_particle(),
570 self.
find_atom(j, prot).get_particle())
for (i, j)
in
573 ln.add_contribution(pairs, restraint[4])
576 print(
"\r%d Hbond contributions added" % (len(restraints)))
580 sequence_match=(1, 1), name=
'TALOS', prior_rs=
None,
581 bounds_kappa=(1.0, 0.1, 10), verbose=
True,
582 prior=
'jeffreys', keep_all=
False):
583 """read TALOS dihedral angle data, and create restraints for phi/psi
584 torsion angles, along with the prior for kappa, which is a scale for
585 the whole dataset, compare to 1/sigma**2 in the NOE case.
586 - prot: protein hierarchy
587 - seqfile: a file with 3-letter sequence
588 - talos_data: either a file (pred.tab), or a folder (pred/) in which
589 all files in the form res???.tab can be found. If
590 possible, try to provide the folder, as statistics are
591 more accurate in that case.
592 - fulldata : either True or False, whether the data is the full TALOS
593 output (predAll.tab or pred/ folder), or just the averages
595 - sequence_match : (talos_no, sequence_no) to adjust for different
597 - name: an optional name for the restraintset
598 - prior_rs: when not None, add new kappa(s) to this RestraintSet
600 - bounds_kappa: tuple of (initial value, lower, upper bound)
601 bounds can be -1 to set to default range [0,+inf]
602 - verbose: be verbose (default True)
603 - prior: either 'jeffreys' or a tuple (R,c), which signifies to use the
604 conjugate prior of the von Mises restraint, with parameters R
605 and c. Good values are R=0 and c=10. Default: jeffreys prior.
606 - keep_all: in case of a folder for 'talos_data', whether to keep
607 candidates marked as 'outliers' by TALOS, or to include
609 Returns: data_rs, prior_rs, kappa
614 print(
"Prior for von Mises Kappa")
619 print(
"reading data")
622 seqfile, first_residue_no=sequence_match[1])
625 sequence,
True, keep_all, sequence_match=sequence_match)
626 if os.path.isdir(talos_data):
628 for i, res
in enumerate(glob(os.path.join(talos_data,
630 if verbose
and i % 100:
631 print(
"\r%d" % i, end=
' ')
636 talosr.read(talos_data)
640 sequence,
False, keep_all, sequence_match=sequence_match)
641 talosr.read(talos_data)
643 data = talosr.get_data()
645 print(
"\rread dihedral data for %d residues" % len(data))
646 print(
"creating restraints")
648 for resno, datum
in data.items():
649 phidata = datum[
'phi']
650 psidata = datum[
'psi']
660 avgR.append(r.get_R0())
665 avgR.append(r.get_R0())
671 avgR.append(r.get_R0())
676 avgR.append(r.get_R0())
678 print(
"%s Restraints created. Average R0: %f"
679 % (len(avgR), sum(avgR) / float(len(avgR))))
680 return rs, prior_rs, kappa
683 self, prot, profilefile, name=
'SAXS',
684 ff_type=IMP.saxs.HEAVY_ATOMS):
685 """read experimental SAXS profile and apply restraint the standard
687 Returns: a restraintset and the experimental profile
691 particles = IMP.atom.get_by_type(prot, IMP.atom.ATOM_TYPE)
693 rs.add_restraint(saxs_restraint)
694 return rs, saxs_profile
696 def _setup_md(self, prot, temperature=300.0, thermostat='berendsen',
697 coupling=500, md_restraints=
None, timestep=1.0,
698 recenter=1000, momentum=1000):
699 """setup molecular dynamics
700 - temperature: target temperature
701 - thermostat: one of 'NVE', rescale_velocities',
702 'berendsen', 'langevin'
703 - coupling: coupling constant (tau (fs) for berendsen,
704 gamma (/fs) for langevin)
705 - md_restraints: if not None, specify the terms of the energy to be
706 used during the md steps via a list of restraints.
707 - timestep: in femtoseconds.
708 - recenter: recenter the molecule every so many steps (Langevin only)
709 - momentum: remove angular momentum every so many steps
711 Returns: an instance of md and an instance of an OptimizerState (the
712 thermostat), or None if NVE.
716 md.assign_velocities(temperature)
717 md.set_time_step(timestep)
718 if thermostat ==
'NVE':
720 elif thermostat ==
'rescale_velocities':
723 md.add_optimizer_state(os)
724 elif thermostat ==
'berendsen':
727 md.add_optimizer_state(os)
730 md.add_optimizer_state(mom)
731 elif thermostat ==
'langevin':
734 md.add_optimizer_state(os)
739 raise NotImplementedError(thermostat)
742 md.set_restraints(md_restraints)
746 def _setup_normal_mover(self, particle, floatkey, stepsize):
747 """setup NormalMover to move particle's floatkey attribute
748 by a gaussian with standard deviation 'stepsize'
749 Returns: mover instance.
755 def _setup_md_mover(self, md, particles, temperature, n_md_steps=10):
756 """setup MDMover using md and particles.
758 - particles: particles to move, usually the leaves of the protein
760 - n_md_steps: number of md steps to perform on each move
761 Returns: mover instance.
765 return IMP.atom.MDMover(cont, md, temperature, n_md_steps)
767 def _setup_mc(self, mover, temperature=300.0, mc_restraints=None):
768 """setup monte carlo using a certain mover.
769 - mover: mover to use, NormalMover or MDMover usually.
770 - temperature: target temperature.
771 - mc_restraints: if not None, list of restraints for the metropolis
773 Returns: mc instance.
779 mc.set_kt(kB * temperature)
781 mc.set_return_best(
False)
784 mc.set_restraints(mc_restraints)
788 self, prot, temperature=300.0, gamma=0.01, n_md_steps=10,
789 md_restraints=
None, mc_restraints=
None, timestep=1.0,
790 sd_threshold=0.0, sd_stepsize=0.01, sd_maxsteps=100):
791 """setup hybrid monte-carlo on protein. Uses basin hopping with
792 steepest descent minimization.
793 - prot: protein hierarchy.
794 - temperature: target temperature.
795 - gamma: coupling constant for langevin (/fs)
796 - n_md_steps: number of md steps per mc step
797 - md_restraints: if not None, specify the terms of the energy to be
798 used during the md steps.
799 - mc_restraints: if not None, use these energy terms for the metropolis
801 - timestep: time step for md, in femtoseconds.
802 - sd_threshold: stop steepest descent after energy difference drops
804 - sd_stepsize: stepsize to use for the steepest descent, in angstrom.
805 - sd_maxsteps: maximum number of steps for steepest descent
806 Returns: hmc, mdmover, md and OptimizerState (thermostat)
808 raise NotImplementedError
809 md, os = self._setup_md(prot, temperature=temperature,
810 thermostat=
'langevin', coupling=gamma,
811 md_restraints=md_restraints, timestep=timestep)
812 particles = IMP.atom.get_by_type(prot, IMP.atom.ATOM_TYPE)
813 mdmover = self._setup_md_mover(md, particles, temperature, n_md_steps)
814 hmc = self._setup_mc(mdmover, temperature, mc_restraints)
816 sd.set_threshold(sd_threshold)
817 sd.set_step_size(sd_stepsize)
818 hmc.set_local_optimizer(sd)
819 hmc.set_local_steps(sd_maxsteps)
820 hmc.set_use_basin_hopping(
True)
821 return hmc, mdmover, md, os
824 self, prot, temperature=300.0, n_md_steps=100, md_restraints=
None,
825 mc_restraints=
None, timestep=1.0):
826 """setup hybrid monte-carlo on protein. Uses NVE MD and tries the full
827 - prot: protein hierarchy.
828 - temperature: target temperature.
829 - coupling: coupling constant (tau (fs) for berendsen,
830 gamma (/fs) for langevin)
831 - n_md_steps: number of md steps per mc step
832 - md_restraints: if not None, specify the terms of the energy to be
833 used during the md steps.
834 - mc_restraints: if not None, use these energy terms for the metropolis
836 - timestep: time step for md, in femtoseconds.
837 - sd_threshold: stop steepest descent after energy difference drops
839 - sd_stepsize: stepsize to use for the steepest descent, in angstrom.
840 - sd_maxsteps: maximum number of steps for steepest descent
841 Returns: hmc, mdmover and md
843 prot = self._p[
'prot']
844 md, os = self._setup_md(prot, temperature=temperature,
845 thermostat=
'NVE', coupling=
None, timestep=1.0,
846 md_restraints=md_restraints)
847 particles = IMP.atom.get_by_type(prot, IMP.atom.ATOM_TYPE)
850 mdmover = PyMDMover(cont, md, n_md_steps)
854 mc.add_mover(mdmover)
856 mc.set_kt(kB * temperature)
858 mc.set_return_best(
False)
860 mc.set_move_probability(1.0)
861 return mc, mdmover, md
864 mc_restraints=
None, nm_stepsize=0.1):
865 """sets up monte carlo on nuisance, at a certain target temperature,
866 optionally using a certain set of restraints only.
867 - nuis: nuisance particle
868 - temperature: target temperature
869 - mc_restraints: optional set of restraints from which the energy
870 should be drawn instead of the energy of the complete system.
871 - floatkey: the floatkey to move.
872 - nm_stepsize: the stepsize of the normal mover
873 Returns: mc instance, nm instance.
875 nm = self._setup_normal_mover(nuis, nuis.get_nuisance_key(),
877 mc = self._setup_mc(nm, temperature, mc_restraints)
880 def _mc_and_update_nm(self, nsteps, mc, nm, stats_key,
881 adjust_stepsize=
True):
882 """run mc using a normal mover on a single particle,
883 update stepsize and store nsteps, acceptance and stepsize in the
884 statistics instance self.stat by using the key stats_key.
888 naccept = mc.get_number_of_forward_steps()
890 self.stat.increment_counter(stats_key, nsteps)
892 accept = float(naccept) / nsteps
893 self.stat.update(stats_key,
'acceptance', accept)
894 stepsize = nm.get_sigma()
895 self.stat.update(stats_key,
'stepsize', stepsize)
898 if 0.4 < accept < 0.6:
904 nm.set_sigma(stepsize * 2 * accept)
906 def _hmc_and_update_md(self, nsteps, hmc, mv, stats_key,
907 adjust_stepsize=
True):
908 """run hmc, update stepsize and print statistics. Updates number of MD
909 steps to reach a target acceptance between 0.4 and 0.6, sends
910 statistics to self.stat. MD steps are always at least 10 and at
914 naccept = hmc.get_number_of_forward_steps()
915 self.stat.increment_counter(stats_key, nsteps)
916 accept = float(naccept) / nsteps
917 self.stat.update(stats_key,
'acceptance', accept)
918 mdsteps = mv.get_number_of_steps()
919 self.stat.update(stats_key,
'n_md_steps', mdsteps)
921 if 0.4 < accept < 0.6:
923 mdsteps = int(mdsteps * 2 ** (accept - 0.5))
928 mv.set_nsteps(mdsteps)
931 """returns a string corresponding to the pdb structure of hierarchy
936 return output.getvalue()
938 def get_netcdf(self, prot):
939 raise NotImplementedError
942 temperature=300.0, prot_coordinates=
None):
943 """updates statistics for md simulation: target temp, kinetic energy,
944 kinetic temperature, writes coordinates and increments counter.
945 - md_key: stats md key
946 - nsteps: number of steps performed.
947 - md_instance: instance of the MolecularDynamics class.
948 - temperature: target temperature
949 - prot_coordinates: protein coordinates to be passed to the stats
950 class, (should be a string)
952 self.stat.update(md_key,
'target_temp', temperature)
953 kinetic = md_instance.get_kinetic_energy()
954 self.stat.update(md_key,
'E_kinetic', kinetic)
955 self.stat.update(md_key,
'instant_temp',
956 md_instance.get_kinetic_temperature(kinetic))
957 self.stat.update_coordinates(md_key,
'protein', prot_coordinates)
958 self.stat.increment_counter(md_key, nsteps)
961 """shortcut for a frequent series of operations on MC simulations'
962 statistics. Creates an entry for acceptance, stepsize and one
963 coordinate set printed in the statistics file.
966 mc_key = stat.add_category(name=name)
968 stat.add_entry(mc_key, entry=Entry(
'temperature',
'%10G',
None))
969 stat.add_entry(mc_key, entry=Entry(
'acceptance',
'%10G',
None))
970 stat.add_entry(mc_key, entry=Entry(
'stepsize',
'%10G',
None))
972 stat.add_entry(mc_key, entry=Entry(coord,
'%10G',
None))
974 stat.add_entry(mc_key, name=
'counter')
978 """shortcut for a frequent series of operations on MD simulations'
979 statistics. Creates an entry for target temp, instantaneous temp,
980 kinetic energy, and one set of coordinates called 'protein' by
984 md_key = stat.add_category(name=name)
986 stat.add_entry(md_key, entry=Entry(
'target_temp',
'%10G',
None))
987 stat.add_entry(md_key, entry=Entry(
'instant_temp',
'%10G',
None))
988 stat.add_entry(md_key, entry=Entry(
'E_kinetic',
'%10G',
None))
990 stat.add_coordinates(md_key, coord)
992 stat.add_entry(md_key, name=
'counter')
996 """shortcut for a frequent series of operations on HMC simulations'
997 statistics. Adds acceptance, number of MD steps and a trajectory for
1001 hmc_key = stat.add_category(name=name)
1003 stat.add_entry(hmc_key, entry=Entry(
'temperature',
'%10G',
None))
1004 stat.add_entry(hmc_key, entry=Entry(
'acceptance',
'%10G',
None))
1005 stat.add_entry(hmc_key, entry=Entry(
'n_md_steps',
'%10G',
None))
1006 stat.add_entry(hmc_key, entry=Entry(
'E_kinetic',
'%10G',
None))
1008 stat.add_coordinates(hmc_key, coord)
1010 stat.add_entry(hmc_key, name=
'counter')
1014 """rescale the velocities of a bunch of particles having vx vy and vz
1020 p.set_value(k, p.get_value(k) * factor)
Applies a SingletonScore to each Singleton in a list.
def rescale_velocities
rescale the velocities of a bunch of particles having vx vy and vz floatkeys
CHARMMParameters * get_heavy_atom_CHARMM_parameters()
def init_model_ambiguous_NOE_restraint
Reads an ambiguous NOE restraint.
Maintains temperature during molecular dynamics.
Enforce CHARMM stereochemistry on the given Hierarchy.
Atoms get_phi_dihedral_atoms(Residue rd)
Return the atoms comprising the phi dihedral.
def do_md_protein_statistics
updates statistics for md simulation: target temp, kinetic energy, kinetic temperature, writes coordinates and increments counter.
def init_model_charmm_protein_and_ff
creates a CHARMM protein representation.
def find_atom
scans the prot hierarchy and tries to find atom = (resno, name) assumes that resno follows the same n...
def init_model_NOEs
read TBL file and store NOE restraints, using one sigma and one gamma for the whole dataset...
Various classes to hold sets of particles.
def init_simulation_setup_nuisance_mc
sets up monte carlo on nuisance, at a certain target temperature, optionally using a certain set of r...
A decorator for a particle which has bonds.
def init_simulation_setup_protein_hmc_nve
setup hybrid monte-carlo on protein.
Calculate score based on fit to SAXS profile.
A simple steepest descent optimizer.
void write_pdb(const Selection &mhd, TextOutput out, unsigned int model=1)
def init_model_TALOS
read TALOS dihedral angle data, and create restraints for phi/psi torsion angles, along with the prio...
Ambiguous NOE distance restraint between a number of pairs of particles.
def get_pdb
returns a string corresponding to the pdb structure of hierarchy prot.
def init_model_base
moves to wd and creates model
def init_model_NOEs_marginal
read TBL file and store NOE restraints, using the marginal of the lognormal with one sigma and one ga...
Return all close unordered pairs of particles taken from the SingletonContainer.
Classes to handle ISD statistics files.
def init_model_NOE_restraint
Sets up a lognormal distance restraint using the given sigma and gamma.
void read_pdb(TextInput input, int model, Hierarchy h)
CHARMM force field parameters.
Object used to hold a set of restraints.
Bond create_custom_bond(Bonded a, Bonded b, Float length, Float stiffness=-1)
Connect the two wrapped particles by a custom bond.
Class for storing model, its restraints, constraints, and particles.
Removes rigid translation and rotation from the particles.
def init_model_vonMises_restraint_full
Sets up a vonMises torsion angle restraint using the given kappa particle as concentration parameter...
Store a list of ParticleIndexPairs.
Conjugate prior for the concentration parameter of a von Mises distribution.
Maintains temperature during molecular dynamics by velocity scaling.
ParticleIndexPairs get_indexes(const ParticlePairsTemp &ps)
Get the indexes from a list of particle pairs.
def init_model_jeffreys_kappa
given a list of scales, returns a RestraintSet('prior') with weight 1.0 that contains a list of vonMi...
Simple molecular dynamics simulator.
Store a list of ParticleIndexes.
Atoms get_psi_dihedral_atoms(Residue rd)
Return the atoms comprising the psi dihedral.
def init_stats_add_md_category
shortcut for a frequent series of operations on MD simulations' statistics.
def init_model_HBonds_marginal
read TBL file and store lognormal restraints, using the marginal of the lognormal with one sigma and ...
Apply an NOE distance restraint between two particles.
Base class for all optimizers.
static Bonded setup_particle(Model *m, ParticleIndex pi)
Jeffreys prior for the concentration parameter of a von Mises distribution.
def init_stats_add_mc_category
shortcut for a frequent series of operations on MC simulations' statistics.
def init_simulation_setup_protein_hmc_hopper
setup hybrid monte-carlo on protein.
A decorator for a particle with x,y,z coordinates.
static Scale setup_particle(Model *m, ParticleIndex pi)
phi/psi dihedral restraint between four particles, using data from TALOS.
Score the bond based on a UnaryFunction,.
def read_sequence_file
read sequence of ONE chain, 1-letter or 3-letter, returns dict of no:3-letter code.
reads a TALOS file, or a TALOS folder, and stores the data
Modify a set of continuous variables using a normal distribution.
nonspecific methods used across all shared function objects.
void set_log_level(LogLevel l)
Set the current global log level.
A decorator for a residue.
Apply a lognormal distance restraint between two particles.
Basic functionality that is expected to be used by a wide variety of IMP users.
def init_model_standard_SAXS_restraint
read experimental SAXS profile and apply restraint the standard way (like foxs) Returns: a restraints...
def init_model_setup_scale
sets up a Scale particle to the initial default value.
static bool get_is_setup(const IMP::ParticleAdaptor &p)
def init_model_jeffreys
given a list of scales, returns a RestraintSet('prior') with weight 1.0 that contains a list of Jeffr...
Residue get_residue(Atom d, bool nothrow=false)
Return the Residue containing this atom.
A filter that excludes bonds, angles and dihedrals.
Class to handle individual particles of a Model object.
def init_model_vonMises_restraint_mean
Sets up a vonMises torsion angle restraint using the given kappa particle as concentration parameter...
def init_stats_add_hmc_category
shortcut for a frequent series of operations on HMC simulations' statistics.
def m
wrapper to call methods of m
Apply an NOE distance restraint between two particles.
Functionality for loading, creating, manipulating and scoring atomic structures.
CHARMMParameters * get_all_atom_CHARMM_parameters()
Hierarchies get_leaves(const Selection &h)
Classes to handle TALOS files or folders.
Select hierarchy particles identified by the biological name.
Applies a PairScore to each Pair in a list.
Support for small angle X-ray scattering (SAXS) data.
void set_check_level(CheckLevel tf)
Control runtime checks in the code.
def init_model_conjugate_kappa
given a list of scales, returns a RestraintSet('prior') with weight 1.0 that contains a list of vonMi...
Inferential scoring building on methods developed as part of the Inferential Structure Determination ...
Classes to handle TBL files.
Harmonic function (symmetric about the mean)
Maintains temperature during molecular dynamics.
A decorator for a particle with x,y,z coordinates and a radius.