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