Пример #1
0
    def __init__(self, config, mpasClimatologyTask, controlConfig=None):

        # {{{
        '''
        Construct the analysis task and adds it as a subtask of the
        ``parentTask``.

        Parameters
        ----------
        config :  ``MpasAnalysisConfigParser``
            Configuration options

        mpasClimatologyTask : ``MpasClimatologyTask``
            The task that produced the climatology to be remapped and plotted
            as a transect

        controlConfig :  ``MpasAnalysisConfigParser``, optional
            Configuration options for a control run (if any)
        '''
        # Authors
        # -------
        # Xylar Asay-Davis

        tags = ['climatology', 'transect', 'geojson']

        # call the constructor from the base class (AnalysisTask)
        super(GeojsonTransects, self).__init__(config=config,
                                               taskName='geojsonTransects',
                                               componentName='ocean',
                                               tags=tags)

        sectionName = self.taskName

        geojsonFiles = config.getExpression(sectionName, 'geojsonFiles')
        if len(geojsonFiles) == 0:
            return

        seasons = config.getExpression(sectionName, 'seasons')

        horizontalResolution = config.get(sectionName, 'horizontalResolution')

        verticalComparisonGridName = config.get(sectionName,
                                                'verticalComparisonGridName')

        if verticalComparisonGridName in ['mpas', 'obs']:
            verticalComparisonGrid = None
        else:
            verticalComparisonGrid = config.getExpression(
                sectionName, 'verticalComparisonGrid', usenumpyfunc=True)

        fields = config.getExpression(sectionName, 'fields')

        obsFileNames = OrderedDict()
        for fileName in geojsonFiles:
            with open(fileName) as filePointer:
                jsonFile = json.load(filePointer)

                for feature in jsonFile['features']:
                    if feature['geometry']['type'] != 'LineString':
                        continue
                    transectName = feature['properties']['name']

                    obsFileNames[transectName] = fileName

        transectCollectionName = 'geojson_transects'
        if horizontalResolution != 'obs':
            transectCollectionName = '{}_{}km'.format(transectCollectionName,
                                                      horizontalResolution)

        transectsObservations = GeojsonTransectsObservations(
            config, obsFileNames, horizontalResolution, transectCollectionName)

        computeTransectsSubtask = ComputeTransectsSubtask(
            mpasClimatologyTask=mpasClimatologyTask,
            parentTask=self,
            climatologyName='geojson',
            transectCollectionName=transectCollectionName,
            variableList=[field['mpas'] for field in fields],
            seasons=seasons,
            obsDatasets=transectsObservations,
            verticalComparisonGridName=verticalComparisonGridName,
            verticalComparisonGrid=verticalComparisonGrid)

        plotObs = False
        if controlConfig is None:

            refTitleLabel = None

            diffTitleLabel = None

        else:
            controlRunName = controlConfig.get('runs', 'mainRunName')
            refTitleLabel = 'Control: {}'.format(controlRunName)

            diffTitleLabel = 'Main - Control'

        for field in fields:
            fieldPrefix = field['prefix']
            for transectName in obsFileNames:
                for season in seasons:
                    outFileLabel = fieldPrefix
                    if controlConfig is None:
                        refFieldName = None
                    else:
                        refFieldName = field['mpas']

                    fieldPrefixUpper = fieldPrefix[0].upper() + fieldPrefix[1:]
                    fieldNameInTytle = '{} from {}'.format(
                        field['titleName'], transectName.replace('_', ' '))

                    # make a new subtask for this season and comparison grid
                    subtask = PlotTransectSubtask(self, season, transectName,
                                                  fieldPrefix,
                                                  computeTransectsSubtask,
                                                  plotObs, controlConfig)

                    subtask.set_plot_info(
                        outFileLabel=outFileLabel,
                        fieldNameInTitle=fieldNameInTytle,
                        mpasFieldName=field['mpas'],
                        refFieldName=refFieldName,
                        refTitleLabel=refTitleLabel,
                        diffTitleLabel=diffTitleLabel,
                        unitsLabel=field['units'],
                        imageCaption=fieldNameInTytle,
                        galleryGroup='Geojson Transects',
                        groupSubtitle=None,
                        groupLink='geojson',
                        galleryName=field['titleName'],
                        configSectionName='geojson{}Transects'.format(
                            fieldPrefixUpper))

                    self.add_subtask(subtask)
