pyerrors.input.hadrons

  1import os
  2import warnings
  3from collections import Counter
  4import h5py
  5from pathlib import Path
  6import numpy as np
  7from ..obs import Obs, CObs
  8from ..correlators import Corr
  9from ..dirac import epsilon_tensor_rank4
 10
 11
 12def _get_files(path, filestem, idl):
 13    ls = os.listdir(path)
 14
 15    # Clean up file list
 16    files = list(filter(lambda x: x.startswith(filestem + "."), ls))
 17
 18    if not files:
 19        raise Exception('No files starting with', filestem, 'in folder', path)
 20
 21    def get_cnfg_number(n):
 22        return int(n.replace(".h5", "")[len(filestem) + 1:])  # From python 3.9 onward the safer 'removesuffix' method can be used.
 23
 24    # Sort according to configuration number
 25    files.sort(key=get_cnfg_number)
 26
 27    cnfg_numbers = []
 28    filtered_files = []
 29    for line in files:
 30        no = get_cnfg_number(line)
 31        if idl:
 32            if no in list(idl):
 33                filtered_files.append(line)
 34                cnfg_numbers.append(no)
 35        else:
 36            filtered_files.append(line)
 37            cnfg_numbers.append(no)
 38
 39    if idl:
 40        if Counter(list(idl)) != Counter(cnfg_numbers):
 41            raise Exception("Not all configurations specified in idl found, configurations " + str(list(Counter(list(idl)) - Counter(cnfg_numbers))) + " are missing.")
 42
 43    # Check that configurations are evenly spaced
 44    dc = np.unique(np.diff(cnfg_numbers))
 45    if np.any(dc < 0):
 46        raise Exception("Unsorted files")
 47    if len(dc) == 1:
 48        idx = range(cnfg_numbers[0], cnfg_numbers[-1] + dc[0], dc[0])
 49    elif idl:
 50        idx = idl
 51        warnings.warn("Configurations are not evenly spaced.", RuntimeWarning)
 52    else:
 53        raise Exception("Configurations are not evenly spaced.")
 54
 55    return filtered_files, idx
 56
 57
 58def read_meson_hd5(path, filestem, ens_id, meson='meson_0', idl=None, gammas=None):
 59    r'''Read hadrons meson hdf5 file and extract the meson labeled 'meson'
 60
 61    Parameters
 62    -----------------
 63    path : str
 64        path to the files to read
 65    filestem : str
 66        namestem of the files to read
 67    ens_id : str
 68        name of the ensemble, required for internal bookkeeping
 69    meson : str
 70        label of the meson to be extracted, standard value meson_0 which
 71        corresponds to the pseudoscalar pseudoscalar two-point function.
 72    gammas : tuple of strings
 73        Instrad of a meson label one can also provide a tuple of two strings
 74        indicating the gamma matrices at source and sink.
 75        ("Gamma5", "Gamma5") corresponds to the pseudoscalar pseudoscalar
 76        two-point function. The gammas argument dominateds over meson.
 77    idl : range
 78        If specified only configurations in the given range are read in.
 79    '''
 80
 81    files, idx = _get_files(path, filestem, idl)
 82
 83    tree = meson.rsplit('_')[0]
 84    if gammas is not None:
 85        h5file = h5py.File(path + '/' + files[0], "r")
 86        found_meson = None
 87        for key in h5file[tree].keys():
 88            if gammas[0] == h5file[tree][key].attrs["gamma_snk"][0].decode() and h5file[tree][key].attrs["gamma_src"][0].decode() == gammas[1]:
 89                found_meson = key
 90                break
 91        h5file.close()
 92        if found_meson:
 93            meson = found_meson
 94        else:
 95            raise Exception("Source Sink combination " + str(gammas) + " not found.")
 96
 97    corr_data = []
 98    infos = []
 99    for hd5_file in files:
