Example #1
0
 def _init_derived_scopes(self):
     if self.scope_ids is None:
         if len(self.scopes) != self.natom:
             raise TypeError('When the scope_ids are derived automatically, the length of the scopes list must match the number of atoms.')
         lookup = {}
         scopes = []
         self.scope_ids = np.zeros(self.natom, int)
         for i in xrange(self.natom):
             scope = self.scopes[i]
             scope_id = lookup.get(scope)
             if scope_id is None:
                 scope_id = len(scopes)
                 scopes.append(scope)
                 lookup[scope] = scope_id
             self.scope_ids[i] = scope_id
         self.scopes = scopes
     for scope in self.scopes:
         check_name(scope)
     # check the range of the ids
     if self.scope_ids.min() != 0 or self.scope_ids.max() != len(self.scopes)-1:
         raise ValueError('The ffatype_ids have incorrect bounds.')
     if log.do_medium:
         log('The following scopes are present in the system:')
         log.hline()
         log('                 Scope   ID   Number of atoms')
         log.hline()
         for scope_id, scope in enumerate(self.scopes):
             log('%22s  %3i       %3i' % (scope, scope_id, (self.scope_ids==scope_id).sum()))
         log.hline()
         log.blank()
Example #2
0
 def _init_derived_scopes(self):
     if self.scope_ids is None:
         if len(self.scopes) != self.natom:
             raise TypeError(
                 'When the scope_ids are derived automatically, the length of the scopes list must match the number of atoms.'
             )
         lookup = {}
         scopes = []
         self.scope_ids = np.zeros(self.natom, int)
         for i in range(self.natom):
             scope = self.scopes[i]
             scope_id = lookup.get(scope)
             if scope_id is None:
                 scope_id = len(scopes)
                 scopes.append(scope)
                 lookup[scope] = scope_id
             self.scope_ids[i] = scope_id
         self.scopes = scopes
     for scope in self.scopes:
         check_name(scope)
     # check the range of the ids
     if self.scope_ids.min() != 0 or self.scope_ids.max() != len(
             self.scopes) - 1:
         raise ValueError('The ffatype_ids have incorrect bounds.')
     if log.do_medium:
         log('The following scopes are present in the system:')
         log.hline()
         log('                 Scope   ID   Number of atoms')
         log.hline()
         for scope_id, scope in enumerate(self.scopes):
             log('%22s  %3i       %3i' %
                 (scope, scope_id, (self.scope_ids == scope_id).sum()))
         log.hline()
         log.blank()
Example #3
0
    def detect_ffatypes(self, rules):
        """Initialize the ``ffatypes`` attribute based on ATSELECT rules.

           **Argument:**

           rules
                A list of (ffatype, rule) pairs that will be used to initialize
                the attributes ``self.ffatypes`` and ``self.ffatype_ids``.

           If the system already has FF atom types, they will be overwritten.
        """
        with log.section('SYS'):
            # Give warning if needed
            if self.ffatypes is not None:
                if log.do_warning:
                    log.warn('Overwriting existing FF atom types.')
            # Compile all the rules
            my_rules = []
            for ffatype, rule in rules:
                check_name(ffatype)
                if isinstance(rule, str):
                    rule = atsel_compile(rule)
                my_rules.append((ffatype, rule))
            # Use the rules to detect the atom types
            lookup = {}
            self.ffatypes = []
            self.ffatype_ids = np.zeros(self.natom, int)
            for i in range(self.natom):
                my_ffatype = None
                for ffatype, rule in my_rules:
                    if rule(self, i):
                        my_ffatype = ffatype
                        break
                if my_ffatype is None:
                    raise ValueError(
                        'Could not detect FF atom type of atom %i.' % i)
                ffatype_id = lookup.get(my_ffatype)
                if ffatype_id is None:
                    ffatype_id = len(lookup)
                    self.ffatypes.append(my_ffatype)
                    lookup[my_ffatype] = ffatype_id
                self.ffatype_ids[i] = ffatype_id
            # Make sure all is done well ...
            self._init_derived_ffatypes()