Пример #2
0
    def __init__(self, config, mpasClimatologyTask, controlConfig=None):

        # {{{
        '''
        Construct the analysis task and adds it as a subtask of the
        ``parentTask``.

        Parameters
        ----------
        config :  ``MpasAnalysisConfigParser``
            Configuration options

        mpasClimatologyTask : ``MpasClimatologyTask``
            The task that produced the climatology to be remapped and plotted
            as a transect

        controlConfig :  ``MpasAnalysisConfigParser``, optional
            Configuration options for a control run (if any)
        '''
        # Authors
        # -------
        # Xylar Asay-Davis

        tags = ['climatology', 'transect', 'sose', 'publicObs', 'antarctic']

        # call the constructor from the base class (AnalysisTask)
        super(SoseTransects, self).__init__(config=config,
                                            taskName='soseTransects',
                                            componentName='ocean',
                                            tags=tags)

        sectionName = self.taskName

        seasons = config.getExpression(sectionName, 'seasons')

        horizontalResolution = config.get(sectionName, 'horizontalResolution')

        verticalComparisonGridName = config.get(sectionName,
                                                'verticalComparisonGridName')

        if verticalComparisonGridName in ['mpas', 'obs']:
            verticalComparisonGrid = None
        else:
            verticalComparisonGrid = config.getExpression(
                sectionName, 'verticalComparisonGrid', usenumpyfunc=True)

        longitudes = sorted(
            config.getExpression(sectionName, 'longitudes', usenumpyfunc=True))

        fields = \
            [{'prefix': 'temperature',
              'mpas': '******',
              'units': r'$\degree$C',
              'titleName': 'Potential Temperature',
              'obsFilePrefix': 'pot_temp',
              'obsFieldName': 'theta'},
             {'prefix': 'salinity',
              'mpas': '******',
              'units': r'PSU',
              'titleName': 'Salinity',
              'obsFilePrefix': 'salinity',
              'obsFieldName': 'salinity'},
             {'prefix': 'potentialDensity',
              'mpas': '******',
              'units': r'kg m$^{-3}$',
              'titleName': 'Potential Density',
              'obsFilePrefix': 'pot_den',
              'obsFieldName': 'potentialDensity'},
             {'prefix': 'zonalVelocity',
              'mpas': '******',
              'units': r'm s$^{-1}$',
              'titleName': 'Zonal Velocity',
              'obsFilePrefix': 'zonal_vel',
              'obsFieldName': 'zonalVel'},
             {'prefix': 'meridionalVelocity',
              'mpas': '******',
              'units': r'm s$^{-1}$',
              'titleName': 'Meridional Velocity',
              'obsFilePrefix': 'merid_vel',
              'obsFieldName': 'meridVel'},
             {'prefix': 'velocityMagnitude',
              'mpas': '******',
              'units': r'm s$^{-1}$',
              'titleName': 'Velocity Magnitude',
              'obsFilePrefix': None,
              'obsFieldName': 'velMag'}]

        fieldList = config.getExpression(sectionName, 'fieldList')
        fields = [field for field in fields if field['prefix'] in fieldList]

        variableList = [
            field['mpas'] for field in fields if field['mpas'] != 'velMag'
        ]

        transectCollectionName = 'SOSE_transects'
        if horizontalResolution != 'obs':
            transectCollectionName = '{}_{}km'.format(transectCollectionName,
                                                      horizontalResolution)

        transectsObservations = SoseTransectsObservations(
            config, horizontalResolution, transectCollectionName, fields)

        computeTransectsSubtask = ComputeTransectsWithVelMag(
            mpasClimatologyTask=mpasClimatologyTask,
            parentTask=self,
            climatologyName='SOSE_transects',
            transectCollectionName=transectCollectionName,
            variableList=variableList,
            seasons=seasons,
            obsDatasets=transectsObservations,
            verticalComparisonGridName=verticalComparisonGridName,
            verticalComparisonGrid=verticalComparisonGrid)

        plotObs = controlConfig is None
        if plotObs:

            refTitleLabel = 'State Estimate (SOSE)'

            diffTitleLabel = 'Model - State Estimate'

        else:
            controlRunName = controlConfig.get('runs', 'mainRunName')
            refTitleLabel = 'Control: {}'.format(controlRunName)

            diffTitleLabel = 'Main - Control'

        for field in fields:
            fieldPrefix = field['prefix']
            fieldPrefixUpper = fieldPrefix[0].upper() + fieldPrefix[1:]
            for lon in longitudes:
                transectName = 'lon_{}'.format(lon)

                for season in seasons:
                    outFileLabel = 'SOSE_{}_'.format(fieldPrefix)
                    if plotObs:
                        refFieldName = field['obsFieldName']
                    else:
                        refFieldName = field['mpas']

                    fieldNameInTytle = r'{} at {}$\degree$ Lon.'.format(
                        field['titleName'], lon)

                    # make a new subtask for this season and comparison grid
                    subtask = PlotTransectSubtask(self, season, transectName,
                                                  fieldPrefix,
                                                  computeTransectsSubtask,
                                                  plotObs, controlConfig)

                    subtask.set_plot_info(
                        outFileLabel=outFileLabel,
                        fieldNameInTitle=fieldNameInTytle,
                        mpasFieldName=field['mpas'],
                        refFieldName=refFieldName,
                        refTitleLabel=refTitleLabel,
                        diffTitleLabel=diffTitleLabel,
                        unitsLabel=field['units'],
                        imageCaption='{} {}'.format(fieldNameInTytle, season),
                        galleryGroup='SOSE Transects',
                        groupSubtitle=None,
                        groupLink='sose_transects',
                        galleryName=field['titleName'],
                        configSectionName='sose{}Transects'.format(
                            fieldPrefixUpper))

                    self.add_subtask(subtask)
