blob: 4aab0fcafe3e25eabc8f300486597a3ddc0545f7 [file] [log] [blame]
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
from __future__ import print_function
import netCDF4
import re
import pdb
# ********************************************************************
# CMORTable()
#
# ********************************************************************
class CMORTable:
'''
Create dictionary based on a file using key:value standard
'''
def __init__( self, inpath, table, entry=None ):
'''
Read CMIP5 Table and convert into a dictionary
'''
f=open( inpath + '/' + table, 'r')
if( f == None ):
print("Table file {} does not exist ".format(inpath + "/" + table))
lines = f.readlines()
startParse=[0]
stopParse=[len(lines)]
# --------------------------------
# extract user specified entry
# -------------------------------
if( entry != None ):
startParse = [ i for i in range(len(lines)) \
if re.match( ".*entry.*"+entry+".*", lines[i] ) != None ]
stopParse = [ i for i in range(startParse[0]+2, len(lines)) \
if re.match( ".*==========.*", lines[i] ) != None ]
self.dico = dict([ tuple(lines[i].split(":"))
for i in range(startParse[0], stopParse[0])
if len(lines[i].split(':')) == 2 ] )
# --------------------------------
# extract levels
# -------------------------------
if 'requested' in self.dico.keys():
self.dico['levels'] = self.dico['requested'].split('!')[0].split()
# --------------
# Convert to int
# ---------------
self.dico['levels'] = [ int( float( self.dico['levels'][i] ) )
for i in range( len( self.dico['levels'] ) )]
self.dico['levels'].sort()
def __getitem__( self, key ):
'''
Get rid of end of line comments and strip new lines CR "/n"
'''
return self.dico[key].split("!")[0].strip()
def __setitem__( self,key,value ):
'''
'''
self.dico[key]=value
def __delete__( self, key ):
'''
'''
del self.dico[key]
# ********************************************************************
# Global Attributes
#
# Manage Global Attributes in a cmor file
# ********************************************************************
class CMORAttributes:
'''
Manage Global Attributes.
'''
def __init__( self, file ):
'''
Open Cmor file
'''
self.filename = file
self.f = netCDF4.Dataset( self.filename, 'r+' )
def GlbDel( self, attribute ):
'''
Delete attribute
'''
self.f.__delattr__(attribute)
def GlbSet( self, attribute, value):
'''
Set attribute
'''
self.f.__setattr__(attribute, value)
def VarDel( self, variable,attribute ):
'''
Delete Variable attribute
'''
var=self.f.variables[variable]
var.__delatttr__(attribute)
def VarSet( self, variable, attribute, value):
'''
Set Variable attribute
'''
var=self.variables[variable]
var.__setattr__(attribute,value)
def close(self):
'''
'''
self.f.close()