Example #4
0
    def detect_ffatypes(self, rules):
        """Initialize the ``ffatypes`` attribute based on ATSELECT rules.

           **Argument:**

           rules
                A list of (ffatype, rule) pairs that will be used to initialize
                the attributes ``self.ffatypes`` and ``self.ffatype_ids``.

           If the system already has FF atom types, they will be overwritten.
        """
        with log.section('SYS'):
            # Give warning if needed
            if self.ffatypes is not None:
                if log.do_warning:
                    log.warn('Overwriting existing FF atom types.')
            # Compile all the rules
            my_rules = []
            for ffatype, rule in rules:
                check_name(ffatype)
                if isinstance(rule, basestring):
                    rule = atsel_compile(rule)
                my_rules.append((ffatype, rule))
            # Use the rules to detect the atom types
            lookup = {}
            self.ffatypes = []
            self.ffatype_ids = np.zeros(self.natom, int)
            for i in xrange(self.natom):
                my_ffatype = None
                for ffatype, rule in my_rules:
                    if rule(self, i):
                        my_ffatype = ffatype
                        break
                if my_ffatype is None:
                    raise ValueError('Could not detect FF atom type of atom %i.' % i)
                ffatype_id = lookup.get(my_ffatype)
                if ffatype_id is None:
                    ffatype_id = len(lookup)
                    self.ffatypes.append(my_ffatype)
                    lookup[my_ffatype] = ffatype_id
                self.ffatype_ids[i] = ffatype_id
            # Make sure all is done well ...
            self._init_derived_ffatypes()
Example #5
0
 def _init_derived_ffatypes(self):
     if self.ffatype_ids is None:
         if len(self.ffatypes) != self.natom:
             raise TypeError('When the ffatype_ids are derived automatically, the length of the ffatypes list must match the number of atoms.')
         lookup = {}
         ffatypes = []
         self.ffatype_ids = np.zeros(self.natom, int)
         for i in xrange(self.natom):
             if self.scope_ids is None:
                 ffatype = self.ffatypes[i]
                 key = ffatype, None
             else:
                 scope_id = self.scope_ids[i]
                 ffatype = self.ffatypes[i]
                 key = ffatype, scope_id
             ffatype_id = lookup.get(key)
             if ffatype_id is None:
                 ffatype_id = len(ffatypes)
                 ffatypes.append(ffatype)
                 lookup[key] = ffatype_id
             self.ffatype_ids[i] = ffatype_id
         self.ffatypes = ffatypes
     for ffatype in self.ffatypes:
         check_name(ffatype)
     # check the range of the ids
     if self.ffatype_ids.min() != 0 or self.ffatype_ids.max() != len(self.ffatypes)-1:
         raise ValueError('The ffatype_ids have incorrect bounds.')
     # differentiate ffatype_ids if the same ffatype_id is used in different
     # scopes
     if self.scopes is not None:
         self.ffatype_id_to_scope_id = {}
         fixed_fids = {}
         for i in xrange(self.natom):
             fid = self.ffatype_ids[i]
             sid = self.ffatype_id_to_scope_id.get(fid)
             if sid is None:
                 self.ffatype_id_to_scope_id[fid] = self.scope_ids[i]
             elif sid != self.scope_ids[i]:
                 # We found the same ffatype_id in a different scope_id. This
                 # must be fixed. First check if we have already a new
                 # scope_id ready
                 sid = self.scope_ids[i]
                 new_fid = fixed_fids.get((sid, fid))
                 if new_fid is None:
                     # No previous new fid create, do it now.
                     new_fid = len(self.ffatypes)
                     # Copy the ffatype label
                     self.ffatypes.append(self.ffatypes[fid])
                     # Keep track of the new fid
                     fixed_fids[(sid, fid)] = new_fid
                     if log.do_warning:
                         log.warn('Atoms with type ID %i in scope %s were changed to type ID %i.' % (fid, self.scopes[sid], new_fid))
                 # Apply the new fid
                 self.ffatype_ids[i] = new_fid
                 self.ffatype_id_to_scope_id[new_fid] = sid
     # Turn the ffatypes in the scopes into array
     if self.ffatypes is not None:
         self.ffatypes = np.array(self.ffatypes, copy=False)
     if self.scopes is not None:
         self.scopes = np.array(self.scopes, copy=False)
     # check the range of the ids
     if self.ffatype_ids.min() != 0 or self.ffatype_ids.max() != len(self.ffatypes)-1:
         raise ValueError('The ffatype_ids have incorrect bounds.')
     if log.do_medium:
         log('The following atom types are present in the system:')
         log.hline()
         if self.scopes is None:
             log('             Atom type   ID   Number of atoms')
             log.hline()
             for ffatype_id, ffatype in enumerate(self.ffatypes):
                 log('%22s  %3i       %3i' % (ffatype, ffatype_id, (self.ffatype_ids==ffatype_id).sum()))
         else:
             log('                 Scope              Atom type   ID   Number of atoms')
             log.hline()
             for ffatype_id, ffatype in enumerate(self.ffatypes):
                 scope = self.scopes[self.ffatype_id_to_scope_id[ffatype_id]]
                 log('%22s %22s  %3i       %3i' % (scope, ffatype, ffatype_id, (self.ffatype_ids==ffatype_id).sum()))
         log.hline()
         log.blank()