Пример #3
0
    def __init__(self, config, mpasClimatologyTask, controlConfig=None):

        # {{{
        '''
        Construct the analysis task and adds it as a subtask of the
        ``parentTask``.

        Parameters
        ----------
        config :  ``MpasAnalysisConfigParser``
            Configuration options

        mpasClimatologyTask : ``MpasClimatologyTask``
            The task that produced the climatology to be remapped and plotted
            as a transect

        controlConfig :  ``MpasAnalysisConfigParser``, optional
            Configuration options for a control run (if any)
        '''
        # Authors
        # -------
        # Xylar Asay-Davis

        tags = ['climatology', 'transect', 'woce']

        # call the constructor from the base class (AnalysisTask)
        super(WoceTransects, self).__init__(config=config,
                                            taskName='woceTransects',
                                            componentName='ocean',
                                            tags=tags)

        sectionName = self.taskName

        seasons = config.getExpression(sectionName, 'seasons')

        horizontalResolution = config.get(sectionName, 'horizontalResolution')

        verticalComparisonGridName = config.get(sectionName,
                                                'verticalComparisonGridName')

        if verticalComparisonGridName in ['mpas', 'obs']:
            verticalComparisonGrid = None
        else:
            verticalComparisonGrid = config.getExpression(
                sectionName, 'verticalComparisonGrid', usenumpyfunc=True)

        horizontalBounds = config.getExpression(sectionName,
                                                'horizontalBounds')

        observationsDirectory = build_obs_path(config, 'ocean',
                                               'woceSubdirectory')

        obsFileNames = OrderedDict()

        obsFileNames['WOCE_A21'] = \
            'WOCE_A21_Drake_Passage_20181126.nc'
        obsFileNames['WOCE_A23'] = \
            'WOCE_A23_South_Atlantic_20181126.nc'
        obsFileNames['WOCE_A12'] = \
            'WOCE_A12_Prime_Meridian_20181126.nc'

        for transectName in obsFileNames:
            fileName = '{}/{}'.format(observationsDirectory,
                                      obsFileNames[transectName])
            obsFileNames[transectName] = fileName

        fields = \
            {'temperature':
                {'mpas': '******',
                 'obs': 'potentialTemperature',
                 'titleName': 'Potential Temperature',
                 'units': r'$\degree$C'},
             'salinity':
                {'mpas': '******',
                 'obs': 'salinity',
                 'titleName': 'Salinity',
                 'units': r'PSU'},
             'potentialDensity':
                {'mpas': '******',
                 'obs': 'potentialDensity',
                 'titleName': 'Potential Density',
                 'units': r'kg m$^{-3}$'}}

        transectCollectionName = 'WOCE_transects'
        if horizontalResolution != 'obs':
            transectCollectionName = '{}_{}km'.format(transectCollectionName,
                                                      horizontalResolution)

        transectsObservations = TransectsObservations(config, obsFileNames,
                                                      horizontalResolution,
                                                      transectCollectionName)

        computeTransectsSubtask = ComputeTransectsSubtask(
            mpasClimatologyTask=mpasClimatologyTask,
            parentTask=self,
            climatologyName='WOCE',
            transectCollectionName=transectCollectionName,
            variableList=[field['mpas'] for field in fields.values()],
            seasons=seasons,
            obsDatasets=transectsObservations,
            verticalComparisonGridName=verticalComparisonGridName,
            verticalComparisonGrid=verticalComparisonGrid)

        plotObs = controlConfig is None
        if plotObs:

            refTitleLabel = 'Observations (WOCE)'

            diffTitleLabel = 'Model - Observations'

        else:
            controlRunName = controlConfig.get('runs', 'mainRunName')
            refTitleLabel = 'Control: {}'.format(controlRunName)

            diffTitleLabel = 'Main - Control'

        fieldNameDict = {
            'temperature': 'temperatureTransect',
            'salinity': 'salinityTransect',
            'potentialDensity': 'potentialDensityTransect'
        }

        for fieldName in fields:
            for transectName in obsFileNames:
                for season in seasons:
                    outFileLabel = fieldNameDict[fieldName]
                    if plotObs:
                        refFieldName = fields[fieldName]['obs']
                    else:
                        refFieldName = fields[fieldName]['mpas']

                    fieldNameUpper = fieldName[0].upper() + fieldName[1:]
                    titleName = fields[fieldName]['titleName']
                    fieldNameInTytle = '{} from {}'.format(
                        titleName, transectName.replace('_', ' '))

                    # make a new subtask for this season and comparison grid
                    subtask = PlotTransectSubtask(
                        self, season, transectName, fieldName,
                        computeTransectsSubtask, plotObs, controlConfig,
                        horizontalBounds[transectName])

                    subtask.set_plot_info(
                        outFileLabel=outFileLabel,
                        fieldNameInTitle=fieldNameInTytle,
                        mpasFieldName=fields[fieldName]['mpas'],
                        refFieldName=refFieldName,
                        refTitleLabel=refTitleLabel,
                        diffTitleLabel=diffTitleLabel,
                        unitsLabel=fields[fieldName]['units'],
                        imageCaption='{} {}'.format(fieldNameInTytle, season),
                        galleryGroup='WOCE Transects',
                        groupSubtitle=None,
                        groupLink='woce',
                        galleryName=titleName,
                        configSectionName='woce{}Transects'.format(
                            fieldNameUpper))

                    self.add_subtask(subtask)