void Control3DWidget::setView3D(View3D::SPtr view3D) { //Do the connects from this control widget to the View3D ui->m_treeView_loadedData->setModel(view3D->getBrainTreeModel()); //Add the view3D to the list of connected view3D's m_lView3D.append(view3D); }
/** * 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[]) { QApplication a(argc, argv); AnnotationSet t_annotSet("./MNE-sample-data/subjects/sample/label/lh.aparc.a2009s.annot","./MNE-sample-data/subjects/sample/label/rh.aparc.a2009s.annot"); SurfaceSet t_surfSet("./MNE-sample-data/subjects/sample/surf/lh.white", "./MNE-sample-data/subjects/sample/surf/rh.white"); View3D::SPtr testWindow = View3D::SPtr(new View3D()); testWindow->addSurfaceSet("Subject01", "HemiLRSet", t_surfSet, t_annotSet); testWindow->show(); Control3DWidget::SPtr control3DWidget = Control3DWidget::SPtr(new Control3DWidget()); control3DWidget->setView3D(testWindow); control3DWidget->show(); return a.exec(); }
/** * 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[]) { QApplication a(argc, argv); QFile t_File("./MNE-sample-data/MEG/sample/sample_audvis-meg-eeg-oct-6-fwd.fif"); MNEForwardSolution t_forwardSolution(t_File); View3D::SPtr testWindow = View3D::SPtr(new View3D()); //Option 1 - Visualize full source space testWindow->addBrainData("Subject01", "ForwardSolution", t_forwardSolution); //Option 2 - Visualize clustered source space // AnnotationSet t_annotationSet ("sample", 2, "aparc.a2009s", "./MNE-sample-data/subjects"); // MNEForwardSolution t_clusteredFwd = t_forwardSolution.cluster_forward_solution(t_annotationSet, 40); // testWindow->addBrainData("Subject01", "ForwardSolution", t_clusteredFwd); testWindow->show(); Control3DWidget::SPtr control3DWidget = Control3DWidget::SPtr(new Control3DWidget()); control3DWidget->setView3D(testWindow); control3DWidget->show(); return a.exec(); }
/** * 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[]) { QApplication app(argc, argv); // Command Line Parser QCommandLineParser parser; parser.setApplicationDescription("Compute Inverse Powell RAP-MUSIC Example"); parser.addHelpOption(); QCommandLineOption fwdFileOption("fwd", "Path to forward solution <file>.", "file", "./MNE-sample-data/MEG/sample/sample_audvis-meg-eeg-oct-6-fwd.fif"); QCommandLineOption evokedFileOption("ave", "Path to evoked <file>.", "file", "./MNE-sample-data/MEG/sample/sample_audvis-ave.fif"); QCommandLineOption subjectDirectoryOption("subjDir", "Path to subject <directory>.", "directory", "./MNE-sample-data/subjects"); QCommandLineOption subjectOption("subj", "Selected <subject>.", "subject", "sample"); QCommandLineOption stcFileOption("stcOut", "Path to stc <file>, which is to be written.", "file", "");//"RapMusic.stc"); QCommandLineOption numDipolePairsOption("numDip", "<number> of dipole pairs to localize.", "number", "1"); QCommandLineOption doMovieOption("doMovie", "Create overlapping movie.", "doMovie", "false"); QCommandLineOption annotOption("annotType", "Annotation type <type>.", "type", "aparc.a2009s"); QCommandLineOption surfOption("surfType", "Surface type <type>.", "type", "orig"); parser.addOption(fwdFileOption); parser.addOption(evokedFileOption); parser.addOption(subjectDirectoryOption); parser.addOption(subjectOption); parser.addOption(stcFileOption); parser.addOption(numDipolePairsOption); parser.addOption(doMovieOption); parser.addOption(annotOption); parser.addOption(surfOption); parser.process(app); // Parse command line parameters QFile t_fileFwd(parser.value(fwdFileOption)); QFile t_fileEvoked(parser.value(evokedFileOption)); QString subject(parser.value(subjectOption)); QString subjectDir(parser.value(subjectDirectoryOption)); AnnotationSet t_annotationSet(subject, 2, parser.value(annotOption), subjectDir); SurfaceSet t_surfSet(subject, 2, parser.value(surfOption), subjectDir); QString t_sFileNameStc(parser.value(stcFileOption)); qint32 numDipolePairs = parser.value(numDipolePairsOption).toInt(); bool doMovie = false; if(parser.value(doMovieOption) == "false" || parser.value(doMovieOption) == "0") { doMovie = false; } else if(parser.value(doMovieOption) == "true" || parser.value(doMovieOption) == "1") { doMovie = true; } qDebug() << "Start calculation with stc:" << t_sFileNameStc; // Load data fiff_int_t setno = 0; QPair<QVariant, QVariant> baseline(QVariant(), 0); FiffEvoked evoked(t_fileEvoked, setno, baseline); if(evoked.isEmpty()) return 1; std::cout << "evoked first " << evoked.first << "; last " << evoked.last << std::endl; MNEForwardSolution t_Fwd(t_fileFwd); if(t_Fwd.isEmpty()) return 1; QStringList ch_sel_names = t_Fwd.info.ch_names; FiffEvoked pickedEvoked = evoked.pick_channels(ch_sel_names); // // Cluster forward solution; // MNEForwardSolution t_clusteredFwd = t_Fwd.cluster_forward_solution(t_annotationSet, 20);//40); // std::cout << "Size " << t_clusteredFwd.sol->data.rows() << " x " << t_clusteredFwd.sol->data.cols() << std::endl; // std::cout << "Clustered Fwd:\n" << t_clusteredFwd.sol->data.row(0) << std::endl; PwlRapMusic t_pwlRapMusic(t_clusteredFwd, false, numDipolePairs); int iWinSize = 200; if(doMovie) { t_pwlRapMusic.setStcAttr(iWinSize, 0.6); } MNESourceEstimate sourceEstimate = t_pwlRapMusic.calculateInverse(pickedEvoked); if(doMovie) { //Select only the activations once MatrixXd dataPicked(sourceEstimate.data.rows(), int(std::floor(sourceEstimate.data.cols()/iWinSize))); for(int i = 0; i < dataPicked.cols(); ++i) { dataPicked.col(i) = sourceEstimate.data.col(i*iWinSize); } sourceEstimate.data = dataPicked; } std::cout << "source estimated" << std::endl; if(sourceEstimate.isEmpty()) return 1; View3D::SPtr testWindow = View3D::SPtr(new View3D()); Data3DTreeModel::SPtr p3DDataModel = Data3DTreeModel::SPtr(new Data3DTreeModel()); testWindow->setModel(p3DDataModel); p3DDataModel->addSurfaceSet(parser.value(subjectOption), "HemiLRSet", t_surfSet, t_annotationSet); QList<BrainRTSourceLocDataTreeItem*> rtItemList = p3DDataModel->addSourceData(parser.value(subjectOption), "HemiLRSet", sourceEstimate, t_clusteredFwd); //Init some rt related values for right visual data for(int i = 0; i < rtItemList.size(); ++i) { rtItemList.at(i)->setLoopState(true); rtItemList.at(i)->setTimeInterval(17); rtItemList.at(i)->setNumberAverages(1); rtItemList.at(i)->setStreamingActive(true); rtItemList.at(i)->setNormalization(QVector3D(0.01,0.5,1.0)); rtItemList.at(i)->setVisualizationType("Annotation based"); rtItemList.at(i)->setColortable("Hot"); } testWindow->show(); Control3DWidget::SPtr control3DWidget = Control3DWidget::SPtr(new Control3DWidget()); control3DWidget->init(p3DDataModel, testWindow); control3DWidget->show(); if(!t_sFileNameStc.isEmpty()) { QFile t_fileClusteredStc(t_sFileNameStc); sourceEstimate.write(t_fileClusteredStc); } return app.exec(); }
/** * 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[]) { QApplication a(argc, argv); //############################# Data location and configs - Change if necessary ############################################ //source localization type QString method("MNE"); //"MNE" | "dSPM" | "sLORETA" //Choose which epoch to take - i.e. for every 4th epoch set to 4 int averageIterator = 1; bool doRawTrialLocalization = false; //measurement data location (data location must always has same directory structure - see dropbox folder for more information) //QString data_location("D:/Dropbox/Masterarbeit DB/Messdaten/EEG/2013_12_05_Lorenz_Esch_001"); //QString data_location("D:/Dropbox/Masterarbeit DB/Messdaten/EEG/2014_01_10_Lorenz_Esch_002"); //QString data_location("D:/Dropbox/Masterarbeit DB/Messdaten/EEG/2014_01_14_Lorenz_Esch_003"); //QString data_location("D:/Dropbox/Masterarbeit DB/Messdaten/EEG/2014_01_28_Lorenz_Esch_004"); //QString data_location("D:/Dropbox/Masterarbeit DB/Messdaten/EEG/2014_02_04_Lorenz_Esch_005"); //QString data_location("D:/Dropbox/Masterarbeit DB/Messdaten/EEG/2014_02_05_Uwe_Graichen_006"); QString data_location("D:/Dropbox/Masterarbeit DB/Messdaten/EEG/2014_02_07_Lorenz_Esch_007"); //QString data_location("D:/Dropbox/Masterarbeit DB/Messdaten/EEG/2014_02_24_Lorenz_Esch_008"); //QString data_location("D:/Dropbox/Masterarbeit DB/Messdaten/EEG/2014_02_25_Christoph_Dinh_009"); //QString data_location("D:/Dropbox/Masterarbeit DB/Messdaten/EEG/2014_03_17_Lorenz_Esch_010"); //Forward solution //QFile t_fileFwd("D:/Dropbox/Masterarbeit DB/Messdaten/Forward solutions/Lorenz-131212-Duke128-fwd.fif"); //QFile t_fileFwd("D:/Dropbox/Masterarbeit DB/Messdaten/Forward solutions/Lorenz-140112-Duke128-fwd.fif"); //QFile t_fileFwd("D:/Dropbox/Masterarbeit DB/Messdaten/Forward solutions/Lorenz-140114-Duke128-fwd.fif"); //QFile t_fileFwd("D:/Dropbox/Masterarbeit DB/Messdaten/Forward solutions/Lorenz-140123-Duke128-fwd.fif"); QFile t_fileFwd("D:/Dropbox/Masterarbeit DB/Messdaten/Forward solutions/Lorenz-140128-Duke128-fwd.fif"); //Surface generated by freesurfer SurfaceSet t_surfSet("D:/Dropbox/Masterarbeit DB/Messdaten/Forward solutions/surface/lh.white", "D:/Dropbox/Masterarbeit DB/Messdaten/Forward solutions/surface/rh.white"); //AnnotationSet (See Destrieux paper) AnnotationSet t_annotationSet("D:/Dropbox/Masterarbeit DB/Messdaten/Forward solutions/atlas/lh.aparc.a2009s.annot", "D:/Dropbox/Masterarbeit DB/Messdaten/Forward solutions/atlas/rh.aparc.a2009s.annot"); //////////////////////////////////////////// Interesting start //////////////////////////////////////////////////////////////////// //********************************** Involuntary Tapping ***********************************// //time read around events - note: trigger point is the pressing of the button, not the atual // float tmin = -2.0f; // float tmax = 2.0f; // //Filtered 7-14Hz left tapping // QString t_sRawFileNameRel ("/Processed/filtered/EEG_data_001_involuntary_left_tapping_filtered_7_14_raw.fif"); // QString t_sCovFileNameRel ("/Processed/covariance/EEG_data_001_base_filtered_7_14_raw-cov.fif"); // QString t_sEventFileNameRel("/Processed/events/EEG_data_001_involuntary_left_tapping_131_raw-eve.fif"); // QString t_sStcFileNameRel ("/Processed/stc/SourceLoc_involuntary_left_tapping_filtered_7_14_Averaged_"); // QString t_sAvrFileNameRel ("/Processed/averaged/EEG_data_001_involuntary_left_tapping_filtered_7_14_Averaged_"); // //Filtered 7-14Hz right tapping // QString t_sRawFileNameRel ("/Processed/filtered/EEG_data_001_involuntary_right_tapping_filtered_7_14_raw.fif"); // QString t_sCovFileNameRel ("/Processed/covariance/EEEG_data_001_base_filtered_7_14_raw-cov.fif"); // QString t_sEventFileNameRel("/Processed/events/EEG_data_001_involuntary_right_tapping_136_raw-eve.fif"); // QString t_sStcFileNameRel ("/Processed/stc/SourceLoc_involuntary_right_tapping_filtered_7_14_Averaged_"); // QString t_sAvrFileNameRel ("/Processed/averaged/EEG_data_001_involuntary_right_tapping_filtered_7_14_Averaged_"); // //Filtered 0.7-40Hz left tapping // QString t_sRawFileNameRel ("/Processed/filtered/EEG_data_001_involuntary_left_tapping_filtered_07_40_raw.fif"); // QString t_sCovFileNameRel ("/Processed/covariance/EEG_data_001_base_filtered_07_40_raw-cov.fif"); // QString t_sEventFileNameRel("/Processed/events/EEG_data_001_involuntary_left_tapping_131_raw-eve.fif"); // QString t_sStcFileNameRel ("/Processed/stc/SourceLoc_involuntary_left_tapping_filtered_07_40_Averaged_"); // QString t_sAvrFileNameRel ("/Processed/averaged/EEG_data_001_involuntary_left_tapping_filtered_07_40_Averaged_"); // //Filtered 0.7-40Hz right tapping // QString t_sRawFileNameRel ("/Processed/filtered/EEG_data_001_involuntary_right_tapping_filtered_07_40_raw.fif"); // QString t_sCovFileNameRel ("/Processed/covariance/EEG_data_001_base_filtered_07_40_raw-cov.fif"); // QString t_sEventFileNameRel("/Processed/events/EEG_data_001_involuntary_right_tapping_136_raw-eve.fif"); // QString t_sStcFileNameRel ("/Processed/stc/SourceLoc_involuntary_right_tapping_filtered_07_40_Averaged_"); // QString t_sAvrFileNameRel ("/Processed/averaged/EEG_data_001_involuntary_right_tapping_filtered_07_40_Averaged_"); //////////////////////////////////////////// Interesting end //////////////////////////////////////////////////////////////////// //********************************** Voluntary Tapping ***********************************// // //time read around events - note: trigger point is the pressing of the button, not the atual // float tmin = -1.0f; // float tmax = 1.0f; // //Original left tapping - no filtering DC still present // QString t_sRawFileNameRel ("/Original/EEG_data_001_right_tapping_raw.fif"); // QString t_sCovFileNameRel ("/Processed/covariance/EEG_data_001_base_raw-cov.fif"); // QString t_sEventFileNameRel("/Processed/events/EEG_data_001_right_tapping_raw-eve.fif"); // QString t_sStcFileNameRel ("/Processed/stc/SourceLoc_right_tapping_Averaged_"); // QString t_sAvrFileNameRel ("/Processed/averaged/EEG_data_001_right_tapping_Averaged_"); // //Filtered 0.6-40Hz left tapping // QString t_sRawFileNameRel ("/Processed/filtered/EEG_data_001_left_tapping_filtered_06_40_raw.fif"); // QString t_sCovFileNameRel ("/Processed/covariance/EEG_data_001_left_tapping_filtered_06_40_raw-cov.fif"); // QString t_sEventFileNameRel("/Processed/events/EEG_data_001_left_tapping_raw-eve.fif"); // QString t_sStcFileNameRel ("/Processed/stc/SourceLoc_left_tapping_filtered_06_40_Averaged_"); // QString t_sAvrFileNameRel ("/Processed/averaged/EEG_data_001_left_tapping_filtered_06_40_Averaged_"); // //Filtered 0.6-40Hz right tapping // QString t_sRawFileNameRel ("/Processed/filtered/EEG_data_001_right_tapping_filtered_06_40_raw.fif"); // QString t_sCovFileNameRel ("/Processed/covariance/EEG_data_001_right_tapping_filtered_06_40_raw-cov.fif"); // QString t_sEventFileNameRel("/Processed/events/EEG_data_001_right_tapping_raw-eve.fif"); // QString t_sStcFileNameRel ("/Processed/stc/SourceLoc_right_tapping_filtered_06_40_Averaged_"); // QString t_sAvrFileNameRel ("/Processed/averaged/EEG_data_001_right_tapping_filtered_06_40_Averaged_"); // //Filtered 7-14Hz left tapping // QString t_sRawFileNameRel ("/Processed/filtered/EEG_data_002_voluntary_left_tapping_filtered_7_14_raw.fif"); // QString t_sCovFileNameRel ("/Processed/covariance/EEG_data_voluntary_tapping_base_filtered_7_14_raw-cov.fif"); // QString t_sEventFileNameRel("/Processed/events/EEG_data_002_voluntary_left_tapping_artefact_reduction_-1_1_0.002_71_raw-eve.fif"); // QString t_sStcFileNameRel ("/Processed/stc/SourceLoc_voluntary_left_tapping_filtered_7_14_Averaged_"); // QString t_sAvrFileNameRel ("/Processed/averaged/EEG_data_002_voluntary_left_tapping_filtered_7_14_Averaged_"); // //Filtered 7-14Hz right tapping // QString t_sRawFileNameRel ("/Processed/filtered/EEG_data_002_voluntary_right_tapping_filtered_7_14_raw.fif"); // QString t_sCovFileNameRel ("/Processed/covariance/EEG_data_voluntary_tapping_base_filtered_7_14_raw-cov.fif"); // QString t_sEventFileNameRel("/Processed/events/EEG_data_002_voluntary_right_tapping_artefact_reduction_-1_1_0.003_69_raw-eve.fif"); // QString t_sStcFileNameRel ("/Processed/stc/SourceLoc_voluntary_right_tapping_filtered_7_14_Averaged_"); // QString t_sAvrFileNameRel ("/Processed/averaged/EEG_data_002_voluntary_right_tapping_filtered_7_14_Averaged_"); // //Filtered 0.7-40Hz left tapping // QString t_sRawFileNameRel ("/Processed/filtered/EEG_data_002_voluntary_left_tapping_filtered_07_40_raw.fif"); // QString t_sCovFileNameRel ("/Processed/covariance/EEG_data_voluntary_tapping_base_filtered_07_40_raw-cov.fif"); // QString t_sEventFileNameRel("/Processed/events/EEG_data_002_voluntary_left_tapping_222_raw-eve.fif"); // QString t_sStcFileNameRel ("/Processed/stc/SourceLoc_voluntary_left_tapping_filtered_07_40_Averaged_"); // QString t_sAvrFileNameRel ("/Processed/averaged/EEG_data_002_voluntary_left_tapping_filtered_07_40_Averaged_"); // //Filtered 0.7-40Hz right tapping // QString t_sRawFileNameRel ("/Processed/filtered/EEG_data_002_voluntary_right_tapping_filtered_07_40_raw.fif"); // QString t_sCovFileNameRel ("/Processed/covariance/EEG_data_voluntary_tapping_base_filtered_07_40_raw-cov.fif"); // QString t_sEventFileNameRel("/Processed/events/EEG_data_002_voluntary_right_tapping_184_raw-eve.fif"); // QString t_sStcFileNameRel ("/Processed/stc/SourceLoc_voluntary_right_tapping_filtered_07_40_Averaged_"); // QString t_sAvrFileNameRel ("/Processed/averaged/EEG_data_002_voluntary_right_tapping_filtered_07_40_Averaged_"); //********************************** Medianus stimulation **********************************// // //time read around events - note: trigger point is the pressing of the button, not the atual // float tmin = -1.0f; // float tmax = 1.0f; // //Original left medianus stimulation - no filtering DC still present // QString t_sRawFileNameRel ("/Original/EEG_data_002_medianus_left_raw.fif"); // QString t_sCovFileNameRel ("/Processed/covariance/EEG_data_medianus_base_raw-cov.fif"); // QString t_sEventFileNameRel("/Processed/events/EEG_data_002_medianus_left_240_raw-eve.fif"); // QString t_sStcFileNameRel ("/Processed/stc/SourceLoc_medianus_left_Averaged_"); // QString t_sAvrFileNameRel ("/Processed/averaged/EEG_data_002_medianus_left_Averaged_"); // //Original right medianus stimulation - no filtering DC still present // QString t_sRawFileNameRel ("/Original/EEG_data_002_medianus_right_raw.fif"); // QString t_sCovFileNameRel ("/Processed/covariance/EEG_data_medianus_base_raw-cov.fif"); // QString t_sEventFileNameRel("/Processed/events/EEG_data_002_medianus_right_295_raw-eve.fif"); // QString t_sStcFileNameRel ("/Processed/stc/SourceLoc_medianus_right_Averaged_"); // QString t_sAvrFileNameRel ("/Processed/averaged/EEG_data_002_medianus_right_Averaged_"); // //Filtered 0.7-40Hz left medianus stimulation // QString t_sRawFileNameRel ("/Processed/filtered/EEG_data_002_medianus_left_filtered_07_40_raw.fif"); // QString t_sCovFileNameRel ("/Processed/covariance/EEG_data_medianus_base_filtered_07_40_raw-cov.fif"); // QString t_sEventFileNameRel("/Processed/events/EEG_data_002_medianus_left_artefact_reduction_-1_1_0.002_80_raw-eve.fif"); // ("EEG_data_002_medianus_left_raw-eve") // QString t_sStcFileNameRel ("/Processed/stc/SourceLoc_medianus_left_filtered_07_40_Averaged_"); // QString t_sAvrFileNameRel ("/Processed/averaged/EEG_data_002_medianus_left_filtered_07_40_Averaged_"); // //Filtered 0.7-40Hz right medianus stimulation // QString t_sRawFileNameRel ("/Processed/filtered/EEG_data_002_medianus_right_filtered_07_40_raw.fif"); // QString t_sCovFileNameRel ("/Processed/covariance/EEG_data_medianus_base_filtered_07_40_raw-cov.fif"); // QString t_sEventFileNameRel("/Processed/events/EEG_data_002_medianus_right_artefact_reduction_-1_1_0.0025_93_raw-eve.fif"); // ("EEG_data_002_medianus_right_raw-eve") // QString t_sStcFileNameRel ("/Processed/stc/SourceLoc_medianus_right_filtered_07_40_Averaged_"); // QString t_sAvrFileNameRel ("/Processed/averaged/EEG_data_002_medianus_right_filtered_07_40_Averaged_"); // //Filtered 7-14Hz left medianus stimulation // QString t_sRawFileNameRel ("/Processed/filtered/EEG_data_002_medianus_left_filtered_7_14_raw.fif"); // QString t_sCovFileNameRel ("/Processed/covariance/EEG_data_medianus_base_filtered_7_14_raw-cov.fif"); // QString t_sEventFileNameRel("/Processed/events/EEG_data_002_medianus_left_artefact_reduction_-1_1_0.002_80_raw-eve.fif"); // QString t_sStcFileNameRel ("/Processed/stc/SourceLoc_medianus_left_filtered_7_14_Averaged_"); // QString t_sAvrFileNameRel ("/Processed/averaged/EEG_data_002_medianus_left_filtered_7_14_Averaged_"); // //Filtered 7-14Hz right medianus stimulation // QString t_sRawFileNameRel ("/Processed/filtered/EEG_data_002_medianus_right_filtered_7_14_raw.fif"); // QString t_sCovFileNameRel ("/Processed/covariance/EEG_data_medianus_base_filtered_7_14_raw-cov.fif"); // QString t_sEventFileNameRel("/Processed/events/EEG_data_002_medianus_right_artefact_reduction_-1_1_0.0025_93_raw-eve.fif"); // QString t_sStcFileNameRel ("/Processed/stc/SourceLoc_medianus_right_filtered_7_14_Averaged_"); // QString t_sAvrFileNameRel ("/Processed/averaged/EEG_data_002_medianus_right_filtered_7_14_Averaged_"); //*************************** Voluntary opposing finger movement **************************// // //time read around events - note: trigger point is the pressing of the button, not the atual // float tmin = -0.3f; // float tmax = 0.1f; // //Original left opposing finger movement - no filtering DC still present // QString t_sRawFileNameRel ("/Original/EEG_data_001_voluntary_left_opposing_raw.fif"); // QString t_sCovFileNameRel ("/Processed/covariance/EEG_data_voluntary_base_raw-cov.fif"); // QString t_sEventFileNameRel("/Processed/events/EEG_data_001_voluntary_left_opposing_89_raw-eve.fif"); // QString t_sStcFileNameRel ("/Processed/stc/SourceLoc_voluntary_left_Averaged_"); // QString t_sAvrFileNameRel ("/Processed/averaged/EEG_data_001_voluntary_left_Averaged_"); // //Original right opposing finger movement - no filtering DC still present // QString t_sRawFileNameRel ("/Original/EEG_data_001_voluntary_right_opposing_raw.fif"); // QString t_sCovFileNameRel ("/Processed/covariance/EEG_data_voluntary_base_raw-cov.fif"); // QString t_sEventFileNameRel("/Processed/events/EEG_data_001_voluntary_right_opposing_90_raw-eve.fif"); // QString t_sStcFileNameRel ("/Processed/stc/SourceLoc_voluntary_right_Averaged_"); // QString t_sAvrFileNameRel ("/Processed/averaged/EEG_data_001_voluntary_right_Averaged_"); // //Filtered 7-14Hz left voluntary finger opposing // QString t_sRawFileNameRel ("/Processed/filtered/EEG_data_001_voluntary_left_opposing_filtered_7_14_raw.fif"); // QString t_sCovFileNameRel ("/Processed/covariance/EEG_data_voluntary_opposing_base_filtered_7_14_raw-cov.fif"); // QString t_sEventFileNameRel("/Processed/events/EEG_data_001_voluntary_left_opposing_154_raw-eve.fif"); // QString t_sStcFileNameRel ("/Processed/stc/SourceLoc_voluntary_left_opposing_filtered_7_14_Averaged_"); // QString t_sAvrFileNameRel ("/Processed/averaged/EEG_data_001_voluntary_left_opposing_filtered_7_14_Averaged_"); // //Filtered 7-14Hz right voluntary finger opposing // QString t_sRawFileNameRel ("/Processed/filtered/EEG_data_001_voluntary_right_opposing_filtered_7_14_raw.fif"); // QString t_sCovFileNameRel ("/Processed/covariance/EEG_data_voluntary_opposing_base_filtered_7_14_raw-cov.fif"); // QString t_sEventFileNameRel("/Processed/events/EEG_data_001_voluntary_right_opposing_135_raw-eve.fif"); // QString t_sStcFileNameRel ("/Processed/stc/SourceLoc_voluntary_right_opposing_filtered_7_14_Averaged_"); // QString t_sAvrFileNameRel ("/Processed/averaged/EEG_data_001_voluntary_right_opposing_filtered_7_14_Averaged_"); // //Filtered 0.7-40Hz left voluntary finger opposing // QString t_sRawFileNameRel ("/Processed/filtered/EEG_data_001_voluntary_left_opposing_filtered_07_40_raw.fif"); // QString t_sCovFileNameRel ("/Processed/covariance/EEG_data_voluntary_opposing_base_filtered_07_40_raw-cov.fif"); // QString t_sEventFileNameRel("/Processed/events/EEG_data_001_voluntary_left_opposing_137_raw-eve.fif"); // QString t_sStcFileNameRel ("/Processed/stc/SourceLoc_voluntary_left_opposing_filtered_07_40_Averaged_"); // QString t_sAvrFileNameRel ("/Processed/averaged/EEG_data_001_voluntary_left_opposing_filtered_07_40_Averaged_"); // //Filtered 0.7-40Hz right voluntary finger opposing // QString t_sRawFileNameRel ("/Processed/filtered/EEG_data_001_voluntary_right_opposing_filtered_07_40_raw.fif"); // QString t_sCovFileNameRel ("/Processed/covariance/EEG_data_voluntary_opposing_base_filtered_07_40_raw-cov.fif"); // QString t_sEventFileNameRel("/Processed/events/EEG_data_001_voluntary_right_opposing_135_raw-eve.fif"); // QString t_sStcFileNameRel ("/Processed/stc/SourceLoc_voluntary_right_opposing_filtered_07_40_Averaged_"); // QString t_sAvrFileNameRel ("/Processed/averaged/EEG_data_001_voluntary_right_opposing_filtered_07_40_Averaged_"); //*************************** Involuntary opposing finger movement **************************// //time read around events - note: trigger point is the pressing of the button float tmin = -1.0f; float tmax = 1.0f; // //Filtered 7-14Hz left involuntary finger opposing // QString t_sRawFileNameRel ("/Processed/filtered/EEG_data_001_involuntary_left_opposing_filtered_7_14_raw.fif"); // QString t_sCovFileNameRel ("/Processed/covariance/EEG_data_001_base_filtered_7_14_raw-cov.fif"); // QString t_sEventFileNameRel("/Processed/events/EEG_data_001_involuntary_left_opposing_137_raw-eve.fif"); // QString t_sStcFileNameRel ("/Processed/stc/SourceLoc_involuntary_left_opposing_filtered_7_14_Averaged_"); // QString t_sAvrFileNameRel ("/Processed/averaged/EEG_data_001_involuntary_left_opposing_filtered_7_14_Averaged_"); // //Filtered 7-14Hz right involuntary finger opposing // QString t_sRawFileNameRel ("/Processed/filtered/EEG_data_001_involuntary_right_opposing_filtered_7_14_raw.fif"); // QString t_sCovFileNameRel ("/Processed/covariance/EEG_data_001_base_filtered_7_14_raw-cov.fif"); // QString t_sEventFileNameRel("/Processed/events/EEG_data_001_involuntary_right_opposing_150_raw-eve.fif"); // QString t_sStcFileNameRel ("/Processed/stc/SourceLoc_involuntary_right_opposing_filtered_7_14_Averaged_"); // QString t_sAvrFileNameRel ("/Processed/averaged/EEG_data_001_involuntary_right_opposing_filtered_7_14_Averaged_"); // //Filtered 0.7-40Hz left involuntary finger opposing // QString t_sRawFileNameRel ("/Processed/filtered/EEG_data_001_involuntary_left_opposing_filtered_07_40_raw.fif"); // QString t_sCovFileNameRel ("/Processed/covariance/EEG_data_001_base_filtered_07_40_raw-cov.fif"); // QString t_sEventFileNameRel("/Processed/events/EEG_data_001_involuntary_left_opposing_137_raw-eve.fif"); // QString t_sStcFileNameRel ("/Processed/stc/SourceLoc_involuntary_left_opposing_filtered_07_40_Averaged_"); // QString t_sAvrFileNameRel ("/Processed/averaged/EEG_data_001_involuntary_left_opposing_filtered_07_40_Averaged_"); //Filtered 0.7-40Hz right involuntary finger opposing QString t_sRawFileNameRel ("/Processed/filtered/EEG_data_001_involuntary_right_opposing_filtered_07_40_raw.fif"); QString t_sCovFileNameRel ("/Processed/covariance/EEG_data_001_base_filtered_07_40_raw-cov.fif"); QString t_sEventFileNameRel("/Processed/events/EEG_data_001_involuntary_right_opposing_150_raw-eve.fif"); QString t_sStcFileNameRel ("/Processed/stc/SourceLoc_involuntary_right_opposing_filtered_07_40_Averaged_"); QString t_sAvrFileNameRel ("/Processed/averaged/EEG_data_001_involuntary_right_opposing_filtered_07_40_Averaged_"); //*************************** Motor imagery **************************// // //time read around events - note: trigger point is the pressing of the button, not the atual // float tmin = -1.0f; // float tmax = 6.0f; // //Filtered 7-14Hz left MI // QString t_sRawFileNameRel ("/Processed/filtered/EEG_data_002_left_MI_filtered_7_14_raw.fif"); // QString t_sCovFileNameRel ("/Processed/covariance/EEG_data_002_base_filtered_7_14_raw-cov.fif"); // QString t_sEventFileNameRel("/Processed/events/EEG_data_002_left_MI_filtered_100_raw-eve.fif"); // QString t_sStcFileNameRel ("/Processed/stc/SourceLoc_left_MI_filtered_7_14_Averaged_"); // QString t_sAvrFileNameRel ("/Processed/averaged/EEG_data_002_left_MI_filtered_7_14_Averaged_"); // //Filtered 7-14Hz right MI // QString t_sRawFileNameRel ("/Processed/filtered/EEG_data_002_right_MI_filtered_7_14_raw.fif"); // QString t_sCovFileNameRel ("/Processed/covariance/EEG_data_002_base_filtered_7_14_raw-cov.fif"); // QString t_sEventFileNameRel("/Processed/events/EEG_data_002_right_MI_filtered_105_raw-eve.fif"); // QString t_sStcFileNameRel ("/Processed/stc/SourceLoc_right_MI_filtered_7_14_Averaged_"); // QString t_sAvrFileNameRel ("/Processed/averaged/EEG_data_002_right_MI_filtered_7_14_Averaged_"); // //Filtered 0.7-40Hz left MI // QString t_sRawFileNameRel ("/Processed/filtered/EEG_data_002_left_MI_filtered_07_40_raw.fif"); // QString t_sCovFileNameRel ("/Processed/covariance/EEG_data_002_base_filtered_07_40_raw-cov.fif"); // QString t_sEventFileNameRel("/Processed/events/EEG_data_002_left_MI_filtered_100_raw-eve.fif"); // QString t_sStcFileNameRel ("/Processed/stc/SourceLoc_left_MI_filtered_07_40_Averaged_"); // QString t_sAvrFileNameRel ("/Processed/averaged/EEG_data_002_left_MI_filtered_07_40_Averaged_"); // //Filtered 0.7-40Hz right MI // QString t_sRawFileNameRel ("/Processed/filtered/EEG_data_002_right_MI_filtered_07_40_raw.fif"); // QString t_sCovFileNameRel ("/Processed/covariance/EEG_data_002_base_filtered_07_40_raw-cov.fif"); // QString t_sEventFileNameRel("/Processed/events/EEG_data_002_right_MI_filtered_105_raw-eve.fif"); // QString t_sStcFileNameRel ("/Processed/stc/SourceLoc_right_MI_filtered_07_40_Averaged_"); // QString t_sAvrFileNameRel ("/Processed/averaged/EEG_data_002_right_MI_filtered_07_40_Averaged_"); //*************************** BCI lefti right in one file finger tapping **************************// // //time read around events - note: trigger point is the pressing of the button, not the atual // float tmin = -1.0f; // float tmax = 1.0f; // //Filtered 7-14Hz left MI // QString t_sRawFileNameRel ("/Original/EEG_data_001_voluntary_left_right_tapping_raw.fif"); // QString t_sCovFileNameRel ("/Processed/covariance/EEG_data_002_base_filtered_7_14_raw-cov.fif"); // QString t_sEventFileNameRel("/Processed/events/EEG_data_001_voluntary_left_right_tapping_234_raw-eve.fif"); // QString t_sStcFileNameRel ("/Processed/stc/SourceLoc_left_MI_filtered_7_14_Averaged_"); // QString t_sAvrFileNameRel ("/Processed/averaged/EEG_data_001_voluntary_right_tapping_raw_Averaged_"); //########################################################################################################################## //Create final location dirs and files QFile t_fileRaw(t_sRawFileNameRel.prepend(data_location)); QFile t_fileCov(t_sCovFileNameRel.prepend(data_location)); QString t_sEventName = t_sEventFileNameRel.prepend(data_location); qint32 event = 1; //254-right trigger | 253-left trigger | 252-beep | 1-old eventfile value for trigger qint32 k, p; fiff_int_t dest_comp = 0; bool keep_comp = false; bool pick_all = false; // // Setup for reading the raw data // FiffRawData raw(t_fileRaw); RowVectorXi picks; if (pick_all) { // // Pick all // picks.resize(raw.info.nchan); for(k = 0; k < raw.info.nchan; ++k) picks(k) = k; // } else { QStringList include; //include << "STI 014"; bool want_meg = false; bool want_eeg = true; bool want_stim = false; picks = raw.info.pick_types(want_meg, want_eeg, want_stim, include, raw.info.bads);//prefer member function } QStringList ch_names; for(k = 0; k < picks.cols(); ++k) ch_names << raw.info.ch_names[picks(0,k)]; // // Set up projection // if (raw.info.projs.size() == 0) printf("No projector specified for these data\n"); else { // // Activate the projection items // for (k = 0; k < raw.info.projs.size(); ++k) raw.info.projs[k].active = true; printf("%d projection items activated\n",raw.info.projs.size()); // // Create the projector // fiff_int_t nproj = raw.info.make_projector(raw.proj); if (nproj == 0) { printf("The projection vectors do not apply to these channels\n"); } else { printf("Created an SSP operator (subspace dimension = %d)\n",nproj); } } // // Set up the CTF compensator // qint32 current_comp = raw.info.get_current_comp(); if (current_comp > 0) printf("Current compensation grade : %d\n",current_comp); if (keep_comp) dest_comp = current_comp; if (current_comp != dest_comp) { qDebug() << "This part needs to be debugged"; if(MNE::make_compensator(raw.info, current_comp, dest_comp, raw.comp)) { raw.info.set_current_comp(dest_comp); printf("Appropriate compensator added to change to grade %d.\n",dest_comp); } else { printf("Could not make the compensator\n"); return 0; } } // // Read the events // QFile t_EventFile; MatrixXi events; if (t_sEventName.size() == 0) { p = t_fileRaw.fileName().indexOf(".fif"); if (p > 0) { t_sEventName = t_fileRaw.fileName().replace(p, 4, "-eve.fif"); } else { printf("Raw file name does not end properly\n"); return 0; } t_EventFile.setFileName(t_sEventName); MNE::read_events(t_EventFile, events); printf("Events read from %s\n",t_sEventName.toUtf8().constData()); } else { // // Binary file // p = t_fileRaw.fileName().indexOf(".fif"); if (p > 0) { t_EventFile.setFileName(t_sEventName); if(!MNE::read_events(t_EventFile, events)) { printf("Error while read events.\n"); return 0; } printf("Binary event file %s read\n",t_sEventName.toUtf8().constData()); } else { // // Text file // printf("Text file %s is not supported jet.\n",t_sEventName.toUtf8().constData()); } } // // Select the desired events // qint32 count = 0; MatrixXi selected = MatrixXi::Zero(1, events.rows()); for (p = 0; p < events.rows(); ++p) { if (events(p,1) == 0 && events(p,2) == event) { selected(0,count) = p; ++count; } } selected.conservativeResize(1, count); if (count > 0) printf("%d matching events found\n",count); else { printf("No desired events found.\n"); return 0; } fiff_int_t event_samp, from, to; MatrixXd timesDummy; MNEEpochDataList data; MNEEpochData* epoch = NULL; MatrixXd times; for (p = 0; p < count; ++p) { // // Read a data segment // event_samp = events(selected(p),0); from = event_samp + tmin*raw.info.sfreq; to = event_samp + floor(tmax*raw.info.sfreq + 0.5); epoch = new MNEEpochData(); if(raw.read_raw_segment(epoch->epoch, timesDummy, from, to, picks)) { if (p == 0) { times.resize(1, to-from+1); for (qint32 i = 0; i < times.cols(); ++i) times(0, i) = ((float)(from-event_samp+i)) / raw.info.sfreq; } epoch->event = event; epoch->tmin = ((float)(from)-(float)(raw.first_samp))/raw.info.sfreq; epoch->tmax = ((float)(to)-(float)(raw.first_samp))/raw.info.sfreq; data.append(MNEEpochData::SPtr(epoch)); //List takes ownwership of the pointer - no delete need } else { printf("Can't read the event data segments"); return 0; } } if(data.size() > 0) { printf("Read %d epochs, %d samples each.\n",data.size(),(qint32)data[0]->epoch.cols()); //DEBUG std::cout << data[0]->epoch.block(0,0,10,10) << std::endl; qDebug() << data[0]->epoch.rows() << " x " << data[0]->epoch.cols(); std::cout << times.block(0,0,1,10) << std::endl; qDebug() << times.rows() << " x " << times.cols(); } // // calculate the average // //Only take first finger movement of each tapping session (each tapping session consists of 4 seperate finger movement) // VectorXi vecSel(1); // vecSel << 60; if(count<averageIterator) averageIterator = count; VectorXi vecSel(count/averageIterator); int i; for(i=0; i<count/averageIterator; i++) vecSel[i] = i*averageIterator; // Add number of averages read from the eventfile to the file name t_sAvrFileNameRel.append(t_sAvrFileNameRel.number(tmin)); t_sAvrFileNameRel.append("_"); t_sAvrFileNameRel.append(t_sAvrFileNameRel.number(tmax)); t_sAvrFileNameRel.append("_"); t_sAvrFileNameRel.append(t_sAvrFileNameRel.number(i)); t_sAvrFileNameRel.append(".fif"); QString t_sAvrFileName = t_sAvrFileNameRel.prepend(data_location); t_sStcFileNameRel.append(t_sStcFileNameRel.number(tmin)); t_sStcFileNameRel.append("_"); t_sStcFileNameRel.append(t_sStcFileNameRel.number(tmax)); t_sStcFileNameRel.append("_"); t_sStcFileNameRel.append(t_sStcFileNameRel.number(i)); t_sStcFileNameRel.append("_"); t_sStcFileNameRel.append(method.append(".stc")); QString t_sFileNameStc = t_sStcFileNameRel.prepend(data_location); std::cout << "Select following epochs to average:\n" << vecSel << std::endl; raw.info.filename = QString(""); //this need to be done in order to write a new file. otherwise some of the info contents are not getting copied correctly from raw.info (i.e. digitizer data) FiffEvoked evoked = data.average(raw.info, tmin*raw.info.sfreq, floor(tmax*raw.info.sfreq + 0.5), vecSel); //Write averaged data to file QFile m_fileOut(t_sAvrFileName); RowVectorXd m_cals; FiffStream::SPtr m_pOutfid = Fiff::start_writing_raw(m_fileOut, raw.info, m_cals); fiff_int_t first = 0; m_pOutfid->write_int(FIFF_FIRST_SAMPLE, &first); //m_pOutfid->finish_writing_raw(); Eigen::MatrixXd eData = evoked.data; Eigen::MatrixXd matValue = MatrixXd::Zero(eData.rows()+10, eData.cols()); matValue.block(0,0,128,matValue.cols()) = evoked.data; m_pOutfid->write_raw_buffer(matValue, m_cals); m_pOutfid->finish_writing_raw(); //################################# Source Estimate start ########################################## double snr = 0.1f;//1.0f;//3.0f;//0.1f;//3.0f; QString t_sFileNameClusteredInv(""); // Parse command line parameters for(qint32 i = 0; i < argc; ++i) { if(strcmp(argv[i], "-snr") == 0 || strcmp(argv[i], "--snr") == 0) { if(i + 1 < argc) snr = atof(argv[i+1]); } else if(strcmp(argv[i], "-method") == 0 || strcmp(argv[i], "--method") == 0) { if(i + 1 < argc) method = QString::fromUtf8(argv[i+1]); } else if(strcmp(argv[i], "-inv") == 0 || strcmp(argv[i], "--inv") == 0) { if(i + 1 < argc) t_sFileNameClusteredInv = QString::fromUtf8(argv[i+1]); } else if(strcmp(argv[i], "-stc") == 0 || strcmp(argv[i], "--stc") == 0) { if(i + 1 < argc) t_sFileNameStc = QString::fromUtf8(argv[i+1]); } } double lambda2 = 1.0 / pow(snr, 2); qDebug() << "Start calculation with: SNR" << snr << "; Lambda" << lambda2 << "; Method" << method << "; stc:" << t_sFileNameStc; MNEForwardSolution t_Fwd(t_fileFwd); if(t_Fwd.isEmpty()) return 1; FiffCov noise_cov(t_fileCov); // regularize noise covariance noise_cov = noise_cov.regularize(evoked.info, 0.05, 0.05, 0.1, true); // // Cluster forward solution; // MNEForwardSolution t_clusteredFwd = t_Fwd.cluster_forward_solution(t_annotationSet, 20);//40); % Use multithreading //MNEForwardSolution t_clusteredFwd = t_Fwd.cluster_forward_solution(t_annotationSet, 10);//40); //MNEForwardSolution t_clusteredFwd = t_Fwd; // // Find rows of interest in stc files // QFile wrtFWD ("./mne_x_plugins/resources/tmsi/fwd_clustered.txt"); wrtFWD.open(QIODevice::WriteOnly | QIODevice::Text); QTextStream out(&wrtFWD); //Read vertnos VectorXi vertno_left = t_clusteredFwd.src[0].vertno; VectorXi vertno_right = t_clusteredFwd.src[1].vertno; out<<"Vertno Left Hemi:"<<endl<<endl; for(int i=0; i<vertno_left.rows(); i++) out<<vertno_left[i]<<endl; out<<endl<<"Vertno right Hemi:"<<endl<<endl; for(int i=0; i<vertno_right.rows(); i++) out<<vertno_right[i]<<endl; //Read corresponding labels VectorXi labelIds_left = t_annotationSet[0].getLabelIds(); out<<endl<<endl<<"labelIds_left:"<<endl<<endl; for(int i=0; i<labelIds_left.rows(); i++) out<<labelIds_left[i]<<endl; VectorXi labelIds_right = t_annotationSet[1].getLabelIds(); out<<endl<<endl<<"labelIds_right:"<<endl<<endl; for(int i=0; i<labelIds_right.rows(); i++) out<<labelIds_right[i]<<endl; //Find interesting rows in stc files // Left hemisphere QFile wrtFWD_28_left ("./mne_x_plugins/resources/tmsi/fwd_clustered_postcentral_28_Left.txt"); wrtFWD_28_left.open(QIODevice::WriteOnly | QIODevice::Text); QTextStream out_28_left(&wrtFWD_28_left); QFile wrtFWD_29_left ("./mne_x_plugins/resources/tmsi/fwd_clustered_precentral_29_Left.txt"); wrtFWD_29_left.open(QIODevice::WriteOnly | QIODevice::Text); QTextStream out_29_left(&wrtFWD_29_left); QFile wrtFWD_45_left ("./mne_x_plugins/resources/tmsi/fwd_clustered_central_45_Left.txt"); wrtFWD_45_left.open(QIODevice::WriteOnly | QIODevice::Text); QTextStream out_45_left(&wrtFWD_45_left); QVector<int> interestingRows_Left; out<<endl<<endl<<"interestingRows_Left (matlab syntax):"<<endl<<endl; for(int i=0; i<vertno_left.rows() ; i++) { //G_postcentral if(labelIds_left[vertno_left[i]] == 9221140) { interestingRows_Left.push_back(i); out<<"Region 28 - G_postcentral: "<<i+1<<endl; out_28_left<<i+1<<endl; } //G_precentral if(labelIds_left[vertno_left[i]] == 11832380) { interestingRows_Left.push_back(i); out<<"Region 29 - G_precentral: "<<i+1<<endl; out_29_left<<i+1<<endl; } //S_central if(labelIds_left[vertno_left[i]] == 660701) { interestingRows_Left.push_back(i); out<<"Region 45 - S_central: "<<i+1<<endl; out_45_left<<i+1<<endl; } } // Right hemisphere QFile wrtFWD_28_right ("./mne_x_plugins/resources/tmsi/fwd_clustered_postcentral_28_Right.txt"); wrtFWD_28_right.open(QIODevice::WriteOnly | QIODevice::Text); QTextStream out_28_right(&wrtFWD_28_right); QFile wrtFWD_29_right ("./mne_x_plugins/resources/tmsi/fwd_clustered_precentral_29_Right.txt"); wrtFWD_29_right.open(QIODevice::WriteOnly | QIODevice::Text); QTextStream out_29_right(&wrtFWD_29_right); QFile wrtFWD_45_right ("./mne_x_plugins/resources/tmsi/fwd_clustered_central_45_Right.txt"); wrtFWD_45_right.open(QIODevice::WriteOnly | QIODevice::Text); QTextStream out_45_right(&wrtFWD_45_right); QVector<int> interestingRows_Right; out<<endl<<endl<<"interestingRows_Right (matlab syntax):"<<endl<<endl; for(int i=0; i<vertno_right.rows() ; i++) { //G_postcentral if(labelIds_right[vertno_right[i]] == 9221140) { interestingRows_Right.push_back(i); out<<"Region 28 - G_postcentral: "<<i+1+vertno_left.rows()<<endl; out_28_right<<i+1<<endl; } //G_precentral if(labelIds_right[vertno_right[i]] == 11832380) { interestingRows_Right.push_back(i); out<<"Region 29 - G_precentral: "<<i+1+vertno_left.rows()<<endl; out_29_right<<i+1<<endl; } //S_central if(labelIds_right[vertno_right[i]] == 660701) { interestingRows_Right.push_back(i); out<<"Region 45 - S_central: "<<i+1+vertno_left.rows()<<endl; out_45_right<<i+1<<endl; } } wrtFWD_28_left.close(); wrtFWD_29_left.close(); wrtFWD_45_left.close(); wrtFWD_28_right.close(); wrtFWD_29_right.close(); wrtFWD_45_right.close(); wrtFWD.close(); // // make an inverse operators // FiffInfo info = evoked.info; MNEInverseOperator inverse_operator(info, t_clusteredFwd, noise_cov, 0.2f, 0.8f); // QFile t_fileInv("D:/Dropbox/Masterarbeit DB/Messdaten/EEG/2014_02_07_Lorenz_Esch_007/Processed/inverse operators/Lorenz-140128-Duke128-eeg-inv.fif"); // MNEInverseOperator inverse_operator(t_fileInv); // // save clustered inverse // if(!t_sFileNameClusteredInv.isEmpty()) { QFile t_fileClusteredInverse(t_sFileNameClusteredInv); inverse_operator.write(t_fileClusteredInverse); } // // Compute inverse solution // // Calculate stc for averaged data MinimumNorm minimumNorm(inverse_operator, lambda2, method); MNESourceEstimate sourceEstimate = minimumNorm.calculateInverse(evoked); if(sourceEstimate.isEmpty()) return 1; // Calculate stc for all trials and write to file - dirty if(doRawTrialLocalization) { MNESourceEstimate sourceEstimate_trial; for(int i = 0; i<data.size(); i++) { QString file_trial_stc_orig = t_sFileNameStc; QString file_trial_stc_tmp = t_sFileNameStc; QString stc_trial_sub_folder = file_trial_stc_tmp.remove(0,t_sFileNameStc.indexOf("/So")+1); stc_trial_sub_folder.remove(".stc"); stc_trial_sub_folder.append("-raw-trials/"); QString dirCheck = data_location; dirCheck.append("/Processed/stc/"); dirCheck.append(stc_trial_sub_folder); if(QDir(dirCheck).exists() == false) QDir().mkdir(dirCheck); stc_trial_sub_folder.prepend("stc/"); file_trial_stc_orig.replace("stc/", stc_trial_sub_folder); QString temp; temp.append("_"); temp.append(temp.number(i)); temp.append(".stc"); file_trial_stc_orig.replace(".stc",temp); sourceEstimate_trial = minimumNorm.calculateInverse(data[i]->epoch,0,1/info.sfreq); if(sourceEstimate_trial.isEmpty()) return 1; if(!t_sFileNameStc.isEmpty()) { QFile t_fileTrialStc(file_trial_stc_orig); sourceEstimate_trial.write(t_fileTrialStc); } } } // View activation time-series std::cout << "\nsourceEstimate:\n" << sourceEstimate.data.block(0,0,10,10) << std::endl; std::cout << "time\n" << sourceEstimate.times.block(0,0,1,10) << std::endl; std::cout << "timeMin\n" << sourceEstimate.times[0] << std::endl; std::cout << "timeMax\n" << sourceEstimate.times[sourceEstimate.times.size()-1] << std::endl; std::cout << "time step\n" << sourceEstimate.tstep << std::endl; VectorXd s; //double t_dConditionNumber = MNEMath::getConditionNumber(t_Fwd.sol->data, s); //double t_dConditionNumberClustered = MNEMath::getConditionNumber(t_clusteredFwd.sol->data, s); // std::cout << "Condition Number:\n" << t_dConditionNumber << std::endl; // std::cout << "Clustered Condition Number:\n" << t_dConditionNumberClustered << std::endl; // std::cout << "ForwardSolution" << t_Fwd.sol->data.block(0,0,10,10) << std::endl; std::cout << "Clustered ForwardSolution" << t_clusteredFwd.sol->data.block(0,0,10,10) << std::endl; // Write stc to file if(!t_sFileNameStc.isEmpty()) { QFile t_fileClusteredStc(t_sFileNameStc); sourceEstimate.write(t_fileClusteredStc); } //############################### Source Estimate end ######################################### //only one time point - P100 // qint32 sample = 0; // for(qint32 i = 0; i < sourceEstimate.times.size(); ++i) // { // if(sourceEstimate.times(i) >= 0) // { // sample = i; // break; // } // } // sample += (qint32)ceil(0.106/sourceEstimate.tstep); //100ms // sourceEstimate = sourceEstimate.reduce(sample, 1); // sourceEstimate = sourceEstimate.reduce(253, 1); //1731 View3D::SPtr testWindow = View3D::SPtr(new View3D()); testWindow->addBrainData("Subject01", "HemiLRSet", t_surfSet, t_annotationSet); QList<BrainRTSourceLocDataTreeItem*> rtItemList = testWindow->addRtBrainData("Subject01", "HemiLRSet", sourceEstimate, t_clusteredFwd); testWindow->show(); Control3DWidget::SPtr control3DWidget = Control3DWidget::SPtr(new Control3DWidget()); control3DWidget->setView3D(testWindow); control3DWidget->show(); return a.exec();//1;//a.exec(); }
/** * 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[]) { QApplication a(argc, argv); //######################################################################################## // // Source Estimate START // //######################################################################################## QFile t_fileFwd("./MNE-sample-data/MEG/sample/sample_audvis-meg-eeg-oct-6-fwd.fif"); QFile t_fileCov("./MNE-sample-data/MEG/sample/sample_audvis-cov.fif"); QFile t_fileEvoked("./MNE-sample-data/MEG/sample/sample_audvis-ave.fif"); QString t_sFileClusteredInverse("");//QFile t_fileClusteredInverse("./clusteredInverse-inv.fif"); AnnotationSet t_annotationSet ("sample", 2, "aparc.a2009s", "./MNE-sample-data/subjects"); double snr = 1.0; double lambda2 = 1.0 / pow(snr, 2); QString method("dSPM"); //"MNE" | "dSPM" | "sLORETA" // Load data fiff_int_t setno = 1; QPair<QVariant, QVariant> baseline(QVariant(), 0); FiffEvoked evoked(t_fileEvoked, setno, baseline); if(evoked.isEmpty()) return 1; std::cout << "Evoked description: " << evoked.comment.toLatin1().constData() << std::endl; MNEForwardSolution t_Fwd(t_fileFwd); if(t_Fwd.isEmpty()) return 1; FiffCov noise_cov(t_fileCov); // regularize noise covariance noise_cov = noise_cov.regularize(evoked.info, 0.05, 0.05, 0.1, true); // // Cluster forward solution; // MNEForwardSolution t_clusteredFwd = t_Fwd;//.cluster_forward_solution(t_annotationSet, 40); // // make an inverse operators // FiffInfo info = evoked.info; MNEInverseOperator inverse_operator(info, t_clusteredFwd, noise_cov, 0.2f, 0.8f); if(!t_sFileClusteredInverse.isEmpty()) { QFile t_fileClusteredInverse(t_sFileClusteredInverse); inverse_operator.write(t_fileClusteredInverse); } // // Compute inverse solution // MinimumNorm minimumNorm(inverse_operator, lambda2, method); MNESourceEstimate sourceEstimate = minimumNorm.calculateInverse(evoked); if(sourceEstimate.isEmpty()) return 1; // // View activation time-series // std::cout << "\nsourceEstimate:\n" << sourceEstimate.data.block(0,0,10,10) << std::endl; // std::cout << "time\n" << sourceEstimate.times.block(0,0,1,10) << std::endl; // std::cout << "timeMin\n" << sourceEstimate.times[0] << std::endl; // std::cout << "timeMax\n" << sourceEstimate.times[sourceEstimate.times.size()-1] << std::endl; // std::cout << "time step\n" << sourceEstimate.tstep << std::endl; //######################################################################################## // //Source Estimate END // //######################################################################################## //######################################################################################## // // Create the test view START // //######################################################################################## std::cout<<"Creating BrainView"<<std::endl; SurfaceSet tSurfSet ("sample", 2, "inflated", "./MNE-sample-data/subjects"); AnnotationSet tAnnotSet ("sample", 2, "aparc.a2009s", "./MNE-sample-data/subjects"); //Surface tSurfRight ("sample", 1, "inflated", "./MNE-sample-data/subjects"); //Annotation tAnnotRight ("sample", 1, "aparc.a2009s", "./MNE-sample-data/subjects"); //Surface tSurfLeft ("sample", 0, "inflated", "./MNE-sample-data/subjects"); //Annotation tAnnotLeft ("sample", 0, "aparc.a2009s", "./MNE-sample-data/subjects"); View3D::SPtr testWindow = View3D::SPtr(new View3D()); //testWindow->addBrainData("HemiLR", tSurfLeft, tAnnotLeft); //testWindow->addBrainData("HemiLR", tSurfRight, tAnnotRight); testWindow->addBrainData("HemiLRSet", tSurfSet, tAnnotSet); // QFile t_File("./MNE-sample-data/MEG/sample/sample_audvis-meg-eeg-oct-6-fwd.fif"); // MNEForwardSolution t_forwardSolution(t_File); //testWindow->addBrainData("HemiLRSet", t_forwardSolution); QList<BrainRTDataTreeItem*> rtItemList = testWindow->addRtBrainData("HemiLRSet", sourceEstimate, t_clusteredFwd); //testWindow->addRtBrainData("HemiLRSet", sourceEstimate); //rtItemList.at(0)->addData(sourceEstimate); testWindow->show(); Control3DWidget::SPtr control3DWidget = Control3DWidget::SPtr(new Control3DWidget()); control3DWidget->setWindowFlags(Qt::WindowStaysOnTopHint); control3DWidget->setView3D(testWindow); control3DWidget->show(); //######################################################################################## // // Create the test view END // //######################################################################################## return a.exec(); }
/** * 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[]) { QApplication a(argc, argv); // Command Line Parser QCommandLineParser parser; parser.setApplicationDescription("Clustered Inverse Raw Example"); parser.addHelpOption(); QCommandLineOption inputOption("fileIn", "The input file <in>.", "in", "./MNE-sample-data/MEG/sample/sample_audvis_raw.fif"); QCommandLineOption surfOption("surfType", "Surface type <type>.", "type", "inflated"); QCommandLineOption annotOption("annotType", "Annotation type <type>.", "type", "aparc.a2009s"); QCommandLineOption subjectOption("subject", "Selected subject <subject>.", "subject", "sample"); QCommandLineOption subjectPathOption("subjectPath", "Selected subject path <subjectPath>.", "subjectPath", "./MNE-sample-data/subjects"); QCommandLineOption fwdOption("fwd", "Path to forwad solution <file>.", "file", "./MNE-sample-data/MEG/sample/sample_audvis-meg-eeg-oct-6-fwd.fif"); QCommandLineOption covFileOption("cov", "Path to the covariance <file>.", "file", "./MNE-sample-data/MEG/sample/sample_audvis-cov.fif"); QCommandLineOption evokedIndexOption("aveIdx", "The average <index> to choose from the average file.", "index", "1"); QCommandLineOption eventsFileOption("eve", "Path to the event <file>.", "file", "./MNE-sample-data/MEG/sample/sample_audvis_raw-eve.fif"); QCommandLineOption hemiOption("hemi", "Selected hemisphere <hemi>.", "hemi", "2"); QCommandLineOption methodOption("method", "Inverse estimation <method>, i.e., 'MNE', 'dSPM' or 'sLORETA'.", "method", "dSPM");//"MNE" | "dSPM" | "sLORETA" QCommandLineOption snrOption("snr", "The SNR value used for computation <snr>.", "snr", "1.0");//3.0;//0.1;//3.0; QCommandLineOption invFileOutOption("invOut", "Path to inverse <file>, which is to be written.", "file", ""); QCommandLineOption stcFileOutOption("stcOut", "Path to stc <file>, which is to be written.", "file", ""); QCommandLineOption keepCompOption("keepComp", "Keep compensators.", "keepComp", "false"); QCommandLineOption pickAllOption("pickAll", "Pick all channels.", "pickAll", "true"); QCommandLineOption destCompsOption("destComps", "<Destination> of the compensator which is to be calculated.", "destination", "0"); parser.addOption(inputOption); parser.addOption(surfOption); parser.addOption(annotOption); parser.addOption(subjectOption); parser.addOption(subjectPathOption); parser.addOption(fwdOption); parser.addOption(covFileOption); parser.addOption(evokedIndexOption); parser.addOption(eventsFileOption); parser.addOption(hemiOption); parser.addOption(methodOption); parser.addOption(snrOption); parser.addOption(invFileOutOption); parser.addOption(stcFileOutOption); parser.addOption(keepCompOption); parser.addOption(pickAllOption); parser.addOption(destCompsOption); parser.process(a); // Load files QFile t_fileFwd(parser.value(fwdOption)); QFile t_fileCov(parser.value(covFileOption)); QFile t_fileRaw(parser.value(inputOption)); QString t_sEventName = parser.value(eventsFileOption); SurfaceSet t_surfSet (parser.value(subjectOption), parser.value(hemiOption).toInt(), parser.value(surfOption), parser.value(subjectPathOption)); AnnotationSet t_annotationSet (parser.value(subjectOption), parser.value(hemiOption).toInt(), parser.value(annotOption), parser.value(subjectPathOption)); qint32 event = parser.value(evokedIndexOption).toInt(); float tmin = -0.2f; float tmax = 0.4f; bool keep_comp = false; if(parser.value(keepCompOption) == "false" || parser.value(keepCompOption) == "0") { keep_comp = false; } else if(parser.value(keepCompOption) == "true" || parser.value(keepCompOption) == "1") { keep_comp = true; } fiff_int_t dest_comp = parser.value(destCompsOption).toInt(); bool pick_all = false; if(parser.value(pickAllOption) == "false" || parser.value(pickAllOption) == "0") { pick_all = false; } else if(parser.value(pickAllOption) == "true" || parser.value(pickAllOption) == "1") { pick_all = true; } qint32 k, p; // // Setup for reading the raw data // FiffRawData raw(t_fileRaw); RowVectorXi picks; if (pick_all) { // // Pick all // picks.resize(raw.info.nchan); for(k = 0; k < raw.info.nchan; ++k) picks(k) = k; // } else { QStringList include; include << "STI 014"; bool want_meg = true; bool want_eeg = false; bool want_stim = false; // picks = Fiff::pick_types(raw.info, want_meg, want_eeg, want_stim, include, raw.info.bads); picks = raw.info.pick_types(want_meg, want_eeg, want_stim, include, raw.info.bads);//prefer member function } QStringList ch_names; for(k = 0; k < picks.cols(); ++k) ch_names << raw.info.ch_names[picks(0,k)]; // // Set up projection // if (raw.info.projs.size() == 0) printf("No projector specified for these data\n"); else { // // Activate the projection items // for (k = 0; k < raw.info.projs.size(); ++k) raw.info.projs[k].active = true; printf("%d projection items activated\n",raw.info.projs.size()); // // Create the projector // // fiff_int_t nproj = MNE::make_projector_info(raw.info, raw.proj); Using the member function instead fiff_int_t nproj = raw.info.make_projector(raw.proj); if (nproj == 0) { printf("The projection vectors do not apply to these channels\n"); } else { printf("Created an SSP operator (subspace dimension = %d)\n",nproj); } } // // Set up the CTF compensator // // qint32 current_comp = MNE::get_current_comp(raw.info); qint32 current_comp = raw.info.get_current_comp(); if (current_comp > 0) printf("Current compensation grade : %d\n",current_comp); if (keep_comp) dest_comp = current_comp; if (current_comp != dest_comp) { qDebug() << "This part needs to be debugged"; if(MNE::make_compensator(raw.info, current_comp, dest_comp, raw.comp)) { // raw.info.chs = MNE::set_current_comp(raw.info.chs,dest_comp); raw.info.set_current_comp(dest_comp); printf("Appropriate compensator added to change to grade %d.\n",dest_comp); } else { printf("Could not make the compensator\n"); return 0; } } // // Read the events // QFile t_EventFile; MatrixXi events; if (t_sEventName.size() == 0) { p = t_fileRaw.fileName().indexOf(".fif"); if (p > 0) { t_sEventName = t_fileRaw.fileName().replace(p, 4, "-eve.fif"); } else { printf("Raw file name does not end properly\n"); return 0; } // events = mne_read_events(t_sEventName); t_EventFile.setFileName(t_sEventName); MNE::read_events(t_EventFile, events); printf("Events read from %s\n",t_sEventName.toUtf8().constData()); } else { // // Binary file // p = t_fileRaw.fileName().indexOf(".fif"); if (p > 0) { t_EventFile.setFileName(t_sEventName); if(!MNE::read_events(t_EventFile, events)) { printf("Error while read events.\n"); return 0; } printf("Binary event file %s read\n",t_sEventName.toUtf8().constData()); } else { // // Text file // printf("Text file %s is not supported jet.\n",t_sEventName.toUtf8().constData()); // try // events = load(eventname); // catch // error(me,mne_omit_first_line(lasterr)); // end // if size(events,1) < 1 // error(me,'No data in the event file'); // end // // // // Convert time to samples if sample number is negative // // // for p = 1:size(events,1) // if events(p,1) < 0 // events(p,1) = events(p,2)*raw.info.sfreq; // end // end // // // // Select the columns of interest (convert to integers) // // // events = int32(events(:,[1 3 4])); // // // // New format? // // // if events(1,2) == 0 && events(1,3) == 0 // fprintf(1,'The text event file %s is in the new format\n',eventname); // if events(1,1) ~= raw.first_samp // error(me,'This new format event file is not compatible with the raw data'); // end // else // fprintf(1,'The text event file %s is in the old format\n',eventname); // // // // Offset with first sample // // // events(:,1) = events(:,1) + raw.first_samp; // end } } // // Select the desired events // qint32 count = 0; MatrixXi selected = MatrixXi::Zero(1, events.rows()); for (p = 0; p < events.rows(); ++p) { if (events(p,1) == 0 && events(p,2) == event) { selected(0,count) = p; ++count; } } selected.conservativeResize(1, count); if (count > 0) printf("%d matching events found\n",count); else { printf("No desired events found.\n"); return 0; } fiff_int_t event_samp, from, to; MatrixXd timesDummy; MNEEpochDataList data; MNEEpochData* epoch = NULL; MatrixXd times; for (p = 0; p < count; ++p) { // // Read a data segment // event_samp = events(selected(p),0); from = event_samp + tmin*raw.info.sfreq; to = event_samp + floor(tmax*raw.info.sfreq + 0.5); epoch = new MNEEpochData(); if(raw.read_raw_segment(epoch->epoch, timesDummy, from, to, picks)) { if (p == 0) { times.resize(1, to-from+1); for (qint32 i = 0; i < times.cols(); ++i) times(0, i) = ((float)(from-event_samp+i)) / raw.info.sfreq; } epoch->event = event; epoch->tmin = ((float)(from)-(float)(raw.first_samp))/raw.info.sfreq; epoch->tmax = ((float)(to)-(float)(raw.first_samp))/raw.info.sfreq; data.append(MNEEpochData::SPtr(epoch));//List takes ownwership of the pointer - no delete need } else { printf("Can't read the event data segments"); return 0; } } if(data.size() > 0) { printf("Read %d epochs, %d samples each.\n",data.size(),(qint32)data[0]->epoch.cols()); //DEBUG std::cout << data[0]->epoch.block(0,0,10,10) << std::endl; qDebug() << data[0]->epoch.rows() << " x " << data[0]->epoch.cols(); std::cout << times.block(0,0,1,10) << std::endl; qDebug() << times.rows() << " x " << times.cols(); } // Calculate the average // Option 1 - Random selection VectorXi vecSel(50); srand (time(NULL)); // initialize random seed for(qint32 i = 0; i < vecSel.size(); ++i) { qint32 val = rand() % count; vecSel(i) = val; } // //Option 3 - Take all epochs // VectorXi vecSel(data.size()); // for(qint32 i = 0; i < vecSel.size(); ++i) // { // vecSel(i) = i; // } // //Option 3 - Manual selection // VectorXi vecSel(20); // vecSel << 76, 74, 13, 61, 97, 94, 75, 71, 60, 56, 26, 57, 56, 0, 52, 72, 33, 86, 96, 67; std::cout << "Select following epochs to average:\n" << vecSel << std::endl; FiffEvoked evoked = data.average(raw.info, tmin*raw.info.sfreq, floor(tmax*raw.info.sfreq + 0.5), vecSel); //######################################################################################## // Source Estimate // // Settings // double snr = parser.value(snrOption).toDouble(); QString method(parser.value(methodOption)); QString t_sFileNameClusteredInv(parser.value(invFileOutOption)); QString t_sFileNameStc(parser.value(stcFileOutOption)); double lambda2 = 1.0 / pow(snr, 2); qDebug() << "Start calculation with: SNR" << snr << "; Lambda" << lambda2 << "; Method" << method << "; stc:" << t_sFileNameStc; // // Load data // MNEForwardSolution t_Fwd(t_fileFwd); if(t_Fwd.isEmpty()) return 1; FiffCov noise_cov(t_fileCov); // // regularize noise covariance // noise_cov = noise_cov.regularize(evoked.info, 0.05, 0.05, 0.1, true); // // Cluster forward solution; // MatrixXd D; MNEForwardSolution t_clusteredFwd = t_Fwd.cluster_forward_solution(t_annotationSet, 20, D, noise_cov, evoked.info); // // make an inverse operators // FiffInfo info = evoked.info; MNEInverseOperator inverse_operator(info, t_clusteredFwd, noise_cov, 0.2f, 0.8f); // // save clustered inverse // if(!t_sFileNameClusteredInv.isEmpty()) { QFile t_fileClusteredInverse(t_sFileNameClusteredInv); inverse_operator.write(t_fileClusteredInverse); } // // Compute inverse solution // MinimumNorm minimumNorm(inverse_operator, lambda2, method); #ifdef BENCHMARK // // Set up the inverse according to the parameters // minimumNorm.doInverseSetup(vecSel.size(),false); MNESourceEstimate sourceEstimate; QList<qint64> qVecElapsedTime; for(qint32 i = 0; i < 100; ++i) { //Benchmark time QElapsedTimer timer; timer.start(); sourceEstimate = minimumNorm.calculateInverse(evoked.data, evoked.times(0), evoked.times(1)-evoked.times(0)); qVecElapsedTime.append(timer.elapsed()); } double meanTime = 0.0; qint32 offset = 19; qint32 c = 0; for(qint32 i = offset; i < qVecElapsedTime.size(); ++i) { meanTime += qVecElapsedTime[i]; ++c; } meanTime /= (double)c; double varTime = 0; for(qint32 i = offset; i < qVecElapsedTime.size(); ++i) varTime += pow(qVecElapsedTime[i] - meanTime,2); varTime /= (double)c - 1.0f; varTime = sqrt(varTime); qDebug() << "MNE calculation took" << meanTime << "+-" << varTime << "ms in average"; #else MNESourceEstimate sourceEstimate = minimumNorm.calculateInverse(evoked); #endif if(sourceEstimate.isEmpty()) return 1; // View activation time-series std::cout << "\nsourceEstimate:\n" << sourceEstimate.data.block(0,0,10,10) << std::endl; std::cout << "time\n" << sourceEstimate.times.block(0,0,1,10) << std::endl; std::cout << "timeMin\n" << sourceEstimate.times[0] << std::endl; std::cout << "timeMax\n" << sourceEstimate.times[sourceEstimate.times.size()-1] << std::endl; std::cout << "time step\n" << sourceEstimate.tstep << std::endl; //Condition Numbers // MatrixXd mags(102, t_Fwd.sol->data.cols()); // qint32 count = 0; // for(qint32 i = 2; i < 306; i += 3) // { // mags.row(count) = t_Fwd.sol->data.row(i); // ++count; // } // MatrixXd magsClustered(102, t_clusteredFwd.sol->data.cols()); // count = 0; // for(qint32 i = 2; i < 306; i += 3) // { // magsClustered.row(count) = t_clusteredFwd.sol->data.row(i); // ++count; // } // MatrixXd grads(204, t_Fwd.sol->data.cols()); // count = 0; // for(qint32 i = 0; i < 306; i += 3) // { // grads.row(count) = t_Fwd.sol->data.row(i); // ++count; // grads.row(count) = t_Fwd.sol->data.row(i+1); // ++count; // } // MatrixXd gradsClustered(204, t_clusteredFwd.sol->data.cols()); // count = 0; // for(qint32 i = 0; i < 306; i += 3) // { // gradsClustered.row(count) = t_clusteredFwd.sol->data.row(i); // ++count; // gradsClustered.row(count) = t_clusteredFwd.sol->data.row(i+1); // ++count; // } VectorXd s; double t_dConditionNumber = MNEMath::getConditionNumber(t_Fwd.sol->data, s); double t_dConditionNumberClustered = MNEMath::getConditionNumber(t_clusteredFwd.sol->data, s); std::cout << "Condition Number:\n" << t_dConditionNumber << std::endl; std::cout << "Clustered Condition Number:\n" << t_dConditionNumberClustered << std::endl; std::cout << "ForwardSolution" << t_Fwd.sol->data.block(0,0,10,10) << std::endl; std::cout << "Clustered ForwardSolution" << t_clusteredFwd.sol->data.block(0,0,10,10) << std::endl; // double t_dConditionNumberMags = MNEMath::getConditionNumber(mags, s); // double t_dConditionNumberMagsClustered = MNEMath::getConditionNumber(magsClustered, s); // std::cout << "Condition Number Magnetometers:\n" << t_dConditionNumberMags << std::endl; // std::cout << "Clustered Condition Number Magnetometers:\n" << t_dConditionNumberMagsClustered << std::endl; // double t_dConditionNumberGrads = MNEMath::getConditionNumber(grads, s); // double t_dConditionNumberGradsClustered = MNEMath::getConditionNumber(gradsClustered, s); // std::cout << "Condition Number Gradiometers:\n" << t_dConditionNumberGrads << std::endl; // std::cout << "Clustered Condition Number Gradiometers:\n" << t_dConditionNumberGradsClustered << std::endl; //Source Estimate end //######################################################################################## // //only one time point - P100 // qint32 sample = 0; // for(qint32 i = 0; i < sourceEstimate.times.size(); ++i) // { // if(sourceEstimate.times(i) >= 0) // { // sample = i; // break; // } // } // sample += (qint32)ceil(0.106/sourceEstimate.tstep); //100ms // sourceEstimate = sourceEstimate.reduce(sample, 1); View3D::SPtr testWindow = View3D::SPtr(new View3D()); Data3DTreeModel::SPtr p3DDataModel = Data3DTreeModel::SPtr(new Data3DTreeModel()); testWindow->setModel(p3DDataModel); p3DDataModel->addSurfaceSet(parser.value(subjectOption), "MRI", t_surfSet, t_annotationSet); if(MneEstimateTreeItem* pRTDataItem = p3DDataModel->addSourceData(parser.value(subjectOption), evoked.comment, sourceEstimate, t_clusteredFwd)) { pRTDataItem->setLoopState(true); pRTDataItem->setTimeInterval(17); pRTDataItem->setNumberAverages(1); pRTDataItem->setStreamingActive(true); pRTDataItem->setNormalization(QVector3D(0.0,0.5,20.0)); pRTDataItem->setVisualizationType("Smoothing based"); pRTDataItem->setColortable("Hot"); } testWindow->show(); Control3DWidget::SPtr control3DWidget = Control3DWidget::SPtr(new Control3DWidget()); control3DWidget->init(p3DDataModel, testWindow); control3DWidget->show(); if(!t_sFileNameStc.isEmpty()) { QFile t_fileClusteredStc(t_sFileNameStc); sourceEstimate.write(t_fileClusteredStc); } return a.exec(); }
int main(int argc, char *argv[]) { QApplication app(argc, argv); // Command Line Parser QCommandLineParser parser; parser.setApplicationDescription("Projection Example"); parser.addHelpOption(); QCommandLineOption sampleBEMFileOption("f", "Path to BEM <file>.", "file", "./MNE-sample-data/warping/AVG4-0Years_segmented_BEM3/bem/AVG4-0Years_segmented_BEM3-2118-2188-3186-bem-sol.fif"); parser.addOption(sampleBEMFileOption); parser.process(app); //######################################################################################## // Read the BEM QFile t_fileBem(parser.value(sampleBEMFileOption)); MNEBem t_Bem(t_fileBem); // Read the Digitizer QFile t_fileDig("./MNE-sample-data/warping/AVG4-0Years_GSN128.fif"); FiffDigPointSet t_Dig(t_fileDig); MatrixXf ElecPos(t_Dig.size(), 3); for (int i = 0; i < t_Dig.size(); ++i) { ElecPos(i,0) = t_Dig[i].r[0]; ElecPos(i,1) = t_Dig[i].r[1]; ElecPos(i,2) = t_Dig[i].r[2]; } // Read and apply Transformation QFile t_fileTrans("./MNE-sample-data/warping/AVG4-0Years_GSN128-trans.fif"); FiffCoordTrans t_Trans (t_fileTrans); ElecPos=t_Trans.apply_trans(ElecPos); FiffDigPointSet t_DigTrans(t_Dig); for (int i = 0; i < t_DigTrans.size(); ++i) { t_DigTrans[i].r[0] = ElecPos(i,0); t_DigTrans[i].r[1] = ElecPos(i,1); t_DigTrans[i].r[2] = ElecPos(i,2); } //Projection MatrixXf DigProject(t_DigTrans.size(), 3); VectorXi nearest; VectorXf dist; MNEProjectToSurface t_Avg4 (t_Bem[0]); t_Avg4.mne_find_closest_on_surface(ElecPos, t_DigTrans.size(), DigProject, nearest, dist); FiffDigPointSet t_DigProject(t_Dig); for (int i = 0; i < t_DigProject.size(); ++i) { t_DigProject[i].r[0] = DigProject(i,0); t_DigProject[i].r[1] = DigProject(i,1); t_DigProject[i].r[2] = DigProject(i,2); } //Show View3D::SPtr testWindow = View3D::SPtr(new View3D()); testWindow->addBemData("AVG4-0Years", "BEM", t_Bem); testWindow->addDigitizerData("AVG4-0Years", "Orignal Dig", t_Dig); testWindow->addDigitizerData("AVG4-0Years", "Trans Dig", t_DigTrans); testWindow->addDigitizerData("AVG4-0Years", "Project Dig", t_DigProject); testWindow->show(); Control3DWidget::SPtr control3DWidget = Control3DWidget::SPtr(new Control3DWidget()); control3DWidget->setView3D(testWindow); control3DWidget->show(); return app.exec(); }
/** * 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[]) { QApplication a(argc, argv); QFile t_fileRaw("./MNE-sample-data/MEG/sample/sample_audvis_raw.fif"); QString t_sEventName = "./MNE-sample-data/MEG/sample/sample_audvis_raw-eve.fif"; QFile t_fileFwd("./MNE-sample-data/MEG/sample/sample_audvis-meg-eeg-oct-6-fwd.fif"); AnnotationSet t_annotationSet("./MNE-sample-data/subjects/sample/label/lh.aparc.a2009s.annot", "./MNE-sample-data/subjects/sample/label/rh.aparc.a2009s.annot"); SurfaceSet t_surfSet("./MNE-sample-data/subjects/sample/surf/lh.white", "./MNE-sample-data/subjects/sample/surf/rh.white"); // QFile t_fileRaw("E:/Data/sl_data/MEG/mind006/mind006_051209_auditory01_raw.fif"); // QString t_sEventName = "E:/Data/sl_data/MEG/mind006/mind006_051209_auditory01_raw-eve.fif"; // QFile t_fileFwd("E:/Data/sl_data/MEG/mind006/mind006_051209_auditory01_raw-oct-6p-fwd.fif"); // AnnotationSet t_annotationSet("E:/Data/sl_data/subjects/mind006/label/lh.aparc.a2009s.annot", "E:/Data/sl_data/subjects/mind006/label/rh.aparc.a2009s.annot"); // SurfaceSet t_surfSet("E:/Data/sl_data/subjects/mind006/surf/lh.white", "E:/Data/sl_data/subjects/mind006/surf/rh.white"); // QFile t_fileRaw("E:/Data/sl_data/MEG/mind006/mind006_051209_median01_raw.fif"); // QString t_sEventName = "E:/Data/sl_data/MEG/mind006/mind006_051209_median01_raw-eve.fif"; // QFile t_fileFwd("E:/Data/sl_data/MEG/mind006/mind006_051209_median01_raw-oct-6-fwd.fif"); // AnnotationSet t_annotationSet("E:/Data/sl_data/subjects/mind006/label/lh.aparc.a2009s.annot", "E:/Data/sl_data/subjects/mind006/label/rh.aparc.a2009s.annot"); // SurfaceSet t_surfSet("E:/Data/sl_data/subjects/mind006/surf/lh.white", "E:/Data/sl_data/subjects/mind006/surf/rh.white"); QString t_sFileNameStc("");//("mind006_051209_auditory01.stc"); bool doMovie = false;//true; qint32 numDipolePairs = 7; qint32 event = 1; float tmin = -0.2f; float tmax = 0.4f; bool keep_comp = false; fiff_int_t dest_comp = 0; bool pick_all = true; qint32 k, p; // Parse command line parameters for(qint32 i = 0; i < argc; ++i) { if(strcmp(argv[i], "-stc") == 0 || strcmp(argv[i], "--stc") == 0) { if(i + 1 < argc) t_sFileNameStc = QString::fromUtf8(argv[i+1]); } } // // Load data // MNEForwardSolution t_Fwd(t_fileFwd); if(t_Fwd.isEmpty()) return 1; // // Setup for reading the raw data // FiffRawData raw(t_fileRaw); RowVectorXi picks; if (pick_all) { // // Pick all // picks.resize(raw.info.nchan); for(k = 0; k < raw.info.nchan; ++k) picks(k) = k; // } else { QStringList include; include << "STI 014"; bool want_meg = true; bool want_eeg = false; bool want_stim = false; picks = raw.info.pick_types(want_meg, want_eeg, want_stim, include, raw.info.bads);//prefer member function } QStringList ch_names; for(k = 0; k < picks.cols(); ++k) ch_names << raw.info.ch_names[picks(0,k)]; // // Set up projection // if (raw.info.projs.size() == 0) printf("No projector specified for these data\n"); else { // // Activate the projection items // for (k = 0; k < raw.info.projs.size(); ++k) raw.info.projs[k].active = true; printf("%d projection items activated\n",raw.info.projs.size()); // // Create the projector // // fiff_int_t nproj = MNE::make_projector_info(raw.info, raw.proj); Using the member function instead fiff_int_t nproj = raw.info.make_projector(raw.proj); if (nproj == 0) { printf("The projection vectors do not apply to these channels\n"); } else { printf("Created an SSP operator (subspace dimension = %d)\n",nproj); } } // // Set up the CTF compensator // qint32 current_comp = raw.info.get_current_comp(); if (current_comp > 0) printf("Current compensation grade : %d\n",current_comp); if (keep_comp) dest_comp = current_comp; if (current_comp != dest_comp) { qDebug() << "This part needs to be debugged"; if(MNE::make_compensator(raw.info, current_comp, dest_comp, raw.comp)) { raw.info.set_current_comp(dest_comp); printf("Appropriate compensator added to change to grade %d.\n",dest_comp); } else { printf("Could not make the compensator\n"); return 0; } } // // Read the events // QFile t_EventFile; MatrixXi events; if (t_sEventName.size() == 0) { p = t_fileRaw.fileName().indexOf(".fif"); if (p > 0) { t_sEventName = t_fileRaw.fileName().replace(p, 4, "-eve.fif"); } else { printf("Raw file name does not end properly\n"); return 0; } // events = mne_read_events(t_sEventName); t_EventFile.setFileName(t_sEventName); MNE::read_events(t_EventFile, events); printf("Events read from %s\n",t_sEventName.toUtf8().constData()); } else { // // Binary file // p = t_fileRaw.fileName().indexOf(".fif"); if (p > 0) { t_EventFile.setFileName(t_sEventName); if(!MNE::read_events(t_EventFile, events)) { printf("Error while read events.\n"); return 0; } printf("Binary event file %s read\n",t_sEventName.toUtf8().constData()); } else { // // Text file // printf("Text file %s is not supported jet.\n",t_sEventName.toUtf8().constData()); // try // events = load(eventname); // catch // error(me,mne_omit_first_line(lasterr)); // end // if size(events,1) < 1 // error(me,'No data in the event file'); // end // // // // Convert time to samples if sample number is negative // // // for p = 1:size(events,1) // if events(p,1) < 0 // events(p,1) = events(p,2)*raw.info.sfreq; // end // end // // // // Select the columns of interest (convert to integers) // // // events = int32(events(:,[1 3 4])); // // // // New format? // // // if events(1,2) == 0 && events(1,3) == 0 // fprintf(1,'The text event file %s is in the new format\n',eventname); // if events(1,1) ~= raw.first_samp // error(me,'This new format event file is not compatible with the raw data'); // end // else // fprintf(1,'The text event file %s is in the old format\n',eventname); // // // // Offset with first sample // // // events(:,1) = events(:,1) + raw.first_samp; // end } } // // Select the desired events // qint32 count = 0; MatrixXi selected = MatrixXi::Zero(1, events.rows()); for (p = 0; p < events.rows(); ++p) { if (events(p,1) == 0 && events(p,2) == event) { selected(0,count) = p; ++count; } } selected.conservativeResize(1, count); if (count > 0) printf("%d matching events found\n",count); else { printf("No desired events found.\n"); return 0; } fiff_int_t event_samp, from, to; MatrixXd timesDummy; MNEEpochDataList data; MNEEpochData* epoch = NULL; MatrixXd times; for (p = 0; p < count; ++p) { // // Read a data segment // event_samp = events(selected(p),0); from = event_samp + tmin*raw.info.sfreq; to = event_samp + floor(tmax*raw.info.sfreq + 0.5); epoch = new MNEEpochData(); if(raw.read_raw_segment(epoch->epoch, timesDummy, from, to, picks)) { if (p == 0) { times.resize(1, to-from+1); for (qint32 i = 0; i < times.cols(); ++i) times(0, i) = ((float)(from-event_samp+i)) / raw.info.sfreq; } epoch->event = event; epoch->tmin = ((float)(from)-(float)(raw.first_samp))/raw.info.sfreq; epoch->tmax = ((float)(to)-(float)(raw.first_samp))/raw.info.sfreq; data.append(MNEEpochData::SPtr(epoch));//List takes ownwership of the pointer - no delete need } else { printf("Can't read the event data segments"); return 0; } } if(data.size() > 0) { printf("Read %d epochs, %d samples each.\n",data.size(),(qint32)data[0]->epoch.cols()); //DEBUG std::cout << data[0]->epoch.block(0,0,10,10) << std::endl; qDebug() << data[0]->epoch.rows() << " x " << data[0]->epoch.cols(); std::cout << times.block(0,0,1,10) << std::endl; qDebug() << times.rows() << " x " << times.cols(); } // // calculate the average // // //Option 1 // qint32 numAverages = 99; // VectorXi vecSel(numAverages); // srand (time(NULL)); // initialize random seed // for(qint32 i = 0; i < vecSel.size(); ++i) // { // qint32 val = rand() % data.size(); // vecSel(i) = val; // } //Option 2 // VectorXi vecSel(20); //// vecSel << 76, 74, 13, 61, 97, 94, 75, 71, 60, 56, 26, 57, 56, 0, 52, 72, 33, 86, 96, 67; // vecSel << 65, 22, 47, 55, 16, 29, 14, 36, 57, 97, 89, 46, 9, 93, 83, 52, 71, 52, 3, 96; //Option 3 Newest // VectorXi vecSel(10); // vecSel << 0, 96, 80, 55, 66, 25, 26, 2, 55, 58, 6, 88; VectorXi vecSel(1); vecSel << 0; std::cout << "Select following epochs to average:\n" << vecSel << std::endl; FiffEvoked evoked = data.average(raw.info, tmin*raw.info.sfreq, floor(tmax*raw.info.sfreq + 0.5), vecSel); QStringList ch_sel_names = t_Fwd.info.ch_names; FiffEvoked pickedEvoked = evoked.pick_channels(ch_sel_names); //######################################################################################## // RAP MUSIC Source Estimate // // Cluster forward solution; // MNEForwardSolution t_clusteredFwd = t_Fwd.cluster_forward_solution(t_annotationSet, 20);//40); // // Compute inverse solution // RapMusic t_rapMusic(t_clusteredFwd, false, numDipolePairs); if(doMovie) t_rapMusic.setStcAttr(200,0.5); MNESourceEstimate sourceEstimate = t_rapMusic.calculateInverse(pickedEvoked); if(sourceEstimate.isEmpty()) return 1; // // View activation time-series // std::cout << "\nsourceEstimate:\n" << sourceEstimate.data.block(0,0,10,10) << std::endl; // std::cout << "time\n" << sourceEstimate.times.block(0,0,1,10) << std::endl; // std::cout << "timeMin\n" << sourceEstimate.times[0] << std::endl; // std::cout << "timeMax\n" << sourceEstimate.times[sourceEstimate.times.size()-1] << std::endl; // std::cout << "time step\n" << sourceEstimate.tstep << std::endl; //Source Estimate end //######################################################################################## // //only one time point - P100 // qint32 sample = 0; // for(qint32 i = 0; i < sourceEstimate.times.size(); ++i) // { // if(sourceEstimate.times(i) >= 0) // { // sample = i; // break; // } // } // sample += (qint32)ceil(0.106/sourceEstimate.tstep); //100ms // sourceEstimate = sourceEstimate.reduce(sample, 1); View3D::SPtr testWindow = View3D::SPtr(new View3D()); testWindow->addBrainData("Subject01", "HemiLRSet", t_surfSet, t_annotationSet); QList<BrainRTSourceLocDataTreeItem*> rtItemList = testWindow->addRtBrainData("Subject01", "HemiLRSet", sourceEstimate, t_clusteredFwd); testWindow->show(); Control3DWidget::SPtr control3DWidget = Control3DWidget::SPtr(new Control3DWidget()); control3DWidget->setView3D(testWindow); control3DWidget->show(); if(!t_sFileNameStc.isEmpty()) { QFile t_fileClusteredStc(t_sFileNameStc); sourceEstimate.write(t_fileClusteredStc); } return a.exec();//1;//a.exec(); }
/** * 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[]) { QApplication a(argc, argv); QFile t_fileRaw("./MNE-sample-data/MEG/sample/sample_audvis_raw.fif"); QFile t_fileFwd("./MNE-sample-data/MEG/sample/sample_audvis-eeg-oct-6-fwd.fif"); AnnotationSet t_annotationSet("./MNE-sample-data/subjects/sample/label/lh.aparc.a2009s.annot", "./MNE-sample-data/subjects/sample/label/rh.aparc.a2009s.annot"); SurfaceSet t_surfSet("./MNE-sample-data/subjects/sample/surf/lh.white", "./MNE-sample-data/subjects/sample/surf/rh.white"); // QFile t_fileRaw("E:/Data/sl_data/MEG/mind006/mind006_051209_auditory01_raw.fif"); // QFile t_fileFwd("E:/Data/sl_data/MEG/mind006/mind006_051209_auditory01_raw-oct-6p-fwd.fif"); // AnnotationSet t_annotationSet("E:/Data/sl_data/subjects/mind006/label/lh.aparc.a2009s.annot", "E:/Data/sl_data/subjects/mind006/label/rh.aparc.a2009s.annot"); // SurfaceSet t_surfSet("E:/Data/sl_data/subjects/mind006/surf/lh.white", "E:/Data/sl_data/subjects/mind006/surf/rh.white"); // QFile t_fileRaw("E:/Data/sl_data/MEG/mind006/mind006_051209_median01_raw.fif"); // QFile t_fileFwd("E:/Data/sl_data/MEG/mind006/mind006_051209_median01_raw-oct-6-fwd.fif"); // AnnotationSet t_annotationSet("E:/Data/sl_data/subjects/mind006/label/lh.aparc.a2009s.annot", "E:/Data/sl_data/subjects/mind006/label/rh.aparc.a2009s.annot"); // SurfaceSet t_surfSet("E:/Data/sl_data/subjects/mind006/surf/lh.white", "E:/Data/sl_data/subjects/mind006/surf/rh.white"); // QFile t_fileRaw("D:/Dropbox/Masterarbeit DB/Messdaten/mind006/mind006_051209_index01_raw.fif"); // QFile t_fileFwd("D:/Dropbox/Masterarbeit DB/Messdaten/mind006/mind006_051209_index01_raw-oct-6-fwd.fif"); // AnnotationSet t_annotationSet("D:/Dropbox/Masterarbeit DB/Messdaten/mind006/label/lh.aparc.a2009s.annot", "D:/Dropbox/Masterarbeit DB/Messdaten/mind006/label/rh.aparc.a2009s.annot"); // SurfaceSet t_surfSet("D:/Dropbox/Masterarbeit DB/Messdaten/mind006/surf/lh.white", "D:/Dropbox/Masterarbeit DB/Messdaten/mind006/surf/rh.white"); // QString t_sFileNameStc("D:/Dropbox/Masterarbeit DB/Messdaten/mind006/mind006_051209_index01_raw_RAP.stc"); // QFile t_fileRaw("D:/Dropbox/Masterarbeit DB/Messdaten/EEG/2014_03_17_Lorenz_Esch_010/Processed/averaged/EEG_data_001_voluntary_left_tapping_raw_Averaged_-1_1_108.fif"); // QFile t_fileFwd("D:/Dropbox/Masterarbeit DB/Messdaten/Forward solutions/Lorenz-140128-Duke128-fwd.fif"); // AnnotationSet t_annotationSet("D:/Dropbox/Masterarbeit DB/Messdaten/Forward solutions/atlas/lh.aparc.a2009s.annot", "D:/Dropbox/Masterarbeit DB/Messdaten/Forward solutions/atlas/rh.aparc.a2009s.annot"); // SurfaceSet t_surfSet("D:/Dropbox/Masterarbeit DB/Messdaten/Forward solutions/surface/lh.white", "D:/Dropbox/Masterarbeit DB/Messdaten/Forward solutions/surface/rh.white"); QString t_sFileNameStc("D:/Dropbox/Masterarbeit DB/Messdaten/EEG/2014_03_17_Lorenz_Esch_010/Processed/stc/EEG_data_001_voluntary_left_tapping_raw_Averaged_-1_1_108_RAP.stc"); // QFile t_fileRaw("D:/Dropbox/Masterarbeit DB/Messdaten/EEG/2014_02_04_Lorenz_Esch_005/Processed/averaged/EEG_data_002_voluntary_right_tapping_filtered_07_40_Averaged_-1_1_184.fif"); // QFile t_fileFwd("D:/Dropbox/Masterarbeit DB/Messdaten/Forward solutions/Lorenz-140128-Duke128-fwd.fif"); // AnnotationSet t_annotationSet("D:/Dropbox/Masterarbeit DB/Messdaten/Forward solutions/atlas/lh.aparc.a2009s.annot", "D:/Dropbox/Masterarbeit DB/Messdaten/Forward solutions/atlas/rh.aparc.a2009s.annot"); // SurfaceSet t_surfSet("D:/Dropbox/Masterarbeit DB/Messdaten/Forward solutions/surface/lh.white", "D:/Dropbox/Masterarbeit DB/Messdaten/Forward solutions/surface/rh.white"); // QString t_sFileNameStc("D:/Dropbox/Masterarbeit DB/Messdaten/EEG/2014_02_04_Lorenz_Esch_005/Processed/stc/EEG_data_002_voluntary_right_tapping_filtered_07_40_Averaged_-1_1_184_RAP.stc"); // QFile t_fileRaw("D:/Dropbox/Masterarbeit DB/Messdaten/EEG/2014_03_17_Lorenz_Esch_010/Processed/filtered/EEG_data_001_voluntary_left_right_tapping_filtered_07_40_raw.fif"); // QFile t_fileFwd("D:/Dropbox/Masterarbeit DB/Messdaten/Forward solutions/Lorenz-140128-Duke128-fwd.fif"); // AnnotationSet t_annotationSet("D:/Dropbox/Masterarbeit DB/Messdaten/Forward solutions/atlas/lh.aparc.a2009s.annot", "D:/Dropbox/Masterarbeit DB/Messdaten/Forward solutions/atlas/rh.aparc.a2009s.annot"); // SurfaceSet t_surfSet("D:/Dropbox/Masterarbeit DB/Messdaten/Forward solutions/surface/lh.white", "D:/Dropbox/Masterarbeit DB/Messdaten/Forward solutions/surface/rh.white"); // QString t_sFileNameStc("D:/Dropbox/Masterarbeit DB/Messdaten/EEG/2014_03_17_Lorenz_Esch_010/Processed/stc/EEG_data_001_voluntary_left_right_tapping_filtered_07_40_raw_RAP.stc"); qint32 numDipolePairs = 7; qint32 samplesStcWindow = 300; float stcOverlap = 0.0f; qint32 startSample = 0; qint32 numSample = 40000; bool in_samples = true; bool keep_comp = true; // Parse command line parameters for(qint32 i = 0; i < argc; ++i) { if(strcmp(argv[i], "-stc") == 0 || strcmp(argv[i], "--stc") == 0) { if(i + 1 < argc) t_sFileNameStc = QString::fromUtf8(argv[i+1]); } } // // Read raw data // MNEForwardSolution t_Fwd(t_fileFwd); if(t_Fwd.isEmpty()) return 1; QList<Label> t_qListLabels; QList<RowVector4i> t_qListRGBAs; //ToDo overload toLabels using instead of t_surfSet rr of MNESourceSpace t_annotationSet.toLabels(t_surfSet, t_qListLabels, t_qListRGBAs); QList<Label> t_qListLabelSelection; //LH t_qListLabelSelection << t_qListLabels[28] << t_qListLabels[29] << t_qListLabels[45] << t_qListLabels[66]; //RH t_qListLabelSelection << t_qListLabels[103] << t_qListLabels[104] << t_qListLabels[120]<< t_qListLabels[141]; // std::cout << "t_qListLabels.size " << t_qListLabels.size() << std::endl; // for(qint32 i = 0; i < t_qListLabels.size(); ++i) // { // qDebug() << "Num" << i << t_qListLabels[i].name; // std::cout << t_qListLabels[i].hemi << std::endl; // } MNEForwardSolution t_SelectFwd = t_Fwd.pick_regions(t_qListLabelSelection); // // Setup for reading the raw data // FiffRawData raw(t_fileRaw); float from = raw.first_samp + startSample; float to = from + numSample - 1; // // Set up pick list: MEG + STI 014 - bad channels // QStringList include; // include << "STI 014"; bool want_meg = false; bool want_eeg = true; bool want_stim = false; RowVectorXi picks = raw.info.pick_types(want_meg, want_eeg, want_stim, include);//, raw.info.bads); // // Set up projection // qint32 k = 0; if (raw.info.projs.size() == 0) printf("No projector specified for these data\n"); else { // // Activate the projection items // for (k = 0; k < raw.info.projs.size(); ++k) raw.info.projs[k].active = true; printf("%d projection items activated\n",raw.info.projs.size()); // // Create the projector // fiff_int_t nproj = raw.info.make_projector(raw.proj); if (nproj == 0) printf("The projection vectors do not apply to these channels\n"); else printf("Created an SSP operator (subspace dimension = %d)\n",nproj); } // // Set up the CTF compensator // qint32 current_comp = raw.info.get_current_comp(); qint32 dest_comp = -1; if (current_comp > 0) printf("Current compensation grade : %d\n",current_comp); if (keep_comp) dest_comp = current_comp; if (current_comp != dest_comp) { qDebug() << "This part needs to be debugged"; if(MNE::make_compensator(raw.info, current_comp, dest_comp, raw.comp)) { raw.info.set_current_comp(dest_comp); printf("Appropriate compensator added to change to grade %d.\n",dest_comp); } else { printf("Could not make the compensator\n"); return -1; } } // // Read a data segment // times output argument is optional // bool readSuccessful = false; MatrixXd data; MatrixXd times; if (in_samples) readSuccessful = raw.read_raw_segment(data, times, (qint32)from, (qint32)to, picks); else readSuccessful = raw.read_raw_segment_times(data, times, from, to, picks); if (!readSuccessful) { printf("Could not read raw segment.\n"); return -1; } printf("Read %d samples.\n",(qint32)data.cols()); //######################################################################################## // RAP MUSIC Source Estimate // // Cluster forward solution; // MNEForwardSolution t_clusteredFwd = t_SelectFwd.cluster_forward_solution(t_annotationSet, 20);//t_Fwd.cluster_forward_solution_ccr(t_annotationSet, 20);//40); // // Compute inverse solution // PwlRapMusic t_pwlRapMusic(t_clusteredFwd, false, numDipolePairs); MNESourceEstimate sourceEstimate; float tstep = 1.0f/raw.info.sfreq; float tmin; if(in_samples) tmin = from * tstep; else tmin = from; // // Rap MUSIC Source estimate // sourceEstimate.data = MatrixXd::Zero(t_clusteredFwd.nsource, data.cols()); //Results sourceEstimate.vertices = VectorXi(t_clusteredFwd.src[0].vertno.size() + t_clusteredFwd.src[1].vertno.size()); sourceEstimate.vertices << t_clusteredFwd.src[0].vertno, t_clusteredFwd.src[1].vertno; sourceEstimate.times = RowVectorXf::Zero(data.cols()); sourceEstimate.times[0] = tmin; for(qint32 i = 1; i < sourceEstimate.times.size(); ++i) sourceEstimate.times[i] = sourceEstimate.times[i-1] + tstep; sourceEstimate.tmin = tmin; sourceEstimate.tstep = tstep; bool first = true; bool last = false; qint32 t_iNumSensors = data.rows(); qint32 t_iNumSteps = data.cols(); qint32 t_iSamplesOverlap = (qint32)floor(((float)samplesStcWindow)*stcOverlap); qint32 t_iSamplesDiscard = t_iSamplesOverlap/2; MatrixXd measData = MatrixXd::Zero(t_iNumSensors, samplesStcWindow); qint32 curSample = 0; qint32 curResultSample = 0; qint32 stcWindowSize = samplesStcWindow - 2*t_iSamplesDiscard; while(!last) { //Data if(curSample + samplesStcWindow >= t_iNumSteps) //last { last = true; measData = data.block(0, data.cols()-samplesStcWindow, t_iNumSensors, samplesStcWindow); } else measData = data.block(0, curSample, t_iNumSensors, samplesStcWindow); curSample += (samplesStcWindow - t_iSamplesOverlap); if(first) curSample -= t_iSamplesDiscard; //shift on start t_iSamplesDiscard backwards //Calculate MNESourceEstimate stcData = t_pwlRapMusic.calculateInverse(measData, 0.0f, tstep); //Assign Result if(last) stcWindowSize = stcData.data.cols() - curResultSample; sourceEstimate.data.block(0,curResultSample,sourceEstimate.data.rows(),stcWindowSize) = stcData.data.block(0,0,stcData.data.rows(),stcWindowSize); curResultSample += stcWindowSize; if(first) first = false; } if(sourceEstimate.isEmpty()) return 1; // Write stc to file if(!t_sFileNameStc.isEmpty()) { QFile t_fileClusteredStc(t_sFileNameStc); sourceEstimate.write(t_fileClusteredStc); } //Source Estimate end //######################################################################################## View3D::SPtr testWindow = View3D::SPtr(new View3D()); testWindow->addBrainData("HemiLRSet", t_surfSet, t_annotationSet); QList<BrainRTSourceLocDataTreeItem*> rtItemList = testWindow->addRtBrainData("HemiLRSet", sourceEstimate, t_clusteredFwd); testWindow->show(); Control3DWidget::SPtr control3DWidget = Control3DWidget::SPtr(new Control3DWidget()); control3DWidget->setView3D(testWindow); control3DWidget->show(); if(!t_sFileNameStc.isEmpty()) { QFile t_fileClusteredStc(t_sFileNameStc); sourceEstimate.write(t_fileClusteredStc); } return a.exec(); }
/** * 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[]) { QApplication app(argc, argv); // Command Line Parser QCommandLineParser parser; parser.setApplicationDescription("Compute Inverse Powell RAP-MUSIC Example"); parser.addHelpOption(); QCommandLineOption sampleFwdFileOption("f", "Path to forward solution <file>.", "file", "./MNE-sample-data/MEG/sample/sample_audvis-meg-eeg-oct-6-fwd.fif"); QCommandLineOption sampleEvokedFileOption("e", "Path to evoked <file>.", "file", "./MNE-sample-data/MEG/sample/sample_audvis-ave.fif"); QCommandLineOption sampleSubjectDirectoryOption("d", "Path to subject <directory>.", "directory", "./MNE-sample-data/subjects"); QCommandLineOption sampleSubjectOption("s", "Selected <subject>.", "subject", "sample"); QCommandLineOption stcFileOption("t", "Path to <target> where stc is stored to.", "target", "");//"RapMusic.stc"); QCommandLineOption numDipolePairsOption("n", "<number> of dipole pairs to localize.", "number", "7"); QCommandLineOption doMovieOption("m", "Create overlapping movie."); parser.addOption(sampleFwdFileOption); parser.addOption(sampleEvokedFileOption); parser.addOption(sampleSubjectDirectoryOption); parser.addOption(sampleSubjectOption); parser.addOption(stcFileOption); parser.addOption(numDipolePairsOption); parser.addOption(doMovieOption); parser.process(app); //######################################################################################## // Source Estimate QFile t_fileFwd(parser.value(sampleFwdFileOption)); QFile t_fileEvoked(parser.value(sampleEvokedFileOption)); QString subject(parser.value(sampleSubjectOption)); QString subjectDir(parser.value(sampleSubjectDirectoryOption)); AnnotationSet t_annotationSet(subject, 2, "aparc.a2009s", subjectDir); SurfaceSet t_surfSet(subject, 2, "white", subjectDir); QString t_sFileNameStc(parser.value(stcFileOption)); qint32 numDipolePairs = parser.value(numDipolePairsOption).toInt(); bool doMovie = parser.isSet(doMovieOption); // Parse command line parameters for(qint32 i = 0; i < argc; ++i) { if(strcmp(argv[i], "-stc") == 0 || strcmp(argv[i], "--stc") == 0) { if(i + 1 < argc) t_sFileNameStc = QString::fromUtf8(argv[i+1]); }else if(strcmp(argv[i], "-num") == 0 || strcmp(argv[i], "--num") == 0) { if(i + 1 < argc) numDipolePairs = atof(argv[i+1]); } } qDebug() << "Start calculation with stc:" << t_sFileNameStc; // Load data fiff_int_t setno = 0; QPair<QVariant, QVariant> baseline(QVariant(), 0); FiffEvoked evoked(t_fileEvoked, setno, baseline); if(evoked.isEmpty()) return 1; std::cout << "evoked first " << evoked.first << "; last " << evoked.last << std::endl; MNEForwardSolution t_Fwd(t_fileFwd); if(t_Fwd.isEmpty()) return 1; QStringList ch_sel_names = t_Fwd.info.ch_names; FiffEvoked pickedEvoked = evoked.pick_channels(ch_sel_names); // // Cluster forward solution; // MNEForwardSolution t_clusteredFwd = t_Fwd.cluster_forward_solution(t_annotationSet, 20);//40); // std::cout << "Size " << t_clusteredFwd.sol->data.rows() << " x " << t_clusteredFwd.sol->data.cols() << std::endl; // std::cout << "Clustered Fwd:\n" << t_clusteredFwd.sol->data.row(0) << std::endl; PwlRapMusic t_pwlRapMusic(t_clusteredFwd, false, numDipolePairs); if(doMovie) t_pwlRapMusic.setStcAttr(200,0.5); MNESourceEstimate sourceEstimate = t_pwlRapMusic.calculateInverse(pickedEvoked); std::cout << "source estimated" << std::endl; if(sourceEstimate.isEmpty()) return 1; View3D::SPtr testWindow = View3D::SPtr(new View3D()); testWindow->addBrainData("HemiLRSet", t_surfSet, t_annotationSet); QList<BrainRTSourceLocDataTreeItem*> rtItemList = testWindow->addRtBrainData("HemiLRSet", sourceEstimate, t_clusteredFwd); testWindow->show(); Control3DWidget::SPtr control3DWidget = Control3DWidget::SPtr(new Control3DWidget()); control3DWidget->setView3D(testWindow); control3DWidget->show(); if(!t_sFileNameStc.isEmpty()) { QFile t_fileClusteredStc(t_sFileNameStc); sourceEstimate.write(t_fileClusteredStc); } return app.exec(); }