File: xtractNIST.py

package info (click to toggle)
bornagain 23.0-4
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 103,936 kB
  • sloc: cpp: 423,131; python: 40,997; javascript: 11,167; awk: 630; sh: 318; ruby: 173; xml: 130; makefile: 51; ansic: 24
file content (59 lines) | stat: -rwxr-xr-x 1,478 bytes parent folder | download | duplicates (2)
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
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#!/usr/bin/env python3

"""
Extract reflectometry data from NIST.

Specifically written for https://www.nist.gov/document/spinelfilmzip.

Output columns are: ["Qz", "counts per incident count", "uncertainty", "resolution"].
"""

import io, numpy, re

angstrom = 0.1

def normalizeData(data):
    """
    Removes duplicate q values from the input data,
    normalizes it such that the maximum of the reflectivity is
    unity and rescales the q-axis to inverse nm
    """

    r0 = numpy.where(data[0] - numpy.roll(data[0], 1) == 0)
    data = numpy.delete(data, r0, 1)

    data[0] = data[0]/angstrom
    data[3] = data[3]/angstrom

    norm = numpy.max(data[1])
    data[1] = data[1]/norm
    data[2] = data[2]/norm

    so = numpy.argsort(data[0])
    data = data[:, so]

    return data

def xtract(rawdata, out_fname, code):

    table = re.match(
        r'.*# "polarization": "' + code + r'"\n#.*?\n# "units".*?\n(.*?)#.*',
        rawdata, re.DOTALL).group(1)

    data1 = numpy.genfromtxt(io.BytesIO(table.encode()), unpack=True)

    data2 = normalizeData(data1)

    n = len(data2[0])
    data3 = [(data2[0][i], data2[1][i], data2[2][i], data2[3][i]) for i in range(n)]

    with open(out_fname, 'w') as f:
        for a in data3:
            for v in a:
                f.write('%21.16e ' % v)
            f.write('\n')

rawdata = open("MAFO_Saturated.refl").read()

xtract(rawdata, "MAFO_Saturated_pp.tab", r'\+\+')
xtract(rawdata, "MAFO_Saturated_mm.tab", r'\-\-')