100        h5file = h5py.File(path + '/' + hd5_file, "r")
101        if not tree + '/' + meson in h5file:
102            raise Exception("Entry '" + meson + "' not contained in the files.")
103        raw_data = h5file[tree + '/' + meson + '/corr']
104        real_data = raw_data[:]["re"].astype(np.double)
105        corr_data.append(real_data)
106        if not infos:
107            for k, i in h5file[tree + '/' + meson].attrs.items():
108                infos.append(k + ': ' + i[0].decode())
109        h5file.close()
110    corr_data = np.array(corr_data)
111
112    l_obs = []
113    for c in corr_data.T:
114        l_obs.append(Obs([c], [ens_id], idl=[idx]))
115
116    corr = Corr(l_obs)
117    corr.tag = r", ".join(infos)
118    return corr
119
120
121def read_DistillationContraction_hd5(path, ens_id, diagrams=["direct"], idl=None):
122    """Read hadrons DistillationContraction hdf5 files in given directory structure
123
124    Parameters
125    -----------------
126    path : str
127        path to the directories to read
128    ens_id : str
129        name of the ensemble, required for internal bookkeeping
130    diagrams : list
131        List of strings of the diagrams to extract, e.g. ["direct", "box", "cross"].
132    idl : range
133        If specified only configurations in the given range are read in.
134    """
135
136    res_dict = {}
137
138    directories, idx = _get_files(path, "data", idl)
139
140    explore_path = Path(path + "/" + directories[0])
141
142    for explore_file in explore_path.iterdir():
143        if explore_file.is_file():
144            stem = explore_file.with_suffix("").with_suffix("").as_posix().split("/")[-1]
145
146        file_list = []
147        for dir in directories:
148            tmp_path = Path(path + "/" + dir)
149            file_list.append((tmp_path / stem).as_posix() + tmp_path.suffix + ".h5")
150
151        corr_data = {}
152
153        for diagram in diagrams:
154            corr_data[diagram] = []
155
156        for n_file, (hd5_file, n_traj) in enumerate(zip(file_list, list(idx))):
157            h5file = h5py.File(hd5_file)
158
159            if n_file == 0:
160                if h5file["DistillationContraction/Metadata"].attrs.get("TimeSources")[0].decode() != "0...":
161                    raise Exception("Routine is only implemented for files containing inversions on all timeslices.")
162
163                Nt = h5file["DistillationContraction/Metadata"].attrs.get("Nt")[0]
164
165                identifier = []
166                for in_file in range(len(h5file["DistillationContraction/Metadata/DmfInputFiles"].attrs.keys()) - 1):
167                    encoded_info = h5file["DistillationContraction/Metadata/DmfInputFiles"].attrs.get("DmfInputFiles_" + str(in_file))
168                    full_info = encoded_info[0].decode().split("/")[-1].replace(".h5", "").split("_")
169                    my_tuple = (full_info[0], full_info[1][1:], full_info[2], full_info[3])
170                    identifier.append(my_tuple)
171                identifier = tuple(identifier)
172                # "DistillationContraction/Metadata/DmfSuffix" contains info about different quarks, irrelevant in the SU(3) case.
173
174            for diagram in diagrams:
175                real_data = np.zeros(Nt)
176                for x0 in range(Nt):
177                    raw_data = h5file["DistillationContraction/Correlators/" + diagram + "/" + str(x0)][:]["re"].astype(np.double)
178                    real_data += np.roll(raw_data, -x0)
179                real_data /= Nt
180
181                corr_data[diagram].append(real_data)
182            h5file.close()
183
184        res_dict[str(identifier)] = {}
185
186        for diagram in diagrams:
187
188            tmp_data = np.array(corr_data[diagram])
189
190            l_obs = []
191            for c in tmp_data.T:
192                l_obs.append(Obs([c], [ens_id], idl=[idx]))
193
194            corr = Corr(l_obs)
195            corr.tag = str(identifier)
196
197            res_dict[str(identifier)][diagram] = corr
198
199    return res_dict
200
201
202class Npr_matrix(np.ndarray):
203
204    def __new__(cls, input_array, mom_in=None, mom_out=None):
205        obj = np.asarray(input_array).view(cls)
206        obj.mom_in = mom_in
207        obj.mom_out = mom_out
208        return obj
209
210    @property
211    def g5H(self):
212        """Gamma_5 hermitean conjugate
213
214        Uses the fact that the propagator is gamma5 hermitean, so just the
215        in and out momenta of the propagator are exchanged.
216        """
217        return Npr_matrix(self,
218                          mom_in=self.mom_out,
219                          mom_out=self.mom_in)
220
221    def _propagate_mom(self, other, name):
222        s_mom = getattr(self, name, None)
223        o_mom = getattr(other, name, None)
224        if s_mom is not None and o_mom is not None:
225            if not np.allclose(s_mom, o_mom):
226                raise Exception(name + ' does not match.')
227        return o_mom if o_mom is not None else s_mom
228
229    def __matmul__(self, other):
230        return self.__new__(Npr_matrix,
231                            super().__matmul__(other),
232                            self._propagate_mom(other, 'mom_in'),
233                            self._propagate_mom(other, 'mom_out'))
234
235    def __array_finalize__(self, obj):
236        if obj is None:
237            return
238        self.mom_in = getattr(obj, 'mom_in', None)
239        self.mom_out = getattr(obj, 'mom_out', None)
240
241
242def read_ExternalLeg_hd5(path, filestem, ens_id, idl=None):
243    """Read hadrons ExternalLeg hdf5 file and output an array of CObs
244
245    Parameters
246    ----------
247    path : str
248        path to the files to read
249    filestem : str
250        namestem of the files to read
251    ens_id : str
252        name of the ensemble, required for internal bookkeeping
253    idl : range
254        If specified only configurations in the given range are read in.
255    """
256
257    files, idx = _get_files(path, filestem, idl)
258
259    mom = None
260
261    corr_data = []
262    for hd5_file in files:
263        file = h5py.File(path + '/' + hd5_file, "r")
264        raw_data = file['ExternalLeg/corr'][0][0].view('complex')
265        corr_data.append(raw_data)
266        if mom is None:
267            mom = np.array(str(file['ExternalLeg/info'].attrs['pIn'])[3:-2].strip().split(), dtype=float)
268        file.close()
269    corr_data = np.array(corr_data)
270
271    rolled_array = np.rollaxis(corr_data, 0, 5)
272
273    matrix = np.empty((rolled_array.shape[:-1]), dtype=object)
274    for si, sj, ci, cj in np.ndindex(rolled_array.shape[:-1]):
275        real = Obs([rolled_array[si, sj, ci, cj].real], [ens_id], idl=[idx])
276        imag = Obs([rolled_array[si, sj, ci, cj].imag], [ens_id], idl=[idx])
277        matrix[si, sj, ci, cj] = CObs(real, imag)
278
279    return Npr_matrix(matrix, mom_in=mom)
280
281
282def read_Bilinear_hd5(path, filestem, ens_id, idl=None):
283    """Read hadrons Bilinear hdf5 file and output an array of CObs
284
285    Parameters
286    ----------
287    path : str
288        path to the files to read
289    filestem : str
290        namestem of the files to read
291    ens_id : str
292        name of the ensemble, required for internal bookkeeping
293    idl : range
294        If specified only configurations in the given range are read in.
295    """
296
297    files, idx = _get_files(path, filestem, idl)
298
299    mom_in = None
300    mom_out = None
301
302    corr_data = {}
303    for hd5_file in files:
304        file = h5py.File(path + '/' + hd5_file, "r")
305        for i in range(16):
306            name = file['Bilinear/Bilinear_' + str(i) + '/info'].attrs['gamma'][0].decode('UTF-8')
307            if name not in corr_data:
308                corr_data[name] = []
309            raw_data = file['Bilinear/Bilinear_' + str(i) + '/corr'][0][0].view('complex')
310            corr_data[name].append(raw_data)
311            if mom_in is None:
312                mom_in = np.array(str(file['Bilinear/Bilinear_' + str(i) + '/info'].attrs['pIn'])[3:-2].strip().split(), dtype=float)
313            if mom_out is None:
314                mom_out = np.array(str(file['Bilinear/Bilinear_' + str(i) + '/info'].attrs['pOut'])[3:-2].strip().split(), dtype=float)
315
316        file.close()
317
318    result_dict = {}
319
320    for key, data in corr_data.items():
321        local_data = np.array(data)
322
323        rolled_array = np.rollaxis(local_data, 0, 5)
324
325        matrix = np.empty((rolled_array.shape[:-1]), dtype=object)
326        for si, sj, ci, cj in np.ndindex(rolled_array.shape[:-1]):
327            real = Obs([rolled_array[si, sj, ci, cj].real], [ens_id], idl=[idx])
328            imag = Obs([rolled_array[si, sj, ci, cj].imag], [ens_id], idl=[idx])
329            matrix[si, sj, ci, cj] = CObs(real, imag)
330
331        result_dict[key] = Npr_matrix(matrix, mom_in=mom_in, mom_out=mom_out)
332
333    return result_dict
334
335
336def read_Fourquark_hd5(path, filestem, ens_id, idl=None, vertices=["VA", "AV"]):
337    """Read hadrons FourquarkFullyConnected hdf5 file and output an array of CObs
338
339    Parameters
340    ----------
341    path : str
342        path to the files to read
343    filestem : str
344        namestem of the files to read
345    ens_id : str
346        name of the ensemble, required for internal bookkeeping
347    idl : range
348        If specified only configurations in the given range are read in.
349    vertices : list
350        Vertex functions to be extracted.
351    """
352
353    files, idx = _get_files(path, filestem, idl)
354
355    mom_in = None
356    mom_out = None
357
358    vertex_names = []
359    for vertex in vertices:
360        vertex_names += _get_lorentz_names(vertex)
361
362    corr_data = {}
363
364    tree = 'FourQuarkFullyConnected/FourQuarkFullyConnected_'
365
366    for hd5_file in files:
367        file = h5py.File(path + '/' + hd5_file, "r")
368
369        for i in range(32):
370            name = (file[tree + str(i) + '/info'].attrs['gammaA'][0].decode('UTF-8'), file[tree + str(i) + '/info'].attrs['gammaB'][0].decode('UTF-8'))
371            if name in vertex_names:
372                if name not in corr_data:
373                    corr_data[name] = []
374                raw_data = file[tree + str(i) + '/corr'][0][0].view('complex')
375                corr_data[name].append(raw_data)
376                if mom_in is None:
377                    mom_in = np.array(str(file[tree + str(i) + '/info'].attrs['pIn'])[3:-2].strip().split(), dtype=float)
378                if mom_out is None:
379                    mom_out = np.array(str(file[tree + str(i) + '/info'].attrs['pOut'])[3:-2].strip().split(), dtype=float)
380
381        file.close()
382
383    intermediate_dict = {}
384
385    for vertex in vertices:
386        lorentz_names = _get_lorentz_names(vertex)
387        for v_name in lorentz_names:
388            if v_name in [('SigmaXY', 'SigmaZT'),
389                          ('SigmaXT', 'SigmaYZ'),
390                          ('SigmaYZ', 'SigmaXT'),
391                          ('SigmaZT', 'SigmaXY')]:
392                sign = -1
393            else:
394                sign = 1
395            if vertex not in intermediate_dict:
396                intermediate_dict[vertex] = sign * np.array(corr_data[v_name])
397            else:
398                intermediate_dict[vertex] += sign * np.array(corr_data[v_name])
399
400    result_dict = {}
401
402    for key, data in intermediate_dict.items():
403
404        rolled_array = np.moveaxis(data, 0, 8)
405
406        matrix = np.empty((rolled_array.shape[:-1]), dtype=object)
407        for index in np.ndindex(rolled_array.shape[:-1]):
408            real = Obs([rolled_array[index].real], [ens_id], idl=[idx])
409            imag = Obs([rolled_array[index].imag], [ens_id], idl=[idx])
410            matrix[index] = CObs(real, imag)
411
412        result_dict[key] = Npr_matrix(matrix, mom_in=mom_in, mom_out=mom_out)
413
414    return result_dict
415
416
417def _get_lorentz_names(name):
418    lorentz_index = ['X', 'Y', 'Z', 'T']
419
420    res = []
421
422    if name == "TT":
423        for i in range(4):
424            for j in range(i + 1, 4):
425                res.append(("Sigma" + lorentz_index[i] + lorentz_index[j], "Sigma" + lorentz_index[i] + lorentz_index[j]))
426        return res
427
428    if name == "TTtilde":
429        for i in range(4):
430            for j in range(i + 1, 4):
431                for k in range(4):
432                    for o in range(k + 1, 4):
433                        fac = epsilon_tensor_rank4(i, j, k, o)
434                        if not np.isclose(fac, 0.0):
435                            res.append(("Sigma" + lorentz_index[i] + lorentz_index[j], "Sigma" + lorentz_index[k] + lorentz_index[o]))
436        return res
437
438    assert len(name) == 2
439
440    if 'S' in name or 'P' in name:
441        if not set(name) <= set(['S', 'P']):
442            raise Exception("'" + name + "' is not a Lorentz scalar")
443
444        g_names = {'S': 'Identity',
445                   'P': 'Gamma5'}
446
447        res.append((g_names[name[0]], g_names[name[1]]))
448
449    else:
450        if not set(name) <= set(['V', 'A']):
451            raise Exception("'" + name + "' is not a Lorentz scalar")
452
453        for ind in lorentz_index:
454            res.append(('Gamma' + ind + (name[0] == 'A') * 'Gamma5',
455                        'Gamma' + ind + (name[1] == 'A') * 'Gamma5'))
456
457    return res
def read_meson_hd5(path, filestem, ens_id, meson='meson_0', idl=None, gammas=None):
 59def read_meson_hd5(path, filestem, ens_id, meson='meson_0', idl=None, gammas=None):
 60    r'''Read hadrons meson hdf5 file and extract the meson labeled 'meson'
 61
 62    Parameters
 63    -----------------
 64    path : str
 65        path to the files to read
 66    filestem : str
 67        namestem of the files to read
 68    ens_id : str
 69        name of the ensemble, required for internal bookkeeping
 70    meson : str
 71        label of the meson to be extracted, standard value meson_0 which
 72        corresponds to the pseudoscalar pseudoscalar two-point function.
 73    gammas : tuple of strings
 74        Instrad of a meson label one can also provide a tuple of two strings
 75        indicating the gamma matrices at source and sink.
 76        ("Gamma5", "Gamma5") corresponds to the pseudoscalar pseudoscalar
 77        two-point function. The gammas argument dominateds over meson.
 78    idl : range
 79        If specified only configurations in the given range are read in.
 80    '''
 81
 82    files, idx = _get_files(path, filestem, idl)
 83
 84    tree = meson.rsplit('_')[0]
 85    if gammas is not None:
 86        h5file = h5py.File(path + '/' + files[0], "r")
 87        found_meson = None
 88        for key in h5file[tree].keys():
 89            if gammas[0] == h5file[tree][key].attrs["gamma_snk"][0].decode() and h5file[tree][key].attrs["gamma_src"][0].decode() == gammas[1]:
 90                found_meson = key
 91                break
 92        h5file.close()
 93        if found_meson:
 94            meson = found_meson
 95        else:
 96            raise Exception("Source Sink combination " + str(gammas) + " not found.")
 97
 98    corr_data = []
 99    infos = []
