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