Skip to content
Snippets Groups Projects
Commit ce0c2c71 authored by Bavo Langerock's avatar Bavo Langerock
Browse files

added geoms manipulate attributes script

parent b63e66f1
No related branches found
No related tags found
No related merge requests found
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys,argparse,os
import pyhdf.SD as SD
import h5py
import shutil
import datetime as dt
import numpy as np
user=os.environ['USER']
def main():
# Manage arguments
parser = argparse.ArgumentParser(formatter_class=argparse.RawTextHelpFormatter,
description = """Manipulate attributes in GEOMS hdf files""",
epilog = """Written by Bavo Langerock, BIRA-IASB 2024
Example to add a DOI to an existing GEOMS file and increment its DATA_FILE_VERSION
./geomsma.py groundbased_ftir.o3_bira.iasb003_irwg2023_la.reunion.maido_20240608t045021z_20240608t060345z_001.hdf groundbased_ftir.o3_bira.iasb003_irwg2023_la.reunion.maido_20240608t045021z_20240608t060345z_002.hdf DATA_MODIFICATIONS "Modifications file version 002: added DOI" FILE_DOI 10.60897/ndacc.la.reunion.maido_ftir.o3_bira.iasb003_irwg2023""")
parser.add_argument('infile',help='source GEOMS file')
parser.add_argument('outfile',help='target GEOMS file, from which the FILE_NAME,DATA_SOURCE,DATA_FILE_VERSION attributes are derived')
parser.add_argument('attributes',help='pairs <GEOMSfileattribute> "<new value>"', nargs=argparse.REMAINDER)
args = parser.parse_args()
infile=args.infile
outfile=args.outfile
assert os.path.realpath(outfile)!=os.path.realpath(infile),f'output {outfile} will overwrite input source {infile}'
nkeys=args.attributes[0::2];nvalues=args.attributes[1::2]
assert len(nkeys)==len(nvalues),f'not all keys have a value'
newsource='_'.join(os.path.basename(outfile).split('_')[1:-4])
newversion=os.path.basename(outfile).split('_')[-1].rsplit('.',1)[0]
shutil.copyfile(infile,outfile)
if h5py.is_hdf5(infile):
with h5py.File(outfile,'a') as fid:
fid.attrs['DATA_SOURCE']=np.array(newsource.upper(),dtype='S')
fid.attrs['FILE_NAME']=np.array(os.path.basename(outfile),dtype='S')
fid.attrs['DATA_FILE_VERSION']=np.array(newversion,dtype='S')
if 'DATA_MODIFICATIONS' in fid.attrs: X=np.string_(fid.attrs['DATA_MODIFICATIONS']) if isinstance(fid.attrs['DATA_MODIFICATIONS'],str) else fid.attrs['DATA_MODIFICATIONS']
else: X=np.string_('')
X=';'.join([x for x in (X.astype(dtype='U'),'changed DATA_SOURCE by %s on %s, origin is %s'%(user,dt.datetime.now().strftime('%Y%m%dT%H%M%Sz'),infile)) if x.lower() not in ('','none')])
fid.attrs['DATA_MODIFICATIONS']=np.array(X,dtype='S')
for nk,nv in zip(nkeys,nvalues): fid.attrs[nk]=np.array(nv,dtype='S')
else:
hdf4id=SD.SD(outfile,SD.SDC.WRITE)
att4=hdf4id.attr('DATA_SOURCE');att4.set(SD.SDC.CHAR8,newsource.upper())
att4=hdf4id.attr('FILE_NAME');att4.set(SD.SDC.CHAR8,os.path.basename(outfile))
att4=hdf4id.attr('DATA_FILE_VERSION');att4.set(SD.SDC.CHAR8,newversion)
try: X=getattr(hdf4id,'DATA_MODIFICATIONS');
except: X=''
finally: att4=hdf4id.attr('DATA_MODIFICATIONS')
if X: X=';'.join([x for x in (X,'changed DATA_SOURCE by %s on %s, origin is %s'%(user,dt.datetime.now().strftime('%Y%m%dT%H%M%Sz'),infile)) if x.lower() not in ('','none')]);att4.set(SD.SDC.CHAR8,X)
for nk,nv in zip(nkeys,nvalues):
att4=hdf4id.attr(nk);att4.set(SD.SDC.CHAR8,nv)
if __name__ == '__main__': main()
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment