From 207f037c7e68f4d2f3cf1879c02263797740f6cb Mon Sep 17 00:00:00 2001
From: Wouter Peters <wouter.peters@wur.nl>
Date: Tue, 3 Aug 2010 13:11:08 +0000
Subject: [PATCH] working on implementing Nio for tools/io.py

---
 da/ct/io.py    |  6 ++--
 da/tools/io.py | 79 ++++++++++++++++++++++----------------------------
 2 files changed, 37 insertions(+), 48 deletions(-)

diff --git a/da/ct/io.py b/da/ct/io.py
index f3bba790..2196be26 100755
--- a/da/ct/io.py
+++ b/da/ct/io.py
@@ -17,10 +17,10 @@ import os
 
 disclaimer 	= "This data belongs to the CarbonTracker project"
 email		= "wouter.peters@wur.nl"
-url		= "http://carbontracker.wur.nl"
-institution 	= "Wageningen University and Research Center"
+url		    = "http://carbontracker.wur.nl"
+institution = "Wageningen University and Research Center"
 source 		= "CarbonTracker release 2.0" 
-conventions 	= "CF-1.1"
+conventions = "CF-1.1"
 historytext	= 'Created on '+dt.datetime.now().strftime('%B %d, %Y')+' by %s'%os.environ['USER']
 
 std_savedict={'name':'unknown','values':[],'dims':(0,0,),'units':'','long_name':'','_FillValue':float(-999.),'comment':''}