100    for hd5_file in files:
101        h5file = h5py.File(path + '/' + hd5_file, "r")
102        if not tree + '/' + meson in h5file:
103            raise Exception("Entry '" + meson + "' not contained in the files.")
104        raw_data = h5file[tree + '/' + meson + '/corr']
105        real_data = raw_data[:]["re"].astype(np.double)
106        corr_data.append(real_data)
107        if not infos:
108            for k, i in h5file[tree + '/' + meson].attrs.items():
109                infos.append(k + ': ' + i[0].decode())
110        h5file.close()
111    corr_data = np.array(corr_data)
112
113    l_obs = []
114    for c in corr_data.T:
115        l_obs.append(Obs([c], [ens_id], idl=[idx]))
116
117    corr = Corr(l_obs)
118    corr.tag = r", ".join(infos)
119    return corr

Read hadrons meson hdf5 file and extract the meson labeled 'meson'

Parameters
  • path (str): path to the files to read
  • filestem (str): namestem of the files to read
  • ens_id (str): name of the ensemble, required for internal bookkeeping
  • meson (str): label of the meson to be extracted, standard value meson_0 which corresponds to the pseudoscalar pseudoscalar two-point function.
  • gammas (tuple of strings): Instrad of a meson label one can also provide a tuple of two strings indicating the gamma matrices at source and sink. ("Gamma5", "Gamma5") corresponds to the pseudoscalar pseudoscalar two-point function. The gammas argument dominateds over meson.
  • idl (range): If specified only configurations in the given range are read in.
