File: atomic_indices.py

package info (click to toggle)
python-dynasor 2.1-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 22,008 kB
  • sloc: python: 5,263; sh: 20; makefile: 3
file content (37 lines) | stat: -rw-r--r-- 1,277 bytes parent folder | download
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
import os
import re
import numpy as np
from dynasor.logging_tools import logger


def parse_gromacs_index_file(fname):
    """
    Parses a gromacs style index (ndx) file.
    Returns a dict with key values as
    group-name: [1, 3, 8]

    Note that atomic indices in gromacs-ndx file starts with 1, but the returned dict starts with 0
    """

    if not os.path.isfile(fname):
        raise ValueError('Index file not found')

    atomic_indices = dict()
    header_re = re.compile(r'^ *\[ *([a-zA-Z0-9_.-]+) *\] *$')
    with open(fname, 'r') as fobj:
        for line in fobj.readlines():
            match = header_re.match(line)
            if match is not None:  # get name of group
                name = match.group(1)
                if name in atomic_indices.keys():
                    logger.warning(f'Group name {name} appears twice in index file, only one used.')
                atomic_indices[name] = []
            else:  # get indices for group
                indices = [int(i) for i in line.split()]
                atomic_indices[name].extend(indices)

    # cast to indices to numpy arrays and shift so indices start with 0
    for name, indices in atomic_indices.items():
        atomic_indices[name] = np.array(indices) - 1

    return atomic_indices