# pyerrors.input.misc API documentation

# pyerrors.input.misc

View Source

      1import os
      2import fnmatch
      3import re
      4import struct
      5import numpy as np  # Thinly-wrapped numpy
      6from ..obs import Obs
      7
      8
      9def read_pbp(path, prefix, **kwargs):
     10    """Read pbp format from given folder structure.
     11
     12    Parameters
     13    ----------
     14    r_start : list
     15        list which contains the first config to be read for each replicum
     16    r_stop : list
     17        list which contains the last config to be read for each replicum
     18
     19    Returns
     20    -------
     21    result : list[Obs]
     22        list of observables read
     23    """
     24
     25    ls = []
     26    for (dirpath, dirnames, filenames) in os.walk(path):
     27        ls.extend(filenames)
     28        break
     29
     30    if not ls:
     31        raise Exception('Error, directory not found')
     32
     33    # Exclude files with different names
     34    for exc in ls:
     35        if not fnmatch.fnmatch(exc, prefix + '*.dat'):
     36            ls = list(set(ls) - set([exc]))
     37    if len(ls) > 1:
     38        ls.sort(key=lambda x: int(re.findall(r'\d+', x[len(prefix):])[0]))
     39    replica = len(ls)
     40
     41    if 'r_start' in kwargs:
     42        r_start = kwargs.get('r_start')
     43        if len(r_start) != replica:
     44            raise Exception('r_start does not match number of replicas')
     45        # Adjust Configuration numbering to python index
     46        r_start = [o - 1 if o else None for o in r_start]
     47    else:
     48        r_start = [None] * replica
     49
     50    if 'r_stop' in kwargs:
     51        r_stop = kwargs.get('r_stop')
     52        if len(r_stop) != replica:
     53            raise Exception('r_stop does not match number of replicas')
     54    else:
     55        r_stop = [None] * replica
     56
     57    print(r'Read <bar{psi}\psi> from', prefix[:-1], ',', replica, 'replica', end='')
     58
     59    print_err = 0
     60    if 'print_err' in kwargs:
     61        print_err = 1
     62        print()
     63
     64    deltas = []
     65
     66    for rep in range(replica):
     67        tmp_array = []
     68        with open(path + '/' + ls[rep], 'rb') as fp:
     69
     70            t = fp.read(4)  # number of reweighting factors
     71            if rep == 0:
     72                nrw = struct.unpack('i', t)[0]
     73                for k in range(nrw):
     74                    deltas.append([])
     75            else:
     76                if nrw != struct.unpack('i', t)[0]:
     77                    raise Exception('Error: different number of factors for replicum', rep)
     78
     79            for k in range(nrw):
     80                tmp_array.append([])
     81
     82            # This block is necessary for openQCD1.6 ms1 files
     83            nfct = []
     84            for i in range(nrw):
     85                t = fp.read(4)
     86                nfct.append(struct.unpack('i', t)[0])
     87            print('nfct: ', nfct)  # Hasenbusch factor, 1 for rat reweighting
     88
     89            nsrc = []
     90            for i in range(nrw):
     91                t = fp.read(4)
     92                nsrc.append(struct.unpack('i', t)[0])
     93
     94            # body
     95            while True:
     96                t = fp.read(4)
     97                if len(t) < 4:
     98                    break
     99                if print_err:
    100                    config_no = struct.unpack('i', t)
    101                for i in range(nrw):
    102                    tmp_nfct = 1.0
    103                    for j in range(nfct[i]):
    104                        t = fp.read(8 * nsrc[i])
    105                        t = fp.read(8 * nsrc[i])
    106                        tmp_rw = struct.unpack('d' * nsrc[i], t)
    107                        tmp_nfct *= np.mean(np.asarray(tmp_rw))
    108                        if print_err:
    109                            print(config_no, i, j, np.mean(np.asarray(tmp_rw)), np.std(np.asarray(tmp_rw)))
    110                            print('Sources:', np.asarray(tmp_rw))
    111                            print('Partial factor:', tmp_nfct)
    112                    tmp_array[i].append(tmp_nfct)
    113
    114            for k in range(nrw):
    115                deltas[k].append(tmp_array[k][r_start[rep]:r_stop[rep]])
    116
    117    rep_names = []
    118    for entry in ls:
    119        truncated_entry = entry.split('.')[0]
    120        idx = truncated_entry.index('r')
    121        rep_names.append(truncated_entry[:idx] + '|' + truncated_entry[idx:])
    122    print(',', nrw, r'<bar{psi}\psi> with', nsrc, 'sources')
    123    result = []
    124    for t in range(nrw):
    125        result.append(Obs(deltas[t], rep_names))
    126
    127    return result

