86 const QString &t_fileRawName,
89 QString eventName = t_sEventName;
93 if (eventName.isEmpty()) {
94 eventName = t_fileRawName;
95 p = eventName.indexOf(
".fif");
97 eventName.replace(p, 4,
"-eve.fif");
99 qWarning(
"Raw file name does not end properly\n");
103 t_EventFile.setFileName(eventName);
105 qWarning(
"Error while read events.\n");
108 qInfo(
"Events read from %s\n",eventName.toUtf8().constData());
111 if (eventName.contains(
".fif")) {
112 t_EventFile.setFileName(eventName);
114 qWarning(
"Error while read events.\n");
117 qInfo(
"Binary event file %s read\n",eventName.toUtf8().constData());
118 }
else if(eventName.contains(
".eve")){
122 qWarning(
"Text file %s is not supported jet.\n",eventName.toUtf8().constData());
139 if(!t_pStream->open()) {
146 QList<FiffDirNode::SPtr> eventsBlocks = t_pStream->dirtree()->dir_tree_find(
FIFFB_MNE_EVENTS);
148 if (eventsBlocks.size() == 0)
150 qWarning(
"Could not find event data\n");
157 quint32* serial_eventlist_uint =
nullptr;
158 qint32* serial_eventlist_int =
nullptr;
160 for(k = 0; k < eventsBlocks[0]->nent(); ++k)
162 kind = eventsBlocks[0]->dir[k]->kind;
163 pos = eventsBlocks[0]->dir[k]->pos;
166 t_pStream->read_tag(t_pTag,pos);
169 serial_eventlist_uint = t_pTag->toUnsignedInt();
170 nelem = t_pTag->size()/4;
175 serial_eventlist_int = t_pTag->toInt();
176 nelem = t_pTag->size()/4;
183 if(serial_eventlist_uint ==
nullptr && serial_eventlist_int ==
nullptr)
185 qWarning(
"Could not find any events\n");
189 p_Events.
events.resize(nelem/3,3);
190 if(serial_eventlist_uint !=
nullptr)
192 for(k = 0; k < nelem/3; ++k)
194 p_Events.
events(k,0) = serial_eventlist_uint[k*3];
195 p_Events.
events(k,1) = serial_eventlist_uint[k*3+1];
196 p_Events.
events(k,2) = serial_eventlist_uint[k*3+2];
200 if(serial_eventlist_int !=
nullptr)
202 for(k = 0; k < nelem/3; ++k)
204 p_Events.
events(k,0) = serial_eventlist_int[k*3];
205 p_Events.
events(k,1) = serial_eventlist_int[k*3+1];
206 p_Events.
events(k,2) = serial_eventlist_int[k*3+2];
218 if (!p_IODevice.open(QIODevice::ReadOnly | QIODevice::Text)){
221 QTextStream textStream(&p_IODevice);
223 QList<int> sampleList;
224 QList<int> beforeList;
225 QList<int> afterList;
227 while(!textStream.atEnd()){
228 QString line = textStream.readLine().trimmed();
231 QTextStream lineStream(&line);
232 int iSample = 0, iBefore = 0, iAfter = 0;
233 lineStream >> iSample;
234 if (!lineStream.atEnd())
235 lineStream >> iBefore;
236 if (!lineStream.atEnd())
237 lineStream >> iAfter;
238 sampleList.append(iSample);
239 beforeList.append(iBefore);
240 afterList.append(iAfter);
241 qDebug() <<
"Added event:" << iSample << iBefore << iAfter;
244 p_Events.
events.resize(sampleList.size(), 3);
246 for(
int i = 0; i < sampleList.size(); i++){
247 p_Events.
events(i,0) = sampleList[i];
248 p_Events.
events(i,1) = beforeList[i];
249 p_Events.
events(i,2) = afterList[i];
278 if (!p_IODevice.open(QIODevice::WriteOnly | QIODevice::Text))
281 for (
int k = 0; k <
events.rows(); ++k) {
282 int sample =
events(k, 0);
285 float time = (sfreq > 0.0f) ?
static_cast<float>(sample) / sfreq : 0.0f;
286 QTextStream out(&p_IODevice);
287 out << QString(
"%1 %2 %3 %4\n")
289 .arg(time, -10,
'f', 3)
302 const QString &triggerCh,
303 unsigned int triggerMask,
306 QString stimCh = triggerCh.isEmpty() ? QString(
"STI 014") : triggerCh;
309 int triggerChIdx = -1;
316 if (triggerChIdx < 0) {
317 qWarning() <<
"[FiffEvents::detect_from_raw] Trigger channel" << stimCh <<
"not found.";
325 RowVectorXi::LinSpaced(1, triggerChIdx, triggerChIdx))) {
326 qWarning() <<
"[FiffEvents::detect_from_raw] Could not read trigger channel data.";
330 RowVectorXd trigData = data.row(0);
331 int nSamples =
static_cast<int>(trigData.cols());
334 QList<int> eventSamples;
335 QList<int> eventBefore;
336 QList<int> eventAfter;
338 int prevVal =
static_cast<int>(trigData(0)) & triggerMask;
339 for (
int s = 1; s < nSamples; ++s) {
340 int curVal =
static_cast<int>(trigData(s)) & triggerMask;
341 if (curVal != prevVal) {
342 if (!leadingEdge || (leadingEdge && prevVal == 0 && curVal != 0)) {
343 eventSamples.append(
static_cast<int>(raw.
first_samp) + s);
344 eventBefore.append(prevVal);
345 eventAfter.append(curVal);
351 int nEvents = eventSamples.size();
352 p_Events.
events.resize(nEvents, 3);
353 for (
int k = 0; k < nEvents; ++k) {
354 p_Events.
events(k, 0) = eventSamples[k];
355 p_Events.
events(k, 1) = eventBefore[k];
356 p_Events.
events(k, 2) = eventAfter[k];
368 if (eventIdx < 0 || eventIdx >=
events.rows())
371 int evFrom =
events(eventIdx, 1);
372 int evTo =
events(eventIdx, 2);
376 for (
int k = 0; k < cat.
events.size(); ++k) {
377 if ((evFrom & ~cat.
ignore) == 0 &&
389 for (
int j = eventIdx - 1; j >= 0; --j) {
403 for (
int j = eventIdx + 1; j <
events.rows(); ++j) {
FiffTag class declaration, which provides fiff tag I/O and processing methods.
#define FIFF_MNE_EVENT_LIST
FiffStream class declaration.
FiffRawData class declaration.
FiffDirNode class declaration, which provides fiff dir tree processing methods.
FiffEvokedSet class declaration.
Header file describing the numerical values used in fif files.
FiffEvents class declaration.
FIFF file I/O and data structures (raw, epochs, evoked, covariance, forward).
bool write_to_ascii(QIODevice &p_IODevice, float sfreq=0.0f) const
static bool read_from_fif(QIODevice &p_IODevice, FiffEvents &p_Events)
bool write_to_fif(QIODevice &p_IODevice) const
static bool read_from_ascii(QIODevice &p_IODevice, FiffEvents &p_Events)
static bool detect_from_raw(const FiffRawData &raw, FiffEvents &p_Events, const QString &triggerCh=QString("STI 014"), unsigned int triggerMask=0xFFFFFFFF, bool leadingEdge=true)
static bool matchEvent(const AverageCategory &cat, const Eigen::MatrixXi &events, int eventIdx)
static bool read(const QString &t_sEventName, const QString &t_fileRawName, FiffEvents &p_Events)
QVector< unsigned int > events
FIFF raw measurement data.
bool read_raw_segment(Eigen::MatrixXd &data, Eigen::MatrixXd ×, fiff_int_t from=-1, fiff_int_t to=-1, const Eigen::RowVectorXi &sel=defaultRowVectorXi, bool do_debug=false) const
QSharedPointer< FiffStream > SPtr
static FiffStream::SPtr start_file(QIODevice &p_IODevice)
std::unique_ptr< FiffTag > UPtr