예제 #1
0
def conjugate_gradient_optimization(model, log_energies):
    restraints = []
    # IMP COMMAND: Call the Conjugate Gradient optimizer
    try:
        restraints.append(model['restraints'])
        scoring_function = IMP.core.RestraintsScoringFunction(restraints)
    except:
        pass

    try:
        lo = IMP.core.ConjugateGradients()
        lo.set_model(model['model'])
    except:  # since version 2.5, IMP goes this way
        lo = IMP.core.ConjugateGradients(model['model'])
    try:
        lo.set_scoring_function(scoring_function)  # 2.6.1 compat
    except:
        pass

    #print LSTEPS, NROUNDS, STEPS
    o = IMP.core.MonteCarloWithLocalOptimization(lo, LSTEPS)
    try:
        o.set_scoring_function(scoring_function)  # 2.6.1 compat
    except:
        pass

    o.set_return_best(True)
    fk = IMP.core.XYZ.get_xyz_keys()
    ptmp = model['particles'].get_particles()

    x, y, z, radius = (FloatKey("x"), FloatKey("y"), FloatKey("z"),
                       FloatKey("radius"))

    mov = IMP.core.NormalMover(ptmp, fk, 0.25 / SCALE)
    o.add_mover(mov)
    # o.add_optimizer_state(log)

    # Start optimization and save a VRML after 100 MC moves
    try:
        log_energies.append(model['model'].evaluate(False))
    except:
        log_energies.append(
            model['restraints'].evaluate(False))  # 2.6.1 compat

    #"""simulated_annealing: perform simulated annealing for at most nrounds
    # iterations. The optimization stops if the score does not change more than
    #    a value defined by endLoopValue and for stopCount iterations.
    #   @param endLoopCount = Counter that increments if the score of two models
    # did not change more than a value
    #   @param stopCount = Maximum values of iteration during which the score
    # did not change more than a specific value
    #   @paramendLoopValue = Threshold used to compute the value  that defines
    # if the endLoopCounter should be incremented or not"""
    # IMP.fivec.simulatedannealing.partial_rounds(m, o, nrounds, steps)
    endLoopCount = 0
    stopCount = 10
    endLoopValue = 0.00001

    # alpha is a parameter that takes into account the number of particles in
    # the model (len(LOCI)).
    # The multiplier (in this case is 1.0) is used to give a different weight
    # to the number of particles
    alpha = 1.0 * len(LOCI)

    # During the firsts hightemp iterations, do not stop the optimization
    hightemp = int(0.025 * NROUNDS)
    for i in range(0, hightemp):
        temperature = alpha * (1.1 * NROUNDS - i) / NROUNDS
        o.set_kt(temperature)
        log_energies.append(o.optimize(STEPS))
        #if i == 1:
        #    for p in ptmp:
        #        print p,p.get_value(x),p.get_value(y),p.get_value(z)
        if VERBOSE == 3:
            print(i, log_energies[-1], o.get_kt())
    # After the firsts hightemp iterations, stop the optimization if the score
    # does not change by more than a value defined by endLoopValue and
    # for stopCount iterations
    lownrj = log_energies[-1]
    for i in range(hightemp, NROUNDS):
        temperature = alpha * (1.1 * NROUNDS - i) / NROUNDS
        o.set_kt(temperature)
        log_energies.append(o.optimize(STEPS))
        if VERBOSE == 3:
            print(i, log_energies[-1], o.get_kt())
        # Calculate the score variation and check if the optimization
        # can be stopped or not
        if lownrj > 0:
            deltaE = fabs((log_energies[-1] - lownrj) / lownrj)
        else:
            deltaE = log_energies[-1]

        if (deltaE < endLoopValue and endLoopCount == stopCount):
            break
        elif (deltaE < endLoopValue and endLoopCount < stopCount):
            endLoopCount += 1
            lownrj = log_energies[-1]
        else:
            endLoopCount = 0
            lownrj = log_energies[-1]
