The Boston Light Swim

Fetch Sea Surface Temperature time-series data


In [1]:
import time
import warnings

# Suppresing warnings for a "pretty output."
# Remove this line to debug any possible issues.
warnings.simplefilter('ignore')

start_time = time.time()

Configuration


In [2]:
%%writefile config.yaml

# Specify a YYYY-MM-DD hh:mm:ss date or integer day offset.
# If both start and stop are offsets they will be computed relative to datetime.today() at midnight.
# Use the dates commented below to reproduce the last Boston Light Swim event forecast.
date:
    start: -5 # 2016-8-16 00:00:00
    stop: +4 # 2016-8-29 00:00:00

run_name: 'latest'

# Boston harbor.
region:
    bbox: [-71.3, 42.03, -70.57, 42.63]
    crs: 'urn:ogc:def:crs:OGC:1.3:CRS84'

sos_name: 'sea_water_temperature'

cf_names:
    - sea_water_temperature
    - sea_surface_temperature
    - sea_water_potential_temperature
    - equivalent_potential_temperature
    - sea_water_conservative_temperature
    - pseudo_equivalent_potential_temperature

units: 'celsius'

catalogs:
    - https://data.ioos.us/csw
    - https://gamone.whoi.edu/csw


Writing config.yaml

In [3]:
import os
from datetime import datetime
from ioos_tools.ioos import parse_config

config = parse_config('config.yaml')

save_dir = os.path.abspath(config['run_name'])


def _reload_log():
    """IPython workaround."""
    import imp
    import logging as log
    imp.reload(log)
    return log


def start_log(save_dir):
    import shutil
    log = _reload_log()
    if os.path.exists(save_dir):
        shutil.rmtree(save_dir)
    os.makedirs(save_dir)

    log.captureWarnings(True)
    LOG_FILENAME = 'log.txt'
    LOG_FILENAME = os.path.join(save_dir, LOG_FILENAME)
    formatter = '%(asctime)s %(levelname)s: %(message)s'
    log.basicConfig(filename=LOG_FILENAME,
                    filemode='w',
                    format=formatter,
                    datefmt='%I:%M:%S',
                    level=log.INFO)
    return log


log = start_log(save_dir)
fmt = '{:*^64}'.format
log.info(fmt('Saving data inside directory {}'.format(save_dir)))
log.info(fmt(' Run information '))
log.info('Run date: {:%Y-%m-%d %H:%M:%S}'.format(datetime.utcnow()))
log.info('Start: {:%Y-%m-%d %H:%M:%S}'.format(config['date']['start']))
log.info('Stop: {:%Y-%m-%d %H:%M:%S}'.format(config['date']['stop']))
log.info('Bounding box: {0:3.2f}, {1:3.2f},'
         '{2:3.2f}, {3:3.2f}'.format(*config['region']['bbox']))

Create the data filter


In [4]:
def make_filter(config):
    from owslib import fes
    from ioos_tools.ioos import fes_date_filter
    kw = dict(wildCard='*', escapeChar='\\',
              singleChar='?', propertyname='apiso:AnyText')

    or_filt = fes.Or([fes.PropertyIsLike(literal=('*%s*' % val), **kw)
                      for val in config['cf_names']])

    # Exclude ROMS Averages and History files.
    not_filt = fes.Not([fes.PropertyIsLike(literal='*Averages*', **kw)])

    begin, end = fes_date_filter(config['date']['start'],
                                 config['date']['stop'])
    bbox_crs = fes.BBox(config['region']['bbox'],
                        crs=config['region']['crs'])
    return [fes.And([bbox_crs, begin, end, or_filt, not_filt])]


filter_list = make_filter(config)

In [5]:
from ioos_tools.ioos import service_urls, get_csw_records
from owslib.csw import CatalogueServiceWeb

# Logging info.
fmt = '{:*^64}'.format
log.info(fmt(' Catalog information '))


dap_urls = []
for endpoint in config['catalogs']:
    log.info(fmt(' CSW '))
    log.info('URL: {}'.format(endpoint))
    try:
        csw = CatalogueServiceWeb(endpoint, timeout=120)
    except Exception as e:
        log.info('{}'.format(e))
        continue
    csw = get_csw_records(csw, filter_list, esn='full')

    OPeNDAP = service_urls(csw.records, identifier='OPeNDAP:OPeNDAP')
    odp = service_urls(csw.records, identifier='urn:x-esri:specification:ServiceType:odp:url')
    dap = OPeNDAP + odp
    dap_urls.extend(dap)

    log.info('CSW version: {}'.format(csw.version))
    log.info('Number of datasets available: {}'.format(len(csw.records.keys())))
    for rec, item in csw.records.items():
        log.info('{}'.format(item.title))
    if dap:
        log.info(fmt(' DAP '))
        for url in dap:
            log.info('{}.html'.format(url))

