/** \page recent Change History \par Week of March 6, 2010 - Publications now have a description field to give browsers an indication of what is in the publication to aid selection of what to read/cite. \par Week of Feb 27, 2010 - IMP::algebra::decompose_rotation_into_axis_angle() was renamed to IMP::algebra::get_angle_and_axis(). - renamed IMP::atom::bond() and IMP::atom::unbond() to IMP::atom::create_bond() and IMP::atom::destroy_bond() to be more consistent with things - renamed IMP::core::root() to IMP::core::get_root() \par Week of Feb 21, 2010 - IMP::Object::set_was_owned() was changed to IMP::Object::set_was_used() as that better reflects what the flag means. - various more interpolation and endian methods had their names fixed (by adding \c get_) - the function get_mean() on vectors was removed as it duplicated IMP::algebra::get_centroid() - build_Transformation3D_from_transformation3D was replaced by IMP.algebra.get_transformation_3d() - IMP::algebra::almost_equal() is now IMP::algebra::get_are_almost_equal() to fit the naming conventions. - the random vector generators have been cleaned up to remove redundant ones and make the names more consistent. They now have the form of either - IMP::algebra::get_random_vector_in() or IMP::algebra::get_random_vector_on() where there is one argument describing the volume or shape (such as an IMP::algebra::SphereD<4>). - or IMP::algebra::get_uniform_surface_cover() where the first argument is the primitive whose surface we are covering and the second is the number of points. Some good sed strings are - "s#random_vector_in_unit_sphere()#get_random_vector_in(IMP.algebra.get_unit_sphere_3d())#g" - "s#random_vector_in_unit_box()#get_random_vector_in(IMP.algebra.get_unit_bounding_box_3d())#g" - "s#random_vector_on_unit_sphere()#get_random_vector_on(IMP.algebra.get_unit_sphere_3d())#g" - "s#random_vector_on_unit_box()#get_random_vector_on(IMP.algebra.get_unit_bounding_box_3d())#g" - "s#random_vector_in_box(#get_random_vector_in(#g" - "s#random_vector_on_box(#get_random_vector_on(#g" - "s#random_vector_in_sphere(#get_random_vector_in(#g" - "s#random_vector_on_sphere(#get_random_vector_on(#g" - "s#grid_cover#get_grid_surface_cover#g" - "s#uniform_coverr#get_uniform_surface_cover#g" . - Spheres in IMP::algebra are now supported in general dimensions. See IMP::algebra::SphereD. - Many methods in IMP::algebra were renamed to be more consistent with other methods or general conventions. Most of these simply involved adding \c get_ as a prefix and/or add a \c _3d suffix when they did not take any arguments. - build_Rotation2D_from_Vector2D became IMP::algebra::get_rotation_to_x_axis() - most of the Rotation3D and Transformation3D functions (in addition, IMP::algebra::get_identity_rotation_3d() and IMP::algebra::get_identity_transformation_3d() added the \c _3d so we can add 2D versions at some point) - IMP::algebra::Transformation3D::get_transformed() and IMP::algebra::Rotation3D::get_rotated(). Replacing \c ".transform(" worked in the \imp code base. - IMP::algebra::get_distance(), this also carries over to the IMP::core::get_distance() The following global replacements are probably safe (in sed expressions) - "s#core.distance(#core.get_distance#g" - "s#algebra.distance(#algebra.get_distance#g" - "s#\.transform(#.get_transformed(#g" Only in C++ - "s#\.rotate(#.get_rotated(#g" Only in C++ - "s#rotation_from#get_rotation_from#g" - "s#rotation_in#get_rotation_in#g" - "s#identity_rotation(#get_indentity_rotation_3d(" - "s#::distance(#::get_distance(#g" . - IMP::algebra::Vector3D and IMP::algebra::Vector3Ds were replaced by the expanded (non-typedef) version in functions parsed by SWIG as the current situation was extremely brittle. For the moment, you should not use the typedefs in definitions that swig sees. Sorry. - IMP::algebra::Sphere3DPatch was renamed to IMP::algebra::SpherePatch3D to be consistent with the other geometry and allow us to support higher dimensions in the future. - rigid_align_first_to_second was renamed to IMP::algebra::get_transformation_aligning_first_to_second() and build_Transformation2D_from_point_sets was renamed to IMP::algebra::get_transformation_aligning_pair() \par Week of Feb 14, 2010 - The IMP::atom::Bond types were rearranged to reconcile the protein-centric classification with ligand support. - IMP::atom::Atom no longer has charge since we have IMP::atom::Charged. - IMP::atom::read_mol2() and IMP::atom::write_mol2() were added - IMP::atom::Selector and descendents renamed to IMP::atom::PDBSelector since we will soon have Mol2Selectors. In addition, the IMP::atom::IgnoreAlteriativesSelector is now IMP::atom::NonAlternativeSelector to keep the name positive, like the others. In the \imp body, all instances of the string Selector were for PDBSelectors and so sed was safe to use. - IMP::atom::read_pdb() lost the "ignore_alternatives" argument. Instead, all of the provided selectors, other than IMP::atom::AllSelector ignore alternatives internally. Code that uses the IMP::atom::AllSelector should probably change to the IMP::atom::NonAlternativeSelector. - IMP::example renamed (from examples) - The IMP_USAGE_CHECK() macro lost the (unused) third argument. \par Week of February 3, 2010 - The model io code as moved into the kernel so it is now IMP::write_model() and IMP::read_model() - Remove the version_info argument from the implementation macros. Instead, just pick up the module version info automatically. - Add a function Object::get_type_name() and Object::get_module() to get the respective bits of information about each object. - Change Object::show() to be a non-virtual wrapper which prints the object name and other info before passing control off to Object::do_show(). - The containers were moved to IMP.container. See that module page for a full list of what moved. In the process, the backwards compatability functions were removed from IMP::container::PairsRestraint and kin. - IMP.atom.create_protein() now returns the created protein - the simplify functions have been moved from IMP.helper. They are now IMP.atom.create_simplified_along_backbone(). - IMP.helper.clone() has been renamed to IMP.atom.create_clone() - IMP.misc.ConnectingPairContainer has been moved to IMP.core.ConnectingPairContainer - The locations for pixels in IMP::em::DensityMap have been moved to the center of the corresponding voxel from the lower left corner. - IMP::em::get_transformed(), IMP::em::get_resampled() and IMP::em::get_density() have been added. - The documentation has been majorly cleaned up and simplified. Please look around and see if you like it. There are now two main pages, the introduction and the developers guide, rather than the previous plethora of pages. - IMP::algebra::Cone3D::get_bounding_sphere() has been removed since it was not of general use, not returning the bounding sphere you would expect and was trivial to implement. - IMP::algebra::projection() was removed since it didn't actually project onto the segment and the name didn't follow the normal conventions. And it wasn't used. - Most geometry now has namespace methods IMP::algebra::get_bounding_box(), IMP::algebra::get_surface_area(), IMP::algebra::get_volume(). \par Week of January 22, 2010 - A generic geometry layer has been added (see \ref genericgeometry). Using it, IMP::atom::rmsd(), IMP::algebra::alignment_taking_first_to_second() and the new IMP::atom::native_overlap() all can work on either collections of either IMP::core::XYZ particles or IMP::algebra::Vector3Ds. - Deprecated functionality has been removed from IMP.core. For those still using it, IMP::core::ClosePairsScoreState was replaced by IMP::core::ClosePairContainer and IMP::core::CloseBipartitePairsScoreState was replaced by IMP::core::CloseBipartitePairContainer. - The macros for Scores changed slightly. Scores not in \imp svn which use the IMP_*_SCORE macros now have to implement the get_is_changed() function outside of the class declaration and scores which use the IMP_SIMPLE_*_SCORE now don't have to implement the functions to get interactions and used particles. - Rename IMP::core::MinimumPairScoreRestraint (and kin, Maximum, Singleton, Triplet and Quad) to IMP::core::MinimumPairRestraint. - Add IMP::core::MinumumPairScore (and kin). \par Week of January 1, 2010 - IMP::em is now using Particles to resample density maps and for fitting restraints. The previous ParticleAccessPoint mechanism is removed. - IMP::UsageException and IMP::InternalException are now reserved for their respective checks (and cannot be thrown by IMP_THROW()). This makes the distinction between API exceptions (which are thrown in any build mode and should be documented and tested) and helper exceptions which are only thrown when checks are turned on (and hence should not be documented) clearer. - IMP::core::RestraintSet moved to IMP::RestraintSet. The restraint sets now simply define a tree with weights which the model traverses as opposed to being an opaque IMP::Restraint themselves. This means that incremental evaluation of restraints in restraint sets now works and that restraints in restraint sets can be individually evaluated. Existing working usage should not have changed (so \c sed should manage updates just fine), but the internal implementation is completely new, so pay attention. - \imp now has a text i/o layer consisting of IMP::TextInput and IMP::TextOutput. These classes are convertible to C++ streams and implicitly constructable from both streams and file paths. As a result, functions that take them will work when called with a string for a file path, a Python file or a C++ stream. - The IMP.examples module now documents how to use the needed aspects of scons and SWIG. - The IMP.examples module is used as the basis for new modules created by the make-module script, so those include more documentation and are tested. - Module overview pages are now generated from the information passed in the SConscript file, rather than from the (now removed) modulename.dox file. See the examples file for an example of the things you can do there. - boost program options is now a checked for dependency. - The IMP::Model now uses dependency information from IMP::ScoreStates to automatically reorder the IMP::ScoreStates so that they are evaluated in the right order. Also, IMP::Model::evaluate() on a subset of the restraints now only updates the needed score states, not all of them. - Functions on rigid bodies no longer provide the IMP::core::RigidMemberRefiner as a default as it is, pretty much always, the wrong thing to use. That class may go away without notice in the future and is no longer documented. - the IMP::helper::create_simple_connectivity_on_rigid_bodies() and IMP::helper::create_simple_excluded_volume_on_rigid_bodies() now both take an IMP::Refiner as an (optional) final argument. This makes it so they can be used with the rigid bodies created from molecular hierarchies. This code still needs to be updated and the docs don't reflect what the code was or is doing, so use with caution (see notes in the header file). - The IMP::helper create* functions now all take non-Object inputs as const& to make clear what is input and that there are no memory management gotchas. - a new base class IMP::Constraint has been added for constraints. Various other classes have been renamed to be consistent. \par Week of December 11 - The interface of IMP::PairScore changed slightly to make the function signatures more uniform across various methods. Now all methods that take a pair of IMP::Particle objects take a const IMP::ParticlePair&. Previously some took that, some took an IMP::ParticlePair and some took two IMP::Particle*s. If you have an implementation of an IMP::PairScore outside of svn, you will have to update your function signatures (the compiler will tell you where). Backward compatible IMP::PairScore::evaluate() methods have been provided, so simple users of pair scores shouldn't see a difference. - IMP::core::PairRestraint takes a IMP::ParticlePair in the constructor instead of two IMP::Particle*s. A backwards compatible constructor can be added if needed. - IMP::ParticlePair::first and second went away since no one claimed to be using it and it complicated the implementation. - The generic restraints/score states/scores infrastructure has been extended to triplets and quads (for angles and torsion angles). \par Week of December 4 - \imp now makes use of Boost.Filesystem to manipulate paths. Things may not work well on systems where boost libs are not available which does not support posix paths. But libless boost installs generally don't exist outside of our test systems. - new functions like IMP::core::get_example_path(filename) and IMP::core::get_data_path(filename) allow one to easily find a data file named 'filename' for the examples and library internal data. - The IMP::display module has been revamped in order to support non-linear geometry. VRML support has been dropped. CMM support will be dropped unless someone requests it (as IMP::display::ChimeraWriter does all it does and more). \par Week of November 19 - imp.xcodeproj was moved into tools and updated accordingly - the bin directory finally went away - IMP::display::ChimeraWriter now supports the latest version of Chimera - IMP::display::CGOWriter was renamed to IMP::display::PymolWriter as it can do more than just CGO. - IMP::VectorOfRefCounted::operator[] can now be used for assignments just like a normal vector. No more need to use the IMP::VectorOfRefCounted::set() method. - the IMP::atom::Hierarchy constructor from an IMP::Particle* is now explicit (as were the ther decorator constructors) \par Week of November 12 - All exception types are now mapped to equivalent classes in Python. The class hierarchy is similar (e.g. IMP::ModelException derives from IMP::Exception in both C++ and Python) so all \imp exceptions can be caught in Python using "except IMP.Exception". For convenience, the IMP::IOException, IMP::ValueException and IMP::IndexException classes in Python also derive from the similarly-named standard Python classes (IOError, ValueError and IndexError respectively). \par week of October 29 Update - You can now add members to rigid bodies via IMP::core::RigidBody::add_member(). These members can be other rigid bodies (although this functionality is only lightly tested). - The code to get bounding volumes for IMP::atom::Hierarchy has been moved to the atom module, as as the clone and destroy code. They can be found at IMP::atom::clone(), IMP::atom::destroy(), IMP::atom::get_bounding_box(). - Added IMP::core::VolumeRestraint. - Several functions have been added to helper in creating restraints. They are create_simple_connectivity_on_rigid_bodies(), create_simple_connectivitiy_on_molecules(), create_simple_distance(), create_simple_diameter(), create_simple_em_fit(), and create_simple_excluded_volume_on_rigid_bodies(). Functions load_em_density_map() and set_rigid_bodies() are added as well. See IMP::helper for more information. - IMP::ScoreStates are further hidden. Namely, IMP::core::RigidBody constructs the needed score states internally, doing away with the need for the create functions (which have been done away with). In addition there are new decorators IMP::core::Cover and IMP::core::Centroid which manage their respective score states, further doing away with more create methods. The hierarchy-based create method for rigid bodies has been moved to the atom module and is called IMP::atom::rigid_body_setup_hierarchy(). - IMP::em::read_map() will figure out the file type to use automatically from the extension. Other such methods should follow suite. - A class IMP::core::StructureSet has been added to provide a convenient way to manage solutions of optimization runs. - IMP::core::RigidBodyMover now takes its angle argument in radians and is documented as such. - IMP::core::ClosePairsScoreState and IMP::core::CloseBipartitePairsScoreState have been replaced by IMP::core::ClosePairContainer and IMP::core::CloseBipartitePairContainer. The score states have been marked as deprecated and are mostly still there, but are more limited than they were. - IMP::core::AllPairsPairContainer has been renamed to IMP::core::AllPairContainer and a bipartite version has been added. - All containers now keep track of what they looked like on the previous time step. - The IMP::core::ListPairContainer and IMP::core::ListSingletonContainer have had their interface reduced a bit in order to make implementing change tracking easier. - The set of exceptions has been simplified to go along with simplification of the checks. We now have IMP::InternalException and IMP::UsageException which are thrown by the respective checks (and the former is thrown by IMP_FAILURE()). When you want to to pass an exception back to Python use one of IMP::ValueException or IMP::IndexException or IMP::IOException. There is also a new macro, IMP_THROW() to be used when you want to throw an exception with a nice error message. Please look at code you have worked on and make sure that the exceptions make sense given the new clarifications. - An IMP::ModelException is now thrown when IMP::Particle attributes attain invalid values. This exception can be caught to recover from failures of IMP::core::ConjugateGradients or difficult restraints. \par Week of October 15 - The set of functions needed to get meta information about IMP::Restraint and IMP::ScoreState objects has hopefully stabilized. Sorry about the thrashing. If you have restraints or score states not in SVN, see the corresponding IMP_RESTRAINT type macros, the IMP::Interaction class and base classes for what exactly you need to implement. \par Week of October 8 - IMP::Interaction was modified to split IMP::interaction::get_used_particles() into IMP::interaction::get_read_particles() and IMP::interaction::get_write_particles(). This makes it possible to check for IMP::ScoreState objects being in an inconsistent order (so that the input to one is updated after it is read). Later, we will be able to automatically order the score states ensure that there are no problems. - IMP::atom::Hierarchy has been modifier to get rid of the IMP::atom::Hierarchy::Type. Instead, all types are contained in the decorators. IMP::atom::get_by_type() was also updated to reflect this. - IMP_check() and IMP_assert() have been replaced with IMP_USAGE_CHECK() and IMP_INTERNAL_CHECK() respectively. Hopefully this makes it clearer when to use which. IMP::set_check_level() has been revised accordingly (to use IMP::USAGE and IMP::USAGE_AND_INTERNAL). Also, IMP_failure() and IMP_not_implemented() have been renamed to IMP_FAILURE() and IMP_NOT_IMPLEMENTED() to make all macros be all caps. To update external code, - replace IMP.EXPENSIVE with IMP.USAGE_AND_INTERNAL - replace IMP.CHEAP with IMP.USAGE - replace IMP_assert and IMP_check as above. \par Week of October 1 - IMP::ScoreState and IMP::Restraint now better track the set of particles that they use and the dependencies between the particles. To this end, a new base class IMP::Interaction has been added with methods to get the inter-particle interactions and the set of particles used. - .cpp, .h, .py and SConscript files which contain the string "DO NOT COMMIT" will be rejected on checkin. Use this to make experimental or debugging changes you are making so you don't accidentally commit them. - The search module is no longer built by default and is not longer supported. It will get moved out of svn shortly. - IMP::ScoreState objects now also have IMP::Interacting::get_interacting_particles() methods. Soon IMP::PairScore and IMP::SingletonScore objects will too. \par Week of September 27 - Some support for gather statistics has been added to IMP::Model (see IMP::Model::set_gather_statistics()). If requested, an API can be provided so that the individual data points can be returned to programs. - A class IMP::core::RigidBodyDistancePairScore has been added which provides accelerated computations for the distance between two rigid bodies. - The SWIG input files were renamed from swig.i to swig.i-in to aid in dependency tracking. - rigid bodies now have two sets of particles associated with them in the various places they are used. One is the IMP::core::RigidBodyMember particles, as was previously the case. The other is defined through a refiner (and could be the RigidBodyMember particles if a IMP::core::RigidMembersRefiner is used). The idea is that you sometimes want some particles which are transformed along with the rigid body, but which are not really part of the representation of the rigid body. Examples would include marker points or multiresolution representations of proteins. \par Week of September 20 - all \c .i files have been renamed to start with \c IMP_ to help make dependency tracking easier. - static builds (builds with \c static=True) build both the static and dynamic libraries and just static executables - the \c profile build target has been removed as \c static=True does the important bit of what is needed. Just do \c linkflags=['-pg'] to add the needed link flag for \c gprof. - Restraints should now implement IMP::Restraint::unprotected_evaluate() instead of IMP::Restraint::evaluate(). The latter can now be called outside of IMP::Model::evaluate() and will return the right answer always. - \c bin/imppy.sh no longer works, as was previously warned. Use \c tools/imppy.sh instead. The bin directory will go away eventually, for now the script just tells you to use the tools version. \par Week of August 30 - A new score IMP::core::BoundingBox3DSingletonScore has been added to keep particles in a box. - str should now work better in Python when applied to IMP::Object objects and a few others. Objects should use the new IMP_SHOWABLE and IMP_SHOWABLE_INLINE macros instead of declaring show functions directory to make it so that they work in Python. It is now a bug to \c print or \c str to not return something useful in Python for any \imp object. \par Week of August 23 - each module now has a version, eg IMP::get_module_version_info() which is also returned by the various restraions of the module. The Python code checkes that loaded libraries have the expected version numbers to try to provide better messages when runtime linking problems occur. - the various ::bounding_box() methods have been renamed to ::get_bounding_box() to be more consistent with the other names. - Python documentation is now parsed by doxygen \par Week of August 15 - The Object::get_version_info() result now includes the SVN revision info when building from SVN. This means you can use it to more easily tell exactly what a built version of \imp was built from. \par Week of August 8 - Treatment of hetatoms in hierarchies (and hence pdbs) is now documented. See IMP::atom::Hierarchy. This involved broadening IMP::atom::Residue to handle ligands and having IMP::atom::Hierarchy::LIGAND, IMP::atom::Hierarchy::AMINOACID and IMP::atom::Hierarchy::NUCLEICACID be handled by IMP::atom::Residue. - IMP::atom::read_pdb() currently drops HOH ATOM records on the floor. We should add a IMP::atom::Water decorator if anyone wants to handle them (since they aren't atoms and don't have elements). - IMP::atom::Mass() has been added for decorating particles with mass. IMP::atom::Atom mass has been moved to that. - The scheme for generating atom types is now fully specified. See the IMP::atom::AtomType documentation. - IMP::atom::Atom and IMP::atom::Residue have been somewhat restructured. Some of the helper functions have been renamed to be more descriptive or removed (if they duplicated other easily accessible functionality). get_residue_index() has been removed (since you can just call get_index() on the return result of the IMP::atom::get_residue()). IMP::atom::get_chain() now returns an IMP::atom::Chain. root() was renamed to IMP::atom::get_root() for consistency. - SWIG files are now generated from a file called swig.i in the pyext directory. This file only has to contain module-specific commands such as lines to wrap headers and instantiate module templates. No more boilerplate. - The contents of bin are moving to tools since the two directories both contained assorted development tools (not all of which were executable). For now, bin/imppy.sh will still work, but that will go away soon. - IMP::Decorator::show() now just takes the stream (it used to take a prefix also, which was often ignored). Anyone who implemented a decorator will have to delete the second argument of their show function. \par Week of August 1 - Containers now have methods IMP::SingletonContainer::evaluate(), IMP::PairContainer::evaluate(), IMP::SingletonContainer::apply() and IMP::PairContainer::apply(). Using these can be significantly faster than looping over the particles externally. Similarly, there is IMP::SingletonScore::evaluate(), IMP::PairScore::evaluate(), IMP::SingletonModifier::apply(), IMP::PairModifier::apply(). - The decorator functions have been renamed to IMP::Decorator::setup_particle(), IMP::Decorator::decorate_particle() and IMP::Decorator::particle_is_instance(). A shell script \c tools/update-decorators is provided which updates the names in all code in subdirectories of the current directory. Please backup things first. - a function, IMP::Restraint::safe_evaluate() has been added to be used when requesting the value of restraints outside of the IMP::Model::evaluate(). \par Week of July 18 - The atom::BondPairContainer has been renamed to atom::BondPairFilter since it wasn't a real container. A real atom::BondPairContainer has been added. - Out of source builds mostly works. To do an out of source build, make a link to \c scons_tools and \c SConstruct from the source directory in the build directory and then add the line \command{repository="../path_to_src_dir"} in the \c config.py in the build directory. Then running \c scons in the build directory will put generated files there. This allows you to make both a \c release and \c fast build off of the same set of sources. Proper docs will be added soon. - The SConscript setup for a module has been greatly simplified so it should be easy enough for users to maintain their own module and updates to the build system shouldn't involve changes to user SConscripts any more. This does mean that any non-svn modules need to be updated. Look at IMP.core or another module and copy what is there. Again, proper docs will be added soon. \par Week of July 11 - Per Javi's suggestion, the conventions have been split into \ref codingconventions "Coding conventions" and \ref conventions "API conventions" and linked from the main page. - benchmarks got moved to their own module, IMP::benchmark and will now be tracked over time - There is a \wiki{optimization_protocols,wiki page on optimization} - There is now a \wiki{internal_functionality,wiki page to list undocumented IMP-related functionality} \par Week of July 4 - FilteredListSingletonContainer and FilteredPairSingletonContainer went away as there was too much hard to factor code shared with IMP::core::ListSingletonContainer and IMP::core::PairSingletonContainer. The IMP::core::ClosePairsScoreState is now handled by a list of filters on the class itself. That is, do IMP::core::ClosePairsScoreState::add_close_pair_filter() to add a filter. - Hooks have been added to allow actions to be taken on an assertion or check failure. See IMP::HandleFailure and its descendants for more details. - IMP::display::CGOWriter has been much improved and now allows provides lots of display-time control and easy building of animations. - Generic optimizer states have been added (IMP::core::SingletonsOptimizerState and IMP::core::PairsOptimizerState). \par Week of June 15 - box distributions (IMP::algebra::random_vector_on_box(), IMP::algebra::random_vector_in_box()) take bounding boxes - IMP::em::DensityMap are now IMP::Object objects. Some current allocations on the stack may need to be changed (since ref counted objects can't be stack allocated). - IMP::em::DensityMap::Read() is now deprecated (as is IMP::em::DensityMap::Write) as they violated a slew of conventions. Use IMP::em::read_map() and IMP::em::write_map() instead. \par Week of June 8 - new methods IMP::atom::add_radii() and IMP::atom::add_bonds(); - Hierarchys to IMP::atom::Hierarchies - IMP::Particles has been changed to a new type. It no longer plays quite so well with Python lists (you can't create one from an arbitrary Python list). - The containers for multiple decorators have been revised to make them more useful. See IMP::Decorators. You can now implicitly convert, for %example, a IMP::core::XYZs to an IMP::Particles (as well as use IMP::Decorators::get_particles()). All methods that take a collection of particles with a certain type now instead take a IMP::Decorators. - A method that has expectations about the particles it takes should take decorators rather than particles. That is, anything which expects IMP::core::XYZ particles, should take an IMP::core::XYZs instead of IMP::Particles. - IMP_LIST() now takes an extra argument (the name of the plural container) - In C++ IMP::Decorator objects are implicitly convertible to IMP::Particle* objects. Unfortunately, making this work in Python is problematic. - More methods take and return decorators rather than IMP::Particles. This means it is clearer what their expectations are and what they produce. \par Week of May 15 - The IMP::helper module was added and various functionality moved there. See its documentation page for a list of what is there. - IMP::algebra::SphericalCoords was renamed to IMP::algebra::SphericalVector3D to be consistent with other algebra classes. - IMP::algebra::Rotation2D is now IMP::InvalidDefault to be consistent with the other similar classes. - We are trying to be a bit more specific about what is expected from a IMP::atom::Hierarchy. Towards that end, there are two methods for extracting a representation from a hierarchy, IMP::atom::get_detailed_representation(), and IMP::atom::get_simplified_representation() - A method has been added to produce a simplified copy of an IMP::atom::Hierarchy. The method is still a bit crude and could benefit from other people inspecting the output and saying how it should be improved. - There is now an IMP::algebra::BoundingBoxD (and IMP::algebra::BoundingBox3D) to track bounding boxes. There are methods like IMP::algebra::bound_box(Sphere3D) which gets the bounding box of a sphere. - Each IMP::Object has its own log level. If IMP::Object::set_log_level() is called with a value other than IMP::DEFAULT, the value is used for code within and called by the object. To support this in your objects you need to add IMP_OBJECT_LOG to the start of each major method. It has been added to some of the core objects. \par Week of May 8 - IMP::atom::MolecularHierarchy has been renamed to IMP::atom::Hierarchy. Use \command{sed -i.old "s#MolecularHierarchy#Hierarchy#g" my_files} - the long-deprecated Name(Decorator) was removed - The decorator suffix has been removed from decorator names. To update your code do \command{sed -i.old "s#\([a-zA-Z]\)Decorator#\1#g" **/*.h **/*.cpp **/*.py **/*.i} or \command{sed -i.old "s#\([a-zA-Z]\)Decorator#\1#g" `find * -name \*.h -or -name \*.cpp`} (and the various suffixes). - Unit conventions have been established and documented for distance, energy, force and angle. - there is a function IMP::atom::create_protein() to create a coarse grained protein. The function is crude so far, but the idea is that we should have standard ways of generating such things so that everyone can benefit from best practices. - a class IMP::atom::BondGraph has been added so Boost.Graph algorithms can be used with bond graphs - the \imp-specific doxygen commands have been documented. - the doxygen commands unstable{name} and untested{name} have been added to doxygen to be used for marking methods and functions as likely to change or not well tested. Pass the name of the class or method as name. - bonds can now be added to molecular hierarchies automatically see IMP::atom::add_bonds() \par Week of May 1 - There is a IMP::Rotation2D - You can now extract fixed Euler ZYZ angles from a IMP::Rotation3D. This code can serve as a template for extracting other Euler angle conventions if they are needed. - IMP::algebra::rotation_between_two_vectors() changed to IMP::algebra::rotation_taking_first_to_second() to make it clear which direction the rotation goes. \par Week of April 27 - IMP::Decorator derived objects are now convertible to bool. So code like \code if (d) { blah } \endcode works. - IMP::Decorator::cast now returns a null decorator (\c DecoratorName()) rather than throwing an exception. This might make it actually useful. - New IMP::statistics module for statistical methods (e.g. clustering). \par Week of April 20 - Support for taking advantage of rigid bodies in collision detection has been added via the IMP::core::RigidClosePairsFinder. - All IMP::core::ClosePairsScoreState-related functinality has been optimized and should be noticeably faster. - The EMBED project has been merged into the IMP::em module. Thus, it is no longer necessary to obtain EMBED separately to build IMP::em. - All C++ methods which work with std::istream or std::ostream arguments should now be usable from Python: any Python file-like object can be used. - The SWIG interface now ties in to the reference counting mechanism used in the C++ code, for all classes derived from IMP::RefCounted. So, for %example, deleting a Python object should not free the underlying C++ object if another C++ object holds a reference to it, and unrefing a C++ object should not delete it if a Python object still holds a reference to it. There should be no further need to manually keep references to Python objects to prevent things from being prematurely cleaned up. This should be transparent to the user; please report any problems. - IMP::atom::AtomDecorator no longer inherits from IMP::core::XYZDecorator. \par Week of April 13 - The decorators IMP::atom::AtomDecorator, IMP::atom::ChainDecorator, IMP::atom::ResidueDecorator etc. now inhertic from IMP::atom::MolecularHierarchyDecorator. This means they can set their IMP::atom::MolecularHierarchyDecorator::Type properly and saves a lot of typing in the common case. We can always make hierarchy decorators zero memory overhead if we find that the cost matters. - The base classes IMP::Comparable, IMP::NullDefault, IMP::ValidDefault and IMP::UninitializedDefault were added to document what the default constructors do for various objects in \imp. \par Week of April 6 - IMP::Object now defines pure virtual methods IMP::Object::get_version_info() and IMP::Object::show(). All non-abstract classes which inherit from IMP::Object must implement them. Doing this means they are more uniformly implemented and are documented in one place. - IMP::Object is now reference counted (the only objects this changes are IMP::Model and IMP::Optimizer). As a result optimizers and IMP::Model objects must be created on the heap. - IMP::RefCounted has had its name changed and no longer inherits from IMP::Object. This makes it easier to use independently. - the docs for reference counting (IMP::RefCounted) and and IMP::Decorator have been improved - running doxygen produces no warnings. Let's try to keep it that way. Run \command{scons doc > /dev/null} before you check in large blocks of new code to make sure that you didn't introduce warnings. - Helper classes have been added to make SingletonModifier and PairModifier objects look like functors for C++ and Python. This makes it so you can use \c map in Python and \c for_each in C++. See IMP::SingletonFunctor and IMP::PairFunctor for more information. - The recent changes page has moved to a doxygen page to make it easier to link changes back to the relevant source code. \par Week of March 20: - create_rigid_body(), create_rigid_bodies(), create_centroid() etc. now require you to add the score state to the model yourself. Whether the rigid body is enforced or not can be controlled by adding or removing the returned IMP::ScoreState. - All previously deprecated code has been removed. This includes indexes in particles, the no-argument constructor for particles and the functionality that was moved from core to atom. - The IMP::core::RigidBodyDecorator and IMP::core::RigidMemberDecorator have been simplified by removing the traits classes. There is now only one type of rigid body and it stores the list of member particles internally. - IMP::core::NameDecorator has been deprecated as IMP::Particles have built in names (use IMP::Particle::get_name(), IMP::Particle::set_name()). - IMP::atom::ChainDecorator has been added \par Week of March 13: - A new IMP::display::Writer, IMP::display::ChimeraWriter has been added which exports geometry to native Chimera constructs. It probably should be used instead of bild and cmm for most purposes as it combines the best of both types. - compose() for transformation is now a free function so compose(rotation, vector) will work via promotions. - the geometry classes have been cleaned up and are now more consistent with \imp standards (and more likely to do what their names/comments suggest). See IMP::algebra::Sphere3D, IMP::algebra::Cylinder3D, IMP::algebra::Segment3D, IMP::algebra::Plane3D etc. - ParticleRefiner has been renamed to IMP::Refiner since the Particle was long and unnecessary. */