def read_DistillationContraction_hd5(path, ens_id, diagrams=['direct'], idl=None):
122def read_DistillationContraction_hd5(path, ens_id, diagrams=["direct"], idl=None):
123    """Read hadrons DistillationContraction hdf5 files in given directory structure
124
125    Parameters
126    -----------------
127    path : str
128        path to the directories to read
129    ens_id : str
130        name of the ensemble, required for internal bookkeeping
131    diagrams : list
132        List of strings of the diagrams to extract, e.g. ["direct", "box", "cross"].
133    idl : range
134        If specified only configurations in the given range are read in.
135    """
136
137    res_dict = {}
138
139    directories, idx = _get_files(path, "data", idl)
140
141    explore_path = Path(path + "/" + directories[0])
142
143    for explore_file in explore_path.iterdir():
144        if explore_file.is_file():
145            stem = explore_file.with_suffix("").with_suffix("").as_posix().split("/")[-1]
146
147        file_list = []
148        for dir in directories:
149            tmp_path = Path(path + "/" + dir)
150            file_list.append((tmp_path / stem).as_posix() + tmp_path.suffix + ".h5")
151
152        corr_data = {}
153
154        for diagram in diagrams:
155            corr_data[diagram] = []
156
157        for n_file, (hd5_file, n_traj) in enumerate(zip(file_list, list(idx))):
158            h5file = h5py.File(hd5_file)
159
160            if n_file == 0:
161                if h5file["DistillationContraction/Metadata"].attrs.get("TimeSources")[0].decode() != "0...":
162                    raise Exception("Routine is only implemented for files containing inversions on all timeslices.")
163
164                Nt = h5file["DistillationContraction/Metadata"].attrs.get("Nt")[0]
165
166                identifier = []
167                for in_file in range(len(h5file["DistillationContraction/Metadata/DmfInputFiles"].attrs.keys()) - 1):
168                    encoded_info = h5file["DistillationContraction/Metadata/DmfInputFiles"].attrs.get("DmfInputFiles_" + str(in_file))
169                    full_info = encoded_info[0].decode().split("/")[-1].replace(".h5", "").split("_")
170                    my_tuple = (full_info[0], full_info[1][1:], full_info[2], full_info[3])
171                    identifier.append(my_tuple)
172                identifier = tuple(identifier)
173                # "DistillationContraction/Metadata/DmfSuffix" contains info about different quarks, irrelevant in the SU(3) case.
174
175            for diagram in diagrams:
176                real_data = np.zeros(Nt)
177                for x0 in range(Nt):
178                    raw_data = h5file["DistillationContraction/Correlators/" + diagram + "/" + str(x0)][:]["re"].astype(np.double)
179                    real_data += np.roll(raw_data, -x0)
180                real_data /= Nt
181
182                corr_data[diagram].append(real_data)
183            h5file.close()
184
185        res_dict[str(identifier)] = {}
186
187        for diagram in diagrams:
188
189            tmp_data = np.array(corr_data[diagram])
190
191            l_obs = []
192            for c in tmp_data.T:
193                l_obs.append(Obs([c], [ens_id], idl=[idx]))
194
195            corr = Corr(l_obs)
196            corr.tag = str(identifier)
197
198            res_dict[str(identifier)][diagram] = corr
199
200    return res_dict

