Changeset 329cf3


Ignore:
Timestamp:
Feb 10, 2015, 2:09:10 PM (10 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:
cd5aa0
Parents:
c1d837
git-author:
Frederik Heber <heber@…> (01/25/15 12:57:10)
git-committer:
Frederik Heber <heber@…> (02/10/15 14:09:10)
Message:

FIX: All MakroActions now have prototype_actions and copy from that.

  • this fixes the segfault when calling a MakroAction such as MolecularDynamics and unchecking output-every-step, causing the OutputAction to be removed from the sequence, and when re-performing Action with again unchecked option, the action cannot be removed any longer.
  • prototype_actions is prepared in ActionRegistry on program start and all cloned MakroActions copy their specific actions set and MakroAction accesses it via a ref in callAll().
Location:
src/Actions
Files:
9 edited

Legend:

Unmodified
Added
Removed
  • src/Actions/ActionSequence.cpp

    rc1d837 r329cf3  
    5353{
    5454  // we need to override copy cstor as we have pointer referenced objects
    55   for(actionSet::iterator it=actions.begin(); it!=actions.end(); it++){
     55  for(actionSet::const_iterator it=_other.actions.begin(); it!=_other.actions.end(); it++){
    5656    actions.push_back((*it)->clone());
    5757  }
  • src/Actions/FragmentationAction/MolecularDynamicsAction.cpp

    rc1d837 r329cf3  
    5454
    5555// static instances
    56 ActionSequence FragmentationMolecularDynamicsAction::actions;
     56ActionSequence FragmentationMolecularDynamicsAction::prototype_actions;
    5757bool FragmentationMolecularDynamicsAction::isPrepared = false;
    5858
     
    6262  // present. If not, we still copy the position cleanly into a new step where then
    6363  // forces are set according to summed fragmentary contributions. This is much cleaner.
    64   actions.addAction(AR.getActionByName(std::string("verlet-integration")));
    65   actions.addAction(AR.getActionByName(std::string("output")));
    66   actions.addAction(AR.getActionByName(std::string("clear-fragment-results")));
    67   actions.addAction(AR.getActionByName(std::string("destroy-adjacency")));
    68   actions.addAction(AR.getActionByName(std::string("create-adjacency")));
    69   actions.addAction(AR.getActionByName(std::string("update-molecules")));
    70   actions.addAction(AR.getActionByName(std::string("fragment-molecule")));
    71   actions.addAction(AR.getActionByName(std::string("fragment-automation")));
    72   actions.addAction(AR.getActionByName(std::string("analyse-fragment-results")));
     64  prototype_actions.addAction(AR.getActionByName(std::string("verlet-integration")));
     65  prototype_actions.addAction(AR.getActionByName(std::string("output")));
     66  prototype_actions.addAction(AR.getActionByName(std::string("clear-fragment-results")));
     67  prototype_actions.addAction(AR.getActionByName(std::string("destroy-adjacency")));
     68  prototype_actions.addAction(AR.getActionByName(std::string("create-adjacency")));
     69  prototype_actions.addAction(AR.getActionByName(std::string("update-molecules")));
     70  prototype_actions.addAction(AR.getActionByName(std::string("fragment-molecule")));
     71  prototype_actions.addAction(AR.getActionByName(std::string("fragment-automation")));
     72  prototype_actions.addAction(AR.getActionByName(std::string("analyse-fragment-results")));
    7373  isPrepared = true;
    7474}
     
    7777{
    7878  // empty sequence
    79   while (actions.removeLastAction() != NULL);
     79  while (prototype_actions.removeLastAction() != NULL);
    8080  isPrepared = false;
    8181}
  • src/Actions/FragmentationAction/StructuralOptimizationAction.cpp

    rc1d837 r329cf3  
    5454
    5555// static instances
    56 ActionSequence FragmentationStructuralOptimizationAction::actions;
     56ActionSequence FragmentationStructuralOptimizationAction::prototype_actions;
    5757bool FragmentationStructuralOptimizationAction::isPrepared = false;
    5858
     
    6262  // present. If not, we still copy the position cleanly into a new step where then
    6363  // forces are set according to summed fragmentary contributions. This is much cleaner.
    64   actions.addAction(AR.getActionByName(std::string("destroy-adjacency")));
    65   actions.addAction(AR.getActionByName(std::string("create-adjacency")));
    66   actions.addAction(AR.getActionByName(std::string("update-molecules")));
    67   actions.addAction(AR.getActionByName(std::string("fragment-molecule")));
    68   actions.addAction(AR.getActionByName(std::string("fragment-automation")));
    69   actions.addAction(AR.getActionByName(std::string("analyse-fragment-results")));
    70   actions.addAction(AR.getActionByName(std::string("force-annealing")));
    71   actions.addAction(AR.getActionByName(std::string("output")));
    72   actions.addAction(AR.getActionByName(std::string("clear-fragment-results")));
     64  prototype_actions.addAction(AR.getActionByName(std::string("destroy-adjacency")));
     65  prototype_actions.addAction(AR.getActionByName(std::string("create-adjacency")));
     66  prototype_actions.addAction(AR.getActionByName(std::string("update-molecules")));
     67  prototype_actions.addAction(AR.getActionByName(std::string("fragment-molecule")));
     68  prototype_actions.addAction(AR.getActionByName(std::string("fragment-automation")));
     69  prototype_actions.addAction(AR.getActionByName(std::string("analyse-fragment-results")));
     70  prototype_actions.addAction(AR.getActionByName(std::string("force-annealing")));
     71  prototype_actions.addAction(AR.getActionByName(std::string("output")));
     72  prototype_actions.addAction(AR.getActionByName(std::string("clear-fragment-results")));
    7373  isPrepared = true;
    7474}
     
    7777{
    7878  // empty sequence
    79   while (actions.removeLastAction() != NULL);
     79  while (prototype_actions.removeLastAction() != NULL);
    8080  isPrepared = false;
    8181}
  • src/Actions/GraphAction/SubgraphDissectionAction.cpp

    rc1d837 r329cf3  
    5858
    5959// static instances
    60 ActionSequence GraphSubgraphDissectionAction::actions;
     60ActionSequence GraphSubgraphDissectionAction::prototype_actions;
    6161bool GraphSubgraphDissectionAction::isPrepared = false;
    6262
    6363void GraphSubgraphDissectionAction::prepare(ActionRegistry &AR)
    6464{
    65   actions.addAction(AR.getActionByName(std::string("push-atom-selection")));
    66   actions.addAction(AR.getActionByName(std::string("select-all-atoms")));
    67   actions.addAction(AR.getActionByName(std::string("destroy-adjacency")));
    68   actions.addAction(AR.getActionByName(std::string("create-adjacency")));
    69   actions.addAction(AR.getActionByName(std::string("update-molecules")));
    70   actions.addAction(AR.getActionByName(std::string("pop-atom-selection")));
     65  prototype_actions.addAction(AR.getActionByName(std::string("push-atom-selection")));
     66  prototype_actions.addAction(AR.getActionByName(std::string("select-all-atoms")));
     67  prototype_actions.addAction(AR.getActionByName(std::string("destroy-adjacency")));
     68  prototype_actions.addAction(AR.getActionByName(std::string("create-adjacency")));
     69  prototype_actions.addAction(AR.getActionByName(std::string("update-molecules")));
     70  prototype_actions.addAction(AR.getActionByName(std::string("pop-atom-selection")));
    7171  isPrepared = true;
    7272}
     
    7575{
    7676  // empty sequence
    77   while (actions.removeLastAction() != NULL);
     77  while (prototype_actions.removeLastAction() != NULL);
    7878  isPrepared = false;
    7979}
  • src/Actions/MakroAction.cpp

    rc1d837 r329cf3  
    6060  ActionSequence::stateSet states;
    6161};
     62
     63MakroAction::MakroAction(const MakroAction &_instance) :
     64    Action(_instance.Traits),
     65    actions(_instance.actions)
     66{}
    6267
    6368MakroAction::MakroAction(const ActionTrait &_trait,ActionSequence& _actions) :
  • src/Actions/MakroAction.hpp

    rc1d837 r329cf3  
    1818
    1919#include "Actions/Action.hpp"
     20#include "Actions/ActionSequence.hpp"
    2021
    2122class ActionSequenceTest;
     
    2324namespace MoleCuilder {
    2425  class ActionRegistry;
    25   class ActionSequence;
    2626
    2727/**
     
    3535  friend class ::ActionSequenceTest;
    3636public:
     37  MakroAction(const MakroAction &_instance);
    3738  MakroAction(const ActionTrait &_trait,ActionSequence& _actions);
    3839  virtual ~MakroAction();
     
    8283  Dialog *fillDialog(Dialog *dialog);
    8384
     85  //!> this points to the instance of a specific MakroAction, we need to ref for callAll()
    8486  ActionSequence &actions;
    8587};
  • src/Actions/MakroAction_impl_header.hpp

    rc1d837 r329cf3  
    263263  //!> flag to check whether actions have been prepared
    264264  static bool isPrepared;
    265   //!> sequence of actions for this macro action
    266   static ActionSequence actions;
     265  //!> sequence of prototype actions for this macro action
     266  static ActionSequence prototype_actions;
     267  //!> sequence of actions for this specific instance
     268  ActionSequence actions;
    267269
    268270private:
  • src/Actions/MakroAction_impl_pre.hpp

    rc1d837 r329cf3  
    263263// =========== constructor ===========
    264264ACTION::ACTION () :
    265   MakroAction(ActionTraits< ACTION >(), actions)
     265  MakroAction(ActionTraits< ACTION >(), actions),
     266  actions(prototype_actions)
    266267{}
    267268
     
    294295Action* ACTION::clone(enum QueryOptions flag) const
    295296{
    296   if (flag == Interactive)
    297     return new ACTION();
    298   else
    299     return new ACTION(*this);
     297  return new ACTION();
    300298}
    301299
  • src/Actions/MoleculeAction/TranslateAction.cpp

    rc1d837 r329cf3  
    5656
    5757// static instances
    58 ActionSequence MoleculeTranslateAction::actions;
     58ActionSequence MoleculeTranslateAction::prototype_actions;
    5959bool MoleculeTranslateAction::isPrepared = false;
    6060
     
    6363  // we simply have to select all the molecule's atoms and use the respective
    6464  // translate Action
    65   actions.addAction(AR.getActionByName(std::string("push-atom-selection")));
    66   actions.addAction(AR.getActionByName(std::string("select-molecules-atoms")));
    67   actions.addAction(AR.getActionByName(std::string("translate-atoms")));
    68   actions.addAction(AR.getActionByName(std::string("pop-atom-selection")));
     65  prototype_actions.addAction(AR.getActionByName(std::string("push-atom-selection")));
     66  prototype_actions.addAction(AR.getActionByName(std::string("select-molecules-atoms")));
     67  prototype_actions.addAction(AR.getActionByName(std::string("translate-atoms")));
     68  prototype_actions.addAction(AR.getActionByName(std::string("pop-atom-selection")));
    6969  isPrepared = true;
    7070}
     
    7373{
    7474  // empty sequence
    75   while (actions.removeLastAction() != NULL);
     75  while (prototype_actions.removeLastAction() != NULL);
    7676  isPrepared = false;
    7777}
Note: See TracChangeset for help on using the changeset viewer.