diff --git a/da/tools/io.py b/da/tools/io.py
index 460d2b13..5e7a7b21 100755
--- a/da/tools/io.py
+++ b/da/tools/io.py
@@ -9,9 +9,7 @@ File created on 15 Oct 2008.
 File modified for CT data assimilation system in July 2010, Wouter Peters
 
 """
-import da.ct.standardvariables
 import datetime as dt
-import Nio
 from numpy import array
 import os
 
@@ -28,51 +26,47 @@ std_savedict={'name':'unknown','values':[],'dims':(0,0,),'units':'','long_name':
 class CT_CDF(object):
     """ function opens a NetCDF/HDF/GRIB file for writing of output"""
     def __init__(self,*arguments):
+        import Nio
 
-            self.file = Nio.open_file(*arguments)
-            #self.AddCTHeader()
+        self.file = Nio.open_file(*arguments)
+        self.AddCTHeader()
 
 
     def AddCTHeader(self):
 
-        self.automode()
         #
-        setattr(self,'Institution',institution)
-        setattr(self,'Contact',email)
-        setattr(self,'URL',url)
-        setattr(self,'Source',source)
-        setattr(self,'Convention',conventions)
-        setattr(self,'Disclaimer',disclaimer)
+        setattr(self.file,'Institution',institution)
+        setattr(self.file,'Contact',email)
+        setattr(self.file,'URL',url)
+        setattr(self.file,'Source',source)
+        setattr(self.file,'Convention',conventions)
+        setattr(self.file,'Disclaimer',disclaimer)
         setattr(self,'History',historytext)
 
     def AddParamsDim(self,nparams):
 
-        self.automode()
-        dimparams=self.def_dim('nparameters',nparams)
+        dimparams=self.file.create_dimension('nparameters',nparams)
 
         return (dimparams,)
 
     def AddMembersDim(self,nmembers):
 
-        self.automode()
-        dimmembers=self.def_dim('nmembers',nmembers)
+        dimmembers=self.file.create_dimension('nmembers',nmembers)
 
         return (dimmembers,)
 
     def AddLagDim(self,nlag,unlimited=True):
 
-        self.automode()
         if unlimited:
-            dimlag =self.def_dim('nlag',CDF.NC.UNLIMITED)
+            dimlag =self.file.create_dimension('nlag',CDF.NC.UNLIMITED)
         else:
-            dimlag=self.def_dim('nlag',nlag)
+            dimlag=self.file.create_dimension('nlag',nlag)
 
         return (dimlag,)
 
     def AddObsDim(self,nobs):
 
-        self.automode()
-        dimobs=self.def_dim('nobs',nobs)
+        dimobs=self.file.create_dimension('nobs',nobs)
 
         return (dimobs,)
 
@@ -80,7 +74,7 @@ class CT_CDF(object):
 
         from numpy import arange, float64
 
-        if 'latitude'  in self.dimensions(): return (self.dim('latitude'),self.dim('longitude'),)  # already exists
+        if 'latitude'  in self.file.dimensions.keys(): return (self.file.dimensions['latitude'],self.file.dimensions['longitude'],)  # already exists
 
         lons=-180+arange(360)*1.0+0.5
         lats=-90+arange(180)*1.0+0.5
@@ -88,9 +82,8 @@ class CT_CDF(object):
         lats=lats[jstart:jend]
         lons=lons[istart:iend]
         #
-        self.automode()
-        dimlon=self.def_dim('longitude',lons.shape[0])
-        dimlat=self.def_dim('latitude',lats.shape[0])
+        dimlon=self.file.create_dimension('longitude',lons.shape[0])
+        dimlat=self.file.create_dimension('latitude',lats.shape[0])
 
         savedict=self.StandardVar(varname='latitude')
         savedict['values']=lats.tolist()
@@ -108,20 +101,18 @@ class CT_CDF(object):
 
     def AddDateDim(self):
 
-        self.automode()
-        if 'date'  in self.dimensions(): return (self.dim('date'),)
-        return (self.def_dim('date',CDF.NC.UNLIMITED),)
+        if 'date'  in self.dimensions.keys(): return (self.file.dimensions['date'],)
+        return (self.file.create_dimension('date',None),)
 
     def AddDateDimFormat(self):
 
-        self.automode()
-        if 'yyyymmddhhmmss'  in self.dimensions(): return (self.dim('yyyymmddhhmmss'),)  # already exists
-        return (self.def_dim('yyyymmddhhmmss',6),)
+        if 'yyyymmddhhmmss'  in self.file.dimensions.keys(): return (self.file.dimensions['yyyymmddhhmmss'],)  # already exists
+        return (self.file.create_dimension('yyyymmddhhmmss',6),)
 
     def has_date(self,dd):
 
-        if self.inq_unlimlen() > 0:
-            if dd in self.GetVariable('date').tolist():
+        if self.file.dimensions['date'] > 0:
+            if dd in self.file.variables.['date'][:].tolist():
                 return True
             else:
                 return False
@@ -130,7 +121,7 @@ class CT_CDF(object):
             
     def GetVariable(self,varname):
         """ get variable from ncf file"""
-        return array(self.var(varname).get())
+        return self.file.variables.[varname][:]
 
     def StandardVar(self,varname):
         """ return properties of standard variables """
@@ -144,7 +135,7 @@ class CT_CDF(object):
     def AddData(self,datadict,nsets=1,silent=True):
         """ add fields to file, at end of unlimited dimension"""
 
-        existing_vars=self.variables()
+        existing_vars=self.file.variables.keys()
 
         try: 
             next = datadict['count']
@@ -153,22 +144,22 @@ class CT_CDF(object):
 
 
         if existing_vars.has_key(datadict['name']):
-            var = self.var(datadict['name']) 
+            var = self.file.variables[datadict['name']] 
             var[next:next+nsets]=datadict['values']
         else:
             if not silent: print 'Creating new dataset: '+datadict['name']
 
             if datadict.has_key('dtype'):
                 if datadict['dtype'] == 'int':
-                    var = self.def_var(datadict['name'],CDF.NC.INT,datadict['dims'])
+                    var = self.file.create_variable(datadict['name'],'i',datadict['dims'])
                 elif datadict['dtype'] == 'char':
-                    var = self.def_var(datadict['name'],CDF.NC.CHAR,datadict['dims'])
+                    var = self.file.create_variable(datadict['name'],'s1',datadict['dims'])
                 elif datadict['dtype'] == 'double':
-                    var = self.def_var(datadict['name'],CDF.NC.DOUBLE,datadict['dims'])
+                    var = self.file.create_variable(datadict['name'],'d',datadict['dims'])
                 else:
-                    var = self.def_var(datadict['name'],CDF.NC.FLOAT,datadict['dims'])
+                    var = self.file.create_variable(datadict['name'],'f',datadict['dims'])
             else:
-                var = self.def_var(datadict['name'],CDF.NC.FLOAT,datadict['dims'])
+                var = self.file.create_variable(datadict['name'],'f',datadict['dims'])
             for k,v in datadict.iteritems(): 
                 if k not in ['name','dims','values','_FillValue','count']: 
                     setattr(var,k,v)
@@ -177,10 +168,6 @@ class CT_CDF(object):
             else:
                 var[:]=datadict['values']
 
-def GetVariable(file,varname):
-    """ get variable from HDF file"""
-    return array(file.select(varname).get())
-
 def CreateDirs(rundat,dirname):
 
     dirname=os.path.join(rundat.outputdir,dirname)
@@ -198,8 +185,10 @@ if __name__ == '__main__':
 
     sys.path.append('../../')
 
+    import da.tools.standardvariables
+
     ncf=CT_CDF('test.nc','c')
     #dimgrid=ncf.AddLatLonDim()
-    #dimdate=ncf.AddDateDim()
+    dimdate=ncf.AddDateDim()
     #dimidate=ncf.AddDateDimFormat()
 
-- 
GitLab