# 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. Returns a list of length nrw
     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
     20    extract_nfct = 1
     21
     22    ls = []
     23    for (dirpath, dirnames, filenames) in os.walk(path):
     24        ls.extend(filenames)
     25        break
     26
     27    if not ls:
     28        raise Exception('Error, directory not found')
     29
     30    # Exclude files with different names
     31    for exc in ls:
     32        if not fnmatch.fnmatch(exc, prefix + '*.dat'):
     33            ls = list(set(ls) - set([exc]))
     34    if len(ls) > 1:
     35        ls.sort(key=lambda x: int(re.findall(r'\d+', x[len(prefix):])[0]))
     36    replica = len(ls)
     37
     38    if 'r_start' in kwargs:
     39        r_start = kwargs.get('r_start')
     40        if len(r_start) != replica:
     41            raise Exception('r_start does not match number of replicas')
     42        # Adjust Configuration numbering to python index
     43        r_start = [o - 1 if o else None for o in r_start]
     44    else:
     45        r_start = [None] * replica
     46
     47    if 'r_stop' in kwargs:
     48        r_stop = kwargs.get('r_stop')
     49        if len(r_stop) != replica:
     50            raise Exception('r_stop does not match number of replicas')
     51    else:
     52        r_stop = [None] * replica
     53
     54    print(r'Read <bar{psi}\psi> from', prefix[:-1], ',', replica, 'replica', end='')
     55
     56    print_err = 0
     57    if 'print_err' in kwargs:
     58        print_err = 1
     59        print()
     60
     61    deltas = []
     62
     63    for rep in range(replica):
     64        tmp_array = []
     65        with open(path + '/' + ls[rep], 'rb') as fp:
     66
     67            t = fp.read(4)  # number of reweighting factors
     68            if rep == 0:
     69                nrw = struct.unpack('i', t)[0]
     70                for k in range(nrw):
     71                    deltas.append([])
     72            else:
     73                if nrw != struct.unpack('i', t)[0]:
     74                    raise Exception('Error: different number of factors for replicum', rep)
     75
     76            for k in range(nrw):
     77                tmp_array.append([])
     78
     79            # This block is necessary for openQCD1.6 ms1 files
     80            nfct = []
     81            if extract_nfct == 1:
     82                for i in range(nrw):
     83                    t = fp.read(4)
     84                    nfct.append(struct.unpack('i', t)[0])
     85                print('nfct: ', nfct)  # Hasenbusch factor, 1 for rat reweighting
     86            else:
     87                for i in range(nrw):
     88                    nfct.append(1)
     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 0 < 1:
     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

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

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

Read pbp format from given folder structure. Returns a list of length nrw

###### 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