Ignore:
Timestamp:
Jul 24, 2015, 4:44:35 PM (9 years ago)
Author:
Frederik Heber <heber@…>
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:
e7341e
Parents:
fac58f
git-author:
Frederik Heber <heber@…> (06/02/15 10:41:40)
git-committer:
Frederik Heber <heber@…> (07/24/15 16:44:35)
Message:

FIX: GLMoleculeObject_molecule() may overlap with atomInserted() signal.

  • this is because GLMoleculeObject_molecule takes some time till init() is called and its runs in a separate thread (hence, further atoms may be loaded into the just created atoms). As we first signOn() and then call init(), we may end up initializing atoms whose atomInserted signal then also comes in but lateron. This causes the AtomsInSceneMap to have double entries and the assertion to fail. We now keep book of all atomic ids inserted during init() and these are ok to appear doubly and their signal is skipped.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/UIElements/Views/Qt4/Qt3D/GLMoleculeObject_molecule.cpp

    rfac58f rf3b597  
    266266      atomicid = (*atomiter)->getId();
    267267      atomInserted(atomicid);
     268      InitAtomNodesSet.insert(atomicid);
    268269
    269270      // create bond objects in scene
     
    542543{
    543544  LOG(3, "INFO: GLWorldScene: Received signal atomInserted for atom "+toString(_id)+".");
    544   GLMoleculeObject_atom *atomObject = new GLMoleculeObject_atom(GLMoleculeObject::meshSphere, this, _id);
    545   ASSERT( atomObject != NULL,
    546       "GLMoleculeObject_molecule::atomInserted - could not create atom object for "+toString(_id));
    547   AtomNodeMap::iterator iter = AtomsinSceneMap.find(_id);
    548   ASSERT(iter == AtomsinSceneMap.end(),
    549       "GLMoleculeObject_molecule::atomInserted - same atom with id "+toString(_id)+" added again.");
    550   AtomsinSceneMap.insert( make_pair(_id, atomObject) );
    551 
    552   qRegisterMetaType<atomId_t>("atomId_t");
    553   qRegisterMetaType<bond::ptr>("bond::ptr");
    554   qRegisterMetaType<GLMoleculeObject_bond::SideOfBond>("GLMoleculeObject_bond::SideOfBond");
    555   connect (atomObject, SIGNAL(clicked(atomId_t)), this, SIGNAL(atomClicked(atomId_t)));
    556   connect (atomObject, SIGNAL(changed()), this, SIGNAL(changed()));
    557   connect (atomObject, SIGNAL(hoverChanged(GLMoleculeObject *)), this, SIGNAL(changed()));
    558   connect (atomObject, SIGNAL(hoverChanged(GLMoleculeObject *)), this, SLOT(hoverChangedSignalled(GLMoleculeObject *)));
    559   connect (atomObject, SIGNAL(selectionChanged()), this, SIGNAL(changed()));
    560   connect (atomObject, SIGNAL(BondsInserted(const bond::ptr , const GLMoleculeObject_bond::SideOfBond)), this, SLOT(bondInserted(const bond::ptr , const GLMoleculeObject_bond::SideOfBond)));
    561   connect (atomObject, SIGNAL(indexChanged(GLMoleculeObject_atom*, int, int)), this, SIGNAL(changeAtomId(GLMoleculeObject_atom*, int, int)));
    562 
    563   isBoundingBoxUptodate = false;
    564 
    565   if (m_objectId  == -1)
    566     setObjectId(_id);
     545  // remove ids if second insertion via update comes in
     546  if ((!InitAtomNodesSet.empty()) && (InitAtomNodesSet.find(_id) != InitAtomNodesSet.end())) {
     547    // the problem is as follows:
     548    // In order to get really all atoms, we first signOn to molecule and then call init()
     549    // however, in init() further atoms may have been loaded which are then also
     550    // instantiated by init(). Note only that but we also obtain an update() from
     551    // molecule itself (because we signOn'd before) that a new atom is to be inserted
     552    // hence, this would cause double insertion of the same atom and this has to be
     553    // caught
     554    InitAtomNodesSet.erase(_id);
     555    LOG(4, "Atom with " << _id << " has already been added.");
     556  } else {
     557    GLMoleculeObject_atom *atomObject = new GLMoleculeObject_atom(GLMoleculeObject::meshSphere, this, _id);
     558    ASSERT( atomObject != NULL,
     559        "GLMoleculeObject_molecule::atomInserted - could not create atom object for "+toString(_id));
     560    AtomNodeMap::iterator iter = AtomsinSceneMap.find(_id);
     561    ASSERT(iter == AtomsinSceneMap.end(),
     562        "GLMoleculeObject_molecule::atomInserted - same atom with id "+toString(_id)+" added again.");
     563    AtomsinSceneMap.insert( make_pair(_id, atomObject) );
     564
     565    qRegisterMetaType<atomId_t>("atomId_t");
     566    qRegisterMetaType<bond::ptr>("bond::ptr");
     567    qRegisterMetaType<GLMoleculeObject_bond::SideOfBond>("GLMoleculeObject_bond::SideOfBond");
     568    connect (atomObject, SIGNAL(clicked(atomId_t)), this, SIGNAL(atomClicked(atomId_t)));
     569    connect (atomObject, SIGNAL(changed()), this, SIGNAL(changed()));
     570    connect (atomObject, SIGNAL(hoverChanged(GLMoleculeObject *)), this, SIGNAL(changed()));
     571    connect (atomObject, SIGNAL(hoverChanged(GLMoleculeObject *)), this, SLOT(hoverChangedSignalled(GLMoleculeObject *)));
     572    connect (atomObject, SIGNAL(selectionChanged()), this, SIGNAL(changed()));
     573    connect (atomObject, SIGNAL(BondsInserted(const bond::ptr , const GLMoleculeObject_bond::SideOfBond)), this, SLOT(bondInserted(const bond::ptr , const GLMoleculeObject_bond::SideOfBond)));
     574    connect (atomObject, SIGNAL(indexChanged(GLMoleculeObject_atom*, int, int)), this, SIGNAL(changeAtomId(GLMoleculeObject_atom*, int, int)));
     575
     576    isBoundingBoxUptodate = false;
     577
     578    if (m_objectId  == -1)
     579      setObjectId(_id);
     580  }
    567581
    568582  // add all bonds
Note: See TracChangeset for help on using the changeset viewer.