Read hadrons DistillationContraction hdf5 files in given directory structure

Parameters
  • path (str): path to the directories to read
  • ens_id (str): name of the ensemble, required for internal bookkeeping
  • diagrams (list): List of strings of the diagrams to extract, e.g. ["direct", "box", "cross"].
  • idl (range): If specified only configurations in the given range are read in.
class Npr_matrix(numpy.ndarray):
203class Npr_matrix(np.ndarray):
204
205    def __new__(cls, input_array, mom_in=None, mom_out=None):
206        obj = np.asarray(input_array).view(cls)
207        obj.mom_in = mom_in
208        obj.mom_out = mom_out
209        return obj
210
211    @property
212    def g5H(self):
213        """Gamma_5 hermitean conjugate
214
215        Uses the fact that the propagator is gamma5 hermitean, so just the
216        in and out momenta of the propagator are exchanged.
217        """
218        return Npr_matrix(self,
219                          mom_in=self.mom_out,
220                          mom_out=self.mom_in)
221
222    def _propagate_mom(self, other, name):
223        s_mom = getattr(self, name, None)
224        o_mom = getattr(other, name, None)
225        if s_mom is not None and o_mom is not None:
226            if not np.allclose(s_mom, o_mom):
227                raise Exception(name + ' does not match.')
228        return o_mom if o_mom is not None else s_mom
229
230    def __matmul__(self, other):
231        return self.__new__(Npr_matrix,
232                            super().__matmul__(other),
233                            self._propagate_mom(other, 'mom_in'),
234                            self._propagate_mom(other, 'mom_out'))
235
236    def __array_finalize__(self, obj):
237        if obj is None:
238            return
239        self.mom_in = getattr(obj, 'mom_in', None)
240        self.mom_out = getattr(obj, 'mom_out', None)

