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 printf(
"Raw file name does not end properly\n");
103 t_EventFile.setFileName(eventName);
105 printf(
"Error while read events.\n");
108 printf(
"Events read from %s\n",eventName.toUtf8().constData());
111 if (eventName.contains(
".fif")) {
112 t_EventFile.setFileName(eventName);
114 printf(
"Error while read events.\n");
117 printf(
"Binary event file %s read\n",eventName.toUtf8().constData());
118 }
else if(eventName.contains(
".eve")){
122 printf(
"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 printf(
"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 printf(
"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> simpleList;
225 while(!textStream.atEnd()){
227 textStream >> iSample;
228 simpleList.append(iSample);
229 textStream.readLine();
230 qDebug() <<
"Added event:" << iSample;
233 p_Events.
events.resize(simpleList.size(), 1);
235 for(
int i = 0; i < simpleList.size(); i++){
236 p_Events.
events(i,0) = simpleList[i];
265 if (!p_IODevice.open(QIODevice::WriteOnly | QIODevice::Text))
268 for (
int k = 0; k <
events.rows(); ++k) {
269 int sample =
events(k, 0);
272 float time = (sfreq > 0.0f) ?
static_cast<float>(sample) / sfreq : 0.0f;
273 QTextStream out(&p_IODevice);
274 out << QString(
"%1 %2 %3 %4\n")
276 .arg(time, -10,
'f', 3)
289 const QString &triggerCh,
290 unsigned int triggerMask,
293 QString stimCh = triggerCh.isEmpty() ? QString(
"STI 014") : triggerCh;
296 int triggerChIdx = -1;
303 if (triggerChIdx < 0) {
304 qWarning() <<
"[FiffEvents::detect_from_raw] Trigger channel" << stimCh <<
"not found.";
312 RowVectorXi::LinSpaced(1, triggerChIdx, triggerChIdx))) {
313 qWarning() <<
"[FiffEvents::detect_from_raw] Could not read trigger channel data.";
317 RowVectorXd trigData = data.row(0);
318 int nSamples =
static_cast<int>(trigData.cols());
321 QList<int> eventSamples;
322 QList<int> eventBefore;
323 QList<int> eventAfter;
325 int prevVal =
static_cast<int>(trigData(0)) & triggerMask;
326 for (
int s = 1; s < nSamples; ++s) {
327 int curVal =
static_cast<int>(trigData(s)) & triggerMask;
328 if (curVal != prevVal) {
329 if (!leadingEdge || (leadingEdge && prevVal == 0 && curVal != 0)) {
330 eventSamples.append(
static_cast<int>(raw.
first_samp) + s);
331 eventBefore.append(prevVal);
332 eventAfter.append(curVal);
338 int nEvents = eventSamples.size();
339 p_Events.
events.resize(nEvents, 3);
340 for (
int k = 0; k < nEvents; ++k) {
341 p_Events.
events(k, 0) = eventSamples[k];
342 p_Events.
events(k, 1) = eventBefore[k];
343 p_Events.
events(k, 2) = eventAfter[k];
355 if (eventIdx < 0 || eventIdx >=
events.rows())
358 int evFrom =
events(eventIdx, 1);
359 int evTo =
events(eventIdx, 2);
363 for (
int k = 0; k < cat.
events.size(); ++k) {
364 if ((evFrom & ~cat.
ignore) == 0 &&
376 for (
int j = eventIdx - 1; j >= 0; --j) {
390 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
static FiffStream::SPtr start_file(QIODevice &p_IODevice)
QSharedPointer< FiffStream > SPtr
QSharedPointer< FiffTag > SPtr