# Get only unique endpoints.
dap_urls = list(set(dap_urls))

In [6]:
from ioos_tools.ioos import is_station

# Filter out some station endpoints.
non_stations = []
for url in dap_urls:
    try:
        if not is_station(url):
            non_stations.append(url)
    except (RuntimeError, OSError) as e:
        log.warn('Could not access URL {}. {!r}'.format(url, e))

dap_urls = non_stations

log.info(fmt(' Filtered DAP '))
for url in dap_urls:
    log.info('{}.html'.format(url))

NdbcSos


In [7]:
from pyoos.collectors.ndbc.ndbc_sos import NdbcSos

collector_ndbc = NdbcSos()

collector_ndbc.set_bbox(config['region']['bbox'])
collector_ndbc.end_time = config['date']['stop']
collector_ndbc.start_time = config['date']['start']
collector_ndbc.variables = [config['sos_name']]

ofrs = collector_ndbc.server.offerings
title = collector_ndbc.server.identification.title
log.info(fmt(' NDBC Collector offerings '))
log.info('{}: {} offerings'.format(title, len(ofrs)))

In [8]:
import pandas as pd
from ioos_tools.ioos import collector2table

ndbc = collector2table(collector=collector_ndbc,
                       config=config,
                       col='sea_water_temperature (C)')

if ndbc:
    data = dict(
        station_name=[s._metadata.get('station_name') for s in ndbc],
        station_code=[s._metadata.get('station_code') for s in ndbc],
        sensor=[s._metadata.get('sensor') for s in ndbc],
        lon=[s._metadata.get('lon') for s in ndbc],
        lat=[s._metadata.get('lat') for s in ndbc],
        depth=[s._metadata.get('depth') for s in ndbc],
    )

table = pd.DataFrame(data).set_index('station_code')
table


Out[8]:
depth lat lon sensor station_name
station_code
44013 0.6 42.346 -70.651 urn:ioos:sensor:wmo:44013::watertemp1 BOSTON 16 NM East of Boston, MA

CoopsSoS


In [9]:
from pyoos.collectors.coops.coops_sos import CoopsSos

collector_coops = CoopsSos()

collector_coops.set_bbox(config['region']['bbox'])
collector_coops.end_time = config['date']['stop']
collector_coops.start_time = config['date']['start']
collector_coops.variables = [config['sos_name']]

ofrs = collector_coops.server.offerings
title = collector_coops.server.identification.title
log.info(fmt(' Collector offerings '))
log.info('{}: {} offerings'.format(title, len(ofrs)))

In [10]:
coops = collector2table(collector=collector_coops,
                        config=config,
                        col='sea_water_temperature (C)')

if coops:
    data = dict(
        station_name=[s._metadata.get('station_name') for s in coops],
        station_code=[s._metadata.get('station_code') for s in coops],
        sensor=[s._metadata.get('sensor') for s in coops],
        lon=[s._metadata.get('lon') for s in coops],
        lat=[s._metadata.get('lat') for s in coops],
        depth=[s._metadata.get('depth') for s in coops],
    )

table = pd.DataFrame(data).set_index('station_code')
table


Out[10]:
depth lat lon sensor station_name
station_code
44013 0.6 42.346 -70.651 urn:ioos:sensor:wmo:44013::watertemp1 BOSTON 16 NM East of Boston, MA

Join CoopsSoS and NdbcSos in uniform 1-hour time base series for model/data comparison


In [11]:
data = ndbc + coops

index = pd.date_range(start=config['date']['start'].replace(tzinfo=None),
                      end=config['date']['stop'].replace(tzinfo=None),
                      freq='1H')

# Preserve metadata with `reindex`.
observations = []
for series in data:
    _metadata = series._metadata
    obs = series.reindex(index=index, limit=1, method='nearest')
    obs._metadata = _metadata
    observations.append(obs)

Save simpler station code/name file


In [12]:
import iris
from ioos_tools.tardis import series2cube

attr = dict(
    featureType='timeSeries',
    Conventions='CF-1.6',
    standard_name_vocabulary='CF-1.6',
    cdm_data_type='Station',
    comment='Data from http://opendap.co-ops.nos.noaa.gov'
)

log.info(fmt(' Observations '))
outfile = os.path.join(save_dir, 'OBS_DATA.nc')

