Changeset e39e7a
- Timestamp:
- Jan 31, 2016, 12:43:17 PM (9 years ago)
- Branches:
- Action_Thermostats, Add_AtomRandomPerturbation, Add_FitFragmentPartialChargesAction, Add_RotateAroundBondAction, Add_SelectAtomByNameAction, Added_ParseSaveFragmentResults, AddingActions_SaveParseParticleParameters, Adding_Graph_to_ChangeBondActions, Adding_MD_integration_tests, Adding_ParticleName_to_Atom, Adding_StructOpt_integration_tests, AtomFragments, Automaking_mpqc_open, AutomationFragmentation_failures, Candidate_v1.5.4, Candidate_v1.6.0, Candidate_v1.6.1, ChangeBugEmailaddress, ChangingTestPorts, ChemicalSpaceEvaluator, CombiningParticlePotentialParsing, Combining_Subpackages, Debian_Package_split, Debian_package_split_molecuildergui_only, Disabling_MemDebug, Docu_Python_wait, EmpiricalPotential_contain_HomologyGraph, EmpiricalPotential_contain_HomologyGraph_documentation, Enable_parallel_make_install, Enhance_userguide, Enhanced_StructuralOptimization, Enhanced_StructuralOptimization_continued, Example_ManyWaysToTranslateAtom, Exclude_Hydrogens_annealWithBondGraph, FitPartialCharges_GlobalError, Fix_BoundInBox_CenterInBox_MoleculeActions, Fix_ChargeSampling_PBC, Fix_ChronosMutex, Fix_FitPartialCharges, Fix_FitPotential_needs_atomicnumbers, Fix_ForceAnnealing, Fix_IndependentFragmentGrids, Fix_ParseParticles, Fix_ParseParticles_split_forward_backward_Actions, Fix_PopActions, Fix_QtFragmentList_sorted_selection, Fix_Restrictedkeyset_FragmentMolecule, Fix_StatusMsg, Fix_StepWorldTime_single_argument, Fix_Verbose_Codepatterns, Fix_fitting_potentials, Fixes, ForceAnnealing_goodresults, ForceAnnealing_oldresults, ForceAnnealing_tocheck, ForceAnnealing_with_BondGraph, ForceAnnealing_with_BondGraph_continued, ForceAnnealing_with_BondGraph_continued_betteresults, ForceAnnealing_with_BondGraph_contraction-expansion, FragmentAction_writes_AtomFragments, FragmentMolecule_checks_bonddegrees, GeometryObjects, Gui_Fixes, Gui_displays_atomic_force_velocity, ImplicitCharges, IndependentFragmentGrids, IndependentFragmentGrids_IndividualZeroInstances, IndependentFragmentGrids_IntegrationTest, IndependentFragmentGrids_Sole_NN_Calculation, JobMarket_RobustOnKillsSegFaults, JobMarket_StableWorkerPool, JobMarket_unresolvable_hostname_fix, MoreRobust_FragmentAutomation, ODR_violation_mpqc_open, PartialCharges_OrthogonalSummation, PdbParser_setsAtomName, PythonUI_with_named_parameters, QtGui_reactivate_TimeChanged_changes, Recreated_GuiChecks, Rewrite_FitPartialCharges, RotateToPrincipalAxisSystem_UndoRedo, SaturateAtoms_findBestMatching, SaturateAtoms_singleDegree, StoppableMakroAction, Subpackage_CodePatterns, Subpackage_JobMarket, Subpackage_LinearAlgebra, Subpackage_levmar, Subpackage_mpqc_open, Subpackage_vmg, Switchable_LogView, ThirdParty_MPQC_rebuilt_buildsystem, TrajectoryDependenant_MaxOrder, TremoloParser_IncreasedPrecision, TremoloParser_MultipleTimesteps, TremoloParser_setsAtomName, Ubuntu_1604_changes, stable
- Children:
- 6a922b
- Parents:
- e3e52a
- git-author:
- Frederik Heber <heber@…> (08/31/15 12:38:50)
- git-committer:
- Frederik Heber <heber@…> (01/31/16 12:43:17)
- Location:
- src
- Files:
-
- 4 edited
Legend:
- Unmodified
- Added
- Removed
-
src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_molecule.cpp
re3e52a re39e7a 85 85 const Observable::channels_t GLMoleculeObject_molecule::AtomsChannels(getAtomsChannels()); 86 86 const Observable::channels_t GLMoleculeObject_molecule::HullChannels(getAllAtomicChangesChannels()); 87 const Observable::channels_t GLMoleculeObject_molecule::BoundingBoxChannels( getAllAtomicChangesChannels());87 const Observable::channels_t GLMoleculeObject_molecule::BoundingBoxChannels(1, molecule::BoundingBoxChanged); 88 88 const Observable::channels_t GLMoleculeObject_molecule::IndexChannels(1, molecule::IndexChanged); 89 89 const Observable::channels_t GLMoleculeObject_molecule::NameChannels(1, molecule::MoleculeNameChanged); … … 403 403 } 404 404 405 GLMoleculeObject_molecule::BoundingBoxInfo GLMoleculeObject_molecule::initBoundingBox() const406 { 407 BoundingBoxInfo info;405 molecule::BoundingBoxInfo GLMoleculeObject_molecule::initBoundingBox() const 406 { 407 molecule::BoundingBoxInfo info; 408 408 info.position = zeroVec; 409 409 info.radius = 0.; … … 411 411 } 412 412 413 GLMoleculeObject_molecule::BoundingBoxInfo GLMoleculeObject_molecule::updateBoundingBox() const414 { 415 BoundingBoxInfo info = BoundingBox.get();413 molecule::BoundingBoxInfo GLMoleculeObject_molecule::updateBoundingBox() const 414 { 415 molecule::BoundingBoxInfo info = BoundingBox.get(); 416 416 const molecule * const _molecule = getMolecule(MolIndex.get()); 417 417 if (_molecule != NULL) { … … 472 472 void GLMoleculeObject_molecule::resetBoundingBox() 473 473 { 474 BoundingBoxInfo info = BoundingBox.get();474 molecule::BoundingBoxInfo info = BoundingBox.get(); 475 475 setPosition(QVector3D(info.position[0], info.position[1], info.position[2])); 476 476 setScale(info.radius + 0.3); // getBoundingSphere() only sees atoms as points, so make the box a bit bigger -
src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_molecule.hpp
re3e52a re39e7a 24 24 #include "GLMoleculeObject_bond.hpp" 25 25 26 #include "molecule.hpp" 27 26 28 class atom; 27 29 class bond; 28 30 class GLMoleculeObject_atom; 29 31 class GLWorldScene; 30 class molecule;31 32 32 33 class GLMoleculeObject_molecule : public GLMoleculeObject, public Observer … … 109 110 typedef std::set<atomId_t> atoms_t; 110 111 111 /** Structure for the required information on the bounding box. 112 * 113 */ 114 struct BoundingBoxInfo { 115 //!> position of center 116 Vector position; 117 //!> radius of sphere 118 double radius; 119 }; 120 121 /** Structure for the required information on the tesselation hull. 122 * 123 */ 124 struct TesselationHullInfo { 125 }; 126 127 BoundingBoxInfo initBoundingBox() const; 112 molecule::BoundingBoxInfo initBoundingBox() const; 128 113 129 114 QGeometryData updateTesselationHull() const; 130 BoundingBoxInfo updateBoundingBox() const;115 molecule::BoundingBoxInfo updateBoundingBox() const; 131 116 atoms_t updateAtoms(); 132 117 moleculeId_t updateIndex() const; … … 153 138 boost::function<std::string ()> MolNameUpdater; 154 139 boost::function<QGeometryData ()> TesselationHullUpdater; 155 boost::function< BoundingBoxInfo ()> BoundingBoxUpdater;140 boost::function<molecule::BoundingBoxInfo ()> BoundingBoxUpdater; 156 141 boost::function<atoms_t ()> PresentAtomsUpdater; 157 142 … … 163 148 Cacheable<QGeometryData> TesselationHull; 164 149 //!> contains newest version of the bounding box on request 165 ObservedValue< BoundingBoxInfo> BoundingBox;150 ObservedValue<molecule::BoundingBoxInfo> BoundingBox; 166 151 //!> contains the current live set of atoms for the molecule 167 152 ObservedValue<atoms_t> PresentAtoms; -
src/molecule.cpp
re3e52a re39e7a 36 36 37 37 #include <algorithm> 38 #include <boost/assign.hpp> 38 39 #include <boost/bind.hpp> 39 40 #include <boost/foreach.hpp> … … 50 51 #include "CodePatterns/enumeration.hpp" 51 52 #include "CodePatterns/Log.hpp" 53 #include "CodePatterns/Observer/Observable.hpp" 52 54 #include "CodePatterns/Observer/Notification.hpp" 53 55 #include "config.hpp" … … 67 69 #include "WorldTime.hpp" 68 70 71 using namespace boost::assign; 72 73 // static entities 74 static Observable::channels_t getBoundingBoxChannels() 75 { 76 Observable::channels_t channels; 77 channels += molecule::AtomInserted, molecule::AtomRemoved, molecule::AtomMoved; 78 return channels; 79 } 69 80 70 81 /************************************* Functions for class molecule *********************************/ … … 83 94 BondCount(this,boost::bind(&molecule::doCountBonds,this),"BondCount"), 84 95 atomIdPool(1, 20, 100), 96 BoundingBoxSweepingAxis(std::vector<AtomDistanceMap_t>(NDIM)), 85 97 _lastchangedatomid(-1), 86 98 last_atom(0) … … 92 104 OurChannel->addChannel(type); 93 105 106 // cannot initialize in initializer body as then channels have not been setup yet 107 BoundingBox.reset( 108 new Cacheable<BoundingBoxInfo>( 109 this, boost::bind(&molecule::updateBoundingBox, boost::cref(this)), "molecule_BoundingBox", getBoundingBoxChannels())); 110 94 111 strcpy(name,World::getInstance().getDefaultName().c_str()); 95 } ;112 } 96 113 97 114 molecule *NewMolecule(){ … … 177 194 atomIds.erase( oldId ); 178 195 atomIds.insert( newId ); 196 // also update BoundingBoxSweepingAxis 197 for (int i=0;i<NDIM;++i) { 198 AtomDistanceMap_t::left_iterator iter = BoundingBoxSweepingAxis[i].left.find(oldId); 199 ASSERT(iter != BoundingBoxSweepingAxis[i].left.end(), 200 "molecule::changeAtomId() - could not find atom "+toString(oldId) 201 +" in BoundingBoxSweepingAxis."); 202 const double component = iter->second; 203 BoundingBoxSweepingAxis[i].left.erase(iter); 204 BoundingBoxSweepingAxis[i].left.insert( std::make_pair(newId, component) ); 205 } 179 206 return true; 180 207 } … … 237 264 atomIds.erase( _atom->getId() ); 238 265 { 266 BoundingBoxInfo oldinfo = updateBoundingBox(); 267 for (int i=0;i<NDIM;++i) 268 BoundingBoxSweepingAxis[i].left.erase( _atom->getId() ); 269 BoundingBoxInfo newinfo = updateBoundingBox(); 270 if (oldinfo != newinfo) 271 NOTIFY(BoundingBoxChanged); 272 } 273 { 239 274 NOTIFY(AtomNrChanged); 240 275 atomIdPool.releaseId(_atom->getNr()); … … 264 299 std::pair<iterator,bool> res = atomIds.insert(key->getId()); 265 300 if (res.second) { // push atom if went well 301 { 302 BoundingBoxInfo oldinfo = updateBoundingBox(); 303 for (int i=0;i<NDIM;++i) 304 BoundingBoxSweepingAxis[i].left.insert( std::make_pair(key->getId(), key->getPosition()[i])); 305 BoundingBoxInfo newinfo = updateBoundingBox(); 306 if (oldinfo != newinfo) 307 NOTIFY(BoundingBoxChanged); 308 } 266 309 NOTIFY(AtomNrChanged); 267 310 key->setNr(atomIdPool.getNextId()); … … 1033 1076 } 1034 1077 1078 molecule::BoundingBoxInfo molecule::updateBoundingBox() const 1079 { 1080 BoundingBoxInfo info; 1081 Vector min = zeroVec; 1082 Vector max = zeroVec; 1083 for (int i=0;i<NDIM;++i) { 1084 if (!BoundingBoxSweepingAxis[i].right.empty()) { 1085 min[i] = BoundingBoxSweepingAxis[i].right.begin()->first; 1086 max[i] = BoundingBoxSweepingAxis[i].right.rbegin()->first; 1087 } 1088 } 1089 info.radius = (.5*(max-min)).Norm(); 1090 info.position = .5*(max+min); 1091 return info; 1092 } 1093 1094 molecule::BoundingBoxInfo molecule::getBoundingBox() const 1095 { 1096 return **BoundingBox; 1097 } 1098 1035 1099 void molecule::update(Observable *publisher) 1036 1100 { … … 1052 1116 // emit others about one of our atoms moved 1053 1117 _lastchangedatomid = _atom->getId(); 1118 // update entry in map 1119 BoundingBoxInfo oldinfo = updateBoundingBox(); 1120 for (int i=0;i<NDIM;++i) { 1121 AtomDistanceMap_t::left_iterator iter = BoundingBoxSweepingAxis[i].left.find(_atom->getId()); 1122 ASSERT(iter != BoundingBoxSweepingAxis[i].left.end(), 1123 "molecule::recieveNotification() - could not find atom "+toString(_atom->getId()) 1124 +" in BoundingBoxSweepingAxis."); 1125 BoundingBoxSweepingAxis[i].left.erase(iter); 1126 BoundingBoxSweepingAxis[i].left.insert( 1127 std::make_pair(_atom->getId(), _atom->getPosition()[i]) ); 1128 } 1129 BoundingBoxInfo newinfo = updateBoundingBox(); 1054 1130 OBSERVE; 1055 1131 NOTIFY(AtomMoved); 1132 if (oldinfo != newinfo) 1133 NOTIFY(BoundingBoxChanged); 1056 1134 break; 1057 1135 } -
src/molecule.hpp
re3e52a re39e7a 22 22 23 23 #include <string> 24 25 #include <boost/bimap/bimap.hpp> 26 #include <boost/bimap/unordered_set_of.hpp> 27 #include <boost/bimap/multiset_of.hpp> 28 #include <boost/optional.hpp> 29 #include <boost/shared_ptr.hpp> 24 30 25 31 #include "AtomIdSet.hpp" … … 115 121 MoleculeNameChanged, 116 122 IndexChanged, 123 BoundingBoxChanged, 117 124 AboutToBeRemoved, 118 125 NotificationType_MAX … … 271 278 272 279 public: 280 281 /** Structure for the required information on the bounding box. 282 * 283 */ 284 struct BoundingBoxInfo { 285 //!> position of center 286 Vector position; 287 //!> radius of sphere 288 double radius; 289 290 /** Equivalence operator for bounding box. 291 * 292 * \return true - both bounding boxes have same position and radius 293 */ 294 bool operator==(const BoundingBoxInfo &_other) const 295 { return (radius == _other.radius) && (position == _other.position); } 296 297 /** Inequivalence operator for bounding box. 298 * 299 * \return true - bounding boxes have either different positions or different radii or both 300 */ 301 bool operator!=(const BoundingBoxInfo &_other) const 302 { return !(*this == _other); } 303 }; 304 305 private: 306 307 /** Returns the current bounding box. 308 * 309 * \return Shape with center and extension of box 310 */ 311 BoundingBoxInfo updateBoundingBox() const; 312 313 // stuff for keeping bounding box up-to-date efficiently 314 315 //!> Cacheable for the bounding box, ptr such that 316 boost::shared_ptr< Cacheable<BoundingBoxInfo> > BoundingBox; 317 /** Bimap storing atomic ids and the component per axis. 318 * 319 * We need a bimap in order to have the components sorted and be able to 320 * access max and min values in linear time and also access the ids in 321 * constant time in order to update the map, when atoms move, are inserted, 322 * or removed. 323 */ 324 typedef boost::bimaps::bimap< 325 boost::bimaps::unordered_set_of< atomId_t >, 326 boost::bimaps::multiset_of< double, std::greater<double> > 327 > AtomDistanceMap_t; 328 std::vector<AtomDistanceMap_t> BoundingBoxSweepingAxis; 329 330 public: 331 332 /** Returns the current bounding box of this molecule. 333 * 334 * \return bounding box info with center and radius 335 */ 336 BoundingBoxInfo getBoundingBox() const; 273 337 274 338 /** Function to create a bounding spherical shape for the currently associated atoms.
Note:
See TracChangeset
for help on using the changeset viewer.