Skip to main content

ex_make_inverse_operator

Example of making an inverse operator.

Libraries: Inverse, FIFF I/O, Utilities

Options​

OptionDescription
--fwdMEGPath to forwad solution <file>.
--fwdEEGPath to forwad solution <file>.
--covPath to the covariance <file>.
--avePath to the evoked/average <file>.
--methodInverse estimation <method>, i.e., 'MNE', 'dSPM' or 'sLORETA'.
--snrThe SNR value used for computation <snr>.

Build and run​

cmake --build build/developer-dynamic --target ex_make_inverse_operator
./out/Release/examples/ex_make_inverse_operator --help

The default inputs come from the MNE sample dataset.

Used in the API reference​

Source​

src/examples/ex_make_inverse_operator/main.cpp
//=============================================================================================================
/**
* SPDX-License-Identifier: BSD-3-Clause
* Copyright (c) 2012-2026 MNE-CPP Authors
*
* @file main.cpp
* @author Gabriel Motta <gabrielbenmotta@gmail.com>;
* Christoph Dinh <christoph.dinh@mne-cpp.org>;
* Lorenz Esch <lorenz.esch@tu-ilmenau.de>
* @since 0.1.0
* @date July, 2012
* @brief Example of making an inverse operator
*/

//=============================================================================================================
// MNE INCLUDES
//=============================================================================================================

#include <fiff/fiff_cov.h>
#include <fiff/fiff_evoked.h>
#include <inv/inv_source_estimate.h>
#include <inv/minimum_norm/inv_minimum_norm.h>
#include <utils/generics/mne_logger.h>

#include <iostream>
#include <QCommandLineParser>
#include <QFile>

//=============================================================================================================
// QT INCLUDES
//=============================================================================================================

#include <QtCore/QCoreApplication>

//=============================================================================================================
// USED NAMESPACES
//=============================================================================================================

using namespace FIFFLIB;
using namespace MNELIB;
using namespace INVLIB;
using namespace UTILSLIB;

//=============================================================================================================
// MAIN
//=============================================================================================================

//=============================================================================================================
/**
* The function main marks the entry point of the program.
* By default, main has the storage class extern.
*
* @param[in] argc (argument count) is an integer that indicates how many arguments were entered on the command line when the program was started.
* @param[in] argv (argument vector) is an array of pointers to arrays of character objects. The array objects are null-terminated strings, representing the arguments that were entered on the command line when the program was started.
* @return the value that was set to exit() (which is 0 if exit() is called via quit()).
*/
int main(int argc, char* argv[])
{
qInstallMessageHandler(MNELogger::customLogWriter);
QCoreApplication a(argc, argv);

// Command Line Parser
QCommandLineParser parser;
parser.setApplicationDescription("Make Inverse Operator Example");
parser.addHelpOption();
QCommandLineOption fwdMEGOption("fwdMEG", "Path to forwad solution <file>.", "file", QCoreApplication::applicationDirPath() + "/../resources/data/MNE-sample-data/MEG/sample/sample_audvis-meg-eeg-oct-6-fwd.fif");
QCommandLineOption fwdEEGOption("fwdEEG", "Path to forwad solution <file>.", "file", QCoreApplication::applicationDirPath() + "/../resources/data/MNE-sample-data/MEG/sample/sample_audvis-eeg-oct-6-fwd.fif");
QCommandLineOption covFileOption("cov", "Path to the covariance <file>.", "file", QCoreApplication::applicationDirPath() + "/../resources/data/MNE-sample-data/MEG/sample/sample_audvis-cov.fif");
QCommandLineOption evokedFileOption("ave", "Path to the evoked/average <file>.", "file", QCoreApplication::applicationDirPath() + "/../resources/data/MNE-sample-data/MEG/sample/sample_audvis-ave.fif");
QCommandLineOption methodOption("method", "Inverse estimation <method>, i.e., 'MNE', 'dSPM' or 'sLORETA'.", "method", "dSPM");
QCommandLineOption snrOption("snr", "The SNR value used for computation <snr>.", "snr", "3.0"); //3.0;//0.1;//3.0;

parser.addOption(fwdMEGOption);
parser.addOption(fwdEEGOption);
parser.addOption(covFileOption);
parser.addOption(evokedFileOption);
parser.addOption(methodOption);
parser.addOption(snrOption);

parser.process(a);

QFile t_fileFwdMeeg(parser.value(fwdMEGOption));
QFile t_fileFwdEeg(parser.value(fwdEEGOption));
QFile t_fileCov(parser.value(covFileOption));
QFile t_fileEvoked(parser.value(evokedFileOption));

double snr = parser.value(snrOption).toDouble();
double lambda2 = 1.0 / pow(snr, 2);
QString method(parser.value(methodOption));

// Load data
fiff_int_t setno = 0;
QPair<float, float> baseline(-1.0f, -1.0f);
FiffEvoked evoked(t_fileEvoked, setno, baseline);
if (evoked.isEmpty())
return 1;

MNEForwardSolution t_forwardMeeg(t_fileFwdMeeg, false, true);

FiffCov noise_cov(t_fileCov);

// regularize noise covariance
noise_cov = noise_cov.regularize(evoked.info, 0.05, 0.05, 0.1, true);

// Restrict forward solution as necessary for MEG
MNEForwardSolution t_forwardMeg = t_forwardMeeg.pick_types(true, false);
// Alternatively, you can just load a forward solution that is restricted
MNEForwardSolution t_forwardEeg(t_fileFwdEeg, false, true);

// make an M/EEG, MEG-only, and EEG-only inverse operators
FiffInfo info = evoked.info;

MNEInverseOperator inverse_operator_meeg(info, t_forwardMeeg, noise_cov, 0.2f, 0.8f);
MNEInverseOperator inverse_operator_meg(info, t_forwardMeg, noise_cov, 0.2f, 0.8f);
MNEInverseOperator inverse_operator_eeg(info, t_forwardEeg, noise_cov, 0.2f, 0.8f);

// Compute inverse solution
InvMinimumNorm minimumNorm_meeg(inverse_operator_meeg, lambda2, method);
InvSourceEstimate sourceEstimate_meeg = minimumNorm_meeg.calculateInverse(evoked);

InvMinimumNorm minimumNorm_meg(inverse_operator_meg, lambda2, method);
InvSourceEstimate sourceEstimate_meg = minimumNorm_meg.calculateInverse(evoked);

InvMinimumNorm minimumNorm_eeg(inverse_operator_eeg, lambda2, method);
InvSourceEstimate sourceEstimate_eeg = minimumNorm_eeg.calculateInverse(evoked);

if (sourceEstimate_meeg.isEmpty() || sourceEstimate_meg.isEmpty() || sourceEstimate_eeg.isEmpty())
return 1;

// View activation time-series
std::cout << "\nsourceEstimate_meeg:\n"
<< sourceEstimate_meeg.data.block(0, 0, 10, 10) << std::endl;
std::cout << "time\n"
<< sourceEstimate_meeg.times.block(0, 0, 1, 10) << std::endl;

std::cout << "\nsourceEstimate_meg:\n"
<< sourceEstimate_meg.data.block(0, 0, 10, 10) << std::endl;
std::cout << "time\n"
<< sourceEstimate_meg.times.block(0, 0, 1, 10) << std::endl;

std::cout << "\nsourceEstimate_eeg:\n"
<< sourceEstimate_eeg.data.block(0, 0, 10, 10) << std::endl;
std::cout << "time\n"
<< sourceEstimate_eeg.times.block(0, 0, 1, 10) << std::endl;

return a.exec();
}