AtomsListConfigurator.py 3.7 KB
Newer Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
#MDANSE : Molecular Dynamics Analysis for Neutron Scattering Experiments
#------------------------------------------------------------------------------------------
#Copyright (C)
#2015- Eric C. Pellegrini Institut Laue-Langevin
#BP 156
#6, rue Jules Horowitz
#38042 Grenoble Cedex 9
#France
#pellegrini[at]ill.fr
#goret[at]ill.fr
#aoun[at]ill.fr
#
#This library is free software; you can redistribute it and/or
#modify it under the terms of the GNU Lesser General Public
#License as published by the Free Software Foundation; either
#version 2.1 of the License, or (at your option) any later version.
#
#This library is distributed in the hope that it will be useful,
#but WITHOUT ANY WARRANTY; without even the implied warranty of
#MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
#Lesser General Public License for more details.
#
#You should have received a copy of the GNU Lesser General Public
#License along with this library; if not, write to the Free Software
#Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA

''' 
Created on Mar 30, 2015

:author: Eric C. Pellegrini
'''

from MDANSE.Framework.UserDefinitionsStore import UD_STORE
from MDANSE.Framework.Configurators.IConfigurator import IConfigurator
from MDANSE.MolecularDynamics.Trajectory import find_atoms_in_molecule

class AtomsListConfigurator(IConfigurator):    
    '''
    This configurator allows of a given list of atom names.

    The atoms has to belong to the same molecule.
        
    :note: this configurator depends on 'trajectory'
    '''

    type = 'atoms_list'
    
    _default = None
                    
    def __init__(self, name, nAtoms=2, **kwargs):
        '''
        Initializes the configurator.

        :param name: the name of the configurator as it will appear in the configuration.
        :type name: str
        :param nAtoms: the (exact) number of atoms of the list.
        :type nAtoms: int
        '''
        
        IConfigurator.__init__(self, name, **kwargs)
        
        self._nAtoms = nAtoms
        
    @property
    def nAtoms(self):
        
        return self._nAtoms
    
    def configure(self, configuration, value):
        '''
        Configure an input value. 
        
        The value must be a string that can be either an atom selection string or a valid user 
        definition.
        
        :param configuration: the current configuration
        :type configuration: a MDANSE.Framework.Configurable.Configurable object
        :param value: the input value
        :type value: str
        '''
                          
        trajConfig = configuration[self._dependencies['trajectory']]
                
        if UD_STORE.has_definition(trajConfig["basename"],"%d_atoms_list" % self._nAtoms,value): 
            molecule,atoms = UD_STORE.get_definition(trajConfig["basename"],"%d_atoms_list" % self._nAtoms,value)
        else:
            molecule,atoms=value

        self["value"] = value

        indexes = [find_atoms_in_molecule(trajConfig['instance'].universe,molecule, at, True) for at in atoms]
          
        self['atoms'] = zip(*indexes)      
        
        self['n_values'] = len(self['atoms'])
96
                                    
97
98
99
100
101
102
103
104
    def get_information(self):
        '''
        Returns some informations the atom selection.
        
        :return: the information about the atom selection.
        :rtype: str
        '''

105
        if not self.has_key("atoms"):
106
107
108
            return "No configured yet"
        
        info = []
109
        info.append("Number of selected %d-tuplets:%d" % (self._nAtoms,self["n_values"]))
110
111
        
        return "\n".join(info)