예제 #2
0
def generate_IMPmodel(rand_init):
    """
    Generates one IMP model
    
    :param rand_init: random number kept as model key, for reproducibility.

    :returns: a model, that is a dictionary with the log of the objective
       function value optimization, and the coordinates of each particles.

    """
    verbose = VERBOSE
    IMP.random_number_generator.seed(rand_init)

    log_energies = []
    model = {
        'rk': IMP.FloatKey("radius"),
        'model': Model(),
        'ps': None,
        'pps': None
    }
    model['ps'] = ListSingletonContainer(
        IMP.core.create_xyzr_particles(model['model'], len(LOCI), RADIUS,
                                       100000))
    model['ps'].set_name("")

    # initialize each particles
    for i in range(0, len(LOCI)):
        p = model['ps'].get_particle(i)
        p.set_name(str(LOCI[i]))
        # computed following the relationship with the 30nm vs 40nm fiber
        #p.set_value(model['rk'], RADIUS)

    # Restraints between pairs of LOCI proportional to the PDIST
    try:
        # version: 847e65d44da7d06718bcad366b09264c818752d5
        model['pps'] = IMP.ParticlePairs()
    except AttributeError:
        model['pps'] = IMP.kernel.ParticlePairsTemp()

    # CALL BIG FUNCTION
    if rand_init == 1 and verbose == 0.5:
        verbose = 1
        stdout.write("# Harmonic\tpart1\tpart2\tdist\tkforce\n")

    # set container
    model['container'] = CONFIG['container']
    if model['container']['shape'] == 'cylinder':
        # define a segment of a given size
        segment = IMP.algebra.Segment3D(
            IMP.algebra.Vector3D(0, 0, 0),
            IMP.algebra.Vector3D(model['container']['height'], 0, 0))
        bb = IMP.algebra.get_bounding_box(segment)
        rb = IMP.container.SingletonsRestraint(
            IMP.core.BoundingBox3DSingletonScore(
                IMP.core.HarmonicUpperBound(model['container']['radius'],
                                            model['container']['cforce']), bb),
            model['ps'])
        model['model'].add_restraint(rb)
        rb.evaluate(False)
    # elif model['container']['shape']:
    #     raise noti

    addAllHarmonics(model)

    # Setup an excluded volume restraint between a bunch of particles
    # with radius
    r = IMP.core.ExcludedVolumeRestraint(model['ps'], CONFIG['kforce'])
    model['model'].add_restraint(r)

    if verbose == 3:
        print "Total number of restraints: %i" % (
            model['model'].get_number_of_restraints())

    # Set up optimizer
    lo = IMP.core.ConjugateGradients()
    lo.set_model(model['model'])
    o = IMP.core.MonteCarloWithLocalOptimization(lo, LSTEPS)
    o.set_return_best(True)
    fk = IMP.core.XYZ.get_xyz_keys()
    ptmp = model['ps'].get_particles()
    mov = IMP.core.NormalMover(ptmp, fk, 0.25)
    o.add_mover(mov)
    # o.add_optimizer_state(log)

    # Optimizer's parameters
    if verbose == 3:
        print "nrounds: %i, steps: %i, lsteps: %i" % (NROUNDS, STEPS, LSTEPS)

    # Start optimization and save an VRML after 100 MC moves
    log_energies.append(model['model'].evaluate(False))
    if verbose == 3:
        print "Start", log_energies[-1]

    #"""simulated_annealing: preform simulated annealing for at most nrounds
    # iterations. The optimization stops if the score does not change more than
    #    a value defined by endLoopValue and for stopCount iterations.
    #   @param endLoopCount = Counter that increments if the score of two models
    # did not change more than a value
    #   @param stopCount = Maximum values of iteration during which the score
    # did not change more than a specific value
    #   @paramendLoopValue = Threshold used to compute the value  that defines
    # if the endLoopCounter should be incremented or not"""
    # IMP.fivec.simulatedannealing.partial_rounds(m, o, nrounds, steps)
    endLoopCount = 0
    stopCount = 10
    endLoopValue = 0.00001
    # alpha is a parameter that takes into account the number of particles in
    # the model (len(LOCI)).
    # The multiplier (in this case is 1.0) is used to give a different weight
    # to the number of particles
    alpha = 1.0 * len(LOCI)
    # During the firsts hightemp iterations, do not stop the optimization
    hightemp = int(0.025 * NROUNDS)
    for i in range(0, hightemp):
        temperature = alpha * (1.1 * NROUNDS - i) / NROUNDS
        o.set_kt(temperature)
        log_energies.append(o.optimize(STEPS))
        if verbose == 3:
            print i, log_energies[-1], o.get_kt()
    # After the firsts hightemp iterations, stop the optimization if the score
    # does not change by more than a value defined by endLoopValue and
    # for stopCount iterations
    lownrj = log_energies[-1]
    for i in range(hightemp, NROUNDS):
        temperature = alpha * (1.1 * NROUNDS - i) / NROUNDS
        o.set_kt(temperature)
        log_energies.append(o.optimize(STEPS))
        if verbose == 3:
            print i, log_energies[-1], o.get_kt()
        # Calculate the score variation and check if the optimization
        # can be stopped or not
        if lownrj > 0:
            deltaE = fabs((log_energies[-1] - lownrj) / lownrj)
        else:
            deltaE = log_energies[-1]
        if (deltaE < endLoopValue and endLoopCount == stopCount):
            break
        elif (deltaE < endLoopValue and endLoopCount < stopCount):
            endLoopCount += 1
            lownrj = log_energies[-1]
        else:
            endLoopCount = 0
            lownrj = log_energies[-1]
    #"""simulated_annealing_full: preform simulated annealing for nrounds
    # iterations"""
    # # IMP.fivec.simulatedannealing.full_rounds(m, o, nrounds, steps)
    # alpha = 1.0 * len(LOCI)
    # for i in range(0,nrounds):
    #    temperature = alpha * (1.1 * nrounds - i) / nrounds
    #    o.set_kt(temperature)
    #    e = o.optimize(steps)
    #    print str(i) + " " + str(e) + " " + str(o.get_kt())

    log_energies.append(model['model'].evaluate(False))
    if verbose >= 1:
        if verbose >= 2 or not rand_init % 100:
            print 'Model %s IMP Objective Function: %s' % (rand_init,
                                                           log_energies[-1])
    x, y, z, radius = (FloatKey("x"), FloatKey("y"), FloatKey("z"),
                       FloatKey("radius"))
    result = IMPmodel({
        'log_objfun': log_energies,
        'objfun': log_energies[-1],
        'x': [],
        'y': [],
        'z': [],
        'radius': None,
        'cluster': 'Singleton',
        'rand_init': str(rand_init)
    })
    for part in model['ps'].get_particles():
        result['x'].append(part.get_value(x))
        result['y'].append(part.get_value(y))
        result['z'].append(part.get_value(z))
        if verbose == 3:
            print(part.get_name(), part.get_value(x), part.get_value(y),
                  part.get_value(z), part.get_value(radius))
    # gets radius from last particle, assuming that all are the same
    result['radius'] = part.get_value(radius)
    return result  # rand_init, result
