Index: kernel/test/particle_refiners/test_refine_once_ps.py =================================================================== --- kernel/test/particle_refiners/test_refine_once_ps.py (revision 0) +++ kernel/test/particle_refiners/test_refine_once_ps.py (revision 0) @@ -0,0 +1,35 @@ +import unittest +import IMP +import IMP.test + +rk = IMP.FloatKey("radius") + +class Test(IMP.test.TestCase): + """Tests for bond refiner""" + + + def test_rops(self): + """Make sure that bond cover coordinates are correct""" + IMP.set_log_level(IMP.VERBOSE) + m= IMP.Model() + pp= IMP.Particle() + m.add_particle(pp) + hpp= IMP.HierarchyDecorator.create(pp) + c=[] + for i in range(0,10): + p= IMP.Particle() + m.add_particle(p) + hp= IMP.HierarchyDecorator.create(p) + hpp.add_child(hp) + c.append(p) + pr= IMP.ChildrenParticleRefiner() + cps= IMP.test.ConstPairScore(1) + rps= IMP.RefineOncePairScore(pr, cps) + self.assertEqual(rps.evaluate(pp, pp, None), 100) + + + + + +if __name__ == '__main__': + unittest.main() Index: kernel/src/pair_scores/RefineOncePairScore.cpp =================================================================== --- kernel/src/pair_scores/RefineOncePairScore.cpp (revision 0) +++ kernel/src/pair_scores/RefineOncePairScore.cpp (revision 0) @@ -0,0 +1,62 @@ +/** + * \file RefineOncePairScore.cpp + * \brief A bond cover pair score. + * + * Copyright 2007-8 Sali Lab. All rights reserved. + */ + +#include "IMP/pair_scores/RefineOncePairScore.h" +#include "IMP/decorators/bond_decorators.h" +#include "IMP/decorators/XYZDecorator.h" +#include "IMP/internal/constants.h" + +#include + +namespace IMP +{ + +RefineOncePairScore::RefineOncePairScore(ParticleRefiner *r, + PairScore *f): r_(r), f_(f) {} + +Float RefineOncePairScore::evaluate(Particle *a, Particle *b, + DerivativeAccumulator *da) +{ + Particle* p[2]={a,b}; + Particles ps[2]; + for (unsigned int i=0; i< 2; ++i) { + if (r_->get_can_refine(p[i])) { + ps[i]= r_->get_refined(p[i]); + } else { + ps[i].push_back(p[i]); + } + IMP_LOG(VERBOSE, "Refining " << p[i]->get_index() + << " resulted in " << ps[i].size() << " particles" + << std::endl); + } + + Float ret=0; + for (unsigned int i=0; i< ps[0].size(); ++i) { + for (unsigned int j=0; j< ps[1].size(); ++j) { + ret+=f_->evaluate(ps[0][i], ps[1][j], da); + } + } + + for (unsigned int i=0; i< 2; ++i) { + if (ps[i].size() != 1 || ps[i].size()==1 && ps[i][0] != p[i]) { + IMP_LOG(VERBOSE, "Refining " << p[i]->get_index() + << " resulted in " << ps[i].size() << " particles" + << std::endl); + r_->cleanup_refined(p[i], ps[i], da); + } + } + return ret; +} + +void RefineOncePairScore::show(std::ostream &out) const +{ + out << "RefineOncePairScore using "; + f_->show(out); + r_->show(out); +} + +} // namespace IMP Index: kernel/include/IMP/pair_scores/RefineOncePairScore.h =================================================================== --- kernel/include/IMP/pair_scores/RefineOncePairScore.h (revision 0) +++ kernel/include/IMP/pair_scores/RefineOncePairScore.h (revision 0) @@ -0,0 +1,44 @@ +/** + * \file RefineOncePairScore.h + * \brief For particles that are bonds, exand the pairticle + * into several so as to conserve the volume. + * + * Copyright 2007-8 Sali Lab. All rights reserved. + */ + +#ifndef __IMP_REFINE_ONCE_PAIR_SCORE_H +#define __IMP_REFINE_ONCE_PAIR_SCORE_H + +#include "../PairScore.h" +#include "../UnaryFunction.h" +#include "../ParticleRefiner.h" +#include "../internal/ObjectPointer.h" + +namespace IMP +{ + +//! Refine the input particles at most once with the ParticleRefiner. +/** Each passed particle is refined once before the resulting pairs + have the pair score called on them. + + \ingroup pairscore + */ +class IMPDLLEXPORT RefineOncePairScore : public PairScore +{ + internal::ObjectPointer r_; + internal::ObjectPointer f_; + +public: + /** \param[in] r The ParticleRefiner to call on each particle + \param[in] f The pair score to apply to the generated pairs +*/ + RefineOncePairScore(ParticleRefiner *r, PairScore *f); + virtual ~RefineOncePairScore(){} + virtual Float evaluate(Particle *a, Particle *b, + DerivativeAccumulator *da); + virtual void show(std::ostream &out=std::cout) const; +}; + +} // namespace IMP + +#endif /* __IMP_REFINE_ONCE_PAIR_SCORE_H */ Index: kernel/include/IMP.h =================================================================== --- kernel/include/IMP.h (revision 606) +++ kernel/include/IMP.h (working copy) @@ -55,6 +55,7 @@ #include "IMP/optimizers/states/VelocityScalingOptimizerState.h" #include "IMP/pair_scores/DistancePairScore.h" #include "IMP/pair_scores/SphereDistancePairScore.h" +#include "IMP/pair_scores/RefineOncePairScore.h" #include "IMP/singleton_scores/DistanceToSingletonScore.h" #include "IMP/singleton_scores/AttributeSingletonScore.h" #include "IMP/triplet_scores/AngleTripletScore.h" Index: kernel/src/pair_scores/SConscript =================================================================== --- kernel/src/pair_scores/SConscript (revision 606) +++ kernel/src/pair_scores/SConscript (working copy) @@ -1,6 +1,7 @@ Import('env') -files = ['DistancePairScore.cpp', 'SphereDistancePairScore.cpp'] +files = ['DistancePairScore.cpp', 'SphereDistancePairScore.cpp', + 'RefineOncePairScore.cpp'] files = [File(x) for x in files] Return('files') Index: kernel/pyext/IMP.i =================================================================== --- kernel/pyext/IMP.i (revision 606) +++ kernel/pyext/IMP.i (working copy) @@ -78,9 +78,16 @@ %pythonprepend DistancePairScore::DistancePairScore %{ args[0].thisown=0 %} + %pythonprepend BondCoverPairScore::BondCoverPairScore %{ + args[0].thisown=0 + %} %pythonprepend SphereDistancePairScore::SphereDistancePairScore %{ args[0].thisown=0 %} + %pythonprepend RefineOncePairScore::RefineOncePairScore %{ + args[0].thisown=0 + args[1].thisown=0 + %} %pythonprepend DistanceToSingletonScore::DistanceToSingletonScore %{ args[0].thisown=0 %} @@ -96,6 +103,9 @@ %pythonprepend MonteCarlo::set_local_optimizer %{ args[1].thisown=0 %} + %pythonprepend VRMLLogOptimizerState::add_particle_refiner %{ + args[1].thisown=0 + %} %pythonprepend Particle::get_value %{ check_particle(args[0], args[1]) %} @@ -167,6 +177,7 @@ %include "IMP/log.h" %include "IMP/Model.h" %include "IMP/PairScore.h" +%include "IMP/ParticleRefiner.h" %include "IMP/SingletonScore.h" %include "IMP/TripletScore.h" %include "IMP/Particle.h" @@ -196,7 +207,10 @@ %include "IMP/optimizers/states/CMMLogOptimizerState.h" %include "IMP/optimizers/states/VelocityScalingOptimizerState.h" %include "IMP/pair_scores/DistancePairScore.h" +%include "IMP/pair_scores/RefineOncePairScore.h" %include "IMP/pair_scores/SphereDistancePairScore.h" +%include "IMP/particle_refiners/BondCoverParticleRefiner.h" +%include "IMP/particle_refiners/ChildrenParticleRefiner.h" %include "IMP/singleton_scores/DistanceToSingletonScore.h" %include "IMP/singleton_scores/AttributeSingletonScore.h" %include "IMP/triplet_scores/AngleTripletScore.h"