source: src/Descriptors/MoleculeDescriptor_impl.hpp@ 808fd3

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 808fd3 was 1c51c8, checked in by Tillmann Crueger <crueger@…>, 15 years ago

Added methods for querying molecules using descriptors

  • Property mode set to 100644
File size: 4.2 KB
Line 
1#ifndef MOLECULEDESCRIPTOR_IMPL_HPP
2#define MOLECULEDESCRIPTOR_IMPL_HPP
3
4#include "Descriptors/MoleculeDescriptor.hpp"
5
6/************************ Declarations of implementation Objects ************************/
7
8/**
9 * This class implements a general Base class for MoleculeDescriptors using the PIMPL-Idiom
10 *
11 * The predicate for this class is empty and should be implemented by derived classes.
12 * By the predicate it is described which molecules should be picked for a given descriptor.
13 */
14
15class MoleculeDescriptor_impl
16{
17 friend class MoleculeDescriptor;
18public:
19
20 MoleculeDescriptor_impl();
21 virtual ~MoleculeDescriptor_impl();
22
23 /**
24 * Implement this abstract Method to make a concrete MoleculeDescriptor pick certain Molecules
25 */
26 virtual bool predicate(std::pair<moleculeId_t,molecule*>)=0;
27
28protected:
29
30 /**
31 * This method is called when the Descriptor is used to find the first matching
32 * Molecule. Walks through all Molecules and stops on the first match. Can be implemented
33 * when the searched Molecule can be found in a more efficient way. Calculated
34 * Moleculedescriptors will always use this method, so no improvement there.
35 */
36 virtual molecule* find();
37
38 /**
39 * This method is called when the Descriptor is used to find all matching Molecules.
40 * Walks through all Molecules and tests the predicate on each one. A vector of all
41 * matching Molecules is returned.
42 */
43 virtual std::vector<molecule*> findAll();
44
45 /**
46 * This method is used internally to query the Set of Molecules from the world.
47 * By using this method derived classes can also access the Internal World Datastructre.
48 * Implemented in full in the Base Descriptor Implementation, so only this one method
49 * needs to be friend with the World class.
50 */
51 World::MoleculeSet& getMolecules();
52};
53
54/************************** Universe and Emptyset *****************/
55
56/**
57 * A simple MoleculeDescriptor that will always match all Molecules present in the World.
58 */
59class MoleculeAllDescriptor_impl : public MoleculeDescriptor_impl {
60public:
61 MoleculeAllDescriptor_impl();
62 virtual ~MoleculeAllDescriptor_impl();
63
64 /**
65 * Always returns true for any Molecule
66 */
67 virtual bool predicate(std::pair<moleculeId_t,molecule*>);
68};
69
70
71/**
72 * An MoleculeDescriptor that never matches any Molecule in the World.
73 */
74class MoleculeNoneDescriptor_impl : public MoleculeDescriptor_impl {
75public:
76 MoleculeNoneDescriptor_impl();
77 virtual ~MoleculeNoneDescriptor_impl();
78
79 /**
80 * Always returns false for any Molecule
81 */
82 virtual bool predicate(std::pair<moleculeId_t,molecule*>);
83};
84
85/************************** Operator stuff ************************/
86
87/**
88 * Intersection of two MoleculeDescriptors
89 */
90class MoleculeAndDescriptor_impl : public MoleculeDescriptor_impl
91{
92public:
93 MoleculeAndDescriptor_impl(MoleculeDescriptor::impl_ptr _lhs, MoleculeDescriptor::impl_ptr _rhs);
94 ~MoleculeAndDescriptor_impl();
95
96 /**
97 * This predicate uses the predicate from the first && the predicate from the
98 * second Descriptor to decide if an Molecule should be selected.
99 */
100 virtual bool predicate(std::pair<moleculeId_t,molecule*>);
101
102private:
103 MoleculeDescriptor::impl_ptr lhs;
104 MoleculeDescriptor::impl_ptr rhs;
105};
106
107/**
108 * Union of two MoleculeDescriptors
109 */
110class MoleculeOrDescriptor_impl : public MoleculeDescriptor_impl
111{
112public:
113 MoleculeOrDescriptor_impl(MoleculeDescriptor::impl_ptr _lhs, MoleculeDescriptor::impl_ptr _rhs);
114 virtual ~MoleculeOrDescriptor_impl();
115
116 /**
117 * This predicate uses the predicate form the first || the predicate from the
118 * second Descriptor to decide if an Molecule should be selected.
119 */
120 virtual bool predicate(std::pair<moleculeId_t,molecule*>);
121
122private:
123 MoleculeDescriptor::impl_ptr lhs;
124 MoleculeDescriptor::impl_ptr rhs;
125};
126
127/**
128 * Set Inversion of a Descriptor
129 */
130class MoleculeNotDescriptor_impl : public MoleculeDescriptor_impl
131{
132public:
133 MoleculeNotDescriptor_impl(MoleculeDescriptor::impl_ptr _arg);
134 virtual ~MoleculeNotDescriptor_impl();
135
136 /**
137 * Opposite of the given descriptor predicate.
138 */
139 virtual bool predicate(std::pair<moleculeId_t,molecule*>);
140
141private:
142 MoleculeDescriptor::impl_ptr arg;
143};
144
145#endif //MOLECULEDESCRIPTOR_IMPL_HPP
Note: See TracBrowser for help on using the repository browser.