import intake
import hvplot.pandas
import hvplot.xarray
import cook_inlet_catalogs as cic
import holoviews as hv

CTD Transects (GWA): Six repeat transects in Cook Inlet

The Kachemak Bay Research Reserve (KBRR) and NOAA Kasitsna Bay Laboratory jointly work to complete oceanographic monitoring in Kachemak Bay and lower Cook Inlet, in order to provide the physical data needed for comprehensive restoration monitoring in the Exxon Valdez oil spill (EVOS) affected area. This project utilized small boat oceanographic and plankton surveys at existing KBRR water quality monitoring stations to assess spatial, seasonal and inter-annual variability in water mass movement. In addition, this work leveraged information from previous oceanographic surveys in the region, provided environmental information that aided a concurrent Gulf Watch benthic monitoring project, and benefited from a new NOAA ocean circulation model for Cook Inlet.

Surveys are conducted annually along five primary transects; two in Kachemak Bay and three in lower Cook Inlet, Alaska. Oceanographic data were collected via vertical CTD casts from surface to bottom, zooplankton and phytoplankton tows were made in the upper water column, and seabird and marine mammal observations were performed opportunistically. We also collect meteorological data and water quality measurements in Homer Harbor and Anchor Point year-round at stations as part of our National Estuarine Research Reserve (NERR) System-wide Monitoring program in Seldovia and Homer harbors, and in ice-free months at a mooring near the head of Kachemak Bay.

Project files and further description can be found here: https://gulf-of-alaska.portal.aoos.org/#metadata/4e28304c-22a1-4976-8881-7289776e4173/project

cat = intake.open_catalog(cic.utils.cat_path("ctd_transects_gwa"))

Plot all datasets in catalog

dd, ddlabels = cic.utils.combine_datasets_for_map(cat)
dd.hvplot(**cat.metadata["map"]) * ddlabels.hvplot(**cat.metadata["maplabels"])

List available datasets in the catalog

