In addition to the five core modules, Gannet comes with a few additional tools that you may find useful.

PaperPlot

PaperPlot.m will plot the difference spectra saved in the Gannet output structure. The corresponding model fits optionally can also be plotted. Users can choose to plot a single spectrum, a select number of spectra, all spectra, or an average of all spectra with or without the standard deviation. Multiple spectra will be overlaid in the same figure. If data were acquired with HERMES, then each Hadamard-combined difference spectrum will be plotted in a separate subplot.

Type help PaperPlot in the MATLAB command window for usage instructions.

To export plots at publication quality, consider using PaperPlot.m with Yair Altman’s excellent export_fig MATLAB toolbox. This toolbox is bundled with Gannet.

Example usage

metab = {'S01_GABA_68_act.sdat'
         'S02_GABA_68_act.sdat'
         'S03_GABA_68_act.sdat'};
water = {'S01_GABA_68_ref.sdat'
         'S02_GABA_68_ref.sdat'
         'S03_GABA_68_ref.sdat'};

MRS = GannetLoad(metab, water);
MRS = GannetFit(MRS);

PaperPlot(MRS); % Use default settings

Example output of PaperPlot.m

PaperPlot(MRS, 'plotModel', true); % Overlay fit models

Example output of PaperPlot.m

PaperPlot(MRS, 'plotModel', true, 'freqLim', [2 4.25]); % Overlay fit models and
                                                        % set ppm limits to 2-4.25

Example output of PaperPlot.m

De-identification

MRI examinations involving human volunteers routinely store sensitive protected health information (PHI) and personally identifiable information (PII) in the exported data files. It is of vital importance to protect volunteers’ privacy. To comply with privacy legislation, you need to ensure that the data you handle, process, and share is appropriately and thoroughly de-identified, i.e., stripped of all PHI/PII that allows the data to be linked to an individual. This is particularly critical if you intend to share data outside your institution.