ndarray(shape, dtype=float, buffer=None, offset=0, strides=None, order=None)

An array object represents a multidimensional, homogeneous array of fixed-size items. An associated data-type object describes the format of each element in the array (its byte-order, how many bytes it occupies in memory, whether it is an integer, a floating point number, or something else, etc.)

Arrays should be constructed using array, zeros or empty (refer to the See Also section below). The parameters given here refer to a low-level method (ndarray(...)) for instantiating an array.

For more information, refer to the numpy module and examine the methods and attributes of an array.

Parameters
  • (for the __new__ method; see Notes below)
  • shape (tuple of ints): Shape of created array.
  • dtype (data-type, optional): Any object that can be interpreted as a numpy data type.
  • buffer (object exposing buffer interface, optional): Used to fill the array with data.
  • offset (int, optional): Offset of array data in buffer.
  • strides (tuple of ints, optional): Strides of data in memory.
  • order ({'C', 'F'}, optional): Row-major (C-style) or column-major (Fortran-style) order.
Attributes
  • T (ndarray): Transpose of the array.
  • data (buffer): The array's elements, in memory.
  • dtype (dtype object): Describes the format of the elements in the array.
  • flags (dict): Dictionary containing information related to memory use, e.g., 'C_CONTIGUOUS', 'OWNDATA', 'WRITEABLE', etc.
  • flat (numpy.flatiter object): Flattened version of the array as an iterator. The iterator allows assignments, e.g., x.flat = 3 (See ndarray.flat for assignment examples; TODO).
  • imag (ndarray): Imaginary part of the array.
  • real (ndarray): Real part of the array.
  • size (int): Number of elements in the array.
  • itemsize (int): The memory use of each array element in bytes.
  • nbytes (int): The total number of bytes required to store the array data, i.e., itemsize * size.
  • ndim (int): The array's number of dimensions.
  • shape (tuple of ints): Shape of the array.
  • strides (tuple of ints): The step-size required to move from one element to the next in memory. For example, a contiguous (3, 4) array of type int16 in C-order has strides (8, 2). This implies that to move from element to element in memory requires jumps of 2 bytes. To move from row-to-row, one needs to jump 8 bytes at a time (2 * 4).
  • ctypes (ctypes object): Class containing properties of the array needed for interaction with ctypes.
  • base (ndarray): If the array is a view into another array, that array is its base (unless that array is also a view). The base array is where the array data is actually stored.
See Also

array: Construct an array.
zeros: Create an array, each element of which is zero.
empty: Create an array, but leave its allocated memory unchanged (i.e., it contains "garbage").
dtype: Create a data-type.
numpy.typing.NDArray: An ndarray alias :term:generic <generic type> w.r.t. its dtype.type <numpy.dtype.type>.

Notes