예제 #3
0
def generate_IMPmodel(rand_init,
                      HiCRestraints,
                      use_HiC=True,
                      use_confining_environment=True,
                      use_excluded_volume=True,
                      single_particle_restraints=None):
    """
    Generates one IMP model

    :param rand_init: random number kept as model key, for reproducibility.

    :returns: a model, that is a dictionary with the log of the objective
       function value optimization, and the coordinates of each particles.

    """
    verbose = VERBOSE
    # Set the IMP.random_number_generator.seed to get a different reproducible model
    IMP.random_number_generator.seed(rand_init)
    #print IMP.random_number_generator()

    log_energies = []
    model = {
        'radius': IMP.FloatKey("radius"),
        'model': Model(),
        'particles': None,
        'restraints': None
    }  # 2.6.1 compat
    model['particles'] = ListSingletonContainer(
        model['model'],
        IMP.core.create_xyzr_particles(model['model'], len(LOCI), RADIUS,
                                       100000 /
                                       SCALE))  # last number is box size

    try:
        model['restraints'] = IMP.RestraintSet(model['model'])  # 2.6.1 compat
    except:
        pass

    # OPTIONAL:Set the name of each particle
    for i in range(0, len(LOCI)):
        p = model['particles'].get(i)
        p.set_name(str(LOCI[i]))
        #print p.get_name()

    # Separated function for the confining environment restraint
    if use_confining_environment:
        # print "\nEnforcing the confining environment restraint"
        add_confining_environment(model)

    # Separated function for the bending rigidity restraints
    if CONFIG['kbending'] > 0.0:
        # print "\nEnforcing the bending rigidity restraint"
        theta0 = 0.0
        bending_kforce = CONFIG['kbending']
        add_bending_rigidity_restraint(model, theta0, bending_kforce)

    # Add restraints on single particles
    if single_particle_restraints:
        for ap in single_particle_restraints:
            ap[1] = [(c / SCALE) for c in ap[1]]
            ap[4] /= SCALE
        # This function is specific for IMP
        add_single_particle_restraints(model, single_particle_restraints)

    # Separated function fot the HiC-based restraints
    if use_HiC:
        # print "\nEnforcing the HiC-based Restraints"
        HiCbasedRestraints = HiCRestraints.get_hicbased_restraints()
        add_hicbased_restraints(model, HiCbasedRestraints)

    # Separated function for the excluded volume restraint
    if use_excluded_volume:
        # print "\nEnforcing the excluded_volume_restraints"
        excluded_volume_kforce = CONFIG['kforce']
        evr = add_excluded_volume_restraint(model, model['particles'],
                                            excluded_volume_kforce)

    if verbose == 1:
        try:
            print("Total number of restraints: %i" %
                  (model['model'].get_number_of_restraints()))
            if use_HiC:
                print(len(HiCbasedRestraints))
        except:
            print("Total number of restraints: %i" %
                  (model['restraints'].get_number_of_restraints())
                  )  # 2.6.1 compat
            if use_HiC:
                print(len(HiCbasedRestraints))

    # Separated function for the Conjugate gradient optimization
    if verbose == 1:
        print("\nPerforming the optimization of the Hi-C-based restraints "
              "using conjugate gradient optimisation\n")

    conjugate_gradient_optimization(model, log_energies)

    #try:
    #    log_energies.append(model['model'].evaluate(False))
    #except:
    #    log_energies.append(model['restraints'].evaluate(False)) # 2.6.1 compat
    if verbose >= 1:
        if verbose >= 2 or not rand_init % 100:
            print('Model %s IMP Objective Function: %s' %
                  (rand_init, log_energies[-1]))
    x, y, z, radius = (FloatKey("x"), FloatKey("y"), FloatKey("z"),
                       FloatKey("radius"))
    result = IMPmodel({
        'log_objfun': log_energies,
        'objfun': log_energies[-1],
        'x': [],
        'y': [],
        'z': [],
        'radius': None,
        'cluster': 'Singleton',
        'rand_init': str(rand_init)
    })
    for part in model['particles'].get_particles():
        result['x'].append(part.get_value(x) * SCALE)
        result['y'].append(part.get_value(y) * SCALE)
        result['z'].append(part.get_value(z) * SCALE)
        if verbose == 3:
            print((part.get_name(), part.get_value(x), part.get_value(y),
                   part.get_value(z), part.get_value(radius)))
    # gets radius from last particle, assuming that all are the same
    # include in the loop when radius changes... should be a list then
    result['radius'] = part.get_value(radius)
    result['radius'] = SCALE / 2
    #for log_energy in log_energies:
    #    print "%.30f" % log_energy
    #print rand_init, log_energies[-1]
    #stdout.flush()
    return result  # rand_init, result