dataset_ids = list(cat)
dataset_ids
['transect_3-2012-05-02',
 'transect_3-2012-07-29',
 'transect_3-2012-10-29',
 'transect_3-2013-04-20',
 'transect_3-2013-07-19',
 'transect_3-2013-11-08',
 'transect_3-2014-04-11',
 'transect_3-2014-07-22',
 'transect_3-2014-10-13',
 'transect_3-2015-02-22',
 'transect_3-2015-04-12',
 'transect_3-2015-11-04',
 'transect_3-2016-02-14',
 'transect_3-2016-04-11',
 'transect_3-2016-08-29',
 'transect_3-2017-04-19',
 'transect_3-2017-07-25',
 'transect_3-2018-06-25',
 'transect_3-2018-07-26',
 'transect_3-2018-09-13',
 'transect_3-2019-02-08',
 'transect_3-2019-05-14',
 'transect_3-2019-07-25',
 'transect_3-2019-09-16',
 'transect_3-2020-07-29',
 'transect_3-2021-04-16',
 'transect_3-2021-07-16',
 'transect_4-2012-05-02',
 'transect_4-2012-05-31',
 'transect_4-2012-06-05_A',
 'transect_4-2012-06-05_B',
 'transect_4-2012-07-31',
 'transect_4-2012-08-15',
 'transect_4-2012-10-29',
 'transect_4-2013-02-12',
 'transect_4-2013-04-21',
 'transect_4-2013-06-06',
 'transect_4-2013-07-19',
 'transect_4-2013-10-29',
 'transect_4-2014-02-15',
 'transect_4-2014-04-11',
 'transect_4-2014-07-21',
 'transect_4-2014-08-13',
 'transect_4-2014-10-13',
 'transect_4-2015-02-12',
 'transect_4-2015-02-24',
 'transect_4-2015-04-08',
 'transect_4-2015-08-14',
 'transect_4-2015-09-24',
 'transect_4-2015-10-19',
 'transect_4-2015-11-03',
 'transect_4-2015-11-04',
 'transect_4-2015-12-10',
 'transect_4-2016-02-09',
 'transect_4-2016-04-11',
 'transect_4-2016-07-27',
 'transect_4-2016-10-13',
 'transect_4-2016-12-13',
 'transect_4-2017-04-20',
 'transect_4-2017-07-25',
 'transect_4-2017-10-17',
 'transect_4-2018-04-23',
 'transect_4-2018-06-25',
 'transect_4-2018-07-24',
 'transect_4-2018-09-13',
 'transect_4-2019-02-07',
 'transect_4-2019-05-14',
 'transect_4-2019-07-25',
 'transect_4-2019-09-16',
 'transect_4-2020-02-14',
 'transect_4-2020-07-23',
 'transect_4-2020-09-21',
 'transect_4-2021-02-17',
 'transect_4-2021-04-16',
 'transect_4-2021-07-16',
 'transect_4-2021-09-17',
 'transect_4-2022-03-01',
 'transect_4-2022-04-13',
 'transect_4-2022-07-23',
 'transect_6-2012-05-03',
 'transect_6-2012-07-30',
 'transect_6-2012-10-28',
 'transect_6-2013-04-19',
 'transect_6-2013-07-21',
 'transect_6-2013-11-06',
 'transect_6-2014-04-06',
 'transect_6-2014-07-23',
 'transect_6-2014-10-18',
 'transect_6-2015-02-23',
 'transect_6-2015-04-08',
 'transect_6-2015-08-14',
 'transect_6-2016-02-15',
 'transect_6-2016-04-10',
 'transect_6-2016-08-31',
 'transect_6-2016-12-12',
 'transect_6-2017-04-18',
 'transect_6-2017-07-26',
 'transect_6-2017-11-02',
 'transect_6-2018-07-18',
 'transect_6-2018-09-17',
 'transect_6-2019-02-08',
 'transect_6-2019-05-12',
 'transect_6-2019-07-25',
 'transect_6-2020-07-24',
 'transect_6-2020-09-20',
 'transect_6-2021-02-16',
 'transect_6-2021-04-14',
 'transect_6-2021-07-21',
 'transect_6-2021-10-05',
 'transect_6-2022-02-28',
 'transect_6-2022-04-12',
 'transect_6-2022-07-21',
 'transect_7-2012-07-30',
 'transect_7-2012-10-28',
 'transect_7-2013-04-20',
 'transect_7-2013-07-18',
 'transect_7-2014-02-17',
 'transect_7-2014-04-07',
 'transect_7-2014-07-24',
 'transect_7-2014-10-17',
 'transect_7-2014-10-18',
 'transect_7-2015-02-24',
 'transect_7-2015-04-13',
 'transect_7-2015-08-14',
 'transect_7-2016-02-16',
 'transect_7-2016-08-30',
 'transect_7-2016-12-13',
 'transect_7-2017-04-19',
 'transect_7-2017-07-26',
 'transect_7-2017-11-02',
 'transect_7-2018-03-27',
 'transect_7-2018-07-18',
 'transect_7-2018-09-17',
 'transect_7-2019-02-08',
 'transect_7-2019-05-12',
 'transect_7-2019-07-25',
 'transect_7-2019-09-19',
 'transect_7-2020-07-24',
 'transect_7-2020-09-20',
 'transect_7-2021-02-16',
 'transect_7-2021-04-14',
 'transect_7-2021-07-21',
 'transect_7-2021-10-05',
 'transect_7-2022-02-28',
 'transect_7-2022-04-12',
 'transect_7-2022-07-21',
 'transect_9-2012-02-14',
 'transect_9-2012-03-14',
 'transect_9-2012-04-10',
 'transect_9-2012-04-26',
 'transect_9-2012-05-31_A',
 'transect_9-2012-05-31_B',
 'transect_9-2012-06-05_A',
 'transect_9-2012-06-05_B',
 'transect_9-2012-06-27',
 'transect_9-2012-07-02',
 'transect_9-2012-07-21',
 'transect_9-2012-08-03',
 'transect_9-2012-08-15',
 'transect_9-2012-08-26',
 'transect_9-2012-08-31',
 'transect_9-2012-09-21_A',
 'transect_9-2012-09-21_B',
 'transect_9-2012-09-21_C',
 'transect_9-2012-09-21_D',
 'transect_9-2012-09-21_E',
 'transect_9-2012-10-12',
 'transect_9-2012-10-29',
 'transect_9-2013-01-04',
 'transect_9-2013-02-12',
 'transect_9-2013-03-15',
 'transect_9-2013-04-21',
 'transect_9-2013-05-21',
 'transect_9-2013-06-06',
 'transect_9-2013-06-19',
 'transect_9-2013-06-28',
 'transect_9-2013-07-05',
 'transect_9-2013-07-09',
 'transect_9-2013-07-22',
 'transect_9-2013-08-07',
 'transect_9-2013-08-30',
 'transect_9-2013-09-25',
 'transect_9-2013-10-29',
 'transect_9-2013-12-03',
 'transect_9-2014-01-09',
 'transect_9-2014-02-15',
 'transect_9-2014-03-28',
 'transect_9-2014-04-11',
 'transect_9-2014-05-28',
 'transect_9-2014-06-18',
 'transect_9-2014-07-21',
 'transect_9-2014-08-13',
 'transect_9-2014-10-19',
 'transect_9-2014-11-25',
 'transect_9-2014-12-17',
 'transect_9-2015-01-16',
 'transect_9-2015-02-12',
 'transect_9-2015-02-24',
 'transect_9-2015-03-31',
 'transect_9-2015-04-08',
 'transect_9-2015-05-28',
 'transect_9-2015-06-26',
 'transect_9-2015-07-10',
 'transect_9-2015-07-29',
 'transect_9-2015-08-14',
 'transect_9-2015-09-04',
 'transect_9-2015-09-24',
 'transect_9-2015-10-19',
 'transect_9-2015-11-04',
 'transect_9-2015-12-10',
 'transect_9-2016-01-07',
 'transect_9-2016-02-09',
 'transect_9-2016-04-07',
 'transect_9-2016-05-12',
 'transect_9-2016-06-16',
 'transect_9-2016-07-27',
 'transect_9-2016-09-23',
 'transect_9-2016-10-13',
 'transect_9-2016-11-10',
 'transect_9-2016-12-13',
 'transect_9-2017-01-11',
 'transect_9-2017-02-07',
 'transect_9-2017-03-28',
 'transect_9-2017-04-20',
 'transect_9-2017-05-30',
 'transect_9-2017-06-28',
 'transect_9-2017-07-24',
 'transect_9-2017-08-24',
 'transect_9-2017-09-22',
 'transect_9-2017-10-17',
 'transect_9-2017-11-07',
 'transect_9-2017-12-14',
 'transect_9-2018-01-17',
 'transect_9-2018-03-02',
 'transect_9-2018-03-27',
 'transect_9-2018-04-23',
 'transect_9-2018-05-24',
 'transect_9-2018-06-22',
 'transect_9-2018-07-24',
 'transect_9-2018-08-23',
 'transect_9-2018-09-13',
 'transect_9-2018-10-17',
 'transect_9-2018-11-08',
 'transect_9-2018-12-06',
 'transect_9-2019-02-07',
 'transect_9-2019-03-19',
 'transect_9-2019-04-24',
 'transect_9-2019-05-14',
 'transect_9-2019-06-19',
 'transect_9-2019-07-23',
 'transect_9-2019-09-16',
 'transect_9-2019-10-30',
 'transect_9-2019-11-15',
 'transect_9-2019-12-12',
 'transect_9-2020-02-06',
 'transect_9-2020-03-18',
 'transect_9-2020-06-04',
 'transect_9-2020-07-24',
 'transect_9-2020-08-14',
 'transect_9-2020-09-21',
 'transect_9-2020-10-15',
 'transect_9-2020-12-28',
 'transect_9-2021-01-13',
 'transect_9-2021-02-17',
 'transect_9-2021-03-23',
 'transect_9-2021-04-16',
 'transect_9-2021-05-06',
 'transect_9-2021-06-21',
 'transect_9-2021-07-16',
 'transect_9-2021-08-17',
 'transect_9-2021-09-17',
 'transect_9-2021-10-21',
 'transect_9-2021-11-14',
 'transect_9-2021-12-18',
 'transect_9-2022-01-31',
 'transect_9-2022-03-01',
 'transect_9-2022-03-22',
 'transect_9-2022-04-13',
 'transect_9-2022-05-23',
 'transect_9-2022-06-24',
 'transect_9-2022-07-23',
 'transect_9-2022-08-24',
 'transect_AlongBay-2012-08-15',
 'transect_AlongBay-2013-02-12',
 'transect_AlongBay-2013-02-13_A',
 'transect_AlongBay-2013-02-13_B',
 'transect_AlongBay-2013-06-06',
 'transect_AlongBay-2014-03-28',
 'transect_AlongBay-2014-05-28',
 'transect_AlongBay-2014-08-14',
 'transect_AlongBay-2015-07-10',
 'transect_AlongBay-2015-08-14',
 'transect_AlongBay-2016-01-07',
 'transect_AlongBay-2016-05-12',
 'transect_AlongBay-2016-06-16',
 'transect_AlongBay-2016-07-27',
 'transect_AlongBay-2017-01-11',
 'transect_AlongBay-2017-02-07',
 'transect_AlongBay-2017-03-28',
 'transect_AlongBay-2017-04-20',
 'transect_AlongBay-2017-05-30',
 'transect_AlongBay-2017-06-28',
 'transect_AlongBay-2017-07-24',
 'transect_AlongBay-2017-07-26',
 'transect_AlongBay-2017-08-24',
 'transect_AlongBay-2017-09-22',
 'transect_AlongBay-2017-10-20',
 'transect_AlongBay-2017-11-02',
 'transect_AlongBay-2017-11-07',
 'transect_AlongBay-2017-12-14',
 'transect_AlongBay-2018-01-17',
 'transect_AlongBay-2018-03-02',
 'transect_AlongBay-2018-03-27',
 'transect_AlongBay-2018-04-23',
 'transect_AlongBay-2018-05-24',
 'transect_AlongBay-2018-06-22',
 'transect_AlongBay-2018-07-18',
 'transect_AlongBay-2018-08-23',
 'transect_AlongBay-2018-09-17',
 'transect_AlongBay-2018-10-17',
 'transect_AlongBay-2018-11-08',
 'transect_AlongBay-2018-12-06',
 'transect_AlongBay-2019-02-07',
 'transect_AlongBay-2019-03-19',
 'transect_AlongBay-2019-04-24',
 'transect_AlongBay-2019-05-14',
 'transect_AlongBay-2019-06-19',
 'transect_AlongBay-2019-07-23',
 'transect_AlongBay-2019-10-30',
 'transect_AlongBay-2019-11-15',
 'transect_AlongBay-2019-12-12',
 'transect_AlongBay-2020-02-06',
 'transect_AlongBay-2020-03-18',
 'transect_AlongBay-2020-06-04',
 'transect_AlongBay-2020-07-08',
 'transect_AlongBay-2020-07-23',
 'transect_AlongBay-2020-08-14',
 'transect_AlongBay-2020-09-20',
 'transect_AlongBay-2020-10-15',
 'transect_AlongBay-2020-12-28',
 'transect_AlongBay-2021-01-13',
 'transect_AlongBay-2021-02-16',
 'transect_AlongBay-2021-03-23',
 'transect_AlongBay-2021-04-14',
 'transect_AlongBay-2021-04-16',
 'transect_AlongBay-2021-05-06',
 'transect_AlongBay-2021-06-21',
 'transect_AlongBay-2021-07-21',
 'transect_AlongBay-2021-08-17',
 'transect_AlongBay-2021-10-04',
 'transect_AlongBay-2021-10-05',
 'transect_AlongBay-2021-10-21',
 'transect_AlongBay-2021-11-14',
 'transect_AlongBay-2021-12-18',
 'transect_AlongBay-2022-01-31',
 'transect_AlongBay-2022-02-28',
 'transect_AlongBay-2022-03-21',
 'transect_AlongBay-2022-04-12',
 'transect_AlongBay-2022-05-23',
 'transect_AlongBay-2022-06-24',
 'transect_AlongBay-2022-07-21',
 'transect_AlongBay-2022-08-24']