There are two modes of creating an array using __new__:

  1. If buffer is None, then only shape, dtype, and order are used.
  2. If buffer is an object exposing the buffer interface, then all keywords are interpreted.

No __init__ method is needed because the array is fully initialized after the __new__ method.

Examples

These examples illustrate the low-level ndarray constructor. Refer to the See Also section above for easier ways of constructing an ndarray.

First mode, buffer is None:

>>> np.ndarray(shape=(2,2), dtype=float, order='F')
array([[0.0e+000, 0.0e+000], # random
       [     nan, 2.5e-323]])

Second mode:

>>> np.ndarray((2,), buffer=np.array([1,2,3]),
...            offset=np.int_().itemsize,
...            dtype=int) # offset = 1*itemsize, i.e. skip first element
array([2, 3])
Npr_matrix()
g5H

Gamma_5 hermitean conjugate

Uses the fact that the propagator is gamma5 hermitean, so just the in and out momenta of the propagator are exchanged.

Inherited Members
numpy.ndarray
dumps
dump
all
any
argmax
argmin
argpartition
argsort
astype
byteswap
choose
clip
compress
conj
conjugate
copy
cumprod
cumsum
diagonal
dot
fill
flatten
getfield
item
itemset
max
mean
min
newbyteorder
nonzero
partition
prod
ptp
put
ravel
repeat
reshape
resize
round
searchsorted
setfield
setflags
sort
squeeze
std
sum
swapaxes
take
tobytes
tofile
tolist
tostring
trace
transpose
var
view
ndim
flags
shape
strides
data
itemsize
size
nbytes
base
dtype
real
imag
flat
ctypes
T
def read_ExternalLeg_hd5(path, filestem, ens_id, idl=None):
243def read_ExternalLeg_hd5(path, filestem, ens_id, idl=None):
244    """Read hadrons ExternalLeg hdf5 file and output an array of CObs
245
246    Parameters
247    ----------
248    path : str
249        path to the files to read
250    filestem : str
251        namestem of the files to read
252    ens_id : str
253        name of the ensemble, required for internal bookkeeping
254    idl : range
255        If specified only configurations in the given range are read in.
256    """
257
258    files, idx = _get_files(path, filestem, idl)
259
260    mom = None
261
262    corr_data = []
263    for hd5_file in files:
264        file = h5py.File(path + '/' + hd5_file, "r")
265        raw_data = file['ExternalLeg/corr'][0][0].view('complex')
266        corr_data.append(raw_data)
267        if mom is None:
268            mom = np.array(str(file['ExternalLeg/info'].attrs['pIn'])[3:-2].strip().split(), dtype=float)
269        file.close()
270    corr_data = np.array(corr_data)
271
272    rolled_array = np.rollaxis(corr_data, 0, 5)
273
274    matrix = np.empty((rolled_array.shape[:-1]), dtype=object)
275    for si, sj, ci, cj in np.ndindex(rolled_array.shape[:-1]):
276        real = Obs([rolled_array[si, sj, ci, cj].real], [ens_id], idl=[idx])
277        imag = Obs([rolled_array[si, sj, ci, cj].imag], [ens_id], idl=[idx])
278        matrix[si, sj, ci, cj] = CObs(real, imag)
279
280    return Npr_matrix(matrix, mom_in=mom)

Read hadrons ExternalLeg hdf5 file and output an array of CObs

Parameters
  • path (str): path to the files to read
  • filestem (str): namestem of the files to read
  • ens_id (str): name of the ensemble, required for internal bookkeeping
  • idl (range): If specified only configurations in the given range are read in.
def read_Bilinear_hd5(path, filestem, ens_id, idl=None):
283def read_Bilinear_hd5(path, filestem, ens_id, idl=None):
284    """Read hadrons Bilinear hdf5 file and output an array of CObs
285
286    Parameters
287    ----------
288    path : str
289        path to the files to read
290    filestem : str
291        namestem of the files to read
292    ens_id : str
293        name of the ensemble, required for internal bookkeeping
294    idl : range
295        If specified only configurations in the given range are read in.
296    """
297
298    files, idx = _get_files(path, filestem, idl)
299
300    mom_in = None
301    mom_out = None
302
303    corr_data = {}
304    for hd5_file in files:
305        file = h5py.File(path + '/' + hd5_file, "r")
306        for i in range(16):
307            name = file['Bilinear/Bilinear_' + str(i) + '/info'].attrs['gamma'][0].decode('UTF-8')
308            if name not in corr_data:
309                corr_data[name] = []
310            raw_data = file['Bilinear/Bilinear_' + str(i) + '/corr'][0][0].view('complex')
311            corr_data[name].append(raw_data)
312            if mom_in is None:
313                mom_in = np.array(str(file['Bilinear/Bilinear_' + str(i) + '/info'].attrs['pIn'])[3:-2].strip().split(), dtype=float)
314            if mom_out is None:
315                mom_out = np.array(str(file['Bilinear/Bilinear_' + str(i) + '/info'].attrs['pOut'])[3:-2].strip().split(), dtype=float)
316
317        file.close()
318
319    result_dict = {}
320
321    for key, data in corr_data.items():
322        local_data = np.array(data)
323
324        rolled_array = np.rollaxis(local_data, 0, 5)
325
326        matrix = np.empty((rolled_array.shape[:-1]), dtype=object)
327        for si, sj, ci, cj in np.ndindex(rolled_array.shape[:-1]):
328            real = Obs([rolled_array[si, sj, ci, cj].real], [ens_id], idl=[idx])
329            imag = Obs([rolled_array[si, sj, ci, cj].imag], [ens_id], idl=[idx])
330            matrix[si, sj, ci, cj] = CObs(real, imag)
331
332        result_dict[key] = Npr_matrix(matrix, mom_in=mom_in, mom_out=mom_out)
333
334    return result_dict

