[ce133f] | 1 | /*
|
---|
| 2 | * Project: MoleCuilder
|
---|
| 3 | * Description: creates and alters molecular systems
|
---|
| 4 | * Copyright (C) 2010 University of Bonn. All rights reserved.
|
---|
| 5 | * Please see the LICENSE file or "Copyright notice" in builder.cpp for details.
|
---|
| 6 | */
|
---|
| 7 |
|
---|
| 8 | /**
|
---|
[19bc74] | 9 | * \file descriptors.dox
|
---|
[ce133f] | 10 | *
|
---|
[19bc74] | 11 | * Created on: Oct 28, 2011
|
---|
[ce133f] | 12 | * Author: heber
|
---|
| 13 | */
|
---|
[750cff] | 14 |
|
---|
| 15 | /** \page descriptors Descriptors
|
---|
| 16 | *
|
---|
| 17 | * Descriptors help you to select a specific subset of a given array of
|
---|
| 18 | * elements. For the moment these elements are either instances of atom
|
---|
| 19 | * or molecule that the \ref world offers.
|
---|
| 20 | *
|
---|
| 21 | * They mostly work as an argument to either obtain a specific iterator
|
---|
| 22 | * over the elements (that silently skips all non-matching ones) or
|
---|
| 23 | * a subset.
|
---|
| 24 | *
|
---|
| 25 | * Note that the following boolean operators on descriptors work:
|
---|
| 26 | * - or
|
---|
| 27 | * - and
|
---|
| 28 | * - not
|
---|
| 29 | *
|
---|
| 30 | * Hence, these descriptors are very mighty. A typical use would be as follows:
|
---|
| 31 | * \code
|
---|
| 32 | * World::getInstance().getAllAtoms(AtomByType(1) && AtomByShape(Sphere(Vector(0,0,0), 2.)));
|
---|
| 33 | * \endcode
|
---|
| 34 | * which would return an AtomComposite of all hydrogen (Z=1) atoms within a
|
---|
| 35 | * sphere of radius 2. centered at (0,0,0).
|
---|
| 36 | *
|
---|
| 37 | * Or you may obtain iterators over a selection and use them in a loop as this:
|
---|
| 38 | * \code
|
---|
| 39 | * World::MoleculeIterator iter = World::getInstance().getMoleculeIter(MoleculeByFormula(Formula("H2O")));
|
---|
| 40 | * World::MoleculeIterator enditer = World::getInstance().moleculeEnd();
|
---|
| 41 | * std::cout << "List of all water molecules:" << std::endl;
|
---|
| 42 | * for (; iter != enditer; ++iter)
|
---|
| 43 | * std:cout << (*iter)->getId() << std::endl;
|
---|
| 44 | * \endcode
|
---|
| 45 | *
|
---|
| 46 | * \note There is difference between Selection and Descriptor. A
|
---|
| 47 | * Descriptor is just a predicate() that selects among a given list. The current
|
---|
| 48 | * Selection (of atoms/molecules) is a Descriptor \a applied to a the total
|
---|
| 49 | * list of all atoms/molecules. Hence, a selection refers to a subset where
|
---|
| 50 | * the Descriptor is just the condition that selects such a subset.
|
---|
| 51 | *
|
---|
| 52 | * \subsection descriptors-atom Atom Descriptors
|
---|
| 53 | *
|
---|
| 54 | * The following descriptors are present for atoms:
|
---|
| 55 | * - by id: AtomById()
|
---|
| 56 | * - of currently selected molecule(s): AtomsByMoleculeSelection()
|
---|
[b49568] | 57 | * - of molecule: AtomOfMolecule()
|
---|
[750cff] | 58 | * - currently selected atoms: AtomsBySelection()
|
---|
| 59 | * - within a Shape: AtomByShape()
|
---|
| 60 | * - of specific element: AtomByType()
|
---|
[7afb77] | 61 | * - within distance to: AtomsWithinDistanceOf() (uses LinkedCell_View)
|
---|
[750cff] | 62 | *
|
---|
| 63 | * \subsection descriptors-molecule Molecule Descriptors
|
---|
| 64 | *
|
---|
| 65 | * The following descriptors are present for molecules:
|
---|
| 66 | * - by formula: MoleculeByFormula()
|
---|
| 67 | * - by id: MoleculeById()
|
---|
| 68 | * - by name: MoleculeByName()
|
---|
| 69 | * - of currently selected atoms: MoleculesByAtomSelection()
|
---|
| 70 | * - by order of creation: MoleculeByOrder() (i.e. -1 is the last one, 1 is the
|
---|
| 71 | * first ever created, ...)
|
---|
| 72 | * - by pointer: MoleculeByPtr MoleculeByPtr()
|
---|
| 73 | * - currently selected molecules: MoleculesBySelection()
|
---|
| 74 | *
|
---|
[ea7a50] | 75 | * \subsection descriptors-world Descriptors and the World
|
---|
[750cff] | 76 | *
|
---|
[ea7a50] | 77 | * In the World we make heavy use of descriptors. However, the World is also
|
---|
| 78 | * responsibly of informing connected Observers about removal or insertion of
|
---|
| 79 | * atoms or molecules.
|
---|
| 80 | * That's why its containers are protectedly constructed as ObservedContainers.
|
---|
| 81 | * Whenever you walk through them with a normal iterator, afterwards an update()
|
---|
| 82 | * is initiated. Only if you use a const_interator, this is prevented. But this
|
---|
| 83 | * at the natural disadvantage that the reference may only be used in constant
|
---|
| 84 | * environment.
|
---|
| 85 | * Descriptors however may return non-const reference. And we rely heavily on
|
---|
| 86 | * these to cheaply give us the correct reference for a given id, element type,
|
---|
| 87 | * and so on. So how do we do this?
|
---|
| 88 | *
|
---|
| 89 | * Some of the descriptors are friends of the World and may use its internal
|
---|
| 90 | * containers directly, see AtomSelectionDescriptor_impl. Thus it can quickly
|
---|
| 91 | * walk through the atoms and find the correct one without causing huge delays
|
---|
| 92 | * by unnecessarily calling forth an update().
|
---|
| 93 | *
|
---|
| 94 | *
|
---|
| 95 | * \date 2012-01-06
|
---|
[750cff] | 96 | *
|
---|
| 97 | */
|
---|