Gannet includes several functions to remove PHI/PII from the most commonly used file formats. Currently, we offer functions to remove PHI/PII from GE P-files (*.7), Siemens TWIX (*.dat), Philips (*.sdat/*.spar), and generic DICOM (*.dcm) files. We plan to add support for other formats in the future.

Please contact us if you require a de-identification tool for a different format.

Please note the following:

  • Gannet does not remove PHI/PII from filenames; this is solely your responsibility.
  • In addition to any PHI/PII in the header of structural image files, they need to be defaced as well. Please use a skull-stripping tool (such as the one implemented in FSL) or a defacing tool (e.g., pydeface).
  • Per our software license, the Gannet developers are not liable for any failure of our de-identification routines to remove PHI/PII from your data.

How to de-identify your files

The Gannet de-identification functions create de-identified copies of the original data. The original files are not overwritten.

GE P-files, Siemens TWIX, and Philips SDAT

For GE P-files (*.7), Siemens TWIX (*.dat), and Philips (*.sdat/*.spar) files, the Gannet functions GEDeIdentify.m, TWIXDeIdentify.m, and PhilipsDeIdentify.m create de-identified copies of the respective files, appended with _noID. All three functions can either be run by themselves (without any input arguments) to de-identify all relevant files within the current directory or given a cell array of filenames that you want to de-identify.

DICOM

Generic DICOM data usually feature many separate *.dcm files for each acquisition. DICOMDeIdentify.m requires a top-level directory containing subdirectories for each subject (e.g. S01/, S02/, S03/, etc.) that contain all DICOM files for the respective subjects. Running DICOMDeIdentify.m from the top-level directory will create a separate directory containing the de-identified files for each subject, appended with _anon.

List of PHI identifiers

The Gannet de-identification functions currently remove PHI/PII identifiers defined by the United States Health Insurance Portability and Accountability Act (HIPAA) Privacy Rule. These include, but are not limited to:

  • Names
  • Addresses
  • Dates, including birth date and examination date
  • Medical record numbers
  • Device identifiers and serial numbers

Should the regulations in your country or institution require additional information to be removed, please contact us.

  There is no way to retrieve PHI/PII from a de-identified file! Make sure that you either retain a copy of the original file or that you keep a separate record that uniquely links all necessary subject information to the de-identified file.

CoRegStandAlone

Gannet has a standalone routine for voxel co-registration and segmentation that can be utilized with any single-voxel MRS dataset, including non-edited data. CoRegStandAlone.m contains simplified versions of GannetLoad.m, GannetCoRegister.m, and GannetSegment.m to parse geometrical information about voxel dimensions, positions, and rotations.

CoRegStandAlone.m supports the same input formats as the main Gannet modules. Upon being called, it produces GannetCoRegister and GannetSegment outputs for each provided dataset. However, the GannetSegment output does not contain any quantitative information, except for tissue composition (voxel tissue fractions of GM, WM, and CSF).

The syntax is similar to GannetLoad.m syntax, where the first cell array contains the MRS filenames and the second cell array contains the respective NIfTI filenames:

MRS_struct = CoRegStandAlone({'data1.dat', 'data2.dat'}, {'structural1.nii', 'structural2.nii'});

Please note that the number of NIfTI files needs to match the number of MRS data files; i.e., if you want to register N voxels to the same structural image, you’ll need to replicate the name of the NIfTI file N times.

LS0tCnRpdGxlOiAiQWRkaXRpb25hbCB0b29scyIKZGF0ZTogIkxhc3QgdXBkYXRlZDogYHIgZm9ybWF0KFN5cy50aW1lKCksICclQiAlZCwgJVknKWAiCm91dHB1dDoKICBodG1sX2RvY3VtZW50OgogICAgdG9jOiBUUlVFCiAgICB0b2NfZGVwdGg6IDMKICAgIHRvY19mbG9hdDoKICAgICAgY29sbGFwc2VkOiBGQUxTRQotLS0KCmBgYHtyIHNldHVwLCBpbmNsdWRlID0gRkFMU0V9CmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkKYGBgCgpgYGB7ciwgY2hpbGQgPSAianMvYmFjay10by10b3AuanMifQpgYGAKCjxicj4KCkluIGFkZGl0aW9uIHRvIHRoZSBmaXZlIGNvcmUgbW9kdWxlcywgR2FubmV0IGNvbWVzIHdpdGggYSBmZXcgYWRkaXRpb25hbCB0b29scyB0aGF0IHlvdSBtYXkgZmluZCB1c2VmdWwuCgojIyBQYXBlclBsb3QKCmBQYXBlclBsb3QubWAgd2lsbCBwbG90IHRoZSBkaWZmZXJlbmNlIHNwZWN0cmEgc2F2ZWQgaW4gdGhlIEdhbm5ldCBvdXRwdXQgc3RydWN0dXJlLiBUaGUgY29ycmVzcG9uZGluZyBtb2RlbCBmaXRzIG9wdGlvbmFsbHkgY2FuIGFsc28gYmUgcGxvdHRlZC4gVXNlcnMgY2FuIGNob29zZSB0byBwbG90IGEgc2luZ2xlIHNwZWN0cnVtLCBhIHNlbGVjdCBudW1iZXIgb2Ygc3BlY3RyYSwgYWxsIHNwZWN0cmEsIG9yIGFuIGF2ZXJhZ2Ugb2YgYWxsIHNwZWN0cmEgd2l0aCBvciB3aXRob3V0IHRoZSBzdGFuZGFyZCBkZXZpYXRpb24uIE11bHRpcGxlIHNwZWN0cmEgd2lsbCBiZSBvdmVybGFpZCBpbiB0aGUgc2FtZSBmaWd1cmUuIElmIGRhdGEgd2VyZSBhY3F1aXJlZCB3aXRoIEhFUk1FUywgdGhlbiBlYWNoIEhhZGFtYXJkLWNvbWJpbmVkIGRpZmZlcmVuY2Ugc3BlY3RydW0gd2lsbCBiZSBwbG90dGVkIGluIGEgc2VwYXJhdGUgc3VicGxvdC4KClR5cGUgYGhlbHAgUGFwZXJQbG90YCBpbiB0aGUgTUFUTEFCIGNvbW1hbmQgd2luZG93IGZvciB1c2FnZSBpbnN0cnVjdGlvbnMuCgpUbyBleHBvcnQgcGxvdHMgYXQgcHVibGljYXRpb24gcXVhbGl0eSwgY29uc2lkZXIgdXNpbmcgYFBhcGVyUGxvdC5tYCB3aXRoIFlhaXIgQWx0bWFuJ3MgZXhjZWxsZW50IDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9hbHRtYW55L2V4cG9ydF9maWcvIiB0YXJnZXQ9Il9ibGFuayI+ZXhwb3J0X2ZpZzwvYT4gTUFUTEFCIHRvb2xib3guIFRoaXMgdG9vbGJveCBpcyBidW5kbGVkIHdpdGggR2FubmV0LgoKIyMjIEV4YW1wbGUgdXNhZ2UKCmBgYHtvY3RhdmUsIGV2YWwgPSBGQUxTRX0KbWV0YWIgPSB7J1MwMV9HQUJBXzY4X2FjdC5zZGF0JwogICAgICAgICAnUzAyX0dBQkFfNjhfYWN0LnNkYXQnCiAgICAgICAgICdTMDNfR0FCQV82OF9hY3Quc2RhdCd9Owp3YXRlciA9IHsnUzAxX0dBQkFfNjhfcmVmLnNkYXQnCiAgICAgICAgICdTMDJfR0FCQV82OF9yZWYuc2RhdCcKICAgICAgICAgJ1MwM19HQUJBXzY4X3JlZi5zZGF0J307CgpNUlMgPSBHYW5uZXRMb2FkKG1ldGFiLCB3YXRlcik7Ck1SUyA9IEdhbm5ldEZpdChNUlMpOwoKUGFwZXJQbG90KE1SUyk7ICUgVXNlIGRlZmF1bHQgc2V0dGluZ3MKYGBgCgo8aW1nIGlkPSJpbWdfNzUiIHNyYz0iaW1hZ2VzL2FkZGl0aW9uYWwtdG9vbHMvcGFwZXJwbG90LTEucG5nIiBhbHQ9IkV4YW1wbGUgb3V0cHV0IG9mIFBhcGVyUGxvdC5tIj4KCmBgYHtvY3RhdmUsIGV2YWwgPSBGQUxTRX0KUGFwZXJQbG90KE1SUywgJ3Bsb3RNb2RlbCcsIHRydWUpOyAlIE92ZXJsYXkgZml0IG1vZGVscwpgYGAKCjxpbWcgaWQ9ImltZ183NSIgc3JjPSJpbWFnZXMvYWRkaXRpb25hbC10b29scy9wYXBlcnBsb3QtMi5wbmciIGFsdD0iRXhhbXBsZSBvdXRwdXQgb2YgUGFwZXJQbG90Lm0iPgoKYGBge29jdGF2ZSwgZXZhbCA9IEZBTFNFfQpQYXBlclBsb3QoTVJTLCAncGxvdE1vZGVsJywgdHJ1ZSwgJ2ZyZXFMaW0nLCBbMiA0LjI1XSk7ICUgT3ZlcmxheSBmaXQgbW9kZWxzIGFuZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUgc2V0IHBwbSBsaW1pdHMgdG8gMi00LjI1CmBgYAoKPGltZyBpZD0iaW1nXzc1IiBzcmM9ImltYWdlcy9hZGRpdGlvbmFsLXRvb2xzL3BhcGVycGxvdC0zLnBuZyIgYWx0PSJFeGFtcGxlIG91dHB1dCBvZiBQYXBlclBsb3QubSI+CgojIyBEZS1pZGVudGlmaWNhdGlvbgoKTVJJIGV4YW1pbmF0aW9ucyBpbnZvbHZpbmcgaHVtYW4gdm9sdW50ZWVycyByb3V0aW5lbHkgc3RvcmUgc2Vuc2l0aXZlIHByb3RlY3RlZCBoZWFsdGggaW5mb3JtYXRpb24gKFBISSkgYW5kIHBlcnNvbmFsbHkgaWRlbnRpZmlhYmxlIGluZm9ybWF0aW9uIChQSUkpIGluIHRoZSBleHBvcnRlZCBkYXRhIGZpbGVzLiBJdCBpcyBvZiB2aXRhbCBpbXBvcnRhbmNlIHRvIHByb3RlY3Qgdm9sdW50ZWVyc+KAmSBwcml2YWN5LiBUbyBjb21wbHkgd2l0aCBwcml2YWN5IGxlZ2lzbGF0aW9uLCB5b3UgbmVlZCB0byBlbnN1cmUgdGhhdCB0aGUgZGF0YSB5b3UgaGFuZGxlLCBwcm9jZXNzLCBhbmQgc2hhcmUgaXMgYXBwcm9wcmlhdGVseSBhbmQgdGhvcm91Z2hseSBkZS1pZGVudGlmaWVkLCBpLmUuLCBzdHJpcHBlZCBvZiBhbGwgUEhJL1BJSSB0aGF0IGFsbG93cyB0aGUgZGF0YSB0byBiZSBsaW5rZWQgdG8gYW4gaW5kaXZpZHVhbC4gVGhpcyBpcyBwYXJ0aWN1bGFybHkgY3JpdGljYWwgaWYgeW91IGludGVuZCB0byBzaGFyZSBkYXRhIG91dHNpZGUgeW91ciBpbnN0aXR1dGlvbi4KCkdhbm5ldCBpbmNsdWRlcyBzZXZlcmFsIGZ1bmN0aW9ucyB0byByZW1vdmUgUEhJL1BJSSBmcm9tIHRoZSBtb3N0IGNvbW1vbmx5IHVzZWQgZmlsZSBmb3JtYXRzLiBDdXJyZW50bHksIHdlIG9mZmVyIGZ1bmN0aW9ucyB0byByZW1vdmUgUEhJL1BJSSBmcm9tIEdFIFAtZmlsZXMgKFwqLjcpLCBTaWVtZW5zIFRXSVggKFwqLmRhdCksIFBoaWxpcHMgKFwqLnNkYXQvXCouc3BhciksIGFuZCBnZW5lcmljIERJQ09NIChcKi5kY20pIGZpbGVzLiBXZSBwbGFuIHRvIGFkZCBzdXBwb3J0IGZvciBvdGhlciBmb3JtYXRzIGluIHRoZSBmdXR1cmUuCgpQbGVhc2UgPGEgaHJlZj0ibWFpbHRvOm1hbTQwNDFAbWVkLmNvcm5lbGwuZWR1P3N1YmplY3Q9W0dhbm5ldF0lMjA8UGxlYXNlIGVudGVyIHRoZSBzdWJqZWN0IG9mIHlvdXIgcXVlcnkgaGVyZT4iIHRhcmdldD0iX2JsYW5rIj5jb250YWN0IHVzPC9hPiBpZiB5b3UgcmVxdWlyZSBhIGRlLWlkZW50aWZpY2F0aW9uIHRvb2wgZm9yIGEgZGlmZmVyZW50IGZvcm1hdC4KClBsZWFzZSBub3RlIHRoZSBmb2xsb3dpbmc6Cgo6Ojogd2FybmluZwo8aSBjbGFzcz0iZmEgZmEtZXhjbGFtYXRpb24tY2lyY2xlIiBzdHlsZT0iY29sb3I6IHdoaXRlIj48L2k+Cjx1bD4KICA8bGk+R2FubmV0IGRvZXMgbm90IHJlbW92ZSBQSEkvUElJIGZyb20gZmlsZW5hbWVzOyB0aGlzIGlzIHNvbGVseSB5b3VyIHJlc3BvbnNpYmlsaXR5LjwvbGk+CiAgPGxpPkluIGFkZGl0aW9uIHRvIGFueSBQSEkvUElJIGluIHRoZSBoZWFkZXIgb2Ygc3RydWN0dXJhbCBpbWFnZSBmaWxlcywgdGhleSBuZWVkIHRvIGJlIGRlZmFjZWQgYXMgd2VsbC4gUGxlYXNlIHVzZSBhIHNrdWxsLXN0cmlwcGluZyB0b29sIChzdWNoIGFzIHRoZSBvbmUgaW1wbGVtZW50ZWQgaW4gRlNMKSBvciBhIGRlZmFjaW5nIHRvb2wgKGUuZy4sIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9wb2xkcmFja2xhYi9weWRlZmFjZSIgdGFyZ2V0PSJfYmxhbmsiIHN0eWxlPSJjb2xvcjp3aGl0ZSI+PHU+cHlkZWZhY2U8L3U+PC9hPikuPC9saT4KICA8bGk+UGVyIG91ciA8YSBocmVmPSJodHRwczovL21hcmttaWtrZWxzZW4uZ2l0aHViLmlvL0dhbm5ldC1kb2NzL2dhbm5ldC1saWNlbnNlLmh0bWwiIHRhcmdldD0iX2JsYW5rIiBzdHlsZT0iY29sb3I6d2hpdGUiPjx1PnNvZnR3YXJlIGxpY2Vuc2U8L3U+PC9hPiwgdGhlIEdhbm5ldCBkZXZlbG9wZXJzIGFyZSBub3QgbGlhYmxlIGZvciBhbnkgZmFpbHVyZSBvZiBvdXIgZGUtaWRlbnRpZmljYXRpb24gcm91dGluZXMgdG8gcmVtb3ZlIFBISS9QSUkgZnJvbSB5b3VyIGRhdGEuPC9saT4KPC91bD4KOjo6CgojIyMgSG93IHRvIGRlLWlkZW50aWZ5IHlvdXIgZmlsZXMKClRoZSBHYW5uZXQgZGUtaWRlbnRpZmljYXRpb24gZnVuY3Rpb25zIGNyZWF0ZSBkZS1pZGVudGlmaWVkIGNvcGllcyBvZiB0aGUgb3JpZ2luYWwgZGF0YS4gVGhlIG9yaWdpbmFsIGZpbGVzIGFyZSBub3Qgb3ZlcndyaXR0ZW4uCgo8dT5HRSBQLWZpbGVzLCBTaWVtZW5zIFRXSVgsIGFuZCBQaGlsaXBzIFNEQVQ8L3U+CgpGb3IgR0UgUC1maWxlcyAoXCouNyksIFNpZW1lbnMgVFdJWCAoXCouZGF0KSwgYW5kIFBoaWxpcHMgKFwqLnNkYXQvXCouc3BhcikgZmlsZXMsIHRoZSBHYW5uZXQgZnVuY3Rpb25zIGBHRURlSWRlbnRpZnkubWAsIGBUV0lYRGVJZGVudGlmeS5tYCwgYW5kIGBQaGlsaXBzRGVJZGVudGlmeS5tYCBjcmVhdGUgZGUtaWRlbnRpZmllZCBjb3BpZXMgb2YgdGhlIHJlc3BlY3RpdmUgZmlsZXMsIGFwcGVuZGVkIHdpdGggYF9ub0lEYC4gQWxsIHRocmVlIGZ1bmN0aW9ucyBjYW4gZWl0aGVyIGJlIHJ1biBieSB0aGVtc2VsdmVzICh3aXRob3V0IGFueSBpbnB1dCBhcmd1bWVudHMpIHRvIGRlLWlkZW50aWZ5IGFsbCByZWxldmFudCBmaWxlcyB3aXRoaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5IG9yIGdpdmVuIGEgY2VsbCBhcnJheSBvZiBmaWxlbmFtZXMgdGhhdCB5b3Ugd2FudCB0byBkZS1pZGVudGlmeS4KCjx1PkRJQ09NPC91PgoKR2VuZXJpYyBESUNPTSBkYXRhIHVzdWFsbHkgZmVhdHVyZSBtYW55IHNlcGFyYXRlIFwqLmRjbSBmaWxlcyBmb3IgZWFjaCBhY3F1aXNpdGlvbi4gYERJQ09NRGVJZGVudGlmeS5tYCByZXF1aXJlcyBhIHRvcC1sZXZlbCBkaXJlY3RvcnkgY29udGFpbmluZyBzdWJkaXJlY3RvcmllcyBmb3IgZWFjaCBzdWJqZWN0IChlLmcuIGBTMDEvYCwgYFMwMi9gLCBgUzAzL2AsIGV0Yy4pIHRoYXQgY29udGFpbiBhbGwgRElDT00gZmlsZXMgZm9yIHRoZSByZXNwZWN0aXZlIHN1YmplY3RzLiBSdW5uaW5nIGBESUNPTURlSWRlbnRpZnkubWAgZnJvbSB0aGUgdG9wLWxldmVsIGRpcmVjdG9yeSB3aWxsIGNyZWF0ZSBhIHNlcGFyYXRlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBkZS1pZGVudGlmaWVkIGZpbGVzIGZvciBlYWNoIHN1YmplY3QsIGFwcGVuZGVkIHdpdGggYF9hbm9uYC4KCiMjIyBMaXN0IG9mIFBISSBpZGVudGlmaWVycwoKVGhlIEdhbm5ldCBkZS1pZGVudGlmaWNhdGlvbiBmdW5jdGlvbnMgY3VycmVudGx5IHJlbW92ZSBQSEkvUElJIGlkZW50aWZpZXJzIGRlZmluZWQgYnkgdGhlIDxhIGhyZWY9Imh0dHBzOi8vd3d3Lmhocy5nb3YvaGlwYWEvZm9yLXByb2Zlc3Npb25hbHMvcHJpdmFjeS9zcGVjaWFsLXRvcGljcy9kZS1pZGVudGlmaWNhdGlvbi9pbmRleC5odG1sIiB0YXJnZXQ9Il9ibGFuayI+VW5pdGVkIFN0YXRlcyBIZWFsdGggSW5zdXJhbmNlIFBvcnRhYmlsaXR5IGFuZCBBY2NvdW50YWJpbGl0eSBBY3QgKEhJUEFBKSBQcml2YWN5IFJ1bGU8L2E+LiBUaGVzZSBpbmNsdWRlLCBidXQgYXJlIG5vdCBsaW1pdGVkIHRvOgoKLSBOYW1lcwotIEFkZHJlc3NlcwotIERhdGVzLCBpbmNsdWRpbmcgYmlydGggZGF0ZSBhbmQgZXhhbWluYXRpb24gZGF0ZQotIE1lZGljYWwgcmVjb3JkIG51bWJlcnMKLSBEZXZpY2UgaWRlbnRpZmllcnMgYW5kIHNlcmlhbCBudW1iZXJzCgpTaG91bGQgdGhlIHJlZ3VsYXRpb25zIGluIHlvdXIgY291bnRyeSBvciBpbnN0aXR1dGlvbiByZXF1aXJlIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gdG8gYmUgcmVtb3ZlZCwgcGxlYXNlIDxhIGhyZWY9Im1haWx0bzptYW00MDQxQG1lZC5jb3JuZWxsLmVkdT9zdWJqZWN0PVtHYW5uZXRdJTIwPFBsZWFzZSBlbnRlciB0aGUgc3ViamVjdCBvZiB5b3VyIHF1ZXJ5IGhlcmU+IiB0YXJnZXQ9Il9ibGFuayI+Y29udGFjdCB1czwvYT4uCgo6OjogZGFuZ2VyCjxpIGNsYXNzPSJmYSBmYS1leGNsYW1hdGlvbi10cmlhbmdsZSIgc3R5bGU9ImNvbG9yOiB3aGl0ZSI+PC9pPiZuYnNwOyBUaGVyZSBpcyA8dT5ubyB3YXk8L3U+IHRvIHJldHJpZXZlIFBISS9QSUkgZnJvbSBhIGRlLWlkZW50aWZpZWQgZmlsZSEgTWFrZSBzdXJlIHRoYXQgeW91IGVpdGhlciByZXRhaW4gYSBjb3B5IG9mIHRoZSBvcmlnaW5hbCBmaWxlIG9yIHRoYXQgeW91IGtlZXAgYSBzZXBhcmF0ZSByZWNvcmQgdGhhdCB1bmlxdWVseSBsaW5rcyBhbGwgbmVjZXNzYXJ5IHN1YmplY3QgaW5mb3JtYXRpb24gdG8gdGhlIGRlLWlkZW50aWZpZWQgZmlsZS4KOjo6CgojIyBDb1JlZ1N0YW5kQWxvbmUKCkdhbm5ldCBoYXMgYSBzdGFuZGFsb25lIHJvdXRpbmUgZm9yIHZveGVsIGNvLXJlZ2lzdHJhdGlvbiBhbmQgc2VnbWVudGF0aW9uIHRoYXQgY2FuIGJlIHV0aWxpemVkIHdpdGggYW55IHNpbmdsZS12b3hlbCBNUlMgZGF0YXNldCwgaW5jbHVkaW5nIG5vbi1lZGl0ZWQgZGF0YS4gYENvUmVnU3RhbmRBbG9uZS5tYCBjb250YWlucyBzaW1wbGlmaWVkIHZlcnNpb25zIG9mIGBHYW5uZXRMb2FkLm1gLCBgR2FubmV0Q29SZWdpc3Rlci5tYCwgYW5kIGBHYW5uZXRTZWdtZW50Lm1gIHRvIHBhcnNlIGdlb21ldHJpY2FsIGluZm9ybWF0aW9uIGFib3V0IHZveGVsIGRpbWVuc2lvbnMsIHBvc2l0aW9ucywgYW5kIHJvdGF0aW9ucy4KCmBDb1JlZ1N0YW5kQWxvbmUubWAgc3VwcG9ydHMgdGhlIHNhbWUgaW5wdXQgZm9ybWF0cyBhcyB0aGUgbWFpbiBHYW5uZXQgbW9kdWxlcy4gVXBvbiBiZWluZyBjYWxsZWQsIGl0IHByb2R1Y2VzIEdhbm5ldENvUmVnaXN0ZXIgYW5kIEdhbm5ldFNlZ21lbnQgb3V0cHV0cyBmb3IgZWFjaCBwcm92aWRlZCBkYXRhc2V0LiBIb3dldmVyLCB0aGUgR2FubmV0U2VnbWVudCBvdXRwdXQgZG9lcyBub3QgY29udGFpbiBhbnkgcXVhbnRpdGF0aXZlIGluZm9ybWF0aW9uLCBleGNlcHQgZm9yIHRpc3N1ZSBjb21wb3NpdGlvbiAodm94ZWwgdGlzc3VlIGZyYWN0aW9ucyBvZiBHTSwgV00sIGFuZCBDU0YpLgoKVGhlIHN5bnRheCBpcyBzaW1pbGFyIHRvIGBHYW5uZXRMb2FkLm1gIHN5bnRheCwgd2hlcmUgdGhlIGZpcnN0IGNlbGwgYXJyYXkgY29udGFpbnMgdGhlIE1SUyBmaWxlbmFtZXMgYW5kIHRoZSBzZWNvbmQgY2VsbCBhcnJheSBjb250YWlucyB0aGUgcmVzcGVjdGl2ZSBOSWZUSSBmaWxlbmFtZXM6CgpgYGB7b2N0YXZlLCBldmFsID0gRkFMU0V9Ck1SU19zdHJ1Y3QgPSBDb1JlZ1N0YW5kQWxvbmUoeydkYXRhMS5kYXQnLCAnZGF0YTIuZGF0J30sIHsnc3RydWN0dXJhbDEubmlpJywgJ3N0cnVjdHVyYWwyLm5paSd9KTsKYGBgCgpQbGVhc2Ugbm90ZSB0aGF0IHRoZSBudW1iZXIgb2YgTklmVEkgZmlsZXMgbmVlZHMgdG8gbWF0Y2ggdGhlIG51bWJlciBvZiBNUlMgZGF0YSBmaWxlczsgaS5lLiwgaWYgeW91IHdhbnQgdG8gcmVnaXN0ZXIgX05fIHZveGVscyB0byB0aGUgc2FtZSBzdHJ1Y3R1cmFsIGltYWdlLCB5b3XigJlsbCBuZWVkIHRvIHJlcGxpY2F0ZSB0aGUgbmFtZSBvZiB0aGUgTklmVEkgZmlsZSBfTl8gdGltZXMuCgoKCg==


Built with R Markdown in RStudio

Copyright © 2020–2024, Mark Mikkelsen