v2.0.0
Loading...
Searching...
No Matches
mna_port.cpp
Go to the documentation of this file.
1//=============================================================================================================
34
35//=============================================================================================================
36// INCLUDES
37//=============================================================================================================
38
39#include "mna_port.h"
40
41//=============================================================================================================
42// USED NAMESPACES
43//=============================================================================================================
44
45using namespace MNALIB;
46
47//=============================================================================================================
48// STATIC HELPERS
49//=============================================================================================================
50
51static QString dataKindToString(MnaDataKind kind)
52{
53 switch (kind) {
54 case MnaDataKind::FiffRaw: return QStringLiteral("fiff_raw");
55 case MnaDataKind::Forward: return QStringLiteral("forward");
56 case MnaDataKind::Inverse: return QStringLiteral("inverse");
57 case MnaDataKind::Covariance: return QStringLiteral("covariance");
58 case MnaDataKind::SourceEstimate: return QStringLiteral("source_estimate");
59 case MnaDataKind::Epochs: return QStringLiteral("epochs");
60 case MnaDataKind::Evoked: return QStringLiteral("evoked");
61 case MnaDataKind::Matrix: return QStringLiteral("matrix");
62 case MnaDataKind::Volume: return QStringLiteral("volume");
63 case MnaDataKind::Surface: return QStringLiteral("surface");
64 case MnaDataKind::Bem: return QStringLiteral("bem");
65 case MnaDataKind::Annotation: return QStringLiteral("annotation");
66 case MnaDataKind::Label: return QStringLiteral("label");
67 case MnaDataKind::RealTimeStream: return QStringLiteral("real_time_stream");
68 case MnaDataKind::Custom: return QStringLiteral("custom");
69 }
70 return QStringLiteral("custom");
71}
72
73//=============================================================================================================
74
75static MnaDataKind dataKindFromString(const QString& str)
76{
77 if (str == QLatin1String("fiff_raw")) return MnaDataKind::FiffRaw;
78 if (str == QLatin1String("forward")) return MnaDataKind::Forward;
79 if (str == QLatin1String("inverse")) return MnaDataKind::Inverse;
80 if (str == QLatin1String("covariance")) return MnaDataKind::Covariance;
81 if (str == QLatin1String("source_estimate")) return MnaDataKind::SourceEstimate;
82 if (str == QLatin1String("epochs")) return MnaDataKind::Epochs;
83 if (str == QLatin1String("evoked")) return MnaDataKind::Evoked;
84 if (str == QLatin1String("matrix")) return MnaDataKind::Matrix;
85 if (str == QLatin1String("volume")) return MnaDataKind::Volume;
86 if (str == QLatin1String("surface")) return MnaDataKind::Surface;
87 if (str == QLatin1String("bem")) return MnaDataKind::Bem;
88 if (str == QLatin1String("annotation")) return MnaDataKind::Annotation;
89 if (str == QLatin1String("label")) return MnaDataKind::Label;
90 if (str == QLatin1String("real_time_stream")) return MnaDataKind::RealTimeStream;
92}
93
94//=============================================================================================================
95
96static QString portDirToString(MnaPortDir dir)
97{
98 switch (dir) {
99 case MnaPortDir::Input: return QStringLiteral("input");
100 case MnaPortDir::Output: return QStringLiteral("output");
101 }
102 return QStringLiteral("input");
103}
104
105//=============================================================================================================
106
107static MnaPortDir portDirFromString(const QString& str)
108{
109 if (str == QLatin1String("output")) return MnaPortDir::Output;
110 return MnaPortDir::Input;
111}
112
113//=============================================================================================================
114// DEFINE MEMBER METHODS
115//=============================================================================================================
116
117QJsonObject MnaPort::toJson() const
118{
119 QJsonObject json = extras;
120 json[QLatin1String("name")] = name;
121 json[QLatin1String("data_kind")] = dataKindToString(dataKind);
122 json[QLatin1String("direction")] = portDirToString(direction);
123
124 if (!sourceNodeId.isEmpty())
125 json[QLatin1String("source_node")] = sourceNodeId;
126 if (!sourcePortName.isEmpty())
127 json[QLatin1String("source_port")] = sourcePortName;
128
129 if (!streamProtocol.isEmpty()) {
130 json[QLatin1String("stream_protocol")] = streamProtocol;
131 json[QLatin1String("stream_endpoint")] = streamEndpoint;
132 json[QLatin1String("stream_buffer_ms")] = streamBufferMs;
133 }
134
135 if (!cachedResultPath.isEmpty())
136 json[QLatin1String("cached_result")] = cachedResultPath;
137 if (!cachedResultHash.isEmpty())
138 json[QLatin1String("cached_result_hash")] = cachedResultHash;
139
140 return json;
141}
142
143//=============================================================================================================
144
145MnaPort MnaPort::fromJson(const QJsonObject& json)
146{
147 MnaPort port;
148 port.name = json[QLatin1String("name")].toString();
149 port.dataKind = dataKindFromString(json[QLatin1String("data_kind")].toString());
150 port.direction = portDirFromString(json[QLatin1String("direction")].toString());
151 port.sourceNodeId = json[QLatin1String("source_node")].toString();
152 port.sourcePortName = json[QLatin1String("source_port")].toString();
153 port.streamProtocol = json[QLatin1String("stream_protocol")].toString();
154 port.streamEndpoint = json[QLatin1String("stream_endpoint")].toString();
155 port.streamBufferMs = json[QLatin1String("stream_buffer_ms")].toInt(0);
156 port.cachedResultPath = json[QLatin1String("cached_result")].toString();
157 port.cachedResultHash = json[QLatin1String("cached_result_hash")].toString();
158
159 static const QSet<QString> knownKeys = {
160 QStringLiteral("name"), QStringLiteral("data_kind"),
161 QStringLiteral("direction"), QStringLiteral("source_node"),
162 QStringLiteral("source_port"), QStringLiteral("stream_protocol"),
163 QStringLiteral("stream_endpoint"), QStringLiteral("stream_buffer_ms"),
164 QStringLiteral("cached_result"), QStringLiteral("cached_result_hash")
165 };
166 for (auto it = json.constBegin(); it != json.constEnd(); ++it) {
167 if (!knownKeys.contains(it.key()))
168 port.extras.insert(it.key(), it.value());
169 }
170
171 return port;
172}
173
174//=============================================================================================================
175
176QCborMap MnaPort::toCbor() const
177{
178 QCborMap cbor = QCborMap::fromJsonObject(extras);
179 cbor[QLatin1String("name")] = name;
180 cbor[QLatin1String("data_kind")] = dataKindToString(dataKind);
181 cbor[QLatin1String("direction")] = portDirToString(direction);
182
183 if (!sourceNodeId.isEmpty())
184 cbor[QLatin1String("source_node")] = sourceNodeId;
185 if (!sourcePortName.isEmpty())
186 cbor[QLatin1String("source_port")] = sourcePortName;
187 if (!streamProtocol.isEmpty()) {
188 cbor[QLatin1String("stream_protocol")] = streamProtocol;
189 cbor[QLatin1String("stream_endpoint")] = streamEndpoint;
190 cbor[QLatin1String("stream_buffer_ms")] = streamBufferMs;
191 }
192 if (!cachedResultPath.isEmpty())
193 cbor[QLatin1String("cached_result")] = cachedResultPath;
194 if (!cachedResultHash.isEmpty())
195 cbor[QLatin1String("cached_result_hash")] = cachedResultHash;
196
197 return cbor;
198}
199
200//=============================================================================================================
201
202MnaPort MnaPort::fromCbor(const QCborMap& cbor)
203{
204 MnaPort port;
205 port.name = cbor[QLatin1String("name")].toString();
206 port.dataKind = dataKindFromString(cbor[QLatin1String("data_kind")].toString());
207 port.direction = portDirFromString(cbor[QLatin1String("direction")].toString());
208 port.sourceNodeId = cbor[QLatin1String("source_node")].toString();
209 port.sourcePortName = cbor[QLatin1String("source_port")].toString();
210 port.streamProtocol = cbor[QLatin1String("stream_protocol")].toString();
211 port.streamEndpoint = cbor[QLatin1String("stream_endpoint")].toString();
212 port.streamBufferMs = cbor[QLatin1String("stream_buffer_ms")].toInteger();
213 port.cachedResultPath = cbor[QLatin1String("cached_result")].toString();
214 port.cachedResultHash = cbor[QLatin1String("cached_result_hash")].toString();
215
216 static const QSet<QString> knownKeys = {
217 QStringLiteral("name"), QStringLiteral("data_kind"),
218 QStringLiteral("direction"), QStringLiteral("source_node"),
219 QStringLiteral("source_port"), QStringLiteral("stream_protocol"),
220 QStringLiteral("stream_endpoint"), QStringLiteral("stream_buffer_ms"),
221 QStringLiteral("cached_result"), QStringLiteral("cached_result_hash")
222 };
223 QJsonObject cborJson = cbor.toJsonObject();
224 for (auto it = cborJson.constBegin(); it != cborJson.constEnd(); ++it) {
225 if (!knownKeys.contains(it.key()))
226 port.extras.insert(it.key(), it.value());
227 }
228
229 return port;
230}
MnaPort struct declaration — typed input/output slot on a graph node.
MNE Analysis Container Format (mna/mnx).
MnaDataKind
Definition mna_types.h:90
@ FiffRaw
Raw MEG/EEG data (FIFF format).
Definition mna_types.h:91
@ Annotation
FreeSurfer annotation / parcellation.
Definition mna_types.h:102
@ Forward
Forward solution.
Definition mna_types.h:92
@ SourceEstimate
Source-level time series.
Definition mna_types.h:95
@ Custom
User-defined data kind.
Definition mna_types.h:105
@ Bem
BEM model.
Definition mna_types.h:101
@ Inverse
Inverse operator.
Definition mna_types.h:93
@ Surface
Surface mesh (FreeSurfer).
Definition mna_types.h:100
@ Label
ROI label.
Definition mna_types.h:103
@ Volume
MRI volume data.
Definition mna_types.h:99
@ Covariance
Noise or data covariance matrix.
Definition mna_types.h:94
@ RealTimeStream
Live data channel (MNE Scan / LSL / FIFF-RT).
Definition mna_types.h:104
@ Epochs
Epoched data.
Definition mna_types.h:96
@ Evoked
Averaged evoked response.
Definition mna_types.h:97
@ Matrix
Generic Eigen matrix (for intermediate results).
Definition mna_types.h:98
Graph port descriptor.
Definition mna_port.h:68
QString cachedResultHash
SHA-256 for invalidation.
Definition mna_port.h:92
QString name
Port name (unique within a node).
Definition mna_port.h:69
QJsonObject toJson() const
Definition mna_port.cpp:117
QString sourcePortName
Which output port on that node?
Definition mna_port.h:75
MnaDataKind dataKind
Data kind flowing through this port.
Definition mna_port.h:70
MnaPortDir direction
Input or Output.
Definition mna_port.h:71
QCborMap toCbor() const
Definition mna_port.cpp:176
QString cachedResultPath
Relative path to cached result.
Definition mna_port.h:91
int streamBufferMs
Ring-buffer length in ms (0 = unbounded).
Definition mna_port.h:88
QString streamEndpoint
Protocol-specific address (e.g. "localhost:4218" for fiff-rt).
Definition mna_port.h:87
QJsonObject extras
Unknown keys preserved for lossless round-trip.
Definition mna_port.h:93
static MnaPort fromJson(const QJsonObject &json)
Definition mna_port.cpp:145
QString sourceNodeId
Which node produces this input? (empty → graph-level input).
Definition mna_port.h:74
static MnaPort fromCbor(const QCborMap &cbor)
Definition mna_port.cpp:202
QString streamProtocol
"fiff-rt", "lsl", "ftbuffer", "shm", "" = internal signal/slot
Definition mna_port.h:86