| [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 |  */
 | 
|---|