diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 0000000..e69de29 diff --git a/index.html b/index.html new file mode 100644 index 0000000..d696f30 --- /dev/null +++ b/index.html @@ -0,0 +1,7 @@ + + + + + + + diff --git a/search.js b/search.js new file mode 100644 index 0000000..6edcd2b --- /dev/null +++ b/search.js @@ -0,0 +1,46 @@ +window.pdocSearch = (function(){ +/** elasticlunr - http://weixsong.github.io * Copyright (C) 2017 Oliver Nightingale * Copyright (C) 2017 Wei Song * MIT Licensed */!function(){function e(e){if(null===e||"object"!=typeof e)return e;var t=e.constructor();for(var n in e)e.hasOwnProperty(n)&&(t[n]=e[n]);return t}var t=function(e){var n=new t.Index;return n.pipeline.add(t.trimmer,t.stopWordFilter,t.stemmer),e&&e.call(n,n),n};t.version="0.9.5",lunr=t,t.utils={},t.utils.warn=function(e){return function(t){e.console&&console.warn&&console.warn(t)}}(this),t.utils.toString=function(e){return void 0===e||null===e?"":e.toString()},t.EventEmitter=function(){this.events={}},t.EventEmitter.prototype.addListener=function(){var e=Array.prototype.slice.call(arguments),t=e.pop(),n=e;if("function"!=typeof t)throw new TypeError("last argument must be a function");n.forEach(function(e){this.hasHandler(e)||(this.events[e]=[]),this.events[e].push(t)},this)},t.EventEmitter.prototype.removeListener=function(e,t){if(this.hasHandler(e)){var n=this.events[e].indexOf(t);-1!==n&&(this.events[e].splice(n,1),0==this.events[e].length&&delete this.events[e])}},t.EventEmitter.prototype.emit=function(e){if(this.hasHandler(e)){var t=Array.prototype.slice.call(arguments,1);this.events[e].forEach(function(e){e.apply(void 0,t)},this)}},t.EventEmitter.prototype.hasHandler=function(e){return e in this.events},t.tokenizer=function(e){if(!arguments.length||null===e||void 0===e)return[];if(Array.isArray(e)){var n=e.filter(function(e){return null===e||void 0===e?!1:!0});n=n.map(function(e){return t.utils.toString(e).toLowerCase()});var i=[];return n.forEach(function(e){var n=e.split(t.tokenizer.seperator);i=i.concat(n)},this),i}return e.toString().trim().toLowerCase().split(t.tokenizer.seperator)},t.tokenizer.defaultSeperator=/[\s\-]+/,t.tokenizer.seperator=t.tokenizer.defaultSeperator,t.tokenizer.setSeperator=function(e){null!==e&&void 0!==e&&"object"==typeof e&&(t.tokenizer.seperator=e)},t.tokenizer.resetSeperator=function(){t.tokenizer.seperator=t.tokenizer.defaultSeperator},t.tokenizer.getSeperator=function(){return t.tokenizer.seperator},t.Pipeline=function(){this._queue=[]},t.Pipeline.registeredFunctions={},t.Pipeline.registerFunction=function(e,n){n in t.Pipeline.registeredFunctions&&t.utils.warn("Overwriting existing registered function: "+n),e.label=n,t.Pipeline.registeredFunctions[n]=e},t.Pipeline.getRegisteredFunction=function(e){return e in t.Pipeline.registeredFunctions!=!0?null:t.Pipeline.registeredFunctions[e]},t.Pipeline.warnIfFunctionNotRegistered=function(e){var n=e.label&&e.label in this.registeredFunctions;n||t.utils.warn("Function is not registered with pipeline. This may cause problems when serialising the index.\n",e)},t.Pipeline.load=function(e){var n=new t.Pipeline;return e.forEach(function(e){var i=t.Pipeline.getRegisteredFunction(e);if(!i)throw new Error("Cannot load un-registered function: "+e);n.add(i)}),n},t.Pipeline.prototype.add=function(){var e=Array.prototype.slice.call(arguments);e.forEach(function(e){t.Pipeline.warnIfFunctionNotRegistered(e),this._queue.push(e)},this)},t.Pipeline.prototype.after=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var i=this._queue.indexOf(e);if(-1===i)throw new Error("Cannot find existingFn");this._queue.splice(i+1,0,n)},t.Pipeline.prototype.before=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var i=this._queue.indexOf(e);if(-1===i)throw new Error("Cannot find existingFn");this._queue.splice(i,0,n)},t.Pipeline.prototype.remove=function(e){var t=this._queue.indexOf(e);-1!==t&&this._queue.splice(t,1)},t.Pipeline.prototype.run=function(e){for(var t=[],n=e.length,i=this._queue.length,o=0;n>o;o++){for(var r=e[o],s=0;i>s&&(r=this._queue[s](r,o,e),void 0!==r&&null!==r);s++);void 0!==r&&null!==r&&t.push(r)}return t},t.Pipeline.prototype.reset=function(){this._queue=[]},t.Pipeline.prototype.get=function(){return this._queue},t.Pipeline.prototype.toJSON=function(){return this._queue.map(function(e){return t.Pipeline.warnIfFunctionNotRegistered(e),e.label})},t.Index=function(){this._fields=[],this._ref="id",this.pipeline=new t.Pipeline,this.documentStore=new t.DocumentStore,this.index={},this.eventEmitter=new t.EventEmitter,this._idfCache={},this.on("add","remove","update",function(){this._idfCache={}}.bind(this))},t.Index.prototype.on=function(){var e=Array.prototype.slice.call(arguments);return this.eventEmitter.addListener.apply(this.eventEmitter,e)},t.Index.prototype.off=function(e,t){return this.eventEmitter.removeListener(e,t)},t.Index.load=function(e){e.version!==t.version&&t.utils.warn("version mismatch: current "+t.version+" importing "+e.version);var n=new this;n._fields=e.fields,n._ref=e.ref,n.documentStore=t.DocumentStore.load(e.documentStore),n.pipeline=t.Pipeline.load(e.pipeline),n.index={};for(var i in e.index)n.index[i]=t.InvertedIndex.load(e.index[i]);return n},t.Index.prototype.addField=function(e){return this._fields.push(e),this.index[e]=new t.InvertedIndex,this},t.Index.prototype.setRef=function(e){return this._ref=e,this},t.Index.prototype.saveDocument=function(e){return this.documentStore=new t.DocumentStore(e),this},t.Index.prototype.addDoc=function(e,n){if(e){var n=void 0===n?!0:n,i=e[this._ref];this.documentStore.addDoc(i,e),this._fields.forEach(function(n){var o=this.pipeline.run(t.tokenizer(e[n]));this.documentStore.addFieldLength(i,n,o.length);var r={};o.forEach(function(e){e in r?r[e]+=1:r[e]=1},this);for(var s in r){var u=r[s];u=Math.sqrt(u),this.index[n].addToken(s,{ref:i,tf:u})}},this),n&&this.eventEmitter.emit("add",e,this)}},t.Index.prototype.removeDocByRef=function(e){if(e&&this.documentStore.isDocStored()!==!1&&this.documentStore.hasDoc(e)){var t=this.documentStore.getDoc(e);this.removeDoc(t,!1)}},t.Index.prototype.removeDoc=function(e,n){if(e){var n=void 0===n?!0:n,i=e[this._ref];this.documentStore.hasDoc(i)&&(this.documentStore.removeDoc(i),this._fields.forEach(function(n){var o=this.pipeline.run(t.tokenizer(e[n]));o.forEach(function(e){this.index[n].removeToken(e,i)},this)},this),n&&this.eventEmitter.emit("remove",e,this))}},t.Index.prototype.updateDoc=function(e,t){var t=void 0===t?!0:t;this.removeDocByRef(e[this._ref],!1),this.addDoc(e,!1),t&&this.eventEmitter.emit("update",e,this)},t.Index.prototype.idf=function(e,t){var n="@"+t+"/"+e;if(Object.prototype.hasOwnProperty.call(this._idfCache,n))return this._idfCache[n];var i=this.index[t].getDocFreq(e),o=1+Math.log(this.documentStore.length/(i+1));return this._idfCache[n]=o,o},t.Index.prototype.getFields=function(){return this._fields.slice()},t.Index.prototype.search=function(e,n){if(!e)return[];e="string"==typeof e?{any:e}:JSON.parse(JSON.stringify(e));var i=null;null!=n&&(i=JSON.stringify(n));for(var o=new t.Configuration(i,this.getFields()).get(),r={},s=Object.keys(e),u=0;u0&&t.push(e);for(var i in n)"docs"!==i&&"df"!==i&&this.expandToken(e+i,t,n[i]);return t},t.InvertedIndex.prototype.toJSON=function(){return{root:this.root}},t.Configuration=function(e,n){var e=e||"";if(void 0==n||null==n)throw new Error("fields should not be null");this.config={};var i;try{i=JSON.parse(e),this.buildUserConfig(i,n)}catch(o){t.utils.warn("user configuration parse failed, will use default configuration"),this.buildDefaultConfig(n)}},t.Configuration.prototype.buildDefaultConfig=function(e){this.reset(),e.forEach(function(e){this.config[e]={boost:1,bool:"OR",expand:!1}},this)},t.Configuration.prototype.buildUserConfig=function(e,n){var i="OR",o=!1;if(this.reset(),"bool"in e&&(i=e.bool||i),"expand"in e&&(o=e.expand||o),"fields"in e)for(var r in e.fields)if(n.indexOf(r)>-1){var s=e.fields[r],u=o;void 0!=s.expand&&(u=s.expand),this.config[r]={boost:s.boost||0===s.boost?s.boost:1,bool:s.bool||i,expand:u}}else t.utils.warn("field name in user configuration not found in index instance fields");else this.addAllFields2UserConfig(i,o,n)},t.Configuration.prototype.addAllFields2UserConfig=function(e,t,n){n.forEach(function(n){this.config[n]={boost:1,bool:e,expand:t}},this)},t.Configuration.prototype.get=function(){return this.config},t.Configuration.prototype.reset=function(){this.config={}},lunr.SortedSet=function(){this.length=0,this.elements=[]},lunr.SortedSet.load=function(e){var t=new this;return t.elements=e,t.length=e.length,t},lunr.SortedSet.prototype.add=function(){var e,t;for(e=0;e1;){if(r===e)return o;e>r&&(t=o),r>e&&(n=o),i=n-t,o=t+Math.floor(i/2),r=this.elements[o]}return r===e?o:-1},lunr.SortedSet.prototype.locationFor=function(e){for(var t=0,n=this.elements.length,i=n-t,o=t+Math.floor(i/2),r=this.elements[o];i>1;)e>r&&(t=o),r>e&&(n=o),i=n-t,o=t+Math.floor(i/2),r=this.elements[o];return r>e?o:e>r?o+1:void 0},lunr.SortedSet.prototype.intersect=function(e){for(var t=new lunr.SortedSet,n=0,i=0,o=this.length,r=e.length,s=this.elements,u=e.elements;;){if(n>o-1||i>r-1)break;s[n]!==u[i]?s[n]u[i]&&i++:(t.add(s[n]),n++,i++)}return t},lunr.SortedSet.prototype.clone=function(){var e=new lunr.SortedSet;return e.elements=this.toArray(),e.length=e.elements.length,e},lunr.SortedSet.prototype.union=function(e){var t,n,i;this.length>=e.length?(t=this,n=e):(t=e,n=this),i=t.clone();for(var o=0,r=n.toArray();ovelosearaptor\n\n

Library of python modules for reading and processing raw RDI Teledyne ADCP data. The code interfaces the UH package pycurrents and its Multiread for efficient reading of raw ADCP data.

\n\n

velosearaptor.io provides convenience functions for reading raw data either into an xarray.Dataset or into the output structure format provided by the UH software package.

\n\n

velosearaptor.adcp is a collection of functions that are useful to quickly analyze raw ADCP data.

\n\n

velosearaptor.madcp contains functions for processing moored ADCP data. Many thanks to Eric Fiering for sharing his code on moored ADCP data processing mcm_avp.py that much of this is based on.

\n\n

Installation

\n\n

Installing pycurrents

\n\n

This package depends on the pycurrents package. Installation instructions can either be found here, or a conda environment including all necessary dependencies can be installed via conda env create -f environment.yml. Take a look at environment.yml and requirements.txt and copy the relevant parts if you would like to incude the package and its dependencies in other environments.

\n\n

Installing magdec

\n\n

Note that this method only works with the editable pip install of velosearaptor (e.g. pip install -e .) since it compiles magdec locally and does not do a system install. See note at bottom for system install.

\n\n

Requirements:

\n\n
    \n
  • A C compiler, e.g. in OSX with homebrew use brew install gcc
  • \n
  • conda package manager
  • \n
  • The velosearaptor environment installed via conda, e.g. conda env create -f environment.yml
  • \n
\n\n

With the requirements satisfied, run the shell script:

\n\n
\n
./install_magdec.sh\n
\n
\n\n

To remove, delete the geomag/ directory.

\n\n

For a system install you need to cd geomag and do something like sudo make install.

\n\n
\n\n

History

\n\n

v0.?? (unreleased)

\n\n

New Features

\n\n
    \n
  • Install magdec via shell script.
  • \n
  • Add an example notebook.
  • \n
  • Read serial number from binary file and compare with SN in meta data (PR13). By Jesse Cusack.
  • \n
  • Add bin mapping for cases with large pitch and roll. This adds velosearaptor.madcp.ProcessADCP.process_pings (PR17). By Jesse Cusack.
  • \n
  • Add position to moored ADCP meta data (PR21).
  • \n
  • Allow for external input of pressure time series in velosearaptor.madcp.ProcessADCP (PR12).
  • \n
  • Improve default depth grid to also work well with mooring knockdowns (PR44).
  • \n
  • Optionally read processing parameters from .yml-file (PR26).
  • \n
  • Add CF-compliant meta data to output dataset (PR26).
  • \n
\n\n

Breaking Changes

\n\n
    \n
  • Transfer repository from gunnarvoet to modscripps and rename from gadcp to velosearaptor. Legacy code still exists at https://github.com/gunnarvoet/gadcp.
  • \n
  • Change processed dataset coordinate z to depth (PR48).
  • \n
  • Change vel_std variables in output dataset to vel_error by dividing the standard deviation of each average by the square root of the number of pings (PR26).
  • \n
\n\n

Bug Fixes

\n\n
    \n
  • Fix conda/pip environment.
  • \n
  • Read correct instrument orientation when a majority of the time series has been recorded outside the water (PR44).
  • \n
  • Read paths provided via pathlib.PosixPath objects (PR55). By Gunnar Voet.
  • \n
\n\n

Documentation

\n\n
    \n
  • Consolidate readme and history files.
  • \n
  • Add button with link to source code on GitHub (PR43).
  • \n
\n\n

Internal Changes

\n\n
    \n
  • Remove gvpy dependency (PR27).
  • \n
\n\n

v0.2.0 (2022 March)

\n\n

This release brings a major refactoring of the velosearaptor.madcp module with lots of breaking changes. The module now allows for improved ensemble averages for burst sampling schemes with better control of the editing parameters.

\n\n

New Features

\n\n
    \n
  • Ensemble-average before depth gridding. This happens automatically when using velosearaptor.madcp.ProcessADCP.burst_average_ensembles.
  • \n
  • Improved gridding for burst sampling schemes in velosearaptor.madcp.ProcessADCP.burst_average_ensembles.
  • \n
  • Apply pg criterion prior to depth gridding in velosearaptor.madcp.ProcessADCP.burst_average_ensembles.
  • \n
  • Interpolate over missing bin prior to depth gridding in velosearaptor.madcp.ProcessADCP.burst_average_ensembles.
  • \n
  • Write log messages to a file and (if desired) to the screen.
  • \n
\n\n

Breaking Changes

\n\n
    \n
  • Changed the velosearaptor.madcp architecture and moved from using the function velosearaptor.madcp.proc to the class velosearaptor.madcp.ProcessADCP.
  • \n
\n\n

Bug Fixes

\n\n
    \n
  • Correct time stamp calculation for burst averages.
  • \n
  • For burst sampling schemes average pressure before gridding to depth.
  • \n
\n\n

Documentation

\n\n
    \n
  • Added lots of documentation to velosearaptor.madcp.ProcessADCP.
  • \n
  • Use pdoc to generate the package documentation.
  • \n
  • Automatically build the documentation using GitHub Actions.
  • \n
  • Automatically deploy the documentation to modscripps.github.io/velosearaptor with GitHub Actions.
  • \n
\n\n

Internal Changes

\n\n
    \n
  • Improved the pip/conda requirements to automatically install the pycurrents package.
  • \n
\n\n

v0.0.1 (2020-04-28)

\n\n
    \n
  • Moved all ADCP-related functions from gvpy to this module.
  • \n
\n"}, "velosearaptor.adcp": {"fullname": "velosearaptor.adcp", "modulename": "velosearaptor.adcp", "kind": "module", "doc": "

Module velosearaptor.adcp with general adcp functions

\n"}, "velosearaptor.adcp.plot_raw_adcp": {"fullname": "velosearaptor.adcp.plot_raw_adcp", "modulename": "velosearaptor.adcp", "qualname": "plot_raw_adcp", "kind": "function", "doc": "

Plot raw RDI adcp dataset.

\n\n
Parameters
\n\n
    \n
  • adcp (xarray.Dataset):\nRaw RDI ADCP data read using velosearaptor.io.read_raw_rdi()
  • \n
  • figsize (tuple):\nProvide figure size (default (17, 20))
  • \n
\n", "signature": "(adcp, figsize=(17, 20)):", "funcdef": "def"}, "velosearaptor.adcp.plot_raw_adcp_auxillary": {"fullname": "velosearaptor.adcp.plot_raw_adcp_auxillary", "modulename": "velosearaptor.adcp", "qualname": "plot_raw_adcp_auxillary", "kind": "function", "doc": "

Plot raw RDI adcp dataset (auxillary data only).

\n\n
Parameters
\n\n
    \n
  • adcp (xarray.Dataset):\nRaw RDI ADCP data read using velosearaptor.io.read_raw_rdi()
  • \n
  • figsize (tuple):\nProvide figure size (default (17, 20))
  • \n
\n", "signature": "(adcp, figsize=(12, 5)):", "funcdef": "def"}, "velosearaptor.io": {"fullname": "velosearaptor.io", "modulename": "velosearaptor.io", "kind": "module", "doc": "

Module velosearaptor.io with in/out functions.

\n"}, "velosearaptor.io.read_raw_rdi": {"fullname": "velosearaptor.io.read_raw_rdi", "modulename": "velosearaptor.io", "qualname": "read_raw_rdi", "kind": "function", "doc": "

Read raw RDI ADCP data file and return as xarray Dataset.

\n\n
Parameters
\n\n
    \n
  • file (str or Path or list of str or Path):\nPath to raw data file(s).
  • \n
  • auxillary_only (bool):\nSet to True to ignore 2d fields. (default False)
  • \n
\n\n
Returns
\n\n
    \n
  • rdi (xarray.Dataset):\nRaw ADCP data in xarray Dataset format.
  • \n
\n", "signature": "(file, auxillary_only=False):", "funcdef": "def"}, "velosearaptor.io.read_raw_rdi_uh": {"fullname": "velosearaptor.io.read_raw_rdi_uh", "modulename": "velosearaptor.io", "qualname": "read_raw_rdi_uh", "kind": "function", "doc": "

Wrapper for UH's pycurrents.adcp.rdiraw.Multiread

\n\n
Parameters
\n\n
    \n
  • file (str or Path):\nPath to raw data file.
  • \n
\n\n
Returns
\n\n
    \n
  • radcp (dict (Bunch)):\nUH data structure with raw RDI data
  • \n
\n", "signature": "(file, auxillary_only=False):", "funcdef": "def"}, "velosearaptor.io.extract_raw_rdi": {"fullname": "velosearaptor.io.extract_raw_rdi", "modulename": "velosearaptor.io", "qualname": "extract_raw_rdi", "kind": "function", "doc": "

Extract ping range from raw RDI file and save to new raw file.

\n\n
Parameters
\n\n
    \n
  • file (str or Path):\nInput file.
  • \n
  • i0 (int):\nStart ping.
  • \n
  • i1 (int):\nEnd ping.
  • \n
  • outfile (str or Path):\nPath and name of output file.
  • \n
  • inst (str):\nOne of ('wh','os','bb','ec'). Defaults to 'wh'.
  • \n
\n", "signature": "(file, i0, i1, outfile, inst='wh'):", "funcdef": "def"}, "velosearaptor.io.yday0_to_datetime64": {"fullname": "velosearaptor.io.yday0_to_datetime64", "modulename": "velosearaptor.io", "qualname": "yday0_to_datetime64", "kind": "function", "doc": "

Convert year day (starting at yday 0) to numpy's datetime64 format.

\n\n
Parameters
\n\n
    \n
  • baseyear (int):\nBase year
  • \n
  • yday (float):\nYear day
  • \n
\n\n
Returns
\n\n
    \n
  • time (np.datetime64):\nTime in numpy datetime64 format
  • \n
\n", "signature": "(baseyear, yday):", "funcdef": "def"}, "velosearaptor.io.parse_yaml_input": {"fullname": "velosearaptor.io.parse_yaml_input", "modulename": "velosearaptor.io", "qualname": "parse_yaml_input", "kind": "function", "doc": "

Read yaml settings file and parse for a specific instrument.

\n\n

Returns will be of type None if not present in the yml parameter file.

\n\n
Parameters
\n\n
    \n
  • yamlfile (pathlib.Path() or str):\nParameter file.
  • \n
  • mooring (str):\nMooring ID as used in the parameter file.
  • \n
  • sn (int):\nInstrument serial number as used in the parameter file, without prepended SN.
  • \n
\n\n
Returns
\n\n
    \n
  • Dictionary with the following entries:
  • \n
  • meta_data (dict):\nGeneral meta data for the dataset.
  • \n
  • dgridparams (dict):\nDepth gridding parameters.
  • \n
  • tgridparams (dict):\nTime gridding parameters.
  • \n
  • editparams (dict):\nEditing parameters.
  • \n
  • driftparams (dict):\nClock drift parameters.
  • \n
  • data_dir (pathlib.Path):\nADCP data directory
  • \n
\n", "signature": "(yamlfile, mooring, sn):", "funcdef": "def"}, "velosearaptor.io.cf_conventions": {"fullname": "velosearaptor.io.cf_conventions", "modulename": "velosearaptor.io", "qualname": "cf_conventions", "kind": "function", "doc": "

Return dictionary with CF standard names and units.

\n\n
Returns
\n\n
    \n
  • CF (dict):\nCF standard names in units.
  • \n
\n\n
Notes
\n\n

See https://cfconventions.org/Data/cf-standard-names/current/build/cf-standard-name-table.html\nand http://cfconventions.org/cf-conventions/cf-conventions.html\nfor further information.

\n\n

See also https://wiki.esipfed.org/Attribute_Convention_for_Data_Discovery_1-3 for meta data.

\n", "signature": "():", "funcdef": "def"}, "velosearaptor.madcp": {"fullname": "velosearaptor.madcp", "modulename": "velosearaptor.madcp", "kind": "module", "doc": "

Module velosearaptor.madcp with functions for moored ADCPs.

\n\n

General Use

\n\n

Processing a raw ADCP file from a moored deployment is a two-step process.

\n\n
    \n
  • Instantiate a processing object with ProcessADCP or ProcessADCPyml. The\nformer expects the path to the raw data and a number of dictionaries with\nprocessing parameters as input. The latter reads a .yml file containing the\nprocessing parameters. See the respective docstrings for more information.
  • \n
  • Process raw pings and possibly run a ping-averaging method on the data.\nOptions here are ProcessADCP.process_pings,\nProcessADCP.average_ensembles, and ProcessADCP.burst_average_ensembles.
  • \n
\n\n

Notes

\n\n

Some general notes for this module.

\n\n

Depth Gridding

\n\n

The depth vector for the ADCP raw data (in instrument coordinates) is\ncalculated in pycurrents.rdiraw.FileBBWHOS() as
\ndep = np.arange(NCells) * CellSize + Bin1Dist\nThe depth vector thus points to the center of each bin.

\n\n

From the RDI manual WorkHorse Monitor, Sentinel, Mariner, Quartermaster, and\nLong Ranger ADCPs Commands and Output Data Format:

\n\n
\n

This [Bin1Dist] field contains the distance to the middle of the first depth\n cell (bin). This distance is a function of depth cell length (WS), the\n profiling mode (WM), the blank after transmit distance (WF), and speed of\n sound.

\n
\n"}, "velosearaptor.madcp.logger": {"fullname": "velosearaptor.madcp.logger", "modulename": "velosearaptor.madcp", "qualname": "logger", "kind": "variable", "doc": "

\n", "default_value": "<Logger velosearaptor.madcp (WARNING)>"}, "velosearaptor.madcp.ProcessADCP": {"fullname": "velosearaptor.madcp.ProcessADCP", "modulename": "velosearaptor.madcp", "qualname": "ProcessADCP", "kind": "class", "doc": "

Moored ADCP Processing.

\n\n

An instance of ProcessADCP is initialized by providing raw data and\nprocessing parameters. Once initialized, the instance method\naverage_ensembles() can be used to average over just a few or\nall pings.

\n\n

Magnetic declination is automatically calculated via a call to the command\nline tool\nmagdec that\nmust be installed. Once calculated, the magnetic declination is stored in\nmagdec and automatically applied to the data.

\n\n

Prior to time averaging, data are edited based on correlation and error\nvelocity thresholds. The variable pg is calculated based on the number of\nexcluded pings, i.e. it is the numbur of good pings divided by the number\nof total pings within one depth bin and one time bin. It may be used to\nfurther filter the data.

\n\n

A pdf document on ADCP data collection and processing principles can be\ndownloaded from RDI\nhere.

\n\n

Time-averaged data are grouped together in an xarray.Dataset in the\ninstance attribute ds for easy access and convenient output to netcdf\nformat.

\n\n
Parameters
\n\n
    \n
  • raw_data (str or list or Path):\nLocation(s) of raw data.
  • \n
  • meta_data (dict):\nDictionary with meta data. At a minimum entries for lon and lat are\nneeded. If mooring and sn provide mooring name and serial number\nthen these will be used to name the log file produced during\nprocessing.
  • \n
  • driftparams (dict, optional):\nTime drift parameters. See notes below.
  • \n
  • tgridparams (dict, optional):\nTime gridding parameters. See notes below.
  • \n
  • dgridparams (dict, optional):\nDepth gridding parameters. See notes below.
  • \n
  • editparams (dict, optional):\nEditing parameters. See notes below.
  • \n
  • ibad (int, optional):\nMark beam with bad data (zero based). Defaults to None.
  • \n
  • logdir (str, optional):\nLog file directory. Defaults to log/.
  • \n
  • verbose (bool, optional):\nOutput more processing info to screen.
  • \n
  • magdec (float, optional):\nMagnetic declination in degrees.
  • \n
  • pressure (xr.DataArray, optional):\nPressure time series in dbar as xr.DataAarray with coordinate time.
  • \n
\n\n
Attributes
\n\n
    \n
  • files (list):\nList pointing to raw data file(s).
  • \n
  • dday_start (float):\nStart time of ADCP time series, determined either through t0 in\ntgridparams or the start of the time series once at depth.
  • \n
  • dday_end (float):\nEnd time of ADCP time series, determined either through t1 in\ntgridparams or the end of the time series at depth.
  • \n
  • start_ddays (list):\nStart times of averaging intervals
  • \n
  • dday_mid (float):\nTime stamp for ping average as determined in make_start_ddays().
  • \n
  • dt (float):\nTime that is inclusive of one average. For regular averaging, this is\ndt_hours in tgridparams converted to Julian days. For\nburst-averagint, this is a time interval that is inclusive of all pings\nin one bursts (but goes slightly beyond that into the time between\nbursts).
  • \n
  • time_drift_rate (float):\nClock drift calculated from driftparams.
  • \n
  • orientation (str):\nInstrument orientation up or down.
  • \n
  • magdec (float):\nMagnetic declination.
  • \n
  • m (pycurrents.adcp.rdiraw.Multiread):\nMultiread instance.
  • \n
  • tsdat (Bunch):\nAuxiliary data.
  • \n
  • raw (xarray.Dataset):\nRaw ADCP data.
  • \n
  • ds (xarray.Dataset):\nTime-averaged dataset added by running average_ensembles().
  • \n
\n\n
Notes
\n\n

Various parameters are passed to the instance through dictionaries. Their\nspecifics are described below. Gridding and editing parameters can be\nupdated after creating the ProcessADCP instance via parse_dgridparams,\nparse_tgridparams, and parse_editparams.

\n\n

Time drift parameters\nProvide clock drift parameters via driftparams. Accepted entries are

\n\n
    \n
  • end_adcp : Time of ADCP at data download
  • \n
  • end_pc : UTC time at data download
  • \n
\n\n

The difference between end_adcp and end_pc is used to linearly correct\nfor instrument clock drift.

\n\n

Time gridding parameters\nProvide time gridding parameters via tgridparams. Accepted entries are

\n\n
    \n
  • dt_hours : Time grid interval. Defaults to 0.5h.
  • \n
  • t0 : Start time for gridding. Determined from data if not provided.
  • \n
  • t1 : End time for gridding. Determined from data if not provided.
  • \n
  • burst_average : bool\nSet ensemble averaging to act on burst sampling scheme. Defaults to False.
  • \n
\n\n

Depth gridding parameters\nProvide depth gridding parameters via dgridparams. Accepted entries are

\n\n
    \n
  • dtop : Shallow depth in m.
  • \n
  • dbot : Deep depth in m.
  • \n
  • dinterval : Vertical grid size in m. Defaults to 5m.
  • \n
\n\n

Values for dbot and dtop are generated if not provided.

\n\n

Editing parameters\nProvide editing parameters via editparams.

\n\n
    \n
  • max_e=0.2, # absolute max e
  • \n
  • max_e_deviation=2, # max in terms of sigma
  • \n
  • min_correlation=64, # 64 is RDI default
  • \n
  • maskbins : Array with booleans indexing into the ADCP bins. Use the\nconvenience method generate_binmask.
  • \n
  • pg_limit : float or int or None.\nPercent good limit applied prior to interpolating to the universal\ndepth grid in burst_average_ensembles.
  • \n
\n"}, "velosearaptor.madcp.ProcessADCP.__init__": {"fullname": "velosearaptor.madcp.ProcessADCP.__init__", "modulename": "velosearaptor.madcp", "qualname": "ProcessADCP.__init__", "kind": "function", "doc": "

\n", "signature": "(\traw_data,\tmeta_data,\tdriftparams=None,\ttgridparams=None,\tdgridparams=None,\teditparams=None,\tibad=None,\tlogdir='log',\tverbose=False,\tplot=False,\tpressure_scale_factor=1,\tmagdec=None,\tpressure=None)"}, "velosearaptor.madcp.ProcessADCP.meta_data": {"fullname": "velosearaptor.madcp.ProcessADCP.meta_data", "modulename": "velosearaptor.madcp", "qualname": "ProcessADCP.meta_data", "kind": "variable", "doc": "

\n"}, "velosearaptor.madcp.ProcessADCP.ibad": {"fullname": "velosearaptor.madcp.ProcessADCP.ibad", "modulename": "velosearaptor.madcp", "qualname": "ProcessADCP.ibad", "kind": "variable", "doc": "

\n"}, "velosearaptor.madcp.ProcessADCP.logdir": {"fullname": "velosearaptor.madcp.ProcessADCP.logdir", "modulename": "velosearaptor.madcp", "qualname": "ProcessADCP.logdir", "kind": "variable", "doc": "

\n"}, "velosearaptor.madcp.ProcessADCP.verbose": {"fullname": "velosearaptor.madcp.ProcessADCP.verbose", "modulename": "velosearaptor.madcp", "qualname": "ProcessADCP.verbose", "kind": "variable", "doc": "

\n"}, "velosearaptor.madcp.ProcessADCP.parse_file_locations": {"fullname": "velosearaptor.madcp.ProcessADCP.parse_file_locations", "modulename": "velosearaptor.madcp", "qualname": "ProcessADCP.parse_file_locations", "kind": "function", "doc": "

Parse input for raw data files.

\n\n

Input can either be a single file name as a str, a single file as a\nPath instance, a list of either of these, or a Path instance pointing to a\ndirectory with raw ADCP files. In the latter case, files that are\nsmaller than a threshold will not be included in the processing.

\n\n

Outputs to attribute files. The output can be fed to Multiread instances.

\n\n
Parameters
\n\n
    \n
  • raw_data (str or list or Path):\nLocation(s) of raw data.
  • \n
  • min_file_size (int):\nMinimum size for file to be included. Defaults to 1e4 which\ncorresponds to about 10kB and is a good value for excluding small\nfiles without any actual data.
  • \n
\n", "signature": "(self, raw_data, min_file_size=10000.0):", "funcdef": "def"}, "velosearaptor.madcp.ProcessADCP.default_dgridparams": {"fullname": "velosearaptor.madcp.ProcessADCP.default_dgridparams", "modulename": "velosearaptor.madcp", "qualname": "ProcessADCP.default_dgridparams", "kind": "variable", "doc": "

Determine default depth gridding parameters.

\n\n

The grid is centered on the median depth of the ADCP (plus distance to\nthe center of the first bin) to avoid unnecessary binning into\nneighboring depth cells. The default size of the depth bins mimicks the\nsize of ADCP bins.

\n"}, "velosearaptor.madcp.ProcessADCP.parse_dgridparams": {"fullname": "velosearaptor.madcp.ProcessADCP.parse_dgridparams", "modulename": "velosearaptor.madcp", "qualname": "ProcessADCP.parse_dgridparams", "kind": "function", "doc": "

Parse depth gridding parameters.

\n\n

See top level class notes for more info.

\n\n
Parameters
\n\n
    \n
  • dgridparams (dict):
  • \n
\n", "signature": "(self, dgridparams):", "funcdef": "def"}, "velosearaptor.madcp.ProcessADCP.parse_tgridparams": {"fullname": "velosearaptor.madcp.ProcessADCP.parse_tgridparams", "modulename": "velosearaptor.madcp", "qualname": "ProcessADCP.parse_tgridparams", "kind": "function", "doc": "

Parse time gridding parameters.

\n\n

See top level class notes for more info.

\n\n
Parameters
\n\n
    \n
  • tgridparams (dict):
  • \n
\n", "signature": "(self, tgridparams):", "funcdef": "def"}, "velosearaptor.madcp.ProcessADCP.parse_editparams": {"fullname": "velosearaptor.madcp.ProcessADCP.parse_editparams", "modulename": "velosearaptor.madcp", "qualname": "ProcessADCP.parse_editparams", "kind": "function", "doc": "

Parse editing parameters.

\n\n

See top level class notes for more info.

\n\n
Parameters
\n\n
    \n
  • editparams (dict):
  • \n
\n", "signature": "(self, editparams):", "funcdef": "def"}, "velosearaptor.madcp.ProcessADCP.parse_driftparams": {"fullname": "velosearaptor.madcp.ProcessADCP.parse_driftparams", "modulename": "velosearaptor.madcp", "qualname": "ProcessADCP.parse_driftparams", "kind": "function", "doc": "

Parse time drift parameters.

\n\n

See top level class notes for more info.

\n\n
Parameters
\n\n
    \n
  • driftparams (dict):
  • \n
\n", "signature": "(self, driftparams):", "funcdef": "def"}, "velosearaptor.madcp.ProcessADCP.make_start_ddays": {"fullname": "velosearaptor.madcp.ProcessADCP.make_start_ddays", "modulename": "velosearaptor.madcp", "qualname": "ProcessADCP.make_start_ddays", "kind": "function", "doc": "

Generate time stamps for ping averaging.

\n\n
Notes
\n\n

If turning on burst averaging, other input values will be ignored and\nthe averaging interval will be determined from the burst sampling\nscheme apparent in the ping pattern.

\n", "signature": "(self):", "funcdef": "def"}, "velosearaptor.madcp.ProcessADCP.read_ensemble": {"fullname": "velosearaptor.madcp.ProcessADCP.read_ensemble", "modulename": "velosearaptor.madcp", "qualname": "ProcessADCP.read_ensemble", "kind": "function", "doc": "

Read ensembles (several individual pings grouped together).

\n\n
Parameters
\n\n
    \n
  • iens (int):\nIndex into ensemble start times (they are generated in\nmake_start_ddays()).
  • \n
\n\n
Returns
\n\n
    \n
  • dat (pycurrents.adcp.rdiraw.Bunch):\nDictionary with data.
  • \n
\n\n
Raises
\n\n
    \n
  • ValueError: If iens is too large to index into start_ddays.
  • \n
\n", "signature": "(self, iens):", "funcdef": "def"}, "velosearaptor.madcp.ProcessADCP.magdec": {"fullname": "velosearaptor.madcp.ProcessADCP.magdec", "modulename": "velosearaptor.madcp", "qualname": "ProcessADCP.magdec", "kind": "variable", "doc": "

Magnetic declination.

\n\n

If not provided as input argument magdec is calculated using\nmagdec\n(must be installed) based on lon and lat.

\n"}, "velosearaptor.madcp.ProcessADCP.raw": {"fullname": "velosearaptor.madcp.ProcessADCP.raw", "modulename": "velosearaptor.madcp", "qualname": "ProcessADCP.raw", "kind": "variable", "doc": "

Raw ADCP data.

\n"}, "velosearaptor.madcp.ProcessADCP.process_pings": {"fullname": "velosearaptor.madcp.ProcessADCP.process_pings", "modulename": "velosearaptor.madcp", "qualname": "ProcessADCP.process_pings", "kind": "function", "doc": "

Process single ping data without averaging.

\n\n

Adds results as dictionary under ave and as xarray.Dataset under ds.

\n\n

Writes processing parameters to the log file.

\n\n
Parameters
\n\n
    \n
  • start (int, optional):\nStart processing at this ping number.
  • \n
  • stop (int, optional):\nStop processing at this ping number.
  • \n
  • binmap (bool, optional):\nDo binmapping of along-beam data.
  • \n
  • ens_size (int, optional):\nPings are processed in ensembles to reduce memory usage.\nThis parameter sets how many pings are in an ensemble. The default is 50000.
  • \n
\n", "signature": "(self, start=None, stop=None, binmap=False, ens_size=50000):", "funcdef": "def"}, "velosearaptor.madcp.ProcessADCP.average_ensembles": {"fullname": "velosearaptor.madcp.ProcessADCP.average_ensembles", "modulename": "velosearaptor.madcp", "qualname": "ProcessADCP.average_ensembles", "kind": "function", "doc": "

Time-averaging.

\n\n

Adds results as dictionary under ave and as xarray.Dataset under ds.

\n\n

Writes processing parameters to the log file.

\n\n
Parameters
\n\n
    \n
  • start (int):\nRange start for averaging. Index into start times of averaging\nintervals.
  • \n
  • stop (int):\nRange start for averaging. Index into start times of averaging\nintervals.
  • \n
\n", "signature": "(self, start=None, stop=None):", "funcdef": "def"}, "velosearaptor.madcp.ProcessADCP.burst_average_ensembles": {"fullname": "velosearaptor.madcp.ProcessADCP.burst_average_ensembles", "modulename": "velosearaptor.madcp", "qualname": "ProcessADCP.burst_average_ensembles", "kind": "function", "doc": "

Time-averaging prior to depth-gridding.

\n\n

Uses pre-defined editing parameters that can be updated with\nparse_editparams.

\n\n

Adds results as dictionary under ave and as xarray.Dataset under ds.

\n\n

Writes processing parameters to the log file.

\n\n
Parameters
\n\n
    \n
  • start (int, optional):\nRange start for averaging. Index into start times of averaging\nintervals. Defaults to None (start at beginning).
  • \n
  • stop (int, optional):\nRange start for averaging. Index into start times of averaging\nintervals. Defaults to None (start at beginning).
  • \n
  • interpolate_bin (int or None, optional):\nInterpolate over a single, previously masked, bin. Defaults to None (no interpolation).
  • \n
\n", "signature": "(self, start=None, stop=None, interpolate_bin=None):", "funcdef": "def"}, "velosearaptor.madcp.ProcessADCP.plot_echo_stats": {"fullname": "velosearaptor.madcp.ProcessADCP.plot_echo_stats", "modulename": "velosearaptor.madcp", "qualname": "ProcessADCP.plot_echo_stats", "kind": "function", "doc": "

Plot beam statistics (correlation and amplitude) from raw ADCP data.

\n", "signature": "(self):", "funcdef": "def"}, "velosearaptor.madcp.ProcessADCP.plot_pressure": {"fullname": "velosearaptor.madcp.ProcessADCP.plot_pressure", "modulename": "velosearaptor.madcp", "qualname": "ProcessADCP.plot_pressure", "kind": "function", "doc": "

Plot pressure time series and mark time at depth.

\n", "signature": "(self):", "funcdef": "def"}, "velosearaptor.madcp.ProcessADCP.generate_binmask": {"fullname": "velosearaptor.madcp.ProcessADCP.generate_binmask", "modulename": "velosearaptor.madcp", "qualname": "ProcessADCP.generate_binmask", "kind": "function", "doc": "

\n", "signature": "(self, indices):", "funcdef": "def"}, "velosearaptor.madcp.ProcessADCPyml": {"fullname": "velosearaptor.madcp.ProcessADCPyml", "modulename": "velosearaptor.madcp", "qualname": "ProcessADCPyml", "kind": "class", "doc": "

Moored ADCP processing with parameters provided via .yml file.

\n\n

An example parameter file is included at\nnotebooks/parameters.yml

\n", "bases": "ProcessADCP"}, "velosearaptor.madcp.ProcessADCPyml.__init__": {"fullname": "velosearaptor.madcp.ProcessADCPyml.__init__", "modulename": "velosearaptor.madcp", "qualname": "ProcessADCPyml.__init__", "kind": "function", "doc": "

\n", "signature": "(parameter_file, mooring, sn, **kwargs)"}}, "docInfo": {"velosearaptor": {"qualname": 0, "fullname": 1, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 1068}, "velosearaptor.adcp": {"qualname": 0, "fullname": 2, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 9}, "velosearaptor.adcp.plot_raw_adcp": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 33, "bases": 0, "doc": 49}, "velosearaptor.adcp.plot_raw_adcp_auxillary": {"qualname": 4, "fullname": 6, "annotation": 0, "default_value": 0, "signature": 33, "bases": 0, "doc": 52}, "velosearaptor.io": {"qualname": 0, "fullname": 2, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 9}, "velosearaptor.io.read_raw_rdi": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 22, "bases": 0, "doc": 84}, "velosearaptor.io.read_raw_rdi_uh": {"qualname": 4, "fullname": 6, "annotation": 0, "default_value": 0, "signature": 22, "bases": 0, "doc": 54}, "velosearaptor.io.extract_raw_rdi": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 40, "bases": 0, "doc": 88}, "velosearaptor.io.yday0_to_datetime64": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 16, "bases": 0, "doc": 60}, "velosearaptor.io.parse_yaml_input": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 21, "bases": 0, "doc": 174}, "velosearaptor.io.cf_conventions": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 7, "bases": 0, "doc": 78}, "velosearaptor.madcp": {"qualname": 0, "fullname": 2, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 254}, "velosearaptor.madcp.logger": {"qualname": 1, "fullname": 3, "annotation": 0, "default_value": 8, "signature": 0, "bases": 0, "doc": 3}, "velosearaptor.madcp.ProcessADCP": {"qualname": 1, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 1103}, "velosearaptor.madcp.ProcessADCP.__init__": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 145, "bases": 0, "doc": 3}, "velosearaptor.madcp.ProcessADCP.meta_data": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "velosearaptor.madcp.ProcessADCP.ibad": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "velosearaptor.madcp.ProcessADCP.logdir": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "velosearaptor.madcp.ProcessADCP.verbose": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 3}, "velosearaptor.madcp.ProcessADCP.parse_file_locations": {"qualname": 4, "fullname": 6, "annotation": 0, "default_value": 0, "signature": 30, "bases": 0, "doc": 146}, "velosearaptor.madcp.ProcessADCP.default_dgridparams": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 52}, "velosearaptor.madcp.ProcessADCP.parse_dgridparams": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 16, "bases": 0, "doc": 32}, "velosearaptor.madcp.ProcessADCP.parse_tgridparams": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 16, "bases": 0, "doc": 32}, "velosearaptor.madcp.ProcessADCP.parse_editparams": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 16, "bases": 0, "doc": 31}, "velosearaptor.madcp.ProcessADCP.parse_driftparams": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 16, "bases": 0, "doc": 32}, "velosearaptor.madcp.ProcessADCP.make_start_ddays": {"qualname": 4, "fullname": 6, "annotation": 0, "default_value": 0, "signature": 11, "bases": 0, "doc": 43}, "velosearaptor.madcp.ProcessADCP.read_ensemble": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 16, "bases": 0, "doc": 88}, "velosearaptor.madcp.ProcessADCP.magdec": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 33}, "velosearaptor.madcp.ProcessADCP.raw": {"qualname": 2, "fullname": 4, "annotation": 0, "default_value": 0, "signature": 0, "bases": 0, "doc": 6}, "velosearaptor.madcp.ProcessADCP.process_pings": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 52, "bases": 0, "doc": 125}, "velosearaptor.madcp.ProcessADCP.average_ensembles": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 31, "bases": 0, "doc": 81}, "velosearaptor.madcp.ProcessADCP.burst_average_ensembles": {"qualname": 4, "fullname": 6, "annotation": 0, "default_value": 0, "signature": 42, "bases": 0, "doc": 140}, "velosearaptor.madcp.ProcessADCP.plot_echo_stats": {"qualname": 4, "fullname": 6, "annotation": 0, "default_value": 0, "signature": 11, "bases": 0, "doc": 13}, "velosearaptor.madcp.ProcessADCP.plot_pressure": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 11, "bases": 0, "doc": 12}, "velosearaptor.madcp.ProcessADCP.generate_binmask": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 16, "bases": 0, "doc": 3}, "velosearaptor.madcp.ProcessADCPyml": {"qualname": 1, "fullname": 3, "annotation": 0, "default_value": 0, "signature": 0, "bases": 1, "doc": 27}, "velosearaptor.madcp.ProcessADCPyml.__init__": {"qualname": 3, "fullname": 5, "annotation": 0, "default_value": 0, "signature": 27, "bases": 0, "doc": 3}}, "length": 37, "save": true}, "index": {"qualname": {"root": {"docs": {"velosearaptor.madcp.ProcessADCP.__init__": {"tf": 1}, "velosearaptor.madcp.ProcessADCPyml.__init__": {"tf": 1}}, "df": 2, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "t": {"docs": {"velosearaptor.adcp.plot_raw_adcp": {"tf": 1}, "velosearaptor.adcp.plot_raw_adcp_auxillary": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.plot_echo_stats": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.plot_pressure": {"tf": 1}}, "df": 4}}}, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {"velosearaptor.io.parse_yaml_input": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.parse_file_locations": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.parse_dgridparams": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.parse_tgridparams": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.parse_editparams": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.parse_driftparams": {"tf": 1}}, "df": 6}}}}, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "s": {"docs": {"velosearaptor.madcp.ProcessADCP.process_pings": {"tf": 1}}, "df": 1, "a": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "p": {"docs": {"velosearaptor.madcp.ProcessADCP": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.__init__": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.meta_data": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.ibad": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.logdir": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.verbose": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.parse_file_locations": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.default_dgridparams": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.parse_dgridparams": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.parse_tgridparams": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.parse_editparams": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.parse_driftparams": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.make_start_ddays": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.read_ensemble": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.magdec": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.raw": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.process_pings": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.average_ensembles": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.burst_average_ensembles": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.plot_echo_stats": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.plot_pressure": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.generate_binmask": {"tf": 1}}, "df": 22, "y": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "l": {"docs": {"velosearaptor.madcp.ProcessADCPyml": {"tf": 1}, "velosearaptor.madcp.ProcessADCPyml.__init__": {"tf": 1}}, "df": 2}}}}}}}}}}}}, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {"velosearaptor.madcp.ProcessADCP.plot_pressure": {"tf": 1}}, "df": 1}}}}}}}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "s": {"docs": {"velosearaptor.madcp.ProcessADCP.process_pings": {"tf": 1}}, "df": 1}}}}}, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "w": {"docs": {"velosearaptor.adcp.plot_raw_adcp": {"tf": 1}, "velosearaptor.adcp.plot_raw_adcp_auxillary": {"tf": 1}, "velosearaptor.io.read_raw_rdi": {"tf": 1}, "velosearaptor.io.read_raw_rdi_uh": {"tf": 1}, "velosearaptor.io.extract_raw_rdi": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.raw": {"tf": 1}}, "df": 6}}, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "d": {"docs": {"velosearaptor.io.read_raw_rdi": {"tf": 1}, "velosearaptor.io.read_raw_rdi_uh": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.read_ensemble": {"tf": 1}}, "df": 3}}}, "d": {"docs": {}, "df": 0, "i": {"docs": {"velosearaptor.io.read_raw_rdi": {"tf": 1}, "velosearaptor.io.read_raw_rdi_uh": {"tf": 1}, "velosearaptor.io.extract_raw_rdi": {"tf": 1}}, "df": 3}}}, "a": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "p": {"docs": {"velosearaptor.adcp.plot_raw_adcp": {"tf": 1}, "velosearaptor.adcp.plot_raw_adcp_auxillary": {"tf": 1}}, "df": 2}}}, "u": {"docs": {}, "df": 0, "x": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "y": {"docs": {"velosearaptor.adcp.plot_raw_adcp_auxillary": {"tf": 1}}, "df": 1}}}}}}}}, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "e": {"docs": {"velosearaptor.madcp.ProcessADCP.average_ensembles": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.burst_average_ensembles": {"tf": 1}}, "df": 2}}}}}}}, "u": {"docs": {}, "df": 0, "h": {"docs": {"velosearaptor.io.read_raw_rdi_uh": {"tf": 1}}, "df": 1}}, "e": {"docs": {}, "df": 0, "x": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {"velosearaptor.io.extract_raw_rdi": {"tf": 1}}, "df": 1}}}}}}, "d": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "s": {"docs": {"velosearaptor.madcp.ProcessADCP.parse_editparams": {"tf": 1}}, "df": 1}}}}}}}}}, "n": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"velosearaptor.madcp.ProcessADCP.read_ensemble": {"tf": 1}}, "df": 1, "s": {"docs": {"velosearaptor.madcp.ProcessADCP.average_ensembles": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.burst_average_ensembles": {"tf": 1}}, "df": 2}}}}}}}}, "c": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "o": {"docs": {"velosearaptor.madcp.ProcessADCP.plot_echo_stats": {"tf": 1}}, "df": 1}}}}, "y": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "y": {"0": {"docs": {"velosearaptor.io.yday0_to_datetime64": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}}}, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "l": {"docs": {"velosearaptor.io.parse_yaml_input": {"tf": 1}}, "df": 1}}}}, "t": {"docs": {}, "df": 0, "o": {"docs": {"velosearaptor.io.yday0_to_datetime64": {"tf": 1}}, "df": 1}, "g": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "s": {"docs": {"velosearaptor.madcp.ProcessADCP.parse_tgridparams": {"tf": 1}}, "df": 1}}}}}}}}}}}, "d": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"6": {"4": {"docs": {"velosearaptor.io.yday0_to_datetime64": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}}}}}, "a": {"docs": {"velosearaptor.madcp.ProcessADCP.meta_data": {"tf": 1}}, "df": 1}}}, "e": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "t": {"docs": {"velosearaptor.madcp.ProcessADCP.default_dgridparams": {"tf": 1}}, "df": 1}}}}}}, "g": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "s": {"docs": {"velosearaptor.madcp.ProcessADCP.default_dgridparams": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.parse_dgridparams": {"tf": 1}}, "df": 2}}}}}}}}}}, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "s": {"docs": {"velosearaptor.madcp.ProcessADCP.parse_driftparams": {"tf": 1}}, "df": 1}}}}}}}}}}, "d": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "s": {"docs": {"velosearaptor.madcp.ProcessADCP.make_start_ddays": {"tf": 1}}, "df": 1}}}}}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "t": {"docs": {"velosearaptor.io.parse_yaml_input": {"tf": 1}}, "df": 1}}}, "i": {"docs": {}, "df": 0, "t": {"docs": {"velosearaptor.madcp.ProcessADCP.__init__": {"tf": 1}, "velosearaptor.madcp.ProcessADCPyml.__init__": {"tf": 1}}, "df": 2}}}, "b": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "d": {"docs": {"velosearaptor.madcp.ProcessADCP.ibad": {"tf": 1}}, "df": 1}}}}, "c": {"docs": {}, "df": 0, "f": {"docs": {"velosearaptor.io.cf_conventions": {"tf": 1}}, "df": 1}, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {"velosearaptor.io.cf_conventions": {"tf": 1}}, "df": 1}}}}}}}}}}}, "l": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"velosearaptor.madcp.logger": {"tf": 1}}, "df": 1}}}, "d": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "r": {"docs": {"velosearaptor.madcp.ProcessADCP.logdir": {"tf": 1}}, "df": 1}}}}, "c": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {"velosearaptor.madcp.ProcessADCP.parse_file_locations": {"tf": 1}}, "df": 1}}}}}}}}}, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "a": {"docs": {"velosearaptor.madcp.ProcessADCP.meta_data": {"tf": 1}}, "df": 1}}}, "a": {"docs": {}, "df": 0, "k": {"docs": {}, "df": 0, "e": {"docs": {"velosearaptor.madcp.ProcessADCP.make_start_ddays": {"tf": 1}}, "df": 1}}, "g": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "c": {"docs": {"velosearaptor.madcp.ProcessADCP.magdec": {"tf": 1}}, "df": 1}}}}}}, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {"velosearaptor.madcp.ProcessADCP.verbose": {"tf": 1}}, "df": 1}}}}}}}, "f": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"velosearaptor.madcp.ProcessADCP.parse_file_locations": {"tf": 1}}, "df": 1}}}}, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "t": {"docs": {"velosearaptor.madcp.ProcessADCP.make_start_ddays": {"tf": 1}}, "df": 1}}, "t": {"docs": {}, "df": 0, "s": {"docs": {"velosearaptor.madcp.ProcessADCP.plot_echo_stats": {"tf": 1}}, "df": 1}}}}}, "b": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {"velosearaptor.madcp.ProcessADCP.burst_average_ensembles": {"tf": 1}}, "df": 1}}}}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "k": {"docs": {"velosearaptor.madcp.ProcessADCP.generate_binmask": {"tf": 1}}, "df": 1}}}}}}}, "g": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"velosearaptor.madcp.ProcessADCP.generate_binmask": {"tf": 1}}, "df": 1}}}}}}}}}}, "fullname": {"root": {"docs": {"velosearaptor.madcp.ProcessADCP.__init__": {"tf": 1}, "velosearaptor.madcp.ProcessADCPyml.__init__": {"tf": 1}}, "df": 2, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {"velosearaptor": {"tf": 1}, "velosearaptor.adcp": {"tf": 1}, "velosearaptor.adcp.plot_raw_adcp": {"tf": 1}, "velosearaptor.adcp.plot_raw_adcp_auxillary": {"tf": 1}, "velosearaptor.io": {"tf": 1}, "velosearaptor.io.read_raw_rdi": {"tf": 1}, "velosearaptor.io.read_raw_rdi_uh": {"tf": 1}, "velosearaptor.io.extract_raw_rdi": {"tf": 1}, "velosearaptor.io.yday0_to_datetime64": {"tf": 1}, "velosearaptor.io.parse_yaml_input": {"tf": 1}, "velosearaptor.io.cf_conventions": {"tf": 1}, "velosearaptor.madcp": {"tf": 1}, "velosearaptor.madcp.logger": {"tf": 1}, "velosearaptor.madcp.ProcessADCP": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.__init__": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.meta_data": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.ibad": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.logdir": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.verbose": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.parse_file_locations": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.default_dgridparams": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.parse_dgridparams": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.parse_tgridparams": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.parse_editparams": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.parse_driftparams": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.make_start_ddays": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.read_ensemble": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.magdec": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.raw": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.process_pings": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.average_ensembles": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.burst_average_ensembles": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.plot_echo_stats": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.plot_pressure": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.generate_binmask": {"tf": 1}, "velosearaptor.madcp.ProcessADCPyml": {"tf": 1}, "velosearaptor.madcp.ProcessADCPyml.__init__": {"tf": 1}}, "df": 37}}}}}}}}}}}, "r": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {"velosearaptor.madcp.ProcessADCP.verbose": {"tf": 1}}, "df": 1}}}}}}}, "a": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "p": {"docs": {"velosearaptor.adcp": {"tf": 1}, "velosearaptor.adcp.plot_raw_adcp": {"tf": 1.4142135623730951}, "velosearaptor.adcp.plot_raw_adcp_auxillary": {"tf": 1.4142135623730951}}, "df": 3}}}, "u": {"docs": {}, "df": 0, "x": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "y": {"docs": {"velosearaptor.adcp.plot_raw_adcp_auxillary": {"tf": 1}}, "df": 1}}}}}}}}, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "e": {"docs": {"velosearaptor.madcp.ProcessADCP.average_ensembles": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.burst_average_ensembles": {"tf": 1}}, "df": 2}}}}}}}, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "t": {"docs": {"velosearaptor.adcp.plot_raw_adcp": {"tf": 1}, "velosearaptor.adcp.plot_raw_adcp_auxillary": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.plot_echo_stats": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.plot_pressure": {"tf": 1}}, "df": 4}}}, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {"velosearaptor.io.parse_yaml_input": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.parse_file_locations": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.parse_dgridparams": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.parse_tgridparams": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.parse_editparams": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.parse_driftparams": {"tf": 1}}, "df": 6}}}}, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "s": {"docs": {"velosearaptor.madcp.ProcessADCP.process_pings": {"tf": 1}}, "df": 1, "a": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "p": {"docs": {"velosearaptor.madcp.ProcessADCP": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.__init__": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.meta_data": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.ibad": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.logdir": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.verbose": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.parse_file_locations": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.default_dgridparams": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.parse_dgridparams": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.parse_tgridparams": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.parse_editparams": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.parse_driftparams": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.make_start_ddays": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.read_ensemble": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.magdec": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.raw": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.process_pings": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.average_ensembles": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.burst_average_ensembles": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.plot_echo_stats": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.plot_pressure": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.generate_binmask": {"tf": 1}}, "df": 22, "y": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "l": {"docs": {"velosearaptor.madcp.ProcessADCPyml": {"tf": 1}, "velosearaptor.madcp.ProcessADCPyml.__init__": {"tf": 1}}, "df": 2}}}}}}}}}}}}, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {"velosearaptor.madcp.ProcessADCP.plot_pressure": {"tf": 1}}, "df": 1}}}}}}}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "s": {"docs": {"velosearaptor.madcp.ProcessADCP.process_pings": {"tf": 1}}, "df": 1}}}}}, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "w": {"docs": {"velosearaptor.adcp.plot_raw_adcp": {"tf": 1}, "velosearaptor.adcp.plot_raw_adcp_auxillary": {"tf": 1}, "velosearaptor.io.read_raw_rdi": {"tf": 1}, "velosearaptor.io.read_raw_rdi_uh": {"tf": 1}, "velosearaptor.io.extract_raw_rdi": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.raw": {"tf": 1}}, "df": 6}}, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "d": {"docs": {"velosearaptor.io.read_raw_rdi": {"tf": 1}, "velosearaptor.io.read_raw_rdi_uh": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.read_ensemble": {"tf": 1}}, "df": 3}}}, "d": {"docs": {}, "df": 0, "i": {"docs": {"velosearaptor.io.read_raw_rdi": {"tf": 1}, "velosearaptor.io.read_raw_rdi_uh": {"tf": 1}, "velosearaptor.io.extract_raw_rdi": {"tf": 1}}, "df": 3}}}, "i": {"docs": {}, "df": 0, "o": {"docs": {"velosearaptor.io": {"tf": 1}, "velosearaptor.io.read_raw_rdi": {"tf": 1}, "velosearaptor.io.read_raw_rdi_uh": {"tf": 1}, "velosearaptor.io.extract_raw_rdi": {"tf": 1}, "velosearaptor.io.yday0_to_datetime64": {"tf": 1}, "velosearaptor.io.parse_yaml_input": {"tf": 1}, "velosearaptor.io.cf_conventions": {"tf": 1}}, "df": 7}, "n": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "t": {"docs": {"velosearaptor.io.parse_yaml_input": {"tf": 1}}, "df": 1}}}, "i": {"docs": {}, "df": 0, "t": {"docs": {"velosearaptor.madcp.ProcessADCP.__init__": {"tf": 1}, "velosearaptor.madcp.ProcessADCPyml.__init__": {"tf": 1}}, "df": 2}}}, "b": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "d": {"docs": {"velosearaptor.madcp.ProcessADCP.ibad": {"tf": 1}}, "df": 1}}}}, "u": {"docs": {}, "df": 0, "h": {"docs": {"velosearaptor.io.read_raw_rdi_uh": {"tf": 1}}, "df": 1}}, "e": {"docs": {}, "df": 0, "x": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {"velosearaptor.io.extract_raw_rdi": {"tf": 1}}, "df": 1}}}}}}, "d": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "s": {"docs": {"velosearaptor.madcp.ProcessADCP.parse_editparams": {"tf": 1}}, "df": 1}}}}}}}}}, "n": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"velosearaptor.madcp.ProcessADCP.read_ensemble": {"tf": 1}}, "df": 1, "s": {"docs": {"velosearaptor.madcp.ProcessADCP.average_ensembles": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.burst_average_ensembles": {"tf": 1}}, "df": 2}}}}}}}}, "c": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "o": {"docs": {"velosearaptor.madcp.ProcessADCP.plot_echo_stats": {"tf": 1}}, "df": 1}}}}, "y": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "y": {"0": {"docs": {"velosearaptor.io.yday0_to_datetime64": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}}}, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "l": {"docs": {"velosearaptor.io.parse_yaml_input": {"tf": 1}}, "df": 1}}}}, "t": {"docs": {}, "df": 0, "o": {"docs": {"velosearaptor.io.yday0_to_datetime64": {"tf": 1}}, "df": 1}, "g": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "s": {"docs": {"velosearaptor.madcp.ProcessADCP.parse_tgridparams": {"tf": 1}}, "df": 1}}}}}}}}}}}, "d": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"6": {"4": {"docs": {"velosearaptor.io.yday0_to_datetime64": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}}}}}, "a": {"docs": {"velosearaptor.madcp.ProcessADCP.meta_data": {"tf": 1}}, "df": 1}}}, "e": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "t": {"docs": {"velosearaptor.madcp.ProcessADCP.default_dgridparams": {"tf": 1}}, "df": 1}}}}}}, "g": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "s": {"docs": {"velosearaptor.madcp.ProcessADCP.default_dgridparams": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.parse_dgridparams": {"tf": 1}}, "df": 2}}}}}}}}}}, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "s": {"docs": {"velosearaptor.madcp.ProcessADCP.parse_driftparams": {"tf": 1}}, "df": 1}}}}}}}}}}, "d": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "s": {"docs": {"velosearaptor.madcp.ProcessADCP.make_start_ddays": {"tf": 1}}, "df": 1}}}}}, "c": {"docs": {}, "df": 0, "f": {"docs": {"velosearaptor.io.cf_conventions": {"tf": 1}}, "df": 1}, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {"velosearaptor.io.cf_conventions": {"tf": 1}}, "df": 1}}}}}}}}}}}, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "p": {"docs": {"velosearaptor.madcp": {"tf": 1}, "velosearaptor.madcp.logger": {"tf": 1}, "velosearaptor.madcp.ProcessADCP": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.__init__": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.meta_data": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.ibad": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.logdir": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.verbose": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.parse_file_locations": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.default_dgridparams": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.parse_dgridparams": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.parse_tgridparams": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.parse_editparams": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.parse_driftparams": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.make_start_ddays": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.read_ensemble": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.magdec": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.raw": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.process_pings": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.average_ensembles": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.burst_average_ensembles": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.plot_echo_stats": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.plot_pressure": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.generate_binmask": {"tf": 1}, "velosearaptor.madcp.ProcessADCPyml": {"tf": 1}, "velosearaptor.madcp.ProcessADCPyml.__init__": {"tf": 1}}, "df": 26}}}, "k": {"docs": {}, "df": 0, "e": {"docs": {"velosearaptor.madcp.ProcessADCP.make_start_ddays": {"tf": 1}}, "df": 1}}, "g": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "c": {"docs": {"velosearaptor.madcp.ProcessADCP.magdec": {"tf": 1}}, "df": 1}}}}}, "e": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "a": {"docs": {"velosearaptor.madcp.ProcessADCP.meta_data": {"tf": 1}}, "df": 1}}}}, "l": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"velosearaptor.madcp.logger": {"tf": 1}}, "df": 1}}}, "d": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "r": {"docs": {"velosearaptor.madcp.ProcessADCP.logdir": {"tf": 1}}, "df": 1}}}}, "c": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {"velosearaptor.madcp.ProcessADCP.parse_file_locations": {"tf": 1}}, "df": 1}}}}}}}}}, "f": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"velosearaptor.madcp.ProcessADCP.parse_file_locations": {"tf": 1}}, "df": 1}}}}, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "t": {"docs": {"velosearaptor.madcp.ProcessADCP.make_start_ddays": {"tf": 1}}, "df": 1}}, "t": {"docs": {}, "df": 0, "s": {"docs": {"velosearaptor.madcp.ProcessADCP.plot_echo_stats": {"tf": 1}}, "df": 1}}}}}, "b": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {"velosearaptor.madcp.ProcessADCP.burst_average_ensembles": {"tf": 1}}, "df": 1}}}}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "k": {"docs": {"velosearaptor.madcp.ProcessADCP.generate_binmask": {"tf": 1}}, "df": 1}}}}}}}, "g": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"velosearaptor.madcp.ProcessADCP.generate_binmask": {"tf": 1}}, "df": 1}}}}}}}}}}, "annotation": {"root": {"docs": {}, "df": 0}}, "default_value": {"root": {"docs": {"velosearaptor.madcp.logger": {"tf": 1.4142135623730951}}, "df": 1, "l": {"docs": {}, "df": 0, "t": {"docs": {"velosearaptor.madcp.logger": {"tf": 1}}, "df": 1}, "o": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"velosearaptor.madcp.logger": {"tf": 1}}, "df": 1}}}}}}, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {"velosearaptor.madcp.logger": {"tf": 1}}, "df": 1}}}}}}}}}}}}}, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "p": {"docs": {"velosearaptor.madcp.logger": {"tf": 1}}, "df": 1}}}}}, "w": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"velosearaptor.madcp.logger": {"tf": 1}}, "df": 1}}}}}}}, "g": {"docs": {}, "df": 0, "t": {"docs": {"velosearaptor.madcp.logger": {"tf": 1}}, "df": 1}}}}, "signature": {"root": {"0": {"docs": {"velosearaptor.madcp.ProcessADCP.parse_file_locations": {"tf": 1}}, "df": 1}, "1": {"0": {"0": {"0": {"0": {"docs": {"velosearaptor.madcp.ProcessADCP.parse_file_locations": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "2": {"docs": {"velosearaptor.adcp.plot_raw_adcp_auxillary": {"tf": 1}}, "df": 1}, "7": {"docs": {"velosearaptor.adcp.plot_raw_adcp": {"tf": 1}}, "df": 1}, "docs": {"velosearaptor.madcp.ProcessADCP.__init__": {"tf": 1}}, "df": 1}, "2": {"0": {"docs": {"velosearaptor.adcp.plot_raw_adcp": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "3": {"9": {"docs": {"velosearaptor.io.extract_raw_rdi": {"tf": 1.4142135623730951}, "velosearaptor.madcp.ProcessADCP.__init__": {"tf": 1.4142135623730951}}, "df": 2}, "docs": {}, "df": 0}, "5": {"0": {"0": {"0": {"0": {"docs": {"velosearaptor.madcp.ProcessADCP.process_pings": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {"velosearaptor.adcp.plot_raw_adcp_auxillary": {"tf": 1}}, "df": 1}, "docs": {"velosearaptor.adcp.plot_raw_adcp": {"tf": 5.385164807134504}, "velosearaptor.adcp.plot_raw_adcp_auxillary": {"tf": 5.385164807134504}, "velosearaptor.io.read_raw_rdi": {"tf": 4.242640687119285}, "velosearaptor.io.read_raw_rdi_uh": {"tf": 4.242640687119285}, "velosearaptor.io.extract_raw_rdi": {"tf": 5.656854249492381}, "velosearaptor.io.yday0_to_datetime64": {"tf": 3.7416573867739413}, "velosearaptor.io.parse_yaml_input": {"tf": 4.242640687119285}, "velosearaptor.io.cf_conventions": {"tf": 2.6457513110645907}, "velosearaptor.madcp.ProcessADCP.__init__": {"tf": 10.723805294763608}, "velosearaptor.madcp.ProcessADCP.parse_file_locations": {"tf": 4.69041575982343}, "velosearaptor.madcp.ProcessADCP.parse_dgridparams": {"tf": 3.7416573867739413}, "velosearaptor.madcp.ProcessADCP.parse_tgridparams": {"tf": 3.7416573867739413}, "velosearaptor.madcp.ProcessADCP.parse_editparams": {"tf": 3.7416573867739413}, "velosearaptor.madcp.ProcessADCP.parse_driftparams": {"tf": 3.7416573867739413}, "velosearaptor.madcp.ProcessADCP.make_start_ddays": {"tf": 3.1622776601683795}, "velosearaptor.madcp.ProcessADCP.read_ensemble": {"tf": 3.7416573867739413}, "velosearaptor.madcp.ProcessADCP.process_pings": {"tf": 6.48074069840786}, "velosearaptor.madcp.ProcessADCP.average_ensembles": {"tf": 5.0990195135927845}, "velosearaptor.madcp.ProcessADCP.burst_average_ensembles": {"tf": 5.830951894845301}, "velosearaptor.madcp.ProcessADCP.plot_echo_stats": {"tf": 3.1622776601683795}, "velosearaptor.madcp.ProcessADCP.plot_pressure": {"tf": 3.1622776601683795}, "velosearaptor.madcp.ProcessADCP.generate_binmask": {"tf": 3.7416573867739413}, "velosearaptor.madcp.ProcessADCPyml.__init__": {"tf": 4.69041575982343}}, "df": 23, "a": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "p": {"docs": {"velosearaptor.adcp.plot_raw_adcp": {"tf": 1}, "velosearaptor.adcp.plot_raw_adcp_auxillary": {"tf": 1}}, "df": 2}}}, "u": {"docs": {}, "df": 0, "x": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "y": {"docs": {"velosearaptor.io.read_raw_rdi": {"tf": 1}, "velosearaptor.io.read_raw_rdi_uh": {"tf": 1}}, "df": 2}}}}}}}}}, "f": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "z": {"docs": {}, "df": 0, "e": {"docs": {"velosearaptor.adcp.plot_raw_adcp": {"tf": 1}, "velosearaptor.adcp.plot_raw_adcp_auxillary": {"tf": 1}}, "df": 2}}}}}, "l": {"docs": {}, "df": 0, "e": {"docs": {"velosearaptor.io.read_raw_rdi": {"tf": 1}, "velosearaptor.io.read_raw_rdi_uh": {"tf": 1}, "velosearaptor.io.extract_raw_rdi": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.parse_file_locations": {"tf": 1}, "velosearaptor.madcp.ProcessADCPyml.__init__": {"tf": 1}}, "df": 5}}}, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {"velosearaptor.io.read_raw_rdi": {"tf": 1}, "velosearaptor.io.read_raw_rdi_uh": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.__init__": {"tf": 1.4142135623730951}, "velosearaptor.madcp.ProcessADCP.process_pings": {"tf": 1}}, "df": 4}}}, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {"velosearaptor.madcp.ProcessADCP.__init__": {"tf": 1}}, "df": 1}}}}}}, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "y": {"docs": {"velosearaptor.io.read_raw_rdi": {"tf": 1}, "velosearaptor.io.read_raw_rdi_uh": {"tf": 1}}, "df": 2}}}, "u": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"velosearaptor.io.extract_raw_rdi": {"tf": 1}}, "df": 1}}}}}}}, "i": {"0": {"docs": {"velosearaptor.io.extract_raw_rdi": {"tf": 1}}, "df": 1}, "1": {"docs": {"velosearaptor.io.extract_raw_rdi": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {"velosearaptor.io.extract_raw_rdi": {"tf": 1}}, "df": 1}}, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"velosearaptor.madcp.ProcessADCP.burst_average_ensembles": {"tf": 1}}, "df": 1}}}}}}}}}, "d": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"velosearaptor.madcp.ProcessADCP.generate_binmask": {"tf": 1}}, "df": 1}}}}}}, "b": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "d": {"docs": {"velosearaptor.madcp.ProcessADCP.__init__": {"tf": 1}}, "df": 1}}}, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {"velosearaptor.madcp.ProcessADCP.read_ensemble": {"tf": 1}}, "df": 1}}}}, "w": {"docs": {}, "df": 0, "h": {"docs": {"velosearaptor.io.extract_raw_rdi": {"tf": 1}}, "df": 1}}, "b": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {"velosearaptor.io.yday0_to_datetime64": {"tf": 1}}, "df": 1}}}}}}}, "i": {"docs": {}, "df": 0, "n": {"docs": {"velosearaptor.madcp.ProcessADCP.burst_average_ensembles": {"tf": 1}}, "df": 1, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "p": {"docs": {"velosearaptor.madcp.ProcessADCP.process_pings": {"tf": 1}}, "df": 1}}}}}}, "y": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "y": {"docs": {"velosearaptor.io.yday0_to_datetime64": {"tf": 1}}, "df": 1}}}, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"velosearaptor.io.parse_yaml_input": {"tf": 1}}, "df": 1}}}}}}}}, "m": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"velosearaptor.io.parse_yaml_input": {"tf": 1}, "velosearaptor.madcp.ProcessADCPyml.__init__": {"tf": 1}}, "df": 2}}}}}}, "e": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "a": {"docs": {"velosearaptor.madcp.ProcessADCP.__init__": {"tf": 1}}, "df": 1}}}, "a": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "c": {"docs": {"velosearaptor.madcp.ProcessADCP.__init__": {"tf": 1}}, "df": 1}}}}}, "i": {"docs": {}, "df": 0, "n": {"docs": {"velosearaptor.madcp.ProcessADCP.parse_file_locations": {"tf": 1}}, "df": 1}}}, "s": {"docs": {}, "df": 0, "n": {"docs": {"velosearaptor.io.parse_yaml_input": {"tf": 1}, "velosearaptor.madcp.ProcessADCPyml.__init__": {"tf": 1}}, "df": 2}, "c": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"velosearaptor.madcp.ProcessADCP.__init__": {"tf": 1}}, "df": 1}}}}, "e": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "f": {"docs": {"velosearaptor.madcp.ProcessADCP.parse_file_locations": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.parse_dgridparams": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.parse_tgridparams": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.parse_editparams": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.parse_driftparams": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.make_start_ddays": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.read_ensemble": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.process_pings": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.average_ensembles": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.burst_average_ensembles": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.plot_echo_stats": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.plot_pressure": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.generate_binmask": {"tf": 1}}, "df": 13}}}, "i": {"docs": {}, "df": 0, "z": {"docs": {}, "df": 0, "e": {"docs": {"velosearaptor.madcp.ProcessADCP.parse_file_locations": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.process_pings": {"tf": 1}}, "df": 2}}}, "t": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "t": {"docs": {"velosearaptor.madcp.ProcessADCP.process_pings": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.average_ensembles": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.burst_average_ensembles": {"tf": 1}}, "df": 3}}}, "o": {"docs": {}, "df": 0, "p": {"docs": {"velosearaptor.madcp.ProcessADCP.process_pings": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.average_ensembles": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.burst_average_ensembles": {"tf": 1}}, "df": 3}}}}, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "w": {"docs": {"velosearaptor.madcp.ProcessADCP.__init__": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.parse_file_locations": {"tf": 1}}, "df": 2}}}, "d": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "a": {"docs": {"velosearaptor.madcp.ProcessADCP.__init__": {"tf": 1.4142135623730951}, "velosearaptor.madcp.ProcessADCP.parse_file_locations": {"tf": 1}}, "df": 2}}}, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "s": {"docs": {"velosearaptor.madcp.ProcessADCP.__init__": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.parse_driftparams": {"tf": 1}}, "df": 2}}}}}}}}}}, "g": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "s": {"docs": {"velosearaptor.madcp.ProcessADCP.__init__": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.parse_dgridparams": {"tf": 1}}, "df": 2}}}}}}}}}}}, "n": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {"velosearaptor.madcp.ProcessADCP.__init__": {"tf": 2.6457513110645907}, "velosearaptor.madcp.ProcessADCP.process_pings": {"tf": 1.4142135623730951}, "velosearaptor.madcp.ProcessADCP.average_ensembles": {"tf": 1.4142135623730951}, "velosearaptor.madcp.ProcessADCP.burst_average_ensembles": {"tf": 1.7320508075688772}}, "df": 4}}}}, "t": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "s": {"docs": {"velosearaptor.madcp.ProcessADCP.__init__": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.parse_tgridparams": {"tf": 1}}, "df": 2}}}}}}}}}}}, "e": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "s": {"docs": {"velosearaptor.madcp.ProcessADCP.__init__": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.parse_editparams": {"tf": 1}}, "df": 2}}}}}}}}}, "n": {"docs": {}, "df": 0, "s": {"docs": {"velosearaptor.madcp.ProcessADCP.process_pings": {"tf": 1}}, "df": 1}}}, "l": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "g": {"docs": {"velosearaptor.madcp.ProcessADCP.__init__": {"tf": 1}}, "df": 1, "d": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "r": {"docs": {"velosearaptor.madcp.ProcessADCP.__init__": {"tf": 1}}, "df": 1}}}}}}, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {"velosearaptor.madcp.ProcessADCP.__init__": {"tf": 1}}, "df": 1}}}}}}}, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "t": {"docs": {"velosearaptor.madcp.ProcessADCP.__init__": {"tf": 1}}, "df": 1}}}, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {"velosearaptor.madcp.ProcessADCP.__init__": {"tf": 1.4142135623730951}}, "df": 1}}}}}}}, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"velosearaptor.madcp.ProcessADCPyml.__init__": {"tf": 1}}, "df": 1}}}}}}}}}, "k": {"docs": {}, "df": 0, "w": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "s": {"docs": {"velosearaptor.madcp.ProcessADCPyml.__init__": {"tf": 1}}, "df": 1}}}}}}}}, "bases": {"root": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "p": {"docs": {"velosearaptor.madcp.ProcessADCPyml": {"tf": 1}}, "df": 1}}}}}}}}}}}}}, "doc": {"root": {"0": {"4": {"docs": {"velosearaptor": {"tf": 1}}, "df": 1}, "docs": {"velosearaptor": {"tf": 1.4142135623730951}, "velosearaptor.io.yday0_to_datetime64": {"tf": 1}, "velosearaptor.madcp.ProcessADCP": {"tf": 1.4142135623730951}}, "df": 3}, "1": {"0": {"docs": {}, "df": 0, "k": {"docs": {}, "df": 0, "b": {"docs": {"velosearaptor.madcp.ProcessADCP.parse_file_locations": {"tf": 1}}, "df": 1}}}, "7": {"docs": {"velosearaptor.adcp.plot_raw_adcp": {"tf": 1}, "velosearaptor.adcp.plot_raw_adcp_auxillary": {"tf": 1}}, "df": 2}, "docs": {"velosearaptor": {"tf": 1}, "velosearaptor.io.cf_conventions": {"tf": 1}}, "df": 2, "e": {"4": {"docs": {"velosearaptor.madcp.ProcessADCP.parse_file_locations": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}}, "2": {"0": {"2": {"0": {"docs": {"velosearaptor": {"tf": 1}}, "df": 1}, "2": {"docs": {"velosearaptor": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {"velosearaptor.adcp.plot_raw_adcp": {"tf": 1}, "velosearaptor.adcp.plot_raw_adcp_auxillary": {"tf": 1}}, "df": 2}, "8": {"docs": {"velosearaptor": {"tf": 1}}, "df": 1}, "docs": {"velosearaptor": {"tf": 1}, "velosearaptor.madcp.ProcessADCP": {"tf": 1.4142135623730951}}, "df": 2, "d": {"docs": {"velosearaptor.io.read_raw_rdi": {"tf": 1}}, "df": 1}}, "3": {"docs": {"velosearaptor.io.cf_conventions": {"tf": 1}}, "df": 1}, "5": {"0": {"0": {"0": {"0": {"docs": {"velosearaptor.madcp.ProcessADCP.process_pings": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0}, "docs": {}, "df": 0, "h": {"docs": {"velosearaptor.madcp.ProcessADCP": {"tf": 1}}, "df": 1}, "m": {"docs": {"velosearaptor.madcp.ProcessADCP": {"tf": 1}}, "df": 1}}, "6": {"4": {"docs": {"velosearaptor.madcp.ProcessADCP": {"tf": 1.4142135623730951}}, "df": 1}, "docs": {}, "df": 0}, "docs": {"velosearaptor": {"tf": 19.131126469708992}, "velosearaptor.adcp": {"tf": 1.4142135623730951}, "velosearaptor.adcp.plot_raw_adcp": {"tf": 4.58257569495584}, "velosearaptor.adcp.plot_raw_adcp_auxillary": {"tf": 4.58257569495584}, "velosearaptor.io": {"tf": 1.7320508075688772}, "velosearaptor.io.read_raw_rdi": {"tf": 5.744562646538029}, "velosearaptor.io.read_raw_rdi_uh": {"tf": 5}, "velosearaptor.io.extract_raw_rdi": {"tf": 6.244997998398398}, "velosearaptor.io.yday0_to_datetime64": {"tf": 5.477225575051661}, "velosearaptor.io.parse_yaml_input": {"tf": 8.774964387392123}, "velosearaptor.io.cf_conventions": {"tf": 5.385164807134504}, "velosearaptor.madcp": {"tf": 7.615773105863909}, "velosearaptor.madcp.logger": {"tf": 1.7320508075688772}, "velosearaptor.madcp.ProcessADCP": {"tf": 19.261360284258224}, "velosearaptor.madcp.ProcessADCP.__init__": {"tf": 1.7320508075688772}, "velosearaptor.madcp.ProcessADCP.meta_data": {"tf": 1.7320508075688772}, "velosearaptor.madcp.ProcessADCP.ibad": {"tf": 1.7320508075688772}, "velosearaptor.madcp.ProcessADCP.logdir": {"tf": 1.7320508075688772}, "velosearaptor.madcp.ProcessADCP.verbose": {"tf": 1.7320508075688772}, "velosearaptor.madcp.ProcessADCP.parse_file_locations": {"tf": 5.385164807134504}, "velosearaptor.madcp.ProcessADCP.default_dgridparams": {"tf": 2.449489742783178}, "velosearaptor.madcp.ProcessADCP.parse_dgridparams": {"tf": 4.123105625617661}, "velosearaptor.madcp.ProcessADCP.parse_tgridparams": {"tf": 4.123105625617661}, "velosearaptor.madcp.ProcessADCP.parse_editparams": {"tf": 4.123105625617661}, "velosearaptor.madcp.ProcessADCP.parse_driftparams": {"tf": 4.123105625617661}, "velosearaptor.madcp.ProcessADCP.make_start_ddays": {"tf": 2.8284271247461903}, "velosearaptor.madcp.ProcessADCP.read_ensemble": {"tf": 6.708203932499369}, "velosearaptor.madcp.ProcessADCP.magdec": {"tf": 3.4641016151377544}, "velosearaptor.madcp.ProcessADCP.raw": {"tf": 1.7320508075688772}, "velosearaptor.madcp.ProcessADCP.process_pings": {"tf": 6.708203932499369}, "velosearaptor.madcp.ProcessADCP.average_ensembles": {"tf": 5.744562646538029}, "velosearaptor.madcp.ProcessADCP.burst_average_ensembles": {"tf": 6.6332495807108}, "velosearaptor.madcp.ProcessADCP.plot_echo_stats": {"tf": 1.7320508075688772}, "velosearaptor.madcp.ProcessADCP.plot_pressure": {"tf": 1.7320508075688772}, "velosearaptor.madcp.ProcessADCP.generate_binmask": {"tf": 1.7320508075688772}, "velosearaptor.madcp.ProcessADCPyml": {"tf": 3}, "velosearaptor.madcp.ProcessADCPyml.__init__": {"tf": 1.7320508075688772}}, "df": 37, "v": {"0": {"docs": {"velosearaptor": {"tf": 1.7320508075688772}}, "df": 1}, "docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "l": {"docs": {"velosearaptor": {"tf": 1.4142135623730951}}, "df": 1, "o": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {"velosearaptor": {"tf": 4.242640687119285}, "velosearaptor.adcp": {"tf": 1}, "velosearaptor.adcp.plot_raw_adcp": {"tf": 1}, "velosearaptor.adcp.plot_raw_adcp_auxillary": {"tf": 1}, "velosearaptor.io": {"tf": 1}, "velosearaptor.madcp": {"tf": 1}}, "df": 6}}}}}}}}}, "c": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "y": {"docs": {"velosearaptor.madcp.ProcessADCP": {"tf": 1}}, "df": 1}}}}}}, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {"velosearaptor.madcp": {"tf": 1.4142135623730951}}, "df": 1}}}}, "r": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {"velosearaptor.madcp.ProcessADCP": {"tf": 1}}, "df": 1}}}}, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {"velosearaptor.madcp.ProcessADCP": {"tf": 1}}, "df": 1}}}}}}}, "i": {"docs": {}, "df": 0, "a": {"docs": {"velosearaptor": {"tf": 2}, "velosearaptor.madcp.ProcessADCP": {"tf": 2.449489742783178}, "velosearaptor.madcp.ProcessADCPyml": {"tf": 1}}, "df": 3}}, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"velosearaptor.madcp.ProcessADCP": {"tf": 1}}, "df": 1, "s": {"docs": {"velosearaptor": {"tf": 1}}, "df": 1}}}}}, "o": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "s": {"docs": {"velosearaptor.madcp.ProcessADCP": {"tf": 1}}, "df": 1}}}}}, "l": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "e": {"docs": {"velosearaptor.madcp.ProcessADCP.parse_file_locations": {"tf": 1}}, "df": 1, "s": {"docs": {"velosearaptor.madcp.ProcessADCP": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.make_start_ddays": {"tf": 1}}, "df": 2}, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {"velosearaptor.madcp.ProcessADCP.read_ensemble": {"tf": 1}}, "df": 1}}}}}}}}}, "o": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {"velosearaptor": {"tf": 1}}, "df": 1}}}}, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "y": {"docs": {"velosearaptor": {"tf": 1}}, "df": 1}}}}}, "k": {"docs": {}, "df": 0, "e": {"docs": {"velosearaptor": {"tf": 1.4142135623730951}}, "df": 1}}, "n": {"docs": {}, "df": 0, "k": {"docs": {"velosearaptor": {"tf": 1}}, "df": 1}, "e": {"docs": {"velosearaptor.madcp.ProcessADCP": {"tf": 1}}, "df": 1, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "y": {"docs": {"velosearaptor.madcp.ProcessADCP": {"tf": 1}}, "df": 1}}}}}}, "s": {"docs": {}, "df": 0, "t": {"docs": {"velosearaptor.io.read_raw_rdi": {"tf": 1}, "velosearaptor.madcp.ProcessADCP": {"tf": 2}, "velosearaptor.madcp.ProcessADCP.parse_file_locations": {"tf": 1.4142135623730951}}, "df": 3}}, "m": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {"velosearaptor.madcp.ProcessADCP": {"tf": 1.4142135623730951}}, "df": 1}}}}, "o": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "k": {"docs": {"velosearaptor": {"tf": 1}}, "df": 1}}, "c": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "y": {"docs": {"velosearaptor": {"tf": 1}}, "df": 1}}}, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"velosearaptor.madcp.ProcessADCP": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.parse_file_locations": {"tf": 1}}, "df": 2}}}}}}, "t": {"docs": {}, "df": 0, "s": {"docs": {"velosearaptor": {"tf": 1.4142135623730951}}, "df": 1}}, "g": {"docs": {"velosearaptor": {"tf": 1}, "velosearaptor.madcp.ProcessADCP": {"tf": 1.7320508075688772}, "velosearaptor.madcp.ProcessADCP.process_pings": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.average_ensembles": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.burst_average_ensembles": {"tf": 1}}, "df": 5, "d": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "r": {"docs": {"velosearaptor.madcp.ProcessADCP": {"tf": 1}}, "df": 1}}}}, "n": {"docs": {"velosearaptor.madcp.ProcessADCP": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.magdec": {"tf": 1}}, "df": 2, "g": {"docs": {"velosearaptor.madcp": {"tf": 1}}, "df": 1}}}, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "e": {"docs": {"velosearaptor": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.read_ensemble": {"tf": 1}}, "df": 2}}}, "t": {"docs": {"velosearaptor.madcp.ProcessADCP": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.magdec": {"tf": 1}}, "df": 2, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"velosearaptor.madcp": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.parse_file_locations": {"tf": 1}}, "df": 2}}}}}, "e": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "y": {"docs": {"velosearaptor": {"tf": 1}}, "df": 1}}}}, "n": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {"velosearaptor.madcp": {"tf": 1}}, "df": 1}}}}, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "l": {"docs": {"velosearaptor.madcp.ProcessADCP.parse_dgridparams": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.parse_tgridparams": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.parse_editparams": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.parse_driftparams": {"tf": 1}}, "df": 4}}}}}, "o": {"docs": {}, "df": 0, "f": {"docs": {"velosearaptor": {"tf": 3.7416573867739413}, "velosearaptor.io.read_raw_rdi": {"tf": 1}, "velosearaptor.io.extract_raw_rdi": {"tf": 1.4142135623730951}, "velosearaptor.io.parse_yaml_input": {"tf": 1}, "velosearaptor.madcp": {"tf": 2.23606797749979}, "velosearaptor.madcp.ProcessADCP": {"tf": 3.7416573867739413}, "velosearaptor.madcp.ProcessADCP.parse_file_locations": {"tf": 1.7320508075688772}, "velosearaptor.madcp.ProcessADCP.default_dgridparams": {"tf": 2}, "velosearaptor.madcp.ProcessADCP.process_pings": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.average_ensembles": {"tf": 1.4142135623730951}, "velosearaptor.madcp.ProcessADCP.burst_average_ensembles": {"tf": 1.4142135623730951}}, "df": 11}, "r": {"docs": {"velosearaptor": {"tf": 1.4142135623730951}, "velosearaptor.io.read_raw_rdi": {"tf": 1.7320508075688772}, "velosearaptor.io.read_raw_rdi_uh": {"tf": 1}, "velosearaptor.io.extract_raw_rdi": {"tf": 1.4142135623730951}, "velosearaptor.io.parse_yaml_input": {"tf": 1}, "velosearaptor.madcp": {"tf": 1}, "velosearaptor.madcp.ProcessADCP": {"tf": 2.8284271247461903}, "velosearaptor.madcp.ProcessADCP.parse_file_locations": {"tf": 1.7320508075688772}, "velosearaptor.madcp.ProcessADCP.burst_average_ensembles": {"tf": 1}}, "df": 9, "i": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"velosearaptor": {"tf": 1}, "velosearaptor.madcp.ProcessADCP": {"tf": 1.4142135623730951}}, "df": 2}}}}}}}}}, "g": {"docs": {}, "df": 0, "/": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "/": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "f": {"docs": {"velosearaptor.io.cf_conventions": {"tf": 1}}, "df": 1}}}}}}}, "c": {"docs": {}, "df": 0, "f": {"docs": {"velosearaptor.io.cf_conventions": {"tf": 1}}, "df": 1}}, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"velosearaptor.io.cf_conventions": {"tf": 1}}, "df": 1}}}}}}}}}}}}, "u": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "t": {"docs": {"velosearaptor": {"tf": 1.7320508075688772}, "velosearaptor.io.extract_raw_rdi": {"tf": 1}, "velosearaptor.madcp": {"tf": 1}, "velosearaptor.madcp.ProcessADCP": {"tf": 1.4142135623730951}, "velosearaptor.madcp.ProcessADCP.parse_file_locations": {"tf": 1}}, "df": 5, "s": {"docs": {"velosearaptor.madcp.ProcessADCP.parse_file_locations": {"tf": 1}}, "df": 1}}}}, "s": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {"velosearaptor": {"tf": 1}}, "df": 1}}}}, "f": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"velosearaptor.io.extract_raw_rdi": {"tf": 1}}, "df": 1}}}}}}, "n": {"docs": {"velosearaptor": {"tf": 2}, "velosearaptor.madcp": {"tf": 1}, "velosearaptor.madcp.ProcessADCP": {"tf": 2}, "velosearaptor.madcp.ProcessADCP.default_dgridparams": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.make_start_ddays": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.magdec": {"tf": 1}}, "df": 6, "l": {"docs": {}, "df": 0, "y": {"docs": {"velosearaptor": {"tf": 1}, "velosearaptor.adcp.plot_raw_adcp_auxillary": {"tf": 1}, "velosearaptor.io.read_raw_rdi": {"tf": 1}}, "df": 3}}, "e": {"docs": {"velosearaptor.io.extract_raw_rdi": {"tf": 1}, "velosearaptor.madcp.ProcessADCP": {"tf": 2}}, "df": 2}, "c": {"docs": {}, "df": 0, "e": {"docs": {"velosearaptor.madcp.ProcessADCP": {"tf": 1.7320508075688772}}, "df": 1}}}, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"velosearaptor": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.make_start_ddays": {"tf": 1}}, "df": 2}}}}, "s": {"docs": {"velosearaptor.io.extract_raw_rdi": {"tf": 1}}, "df": 1, "x": {"docs": {"velosearaptor": {"tf": 1}}, "df": 1}}, "p": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {"velosearaptor.madcp.ProcessADCP": {"tf": 3}, "velosearaptor.madcp.ProcessADCP.process_pings": {"tf": 2}, "velosearaptor.madcp.ProcessADCP.burst_average_ensembles": {"tf": 1.7320508075688772}}, "df": 3, "l": {"docs": {}, "df": 0, "y": {"docs": {"velosearaptor": {"tf": 1}}, "df": 1}}}}, "s": {"docs": {"velosearaptor.madcp": {"tf": 1}}, "df": 1}}}}}}, "b": {"docs": {}, "df": 0, "j": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {"velosearaptor.madcp": {"tf": 1}}, "df": 1, "s": {"docs": {"velosearaptor": {"tf": 1}}, "df": 1}}}}}}, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"velosearaptor": {"tf": 1}, "velosearaptor.madcp.ProcessADCP": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.burst_average_ensembles": {"tf": 1}}, "df": 3}}}}, "p": {"docs": {}, "df": 0, "y": {"docs": {"velosearaptor": {"tf": 1}}, "df": 1, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"velosearaptor": {"tf": 1}}, "df": 1}}}}, "c": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "s": {"docs": {"velosearaptor": {"tf": 2}, "velosearaptor.io.read_raw_rdi_uh": {"tf": 1}, "velosearaptor.madcp": {"tf": 1}, "velosearaptor.madcp.ProcessADCP": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.read_ensemble": {"tf": 1}}, "df": 5}}}}}}}}}, "r": {"1": {"2": {"docs": {"velosearaptor": {"tf": 1}}, "df": 1}, "3": {"docs": {"velosearaptor": {"tf": 1}}, "df": 1}, "7": {"docs": {"velosearaptor": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "2": {"1": {"docs": {"velosearaptor": {"tf": 1}}, "df": 1}, "6": {"docs": {"velosearaptor": {"tf": 1.7320508075688772}}, "df": 1}, "7": {"docs": {"velosearaptor": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "4": {"3": {"docs": {"velosearaptor": {"tf": 1}}, "df": 1}, "4": {"docs": {"velosearaptor": {"tf": 1.4142135623730951}}, "df": 1}, "8": {"docs": {"velosearaptor": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "5": {"5": {"docs": {"velosearaptor": {"tf": 1}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "c": {"docs": {"velosearaptor": {"tf": 1}}, "df": 1, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "s": {"docs": {"velosearaptor": {"tf": 1}, "velosearaptor.madcp": {"tf": 1.7320508075688772}, "velosearaptor.madcp.ProcessADCP.process_pings": {"tf": 1}}, "df": 3, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"velosearaptor": {"tf": 2}, "velosearaptor.madcp": {"tf": 2}, "velosearaptor.madcp.ProcessADCP": {"tf": 2.23606797749979}, "velosearaptor.madcp.ProcessADCP.parse_file_locations": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.process_pings": {"tf": 1.7320508075688772}, "velosearaptor.madcp.ProcessADCP.average_ensembles": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.burst_average_ensembles": {"tf": 1}, "velosearaptor.madcp.ProcessADCPyml": {"tf": 1}}, "df": 8}}}, "a": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "p": {"docs": {"velosearaptor": {"tf": 2.8284271247461903}, "velosearaptor.madcp": {"tf": 2}, "velosearaptor.madcp.ProcessADCP": {"tf": 1.4142135623730951}}, "df": 3, "y": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "l": {"docs": {"velosearaptor.madcp": {"tf": 1}}, "df": 1}}}}}}}, "e": {"docs": {}, "df": 0, "d": {"docs": {"velosearaptor": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.process_pings": {"tf": 1}}, "df": 2}}}}}}, "v": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {"velosearaptor.adcp.plot_raw_adcp": {"tf": 1}, "velosearaptor.adcp.plot_raw_adcp_auxillary": {"tf": 1}, "velosearaptor.madcp.ProcessADCP": {"tf": 2.23606797749979}}, "df": 3, "s": {"docs": {"velosearaptor": {"tf": 1}}, "df": 1}, "d": {"docs": {"velosearaptor": {"tf": 1.4142135623730951}, "velosearaptor.madcp.ProcessADCP": {"tf": 1.7320508075688772}, "velosearaptor.madcp.ProcessADCP.magdec": {"tf": 1}, "velosearaptor.madcp.ProcessADCPyml": {"tf": 1}}, "df": 4}}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"velosearaptor.madcp.ProcessADCP": {"tf": 1}}, "df": 1}}}}}}, "f": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"velosearaptor.madcp": {"tf": 1}}, "df": 1}}}}}}, "d": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"velosearaptor.madcp.ProcessADCP": {"tf": 1}}, "df": 1}}}}}}, "e": {"docs": {"velosearaptor.madcp.ProcessADCP.burst_average_ensembles": {"tf": 1}}, "df": 1, "s": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {"velosearaptor": {"tf": 1.4142135623730951}, "velosearaptor.madcp.ProcessADCP": {"tf": 1.4142135623730951}, "velosearaptor.madcp.ProcessADCP.plot_pressure": {"tf": 1}}, "df": 3}}}}, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"velosearaptor.io.parse_yaml_input": {"tf": 1}}, "df": 1}}}}, "p": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"velosearaptor.io.parse_yaml_input": {"tf": 1}}, "df": 1}}}}}}, "v": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "y": {"docs": {"velosearaptor.madcp.ProcessADCP.burst_average_ensembles": {"tf": 1}}, "df": 1}}}}}}}}, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {"velosearaptor": {"tf": 1.4142135623730951}, "velosearaptor.madcp.ProcessADCP": {"tf": 1.4142135623730951}, "velosearaptor.madcp.ProcessADCP.burst_average_ensembles": {"tf": 1}}, "df": 3}}, "n": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"velosearaptor.madcp.ProcessADCP": {"tf": 1}}, "df": 1}}}}}}}}}, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "k": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "e": {"docs": {"velosearaptor": {"tf": 2.8284271247461903}}, "df": 1}}}}}, "r": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "s": {"docs": {"velosearaptor": {"tf": 1}}, "df": 1}}, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"velosearaptor.io.parse_yaml_input": {"tf": 2}, "velosearaptor.madcp.ProcessADCP.process_pings": {"tf": 1}, "velosearaptor.madcp.ProcessADCPyml": {"tf": 1}}, "df": 3, "s": {"docs": {"velosearaptor": {"tf": 1.4142135623730951}, "velosearaptor.adcp.plot_raw_adcp": {"tf": 1}, "velosearaptor.adcp.plot_raw_adcp_auxillary": {"tf": 1}, "velosearaptor.io.read_raw_rdi": {"tf": 1}, "velosearaptor.io.read_raw_rdi_uh": {"tf": 1}, "velosearaptor.io.extract_raw_rdi": {"tf": 1}, "velosearaptor.io.yday0_to_datetime64": {"tf": 1}, "velosearaptor.io.parse_yaml_input": {"tf": 2.23606797749979}, "velosearaptor.madcp": {"tf": 1.4142135623730951}, "velosearaptor.madcp.ProcessADCP": {"tf": 4}, "velosearaptor.madcp.ProcessADCP.parse_file_locations": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.default_dgridparams": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.parse_dgridparams": {"tf": 1.4142135623730951}, "velosearaptor.madcp.ProcessADCP.parse_tgridparams": {"tf": 1.4142135623730951}, "velosearaptor.madcp.ProcessADCP.parse_editparams": {"tf": 1.4142135623730951}, "velosearaptor.madcp.ProcessADCP.parse_driftparams": {"tf": 1.4142135623730951}, "velosearaptor.madcp.ProcessADCP.read_ensemble": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.process_pings": {"tf": 1.4142135623730951}, "velosearaptor.madcp.ProcessADCP.average_ensembles": {"tf": 1.4142135623730951}, "velosearaptor.madcp.ProcessADCP.burst_average_ensembles": {"tf": 1.7320508075688772}, "velosearaptor.madcp.ProcessADCPyml": {"tf": 1}}, "df": 21}}}}}}}, "s": {"docs": {}, "df": 0, "e": {"docs": {"velosearaptor.io.parse_yaml_input": {"tf": 1}, "velosearaptor.madcp.ProcessADCP": {"tf": 1.7320508075688772}, "velosearaptor.madcp.ProcessADCP.parse_file_locations": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.parse_dgridparams": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.parse_tgridparams": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.parse_editparams": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.parse_driftparams": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.burst_average_ensembles": {"tf": 1}}, "df": 8}}}, "t": {"docs": {}, "df": 0, "h": {"docs": {"velosearaptor.io.read_raw_rdi": {"tf": 1.7320508075688772}, "velosearaptor.io.read_raw_rdi_uh": {"tf": 1.4142135623730951}, "velosearaptor.io.extract_raw_rdi": {"tf": 1.7320508075688772}, "velosearaptor.io.parse_yaml_input": {"tf": 1.4142135623730951}, "velosearaptor.madcp": {"tf": 1}, "velosearaptor.madcp.ProcessADCP": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.parse_file_locations": {"tf": 1.7320508075688772}}, "df": 7, "s": {"docs": {"velosearaptor": {"tf": 1}}, "df": 1}, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "b": {"docs": {"velosearaptor": {"tf": 1}, "velosearaptor.io.parse_yaml_input": {"tf": 1.4142135623730951}}, "df": 2}}}}, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "n": {"docs": {"velosearaptor.madcp.ProcessADCP.make_start_ddays": {"tf": 1}}, "df": 1}}}}}, "s": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"velosearaptor.madcp.ProcessADCP": {"tf": 1}}, "df": 1}}}}}, "i": {"docs": {}, "df": 0, "p": {"docs": {"velosearaptor": {"tf": 1.4142135623730951}}, "df": 1, "/": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "a": {"docs": {"velosearaptor": {"tf": 1}}, "df": 1}}}}}}}, "t": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "h": {"docs": {"velosearaptor": {"tf": 1}}, "df": 1}}}, "n": {"docs": {}, "df": 0, "g": {"docs": {"velosearaptor.io.extract_raw_rdi": {"tf": 1.7320508075688772}, "velosearaptor.madcp": {"tf": 1}, "velosearaptor.madcp.ProcessADCP": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.make_start_ddays": {"tf": 1.4142135623730951}, "velosearaptor.madcp.ProcessADCP.process_pings": {"tf": 1.7320508075688772}}, "df": 5, "s": {"docs": {"velosearaptor": {"tf": 1.4142135623730951}, "velosearaptor.madcp": {"tf": 1.4142135623730951}, "velosearaptor.madcp.ProcessADCP": {"tf": 2.23606797749979}, "velosearaptor.madcp.ProcessADCP.read_ensemble": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.process_pings": {"tf": 1.4142135623730951}}, "df": 5}}}}, "o": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"velosearaptor": {"tf": 1}}, "df": 1}}}}, "x": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {"velosearaptor": {"tf": 1}}, "df": 1}}}}}}, "s": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "y": {"docs": {"velosearaptor.madcp": {"tf": 1}}, "df": 1}}}}}}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "s": {"docs": {"velosearaptor.madcp": {"tf": 1}}, "df": 1}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"velosearaptor.madcp.ProcessADCP": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.parse_file_locations": {"tf": 1}}, "df": 2}}}}}}}, "g": {"docs": {"velosearaptor": {"tf": 1}, "velosearaptor.madcp.ProcessADCP": {"tf": 1.4142135623730951}}, "df": 2}, "d": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "c": {"docs": {"velosearaptor": {"tf": 1}}, "df": 1}}, "f": {"docs": {"velosearaptor.madcp.ProcessADCP": {"tf": 1}}, "df": 1}}, "l": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "t": {"docs": {"velosearaptor.adcp.plot_raw_adcp": {"tf": 1}, "velosearaptor.adcp.plot_raw_adcp_auxillary": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.plot_echo_stats": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.plot_pressure": {"tf": 1}}, "df": 4}}, "u": {"docs": {}, "df": 0, "s": {"docs": {"velosearaptor.madcp.ProcessADCP.default_dgridparams": {"tf": 1}}, "df": 1}}}, "c": {"docs": {"velosearaptor.madcp.ProcessADCP": {"tf": 1.4142135623730951}}, "df": 1}, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"velosearaptor.madcp.ProcessADCP": {"tf": 1}}, "df": 1}}}}}}}, "m": {"docs": {"velosearaptor.madcp.ProcessADCP": {"tf": 2}}, "df": 1, "o": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"velosearaptor": {"tf": 1.7320508075688772}, "velosearaptor.adcp": {"tf": 1}, "velosearaptor.io": {"tf": 1}, "velosearaptor.madcp": {"tf": 1.4142135623730951}}, "df": 4, "s": {"docs": {"velosearaptor": {"tf": 1}}, "df": 1}}}}, "s": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "s": {"docs": {"velosearaptor": {"tf": 1.4142135623730951}}, "df": 1}}}}}}}, "e": {"docs": {"velosearaptor.madcp": {"tf": 1}}, "df": 1}}, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"velosearaptor": {"tf": 1.7320508075688772}, "velosearaptor.madcp": {"tf": 1.4142135623730951}, "velosearaptor.madcp.ProcessADCP": {"tf": 1}, "velosearaptor.madcp.ProcessADCPyml": {"tf": 1}}, "df": 4}}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"velosearaptor": {"tf": 1}, "velosearaptor.io.parse_yaml_input": {"tf": 1.4142135623730951}, "velosearaptor.madcp.ProcessADCP": {"tf": 1.4142135623730951}}, "df": 3}}}}}, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"velosearaptor": {"tf": 1.4142135623730951}}, "df": 1}}}, "r": {"docs": {}, "df": 0, "e": {"docs": {"velosearaptor.madcp": {"tf": 1}, "velosearaptor.madcp.ProcessADCP": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.parse_dgridparams": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.parse_tgridparams": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.parse_editparams": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.parse_driftparams": {"tf": 1}}, "df": 6}}, "n": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {"velosearaptor.madcp": {"tf": 1}}, "df": 1}}}}}}, "u": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "d": {"docs": {"velosearaptor": {"tf": 1}, "velosearaptor.io.read_raw_rdi_uh": {"tf": 1}, "velosearaptor.madcp.ProcessADCP": {"tf": 1.4142135623730951}, "velosearaptor.madcp.ProcessADCP.parse_file_locations": {"tf": 1}}, "df": 4}}}}}}}, "c": {"docs": {}, "df": 0, "h": {"docs": {"velosearaptor": {"tf": 1}}, "df": 1}}, "s": {"docs": {}, "df": 0, "t": {"docs": {"velosearaptor.madcp.ProcessADCP": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.magdec": {"tf": 1}}, "df": 2}}}, "a": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "p": {"docs": {"velosearaptor": {"tf": 3.4641016151377544}, "velosearaptor.madcp": {"tf": 1}}, "df": 2}}}, "n": {"docs": {}, "df": 0, "y": {"docs": {"velosearaptor": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.process_pings": {"tf": 1}}, "df": 2}, "a": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"velosearaptor": {"tf": 1}}, "df": 1}}}}, "u": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {"velosearaptor.madcp": {"tf": 1}}, "df": 1}}}}, "g": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "c": {"docs": {"velosearaptor": {"tf": 2}, "velosearaptor.madcp.ProcessADCP": {"tf": 2}, "velosearaptor.madcp.ProcessADCP.magdec": {"tf": 1.4142135623730951}}, "df": 3}}}, "n": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "c": {"docs": {"velosearaptor.madcp.ProcessADCP": {"tf": 2}, "velosearaptor.madcp.ProcessADCP.magdec": {"tf": 1}}, "df": 2}}}}}}, "k": {"docs": {}, "df": 0, "e": {"docs": {"velosearaptor": {"tf": 1}, "velosearaptor.madcp.ProcessADCP": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.read_ensemble": {"tf": 1}}, "df": 3}}, "p": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"velosearaptor": {"tf": 1}}, "df": 1}}}}}, "j": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {"velosearaptor": {"tf": 1}}, "df": 1, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "y": {"docs": {"velosearaptor": {"tf": 1}}, "df": 1}}}}}}, "r": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "h": {"docs": {"velosearaptor": {"tf": 1}}, "df": 1}}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"velosearaptor.madcp": {"tf": 1}}, "df": 1}}}}, "k": {"docs": {"velosearaptor.madcp.ProcessADCP": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.plot_pressure": {"tf": 1}}, "df": 2}}, "y": {"docs": {"velosearaptor.madcp.ProcessADCP": {"tf": 1}}, "df": 1}, "x": {"docs": {"velosearaptor.madcp.ProcessADCP": {"tf": 2}}, "df": 1}, "s": {"docs": {}, "df": 0, "k": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {"velosearaptor.madcp.ProcessADCP": {"tf": 1}}, "df": 1}}}}, "e": {"docs": {}, "df": 0, "d": {"docs": {"velosearaptor.madcp.ProcessADCP.burst_average_ensembles": {"tf": 1}}, "df": 1}}}}}, "c": {"docs": {}, "df": 0, "m": {"docs": {"velosearaptor": {"tf": 1}}, "df": 1}}, "e": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "d": {"docs": {"velosearaptor": {"tf": 1}, "velosearaptor.madcp": {"tf": 1}, "velosearaptor.madcp.ProcessADCP": {"tf": 1.4142135623730951}}, "df": 3}}}, "a": {"docs": {"velosearaptor": {"tf": 1.7320508075688772}, "velosearaptor.io.parse_yaml_input": {"tf": 1.4142135623730951}, "velosearaptor.io.cf_conventions": {"tf": 1}, "velosearaptor.madcp.ProcessADCP": {"tf": 1.4142135623730951}}, "df": 4}}, "s": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"velosearaptor": {"tf": 1}}, "df": 1}}}}}}, "d": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "n": {"docs": {"velosearaptor.madcp.ProcessADCP.default_dgridparams": {"tf": 1}}, "df": 1}}}}, "m": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "y": {"docs": {"velosearaptor.madcp.ProcessADCP.process_pings": {"tf": 1}}, "df": 1}}}}}, "i": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"velosearaptor": {"tf": 1}}, "df": 1}}}}}, "d": {"docs": {"velosearaptor.madcp.ProcessADCP": {"tf": 1}}, "df": 1, "d": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"velosearaptor.madcp": {"tf": 1}}, "df": 1}}}}, "n": {"docs": {"velosearaptor.madcp.ProcessADCP": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.parse_file_locations": {"tf": 1}}, "df": 2, "i": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "m": {"docs": {"velosearaptor.madcp.ProcessADCP": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.parse_file_locations": {"tf": 1}}, "df": 2}}}}}, "m": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "k": {"docs": {}, "df": 0, "s": {"docs": {"velosearaptor.madcp.ProcessADCP.default_dgridparams": {"tf": 1}}, "df": 1}}}}}}}, "f": {"docs": {"velosearaptor": {"tf": 1.4142135623730951}}, "df": 1, "o": {"docs": {}, "df": 0, "r": {"docs": {"velosearaptor": {"tf": 3.7416573867739413}, "velosearaptor.io.read_raw_rdi_uh": {"tf": 1}, "velosearaptor.io.parse_yaml_input": {"tf": 1.4142135623730951}, "velosearaptor.io.cf_conventions": {"tf": 1.7320508075688772}, "velosearaptor.madcp": {"tf": 2}, "velosearaptor.madcp.ProcessADCP": {"tf": 3}, "velosearaptor.madcp.ProcessADCP.parse_file_locations": {"tf": 1.7320508075688772}, "velosearaptor.madcp.ProcessADCP.parse_dgridparams": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.parse_tgridparams": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.parse_editparams": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.parse_driftparams": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.make_start_ddays": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.average_ensembles": {"tf": 1.4142135623730951}, "velosearaptor.madcp.ProcessADCP.burst_average_ensembles": {"tf": 1.4142135623730951}}, "df": 14, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {"velosearaptor": {"tf": 1}, "velosearaptor.io.read_raw_rdi": {"tf": 1}, "velosearaptor.io.yday0_to_datetime64": {"tf": 1.4142135623730951}, "velosearaptor.madcp": {"tf": 1}, "velosearaptor.madcp.ProcessADCP": {"tf": 1}}, "df": 5}}, "e": {"docs": {}, "df": 0, "r": {"docs": {"velosearaptor.madcp": {"tf": 1}}, "df": 1}}}}, "u": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "d": {"docs": {"velosearaptor": {"tf": 1}}, "df": 1}}}, "l": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "w": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"velosearaptor.io.parse_yaml_input": {"tf": 1}}, "df": 1}}}}}}}}, "u": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"velosearaptor": {"tf": 1}, "velosearaptor.madcp": {"tf": 1}}, "df": 2, "s": {"docs": {"velosearaptor": {"tf": 2}, "velosearaptor.adcp": {"tf": 1}, "velosearaptor.io": {"tf": 1}, "velosearaptor.madcp": {"tf": 1}}, "df": 4}}}}}}}, "r": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"velosearaptor.io.cf_conventions": {"tf": 1}, "velosearaptor.madcp.ProcessADCP": {"tf": 1}}, "df": 2}}}}}}, "i": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"velosearaptor": {"tf": 1}}, "df": 1}}}}, "l": {"docs": {}, "df": 0, "d": {"docs": {"velosearaptor.madcp": {"tf": 1}}, "df": 1, "s": {"docs": {"velosearaptor.io.read_raw_rdi": {"tf": 1}}, "df": 1}}}}, "l": {"docs": {}, "df": 0, "e": {"docs": {"velosearaptor": {"tf": 1.7320508075688772}, "velosearaptor.io.read_raw_rdi": {"tf": 1.7320508075688772}, "velosearaptor.io.read_raw_rdi_uh": {"tf": 1.4142135623730951}, "velosearaptor.io.extract_raw_rdi": {"tf": 2.23606797749979}, "velosearaptor.io.parse_yaml_input": {"tf": 2.23606797749979}, "velosearaptor.madcp": {"tf": 1.4142135623730951}, "velosearaptor.madcp.ProcessADCP": {"tf": 1.7320508075688772}, "velosearaptor.madcp.ProcessADCP.parse_file_locations": {"tf": 2}, "velosearaptor.madcp.ProcessADCP.process_pings": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.average_ensembles": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.burst_average_ensembles": {"tf": 1}, "velosearaptor.madcp.ProcessADCPyml": {"tf": 1.4142135623730951}}, "df": 12, "s": {"docs": {"velosearaptor": {"tf": 1}, "velosearaptor.madcp.ProcessADCP": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.parse_file_locations": {"tf": 2.23606797749979}}, "df": 3}, "b": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "w": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "s": {"docs": {"velosearaptor.madcp": {"tf": 1}}, "df": 1}}}}}}}, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"velosearaptor.madcp.ProcessADCP": {"tf": 1}}, "df": 1}}}}, "x": {"docs": {"velosearaptor": {"tf": 1}}, "df": 1, "e": {"docs": {}, "df": 0, "s": {"docs": {"velosearaptor": {"tf": 1.4142135623730951}}, "df": 1}}}, "g": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "z": {"docs": {}, "df": 0, "e": {"docs": {"velosearaptor.adcp.plot_raw_adcp": {"tf": 1}, "velosearaptor.adcp.plot_raw_adcp_auxillary": {"tf": 1}}, "df": 2}}}}, "u": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {"velosearaptor.adcp.plot_raw_adcp": {"tf": 1}, "velosearaptor.adcp.plot_raw_adcp_auxillary": {"tf": 1}}, "df": 2}}}}, "r": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {"velosearaptor.madcp": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.default_dgridparams": {"tf": 1}}, "df": 2}}}}, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"velosearaptor": {"tf": 1.4142135623730951}}, "df": 1}}}}}}, "w": {"docs": {"velosearaptor.madcp.ProcessADCP": {"tf": 1}}, "df": 1}, "d": {"docs": {"velosearaptor.madcp.ProcessADCP.parse_file_locations": {"tf": 1}}, "df": 1}}, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "m": {"docs": {"velosearaptor": {"tf": 2.449489742783178}, "velosearaptor.io.extract_raw_rdi": {"tf": 1}, "velosearaptor.madcp": {"tf": 1.4142135623730951}, "velosearaptor.madcp.ProcessADCP": {"tf": 2}, "velosearaptor.madcp.ProcessADCP.make_start_ddays": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.plot_echo_stats": {"tf": 1}}, "df": 6}}}, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {"velosearaptor.io.read_raw_rdi": {"tf": 1}, "velosearaptor.madcp.ProcessADCP": {"tf": 1}}, "df": 2}}}}, "l": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {"velosearaptor.io.yday0_to_datetime64": {"tf": 1}, "velosearaptor.madcp.ProcessADCP": {"tf": 2.8284271247461903}}, "df": 2}}}}}, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "d": {"docs": {"velosearaptor": {"tf": 2}, "velosearaptor.adcp.plot_raw_adcp": {"tf": 1.4142135623730951}, "velosearaptor.adcp.plot_raw_adcp_auxillary": {"tf": 1.4142135623730951}, "velosearaptor.io.read_raw_rdi": {"tf": 1}, "velosearaptor.io.parse_yaml_input": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.read_ensemble": {"tf": 1}}, "df": 6, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"velosearaptor": {"tf": 1.7320508075688772}}, "df": 1}}}, "m": {"docs": {}, "df": 0, "e": {"docs": {"velosearaptor": {"tf": 1}}, "df": 1}}, "s": {"docs": {"velosearaptor.madcp": {"tf": 1}}, "df": 1}}}, "q": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "s": {"docs": {"velosearaptor": {"tf": 2}}, "df": 1}}}}}}}}}}, "l": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"velosearaptor": {"tf": 1}}, "df": 1}}}}, "a": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {"velosearaptor": {"tf": 1}}, "df": 1}}}}, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"velosearaptor": {"tf": 1}}, "df": 1}}}}}, "m": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {"velosearaptor": {"tf": 1.4142135623730951}}, "df": 1}}}}, "p": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "y": {"docs": {"velosearaptor": {"tf": 1}}, "df": 1}}}}}}}}, "n": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {"velosearaptor": {"tf": 1}}, "df": 1}}}}, "c": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"velosearaptor": {"tf": 1}}, "df": 1}}}}}}, "f": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"velosearaptor": {"tf": 1}}, "df": 1}}}}}}}}}, "t": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "n": {"docs": {"velosearaptor.io.read_raw_rdi": {"tf": 1}, "velosearaptor.io.cf_conventions": {"tf": 1}}, "df": 2, "s": {"docs": {"velosearaptor.io.read_raw_rdi": {"tf": 1}, "velosearaptor.io.read_raw_rdi_uh": {"tf": 1}, "velosearaptor.io.yday0_to_datetime64": {"tf": 1}, "velosearaptor.io.parse_yaml_input": {"tf": 1.4142135623730951}, "velosearaptor.io.cf_conventions": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.read_ensemble": {"tf": 1}}, "df": 6}}}}}, "s": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {"velosearaptor.madcp": {"tf": 1}}, "df": 1}}}}}}}, "u": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "s": {"docs": {"velosearaptor.madcp.ProcessADCP.process_pings": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.average_ensembles": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.burst_average_ensembles": {"tf": 1}}, "df": 3}}}}}, "g": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {"velosearaptor.madcp.ProcessADCP": {"tf": 1}}, "df": 1}}}}}, "d": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {"velosearaptor.madcp.ProcessADCP.process_pings": {"tf": 1}}, "df": 1}}}}}, "a": {"docs": {}, "df": 0, "w": {"docs": {"velosearaptor": {"tf": 2}, "velosearaptor.adcp.plot_raw_adcp": {"tf": 1.7320508075688772}, "velosearaptor.adcp.plot_raw_adcp_auxillary": {"tf": 1.7320508075688772}, "velosearaptor.io.read_raw_rdi": {"tf": 1.7320508075688772}, "velosearaptor.io.read_raw_rdi_uh": {"tf": 1.4142135623730951}, "velosearaptor.io.extract_raw_rdi": {"tf": 1.4142135623730951}, "velosearaptor.madcp": {"tf": 2}, "velosearaptor.madcp.ProcessADCP": {"tf": 2.449489742783178}, "velosearaptor.madcp.ProcessADCP.parse_file_locations": {"tf": 2}, "velosearaptor.madcp.ProcessADCP.raw": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.plot_echo_stats": {"tf": 1}}, "df": 11}, "d": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "p": {"docs": {"velosearaptor.io.read_raw_rdi_uh": {"tf": 1}}, "df": 1}}}, "n": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "e": {"docs": {"velosearaptor.io.extract_raw_rdi": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.average_ensembles": {"tf": 1.4142135623730951}, "velosearaptor.madcp.ProcessADCP.burst_average_ensembles": {"tf": 1.4142135623730951}}, "df": 3, "r": {"docs": {"velosearaptor.madcp": {"tf": 1}}, "df": 1}}}}, "t": {"docs": {}, "df": 0, "e": {"docs": {"velosearaptor.madcp.ProcessADCP": {"tf": 1}}, "df": 1}}, "i": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"velosearaptor.madcp.ProcessADCP.read_ensemble": {"tf": 1}}, "df": 1}}}}}, "d": {"docs": {}, "df": 0, "i": {"docs": {"velosearaptor": {"tf": 1}, "velosearaptor.adcp.plot_raw_adcp": {"tf": 1.7320508075688772}, "velosearaptor.adcp.plot_raw_adcp_auxillary": {"tf": 1.7320508075688772}, "velosearaptor.io.read_raw_rdi": {"tf": 1.4142135623730951}, "velosearaptor.io.read_raw_rdi_uh": {"tf": 1}, "velosearaptor.io.extract_raw_rdi": {"tf": 1}, "velosearaptor.madcp": {"tf": 1}, "velosearaptor.madcp.ProcessADCP": {"tf": 1.4142135623730951}}, "df": 8, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "w": {"docs": {"velosearaptor.io.read_raw_rdi_uh": {"tf": 1}, "velosearaptor.madcp": {"tf": 1}, "velosearaptor.madcp.ProcessADCP": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.read_ensemble": {"tf": 1}}, "df": 4}}}}}, "u": {"docs": {}, "df": 0, "n": {"docs": {"velosearaptor": {"tf": 1}, "velosearaptor.madcp": {"tf": 1}}, "df": 2, "n": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"velosearaptor.madcp.ProcessADCP": {"tf": 1}}, "df": 1}}}}}}, "o": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "l": {"docs": {"velosearaptor": {"tf": 1}}, "df": 1}}, "o": {"docs": {}, "df": 0, "t": {"docs": {"velosearaptor": {"tf": 1}}, "df": 1}}}}, "a": {"docs": {"velosearaptor": {"tf": 3}, "velosearaptor.io.parse_yaml_input": {"tf": 1}, "velosearaptor.madcp": {"tf": 2.8284271247461903}, "velosearaptor.madcp.ProcessADCP": {"tf": 2.23606797749979}, "velosearaptor.madcp.ProcessADCP.parse_file_locations": {"tf": 3}, "velosearaptor.madcp.ProcessADCP.burst_average_ensembles": {"tf": 1}}, "df": 6, "n": {"docs": {"velosearaptor": {"tf": 1.4142135623730951}, "velosearaptor.madcp.ProcessADCP": {"tf": 1.4142135623730951}, "velosearaptor.madcp.ProcessADCP.process_pings": {"tf": 1}, "velosearaptor.madcp.ProcessADCPyml": {"tf": 1}}, "df": 4, "d": {"docs": {"velosearaptor": {"tf": 3.605551275463989}, "velosearaptor.io.read_raw_rdi": {"tf": 1}, "velosearaptor.io.extract_raw_rdi": {"tf": 1.4142135623730951}, "velosearaptor.io.parse_yaml_input": {"tf": 1}, "velosearaptor.io.cf_conventions": {"tf": 1.4142135623730951}, "velosearaptor.madcp": {"tf": 2.449489742783178}, "velosearaptor.madcp.ProcessADCP": {"tf": 3.605551275463989}, "velosearaptor.madcp.ProcessADCP.parse_file_locations": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.make_start_ddays": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.magdec": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.process_pings": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.average_ensembles": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.burst_average_ensembles": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.plot_echo_stats": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.plot_pressure": {"tf": 1}}, "df": 15}, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "z": {"docs": {}, "df": 0, "e": {"docs": {"velosearaptor": {"tf": 1}}, "df": 1}}}}}, "y": {"docs": {"velosearaptor.madcp.ProcessADCP.parse_file_locations": {"tf": 1}}, "df": 1}}, "d": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "p": {"docs": {"velosearaptor": {"tf": 2.8284271247461903}, "velosearaptor.adcp": {"tf": 1.4142135623730951}, "velosearaptor.adcp.plot_raw_adcp": {"tf": 1.7320508075688772}, "velosearaptor.adcp.plot_raw_adcp_auxillary": {"tf": 1.7320508075688772}, "velosearaptor.io.read_raw_rdi": {"tf": 1.4142135623730951}, "velosearaptor.io.read_raw_rdi_uh": {"tf": 1}, "velosearaptor.io.parse_yaml_input": {"tf": 1}, "velosearaptor.madcp": {"tf": 1.4142135623730951}, "velosearaptor.madcp.ProcessADCP": {"tf": 3.1622776601683795}, "velosearaptor.madcp.ProcessADCP.parse_file_locations": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.default_dgridparams": {"tf": 1.4142135623730951}, "velosearaptor.madcp.ProcessADCP.read_ensemble": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.raw": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.plot_echo_stats": {"tf": 1}, "velosearaptor.madcp.ProcessADCPyml": {"tf": 1}}, "df": 15, "s": {"docs": {"velosearaptor.madcp": {"tf": 1.4142135623730951}}, "df": 1}}}, "d": {"docs": {"velosearaptor": {"tf": 2.23606797749979}}, "df": 1, "s": {"docs": {"velosearaptor": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.process_pings": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.average_ensembles": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.burst_average_ensembles": {"tf": 1}}, "df": 4}, "e": {"docs": {}, "df": 0, "d": {"docs": {"velosearaptor": {"tf": 1}, "velosearaptor.madcp.ProcessADCP": {"tf": 1}}, "df": 2}}}}, "r": {"docs": {}, "df": 0, "e": {"docs": {"velosearaptor": {"tf": 1}, "velosearaptor.madcp": {"tf": 1}, "velosearaptor.madcp.ProcessADCP": {"tf": 3}, "velosearaptor.madcp.ProcessADCP.parse_file_locations": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.read_ensemble": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.process_pings": {"tf": 1.4142135623730951}}, "df": 6}, "c": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {"velosearaptor": {"tf": 1}}, "df": 1}}}}}}}}}}, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "e": {"docs": {"velosearaptor.madcp": {"tf": 1}}, "df": 1}}}}, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "y": {"docs": {"velosearaptor.madcp.ProcessADCP": {"tf": 1}}, "df": 1}}}, "g": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"velosearaptor.madcp.ProcessADCP.magdec": {"tf": 1}}, "df": 1}}}}}}}, "v": {"docs": {}, "df": 0, "p": {"docs": {"velosearaptor": {"tf": 1}}, "df": 1}, "e": {"docs": {"velosearaptor.madcp.ProcessADCP.process_pings": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.average_ensembles": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.burst_average_ensembles": {"tf": 1}}, "df": 3, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "e": {"docs": {"velosearaptor": {"tf": 2.6457513110645907}, "velosearaptor.madcp": {"tf": 1.4142135623730951}, "velosearaptor.madcp.ProcessADCP": {"tf": 2.6457513110645907}}, "df": 3, "s": {"docs": {"velosearaptor": {"tf": 1.4142135623730951}}, "df": 1}, "d": {"docs": {"velosearaptor.madcp.ProcessADCP": {"tf": 1.4142135623730951}}, "df": 1}}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"velosearaptor.madcp": {"tf": 1}, "velosearaptor.madcp.ProcessADCP": {"tf": 2}, "velosearaptor.madcp.ProcessADCP.make_start_ddays": {"tf": 1.7320508075688772}, "velosearaptor.madcp.ProcessADCP.process_pings": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.average_ensembles": {"tf": 2.23606797749979}, "velosearaptor.madcp.ProcessADCP.burst_average_ensembles": {"tf": 2.23606797749979}}, "df": 6}, "t": {"docs": {"velosearaptor.madcp.ProcessADCP": {"tf": 1}}, "df": 1}}}}}}}, "o": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "d": {"docs": {"velosearaptor.madcp.ProcessADCP.default_dgridparams": {"tf": 1}}, "df": 1}}}}, "l": {"docs": {}, "df": 0, "l": {"docs": {"velosearaptor": {"tf": 1.4142135623730951}, "velosearaptor.madcp.ProcessADCP": {"tf": 1.4142135623730951}}, "df": 2, "o": {"docs": {}, "df": 0, "w": {"docs": {"velosearaptor": {"tf": 1}}, "df": 1, "s": {"docs": {"velosearaptor": {"tf": 1}}, "df": 1}}}}, "s": {"docs": {}, "df": 0, "o": {"docs": {"velosearaptor": {"tf": 1}, "velosearaptor.io.cf_conventions": {"tf": 1}}, "df": 2}}, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"velosearaptor.madcp.ProcessADCP.process_pings": {"tf": 1}}, "df": 1}}}}, "t": {"docs": {"velosearaptor": {"tf": 1.7320508075688772}, "velosearaptor.io.yday0_to_datetime64": {"tf": 1}, "velosearaptor.madcp.ProcessADCP": {"tf": 2.23606797749979}, "velosearaptor.madcp.ProcessADCP.process_pings": {"tf": 1.4142135623730951}, "velosearaptor.madcp.ProcessADCP.burst_average_ensembles": {"tf": 1.4142135623730951}, "velosearaptor.madcp.ProcessADCP.plot_pressure": {"tf": 1}, "velosearaptor.madcp.ProcessADCPyml": {"tf": 1}}, "df": 7, "t": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"velosearaptor.madcp.ProcessADCP": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.parse_file_locations": {"tf": 1}}, "df": 2, "s": {"docs": {"velosearaptor.madcp.ProcessADCP": {"tf": 1}}, "df": 1}}}}}}}}}, "u": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "y": {"docs": {"velosearaptor": {"tf": 2}, "velosearaptor.madcp.ProcessADCP": {"tf": 1.4142135623730951}}, "df": 2}}}}}}}}}}}, "x": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "y": {"docs": {"velosearaptor.adcp.plot_raw_adcp_auxillary": {"tf": 1}, "velosearaptor.io.read_raw_rdi": {"tf": 1}}, "df": 2}}}}, "i": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "y": {"docs": {"velosearaptor.madcp.ProcessADCP": {"tf": 1}}, "df": 1}}}}}}}}, "p": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "y": {"docs": {"velosearaptor": {"tf": 1}}, "df": 1}, "i": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"velosearaptor.madcp.ProcessADCP": {"tf": 1.4142135623730951}}, "df": 1}}}}, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"velosearaptor.madcp.ProcessADCP.make_start_ddays": {"tf": 1}}, "df": 1}}}}}}}, "c": {"docs": {}, "df": 0, "t": {"docs": {"velosearaptor.madcp.ProcessADCP": {"tf": 1}}, "df": 1, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {"velosearaptor": {"tf": 1.4142135623730951}}, "df": 1}}}}, "u": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {"velosearaptor.madcp.ProcessADCP.parse_file_locations": {"tf": 1}}, "df": 1}}}}, "c": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "s": {"docs": {"velosearaptor.madcp.ProcessADCP": {"tf": 1}}, "df": 1}}, "p": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"velosearaptor.madcp.ProcessADCP": {"tf": 1.7320508075688772}}, "df": 1}}}}}}}, "s": {"docs": {"velosearaptor.io.read_raw_rdi": {"tf": 1}, "velosearaptor.io.parse_yaml_input": {"tf": 1.4142135623730951}, "velosearaptor.madcp": {"tf": 1.4142135623730951}, "velosearaptor.madcp.ProcessADCP": {"tf": 1.4142135623730951}, "velosearaptor.madcp.ProcessADCP.parse_file_locations": {"tf": 1.4142135623730951}, "velosearaptor.madcp.ProcessADCP.magdec": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.process_pings": {"tf": 1.4142135623730951}, "velosearaptor.madcp.ProcessADCP.average_ensembles": {"tf": 1.4142135623730951}, "velosearaptor.madcp.ProcessADCP.burst_average_ensembles": {"tf": 1.4142135623730951}}, "df": 9}, "f": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"velosearaptor.madcp": {"tf": 1}, "velosearaptor.madcp.ProcessADCP": {"tf": 1}}, "df": 2}}}}, "b": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"velosearaptor.madcp.ProcessADCP": {"tf": 1}}, "df": 1}}}}}}, "o": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "t": {"docs": {"velosearaptor.madcp.ProcessADCP.parse_file_locations": {"tf": 1}}, "df": 1}}}}, "m": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {"velosearaptor.madcp.ProcessADCP.plot_echo_stats": {"tf": 1}}, "df": 1}}}}}}}}}, "t": {"0": {"docs": {"velosearaptor.madcp.ProcessADCP": {"tf": 1.4142135623730951}}, "df": 1}, "1": {"docs": {"velosearaptor.madcp.ProcessADCP": {"tf": 1.4142135623730951}}, "df": 1}, "docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "y": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {"velosearaptor": {"tf": 1}}, "df": 1}}}}}}, "r": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "s": {"docs": {"velosearaptor.madcp.ProcessADCP": {"tf": 1}}, "df": 1}}}}, "h": {"docs": {}, "df": 0, "e": {"docs": {"velosearaptor": {"tf": 5.385164807134504}, "velosearaptor.io.parse_yaml_input": {"tf": 2.23606797749979}, "velosearaptor.madcp": {"tf": 4.123105625617661}, "velosearaptor.madcp.ProcessADCP": {"tf": 4.69041575982343}, "velosearaptor.madcp.ProcessADCP.parse_file_locations": {"tf": 1.7320508075688772}, "velosearaptor.madcp.ProcessADCP.default_dgridparams": {"tf": 2.8284271247461903}, "velosearaptor.madcp.ProcessADCP.make_start_ddays": {"tf": 1.7320508075688772}, "velosearaptor.madcp.ProcessADCP.process_pings": {"tf": 1.4142135623730951}, "velosearaptor.madcp.ProcessADCP.average_ensembles": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.burst_average_ensembles": {"tf": 1}}, "df": 10, "n": {"docs": {"velosearaptor.madcp.ProcessADCP": {"tf": 1}}, "df": 1}, "s": {"docs": {}, "df": 0, "e": {"docs": {"velosearaptor.madcp.ProcessADCP": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.parse_file_locations": {"tf": 1}}, "df": 2}}, "i": {"docs": {}, "df": 0, "r": {"docs": {"velosearaptor.madcp.ProcessADCP": {"tf": 1}}, "df": 1}}, "y": {"docs": {"velosearaptor.madcp.ProcessADCP.read_ensemble": {"tf": 1}}, "df": 1}}, "a": {"docs": {}, "df": 0, "t": {"docs": {"velosearaptor": {"tf": 1.7320508075688772}, "velosearaptor.madcp.ProcessADCP": {"tf": 2}, "velosearaptor.madcp.ProcessADCP.parse_file_locations": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.burst_average_ensembles": {"tf": 1}}, "df": 4}, "n": {"docs": {"velosearaptor.madcp.ProcessADCP.parse_file_locations": {"tf": 1}}, "df": 1, "k": {"docs": {}, "df": 0, "s": {"docs": {"velosearaptor": {"tf": 1}}, "df": 1}}}}, "i": {"docs": {}, "df": 0, "s": {"docs": {"velosearaptor": {"tf": 2.6457513110645907}, "velosearaptor.madcp": {"tf": 1.7320508075688772}, "velosearaptor.madcp.ProcessADCP": {"tf": 1.4142135623730951}, "velosearaptor.madcp.ProcessADCP.process_pings": {"tf": 1.7320508075688772}}, "df": 4}}, "u": {"docs": {}, "df": 0, "s": {"docs": {"velosearaptor.madcp": {"tf": 1}}, "df": 1}}, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "d": {"docs": {"velosearaptor.madcp.ProcessADCP.parse_file_locations": {"tf": 1}}, "df": 1, "s": {"docs": {"velosearaptor.madcp.ProcessADCP": {"tf": 1}}, "df": 1}}}}}}}, "o": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "h": {"docs": {"velosearaptor.madcp.ProcessADCP": {"tf": 1.7320508075688772}}, "df": 1}}}}}}, "o": {"docs": {"velosearaptor": {"tf": 4.898979485566356}, "velosearaptor.io.read_raw_rdi": {"tf": 1.7320508075688772}, "velosearaptor.io.read_raw_rdi_uh": {"tf": 1}, "velosearaptor.io.extract_raw_rdi": {"tf": 1.4142135623730951}, "velosearaptor.io.yday0_to_datetime64": {"tf": 1}, "velosearaptor.madcp": {"tf": 1.7320508075688772}, "velosearaptor.madcp.ProcessADCP": {"tf": 4.47213595499958}, "velosearaptor.madcp.ProcessADCP.parse_file_locations": {"tf": 2.449489742783178}, "velosearaptor.madcp.ProcessADCP.default_dgridparams": {"tf": 1.4142135623730951}, "velosearaptor.madcp.ProcessADCP.read_ensemble": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.process_pings": {"tf": 1.4142135623730951}, "velosearaptor.madcp.ProcessADCP.average_ensembles": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.burst_average_ensembles": {"tf": 2.23606797749979}}, "df": 13, "o": {"docs": {"velosearaptor.madcp.ProcessADCP.read_ensemble": {"tf": 1}}, "df": 1, "l": {"docs": {"velosearaptor.madcp.ProcessADCP": {"tf": 1}}, "df": 1}}, "t": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {"velosearaptor.madcp.ProcessADCP": {"tf": 1}}, "df": 1}}}, "g": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"velosearaptor.madcp.ProcessADCP": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.read_ensemble": {"tf": 1}}, "df": 2}}}}}}, "p": {"docs": {"velosearaptor.madcp.ProcessADCP.parse_dgridparams": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.parse_tgridparams": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.parse_editparams": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.parse_driftparams": {"tf": 1}}, "df": 4}}, "a": {"docs": {}, "df": 0, "k": {"docs": {}, "df": 0, "e": {"docs": {"velosearaptor": {"tf": 1}}, "df": 1}}, "b": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"velosearaptor.io.cf_conventions": {"tf": 1}}, "df": 1}}}}, "x": {"docs": {}, "df": 0, "t": {"docs": {"velosearaptor": {"tf": 1}}, "df": 1}}, "i": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {"velosearaptor": {"tf": 1.7320508075688772}, "velosearaptor.io.yday0_to_datetime64": {"tf": 1.4142135623730951}, "velosearaptor.io.parse_yaml_input": {"tf": 1}, "velosearaptor.madcp.ProcessADCP": {"tf": 5.196152422706632}, "velosearaptor.madcp.ProcessADCP.parse_tgridparams": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.parse_driftparams": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.make_start_ddays": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.average_ensembles": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.burst_average_ensembles": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.plot_pressure": {"tf": 1.4142135623730951}}, "df": 10, "s": {"docs": {"velosearaptor.madcp.ProcessADCP": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.read_ensemble": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.average_ensembles": {"tf": 1.4142135623730951}, "velosearaptor.madcp.ProcessADCP.burst_average_ensembles": {"tf": 1.4142135623730951}}, "df": 4}}}}, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"velosearaptor": {"tf": 1}}, "df": 1}}}, "m": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {"velosearaptor.madcp": {"tf": 1}}, "df": 1}}}}}}, "u": {"docs": {}, "df": 0, "e": {"docs": {"velosearaptor.io.read_raw_rdi": {"tf": 1}}, "df": 1}}}, "u": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"velosearaptor.adcp.plot_raw_adcp": {"tf": 1}, "velosearaptor.adcp.plot_raw_adcp_auxillary": {"tf": 1}}, "df": 2}}}, "r": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"velosearaptor.madcp.ProcessADCP.make_start_ddays": {"tf": 1}}, "df": 1}}}}}}, "y": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "e": {"docs": {"velosearaptor.io.parse_yaml_input": {"tf": 1}}, "df": 1}}}, "g": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "s": {"docs": {"velosearaptor.io.parse_yaml_input": {"tf": 1}, "velosearaptor.madcp.ProcessADCP": {"tf": 2.449489742783178}, "velosearaptor.madcp.ProcessADCP.parse_tgridparams": {"tf": 1}}, "df": 3}}}}}}}}}}, "w": {"docs": {}, "df": 0, "o": {"docs": {"velosearaptor.madcp": {"tf": 1}}, "df": 1}}, "s": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {"velosearaptor.madcp.ProcessADCP": {"tf": 1}}, "df": 1}}}}}, "d": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {"velosearaptor.madcp.ProcessADCP.read_ensemble": {"tf": 1}}, "df": 1, "a": {"docs": {"velosearaptor": {"tf": 3}, "velosearaptor.adcp.plot_raw_adcp": {"tf": 1}, "velosearaptor.adcp.plot_raw_adcp_auxillary": {"tf": 1.4142135623730951}, "velosearaptor.io.read_raw_rdi": {"tf": 1.7320508075688772}, "velosearaptor.io.read_raw_rdi_uh": {"tf": 1.7320508075688772}, "velosearaptor.io.parse_yaml_input": {"tf": 2}, "velosearaptor.io.cf_conventions": {"tf": 1.4142135623730951}, "velosearaptor.madcp": {"tf": 2}, "velosearaptor.madcp.ProcessADCP": {"tf": 4.242640687119285}, "velosearaptor.madcp.ProcessADCP.parse_file_locations": {"tf": 2}, "velosearaptor.madcp.ProcessADCP.read_ensemble": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.raw": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.process_pings": {"tf": 1.4142135623730951}, "velosearaptor.madcp.ProcessADCP.plot_echo_stats": {"tf": 1}}, "df": 14, "s": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {"velosearaptor": {"tf": 2}, "velosearaptor.adcp.plot_raw_adcp": {"tf": 1.4142135623730951}, "velosearaptor.adcp.plot_raw_adcp_auxillary": {"tf": 1.4142135623730951}, "velosearaptor.io.read_raw_rdi": {"tf": 1.7320508075688772}, "velosearaptor.io.parse_yaml_input": {"tf": 1}, "velosearaptor.madcp.ProcessADCP": {"tf": 2}, "velosearaptor.madcp.ProcessADCP.process_pings": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.average_ensembles": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.burst_average_ensembles": {"tf": 1}}, "df": 9}}}, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "y": {"docs": {"velosearaptor.madcp.ProcessADCP": {"tf": 1}}, "df": 1}}}}, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "y": {"docs": {"velosearaptor.madcp.ProcessADCP": {"tf": 1}}, "df": 1}}}}}}}, "e": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"6": {"4": {"docs": {"velosearaptor.io.yday0_to_datetime64": {"tf": 1.7320508075688772}}, "df": 1}, "docs": {}, "df": 0}, "docs": {}, "df": 0}}}}}}, "y": {"docs": {"velosearaptor.io.yday0_to_datetime64": {"tf": 1.4142135623730951}}, "df": 1, "s": {"docs": {"velosearaptor.madcp.ProcessADCP": {"tf": 1}}, "df": 1}}}, "e": {"docs": {}, "df": 0, "p": {"docs": {"velosearaptor.madcp": {"tf": 1}}, "df": 1, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "s": {"docs": {"velosearaptor": {"tf": 1}}, "df": 1}, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"velosearaptor": {"tf": 1.4142135623730951}}, "df": 1}}}, "y": {"docs": {"velosearaptor": {"tf": 1}}, "df": 1}}}}}}}, "t": {"docs": {}, "df": 0, "h": {"docs": {"velosearaptor": {"tf": 2.449489742783178}, "velosearaptor.io.parse_yaml_input": {"tf": 1}, "velosearaptor.madcp": {"tf": 2.23606797749979}, "velosearaptor.madcp.ProcessADCP": {"tf": 3}, "velosearaptor.madcp.ProcessADCP.default_dgridparams": {"tf": 2}, "velosearaptor.madcp.ProcessADCP.parse_dgridparams": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.burst_average_ensembles": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.plot_pressure": {"tf": 1}}, "df": 8}}, "l": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "y": {"docs": {"velosearaptor": {"tf": 1}}, "df": 1, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"velosearaptor.madcp": {"tf": 1}}, "df": 1}}}}}}}}, "l": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"velosearaptor": {"tf": 1}}, "df": 1}}}}, "f": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "t": {"docs": {"velosearaptor": {"tf": 1}, "velosearaptor.adcp.plot_raw_adcp": {"tf": 1}, "velosearaptor.adcp.plot_raw_adcp_auxillary": {"tf": 1}, "velosearaptor.io.read_raw_rdi": {"tf": 1}, "velosearaptor.madcp.ProcessADCP": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.default_dgridparams": {"tf": 1.4142135623730951}, "velosearaptor.madcp.ProcessADCP.process_pings": {"tf": 1}}, "df": 7, "s": {"docs": {"velosearaptor.io.extract_raw_rdi": {"tf": 1}, "velosearaptor.madcp.ProcessADCP": {"tf": 2.23606797749979}, "velosearaptor.madcp.ProcessADCP.parse_file_locations": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.burst_average_ensembles": {"tf": 1.7320508075688772}}, "df": 4}}}}}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"velosearaptor.madcp.ProcessADCP.burst_average_ensembles": {"tf": 1}}, "df": 1}}}}}, "v": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"velosearaptor": {"tf": 1}, "velosearaptor.madcp.ProcessADCP": {"tf": 1}}, "df": 2}}}}}}}, "s": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"velosearaptor": {"tf": 1}}, "df": 1}}}}, "c": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"velosearaptor.madcp.ProcessADCP": {"tf": 1}}, "df": 1}}}}}}}, "c": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"velosearaptor.madcp.ProcessADCP": {"tf": 2}, "velosearaptor.madcp.ProcessADCP.magdec": {"tf": 1}}, "df": 2}}}}}}}}}, "g": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"velosearaptor.madcp.ProcessADCP": {"tf": 1}}, "df": 1}}}}}, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {"velosearaptor.madcp.ProcessADCP.default_dgridparams": {"tf": 1}}, "df": 1, "d": {"docs": {"velosearaptor.madcp.ProcessADCP": {"tf": 2.23606797749979}, "velosearaptor.madcp.ProcessADCP.make_start_ddays": {"tf": 1}}, "df": 2}}}}}}}}, "e": {"docs": {}, "df": 0, "p": {"docs": {"velosearaptor.madcp.ProcessADCP": {"tf": 1}}, "df": 1}}}, "o": {"docs": {"velosearaptor": {"tf": 1.4142135623730951}, "velosearaptor.madcp.ProcessADCP.process_pings": {"tf": 1}}, "df": 2, "e": {"docs": {}, "df": 0, "s": {"docs": {"velosearaptor": {"tf": 1}}, "df": 1}}, "c": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"velosearaptor.madcp.ProcessADCP": {"tf": 1}}, "df": 1, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"velosearaptor": {"tf": 2.449489742783178}}, "df": 1}}}}}}}}}}, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "s": {"docs": {"velosearaptor.madcp": {"tf": 1}}, "df": 1}}}}}}}}, "w": {"docs": {}, "df": 0, "n": {"docs": {"velosearaptor.madcp.ProcessADCP": {"tf": 1}}, "df": 1, "l": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "d": {"docs": {"velosearaptor.madcp.ProcessADCP": {"tf": 1.4142135623730951}}, "df": 1, "e": {"docs": {}, "df": 0, "d": {"docs": {"velosearaptor.madcp.ProcessADCP": {"tf": 1}}, "df": 1}}}}}}}}}, "i": {"docs": {}, "df": 0, "r": {"docs": {"velosearaptor.io.parse_yaml_input": {"tf": 1}}, "df": 1, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "y": {"docs": {"velosearaptor": {"tf": 1}, "velosearaptor.io.parse_yaml_input": {"tf": 1}, "velosearaptor.madcp.ProcessADCP": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.parse_file_locations": {"tf": 1}}, "df": 4}}}}}}}, "v": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"velosearaptor": {"tf": 1}}, "df": 1}}}, "e": {"docs": {}, "df": 0, "d": {"docs": {"velosearaptor.madcp.ProcessADCP": {"tf": 1}}, "df": 1}}}}}, "c": {"docs": {}, "df": 0, "t": {"docs": {"velosearaptor.io.read_raw_rdi_uh": {"tf": 1}, "velosearaptor.io.parse_yaml_input": {"tf": 2.23606797749979}, "velosearaptor.io.cf_conventions": {"tf": 1}, "velosearaptor.madcp.ProcessADCP": {"tf": 2.23606797749979}, "velosearaptor.madcp.ProcessADCP.parse_dgridparams": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.parse_tgridparams": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.parse_editparams": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.parse_driftparams": {"tf": 1}}, "df": 8, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "y": {"docs": {"velosearaptor.io.parse_yaml_input": {"tf": 1}, "velosearaptor.io.cf_conventions": {"tf": 1}, "velosearaptor.madcp.ProcessADCP": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.read_ensemble": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.process_pings": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.average_ensembles": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.burst_average_ensembles": {"tf": 1}}, "df": 7}, "i": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"velosearaptor.madcp": {"tf": 1}, "velosearaptor.madcp.ProcessADCP": {"tf": 1}}, "df": 2}}}}}}}}}}, "s": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "y": {"docs": {"velosearaptor.io.cf_conventions": {"tf": 1}}, "df": 1}}}}}}, "t": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {"velosearaptor.madcp": {"tf": 1.7320508075688772}, "velosearaptor.madcp.ProcessADCP.default_dgridparams": {"tf": 1}}, "df": 2}}}}}}, "f": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {"velosearaptor.madcp.ProcessADCP": {"tf": 1}}, "df": 1}}}}}}}}, "n": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {"velosearaptor.madcp.ProcessADCP": {"tf": 1}}, "df": 1}}}}}}}}, "g": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "s": {"docs": {"velosearaptor.io.parse_yaml_input": {"tf": 1}, "velosearaptor.madcp.ProcessADCP": {"tf": 1.7320508075688772}, "velosearaptor.madcp.ProcessADCP.parse_dgridparams": {"tf": 1}}, "df": 3}}}}}}}}}}, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "t": {"docs": {"velosearaptor.io.parse_yaml_input": {"tf": 1}, "velosearaptor.madcp.ProcessADCP": {"tf": 2.449489742783178}, "velosearaptor.madcp.ProcessADCP.parse_driftparams": {"tf": 1}}, "df": 3, "p": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "s": {"docs": {"velosearaptor.io.parse_yaml_input": {"tf": 1}, "velosearaptor.madcp.ProcessADCP": {"tf": 1.7320508075688772}, "velosearaptor.madcp.ProcessADCP.parse_driftparams": {"tf": 1}}, "df": 3}}}}}}}}}}, "s": {"docs": {"velosearaptor.madcp.ProcessADCP": {"tf": 1.4142135623730951}, "velosearaptor.madcp.ProcessADCP.process_pings": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.average_ensembles": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.burst_average_ensembles": {"tf": 1}}, "df": 4}, "u": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"velosearaptor.madcp.ProcessADCP": {"tf": 1}}, "df": 1}}}}}, "b": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {"velosearaptor.madcp.ProcessADCP": {"tf": 1}}, "df": 1}}, "o": {"docs": {}, "df": 0, "t": {"docs": {"velosearaptor.madcp.ProcessADCP": {"tf": 1.4142135623730951}}, "df": 1}}}, "d": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "y": {"docs": {"velosearaptor.madcp.ProcessADCP": {"tf": 1.7320508075688772}}, "df": 1, "s": {"docs": {"velosearaptor.madcp.ProcessADCP": {"tf": 1.4142135623730951}, "velosearaptor.madcp.ProcessADCP.read_ensemble": {"tf": 1.4142135623730951}}, "df": 2}}}}, "t": {"docs": {"velosearaptor.madcp.ProcessADCP": {"tf": 1.7320508075688772}}, "df": 1, "o": {"docs": {}, "df": 0, "p": {"docs": {"velosearaptor.madcp.ProcessADCP": {"tf": 1.4142135623730951}}, "df": 1}}}}, "c": {"docs": {"velosearaptor": {"tf": 1}}, "df": 1, "o": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {"velosearaptor": {"tf": 2}}, "df": 1}}, "n": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {"velosearaptor": {"tf": 1}, "velosearaptor.madcp.ProcessADCP": {"tf": 1}}, "df": 2}}, "t": {"docs": {"velosearaptor.madcp.ProcessADCP": {"tf": 1}}, "df": 1}}}}, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"velosearaptor.io.cf_conventions": {"tf": 1}}, "df": 1, "s": {"docs": {"velosearaptor.io.cf_conventions": {"tf": 1}}, "df": 1, "/": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "f": {"docs": {"velosearaptor.io.cf_conventions": {"tf": 1}}, "df": 1}}}}}}}}}, "r": {"docs": {}, "df": 0, "t": {"docs": {"velosearaptor.io.yday0_to_datetime64": {"tf": 1}}, "df": 1, "e": {"docs": {}, "df": 0, "d": {"docs": {"velosearaptor.madcp.ProcessADCP": {"tf": 1}}, "df": 1}}}}}}, "t": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {"velosearaptor": {"tf": 1}, "velosearaptor.madcp": {"tf": 1}}, "df": 2}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"velosearaptor.madcp": {"tf": 1}}, "df": 1}}}}}}, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "l": {"docs": {"velosearaptor": {"tf": 1}}, "df": 1}}}}, "d": {"docs": {}, "df": 0, "a": {"docs": {"velosearaptor": {"tf": 2.23606797749979}}, "df": 1, "/": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "p": {"docs": {"velosearaptor": {"tf": 1}}, "df": 1}}}}}}, "s": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"velosearaptor": {"tf": 1}}, "df": 1}}}}}}}}}, "l": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"velosearaptor": {"tf": 1}, "velosearaptor.madcp.ProcessADCP": {"tf": 1}}, "df": 2}}}}}}}}, "p": {"docs": {}, "df": 0, "y": {"docs": {"velosearaptor": {"tf": 1}}, "df": 1}}, "m": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"velosearaptor": {"tf": 1}}, "df": 1}, "r": {"docs": {"velosearaptor": {"tf": 1}}, "df": 1}}}}, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {"velosearaptor": {"tf": 1}}, "df": 1}}}, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"velosearaptor": {"tf": 1}}, "df": 1}}}}}}, "/": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "/": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "p": {"docs": {"velosearaptor": {"tf": 1}}, "df": 1}}}}}}}}}}}}}}}}}, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "d": {"docs": {"velosearaptor.madcp.ProcessADCP": {"tf": 1}}, "df": 1, "s": {"docs": {"velosearaptor.madcp": {"tf": 1}}, "df": 1}}}}}}, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"velosearaptor": {"tf": 1}, "velosearaptor.madcp.ProcessADCP": {"tf": 1}}, "df": 2, "s": {"docs": {"velosearaptor.madcp": {"tf": 1}}, "df": 1}}}}}}}}}, "r": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {"velosearaptor": {"tf": 1.4142135623730951}, "velosearaptor.madcp.ProcessADCP": {"tf": 1}}, "df": 2}}, "l": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"velosearaptor.madcp.ProcessADCP": {"tf": 1.4142135623730951}, "velosearaptor.madcp.ProcessADCP.plot_echo_stats": {"tf": 1}}, "df": 2}}}}}}, "s": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "s": {"docs": {"velosearaptor.madcp.ProcessADCP.parse_file_locations": {"tf": 1}}, "df": 1}}}}}}}}}}, "a": {"docs": {}, "df": 0, "n": {"docs": {"velosearaptor": {"tf": 1.4142135623730951}, "velosearaptor.madcp.ProcessADCP": {"tf": 1.7320508075688772}, "velosearaptor.madcp.ProcessADCP.parse_file_locations": {"tf": 1.4142135623730951}, "velosearaptor.madcp.ProcessADCP.burst_average_ensembles": {"tf": 1}}, "df": 4}, "s": {"docs": {}, "df": 0, "e": {"docs": {"velosearaptor.madcp.ProcessADCP.parse_file_locations": {"tf": 1}}, "df": 1, "s": {"docs": {"velosearaptor": {"tf": 1}}, "df": 1}}}, "l": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"velosearaptor": {"tf": 1}}, "df": 1}}}, "e": {"docs": {}, "df": 0, "d": {"docs": {"velosearaptor.madcp": {"tf": 1}, "velosearaptor.madcp.ProcessADCP": {"tf": 2}, "velosearaptor.madcp.ProcessADCP.magdec": {"tf": 1}}, "df": 3}}}}}}}, "l": {"docs": {"velosearaptor.madcp.ProcessADCP": {"tf": 1}}, "df": 1}}}, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"velosearaptor": {"tf": 1.4142135623730951}}, "df": 1}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"velosearaptor.madcp.ProcessADCP": {"tf": 1}}, "df": 1}}}}}}, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"velosearaptor": {"tf": 1}}, "df": 1}}}}}}}}, "d": {"docs": {"velosearaptor": {"tf": 1}}, "df": 1}, "u": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "k": {"docs": {"velosearaptor": {"tf": 1.4142135623730951}}, "df": 1}}}}}, "f": {"docs": {"velosearaptor": {"tf": 1}, "velosearaptor.io.cf_conventions": {"tf": 1.7320508075688772}}, "df": 2}, "h": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "e": {"docs": {"velosearaptor": {"tf": 1.4142135623730951}}, "df": 1, "s": {"docs": {"velosearaptor": {"tf": 2.23606797749979}}, "df": 1}, "d": {"docs": {"velosearaptor": {"tf": 1}}, "df": 1}}}}}}, "l": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "s": {"docs": {"velosearaptor": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.parse_dgridparams": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.parse_tgridparams": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.parse_editparams": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.parse_driftparams": {"tf": 1}}, "df": 5}}}, "o": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "k": {"docs": {"velosearaptor.io.parse_yaml_input": {"tf": 1}, "velosearaptor.madcp.ProcessADCP": {"tf": 1.7320508075688772}}, "df": 2}}}}, "e": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "l": {"docs": {"velosearaptor.madcp": {"tf": 1.4142135623730951}}, "df": 1, "s": {"docs": {"velosearaptor.madcp.ProcessADCP.default_dgridparams": {"tf": 1}}, "df": 1, "i": {"docs": {}, "df": 0, "z": {"docs": {}, "df": 0, "e": {"docs": {"velosearaptor.madcp": {"tf": 1}}, "df": 1}}}}}}, "n": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"velosearaptor.madcp": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.default_dgridparams": {"tf": 1}}, "df": 2, "e": {"docs": {}, "df": 0, "d": {"docs": {"velosearaptor.madcp.ProcessADCP.default_dgridparams": {"tf": 1}}, "df": 1}}}}}}}}, "i": {"0": {"docs": {"velosearaptor.io.extract_raw_rdi": {"tf": 1}}, "df": 1}, "1": {"docs": {"velosearaptor.io.extract_raw_rdi": {"tf": 1}}, "df": 1}, "docs": {"velosearaptor.madcp.ProcessADCP": {"tf": 1}}, "df": 1, "n": {"docs": {"velosearaptor": {"tf": 2.8284271247461903}, "velosearaptor.io.read_raw_rdi": {"tf": 1}, "velosearaptor.io.yday0_to_datetime64": {"tf": 1}, "velosearaptor.io.parse_yaml_input": {"tf": 1.7320508075688772}, "velosearaptor.io.cf_conventions": {"tf": 1}, "velosearaptor.madcp": {"tf": 1.4142135623730951}, "velosearaptor.madcp.ProcessADCP": {"tf": 3.872983346207417}, "velosearaptor.madcp.ProcessADCP.parse_file_locations": {"tf": 1.4142135623730951}, "velosearaptor.madcp.ProcessADCP.make_start_ddays": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.read_ensemble": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.process_pings": {"tf": 1.4142135623730951}}, "df": 11, "t": {"docs": {"velosearaptor.io.extract_raw_rdi": {"tf": 1.4142135623730951}, "velosearaptor.io.yday0_to_datetime64": {"tf": 1}, "velosearaptor.io.parse_yaml_input": {"tf": 1}, "velosearaptor.madcp.ProcessADCP": {"tf": 1.4142135623730951}, "velosearaptor.madcp.ProcessADCP.parse_file_locations": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.read_ensemble": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.process_pings": {"tf": 1.7320508075688772}, "velosearaptor.madcp.ProcessADCP.average_ensembles": {"tf": 1.4142135623730951}, "velosearaptor.madcp.ProcessADCP.burst_average_ensembles": {"tf": 1.7320508075688772}}, "df": 9, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"velosearaptor": {"tf": 1}}, "df": 1}}}}}, "n": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {"velosearaptor": {"tf": 1.4142135623730951}}, "df": 1}}}, "p": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"velosearaptor": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.burst_average_ensembles": {"tf": 1.4142135623730951}}, "df": 2}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"velosearaptor.madcp.ProcessADCP": {"tf": 1}}, "df": 1}}, "o": {"docs": {}, "df": 0, "n": {"docs": {"velosearaptor.madcp.ProcessADCP.burst_average_ensembles": {"tf": 1}}, "df": 1}}}}}}}}, "v": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {"velosearaptor.madcp.ProcessADCP": {"tf": 1.4142135623730951}, "velosearaptor.madcp.ProcessADCP.make_start_ddays": {"tf": 1}}, "df": 2, "s": {"docs": {"velosearaptor.madcp.ProcessADCP": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.average_ensembles": {"tf": 1.4142135623730951}, "velosearaptor.madcp.ProcessADCP.burst_average_ensembles": {"tf": 1.4142135623730951}}, "df": 3}}}}}}, "o": {"docs": {"velosearaptor": {"tf": 1.4142135623730951}, "velosearaptor.madcp.ProcessADCP": {"tf": 1.4142135623730951}, "velosearaptor.madcp.ProcessADCP.default_dgridparams": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.read_ensemble": {"tf": 1.4142135623730951}, "velosearaptor.madcp.ProcessADCP.average_ensembles": {"tf": 1.4142135623730951}, "velosearaptor.madcp.ProcessADCP.burst_average_ensembles": {"tf": 1.4142135623730951}}, "df": 6}}, "s": {"docs": {}, "df": 0, "t": {"docs": {"velosearaptor.io.extract_raw_rdi": {"tf": 1}}, "df": 1, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "l": {"docs": {"velosearaptor": {"tf": 3.1622776601683795}}, "df": 1, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"velosearaptor": {"tf": 1.4142135623730951}}, "df": 1}}}}}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"velosearaptor": {"tf": 1.4142135623730951}}, "df": 1}}}, "e": {"docs": {}, "df": 0, "d": {"docs": {"velosearaptor": {"tf": 1.4142135623730951}, "velosearaptor.madcp.ProcessADCP": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.magdec": {"tf": 1}}, "df": 3}}}}, "n": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"velosearaptor.madcp": {"tf": 1}}, "df": 1}}}}}, "c": {"docs": {}, "df": 0, "e": {"docs": {"velosearaptor.madcp.ProcessADCP": {"tf": 2.449489742783178}, "velosearaptor.madcp.ProcessADCP.parse_file_locations": {"tf": 1.4142135623730951}}, "df": 2, "s": {"docs": {"velosearaptor.madcp.ProcessADCP.parse_file_locations": {"tf": 1}}, "df": 1}}}}}, "r": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {"velosearaptor": {"tf": 1}}, "df": 1}}}}}}, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"velosearaptor": {"tf": 1}, "velosearaptor.io.parse_yaml_input": {"tf": 1.4142135623730951}, "velosearaptor.madcp": {"tf": 1}, "velosearaptor.madcp.ProcessADCP": {"tf": 1.4142135623730951}}, "df": 4}}}}}}}}, "c": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"velosearaptor": {"tf": 1}}, "df": 1}}}, "e": {"docs": {}, "df": 0, "d": {"docs": {"velosearaptor.madcp.ProcessADCP.parse_file_locations": {"tf": 1.4142135623730951}, "velosearaptor.madcp.ProcessADCPyml": {"tf": 1}}, "df": 2}}}, "s": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {"velosearaptor.madcp.ProcessADCP": {"tf": 1.4142135623730951}}, "df": 1}}}}}}, "u": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {"velosearaptor": {"tf": 1}}, "df": 1}}}}, "p": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "t": {"docs": {"velosearaptor": {"tf": 1}, "velosearaptor.io.extract_raw_rdi": {"tf": 1}, "velosearaptor.madcp": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.parse_file_locations": {"tf": 1.4142135623730951}, "velosearaptor.madcp.ProcessADCP.make_start_ddays": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.magdec": {"tf": 1}}, "df": 6}}}, "/": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "t": {"docs": {"velosearaptor.io": {"tf": 1}}, "df": 1}}}}, "f": {"docs": {}, "df": 0, "o": {"docs": {"velosearaptor.madcp.ProcessADCP": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.parse_dgridparams": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.parse_tgridparams": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.parse_editparams": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.parse_driftparams": {"tf": 1}}, "df": 5, "r": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"velosearaptor.io.cf_conventions": {"tf": 1}, "velosearaptor.madcp": {"tf": 1}}, "df": 2}}}}}}}}}, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "z": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"velosearaptor.madcp.ProcessADCP": {"tf": 1.4142135623730951}}, "df": 1}}}}}}}}}, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "x": {"docs": {"velosearaptor.madcp.ProcessADCP.read_ensemble": {"tf": 1.4142135623730951}, "velosearaptor.madcp.ProcessADCP.average_ensembles": {"tf": 1.4142135623730951}, "velosearaptor.madcp.ProcessADCP.burst_average_ensembles": {"tf": 1.4142135623730951}}, "df": 3, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"velosearaptor.madcp.ProcessADCP": {"tf": 1}}, "df": 1}}}}}, "i": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {"velosearaptor.madcp.ProcessADCP.read_ensemble": {"tf": 1}}, "df": 1}}}}}}}}}, "t": {"docs": {"velosearaptor": {"tf": 1}, "velosearaptor.madcp.ProcessADCP": {"tf": 1.4142135623730951}}, "df": 2, "s": {"docs": {"velosearaptor": {"tf": 1.4142135623730951}}, "df": 1}}, "o": {"docs": {"velosearaptor": {"tf": 1}, "velosearaptor.adcp.plot_raw_adcp": {"tf": 1}, "velosearaptor.adcp.plot_raw_adcp_auxillary": {"tf": 1}, "velosearaptor.io": {"tf": 1}}, "df": 4, "/": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {"velosearaptor": {"tf": 1}}, "df": 1}}}}}}}}}}}}}}}, "s": {"docs": {"velosearaptor": {"tf": 1.4142135623730951}, "velosearaptor.madcp": {"tf": 1.7320508075688772}, "velosearaptor.madcp.ProcessADCP": {"tf": 3.3166247903554}, "velosearaptor.madcp.ProcessADCP.parse_file_locations": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.default_dgridparams": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.read_ensemble": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.magdec": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.process_pings": {"tf": 1}, "velosearaptor.madcp.ProcessADCPyml": {"tf": 1}}, "df": 9}, "f": {"docs": {"velosearaptor": {"tf": 1.4142135623730951}, "velosearaptor.io.parse_yaml_input": {"tf": 1}, "velosearaptor.madcp.ProcessADCP": {"tf": 2}, "velosearaptor.madcp.ProcessADCP.make_start_ddays": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.read_ensemble": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.magdec": {"tf": 1}}, "df": 6}, "m": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {"velosearaptor": {"tf": 1}}, "df": 1, "d": {"docs": {"velosearaptor": {"tf": 1.7320508075688772}}, "df": 1}}}}}}}, "g": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {"velosearaptor.io.read_raw_rdi": {"tf": 1}}, "df": 1, "d": {"docs": {"velosearaptor.madcp.ProcessADCP.make_start_ddays": {"tf": 1}}, "df": 1}}}}}}, "d": {"docs": {"velosearaptor.io.parse_yaml_input": {"tf": 1}}, "df": 1}, "b": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "d": {"docs": {"velosearaptor.madcp.ProcessADCP": {"tf": 1}}, "df": 1}}}, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {"velosearaptor.madcp.ProcessADCP.read_ensemble": {"tf": 1.4142135623730951}}, "df": 1}}}}, "u": {"docs": {}, "df": 0, "h": {"docs": {"velosearaptor": {"tf": 1.4142135623730951}, "velosearaptor.io.read_raw_rdi_uh": {"tf": 1.4142135623730951}}, "df": 2}, "s": {"docs": {}, "df": 0, "e": {"docs": {"velosearaptor": {"tf": 1.4142135623730951}, "velosearaptor.madcp": {"tf": 1}, "velosearaptor.madcp.ProcessADCP": {"tf": 1}}, "df": 3, "f": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "l": {"docs": {"velosearaptor": {"tf": 1}}, "df": 1}}}, "d": {"docs": {"velosearaptor.io.parse_yaml_input": {"tf": 1.4142135623730951}, "velosearaptor.madcp.ProcessADCP": {"tf": 2}}, "df": 2}, "s": {"docs": {"velosearaptor.madcp.ProcessADCP.burst_average_ensembles": {"tf": 1}}, "df": 1}}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"velosearaptor": {"tf": 1.7320508075688772}, "velosearaptor.adcp.plot_raw_adcp": {"tf": 1}, "velosearaptor.adcp.plot_raw_adcp_auxillary": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.magdec": {"tf": 1}}, "df": 4}}}, "a": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "e": {"docs": {"velosearaptor.madcp.ProcessADCP.process_pings": {"tf": 1}}, "df": 1}}}}, "n": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"velosearaptor": {"tf": 1}}, "df": 1}}}}}}}}, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "s": {"docs": {"velosearaptor.io.cf_conventions": {"tf": 1.4142135623730951}}, "df": 1}}, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {"velosearaptor.madcp.ProcessADCP": {"tf": 1}}, "df": 1}}}}}}}, "n": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "y": {"docs": {"velosearaptor.madcp.ProcessADCP.default_dgridparams": {"tf": 1}}, "df": 1}}}}}}}}}, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"velosearaptor.madcp.ProcessADCP.process_pings": {"tf": 1.4142135623730951}, "velosearaptor.madcp.ProcessADCP.average_ensembles": {"tf": 1.4142135623730951}, "velosearaptor.madcp.ProcessADCP.burst_average_ensembles": {"tf": 1.4142135623730951}}, "df": 3}}}}, "p": {"docs": {"velosearaptor.madcp.ProcessADCP": {"tf": 1}}, "df": 1, "d": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"velosearaptor.madcp.ProcessADCP": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.burst_average_ensembles": {"tf": 1}}, "df": 2}}}}}}, "t": {"docs": {}, "df": 0, "c": {"docs": {"velosearaptor.madcp.ProcessADCP": {"tf": 1}}, "df": 1}}}, "e": {"docs": {"velosearaptor": {"tf": 2}, "velosearaptor.madcp.ProcessADCP": {"tf": 2}}, "df": 2, "f": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"velosearaptor": {"tf": 1}}, "df": 1}}}}}}}}, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"velosearaptor": {"tf": 1.4142135623730951}, "velosearaptor.madcp.ProcessADCP": {"tf": 1.4142135623730951}, "velosearaptor.madcp.ProcessADCP.parse_file_locations": {"tf": 1.4142135623730951}}, "df": 3}}}}}, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "c": {"docs": {"velosearaptor": {"tf": 1}}, "df": 1}}, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {"velosearaptor": {"tf": 1}, "velosearaptor.madcp.ProcessADCP": {"tf": 1}}, "df": 2}}}}, "n": {"docs": {}, "df": 0, "v": {"docs": {"velosearaptor": {"tf": 1.4142135623730951}}, "df": 1, "i": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {"velosearaptor": {"tf": 2.449489742783178}}, "df": 1, "s": {"docs": {"velosearaptor": {"tf": 1}}, "df": 1}}}}}}}}}}, "s": {"docs": {"velosearaptor.madcp.ProcessADCP.process_pings": {"tf": 1}}, "df": 1, "e": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"velosearaptor": {"tf": 1.4142135623730951}, "velosearaptor.madcp.ProcessADCP": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.read_ensemble": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.process_pings": {"tf": 1}}, "df": 4, "s": {"docs": {"velosearaptor": {"tf": 2}, "velosearaptor.madcp": {"tf": 1.4142135623730951}, "velosearaptor.madcp.ProcessADCP": {"tf": 1.7320508075688772}, "velosearaptor.madcp.ProcessADCP.read_ensemble": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.process_pings": {"tf": 1}}, "df": 5}}}}}}}, "d": {"docs": {"velosearaptor.io.extract_raw_rdi": {"tf": 1}, "velosearaptor.madcp.ProcessADCP": {"tf": 2.8284271247461903}}, "df": 2}, "t": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {"velosearaptor.io.parse_yaml_input": {"tf": 1}, "velosearaptor.madcp.ProcessADCP": {"tf": 2}}, "df": 2}}}}}}, "d": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"velosearaptor": {"tf": 1}}, "df": 1}}}}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"velosearaptor": {"tf": 1}, "velosearaptor.io.parse_yaml_input": {"tf": 1}, "velosearaptor.madcp.ProcessADCP": {"tf": 2}, "velosearaptor.madcp.ProcessADCP.parse_editparams": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.burst_average_ensembles": {"tf": 1}}, "df": 5}}}, "p": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "s": {"docs": {"velosearaptor.io.parse_yaml_input": {"tf": 1}, "velosearaptor.madcp.ProcessADCP": {"tf": 1.7320508075688772}, "velosearaptor.madcp.ProcessADCP.parse_editparams": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.burst_average_ensembles": {"tf": 1}}, "df": 4}}}}}}, "e": {"docs": {}, "df": 0, "d": {"docs": {"velosearaptor.madcp.ProcessADCP": {"tf": 1}}, "df": 1}}}}}, "x": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"velosearaptor": {"tf": 1}, "velosearaptor.madcp.ProcessADCPyml": {"tf": 1}}, "df": 2}}}}}, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {"velosearaptor": {"tf": 1}}, "df": 1}}}}}, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {"velosearaptor.io.extract_raw_rdi": {"tf": 1}}, "df": 1}}}}}, "i": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "s": {"docs": {"velosearaptor": {"tf": 1}}, "df": 1}}}}, "p": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "s": {"docs": {"velosearaptor.madcp": {"tf": 1}}, "df": 1}}}}}, "c": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"velosearaptor.madcp.ProcessADCP": {"tf": 1}}, "df": 1}}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"velosearaptor.madcp.ProcessADCP.parse_file_locations": {"tf": 1}}, "df": 1}}}}}}}}, "a": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "h": {"docs": {"velosearaptor": {"tf": 1}, "velosearaptor.madcp": {"tf": 1}}, "df": 2}}, "s": {"docs": {}, "df": 0, "y": {"docs": {"velosearaptor.madcp.ProcessADCP": {"tf": 1}}, "df": 1}}}, "c": {"docs": {"velosearaptor.io.extract_raw_rdi": {"tf": 1}}, "df": 1}, "s": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"velosearaptor.io.cf_conventions": {"tf": 1}}, "df": 1}}}}}}}, "x": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "y": {"docs": {"velosearaptor": {"tf": 1}, "velosearaptor.adcp.plot_raw_adcp": {"tf": 1}, "velosearaptor.adcp.plot_raw_adcp_auxillary": {"tf": 1}, "velosearaptor.io.read_raw_rdi": {"tf": 1.7320508075688772}, "velosearaptor.madcp.ProcessADCP": {"tf": 1.7320508075688772}, "velosearaptor.madcp.ProcessADCP.process_pings": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.average_ensembles": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.burst_average_ensembles": {"tf": 1}}, "df": 8}}}}}, "r": {"docs": {"velosearaptor.madcp.ProcessADCP": {"tf": 1.4142135623730951}}, "df": 1}}, "s": {"docs": {"velosearaptor.io.read_raw_rdi": {"tf": 1}, "velosearaptor.io.read_raw_rdi_uh": {"tf": 1}, "velosearaptor.io.yday0_to_datetime64": {"tf": 1}, "velosearaptor.madcp.ProcessADCP": {"tf": 1.4142135623730951}, "velosearaptor.madcp.ProcessADCP.parse_file_locations": {"tf": 1}}, "df": 5, "t": {"docs": {}, "df": 0, "r": {"docs": {"velosearaptor.io.read_raw_rdi": {"tf": 1.4142135623730951}, "velosearaptor.io.read_raw_rdi_uh": {"tf": 1}, "velosearaptor.io.extract_raw_rdi": {"tf": 1.7320508075688772}, "velosearaptor.io.parse_yaml_input": {"tf": 1.4142135623730951}, "velosearaptor.madcp.ProcessADCP": {"tf": 1.7320508075688772}, "velosearaptor.madcp.ProcessADCP.parse_file_locations": {"tf": 1.4142135623730951}}, "df": 6, "u": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {"velosearaptor": {"tf": 1}, "velosearaptor.io.read_raw_rdi_uh": {"tf": 1}}, "df": 2}}}}}}}, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "l": {"docs": {"velosearaptor": {"tf": 1}}, "df": 1}}}, "d": {"docs": {"velosearaptor": {"tf": 1}}, "df": 1}, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "d": {"docs": {"velosearaptor": {"tf": 1}, "velosearaptor.io.cf_conventions": {"tf": 2}}, "df": 2}}}}}, "m": {"docs": {}, "df": 0, "p": {"docs": {"velosearaptor": {"tf": 1}, "velosearaptor.madcp.ProcessADCP": {"tf": 1}}, "df": 2, "s": {"docs": {"velosearaptor.madcp.ProcessADCP.make_start_ddays": {"tf": 1}}, "df": 1}}}, "r": {"docs": {}, "df": 0, "t": {"docs": {"velosearaptor.io.extract_raw_rdi": {"tf": 1}, "velosearaptor.madcp.ProcessADCP": {"tf": 2.6457513110645907}, "velosearaptor.madcp.ProcessADCP.read_ensemble": {"tf": 1.7320508075688772}, "velosearaptor.madcp.ProcessADCP.process_pings": {"tf": 1.4142135623730951}, "velosearaptor.madcp.ProcessADCP.average_ensembles": {"tf": 2.23606797749979}, "velosearaptor.madcp.ProcessADCP.burst_average_ensembles": {"tf": 2.6457513110645907}}, "df": 6, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"velosearaptor.io.yday0_to_datetime64": {"tf": 1}}, "df": 1}}}}}, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "s": {"docs": {"velosearaptor.madcp.ProcessADCP.plot_echo_stats": {"tf": 1}}, "df": 1}}}}}}}}, "e": {"docs": {}, "df": 0, "p": {"docs": {"velosearaptor.madcp": {"tf": 1}}, "df": 1}}, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"velosearaptor.madcp.ProcessADCP": {"tf": 1}}, "df": 1}}}, "p": {"docs": {"velosearaptor.madcp.ProcessADCP.process_pings": {"tf": 1.4142135623730951}, "velosearaptor.madcp.ProcessADCP.average_ensembles": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.burst_average_ensembles": {"tf": 1}}, "df": 3}}}, "o": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "w": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {"velosearaptor": {"tf": 1}}, "df": 1}}}}}}, "m": {"docs": {}, "df": 0, "e": {"docs": {"velosearaptor.madcp": {"tf": 1}}, "df": 1, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"velosearaptor": {"tf": 1}}, "df": 1}}}}}}}, "u": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {"velosearaptor": {"tf": 1}}, "df": 1}}}, "n": {"docs": {}, "df": 0, "d": {"docs": {"velosearaptor.madcp": {"tf": 1}}, "df": 1}}}}, "h": {"docs": {"velosearaptor": {"tf": 1}}, "df": 1, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"velosearaptor": {"tf": 1}}, "df": 1}}}}, "l": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "w": {"docs": {"velosearaptor.madcp.ProcessADCP": {"tf": 1}}, "df": 1}}}}}, "e": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "l": {"docs": {"velosearaptor": {"tf": 1.4142135623730951}}, "df": 1}}}}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {"velosearaptor": {"tf": 1}}, "df": 1}}, "g": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"velosearaptor.madcp.ProcessADCP.parse_file_locations": {"tf": 1.4142135623730951}, "velosearaptor.madcp.ProcessADCP.process_pings": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.burst_average_ensembles": {"tf": 1}}, "df": 3}}}}, "z": {"docs": {}, "df": 0, "e": {"docs": {"velosearaptor.adcp.plot_raw_adcp": {"tf": 1}, "velosearaptor.adcp.plot_raw_adcp_auxillary": {"tf": 1}, "velosearaptor.madcp.ProcessADCP": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.parse_file_locations": {"tf": 1.4142135623730951}, "velosearaptor.madcp.ProcessADCP.default_dgridparams": {"tf": 1.4142135623730951}, "velosearaptor.madcp.ProcessADCP.process_pings": {"tf": 1}}, "df": 6}}, "g": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "a": {"docs": {"velosearaptor.madcp.ProcessADCP": {"tf": 1}}, "df": 1}}}}, "y": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "m": {"docs": {"velosearaptor": {"tf": 1.7320508075688772}}, "df": 1}}}}}, "e": {"docs": {}, "df": 0, "e": {"docs": {"velosearaptor": {"tf": 1}, "velosearaptor.io.cf_conventions": {"tf": 1.4142135623730951}, "velosearaptor.madcp": {"tf": 1}, "velosearaptor.madcp.ProcessADCP": {"tf": 2}, "velosearaptor.madcp.ProcessADCP.parse_dgridparams": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.parse_tgridparams": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.parse_editparams": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.parse_driftparams": {"tf": 1}}, "df": 8}, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {"velosearaptor": {"tf": 1}, "velosearaptor.io.parse_yaml_input": {"tf": 1}, "velosearaptor.madcp.ProcessADCP": {"tf": 1}}, "df": 3}}, "e": {"docs": {}, "df": 0, "s": {"docs": {"velosearaptor": {"tf": 1.4142135623730951}, "velosearaptor.madcp.ProcessADCP": {"tf": 2.23606797749979}, "velosearaptor.madcp.ProcessADCP.plot_pressure": {"tf": 1}}, "df": 3}}}}, "t": {"docs": {"velosearaptor.io.read_raw_rdi": {"tf": 1}, "velosearaptor.madcp.ProcessADCP": {"tf": 1}}, "df": 2, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "s": {"docs": {"velosearaptor.io.parse_yaml_input": {"tf": 1}}, "df": 1}}}}}, "s": {"docs": {"velosearaptor.madcp.ProcessADCP.process_pings": {"tf": 1}}, "df": 1}}, "n": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "l": {"docs": {"velosearaptor.madcp": {"tf": 1}}, "df": 1}}}}}}, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {"velosearaptor.madcp.ProcessADCP.read_ensemble": {"tf": 1}}, "df": 1}}}}}}, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"velosearaptor": {"tf": 1}}, "df": 1}}}}}}}, "m": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"velosearaptor": {"tf": 1.7320508075688772}, "velosearaptor.madcp.ProcessADCP": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.make_start_ddays": {"tf": 1}}, "df": 3}}}}}}, "v": {"docs": {}, "df": 0, "e": {"docs": {"velosearaptor.io.extract_raw_rdi": {"tf": 1}}, "df": 1}}}, "c": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "t": {"docs": {"velosearaptor": {"tf": 1.4142135623730951}}, "df": 1}}}, "e": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {"velosearaptor": {"tf": 1}, "velosearaptor.madcp.ProcessADCP": {"tf": 1}}, "df": 2}}}}, "h": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {"velosearaptor.madcp.ProcessADCP": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.make_start_ddays": {"tf": 1}}, "df": 2, "s": {"docs": {"velosearaptor": {"tf": 1.7320508075688772}}, "df": 1}}}}}}, "u": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "o": {"docs": {"velosearaptor": {"tf": 1}}, "df": 1}}}, "n": {"docs": {"velosearaptor": {"tf": 1}, "velosearaptor.io.parse_yaml_input": {"tf": 1.4142135623730951}, "velosearaptor.madcp.ProcessADCP": {"tf": 1}}, "df": 3}, "q": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {"velosearaptor": {"tf": 1}}, "df": 1}}}}}, "p": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "c": {"docs": {"velosearaptor.io.parse_yaml_input": {"tf": 1}}, "df": 1, "s": {"docs": {"velosearaptor.madcp.ProcessADCP": {"tf": 1}}, "df": 1}}}}}}, "e": {"docs": {}, "df": 0, "d": {"docs": {"velosearaptor.madcp": {"tf": 1}}, "df": 1}}}}, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "y": {"docs": {"velosearaptor.madcp.ProcessADCP": {"tf": 1}}, "df": 1}}}}}}}, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "l": {"docs": {"velosearaptor.madcp.ProcessADCP.parse_file_locations": {"tf": 1}}, "df": 1, "e": {"docs": {}, "df": 0, "r": {"docs": {"velosearaptor.madcp.ProcessADCP.parse_file_locations": {"tf": 1}}, "df": 1}}}}}}}, "b": {"docs": {}, "df": 0, "y": {"docs": {"velosearaptor": {"tf": 2.449489742783178}, "velosearaptor.madcp.ProcessADCP": {"tf": 1.7320508075688772}}, "df": 2}, "a": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {"velosearaptor.io.yday0_to_datetime64": {"tf": 1}}, "df": 1, "d": {"docs": {"velosearaptor": {"tf": 1}, "velosearaptor.madcp.ProcessADCP": {"tf": 1.7320508075688772}, "velosearaptor.madcp.ProcessADCP.magdec": {"tf": 1}}, "df": 3}, "y": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {"velosearaptor.io.yday0_to_datetime64": {"tf": 1}}, "df": 1}}}}}}, "d": {"docs": {"velosearaptor.madcp.ProcessADCP": {"tf": 1}}, "df": 1}}, "e": {"docs": {"velosearaptor": {"tf": 1.4142135623730951}, "velosearaptor.io.parse_yaml_input": {"tf": 1}, "velosearaptor.madcp.ProcessADCP": {"tf": 2.449489742783178}, "velosearaptor.madcp.ProcessADCP.parse_file_locations": {"tf": 2}, "velosearaptor.madcp.ProcessADCP.make_start_ddays": {"tf": 1.4142135623730951}, "velosearaptor.madcp.ProcessADCP.magdec": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.burst_average_ensembles": {"tf": 1}}, "df": 7, "e": {"docs": {}, "df": 0, "n": {"docs": {"velosearaptor": {"tf": 1}}, "df": 1}}, "t": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"velosearaptor": {"tf": 1}}, "df": 1}}}, "w": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {"velosearaptor.madcp.ProcessADCP": {"tf": 1.4142135623730951}}, "df": 1}}}}}, "f": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {"velosearaptor": {"tf": 1.4142135623730951}}, "df": 1}}}}, "l": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "w": {"docs": {"velosearaptor.madcp.ProcessADCP": {"tf": 2.23606797749979}}, "df": 1}}}, "a": {"docs": {}, "df": 0, "m": {"docs": {"velosearaptor.madcp.ProcessADCP": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.process_pings": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.plot_echo_stats": {"tf": 1}}, "df": 3}}, "y": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "d": {"docs": {"velosearaptor.madcp.ProcessADCP": {"tf": 1}}, "df": 1}}}}, "g": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"velosearaptor.madcp.ProcessADCP.burst_average_ensembles": {"tf": 1.4142135623730951}}, "df": 1}}}}}}}}, "o": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "m": {"docs": {"velosearaptor": {"tf": 1}}, "df": 1}}}}, "o": {"docs": {}, "df": 0, "l": {"docs": {"velosearaptor.io.read_raw_rdi": {"tf": 1}, "velosearaptor.madcp.ProcessADCP": {"tf": 1.4142135623730951}, "velosearaptor.madcp.ProcessADCP.process_pings": {"tf": 1}}, "df": 3, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {"velosearaptor.madcp.ProcessADCP": {"tf": 1}}, "df": 1}}}}}}}, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "w": {"docs": {"velosearaptor": {"tf": 1}}, "df": 1}, "a": {"docs": {}, "df": 0, "k": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"velosearaptor": {"tf": 1.7320508075688772}}, "df": 1}}}}}}, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "s": {"docs": {"velosearaptor": {"tf": 1}}, "df": 1}}}}}, "i": {"docs": {}, "df": 0, "n": {"1": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {"velosearaptor.madcp": {"tf": 1.4142135623730951}}, "df": 1}}}}}, "docs": {"velosearaptor": {"tf": 1.4142135623730951}, "velosearaptor.madcp": {"tf": 1.4142135623730951}, "velosearaptor.madcp.ProcessADCP": {"tf": 1.4142135623730951}, "velosearaptor.madcp.ProcessADCP.default_dgridparams": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.burst_average_ensembles": {"tf": 1.4142135623730951}}, "df": 5, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "y": {"docs": {"velosearaptor": {"tf": 1}}, "df": 1}}}, "s": {"docs": {"velosearaptor.madcp.ProcessADCP": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.default_dgridparams": {"tf": 1.4142135623730951}}, "df": 2}, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "k": {"docs": {"velosearaptor.madcp.ProcessADCP": {"tf": 1}}, "df": 1}}, "p": {"docs": {"velosearaptor.madcp.ProcessADCP.process_pings": {"tf": 1}}, "df": 1, "p": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"velosearaptor.madcp.ProcessADCP.process_pings": {"tf": 1}}, "df": 1}}}}}}}, "n": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"velosearaptor.madcp.ProcessADCP.default_dgridparams": {"tf": 1}}, "df": 1}}}}}}, "u": {"docs": {}, "df": 0, "g": {"docs": {"velosearaptor": {"tf": 1.4142135623730951}}, "df": 1}, "t": {"docs": {"velosearaptor.madcp.ProcessADCP": {"tf": 1}}, "df": 1, "t": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {"velosearaptor": {"tf": 1}}, "df": 1}}}}, "r": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {"velosearaptor": {"tf": 2.8284271247461903}, "velosearaptor.madcp": {"tf": 1}, "velosearaptor.madcp.ProcessADCP": {"tf": 2}, "velosearaptor.madcp.ProcessADCP.make_start_ddays": {"tf": 1.4142135623730951}}, "df": 4, "s": {"docs": {"velosearaptor.madcp.ProcessADCP": {"tf": 1.4142135623730951}}, "df": 1}}}}, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "d": {"docs": {"velosearaptor": {"tf": 1}}, "df": 1}}}, "n": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "h": {"docs": {"velosearaptor.io.read_raw_rdi_uh": {"tf": 1}, "velosearaptor.madcp.ProcessADCP": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.read_ensemble": {"tf": 1}}, "df": 3}}}}, "b": {"docs": {"velosearaptor.io.extract_raw_rdi": {"tf": 1}}, "df": 1}, "l": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "k": {"docs": {"velosearaptor.madcp": {"tf": 1}}, "df": 1}}}}}, "q": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "k": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "y": {"docs": {"velosearaptor": {"tf": 1}}, "df": 1}}}}}, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"velosearaptor.madcp": {"tf": 1}}, "df": 1}}}}}}}}}}}}}, "h": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "s": {"docs": {"velosearaptor": {"tf": 1}}, "df": 1, "t": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "y": {"docs": {"velosearaptor": {"tf": 1.4142135623730951}}, "df": 1}}}}}}, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {"velosearaptor": {"tf": 1}, "velosearaptor.madcp": {"tf": 1}, "velosearaptor.madcp.ProcessADCP": {"tf": 1}}, "df": 3}}}, "o": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "w": {"docs": {"velosearaptor": {"tf": 1}}, "df": 1}}}}}}, "u": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "s": {"docs": {"velosearaptor.madcp.ProcessADCP": {"tf": 1.4142135623730951}}, "df": 1}}}, "w": {"docs": {"velosearaptor.madcp.ProcessADCP.process_pings": {"tf": 1}}, "df": 1}}, "t": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, ":": {"docs": {}, "df": 0, "/": {"docs": {}, "df": 0, "/": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "b": {"docs": {"velosearaptor": {"tf": 1}}, "df": 1}}}}}}, "c": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {"velosearaptor.io.cf_conventions": {"tf": 1}}, "df": 1}}}}}}}}}}}}}, "w": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "k": {"docs": {}, "df": 0, "i": {"docs": {"velosearaptor.io.cf_conventions": {"tf": 1}}, "df": 1}}}}}}}}, ":": {"docs": {}, "df": 0, "/": {"docs": {}, "df": 0, "/": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "f": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "v": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {"velosearaptor.io.cf_conventions": {"tf": 1}}, "df": 1}}}}}}}}}}}}}}}}}}, "m": {"docs": {}, "df": 0, "l": {"docs": {"velosearaptor.io.cf_conventions": {"tf": 1.4142135623730951}}, "df": 1}}}, "a": {"docs": {}, "df": 0, "s": {"docs": {"velosearaptor": {"tf": 1}}, "df": 1}, "p": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {"velosearaptor": {"tf": 1}}, "df": 1}}}}}}}, "n": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "y": {"docs": {"velosearaptor": {"tf": 1}}, "df": 1}}}}}}}, "e": {"docs": {}, "df": 0, "d": {"docs": {"velosearaptor": {"tf": 1}}, "df": 1, "e": {"docs": {}, "df": 0, "d": {"docs": {"velosearaptor.madcp.ProcessADCP": {"tf": 1}}, "df": 1}}}}, "w": {"docs": {"velosearaptor": {"tf": 1.4142135623730951}, "velosearaptor.io.extract_raw_rdi": {"tf": 1}}, "df": 2}, "t": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "f": {"docs": {"velosearaptor.madcp.ProcessADCP": {"tf": 1}}, "df": 1}}}}, "i": {"docs": {}, "df": 0, "g": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"velosearaptor.madcp.ProcessADCP.default_dgridparams": {"tf": 1}}, "df": 1}}}}}}}}}}, "o": {"docs": {"velosearaptor.madcp.ProcessADCP.burst_average_ensembles": {"tf": 1}}, "df": 1, "t": {"docs": {"velosearaptor": {"tf": 1}, "velosearaptor.io.parse_yaml_input": {"tf": 1}, "velosearaptor.madcp.ProcessADCP": {"tf": 1.7320508075688772}, "velosearaptor.madcp.ProcessADCP.parse_file_locations": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.magdec": {"tf": 1}}, "df": 5, "e": {"docs": {"velosearaptor": {"tf": 1.4142135623730951}}, "df": 1, "b": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "k": {"docs": {"velosearaptor": {"tf": 1}}, "df": 1, "s": {"docs": {}, "df": 0, "/": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "s": {"docs": {"velosearaptor.madcp.ProcessADCPyml": {"tf": 1}}, "df": 1}}}}}}}}}}}}}}}}, "s": {"docs": {"velosearaptor.io.cf_conventions": {"tf": 1}, "velosearaptor.madcp": {"tf": 1.4142135623730951}, "velosearaptor.madcp.ProcessADCP": {"tf": 2.23606797749979}, "velosearaptor.madcp.ProcessADCP.parse_dgridparams": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.parse_tgridparams": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.parse_editparams": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.parse_driftparams": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.make_start_ddays": {"tf": 1}}, "df": 8}}}, "w": {"docs": {"velosearaptor": {"tf": 1}}, "df": 1}, "n": {"docs": {}, "df": 0, "e": {"docs": {"velosearaptor.io.parse_yaml_input": {"tf": 1}, "velosearaptor.madcp.ProcessADCP": {"tf": 1.4142135623730951}, "velosearaptor.madcp.ProcessADCP.burst_average_ensembles": {"tf": 2}}, "df": 3}}}, "u": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"velosearaptor": {"tf": 1.4142135623730951}, "velosearaptor.io.parse_yaml_input": {"tf": 1}, "velosearaptor.madcp": {"tf": 1}, "velosearaptor.madcp.ProcessADCP": {"tf": 1.7320508075688772}, "velosearaptor.madcp.ProcessADCP.process_pings": {"tf": 1.4142135623730951}}, "df": 5}}, "u": {"docs": {}, "df": 0, "r": {"docs": {"velosearaptor.madcp.ProcessADCP": {"tf": 1}}, "df": 1}}}, "p": {"docs": {}, "df": 0, "y": {"docs": {"velosearaptor.io.yday0_to_datetime64": {"tf": 1.4142135623730951}}, "df": 1}}}}, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "e": {"docs": {"velosearaptor.io.extract_raw_rdi": {"tf": 1}, "velosearaptor.io.cf_conventions": {"tf": 1}, "velosearaptor.madcp.ProcessADCP": {"tf": 1.4142135623730951}, "velosearaptor.madcp.ProcessADCP.parse_file_locations": {"tf": 1}}, "df": 4, "s": {"docs": {"velosearaptor.io.cf_conventions": {"tf": 1.4142135623730951}}, "df": 1, "/": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "/": {"docs": {}, "df": 0, "b": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "/": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "f": {"docs": {"velosearaptor.io.cf_conventions": {"tf": 1}}, "df": 1}}}}}}}}}}}}}}}}}}}}}, "p": {"docs": {"velosearaptor.io.yday0_to_datetime64": {"tf": 1}, "velosearaptor.madcp": {"tf": 1}}, "df": 2}, "c": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "s": {"docs": {"velosearaptor.madcp": {"tf": 1}}, "df": 1}}}}}}, "y": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "l": {"docs": {"velosearaptor": {"tf": 2}, "velosearaptor.io.parse_yaml_input": {"tf": 1}, "velosearaptor.madcp": {"tf": 1}, "velosearaptor.madcp.ProcessADCPyml": {"tf": 1.4142135623730951}}, "df": 4}}, "o": {"docs": {}, "df": 0, "u": {"docs": {"velosearaptor": {"tf": 1.4142135623730951}}, "df": 1}}, "e": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {"velosearaptor.io.yday0_to_datetime64": {"tf": 1.7320508075688772}}, "df": 1}}}, "d": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "y": {"docs": {"velosearaptor.io.yday0_to_datetime64": {"tf": 1.4142135623730951}}, "df": 1}}}, "a": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "l": {"docs": {"velosearaptor.io.parse_yaml_input": {"tf": 1}}, "df": 1, "f": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "e": {"docs": {"velosearaptor.io.parse_yaml_input": {"tf": 1}}, "df": 1}}}}}}}}, "w": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "d": {"docs": {"velosearaptor": {"tf": 1}}, "df": 1}}}, "r": {"docs": {}, "df": 0, "k": {"docs": {"velosearaptor": {"tf": 1}}, "df": 1, "s": {"docs": {"velosearaptor": {"tf": 1}}, "df": 1}, "h": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {"velosearaptor.madcp": {"tf": 1}}, "df": 1}}}}}}}}, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {"velosearaptor": {"tf": 3.1622776601683795}, "velosearaptor.adcp": {"tf": 1}, "velosearaptor.io": {"tf": 1}, "velosearaptor.io.read_raw_rdi_uh": {"tf": 1}, "velosearaptor.io.parse_yaml_input": {"tf": 1}, "velosearaptor.io.cf_conventions": {"tf": 1}, "velosearaptor.madcp": {"tf": 1.7320508075688772}, "velosearaptor.madcp.ProcessADCP": {"tf": 2}, "velosearaptor.madcp.ProcessADCP.parse_file_locations": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.read_ensemble": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.burst_average_ensembles": {"tf": 1}, "velosearaptor.madcp.ProcessADCPyml": {"tf": 1}}, "df": 12, "o": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "t": {"docs": {"velosearaptor.io.parse_yaml_input": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.parse_file_locations": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.process_pings": {"tf": 1}}, "df": 3}}}, "i": {"docs": {}, "df": 0, "n": {"docs": {"velosearaptor.madcp.ProcessADCP": {"tf": 1}}, "df": 1}}}}, "l": {"docs": {}, "df": 0, "l": {"docs": {"velosearaptor.io.parse_yaml_input": {"tf": 1}, "velosearaptor.madcp.ProcessADCP": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.parse_file_locations": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.make_start_ddays": {"tf": 1.4142135623730951}}, "df": 4}}}, "e": {"docs": {}, "df": 0, "l": {"docs": {}, "df": 0, "l": {"docs": {"velosearaptor": {"tf": 1}}, "df": 1}}}, "h": {"docs": {"velosearaptor.io.extract_raw_rdi": {"tf": 1.4142135623730951}}, "df": 1, "e": {"docs": {}, "df": 0, "n": {"docs": {"velosearaptor": {"tf": 1.4142135623730951}}, "df": 1}}, "i": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "h": {"docs": {"velosearaptor.madcp.ProcessADCP.parse_file_locations": {"tf": 1}}, "df": 1}}}}, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"velosearaptor": {"tf": 1}}, "df": 1}}}}, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"velosearaptor": {"tf": 1}}, "df": 1, "s": {"docs": {"velosearaptor.madcp.ProcessADCP.process_pings": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.average_ensembles": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.burst_average_ensembles": {"tf": 1}}, "df": 3}}}}, "a": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {"velosearaptor.io.read_raw_rdi_uh": {"tf": 1}}, "df": 1}}}}}}, "s": {"docs": {"velosearaptor.madcp": {"tf": 1}}, "df": 1}, "m": {"docs": {"velosearaptor.madcp": {"tf": 1}}, "df": 1}, "f": {"docs": {"velosearaptor.madcp": {"tf": 1}}, "df": 1}}, "g": {"docs": {"velosearaptor": {"tf": 1.7320508075688772}}, "df": 1, "c": {"docs": {}, "df": 0, "c": {"docs": {"velosearaptor": {"tf": 1}}, "df": 1}}, "e": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "m": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "g": {"docs": {"velosearaptor": {"tf": 1.4142135623730951}}, "df": 1}}}}, "n": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "e": {"docs": {"velosearaptor": {"tf": 1}, "velosearaptor.madcp.ProcessADCP": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.make_start_ddays": {"tf": 1}}, "df": 3, "d": {"docs": {"velosearaptor.madcp.ProcessADCP": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.read_ensemble": {"tf": 1}}, "df": 2}}}, "l": {"docs": {"velosearaptor.adcp": {"tf": 1}, "velosearaptor.io.parse_yaml_input": {"tf": 1}, "velosearaptor.madcp": {"tf": 1.4142135623730951}}, "df": 3}}}}}}, "r": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "d": {"docs": {"velosearaptor": {"tf": 1}, "velosearaptor.madcp.ProcessADCP": {"tf": 1.7320508075688772}, "velosearaptor.madcp.ProcessADCP.default_dgridparams": {"tf": 1}}, "df": 3, "d": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "g": {"docs": {"velosearaptor": {"tf": 2.23606797749979}, "velosearaptor.io.parse_yaml_input": {"tf": 1.4142135623730951}, "velosearaptor.madcp": {"tf": 1}, "velosearaptor.madcp.ProcessADCP": {"tf": 3}, "velosearaptor.madcp.ProcessADCP.default_dgridparams": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.parse_dgridparams": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.parse_tgridparams": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.burst_average_ensembles": {"tf": 1}}, "df": 8}}}}}}, "o": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "d": {"docs": {"velosearaptor.madcp.ProcessADCP": {"tf": 1}, "velosearaptor.madcp.ProcessADCP.read_ensemble": {"tf": 1}}, "df": 2}}}}}}, "u": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "r": {"docs": {"velosearaptor": {"tf": 1}}, "df": 1, "v": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "t": {"docs": {"velosearaptor": {"tf": 1}}, "df": 1}}}}}}}}}, "a": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "p": {"docs": {"velosearaptor": {"tf": 1}}, "df": 1}}}}, "i": {"docs": {}, "df": 0, "t": {"docs": {}, "df": 0, "h": {"docs": {}, "df": 0, "u": {"docs": {}, "df": 0, "b": {"docs": {"velosearaptor": {"tf": 2}}, "df": 1}}}}}, "v": {"docs": {}, "df": 0, "p": {"docs": {}, "df": 0, "y": {"docs": {"velosearaptor": {"tf": 1.4142135623730951}}, "df": 1}}}, "o": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "d": {"docs": {"velosearaptor.madcp.ProcessADCP": {"tf": 1.4142135623730951}, "velosearaptor.madcp.ProcessADCP.parse_file_locations": {"tf": 1}}, "df": 2}}, "e": {"docs": {}, "df": 0, "s": {"docs": {"velosearaptor.madcp.ProcessADCP": {"tf": 1}}, "df": 1}}}}, "j": {"docs": {}, "df": 0, "e": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "e": {"docs": {"velosearaptor": {"tf": 1.4142135623730951}}, "df": 1}}}}, "u": {"docs": {}, "df": 0, "s": {"docs": {}, "df": 0, "t": {"docs": {"velosearaptor.madcp.ProcessADCP": {"tf": 1}}, "df": 1}}, "l": {"docs": {}, "df": 0, "i": {"docs": {}, "df": 0, "a": {"docs": {}, "df": 0, "n": {"docs": {"velosearaptor.madcp.ProcessADCP": {"tf": 1}}, "df": 1}}}}}}, "k": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "c": {"docs": {}, "df": 0, "k": {"docs": {}, "df": 0, "d": {"docs": {}, "df": 0, "o": {"docs": {}, "df": 0, "w": {"docs": {}, "df": 0, "n": {"docs": {}, "df": 0, "s": {"docs": {"velosearaptor": {"tf": 1}}, "df": 1}}}}}}}}}}, "z": {"docs": {"velosearaptor": {"tf": 1}}, "df": 1, "e": {"docs": {}, "df": 0, "r": {"docs": {}, "df": 0, "o": {"docs": {"velosearaptor.madcp.ProcessADCP": {"tf": 1}}, "df": 1}}}}}}}, "pipeline": ["trimmer"], "_isPrebuiltIndex": true}; + + // mirrored in build-search-index.js (part 1) + // Also split on html tags. this is a cheap heuristic, but good enough. + elasticlunr.tokenizer.setSeperator(/[\s\-.;&_'"=,()]+|<[^>]*>/); + + let searchIndex; + if (docs._isPrebuiltIndex) { + console.info("using precompiled search index"); + searchIndex = elasticlunr.Index.load(docs); + } else { + console.time("building search index"); + // mirrored in build-search-index.js (part 2) + searchIndex = elasticlunr(function () { + this.pipeline.remove(elasticlunr.stemmer); + this.pipeline.remove(elasticlunr.stopWordFilter); + this.addField("qualname"); + this.addField("fullname"); + this.addField("annotation"); + this.addField("default_value"); + this.addField("signature"); + this.addField("bases"); + this.addField("doc"); + this.setRef("fullname"); + }); + for (let doc of docs) { + searchIndex.addDoc(doc); + } + console.timeEnd("building search index"); + } + + return (term) => searchIndex.search(term, { + fields: { + qualname: {boost: 4}, + fullname: {boost: 2}, + annotation: {boost: 2}, + default_value: {boost: 2}, + signature: {boost: 2}, + bases: {boost: 2}, + doc: {boost: 1}, + }, + expand: true + }); +})(); \ No newline at end of file diff --git a/velosearaptor.html b/velosearaptor.html new file mode 100644 index 0000000..15b5c8c --- /dev/null +++ b/velosearaptor.html @@ -0,0 +1,400 @@ + + + + + + + velosearaptor API documentation + + + + + + + + + +
+
+ Edit on GitHub +

+velosearaptor

+ +

velosearaptor

+ +

Library of python modules for reading and processing raw RDI Teledyne ADCP data. The code interfaces the UH package pycurrents and its Multiread for efficient reading of raw ADCP data.

+ +

velosearaptor.io provides convenience functions for reading raw data either into an xarray.Dataset or into the output structure format provided by the UH software package.

+ +

velosearaptor.adcp is a collection of functions that are useful to quickly analyze raw ADCP data.

+ +

velosearaptor.madcp contains functions for processing moored ADCP data. Many thanks to Eric Fiering for sharing his code on moored ADCP data processing mcm_avp.py that much of this is based on.

+ +

Installation

+ +

Installing pycurrents

+ +

This package depends on the pycurrents package. Installation instructions can either be found here, or a conda environment including all necessary dependencies can be installed via conda env create -f environment.yml. Take a look at environment.yml and requirements.txt and copy the relevant parts if you would like to incude the package and its dependencies in other environments.

+ +

Installing magdec

+ +

Note that this method only works with the editable pip install of velosearaptor (e.g. pip install -e .) since it compiles magdec locally and does not do a system install. See note at bottom for system install.

+ +

Requirements:

+ +
    +
  • A C compiler, e.g. in OSX with homebrew use brew install gcc
  • +
  • conda package manager
  • +
  • The velosearaptor environment installed via conda, e.g. conda env create -f environment.yml
  • +
+ +

With the requirements satisfied, run the shell script:

+ +
+
./install_magdec.sh
+
+
+ +

To remove, delete the geomag/ directory.

+ +

For a system install you need to cd geomag and do something like sudo make install.

+ +
+ +

History

+ +

v0.?? (unreleased)

+ +

New Features

+ + + +

Breaking Changes

+ +
    +
  • Transfer repository from gunnarvoet to modscripps and rename from gadcp to velosearaptor. Legacy code still exists at https://github.com/gunnarvoet/gadcp.
  • +
  • Change processed dataset coordinate z to depth (PR48).
  • +
  • Change vel_std variables in output dataset to vel_error by dividing the standard deviation of each average by the square root of the number of pings (PR26).
  • +
+ +

Bug Fixes

+ +
    +
  • Fix conda/pip environment.
  • +
  • Read correct instrument orientation when a majority of the time series has been recorded outside the water (PR44).
  • +
  • Read paths provided via pathlib.PosixPath objects (PR55). By Gunnar Voet.
  • +
+ +

Documentation

+ +
    +
  • Consolidate readme and history files.
  • +
  • Add button with link to source code on GitHub (PR43).
  • +
+ +

Internal Changes

+ +
    +
  • Remove gvpy dependency (PR27).
  • +
+ +

v0.2.0 (2022 March)

+ +

This release brings a major refactoring of the velosearaptor.madcp module with lots of breaking changes. The module now allows for improved ensemble averages for burst sampling schemes with better control of the editing parameters.

+ +

New Features

+ + + +

Breaking Changes

+ + + +

Bug Fixes

+ +
    +
  • Correct time stamp calculation for burst averages.
  • +
  • For burst sampling schemes average pressure before gridding to depth.
  • +
+ +

Documentation

+ + + +

Internal Changes

+ +
    +
  • Improved the pip/conda requirements to automatically install the pycurrents package.
  • +
+ +

v0.0.1 (2020-04-28)

+ +
    +
  • Moved all ADCP-related functions from gvpy to this module.
  • +
+
+ + + + + +
 1"""
+ 2.. include:: ../README.md
+ 3
+ 4---
+ 5
+ 6.. include:: ../HISTORY.md
+ 7
+ 8"""
+ 9__all__ = ["io", "adcp", "madcp"]
+10
+11__author__ = "velosearaptor Developers"
+12__email__ = ""
+13__version__ = "0.2.0"
+14
+15from . import adcp, io, madcp
+
+ + +
+
+ + \ No newline at end of file diff --git a/velosearaptor/adcp.html b/velosearaptor/adcp.html new file mode 100644 index 0000000..8bdb4cd --- /dev/null +++ b/velosearaptor/adcp.html @@ -0,0 +1,712 @@ + + + + + + + velosearaptor.adcp API documentation + + + + + + + + + +
+
+ Edit on GitHub +

+velosearaptor.adcp

+ +

Module velosearaptor.adcp with general adcp functions

+
+ + + + + +
  1#!/usr/bin/env python
+  2# -*- coding: utf-8 -*-
+  3"""Module velosearaptor.adcp with general adcp functions"""
+  4
+  5import os
+  6
+  7import matplotlib.dates as mdates
+  8import matplotlib.pyplot as plt
+  9import numpy as np
+ 10
+ 11
+ 12def plot_raw_adcp(adcp, figsize=(17, 20)):
+ 13    """
+ 14    Plot raw RDI adcp dataset.
+ 15
+ 16    Parameters
+ 17    ----------
+ 18    adcp : xarray.Dataset
+ 19        Raw RDI ADCP data read using velosearaptor.io.read_raw_rdi()
+ 20    figsize : tuple
+ 21        Provide figure size (default (17, 20))
+ 22    """
+ 23
+ 24    fig1 = plt.figure(figsize=figsize)
+ 25    gs0 = fig1.add_gridspec(nrows=16, ncols=90)
+ 26
+ 27    def plot_time_series(v, rowid, yincrease=False):
+ 28        tsax.append(fig1.add_subplot(gs0[rowid, 0:70]))
+ 29        if isinstance(v, list):
+ 30            for vi in v:
+ 31                adcp[vi].plot(ax=tsax[-1], yincrease=yincrease, label=vi)
+ 32                _ysym()
+ 33            tsax[-1].legend()
+ 34        else:
+ 35            adcp[v].plot(ax=tsax[-1], yincrease=yincrease)
+ 36        return tsax
+ 37
+ 38    tsax = []
+ 39    tsax = plot_time_series("pressure", 0)
+ 40    tsax = plot_time_series(["pitch", "roll"], 13, True)
+ 41    tsax = plot_time_series("heading", 14, True)
+ 42    tsax = plot_time_series("temperature", 15, True)
+ 43
+ 44    def plot_beam_quantity(startrow, v, vmin, vmax, cmap, clabel):
+ 45        velcax = fig1.add_subplot(gs0[startrow + 1 : startrow + 5, 70])
+ 46        velax = []
+ 47        for i in range(4):
+ 48            velax.append(fig1.add_subplot(gs0[i + startrow + 1, 0:70]))
+ 49        for axi, (g, b) in zip(velax, adcp[v].groupby("beam")):
+ 50            h = b.plot(
+ 51                ax=axi,
+ 52                add_colorbar=False,
+ 53                vmin=vmin,
+ 54                vmax=vmax,
+ 55                cmap=cmap,
+ 56                yincrease=False,
+ 57            )
+ 58            axi.text(
+ 59                0.01,
+ 60                0.1,
+ 61                "beam {}".format(g),
+ 62                transform=axi.transAxes,
+ 63                bbox=dict(fc="w", ec="0.3", alpha=0.7, boxstyle="Round, pad=0.2"),
+ 64            )
+ 65        plt.colorbar(h, cax=velcax, label=clabel)
+ 66        for axi in velax:
+ 67            axi.set(xlabel="", title="")
+ 68        for axi in velax:
+ 69            axi.tick_params(labelbottom=False)
+ 70        _concise_date(velax[-1], show_offset=False)
+ 71
+ 72        return velax
+ 73
+ 74    def plot_time_mean_beam_quantity(startrow, v):
+ 75        meanax = fig1.add_subplot(gs0[startrow + 1 : startrow + 4, 80:90])
+ 76        cors = [vb.mean(dim="time") for (g, vb) in adcp[v].groupby("beam")]
+ 77        for b, ai in enumerate(cors):
+ 78            ai.plot(
+ 79                ax=meanax,
+ 80                y="z",
+ 81                label="beam{}".format(b + 1),
+ 82                yincrease=False,
+ 83                marker="o",
+ 84                linestyle="",
+ 85                alpha=0.8,
+ 86            )
+ 87        meanax.set(title="")
+ 88        meanax.legend()
+ 89
+ 90    velax = plot_beam_quantity(0, "vel", -1.5, 1.5, "RdBu_r", "velocity [m/s]")
+ 91    corax = plot_beam_quantity(0 + 4, "cor", 0, 150, "viridis", "correlation")
+ 92    ampax = plot_beam_quantity(0 + 8, "amp", 50, 200, "magma", "amplitude")
+ 93
+ 94    plot_time_mean_beam_quantity(4, "cor")
+ 95    plot_time_mean_beam_quantity(8, "amp")
+ 96
+ 97    _concise_date(tsax[-1])
+ 98    tsax[-1].tick_params(labelbottom=True)
+ 99    for axi in tsax[:-1]:
+100        axi.tick_params(labelbottom=False)
+101    for axi in tsax:
+102        axi.set(xlim=velax[-1].get_xlim(), xlabel="")
+103
+104    infoax = fig1.add_subplot(gs0[0:3, 80:90])
+105    infoax.text(
+106        -0.2,
+107        0.7,
+108        "instrument: {}\nping type: {}\ncoordinate system: {}\nbin size: {}".format(
+109            adcp.attrs["sonar"],
+110            adcp.attrs["pingtype"],
+111            adcp.attrs["coordsystem"],
+112            adcp.attrs["cellsize"],
+113        ),
+114        transform=infoax.transAxes,
+115    )
+116    infoax.axis("off")
+117
+118
+119def plot_raw_adcp_auxillary(adcp, figsize=(12, 5)):
+120    """
+121    Plot raw RDI adcp dataset (auxillary data only).
+122
+123    Parameters
+124    ----------
+125    adcp : xarray.Dataset
+126        Raw RDI ADCP data read using velosearaptor.io.read_raw_rdi()
+127    figsize : tuple
+128        Provide figure size (default (17, 20))
+129    """
+130    fig1 = plt.figure(figsize=figsize)
+131    gs0 = fig1.add_gridspec(nrows=4, ncols=15)
+132
+133    def plot_time_series(v, rowid, yincrease=False):
+134        tsax.append(fig1.add_subplot(gs0[rowid, 0:7]))
+135        if isinstance(v, list):
+136            for vi in v:
+137                adcp[vi].plot(ax=tsax[-1], yincrease=yincrease, label=vi)
+138                _ysym()
+139            tsax[-1].legend()
+140        else:
+141            adcp[v].plot(ax=tsax[-1], yincrease=yincrease)
+142        return tsax
+143
+144    def plot_time_mean_beam_quantity(startcol, v):
+145        meanax = fig1.add_subplot(gs0[1:, startcol : startcol + 3])
+146        cors = [vb.mean(dim="time") for (g, vb) in adcp[v].groupby("beam")]
+147        for b, ai in enumerate(cors):
+148            ai.plot(
+149                ax=meanax,
+150                y="z",
+151                label="beam{}".format(b + 1),
+152                yincrease=False,
+153                marker="o",
+154                linestyle="",
+155                alpha=0.8,
+156            )
+157        meanax.set(title="")
+158        meanax.legend()
+159
+160    tsax = []
+161    tsax = plot_time_series("pressure", 0)
+162    tsax = plot_time_series(["pitch", "roll"], 1, True)
+163    tsax = plot_time_series("heading", 2, True)
+164    tsax = plot_time_series("temperature", 3, True)
+165
+166    plot_time_mean_beam_quantity(8, "cor")
+167    plot_time_mean_beam_quantity(12, "amp")
+168
+169    _concise_date(tsax[-1])
+170    tsax[-1].tick_params(labelbottom=True)
+171    for axi in tsax[:-1]:
+172        axi.tick_params(labelbottom=False)
+173    for axi in tsax:
+174        axi.set(xlim=(adcp.time[0].data, adcp.time[-1].data), xlabel="")
+175
+176    infoax = fig1.add_subplot(gs0[0, 8:])
+177    infoax.text(
+178        0.1,
+179        0.4,
+180        "instrument: {}\nping type: {}\ncoordinate system: {}".format(
+181            adcp.attrs["sonar"], adcp.attrs["pingtype"], adcp.attrs["coordsystem"]
+182        ),
+183        transform=infoax.transAxes,
+184    )
+185    infoax.axis("off")
+186
+187
+188def _ysym(ax=None):
+189    """
+190    Set ylim symmetric around zero based on current axis limits
+191
+192    Parameters
+193    ----------
+194    ax : axis handle
+195        Handle to axis (optional).
+196    """
+197    if ax is None:
+198        ax = plt.gca()
+199    ylims = ax.get_ylim()
+200    absmax = np.max(np.abs(ylims))
+201    ax.set_ylim([-absmax, absmax])
+202
+203
+204def _concise_date(ax=None, minticks=3, maxticks=10, show_offset=True, **kwargs):
+205    """
+206    Better date ticks using matplotlib's ConciseDateFormatter.
+207
+208    Parameters
+209    ----------
+210    ax : axis handle
+211        Handle to axis (optional).
+212    minticks : int
+213        Minimum number of ticks (optional, default 6).
+214    maxticks : int
+215        Maximum number of ticks (optional, default 10).
+216    show_offset : bool, optional
+217        Show offset string to the right (default True).
+218
+219    Note
+220    ----
+221    Currently only works for x-axis
+222
+223    See Also
+224    --------
+225    matplotlib.mdates.ConciseDateFormatter : For formatting options that
+226      can be used here.
+227    """
+228    if ax is None:
+229        ax = plt.gca()
+230    locator = mdates.AutoDateLocator(minticks=minticks, maxticks=maxticks)
+231    formatter = mdates.ConciseDateFormatter(locator, show_offset=show_offset, **kwargs)
+232    ax.xaxis.set_major_locator(locator)
+233    ax.xaxis.set_major_formatter(formatter)
+
+ + +
+
+ +
+ + def + plot_raw_adcp(adcp, figsize=(17, 20)): + + + +
+ +
 13def plot_raw_adcp(adcp, figsize=(17, 20)):
+ 14    """
+ 15    Plot raw RDI adcp dataset.
+ 16
+ 17    Parameters
+ 18    ----------
+ 19    adcp : xarray.Dataset
+ 20        Raw RDI ADCP data read using velosearaptor.io.read_raw_rdi()
+ 21    figsize : tuple
+ 22        Provide figure size (default (17, 20))
+ 23    """
+ 24
+ 25    fig1 = plt.figure(figsize=figsize)
+ 26    gs0 = fig1.add_gridspec(nrows=16, ncols=90)
+ 27
+ 28    def plot_time_series(v, rowid, yincrease=False):
+ 29        tsax.append(fig1.add_subplot(gs0[rowid, 0:70]))
+ 30        if isinstance(v, list):
+ 31            for vi in v:
+ 32                adcp[vi].plot(ax=tsax[-1], yincrease=yincrease, label=vi)
+ 33                _ysym()
+ 34            tsax[-1].legend()
+ 35        else:
+ 36            adcp[v].plot(ax=tsax[-1], yincrease=yincrease)
+ 37        return tsax
+ 38
+ 39    tsax = []
+ 40    tsax = plot_time_series("pressure", 0)
+ 41    tsax = plot_time_series(["pitch", "roll"], 13, True)
+ 42    tsax = plot_time_series("heading", 14, True)
+ 43    tsax = plot_time_series("temperature", 15, True)
+ 44
+ 45    def plot_beam_quantity(startrow, v, vmin, vmax, cmap, clabel):
+ 46        velcax = fig1.add_subplot(gs0[startrow + 1 : startrow + 5, 70])
+ 47        velax = []
+ 48        for i in range(4):
+ 49            velax.append(fig1.add_subplot(gs0[i + startrow + 1, 0:70]))
+ 50        for axi, (g, b) in zip(velax, adcp[v].groupby("beam")):
+ 51            h = b.plot(
+ 52                ax=axi,
+ 53                add_colorbar=False,
+ 54                vmin=vmin,
+ 55                vmax=vmax,
+ 56                cmap=cmap,
+ 57                yincrease=False,
+ 58            )
+ 59            axi.text(
+ 60                0.01,
+ 61                0.1,
+ 62                "beam {}".format(g),
+ 63                transform=axi.transAxes,
+ 64                bbox=dict(fc="w", ec="0.3", alpha=0.7, boxstyle="Round, pad=0.2"),
+ 65            )
+ 66        plt.colorbar(h, cax=velcax, label=clabel)
+ 67        for axi in velax:
+ 68            axi.set(xlabel="", title="")
+ 69        for axi in velax:
+ 70            axi.tick_params(labelbottom=False)
+ 71        _concise_date(velax[-1], show_offset=False)
+ 72
+ 73        return velax
+ 74
+ 75    def plot_time_mean_beam_quantity(startrow, v):
+ 76        meanax = fig1.add_subplot(gs0[startrow + 1 : startrow + 4, 80:90])
+ 77        cors = [vb.mean(dim="time") for (g, vb) in adcp[v].groupby("beam")]
+ 78        for b, ai in enumerate(cors):
+ 79            ai.plot(
+ 80                ax=meanax,
+ 81                y="z",
+ 82                label="beam{}".format(b + 1),
+ 83                yincrease=False,
+ 84                marker="o",
+ 85                linestyle="",
+ 86                alpha=0.8,
+ 87            )
+ 88        meanax.set(title="")
+ 89        meanax.legend()
+ 90
+ 91    velax = plot_beam_quantity(0, "vel", -1.5, 1.5, "RdBu_r", "velocity [m/s]")
+ 92    corax = plot_beam_quantity(0 + 4, "cor", 0, 150, "viridis", "correlation")
+ 93    ampax = plot_beam_quantity(0 + 8, "amp", 50, 200, "magma", "amplitude")
+ 94
+ 95    plot_time_mean_beam_quantity(4, "cor")
+ 96    plot_time_mean_beam_quantity(8, "amp")
+ 97
+ 98    _concise_date(tsax[-1])
+ 99    tsax[-1].tick_params(labelbottom=True)
+100    for axi in tsax[:-1]:
+101        axi.tick_params(labelbottom=False)
+102    for axi in tsax:
+103        axi.set(xlim=velax[-1].get_xlim(), xlabel="")
+104
+105    infoax = fig1.add_subplot(gs0[0:3, 80:90])
+106    infoax.text(
+107        -0.2,
+108        0.7,
+109        "instrument: {}\nping type: {}\ncoordinate system: {}\nbin size: {}".format(
+110            adcp.attrs["sonar"],
+111            adcp.attrs["pingtype"],
+112            adcp.attrs["coordsystem"],
+113            adcp.attrs["cellsize"],
+114        ),
+115        transform=infoax.transAxes,
+116    )
+117    infoax.axis("off")
+
+ + +

Plot raw RDI adcp dataset.

+ +
Parameters
+ + +
+ + +
+
+ +
+ + def + plot_raw_adcp_auxillary(adcp, figsize=(12, 5)): + + + +
+ +
120def plot_raw_adcp_auxillary(adcp, figsize=(12, 5)):
+121    """
+122    Plot raw RDI adcp dataset (auxillary data only).
+123
+124    Parameters
+125    ----------
+126    adcp : xarray.Dataset
+127        Raw RDI ADCP data read using velosearaptor.io.read_raw_rdi()
+128    figsize : tuple
+129        Provide figure size (default (17, 20))
+130    """
+131    fig1 = plt.figure(figsize=figsize)
+132    gs0 = fig1.add_gridspec(nrows=4, ncols=15)
+133
+134    def plot_time_series(v, rowid, yincrease=False):
+135        tsax.append(fig1.add_subplot(gs0[rowid, 0:7]))
+136        if isinstance(v, list):
+137            for vi in v:
+138                adcp[vi].plot(ax=tsax[-1], yincrease=yincrease, label=vi)
+139                _ysym()
+140            tsax[-1].legend()
+141        else:
+142            adcp[v].plot(ax=tsax[-1], yincrease=yincrease)
+143        return tsax
+144
+145    def plot_time_mean_beam_quantity(startcol, v):
+146        meanax = fig1.add_subplot(gs0[1:, startcol : startcol + 3])
+147        cors = [vb.mean(dim="time") for (g, vb) in adcp[v].groupby("beam")]
+148        for b, ai in enumerate(cors):
+149            ai.plot(
+150                ax=meanax,
+151                y="z",
+152                label="beam{}".format(b + 1),
+153                yincrease=False,
+154                marker="o",
+155                linestyle="",
+156                alpha=0.8,
+157            )
+158        meanax.set(title="")
+159        meanax.legend()
+160
+161    tsax = []
+162    tsax = plot_time_series("pressure", 0)
+163    tsax = plot_time_series(["pitch", "roll"], 1, True)
+164    tsax = plot_time_series("heading", 2, True)
+165    tsax = plot_time_series("temperature", 3, True)
+166
+167    plot_time_mean_beam_quantity(8, "cor")
+168    plot_time_mean_beam_quantity(12, "amp")
+169
+170    _concise_date(tsax[-1])
+171    tsax[-1].tick_params(labelbottom=True)
+172    for axi in tsax[:-1]:
+173        axi.tick_params(labelbottom=False)
+174    for axi in tsax:
+175        axi.set(xlim=(adcp.time[0].data, adcp.time[-1].data), xlabel="")
+176
+177    infoax = fig1.add_subplot(gs0[0, 8:])
+178    infoax.text(
+179        0.1,
+180        0.4,
+181        "instrument: {}\nping type: {}\ncoordinate system: {}".format(
+182            adcp.attrs["sonar"], adcp.attrs["pingtype"], adcp.attrs["coordsystem"]
+183        ),
+184        transform=infoax.transAxes,
+185    )
+186    infoax.axis("off")
+
+ + +

Plot raw RDI adcp dataset (auxillary data only).

+ +
Parameters
+ + +
+ + +
+
+ + \ No newline at end of file diff --git a/velosearaptor/io.html b/velosearaptor/io.html new file mode 100644 index 0000000..6d37926 --- /dev/null +++ b/velosearaptor/io.html @@ -0,0 +1,1311 @@ + + + + + + + velosearaptor.io API documentation + + + + + + + + + +
+
+ Edit on GitHub +

+velosearaptor.io

+ +

Module velosearaptor.io with in/out functions.

+
+ + + + + +
  1#!/usr/bin/env python
+  2# -*- coding: utf-8 -*-
+  3"""Module velosearaptor.io with in/out functions."""
+  4
+  5import datetime
+  6import pathlib
+  7from pathlib import Path
+  8
+  9import numpy as np
+ 10import xarray as xr
+ 11import yaml
+ 12from pycurrents.adcp.rdiraw import Multiread, extract_raw
+ 13
+ 14
+ 15def read_raw_rdi(file, auxillary_only=False):
+ 16    """
+ 17    Read raw RDI ADCP data file and return as xarray Dataset.
+ 18
+ 19    Parameters
+ 20    ----------
+ 21    file : str or Path or list of str or Path
+ 22        Path to raw data file(s).
+ 23    auxillary_only : bool
+ 24        Set to True to ignore 2d fields. (default False)
+ 25
+ 26    Returns
+ 27    -------
+ 28    rdi : xarray.Dataset
+ 29        Raw ADCP data in xarray Dataset format.
+ 30    """
+ 31    # Multiread cannot deal with Path objects. Convert them to ascii.
+ 32    if type(file) == list:
+ 33        if type(file) == list:
+ 34            file = [
+ 35                item.as_posix() if type(item) == pathlib.PosixPath else item
+ 36                for item in file
+ 37            ]
+ 38
+ 39    if type(file) == pathlib.PosixPath:
+ 40        file = file.as_posix()
+ 41
+ 42    # Read file(s) using Multiread
+ 43    m = Multiread(file, "wh")
+ 44
+ 45    if auxillary_only:
+ 46        radcp = m.read(varlist=["FixedLeader"])
+ 47    else:
+ 48        if "BottomTrack" in m.available_varnames:
+ 49            radcp = m.read(
+ 50                varlist=[
+ 51                    "Velocity",
+ 52                    "PercentGood",
+ 53                    "Intensity",
+ 54                    "Correlation",
+ 55                    "BottomTrack",
+ 56                ]
+ 57            )
+ 58        else:
+ 59            radcp = m.read(
+ 60                varlist=["Velocity", "PercentGood", "Intensity", "Correlation"]
+ 61            )
+ 62    # convert time
+ 63    adcptime = yday0_to_datetime64(radcp.yearbase, radcp.dday)
+ 64
+ 65    jj = np.squeeze(radcp.dep.shape)
+ 66    assert radcp.nbins == jj
+ 67    ii = np.squeeze(radcp.dday.shape)
+ 68    assert radcp.nprofs == ii
+ 69    varsii = [
+ 70        "num_pings",
+ 71        "dday",
+ 72        "ens_num",
+ 73        "temperature",
+ 74        "heading",
+ 75        "pitch",
+ 76        "roll",
+ 77        "XducerDepth",
+ 78    ]
+ 79
+ 80    out = xr.Dataset(data_vars={"dummy": (["z", "time"], np.ones((jj, ii)) * np.nan)})
+ 81
+ 82    # get 1d variables
+ 83    for v in varsii:
+ 84        out[v] = (["time"], radcp[v])
+ 85    # add pressure
+ 86    out["pressure"] = (["time"], radcp.VL["Pressure"] / 1000)
+ 87
+ 88    # get 2d variables
+ 89    if auxillary_only is False:
+ 90        for v in ["vel", "cor", "amp"]:
+ 91            out[v] = (["beam", "z", "time"], np.transpose(radcp[v]))
+ 92        if "pg" in radcp:
+ 93            out["pg"] = (["beam", "z", "time"], np.transpose(radcp["pg"]))
+ 94
+ 95    out.coords["time"] = (["time"], adcptime)
+ 96    out.coords["z"] = (["z"], radcp.dep)
+ 97
+ 98    # bottom tracking
+ 99    if "bt_vel" in radcp.keys():
+100        out["bt_vel"] = (["time", "beam"], radcp.bt_vel)
+101        out["bt_depth"] = (["time", "beam"], radcp.bt_depth)
+102    out.coords["beam"] = np.array([1, 2, 3, 4])
+103
+104    # drop dummy
+105    out = out.drop(["dummy"])
+106
+107    # set a few attributes
+108    out.attrs["sonar"] = radcp.sonar.sonar
+109    out.attrs["coordsystem"] = radcp.trans.coordsystem
+110    out.attrs["pingtype"] = radcp.pingtype
+111    out.attrs["cellsize"] = radcp.CellSize
+112
+113    return out
+114
+115
+116def read_raw_rdi_uh(file, auxillary_only=False):
+117    """
+118    Wrapper for UH's pycurrents.adcp.rdiraw.Multiread
+119
+120    Parameters
+121    ----------
+122    file : str or Path
+123        Path to raw data file.
+124
+125    Returns
+126    -------
+127    radcp : dict (Bunch)
+128        UH data structure with raw RDI data
+129    """
+130
+131    m = Multiread(file, "wh")
+132
+133    if auxillary_only:
+134        radcp = m.read(varlist=["FixedLeader"])
+135    else:
+136        if "BottomTrack" in m.available_varnames:
+137            radcp = m.read(
+138                varlist=[
+139                    "Velocity",
+140                    "PercentGood",
+141                    "Intensity",
+142                    "Correlation",
+143                    "BottomTrack",
+144                ]
+145            )
+146        else:
+147            radcp = m.read(
+148                varlist=["Velocity", "PercentGood", "Intensity", "Correlation"]
+149            )
+150
+151    # convert time
+152    adcptime = yday0_to_datetime64(radcp.yearbase, radcp.dday)
+153    radcp.time = adcptime
+154
+155    # pressure and temperature
+156    radcp.pressure = radcp.VL["Pressure"] / 1000.0
+157    radcp.temperature = radcp.VL["Temperature"] / 100.0
+158
+159    return radcp
+160
+161
+162def extract_raw_rdi(file, i0, i1, outfile, inst="wh"):
+163    """Extract ping range from raw RDI file and save to new raw file.
+164
+165    Parameters
+166    ----------
+167    file : str or Path
+168        Input file.
+169    i0 : int
+170        Start ping.
+171    i1 : int
+172        End ping.
+173    outfile : str or Path
+174        Path and name of output file.
+175    inst : str
+176        One of ('wh','os','bb','ec'). Defaults to 'wh'.
+177    """
+178    _ = extract_raw(file, inst, i0, i1, outfile=outfile)
+179
+180
+181def yday0_to_datetime64(baseyear, yday):
+182    """
+183    Convert year day (starting at yday 0) to numpy's datetime64 format.
+184
+185    Parameters
+186    ----------
+187    baseyear : int
+188        Base year
+189    yday : float
+190        Year day
+191
+192    Returns
+193    -------
+194    time : np.datetime64
+195        Time in numpy datetime64 format
+196    """
+197    base = datetime.datetime(baseyear, 1, 1, 0, 0, 0)
+198    time = [base + datetime.timedelta(days=ti) for ti in yday]
+199    # convert to numpy datetime64
+200    time64 = np.array([np.datetime64(ti, "ns") for ti in time])
+201    return time64
+202
+203
+204def parse_yaml_input(yamlfile, mooring, sn):
+205    """Read yaml settings file and parse for a specific instrument.
+206
+207    Returns will be of type `None` if not present in the yml parameter file.
+208
+209    Parameters
+210    ----------
+211    yamlfile : pathlib.Path() or str
+212        Parameter file.
+213    mooring : str
+214        Mooring ID as used in the parameter file.
+215    sn : int
+216        Instrument serial number as used in the parameter file, without prepended SN.
+217
+218    Returns
+219    -------
+220    Dictionary with the following entries:
+221    meta_data : dict
+222        General meta data for the dataset.
+223    dgridparams : dict
+224        Depth gridding parameters.
+225    tgridparams : dict
+226        Time gridding parameters.
+227    editparams : dict
+228        Editing parameters.
+229    driftparams : dict
+230        Clock drift parameters.
+231    data_dir : pathlib.Path
+232        ADCP data directory
+233    """
+234    with open(yamlfile, "r") as file:
+235        yp = yaml.safe_load(file)
+236
+237    try:
+238        _ = yp["mooring"][mooring]
+239    except KeyError:
+240        print(f"Mooring {mooring} not found in .yml parameter file")
+241        raise
+242
+243    snstr = f"SN{sn}"
+244    try:
+245        _ = yp["mooring"][mooring][snstr]
+246    except KeyError:
+247        print(f"Serial numer {sn} not found in .yml parameter file")
+248        raise
+249
+250    # global meta-data
+251    meta_data = yp["meta_data"]
+252    meta_data["mooring"] = mooring
+253    for ll in ["lon", "lat"]:
+254        meta_data[ll] = yp["mooring"][mooring][ll]
+255    meta_data["sn"] = sn
+256    out = dict(meta_data=meta_data)
+257
+258    # global processing parameters
+259    pp = yp["processing_parameters"]
+260    #   initialize output variables as None types in case they are not provided
+261    #   in the yaml file
+262    out_vars = [
+263        "dgridparams",
+264        "tgridparams",
+265        "editparams",
+266        "driftparams",
+267    ]
+268    for var in out_vars:
+269        out[var] = None
+270    for var in out_vars:
+271        if var in pp:
+272            out[var] = pp[var]
+273
+274    # instrument-specific parameters
+275    d = yp["mooring"][mooring][snstr]
+276    for var in ["driftparams"]:
+277        if var in d:
+278            out[var] = d[var]
+279    if "data_dir" in d:
+280        data_dir = Path(d["data_dir"])
+281    else:
+282        data_dir = None
+283    # update global parameters with instrument-specific parameters
+284    for param in ["editparams", "tgridparams", "dgridparams"]:
+285        if param in d:
+286            if out[param] is None:
+287                out[param] = dict()
+288            for k, v in d[param].items():
+289                out[param][k] = v
+290    if "meta_data" in d:
+291        for k, v in d["meta_data"].items():
+292            out["meta_data"][k] = v
+293
+294    out["data_dir"] = data_dir
+295
+296    return out
+297
+298
+299def _is_number(s):
+300    """
+301    Check if string can be converted to a float.
+302
+303    Parameters
+304    ----------
+305    s : str
+306        string
+307
+308    Returns
+309    -------
+310    out : bool
+311        True if string can be converted to float, else False.
+312    """
+313    try:
+314        float(s)
+315        return True
+316    except ValueError:
+317        return False
+318
+319
+320def cf_conventions():
+321    """Return dictionary with CF standard names and units.
+322
+323    Returns
+324    -------
+325    CF : dict
+326        CF standard names in units.
+327
+328    Notes
+329    -----
+330    See https://cfconventions.org/Data/cf-standard-names/current/build/cf-standard-name-table.html
+331    and http://cfconventions.org/cf-conventions/cf-conventions.html
+332    for further information.
+333
+334    See also https://wiki.esipfed.org/Attribute_Convention_for_Data_Discovery_1-3 for meta data.
+335
+336    """
+337
+338    CF = dict(
+339        depth=dict(
+340            long_name="depth",
+341            standard_name="depth",
+342            units="m",
+343            positive="down",
+344            coverage_content_type="coordinate",
+345        ),
+346        u=dict(
+347            long_name="u",
+348            standard_name="eastward_sea_water_velocity",
+349            units="m s-1",
+350            coverage_content_type="physicalMeasurement",
+351            ancillary_variables="npings",
+352        ),
+353        v=dict(
+354            long_name="v",
+355            standard_name="northward_sea_water_velocity",
+356            units="m s-1",
+357            coverage_content_type="physicalMeasurement",
+358            ancillary_variables="npings",
+359        ),
+360        w=dict(
+361            long_name="w",
+362            standard_name="upward_sea_water_velocity",
+363            units="m s-1",
+364            coverage_content_type="physicalMeasurement",
+365            ancillary_variables="npings",
+366        ),
+367        e=dict(
+368            long_name="error velocity",
+369            standard_name="indicative_error_from_multibeam_acoustic_doppler_velocity_profiler_in_sea_water",
+370            units="m s-1",
+371            coverage_content_type="qualityInformation",
+372            ancillary_variables="npings",
+373        ),
+374        u_error=dict(
+375            long_name="u standard error",
+376            standard_name="eastward_sea_water_velocity_standard_error",
+377            units="m s-1",
+378            coverage_content_type="qualityInformation",
+379            ancillary_variables="npings",
+380        ),
+381        v_error=dict(
+382            long_name="v standard error",
+383            standard_name="northward_sea_water_velocity_standard_error",
+384            units="m s-1",
+385            coverage_content_type="qualityInformation",
+386            ancillary_variables="npings",
+387        ),
+388        w_error=dict(
+389            long_name="w standard error",
+390            standard_name="upward_sea_water_velocity_standard_error",
+391            units="m s-1",
+392            coverage_content_type="qualityInformation",
+393            ancillary_variables="npings",
+394        ),
+395        pressure=dict(
+396            long_name="pressure",
+397            standard_name="sea_water_pressure",
+398            units="dbar",
+399            coverage_content_type="physicalMeasurement",
+400            ancillary_variables="npings",
+401        ),
+402        temperature=dict(
+403            long_name="temperature",
+404            standard_name="sea_water_temperature",
+405            units="degrees_C",
+406            coverage_content_type="physicalMeasurement",
+407            ancillary_variables="npings",
+408        ),
+409        xducer_depth=dict(
+410            long_name="transducer depth",
+411            standard_name="depth",
+412            units="m",
+413            positive="down",
+414            coverage_content_type="physicalMeasurement",
+415            ancillary_variables="npings",
+416        ),
+417        npings=dict(
+418            long_name="number of pings",
+419            standard_name="number_of_observations",
+420            coverage_content_type="auxiliaryInformation",
+421        ),
+422        pg=dict(
+423            long_name="percent good",
+424            standard_name="proportion_of_acceptable_signal_returns_from_acoustic_instrument_in_sea_water",
+425            units="percent",
+426            ancillary_variables="npings",
+427            coverage_content_type="qualityInformation",
+428        ),
+429        amp=dict(
+430            long_name="amplitude",
+431            standard_name="signal_intensity_from_multibeam_acoustic_doppler_velocity_sensor_in_sea_water",
+432            coverage_content_type="physicalMeasurement",
+433            ancillary_variables="npings",
+434        ),
+435    )
+436    return CF
+
+ + +
+
+ +
+ + def + read_raw_rdi(file, auxillary_only=False): + + + +
+ +
 16def read_raw_rdi(file, auxillary_only=False):
+ 17    """
+ 18    Read raw RDI ADCP data file and return as xarray Dataset.
+ 19
+ 20    Parameters
+ 21    ----------
+ 22    file : str or Path or list of str or Path
+ 23        Path to raw data file(s).
+ 24    auxillary_only : bool
+ 25        Set to True to ignore 2d fields. (default False)
+ 26
+ 27    Returns
+ 28    -------
+ 29    rdi : xarray.Dataset
+ 30        Raw ADCP data in xarray Dataset format.
+ 31    """
+ 32    # Multiread cannot deal with Path objects. Convert them to ascii.
+ 33    if type(file) == list:
+ 34        if type(file) == list:
+ 35            file = [
+ 36                item.as_posix() if type(item) == pathlib.PosixPath else item
+ 37                for item in file
+ 38            ]
+ 39
+ 40    if type(file) == pathlib.PosixPath:
+ 41        file = file.as_posix()
+ 42
+ 43    # Read file(s) using Multiread
+ 44    m = Multiread(file, "wh")
+ 45
+ 46    if auxillary_only:
+ 47        radcp = m.read(varlist=["FixedLeader"])
+ 48    else:
+ 49        if "BottomTrack" in m.available_varnames:
+ 50            radcp = m.read(
+ 51                varlist=[
+ 52                    "Velocity",
+ 53                    "PercentGood",
+ 54                    "Intensity",
+ 55                    "Correlation",
+ 56                    "BottomTrack",
+ 57                ]
+ 58            )
+ 59        else:
+ 60            radcp = m.read(
+ 61                varlist=["Velocity", "PercentGood", "Intensity", "Correlation"]
+ 62            )
+ 63    # convert time
+ 64    adcptime = yday0_to_datetime64(radcp.yearbase, radcp.dday)
+ 65
+ 66    jj = np.squeeze(radcp.dep.shape)
+ 67    assert radcp.nbins == jj
+ 68    ii = np.squeeze(radcp.dday.shape)
+ 69    assert radcp.nprofs == ii
+ 70    varsii = [
+ 71        "num_pings",
+ 72        "dday",
+ 73        "ens_num",
+ 74        "temperature",
+ 75        "heading",
+ 76        "pitch",
+ 77        "roll",
+ 78        "XducerDepth",
+ 79    ]
+ 80
+ 81    out = xr.Dataset(data_vars={"dummy": (["z", "time"], np.ones((jj, ii)) * np.nan)})
+ 82
+ 83    # get 1d variables
+ 84    for v in varsii:
+ 85        out[v] = (["time"], radcp[v])
+ 86    # add pressure
+ 87    out["pressure"] = (["time"], radcp.VL["Pressure"] / 1000)
+ 88
+ 89    # get 2d variables
+ 90    if auxillary_only is False:
+ 91        for v in ["vel", "cor", "amp"]:
+ 92            out[v] = (["beam", "z", "time"], np.transpose(radcp[v]))
+ 93        if "pg" in radcp:
+ 94            out["pg"] = (["beam", "z", "time"], np.transpose(radcp["pg"]))
+ 95
+ 96    out.coords["time"] = (["time"], adcptime)
+ 97    out.coords["z"] = (["z"], radcp.dep)
+ 98
+ 99    # bottom tracking
+100    if "bt_vel" in radcp.keys():
+101        out["bt_vel"] = (["time", "beam"], radcp.bt_vel)
+102        out["bt_depth"] = (["time", "beam"], radcp.bt_depth)
+103    out.coords["beam"] = np.array([1, 2, 3, 4])
+104
+105    # drop dummy
+106    out = out.drop(["dummy"])
+107
+108    # set a few attributes
+109    out.attrs["sonar"] = radcp.sonar.sonar
+110    out.attrs["coordsystem"] = radcp.trans.coordsystem
+111    out.attrs["pingtype"] = radcp.pingtype
+112    out.attrs["cellsize"] = radcp.CellSize
+113
+114    return out
+
+ + +

Read raw RDI ADCP data file and return as xarray Dataset.

+ +
Parameters
+ +
    +
  • file (str or Path or list of str or Path): +Path to raw data file(s).
  • +
  • auxillary_only (bool): +Set to True to ignore 2d fields. (default False)
  • +
+ +
Returns
+ +
    +
  • rdi (xarray.Dataset): +Raw ADCP data in xarray Dataset format.
  • +
+
+ + +
+
+ +
+ + def + read_raw_rdi_uh(file, auxillary_only=False): + + + +
+ +
117def read_raw_rdi_uh(file, auxillary_only=False):
+118    """
+119    Wrapper for UH's pycurrents.adcp.rdiraw.Multiread
+120
+121    Parameters
+122    ----------
+123    file : str or Path
+124        Path to raw data file.
+125
+126    Returns
+127    -------
+128    radcp : dict (Bunch)
+129        UH data structure with raw RDI data
+130    """
+131
+132    m = Multiread(file, "wh")
+133
+134    if auxillary_only:
+135        radcp = m.read(varlist=["FixedLeader"])
+136    else:
+137        if "BottomTrack" in m.available_varnames:
+138            radcp = m.read(
+139                varlist=[
+140                    "Velocity",
+141                    "PercentGood",
+142                    "Intensity",
+143                    "Correlation",
+144                    "BottomTrack",
+145                ]
+146            )
+147        else:
+148            radcp = m.read(
+149                varlist=["Velocity", "PercentGood", "Intensity", "Correlation"]
+150            )
+151
+152    # convert time
+153    adcptime = yday0_to_datetime64(radcp.yearbase, radcp.dday)
+154    radcp.time = adcptime
+155
+156    # pressure and temperature
+157    radcp.pressure = radcp.VL["Pressure"] / 1000.0
+158    radcp.temperature = radcp.VL["Temperature"] / 100.0
+159
+160    return radcp
+
+ + +

Wrapper for UH's pycurrents.adcp.rdiraw.Multiread

+ +
Parameters
+ +
    +
  • file (str or Path): +Path to raw data file.
  • +
+ +
Returns
+ +
    +
  • radcp (dict (Bunch)): +UH data structure with raw RDI data
  • +
+
+ + +
+
+ +
+ + def + extract_raw_rdi(file, i0, i1, outfile, inst='wh'): + + + +
+ +
163def extract_raw_rdi(file, i0, i1, outfile, inst="wh"):
+164    """Extract ping range from raw RDI file and save to new raw file.
+165
+166    Parameters
+167    ----------
+168    file : str or Path
+169        Input file.
+170    i0 : int
+171        Start ping.
+172    i1 : int
+173        End ping.
+174    outfile : str or Path
+175        Path and name of output file.
+176    inst : str
+177        One of ('wh','os','bb','ec'). Defaults to 'wh'.
+178    """
+179    _ = extract_raw(file, inst, i0, i1, outfile=outfile)
+
+ + +

Extract ping range from raw RDI file and save to new raw file.

+ +
Parameters
+ +
    +
  • file (str or Path): +Input file.
  • +
  • i0 (int): +Start ping.
  • +
  • i1 (int): +End ping.
  • +
  • outfile (str or Path): +Path and name of output file.
  • +
  • inst (str): +One of ('wh','os','bb','ec'). Defaults to 'wh'.
  • +
+
+ + +
+
+ +
+ + def + yday0_to_datetime64(baseyear, yday): + + + +
+ +
182def yday0_to_datetime64(baseyear, yday):
+183    """
+184    Convert year day (starting at yday 0) to numpy's datetime64 format.
+185
+186    Parameters
+187    ----------
+188    baseyear : int
+189        Base year
+190    yday : float
+191        Year day
+192
+193    Returns
+194    -------
+195    time : np.datetime64
+196        Time in numpy datetime64 format
+197    """
+198    base = datetime.datetime(baseyear, 1, 1, 0, 0, 0)
+199    time = [base + datetime.timedelta(days=ti) for ti in yday]
+200    # convert to numpy datetime64
+201    time64 = np.array([np.datetime64(ti, "ns") for ti in time])
+202    return time64
+
+ + +

Convert year day (starting at yday 0) to numpy's datetime64 format.

+ +
Parameters
+ +
    +
  • baseyear (int): +Base year
  • +
  • yday (float): +Year day
  • +
+ +
Returns
+ +
    +
  • time (np.datetime64): +Time in numpy datetime64 format
  • +
+
+ + +
+
+ +
+ + def + parse_yaml_input(yamlfile, mooring, sn): + + + +
+ +
205def parse_yaml_input(yamlfile, mooring, sn):
+206    """Read yaml settings file and parse for a specific instrument.
+207
+208    Returns will be of type `None` if not present in the yml parameter file.
+209
+210    Parameters
+211    ----------
+212    yamlfile : pathlib.Path() or str
+213        Parameter file.
+214    mooring : str
+215        Mooring ID as used in the parameter file.
+216    sn : int
+217        Instrument serial number as used in the parameter file, without prepended SN.
+218
+219    Returns
+220    -------
+221    Dictionary with the following entries:
+222    meta_data : dict
+223        General meta data for the dataset.
+224    dgridparams : dict
+225        Depth gridding parameters.
+226    tgridparams : dict
+227        Time gridding parameters.
+228    editparams : dict
+229        Editing parameters.
+230    driftparams : dict
+231        Clock drift parameters.
+232    data_dir : pathlib.Path
+233        ADCP data directory
+234    """
+235    with open(yamlfile, "r") as file:
+236        yp = yaml.safe_load(file)
+237
+238    try:
+239        _ = yp["mooring"][mooring]
+240    except KeyError:
+241        print(f"Mooring {mooring} not found in .yml parameter file")
+242        raise
+243
+244    snstr = f"SN{sn}"
+245    try:
+246        _ = yp["mooring"][mooring][snstr]
+247    except KeyError:
+248        print(f"Serial numer {sn} not found in .yml parameter file")
+249        raise
+250
+251    # global meta-data
+252    meta_data = yp["meta_data"]
+253    meta_data["mooring"] = mooring
+254    for ll in ["lon", "lat"]:
+255        meta_data[ll] = yp["mooring"][mooring][ll]
+256    meta_data["sn"] = sn
+257    out = dict(meta_data=meta_data)
+258
+259    # global processing parameters
+260    pp = yp["processing_parameters"]
+261    #   initialize output variables as None types in case they are not provided
+262    #   in the yaml file
+263    out_vars = [
+264        "dgridparams",
+265        "tgridparams",
+266        "editparams",
+267        "driftparams",
+268    ]
+269    for var in out_vars:
+270        out[var] = None
+271    for var in out_vars:
+272        if var in pp:
+273            out[var] = pp[var]
+274
+275    # instrument-specific parameters
+276    d = yp["mooring"][mooring][snstr]
+277    for var in ["driftparams"]:
+278        if var in d:
+279            out[var] = d[var]
+280    if "data_dir" in d:
+281        data_dir = Path(d["data_dir"])
+282    else:
+283        data_dir = None
+284    # update global parameters with instrument-specific parameters
+285    for param in ["editparams", "tgridparams", "dgridparams"]:
+286        if param in d:
+287            if out[param] is None:
+288                out[param] = dict()
+289            for k, v in d[param].items():
+290                out[param][k] = v
+291    if "meta_data" in d:
+292        for k, v in d["meta_data"].items():
+293            out["meta_data"][k] = v
+294
+295    out["data_dir"] = data_dir
+296
+297    return out
+
+ + +

Read yaml settings file and parse for a specific instrument.

+ +

Returns will be of type None if not present in the yml parameter file.

+ +
Parameters
+ +
    +
  • yamlfile (pathlib.Path() or str): +Parameter file.
  • +
  • mooring (str): +Mooring ID as used in the parameter file.
  • +
  • sn (int): +Instrument serial number as used in the parameter file, without prepended SN.
  • +
+ +
Returns
+ +
    +
  • Dictionary with the following entries:
  • +
  • meta_data (dict): +General meta data for the dataset.
  • +
  • dgridparams (dict): +Depth gridding parameters.
  • +
  • tgridparams (dict): +Time gridding parameters.
  • +
  • editparams (dict): +Editing parameters.
  • +
  • driftparams (dict): +Clock drift parameters.
  • +
  • data_dir (pathlib.Path): +ADCP data directory
  • +
+
+ + +
+
+ +
+ + def + cf_conventions(): + + + +
+ +
321def cf_conventions():
+322    """Return dictionary with CF standard names and units.
+323
+324    Returns
+325    -------
+326    CF : dict
+327        CF standard names in units.
+328
+329    Notes
+330    -----
+331    See https://cfconventions.org/Data/cf-standard-names/current/build/cf-standard-name-table.html
+332    and http://cfconventions.org/cf-conventions/cf-conventions.html
+333    for further information.
+334
+335    See also https://wiki.esipfed.org/Attribute_Convention_for_Data_Discovery_1-3 for meta data.
+336
+337    """
+338
+339    CF = dict(
+340        depth=dict(
+341            long_name="depth",
+342            standard_name="depth",
+343            units="m",
+344            positive="down",
+345            coverage_content_type="coordinate",
+346        ),
+347        u=dict(
+348            long_name="u",
+349            standard_name="eastward_sea_water_velocity",
+350            units="m s-1",
+351            coverage_content_type="physicalMeasurement",
+352            ancillary_variables="npings",
+353        ),
+354        v=dict(
+355            long_name="v",
+356            standard_name="northward_sea_water_velocity",
+357            units="m s-1",
+358            coverage_content_type="physicalMeasurement",
+359            ancillary_variables="npings",
+360        ),
+361        w=dict(
+362            long_name="w",
+363            standard_name="upward_sea_water_velocity",
+364            units="m s-1",
+365            coverage_content_type="physicalMeasurement",
+366            ancillary_variables="npings",
+367        ),
+368        e=dict(
+369            long_name="error velocity",
+370            standard_name="indicative_error_from_multibeam_acoustic_doppler_velocity_profiler_in_sea_water",
+371            units="m s-1",
+372            coverage_content_type="qualityInformation",
+373            ancillary_variables="npings",
+374        ),
+375        u_error=dict(
+376            long_name="u standard error",
+377            standard_name="eastward_sea_water_velocity_standard_error",
+378            units="m s-1",
+379            coverage_content_type="qualityInformation",
+380            ancillary_variables="npings",
+381        ),
+382        v_error=dict(
+383            long_name="v standard error",
+384            standard_name="northward_sea_water_velocity_standard_error",
+385            units="m s-1",
+386            coverage_content_type="qualityInformation",
+387            ancillary_variables="npings",
+388        ),
+389        w_error=dict(
+390            long_name="w standard error",
+391            standard_name="upward_sea_water_velocity_standard_error",
+392            units="m s-1",
+393            coverage_content_type="qualityInformation",
+394            ancillary_variables="npings",
+395        ),
+396        pressure=dict(
+397            long_name="pressure",
+398            standard_name="sea_water_pressure",
+399            units="dbar",
+400            coverage_content_type="physicalMeasurement",
+401            ancillary_variables="npings",
+402        ),
+403        temperature=dict(
+404            long_name="temperature",
+405            standard_name="sea_water_temperature",
+406            units="degrees_C",
+407            coverage_content_type="physicalMeasurement",
+408            ancillary_variables="npings",
+409        ),
+410        xducer_depth=dict(
+411            long_name="transducer depth",
+412            standard_name="depth",
+413            units="m",
+414            positive="down",
+415            coverage_content_type="physicalMeasurement",
+416            ancillary_variables="npings",
+417        ),
+418        npings=dict(
+419            long_name="number of pings",
+420            standard_name="number_of_observations",
+421            coverage_content_type="auxiliaryInformation",
+422        ),
+423        pg=dict(
+424            long_name="percent good",
+425            standard_name="proportion_of_acceptable_signal_returns_from_acoustic_instrument_in_sea_water",
+426            units="percent",
+427            ancillary_variables="npings",
+428            coverage_content_type="qualityInformation",
+429        ),
+430        amp=dict(
+431            long_name="amplitude",
+432            standard_name="signal_intensity_from_multibeam_acoustic_doppler_velocity_sensor_in_sea_water",
+433            coverage_content_type="physicalMeasurement",
+434            ancillary_variables="npings",
+435        ),
+436    )
+437    return CF
+
+ + +

Return dictionary with CF standard names and units.

+ +
Returns
+ +
    +
  • CF (dict): +CF standard names in units.
  • +
+ +
Notes
+ +

See https://cfconventions.org/Data/cf-standard-names/current/build/cf-standard-name-table.html +and http://cfconventions.org/cf-conventions/cf-conventions.html +for further information.

+ +

See also https://wiki.esipfed.org/Attribute_Convention_for_Data_Discovery_1-3 for meta data.

+
+ + +
+
+ + \ No newline at end of file diff --git a/velosearaptor/madcp.html b/velosearaptor/madcp.html new file mode 100644 index 0000000..111fd86 --- /dev/null +++ b/velosearaptor/madcp.html @@ -0,0 +1,5002 @@ + + + + + + + velosearaptor.madcp API documentation + + + + + + + + + +
+
+ Edit on GitHub +

+velosearaptor.madcp

+ +

Module velosearaptor.madcp with functions for moored ADCPs.

+ +

General Use

+ +

Processing a raw ADCP file from a moored deployment is a two-step process.

+ + + +

Notes

+ +

Some general notes for this module.

+ +

Depth Gridding

+ +

The depth vector for the ADCP raw data (in instrument coordinates) is +calculated in pycurrents.rdiraw.FileBBWHOS() as
+dep = np.arange(NCells) * CellSize + Bin1Dist +The depth vector thus points to the center of each bin.

+ +

From the RDI manual WorkHorse Monitor, Sentinel, Mariner, Quartermaster, and +Long Ranger ADCPs Commands and Output Data Format:

+ +
+

This [Bin1Dist] field contains the distance to the middle of the first depth + cell (bin). This distance is a function of depth cell length (WS), the + profiling mode (WM), the blank after transmit distance (WF), and speed of + sound.

+
+
+ + + + + +
   1#!/usr/bin/env python
+   2# -*- coding: utf-8 -*-
+   3"""Module velosearaptor.madcp with functions for moored ADCPs.
+   4
+   5### General Use
+   6Processing a raw ADCP file from a moored deployment is a two-step process.
+   7- Instantiate a processing object with `ProcessADCP` or `ProcessADCPyml`. The
+   8  former expects the path to the raw data and a number of dictionaries with
+   9  processing parameters as input. The latter reads a .yml file containing the
+  10  processing parameters. See the respective docstrings for more information.
+  11- Process raw pings and possibly run a ping-averaging method on the data.
+  12  Options here are `ProcessADCP.process_pings`,
+  13  `ProcessADCP.average_ensembles`, and `ProcessADCP.burst_average_ensembles`.
+  14
+  15### Notes
+  16Some general notes for this module.
+  17
+  18#### Depth Gridding
+  19The depth vector for the ADCP raw data (in instrument coordinates) is
+  20calculated in :meth:`pycurrents.rdiraw.FileBBWHOS` as <br>
+  21`dep = np.arange(NCells) * CellSize + Bin1Dist`
+  22The depth vector thus points to the center of each bin.
+  23
+  24From the RDI manual *WorkHorse Monitor, Sentinel, Mariner, Quartermaster, and
+  25Long Ranger ADCPs Commands and Output Data Format*:
+  26
+  27> This [Bin1Dist] field contains the distance to the middle of the first depth
+  28> cell (bin). This distance is a function of depth cell length (WS), the
+  29> profiling mode (WM), the blank after transmit distance (WF), and speed of
+  30> sound.
+  31
+  32"""
+  33
+  34import datetime
+  35import logging
+  36import os
+  37import pathlib
+  38from pathlib import Path
+  39from shutil import which
+  40from subprocess import PIPE, Popen  # for magdec
+  41from warnings import warn
+  42
+  43import gsw
+  44import matplotlib.pyplot as plt
+  45import numpy as np
+  46import scipy as sp
+  47import xarray as xr
+  48from pycurrents.adcp.rdiraw import Multiread
+  49from pycurrents.adcp.transform import Transform, rdi_xyz_enu
+  50from pycurrents.codas import to_date, to_day
+  51from pycurrents.data import seawater
+  52from pycurrents.num import interp1
+  53from pycurrents.num.nptools import rangeslice
+  54from pycurrents.system import Bunch
+  55from tqdm import tqdm
+  56
+  57from . import io
+  58
+  59# Standard logging
+  60logger = logging.getLogger(__name__)
+  61
+  62
+  63class ProcessADCP:
+  64    """Moored ADCP Processing.
+  65
+  66    An instance of ProcessADCP is initialized by providing raw data and
+  67    processing parameters. Once initialized, the instance method
+  68    :meth:`average_ensembles` can be used to average over just a few or
+  69    all pings.
+  70
+  71    Magnetic declination is automatically calculated via a call to the command
+  72    line tool
+  73    [magdec](https://currents.soest.hawaii.edu/hgstage/geomag/file/tip) that
+  74    must be installed. Once calculated, the magnetic declination is stored in
+  75    `magdec` and automatically applied to the data.
+  76
+  77    Prior to time averaging, data are edited based on correlation and error
+  78    velocity thresholds. The variable `pg` is calculated based on the number of
+  79    excluded pings, i.e. it is the numbur of good pings divided by the number
+  80    of total pings within one depth bin and one time bin. It may be used to
+  81    further filter the data.
+  82
+  83    A pdf document on ADCP data collection and processing principles can be
+  84    downloaded from RDI
+  85    [here](https://www.comm-tec.com/Docs/Manuali/RDI/BBPRIME.pdf).
+  86
+  87    Time-averaged data are grouped together in an `xarray.Dataset` in the
+  88    instance attribute `ds` for easy access and convenient output to netcdf
+  89    format.
+  90
+  91    Parameters
+  92    ----------
+  93    raw_data : str or list or Path
+  94        Location(s) of raw data.
+  95    meta_data : dict
+  96        Dictionary with meta data. At a minimum entries for `lon` and `lat` are
+  97        needed. If `mooring` and `sn` provide mooring name and serial number
+  98        then these will be used to name the log file produced during
+  99        processing.
+ 100    driftparams : dict, optional
+ 101        Time drift parameters. See notes below.
+ 102    tgridparams : dict, optional
+ 103        Time gridding parameters. See notes below.
+ 104    dgridparams : dict, optional
+ 105        Depth gridding parameters. See notes below.
+ 106    editparams : dict, optional
+ 107        Editing parameters. See notes below.
+ 108    ibad : int, optional
+ 109        Mark beam with bad data (zero based). Defaults to None.
+ 110    logdir : str, optional
+ 111        Log file directory. Defaults to `log/`.
+ 112    verbose : bool, optional
+ 113        Output more processing info to screen.
+ 114    magdec : float, optional
+ 115        Magnetic declination in degrees.
+ 116    pressure : xr.DataArray, optional
+ 117        Pressure time series in dbar as xr.DataAarray with coordinate `time`.
+ 118
+ 119    Attributes
+ 120    ----------
+ 121    files : list
+ 122        List pointing to raw data file(s).
+ 123    dday_start : float
+ 124        Start time of ADCP time series, determined either through `t0` in
+ 125        `tgridparams` or the start of the time series once at depth.
+ 126    dday_end : float
+ 127        End time of ADCP time series, determined either through `t1` in
+ 128        `tgridparams` or the end of the time series at depth.
+ 129    start_ddays : list
+ 130        Start times of averaging intervals
+ 131    dday_mid : float
+ 132        Time stamp for ping average as determined in :meth:`make_start_ddays`.
+ 133    dt : float
+ 134        Time that is inclusive of one average. For regular averaging, this is
+ 135        `dt_hours` in `tgridparams` converted to Julian days. For
+ 136        burst-averagint, this is a time interval that is inclusive of all pings
+ 137        in one bursts (but goes slightly beyond that into the time between
+ 138        bursts).
+ 139    time_drift_rate : float
+ 140        Clock drift calculated from `driftparams`.
+ 141    orientation : str
+ 142        Instrument orientation `up` or `down`.
+ 143    magdec : float
+ 144        Magnetic declination.
+ 145    m : pycurrents.adcp.rdiraw.Multiread
+ 146        Multiread instance.
+ 147    tsdat : Bunch
+ 148        Auxiliary data.
+ 149    raw : xarray.Dataset
+ 150        Raw ADCP data.
+ 151    ds : xarray.Dataset
+ 152        Time-averaged dataset added by running :meth:`average_ensembles`.
+ 153
+ 154    Notes
+ 155    -----
+ 156    Various parameters are passed to the instance through dictionaries. Their
+ 157    specifics are described below. Gridding and editing parameters can be
+ 158    updated after creating the ProcessADCP instance via `parse_dgridparams`,
+ 159    `parse_tgridparams`, and  `parse_editparams`.
+ 160
+ 161    **Time drift parameters**
+ 162    Provide clock drift parameters via `driftparams`. Accepted entries are
+ 163    - `end_adcp` : Time of ADCP at data download
+ 164    - `end_pc` : UTC time at data download
+ 165
+ 166    The difference between `end_adcp` and `end_pc` is used to linearly correct
+ 167    for instrument clock drift.
+ 168
+ 169    **Time gridding parameters**
+ 170    Provide time gridding parameters via `tgridparams`. Accepted entries are
+ 171    - `dt_hours` : Time grid interval. Defaults to 0.5h.
+ 172    - `t0` : Start time for gridding. Determined from data if not provided.
+ 173    - `t1` : End time for gridding. Determined from data if not provided.
+ 174    - burst_average : bool
+ 175        Set ensemble averaging to act on burst sampling scheme. Defaults to False.
+ 176
+ 177    **Depth gridding parameters**
+ 178    Provide depth gridding parameters via `dgridparams`. Accepted entries are
+ 179    - `dtop` : Shallow depth in m.
+ 180    - `dbot` : Deep depth in m.
+ 181    - `dinterval` : Vertical grid size in m. Defaults to 5m.
+ 182
+ 183    Values for `dbot` and `dtop` are generated if not provided.
+ 184
+ 185    **Editing parameters**
+ 186    Provide editing parameters via `editparams`.
+ 187    - `max_e`=0.2,  # absolute max e
+ 188    - `max_e_deviation`=2,  # max in terms of sigma
+ 189    - `min_correlation`=64,  # 64 is RDI default
+ 190    - `maskbins` : Array with booleans indexing into the ADCP bins. Use the
+ 191      convenience method `generate_binmask`.
+ 192    - `pg_limit` : float or int or None.
+ 193            Percent good limit applied prior to interpolating to the universal
+ 194            depth grid in `burst_average_ensembles`.
+ 195
+ 196    """
+ 197
+ 198    # Default editing parameters.
+ 199    _editparams = dict(
+ 200        max_e=0.2,  # absolute max e
+ 201        max_e_deviation=2,  # max in terms of sigma
+ 202        min_correlation=64,  # 64 is RDI default
+ 203        maskbins=None,  # do not mask any bins
+ 204        pg_limit=50,  # percent good limit applied in `burst_average_ensembles`
+ 205    )
+ 206
+ 207    def __init__(
+ 208        self,
+ 209        raw_data,
+ 210        meta_data,
+ 211        driftparams=None,
+ 212        tgridparams=None,
+ 213        dgridparams=None,
+ 214        editparams=None,
+ 215        ibad=None,
+ 216        logdir="log",
+ 217        verbose=False,
+ 218        plot=False,
+ 219        pressure_scale_factor=1,
+ 220        magdec=None,
+ 221        pressure=None,
+ 222    ):
+ 223        self.meta_data = Bunch(meta_data.copy())
+ 224        self.ibad = ibad
+ 225        self.logdir = logdir
+ 226        self.verbose = verbose
+ 227
+ 228        self._magdec_provided = magdec
+ 229        self._magdec = magdec
+ 230
+ 231        self._pressure_provided = pressure
+ 232        self._pressure_scale_factor = pressure_scale_factor
+ 233
+ 234        self._raw = None
+ 235        self._default_dgridparams = None
+ 236
+ 237        self.parse_file_locations(raw_data)
+ 238        self._initiate_data_reader()
+ 239        self._read_auxiliary_data()
+ 240        self._parse_meta_data()
+ 241
+ 242        self._set_up_logger()
+ 243
+ 244        self.parse_driftparams(driftparams)
+ 245        self._parse_sysconfig()
+ 246        self.parse_dgridparams(dgridparams)
+ 247        self.parse_tgridparams(tgridparams)
+ 248        self.parse_editparams(editparams)
+ 249
+ 250        self.make_start_ddays()
+ 251
+ 252        if plot:
+ 253            self.plot_pressure()
+ 254
+ 255    def parse_file_locations(self, raw_data, min_file_size=1e4):
+ 256        """Parse input for raw data files.
+ 257
+ 258        Input can either be a single file name as a str, a single file as a
+ 259        Path instance, a list of either of these, or a Path instance pointing to a
+ 260        directory with raw ADCP files. In the latter case, files that are
+ 261        smaller than a threshold will not be included in the processing.
+ 262
+ 263        Outputs to attribute `files`. The output can be fed to Multiread instances.
+ 264
+ 265        Parameters
+ 266        ----------
+ 267        raw_data : str or list or Path
+ 268            Location(s) of raw data.
+ 269        min_file_size : int
+ 270            Minimum size for file to be included. Defaults to 1e4 which
+ 271            corresponds to about 10kB and is a good value for excluding small
+ 272            files without any actual data.
+ 273
+ 274        """
+ 275
+ 276        def list_dir(dir, min_file_size):
+ 277            # List all raw files.
+ 278            all_raw_files = list(sorted(dir.glob("*.00*")))
+ 279            # only files larger than about 10kB
+ 280            files = [
+ 281                file.as_posix()
+ 282                for file in all_raw_files
+ 283                if file.stat().st_size > min_file_size
+ 284            ]
+ 285            return files
+ 286
+ 287        input_type = type(raw_data)
+ 288        if input_type is list:
+ 289            if type(raw_data[0]) is str:
+ 290                self.files = raw_data
+ 291            elif type(raw_data[0]) is pathlib.PosixPath:
+ 292                self.files = [file.as_posix() for file in raw_data]
+ 293        elif input_type is str:
+ 294            if Path(raw_data).is_dir():
+ 295                self.files = list_dir(Path(raw_data), min_file_size)
+ 296            else:
+ 297                self.files = [raw_data]
+ 298        elif input_type is pathlib.PosixPath:
+ 299            if raw_data.is_dir():
+ 300                self.files = list_dir(raw_data, min_file_size)
+ 301            else:
+ 302                self.files = [raw_data.as_posix()]
+ 303
+ 304    def _initiate_data_reader(self):
+ 305        """Initiate a Multiread data reader.
+ 306
+ 307        Adds attribute `m`.
+ 308
+ 309        """
+ 310        self.m = Multiread(self.files, sonar="wh", ibad=self.ibad)
+ 311        # Make some more meta data realily available by reading a single ping
+ 312        # from the raw data.
+ 313        ping = self.m.read(start=0, stop=1)
+ 314        self.meta_data.Bin1Dist = ping.FL.Bin1Dist / 100.0
+ 315        self.meta_data.NCells = ping.FL.NCells
+ 316        self.meta_data.CellSize = ping.FL.CellSize / 100.0
+ 317
+ 318    def _generate_external_pressure_interpolator(self, dat):
+ 319        """Interpolate external pressure to pycurrents time vector.
+ 320
+ 321        Parameters
+ 322        ----------
+ 323        dat : pycurrents.adcp.rdiraw.Bunch
+ 324            Data structure.
+ 325
+ 326        Returns
+ 327        -------
+ 328        Interpolator
+ 329
+ 330        """
+ 331
+ 332        # We already have a function to convert the pycurrents time to
+ 333        # datetime64. Interpolate in this time domain.
+ 334        time = io.yday0_to_datetime64(dat.yearbase, dat.dday)
+ 335        p_interpolated = self._pressure_provided.interp(time=time).data
+ 336
+ 337        # Beginning and end may have NaN's if the ADCP was started before
+ 338        # the external pressure sensor. Make sure this happens only when
+ 339        # outside the water and then replace with atmospheric pressure.
+ 340        if np.any(np.isnan(p_interpolated)):
+ 341            nan_mask = np.isnan(p_interpolated)
+ 342            i_nan = np.flatnonzero(nan_mask)
+ 343
+ 344            first_few_good_median = np.median(p_interpolated[~nan_mask][:20])
+ 345            last_few_good_median = np.median(p_interpolated[~nan_mask][-20:])
+ 346
+ 347        if np.isnan(p_interpolated[0]):
+ 348            if first_few_good_median < 1:
+ 349                i_divide = np.flatnonzero(np.diff(i_nan) - 1) + 1
+ 350                if i_divide.size == 0:
+ 351                    p_interpolated[nan_mask] = first_few_good_median
+ 352                else:
+ 353                    p_interpolated[0:i_divide] = first_few_good_median
+ 354
+ 355        if np.isnan(p_interpolated[-1]):
+ 356            if last_few_good_median < 1:
+ 357                i_divide = np.flatnonzero(np.diff(i_nan) - 1) + 1
+ 358                if i_divide.size == 0:
+ 359                    p_interpolated[nan_mask] = last_few_good_median
+ 360                else:
+ 361                    p_interpolated[i_divide:] = last_few_good_median
+ 362
+ 363        # Now generate an interpolation function that will take dday as input
+ 364        # for later per-ensemble interpolation.
+ 365        self._external_pressure_interpolator = sp.interpolate.interp1d(
+ 366            dat.dday,
+ 367            p_interpolated,
+ 368            bounds_error=False,
+ 369            fill_value="extrapolate",
+ 370        )
+ 371
+ 372    def _external_pressure_to_dat(self, dat):
+ 373        """Interpolate external pressure to pycurrents time vector.
+ 374
+ 375        Parameters
+ 376        ----------
+ 377        dat : pycurrents.adcp.rdiraw.Bunch
+ 378            Data structure.
+ 379
+ 380        Returns
+ 381        -------
+ 382        array-like
+ 383            Pressure
+ 384
+ 385        """
+ 386        return self._external_pressure_interpolator(dat.dday)
+ 387
+ 388    def _scale_pycurrents_pressure(self, dat):
+ 389        # Initial pressure units: 10 Pa (about 1 mm or 0.001 decibar).
+ 390        # Converting to decibars.
+ 391        return dat.VL["Pressure"] / 1000.0 * self._pressure_scale_factor
+ 392
+ 393    def _read_auxiliary_data(self):
+ 394        """Read auxiliary data.
+ 395
+ 396        Adds attribute `tsdat`.
+ 397
+ 398        """
+ 399        tsdat = self.m.read(varlist=["VariableLeader"])
+ 400        tsdat.temperature = tsdat.VL["Temperature"] / 100.0
+ 401        # Replace pressure if provided from external sensor
+ 402        if self._pressure_provided is not None:
+ 403            self._generate_external_pressure_interpolator(tsdat)
+ 404            tsdat.pressure = self._external_pressure_to_dat(tsdat)
+ 405        else:
+ 406            tsdat.pressure = self._scale_pycurrents_pressure(tsdat)
+ 407        self.tsdat = tsdat
+ 408
+ 409    def _parse_meta_data(self):
+ 410        """Parse meta data.
+ 411
+ 412        - Add essential meta data to attributes. Will throw a KeyError if no
+ 413          lon/lat provided.
+ 414
+ 415        - Read serial number from raw data and complain if it does not match
+ 416          the meta data SN.
+ 417        """
+ 418        essential_meta_data = ["lon", "lat"]
+ 419
+ 420        [
+ 421            self._safely_add_attribute_from_params(k, self.meta_data)
+ 422            for k in essential_meta_data
+ 423        ]
+ 424
+ 425        # Check SN
+ 426        sn_internal = int.from_bytes(self.tsdat.FL.Inst_SN, "little")
+ 427
+ 428        if "sn" not in self.meta_data:
+ 429            self.meta_data.sn = sn_internal
+ 430
+ 431        # Check internal SN matches user set one
+ 432        if sn_internal != self.meta_data.sn:
+ 433            warn(
+ 434                f"Serial number in file, {sn_internal}, is different from that set by user, {self.meta_data.sn}. Keeping user value."
+ 435            )
+ 436
+ 437    @property
+ 438    def default_dgridparams(self):
+ 439        """Determine default depth gridding parameters.
+ 440
+ 441        The grid is centered on the  median depth of the ADCP (plus distance to
+ 442        the center of the first bin) to avoid unnecessary binning into
+ 443        neighboring depth cells. The default size of the depth bins mimicks the
+ 444        size of ADCP bins.
+ 445        """
+ 446        if self._default_dgridparams is None:
+ 447            # Only use pressure at depth, not on deck
+ 448            ii = np.flatnonzero(self.tsdat.pressure > 15)
+ 449            p = self.tsdat.pressure[ii]
+ 450            # Determine limits of the pressure distribution but leave out the
+ 451            # top 5 and bottom 2 percent of data points. This way we are hoping
+ 452            # to avoid any outliers and a possible pressure record of ascent
+ 453            # and/or descent.
+ 454            p_top, p_bot = np.round(
+ 455                seawater.depth2(np.percentile(p, [5, 98]), self.lat)
+ 456            )
+ 457            self.p_median = np.median(p)
+ 458            pdep_median = np.round(seawater.depth2(self.p_median, self.lat))
+ 459            n = self.meta_data.NCells + 2
+ 460            d_interval = self.meta_data.CellSize
+ 461            distance_to_first_bin = np.round(self.meta_data.Bin1Dist)
+ 462            distance_to_last_bin = distance_to_first_bin + n * d_interval
+ 463
+ 464            if self.sysconfig["up"]:
+ 465                # Set minimum grid depth level. Anything shallower than 10m
+ 466                # will be garbage anyways so let's throw this out.
+ 467                dtop = p_top - distance_to_last_bin
+ 468                if dtop < 10:
+ 469                    dtop = 10
+ 470                dbot = pdep_median - distance_to_first_bin
+ 471                # Successively add bins until we reach maximum pressure. This
+ 472                # will take care of mooring knockdowns.
+ 473                while dbot < p_bot:
+ 474                    dbot += d_interval
+ 475            else:
+ 476                dtop = pdep_median + distance_to_first_bin
+ 477                while dtop > p_top:
+ 478                    dtop -= d_interval
+ 479                dbot = p_bot + distance_to_last_bin
+ 480
+ 481            self._default_dgridparams = dict(
+ 482                dtop=dtop,
+ 483                dbot=dbot,
+ 484                d_interval=d_interval,
+ 485            )
+ 486
+ 487        return self._default_dgridparams
+ 488
+ 489    def parse_dgridparams(self, dgridparams):
+ 490        """Parse depth gridding parameters.
+ 491
+ 492        See top level class notes for more info.
+ 493
+ 494        Parameters
+ 495        ----------
+ 496        dgridparams : dict
+ 497
+ 498        """
+ 499        self.dgridparams = Bunch(self.default_dgridparams)
+ 500        if dgridparams is not None:
+ 501            self.dgridparams.update_values(dgridparams, strict=True)
+ 502        else:
+ 503            logger.warning(
+ 504                "No depth gridding parameters provided, using default values."
+ 505            )
+ 506        # Default depth grid parameters are based on the median pressure to
+ 507        # avoid binning into neighboring grid cells as much as possible.
+ 508        # Therefore, we start assembling the depth grid from the bottom up for
+ 509        # an uplooker and from the top down for a downlooker.
+ 510        if self.orientation == "up":
+ 511            self.dgrid = np.arange(
+ 512                self.dgridparams.dbot,
+ 513                self.dgridparams.dtop,
+ 514                -self.dgridparams.d_interval,
+ 515                dtype=float,
+ 516            )
+ 517        elif self.orientation == "down":
+ 518            self.dgrid = np.arange(
+ 519                self.dgridparams.dtop,
+ 520                self.dgridparams.dbot,
+ 521                self.dgridparams.d_interval,
+ 522                dtype=float,
+ 523            )
+ 524
+ 525    def parse_tgridparams(self, tgridparams):
+ 526        """Parse time gridding parameters.
+ 527
+ 528        See top level class notes for more info.
+ 529
+ 530        Parameters
+ 531        ----------
+ 532        tgridparams : dict
+ 533
+ 534        """
+ 535        # Find time at depth to determine default time grid parameters.
+ 536        # Differentiate between time series only in the water and time series
+ 537        # including the overshoot on mooring deployment.
+ 538        p = self.tsdat.pressure
+ 539        if ~np.any(p < 10):
+ 540            t0 = self.dday[0]
+ 541            t1 = self.dday[-1]
+ 542        else:
+ 543            at_depth = np.nonzero(p > self.p_median)[0][0]
+ 544            t0 = self.dday[at_depth]
+ 545            in_water = np.nonzero(p > self.p_median / 2)[0][-1]
+ 546            t1 = self.dday[in_water]
+ 547
+ 548        # Generate a set of default time gridding parameters and then update
+ 549        # from the input parameters provided.
+ 550        default_tgridparams = dict(dt_hours=0.5, t0=t0, t1=t1, burst_average=False)
+ 551        self.tgridparams = Bunch(default_tgridparams)
+ 552        if tgridparams is not None:
+ 553            self.tgridparams.update_values(tgridparams, strict=True)
+ 554        else:
+ 555            logger.warning(
+ 556                "No time gridding parameters provided, using default values."
+ 557            )
+ 558
+ 559    def parse_editparams(self, editparams):
+ 560        """Parse editing parameters.
+ 561
+ 562        See top level class notes for more info.
+ 563
+ 564        Parameters
+ 565        ----------
+ 566        editparams : dict
+ 567
+ 568        """
+ 569        self.editparams = Bunch(self._editparams)
+ 570        if editparams is not None:
+ 571            self.editparams.update_values(editparams, strict=True)
+ 572        else:
+ 573            logger.warning("No edit parameters provided, using default values.")
+ 574
+ 575    def parse_driftparams(self, driftparams):
+ 576        """Parse time drift parameters.
+ 577
+ 578        See top level class notes for more info.
+ 579
+ 580        Parameters
+ 581        ----------
+ 582        driftparams : dict
+ 583
+ 584        """
+ 585        driftparams = dict() if driftparams is None else driftparams
+ 586        self.driftparams = driftparams
+ 587        self.yearbase = self.m.yearbase
+ 588        t0 = self.tsdat.dday[0]
+ 589        self.t0 = t0
+ 590        t1_adcp = driftparams.get("end_adcp", None)
+ 591        if t1_adcp is not None:
+ 592            t1_pc = to_day(self.m.yearbase, *driftparams["end_pc"])
+ 593            t1_adcp = to_day(self.m.yearbase, *driftparams["end_adcp"])
+ 594            self.time_drift_rate = (t1_pc - t0) / (t1_adcp - t0)
+ 595        else:
+ 596            logger.warning(
+ 597                "No time drift parameters provided, not applying any clock correction."
+ 598            )
+ 599            self.time_drift_rate = 1
+ 600
+ 601        self.dday = self._correct_dday(self.tsdat.dday)
+ 602
+ 603    def _correct_dday(self, dday_orig):
+ 604        """Apply linear correction for clock drift.
+ 605
+ 606        Parameters
+ 607        ----------
+ 608        dday_orig : array-like
+ 609            Origial time vector.
+ 610
+ 611        Returns
+ 612        -------
+ 613        array-like
+ 614            Corrected time vector
+ 615
+ 616        """
+ 617
+ 618        return self.t0 + self.time_drift_rate * (dday_orig - self.t0)
+ 619
+ 620    def _parse_sysconfig(self):
+ 621        # We have to get the up/down reading from sysconfig for a time when the
+ 622        # instrument was in the water. Look at pressure and determine ensembles
+ 623        # during time at depth.
+ 624        ii = np.flatnonzero(self.tsdat.pressure > 15)
+ 625        depth_ii = (ii[0] + ii[-1]) // 2
+ 626        try:
+ 627            self.tsdat.pressure[depth_ii] > 15
+ 628        except ValueError:
+ 629            print("could not determine ensemble index at depth for reading sysconfig")
+ 630        at_depth = self.m.read(
+ 631            varlist=["VariableLeader"], start=depth_ii, stop=depth_ii + 1
+ 632        )
+ 633        self.orientation = "up" if at_depth.sysconfig.up else "down"
+ 634        self.sysconfig = at_depth.sysconfig
+ 635
+ 636    def make_start_ddays(self):
+ 637        """Generate time stamps for ping averaging.
+ 638
+ 639        Notes
+ 640        -----
+ 641        If turning on burst averaging, other input values will be ignored and
+ 642        the averaging interval will be determined from the burst sampling
+ 643        scheme apparent in the ping pattern.
+ 644
+ 645        """
+ 646        dday_start = self.tgridparams.t0
+ 647        dday_end = self.tgridparams.t1
+ 648        dt_hours = self.tgridparams.dt_hours
+ 649        is_burst_average = self.tgridparams.burst_average
+ 650
+ 651        # Save whether we are averaging over bursts or not.
+ 652        self.is_burst_average = is_burst_average
+ 653        # Generate time stamps and stuff.
+ 654        if not is_burst_average:
+ 655            print("no burst average")
+ 656            self.dday_start = dday_start
+ 657            self.dday_end = dday_end
+ 658            self.dt = dt_hours / 24.0
+ 659            self.start_ddays = np.arange(dday_start, dday_end, dt_hours / 24.0)
+ 660            # Time stamps for the averages. Midpoints of averaging intervals.
+ 661            self.dday_mid = self.start_ddays + self.dt / 2
+ 662        else:
+ 663            dday_diff = np.diff(self.dday)
+ 664            # Determine ping interval within burst and time between bursts.
+ 665            burst_dt = np.median(dday_diff)
+ 666            print(f"time between pings within burst: {burst_dt * 24 * 60 * 60:1.1f} s")
+ 667            # It seems safe to assume that the time between bursts is at least
+ 668            # four times as long as the time between individual pings within a
+ 669            # burst.
+ 670            inter_burst_dt = np.median(dday_diff[dday_diff > burst_dt * 4])
+ 671            print(f"time between bursts: {inter_burst_dt * 24 * 60:1.1f} min")
+ 672            # Find starting points of all bursts.
+ 673            start_indices = np.flatnonzero(dday_diff > burst_dt * 4)
+ 674            # Increase index so we are at the end of the larger time differences.
+ 675            start_indices += 1
+ 676            # Include the very beginning.
+ 677            start_indices = np.insert(start_indices, 0, 0)
+ 678            self.start_ddays = self.dday[start_indices]
+ 679            self.dday_start = self.start_ddays[0]
+ 680            # Generate a dt that is inclusive of one burst.  We know the number
+ 681            # of pings in a burst from the difference between the
+ 682            # start_indices. Let's go a bit beyond the time needed (3 more ping
+ 683            # intervals chosen here).
+ 684            pings_per_burst = np.int32(np.median(np.diff(start_indices)))
+ 685            print(f"{pings_per_burst} pings per burst")
+ 686            print(f"{start_indices.shape[0]} bursts total")
+ 687            self.dt = burst_dt * pings_per_burst + burst_dt * 3
+ 688
+ 689            self.dday_start = self.start_ddays[0]
+ 690            self.dday_end = dday_end
+ 691
+ 692            # Time stamps in the middle of the burst
+ 693            self.dday_mid = self.start_ddays + pings_per_burst * burst_dt / 2
+ 694
+ 695    def read_ensemble(self, iens):
+ 696        """Read ensembles (several individual pings grouped together).
+ 697
+ 698        Parameters
+ 699        ----------
+ 700        iens : int
+ 701            Index into ensemble start times (they are generated in
+ 702            :meth:`make_start_ddays`).
+ 703
+ 704        Returns
+ 705        -------
+ 706        dat : pycurrents.adcp.rdiraw.Bunch
+ 707            Dictionary with data.
+ 708
+ 709        Raises
+ 710        ------
+ 711        ValueError
+ 712            If `iens` is too large to index into `start_ddays`.
+ 713
+ 714        """
+ 715
+ 716        if iens > len(self.start_ddays) - 1:
+ 717            raise ValueError("ens num %d is out of range" % iens)
+ 718
+ 719        # Get indices within the interval.
+ 720        sl = rangeslice(
+ 721            self.dday, self.start_ddays[iens], self.start_ddays[iens] + self.dt
+ 722        )
+ 723        # Use the indices to extract data.
+ 724        dat = self.m.read(start=sl.start, stop=sl.stop)
+ 725        if dat is None:
+ 726            return None
+ 727        dat.dday_orig = dat.dday
+ 728        dat.dday = self._correct_dday(dat.dday_orig)
+ 729        if self._pressure_provided is not None:
+ 730            # Replace pressure if provided
+ 731            dat.pressure = self._external_pressure_to_dat(dat)
+ 732        else:
+ 733            dat.pressure = self._scale_pycurrents_pressure(dat)
+ 734        sign = -1 if self.orientation == "up" else 1
+ 735        pdepth = seawater.depth2(dat.pressure, self.lat)
+ 736        dat.depth = pdepth[:, np.newaxis] + sign * dat.dep
+ 737        return dat
+ 738
+ 739    @property
+ 740    def magdec(self):
+ 741        """Magnetic declination.
+ 742
+ 743        If not provided as input argument magdec is calculated using
+ 744        [magdec](https://currents.soest.hawaii.edu/hgstage/geomag/file/tip)
+ 745        (must be installed) based on `lon` and `lat`.
+ 746
+ 747        """
+ 748        if self._magdec is None:
+ 749            if self.lat is None:
+ 750                logger.warning(
+ 751                    "No lon/lat provided, cannot calculate magnetic declination."
+ 752                )
+ 753                self._magdec = 0
+ 754            else:
+ 755                # Look for magdec executable
+ 756                magdec_found = True
+ 757                magdec_path = which("magdec")
+ 758
+ 759                if magdec_path is None:
+ 760                    magdec_found = False
+ 761                    package_dir = os.path.dirname(__file__)
+ 762
+ 763                if not magdec_found:
+ 764                    # Try this package directory
+ 765                    magdec_path = os.path.join(package_dir, "magdec")
+ 766                    magdec_found = os.path.isfile(magdec_path)
+ 767
+ 768                if not magdec_found:
+ 769                    # Try the magdec installation directory
+ 770                    magdec_path = os.path.abspath(
+ 771                        os.path.join(package_dir, "../geomag/magdec")
+ 772                    )
+ 773                    magdec_found = os.path.isfile(magdec_path)
+ 774
+ 775                if not magdec_found:
+ 776                    raise FileNotFoundError(
+ 777                        "Cannot find program magdec on the system path or paths within velosearaptor."
+ 778                    )
+ 779
+ 780                logger.info(f"magdec found at {magdec_path}")
+ 781
+ 782                n = len(self.start_ddays)
+ 783                dday_mid = self.start_ddays[n // 2]
+ 784                y, m, d = to_date(self.yearbase, dday_mid)[:3]
+ 785
+ 786                output = Popen(
+ 787                    [
+ 788                        magdec_path,
+ 789                        str(self.lon),
+ 790                        str(self.lat),
+ 791                        str(y),
+ 792                        str(m),
+ 793                        str(d),
+ 794                    ],
+ 795                    stdout=PIPE,
+ 796                ).communicate()[0]
+ 797                output = output.strip()
+ 798                logger.info("magdec output is: %s", output)
+ 799                self._magdec = float(output.split()[0])
+ 800        elif self._magdec_provided is not None:
+ 801            logger.info(f"magdec {self._magdec_provided} provided.")
+ 802        return self._magdec
+ 803
+ 804    @property
+ 805    def raw(self):
+ 806        """Raw ADCP data."""
+ 807        if self._raw is None:
+ 808            print("Reading raw data...")
+ 809            self._raw = io.read_raw_rdi(self.files)
+ 810            self._raw.coords["bin"] = (("z"), np.arange(self._raw.z.size))
+ 811        return self._raw
+ 812
+ 813    def _edit(self, ens):
+ 814        """Apply editing to xyze."""
+ 815        ep = self.editparams
+ 816        cond = (ens.cor < ep.min_correlation).any(axis=-1)
+ 817        ens.xyze[cond] = np.ma.masked
+ 818        e = ens.xyze[:, :, 3]
+ 819        max_e = min(ep.max_e, e.std() * ep.max_e_deviation)
+ 820        ens.max_e_applied = max_e
+ 821        cond = np.abs(e) > max_e
+ 822        ens.xyze[cond] = np.ma.masked
+ 823        if ep.maskbins is not None:
+ 824            ens.xyze[:, ep.maskbins, :] = np.ma.masked
+ 825
+ 826    def _to_enu(self, ens):
+ 827        """
+ 828        add enu
+ 829        GV: enu is east, north, up, errvel (optional) whereas xyz are
+ 830        instrument coordinates.
+ 831        """
+ 832        ens.enu = rdi_xyz_enu(
+ 833            ens.xyze,
+ 834            ens.heading + self.magdec,
+ 835            ens.pitch,
+ 836            ens.roll,
+ 837            orientation=self.orientation,
+ 838        )
+ 839
+ 840    def _burst_average_depth(self, ens):
+ 841        """Depth-average within a burst.
+ 842
+ 843        Average the depth vectors if doing burst-averages. Otherwise we just
+ 844        return all depth vectors of this ensemble.
+ 845
+ 846        Parameters
+ 847        ----------
+ 848        ens : Bunch
+ 849            Ensemble data.
+ 850
+ 851        Returns
+ 852        -------
+ 853        depth : array-like
+ 854            Depth vector for each ping.
+ 855
+ 856        """
+ 857        if self.is_burst_average:
+ 858            depth_mean = ens.depth.mean(axis=0)
+ 859            depth = np.tile(depth_mean, (ens.dday.size, 1))
+ 860        else:
+ 861            depth = ens.depth
+ 862        return depth
+ 863
+ 864    def _regrid_enu(self, ens, method="linear"):
+ 865        """Depth-grid enu velocities."""
+ 866        shape = (ens.dday.size, self.dgrid.size, ens.enu.shape[-1])
+ 867        enu_grid = np.ma.zeros(shape)
+ 868        enu_grid[:] = np.ma.masked
+ 869        # Average the depth vectors if doing burst-averages. Otherwise we just
+ 870        # return all depth vectors of this ensemble.
+ 871        # TO DO: If calculating averages over regular time intervals, we need
+ 872        # to low pass filter the pressure time series prior to creating the
+ 873        # depth vectors.
+ 874        depth = self._burst_average_depth(ens)
+ 875        for i in range(ens.dday.size):
+ 876            enu_grid[i] = interp1(
+ 877                depth[i], ens.enu[i], self.dgrid, axis=0, method=method
+ 878            )
+ 879        ens.enu_grid = enu_grid
+ 880
+ 881    def _regrid_amp(self, ens, method="linear"):
+ 882        """Depth-grid amplitudes (averaged over all 4 beams)."""
+ 883        shape = (ens.dday.size, self.dgrid.size)
+ 884        amp_grid = np.ma.zeros(shape)
+ 885        amp_grid[:] = np.ma.masked
+ 886        depth = self._burst_average_depth(ens)
+ 887        for i in range(ens.dday.size):
+ 888            amp_grid[i] = interp1(
+ 889                depth[i],
+ 890                ens.amp[i].mean(axis=-1),
+ 891                self.dgrid,
+ 892                axis=0,
+ 893                method=method,
+ 894            )
+ 895        ens.amp_grid = amp_grid
+ 896
+ 897    def _binmap_one_beam(self, ens, beam_number):
+ 898        """Binmap single ping data for a single beam by linear interpolation.
+ 899
+ 900        Mapping is applied to velocity, amplitude and correlation.
+ 901
+ 902        Currently only works for 4 beam ADCP.
+ 903
+ 904        Parameters
+ 905        ----------
+ 906        ens : Bunch
+ 907            An ADCP dataset read by Multiread.
+ 908        beam_number : int
+ 909            An integer from 1 to 4 representing the beam number.
+ 910
+ 911        Returns
+ 912        -------
+ 913        veli : ndarray
+ 914            Mapped velocity.
+ 915        ampi : ndarray
+ 916            Mapped amplitude.
+ 917        cori : ndarray
+ 918            Mapped correlation.
+ 919
+ 920        """
+ 921
+ 922        if beam_number not in [1, 2, 3, 4]:
+ 923            raise ValueError("Beam number must be 1, 2, 3 or 4.")
+ 924
+ 925        tba = np.tan(np.deg2rad(ens.sysconfig.angle))  # Tangent of beam angle
+ 926        pitch = np.deg2rad(ens.pitch)
+ 927        roll = np.deg2rad(ens.roll)
+ 928
+ 929        # The true bin distances
+ 930        if beam_number == 1:
+ 931            dep = (
+ 932                ens.dep[None, :]
+ 933                * ((np.cos(roll) - tba * np.sin(roll)) * np.cos(pitch))[:, None]
+ 934            )  # None adds a new axis.
+ 935        elif beam_number == 2:
+ 936            dep = (
+ 937                ens.dep[None, :]
+ 938                * ((np.cos(roll) + tba * np.sin(roll)) * np.cos(pitch))[:, None]
+ 939            )
+ 940        elif beam_number == 3:
+ 941            dep = (
+ 942                ens.dep[None, :]
+ 943                * ((np.cos(pitch) + tba * np.sin(pitch)) * np.cos(roll))[:, None]
+ 944            )
+ 945        elif beam_number == 4:
+ 946            dep = (
+ 947                ens.dep[None, :]
+ 948                * ((np.cos(pitch) - tba * np.sin(pitch)) * np.cos(roll))[:, None]
+ 949            )
+ 950
+ 951        vel = ens.vel[..., beam_number - 1]
+ 952        amp = ens.amp[..., beam_number - 1]
+ 953        cor = ens.cor[..., beam_number - 1]
+ 954
+ 955        # Calculate interpolating weights (this hogs RAM!)
+ 956        dz = np.diff(dep, axis=1)
+ 957        w = np.clip((ens.dep - dep[:, :-1, None]) / dz[:, :, None], 0, 1)
+ 958
+ 959        # Determine data above or below the deepest bins
+ 960        above = (w == 1.0).all(axis=1)
+ 961        below = (w == 0.0).all(axis=1)
+ 962        bad = above | below
+ 963
+ 964        # Calculate differences
+ 965        dvel = np.diff(vel, axis=1)
+ 966        damp = np.diff(amp, axis=1)
+ 967        dcor = np.diff(cor, axis=1)
+ 968
+ 969        veli = vel[:, [0]] + np.sum(w * dvel[:, :, None], axis=1)
+ 970        veli[bad] = np.nan
+ 971
+ 972        ampi = amp[:, [0]] + np.sum(w * damp[:, :, None], axis=1)
+ 973        ampi[bad] = np.nan
+ 974
+ 975        cori = cor[:, [0]] + np.sum(w * dcor[:, :, None], axis=1)
+ 976        cori[bad] = np.nan
+ 977
+ 978        return veli, ampi, cori
+ 979
+ 980    def _binmap_all_beams(self, ens):
+ 981        """Binmap single ping data for all beams."""
+ 982
+ 983        for beam_number in [1, 2, 3, 4]:
+ 984            veli, ampi, cori = self._binmap_one_beam(ens, beam_number)
+ 985            ens.vel[..., beam_number - 1] = veli
+ 986            ens.amp[..., beam_number - 1] = ampi
+ 987            ens.cor[..., beam_number - 1] = cori
+ 988
+ 989            ens[f"vel{beam_number}"] = veli
+ 990            ens[f"amp{beam_number}"] = ampi
+ 991            ens[f"cor{beam_number}"] = cori
+ 992
+ 993    def _calculate_xyze(self, ens, ibad=None):
+ 994        """Calculate xyze from along-beam data."""
+ 995        if ens.sysconfig.convex:
+ 996            geom = "convex"
+ 997        else:
+ 998            geom = "concave"
+ 999
+1000        trans = Transform(angle=ens.sysconfig.angle, geometry=geom)
+1001
+1002        ens.xyze = trans.beam_to_xyz(ens.vel, ibad=ibad)
+1003
+1004    def process_pings(self, start=None, stop=None, binmap=False, ens_size=50000):
+1005        """Process single ping data without averaging.
+1006
+1007        Adds results as dictionary under `ave` and as `xarray.Dataset` under `ds`.
+1008
+1009        Writes processing parameters to the log file.
+1010
+1011        Parameters
+1012        ----------
+1013        start : int, optional
+1014            Start processing at this ping number.
+1015        stop : int, optional
+1016            Stop processing at this ping number.
+1017        binmap : bool, optional
+1018            Do binmapping of along-beam data.
+1019        ens_size : int, optional
+1020            Pings are processed in ensembles to reduce memory usage.
+1021            This parameter sets how many pings are in an ensemble. The default is 50000.
+1022
+1023        """
+1024        if start is None:
+1025            idx_start = np.searchsorted(self.dday, self.dday_start)
+1026        if stop is None:
+1027            idx_stop = np.searchsorted(self.dday, self.dday_end)
+1028
+1029        ens_idxs = np.hstack((np.arange(idx_start, idx_stop, ens_size), idx_stop))
+1030        write_idxs = ens_idxs - ens_idxs[0]  # Arrays we write to start at index 0
+1031        npings = idx_stop - idx_start
+1032        nens = ens_idxs.size - 1
+1033        ndgrid = self.tsdat.dep.size
+1034
+1035        logger.info("Processing all pings")
+1036        logger.info(f"Binmapping is {binmap}")
+1037
+1038        uvwe = np.ma.zeros((npings, ndgrid, 4), dtype=np.float32)
+1039
+1040        pg = np.zeros((npings, ndgrid), dtype=np.int8)
+1041        amp = np.ma.zeros((npings, ndgrid), dtype=np.float32)
+1042
+1043        # temperature = np.ma.zeros((npings,), dtype=np.float32)
+1044        # pressure = np.ma.zeros((npings,), dtype=np.float32)
+1045
+1046        temperature = self.tsdat.temperature[idx_start:idx_stop]
+1047        pressure = self.tsdat.pressure[idx_start:idx_stop]
+1048
+1049        dday = self.dday[idx_start:idx_stop]
+1050
+1051        # Loop over ensembles
+1052        for i in tqdm(range(nens)):
+1053            ens = self.m.read(start=ens_idxs[i], stop=ens_idxs[i + 1])
+1054            idx0 = write_idxs[i]
+1055            idx1 = write_idxs[i + 1]
+1056
+1057            if ens is not None:
+1058                # I pulled this out of read_ensembles because we need to calculate depth for _ave2nc to work.
+1059                ens.dday_orig = ens.dday
+1060                ens.dday = self._correct_dday(ens.dday_orig)
+1061                if self._pressure_provided is not None:
+1062                    # Replace pressure if provided
+1063                    ens.pressure = self._external_pressure_to_dat(ens)
+1064                else:
+1065                    ens.pressure = self._scale_pycurrents_pressure(ens)
+1066                sign = -1 if self.orientation == "up" else 1
+1067                pdepth = seawater.depth2(ens.pressure, self.lat)
+1068                ens.depth = pdepth[:, np.newaxis] + sign * ens.dep
+1069
+1070                if binmap:
+1071                    self._binmap_all_beams(ens)
+1072                    # Now we have to recalculate xyze with the binmapped data.
+1073                    self._calculate_xyze(ens)
+1074
+1075                self._edit(ens)  # modifies xyze
+1076                self._to_enu(ens)  # transform to earth coords (east, north, up)
+1077
+1078            else:
+1079                uvwe[idx0:idx1] = np.ma.masked
+1080                amp[idx0:idx1] = np.ma.masked
+1081                # pressure[idx0:idx1] = np.ma.masked
+1082                # temperature[idx0:idx1] = np.ma.masked
+1083                continue
+1084
+1085            uvwe[idx0:idx1] = ens.enu
+1086
+1087            # pgi = 100 * ens.enu_grid[..., 0].count(axis=0) // nprofs
+1088            # pg[i] = pgi.astype(np.int8)
+1089            amp[idx0:idx1] = ens.amp.mean(axis=-1)  # Average over beams... why?
+1090
+1091        self.ave = Bunch(
+1092            u=uvwe[..., 0],
+1093            v=uvwe[..., 1],
+1094            w=uvwe[..., 2],
+1095            e=uvwe[..., 3],
+1096            pg=pg,
+1097            amp=amp,
+1098            temperature=temperature,
+1099            pressure=pressure,
+1100            # npings=npings,
+1101            dday=dday,
+1102            yearbase=self.yearbase,
+1103            dep=ens.dep,  # <<<<----- BAD!!! This a fudge because I don't want to calculated a depth vector. We use the depth vector from the last ensemble.
+1104            editparams=self.editparams,
+1105            tgridparams=self.tgridparams,
+1106            # dgridparams=self.dgridparams,
+1107            magdec=self.magdec,
+1108            lon=self.lon,
+1109            lat=self.lon,
+1110        )
+1111
+1112        self._ave2nc()
+1113        self._add_meta_data_to_ds()
+1114        self._log_processing_params()
+1115
+1116    def average_ensembles(self, start=None, stop=None):
+1117        """Time-averaging.
+1118
+1119        Adds results as dictionary under `ave` and as `xarray.Dataset` under `ds`.
+1120
+1121        Writes processing parameters to the log file.
+1122
+1123        Parameters
+1124        ----------
+1125        start : int
+1126            Range start for averaging. Index into start times of averaging
+1127            intervals.
+1128        stop : int
+1129            Range start for averaging. Index into start times of averaging
+1130            intervals.
+1131
+1132        """
+1133
+1134        nens_orig = len(self.start_ddays)
+1135        indices_orig = np.arange(nens_orig)
+1136        indices = indices_orig[start:stop]
+1137        if start is None and stop is None:
+1138            logger.info("Averaging all ensembles")
+1139        else:
+1140            logger.info(f"Averaging ensembles {indices[0]} to {indices[-1]}")
+1141        nens = len(indices)
+1142        ndgrid = len(self.dgrid)
+1143        uvwe = np.ma.zeros((nens, ndgrid, 4), dtype=np.float32)
+1144        uvwe_std = np.ma.zeros((nens, ndgrid, 4), dtype=np.float32)
+1145
+1146        pg = np.zeros((nens, ndgrid), dtype=np.int8)
+1147        amp = np.ma.zeros((nens, ndgrid), dtype=np.float32)
+1148
+1149        temperature = np.ma.zeros((nens,), dtype=np.float32)
+1150        pressure = np.ma.zeros((nens,), dtype=np.float32)
+1151        pressure_std = np.ma.zeros((nens,), dtype=np.float32)
+1152        pressure_max = np.ma.zeros((nens,), dtype=np.float32)
+1153
+1154        npings = np.zeros((nens,), dtype=np.int16)
+1155
+1156        dday = self.dday_mid[start:stop]
+1157
+1158        for i, iens in enumerate(tqdm(indices)):
+1159            ens = self.read_ensemble(iens)
+1160            if ens is not None:
+1161                self._edit(ens)  # modifies xyze
+1162                self._to_enu(ens)  # transform to earth coords (east, north, up)
+1163                self._regrid_enu(ens)
+1164                self._regrid_amp(ens)
+1165
+1166                nprofs = ens.enu_grid.shape[0]
+1167            else:
+1168                nprofs = 0
+1169            npings[i] = nprofs
+1170            if nprofs < 2:
+1171                uvwe[i] = np.ma.masked
+1172                uvwe_std[i] = np.ma.masked
+1173                # (pg is not a masked array)
+1174                amp[i] = np.ma.masked
+1175                pressure[i] = np.ma.masked
+1176                pressure_std[i] = np.ma.masked
+1177                pressure_max[i] = np.ma.masked
+1178                temperature[i] = np.ma.masked
+1179                continue
+1180
+1181            uvwe[i] = ens.enu_grid.mean(axis=0)
+1182            uvwe_std[i] = ens.enu_grid.std(axis=0)
+1183
+1184            pgi = 100 * ens.enu_grid[..., 0].count(axis=0) // nprofs
+1185            pg[i] = pgi.astype(np.int8)
+1186            amp[i] = ens.amp_grid.mean(axis=0)
+1187
+1188            pressure[i] = ens.pressure.mean()
+1189            pressure_std[i] = ens.pressure.std()
+1190            pressure_max[i] = ens.pressure.max()
+1191            temperature[i] = ens.temperature.mean()
+1192
+1193        self.ave = Bunch(
+1194            u=uvwe[..., 0],
+1195            v=uvwe[..., 1],
+1196            w=uvwe[..., 2],
+1197            e=uvwe[..., 3],
+1198            u_std=uvwe_std[..., 0],
+1199            v_std=uvwe_std[..., 1],
+1200            w_std=uvwe_std[..., 2],
+1201            e_std=uvwe_std[..., 3],
+1202            pg=pg,
+1203            amp=amp,
+1204            temperature=temperature,
+1205            pressure=pressure,
+1206            pressure_std=pressure_std,
+1207            pressure_max=pressure_max,
+1208            npings=npings,
+1209            dday=dday,
+1210            yearbase=self.yearbase,
+1211            dep=self.dgrid,
+1212            editparams=self.editparams,
+1213            tgridparams=self.tgridparams,
+1214            dgridparams=self.dgridparams,
+1215            magdec=self.magdec,
+1216            lon=self.lon,
+1217            lat=self.lon,
+1218        )
+1219
+1220        self._ave2nc()
+1221        self._add_meta_data_to_ds()
+1222        self._log_processing_params()
+1223
+1224    def burst_average_ensembles(self, start=None, stop=None, interpolate_bin=None):
+1225        """Time-averaging prior to depth-gridding.
+1226
+1227        Uses pre-defined editing parameters that can be updated with
+1228        `parse_editparams`.
+1229
+1230        Adds results as dictionary under `ave` and as `xarray.Dataset` under `ds`.
+1231
+1232        Writes processing parameters to the log file.
+1233
+1234        Parameters
+1235        ----------
+1236        start : int, optional
+1237            Range start for averaging. Index into start times of averaging
+1238            intervals. Defaults to None (start at beginning).
+1239        stop : int, optional
+1240            Range start for averaging. Index into start times of averaging
+1241            intervals. Defaults to None (start at beginning).
+1242        interpolate_bin : int or None, optional
+1243            Interpolate over a single, previously masked, bin. Defaults to None (no interpolation).
+1244
+1245        """
+1246        pg_condition = self.editparams.pg_limit
+1247        nens_orig = len(self.start_ddays)
+1248        indices_orig = np.arange(nens_orig)
+1249        indices = indices_orig[start:stop]
+1250        if start is None and stop is None:
+1251            logger.info("Averaging all ensembles")
+1252        else:
+1253            logger.info(f"Averaging ensembles {indices[0]} to {indices[-1]}")
+1254        nens = len(indices)
+1255        ndgrid = len(self.dgrid)
+1256        uvwe = np.ma.zeros((nens, ndgrid, 4), dtype=np.float32)
+1257        uvwe_std = np.ma.zeros((nens, ndgrid, 4), dtype=np.float32)
+1258
+1259        pg = np.zeros((nens, ndgrid), dtype=np.int8)
+1260        amp = np.ma.zeros((nens, ndgrid), dtype=np.float32)
+1261
+1262        temperature = np.ma.zeros((nens,), dtype=np.float32)
+1263        pressure = np.ma.zeros((nens,), dtype=np.float32)
+1264        pressure_std = np.ma.zeros((nens,), dtype=np.float32)
+1265        pressure_max = np.ma.zeros((nens,), dtype=np.float32)
+1266
+1267        npings = np.zeros((nens,), dtype=np.int16)
+1268
+1269        dday = self.dday_mid[start:stop]
+1270
+1271        for i, iens in enumerate(tqdm(indices)):
+1272            ens = self.read_ensemble(iens)
+1273            if ens is not None:
+1274                self._edit(ens)  # modifies xyze
+1275                self._to_enu(ens)  # transform to earth coords (east, north, up)
+1276                self._regrid_enu(ens)
+1277                self._regrid_amp(ens)
+1278
+1279                nprofs = ens.enu_grid.shape[0]
+1280            else:
+1281                nprofs = 0
+1282            npings[i] = nprofs
+1283            if nprofs < 2:
+1284                uvwe[i] = np.ma.masked
+1285                uvwe_std[i] = np.ma.masked
+1286                # (pg is not a masked array)
+1287                amp[i] = np.ma.masked
+1288                pressure[i] = np.ma.masked
+1289                pressure_std[i] = np.ma.masked
+1290                pressure_max[i] = np.ma.masked
+1291                temperature[i] = np.ma.masked
+1292                continue
+1293
+1294            # Depth vector for interpolation
+1295            depth = self._burst_average_depth(ens)
+1296            depth = depth[0, :]
+1297
+1298            # Calculate burst-average on instrument-relative depth grid
+1299            uvwe_inst = ens.enu.mean(axis=0)
+1300            uvwe_std_inst = ens.enu.std(axis=0)
+1301
+1302            pgi_inst = 100 * ens.enu[..., 0].count(axis=0) // nprofs
+1303
+1304            if pg_condition is not None:
+1305                pgi_index = pgi_inst < pg_condition
+1306                uvwe_inst[pgi_index, :] = np.ma.masked
+1307                uvwe_std_inst[pgi_index, :] = np.ma.masked
+1308
+1309            if interpolate_bin is not None:
+1310                zi = interpolate_bin
+1311                neighbors = [zi - 2, zi - 1, zi + 1, zi + 2]
+1312                dtmp = depth[neighbors]
+1313                tmp = interp1(
+1314                    dtmp,
+1315                    uvwe_inst[neighbors, :],
+1316                    depth[zi],
+1317                    axis=0,
+1318                    method="linear",
+1319                )
+1320                uvwe_inst[zi, :] = tmp
+1321
+1322            # Interpolate burst-average to universal depth grid.
+1323            uvwe_grid = interp1(depth, uvwe_inst, self.dgrid, axis=0, method="linear")
+1324            uvwe_std_grid = interp1(
+1325                depth, uvwe_std_inst, self.dgrid, axis=0, method="linear"
+1326            )
+1327            uvwe[i] = uvwe_grid
+1328            uvwe_std[i] = uvwe_std_grid
+1329
+1330            # Interpolate pg to universal depth grid. Not overly satisfying but
+1331            # seems like that's what we need to do here.
+1332            pgi_grid = interp1(depth, pgi_inst, self.dgrid, axis=0, method="linear")
+1333            pg[i] = pgi_grid.astype(np.int8)
+1334
+1335            # Not changed to averaging in instrument-relative coordinates first.
+1336            amp[i] = ens.amp_grid.mean(axis=0)
+1337
+1338            pressure[i] = ens.pressure.mean()
+1339            pressure_std[i] = ens.pressure.std()
+1340            pressure_max[i] = ens.pressure.max()
+1341            temperature[i] = ens.temperature.mean()
+1342
+1343        self.ave = Bunch(
+1344            u=uvwe[..., 0],
+1345            v=uvwe[..., 1],
+1346            w=uvwe[..., 2],
+1347            e=uvwe[..., 3],
+1348            u_std=uvwe_std[..., 0],
+1349            v_std=uvwe_std[..., 1],
+1350            w_std=uvwe_std[..., 2],
+1351            e_std=uvwe_std[..., 3],
+1352            pg=pg,
+1353            amp=amp,
+1354            temperature=temperature,
+1355            pressure=pressure,
+1356            pressure_std=pressure_std,
+1357            pressure_max=pressure_max,
+1358            npings=npings,
+1359            dday=dday,
+1360            yearbase=self.yearbase,
+1361            dep=self.dgrid,
+1362            editparams=self.editparams,
+1363            tgridparams=self.tgridparams,
+1364            dgridparams=self.dgridparams,
+1365            magdec=self.magdec,
+1366            lon=self.lon,
+1367            lat=self.lon,
+1368        )
+1369
+1370        self._ave2nc()
+1371        self._add_meta_data_to_ds()
+1372        self._log_processing_params()
+1373
+1374    def _safely_add_attribute_from_params(self, key, d):
+1375        """Add attribute from dictionary and throw an exception if the key is missing.
+1376
+1377        Parameters
+1378        ----------
+1379        key : str
+1380        d : dict
+1381        """
+1382        try:
+1383            setattr(self, key, d[key])
+1384        except KeyError as error:
+1385            print(f"{error} is missing in input parameters")
+1386            raise
+1387
+1388    def _set_up_logger(self):
+1389        """Set up logging to both a file and to screen.
+1390
+1391        Default for screen logging is to show only warnings unless `verbose` is
+1392        set to True.
+1393
+1394        """
+1395
+1396        # Parse metadata for naming the log.
+1397        if self.meta_data is not None:
+1398            if "sn" in self.meta_data and "mooring" in self.meta_data:
+1399                sn = self.meta_data["sn"]
+1400                mooring = self.meta_data["mooring"]
+1401                has_mooring_id = True
+1402            else:
+1403                sn = None
+1404                mooring = None
+1405                has_mooring_id = False
+1406        else:
+1407            has_mooring_id = False
+1408
+1409        # Set up a logger that will collect log info from this module and the
+1410        # other pycurrent methods as well.
+1411        logdir = Path(self.logdir)
+1412        logdir.mkdir(exist_ok=True)
+1413        if has_mooring_id:
+1414            filename = f"{mooring}_{sn}.log"
+1415        else:
+1416            filename = "adcp_proc.log"
+1417        # Delete any existing handlers. This may be bad style, but I kept adding handlers when developing this.
+1418        logger.handlers = []
+1419        logging.basicConfig(
+1420            filename=logdir.joinpath(filename),
+1421            filemode="w",
+1422            format="%(asctime)s %(name)s %(levelname)s %(message)s",
+1423            datefmt="%H:%M:%S",
+1424            level=logging.INFO,
+1425            force=True,
+1426        )
+1427        ConsoleOutputHandler = logging.StreamHandler()
+1428        ConsoleOutputHandler.setLevel(logging.WARNING)
+1429        if self.verbose:
+1430            ConsoleOutputHandler.setLevel(logging.INFO)
+1431        logger.addHandler(ConsoleOutputHandler)
+1432
+1433        # current date
+1434        datestr = np.datetime64(datetime.datetime.now()).astype(datetime.datetime)
+1435        strformat = "%Y-%m-%d"
+1436        datestr = datestr.strftime(strformat)
+1437
+1438        if has_mooring_id:
+1439            logger.info(f"Processing {mooring} SN {sn} on {datestr}")
+1440        else:
+1441            logger.warning(
+1442                "No meta data provided, logging to generic filename 'adcp_proc.log'"
+1443            )
+1444            logger.info(f"Processing on {datestr}")
+1445
+1446    def _log_processing_params(self):
+1447        """Write processing parameters to log file."""
+1448
+1449        logger.info("processing settings")
+1450        logger.info("-------------------")
+1451        self._log_params(self.dgridparams)
+1452        self._log_params(self.tgridparams)
+1453        self._log_params(self.editparams)
+1454        logger.info("-------------------")
+1455
+1456    def _log_params(self, pd):
+1457        """Print ADCP processing parameter dict to logs.
+1458
+1459        Parameters
+1460        ----------
+1461        pd : dict
+1462            Parameter dict.
+1463        """
+1464
+1465        for k, v in pd.items():
+1466            if k == "maskbins" and v is not None:
+1467                logstr = (k, ":", np.flatnonzero(v))
+1468                logger.info(logstr)
+1469            else:
+1470                logstr = (k, ":", v)
+1471                logger.info(logstr)
+1472
+1473    def _ave2nc(self):
+1474        """Convert data structure from ave to xarray.Dataset format."""
+1475        # load npz file
+1476        dat = self.ave.copy()
+1477        dat = Bunch(dat)
+1478        # identify variables
+1479        k = dat.keys()
+1480        varsint = []
+1481        vars1d = []
+1482        vars2d = []
+1483        for ki in k:
+1484            try:
+1485                tmp = dat[ki].shape
+1486                if len(tmp) == 1:
+1487                    vars1d.append(ki)
+1488                elif len(tmp) == 2:
+1489                    vars2d.append(ki)
+1490            except:
+1491                tmp = None
+1492                varsint.append(ki)
+1493            # print(ki, tmp)
+1494
+1495        # generate time vector
+1496        base = datetime.datetime(dat.yearbase, 1, 1, 0, 0, 0)
+1497        time = [base + datetime.timedelta(days=ti) for ti in dat.dday]
+1498        adcptime = [np.datetime64(ti, "ns") for ti in time]
+1499        # generate Dataset
+1500        out = xr.Dataset(
+1501            {"pg": (["depth", "time"], dat.pg.T)},
+1502            coords={"time": (["time"], adcptime), "depth": (["depth"], dat.dep)},
+1503        )
+1504        for vari in vars2d:
+1505            out[vari] = (["depth", "time"], dat[vari].T)
+1506        for vari in vars1d:
+1507            if vari not in ["dep", "dday"]:
+1508                out[vari] = (["time"], dat[vari])
+1509
+1510        # Percent good is currently defined everywhere. Set to NaN where we
+1511        # don't have any amplitude data (i.e. no data).
+1512        out["pg"] = out.pg.where(~np.isnan(out.amp), other=np.nan)
+1513
+1514        # Drop depth levels with all nan
+1515        out = out.dropna(how="all", dim="depth")
+1516
+1517        # Drop pressure_std, pressure_max, and e_std
+1518        dropvars = ["pressure_std", "pressure_max", "e_std"]
+1519        for var in dropvars:
+1520            if var in out:
+1521                out = out.drop(var)
+1522
+1523        # Change u/v/w std to standard error by dividing by sqrt(npings)
+1524        for var in ["u", "v", "w"]:
+1525            if f"{var}_std" in out:
+1526                out = out.rename({f"{var}_std": f"{var}_error"})
+1527                out[f"{var}_error"] = out[f"{var}_error"] / np.sqrt(out["npings"])
+1528
+1529        # Calculate transducer depth from pressure
+1530        out["xducer_depth"] = -gsw.z_from_p(out.pressure, self.lat)
+1531
+1532        # add variable names and units for plotting
+1533        out = self._add_names_and_units(out)
+1534
+1535        self.ds = out
+1536
+1537    def _add_names_and_units(self, ds):
+1538        """Add variable attributes based on CF conventions.
+1539
+1540        Parameters
+1541        ----------
+1542        ds : xarray.Dataset
+1543
+1544        Returns
+1545        -------
+1546        ds : xarray.Dataset
+1547
+1548        """
+1549        CF = io.cf_conventions()
+1550        for v in ds.variables:
+1551            if v in CF:
+1552                ds[v].attrs = CF[v]
+1553        return ds
+1554
+1555    def _add_meta_data_to_ds(self):
+1556        # Add some more info.
+1557        self.ds.attrs["orientation"] = self.orientation
+1558        self.ds.attrs["magdec"] = self.magdec
+1559        for att in ["max_e", "max_e_deviation", "min_correlation"]:
+1560            self.ds.attrs[att] = self.editparams[att]
+1561
+1562        # Add meta data if provided.
+1563        if self.meta_data is not None:
+1564            for k, v in self.meta_data.items():
+1565                self.ds.attrs[k] = v
+1566        self.ds.attrs["proc time"] = np.datetime64("now").astype("str")
+1567
+1568    def plot_echo_stats(self):
+1569        """Plot beam statistics (correlation and amplitude) from raw ADCP data."""
+1570        r = self.raw
+1571
+1572        fig, ax = plt.subplots(
+1573            nrows=1,
+1574            ncols=2,
+1575            figsize=(5, r.bin.max().data * 0.3),
+1576            constrained_layout=True,
+1577            sharey=True,
+1578        )
+1579        r.cor.mean(dim="time").plot(
+1580            hue="beam", y="bin", marker="o", linestyle="", ax=ax[0]
+1581        )
+1582        r.amp.mean(dim="time").plot(
+1583            hue="beam", y="bin", marker="o", linestyle="", ax=ax[1]
+1584        )
+1585        ax[0].invert_yaxis()
+1586        ax[1].set(ylabel="")
+1587        ax[0].set_yticks(r.bin.data)
+1588        for axi in ax:
+1589            axi.grid(True)
+1590
+1591    def plot_pressure(self):
+1592        """Plot pressure time series and mark time at depth."""
+1593        fig, ax = plt.subplots(
+1594            nrows=1,
+1595            ncols=1,
+1596            figsize=(6, 2.5),
+1597            constrained_layout=True,
+1598        )
+1599        self.raw.pressure.plot(ax=ax, label="all")
+1600        self.raw.pressure.where(self.raw.pressure > 50).plot(ax=ax, label="subsurface")
+1601        ax.invert_yaxis()
+1602        ax.set(xlabel="", ylabel="pressure [dbar]")
+1603        ax.legend()
+1604
+1605    def generate_binmask(self, indices):
+1606        binmask = self.raw.bin.data < 0
+1607        binmask[indices] = True
+1608        return binmask
+1609
+1610
+1611class ProcessADCPyml(ProcessADCP):
+1612    """Moored ADCP processing with parameters provided via .yml file.
+1613
+1614    An example parameter file is included at
+1615    [`notebooks/parameters.yml`](https://github.com/modscripps/velosearaptor/tree/main/notebooks/parameters.yml)
+1616    """
+1617
+1618    def __init__(self, parameter_file, mooring, sn, **kwargs):
+1619        p = io.parse_yaml_input(parameter_file, mooring, sn)
+1620        super().__init__(
+1621            p["data_dir"],
+1622            meta_data=p["meta_data"],
+1623            driftparams=p["driftparams"],
+1624            tgridparams=p["tgridparams"],
+1625            dgridparams=p["dgridparams"],
+1626            editparams=p["editparams"],
+1627            **kwargs,
+1628        )
+
+ + +
+
+
+ logger = +<Logger velosearaptor.madcp (WARNING)> + + +
+ + + + +
+
+ +
+ + class + ProcessADCP: + + + +
+ +
  64class ProcessADCP:
+  65    """Moored ADCP Processing.
+  66
+  67    An instance of ProcessADCP is initialized by providing raw data and
+  68    processing parameters. Once initialized, the instance method
+  69    :meth:`average_ensembles` can be used to average over just a few or
+  70    all pings.
+  71
+  72    Magnetic declination is automatically calculated via a call to the command
+  73    line tool
+  74    [magdec](https://currents.soest.hawaii.edu/hgstage/geomag/file/tip) that
+  75    must be installed. Once calculated, the magnetic declination is stored in
+  76    `magdec` and automatically applied to the data.
+  77
+  78    Prior to time averaging, data are edited based on correlation and error
+  79    velocity thresholds. The variable `pg` is calculated based on the number of
+  80    excluded pings, i.e. it is the numbur of good pings divided by the number
+  81    of total pings within one depth bin and one time bin. It may be used to
+  82    further filter the data.
+  83
+  84    A pdf document on ADCP data collection and processing principles can be
+  85    downloaded from RDI
+  86    [here](https://www.comm-tec.com/Docs/Manuali/RDI/BBPRIME.pdf).
+  87
+  88    Time-averaged data are grouped together in an `xarray.Dataset` in the
+  89    instance attribute `ds` for easy access and convenient output to netcdf
+  90    format.
+  91
+  92    Parameters
+  93    ----------
+  94    raw_data : str or list or Path
+  95        Location(s) of raw data.
+  96    meta_data : dict
+  97        Dictionary with meta data. At a minimum entries for `lon` and `lat` are
+  98        needed. If `mooring` and `sn` provide mooring name and serial number
+  99        then these will be used to name the log file produced during
+ 100        processing.
+ 101    driftparams : dict, optional
+ 102        Time drift parameters. See notes below.
+ 103    tgridparams : dict, optional
+ 104        Time gridding parameters. See notes below.
+ 105    dgridparams : dict, optional
+ 106        Depth gridding parameters. See notes below.
+ 107    editparams : dict, optional
+ 108        Editing parameters. See notes below.
+ 109    ibad : int, optional
+ 110        Mark beam with bad data (zero based). Defaults to None.
+ 111    logdir : str, optional
+ 112        Log file directory. Defaults to `log/`.
+ 113    verbose : bool, optional
+ 114        Output more processing info to screen.
+ 115    magdec : float, optional
+ 116        Magnetic declination in degrees.
+ 117    pressure : xr.DataArray, optional
+ 118        Pressure time series in dbar as xr.DataAarray with coordinate `time`.
+ 119
+ 120    Attributes
+ 121    ----------
+ 122    files : list
+ 123        List pointing to raw data file(s).
+ 124    dday_start : float
+ 125        Start time of ADCP time series, determined either through `t0` in
+ 126        `tgridparams` or the start of the time series once at depth.
+ 127    dday_end : float
+ 128        End time of ADCP time series, determined either through `t1` in
+ 129        `tgridparams` or the end of the time series at depth.
+ 130    start_ddays : list
+ 131        Start times of averaging intervals
+ 132    dday_mid : float
+ 133        Time stamp for ping average as determined in :meth:`make_start_ddays`.
+ 134    dt : float
+ 135        Time that is inclusive of one average. For regular averaging, this is
+ 136        `dt_hours` in `tgridparams` converted to Julian days. For
+ 137        burst-averagint, this is a time interval that is inclusive of all pings
+ 138        in one bursts (but goes slightly beyond that into the time between
+ 139        bursts).
+ 140    time_drift_rate : float
+ 141        Clock drift calculated from `driftparams`.
+ 142    orientation : str
+ 143        Instrument orientation `up` or `down`.
+ 144    magdec : float
+ 145        Magnetic declination.
+ 146    m : pycurrents.adcp.rdiraw.Multiread
+ 147        Multiread instance.
+ 148    tsdat : Bunch
+ 149        Auxiliary data.
+ 150    raw : xarray.Dataset
+ 151        Raw ADCP data.
+ 152    ds : xarray.Dataset
+ 153        Time-averaged dataset added by running :meth:`average_ensembles`.
+ 154
+ 155    Notes
+ 156    -----
+ 157    Various parameters are passed to the instance through dictionaries. Their
+ 158    specifics are described below. Gridding and editing parameters can be
+ 159    updated after creating the ProcessADCP instance via `parse_dgridparams`,
+ 160    `parse_tgridparams`, and  `parse_editparams`.
+ 161
+ 162    **Time drift parameters**
+ 163    Provide clock drift parameters via `driftparams`. Accepted entries are
+ 164    - `end_adcp` : Time of ADCP at data download
+ 165    - `end_pc` : UTC time at data download
+ 166
+ 167    The difference between `end_adcp` and `end_pc` is used to linearly correct
+ 168    for instrument clock drift.
+ 169
+ 170    **Time gridding parameters**
+ 171    Provide time gridding parameters via `tgridparams`. Accepted entries are
+ 172    - `dt_hours` : Time grid interval. Defaults to 0.5h.
+ 173    - `t0` : Start time for gridding. Determined from data if not provided.
+ 174    - `t1` : End time for gridding. Determined from data if not provided.
+ 175    - burst_average : bool
+ 176        Set ensemble averaging to act on burst sampling scheme. Defaults to False.
+ 177
+ 178    **Depth gridding parameters**
+ 179    Provide depth gridding parameters via `dgridparams`. Accepted entries are
+ 180    - `dtop` : Shallow depth in m.
+ 181    - `dbot` : Deep depth in m.
+ 182    - `dinterval` : Vertical grid size in m. Defaults to 5m.
+ 183
+ 184    Values for `dbot` and `dtop` are generated if not provided.
+ 185
+ 186    **Editing parameters**
+ 187    Provide editing parameters via `editparams`.
+ 188    - `max_e`=0.2,  # absolute max e
+ 189    - `max_e_deviation`=2,  # max in terms of sigma
+ 190    - `min_correlation`=64,  # 64 is RDI default
+ 191    - `maskbins` : Array with booleans indexing into the ADCP bins. Use the
+ 192      convenience method `generate_binmask`.
+ 193    - `pg_limit` : float or int or None.
+ 194            Percent good limit applied prior to interpolating to the universal
+ 195            depth grid in `burst_average_ensembles`.
+ 196
+ 197    """
+ 198
+ 199    # Default editing parameters.
+ 200    _editparams = dict(
+ 201        max_e=0.2,  # absolute max e
+ 202        max_e_deviation=2,  # max in terms of sigma
+ 203        min_correlation=64,  # 64 is RDI default
+ 204        maskbins=None,  # do not mask any bins
+ 205        pg_limit=50,  # percent good limit applied in `burst_average_ensembles`
+ 206    )
+ 207
+ 208    def __init__(
+ 209        self,
+ 210        raw_data,
+ 211        meta_data,
+ 212        driftparams=None,
+ 213        tgridparams=None,
+ 214        dgridparams=None,
+ 215        editparams=None,
+ 216        ibad=None,
+ 217        logdir="log",
+ 218        verbose=False,
+ 219        plot=False,
+ 220        pressure_scale_factor=1,
+ 221        magdec=None,
+ 222        pressure=None,
+ 223    ):
+ 224        self.meta_data = Bunch(meta_data.copy())
+ 225        self.ibad = ibad
+ 226        self.logdir = logdir
+ 227        self.verbose = verbose
+ 228
+ 229        self._magdec_provided = magdec
+ 230        self._magdec = magdec
+ 231
+ 232        self._pressure_provided = pressure
+ 233        self._pressure_scale_factor = pressure_scale_factor
+ 234
+ 235        self._raw = None
+ 236        self._default_dgridparams = None
+ 237
+ 238        self.parse_file_locations(raw_data)
+ 239        self._initiate_data_reader()
+ 240        self._read_auxiliary_data()
+ 241        self._parse_meta_data()
+ 242
+ 243        self._set_up_logger()
+ 244
+ 245        self.parse_driftparams(driftparams)
+ 246        self._parse_sysconfig()
+ 247        self.parse_dgridparams(dgridparams)
+ 248        self.parse_tgridparams(tgridparams)
+ 249        self.parse_editparams(editparams)
+ 250
+ 251        self.make_start_ddays()
+ 252
+ 253        if plot:
+ 254            self.plot_pressure()
+ 255
+ 256    def parse_file_locations(self, raw_data, min_file_size=1e4):
+ 257        """Parse input for raw data files.
+ 258
+ 259        Input can either be a single file name as a str, a single file as a
+ 260        Path instance, a list of either of these, or a Path instance pointing to a
+ 261        directory with raw ADCP files. In the latter case, files that are
+ 262        smaller than a threshold will not be included in the processing.
+ 263
+ 264        Outputs to attribute `files`. The output can be fed to Multiread instances.
+ 265
+ 266        Parameters
+ 267        ----------
+ 268        raw_data : str or list or Path
+ 269            Location(s) of raw data.
+ 270        min_file_size : int
+ 271            Minimum size for file to be included. Defaults to 1e4 which
+ 272            corresponds to about 10kB and is a good value for excluding small
+ 273            files without any actual data.
+ 274
+ 275        """
+ 276
+ 277        def list_dir(dir, min_file_size):
+ 278            # List all raw files.
+ 279            all_raw_files = list(sorted(dir.glob("*.00*")))
+ 280            # only files larger than about 10kB
+ 281            files = [
+ 282                file.as_posix()
+ 283                for file in all_raw_files
+ 284                if file.stat().st_size > min_file_size
+ 285            ]
+ 286            return files
+ 287
+ 288        input_type = type(raw_data)
+ 289        if input_type is list:
+ 290            if type(raw_data[0]) is str:
+ 291                self.files = raw_data
+ 292            elif type(raw_data[0]) is pathlib.PosixPath:
+ 293                self.files = [file.as_posix() for file in raw_data]
+ 294        elif input_type is str:
+ 295            if Path(raw_data).is_dir():
+ 296                self.files = list_dir(Path(raw_data), min_file_size)
+ 297            else:
+ 298                self.files = [raw_data]
+ 299        elif input_type is pathlib.PosixPath:
+ 300            if raw_data.is_dir():
+ 301                self.files = list_dir(raw_data, min_file_size)
+ 302            else:
+ 303                self.files = [raw_data.as_posix()]
+ 304
+ 305    def _initiate_data_reader(self):
+ 306        """Initiate a Multiread data reader.
+ 307
+ 308        Adds attribute `m`.
+ 309
+ 310        """
+ 311        self.m = Multiread(self.files, sonar="wh", ibad=self.ibad)
+ 312        # Make some more meta data realily available by reading a single ping
+ 313        # from the raw data.
+ 314        ping = self.m.read(start=0, stop=1)
+ 315        self.meta_data.Bin1Dist = ping.FL.Bin1Dist / 100.0
+ 316        self.meta_data.NCells = ping.FL.NCells
+ 317        self.meta_data.CellSize = ping.FL.CellSize / 100.0
+ 318
+ 319    def _generate_external_pressure_interpolator(self, dat):
+ 320        """Interpolate external pressure to pycurrents time vector.
+ 321
+ 322        Parameters
+ 323        ----------
+ 324        dat : pycurrents.adcp.rdiraw.Bunch
+ 325            Data structure.
+ 326
+ 327        Returns
+ 328        -------
+ 329        Interpolator
+ 330
+ 331        """
+ 332
+ 333        # We already have a function to convert the pycurrents time to
+ 334        # datetime64. Interpolate in this time domain.
+ 335        time = io.yday0_to_datetime64(dat.yearbase, dat.dday)
+ 336        p_interpolated = self._pressure_provided.interp(time=time).data
+ 337
+ 338        # Beginning and end may have NaN's if the ADCP was started before
+ 339        # the external pressure sensor. Make sure this happens only when
+ 340        # outside the water and then replace with atmospheric pressure.
+ 341        if np.any(np.isnan(p_interpolated)):
+ 342            nan_mask = np.isnan(p_interpolated)
+ 343            i_nan = np.flatnonzero(nan_mask)
+ 344
+ 345            first_few_good_median = np.median(p_interpolated[~nan_mask][:20])
+ 346            last_few_good_median = np.median(p_interpolated[~nan_mask][-20:])
+ 347
+ 348        if np.isnan(p_interpolated[0]):
+ 349            if first_few_good_median < 1:
+ 350                i_divide = np.flatnonzero(np.diff(i_nan) - 1) + 1
+ 351                if i_divide.size == 0:
+ 352                    p_interpolated[nan_mask] = first_few_good_median
+ 353                else:
+ 354                    p_interpolated[0:i_divide] = first_few_good_median
+ 355
+ 356        if np.isnan(p_interpolated[-1]):
+ 357            if last_few_good_median < 1:
+ 358                i_divide = np.flatnonzero(np.diff(i_nan) - 1) + 1
+ 359                if i_divide.size == 0:
+ 360                    p_interpolated[nan_mask] = last_few_good_median
+ 361                else:
+ 362                    p_interpolated[i_divide:] = last_few_good_median
+ 363
+ 364        # Now generate an interpolation function that will take dday as input
+ 365        # for later per-ensemble interpolation.
+ 366        self._external_pressure_interpolator = sp.interpolate.interp1d(
+ 367            dat.dday,
+ 368            p_interpolated,
+ 369            bounds_error=False,
+ 370            fill_value="extrapolate",
+ 371        )
+ 372
+ 373    def _external_pressure_to_dat(self, dat):
+ 374        """Interpolate external pressure to pycurrents time vector.
+ 375
+ 376        Parameters
+ 377        ----------
+ 378        dat : pycurrents.adcp.rdiraw.Bunch
+ 379            Data structure.
+ 380
+ 381        Returns
+ 382        -------
+ 383        array-like
+ 384            Pressure
+ 385
+ 386        """
+ 387        return self._external_pressure_interpolator(dat.dday)
+ 388
+ 389    def _scale_pycurrents_pressure(self, dat):
+ 390        # Initial pressure units: 10 Pa (about 1 mm or 0.001 decibar).
+ 391        # Converting to decibars.
+ 392        return dat.VL["Pressure"] / 1000.0 * self._pressure_scale_factor
+ 393
+ 394    def _read_auxiliary_data(self):
+ 395        """Read auxiliary data.
+ 396
+ 397        Adds attribute `tsdat`.
+ 398
+ 399        """
+ 400        tsdat = self.m.read(varlist=["VariableLeader"])
+ 401        tsdat.temperature = tsdat.VL["Temperature"] / 100.0
+ 402        # Replace pressure if provided from external sensor
+ 403        if self._pressure_provided is not None:
+ 404            self._generate_external_pressure_interpolator(tsdat)
+ 405            tsdat.pressure = self._external_pressure_to_dat(tsdat)
+ 406        else:
+ 407            tsdat.pressure = self._scale_pycurrents_pressure(tsdat)
+ 408        self.tsdat = tsdat
+ 409
+ 410    def _parse_meta_data(self):
+ 411        """Parse meta data.
+ 412
+ 413        - Add essential meta data to attributes. Will throw a KeyError if no
+ 414          lon/lat provided.
+ 415
+ 416        - Read serial number from raw data and complain if it does not match
+ 417          the meta data SN.
+ 418        """
+ 419        essential_meta_data = ["lon", "lat"]
+ 420
+ 421        [
+ 422            self._safely_add_attribute_from_params(k, self.meta_data)
+ 423            for k in essential_meta_data
+ 424        ]
+ 425
+ 426        # Check SN
+ 427        sn_internal = int.from_bytes(self.tsdat.FL.Inst_SN, "little")
+ 428
+ 429        if "sn" not in self.meta_data:
+ 430            self.meta_data.sn = sn_internal
+ 431
+ 432        # Check internal SN matches user set one
+ 433        if sn_internal != self.meta_data.sn:
+ 434            warn(
+ 435                f"Serial number in file, {sn_internal}, is different from that set by user, {self.meta_data.sn}. Keeping user value."
+ 436            )
+ 437
+ 438    @property
+ 439    def default_dgridparams(self):
+ 440        """Determine default depth gridding parameters.
+ 441
+ 442        The grid is centered on the  median depth of the ADCP (plus distance to
+ 443        the center of the first bin) to avoid unnecessary binning into
+ 444        neighboring depth cells. The default size of the depth bins mimicks the
+ 445        size of ADCP bins.
+ 446        """
+ 447        if self._default_dgridparams is None:
+ 448            # Only use pressure at depth, not on deck
+ 449            ii = np.flatnonzero(self.tsdat.pressure > 15)
+ 450            p = self.tsdat.pressure[ii]
+ 451            # Determine limits of the pressure distribution but leave out the
+ 452            # top 5 and bottom 2 percent of data points. This way we are hoping
+ 453            # to avoid any outliers and a possible pressure record of ascent
+ 454            # and/or descent.
+ 455            p_top, p_bot = np.round(
+ 456                seawater.depth2(np.percentile(p, [5, 98]), self.lat)
+ 457            )
+ 458            self.p_median = np.median(p)
+ 459            pdep_median = np.round(seawater.depth2(self.p_median, self.lat))
+ 460            n = self.meta_data.NCells + 2
+ 461            d_interval = self.meta_data.CellSize
+ 462            distance_to_first_bin = np.round(self.meta_data.Bin1Dist)
+ 463            distance_to_last_bin = distance_to_first_bin + n * d_interval
+ 464
+ 465            if self.sysconfig["up"]:
+ 466                # Set minimum grid depth level. Anything shallower than 10m
+ 467                # will be garbage anyways so let's throw this out.
+ 468                dtop = p_top - distance_to_last_bin
+ 469                if dtop < 10:
+ 470                    dtop = 10
+ 471                dbot = pdep_median - distance_to_first_bin
+ 472                # Successively add bins until we reach maximum pressure. This
+ 473                # will take care of mooring knockdowns.
+ 474                while dbot < p_bot:
+ 475                    dbot += d_interval
+ 476            else:
+ 477                dtop = pdep_median + distance_to_first_bin
+ 478                while dtop > p_top:
+ 479                    dtop -= d_interval
+ 480                dbot = p_bot + distance_to_last_bin
+ 481
+ 482            self._default_dgridparams = dict(
+ 483                dtop=dtop,
+ 484                dbot=dbot,
+ 485                d_interval=d_interval,
+ 486            )
+ 487
+ 488        return self._default_dgridparams
+ 489
+ 490    def parse_dgridparams(self, dgridparams):
+ 491        """Parse depth gridding parameters.
+ 492
+ 493        See top level class notes for more info.
+ 494
+ 495        Parameters
+ 496        ----------
+ 497        dgridparams : dict
+ 498
+ 499        """
+ 500        self.dgridparams = Bunch(self.default_dgridparams)
+ 501        if dgridparams is not None:
+ 502            self.dgridparams.update_values(dgridparams, strict=True)
+ 503        else:
+ 504            logger.warning(
+ 505                "No depth gridding parameters provided, using default values."
+ 506            )
+ 507        # Default depth grid parameters are based on the median pressure to
+ 508        # avoid binning into neighboring grid cells as much as possible.
+ 509        # Therefore, we start assembling the depth grid from the bottom up for
+ 510        # an uplooker and from the top down for a downlooker.
+ 511        if self.orientation == "up":
+ 512            self.dgrid = np.arange(
+ 513                self.dgridparams.dbot,
+ 514                self.dgridparams.dtop,
+ 515                -self.dgridparams.d_interval,
+ 516                dtype=float,
+ 517            )
+ 518        elif self.orientation == "down":
+ 519            self.dgrid = np.arange(
+ 520                self.dgridparams.dtop,
+ 521                self.dgridparams.dbot,
+ 522                self.dgridparams.d_interval,
+ 523                dtype=float,
+ 524            )
+ 525
+ 526    def parse_tgridparams(self, tgridparams):
+ 527        """Parse time gridding parameters.
+ 528
+ 529        See top level class notes for more info.
+ 530
+ 531        Parameters
+ 532        ----------
+ 533        tgridparams : dict
+ 534
+ 535        """
+ 536        # Find time at depth to determine default time grid parameters.
+ 537        # Differentiate between time series only in the water and time series
+ 538        # including the overshoot on mooring deployment.
+ 539        p = self.tsdat.pressure
+ 540        if ~np.any(p < 10):
+ 541            t0 = self.dday[0]
+ 542            t1 = self.dday[-1]
+ 543        else:
+ 544            at_depth = np.nonzero(p > self.p_median)[0][0]
+ 545            t0 = self.dday[at_depth]
+ 546            in_water = np.nonzero(p > self.p_median / 2)[0][-1]
+ 547            t1 = self.dday[in_water]
+ 548
+ 549        # Generate a set of default time gridding parameters and then update
+ 550        # from the input parameters provided.
+ 551        default_tgridparams = dict(dt_hours=0.5, t0=t0, t1=t1, burst_average=False)
+ 552        self.tgridparams = Bunch(default_tgridparams)
+ 553        if tgridparams is not None:
+ 554            self.tgridparams.update_values(tgridparams, strict=True)
+ 555        else:
+ 556            logger.warning(
+ 557                "No time gridding parameters provided, using default values."
+ 558            )
+ 559
+ 560    def parse_editparams(self, editparams):
+ 561        """Parse editing parameters.
+ 562
+ 563        See top level class notes for more info.
+ 564
+ 565        Parameters
+ 566        ----------
+ 567        editparams : dict
+ 568
+ 569        """
+ 570        self.editparams = Bunch(self._editparams)
+ 571        if editparams is not None:
+ 572            self.editparams.update_values(editparams, strict=True)
+ 573        else:
+ 574            logger.warning("No edit parameters provided, using default values.")
+ 575
+ 576    def parse_driftparams(self, driftparams):
+ 577        """Parse time drift parameters.
+ 578
+ 579        See top level class notes for more info.
+ 580
+ 581        Parameters
+ 582        ----------
+ 583        driftparams : dict
+ 584
+ 585        """
+ 586        driftparams = dict() if driftparams is None else driftparams
+ 587        self.driftparams = driftparams
+ 588        self.yearbase = self.m.yearbase
+ 589        t0 = self.tsdat.dday[0]
+ 590        self.t0 = t0
+ 591        t1_adcp = driftparams.get("end_adcp", None)
+ 592        if t1_adcp is not None:
+ 593            t1_pc = to_day(self.m.yearbase, *driftparams["end_pc"])
+ 594            t1_adcp = to_day(self.m.yearbase, *driftparams["end_adcp"])
+ 595            self.time_drift_rate = (t1_pc - t0) / (t1_adcp - t0)
+ 596        else:
+ 597            logger.warning(
+ 598                "No time drift parameters provided, not applying any clock correction."
+ 599            )
+ 600            self.time_drift_rate = 1
+ 601
+ 602        self.dday = self._correct_dday(self.tsdat.dday)
+ 603
+ 604    def _correct_dday(self, dday_orig):
+ 605        """Apply linear correction for clock drift.
+ 606
+ 607        Parameters
+ 608        ----------
+ 609        dday_orig : array-like
+ 610            Origial time vector.
+ 611
+ 612        Returns
+ 613        -------
+ 614        array-like
+ 615            Corrected time vector
+ 616
+ 617        """
+ 618
+ 619        return self.t0 + self.time_drift_rate * (dday_orig - self.t0)
+ 620
+ 621    def _parse_sysconfig(self):
+ 622        # We have to get the up/down reading from sysconfig for a time when the
+ 623        # instrument was in the water. Look at pressure and determine ensembles
+ 624        # during time at depth.
+ 625        ii = np.flatnonzero(self.tsdat.pressure > 15)
+ 626        depth_ii = (ii[0] + ii[-1]) // 2
+ 627        try:
+ 628            self.tsdat.pressure[depth_ii] > 15
+ 629        except ValueError:
+ 630            print("could not determine ensemble index at depth for reading sysconfig")
+ 631        at_depth = self.m.read(
+ 632            varlist=["VariableLeader"], start=depth_ii, stop=depth_ii + 1
+ 633        )
+ 634        self.orientation = "up" if at_depth.sysconfig.up else "down"
+ 635        self.sysconfig = at_depth.sysconfig
+ 636
+ 637    def make_start_ddays(self):
+ 638        """Generate time stamps for ping averaging.
+ 639
+ 640        Notes
+ 641        -----
+ 642        If turning on burst averaging, other input values will be ignored and
+ 643        the averaging interval will be determined from the burst sampling
+ 644        scheme apparent in the ping pattern.
+ 645
+ 646        """
+ 647        dday_start = self.tgridparams.t0
+ 648        dday_end = self.tgridparams.t1
+ 649        dt_hours = self.tgridparams.dt_hours
+ 650        is_burst_average = self.tgridparams.burst_average
+ 651
+ 652        # Save whether we are averaging over bursts or not.
+ 653        self.is_burst_average = is_burst_average
+ 654        # Generate time stamps and stuff.
+ 655        if not is_burst_average:
+ 656            print("no burst average")
+ 657            self.dday_start = dday_start
+ 658            self.dday_end = dday_end
+ 659            self.dt = dt_hours / 24.0
+ 660            self.start_ddays = np.arange(dday_start, dday_end, dt_hours / 24.0)
+ 661            # Time stamps for the averages. Midpoints of averaging intervals.
+ 662            self.dday_mid = self.start_ddays + self.dt / 2
+ 663        else:
+ 664            dday_diff = np.diff(self.dday)
+ 665            # Determine ping interval within burst and time between bursts.
+ 666            burst_dt = np.median(dday_diff)
+ 667            print(f"time between pings within burst: {burst_dt * 24 * 60 * 60:1.1f} s")
+ 668            # It seems safe to assume that the time between bursts is at least
+ 669            # four times as long as the time between individual pings within a
+ 670            # burst.
+ 671            inter_burst_dt = np.median(dday_diff[dday_diff > burst_dt * 4])
+ 672            print(f"time between bursts: {inter_burst_dt * 24 * 60:1.1f} min")
+ 673            # Find starting points of all bursts.
+ 674            start_indices = np.flatnonzero(dday_diff > burst_dt * 4)
+ 675            # Increase index so we are at the end of the larger time differences.
+ 676            start_indices += 1
+ 677            # Include the very beginning.
+ 678            start_indices = np.insert(start_indices, 0, 0)
+ 679            self.start_ddays = self.dday[start_indices]
+ 680            self.dday_start = self.start_ddays[0]
+ 681            # Generate a dt that is inclusive of one burst.  We know the number
+ 682            # of pings in a burst from the difference between the
+ 683            # start_indices. Let's go a bit beyond the time needed (3 more ping
+ 684            # intervals chosen here).
+ 685            pings_per_burst = np.int32(np.median(np.diff(start_indices)))
+ 686            print(f"{pings_per_burst} pings per burst")
+ 687            print(f"{start_indices.shape[0]} bursts total")
+ 688            self.dt = burst_dt * pings_per_burst + burst_dt * 3
+ 689
+ 690            self.dday_start = self.start_ddays[0]
+ 691            self.dday_end = dday_end
+ 692
+ 693            # Time stamps in the middle of the burst
+ 694            self.dday_mid = self.start_ddays + pings_per_burst * burst_dt / 2
+ 695
+ 696    def read_ensemble(self, iens):
+ 697        """Read ensembles (several individual pings grouped together).
+ 698
+ 699        Parameters
+ 700        ----------
+ 701        iens : int
+ 702            Index into ensemble start times (they are generated in
+ 703            :meth:`make_start_ddays`).
+ 704
+ 705        Returns
+ 706        -------
+ 707        dat : pycurrents.adcp.rdiraw.Bunch
+ 708            Dictionary with data.
+ 709
+ 710        Raises
+ 711        ------
+ 712        ValueError
+ 713            If `iens` is too large to index into `start_ddays`.
+ 714
+ 715        """
+ 716
+ 717        if iens > len(self.start_ddays) - 1:
+ 718            raise ValueError("ens num %d is out of range" % iens)
+ 719
+ 720        # Get indices within the interval.
+ 721        sl = rangeslice(
+ 722            self.dday, self.start_ddays[iens], self.start_ddays[iens] + self.dt
+ 723        )
+ 724        # Use the indices to extract data.
+ 725        dat = self.m.read(start=sl.start, stop=sl.stop)
+ 726        if dat is None:
+ 727            return None
+ 728        dat.dday_orig = dat.dday
+ 729        dat.dday = self._correct_dday(dat.dday_orig)
+ 730        if self._pressure_provided is not None:
+ 731            # Replace pressure if provided
+ 732            dat.pressure = self._external_pressure_to_dat(dat)
+ 733        else:
+ 734            dat.pressure = self._scale_pycurrents_pressure(dat)
+ 735        sign = -1 if self.orientation == "up" else 1
+ 736        pdepth = seawater.depth2(dat.pressure, self.lat)
+ 737        dat.depth = pdepth[:, np.newaxis] + sign * dat.dep
+ 738        return dat
+ 739
+ 740    @property
+ 741    def magdec(self):
+ 742        """Magnetic declination.
+ 743
+ 744        If not provided as input argument magdec is calculated using
+ 745        [magdec](https://currents.soest.hawaii.edu/hgstage/geomag/file/tip)
+ 746        (must be installed) based on `lon` and `lat`.
+ 747
+ 748        """
+ 749        if self._magdec is None:
+ 750            if self.lat is None:
+ 751                logger.warning(
+ 752                    "No lon/lat provided, cannot calculate magnetic declination."
+ 753                )
+ 754                self._magdec = 0
+ 755            else:
+ 756                # Look for magdec executable
+ 757                magdec_found = True
+ 758                magdec_path = which("magdec")
+ 759
+ 760                if magdec_path is None:
+ 761                    magdec_found = False
+ 762                    package_dir = os.path.dirname(__file__)
+ 763
+ 764                if not magdec_found:
+ 765                    # Try this package directory
+ 766                    magdec_path = os.path.join(package_dir, "magdec")
+ 767                    magdec_found = os.path.isfile(magdec_path)
+ 768
+ 769                if not magdec_found:
+ 770                    # Try the magdec installation directory
+ 771                    magdec_path = os.path.abspath(
+ 772                        os.path.join(package_dir, "../geomag/magdec")
+ 773                    )
+ 774                    magdec_found = os.path.isfile(magdec_path)
+ 775
+ 776                if not magdec_found:
+ 777                    raise FileNotFoundError(
+ 778                        "Cannot find program magdec on the system path or paths within velosearaptor."
+ 779                    )
+ 780
+ 781                logger.info(f"magdec found at {magdec_path}")
+ 782
+ 783                n = len(self.start_ddays)
+ 784                dday_mid = self.start_ddays[n // 2]
+ 785                y, m, d = to_date(self.yearbase, dday_mid)[:3]
+ 786
+ 787                output = Popen(
+ 788                    [
+ 789                        magdec_path,
+ 790                        str(self.lon),
+ 791                        str(self.lat),
+ 792                        str(y),
+ 793                        str(m),
+ 794                        str(d),
+ 795                    ],
+ 796                    stdout=PIPE,
+ 797                ).communicate()[0]
+ 798                output = output.strip()
+ 799                logger.info("magdec output is: %s", output)
+ 800                self._magdec = float(output.split()[0])
+ 801        elif self._magdec_provided is not None:
+ 802            logger.info(f"magdec {self._magdec_provided} provided.")
+ 803        return self._magdec
+ 804
+ 805    @property
+ 806    def raw(self):
+ 807        """Raw ADCP data."""
+ 808        if self._raw is None:
+ 809            print("Reading raw data...")
+ 810            self._raw = io.read_raw_rdi(self.files)
+ 811            self._raw.coords["bin"] = (("z"), np.arange(self._raw.z.size))
+ 812        return self._raw
+ 813
+ 814    def _edit(self, ens):
+ 815        """Apply editing to xyze."""
+ 816        ep = self.editparams
+ 817        cond = (ens.cor < ep.min_correlation).any(axis=-1)
+ 818        ens.xyze[cond] = np.ma.masked
+ 819        e = ens.xyze[:, :, 3]
+ 820        max_e = min(ep.max_e, e.std() * ep.max_e_deviation)
+ 821        ens.max_e_applied = max_e
+ 822        cond = np.abs(e) > max_e
+ 823        ens.xyze[cond] = np.ma.masked
+ 824        if ep.maskbins is not None:
+ 825            ens.xyze[:, ep.maskbins, :] = np.ma.masked
+ 826
+ 827    def _to_enu(self, ens):
+ 828        """
+ 829        add enu
+ 830        GV: enu is east, north, up, errvel (optional) whereas xyz are
+ 831        instrument coordinates.
+ 832        """
+ 833        ens.enu = rdi_xyz_enu(
+ 834            ens.xyze,
+ 835            ens.heading + self.magdec,
+ 836            ens.pitch,
+ 837            ens.roll,
+ 838            orientation=self.orientation,
+ 839        )
+ 840
+ 841    def _burst_average_depth(self, ens):
+ 842        """Depth-average within a burst.
+ 843
+ 844        Average the depth vectors if doing burst-averages. Otherwise we just
+ 845        return all depth vectors of this ensemble.
+ 846
+ 847        Parameters
+ 848        ----------
+ 849        ens : Bunch
+ 850            Ensemble data.
+ 851
+ 852        Returns
+ 853        -------
+ 854        depth : array-like
+ 855            Depth vector for each ping.
+ 856
+ 857        """
+ 858        if self.is_burst_average:
+ 859            depth_mean = ens.depth.mean(axis=0)
+ 860            depth = np.tile(depth_mean, (ens.dday.size, 1))
+ 861        else:
+ 862            depth = ens.depth
+ 863        return depth
+ 864
+ 865    def _regrid_enu(self, ens, method="linear"):
+ 866        """Depth-grid enu velocities."""
+ 867        shape = (ens.dday.size, self.dgrid.size, ens.enu.shape[-1])
+ 868        enu_grid = np.ma.zeros(shape)
+ 869        enu_grid[:] = np.ma.masked
+ 870        # Average the depth vectors if doing burst-averages. Otherwise we just
+ 871        # return all depth vectors of this ensemble.
+ 872        # TO DO: If calculating averages over regular time intervals, we need
+ 873        # to low pass filter the pressure time series prior to creating the
+ 874        # depth vectors.
+ 875        depth = self._burst_average_depth(ens)
+ 876        for i in range(ens.dday.size):
+ 877            enu_grid[i] = interp1(
+ 878                depth[i], ens.enu[i], self.dgrid, axis=0, method=method
+ 879            )
+ 880        ens.enu_grid = enu_grid
+ 881
+ 882    def _regrid_amp(self, ens, method="linear"):
+ 883        """Depth-grid amplitudes (averaged over all 4 beams)."""
+ 884        shape = (ens.dday.size, self.dgrid.size)
+ 885        amp_grid = np.ma.zeros(shape)
+ 886        amp_grid[:] = np.ma.masked
+ 887        depth = self._burst_average_depth(ens)
+ 888        for i in range(ens.dday.size):
+ 889            amp_grid[i] = interp1(
+ 890                depth[i],
+ 891                ens.amp[i].mean(axis=-1),
+ 892                self.dgrid,
+ 893                axis=0,
+ 894                method=method,
+ 895            )
+ 896        ens.amp_grid = amp_grid
+ 897
+ 898    def _binmap_one_beam(self, ens, beam_number):
+ 899        """Binmap single ping data for a single beam by linear interpolation.
+ 900
+ 901        Mapping is applied to velocity, amplitude and correlation.
+ 902
+ 903        Currently only works for 4 beam ADCP.
+ 904
+ 905        Parameters
+ 906        ----------
+ 907        ens : Bunch
+ 908            An ADCP dataset read by Multiread.
+ 909        beam_number : int
+ 910            An integer from 1 to 4 representing the beam number.
+ 911
+ 912        Returns
+ 913        -------
+ 914        veli : ndarray
+ 915            Mapped velocity.
+ 916        ampi : ndarray
+ 917            Mapped amplitude.
+ 918        cori : ndarray
+ 919            Mapped correlation.
+ 920
+ 921        """
+ 922
+ 923        if beam_number not in [1, 2, 3, 4]:
+ 924            raise ValueError("Beam number must be 1, 2, 3 or 4.")
+ 925
+ 926        tba = np.tan(np.deg2rad(ens.sysconfig.angle))  # Tangent of beam angle
+ 927        pitch = np.deg2rad(ens.pitch)
+ 928        roll = np.deg2rad(ens.roll)
+ 929
+ 930        # The true bin distances
+ 931        if beam_number == 1:
+ 932            dep = (
+ 933                ens.dep[None, :]
+ 934                * ((np.cos(roll) - tba * np.sin(roll)) * np.cos(pitch))[:, None]
+ 935            )  # None adds a new axis.
+ 936        elif beam_number == 2:
+ 937            dep = (
+ 938                ens.dep[None, :]
+ 939                * ((np.cos(roll) + tba * np.sin(roll)) * np.cos(pitch))[:, None]
+ 940            )
+ 941        elif beam_number == 3:
+ 942            dep = (
+ 943                ens.dep[None, :]
+ 944                * ((np.cos(pitch) + tba * np.sin(pitch)) * np.cos(roll))[:, None]
+ 945            )
+ 946        elif beam_number == 4:
+ 947            dep = (
+ 948                ens.dep[None, :]
+ 949                * ((np.cos(pitch) - tba * np.sin(pitch)) * np.cos(roll))[:, None]
+ 950            )
+ 951
+ 952        vel = ens.vel[..., beam_number - 1]
+ 953        amp = ens.amp[..., beam_number - 1]
+ 954        cor = ens.cor[..., beam_number - 1]
+ 955
+ 956        # Calculate interpolating weights (this hogs RAM!)
+ 957        dz = np.diff(dep, axis=1)
+ 958        w = np.clip((ens.dep - dep[:, :-1, None]) / dz[:, :, None], 0, 1)
+ 959
+ 960        # Determine data above or below the deepest bins
+ 961        above = (w == 1.0).all(axis=1)
+ 962        below = (w == 0.0).all(axis=1)
+ 963        bad = above | below
+ 964
+ 965        # Calculate differences
+ 966        dvel = np.diff(vel, axis=1)
+ 967        damp = np.diff(amp, axis=1)
+ 968        dcor = np.diff(cor, axis=1)
+ 969
+ 970        veli = vel[:, [0]] + np.sum(w * dvel[:, :, None], axis=1)
+ 971        veli[bad] = np.nan
+ 972
+ 973        ampi = amp[:, [0]] + np.sum(w * damp[:, :, None], axis=1)
+ 974        ampi[bad] = np.nan
+ 975
+ 976        cori = cor[:, [0]] + np.sum(w * dcor[:, :, None], axis=1)
+ 977        cori[bad] = np.nan
+ 978
+ 979        return veli, ampi, cori
+ 980
+ 981    def _binmap_all_beams(self, ens):
+ 982        """Binmap single ping data for all beams."""
+ 983
+ 984        for beam_number in [1, 2, 3, 4]:
+ 985            veli, ampi, cori = self._binmap_one_beam(ens, beam_number)
+ 986            ens.vel[..., beam_number - 1] = veli
+ 987            ens.amp[..., beam_number - 1] = ampi
+ 988            ens.cor[..., beam_number - 1] = cori
+ 989
+ 990            ens[f"vel{beam_number}"] = veli
+ 991            ens[f"amp{beam_number}"] = ampi
+ 992            ens[f"cor{beam_number}"] = cori
+ 993
+ 994    def _calculate_xyze(self, ens, ibad=None):
+ 995        """Calculate xyze from along-beam data."""
+ 996        if ens.sysconfig.convex:
+ 997            geom = "convex"
+ 998        else:
+ 999            geom = "concave"
+1000
+1001        trans = Transform(angle=ens.sysconfig.angle, geometry=geom)
+1002
+1003        ens.xyze = trans.beam_to_xyz(ens.vel, ibad=ibad)
+1004
+1005    def process_pings(self, start=None, stop=None, binmap=False, ens_size=50000):
+1006        """Process single ping data without averaging.
+1007
+1008        Adds results as dictionary under `ave` and as `xarray.Dataset` under `ds`.
+1009
+1010        Writes processing parameters to the log file.
+1011
+1012        Parameters
+1013        ----------
+1014        start : int, optional
+1015            Start processing at this ping number.
+1016        stop : int, optional
+1017            Stop processing at this ping number.
+1018        binmap : bool, optional
+1019            Do binmapping of along-beam data.
+1020        ens_size : int, optional
+1021            Pings are processed in ensembles to reduce memory usage.
+1022            This parameter sets how many pings are in an ensemble. The default is 50000.
+1023
+1024        """
+1025        if start is None:
+1026            idx_start = np.searchsorted(self.dday, self.dday_start)
+1027        if stop is None:
+1028            idx_stop = np.searchsorted(self.dday, self.dday_end)
+1029
+1030        ens_idxs = np.hstack((np.arange(idx_start, idx_stop, ens_size), idx_stop))
+1031        write_idxs = ens_idxs - ens_idxs[0]  # Arrays we write to start at index 0
+1032        npings = idx_stop - idx_start
+1033        nens = ens_idxs.size - 1
+1034        ndgrid = self.tsdat.dep.size
+1035
+1036        logger.info("Processing all pings")
+1037        logger.info(f"Binmapping is {binmap}")
+1038
+1039        uvwe = np.ma.zeros((npings, ndgrid, 4), dtype=np.float32)
+1040
+1041        pg = np.zeros((npings, ndgrid), dtype=np.int8)
+1042        amp = np.ma.zeros((npings, ndgrid), dtype=np.float32)
+1043
+1044        # temperature = np.ma.zeros((npings,), dtype=np.float32)
+1045        # pressure = np.ma.zeros((npings,), dtype=np.float32)
+1046
+1047        temperature = self.tsdat.temperature[idx_start:idx_stop]
+1048        pressure = self.tsdat.pressure[idx_start:idx_stop]
+1049
+1050        dday = self.dday[idx_start:idx_stop]
+1051
+1052        # Loop over ensembles
+1053        for i in tqdm(range(nens)):
+1054            ens = self.m.read(start=ens_idxs[i], stop=ens_idxs[i + 1])
+1055            idx0 = write_idxs[i]
+1056            idx1 = write_idxs[i + 1]
+1057
+1058            if ens is not None:
+1059                # I pulled this out of read_ensembles because we need to calculate depth for _ave2nc to work.
+1060                ens.dday_orig = ens.dday
+1061                ens.dday = self._correct_dday(ens.dday_orig)
+1062                if self._pressure_provided is not None:
+1063                    # Replace pressure if provided
+1064                    ens.pressure = self._external_pressure_to_dat(ens)
+1065                else:
+1066                    ens.pressure = self._scale_pycurrents_pressure(ens)
+1067                sign = -1 if self.orientation == "up" else 1
+1068                pdepth = seawater.depth2(ens.pressure, self.lat)
+1069                ens.depth = pdepth[:, np.newaxis] + sign * ens.dep
+1070
+1071                if binmap:
+1072                    self._binmap_all_beams(ens)
+1073                    # Now we have to recalculate xyze with the binmapped data.
+1074                    self._calculate_xyze(ens)
+1075
+1076                self._edit(ens)  # modifies xyze
+1077                self._to_enu(ens)  # transform to earth coords (east, north, up)
+1078
+1079            else:
+1080                uvwe[idx0:idx1] = np.ma.masked
+1081                amp[idx0:idx1] = np.ma.masked
+1082                # pressure[idx0:idx1] = np.ma.masked
+1083                # temperature[idx0:idx1] = np.ma.masked
+1084                continue
+1085
+1086            uvwe[idx0:idx1] = ens.enu
+1087
+1088            # pgi = 100 * ens.enu_grid[..., 0].count(axis=0) // nprofs
+1089            # pg[i] = pgi.astype(np.int8)
+1090            amp[idx0:idx1] = ens.amp.mean(axis=-1)  # Average over beams... why?
+1091
+1092        self.ave = Bunch(
+1093            u=uvwe[..., 0],
+1094            v=uvwe[..., 1],
+1095            w=uvwe[..., 2],
+1096            e=uvwe[..., 3],
+1097            pg=pg,
+1098            amp=amp,
+1099            temperature=temperature,
+1100            pressure=pressure,
+1101            # npings=npings,
+1102            dday=dday,
+1103            yearbase=self.yearbase,
+1104            dep=ens.dep,  # <<<<----- BAD!!! This a fudge because I don't want to calculated a depth vector. We use the depth vector from the last ensemble.
+1105            editparams=self.editparams,
+1106            tgridparams=self.tgridparams,
+1107            # dgridparams=self.dgridparams,
+1108            magdec=self.magdec,
+1109            lon=self.lon,
+1110            lat=self.lon,
+1111        )
+1112
+1113        self._ave2nc()
+1114        self._add_meta_data_to_ds()
+1115        self._log_processing_params()
+1116
+1117    def average_ensembles(self, start=None, stop=None):
+1118        """Time-averaging.
+1119
+1120        Adds results as dictionary under `ave` and as `xarray.Dataset` under `ds`.
+1121
+1122        Writes processing parameters to the log file.
+1123
+1124        Parameters
+1125        ----------
+1126        start : int
+1127            Range start for averaging. Index into start times of averaging
+1128            intervals.
+1129        stop : int
+1130            Range start for averaging. Index into start times of averaging
+1131            intervals.
+1132
+1133        """
+1134
+1135        nens_orig = len(self.start_ddays)
+1136        indices_orig = np.arange(nens_orig)
+1137        indices = indices_orig[start:stop]
+1138        if start is None and stop is None:
+1139            logger.info("Averaging all ensembles")
+1140        else:
+1141            logger.info(f"Averaging ensembles {indices[0]} to {indices[-1]}")
+1142        nens = len(indices)
+1143        ndgrid = len(self.dgrid)
+1144        uvwe = np.ma.zeros((nens, ndgrid, 4), dtype=np.float32)
+1145        uvwe_std = np.ma.zeros((nens, ndgrid, 4), dtype=np.float32)
+1146
+1147        pg = np.zeros((nens, ndgrid), dtype=np.int8)
+1148        amp = np.ma.zeros((nens, ndgrid), dtype=np.float32)
+1149
+1150        temperature = np.ma.zeros((nens,), dtype=np.float32)
+1151        pressure = np.ma.zeros((nens,), dtype=np.float32)
+1152        pressure_std = np.ma.zeros((nens,), dtype=np.float32)
+1153        pressure_max = np.ma.zeros((nens,), dtype=np.float32)
+1154
+1155        npings = np.zeros((nens,), dtype=np.int16)
+1156
+1157        dday = self.dday_mid[start:stop]
+1158
+1159        for i, iens in enumerate(tqdm(indices)):
+1160            ens = self.read_ensemble(iens)
+1161            if ens is not None:
+1162                self._edit(ens)  # modifies xyze
+1163                self._to_enu(ens)  # transform to earth coords (east, north, up)
+1164                self._regrid_enu(ens)
+1165                self._regrid_amp(ens)
+1166
+1167                nprofs = ens.enu_grid.shape[0]
+1168            else:
+1169                nprofs = 0
+1170            npings[i] = nprofs
+1171            if nprofs < 2:
+1172                uvwe[i] = np.ma.masked
+1173                uvwe_std[i] = np.ma.masked
+1174                # (pg is not a masked array)
+1175                amp[i] = np.ma.masked
+1176                pressure[i] = np.ma.masked
+1177                pressure_std[i] = np.ma.masked
+1178                pressure_max[i] = np.ma.masked
+1179                temperature[i] = np.ma.masked
+1180                continue
+1181
+1182            uvwe[i] = ens.enu_grid.mean(axis=0)
+1183            uvwe_std[i] = ens.enu_grid.std(axis=0)
+1184
+1185            pgi = 100 * ens.enu_grid[..., 0].count(axis=0) // nprofs
+1186            pg[i] = pgi.astype(np.int8)
+1187            amp[i] = ens.amp_grid.mean(axis=0)
+1188
+1189            pressure[i] = ens.pressure.mean()
+1190            pressure_std[i] = ens.pressure.std()
+1191            pressure_max[i] = ens.pressure.max()
+1192            temperature[i] = ens.temperature.mean()
+1193
+1194        self.ave = Bunch(
+1195            u=uvwe[..., 0],
+1196            v=uvwe[..., 1],
+1197            w=uvwe[..., 2],
+1198            e=uvwe[..., 3],
+1199            u_std=uvwe_std[..., 0],
+1200            v_std=uvwe_std[..., 1],
+1201            w_std=uvwe_std[..., 2],
+1202            e_std=uvwe_std[..., 3],
+1203            pg=pg,
+1204            amp=amp,
+1205            temperature=temperature,
+1206            pressure=pressure,
+1207            pressure_std=pressure_std,
+1208            pressure_max=pressure_max,
+1209            npings=npings,
+1210            dday=dday,
+1211            yearbase=self.yearbase,
+1212            dep=self.dgrid,
+1213            editparams=self.editparams,
+1214            tgridparams=self.tgridparams,
+1215            dgridparams=self.dgridparams,
+1216            magdec=self.magdec,
+1217            lon=self.lon,
+1218            lat=self.lon,
+1219        )
+1220
+1221        self._ave2nc()
+1222        self._add_meta_data_to_ds()
+1223        self._log_processing_params()
+1224
+1225    def burst_average_ensembles(self, start=None, stop=None, interpolate_bin=None):
+1226        """Time-averaging prior to depth-gridding.
+1227
+1228        Uses pre-defined editing parameters that can be updated with
+1229        `parse_editparams`.
+1230
+1231        Adds results as dictionary under `ave` and as `xarray.Dataset` under `ds`.
+1232
+1233        Writes processing parameters to the log file.
+1234
+1235        Parameters
+1236        ----------
+1237        start : int, optional
+1238            Range start for averaging. Index into start times of averaging
+1239            intervals. Defaults to None (start at beginning).
+1240        stop : int, optional
+1241            Range start for averaging. Index into start times of averaging
+1242            intervals. Defaults to None (start at beginning).
+1243        interpolate_bin : int or None, optional
+1244            Interpolate over a single, previously masked, bin. Defaults to None (no interpolation).
+1245
+1246        """
+1247        pg_condition = self.editparams.pg_limit
+1248        nens_orig = len(self.start_ddays)
+1249        indices_orig = np.arange(nens_orig)
+1250        indices = indices_orig[start:stop]
+1251        if start is None and stop is None:
+1252            logger.info("Averaging all ensembles")
+1253        else:
+1254            logger.info(f"Averaging ensembles {indices[0]} to {indices[-1]}")
+1255        nens = len(indices)
+1256        ndgrid = len(self.dgrid)
+1257        uvwe = np.ma.zeros((nens, ndgrid, 4), dtype=np.float32)
+1258        uvwe_std = np.ma.zeros((nens, ndgrid, 4), dtype=np.float32)
+1259
+1260        pg = np.zeros((nens, ndgrid), dtype=np.int8)
+1261        amp = np.ma.zeros((nens, ndgrid), dtype=np.float32)
+1262
+1263        temperature = np.ma.zeros((nens,), dtype=np.float32)
+1264        pressure = np.ma.zeros((nens,), dtype=np.float32)
+1265        pressure_std = np.ma.zeros((nens,), dtype=np.float32)
+1266        pressure_max = np.ma.zeros((nens,), dtype=np.float32)
+1267
+1268        npings = np.zeros((nens,), dtype=np.int16)
+1269
+1270        dday = self.dday_mid[start:stop]
+1271
+1272        for i, iens in enumerate(tqdm(indices)):
+1273            ens = self.read_ensemble(iens)
+1274            if ens is not None:
+1275                self._edit(ens)  # modifies xyze
+1276                self._to_enu(ens)  # transform to earth coords (east, north, up)
+1277                self._regrid_enu(ens)
+1278                self._regrid_amp(ens)
+1279
+1280                nprofs = ens.enu_grid.shape[0]
+1281            else:
+1282                nprofs = 0
+1283            npings[i] = nprofs
+1284            if nprofs < 2:
+1285                uvwe[i] = np.ma.masked
+1286                uvwe_std[i] = np.ma.masked
+1287                # (pg is not a masked array)
+1288                amp[i] = np.ma.masked
+1289                pressure[i] = np.ma.masked
+1290                pressure_std[i] = np.ma.masked
+1291                pressure_max[i] = np.ma.masked
+1292                temperature[i] = np.ma.masked
+1293                continue
+1294
+1295            # Depth vector for interpolation
+1296            depth = self._burst_average_depth(ens)
+1297            depth = depth[0, :]
+1298
+1299            # Calculate burst-average on instrument-relative depth grid
+1300            uvwe_inst = ens.enu.mean(axis=0)
+1301            uvwe_std_inst = ens.enu.std(axis=0)
+1302
+1303            pgi_inst = 100 * ens.enu[..., 0].count(axis=0) // nprofs
+1304
+1305            if pg_condition is not None:
+1306                pgi_index = pgi_inst < pg_condition
+1307                uvwe_inst[pgi_index, :] = np.ma.masked
+1308                uvwe_std_inst[pgi_index, :] = np.ma.masked
+1309
+1310            if interpolate_bin is not None:
+1311                zi = interpolate_bin
+1312                neighbors = [zi - 2, zi - 1, zi + 1, zi + 2]
+1313                dtmp = depth[neighbors]
+1314                tmp = interp1(
+1315                    dtmp,
+1316                    uvwe_inst[neighbors, :],
+1317                    depth[zi],
+1318                    axis=0,
+1319                    method="linear",
+1320                )
+1321                uvwe_inst[zi, :] = tmp
+1322
+1323            # Interpolate burst-average to universal depth grid.
+1324            uvwe_grid = interp1(depth, uvwe_inst, self.dgrid, axis=0, method="linear")
+1325            uvwe_std_grid = interp1(
+1326                depth, uvwe_std_inst, self.dgrid, axis=0, method="linear"
+1327            )
+1328            uvwe[i] = uvwe_grid
+1329            uvwe_std[i] = uvwe_std_grid
+1330
+1331            # Interpolate pg to universal depth grid. Not overly satisfying but
+1332            # seems like that's what we need to do here.
+1333            pgi_grid = interp1(depth, pgi_inst, self.dgrid, axis=0, method="linear")
+1334            pg[i] = pgi_grid.astype(np.int8)
+1335
+1336            # Not changed to averaging in instrument-relative coordinates first.
+1337            amp[i] = ens.amp_grid.mean(axis=0)
+1338
+1339            pressure[i] = ens.pressure.mean()
+1340            pressure_std[i] = ens.pressure.std()
+1341            pressure_max[i] = ens.pressure.max()
+1342            temperature[i] = ens.temperature.mean()
+1343
+1344        self.ave = Bunch(
+1345            u=uvwe[..., 0],
+1346            v=uvwe[..., 1],
+1347            w=uvwe[..., 2],
+1348            e=uvwe[..., 3],
+1349            u_std=uvwe_std[..., 0],
+1350            v_std=uvwe_std[..., 1],
+1351            w_std=uvwe_std[..., 2],
+1352            e_std=uvwe_std[..., 3],
+1353            pg=pg,
+1354            amp=amp,
+1355            temperature=temperature,
+1356            pressure=pressure,
+1357            pressure_std=pressure_std,
+1358            pressure_max=pressure_max,
+1359            npings=npings,
+1360            dday=dday,
+1361            yearbase=self.yearbase,
+1362            dep=self.dgrid,
+1363            editparams=self.editparams,
+1364            tgridparams=self.tgridparams,
+1365            dgridparams=self.dgridparams,
+1366            magdec=self.magdec,
+1367            lon=self.lon,
+1368            lat=self.lon,
+1369        )
+1370
+1371        self._ave2nc()
+1372        self._add_meta_data_to_ds()
+1373        self._log_processing_params()
+1374
+1375    def _safely_add_attribute_from_params(self, key, d):
+1376        """Add attribute from dictionary and throw an exception if the key is missing.
+1377
+1378        Parameters
+1379        ----------
+1380        key : str
+1381        d : dict
+1382        """
+1383        try:
+1384            setattr(self, key, d[key])
+1385        except KeyError as error:
+1386            print(f"{error} is missing in input parameters")
+1387            raise
+1388
+1389    def _set_up_logger(self):
+1390        """Set up logging to both a file and to screen.
+1391
+1392        Default for screen logging is to show only warnings unless `verbose` is
+1393        set to True.
+1394
+1395        """
+1396
+1397        # Parse metadata for naming the log.
+1398        if self.meta_data is not None:
+1399            if "sn" in self.meta_data and "mooring" in self.meta_data:
+1400                sn = self.meta_data["sn"]
+1401                mooring = self.meta_data["mooring"]
+1402                has_mooring_id = True
+1403            else:
+1404                sn = None
+1405                mooring = None
+1406                has_mooring_id = False
+1407        else:
+1408            has_mooring_id = False
+1409
+1410        # Set up a logger that will collect log info from this module and the
+1411        # other pycurrent methods as well.
+1412        logdir = Path(self.logdir)
+1413        logdir.mkdir(exist_ok=True)
+1414        if has_mooring_id:
+1415            filename = f"{mooring}_{sn}.log"
+1416        else:
+1417            filename = "adcp_proc.log"
+1418        # Delete any existing handlers. This may be bad style, but I kept adding handlers when developing this.
+1419        logger.handlers = []
+1420        logging.basicConfig(
+1421            filename=logdir.joinpath(filename),
+1422            filemode="w",
+1423            format="%(asctime)s %(name)s %(levelname)s %(message)s",
+1424            datefmt="%H:%M:%S",
+1425            level=logging.INFO,
+1426            force=True,
+1427        )
+1428        ConsoleOutputHandler = logging.StreamHandler()
+1429        ConsoleOutputHandler.setLevel(logging.WARNING)
+1430        if self.verbose:
+1431            ConsoleOutputHandler.setLevel(logging.INFO)
+1432        logger.addHandler(ConsoleOutputHandler)
+1433
+1434        # current date
+1435        datestr = np.datetime64(datetime.datetime.now()).astype(datetime.datetime)
+1436        strformat = "%Y-%m-%d"
+1437        datestr = datestr.strftime(strformat)
+1438
+1439        if has_mooring_id:
+1440            logger.info(f"Processing {mooring} SN {sn} on {datestr}")
+1441        else:
+1442            logger.warning(
+1443                "No meta data provided, logging to generic filename 'adcp_proc.log'"
+1444            )
+1445            logger.info(f"Processing on {datestr}")
+1446
+1447    def _log_processing_params(self):
+1448        """Write processing parameters to log file."""
+1449
+1450        logger.info("processing settings")
+1451        logger.info("-------------------")
+1452        self._log_params(self.dgridparams)
+1453        self._log_params(self.tgridparams)
+1454        self._log_params(self.editparams)
+1455        logger.info("-------------------")
+1456
+1457    def _log_params(self, pd):
+1458        """Print ADCP processing parameter dict to logs.
+1459
+1460        Parameters
+1461        ----------
+1462        pd : dict
+1463            Parameter dict.
+1464        """
+1465
+1466        for k, v in pd.items():
+1467            if k == "maskbins" and v is not None:
+1468                logstr = (k, ":", np.flatnonzero(v))
+1469                logger.info(logstr)
+1470            else:
+1471                logstr = (k, ":", v)
+1472                logger.info(logstr)
+1473
+1474    def _ave2nc(self):
+1475        """Convert data structure from ave to xarray.Dataset format."""
+1476        # load npz file
+1477        dat = self.ave.copy()
+1478        dat = Bunch(dat)
+1479        # identify variables
+1480        k = dat.keys()
+1481        varsint = []
+1482        vars1d = []
+1483        vars2d = []
+1484        for ki in k:
+1485            try:
+1486                tmp = dat[ki].shape
+1487                if len(tmp) == 1:
+1488                    vars1d.append(ki)
+1489                elif len(tmp) == 2:
+1490                    vars2d.append(ki)
+1491            except:
+1492                tmp = None
+1493                varsint.append(ki)
+1494            # print(ki, tmp)
+1495
+1496        # generate time vector
+1497        base = datetime.datetime(dat.yearbase, 1, 1, 0, 0, 0)
+1498        time = [base + datetime.timedelta(days=ti) for ti in dat.dday]
+1499        adcptime = [np.datetime64(ti, "ns") for ti in time]
+1500        # generate Dataset
+1501        out = xr.Dataset(
+1502            {"pg": (["depth", "time"], dat.pg.T)},
+1503            coords={"time": (["time"], adcptime), "depth": (["depth"], dat.dep)},
+1504        )
+1505        for vari in vars2d:
+1506            out[vari] = (["depth", "time"], dat[vari].T)
+1507        for vari in vars1d:
+1508            if vari not in ["dep", "dday"]:
+1509                out[vari] = (["time"], dat[vari])
+1510
+1511        # Percent good is currently defined everywhere. Set to NaN where we
+1512        # don't have any amplitude data (i.e. no data).
+1513        out["pg"] = out.pg.where(~np.isnan(out.amp), other=np.nan)
+1514
+1515        # Drop depth levels with all nan
+1516        out = out.dropna(how="all", dim="depth")
+1517
+1518        # Drop pressure_std, pressure_max, and e_std
+1519        dropvars = ["pressure_std", "pressure_max", "e_std"]
+1520        for var in dropvars:
+1521            if var in out:
+1522                out = out.drop(var)
+1523
+1524        # Change u/v/w std to standard error by dividing by sqrt(npings)
+1525        for var in ["u", "v", "w"]:
+1526            if f"{var}_std" in out:
+1527                out = out.rename({f"{var}_std": f"{var}_error"})
+1528                out[f"{var}_error"] = out[f"{var}_error"] / np.sqrt(out["npings"])
+1529
+1530        # Calculate transducer depth from pressure
+1531        out["xducer_depth"] = -gsw.z_from_p(out.pressure, self.lat)
+1532
+1533        # add variable names and units for plotting
+1534        out = self._add_names_and_units(out)
+1535
+1536        self.ds = out
+1537
+1538    def _add_names_and_units(self, ds):
+1539        """Add variable attributes based on CF conventions.
+1540
+1541        Parameters
+1542        ----------
+1543        ds : xarray.Dataset
+1544
+1545        Returns
+1546        -------
+1547        ds : xarray.Dataset
+1548
+1549        """
+1550        CF = io.cf_conventions()
+1551        for v in ds.variables:
+1552            if v in CF:
+1553                ds[v].attrs = CF[v]
+1554        return ds
+1555
+1556    def _add_meta_data_to_ds(self):
+1557        # Add some more info.
+1558        self.ds.attrs["orientation"] = self.orientation
+1559        self.ds.attrs["magdec"] = self.magdec
+1560        for att in ["max_e", "max_e_deviation", "min_correlation"]:
+1561            self.ds.attrs[att] = self.editparams[att]
+1562
+1563        # Add meta data if provided.
+1564        if self.meta_data is not None:
+1565            for k, v in self.meta_data.items():
+1566                self.ds.attrs[k] = v
+1567        self.ds.attrs["proc time"] = np.datetime64("now").astype("str")
+1568
+1569    def plot_echo_stats(self):
+1570        """Plot beam statistics (correlation and amplitude) from raw ADCP data."""
+1571        r = self.raw
+1572
+1573        fig, ax = plt.subplots(
+1574            nrows=1,
+1575            ncols=2,
+1576            figsize=(5, r.bin.max().data * 0.3),
+1577            constrained_layout=True,
+1578            sharey=True,
+1579        )
+1580        r.cor.mean(dim="time").plot(
+1581            hue="beam", y="bin", marker="o", linestyle="", ax=ax[0]
+1582        )
+1583        r.amp.mean(dim="time").plot(
+1584            hue="beam", y="bin", marker="o", linestyle="", ax=ax[1]
+1585        )
+1586        ax[0].invert_yaxis()
+1587        ax[1].set(ylabel="")
+1588        ax[0].set_yticks(r.bin.data)
+1589        for axi in ax:
+1590            axi.grid(True)
+1591
+1592    def plot_pressure(self):
+1593        """Plot pressure time series and mark time at depth."""
+1594        fig, ax = plt.subplots(
+1595            nrows=1,
+1596            ncols=1,
+1597            figsize=(6, 2.5),
+1598            constrained_layout=True,
+1599        )
+1600        self.raw.pressure.plot(ax=ax, label="all")
+1601        self.raw.pressure.where(self.raw.pressure > 50).plot(ax=ax, label="subsurface")
+1602        ax.invert_yaxis()
+1603        ax.set(xlabel="", ylabel="pressure [dbar]")
+1604        ax.legend()
+1605
+1606    def generate_binmask(self, indices):
+1607        binmask = self.raw.bin.data < 0
+1608        binmask[indices] = True
+1609        return binmask
+
+ + +

Moored ADCP Processing.

+ +

An instance of ProcessADCP is initialized by providing raw data and +processing parameters. Once initialized, the instance method +average_ensembles() can be used to average over just a few or +all pings.

+ +

Magnetic declination is automatically calculated via a call to the command +line tool +magdec that +must be installed. Once calculated, the magnetic declination is stored in +magdec and automatically applied to the data.

+ +

Prior to time averaging, data are edited based on correlation and error +velocity thresholds. The variable pg is calculated based on the number of +excluded pings, i.e. it is the numbur of good pings divided by the number +of total pings within one depth bin and one time bin. It may be used to +further filter the data.

+ +

A pdf document on ADCP data collection and processing principles can be +downloaded from RDI +here.

+ +

Time-averaged data are grouped together in an xarray.Dataset in the +instance attribute ds for easy access and convenient output to netcdf +format.

+ +
Parameters
+ +
    +
  • raw_data (str or list or Path): +Location(s) of raw data.
  • +
  • meta_data (dict): +Dictionary with meta data. At a minimum entries for lon and lat are +needed. If mooring and sn provide mooring name and serial number +then these will be used to name the log file produced during +processing.
  • +
  • driftparams (dict, optional): +Time drift parameters. See notes below.
  • +
  • tgridparams (dict, optional): +Time gridding parameters. See notes below.
  • +
  • dgridparams (dict, optional): +Depth gridding parameters. See notes below.
  • +
  • editparams (dict, optional): +Editing parameters. See notes below.
  • +
  • ibad (int, optional): +Mark beam with bad data (zero based). Defaults to None.
  • +
  • logdir (str, optional): +Log file directory. Defaults to log/.
  • +
  • verbose (bool, optional): +Output more processing info to screen.
  • +
  • magdec (float, optional): +Magnetic declination in degrees.
  • +
  • pressure (xr.DataArray, optional): +Pressure time series in dbar as xr.DataAarray with coordinate time.
  • +
+ +
Attributes
+ +
    +
  • files (list): +List pointing to raw data file(s).
  • +
  • dday_start (float): +Start time of ADCP time series, determined either through t0 in +tgridparams or the start of the time series once at depth.
  • +
  • dday_end (float): +End time of ADCP time series, determined either through t1 in +tgridparams or the end of the time series at depth.
  • +
  • start_ddays (list): +Start times of averaging intervals
  • +
  • dday_mid (float): +Time stamp for ping average as determined in make_start_ddays().
  • +
  • dt (float): +Time that is inclusive of one average. For regular averaging, this is +dt_hours in tgridparams converted to Julian days. For +burst-averagint, this is a time interval that is inclusive of all pings +in one bursts (but goes slightly beyond that into the time between +bursts).
  • +
  • time_drift_rate (float): +Clock drift calculated from driftparams.
  • +
  • orientation (str): +Instrument orientation up or down.
  • +
  • magdec (float): +Magnetic declination.
  • +
  • m (pycurrents.adcp.rdiraw.Multiread): +Multiread instance.
  • +
  • tsdat (Bunch): +Auxiliary data.
  • +
  • raw (xarray.Dataset): +Raw ADCP data.
  • +
  • ds (xarray.Dataset): +Time-averaged dataset added by running average_ensembles().
  • +
+ +
Notes
+ +

Various parameters are passed to the instance through dictionaries. Their +specifics are described below. Gridding and editing parameters can be +updated after creating the ProcessADCP instance via parse_dgridparams, +parse_tgridparams, and parse_editparams.

+ +

Time drift parameters +Provide clock drift parameters via driftparams. Accepted entries are

+ +
    +
  • end_adcp : Time of ADCP at data download
  • +
  • end_pc : UTC time at data download
  • +
+ +

The difference between end_adcp and end_pc is used to linearly correct +for instrument clock drift.

+ +

Time gridding parameters +Provide time gridding parameters via tgridparams. Accepted entries are

+ +
    +
  • dt_hours : Time grid interval. Defaults to 0.5h.
  • +
  • t0 : Start time for gridding. Determined from data if not provided.
  • +
  • t1 : End time for gridding. Determined from data if not provided.
  • +
  • burst_average : bool +Set ensemble averaging to act on burst sampling scheme. Defaults to False.
  • +
+ +

Depth gridding parameters +Provide depth gridding parameters via dgridparams. Accepted entries are

+ +
    +
  • dtop : Shallow depth in m.
  • +
  • dbot : Deep depth in m.
  • +
  • dinterval : Vertical grid size in m. Defaults to 5m.
  • +
+ +

Values for dbot and dtop are generated if not provided.

+ +

Editing parameters +Provide editing parameters via editparams.

+ +
    +
  • max_e=0.2, # absolute max e
  • +
  • max_e_deviation=2, # max in terms of sigma
  • +
  • min_correlation=64, # 64 is RDI default
  • +
  • maskbins : Array with booleans indexing into the ADCP bins. Use the +convenience method generate_binmask.
  • +
  • pg_limit : float or int or None. +Percent good limit applied prior to interpolating to the universal +depth grid in burst_average_ensembles.
  • +
+
+ + +
+ +
+ + ProcessADCP( raw_data, meta_data, driftparams=None, tgridparams=None, dgridparams=None, editparams=None, ibad=None, logdir='log', verbose=False, plot=False, pressure_scale_factor=1, magdec=None, pressure=None) + + + +
+ +
208    def __init__(
+209        self,
+210        raw_data,
+211        meta_data,
+212        driftparams=None,
+213        tgridparams=None,
+214        dgridparams=None,
+215        editparams=None,
+216        ibad=None,
+217        logdir="log",
+218        verbose=False,
+219        plot=False,
+220        pressure_scale_factor=1,
+221        magdec=None,
+222        pressure=None,
+223    ):
+224        self.meta_data = Bunch(meta_data.copy())
+225        self.ibad = ibad
+226        self.logdir = logdir
+227        self.verbose = verbose
+228
+229        self._magdec_provided = magdec
+230        self._magdec = magdec
+231
+232        self._pressure_provided = pressure
+233        self._pressure_scale_factor = pressure_scale_factor
+234
+235        self._raw = None
+236        self._default_dgridparams = None
+237
+238        self.parse_file_locations(raw_data)
+239        self._initiate_data_reader()
+240        self._read_auxiliary_data()
+241        self._parse_meta_data()
+242
+243        self._set_up_logger()
+244
+245        self.parse_driftparams(driftparams)
+246        self._parse_sysconfig()
+247        self.parse_dgridparams(dgridparams)
+248        self.parse_tgridparams(tgridparams)
+249        self.parse_editparams(editparams)
+250
+251        self.make_start_ddays()
+252
+253        if plot:
+254            self.plot_pressure()
+
+ + + + +
+
+
+ meta_data + + +
+ + + + +
+
+
+ ibad + + +
+ + + + +
+
+
+ logdir + + +
+ + + + +
+
+
+ verbose + + +
+ + + + +
+
+ +
+ + def + parse_file_locations(self, raw_data, min_file_size=10000.0): + + + +
+ +
256    def parse_file_locations(self, raw_data, min_file_size=1e4):
+257        """Parse input for raw data files.
+258
+259        Input can either be a single file name as a str, a single file as a
+260        Path instance, a list of either of these, or a Path instance pointing to a
+261        directory with raw ADCP files. In the latter case, files that are
+262        smaller than a threshold will not be included in the processing.
+263
+264        Outputs to attribute `files`. The output can be fed to Multiread instances.
+265
+266        Parameters
+267        ----------
+268        raw_data : str or list or Path
+269            Location(s) of raw data.
+270        min_file_size : int
+271            Minimum size for file to be included. Defaults to 1e4 which
+272            corresponds to about 10kB and is a good value for excluding small
+273            files without any actual data.
+274
+275        """
+276
+277        def list_dir(dir, min_file_size):
+278            # List all raw files.
+279            all_raw_files = list(sorted(dir.glob("*.00*")))
+280            # only files larger than about 10kB
+281            files = [
+282                file.as_posix()
+283                for file in all_raw_files
+284                if file.stat().st_size > min_file_size
+285            ]
+286            return files
+287
+288        input_type = type(raw_data)
+289        if input_type is list:
+290            if type(raw_data[0]) is str:
+291                self.files = raw_data
+292            elif type(raw_data[0]) is pathlib.PosixPath:
+293                self.files = [file.as_posix() for file in raw_data]
+294        elif input_type is str:
+295            if Path(raw_data).is_dir():
+296                self.files = list_dir(Path(raw_data), min_file_size)
+297            else:
+298                self.files = [raw_data]
+299        elif input_type is pathlib.PosixPath:
+300            if raw_data.is_dir():
+301                self.files = list_dir(raw_data, min_file_size)
+302            else:
+303                self.files = [raw_data.as_posix()]
+
+ + +

Parse input for raw data files.

+ +

Input can either be a single file name as a str, a single file as a +Path instance, a list of either of these, or a Path instance pointing to a +directory with raw ADCP files. In the latter case, files that are +smaller than a threshold will not be included in the processing.

+ +

Outputs to attribute files. The output can be fed to Multiread instances.

+ +
Parameters
+ +
    +
  • raw_data (str or list or Path): +Location(s) of raw data.
  • +
  • min_file_size (int): +Minimum size for file to be included. Defaults to 1e4 which +corresponds to about 10kB and is a good value for excluding small +files without any actual data.
  • +
+
+ + +
+
+
+ default_dgridparams + + +
+ + +

Determine default depth gridding parameters.

+ +

The grid is centered on the median depth of the ADCP (plus distance to +the center of the first bin) to avoid unnecessary binning into +neighboring depth cells. The default size of the depth bins mimicks the +size of ADCP bins.

+
+ + +
+
+ +
+ + def + parse_dgridparams(self, dgridparams): + + + +
+ +
490    def parse_dgridparams(self, dgridparams):
+491        """Parse depth gridding parameters.
+492
+493        See top level class notes for more info.
+494
+495        Parameters
+496        ----------
+497        dgridparams : dict
+498
+499        """
+500        self.dgridparams = Bunch(self.default_dgridparams)
+501        if dgridparams is not None:
+502            self.dgridparams.update_values(dgridparams, strict=True)
+503        else:
+504            logger.warning(
+505                "No depth gridding parameters provided, using default values."
+506            )
+507        # Default depth grid parameters are based on the median pressure to
+508        # avoid binning into neighboring grid cells as much as possible.
+509        # Therefore, we start assembling the depth grid from the bottom up for
+510        # an uplooker and from the top down for a downlooker.
+511        if self.orientation == "up":
+512            self.dgrid = np.arange(
+513                self.dgridparams.dbot,
+514                self.dgridparams.dtop,
+515                -self.dgridparams.d_interval,
+516                dtype=float,
+517            )
+518        elif self.orientation == "down":
+519            self.dgrid = np.arange(
+520                self.dgridparams.dtop,
+521                self.dgridparams.dbot,
+522                self.dgridparams.d_interval,
+523                dtype=float,
+524            )
+
+ + +

Parse depth gridding parameters.

+ +

See top level class notes for more info.

+ +
Parameters
+ +
    +
  • dgridparams (dict):
  • +
+
+ + +
+
+ +
+ + def + parse_tgridparams(self, tgridparams): + + + +
+ +
526    def parse_tgridparams(self, tgridparams):
+527        """Parse time gridding parameters.
+528
+529        See top level class notes for more info.
+530
+531        Parameters
+532        ----------
+533        tgridparams : dict
+534
+535        """
+536        # Find time at depth to determine default time grid parameters.
+537        # Differentiate between time series only in the water and time series
+538        # including the overshoot on mooring deployment.
+539        p = self.tsdat.pressure
+540        if ~np.any(p < 10):
+541            t0 = self.dday[0]
+542            t1 = self.dday[-1]
+543        else:
+544            at_depth = np.nonzero(p > self.p_median)[0][0]
+545            t0 = self.dday[at_depth]
+546            in_water = np.nonzero(p > self.p_median / 2)[0][-1]
+547            t1 = self.dday[in_water]
+548
+549        # Generate a set of default time gridding parameters and then update
+550        # from the input parameters provided.
+551        default_tgridparams = dict(dt_hours=0.5, t0=t0, t1=t1, burst_average=False)
+552        self.tgridparams = Bunch(default_tgridparams)
+553        if tgridparams is not None:
+554            self.tgridparams.update_values(tgridparams, strict=True)
+555        else:
+556            logger.warning(
+557                "No time gridding parameters provided, using default values."
+558            )
+
+ + +

Parse time gridding parameters.

+ +

See top level class notes for more info.

+ +
Parameters
+ +
    +
  • tgridparams (dict):
  • +
+
+ + +
+
+ +
+ + def + parse_editparams(self, editparams): + + + +
+ +
560    def parse_editparams(self, editparams):
+561        """Parse editing parameters.
+562
+563        See top level class notes for more info.
+564
+565        Parameters
+566        ----------
+567        editparams : dict
+568
+569        """
+570        self.editparams = Bunch(self._editparams)
+571        if editparams is not None:
+572            self.editparams.update_values(editparams, strict=True)
+573        else:
+574            logger.warning("No edit parameters provided, using default values.")
+
+ + +

Parse editing parameters.

+ +

See top level class notes for more info.

+ +
Parameters
+ +
    +
  • editparams (dict):
  • +
+
+ + +
+
+ +
+ + def + parse_driftparams(self, driftparams): + + + +
+ +
576    def parse_driftparams(self, driftparams):
+577        """Parse time drift parameters.
+578
+579        See top level class notes for more info.
+580
+581        Parameters
+582        ----------
+583        driftparams : dict
+584
+585        """
+586        driftparams = dict() if driftparams is None else driftparams
+587        self.driftparams = driftparams
+588        self.yearbase = self.m.yearbase
+589        t0 = self.tsdat.dday[0]
+590        self.t0 = t0
+591        t1_adcp = driftparams.get("end_adcp", None)
+592        if t1_adcp is not None:
+593            t1_pc = to_day(self.m.yearbase, *driftparams["end_pc"])
+594            t1_adcp = to_day(self.m.yearbase, *driftparams["end_adcp"])
+595            self.time_drift_rate = (t1_pc - t0) / (t1_adcp - t0)
+596        else:
+597            logger.warning(
+598                "No time drift parameters provided, not applying any clock correction."
+599            )
+600            self.time_drift_rate = 1
+601
+602        self.dday = self._correct_dday(self.tsdat.dday)
+
+ + +

Parse time drift parameters.

+ +

See top level class notes for more info.

+ +
Parameters
+ +
    +
  • driftparams (dict):
  • +
+
+ + +
+
+ +
+ + def + make_start_ddays(self): + + + +
+ +
637    def make_start_ddays(self):
+638        """Generate time stamps for ping averaging.
+639
+640        Notes
+641        -----
+642        If turning on burst averaging, other input values will be ignored and
+643        the averaging interval will be determined from the burst sampling
+644        scheme apparent in the ping pattern.
+645
+646        """
+647        dday_start = self.tgridparams.t0
+648        dday_end = self.tgridparams.t1
+649        dt_hours = self.tgridparams.dt_hours
+650        is_burst_average = self.tgridparams.burst_average
+651
+652        # Save whether we are averaging over bursts or not.
+653        self.is_burst_average = is_burst_average
+654        # Generate time stamps and stuff.
+655        if not is_burst_average:
+656            print("no burst average")
+657            self.dday_start = dday_start
+658            self.dday_end = dday_end
+659            self.dt = dt_hours / 24.0
+660            self.start_ddays = np.arange(dday_start, dday_end, dt_hours / 24.0)
+661            # Time stamps for the averages. Midpoints of averaging intervals.
+662            self.dday_mid = self.start_ddays + self.dt / 2
+663        else:
+664            dday_diff = np.diff(self.dday)
+665            # Determine ping interval within burst and time between bursts.
+666            burst_dt = np.median(dday_diff)
+667            print(f"time between pings within burst: {burst_dt * 24 * 60 * 60:1.1f} s")
+668            # It seems safe to assume that the time between bursts is at least
+669            # four times as long as the time between individual pings within a
+670            # burst.
+671            inter_burst_dt = np.median(dday_diff[dday_diff > burst_dt * 4])
+672            print(f"time between bursts: {inter_burst_dt * 24 * 60:1.1f} min")
+673            # Find starting points of all bursts.
+674            start_indices = np.flatnonzero(dday_diff > burst_dt * 4)
+675            # Increase index so we are at the end of the larger time differences.
+676            start_indices += 1
+677            # Include the very beginning.
+678            start_indices = np.insert(start_indices, 0, 0)
+679            self.start_ddays = self.dday[start_indices]
+680            self.dday_start = self.start_ddays[0]
+681            # Generate a dt that is inclusive of one burst.  We know the number
+682            # of pings in a burst from the difference between the
+683            # start_indices. Let's go a bit beyond the time needed (3 more ping
+684            # intervals chosen here).
+685            pings_per_burst = np.int32(np.median(np.diff(start_indices)))
+686            print(f"{pings_per_burst} pings per burst")
+687            print(f"{start_indices.shape[0]} bursts total")
+688            self.dt = burst_dt * pings_per_burst + burst_dt * 3
+689
+690            self.dday_start = self.start_ddays[0]
+691            self.dday_end = dday_end
+692
+693            # Time stamps in the middle of the burst
+694            self.dday_mid = self.start_ddays + pings_per_burst * burst_dt / 2
+
+ + +

Generate time stamps for ping averaging.

+ +
Notes
+ +

If turning on burst averaging, other input values will be ignored and +the averaging interval will be determined from the burst sampling +scheme apparent in the ping pattern.

+
+ + +
+
+ +
+ + def + read_ensemble(self, iens): + + + +
+ +
696    def read_ensemble(self, iens):
+697        """Read ensembles (several individual pings grouped together).
+698
+699        Parameters
+700        ----------
+701        iens : int
+702            Index into ensemble start times (they are generated in
+703            :meth:`make_start_ddays`).
+704
+705        Returns
+706        -------
+707        dat : pycurrents.adcp.rdiraw.Bunch
+708            Dictionary with data.
+709
+710        Raises
+711        ------
+712        ValueError
+713            If `iens` is too large to index into `start_ddays`.
+714
+715        """
+716
+717        if iens > len(self.start_ddays) - 1:
+718            raise ValueError("ens num %d is out of range" % iens)
+719
+720        # Get indices within the interval.
+721        sl = rangeslice(
+722            self.dday, self.start_ddays[iens], self.start_ddays[iens] + self.dt
+723        )
+724        # Use the indices to extract data.
+725        dat = self.m.read(start=sl.start, stop=sl.stop)
+726        if dat is None:
+727            return None
+728        dat.dday_orig = dat.dday
+729        dat.dday = self._correct_dday(dat.dday_orig)
+730        if self._pressure_provided is not None:
+731            # Replace pressure if provided
+732            dat.pressure = self._external_pressure_to_dat(dat)
+733        else:
+734            dat.pressure = self._scale_pycurrents_pressure(dat)
+735        sign = -1 if self.orientation == "up" else 1
+736        pdepth = seawater.depth2(dat.pressure, self.lat)
+737        dat.depth = pdepth[:, np.newaxis] + sign * dat.dep
+738        return dat
+
+ + +

Read ensembles (several individual pings grouped together).

+ +
Parameters
+ +
    +
  • iens (int): +Index into ensemble start times (they are generated in +make_start_ddays()).
  • +
+ +
Returns
+ +
    +
  • dat (pycurrents.adcp.rdiraw.Bunch): +Dictionary with data.
  • +
+ +
Raises
+ +
    +
  • ValueError: If iens is too large to index into start_ddays.
  • +
+
+ + +
+
+
+ magdec + + +
+ + +

Magnetic declination.

+ +

If not provided as input argument magdec is calculated using +magdec +(must be installed) based on lon and lat.

+
+ + +
+
+
+ raw + + +
+ + +

Raw ADCP data.

+
+ + +
+
+ +
+ + def + process_pings(self, start=None, stop=None, binmap=False, ens_size=50000): + + + +
+ +
1005    def process_pings(self, start=None, stop=None, binmap=False, ens_size=50000):
+1006        """Process single ping data without averaging.
+1007
+1008        Adds results as dictionary under `ave` and as `xarray.Dataset` under `ds`.
+1009
+1010        Writes processing parameters to the log file.
+1011
+1012        Parameters
+1013        ----------
+1014        start : int, optional
+1015            Start processing at this ping number.
+1016        stop : int, optional
+1017            Stop processing at this ping number.
+1018        binmap : bool, optional
+1019            Do binmapping of along-beam data.
+1020        ens_size : int, optional
+1021            Pings are processed in ensembles to reduce memory usage.
+1022            This parameter sets how many pings are in an ensemble. The default is 50000.
+1023
+1024        """
+1025        if start is None:
+1026            idx_start = np.searchsorted(self.dday, self.dday_start)
+1027        if stop is None:
+1028            idx_stop = np.searchsorted(self.dday, self.dday_end)
+1029
+1030        ens_idxs = np.hstack((np.arange(idx_start, idx_stop, ens_size), idx_stop))
+1031        write_idxs = ens_idxs - ens_idxs[0]  # Arrays we write to start at index 0
+1032        npings = idx_stop - idx_start
+1033        nens = ens_idxs.size - 1
+1034        ndgrid = self.tsdat.dep.size
+1035
+1036        logger.info("Processing all pings")
+1037        logger.info(f"Binmapping is {binmap}")
+1038
+1039        uvwe = np.ma.zeros((npings, ndgrid, 4), dtype=np.float32)
+1040
+1041        pg = np.zeros((npings, ndgrid), dtype=np.int8)
+1042        amp = np.ma.zeros((npings, ndgrid), dtype=np.float32)
+1043
+1044        # temperature = np.ma.zeros((npings,), dtype=np.float32)
+1045        # pressure = np.ma.zeros((npings,), dtype=np.float32)
+1046
+1047        temperature = self.tsdat.temperature[idx_start:idx_stop]
+1048        pressure = self.tsdat.pressure[idx_start:idx_stop]
+1049
+1050        dday = self.dday[idx_start:idx_stop]
+1051
+1052        # Loop over ensembles
+1053        for i in tqdm(range(nens)):
+1054            ens = self.m.read(start=ens_idxs[i], stop=ens_idxs[i + 1])
+1055            idx0 = write_idxs[i]
+1056            idx1 = write_idxs[i + 1]
+1057
+1058            if ens is not None:
+1059                # I pulled this out of read_ensembles because we need to calculate depth for _ave2nc to work.
+1060                ens.dday_orig = ens.dday
+1061                ens.dday = self._correct_dday(ens.dday_orig)
+1062                if self._pressure_provided is not None:
+1063                    # Replace pressure if provided
+1064                    ens.pressure = self._external_pressure_to_dat(ens)
+1065                else:
+1066                    ens.pressure = self._scale_pycurrents_pressure(ens)
+1067                sign = -1 if self.orientation == "up" else 1
+1068                pdepth = seawater.depth2(ens.pressure, self.lat)
+1069                ens.depth = pdepth[:, np.newaxis] + sign * ens.dep
+1070
+1071                if binmap:
+1072                    self._binmap_all_beams(ens)
+1073                    # Now we have to recalculate xyze with the binmapped data.
+1074                    self._calculate_xyze(ens)
+1075
+1076                self._edit(ens)  # modifies xyze
+1077                self._to_enu(ens)  # transform to earth coords (east, north, up)
+1078
+1079            else:
+1080                uvwe[idx0:idx1] = np.ma.masked
+1081                amp[idx0:idx1] = np.ma.masked
+1082                # pressure[idx0:idx1] = np.ma.masked
+1083                # temperature[idx0:idx1] = np.ma.masked
+1084                continue
+1085
+1086            uvwe[idx0:idx1] = ens.enu
+1087
+1088            # pgi = 100 * ens.enu_grid[..., 0].count(axis=0) // nprofs
+1089            # pg[i] = pgi.astype(np.int8)
+1090            amp[idx0:idx1] = ens.amp.mean(axis=-1)  # Average over beams... why?
+1091
+1092        self.ave = Bunch(
+1093            u=uvwe[..., 0],
+1094            v=uvwe[..., 1],
+1095            w=uvwe[..., 2],
+1096            e=uvwe[..., 3],
+1097            pg=pg,
+1098            amp=amp,
+1099            temperature=temperature,
+1100            pressure=pressure,
+1101            # npings=npings,
+1102            dday=dday,
+1103            yearbase=self.yearbase,
+1104            dep=ens.dep,  # <<<<----- BAD!!! This a fudge because I don't want to calculated a depth vector. We use the depth vector from the last ensemble.
+1105            editparams=self.editparams,
+1106            tgridparams=self.tgridparams,
+1107            # dgridparams=self.dgridparams,
+1108            magdec=self.magdec,
+1109            lon=self.lon,
+1110            lat=self.lon,
+1111        )
+1112
+1113        self._ave2nc()
+1114        self._add_meta_data_to_ds()
+1115        self._log_processing_params()
+
+ + +

Process single ping data without averaging.

+ +

Adds results as dictionary under ave and as xarray.Dataset under ds.

+ +

Writes processing parameters to the log file.

+ +
Parameters
+ +
    +
  • start (int, optional): +Start processing at this ping number.
  • +
  • stop (int, optional): +Stop processing at this ping number.
  • +
  • binmap (bool, optional): +Do binmapping of along-beam data.
  • +
  • ens_size (int, optional): +Pings are processed in ensembles to reduce memory usage. +This parameter sets how many pings are in an ensemble. The default is 50000.
  • +
+
+ + +
+
+ +
+ + def + average_ensembles(self, start=None, stop=None): + + + +
+ +
1117    def average_ensembles(self, start=None, stop=None):
+1118        """Time-averaging.
+1119
+1120        Adds results as dictionary under `ave` and as `xarray.Dataset` under `ds`.
+1121
+1122        Writes processing parameters to the log file.
+1123
+1124        Parameters
+1125        ----------
+1126        start : int
+1127            Range start for averaging. Index into start times of averaging
+1128            intervals.
+1129        stop : int
+1130            Range start for averaging. Index into start times of averaging
+1131            intervals.
+1132
+1133        """
+1134
+1135        nens_orig = len(self.start_ddays)
+1136        indices_orig = np.arange(nens_orig)
+1137        indices = indices_orig[start:stop]
+1138        if start is None and stop is None:
+1139            logger.info("Averaging all ensembles")
+1140        else:
+1141            logger.info(f"Averaging ensembles {indices[0]} to {indices[-1]}")
+1142        nens = len(indices)
+1143        ndgrid = len(self.dgrid)
+1144        uvwe = np.ma.zeros((nens, ndgrid, 4), dtype=np.float32)
+1145        uvwe_std = np.ma.zeros((nens, ndgrid, 4), dtype=np.float32)
+1146
+1147        pg = np.zeros((nens, ndgrid), dtype=np.int8)
+1148        amp = np.ma.zeros((nens, ndgrid), dtype=np.float32)
+1149
+1150        temperature = np.ma.zeros((nens,), dtype=np.float32)
+1151        pressure = np.ma.zeros((nens,), dtype=np.float32)
+1152        pressure_std = np.ma.zeros((nens,), dtype=np.float32)
+1153        pressure_max = np.ma.zeros((nens,), dtype=np.float32)
+1154
+1155        npings = np.zeros((nens,), dtype=np.int16)
+1156
+1157        dday = self.dday_mid[start:stop]
+1158
+1159        for i, iens in enumerate(tqdm(indices)):
+1160            ens = self.read_ensemble(iens)
+1161            if ens is not None:
+1162                self._edit(ens)  # modifies xyze
+1163                self._to_enu(ens)  # transform to earth coords (east, north, up)
+1164                self._regrid_enu(ens)
+1165                self._regrid_amp(ens)
+1166
+1167                nprofs = ens.enu_grid.shape[0]
+1168            else:
+1169                nprofs = 0
+1170            npings[i] = nprofs
+1171            if nprofs < 2:
+1172                uvwe[i] = np.ma.masked
+1173                uvwe_std[i] = np.ma.masked
+1174                # (pg is not a masked array)
+1175                amp[i] = np.ma.masked
+1176                pressure[i] = np.ma.masked
+1177                pressure_std[i] = np.ma.masked
+1178                pressure_max[i] = np.ma.masked
+1179                temperature[i] = np.ma.masked
+1180                continue
+1181
+1182            uvwe[i] = ens.enu_grid.mean(axis=0)
+1183            uvwe_std[i] = ens.enu_grid.std(axis=0)
+1184
+1185            pgi = 100 * ens.enu_grid[..., 0].count(axis=0) // nprofs
+1186            pg[i] = pgi.astype(np.int8)
+1187            amp[i] = ens.amp_grid.mean(axis=0)
+1188
+1189            pressure[i] = ens.pressure.mean()
+1190            pressure_std[i] = ens.pressure.std()
+1191            pressure_max[i] = ens.pressure.max()
+1192            temperature[i] = ens.temperature.mean()
+1193
+1194        self.ave = Bunch(
+1195            u=uvwe[..., 0],
+1196            v=uvwe[..., 1],
+1197            w=uvwe[..., 2],
+1198            e=uvwe[..., 3],
+1199            u_std=uvwe_std[..., 0],
+1200            v_std=uvwe_std[..., 1],
+1201            w_std=uvwe_std[..., 2],
+1202            e_std=uvwe_std[..., 3],
+1203            pg=pg,
+1204            amp=amp,
+1205            temperature=temperature,
+1206            pressure=pressure,
+1207            pressure_std=pressure_std,
+1208            pressure_max=pressure_max,
+1209            npings=npings,
+1210            dday=dday,
+1211            yearbase=self.yearbase,
+1212            dep=self.dgrid,
+1213            editparams=self.editparams,
+1214            tgridparams=self.tgridparams,
+1215            dgridparams=self.dgridparams,
+1216            magdec=self.magdec,
+1217            lon=self.lon,
+1218            lat=self.lon,
+1219        )
+1220
+1221        self._ave2nc()
+1222        self._add_meta_data_to_ds()
+1223        self._log_processing_params()
+
+ + +

Time-averaging.

+ +

Adds results as dictionary under ave and as xarray.Dataset under ds.

+ +

Writes processing parameters to the log file.

+ +
Parameters
+ +
    +
  • start (int): +Range start for averaging. Index into start times of averaging +intervals.
  • +
  • stop (int): +Range start for averaging. Index into start times of averaging +intervals.
  • +
+
+ + +
+
+ +
+ + def + burst_average_ensembles(self, start=None, stop=None, interpolate_bin=None): + + + +
+ +
1225    def burst_average_ensembles(self, start=None, stop=None, interpolate_bin=None):
+1226        """Time-averaging prior to depth-gridding.
+1227
+1228        Uses pre-defined editing parameters that can be updated with
+1229        `parse_editparams`.
+1230
+1231        Adds results as dictionary under `ave` and as `xarray.Dataset` under `ds`.
+1232
+1233        Writes processing parameters to the log file.
+1234
+1235        Parameters
+1236        ----------
+1237        start : int, optional
+1238            Range start for averaging. Index into start times of averaging
+1239            intervals. Defaults to None (start at beginning).
+1240        stop : int, optional
+1241            Range start for averaging. Index into start times of averaging
+1242            intervals. Defaults to None (start at beginning).
+1243        interpolate_bin : int or None, optional
+1244            Interpolate over a single, previously masked, bin. Defaults to None (no interpolation).
+1245
+1246        """
+1247        pg_condition = self.editparams.pg_limit
+1248        nens_orig = len(self.start_ddays)
+1249        indices_orig = np.arange(nens_orig)
+1250        indices = indices_orig[start:stop]
+1251        if start is None and stop is None:
+1252            logger.info("Averaging all ensembles")
+1253        else:
+1254            logger.info(f"Averaging ensembles {indices[0]} to {indices[-1]}")
+1255        nens = len(indices)
+1256        ndgrid = len(self.dgrid)
+1257        uvwe = np.ma.zeros((nens, ndgrid, 4), dtype=np.float32)
+1258        uvwe_std = np.ma.zeros((nens, ndgrid, 4), dtype=np.float32)
+1259
+1260        pg = np.zeros((nens, ndgrid), dtype=np.int8)
+1261        amp = np.ma.zeros((nens, ndgrid), dtype=np.float32)
+1262
+1263        temperature = np.ma.zeros((nens,), dtype=np.float32)
+1264        pressure = np.ma.zeros((nens,), dtype=np.float32)
+1265        pressure_std = np.ma.zeros((nens,), dtype=np.float32)
+1266        pressure_max = np.ma.zeros((nens,), dtype=np.float32)
+1267
+1268        npings = np.zeros((nens,), dtype=np.int16)
+1269
+1270        dday = self.dday_mid[start:stop]
+1271
+1272        for i, iens in enumerate(tqdm(indices)):
+1273            ens = self.read_ensemble(iens)
+1274            if ens is not None:
+1275                self._edit(ens)  # modifies xyze
+1276                self._to_enu(ens)  # transform to earth coords (east, north, up)
+1277                self._regrid_enu(ens)
+1278                self._regrid_amp(ens)
+1279
+1280                nprofs = ens.enu_grid.shape[0]
+1281            else:
+1282                nprofs = 0
+1283            npings[i] = nprofs
+1284            if nprofs < 2:
+1285                uvwe[i] = np.ma.masked
+1286                uvwe_std[i] = np.ma.masked
+1287                # (pg is not a masked array)
+1288                amp[i] = np.ma.masked
+1289                pressure[i] = np.ma.masked
+1290                pressure_std[i] = np.ma.masked
+1291                pressure_max[i] = np.ma.masked
+1292                temperature[i] = np.ma.masked
+1293                continue
+1294
+1295            # Depth vector for interpolation
+1296            depth = self._burst_average_depth(ens)
+1297            depth = depth[0, :]
+1298
+1299            # Calculate burst-average on instrument-relative depth grid
+1300            uvwe_inst = ens.enu.mean(axis=0)
+1301            uvwe_std_inst = ens.enu.std(axis=0)
+1302
+1303            pgi_inst = 100 * ens.enu[..., 0].count(axis=0) // nprofs
+1304
+1305            if pg_condition is not None:
+1306                pgi_index = pgi_inst < pg_condition
+1307                uvwe_inst[pgi_index, :] = np.ma.masked
+1308                uvwe_std_inst[pgi_index, :] = np.ma.masked
+1309
+1310            if interpolate_bin is not None:
+1311                zi = interpolate_bin
+1312                neighbors = [zi - 2, zi - 1, zi + 1, zi + 2]
+1313                dtmp = depth[neighbors]
+1314                tmp = interp1(
+1315                    dtmp,
+1316                    uvwe_inst[neighbors, :],
+1317                    depth[zi],
+1318                    axis=0,
+1319                    method="linear",
+1320                )
+1321                uvwe_inst[zi, :] = tmp
+1322
+1323            # Interpolate burst-average to universal depth grid.
+1324            uvwe_grid = interp1(depth, uvwe_inst, self.dgrid, axis=0, method="linear")
+1325            uvwe_std_grid = interp1(
+1326                depth, uvwe_std_inst, self.dgrid, axis=0, method="linear"
+1327            )
+1328            uvwe[i] = uvwe_grid
+1329            uvwe_std[i] = uvwe_std_grid
+1330
+1331            # Interpolate pg to universal depth grid. Not overly satisfying but
+1332            # seems like that's what we need to do here.
+1333            pgi_grid = interp1(depth, pgi_inst, self.dgrid, axis=0, method="linear")
+1334            pg[i] = pgi_grid.astype(np.int8)
+1335
+1336            # Not changed to averaging in instrument-relative coordinates first.
+1337            amp[i] = ens.amp_grid.mean(axis=0)
+1338
+1339            pressure[i] = ens.pressure.mean()
+1340            pressure_std[i] = ens.pressure.std()
+1341            pressure_max[i] = ens.pressure.max()
+1342            temperature[i] = ens.temperature.mean()
+1343
+1344        self.ave = Bunch(
+1345            u=uvwe[..., 0],
+1346            v=uvwe[..., 1],
+1347            w=uvwe[..., 2],
+1348            e=uvwe[..., 3],
+1349            u_std=uvwe_std[..., 0],
+1350            v_std=uvwe_std[..., 1],
+1351            w_std=uvwe_std[..., 2],
+1352            e_std=uvwe_std[..., 3],
+1353            pg=pg,
+1354            amp=amp,
+1355            temperature=temperature,
+1356            pressure=pressure,
+1357            pressure_std=pressure_std,
+1358            pressure_max=pressure_max,
+1359            npings=npings,
+1360            dday=dday,
+1361            yearbase=self.yearbase,
+1362            dep=self.dgrid,
+1363            editparams=self.editparams,
+1364            tgridparams=self.tgridparams,
+1365            dgridparams=self.dgridparams,
+1366            magdec=self.magdec,
+1367            lon=self.lon,
+1368            lat=self.lon,
+1369        )
+1370
+1371        self._ave2nc()
+1372        self._add_meta_data_to_ds()
+1373        self._log_processing_params()
+
+ + +

Time-averaging prior to depth-gridding.

+ +

Uses pre-defined editing parameters that can be updated with +parse_editparams.

+ +

Adds results as dictionary under ave and as xarray.Dataset under ds.

+ +

Writes processing parameters to the log file.

+ +
Parameters
+ +
    +
  • start (int, optional): +Range start for averaging. Index into start times of averaging +intervals. Defaults to None (start at beginning).
  • +
  • stop (int, optional): +Range start for averaging. Index into start times of averaging +intervals. Defaults to None (start at beginning).
  • +
  • interpolate_bin (int or None, optional): +Interpolate over a single, previously masked, bin. Defaults to None (no interpolation).
  • +
+
+ + +
+
+ +
+ + def + plot_echo_stats(self): + + + +
+ +
1569    def plot_echo_stats(self):
+1570        """Plot beam statistics (correlation and amplitude) from raw ADCP data."""
+1571        r = self.raw
+1572
+1573        fig, ax = plt.subplots(
+1574            nrows=1,
+1575            ncols=2,
+1576            figsize=(5, r.bin.max().data * 0.3),
+1577            constrained_layout=True,
+1578            sharey=True,
+1579        )
+1580        r.cor.mean(dim="time").plot(
+1581            hue="beam", y="bin", marker="o", linestyle="", ax=ax[0]
+1582        )
+1583        r.amp.mean(dim="time").plot(
+1584            hue="beam", y="bin", marker="o", linestyle="", ax=ax[1]
+1585        )
+1586        ax[0].invert_yaxis()
+1587        ax[1].set(ylabel="")
+1588        ax[0].set_yticks(r.bin.data)
+1589        for axi in ax:
+1590            axi.grid(True)
+
+ + +

Plot beam statistics (correlation and amplitude) from raw ADCP data.

+
+ + +
+
+ +
+ + def + plot_pressure(self): + + + +
+ +
1592    def plot_pressure(self):
+1593        """Plot pressure time series and mark time at depth."""
+1594        fig, ax = plt.subplots(
+1595            nrows=1,
+1596            ncols=1,
+1597            figsize=(6, 2.5),
+1598            constrained_layout=True,
+1599        )
+1600        self.raw.pressure.plot(ax=ax, label="all")
+1601        self.raw.pressure.where(self.raw.pressure > 50).plot(ax=ax, label="subsurface")
+1602        ax.invert_yaxis()
+1603        ax.set(xlabel="", ylabel="pressure [dbar]")
+1604        ax.legend()
+
+ + +

Plot pressure time series and mark time at depth.

+
+ + +
+
+ +
+ + def + generate_binmask(self, indices): + + + +
+ +
1606    def generate_binmask(self, indices):
+1607        binmask = self.raw.bin.data < 0
+1608        binmask[indices] = True
+1609        return binmask
+
+ + + + +
+
+
+ +
+ + class + ProcessADCPyml(ProcessADCP): + + + +
+ +
1612class ProcessADCPyml(ProcessADCP):
+1613    """Moored ADCP processing with parameters provided via .yml file.
+1614
+1615    An example parameter file is included at
+1616    [`notebooks/parameters.yml`](https://github.com/modscripps/velosearaptor/tree/main/notebooks/parameters.yml)
+1617    """
+1618
+1619    def __init__(self, parameter_file, mooring, sn, **kwargs):
+1620        p = io.parse_yaml_input(parameter_file, mooring, sn)
+1621        super().__init__(
+1622            p["data_dir"],
+1623            meta_data=p["meta_data"],
+1624            driftparams=p["driftparams"],
+1625            tgridparams=p["tgridparams"],
+1626            dgridparams=p["dgridparams"],
+1627            editparams=p["editparams"],
+1628            **kwargs,
+1629        )
+
+ + +

Moored ADCP processing with parameters provided via .yml file.

+ +

An example parameter file is included at +notebooks/parameters.yml

+
+ + +
+ +
+ + ProcessADCPyml(parameter_file, mooring, sn, **kwargs) + + + +
+ +
1619    def __init__(self, parameter_file, mooring, sn, **kwargs):
+1620        p = io.parse_yaml_input(parameter_file, mooring, sn)
+1621        super().__init__(
+1622            p["data_dir"],
+1623            meta_data=p["meta_data"],
+1624            driftparams=p["driftparams"],
+1625            tgridparams=p["tgridparams"],
+1626            dgridparams=p["dgridparams"],
+1627            editparams=p["editparams"],
+1628            **kwargs,
+1629        )
+
+ + + + +
+ +
+
+ + \ No newline at end of file