Select one dataset to investigate

try:
    dataset_id = dataset_ids[2]
except:
    dataset_id = dataset_ids[0]
print(dataset_id)

dd = cat[dataset_id].read()
dd
transect_3-2012-10-29
---------------------------------------------------------------------------
PermissionError                           Traceback (most recent call last)
Cell In[5], line 7
      4     dataset_id = dataset_ids[0]
      5 print(dataset_id)
----> 7 dd = cat[dataset_id].read()
      8 dd

File ~/checkouts/readthedocs.org/user_builds/cook-inlet-catalogs/conda/stable/lib/python3.11/site-packages/intake/readers/readers.py:121, in BaseReader.read(self, *args, **kwargs)
    119 kw.update(kwargs)
    120 args = kw.pop("args", ()) or args
--> 121 return self._read(*args, **kw)

File ~/checkouts/readthedocs.org/user_builds/cook-inlet-catalogs/conda/stable/lib/python3.11/site-packages/intake/readers/convert.py:631, in Pipeline._read(self, discover, **kwargs)
    629         data = self._read_stage_n(i, data=data, **kw)
    630     else:
--> 631         data = self._read_stage_n(i, discover=discover, **kw)
    632 return data

File ~/checkouts/readthedocs.org/user_builds/cook-inlet-catalogs/conda/stable/lib/python3.11/site-packages/intake/readers/convert.py:620, in Pipeline._read_stage_n(self, stage, discover, **kwargs)
    618         return func.discover(*arg, **kw2)
    619     else:
