90 if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
91 qWarning() <<
"[InvSourceEstimateIO::readCsv] Cannot open:" << sPath;
95 QTextStream in(&file);
96 const QString delim(QChar::fromLatin1(cDelim));
99 QString header = in.readLine();
100 QStringList headerParts = header.split(delim, Qt::SkipEmptyParts);
101 if (headerParts.size() < 2) {
102 qWarning() <<
"[InvSourceEstimateIO::readCsv] Invalid header.";
107 int nVertices = headerParts.size() - 1;
108 VectorXi vertices(nVertices);
109 for (
int v = 0; v < nVertices; ++v) {
110 vertices(v) = headerParts[v + 1].toInt();
114 QList<VectorXd> timePoints;
117 while (!in.atEnd()) {
118 QString line = in.readLine().trimmed();
122 QStringList parts = line.split(delim, Qt::SkipEmptyParts);
123 if (parts.size() < nVertices + 1)
126 times.append(parts[0].toDouble());
127 VectorXd row(nVertices);
128 for (
int v = 0; v < nVertices; ++v) {
129 row(v) = parts[v + 1].toDouble();
131 timePoints.append(row);
136 if (timePoints.isEmpty()) {
141 MatrixXd data(nVertices, timePoints.size());
142 for (
int t = 0; t < timePoints.size(); ++t) {
143 data.col(t) = timePoints[t];
146 float tmin =
static_cast<float>(times[0]);
147 float tstep = (times.size() > 1)
148 ?
static_cast<float>(times[1] - times[0])