Newer
Older
# ascii.py
# write hdr and data in ascii files
import os
def writeHeaderProfile(hdrFile, cfg, device, fe, r):
# first line, header ex:
# PIRATA-FR30 THALASSA IRD SBE911+ 09P-1263 BOURLES
print("{} {} {} {} {} {}".format(cfg['cruise']['CYCLEMESURE'],
cfg['cruise']['PLATEFORME'], cfg['cruise']['INSTITUTE'],
cfg[device]['typeInstrument'], cfg[device]['instrumentNumber'],
cfg['cruise']['PI']))
f.write("{} {} {} {} {} {}\n".format(cfg['cruise']['CYCLEMESURE'],
cfg['cruise']['PLATEFORME'], cfg['cruise']['INSTITUTE'],
cfg[device]['typeInstrument'], cfg[device]['instrumentNumber'],
# write next lines, start and end profile ex:
# 00001 18/02/2020 19:04:19 18/02/2020 22:41:07 11°28.85 N 023°00.59 W 4063 5083 fr30001
# add PROFILE and END_PROFILE_TIME, BATH
for i in range(fe.n):
for k in fe.variables_1D:
if k == 'TIME':
t = tools.julian2dt(fe['TIME'][i]).strftime("%d/%m/%Y %H:%M:%S")
print(f"{t} ", end='')
f.write(f"{t} ")
#query = self.db.query('SELECT end_date_time FROM station')
# need to cast <class 'numpy.int32'> to int
query = fe.db.select('station', ['end_date_time'], station = int(fe['PROFILE'][i]))
for idx, item in enumerate(query):
dt = item['end_date_time']
if dt == None:
pass
else:
print(f"{dt} ", end='')
f.write(f"{dt} ")
elif k == 'LATITUDE':
lat = tools.Dec2dmc(fe['LATITUDE'][i],'N')
print(f"{lat} ", end='')
f.write(f"{lat} ")
elif k == 'LONGITUDE':
lon = tools.Dec2dmc(fe['LONGITUDE'][i],'W')
print(f"{lon} ", end='')
f.write(f"{lon} ")
else:
fmt = fe.roscop[k]['format']
#print(k, type(fe[k][i]))
print(' 1e+36 ', end='')
f.write(' 1e+36 ')
else:
print(f"{fmt} " % (fe[k][i]), end='')
f.write(f"{fmt} " % (fe[k][i]))
# get max value for each profile
col = f"MAX({fe.keys[0]})"
query = fe.db.query(
f"SELECT {col} FROM data WHERE station_id = {int(fe['PROFILE'][i])}")
for idx, item in enumerate(query):
dt = item[col]
if dt == None:
pass
else:
f.write("%6.1f " % (item[col]))
def writeDataProfile(dataFile, cfg, device, fe, r):
f.write("{} {} {} {} {} {}\n".format(cfg['cruise']['CYCLEMESURE'],
cfg['cruise']['PLATEFORME'], cfg['cruise']['INSTITUTE'],
cfg[device]['typeInstrument'], cfg[device]['instrumentNumber'],
# write header, second line with physical parameter liste, fill with N/A if necessary
f.write("PROFILE ")
for k in fe.keys:
f.write(f" {k} ")
for r in range(len(fe.keys),len(fe.variables_1D)+1):
f.write(' N/A ')
f.write("\n")
# write station or profile header
# write header (pres or depth = -1)
for k in fe.variables_1D:
fmt = fe.roscop[k]['format']
if k == 'PROFILE' or k == 'PRFL':
f.write(f"{fmt} -1 " % (fe[k][i]))
elif k == 'TIME':
f.write(f" {fmt} {'%s'}" % (fe[k][i] - fe.julian_from_year,
tools.julian2dt(fe[k][i]).strftime("%Y%m%d%H%M%S")))
else:
if np.isnan(fe[k][i]):
#print(k, type(fe[k][i]))
f.write(' 1e+36 ')
else:
f.write(f" {fmt} " % (fe[k][i]))
# fill last header columns with 1e+36 if
for r in range(len(fe.variables_1D)+1, len(fe.keys)):
f.write(' 1e+36 ')
f.write("\n")
# for each valid line in array (not _fillvalue)
# don't print line if data is _fillValue
if fe[fe.keys[0]][i][m] != fe.roscop[fe.keys[0]]['_FillValue']:
fmt = fe.roscop['PROFILE']['format']
f.write(f"{fmt} " % (fe['PROFILE'][i]))
# add value for each parameter, use format from roscop
fmt = fe.roscop[k]['format']
f.write(f" {fmt} " % (fe[k][i][m]))
for r in range(len(fe.keys),len(fe.variables_1D)+1):
f.write(' 1e+36 ')
if not os.path.exists(cfg['global']['ASCII']):
os.makedirs(cfg['global']['ASCII'])
fileName = "{}/{}.{}".format(cfg['global']['ASCII'],
cfg['cruise']['CYCLEMESURE'], device.lower())
writeHeaderProfile(fileName, cfg, device.lower(), fe, r, )
fileName = "{}/{}_{}".format(cfg['global']['ASCII'],
cfg['cruise']['CYCLEMESURE'], device.lower())
print('writing data file: {}'.format(fileName), end='', flush=True)
writeDataProfile(fileName, cfg, device.lower(), fe, r)
print(' done...')
def writeDataTrajectory(dataFile, cfg, device, fe, r):
f = open(dataFile, 'w')
# write header, first line
f.write("{} {} {} ".format(cfg['cruise']['CYCLEMESURE'],
cfg['cruise']['PLATEFORME'], cfg['cruise']['INSTITUTE']))
if 'typeInstrument' in cfg[device]:
f.write(f"{cfg[device]['typeInstrument']}")
if 'instrumentNumber' in cfg[device]:
f.write(f"{cfg[device]['instrumentNumber']}")
if 'PI' in cfg['cruise']:
f.write(f"{cfg['cruise']['PI']}")
f.write("\n")
# write header, second line with physical parameter liste, fill with N/A if necessary
for k in fe.keys:
for n in range(fe.n):
for k in fe.keys:
fmt = fe.roscop[k]['format']
if '_FillValue' in fe.roscop[k] and fe[k][n] == fe.roscop[k]['_FillValue']:
f.write(' 1e+36 ')
def writeTrajectory(cfg, device, fe, r):
if not os.path.exists(cfg['global']['ASCII']):
os.makedirs(cfg['global']['ASCII'])
# fileName = "{}/{}.{}".format(cfg['global']['ASCII'],
# cfg['cruise']['CYCLEMESURE'], device.lower())
# logging.debug('writing header file: {}'.format(fileName))
# writeHeaderProfile(fileName, cfg, device.lower(), fe, r, )
fileName = "{}/{}_{}".format(cfg['global']['ASCII'],
cfg['cruise']['CYCLEMESURE'], device.lower())
print('writing data file: {}'.format(fileName), end='', flush=True)
writeDataTrajectory(fileName, cfg, device.lower(), fe, r)