--> 620         return func.read(*arg, **kw2)
    621 else:
    622     return func(*arg, **kw2)

File ~/checkouts/readthedocs.org/user_builds/cook-inlet-catalogs/conda/stable/lib/python3.11/site-packages/intake/readers/readers.py:121, in BaseReader.read(self, *args, **kwargs)
    119 kw.update(kwargs)
    120 args = kw.pop("args", ()) or args
--> 121 return self._read(*args, **kw)

File ~/checkouts/readthedocs.org/user_builds/cook-inlet-catalogs/conda/stable/lib/python3.11/site-packages/intake/readers/readers.py:176, in FileReader._read(self, data, **kw)
    174 if self.storage_options and data.storage_options:
    175     kw["storage_options"] = data.storage_options
--> 176 return self._func(**kw)

File ~/checkouts/readthedocs.org/user_builds/cook-inlet-catalogs/conda/stable/lib/python3.11/site-packages/pandas/io/parsers/readers.py:1026, in read_csv(filepath_or_buffer, sep, delimiter, header, names, index_col, usecols, dtype, engine, converters, true_values, false_values, skipinitialspace, skiprows, skipfooter, nrows, na_values, keep_default_na, na_filter, verbose, skip_blank_lines, parse_dates, infer_datetime_format, keep_date_col, date_parser, date_format, dayfirst, cache_dates, iterator, chunksize, compression, thousands, decimal, lineterminator, quotechar, quoting, doublequote, escapechar, comment, encoding, encoding_errors, dialect, on_bad_lines, delim_whitespace, low_memory, memory_map, float_precision, storage_options, dtype_backend)
   1013 kwds_defaults = _refine_defaults_read(
   1014     dialect,
   1015     delimiter,
   (...)   1022     dtype_backend=dtype_backend,
   1023 )
   1024 kwds.update(kwds_defaults)