Example #6
0
 def _init_derived_ffatypes(self):
     if self.ffatype_ids is None:
         if len(self.ffatypes) != self.natom:
             raise TypeError(
                 'When the ffatype_ids are derived automatically, the length of the ffatypes list must match the number of atoms.'
             )
         lookup = {}
         ffatypes = []
         self.ffatype_ids = np.zeros(self.natom, int)
         for i in range(self.natom):
             if self.scope_ids is None:
                 ffatype = self.ffatypes[i]
                 key = ffatype, None
             else:
                 scope_id = self.scope_ids[i]
                 ffatype = self.ffatypes[i]
                 key = ffatype, scope_id
             ffatype_id = lookup.get(key)
             if ffatype_id is None:
                 ffatype_id = len(ffatypes)
                 ffatypes.append(ffatype)
                 lookup[key] = ffatype_id
             self.ffatype_ids[i] = ffatype_id
         self.ffatypes = ffatypes
     for ffatype in self.ffatypes:
         check_name(ffatype)
     # check the range of the ids
     if self.ffatype_ids.min() != 0 or self.ffatype_ids.max() != len(
             self.ffatypes) - 1:
         raise ValueError('The ffatype_ids have incorrect bounds.')
     # differentiate ffatype_ids if the same ffatype_id is used in different
     # scopes
     if self.scopes is not None:
         self.ffatype_id_to_scope_id = {}
         fixed_fids = {}
         for i in range(self.natom):
             fid = self.ffatype_ids[i]
             sid = self.ffatype_id_to_scope_id.get(fid)
             if sid is None:
                 self.ffatype_id_to_scope_id[fid] = self.scope_ids[i]
             elif sid != self.scope_ids[i]:
                 # We found the same ffatype_id in a different scope_id. This
                 # must be fixed. First check if we have already a new
                 # scope_id ready
                 sid = self.scope_ids[i]
                 new_fid = fixed_fids.get((sid, fid))
                 if new_fid is None:
                     # No previous new fid create, do it now.
                     new_fid = len(self.ffatypes)
                     # Copy the ffatype label
                     self.ffatypes.append(self.ffatypes[fid])
                     # Keep track of the new fid
                     fixed_fids[(sid, fid)] = new_fid
                     if log.do_warning:
                         log.warn(
                             'Atoms with type ID %i in scope %s were changed to type ID %i.'
                             % (fid, self.scopes[sid], new_fid))
                 # Apply the new fid
                 self.ffatype_ids[i] = new_fid
                 self.ffatype_id_to_scope_id[new_fid] = sid
     # Turn the ffatypes in the scopes into array
     if self.ffatypes is not None:
         self.ffatypes = np.array(self.ffatypes, copy=False)
     if self.scopes is not None:
         self.scopes = np.array(self.scopes, copy=False)
     # check the range of the ids
     if self.ffatype_ids.min() != 0 or self.ffatype_ids.max() != len(
             self.ffatypes) - 1:
         raise ValueError('The ffatype_ids have incorrect bounds.')
     if log.do_medium:
         log('The following atom types are present in the system:')
         log.hline()
         if self.scopes is None:
             log('             Atom type   ID   Number of atoms')
             log.hline()
             for ffatype_id, ffatype in enumerate(self.ffatypes):
                 log('%22s  %3i       %3i' %
                     (ffatype, ffatype_id,
                      (self.ffatype_ids == ffatype_id).sum()))
         else:
             log('                 Scope              Atom type   ID   Number of atoms'
                 )
             log.hline()
             for ffatype_id, ffatype in enumerate(self.ffatypes):
                 scope = self.scopes[
                     self.ffatype_id_to_scope_id[ffatype_id]]
                 log('%22s %22s  %3i       %3i' %
                     (scope, ffatype, ffatype_id,
                      (self.ffatype_ids == ffatype_id).sum()))
         log.hline()
         log.blank()