Source code for gsshapy.orm.snw

"""
********************************************************************************
* Name: SnowSimulationModel
* Author: Nathan Swain
* Created On: May 16, 2013
* Copyright: (c) Brigham Young University 2013
* License: BSD 2-Clause
********************************************************************************
"""
from __future__ import unicode_literals

__all__ = ['NwsrfsFile',
           'NwsrfsRecord',
           'OrographicGageFile',
           'OrographicMeasurement']

from datetime import datetime

from sqlalchemy import ForeignKey, Column
from sqlalchemy.types import Integer, Float, DateTime, String
from sqlalchemy.orm import relationship

from . import DeclarativeBase
from ..base.file_base import GsshaPyFileObjectBase


[docs]class NwsrfsFile(DeclarativeBase, GsshaPyFileObjectBase): """ Object interface for the NWSRFS Snow File. The contents of this file is abstracted into one supporting object: :class:`.NwsrfsRecord`. See: `GSSHAWIKI <http://www.gsshawiki.com/Snow_Card_Inputs_-_Optional>`_ """ __tablename__ = 'snw_nwsrfs_files' tableName = __tablename__ #: Database tablename # Primary and Foreign Keys id = Column(Integer, autoincrement=True, primary_key=True) #: PK # Value Columns numBands = Column(Integer, nullable=False) #: INTEGER fileExtension = Column(String, default='txt') #: STRING # Relationship Properties nwsrfsRecords = relationship('NwsrfsRecord', back_populates='nwsrfsFile') #: RELATIONSHIP projectFile = relationship('ProjectFile', uselist=False, back_populates='nwsrfsFile') #: RELATIONSHIP def __init__(self): """ Constructor """ GsshaPyFileObjectBase.__init__(self) def _read(self, directory, filename, session, path, name, extension, spatial, spatialReferenceID, replaceParamFile): """ NWSRFS Read from File Method """ # Set file extension property self.fileExtension = extension # Open file and parse with open(path, 'r') as nwsrfsFile: for line in nwsrfsFile: sline = line.strip().split() # Cases if sline[0].lower() == 'number_bands:': self.numBands = sline[1] elif sline[0].lower() == 'lower_elevation': """DO NOTHING""" else: # Create GSSHAPY NwsrfsRecord object record = NwsrfsRecord(lowerElev=sline[0], upperElev=sline[1], mfMin=sline[2], mfMax=sline[3], scf=sline[4], frUse=sline[5], tipm=sline[6], nmf=sline[7], fua=sline[8], plwhc=sline[9]) # Associate NwsrfsRecord with NwsrfsFile record.nwsrfsFile = self def _write(self, session, openFile, replaceParamFile): """ NWSRFS Write to File Method """ # Write lines openFile.write('Number_Bands: %s\n' % self.numBands) openFile.write('Lower_Elevation Upper_Elevation MF_Min MF_Max SCF FR_USE TIPM NMF FUA PCWHC\n') # Retrieve NwsrfsRecords records = self.nwsrfsRecords for record in records: openFile.write('%s%s%s%s%.1f%s%.1f%s%.1f%s%.1f%s%.1f%s%.1f%s%.1f%s%.1f\n' % ( record.lowerElev, ' ' * (17 - len(str(record.lowerElev))), # Num Spaces record.upperElev, ' ' * (17 - len(str(record.upperElev))), # Num Spaces record.mfMin, ' ' * (8 - len(str(record.mfMin))), # Num Spaces record.mfMax, ' ' * (8 - len(str(record.mfMax))), # Num Spaces record.scf, ' ' * (5 - len(str(record.scf))), # Num Spaces record.frUse, ' ' * (8 - len(str(record.frUse))), # Num Spaces record.tipm, ' ' * (6 - len(str(record.tipm))), # Num Spaces record.nmf, ' ' * (5 - len(str(record.nmf))), # Num Spaces record.fua, ' ' * (5 - len(str(record.fua))), # Num Spaces record.plwhc))
[docs]class NwsrfsRecord(DeclarativeBase): """ Object containing data for a single NWSRFS record from the NWSRFS snow file. """ __tablename__ = 'snw_nwsrfs_records' tableName = __tablename__ #: Database tablename # Primary and Foreign Keys id = Column(Integer, autoincrement=True, primary_key=True) #: PK nwsrfsFileID = Column(Integer, ForeignKey('snw_nwsrfs_files.id')) #: FK # Value Columns lowerElev = Column(Integer, nullable=False) #: INTEGER upperElev = Column(Integer, nullable=False) #: INTEGER mfMin = Column(Float, nullable=False) #: FLOAT mfMax = Column(Float, nullable=False) #: FLOAT scf = Column(Float, nullable=False) #: FLOAT frUse = Column(Float, nullable=False) #: FLOAT tipm = Column(Float, nullable=False) #: FLOAT nmf = Column(Float, nullable=False) #: FLOAT fua = Column(Float, nullable=False) #: FLOAT plwhc = Column(Float, nullable=False) #: FLOAT # Relationship Properties nwsrfsFile = relationship('NwsrfsFile', back_populates='nwsrfsRecords') #: RELATIONSHIP def __init__(self, lowerElev, upperElev, mfMin, mfMax, scf, frUse, tipm, nmf, fua, plwhc): """ Constructor """ self.lowerElev = lowerElev self.upperElev = upperElev self.mfMin = mfMin self.mfMax = mfMax self.scf = scf self.frUse = frUse self.tipm = tipm self.nmf = nmf self.fua = fua self.plwhc = plwhc def __repr__(self): return '<ElevationNWSRFS: LowerElev=%s, UpperElev=%s, MFMin=%s, MFMax=%s, SCF=%s, FRUse=%s, TIPM=%s, NMF=%s, FUA=%s, PLWHC=%s>' % ( self.lowerElev, self.upperElev, self.mfMin, self.mfMax, self.scf, self.frUse, self.tipm, self.nmf, self.fua, self.plwhc)
[docs]class OrographicGageFile(DeclarativeBase, GsshaPyFileObjectBase): """ Object interface for the Orographic Gage File. The contents of this file is abstracted into one supporting object: :class:`.OrographicMeasurement`. See: `GSSHAWIKI <http://www.gsshawiki.com/Snow_Card_Inputs_-_Optional>`_ """ __tablename__ = 'snw_orographic_gage_files' tableName = __tablename__ #: Database tablename # Primary and Foreign Keys id = Column(Integer, autoincrement=True, primary_key=True) #: PK # Value Columns numSites = Column(Integer, nullable=False) #: INTEGER elevBase = Column(Float, nullable=False) #: FLOAT elev2 = Column(Float, nullable=False) #: FLOAT fileExtension = Column(String, default='txt') #: STRING # Relationship Properties orographicMeasurements = relationship('OrographicMeasurement', back_populates='orographicGageFile') #: RELATIONSHIP projectFile = relationship('ProjectFile', uselist=False, back_populates='orographicGageFile') #: RELATIONSHIP def __init__(self): """ Constructor """ GsshaPyFileObjectBase.__init__(self) def _read(self, directory, filename, session, path, name, extension, spatial, spatialReferenceID, replaceParamFile): """ Orographic Gage File Read from File Method """ # Set file extension property self.fileExtension = extension # Open file and parse into HmetRecords with open(path, 'r') as orthoFile: for line in orthoFile: sline = line.strip().split() # Cases if sline[0].lower() == 'num_sites:': self.numSites = sline[1] elif sline[0].lower() == 'elev_base': self.elevBase = sline[1] elif sline[0].lower() == 'elev_2': self.elev2 = sline[1] elif sline[0].lower() == 'year': """DO NOTHING""" else: # Create datetime object dateTime = datetime(year=int(sline[0]), month=int(sline[1]), day=int(sline[2]), hour=int(sline[3])) # Create GSSHAPY OrthoMeasurement object measurement = OrographicMeasurement(dateTime=dateTime, temp2=sline[4]) # Associate OrthoMeasurement with OrthographicGageFile self.orographicMeasurements.append(measurement) def _write(self, session, openFile, replaceParamFile): """ Orographic Gage File Write to File Method """ # Write lines openFile.write('Num_Sites: %s\n' % self.numSites) openFile.write('Elev_Base %s\n' % self.elevBase) openFile.write('Elev_2 %s\n' % self.elev2) openFile.write('Year Month Day Hour Temp_2\n') # Retrieve OrographicMeasurements measurements = self.orographicMeasurements for measurement in measurements: dateTime = measurement.dateTime openFile.write('%s%s%s%s%s%s%s%s%.3f\n' % ( dateTime.year, ' ', dateTime.month, ' ' * (8 - len(str(dateTime.month))), dateTime.day, ' ' * (8 - len(str(dateTime.day))), dateTime.hour, ' ' * (8 - len(str(dateTime.hour))), measurement.temp2))
[docs]class OrographicMeasurement(DeclarativeBase): """ Object containing data for a single orographic gage as defined in the orographic gage file. """ __tablename__ = 'snw_orographic_measurements' tableName = __tablename__ #: Database tablename # Primary and Foreign Keys id = Column(Integer, autoincrement=True, primary_key=True) #: PK orthoGageID = Column(Integer, ForeignKey('snw_orographic_gage_files.id')) #: FK # Value Columns dateTime = Column(DateTime) #: DATETIME temp2 = Column(Float) #: FLOAT # Relationship Properties orographicGageFile = relationship('OrographicGageFile', back_populates='orographicMeasurements') #: RELATIONSHIP def __init__(self, dateTime, temp2): """ Constructor """ self.dateTime = dateTime self.temp2 = temp2 def __repr__(self): return '<OroMeasurement: DateTime=%s, Temp2=%s>' % (self.dateTime, self.temp2)