Created
November 21, 2018 02:09
-
-
Save davidrpmorris/4c85825322671ae3de2384cc062a8567 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import numpy as np | |
import sys | |
# this is the file's name or path to the file | |
fname = 'vox.gsf' | |
def gsf_read(fname): | |
if fname.rpartition('.')[1] == '.': | |
fname = fname[0:fname.rfind('.')] | |
gsf_file = open(fname + '.gsf', 'rb') | |
metadata = {} | |
# check if header is OK | |
if not (gsf_file.readline().decode('UTF-8') == 'Gwyddion Simple Field 1.0\n'): | |
gsf_file.close() | |
raise ValueError("File has wrong header") | |
term = b'00' | |
# read metadata header | |
while term != b'\x00': | |
line_string = gsf_file.readline().decode('UTF-8') | |
metadata[line_string.rpartition(' = ')[0]] = line_string.rpartition('=')[2] | |
term = gsf_file.read(1) | |
gsf_file.seek(-1, 1) | |
gsf_file.read(4 - gsf_file.tell() % 4) | |
# fix known metadata types from .gsf file specs | |
# mandatory | |
metadata['XRes'] = np.int(metadata['XRes']) | |
metadata['YRes'] = np.int(metadata['YRes']) | |
# optional | |
for k in ['XReal', 'YReal', 'XOffset', 'YOffset', 'XYUnits', 'ZUnits', 'Title', 'Date', 'DwellTime']: | |
if k in metadata: | |
try: | |
metadata[k] = np.float(metadata[k]) | |
except: | |
metadata[k] = np.str(metadata[k].split("\n")[0]) | |
raw = np.frombuffer(gsf_file.read(), dtype='float32') | |
product = metadata['XRes'] * metadata['YRes'] | |
if len(raw) != product: | |
difference = product - len(raw) | |
data = np.pad(raw, (0, difference), 'minimum') | |
else: | |
data = raw | |
data = np.reshape(data, (metadata['YRes'], metadata['XRes'])) | |
print(data) | |
gsf_file.close() | |
return metadata, data | |
metadata, data = gsf_read(fname) | |
print(metadata) | |
def gsf_write(data, newfname, metadata={}): | |
gsf_file = open(newfname + '.gsf', 'wb') | |
s = '' | |
s += 'Gwyddion Simple Field 1.0' + '\n' | |
for k in metadata.keys(): | |
print(k, metadata[k]) | |
if k == 'XRes' or k == 'YRes': | |
s += k + ' = ' + '{0:d}'.format(metadata[k]) + '\n' | |
continue | |
elif k == 'XReal' or k == 'YReal': | |
s += k + ' = ' + '{0:g}'.format(metadata[k]) + '\n' | |
continue | |
try: | |
s += k + ' = ' + '{0:G}'.format(metadata[k]) + '\n' | |
except: | |
s += k + ' = ' + str(metadata[k]) + '\n' | |
gsf_file.write(bytes(s, 'UTF-8')) | |
gsf_file.write(b'\x00' * (4 - len(s) % 4)) | |
gsf_file.write(data.tobytes(None)) | |
gsf_file.close() | |
newfname = 'test_fixed' | |
gsf_write(data, newfname, metadata) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment