The Gannet logo

Current stable release: 3.3.2

Overview

Gannet is a free, open-source MATLAB-based software toolkit for analyzing edited single-voxel 1H magnetic resonance spectroscopy (MRS) data. Its largely automated functions cover all the essential steps of modern MRS analysis:

Several existing software packages for MRS data analysis require substantial user input or offer a wide selection of processing options. In contrast, the philosophy behind Gannet is to provide users with a complete automated pipeline without the need for significant user input.

Additionally, as open-source software, advanced users have the ability to modify the underlying routines for ad hoc purposes.

Installation

Prerequisites

Gannet runs in MATLAB. For best performance, we recommend using the latest release if possible. Additionally, Gannet requires that the following MATLAB toolboxes are installed:

  • Image Processing
  • Optimization
  • Signal Processing
  • Statistics and Machine Learning

You can check which toolboxes you have installed by typing ver in the MATLAB command window. To install any missing toolboxes, please follow these instructions.

To run the voxel co-registration and structural image segmentation modules, SPM12 must be installed.

Download

The simplest way to install Gannet is to download the latest source code as a ZIP file from the GitHub repository and move the Gannet-main/ directory into your main MATLAB directory (or wherever else you wish).

Alternatively, Git users can clone the Gannet repository into a directory of their choice:

git clone https://github.com/markmikkelsen/Gannet.git

The development version of Gannet can be downloaded from the development branch on GitHub or by using the following git command if the repository was cloned:

git checkout dev

Stable releases can be found here.

Setup

Open the Set Path dialog box from the MATLAB menu (or run the command pathtool in the Command Window), click Add with Subfolders…, find the downloaded Gannet directory, and then select it. When done, press Save to permanently save the Gannet directory to MATLAB’s default search path.

SPM12 can be installed in the same manner after it has been downloaded from the SPM website.

It is highly recommended that you only add the main SPM12 directory (spm12/) to your search path instead of including all the subdirectories. This prevents function conflicts.

If you have Osprey also installed on your computer, please ensure that you either have all the Gannet and SPM12 directories at the top of your search path or have removed the Osprey directories from your search path. Gannet and Osprey share several functions that can lead to conflicts that result in Gannet not functioning correctly.

Compatibility

Gannet is currently being developed in MATLAB R2024a in macOS 14 Sonoma (Apple silicon). While reasonable effort is made to ensure legacy and cross-OS compatibility, an error-free user experience is not guaranteed.

Supported file formats

At present, the following MRS data file formats are supported:

For creating and co-registering voxel masks, structural images need to be in NIfTI format (DICOM files can also be used if processing GE P-files).

Philips users: Do not use structural images exported using the fsl-nifti option as this creates problems with co-registration in Gannet.

Getting help

If you encounter any problems, please first check the Documentation or FAQ for a solution.

Otherwise, you can post your query on the Gannet forum on MRSHub.

The Gannet team can also be contacted directly. We will do our best to work with you to solve your issue.

Versioning

Gannet uses a form of semantic versioning in the style ‘x.x.x’ to mark code releases. Versioning is also conducted on a module-specific basis using the style ‘YYMMDD’. That is, each Gannet module has its own release version. Users should note that module-specific versions sometimes are updated despite the semantic version number remaining unchanged (typically for minor updates/bug fixes).

Developers

License and citing Gannet

This software is licensed under an open-source BSD-3-Clause License. Should you disseminate material that made use of Gannet, please cite the following publications, as appropriate:

If you perform frequency-and-phase correction (FPC) using:

Robust spectral registration (RobustSpecReg):

multi-step FPC (SpecRegHERMES):

or spectral registration (SpecReg):

If you perform voxel co-registration:

If you perform tissue segmentation:

If you report water-referenced, tissue-corrected metabolite measurements using:

The Harris et al. method:

or the Gasparovic et al. method:

Acknowledgments

The development and dissemination of Gannet has been supported by the following NIH grants:

We wish to thank the following individuals for their direct or indirect contributions:

