source: src/Descriptors/AtomDescriptor.cpp@ d1c5e2

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
Last change on this file since d1c5e2 was d1c5e2, checked in by Tillmann Crueger <crueger@…>, 15 years ago

Improved Descriptor mechanism to allow calculations using descriptors.

  • Property mode set to 100644
File size: 4.0 KB
Line 
1/*
2 * AtomDescriptor.cpp
3 *
4 * Created on: Feb 5, 2010
5 * Author: crueger
6 */
7
8#include "AtomDescriptor.hpp"
9
10#include "World.hpp"
11
12#include <boost/bind.hpp>
13#include <cassert>
14
15using namespace std;
16
17typedef map<int,atom*> atoms_t;
18typedef atoms_t::iterator atoms_iter_t;
19
20AtomDescriptor::AtomDescriptor()
21{
22}
23
24AtomDescriptor::AtomDescriptor(const AtomDescriptor &desc) {
25}
26
27AtomDescriptor::~AtomDescriptor()
28{
29}
30
31
32atoms_t& AtomDescriptor::getAtoms(){
33 return World::get()->atoms;
34}
35
36atom* AtomDescriptor::find() {
37 atoms_t atoms = getAtoms();
38 atoms_iter_t res = find_if(atoms.begin(),atoms.end(),boost::bind(&AtomDescriptor::predicate,this,_1));
39 return (res!=atoms.end())?((*res).second):0;
40}
41
42vector<atom*> AtomDescriptor::findAll() {
43 vector<atom*> res;
44 atoms_t atoms = getAtoms();
45 atoms_iter_t iter;
46 for(iter=atoms.begin();iter!=atoms.end();++iter) {
47 if(predicate(*iter))
48 res.push_back((*iter).second);
49 }
50}
51
52// stuff for operators
53
54// AND
55AtomAndDescriptor::AtomAndDescriptor(const AtomDescriptor &_lhs,const AtomDescriptor &_rhs){
56 lhs=_lhs.clone();
57 rhs=_rhs.clone();
58}
59
60AtomAndDescriptor::AtomAndDescriptor(const AtomAndDescriptor &_desc)
61{
62 // the copy constructor needs it's parameter as const to work,
63 // however we need to be able to transfer the ownership of the pointers
64 // to the new method to avoid another cloning.
65 //
66 // the only place where the copy constructor is used for these classes,
67 // is when returning a temporary.
68 // this is one of the very rare cases when const_cast makes sense
69 AtomAndDescriptor &desc = const_cast<AtomAndDescriptor&>(_desc);
70 lhs = desc.lhs;
71 rhs = desc.rhs;
72}
73
74AtomAndDescriptor::~AtomAndDescriptor(){
75}
76
77bool AtomAndDescriptor::predicate(std::pair<int,atom*> atom){
78 return lhs->predicate(atom) && rhs->predicate(atom);
79}
80
81AtomAndDescriptor::desc_ptr AtomAndDescriptor::clone() const{
82 return desc_ptr(new AtomAndDescriptor(*lhs,*rhs));
83}
84
85AtomAndDescriptor operator&&(const AtomDescriptor &lhs, const AtomDescriptor &rhs){
86 return AtomAndDescriptor(lhs,rhs);
87}
88
89// OR
90
91AtomOrDescriptor::AtomOrDescriptor(const AtomDescriptor &_lhs,const AtomDescriptor &_rhs){
92 lhs=_lhs.clone();
93 rhs=_rhs.clone();
94}
95
96AtomOrDescriptor::AtomOrDescriptor(const AtomOrDescriptor &_desc)
97{
98 // the copy constructor needs it's parameter as const to work,
99 // however we need to be able to transfer the ownership of the pointers
100 // to the new method to avoid another cloning.
101 //
102 // the only place where the copy constructor is used for these classes,
103 // is when returning a temporary.
104 // this is one of the very rare cases when const_cast makes sense
105 AtomOrDescriptor &desc = const_cast<AtomOrDescriptor&>(_desc);
106 lhs = desc.lhs;
107 rhs = desc.rhs;
108}
109
110AtomOrDescriptor::~AtomOrDescriptor(){
111}
112
113bool AtomOrDescriptor::predicate(std::pair<int,atom*> atom){
114 return lhs->predicate(atom) || rhs->predicate(atom);
115}
116
117AtomAndDescriptor::desc_ptr AtomOrDescriptor::clone() const{
118 return desc_ptr(new AtomOrDescriptor(*lhs,*rhs));
119}
120
121AtomOrDescriptor operator||(const AtomDescriptor &lhs, const AtomDescriptor &rhs){
122 return AtomOrDescriptor(lhs,rhs);
123}
124
125// NOT
126
127AtomNotDescriptor::AtomNotDescriptor(const AtomDescriptor &_arg){
128 arg = _arg.clone();
129}
130
131AtomNotDescriptor::AtomNotDescriptor(const AtomNotDescriptor &_desc) {
132 // the copy constructor needs it's parameter as const to work,
133 // however we need to be able to transfer the ownership of the pointers
134 // to the new method to avoid another cloning.
135 //
136 // the only place where the copy constructor is used for these classes,
137 // is when returning a temporary.
138 // this is one of the very rare cases when const_cast makes sense
139 AtomNotDescriptor &desc = const_cast<AtomNotDescriptor&>(_desc);
140 arg = desc.arg;
141}
142
143AtomNotDescriptor::~AtomNotDescriptor()
144{
145}
146
147bool AtomNotDescriptor::predicate(std::pair<int,atom*> atom){
148 return !(arg->predicate(atom));
149}
150
151AtomAndDescriptor::desc_ptr AtomNotDescriptor::clone() const{
152 return desc_ptr(new AtomNotDescriptor(*arg));
153}
154
155AtomNotDescriptor operator!(const AtomDescriptor &arg){
156 return AtomNotDescriptor(arg);
157}
Note: See TracBrowser for help on using the repository browser.