-> 1026 return _read(filepath_or_buffer, kwds)

File ~/checkouts/readthedocs.org/user_builds/cook-inlet-catalogs/conda/stable/lib/python3.11/site-packages/pandas/io/parsers/readers.py:620, in _read(filepath_or_buffer, kwds)
    617 _validate_names(kwds.get("names", None))
    619 # Create the parser.
--> 620 parser = TextFileReader(filepath_or_buffer, **kwds)
    622 if chunksize or iterator:
    623     return parser

File ~/checkouts/readthedocs.org/user_builds/cook-inlet-catalogs/conda/stable/lib/python3.11/site-packages/pandas/io/parsers/readers.py:1620, in TextFileReader.__init__(self, f, engine, **kwds)
   1617     self.options["has_index_names"] = kwds["has_index_names"]
   1619 self.handles: IOHandles | None = None
-> 1620 self._engine = self._make_engine(f, self.engine)

File ~/checkouts/readthedocs.org/user_builds/cook-inlet-catalogs/conda/stable/lib/python3.11/site-packages/pandas/io/parsers/readers.py:1880, in TextFileReader._make_engine(self, f, engine)
   1878     if "b" not in mode:
   1879         mode += "b"
-> 1880 self.handles = get_handle(
   1881     f,
   1882     mode,
   1883     encoding=self.options.get("encoding", None),
   1884     compression=self.options.get("compression", None),
   1885     memory_map=self.options.get("memory_map", False),
   1886     is_text=is_text,
   1887     errors=self.options.get("encoding_errors", "strict"),
   1888     storage_options=self.options.get("storage_options", None),
   1889 )
   1890 assert self.handles is not None
   1891 f = self.handles.handle