Read hadrons Bilinear hdf5 file and output an array of CObs

Parameters
  • path (str): path to the files to read
  • filestem (str): namestem of the files to read
  • ens_id (str): name of the ensemble, required for internal bookkeeping
  • idl (range): If specified only configurations in the given range are read in.
def read_Fourquark_hd5(path, filestem, ens_id, idl=None, vertices=['VA', 'AV']):
337def read_Fourquark_hd5(path, filestem, ens_id, idl=None, vertices=["VA", "AV"]):
338    """Read hadrons FourquarkFullyConnected hdf5 file and output an array of CObs
339
340    Parameters
341    ----------
342    path : str
343        path to the files to read
344    filestem : str
345        namestem of the files to read
346    ens_id : str
347        name of the ensemble, required for internal bookkeeping
348    idl : range
349        If specified only configurations in the given range are read in.
350    vertices : list
351        Vertex functions to be extracted.
352    """
353
354    files, idx = _get_files(path, filestem, idl)
355
356    mom_in = None
357    mom_out = None
358
359    vertex_names = []
360    for vertex in vertices:
361        vertex_names += _get_lorentz_names(vertex)
362
363    corr_data = {}
364
365    tree = 'FourQuarkFullyConnected/FourQuarkFullyConnected_'
366
367    for hd5_file in files:
368        file = h5py.File(path + '/' + hd5_file, "r")
369
370        for i in range(32):
371            name = (file[tree + str(i) + '/info'].attrs['gammaA'][0].decode('UTF-8'), file[tree + str(i) + '/info'].attrs['gammaB'][0].decode('UTF-8'))
372            if name in vertex_names:
373                if name not in corr_data:
374                    corr_data[name] = []
375                raw_data = file[tree + str(i) + '/corr'][0][0].view('complex')
376                corr_data[name].append(raw_data)
377                if mom_in is None:
378                    mom_in = np.array(str(file[tree + str(i) + '/info'].attrs['pIn'])[3:-2].strip().split(), dtype=float)
379                if mom_out is None:
380                    mom_out = np.array(str(file[tree + str(i) + '/info'].attrs['pOut'])[3:-2].strip().split(), dtype=float)
381
382        file.close()
383
384    intermediate_dict = {}
385
386    for vertex in vertices:
387        lorentz_names = _get_lorentz_names(vertex)
388        for v_name in lorentz_names:
389            if v_name in [('SigmaXY', 'SigmaZT'),
390                          ('SigmaXT', 'SigmaYZ'),
391                          ('SigmaYZ', 'SigmaXT'),
392                          ('SigmaZT', 'SigmaXY')]:
393                sign = -1
394            else:
395                sign = 1
396            if vertex not in intermediate_dict:
397                intermediate_dict[vertex] = sign * np.array(corr_data[v_name])
398            else:
399                intermediate_dict[vertex] += sign * np.array(corr_data[v_name])
400
401    result_dict = {}
402
403    for key, data in intermediate_dict.items():
404
405        rolled_array = np.moveaxis(data, 0, 8)
406
407        matrix = np.empty((rolled_array.shape[:-1]), dtype=object)
408        for index in np.ndindex(rolled_array.shape[:-1]):
409            real = Obs([rolled_array[index].real], [ens_id], idl=[idx])
410            imag = Obs([rolled_array[index].imag], [ens_id], idl=[idx])
411            matrix[index] = CObs(real, imag)
412
413        result_dict[key] = Npr_matrix(matrix, mom_in=mom_in, mom_out=mom_out)
414
415    return result_dict

Read hadrons FourquarkFullyConnected hdf5 file and output an array of CObs

Parameters
  • path (str): path to the files to read
  • filestem (str): namestem of the files to read
  • ens_id (str): name of the ensemble, required for internal bookkeeping
  • idl (range): If specified only configurations in the given range are read in.
  • vertices (list): Vertex functions to be extracted.