From 6089c5fe0ebf1e6a83ac5543c6f93425a2b626de Mon Sep 17 00:00:00 2001 From: Matthew Webster <mwebster@fmrib.ox.ac.uk> Date: Wed, 18 Jun 2014 14:55:53 +0000 Subject: [PATCH] This commit was manufactured by cvs2svn to create branch 'newnew'. Sprout from master 2014-06-18 14:55:52 UTC Matthew Webster <mwebster@fmrib.ox.ac.uk> 'potential fix for weird child process bug on some accounts' Cherrypick from master 2013-07-05 13:32:37 UTC Christian Beckmann <c.beckmann@donders.ru.nl> 'fixed f..... up calc_corr in econ mode': Makefile Cherrypick from fsl-5_branch 2014-03-25 16:21:51 UTC Paul McCarthy <paulmc@fmrib.ox.ac.uk> 'Melodic exits early if specified time series/session design matrices do not match the data dimensions/number of input files.': meldata.cc meloptions.cc Delete: doc/anim_gui.gif doc/concat_diag.png doc/gui.png doc/index.html doc/mel1.png doc/mel2.png doc/mel3.png doc/pica_diag.png doc/tica_diag.png dual_regression fsl_dualreg.cc melgmix.cc melgmix.h melhlprfns.cc melhlprfns.h melica.cc melica.h melodic.h meloptions.h melpca.cc melpca.h melreport.cc --- Makefile | 9 +- doc/anim_gui.gif | Bin 50608 -> 0 bytes doc/concat_diag.png | Bin 27772 -> 0 bytes doc/gui.png | Bin 21901 -> 0 bytes doc/index.html | 260 ------------- doc/mel1.png | Bin 12471 -> 0 bytes doc/mel2.png | Bin 8175 -> 0 bytes doc/mel3.png | Bin 7037 -> 0 bytes doc/pica_diag.png | Bin 27267 -> 0 bytes doc/tica_diag.png | Bin 1182593 -> 0 bytes dual_regression | 128 ------ fsl_dualreg.cc | 254 ------------ meldata.cc | 103 +++-- melgmix.cc | 687 -------------------------------- melgmix.h | 207 ---------- melhlprfns.cc | 924 -------------------------------------------- melhlprfns.h | 133 ------- melica.cc | 484 ----------------------- melica.h | 66 ---- melodic.h | 88 ----- meloptions.cc | 4 - meloptions.h | 543 -------------------------- melpca.cc | 127 ------ melpca.h | 55 --- melreport.cc | 807 -------------------------------------- 25 files changed, 49 insertions(+), 4830 deletions(-) delete mode 100644 doc/anim_gui.gif delete mode 100644 doc/concat_diag.png delete mode 100644 doc/gui.png delete mode 100644 doc/index.html delete mode 100644 doc/mel1.png delete mode 100644 doc/mel2.png delete mode 100644 doc/mel3.png delete mode 100644 doc/pica_diag.png delete mode 100644 doc/tica_diag.png delete mode 100755 dual_regression delete mode 100644 fsl_dualreg.cc delete mode 100644 melgmix.cc delete mode 100644 melgmix.h delete mode 100644 melhlprfns.cc delete mode 100644 melhlprfns.h delete mode 100644 melica.cc delete mode 100644 melica.h delete mode 100644 melodic.h delete mode 100644 meloptions.h delete mode 100644 melpca.cc delete mode 100644 melpca.h delete mode 100644 melreport.cc diff --git a/Makefile b/Makefile index 940ec2d..744fb65 100644 --- a/Makefile +++ b/Makefile @@ -16,8 +16,6 @@ TEST_OBJS = test.o GGMIX_OBJS = ggmix.o -FSL_DR_OBJS = melhlprfns.o fsl_dualreg.o - FSL_GLM_OBJS = melhlprfns.o fsl_glm.o FSL_SBCA_OBJS = melhlprfns.o fsl_sbca.o @@ -34,7 +32,7 @@ MELODIC_OBJS = meloptions.o melhlprfns.o melgmix.o meldata.o melpca.o melica.o TESTXFILES = test -XFILES = fsl_dualreg fsl_glm fsl_sbca fsl_mvlm fsl_regfilt fsl_schurprod fsl_bwtf melodic +XFILES = fsl_glm fsl_sbca fsl_mvlm fsl_regfilt fsl_schurprod fsl_bwtf melodic OTHERFILES = @@ -65,7 +63,7 @@ RUNTCLS = Melodic SCRIPTS = melodicreport dual_regression -all: ggmix fsl_regfilt fsl_glm fsl_dr melodic ${OTHERFILES} +all: ggmix fsl_regfilt fsl_glm melodic ${OTHERFILES} ggmix: ${GGMIX_OBJS} ${AR} -r libggmix.a ${GGMIX_OBJS} @@ -76,9 +74,6 @@ melodic: ${MELODIC_OBJS} test: ${TEST_OBJS} $(CXX) ${CXXFLAGS} ${LDFLAGS} -o $@ ${TEST_OBJS} ${LIBS} -fsl_dr: ${FSL_DR_OBJS} - $(CXX) ${CXXFLAGS} ${LDFLAGS} -o $@ ${FSL_DR_OBJS} ${LIBS} - fsl_glm: ${FSL_GLM_OBJS} $(CXX) ${CXXFLAGS} ${LDFLAGS} -o $@ ${FSL_GLM_OBJS} ${LIBS} diff --git a/doc/anim_gui.gif b/doc/anim_gui.gif deleted file mode 100644 index e8be7a74f85b186ee9e0d9d8a4d46bde700c4b17..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 50608 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 diff --git a/doc/concat_diag.png b/doc/concat_diag.png deleted file mode 100644 index 252b34034c426ffa797762ae538f090312dfb208..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27772 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∨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 Ja7_06{9oumYw!R7 diff --git a/doc/gui.png b/doc/gui.png deleted file mode 100644 index dfcab87a5fcd4683f8b5d33ac692e4bb53f39036..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21901 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 diff --git a/doc/index.html b/doc/index.html deleted file mode 100644 index 66af2ea..0000000 --- a/doc/index.html +++ /dev/null @@ -1,260 +0,0 @@ -<HTML><HEAD><link REL="stylesheet" TYPE="text/css" href="../fsl.css"><TITLE>FSL</TITLE></HEAD><BODY><TABLE BORDER=0 WIDTH="100%"><TR><TD ALIGN=CENTER><H1> -MELODIC v3.0 -</H1> -Multivariate Exploratory Linear Optimized Decomposition into Independent Components -<TD ALIGN=RIGHT><a href="../index.html"><IMG BORDER=0 SRC="../images/fsl-logo.jpg"></a></TR></TABLE><HR> - -<IMG ALIGN=RIGHT hspace=20 vspace=20 width=90% SRC="tica_diag.png" -ALT="TICA diagram"> - -<H2>INTRODUCTION</H2> - -<P>MELODIC 3.0 uses Independent Component Analysis to decompose a -single or multiple 4D data sets into different spatial and temporal -components. For ICA group analysis, MELODIC uses either Tensorial -Independent Component Analysis (TICA, where data is decomposed into -spatial maps, time courses and subject/session modes) or a simpler -temporal concatenation approach. MELODIC can pick out different -activation and artefactual components without any explicit time series -model being specified. - -<P>For more detail on MELODIC and an updated journal reference, see -the <A -HREF="http://www.fmrib.ox.ac.uk/analysis/research/melodic/">MELODIC -research web page</A>. If you use MELODIC in your research, please -quote the journal reference listed there. - -<p>The different MELODIC programs are: -<UL> -<LI><a href="#MelodicGUI">Melodic</a> - MELODIC GUI<br> -<LI><a href="#melodic">melodic</a> - command-line MELODIC program<br> -<LI><a href="#regfilt">fsl_regfilt</a> - command-line tool for removing regressors from data (melodic denoising)<br> -</UL> - - -<A NAME="MelodicGUI"></A><hr><H2>Melodic GUI</H2> - -<IMG ALIGN=RIGHT hspace=20 vspace=20 SRC="gui.png" -ALT="Example GUI view"> - -<p>To call the MELODIC GUI, either type <b>Melodic</b> in a terminal - (type <b>Melodic_gui</b> on Mac), or run <b>fsl</b> and press - the <b>MELODIC</b> button. - -<p>Before calling the GUI, you need to prepare each session's -data as a 4D NIFTI or Analyze format image; there are utilities in -fsl/bin called <a href="../avwutils/index.html" target="_top">fslmerge -and fslsplit</a> to convert between multiple 3D images and a single 4D -(3D+time) image. - -<p>Structural images for use as "highres" images in registration -should normally be brain-extracted using <a href="../bet2/index.html" -target="_top">BET</a>. - - -<H3>GUI details:</H3> -<UL> -<LI><a href="#misc">Misc</a><br> -<LI><a href="#data">Data</a><br> -<LI><a href="#prestats">Pre-Stats</a><br> -<LI><a href="#reg">Registration</a><br> -<LI><a href="#stats">Stats</a><br> -<LI><a href="#poststats">Post-Stats</a><br> -<LI><a href="#buttons">Bottom Row of Buttons</a><br> -</UL> -<UL> -<LI><a href="#output">MELODIC report output</a><br> -</UL> - -<a name="misc"></a> -<hr><H3>Misc</H3> - -<p><b>Balloon help</b> (the popup help messages in the MELODIC GUI) can -be turned off once you are familiar with the GUI. - -<p>The <b>Progress watcher</b> button allows you to tell Melodic not to -start a web browser to watch the analysis progress. If you are -running lots of analyses you probably want to turn this off; you can -view the same logging information by looking at the report_log.html or log.txt -files in any MELODIC directories instead. - -<a name="data"></a> -<hr><H3>Data</H3> - -<p>First, set the filename of the 4D input image -(e.g. <b>/users/sibelius/origfunc.nii.gz</b>) by pressing <b>Select 4D -data</b>. You can select multiple files if you want MELODIC to perform -a group analysis or if you want to run separate ICAs with the same -setup. Results for each input file will be saved in separate .ica -directories, the name of which is based on the input data's filename -(unless you enter an <b>Output directory</b> name). - -<p><b>Delete volumes</b> controls the number of initial FMRI volumes -to delete before any further processing. - -<p><b>TR</b> controls the time (in seconds) between scanning -successive FMRI volumes. Changes here will not affect the analysis and only change the x-axis units of the final time series plots. - -<p>The <b>High pass filter cutoff</b> controls the longest temporal -period that you will allow. - -<a name="prestats"></a> -<hr><H3>Pre-Stats</H3> - -<p>Low-frequency drifts and motion in the data can adversely affect -the decomposition. In most cases, you would want to motion-correct the -data, remove these drifts first or perform other types of typical data pre-processing before running the analysis. This can be done from within the -Melodic GUI <code>Pre-stats</code> section. - -<a name="reg"></a> -<hr><H3>Registration</H3> - -<p>Before any multi-session or multi-subject analyses can be carried -out, the different sessions need to be registered to each other. This -is made easy within MELODIC which performs registration on input data as part of an analysis using FEAT functionality. Unlike registration step in FEAT this here needs to be performed before the statistical analysis so that the filtered functional data is transformed into the standard space. For information on using multi-stage registration please consult the <a href="../feat5/detail.html#reg" target="_top">FEAT</a> manual. - -<p><b>Standard space</b> refers to the standard (reference) image; it -should be an image already in standard space, ideally with the -non-brain structures already removed. - -<p><b>Resampling resolution (mm)</b> refers to the desired isotropic voxel dimension of the resampled data. In order to save on disk space and on required memory during the analysis it is advisable to resample the filtered data into standard space but keeping the resampled resolution at the FMRI resolution (typically 4mm or 5mm). - -<a name="stats"></a> -<hr><H3>Stats</H3> - -<p>The Stats section lets you control some of the options for the decomposition. The default setting will most probably already be set to what you would want most of the time. - -<p> By default, MELODIC will variance-normalise timecourses. - -<p> By default, Melodic will automatically estimate the number of - components from the data - you can switch this option off and then can specify the number of components explicitly.<p> - -<p> You can now select the type of analysis. MELODIC currently offers three options: -<p> -<table border=0> - <TR><TD width=50%> - <UL> - <LI><b>Single-session ICA:</b> This will perform standard 2D ICA on each of the input files. The input data will each be represented as a 2D time x space matrix. MELODIC then de-composes each matrix separately into pairs of time courses and spatial maps. The original data is assumed to be the sum of outer products of time courses and spatial maps. All the different time courses (one per component) will be saved in the <i>mixing matrix</i> <code>melodic_mix</code> and all the spatial maps (one per component) will be saved in the 4D file <code>melodic_IC</code>. - <p>When using separate analyses, MELODIC will attempt to find components which are relevant and non-Gaussian relative to the residual fixed-effects within session/subject variation. It is recommended to use this option in order to check for session-specific effects (such as MR artefacts). You will need to use this option if you want to perform MELODIC denoising using <a href="#regfilt">fsl_regfilt</a>. When using single-session ICA the component are ordered in order of decreasing amounts of uniquely explained variance. - - </UL></TD><TD valign=top> - <IMG ALIGN=RIGHT hspace=20 vspace=20 width=80% SRC="pica_diag.png" ALT="PICA diag"> - </TD></TR><TR><TD width=50%> - <UL> - <LI><b>Multi-session temporal concatenation:</b> This will perform a single 2D ICA run on the concatenated data matrix (obtained by stacking all 2D data matrices of every single data set on top of each other). -<p> - It is recommended to use this approach in cases where one is looking for common spatial patterns but can not assume that the associated temporal response is consistent between sessions/subjects. Examples include activation studies where the design was randomised between sessions or the analysis of data acquired without stimulation (<i>resting-state FMRI</i>). - <p>This approach does not assume that the temporal response pattern is the same across the population, though the final web report will contain the first Eigenvector of all different temporal responses as a summary time course. Access to all time courses is available: the time series plot is linked to a text file (<code>tXX.txt</code>) which contains the first Eigenvector, the best model fit in case a time series design was specified and all different subject/session-specific time courses as columns. - -For each component the final mixing matrix <code>melodic_mix</code> contains the temporal response of all different data sets concatenated into a single column vector. The final reported time course will be the best rank-1 approximation to these different responses. <BR> - </UL> - </TD> <TD valign=top> - <IMG ALIGN=RIGHT hspace=20 vspace=20 width =80% SRC="concat_diag.png" ALT="CONCAT diag"> - </TD></TR><TR><TD width=50%> - <UL> - <LI><b>Multi-session Tensor-ICA:</b> This will perform a 3D Tensor-ICA decomposition of the data. All individual data sets will be represented as a single time x space x sessions/subjects block of data. Tensor-ICA will decompose this block of data into triplets of time courses, spatial maps and session/subject modes, which - for each component - characterise the signal variation across the temporal, spatial and subject/session domain. -<p>It is recommended to use this approach for data where the stimulus paradigm is consistent between session/subjects. Tensor-ICA assumes that the temporal response pattern is the same across the population and provides a single decomposition for all original data sets. MELODIC will attempt to find components which are highly non-Gaussian relative to the full mixed-effects variance of the residuals. -<p>Estimated components typically fall into 2 classes: components which describe effects common to all or most subjects/sessions, and components which describe effects only contained in a small number of subjects/sessions. The former will have a non-zero estimated effect size while the latter will have an effect size around 0 for most subjects/sessions and only few high non-zero values. These different types of components can be identified easily by looking at the boxplots provided. When using Tensor-ICA the components are ordered in order of decreasing amount of median response amplitude. For details on the decomposition see the technical report <a href="http://www.fmrib.ox.ac.uk/analysis/techrep/"> TR04CB1 </a>. -</UL> </TD><TD valign=top> - <IMG ALIGN=RIGHT hspace=20 vspace=20 width =80% SRC="tica_diag.png" ALT="TICA diag"> -</TD></TR> -</table> - - -<a name="poststats"></a> -<hr><H3>Post-Stats</H3> - -<p> Melodic will also by default carry out inference on the estimated maps - using a mixture model and an alternative hypothesis testing approach. A threshold level of 0.5 - in the case of alternative hypothesis testing means that a - voxel 'survives' thresholding as soon as the probability - of being in the 'active' class (as modelled by the Gamma - densities) exceeds the probability of being in the - 'background' noise class. This threshold level assumes that - you are placing an equal loss on false-positives and - false-negatives. If, however, you consider e.g. false-positives as - being twice as bad as false-negatives you should change this value - to 0.66... - -<p> You can select the background image used for the generation of the - spatial map overlay images. - -<p> If you select the <b>Output full stats folder</b> option, MELODIC will save thresholded maps and probability maps in a <code>/stats</code> subdirectory within its output folder. - - <p>You can specify a temporal design matrix (and in the case - of a group analysis also, a session/subject design matrix) as well as corresponding contrast matrices. If these matrices are set in the GUI, MELODIC will perform a post-hoc regression analysis on estimated time courses and session/subject modes. This can be a helpful tool in order to identify whether or not a given component is task related. The matrices themselves can be created easily using the <a href=../feat5/programs.html><b>Glm</b></a> GUI. - - <a name="buttons"></a> - <hr><H3>Bottom Row of Buttons</H3> - - <p>When you have finished setting up MELODIC, press <b>Go</b> to run the - analysis. Once MELODIC is running, you can either <b>Exit</b> the GUI, or - setup further analyses. - - <p>The <b>Save</b> and <b>Load</b> buttons enable you to save and load - the complete MELODIC setup to and from file. - -<a name="output"></a> -<hr><H3>MELODIC report output</H3> - -Melodic will then generate the results and -your terminal window will tell you where to find the web report. - -Each IC_XX.html webpage shows one spatial map thresholded and rendered on top of a background image -followed by the relevant time-course of the ICA decomposition and the power-spectrum of the time-course. - -<p> If you click on the thresholded map, you can inspect the raw IC output together with probability maps and the Mixture Model fit. - - -<p>In the case of TICA or simple time series concatenation the time course plotted is the rank-1 approximation to all the different time courses that correspond to the given spatial map within the population. - -<p>If a temporal design was specified in the <a href="#poststats" target="_top">Post-Stats</a> section then the time series plot will also contain a plot of the total model fit. In addition, a simple GLM table will describe the fit in detail, providing information of the regression parameter estimates (PEs). Furthermore, MELODIC will perform a simple F-test on the estimated time course and the total model fit. For task-related components the model fit will explain large amounts of the variation contained in the estimated time couse. In addition, if a contrast matrix was specified, the table will also contain Z-statistics and p-values for all the contrasts. - -If a group analysis was carried out then the report page will also include information on the distribution of the effect size across the population. A simple plot and a boxplot show the relative effect size across the different sessions/subjects. If a design matrix was specified in the GUI setup then MELODIC will also include a GLM regression fit table. - -<A NAME="melodic"></A><HR><H2>melodic command-line program</H2> - -<p>Type <b>melodic --help</b> to get usage. - -<A name="regfilt"></A><HR><H2>fsl_regfilt command-line program</H2> - -<p>Running MELODIC can be a useful tool for gaining insight into unexpected artefacts or activation in your data. - -<p>As well as being a good way to find structured noise (or unexpected - activation) in your data, ICA can also be used to remove chosen - components (normally obvious scanner-related or physiological - artefacts) from your data in order, for example, in order to improve - the FEAT results. In order to do this: - - <UL> - - <LI> Run MELODIC single-session ICA on a 4D image file - - <LI> Open the MELODIC report - (<code>melodic_output_directory.ica/filtered_func_data.ica/report/00index.html</code>) - in a web browser and look through the components to identify those - that you wish to remove; record the list of component numbers to - remove. - - <LI> In a terminal, run the MELODIC denoising, using the - commands:<pre> -cd melodic_output_directory.ica -fsl_regfilt -i filtered_func_data -o denoised_data -d filtered_func_data.ica/melodic_mix -f "2,5,9"</pre> - where you should replace the comma-separated list of component numbers with the list that you previously recorded when viewing the MELODIC report.<br> - </UL> - The output file <code> denoised_data.nii.gz</code> then contains the filtered and denoised data set which can be used e.g. within FEAT. When running FEAT on this data make sure that the analysis is set to <code>Stats + Post-stats </code> as you do not want to run the other filtering steps (smoothing etc.) again on this data. - - -<p><HR><FONT SIZE=1>Copyright © 2001-2007, University of -Oxford. Written by <A - HREF="http://www.fmrib.ox.ac.uk/~beckmann/">C.F. Beckmann </A> and <A -HREF="http://www.fmrib.ox.ac.uk/~steve/index.html">S. Smith</A>.</FONT> - -<br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br> -<br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br> -<br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br> -<br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br> - -</BODY></HTML> - - diff --git a/doc/mel1.png b/doc/mel1.png deleted file mode 100644 index 6de5835db8a62e54cdd441c61893dc087cc32b03..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12471 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 DE~5s{ diff --git a/doc/mel2.png b/doc/mel2.png deleted file mode 100644 index e61c591c062687ff32674e385b8a035e481b28d5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8175 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 diff --git a/doc/mel3.png b/doc/mel3.png deleted file mode 100644 index c3850b8f214535bcc7f2980494a48d2ec7965ae0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7037 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 BHfR6< diff --git a/doc/pica_diag.png b/doc/pica_diag.png deleted file mode 100644 index 120863cc9c8b60c640ad1a7521d954eeace1cc6a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27267 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≫aeV|O8s<Gp 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 W7OV6|!|`=d6wld%Q|=hF=l=lwSsI%F diff --git a/doc/tica_diag.png b/doc/tica_diag.png deleted file mode 100644 index 0e9199cc5d594731aa618cdd1735764ff9894b7d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1182593 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 diff --git a/dual_regression b/dual_regression deleted file mode 100755 index 4806200..0000000 --- a/dual_regression +++ /dev/null @@ -1,128 +0,0 @@ -#!/bin/sh - -# dual_regression - take group-ICA maps (etc) and get subject-specific versions of them (and associated timecourses) -# -# Stephen Smith and Christian Beckmann, FMRIB Image Analysis Group -# -# Copyright (C) 2011-2012 University of Oxford -# -# SHCOPYRIGHT - - -Usage() { - cat <<EOF - -dual_regression v0.5 (beta) - -***NOTE*** ORDER OF COMMAND-LINE ARGUMENTS IS DIFFERENT FROM PREVIOUS VERSION - -Usage: dual_regression <group_IC_maps> <des_norm> <design.mat> <design.con> <n_perm> <output_directory> <input1> <input2> <input3> ......... -e.g. dual_regression groupICA.gica/groupmelodic.ica/melodic_IC 1 design.mat design.con 500 grot \`cat groupICA.gica/.filelist\` - -<group_IC_maps_4D> 4D image containing spatial IC maps (melodic_IC) from the whole-group ICA analysis -<des_norm> 0 or 1 (1 is recommended). Whether to variance-normalise the timecourses used as the stage-2 regressors -<design.mat> Design matrix for final cross-subject modelling with randomise -<design.con> Design contrasts for final cross-subject modelling with randomise -<n_perm> Number of permutations for randomise; set to 1 for just raw tstat output, set to 0 to not run randomise at all. -<output_directory> This directory will be created to hold all output and logfiles -<input1> <input2> ... List all subjects' preprocessed, standard-space 4D datasets - -<design.mat> <design.con> can be replaced with just --1 for group-mean (one-group t-test) modelling. -If you need to add other randomise option then just edit the line after "EDIT HERE" below - -EOF - exit 1 -} - -############################################################################ - -[ "$6" = "" ] && Usage - -ORIG_COMMAND=$* - -ICA_MAPS=`${FSLDIR}/bin/remove_ext $1` ; shift - -DES_NORM=--des_norm -if [ $1 = 0 ] ; then - DES_NORM="" -fi ; shift - -if [ $1 = "-1" ] ; then - DESIGN="-1" - shift -else - dm=$1 - dc=$2 - DESIGN="-d $1 -t $2" - shift 2 -fi - -NPERM=$1 ; shift - -OUTPUT=`${FSLDIR}/bin/remove_ext $1` ; shift - -while [ _$1 != _ ] ; do - INPUTS="$INPUTS `${FSLDIR}/bin/remove_ext $1`" - shift -done - -############################################################################ - -mkdir $OUTPUT -LOGDIR=${OUTPUT}/scripts+logs -mkdir $LOGDIR -echo $ORIG_COMMAND > $LOGDIR/command -if [ "$DESIGN" != -1 ] ; then - /bin/cp $dm $OUTPUT/design.mat - /bin/cp $dc $OUTPUT/design.con -fi - -echo "creating common mask" -j=0 -for i in $INPUTS ; do - echo "$FSLDIR/bin/fslmaths $i -Tstd -bin ${OUTPUT}/mask_`${FSLDIR}/bin/zeropad $j 5` -odt char" >> ${LOGDIR}/drA - j=`echo "$j 1 + p" | dc -` -done -ID_drA=`$FSLDIR/bin/fsl_sub -T 10 -N drA -l $LOGDIR -t ${LOGDIR}/drA` -cat <<EOF > ${LOGDIR}/drB -#!/bin/sh -\$FSLDIR/bin/fslmerge -t ${OUTPUT}/maskALL \`\$FSLDIR/bin/imglob ${OUTPUT}/mask_*\` -\$FSLDIR/bin/fslmaths $OUTPUT/maskALL -Tmin $OUTPUT/mask -\$FSLDIR/bin/imrm $OUTPUT/mask_* -EOF -chmod a+x ${LOGDIR}/drB -ID_drB=`$FSLDIR/bin/fsl_sub -j $ID_drA -T 5 -N drB -l $LOGDIR ${LOGDIR}/drB` - -echo "doing the dual regressions" -j=0 -for i in $INPUTS ; do - s=subject`${FSLDIR}/bin/zeropad $j 5` - echo "$FSLDIR/bin/fsl_glm -i $i -d $ICA_MAPS -o $OUTPUT/dr_stage1_${s}.txt --demean -m $OUTPUT/mask ; \ - $FSLDIR/bin/fsl_glm -i $i -d $OUTPUT/dr_stage1_${s}.txt -o $OUTPUT/dr_stage2_$s --out_z=$OUTPUT/dr_stage2_${s}_Z --demean -m $OUTPUT/mask $DES_NORM ; \ - $FSLDIR/bin/fslsplit $OUTPUT/dr_stage2_$s $OUTPUT/dr_stage2_${s}_ic" >> ${LOGDIR}/drC - j=`echo "$j 1 + p" | dc -` -done -ID_drC=`$FSLDIR/bin/fsl_sub -j $ID_drB -T 30 -N drC -l $LOGDIR -t ${LOGDIR}/drC` - -echo "sorting maps and running randomise" -j=0 -Nics=`$FSLDIR/bin/fslnvols $ICA_MAPS` -while [ $j -lt $Nics ] ; do - jj=`$FSLDIR/bin/zeropad $j 4` - - RAND="" - if [ $NPERM -eq 1 ] ; then - RAND="$FSLDIR/bin/randomise -i $OUTPUT/dr_stage2_ic$jj -o $OUTPUT/dr_stage3_ic$jj -m $OUTPUT/mask $DESIGN -n 1 -V -R" - fi - if [ $NPERM -gt 1 ] ; then - # EDIT HERE - RAND="$FSLDIR/bin/randomise -i $OUTPUT/dr_stage2_ic$jj -o $OUTPUT/dr_stage3_ic$jj -m $OUTPUT/mask $DESIGN -n $NPERM -T -V" - fi - - echo "$FSLDIR/bin/fslmerge -t $OUTPUT/dr_stage2_ic$jj \`\$FSLDIR/bin/imglob $OUTPUT/dr_stage2_subject*_ic${jj}.*\` ; \ - $FSLDIR/bin/imrm \`\$FSLDIR/bin/imglob $OUTPUT/dr_stage2_subject*_ic${jj}.*\` ; $RAND" >> ${LOGDIR}/drD - j=`echo "$j 1 + p" | dc -` -done -ID_drD=`$FSLDIR/bin/fsl_sub -j $ID_drC -T 60 -N drD -l $LOGDIR -t ${LOGDIR}/drD` - diff --git a/fsl_dualreg.cc b/fsl_dualreg.cc deleted file mode 100644 index bc0fb91..0000000 --- a/fsl_dualreg.cc +++ /dev/null @@ -1,254 +0,0 @@ -/* test.cc - - Christian F. Beckmann, FMRIB Analysis Group - - Copyright (C) 1999-20013 University of Oxford */ - -/* CCOPYRIGHT */ - -#include "libvis/miscplot.h" -#include "miscmaths/miscmaths.h" -#include "miscmaths/miscprob.h" -#include "utils/options.h" -#include <vector> -#include <ctime> -#include "newimage/newimageall.h" -#include "melhlprfns.h" -#include <iostream> - -#ifdef __APPLE__ -#include <mach/mach.h> -#define memmsg(msg) { \ - struct task_basic_info t_info; \ - mach_msg_type_number_t t_info_count = TASK_BASIC_INFO_COUNT; \ - if (KERN_SUCCESS == task_info(mach_task_self(), TASK_BASIC_INFO, (task_info_t) &t_info, &t_info_count)) \ - { \ - cout << msg << " res: " << t_info.resident_size/1000000 << " virt: " << t_info.virtual_size/1000000 << "\n"; \ - cout.flush(); \ - } \ -} -#else -#define memmsg(msg) { \ - cout << msg; \ -} -#endif - -// a simple message macro that takes care of cout and log -#define message(msg) { \ - cout << msg; \ - cout.flush(); \ -} - -#define outMsize(msg,Mat) { \ - cerr << " " << msg << " " <<Mat.Nrows() << " x " << Mat.Ncols() << endl; \ -} - - -using namespace MISCPLOT; -using namespace MISCMATHS; -using namespace Utilities; -using namespace std; -using namespace Melodic; - -// GLOBALS - -clock_t tictime; - - -// The two strings below specify the title and example usage that is -// printed out as the help or usage message - - string title=string("fsl_BLAH")+ - string("\nAuthor: Christian F. Beckmann \nCopyright(c) 2008-2013 University of Oxford\n")+ - string(" \n \n")+ - string(" \n"); - string examples="fsl_BLAH [options]"; - -//Command line Options { - Option<string> fnin(string("-i,--in"), string(""), - string("input file name (matrix 3D or 4D image)"), - false, requires_argument); - Option<string> fnmask(string("-m"), string(""), - string("mask file name "), - false, requires_argument); - Option<int> help(string("-h,--help"), 0, - string("display this help text"), - false,no_argument); - Option<int> xdim(string("-x,--xdim"), 0, - string("xdim"), - false,requires_argument); - Option<int> ydim(string("-y,--ydim"), 0, - string("ydim"), - false,requires_argument); - Option<int> econ(string("-e,--econ"), 0, - string("econ: how to liump stuff"), - false,requires_argument); - /* -} -*/ -//////////////////////////////////////////////////////////////////////////// - -// Local functions - -void tic(){ - tictime = clock(); -} - -void toc(){ - cerr << endl << "TOC: " << float(clock()-tictime)/CLOCKS_PER_SEC << " seconds" << endl<<endl; -} - -Matrix calccorr(const Matrix& in, int econ) - { - Matrix Res; - int nrows=in.Nrows(); - int ncols=in.Ncols(); - Res = zeros(nrows,nrows); - - if(econ>0){ - RowVector colmeans(ncols); - for (int n=1; n<=ncols; n++) { - colmeans(n)=0; - for (int m=1; m<=nrows; m++) { - colmeans(n)+=in(m,n); - } - colmeans(n)/=nrows; - } - int dcol = econ; - Matrix suba; - - for(int ctr=1; ctr <= in.Ncols(); ctr+=dcol){ - suba=in.SubMatrix(1,nrows,ctr,Min(ctr+dcol-1,ncols)); - int scolmax = suba.Ncols(); - - for (int n=1; n<=scolmax; n++) { - double cmean=colmeans(ctr + n - 1); - for (int m=1; m<=nrows; m++) { - suba(m,n)-=cmean; - } - } - - Res += suba*suba.t() / ncols; - } - } - else - Res = cov(in.t()); - return Res; - } //Matrix calccorr - -void convert_to_mat(volume4D<float>& in, volume<float>& mask, Matrix& out) -{ - out = in[0].vec(mask).t(); - in.deletevolume(0); - while(in.tsize()>0){ - out &= in[0].vec(mask).t(); - in.deletevolume(0); - } -} - -int do_work(int argc, char* argv[]) { - - - tic(); - Matrix MatrixData; - volume<float> Mean; - - if(xdim.value()==0 && ydim.value()==0) - { - volume4D<float> RawData; - volume<float> theMask; - toc(); - //read data - message("Reading data file " << (string)fnin.value() << " ... "); - read_volume4D(RawData,fnin.value()); - message(" done" << endl); - - Mean = meanvol(RawData); - toc(); - message("Reading mask file " << (string)fnmask.value() << " ... "); - read_volume(theMask,fnmask.value()); - - MatrixData = RawData.matrix(); - - memmsg("start"); - Matrix res; - convert_to_mat(RawData,theMask, res); - - memmsg(" Before reshape "); - - write_ascii_matrix("mat1", res); - write_ascii_matrix("mat2", MatrixData); - - - } - else{ - Matrix data = unifrnd(xdim.value(),ydim.value()); - outMsize("data", data); - tic(); calccorr(data,econ.value()); toc(); - - data = unifrnd(10,100); - outMsize("data", data); - tic(); calccorr(data,econ.value()); toc(); - - data = unifrnd(100,1000); - outMsize("data", data); - tic(); calccorr(data,econ.value()); toc(); - - data = unifrnd(100,10000); - outMsize("data", data); - tic(); calccorr(data,econ.value()); toc(); - - data = unifrnd(300,200000); - outMsize("data", data); - tic(); calccorr(data,econ.value()); toc(); - - data = unifrnd(500,20000); - outMsize("data", data); - tic(); calccorr(data,econ.value()); toc(); - - data = unifrnd(500,200000); - outMsize("data", data); - tic(); calccorr(data,econ.value()); toc(); - - - } - - - return 0; -} - -//////////////////////////////////////////////////////////////////////////// - - int main(int argc,char *argv[]){ - Tracer tr("main"); - OptionParser options(title, examples); - try{ - // must include all wanted options here (the order determines how - // the help message is printed) - - options.add(fnin); - options.add(fnmask); - options.add(help); - options.add(xdim); - options.add(ydim); - options.add(econ); - options.parse_command_line(argc, argv); - - // line below stops the program if the help was requested or - // a compulsory option was not set - if ( (help.value()) || (!options.check_compulsory_arguments(true)) ){ - options.usage(); - exit(EXIT_FAILURE); - }else{ - // Call the local functions - return do_work(argc,argv); - } - }catch(X_OptionError& e) { - options.usage(); - cerr << endl << e.what() << endl; - exit(EXIT_FAILURE); - }catch(std::exception &e) { - cerr << e.what() << endl; - } - } - diff --git a/meldata.cc b/meldata.cc index e1fd9b4..fc1ee3e 100644 --- a/meldata.cc +++ b/meldata.cc @@ -56,6 +56,16 @@ namespace Melodic{ tmpData = RawData.matrix(Mask); memmsg(" after reshape "); } + + // If a time series model design was specified, check + // that the data dimensions match the model dimensions + if (Tdes.Storage() && (tmpData.Nrows() != Tdes.Nrows())) { + + cerr << "ERROR: " << fname << " " << + "- data dimensions (" << tmpData.Nrows() << ") " << + "do not match model dimensions (" << Tdes.Nrows() << ")" << endl; + exit(2); + } //convert to percent BOLD signal change if(opts.pbsc.value()){ @@ -79,7 +89,7 @@ namespace Melodic{ if(opts.remove_meantc.value()){ remmean(tmpData,meanC,2); } - + //convert to power spectra if(opts.pspec.value()){ message(" Converting data to powerspectra ..."); @@ -115,48 +125,18 @@ namespace Melodic{ message(" done" << endl); } - //INSTACORRS - Matrix tmpTC; - tmpTC = tmpData * insta_maps.t(); - - if(opts.insta_fn.value().length()>0){ - dbgmsg(string("BEGIN: INSTACORR") << endl); - if(opts.insta_idx.value()<1 || opts.insta_idx.value()>tmpTC.Ncols()){ - cerr << "ERROR:: INSTACORR index is wrong \n\n"; - exit(2); - } - - Matrix tmpRef = tmpTC.Column(opts.insta_idx.value()); - if(opts.insta_idx.value()>1){ - // swap columns - dbgmsg(string("INSTACORR: swap columns") << endl); - tmpTC.Column(opts.insta_idx.value()) << tmpTC.Column(1); - tmpTC.Column(1) << tmpRef; - } - - if(opts.insta_partial.value() && tmpTC.Ncols()>1){ - // partal correlations - dbgmsg(string("INSTACORR: partial analysis") << endl); - Matrix tmpConf = tmpTC.Columns(2,tmpTC.Ncols()); - tmpData -= tmpConf * (pinv(tmpConf) * tmpData); - tmpRef -= tmpConf * (pinv(tmpConf) * tmpRef); - } - - if(opts.insta_varnorm.value()){ - dbgmsg(string("INSTACORR: varnorm") << endl); - Matrix vscales = pow(stdev(tmpData,1),-1); - varnorm(tmpData,vscales); - varnorm(tmpRef,pow(stdev(tmpRef,1),-1)); - } + //convert to instacorrs + if(opts.insta_fn.value()>""){ + Matrix vscales = pow(stdev(tmpData,1),-1); + varnorm(tmpData,vscales); - // Shur product - dbgmsg(string("INSTACORR: SP") << endl); - SP4(tmpData,tmpRef); + Matrix tmpTC = tmpData * insta_mask.t(); + varnorm(tmpTC,pow(stdev(tmpTC),-1)); - dbgmsg(string("END: INSTACORR") << endl); - } - //END INSTACORRS + for(int ctr=1; ctr <=tmpData.Ncols();ctr++) + tmpData.Column(ctr) = SP(tmpData.Column(ctr),tmpTC); + } tmpData.Release(); dbgmsg(string("END: process_file") << endl); @@ -650,6 +630,19 @@ namespace Melodic{ create_RXweight(); } + //set up instacorr mask image + if(opts.insta_fn.value()>""){ + dbgmsg(string(" Setting up instacorr mask") << endl); + volume4D<float> tmp_im; + read_volume4D(tmp_im,opts.insta_fn.value()); + + if(!samesize(Mean,tmp_im[0])){ + cerr << "ERROR:: instacorr mask and data have different voxel dimensions \n\n"; + exit(2); + } + insta_mask = tmp_im.matrix(Mask); + } + //seed the random number generator double tmptime = time(NULL); if ( opts.seed.value() != -1 ) { @@ -687,8 +680,20 @@ namespace Melodic{ TconF = read_ascii_matrix(opts.fn_TconF.value()); if(opts.fn_SconF.value().length()>0) SconF = read_ascii_matrix(opts.fn_SconF.value()); - - if(numfiles>1 && Sdes.Storage() == 0){ + + // Check that the number of input + // files matches the session design + if (Sdes.Storage()) { + if (Sdes.Nrows() != numfiles) { + cerr << "ERROR: Number of input files (" << numfiles << ") " << + "does not match subject/session design (" << Sdes.Nrows() << ")" << endl; + exit(2); + } + } + + // Or create a default session design + // if one was not specified + else if(numfiles>1){ Sdes = ones(numfiles,1); if(Scon.Storage() == 0){ Scon = ones(1,1); @@ -697,20 +702,6 @@ namespace Melodic{ } remmean(Tdes); - //INSTACORRS - if(opts.insta_fn.value().length()>0){ - message(" Reading in " << opts.insta_fn.value() - << " for instantaneous correlation analysis" <<endl); - volume4D<float> tmp_im; - read_volume4D(tmp_im,opts.insta_fn.value()); - - if(!samesize(Mean,tmp_im[0])){ - cerr << "ERROR:: instacorr mask and data have different voxel dimensions \n\n"; - exit(2); - } - insta_maps = tmp_im.matrix(Mask); - } - dbgmsg(string("END: setup_misc") << endl); } diff --git a/melgmix.cc b/melgmix.cc deleted file mode 100644 index c8a8707..0000000 --- a/melgmix.cc +++ /dev/null @@ -1,687 +0,0 @@ -/* MELODIC - Multivariate exploratory linear optimized decomposition into - independent components - - melgmix.cc - Gaussian Mixture Model - - Christian F. Beckmann, FMRIB Analysis Group - - Copyright (C) 1999-2013 University of Oxford */ - -/* CCOPYRIGHT */ - -#include "newimage/newimageall.h" -//#include "melmmopts.h" -#include "melgmix.h" -//#include "melmm.h" -#include "utils/log.h" -#include "miscmaths/miscprob.h" -#include <time.h> -#include "libvis/miscplot.h" -#include "libvis/miscpic.h" - -using namespace Utilities; -using namespace NEWIMAGE; -using namespace MISCPLOT; -using namespace MISCPIC; - -string float2str(float f,int width, int prec, bool scientif){ - ostringstream os; - int redw = int(std::abs(std::log10(std::abs(f))))+1; - if(width>0) - os.width(width); - if(scientif) - os.setf(ios::scientific); - os.precision(redw+std::abs(prec)); - os.setf(ios::internal, ios::adjustfield); - os << f; - return os.str(); -} - -namespace Melodic{ - - void MelGMix::setup(const RowVector& dat, - const string dirname, - int cnum, volume<float> themask, - volume<float> themean, - int num_mix, float eps, bool fixit){ - cnumber = cnum; - Mask = themask; - Mean = themean; - prefix = string("IC_")+num2str(cnum); - - fitted = false; - nummix = num_mix; - numdata = dat.Ncols(); - - //normalise data - datamean = mean(dat,2).AsScalar(); - datastdev= stdev(dat,2).AsScalar(); - data=(dat - datamean)/datastdev; - - dbgmsg(" mapdat; mean: " << datamean << " std: " <<datastdev << endl); - - props=zeros(1,nummix); - vars=zeros(1,nummix); - means=zeros(1,nummix); - Params=zeros(1,nummix); - logprobY = 1.0; - - props = std::pow(float(nummix),float(-1.0)); - - Matrix tmp1; - tmp1 = data * data.t() / numdata; - vars = tmp1.AsScalar(); - - float Dmin, Dmax, IntSize; - Dmin = min(data).AsScalar(); Dmax = max(data).AsScalar(); - IntSize = Dmax / nummix; - - means(1)=mean(data,2).AsScalar(); - for (int ctr=2; ctr <= means.Ncols(); ctr++){ - means(ctr) = Dmax - (ctr - 1.5) * IntSize; - } - means(2)=means(1)+2*sqrt(vars(1)); - if(nummix>2) - means(3)=means(1)-2*sqrt(vars(1)); - - epsilon = eps; - if(epsilon >=0 && epsilon < 0.0000001) - {epsilon = std::log(float(dat.Ncols()))/1000 ;} - fixdim = fixit; - dbgmsg(" parameters; " << means << " : " << vars << " : " << props << endl); - } - - Matrix MelGMix::threshold(const RowVector& dat, string levels){ - Matrix Res; - Res = 1.0; - string tmpstr; - tmpstr = levels; - //cerr << " Levels : " << levels << endl << endl; - Matrix levls(1,4); - levls = 0; - Matrix fpr; - Matrix fdr; - Matrix nht; - - char *p; - char t[1024]; - const char *discard = ", [];{(})abceghijklmoqstuvwxyzABCEGHIJKLMNOQSTUVWXYZ~!@#$%^&*_-=+|\':></?"; - - strcpy(t, tmpstr.c_str()); - p=strtok(t,discard); - while(p){ - Matrix New(1,1); - New(1,1) = atof(p); - if(strchr(p,'d')){ - levls(1,3)++; - if(fdr.Storage()>0){ - fdr = fdr | New; - }else{ - fdr = New; - } - }else{ - if(strchr(p,'p')){ - levls(1,2)++; - if(fpr.Storage()>0){ - fpr = fpr | New; - }else{ - fpr = New; - } - }else{ - if(strchr(p,'n')){ - levls(1,4)++; - if(nht.Storage()>0){ - nht = nht | New; - }else{ - nht = New; - } - }else{ - levls(1,1)++; - levls = levls | New; - } - } - } - p=strtok(NULL,discard); - } - - if(fpr.Storage()>0){levls = levls | fpr;} - if(fdr.Storage()>0){levls = levls | fdr;} - if(nht.Storage()>0){levls = levls | nht;} - - // cerr << " levles : " << levls << endl << endl; - Res = threshold(data, levls); - set_threshmaps(Res); - - return Res; - } - - Matrix MelGMix::threshold(const RowVector& dat, Matrix& levels){ - Matrix tests; - tests=levels; - Matrix Nprobs; - - //if only single Gaussian: resort to nht - if(nummix==1||props(1)>0.999||probmap.Sum()<0.05){ - if(levels(1,4)==0){ - Matrix New(1,6); - New(1,5)=0.05; - New(1,6)=0.01; - New(1,4)=2;New(1,1)=0;New(1,2)=0;New(1,3)=0;tests=New; - }else{ - Matrix New; - New = levels.Columns(int(1+levels(1,1)+levels(1,2) - +levels(1,3)),levels.Ncols()); - New(1,4) = levels(1,4); - New(1,1)=0;New(1,1)=0;New(1,3)=0; - tests=New; - } - } - - int numtests = int(tests(1,1)+tests(1,2)+tests(1,3)+tests(1,4)); - Matrix Res(numtests,numdata); - Res = 0.0; - int next = 1; - - for(int ctr1=1;ctr1<=tests(1,1);ctr1++){ - if(4+next <= tests.Ncols()){ - message(" alternative hypothesis test at p > " << tests(1,4+next) << endl); - add_infstr(" alternative hypothesis test at p > "+float2str(tests(1,4+next),0,2,false)); - Matrix tmpNull; - tmpNull = dat; -/* - float cutoffpos, cutoffneg; - cutoffpos = means(1)+100*std::sqrt(vars(1)+0.0000001); - cutoffneg = means(1)-100*std::sqrt(vars(1)+0.0000001); - - for(int ctr=1; ctr<=tmpNull.Ncols(); ctr++) - if( probmap(ctr) > tests(1,4+next) ){ - if( dat(ctr) > means(1) ) - cutoffpos = std::min(cutoffpos, float(dat(ctr))); - else - cutoffneg = std::max(cutoffneg, float(dat(ctr))); - } - - for(int ctr=1; ctr<=tmpNull.Ncols(); ctr++) - if( (dat(ctr) > cutoffneg) && (dat(ctr) < cutoffpos) ) - tmpNull(1,ctr)=0.0; -*/ - for(int ctr=1; ctr<=tmpNull.Ncols(); ctr++) - if( probmap(ctr) < tests(1,4+next) ){ - tmpNull(1,ctr)=0.0; - } - - Res.Row(next) << tmpNull; - } - next++; - } - - for(int ctr1=1;ctr1<=tests(1,2);ctr1++){ - if(4+next <=tests.Ncols()){ - cerr << " false positives control " << tests(1,4+next)<<endl; - Matrix tmp1; - tmp1 = normcdf(dat,means(1),vars(1)); - Matrix tmpNull; - tmpNull = dat; - for(int ctr=1; ctr<=tmp1.Ncols(); ctr++) - if(tmp1(1,ctr) < tests(1,4+next)) - tmpNull(1,ctr)=0.0; - Res.Row(next) << tmpNull; - } - next++; - } - - for(int ctr1=1;ctr1<=tests(1,3);ctr1++){ - if(4+next <=tests.Ncols()){ - message(" Local False Discovery Rate control at p < " << tests(1,4+next) << endl); - add_infstr(" Local False Discovery Rate control at p < "+float2str(tests(1,4+next),0,2,false)); - RowVector tmp=dat; - SortAscending(tmp); - RowVector newcdf(tmp); - newcdf << normcdf(tmp,means(1),vars(1)); - - float thrp = tmp(tmp.Ncols())+0.01; - float thrn = tmp(1)-0.01; - int ctr=tmp.Ncols(); - do{ - thrp = tmp(ctr); - ctr-=1; - }while(ctr>0 && ( (1.0-newcdf(ctr))*tmp.Ncols() < (tests(1,4+next)*(tmp.Ncols()-ctr+1)) )); - - ctr=1; - do{ - thrn = tmp(ctr); - ctr+=1; - }while(ctr<=tmp.Ncols() && ( (newcdf(ctr))*tmp.Ncols() < (tests(1,4+next)*ctr))); - - tmp = dat; - for(ctr=1; ctr<=tmp.Ncols();ctr++) - if((tmp(ctr) < thrp)&&(tmp(ctr) > thrn)) - tmp(ctr) = 0.0; - Res.Row(next) << tmp; - } - next++; - } - - for(int ctr1=1;ctr1<=tests(1,4);ctr1++){ - if(4+next <=tests.Ncols()){ - message(" 2-sided null hypothesis test at " << tests(1,4+next)<<endl); - add_infstr(" 2-sided null hypothesis test at "+float2str(tests(1,4+next),0,2,false)); - double mu, sig; - mu = dat.Sum()/numdata; - sig = var(dat,2).AsScalar(); - Matrix tmp1; - tmp1 = normcdf(dat,mu,std::abs(sig)); - Matrix tmpNull; - tmpNull = dat; - for(int ctr=1; ctr<=tmp1.Ncols(); ctr++) - if((tmp1(1,ctr) < 1-0.5*(tests(1,4+next))&& - (tmp1(1,ctr) > 0.5*(tests(1,4+next))))) - tmpNull(1,ctr)=0.0; - Res.Row(next) << tmpNull; - } - next++; - } - - return Res; - } - - /* GMM fitting */ - - void MelGMix::gmmupdate(){ - int it_ctr = 1; - bool exitloop = false; - float oldll; - - Matrix tmp0;Matrix tmp1;Matrix prob_K__y_theta; - Matrix kdata; - RowVector prob_Y__theta;RowVector Nbar; - RowVector mubar;RowVector sigmabar;RowVector pibar; - - do{ - oldll = logprobY; - - //make sure all variances are acceptable - for(int ctr1=1; ctr1 <=vars.Ncols(); ctr1++) - if(vars(ctr1)<0.0001){ - vars(ctr1) = 0.0001; - } - - tmp0 = normpdf(data,means,vars); - tmp1 = SP(props.t()*ones(1,numdata),tmp0); - prob_Y__theta << sum(tmp1,1); - logprobY = log(prob_Y__theta).Sum(); - prob_K__y_theta = SP(tmp1,pow(ones(nummix,1)*prob_Y__theta,-1)); - Nbar << sum(prob_K__y_theta,2).t(); - pibar = Nbar / numdata; - kdata = ones(nummix,1)*data; - mubar <<SP(sum(SP(kdata,prob_K__y_theta),2).t(),pow(Nbar,-1)); - kdata -= mubar.t()*ones(1,numdata); - kdata = pow(kdata,2); - sigmabar << SP(sum(SP(kdata,prob_K__y_theta),2).t(),pow(Nbar,-1)); - - means = mubar; - vars = sigmabar; - props = pibar; - - if(epsilon<0){exitloop = it_ctr >= -epsilon;} - else{exitloop = (((logprobY-oldll < epsilon)&&(it_ctr>20)) - ||(it_ctr>400));} - it_ctr++; - }while(!exitloop); - } - - void MelGMix::gmmfit(){ - int i,j; - - if(fixdim){ - if(nummix>1){ - gmmupdate(); - add_params(means,vars,props,logprobY,MDL,Evi,true); - }else{ - means.ReSize(1); - means = data.Sum()/numdata; - vars.ReSize(1); - vars = var(data,2); - props.ReSize(1); - props = 1.0; - gmmevidence(); - } - }else{ - RowVector Score(Params.Ncols()); - do{ - gmmupdate(); - Score(nummix) = gmmevidence(); - int idx1,idx2; - RowVector pitmp = props; - - pitmp.MaximumAbsoluteValue1(idx1); - pitmp(idx1)=0.0; - pitmp.MaximumAbsoluteValue1(idx2); - - if(props.MaximumAbsoluteValue1(i)<0.9){ - if((vars(idx2)>0.15)&& - (std::abs(means(idx2)-means(idx1))<0.5*vars(idx1))){ - Score(nummix) = Score(nummix)/(2*(means(idx1))); - } - } - - add_params(means,vars,props,logprobY,MDL,Evi,true); - - gmmreducemm(); - means = means.Columns(1,nummix); - vars = vars.Columns(1,nummix); - props = props.Columns(1,nummix); - - }while(nummix>1); - means.ReSize(1); - means = data.Sum()/numdata; - vars.ReSize(1); - vars = var(data,2); - props.ReSize(1); - props = 1.0; - Score(nummix) = gmmevidence(); - add_params(means,vars,props,logprobY,MDL,Evi,true); - //identify best MM - Score.MinimumAbsoluteValue2(i,j); - means.ReSize(j); - vars.ReSize(j); - props.ReSize(j); - nummix = j; - int index; index = 3 + (j-1)*5; - means = Params.SubMatrix(index,index,1,j); - vars = Params.SubMatrix(index+1,index+1,1,j); - props = Params.SubMatrix(index+2,index+2,1,j); - } - - props.MaximumAbsoluteValue2(i,j); - if(j>1){ - float tmp; - tmp = means(1);means(1) = means(j);means(j)=tmp; - tmp = vars(1);vars(1) = vars(j);vars(j)=tmp; - tmp = props(1);props(1) = props(j);props(j)=tmp; - } - - add_params(means,vars,props,logprobY,MDL,Evi,true); - - if(nummix==1) - probmap << normcdf(data,means(1),vars(1)); - else{ - Matrix Nprobs; - Matrix tmp0; - tmp0 = normpdf(data,means,vars); - Nprobs = SP(props.t()*ones(1,numdata),tmp0); - tmp0 = ones(Nprobs.Nrows(),1)*pow(sum(Nprobs,1),-1); - Nprobs = SP(tmp0,Nprobs); - probmap << SP(sum(Nprobs.Rows(2,Nprobs.Nrows()),1), - pow(sum(Nprobs,1),-1)); - } - } - - float MelGMix::gmmevidence(){ - Matrix tmp0; - if(means.Ncols()>1){ - tmp0 = normpdf(data,means,vars); - }else{ - tmp0 = normpdf(data,means.AsScalar(),vars.AsScalar()); - } - Matrix tmp1; - tmp1 = SP(props.t()*ones(1,numdata),tmp0); - tmp0 = SP(tmp0,pow(ones(nummix,1)*sum(tmp1,1),-1)); - tmp0 = pow(tmp0-ones(nummix,1)*tmp0.Row(nummix),2); - float logH = 0; - if(means.Ncols()>1){ - logH = sum(log(sum(tmp0.Rows(1,nummix-1),2)),1).AsScalar(); - } - logH = logH + 2*sum(log(std::sqrt(2.0)*numdata*props),2).AsScalar(); - logH = logH - 2*sum(props,2).AsScalar(); - - RowVector prob_Y__theta; - prob_Y__theta << sum(tmp1,1); - logprobY = log(prob_Y__theta).Sum(); - MDL = -logprobY + (1.5*nummix-0.5)* std::log(float(numdata)); - Evi = -logprobY +nummix*std::log(2.0)-std::log(MISCMATHS::gamma(nummix)) - -3*nummix/2*std::log(M_PI)+0.5*logH; - - return Evi; - } - - void MelGMix::gmmreducemm(){ - Matrix dlm(nummix,nummix); - Matrix mus(nummix,nummix); - Matrix rs(nummix,nummix); - - for(int ctri=1;ctri<=nummix; ctri++){ - for(int ctrj=1;ctrj<=nummix; ctrj++){ - mus(ctri,ctrj) = (props(ctri)*means(ctri)+props(ctrj)*means(ctrj)) - /(props(ctri)+props(ctrj)); - rs(ctri,ctrj) = (props(ctri)*(vars(ctri)+ - std::pow(means(ctri)-mus(ctri,ctrj),2) ) - + props(ctrj)*(vars(ctrj) - + std::pow(means(ctrj)-mus(ctri,ctrj),2))) - / (props(ctri)+props(ctrj)); - dlm(ctri,ctrj) = 0.5*numdata*( - props(ctri)*std::log( - std::abs(rs(ctri,ctrj))/std::abs(vars(ctri))) - + props(ctrj)*std::log(std::abs(rs(ctri,ctrj)) - / std::abs(vars(ctrj)))); - } - } - - dlm += IdentityMatrix(nummix)*dlm.Maximum(); - - int i,j; - float val; - val=dlm.MinimumAbsoluteValue2(i,j); - - nummix--; - - RowVector newmean(nummix); - RowVector newvars(nummix); - RowVector newprop(nummix); - - int ctr0 = 1; - for(int ctr=1; ctr<=nummix+1; ctr++){ - if(ctr!=i&&ctr!=j){ - newmean(ctr0) = means(ctr); - newvars(ctr0) = vars(ctr); - newprop(ctr0) = props(ctr); - ctr0++; - } - } - //cerr << "ctr0 " << ctr0 << endl; - if(ctr0<=nummix){ - newmean(ctr0) = mus(i,j); - newvars(ctr0) = rs(i,j); - newprop(ctr0) = props(i)+props(j); - - means = newmean; - vars=newvars; - props=newprop; - } - } - - void MelGMix::ggmfit(){ - // fit a mixture of a Gaussian and multiple Gamma functions to the histogram - - float log_p_y_theta = 1.0; - float old_ll = 2.0; - float g_eps = 0.000001; - int it_ctr = 0; - double Dmax, Dmin; - - Dmax = 2 * data.Maximum(); - Dmin = -2 * data.Minimum(); - - //resize means, vars and props - if(nummix > 3) - nummix = 3; - means = means.Columns(1,nummix); - vars = vars.Columns(1,nummix); - props = props.Columns(1,nummix); - - means(1) = -2*mean(data,2).AsScalar(); - - Matrix tmp1;Matrix prob_K__y_theta; - Matrix kdata; - RowVector prob_Y__theta;RowVector Nbar; - RowVector mubar;RowVector sigmabar;RowVector pibar; - Matrix p_ygx(nummix,numdata); - offset = 0.0; - float const2; - Matrix negdata(data); - negdata = -data; - - while((it_ctr<30) || - ((std::abs(old_ll - log_p_y_theta)>g_eps) && (it_ctr<500))){ // fit GGM - it_ctr++; - //offset = (std::min(0.2,1-props(1)))*std::sqrt(vars(1)); - - //make sure all variances are acceptable - for(int ctr1=1; ctr1 <=nummix; ctr1++) - if(vars(ctr1)<0.0001){ - vars(ctr1) = 0.0001; - } - - p_ygx = 0.0; - p_ygx.Row(1) << normpdf(data,means(1),vars(1)); - - const2 = (2.6-props(1))*sqrt(vars(1))+means(1); //min. nht level - - means(2) = (std::max(means(2), std::max(0.001, - 0.5 * ( const2 + std::sqrt( const2*const2 + 4*vars(2)))))); - vars(2) = std::max(std::min(vars(2), 0.5*std::pow(means(2),2)),0.0001); - p_ygx.Row(2) << gammapdf(data,means(2),vars(2)); - - if(nummix>2){ - const2 = (2.6-props(1))*sqrt(vars(1))-means(1); - - means(3) = -(std::max(-means(3), std::max(0.001, - 0.5 * ( const2 + std::sqrt( const2*const2 + 4*vars(3)))))); - vars(3) = std::max(std::min(vars(3), 0.5*std::pow(means(3),2)),0.0001); - p_ygx.Row(3) << gammapdf(negdata,-means(3),vars(3)); - } - - tmp1 = SP(props.t()*ones(1,numdata),p_ygx); - prob_Y__theta << sum(tmp1,1); - - //deal with non-modelled voxels - for(int ctr=1; ctr<=tmp1.Ncols(); ctr++) - if(prob_Y__theta(ctr) < 0.0001) - prob_Y__theta(ctr) = 0.0001; - - old_ll = log_p_y_theta; - log_p_y_theta = log(prob_Y__theta).Sum(); - if((it_ctr<30) || - ((std::abs(old_ll - log_p_y_theta)>g_eps) && (it_ctr<300))){//update - - prob_K__y_theta = SP(tmp1,pow(ones(nummix,1)*prob_Y__theta,-1)); - Nbar << sum(prob_K__y_theta,2).t(); - for(int ctr=1; ctr<=Nbar.Ncols(); ctr++) - if(Nbar(ctr) < 0.0001 * numdata) - Nbar = Nbar + 0.0001; - pibar= Nbar / numdata; - // cerr << "pibar :" << pibar << endl; - kdata = ones(nummix,1)*data; - mubar <<SP(sum(SP(kdata,prob_K__y_theta),2).t(),pow(Nbar,-1)); - // cerr << "mubar :" << mubar << endl; - - kdata -= mubar.t()*ones(1,numdata); - kdata = pow(kdata,2); - sigmabar << SP(sum(SP(kdata,prob_K__y_theta),2).t(),pow(Nbar,-1)); - - means = mubar; - vars = sigmabar; - props = pibar; - }//update - } //while loop - - props = props / sum(props,2).AsScalar(); - add_params(means,vars,props,logprobY,MDL,Evi,true); - - probmap << SP(sum(tmp1.Rows(2,tmp1.Nrows()),1), - pow(sum(tmp1,1),-1)); - - dbgmsg(" mu: " << means << " sig: " << vars << " prop: " << props << endl); - - if(props(1)<0.4 ){ - //set up GMM - message(" try Gaussian Mixture Model " << endl); - props=zeros(1,nummix); - vars=zeros(1,nummix); - means=zeros(1,nummix); - Params=zeros(1,nummix); - logprobY = 1.0; - props = std::pow(float(nummix),float(-1.0)); - - tmp1 = data * data.t() / numdata; - vars = tmp1.AsScalar(); - float Dmin, Dmax, IntSize; - Dmin = min(data).AsScalar(); Dmax = max(data).AsScalar(); - IntSize = Dmax / nummix; - means(1)=mean(data,2).AsScalar(); - for (int ctr=2; ctr <= means.Ncols(); ctr++){ - means(ctr) = Dmax - (ctr - 1.5) * IntSize; - } - means(2)=means(1)+sqrt(vars(1)); - if(nummix>2) - means(3)=means(1)-sqrt(vars(1)); - - fit(string("GMM")); - } - - } - - /* INPUT / OUTPUT */ - - void MelGMix::add_params(Matrix& mu, Matrix& sig, Matrix& pi, - float logLH, float MDL, float Evi, bool advance){ - int size = Params.Ncols(); - if(size<2){size=2;} - Matrix New(5,size); - New = 0; - - New.SubMatrix(3,3,1,mu.Ncols())=mu; - New.SubMatrix(4,4,1,mu.Ncols())=sig; - New.SubMatrix(5,5,1,mu.Ncols())=pi; - New(1,1)=nummix; - - New(1,2)=-logLH; - New(2,1)=Evi; - New(2,2)=MDL; - if(Params.Storage()>nummix){ - Params = New & Params; - }else{ - Params = New; - } - } - - void MelGMix::get_params(int index, Matrix& mu, Matrix& sig, Matrix& pi, - float logLH, float MDL, float Evi){ - - } - - void MelGMix::save(){ - - } - - void MelGMix::status(const string &txt){ - cerr << txt << "epsilon " << epsilon << endl; - cerr << txt << "nummix " << nummix << endl; - cerr << txt << "numdata " << numdata << endl; - cerr << txt << "means " << means << endl; - cerr << txt << "vars " << vars << endl; - cerr << txt << "props " << props << endl; - //write_ascii_matrix(logger.appendDir(string(txt + "means")),means); - //write_ascii_matrix(logger.appendDir(string(txt + "vars")),vars); - //write_ascii_matrix(logger.appendDir(string(txt + "props")),props); - } - - void MelGMix::create_rep(){ - - } - - -} - - - diff --git a/melgmix.h b/melgmix.h deleted file mode 100644 index 357eaae..0000000 --- a/melgmix.h +++ /dev/null @@ -1,207 +0,0 @@ -/* MELODIC - Multivariate exploratory linear optimized decomposition into - independent components - - melgmix.h - class for Gaussian/Gamma Mixture Model - - Christian F. Beckmann, FMRIB Analysis Group - - Copyright (C) 1999-2013 University of Oxford */ - -/* CCOPYRIGHT */ - -#ifndef __MELGMIX_h -#define __MELGMIX_h - -#include "newimage/newimageall.h" -#include "utils/log.h" -#include "melodic.h" -#include "utils/options.h" -#include "meloptions.h" -//#include "melreport.h" - -using namespace Utilities; -using namespace NEWIMAGE; - -namespace Melodic{ - - class MelGMix{ - public: - - MelGMix(MelodicOptions &popts, Log &plogger): - opts(popts), - logger(plogger){} - - ~MelGMix() { - //mainhtml << endl << "<hr></CENTER></BODY></HTML>" << endl; - } - - void save(); - - void setup(const RowVector& dat, const string dirname, - int here, volume<float> themask, - volume<float> themean, int num_mix = 3, - float eps = 0.0, bool fixdim = false); - - void gmmfit(); - void ggmfit(); - - inline void fit(string mtype = string("GGM")){ - mmtype = mtype; - if(mmtype==string("GGM")) - this->ggmfit(); - else - this->gmmfit(); - - //re-insert mean and stdev - data = data*datastdev + datamean; - //threshmaps = threshmaps*datastdev + datamean; - means = means*datastdev + datamean; - vars = vars*datastdev*datastdev; - } - - inline Matrix threshold(string levels){ - return this->threshold(data, levels); - } - inline Matrix threshold(RowVector& levels){ - return this->threshold(data, levels); - } - Matrix threshold(const RowVector& dat, Matrix& levels); - Matrix threshold(const RowVector& dat, string levels); - - void status(const string &txt); - - inline RowVector& get_means() {return means;} - inline void set_means(RowVector& Arg) {means = Arg;} - - inline RowVector& get_vars() {return vars;} - inline void set_vars(RowVector& Arg) {vars = Arg;} - - inline RowVector& get_pi() {return props;} - inline void set_pi(RowVector& Arg) {props = Arg;} - - inline RowVector& get_data() {return data;} - inline void set_data(RowVector& Arg) {data = Arg;} - - inline RowVector& get_prob() {return probmap;} - - inline float get_eps() {return epsilon;} - inline void set_eps(float Arg) {epsilon = Arg;} - - inline Matrix& get_threshmaps() {return threshmaps;} - inline void set_threshmaps(Matrix& Arg) {threshmaps = Arg;} - - inline bool isfitted(){return fitted;} - - inline int mixtures(){return nummix;} - - inline string get_type() { return mmtype;} - inline void set_type(string Arg) { mmtype = Arg;} - - inline string get_prefix() { return prefix;} - inline void set_prefix(string Arg) { prefix = Arg;} - - inline RowVector get_probmap() {return probmap;} - - inline float get_offset() {return offset;} - inline void set_offset(float Arg) {offset = Arg;} - - inline void flipres(int num){ - means = -means; - data = -data; - threshmaps = -threshmaps; - if(mmtype=="GGM"){ - float tmp; - tmp= means(2);means(2)=means(3);means(3)=tmp; - tmp=vars(2);vars(2)=vars(3);vars(3)=tmp; - tmp=props(2);props(2)=props(3);props(3)=tmp; - } - } - - void create_rep(); - - inline void add_infstr(string what){ - threshinfo.push_back(what); - } - - inline string get_infstr(int num){ - if((threshinfo.size()<(unsigned int)(num-1))||(num<1)) - return string(""); - else - return threshinfo[num-1]; - } - - inline int size_infstr(){ - return threshinfo.size(); - } - - inline void clear_infstr(){ - threshinfo.clear(); - } - - inline void smooth_probs(float howmuch){ - volume4D<float> tempVol; - tempVol.setmatrix(probmap,Mask); - tempVol[0]= smooth(tempVol[0],howmuch); - probmap = tempVol.matrix(Mask); - } - - inline Matrix get_params(){ - Matrix tmp = zeros(3,means.Ncols()); - tmp.Row(1) = means; - tmp.Row(2) = vars; - tmp.Row(3) = props; - return tmp; - } - - double datamean; - double datastdev; - - private: - __attribute__((unused)) MelodicOptions &opts; - __attribute__((unused)) Log &logger; //global log file - - //Log mainhtml; - - void gmmupdate(); - float gmmevidence(); - void gmmreducemm(); - void add_params(Matrix& mu, Matrix& sig, Matrix& pi, - float logLH, float MDL, float Evi, bool advance = false); - void get_params(int index, Matrix& mu, Matrix& sig, Matrix& pi, - float logLH, float MDL, float Evi); - - Matrix Params; - Matrix threshmaps; - - RowVector means; - RowVector vars; - RowVector props; - RowVector data; - RowVector probmap; - - volume<float> Mean; - volume<float> Mask; - - float epsilon; - float logprobY; - float MDL; - float Evi; - float offset; - - int nummix; - int numdata; - int cnumber; - - bool fitted; - bool fixdim; - - string prefix; - string mmtype; - string dirname; - - vector<string> threshinfo; - - }; -} - -#endif diff --git a/melhlprfns.cc b/melhlprfns.cc deleted file mode 100644 index 76fa04c..0000000 --- a/melhlprfns.cc +++ /dev/null @@ -1,924 +0,0 @@ -/* MELODIC - Multivariate exploratory linear optimized decomposition into - independent components - - melhlprfns.cc - misc functions - - Christian F. Beckmann, FMRIB Analysis Group - - Copyright (C) 1999-2013 University of Oxford */ - -/* CCOPYRIGHT */ - -#include "melhlprfns.h" -#include "libprob.h" -#include "miscmaths/miscprob.h" -#include "miscmaths/t2z.h" -#include "miscmaths/f2z.h" - -namespace Melodic{ - - void update_mask(volume<float>& mask, Matrix& Data) - { - Matrix DStDev=stdev(Data); - volume4D<float> tmpMask, RawData; - tmpMask.setmatrix(DStDev,mask); - - float tMmax; - volume<float> tmpMask2; - tmpMask2 = tmpMask[0]; - - tMmax = tmpMask2.max(); - double st_mean = DStDev.Sum()/DStDev.Ncols(); - double st_std = stdev(DStDev.t()).AsScalar(); - - volume4D<float> newmask; - newmask = binarise(tmpMask2,(float) max((float) st_mean-3*st_std,(float) 0.01*st_mean),tMmax); - - Matrix newmaskM,newData; - newmaskM = newmask.matrix(mask); - int N = Data.Nrows(); - - if(int(newmaskM.Row(1).SumAbsoluteValue() + 0.3) < newmaskM.Ncols()){ - RawData.setmatrix(Data.Row(1),mask); - newData = RawData.matrix(newmask[0]); - for(int r=2; r <= N; r++){ - RawData.setmatrix(Data.Row(r),mask); - newData &= RawData.matrix(newmask[0]); - } - Data = newData; - mask = newmask[0]; - } - } - - void del_vols(volume4D<float>& in, int howmany) - { - for(int ctr=1; ctr<=howmany; ctr++){ - in.deletevolume(ctr); - } - } - - Matrix calc_FFT(const Matrix& Mat, const bool logpwr) - { - Matrix res; - for(int ctr=1; ctr <= Mat.Ncols(); ctr++){ - ColumnVector tmpCol; - tmpCol=Mat.Column(ctr); - ColumnVector FtmpCol_real; - ColumnVector FtmpCol_imag; - ColumnVector tmpPow; - if(tmpCol.Nrows()%2 != 0){ - Matrix empty(1,1); empty=0; - tmpCol &= empty; - } - RealFFT(tmpCol,FtmpCol_real,FtmpCol_imag); - tmpPow = pow(FtmpCol_real,2)+pow(FtmpCol_imag,2); - tmpPow = tmpPow.Rows(2,tmpPow.Nrows()); - if(logpwr) tmpPow = log(tmpPow); - if(res.Storage()==0){res= tmpPow;}else{res|=tmpPow;} - } - return res; - } //Matrix calc_FFT() - - Matrix smoothColumns(const Matrix& inp) - { - Matrix temp(inp); - int ctr1 = temp.Nrows(); - Matrix temp2(temp); - temp2=0; - - temp = temp.Row(4) & temp.Row(3) & temp.Row(2) & temp & temp.Row(ctr1-1) - & temp.Row(ctr1-2) &temp.Row(ctr1-3); - - double kern[] ={0.0045 , 0.055, 0.25, 0.4, 0.25, 0.055, 0.0045}; - double fac = 0.9090909; - - - for(int cc=1;cc<=temp2.Ncols();cc++){ - for(int cr=1;cr<=temp2.Nrows();cr++){ - temp2(cr,cc) = fac*( kern[0] * temp(cr,cc) + kern[1] * temp(cr+1,cc) + - kern[2] * temp(cr+2,cc) + kern[3] * temp(cr+3,cc) + - kern[4] * temp(cr+4,cc) + kern[5] * temp(cr+5,cc) + - kern[6] * temp(cr+6,cc)); - } - } - return temp2; - } //Matrix smoothColumns() - - Matrix convert_to_pbsc(Matrix& inp) - { - Matrix meanimg; - meanimg = mean(inp); - float eps = 0.00001; - - for(int ctr=1; ctr <= inp.Ncols(); ctr++){ - if(meanimg(1,ctr) < eps) - meanimg(1,ctr) = eps; - } - - for(int ctr=1; ctr <= inp.Nrows(); ctr++){ - Matrix tmp; - tmp << inp.Row(ctr); - inp.Row(ctr) << 100 * SP((tmp - meanimg),pow(meanimg,-1)); - } - - inp = remmean(inp); - return meanimg; - } //void convert_to_pbsc - - RowVector varnorm(Matrix& in, int dim, float level, int econ) - { - SymmetricMatrix Corr(cov_r(in,false,econ)); - RowVector out; - out = varnorm(in,Corr,dim,level, econ); - return out; - } //RowVector varnorm - - void varnorm(Matrix& in, const RowVector& vars) - { - for(int ctr=1; ctr <=in.Nrows();ctr++) - in.Row(ctr) = SD(in.Row(ctr),vars); - } - - RowVector varnorm(Matrix& in, SymmetricMatrix& Corr, int dim, float level, int econ) - { - - Matrix tmpE, white, dewhite; - RowVector tmpD, tmpD2; - - std_pca(remmean(in,2), Corr, tmpE, tmpD, econ); - calc_white(tmpE,tmpD, dim, white, dewhite); - - Matrix ws = white * in; - for(int ctr1 = 1; ctr1<=ws.Ncols(); ctr1++) - for(int ctr2 = 1; ctr2<=ws.Nrows(); ctr2++) - if(std::abs(ws(ctr2,ctr1)) < level) - ws(ctr2,ctr1)=0; - tmpD = stdev(in - dewhite*ws); - for(int ctr1 = 1; ctr1<=tmpD.Ncols(); ctr1++) - if(tmpD(ctr1) < 0.01){ - tmpD(ctr1) = 1.0; - in.Column(ctr1) = 0.0*in.Column(ctr1); - } - varnorm(in,tmpD); - - return tmpD; - } //RowVector varnorm - - - - Matrix SP2(const Matrix& in, const Matrix& weights, int econ) - { - Matrix Res; - Res = in; - if(econ>0){ - if(weights.Ncols() == in.Ncols()){ - ColumnVector tmp; - for(int ctr=1; ctr <= in.Ncols(); ctr++){ - tmp = in.Column(ctr); - tmp = tmp * weights(1,ctr); - Res.Column(ctr) = tmp; - } - } - } - else{ - Res = ones(in.Nrows(),1)*weights.Row(1); - Res = SP(in,Res); - } - return Res; - } //Matrix SP2 - - void SP3(Matrix& in, const Matrix& weights) - { - for(int ctr=1; ctr <= in.Nrows(); ctr++){ - in.Row(ctr) << SP(in.Row(ctr),weights.AsRow()); - } - } - - void SP4(Matrix& in, const Matrix& weights){ - RowVector tmp; - for(int ctr=1; ctr <= in.Nrows(); ctr++){ - tmp = in.Row(ctr); - tmp = tmp * weights(ctr,1); - in.Row(ctr) << tmp; - } - } - - Matrix corrcoef(const Matrix& in1, const Matrix& in2){ - Matrix tmp = in1; - tmp |= in2; - Matrix out; - out=MISCMATHS::corrcoef(tmp,0); - return out.SubMatrix(1,in1.Ncols(),in1.Ncols()+1,out.Ncols()); - } - - Matrix corrcoef(const Matrix& in1, const Matrix& in2, const Matrix& part){ - Matrix tmp1 = in1, tmp2 = in2, out; - if(part.Storage()){ - tmp1 = tmp1 - part * pinv(part) * tmp1; - tmp2 = tmp2 - part * pinv(part) * tmp2; - } - - out = corrcoef(tmp1,tmp2); - return out; - } - - float calc_white(const Matrix& tmpE, const RowVector& tmpD, const RowVector& PercEV, int dim, Matrix& param, Matrix& paramS, Matrix& white, Matrix& dewhite) - { - -// tmpD2= tmpD | tmpPD.AsRow().Columns(tmpPE.Ncols()-param.Ncols()+1,tmpPE.Ncols()); -// cerr << tmpPD.AsRow().Columns(tmpPE.Ncols()-param.Ncols()+1,tmpPE.Ncols()) << endl; - -// - -// Matrix tmpPE; -// tmpPE = SP(param,ones(param.Nrows(),1)*pow(stdev(param,1)*std::sqrt((float)param.Nrows()),-1)); - -// RE |= tmpPE; -// RowVector tmpD2; -// tmpD2 = tmpD | stdev(param,1).AsRow()*std::sqrt((float)param.Nrows()); -// RD << abs(diag(tmpD2.t())); -// RD << RD.SymSubMatrix(N-dim+1,N); - - Matrix RE; - DiagonalMatrix RD; - int N = tmpE.Ncols(); - dim = std::min(dim,N); - -// cerr << stdev(param) << endl; - RE = tmpE.Columns(std::min(N-dim+1+param.Ncols(),N-2),N); - RE |= param; - -// cerr << paramS.Nrows() << " x " << paramS.Ncols() << endl; -// cerr << paramS << endl; - RowVector tmpD2; - tmpD2 = tmpD | pow(paramS,2).AsRow(); - RD << abs(diag(tmpD2.t())); - -// cerr << " " <<tmpD2.Ncols() << " " << N << " " << dim << endl; - RD << RD.SymSubMatrix(N-dim+1+param.Ncols(),N+param.Ncols()); - - float res = 1.0; - white = sqrt(abs(RD.i()))*RE.t(); - dewhite = RE*sqrt(RD); - - if(dim < N) - res = PercEV(dim); - return res; - } //Matrix calc_white - - float calc_white(const Matrix& tmpE, const RowVector& tmpD, const RowVector& PercEV, int dim, Matrix& white, Matrix& dewhite) - { - Matrix RE; - DiagonalMatrix RD; - int N = tmpE.Ncols(); - dim = std::min(dim,N); - RE = tmpE.Columns(N-dim+1,N); - RD << abs(diag(tmpD.t())); - RD << RD.SymSubMatrix(N-dim+1,N); - - float res = 1.0; - white = sqrt(abs(RD.i()))*RE.t(); - dewhite = RE*sqrt(RD); - - if(dim < N) - res = PercEV(dim); - return res; - } //Matrix calc_white - - void calc_white(const Matrix& tmpE, const RowVector& tmpD, int dim, Matrix& white, Matrix& dewhite) - { - RowVector tmp(tmpE.Ncols()); - float tmp2; - tmp2 = calc_white(tmpE,tmpD, tmp, dim, white, dewhite); - } //Matrix calc_white - - void calc_white(const Matrix& tmpE, const RowVector& tmpD, int dim, Matrix& param, Matrix& paramS, Matrix& white, Matrix& dewhite) - { - RowVector tmp(tmpE.Ncols()); - float tmp2; - tmp2 = calc_white(tmpE,tmpD, tmp, dim, param, paramS, white, dewhite); - } //Matrix calc_white - - void calc_white(const SymmetricMatrix& Corr, int dim, Matrix& white, Matrix& dewhite) - { - Matrix RE; - DiagonalMatrix RD; - RowVector tmp2; - EigenValues(Corr,RD,RE); - tmp2 = diag(RD).t(); - calc_white(RE,tmp2, dim, white, dewhite); - } //Matrix calc_white - - - void std_pca(const Matrix& Mat, const Matrix& weights, SymmetricMatrix& Corr, Matrix& evecs, RowVector& evals, int econ) - { - if(weights.Storage()>0) - Corr = cov_r(Mat, weights, econ); - else - Corr = cov_r(Mat,false,econ); - - DiagonalMatrix tmpD; - EigenValues(Corr,tmpD,evecs); - evals = tmpD.AsRow(); - } //void std_pca - - void std_pca(const Matrix& Mat, SymmetricMatrix& Corr, Matrix& evecs, RowVector& evals, int econ) - { - Matrix weights; - std_pca(Mat,weights,Corr,evecs,evals, econ); - } //void std_pca - - void em_pca(const Matrix& Mat, Matrix& evecs, RowVector& evals, int num_pc, int iter) - { - Matrix guess; - guess = normrnd(Mat.Nrows(),num_pc); - em_pca(Mat,guess,evecs,evals,num_pc,iter); - } //void em_pca - - void em_pca(const Matrix& Mat, Matrix& guess, Matrix& evecs, RowVector& evals, int num_pc, int iter) - { - Matrix C; - if(guess.Ncols() < num_pc){ - C=normrnd(Mat.Nrows(),num_pc); - C.Columns(1,guess.Ncols()) = guess; - } - else - C = guess; - - Matrix tmp, tmp2; - for(int ctr=1; ctr <= iter; ctr++){ - // E-Step - tmp = C.t()*C; - tmp = tmp.i(); - tmp = tmp * C.t(); - tmp = tmp * Mat; - // M-Step - tmp2 = tmp * tmp.t(); - tmp2 = tmp2.i(); - tmp2 = Mat*tmp.t()*tmp2; - C = tmp2; - } - - symm_orth(C); - Matrix Evc; - SymmetricMatrix tmpC; - RowVector Evl; - tmp = C.t() * Mat; - std_pca(tmp,tmpC,Evc,Evl); - evals = Evl; - evecs = C * Evc; - } //void em_pca - - float rankapprox(const Matrix& Mat, Matrix& cols, Matrix& rows, int dim) - { - SymmetricMatrix Corr; - Matrix Evecs, tmpWM, tmpDWM, tmp; - RowVector Evals; - std_pca(Mat.t(), Corr, Evecs, Evals); - calc_white(Corr, dim, tmpWM, tmpDWM); - tmp = tmpWM * Mat.t(); - cols = tmp.t(); - rows << tmpDWM; - float res; - Evals=fliplr(Evals); - res = sum(Evals.Columns(1,dim),2).AsScalar()/sum(Evals,2).AsScalar()*100; - return res; - } // rankapprox - - RowVector krfact(const Matrix& Mat, Matrix& cols, Matrix& rows) - { - Matrix out; RowVector res(Mat.Ncols()); - for(int ctr1 = 1; ctr1 <= Mat.Ncols(); ctr1++){ - Matrix tmpVals(cols.Nrows(),rows.Nrows()); - for(int ctr2 = 1; ctr2 <= rows.Nrows(); ctr2++) - tmpVals.Column(ctr2) << Mat.SubMatrix(cols.Nrows() * - (ctr2 - 1) + 1,cols.Nrows()*ctr2 ,ctr1,ctr1); - - Matrix tmpcols, tmprows; - res(ctr1) =rankapprox(tmpVals, tmpcols, tmprows); - cols.Column(ctr1) = tmpcols; - rows.Column(ctr1) = tmprows; - } - return res; - } // krfact - - RowVector krfact(const Matrix& Mat, int colnum, Matrix& cols, Matrix& rows) - { - RowVector res; - cols = zeros(colnum,Mat.Ncols()); - rows = zeros(int(Mat.Nrows() / colnum),Mat.Ncols()); - res = krfact(Mat,cols,rows); - return res; - } // krfact - - Matrix krprod(const Matrix& cols, const Matrix& rows) - { - Matrix out; - out = zeros(cols.Nrows()*rows.Nrows(),cols.Ncols()); - for(int ctr1 = 1; ctr1 <= cols.Ncols(); ctr1++) - for(int ctr2 = 1; ctr2 <= rows.Nrows(); ctr2++) - { - out.SubMatrix(cols.Nrows()*(ctr2-1)+1,cols.Nrows()*ctr2,ctr1,ctr1) << cols.Column(ctr1) * rows(ctr2,ctr1); - } - return out; - } // krprod - - Matrix krapprox(const Matrix& Mat, int size_cols, int dim) - { - Matrix out, cols, rows; - out = zeros(Mat.Nrows(), Mat.Ncols()); - cols = zeros(size_cols,Mat.Ncols()); - rows = zeros(int(Mat.Nrows() / size_cols), Mat.Ncols()); - krfact(Mat,cols,rows); - out = krprod(cols, rows); - return out; - } // krapprox - - void adj_eigspec(const RowVector& in, RowVector& out1, RowVector& out2, RowVector& out3, int& out4, int num_vox, float resels) - { - RowVector AdjEV; - AdjEV << in.AsRow(); - AdjEV = AdjEV.Columns(3,AdjEV.Ncols()); - AdjEV = AdjEV.Reverse(); - - RowVector CircleLaw; - int NumVox = (int) floor(num_vox/(2.5*resels)); - - CircleLaw = Feta(int(AdjEV.Ncols()), NumVox); - - for(int ctr=1;ctr<=CircleLaw.Ncols(); ctr++){ - if(CircleLaw(ctr)<5*10e-10){CircleLaw(ctr) = 5*10e-10;} - } - - /* float slope; - slope = CircleLaw.Columns(int(AdjEV.Ncols()/4),AdjEV.Ncols() - - int(AdjEV.Ncols()/4)).Sum() / - AdjEV.Columns(int(AdjEV.Ncols()/4),AdjEV.Ncols() - - int(AdjEV.Ncols()/4)).Sum();*/ - - RowVector PercEV(AdjEV); - PercEV = cumsum(AdjEV / sum(AdjEV,2).AsScalar()); - - AdjEV << SP(AdjEV,pow(CircleLaw.Columns(1,AdjEV.Ncols()),-1)); - - SortDescending(AdjEV); - int maxEV = 1; - float threshold = 0.98; - for(int ctr_i = 1; ctr_i < PercEV.Ncols(); ctr_i++){ - if((PercEV(ctr_i)<threshold)&&(PercEV(ctr_i+1)>=threshold)){maxEV=ctr_i;} - } - - if(maxEV<3){maxEV=PercEV.Ncols()/2;} - RowVector NewEV; - Matrix temp1; - temp1 = abs(AdjEV); - NewEV << temp1.SubMatrix(1,1,1,maxEV); - - AdjEV = (AdjEV - min(AdjEV).AsScalar())/(max(AdjEV).AsScalar() - min(AdjEV).AsScalar()); - - out1 = AdjEV; - out2 = PercEV; - out3 = NewEV; - out4 = maxEV; - } //adj_eigspec - - void adj_eigspec(const RowVector& in, RowVector& out1, RowVector& out2) - { - RowVector AdjEV, PercEV; - AdjEV = in.Reverse(); - SortDescending(AdjEV); - - PercEV = cumsum(AdjEV / sum(AdjEV,2).AsScalar()); - AdjEV = (AdjEV - min(AdjEV).AsScalar())/(max(AdjEV).AsScalar() - min(AdjEV).AsScalar()); - out1 = AdjEV; - out2 = PercEV; - } //adj_eigspec - - RowVector Feta(int n1, int n2) - { - float nu = (float) n1/n2; - float bm = pow((1-sqrt(nu)),2.0); - float bp = pow((1+sqrt(nu)),2.0); - - float lrange = 0.9*bm; - float urange = 1.1*bp; - - RowVector eta(30*n1); - float rangestepsize = (urange - lrange) / eta.Ncols(); - for(int ctr_i = 1; ctr_i <= eta.Ncols(); ctr_i++){ - eta(ctr_i) = lrange + rangestepsize * (ctr_i); - } - - RowVector teta(10*n1); - teta = 0; - float stepsize = (bp - bm) / teta.Ncols(); - for(int ctr_i = 1; ctr_i <= teta.Ncols(); ctr_i++){ - teta(ctr_i) = stepsize*(ctr_i); - } - - RowVector feta(teta); - feta = SP(pow(2*M_PI*nu*(teta + bm),-1), pow(SP(teta, bp-bm-teta),0.5)); - - teta = teta + bm; - - RowVector claw(eta); - claw = 0; - for(int ctr_i = 1; ctr_i <= eta.Ncols(); ctr_i++){ - double tmpval = 0.0; - for(int ctr_j = 1; ctr_j <= teta.Ncols(); ctr_j++){ - if(( double(teta(ctr_j))/double(eta(ctr_i)) )<1) - tmpval += feta(ctr_j); - } - claw(ctr_i) = n1*(1-stepsize*tmpval); - } - - RowVector Res(n1); //invert the CDF - Res = 0; - for(int ctr_i = 1; ctr_i < eta.Ncols(); ctr_i++){ //Should this be <= instead of <? - if(floor(claw(ctr_i))>floor(claw(ctr_i+1))){ - Res(int(floor(claw(ctr_i)))) = eta(ctr_i); - } - } - - return Res; - } //RowVector Feta - - RowVector cumsum(const RowVector& Inp) - { - UpperTriangularMatrix UT(Inp.Ncols()); - UT=1.0; - RowVector Res; - Res = Inp * UT; - return Res; - } //RowVector cumsum - - int ppca_dim(const Matrix& in, const Matrix& weights, Matrix& PPCA, RowVector& AdjEV, RowVector& PercEV, SymmetricMatrix& Corr, Matrix& tmpE, RowVector &tmpD, float resels, string which) - { - std_pca(in,weights,Corr,tmpE,tmpD); - - int maxEV = 1; - RowVector NewEV; - adj_eigspec(tmpD.AsRow(),AdjEV,PercEV,NewEV,maxEV,in.Ncols(),resels); - - int res; - PPCA = ppca_est(NewEV, in.Ncols(),resels); - ColumnVector tmp = ppca_select(PPCA, res, maxEV, which); - - PPCA = tmp | PPCA; - return res; - } //int ppca_dim - - int ppca_dim(const Matrix& in, const Matrix& weights, Matrix& PPCA, RowVector& AdjEV, RowVector& PercEV, float resels, string which) - { - RowVector tmpD; - Matrix tmpE; - SymmetricMatrix Corr; - - int res = ppca_dim(in, weights, PPCA, AdjEV, PercEV, Corr, tmpE, tmpD, resels, which); - return res; - } //int ppca_dim - - int ppca_dim(const Matrix& in, const Matrix& weights, float resels, string which) - { - ColumnVector PPCA; - RowVector AdjEV, PercEV; - int res = ppca_dim(in,weights,PPCA,AdjEV,PercEV,resels,which); - return res; - } //int ppca_dim - - ColumnVector ppca_select(Matrix& PPCAest, int& dim, int maxEV, string which) - { - RowVector estimators(5); - estimators = 1.0; - - for(int ctr=1; ctr<=PPCAest.Ncols(); ctr++){ - PPCAest.Column(ctr) = (PPCAest.Column(ctr) - - min(PPCAest.Column(ctr)).AsScalar()) / - ( max(PPCAest.Column(ctr)).AsScalar() - - min(PPCAest.Column(ctr)).AsScalar()); - } - - int ctr_i = 1; - while((ctr_i< PPCAest.Nrows()-1)&& - (PPCAest(ctr_i,2) < PPCAest(ctr_i+1,2))&&(ctr_i<maxEV)) - {estimators(1)=ctr_i+1;ctr_i++;} - ctr_i = 1; - while((ctr_i< PPCAest.Nrows()-1)&& - (PPCAest(ctr_i,3) < PPCAest(ctr_i+1,3))&&(ctr_i<maxEV)) - {estimators(2)=ctr_i+1;ctr_i++;} - ctr_i = 1; - while((ctr_i< PPCAest.Nrows()-1)&& - (PPCAest(ctr_i,4) < PPCAest(ctr_i+1,4))&&(ctr_i<maxEV)) - {estimators(3)=ctr_i+1;ctr_i++;} - ctr_i = 1; - while((ctr_i< PPCAest.Nrows()-1)&& - (PPCAest(ctr_i,5) < PPCAest(ctr_i+1,5))&&(ctr_i<maxEV)) - {estimators(4)=ctr_i+1;ctr_i++;} - ctr_i = 1; - while((ctr_i< PPCAest.Nrows()-1)&& - (PPCAest(ctr_i,6) < PPCAest(ctr_i+1,6))&&(ctr_i<maxEV)) - {estimators(5)=ctr_i+1;ctr_i++;} - - int res = 0; - ColumnVector PPCA; - RowVector PercEV(PPCAest.Column(1).t()); - PercEV = cumsum(PercEV / sum(PercEV,2).AsScalar()); - - if(which == string("aut")) { - if(int(estimators(2)) < int(estimators(1)) && - float(PercEV(int(estimators(2))))>0.8){ - res=int(estimators(2)); - PPCA << PPCAest.Column(3); - }else{ - res = int(estimators(1)); - PPCA << PPCAest.Column(2); - } - } - if(which == string("lap")){ - res = int(estimators(1)); - PPCA << PPCAest.Column(2); - } - if(which == string("bic")){ - res = int(estimators(2)); - PPCA << PPCAest.Column(3); - } - if(which == string("mdl")){ - res = int(estimators(3)); - PPCA << PPCAest.Column(4); - } - if(which == string("rrn")){ - res = int(estimators(4)); - PPCA << PPCAest.Column(5); - } - if(which == string("aic")){ - res = int(estimators(5)); - PPCA << PPCAest.Column(6); - } - if(which == string("median")){ - RowVector unsorted(estimators); - SortAscending(unsorted); - ctr_i=1; - res=int(unsorted(3)); - while(res != int(estimators(ctr_i))) - ctr_i++; - PPCA << PPCAest.Column(ctr_i); - } - if(res==0 || which == string("mean")){//median estimator - PPCA = mean(PPCAest.Columns(2,6),2); - res=int(mean(estimators,2).AsScalar()); - } - - dim = res; - return PPCA; - } //RowVector ppca_select - - Matrix ppca_est(const RowVector& eigenvalues, const int N1, const float N2) - { - Matrix Res; - Res = ppca_est(eigenvalues, (int) floor(N1/(2.5*N2))); - return Res; - } //Matrix ppca_est - - Matrix ppca_est(const RowVector& eigenvalues, const int N) - { - RowVector logLambda(eigenvalues); - logLambda = log(eigenvalues); - - int d = logLambda.Ncols(); - - RowVector k(d); - for(int ctr_i = 1; ctr_i <=d; ctr_i++){ - k(ctr_i)=ctr_i; - } - - RowVector m(d); - m=d*k-0.5*SP(k,k+1); - - RowVector loggam(d); - loggam = 0.5*k.Reverse(); - for(int ctr_i = 1; ctr_i <=d; ctr_i++){ - loggam(ctr_i)=lgam(loggam(ctr_i)); - } - loggam = cumsum(loggam); - - RowVector l_probU(d); - l_probU = -log(2)*k + loggam - cumsum(0.5*log(M_PI)*k.Reverse()); - - RowVector tmp1; - tmp1 = -cumsum(eigenvalues).Reverse()+sum(eigenvalues,2).AsScalar(); - tmp1(1) = 0.95*tmp1(2); - tmp1=tmp1.Reverse(); - - RowVector tmp2; - tmp2 = -cumsum(logLambda).Reverse()+sum(logLambda,2).AsScalar(); - tmp2(1)=tmp2(2); - tmp2=tmp2.Reverse(); - - RowVector tmp3; - tmp3 = d-k; - tmp3(d) = 1.0; - - RowVector tmp4; - tmp4 = SP(tmp1,pow(tmp3,-1)); - for(int ctr_i = 1; ctr_i <=d; ctr_i++){ - if(tmp4(ctr_i)<0.01){tmp4(ctr_i)=0.01;} - if(tmp3(ctr_i)<0.01){tmp3(ctr_i)=0.01;} - if(tmp1(ctr_i)<0.01){tmp1(ctr_i)=0.01;} - } - - RowVector l_nu; - l_nu = SP(-N/2*(d-k),log(tmp4)); - l_nu(d) = 0; - - RowVector l_lam; - l_lam = -(N/2)*cumsum(logLambda); - - RowVector l_lhood; - l_lhood = SP(pow(tmp3,-1),tmp2)-log(SP(pow(tmp3,-1),tmp1)); - - Matrix t1,t2, t3; - UpperTriangularMatrix triu(d); - triu = 1.0; - for(int ctr_i = 1; ctr_i <= triu.Ncols(); ctr_i++){ - triu(ctr_i,ctr_i)=0.0; - } - t1 = (ones(d,1) * eigenvalues); - t1 = SP(triu,t1.t() - t1); - t2 = pow(tmp4,-1).t()*ones(1,d); - t3 = ones(d,1)*pow(eigenvalues,-1); - t2 = SP(triu, t2.t()-t3.t()); - for(int ctr_i = 1; ctr_i <= t1.Ncols(); ctr_i++){ - for(int ctr_j = 1; ctr_j <= t1.Nrows(); ctr_j++){ - if(t1(ctr_j,ctr_i)<=0){t1(ctr_j,ctr_i)=1;} - } - } - for(int ctr_i = 1; ctr_i <= t2.Ncols(); ctr_i++){ - for(int ctr_j = 1; ctr_j <= t2.Nrows(); ctr_j++){ - if(t2(ctr_j,ctr_i)<=0){t2(ctr_j,ctr_i)=1;} - } - } - t1 = cumsum(sum(log(t1),2).AsRow()); - t2 = cumsum(sum(log(t2),2).AsRow()); - - RowVector l_Az(d); - l_Az << (t1+t2); - - RowVector l_lap; - l_lap = l_probU + l_nu +l_Az + l_lam + 0.5*log(2*M_PI)*(m+k)-0.5*log(N)*k; - - RowVector l_BIC; - l_BIC = l_lam + l_nu - 0.5*log(N)*(m+k); - - RowVector l_RRN; - l_RRN = -0.5*N*SP(k,log(SP(cumsum(eigenvalues),pow(k,-1))))+l_nu; - - RowVector l_AIC; - l_AIC = -2*N*SP(tmp3,l_lhood)+ 2*(1+d*k+0.5*(k-1)); - l_AIC = -l_AIC; - - RowVector l_MDL; - l_MDL = -N*SP(tmp3,l_lhood)+ 0.5*(1+d*k+0.5*(k-1))*log(N); - l_MDL = -l_MDL; - - Matrix Res; - - Res = eigenvalues.t(); - Res |= l_lap.t(); - Res |= l_BIC.t(); - Res |= l_MDL.t(); - Res |= l_RRN.t(); - Res |= l_AIC.t(); - - - return Res; - } //Matrix ppca_est - - ColumnVector acf(const ColumnVector& in, int order) - { - double meanval; - meanval = mean(in).AsScalar(); - int tpoints = in.Nrows(); - - ColumnVector y, res; - Matrix X, tmp; - - y = in.Rows(order+1,tpoints) - meanval; - X = zeros(order + 1, order); - for(int ctr1 = 1; ctr1 <= order; ctr1++) - X.Column(ctr1) = in.Rows(order + 1 - ctr1, tpoints - ctr1) - meanval; - tmp = X.t()*X; - tmp = tmp.i(); - tmp = tmp * X.t(); - res << tmp * y; - return res; - } //ColumnVector acf - - ColumnVector pacf(const ColumnVector& in, int maxorder) - { - int tpoint = in.Nrows(); - ColumnVector res; - res = acf(in, maxorder); - for(int ctr1 = 1; ctr1 <= maxorder; ctr1++) - if ( res.Column(ctr1).AsScalar() < (1/tpoint) + 2/(float)std::pow(tpoint,0.5)) - res.Column(ctr1) = 0; - return res; - } //ColumnVector pacf - - Matrix est_ar(const Matrix& Mat, int maxorder) - { - Matrix res; - res = zeros(maxorder, Mat.Ncols()); - ColumnVector tmp; - for (int ctr = 1; ctr <= Mat.Ncols(); ctr++){ - tmp = pacf(Mat.Column(ctr)); - res.Column(ctr) = tmp; - } - return res; - } //Matrix est_ar - - ColumnVector gen_ar(const ColumnVector& in, int maxorder) - { - float sdev; - sdev = stdev(in).AsScalar(); - ColumnVector x, arcoeff, scaled; - scaled = in / sdev; - arcoeff = pacf( scaled, maxorder); - x = normrnd(in.Nrows(),1).AsColumn() * sdev; - for(int ctr1=2; ctr1 <= in.Nrows(); ctr1++) - for(int ctr2 = 1; ctr2 <= maxorder; ctr2++) - x(ctr1) = arcoeff(ctr2) * x(std::max(1,int(ctr1-ctr2))) + x(ctr1); - return x; - } //ColumnVector gen_ar - - Matrix gen_ar(const Matrix& in, int maxorder) - { - Matrix res; - res = in; - ColumnVector tmp; - for(int ctr=1; ctr <= in.Ncols(); ctr++){ - tmp = in.Column(ctr); - res.Column(ctr) = gen_ar(tmp, maxorder); - } - return res; - } //Matrix gen_ar - - Matrix gen_arCorr(const Matrix& in, int maxorder) - { - Matrix res; - res = zeros(in.Nrows(), in.Nrows()); - ColumnVector tmp; - for(int ctr=1; ctr<= in.Ncols(); ctr++){ - tmp = in.Column(ctr); - tmp = gen_ar(tmp, maxorder); - res += tmp * tmp.t(); - } - return res; - } //Matrix gen_arCorr - - void basicGLM::olsfit(const Matrix& data, const Matrix& design, - const Matrix& contrasts, int requestedDOF) - { - beta = zeros(design.Ncols(),1); - residu = zeros(1); sigsq = -1.0*ones(1); varcb = -1.0*ones(1); - t = zeros(1); z = zeros(1); p=-1.0*ones(1); - dof = (int)-1; cbeta = -1.0*ones(1); - - if(data.Nrows()==design.Nrows()){ - Matrix dat = data; - Matrix tmp = design.t()*design; - Matrix pinvdes = tmp.i()*design.t(); - - beta = pinvdes * dat; - residu = dat - design*beta; - dof = ols_dof(design); - if ( requestedDOF>0) - dof = requestedDOF; - sigsq = sum(SP(residu,residu))/dof; - - float fact = float(dof) / design.Ncols(); - f_fmf = SP(sum(SP(design*beta,design*beta)),pow(sum(SP(residu,residu)),-1)) * fact; - - pf_fmf = f_fmf.Row(1); - for(int ctr1=1;ctr1<=f_fmf.Ncols();ctr1++) - pf_fmf(1,ctr1) = 1.0-MISCMATHS::fdtr(design.Ncols(),dof,f_fmf.Column(ctr1).AsScalar()); - - if(contrasts.Storage()>0 && contrasts.Ncols()==beta.Nrows()){ - cbeta = contrasts*beta; - Matrix tmp = contrasts*pinvdes*pinvdes.t()*contrasts.t(); - varcb = diag(tmp)*sigsq; - t = SP(cbeta,pow(varcb,-0.5)); - z = t; p=t; - for(int ctr1=1;ctr1<=t.Ncols();ctr1++){ - ColumnVector tmp = t.Column(ctr1); - T2z::ComputeZStats(varcb.Column(ctr1),cbeta.Column(ctr1),dof, tmp); - z.Column(ctr1) << tmp; - T2z::ComputePs(varcb.Column(ctr1),cbeta.Column(ctr1),dof, tmp); - p.Column(ctr1) << exp(tmp); - } - } - } - - } - - -} diff --git a/melhlprfns.h b/melhlprfns.h deleted file mode 100644 index 1ff66df..0000000 --- a/melhlprfns.h +++ /dev/null @@ -1,133 +0,0 @@ -/* MELODIC - Multivariate exploratory linear optimized decomposition into - independent components - - melhlprfns.cc - misc functions - - Christian F. Beckmann, FMRIB Analysis Group - - Copyright (C) 1999-2013 University of Oxford */ - -/* CCOPYRIGHT */ - -#ifndef __MELODICHLPR_h -#define __MELODICHLPR_h - -#include "newimage/newimageall.h" -#include "newmatap.h" -#include "newmatio.h" - - #ifdef __APPLE__ - #include <mach/mach.h> - #define mmsg(msg) { \ - struct task_basic_info t_info; \ - mach_msg_type_number_t t_info_count = TASK_BASIC_INFO_COUNT; \ - if (KERN_SUCCESS == task_info(mach_task_self(), TASK_BASIC_INFO, (task_info_t) &t_info, &t_info_count)) \ - { \ - cout << " MEM: " << msg << " res: " << t_info.resident_size/1000000 << " virt: " << t_info.virtual_size/1000000 << "\n"; \ - } \ - } - #else - #define mmsg(msg) { \ - cout << msg; \ - } - #endif - -using namespace NEWIMAGE; - -namespace Melodic{ - - void update_mask(volume<float>& mask, Matrix& Data); - void del_vols(volume4D<float>& in, int howmany); - - Matrix smoothColumns(const Matrix& inp); - Matrix calc_FFT(const Matrix& Mat, const bool logpwr = 0); - - Matrix convert_to_pbsc(Matrix& Mat); - - RowVector varnorm(Matrix& in, int dim = 30, float level = 1.6, int econ = 20000); - void varnorm(Matrix& in, const RowVector& vars); - RowVector varnorm(Matrix& in, SymmetricMatrix& Corr, int dim = 30, float level = 1.6, int econ = 20000); - - Matrix SP2(const Matrix& in, const Matrix& weights, int econ = 20000); - void SP3(Matrix& in, const Matrix& weights); - void SP4(Matrix& in, const Matrix& weights); - - RowVector Feta(int n1,int n2); - RowVector cumsum(const RowVector& Inp); - - Matrix corrcoef(const Matrix& in1, const Matrix& in2); - Matrix corrcoef(const Matrix& in1, const Matrix& in2, const Matrix& part); - float calc_white(const Matrix& tmpE, const RowVector& tmpD, const RowVector& PercEV, int dim, Matrix& param, Matrix& paramS, Matrix& white, Matrix& dewhite); - float calc_white(const Matrix& tmpE, const RowVector& tmpD, const RowVector& PercEV, int dim, Matrix& white, Matrix& dewhite); - void calc_white(const Matrix& tmpE, const RowVector& tmpD, int dim, Matrix& param, Matrix& paramS, Matrix& white, Matrix& dewhite); - void calc_white(const Matrix& tmpE, const RowVector& tmpD, int dim, Matrix& white, Matrix& dewhite); - void calc_white(const SymmetricMatrix& Corr, int dim, Matrix& white, Matrix& dewhite); - - void std_pca(const Matrix& Mat, SymmetricMatrix& Corr, Matrix& evecs, RowVector& evals, int econ = 20000); - void std_pca(const Matrix& Mat, const Matrix& weights, SymmetricMatrix& Corr, Matrix& evecs, RowVector& evals, int econ = 20000); - void em_pca(const Matrix& Mat, Matrix& evecs, RowVector& evals, int num_pc = 1, int iter = 20); - void em_pca(const Matrix& Mat, Matrix& guess, Matrix& evecs, RowVector& evals, int num_pc = 1, int iter = 20); - - float rankapprox(const Matrix& Mat, Matrix& cols, Matrix& rows, int dim = 1); - RowVector krfact(const Matrix& Mat, Matrix& cols, Matrix& rows); - RowVector krfact(const Matrix& Mat, int colnum, Matrix& cols, Matrix& rows); - Matrix krprod(const Matrix& cols, const Matrix& rows); - Matrix krapprox(const Matrix& Mat, int size_col, int dim = 1); - - void adj_eigspec(const RowVector& in, RowVector& out1, RowVector& out2, RowVector& out3, int& out4, int num_vox, float resels); - void adj_eigspec(const RowVector& in, RowVector& out1, RowVector& out2); - - int ppca_dim(const Matrix& in, const Matrix& weights, Matrix& PPCA, RowVector& AdjEV, RowVector& PercEV, SymmetricMatrix& Corr, Matrix& tmpE, RowVector &tmpD, float resels, string which); - int ppca_dim(const Matrix& in, const Matrix& weights, Matrix& PPCA, RowVector& AdjEV, RowVector& PercEV, float resels, string which); - int ppca_dim(const Matrix& in, const Matrix& weights, float resels, string which); - ColumnVector ppca_select(Matrix& PPCAest, int& dim, int maxEV, string which); - Matrix ppca_est(const RowVector& eigenvalues, const int N1, const float N2); - Matrix ppca_est(const RowVector& eigenvalues, const int N); - - ColumnVector acf(const ColumnVector& in, int order); - ColumnVector pacf(const ColumnVector& in, int maxorder = 1); - Matrix est_ar(const Matrix& Mat, int maxorder); - ColumnVector gen_ar(const ColumnVector& in, int maxorder = 1); - Matrix gen_ar(const Matrix& in, int maxorder); - Matrix gen_arCorr(const Matrix& in, int maxorder); - - class basicGLM{ - public: - - //constructor - basicGLM(){} - - //destructor - ~basicGLM(){} - - void olsfit(const Matrix& data, const Matrix& design, - const Matrix& contrasts, int DOFadjust = -1); - - inline Matrix& get_t(){return t;} - inline Matrix& get_z(){return z;} - inline Matrix& get_p(){return p;} - inline Matrix& get_f_fmf(){return f_fmf;} - inline Matrix& get_pf_fmf(){return pf_fmf;} - inline Matrix& get_cbeta(){return cbeta;} - inline Matrix& get_beta(){return beta;} - inline Matrix& get_varcb(){return varcb;} - inline Matrix& get_sigsq(){return sigsq;} - inline Matrix& get_residu(){return residu;} - inline int get_dof(){return dof;} - - private: - Matrix beta; - Matrix residu; - Matrix sigsq; - Matrix varcb; - Matrix cbeta; - Matrix f_fmf, pf_fmf; - int dof; - Matrix t; - Matrix z; - Matrix p; - }; -// Matrix glm_ols(const Matrix& dat, const Matrix& design); -} - -#endif diff --git a/melica.cc b/melica.cc deleted file mode 100644 index 3d6ed12..0000000 --- a/melica.cc +++ /dev/null @@ -1,484 +0,0 @@ -/* MELODIC - Multivariate exploratory linear optimized decomposition into - independent components - - melica.cc - ICA estimation - - Christian F. Beckmann, FMRIB Analysis Group - - Copyright (C) 1999-2013 University of Oxford */ - -/* CCOPYRIGHT */ - -#include <stdlib.h> -#include "newimage/newimageall.h" -#include "utils/log.h" -#include "meloptions.h" -#include "meldata.h" -#include "melodic.h" -#include "newmatap.h" -#include "newmatio.h" -#include "melica.h" -#include "melpca.h" -#include "melhlprfns.h" -#include "miscmaths/miscprob.h" - -using namespace Utilities; -using namespace NEWIMAGE; - -namespace Melodic { - - void MelodicICA::ica_fastica_symm(const Matrix &Data){ - // based on Aapo Hyvärinen's fastica method - // see www.cis.hut.fi/projects/ica/fastica/ - - //initialize matrices - Matrix redUMM_old, rank1_old; - Matrix tmpU; - //srand((unsigned int)timer(NULL)); - redUMM = melodat.get_white()* - unifrnd(melodat.get_white().Ncols(),dim); // got to start somewhere - - if(opts.debug.value()) - cerr << "redUMM init submatrix : " << endl << redUMM.SubMatrix(1,2,1,2) << endl; - - if(opts.guessfname.value().size()>1){ - message(" Use columns in " << opts.guessfname.value() - << " as initial values for the mixing matrix " <<endl); - Matrix guess ; - guess = melodat.get_white()*read_ascii_matrix(opts.guessfname.value()); - redUMM.Columns(1,guess.Ncols()) = guess; - } - - symm_orth(redUMM); - - int itt_ctr,itt_ctr2=1,cum_itt=0,newmaxitts = opts.maxNumItt.value(); - double minAbsSin = 1.0, minAbsSin2 = 1.0; - if(opts.approach.value() == string("tica")) - opts.maxNumItt.set_T(opts.rank1interval.value()); - - rank1_old = melodat.get_dewhite()*redUMM; - rank1_old = melodat.expand_dimred(rank1_old); - rank1_old = krapprox(rank1_old,int(rank1_old.Nrows()/melodat.get_numfiles())); - do{// TICA loop - itt_ctr = 1; - do{ // da loop!!! - redUMM_old = redUMM; - //calculate IC estimates - tmpU = Data.t() * redUMM; - - //update redUMM depending on nonlinearity - if(opts.nonlinearity.value()=="pow4"){ - redUMM = (Data * pow(tmpU,3.0)) / samples - 3 * redUMM; - } - if(opts.nonlinearity.value()=="pow3"){ - tmpU /= opts.nlconst1.value(); - redUMM = 3 * (Data * pow(tmpU,2.0)) / samples - - (SP(ones(dim,1)*sum(tmpU,1),redUMM))/ samples; - } - if(opts.nonlinearity.value()=="tanh"){ - Matrix hyptanh; - hyptanh = tanh(opts.nlconst1.value()*tmpU); - redUMM = (Data * hyptanh - opts.nlconst1.value()*SP(ones(dim,1)* - sum(1-pow(hyptanh,2),1),redUMM))/samples; - } - if(opts.nonlinearity.value()=="gauss"){ - Matrix tmpUsq; - Matrix tmpU2; - Matrix gauss; - Matrix dgauss; - tmpUsq = pow(tmpU,2); - tmpU2 = exp(-(opts.nlconst2.value()/2) * tmpUsq); - gauss = SP(tmpU,tmpU2); - dgauss = SP(1-opts.nlconst2.value()*tmpUsq,tmpU2); - redUMM = (Data * gauss - SP(ones(dim,1)* - sum(dgauss,1),redUMM))/samples; - } - - // orthogonalize the unmixing-matrix - symm_orth(redUMM); - if(opts.approach.value() == string("tica")){ - message(""); - } - - //termination condition : angle between old and new < epsilon - minAbsSin = 1 - diag(abs(redUMM.t()*redUMM_old)).Minimum(); - - message(" Step no. " << cum_itt + itt_ctr << " change : " << minAbsSin << endl); - // if((abs(minAbsSin) < opts.epsilon.value())&& - // (opts.approach.value()!=string("tica"))){ break;} - if((abs(minAbsSin) < opts.epsilon.value())){ break;} - - itt_ctr++; - } while(itt_ctr < opts.maxNumItt.value()); - cum_itt += itt_ctr; - itt_ctr2++; - if(opts.approach.value() == string("tica")){ - message(" Rank-1 approximation of the time courses; "); - Matrix temp(melodat.get_dewhite() * redUMM); - temp = melodat.expand_dimred(temp); - temp = krapprox(temp,int(temp.Nrows()/melodat.get_numfiles())); - minAbsSin2 = 1 - diag(abs(corrcoef(temp,rank1_old))).Minimum(); - rank1_old = temp; - temp = melodat.reduce_dimred(temp); - redUMM = melodat.get_white() * temp; - - message(" change : " << minAbsSin2 << endl); - if(abs(minAbsSin2) < opts.epsilonS.value() && abs(minAbsSin) < opts.epsilon.value()){ break;} - } - } while( - (itt_ctr2 < newmaxitts/opts.maxNumItt.value()) && - (opts.approach.value() == string("tica")) && - cum_itt < newmaxitts); - - if((itt_ctr>=opts.maxNumItt.value() && (opts.approach.value()!=string("tica"))) - || (cum_itt >= newmaxitts && opts.approach.value()==string("tica"))){ - cerr << " No convergence after " << cum_itt <<" steps "<<endl; - } else { - message(" Convergence after " << cum_itt <<" steps " << endl << endl); - no_convergence = false; - - {Matrix temp(melodat.get_dewhite() * redUMM); - melodat.set_mix(temp);} - {Matrix temp(redUMM.t()*melodat.get_white()); - melodat.set_unmix(temp);} - } - } - - void MelodicICA::ica_fastica_defl(const Matrix &Data){ - if(!opts.explicitnums || opts.numICs.value()>dim){ - opts.numICs.set_T(dim); - message(" Using numICs:" << opts.numICs.value() << endl); - } - - //redUMM = zeros(dim); // got to start somewhere - redUMM = melodat.get_white()* - unifrnd(melodat.get_white().Ncols(),opts.numICs.value()); - redUMM = zeros(melodat.get_white().Nrows(),opts.numICs.value()); - Matrix guess; - int guesses=0; - if(opts.guessfname.value().size()>1){ - message(" Use columns in " << opts.guessfname.value() << " as initial values for the mixing matrix " <<endl); - guess = melodat.get_white()*read_ascii_matrix(opts.guessfname.value()); - guesses = guess.Ncols(); - } - - int ctrIC = 1; - int numRestart = 0; - while(ctrIC<=opts.numICs.value()){ - message(" Extracting IC " << ctrIC << " ... "); - ColumnVector w; - ColumnVector w_old; - ColumnVector tmpU; - if(ctrIC <= guesses){ - w = w - redUMM * redUMM.t() * w; - w = w / norm2(w); - w_old = zeros(w.Nrows(),1); - int itt_ctr = 1; - do{ - w_old = w; - tmpU = Data.t() * w; - if(opts.nonlinearity.value()=="pow4"){ - w = (Data * pow(tmpU,3.0)) / samples - 3 * w; - } - if(opts.nonlinearity.value()=="tanh"){ - ColumnVector hyptanh; - hyptanh = tanh(opts.nlconst1.value()*tmpU); - w = (Data * hyptanh - opts.nlconst1.value()*SP(ones(dim,1)* - sum(1-pow(hyptanh,2),1),w))/samples; - } - if(opts.nonlinearity.value()=="pow3"){ - tmpU /= opts.nlconst1.value(); - w = 3*(Data * pow(tmpU,2.0)) / samples - 2*(SP(ones(dim,1)* - sum(tmpU,1),w))/samples; - } - if(opts.nonlinearity.value()=="gauss"){ - ColumnVector tmpUsq; - ColumnVector tmpU2; - ColumnVector gauss; - ColumnVector dgauss; - tmpUsq = pow(tmpU,2); - tmpU2 = exp(-(opts.nlconst2.value()/2) * tmpUsq); - gauss = SP(tmpU,tmpU2); - dgauss = SP(1-opts.nlconst2.value()*tmpUsq,tmpU2); - w = (Data * gauss - SP(ones(dim,1)* - sum(dgauss,1),w))/samples; - } - - // orthogonalize w - w = w - redUMM * redUMM.t() * w; - w = w / norm2(w); - - //termination condition : angle between old and new < epsilon - if(((norm2(w-w_old) < 0.001*opts.epsilon.value())&&(itt_ctr>10)) || - ((norm2(w+w_old) < 0.001*opts.epsilon.value())&&(itt_ctr>10))){ - break; - } - //cout << norm2(w-w_old) << " " << norm2(w+w_old) << endl; - itt_ctr++; - } while(itt_ctr <= opts.maxNumItt.value()); - - if(itt_ctr<opts.maxNumItt.value()){ - redUMM.Column(ctrIC) = w; - message(" estimated using " << itt_ctr << " iterations " << endl); - ctrIC++; - numRestart = 0; - } else{ - if(numRestart > opts.maxRestart.value()){ - message(endl << " Estimation failed after " - << numRestart << " attempts " - << " giving up " << endl); - break; - }else{ - numRestart++; - message(endl <<" Estimation failed - restart " - << numRestart << endl); - } - } - } - if(numRestart < opts.maxRestart.value()){ - no_convergence = false; - {Matrix temp(melodat.get_dewhite() * redUMM); - melodat.set_mix(temp);} - {Matrix temp(redUMM.t()*melodat.get_white()); - melodat.set_unmix(temp);} - } - } - } - - void MelodicICA::ica_maxent(const Matrix &Data){ - // based on Aapo Hyvärinen's fastica method - // see www.cis.hut.fi/projects/ica/fastica/ - message(" MAXENT " << endl); - //initialize matrices - Matrix redUMM_old; - Matrix tmpU; - Matrix gtmpU; - double lambda = 0.015/std::log((double)melodat.get_white().Ncols()); - - //srand((unsigned int)timer(NULL)); - redUMM = melodat.get_white()* - unifrnd(melodat.get_white().Ncols(),dim); // got to start somewhere - - if(opts.guessfname.value().size()>1){ - message(" Use columns in " << opts.guessfname.value() - << " as initial values for the mixing matrix " <<endl); - Matrix guess ; - guess = melodat.get_white()*read_ascii_matrix(opts.guessfname.value()); - redUMM.Columns(1,guess.Ncols()) = guess; - } - - // symm_orth(redUMM); - int itt_ctr=1; - double minAbsSin = 1.0; - Matrix Id; - Id = IdentityMatrix(redUMM.Ncols()); - //cerr << " nonlinearity : " << opts.nonlinearity.value() << endl; - - do{ // da loop!!! - redUMM_old = redUMM; - //calculate IC estimates - tmpU = Data.t() * redUMM; - if(opts.nonlinearity.value()=="tanh"){ - //Matrix hyptanh; - //hyptanh = tanh(opts.nlconst1.value()*tmpU); - //redUMM = (Data * hyptanh - opts.nlconst1.value()*SP(ones(dim,1)* - //sum(1-pow(hyptanh,2),1),redUMM))/samples; - gtmpU = tanh(opts.nlconst1.value()*tmpU); - redUMM = redUMM + lambda*(Id+(1-2*gtmpU.t()*tmpU))*redUMM; - } - if(opts.nonlinearity.value()=="gauss"){ - gtmpU = pow(1+exp(-(opts.nlconst2.value()/2) * tmpU),-1); - redUMM = redUMM + lambda*(Id - (gtmpU.t()-tmpU.t())*tmpU)*redUMM; - } - - //termination condition : angle between old and new < epsilon - minAbsSin = abs(1 - diag(abs(redUMM.t()*redUMM_old)).Minimum()); - message(" Step no. " << itt_ctr << " change : " << minAbsSin << endl); - if(abs(minAbsSin) < opts.epsilon.value()){ break;} - - itt_ctr++; - } while(itt_ctr < opts.maxNumItt.value()); - - if(itt_ctr>=opts.maxNumItt.value()){ - cerr << " No convergence after " << itt_ctr <<" steps "<<endl; - } else { - message(" Convergence after " << itt_ctr <<" steps " << endl << endl); - no_convergence = false; - {Matrix temp(melodat.get_dewhite() * redUMM); - melodat.set_mix(temp);} - {Matrix temp(redUMM.t()*melodat.get_white()); - melodat.set_unmix(temp);} - } - } - - void MelodicICA::ica_jade(const Matrix &Data){ - int dim_sym = (int) (dim*(dim+1))/2; - int num_CM = dim_sym; - Matrix CM; - Matrix R; R = IdentityMatrix(dim); - Matrix Qij; Qij = zeros(dim); - Matrix Xim; - Matrix Xjm; - Matrix scale; scale = ones(dim,1)/samples; - - for (int im =1; im <= dim; im++){ - Xim = Data.Row(im); - write_ascii_matrix("Xim",Data.Row(1)); - //Qij = SP((scale * pow(Xim,2)),Data) * Data.t();//- R - 2*R.Column(im)*R.Column(im).t(); - Qij = (pow(Xim,2)) * Data.t();//- R - 2*R.Column(im)*R.Column(im).t(); - if(im==1){CM = Qij; write_ascii_matrix("CM",CM);exit(2);}else{CM |= Qij;} - for (int jm = 1; jm < im; jm++){ - Xjm = Data.Row(jm); - Qij = (SP((scale * SP(Xim,Xjm)),Data) * Data.t() - - R.Column(im)*R.Column(jm).t() - R.Column(jm)*R.Column(im).t()); - Qij *= sqrt(2); - CM |= Qij; - } - } - - write_ascii_matrix("CM",CM); - Matrix redUMM; redUMM = IdentityMatrix(dim); - - bool exitloop = false; - int ctr_itt = 0; - int ctr_updates = 0; - Matrix Givens; Givens = zeros(2,num_CM); - Matrix Givens_ip; Givens_ip = zeros(2); - Matrix Givens_ro; Givens_ro = zeros(2); - double det_on, det_off; - double cos_theta, sin_theta, theta; - - while(!exitloop && ctr_itt <= opts.maxNumItt.value()){ - ctr_itt++; - cout << "loop" <<endl; - for(int ctr_p = 1; ctr_p < dim; ctr_p++){ - for(int ctr_q = ctr_p+1; ctr_q <= dim; ctr_q++){ - - for(int ctr_i = 0; ctr_i < num_CM; ctr_i++){ - int Ip = ctr_p + ctr_i * dim; - int Iq = ctr_q + ctr_i * dim; - Givens(1,ctr_i + 1) = CM(ctr_p,Ip) - CM(ctr_q,Iq); - Givens(2,ctr_i + 1) = CM(ctr_p,Iq) - CM(ctr_q,Ip); - } - - Givens_ip = Givens * Givens.t(); - det_on = Givens_ip(1,1) - Givens_ip(2,2); - det_off = Givens_ip(1,2) + Givens_ip(2,1); - theta = 0.5 * atan2(det_off, det_on + sqrt(det_on*det_on + det_off*det_off)); - - cout << theta << endl; - - if(abs(theta) > opts.epsilon.value()){ - ctr_updates++; - message(" Step No. "<< ctr_itt << " change : " << theta << endl); - - //create Givens rotation matrix - cos_theta = cos(theta); - sin_theta = sin(theta); - Givens_ro(1,1) = cos_theta; - Givens_ro(1,2) = -sin_theta; - Givens_ro(2,1) = sin_theta; - Givens_ro(2,2) = cos_theta; - - //update 2 entries of redUMM - {Matrix tmp_redUMM; - tmp_redUMM = redUMM.Column(ctr_p); - tmp_redUMM |= redUMM.Column(ctr_q); - tmp_redUMM *= Givens_ro; - redUMM.Column(ctr_p) = tmp_redUMM.Column(1); - redUMM.Column(ctr_q) = tmp_redUMM.Column(2);} - - //update Cumulant matrix - {Matrix tmp_CM; - tmp_CM = CM.Row(ctr_p); - tmp_CM &= CM.Row(ctr_q); - tmp_CM = Givens_ro.t() * tmp_CM; - CM.Row(ctr_p) = tmp_CM.Row(1); - CM.Row(ctr_q) = tmp_CM.Row(2);} - - //update Cumulant matrices - for(int ctr_i = 0; ctr_i < num_CM; ctr_i++){ - int Ip = ctr_p + ctr_i * dim; - int Iq = ctr_q + ctr_i * dim; - CM.Column(Ip) = cos_theta*CM.Column(Ip)+sin_theta*CM.Column(Iq); - CM.Column(Iq) = cos_theta*CM.Column(Iq)-sin_theta*CM.Column(Ip); - } - }else{ - exitloop = true; - } - } - } - }//while loop - if(ctr_itt > opts.maxNumItt.value()){ - cerr << " No convergence after " << ctr_itt <<" steps "<<endl; - } else { - message(" Convergence after " << ctr_itt <<" steps " << endl << endl); - no_convergence = false; - {Matrix temp(melodat.get_dewhite() * redUMM); - melodat.set_mix(temp);} - {Matrix temp(redUMM.t()*melodat.get_white()); - melodat.set_unmix(temp);} - } - } - - Matrix MelodicICA::sign(const Matrix &Inp){ - Matrix Res = Inp; - Res = 1; - for(int ctr_i = 1; ctr_i <= Inp.Ncols(); ctr_i++){ - for(int ctr_j = 1; ctr_j <= Inp.Nrows(); ctr_j++){ - if(Inp(ctr_j,ctr_i)<0){Res(ctr_j,ctr_i)=-1;} - } - } - return Res; - } - - void MelodicICA::perf_ica(const Matrix &Data){ - message("Starting ICA estimation using " << opts.approach.value() - << endl << endl); - dim = Data.Nrows(); - samples = Data.Ncols(); - no_convergence = true; - //switch to the chosen method - if(opts.approach.value()==string("symm") || - opts.approach.value()==string("tica") || - opts.approach.value()==string("parafac") || - opts.approach.value()==string("concat")) - ica_fastica_symm(Data); - if(opts.approach.value()==string("defl")) - ica_fastica_defl(Data); - if(opts.approach.value()==string("jade")) - ica_jade(Data); - if(opts.approach.value()==string("maxent")) - ica_maxent(Data); - - if(!no_convergence){//calculate the IC - Matrix temp(melodat.get_unmix()*melodat.get_Data()); - // Add the mean time course again - // temp += melodat.get_unmix()*melodat.get_meanC()*ones(1,temp.Ncols()); - - //re-normalise the decomposition to std(mix)=1 - Matrix scales; - scales = stdev(melodat.get_mix()); - - //cerr << " SCALES 1 " << scales << endl; - Matrix tmp, tmp2; - tmp = SP(melodat.get_mix(),ones(melodat.get_mix().Nrows(),1)*pow(scales,-1)); - temp = SP(temp,scales.t()*ones(1,temp.Ncols())); - - scales = scales.t(); - - melodat.set_mix(tmp); - - melodat.set_IC(temp); - - melodat.set_ICstats(scales); - melodat.sort(); - - //message("Calculating T- and S-modes " << endl); - melodat.set_TSmode(); - - } - } -} - - diff --git a/melica.h b/melica.h deleted file mode 100644 index dc95940..0000000 --- a/melica.h +++ /dev/null @@ -1,66 +0,0 @@ -/* MELODIC - Multivariate exploratory linear optimized decomposition into - independent components - - melica.h - ICA estimation - - Christian F. Beckmann, FMRIB Analysis Group - - Copyright (C) 1999-2013 University of Oxford */ - -/* CCOPYRIGHT */ - -#ifndef __MELODICICA_h -#define __MELODICICA_h -#include "newimage/newimageall.h" -#include "utils/log.h" -#include "melpca.h" -#include "meloptions.h" -#include "meldata.h" -#include "melodic.h" -#include "newmatap.h" -#include "newmatio.h" -#include "melreport.h" -#include "ggmix.h" - -using namespace Utilities; -using namespace NEWIMAGE; - -namespace Melodic{ - - class MelodicICA{ - public: - MelodicICA(MelodicData &pmelodat, MelodicOptions &popts, Log &plogger, MelodicReport &preport): - melodat(pmelodat), - opts(popts), - logger(plogger), - report(preport){} - - void perf_ica(const Matrix &Data); - - bool no_convergence; - - private: - MelodicData &melodat; - MelodicOptions &opts; - Log &logger; - MelodicReport &report; - - int dim; - int samples; - Matrix redUMM; - - void ica_fastica_symm(const Matrix &Data); - void ica_fastica_defl(const Matrix &Data); - void ica_maxent(const Matrix &Data); - void ica_jade(const Matrix &Data); - //void tica(); - //void tica_concat(); - //void parafac(); - Matrix randm(const int dim1, const int dim2); - void sort(); - Matrix sign(const Matrix &Inp); - - }; -} - -#endif diff --git a/melodic.h b/melodic.h deleted file mode 100644 index 3e3e32d..0000000 --- a/melodic.h +++ /dev/null @@ -1,88 +0,0 @@ -/* MELODIC - Multivariate exploratory linear optimized decomposition into - independent components - - melodic.h - main program header - - Christian F. Beckmann and Matthew Webster, FMRIB Analysis Group - - Copyright (C) 1999-2013 University of Oxford */ - -/* CCOPYRIGHT */ - -#ifndef __MELODIC_h -#define __MELODIC_h - -#include <strstream> - -#ifdef __APPLE__ -#include <mach/mach.h> -#define memmsg(msg) { \ - MelodicOptions&opt = MelodicOptions::getInstance(); \ - struct task_basic_info t_info; \ - mach_msg_type_number_t t_info_count = TASK_BASIC_INFO_COUNT; \ - if (KERN_SUCCESS == task_info(mach_task_self(), TASK_BASIC_INFO, (task_info_t) &t_info, &t_info_count)) \ - { \ - if(opt.debug.value()) {\ - cout << " MEM: " << msg << " res: " << t_info.resident_size/1000000 << " virt: " << t_info.virtual_size/1000000 << "\n"; \ - cout.flush(); \ - } \ - } \ -} -#else -#define memmsg(msg) { \ - MelodicOptions&opt = MelodicOptions::getInstance(); \ - if(opt.debug.value()) {\ - cout << msg; \ - cout.flush(); \ - } \ -} -#endif - - - -// a simple message macro that takes care of cout and log -#define message(msg) { \ - MelodicOptions& opt = MelodicOptions::getInstance(); \ - if(opt.verbose.value()) \ - { \ - cout << msg; \ - } \ - Log& logger = LogSingleton::getInstance(); \ - logger.str() << msg; \ - cout.flush(); \ -} - -#define dbgmsg(msg) { \ - MelodicOptions&opt = MelodicOptions::getInstance(); \ - if(opt.debug.value()) {\ - cout << msg; } \ -} - -#define outMsize(msg,Mat) { \ - MelodicOptions& opt = MelodicOptions::getInstance(); \ - if(opt.debug.value()) \ - cerr << " " << msg << " " <<Mat.Nrows() << " x " << Mat.Ncols() << endl; \ -} - -namespace Melodic{ - -const string version = "3.141"; - -// The two strings below specify the title and example usage that is -// printed out as the help or usage message -const string title=string("MELODIC (Version ")+version+")"+ - string("\n Multivariate Exploratory Linear Optimised Decomposition into Independent Components\n")+ - string("\nAuthor: Christian F. Beckmann \n Copyright(c) 2001-2013 University of Oxford"); - -const string usageexmpl=string(" melodic -i <filename> <options>")+ - string("\n \t \t to run melodic")+ - // string("\n melodic -i <filename> --mix=melodic_mix")+ - // string(" --filter=\"string of component numbers\"")+ - // string("\n \t \t to remove estimated ICs from input")+ - string("\n melodic -i <filename> --ICs=melodic_IC")+ - string(" --mix=melodic_mix <options>")+ - string("\n \t \t to run Mixture Model based inference on estimated ICs")+ - string("\n melodic --help "); -} - -#endif diff --git a/meloptions.cc b/meloptions.cc index 0d96dbe..72835c3 100644 --- a/meloptions.cc +++ b/meloptions.cc @@ -157,10 +157,6 @@ MelodicOptions* MelodicOptions::gopt = NULL; } if (insta_fn.value() > ""){ varnorm.set_T(false); - cout << " inc_fn = " << insta_fn.value() << endl; - cout << " inc_idx = " << insta_idx.value() << endl; - cout << " inc_partial = " << insta_partial.value() << endl; - cout << " inc_varnorm = " << insta_varnorm.value() << endl; } //in the case of indirect inputs, create the vector of input names here diff --git a/meloptions.h b/meloptions.h deleted file mode 100644 index 020884f..0000000 --- a/meloptions.h +++ /dev/null @@ -1,543 +0,0 @@ - /* MELODIC - Multivariate exploratory linear optimized decomposition into - independent components - - meloptions.h - class for command line options - - Christian F. Beckmann, FMRIB Analysis Group - - Copyright (C) 1999-2013 University of Oxford */ - -/* CCOPYRIGHT */ - -#ifndef __MELODICOPTIONS_h -#define __MELODICOPTIONS_h - -#include <string> -#include <strstream> -#include <iostream> -#include <iomanip> -#include <fstream> -#include <stdlib.h> -#include <stdio.h> -#include "utils/options.h" -#include "utils/log.h" -#include "melodic.h" - -using namespace Utilities; - -namespace Melodic { - -class MelodicOptions { - public: - static MelodicOptions& getInstance(); - ~MelodicOptions() { delete gopt; } - - string version; - string binpath; - string logfname; - bool filtermode; - bool explicitnums; - - Option<string> logdir; - Option< std::vector<string> > inputfname; - - Option<string> outputfname; - - Option<string> maskfname; - Option<bool> use_mask; - Option<bool> update_mask; - Option<bool> perf_bet; - Option<float> threshold; - - Option<int> pca_dim; - Option<string> pca_est; - Option<bool> joined_whiten; - Option<bool> joined_vn; - Option<bool> dr_pca; - Option<bool> migp; - Option<int> migpN; - Option<bool> migp_shuffle; - Option<int> migp_factor; - Option<bool> dr; - Option<bool> dr_out; - Option<float> vn_level; - Option<int> numICs; - Option<string> approach; - Option<string> nonlinearity; - - Option<bool> varnorm; - Option<bool> varnorm2; - Option<bool> pbsc; - Option<bool> pspec; - Option<string> segment; - Option<bool> tsmooth; - Option<float> epsilon; - Option<float> epsilonS; - Option<int> maxNumItt; - Option<int> maxRestart; - Option<int> rank1interval; - - Option<string> mmthresh; - Option<bool> perf_mm; - Option<string> ICsfname; - Option<string> filtermix; - Option<string> smodename; - Option<string> filter; - - Option<bool> genreport; - Option<string> guireport; - Option<string> bgimage; - Option<float> tr; - Option<bool> logPower; - Option<bool> addsigchng; - Option<bool> allPPCA; - Option<bool> varplots; - Option<bool> varvals; - - Option<string> fn_Tdesign; - Option<string> fn_Tcon; - Option<string> fn_TconF; - Option<string> fn_Sdesign; - Option<string> fn_Scon; - Option<string> fn_SconF; - - Option<bool> output_all; - Option<bool> output_unmix; - Option<bool> output_MMstats; - Option<bool> output_pca; - Option<bool> output_white; - Option<bool> output_origIC; - Option<bool> output_mean; - - Option<bool> verbose; - Option<bool> vers; - Option<bool> copyright; - Option<bool> help; - Option<bool> debug; - - Option<string> guessfname; - Option<string> paradigmfname; - Option<string> axials_str; - - Option<int> dummy; - Option<int> repeats; - Option<int> seed; - Option<float> nlconst1; - Option<float> nlconst2; - Option<float> smooth_probmap; - - Option<string> insta_fn; - Option<int> insta_idx; - Option<bool> insta_partial; - Option<bool> insta_varnorm; - - Option<bool> remove_meanvol; - Option<bool> remove_meantc; - Option<bool> remove_endslices; - Option<bool> rescale_nht; - - Option<bool> guess_remderiv; - Option<bool> temporal; - - Option<float> retryfactor; - Option<int> econ; - - void parse_command_line(int argc, char** argv, Log& logger, const string &p_version); - - private: - MelodicOptions(); - const MelodicOptions& operator=(MelodicOptions&); - MelodicOptions(MelodicOptions&); - - OptionParser options; - - static MelodicOptions* gopt; - - void print_usage(int argc, char *argv[]); - void print_version(); - void print_copyright(); - void status(); - -}; - - inline MelodicOptions& MelodicOptions::getInstance(){ - if(gopt == NULL) - gopt = new MelodicOptions(); - - return *gopt; - } - - inline MelodicOptions::MelodicOptions() : - logdir(string("-o,--outdir"), string("log.txt"), - string("output directory name\n"), - false, requires_argument), - inputfname(string("-i,--in"), std::vector<string>(), - string("input file names (either single file name or comma-separated list or text file)"), - true, requires_argument), - outputfname(string("-O,--out"), string("melodic"), - string("output file name"), - false, requires_argument,false), - maskfname(string("-m,--mask"), string(""), - string("file name of mask for thresholding"), - false, requires_argument), - use_mask(string("--nomask"), true, - string("switch off masking"), - false, no_argument), - update_mask(string("--update_mask"), true, - string("switch off mask updating"), - false, no_argument), - perf_bet(string("--nobet"), true, - string("\tswitch off BET"), - false, no_argument), - threshold(string("--bgthreshold"), 0.01, - string("brain / non-brain threshold (only if --nobet selected)\n"), - false, requires_argument), - pca_dim(string("-d,--dim"), 0, - string("dimensionality reduction into #num dimensions (default: automatic estimation)"), - false, requires_argument), - pca_est(string("--dimest"), string("lap"), - string("use specific dim. estimation technique: lap, bic, mdl, aic, mean (default: lap)"), - false, requires_argument), - joined_whiten(string("--sep_whiten"), false, - string("switch on separate whitening"), - false, no_argument, false), - joined_vn(string("--sep_vn"), true, - string("switch on separate variance nomalisation (as opposed to separate VN)"), - false, no_argument), - dr_pca(string("--mod_pca"), true, - string("switch off modified PCA for concat ICA"), - false, no_argument, false), - migp(string("--migp"), false, - string("switch on MIGP data reduction"), - false, no_argument, false), - migpN(string("--migpN"), 0, - string("Number of internal Eigenmaps"), - false, requires_argument, false), - migp_shuffle(string("--migp_shuffle"), true, - string("Randomise MIGP file order (default: TRUE)"), - false, no_argument, false), - migp_factor(string("--migp_factor"), 2, - string("Internal Factor of mem-threshold relative to number of Eigenmaps (default: 2)"), - false, requires_argument, false), - dr(string("--dr"), false, - string("Dual Regression (default: false)"), - false, no_argument, false), - dr_out(string("--dr_out"), false, - string("Dual Regression output for MIGP/concat ICA"), - false, no_argument, false), - vn_level(string("--vn_level"), float(2.3), - string("variance nomalisation threshold level (Z> value is ignored)"), - false, requires_argument, false), - numICs(string("-n,--numICs"), -1, - string("numer of IC's to extract (for deflation approach)"), - false, requires_argument), - approach(string("-a,--approach"), string("symm"), - string("approach for decomposition, 2D: defl, symm (default), 3D: tica, concat (default)"), - false, requires_argument), - nonlinearity(string("--nl"), string("pow3"), - string("\tnonlinearity: gauss, tanh, pow3, pow4"), - false, requires_argument), - varnorm(string("--vn,--varnorm"), true, - string("switch off variance normalisation"), - false, no_argument), - varnorm2(string("--vn2"), true, - string("switch off 2nd level variance normalisation"), - false, no_argument, false), - pbsc(string("--pbsc"), false, - string(" switch on conversion to percent BOLD signal change"), - false, no_argument, false), - pspec(string("--pspec"), false, - string(" switch on conversion to powerspectra"), - false, no_argument, false), - segment(string("--covarweight"), string(""), - string("voxel-wise weights for the covariance matrix (e.g. segmentation information)"), - false, requires_argument), - tsmooth(string("--spca"), false, - string("smooth the eigenvectors prior to IC decomposition"), - false, no_argument, false), - epsilon(string("--eps"), 0.00005, - string("minimum error change"), - false, requires_argument), - epsilonS(string("--epsS"), 0.03, - string("minimum error change for rank-1 approximation in TICA"), - false, requires_argument), - maxNumItt(string("--maxit"), 500, - string("\tmaximum number of iterations before restart"), - false, requires_argument), - maxRestart(string("--maxrestart"), -1, - string("maximum number of restarts\n"), - false, requires_argument), - rank1interval(string("--rank1interval"), 10, - string("number of iterations between rank-1 approximation (TICA)\n"), - false, requires_argument,false), - mmthresh(string("--mmthresh"), string("0.5"), - string("threshold for Mixture Model based inference"), - false, requires_argument), - perf_mm(string("--no_mm"), true, - string("\tswitch off mixture modelling on IC maps\n "), - false, no_argument), - ICsfname(string("--ICs"), string(""), - string("\tinput filename of the IC components file for mixture modelling"), - false, requires_argument), - filtermix(string("--mix"), string(""), - string("\tinput filename of mixing matrix for mixture modelling / filtering"), - false, requires_argument), - smodename(string("--smode"), string(""), - string("\tinput filename of matrix of session modes for report generation"), - false, requires_argument), - filter(string("-f,--filter"), string(""), - string("list of component numbers to remove\n "), - false, requires_argument), - genreport(string("--report"), false, - string("generate Melodic web report"), - false, no_argument), - guireport(string("--guireport"), string(""), - string("modify report for GUI use"), - false, requires_argument, false), - bgimage(string("--bgimage"), string(""), - string("specify background image for report (default: mean image)\n "), - false, requires_argument), - tr(string("--tr"), 0.0, - string("\tTR in seconds"), - false, requires_argument), - logPower(string("--logPower"), false, - string("calculate log of power for frequency spectrum\n"), - false, no_argument), - addsigchng(string("--sigchng"), false, - string("add signal change estimates to report pages\n"), - false, no_argument, false), - allPPCA(string("--allPPCA"), false, - string("add all PPCA plots\n"), - false, no_argument, false), - varplots(string("--varplots"), false, - string("add std error envelopes to time course plots\n"), - false, no_argument, false), - varvals(string("--varvals"), false, - string("add rank1 values after plots\n"), - false, no_argument, false), - fn_Tdesign(string("--Tdes"), string(""), - string(" design matrix across time-domain"), - false, requires_argument), - fn_Tcon(string("--Tcon"), string(""), - string(" t-contrast matrix across time-domain"), - false, requires_argument), - fn_TconF(string("--Tconf"), string(""), - string(" F-contrast matrix across time-domain"), - false, requires_argument, false), - fn_Sdesign(string("--Sdes"), string(""), - string(" design matrix across subject-domain"), - false, requires_argument), - fn_Scon(string("--Scon"), string(""), - string(" t-contrast matrix across subject-domain"), - false, requires_argument), - fn_SconF(string("--Sconf"), string(""), - string(" F-contrast matrix across subject-domain"), - false, requires_argument,false), - output_all(string("--Oall"), false, - string(" output everything"), - false, no_argument), - output_unmix(string("--Ounmix"), false, - string("output unmixing matrix"), - false, no_argument), - output_MMstats(string("--Ostats"), false, - string("output thresholded maps and probability maps"), - false, no_argument), - output_pca(string("--Opca"), false, - string("\toutput PCA results"), - false, no_argument), - output_white(string("--Owhite"), false, - string("output whitening/dewhitening matrices"), - false, no_argument), - output_origIC(string("--Oorig"), false, - string("\toutput the original ICs"), - false, no_argument), - output_mean(string("--Omean"), false, - string("\toutput mean volume\n"), - false, no_argument), - verbose(string("-v,--verbose"), false, - string("switch on diagnostic messages"), - false, no_argument), - vers(string("-V,--version"), false, - string("prints version information"), - false, no_argument), - copyright(string("--copyright"), false, - string("prints copyright information"), - false, no_argument), - help(string("-h,--help"), false, - string("prints this help message"), - false, no_argument), - debug(string("--debug"), false, - string(" switch on debug messages"), - false, no_argument), - guessfname(string("--init_ica"), string(""), - string("file name of FEAT paradigm file (design.mat) for ICA initialisation"), - false, requires_argument, false), - paradigmfname(string("--init_pca"), string(""), - string("file name of FEAT paradigm file (design.mat) for PCA initialisation"), - false, requires_argument, false), - axials_str(string("--report_maps"), string(" -s 2 -A 950 "), - string("control string for spatial map images (see slicer)"), - false, requires_argument), - dummy(string("--dummy"), 0, - string("number of dummy volumes"), - false, requires_argument,false), - repeats(string("--repeats"), 1, - string("number of repeats (multistart)"), - false, requires_argument, false), - seed(string("--seed"), -1, - string("integer seed for random number generator within melodic"), - false, requires_argument, false), - nlconst1(string("--nl1,--nlconst1"), 1.0, - string("nonlinear constant 1"), - false, requires_argument, false), - nlconst2(string("--nl2,--nlconst2"), 1.0, - string("nonlinear constant 2"), - false, requires_argument, false), - smooth_probmap(string("--smooth_pm"), 0.0, - string("width of smoothing kernel for probability maps"), - false, requires_argument, false), - insta_fn(string("--inc_fn"), string(""), - string(" file name for instacorr volumes"), - false, requires_argument, false), - insta_idx(string("--inc_idx"), 1, - string(" index for instacorr calculation"), - false, requires_argument, false), - insta_partial(string("--inc_partial"), true, - string(" switch off partial correlation analysis for instacorrs"), - false, requires_argument, false), - insta_varnorm(string("--inc_varnorm"), true, - string(" switch off varnorm for instantaneous correlations"), - false, no_argument, false), - remove_meanvol(string("--keep_meanvol"), true, - string("do not subtract mean volume"), - false, no_argument, false), - remove_meantc(string("--remove_meantc"), false, - string("remove mean time course"), - false, no_argument, false), - remove_endslices(string("--remEndslices"), false, - string("delete end slices (motion correction artefacts)"), - false, no_argument,false), - rescale_nht(string("--rescale_nht"), true, - string("switch off map rescaling after mixture-modelling"), - false, no_argument,false), - guess_remderiv(string("--remove_deriv"), false, - string("removes every second entry in paradigm file (EV derivatives)"), - false, no_argument, false), - temporal(string("--temporal"), false, - string("perform temporal ICA"), - false, no_argument, false), - retryfactor(string("--retryfactor"), float(0.95), - string("multiplicative factor for determining new dim if estimated dim fails to converge"), - false, requires_argument, false), - econ(string("--econ"), 20000, - string("set ctrl parameter for helperfns econ mode"), - false, requires_argument, false), - options(title, usageexmpl) - { - try { - options.add(logdir); - options.add(inputfname); - options.add(outputfname); - options.add(guessfname); - options.add(maskfname); - options.add(use_mask); - options.add(update_mask); - options.add(perf_bet); - options.add(threshold); - options.add(pca_dim); - options.add(pca_est); - options.add(joined_whiten); - options.add(joined_vn); - options.add(dr_pca); - options.add(migp); - options.add(migpN); - options.add(migp_shuffle); - options.add(migp_factor); - options.add(dr); - options.add(dr_out); - options.add(vn_level); - options.add(numICs); - options.add(approach); - options.add(nonlinearity); - options.add(varnorm); - options.add(varnorm2); - options.add(pbsc); - options.add(pspec); - options.add(segment); - options.add(tsmooth); - options.add(epsilon); - options.add(epsilonS); - options.add(maxNumItt); - options.add(maxRestart); - options.add(rank1interval); - options.add(mmthresh); - options.add(perf_mm); - options.add(ICsfname); - options.add(filtermix); - options.add(smodename); - options.add(filter); - options.add(genreport); - options.add(guireport); - options.add(bgimage); - options.add(tr); - options.add(logPower); - options.add(addsigchng); - options.add(allPPCA); - options.add(varplots); - options.add(varvals); - options.add(fn_Tdesign); - options.add(fn_Tcon); - options.add(fn_TconF); - options.add(fn_Sdesign); - options.add(fn_Scon); - options.add(fn_SconF); - options.add(output_all); - options.add(output_unmix); - options.add(output_MMstats); - options.add(output_pca); - options.add(output_white); - options.add(output_origIC); - options.add(output_mean); - options.add(verbose); - options.add(vers); - options.add(copyright); - options.add(help); - options.add(debug); - - options.add(guessfname); - options.add(paradigmfname); - options.add(axials_str); - options.add(dummy); - options.add(repeats); - options.add(seed); - options.add(nlconst1); - options.add(nlconst2); - options.add(smooth_probmap); - options.add(insta_fn); - options.add(insta_idx); - options.add(insta_partial); - options.add(insta_varnorm); - options.add(remove_meanvol); - options.add(remove_meantc); - options.add(remove_endslices); - options.add(rescale_nht); - options.add(guess_remderiv); - options.add(temporal); - options.add(retryfactor); - options.add(econ); - } - catch(X_OptionError& e) { - options.usage(); - cerr << endl << e.what() << endl; - } - catch(std::exception &e) { - cerr << e.what() << endl; - } - - } -} - -#endif - - - diff --git a/melpca.cc b/melpca.cc deleted file mode 100644 index 1b77439..0000000 --- a/melpca.cc +++ /dev/null @@ -1,127 +0,0 @@ -/* MELODIC - Multivariate exploratory linear optimized decomposition into - independent components - - melpca.cc - PCA and whitening - - Christian F. Beckmann, FMRIB Analysis Group - - Copyright (C) 1999-2013 University of Oxford */ - -/* CCOPYRIGHT */ - -#include "newimage/newimageall.h" -#include "utils/log.h" -#include "meloptions.h" -#include "meldata.h" -#include "melodic.h" -#include "newmatap.h" -#include "newmatio.h" -#include "melpca.h" -#include "melhlprfns.h" -#include "libprob.h" - -using namespace Utilities; -using namespace NEWIMAGE; - -namespace Melodic{ - - void MelodicPCA::perf_pca(Matrix& in, Matrix& weights){ - message("Starting PCA ... "); - - SymmetricMatrix Corr; - Matrix tmpE; - RowVector tmpD, AdjEV, PercEV; - - if(opts.paradigmfname.value().length()>0) - { - basicGLM tmpglm; - tmpglm.olsfit(in,melodat.get_param(),IdentityMatrix(melodat.get_param().Ncols())); - std_pca(tmpglm.get_residu(),weights,Corr,tmpE,tmpD); - } - else{ - std_pca(in,weights,Corr,tmpE,tmpD); - } - - if(opts.tsmooth.value()){ - message(endl << " temporal smoothing of Eigenvectors " << endl); - tmpE=smoothColumns(tmpE); - } - - adj_eigspec(tmpD,AdjEV,PercEV); - melodat.set_pcaE(tmpE); - melodat.set_pcaD(tmpD); - melodat.set_EVP(PercEV); - melodat.set_EV((AdjEV)); - write_ascii_matrix(logger.appendDir("eigenvalues_percent"),PercEV); - - message("done" << endl); - } - - void MelodicPCA::perf_white(){ - int N = melodat.get_pcaE().Ncols(); - if(opts.pca_dim.value() > N){ - message("dimensionality too large - using -dim " << N << - " instead " << endl); - opts.pca_dim.set_T(N); - } - if(opts.pca_dim.value() < 0){ - if(opts.remove_meanvol.value()){ - opts.pca_dim.set_T(N-2); - }else{ - opts.pca_dim.set_T(N-1); - } - } - if(opts.pca_dim.value() ==0){ - opts.pca_dim.set_T(pcadim()); - if(melodat.get_Data().Nrows()<20){ - opts.pca_dim.set_T(N-2); - message("too few data points for full estimation, using " - << opts.pca_dim.value() << " instead"<< endl); - } - } - if(opts.approach.value()==string("jade") && opts.pca_dim.value() > 30){ - message("dimensionality too large for jade estimation - using --dim 30 instead" << endl); - opts.pca_dim.set_T(30); - } - - message("Start whitening using "<< opts.pca_dim.value()<<" dimensions ... " << endl); - Matrix tmpWhite; - Matrix tmpDeWhite; - - float varp = 1.0; - - if (opts.paradigmfname.value().length()>0) - varp = calc_white(melodat.get_pcaE(),melodat.get_pcaD(), - melodat.get_EVP(),opts.pca_dim.value(),melodat.get_param(),melodat.get_paramS(),tmpWhite,tmpDeWhite); - else - varp = calc_white(melodat.get_pcaE(),melodat.get_pcaD(), - melodat.get_EVP(),opts.pca_dim.value(),tmpWhite,tmpDeWhite); - - melodat.set_white(tmpWhite); - melodat.set_dewhite(tmpDeWhite); - message(" retaining "<< varp*100 <<" percent of the variability " << endl); - message(" ... done"<< endl << endl); - } - - int MelodicPCA::pcadim() - { - message("Estimating the number of sources from the data (PPCA) ..." << endl); - - ColumnVector PPCA; RowVector AdjEV, PercEV; - int res = ppca_dim(melodat.get_Data(),melodat.get_RXweight(), PPCA, - AdjEV, PercEV, melodat.get_resels(), opts.pca_est.value()); - - write_ascii_matrix(logger.appendDir("PPCA"),PPCA); - write_ascii_matrix(logger.appendDir("eigenvalues_adjusted"),AdjEV.t()); - write_ascii_matrix(logger.appendDir("eigenvalues_percent"),PercEV.t()); - - melodat.set_EVP(PercEV); - melodat.set_EV(AdjEV); - melodat.set_PPCA(PPCA); - - return res; - } - -} - - diff --git a/melpca.h b/melpca.h deleted file mode 100644 index 346e9a5..0000000 --- a/melpca.h +++ /dev/null @@ -1,55 +0,0 @@ - /* MELODIC - Multivariate exploratory linear optimized decomposition into - independent components - - melpca.h - PCA and whitening - - Christian F. Beckmann, FMRIB Analysis Group - - Copyright (C) 1999-2013 University of Oxford */ - -/* CCOPYRIGHT */ - -#ifndef __MELODICPCA_h -#define __MELODICPCA_h -#include "newimage/newimageall.h" -#include "utils/log.h" -#include "meloptions.h" -#include "meldata.h" -#include "melodic.h" -//#include "melreport.h" -#include "newmatap.h" -#include "newmatio.h" - -using namespace Utilities; -using namespace NEWIMAGE; - -namespace Melodic{ - - class MelodicReport; - - class MelodicPCA{ - public: - MelodicPCA(MelodicData &pmelodat, MelodicOptions &popts, Log &plogger, - MelodicReport &preport): - melodat(pmelodat), - opts(popts), - logger(plogger), - report(preport){} - - void perf_pca(Matrix& in, Matrix& weights); - inline void perf_pca(){ - perf_pca(melodat.get_Data(),melodat.get_RXweight()); - } - void perf_white(); - - private: - MelodicData &melodat; - MelodicOptions &opts; - Log &logger; - __attribute__((unused)) MelodicReport &report; - - int pcadim(); - }; -} - -#endif diff --git a/melreport.cc b/melreport.cc deleted file mode 100644 index 417f3ef..0000000 --- a/melreport.cc +++ /dev/null @@ -1,807 +0,0 @@ -/* MELODIC - Multivariate exploratory linear optimized decomposition into - independent components - - melreport.cc - report generation - - Christian F. Beckmann, FMRIB Analysis Group - - Copyright (C) 1999-2013 University of Oxford */ - -/* CCOPYRIGHT */ - -#include "newimage/newimageall.h" -#include "utils/log.h" -#include "melreport.h" -#include "melhlprfns.h" -#include "miscmaths/miscprob.h" - -namespace Melodic{ - - void MelodicReport::IC_rep(MelGMix &mmodel, int cnum, int dim, Matrix ICstats){ - - if( bool(opts.genreport.value()) ){ - addlink(mmodel.get_prefix()+".html",num2str(cnum)); - IChtml.setDir(report.getDir(),mmodel.get_prefix()+".html"); - - {//start IC page - IChtml << "<HTML><HEAD><link REL=stylesheet TYPE=text/css href=file:" + - (string) getenv("FSLDIR") +"/doc/fsl.css>" << endl - << "<style type=\"text/css\">OBJECT { width: 100% }</style>" - << "<TITLE>FSL</TITLE></HEAD>" << endl - << "<IFRAME height=" << int(melodat.get_numfiles()/30 + 1)*50 - <<"px width=100% src=nav.html frameborder=0></IFRAME><BR>"<< endl - << "<Center>" << endl; - - if(cnum>1) - IChtml << "<a href=\"" << string("IC_")+num2str(cnum-1) - <<".html\"><</a> - "; - else - IChtml << "<a href=\"" << string("IC_")+num2str(melodat.get_mix().Ncols()) - <<".html\"><</a> - "; - - if(cnum<dim) - IChtml << "<a href=\"" << string("IC_")+num2str(cnum+1) - <<".html\">></a>"; - else - IChtml << "<a href=\"" << string("IC_")+num2str(1) - <<".html\">></a>"; - IChtml << "<p><H3>MELODIC Component " << num2str(cnum) - << "<br></b></H3><hr><p>" << endl; - } - {//output IC stats - if(ICstats.Storage()>0&&ICstats.Nrows()>=cnum){ - IChtml << fixed << setprecision(2) << std::abs(ICstats(cnum,1)) << " % of explained variance"; - if(ICstats.Ncols()>1) - IChtml << "; " << std::abs(ICstats(cnum,2)) << " % of total variance"; - if(ICstats.Ncols()>2&&opts.addsigchng.value()){ - IChtml << "<p>" <<endl; - IChtml << " " << ICstats(cnum,3) << " % signal change (pos peak voxel); " << ICstats(cnum,4) << "% signal change (peak neg. voxel)" << endl ; - } - IChtml << "<hr><p>" << endl; - } - } - - volume4D<float> tempVol; - if(mmodel.get_threshmaps().Storage()>0&& - (mmodel.get_threshmaps().Ncols() == mmodel.get_data().Ncols())) - {//Output thresholded IC map - tempVol.setmatrix(mmodel.get_threshmaps().Row(1),melodat.get_mask()); - volume<float> map1; - volume<float> map2; - map1 = threshold(tempVol[0],float(0.0), tempVol[0].max()); - map2 = threshold(tempVol[0],tempVol[0].min(), float(0.0)); - - volume<float> newvol; - - miscpic newpic; - - float map1min = std::max((map1 + binarise(tempVol[0],tempVol[0].min(), - float(0.0)) * map1.max()).min(),float(0.001)); - float map1max = std::max(map1.max(),float(0.001)); - float map2min = std::min(map2.min(),float(-0.001)); - float map2max = std::min((map2 + binarise(tempVol[0],float(0.0), - tempVol[0].max()) * map2.min()).max(),float(-0.001)); - - newpic.overlay(newvol, melodat.get_bg(), map1, map2, - melodat.get_bg().percentile(0.02), - melodat.get_bg().percentile(0.98), - map1min, map1max, map2max, map2min, - 0, 0); - char instr[10000]; - - sprintf(instr," "); - strcat(instr,axials_instr.c_str()); - strcat(instr,string(report.appendDir(mmodel.get_prefix()+ - "_thresh.png")).c_str()); - newpic.set_title(string("Component No. "+num2str(cnum)+ - " - thresholded IC map ") + mmodel.get_infstr(1)); - newpic.set_cbar(string("ysb")); - - if((std::abs(map1.max()-map1.min())>0.01) || (std::abs(map2.max()-map2.min())>0.01)) - newpic.slicer(newvol, instr); - else - newpic.slicer(newvol, instr); - IChtml << "<a href=\""+mmodel.get_prefix()+"_MM.html\">"; - IChtml << "<img BORDER=0 SRC=\""+mmodel.get_prefix() - +"_thresh.png\" ALT=\"MMfit\"></A><p>" << endl; - } - - {//plot time course - IChtml << "<H3> Temporal mode </H3><p>" << endl <<endl; - miscplot newplot; - - Matrix tmptc = melodat.get_Tmodes(cnum-1).Column(1).t(); - - newplot.col_replace(0,0xFF0000); - - newplot.add_label(string("IC ")+num2str(cnum)+" time course"); - //add GLM OLS fit - if(melodat.Tdes.Storage()>0 && - melodat.glmT.get_beta().Nrows() == melodat.Tdes.Ncols()){ - tmptc &= melodat.glmT.get_beta().Column(cnum).t() * melodat.Tdes.t(); - newplot.add_label("full model fit"); - } - - //add deviation around time course - if(melodat.get_Tmodes(cnum-1).Ncols()>1 && opts.varplots.value()){ - Matrix tmp = stdev(melodat.get_Tmodes(cnum-1).Columns(2,melodat.get_Tmodes(cnum-1).Ncols()).t(),1); - tmptc &= melodat.get_Tmodes(cnum-1).Column(1).t()+tmp; - tmptc &= melodat.get_Tmodes(cnum-1).Column(1).t()-tmp; - newplot.add_label("std error across subjects"); - newplot.col_replace(tmptc.Nrows()-1,0x808080); - newplot.col_replace(tmptc.Nrows()-2,0x808080); - } - - if(opts.tr.value()>0.0) - newplot.add_xlabel(string("Time (seconds); TR = ")+ - float2str(opts.tr.value(),0,2,0)+" s"); - else - newplot.add_xlabel(string("Time (TRs)")); - - newplot.add_ylabel("Normalised Response"); - newplot.set_yrange(tmptc.Row(1).Minimum()-0.05*(tmptc.Row(1).Maximum() - - tmptc.Row(1).Minimum()),tmptc.Row(1).Maximum()+ - 0.05*(tmptc.Row(1).Maximum()-tmptc.Row(1).Minimum())); - newplot.grid_swapdefault(); - - newplot.set_xysize(750,150); - - newplot.timeseries(tmptc, - report.appendDir(string("t")+num2str(cnum)+".png"), - string("Timecourse No. ")+num2str(cnum), - opts.tr.value(),150,12,1,false); - - if(melodat.get_Tmodes(cnum-1).Ncols()>1) - tmptc &= melodat.get_Tmodes(cnum-1).Columns(2,melodat.get_Tmodes(cnum-1).Ncols()).t(); - write_ascii_matrix(report.appendDir(string("t") - +num2str(cnum)+".txt"),tmptc.t()); - IChtml << "<A HREF=\"" << string("t") - +num2str(cnum)+".txt" << "\"> "; - IChtml << "<img BORDER=0 SRC=\"" - +string("t")+num2str(cnum)+".png\"></A><p>" << endl; - - if(melodat.get_numfiles()>1 && melodat.explained_var.Storage()>0 - && melodat.explained_var.Ncols()>=cnum && opts.varvals.value()) - IChtml << "Rank-1 approximation of individual time courses explains " - << std::abs(melodat.explained_var(cnum)) << "% of variance.<p>" << endl; - }//time series plot - - if(!opts.pspec.value()) - {//plot frequency - miscplot newplot; - RowVector empty(1); - empty = 0.0; - int fact = int(std::pow(10.0,int(std::log10(float(melodat.get_Tmodes(0).Nrows()))))); - if(opts.logPower.value()) - newplot.add_ylabel(string("log-Power")); - else - newplot.add_ylabel(string("Power")); - - Matrix fmixtc = calc_FFT(melodat.get_Tmodes(cnum-1).Column(1), opts.logPower.value()); - - newplot.set_Ylabel_fmt("%.0f"); - newplot.set_yrange(0.0,1.02*fmixtc.Maximum()); - newplot.grid_swapdefault(); - newplot.set_xysize(750,150); - - if(opts.tr.value()>0.0){ - newplot.add_xlabel(string("Frequency (in Hz / ")+num2str(fact)+ " )"); - newplot.timeseries(empty | fmixtc.t(), - report.appendDir(string("f")+ - num2str(cnum)+".png"), - string("Powerspectrum of timecourse"), - fact/(opts.tr.value()*melodat.get_Tmodes(0).Nrows()), 150,0,2); - }else{ - newplot.add_xlabel(string("Frequency (in cycles); ") - +"frequency(Hz)=cycles/(" - +num2str(melodat.get_Tmodes(0).Nrows()) - +"* TR); period(s)=(" - +num2str(melodat.get_Tmodes(0).Nrows()) - +"* TR)/cycles" - ); - newplot.timeseries(fmixtc.t(), - report.appendDir(string("f")+num2str(cnum)+".png"), - string("Powerspectrum of timecourse")); - } - write_ascii_matrix(report.appendDir(string("f") - +num2str(cnum)+".txt"), fmixtc); - IChtml << "<A HREF=\"" << string("f") - +num2str(cnum)+".txt" << "\"> "; - IChtml << "<img BORDER=0 SRC=\"" - +string("f")+num2str(cnum)+".png\"></A><p>" << endl; - }//frequency plot - {//add T-mode GLM F-stats for full model fit & contrasts - if(melodat.Tdes.Storage() > 0 && - melodat.glmT.get_beta().Nrows() == melodat.Tdes.Ncols()){ - IChtml << " <TABLE border=1 bgcolor=ffffff cellpadding=5>" << - "<CAPTION><EM> <b>GLM (OLS) on time series </b></EM></CAPTION>" << endl - << "<TR valign=middle><TH ><EM>GLM β's</EM> <TH> <EM> F-test on <br> full model fit </em>"; - if(melodat.Tcon.Storage() > 0) - IChtml << "<TH ><EM>Contrasts</EM>"<<endl; - IChtml << "<TR><TD><TABLE border=0><TR><TD align=right>" << endl; - for(int ctr=1;ctr <= melodat.Tdes.Ncols();ctr++) - IChtml << " PE(" <<num2str(ctr)+"): <br>" << endl; - IChtml << "<TD align=right>" << endl; - for(int ctr=1;ctr <= melodat.Tdes.Ncols();ctr++) - IChtml << melodat.glmT.get_beta().Column(cnum).Row(ctr) << "<br>" <<endl; - IChtml << "</TABLE>" << - " <TD align=center> F = "<< melodat.glmT.get_f_fmf().Column(cnum) << - " <BR> dof1 = " << melodat.Tdes.Ncols() << "; dof2 = " - << melodat.glmT.get_dof() << "<BR>" <<endl; - if(melodat.glmT.get_pf_fmf().Column(cnum).AsScalar() < 0.05) - IChtml << fixed << setprecision(5) <<"<b> p < " << melodat.glmT.get_pf_fmf().Column(cnum) << - "<BR> (uncorrected for #comp.)<b></TD>" << endl; - else - IChtml << fixed << setprecision(5) << " p < " << - melodat.glmT.get_pf_fmf().Column(cnum) << - "<BR> (uncorrected for #comp.)</TD>" << endl; - if(melodat.Tcon.Storage() > 0 && - melodat.Tdes.Ncols() == melodat.Tcon.Ncols()){ - IChtml << fixed << setprecision(2) << "<TD><TABLE border=0><TR><TD align=right>" <<endl; - for(int ctr=1; ctr <= melodat.Tcon.Nrows() ; ctr++) - IChtml << "COPE(" << num2str(ctr) << "): <br>" << endl; - IChtml << "<td align=right>" << endl; - for(int ctr=1; ctr <= melodat.Tcon.Nrows() ; ctr++) - IChtml <<" z = <BR>" <<endl; - IChtml << "<td align=right>" << endl; - for(int ctr=1; ctr <= melodat.Tcon.Nrows() ; ctr++) - IChtml << melodat.glmT.get_z().Column(cnum).Row(ctr) <<";<BR>" <<endl; - IChtml << "<td align=right>" << endl; - for(int ctr=1; ctr <= melodat.Tcon.Nrows() ; ctr++) - if(melodat.glmT.get_p().Column(cnum).Row(ctr).AsScalar() < 0.05) - IChtml << fixed << setprecision(5) << "<b> p < " << melodat.glmT.get_p().Column(cnum).Row(ctr) << - "</b><BR>" << endl; - else - IChtml << fixed << setprecision(5) <<" p < " << melodat.glmT.get_p().Column(cnum).Row(ctr) << - "<BR>" << endl; - IChtml << "</TABLE></td></tr>" << endl; - } - } - IChtml << "</TABLE><p>" << endl; - } - - if(cnum <= (int)melodat.get_Smodes().size()) - {//plot subject mode - - Matrix smode; - smode = melodat.get_Smodes(cnum-1); - - if(smode.Nrows() > 1){ - IChtml << "<hr><H3> Sessions/Subjects mode </H3><p>" << endl <<endl; - miscplot newplot; - - //add GLM OLS fit - //newplot.setscatter(smode,2); - - if(melodat.Sdes.Storage() > 0&& - melodat.glmS.get_beta().Nrows() == melodat.Sdes.Ncols()){ - smode |= melodat.Sdes * melodat.glmS.get_beta().Column(cnum); - newplot.add_label(string("IC ")+num2str(cnum)+" subject/session-mode"); - newplot.add_label("full model fit"); - } - newplot.grid_swapdefault(); - newplot.set_Ylabel_fmt("%.2f"); - newplot.add_xlabel(" Subject Number"); - - - newplot.set_xysize(750,150); - newplot.timeseries(smode.t(), - report.appendDir(string("s")+num2str(cnum)+".png"), - string("Subject/Session mode No. ") + num2str(cnum)); - newplot.clear_xlabel(); - newplot.clear_labels(); - newplot.set_xysize(120,200); - newplot.set_minmaxscale(1.1); - - newplot.boxplot((Matrix)smode.Column(1), - report.appendDir(string("b")+num2str(cnum)+".png"), - string("Subject/Session mode")); - write_ascii_matrix(report.appendDir(string("s") - +num2str(cnum)+".txt"), smode); - IChtml << "<A HREF=\"" << string("s") - +num2str(cnum)+".txt" << "\"> "; - IChtml << "<img BORDER=0 SRC=\"" - +string("s")+num2str(cnum)+".png\"></A>" << endl; - IChtml << "<A HREF=\"" << string("s") - +num2str(cnum)+".txt" << "\"> "; - IChtml << "<img BORDER=0 SRC=\"" - +string("b")+num2str(cnum)+".png\"></A><p>" << endl; - } - {//add S-mode GLM F-stats for full model fit & contrasts - if(melodat.Sdes.Storage() > 0 && - melodat.glmS.get_beta().Nrows() == melodat.Sdes.Ncols()){ - IChtml << " <TABLE border=1 bgcolor=ffffff cellpadding=5>" << - "<CAPTION><EM> <b>GLM (OLS) on subject/session-mode </b></EM></CAPTION>" << endl - << "<TR valign=middle><TH ><EM>GLM β's</EM> <TH> <EM> F-test on <br> full model fit </em>"; - if(melodat.Scon.Storage() > 0) - IChtml << "<TH ><EM>Contrasts</EM>"<<endl; - IChtml << "<TR><TD><TABLE border=0><TR><TD align=right>" << endl; - for(int ctr=1;ctr <= melodat.Sdes.Ncols();ctr++) - IChtml << " PE(" <<num2str(ctr)+"): <br>" << endl; - IChtml << "<TD align=right>" << endl; - for(int ctr=1;ctr <= melodat.Sdes.Ncols();ctr++) - IChtml << melodat.glmS.get_beta().Column(cnum).Row(ctr) << "<br>" <<endl; - IChtml << "</TABLE>" << - " <TD align=center> F = "<< melodat.glmS.get_f_fmf().Column(cnum) << - " <BR> dof1 = " << melodat.Sdes.Ncols() << "; dof2 = " - << melodat.glmS.get_dof() << "<BR>" <<endl; - if(melodat.glmS.get_pf_fmf().Column(cnum).AsScalar() < 0.05) - IChtml << fixed << setprecision(5) <<"<b> p < " << melodat.glmS.get_pf_fmf().Column(cnum) << - "<BR> (uncorrected for #comp.)<b></TD>" << endl; - else - IChtml << fixed << setprecision(5) << " p < " << - melodat.glmS.get_pf_fmf().Column(cnum) << - "<BR> (uncorrected for #comp.)</TD>" << endl; - if(melodat.Scon.Storage() > 0 && melodat.Sdes.Storage() > 0 && - melodat.Sdes.Ncols() == melodat.Scon.Ncols()){ - IChtml << fixed << setprecision(2) << "<TD><TABLE border=0><TR><TD align=right>" <<endl; - for(int ctr=1; ctr <= melodat.Scon.Nrows() ; ctr++) - IChtml << "COPE(" << num2str(ctr) << "): <br>" << endl; - IChtml << "<td align=right>" << endl; - for(int ctr=1; ctr <= melodat.Scon.Nrows() ; ctr++) - IChtml <<" z = <BR>" <<endl; - IChtml << "<td align=right>" << endl; - for(int ctr=1; ctr <= melodat.Scon.Nrows() ; ctr++) - IChtml << melodat.glmS.get_z().Column(cnum).Row(ctr) <<";<BR>" <<endl; - IChtml << "<td align=right>" << endl; - for(int ctr=1; ctr <= melodat.Scon.Nrows() ; ctr++) - if(melodat.glmS.get_p().Column(cnum).Row(ctr).AsScalar() < 0.05) - IChtml << fixed << setprecision(5) << "<b> p < " << melodat.glmS.get_p().Column(cnum).Row(ctr) << - "</b><BR>" << endl; - else - IChtml << fixed << setprecision(5) <<" p < " << melodat.glmS.get_p().Column(cnum).Row(ctr) << - "<BR>" << endl; - IChtml << "</TABLE></td></tr>" << endl; - } - } - IChtml << "</TABLE><p>" << endl; - } - }//subject mode plot - - if(mmodel.get_threshmaps().Storage()>0&& - (mmodel.get_threshmaps().Ncols() == mmodel.get_data().Ncols())&& - (mmodel.get_threshmaps().Nrows()>1)) - {//Output other thresholded IC map - - for(int tctr=2; tctr<=mmodel.get_threshmaps().Nrows(); tctr++){ - tempVol.setmatrix(mmodel.get_threshmaps().Row(tctr),melodat.get_mask()); - volume<float> map1; - volume<float> map2; - map1 = threshold(tempVol[0],float(0.0), tempVol[0].max()); - map2 = threshold(tempVol[0],tempVol[0].min(), float(0.0)); - - volume<float> newvol; - miscpic newpic; - - float map1min = (map1 + binarise(tempVol[0],tempVol[0].min(), - float(0.0)) * map1.max()).min(); - float map1max = map1.max(); - float map2min = map2.min(); - float map2max = (map2 + binarise(tempVol[0],float(0.0), - tempVol[0].max()) * map2.min()).max(); - - //cerr << endl << map1min << " " << map1max << endl - // << map2min << " " << map2max << endl; - - // if(map1.max()-map1.min()>0.01) - newpic.overlay(newvol, melodat.get_bg(), map1, map2, - melodat.get_bg().percentile(0.02), - melodat.get_bg().percentile(0.98), - map1min, map1max, map2max, map2min, - 0, 0); - - char instr[10000]; - - sprintf(instr," "); - strcat(instr,axials_instr.c_str()); - strcat(instr,string(report.appendDir(mmodel.get_prefix()+"_thresh"+ - num2str(tctr)+".png")).c_str()); - newpic.set_title(string("Component No. "+num2str(cnum)+ - " - thresholded IC map ("+ - num2str(tctr)+") ")+ - mmodel.get_infstr(tctr)); - newpic.set_cbar(string("ysb")); - //cerr << instr << endl; - newpic.slicer(newvol, instr); - - IC_rep_det(mmodel, cnum, dim); - IChtml << "<a href=\""+mmodel.get_prefix()+"_MM.html\">"; - IChtml << "<img BORDER=0 SRC=\""+mmodel.get_prefix() - +"_thresh"+num2str(tctr)+".png\" ALT=\"MMfit\"></A><p>" << endl; - } - } - - { //finish IC page - IChtml<< "<HR><FONT SIZE=1>This page produced automatically by " - << "<A HREF=\"http://www.fmrib.ox.ac.uk/fsl/melodic/index.html\"> MELODIC</A> Version " - << version << " - a part of <A HREF=\"http://www.fmrib.ox.ac.uk/fsl\">FSL - " - << "FMRIB Software Library</A>.</FONT></Center>" << endl - << "</BODY></HTML>" << endl; - } //finish IC page - IC_rep_det(mmodel, cnum, dim); - } - } - - void MelodicReport::IC_rep_det(MelGMix &mmodel, int cnum, int dim){ - if( bool(opts.genreport.value()) ){ - - {//start IC2 page - IChtml2.setDir(report.getDir(),mmodel.get_prefix()+"_MM.html"); - IChtml2 << "<HTML><HEAD><link REL=stylesheet TYPE=text/css href=file:" + - (string) getenv("FSLDIR") +"/doc/fsl.css>" << endl - << "<style type=\"text/css\">OBJECT { width: 100% }</style>" - << "<TITLE>FSL</TITLE></HEAD>" << endl - << "<IFRAME height="<< int(melodat.get_numfiles()/30 + 1)*50 - <<"px width=100% src=nav.html frameborder=0></IFRAME><p>"<< endl - << "<CENTER>"; - if(cnum>1) - IChtml2 << "<b><a href=\"" << string("IC_")+num2str(cnum-1) - <<"_MM.html\"><</a> - "; - else - IChtml2 << "<b><a href=\"" << string("IC_")+num2str(melodat.get_mix().Ncols()) - <<"_MM.html\"><</a> - "; - // IChtml << "<a href=\"00index.html\"> index </a>" ; - - if(cnum<dim) - IChtml2 << "<a href=\"" << string("IC_")+num2str(cnum+1) - <<"_MM.html\">></a>"; - else - IChtml2 << "<a href=\"" << string("IC_")+num2str(1) - <<"_MM.html\">></a>"; - IChtml2 << "<p><H3>Component " << num2str(cnum) - << " Mixture Model fit <br></b></H3><hr><p>" << endl; - } - - volume4D<float> tempVol; - - if(melodat.get_IC().Storage()>0) - {//Output raw IC map - - // tempVol.setmatrix(melodat.get_IC().Row(cnum), - // melodat.get_mask()); - tempVol.setmatrix(mmodel.get_data(), - melodat.get_mask()); - volume<float> map1; - volume<float> map2; - map1 = threshold(tempVol[0],float(0.0), - tempVol[0].max()); - map2 = threshold(tempVol[0],tempVol[0].min(), - float(-0.0)); - - volume<float> newvol; - miscpic newpic; - - // float map1min = (map1 + binarise(tempVol[0],tempVol[0].min(), - // float(0.0)) * map1.max()).robustmin(); - float map1max = map1.percentile(0.99); - float map2min = map2.percentile(0.01); - //float map2max = (map2 + binarise(tempVol[0],float(0.0), - // tempVol[0].max()) * map2.min()).robustmax(); - - newpic.overlay(newvol, melodat.get_bg(), map1, map2, - float(0.0), - float(0.0), - float(0.01), map1max, float(-0.01), map2min, - 0, 0); - - char instr[10000]; - - sprintf(instr," "); - strcat(instr,axials_instr.c_str()); - strcat(instr,string(report.appendDir(mmodel.get_prefix()+ - ".png")).c_str()); - newpic.set_title(string("Component No. "+num2str(cnum)+ - " - raw Z transformed IC map (1 - 99 percentile)")); - newpic.set_cbar(string("ysb")); - - newpic.slicer(newvol, instr); - } - IChtml2 << "<a href=\""+mmodel.get_prefix()+".html\">"; - IChtml2 << "<img BORDER=0 SRC=\""+ mmodel.get_prefix()+ - ".png\"><A><p>" << endl; - - if(mmodel.get_probmap().Storage()>0&& - (mmodel.get_probmap().Ncols() == mmodel.get_data().Ncols())&& - (mmodel.get_probmap().Nrows() == mmodel.get_data().Nrows())) - {//Output probmap - tempVol.setmatrix(mmodel.get_probmap(),melodat.get_mask()); - - volume<float> map; - map = tempVol[0]; - - volume<float> newvol; - miscpic newpic; - - newpic.overlay(newvol, melodat.get_bg(), map, map, - melodat.get_bg().percentile(0.02), - melodat.get_bg().percentile(0.98), - float(0.1), float(1.0), float(0.0), float(0.0), - 0, 0); - - char instr[10000]; - - sprintf(instr," "); - strcat(instr,"-l render1 "); - strcat(instr,axials_instr.c_str()); - strcat(instr,string(report.appendDir(mmodel.get_prefix()+ - "_prob.png")).c_str()); - newpic.set_title(string("Component No. "+num2str(cnum)+ - " - Mixture Model probability map")); - - newpic.set_cbar(string("y")); - newpic.slicer(newvol, instr); - - IChtml2 << "<a href=\""+mmodel.get_prefix()+".html\">"; - IChtml2 << "<img BORDER=0 SRC=\""+ mmodel.get_prefix()+ - "_prob.png\">" << endl; - - IChtml2 << "</A><p>" << endl; - } - - RowVector dat = mmodel.get_data().Row(1); - if(dat.Maximum()>dat.Minimum()) - {//Output GGM/GMM fit - miscplot newplot; - - if(mmodel.get_type()=="GGM"){ - newplot.add_label("IC map histogram"); - newplot.add_label("full GGM fit"); - newplot.add_label("background Gaussian"); - newplot.add_label("Gamma distributions"); - newplot.gmmfit(mmodel.get_data().Row(1), - mmodel.get_means(), - mmodel.get_vars(), - mmodel.get_pi(), - report.appendDir(mmodel.get_prefix()+"_MMfit.png"), - string(mmodel.get_prefix() + - " Gaussian/Gamma Mixture Model("+num2str(mmodel.mixtures())+") fit"), - true, float(0.0), float(0.0)); - - } - else{ - newplot.add_label("IC map histogram"); - newplot.add_label("full GMM fit"); - newplot.add_label("individual Gaussians"); - newplot.gmmfit(mmodel.get_data().Row(1), - mmodel.get_means(), - mmodel.get_vars(), - mmodel.get_pi(), - report.appendDir(mmodel.get_prefix()+"_MMfit.png"), - string(mmodel.get_prefix() + - " Gaussian Mixture Model("+num2str(mmodel.mixtures())+") fit"), - false, float(0.0), float(2.0)); - - } - - // IChtml2 << "<A HREF=\"" +mmodel.get_prefix()+"_MMfit_detail.png\"> "; - IChtml2 << "<img BORDER=0 SRC=\""+ mmodel.get_prefix()+ - "_MMfit.png\"><p>" << endl; - } //GGM/GMM plot - - {//MM parameters - IChtml2 << "<br> " << mmodel.get_prefix() - << " Mixture Model fit <br>" << endl - << "<br> Means : " << mmodel.get_means() << endl - << "<br> Vars : " << mmodel.get_vars() << endl - << "<br> Prop. : " << mmodel.get_pi() << endl; - } - - { //finish IC2 page - IChtml2<< "<HR><FONT SIZE=1>This page produced automatically by " - << "<A HREF=\"http://www.fmrib.ox.ac.uk/fsl/melodic/index.html\"> MELODIC</A> Version " - << version << " - a part of <A HREF=\"http://www.fmrib.ox.ac.uk/fsl\">FSL - " - << "FMRIB Software Library</A>.</FONT></CENTER>" << endl - << "</BODY></HTML>" << endl; - } //finish IC2 page - } - } - - void MelodicReport::IC_simplerep(string prefix, int cnum, int dim){ - if( bool(opts.genreport.value()) ){ - addlink(prefix+".html",num2str(cnum)); - IChtml.setDir(report.getDir(),prefix+".html"); - - {//start IC page - - IChtml << "<HTML> " << endl - << "<TITLE>MELODIC Component " << num2str(cnum) - << "</TITLE>" << endl - << "<BODY BACKGROUND=\"file:" << getenv("FSLDIR") - << "/doc/images/fsl-bg.jpg\">" << endl - << "<hr><CENTER><H1>MELODIC Component " << num2str(cnum) - << "</H1>"<< endl; - - if(cnum>1) - IChtml << "<a href=\"" << string("IC_")+num2str(cnum-1) - <<".html\">previous</a> - "; - - IChtml << "<a href=\"00index.html\"> index </a>" ; - - if(cnum<dim) - IChtml << " - <a href=\"" << string("IC_")+num2str(cnum+1) - <<".html\">next</a><p>"; - - IChtml << "<hr><p>" << endl; - } - - volume4D<float> tempVol; - - if(melodat.get_IC().Storage()>0) - {//Output raw IC map - - tempVol.setmatrix(melodat.get_IC().Row(cnum), - melodat.get_mask()); - volume<float> map1; - volume<float> map2; - map1 = threshold(tempVol[0],float(0.0), - tempVol[0].max()); - map2 = threshold(tempVol[0],tempVol[0].min(), - float(-0.0)); - - volume<float> newvol; - miscpic newpic; - - // float map1min = (map1 + binarise(tempVol[0],tempVol[0].min(), - // float(0.0)) * map1.max()).robustmin(); - float map1max = map1.percentile(0.99); - float map2min = map2.percentile(0.01); - //float map2max = (map2 + binarise(tempVol[0],float(0.0), - // tempVol[0].max()) * map2.min()).robustmax(); - - newpic.overlay(newvol, melodat.get_bg(), map1, map2, - float(0.0), - float(0.0), - float(0.01), map1max, float(-0.01), map2min, - 0, 0); - - char instr[10000]; - - sprintf(instr," "); - strcat(instr,axials_instr.c_str()); - strcat(instr,string(report.appendDir(prefix+ - ".png")).c_str()); - newpic.set_title(string("Component No. "+num2str(cnum)+ - " - raw Z transformed IC map (1 - 99 percentile)")); - newpic.set_cbar(string("ysb")); - - newpic.slicer(newvol, instr); - } - - IChtml << "<img BORDER=0 SRC=\""+ prefix+ - ".png\"><p>" << endl; - - {//plot time course - miscplot newplot; - - if(opts.tr.value()>0.0) - newplot.timeseries(melodat.get_Tmodes(cnum-1).t(), - report.appendDir(string("t")+ - num2str(cnum)+".png"), - string("Timecourse (in seconds); TR = ")+ - float2str(opts.tr.value(),0,2,0)+" s", - opts.tr.value(),150,4,1); - else - newplot.timeseries(melodat.get_Tmodes(cnum-1).t(), - report.appendDir(string("t")+ - num2str(cnum)+".png"), - string("Timecourse (in TRs)")); - write_ascii_matrix(report.appendDir(string("t") - +num2str(cnum)+".txt"), - melodat.get_Tmodes(cnum-1)); - IChtml << "<A HREF=\"" << string("t") - +num2str(cnum)+".txt" << "\"> "; - IChtml << "<img BORDER=0 SRC=\"" - +string("t")+num2str(cnum)+".png\"></A><p>" << endl; - }//time series plot - - {//plot frequency - miscplot newplot; - int fact = int(std::pow(10.0, - int(std::log10(float(melodat.get_Tmodes(0).Nrows()))))); - - if(opts.tr.value()>0.0) - newplot.timeseries(melodat.get_fmix().Column(cnum).t(), - report.appendDir(string("f")+ - num2str(cnum)+".png"), - string("FFT of timecourse (in Hz / ") + - num2str(fact)+")", - fact/(opts.tr.value()*melodat.get_Tmodes(0).Nrows()), - 150,0,2); - else - newplot.timeseries(melodat.get_fmix().Column(cnum).t(), - report.appendDir(string("f")+ - num2str(cnum)+".png"), - string(string("FFT of timecourse (in cycles); ") - +"frequency(Hz)=cycles/(" - +num2str(melodat.get_Tmodes(0).Nrows()) - +"* TR); period(s)=(" - +num2str(melodat.get_Tmodes(0).Nrows()) - +"* TR)/cycles")); - write_ascii_matrix(report.appendDir(string("f") - +num2str(cnum)+".txt"), - melodat.get_Tmodes(cnum-1)); - IChtml << "<A HREF=\"" << string("f") - +num2str(cnum)+".txt" << "\"> "; - IChtml << "<img BORDER=0 SRC=\"" - +string("f")+num2str(cnum)+".png\"></A><p>" << endl; - }//frequency plot - - { //finish IC page - IChtml<< "<HR><FONT SIZE=1>This page produced automatically by " - << "<A HREF=\"http://www.fmrib.ox.ac.uk/fsl/melodic/index.html\"> MELODIC</A> Version " - << version << " - a part of <A HREF=\"http://www.fmrib.ox.ac.uk/fsl\">FSL - " - << "FMRIB Software Library</A>.</FONT>" << endl - << "</BODY></HTML>" << endl; - } //finish IC page - } - } - - void MelodicReport::PPCA_rep(){ - - {//plot time course - report << "<p><hr><b>PCA estimates </b> <p>" << endl; - - Matrix what; - miscplot newplot; - - what = melodat.get_EV(); - what &= melodat.get_EVP(); - - newplot.add_label("ordered Eigenvalues"); - newplot.add_label("% of expl. variance"); - - if(melodat.get_PPCA().Storage()>0){ - what = what.Columns(1,melodat.get_PPCA().Nrows()); - if(opts.allPPCA.value()&&melodat.get_PPCA().Ncols()==7){ - what &= melodat.get_PPCA().Columns(3,7).t(); - newplot.add_label("Laplace"); - newplot.add_label("BIC"); - newplot.add_label("MDL"); - newplot.add_label("RRN"); - newplot.add_label("AIC"); - }else{ - what &= melodat.get_PPCA().Column(1).t(); - newplot.add_label("dim. estimate"); - } - } - - newplot.set_Ylabel_fmt("%.2f"); - newplot.add_xlabel("Number of included components"); - newplot.set_yrange(0.0,1.02); - newplot.grid_swapdefault(); - newplot.timeseries(what, - report.appendDir("EVplot.png"), - string("Eigenspectrum Analysis"), - 0,450,4,0); - - report << "<img BORDER=0 SRC=\"EVplot.png\"><p>" << endl; - }//time series plot - } - - void MelodicReport::Smode_rep(){ - if(melodat.get_Smodes().size()>0){ - report << "<p><hr><b>TICA Subject/Session modes </b> <br>" << endl; - miscplot newplot; - report << "Boxplots show the relative response amplitudes across the " - << "session/subject domain (" << melodat.get_numfiles() - << " input files). Components have been sorted in decreasing order of " - << " the median response per component. <br><br>"; - - outMsize("Smode.at(0)", melodat.get_Smodes().at(0)); - Matrix allmodes = melodat.get_Smodes().at(0); - for(int ctr = 1; ctr < (int)melodat.get_Smodes().size();++ctr) - allmodes |= melodat.get_Smodes().at(ctr); - - outMsize("allmodes", allmodes); - newplot.add_xlabel("Component No."); - newplot.add_ylabel(""); - if(allmodes.Ncols()<100) - newplot.set_xysize(100+30*allmodes.Ncols(),300); - else - newplot.set_xysize(1200,300); - newplot.boxplot(allmodes,report.appendDir(string("bp_Smodes.png")), - string("Subject/Session modes")); - report << "<img BORDER=0 SRC=\"bp_Smodes.png\"><p>" << endl; - } - } -} -- GitLab