cubes = iris.cube.CubeList(
    [series2cube(obs, attr=attr) for obs in observations]
)

iris.save(cubes, outfile)

Loop discovered models and save the nearest time-series


In [13]:
from iris.exceptions import (CoordinateNotFoundError, ConstraintMismatchError,
                             MergeError)
from ioos_tools.ioos import get_model_name
from ioos_tools.tardis import quick_load_cubes, proc_cube, is_model, get_surface

log.info(fmt(' Models '))
cubes = dict()
for k, url in enumerate(dap_urls):
    log.info('\n[Reading url {}/{}]: {}'.format(k+1, len(dap_urls), url))
    try:
        cube = quick_load_cubes(url, config['cf_names'],
                                callback=None, strict=True)
        if is_model(cube):
            cube = proc_cube(cube,
                             bbox=config['region']['bbox'],
                             time=(config['date']['start'],
                                   config['date']['stop']),
                             units=config['units'])
        else:
            log.warning('[Not model data]: {}'.format(url))
            continue
        cube = get_surface(cube)
        mod_name = get_model_name(url)
        cubes.update({mod_name: cube})
    except (RuntimeError, ValueError,
            ConstraintMismatchError, CoordinateNotFoundError,
            IndexError) as e:
        log.warning('Cannot get cube for: {}\n{}'.format(url, e))

In [14]:
import iris
from iris.pandas import as_series
from ioos_tools.tardis import (
    make_tree, get_nearest_water, add_station,
    ensure_timeseries, remove_ssh
)

for mod_name, cube in cubes.items():
    fname = '{}.nc'.format(mod_name)
    fname = os.path.join(save_dir, fname)
    log.info(fmt(' Downloading to file {} '.format(fname)))
    try:
        tree, lon, lat = make_tree(cube)
    except CoordinateNotFoundError as e:
        log.warning('Cannot make KDTree for: {}'.format(mod_name))
        continue
    # Get model series at observed locations.
    raw_series = dict()
    for obs in observations:
        obs = obs._metadata
        station = obs['station_code']
        try:
            kw = dict(k=10, max_dist=0.08, min_var=0.01)
            args = cube, tree, obs['lon'], obs['lat']
            try:
                series, dist, idx = get_nearest_water(*args, **kw)
            except RuntimeError as e:
                log.info('Cannot download {!r}.\n{}'.format(cube, e))
                series = None
        except ValueError as e:
            status = 'No Data'
            log.info('[{}] {}'.format(status, obs['station_name']))
            continue
        if not series:
            status = 'Land   '
        else:
            raw_series.update({station: series})
            series = as_series(series)
            status = 'Water  '
        log.info('[{}] {}'.format(status, obs['station_name']))
    if raw_series:  # Save cube.
        for station, cube in raw_series.items():
            cube = add_station(cube, station)
            cube = remove_ssh(cube)
        try:
            cube = iris.cube.CubeList(raw_series.values()).merge_cube()
        except MergeError as e:
            log.warning(e)
        ensure_timeseries(cube)
        try:
            iris.save(cube, fname)
        except AttributeError:
            # FIXME: we should patch the bad attribute instead of removing everything.
            cube.attributes = {}
            iris.save(cube, fname)
        del cube

    log.info('Finished processing [{}]'.format(mod_name))

In [15]:
elapsed = time.time() - start_time
log.info('{:.2f} minutes'.format(elapsed/60.))
log.info('EOF')

logfile = os.path.join(config['run_name'], 'log.txt')

with open(logfile) as f:
    print(f.read())