LS0tCnRpdGxlOiAiR2FubmV0IgpkYXRlOiAiTGFzdCB1cGRhdGVkOiBgciBmb3JtYXQoU3lzLnRpbWUoKSwgJyVCICVkLCAlWScpYCIKb3V0cHV0OiBodG1sX2RvY3VtZW50Ci0tLQoKYGBge3Igc2V0dXAsIGluY2x1ZGUgPSBGQUxTRX0Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGVjaG8gPSBUUlVFKQpgYGAKCmBgYHtyLCBjaGlsZCA9ICJqcy9iYWNrLXRvLXRvcC5qcyJ9CmBgYAoKYGBge2NzcywgZWNobyA9IEZBTFNFfQovKiBUaGlzIGVuYWJsZXMgd3JhcHBpbmcgb2YgY29kZSBibG9ja3MgKi8KcHJlLnNvdXJjZUNvZGUgY29kZSB7CiAgd2hpdGUtc3BhY2U6IHByZS13cmFwOwp9CmBgYAoKPGJyPgoKPGltZyBpZD0iaW1nXzUwIiBzcmM9ImltYWdlcy9sb2dvK3RpdGxlLnBuZyIgYWx0PSJUaGUgR2FubmV0IGxvZ28iLz4KCjo6OiByZWxlYXNlCjxoMz5DdXJyZW50IHN0YWJsZSByZWxlYXNlOiA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vbWFya21pa2tlbHNlbi9HYW5uZXQiIHRhcmdldD0iX2JsYW5rIiBjbGFzcz0iYmFkZ2UgYmFkZ2Utc2Vjb25kYXJ5Ij4zLjMuMjwvYT48L2gzPgo6OjoKCiMjIE92ZXJ2aWV3CgpHYW5uZXQgaXMgYSBmcmVlLCBvcGVuLXNvdXJjZSBNQVRMQUItYmFzZWQgc29mdHdhcmUgdG9vbGtpdCBmb3IgYW5hbHl6aW5nIGVkaXRlZCBzaW5nbGUtdm94ZWwgXjFeSCBtYWduZXRpYyByZXNvbmFuY2Ugc3BlY3Ryb3Njb3B5IChNUlMpIGRhdGEuIEl0cyBsYXJnZWx5IGF1dG9tYXRlZCBmdW5jdGlvbnMgY292ZXIgYWxsIHRoZSBlc3NlbnRpYWwgc3RlcHMgb2YgbW9kZXJuIE1SUyBhbmFseXNpczoKCi0gICBMb2FkaW5nIHJhdyBkYXRhCi0gICBTdWJzdGFudGlhbCBwcmVwcm9jZXNzaW5nCi0gICBTaWduYWwgbW9kZWxpbmcKLSAgIFZveGVsIGNvLXJlZ2lzdHJhdGlvbiB3aXRoIHN0cnVjdHVyYWwgTVIgaW1hZ2VzCi0gICBDb25jZW50cmF0aW9uIGVzdGltYXRpb24gYmFzZWQgb24gdGlzc3VlIGNvbXBvc2l0aW9uCgpTZXZlcmFsIGV4aXN0aW5nIHNvZnR3YXJlIHBhY2thZ2VzIGZvciBNUlMgZGF0YSBhbmFseXNpcyByZXF1aXJlIHN1YnN0YW50aWFsIHVzZXIgaW5wdXQgb3Igb2ZmZXIgYSB3aWRlIHNlbGVjdGlvbiBvZiBwcm9jZXNzaW5nIG9wdGlvbnMuIEluIGNvbnRyYXN0LCB0aGUgcGhpbG9zb3BoeSBiZWhpbmQgR2FubmV0IGlzIHRvIHByb3ZpZGUgdXNlcnMgd2l0aCBhIGNvbXBsZXRlIGF1dG9tYXRlZCBwaXBlbGluZSB3aXRob3V0IHRoZSBuZWVkIGZvciBzaWduaWZpY2FudCB1c2VyIGlucHV0LgoKQWRkaXRpb25hbGx5LCBhcyBvcGVuLXNvdXJjZSBzb2Z0d2FyZSwgYWR2YW5jZWQgdXNlcnMgaGF2ZSB0aGUgYWJpbGl0eSB0byBtb2RpZnkgdGhlIHVuZGVybHlpbmcgcm91dGluZXMgZm9yIGFkIGhvYyBwdXJwb3Nlcy4KCiMjIEluc3RhbGxhdGlvbgoKIyMjIFByZXJlcXVpc2l0ZXMKCkdhbm5ldCBydW5zIGluIDxhIGhyZWY9Imh0dHBzOi8vbWF0aHdvcmtzLmNvbS9wcm9kdWN0cy9tYXRsYWIuaHRtbCIgdGFyZ2V0PSJfYmxhbmsiPk1BVExBQjwvYT4uIEZvciBiZXN0IHBlcmZvcm1hbmNlLCB3ZSByZWNvbW1lbmQgdXNpbmcgdGhlIGxhdGVzdCByZWxlYXNlIGlmIHBvc3NpYmxlLiBBZGRpdGlvbmFsbHksIEdhbm5ldCByZXF1aXJlcyB0aGF0IHRoZSBmb2xsb3dpbmcgTUFUTEFCIHRvb2xib3hlcyBhcmUgaW5zdGFsbGVkOgoKLSAgIEltYWdlIFByb2Nlc3NpbmcKLSAgIE9wdGltaXphdGlvbgotICAgU2lnbmFsIFByb2Nlc3NpbmcKLSAgIFN0YXRpc3RpY3MgYW5kIE1hY2hpbmUgTGVhcm5pbmcKCllvdSBjYW4gY2hlY2sgd2hpY2ggdG9vbGJveGVzIHlvdSBoYXZlIGluc3RhbGxlZCBieSB0eXBpbmcgYHZlcmAgaW4gdGhlIE1BVExBQiBjb21tYW5kIHdpbmRvdy4gVG8gaW5zdGFsbCBhbnkgbWlzc2luZyB0b29sYm94ZXMsIHBsZWFzZSBmb2xsb3cgdGhlc2UgPGEgaHJlZj0iaHR0cHM6Ly9tYXRod29ya3MuY29tL21hdGxhYmNlbnRyYWwvYW5zd2Vycy8xMDE4ODUtaG93LWRvLWktaW5zdGFsbC1hZGRpdGlvbmFsLXRvb2xib3hlcy1pbnRvLWFuLWV4aXN0aW5nLWluc3RhbGxhdGlvbi1vZi1tYXRsYWIiIHRhcmdldD0iX2JsYW5rIj5pbnN0cnVjdGlvbnM8L2E+LgoKVG8gcnVuIHRoZSB2b3hlbCBjby1yZWdpc3RyYXRpb24gYW5kIHN0cnVjdHVyYWwgaW1hZ2Ugc2VnbWVudGF0aW9uIG1vZHVsZXMsIDxhIGhyZWY9Imh0dHBzOi8vd3d3LmZpbC5pb24udWNsLmFjLnVrL3NwbS9zb2Z0d2FyZS9zcG0xMi8iIHRhcmdldD0iX2JsYW5rIj5TUE0xMjwvYT4gbXVzdCBiZSBpbnN0YWxsZWQuCgojIyMgRG93bmxvYWQKClRoZSBzaW1wbGVzdCB3YXkgdG8gaW5zdGFsbCBHYW5uZXQgaXMgdG8gZG93bmxvYWQgdGhlIGxhdGVzdCBzb3VyY2UgY29kZSBhcyBhIFpJUCBmaWxlIGZyb20gdGhlIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9tYXJrbWlra2Vsc2VuL0dhbm5ldCIgdGFyZ2V0PSJfYmxhbmsiPkdpdEh1YiByZXBvc2l0b3J5PC9hPiBhbmQgbW92ZSB0aGUgYEdhbm5ldC1tYWluL2AgZGlyZWN0b3J5IGludG8geW91ciBtYWluIE1BVExBQiBkaXJlY3RvcnkgKG9yIHdoZXJldmVyIGVsc2UgeW91IHdpc2gpLgoKQWx0ZXJuYXRpdmVseSwgR2l0IHVzZXJzIGNhbiBjbG9uZSB0aGUgR2FubmV0IHJlcG9zaXRvcnkgaW50byBhIGRpcmVjdG9yeSBvZiB0aGVpciBjaG9pY2U6CgpgYGB7dmVyYmF0aW0sIGV2YWwgPSBGQUxTRX0KZ2l0IGNsb25lIGh0dHBzOi8vZ2l0aHViLmNvbS9tYXJrbWlra2Vsc2VuL0dhbm5ldC5naXQKYGBgCgpUaGUgZGV2ZWxvcG1lbnQgdmVyc2lvbiBvZiBHYW5uZXQgY2FuIGJlIGRvd25sb2FkZWQgZnJvbSB0aGUgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL21hcmttaWtrZWxzZW4vR2FubmV0L3RyZWUvZGV2IiB0YXJnZXQ9Il9ibGFuayI+ZGV2ZWxvcG1lbnQgYnJhbmNoPC9hPiBvbiBHaXRIdWIgb3IgYnkgdXNpbmcgdGhlIGZvbGxvd2luZyBnaXQgY29tbWFuZCBpZiB0aGUgcmVwb3NpdG9yeSB3YXMgY2xvbmVkOgoKYGBge3ZlcmJhdGltLCBldmFsID0gRkFMU0V9CmdpdCBjaGVja291dCBkZXYKYGBgCgpTdGFibGUgcmVsZWFzZXMgY2FuIGJlIGZvdW5kIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9tYXJrbWlra2Vsc2VuL0dhbm5ldC9yZWxlYXNlcyIgdGFyZ2V0PSJfYmxhbmsiPmhlcmU8L2E+LgoKIyMjIFNldHVwCgpPcGVuIHRoZSAqU2V0IFBhdGgqIGRpYWxvZyBib3ggZnJvbSB0aGUgTUFUTEFCIG1lbnUgKG9yIHJ1biB0aGUgY29tbWFuZCBgcGF0aHRvb2xgIGluIHRoZSBDb21tYW5kIFdpbmRvdyksIGNsaWNrICpBZGQgd2l0aCBTdWJmb2xkZXJzLi4uKiwgZmluZCB0aGUgZG93bmxvYWRlZCBHYW5uZXQgZGlyZWN0b3J5LCBhbmQgdGhlbiBzZWxlY3QgaXQuIFdoZW4gZG9uZSwgcHJlc3MgKlNhdmUqIHRvIHBlcm1hbmVudGx5IHNhdmUgdGhlIEdhbm5ldCBkaXJlY3RvcnkgdG8gTUFUTEFCJ3MgZGVmYXVsdCBzZWFyY2ggcGF0aC4KClNQTTEyIGNhbiBiZSBpbnN0YWxsZWQgaW4gdGhlIHNhbWUgbWFubmVyIGFmdGVyIGl0IGhhcyBiZWVuIGRvd25sb2FkZWQgZnJvbSB0aGUgPGEgaHJlZj0iaHR0cHM6Ly93d3cuZmlsLmlvbi51Y2wuYWMudWsvc3BtL3NvZnR3YXJlL3NwbTEyLyIgdGFyZ2V0PSJfYmxhbmsiPlNQTTwvYT4gd2Vic2l0ZS4KCjo6OiBpbmZvCjxpIGNsYXNzPSJmYSBmYS1pbmZvLWNpcmNsZSIgc3R5bGU9ImNvbG9yOiB3aGl0ZSI+PC9pPiBJdCBpcyBoaWdobHkgcmVjb21tZW5kZWQgdGhhdCB5b3Ugb25seSBhZGQgdGhlIG1haW4gU1BNMTIgZGlyZWN0b3J5IChgc3BtMTIvYCkgdG8geW91ciBzZWFyY2ggcGF0aCBpbnN0ZWFkIG9mIGluY2x1ZGluZyBhbGwgdGhlIHN1YmRpcmVjdG9yaWVzLiBUaGlzIHByZXZlbnRzIGZ1bmN0aW9uIGNvbmZsaWN0cy4KOjo6Cgo6Ojogd2FybmluZwo8aSBjbGFzcz0iZmEgZmEtZXhjbGFtYXRpb24tY2lyY2xlIiBzdHlsZT0iY29sb3I6IHdoaXRlIj48L2k+IElmIHlvdSBoYXZlIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9zY2hvcnNjaGluaG8vb3NwcmV5IiB0YXJnZXQ9Il9ibGFuayIgc3R5bGU9ImNvbG9yOndoaXRlIj48dT5Pc3ByZXk8L3U+PC9hPiBhbHNvIGluc3RhbGxlZCBvbiB5b3VyIGNvbXB1dGVyLCBwbGVhc2UgZW5zdXJlIHRoYXQgeW91IGVpdGhlciBoYXZlIGFsbCB0aGUgR2FubmV0IGFuZCBTUE0xMiBkaXJlY3RvcmllcyBhdCB0aGUgdG9wIG9mIHlvdXIgc2VhcmNoIHBhdGggb3IgaGF2ZSByZW1vdmVkIHRoZSBPc3ByZXkgZGlyZWN0b3JpZXMgZnJvbSB5b3VyIHNlYXJjaCBwYXRoLiBHYW5uZXQgYW5kIE9zcHJleSBzaGFyZSBzZXZlcmFsIGZ1bmN0aW9ucyB0aGF0IGNhbiBsZWFkIHRvIGNvbmZsaWN0cyB0aGF0IHJlc3VsdCBpbiBHYW5uZXQgbm90IGZ1bmN0aW9uaW5nIGNvcnJlY3RseS4KOjo6CgojIyBDb21wYXRpYmlsaXR5CgpHYW5uZXQgaXMgY3VycmVudGx5IGJlaW5nIGRldmVsb3BlZCBpbiBNQVRMQUIgUjIwMjRhIGluIG1hY09TIDE0IFNvbm9tYSAoQXBwbGUgc2lsaWNvbikuIFdoaWxlIHJlYXNvbmFibGUgZWZmb3J0IGlzIG1hZGUgdG8gZW5zdXJlIGxlZ2FjeSBhbmQgY3Jvc3MtT1MgY29tcGF0aWJpbGl0eSwgYW4gZXJyb3ItZnJlZSB1c2VyIGV4cGVyaWVuY2UgaXMgbm90IGd1YXJhbnRlZWQuCgojIyBTdXBwb3J0ZWQgZmlsZSBmb3JtYXRzCgpBdCBwcmVzZW50LCB0aGUgZm9sbG93aW5nIE1SUyBkYXRhIGZpbGUgZm9ybWF0cyBhcmUgc3VwcG9ydGVkOgoKLSBESUNPTSAoLmRjbSkKLSBHRSBQLWZpbGUgKC43KQotIE5JZlRJLU1SUyAoLm5paVsuZ3pdKQotIFBoaWxpcHMgLmRhdGEvLmxpc3QKLSBQaGlsaXBzIC5yYXcKLSBQaGlsaXBzIC5zZGF0Ly5zcGFyCi0gU2llbWVucyBESUNPTSAoLmltYSkKLSBTaWVtZW5zIC5yZGEKLSBTaWVtZW5zIFRXSVggKC5kYXQpCgpGb3IgY3JlYXRpbmcgYW5kIGNvLXJlZ2lzdGVyaW5nIHZveGVsIG1hc2tzLCBzdHJ1Y3R1cmFsIGltYWdlcyBuZWVkIHRvIGJlIGluIE5JZlRJIGZvcm1hdCAoRElDT00gZmlsZXMgY2FuIGFsc28gYmUgdXNlZCBpZiBwcm9jZXNzaW5nIEdFIFAtZmlsZXMpLgoKOjo6IHdhcm5pbmcKPGkgY2xhc3M9ImZhIGZhLWV4Y2xhbWF0aW9uLWNpcmNsZSIgc3R5bGU9ImNvbG9yOiB3aGl0ZSI+PC9pPiBQaGlsaXBzIHVzZXJzOiBEbyBub3QgdXNlIHN0cnVjdHVyYWwgaW1hZ2VzIGV4cG9ydGVkIHVzaW5nIHRoZSAqZnNsLW5pZnRpKiBvcHRpb24gYXMgdGhpcyBjcmVhdGVzIHByb2JsZW1zIHdpdGggY28tcmVnaXN0cmF0aW9uIGluIEdhbm5ldC4KOjo6CgojIyBHZXR0aW5nIGhlbHAKCklmIHlvdSBlbmNvdW50ZXIgYW55IHByb2JsZW1zLCBwbGVhc2UgZmlyc3QgY2hlY2sgdGhlIERvY3VtZW50YXRpb24gb3IgW0ZBUV0oaHR0cHM6Ly9tYXJrbWlra2Vsc2VuLmdpdGh1Yi5pby9HYW5uZXQtZG9jcy9mYXEuaHRtbCkgZm9yIGEgc29sdXRpb24uCgpPdGhlcndpc2UsIHlvdSBjYW4gcG9zdCB5b3VyIHF1ZXJ5IG9uIHRoZSA8YSBocmVmPSJodHRwczovL2ZvcnVtLm1yc2h1Yi5vcmcvYy9tcnMtc29mdHdhcmUvZ2FubmV0LzkiIHRhcmdldD0iX2JsYW5rIj5HYW5uZXQgZm9ydW08L2E+IG9uIDxhIGhyZWY9Imh0dHBzOi8vbXJzaHViLm9yZy8iIHRhcmdldD0iX2JsYW5rIj5NUlNIdWI8L2E+LgoKVGhlIEdhbm5ldCB0ZWFtIGNhbiBhbHNvIGJlIDxhIGhyZWY9Im1haWx0bzptYW00MDQxQG1lZC5jb3JuZWxsLmVkdT9zdWJqZWN0PVtHYW5uZXRdJTIwPFBsZWFzZSBlbnRlciB0aGUgc3ViamVjdCBvZiB5b3VyIHF1ZXJ5IGhlcmU+IiB0YXJnZXQ9Il9ibGFuayI+Y29udGFjdGVkPC9hPiBkaXJlY3RseS4gV2Ugd2lsbCBkbyBvdXIgYmVzdCB0byB3b3JrIHdpdGggeW91IHRvIHNvbHZlIHlvdXIgaXNzdWUuCgojIyBWZXJzaW9uaW5nCgpHYW5uZXQgdXNlcyBhIGZvcm0gb2YgPGEgaHJlZj0iaHR0cHM6Ly9zZW12ZXIub3JnLyIgdGFyZ2V0PSJfYmxhbmsiPnNlbWFudGljIHZlcnNpb25pbmc8L2E+IGluIHRoZSBzdHlsZSAneC54LngnIHRvIG1hcmsgY29kZSByZWxlYXNlcy4gVmVyc2lvbmluZyBpcyBhbHNvIGNvbmR1Y3RlZCBvbiBhIG1vZHVsZS1zcGVjaWZpYyBiYXNpcyB1c2luZyB0aGUgc3R5bGUgJ1lZTU1ERCcuIFRoYXQgaXMsIGVhY2ggR2FubmV0IG1vZHVsZSBoYXMgaXRzIG93biByZWxlYXNlIHZlcnNpb24uIFVzZXJzIHNob3VsZCBub3RlIHRoYXQgbW9kdWxlLXNwZWNpZmljIHZlcnNpb25zIHNvbWV0aW1lcyBhcmUgdXBkYXRlZCBkZXNwaXRlIHRoZSBzZW1hbnRpYyB2ZXJzaW9uIG51bWJlciByZW1haW5pbmcgdW5jaGFuZ2VkICh0eXBpY2FsbHkgZm9yIG1pbm9yIHVwZGF0ZXMvYnVnIGZpeGVzKS4KCiMjIERldmVsb3BlcnMKCi0gUmljaGFyZCBFZGRlbiAoSm9obnMgSG9wa2lucyBVbml2ZXJzaXR5KSAtIGNyZWF0b3IKLSBNYXJrIE1pa2tlbHNlbiAoV2VpbGwgQ29ybmVsbCBNZWRpY2luZSkgLSBsZWFkIGRldmVsb3BlcgotIEdlb3JnIE9lbHR6c2NobmVyIChKb2hucyBIb3BraW5zIFVuaXZlcnNpdHkpIC0gY29udHJpYnV0b3IKLSBNdWhhbW1hZCBTYWxlaCAoQ2hpbGRyZW4ncyBIb3NwaXRhbCBvZiBQaGlsYWRlbHBoaWEpIC0gY29udHJpYnV0b3IKLSBDLiBKb2huIEV2YW5zIChDYXJkaWZmIFVuaXZlcnNpdHkpIC0gY29udHJpYnV0b3IKLSBBc2hsZXkgSGFycmlzIChVbml2ZXJzaXR5IG9mIENhbGdhcnkpIC0gY29udHJpYnV0b3IKLSBOaWNvbGFhcyBQdXRzIChLaW5nJ3MgQ29sbGVnZSBMb25kb24pIC0gY29udHJpYnV0b3IKCiMjIExpY2Vuc2UgYW5kIGNpdGluZyBHYW5uZXQKClRoaXMgc29mdHdhcmUgaXMgbGljZW5zZWQgdW5kZXIgYW4gb3Blbi1zb3VyY2UgW0JTRC0zLUNsYXVzZSBMaWNlbnNlXShodHRwczovL21hcmttaWtrZWxzZW4uZ2l0aHViLmlvL0dhbm5ldC1kb2NzL2dhbm5ldC1saWNlbnNlLmh0bWwpLiBTaG91bGQgeW91IGRpc3NlbWluYXRlIG1hdGVyaWFsIHRoYXQgbWFkZSB1c2Ugb2YgR2FubmV0LCBwbGVhc2UgY2l0ZSB0aGUgZm9sbG93aW5nIHB1YmxpY2F0aW9ucywgYXMgYXBwcm9wcmlhdGU6CgotIEVkZGVuIFJBRSwgUHV0cyBOQUosIEhhcnJpcyBBRCwgQmFya2VyIFBCLCBFdmFucyBDSi4gPGEgaHJlZj0iaHR0cHM6Ly9kb2kub3JnLzEwLjEwMDIvam1yaS4yNDQ3OCIgdGFyZ2V0PSJfYmxhbmsiPkdhbm5ldDogQSBiYXRjaC1wcm9jZXNzaW5nIHRvb2wgZm9yIHRoZSBxdWFudGl0YXRpdmUgYW5hbHlzaXMgb2YgZ2FtbWEtYW1pbm9idXR5cmljIGFjaWQtZWRpdGVkIE1SIHNwZWN0cm9zY29weSBzcGVjdHJhLjwvYT4gKkpvdXJuYWwgb2YgTWFnbmV0aWMgUmVzb25hbmNlIEltYWdpbmcqLiAyMDE0OzQwKDYpOjE0NDUtLTE0NTIKCioqSWYgeW91IHBlcmZvcm0gZnJlcXVlbmN5LWFuZC1waGFzZSBjb3JyZWN0aW9uIChGUEMpIHVzaW5nOioqCgpSb2J1c3Qgc3BlY3RyYWwgcmVnaXN0cmF0aW9uIChgUm9idXN0U3BlY1JlZ2ApOgoKLSBNaWtrZWxzZW4gTSwgVGFwcGVyIFMsIE5lYXIgSiwgTW9zdG9mc2t5IFNILCBQdXRzIE5BSiwgRWRkZW4gUkFFLiA8YSBocmVmPSJodHRwczovL2RvaS5vcmcvMTAuMTAwMi9uYm0uNDM2OCIgdGFyZ2V0PSJfYmxhbmsiPkNvcnJlY3RpbmcgZnJlcXVlbmN5IGFuZCBwaGFzZSBvZmZzZXRzIGluIE1SUyBkYXRhIHVzaW5nIHJvYnVzdCBzcGVjdHJhbCByZWdpc3RyYXRpb24uPC9hPiAqTk1SIGluIEJpb21lZGljaW5lKi4gMjAyMDszMygxMCk6ZTQzNjgKCm11bHRpLXN0ZXAgRlBDIChgU3BlY1JlZ0hFUk1FU2ApOgoKLSBNaWtrZWxzZW4gTSwgU2FsZWggTUcsIE5lYXIgSiwgZXQgYWwuIDxhIGhyZWY9Imh0dHBzOi8vZG9pLm9yZy8xMC4xMDAyL21ybS4yNzAyNyIgdGFyZ2V0PSJfYmxhbmsiPkZyZXF1ZW5jeSBhbmQgcGhhc2UgY29ycmVjdGlvbiBmb3IgbXVsdGlwbGV4ZWQgZWRpdGVkIE1SUyBvZiBHQUJBIGFuZCBnbHV0YXRoaW9uZS48L2E+ICpNYWduZXRpYyBSZXNvbmFuY2UgaW4gTWVkaWNpbmUqLiAyMDE4OzgwKDEpOjIxLS0yOAoKb3Igc3BlY3RyYWwgcmVnaXN0cmF0aW9uIChgU3BlY1JlZ2ApOgoKLSBOZWFyIEosIEVkZGVuIFIsIEV2YW5zIENKLCBQYXF1aW4gUiwgSGFycmlzIEEsIEplenphcmQgUC4gPGEgaHJlZj0iaHR0cHM6Ly9kb2kub3JnLzEwLjEwMDIvbXJtLjI1MDk0IiB0YXJnZXQ9Il9ibGFuayI+RnJlcXVlbmN5IGFuZCBwaGFzZSBkcmlmdCBjb3JyZWN0aW9uIG9mIG1hZ25ldGljIHJlc29uYW5jZSBzcGVjdHJvc2NvcHkgZGF0YSBieSBzcGVjdHJhbCByZWdpc3RyYXRpb24gaW4gdGhlIHRpbWUgZG9tYWluLjwvYT4gKk1hZ25ldGljIFJlc29uYW5jZSBpbiBNZWRpY2luZSouIDIwMTU7NzMoMSk6NDQtLTUwCgoqKklmIHlvdSBwZXJmb3JtIHZveGVsIGNvLXJlZ2lzdHJhdGlvbjoqKgoKLSBQbGVhc2UgYWNrbm93bGVkZ2UgdGhlIHVzZSBvZiBTUE0xMi4gWW91IG1heSBhbHNvIGxpbmsvY2l0ZSB0aGUgPGEgaHJlZj0iaHR0cHM6Ly93d3cuZmlsLmlvbi51Y2wuYWMudWsvc3BtL3NvZnR3YXJlL3NwbTEyLyIgdGFyZ2V0PSJfYmxhbmsiPlNQTTEyIHdlYnNpdGU8L2E+LgoKKipJZiB5b3UgcGVyZm9ybSB0aXNzdWUgc2VnbWVudGF0aW9uOioqCgotIEFzaGJ1cm5lciBKLCBGcmlzdG9uIEtKLiA8YSBocmVmPSJodHRwczovL2RvaS5vcmcvMTAuMTAxNi9qLm5ldXJvaW1hZ2UuMjAwNS4wMi4wMTgiIHRhcmdldD0iX2JsYW5rIj5VbmlmaWVkIHNlZ21lbnRhdGlvbi48L2E+ICpOZXVyb0ltYWdlKi4gMjAwNTsyNigzKTo4MzktLTg1MQoKKipJZiB5b3UgcmVwb3J0IHdhdGVyLXJlZmVyZW5jZWQsIHRpc3N1ZS1jb3JyZWN0ZWQgbWV0YWJvbGl0ZSBtZWFzdXJlbWVudHMgdXNpbmc6KioKClRoZSBIYXJyaXMgZXQgYWwuIG1ldGhvZDoKCi0gSGFycmlzIEFELCBQdXRzIE5BSiwgRWRkZW4gUkFFLiA8YSBocmVmPSJodHRwczovL2RvaS5vcmcvMTAuMTAwMi9qbXJpLjI0OTAzIiB0YXJnZXQ9Il9ibGFuayI+VGlzc3VlIGNvcnJlY3Rpb24gZm9yIEdBQkEtZWRpdGVkIE1SUzogQ29uc2lkZXJhdGlvbnMgb2Ygdm94ZWwgY29tcG9zaXRpb24sIHRpc3N1ZSBzZWdtZW50YXRpb24sIGFuZCB0aXNzdWUgcmVsYXhhdGlvbnMuPC9hPiAqSm91cm5hbCBvZiBNYWduZXRpYyBSZXNvbmFuY2UgSW1hZ2luZyouIDIwMTU7NDIoNSk6MTQzMS0tMTQ0MAoKb3IgdGhlIEdhc3Bhcm92aWMgZXQgYWwuIG1ldGhvZDoKCi0gR2FzcGFyb3ZpYyBDLCBTb25nIFQsIERldmllciBELCBldCBhbC4gPGEgaHJlZj0iaHR0cHM6Ly9kb2kub3JnLzEwLjEwMDIvbXJtLjIwOTAxIiB0YXJnZXQ9Il9ibGFuayI+VXNlIG9mIHRpc3N1ZSB3YXRlciBhcyBhIGNvbmNlbnRyYXRpb24gcmVmZXJlbmNlIGZvciBwcm90b24gc3BlY3Ryb3Njb3BpYyBpbWFnaW5nLjwvYT4gKk1hZ25ldGljIFJlc29uYW5jZSBpbiBNZWRpY2luZSouIDIwMDY7NTUoNik6MTIxOS0tMTIyNgoKIyMgQWNrbm93bGVkZ21lbnRzCgpUaGUgZGV2ZWxvcG1lbnQgYW5kIGRpc3NlbWluYXRpb24gb2YgR2FubmV0IGhhcyBiZWVuIHN1cHBvcnRlZCBieSB0aGUgZm9sbG93aW5nIE5JSCBncmFudHM6CgotIFIwMSBFQjAxNjA4OQotIFIwMSBFQjAyMzk2MwotIFA0MSBFQjAxNTkwOQotIEs5OSBFQjAyODgyOAotIFIwMSBNSDEwNjU2NAotIFIyMSBNSDA5ODIyOAotIFIyMSBOUzA3NzMwMAotIFIwMSBNSDA5NjI2MwoKV2Ugd2lzaCB0byB0aGFuayB0aGUgZm9sbG93aW5nIGluZGl2aWR1YWxzIGZvciB0aGVpciBkaXJlY3Qgb3IgaW5kaXJlY3QgY29udHJpYnV0aW9uczoKCi0gWWFpciBBbHRtYW4gKFVuZG9jdW1lbnRlZCBNYXRsYWIpCi0gUGV0ZXIgQmFya2VyIChKb2hucyBIb3BraW5zIFVuaXZlcnNpdHkpCi0gQWxleCBDcmF2ZW4gKFVuaXZlcnNpdHkgb2YgQmVyZ2VuKQotIFBoaWxpcHAgRWhzZXMgKE1heCBQbGFuY2sgSW5zdGl0dXRlIGZvciBCaW9sb2dpY2FsIEN5YmVybmV0aWNzKQotIFJvYmluIGRlIEdyYWFmIChZYWxlIFNjaG9vbCBvZiBNZWRpY2luZSkKLSBYaWFuZ3J1aSBMaSAoT2hpbyBTdGF0ZSBVbml2ZXJzaXR5KQotIEphbWllIE5lYXIgKE1jR2lsbCBVbml2ZXJzaXR5KQotIFJhbHBoIE5vZXNrZSAoR0UgSGVhbHRoY2FyZSkKLSBXb3V0ZXIgUG90dGVycyAoVU1DIEFtc3RlcmRhbSkKLSBKYW4gU2ltb24gKEhlaWRlbGJlcmcpCgoKCg==


Built with R Markdown in RStudio

Copyright © 2020–2024, Mark Mikkelsen