Skip to content
Snippets Groups Projects
Commit c8ddedaa authored by jacques.grelet_ird.fr's avatar jacques.grelet_ird.fr
Browse files

add odv output

parent 1e5181a7
No related branches found
No related tags found
No related merge requests found
odv.py 0 → 100644
# ascii.py
# write hdr and data in ascii files
import os
import logging
from re import S
import tools
import numpy as np
from datetime import datetime
def writeDataProfile(dataFile, cfg, device, fe, r):
f = open(dataFile, 'w')
# write header, first line
f.write("{} {} {} {} {} {}\n".format(cfg['cruise']['CYCLEMESURE'],
cfg['cruise']['PLATEFORME'], cfg['cruise']['INSTITUTE'],
cfg[device]['typeInstrument'], cfg[device]['instrumentNumber'],
cfg['cruise']['PI']))
# write odv header
f.write(f"//ODV Spreadsheet file : {dataFile}\n")
f.write(f"//Data treated : {datetime.today().strftime('%Y-%m-%dT%H:%M:%SZ')}\n")
f.write("//<DataType>Profiles</DataType>\n")
f.write(f"//<InstrumentType>{cfg[device]['typeInstrument']}</InstrumentType>\n")
f.write(f"//<Source>{os.getcwd()}</Sources>\n")
f.write(f"//<Creator>{cfg['cruise']['CREATOR']}</Creator>\n")
f.write("//\n")
f.write("Cruise\tStation\tType\tmon/day/yr\thh:mm\tLongitude [degrees_east]\tLatitude [degrees_north]\tBot. Depth [m]")
# write variables and unit
for k in fe.keys:
f.write(f" {k} [{fe.roscop[k]['units']}]")
f.write("\n")
type = 'C'
for i in range(fe.n):
# for each valid line in array (not _fillvalue)
for m in range(fe.size[i+1]):
fmt = fe.roscop['PROFILE']['format']
f.write(f"%s\t{fmt}\t%s\t" % (cfg['cruise']['CYCLEMESURE'], fe['PROFILE'][i], type))
f.write(f"%s\t" % (tools.julian2format(fe['TIME'][i], "%Y-%m-%dT%H:%M:%S")))
f.write(f"%f\t" % (fe['LATITUDE'][i]))
f.write(f"%f\t" % (fe['LONGITUDE'][i]))
if fe.iskey('BATH'):
fmt = fe.roscop['BATH']['format']
f.write(f"{fmt}\t" % (fe['BATH'][i]))
else:
f.write("\t")
for k in fe.keys:
if fe[k][i][m] != fe.roscop[k]['_FillValue']:
fmt = fe.roscop[k]['format']
f.write(f"{fmt}\t" % (fe[k][i][m]))
else:
f.write("\t")
f.write("\n")
f.close()
def writeProfile(cfg, device, fe, r):
if not os.path.exists(cfg['global']['odv']):
os.makedirs(cfg['global']['odv'])
fileName = "{}/{}_{}_odv.txt".format(cfg['global']['odv'],
cfg['cruise']['CYCLEMESURE'], device.lower())
print('writing data file: {}'.format(fileName), end='', flush=True)
writeDataProfile(fileName, cfg, device.lower(), fe, r)
print(' done...')
def writeDecimalDataTrajectory(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:
f.write(f" {k} ")
f.write("\n")
# write data
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 ')
else:
f.write(f" {fmt} " % (fe[k][n]))
f.write("\n")
f.close()
def writeHumanDataTrajectory(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:
if k == 'DAYD':
f.write(" DATE TIME ")
continue
f.write(f" {k} ")
f.write("\n")
# write data
for n in range(fe.n):
for k in fe.keys:
if k == 'LATITUDE':
f.write(f" {tools.Dec2dmc(fe[k][n],'N')} ")
continue
if k == 'LONGITUDE':
f.write(f" {tools.Dec2dmc(fe[k][n],'E')} ")
continue
if k == 'DAYD':
# use the format given in devide trajectory toml config file
dt = tools.julian2format(fe[k][n])
f.write(f" {dt} ")
continue
fmt = fe.roscop[k]['format']
if '_FillValue' in fe.roscop[k] and fe[k][n] == fe.roscop[k]['_FillValue']:
f.write(' 1e+36 ')
else:
f.write(f" {fmt} " % (fe[k][n]))
f.write("\n")
f.close()
def writeTrajectory(cfg, device, fe, r):
if not os.path.exists(cfg['global']['odv']):
os.makedirs(cfg['global']['odv'])
# write ascii file with human read time and position
fileName = "{}/{}_{}_odv.txt".format(cfg['global']['odv'],
cfg['cruise']['CYCLEMESURE'], device.lower())
print('writing file: {}'.format(fileName), end='', flush=True)
writeHumanDataTrajectory(fileName, cfg, device.lower(), fe, r, )
print(' done...')
# write ascii file with decimal time and position
fileName = "{}/{}_{}_odv.txt".format(cfg['global']['odv'],
cfg['cruise']['CYCLEMESURE'], device.lower())
print('writing file: {}'.format(fileName), end='', flush=True)
writeDecimalDataTrajectory(fileName, cfg, device.lower(), fe, r)
print(' done...')
\ No newline at end of file
......@@ -18,6 +18,7 @@ import tools
from physical_parameter import Roscop
from notanorm import SqliteDb
import ascii
import odv
import netcdf
# define SQL station table
......@@ -87,6 +88,8 @@ class Profile:
self.encoding = "ISO-8859-1"
self.n = 0
self.m = 0
# for each profile, store the indice of the max value
self.size = {}
self.lineHeader = 0
self.db = SqliteDb(self.__dbname)
......@@ -110,6 +113,13 @@ class Profile:
# def encoding(self, encoding):
# self.__encoding = encoding
def iskey(self, key):
''' return true ik key is in dict self.__data '''
if key in self.__data:
return True
else:
return False
# overloading operators
def __getitem__(self, key):
''' overload r[key] '''
......@@ -190,6 +200,7 @@ class Profile:
query = self.db.query(f"SELECT COUNT({self.keys[0]}) FROM data where station_id = {i}")
#print(query)
size = int(query[0][f"COUNT({self.keys[0]})"])
self.size[i] = size
if size > m:
m = size
......@@ -506,13 +517,18 @@ class Profile:
self.set_regex(cfg, ti, 'header')
self.read_files(cfg, ti)
#return fe
# write ASCII hdr and data files
ascii.writeProfile(cfg, ti, self, self.roscop)
# write ODV file
if cfg['global']['odv']:
odv.writeProfile(cfg, ti, self, self.roscop)
# write the NetCDF file
netcdf.writeProfile(cfg, ti, self, self.roscop)
# for testing in standalone context
# ---------------------------------
if __name__ == "__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