예제 #4
0
def generate_IMPmodel(rand_init,
                      HiCRestraints,
                      use_HiC=True,
                      use_confining_environment=True,
                      use_excluded_volume=True,
                      single_particle_restraints=None,
                      initial_conformation=None):
    """
    Generates one IMP model

    :param rand_init: random number kept as model key, for reproducibility.

    :returns: a model, that is a dictionary with the log of the objective
       function value optimization, and the coordinates of each particles.

    """
    verbose = VERBOSE
    # Set the IMP.random_number_generator.seed to get a different reproducible model
    IMP.random_number_generator.seed(rand_init)

    log_energies = []
    model = {
        'radius': IMP.FloatKey("radius"),
        'model': Model(),
        'particles': None,
        'restraints': None
    }  # 2.6.1 compat
    if initial_conformation:
        ps = []
        for pos in xrange(len(LOCI)):
            ps.append(IMP.Particle(model['model'], str(pos)))
            d = IMP.core.XYZR.setup_particle(ps[-1], float(RADIUS))
            d.set_coordinates(
                IMP.algebra.Vector3D(initial_conformation['x'][pos],
                                     initial_conformation['y'][pos],
                                     initial_conformation['z'][pos]))
            d.set_coordinates_are_optimized(True)
        model['particles'] = ListSingletonContainer(model['model'], ps)
    else:
        model['particles'] = ListSingletonContainer(
            IMP.core.create_xyzr_particles(
                model['model'], len(LOCI), RADIUS,
                100000 / float(CONFIG['resolution'] *
                               CONFIG['scale'])))  # last number is box size
        # OPTIONAL:Set the name of each particle
        for i in range(0, len(LOCI)):
            p = model['particles'].get_particle(i)
            p.set_name(str(LOCI[i]))
    #model['particles'] = ListSingletonContainer(
    #    IMP.core.create_xyzr_particles(model['model'], len(LOCI), RADIUS, 100000))  # last number is box size
    try:
        model['restraints'] = IMP.RestraintSet(model['model'])  # 2.6.1 compat
    except:
        pass

    # Separated function for the confining environment restraint:
    # This function is specific for IMP
    if use_confining_environment:
        # print "\nEnforcing the confining environment restraint"
        add_confining_environment(model)

    # Separated function for the bending rigidity restraints
    # This function is specific for IMP
    if CONFIG['kbending'] > 0.0:
        # print "\nEnforcing the bending rigidity restraint"
        theta0 = 0.0
        bending_kforce = CONFIG['kbending']
        add_bending_rigidity_restraint(model, theta0, bending_kforce)

    # Anchor particles to fixed points in the model
    if single_particle_restraints:
        for ap in single_particle_restraints:
            ap[1] = [
                c / (float(CONFIG['resolution'] * CONFIG['scale']))
                for c in ap[1]
            ]
            ap[4] /= float(CONFIG['resolution'] * CONFIG['scale'])
        # This function is specific for IMP
        add_single_particle_restraints(model, single_particle_restraints)

    # Separated function fot the HiC-based restraints
    if use_HiC:
        # This function is general
        HiCbasedRestraints = HiCRestraints.get_hicbased_restraints()
        # print "\nEnforcing the HiC-based Restraints
        # This function is specific for IMP
        add_hicbased_restraints(model, HiCbasedRestraints)

    # Separated function for the excluded volume restraint
    if use_excluded_volume:
        # print "\nEnforcing the excluded_volume_restraints"
        # This function is specific for IMP
        excluded_volume_kforce = CONFIG[
            'ev_kforce'] if 'ev_kforce' in CONFIG else CONFIG['kforce']
        evr = add_excluded_volume_restraint(model, model['particles'],
                                            excluded_volume_kforce)

    if verbose == 1:
        try:
            print "Total number of restraints: %i" % (
                model['model'].get_number_of_restraints())
            if use_HiC:
                print len(HiCbasedRestraints)
        except:
            print "Total number of restraints: %i" % (
                model['restraints'].get_number_of_restraints())  # 2.6.1 compat
            if use_HiC:
                print len(HiCbasedRestraints)

    # Separated function for the Conjugate gradient optimization
    if verbose == 1:
        print(
            "\nPerforming the optimization of the Hi-C-based restraints "
            "using conjugate gradient optimisation\n")

    conjugate_gradient_optimization(model, log_energies)

    if verbose >= 1:
        if verbose >= 2 or not rand_init % 100:
            print 'Model %s IMP Objective Function: %s' % (rand_init,
                                                           log_energies[-1])
    x, y, z, radius = (FloatKey("x"), FloatKey("y"), FloatKey("z"),
                       FloatKey("radius"))
    result = IMPmodel({
        'log_objfun': log_energies,
        'objfun': log_energies[-1],
        'x': [],
        'y': [],
        'z': [],
        'radius': None,
        'cluster': 'Singleton',
        'rand_init': str(rand_init)
    })
    for part in model['particles'].get_particles():
        result['x'].append(
            part.get_value(x) * float(CONFIG['resolution'] * CONFIG['scale']))
        result['y'].append(
            part.get_value(y) * float(CONFIG['resolution'] * CONFIG['scale']))
        result['z'].append(
            part.get_value(z) * float(CONFIG['resolution'] * CONFIG['scale']))
        #     for part in model['particles'].get_particles():
        #         result['x'].append(part.get_value(x))
        #         result['y'].append(part.get_value(y))
        #         result['z'].append(part.get_value(z))
        if verbose == 3:
            print(part.get_name(), part.get_value(x), part.get_value(y),
                  part.get_value(z), part.get_value(radius))
    # gets radius from last particle, assuming that all are the same
    # include in the loop when radius changes... should be a list then
    #result['radius'] = part.get_value(radius)
    #result['radius'] = RADIUS
    result['radius'] = float(CONFIG['resolution'] * CONFIG['scale']) / 2

    return result  # rand_init, result