def read_pbp(path, prefix, **kwargs): View Source

     10def read_pbp(path, prefix, **kwargs):
     11    """Read pbp format from given folder structure.
     12
     13    Parameters
     14    ----------
     15    r_start : list
     16        list which contains the first config to be read for each replicum
     17    r_stop : list
     18        list which contains the last config to be read for each replicum
     19
     20    Returns
     21    -------
     22    result : list[Obs]
     23        list of observables read
     24    """
     25
     26    ls = []
     27    for (dirpath, dirnames, filenames) in os.walk(path):
     28        ls.extend(filenames)
     29        break
     30
     31    if not ls:
     32        raise Exception('Error, directory not found')
     33
     34    # Exclude files with different names
     35    for exc in ls:
     36        if not fnmatch.fnmatch(exc, prefix + '*.dat'):
     37            ls = list(set(ls) - set([exc]))
     38    if len(ls) > 1:
     39        ls.sort(key=lambda x: int(re.findall(r'\d+', x[len(prefix):])[0]))
     40    replica = len(ls)
     41
     42    if 'r_start' in kwargs:
     43        r_start = kwargs.get('r_start')
     44        if len(r_start) != replica:
     45            raise Exception('r_start does not match number of replicas')
     46        # Adjust Configuration numbering to python index
     47        r_start = [o - 1 if o else None for o in r_start]
     48    else:
     49        r_start = [None] * replica
     50
     51    if 'r_stop' in kwargs:
     52        r_stop = kwargs.get('r_stop')
     53        if len(r_stop) != replica:
     54            raise Exception('r_stop does not match number of replicas')
     55    else:
     56        r_stop = [None] * replica
     57
     58    print(r'Read <bar{psi}\psi> from', prefix[:-1], ',', replica, 'replica', end='')
     59
     60    print_err = 0
     61    if 'print_err' in kwargs:
     62        print_err = 1
     63        print()
     64
     65    deltas = []
     66
     67    for rep in range(replica):
     68        tmp_array = []
     69        with open(path + '/' + ls[rep], 'rb') as fp:
     70
     71            t = fp.read(4)  # number of reweighting factors
     72            if rep == 0:
     73                nrw = struct.unpack('i', t)[0]
     74                for k in range(nrw):
     75                    deltas.append([])
     76            else:
     77                if nrw != struct.unpack('i', t)[0]:
     78                    raise Exception('Error: different number of factors for replicum', rep)
     79
     80            for k in range(nrw):
     81                tmp_array.append([])
     82
     83            # This block is necessary for openQCD1.6 ms1 files
     84            nfct = []
     85            for i in range(nrw):
     86                t = fp.read(4)
     87                nfct.append(struct.unpack('i', t)[0])
     88            print('nfct: ', nfct)  # Hasenbusch factor, 1 for rat reweighting
     89
     90            nsrc = []
     91            for i in range(nrw):
     92                t = fp.read(4)
     93                nsrc.append(struct.unpack('i', t)[0])
     94
     95            # body
     96            while True:
     97                t = fp.read(4)
     98                if len(t) < 4:
     99                    break
    100                if print_err:
    101                    config_no = struct.unpack('i', t)
    102                for i in range(nrw):
    103                    tmp_nfct = 1.0
    104                    for j in range(nfct[i]):
    105                        t = fp.read(8 * nsrc[i])
    106                        t = fp.read(8 * nsrc[i])
    107                        tmp_rw = struct.unpack('d' * nsrc[i], t)
    108                        tmp_nfct *= np.mean(np.asarray(tmp_rw))
    109                        if print_err:
    110                            print(config_no, i, j, np.mean(np.asarray(tmp_rw)), np.std(np.asarray(tmp_rw)))
    111                            print('Sources:', np.asarray(tmp_rw))
    112                            print('Partial factor:', tmp_nfct)
    113                    tmp_array[i].append(tmp_nfct)
    114
    115            for k in range(nrw):
    116                deltas[k].append(tmp_array[k][r_start[rep]:r_stop[rep]])
    117
    118    rep_names = []
    119    for entry in ls:
    120        truncated_entry = entry.split('.')[0]
    121        idx = truncated_entry.index('r')
    122        rep_names.append(truncated_entry[:idx] + '|' + truncated_entry[idx:])
    123    print(',', nrw, r'<bar{psi}\psi> with', nsrc, 'sources')
    124    result = []
    125    for t in range(nrw):
    126        result.append(Obs(deltas[t], rep_names))
    127
    128    return result

Read pbp format from given folder structure.

###### Parameters

- r_start (list): list which contains the first config to be read for each replicum
- r_stop (list): list which contains the last config to be read for each replicum

###### Returns

- result (list[Obs]): list of observables read