File ~/checkouts/readthedocs.org/user_builds/cook-inlet-catalogs/conda/stable/lib/python3.11/site-packages/pandas/io/common.py:728, in get_handle(path_or_buf, mode, encoding, compression, memory_map, is_text, errors, storage_options)
    725     codecs.lookup_error(errors)
    727 # open URLs
--> 728 ioargs = _get_filepath_or_buffer(
    729     path_or_buf,
    730     encoding=encoding,
    731     compression=compression,
    732     mode=mode,
    733     storage_options=storage_options,
    734 )
    736 handle = ioargs.filepath_or_buffer
    737 handles: list[BaseBuffer]

File ~/checkouts/readthedocs.org/user_builds/cook-inlet-catalogs/conda/stable/lib/python3.11/site-packages/pandas/io/common.py:430, in _get_filepath_or_buffer(filepath_or_buffer, encoding, compression, mode, storage_options)
    427     pass
    429 try:
--> 430     file_obj = fsspec.open(
    431         filepath_or_buffer, mode=fsspec_mode, **(storage_options or {})
    432     ).open()
    433 # GH 34626 Reads from Public Buckets without Credentials needs anon=True
    434 except tuple(err_types_to_retry_with_anon):

File ~/checkouts/readthedocs.org/user_builds/cook-inlet-catalogs/conda/stable/lib/python3.11/site-packages/fsspec/core.py:491, in open(urlpath, mode, compression, encoding, errors, protocol, newline, expand, **kwargs)
    433 """Given a path or paths, return one ``OpenFile`` object.
    434 
    435 Parameters
   (...)    488   https://filesystem-spec.readthedocs.io/en/latest/api.html#other-known-implementations
    489 """
    490 expand = DEFAULT_EXPAND if expand is None else expand
--> 491 out = open_files(
    492     urlpath=[urlpath],
    493     mode=mode,
    494     compression=compression,
    495     encoding=encoding,
    496     errors=errors,
    497     protocol=protocol,
    498     newline=newline,
    499     expand=expand,
    500     **kwargs,
    501 )
    502 if not out:
    503     raise FileNotFoundError(urlpath)

File ~/checkouts/readthedocs.org/user_builds/cook-inlet-catalogs/conda/stable/lib/python3.11/site-packages/fsspec/core.py:295, in open_files(urlpath, mode, compression, encoding, errors, name_function, num, protocol, newline, auto_mkdir, expand, **kwargs)
    216 def open_files(
    217     urlpath,
    218     mode="rb",
   (...)    228     **kwargs,
    229 ):
    230     """Given a path or paths, return a list of ``OpenFile`` objects.
    231 
    232     For writing, a str path must contain the "*" character, which will be filled
   (...)    293       https://filesystem-spec.readthedocs.io/en/latest/api.html#other-known-implementations
    294     """
