The variables listed on this page are applicable to releases 3.3.0+ and are not necessarily correct for older versions of Gannet.

Pre-initializing Gannet


Parent function

GannetPreInitialise.m


Acquisition parameters Description
target Sets the metabolite of interest that was edited in the MRS experiment; if HERMES or HERCULES was used, multiple metabolites should be selected
seqorig Origin of the Philips MEGA-PRESS or GE HERMES sequences
Analysis parameters Description
LB Sets the amount of exponential line-broadening to apply to the data (in Hz)
water_ECC Whether to perform an eddy-current correction1 on the water data
metab_ECC Whether to perform an eddy-current correction on the metabolite data
water_removal Whether to remove the residual water signal from the difference spectra using an HSVD filter2
alignment Which method to use for shot-to-shot frequency-and-phase correction36
use_prealign_ref In some cases, using RobustSpecReg to align HERMES/HERCULES data can result in worse alignment compared to the pre-aligned data; setting this parameter to 1 will make RobustSpecReg use the averaged pre-aligned subspectra as references to align the averaged post-aligned subspectra, which may improve the final alignment; this has not be tested extensively
fit_resid_water Whether to model the residual water signal in the difference spectrum; used to calculate a water suppression factor
weighted_averaging Whether to average the data using weighted averaging; the default approach use is mean-squared error, but other approaches can be set in SignalAveraging.m
Flags Description
HERMES Set to 1 if the data were acquired using HERMES
HERCULES Set to 1 if the data were acquired using HERCULES (HERMES must also be set to 1)
PRIAM Set to 1 if the data were acquired using PRIAM
phantom Set to 1 if the data were acquired in a phantom
join Set to 1 to join multiple files (this can be batched across subjects)
mat Set to 1 to save the output structure as a MAT-file
csv Set to 1 to export a CSV file containing useful data for statistical analysis (applies to GannetFit.m, GannetSegment.m and GannetQuantify.m)
append Set to 1 to append PDF outputs into one PDF (separately for each module) (requires export_fig/ in the Gannet/ directory to be added to the search path and Ghostscript to be installed on the user’s machine (NB: macOS users should use this version or use Homebrew to install Ghostscript)
hide Set to 1 to not display output figures

Loading & preprocessing


Parent function

GannetLoad.m


Example usage:

MRS_struct = GannetLoad({'S01_GABA_68_act.sdat'}, {'S01_GABA_68_ref.sdat'});

Output:

A screenshot example of GannetLoad output

  1. Edited difference spectra before and after frequency and phase alignment. Users should look out for poor alignment and signal distortions from lipid contamination or ghosting artifacts7.

  2. The observed frequency of either the residual water signal or 3 ppm Cr peak on a average-by-average basis. Users can use this panel to check for participant motion and/or scanner-related frequency drift. The solid black line is the nominal water or 3 ppm Cr frequency, while the dashed lines represent +/-1 standard deviation of population-level frequency offsets observed in the Big GABA study8. In other words, frequency shifts beyond these limits indicates above-average offsets that should be of concern to data fidelity.

  3. A spectrogram of the 3 ppm Cr signal average by average before and after frequency and phase alignment. These data complement the data shown in panel B by additionally showing spectral distortions in each average.

  4. Textual details of the data and processing procedures. When “n/a - wgt. avg. used” is shown for “Rejects”, this means the data were averaged using weighted averaging, which down-weights bad (i.e., “rejected”) averages.


Signal fitting


Parent function

GannetFit.m


Example usage:

MRS_struct = GannetLoad({'S01_GABA_68_act.sdat'}, {'S01_GABA_68_ref.sdat'});
MRS_struct = GannetFit(MRS_struct);

Output:

A screenshot example of GannetFit output

  1. Edited difference spectrum (spectra) with fitted model function(s) overlaid. The fit residuals are also shown. NB: When modeling the GABA peak, Gannet applies weights to the residual Cho signal data points at 3.16 to 3.285 ppm. This improves fitting of the GABA peak when there are subtraction artifacts.

  2. Reference spectra (water and Cr) with fitted model functions overlaid. The fit residuals are also shown. If no water reference data was given during data loading, only Cr is shown.

  3. Textual results from GannetFit (full details can be found on the Data quality metrics page). For the metabolites listed:

    • Area is the integrated signal (in arbitrary units) of the peaks shown
    • Linewidth is the full-width, half-maximum (FWHM) (in Hz)
    • SNR is defined as the signal model amplitude divided by twice the standard deviation of noise
    • Fit error is defined as the standard deviation of residuals divided by the signal model amplitude multiplied by 100
    • Quantification details can be found on the Quantification & tissue correction page.

Voxel co-registration


Parent function

GannetCoRegister.m


Example usage:

MRS_struct = GannetLoad({'S01_GABA_68_act.sdat'}, {'S01_GABA_68_ref.sdat'});
MRS_struct = GannetFit(MRS_struct);
MRS_struct = GannetCoRegister(MRS_struct, {'S01_struc.nii'});

Output:

A screenshot example of GannetCoRegister output

  1. Co-registration of the MRS voxel on the corresponding structural MR image. The three orthogonal slices are shown at the voxel center.

  2. Textual details of the voxel geometry.


Tissue segmentation


Parent function

GannetSegment.m


Example usage:

MRS_struct = GannetLoad({'S01_GABA_68_act.sdat'}, {'S01_GABA_68_ref.sdat'});
MRS_struct = GannetFit(MRS_struct);
MRS_struct = GannetCoRegister(MRS_struct, {'S01_struc.nii'});
MRS_struct = GannetSegment(MRS_struct);

Output:

A screenshot example of GannetSegment output

  1. Axial view of the probabilistic voxel tissue segmentation maps for grey matter (GM), white matter (WM), and cerebrospinal fluid (CSF).

  2. Textual details of the CSF-corrected metabolites values (see Quantification & tissue correction for further details) and the voxel tissue volume fractions.


Quantification


Parent function

GannetQuantify.m


Example usage:

MRS_struct = GannetLoad({'S01_GABA_68_act.sdat'}, {'S01_GABA_68_ref.sdat'});
MRS_struct = GannetFit(MRS_struct);
MRS_struct = GannetCoRegister(MRS_struct, {'S01_struc.nii'});
MRS_struct = GannetSegment(MRS_struct);
MRS_struct = GannetQuantify(MRS_struct);

Output:

A screenshot example of GannetQuantify output

  1. Axial view of the probabilistic voxel tissue segmentation maps for grey matter (GM), white matter (WM), and cerebrospinal fluid (CSF).

  2. Edited difference spectrum (spectra) with fitted model function(s) overlaid.

  3. Textual details of tissue-corrected metabolite values (see Quantification & tissue correction for further details).


References

1.
Klose U. In vivo proton spectroscopy in presence of eddy currents. Magnetic Resonance in Medicine. 1990;14(1):26-30. doi:10.1002/mrm.1910140104
2.
Barkhuijsen H, Beer R de, Ormondt D van. Improved algorithm for noniterative time-domain model fitting to exponentially damped magnetic resonance signals. Journal of Magnetic Resonance. 1987;73(3):553-557. doi:10.1016/0022-2364(87)90023-0
3.
Evans CJ, Puts NAJ, Robson SE, et al. Subtraction artifacts and frequency (Mis-)alignment in J-difference GABA editing. Journal of Magnetic Resonance Imaging. 2013;38(4):970-975. doi:10.1002/jmri.23923
4.
Near J, Edden R, Evans CJ, Paquin R, Harris A, Jezzard P. Frequency and phase drift correction of magnetic resonance spectroscopy data by spectral registration in the time domain. Magnetic Resonance in Medicine. 2015;73(1):44-50. doi:10.1002/mrm.25094
5.
Mikkelsen M, Saleh MG, Near J, et al. Frequency and phase correction for multiplexed edited MRS of GABA and glutathione. Magnetic Resonance in Medicine. 2018;80(1):21-28. doi:10.1002/mrm.27027
6.
Mikkelsen M, Tapper S, Near J, Mostofsky SH, Puts NAJ, Edden RAE. Correcting frequency and phase offsets in MRS data using robust spectral registration. NMR in Biomedicine. 2020;33(10):e4368. doi:10.1002/nbm.4368
7.
Kreis R. Issues of spectral quality in clinical1H-magnetic resonance spectroscopy and a gallery of artifacts. NMR in Biomedicine. 2004;17(6):361-381. doi:10.1002/nbm.891
8.
Mikkelsen M, Barker PB, Bhattacharyya PK, et al. Big GABA: Edited MR spectroscopy at 24 research sites. NeuroImage. 2017;159:32-45. doi:10.1016/j.neuroimage.2017.07.021
LS0tCnRpdGxlOiAiUmVmZXJlbmNlIgpkYXRlOiAiTGFzdCB1cGRhdGVkOiBgciBmb3JtYXQoU3lzLnRpbWUoKSwgJyVCICVkLCAlWScpYCIKYmlibGlvZ3JhcGh5OiBiaWJsaW9ncmFwaHkuYmliCmNzbDogYW1lcmljYW4tbWVkaWNhbC1hc3NvY2lhdGlvbi5jc2wKbGluay1jaXRhdGlvbnM6IHllcwpvdXRwdXQ6CiAgaHRtbF9kb2N1bWVudDoKICAgIHRvYzogVFJVRQogICAgdG9jX2RlcHRoOiAyCiAgICB0b2NfZmxvYXQ6CiAgICAgIGNvbGxhcHNlZDogRkFMU0UKLS0tCgpgYGB7ciBzZXR1cCwgaW5jbHVkZSA9IEZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUpCmBgYAoKYGBge3IsIGNoaWxkID0gImpzL2JhY2stdG8tdG9wLmpzIn0KYGBgCgo8YnI+Cgo6OjogaW5mbwo8aSBjbGFzcz0iZmEgZmEtaW5mby1jaXJjbGUiIHN0eWxlPSJjb2xvcjogd2hpdGUiPjwvaT4mbmJzcDsgVGhlIHZhcmlhYmxlcyBsaXN0ZWQgb24gdGhpcyBwYWdlIGFyZSBhcHBsaWNhYmxlIHRvIHJlbGVhc2VzIDMuMy4wKyBhbmQgYXJlIG5vdCBuZWNlc3NhcmlseSBjb3JyZWN0IGZvciBvbGRlciB2ZXJzaW9ucyBvZiBHYW5uZXQuCjo6OgoKIyMgUHJlLWluaXRpYWxpemluZyBHYW5uZXQKCjxicj4KCioqUGFyZW50IGZ1bmN0aW9uKioKCmBHYW5uZXRQcmVJbml0aWFsaXNlLm1gCgo8YnI+Cgp8IDx1PkFjcXVpc2l0aW9uIHBhcmFtZXRlcnM8L3U+IHwgPHU+RGVzY3JpcHRpb248L3U+IHwKfDotLS0tLS0tLS0tLS0tLS0tLS18Oi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CnwgYHRhcmdldGAgfCBTZXRzIHRoZSBtZXRhYm9saXRlIG9mIGludGVyZXN0IHRoYXQgd2FzIGVkaXRlZCBpbiB0aGUgTVJTIGV4cGVyaW1lbnQ7IGlmIEhFUk1FUyBvciBIRVJDVUxFUyB3YXMgdXNlZCwgbXVsdGlwbGUgbWV0YWJvbGl0ZXMgc2hvdWxkIGJlIHNlbGVjdGVkIHwKfCBgc2Vxb3JpZ2AgfCBPcmlnaW4gb2YgdGhlIFBoaWxpcHMgTUVHQS1QUkVTUyBvciBHRSBIRVJNRVMgc2VxdWVuY2VzIHwKCnwgPHU+QW5hbHlzaXMgcGFyYW1ldGVyczwvdT4gfCA8dT5EZXNjcmlwdGlvbjwvdT4gfAp8Oi0tLS0tLS0tLS0tLS0tLS0tLXw6LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKfCBgTEJgIHwgU2V0cyB0aGUgYW1vdW50IG9mIGV4cG9uZW50aWFsIGxpbmUtYnJvYWRlbmluZyB0byBhcHBseSB0byB0aGUgZGF0YSAoaW4gSHopICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKfCBgd2F0ZXJfRUNDYCB8IFdoZXRoZXIgdG8gcGVyZm9ybSBhbiBlZGR5LWN1cnJlbnQgY29ycmVjdGlvbiBbQEtsb3NlMTk5MF0gb24gdGhlIHdhdGVyIGRhdGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CnwgYG1ldGFiX0VDQ2AgfCBXaGV0aGVyIHRvIHBlcmZvcm0gYW4gZWRkeS1jdXJyZW50IGNvcnJlY3Rpb24gb24gdGhlIG1ldGFib2xpdGUgZGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAp8IGB3YXRlcl9yZW1vdmFsYCB8IFdoZXRoZXIgdG8gcmVtb3ZlIHRoZSByZXNpZHVhbCB3YXRlciBzaWduYWwgZnJvbSB0aGUgZGlmZmVyZW5jZSBzcGVjdHJhIHVzaW5nIGFuIEhTVkQgZmlsdGVyIFtAQmFya2h1aWpzZW4xOTg3XSAgICAgICB8CnwgYGFsaWdubWVudGAgfCBXaGljaCBtZXRob2QgdG8gdXNlIGZvciBzaG90LXRvLXNob3QgZnJlcXVlbmN5LWFuZC1waGFzZSBjb3JyZWN0aW9uIFtARXZhbnMyMDEzOyBATmVhcjIwMTU7IEBNaWtrZWxzZW4yMDE4OyBATWlra2Vsc2VuMjAyMF0gfAp8IGB1c2VfcHJlYWxpZ25fcmVmYCB8IEluIHNvbWUgY2FzZXMsIHVzaW5nIGBSb2J1c3RTcGVjUmVnYCB0byBhbGlnbiBIRVJNRVMvSEVSQ1VMRVMgZGF0YSBjYW4gcmVzdWx0IGluIHdvcnNlIGFsaWdubWVudCBjb21wYXJlZCB0byB0aGUgcHJlLWFsaWduZWQgZGF0YTsgc2V0dGluZyB0aGlzIHBhcmFtZXRlciB0byAxIHdpbGwgbWFrZSBgUm9idXN0U3BlY1JlZ2AgdXNlIHRoZSBhdmVyYWdlZCBwcmUtYWxpZ25lZCBzdWJzcGVjdHJhIGFzIHJlZmVyZW5jZXMgdG8gYWxpZ24gdGhlIGF2ZXJhZ2VkIHBvc3QtYWxpZ25lZCBzdWJzcGVjdHJhLCB3aGljaCBtYXkgaW1wcm92ZSB0aGUgZmluYWwgYWxpZ25tZW50OyB0aGlzIGhhcyBub3QgYmUgdGVzdGVkIGV4dGVuc2l2ZWx5IHwKfCBgZml0X3Jlc2lkX3dhdGVyYCB8IFdoZXRoZXIgdG8gbW9kZWwgdGhlIHJlc2lkdWFsIHdhdGVyIHNpZ25hbCBpbiB0aGUgZGlmZmVyZW5jZSBzcGVjdHJ1bTsgdXNlZCB0byBjYWxjdWxhdGUgYSB3YXRlciBzdXBwcmVzc2lvbiBmYWN0b3IgfAp8IGB3ZWlnaHRlZF9hdmVyYWdpbmdgIHwgV2hldGhlciB0byBhdmVyYWdlIHRoZSBkYXRhIHVzaW5nIHdlaWdodGVkIGF2ZXJhZ2luZzsgdGhlIGRlZmF1bHQgYXBwcm9hY2ggdXNlIGlzIG1lYW4tc3F1YXJlZCBlcnJvciwgYnV0IG90aGVyIGFwcHJvYWNoZXMgY2FuIGJlIHNldCBpbiBgU2lnbmFsQXZlcmFnaW5nLm1gIHwKCnwgPHU+RmxhZ3M8L3U+IHwgPHU+RGVzY3JpcHRpb248L3U+IHwKfDotLS0tLS0tLS0tLS0tLS0tLS18Oi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CnwgYEhFUk1FU2AgICB8IFNldCB0byBgMWAgaWYgdGhlIGRhdGEgd2VyZSBhY3F1aXJlZCB1c2luZyBIRVJNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKfCBgSEVSQ1VMRVNgIHwgU2V0IHRvIGAxYCBpZiB0aGUgZGF0YSB3ZXJlIGFjcXVpcmVkIHVzaW5nIEhFUkNVTEVTIChgSEVSTUVTYCBtdXN0IGFsc28gYmUgc2V0IHRvIGAxYCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAp8IGBQUklBTWAgICAgfCBTZXQgdG8gYDFgIGlmIHRoZSBkYXRhIHdlcmUgYWNxdWlyZWQgdXNpbmcgUFJJQU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CnwgYHBoYW50b21gICB8IFNldCB0byBgMWAgaWYgdGhlIGRhdGEgd2VyZSBhY3F1aXJlZCBpbiBhIHBoYW50b20gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKfCBgam9pbmAgICAgIHwgU2V0IHRvIGAxYCB0byBqb2luIG11bHRpcGxlIGZpbGVzICh0aGlzIGNhbiBiZSBiYXRjaGVkIGFjcm9zcyBzdWJqZWN0cykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAp8IGBtYXRgICAgICAgfCBTZXQgdG8gYDFgIHRvIHNhdmUgdGhlIG91dHB1dCBzdHJ1Y3R1cmUgYXMgYSBNQVQtZmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CnwgYGNzdmAgICAgICB8IFNldCB0byBgMWAgdG8gZXhwb3J0IGEgQ1NWIGZpbGUgY29udGFpbmluZyB1c2VmdWwgZGF0YSBmb3Igc3RhdGlzdGljYWwgYW5hbHlzaXMgKGFwcGxpZXMgdG8gYEdhbm5ldEZpdC5tYCwgYEdhbm5ldFNlZ21lbnQubWAgYW5kIGBHYW5uZXRRdWFudGlmeS5tYCkgfAp8IGBhcHBlbmRgICAgfCBTZXQgdG8gYDFgIHRvIGFwcGVuZCBQREYgb3V0cHV0cyBpbnRvIG9uZSBQREYgKHNlcGFyYXRlbHkgZm9yIGVhY2ggbW9kdWxlKSAocmVxdWlyZXMgYGV4cG9ydF9maWcvYCBpbiB0aGUgYEdhbm5ldC9gIGRpcmVjdG9yeSB0byBiZSBhZGRlZCB0byB0aGUgc2VhcmNoIHBhdGggYW5kIDxhIGhyZWY9Imh0dHBzOi8vd3d3Lmdob3N0c2NyaXB0LmNvbS8iIHRhcmdldD0iX2JsYW5rIj5HaG9zdHNjcmlwdDwvYT4gdG8gYmUgaW5zdGFsbGVkIG9uIHRoZSB1c2VyJ3MgbWFjaGluZSAoTkI6IG1hY09TIHVzZXJzIHNob3VsZCB1c2UgPGEgaHJlZj0iaHR0cHM6Ly9wYWdlcy51b3JlZ29uLmVkdS9rb2NoLyIgdGFyZ2V0PSJfYmxhbmsiPnRoaXMgdmVyc2lvbjwvYT4gb3IgdXNlIDxhIGhyZWY9Imh0dHBzOi8vZm9ybXVsYWUuYnJldy5zaC9mb3JtdWxhL2dob3N0c2NyaXB0IiB0YXJnZXQ9Il9ibGFuayI+SG9tZWJyZXc8L2E+IHRvIGluc3RhbGwgR2hvc3RzY3JpcHQpIHwKfCBgaGlkZWAgICAgIHwgU2V0IHRvIGAxYCB0byBub3QgZGlzcGxheSBvdXRwdXQgZmlndXJlcyB8CgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIExvYWRpbmcgJiBwcmVwcm9jZXNzaW5nCgo8YnI+CgoqKlBhcmVudCBmdW5jdGlvbioqCgpgR2FubmV0TG9hZC5tYAoKPGJyPgoKKipFeGFtcGxlIHVzYWdlOioqCgpgYGB7b2N0YXZlLCBldmFsID0gRkFMU0V9Ck1SU19zdHJ1Y3QgPSBHYW5uZXRMb2FkKHsnUzAxX0dBQkFfNjhfYWN0LnNkYXQnfSwgeydTMDFfR0FCQV82OF9yZWYuc2RhdCd9KTsKYGBgCgpPdXRwdXQ6Cgo8aW1nIHNyYz0iaW1hZ2VzL3JlZmVyZW5jZS9HYW5uZXRMb2FkLWV4YW1wbGUucG5nIiBhbHQ9IkEgc2NyZWVuc2hvdCBleGFtcGxlIG9mIEdhbm5ldExvYWQgb3V0cHV0Ij4KCkEpIEVkaXRlZCBkaWZmZXJlbmNlIHNwZWN0cmEgYmVmb3JlIGFuZCBhZnRlciBmcmVxdWVuY3kgYW5kIHBoYXNlIGFsaWdubWVudC4gVXNlcnMgc2hvdWxkIGxvb2sgb3V0IGZvciBwb29yIGFsaWdubWVudCBhbmQgc2lnbmFsIGRpc3RvcnRpb25zIGZyb20gbGlwaWQgY29udGFtaW5hdGlvbiBvciBnaG9zdGluZyBhcnRpZmFjdHMgW0BLcmVpczIwMDRdLgoKQikgVGhlIG9ic2VydmVkIGZyZXF1ZW5jeSBvZiBlaXRoZXIgdGhlIHJlc2lkdWFsIHdhdGVyIHNpZ25hbCBvciAzIHBwbSBDciBwZWFrIG9uIGEgYXZlcmFnZS1ieS1hdmVyYWdlIGJhc2lzLiBVc2VycyBjYW4gdXNlIHRoaXMgcGFuZWwgdG8gY2hlY2sgZm9yIHBhcnRpY2lwYW50IG1vdGlvbiBhbmQvb3Igc2Nhbm5lci1yZWxhdGVkIGZyZXF1ZW5jeSBkcmlmdC4gVGhlIHNvbGlkIGJsYWNrIGxpbmUgaXMgdGhlIG5vbWluYWwgd2F0ZXIgb3IgMyBwcG0gQ3IgZnJlcXVlbmN5LCB3aGlsZSB0aGUgZGFzaGVkIGxpbmVzIHJlcHJlc2VudCArLy0xIHN0YW5kYXJkIGRldmlhdGlvbiBvZiBwb3B1bGF0aW9uLWxldmVsIGZyZXF1ZW5jeSBvZmZzZXRzIG9ic2VydmVkIGluIHRoZSBCaWcgR0FCQSBzdHVkeSBbQE1pa2tlbHNlbjIwMTddLiBJbiBvdGhlciB3b3JkcywgZnJlcXVlbmN5IHNoaWZ0cyBiZXlvbmQgdGhlc2UgbGltaXRzIGluZGljYXRlcyBhYm92ZS1hdmVyYWdlIG9mZnNldHMgdGhhdCBzaG91bGQgYmUgb2YgY29uY2VybiB0byBkYXRhIGZpZGVsaXR5LgoKQykgQSBzcGVjdHJvZ3JhbSBvZiB0aGUgMyBwcG0gQ3Igc2lnbmFsIGF2ZXJhZ2UgYnkgYXZlcmFnZSBiZWZvcmUgYW5kIGFmdGVyIGZyZXF1ZW5jeSBhbmQgcGhhc2UgYWxpZ25tZW50LiBUaGVzZSBkYXRhIGNvbXBsZW1lbnQgdGhlIGRhdGEgc2hvd24gaW4gcGFuZWwgQiBieSBhZGRpdGlvbmFsbHkgc2hvd2luZyBzcGVjdHJhbCBkaXN0b3J0aW9ucyBpbiBlYWNoIGF2ZXJhZ2UuCgpEKSBUZXh0dWFsIGRldGFpbHMgb2YgdGhlIGRhdGEgYW5kIHByb2Nlc3NpbmcgcHJvY2VkdXJlcy4gV2hlbiAibi9hIC0gd2d0LiBhdmcuIHVzZWQiIGlzIHNob3duIGZvciAiUmVqZWN0cyIsIHRoaXMgbWVhbnMgdGhlIGRhdGEgd2VyZSBhdmVyYWdlZCB1c2luZyB3ZWlnaHRlZCBhdmVyYWdpbmcsIHdoaWNoIGRvd24td2VpZ2h0cyBiYWQgKGkuZS4sICJyZWplY3RlZCIpIGF2ZXJhZ2VzLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBTaWduYWwgZml0dGluZwoKPGJyPgoKKipQYXJlbnQgZnVuY3Rpb24qKgoKYEdhbm5ldEZpdC5tYAoKPGJyPgoKKipFeGFtcGxlIHVzYWdlOioqCgpgYGB7b2N0YXZlLCBldmFsID0gRkFMU0V9Ck1SU19zdHJ1Y3QgPSBHYW5uZXRMb2FkKHsnUzAxX0dBQkFfNjhfYWN0LnNkYXQnfSwgeydTMDFfR0FCQV82OF9yZWYuc2RhdCd9KTsKTVJTX3N0cnVjdCA9IEdhbm5ldEZpdChNUlNfc3RydWN0KTsKYGBgCgpPdXRwdXQ6Cgo8aW1nIHNyYz0iaW1hZ2VzL3JlZmVyZW5jZS9HYW5uZXRGaXQtZXhhbXBsZS5wbmciIGFsdD0iQSBzY3JlZW5zaG90IGV4YW1wbGUgb2YgR2FubmV0Rml0IG91dHB1dCI+CgpBKSBFZGl0ZWQgZGlmZmVyZW5jZSBzcGVjdHJ1bSAoc3BlY3RyYSkgd2l0aCBmaXR0ZWQgbW9kZWwgZnVuY3Rpb24ocykgb3ZlcmxhaWQuIFRoZSBmaXQgcmVzaWR1YWxzIGFyZSBhbHNvIHNob3duLiBOQjogV2hlbiBtb2RlbGluZyB0aGUgR0FCQSBwZWFrLCBHYW5uZXQgYXBwbGllcyB3ZWlnaHRzIHRvIHRoZSByZXNpZHVhbCBDaG8gc2lnbmFsIGRhdGEgcG9pbnRzIGF0IDMuMTYgdG8gMy4yODUgcHBtLiBUaGlzIGltcHJvdmVzIGZpdHRpbmcgb2YgdGhlIEdBQkEgcGVhayB3aGVuIHRoZXJlIGFyZSBzdWJ0cmFjdGlvbiBhcnRpZmFjdHMuCgpCKSBSZWZlcmVuY2Ugc3BlY3RyYSAod2F0ZXIgYW5kIENyKSB3aXRoIGZpdHRlZCBtb2RlbCBmdW5jdGlvbnMgb3ZlcmxhaWQuIFRoZSBmaXQgcmVzaWR1YWxzIGFyZSBhbHNvIHNob3duLiBJZiBubyB3YXRlciByZWZlcmVuY2UgZGF0YSB3YXMgZ2l2ZW4gZHVyaW5nIGRhdGEgbG9hZGluZywgb25seSBDciBpcyBzaG93bi4KCkMpIFRleHR1YWwgcmVzdWx0cyBmcm9tIEdhbm5ldEZpdCAoZnVsbCBkZXRhaWxzIGNhbiBiZSBmb3VuZCBvbiB0aGUgW0RhdGEgcXVhbGl0eSBtZXRyaWNzXShodHRwczovL21hcmttaWtrZWxzZW4uZ2l0aHViLmlvL0dhbm5ldC1kb2NzL2RhdGEtcXVhbGl0eS1tZXRyaWNzLmh0bWwpIHBhZ2UpLiBGb3IgdGhlIG1ldGFib2xpdGVzIGxpc3RlZDoKICAgIC0gQXJlYSBpcyB0aGUgaW50ZWdyYXRlZCBzaWduYWwgKGluIGFyYml0cmFyeSB1bml0cykgb2YgdGhlIHBlYWtzIHNob3duCiAgICAtIExpbmV3aWR0aCBpcyB0aGUgZnVsbC13aWR0aCwgaGFsZi1tYXhpbXVtIChGV0hNKSAoaW4gSHopCiAgICAtIFNOUiBpcyBkZWZpbmVkIGFzIHRoZSBzaWduYWwgbW9kZWwgYW1wbGl0dWRlIGRpdmlkZWQgYnkgdHdpY2UgdGhlIHN0YW5kYXJkIGRldmlhdGlvbiBvZiBub2lzZQogICAgLSBGaXQgZXJyb3IgaXMgZGVmaW5lZCBhcyB0aGUgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIHJlc2lkdWFscyBkaXZpZGVkIGJ5IHRoZSBzaWduYWwgbW9kZWwgYW1wbGl0dWRlIG11bHRpcGxpZWQgYnkgMTAwCiAgICAtIFF1YW50aWZpY2F0aW9uIGRldGFpbHMgY2FuIGJlIGZvdW5kIG9uIHRoZSBbUXVhbnRpZmljYXRpb24gJiB0aXNzdWUgY29ycmVjdGlvbl0oaHR0cHM6Ly9tYXJrbWlra2Vsc2VuLmdpdGh1Yi5pby9HYW5uZXQtZG9jcy9xdWFudGlmaWNhdGlvbi10aXNzdWUtY29ycmVjdGlvbi5odG1sKSBwYWdlLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBWb3hlbCBjby1yZWdpc3RyYXRpb24KCjxicj4KCioqUGFyZW50IGZ1bmN0aW9uKioKCmBHYW5uZXRDb1JlZ2lzdGVyLm1gCgo8YnI+CgoqKkV4YW1wbGUgdXNhZ2U6KioKCmBgYHtvY3RhdmUsIGV2YWwgPSBGQUxTRX0KTVJTX3N0cnVjdCA9IEdhbm5ldExvYWQoeydTMDFfR0FCQV82OF9hY3Quc2RhdCd9LCB7J1MwMV9HQUJBXzY4X3JlZi5zZGF0J30pOwpNUlNfc3RydWN0ID0gR2FubmV0Rml0KE1SU19zdHJ1Y3QpOwpNUlNfc3RydWN0ID0gR2FubmV0Q29SZWdpc3RlcihNUlNfc3RydWN0LCB7J1MwMV9zdHJ1Yy5uaWknfSk7CmBgYAoKT3V0cHV0OgoKPGltZyBzcmM9ImltYWdlcy9yZWZlcmVuY2UvR2FubmV0Q29SZWdpc3Rlci1leGFtcGxlLnBuZyIgYWx0PSJBIHNjcmVlbnNob3QgZXhhbXBsZSBvZiBHYW5uZXRDb1JlZ2lzdGVyIG91dHB1dCI+CgpBKSBDby1yZWdpc3RyYXRpb24gb2YgdGhlIE1SUyB2b3hlbCBvbiB0aGUgY29ycmVzcG9uZGluZyBzdHJ1Y3R1cmFsIE1SIGltYWdlLiBUaGUgdGhyZWUgb3J0aG9nb25hbCBzbGljZXMgYXJlIHNob3duIGF0IHRoZSB2b3hlbCBjZW50ZXIuCgpCKSBUZXh0dWFsIGRldGFpbHMgb2YgdGhlIHZveGVsIGdlb21ldHJ5LgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBUaXNzdWUgc2VnbWVudGF0aW9uCgo8YnI+CgoqKlBhcmVudCBmdW5jdGlvbioqCgpgR2FubmV0U2VnbWVudC5tYAoKPGJyPgoKKipFeGFtcGxlIHVzYWdlOioqCgpgYGB7b2N0YXZlLCBldmFsID0gRkFMU0V9Ck1SU19zdHJ1Y3QgPSBHYW5uZXRMb2FkKHsnUzAxX0dBQkFfNjhfYWN0LnNkYXQnfSwgeydTMDFfR0FCQV82OF9yZWYuc2RhdCd9KTsKTVJTX3N0cnVjdCA9IEdhbm5ldEZpdChNUlNfc3RydWN0KTsKTVJTX3N0cnVjdCA9IEdhbm5ldENvUmVnaXN0ZXIoTVJTX3N0cnVjdCwgeydTMDFfc3RydWMubmlpJ30pOwpNUlNfc3RydWN0ID0gR2FubmV0U2VnbWVudChNUlNfc3RydWN0KTsKYGBgCgpPdXRwdXQ6Cgo8aW1nIHNyYz0iaW1hZ2VzL3JlZmVyZW5jZS9HYW5uZXRTZWdtZW50LWV4YW1wbGUucG5nIiBhbHQ9IkEgc2NyZWVuc2hvdCBleGFtcGxlIG9mIEdhbm5ldFNlZ21lbnQgb3V0cHV0Ij4KCkEpIEF4aWFsIHZpZXcgb2YgdGhlIHByb2JhYmlsaXN0aWMgdm94ZWwgdGlzc3VlIHNlZ21lbnRhdGlvbiBtYXBzIGZvciBncmV5IG1hdHRlciAoR00pLCB3aGl0ZSBtYXR0ZXIgKFdNKSwgYW5kIGNlcmVicm9zcGluYWwgZmx1aWQgKENTRikuCgpCKSBUZXh0dWFsIGRldGFpbHMgb2YgdGhlIENTRi1jb3JyZWN0ZWQgbWV0YWJvbGl0ZXMgdmFsdWVzIChzZWUgW1F1YW50aWZpY2F0aW9uICYgdGlzc3VlIGNvcnJlY3Rpb25dKGh0dHBzOi8vbWFya21pa2tlbHNlbi5naXRodWIuaW8vR2FubmV0LWRvY3MvcXVhbnRpZmljYXRpb24tdGlzc3VlLWNvcnJlY3Rpb24uaHRtbCkgZm9yIGZ1cnRoZXIgZGV0YWlscykgYW5kIHRoZSB2b3hlbCB0aXNzdWUgdm9sdW1lIGZyYWN0aW9ucy4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMgUXVhbnRpZmljYXRpb24KCjxicj4KCioqUGFyZW50IGZ1bmN0aW9uKioKCmBHYW5uZXRRdWFudGlmeS5tYAoKPGJyPgoKKipFeGFtcGxlIHVzYWdlOioqCgpgYGB7b2N0YXZlLCBldmFsID0gRkFMU0V9Ck1SU19zdHJ1Y3QgPSBHYW5uZXRMb2FkKHsnUzAxX0dBQkFfNjhfYWN0LnNkYXQnfSwgeydTMDFfR0FCQV82OF9yZWYuc2RhdCd9KTsKTVJTX3N0cnVjdCA9IEdhbm5ldEZpdChNUlNfc3RydWN0KTsKTVJTX3N0cnVjdCA9IEdhbm5ldENvUmVnaXN0ZXIoTVJTX3N0cnVjdCwgeydTMDFfc3RydWMubmlpJ30pOwpNUlNfc3RydWN0ID0gR2FubmV0U2VnbWVudChNUlNfc3RydWN0KTsKTVJTX3N0cnVjdCA9IEdhbm5ldFF1YW50aWZ5KE1SU19zdHJ1Y3QpOwpgYGAKCk91dHB1dDoKCjxpbWcgc3JjPSJpbWFnZXMvcmVmZXJlbmNlL0dhbm5ldFF1YW50aWZ5LWV4YW1wbGUucG5nIiBhbHQ9IkEgc2NyZWVuc2hvdCBleGFtcGxlIG9mIEdhbm5ldFF1YW50aWZ5IG91dHB1dCI+CgpBKSBBeGlhbCB2aWV3IG9mIHRoZSBwcm9iYWJpbGlzdGljIHZveGVsIHRpc3N1ZSBzZWdtZW50YXRpb24gbWFwcyBmb3IgZ3JleSBtYXR0ZXIgKEdNKSwgd2hpdGUgbWF0dGVyIChXTSksIGFuZCBjZXJlYnJvc3BpbmFsIGZsdWlkIChDU0YpLgoKQikgIEVkaXRlZCBkaWZmZXJlbmNlIHNwZWN0cnVtIChzcGVjdHJhKSB3aXRoIGZpdHRlZCBtb2RlbCBmdW5jdGlvbihzKSBvdmVybGFpZC4KCkMpIFRleHR1YWwgZGV0YWlscyBvZiB0aXNzdWUtY29ycmVjdGVkIG1ldGFib2xpdGUgdmFsdWVzIChzZWUgW1F1YW50aWZpY2F0aW9uICYgdGlzc3VlIGNvcnJlY3Rpb25dKGh0dHBzOi8vbWFya21pa2tlbHNlbi5naXRodWIuaW8vR2FubmV0LWRvY3MvcXVhbnRpZmljYXRpb24tdGlzc3VlLWNvcnJlY3Rpb24uaHRtbCkgZm9yIGZ1cnRoZXIgZGV0YWlscykuCgo8YnI+CgojIyMgUmVmZXJlbmNlcwoKCgo=


Built with R Markdown in RStudio

Copyright © 2020–2024, Mark Mikkelsen