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
target |
Sets the metabolite of interest that was edited in the
MRS experiment; if HERMES or HERCULES was used, multiple metabolites
should be selected |
ON_OFF_order |
Gannet automatically determines the order of editing
pulses, but a usesr may manually input the order with this
parameter |
seqorig |
Origin of the Philips MEGA-PRESS or GE HERMES
sequences |
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 correction3–6 |
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 |
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) |
normalize |
Set to 1 to create voxel masks normalized
to MNI152 space |
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:

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.
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.
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.
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:

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.
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.
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:

Co-registration of the MRS voxel on the corresponding structural
MR image. The three orthogonal slices are shown at the voxel
center.
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:

Axial view of the probabilistic voxel tissue segmentation maps
for grey matter (GM), white matter (WM), and cerebrospinal fluid
(CSF).
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:

Axial view of the probabilistic voxel tissue segmentation maps
for grey matter (GM), white matter (WM), and cerebrospinal fluid
(CSF).
Edited difference spectrum (spectra) with fitted model
function(s) overlaid.
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 (1969). 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 clinical 1 H‐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
LS0tCnRpdGxlOiAiUmVmZXJlbmNlIgpkYXRlOiAiTGFzdCB1cGRhdGVkOiBgciBmb3JtYXQoU3lzLnRpbWUoKSwgJyVCICVkLCAlWScpYCIKYmlibGlvZ3JhcGh5OiBiaWJsaW9ncmFwaHkuYmliCmNzbDogYW1lcmljYW4tbWVkaWNhbC1hc3NvY2lhdGlvbi5jc2wKbGluay1jaXRhdGlvbnM6IHllcwpvdXRwdXQ6CiAgaHRtbF9kb2N1bWVudDoKICAgIHRvYzogVFJVRQogICAgdG9jX2RlcHRoOiAyCiAgICB0b2NfZmxvYXQ6CiAgICAgIGNvbGxhcHNlZDogRkFMU0UKLS0tCgpgYGB7ciBzZXR1cCwgaW5jbHVkZSA9IEZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUpCmBgYAoKYGBge3IsIGNoaWxkID0gYygianMvYmFjay10by10b3AuaHRtbCIsICJqcy9jb3B5LXRvLWNsaXBib2FyZC5odG1sIil9CmBgYAoKPGJyPgoKOjo6IGluZm8KPGkgY2xhc3M9ImZhIGZhLWluZm8tY2lyY2xlIiBzdHlsZT0iY29sb3I6IHdoaXRlIj48L2k+Jm5ic3A7IFRoZSB2YXJpYWJsZXMgbGlzdGVkIG9uIHRoaXMgcGFnZSBhcmUgYXBwbGljYWJsZSB0byByZWxlYXNlcyAzLjMuMCsgYW5kIGFyZSBub3QgbmVjZXNzYXJpbHkgY29ycmVjdCBmb3Igb2xkZXIgdmVyc2lvbnMgb2YgR2FubmV0Lgo6OjoKCiMjIFByZS1pbml0aWFsaXppbmcgR2FubmV0Cgo8YnI+CgoqKlBhcmVudCBmdW5jdGlvbioqCgpgR2FubmV0UHJlSW5pdGlhbGlzZS5tYAoKPGJyPgoKfCA8dT5BY3F1aXNpdGlvbiBwYXJhbWV0ZXJzPC91PiB8IDx1PkRlc2NyaXB0aW9uPC91PiB8Cnw6LS0tLS0tLS0tLS0tLS0tLS0tfDotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAp8IGB0YXJnZXRgIHwgU2V0cyB0aGUgbWV0YWJvbGl0ZSBvZiBpbnRlcmVzdCB0aGF0IHdhcyBlZGl0ZWQgaW4gdGhlIE1SUyBleHBlcmltZW50OyBpZiBIRVJNRVMgb3IgSEVSQ1VMRVMgd2FzIHVzZWQsIG11bHRpcGxlIG1ldGFib2xpdGVzIHNob3VsZCBiZSBzZWxlY3RlZCB8CnwgYE9OX09GRl9vcmRlcmAgfCBHYW5uZXQgYXV0b21hdGljYWxseSBkZXRlcm1pbmVzIHRoZSBvcmRlciBvZiBlZGl0aW5nIHB1bHNlcywgYnV0IGEgdXNlc3IgbWF5IG1hbnVhbGx5IGlucHV0IHRoZSBvcmRlciB3aXRoIHRoaXMgcGFyYW1ldGVyIHwKfCBgc2Vxb3JpZ2AgfCBPcmlnaW4gb2YgdGhlIFBoaWxpcHMgTUVHQS1QUkVTUyBvciBHRSBIRVJNRVMgc2VxdWVuY2VzIHwKCnwgPHU+QW5hbHlzaXMgcGFyYW1ldGVyczwvdT4gfCA8dT5EZXNjcmlwdGlvbjwvdT4gfAp8Oi0tLS0tLS0tLS0tLS0tLS0tLXw6LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKfCBgTEJgIHwgU2V0cyB0aGUgYW1vdW50IG9mIGV4cG9uZW50aWFsIGxpbmUtYnJvYWRlbmluZyB0byBhcHBseSB0byB0aGUgZGF0YSAoaW4gSHopICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKfCBgd2F0ZXJfRUNDYCB8IFdoZXRoZXIgdG8gcGVyZm9ybSBhbiBlZGR5LWN1cnJlbnQgY29ycmVjdGlvbiBbQEtsb3NlMTk5MF0gb24gdGhlIHdhdGVyIGRhdGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CnwgYG1ldGFiX0VDQ2AgfCBXaGV0aGVyIHRvIHBlcmZvcm0gYW4gZWRkeS1jdXJyZW50IGNvcnJlY3Rpb24gb24gdGhlIG1ldGFib2xpdGUgZGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAp8IGB3YXRlcl9yZW1vdmFsYCB8IFdoZXRoZXIgdG8gcmVtb3ZlIHRoZSByZXNpZHVhbCB3YXRlciBzaWduYWwgZnJvbSB0aGUgZGlmZmVyZW5jZSBzcGVjdHJhIHVzaW5nIGFuIEhTVkQgZmlsdGVyIFtAQmFya2h1aWpzZW4xOTg3XSAgICAgICB8CnwgYGFsaWdubWVudGAgfCBXaGljaCBtZXRob2QgdG8gdXNlIGZvciBzaG90LXRvLXNob3QgZnJlcXVlbmN5LWFuZC1waGFzZSBjb3JyZWN0aW9uIFtARXZhbnMyMDEzOyBATmVhcjIwMTU7IEBNaWtrZWxzZW4yMDE4OyBATWlra2Vsc2VuMjAyMF0gfAp8IGB1c2VfcHJlYWxpZ25fcmVmYCB8IEluIHNvbWUgY2FzZXMsIHVzaW5nIGBSb2J1c3RTcGVjUmVnYCB0byBhbGlnbiBIRVJNRVMvSEVSQ1VMRVMgZGF0YSBjYW4gcmVzdWx0IGluIHdvcnNlIGFsaWdubWVudCBjb21wYXJlZCB0byB0aGUgcHJlLWFsaWduZWQgZGF0YTsgc2V0dGluZyB0aGlzIHBhcmFtZXRlciB0byAxIHdpbGwgbWFrZSBgUm9idXN0U3BlY1JlZ2AgdXNlIHRoZSBhdmVyYWdlZCBwcmUtYWxpZ25lZCBzdWJzcGVjdHJhIGFzIHJlZmVyZW5jZXMgdG8gYWxpZ24gdGhlIGF2ZXJhZ2VkIHBvc3QtYWxpZ25lZCBzdWJzcGVjdHJhLCB3aGljaCBtYXkgaW1wcm92ZSB0aGUgZmluYWwgYWxpZ25tZW50OyB0aGlzIGhhcyBub3QgYmUgdGVzdGVkIGV4dGVuc2l2ZWx5IHwKfCBgZml0X3Jlc2lkX3dhdGVyYCB8IFdoZXRoZXIgdG8gbW9kZWwgdGhlIHJlc2lkdWFsIHdhdGVyIHNpZ25hbCBpbiB0aGUgZGlmZmVyZW5jZSBzcGVjdHJ1bTsgdXNlZCB0byBjYWxjdWxhdGUgYSB3YXRlciBzdXBwcmVzc2lvbiBmYWN0b3IgfAp8IGB3ZWlnaHRlZF9hdmVyYWdpbmdgIHwgV2hldGhlciB0byBhdmVyYWdlIHRoZSBkYXRhIHVzaW5nIHdlaWdodGVkIGF2ZXJhZ2luZzsgdGhlIGRlZmF1bHQgYXBwcm9hY2ggdXNlIGlzIG1lYW4tc3F1YXJlZCBlcnJvciwgYnV0IG90aGVyIGFwcHJvYWNoZXMgY2FuIGJlIHNldCBpbiBgU2lnbmFsQXZlcmFnaW5nLm1gIHwKCnwgPHU+RmxhZ3M8L3U+IHwgPHU+RGVzY3JpcHRpb248L3U+IHwKfDotLS0tLS0tLS0tLS0tLS0tLS18Oi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CnwgYEhFUk1FU2AgICB8IFNldCB0byBgMWAgaWYgdGhlIGRhdGEgd2VyZSBhY3F1aXJlZCB1c2luZyBIRVJNRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKfCBgSEVSQ1VMRVNgIHwgU2V0IHRvIGAxYCBpZiB0aGUgZGF0YSB3ZXJlIGFjcXVpcmVkIHVzaW5nIEhFUkNVTEVTIChgSEVSTUVTYCBtdXN0IGFsc28gYmUgc2V0IHRvIGAxYCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAp8IGBQUklBTWAgICAgfCBTZXQgdG8gYDFgIGlmIHRoZSBkYXRhIHdlcmUgYWNxdWlyZWQgdXNpbmcgUFJJQU0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CnwgYHBoYW50b21gICB8IFNldCB0byBgMWAgaWYgdGhlIGRhdGEgd2VyZSBhY3F1aXJlZCBpbiBhIHBoYW50b20gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKfCBgam9pbmAgICAgIHwgU2V0IHRvIGAxYCB0byBqb2luIG11bHRpcGxlIGZpbGVzICh0aGlzIGNhbiBiZSBiYXRjaGVkIGFjcm9zcyBzdWJqZWN0cykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAp8IGBtYXRgICAgICAgfCBTZXQgdG8gYDFgIHRvIHNhdmUgdGhlIG91dHB1dCBzdHJ1Y3R1cmUgYXMgYSBNQVQtZmlsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CnwgYGNzdmAgICAgICB8IFNldCB0byBgMWAgdG8gZXhwb3J0IGEgQ1NWIGZpbGUgY29udGFpbmluZyB1c2VmdWwgZGF0YSBmb3Igc3RhdGlzdGljYWwgYW5hbHlzaXMgKGFwcGxpZXMgdG8gYEdhbm5ldEZpdC5tYCwgYEdhbm5ldFNlZ21lbnQubWAgYW5kIGBHYW5uZXRRdWFudGlmeS5tYCkgfAp8IGBub3JtYWxpemVgIHwgU2V0IHRvIGAxYCB0byBjcmVhdGUgdm94ZWwgbWFza3Mgbm9ybWFsaXplZCB0byBNTkkxNTIgc3BhY2UgfAp8IGBhcHBlbmRgICAgfCBTZXQgdG8gYDFgIHRvIGFwcGVuZCBQREYgb3V0cHV0cyBpbnRvIG9uZSBQREYgKHNlcGFyYXRlbHkgZm9yIGVhY2ggbW9kdWxlKSAocmVxdWlyZXMgYGV4cG9ydF9maWcvYCBpbiB0aGUgYEdhbm5ldC9gIGRpcmVjdG9yeSB0byBiZSBhZGRlZCB0byB0aGUgc2VhcmNoIHBhdGggYW5kIDxhIGhyZWY9Imh0dHBzOi8vd3d3Lmdob3N0c2NyaXB0LmNvbS8iIHRhcmdldD0iX2JsYW5rIj5HaG9zdHNjcmlwdDwvYT4gdG8gYmUgaW5zdGFsbGVkIG9uIHRoZSB1c2VyJ3MgbWFjaGluZSAoTkI6IG1hY09TIHVzZXJzIHNob3VsZCB1c2UgPGEgaHJlZj0iaHR0cHM6Ly9wYWdlcy51b3JlZ29uLmVkdS9rb2NoLyIgdGFyZ2V0PSJfYmxhbmsiPnRoaXMgdmVyc2lvbjwvYT4gb3IgdXNlIDxhIGhyZWY9Imh0dHBzOi8vZm9ybXVsYWUuYnJldy5zaC9mb3JtdWxhL2dob3N0c2NyaXB0IiB0YXJnZXQ9Il9ibGFuayI+SG9tZWJyZXc8L2E+IHRvIGluc3RhbGwgR2hvc3RzY3JpcHQpIHwKfCBgaGlkZWAgICAgIHwgU2V0IHRvIGAxYCB0byBub3QgZGlzcGxheSBvdXRwdXQgZmlndXJlcyB8CgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiMjIExvYWRpbmcgJiBwcmVwcm9jZXNzaW5nCgo8YnI+CgoqKlBhcmVudCBmdW5jdGlvbioqCgpgR2FubmV0TG9hZC5tYAoKPGJyPgoKKipFeGFtcGxlIHVzYWdlOioqCgpgYGB7b2N0YXZlLCBldmFsID0gRkFMU0V9Ck1SU19zdHJ1Y3QgPSBHYW5uZXRMb2FkKHsnUzAxX0dBQkFfNjhfYWN0LnNkYXQnfSwgeydTMDFfR0FCQV82OF9yZWYuc2RhdCd9KTsKYGBgCgpPdXRwdXQ6Cgo8aW1nIHNyYz0iaW1hZ2VzL3JlZmVyZW5jZS9HYW5uZXRMb2FkLWV4YW1wbGUucG5nIiBhbHQ9IkEgc2NyZWVuc2hvdCBleGFtcGxlIG9mIEdhbm5ldExvYWQgb3V0cHV0Ij4KCkEpIEVkaXRlZCBkaWZmZXJlbmNlIHNwZWN0cmEgYmVmb3JlIGFuZCBhZnRlciBmcmVxdWVuY3kgYW5kIHBoYXNlIGFsaWdubWVudC4gVXNlcnMgc2hvdWxkIGxvb2sgb3V0IGZvciBwb29yIGFsaWdubWVudCBhbmQgc2lnbmFsIGRpc3RvcnRpb25zIGZyb20gbGlwaWQgY29udGFtaW5hdGlvbiBvciBnaG9zdGluZyBhcnRpZmFjdHMgW0BLcmVpczIwMDRdLgoKQikgVGhlIG9ic2VydmVkIGZyZXF1ZW5jeSBvZiBlaXRoZXIgdGhlIHJlc2lkdWFsIHdhdGVyIHNpZ25hbCBvciAzIHBwbSBDciBwZWFrIG9uIGEgYXZlcmFnZS1ieS1hdmVyYWdlIGJhc2lzLiBVc2VycyBjYW4gdXNlIHRoaXMgcGFuZWwgdG8gY2hlY2sgZm9yIHBhcnRpY2lwYW50IG1vdGlvbiBhbmQvb3Igc2Nhbm5lci1yZWxhdGVkIGZyZXF1ZW5jeSBkcmlmdC4gVGhlIHNvbGlkIGJsYWNrIGxpbmUgaXMgdGhlIG5vbWluYWwgd2F0ZXIgb3IgMyBwcG0gQ3IgZnJlcXVlbmN5LCB3aGlsZSB0aGUgZGFzaGVkIGxpbmVzIHJlcHJlc2VudCArLy0xIHN0YW5kYXJkIGRldmlhdGlvbiBvZiBwb3B1bGF0aW9uLWxldmVsIGZyZXF1ZW5jeSBvZmZzZXRzIG9ic2VydmVkIGluIHRoZSBCaWcgR0FCQSBzdHVkeSBbQE1pa2tlbHNlbjIwMTddLiBJbiBvdGhlciB3b3JkcywgZnJlcXVlbmN5IHNoaWZ0cyBiZXlvbmQgdGhlc2UgbGltaXRzIGluZGljYXRlcyBhYm92ZS1hdmVyYWdlIG9mZnNldHMgdGhhdCBzaG91bGQgYmUgb2YgY29uY2VybiB0byBkYXRhIGZpZGVsaXR5LgoKQykgQSBzcGVjdHJvZ3JhbSBvZiB0aGUgMyBwcG0gQ3Igc2lnbmFsIGF2ZXJhZ2UgYnkgYXZlcmFnZSBiZWZvcmUgYW5kIGFmdGVyIGZyZXF1ZW5jeSBhbmQgcGhhc2UgYWxpZ25tZW50LiBUaGVzZSBkYXRhIGNvbXBsZW1lbnQgdGhlIGRhdGEgc2hvd24gaW4gcGFuZWwgQiBieSBhZGRpdGlvbmFsbHkgc2hvd2luZyBzcGVjdHJhbCBkaXN0b3J0aW9ucyBpbiBlYWNoIGF2ZXJhZ2UuCgpEKSBUZXh0dWFsIGRldGFpbHMgb2YgdGhlIGRhdGEgYW5kIHByb2Nlc3NpbmcgcHJvY2VkdXJlcy4gV2hlbiAibi9hIC0gd2d0LiBhdmcuIHVzZWQiIGlzIHNob3duIGZvciAiUmVqZWN0cyIsIHRoaXMgbWVhbnMgdGhlIGRhdGEgd2VyZSBhdmVyYWdlZCB1c2luZyB3ZWlnaHRlZCBhdmVyYWdpbmcsIHdoaWNoIGRvd24td2VpZ2h0cyBiYWQgKGkuZS4sICJyZWplY3RlZCIpIGF2ZXJhZ2VzLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBTaWduYWwgZml0dGluZwoKPGJyPgoKKipQYXJlbnQgZnVuY3Rpb24qKgoKYEdhbm5ldEZpdC5tYAoKPGJyPgoKKipFeGFtcGxlIHVzYWdlOioqCgpgYGB7b2N0YXZlLCBldmFsID0gRkFMU0V9Ck1SU19zdHJ1Y3QgPSBHYW5uZXRMb2FkKHsnUzAxX0dBQkFfNjhfYWN0LnNkYXQnfSwgeydTMDFfR0FCQV82OF9yZWYuc2RhdCd9KTsKTVJTX3N0cnVjdCA9IEdhbm5ldEZpdChNUlNfc3RydWN0KTsKYGBgCgpPdXRwdXQ6Cgo8aW1nIHNyYz0iaW1hZ2VzL3JlZmVyZW5jZS9HYW5uZXRGaXQtZXhhbXBsZS5wbmciIGFsdD0iQSBzY3JlZW5zaG90IGV4YW1wbGUgb2YgR2FubmV0Rml0IG91dHB1dCI+CgpBKSBFZGl0ZWQgZGlmZmVyZW5jZSBzcGVjdHJ1bSAoc3BlY3RyYSkgd2l0aCBmaXR0ZWQgbW9kZWwgZnVuY3Rpb24ocykgb3ZlcmxhaWQuIFRoZSBmaXQgcmVzaWR1YWxzIGFyZSBhbHNvIHNob3duLiBOQjogV2hlbiBtb2RlbGluZyB0aGUgR0FCQSBwZWFrLCBHYW5uZXQgYXBwbGllcyB3ZWlnaHRzIHRvIHRoZSByZXNpZHVhbCBDaG8gc2lnbmFsIGRhdGEgcG9pbnRzIGF0IDMuMTYgdG8gMy4yODUgcHBtLiBUaGlzIGltcHJvdmVzIGZpdHRpbmcgb2YgdGhlIEdBQkEgcGVhayB3aGVuIHRoZXJlIGFyZSBzdWJ0cmFjdGlvbiBhcnRpZmFjdHMuCgpCKSBSZWZlcmVuY2Ugc3BlY3RyYSAod2F0ZXIgYW5kIENyKSB3aXRoIGZpdHRlZCBtb2RlbCBmdW5jdGlvbnMgb3ZlcmxhaWQuIFRoZSBmaXQgcmVzaWR1YWxzIGFyZSBhbHNvIHNob3duLiBJZiBubyB3YXRlciByZWZlcmVuY2UgZGF0YSB3YXMgZ2l2ZW4gZHVyaW5nIGRhdGEgbG9hZGluZywgb25seSBDciBpcyBzaG93bi4KCkMpIFRleHR1YWwgcmVzdWx0cyBmcm9tIEdhbm5ldEZpdCAoZnVsbCBkZXRhaWxzIGNhbiBiZSBmb3VuZCBvbiB0aGUgW0RhdGEgcXVhbGl0eSBtZXRyaWNzXShodHRwczovL21hcmttaWtrZWxzZW4uZ2l0aHViLmlvL0dhbm5ldC1kb2NzL2RhdGEtcXVhbGl0eS1tZXRyaWNzLmh0bWwpIHBhZ2UpLiBGb3IgdGhlIG1ldGFib2xpdGVzIGxpc3RlZDoKICAgIC0gQXJlYSBpcyB0aGUgaW50ZWdyYXRlZCBzaWduYWwgKGluIGFyYml0cmFyeSB1bml0cykgb2YgdGhlIHBlYWtzIHNob3duCiAgICAtIExpbmV3aWR0aCBpcyB0aGUgZnVsbC13aWR0aCwgaGFsZi1tYXhpbXVtIChGV0hNKSAoaW4gSHopCiAgICAtIFNOUiBpcyBkZWZpbmVkIGFzIHRoZSBzaWduYWwgbW9kZWwgYW1wbGl0dWRlIGRpdmlkZWQgYnkgdHdpY2UgdGhlIHN0YW5kYXJkIGRldmlhdGlvbiBvZiBub2lzZQogICAgLSBGaXQgZXJyb3IgaXMgZGVmaW5lZCBhcyB0aGUgc3RhbmRhcmQgZGV2aWF0aW9uIG9mIHJlc2lkdWFscyBkaXZpZGVkIGJ5IHRoZSBzaWduYWwgbW9kZWwgYW1wbGl0dWRlIG11bHRpcGxpZWQgYnkgMTAwCiAgICAtIFF1YW50aWZpY2F0aW9uIGRldGFpbHMgY2FuIGJlIGZvdW5kIG9uIHRoZSBbUXVhbnRpZmljYXRpb24gJiB0aXNzdWUgY29ycmVjdGlvbl0oaHR0cHM6Ly9tYXJrbWlra2Vsc2VuLmdpdGh1Yi5pby9HYW5uZXQtZG9jcy9xdWFudGlmaWNhdGlvbi10aXNzdWUtY29ycmVjdGlvbi5odG1sKSBwYWdlLgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBWb3hlbCBjby1yZWdpc3RyYXRpb24KCjxicj4KCioqUGFyZW50IGZ1bmN0aW9uKioKCmBHYW5uZXRDb1JlZ2lzdGVyLm1gCgo8YnI+CgoqKkV4YW1wbGUgdXNhZ2U6KioKCmBgYHtvY3RhdmUsIGV2YWwgPSBGQUxTRX0KTVJTX3N0cnVjdCA9IEdhbm5ldExvYWQoeydTMDFfR0FCQV82OF9hY3Quc2RhdCd9LCB7J1MwMV9HQUJBXzY4X3JlZi5zZGF0J30pOwpNUlNfc3RydWN0ID0gR2FubmV0Rml0KE1SU19zdHJ1Y3QpOwpNUlNfc3RydWN0ID0gR2FubmV0Q29SZWdpc3RlcihNUlNfc3RydWN0LCB7J1MwMV9zdHJ1Yy5uaWknfSk7CmBgYAoKT3V0cHV0OgoKPGltZyBzcmM9ImltYWdlcy9yZWZlcmVuY2UvR2FubmV0Q29SZWdpc3Rlci1leGFtcGxlLnBuZyIgYWx0PSJBIHNjcmVlbnNob3QgZXhhbXBsZSBvZiBHYW5uZXRDb1JlZ2lzdGVyIG91dHB1dCI+CgpBKSBDby1yZWdpc3RyYXRpb24gb2YgdGhlIE1SUyB2b3hlbCBvbiB0aGUgY29ycmVzcG9uZGluZyBzdHJ1Y3R1cmFsIE1SIGltYWdlLiBUaGUgdGhyZWUgb3J0aG9nb25hbCBzbGljZXMgYXJlIHNob3duIGF0IHRoZSB2b3hlbCBjZW50ZXIuCgpCKSBUZXh0dWFsIGRldGFpbHMgb2YgdGhlIHZveGVsIGdlb21ldHJ5LgoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgojIyBUaXNzdWUgc2VnbWVudGF0aW9uCgo8YnI+CgoqKlBhcmVudCBmdW5jdGlvbioqCgpgR2FubmV0U2VnbWVudC5tYAoKPGJyPgoKKipFeGFtcGxlIHVzYWdlOioqCgpgYGB7b2N0YXZlLCBldmFsID0gRkFMU0V9Ck1SU19zdHJ1Y3QgPSBHYW5uZXRMb2FkKHsnUzAxX0dBQkFfNjhfYWN0LnNkYXQnfSwgeydTMDFfR0FCQV82OF9yZWYuc2RhdCd9KTsKTVJTX3N0cnVjdCA9IEdhbm5ldEZpdChNUlNfc3RydWN0KTsKTVJTX3N0cnVjdCA9IEdhbm5ldENvUmVnaXN0ZXIoTVJTX3N0cnVjdCwgeydTMDFfc3RydWMubmlpJ30pOwpNUlNfc3RydWN0ID0gR2FubmV0U2VnbWVudChNUlNfc3RydWN0KTsKYGBgCgpPdXRwdXQ6Cgo8aW1nIHNyYz0iaW1hZ2VzL3JlZmVyZW5jZS9HYW5uZXRTZWdtZW50LWV4YW1wbGUucG5nIiBhbHQ9IkEgc2NyZWVuc2hvdCBleGFtcGxlIG9mIEdhbm5ldFNlZ21lbnQgb3V0cHV0Ij4KCkEpIEF4aWFsIHZpZXcgb2YgdGhlIHByb2JhYmlsaXN0aWMgdm94ZWwgdGlzc3VlIHNlZ21lbnRhdGlvbiBtYXBzIGZvciBncmV5IG1hdHRlciAoR00pLCB3aGl0ZSBtYXR0ZXIgKFdNKSwgYW5kIGNlcmVicm9zcGluYWwgZmx1aWQgKENTRikuCgpCKSBUZXh0dWFsIGRldGFpbHMgb2YgdGhlIENTRi1jb3JyZWN0ZWQgbWV0YWJvbGl0ZXMgdmFsdWVzIChzZWUgW1F1YW50aWZpY2F0aW9uICYgdGlzc3VlIGNvcnJlY3Rpb25dKGh0dHBzOi8vbWFya21pa2tlbHNlbi5naXRodWIuaW8vR2FubmV0LWRvY3MvcXVhbnRpZmljYXRpb24tdGlzc3VlLWNvcnJlY3Rpb24uaHRtbCkgZm9yIGZ1cnRoZXIgZGV0YWlscykgYW5kIHRoZSB2b3hlbCB0aXNzdWUgdm9sdW1lIGZyYWN0aW9ucy4KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKIyMgUXVhbnRpZmljYXRpb24KCjxicj4KCioqUGFyZW50IGZ1bmN0aW9uKioKCmBHYW5uZXRRdWFudGlmeS5tYAoKPGJyPgoKKipFeGFtcGxlIHVzYWdlOioqCgpgYGB7b2N0YXZlLCBldmFsID0gRkFMU0V9Ck1SU19zdHJ1Y3QgPSBHYW5uZXRMb2FkKHsnUzAxX0dBQkFfNjhfYWN0LnNkYXQnfSwgeydTMDFfR0FCQV82OF9yZWYuc2RhdCd9KTsKTVJTX3N0cnVjdCA9IEdhbm5ldEZpdChNUlNfc3RydWN0KTsKTVJTX3N0cnVjdCA9IEdhbm5ldENvUmVnaXN0ZXIoTVJTX3N0cnVjdCwgeydTMDFfc3RydWMubmlpJ30pOwpNUlNfc3RydWN0ID0gR2FubmV0U2VnbWVudChNUlNfc3RydWN0KTsKTVJTX3N0cnVjdCA9IEdhbm5ldFF1YW50aWZ5KE1SU19zdHJ1Y3QpOwpgYGAKCk91dHB1dDoKCjxpbWcgc3JjPSJpbWFnZXMvcmVmZXJlbmNlL0dhbm5ldFF1YW50aWZ5LWV4YW1wbGUucG5nIiBhbHQ9IkEgc2NyZWVuc2hvdCBleGFtcGxlIG9mIEdhbm5ldFF1YW50aWZ5IG91dHB1dCI+CgpBKSBBeGlhbCB2aWV3IG9mIHRoZSBwcm9iYWJpbGlzdGljIHZveGVsIHRpc3N1ZSBzZWdtZW50YXRpb24gbWFwcyBmb3IgZ3JleSBtYXR0ZXIgKEdNKSwgd2hpdGUgbWF0dGVyIChXTSksIGFuZCBjZXJlYnJvc3BpbmFsIGZsdWlkIChDU0YpLgoKQikgIEVkaXRlZCBkaWZmZXJlbmNlIHNwZWN0cnVtIChzcGVjdHJhKSB3aXRoIGZpdHRlZCBtb2RlbCBmdW5jdGlvbihzKSBvdmVybGFpZC4KCkMpIFRleHR1YWwgZGV0YWlscyBvZiB0aXNzdWUtY29ycmVjdGVkIG1ldGFib2xpdGUgdmFsdWVzIChzZWUgW1F1YW50aWZpY2F0aW9uICYgdGlzc3VlIGNvcnJlY3Rpb25dKGh0dHBzOi8vbWFya21pa2tlbHNlbi5naXRodWIuaW8vR2FubmV0LWRvY3MvcXVhbnRpZmljYXRpb24tdGlzc3VlLWNvcnJlY3Rpb24uaHRtbCkgZm9yIGZ1cnRoZXIgZGV0YWlscykuCgo8YnI+CgojIyMgUmVmZXJlbmNlcwoKCgo=
Built with
R Markdown in
RStudio
Copyright © 2020–2026, Mark Mikkelsen