From aedbc8ff9aea6661889f4d0ad608291eb2249a27 Mon Sep 17 00:00:00 2001 From: Lars Kasper Date: Sat, 30 Mar 2019 00:59:33 +0100 Subject: [PATCH 1/9] README with external contributors and mentioning serial correlation cleanup by PhysIO, removing misleading warnings for cardiac phase and gradient gain correction --- PhysIO/CHANGELOG.md | 8 ++ PhysIO/README.md | 114 +++++++++++++----- .../preproc/tapas_physio_get_cardiac_phase.m | 6 +- ...hysio_rescale_gradient_gain_fluctuations.m | 2 + PhysIO/code/tapas_physio_version.m | 2 +- PhysIO/requirements.txt | 15 +++ 6 files changed, 115 insertions(+), 32 deletions(-) create mode 100644 PhysIO/requirements.txt diff --git a/PhysIO/CHANGELOG.md b/PhysIO/CHANGELOG.md index 6ec3c29f..64d38f73 100644 --- a/PhysIO/CHANGELOG.md +++ b/PhysIO/CHANGELOG.md @@ -8,6 +8,14 @@ Current Release March 19, 2019 +Unreleased +---------- + +### Changed +- Toned down and replaced irrelevant peak height and missing cardiac pulse warnings (github issue #51) +- Added `requirements.txt` +- Updated README to include external contributors and recent findings about + impact of physiological noise for serial correlations (Bollmann2018) Minor Release Notes (R2019a, v7.1.0) ------------------------------------ diff --git a/PhysIO/README.md b/PhysIO/README.md index 76502a41..f095b98a 100644 --- a/PhysIO/README.md +++ b/PhysIO/README.md @@ -76,7 +76,8 @@ Getting Started ...following the installation, you can try out an example: -1. Download the TAPAS examples via running `tapas_download_example_data()` (found in `misc`-subfolder of TAPAS) +1. Download the TAPAS examples via running `tapas_download_example_data()` + (found in `misc`-subfolder of TAPAS) - The PhysIO Example files will be downloaded to `tapas/examples//PhysIO` 2. Run `philips_ecg3t_matlab_script.m` in subdirectory `Philips/ECG3T` 3. See subdirectory `physio/docs` and the next two section of this document for help. @@ -98,7 +99,9 @@ pointers and templates. Before you contact us, please try the following: [tapas@sympa.ethz.ch](https://sympa.ethz.ch/sympa/info/tapas), which has a searchable [archive](https://sympa.ethz.ch/sympa/arc/tapas). 3. For new requests, we would like to ask you to submit them as - [issues](https://github.com/translationalneuromodeling/tapas/issues) on our github release page for TAPAS, which is also an up-to-date resource to user-driven questions (since 2018). + [issues](https://github.com/translationalneuromodeling/tapas/issues) on our + github release page for TAPAS, which is also an up-to-date resource to + user-driven questions (since 2018). Documentation @@ -144,8 +147,14 @@ Facts about physiological noise in fMRI: become a particular concern at and above 3 Tesla (Kasper2009, Hutton2011). - In resting state fMRI, disregarding physiological noise leads to wrong connectivity results (Birn2006). +- Uncorrected physiological noise introduces serial correlations into the residual + voxel time series, that invalidate assumptions on noise correlations (e.g., AR(1)) + used in data prewhitening by all major analysis packages. This issue is particularly + aggravated at short TR (<1s), and most of its effects can be suitably addressed + by physiological noise correction (Bollmann2018) -Therefore, some kind of physiological noise correction is highly recommended for every statistical fMRI analysis. +Therefore, some kind of physiological noise correction is highly recommended for +every statistical fMRI analysis. Model-based correction of physiological noise: - Physiological noise can be decomposed into periodic time series following @@ -174,30 +183,39 @@ Features of this Toolbox - Flexible expansion orders to model different contributions of cardiac, respiratory and interaction terms (see Harvey2008, Hutton2011) - Data-driven noise regressors - - PCA extraction from nuisance ROIs (CSF, white matter), similar to aCompCor (Behzadi2007) + - PCA extraction from nuisance ROIs (CSF, white matter), similar to aCompCor + (Behzadi2007) ### Automatization and Performance Assessment - Automatic creation of nuisance regressors, full integration into standard GLMs, tested for SPM8/12 ("multiple_regressors.mat") -- Integration in SPM Batch Editor: GUI for parameter input, dependencies to integrate physiological noise correction in preprocessing pipeline -- Performance Assessment: Automatic F-contrast and tSNR Map creation and display for groups of physiological noise regressors, using SPM GLM tools +- Integration in SPM Batch Editor: GUI for parameter input, dependencies to + integrate physiological noise correction in preprocessing pipeline +- Performance Assessment: Automatic F-contrast and tSNR Map creation and display + for groups of physiological noise regressors, using SPM GLM tools via + `tapas_physio_report_contrasts()`. ### Flexible Read-in -The toolbox is dedicated to seamless integration into a clinical research s -etting and therefore offers correction methods to recover physiological -data from imperfect peripheral measures. +The toolbox is dedicated to seamless integration into a clinical research +setting and therefore offers correction methods to recover physiological +data from imperfect peripheral measures. Read-in of the following formats is +currently supported (alphabetic order): +- Biopac `.mat` and `.txt` -export +- Brain Imaging Data Structure (BIDS) +- Custom logfiles: should contain one amplitude value per line, one logfile per + device. Sampling interval(s) are provided as a separate parameter to the toolbox. - General Electric - Philips SCANPHYSLOG files (all versions from release 2.6 to 5.3) - Siemens VB (files `.ecg`, `.resp`, `.puls`) - Siemens VD (files `*_ECG.log`, `*_RESP.log`, `*_PULS.log`) - Siemens Human Connectome Project (preprocessed files `*Physio_log.txt`) -- Biopac .mat-export - - assuming the following variables (as columns): `data`, `isi`, `isi_units`, `labels`, `start_sample`, `units` - - See `tapas_physio_read_physlogfiles_biopac_mat.m` for details -- Custom logfiles: should contain one amplitude value per line, one logfile per device. Sampling interval(s) are provided as a separate parameter to the toolbox. + +See also the +[Wiki page on Read-In](https://gitlab.ethz.ch/physio/physio-doc/wikis/MANUAL_PART_READIN) +for a more detailed list and description of the supported formats. Compatibility @@ -217,7 +235,9 @@ Compatibility or as text file for export to any other package - raw and processed physiological logfile data - Graphical Batch Editor interface to SPM -- Part of the TAPAS Software Collection of the Translational Neuromodeling Unit (TNU) Zurich:long term support and ongoing development +- Part of the TAPAS Software Collection of the Translational Neuromodeling Unit + (TNU) Zurich + - ensures long term support and ongoing development Contributors @@ -229,12 +249,26 @@ Contributors - Project Team: - Steffen Bollmann, Centre for Advanced Imaging, University of Queensland, Australia - Saskia Bollmann, Centre for Advanced Imaging, University of Queensland, Australia -- Contributors: +- Contributors (Code): - Eduardo Aponte, TNU Zurich - Tobias U. Hauser, FIL London, UK - Jakob Heinzle, TNU Zurich - Chloe Hutton, FIL London, UK (previously) - Miriam Sebold, Charite Berlin, Germany + - TAPAS contributors listed in its [Contributor License Agreement](https://github.com/translationalneuromodeling/tapas/blob/master/Contributor-License-Agreement.md) +- Contributors (Examples): + - listed in [EXAMPLES.md](https://gitlab.ethz.ch/physio/physio-doc/wikis/EXAMPLES) + + +Requirements +------------ + +- All specific software requirements and their versions are in a separate file + in this folder, `requirements.txt`. +- In brief: + - PhysIO needs Matlab to run, and some of its toolboxes. + - Some functionality requires SPM (GUI, nuisance regression, contrast reporting, + writing residual and SNR images). References @@ -242,55 +276,79 @@ References ### Main Toolbox Reference +Please cite the following paper in all of your publications that utilized the +PhysIO Toolbox. + 1. Kasper, L., Bollmann, S., Diaconescu, A.O., Hutton, C., Heinzle, J., Iglesias, S., Hauser, T.U., Sebold, M., Manjaly, Z.-M., Pruessmann, K.P., Stephan, K.E., 2017. The PhysIO Toolbox for Modeling Physiological Noise in fMRI Data. -Journal of Neuroscience Methods 276, 56–72. doi:10.1016/j.jneumeth.2016.10.019 +Journal of Neuroscience Methods 276, 56–72. https://doi.org/10.1016/j.jneumeth.2016.10.019 + +The [FAQ](https://gitlab.ethz.ch/physio/physio-doc/wikis/FAQ#3-how-do-i-cite-physio) +contains a complete suggestion for a snippet in your methods section. ### Related Papers (Implemented noise correction algorithms and optimal parameter choices) +The following sections list papers that +- first implemented specific noise correction algorithms +- determined optimal parameter choices for these algorithms, depending on the + targeted application +- demonstrate the impact of physiological noise and the importance of its correction + +It is loosely ordered by the dominant physiological noise model used in the +paper. The list is by no means complete, and we are happy to add any relevant papers +suggested to us. + #### RETROICOR 2. Glover, G.H., Li, T.Q. & Ress, D. Image‐based method for retrospective correction of PhysIOlogical motion effects in fMRI: RETROICOR. Magn Reson Med 44, 162-7 (2000). -3. Hutton, C. et al. The impact of PhysIOlogical noise correction on fMRI at 7 T. +3. Hutton, C. et al. The impact of Physiological noise correction on fMRI at 7 T. NeuroImage 57, 101‐112 (2011). 4. Harvey, A.K. et al. Brainstem functional magnetic resonance imaging: Disentangling signal from PhysIOlogical noise. Journal of Magnetic Resonance Imaging 28, 1337‐1344 (2008). +5. Bollmann, S., Puckett, A.M., Cunnington, R., Barth, M., 2018. +Serial correlations in single-subject fMRI with sub-second TR. +NeuroImage 166, 152–166. https://doi.org/10.1016/j.neuroimage.2017.10.043 + + #### aCompCor / Noise ROIs -5. Behzadi, Y., Restom, K., Liau, J., Liu, T.T., 2007. A component based noise +6. Behzadi, Y., Restom, K., Liau, J., Liu, T.T., 2007. A component based noise correction method (CompCor) for BOLD and perfusion based fMRI. NeuroImage 37, -90–101. doi:10.1016/j.neuroimage.2007.04.042 +90–101. https://doi.org/10.1016/j.neuroimage.2007.04.042 #### RVT -6. Birn, R.M., Smith, M.A., Jones, T.B., Bandettini, P.A., 2008. The respiration response +7. Birn, R.M., Smith, M.A., Jones, T.B., Bandettini, P.A., 2008. The respiration response function: The temporal dynamics of fMRI s ignal fluctuations related to changes in respiration. NeuroImage 40, 644–654. doi:10.1016/j.neuroimage.2007.11.059 -7. Jo, H.J., Saad, Z.S., Simmons, W.K., Milbury, L.A., Cox, R.W., 2010. +8. Jo, H.J., Saad, Z.S., Simmons, W.K., Milbury, L.A., Cox, R.W., 2010. Mapping sources of correlation in resting state FMRI, with artifact detection and removal. NeuroImage 52, 571–582. https://doi.org/10.1016/j.neuroimage.2010.04.246 -*regressor delay suggestions* + - *regressor delay suggestions* #### HRV -8. Chang, C., Cunningham, J.P., Glover, G.H., 2009. Influence of heart rate on the +9. Chang, C., Cunningham, J.P., Glover, G.H., 2009. Influence of heart rate on the BOLD signal: The cardiac response function. NeuroImage 44, 857–869. doi:10.1016/j.neuroimage.2008.09.029 -9. Shmueli, K., van Gelderen, P., de Zwart, J.A., Horovitz, S.G., Fukunaga, M., +10. Shmueli, K., van Gelderen, P., de Zwart, J.A., Horovitz, S.G., Fukunaga, M., Jansma, J.M., Duyn, J.H., 2007. Low-frequency fluctuations in the cardiac rate as a source of variance in the resting-state fMRI BOLD signal. NeuroImage 38, 306–320. https://doi.org/10.1016/j.neuroimage.2007.07.037 -*regressor delay suggestions* + - *regressor delay suggestions* #### Motion (Censoring, Framewise Displacement) -10. Siegel, J.S., Power, J.D., Dubis, J.W., Vogel, A.C., Church, J.A., Schlaggar, B.L., +11. Siegel, J.S., Power, J.D., Dubis, J.W., Vogel, A.C., Church, J.A., Schlaggar, B.L., Petersen, S.E., 2014. Statistical improvements in functional magnetic resonance imaging analyses produced by censoring high-motion data points. Hum. Brain Mapp. -35, 1981–1996. doi:10.1002/hbm.22307 +35, 1981–1996. https://doi.org/10.1002/hbm.22307 -11. Power, J.D., Barnes, K.A., Snyder, A.Z., Schlaggar, B.L., Petersen, S.E., 2012. Spurious but systematic correlations in functional connectivity MRI networks arise from subject motion. NeuroImage 59, 2142–2154. https://doi.org/10.1016/j.neuroimage.2011.10.018 +12. Power, J.D., Barnes, K.A., Snyder, A.Z., Schlaggar, B.L., Petersen, S.E., 2012. +Spurious but systematic correlations in functional connectivity MRI networks +arise from subject motion. NeuroImage 59, 2142–2154. +https://doi.org/10.1016/j.neuroimage.2011.10.018 Copying/License diff --git a/PhysIO/code/preproc/tapas_physio_get_cardiac_phase.m b/PhysIO/code/preproc/tapas_physio_get_cardiac_phase.m index 463e7afe..6d71ee61 100644 --- a/PhysIO/code/preproc/tapas_physio_get_cardiac_phase.m +++ b/PhysIO/code/preproc/tapas_physio_get_cardiac_phase.m @@ -57,14 +57,14 @@ % add pulses in the end, if last onset time of scan after last recorded % pulses - use guess based on average heart rate if scannert(end) > pulset(end) - verbose = tapas_physio_log(... - 'Guessed additional cardiac pulse at time series end for phase estimation', ... - verbose, 1); % add more pulses before first one, using same average heartbeat % duration as in first nAverage cycles meanCycleDur = mean(diff(pulset((end-nAverage+1):end))); nAddPulses = ceil((scannert(end) - pulset(end))/meanCycleDur); pulset = [pulset; pulset(end) + meanCycleDur*(1:nAddPulses)']; + verbose = tapas_physio_log(... + sprintf('Note: Guessed %d additional cardiac pulse(s) at time series end for phase estimation', nAddPulses), ... + verbose, 0); end scannertpriorpulse = zeros(1,length(scannert)); diff --git a/PhysIO/code/sync/tapas_physio_rescale_gradient_gain_fluctuations.m b/PhysIO/code/sync/tapas_physio_rescale_gradient_gain_fluctuations.m index 51efbd13..239bc496 100644 --- a/PhysIO/code/sync/tapas_physio_rescale_gradient_gain_fluctuations.m +++ b/PhysIO/code/sync/tapas_physio_rescale_gradient_gain_fluctuations.m @@ -59,6 +59,7 @@ % determine positive and negative steps warning off tapas_physio_findpeaks:largeMinPeakHeight +warning off signal:findpeaks:largeMinPeakHeight [~, idxGainPlus] = tapas_physio_findpeaks((dmG), 'minpeakDistance', n, ... 'minpeakheight', minPeakHeight); @@ -66,6 +67,7 @@ 'minpeakheight', minPeakHeight); warning on tapas_physio_findpeaks:largeMinPeakHeight +warning on signal:findpeaks:largeMinPeakHeight % plus gains refer to max-changes in the future idxGainPlus = idxGainPlus + n; diff --git a/PhysIO/code/tapas_physio_version.m b/PhysIO/code/tapas_physio_version.m index 9b01b8cf..a7c98aa0 100644 --- a/PhysIO/code/tapas_physio_version.m +++ b/PhysIO/code/tapas_physio_version.m @@ -1,7 +1,7 @@ function versionPhysio = tapas_physio_version() % returns version number of this copy of PhysIO % -% output = tapas_physio_version(input) +% versionPhysio = tapas_physio_version() % % IN % diff --git a/PhysIO/requirements.txt b/PhysIO/requirements.txt new file mode 100644 index 00000000..fc2b0261 --- /dev/null +++ b/PhysIO/requirements.txt @@ -0,0 +1,15 @@ +# MathWorks Matlab +MATLAB>=9.5 +# Matlab Signal Processing Toolbox: for resp/cardiac trace filter (butter) +# Raw trace filtering (butter) +# (Peak Detection) (xcorr) +signal>=8.1 +# Matlab Statistics and Machine Learning Toolbox +# Noise Rois extraction (pca) +# Siemens Tics Reader (knnsearch) +stats>=11.4 +# Statistical Parametric Mapping +# GLM, F-contrast computation, SNR, extraction of residuals, +# GUI: Batch Editor +spm>=12 + From 920766d60ca6737a6dd7b7af0ebdec50d82212c0 Mon Sep 17 00:00:00 2001 From: Lars Kasper Date: Wed, 3 Apr 2019 00:26:21 +0200 Subject: [PATCH 2/9] Bugfix tapas_physio_init discovered by Dario; was not working, because utils functions used in init were not on path --- PhysIO/CHANGELOG.md | 11 ++++++++++- PhysIO/code/tapas_physio_init.m | 10 ++++++++-- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/PhysIO/CHANGELOG.md b/PhysIO/CHANGELOG.md index 64d38f73..8989e2b0 100644 --- a/PhysIO/CHANGELOG.md +++ b/PhysIO/CHANGELOG.md @@ -8,15 +8,24 @@ Current Release March 19, 2019 + Unreleased ---------- +### Added +- `requirements.txt` making dependencies on Matlab and specific toolboxes + explicit + ### Changed - Toned down and replaced irrelevant peak height and missing cardiac pulse warnings (github issue #51) -- Added `requirements.txt` - Updated README to include external contributors and recent findings about impact of physiological noise for serial correlations (Bollmann2018) +### Fixed +- Bugfix `tapas_physio_init()` not working, because dependent on functions + in `utils` subfolder not in path; `utils` added to path + + Minor Release Notes (R2019a, v7.1.0) ------------------------------------ diff --git a/PhysIO/code/tapas_physio_init.m b/PhysIO/code/tapas_physio_init.m index 0e0a990b..2544ea20 100644 --- a/PhysIO/code/tapas_physio_init.m +++ b/PhysIO/code/tapas_physio_init.m @@ -23,6 +23,12 @@ % COPYING or . % +% add path for utils, if physio not in path +if ~exist('tapas_physio_logo') + pathPhysio = fileparts(mfilename('fullpath')); + addpath(fullfile(pathPhysio, 'utils')); % needed for further path checks +end + tapas_physio_logo(); % print logo disp('Checking Matlab PhysIO paths, SPM paths and Batch Editor integration now...'); @@ -32,8 +38,8 @@ [isPhysioOnPath, pathPhysIO] = tapas_physio_check_path(); if ~isPhysioOnPath - addpath(pathPhysIO); - fprintf('added PhysIO path: %s\n', pathPhysIO); + addpath(genpath(pathPhysIO)); + fprintf('added PhysIO path recursively: %s\n', pathPhysIO); else fprintf('OK.\n'); end From ee8302a14d418ab0f54775f03b19a3f9222dd49c Mon Sep 17 00:00:00 2001 From: Lars Kasper Date: Wed, 21 Aug 2019 13:49:23 -0400 Subject: [PATCH 3/9] commits from physio-public tag R2019b-v7.2.0 --- PhysIO/CHANGELOG.md | 30 +- PhysIO/README.md | 23 +- PhysIO/code/assess/tapas_physio_review.m | 13 +- PhysIO/code/gui/tapas_physio_gui_filter.m | 108 +++++ .../tapas_physio_create_hrv_regressors.m | 31 +- .../tapas_physio_create_rvt_regressors.m | 37 +- ...o_orthogonalise_physiological_regressors.m | 13 +- PhysIO/code/model/tapas_physio_rvt.m | 29 +- PhysIO/code/plot/tapas_physio_plot_spectrum.m | 62 +++ .../plot/tapas_physio_print_figs_to_file.m | 14 +- .../preproc/tapas_physio_filter_cardiac.m | 111 ++++++ .../preproc/tapas_physio_find_ecg_r_peaks.m | 11 +- .../tapas_physio_get_cardiac_pulse_template.m | 2 +- .../preproc/tapas_physio_get_cardiac_pulses.m | 36 +- ...hysio_get_cardiac_pulses_manual_template.m | 30 +- .../tapas_physio_get_oxy_pulses_filtered.m | 4 +- .../tapas_physio_get_respiratory_phase.m | 9 +- .../tapas_physio_simulate_pulse_samples.m | 1 + .../tapas_physio_read_physlogfiles_bids.m | 20 +- .../tapas_physio_read_physlogfiles_siemens.m | 10 +- ..._scan_timing_from_gradients_auto_philips.m | 2 + PhysIO/code/tapas_physio_cfg_matlabbatch.m | 46 ++- .../tapas_physio_main_create_regressors.m | 21 +- PhysIO/code/tapas_physio_new.m | 62 ++- PhysIO/code/tapas_physio_version.m | 2 +- PhysIO/code/utils/tapas_physio_conv.m | 71 ++++ PhysIO/code/utils/tapas_physio_job2physio.m | 30 +- .../tapas_physio_save_batch_mat_script.m | 1 + .../code/utils/tapas_physio_update_from_job.m | 55 +-- PhysIO/docs/documentation.html | 262 +++++++++---- PhysIO/docs/documentation.pdf | Bin 1894776 -> 1024081 bytes .../integration/tapas_physio_examples_test.m | 369 ++++++++++++++++++ .../tapas_physio_run_integration_tests.m | 42 ++ PhysIO/tests/tapas_physio_run_unit_tests.m | 10 +- .../tapas_physio_filter_cardiac_test.m | 107 +++++ .../readin/tapas_physio_readin_bids_test.m | 4 +- .../tests/unit/utils/tapas_physio_conv_test.m | 75 ++++ .../utils/tapas_physio_findpeaks_test.m | 2 +- 38 files changed, 1517 insertions(+), 238 deletions(-) create mode 100644 PhysIO/code/gui/tapas_physio_gui_filter.m create mode 100644 PhysIO/code/plot/tapas_physio_plot_spectrum.m create mode 100644 PhysIO/code/preproc/tapas_physio_filter_cardiac.m create mode 100644 PhysIO/code/utils/tapas_physio_conv.m create mode 100644 PhysIO/tests/integration/tapas_physio_examples_test.m create mode 100644 PhysIO/tests/tapas_physio_run_integration_tests.m create mode 100644 PhysIO/tests/unit/preproc/tapas_physio_filter_cardiac_test.m rename PhysIO/tests/{ => unit}/readin/tapas_physio_readin_bids_test.m (99%) create mode 100644 PhysIO/tests/unit/utils/tapas_physio_conv_test.m rename PhysIO/tests/{ => unit}/utils/tapas_physio_findpeaks_test.m (99%) diff --git a/PhysIO/CHANGELOG.md b/PhysIO/CHANGELOG.md index 8989e2b0..fc8ca1e1 100644 --- a/PhysIO/CHANGELOG.md +++ b/PhysIO/CHANGELOG.md @@ -4,27 +4,45 @@ RELEASE INFORMATION Current Release --------------- -*Current version: PhysIO Toolbox Release R2019a, v7.1.0* +*Current version: PhysIO Toolbox Release R2019b, v7.2.0* -March 19, 2019 +August 20, 2019 -Unreleased ----------- +Minor Release Notes (R2019b, v7.2.0) +------------------------------------ ### Added - `requirements.txt` making dependencies on Matlab and specific toolboxes explicit +- `max_heart_rate_bpm` now a user parameter to adjust prior on max allowed + heart rate for cardiac pulse detection (`method = 'auto_matched'`) +- bandpass-filtering of cardiac data during preprocessing now possible + (`preproc.cardiac.filter`) +- Added integration tests for all examples in `tests/integration` for both SPM +Batch Editor and Matlab-only configuration scripts. Reference data provided in +`examples/TestReferenceResults/examples` ### Changed -- Toned down and replaced irrelevant peak height and missing cardiac pulse warnings (github issue #51) +- Toned down and replaced irrelevant peak height and missing cardiac pulse + warnings (github issue #51) - Updated README to include external contributors and recent findings about impact of physiological noise for serial correlations (Bollmann2018) +- Added unit tests for convolution and moved all to `tests/unit` ### Fixed +- Corrected half-width shift of response functions for HRV and RVT regressors by + erroneous use of Matlab `conv` + - For details on the bug, its impact and fix, see our specific [Release + Info on RVT/HRV Bugfix](https://github.com/translationalneuromodeling/tapas/issues/65) + - other references: TNU gitlab issue #83, found and fixed by Sam Harrison, + TNU, see `tapas_physio_conv`) - Bugfix `tapas_physio_init()` not working, because dependent on functions in `utils` subfolder not in path; `utils` added to path - +- `tapas_physio_review` for motion parameters (found and fixed by + Sam Harrison, TNU) +- visualization error for regressor orthogonalization (github issue #57), + when only `'RETROICOR'` set was chosen Minor Release Notes (R2019a, v7.1.0) ------------------------------------ diff --git a/PhysIO/README.md b/PhysIO/README.md index f095b98a..108c0c1a 100644 --- a/PhysIO/README.md +++ b/PhysIO/README.md @@ -1,7 +1,7 @@ TAPAS PhysIO Toolbox ==================== -*Current version: Release 2019a, v7.1.0* +*Current version: Release 2019b, v7.2.0* > Copyright (C) 2012-2019 > Lars Kasper @@ -252,10 +252,12 @@ Contributors - Contributors (Code): - Eduardo Aponte, TNU Zurich - Tobias U. Hauser, FIL London, UK + - Sam Harrison, TNU Zurich - Jakob Heinzle, TNU Zurich - Chloe Hutton, FIL London, UK (previously) - Miriam Sebold, Charite Berlin, Germany - - TAPAS contributors listed in its [Contributor License Agreement](https://github.com/translationalneuromodeling/tapas/blob/master/Contributor-License-Agreement.md) + - External TAPAS contributors listed in its [Contributor License Agreement] + (https://github.com/translationalneuromodeling/tapas/blob/master/Contributor-License-Agreement.md) - Contributors (Examples): - listed in [EXAMPLES.md](https://gitlab.ethz.ch/physio/physio-doc/wikis/EXAMPLES) @@ -271,6 +273,21 @@ Requirements writing residual and SNR images). +Acknowledgements +---------------- + +The PhysIO Toolbox ships with the following publicly available code from other +open source projects and gratefully acknowledges their use. + +- `utils\tapas_physio_propval.m` + - `propval` function from Princeton MVPA toolbox (GPL) + a nice wrapper function to create flexible propertyName/value optional + parameters +- `utils\tapas_physio_fieldnamesr.m` + - recursive parser for field names of a structure + - Matlab file exchange, adam.tudorjones@pharm.ox.ac.uk + + References ---------- @@ -366,4 +383,4 @@ General Public License for more details. You should have received a copy of the GNU General Public License along with this program (see the file [LICENSE](LICENSE)). If not, see -. \ No newline at end of file +. diff --git a/PhysIO/code/assess/tapas_physio_review.m b/PhysIO/code/assess/tapas_physio_review.m index 759c4fcf..0c5066bc 100644 --- a/PhysIO/code/assess/tapas_physio_review.m +++ b/PhysIO/code/assess/tapas_physio_review.m @@ -131,17 +131,18 @@ hasRespData); end - if model.movement.include - censoring = model.movement.censoring; + rp = model.movement.rp; quality_measures = model.movement.quality_measures; + censoring = model.movement.censoring; + censoring_threshold = model.movement.censoring_threshold; switch lower(model.movement.censoring_method) case 'fd' - verbose.fig_handles(end+1) = tapas_physio_plot_movement_outliers_fd(rp, ... - quality_measures, censoring, movement.censoring_threshold); + verbose.fig_handles(end+1) = tapas_physio_plot_movement_outliers_fd( ... + rp, quality_measures, censoring, censoring_threshold); case 'maxval' - verbose.fig_handles(end+1) = tapas_physio_plot_movement_outliers_maxval(rp, ... - quality_measures, censoring, movement.censoring_threshold); + verbose.fig_handles(end+1) = tapas_physio_plot_movement_outliers_maxval( ... + rp, quality_measures, censoring, censoring_threshold); end end diff --git a/PhysIO/code/gui/tapas_physio_gui_filter.m b/PhysIO/code/gui/tapas_physio_gui_filter.m new file mode 100644 index 00000000..6004f35e --- /dev/null +++ b/PhysIO/code/gui/tapas_physio_gui_filter.m @@ -0,0 +1,108 @@ +function filter = tapas_physio_gui_filter() +% Creates sub-part for preproc filter options in Batch Editor GUI +% +% tapas_physio_gui_filter +% +% +% See also + +% Author: Lars Kasper +% Created: 2019-07-05 +% Copyright (C) 2019 Institute for Biomedical Engineering +% University of Zurich and ETH Zurich +% +% This file is part of the TAPAS PhysIO Toolbox, which is released under +% the terms of the GNU General Public License (GPL), version 3. You can +% redistribute it and/or modify it under the terms of the GPL (either +% version 3 or, at your option, any later version). For further details, +% see the file COPYING or . + +%-------------------------------------------------------------------------- +% filter_type +%-------------------------------------------------------------------------- +filter_type = cfg_menu; +filter_type.tag = 'type'; +filter_type.name = 'Filter Type'; +filter_type.help = {'Which infinite impulse response filter shall be used?' + ' ''Chebychev Type II (cheby2)'' Chebychev Type II filter, use for steep transition from' + ' start to stop band' + ' ''Butterworth (butter)'' Butterworth filter, standard filter with maximally flat' + ' passband (Infinite impulse response), but stronger' + ' ripples in transition band' +}; +filter_type.labels = {'Chebychev Type II', 'Butterworth'}; +filter_type.values = {'cheby2', 'butter'}; +filter_type.val = {'cheby2'}; + +%-------------------------------------------------------------------------- +% filter_stopband +%-------------------------------------------------------------------------- +filter_stopband = cfg_entry; +filter_stopband.tag = 'stopband'; +filter_stopband.name = 'Stopband'; +filter_stopband.help = { + '[f_min, f_max] frequency interval in Hz of all frequencies, s.th. frequencies' + ' outside this band should definitely *NOT* pass the filter' + ' Default: [] ' + ' NOTE: only relevant for ''cheby2'' filter type' + ' if empty, and passband is empty, no filtering is performed' + ' if empty, but passband exists, stopband interval is' + ' 10% increased passband interval' + }; +filter_stopband.strtype = 'e'; +filter_stopband.num = [0 Inf]; +filter_stopband.val = {[]}; + +%-------------------------------------------------------------------------- +% filter_passband +%-------------------------------------------------------------------------- +filter_passband = cfg_entry; +filter_passband.tag = 'passband'; +filter_passband.name = 'Passband'; +filter_passband.help = { + '[f_min, f_max] frequency interval in Hz of all frequency that should' + ' pass the passband filter' + ' default: [0.3 9] (to remove slow drifts, breathing' + ' and slice sampling artifacts)' + ' if empty, no filtering is performed' + }; +filter_passband.strtype = 'e'; +filter_passband.num = [0 Inf]; +filter_passband.val = {[0.3 9]}; + +%-------------------------------------------------------------------------- +%% filter_no +%-------------------------------------------------------------------------- + +filter_no = cfg_branch; +filter_no.tag = 'no'; +filter_no.name = 'No'; +filter_no.val = {}; +filter_no.help = {'Cardiac data remains unfiltered before pulse detection.'}; + +%-------------------------------------------------------------------------- +%% filter_yes +%-------------------------------------------------------------------------- + +filter_yes = cfg_branch; +filter_yes.tag = 'yes'; +filter_yes.name = 'Yes'; +filter_yes.val = {filter_type, filter_passband, ... +filter_stopband}; +filter_yes.help = {''}; + + +%-------------------------------------------------------------------------- +%% filter +%-------------------------------------------------------------------------- + +filter = cfg_choice; +filter.tag = 'filter'; +filter.name = 'Filter Raw Cardiac Time Series'; +filter.val = {filter_no}; +filter.values = {filter_no, filter_yes}; +filter.help = { + 'Filter properties for bandpass-filtering of cardiac signal before peak' + 'detection, phase extraction, and other physiological traces' + }; + diff --git a/PhysIO/code/model/tapas_physio_create_hrv_regressors.m b/PhysIO/code/model/tapas_physio_create_hrv_regressors.m index fb5d777e..f89f7ddb 100644 --- a/PhysIO/code/model/tapas_physio_create_hrv_regressors.m +++ b/PhysIO/code/model/tapas_physio_create_hrv_regressors.m @@ -40,6 +40,7 @@ model_hrv = physio.model.hrv; end + delays = model_hrv.delays; if nargin < 4 @@ -49,6 +50,8 @@ slicenum = 1:sqpar.Nslices; + +% Calculate HR sample_points = tapas_physio_get_sample_points(ons_secs, sqpar, slicenum); hr = tapas_physio_hr(ons_secs.cpulse, sample_points); @@ -61,24 +64,23 @@ ylabel('beats per min (bpm)'); end -% create convolution for whole time series first... + +% Generate CRF dt = sqpar.TR/sqpar.Nslices; -t = 0:dt:32; % 32 seconds regressor +t = 0:dt:30; % seconds crf = tapas_physio_crf(t); -crf = crf/max(abs(crf)); -% crf = spm_hrf(dt); +crf = crf / max(abs(crf)); + if verbose.level>=2 subplot(2,2,2) plot(t, crf,'r');xlabel('time (seconds)'); title('Cardiac response function'); end -% NOTE: the removal of the mean was implemented to avoid over/undershoots -% at the 1st and last scans of the session due to convolution -convHRV = conv(hr-mean(hr), crf, 'same'); -% rescaling to -1...1 for display purposes -convHRV = convHRV./max(abs(convHRV)); +% Convolve and rescale for display purposes +convHRV = tapas_physio_conv(hr, crf, 'causal'); +convHRV = convHRV / max(abs(convHRV)); if verbose.level>=2 subplot(2,2,3) @@ -87,21 +89,20 @@ end -% create shifted regressors convolved time series, which is equivalent to -% delayed response functions according to Wikipedia (convoution) +% Create shifted regressors convolved time series, which is equivalent to +% delayed response functions according to Wikipedia (convolution) % % "Translation invariance[edit] % The convolution commutes with translations, meaning that % % \tau_x ({f}*g) = (\tau_x f)*g = {f}*(\tau_x g)\, -% where \tau_x fis the translation of the function f by x defined by -% (\tau_x f)(y) = f(y-x).\. +% where \tau_x is the translation of the function f by x defined by +% (\tau_x f)(y) = f(y-x). % remove mean and linear trend to fulfill periodicity condition for % shifting convHRV = detrend(convHRV); - % TODO: what happens at the end/beginning of shifted convolutions? nDelays = numel(delays); nShiftSamples = ceil(delays/dt); @@ -133,3 +134,5 @@ xlabel('time (seconds)');ylabel('regessor'); legend([hp{1}(1), hp{2}(1)], 'heart rate (bpm)', 'cardiac response regressor'); end + +end \ No newline at end of file diff --git a/PhysIO/code/model/tapas_physio_create_rvt_regressors.m b/PhysIO/code/model/tapas_physio_create_rvt_regressors.m index cc33150b..d97d4621 100644 --- a/PhysIO/code/model/tapas_physio_create_rvt_regressors.m +++ b/PhysIO/code/model/tapas_physio_create_rvt_regressors.m @@ -50,9 +50,11 @@ slicenum = 1:sqpar.Nslices; + +% Calculate RVT sample_points = tapas_physio_get_sample_points(ons_secs, sqpar, slicenum); rvt = tapas_physio_rvt(ons_secs.fr, ons_secs.t, sample_points, verbose); -rvt = rvt/max(rvt); % normalize for reasonable range of regressor +rvt = rvt / max(abs(rvt)); % normalize for reasonable range of regressor if verbose.level >=2 verbose.fig_handles(end+1) = tapas_physio_get_default_fig_params(); @@ -63,26 +65,23 @@ ylabel('a.u.'); end -% create convolution for whole time series first... -dt = sqpar.TR/sqpar.Nslices; -t = 0:dt:50; % 50 seconds regressor + +% Generate RRF +dt = sqpar.TR / sqpar.Nslices; +t = 0:dt:60; % seconds rrf = tapas_physio_rrf(t); -rrf = rrf/max(abs(rrf)); -% crf = spm_hrf(dt); +rrf = rrf / max(abs(rrf)); if verbose.level >= 2 subplot(2,2,2) - plot(t, rrf,'g');xlabel('time (seconds)'); + plot(t, rrf,'g'); xlabel('time (seconds)'); title('Respiratory response function'); end -% NOTE: the removal of the mean was implemented to avoid over/undershoots -% at the 1st and last scans of the session due to convolution -convRVT = conv(rvt-mean(rvt), rrf, 'same'); - -% rescaling to -1...1 for display purposes -convRVT = convRVT./max(abs(convRVT)); +% Convolve and rescale for display purposes +convRVT = tapas_physio_conv(rvt, rrf, 'causal'); +convRVT = convRVT / max(abs(convRVT)); if verbose.level >= 2 subplot(2,2,3) @@ -90,21 +89,21 @@ title('Resp vol time X resp response function'); end -% create shifted regressors convolved time series, which is equivalent to -% delayed response functions according to Wikipedia (convoution) + +% Create shifted regressors convolved time series, which is equivalent to +% delayed response functions according to Wikipedia (convolution) % % "Translation invariance[edit] % The convolution commutes with translations, meaning that % % \tau_x ({f}*g) = (\tau_x f)*g = {f}*(\tau_x g)\, -% where \tau_x fis the translation of the function f by x defined by -% (\tau_x f)(y) = f(y-x).\. +% where \tau_x is the translation of the function f by x defined by +% (\tau_x f)(y) = f(y-x). % remove mean and linear trend to fulfill periodicity condition for % shifting convRVT = detrend(convRVT); - % TODO: what happens at the end/beginning of shifted convolutions? nDelays = numel(delays); nShiftSamples = ceil(delays/dt); @@ -137,3 +136,5 @@ legend([hp{1}(1), hp{2}(1)], 'respiratory volume / time (a. u.)', ... 'respiratory response regressor'); end + +end \ No newline at end of file diff --git a/PhysIO/code/model/tapas_physio_orthogonalise_physiological_regressors.m b/PhysIO/code/model/tapas_physio_orthogonalise_physiological_regressors.m index d0ff0b03..6d907073 100644 --- a/PhysIO/code/model/tapas_physio_orthogonalise_physiological_regressors.m +++ b/PhysIO/code/model/tapas_physio_orthogonalise_physiological_regressors.m @@ -25,8 +25,9 @@ % 'c' or 'cardiac' - only cardiac regressors are orthogonalised % 'r' or 'resp' - only respiration regressors are orthogonalised % 'mult' - only multiplicative regressors are orthogonalised -% 'all' - all physiological regressors are -% orthogonalised to each other +% 'RETROICOR' - cardiac, resp and interaction (mult) +% regressors are orthogonalised +% 'all' - all regressors are orthogonalised to each other % verbose.level 0 = no output; % 1 or other = plot design matrix before and after % orthogonalisation of physiological regressors and difference @@ -60,10 +61,16 @@ R = [cardiac_sess, tapas_physio_scaleorthmean_regressors(respire_sess) mult_sess input_R]; case {'mult'} R = [cardiac_sess, respire_sess, tapas_physio_scaleorthmean_regressors(mult_sess) input_R]; - case 'all' + case 'retroicor' R = [tapas_physio_scaleorthmean_regressors([cardiac_sess, respire_sess, mult_sess]), input_R]; + case 'all' + R = tapas_physio_scaleorthmean_regressors([cardiac_sess, respire_sess, mult_sess, input_R]); case {'n', 'none'} R = [cardiac_sess, respire_sess, mult_sess input_R]; + otherwise + verbose = tapas_physio_log(... + sprintf('Orthogonalisation of regressor set %s is not supported yet', ... + orthogonalise), verbose, 2) end diff --git a/PhysIO/code/model/tapas_physio_rvt.m b/PhysIO/code/model/tapas_physio_rvt.m index 1dd61759..0a3d9904 100644 --- a/PhysIO/code/model/tapas_physio_rvt.m +++ b/PhysIO/code/model/tapas_physio_rvt.m @@ -47,15 +47,12 @@ % COPYING or . - -dt = t(2)-t(1); -dtBreath = round(2/dt); %in seconds, minimum distance between two breaths - % compute breathing "pulses" (occurence times "rpulse" of max inhalation % times) -thresh_cardiac = []; -thresh_cardiac.min = .1; -thresh_cardiac.method = 'auto_matched'; +pulse_detect_options = []; +pulse_detect_options.min = .1; +pulse_detect_options.method = 'auto_matched'; +pulse_detect_options.max_heart_rate_bpm = 30;% actually the breathing rate breaths/per minute if nargin < 4 verbose.level = 0; @@ -65,9 +62,9 @@ verbose_no = verbose; verbose_no.level = 0; timeRpulseMax = tapas_physio_get_cardiac_pulses(t, fr, ... - thresh_cardiac,'OXY', dtBreath, verbose); + pulse_detect_options, 'OXY', verbose); timeRpulseMin = tapas_physio_get_cardiac_pulses(t, -fr, ... - thresh_cardiac,'OXY', dtBreath, verbose); + pulse_detect_options, 'OXY', verbose); nMax = numel(timeRpulseMax); nMin = numel(timeRpulseMin); maxFr = max(abs(fr)); @@ -79,9 +76,19 @@ ampRpulseMax = interp1(timeRpulseMax, fr(iTimeRpulseMax), t, 'linear', 'extrap'); ampRpulseMin = interp1(timeRpulseMin, fr(iTimeRpulseMin), t, 'linear', 'extrap'); +% Interpolate breath duration, but don't extrapolate durationBreath = diff(timeRpulseMax); -interpDurationBreath = interp1(timeRpulseMax(2:end), durationBreath,t, ... - 'linear', 'extrap'); +interpDurationBreath = interp1( ... + timeRpulseMax(2:end), durationBreath, t, ... + 'linear'); +% Nearest-neighbour interpolation for before/after last breath +% Be more careful here as can't let breath duration go negative +if sum(isnan(interpDurationBreath)) > 0 + nan_inds = isnan(interpDurationBreath); + interpDurationBreath(nan_inds) = interp1( ... + timeRpulseMax(2:end), durationBreath, t(nan_inds), ... + 'nearest', 'extrap'); +end if verbose.level>=2 verbose.fig_handles(end+1) = tapas_physio_get_default_fig_params(); diff --git a/PhysIO/code/plot/tapas_physio_plot_spectrum.m b/PhysIO/code/plot/tapas_physio_plot_spectrum.m new file mode 100644 index 00000000..2301a998 --- /dev/null +++ b/PhysIO/code/plot/tapas_physio_plot_spectrum.m @@ -0,0 +1,62 @@ +function [fh, f, P1] = tapas_physio_plot_spectrum(t, y, hAx) +% Plots one-sided amplitude spectrum of a time series, following Matlab +% help examples +% +% [fh, f, P1] = tapas_physio_plot_spectrum(t, y) +% +% IN +% t [nSamples,1] time vector +% y [nSamples,nTimeseries] different signal time series, one per +% columns +% hAx axis handle for plot (optional, otherwise new figure is created) +% +% OUT +% fh figure handle +% f [nSamples/2+1,1] frequency vector (x axis) +% P1 [nSamples/2+1,1] one-sided amplitude spectrum +% +% EXAMPLE +% tapas_physio_plot_spectrum +% +% See also + +% Author: Lars Kasper +% Created: 2019-07-03 +% Copyright (C) 2019 TNU, Institute for Biomedical Engineering, +% University of Zurich and ETH Zurich. +% +% This file is part of the TAPAS PhysIO Toolbox, which is released under +% the terms of the GNU General Public License (GPL), version 3. You can +% redistribute it and/or modify it under the terms of the GPL (either +% version 3 or, at your option, any later version). For further details, +% see the file COPYING or . + +if nargin < 3 + fh = tapas_physio_get_default_fig_params(); +else + axes(hAx); + fh = gcf; +end + +% freq vector for time +L=size(y,1); +Fs = 1/(t(2)-t(1)); +f = Fs*(0:(L/2))/L; + +for iCols = 1:size(y,2) + Y=fft(y(:,iCols)); + + % single sided spectrum + P2 = abs(Y/L); + P1 = P2(1:L/2+1); + P1(2:end-1) = 2*P1(2:end-1); + plot(f,P1); hold all +end +stringTitle = 'Preproc: Single-Sided Amplitude Spectrum'; +title(stringTitle); +xlabel('f (Hz)') +ylabel('|P1(f)|') + +if nargin < 3 % update name of figure only for newly created one + set(gcf, 'Name', stringTitle); +end \ No newline at end of file diff --git a/PhysIO/code/plot/tapas_physio_print_figs_to_file.m b/PhysIO/code/plot/tapas_physio_print_figs_to_file.m index b0b0db88..6fc60e94 100644 --- a/PhysIO/code/plot/tapas_physio_print_figs_to_file.m +++ b/PhysIO/code/plot/tapas_physio_print_figs_to_file.m @@ -1,7 +1,7 @@ function verbose = tapas_physio_print_figs_to_file(verbose, save_dir) % prints all figure handles in verbose-struct to specified filename there % -% physio_print_figs_to_ps(verbose) +% verbose = tapas_physio_print_figs_to_file(verbose, save_dir) % % IN % verbose.fig_handles @@ -10,7 +10,7 @@ % OUT % % EXAMPLE -% physio_print_figs_to_ps +% verbose = tapas_physio_print_figs_to_file(verbose, save_dir) % % See also @@ -20,10 +20,12 @@ % Created: 2013-04-23 % Copyright (C) 2013 TNU, Institute for Biomedical Engineering, University of Zurich and ETH Zurich. % -% This file is part of the TNU CheckPhysRETROICOR toolbox, which is released under the terms of the GNU General Public -% Licence (GPL), version 3. You can redistribute it and/or modify it under the terms of the GPL -% (either version 3 or, at your option, any later version). For further details, see the file -% COPYING or . +% +% This file is part of the TAPAS PhysIO Toolbox, which is released under +% the terms of the GNU General Public Licence (GPL), version 3. You can +% redistribute it and/or modify it under the terms of the GPL (either +% version 3 or, at your option, any later version). For further details, +% see the file COPYING or . if nargin > 1 verbose.fig_output_file = fullfile(save_dir, verbose.fig_output_file); diff --git a/PhysIO/code/preproc/tapas_physio_filter_cardiac.m b/PhysIO/code/preproc/tapas_physio_filter_cardiac.m new file mode 100644 index 00000000..1b38b1f9 --- /dev/null +++ b/PhysIO/code/preproc/tapas_physio_filter_cardiac.m @@ -0,0 +1,111 @@ +function [fc, verbose] = tapas_physio_filter_cardiac(t,c, options, verbose) +% Bandpass-filters cardiac data using butterworth/chebyshev filters +% +% [fc, verbose] = tapas_physio_filter_cardiac(t,c,options, verbose) +% +% IN +% t [nSamples,1] time vector of cardiac time series +% c [nSamples, 1] cardiac time series +% options filter options +% type 'butter' Butterworth, flat passband) or +% 'cheby2' Chebychev Type II, for steep transitions +% between pass/stop band +% passband [f_min, f_max] in Hz +% stopband [f_min, f_max] in Hz +% verbose if .level >=2, output plot comparing filtered/unfiltered +% time series +% +% OUT +% fc filtered time series +% verbose if plots were created, figure handles added here +% +% EXAMPLE +% tapas_physio_filter_cardiac +% +% See also tapas_physio_new + +% Author: Lars Kasper, based on code snippets at +% https://ch.mathworks.com/matlabcentral/answers/327475-band-pass-butterworth-filter +% Created: 2019-07-02 +% Copyright (C) 2019 TNU, Institute for Biomedical Engineering, +% University of Zurich and ETH Zurich. +% +% This file is part of the TAPAS PhysIO Toolbox, which is released under +% the terms of the GNU General Public License (GPL), version 3. You can +% redistribute it and/or modify it under the terms of the GPL (either +% version 3 or, at your option, any later version). For further details, +% see the file COPYING or . + +doFilter = options.include && ~isempty(options.passband); + +if ~doFilter + fc = c; +else + % set default stopband 10% bigger than passband + if isempty(options.stopband) + widthPassBand = diff(options.passband); + marginTransitionBand = 0.1*widthPassBand; + options.stopband = [ options.passband(1)-marginTransitionBand, ... + options.passband(2)+marginTransitionBand ]; + end + + Fsp = 1/(t(2) - t(1)); % sampling rate + deltaF = 1/(t(end)-t(1)); + + % filter boundaries check! + options.passband(1) = max(2*deltaF, options.passband(1)); + options.passband(2) = min(Fsp-deltaF, options.passband(2)); + options.stopband(1) = max(deltaF, options.stopband(1)); + options.stopband(2) = min(Fsp, options.stopband(2)); + + + Fn = Fsp/2; + Wp = options.passband/Fn; + Ws = options.stopband/Fn; + + switch lower(options.type) + case {'butter', 'butterworth'} + + [z,p,k]=butter(8,Wp,'bandpass'); + [sos,g]=zp2sos(z,p,k); + + % Rp=1; + % Rs=25; + % [n,Wn] = buttord(Wp,Ws,Rp,Rs); + % [b,a]=butter(n,Wn); + % [sos,g]=tf2sos(b,a); + case {'cheby2', 'chebychev'} + Rp=10; + Rs=30; + [n,Ws] = cheb2ord(Wp,Ws,Rp,Rs); + [z,p,k] = cheby2(n,Rs,Ws); + [sos,g] = zp2sos(z,p,k); + end + fc=filtfilt(sos,g,c); + + + %% plot filter response + if verbose.level >=3 + fvtool(sos,'Analysis','freq') + end + + %% plot filtering results + if verbose.level >=2 + stringTitle = 'Preproc: Bandpass-filtered Filtered Cardiac time series'; + verbose.fig_handles(end+1) = tapas_physio_get_default_fig_params(); + set(gcf, 'Name', stringTitle); + + % plot raw/filtered time series + subplot(2,1,1); + plot(t, c); hold all; + plot(t, fc); + xlabel('t(s)'); + ylabel('Cardiac Wave Amplitude (a.u.)'); + legend('raw', sprintf('filtered (%s)', options.type)); + title(stringTitle); + + subplot(2,1,2); + tapas_physio_plot_spectrum(t,[c fc], gca); + legend('raw', sprintf('filtered (%s)', options.type)); + end +end diff --git a/PhysIO/code/preproc/tapas_physio_find_ecg_r_peaks.m b/PhysIO/code/preproc/tapas_physio_find_ecg_r_peaks.m index c9c3c8a6..9a66c970 100644 --- a/PhysIO/code/preproc/tapas_physio_find_ecg_r_peaks.m +++ b/PhysIO/code/preproc/tapas_physio_find_ecg_r_peaks.m @@ -86,7 +86,16 @@ %% smooth ECG curve with R-wave kernel and plot autocorrelation -sy = conv(y./sqrt(sum(kRpeak.^2)),kRpeak/sqrt(sum(kRpeak.^2)),'same'); +% https://en.wikipedia.org/wiki/Matched_filter +filter = kRpeak / sqrt(sum(kRpeak.^2)); +if mod(length(filter), 2) == 0 + filter = [filter(:); 0.0]; % tapas_physio_conv needs odd length +end +sy = tapas_physio_conv(y / sqrt(sum(kRpeak.^2)), flip(filter), 'symmetric'); +% Note we don't necessarily know the phase here! We assume a symmetric +% filter (i.e. the central point is `t=0`), but that isn't necessarily the +% case (e.g. for a manual template). However, that gives us the detected +% peaks at the centre of the template, which is typically what we want. peaks_found = false; thresh_changed = false; diff --git a/PhysIO/code/preproc/tapas_physio_get_cardiac_pulse_template.m b/PhysIO/code/preproc/tapas_physio_get_cardiac_pulse_template.m index 93ebd619..5cff7b5a 100644 --- a/PhysIO/code/preproc/tapas_physio_get_cardiac_pulse_template.m +++ b/PhysIO/code/preproc/tapas_physio_get_cardiac_pulse_template.m @@ -118,7 +118,7 @@ plot(t, c, 'k'); title('Preproc: Finding first peak of cycle, backwards') end verbose = tapas_physio_log(['No peaks found in raw cardiac time series. Check raw ' ... - 'physiological recordings figure whether there is any non-constant' ... + 'physiological recordings figure whether there is any non-constant ' ... 'cardiac data'], verbose, 2); % error! end diff --git a/PhysIO/code/preproc/tapas_physio_get_cardiac_pulses.m b/PhysIO/code/preproc/tapas_physio_get_cardiac_pulses.m index 8475dc78..e5920ea0 100644 --- a/PhysIO/code/preproc/tapas_physio_get_cardiac_pulses.m +++ b/PhysIO/code/preproc/tapas_physio_get_cardiac_pulses.m @@ -1,13 +1,14 @@ function [cpulse, verbose] = tapas_physio_get_cardiac_pulses(t, c, ... - thresh_cardiac, cardiac_modality, dt120, verbose) + cpulse_detect_options, cardiac_modality, verbose) % extract heartbeat events from ECG or pulse oximetry time course % -% cpulse = tapas_physio_get_cardiac_pulses(t, c, thresh_cardiac, cardiac_modality, verbose); +% cpulse = tapas_physio_get_cardiac_pulses(t, c, cpulse_detect_options, cardiac_modality, verbose); % % IN % t vector of time series of log file (in seconds, corresponds to c) % c raw time series of ECG or pulse oximeter -% thresh_cardiac is a structure with the following elements +% cpulse_detect_options +% is a structure with the following elements % .method - 'auto_matched', 'manual_template', 'load_from_logfile', % 'load_template' % Specifies how to determine QRS-wave from noisy input @@ -28,14 +29,15 @@ % This file is saved after picking the QRS-wave % manually (i.e. if .ECG_min is set), so that % results are reproducible +% .max_heart_rate_bpm +% maximum allowed physiological heart rate (in beats +% per minute) for subject; default: 90 bpm % .krPeak [false] or true; if true, a user input is -% required to specify a characteristic R-peak interval in the ECG -% or pulse oximetry time series +% required to specify a characteristic R-peak interval in the ECG +% or pulse oximetry time series % cardiac_modality 'ECG', 'ECG_WiFi' electrocardiogram (with/without % wireless transmisssion for Philips data) % 'OXY'/'PPU' pulse oximetry unit -% dt120 - minimum distance between heart beats; default 120 -% bpm, i.e. 0.5 s % % verbose Substructure of Physio, holding verbose.level and % verbose.fig_handles with plotted figure handles @@ -64,16 +66,20 @@ %% detection of cardiac R-peaks -dt = t(2)-t(1); -if nargin < 5 || isempty(dt120) - dt120 = round(0.5/dt); % heart rate < 120 bpm +dt = t(2) - t(1); +minPulseDistanceSamples = ... + floor((1 / (cpulse_detect_options.max_heart_rate_bpm / 60)) / dt); + +if isempty(minPulseDistanceSamples) + minPulseDistanceSamples = round(0.5 / dt); % heart rate < 120 bpm end + switch lower(cardiac_modality) case 'oxy_old' [cpulse, verbose] = tapas_physio_get_oxy_pulses_filtered(c, t, ... - dt120, verbose); + minPulseDistanceSamples, verbose); otherwise % {'oxy','ppu', 'oxy_wifi', 'ppu_wifi','ecg', 'ecg_wifi'} etc., including ecg_raw o - switch thresh_cardiac.method + switch cpulse_detect_options.method case 'load_from_logfile' verbose = tapas_physio_log('How did you end up here? I better do nothing.', ... verbose, 1); @@ -81,10 +87,10 @@ case {'manual', 'manual_template', 'load', 'load_template'} % load/determine manual template [cpulse, verbose] = ... tapas_physio_get_cardiac_pulses_manual_template(... - c, t, thresh_cardiac, verbose); + c, t, cpulse_detect_options, verbose); case {'auto', 'auto_template', 'auto_matched'} [cpulse, verbose] = ... tapas_physio_get_cardiac_pulses_auto_matched( ... - c, t, thresh_cardiac.min, dt120, verbose); - end % switch thresh_cardiac.method + c, t, cpulse_detect_options.min, minPulseDistanceSamples, verbose); + end % switch cpulse_detect_options.method end diff --git a/PhysIO/code/preproc/tapas_physio_get_cardiac_pulses_manual_template.m b/PhysIO/code/preproc/tapas_physio_get_cardiac_pulses_manual_template.m index 38f59092..3b2e8bbe 100644 --- a/PhysIO/code/preproc/tapas_physio_get_cardiac_pulses_manual_template.m +++ b/PhysIO/code/preproc/tapas_physio_get_cardiac_pulses_manual_template.m @@ -1,5 +1,5 @@ function [cpulse, verbose] = tapas_physio_get_cardiac_pulses_manual_template(... - c, t, thresh_cardiac_initial_cpulse_select, verbose) + c, t, pulse_detect_options, verbose) % Detects R-peaks via matched-filter smoothing & peak detection using a % manually defined QRS-wave (or R-peak environment) % @@ -9,7 +9,7 @@ % IN % c [nSamples, 1] raw pulse oximeter samples % t [nSamples, 1] time vector corresponding to samples (un seconds) -% thresh_cardiac_initial_cpulse_select +% pulse_detect_options % physio.thresh.cardiac.initial_cpulse_select-substructure % with elements % .method 'manual' or 'load'/'load_template' @@ -45,30 +45,30 @@ % manual peak selection, if no file selected and loading is % specified -hasKrpeakLogfile = exist(thresh_cardiac_initial_cpulse_select.file,'file') || ... - exist([thresh_cardiac_initial_cpulse_select.file '.mat'],'file'); +hasKrpeakLogfile = exist(pulse_detect_options.file,'file') || ... + exist([pulse_detect_options.file '.mat'],'file'); % if no file exists, also do manual peak-find doSelectTemplateManually = any(strcmpi(... - thresh_cardiac_initial_cpulse_select.method, ... + pulse_detect_options.method, ... {'manual', 'manual_template'})) || ~hasKrpeakLogfile; if doSelectTemplateManually - thresh_cardiac_initial_cpulse_select.kRpeak = []; - hasECGMin = isfield(thresh_cardiac_initial_cpulse_select, 'min') && ~isempty(thresh_cardiac_initial_cpulse_select.min); + pulse_detect_options.kRpeak = []; + hasECGMin = isfield(pulse_detect_options, 'min') && ~isempty(pulse_detect_options.min); if ~hasECGMin - thresh_cardiac_initial_cpulse_select.min = 0.5; + pulse_detect_options.min = 0.5; end else - fprintf('Loading %s\n', thresh_cardiac_initial_cpulse_select.file); - ECGfile = load(thresh_cardiac_initial_cpulse_select.file); - thresh_cardiac_initial_cpulse_select.min = ECGfile.ECG_min; - thresh_cardiac_initial_cpulse_select.kRpeak = ECGfile.kRpeak; + fprintf('Loading %s\n', pulse_detect_options.file); + ECGfile = load(pulse_detect_options.file); + pulse_detect_options.min = ECGfile.ECG_min; + pulse_detect_options.kRpeak = ECGfile.kRpeak; end inp_events = []; -ECG_min = thresh_cardiac_initial_cpulse_select.min; -kRpeak = thresh_cardiac_initial_cpulse_select.kRpeak; +ECG_min = pulse_detect_options.min; +kRpeak = pulse_detect_options.kRpeak; if doSelectTemplateManually while ECG_min [cpulse, ECG_min_new, kRpeak] = tapas_physio_find_ecg_r_peaks(t,c, ECG_min, [], inp_events); @@ -83,5 +83,5 @@ % save manually found peak parameters to file if doSelectTemplateManually - save(thresh_cardiac_initial_cpulse_select.file, 'ECG_min', 'kRpeak'); + save(pulse_detect_options.file, 'ECG_min', 'kRpeak'); end \ No newline at end of file diff --git a/PhysIO/code/preproc/tapas_physio_get_oxy_pulses_filtered.m b/PhysIO/code/preproc/tapas_physio_get_oxy_pulses_filtered.m index 336c13c3..0c207dc0 100644 --- a/PhysIO/code/preproc/tapas_physio_get_oxy_pulses_filtered.m +++ b/PhysIO/code/preproc/tapas_physio_get_oxy_pulses_filtered.m @@ -40,8 +40,8 @@ c = c-mean(c); c = c./max(c); % normalize time series % smooth noisy pulse oximetry data to detect peaks -w = tapas_physio_gausswin(dt120,1); -sc = conv(c, w, 'same'); +w = tapas_physio_gausswin(2*floor(dt120/2)+1, 1); % Odd number of samples +sc = tapas_physio_conv(c, w, 'symmetric'); sc = sc-mean(sc); sc = sc./max(sc); % normalize time series % Highpass filter to remove drifts diff --git a/PhysIO/code/preproc/tapas_physio_get_respiratory_phase.m b/PhysIO/code/preproc/tapas_physio_get_respiratory_phase.m index 75fed38b..c0019dd1 100644 --- a/PhysIO/code/preproc/tapas_physio_get_respiratory_phase.m +++ b/PhysIO/code/preproc/tapas_physio_get_respiratory_phase.m @@ -75,9 +75,12 @@ % Calculate derivative of normalised pulse wrt time % over 1 sec of data as described in Glover et al. ksize = round(0.5 * (1/rsampint)); -kernel = [ones(1, ksize)*-1 0 ones(1, ksize)]; -dpulse = -conv(pulset, kernel); -dpulse = dpulse(ksize+1:end-ksize); +kernel = ksize:-1:-ksize; kernel = kernel ./ sum(kernel.^2); +dpulse = tapas_physio_conv(pulset, kernel, 'symmetric'); +% This uses a quadratic Savitzky-Golay filter, for which the coefficients +% have a simple linear form. See e.g. +% https://en.wikipedia.org/wiki/Savitzky%E2%80%93Golay_filter +% `scipy.signal.savgol_coeffs(5, polyorder=2, deriv=1, use='conv')` % Tolerance to the derivative dpulse(abs(dpulse) < 1e-4) = 0; diff --git a/PhysIO/code/preproc/tapas_physio_simulate_pulse_samples.m b/PhysIO/code/preproc/tapas_physio_simulate_pulse_samples.m index 32f5e9da..90d7d127 100644 --- a/PhysIO/code/preproc/tapas_physio_simulate_pulse_samples.m +++ b/PhysIO/code/preproc/tapas_physio_simulate_pulse_samples.m @@ -76,6 +76,7 @@ end % ...and convolve with pulse template +% **TODO** tapas_physio_conv simulatedSamples = conv(simulatedPulses, pulseTemplate, 'same'); if doDebug diff --git a/PhysIO/code/readin/tapas_physio_read_physlogfiles_bids.m b/PhysIO/code/readin/tapas_physio_read_physlogfiles_bids.m index be15fa9a..051214a7 100644 --- a/PhysIO/code/readin/tapas_physio_read_physlogfiles_bids.m +++ b/PhysIO/code/readin/tapas_physio_read_physlogfiles_bids.m @@ -79,6 +79,7 @@ hasRespirationFile = ~isempty(log_files.respiration); hasCardiacFile = ~isempty(log_files.cardiac); +hasExplicitJsonFile = ~isempty(log_files.scan_timing); if hasCardiacFile fileName = log_files.cardiac; @@ -100,7 +101,9 @@ fileJson = regexprep(fileName, '\.tsv', '\.json'); end - +if hasExplicitJsonFile + fileJson = log_files.scan_timing; +end hasJsonFile = isfile(fileJson); @@ -123,14 +126,23 @@ end end -tRelStartScan = log_files.relative_start_acquisition; -if isempty(tRelStartScan) +% sum implicit (.json) and explicit relative shifts of log/scan acquisition +if isempty(log_files.relative_start_acquisition) if hasJsonFile % in BIDS, start of the phys logging is stated relative to the first volume scan start. % PhysIO defines the scan acquisiton relative to the phys log start tRelStartScan = -val.StartTime; else - tRelStartScan = 0; + verbose = tapas_physio_log(... + ['No .json file found and empty log_files.relative_start_acquisition. ' ... + 'Please specify explicitly.'], verbose, 2); + end +else + if hasJsonFile + % add both delays + tRelStartScan = log_files.relative_start_acquisition - val.StartTime; + else + tRelStartScan = log_files.relative_start_acquisition; end end diff --git a/PhysIO/code/readin/tapas_physio_read_physlogfiles_siemens.m b/PhysIO/code/readin/tapas_physio_read_physlogfiles_siemens.m index 0843e141..c62661a6 100755 --- a/PhysIO/code/readin/tapas_physio_read_physlogfiles_siemens.m +++ b/PhysIO/code/readin/tapas_physio_read_physlogfiles_siemens.m @@ -76,6 +76,12 @@ dt = log_files.sampling_interval; +explicit_relative_start_acquisition = log_files.relative_start_acquisition; + +if isempty(explicit_relative_start_acquisition) + explicit_relative_start_acquisition = 0; +end + %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %% Determine relative start of acquisition from dicom headers and @@ -133,7 +139,7 @@ % add arbitrary offset specified by user relative_start_acquisition = relative_start_acquisition + ... - log_files.relative_start_acquisition; + explicit_relative_start_acquisition; data_table = tapas_physio_siemens_line2table(lineData, cardiac_modality); @@ -204,7 +210,7 @@ % add arbitrary offset specified by user relative_start_acquisition = relative_start_acquisition + ... - log_files.relative_start_acquisition; + explicit_relative_start_acquisition; data_table = tapas_physio_siemens_line2table(lineData, 'RESP'); diff --git a/PhysIO/code/sync/tapas_physio_create_scan_timing_from_gradients_auto_philips.m b/PhysIO/code/sync/tapas_physio_create_scan_timing_from_gradients_auto_philips.m index 2e71d748..6c7f583c 100644 --- a/PhysIO/code/sync/tapas_physio_create_scan_timing_from_gradients_auto_philips.m +++ b/PhysIO/code/sync/tapas_physio_create_scan_timing_from_gradients_auto_philips.m @@ -366,6 +366,7 @@ set(gcf, 'Name', stringTitle); ampl = max(abs(G)); +% **TODO** tapas_physio_conv sG = conv(G, templateGradientVolume/sum(abs(templateGradientVolume)), ... 'same'); @@ -396,6 +397,7 @@ set(gcf, 'Name', stringTitle); ampl = max(abs(G)); +% **TODO** tapas_physio_conv sG = conv(G, templateGradientSlice/sum(abs(templateGradientSlice)), ... 'same'); diff --git a/PhysIO/code/tapas_physio_cfg_matlabbatch.m b/PhysIO/code/tapas_physio_cfg_matlabbatch.m index 90bb87de..e24ff2d2 100644 --- a/PhysIO/code/tapas_physio_cfg_matlabbatch.m +++ b/PhysIO/code/tapas_physio_cfg_matlabbatch.m @@ -167,7 +167,8 @@ relative_start_acquisition.help = { ' Time (in seconds) when the 1st scan (or, if existing, dummy) started,' ' relative to the start of the logfile recording;' - ' e.g. 0 if simultaneous start' + ' [] (empty) to read from explicit acquisition timing info (s.b.)' + ' 0 if simultaneous start' ' 10, if 1st scan starts 10' ' seconds AFTER physiological' ' recording' @@ -176,12 +177,12 @@ ' NOTE: ' ' 1. For Philips SCANPHYSLOG, this parameter is ignored, if' ' scan_timing.sync is set.' - ' 2. If you specify an acquisition_info file, leave this parameter' - ' at 0 (e.g., for Siemens_Tics) since physiological recordings' - ' and acquisition timing are already synchronized by this' - ' information, and you would introduce another shift.' - ' 3. For BIDS, relative_start_acquisition is read as -StartTime from' - ' accompanying json-file, if existing' + ' 2. If you specify an acquisition_info file, leave this' + ' parameter empty or 0 (e.g., for Siemens_Tics, BIDS) since' + ' physiological recordings and acquisition timing are already' + ' synchronized by this information, and you would introduce an' + ' additional shift.' + }; relative_start_acquisition.strtype = 'e'; relative_start_acquisition.num = [Inf Inf]; @@ -555,6 +556,27 @@ initial_cpulse_select_file.num = [0 Inf]; initial_cpulse_select_file.val = {'initial_cpulse_kRpeakfile.mat'}; +%-------------------------------------------------------------------------- +% max_heart_rate_bpm +%-------------------------------------------------------------------------- +max_heart_rate_bpm = cfg_entry; +max_heart_rate_bpm.tag = 'max_heart_rate_bpm'; +max_heart_rate_bpm.name = 'Maximum heart rate (BPM)'; +max_heart_rate_bpm.help = { + 'Maximum expected heart rate in beats per minute. (default: 90)' + 'This only needs to be a rough guess and should be changed for specific' + 'subject populations.' + ' - If set too low, the auto_matched pulse detection might miss genuine' + ' cardiac pulses' + ' - If set too high, it might introduce artifactual pulse events, i.e.' + ' interpreting local maxima within a pulse as new pulse events' + ' You may need to increase this value if you have a subject with a very' + ' high heart rate, or decrease it if you have very pronounced local maxima' + ' in your wave form.' + }; +max_heart_rate_bpm.strtype = 'e'; +max_heart_rate_bpm.num = [0 Inf]; +max_heart_rate_bpm.val = {90}; %-------------------------------------------------------------------------- @@ -578,7 +600,8 @@ initial_cpulse_select_method_auto_template.name = 'auto_template'; initial_cpulse_select_method_auto_template.val = { min - initial_cpulse_select_file + initial_cpulse_select_file + max_heart_rate_bpm }; initial_cpulse_select_method_auto_template.help = { ... ' Auto generation of representative QRS-wave; detection via' @@ -595,6 +618,7 @@ initial_cpulse_select_method_auto_matched.val = { min initial_cpulse_select_file + max_heart_rate_bpm }; initial_cpulse_select_method_auto_matched.help = { ... 'Auto generation of template QRS wave, ' @@ -794,6 +818,10 @@ }; +%-------------------------------------------------------------------------- +% filter for cardiac time series +%-------------------------------------------------------------------------- +filter = tapas_physio_gui_filter(); %-------------------------------------------------------------------------- % cardiac @@ -801,7 +829,7 @@ cardiac = cfg_branch; cardiac.tag = 'cardiac'; cardiac.name = 'cardiac'; -cardiac.val = {modality initial_cpulse_select posthoc_cpulse_select}; +cardiac.val = {modality filter initial_cpulse_select posthoc_cpulse_select}; cardiac.help = {'...'}; diff --git a/PhysIO/code/tapas_physio_main_create_regressors.m b/PhysIO/code/tapas_physio_main_create_regressors.m index 35750e11..bd235844 100644 --- a/PhysIO/code/tapas_physio_main_create_regressors.m +++ b/PhysIO/code/tapas_physio_main_create_regressors.m @@ -39,12 +39,14 @@ % Author: Lars Kasper % Created: 2011-08-01 -% Copyright (C) 2011-2018 TNU, Institute for Biomedical Engineering, University of Zurich and ETH Zurich. +% Copyright (C) 2011-2019 TNU, Institute for Biomedical Engineering, +% University of Zurich and ETH Zurich. % -% This file is part of the TAPAS PhysIO Toolbox, which is released under the terms of the GNU General Public -% Licence (GPL), version 3. You can redistribute it and/or modify it under the terms of the GPL -% (either version 3 or, at your option, any later version). For further details, see the file -% COPYING or . +% This file is part of the TAPAS PhysIO Toolbox, which is released under +% the terms of the GNU General Public Licence (GPL), version 3. You can +% redistribute it and/or modify it under the terms of the GPL (either +% version 3 or, at your option, any later version). For further details, +% see the file COPYING or . %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @@ -57,7 +59,6 @@ % These parameters could become toolbox inputs... minConstantIntervalAlertSeconds = 0.2; -maxHeartRateBpm = 90; if ~nargin error('Please specify a PhysIO-object as input to this function. See tapas_physio_new'); @@ -158,17 +159,19 @@ % preproc.cardiac.modality = 'OXY'; % 'ECG' or 'OXY' (for pulse oximetry) %% initial pulse select via load from logfile or autocorrelation with 1 %% cardiac pulse + + [ons_secs.c, verbose] = tapas_physio_filter_cardiac(... + ons_secs.t, ons_secs.c, preproc.cardiac.filter, verbose); + switch preproc.cardiac.initial_cpulse_select.method case {'load_from_logfile', ''} % do nothing otherwise - minCardiacCycleSamples = floor((1/(maxHeartRateBpm/60)/ons_secs.dt)); - % run one of the various cardiac pulse detection algorithms [ons_secs.cpulse, verbose] = ... tapas_physio_get_cardiac_pulses(ons_secs.t, ons_secs.c, ... preproc.cardiac.initial_cpulse_select, ... - preproc.cardiac.modality, minCardiacCycleSamples, verbose); + preproc.cardiac.modality, verbose); end diff --git a/PhysIO/code/tapas_physio_new.m b/PhysIO/code/tapas_physio_new.m index e1756f19..c6ee6036 100644 --- a/PhysIO/code/tapas_physio_new.m +++ b/PhysIO/code/tapas_physio_new.m @@ -166,7 +166,9 @@ % Time (in seconds) when the 1st scan (or, if existing, dummy) started, % relative to the start of the logfile recording; - % e.g. 0 if simultaneous start + % e.g. + % [] (empty) to read from explicit acquisition timing info (s.b.) + % 0 if simultaneous start % 10, if 1st scan starts 10 % seconds AFTER physiological % recording @@ -175,10 +177,11 @@ % NOTE: % 1. For Philips SCANPHYSLOG, this parameter is ignored, if % scan_timing.sync is set. - % 2. If you specify an acquisition_info file, leave this parameter - % at 0 (e.g., for Siemens_Tics) since physiological recordings - % and acquisition timing are already synchronized by this - % information, and you would introduce another shift. + % 2. If you specify an acquisition_info file, leave this + % parameter empty or 0 (e.g., for Siemens_Tics, BIDS) since + % physiological recordings and acquisition timing are already + % synchronized by this information, and you would introduce an + % additional shift. % log_files.relative_start_acquisition = 0; @@ -291,11 +294,45 @@ preproc = []; preproc.cardiac = []; - preproc.cardiac.modality = 'ecg_wifi'; % 'ECG','ECG_raw', or 'OXY'/'PPU' (for pulse oximetry), 'OXY_OLD', [deprecated] + + % Measurement modality of input cardiac signal + % 'ECG','ECG_raw', or 'OXY'/'PPU' (for pulse oximetry), 'OXY_OLD', [deprecated] + preproc.cardiac.modality = 'ecg_wifi'; + + % Filter properties for bandpass-filtering of cardiac signal before peak + % detection, phase extraction, and other physiological traces + preproc.cardiac.filter = []; + + preproc.cardiac.filter.include = 0; % 1 = filter executed; 0 = not used + + % filter type default: 'cheby2' + % 'cheby2' Chebychev Type II filter, use for steep transition from + % start to stop band + % 'butter' butterworth filter, standard filter with maximally flat + % passband (Infinite impulse response), but stronger + % ripples in transition band + preproc.cardiac.filter.type = 'butter'; + + % + % [f_min, f_max] frequency interval in Hz of all frequency that should + % pass the passband filter + % default: [0.3 9] (to remove slow drifts, breathing + % and slice sampling artifacts) + % if empty, no filtering is performed + preproc.cardiac.filter.passband = [0.3 9]; + + % [f_min, f_max] frequency interval in Hz of all frequencies, s.th. frequencies + % outside this band should definitely *NOT* pass the filter + % Default: [] + % NOTE: only relevant for 'cheby2' filter type + % if empty, and passband is empty, no filtering is performed + % if empty, but passband exists, stopband interval is + % 10% increased passband interval + preproc.cardiac.filter.stopband = []; % The initial cardiac pulse selection structure: Determines how the % majority of cardiac pulses is detected - % default: auto + % default: 'auto_matched' % % 'auto_matched' % - auto generation of representative QRS-wave; detection via @@ -306,6 +343,17 @@ % 'load' - from previous manual/auto run preproc.cardiac.initial_cpulse_select.method = 'auto_matched'; + % maximum allowed physiological heart rate (in beats per minute) + % for subject; default: 90 bpm + % - If set too low, the auto_mathed pulse detection might miss genuine + % cardiac pulses + % - If set too high, it might introduce artifactual pulse events, i.e. + % interpreting local maxima within a pulse as new pulse events + % Adjust this value, if you have a subject with very high heart rate + % (increase!), or if you have very pronounced local maxima in your wave form + % (decrease!). + preproc.cardiac.initial_cpulse_select.max_heart_rate_bpm = 90; + % file containing reference ECG-peak (variable kRpeak) % used for method 'manual' or 'load' [default: not set] % if method == 'manual', this file is saved after picking the QRS-wave diff --git a/PhysIO/code/tapas_physio_version.m b/PhysIO/code/tapas_physio_version.m index a7c98aa0..f9b49671 100644 --- a/PhysIO/code/tapas_physio_version.m +++ b/PhysIO/code/tapas_physio_version.m @@ -23,4 +23,4 @@ % version 3 or, at your option, any later version). For further details, % see the file COPYING or . % -versionPhysio = 'R2019a-v7.1.0'; \ No newline at end of file +versionPhysio = 'R2019b-v7.2.0'; \ No newline at end of file diff --git a/PhysIO/code/utils/tapas_physio_conv.m b/PhysIO/code/utils/tapas_physio_conv.m new file mode 100644 index 00000000..b6a65c41 --- /dev/null +++ b/PhysIO/code/utils/tapas_physio_conv.m @@ -0,0 +1,71 @@ +function [w] = tapas_physio_conv(u, v, filter_type, padding) +% Wrapper around `conv()` for convolution +% Deals with the padding and time offsets +% +% [w] = tapas_physio_filter_cardiac(u, v, filter_type) +% +% IN +% u Data time series [1-D] +% v Convolutional filter time series [1-D] +% filter_type ['causal', 'symmetric']. +% If 'causal', the filter is taken to be defined for +% `t >= 0`, with the first element corresponding to `t=0`. +% If 'symmetric', the filter is taken to be defined for both +% positive and negative time, with the central element +% corresponding to `t=0`. +% N.B. 'symmetric' implies an *odd* filter length. +% padding ['mean', 'zero']. Whether to pad with the mean of `u`, or +% with zeros. +% +% OUT +% w Convolved time series [size(u)] + +% Author: Sam Harrison +% Created: 2019-07-11 +% Copyright (C) 2019 TNU, Institute for Biomedical Engineering, +% University of Zurich and ETH Zurich. +% +% This file is part of the TAPAS PhysIO Toolbox, which is released under +% the terms of the GNU General Public License (GPL), version 3. You can +% redistribute it and/or modify it under the terms of the GPL (either +% version 3 or, at your option, any later version). For further details, +% see the file COPYING or . + +if ~isvector(u) || ~isvector(v) + error('tapas_physio_conv: Both inputs must be vectors') +end +% Padding: use data mean to reduce transients by default +if nargin < 4 + padding = 'mean'; +end + +% Pad value +switch lower(padding) + case 'mean' + pad_val = mean(u); + case 'zero' + pad_val = 0.0; + otherwise + error('Unrecognised padding argument (%s)', padding) +end + +% Pad shape +switch lower(filter_type) + case 'causal' + u_pad = [pad_val * ones(length(v)-1, 1); u(:)]; + case 'symmetric' + if mod(length(v), 2) == 1 + pad_elem = (length(v) - 1) / 2; + u_pad = [pad_val * ones(pad_elem, 1); u(:); pad_val * ones(pad_elem, 1)]; + else + error('Symmetric filter lengths must be odd!') + end + otherwise + error('Unrecognised padding argument (%s)', filter_type) +end + +% Apply convolution and select portion of interest +w = conv(u_pad, v, 'valid'); +w = reshape(w, size(u)); + +end \ No newline at end of file diff --git a/PhysIO/code/utils/tapas_physio_job2physio.m b/PhysIO/code/utils/tapas_physio_job2physio.m index 0a696e86..bdc6a17f 100644 --- a/PhysIO/code/utils/tapas_physio_job2physio.m +++ b/PhysIO/code/utils/tapas_physio_job2physio.m @@ -6,11 +6,13 @@ % IN % % OUT +% physio physio input structure, as use by +% tapas_physio_main_create_regressors % % EXAMPLE % physio = tapas_physio_job2physio(job) % -% See also spm_physio_cfg_matlabbatch +% See also tapas_physio_cfg_matlabbatch tapas_physio_main_create_regressors % Author: Lars Kasper % Created: 2015-01-05 @@ -26,7 +28,7 @@ physio = tapas_physio_new(); -%% Use existing properties that are cfg_choices in job to overwrite +%% Use existing properties that are cfg_choices in job to overwrite % properties of physio and set corresponding method physio = tapas_physio_update_from_job(physio, job, ... @@ -43,8 +45,8 @@ 'noise_rois', 'other'}; physio = tapas_physio_update_from_job(physio, job, ... - strcat('model.', modelArray), strcat('model.', modelArray), ... - true, 'include'); + strcat('model.', modelArray), strcat('model.', modelArray), ... + true, 'include'); %% Convert yes => true (=1) and no => false (=0) nModels = numel(modelArray); @@ -53,6 +55,26 @@ physio.model.(modelArray{iModel}).include, 'yes'); end +%% Take over yes/no substructs as is, yes/no will become 'include' property +yesNoArray = ... + {'preproc.cardiac.filter'}; + +physio = tapas_physio_update_from_job(physio, job, ... + yesNoArray, yesNoArray, true, 'include'); + +%% Convert yes => true (=1) and no => false (=0) +nChoices = numel(yesNoArray); +for iChoice = 1:nChoices + try + eval(sprintf(['physio.%s.include = strcmpi(' ... + 'physio.%s.include, ''yes'');'], yesNoArray{iChoice}, ... + yesNoArray{iChoice})); + catch err + tapas_physio_log(sprintf('No property %s defined in job (error: %s)', ... + yesNoArray{iChoice}, err.message), [], 1); + end +end + %% Use existing properties in job to overwrite properties of physio physio = tapas_physio_update_from_job(physio, job, ... {'preproc.cardiac.modality', 'scan_timing.sqpar', ... diff --git a/PhysIO/code/utils/tapas_physio_save_batch_mat_script.m b/PhysIO/code/utils/tapas_physio_save_batch_mat_script.m index 8471c72a..52f2a93d 100644 --- a/PhysIO/code/utils/tapas_physio_save_batch_mat_script.m +++ b/PhysIO/code/utils/tapas_physio_save_batch_mat_script.m @@ -48,6 +48,7 @@ if ~ischar(fileBatchM) matlabbatch = fileBatchM; fileBatchM = fullfile(pwd, 'physio_job.m'); + fileBatchMat = fullfile(pwd, 'physio_job.mat'); else [fp,fn,ext] = fileparts(fileBatchM); switch ext diff --git a/PhysIO/code/utils/tapas_physio_update_from_job.m b/PhysIO/code/utils/tapas_physio_update_from_job.m index e6460dc5..aab6a9c7 100644 --- a/PhysIO/code/utils/tapas_physio_update_from_job.m +++ b/PhysIO/code/utils/tapas_physio_update_from_job.m @@ -83,34 +83,43 @@ for p = 1:nProperties - currentProperty = eval(sprintf('job.%s', jobPropertyArray{p})); - - % overwrite properties of physio with sub-properties of job, also - % set value of branchProperty to name of current property - if isBranch{p} - valueBranchArray = fields(currentProperty); - valueBranch = valueBranchArray{1}; - eval(sprintf('physio.%s.%s = valueBranch;', ... - physioPropertyArray{p}, branchProperty{p})); - - currentProperty = currentProperty.(valueBranch); + try + currentProperty = eval(sprintf('job.%s', jobPropertyArray{p})); + catch err + currentProperty = []; + tapas_physio_log(sprintf('No property %s defined in job (error: %s)', ... + jobPropertyArray{p}, err.message), [], 1); end - - % update property itself, if it has no sub-properties - if ~isstruct(currentProperty) - eval(sprintf('physio.%s = currentProperty;', ... - physioPropertyArray{p})); - else + if ~isempty(currentProperty) % no error in retrieval => continue parsing! - % update all existing sub-properties in job to physio + % overwrite properties of physio with sub-properties of job, also + % set value of branchProperty to name of current property + if isBranch{p} + valueBranchArray = fields(currentProperty); + valueBranch = valueBranchArray{1}; + eval(sprintf('physio.%s.%s = valueBranch;', ... + physioPropertyArray{p}, branchProperty{p})); + + currentProperty = currentProperty.(valueBranch); + end - subPropArray = fields(currentProperty); - nFields = numel(subPropArray); - for f = 1:nFields - eval(sprintf('physio.%s.%s = currentProperty.%s;', ... - physioPropertyArray{p},subPropArray{f}, subPropArray{f})); + % update property itself, if it has no sub-properties + if ~isstruct(currentProperty) + eval(sprintf('physio.%s = currentProperty;', ... + physioPropertyArray{p})); + else + + % update all existing sub-properties in job to physio + + subPropArray = fields(currentProperty); + nFields = numel(subPropArray); + + for f = 1:nFields + eval(sprintf('physio.%s.%s = currentProperty.%s;', ... + physioPropertyArray{p},subPropArray{f}, subPropArray{f})); + end end end end \ No newline at end of file diff --git a/PhysIO/docs/documentation.html b/PhysIO/docs/documentation.html index fde9bd5f..84d7714c 100644 --- a/PhysIO/docs/documentation.html +++ b/PhysIO/docs/documentation.html @@ -6,10 +6,10 @@ PhysIO Toolbox Documentation

TAPAS HUGE demo

Contents

Introduction

This toolbox implements Hierarchical Unsupervised Generative Embedding (HUGE) with variational Bayesian inversion. This demo shows how to call HUGE on two synthetic datasets. For more information, consult REF [1].

Author: Yu Yao (yao@biomed.ee.ethz.ch) Copyright (C) 2018 Translational Neuromodeling Unit Institute for Biomedical Engineering, University of Zurich and ETH Zurich.

This toolbox is part of TAPAS, which is released under the terms of the GNU General Public Licence (GPL), version 3. For further details, see http://www.gnu.org/licenses/

This software is intended for research only. Do not use for clinical purpose. Please note that this toolbox is in an early stage of development. Considerable changes are planned for future releases. For support please refer to: https://github.com/translationalneuromodeling/tapas/issues

Generate synthetic DCM fMRI datasets

We generate two synthetic datasets:

  1. A dataset based on a three-region bilinear DCM with 80 subjects divided into three groups (40, 20, 20).
  2. A dataset based on a two-region linear DCM with 20 subjects divided into two groups of 10 subjects each.
rng(8032,'twister')
-tapas_huge_generate_examples( 'example_data.mat' )
-load( 'example_data.mat' );
-

Analyzing first dataset

To perform analysis with HUGE use the following interface:

[DcmResults] = tapas_huge_invert(DCM, K, priors, verbose, randomize, seed)

DCM: cell array of DCM in SPM format

disp(DCMr3b{1})
-
          U: [1×1 struct]
-          Y: [1×1 struct]
-          n: 3
-          v: 256
-         TE: 0.0400
-    options: [1×1 struct]
-          a: [3×3 logical]
-          c: [3×2 logical]
-          b: [3×3×2 logical]
-          d: [3×3×0 double]
-
-

K: number of clusters in the HUGE model

K = 3;
-

priors: model priors stored in a struct containing the following fields:

-
-
    -
  • alpha: parameter of Dirichlet prior (α0 - - in Fig.1 of REF [1])
  • -
  • clustersMean: prior mean of clusters (m0 - - in Fig.1 of REF [1])
  • -
  • clustersTau: - τ0 - - in Fig.1 of REF [1]
  • -
  • clustersDeg: degrees of freedom of inverse-Wishart prior (ν0 - - in Fig.1 of REF [1])
  • clustersSigma: scale matrix of inverse-Wishart prior (S0 - - in Fig.1 of REF [1])
  • hemMean: prior mean of hemodynamic parameters (μ0 - - in Fig.1 of REF [1])
  • hemSigma: prior covariance of hemodynamic parameters(Σ0 - - in Fig.1 of REF [1])
  • -
  • noiseInvScale: prior inverse scale of observation noise (b0 - - in Fig.1 of REF [1])
  • -
  • noiseShape: prior shape parameter of observation noise (a0 - - in Fig.1 of REF [1])
  • -
-
-

- You may use tapas_huge_build_prior(DCM) to generate this struct. -

-
priors = tapas_huge_build_prior(DCMr3b);
-disp(priors)
-
-
-            alpha: 1
-     clustersMean: [-0.5000 0.0052 0.0052 0.0052 -0.5000 0.0052 -0.5000 0 0]
-      clustersTau: 0.1000
-      clustersDeg: 100
-    clustersSigma: [9×9 single]
-          hemMean: [0 0 0 0 0 0 0]
-         hemSigma: [7×7 double]
-    noiseInvScale: 0.0250
-       noiseShape: 1.2800
-
-
-

verbose: activate command line output (optional).

-
-  verbose = true;
-
-

randomize: randomize starting values (optional). If randomize is false (default), VB inversion will start from the prior values.

-
-  randomize = true;
-
-

seed: seed for random number generator (optional). Use this input to reproduce an earlier result.

-
-  seed = rng;
-
-

Starting the inversion:

-
-currentTimer = tic;
-[DcmResults] = tapas_huge_invert(DCMr3b, K, priors, verbose, randomize, seed);
-toc(currentTimer)
-
iteration 1, dF: 206273.7158
-iteration 2, dF: 5089.5705
-iteration 3, dF: 935.7616
-iteration 4, dF: 141.2354
-iteration 5, dF: 13.6022
-iteration 6, dF: 1044.9978
-iteration 7, dF: 168.1947
-iteration 8, dF: 49.7
-iteration 9, dF: 33.17
-iteration 10, dF: 15.7876
-iteration 11, dF: 7.9238
-iteration 12, dF: 33.4518
-iteration 13, dF: 21.0559
-iteration 14, dF: 14.291
-iteration 15, dF: 3.2596
-iteration 16, dF: 2.4821
-iteration 17, dF: 1.4834
-iteration 18, dF: 2.4299
-iteration 19, dF: 1.7049
-iteration 20, dF: 0.17127
-iteration 21, dF: 1.6542
-iteration 22, dF: 1.6965
-iteration 23, dF: 0.58714
-iteration 24, dF: 0.57489
-iteration 25, dF: 0.45
-iteration 26, dF: 0.34384
-iteration 27, dF: 0.29236
-iteration 28, dF: 0.14673
-iteration 29, dF: 0.13925
-iteration 30, dF: 0.14582
-iteration 31, dF: 0.078373
-iteration 32, dF: 0.099591
-iteration 33, dF: 0.075957
-iteration 34, dF: 0.017069
-iteration 35, dF: 0.054854
-iteration 36, dF: 0.053601
-iteration 37, dF: -0.02852
-Elapsed time is 213.671655 seconds.
-
-

The inference result is stored in DcmResults.posterior, which is a struct containing the following fields:

-
  • alpha: parameter of posterior over cluster weights (αk - - in Eq.(15) of REF [1])
  • -
  • softAssign: posterior assignment probability of subjects to clusters (qnk - - in Eq.(18) in REF [1])
  • -
  • clustersMean: posterior mean of clusters (mk - - in Eq.(16) of REF [1])
  • clustersTau: - τk - -in Eq.(16) of REF [1]
  • clustersDeg: posterior degrees of freedom (νk - - in Eq.(16) of REF [1])
  • clustersSigma: posterior scale matrix (Sk - -in Eq.(16) of REF [1])
  • -
  • logDetClustersSigma: log-determinant of Sk - -
  • -
  • dcmMean: posterior mean of DCM parameters (μn - - in Eq.(19) of REF [1])
  • -
  • dcmSigma: posterior covariance of hemodynamic parameters (Σn - - in Eq.(19) of REF [1])
  • -
  • logDetPostDcmSigma: log-determinant of - Σn - -
  • -
  • noiseInvScale: posterior inverse scale of observation noise (bn,r - - in Eq.(21) of REF [1])
  • -
  • noiseShape: posterior shape parameter of observation noise (an,r - - in Eq.(21) of REF [1])
  • -
  • meanNoisePrecision: posterior mean of precision of observation noise (λn,r - - in Eq.(23) of REF [1])
  • -
  • modifiedSumSqrErr: b′n,r - -in Eq.(22) of REF [1]

The negative free energy after convergence is stored in DcmResults.freeEnergy

disp(['Negative free energy is ' num2str(DcmResults.freeEnergy) ...
-    ' after ' num2str(DcmResults.nIterationsActual) ' iterations.'])
-
Negative free energy is 166233.7053 after 37 iterations.
-

We can plot the results using the command

tapas_huge_plot(DCMr3b,DcmResults);
-
-DCMr3b -

- The assignment probabilities shown in the upper left panel of the above figure indicates that all but three subjects could be correctly classified.

The panel in the top right shows the posterior cluster mean and 95% marginal credible intervals.

The lower panel shows the simulated BOLD measurement (black) and 25 samples from the posterior over (noise free) BOLD signals. -

-

- Analyzing the second dataset -

-

- Performing HUGE analysis on the second dataset proceeds analogously to the first dataset. Differences in the DCM's structure are handled automatically. -

-
disp(DCMr2l{1})
-
-% choose number of clusters for the HUGE model
-K = 2;
-
-% generate priors
-priors = tapas_huge_build_prior(DCMr2l);
-disp(priors)
-
-% suppress command line output
-verbose = false;
-
-% randomize starting values
-randomize = true;
-
-% analysis
-currentTimer = tic;
-[DcmResults] = tapas_huge_invert(DCMr2l, K, priors, verbose, randomize);
-toc(currentTimer)
-
-disp(['Negative free energy is ' num2str(DcmResults.freeEnergy) ...
-    ' after ' num2str(DcmResults.nIterationsActual) ' iterations.'])
-
-% plot the results
-tapas_huge_plot(DCMr2l,DcmResults);
-
          U: [1×1 struct]
-          Y: [1×1 struct]
-          n: 2
-          v: 300
-         TE: 0.0400
-    options: [1×1 struct]
-          a: [2×2 logical]
-          c: [2×2 logical]
-          b: [2×2×2 logical]
-          d: [2×2×0 double]
-
-            alpha: 1
-     clustersMean: [-0.5000 0.0078 -0.5000 0 0]
-      clustersTau: 0.1000
-      clustersDeg: 100
-    clustersSigma: [5×5 single]
-          hemMean: [0 0 0 0 0]
-         hemSigma: [5×5 double]
-    noiseInvScale: 0.0250
-       noiseShape: 1.2800
-
-Elapsed time is 49.033623 seconds.
-Negative free energy is -10117.8605 after 56 iterations.
-
-IMG: DCMr2l -

Empirical Bayes analysis

To perform empirical Bayes analysis, set K to 1. Here, we perform empirical Bayesian analysis on the second dataset. For more information on empirical Bayes, see Fig.5 in REF [1].

% set K to 1 for empirical Bayes
-K = 1;
-
-% generate priors
-priors = tapas_huge_build_prior(DCMr2l);
-
-% suppress command line output
-verbose = false;
-
-% randomize starting values
-randomize = true;
-
-% analysis
-currentTimer = tic;
-[DcmResults] = tapas_huge_invert(DCMr2l, K, priors, verbose, randomize);
-toc(currentTimer)
-
-disp(['Negative free energy is ' num2str(DcmResults.freeEnergy) ...
-    ' after ' num2str(DcmResults.nIterationsActual) ' iterations.'])
-
-% plot the results
-tapas_huge_plot(DCMr2l,DcmResults);
-
Elapsed time is 31.027961 seconds.
-Negative free energy is -9913.7702 after 38 iterations.
-
-EB -

The above figure summarizes the result of empirical Bayes. The top panel shows the posterior group-level mean with 95% marginal credible intervals.

The lower panel shows a boxplot of first-level (i.e.: subject-level) MAP estimates of the DCM parameters.

References:

[1] Yao Y, Raman SS, Schiek M, Leff A, Frässle S, Stephan KE (2018). Variational Bayesian Inversion for Hierarchical Unsupervised Generative Embedding (HUGE). NeuroImage, 179: 604-619 https://doi.org/10.1016/j.neuroimage.2018.06.073

diff --git a/huge/tapas_huge_bold.m b/huge/tapas_huge_bold.m index 3b045e56..82323fad 100644 --- a/huge/tapas_huge_bold.m +++ b/huge/tapas_huge_bold.m @@ -1,23 +1,39 @@ -%% [response,x,s,f,v,q] = tapas_huge_bold( packedParameters, DcmInfo, iSubject ) +function [response, x, s, f, v, q] = tapas_huge_bold( A, B, C, D, tau, ... + kappa, epsilon, R, u, L, E_0, r_0, V_0, vartheta_0, alpha, gamma, TR, ... + TE, dt) +% Integrates the DCM forward equations to generate the predicted fMRI bold +% time series. % -% Compute the predicted response for the DCM-FMRI model using numerical -% integration of differential equations. -% -% INPUT: -% packedParameters - current value of parameters -% DcmInfo - struct containing DCM model specification and -% BOLD time series. -% iSubject - subject index +% INPUTS: +% A, B, C, D - DCM connectivity matrices. +% tau - Venous transit time. +% kappa - Decay of vasodilatory signal. +% epsilon - Ratio of intra- and extravascular signal. +% R - Number of regions. +% u - Experimental stimuli. +% L - Number of experimental stimuli. +% E_0 - Resting oxygen extraction fraction. +% r_0 - Slope of intravascular relaxation rate. +% V_0 - Resting venous volume. +% vartheta_0 - Frequency offset at the outer surface of magnetized +% vessels (Hz). +% alpha - Grubb's exponent. +% gamma - rate constant of feedback regulation. +% TR - Repetition time. +% TE - Echo time. +% dt - Sampling interval of inputs. % -% OUTPUT: -% response - matrix of predicted response for each region +% OUTPUTS: +% response - matrix of predicted response for each region % (column-wise) -% x - time series of neuronal states -% s - time series of vasodilatory signal -% f1 - time series of flow -% v1 - time series of blood volume -% q1 - time series of deoxyhemoglobin content. -% +% x - time series of neuronal states +% s - time series of vasodilatory signal +% f1 - time series of flow +% v1 - time series of blood volume +% q1 - time series of deoxyhemoglobin content. +% + +% % REFERENCE: % Klaas Enno Stephan, Nikolaus Weiskopf, Peter M. Drysdale, Peter A. % Robinson, Karl J. Friston (2007). Comparing hemodynamic models with @@ -26,111 +42,76 @@ % https://doi.org/10.1016/j.neuroimage.2007.07.040 % -% -% Author: Sudhir Shankar Raman -% Copyright (C) 2018 Translational Neuromodeling Unit +% Author: Yu Yao (yao@biomed.ee.ethz.ch), Sudhir Shankar Raman +% Copyright (C) 2019 Translational Neuromodeling Unit % Institute for Biomedical Engineering, % University of Zurich and ETH Zurich. % % This file is part of TAPAS, which is released under the terms of the GNU % General Public Licence (GPL), version 3. For further details, see -% . +% . +% +% This software is provided "as is", without warranty of any kind, express +% or implied, including, but not limited to the warranties of +% merchantability, fitness for a particular purpose and non-infringement. % % This software is intended for research only. Do not use for clinical -% purpose. Please note that this toolbox is in an early stage of -% development. Considerable changes are planned for future releases. For -% support please refer to: -% https://github.com/translationalneuromodeling/tapas/issues -% -%% -function [response,x,s,f,v,q] = tapas_huge_bold( packedParameters, DcmInfo, iSubject ) +% purpose. Please note that this toolbox is under active development. +% Considerable changes may occur in future releases. For support please +% refer to: +% https://github.com/translationalneuromodeling/tapas/issues +% -paramList = [DcmInfo.timeStep(iSubject) DcmInfo.nTime(iSubject) ... - DcmInfo.nStates DcmInfo.nInputs iSubject DcmInfo.dcmTypeB ... - DcmInfo.dcmTypeD]; -[packedParameters] = tapas_huge_pack_params(packedParameters,paramList); +nt = size(u, 1); +rSmp = TR/dt; +C = C'/rSmp; -%---------------------------------------------------------------- -% unpack parameters -HEM_LIST = DcmInfo.hemParam.listHem; % kappa, tau, epsilon -% transpose of the original A -A = (packedParameters{1}.*DcmInfo.adjacencyA)'; -% transpose of the original C -C = (packedParameters{2}.*DcmInfo.adjacencyC)'; -% For Lorenz Dataset Analysis -C = C./DcmInfo.hemParam.scaleC; -B = (packedParameters{3}); % original B -D = packedParameters{4}; -tau = HEM_LIST(2)*exp(packedParameters{5}(1,:)); -kappa = HEM_LIST(1)*exp(packedParameters{5}(2,:)); -epsilon = HEM_LIST(3)*exp(packedParameters{5}(3,:)); -epsilon = epsilon(1)*ones(1, DcmInfo.nStates); -% estimated region-specific ratios of intra- to extra-vascular signal -%-------------------------------------------------------------------------- +% transform self-connections +A = A - .5*eye(R); +if isempty(D) + D = zeros(R, R, R); +end -%------------------------------------------------------------------ -% Hemodynamic constants -% TE -echoTime = DcmInfo.hemParam.echoTime; +tau = 2.*exp(tau); +kappa = .64.*exp(kappa); +epsilon = exp(epsilon); -% resting venous volume (%) restingVenousVolume -%-------------------------------------------------------------------------- -restingVenousVolume = DcmInfo.hemParam.restingVenousVolume; - -% slope relaxationRateSlope of intravascular relaxation rate R_iv as a -% function of oxygen saturation S: -% R_iv = relaxationRateSlope*[(1 - S)-(1 - S0)] (Hz) -%-------------------------------------------------------------------------- -relaxationRateSlope = DcmInfo.hemParam.relaxationRateSlope; - -% frequency offset at the outer surface of magnetized vessels (Hz) - nu0 -%-------------------------------------------------------------------------- -frequencyOffset = DcmInfo.hemParam.frequencyOffset; - -% resting oxygen extraction fraction - rho -%-------------------------------------------------------------------------- -oxygenExtractionFraction = DcmInfo.hemParam.oxygenExtractionFraction*... - ones(1,paramList(3)); +% resting oxygen extraction fraction +E_0 = repmat(E_0, 1, R); -%-Coefficients in BOLD signal model - -%========================================================================== -coefficientK1 = DcmInfo.hemParam.rho*frequencyOffset*echoTime*... - oxygenExtractionFraction; -coefficientK2 = epsilon.*(relaxationRateSlope*... - oxygenExtractionFraction*echoTime); -coefficientK3 = 1 - epsilon; +k1 = 4.3*vartheta_0*TE*E_0; +k2 = epsilon.*(r_0*E_0*TE); +k3 = 1 - epsilon; -mArrayB = B.*DcmInfo.adjacencyB; -mArrayB = permute(mArrayB,[2 1 3]); -mArrayD = D.*DcmInfo.adjacencyD; -mArrayD = permute(mArrayD,[2 1 3]); -% resting oxygen extraction fraction - change value to match what SPM does -%-------------------------------------------------------------------------- -% For Lorenz Dataset Analysis -oxygenExtractionFraction = DcmInfo.hemParam.oxygenExtractionFraction2*... - ones(1,paramList(3)); -%oxygenExtractionFraction = 0.32*ones(1,paramList(3)); +% Integrate the dynamical system +[x,s,f,v,q] = tapas_huge_int_euler(... + A',... + full(u*C),... + full(u),... + permute(B,[2 1 3]),... + permute(D,[2 1 3]),... + E_0,... + 1/alpha,... + tau,... + gamma,... + kappa,... + [dt,nt,R,L,0,any(B(:)),any(D(:))]); -% pre-calculation -C = DcmInfo.listU{paramList(5)}*C; -% Integrate the dynamical system -[x,s,f,v,q] = tapas_huge_int_euler(A,C,DcmInfo.listU{paramList(5)},... - mArrayB,mArrayD,oxygenExtractionFraction,DcmInfo.hemParam.alphainv,... - tau,DcmInfo.hemParam.gamma,kappa,paramList); - -% generate the responses per time point -response = restingVenousVolume*( ... - bsxfun(@times,coefficientK1,... - (1 - (q(DcmInfo.listResponseTimeIndices{paramList(5)},:)))) +... - bsxfun(@times,coefficientK2,... - (1 - (q(DcmInfo.listResponseTimeIndices{paramList(5)},:)./... - v(DcmInfo.listResponseTimeIndices{paramList(5)},:)))) +... - bsxfun(@times,coefficientK3,... - (1-v(DcmInfo.listResponseTimeIndices{paramList(5)},:)))); - +% generate the BOLD response +response = V_0*( ... + bsxfun(@times,k1,... + (1 - (q(rSmp:rSmp:end,:)))) +... + bsxfun(@times,k2,... + (1 - (q(rSmp:rSmp:end,:)./... + v(rSmp:rSmp:end,:)))) +... + bsxfun(@times,k3,... + (1-v(rSmp:rSmp:end,:)))); +% demean response +response = bsxfun(@minus, response, mean(response, 1)); +end \ No newline at end of file diff --git a/huge/tapas_huge_boxcar.m b/huge/tapas_huge_boxcar.m new file mode 100644 index 00000000..0124f867 --- /dev/null +++ b/huge/tapas_huge_boxcar.m @@ -0,0 +1,106 @@ +function [ u ] = tapas_huge_boxcar( dt, nBoxes, period, onRatio, padding ) +% Generate a boxcar function for use as experimental stimulus. All +% timing-related arguments must be specified in seconds. +% +% INPUTS: +% dt - Numeric scalar indicating sampling time interval. +% nBoxes - Vector indicating number of blocks. +% period - Vector containing time interval between block onsets. +% onRatio - Vector containing ratio between block length and 'period'. +% Must be between 0 and 1. +% +% OPTIONAL INPUTS: +% padding - Length of padding at the beginning and end. +% +% OUTPUTS: +% u - A cell array containing the boxcar functions. +% +% EXAMPLES: +% u = TAPAS_HUGE_BOXCAR(.01, 10, 3, 2/3, [4 0]) Generate boxcar +% function with 10 blocks, each 2 seconds long with 1 second inter +% block interval and onset of first block at 4 seconds. +% +% See also tapas_Huge.SIMULATE +% + +% Author: Yu Yao (yao@biomed.ee.ethz.ch) +% Copyright (C) 2019 Translational Neuromodeling Unit +% Institute for Biomedical Engineering, +% University of Zurich and ETH Zurich. +% +% This file is part of TAPAS, which is released under the terms of the GNU +% General Public Licence (GPL), version 3. For further details, see +% . +% +% This software is provided "as is", without warranty of any kind, express +% or implied, including, but not limited to the warranties of +% merchantability, fitness for a particular purpose and non-infringement. +% +% This software is intended for research only. Do not use for clinical +% purpose. Please note that this toolbox is under active development. +% Considerable changes may occur in future releases. For support please +% refer to: +% https://github.com/translationalneuromodeling/tapas/issues +% + + +%% check input +nSignals = numel(nBoxes); + +if isscalar(period) && nSignals > 1 + period = repmat(period, nSignals, 1); +else + assert(numel(period) == nSignals, 'TAPAS:HUGE:Boxcar:InputSize', ... + 'Size of period must match that of nBoxes') +end + +if isscalar(onRatio) && nSignals > 1 + onRatio = repmat(onRatio, nSignals, 1); +else + assert(numel(period) == nSignals, 'TAPAS:HUGE:Boxcar:InputSize', ... + 'Size of onRatio must match that of nBoxes') +end +assert(all(onRatio < 1) && all(onRatio > 0), 'TAPAS:HUGE:Boxcar:InputRange', ... + 'onRatio must be in range: 0 < onRatio < 1.') + +if nargin < 5 + padding = zeros(nSignals, 2); +else + if size(padding, 1) == 1 + padding = repmat(padding, nSignals, 1); + end + assert(size(padding, 1) == nSignals, 'TAPAS:HUGE:Boxcar:InputSize', ... + 'Number of rows in padding must match length of nBoxes') +end + + +%% generate signal +u = cell(1, nSignals); + +for iSignal = 1:nSignals + tMax = nBoxes(iSignal)*period(iSignal) + padding(iSignal, end); + + % amplitudes + amp = repmat([1;0], 1, nBoxes(iSignal)); + + % sample time points + boxStarts = (0:nBoxes(iSignal)-1)*period(iSignal); + boxDuration = [0; onRatio(iSignal)]*period(iSignal); + grid = bsxfun(@plus, boxStarts, boxDuration); + + % query time points + query = (0:dt:tMax)'; + + % padding + amp = [amp(:); 0]; + grid = [grid(:); tMax]; + if padding(iSignal, 1) + query = [-fliplr(dt:dt:padding(iSignal, 1))'; query(:)]; + amp = [0; amp(:)]; + grid = [-padding(iSignal, 1); grid(:)]; + end + % generate boxcar + u{iSignal} = interp1(grid, amp, query, 'previous'); + +end + diff --git a/huge/tapas_huge_bpurity.m b/huge/tapas_huge_bpurity.m new file mode 100644 index 00000000..9bcea07b --- /dev/null +++ b/huge/tapas_huge_bpurity.m @@ -0,0 +1,80 @@ +function [ balancedPurity ] = tapas_huge_bpurity( labels, estimates ) +% Calculate balanced purity (see Brodersen2014 Eq. 13 and 14) for a set of +% ground truth labels and a set of estimated labels +% +% INPUTS: +% labels - Vector of ground truth class labels. +% estimates - Clustering result as array of assignment probabilities or +% vector of cluster indices. +% +% OUTPUTS: +% balancedPurity - Balanced purity score according to Brodersen (2014) +% +% EXAMPLES: +% bp = TAPAS_HUGE_BPURITY(labels,estimates) +% + +% Author: Yu Yao (yao@biomed.ee.ethz.ch) +% Copyright (C) 2019 Translational Neuromodeling Unit +% Institute for Biomedical Engineering, +% University of Zurich and ETH Zurich. +% +% This file is part of TAPAS, which is released under the terms of the GNU +% General Public Licence (GPL), version 3. For further details, see +% . +% +% This software is provided "as is", without warranty of any kind, express +% or implied, including, but not limited to the warranties of +% merchantability, fitness for a particular purpose and non-infringement. +% +% This software is intended for research only. Do not use for clinical +% purpose. Please note that this toolbox is under active development. +% Considerable changes may occur in future releases. For support please +% refer to: +% https://github.com/translationalneuromodeling/tapas/issues +% + + +labels = labels(:); +if numel(estimates) == numel(labels) + estimates = estimates(:); +end +[N, K] = size(estimates); +assert(N == numel(labels), 'TAPAS:UTIL:InputSizeMismatch', ... + 'Number of rows in estimates must match number of elements in labels.'); +if K > 1 + [~, estimates] = max(estimates, [], 2); +else + assert(all(mod(estimates, 1) == 0) && all(estimates > 0), ... + 'TAPAS:UTIL:NonIntegerIndices', ... + 'Cluster indices must be positive integer.'); + K = max(estimates); +end + +% number of classes +C = max(max(labels), K); + +% degree of imbalance +xi = zeros(C, 1); +for c = 1:C + xi(c) = nnz(labels == c)/N; +end +xi = max(xi); + +% calculate purity (Brodersen2014 Eq. 13) +counts = zeros(C,C); +for k = 1:C + % class labels of samples grouped into cluster k + currentLabels = labels(estimates == k); + for c = 1:C + % number of samples belonging to class c + counts(c,k) = nnz(currentLabels == c); + end +end +purity = sum(max(counts))/N; + +% Brodersen2014 Eq. 14 (n->k) +balancedPurity = (1-1/C)*(purity - xi)/(1 - xi) + 1/C; + +end + diff --git a/huge/tapas_huge_build_prior.m b/huge/tapas_huge_build_prior.m index 62b191f4..3f643089 100644 --- a/huge/tapas_huge_build_prior.m +++ b/huge/tapas_huge_build_prior.m @@ -1,84 +1,92 @@ -%% [ priors, DcmInfo ] = tapas_huge_build_prior( DcmInfo ) -% -% Generates values for prior parameters for HUGE. Prior mean of cluster +function [ priors, DCM ] = tapas_huge_build_prior( DCM ) +% WARNING: This function is deprecated and will be removed in a future +% version of this toolbox. Please use the new object-oriented interface +% provided by the tapas_Huge class. +% +% Generate values for prior parameters for HUGE. Prior mean of cluster % centers and prior mean and covariance of hemodynamic parameters follow % SPM convention (SPM8 r6313). % % INPUT: -% DcmInfo - EITHER: struct containing DCM model specification and -% BOLD time series in DcmInfo format (see -% tapas_huge_simulate.m for an example) -% OR: cell array of DCM in SPM format +% DcmInfo - cell array of DCM in SPM format % % OUTPUT: % priors - struct containing priors % DcmInfo - struct containing DCM model specification and BOLD time % series in DcmInfo format % -% REFERENCE: -% [1] Yao Y, Raman SS, Schiek M, Leff A, Frssle S, Stephan KE (2018). -% Variational Bayesian Inversion for Hierarchical Unsupervised -% Generative Embedding (HUGE). NeuroImage, 179: 604-619 +% See also tapas_Huge, tapas_Huge.estimate, tapas_huge_demo % -% https://doi.org/10.1016/j.neuroimage.2018.06.073 -% % Author: Yu Yao (yao@biomed.ee.ethz.ch) -% Copyright (C) 2018 Translational Neuromodeling Unit +% Copyright (C) 2019 Translational Neuromodeling Unit % Institute for Biomedical Engineering, % University of Zurich and ETH Zurich. % % This file is part of TAPAS, which is released under the terms of the GNU % General Public Licence (GPL), version 3. For further details, see -% . +% . +% +% This software is provided "as is", without warranty of any kind, express +% or implied, including, but not limited to the warranties of +% merchantability, fitness for a particular purpose and non-infringement. % % This software is intended for research only. Do not use for clinical -% purpose. Please note that this toolbox is in an early stage of -% development. Considerable changes are planned for future releases. For -% support please refer to: +% purpose. Please note that this toolbox is under active development. +% Considerable changes may occur in future releases. For support please +% refer to: % https://github.com/translationalneuromodeling/tapas/issues -function [ priors, DcmInfo ] = tapas_huge_build_prior( DcmInfo ) +% + +wnMsg = ['This function is deprecated and will be removed in a future ' ... + 'version of this toolbox. Please use the new object-oriented ' ... + 'interface provided by the tapas_Huge class.']; +warning('tapas:huge:deprecated',wnMsg) + %% check input format -if ~isfield(DcmInfo,'listBoldResponse') +if isvector(DCM)&&isstruct(DCM) try - DcmInfo = tapas_huge_import_spm(DcmInfo); - catch err - disp(['TAPAS:HUGE: Unsupported format. '... - 'Use cell array of DCM in SPM format as first input.']) - rethrow(err); + DCM = {DCM(:).DCM}'; + catch + DCM = num2cell(DCM); end +else + assert(iscell(DCM),'TAPAS:HUGE:inputFormat',... + 'DCM must be cell array of DCMs in SPM format'); end +dcm = DCM{1}; + %% set priors priors = struct(); - % parameter of Dirichlet prior (alpha_0 in Figure 1 of REF [1]) priors.alpha = 1; -tmp = DcmInfo.adjacencyA/64/DcmInfo.nStates; -tmp = tmp - diag(diag(tmp)) - .5*eye(DcmInfo.nStates); -tmp = [tmp(:); DcmInfo.adjacencyC(:)*0; DcmInfo.adjacencyB(:)*0; ... - DcmInfo.adjacencyD(:)*0]; +tmp = dcm.a/64/dcm.n; +tmp = tmp - diag(diag(tmp)) - .5*eye(dcm.n); +tmp = [tmp(:); dcm.b(:)*0; dcm.c(:)*0; ... + dcm.d(:)*0]; +connectionIndicator = find([dcm.a(:);dcm.b(:);dcm.c(:);dcm.d(:)]); % prior mean of clusters (m_0 in Figure 1 of REF [1]) -priors.clustersMean = tmp(DcmInfo.connectionIndicator)'; +priors.clustersMean = tmp(connectionIndicator)'; % tau_0 in Figure 1 of REF [1] priors.clustersTau = 0.1; % degrees of freedom of inverse-Wishart prior (nu_0 in Figure 1 of REF [1]) -priors.clustersDeg = max(100,1.5^DcmInfo.nConnections); +priors.clustersDeg = max(100,1.5^length(connectionIndicator)); priors.clustersDeg = min(priors.clustersDeg,double(realmax('single'))); % scale matrix of inverse-Wishart prior (S_0 in Figure 1 of REF [1]) -priors.clustersSigma = 0.01*eye(DcmInfo.nConnections)*... - (priors.clustersDeg - DcmInfo.nConnections - 1); +priors.clustersSigma = 0.01*eye(length(connectionIndicator))*... + (priors.clustersDeg - length(connectionIndicator) - 1); % prior mean of hemodynamic parameters (mu_h in Figure 1 of REF [1]) -priors.hemMean = zeros(1,DcmInfo.nStates*2 + 1); +priors.hemMean = zeros(1,dcm.n*2 + 1); % prior Covariance of hemodynamic parameters(Sigma_h in Figure 1 of % REF [1]) -priors.hemSigma = diag(zeros(1,DcmInfo.nStates*2 + 1)+exp(-6)); +priors.hemSigma = diag(zeros(1,dcm.n*2 + 1)+exp(-6)); % prior inverse scale of observation noise (b_0 in Figure 1 of REF [1]) priors.noiseInvScale = .025; diff --git a/huge/tapas_huge_compile.m b/huge/tapas_huge_compile.m index fbb9a875..7988dc60 100644 --- a/huge/tapas_huge_compile.m +++ b/huge/tapas_huge_compile.m @@ -1,27 +1,33 @@ -%% [ ] = tapas_huge_compile( ) -% -% Compiles integrator for DCM. Assumes that source code file -% 'tapas_huge_int_euler.c' is in the same folder as this function and -% places the compiled mex-file in the same folder. +function [ ] = tapas_huge_compile( ) +% Compile integrator for DCM fMRI forward model. This function assumes that +% source code file 'tapas_huge_int_euler.c' is in the same folder as this +% function and places the compiled mex-file in the same folder. Running +% this function requires a C compiler to be installed. For more information +% see: +% +% https://www.mathworks.com/support/requirements/supported-compilers.html % - % Author: Yu Yao (yao@biomed.ee.ethz.ch) -% Copyright (C) 2018 Translational Neuromodeling Unit +% Copyright (C) 2019 Translational Neuromodeling Unit % Institute for Biomedical Engineering, % University of Zurich and ETH Zurich. % % This file is part of TAPAS, which is released under the terms of the GNU % General Public Licence (GPL), version 3. For further details, see -% . +% . +% +% This software is provided "as is", without warranty of any kind, express +% or implied, including, but not limited to the warranties of +% merchantability, fitness for a particular purpose and non-infringement. % % This software is intended for research only. Do not use for clinical -% purpose. Please note that this toolbox is in an early stage of -% development. Considerable changes are planned for future releases. For -% support please refer to: +% purpose. Please note that this toolbox is under active development. +% Considerable changes may occur in future releases. For support please +% refer to: % https://github.com/translationalneuromodeling/tapas/issues -% -function [ ] = tapas_huge_compile( ) +% + %% % check if mex file already exists if exist('tapas_huge_int_euler', 'file') == 3 diff --git a/huge/tapas_huge_count_params.m b/huge/tapas_huge_count_params.m deleted file mode 100644 index 42372c02..00000000 --- a/huge/tapas_huge_count_params.m +++ /dev/null @@ -1,59 +0,0 @@ -%% [ nParameters, idxParamsInf, idxSelfCon ] = tapas_huge_count_params( DcmInfo ) -% -% Calculate number of parameters and parameter indices for DCM. -% -% INPUT: -% DcmInfo - struct containing DCM model specification and BOLD time -% series. -% -% OUTPUT: -% nParameters - 2-by-3 array containing parameter counts -% idxParamsInf - indices of parameters being inferred -% idxSelfCon - indices of self connections -% - -% Author: Yu Yao (yao@biomed.ee.ethz.ch) -% Copyright (C) 2018 Translational Neuromodeling Unit -% Institute for Biomedical Engineering, -% University of Zurich and ETH Zurich. -% -% This file is part of TAPAS, which is released under the terms of the GNU -% General Public Licence (GPL), version 3. For further details, see -% . -% -% This software is intended for research only. Do not use for clinical -% purpose. Please note that this toolbox is in an early stage of -% development. Considerable changes are planned for future releases. For -% support please refer to: -% https://github.com/translationalneuromodeling/tapas/issues -% -function [ nParameters, idxParamsInf, idxSelfCon ] = tapas_huge_count_params( DcmInfo ) -% length of full DCM parameter vector -nDcmParametersCon = DcmInfo.nStates*(DcmInfo.nStates + ... % A - DcmInfo.nStates*DcmInfo.nInputs + ... % B - DcmInfo.nInputs + ... % C - DcmInfo.nStates*DcmInfo.nStates); % D -nDcmParametersHem = DcmInfo.nStates*3; % hem -nDcmParametersAll = nDcmParametersCon + nDcmParametersHem; - -% number of parameters to be inferred %%% dim(theta_c) dim(theta_h) -idxParamsInf = (1:nDcmParametersAll).'; -idxParamsInf(DcmInfo.noConnectionIndicator) = 0; -idxParamsInf(end-DcmInfo.nStates+2:end) = 0; % only first epsilon is used -idxParamsInf = idxParamsInf(idxParamsInf~=0); - -nDcmParamsInfCon = nnz(idxParamsInf<=nDcmParametersCon); %%% d_c -% nDcmParamsInfCon = DcmInfo.nConnections; % alternative -nDcmParamsInfHem = nnz(idxParamsInf>nDcmParametersCon); %%% d_h -nDcmParamsInfAll = length(idxParamsInf); %%% d - -% indices of diagonal elements of A (self connections) -idxSelfCon = find(eye(size(DcmInfo.adjacencyA))); -idxSelfCon = intersect(idxParamsInf,idxSelfCon); - -nParameters = [nDcmParametersCon,nDcmParametersHem,nDcmParametersAll;... - nDcmParamsInfCon,nDcmParamsInfHem,nDcmParamsInfAll;]; - - -end - diff --git a/huge/tapas_huge_demo.m b/huge/tapas_huge_demo.m index 4994a4fd..580c5703 100644 --- a/huge/tapas_huge_demo.m +++ b/huge/tapas_huge_demo.m @@ -1,230 +1,270 @@ -%% TAPAS HUGE demo +%% Hierarchical Unsupervised Generative Embedding %% Introduction -% This toolbox implements Hierarchical Unsupervised Generative Embedding -% (HUGE) with variational Bayesian inversion. This demo shows how to call -% HUGE on two synthetic datasets. For more information, consult REF [1]. -% - -%% -% -% Author: Yu Yao (yao@biomed.ee.ethz.ch) -% Copyright (C) 2018 Translational Neuromodeling Unit -% Institute for Biomedical Engineering, -% University of Zurich and ETH Zurich. -% -% This toolbox is part of TAPAS, which is released under the terms of the -% GNU General Public Licence (GPL), version 3. For further details, see -% +% This toolbox implements Hierarchical Unsupervised Generative Embedding (HUGE) +% with variational Bayesian inversion. This demo script provides a quick-start +% guide to using the HUGE toolbox to stratify heterogeneous cohorts via generative +% embedding or perform empirical Bayesian analysis. For a more detailed documentation, +% see the HUGE manual. For more information on the theory behind HUGE, please +% consult _Yao et al. Variational Bayesian Inversion for Hierarchical Unsupervised +% Generative Embedding (HUGE). NeuroImage (2018)_, available at . +%% Generating Synthetic Data +% Before applying HUGE, we need some data. Here, we use a simulated dataset, +% which we generate using the toolbox itself. The dataset is based on a three-region +% bilinear DCM with 20 subjects divided into two groups of 10 subjects each. % -% This software is intended for research only. Do not use for clinical -% purpose. Please note that this toolbox is in an early stage of -% development. Considerable changes are planned for future releases. For -% support please refer to: -% -% - - -%% Generate synthetic DCM fMRI datasets -% We generate two synthetic datasets: +% First, we define the network structure of the DCM and generate the experimental +% stimuli. +%% +% fix random number generator seed for reproducible results +rng(8032, 'twister') + +% define DCM network structure +dcm = struct( ); +dcm.n = 3; +dcm.a = logical([ ... + 1 0 0; ... + 1 1 1; ... + 1 1 1; +]); +dcm.c = false(dcm.n, 3); +dcm.c([1, 5]) = true; +dcm.b = false(dcm.n, dcm.n, 3); +dcm.b(:, :, 3) = logical([ ... + 0 0 0; ... + 1 0 1; ... + 1 1 0; ... +]); +dcm.d = false(dcm.n, dcm.n, 0); + + +% generate experimental stimuli +U = struct(); +U.dt = 1.84/16; +tmp = tapas_huge_boxcar(U.dt, [24*13 24], [2 26], [3/4 16/26], [0 0;0 0]); +nSmp = length(tmp{1}) + 160; +tmp{1}(nSmp) = 0; +tmp{2}(nSmp) = 0; +tmp{2} = tmp{1}.*tmp{2}; +tmp{3} = zeros(1, 24); +tmp{3}([2 3 1 4 3 1] + (0:5)*4) = 1; +tmp{3} = reshape(repmat(tmp{3}, round(26/U.dt), 1), [], 1); +tmp{3}(nSmp) = 0; +tmp{3} = tmp{3}.*tmp{2}; +tmp{4} = zeros(1, 24); +tmp{4}([4 2 3 1 1 4] + (0:5)*4) = 1; +tmp{4} = reshape(repmat(tmp{4}, round(26/U.dt), 1), [], 1); +tmp{4}(nSmp) = 0; +tmp{4} = tmp{4}.*tmp{2}; +tmp = tmp(2:4); + +U.u = circshift(cell2mat(tmp), 6*16, 1); +U.name = {'1st stim', '2nd stim', '3rd stim'}; +dcm.U = U; +dcm.Y.dt = 16*dcm.U.dt; +dcm.Y.name = {'1st reg'; '2nd reg'; '3rd reg'}; +dcm.TE = .03; + +% plot stimuli +figure; +for ip = 1:3 + subplot(3, 1, ip); + plot(U.u(:, ip)); + ylabel(U.name{ip}) +end +xlabel('sample') +%% +% Now, we specify two subgroups within our simulated cohort, which differ +% in their effective connectivity profile. The first group prefers a bottom-up +% configuration (1st region -> 2nd region -> 3rd region) while the second group +% prefers a top-down configuration (1st region -> 3rd region -> 2nd region). +%% +sigma = .141; % group standard deviation +listGroups = cell(2, 1); + +% group 1 (bottom-up) +dcm.Ep.A = [-.1 .0 .0; ... + .2 -.1 .0; ... + .0 .1 -.1;]; +dcm.Ep.B = zeros(dcm.n, dcm.n, 3); +dcm.Ep.B(2, 1, 3) = .2; +dcm.Ep.B(3, 2, 3) = .35; +dcm.Ep.C = double(dcm.c)*.5; +dcm.Ep.D = double(dcm.d); +dcm.Ep.transit = zeros(dcm.n,1); +dcm.Ep.decay = zeros(dcm.n,1); +dcm.Ep.epsilon = 0; +tmp = [dcm.a(:);dcm.b(:);dcm.c(:);dcm.d(:)]; +dcm.Cp = diag([double(tmp).*sigma.^2; ones(2*dcm.n+1, 1)*exp(-6)]); +listGroups{1} = dcm; + +% group 2 (top-down) +dcm.Ep.A = [-.1 .0 .0; ... + .0 -.1 .1; ... + .4 -.15 -.1;]; +dcm.Ep.B = zeros(dcm.n, dcm.n, 3); +dcm.Ep.B(3, 1, 3) = .35; +dcm.Ep.B(2, 3, 3) = .35; +listGroups{2} = dcm; + +%% +% If you are familiar with SPM, you may have noticed that the data format +% we use to specify our desired DCM network structure resembles the DCM structure +% used by SPM. The HUGE toolbox uses the DCM structure of SPM to import experimental +% data, export results or specify the network structure for simulating data. % -% # A dataset based on a three-region bilinear DCM with 80 subjects divided -% into three groups (40, 20, 20). -% # A dataset based on a two-region linear DCM with 20 subjects divided -% into two groups of 10 subjects each. -% -rng(8032,'twister') -tapas_huge_generate_examples( 'example_data.mat' ) -load( 'example_data.mat' ); - -%% Analyzing first dataset -% To perform analysis with HUGE use the following interface: -% -% [DcmResults] = tapas_huge_invert(DCM, K, priors, verbose, randomize, seed) -% - +% The HUGE toolbox itself is implemented as a Matlab class. Hence, the first +% step to using HUGE is to create an instance of the class using the _tapas_HUGE_ +% command: %% -% |DCM|: cell array of DCM in SPM format -disp(DCMr3b{1}) - +hugeSim = tapas_Huge('Tag', 'simulated 3-region DCM'); +%% +% The _tapas_HUGE_ command takes optional parameters in the form of name-value +% pair arguments. In the above example, we added a tag to the newly created HUGE +% object, containing a short description of the object. To get a list of all available +% name-value pairs, type: + +help tapas_huge_property_names +%% +% Now, we are ready to generate the dataset by simulating fMRI time series +% for each subject. After simulation, the ground truth model parameters are stored +% in the class property _model_. The fMRI time series (simulated or experimental) +% are stored in the class property called _data_ and can be exported to SPM's +% DCM format using the _export_ function. %% -% |K|: number of clusters in the HUGE model -K = 3; - +groupSizes = [10 10]; % simulate 10 subjects for each group +snr = .5; % using a signal-to-noise ratio of 0.5 (-3 dB) +hugeSim = hugeSim.simulate(listGroups, groupSizes, 'Snr', snr); + +% plot simulated fMRI time series for one subject +n = 1; +figure; +for ip = 1:3 + subplot(3, 1, ip); + plot(hugeSim.data(n).bold(:, ip)); + ylabel(hugeSim.labels.regions{ip}) +end +xlabel('scans') + +% export data to SPM's DCM format +[ listDcms ] = hugeSim.export(); + +%% Stratification of Heterogeneous Cohorts +% Using the simulated dataset from the previous section, we demonstrate how +% to stratify the cohort into the bottom-up and top-down subgroups. All we have +% to do is to call the method _estimate_. %% -% |priors|: model priors stored in a struct containing the following -% fields: -% -% * |alpha|: parameter of Dirichlet prior ($\alpha_0$ in Fig.1 of -% REF [1]) -% * |clustersMean|: prior mean of clusters ($m_0$ in Fig.1 of REF [1]) -% * |clustersTau|: $\tau_0$ in Fig.1 of REF [1] -% * |clustersDeg|: degrees of freedom of inverse-Wishart prior ($\nu_0$ -% in Fig.1 of REF [1]) -% * |clustersSigma|: scale matrix of inverse-Wishart prior ($S_0$ in Fig.1 -% of REF [1]) -% * |hemMean|: prior mean of hemodynamic parameters ($\mu_h$ in -% Fig.1 of REF [1]) -% * |hemSigma|: prior covariance of hemodynamic parameters($\Sigma_h$ -% in Fig.1 of REF [1]) -% * |noiseInvScale|: prior inverse scale of observation noise ($b_0$ in -% Fig.1 of REF [1]) -% * |noiseShape|: prior shape parameter of observation noise ($a_0$ in -% Fig.1 of REF [1]) -% +% invert the HUGE model for the current dataset +% (this may take some time) +hugeSim = hugeSim.estimate('K', 2, 'Verbose', true); +%% +% This method accepts the same name-value pair arguments as the _tapas_Huge_ +% command we used to create the HUGE object in the last section. In the example +% above, we invert the HUGE model with two clusters and also activate command +% line outputs. The result is saved in the property _posterior_ and can be plotted +% using the method _plot_. Since, we are using simulated data for which ground +% truth group assignments are available, the model will automatically calculate +% the balanced purity of the estimation result. %% -% You may use |tapas_huge_build_prior(DCM)| to generate this struct. -% -priors = tapas_huge_build_prior(DCMr3b); -disp(priors) +% plot result +plot(hugeSim) -%% -% |verbose|: activate command line output (optional). -verbose = true; +% negative free energy +fprintf('Negative free energy: %e.\n', hugeSim.posterior.nfe) -%% -% |randomize|: randomize starting values (optional). If randomize is false -% (default), VB inversion will start from the prior values. -randomize = true; +% balanced accuracy +fprintf('Balanced accuracy: %f.\n', hugeSim.posterior.bPurity) -%% -% |seed|: seed for random number generator (optional). Use this input to -% reproduce an earlier result. -seed = rng; +% export result to SPM's DCM format +resultK2 = hugeSim.export(); -%% -% Starting the inversion: -% -currentTimer = tic; -[DcmResults] = tapas_huge_invert(DCMr3b, K, priors, verbose, randomize, seed); -toc(currentTimer) -%% -% The inference result is stored in |DcmResults.posterior|, which is a -% struct containing the following fields: +%% +% Note how plotting the object generates two graphs. The first one shows +% the estimated group assignments for each subject. The second one shows the posterior +% estimates of the group-level DCM connectivity parameters for each group. % -% * |alpha|: parameter of posterior over cluster weights -% ($\alpha_k$ in Eq.(15) of REF [1]) -% * |softAssign|: posterior assignment probability of subjects to -% clusters ($q_{nk}$ in Eq.(18) in REF [1]) -% * |clustersMean|: posterior mean of clusters ($m_k$ in Eq.(16) of -% REF [1]) -% * |clustersTau|: $\tau_k$ in Eq.(16) of REF [1] -% * |clustersDeg|: posterior degrees of freedom ($\nu_k$ in Eq.(16) -% of REF [1]) -% * |clustersSigma|: posterior scale matrix ($S_k$ in Eq.(16) of -% REF [1]) -% * |logDetClustersSigma|: log-determinant of $S_k$ -% * |dcmMean|: posterior mean of DCM parameters ($\mu_n$ in -% Eq.(19) of REF [1]) -% * |dcmSigma|: posterior covariance of hemodynamic parameters -% ($\Sigma_n$ in Eq.(19) of REF [1]) -% * |logDetPostDcmSigma|: log-determinant of $\Sigma_n$ -% * |noiseInvScale|: posterior inverse scale of observation noise -% ($b_{n,r}$ in Eq.(21) of REF [1]) -% * |noiseShape|: posterior shape parameter of observation noise -% ($a_{n,r}$ in Eq.(21) of REF [1]) -% * |meanNoisePrecision|: posterior mean of precision of observation noise -% ($\lambda_{n,r}$ in Eq.(23) of REF [1]) -% * |modifiedSumSqrErr|: $b'_{n,r}$ in Eq.(22) of REF [1] -% - +% The negative free energy can be used to compare different models. For example, +% we can invert the HUGE model with three clusters, see how the negative free +% energy changes and calculate the Bayes factor between the two and three cluster +% models. %% -% The negative free energy after convergence is stored in -% |DcmResults.freeEnergy| -disp(['Negative free energy is ' num2str(DcmResults.freeEnergy) ... - ' after ' num2str(DcmResults.nIterationsActual) ' iterations.']) - +% invert the HUGE model with 3 clusters +% (this may take some time) +hugeSimK3 = hugeSim.estimate('K', 3); + +% compare negative free energy between 2 and 3 cluster models +fprintf('Difference in negative free energy: %f.\n', hugeSim.posterior.nfe - hugeSimK3.posterior.nfe) + +% calculate Bayes factor +BF_23 = exp(hugeSim.posterior.nfe - hugeSimK3.posterior.nfe); +fprintf('Bayes factor: %e.\n', BF_23) +%% +% Note that options set via name-value pair arguments are persistent across +% the lifetime of the object. For example, the object remembers that the option +% _verbose_ has been set to _true_ in the previous section, and keeps generating +% command line outputs. +% +% The difference in the negative free energy shows that the model prefers +% the two-cluster solution, which is what we would expect, given that the generating +% model contained two subgroups. +%% Importing Data +% In the previous example, we used the HUGE object itself to generate data. +% It is of course possible to import (experimental) fMRI time series into a HUGE +% object. The most convenient method is to use either the _tapas_Huge_ or the +% _estimate_ commands with the appropriate name-value pair argument. %% -% We can plot the results using the command -tapas_huge_plot(DCMr3b,DcmResults); +% select the first 10 subjects (bottom-up group) from the previous example +listDcmsG1 = listDcms(1:10); + +% create a new HUGE object and import the data from these subjects +hugeEb = tapas_Huge('Tag', 'Group 1 - bottom-up', 'Dcm', listDcmsG1); + +%% +% Note that the data to be imported has to be stored in a cell array where +% each cell holds a DCM struct in SPM's DCM format. This allows for convenient +% transfer of data from SPM to HUGE. +%% Empirical Bayes +% Previously, we demonstrated how to use the HUGE toolbox to stratify a heterogeneous +% cohort. However, HUGE can also be used to perform empirical Bayesian analysis; +% i.e., to invert the DCMs while learning the prior over DCM parameters from the +% data. This is accomplished by setting the number of clusters to one. %% -% The assignment probabilities shown in the upper left panel of the above -% figure indicates that all but three subjects could be correctly -% classified. +% empirical Bayes +% (this may take some time) +hugeEb = hugeEb.estimate('K', 1, 'PriorClusterVariance', 0.02, 'Verbose', true); + +% plot result +plot(hugeEb); +%% +% Here, we also used a name-value pair argument to change the prior cluster +% variance. Note also that the _plot_ method generates different graphs for empirical +% Bayesian analysis than for stratification. The first graph shows a boxplot of +% the posterior mean DCM parameter estimates of each individual subject. The second +% plot shows the population-level posterior mean and standard deviation. +% +% In this case the second graph reveals that for example, the connection +% from the first to the second region in the current cohort is stronger than the +% standard prior value of zero. % -% The panel in the top right shows the posterior cluster mean and 95% -% marginal credible intervals. -% -% The lower panel shows the simulated BOLD measurement (black) and 25 -% samples from the posterior over (noise free) BOLD signals. -% -% - - -%% Analyzing the second dataset -% Performing HUGE analysis on the second dataset proceeds analogously to -% the first dataset. Differences in the DCM's structure are handled -% automatically. % -disp(DCMr2l{1}) - -% choose number of clusters for the HUGE model -K = 2; - -% generate priors -priors = tapas_huge_build_prior(DCMr2l); -disp(priors) - -% suppress command line output -verbose = false; - -% randomize starting values -randomize = true; - -% analysis -currentTimer = tic; -[DcmResultsR2l] = tapas_huge_invert(DCMr2l, K, priors, verbose, randomize); -toc(currentTimer) - -disp(['Negative free energy is ' num2str(DcmResultsR2l.freeEnergy) ... - ' after ' num2str(DcmResultsR2l.nIterationsActual) ' iterations.']) - -% plot the results -tapas_huge_plot(DCMr2l,DcmResultsR2l); - - -%% Empirical Bayes analysis -% To perform empirical Bayes analysis, set |K| to |1|. Here, we perform -% empirical Bayesian analysis on the second dataset. For more information -% on empirical Bayes, see Fig.5 in REF [1]. -% - -% set K to 1 for empirical Bayes -K = 1; - -% generate priors -priors = tapas_huge_build_prior(DCMr2l); - -% suppress command line output -verbose = false; - -% randomize starting values -randomize = true; - -% analysis -currentTimer = tic; -[DcmResultsEb] = tapas_huge_invert(DCMr2l, K, priors, verbose, randomize); -toc(currentTimer) - -disp(['Negative free energy is ' num2str(DcmResultsEb.freeEnergy) ... - ' after ' num2str(DcmResultsEb.nIterationsActual) ' iterations.']) - -% plot the results -tapas_huge_plot(DCMr2l,DcmResultsEb); -%% -% The above figure summarizes the result of empirical Bayes. The top panel -% shows the posterior group-level mean with 95% marginal credible -% intervals. -% -% The lower panel shows a boxplot of first-level (i.e.: subject-level) -% MAP estimates of the DCM parameters. -% - - -%% References: -% -% [1] Yao Y, Raman SS, Schiek M, Leff A, Frssle S, Stephan KE (2018). -% Variational Bayesian Inversion for Hierarchical Unsupervised -% Generative Embedding (HUGE). NeuroImage, 179: 604-619 -% +% Author: Yu Yao (yao@biomed.ee.ethz.ch) +% Copyright (C) 2019 Translational Neuromodeling Unit +% Institute for Biomedical Engineering, +% University of Zurich and ETH Zurich. +% +% This file is part of TAPAS, which is released under the terms of the GNU +% General Public Licence (GPL), version 3. For further details, see +% . +% +% This software is provided "as is", without warranty of any kind, express +% or implied, including, but not limited to the warranties of +% merchantability, fitness for a particular purpose and non-infringement. % +% This software is intended for research only. Do not use for clinical +% purpose. Please note that this toolbox is under active development. +% Considerable changes may occur in future releases. For support please +% refer to: +% https://github.com/translationalneuromodeling/tapas/issues +% + diff --git a/huge/tapas_huge_demo.mlx b/huge/tapas_huge_demo.mlx new file mode 100644 index 0000000000000000000000000000000000000000..25f840251c83913fc4224e946dc48e7c977d4a57 GIT binary patch literal 174536 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

vFb^6g zNm3fxPM2V^ALEL;7AV;~vM#ZhvM7`Wps$YX`H>jYSb>XYI@k+z-oQT=!+uqKZ9KMQ zxvH&umjOOfG3Bi%P{j;oND=uPQNK-$J$WYZ*MJQzYM|&n@4u`9a?b_P>6bzu+$k(D zQHUD=sJUDqE(Z3o1+P*HC!(|bGtWv?*vid*`(9+RpQQ9mXx&gCvn%nFK%Y@XdAd`5 z2tJl0RJ>BFy7$TZhUchYINI85znC_BU_V7(yHgKv3TIOyRjo}*H@4E{s3A&G5aUB2 zePi?p6Iiu91Lfnkc*5|mbR@4rpLPvEKNM)PRFcs4J@}28ph)ap!33;ae0O+hq_;75 z3;Df?LV+%v(>^_&W$9_uFc1|FF>mXPN6&C_K{#_sA zv9&>ZpL%TDo(h-SCr9_AoO&e(y1Ee}I^6YvJ+H={mn49nWbb1h*ob-0VE>1dL;q^@ zJ-<0tB1xhxw(a#95e-n^7qdL&1%(Kwa#>(&=|F#wIdau$ki>7=qtwaHRKm>pZPdFb z!P=(;f2O2(Q#oSB+^Ng`fo@y7R|rNMD;&mQJ%32K{%FEVoiLd?0ESk^=o|r({Z~JT z|GZLnk;_%(OFK=Bwr+)sRZ+JS{Un7q(s*l)*FW@1yHPhAzMF(NX>NCG8HLI8{! zTVbS@;;28ZlU(E12!oF{rulT4+t89aaB}pjBiWUCD4#X_Va5BKd?U^LrKpUg<$eRp z8w>CJu`hv}LJdvBJPg5y5{O-DAB0-qI)*X8EEWCvfW+(M?do`Fwc-#{xNKB(qqkGY zuOyS1_Go5g(P<;+%V8&4kHZ$CAofO;;Qlcj4S4RzNR<2lmXfW9Rle>1dA zjcGL2A%87m9+8XrPrFVmhn8of!ZH|8^m6lp%4s;VN~>Ur89$EkTcuPpOpblN+)d(X zTV)l&!O51>XONsdxM!K}a=FJEA~$@U29?1_y{u#aiO{Si*% z6{^X*9v|hEn%B2d#RD3dME-rH>FI_PDn(zAJ)O(wIea-dfQrCRQV6<)Nk@g`Js#c^boUQ?S(%PV_yLD}8wk!BC!pZ(Z_$+(cmaKJ^onp z8!bp@UC{|1JW;N;*I+Q*%6V{VY>iFE4_)06GWjF{jJg5Q>eQtdz};+`8?U|*>|#vx z!SoCmyp$d-ABl7$w6oP=BG7vO>l+gTndwYDl2kPEAN#N2}Izyk0zJvl-VpzXCG1nUkb=&QB+Ye>B7$%Sr)~E<`v9sJa_LQH5CxsUXAo|UH_=6nAb0yOFa*^knZdf9K z^Og2TL{ycv%v%+o@!P9(gKFPhE0V5Q;WGZ{Ezp?TVIJ#hTQoK)JEed2y?rEMc>7?P zSHs5h+}N_`KkIj-FgB@HbwP`8NXfASFIoP&0-&i{{Je2HB-p3k-2>TgO%cI-9`a`$ zqzOU4_ZujpB%P2ktht+wt(B&_eS@Vr&g&WCXTxOvv4!zRfN_(TM)|uAke{4&1d8V3 zY@D;K!Q#~1^M{^lV|fq}^?1dh!^}Yt^{D&veDbc>8u-pfUK}MxJ0$T~eo;@x3=4sC z1P!k-S?{)g;bCCNELY3jz~HMXI}x#--2?W`^u%lyXEJXm)A;e+hlHY(rciO$XbE1M zQon+;0ylc#xyXBwhjn)rf-!h!}0t#vsgBru%BK$!pjCJFg! z{dZu#T5H4af4hRa(2*FI>F@1?eQS7$W7qu`2U5e?d(y=+QWRVynabbHeWyzKq6G&& zQVmpNhI)v-WonQ5RFSh8y!AU`^EzM1d%#MURW15mLq*5hPGb0AW8WN*kJ}|m`NsJ2O}~~Iqk#f4 zIv9Sb=uSy?KG3Y|5QV8~dKTRv1#CO-Q2n^!{{pTEU)T8R3Ju{}t*^V##@d23w zonEKXzLdtYzsbA#`cLQ3*%lR8anblrrEgnDpQB-9{MhG%0 zH)zQtKJ^xpv+%&Hyj#wwT5##isB_as9hZ4RQQJ5`fv}%KNd?0_Wu}rmJo@LyhS7(} zB5uj16+~qxdrg(ArI8c&tYII|v zRDk1{>6wKcLjLV6X^Wz64~vy9ASjNF2)7V~+PFUY=Cj&?CvO64iIWI=&KQ8)WdRP1 zkS^zuMv{~(KM&H+;p^r*w~%~cG)R=;lLHzSRzgV)?bkbar7$FGyy?(smpozA!erZ8h^N zbu{tvv8t#biyS#^7QK%*qk~oxPyk(NQbjgZ+kass)8h_ixjp1J!ZN-#d8ct>N8v0Y z>+^MW0y@Mkd}**D6B#0wzwaR4+?-ANF(+qCbqrkIV(_Rcy~9ErHySq$P=otE3|;xa zkn)DEEuKCC*mPU3h6~w*o1S{9A^Aoc6&m0w)deT%8%Ys)$tl@zR$k8{rPx8=OQjwk zHtmDAf?r`ZLg!{ZK_ug%01{`~r*$g)rX>BGCxe~Wl5xSQ@w+Mtino!QtQ6l@6pGE0 zr!(&fo3Z7%1dw*$J1Ei}doXoifZZrjdqAv(yy)ZKxkg*}p4Tl#ZXVvdPU`z0PVOee zh%@bY$LKjYP6{OMztkltJL(LW*zTVAu^iyFi_m>B{fPo(Z zxaRg-r-)>(qR4zwwVSJVM|189vz1MbpX0U@ zagMwbp=TPQ=**(!^;tfn*Bd1+JB5gdlV$?rlZnSjeESkiPpqnWnUq-Nik2Z-C1W57 zwHV69a*DxQ^M$a{0u`A#X$WEc)ty5K3KOg>s1Q@-WC={L z+RT2ptK)>Ax%MA!Z74w8YUD$zah~fzCpocT0R!@`Reg!QG&9N9{rTXKvH5Zdf>=OV zlG$IUmJieJz!#S2CL!M9kU(e@KcJmf;{JLF)rJyZdfM~eWlq>b{`ey-FN!kX8k}{z z6~hE!5K`EDwH(Pr3nNiV6D1Mbf@NUJ<$G3V^?_N8k1OV*KGpQCOca%T5R(Awlr=ck zCzBAd>%%VhdU&%t%G7GB;IKD+*dBF<)utkRJ&v1OyE}o~`38eKybU_4tu?K=5hbCF zrAJXSMa}Y=H?E_^h^@3$Riy7VNDE8Hc_N7{mT7H?-2UR8Yt1;f_M9oOA#%%Mj4wom z_UBv1M-Oj;P!IGa^tA20A|s~>;f|eL4@HUv#de7zw%<!0VZ4)2oi1U+3Mu-P4Z6CQz<$^4#2~nNMPKP#}|kW z!@_e$ivsUz6Kjok#9Y2@RJV5jMz1y+WFkx>!#Y=XA$f{ww zz(>yZw*)Sw5409Bk;f9e!q36pG_gMNy6{;cO!KdgBIHfR8^)Z?x5*k>Rf#{^#`a&;#p=j|65PXFeWYK^2({A=1p8)%2-WoM^JloG! z((6k!sdpBsd_u}2TobCIKS&1>`3w=$Rl^~8@w{&3`u%WyQLIrR&wdRsQd#qWj-6+X z2LglOqrly#7iY`cG#`GG@=mtakB(=|=Wk56)>C}iMHqf{Gig?RG<1sux>^G&Nm&Ok zvf)}FZTMN27OxEG65dkYi~S2YkNu3$GM`V{^bb{Hf1rEZz~}v-*1uOvGS-;3CioDBSw{ z4f;DM;W?OVMyqh8DuyqU{e)Lwagyyg3>u6rHm|FOqi~8sPF?OglWb;q>(%S*_qAph zv73u=wbMx3FI}HlN$Pb3reTUQ#2^I@dRM<7%4hMSW=;2Q7l2jPGWvXBiuKGBISYm* z>(~W`gG!AhKC*!4Zs)QcZ~!d7JSKO`_}1#-%%iP1s7jLfvTu04#E+rJAsW0XgW87Z zcgi_mS*`2<2;c1(3# z#V5a2O2u(hNherhn2cbh0l$}wUKdsiZVVxXSHA@N?0Z&YqgNANWc2I*A+!Y1Hy{D6 zpjB4R3tU1PQEd)Q{kHVVckhvyt2n0_pBzHL%+oQWw@If!PA2d3lF>+CvRrOHmYbt9 zm*Z#&NI*(waY$VY@F@Sw>O8rwZ{!dS7e&?#KtSNuQFjBu0nInHjdqYWCv}2)Zsd4+q+AIuePJ0J>3!grqSRWRZ{@-gynaOo7nubi`diYlTvX$H@O3TUe9#ok|G{R4^! z%dRjA;)99C?W^;sy5IL04YCf{!Q6&B?j`M@6QQHMU&~vJ9#9QW9Efz==*R{=S5{Lm zie8Ocg;R$a_0He=z8)QXXjpo!;;FE)hh5(;U856ZE)L zLeImavMERpNOf>iu($87)%^hBqzwTXZJ*VLl*-gPzOezPaA2N9j+DkP*5b546On3w z_iFlSlahX7ZsUBi4{nq?oT?x_LQ5A?pC0&X7>W-kNnLevi0HvlRD7dkz1KmyTL+ey z!i&b&G+W4A+|+)El(}cf>q$xL%KeKfG74&-a+?0mv0~3ZSxkIUy#`3`(M(no5Ew77q5(fprigm_;38=Hm+Nj-U*tSSijbY7{i&2T` zbTAJDz}ML0;h7?8`PRqD&XH(-Z-tiKnFN&Hq2Y0p2XYKc5(gu6wHatW%yrp!2vJSb z+U?cg1TWaK#LA!glmt5|CNwt5JEDgeS_Me+pdVJAbsG9NAxHh|;k7|b8Nd{YHF0ro z@2)WA#Ll?p7!+{!=%`J4s&=E8WeOK8Uj&>kQUdTTAiowvhZD65hmg3CtXsTO9Ldtm z`FLWQ085n^#;cTpv7D#2)Ie1?e8<$k(WXbF!v)Yv)o!VFaH^58NdPX?!0o$MF zf(*-Jo2gS2wg58th&B8Kj~3n1-!V07SKBQJJWLQjTwO~+G7m!Z_wHt0k`roGfZU2^ z4&tk3Ax#B!=C|#!kzdlJag7^NgwmuP?r_Ahv$>f-gbsOebFa$*aF%$ga18>z$lVq* zWP~V+aAAWhYn_KToPc2^5O6_2+?#O(=~lXLRx} z5HmfM3kl+>9FXJbXJVruB!B79Ho2rEQ@ru?57bCGa#x}cBfZmY{04m7eHUyLZ#E!G zcAxl~+PKB|^_EYfmAcNo;$bC=UBs3Tv9G;`!Q;50Sp9~Phrvo;_JpW00L=^DdX)4o z_r?Hucqpl8G)oc*=uij*DY5L082fS=A7Me$85ln2-2dr|1rVDX`$9T*fRM~2B@XKv zKH%NcO{?J-cOjHvdH$*%cZocr(v){v)D*EZh*%`lho^%Vr}=Oo7|5V4f1lHEhf3kb z`Th#G@nq0Eoz$z+1c1h0l$958zt9&E?3LksLwVvW(j~5**jJMKuq=W~>I{v^L#2jgLS6I$J$j0a%;m>Q}DF zcoqeY=}f5o#^w7{qTaT3QPnN?r<00CWEUYX%>*Ec6&0Q7eUi1=cD6z*bpYK!#F#)r zejkvTSd6Sp`$h@wAvd?UIcYP-3X!h!LZZe#bq}~?r2hzyAkQ;&U4Gt)7P%d@WuKfz z9uRgY)VNYwrWe)?VIlzx1Jdc5)aiWeh%CCx5j-UK6~6?aF6%p}J7@>q92UPNpTaskuS zz<-elCJ9%c&!;{-D9`|p-Wy;x#vmPzdLjUo2*pmRhZ61!)861CiUXlmu1J~w1;6sX zj4dbp><-6J>i{DX5AxIIBvasUH5}xyex&?wKkO-7Z+G8B4tWg+_|{WFw`!Xoe0>`x zPi0eDQ4Ymc)o=ZNUqLo|D0@6<2{(K}gebRcVeF*GvE-b+K@7e{xbo!Yu2d3u+xLSD zElCy(Xs?=wV+K+i^006N|de$Q7Q>Ft<+nbmX^sfn3V|HM`yDKEaYu0m@omvY6fK`L@fg%$ zzIVKYD;`YO9yM=Y7m6jQiWZpj3CKxg-}cPRt{tdhe$kD9R`#NK1?@v-zwnbso@3Zo zgA2vXwH7leee;b!-NIb~23&ox&`*(+vhMu2le3y|AkqSSp;FOG&)REj%ke-?AhSN1 z9m=e0K|!XT7y^FgtzV0pi2&+o^%~Tld-VXJ#jFtqoJ9}gr1opv3n@V---t*ZM^Pe1KmgLzwPT%3Z)^=+Q z-*=9!oIgI-T+5PP8X45p7xgB z!Km7qNJb_D(3Oq$!r48G_+vdfbUBuSMQ%BgaYbH=A?7cSg`n|~lal1YhFQn-I!;*2 zweR*!jaA()-?^8kOn)9V@jBNsDQs{d@(t-k3sY@Uw#oQv(!_;fx!*+;3Altn@WGOS z)6U@}Yj^EET*xwnhL(kVhSb%r?L`Pttbf0Z9eUUZz)O~r#e}g@z?+GXL>FfZsQnpj zTVw4rqocP#rfWj?mfFcS(FXfPLGWc0W5DgUB%%zgl{N*fNvu#)^JQ6QeFIObiHJT? z00Elm-qzd=AuWWE^gG1~(aL^4Rc$c^GkAeM-qV*{FfE%rn*e_qPp>pXjZy1!Ha^p( zZCD3Gk&446rEA`c)WRqw@bM}hG4Z4q%U3RN!o`J4N2WK#HyN&2GClGp0pzD>RYw)) z*g}PYlrwnSWwyWfofE&=%>C#5nh0EubiIhTOI!}k&xjg%y>V4yBLLmx$*`)iZE zIQcja1x@XsfRZQ-9p%xzxq(qSV0mj@#pVzLkV#-x7@Ya3&Q_5`ENenUhqg6oMC0^u z_~#lAFO&9bhLG+H&zLa@J2)#-sv^qVrW8=G9gz>p6>FB_yvz5oVc41I0?cc5Q8agr zzxl7n`TgMW_9h@?yUh|SjU#z#L=%&PB!JiP(x)`b^jFe`BX(mVMK>tEPx`xa(0yt&pjL?prqt(ok!sI(@gKqBs6cE;1S{4}-K< zqD0C2HFtF^?=hAbKHc&_U!K2J=_-(Szx} zmdvW@8WdjyE8Mx*Pj$c}7 z0ozk_=9sHbatVt^(hRMDzKt(>2kskD>U)1QxSji%77x%h9^WDCvH3*W{0_?EUW_p2 znZ29Oa>IFdU6+LV`;1ysb_b4G>)3$Kd6np5X$+1V>vpjc;$4pvib}Z2w+h2IGTz?w zBpnfnqd>H?cON{%ErJt!1NVAD7d8nU*L@Ge1f$CONT#Jj34BM04AJT=&{u#P_Ia&z zNtu8-RW{O45j(T1Cv0bhitVR3^KrRZW?)g<82sr4Nd4vn<`x^ID##LMA;!b1{l*#_ zA0|I?o@6HDbD{U8-losha_-hVOFis+)SQkQdkKn{6aGR;@m>y{mm>T_zWVDay5V^X zJ%vk{?VA!8_octT6N<$*wQyqaAs7gKrF5<8IP!68wD()1`}2ON_&RGKx^0jF;x`;5 z6IhHp@QH-Y&ndEA&F;Cn+w&moBu89F4muztDN7yRq7b8$Cyzf2Bix_-ic$9XpIbZJ)vORZ?TOlm}P1XOFHj+5l{LHBNYm6Zz_z~+|JDss_c%75?=*|NK0#!e;>6eddel*tO>g-~qw#eJM4?@vs2_F)yL2 z9J|MY`9^p$uLT6)40z}Yv9N0G-bAq#!;*`y?cGK`$I{}Hi}yTlV2R5&&@^C-oBqaJ zaPp2l!Qu2d9_%mphEFH>`FVJ{3DOvtdNGM&v%d%z2oM1Jpv_pLAk~vJ5M71P!$Mz% zXf**QX);~_2&(<%PpJ+c407z!c(A}v<1#oViuzXgt1A&Awuj*iW^FOxbv4H@9bjgp z4myWn=@F%?fkV8f|15U&-@BoAI77E2fgncEA8EcDN=4M?+AWe1h}C1pCVXu?_JSt`a&ZXF z(25!ttbJ}C=m!LUTTV<0KtxFK^iDClpv4ZAaP<4tm4k~Dciaal3}oSku5|Cp@3f2F znQ0P;Z5e0^J4rDK*ed{AIZJ)sn^3R-b2CbpbwUoK`S^w`mFc4C5ir)pMQrxZJ!yO# z0oAhYh~iBahqt(D8aMlGtwsz>BbL#x&cFGGt4mQ^2WxpSRys_<6lYrrkO3HFjF)B> zvu(%q@ayj!-CKzmhy2cO zig|_I_r+e3{O&&v`@V^;oq?Cw7H0xYuh9hbS^Zh9d1g$lEEnThKgQNG8RDZKuubK> z(^4Wff`7d;EE>Arw8TKK4#jB89t&t?d70(0*PpY^RmS`@V^YaB!UjLTjpYUQ-|nb% z4*UCm(FMJ6@fr~<$>kZOoO~c3|DG`% zQBJt@Rlx|3MZg%=hz1R-tPtt%2OGWQwV0~=@n8S+Ykiq&`5ihta0=7Kv=;`^fBZk# zXV}O5>p${Z&B=a-{WGTdXV`Dvo)36q5dLS3Epo!Y9wb$(Pv__R`cL23w*J#M#(6#B zjsNihc`>%f@qc|tVykNT@%+!2p=W^d8CE@cWVyZf4EuM?=NVT2<3%!aRr_s^f5xYj8A5ekFfy z5n?4D4r;l+i>1o~D0}E()~D$)OD)gYxZ-;EBbg<>1$HAtqTX&Nbc>1Ox1WHl91*$R zd}_Eu9mA(j=g(Ppsqd0xe{FMBUBssKJ*lMbZK24vgq%{xq_;a?472ct}{#lKf#=gDqhcu$@k(iQNWxy&p+2Ly)3X*r~8$H?LB#AA96r7mT!q5h? zeGJdWr>=K5#MmpLo;hQUdK<$t=LKWJ{E%*dp|Tku37q`OuC8=?7O{ zftoydpJdr26C{1#)3$(F4|&>YP;-Xv zoA8ZHMjO*MRMV_=?|V%H?Ra? z{xP){y>ESgZiC5Zya2tEJI?z&gZv;D)Rbt#O7cEN3^SkIf%b0&C-V))F>3fO;j9Ko z+|!MmFF*l?Cs&+zc?QmJtSr&ZSI?&$HipJ{sNL`<&--+-viP;(2y6JP_3P<|afr#D zD)YX}|7yDad9?_TS?gpmi?i?3-|igR^S^qb-^tHgNWBRCNdBi^+a42cxDBj1zoi7$ zt#o6+@4Q@PNAYJb@_g2amEOTP1z}nSa&$NFs;-kHS<(z7!Y={?>x3#676G)hPyg%d zVJ02;_Ym&s?r!NO5sD{Q^7{D-kh>-_(X?SZ3OX&ZUH3hb^a14nm6>pk`s>GDD~?G+ z>0Cf6&hm-JXgdASJDzhWh2RvhqW6BKa)IR_zF96P?93q89Zs(iiXPH?H2Rcw>K=_P z1YRrT*`1cH5HFOvp9jjGN+6X=)3Ij>FTq8g(t|YrskiZ5Bjr=*w+rcF@8Jau-OdTR zt4R`r+9NeSZ2>6mBy9>M9ER*_V&D5=6uV!rec9PLkSMqdcZGP@Djlq>O+s`~D$z$Zf+%Ie~6qi<+xl|v^p$;myz!mOk3KeKav^4TAj&0r$fXHG$28@9K z90rj%7=?#tvy9&lydZhDJtR2F&zoSc4C@129=P<~ydWSxM$Z-_bR|n-HSf%;y$1Ck0nu8;8fV6Xg z0x_&TY5QNkH!Zqy7O}tg^IWpn>RTtxf4#N2FU7=0omc#s?-?`*AyYtzl1XJJ_PV?2 zI|2R8LT7aERG}mXi>~^TS_`g*J<5+XNh9&v%<{raAEbF;7k2GaeK5tS!5Cg5k0pM- zA{t4J0J1I~6npSOeMlM|T#O>j+M&UNc$Q%YL6g`}5YHetMt(Le6Jksu27?{_0;MPD z;*NVC&kD^{ALhG?uoy#`Gr;jJ9jORaNem5w3P5Zl)-u3l>{KkQv0%_E6}kXSH|Ltx zKA8UFd6N32k$!M<2Ip9Tqg^$v7DTf!HuAlzv?yJpmh-yBCw;`Z;7m;Z#+KB*ftO(M zgZL`D&;G%N^9Dt=%jnlofYfB(PrPmU?O?tReUqz5agV%XxKg^{tp0iuHUI5NRGdZ~ z|MAP9Aey`=YDk9o9CGBZoyJGX{`%RF;tvrqU3d}*NaAp$w~obwfg6V zgVr(TCnlCye+0Q?ZGWy4#-{~ts3CjoOWQ4^Ou;AA%wCJa2S>fDtR4Ti4m6rPItY6B z^Xp@XP>4@rm?RzcALl9#lm2kXD*WH#gs_n5FhoIGD(YWuhZjBmU)~yTYWw3aKrGn* z7ALk$pWG2FOQvrhcKz9QTU z`ZLd|UjP5|#8Qum0vd2(<$sLH%;&zIyq>k;X8&hoDz?W{e(!2Vb=cp677s@3|N5_K z?*y@$7e3%IIn{K3w%iMLq6SN)|M~vcf-i41HbHoJz=I?2ouU14z9IVOz32Dg#R2cq3USWtOm|6!WYPh)cP`389k(QA z4nD6f-h1hH7R-+yD`3hR zbRUk>5h0Bcat8~JdSeV-aQF+$Z3AJ~L4k4+t-_cx>#3H|s?!8O zy)4e^P=qt~k51kr5)&%m8lLQZQoVch9gn)d-=L?EBp}xy*<{$IeHH$k8}!}bKR##< z3}SmfL53$ygSlH|^>Cq)EL)99xL3GK$j9iKCs*u3VrnS2SvdRZ>_K^4ye5&I?%$hA zgH^YyvD&@g?;evskl3TNrl)eg8;KLoPHpY zvh`m0gcbv5z=~0w^uqp5^}Y(T_8ZaH zA~rIM=ZGde3Q0Gs-5j&jp&DPvSC5+G`e1~U(D3slc$f+v$-PsvaaC)#-%~$mqLrAY z?o@H>5^L4<8c&kKK>zh4QTbrY7(;k?j4e5Tyf=NusY%T;`|`VhZ1ACRfOtrcqjg-+ z|N6$cG(1$s&z%6dufY23zDL_+gK_r0U~E`QY3BRrSc1x%5cgg0oq~jnUUb?T_rAGi zkGn*VfR2d?AUufuZ_nS}4&e*W$fw2<0AMw{ zTTpq1miZE^n{=YM(j{Kb8Qteb;s$WqM`e#z^a&97Z5I)VNpD1YlXtFgPJ8bD;T3PK z!f7Eh@^S&=HwkHR$Y2)#1ra`Pb?*7&Ev;Ai&QKKoFlqq95>VgQhHDo7u8JIrlhcs_0K~%go#t6-9&)&eU;TBM zaYKzpl}J4K1g5{KTOMjGCL_8O0I)w1A9IGywPbDbHi|_IxtGaOA8Khs_F3PNcWG~k zX@h;ZuUOItPR{~f<59|j+zDfcR)#N{b9NZ(R$v!}N8=fqepa$iE}pd~u+%zjS(dpR|~n9Kh>owE%^_qD|o45FR+VSr#=Lki?u@mOjiPEsYHNZyLr5?p_xiAm!pdffHR!yG4D$i!V7_; z@k!@vQ9(pM@lh#8g*O;a)>dcE^(24suiTM^w$ zyNs9V<_>1Z*BQEtAp%3@8xKbNf{9w>ZqD6kuSB^G)Ou4=UX_|nC|8)oM((Drslxq3RuR-Qdc- zBzk!*mpxS|5yJ5+-7orR!No4%6=6_<5fmKbG7fesaPpQz0Ale~ix}O1UF0ie{ZsHK zpFkzk{Bp?51RhW^xl|HSHWw({ZQiUE7C7CQZH@Rzm28Tejv2VsVR`6oN8u%T`}wy}n?qFW6uZdi^7 z9)q%)omON4#>}D*_3V!R>#Iwp?~>U29X@DqtYhZ(+Jup22!3ISLaV?A@v~IvUEw6k z#Dv;!L+UVQM0J7e;;mho7Co)8kh*a(FyU7@--1tz62kZy_*vNkL?B3?_iQaP9*;~F zqIK2SAWiEsHxu<1-h%)e1D%P7dxeOp%q}BBYfIWi4Jo8lr(~**Zz4!iJ?-CU!V)yW z8b0!SHfb{tA4~Ek_h}M@UO0=r^fm)A3+f39gO!SG6Bax6s$&++ueh^O)PwLSl za`%ei-0CuLmcQ9?DSv%YVHb=#BU0oFG&q4(kvrERH~UlxTrlqf~|LfHtTTzg+@7)QVu|6(#H7-eMxCF^zs(%jO&{;oVwJ0fUOV8GHKr z@{w`Y?f}Vrwr@q8>wLxm`pNnDQL`S9vNt~1eN>?zeT=?2LUWwQN7++chn6b9G`LNm zuxW~M5eRr>52E-Vk_-Ys&XV9*f#r&mQ`q6M1Yz@Y7_E!uQI@whe80e*fg60hRstJX zx?VE=?umGEso`znn6iYtWbN8lB2l>Y->ven6Mw_-5CuGP3oL39T!{|nUEonXxg8nG zLJE9YcrGnZ9MK+N30i;9@bB56%d-hZ#5d4+bhdwl>TE62W3Y_FGKE#>Svg;PsRC^{ zD<7P?*z)cSR>>oof=9`YO00>rBI%Um5hx?@akD#pCQxVu@Rf|=sk1;J1F+{rql-0c zK3|JWBa6pZGssCm!({mC7P_B2Mb#$b5;(G|-J1}*P2BSaG`DLEzAJc(htDGs`;Z55 zZ67?aRDEx~gcjy(oVa9rNf*)3k1HOr0QuRya0gz|-Gdu8N!cD1S4D)H!3+IFb@Y<_ zCv{$=C@B5()n}h0-CL<(Y(X8#@2WRL!u{!D3vly58^!&flk8``qnG_odnQfeA zjv7dQeq8R)j|kmE z)_=rI9$|_wuDAJpgSL5EYIVmlD~bIG6>Bbv5?v|avUb3mm1)&YfUXPpQRC3~`;D*5 zhQT4~Ne>@2$+Q!M1Mjy!#i4!$dlsqd{OnKvebUI=N6%FCXCixKQv_@s%vguheR8R2 zwRIHQE>!M4Ty~~q6bc9052>vAT{caV=Wp128Ne-Wm~52NEmpl&0EQf9dF0sAEdY@5 zs{B<`LITW(h1`m$UjshKKc2bgrY%nd0q@KUT`Mv}Sdwld$e=s@9AvXUgG3Kak!wqk zskFApr&jx&WAfKahQ~mW79~H(ANoCtub&sKM@=BCM=1l>A9-j_)VTd6k5A z=ERT$*~_`QCV8y~#+XDIpB|q+8An;)?LD9L_|zpQIOIlh-gi6TlmyRcP+SX`XRRM< z)&_y9wCRLgn?Fy8pF>~wbl*(BkPd+Vd#Ypw#v%d2;u+n!Cwh2T=)ioV&`LzPaQ zk@R0rSR|WI%-Rd#}A%U1di0O@a9>fg4zEPe$ zS(#tvZL{8X_Sq5+9ubcFa$gb=QH~8&El(UmP}R0)CYQt*nue7;$!CN%p_2`!=84pV zBEmEZ#?67;w~Bk;Z$Ev>Uh0ZWSjlT&?%H}fxQO9c-MfwBL^s}Nvc^`FN61KU8Ri!6 z!GJKtQwre0#E&M`4ddqV+0h474U!xeT(xT9n5m%9v+X5m6pSRiiBJ}XUD2U_oX=iv z4OQ=`>}09!{A6KmDV^8InW=UTC7^%Jooi_XJAOa;iuLXtF^Z)7o++ z_bRe1in*tY86H%nw>$!Cc~TkbeWC(3bAyYKr=@iVs!r*-y*GDnpF$z_TZzhUZ<5}F zfPlKapLJNdciad=S3wDVzuZ`RY<$z%6Gk%m4e+-jz%kz50o0+-s&n9}5_J05bEmP{ z^VToK+;z{RgIeGrB2_{F@g^653pWGNF;rLO@IztvW0F3!_`DVS=k6~PCyU)psAp8^ z?Y)L&O*FJ}YHXRPWNy?h;-KGEPtw;bIaYgr50Y2ck&Wn0V^-_HYfUY*#QlaaZzY(tPR_ zAlr(*4q;ub5=J`lHJp*{SpDoGk zGZWs}H@b_tb;o<7g3lF!F~07Ro;t-d5d#zV#k2ajXZr@2WRc&T3&#|I?6QarV z^W^yq^Mef`_tv$w4?c<~9>%D1*QX?3aES5s-VW0Wd3w{1%`znw)HrxlW9ZK_D4@9g zz)j>LI{#riL4Iq;$H$m?Nc_4}^q~r+0ll31s_Rfo9uZ3SH^xP7o$QY&Y$EvfI-x*e zK27&I_$N-2IqA@;c)U%M&MKl>O5fEhVWCGUBg-wmu#OY6_|;h`fLkgn4k)jJn{G(w zRZpyIX|x*g!Y~%0=shVN(A`x-$tW&aB0@n1t2H%Fw_$>`WfxQcWO%lDu$x z?tKJ-&Ec;dH<2)CZR>Us(G(>!{dD+`K{5KpXvMV=jQv$qwrsk=M5=!Joq{kfbx6J> zpqqi>rtdVyU@J>?GOhTFrdP^iya)MdywTgVF2yjDuC_702t95qDTojf=NG06oH*Ry zU3`TKqCSumdX0CaXnY(NBXQh?AcojJK{Bhu){K)ggU{7hME0b0ik)Nf?Xo}3iDpPO zMW+u0P0CnU%#I55l{D^IaFH;)AkiMqH0^k!YTFY9bG|@X@@iJ)o6i_{GiVWZIn^Fy z`?H6d+zd>r_XD&WdOHzLO?(&+%}YB~7lx6X9BMHgP~|b{KM7q--2>6@&q~ZbMSL_i zuiGxrJ7`p>x14^|m8nG$Lj@pjDl^{^GFO2<_98KqtruTG0%iI4b4Kan;0*-GxXT=f zq(Ub=<5WX6EJi@G>dTxx6XDtWcSt}{l%Q;zw4z&haCmn28RVWcNXyhk3^o18!yirh zkern$t}sf(bi1Q9u_61C%eLR~`ub7B7tHM1^M<~@$JrEG1&ocV`WLwx8l=vng(<8-dnH7|JpERF4NT_-O6{G|0dVQ5i@x zfMggIA7G)$4oKauc#~0uK#H1ecTF-n%Y4>;+~6@oeeQg*@4-8x@r1cDJy1k*kFaBWpbfODdlF{i z_~|*!;)RFC9CP!!d)o1m)P9Iw z$bcjX54pENt;iK@)%@7oEu$Z*;v`7Z;qN^T-t$?KZwQdgtA%4REVd}93(ZvK<-X`aZ z-QkuE5Wl70*_3+xK>JT#u)g1EHi$KWO@$>|+JrGSiZA zLQ!gtOH(L-D4+pRep-*|Maq6lo7MteYgcKg`iy+4WNltm01aEE%_ z%)}sltiEHoro9I?m!7V+UsWF=>IV1RC9>=3R=j5-H&-?Dxp+H@lP!DOAU#~|YR|me44~a-zC0BV$|?X ziz7YYcGFdNs0zfN{hRW8iTTLm;=c{;R;XBirLSN*r2Fbms%V@WjZc*!toAv}IR?~H zS|;jN8E4-s5c~vkB{9`vImC<*;Y(YT_rA*eux*=v%;&2a2J{hQ7rR2$BxC)JXg~gn zHd$p=W7%aCuMxv|PDAWMK83K+<g$LJ)(CM{44+p13K5 z$46qsK~)aHlcop5gKDLHW=l#|U6v{r`^MTEnWTdHI`Z2+NZ&bppEMyK@@Z6KelKEqds-dvNbyWvfi|J{?K1iA->ajoI{bDkzn<953 zb@s|5!0p38bqLT5$BBNSRYQAALl zg+52A;|27)Zt%{^f`@r19>5kDFqS?UDEnkAq&epb4dAk%z%%4F?V-{> zI;mRhBn_>%cGTE*nG<9uEFC&zUf!C#6A<|&Zp!yF9&DpigILtFt*K!s%wDTjsn}JhVo>>6svR4*eMANJ zY{(73j*&h29X(K0&ro?W=vzZUSMtj&WDi@T-$FHz0asq(G?5cYW@Rx9(^2unU6gV_ zhOZf?>U)L~tWMM+%-ScznSp<E1DbYD;>~0O7%mkaJsB8;%$S^VMT{uGGew@<8cM}1&5D{No>Q%@{-TaPc@UO z`F_X44WfG(%aZSFDzrK2Hu`;_q{9mibmQ)LKYgO>RS(0bm#n60xP;Dj# zDPP_5Ss9;0#2yMX4{>)aSJKY}jk4RpR8yRKXvVVbkI!DwQuOH#1>gVpZ?!PdNYf$jY#SAv5S}(m_yF!=#Qh+1cec^s1_3A(7d^+y~s%nCm`h zX8NYMQ&n2-?Wj`5z^<2|80e^IlA9n&Q@N`u8tiJqrK_qQH{8euJ0Zw-t=?y`uC~UP z3P!pym>*16eSI#jb6z!{@?kBA=88Dv%LCcHjPm2X%-i?dORZw$P@^Gb2A{Ni`i&)oUw}C`6G*^Ly-Ddb_7r1& zwG6Q}lyGNe@&f~ybrVKPNk7m=n3ucp^oFoo5Y6>M6IW+^N_Ila(1Xh`VsEPEB(H39 zA6Npx-Dl=5_(b5yz+djD`}ldw2$J(r63EYlEY*QJd~vPv-|uQn4hTY4DNCgUIW|Y?^LP z#acTEiFr6c8aZfv76rKK#yMjim~>uzGrd*ZW+b+-zRuu@J>DQb&ep(T2hJ+_vBL2S z7u3nk+{tKZp2bi%osBZLHYmIRT@*%y*e?rUSj#c^;wXp)m-_j%tl$tsP2BIQ*v)0G zUBxI@U#TUeXU!VjzJ+`q5_XOB2j_$?L)0+&SOxT|B=R?N+E0*?#={t6kq3j>UKm^C z{yl|8UFB_Cco)z%w*^0p`8Cey;*Q?SnWOibUgiQzKKYM^ANxh>mc=w_Fn?`5Mx^|p z3FbQwO)gp7qn)>JZz1CvU_~p;Z`N+9aGQ~+cTlQ(m^-TSuAfCs2#OFiqA+WARJ`8i zD`JTD*{$2F+>G1$LE1ikt)UN7J}a&#D;}FM4vBXwIGjv0cV)B^{w!hBbBN7w)kvR$ zPd@Ki#R6u%qtQN@^-!F6kQJ3W_VYJJ3$Uf--tG%yKy}Q=kqFC zeWWFe@i>@674)s(0fL7{t{It=4NpL+FYp#@`kbr#N(2k29Y9VtMp_=x1i5hbxzcug zn!y-GHZ{G@E<4b5;iY;uZ1DUHEM)%*dKXc#(9PFsn3NTwP_j zmYM7On1wYU5o1=X?9S~Pp#+QBd=e5pCon*eIqg(JY&~a&2Z$)Jp>6)V}w*Q$DB*t zS6$UugE#_?1x=c5dDBizvb2=nwN!itJq?9;7^r%ZvQIqMT_~rlbx72kdH=>zqhCjf z`&7}fM;#5Hb&t&Lw7fX!Nap>XBW-$WQ!NC(-rB+(zBLc-n8Hd!6$apLRu>KA^c=cs zlP8<5Wvhu!4@KGiO+tQjcpAcY$K<&mP{IV!fV(AL^jiB|ZYs~<=FBfNBrKeIU-Z;f zFNpJvGE(dcpfV;djc#bjABB7>_Xn?bS8dO>$XpV)i0=7yyV9PIyEiyY z9)1RWYAusS#u4$=75hcN+|(k{VQSV3M`TKR^fV=RK#_p4^&RC;WM$KK0S`MFza(31 z4Ylxh;2QBmW5yBfs5|^Pod^AqlO7Lx6ug)872uu0b{ ziqzPn5uv+6<0Y_uJpZG$M&6nqVtgv?{ryT_$6AmMx~Rcb_9zv++#g>+IPS)>$3uaU zw6`KHN~s={tu3u^3Tn>rE~wW~3ZmNC`93PE$si2EDv=_^lh|Sm{p(2$4<3 zA#-@q!JI6#9U{5~r!%~;RiGzuQ$Tv=kLF;#%LGogW`YGDbh3~hEfggi>lyO|TQ&(i zpcy~K=u)q*avDuysvz#Xp27`&=q>S3iVND|gb5?TuK@gg>gYz$E3dxNel)&QpCD3^ zmsa<;wW+$j>W~(<5agkPs;u>WDb}u+sRqU5EY1R1M~5**A6fI`GpQwA(FKfU5dkb- zmHQDOH)4FO1{K)To#)rR^`VxM4Z~t+BQDDg_lqIBKih~B{oZpqe=D)#i~u`8#J{js zx@BTs#IzR*+QLSLPMzm8+Sw=6!x?-Ud-O<0SE&<@$>Sm)1|zQ4u1(7L%=f{+NtrP* zXD+p+>8ad1UPy()5|V+Oby?K{;AE~Q27Qj0L8%&X1|XFKkJ?)-Lm6_^**0bH_}xv2 z@A6!8WqYl2_f3mY&K$Bb8*ZEW;041&t}=>n*K$E@r8)QXnZMn1p_c?*)3X^QhdW z`WB23W3Xt(mH~v&wZZ~*@(fC=pw~oQga}1HI-DB{eHFFpeVTk7$CEk(lXcHT#+7R> z0dy;2RJN>Cj57ptezG3v>gYZBQh>pa&x=`~)Fg#5#$Bip5o5K}c3|F5tV=E;NBB*i zexGM6*|)x%zHo!lDZ8{=cOL)=Z7sYt)oAy(;~ZMq&1^$uDaCaPA%QH^wy5_E;EfN+ z?>sKainj+BB6#m0pcvOym8uafk6i17Cjp~W5P#>11qw~KQ8(m9&eUwA-`F->Zv*#; zqwhQ+U`mgKeDbI%*10iiIRD%F1*CG{w96hto>^>KvW%+Tf5>cg4}vFc1Z?_Zp_*f! z{0IEDPq(~5H$>-|JNLUz+pyT*=Budf%QAS<6o2ToS+YWZ%sG-*W1G$Vk2>$?Z!%7^ zrKz)7=>A=-txqSOWEN>Yr2Po#!8QTI_E!_4R&b3T%q~PrVa%RodS*CMM8NHjBOf zqZ8g>^M_15AI(MFn3^Mg)2ojR{BwN8P(qPldKf-2$k#LDTm&FV}k*LCEkq^_hV- zpjIy8(U?=Q8%+1lC{_OS@n13p%Vs3*UNYg1wFPFQABUI zp?ml=E{(bnEAy#*H!OG;bsbQ6aL(;Ee)o8kTNcW6U0h&>W;i3EUvwh=I=?Rp0t=Sv zJ0SnCyL%2}GK)}LlST4w^R@WJdIzJ(R{_)lBB=0j`38NkgM2Qg9@KkTiOT@I(}a(VfUN;^r2jCi8TLJ@4P-M=6r&m zy+EpO%(DUQCAr#*o`&B~t!Sg48gioMIqJh6p$Xc1o5eAN2itG+Uq$@87yW5@Ad_-X z69sryf++mlb>4sc*sGp}L5@!KSnWYP&jib$?;}ql0OIaN5HsJmq$$Ob zk@RkX<1}q;j|Lh5Ypb8h+80a@X!i`zWQeT(L|=6Xz>&AcM5_gomv0XzfXiOi32myge{RzpJ}cuON_t2 zHIPLyq_SF6C3JDT2*NK_vf-Bd``Nc31hMEkZ+po;>FavHE zNbMEE4{_U{A|#2z+`9#Ex=6uwEXrD`$Tsg>I2HgFPx2p1pouf5V0s; zBP2gB9|}@N*RK>fqatoyarm%hm&04oePj}(PIzwpf-4Z!cl2&EUDwgAPp!7z75KTh z^hRa~hV2;!U6u082mmob?zPUiM=4^^D@(#d0*g`>)rbKa-RpwD|nP~m4XJVNf;Lj(X zN*Vv)&00T@L91#lAxdIg%#c;H#>0C1q}~8IRqg6lc6+RQv>+F?LvN|^y8Os6GH_?! zNVk$5wa*OgBNtMjN{G(OU674S;Wst`6uN*=@iF%8gr=WSYedmNyHv2o*v^!D%YH-G zClU^`mpyQ{C`xV?Ub`N*w1^$>Wc-2j(5ex~N6yjL_0yX5I#2&g3ys zS44RCl}f(7(=g8{PS)5>rGoq`&uzA$IrRHSCoT8Q!q+)=9`zp>PfvaYRKiqyv(W9wQ2#ZKHJBsXZ zGckP>;C;2@q9UN5J6N-Ad0_BMI^kr2>H<{F^mP^@m_wvPJ#3!BC^fh<1qV@rBn2}G zRTwP}g=Zr(NnRZ3gG3V5Lb}FNGAq1_+?Kej=$=++8&fEX&`i&QX>^ephM_R|V%l7b z`&pw(@*TU9J^|&Op28G5aVpcgYMNU!=;bHNT8xe!9v23HhQ12Wv&Xq$I4sReq7$AD zJa}xst$~ob-S(sYtN(j?6Yt+&IUueiaqF=xz@c;hPfnh%*K8S%)O7rLSp^?cav!l% z4gPGJ*{#Pa{c*Vl_eZ|99WVR)d>ZTywaORAvIwa9y}{GhkmK*yafngn`n8t_^4U1M z1IO~G22q~SzcuIMg7-f)SpR5{Og3lilo3;G0_x8HsD2>Fuj`~KpZ~sY)2|KkJqe&S{jUFj6)?0Dd z7m}!HfM_aBgZjJz77%YS(_0!07lP#mKsbg*O`{6Hk4Dk(o zFc?KuwdlbXjbAx+GL|<1aK~VlvZUReV&IjZVN&CCHkHT=y*t7ut~_h6V{?*cJ!6ko z{#JEIw7SRKtXnV9Sp;peJK2~&1qdCx-c8hx`;iqLP+<b)o=|n1zVb6zdq{?fxR;>ia^h7Rd2nY2$kf}*`y-$$x%MW zeb*4V6#crs*b#M`+=w>jUHr+&#$0}gOw|;aL~L2LWux{C<}C*XlD7YnZ(VH(GV{7a>Tous6b{{&cq&k{x&J5FcIT+s$9lgmn8&BQJ9?HiXyGu zOgSxgqCCnx#-j0J^tP1n+ETo3UE|i1oZ8NO$^hV^D`^wkgQDeoO=Z{c#Wp-wy` z=+;oCs1x)FhRFfPp3~#H{uzl5u8J3~a#UP~Z0$3!r&qLpJcl`+|91>yNL_x>Cry=q zL{%-Hu_rKC6ZPRZ4H$lSx0zcpUeiTRlcoh6c%k`#T=3$xn za1Q_ducqu$ZE2%)oc@3GGx*=AXNbQ$NdDbH>hBKHe|M1in}Z1ar*ZtDyZ`>1v;XxS z!oTOMPW%`6_2s|*IM(m+e?Pl59p|#ke-Yop{g z@0@8E`LmGtA;kYl;eWl7{MjK4`RkR`Pqi?03E@8r=|8_^{xq^bpNqghM@BM#75-)u z`kyFs|Hpsp0)qbR{MCiO2!FE)`cIhrs}TR$CW8G{Nc^-Wj9kJ$+XVUDCMf+^A@#FO z;%|iX&o&wAuR`YMIO(tO&$kzae~uHw|0+a&?=AXQ;cpfq|B3&N+TSfi{LPiWTL?q` zDkOfl?cWH=pN>I(d;4cMMt`#q^G}@qtC0R_Tk3Cw%n6mXg}+;fBL8|N@w-$1O^3*z_mjc@s+RhBB})8NNdJE2*Fxk! z|A)i<68B%Q$ z4ErM1zvgl2;$JU%c3J=Le{JDp|2UK;YMCe(CjL7Mn<@Pl_&d>`&S&TEF>Xx5`tPp! zqxfq6zcu{-m^l!b`hUjmABpPk(EEqvnfx2a7$ylZ>K|B4;Qzp>1pP-uP~<;Q0*%5r zMlm8Ie`dVv^nZUMud44`p}w*H_r*#TP{*=29&scO4PhgUJw94|c4P%^1i^I3## zz7>dQ+_JkHN|qfW$1CD+X3&%%uC1o*g@;u2c&i9^WUi;T)H~`l5V@qE!Eh7qS~Di=43{=&Er1%)Xjoll z(>F`^9N}|EFURp+tgYNp|9o7TV)9NE-CP!l=7L}_`6CybT$ETn;#9t`*iw9t9Px+a z377EQtDB^1QtRE#1}AGw<5KIg@#ofw+>N`Zv&)y)1?=y~DN!%DKDoVLvVlI*{`x+dc0ViTHYVyA$*i zK$}g6*c!R>24^e4stu7IWIupZbv_jUG$t}>^n{v30(_Q6mJAjC9!)e}; z@zm=yZSpSp@Ux3S*>cgN^A#sa5PS&WU6gYb9D=|D=h3c022ub~!pAVc!5GMPzi8n` z9vMWzw3v-Ov zs6sNx&H&U~+CJOB_2!7DF=O$MoUuhRrzwSY2jC;SW19U3}DBZfVnp`N3)Iby~=x|q{WKg~G zOp<0PvN4w9jZgrf5fCuBv@1lA@?z8XL~gzV4HpP7O$N}OXYNGJKHr6*iL7zs!Y4c6 zZ^|Az1p1^a$S*H-oy&O}D1(l6QOT@$>MDN|jeGHg`g}so_faU`szZR{2DYxABGCaV z1DO4yI)}=Eo#TfQ-;mav+}DUTAR$T*9Dw9E1(Y%v=>fkNUT9B-|?R#j6jc* zv43&nN3BxSIFGPH0kyjwhaxwQ(Fj+084Sex_}_!f(kd$@Z#;*h$6j z#M1FL0li;mo*R9~=0;w3;<~It`p6UL^J-_@&865g*5L}r&VjDjjR0MxLiizx0KCkS z9UItYMiDLMgN(l0KMfwmtj@{34E3PXupzrRGhVq(oqT1Bq6$ZLf{{?@08md|d$wt{ zuvI+*vH{@3cQsv@;&T0%FW+Qs7=PtiOBsN}YzXJt%(}~*aH9vZ&X9h*nHzM}op;CY z!|^U8pOd5wPP`}IH7A@vbg6c6@`MPN(T2#ois$@pEpbl-SUMk*X9?WhmrQ;@YaN$$ zpD|!9ljFwlJ61pO5BuqY%Ms8~>Iq}PIXULmyZm_KD3s#L)Yhut1xb?F_?yu@+GM*k z&cRZ!6!GMx4xTK{;xFr^EytR)4S+lvM}q&w|H~XSm{MEx*1Gk4vzZDaT!nh&qMhj%qf> zhy~B11ObZ1@n+Kq0M`A9!7K3s%pO57)IXQ3n1;-6@Rup`7_Qv9nFofqW-7!=qZ;K}v)BlX}D8^>B*w2Zm?248a)nDJY!-dGy~`2l&GMrYasB?sb&65Xhu zH*Pqw0Xid}qAx7Rn3fS%bG(7IvfHO`jHT+4iGZ$TZ9?xW0wI3M^G}fv-(0O@Pj*E| z=KEP}cG|#QAd)284TmlWSNOa%v*nd8k|e)7QD`neiRtRHUwzX+W)+zvQRm^vo-Q>%|WkFTSbS}T{E4d|1yIIKxF%R^!*S**eVsy5ftBarA5{LO9NZ3ip&s4!J zYv4CF%1ZbGLYWW+@^zkhC<8$(Cf+}i)QZ6955FfwQYnV#J zcmLIL>4ksFwgmvk6`o?E`QaP(epn5`Euox$$RT`v>noKZR5oy}kP7;CTEDP9uRT5nRP%$i{E> zs;j6`VYAn!zZ8?C-WLwvYF~T51c~*|Z2?jC$h>aU_6ou~1dOUIR+vPpi%G0}IVUtK zk%@0!a5h|jt=X&4eFp$FvSb3PN+NT~ls-O0!vakN>7VF>NZva-1FNy!BPW<6ePfYv zgb=lNIg$*_M|AHzNp*UI;7JIbDAdVGHSs6ew7ee19Yl#j^nvtE+9~!0kTo#|&wRCb zz0e1Je99@N=G z5&0~rRUB_Tw8E{j>e=VmQF5wOJxMoyNy__jSmuR>LWo{B5s`V)Z&e`SJFj_eOp9uP zw4#PDYUpcTksAJ;aA@B3T=i>{)KU{Zf+KWUrU%Z280Eah28 z=zx^V{mkDoGP?S*(DWlNzIHT|Lv({t^u-RbRPrp`ElD!JIvq43l}c}*d7%k%>=(_U zlbSgPaEUUwd+6evpczeruE#QID9-eh(kekax6b+tdP<|cEKkQ*$&;ZdY>Aj|T!Y0D zuRuo1h(0&o$rPi7}57it89q)HAsDfgj9trl2Xytj*+sW9oo(LU+%1+#sr zb!kF-pDUUBLeuXJLmVs8AeF72-sO%<+Ro};ueUnBYsYJJkhO{%T#lKM3EGzrpMi4a zrS;ygcPqDA$y7pyu?(S?mz&4$W**H`sN(elLn>W9y!^Yao#P0jmyS_%EJB#X>*9`# zcG&lpXtbjnJ-2-x9z7q`ot}G zh@E?=~qdAgUfH& zdBl)A9p)cgijBvOThP5fOVi6-6(6OP#{$px?TZRr_W_Q_=DH6?M2=rw>Zy>#qPnPh zc++^=o~1D7t);k-Gaa&NwhMsor(8tdDswo(CC3YQabN6ugDN4OutM^0}p&oOeOvDZ!RMa=08`4&}-YhlB^LnGzuMBdoU@SOQI^Xy7S ztL$KW#arO2ul%yOoc$m6-elWRWQi91AO`f^Pyzu$bV5ipGtr4&h#tPa9CS`ZoXCjG z$h@y=)!@bGuDkL$!rk0#Z?kQNmV{t`uQy|-m}S!n!wk+$6~n6;(Z1;MqghHme6$mT zafvhE63N18#4+PY^l)QmUy#YAy+{nWH(k;Ul76l8V5RgULgrKJ*8J_DzLb3q6vtjI%VUlKUrb~*~4=Y&BwX)Q0ZEbvvn3JaOa#x3kmYl zshQzQ=7G%WMNZu5BF@!|zBWQD4UrdJ2p5=MomMQk*Spv;hg-gIY2*PUS$93SNp}dn zPm3=rq2ge&agm9^auMu~R4Shs)aAMwgB6rg7ty9{KW(;73s-%P9%@Q-r+T@;Kd4t4 z0{c6({j6yKs<*REG&t7Sir@KABGcdv53Y0~Q@Fk`H`*?M`!n_@@P8gWkFcl5Q@dZ8 zT_;BU!-kJ2MXc)!bk~CQl?VQp^&{$zD_X87U)DGOX8o5CVfPTMkFrxUTl?~Mh+AZO zSxm%7FMuzAA6w`nfn37-B-4EtpE|FDrk=VE?IAc=kDw5gzE&ou^Bl}anCoM6S=HVV zxd-_I2ZMX3nfKeuX?Sg0A2WZqe%AyobZMhMU7vd0e6vAc81Gd2u=?h!iA@#;V#ZUW zpZIh363b|_;UWu_RP{5qIe7m>*B59q$JNGMr@uc2Ap&gPtITOuH-8n}T=%r3&&?k; z2fa^kam!HK`rhx??`I2DrsmJrzjb17`+**{7+XB1%mkFqcp;N`hWjjP>Nh4;?GUA`Szlr4^nbq4qg%fSPtEk*$W?ef}c6*8F#+e)2k6XVl6nZc14}>I} z7y7kbup8iJhH%_2SUujr1=H_2vhT1<`@m=!rN-sGe*W9_!38$*M*92pPcFY33>76A zPZ}EL%;;9OAY^0oas6bNxI7mSgAK8xcQgl(COM8be1C54a@b--$jUVh_EgOD*D=1; znVJxRq}i5w*NCFSOu5Y|w!Gkl&7c(NfAfKBY*;{ScsY-OVtUm`D0vh|^5ImE>Jf?D z3=x5n)rJ*l1v(+K!%Kjnk7-bK9g9GY#6$bb;9XdDrec1o;F36<+f?2uOPLqk^tj3l z*@#|{kJ6J&?#%dy(E$4+QVg&k(*5{Nh?lv@(Gn@~dShOAJ5cINH_Z7s+Q{^9 zG8$r-Scy5(BXaxcIiARZ7=QP95z7 znexs8XlZ&Vc7Bo2BhEV>MBNedL^m)E_aYUd5WePXeTObX8LfM z94yG;Av)BOGWtr#0RJyrA=*#?9#lJ0bY1rDq{Dq2RJbPO-D#Q5W|`Jj+v8FksIBBD zrI|lsU=thxD~b|QQw&jt!}l=E#PMK@D)$)8qX7>%J+akA0q&J)1boqPzIjRy?CJpk zoiRcO?1c=(?$ch7&Vc>rY}2~RK!HmdKiICYza1#%*^t*kRx4~W&`g@rWKZ3o;zlX> zaHp&zMB(R=)Mx|eyC8;eR3EeB5 z9DVtj?W}Q-1k*U$p+`~NQi-t+d|TK$A;6_~Kw33QE!`^!HZ+o&-bB(Z+n*mZS_2Mz zF4$-GNCQ5flNha|6Wegi0#zwOm4XlNcPV>o1_&$muCWvF26t!;-QR}Yf$TiCgGl$n z(EAX(?IMZJD+`*ThccK8&E(f|&LLB9jk9^}3g*AsQA>xCgp&wn=%rx|NAB^^(gTtn zql)Emc;Jbc&!#16&$PF&INFj3={b&L-y3mFs){a*;6=$sb})2E8|e^c*)~-r7-`KN-uO8w%$7<*mIJsn;Ms<~ z#v)AJQ*J_&t2}EsTt4Ppf@d&nXO#DKx}APR$jI06H_7W?=Mu7?ybB9LS`0 zTUFpq73AHF4^>w6oK7q@Tv>$E<82nz@3!9L+cbtWLQ&nY^BzN0yb&tfc0{rY* zNr@2O3qnR9OopCb9yaa48-VSEAy*$wsC@xF^-wHEP@o`?pBHN$i>outFD4#V7_`46x7XKC#S|c?#;%!?#8^Q7iu>AWDDNuIG zGUUxW2@2qtYJcu;z(I80p2fIP5j8P9o6zdZ9ymDG3>>Qp02O=8?I4P1-DMbN?0R&d z4pj#Lt@#LQQGtrpB=3&sAk5*pnq*NWJ}^n>S(Dti!}|aI=1y!d^i7$@7CoN zgR{Z%q^)%2t(9=s*tc)4OElKO;~@}STM%5WMWOT5^7bg**2A*!I!=qLNshoI_5FOk z_Ef$CabS{zHC=XF-Zc;c0K{LfDp&M24ENrWY1MK{bxdhdxi?m4#)_7H^4L7Qd#Bb# zSS-R%XYcaoJYsI0yGjROYa-qQ_WeqYam^=59XQs{T%dO-XK<_@A6KOv_E`9ly8*_X z6J3DH02t6GXwkDQKd(-5Bu>P5`#anb{UPo+e!(4&w-08BlRI9e!tGHH;P!CGi1Q+^ z9Qv_gz+dG6HXH^AZL@+f0e~>(ASV&|;y@6=Ko9{i;yA5AB$;l>qtQ=kbZ)5`&4o%2 zpg;vC>GrT)9!H5q)~y+zRe8f}ur*nRdvs9ji^ln5{sUrE^N%qqkM6QQxH+(RkEBS? zSxxd}aKI!jV3I%M`(p+?3%|DmVaF!kR5Y%k2Q@*uh=)!Z)v0D~0CN7C*CdiU^cPvn zB?pjyQs)(M@bK{DV4TjaSSv-BuUHE#zwnPH+h2nlN82FYpa_q+irTN-e~J zGA%Pi*+YAd4!|T!VaeavH%7gy8)pb`Ga@hAw%8JhCgDNObpsGE6TuuWNm}iLf83+Je6Pw&a4T8Q=)rEoA=~ zCS^j2`;q~x(xvf8gi`y+jq$?5Y!AlTgho-;k}MsjA)WAjqq6*3m@m#~$0}x)+0%HPfTz4qC{hfD3gXf02z&j8RVCpU zSd|Doq528$r9a_44l7kYfXISQpnez}LgE4mw_nT9^?<9SyFSEWiteSmM59=5G^ZC4 z53oVvVK>L~Ziq~qM-Df|i~sYPs&0G~aC*7X;j}v&N0AIesMA?*XC^c>wg%6l@C=^; zi6b?@J2Q2{;gXo+>TY3dy2`9%ORILnbbZ<^uBmj@DQ3z@^M(yD8}BYqwqZuI5Wix^ zeXF_x;FW@uEa-qWI{!HG=ZE&l5492*cQdohALvs}Kpi=x z9NidkB)RBRGCl!9c|x+$5)1xCj@ePX@+~`}XY* z3k_du73mt|y(Ie@;~PWR@9u{k!X}IqKANUUU%kix+KNj`HjIaYdpw~d!(*O#SVs9q zA7!lsZm^7v3WNmD`rr9|xj&7aKq!aSYVd2APNc?br*JQ8FxWxzHbG+=H2GLgYI_#&re``lZ{9#AC7Q-(Y6CHxIS5UEMf;uYAs^y=+2P0lSw?wj^ zm^fCU+dfSJR|mM<9r0RJ&2lZ{W-!wXm`xf^qqpC%mOu^s6~!Q$b@JhKU>4=Iem5_? z;9bX5w7_{|v(<`IwJ`fEyquktyT{yS=yd)4S@As2 z{;<~7CXgQLmp(Jhuc|j(e_RLQ)e$5B_j9QaU zkCm{Ys&w2c6`o0!T9U{-1&g{;3a z!CLQprtDU027ojopV|z2?I->!VLU6>^=lfum?baMmv2vSH+bl1xzwscu8UOV9CSa8}>DJRD4RQ9S- zaoT#x5Tc#Qbhbxu;KFgsfp`|JX2pT&1%P{t)oi83Rd(&lefARBY#Icc?14Wbm+!bf z!s$cnVv4SIB)Q(53tsi;y}x>!)&vCbG~e<=YQmP&{D?L(Uc9fxS6;Y)Yk?LjEb0;M zf9A|O_Quo;nYslV;G(~s*OerPXVH_%rUe19<+N%gy~iwJzI57?LBpfVX0uZMm7~D7 zJj9-PNiW~+$;V`#RoU!VkbUFV5%#v(;Z;EWk@-(|yTeB4d(Kk%$ork}Jzt)2zhKPX z;8&l^n$19KQvK%q-+gQw`@i+EmM>TRf|84W`kpsa5KPm`PG0uK{TDXbjW2pnXvG^_ z?tyPPMc{dj))E<8-Zq^^mX`Dp-}u>e^aInu0djlGA?spI0{Y#HgDmF6hOfw{u zRn#O%OI0}Iv=m9x|4q(r45dHH+3`Q;?BwjQJ1Hl5d9mlXk8F-uKU1BM1MtV%IA3jt zmqLa;lJa>t6%JfoT4O+aJZ1*Nqn%|4dTKXnF$te~hwHXci7^ zp6Ifw%OICv^$C>z{Fc*_+*I8?L7065FtiK($?L7Q&jV%HqS4Cg9)hs&TrBTM*6lf$9s9WS%A_9QS1 zEmc<4OUj-mm=h5{iUp=wh>1NUogPn>LeKjbO3l1e4REo4Yb~U$9>Dxi51?$zU-etz z+&Fjb&+3`vjZJ|~b4aNgG5E)hxZe*LB5-Vn5k8$2JAh4Wu9f-LCrZ7%zbMEnTq!sW z>FT%^Nwe<9j3~SbM^0gN*FN=%YmTxQgTLe`rLco@T(+G%&T^Zj7^1D~Ea;QtnfSy+^WS(MTI z7)m=GBIV@h#HPLa@29vNZ^SE*Bf8H+3#y)z&6De$OK8Q%>Tu)J_-@Yr%BOb>G;rAq zg62X!^U2OX)Wz6L5X`o5piA_?x{!}v3wOh4zU~F79K2}Vj_^UeX5Vq+v!_s246fEA zs5DjoTEp_5t-NsUFeo4{AA`tH&Z&H0ShzDsx*v4OCD_;oP6l4bF-e}k%=Ckrg1{hz zGkF~5pt;&>{`=&$AdVl4xoJs{ju`KvJCE7ka->{JHxA-WYwkQi#-DQMWjf~SWfw(b z&kv(8q0`ObBby=oB^hx-v=ZHUohT-H^G9+Q?fEl_!xiLd4HY)m{;it?r{YaE#+SOJ4?Q zLWf^!0ZPs!=3Lb1Y3a7O{amCqZs!JFV%iqBMAA#7elBst0h}WJ%oitk=PmQ2B&Zu< z!e+kW_%`WGJr++;EoVFST&M=?;z5pYFQrz8Qm79>^{(Y{0sB)O5`up8JDYBFLC9G- z0?%lEtA~kMnFjsww#Jak8tYwWyr>DSy7Q5$90`%kgxynKJN(v;vf4JK0c=Grp!$xLki~+VNC^`JrR{1cu0ivzt4p1`r0sgn zQ?u2S1oj_OC4Djf#p@lImlLZ#RsR!#7)n9^7`whIg)du#ndYgpjnmW&J(pB#{O%a zIciRH*9qzz-&zfdJP)HiBeF9rbHqtmFemT(wWeEJGtRzP@4sPv1hsJf`e^>zm zpjU&Sa<3Q03BGyAOaHXl`m4aKM$^M$aI-_;_|s-B*xAMZ>28a(7fY|tnxgQ@J^T?kVWnFjcM%gD_}r*P@vh8} z5Bn{HXa`Vk}PFQ$LvM@i+C`?z_e)XvYlq z0Q4_QM{Dz6^d;yAxZd(fwKlsEN_U6io`kq138}sMn_a_fwSMFmwf@h$^rKDz{~MhG zYl8URTy?$eNb>oing4CQ{KGf@L(N$-IoG3UXfXhWnwWc4E#Pkj_X)w%lZm8+hDXNW zpCbYF#SIZ+a z@XKqd>SWcsWUPJ0Cw8}V|A_aMg&9OAVX*;UkZ=5v3SJw3d?HLB0UkFWPfTn$j~l{9 zJv2&6((1SrKS+6zi^u=LT4i!FzSk-{vEH3y5fbamT+)6zeiX3Oemb-_wvr7RPfq3x z?$TScbj8CvlQJgOEUZU<4 z9G|apA9t{}!^zX}sZ5)8HImwvVIq2{0PpY}2JkbDr17agGz0v)<@QX4(~Vhb&ePA- zt6rsol5@5LVtMy?ru3#M3vR#Alzrqrf2_s7e%59E#2p_icjR!o>CkC<9%nm-Njs7x zc!^`2m-Nz_^6{Yz#IU0{J>LNFje50mNJnjG=_`#?h&2XpG}1FSog6+=Uv+YC9-rJO z{!2}A6ys|BYHPiM*m`klCt35E=?t!Q;=EpCfp-9wt5lQ;?vPypPmtPf@ILbz{IBvF z(Ej#3>@z0H%;SXWhOsygXvU=~qp&hzA>f@xnvWvKMPq&NF9ER5%7Py$4V@>OX$Pk= zN-Tz@=eYIpVZlruIQE9AEjvVNE%}J6Xv~^>KZnIYtIy}EYxLdltFCd`yOy}$nSa&L zQo2L*5Y)b!Jw6$7hMG`-^21UDu_g)QGQ@C8-Doa^*hH-wK--w&f8&E*+sf7F_BGf{2VTaS5B+H3JmclPoQ*(nX9cYG-=5LdgQ_oiFgKai=Aa6&Rej6acW zFGQz`b9%a#u5eAMw+FQL#2x_->|V}w&F6}MS!QRbI%w~{#=D9b;n5O#Y+nYHn%=I# z5g0AtGBIEUCJ20|Jq}3U%BR8qx2tM34AD0$yG!1{&NX<63?QRM1>*7F)b)y+Da zOTsJ_S>80dvPG(VCo<7~-KS+GearK!o^u7z_i4}yVfn88y{XV^>&u=Rns)Nf8r2N)kPfolGN%q4}hysNbt-Oif#n{?Y<4%c+A!8N&q(p zii9mn?$&3e8tuKe-W|?ZKDaC1i0u-v-ghoT;xkGob>=p7UsaCt*;5=kjp~4BV;6+G zF78IjN*)|`8$6{gu*q*q_EY_Td@LfzWe#FIrwXP4P_r?HyymjSB)*| z8R7Lx6(Plb*JC#!RFZ(ZGILHYX#LsWZKn3syW)3cluhk@;J%u$`IJ5a=gvSuiXL9U z&v1ZmCM^-A{_I z{iN#*0c~Y1HZ4-6Q|A#jwe`Y)W*?fsRh9- z3f1QeHFuAKEl2YCkMCERjV$*Ji!mQHpb}0;{A{?`DQZfb`m7!M)H9|_?QLr`ur)8S zz%F8RSflxC3}SEsfl83%xHt|zu(N+HIQ2XV=HItGtVI4%X^9-2`PCD>LBtoahRCk zt%cGCI2_`rZ~$09r@v$lf7kuiRJA~`&lUqfMq7KB(62rXAe(eJmozcU(8VRlwGr1W zjIaqCQVd^%T#k$|9>`=JxWS2gh-CvUW1$WkbPy>m%sYI>d;XH#wS7KlzWL7YSrY!K zX}aKdhg1)=moMr!K44#PZU=t3(vY_uG2KD50G6X1>I8SzFRaGPpyRN_PYW~wT+<5; ze;|v4Tu@p#ed0J{8l@>5y^>z4w0?RwfEyz<^>YBqZrdGet3kg(eXm~pl7dJtq}QB| zA^VBwhE{b%sc?RA=hoQY_qNCH41=MU5pLpw(1=>WgyRP^G6Ms!@?E6g)ncme{XN7N zId!Au13QAC_m{j22QHt@rFu{vk|;>kU3)1H=W93I!jGP!5ym@5Y-snA1b4M7LnCyH~Iuao^ijlC2on$cWiw6aLc1 zId&0=x>_Ek(MK_K3g7uZZWyk3b89lC1bm6$Zt81U_2Q1%ODC&R=6k5jhR+IP^M6GX($jv<#Qx3@ik*nuf)&Ot5u1=C6l z_z7IMnSk8t?zBck?NbT}BRK>_HWkkYzRrvR7^!-wJ0^~^n()verb1cPy(2HtEYuzq zC0RxjV){NxfqSM5yp+<|c*U{v+;q7&8m<$K#m1I(;^ErV%^SC0E*x>>&>NvX|AN~e z!iw7)=Z@$W9(H`1lS0)(rhtyt!^(xd?ia)i4e_8ovsa=zfyN#=VVi4rOa)?m9^q7q zk@T)xwSHj@z=es3H1Gu_{c|0E+77ts>EZ(0k+|`;Vm;trg&j2i?ox6!#os_xfhr# zS)AvgV~(UzgqW|X9>PN%QMUmN*|rtJZb8<=qc9?5&C?1x`%yD+aJJs1S&LklvsXgb zlX0qAdn#{+j^d(+Vg50^4_5}RqZkg^5q5^Sr=+uVU%$6Nc@Tvz7XVRe>LIzO6zN?9G#jrw&E<-P_kM60FXhfX?CJ!#d_N$@9p&iPpRRq|q?8oCU*IYc$p@1Ws5O zCMcB2YJ{QZb1N*&%G(I*Fa03PH_eOTLob@TdeaZuR*qze30dUc``+UjQcQyZT(8Lf ze&>4a`BT;WMr7;$EkDDo8=3Ax|pI&_j&HD7!OYXt_WYDMQF$-`P#~ ze-qpt!A4>#K&+Kn6n;c}vC1gCOeTgj^c{%%Jckq6zCpPPM>EbuGJ>@SRvaAUO5VvN zGjEz6=O~J1#(spF6Gr>1R&Slxqy^Xd1#FmGGQgMdN{1cCH(GCC2@=GUA7cTLVQ2^; z_bsn(X8Fx|$s-Ra8WgdFzubJ7RCDvlgmKjaR*uVx=;Z(}ji~A#WU*ECrPFZFc>P(;EIxy}%{F4W7hwUuuSU1V! zM8V`)GWFASL7Z=xk1_$~+cCm^ZVRWQCSvraz<}PEuLvQ`%r8%3Qa$LxP&4{HE@;1q z3%mQlOwT+%C+u^bzo4KwOhhx4m$FB*Tb=6g<&>!JIi-#c>SFllS%mem zP=2jZ2KZ}Ob-SA{+e<&pHd_lDx+5)pf3zj#+#{hqR>O3u-a0{gzxhMp4!`N*s?z7% zt*`6u=#d-R_^D?u_i2y!k}HMALf}2-{zTpuRDii ziQ|n>u;j(KcYzDI);*dr^3AotSv71~ZQT8#GU@AmzQVC@BvfMJoz0-9D4h=2yEjUQ z8Zo#6%tN(JU(SG@8DSTaFBJE+qJ!=QSnDt~bTL>j_gzbsVap8>^sV*fkFOs!iU}@^ z=%8Nkyf?e_UC)4Db5#g$U37KTyq=^MuuoCcf_?H0$ZkRnVD4B$Sc;;ycvt9g!^$bW z)N3vBEJoff+PFKHJ7@!Lqm+VxUKu~kWs859%jP(m2Y7YWt0ly`%;L<2uyf#MEvS@)< zjZ}09YOFK&_S$lxJ#4VnT=bP`*ju&U(|>>7GW~j0*Jk*B-XVp@b$Opu?U}}pap@&Z3zYs`0}A)SmGNG2NU@pY$?QMC^qx=860jj`JvI}oZ};!#H3~kGy1MsCJ%7q ztW;a|Pg!`N_*%pPcAsM|ozC{4p7u22Sy=YYm0_j~;3#gdS0VbPX4(C!Sx%JbUJQcc z{_Owc@wmV~v_qLo6o-X1aQeYzn*O7ni83O7D5lvD6~MJ}52g7J9n!Yf-)6SG?$*i9 zB9{EHoxW}gEREoKL2hw zb!3hHQ{S_m?#2aQ*fJ8ob9Y8Nzals>N5WWOSZ8QsenFfOFmfS0!Y?qR;|Pn_K=XS=8N(L}fkzzt(BmMl9Wj-;4!poS8SW<_m2;8{1MsnYc* z3WTWi5F|KwL*qn#{%~yqeS!D>-q)*!Klb%HrsiCjw0fd>By^oNee@F8H4e& z7eT61yisblwD7(L0KyJnx#@f;JKjZb-lpyxP7wG#R!1_q8Q#gN5}ks2&yKQ6Vjmby zO;N>xHT~{AwyK7RnF}V#7-o~Obv(vqg3Y6$0krXQn?@~csB z3-V&`1L6$6gka#$`vQOk6bB|2un^sZHFt}xxEC>+965wW>r>|}IDtk&SI}%1-Z2}% zL%Fpnb=TN^q_SZ*HUZA#O_K>*UKxFJyXvp~41+_4co6=qf7FQRTAg1^HHFrAk}okn zgwhjM&Y3!R5E;@Lg!LW1*E3*m2tynro{jJrj=hn(wY?EnQ~t2x zR&wwkb!wI^h^roB?Vq(^71&nU9h{OfWq?7{jdVHactEhj zWkSsfrXa`jmyy2Qc;pZs5#1|Zy0VD-bFp#lO^JfcV5kC6x z)85vip`G6PWYL{f?m@l#XJ5{vvS_!Wl7fuV^EOJOGIQ(o_j5FxZ*w%8u0SAMrt2nX zu`{8y)%UqNW^y2dbF;=>9WO5XlYcuCzD0D=(_Sim><(M48SvFnfKCNh^?%73%~iMM zj7*WUeZMgwX{Vd9KxF`aAcJ|dFdkVYdg|=iftwPLG?Xh=GT&IKb$`H0F$BD^5>(CF zPx%>JPq34ucbc__t7o@gYN2DW&7V2-<5xXT1@1d5t3%e~*Gj^@D?Mh3Xq@QBdk#_< z@4HD3f)c+#HYST&q z(^DhJ-};mc=Z>rhzU3dr$#ymkvicIb2sY(1zp-5-s+=Qjb?EDRw$1Ywvu&#Og<_fW z)7%5<_j9f^*Jds`Nl|-a4)48cZ+OiA?Hny^SbU_>{{^10_I`&gR`cxQ&;b78J>&Mb zGiduN0I#t8iy5)q^~PLUf}#X{?(F_!2I}u;lw!l|=Z*2lGjyoJ+BXHZ@Kw{nH*Nly zw}Sj`-U|IHwpaM$*-K^J9X#mLjx<$>%i4PkFyH0(n6GIunEKhT{@t8mmAd)+=GVPf zznaA+(;$+((D~2jxZ1^VsKF~d7NW4}LEP-rW`8?_X?=yQF7>DL*bc;v)}H7#=r&`D z>5c29-{S7=6`ucyi@*0g^0ok8L67=}#Z>ku2El$iZ>Vb+j6E&?V&>a*wCS)#C`xf~ zi^-?AUg+@K`Cv5;UZKVQeCCjH6XHXo>-~@MxW|5Lr{EPz^7Q9++Sk|dPKGVuCUlHi z!Kb!Y{p~#L+F4)WU(BoaO)<_JRflS`U9~f-oeqC9FIgL)lKdC*hV{Z;XVA6}l%!$u z9BebI_P?K56|G%}UC{pV{5rJurxSREqYAD4>eHJa4u8WBwPDW5e=)a87oz2^Z8O6O zcgrKSE`|L4DOC7;G*ueZmMRUC=Vsz)So z+)M<1)x5>qC^F-QWa`M2GL-?ddL(x6(skn)!^hmRLhJbNxg?Z6tzdYu_^)wCyenL=C=<#=VZ%Z! z&gaZUZGPmXIl?+s)iAF}3<8GmoMExkdGNO0!bn7Mc)0K4(3KDETkN3L|GmdjJq%JY zvf(9{=N(G>Q`SSB86Ht(o*(^Cac3&uMdsPzVjWh33-2c%I=BB}CXqbsC;@tMsns9g8Yzji?`EyU*>fdOXC{- zSAE(j6+hxKf?=cPw9Nn^*+>54eLu)otJyTla6ZT0!MLm)hk{gCsPaCqnXTvo?+yA+ z;n6vlhd6}wT}7UdLe!Yhu#^Gjm2tT_&Z08}1i=JkN|)D76@kGoQ$DLq_;-C1#2@xe zAitW$&Fq|L2;&yN3O2K|O0>dox=57dXvGcPq^~X?V7K|-HQPr9g7tJH5tI(=-R-b{ zp2gX1tciu9!3s+wh9RSK22wh-W&VF)c9Rz`JA1Fk*5hg3lF?@FRoqhn5oX|-{&HsE zph^ff8H}o#Ft#fye%{STEsL0P;>gOLHh4n^5ecExQCiPo)EuO10MzY z9vZ1Y=1j-IEA*kmvMeYw=D;Kt0fdD8x z7C>hq?-|MiqzdbRqamH?lZ|@=6`aetJzq*%CA4mEyfj*862UDJl_sao_JK?eR_zh! zq`P-l;S)1i{Nfbpk%6LW;%gli(T0C0uyq8-k6gsWdz?L+5=yT1y|VH1+crN0oQBH zaeB|@SzGvioXzv=Su~&e>_46{dted|1z1@6EUBJ$667wSx{Y+r)r8Qk=mMD|!4ofBN`CfBKi&Wy2i~)R^%|7sS0D?TKL3 z8&7@IZbPFS$5H|&JkXXX&lnN*HdE}_K>_~_`___43(nJIGe3vjAl@&zBmk^8`+x!I z5ub{U1$>#pNo;Utko3Iu0U5DSyytvS>Xf^`#h%K=(?yr^2-&K{fq z1peo&U6`(inQ-9Oda6nNs)+HRYn z=E6KGvrkMfVBY)l)Qy;;V0L(hd)@k|MaJ@lFJQV&mXTR)X=0c@fb>g`a~WC9>KOdp z_XUVQ{JsG4*Y8J7kKo`$Mi{ktAaNirl)`}Hew{U!^I*XXbzlJNK$#IYDp^M`Pv#iz zNkHeh_m%(D7pmOdkzXk0WbjoMci2@poW*44?~n2+geS>+;MEX|#1+`<%aJMS+D>on zU!i`~+7viOvR8<(;%DE@I(8UWPAdle-8ZSKDk;oQzIaWdsF`X4Ks7w>1AVDoY9NVg zp!0AxEA8V57p@wYs_eiMONEId-4@J+M-+i%G9-@YO9%N);nKJIIpBXoG@ zNRDs|G}2#^L6`XW;pqobe>TlRlXvzQL-AfR3${O3J2*CU$zq-rQ7h4VRu}jc&;K^7 zt5SD)+enB1Z4T8}UIqUnubRXsJ0J=E!?zNu&N60luhssp&@eJkk51Y|aF{Q})$m_m zFjY_$>l|>Mw1drGYMi(A?t<96HJF0fi2KJQi=AP^Su#~DVIw;@z{4R!-W9xTF zKX?Ti$Hy1O|>K)&|QnIfPEtr}0=(*EY#RKPSozD>3GnyyXHa5)_t z=T1*caq^^hpAB!7mN=!kahO78ArW0xZma%Uc<|peaK|o>6DNEFtd7uHPtJ=j1?kwDu*vdt{H(zv+=3&RA9G-}@PR_@b?Ij7zEg%vlwN z9b4DHz6+6citzSN8$@|0ISUEx|4Shw* z-CH*bRqTrl-QUc1+OXWb_7U&NpW?};k9d;hh5BJm&YVZ+otWh)!q}pi-aVf--8r=J z?o|MR`TF4tjds>SFl5$maBMTS+VCruUUi*Vf6q9_YCridMl1ghdvDg{x{ZX1{*{S& zDq9l@U+!t{ZckrVH-__qr+b<46u2aS%u z*Zle4$MOD`d9a=c+6?0-x6_wj2OM?G<@k?x2fpqRulDB*^-u40=N!P-aT5&ARWbg! zhw@2G+kM3e07*f(=7bSSUuhKkoI_zMq-ALsedUV-e8hY2y8NksEC);1pNBrE^mX8rJk-_)4|jBvW-ha4dG z$L6Bg!c0ik{n*F)$;S47X=6>J{kn^80*?6a@g2f_{F7V;xG+xt%CiApTQLuGT1!}f zB?apmPxbPZXY}^Td!HNae)}ACKg0Wu{>b^@e)dk}@azxm;ck^y3V*?a-@ozTxM`(~ z{*$wh@7S@}!}zV6e~Kkv)BZ&}*M&;RN%+JP+@<`pHhQc6lRcAP*V2DjbNO%TeEjLY z!=Kgp_&e@?{p4Po3yA)s-u?NW$&WSk_xnA__9@aBkLR}8c}|r?0>)h)@~y+*+!FN& zd-$6RcctF`ZGE%k@*mbWd;iPcv(RhK4c#LF$2SqNMLx|E>#`yEyvP+rQkq`YJ)BKp z6y%oH*{3pPsg=zDyc(tji;3~6le64`jVB-}_=d+gs4#GGLa?;TRfpdw<=5JHPKKn6;3#z#c5! zSKi(Dn!hj={^DGp3K2XPe&+yf0OcA8=AM4SX&brwmEU+Bu?N;T9CULhk)Q6o2HJVW z>9|Cf6~ZwBFf5*W=bOOs$n-fwT)GLm*$@2U4BLRw;eaCYx_+uBeBB$p8ehDy`-vAW zWqDz}{gJ-l=D8pdMb`hGzw~q6B5xlgShKaey?v;3-w&u^X%+4&x}Fe1aUcqGfG(FV z&1b@zXno#sT-15cizy7JJbPXqXgq%6MjsMd9E%$OSINICyt?Dsvj~^l_&~q=sVCp} zThV_%A3&ivZ?xZQL-}vU^!#uYj~8|ETWG8@e!qH9dcN6i5B`|Tc+(IDo)=~1&dag6 zt%1Pys7BD^R==ux zlY{x`?6U6rgZrYQUwaX@R`g_jH=9zgi}^NRUYoMsem#F8`X6}$RN^KYo@{^R8aEA( zz4;3835!c>#|NK(=kpe~&W#zflpv|l{+fF-EJUy`w@oj~&F>%gy;0h4lC#{s2B{STc zJ?tT526*O9Z+7@XJm{PEP~?cA%6+*>(_^`|Y{X`5dOcW_)W&bW1i+z5bz!)RzhiA< zeq}lEQqQ%T_{j<`+92OF7WKE}peE&ZDaTvrOc>GR#=q8Dhpc+}vFD2sO9AZAmu-JU z5E|`q+Re;PUyaJ^^bD9S!+ouLx{Qy{{h?26GgA~h7HJu0p7a-{RL^E-=&`z#(e@^^ zr_rp!zs0?JKgGRH+Dz>ZcCa1(G?Kj$uaUGkrDDk5~% zr(btZ7Pl;ay9eO^T9aV*RJMDq&riIJ9)4>26rclPFnfjVFp z2WD<>({Jaw0{T@_!B|h}y7&2K4{c;qLc`gJ{=zl!bst2X_c{)?d)6pUA6mVyeA>E&3Oe!tqJ}`NSipm$i<89f$jJN$pNEauVYijsb!Dtzlk%5+<0zrZ|u!Hjg0R-ufLA5eG(&%jnDu5Jl%}$3^&W!QaoW5 zrHCK<6VqSD@J6_9{ui<4=KGQX2lW-7x{rs)f5-d(WgPV~=N}XLU&IJ|j*N%bLyV`+ zAI0ypJ?t-IC1$XIA>a)E)Ap(N1DH_sjfr-buO|!d4=lz*Sv>IJzt6V!t8lYajT1XlF*RP?DWY2y7ztv`jzBqY}Z@Cz&Zg zGyEm*yr*8HvC)=Li~!vkX*+%k#z8h)ZAAC5=+=(^~a0C}ND&t6^p0TJ3K>Dja{ia<~vf{S6Aq(-ytNWQilzFgPx#O{j! z()qLW@zlJnB?(bt-P!*4oGCwiQ>Bg#U9rnDxg|IG;Z@JWv zk+zoQ>AYajHKfzmZ!8cdK0-}3&X14JZ`#)10F}1FTu~9V*L8};lvw%7>HAL!Hb{s* zsi6k?ldVfOdw?lw#6BXOW{13Ki4V-i-)Z1N-8!?&5Cm|RC}-|Uc}lQ>lcURPPf478 z$`<}W(&8L3ZYB^(yN;fGPYbc5cfxuD-_a7k=Wt#P?!uB}_#6i*xlvLA-8rJ?Nk=?- zIZFzT9j%=ln3bpn;}11prDSJKh=}90<8*I*dPBk;1YOp~yzh?<{14h;C`l3Px>}b% z#ML(8kGR^?C<$G2%R55${O*WVp?H0gSeBuR`k&vm91wF01MAu-8fQgZa_6XItbx9j za^UVPl$!N9)ChfWpL|5MNx8!di|)cuez)InR`=YfByqg9antPS%7L>n*|U_N!%o6c zUE`l!mz^Xat+<}#0+*dkYdSvP5$!G>pb1B3$ixU-S#ZW~(hHj5lQeleHoRFanIRIB z;a_g%Hm7~)*OFk-g}Hd^g?^nj=RRihNjJrB{ReWQN4?01yA7Pf0G<9yzwaCarXk=D zN9;BiXUF@UcAN)iUAgSHXT6>zk}8MU^Xwsq$$bjv2%42Pg}p+LPb@`7K|F1L^HCT+ zS2KR!R_IBz$_k5H0i5&t7 zGfMm8#m*2id09*7&veii2&2>E1)IzB6MtJUJOMMd@;Izw#_@ihA8;^#=)@LITE_ZybdW}5Kx*hp?N8$95Y#7w|z6kM&Wx|jr6B)W@@VcoG%)A^K zp7QWbO)ibYpYv=O(x{uiF8*!I&$=RE0=q*7{5tu0z?!Rz;q+}csjxnRaJ7)|mSK4G z96B#)MgwW^JWgBk1_O`106WdAN=S+{L%T%~M->N^UL5kk`Do49;c^Z(y7YA1jJsui}nnd7ej{4=>6}!|cMc*%{}} z%{dQ7HDD%D9y#eoFz9pa4SLhlajFHAk{TgKhG%HCr1#75k&iN--{*Bx0{8Kg#X0ST-#U~oWuScfUOBUoEy zI1Vd?k=tbc@Dt)_3me~=`$Y@%c+f8|YMMXtH;@4`u3G0xk;JYM z2~40=WZnE};uGJ&om2#6o}K&JC^y43>CStRu_M9F=hK{Jt~X&c(`(rUPS>tq0m4}E zd9HP0e&sBDLJvDP6K%Kr1xy-Dhj>|`kBe-?u#CKR&sF{S(WRH#_gu+NHsSt6d~Wwr zQ+j#4R$ewWObok!K)2?l)(GPo7gM^&Pct-2+q+D-)4Jv1g8b(_zHp#JdWo&`>=|T>1%_+5Bv>`{UIbGmp^K z?#|aFQ0dv7u1OTUOZ;M8EM#!Y`Zk95s!Im!g*DxQhV*^qLgVBnCB9lUEe))B11_=N z!c&S$adPiKi8E z+xDnGZF#)E6*?w+EPmlyZzPSE<)XakgO%DZqF;i`nG<3M@3?z8T4c#3$`Rl9Rs}L=#B8D)UoPRL}_;gi>MIrWuNM-`ZtNVREzh4tQN2nZmSDfrE zb{zT8@Cdmw%ICW!E|)l8Dq@FJH>pIc&Hk+&;w3(kNPKhBdyIH@GTa=>Joyew7V~a`~@5jc}fHKq;tL3KdhuLFo<3=8GT)Dv!b)E_NAhl<4#`+9}I?*YoCR|SSsfTE{D~f(k-O8>~T@<6HR9id0J{R9jJD{J=4i3 z*+hQx2>&YUKE4osK_nJl8+us5n}iZ!aE;-0KrT32TEJvz_fsS?m^Cv zEAYm1aOn>l?$+1bVbtmQcN4DGa7^ad2ez1IqgGVP9(NfhUZL54=PNw2XhyeWI4>lW z(0F#Ej)>f&w^5I&$07r5Zi;BY@e`YsVM|v1z)#ZV(=vmqwkTPVK^pe zcrkYxDuBOFN802+wR{P8-4fW2ip&0v&GtM~^g-^40L*S#(;0tBE#LKNn1 zjD3SdG{8bBGpC-y=;QWge4D2uA%o{<&Q;j8Ql=`gJJ|CRj48De@oQ3{92j-I0^r@7 zc*SBdl4j*nWXdPY^k^wJskHCsv?pL*=D<>!)LMMORH?9tl@aqSZ^GNAW5#?!buNdpik5&^Q%r;rj0@cIZpK`*e$E7!u{ zp&O$;MX7MdhPyKDgx`=LL1YDm1a%`j-K%ifd1aegWrm8^pIpxuuUlppnoif*DlU+O z*L-J!K($uUTpCt;`u5_ z^jV+Pl!QEH+gGE5Y|p`8=0yZt5gP{$w1@EA`*Ts$ZiczyT-)EG&0>AteDYDb>)oZl zRH?v4&#~kMQa7hid8t~jZJGO^uiV{;V~uf_15o~Za<<}@l<02t1<>S0?H>|HGu5d= zmd&=UwK_L|>o?-A8i^x{#cnW}1udzi8#`|xw^r_Lf{JBrg`Xn+A~G_Pohr8tPnxuP z#B#k;CTFi>D3U^8F`$yG%*Nua>(!`kuEa^RQ)3LwmX)f9uOkckI`8jzGeijZC=QQ} zzsU&^-`R9-x4SasWZC<0^O9bOOV45vtZA~-5lJg}$Vnf;IX7_$HMKcjJsj{o`3U$Q1^0V(+>Ng=<$zrOhGUkU8ze}#W< z1-$5&d01vKnxlXI(o|h$E^VBR(_gfYBJ9sC{q%u<{>k_L@@eFs-(U9&{Pp6OpTF<> ziJJbCM01iwX#5{EP_KUw2^Ie%jv4eH8Iv$987FAMpuhGTy#1FkE2_Tx`>s;d&prLa zCqOU8s;IiCaew;ffBpjl;`p-%zx+N0Dd_nBTeVSUVO<1Ta35Et7S=qR z3O?z%MCEd|@VKN`g_5cQ<=`$y!EXi6RQ%S-fMLn)tHA0|eT~WO{_FEzDw009R@CAA z`hL*fo8J_nOiFcmiDl!j6XtM`!+rP9EG>!S9rj`V+9!vj9FFj7$C4^fxX14Fx;-H6 z`dgm`$GRK5lZM9c?}uED@JeUl3jgLJ$JiaQ>f|ctUpYnKl&upuu8-dB{-aM{V@$3) zp$KkRUd{fvX%Q_o?r(iom8-z@S>Jxftd|>+<+m4uFMnr~3(R-Xf5!tVz2G8Rv1oUKHyG&=9TGHfMIW zac*E}KyZ>I5b3pcH;B&j5Qf@whHM*VpxlgLxHfOo1kV@@`#A;``I=k&BN9#uy6NWw zhtUTXvjnuTZ&G{gmL%LAhvx;XIv_xos@d{@ zLw~@8Pm=}h!!-;a@{+CaIxRAHz&2{L<9qEY7#=Pd<)drHLMOD-@dKc%c85~P#ZSk^ z?N%%_x2Lje#WvVeUyaEIP5P%gTOa+~=yd()#2a8+3WxJ(^2P9^PuVf{7y29qr6~~m zDUR<1R^Z{JO4$F5Mqf7REfyr z6=j+0<&#*?hv`?>tuq9N&{-;rTHrii3-L1;uNcPcTl4_D4(74`aXF0xGMDUQAgfh?poMNtRsOV7)#8$bh<;o!b>I+1zw(*^7nP<}6#x)PcBNn95Jad2vH} zwd0$3Sz9qPfiW5vzGpXUdWmP_C=OM$NG=shscJTyXMht@XX_@nHWm0vDkCCIIlM%$ zV=q07G4x_3UXIM9G$NjPNHPS)94C!=0fdL)j1N1RI=Za*t5;R1Cd2uI@al7^chYkd zamH9+w~n4*#O+3e@fHaDlo5o?opPCq9Ey}ZZ>mzQ?1vc2LU{7Bdv~roFG1Ub+C$Y3 zS0y^v03!Wb$VH7NA^HNx6r>fG7LNvmg{e$|C%`}O$Blz9(iY&P{AH`T7j08$c< zCq$pNK-wDMH<-CBiF04`EQ_G@ zYQee>zmFA=AEfq9L}Z}QauOnw@QkP8mLi|A-q{RUH$}Pimyi9I$VXl|vvK1Ts(x|O z&B|n6QhXSWP;AMq&00-P5|hAM3z&;54I^!`8EtBnEypqPB6W+oVYSBwFohB4sOl*& z+iX6x`@3D*3{dH?|vlTI*~%R327TYs=q4w`MA{ z64PC9Ib0$O0TTV0My9&MAk09ERGLIqoJ&qdj$G=Glu23Q>frqOMSKfSTU;gb{ zU_8>-fkq}wzUX*53oYe~jm8_v4#S8+q!%*s zkWQBpu5I|+cb^V<=LX(5H1$Xg9JVQJeAtdq5)XJpsHY7iU&n6Z70;mZFJ}aSLEuC) z)u%ZqC>vY1`;gvC4JKa9kFj=6%~_2ka&gBF{dyyp;GJ4+`+njhgj7e#&%4a%3w7FZ z$p7rWtLe$#iz;{|^RrDl--`%O^Q`VXZ)Z#nX}aMr*z|8c3H(zhh-;eDxJf?~*ydo^ zB*A7g!jwYcJQNOB}VqHZe3OTEsicf$rP zV}RsRj`o6jNf5VfW)5b^h=@13!#}pq;nN)YzR%n?OuC(#?L3Sim?jk=q>AHQmD9L_ zQ`>G+J3<&&W)kd4WrQ_+nsd6u4WM@7G~LXNkB1|BMPv8%pTiBu(Z|Yrp;LZWB9Q9 zU|Lma`!P=LVc5mp06d#9v_c8zBS@k+hjRRF_fux$5wm$k$V3%0Td&5zJ@u~GCMB=a zM6AoRxzQQ}5!u!UO^5s@JM&9+uZMA^3r0bWpTGAmNK&=}Cxx}x!>KF;X`2FI4C}Lj zQc7R*T1jFi1wufi%)kpJc+3ZqT5w--xpIV{7XtalSNH{1moQt${5Gx*K$!O^UikhWM4gd=f(ke%}Z}U9eiUT8L~yUa0|K7_5OKo=V{ zBlhXTirl0Bp0@E4f zfJti2C0mx|>@CIsz1eZtTrj0Q!`YbY8(fcaw*dvHBJ-~AGXI(9sJMRhS3=UYb9rF6yPc9G1ICotc6MT}6leJ( z@>XT_CBk4JLg_$}rjf)JvC(AsfNGHNtOC%h!)%qUULUxke1t|vK2tfi&Uj|n%sH!d zUEl94!%!4D&e_S*0(t6}p#^qo)N{*-aZ2E#`(;l}Q95D56kZ z@;+S0>w_k%;f2LvErg0nz_87W6E2ocH5c0J2m+fv8X69AenX?d39atd&$;p#ar!Y{ zs(tGL`W}Ie9Z41<-?~1&dvDoQ@@>b0ELFNP6m2~lU@b>?rG*5*I2(WZo(EHMmw@c~x+`C~bw#r^9Vqi~rb@F(z@>bbdoLBn?;Rl%Syq+hc1Trz^2K4+J|yrj zk0nAF^y+{*bXrd+VPX7}AW5{_TC^?0$SfsV(+GDtE;WtOosX&b;L^ES5SUc++H@eGrhLXzikNEUMrscL9ok-?_B z>HwXQ62=0Om^!#KLgqZkWHnJhMAN*{$bkUMRhQedKK&fBI4=-je{%)@a<@dCjj}8oEUF9mDduhU4OzJs*KWB0Dt=l zftR@Qp)l{lcZy&}R?R%Ulbo>AhkHW-t}$J@;&!O1(<_FXOJ6)*;M==IriP?etY713V-Lv_J-R}!Tk;G^5*wpuJ z58!PGfM%+z;A#E0&sy%!g4hCNK3?y~T=80nH@7-6kG(lc;t38DE?Cg@w|iiff(DGOQ3 z_$1Cayg35Dm_=ga!T!n^6^@exP{DmC>C+JF!ehZ&xBMQoucWnqN@B*W5C1>%K4!?<8Cb zqrv0)s(?lEcn&9qZs*fQm2S4NyJ;TF6hSxZ28OBOR}>-4~T!fxwe{{h;GbIB$&TStkrotbf#0Bm6g~)kY0q=^ZJs#;dKQV zaOyvUD}dY69Zr=kndM|6QN-60@mpp%`p)g^N;_t5nK6FUm-3X3{3ID{s(25OUZWHf z@Z8zpFfK7t>>;gIFrG(Zh|ur>hhYTR9wPIAgGnIZkVtYL_I)p3vVZqYxF9lHE-q5< z+P~{tQ02Xy#tMqU_eGdzqg?0vMJBx(`=^?3rz? zDxJHM33szH#V^ZHGJV9>n*+k%D143Gb;0p&)W`nDMy6b$Qu1YkH1HG7&*Slok2JK$ z-53qZvrSr?TNFh+VBm$l%#F7u*R+lTV!FLwc;$X!2;> z{G{XN1j0kuq{x?^+sf(w(7jTA5HPbv_HjO0=#J1c1B+2$aI?#G&~Lt$15PG`Se7{G z@d2oJMJ3N(w6-iZTMWY`Z@<(z@q7OlU%WEdy?WU1-FQzjmV~jOMWF&uER!3Iv?wV3 z_JRG3F0Pqrn+6triMSE4Iiow?m4_di+`_A8JUl%7E~fU}(rHw4K#2|89=Vcum`x@% z2^X0ByjE{YVqs`7+24J%)?uUPb$BcaxJ}bB05kv*hxVqsMil~G8Vs)R^Sy9HT{&6P zv_ruCL_4~qTUz_H4t;Ti3j7p-mIG^g8Fr8{FjH$OWgahO>9yCS$Ewtd`x zJn|^aSDb1+FmFv=a!=-Z0t=|Ln?gLVb_CZV^Gsj}ZN(y{iDJXlrux({(cAmIizbet zU{*wVLB8YKuF$gb#mz|Y6PwtEItP>}Li$wYqKG;7B-V-X@3$3zS<&4#L^dp1NkUzci2<*vmqWqroyNdC4yy^>%f zz;Rchca(U+Xz$9N5ITzsL&gTPqs#&j2=x+57gOVhm)gbj@yCyQ27Gpea6aeg28Qu9 zG?UhcQfAx%eu`(sU$*$%05&uj8nI|7f97kC4MQP&EVddFA?I?xC==k6RL?hdyYOboYD#<%ZRDRtX_=z>~up(_R%AfL!#D;Tvw^iA6LYVzgG|Ki9! z;n;#C{JID5QdQ37Ht7^07)~0-FdF453)Fa|6vPwjeTp}0Ax}@dKFMGAmKrYP1-|$d z7rXqWxQK#TRl@q~-iad^5?JdVeX)1o#er?D(+9F&SQEek(Rp{{Zt*|%ENYkE`1?_Z zl$L(MeYKIzvah~<9Po0L2@sn3G!Snnscc`Xe)P`eqNz!^pKoMY%yuJYvViw)~j1heCMX=3u zy}w?_2g}s%NZn*A;;#NnHt+^0ZQTR>^!4mu#N+wSxa$+njP~()_5v{U1Lp$86t?C9 z)`ZYBbFH}_*^}J;tDmjDZ`1SKdzBlW1aa7RFlNiSa?WS6%0vRd@fAv_LyMiV%W4&f z6n!mr37KQ`9&ulDI`@q#o$vA>Db2SZXw5%mfC(ve;25h*7IJ)Dz?AUYcYiGD80+$> zHfLkQY;cvWQ-Rq8f0HIL)GjW7IVA;BmxW6%d;wvRAWB^{9ueUfV&O3{=NLS9*n%y9 zVL6-(@X|25FZruKS~0rUR(y3V14R=RE!6XQFC_q{G7)GblwEnO-cm{B1JJy%zphbA zai#O6OG2979HeyvfQkgiCtd+#91qhTtjB!=LQ$@f5$sQP2VV?ELwS@gbE;FQNpm^? zz3<#Ai3+1`*ImlFIS@nx_>&z$O8Rnte#`5v-$hcJQdU?pnFsWZafza+ z53H#{#iAd-M!2(FrI&xqWj%GGLIsryeBnL5h=?wZSN`7m{Q;Kp#=nsL7MZh_oyRJF z_W3?&J2Dx@@~-^_Ko33DuW?z*6(VlZWwYACZZ{Q&UyoW*a!K**JOB_ z>UO-x03qqlyy*p)4Ym2~U&XJ7Vb(B{l7rn_YZ>|%hUJ@)4>YB5ydQe_Hde^vf}})9 z@-YP&a?pUF0F%jcC*(@Nf>;7Y)6CTM^NgQCsFd>dJpleb-zsTrj`O-k?_eU463L5= z&2U-I^_x;zi6;;_AowavRO$n3uxrj%8HQx^F7x^uEdH;(OZ@im98S{w5vU4(d&pa4 zr5E9~oX2I^MY~qXj@SxjsaBFUgiNlqF(>V8Z_5qq z*uCu-`Bah2Fii-C*0m+@1di8&;gfS1Px~ztu3db_<{Ec=9Jw$RmUvg(<9%(21#ubI zdrQ!#B$V~a3NUGw=W)1Q9bD(J^a1e=@u)PW&Il;5JAg}cgl4(>%7C*~b zoM!Xo6ODN=__ajy=Q$X{d+CL8A?GfBTU-?^G!VNFnVAGoT}8&whxE>YBD`j}5`%Y~ z0YTc%*SCfhhDWlHzd8qW(Rsp7hS!HC%=hapU6D zyfX8Cjo;3rLIDpAbCYhY!Z;FpwvDxIFg$)Dp1I;!O^>hO(rF6k;GqVq4=Ae!$>pBr)ZWGZY|kq((ry83qjxgvAg4s0|w zahG8MyAgTTxm?vMG*WfW>te$nxw@o1Nb9tE?gE^R-&22f15=1ZrHxeW# z^4gx2)Q(N}8oyPS!cch}>0K?osgg33aX6E=l)=rG2Y~qm?*}mOwg+pJSB8CIFTk&# z<*X(b3zP3o{piIzLYb#CTd35dS4H(?zxC_Xz0YFKXz4rI>tHn8UKKTRuY%ECuy&Gs z@lALD0)38+DrerzVGpbmtv7$29!GA6ziM>B!|GKVS|fX%#yk`lP~T=AZi1_k)PO^izmcrdmKgU`E!G{EZwqa zCb1=ilkAdV@^)sWTl2oC5JB-0bArk3hK?EG;oZkt&D{G%H1W7YUAuR|f*I}wj}W+1 z#S@!~WS559LGdXj(4#H#1LaWhYdctB`&Ey*=<8r=DEEK?*nY`z1DkUHF?pJ0EA<S8)gLml3M zh>NliWlGE+6&H7d#xE-V%f(298}LqjPl@MqI2`=l?6pXF;EP|xC|7s;m=*s1`#2q|Z+b%LCkL^oamX z35W;Diftoz08&IoD66nNd=e~uBl3(WpRY+S#&Q-uVQ0{*%Xk%}eTpE=YuY~J=gU2? zH0*&=GU*nIcgZoQmF@D@@_<3@UIo>Mw|#JR4Ri0%?oI-o0#zgN5vArw;{!ydR=(~w zF97G>k8oJ-^T0hivvx2c8BuyO2JO!8@-w|0&Nw3GSv%ME3cpK3%E@iHJ~netn|K~Y zrD&`VZc>Pg2oz;lSEYS9I1KZxg|Ew%W}yK9wCUwuPGxQ`o~Uty`N1S_Leut2X|u=J zwb6~ATaRD0!Ag z7O^a7iOO^8$-sl0G(m9=iir`oKf!cXMR7u$Qr z+z4mw_C#Of_nhfOeDN7It(jMpiZ`cthje@MgK%W84Sm*ra~t%Utn;gqTYMgVfSkRl ztz@psshjgGRD*_Z?*q`SGMnF47`-3oX=vgzrHtDpbJ~6007Ps0w{q)J_tnOaeD{qo z4*q|}-ecKOU|Sn}AO^w;G{l4O-pugcd!D}0u5<4FyE{6f2URfSw9~t!wkIRLaxg=k@$~x5Zfd*)t0s#snaj-a>b7~ul&9StQL#~u43xJOmrX>qlx4-2hkZld<(LaO_pnp{9a&`LzQ|bJ zh}%8iMC5kB?;V}bx?qi27TU6_O9JqV!u;)LPp~}5wzRs^I}#h&UhB-@58JU6nkC2x z1UvtUjH%tXQ){X+X`Y3!m*V!sv5CNMznNYK@1XHdldklq5V`U%Utyk+&Z}3EduaqC zf51(JG@*vRWUBBlPz1ci+ZAXUeaWpDwEYY?3B`6MHSgCP8DiHmSpiuX)l?O@pReN0}(rY-b z7njxC&ePhSU)-mNK)7=T!s>B-kJ#s9^qL(3c440ZnEQ3aYik4l>ed=py%KBC4dMJx=C#11V1C?<1hI(KUliCr2kZ%>*bfuB~*S08IEK`d*{&yVC-CF{c*|dAl6=UChzTz3P z_1N3EN8+WdR@TkbI~e*aMeWDL2IFAj*)6TPvDTZEklYJmkL88jeEQ&kp#ti9;~x-+KAY-+Lnsle-?ak-nB* zbCe}{(){g6u~QAP-O_4NLY-hRA#oSu+6}gB7$ObZ7yv4)#(hRz0mPQF&=ib+o;wYU z;R+fBZoC#nG5ccoE9cS!cdac;*urG4ho}wX(?0FR`44FcR+lEv;K*@$KKA!eRTx0n z<;CdELj4S9cGAuF(w||E?!u{M^>}*=wLlCZwbV*Wo&jWtIgj=cl!RjK>0k@GHBB8J zooJh(+26sN);^%#(Zqg2RJEasbj#7o&>mxTT+AlgOhAu8mTn}bZ)Zdz<+{ft*1@GT4k*LTLt^5Nt+?xOKd!vI z>>uws1mvir!@>SwkhcjrYj)n`8C}N-G15Y$?Latsz`}E6Sps4uCc5$vmcKoagEDQ# ze$U0KNuF4{RqR_$o#EZyrD3?JT@Q4Xn#cfdyzJzF;wUYhbe#X?mpJX`-LawVO#Ie) zQ39EV$9vAVA8cCL!dMSymX-SyUFMmi2=oIaJ2(dFxezBHe<(UcfDX;%&+q;fg<_DS z8N;&-`LEzWh}UZ)%3Ia)DNiZVKB1_18VZH}S10Nc?w574v+yDQd>OM7x3254=W_c? z^~(NV{`?Npb7B2HlR?H!0`Fhin%4O4cDzL zDVJbF6X1?smGj7yhP}Va+}9RE73ihBV|C$|OODIhh$2yno)`#xFXlJA5o*+kZnv@_ zcJ(O=lU%AH0*7R!XH_l|g&3N+p3BSXm3q3d^XbE-mG(0)`SCr_WRXEV0(Llt*7bB& z^A%)@kGww&ho``~O1vyd9a(W0;N2z?18kihy}a>vGwmTYud|U{h6qe*SE!~g%@a9_ zvW3-xIKRQqXohEclC$U#q~jCRlJisji6=C=K5B2zzF9LsktnJG6Q?2)`=kD3LnSL~PU--a2^Sa-IicE?zo9h6@ zak=_!r)8MYiV@repZ~A3G3Y+-y{;Ke*|6ugw&OjdP+t4fud}b?#UcQ#MgTp{r=CYZ zn>+Cu*Rtem5Os$^=uls?Im0*X6C0jkIGgM9xOz|B(v=o&{U*TX3N^{qX61S(VN5|) zX~Tinpc+bq<~M%=?$HC2v1n=jIk{s8B{MFU5K{LKNVW7cNQM#bVvPLWIvOUh<1Hm~ z;f*-wWner4Sm|tOu%#D6B8+^u^El6ARTdmOB~q?jUFHdTUdhMnf+hyD&X%zng-l*p zp_2#8=phCO`eQ}KGp?mUJzl2-JISNXBpIgRcr7QYCD3OI7el2;SgxwmMm)A=)P1>( zqJ2rn7Bo{ekLg!TJ`AlhkBFui_1Ms&qsW6#w!F205Hj`_re1#c_1|rEBoF7Y+^ux= z_YIS9Yk4>T1XZpJGIqrkYLsrvpBum`KvnMVg-mtJk*^w#z)oXqv@J~>|q zkYdq?B1ZI8LY8Knue0M2?jsb=XL!miQR>{#G}3+=$DNk02(xeTQ1oPnP-z(U@oE-F zxLd~H8}v*1yN27EgHw4-_>%O1GGm6k>e9#*f^Q_8_&S2BQ*dK1gY++kaOHa{T^lB%I_zPB(Q#I1=SL)CJKAHcWzds?<*)5x%dgehV+cjzuh9|6VB(3* zXq}H3{%ld73EpQS{yqy=kvg8AqU%5>mC!Fn_C`;dPo0`w^CUP_Jef^*$W`Fw+F$m^ z2?N0)o~5v5ilqi<)bebP%)y7uV+CLT$)Ww*xBPkj$MH%5k4NZl51Z1VlKN)h<4^s-3cdKkd0CN_e|hOD))&Iwz^i!RG7jEia4c_b4CjBx2yhZ%enl1lJD1la$*gW z{yXy^9B@&2T3uV##;{6-urpSGM&iZ7uc#W}jD?zYd`ZjhTl~%^xd$K>hdG_W2*Blc zNOt}^A0WTCYmT5|X+Q5piHGtY-F~A9jchs--2&tkAv7E&TU;XN-&x#$_DZm6hzF&6 zOtv8xmZH5&AMe#%AnhV>`um_sj-?4h$&dP9K5i)#iz$a6r#-a&+dY8d%%db;h&A+Y$1``CWJMBKi zwhQCE)k&CQf9Iv*e{#_Y7E9*`BKcNh|L1I)JN}K`HZt^axCkg=pp;aFU%V*gDE^Zh z&ktJhFFuB3BLDWZ1y=YxvwHp-`^yt(tS1QnofVdnh(kp1Ev=jR8sEP>J@W6{ti6=A zXv=59UrBQn2hIds=i~dyzEBVnD)m{(;=i-4+DO07sYt@A2uIcY7Mrtp+I$MX{EDA2 z+zVfMgdyC$TzzH|-2Y%>H}`Vdz2Z3he6TdzRRM-W0?5F$lt@!iqjHv>8t5kg6XY?| zrel$06}`wU{&Efw8HOTsW^adMSsG{*Qhu^Tbg9Jq{*Ch>)S2}<+4_D(+bg~?-~(v< z4e2B&^PsZesqxIuSnmT7r>rO@&!91lL(qvP$n=MS_Zj7UDt!BY_iY&L1B}&2dxbD- zx%<9X-8=Q>7U^Fp@bd8%0q|s3uOaoJzi0iHJixcaI@k%EYYIo-Wk)Eh@ zJ~O)H3b!CJ77OHrGIgTOS_pzBqVTlDJ{&x)- zg3izZ^$rqGf7lf7Kesvy5EOsGny*i2*D)_kfsNP-9%Jb|h(`#DKFB=}fBJRH7$c{Q z2X%`gcqtE`kVW8YN&e$X%E|u4+Y-2f{MH}OEBQSczM??P_4>_iD$EBRc|3IGGXPA4 zeD}=kpEgK_;}7p_5g)IpFpB^+Epc#In-p2?%j=Ai@&Ngl*9x-#ath2bqgEDWkBTH2 z@RzI@dm@Jx!CwB&YhnJ&SCDM#!~4#IGadQkT%94WiOKKsr?Q^Uy~=-|yX=q5J4yvI z4gEXgefp6?>WWqR(f-Rd{?D01nX)1M%eNuf|H*GNZBY=F_NOm{1 zD$HwtHm^d6zQ(^Kl}8H5M%A!ZkshVUt3^^Kr#Tc4rwQ6Wt-y>m(-WM@4u54Tz9bWo zM>8h($LmutTKP|>6x2_{eUp;?4y?HSC$D1@?m~IKEB(%{cwhCRXkPw<&!=u=7WIbba>x@JG(rGu+ZcZhyRaS+$Bi9OnK&ocorj<2)|=_}3S4mi;A4 zX!#MX&u8CIeOlJ{8KQq2L_b2;97S>ckv_ZKa{?BCUHo#bFk|@DD|R+=HvWI_REgyC zS>xZDV4qob)PG#_<2GGl|C67P0ZN7ba*Y0Q88^_zznqbFsOb{@-?A{W`N!$Z{ZzvK zyRY=it6E9xKg0FVuA~3&eLF#9kAL%+Wnztj;(zbXu>oYf0bV*eIQ`SiK|M-}B zcqHdb<3H{FVa)O0N(@JDjQ=T1WQl*3Xx6tz5Bb0CeKeT&-+YqF`c?A3W%cDhO?sJ1 z&YQ`9@3<9Y1(ts~6RBc3d13r-S-(oif4Si|ddbcI-dFS*>0f?MmQe-@ zX4=Hs`7{R|L?r;0GgFqL-g3r1f+gDfPd?Kjl`ii zy-v7~1uR<2##TJgmk>l}5eo3;AY^ZD<*xN}cVmUXRp7njCNqO^aoa2Rb-v+k^Ju=! z83#eAc2?l|j8HU>9h#}Xe2#4Qr_gbAcdepPQr8@Fh3R5V0*XvxPZA~1gfLo4HdnnS zmyw>1JI{j>Cj(q#`9FD_Eet34|CKvkyrj`f%V7igj*?I1CN&zqs3BNUvJ+{4LPyMT zT*;kJS@cL)pM5iHktb5$sj525?tjKdJKgvv#KMhFX#!ziw{=dzCv8Ul0~{ z39=dqkl z=aQ?YjA&{>_ys-J^h?OIsP+%xsav}8_Ssap{_S5ffk;Nb_hL>PfA^^ey+|axaiq<5qfc8dIl(UJ|zUkiAL?f+v8Mf&=G-d$DTCikJC za|uruc=U3uP>LUzdWY<*(-R>4{HF}=`zwQeW{Eqkq#}aP+x+iyPF7|4-MzJuafOXc zzfbY_d&bJ&_^3=vQtM8a<^Mi2Wgrvj@3AS5KyI=0batY$iT`=liBLb9#8pYiN7OgJ zC{Vv!B1Ns|8$c_jIcv!GuGpOt3-o4C4u2cioybrl!29`Yy|xRt>la>{5XUh*^1H1< z*u|sQM{XX>=@ZJOi@AeUUQ+hkx3m<7e4}6Pl%G|!2q^`?%2Aj3XQ40jLDY3JB9ifz9WHqVjt^(6r-X z+^hDSB^ID8RE6psL3(URI@|zlccUhtz~M?Po$0Yg-b$pf5dj@twF4v7&hFY$hC)+r;!eav;MFGA5e_~Dx z`mo0evtI1Rw61z%ZKwT}xo3ONxu|Z?1W(Yl(;3Dgk7vobi6q9$luj%O5){ME^Zu;4 zwr&fdKTA>zbWU<#(dYY32VMRkIJBqr^*YcY?15Huyrs*8Ab?1Yk@?-L~Hwz%wGp9t;cxF+yh>ZAn16pC3#l7MhIo%y52Bf*-z zHYR3s0nRbJu;^GOvwu(4818y>yHSA1d7;;84HqZQDEt+^mMliawhA-PPfP~HBRGG| zHHgO}8*57BOKY11pl9W%wq~I3dKy4X_%6B(nQ26l8EbOV`8!Q@70>l8MMRGfzQdKR zk;3*ZQ1W!?KF!{u$PAVV8{u(Z>==#~Ws1L_Xn--!Z#UIk!*sO|%?ys;)r{k_rYFn4 z2ONcp>i+2OR!sy8f1Lof)_eW&wcPyL*M(aH55`HtC_VM~w+{ykyF^rbw?ZLZ=lmW) zOF72@&OE*k0jp?vQ%y%1;L~N*=3$u8_L@G7@D6!0xkVA@3d5A45pLWMwgfO5@m%&z zSM1ug35y>FJ=Jt%cMO`1bh~jEdn{CoG;^9sQZERx+7b7g4lfX;!i?e24+f|B$4pb~ zHR3b>jI)8qcwl}nM44a`uaPzz^GlP`$;u*VrqL-Y51H5khxSleP3kmINA%Zt{;bcjZGx7C{b?zStXaD}@@^UBE3 zqntW_yEjI#^NcRO1il4+n{3WYmJMy>XGyCOkEkmEjRc5)p8&h&o_{xca>kRX`sHvk z?K3~E@_r|7=)~yd`I!;^eGx{KHG^itLFBmg&$*Z0O&(nF zDjgQ4L4i%h^qU-%#r>KKUh-rqyOLIT_L!m(YT1$j&Dk_uINVkiD=KcHk=JVG6si1EfitpEV&Go*Q{-L zlk=?L>XV@wLVM>x*d}>-U!~)d#K6E4d5O-1_?O}(5x9kqCh8Oj@|7BSz^we zn1Ls*YIJRg-P28OKpPqvO2XsN46(C2#^#jxw)_qw(ALClRiQD2ZOsxgDN;iCooD;2 zN7H#HQPf&?Spi6WUp>XUAuWpW27DA&kM~1xjtL8*lgk5V94`S7BEm8TLQVR(w4ozP zf4@A%=lsUz*_P)!1ST(eurfjotG%gR7!xPNiUWO<>?c^w=qiYW3(zOx!g!+sMut(? zuVJm*-uYVh)>(gr9PS=*1TWh;3$h9yy&2f-7cl|s%`0LAMjg5H$al#&hBhhXj?Blp zfRV~W_^=D}yoYr+7y?4b!FGQ(tPZ1puYl(i`(dDBU|2w|-YSr~2x{wtt9hi5!C z>MzIa`#zX=Oq1d~?2FP7@>>uqfrSfKp;VDjQn02IVgmZwFaAT;?dk;Cv2;kG>#^(QH0S`BG=wY7fyuDE~rp$0V-TPI9zJJmO%*m+$?nEQX*R;)OQqIZuU+n`Za}G2hX1NmEPqu z;RIo;<1v}hw$kcXj?NRQI3!)+U+w^oq;G`2Q?`4HMZAa|&;ytT4sMUhc^9v1G6kp7 zAP_W{nO0x3)l@_~^G2s^xh7@8SX(rnH~c9|9DZc--kM83ZN7>e3yS0Yn)~(8f3qpF zvp3vrn0Dm(#lLMVeK3b~Zbgx!Hx%5d1Ehh)Mo6=e z*StNO{tQGnsdw;ut8@#<(NF*2 zl!z2dD~?|nldmZawq}2i_|GfGJ8^|GDsoJ^df!*my1*+a92sl8FnvNX(nO9(C|@ke zLz(KJ4!1pc$GG|h=0*j8OjW-cHzpu1$Bd)|;`B8IX^hs}riW|xtxt<$7jmQ8vp^*J zL{U$=XAdKkH%Ap3FIu#PIQ^D@&MTaU7i)9w<-Ly88(Uc= zgHkNSkcdt*{QC?FC1FV5Q-$z5(u2Z({85@NuU?Hn1Z~1GkVieeKELw5by?Y>h{rZC&zES=H&u;L^bq2jiWCd~3JiJixg`L#(n z_sO*jJl?mRR(G7-W4&eV&FZ0Z*%35DolOd?xp4z%(OS4W&Z{-P&Ryc^C)xcjWgjxn-g*AY zb$r6_wPUDrv-|Yo#p&UQt?MMhiINt7`nPZPXmM3$Hqg};+4hZmqJ-;MUfb&-ir8NE zPF?~+ufXZoS*t7*HIpAal(sW8Emdv@|1quA3*;ZXK^ENNTd4yOyKOd$tr6{y)7SWN z@z3LhfbUmUSM0bCxw++*2kR2mlMymyVT#-2d@T0b$-e*83Nvd;;cIX&$K!!=z3-w{PgZ zrq$R-VbfJ-Rcubb5H+)4px&qEGyl{Rb-cXqeNLGK=#@mTiHaVyp%dW7T!A}y0_`~qS^E3PnU zEEm5<^T0(Y{86{i<)+h}p#=mujQ!mO>1*&ybo&{&Vbe!Ekm6gQGAsn5tN@g z>ok=JrgVLGaH2Pvm?Hugj3G8A0jx(}p?T*6XEWS)={r5=ecpdpZdryN9QyV8Y(DG& zP5w$W-K9rg^l(Kzt+NY~4|u|_VgOS7RbS+z?7s?CK$|Ai@6AyScw212Me&r+mt^x` z?=%m=ezXb&9gh3nuys2?9`^Vt3XeU5>CoDq=|k(tpRyowkZ9`WXicTh?_BtAKRFJS z+_w)ARb0dsv}u;6?M3ckr%i2|iqkt>k8s5GR0yOza1`iZWB>@~ zdjEKdL?W!F)dXb5oo_l{Uh>w{BuPH%*vmVvfw1-%_f76_Vvlk3cShq740#-1|1PEzv^ znM+7i(0r=~YM8Fc7WLLh!0Yw$|eP5QuohU1UA(YL6r z04L6((Ad%7=&({0@Tx6_p*lDN*c2^G5)@0n6Z5yvod8>|U}XkOt}35BcxSqrB>Anu zC-=rS2QJ{KUDGcBfC>;*=4YBZ{=S7r_QE06(}UiHAe_Qmh!OLu-nY#nu7%{@=E&*n zoH%CnFAn~oVs8OdlBT+a4Iq&rW!8+@2g@@g;k05q_UXMYubL*MfN5jYzfs8jInZu zn@XgN_R->)P~A!yTkB-%G@_k1f*_^17v{m;Q$@-=-{K7YWvO7>MJFU8)cnh3@hU;^ zsM1-w?nNN3`Zs3v_}vDszL}JH)Ml?*VQbeJp!Bj_krj-FiH74(S;SNT?`sbT@KiC8 zN8_&1p}@Cm#T0W^UeZVSW1=S~H>W=o5_>2P@CJ-*AnPh&Z^k7#^39wg=+FNxHL_N-AFGY)^4}4#IK5EMsQa_)M zFz1Jgj>I#HZRblFxowt-m+R@&UDp?}Mlv(XUWCV#3LTj!t!5-4ks$EaJ4Eq0NY;UJ`?KdzcDWBfAjAczXgGqMq^S4cRCHmW*%HJ+U)% zDIMsXvb|=*QQm5NYWTQ@xSZ0Hae?54oR!K46%DU1Hhicpqkk_Sf{A`Q^dtaJw%EwH*SqZ`_$v!z1e*_ z*MSj~`ryK~y&CJS$e|7$HG|NEt(bwbFSDAK;QLulMLg2Wj@fJHPk9@HH=ZRd!5C@w z#^1#dkeC~@U{WE%m#gZsK0Dzn!9ic80jJ}4$c(SasH)Jfhes8)?spUQMVo7 z$7^`vDAv!()i$}Zyd>uH8EiF0SwrQi7zm?!>;RAiBXAUjhi9X467u^Szk<14HHPE# z_#h)+Fg7lNQtH2ZgwbbRJ_^sgsCyzDy5ES}+tdwwjF1y!@s@C3vwPtq-v7=+5Bb73 zT|n@l@ln>Hl4D}O0#|KgWUre;q@u!WNPlQe`)-gukI`@g6w*`PKxI5c7;fkX&mL?y zH)bsoRp8AIxeYvGu%VvUFACWMF(IE~lm(>>A_6xFZ1y%hT6J3k>%&& zQy=uyhdlLJ36|bEiO&8&?U>;yoE!x`Vov)Bw_J1vewD7Dmjpr3Ij{9~kIs9Ug>~t3 z|A7nGAD27XOGJjodtLGPM2m1 zof)hR;{MXK^Nbti3F_qAN@p%zj!lqxRZnl6*S9N5;7%(a{S6X1`o=6=$N3ZIx~*pI z$$k8e-)EBgscLyQZ8<&U1fB&!>H>m`D|oZw34WWYtmo!^lH)PUF!fsp9Q+-36Rntb zO}^{wCl^kudk2V|cp^nmJzC$*MVK|-@fl+u=gTk6>?7Nn%FEp(p_al|hQa*em}4IF z!zpQv+(AtSvA!${$lcL=tz(n z1lHY9ENY1eCz?Tgf88Wv+yKaeQn?hEndHURT^~zt=68A zjaS2e`WCYuNHWIcM9mr5Hjx9kR61yenlvg!EBKSYyOm%wRp49%@e%%m2#R9ozqO*` z<^EkEUv}4q5PEz}M17;;CJWA&P2%5%FvS~)=dapBj}NArf_Ygxoa4f{!_pf-!G21E z$@qL1qSe#67I{%t0pw!R`~Hk#;cHap!!!U?K&!ud54uE$1!ypA7A_IUJ8ZNz!R9YU zeU3#OM}U2fOBk*tw~Z=RdkzCiWzF)htDipi`r3Ks0UGKs>`CL~C#K~pZ{MG6Z1+cC zelY9n0LQ1IM(kYEtOFj^HJ0^EO|AAAYw()$%N9N2a!M}=tGzPB8?W{9uBw7*+Ak|v zOW4Wk+gxdPm)~#u42NK&gu~PQUp~`{9vHZ2JguMQqB6i6hY&DPfeC10rhFOwNG1X* z_qKnem_Xgc<*85@lZsG%OC~;n$q!Xr-$M*#`b*uyo>&k|(3A(u8h=C1zKsP#KH4y} zZr(yAeObigC3~1*u6sDzV`C(K3=Kf38}H5g^h)|th;KKg5?kD^(%Z2+3z63%ubf1@ zI8|XZG5V5ZnK!VE0~okpbx;@_OGmE2R~!c3?+Cy@czMpmePDMr^BP&NDxbIRyS@-- z2U#eBzL9$dka?477Y+oZ9*Y@l zTOJmR8IBR#4T0lUsQb4Ga#FxEwz{<6hnV(g#<9$%8u%4-WM{&roQCfeReCjVX#C zBezFDt&n`%k5LapHBqL=%*U|t!Ft$J$SP>|&!hd1FK;C@*g+hZarom+@53;h`TP|7 zE@oe9&nA6y}IS1UC-EK0?&4G4^|{5-@wjQHW%q9z}J`(|Jzr z7*ow4-zqc&cqT|8ZytPY2~-$Oh_aY22XFhMt^w4}904uaNwhDSDI7(&DN1|9R9ZzG zJ-(cv3L`DcfbQ$A6Ra(b3;-w8j#)z%%!b7YN2K}98bXQ&DT{PPLM#E{EDq8acAr#TTfHXcNQ@Sn>R7NoBDuT>_kv$YSSgF4B+WjU!v_X1$WHk#ir2K) zE5fg#-z{+67D$cIAZ12re|n&n@3i)9aFh!P9wzEX!i$uZzOb3@qrW?dqfnL+f){m~ z-3op1PDxZA;A#|w*I%!rU>g$O`|44-GN|W(SF%!=YV{Z#_4lgM4IJCaILF^ZyD2pI zdso_p3P$k0K%Hi+jVG5IFHZD*8J4@Tsb-0d7gLW)CbEa(%y8@CgiioKA~-67(MtYS zjdEe7e@m4i7z2EQyG7>uy`4v#amE3ZXiW(t>e15RGVk|MRKA0-Q8YA&oi>%GJnApC zNRCkf;P;N2K_wHK>3M5Wm|}Ad@JrRaaS~x**0%sKZ5*~>jfJs~w8yo5vX=PQE@M&@ zQmj?!&CPR37leLPU^`*ue&2Q?1bs`kHGJIUPujC>PaN7(<24KK1-taO3yL9u|EDTpN;^%4*Hz%MU=6j6@LQEZR^WhvKXl7y?CV)`Fvh(I(+G zYDXdY>;a^i^@!KUcf+|Si;E_E&foKr{`20y{+0?idIFO&fIK1(U8BjQ4Qq?`PPKlW zJFbNI7eIh2YrB%k8FN($iGct`Y8?Cw7oR(a<=^`O9RdSc)VHV1jVC>?f~1WA>HT~D zHlMy|%hkXr9k-SQ2*0?`qCcxM@%iffmk;fnkAYdf)Uzaz8+gNr^8oT*cHH%n(RuNC z@SHGwqaf2?8?6!Sxs@M+d`A|B`^RrDQUt@AXdoKx;vJuuWP6Z zHZr)%cdG1EgR48!(PPnlth&)ou1({YPivEsfemRUC>!EsM_PEf(A1p00DTfH+poM$ zt-|Jtop|Z*R~jyE z^CZ4>Z<_d(1+`;&Z&{C01ClH~Mv7udZsj)SLUs9L@8sghM|)f+NvvO3z;hq+#Fum0 zpXA{rZpBe0_KhT8I6uiR`n9u{ZEXtngV-~w8{YbAQmQ-_fWt1c@ZL5MRcbUjxre8a@yaOtBgYjha9_$jo z1muPJZ-TKhd41AIi+nl_UAsh zgtZD2&qRBbbz=!E6|4l{q?7QP_*yL9T71gePn>2Zhs~xdv(}L>V{_?4I+9lLG+^>3 ziuYR&g(2jrxg-eux<<5}AWO^Mj{6#imxGiK_eeE_b%%|0-^X&F+%0uAUdI-d7Q>0! z;)G*Ov;YMbH~qkRzH4b_^*v}Fhj(jX3}4it+U0un=^A@?1bwo{OqNJn!XK_a;U)#ISdLaOE4Y{7hEiO6 z~e|A4VB)+O9Zc99_F#&EpnW|ml zLplM}2x=)svoue8$}Ks_WRi*s*hKyn@ddSYIr!4P->*Gm4DJ_&7^6pyqNoTGwDGD< zhajgJc?-v_hZus+qgvHNO7AYNK|Uq{GDO^^u`~4ULh1P`$pnuDlMns`PoKvbx6!!; zQ;;UHr@AaTBGPk*>LhIn%a4BlECzFI5eD8x9-|w`Xc*&#V{A*W5Fo{5$sW0Da(f^k z{zy|{B>QGwEYll?G-w#EF{>jSx1J216drT)Q3rX>3A^rU)(kr31Tjmy>sTF5l@<7* zI&>X6O>m1Z*Ew3AHgx=BQc$6t^Vdhx`oOG_#}#u4|5XSlhW6Fc8oCp^-@zqW3-cpH zE`*jt+mN>p0rfj@cV5%hJP!gF56mu?sUsD4QQrEbN;GM)P|UmIr@FNX9iZY3HY^*5Nt!Z~5I2o@N) zbw3Zb?5hqk^jQ}XX;qZ+)-2ZR{;A}pz1t76y@95xtZ727IrnnI#N@bbZs`_%TyOLG zY{vo4GI0n5S#c~+7*}_*JsAk5O|+hk4p&w{erfCq%wQ;d3;Il)oW29jb~=wJOKBV# z&=*YrOG~wM9*@_%3j5bNX}WW(!O2U^B^C@g!xYzzu`+bbGtNI|)u4d4(%ux;Kcfa6 z)F*SxvH?9gXg;$zBqLZUn-8S{zw`v<_$eZNg-1_a#a{ppX2%_7^Y8OYIfIR#B=uQl zax#P#Ei+qvuy#?OW2hx(vffTywpb@FGgas|J{Wg7n3c!oyo9@q$ErY(AuN*(c06E` zt{(?Z5oki947|kMH08oxfeS#m>1{La0dgj~AnYyl%ymJ|HGtstJMr~S-=$YrJe6IR zW7OK-gtG$xtnMpyaxKr~2VJwY=g^5vPwo$`q+cDQLLT}W8viksqbZdspPIEcz>4Sd z7#qCm=Y4x<6r#4-v-kN$-X}BR^@-JKO&}$@o@K1?#XQ+lt+WL6{URJY57swo>MvvK z{cdv(iOj6{UwMmPPjKOtscsBut&Ct@5yrlB9z?4cwdCZ{rrC>*TkxRbF^4IP~=foIS||=w-e{js&+D%XHAbB40oA)`@@hhuD$+@l@@9VHvk$iVK^C1C&A% zz;sb*%!l;2iAXekp4$MTRHc;8^IA8SFnNo&!f(q%mMs5Rlw4IaK8?kZ1LD|lO{nlA4P8Ws|M+`?7gIkd~E^fhRY8(2h8py5Zv9z z&35iyht(&j47dAs$OV}4%gEvs<)VCyA!41j-3>jW>#R-p3^n(!T#<4mh&@#Q!&`l@ zbjag+N34HT1(_q*rSW-$*WQLRQ2L(viOsCl1fQ>it{(P&2C}+I-LG7qd%UD+{U<4g zXA+7s?zk0&hd8ocn>!0IhN6$oyNSfvA2Tod^ci+V4&-2M zbKU(l0NNp%ZSv5JNNPag4)WQG$5@~|yIRU@I~+GXm0Pu((f1`ySNMn?e6_6wMV2O} zG(0IaWgzi|)wxk%)eMkyMg4joriY>vNH%UQ`5~3B#t2li?FZ}USpDEl4d}^-N{VxW zFqCN4sZL&7?u~}wm4A%oRi_>lZZy;*JOK)`=s)F$rXWp^neG)Nh z!b7D-QrDh_MZ=A;^-%GW!_Dq+TqMsHjuroUk<(lP(yZP9g*E+=Xgm{eifECg5)ik+ z160OLo~pKz%{VLXTiay{DJg}o9K9k)${8aA`os)Ya6rt74ER@i?VmX0a;ams3dfId zKjZrHnH^sjMBq5F_}8AK519<<2L)g1$^Ovz;#^wsWbpyF1cfxAYcCDj9yq+%$?&y? zx+LJ_+u8`2vW&Xdd(F5z1JTEAu?8twATq=@N=H90_AZ;{?s@u_dlocvrlmGZ75?*h zGr2T@A&UjFKRCA5!j^TP2dR;kc-@R6o6h{xb~D%jdfOLpS(eJ&egbk0-e3?y<)tN$ zr6YR13yRA<@0FPKww;*F=M1KE@(EQ_RmZ{+r(g4#7nf{+YXxi0(E29E%9OLpU5%%# z@nT6>;k0qDO=(dUwQ`8FL_dMAwGGmXFbc)sz1us$U4P;AJA2{vl4)OF5p8rDt-khY z5pt1&w0go{Yd#*Wnr864E8BV!X8-9}DlTq;cIFIBV(N)W8qz*&p+&eVdM?!}q1%pf zvUzv@)iwp=`v+9W&c`SFXt-aT&`*3FBmkrR9=H3mNVWRDv}xX~Vq-+|#if_8zXf?3 zRqo%`P#EU>omb4SEkmdtf_HXYrSPCo{(MjN&B&JqOFv)v?fm@Xz1kvS4-8y|=W2_V zQPHTmGUq>5v0YsFoMfsf{@4Hd2bfpI{K?!;_0NBN|LIgm_Q$jj+5h@KqR%JV|BrwE zBYS0S)=mG!3Fsf-&kw)8#gKph7W~&$&JX=O4fDiDQ}oY&ys9qK=Qhqh<9~5|7^46E zO8-{ipMP`Te_R*&=ag;JKftd)|MBm4yT1RYo)ytlE!iLWC(HiGy6jWz|MQRkK>s9A z3WeYdfY3kx$65ON?LW?V+a>4E`%doi{-6I?qw(?mRhDX1s-Cs^XCA%A>>uFYnf~&7 zX1cy(KUviLU73G3pSS-{H~#N3KAHR9h!>`xN=y(ICo zLMZ%uN%H4qA@Vdre>GBn{Yd|;ABq3=TNwH_B7Y+E??(7%v*Euf`NJo~pC}>x$A79H zjQ;W_^1BiHc~1=b-H89ZCrSNoBz_vvzbQ%n>ZHFhQa>F=UKRSQt6}6Oe;OhDcO&()%kaN3(m#zb@|zL+HOolscO(33I{ZyZg%%j zUyZ-w5Jdh~lKABznEu`P%R>b5+hqylS39o?5r6)VC;LazUrDmKAVq%u^!(8uzlw~1 z{_$VKv?~*!|NqAv$bU0Jtumi$kE_GfM-;op$mAHRYo@;mzY32(_i(ckeI{L3fQ?xBj=~?mrS+!A-fkRjPUvV^M1onScPu8$k=q?uh zwMwKrZYj9M`B!~?6dR5Su0IyC1UiOc2SIoV*3-tA459g$$>6ZbvisZ)ZA2s9icD!Y z!ixPNUZF#mMWu+&_AIP-D*9Z&?PJe2x>f_Pd1#&=)(!)1-Fn4^eMbE>-c9Fh0V=gS zAu7)x^B#=-V)k%x4^Z$a?{;g}wO01gi+V+}IX&bNM-bq&TZm*Klb8U|Cy$ANR-huE=N z#$xPhI5z4$4^nR!^Lta#!0<-77sXwAe?PGQ-UzeHQem)Mvck@8G;eQa760b~T@fJoJUJs@Jb)D503PVnLx6h%MOC7%!00D>Li=+?k6>)9;`gKrV#bA8#=rqL}>p^~f zM(6pnEiz|a5<6CUJ;eNV9h*tmRX%3Xg1H-wr#@&!PaXicfGbU* z7Ifp^eJAO&fNoffpy)h)xZCmAGNc3jXj72Z(ag65(i*6nApQaI!^gqLXGH0bv^16q z;a>-ix|#tiD-Sh1h@HPH@^*Pn02c0VOV}Ar95X@kZ*hkUV4IHR8oZPcS z(cni8-dvoWs8X!LG$TgGbaeEgdN7juK3>ge4~09C(s*M2Y|jhWhu5MVHSa$tLn3PE ziLbk*9&|VZ@j_O8Os)8J`uoyIAfSPoL{o@sDqN-G<0D@m*9@@74 zb#bS?eF>j?SB1`M=v#dUWaiG$*D+@13Yun;_Z^CYDTvxxXRn5gL6r~{yko}bNC5@J z7Bmg!OP1RtXzzkK20G2>AZ|?z*i{yQ6oL@xCWEPi5E>g4#dn7_6j{vY9O<&isdj8j zX&88JR+!BX)+RrGSwgak??;|2$bQEsp2{A#rsXL>RjY-j?MM19h0A)f|3GvDd3yDzT${1uZsc@gmd<7Ls^^GNt zx|Xv-YAI($M#P(p*A~#Ts^r-61!t@Rma&`1o#h0+u0H7zvXsDskz%n78ywmECV?x) z^PGH7l!Fx5U=ws)bsWzy)T+VHfnU!Ha}z9F&@(P3pCC0a(m_2Jr#DA!Emk#_dz#2` z7I_~ZCr%#nYmr5C4bSmV?k2r}MuYYf*z>O$NpCF#%Cnts(j@GnlI)LrDQUJ4PwoD2 z#Q-y$+(-a0ANX3CRn2;8I1!3PY4Ap;Gh$nku@EQzCaeNy?+?b&^g9`lyHaRkAk+>O zMX~TQN9%Sr3TcY)V{E91jjYl3Ec;~Q>VyRaE3qjN$#&uS@kr2h44uJ*Cl=DDrm;Xt zN;h9wUwN{LylyZR*+I0{v9QfLsrw{^8%30p&kPx3xQqqOXHl!}qtQft2J`U<%h4d4 zHJB9m*6LP$T)0=U%VL!5+*HKjl8Nq(*BlYiv_Rk;0(v9DIh}c5<7FehBhW4oEI$Sv zH>D4~k|;;8?5&UrKu69=9V14{uXm2*)Yww}N83Gg1BNs})0wb|HW2)PGzFBD=uk~j zY?TA5qy&Rl4NC$JmYt{L&8S8-**7)yb%iS`5$PEDLurGI5fu!0V*3#81%)O6$2^er%q}#cxjR}imBB5j3(F-)mNl%b&tV2bM}P3 z*Llf}jL`iL=jw991l?`|$%vBtqbtf^<45okh!wcivbMepTszBkxC=Jm3}ftVn>Qw) zhR^|(S|o|%)2E{(7d2h@b=8jTKV38JMG6$?&GOxDY7642QgrS}Ay1Xhm!RB1Id9*k18tl8D$&*npwK=i(;4?(U-Ju-D}M_?Op69&^w zJB+H%#R!aJ2k)Lk|2nvy=zoXtX~R~hnHZ9 zaQ4BakpR(mE{0m>F%Eiv%J>C0 zUm^(bAZDTyaIq^g=f_D&Q6s;p%=Nnl>@?lJ^^EmZtjF1~Yc5f;cYLG8+`EJ}z61(x zKb#||FLi<1Z!sWiT>%gS%*q{H+0VG9f@JNxKbW&WWlg?B85-GQHf`w%qjD9endnVq z??1!~-ht9BOmOKF=$6Ij&nr}WFF776y?tRx=i<4%(Fl9|Do< z$CqKM&?if(_fmuVNtQFCKh>)sH6bIl#ykz{>Vlx zH@oAJoK&INo?$&^$UAQzI$6J7H0ZsLOutnL=s9l+2~&z_hIhs|QS(Fv=o0jLU&0aZ zGxb^8<$K=sG?vQDf!9DYX|uR5PD;QDHz-UZP4wal(k#~v?vTJyXKp`36LOr9G79_? zg%Zo@r5(Dr^6)uhpTu&5Xc-zD74M)bX8Q$Am*_`(g68(Xb+Ug~s`}VG^+~^`npo4I z@6ViP_Z5yH?`^uN1Rd*d=pMSgd3A=sUP?ktc}rWGFH$D9?R1!K%u}zK+zh5M*Q$2% zX}NNyXz|;{MLz%-vV^oR5t?f!ZpV|jM@;(|n#^w393%t%0ZnbCR39q6lPh=4r(QVy zFFZ0va=;k-;TL|)q)PJqF5OGa9%rIWtw>c}XFb6O!e{X~QWSzv8ER9>ikTVZoq-)k zNeopS=wu7GhYk>HpbN58oa2$>R7h!ihPs*r-)bgU)#=0la>fL*eB9wr44@$kN&BuQ zxfbRC_;zUk7rbh%JV5EWp#gP_6DsIij3sjATC=MD$Msn3=6`0^*GZNs1U|5JUtTFN zuOIGeYu?8ekGFS@1<1dAEA|4zx@%nxV(19hT#H4fh!#sYfxG$aD;Yblhy}Gs;c2$H zw7C@2n(NowM7BQWo%vx7lT2dSU>B%Tbv&3mX)00hb%}d9QE?7A?95E(Z6KWELjF2f zlKZ}m&9XNpK2~n0qjww9=_@oN`c}i(5!I|=SMvJ6-_ko6 z*Xo1}HF~YzSp6+nip!NHeZ;JB5CiOgiNZ+z@zODyaqd=i1rIJ19y-f>=L;rs#B-2a z6~wK=`P=BJqZ(QLSok2;ORwtAULte?TCmUpbKf^*T)Dtaxln|j|DFfKe)Nv-ekYLI zL(*S_a^g{q*E`c~pS}lmRc3?!TB|voYNNU;B zPROeO!JDBn`fjD)?cksS=*}rLS|U5VA0Yv=%np1o$FvQZZ*GkWy(D3h!+lDM{;Pf* zB0F3r7gBOgxUkro7@_;{PO6+TJs@D7ay-B=OJi9{?Wpq>Sg!@J`BTh}>RaTDSF|9W zh4qF+Z$j*OqH`>wg4t&unD6za5bjUGB36R2dnxvsB~QY^$*)gM)d3WqM!#38mi{4n z1S>?7DvWG!0<(s9*kGHxic77?mWUkqQb~r`<6A(-`_x7ry9OhKwIH;Kpp=3~7OV9w zU{{<0WA>|n;jbJ}Ijp^M4{jYG_NS=fNje9uysck?bfwU6!+8OmwOQ7286&-ONS}SbYhi_2hX}3?>zt*#VgZ}Kmk6;`D5jde} zyeSm3Ppm6Gp-5S|;jQj?>$bud?%;-n!?YBMsH&n*f-ZR90+*FgC=pY55gUgI_-HSH zuRZ|5`4R=%sw~%9SWk^0dLdpf0C%5E)=Sv_5?*v!j@f07YcitF#m-EzxK^drJ4ei* zY5NtYnUm`Cl7CEdw{)xq#OoW&^dx_vn5jueI)WKFEx@~8S<0i1&MgD;67Q;*b9@%T z(knM`4v5Vig4=EfpMkw%Ahs8>FMB+R+GZ?)T*rf5u9|IGKU?r~;Nh&HIv6~axCS6g zmyXyTpk1{giptM^V4wUeYu2;v>p9o?@&&u0dH2}2Dl&j+B4z7$^Mg49Ky}-*`3|*@ zTU`zfrYpibs4i2|!MB6Y5O?PW;XP zDT@r&L^or9nhasE_c!=tzVVmZ9{kkF#YrTXLD+DCx2Xe4h$wccGoQ!Q22-=5Ls-L= zHX^59T}+}HU-Mp-xBKuu6L-)j^}4XvcVa&V9D5yg%9=c@e&FF9b};gqI+(Z%oCqvzy*>~K~bt>IPoIHl5#q-kwcS$ z2urCVZq+!>sN#4j!n;c`jWrS}1AU9^g#`z-P?#`*RDh{WT)kF3;v82)D)l|BNyiejPpD??4 zLsSTVR@-%51PD8yWddasVNv0i?!S= z7NplM7?gYtL|=G>H`Q0%R7|gb=lCW%VdRNOyr#wqxh3MPanbC4BZ{Q(m|LxlV?22E zZjH_*8uum83}Y(w*=+f(h^X_*dPx?F(p{6tj?BJ5Pf7p^*p2-m6jvYh$wh92thto5 zEuip11qRL-@bs5>+lj+2EU{p|bCNMbCzrKKewMkX)dW0$*Hsu}gW@6H@fETQ=ZDzu z?eXFl1BWHX5X>hb+fR-yacd8N`ax9wL;@$ar!4oy+jmC$7UpALfT2Tb;b{W2!;j4V zMBUI=x>PP{mkU{8g)`XWW@hg_&%xkB?UfYx^tC{<7IpIc_a)p~7K+$;jjI{G^@j1{ z!yCI-WAa^G#vL4eF074m8y^e3_R;|oCwJep_9NO=zWZ;vGp(n_Z%3BDcqWq#r)>Hk z{bo4U)OMF{O+Y*1?e>J^w87kw4Skm)rZ%AJ=qqAjG8Kw3}bY;WWy zg{x^$zwL4JHE_@V-8O3_Z00&I%p@g`iSqZ$DQR|sMf+13_;s$E%t}am_CIMVpJqwE zUlZ>3wh&sWJu$Etj#MYKNN`v1bh;afPj45-s#;UhK@yh1Xw;V;p*0q0t(ux z?@%OR;mbQG8e$5ZuyO_OhtD*TA1rAEN*_`uQUGj;IYW+o0~v-|Z>6{{V5M=z4i)RfeGDT;m=2Z9h(AOjqs4e{@6-+G=h{H*iB+}c zHc)POc4V`ttPi8Xub66g6W(dyE42lY8P~-#bddI95gw5 zv1-&d4F=2jz?T)r@e$UEb)$e>*S8s*AGc?#9{`=swJua-qTRRzaGy{7gXZ83h`Rpl z^!|N!t2$j?BolLWsP|x z+YxSq@C^Bu*6cw;Op)jHEfVi{GEMWmhMY$R0-%o0V=@Do(uF57G{_mmQl~85??t%r z+{1NBF}Qzf=}rr*@;)c9rxiWNQhd3SZC)SBDUH<{jb088iOH167N^-~ek0yk-e3gYs%E-|$$U>TvYn zJK77o{&_|eO0;y2lB#~Iyd4BW?d;`3lWSvFNkYuQXpd5@y`^zS*s7xKZCHKuyIoyt z37q>DyyNsC%-uPCoX$L<{up0uzQfqR8AmCF3PhdQb2$W@uXszjFc*luiU8p9USAm{m zA9-eSyR*gK%FM)z)(x(MojQ4}kxg&%#FQwX&;iA5r8^8~AUNDR!;I0R(1h5gX%II@ z5rb(#R_v6d0op|SCqf3iW$9%A0FOA>Su4$-Cnf+pzf7R9jn4A4Hl)+_34stt`QeFX^ zjBa#8CNn3uK53+q`9|(tPg7FIZ*Og)BwV<$SgPman1>QPuClf92|@!3#;6wj(Lq2>qopkwOi*V<+&a~qr7$e4sqZr!FR zjfD5I9%;!BKIhLdt@Fb({a2Z2dn3*{=j0*RN{bLiX6!)>#7`tn!XyvO#|&``N5Q`} z)&mBcXuFS7UX?{tjiCAY1mRZRjzjX_xkxf&%u+gOQ_t{rf-(PiVa!QmmKvya`52~j z=d-e&Z_*PSb$$I>)Az3D5lnv~0@eg`mJCtgPL>)&wq!6w*aJ3_cIi84!1(9;e&E}>AK;`HK zovBN79|RHbrAhJ4+npkenJEH@DQP=>om292IEldm*K;iD2k&SwYGa>j7lq7l5hsBG ziRyuy1-&(lWtP}-_t~BDGic*45orB~$T;GxLmS9kxX21xyX%X|mZtF@S@+J^p*dl# z?BLsbJ9{`~zt%^8+|XU;wX~I*9Z9k7{4Mteoof8F5?+0%fId`kCt)_hPd{RJ=CkY! z=BH-6IujV>jCR$%`SC2r$&{Otk1M3d=(YYML61Y%%2!27qsZ2c$f;qNwEQub^0wCm zRqh@X-8THV@tMCB-t`a<@-kp7R0mk#%GXsJUfGFxzU;1$H+bx}}*5XI}kE{CWn3PopzG zPf&Pml{-0>Jyopgvlst--2)&AKF{TNo7A#bFf0>|FK`>jx)l!yuPjXgF4+|(;WHQU-l40MeyQon&tJ8&**S?{lf(^Jw z%rRrsipQ*7E8QRBvp;P4>^uYmZxS=#`9_D}Fn>u5z(J;WhM?t#fIXE!Lx@hV6Esdt zqRomFltp4$n!yI%Cu^1mZI&8<7d2A~KiBaubrE;8jzBxHZP)j&QRB0u06`hr?*#V& zKGe%_&tBp~`R(UZJNe<{29z`iz1I9(%Qj+k)%bOcM7Bz_H9DMl)DfMf8TUzTMJS28ebb9!91m>ba^u?09^xbd^wps65NkdUlfw~%@ z{+o9NUaCJ7vYgJIRur>N~ z9$=ZhN`fK@$|i2HlTDu~>KLk+^2)ewr3t9sBxX}~#0lU1qe+fgSuBGyXCt>vcxaHW z1btM*X>#_Ba!XWcmBj!Hg+YuaE#!i)XV#qc-Nx`74h)Z!)yaD*_6Dya0cRiNM&6m# zFW#zAa!m{8fD$}4u6zf^vcHf#dC4O^RKf{Jzd5AxDo;i%F);h29y)_+j~GavfP_Yr zjcizmyvDb9kkWc)vh{{jl;b*gkGPg5zB?0Zd^Rg}=8mUQ^|E6ftj^SBNe*sYs) zydO3z!69gmxfB5>UTVW5J(TkryF~>Ls!}W%Z4_#b>SD3JhQRyr;E^rf6u3*)v)=Y9 z*3V5Y(_I?+;LbeN7H#zEHryJ5k8e7Y=}E(W^^+0aU$J#!nZ>@J^S={cC#Mzde5Qkw zM+NKgbxJ7Dg`prcY@N^Z0uP*BQ9vMwrns=V6#%*^noJepPYIISlMSeKWV~-CJM=4x z)Js(5k@ny$a{ZwC*`Y6{h$o(jGi05zWUkRm3`b*b$6xu=CurrJvI9S_Hz=39IW7b- zK+)$`aG@Cv`>`;<(IX$N(LXIr)RVHKAv`kJ>^=_C zLHATCAvPe`6K3BGp|&Ew#6G$XU_eJ=tM>rL*EWbK(H)NnV>^M@L-=FOzz(T*FOBLR ztsazN?k^Ato)r&Veh?Vx_{F2}_ZNTcXCKn)^F_*P-+p+>dmF+Bn;V!>ytG<%4~}x zKt|DO|`DjMcTBv@sE?jqEsFu2C(wdQ&?|o zmy5TtIHx_iEyEyryZD6Be$aDaNBRxC-RcJ2H5p9zc&$iC=U3S9YS1uKhQw`rFp%VN zv`a`%vdI#Y7oSjAUD9&$Uj|a*Z%0T|%2eY?i_HotT{>v}iTFHQFhM^V7>9IC;=4;l z8AkZi33voslqbXBk(%0}uI0pVTB%}wrv64HeSG3rtQzF`wW}R{^uoFhy0#n+Z|Jc? z3|8!en|N0NmUK=kZ5mOtBKHaaYYeGm)U2oAO&ihUjlLKHM3vZfAIWu8XS8510|VZB zEyY63jP0y}1(DJd;o9yt9V0oRG36%-O?c)Fb#jI+Nr{YXczpT;yL#SGJg zEI!{+on{lW3pJgsBj)@ng#{7YQtGNNlI29%neZbQ_AwAF%M~fTOaK@X7dKF`=d5 zS6FNd4W67rtdv5NSrmxXm+76i2+J6z$!NqVZg|nK!&B|e>1q4yhFN^+*q!7TI4CSe zIHs_?twNEm$NPhY!#jK`Yfp$z1&o>jeF-k$U=iu@kDxYq19BucC&~8XAB8zHvBJnA zA8#=2!1qXw3@>zmjW`|1V!v&qe)?ZkZB{rrJ_`oyNTQ|poUHSL= z9@;H2lWm3#k;5d3G2Elh67I})LReKU`dY2p&@MIh#ddf3gK2yKYsfQ|)1wsh$K!a> z3BoEY^mg=0(WhH^ld_1)A1=i}w#Fq{mTHQ~BWCO_LbXYJxo!{zgmHtV2L4o6j;+c) zF*5wd#$W)%Z1(<0g7{hreG1Q%l5LSq==S!a?kz{SC|9uzU&_px`Bz5FtG*D$c7sTO zFRg7@J_yc2`UB&ktIJhPE6#R$OeD9A<+*~(E+(U@@cZlG(eriY3WIbhw$)6oR;R2(dGY!#UUY#c8 z%&*M=X}0S&+?^zrh_OU{->$>f9=A`l9dwe#KUOTRB3!}Cy)76fm2)q_I>CTKag!Wj2!i^1t{8#m$z zO>Z5uoBKI;L}hGfZYY|kd5k^A4E1ilMcGm}xupYEUV!bH8$k?#oW|K46aLr-Fl&2R z%rAD8SK)e=B)I%BS+C@U&YwcM_M^?%H%68oq42pgR;Ismc+;oP9AZ#7TorN}BZ&HI zpMV=l6~q19N0@4jJ@)(%_HrCuoa0`yA_aA8QEAeLfKXxm-q)diw6bSHf;?D=)^HU^ zw=wsH{a%Cwy2`Z#z67Qobg#d+lJY_`dbC@f=o7vEYg^cYV#PI5>~gC{N5CNyp#N{W zzN70=ZP)e((IBTLIb)JZJ#sW)GW`07tM=LVoiXn1`KwXJpe0Ssxt1jSQ;;asz{KTk zFv7cMq3&0IkdJ>$5}q|x)6ITt@LoHCeV@a7XPLisec0dn3>WDhn`7@jfS>1je8#1P zpN2jDsqrCvEqUmU?gZ~tv8(9T5S~erND+A{8J>^9`;A3`!my(9_blhR<^lb4O+-*W zY{zK8^2Eb;JgVJcT*dxd`}a0P`1{}m`}*vxBvLPIgE=3qTJ~2XC>vB~Kd|L$Rm1!} zgzI6<*26lLdV0(I0ee!XO<|hf~QsTXj@%@u}Q`zte0`nA4paZ7iq!x7Y9f9P#&f^71SR{6FzQp$mG*OZpMCsO z4+-8{Q-ePL=lrlqygt3~xKrQX!&Od=O`8F%6@wwf4v(SSBK}@e@~(GUguGFI`!~l; zbs|QEXAo!Wwah6v^7x+sH9*S0^{7u)wb1(Z-dex!%Wpp`H9wzXiHKgwEc)@YzuPHO z4dufL)qELx%5&L2&yk8)VH*Tqd7f|z>~q;adjYSmc1*?kZLhzzLAJW%gRq~SAf4)w z#~%%F%F^MPLs}NVz~0vSV$vse!1{5o>37KeXP@KaJ~3)ELJ}~#F(|k7np+CX4QnV9 zr@VcRk>5JD_yxs|)IT+3(tqrvI`;8#7*l5i@iw>$$AVwcZ)7lk!}{a6-J_3$L}JwE z8xq?>yZ89tq5Q4CvJECH0R$_GNWSrwpHB=?7pokP;^lmL5L7ep?v7MUF`jYz-?3ow zW|aqz1@@+X=eNp{{S3z|f*r>d#FM~jMZ<0N_ub}m+Se_<0BL&1K!&`&#>2S?GMAH> zMX*Q{@nxLn*4sfqr(w&9nP1aXBNhhNCBRlqF%uUdkzv2w%{uz_tN9(d|D~SQjvdi% zdgy!&cXY%CbqizEP2=XlJxrkx5t|0^zn!T77-EdBVTn7jF(`_2Ba9;~^NkDqE$&a; zIbR0*VQ0eO73~3psx)7O5*xTw!x&ijKuh%QWS8M)7O?n=gGK8_24u8Vu1f%S+|-T< z)lK40*J{z2-PaGJS?GtYNpn{6x+5R4Kgnn;9*%*~{`UsA6#jkx?doX?lHKiAO+_^Z zscieZY?0+Nc+<+`C_jUb?oE8aGYnQ7bz2=r;6R$=R|}#@s7K8+yvGW}2WaZOBITnC z<&Iv7G2B^038{sX3rs^$Afoj53n`ajQ~V-3NI5*7OJOAxWQla%o#pW_ZAiOc9eees zHc5emN2Au!a_Ig1XaoNJZ=I{~|JAw1*cRFsRTzW$xo`1_J6iQzYtjOq+mFI%-$c~J z(yJLI_wpa1Z76#RB+PFwtUZ5wKp&^#`^V-L)K-2Q_+&!i`opnSP?a1ZlNj^gGm-cq zkl*{h&6j22FczA+`l<8}hK)8+M^FRo!W>_!NjvVe(oX`cx?fGf`!ZOCQaSijK8|mw z9~rjDXc4aXzw2jmJJgOMv!v>-PX9O?^Q^EJB~Ldw>O?Y9ap3{@j*EL=XX=je z$$%cNe>p|znP098&cAzYiMyi`F76KwN+M_6w*AXh|EbTM?fP53*@vlq^zWOspg+El zRDW~GcZ;$a$ebS>vj%#KW22=`(4;f2E7Gj9RC)Rh#QX5HRYks`!4w-ldSv1j$eK2V{_)u z|KX*T`@=J&KB_#0{1FqC`&$#!L6t#PNBBE$dD8rAc=Uj>aj$=#n+)*k;(o?flu>Ob z^|y|${dX;%$5tjfGk@RRrndsR0_O+}|Id+u8Lsk&VVQ^|&#!4ZxPN~E-e4Xfs{HAV z7!{29`|_JvEtsE8|LI4WvA_G^mTYSI*#6tU^8NR|h%2oA^uYYEQ+bHb-~BxPyxk%B z+5hp^Kb+=2YxHniB+b9?PZBHD#4q(`&sU>#C1hQ`y{6IQo-z5i{pVX=&CgHm7@dH# za3%@RqAKVA=@~Nr@1CJ4Wa#}+a*Oe-;niK+6y~p*+CrS8`pwmeh8Oh9yqt1PnV$WK zr#~)oFg#!WQe$|)3voU9kD2{GcQ?Z4acaNBn9sTp79^$Y((X$q2&?f6-^{0NtQ&;( zK5p+dnZ9W11+FcmNlMP`MUo_hCh?8;5Y_wNSpxQx-H?`D4Np-1>=9M!M_@ueIj5_m zkM2MHTkgwei0W}O>16(EPQaJjetV>2I{w@1^=A%2!C-=V^SK{zw6a=S@psn2-+r!l z_FGS)iT-Cc0@bh>U)h6UzE?V!0z@@ux9|a>r;nFQ7}J;G0PCWM&&nRw zF>M3AweRDAc1<7oC9m#`eg(L)f2P_!j!#P4$xCV@_@%LZ4>zNnTl;H!ZRA`M@J1G2 z1f{Du`@T%qCCV=++RkvY@L?BVTVq(#VTBd+8)$q@sGwIK!Dh!je(!okD!>2JYxc*_ zTNWSbl(DndN2~ydWEFl7mquymVL%b2D1endP64ZZFcZQzx}8`d6w}||UfqCte!H)V z{fyR7@(_|HOB*K!8Knqi4VRmO5CO|R#Yo`DnjBw5@Bn*I)2;!MkErupyuOgNjotm67T=zvA`9Tv4xJjb z194!~1D-@D{_0oOoZ4>!*QnO9?=pp9@=Ffn4Un5WSZ0gGIUnze2i1rTsy+v=k3j8t zm}1$3hytGU7NL641)#RbN$AM5>iSFyyS3jr`a-p9oqu`bY+ zUuFL>;G0Z}bdmIy3-(GqEm(h*dFwB3+fNb0r_vC?sWju?j~{Y}g%SAcUbsR}$(=d$ z0({)72hXXWHfgUrxEdutOr`y}$lMG_K3huS^;OYY5y@F?B)={;E5*+#kd6{PF>`9? z*+7aoh=DwgaS$K+o3cJUKKbVm{ zmQ@or)h>-}5*P3=V0Y8iRV1Z367}m&*^*`S2>$&ITdIE%SitT=YE~|rG2T4>dOg+c zi9``JgF`F(57Ho98mHzn-$meiZF>Z#ZFcvIm~~Zhq=LaLmQljqD|Fi>pyIY|p|}0lv zZwTkbZmv`WV3Fg5=%WSM#MW_$uL({lAejEC1@idBt1=6wbF$?GC| z)>Zz5qZw_D$2@C*xJ5#FO^0?arTJ3bGJ6M*!Hj8qi_>C8V)&>8?99zj#*WDD=iyB1 zZrfC+OPP<}U6Rc&Nl9P3;};vbi5M?VWA;QE2kb&IBf$Cjnu*Wc^p(}9JYqjf*u6SZ zeuOyWF53edrqA<==}9R<8oG~ji#;r<2%f=V@FAMOrGmB?v+#VnCX!O;6k1AOoDbK2 zM~iBCB^Fbu>YD6Jx?*!-ZOxYTb{Q^hbgGQRogsFVpILs>0-PfE=vm~vsgU3D%}9?dDP@SbO6h^&r65n|7HuiG#C`JnRGWQ? z;)=uTiKl^YYN4NdI#7;sqrJ`W%(nv>3GE%+Z}FQNmADJ7sP4)KOZJENz@-^p4-P!{ z6HocFK+Gc>XXG8i*F{W{Xu~Q_4`aH%rGsM+xLk{ypodV$8`P1Ylw;8cw`n1AMD!qC zD@Mr}#-cefzuZNQtHqA24OkjfGuM4D9U+gCi3=9*U&!Mx_!mgl+CLT^S%aB7M~X8( ze=%u5L-y@mkc)_lJy>AL;1$*Cx(|?QFrkLr{SL5@DSXFpgI77*v)7;V5D2wLzY*yA z3usgCQ){S))DxpqZR;zMza^f%u|8Buv_t45qbvR%6^AJq;fq#!S_+MtfE}Ipi zf^e*<-h5Or z5++eAAbCtEJQBOSy?6b@!jjCyvIgnV5yNKeC|$DCD(^d@(2y8EIO3f6U*5i$Vbvdz zR0L#F6koA_o*n&6)t7qndT{bb!$9)FmN{$IfuZI(efZ@&v&QBPXu*`?1H{UE>Qa;e z951*SrGqkbOsoyf*uWH6)IZV)P4|{$7Xt=< z*x{$HrBji{QeaZD0oGU1e>IfFLB2Rpoi>3 zKKM}GT}77obm{XEa4G(iKSfqwTgef8WNYtKYU2}(|4NZwgZJ{&*NhCn(u4aC*ZYT8 z$q^mFYr@tepsn?r8uf*2TR-R_8ImYhUT)(93YfW8-Ip+bm^&~dg4QK|&3MQ&%|pzx zlS4E|3Uk(y?~s`c2XP$=*rh?Cbk3ZKHD>7>$)9f*!Q8K?ZJ2!3pOF-_`Kmu0`p0LV zxU?}wUXl+t*S1WpafYCu2R$K=xWU;7d@+q=&?(CihbWZX(F)ATwTjO9H_3^$7rV|nR#T3z|iv5gd4=s5@UeSXP+PX;J?06D(e?EHE{W6ugRgBds^ zrW^`22mIKpEzVTJe%Xgx;avK)V)>Nsm^H8nz0BtN<~bkIk4@efsjg*EH_A?8DYHGC z1E48P42=dxD=dDY)oAV?62}!8Z^+a#)(2%ond9n&x*$qnl!`>lvwNhWL=^@P)1f9~ zEKhtY?eix3oP(uSr`0WfJ#tgotlUJ=xm>gouV%0o&R-*98buGG{hhA|&eu|F5gi^d zrj>o2Gm7eV&pwxXpB}ZZP|(AYzZe-yR�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ǙhqTSLO}MJ%Q2q5x+QW#GuuGEw-Cgu6%*B^nS8 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. -% -% This software is intended for research only. Do not use for clinical -% purpose. Please note that this toolbox is in an early stage of -% development. Considerable changes are planned for future releases. For -% support please refer to: -% https://github.com/translationalneuromodeling/tapas/issues -% -function [ DcmSpm ] = tapas_huge_export_spm( DcmInfo ) -%% assemble DcmInfo -template = struct(); -template.U = struct(); % place holder -template.Y = struct(); % place holder - -N = DcmInfo.nSubjects; % #subjects -R = DcmInfo.nStates; % #regions -template.n = R; - -template.v = 0; % place holder - -template.TE = DcmInfo.hemParam.echoTime; - -template.options = struct(); -template.options.nonlinear = DcmInfo.dcmTypeD; -template.options.two_state = false; -template.options.stochastic = false; -template.options.nograph = true; - -% DCM connection indicators -template.a = DcmInfo.adjacencyA; -template.c = DcmInfo.adjacencyC; -template.b = DcmInfo.adjacencyB; -if(any(DcmInfo.dcmTypeD)) - template.d = DcmInfo.adjacencyD; -else - template.d = zeros(R,R,0); -end - -% fill in data for individial subjects -DcmSpm = repmat({template},N,1); -for n = 1:N - DcmSpm{n}.U.dt = DcmInfo.timeStep(n); - DcmSpm{n}.U.u = DcmInfo.listU{n}; - DcmSpm{n}.Y.dt = DcmInfo.trSeconds(n); - DcmSpm{n}.Y.y = reshape(DcmInfo.listBoldResponse{n}(:),[],R); - DcmSpm{n}.Y.name = repmat({''},R,1); - DcmSpm{n}.v = size(DcmSpm{n}.Y.y,1); - DcmSpm{n}.Y.X0 = ones(DcmSpm{n}.v,1); - DcmSpm{n}.Y.secs = DcmSpm{n}.v*DcmSpm{n}.Y.dt; - DcmSpm{n}.Y.Q = cell(1,R); - for r = 1:R - base = zeros(R); - base(r,r) = 1; - tile = speye(DcmSpm{n}.v); - DcmSpm{n}.Y.Q{r} = kron(base,tile); - end -end - - - - -end diff --git a/huge/tapas_huge_generate_examples.m b/huge/tapas_huge_generate_examples.m deleted file mode 100644 index f4c3c6e2..00000000 --- a/huge/tapas_huge_generate_examples.m +++ /dev/null @@ -1,126 +0,0 @@ -%% [ ] = tapas_huge_generate_examples( tname ) -% -% generate two synthetic example datasets based on a 2-region and a -% 3-region DCM and save them in SPM format. -% INPUT: -% tname - filename for saving datasets -% -% REFERENCE: -% [1] Yao Y, Raman SS, Schiek M, Leff A, Frssle S, Stephan KE (2018). -% Variational Bayesian Inversion for Hierarchical Unsupervised -% Generative Embedding (HUGE). NeuroImage, 179: 604-619 -% -% https://doi.org/10.1016/j.neuroimage.2018.06.073 -% - -% Author: Yu Yao (yao@biomed.ee.ethz.ch) -% Copyright (C) 2018 Translational Neuromodeling Unit -% Institute for Biomedical Engineering, -% University of Zurich and ETH Zurich. -% -% This file is part of TAPAS, which is released under the terms of the GNU -% General Public Licence (GPL), version 3. For further details, see -% . -% -% This software is intended for research only. Do not use for clinical -% purpose. Please note that this toolbox is in an early stage of -% development. Considerable changes are planned for future releases. For -% support please refer to: -% https://github.com/translationalneuromodeling/tapas/issues -% -function [ ] = tapas_huge_generate_examples( tname ) -%% generate data from a two-region linear DCM -optionsGen = struct(); -optionsGen.snr = 1; % signal-to-noise-ratio -optionsGen.N_k = [10 10]; % number of subjects per cluster -optionsGen.R = 2; % number of regions - -% cluster -optionsGen.mu_k.idx = [1,3,4,5,8]; -optionsGen.mu_k.value = [... - -0.4, 0.5,-0.6, 0.3 , 0.8;... - -0.6,-0.2,-0.4, 0.8 , 0.3]; -optionsGen.sigma_k = 0.1; - -% hemodynamics -optionsGen.mu_h = zeros(1,optionsGen.R*2+1); -optionsGen.sigma_h = 0.01; - -% hemodynamic parameters -optionsGen.hemParam.listHem = [0.6400 2 1]; -optionsGen.hemParam.scaleC = 16; -optionsGen.hemParam.echoTime = 0.0400; -optionsGen.hemParam.restingVenousVolume = 4; -optionsGen.hemParam.relaxationRateSlope = 25; -optionsGen.hemParam.frequencyOffset = 40.3000; -optionsGen.hemParam.oxygenExtractionFraction = 0.4000; -optionsGen.hemParam.rho = 4.3000; -optionsGen.hemParam.gamma = 0.3200; -optionsGen.hemParam.alphainv = 3.1250; -optionsGen.hemParam.oxygenExtractionFraction2 = 0.3200; - -% input -nU = 6000; -idx1 = randi( nU - 400, 1, 75); -idx1 = bsxfun(@plus, idx1 + 200, (0:3)'); -optionsGen.input.u = zeros(nU, 2); -optionsGen.input.u(idx1(:), 1) = 1; -idx2 = bsxfun(@plus, 300:600:nU-301, (1:300)'); -optionsGen.input.u(idx2(:), 2) = 1; - -optionsGen.input.trSteps = 20; -optionsGen.input.trSeconds = 2; - -DcmInfo = tapas_huge_simulate(optionsGen); -DCMr2l = tapas_huge_export_spm(DcmInfo); %#ok - - -%% generate data from a three-region bilinear DCM -optionsGen = struct(); -optionsGen.snr = 1; % signal-to-noise-ratio -optionsGen.N_k = [40 20 20]; % number of subjects per cluster -optionsGen.R = 3; % number of regions - -% cluster -optionsGen.mu_k.idx = [1,2,3,4,5,6,9,10,27]; -optionsGen.mu_k.value = [... - -0.7, 0.2,-0.1,-0.2 ,-0.6, 0.3,-0.4,0.3, 0.3;... - -0.7, 0.1, 0.3, 0.1 ,-0.4,-0.1,-0.6,0.6, 0.1;... - -0.7,-0.2, 0.3, 0.25,-0.4,-0.1,-0.6,0.6,-0.2]; -optionsGen.sigma_k = 0.1; - -% hemodynamics -optionsGen.mu_h = zeros(1,optionsGen.R*2+1); -optionsGen.sigma_h = 0.01; - -% hemodynamic parameters -optionsGen.hemParam.listHem = [0.6400 2 1]; -optionsGen.hemParam.scaleC = 16; -optionsGen.hemParam.echoTime = 0.0400; -optionsGen.hemParam.restingVenousVolume = 4; -optionsGen.hemParam.relaxationRateSlope = 25; -optionsGen.hemParam.frequencyOffset = 40.3000; -optionsGen.hemParam.oxygenExtractionFraction = 0.4000; -optionsGen.hemParam.rho = 4.3000; -optionsGen.hemParam.gamma = 0.3200; -optionsGen.hemParam.alphainv = 3.1250; -optionsGen.hemParam.oxygenExtractionFraction2 = 0.3200; - -% input -optionsGen.input.u = double([... - reshape(repmat((1:2^9<2^8)'&(mod(1:2^9,2^5)==0)',1,2^3),2^12,1),... - reshape(repmat((1:2^10<2^8)',1,2^2),2^12,1)]); -optionsGen.input.u = circshift(optionsGen.input.u,117,1); -optionsGen.input.trSteps = 16; -optionsGen.input.trSeconds = 2; - -DcmInfo = tapas_huge_simulate(optionsGen); -DCMr3b = tapas_huge_export_spm(DcmInfo); %#ok - - -%% save DCM in SPM format -save(tname,'DCMr2l','DCMr3b'); - - -end - diff --git a/huge/tapas_huge_import_spm.m b/huge/tapas_huge_import_spm.m deleted file mode 100644 index da0b5a86..00000000 --- a/huge/tapas_huge_import_spm.m +++ /dev/null @@ -1,159 +0,0 @@ -%% [ DcmInfo ] = tapas_huge_import_spm( DcmSpm ) -% -% Convert DCMs from SPM format to DcmInfo format. -% -% INPUT: -% DcmSpm - (cell) array of DCM structs in SPM format. All DCM in -% DcmSpm must have same structure (i.e.: same number of -% regions and same connections.) They may have different -% number of scans. -% -% OUTPUT: -% DcmInfo - DCM in DcmInfo format -% - -% Author: Yu Yao (yao@biomed.ee.ethz.ch) -% Copyright (C) 2018 Translational Neuromodeling Unit -% Institute for Biomedical Engineering, -% University of Zurich and ETH Zurich. -% -% This file is part of TAPAS, which is released under the terms of the GNU -% General Public Licence (GPL), version 3. For further details, see -% . -% -% This software is intended for research only. Do not use for clinical -% purpose. Please note that this toolbox is in an early stage of -% development. Considerable changes are planned for future releases. For -% support please refer to: -% https://github.com/translationalneuromodeling/tapas/issues -% -function [ DcmInfo ] = tapas_huge_import_spm( DcmSpm ) -%% check input -if isvector(DcmSpm)&&isstruct(DcmSpm) - % convert to cell array - try - DcmSpm = {DcmSpm(:).DCM}'; - catch - DcmSpm = num2cell(DcmSpm); - end -else - assert(iscell(DcmSpm),'TAPAS:HUGE:InputFormat',... - 'Input must be cell array or array of structs'); -end - - -%% assemble DcmInfo -DcmInfo = struct(); - -N = length(DcmSpm); % #subjects -DcmInfo.nSubjects = N; -R = DcmSpm{1}.n; % #regions -DcmInfo.nStates = R; -L = size(DcmSpm{1}.U.u,2); % #inputs -DcmInfo.nInputs = L; - -% DCM connection indicators -DcmInfo.adjacencyA = logical(DcmSpm{1}.a); -DcmInfo.adjacencyC = logical(DcmSpm{1}.c); -DcmInfo.adjacencyB = logical(DcmSpm{1}.b); -if(~isempty(DcmSpm{1}.d)) - DcmInfo.adjacencyD = DcmSpm{1}.d; -else - DcmInfo.adjacencyD = false(R,R,R); -end -DcmInfo.dcmTypeB = any(DcmInfo.adjacencyB(:)); -DcmInfo.dcmTypeD = any(DcmInfo.adjacencyD(:)); - -adjacencyList = [(DcmInfo.adjacencyA(:))' (DcmInfo.adjacencyC(:))']; -adjacencyList = [adjacencyList (DcmInfo.adjacencyB(:))']; -adjacencyList = [adjacencyList (DcmInfo.adjacencyD(:))']; -connectionIndicator = find(adjacencyList ~= 0); -noConnectionIndicator = find(adjacencyList == 0); -DcmInfo.noConnectionIndicator = noConnectionIndicator; -DcmInfo.connectionIndicator = connectionIndicator; -DcmInfo.nNoConnections = length(noConnectionIndicator); -DcmInfo.nConnections = length(connectionIndicator); - -nParameters = (R^2)*(1 + L + R) + L*R + 3*R; % A, B, D, C, hem -DcmInfo.nParameters = nParameters; - - - -% hemodynamic model -DcmInfo.hemParam = struct(); -% decay (kappa), transit time (tau), ratio intra/extra (epsilon) -DcmInfo.hemParam.listHem = [0.64,2,1]; % SPM default values -DcmInfo.hemParam.scaleC = DcmSpm{1}.Y.dt/DcmSpm{1}.U.dt; -if isfield(DcmSpm{1},'TE') - DcmInfo.hemParam.echoTime = DcmSpm{1}.TE; -else - DcmInfo.hemParam.echoTime = 0.04; % default value hard-coded into SPM -end -% default value hard-coded into SPM -DcmInfo.hemParam.restingVenousVolume = 4; -DcmInfo.hemParam.relaxationRateSlope = 25; -DcmInfo.hemParam.frequencyOffset = 40.3; -DcmInfo.hemParam.oxygenExtractionFraction = .4; -DcmInfo.hemParam.rho = 4.3; -DcmInfo.hemParam.gamma = .32; -DcmInfo.hemParam.alphainv = 1/.32; -DcmInfo.hemParam.oxygenExtractionFraction2 = .4; - -% inputs and data -DcmInfo.trSeconds = zeros(1,N); -DcmInfo.trSteps = zeros(1,N); -DcmInfo.timeStep = zeros(1,N); -DcmInfo.nTime = zeros(1,N); - -DcmInfo.listU = cell(1,N); -DcmInfo.listBoldResponse = cell(1,N); -DcmInfo.listResponseTimeIndices = cell(1,N); - - -DcmInfo.listParameters = cell(N,1); -DcmInfo.trueLabels = NaN(1,N); - -for n = 1:N - - assert(DcmSpm{n}.n==R,'TAPAS:HUGE:InconsistentParameters',... - 'Number of regions inconsistent between subjects'); - assert(size(DcmSpm{n}.U.u,2)==L,'TAPAS:HUGE:InconsistentParameters',... - 'Number of inputs inconsistent between subjects'); - - assert(~any(DcmSpm{n}.a(~DcmInfo.adjacencyA)),... - 'TAPAS:HUGE:InconsistentParameters',... - 'A matrix inconsistent between subjects'); - assert(~any(DcmSpm{n}.b(~DcmInfo.adjacencyB)),... - 'TAPAS:HUGE:InconsistentParameters',... - 'B matrix inconsistent between subjects'); - assert(~any(DcmSpm{n}.c(~DcmInfo.adjacencyC)),... - 'TAPAS:HUGE:InconsistentParameters',... - 'C matrix inconsistent between subjects'); - if(~isempty(DcmSpm{n}.d)) - adjacencyD = DcmSpm{n}.d; - else - adjacencyD = false(R,R,R); - end - assert(~any(adjacencyD(~DcmInfo.adjacencyD)),... - 'TAPAS:HUGE:InconsistentParameters',... - 'D matrix inconsistent between subjects'); - - % inputs - DcmInfo.listU{n} = full(DcmSpm{n}.U.u); - DcmInfo.nTime(n) = size(DcmInfo.listU{n},1); - DcmInfo.timeStep(n) = DcmSpm{n}.U.dt; - - % BOLD time series - [nScans,nRegions] = size(DcmSpm{n}.Y.y); - assert(nRegions==R,'TAPAS:HUGE:DataSize',... - 'Size of data vector inconsistent with number of regions'); - DcmInfo.listBoldResponse{n} = DcmSpm{n}.Y.y(:); - DcmInfo.trSeconds(n) = DcmSpm{n}.Y.dt; - DcmInfo.trSteps(n) = DcmInfo.trSeconds(n)/DcmInfo.timeStep(n); - DcmInfo.listResponseTimeIndices{n} = ... - DcmInfo.trSteps(n):DcmInfo.trSteps(n):DcmInfo.trSteps(n)*nScans; - -end - - -end diff --git a/huge/tapas_huge_int_euler.c b/huge/tapas_huge_int_euler.c index 162f6899..d4c1fcbd 100644 --- a/huge/tapas_huge_int_euler.c +++ b/huge/tapas_huge_int_euler.c @@ -41,14 +41,19 @@ % % This file is part of TAPAS, which is released under the terms of the GNU % General Public Licence (GPL), version 3. For further details, see -% . +% . +% +% This software is provided "as is", without warranty of any kind, express +% or implied, including, but not limited to the warranties of +% merchantability, fitness for a particular purpose and non-infringement. % % This software is intended for research only. Do not use for clinical -% purpose. Please note that this toolbox is in an early stage of -% development. Considerable changes are planned for future releases. For -% support please refer to: +% purpose. Please note that this toolbox is under active development. +% Considerable changes may occur in future releases. For support please +% refer to: % https://github.com/translationalneuromodeling/tapas/issues -% +% + %%*/ #include diff --git a/huge/tapas_huge_inv_vb.m b/huge/tapas_huge_inv_vb.m deleted file mode 100644 index 945e9057..00000000 --- a/huge/tapas_huge_inv_vb.m +++ /dev/null @@ -1,752 +0,0 @@ -%% [ DcmResults ] = tapas_huge_inv_vb( DcmInfo, DcmResults ) -% -% Inversion of hierarchical unsupervised generative embedding (HUGE) for -% DCM for fMRI using variational Bayes. -% -% INPUT: -% DcmInfo - struct containing DCM model specification and BOLD -% time series in DcmInfo format -% (see tapas_huge_simulate.m for an example) -% DcmResults - struct containing prior specification and settings. -% -% OUTPUT: -% DcmResults - struct used for storing the results from VB -% -% REFERENCE: -% [1] Yao Y, Raman SS, Schiek M, Leff A, Frssle S, Stephan KE (2018). -% Variational Bayesian Inversion for Hierarchical Unsupervised -% Generative Embedding (HUGE). NeuroImage, 179: 604-619 -% -% https://doi.org/10.1016/j.neuroimage.2018.06.073 -% - -% Author: Yu Yao (yao@biomed.ee.ethz.ch) -% Copyright (C) 2018 Translational Neuromodeling Unit -% Institute for Biomedical Engineering, -% University of Zurich and ETH Zurich. -% -% This file is part of TAPAS, which is released under the terms of the GNU -% General Public Licence (GPL), version 3. For further details, see -% . -% -% This software is intended for research only. Do not use for clinical -% purpose. Please note that this toolbox is in an early stage of -% development. Considerable changes are planned for future releases. For -% support please refer to: -% https://github.com/translationalneuromodeling/tapas/issues -% -function [ DcmResults ] = tapas_huge_inv_vb( DcmInfo, DcmResults ) -% -KMEANS_REP = 10; - - -%% extract DCM information -nStates = DcmInfo.nStates; %%% R -nSubjects = DcmInfo.nSubjects; %%% N - -listBoldResponse = DcmInfo.listBoldResponse; %%% y - -nMeasurements = zeros(nSubjects,1); -nMeasurementsPerState = zeros(nSubjects,1); - -for iSubject = 1:nSubjects - % %%% dim(y) - nMeasurements(iSubject) = length(listBoldResponse{iSubject}); - nMeasurementsPerState(iSubject) = nMeasurements(iSubject)/nStates; %%% q_r - -end - -[nParameters,idxParamsInf,idxSelfCon] = tapas_huge_count_params(DcmInfo); -% % % % % nDcmParametersAll = nParameters(1,3); -nDcmParamsInfCon = nParameters(2,1); %%% d_c -% % % % % nDcmParamsInfHem = nParameters(2,2); %%% d_h -nDcmParamsInfAll = nParameters(2,3); %%% d - -% measurement function %%% g(theta) -fnGenerateResponse = @tapas_huge_predict; - -counts.nSubjects = nSubjects; -counts.nParameters = nParameters; -counts.nMeasurements = nMeasurements; -counts.nMeasurementsPerState = nMeasurementsPerState; - - -%% parameters for variational Bayes: -% maximum number of iterations -nIterations = DcmResults.nIterations; - -% free energy threshold -epsEnergy = DcmResults.epsEnergy; - -% parameters for jacobian calculation -paramsJacobian.dimOut = nMeasurements; - -% method for calculating the jacobian matrix -fnJacobian = DcmResults.fnJacobian; - -% diagonal constant for numerical stability -diagConst = DcmResults.diagConst; -diagConst = diagConst*eye(nDcmParamsInfAll); - -% keep history of important variables -bKeepTrace = DcmResults.bKeepTrace; - -% keep history of response related variables -% note: has no effect if bKeepTrace is false -bKeepResp = DcmResults.bKeepResp; - -% switch off command line output -bVerbose = DcmResults.bVerbose; - -% update schedule -schedule = DcmResults.schedule; - -% number of clusters -nClusters = DcmResults.maxClusters; %%% K -if nClusters > nSubjects - nClusters = nSubjects; - DcmResults.maxClusters = nClusters; - warning('TAPAS:HUGE:NumberOfCluster',... - ['The number of clusters exceeds the number of subjects and '... - 'has been decreased for efficiency.']); -end -counts.nClusters = nClusters; - -% set default parameters to zero -dcmParametersDefault = zeros(1,DcmInfo.nParameters); - - -%% priors -priors = DcmResults.priors; -% component weights -if isscalar(priors.alpha) - priors.alpha = repmat(priors.alpha,nClusters,1); -end - -priors.hemPrecision = inv(priors.hemSigma); - -% prior noise level on fmri data -if isscalar(priors.noiseShape) %%% a_r: shape - priors.noiseShape = repmat(priors.noiseShape,1,nStates); -end -if isscalar(priors.noiseInvScale) %%% b_r: inverse scale - priors.noiseInvScale = repmat(priors.noiseInvScale,1,nStates); -end - - -%% initial values -% initialize posterior covariance of DCM parameters -bInit = isfield(DcmResults,'init'); - -if bInit&&isfield(DcmResults.init,'covFactor') - priors.clustersSigma = DcmResults.init.covFactor*priors.clustersSigma; - bCovFactor = true; -else - bCovFactor = false; -end - - -if bInit && isfield(DcmResults.init,'dcmSigma') - posterior.dcmSigma = DcmResults.init.dcmSigma; -else - posterior.dcmSigma(1:nDcmParamsInfCon,1:nDcmParamsInfCon) = ... - priors.clustersSigma; - posterior.dcmSigma(nDcmParamsInfCon+1:nDcmParamsInfAll,... - nDcmParamsInfCon+1:nDcmParamsInfAll) = priors.hemSigma; - posterior.dcmSigma = repmat(posterior.dcmSigma,[1,1,nSubjects]); -end -posterior.logDetPostDcmSigma = zeros(nSubjects,1); -for iSubject = 1:nSubjects - posterior.logDetPostDcmSigma(iSubject) = ... - tapas_util_logdet(posterior.dcmSigma(:,:,iSubject)); -end - -% initialize posterior mean of DCM parameters -if bInit && isfield(DcmResults.init,'dcmMean') - posterior.dcmMean = DcmResults.init.dcmMean; -else - posterior.dcmMean = repmat([priors.clustersMean,priors.hemMean],... - nSubjects,1); -end -% precalculate Jacobian, error term and sum of squared error -respError = cell(nSubjects,1); %%% epsilon -respJacobian = cell(nSubjects,1); %%% G -posterior.modifiedSumSqrErr = zeros(nSubjects,nStates); %%% hat(b)_nr - -for iSubject = 1:nSubjects - respCurrent = fnGenerateResponse(posterior.dcmMean(iSubject,:).',... - dcmParametersDefault,... - idxParamsInf,... - idxSelfCon,... - DcmInfo, iSubject); - respError{iSubject} = listBoldResponse{iSubject} - respCurrent; - paramsJacobian.dimOut = nMeasurements(iSubject); - respJacobian{iSubject} = fnJacobian(... - fnGenerateResponse,... - posterior.dcmMean(iSubject,:).',... %%% mu_n and current m_n - paramsJacobian, respCurrent,... - dcmParametersDefault, idxParamsInf, ... - idxSelfCon, DcmInfo, iSubject); - - % check if initial values cause divergence in response generating - % function - if fnc_check_response(respError{iSubject},... - respJacobian{iSubject}) - error('TAPAS:HUGE:badInit',... - 'Initial values of DCM Parameters cause divergence.'); - end - %%% epsilon^T*Q_r*epsilon + tr(Q_r*G_n*Sigma_n*G_n^T) - posterior.modifiedSumSqrErr(iSubject,:) = ... - sum(reshape(... - respError{iSubject}.^2 + ... - sum(... - (respJacobian{iSubject}*... - posterior.dcmSigma(:,:,iSubject)).*... - respJacobian{iSubject},2),... - nMeasurementsPerState(iSubject),nStates )); -end - - -% initialize posterior mean and covariance of clusters -if bInit && isfield(DcmResults.init,'clustersMean') - posterior.clustersMean = DcmResults.init.clustersMean; -else - posterior.clustersMean = repmat(priors.clustersMean,nClusters,1); -end - -if bInit && isfield(DcmResults.init,'clustersSigma') - posterior.clustersSigma = DcmResults.init.clustersSigma; -else - posterior.clustersSigma = repmat(priors.clustersSigma,[1,1,nClusters]); -end -posterior.logDetClustersSigma = zeros(nClusters,1); %%% log(det(bar(Sigma)_k)) -invClustersSigma = zeros(nDcmParamsInfCon,nDcmParamsInfCon,nClusters); %%% bar(Sigma)_k^-1 -for iCluster = 1:nClusters - posterior.logDetClustersSigma(iCluster) = ... - tapas_util_logdet(posterior.clustersSigma(:,:,iCluster)); - invClustersSigma(:,:,iCluster) = ... - inv(posterior.clustersSigma(:,:,iCluster)); -end - -posterior.noiseInvScale = repmat(priors.noiseInvScale,nSubjects,1); -% note: with the current parameterization 'posterior.noiseShape' is precomputable -posterior.noiseShape = ... %%% a_nr - repmat(priors.noiseShape + nMeasurementsPerState(iSubject)/2,... - nSubjects,1); -% mean precision -posterior.meanNoisePrecision = ... - posterior.noiseShape./posterior.noiseInvScale; - - -%% prelocating memory and initializing auxiliary variables -weightedSumDcmMean = zeros(nClusters,nDcmParamsInfCon); %%% mu_ck - -% initialize soft assign to one cluster only (empirical Bayes) -if bInit && isfield(DcmResults.init,'logSoftAssign') - logSoftAssign = DcmResults.init.logSoftAssign; -else - logSoftAssign = ones(nSubjects,nClusters); %%% log(q_nk) - logSoftAssign(:,1) = 100; - DcmResults.init.logSoftAssign = logSoftAssign; -end -posterior.softAssign = fnc_exp_norm(logSoftAssign); -nAssign = sum(posterior.softAssign,1).' + realmin; -posterior.alpha = priors.alpha + nAssign; %%% alpha -posterior.clustersTau = priors.clustersTau + nAssign; -posterior.clustersDeg = priors.clustersDeg + nAssign; - -partialDcmPrec = zeros(nDcmParamsInfAll); %%% Lambda'_n -partialDcmPrec(nDcmParamsInfCon+1:end,nDcmParamsInfCon+1:end) = ... - priors.hemPrecision; % note: the lower submatrix is constant - -partialDcmMean = zeros(1,nDcmParamsInfAll); %%% mu'_n -partialDcmMean(nDcmParamsInfCon+1:end) = priors.hemMean/priors.hemSigma; - -[freeEnergy,feAux] = tapas_huge_nfe(counts,priors,posterior); -feCurrent = freeEnergy; -dF = -1; - - - -%% history - -nItSubject = zeros(nSubjects,1); - -% keep history of important variables -if bKeepTrace - histClustersMean = cell(nIterations,1); - histClustersSigma = cell(nIterations,1); - histClustersTau = cell(nIterations,1); - histClustersDeg = cell(nIterations,1); - - histDcmMean = cell(nIterations,1); - histDcmSigma = cell(nIterations,1); - - histNoiseInvScale = cell(nIterations,1); - - histposterior.softAssign = cell(nIterations,1); - histPartialDcmMean = cell(nIterations,1); - histPartialDcmPrec = cell(nIterations,1); - if bKeepResp - histRespError = cell(nIterations,1); - histRespJacobian = cell(nIterations,1); - end - - histFreeEnergy = cell(nIterations,1); - histFeParts = cell(nIterations,1); - - timeSinceStart = cell(nIterations,1); - tic; -end - -histFe = zeros(nIterations,1); -itSatDcm = nIterations + 1; -itSatClusters = nIterations + 1; - - -% ------------------------------------------- -%% Variational Updates - Main loop -% ------------------------------------------- - -for iIteration = 1:nIterations - - - - - if schedule.itKmeans&&(iIteration == itSatClusters + schedule.itKmeans) - - [kmeansIdx,posterior.clustersMean] = ... - kmeans(posterior.dcmMean(:,1:nDcmParamsInfCon),... - nClusters,'Replicates',KMEANS_REP); - posterior.softAssign = zeros(nSubjects,nClusters); - posterior.softAssign(sub2ind([nSubjects,nClusters],... - (1:nSubjects)',kmeansIdx)) = 1; - nAssign = sum(posterior.softAssign,1).' + realmin; - posterior = fnc_set_cluster_cov(priors,posterior,kmeansIdx,nAssign); - - - % debug info - DcmResults.kmeans.kmIdx = kmeansIdx; - DcmResults.kmeans.dcmMean = posterior.dcmMean; - DcmResults.kmeans.iRelease = iIteration; - DcmResults.kmeans.dF = dF; -% DcmResults.kmeans.kmProb = KMEANS_PROB; - DcmResults.kmeans.kmRep = KMEANS_REP; - end - - - - if iIteration >= itSatClusters + schedule.itAssignment - %%% q_nk - % update soft assignments - postAlphaDigamma = psi(0,posterior.alpha); % Psi(sum(alpha)) is a constant - for iCluster = 1:nClusters - diffMeanDcmCluster = bsxfun(@minus,... %%% mu_cn - mu_k - posterior.dcmMean(:,1:nDcmParamsInfCon),... - posterior.clustersMean(iCluster,:)); - % note: logSoftAssign is only correct up to a constant - logSoftAssign(:,iCluster) = ... %%% log(q_nk) - -posterior.logDetClustersSigma(iCluster)/2 ... - +sum(psi(0,... - (posterior.clustersDeg(iCluster)-... - (0:nDcmParamsInfCon-1))/2))/2 ... - -nDcmParamsInfCon/2/posterior.clustersTau(iCluster)... - -posterior.clustersDeg(iCluster)/2*... - reshape( sum( sum( ... - bsxfun( @times, ... - invClustersSigma(:,:,iCluster),... - posterior.dcmSigma(1:nDcmParamsInfCon,... - 1:nDcmParamsInfCon,:) ), ... - 1), 2), nSubjects,1) ... %%% -nu/2tr(bar(Sigma)_k^-1*Sigma_cn) - -posterior.clustersDeg(iCluster)/2*... - sum((diffMeanDcmCluster/... - posterior.clustersSigma(:,:,iCluster)).*... - diffMeanDcmCluster,2) ... - +postAlphaDigamma(iCluster); - end - posterior.softAssign = fnc_exp_norm(logSoftAssign); %%% q_nk - % effective number of samples assigned to each cluster - nAssign = sum(posterior.softAssign,1).' + realmin; %%% q_k - %%% pi: alpha - % update parameters for mixture weights - posterior.alpha = priors.alpha + nAssign; - - end - - - - if iIteration >= itSatDcm + schedule.itCluster - - - %%% bar(mu)_k, bar(Sigma)_k - % update parameters of inverse Wishart - posterior.clustersTau = priors.clustersTau + nAssign; - posterior.clustersDeg = priors.clustersDeg + nAssign; - - for iCluster = 1:nClusters - weightedSumDcmMean(iCluster,:) = ... - sum(bsxfun(@times,... - posterior.dcmMean(:,1:nDcmParamsInfCon),... - posterior.softAssign(:,iCluster)),... - 1); - posterior.clustersMean(iCluster,:) = ... %%% (q_k*mu_ck + tau_0*bar(mu)_0)/tau_k - (weightedSumDcmMean(iCluster,:) + ... - priors.clustersTau*priors.clustersMean)/... - posterior.clustersTau(iCluster); - weightedSumDcmMean(iCluster,:) = ... - weightedSumDcmMean(iCluster,:)/nAssign(iCluster); - diffMeanDcmWeighted = bsxfun(@minus,... %%% mu_cn - mu_ck - posterior.dcmMean(:,1:nDcmParamsInfCon),... - weightedSumDcmMean(iCluster,:)); - posterior.clustersSigma(:,:,iCluster) = ... %%% bar(Sigma)_k = .. - +priors.clustersSigma ... %%% bar(Sigma)_0 + .. - +nAssign(iCluster)*priors.clustersTau/... - posterior.clustersTau(iCluster)*... %%% q_k*tau_0/tau_k*(mu_ck - bar(mu)_0)*(mu_ck - bar(mu)_0)^T + .. - (weightedSumDcmMean(iCluster,:) - priors.clustersMean).'* ... - (weightedSumDcmMean(iCluster,:) - priors.clustersMean) ... - +diffMeanDcmWeighted.'*... - bsxfun(@times,diffMeanDcmWeighted,... - posterior.softAssign(:,iCluster)) ... %%% sum(q_nk*(mu_cn - mu_ck)*(mu_cn - mu_ck)^T) + ... - +sum(... %%% Sigma_ck - bsxfun(... - @times,... - posterior.dcmSigma(1:nDcmParamsInfCon,1:... - nDcmParamsInfCon,:),... - reshape(posterior.softAssign(:,iCluster),1,1,nSubjects)... - ),... - 3); %%% Sigma_ck - posterior.logDetClustersSigma(iCluster) = ... - tapas_util_logdet(posterior.clustersSigma(:,:,iCluster)); - invClustersSigma(:,:,iCluster) = ... - inv(posterior.clustersSigma(:,:,iCluster)); %%% inv(bar(Sigma)_k) %%% TODO check rcond - end - end - - - % cache DCM parameters - dcmMeanBkp = posterior.dcmMean; - dcmSigmaBkp = posterior.dcmSigma; - logDetDcmSigmaBkp = posterior.logDetPostDcmSigma; - - respErrorBkp = respError; - respJacBkp = respJacobian; - sumSqErrBkp = posterior.modifiedSumSqrErr; - - - % DCM update - for iSubject = 1:nSubjects - - %%% mu_n, Sigma_n - % update parameters for distribution over DCM parameters - weightedClustersPrecision = bsxfun(... - @times,... %%% q_nk*nu_k*bar(Sigma)_k^-1 - invClustersSigma,... - reshape(transpose(... - posterior.softAssign(iSubject,:)).*... - posterior.clustersDeg,... - 1,1,nClusters)); - partialDcmPrec(1:nDcmParamsInfCon,1:nDcmParamsInfCon) = ... - sum(weightedClustersPrecision,3); %%% sum(q_nk*nu_k*bar(Sigma)_k^-1) - partialDcmMean(1:nDcmParamsInfCon) = zeros(1,nDcmParamsInfCon); - for iCluster = 1:nClusters - partialDcmMean(1:nDcmParamsInfCon) = ... - partialDcmMean(1:nDcmParamsInfCon) + ... - posterior.clustersMean(iCluster,:)*... - weightedClustersPrecision(:,:,iCluster); - end - expandedMeanNoisePrecision = ... - kron(posterior.meanNoisePrecision(iSubject,:),... - ones(1,nMeasurementsPerState(iSubject))); - - posterior.dcmSigma(:,:,iSubject) = ... %%% Sigma_n = ... - inv(... %%% (G^T*bar(Lambda)_n*G_n + ... - transpose(respJacobian{iSubject})*... %%% TODO check rcond - bsxfun(... - @times,... - respJacobian{iSubject},... - expandedMeanNoisePrecision.') + ... - partialDcmPrec + ... %%% Lambda'_n)^-1 - diagConst); % add a small constant to the diagonal elements - - posterior.logDetPostDcmSigma(iSubject) = ... - tapas_util_logdet(posterior.dcmSigma(:,:,iSubject)); - - posterior.dcmMean(iSubject,:) = ... - (((respError{iSubject}.' + ... - posterior.dcmMean(iSubject,:)*respJacobian{iSubject}.').*... - expandedMeanNoisePrecision)*respJacobian{iSubject} + ... - partialDcmMean)*... - posterior.dcmSigma(:,:,iSubject); - - % calculate auxiliary variables for next iteration - respCurrent = fnGenerateResponse(posterior.dcmMean(iSubject,:).',... - dcmParametersDefault,... - idxParamsInf,idxSelfCon, ... - DcmInfo, iSubject); - respError{iSubject} = listBoldResponse{iSubject} - respCurrent; - paramsJacobian.dimOut = nMeasurements(iSubject); - respJacobian{iSubject} = fnJacobian(... - fnGenerateResponse,... - posterior.dcmMean(iSubject,:).',... %%% mu_n and current m_n - paramsJacobian,... - respCurrent,... % current function value - dcmParametersDefault, idxParamsInf, ... - idxSelfCon, DcmInfo, iSubject); - - posterior.modifiedSumSqrErr(iSubject,:) = ... %%% epsilon^T*Q_r*epsilon + tr(Q_r*G_n*Sigma_n*G_n^T) - sum(reshape(... - respError{iSubject}.^2 + ... - sum(... - (respJacobian{iSubject}*... - posterior.dcmSigma(:,:,iSubject)).*... - respJacobian{iSubject},2),... - nMeasurementsPerState(iSubject),nStates )); - - % check free energy - feBkp = feCurrent; - feAuxBkp = feAux; - [feCurrent,feAux] = tapas_huge_nfe(counts,priors,posterior,... - feAux,iSubject); - - % if free energy decreases or response/jacobian contains NaNs - % cancel update and restore old values - if feCurrent < feBkp || ... - fnc_check_response(respError{iSubject},... - respJacobian{iSubject}) - - posterior.dcmMean(iSubject,:) = dcmMeanBkp(iSubject,:); - posterior.dcmSigma(:,:,iSubject) = dcmSigmaBkp(:,:,iSubject); - posterior.logDetPostDcmSigma(iSubject) = ... - logDetDcmSigmaBkp(iSubject); - - respError{iSubject} = respErrorBkp{iSubject}; - respJacobian{iSubject} = respJacBkp{iSubject}; - posterior.modifiedSumSqrErr(iSubject,:) = ... - sumSqErrBkp(iSubject,:); - feCurrent = feBkp; - feAux = feAuxBkp; - - else - nItSubject(iSubject) = nItSubject(iSubject) + 1; - end - end - - % noise precision update - noiseInvScaleBkp = posterior.noiseInvScale; - meanNoisePrecisionBkp = posterior.meanNoisePrecision; - - posterior.noiseInvScale = bsxfun(@plus,... %%% b_nr - posterior.modifiedSumSqrErr/2,... - priors.noiseInvScale); - posterior.meanNoisePrecision = ... - posterior.noiseShape./posterior.noiseInvScale; %%% bar(lambda)_nr - - % check free energy - feBkp = feCurrent; - feCurrent = tapas_huge_nfe(counts,priors,posterior); - if feCurrent < feBkp - - posterior.noiseInvScale = noiseInvScaleBkp; - posterior.meanNoisePrecision = meanNoisePrecisionBkp; - feCurrent = feBkp; %#ok - - end - - - - - - - -%-------------------- - % save complete history of parameters and important auxiliary variables - if bKeepTrace - histClustersMean{iIteration} = posterior.clustersMean; - histClustersSigma{iIteration} = posterior.clustersSigma; - histClustersTau{iIteration} = posterior.clustersTau; - histClustersDeg{iIteration} = posterior.clustersDeg; - - histDcmMean{iIteration} = posterior.dcmMean; - histDcmSigma{iIteration} = posterior.dcmSigma; - - histNoiseInvScale{iIteration} = posterior.noiseInvScale; - - histposterior.softAssign{iIteration} = posterior.softAssign; - histPartialDcmMean{iIteration} = partialDcmMean; - histPartialDcmPrec{iIteration} = partialDcmPrec; - if bKeepResp - histRespError{iIteration} = respError; - histRespJacobian{iIteration} = respJacobian; - end - - histFreeEnergy{iIteration} = freeEnergy; - histFeParts{iIteration} = feParts; - timeSinceStart{iIteration} = toc; - end - - - -%------------------- - - [feCurrent,feAux] = tapas_huge_nfe(counts,priors,posterior); - % check stopping condition - dF = feCurrent - freeEnergy; - freeEnergy = feCurrent; - histFe(iIteration) = freeEnergy; - if bVerbose - display(['iteration ' num2str(iIteration) ... - ', dF: ' num2str(dF)]); - end - - if itSatDcm > nIterations - if dF < schedule.dfDcm - itSatDcm = iIteration; - end - elseif itSatClusters > nIterations - if dF < schedule.dfClusters - itSatClusters = iIteration; - if bCovFactor - [priors, posterior] = fnc_reset_cov(priors,posterior,... - DcmResults,DcmInfo,nDcmParamsInfCon,nDcmParamsInfAll); - end - end - else - if (iIteration>=itSatClusters+schedule.itReturn) && (dF < epsEnergy) - break; - end - end - - -end - - - -%------------------------ End: Main loop ------------------------------ -%% save results -DcmResults.posterior = posterior; - -% save other info: number of actual iterations etc -DcmResults.freeEnergy = freeEnergy; -DcmResults.nIterationsActual = iIteration; -DcmResults.nIterationsSubject = nItSubject; -DcmResults.inversionScheme = 'VB'; - -% save prediction and residual -predictedResponse = cell(nSubjects,1); -for iSubject = 1:nSubjects - predictedResponse{iSubject} = ... - fnGenerateResponse(posterior.dcmMean(iSubject,:).',... - dcmParametersDefault,... - idxParamsInf,... - idxSelfCon,... - DcmInfo, iSubject); -end -DcmResults.predictedResponse = predictedResponse; -DcmResults.residuals = respError; - -DcmResults.histFe = histFe(1:iIteration); -DcmResults.itSatDcm = itSatDcm; -DcmResults.itSatClusters = itSatClusters; - - - -% save history of important variables -if bKeepTrace - % note: 'DcmResults.debug.trace' will be an array of structs not a - % struct of arrays - DcmResults.debug.trace = struct(... - 'clustersMean',histClustersMean(1:iIteration), ... - 'clustersSigma',histClustersSigma(1:iIteration), ... - 'clustersTau',histClustersTau(1:iIteration), ... - 'clustersDeg',histClustersDeg(1:iIteration), ... - 'dcmMean',histDcmMean(1:iIteration), ... - 'dcmSigma',histDcmSigma(1:iIteration), ... - 'noiseInvScale',histNoiseInvScale(1:iIteration), ... - 'posterior.softAssign',histposterior.softAssign(1:iIteration), ... - 'partialDcmMean',histPartialDcmMean(1:iIteration), ... - 'partialDcmPrec',histPartialDcmPrec(1:iIteration), ... - 'freeEnergy',histFreeEnergy(1:iIteration), ... - 'feParts',histFeParts(1:iIteration), ... - 'timeSinceStart',timeSinceStart(1:iIteration)); - DcmResults.debug.idxDcmParamsInfer = idxParamsInf; - DcmResults.debug.idxSelfCon = idxSelfCon; - DcmResults.debug.nParameters = nParameters; - - if bKeepResp - DcmResults.debug.resp = struct(... - 'responseError',histRespError(1:iIteration), ... - 'responseJacobian',histRespJacobian(1:iIteration)); - end -end - -end - - - - -function [ bError ] = fnc_check_response( response, jacobian ) -% function [ bError ] = dcm_fmri_check_response( response, jacobian ) -% Checks for NaNs and Infs in DCM response and jacobian matrix. - -bError = any(isnan(response(:))) || any(isinf(response(:))) || ... - any(isnan(jacobian(:))) || any(isinf(jacobian(:))); - -end - - -function [ normWeights ] = fnc_exp_norm(logWeights) -% exponentiate and normalize log weights -% subtract max of each row for numerical stability - -normWeights = exp(bsxfun(@minus,logWeights,max(logWeights,[],2))); -normWeights = bsxfun(@rdivide,normWeights,sum(normWeights,2)); - -end - - -function [priors, posterior] = fnc_reset_cov(priors,posterior,DcmResults,DcmInfo,nDcmParamsInfCon,nDcmParamsInfAll) - - priors.clustersSigma = DcmResults.priors.clustersSigma; - posterior.clustersSigma = repmat(priors.clustersSigma,... - [1,1,DcmResults.maxClusters]); - posterior.dcmSigma = ... - priors.clustersSigma/(priors.clustersDeg-DcmInfo.nConnections-1); - posterior.dcmSigma(nDcmParamsInfCon+1:nDcmParamsInfAll,... - nDcmParamsInfCon+1:nDcmParamsInfAll) = priors.hemSigma; - posterior.dcmSigma = repmat(posterior.dcmSigma,[1,1,DcmInfo.nSubjects]); - for iSubject = 1:DcmInfo.nSubjects - posterior.logDetPostDcmSigma(iSubject) = ... - tapas_util_logdet(posterior.dcmSigma(:,:,iSubject)); - end - -end - - -function [posterior] = fnc_set_cluster_cov(priors,posterior,kmeansIdx,nAssign) - - [nClusters,dimClusters] = size(posterior.clustersMean); - nSubjects = size(posterior.dcmMean,1); - - posterior.alpha = priors.alpha + nAssign; - posterior.clustersTau = priors.clustersTau + nAssign; - posterior.clustersDeg = priors.clustersDeg + nAssign; - - for iCluster = 1:nClusters - - S = zeros(size(priors.clustersSigma)); - for iSubject = 1:nSubjects - if kmeansIdx(iSubject) == iCluster - n = posterior.dcmMean(iSubject,1:dimClusters) - ... - posterior.clustersMean(iCluster,:); - S = S + n'*n; - end - end - - m = posterior.clustersMean(iCluster,:) - priors.clustersMean; - posterior.clustersSigma(:,:,iCluster) = priors.clustersSigma + ... - S + nAssign(iCluster)*priors.clustersTau/... - (nAssign(iCluster) + priors.clustersTau)*(m'*m); - - end - -end \ No newline at end of file diff --git a/huge/tapas_huge_invert.m b/huge/tapas_huge_invert.m index 635156fc..b16f535a 100644 --- a/huge/tapas_huge_invert.m +++ b/huge/tapas_huge_invert.m @@ -1,5 +1,8 @@ -%% [DcmResults] = tapas_huge_invert(DCM, K, priors, verbose, randomize, seed) -% +function [DcmResults] = tapas_huge_invert(DCM, K, priors, verbose, randomize, seed) +% WARNING: This function is deprecated and will be removed in a future +% version of this toolbox. Please use the new object-oriented interface +% provided by the tapas_Huge class. +% % Invert hierarchical unsupervised generative embedding (HUGE) model. % % INPUT: @@ -19,14 +22,12 @@ % of REF [1]) % hemMean: prior mean of hemodynamic parameters (mu_h in Fig.1 % of REF [1]) -% hemSigma: prior covariance of hemodynamic parameters(Sigma_h +% hemSigma: prior covariance of hemodynamic parameters (Sigma_h % in Fig.1 of REF [1]) % noiseInvScale: prior inverse scale of observation noise (b_0 in % Fig.1 of REF [1]) % noiseShape: prior shape parameter of observation noise (a_0 in % Fig.1 of REF [1]) -% (you may use tapas_huge_build_prior(DCM) to generate this -% struct) % verbose - activates command line output (prints free energy % difference, default: false) % randomize - randomize starting values (default: false). WARNING: @@ -62,121 +63,101 @@ % noise (lambda_n,r in Eq.(23) of REF [1]) % modifiedSumSqrErr: b'_n,r in Eq.(22) of REF [1] % -% REFERENCE: -% [1] Yao Y, Raman SS, Schiek M, Leff A, Frssle S, Stephan KE (2018). -% Variational Bayesian Inversion for Hierarchical Unsupervised -% Generative Embedding (HUGE). NeuroImage, 179: 604-619 +% See also tapas_Huge, tapas_Huge.estimate, tapas_huge_demo % -% https://doi.org/10.1016/j.neuroimage.2018.06.073 -% % Author: Yu Yao (yao@biomed.ee.ethz.ch) -% Copyright (C) 2018 Translational Neuromodeling Unit +% Copyright (C) 2019 Translational Neuromodeling Unit % Institute for Biomedical Engineering, % University of Zurich and ETH Zurich. % % This file is part of TAPAS, which is released under the terms of the GNU % General Public Licence (GPL), version 3. For further details, see -% . +% . +% +% This software is provided "as is", without warranty of any kind, express +% or implied, including, but not limited to the warranties of +% merchantability, fitness for a particular purpose and non-infringement. % % This software is intended for research only. Do not use for clinical -% purpose. Please note that this toolbox is in an early stage of -% development. Considerable changes are planned for future releases. For -% support please refer to: +% purpose. Please note that this toolbox is under active development. +% Considerable changes may occur in future releases. For support please +% refer to: % https://github.com/translationalneuromodeling/tapas/issues -% -function [DcmResults] = tapas_huge_invert(DCM, K, priors, verbose, randomize, seed) -%% check input -if nargin >= 6 - rng(seed); -else - seed = rng(); -end +% + + +wnMsg = ['This function is deprecated and will be removed in a future ' ... + 'version of this toolbox. Please use the new object-oriented ' ... + 'interface provided by the tapas_Huge class.']; +warning('tapas:huge:deprecated',wnMsg) -if ~isfield(DCM,'listBoldResponse') +%% check input +if isvector(DCM)&&isstruct(DCM) try - DcmInfo = tapas_huge_import_spm(DCM); - catch err - disp('tapas_huge_invert: Unsupported format.'); - disp('Use cell array of DCM in SPM format as first input.'); - rethrow(err); + DCM = {DCM(:).DCM}'; + catch + DCM = num2cell(DCM); end else - DcmInfo = DCM; + assert(iscell(DCM),'TAPAS:HUGE:inputFormat',... + 'DCM must be cell array of DCMs in SPM format'); +end + +%% settings +opts = {'K', K}; +opts = [opts, {'Dcm', DCM}]; + +if nargin >= 6 + opts = [opts, {'Seed', seed}]; end -if nargin < 5 - randomize = false; +if nargin >= 5 + opts = [opts, {'Randomize', randomize}]; end -if nargin < 4 - verbose = false; +if nargin >= 4 + opts = [opts, {'Verbose', verbose}]; end -if nargin < 3 - priors = tapas_huge_build_prior(DcmInfo); +if nargin >= 3 + dcm = DCM{1}; + nConnections = nnz([dcm.a(:);dcm.b(:);dcm.c(:);dcm.d(:)]); + priors.clustersSigma = priors.clustersSigma/... + (priors.clustersDeg - nConnections - 1); + + opts = [opts, {'PriorVarianceRatio', priors.clustersTau, ... + 'PriorDegree', priors.clustersDeg, ... + 'PriorClusterVariance', priors.clustersSigma, ... + 'PriorClusterMean', priors.clustersMean}]; end assert(K>0,'TAPAS:HUGE:clusterSize',... 'Cluster size K must to be positive integer'); -% compile integrator -tapas_huge_compile(); +%% invert model +obj = tapas_Huge(opts{:}); +obj = obj.estimate(); - -%% settings -DcmResults = struct(); +DcmResults.freeEnergy = obj.posterior.nfe; DcmResults.maxClusters = K; -DcmResults.priors = priors; - -% variational parameters -% stopping criterion: minimum increase in free energy -DcmResults.epsEnergy = 1e-5; -% stopping cirterion: maximum number of iterations -DcmResults.nIterations = 1e3; - -% computational and technical parameters -% method for calculating jacobian matrix -DcmResults.fnJacobian = @tapas_huge_jacobian; -% small constant to be added to the diagonal of inv(postDcmSigma) for -% numerical stability -DcmResults.diagConst = 1e-10; -% keep history of parameters and important auxiliary variables -DcmResults.bKeepTrace = false; -% keep history of response related auxiliary variables -% has no effect if bKeepTrace is false -DcmResults.bKeepResp = false; -DcmResults.bVerbose = verbose; - -% set update schedule -DcmResults.schedule.dfDcm = 50; -DcmResults.schedule.dfClusters = 10; -DcmResults.schedule.itAssignment = 1; -DcmResults.schedule.itCluster = 1; -DcmResults.schedule.itReturn = 5; -DcmResults.schedule.itKmeans = 1; - - -%% randomize starting values -if randomize - init = struct(); - init.dcmMean = repmat([DcmResults.priors.clustersMean,... - DcmResults.priors.hemMean], DcmInfo.nSubjects, 1); - init.dcmMean = init.dcmMean + randn(size(init.dcmMean))*.05; - - init.clustersMean = repmat(... - DcmResults.priors.clustersMean, DcmResults.maxClusters,1); - init.clustersMean = init.clustersMean + ... - randn(size(init.clustersMean))*.05; - DcmResults.init = init; -end - - -%% call VB inversion -DcmResults = tapas_huge_inv_vb(DcmInfo, DcmResults); - -DcmResults.seed = seed; -DcmResults.ver = '201903'; +DcmResults.rngSeed = obj.posterior.seed; +DcmResults.posterior = struct( ... + 'alpha', obj.posterior.alpha, ... + 'softAssign', obj.posterior.q_nk, ... + 'clustersMean' , obj.posterior.m , ... + 'clustersTau', obj.posterior.tau , ... + 'clustersDeg' , obj.posterior.nu , ... + 'clustersSigma' , obj.posterior.S , ... + 'logDetClustersSigma', [] , ... + 'dcmMean', obj.posterior.mu_n , ... + 'dcmSigma', obj.posterior.Sigma_n , ... + 'logDetPostDcmSigma', [] , ... + 'noiseShape', obj.posterior.a, ... + 'noiseInvScale', obj.posterior.b , ... + 'meanNoisePrecision', obj.posterior.a./obj.posterior.b , ... + 'modifiedSumSqrErr', []); +DcmResults.residuals = obj.trace.epsilon; end diff --git a/huge/tapas_huge_jacobian.m b/huge/tapas_huge_jacobian.m deleted file mode 100644 index 5a476225..00000000 --- a/huge/tapas_huge_jacobian.m +++ /dev/null @@ -1,73 +0,0 @@ -%% [ J ] = tapas_huge_jacobian( fnFunction, argument, params, ~, varargin ) -% -% Calculates the jacobian matrix of a function via central differences -% -% INPUT: -% fnFunction - handle to function -% argument - argument at which the jacobian is calculated -% params - struct containing parameters like step-size, etc. -% ~ - a dummy input -% -% Optional: -% varargin - additional arguments of function -% -% OUTPUT: -% J - the jacobian matrix -% - -% Author: Yu Yao (yao@biomed.ee.ethz.ch) -% Copyright (C) 2018 Translational Neuromodeling Unit -% Institute for Biomedical Engineering, -% University of Zurich and ETH Zurich. -% -% This file is part of TAPAS, which is released under the terms of the GNU -% General Public Licence (GPL), version 3. For further details, see -% . -% -% This software is intended for research only. Do not use for clinical -% purpose. Please note that this toolbox is in an early stage of -% development. Considerable changes are planned for future releases. For -% support please refer to: -% https://github.com/translationalneuromodeling/tapas/issues -% -function [ J ] = tapas_huge_jacobian( fnFunction, argument, params, ~, varargin ) - -[dimIn,~] = size(argument); -dimOut = params.dimOut; - -J = zeros(dimOut,dimIn); - -if isfield(params,'stepSize') - stepSize = params.stepSize; -else - stepSize = 1e-3; % default step size -end -if isscalar(stepSize) - stepSize = repmat(stepSize,dimIn,1); -end - -for idxIn = 1:dimIn - - currentArgument = argument; - currentArgument(idxIn) = currentArgument(idxIn) + stepSize(idxIn); - valuePlus = fnFunction(currentArgument,varargin{:}); - - currentArgument = argument; - currentArgument(idxIn) = currentArgument(idxIn) - stepSize(idxIn); - valueMinus = fnFunction(currentArgument,varargin{:}); - - J(:,idxIn) = (valuePlus - valueMinus)/2/stepSize(idxIn); - -end - -% if requested, switch to denominator layout (gradient is a column vector) -% default: numerator layout (gradient is a row vector) -if isfield(params,'denominatorLayout')&¶ms.denominatorLayout - J = J.'; -end - - - -end - - diff --git a/huge/tapas_huge_logdet.m b/huge/tapas_huge_logdet.m new file mode 100644 index 00000000..89667f4e --- /dev/null +++ b/huge/tapas_huge_logdet.m @@ -0,0 +1,39 @@ +function [ld] = tapas_huge_logdet(A) +% Numerical stable calculation of log-determinant for positive-definite +% matrix. +% +% INPUT: +% A - Positive definite matrix. +% +% OUTPUT: +% ld - log(det(A)) +% +% EXAMPLE: +% ld = TAPAS_HUGE_LOGDET(eye(3)) Calculate log-determinant of 3x3 +% identity matrix. +% + +% Author: Yu Yao (yao@biomed.ee.ethz.ch) +% Copyright (C) 2019 Translational Neuromodeling Unit +% Institute for Biomedical Engineering, +% University of Zurich and ETH Zurich. +% +% This file is part of TAPAS, which is released under the terms of the GNU +% General Public Licence (GPL), version 3. For further details, see +% . +% +% This software is provided "as is", without warranty of any kind, express +% or implied, including, but not limited to the warranties of +% merchantability, fitness for a particular purpose and non-infringement. +% +% This software is intended for research only. Do not use for clinical +% purpose. Please note that this toolbox is under active development. +% Considerable changes may occur in future releases. For support please +% refer to: +% https://github.com/translationalneuromodeling/tapas/issues +% + +U = chol(A); +ld = 2*sum(log(diag(U))); + +return; \ No newline at end of file diff --git a/huge/tapas_huge_logit.m b/huge/tapas_huge_logit.m new file mode 100644 index 00000000..6d7b6453 --- /dev/null +++ b/huge/tapas_huge_logit.m @@ -0,0 +1,37 @@ +function [ y ] = tapas_huge_logit( x ) +% Numerical stable calculation of logit function. +% +% INPUTS: +% x - Array of double. +% +% OUTPUTS: +% y - logit of x. +% + +% Author: Yu Yao (yao@biomed.ee.ethz.ch) +% Copyright (C) 2019 Translational Neuromodeling Unit +% Institute for Biomedical Engineering, +% University of Zurich and ETH Zurich. +% +% This file is part of TAPAS, which is released under the terms of the GNU +% General Public Licence (GPL), version 3. For further details, see +% . +% +% This software is provided "as is", without warranty of any kind, express +% or implied, including, but not limited to the warranties of +% merchantability, fitness for a particular purpose and non-infringement. +% +% This software is intended for research only. Do not use for clinical +% purpose. Please note that this toolbox is under active development. +% Considerable changes may occur in future releases. For support please +% refer to: +% https://github.com/translationalneuromodeling/tapas/issues +% + +y = log(x./(1-x)); +y(y == Inf) = realmax; +y(y == -Inf) = -realmin; + + +end + diff --git a/huge/tapas_huge_manual.pdf b/huge/tapas_huge_manual.pdf new file mode 100644 index 0000000000000000000000000000000000000000..62bfd6e759214c7823c444bf0e570473fd567c0d GIT binary patch literal 285025 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

i7psQP}q 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

&HhZx|)-7lMt} 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

Cv1kkBRgo0Ot^UBH@96mPi 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 P0noCMnVHK(SEK&|779MM literal 0 HcmV?d00001 diff --git a/huge/tapas_huge_manual.tex b/huge/tapas_huge_manual.tex new file mode 100644 index 00000000..e974ae9f --- /dev/null +++ b/huge/tapas_huge_manual.tex @@ -0,0 +1,1038 @@ + +% This LaTeX was auto-generated from MATLAB code. +% To make changes, update the MATLAB code and republish this document. + +\documentclass{article} +\usepackage{graphicx} +\usepackage[table]{xcolor} +\usepackage[utf8]{inputenc} +\usepackage{natbib} +\usepackage{lmodern} +\usepackage{enumitem} + +\sloppy +\definecolor{lgray}{gray}{0.65} +\definecolor{llgray}{gray}{0.85} +\setlength{\parindent}{0pt} +\setlength\arrayrulewidth{0.8pt} + + +\title{User Manual Hierarchical Unsupervised Generative Embedding} +\author{\\Yu Yao\\% +\\Translational Neuromodeling Unit\\% +Institute for Biomedical Engineering\\% +University of Zurich \& ETH Zurich} +\begin{document} +\maketitle + +\tableofcontents + + + +\section{Introduction} + +\begin{par} +This document contains the user guide for the HUGE toolbox, which is part of TAPAS (Translational Algorithms for Psychiatry-Advancing Science), a collection of tools developed at the Translational Neuromodeling Unit, Zurich. This guide provides a detailed documentation of the user interface of the HUGE toolbox. To get started quickly, you may run the examples in the demo script \texttt{tapas\_huge\_demo.mlx}. +\end{par} \vspace{1em} +\begin{par} +HUGE stands for Hierarchical Unsupervised Generative Embedding. It is a generative model for (task-based) fMRI data. It can be used to stratify heterogeneous cohorts into subgroups or learn the prior distribution of DCM parameters from data via empirical Bayes. For more details on the theory behind the HUGE model, please refer to \cite{yao2018}. +\end{par} \vspace{1em} +\begin{par} +To use this toolbox, change your current working directory to the directory that contains the \texttt{@tapas\_Huge} folder or add this directory to your Matlab path. +\end{par} \vspace{1em} + + +\section{The \texttt{tapas\_Huge} Class} + +\begin{par} +This toolbox implements the HUGE model as a Matlab class called \texttt{tapas\_Huge}. Data, options and results are stored in class properties, while the main functionalities of the toolbox are provided by class methods. Additional functionalities are provided by regular Matlab functions. +\end{par} \vspace{1em} +\begin{par} +Instances of the \texttt{tapas\_Huge} class are created by calling the class constructor \texttt{tapas\_Huge()}. The constructor is a function that can be called without arguments, which creates an empty \texttt{tapas\_Huge} object: +\end{par} +\begin{verbatim}obj = tapas_Huge()\end{verbatim} +\begin{par} +However, the constructor also accepts optional arguments in the form of name-value pairs. For example, one can add a short description using the \texttt{Tag} property +\end{par} +\begin{verbatim}obj = tapas_Huge('Tag','my model')\end{verbatim} +\begin{par} +or import data using the \texttt{Dcm} property +\end{par} +\begin{verbatim}obj = tapas_Huge('Dcm',dcms)\end{verbatim} +\begin{par} +For more examples, see the demo script \texttt{tapas\_huge\_demo.mlx}. +\end{par} \vspace{1em} + + +\section{Class Properties} + +\begin{par} +Each instance of the \texttt{tapas\_Huge} class stores data, options and results in class properties, which are documented below. Properties can be accessed using dot notation: +\end{par} +\begin{verbatim}value = obj.property\end{verbatim} +\begin{par} +where \texttt{obj} is a class instance and \texttt{property} is the name of the property. +\end{par} \vspace{1em} +\begin{par} +Note that all properties, except for \texttt{K} (the number of clusters) and \texttt{tag} are read only, i.e. they cannot be changed by the user directly. Instead, their value is set automatically when importing data using the \texttt{import} method or inverting the model using the \texttt{estimate} method. +\end{par} \vspace{1em} +\begin{par} +Below is a list of all properties of the \texttt{tapas\_Huge} class. +\end{par} \vspace{1em} + + +\subsection*{ \texttt{K}} + +\begin{par} +A scalar integer containing the number of clusters of the HUGE model. +\end{par} \vspace{1em} + + +\subsection*{ tag} + +\begin{par} +A character array that can be used for storing a short description of the model. +\end{par} \vspace{1em} + + +\subsection*{ \texttt{L}} + +\begin{par} +A scalar integer containing the number of experimental inputs (i.e., the dimensionality of \texttt{obj.inputs.u}). +\end{par} \vspace{1em} + + +\subsection*{ \texttt{M}} + +\begin{par} +A scalar integer containing the number of group-level confound variables (like age, sex, handedness, etc). +\end{par} \vspace{1em} + + +\subsection*{ \texttt{N}} + +\begin{par} +A scalar integer containing the number of subjects. Permissions: read only. +\end{par} \vspace{1em} + + +\subsection*{ \texttt{R}} + +\begin{par} +A scalar integer containing the number of brain regions in the model. +\end{par} \vspace{1em} + + +\subsection*{ \texttt{idx}} + +\begin{par} +A Matlab struct storing parameter indices with the following fields: +\end{par} \vspace{1em} +\begin{itemize}[align=parleft, labelsep=10ex, leftmargin=15ex] +\setlength{\itemsep}{-1ex} + \item [ \texttt{clustering} ] Vector of indices of DCM parameters used for clustering. + \item [ \texttt{homogenous} ] Vector of indices of homogenous parameters. I.e. DCM parameters which are estimated but not used for clustering. + \item [ \texttt{P\_c} ] Number of clustering parameters. + \item [ \texttt{P\_c} ] Number of homogeneous parameters. + \item [ \texttt{P\_f} ] Number of parameters in a fully connected DCM with the same number of regions as the current one. +\end{itemize} + + +\subsection*{ \texttt{dcm}} + +\begin{par} +A Matlab struct in SPM's DCM format containing the DCM network structure. +\end{par} \vspace{1em} + + +\subsection*{ \texttt{inputs}} + +\begin{par} +A struct array containing the experimental stimuli for all subject, with two fields: +\end{par} \vspace{1em} +\begin{itemize}[align=parleft, labelsep=10ex, leftmargin=15ex] +\setlength{\itemsep}{-1ex} + \item [ \texttt{u} ] Array containing experimental stimuli. + \item [ \texttt{dt} ] Sampling time interval. +\end{itemize} + + +\subsection*{ \texttt{data}} + +\begin{par} +A struct array containing the fMRI data for all subjects, with fields: +\end{par} \vspace{1em} +\begin{itemize}[align=parleft, labelsep=10ex, leftmargin=15ex] +\setlength{\itemsep}{-1ex} + \item [ \texttt{bold} ] Array containing the BOLD time series. + \item [ \texttt{te} ] The echo time (TE). + \item [ \texttt{tr} ] The repetition time TR. + \item [ \texttt{X0} ] Vector containing subject-level confounds. + \item [ \texttt{res} ] The residual forming matrix of X0. + \item [ \texttt{confounds} ] Vector containing the group-level confounds (e.g., sex, age, etc). + \item [ \texttt{spm} ] A struct containing the posterior from SPM (The Ep field in SPM's DCM format). +\end{itemize} + + +\subsection*{ \texttt{labels}} + +\begin{par} +A struct containing names for regions and inputs. +\end{par} \vspace{1em} + + +\subsection*{ \texttt{options}} + +\begin{par} +A struct storing options for the HUGE model. Note: Set options using name-value pair arguments with the \texttt{taps\_huge} and \texttt{estimate} methods. +\end{par} \vspace{1em} + + +\subsection*{ \texttt{prior}} + +\begin{par} +A struct storing priors of the HUGE model. Note: Set priors using name-value pair arguments with the \texttt{taps\_huge} and \texttt{estimate} methods. +\end{par} \vspace{1em} + + +\subsection*{ \texttt{posterior}} + +\begin{par} +A struct storing the estimation results. The fields correspond to the parameters of the posterior distribution (see\cite{yao2018}). +\end{par} \vspace{1em} +\begin{itemize}[align=parleft, labelsep=10ex, leftmargin=15ex] +\setlength{\itemsep}{-1ex} + \item [ \texttt{alpha} ] Vector of posterior cluster weights ($\alpha$). + \item [ \texttt{m} ] Array of posterior cluster means ($m$). + \item [ \texttt{tau} ] Vector containing the $\tau$ parameter of the inverse-Wishart posterior distribution. + \item [ \texttt{nu} ] Vector of posterior degree of freedom parameters ($\nu$). + \item [ \texttt{S} ] Array containing the scale matrices of the inverse-Wishart posterior distribution ($S$). + \item [ \texttt{q\_nk} ] Array of posterior assignment probabilities ($q_{nk}$). + \item [ \texttt{mu\_n} ] Array of posterior mean subject-level DCM parameters ($\mu_n$). + \item [ \texttt{Sigma\_n} ] Array of posterior covariances of subject-level DCM parameters ($\Sigma_n$). + \item [ \texttt{b} ] Vector containing the $b$ parameter of the posterior Gamma distribution over noise precision. + \item [ \texttt{a} ] Vector containing the $a$ parameter of the posterior Gamma distribution over noise precision. + \item [ \texttt{m\_beta} ] When using group-level confounds, array containing posterior mean of coefficients, ($m_{\beta}$). Otherwise, empty array. + \item [ \texttt{S\_beta} ] When using group-level confounds, array containing posterior covariance of coefficients ($S_{\beta}$). Otherwise, empty array. + \item [ \texttt{nfe} ] The negative free energy ($F$). + \item [ \texttt{mu\_r} ] When using group-level confounds, array containing posterior mean of residual DCM parameters, ($m_r$). Otherwise, empty array. + \item [ \texttt{Sigma\_r} ] When using group-level confounds, array containing posterior covariance of residual DCM parameters, ($S_r$). Otherwise, empty array. + \item [ \texttt{nrv} ] Normalized residual variance. An array containing the amount of non-explained variance (1 minus variance explained) per subject and per region. + \item [ \texttt{bPurity} ] When using synthetic data, balanced purity of estimation result. + \item [ \texttt{method} ] Character array indicating inversion method. + \item [ \texttt{version} ] Character array indicating toolbox version. + \item [ \texttt{seed} ] Random number generator seed. +\end{itemize} + + +\subsection*{ \texttt{trace}} + +\begin{par} +A struct containing convergence diagnostics, with fields: +\end{par} \vspace{1em} +\begin{itemize}[align=parleft, labelsep=10ex, leftmargin=15ex] +\setlength{\itemsep}{-1ex} + \item [ \texttt{nfe} ] Vector containing the history of the negative free energy during iterative VB inversion. + \item [ \texttt{nDcmUpdate} ] Vector containing the number of times the subject-level DCM parameter update was accepted. + \item [ \texttt{convergence} ] The number of iterations it took VB to converge. + \item [ \texttt{kmeans} ] Struct containing information about the K-means initialization step. + \item [ \texttt{epsilon} ] Cell array containing the residual (observed minus predicted BOLD time series) for each subject at convergence. +\end{itemize} + + +\subsection*{ \texttt{aux}} + +\begin{par} +A struct used for storing auxiliary variables during model estimation. +\end{par} \vspace{1em} + + +\subsection*{ \texttt{model}} + +\begin{par} +When using the model to simulate data, this struct contains the model parameters used for generating the synthetic dataset. Fields correspond to HUGE model parameters: +\end{par} \vspace{1em} +\begin{itemize}[align=parleft, labelsep=10ex, leftmargin=15ex] +\setlength{\itemsep}{-1ex} + \item [ \texttt{pi} ] Vector of cluster weights ($\pi$). + \item [ \texttt{d} ] Array of cluster labels in one-hot encoding ($d$). + \item [ \texttt{mu\_k} ] Array of cluster means ($\mu_k$). + \item [ \texttt{Sigma\_k} ] Array of cluster covariances ($\Sigma_k$). + \item [ \texttt{mu\_h} ] Vector containing mean of homogenous DCM parameters ($\mu_h$). + \item [ \texttt{Sigma\_h} ] Array containing covariance of homogenous DCM parameters ($\Sigma_h$). + \item [ \texttt{theta\_c} ] Array of clustering DCM parameters ($\theta_c$). + \item [ \texttt{theta\_h} ] Array of homogenous DCM parameters ($\theta_h$). + \item [ \texttt{lambda} ] Array of measurement noise precisions ($\lambda$). + \item [ \texttt{x\_n} ] Array of group-level confounds (e.g. age, sex, etc. $x_n$). + \item [ \texttt{beta} ] Array of confound coefficients ($\beta$). + \item [ \texttt{options} ] Struct containing options for simulation. + \item [ \texttt{seed} ] Random number generator seed. +\end{itemize} + + +\subsection*{ \texttt{constants}} + +\begin{par} +Struct storing constants used by the model. +\end{par} \vspace{1em} + + +\subsection*{ \texttt{version}} + +\begin{par} +Character array indicating toolbox version. +\end{par} \vspace{1em} + + +\section{Class Methods} + +\begin{par} +The main functionalities of the HUGE toolbox are implemented as methods of the \texttt{tapas\_Huge} class. These methods are documented below. There are two equivalent ways to call class methods: +\end{par} +\begin{verbatim}obj = obj.method( ... )\end{verbatim} +\begin{par} +or +\end{par} +\begin{verbatim}obj = method( obj, ... )\end{verbatim} +\begin{par} +where \texttt{obj} is an instance of the \texttt{tapas\_Huge} class and \texttt{method} is the class method you want to call. +\end{par} \vspace{1em} + + +\subsection*{ \texttt{tapas\_Huge.estimate}} + + \begin{verbatim} Estimate parameters of the HUGE model. + + INPUTS: + obj - A tapas_Huge object containing fMRI time series. + + OPTIONAL INPUTS: + This function accepts optional name-value pair arguments. For a list of + valid name-value pairs, see the user manual or type 'help + tapas_huge_property_names'. + + OUTPUTS: + obj - A tapas_Huge object containing the estimation result in the + 'posterior' property. + + EXAMPLES: + [obj] = ESTIMATE(obj) Invert the HUGE model stored in obj. + + [obj] = ESTIMATE(obj, 'K', 2) Set the number of clusters to 2 and + invert the HUGE model stored in obj. + + [obj] = ESTIMATE(obj, 'Verbose', true) Print progress of estimation + to command line. + + [obj] = ESTIMATE(obj, 'Dcm', dcms, 'OmitFromClustering', 1) Import + data stored in 'dcms' and omit self-connections from clustering. + + See also TAPAS_HUGE_DEMO + + +\end{verbatim} \color{black} + \begin{par} +Note that the HUGE toolbox uses a parameterization such that the DCM networks are self-inhibiting by default. This is achieved by subtracting 0.5 from the self-connections. Hence, specifying a prior mean of zero for all DCM connections implies that the effective self-connectivity is -0.5. This parametrization has been chosen for the convenience of the user, since it eliminates the need to identify the position of the self-connections in the parameter vector. +\end{par} \vspace{1em} + + +\subsection*{ \texttt{tapas\_Huge.simulate}} + + \begin{verbatim} Generate synthetic task-based fMRI time series data, using HUGE as a + generative model. + + INPUTS: + obj - A tapas_Huge object. + clusters - A cell array containing DCM structs in SPM's DCM format, + indicating the DCM network structure and cluster mean + parameters. + sizes - A vector containing the number of subjects for each cluster. + + OPTIONAL INPUTS: + This function accepts optional name-value pair arguments. For a list of + valid name-value pairs, see examples below. + + OUTPUTS: + obj - A tapas_Huge object containing the simulated fMRI time series in + its 'data' property and the ground truth parameters in its + 'model' property. + + EXAMPLES: + [obj] = SIMULATE(obj,clusters,sizes) Simulate fMRI time series with + cluster mean parameters given in 'clusters' and number of subjects + given in 'sizes'. + + [obj] = SIMULATE(obj,clusters,sizes,'Snr',1) Set signal-to-noise + ratio of fMRI data to 1. + + [obj] = SIMULATE(obj,clusters,sizes,'NoiseFloor',0.1) Set minimum + noise variance to 0.1. + + [obj] = SIMULATE(obj,clusters,sizes,'confounds',confounds) Introduce + group-level confounds (like sex or age). + + [obj] = SIMULATE(obj,clusters,sizes,'beta',beta) Set coefficients + for group-level confounds. + + [obj] = SIMULATE(obj,clusters,sizes,'variant',2) Set confound + variant to 2 (i.e., clusters do not share confound coefficients). + + [obj] = SIMULATE(obj,clusters,sizes,'Inputs',U) Introduce subject- + specific experimental stimuli. 'U' must be an array or cell array + of structs with fields 'dt and 'u'. + + [obj] = SIMULATE(obj,clusters,sizes,'OmitFromClustering',omit) + Designate DCM parameters to be excluded from clustering model. + Excluded parameters still exist in the DCM network structure, but + are drawn from the same distribution for all subjects. 'omit' + should be a struct with fields a, b, c, and/or d which are bool + arrays with sizes matching the corresponding fields of the DCMs. If + omit is an array, it is interpreted as the field a. If omit is 1, + it is expanded to an identity matrix of suitable size. + + +\end{verbatim} \color{black} + + +\subsection*{ \texttt{tapas\_Huge.plot}} + + \begin{verbatim} Plot cluster and subject-level estimation result from HUGE model. + + INPUTS: + obj - A tapas_Huge object containing estimation results. + + OPTIONAL INPUTS: + subjects - A vector containing indices of subjects for which to plot + detailed results. + + OUTPUTS: + fHdl - Handle of first figure. + + See also tapas_Huge.ESTIMATE + + +\end{verbatim} \color{black} + + +\subsection*{ \texttt{tapas\_Huge.save}} + + \begin{verbatim} Save properties of HUGE object to mat file. + + INPUTS: + filename - File name. + obj - A tapas_Huge object. + OPTIONAL INPUTS: + Names of property to be saved. See examples below. + + EXAMPLES: + SAVE(filename,obj) Save properties of 'obj' as individual variables + file specified in 'filename'. + + SAVE(filename,obj,'options','posterior','prior') Only save the + 'options', 'posterior' and 'prior' properties of 'obj'. + + +\end{verbatim} \color{black} + + +\subsection*{ \texttt{tapas\_Huge.import}} + + \begin{verbatim} Import fMRI time series data into HUGE object. + + WARNING: Importing data into a HUGE object will delete any data and + results which are already stored in that object. + + INPUTS: + obj - A tapas_Huge object. + dcms - A cell array containing DCM structs in SPM's DCM format. + + OPTIONAL INPUTS: + confounds - Group-level confounds (e.g., age, sex, etc). 'confounds' + must be empty or an array with as many rows as there are + elements in 'dcm'. + omit - specifies DCM parameters which should be omitted from + clustering. Parameters omitted from clustering will still + be estimated, but under a static Gaussian prior. 'omit' + should be a struct with fields a, b, c, and/or d which are + bool arrays with sizes matching the corresponding fields of + the DCMs. If omit is an array, it is interpreted as the + field a. If omit is 1, it is expanded to an identity matrix + of suitable size. + append - bool, if true keep current fMRI time series and append new + data in 'dcms'. Note: estimation results will still be + deleted. + + OUTPUTS: + obj - A tapas_Huge object containing the imported data. + + EXAMPLES: + [obj] = IMPORT(obj,dcms) Import the fMRI time series and DCM + network structure stored in dcms into obj. + + [obj] = IMPORT(obj,dcms,confounds) Import group-level confounds + (like age or sex) in addition to fMRI data. + + [obj] = IMPORT(obj,dcms,[],1) Import fMRI data and network + structure. Exclude self-connections from clustering. + + See also tapas_Huge.REMOVE, tapas_Huge.EXPORT + + +\end{verbatim} \color{black} + + +\subsection*{ \texttt{tapas\_Huge.export}} + + \begin{verbatim} Export results and data from HUGE object to SPM's DCM format. + + INPUTS: + obj - A tapas_Huge object containing data. + + OUTPUTS: + dcms - A cell array containing DCM structs in SPM's DCM format. + confounds - An array containing group-level confounds (like age or + sex) if available. 'confounds' is an array with one row + per subject. + + EXAMPLES: + [dcms] = EXPORT(obj) Export fMRI time series and estimation results + stored in obj. + + [dcms,confounds] = EXPORT(obj) Also export group-level confounds + (like age or sex). + + See also tapas_Huge.IMPORT + + +\end{verbatim} \color{black} + + +\subsection*{ \texttt{tapas\_Huge.remove}} + + \begin{verbatim} Remove data (fMRI time series, confounds, DCM network structure, ... ) + and estimation results from HUGE object. + + INPUTS: + obj - A tapas_Huge object. + + OPTIONAL INPUTS: + idx - Only remove data of the subjects indicated in 'idx'. 'idx' must + be a vector containing numeric or logical array indices. + + OUTPUTS: + obj - A tapas_Huge object with data and results removed. + + EXAMPLES: + [obj] = REMOVE(obj) Remove results and data of all subjects. + + [obj] = REMOVE(obj,1:5) Remove results and data for first 5 + subjects. + + [obj] = REMOVE(obj,'all') is the same as [obj] = REMOVE(obj) + + [obj] = REMOVE(obj,0) is the same as [obj] = REMOVE(obj) + + See also tapas_Huge.IMPORT + + +\end{verbatim} \color{black} + + +\section{Name-Value Pair Arguments} + +\begin{par} +Both the class constructor \texttt{tapas\_Huge} and the method \texttt{estimate} accept optional arguments in the form of name-value pairs. Options set using name-value pair arguments are persistent across the lifetime of the object. Below is a list of valid name-value pairs that can be used with these two functions. +\end{par} \vspace{1em} +\begin{par} + +{\renewcommand{\arraystretch}{1.5} +\renewcommand{\tabcolsep}{0.2cm} +\begin{tabular}{|l|p{10cm}|} +\hline +\rowcolor{lgray} Name: & \verb+Confounds+ \\ +\hline +\rowcolor{llgray} Value: & double array\\ +\hline + \rowcolor{llgray} Description: & Specify confounds for group-level + analysis (e.g. age or sex) as double array with one row per subject and + one column per confound. Note: This property can only be used in + combination with the \verb+Dcm+ property.\\ +\rowcolor{llgray} & WARNING: This feature is experimental and has not +been extensively tested. +\\ +\hline +\end{tabular} +\vspace{1em} +\begin{tabular}{|l|p{10cm}|} +\hline +\rowcolor{lgray} Name: & \verb+ConfoundsVariant+ \\ +\hline +\rowcolor{llgray} Value: & \verb+'none'+ \ensuremath{|} \verb+'global'+ \ensuremath{|} \verb+'cluster'+ (default: \verb+'global'+ if confounds specified, \verb+'none'+ otherwise)\\ +\hline + \rowcolor{llgray} Description: & Determines how confounds enter model. \verb+'none'+: Confounds are not used. \verb+'global'+: Confounds enter global regression (variant 1). \verb+'cluster'+: Confounds enter cluster-specific regression (variant 2). +\\ +\hline +\end{tabular} +\vspace{1em} +\begin{tabular}{|l|p{10cm}|} +\hline +\rowcolor{lgray} Name: & \verb+Dcm+ \\ +\hline +\rowcolor{llgray} Value: & cell array of DCM structs in SPM format\\ +\hline + \rowcolor{llgray} Description: & Specify DCM structure and BOLD time series for all subjects as cell array with one DCM struct in SPM format per subject. +\\ +\hline +\end{tabular} +\vspace{1em} +\begin{tabular}{|l|p{10cm}|} +\hline +\rowcolor{lgray} Name: & \verb+K+ \\ +\hline +\rowcolor{llgray} Value: & positive integer (default: 1)\\ +\hline + \rowcolor{llgray} Description: & Number of clusters. +\\ +\hline +\end{tabular} +\vspace{1em} +\begin{tabular}{|l|p{10cm}|} +\hline +\rowcolor{lgray} Name: & \verb+Method+ \\ +\hline +\rowcolor{llgray} Value: & \verb+'VB'+\\ +\hline + \rowcolor{llgray} Description: & Name of inversion method specified as character array. VB: variational Bayes +\\ +\hline +\end{tabular} +\vspace{1em} +\begin{tabular}{|l|p{10cm}|} +\hline +\rowcolor{lgray} Name: & \verb+NumberOfIterations+ \\ +\hline +\rowcolor{llgray} Value: & positive integer (default: 999)\\ +\hline + \rowcolor{llgray} Description: & Maximum number of iterations of VB scheme. +\\ +\hline +\end{tabular} +\vspace{1em} +\begin{tabular}{|l|p{10cm}|} +\hline +\rowcolor{lgray} Name: & \verb+OmitFromClustering+ \\ +\hline +\rowcolor{llgray} Value: & array of logical \ensuremath{|} struct with fields \verb+a+, \verb+b+, \verb+c+ and \verb+d+ (default: empty struct)\\ +\hline + \rowcolor{llgray} Description: & Select DCM parameters to exclude from clustering. Parameters excluded from clustering will still be estimated, but under a static Gaussian prior. If input is array, it will be treated as the \verb+a+ field of a struct. Missing fields will be treated the same as arrays of \verb+false+. Note: This property can only be used in combination with the \verb+Dcm+ property. +\\ +\hline + \rowcolor{llgray} Example: & Exclude the self-connections from clustering: \\ + \rowcolor{llgray} & \verb+obj = obj.estimate('OmitFromClustering', 1);+ \\ + \rowcolor{llgray} & Exclude input strength from clustering: \\ + \rowcolor{llgray} & \verb+omit = struct('c',obj.dcm.c));+ \\ + \rowcolor{llgray} & \verb+obj = obj.estimate('OmitFromClustering', omit);+ \\ +\hline +\end{tabular} +\vspace{1em} +\begin{tabular}{|l|p{10cm}|} +\hline +\rowcolor{lgray} Name: & \verb+PriorClusterMean+ \\ +\hline +\rowcolor{llgray} Value: & \verb+'default'+ \ensuremath{|} row vector of double\\ +\hline + \rowcolor{llgray} Description: & Prior cluster mean. Scalar input will be expanded into vector. Default: \verb+[0, ... ,0]\verb+. +\\ +\hline +\end{tabular} +\vspace{1em} +\begin{tabular}{|l|p{10cm}|} +\hline +\rowcolor{lgray} Name: & \verb+PriorClusterVariance+ \\ +\hline +\rowcolor{llgray} Value: & \verb+'default'+ \ensuremath{|} symmetric, positive definite matrix of double\\ +\hline + \rowcolor{llgray} Description: & Prior mean of cluster covariances. Must be a symmetric, positive definite matrix. Scalar input will be expanded into diagonal matrix. Default: \verb+diag([0.01, ..., 0.01])+. +\\ +\hline +\end{tabular} +\vspace{1em} +\begin{tabular}{|l|p{10cm}|} +\hline +\rowcolor{lgray} Name: & \verb+PriorDegree+ \\ +\hline +\rowcolor{llgray} Value: & \verb+'default'+ \ensuremath{|} positive double\\ +\hline + \rowcolor{llgray} Description: & $\nu_0$ determines the prior precision of the cluster covariance. For VB, this is the degrees of freedom of the inverse-Wishart. Default: \verb+100+. +\\ +\hline +\end{tabular} +\vspace{1em} +\begin{tabular}{|l|p{10cm}|} +\hline +\rowcolor{lgray} Name: & \verb+PriorVarianceRatio+ \\ +\hline +\rowcolor{llgray} Value: & \verb+'default'+ \ensuremath{|} positive double\\ +\hline + \rowcolor{llgray} Description: & Ratio $\tau_0$ between prior mean cluster covariance and prior covariance over cluster mean. Prior covariance over cluster mean equals prior cluster covariance divided $\tau_0$. Default: \verb+0.1+. +\\ +\hline +\end{tabular} +\vspace{1em} +\begin{tabular}{|l|p{10cm}|} +\hline +\rowcolor{lgray} Name: & \verb+Randomize+ \\ +\hline +\rowcolor{llgray} Value: & bool (default: \verb+false+)\\ +\hline + \rowcolor{llgray} Description: & If \verb+true+, starting values for subject level DCM parameter estimates are randomized. +\\ +\hline +\end{tabular} +\vspace{1em} +\begin{tabular}{|l|p{10cm}|} +\hline +\rowcolor{lgray} Name: & \verb+SaveTo+ \\ +\hline +\rowcolor{llgray} Value: & character array\\ +\hline + \rowcolor{llgray} Description: & Location for saving results consisting of path name and optional file name. Path name must end on file separator and point to an existing directory. If file name is not specified, it is set to 'huge' followed by date and time. +\\ +\hline +\end{tabular} +\vspace{1em} +\begin{tabular}{|l|p{10cm}|} +\hline +\rowcolor{lgray} Name: & \verb+Seed+ \\ +\hline +\rowcolor{llgray} Value: & double \ensuremath{|} cell array of double and rng name \ensuremath{|} random number generator seed obtained with \verb+rng+ command\\ +\hline + \rowcolor{llgray} Description: & Seed for random number generator. +\\ +\hline +\end{tabular} +\vspace{1em} +\begin{tabular}{|l|p{10cm}|} +\hline +\rowcolor{lgray} Name: & \verb+StartingValueDcm+ \\ +\hline +\rowcolor{llgray} Value: & \verb+'default'+ \ensuremath{|} \verb+'spm'+ \ensuremath{|} double array (default: \verb+'default'+)\\ +\hline + \rowcolor{llgray} Description: & Starting values for subject-level DCM parameter estimates. \verb+'default'+ uses prior cluster mean for all subjects. 'spm' uses values supplied in the 'Ep' field of the SPM DCM structs. Use a double array with number of rows equal to number of subjects to specify custom starting values. +\\ +\hline +\end{tabular} +\vspace{1em} +\begin{tabular}{|l|p{10cm}|} +\hline +\rowcolor{lgray} Name: & \verb+StartingValueGmm+ \\ +\hline +\rowcolor{llgray} Value: & \verb+'default'+ \ensuremath{|} double array (default: \verb+'default'+)\\ +\hline + \rowcolor{llgray} Description: & Starting values for cluster-level DCM parameter estimates. \verb+'default'+ uses prior cluster mean for all clusters. Use a double array with number of rows equal to number of clusters to specify custom starting values. +\\ +\hline +\end{tabular} +\vspace{1em} +\begin{tabular}{|l|p{10cm}|} +\hline +\rowcolor{lgray} Name: & \verb+Tag+ \\ +\hline +\rowcolor{llgray} Value: & character array\\ +\hline + \rowcolor{llgray} Description: & Model description +\\ +\hline +\end{tabular} +\vspace{1em} +\begin{tabular}{|l|p{10cm}|} +\hline +\rowcolor{lgray} Name: & \verb+Verbose+ \\ +\hline +\rowcolor{llgray} Value: & bool (default: \verb+false+)\\ +\hline + \rowcolor{llgray} Description: & Activate/deactivate command line output. +\\ +\hline +\end{tabular} +\vspace{1em} +} + +\end{par} \vspace{1em} + + +\section{Other Functions} + +\begin{par} +The HUGE toolbox provides additional functionalities in the form of regular Matlab functions, which are documented below. These function are used internally by the \texttt{tapas\_Huge} class. However, some of them may be useful for the user. +\end{par} \vspace{1em} + + +\subsection*{ \texttt{tapas\_huge\_boxcar}} + + \begin{verbatim} Generate a boxcar function for use as experimental stimulus. All + timing-related arguments must be specified in seconds. + + INPUTS: + dt - Numeric scalar indicating sampling time interval. + nBoxes - Vector indicating number of blocks. + period - Vector containing time interval between block onsets. + onRatio - Vector containing ratio between block length and 'period'. + Must be between 0 and 1. + + OPTIONAL INPUTS: + padding - Length of padding at the beginning and end. + + OUTPUTS: + u - A cell array containing the boxcar functions. + + EXAMPLES: + u = TAPAS_HUGE_BOXCAR(.01, 10, 3, 2/3, [4 0]) Generate boxcar + function with 10 blocks, each 2 seconds long with 1 second inter + block interval and onset of first block at 4 seconds. + + See also tapas_Huge.SIMULATE + + +\end{verbatim} \color{black} + + +\subsection*{ \texttt{tapas\_huge\_bpurity}} + + \begin{verbatim} Calculate balanced purity (see Brodersen2014 Eq. 13 and 14) for a set of + ground truth labels and a set of estimated labels + + INPUTS: + labels - Vector of ground truth class labels. + estimates - Clustering result as array of assignment probabilities or + vector of cluster indices. + + OUTPUTS: + balancedPurity - Balanced purity score according to Brodersen (2014) + + EXAMPLES: + bp = TAPAS_HUGE_BPURITY(labels,estimates) + + +\end{verbatim} \color{black} + + +\subsection*{ \texttt{tapas\_huge\_bold}} + + \begin{verbatim} Integrates the DCM forward equations to generate the predicted fMRI bold + time series. + + INPUTS: + A, B, C, D - DCM connectivity matrices. + tau - Venous transit time. + kappa - Decay of vasodilatory signal. + epsilon - Ratio of intra- and extravascular signal. + R - Number of regions. + u - Experimental stimuli. + L - Number of experimental stimuli. + E_0 - Resting oxygen extraction fraction. + r_0 - Slope of intravascular relaxation rate. + V_0 - Resting venous volume. + vartheta_0 - Frequency offset at the outer surface of magnetized + vessels (Hz). + alpha - Grubb's exponent. + gamma - rate constant of feedback regulation. + TR - Repetition time. + TE - Echo time. + dt - Sampling interval of inputs. + + OUTPUTS: + response - matrix of predicted response for each region + (column-wise) + x - time series of neuronal states + s - time series of vasodilatory signal + f1 - time series of flow + v1 - time series of blood volume + q1 - time series of deoxyhemoglobin content. + + +\end{verbatim} \color{black} + \begin{par} +For more information on the fMRI BOLD model, please refer to \cite{stephan2007}. +\end{par} \vspace{1em} + + +\subsection*{ \texttt{tapas\_huge\_compile}} + +\begin{par} +This function is used internally to compile the mex function the HUGE toolbox needs. This happens automatically the first time you use the HUGE toolbox. In general, there is no need to call this function manually. However, you need to make sure that a C compiler is installed on your system. More details on this topic, including links to freely available compilers, can be found at: \begin{verbatim}https://www.mathworks.com/support/requirements/supported-compilers.html\end{verbatim} +\end{par} \vspace{1em} + + +\subsection*{ \texttt{tapas\_huge\_logdet}} + +\begin{par} +This function is intended for internal use only. Do not call directly +\end{par} + \begin{verbatim} Numerical stable calculation of log-determinant for positive-definite + matrix. + + INPUT: + A - Positive definite matrix. + + OUTPUT: + ld - log(det(A)) + + EXAMPLE: + ld = TAPAS_HUGE_LOGDET(eye(3)) Calculate log-determinant of 3x3 + identity matrix. + + +\end{verbatim} \color{black} + + +\subsection*{ \texttt{tapas\_huge\_parse\_inputs}} + +\begin{par} +This function is intended for internal use only. Do not call directly +\end{par} + \begin{verbatim} Parse name-value pair type arguments into a struct. + + INPUTS: + opts - Struct containing all valid names as field names and + corresponding default values as field values. + + OPTIONAL INPUTS: + Name-value pair arguments. + + OUTPUTS: + opts - Struct containing name-value pair input arguments as fields. + + EXAMPLE: + opts = TAPAS_HUGE_PARSE_INPUTS(struct('a',0,'b',1),'a',10) Specify + 'a' and 'b' as valid property names and receive non-default value + for 'a'. + + +\end{verbatim} \color{black} + \begin{par} +The following two functions provide backward compatibility to the interface of the previous version of the HUGE toolbox (version 201903). +\end{par} \vspace{1em} + + +\subsection*{ \texttt{tapas\_huge\_invert}} + + \begin{verbatim} WARNING: This function is deprecated and will be removed in a future + version of this toolbox. Please use the new object-oriented interface + provided by the tapas_Huge class. + + Invert hierarchical unsupervised generative embedding (HUGE) model. + + INPUT: + DCM - cell array of DCM in SPM format + K - number of clusters (set K to one for empirical Bayes) + + OPTIONAL INPUT: + priors - model priors stored in a struct containing the + following fields: + alpha: parameter of Dirichlet prior (alpha_0 in Fig.1 of + REF [1]) + clustersMean: prior mean of clusters (m_0 in Fig.1 of REF [1]) + clustersTau: tau_0 in Fig.1 of REF [1] + clustersDeg: degrees of freedom of inverse-Wishart prior (nu_0 in + Fig.1 of REF [1]) + clustersSigma: scale matrix of inverse-Wishart prior (S_0 in Fig.1 + of REF [1]) + hemMean: prior mean of hemodynamic parameters (mu_h in Fig.1 + of REF [1]) + hemSigma: prior covariance of hemodynamic parameters (Sigma_h + in Fig.1 of REF [1]) + noiseInvScale: prior inverse scale of observation noise (b_0 in + Fig.1 of REF [1]) + noiseShape: prior shape parameter of observation noise (a_0 in + Fig.1 of REF [1]) + verbose - activates command line output (prints free energy + difference, default: false) + randomize - randomize starting values (default: false). WARNING: + randomizing starting values can cause divergence of DCM. + seed - seed for random number generator + + OUTPUT: + DcmResults - struct used for storing the results from VB. Posterior + parameters are stored in DcmResults.posterior, which is a + struct containing the following fields: + alpha: parameter of posterior over cluster weights + (alpha_k in Eq.(15) of REF [1]) + softAssign: posterior assignment probability of subjects + to clusters (q_nk in Eq.(18) in REF [1]) + clustersMean: posterior mean of clusters (m_k in Eq.(16) of + REF [1]) + clustersTau: tau_k in Eq.(16) of REF [1] + clustersDeg: posterior degrees of freedom (nu_k in Eq.(16) + of REF [1]) + clustersSigma: posterior scale matrix (S_k in Eq.(16) of + REF [1]) + logDetClustersSigma: log-determinant of S_k + dcmMean: posterior mean of DCM parameters (mu_n in + Eq.(19) of REF [1]) + dcmSigma: posterior covariance of hemodynamic + parameters (Sigma_n in Eq.(19) of REF [1]) + logDetPostDcmSigma: log-determinant of Sigma_n + noiseInvScale: posterior inverse scale of observation noise + (b_n,r in Eq.(21) of REF [1]) + noiseShape: posterior shape parameter of observation noise + (a_n,r in Eq.(21) of REF [1]) + meanNoisePrecision: posterior mean of precision of observation + noise (lambda_n,r in Eq.(23) of REF [1]) + modifiedSumSqrErr: b'_n,r in Eq.(22) of REF [1] + + See also tapas_Huge, tapas_Huge.estimate, tapas_huge_demo + + +\end{verbatim} \color{black} + + +\subsection*{ \texttt{tapas\_huge\_build\_prior}} + + \begin{verbatim} WARNING: This function is deprecated and will be removed in a future + version of this toolbox. Please use the new object-oriented interface + provided by the tapas_Huge class. + + Generate values for prior parameters for HUGE. Prior mean of cluster + centers and prior mean and covariance of hemodynamic parameters follow + SPM convention (SPM8 r6313). + + INPUT: + DcmInfo - cell array of DCM in SPM format + + OUTPUT: + priors - struct containing priors + DcmInfo - struct containing DCM model specification and BOLD time + series in DcmInfo format + + See also tapas_Huge, tapas_Huge.estimate, tapas_huge_demo + + +\end{verbatim} \color{black} + + +\section{Licence and Support} + +\begin{par} +This toolbox is part of TAPAS, which is released under the terms of the GNU General Public Licence (GPL), version 3. For further details, see: \begin{verbatim}https://www.gnu.org/licenses/\end{verbatim} +\end{par} \vspace{1em} +\begin{par} +The software contained in this toolbox is provided "as is", without warranty of any kind, express or implied, including, but not limited to the warranties of merchantability, fitness for a particular purpose and non-infringement. +\end{par} \vspace{1em} +\begin{par} +This software is intended for research only. Do not use for clinical purpose. Please note that this toolbox is under active development. Considerable changes may occur in future releases. +\end{par} \vspace{1em} +\begin{par} +Support for this toolbox is provided via the GitHub page of TAPAS. For questions and bug reports, please visit: \begin{verbatim}https://github.com/translationalneuromodeling/tapas/issues\end{verbatim} +\end{par} \vspace{1em} +\begin{par} + +\bibliographystyle{plainnat} +\bibliography{huge_doc} + +\end{par} \vspace{1em} + + + +\end{document} + diff --git a/huge/tapas_huge_nfe.m b/huge/tapas_huge_nfe.m deleted file mode 100644 index 2405f98c..00000000 --- a/huge/tapas_huge_nfe.m +++ /dev/null @@ -1,428 +0,0 @@ -%% [freeEnergyFull, feAux] = tapas_huge_nfe( counts, priors, posterior, feAux, listSubjects ) -% -% Calculates or updates negative free energy (NFE) for HUGE. -% -% INPUT: -% counts - number of parameters and subjects -% priors - parameters of prior distribution -% posterior - parameters of approximate posterior distribution. -% feAux - struct containing intermediate values of the NFE. -% listSubjects - indices of subjects for which to update the NFE. -% -% OUTPUT: -% freeEnergyFull - value of the negative free energy. -% feAux - struct containing intermediate values of the NFE. -% -% REFERENCE: -% -% Yao Y, Raman SS, Schiek M, Leff A, Frssle S, Stephan KE (2018). -% Variational Bayesian Inversion for Hierarchical Unsupervised Generative -% Embedding (HUGE). NeuroImage, 179: 604-619 -% -% https://doi.org/10.1016/j.neuroimage.2018.06.073 -% - -% -% Author: Yu Yao (yao@biomed.ee.ethz.ch) -% Copyright (C) 2018 Translational Neuromodeling Unit -% Institute for Biomedical Engineering, -% University of Zurich and ETH Zurich. -% -% This file is part of TAPAS, which is released under the terms of the GNU -% General Public Licence (GPL), version 3. For further details, see -% . -% -% This software is intended for research only. Do not use for clinical -% purpose. Please note that this toolbox is in an early stage of -% development. Considerable changes are planned for future releases. For -% support please refer to: -% https://github.com/translationalneuromodeling/tapas/issues -% -function [freeEnergyFull, feAux] = tapas_huge_nfe(counts,priors,posterior,feAux,listSubjects) -% -fepIdx = 0; -freeEnergyFullPart = zeros(100,1); - - -nParameters = counts.nParameters; -nDcmParamsInfCon = nParameters(2,1); %%% d_c -nDcmParamsInfHem = nParameters(2,2); %%% d_h -nDcmParamsInfAll = nParameters(2,3); %%% d - -if nargin < 4 - feAux.line2 = zeros(counts.nSubjects,counts.nClusters,2); - feAux.line4 = zeros(counts.nSubjects,2); -end -if nargin < 5 - listSubjects = 1:counts.nSubjects; -end - - - -%% line 1 -fepIdx = fepIdx + 1; -freeEnergyFullPart(fepIdx) = ... - -sum(sum(bsxfun(@times,posterior.softAssign,... - posterior.logDetClustersSigma.')/2)); - -fepIdx = fepIdx + 1; -freeEnergyFullPart(fepIdx) = ... - -sum(posterior.softAssign(:))*nDcmParamsInfCon*log(pi)/2; - -fepIdx = fepIdx + 1; -freeEnergyFullPart(fepIdx) = ... - +sum(sum(... - bsxfun(@times,... - posterior.softAssign,... - sum(psi(bsxfun(@plus,... - posterior.clustersDeg,... - 1-(1:nDcmParamsInfCon))/2),2).'... - )... - ))/2; - -fepIdx = fepIdx + 1; -freeEnergyFullPart(fepIdx) = ... - -sum(sum(bsxfun(@times,... - posterior.softAssign,... - nDcmParamsInfCon./posterior.clustersTau.')... - ))/2; - - - -%% line 2 -fepIdx = fepIdx + 1; -for iSub = listSubjects - for iCluster = 1:counts.nClusters - feAux.line2(iSub,iCluster,1) = ... - -posterior.clustersDeg(iCluster)*... - posterior.softAssign(iSub,iCluster)*(... - trace(... - posterior.clustersSigma(:,:,iCluster)\... - posterior.dcmSigma(1:nDcmParamsInfCon,... - 1:nDcmParamsInfCon,... - iSub... - )... - )... - )/2; - end -end -freeEnergyFullPart(fepIdx) = sum(sum(feAux.line2(:,:,1))); -%%% - -fepIdx = fepIdx + 1; -for iSub = listSubjects - for iCluster = 1:counts.nClusters - feAux.line2(iSub,iCluster,2) = ... - -posterior.clustersDeg(iCluster)*... - posterior.softAssign(iSub,iCluster)*(... - (posterior.dcmMean(iSub,1:nDcmParamsInfCon)... - -posterior.clustersMean(iCluster,:))*... - (posterior.clustersSigma(:,:,iCluster)\... - (posterior.dcmMean(iSub,1:nDcmParamsInfCon)... - -posterior.clustersMean(iCluster,:)).' ... - )... - )/2; - end -end -freeEnergyFullPart(fepIdx) = sum(sum(feAux.line2(:,:,2))); -%%% - - -%% line 3 -fepIdx = fepIdx + 1; -freeEnergyFullPart(fepIdx) = ... - -sum(counts.nMeasurements)*log(2*pi)/2; - -fepIdx = fepIdx + 1; -freeEnergyFullPart(fepIdx) = ... - +sum(sum(... - bsxfun(@times,... - counts.nMeasurementsPerState,... - psi(posterior.noiseShape) - log(posterior.noiseInvScale))... - ))/2; - -fepIdx = fepIdx + 1; -freeEnergyFullPart(fepIdx) = ... - -posterior.meanNoisePrecision(:).'*posterior.modifiedSumSqrErr(:)/2; - - -%% line 4 -fepIdx = fepIdx + 1; -for iSub = listSubjects - feAux.line4(iSub,1) = ... - -trace(priors.hemSigma\posterior.dcmSigma(nDcmParamsInfCon+1:end,... - nDcmParamsInfCon+1:end,... - iSub... - ) ... - )/2; -end -freeEnergyFullPart(fepIdx) = sum(feAux.line4(:,1)); - - -fepIdx = fepIdx + 1; -for iSub = listSubjects - feAux.line4(iSub,2) = ... - -(posterior.dcmMean(iSub,nDcmParamsInfCon+1:end)-priors.hemMean)*... - (priors.hemSigma\... - (posterior.dcmMean(iSub,nDcmParamsInfCon+1:end)... - -priors.hemMean).'... - )/2; -end -freeEnergyFullPart(fepIdx) = sum(feAux.line4(:,2)); - - -%% line 5 -fepIdx = fepIdx + 1; -freeEnergyFullPart(fepIdx) = ... - -counts.nSubjects*tapas_util_logdet(priors.hemSigma)/2; - -fepIdx = fepIdx + 1; -freeEnergyFullPart(fepIdx) = ... - -counts.nSubjects*nDcmParamsInfHem*log(2*pi)/2; - - -%% line 6 -fepIdx = fepIdx + 1; -freeEnergyFullPart(fepIdx) = ... - -counts.nSubjects*sum(gammaln(priors.noiseShape)); - -fepIdx = fepIdx + 1; -freeEnergyFullPart(fepIdx) = ... - +counts.nSubjects*sum(priors.noiseShape.*log(priors.noiseInvScale)); - - -%% line 7 -fepIdx = fepIdx + 1; -freeEnergyFullPart(fepIdx) = ... - +sum(sum(bsxfun(@times, ... - priors.noiseShape-1, ... - (psi(posterior.noiseShape)-log(posterior.noiseInvScale)) ... - ))); - -fepIdx = fepIdx + 1; -freeEnergyFullPart(fepIdx) = ... - -sum(sum(bsxfun(@times, ... - priors.noiseInvScale, ... - posterior.noiseShape./posterior.noiseInvScale ... - ))); - - -%% line 8 -fepIdx = fepIdx + 1; -freeEnergyFullPart(fepIdx) = ... - -nDcmParamsInfCon*sum(priors.clustersTau./posterior.clustersTau)/2; - - - -fepIdx = fepIdx + 1; -freeEnergyFullPart(fepIdx) = 0; -for iCluster = 1:counts.nClusters - freeEnergyFullPart(fepIdx) = freeEnergyFullPart(fepIdx) + ... - -priors.clustersTau*posterior.clustersDeg(iCluster)/2 ... - *(posterior.clustersMean(iCluster,:)-priors.clustersMean) ... - *(posterior.clustersSigma(:,:,iCluster)\... - (posterior.clustersMean(iCluster,:)-priors.clustersMean).'); -end -%%% - - -%% line 9 -fepIdx = fepIdx + 1; -freeEnergyFullPart(fepIdx) = 0; -for iCluster = 1:counts.nClusters - freeEnergyFullPart(fepIdx) = freeEnergyFullPart(fepIdx) + ... - -posterior.clustersDeg(iCluster)/2 ... - *trace(posterior.clustersSigma(:,:,iCluster)\... - priors.clustersSigma); -end -%%% - - -fepIdx = fepIdx + 1; -freeEnergyFullPart(fepIdx) = ... - -(priors.clustersDeg+nDcmParamsInfCon+2)/2*(... - sum(posterior.logDetClustersSigma) ... - -sum(sum(psi(bsxfun(@plus,... - posterior.clustersDeg,... - 1-(1:nDcmParamsInfCon)... - )/2))) ... - ); - - - -%% line 10 -fepIdx = fepIdx + 1; -freeEnergyFullPart(fepIdx) = ... - -counts.nClusters*nDcmParamsInfCon*(nDcmParamsInfCon-1)/4*log(pi); -fepIdx = fepIdx + 1; -freeEnergyFullPart(fepIdx) = ... - -counts.nClusters*sum(gammaln((priors.clustersDeg+1-... - (1:nDcmParamsInfCon))/2)); - - -fepIdx = fepIdx + 1; -freeEnergyFullPart(fepIdx) = ... - +counts.nClusters*priors.clustersDeg*tapas_util_logdet(... - priors.clustersSigma)/2; - -fepIdx = fepIdx + 1; -freeEnergyFullPart(fepIdx) = ... - +counts.nClusters*nDcmParamsInfCon*(nDcmParamsInfCon+2)/2*log(2); - -fepIdx = fepIdx + 1; -freeEnergyFullPart(fepIdx) = ... - -counts.nClusters*nDcmParamsInfCon*log(2*pi)/2; -fepIdx = fepIdx + 1; -freeEnergyFullPart(fepIdx) = ... - +counts.nClusters*nDcmParamsInfCon*log(priors.clustersTau)/2; - - - -%% line 11 -fepIdx = fepIdx + 1; -freeEnergyFullPart(fepIdx) = ... - +sum(sum(bsxfun(@times,... - posterior.softAssign,... - psi(posterior.alpha.')-psi(sum(posterior.alpha))... - ))); - - -%% line 12 -fepIdx = fepIdx + 1; -freeEnergyFullPart(fepIdx) = ... - +gammaln(sum(priors.alpha))-sum(gammaln(priors.alpha)); - - -%% line 13 -fepIdx = fepIdx + 1; -freeEnergyFullPart(fepIdx) = ... - +(priors.alpha.'-1)*(psi(posterior.alpha)-psi(sum(posterior.alpha))); - - -%% line 14 -fepIdx = fepIdx + 1; -freeEnergyFullPart(fepIdx) = ... - -sum(posterior.softAssign(:).*log(posterior.softAssign(:)+realmin)); - - -%% line 15 -fepIdx = fepIdx + 1; -freeEnergyFullPart(fepIdx) = ... - +sum(posterior.logDetPostDcmSigma)/2; -%%% neg dF - -fepIdx = fepIdx + 1; -freeEnergyFullPart(fepIdx) = ... - +counts.nSubjects*nDcmParamsInfAll/2; - - -fepIdx = fepIdx + 1; -freeEnergyFullPart(fepIdx) = ... - +counts.nSubjects*nDcmParamsInfAll*log(2*pi)/2; - - - -%% line 16 -fepIdx = fepIdx + 1; -freeEnergyFullPart(fepIdx) = ... - +sum(gammaln(posterior.noiseShape(:))); - - -fepIdx = fepIdx + 1; -freeEnergyFullPart(fepIdx) = ... - -posterior.noiseShape(:).'*log(posterior.noiseInvScale(:)); - - -%% line 17 -fepIdx = fepIdx + 1; -freeEnergyFullPart(fepIdx) = ... - -(posterior.noiseShape(:).'-1)*(psi(posterior.noiseShape(:))-... - log(posterior.noiseInvScale(:))); - - -fepIdx = fepIdx + 1; -freeEnergyFullPart(fepIdx) = ... - +sum(posterior.noiseShape(:)); - - -%% line 18 -fepIdx = fepIdx + 1; -freeEnergyFullPart(fepIdx) = ... - +counts.nClusters*nDcmParamsInfCon/2; - - -fepIdx = fepIdx + 1; -freeEnergyFullPart(fepIdx) = ... - +nDcmParamsInfCon/2*sum(posterior.clustersDeg); - - -fepIdx = fepIdx + 1; -freeEnergyFullPart(fepIdx) = ... - -counts.nClusters*nDcmParamsInfCon*(nDcmParamsInfCon+2)/2*log(2); - - -fepIdx = fepIdx + 1; -freeEnergyFullPart(fepIdx) = ... - +counts.nClusters*nDcmParamsInfCon/2*log(2*pi); -fepIdx = fepIdx + 1; -freeEnergyFullPart(fepIdx) = ... - +nDcmParamsInfCon/2*sum(log(1./posterior.clustersTau)); - - -%% line 19 -fepIdx = fepIdx + 1; -freeEnergyFullPart(fepIdx) = ... - +(posterior.clustersDeg.'+nDcmParamsInfCon+2)/2*(... - posterior.logDetClustersSigma... - -sum(psi(bsxfun(@plus,... - posterior.clustersDeg,... - 1-(1:nDcmParamsInfCon)... - )/2),2)... - ); - - -%% line 20 -fepIdx = fepIdx + 1; -freeEnergyFullPart(fepIdx) = ... - +counts.nClusters*nDcmParamsInfCon*(nDcmParamsInfCon-1)/4*log(pi); -fepIdx = fepIdx + 1; -freeEnergyFullPart(fepIdx) = ... - +sum(sum(gammaln(bsxfun(@plus,... - posterior.clustersDeg,... - 1-(1:nDcmParamsInfCon)... - )/2))); - - -fepIdx = fepIdx + 1; -freeEnergyFullPart(fepIdx) = ... - -posterior.clustersDeg.'*posterior.logDetClustersSigma/2; - - - -%% line 21 -fepIdx = fepIdx + 1; -freeEnergyFullPart(fepIdx) = ... - +sum(gammaln(posterior.alpha)); - -fepIdx = fepIdx + 1; -freeEnergyFullPart(fepIdx) = ... - -gammaln(sum(posterior.alpha)); - -%% line 22 -fepIdx = fepIdx + 1; -freeEnergyFullPart(fepIdx) = ... - -(posterior.alpha.'-1)*(psi(posterior.alpha)-psi(sum(posterior.alpha))); - - - -%% sum -freeEnergyFull = sum(freeEnergyFullPart); - - -%% aux -freeEnergyFullPart(61) = freeEnergyFullPart(2)... - +freeEnergyFullPart(13)... - +freeEnergyFullPart(34); - - - diff --git a/huge/tapas_huge_pack_params.m b/huge/tapas_huge_pack_params.m deleted file mode 100644 index a0a023b6..00000000 --- a/huge/tapas_huge_pack_params.m +++ /dev/null @@ -1,50 +0,0 @@ -%% [ packedParameters ] = tapas_huge_pack_params( unpackedParameters, paramList ) -% -% Transform vectorized parameters into a cell array format. -% -% INPUT: -% unpackedParameters - current value of parameters arranged as a -% vector -% paramList - supporting paramters -% -% OUTPUT: -% packedParameters - current value of parameters arranged as a cell -% array -% - -% -% Author: Sudhir Shankar Raman -% Copyright (C) 2018 Translational Neuromodeling Unit -% Institute for Biomedical Engineering, -% University of Zurich and ETH Zurich. -% -% This file is part of TAPAS, which is released under the terms of the GNU -% General Public Licence (GPL), version 3. For further details, see -% . -% -% This software is intended for research only. Do not use for clinical -% purpose. Please note that this toolbox is in an early stage of -% development. Considerable changes are planned for future releases. For -% support please refer to: -% https://github.com/translationalneuromodeling/tapas/issues -% -function [ packedParameters ] = tapas_huge_pack_params( unpackedParameters, paramList ) - -packedParameters{1} = reshape(unpackedParameters(... - 1:(paramList(3)*paramList(3))),paramList(3),paramList(3)); -nextIndex = paramList(3)*paramList(3)+1; -packedParameters{2} = reshape(unpackedParameters(nextIndex:... - (nextIndex+paramList(3)*paramList(4)-1)),paramList(3),paramList(4)); -nextIndex = nextIndex+paramList(3)*paramList(4); -packedParameters{3} = reshape(unpackedParameters(nextIndex:... - (nextIndex+paramList(4)*paramList(3)*paramList(3)-1)),paramList(3),... - paramList(3),paramList(4)); -nextIndex = nextIndex + paramList(3)*paramList(3)*paramList(4); -packedParameters{4} = reshape(unpackedParameters(nextIndex:... - (nextIndex+paramList(3)*paramList(3)*paramList(3)-1)),paramList(3),... - paramList(3),paramList(3)); -nextIndex = nextIndex + paramList(3)*paramList(3)*paramList(3); -packedParameters{5} = reshape(unpackedParameters(nextIndex:... - (nextIndex+paramList(3)*3-1)),paramList(3),3)'; - -return; \ No newline at end of file diff --git a/huge/tapas_huge_parse_inputs.m b/huge/tapas_huge_parse_inputs.m new file mode 100644 index 00000000..0bb6129e --- /dev/null +++ b/huge/tapas_huge_parse_inputs.m @@ -0,0 +1,62 @@ +function [ opts ] = tapas_huge_parse_inputs( opts, varargin ) +% Parse name-value pair type arguments into a struct. +% +% INPUTS: +% opts - Struct containing all valid names as field names and +% corresponding default values as field values. +% +% OPTIONAL INPUTS: +% Name-value pair arguments. +% +% OUTPUTS: +% opts - Struct containing name-value pair input arguments as fields. +% +% EXAMPLE: +% opts = TAPAS_HUGE_PARSE_INPUTS(struct('a',0,'b',1),'a',10) Specify +% 'a' and 'b' as valid property names and receive non-default value +% for 'a'. +% + +% Author: Yu Yao (yao@biomed.ee.ethz.ch) +% Copyright (C) 2019 Translational Neuromodeling Unit +% Institute for Biomedical Engineering, +% University of Zurich and ETH Zurich. +% +% This file is part of TAPAS, which is released under the terms of the GNU +% General Public Licence (GPL), version 3. For further details, see +% . +% +% This software is provided "as is", without warranty of any kind, express +% or implied, including, but not limited to the warranties of +% merchantability, fitness for a particular purpose and non-infringement. +% +% This software is intended for research only. Do not use for clinical +% purpose. Please note that this toolbox is under active development. +% Considerable changes may occur in future releases. For support please +% refer to: +% https://github.com/translationalneuromodeling/tapas/issues +% + +if isscalar(varargin) && iscell(varargin{1}) + varargin = varargin{1}; +end + +nIn = numel(varargin); +validNames = fieldnames(opts); + +for iIn = 1:2:nIn - 1 + + name = varargin{iIn}; + value = varargin{iIn + 1}; + + assert(ischar(name), 'TAPAPS:HUGE:Nvp:NoneChar', ... + 'Property name must be a character array.'); + assert(any(strcmpi(name, validNames)), 'TAPAPS:HUGE:Nvp:InvalidName', ... + '"%s" is not a valid property name.', name); + + opts.(lower(name)) = value; + +end + +end + diff --git a/huge/tapas_huge_plot.m b/huge/tapas_huge_plot.m deleted file mode 100644 index 26c1229b..00000000 --- a/huge/tapas_huge_plot.m +++ /dev/null @@ -1,130 +0,0 @@ -%% [ ] = tapas_huge_plot( DCM, DcmResults ) -% -% Generate simple graphical summary of inversion result. -% -% INPUT: -% DCM - cell array of DCM in SPM format -% DcmResults - struct used for storing the results from VB. Output of -% tapas_huge_invert.m -% - -% Author: Yu Yao (yao@biomed.ee.ethz.ch) -% Copyright (C) 2018 Translational Neuromodeling Unit -% Institute for Biomedical Engineering, -% University of Zurich and ETH Zurich. -% -% This file is part of TAPAS, which is released under the terms of the GNU -% General Public Licence (GPL), version 3. For further details, see -% . -% -% This software is intended for research only. Do not use for clinical -% purpose. Please note that this toolbox is in an early stage of -% development. Considerable changes are planned for future releases. For -% support please refer to: -% https://github.com/translationalneuromodeling/tapas/issues -% -function [ ] = tapas_huge_plot( DCM, DcmResults ) -%% clustering -if ~isfield(DCM,'listBoldResponse') - try - DcmInfo = tapas_huge_import_spm(DCM); - catch err - disp('tapas_huge_plot: Unsupported format.'); - disp('Use cell array of DCM in SPM format as first input.'); - rethrow(err); - end -else - DcmInfo = DCM; -end - - -figure -if DcmResults.maxClusters > 1 - % subject assignment - subplot(2,2,1) - bar(DcmResults.posterior.softAssign,'stacked'); - axis([0 DcmInfo.nSubjects+1 0 1]) - title('assignments') - ylabel('q_{nk}') - xlabel('subject index') - - % cluster - subplot(2,2,2) - hold on - line([0 DcmInfo.nConnections+1],[0 0],'color','k') - % plot posterior cluster mean and 95% marginal credible intervals - for k = 1:DcmResults.maxClusters - xOffset = ((k-1)/max(1,(DcmResults.maxClusters-1)) - .5)/2; - clMean = DcmResults.posterior.clustersMean(k,:); - clStd = sqrt(diag(DcmResults.posterior.clustersSigma(:,:,k))'/... - (DcmResults.posterior.clustersTau(k)*... - (DcmResults.posterior.clustersDeg(k) - DcmInfo.nConnections + 1))); - s = tinv(1-0.025,DcmResults.posterior.clustersDeg(k)); - errorbar((1:DcmInfo.nConnections) + xOffset,clMean,s*clStd,'d') - end - xlim([0 DcmInfo.nConnections+1]) - title('clusters') - ylabel('\mu_k') - xlabel('connection index'); - - % DCM - % plot 25 samples from posterior over (noise free) BOLD response - subplot(2,1,2) - hold on - n = 1; % for first subject - postMean = DcmResults.posterior.dcmMean(n,:); - postStd = chol(DcmResults.posterior.dcmSigma(:,:,n)); - for iSmp = 1:25 - % draw a sample from posterior over DCM parameters - postSmp = postMean + randn(size(postMean))*postStd; - tmp = zeros(1,DcmInfo.nParameters); - tmp(DcmInfo.connectionIndicator) = postSmp(1:DcmInfo.nConnections); - tmp(end-3*DcmInfo.nStates+1:end-DcmInfo.nStates+1) = ... - postSmp(DcmInfo.nConnections+1:end); - % predict BOLD response for current sample - pred = tapas_huge_bold(tmp,DcmInfo,n); - plot(pred(:),'b') - end - plot(DcmInfo.listBoldResponse{n}(:),'k') - % plot ground truth if available - try - tmp = DcmInfo.listParameters{n}; - pred = tapas_huge_bold([tmp{1}(:);tmp{2}(:);tmp{3}(:);tmp{4}(:);... - tmp{5}(:);]',DcmInfo,n); - plot(pred(:),'r') - catch - % omit ground truth - end - title('black: measurement - blue: posterior samples'); - ylabel('BOLD') - xlabel('sample index') - -else - %% empirical Bayes - subplot(2,1,1) - hold on - line([0 DcmInfo.nConnections+1],[0 0],'color','k') - k = 1; -% plot posterior cluster mean and 95% marginal credible intervals - clMean = DcmResults.posterior.clustersMean(k,:); - clStd = sqrt(diag(DcmResults.posterior.clustersSigma(:,:,k))'/... - (DcmResults.posterior.clustersTau(k)*... - (DcmResults.posterior.clustersDeg(k) - DcmInfo.nConnections + 1))); - s = tinv(1-0.025,DcmResults.posterior.clustersDeg(k)); - errorbar(1:DcmInfo.nConnections,clMean,s*clStd,'d') - ylabel('\mu_k') - xlabel('connection index'); - title('Empirical Bayes') - - % boxplot of MAP estimates of DCM parameters - subplot(2,1,2) - hold on - line([0 DcmInfo.nConnections+1],[0 0],'color','k') - boxplot(DcmResults.posterior.dcmMean) - ylabel('\mu_n') - xlabel('connection index'); - -end - -end - diff --git a/huge/tapas_huge_predict.m b/huge/tapas_huge_predict.m deleted file mode 100644 index 2f65e5ac..00000000 --- a/huge/tapas_huge_predict.m +++ /dev/null @@ -1,54 +0,0 @@ -%% function [response,x,s,f,v,q] = tapas_huge_predict( dcmParamsInf, dcmParamsDefault, idxDcmParamsInf, ~, DcmInfo, iSubject) -% -% Wrapper for the function for tapas_huge_bold.m -% -%-------------------------------------------------------------------------------------- -% INPUT: -% dcmParamsInf - values of DCM parameters being inferred -% dcmParamsDefault - full DCM parameters vector containing default -% values for remaining parameters -% idxDcmParamsInf - indices of DCM parameters being inferred -% idxDiagA - indices of self connections (dummy) -% DcmInfo - struct containing DCM model specification and -% BOLD time series. -% iSubject - subject index -% -% -%--------------------------------------------------------------------------------------- -% OUTPUT: -% response - matrix of predicted response for each region -% (column-wise) -% x - time series of neuronal states -% s - time series of vasodilatory signal -% f1 - time series of flow -% v1 - time series of blood volume -% q1 - time series of deoxyhemoglobin content. -% -% - -% Author: Yu Yao (yao@biomed.ee.ethz.ch) -% Copyright (C) 2018 Translational Neuromodeling Unit -% Institute for Biomedical Engineering, -% University of Zurich and ETH Zurich. -% -% This file is part of TAPAS, which is released under the terms of the GNU -% General Public Licence (GPL), version 3. For further details, see -% . -% -% This software is intended for research only. Do not use for clinical -% purpose. Please note that this toolbox is in an early stage of -% development. Considerable changes are planned for future releases. For -% support please refer to: -% https://github.com/translationalneuromodeling/tapas/issues -% -function [response,x,s,f,v,q] = tapas_huge_predict( dcmParamsInf, dcmParamsDefault, idxDcmParamsInf, ~, DcmInfo, iSubject) - -dcmParamsDefault(idxDcmParamsInf) = dcmParamsInf; - - -[response,x,s,f,v,q] = tapas_huge_bold(dcmParamsDefault,... - DcmInfo,... - iSubject); -response = response(:); - - diff --git a/huge/tapas_huge_property_names.m b/huge/tapas_huge_property_names.m new file mode 100644 index 00000000..8cf9d7f4 --- /dev/null +++ b/huge/tapas_huge_property_names.m @@ -0,0 +1,131 @@ +%% List of name-value pair arguments accepted by tapas_Huge() and estimate() +% +% NAME: Confounds +% VALUE: double array +% DESCRIPTION: Specify confounds for group-level analysis (e.g. age or sex) +% as double array with one row per subject and one column per +% confound. Note: This property can only be used in +% combination with the Dcm property. +% WARNING: This feature is experimental. +% +% NAME: ConfoundsVariant +% VALUE: 'none' | 'global' | 'cluster' (default: 'global' if +% confounds specified, 'none' otherwise) +% DESCRIPTION: Determines how confounds enter model. 'none': Confounds are +% not used. 'global': Confounds enter global regression +% (variant 1). 'cluster': Confounds enter cluster-specific +% regression (variant 2). +% +% NAME: Dcm +% VALUE: cell array of DCM structs in SPM format +% DESCRIPTION: Specify DCM structure and BOLD time series for all subjects +% as cell array with one DCM struct in SPM format per subject. +% +% NAME: K +% VALUE: positive integer (default: 1) +% DESCRIPTION: Number of clusters. +% +% NAME: Method +% VALUE: 'VB' +% DESCRIPTION: Name of inversion method specified as character array. VB: +% variational Bayes +% +% NAME: NumberOfIterations +% VALUE: positive integer (default: 999) +% DESCRIPTION: Maximum number of iterations of VB scheme. +% +% NAME: OmitFromClustering +% VALUE: array of logical | struct with fields a, b, c and d +% (default: empty struct) +% DESCRIPTION: Select DCM parameters to exclude from clustering. Parameters +% excluded from clustering will still be estimated, but under +% a static Gaussian prior. If input is array, it will be +% treated as the a field in a struct. Missing fields will be +% treated the same as arrays of false. Note: This property can +% only be used in combination with the Dcm property. +% +% NAME: PriorClusterMean +% VALUE: 'default' | row vector of double +% DESCRIPTION: Prior cluster mean. Scalar input will be expanded into +% vector. Default: [0, ... ,0]. +% +% NAME: PriorClusterVariance +% VALUE: 'default' | symmetric, positive definite matrix of double +% DESCRIPTION: Prior mean of cluster covariances. Must be a symmetric, +% positive definite matrix. Scalar input will be expanded into +% diagonal matrix. Default: diag(..., 0.01, ...). +% +% NAME: PriorDegree +% VALUE: 'default' | positive double +% DESCRIPTION: nu_0 determines the prior precision of the cluster +% covariance. For VB, this is the degrees of freedom of the +% inverse-Wishart. Default: 100. +% +% NAME: PriorVarianceRatio +% VALUE: 'default' | positive double +% DESCRIPTION: Ratio tau_0 between prior mean cluster covariance and prior +% covariance over cluster mean. Prior covariance over cluster +% mean equals prior cluster covariance divided tau_0. Default: +% 0.1. +% +% NAME: Randomize +% VALUE: bool (default: false) +% DESCRIPTION: If true, starting values for subject level DCM parameter +% estimates are randomized. +% +% NAME: SaveTo +% VALUE: character array +% DESCRIPTION: Location for saving results consisting of path name and +% optional file name. Path name must end on file separator and +% point to an existing directory. If file name is not +% specified, it is set to 'huge' followed by date and time. +% +% NAME: Seed +% VALUE: double | cell array of double and rng name | random number +% generator seed obtained with rng() command +% DESCRIPTION: Seed for random number generator. +% +% NAME: StartingValueDcm +% VALUE: 'prior' | 'spm' | double array (default: 'prior') +% DESCRIPTION: Starting values for subject-level DCM parameter estimates. +% 'prior' uses prior cluster mean for all subjects. 'spm' uses +% values supplied in the 'Ep' field of the SPM DCM structs. +% Use a double array with number of rows equal to number of +% subjects to specify custom starting values. +% +% NAME: StartingValueGmm +% VALUE: 'prior' | double array (default: 'prior') +% DESCRIPTION: Starting values for cluster-level DCM parameter estimates. +% 'prior' uses prior cluster mean for all clusters. Use a +% double array with number of rows equal to number of clusters +% to specify custom starting values. +% +% NAME: Tag +% VALUE: character array +% DESCRIPTION: Model description +% +% NAME: Verbose +% VALUE: bool (default: false) +% DESCRIPTION: Activate/deactivate command line output. +% +% + +% Author: Yu Yao (yao@biomed.ee.ethz.ch) +% Copyright (C) 2019 Translational Neuromodeling Unit +% Institute for Biomedical Engineering, +% University of Zurich and ETH Zurich. +% +% This file is part of TAPAS, which is released under the terms of the GNU +% General Public Licence (GPL), version 3. For further details, see +% . +% +% This software is provided "as is", without warranty of any kind, express +% or implied, including, but not limited to the warranties of +% merchantability, fitness for a particular purpose and non-infringement. +% +% This software is intended for research only. Do not use for clinical +% purpose. Please note that this toolbox is under active development. +% Considerable changes may occur in future releases. For support please +% refer to: +% https://github.com/translationalneuromodeling/tapas/issues +% \ No newline at end of file diff --git a/huge/tapas_huge_simulate.m b/huge/tapas_huge_simulate.m deleted file mode 100644 index acf5f9ca..00000000 --- a/huge/tapas_huge_simulate.m +++ /dev/null @@ -1,214 +0,0 @@ -%% [ DcmInfo ] = tapas_huge_simulate( options ) -% -% Generates a synthetic HUGE dataset for DCM for fMRI. -% -% INPUT: -% options - struct containing information on parameters of the -% generative model to be used in the simulation. -% (see tapas_huge_generate_examples.m for an example) -% -% OUTPUT: -% DcmInfo - struct containing DCM model specification and BOLD time -% series. -% -% REFERENCE: -% -% Yao Y, Raman SS, Schiek M, Leff A, Frssle S, Stephan KE (2018). -% Variational Bayesian Inversion for Hierarchical Unsupervised Generative -% Embedding (HUGE). NeuroImage, 179: 604-619 -% -% https://doi.org/10.1016/j.neuroimage.2018.06.073 -% - -% Author: Yu Yao (yao@biomed.ee.ethz.ch) -% Copyright (C) 2018 Translational Neuromodeling Unit -% Institute for Biomedical Engineering, -% University of Zurich and ETH Zurich. -% -% This file is part of TAPAS, which is released under the terms of the GNU -% General Public Licence (GPL), version 3. For further details, see -% . -% -% This software is intended for research only. Do not use for clinical -% purpose. Please note that this toolbox is in an early stage of -% development. Considerable changes are planned for future releases. For -% support please refer to: -% https://github.com/translationalneuromodeling/tapas/issues -% -function [ DcmInfo ] = tapas_huge_simulate( options ) -%% process input -rngSeed = rng(); -% compile integrator -tapas_huge_compile(); - -K = numel(options.N_k); % number of clusters -N = sum(options.N_k); % number of subjects -R = options.R; % number of regions - -% inputs -u = options.input.u; -if iscell(u) - u = u(:)'; - assert(length(u)==N,... - 'TAPAS:HUGE:NumberOfInputs',... - 'Number of input arrays inconsistent with number of subjects'); - L = unique(cellfun(@size,u,repmat({2},size(u)))); - assert(isscalar(L(:)),... - 'TAPAS:HUGE:InputSize',... - 'Size of inputs inconsistent'); -else - L = size(u,2); - u = repmat({u},1,N); -end - -% number of parameters for fully connected DCM -nParametersConnect = R^2 + R^2*L + R*L + R^3; -nParameters = nParametersConnect + 3*R; - -% clusters -mu_k = zeros(K,nParametersConnect); -mu_k(:,options.mu_k.idx) = options.mu_k.value; -p_c = numel(options.mu_k.idx); -assert(size(mu_k,1)==K,... - 'TAPAS:HUGE:NumberOfClusters',... - 'Number of mean vectors inconsistent with number of clusters'); -sigma_k = options.sigma_k; -if isscalar(sigma_k) - sigma_k = repmat(sigma_k,size(options.mu_k.value)); -elseif iscolumn(sigma_k) - sigma_k = repmat(sigma_k,1,p_c); -end -assert(all(size(sigma_k)==size(options.mu_k.value)),... - 'TAPAS:HUGE:NumberOfClusters',... - 'Size of sigma_k inconsistent with mu_k'); - -% hemodynamics -p_h = 2*R + 1; -mu_h = options.mu_h; -assert(all(size(mu_h)==[1,p_h]),... - 'TAPAS:HUGE:HemodynamicsSize',... - 'Size of mu_h must be 1x2*R+1'); -sigma_h = options.sigma_h; -if isscalar(sigma_h) - sigma_h = repmat(sigma_h,1,p_h); -end -assert(all(size(sigma_h)==size(mu_h)),... - 'TAPAS:HUGE:HemodynamicsSize',... - 'mu_h and sigma_h must have same size'); - -% observation noise -snrBold = options.snr; - -%% assemble DcmInfo struct -DcmInfo = struct(); - -DcmInfo.nSubjects = N; -DcmInfo.nStates = R; -DcmInfo.nParameters = nParameters; -DcmInfo.connectionIndicator = options.mu_k.idx; -DcmInfo.noConnectionIndicator = 1:nParametersConnect; -DcmInfo.noConnectionIndicator(DcmInfo.connectionIndicator) = []; -DcmInfo.nNoConnections = nParametersConnect - p_c; -DcmInfo.nConnections = p_c; - -dummy = zeros(1,nParameters); -dummy(:,options.mu_k.idx) = 1; -dummy = tapas_huge_pack_params(dummy,[NaN NaN R L]); -DcmInfo.adjacencyA = logical(dummy{1}); -DcmInfo.adjacencyB = logical(dummy{3}); -DcmInfo.adjacencyC = logical(dummy{2}); -DcmInfo.adjacencyD = logical(dummy{4}); -DcmInfo.dcmTypeB = any(DcmInfo.adjacencyB(:)); -DcmInfo.dcmTypeD = any(DcmInfo.adjacencyD(:)); - -DcmInfo.hemParam = options.hemParam; -DcmInfo.nInputs = L; -DcmInfo.nTime = cellfun(@size,u,repmat({1},1,length(u))); -DcmInfo.listU = u; -% ratio of sampling rate between input and BOLD -if isscalar(options.input.trSteps) - DcmInfo.trSteps = repmat(options.input.trSteps,1,N); -else - assert(numel(options.input.trSteps)==N,... - 'TAPAS:HUGE:NumberOfInputs',... - 'Length of trSteps inconsistent with number of subjects'); - DcmInfo.trSteps = options.input.trSteps; -end -% repetition time -if isscalar(options.input.trSeconds) - DcmInfo.trSeconds = repmat(options.input.trSeconds,1,N); -else - assert(numel(options.input.trSeconds)==N,... - 'TAPAS:HUGE:NumberOfInputs',... - 'Length of trSeconds inconsistent with number of subjects'); - DcmInfo.trSeconds = options.input.trSeconds; -end -% sampling time step of input -DcmInfo.timeStep = DcmInfo.trSeconds./DcmInfo.trSteps; - -DcmInfo.ClusterParameters.clusterMeans = mu_k; -DcmInfo.ClusterParameters.clusterStds = sigma_k; -DcmInfo.ClusterParameters.clusterCovariances = zeros(p_c,p_c,K); -for k = 1:K - DcmInfo.ClusterParameters.clusterCovariances(:,:,k) = ... - diag(sigma_k(k,:).^2); -end - - - - -%% generate subject-specific BOLD responses - -listN = cumsum(options.N_k); -DcmInfo.listBoldResponse = cell(1,N); -DcmInfo.listParameters = cell(N,2); -DcmInfo.listResponseTimeIndices = cell(1,N); -DcmInfo.trueLabels = zeros(1,N); - -for n = 1:N - - k = nnz(n>listN) + 1; % current cluster index - DcmInfo.trueLabels(n) = k; - DcmInfo.listResponseTimeIndices{n} = ... - DcmInfo.trSteps(n):DcmInfo.trSteps(n):DcmInfo.nTime(n); - - bStable = false; - while ~bStable - - % draw subject-specific parameter vector - mu_n = zeros(1,nParameters); - mu_n(DcmInfo.connectionIndicator) = randn(1,p_c).*sigma_k(k,:); - mu_n(nParametersConnect+1:nParametersConnect+p_h) = ... - randn(1,p_h).*sigma_h; - mu_n = mu_n + [mu_k(k,:),mu_h,zeros(1,R-1)]; - - % simulate response BOLD - response = tapas_huge_bold(mu_n,DcmInfo,n); - - % check if DCM stable - dcmParameters = tapas_huge_pack_params(mu_n,[NaN NaN R L]); - responseSum = sum(response(:)); - bStable = ~isnan(responseSum) && ~isinf(abs(responseSum)) && ... - max(svd(dcmParameters{1}))<1; - - end - - % noise model - lambda_nr = snrBold./var(response,0,1); - DcmInfo.listBoldResponse{n} = response + ... - bsxfun(@rdivide,randn(size(response)),sqrt(lambda_nr)); - DcmInfo.listBoldResponse{n} = DcmInfo.listBoldResponse{n}(:); - - DcmInfo.listParameters{n,1} = dcmParameters; - DcmInfo.listParameters{n,2} = lambda_nr; - -end - - -% save rng seed -DcmInfo.rngSeed = rngSeed; -DcmInfo.tag = 'TAPAS:HUGE:v0'; - - -end - diff --git a/huge/tapas_util_logdet.m b/huge/tapas_util_logdet.m deleted file mode 100644 index 306ecaec..00000000 --- a/huge/tapas_util_logdet.m +++ /dev/null @@ -1,33 +0,0 @@ -%% [ ld ] = tapas_util_logdet( A ) -% -% Numerical stable calculation of log-determinant for positive-definite -% matrix. -% -% INPUT: -% A - positive definite matrix. -% -% OUTPUT: -% ld - log(det(A)) -% - -% Author: Sudhir Shankar Raman -% Copyright (C) 2018 Translational Neuromodeling Unit -% Institute for Biomedical Engineering, -% University of Zurich and ETH Zurich. -% -% This file is part of TAPAS, which is released under the terms of the GNU -% General Public Licence (GPL), version 3. For further details, see -% . -% -% This software is intended for research only. Do not use for clinical -% purpose. Please note that this toolbox is in an early stage of -% development. Considerable changes are planned for future releases. For -% support please refer to: -% https://github.com/translationalneuromodeling/tapas/issues -% -function [ld] = tapas_util_logdet(A) - -U = chol(A); -ld = 2*sum(log(diag(U))); - -return; \ No newline at end of file From 0a967a642c70a84e5164a76524d30149bb773ae1 Mon Sep 17 00:00:00 2001 From: yaoy Date: Fri, 23 Aug 2019 14:02:07 +0200 Subject: [PATCH 6/9] - references for user manual --- huge/huge_doc.bib | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 huge/huge_doc.bib diff --git a/huge/huge_doc.bib b/huge/huge_doc.bib new file mode 100644 index 00000000..284c183d --- /dev/null +++ b/huge/huge_doc.bib @@ -0,0 +1,25 @@ +@article{yao2018, + author = {Yao, Yu and Raman, Sudhir S. and Schiek, Michael and Leff, Alex and Frässle, Stefan and Stephan, Klaas E.}, + title = {Variational Bayesian inversion for hierarchical unsupervised generative embedding (HUGE)}, + journal = {NeuroImage}, + volume = {179}, + pages = {604-619}, + ISSN = {1053-8119}, + doi = {10.1016/j.neuroimage.2018.06.073}, + year = {2018}, + type = {Journal Article} +} + +@article{stephan2007, + author = {Stephan, Klaas E. and Weiskopf, Nikolaus and Drysdale, Peter M. and Robinson, Peter A. and Friston, Karl J.}, + title = {Comparing hemodynamic models with DCM}, + journal = {NeuroImage}, + volume = {38}, + number = {3}, + pages = {387-401}, + ISSN = {1053-8119}, + doi = {10.1016/j.neuroimage.2007.07.040}, + year = {2007}, + type = {Journal Article} +} + From 6c534afecbb0e76736ecc05a7b85a11111cd0204 Mon Sep 17 00:00:00 2001 From: yaoy Date: Fri, 23 Aug 2019 14:07:24 +0200 Subject: [PATCH 7/9] - tapas naming scheme --- huge/{huge_doc.bib => tapas_huge_manual.bib} | 0 huge/tapas_huge_manual.tex | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename huge/{huge_doc.bib => tapas_huge_manual.bib} (100%) diff --git a/huge/huge_doc.bib b/huge/tapas_huge_manual.bib similarity index 100% rename from huge/huge_doc.bib rename to huge/tapas_huge_manual.bib diff --git a/huge/tapas_huge_manual.tex b/huge/tapas_huge_manual.tex index e974ae9f..3e85e7d9 100644 --- a/huge/tapas_huge_manual.tex +++ b/huge/tapas_huge_manual.tex @@ -1028,7 +1028,7 @@ \section{Licence and Support} \begin{par} \bibliographystyle{plainnat} -\bibliography{huge_doc} +\bibliography{tapas_huge_manual} \end{par} \vspace{1em} From 37b9bbaa144cbc0790a0aaf639c307f18de2b228 Mon Sep 17 00:00:00 2001 From: Eduardo Aponte Date: Tue, 27 Aug 2019 12:05:43 +0200 Subject: [PATCH 8/9] Update the version number and added references. --- README.md | 2 +- misc/log_tapas.txt | 1 + misc/tapas_version.m | 9 ++++++--- 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 6b20f2c3..34cecad4 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ ![TAPAS Logo](misc/TapasLogo.png?raw=true "TAPAS Logo") -*Version 3.1.0* +*Version 3.2.0* T A P A S - Translational Algorithms for Psychiatry-Advancing Science. ======================================================================== diff --git a/misc/log_tapas.txt b/misc/log_tapas.txt index 5ce21a68..fcc2fb7a 100644 --- a/misc/log_tapas.txt +++ b/misc/log_tapas.txt @@ -1,3 +1,4 @@ +3.2.0 https://www.tapas.tnu-zurich.com/examples_v3.1.0.zip 05cbb1df4eaeab59f88d2c6ad7a87946 3.1.0 https://www.tapas.tnu-zurich.com/examples_v3.1.0.zip 05cbb1df4eaeab59f88d2c6ad7a87946 3.0.1 https://www.tapas.tnu-zurich.com/examples_v3.0.0.zip 81ba0d8cb1267880e0bab5c45a47b18a 3.0.0 https://www.tapas.tnu-zurich.com/examples_v3.0.0.zip 81ba0d8cb1267880e0bab5c45a47b18a diff --git a/misc/tapas_version.m b/misc/tapas_version.m index 840ff8c2..f2827ed0 100644 --- a/misc/tapas_version.m +++ b/misc/tapas_version.m @@ -26,12 +26,15 @@ tapas_print_logo(); fprintf(1, '\n\nVersion %s.%s.%s\n', version{:}); fprintf(1, 'In your citation please include the current version.\n'); - fprintf(1, 'Please cite the corresponding publications according to the toolboxes used:\n') - fprintf(1, 'PhysIO: https://www.ncbi.nlm.nih.gov/pubmed/27832957\n') - fprintf(1, 'HGF: https://www.ncbi.nlm.nih.gov/pubmed/21629826\n') + fprintf(1, 'Please cite the corresponding publications according to the toolboxes used:\n'); + fprintf(1, 'PhysIO: https://www.ncbi.nlm.nih.gov/pubmed/27832957\n'); + fprintf(1, 'HGF: https://www.ncbi.nlm.nih.gov/pubmed/21629826\n'); fprintf(1, ' https://www.ncbi.nlm.nih.gov/pubmed/25477800\n'); fprintf(1, 'MPDCM: https://www.ncbi.nlm.nih.gov/pubmed/26384541\n'); fprintf(1, 'SERIA: https://www.ncbi.nlm.nih.gov/pubmed/28767650\n'); + fprintf(1, 'HUGE: https://www.ncbi.nlm.nih.gov/pubmed/29964187\n'); + fprintf(1, 'rDCM: https://www.ncbi.nlm.nih.gov/pubmed/29807151\n'); + fprintf(1, ' https://www.ncbi.nlm.nih.gov/pubmed/28259780\n'); end end From d2f0084b7d3a7d4bcf6c6f260525753266975e41 Mon Sep 17 00:00:00 2001 From: Eduardo Aponte Date: Thu, 29 Aug 2019 16:24:43 +0200 Subject: [PATCH 9/9] Removed .DS_Store and updated example hash. --- .DS_Store | Bin 6148 -> 0 bytes .gitignore | 1 + misc/log_tapas.txt | 2 +- 3 files changed, 2 insertions(+), 1 deletion(-) delete mode 100644 .DS_Store diff --git a/.DS_Store b/.DS_Store deleted file mode 100644 index f2c1332fd235833cdc3407a58485b9a3e0c7328d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeHK!Ab)$5KY>u*^1bMV2`!C$!Pr}mHg9kxa(Su66%NDy(cT2l<(Y3O_p?~BT z_&d%dX|YtnlZc&x$(u}O67qJ*B#bfMocJ}yN{lf9ikP#Y`9g3UbxCr@gUE3XFBuQL zLF7UIZ7G@@e~|(Fb_F(KZPsF^pTD0s90cRIT7Boad|_>ULx`d%ZWV8wev~+|8&Aef zcXWllGdJ#g#y*dt!Q6Jei=dZuN;|D6jNKsYjZ|{r_aNl@G6?-BX-1RKAFFvBJs^Z7 ztWK$%ru9a>BI}LXv?9|+qgs&%`-ju1C3g2}M;YL1x3NQOyfKS j3{{FD7E5s%R0;Sc8i2OJOe1(e=pvwKpoSRuRR%r)KOs-) diff --git a/.gitignore b/.gitignore index d9282a28..d43b1e47 100644 --- a/.gitignore +++ b/.gitignore @@ -14,3 +14,4 @@ lib *.so *.mexw64 *.asv +*.DS_Store diff --git a/misc/log_tapas.txt b/misc/log_tapas.txt index fcc2fb7a..da54dd5d 100644 --- a/misc/log_tapas.txt +++ b/misc/log_tapas.txt @@ -1,4 +1,4 @@ -3.2.0 https://www.tapas.tnu-zurich.com/examples_v3.1.0.zip 05cbb1df4eaeab59f88d2c6ad7a87946 +3.2.0 https://www.tapas.tnu-zurich.com/examples_v3.2.0.zip 00137f7a332be031fdb2a748a8b1592c 3.1.0 https://www.tapas.tnu-zurich.com/examples_v3.1.0.zip 05cbb1df4eaeab59f88d2c6ad7a87946 3.0.1 https://www.tapas.tnu-zurich.com/examples_v3.0.0.zip 81ba0d8cb1267880e0bab5c45a47b18a 3.0.0 https://www.tapas.tnu-zurich.com/examples_v3.0.0.zip 81ba0d8cb1267880e0bab5c45a47b18a