--> 295     fs, fs_token, paths = get_fs_token_paths(
    296         urlpath,
    297         mode,
    298         num=num,
    299         name_function=name_function,
    300         storage_options=kwargs,
    301         protocol=protocol,
    302         expand=expand,
    303     )
    304     if fs.protocol == "file":
    305         fs.auto_mkdir = auto_mkdir

File ~/checkouts/readthedocs.org/user_builds/cook-inlet-catalogs/conda/stable/lib/python3.11/site-packages/fsspec/core.py:667, in get_fs_token_paths(urlpath, mode, num, name_function, storage_options, protocol, expand)
    665     inkwargs["fo"] = urls
    666 paths, protocol, _ = chain[0]
--> 667 fs = filesystem(protocol, **inkwargs)
    668 if isinstance(urlpath, (list, tuple, set)):
    669     pchains = [
    670         _un_chain(stringify_path(u), storage_options or {})[0] for u in urlpath
    671     ]

File ~/checkouts/readthedocs.org/user_builds/cook-inlet-catalogs/conda/stable/lib/python3.11/site-packages/fsspec/registry.py:322, in filesystem(protocol, **storage_options)
    315     warnings.warn(
    316         "The 'arrow_hdfs' protocol has been deprecated and will be "
    317         "removed in the future. Specify it as 'hdfs'.",
    318         DeprecationWarning,
    319     )
    321 cls = get_filesystem_class(protocol)
--> 322 return cls(**storage_options)

File ~/checkouts/readthedocs.org/user_builds/cook-inlet-catalogs/conda/stable/lib/python3.11/site-packages/fsspec/spec.py:81, in _Cached.__call__(cls, *args, **kwargs)
     79     return cls._cache[token]
     80 else:
---> 81     obj = super().__call__(*args, **kwargs)
     82     # Setting _fs_token here causes some static linters to complain.
     83     obj._fs_token_ = token

File ~/checkouts/readthedocs.org/user_builds/cook-inlet-catalogs/conda/stable/lib/python3.11/site-packages/fsspec/implementations/cached.py:762, in SimpleCacheFileSystem.__init__(self, **kwargs)
    760 for key in ["cache_check", "expiry_time", "check_files"]:
    761     kw[key] = False
--> 762 super().__init__(**kw)
    763 for storage in self.storage:
    764     if not os.path.exists(storage):

File ~/checkouts/readthedocs.org/user_builds/cook-inlet-catalogs/conda/stable/lib/python3.11/site-packages/fsspec/implementations/cached.py:137, in CachingFileSystem.__init__(self, target_protocol, cache_storage, cache_check, check_files, expiry_time, target_options, fs, same_names, compression, cache_mapper, **kwargs)
    135     else:
    136         storage = cache_storage
--> 137 os.makedirs(storage[-1], exist_ok=True)
    138 self.storage = storage
    139 self.kwargs = target_options or {}

File <frozen os>:215, in makedirs(name, mode, exist_ok)

File <frozen os>:215, in makedirs(name, mode, exist_ok)

File <frozen os>:225, in makedirs(name, mode, exist_ok)

PermissionError: [Errno 13] Permission denied: '/home/kristen'

Plot one dataset

keys = list(cat[dataset_id].metadata["plots"].keys())
print(keys)

plots = []
for key in keys:
    plot_kwargs = cat[dataset_id].metadata["plots"][key]
    if "clim" in plot_kwargs and isinstance(plot_kwargs["clim"], list):
        plot_kwargs["clim"] = tuple(plot_kwargs["clim"])
    if "dynamic" in plot_kwargs:
        plot_kwargs["dynamic"] = False
    plots.append(cat[dataset_id].ToHvPlot(**plot_kwargs).read())
hv.Layout(plots).cols(1)