01:38:35 INFO: Saving data inside directory /home/filipe/IOOS/notebooks_demos/notebooks/staged_noteooks/boston_light_swim/latest
01:38:35 INFO: *********************** Run information ************************
01:38:35 INFO: Run date: 2017-08-21 16:38:35
01:38:35 INFO: Start: 2017-08-16 00:00:00
01:38:35 INFO: Stop: 2017-08-25 00:00:00
01:38:35 INFO: Bounding box: -71.30, 42.03,-70.57, 42.63
01:38:35 INFO: ********************* Catalog information **********************
01:38:35 INFO: ***************************** CSW ******************************
01:38:35 INFO: URL: https://data.ioos.us/csw
01:38:38 INFO: No link type detected
01:38:38 INFO: No link type detected
01:38:38 INFO: No link type detected
01:38:38 INFO: No link type detected
01:38:38 INFO: No link type detected
01:38:38 INFO: No link type detected
01:38:38 INFO: No link type detected
01:38:38 INFO: No link type detected
01:38:38 INFO: No link type detected
01:38:38 INFO: No link type detected
01:38:38 INFO: No link type detected
01:38:38 INFO: No link type detected
01:38:38 INFO: No link type detected
01:38:38 INFO: No link type detected
01:38:38 INFO: No link type detected
01:38:38 INFO: No link type detected
01:38:38 INFO: No link type detected
01:38:38 INFO: No link type detected
01:38:38 INFO: No link type detected
01:38:38 INFO: No link type detected
01:38:38 INFO: No link type detected
01:38:38 INFO: No link type detected
01:38:38 INFO: No link type detected
01:38:38 INFO: No link type detected
01:38:38 INFO: No link type detected
01:38:38 INFO: No link type detected
01:38:38 INFO: No link type detected
01:38:38 INFO: No link type detected
01:38:38 INFO: No link type detected
01:38:38 INFO: No link type detected
01:38:38 INFO: No link type detected
01:38:38 INFO: No link type detected
01:38:38 INFO: No link type detected
01:38:38 INFO: No link type detected
01:38:38 INFO: No link type detected
01:38:38 INFO: No link type detected
01:38:38 INFO: No link type detected
01:38:38 INFO: No link type detected
01:38:38 INFO: No link type detected
01:38:38 INFO: No link type detected
01:38:38 INFO: No link type detected
01:38:38 INFO: No link type detected
01:38:38 INFO: No link type detected
01:38:38 INFO: No link type detected
01:38:38 INFO: No link type detected
01:38:38 INFO: No link type detected
01:38:38 INFO: No link type detected
01:38:38 INFO: No link type detected
01:38:38 INFO: No link type detected
01:38:38 INFO: No link type detected
01:38:38 INFO: No link type detected
01:38:38 INFO: No link type detected
01:38:38 INFO: No link type detected
01:38:38 INFO: No link type detected
01:38:38 INFO: No link type detected
01:38:38 INFO: No link type detected
01:38:38 INFO: No link type detected
01:38:38 INFO: No link type detected
01:38:38 INFO: No link type detected
01:38:38 INFO: No link type detected
01:38:38 INFO: No link type detected
01:38:38 INFO: No link type detected
01:38:38 INFO: No link type detected
01:38:38 INFO: No link type detected
01:38:38 INFO: No link type detected
01:38:38 INFO: No link type detected
01:38:38 INFO: No link type detected
01:38:38 INFO: No link type detected
01:38:38 INFO: No link type detected
01:38:38 INFO: No link type detected
01:38:38 INFO: No link type detected
01:38:38 INFO: No link type detected
01:38:38 INFO: No link type detected
01:38:38 INFO: No link type detected
01:38:38 INFO: No link type detected
01:38:38 INFO: No link type detected
01:38:38 INFO: No link type detected
01:38:38 INFO: No link type detected
01:38:38 INFO: No link type detected
01:38:38 INFO: No link type detected
01:38:38 INFO: No link type detected
01:38:38 INFO: No link type detected
01:38:38 INFO: No link type detected
01:38:38 INFO: No link type detected
01:38:38 INFO: No link type detected
01:38:38 INFO: No link type detected
01:38:38 INFO: No link type detected
01:38:38 INFO: No link type detected
01:38:38 INFO: No link type detected
01:38:38 INFO: No link type detected
01:38:38 INFO: No link type detected
01:38:38 INFO: No link type detected
01:38:38 INFO: No link type detected
01:38:38 INFO: No link type detected
01:38:38 INFO: No link type detected
01:38:38 INFO: No link type detected
01:38:38 INFO: No link type detected
01:38:38 INFO: No link type detected
01:38:38 INFO: No link type detected
01:38:38 INFO: No link type detected
01:38:38 INFO: No link type detected
01:38:38 INFO: No link type detected
01:38:38 INFO: No link type detected
01:38:38 INFO: No link type detected
01:38:38 INFO: No link type detected
01:38:38 INFO: No link type detected
01:38:39 INFO: No link type detected
01:38:39 INFO: No link type detected
01:38:39 INFO: No link type detected
01:38:39 INFO: No link type detected
01:38:39 INFO: No link type detected
01:38:39 INFO: No link type detected
01:38:39 INFO: No link type detected
01:38:39 INFO: No link type detected
01:38:39 INFO: No link type detected
01:38:39 INFO: No link type detected
01:38:39 INFO: No link type detected
01:38:39 INFO: No link type detected
01:38:39 INFO: No link type detected
01:38:39 INFO: No link type detected
01:38:39 INFO: CSW version: 2.0.2
01:38:39 INFO: Number of datasets available: 21
01:38:39 INFO: urn:ioos:station:NOAA.NOS.CO-OPS:8443970 station, Boston, MA
01:38:39 INFO: A01 Accelerometer - Waves
01:38:39 INFO: A01 Directional Waves (waves.mstrain Experimental)
01:38:39 INFO: A01 Met - Meteorology
01:38:39 INFO: A01 Optode - Oxygen
01:38:39 INFO: A01 Sbe37 - CTD
01:38:39 INFO: Coupled Northwest Atlantic Prediction System (CNAPS)
01:38:39 INFO: FNMOC COAMPS Western Atlantic/Best FNMOC COAMPS Western Atlantic Time Series
01:38:39 INFO: GFS CONUS 80km/Best GFS CONUS 80km Time Series
01:38:39 INFO: HYbrid Coordinate Ocean Model (HYCOM): Global
01:38:39 INFO: NAM Alaska 11km/Best NAM Alaska 11km Time Series
01:38:39 INFO: NAM Alaska 45km from NOAAPORT/Best NAM Alaska 45km from NOAAPORT Time Series
01:38:39 INFO: NAM CONUS 12km from NOAAPORT/Best NAM CONUS 12km from NOAAPORT Time Series
01:38:39 INFO: NAM CONUS 80km/Best NAM CONUS 80km Time Series
01:38:39 INFO: NERACOOS Gulf of Maine Ocean Array: Realtime Buoy Observations: A01 Massachusetts Bay: A01 ACCELEROMETER Massachusetts Bay
01:38:39 INFO: NOAA Coral Reef Watch Operational Daily Near-Real-Time Global 5-km Satellite Coral Bleaching Monitoring Products
01:38:39 INFO: Rapid Refresh CONUS 13km/Best Rapid Refresh CONUS 13km Time Series
01:38:39 INFO: Rapid Refresh CONUS 20km/Best Rapid Refresh CONUS 20km Time Series
01:38:39 INFO: Rapid Refresh CONUS 40km/Best Rapid Refresh CONUS 40km Time Series
01:38:39 INFO: SREF Alaska 45km Ensemble Derived Products/Best SREF Alaska 45km Ensemble Derived Products Time Series
01:38:39 INFO: SREF CONUS 40km Ensemble Derived Products/Best SREF CONUS 40km Ensemble Derived Products Time Series
01:38:39 INFO: ***************************** DAP ******************************
01:38:39 INFO: http://oos.soest.hawaii.edu/thredds/dodsC/hioos/satellite/dhw_5km.html
01:38:39 INFO: http://oos.soest.hawaii.edu/thredds/dodsC/pacioos/hycom/global.html
01:38:39 INFO: http://thredds.secoora.org/thredds/dodsC/SECOORA_NCSU_CNAPS.nc.html
01:38:39 INFO: http://thredds.ucar.edu/thredds/dodsC/grib/FNMOC/COAMPS/Western_Atlantic/Best.html
01:38:39 INFO: http://thredds.ucar.edu/thredds/dodsC/grib/NCEP/GFS/CONUS_80km/Best.html
01:38:39 INFO: http://thredds.ucar.edu/thredds/dodsC/grib/NCEP/NAM/Alaska_11km/Best.html
01:38:39 INFO: http://thredds.ucar.edu/thredds/dodsC/grib/NCEP/NAM/Alaska_45km/noaaport/Best.html
01:38:39 INFO: http://thredds.ucar.edu/thredds/dodsC/grib/NCEP/NAM/CONUS_12km/Best.html
01:38:39 INFO: http://thredds.ucar.edu/thredds/dodsC/grib/NCEP/NAM/CONUS_80km/Best.html
01:38:39 INFO: http://thredds.ucar.edu/thredds/dodsC/grib/NCEP/RAP/CONUS_13km/Best.html
01:38:39 INFO: http://thredds.ucar.edu/thredds/dodsC/grib/NCEP/RAP/CONUS_20km/Best.html
01:38:39 INFO: http://thredds.ucar.edu/thredds/dodsC/grib/NCEP/RAP/CONUS_40km/Best.html
01:38:39 INFO: http://thredds.ucar.edu/thredds/dodsC/grib/NCEP/SREF/Alaska_45km/ensprod/Best.html
01:38:39 INFO: http://thredds.ucar.edu/thredds/dodsC/grib/NCEP/SREF/CONUS_40km/ensprod/Best.html
01:38:39 INFO: http://www.neracoos.org/thredds/dodsC/UMO/DSG/SOS/A01/Accelerometer/HistoricRealtime/Agg.ncml.html
01:38:39 INFO: ***************************** CSW ******************************
01:38:39 INFO: URL: https://gamone.whoi.edu/csw
01:38:40 INFO: No link type detected
01:38:40 INFO: No link type detected
01:38:40 INFO: No link type detected
01:38:40 INFO: No link type detected
01:38:40 INFO: No link type detected
01:38:40 INFO: No link type detected
01:38:40 INFO: No link type detected
01:38:40 INFO: No link type detected
01:38:40 INFO: CSW version: 2.0.2
01:38:40 INFO: Number of datasets available: 2
01:38:40 INFO: COAWST Forecast System : USGS : US East Coast and Gulf of Mexico (Experimental)
01:38:40 INFO: COAWST Modeling System: USEast: ROMS-WRF-SWAN coupled model (aka CNAPS)
01:38:40 INFO: ***************************** DAP ******************************
01:38:40 INFO: http://geoport-dev.whoi.edu/thredds/dodsC/coawst_4/use/fmrc/coawst_4_use_best.ncd.html
01:39:18 INFO: ************************* Filtered DAP *************************
01:39:18 INFO: http://thredds.ucar.edu/thredds/dodsC/grib/NCEP/SREF/Alaska_45km/ensprod/Best.html
01:39:18 INFO: http://oos.soest.hawaii.edu/thredds/dodsC/hioos/satellite/dhw_5km.html
01:39:18 INFO: http://thredds.ucar.edu/thredds/dodsC/grib/NCEP/RAP/CONUS_20km/Best.html
01:39:18 INFO: http://thredds.ucar.edu/thredds/dodsC/grib/NCEP/NAM/Alaska_11km/Best.html
01:39:18 INFO: http://thredds.ucar.edu/thredds/dodsC/grib/NCEP/SREF/CONUS_40km/ensprod/Best.html
01:39:18 INFO: http://thredds.ucar.edu/thredds/dodsC/grib/NCEP/RAP/CONUS_40km/Best.html
01:39:18 INFO: http://thredds.ucar.edu/thredds/dodsC/grib/NCEP/NAM/CONUS_12km/Best.html
01:39:18 INFO: http://geoport-dev.whoi.edu/thredds/dodsC/coawst_4/use/fmrc/coawst_4_use_best.ncd.html
01:39:18 INFO: http://thredds.ucar.edu/thredds/dodsC/grib/NCEP/GFS/CONUS_80km/Best.html
01:39:18 INFO: http://thredds.ucar.edu/thredds/dodsC/grib/NCEP/NAM/Alaska_45km/noaaport/Best.html
01:39:18 INFO: http://thredds.ucar.edu/thredds/dodsC/grib/NCEP/RAP/CONUS_13km/Best.html
01:39:18 INFO: http://thredds.ucar.edu/thredds/dodsC/grib/NCEP/NAM/CONUS_80km/Best.html
01:39:18 INFO: http://oos.soest.hawaii.edu/thredds/dodsC/pacioos/hycom/global.html
01:39:18 INFO: http://thredds.secoora.org/thredds/dodsC/SECOORA_NCSU_CNAPS.nc.html
01:39:18 INFO: http://thredds.ucar.edu/thredds/dodsC/grib/FNMOC/COAMPS/Western_Atlantic/Best.html
01:39:20 INFO: ******************* NDBC Collector offerings *******************
01:39:20 INFO: National Data Buoy Center SOS: 992 offerings
01:39:34 INFO: ********************* Collector offerings **********************
01:39:34 INFO: NOAA.NOS.CO-OPS SOS: 1188 offerings
01:39:36 INFO: ************************* Observations *************************
01:39:36 INFO: **************************** Models ****************************
01:39:36 INFO: 
[Reading url 1/15]: http://thredds.ucar.edu/thredds/dodsC/grib/NCEP/SREF/Alaska_45km/ensprod/Best
01:39:39 WARNING: Cannot get cube for: http://thredds.ucar.edu/thredds/dodsC/grib/NCEP/SREF/Alaska_45km/ensprod/Best
Cannot find ['sea_water_temperature', 'sea_surface_temperature', 'sea_water_potential_temperature', 'equivalent_potential_temperature', 'sea_water_conservative_temperature', 'pseudo_equivalent_potential_temperature'] in http://thredds.ucar.edu/thredds/dodsC/grib/NCEP/SREF/Alaska_45km/ensprod/Best.
01:39:39 INFO: 
[Reading url 2/15]: http://oos.soest.hawaii.edu/thredds/dodsC/hioos/satellite/dhw_5km
01:39:42 INFO: 
[Reading url 3/15]: http://thredds.ucar.edu/thredds/dodsC/grib/NCEP/RAP/CONUS_20km/Best
01:39:46 WARNING: Cannot get cube for: http://thredds.ucar.edu/thredds/dodsC/grib/NCEP/RAP/CONUS_20km/Best
Cannot find ['sea_water_temperature', 'sea_surface_temperature', 'sea_water_potential_temperature', 'equivalent_potential_temperature', 'sea_water_conservative_temperature', 'pseudo_equivalent_potential_temperature'] in http://thredds.ucar.edu/thredds/dodsC/grib/NCEP/RAP/CONUS_20km/Best.
01:39:46 INFO: 
[Reading url 4/15]: http://thredds.ucar.edu/thredds/dodsC/grib/NCEP/NAM/Alaska_11km/Best
01:39:48 WARNING: Cannot get cube for: http://thredds.ucar.edu/thredds/dodsC/grib/NCEP/NAM/Alaska_11km/Best
Cannot find ['sea_water_temperature', 'sea_surface_temperature', 'sea_water_potential_temperature', 'equivalent_potential_temperature', 'sea_water_conservative_temperature', 'pseudo_equivalent_potential_temperature'] in http://thredds.ucar.edu/thredds/dodsC/grib/NCEP/NAM/Alaska_11km/Best.
01:39:48 INFO: 
[Reading url 5/15]: http://thredds.ucar.edu/thredds/dodsC/grib/NCEP/SREF/CONUS_40km/ensprod/Best
01:39:51 WARNING: Cannot get cube for: http://thredds.ucar.edu/thredds/dodsC/grib/NCEP/SREF/CONUS_40km/ensprod/Best
Cannot find ['sea_water_temperature', 'sea_surface_temperature', 'sea_water_potential_temperature', 'equivalent_potential_temperature', 'sea_water_conservative_temperature', 'pseudo_equivalent_potential_temperature'] in http://thredds.ucar.edu/thredds/dodsC/grib/NCEP/SREF/CONUS_40km/ensprod/Best.
01:39:51 INFO: 
[Reading url 6/15]: http://thredds.ucar.edu/thredds/dodsC/grib/NCEP/RAP/CONUS_40km/Best
01:39:56 WARNING: Cannot get cube for: http://thredds.ucar.edu/thredds/dodsC/grib/NCEP/RAP/CONUS_40km/Best
Cannot find ['sea_water_temperature', 'sea_surface_temperature', 'sea_water_potential_temperature', 'equivalent_potential_temperature', 'sea_water_conservative_temperature', 'pseudo_equivalent_potential_temperature'] in http://thredds.ucar.edu/thredds/dodsC/grib/NCEP/RAP/CONUS_40km/Best.
01:39:56 INFO: 
[Reading url 7/15]: http://thredds.ucar.edu/thredds/dodsC/grib/NCEP/NAM/CONUS_12km/Best
01:39:59 WARNING: Cannot get cube for: http://thredds.ucar.edu/thredds/dodsC/grib/NCEP/NAM/CONUS_12km/Best
Cannot find ['sea_water_temperature', 'sea_surface_temperature', 'sea_water_potential_temperature', 'equivalent_potential_temperature', 'sea_water_conservative_temperature', 'pseudo_equivalent_potential_temperature'] in http://thredds.ucar.edu/thredds/dodsC/grib/NCEP/NAM/CONUS_12km/Best.
01:39:59 INFO: 
[Reading url 8/15]: http://geoport-dev.whoi.edu/thredds/dodsC/coawst_4/use/fmrc/coawst_4_use_best.ncd
01:40:54 INFO: 
[Reading url 9/15]: http://thredds.ucar.edu/thredds/dodsC/grib/NCEP/GFS/CONUS_80km/Best
01:40:57 WARNING: Cannot get cube for: http://thredds.ucar.edu/thredds/dodsC/grib/NCEP/GFS/CONUS_80km/Best
Cannot find ['sea_water_temperature', 'sea_surface_temperature', 'sea_water_potential_temperature', 'equivalent_potential_temperature', 'sea_water_conservative_temperature', 'pseudo_equivalent_potential_temperature'] in http://thredds.ucar.edu/thredds/dodsC/grib/NCEP/GFS/CONUS_80km/Best.
01:40:57 INFO: 
[Reading url 10/15]: http://thredds.ucar.edu/thredds/dodsC/grib/NCEP/NAM/Alaska_45km/noaaport/Best
01:40:59 WARNING: Cannot get cube for: http://thredds.ucar.edu/thredds/dodsC/grib/NCEP/NAM/Alaska_45km/noaaport/Best
Cannot find ['sea_water_temperature', 'sea_surface_temperature', 'sea_water_potential_temperature', 'equivalent_potential_temperature', 'sea_water_conservative_temperature', 'pseudo_equivalent_potential_temperature'] in http://thredds.ucar.edu/thredds/dodsC/grib/NCEP/NAM/Alaska_45km/noaaport/Best.
01:40:59 INFO: 
[Reading url 11/15]: http://thredds.ucar.edu/thredds/dodsC/grib/NCEP/RAP/CONUS_13km/Best
01:41:02 WARNING: Cannot get cube for: http://thredds.ucar.edu/thredds/dodsC/grib/NCEP/RAP/CONUS_13km/Best
Cannot find ['sea_water_temperature', 'sea_surface_temperature', 'sea_water_potential_temperature', 'equivalent_potential_temperature', 'sea_water_conservative_temperature', 'pseudo_equivalent_potential_temperature'] in http://thredds.ucar.edu/thredds/dodsC/grib/NCEP/RAP/CONUS_13km/Best.
01:41:02 INFO: 
[Reading url 12/15]: http://thredds.ucar.edu/thredds/dodsC/grib/NCEP/NAM/CONUS_80km/Best
01:41:04 WARNING: Cannot get cube for: http://thredds.ucar.edu/thredds/dodsC/grib/NCEP/NAM/CONUS_80km/Best
Cannot find ['sea_water_temperature', 'sea_surface_temperature', 'sea_water_potential_temperature', 'equivalent_potential_temperature', 'sea_water_conservative_temperature', 'pseudo_equivalent_potential_temperature'] in http://thredds.ucar.edu/thredds/dodsC/grib/NCEP/NAM/CONUS_80km/Best.
01:41:04 INFO: 
[Reading url 13/15]: http://oos.soest.hawaii.edu/thredds/dodsC/pacioos/hycom/global
01:41:09 INFO: 
[Reading url 14/15]: http://thredds.secoora.org/thredds/dodsC/SECOORA_NCSU_CNAPS.nc
01:41:37 INFO: 
[Reading url 15/15]: http://thredds.ucar.edu/thredds/dodsC/grib/FNMOC/COAMPS/Western_Atlantic/Best
01:41:39 WARNING: Cannot get cube for: http://thredds.ucar.edu/thredds/dodsC/grib/FNMOC/COAMPS/Western_Atlantic/Best
Cannot find ['sea_water_temperature', 'sea_surface_temperature', 'sea_water_potential_temperature', 'equivalent_potential_temperature', 'sea_water_conservative_temperature', 'pseudo_equivalent_potential_temperature'] in http://thredds.ucar.edu/thredds/dodsC/grib/FNMOC/COAMPS/Western_Atlantic/Best.
01:41:39 INFO:  Downloading to file /home/filipe/IOOS/notebooks_demos/notebooks/staged_noteooks/boston_light_swim/latest/hioos_satellite-dhw_5km.nc 
01:41:43 INFO: [Water  ] BOSTON 16 NM East of Boston, MA
01:41:43 INFO: Finished processing [hioos_satellite-dhw_5km]
01:41:43 INFO:  Downloading to file /home/filipe/IOOS/notebooks_demos/notebooks/staged_noteooks/boston_light_swim/latest/fmrc-coawst_4_use_best.nc 
01:41:54 INFO: [Water  ] BOSTON 16 NM East of Boston, MA
01:41:59 INFO: Finished processing [fmrc-coawst_4_use_best]
01:41:59 INFO:  Downloading to file /home/filipe/IOOS/notebooks_demos/notebooks/staged_noteooks/boston_light_swim/latest/pacioos_hycom-global.nc 
01:42:03 INFO: [Water  ] BOSTON 16 NM East of Boston, MA
01:42:03 INFO: Finished processing [pacioos_hycom-global]
01:42:03 INFO:  Downloading to file /home/filipe/IOOS/notebooks_demos/notebooks/staged_noteooks/boston_light_swim/latest/SECOORA_NCSU_CNAPS.nc 
01:42:24 INFO: [Water  ] BOSTON 16 NM East of Boston, MA
01:42:24 INFO: Finished processing [SECOORA_NCSU_CNAPS]
01:42:24 INFO: 3.85 minutes
01:42:24 INFO: EOF