From 94695808342b6bd44129d5b61454255c79996c18 Mon Sep 17 00:00:00 2001 From: valentin-pinkau Date: Mon, 16 Dec 2024 15:18:42 +0100 Subject: [PATCH] working receptor densities and streamline counts --- +siibra/+internal/API.m | 26 ++++++- +siibra/+items/+features/ReceptorDensity.m | 9 +-- +siibra/+items/+features/StreamlineCounts.m | 73 +++++------------- +siibra/+items/Parcellation.m | 17 +--- ...06_spatial_properties_of_brain_regions.mlx | Bin 4948 -> 4925 bytes walkthrough.mlx | Bin 1506754 -> 1513206 bytes 6 files changed, 52 insertions(+), 73 deletions(-) diff --git a/+siibra/+internal/API.m b/+siibra/+internal/API.m index 9291c82..f54644a 100644 --- a/+siibra/+internal/API.m +++ b/+siibra/+internal/API.m @@ -5,7 +5,6 @@ %Endpoint = "https://siibra-api-stable.apps.hbp.eu/v1_0/" %EndpointV2 = "https://siibra-api-stable.apps.hbp.eu/v2_0" EndpointV3 = "https://siibra-api-stable.apps.hbp.eu/v3_0/" - %EndpointV3 = "https://siibra-api-prod.apps.tc.humanbrainproject.eu/v3_0/" end methods (Static) @@ -136,6 +135,31 @@ "®ion_id=" + region.Name; absoluteLink = siibra.internal.API.absoluteLinkV3(relativeLink); end + function features = regionalConnectivity(parcellation, type) + relativeLink = "feature/RegionalConnectivity"; + absoluteLink = siibra.internal.API.absoluteLinkV3(relativeLink); + parameters = ["parcellation_id=" + parcellation.Id, "type=" + type]; + features = siibra.internal.API.collectItemsAcrossPages(absoluteLink, parameters); + end + function absoluteLink = streamlineCountsForSubject(streamlineCounts, subject) + relativeLink = "feature/RegionalConnectivity/" + streamlineCounts.FeatureId + ... + "?parcellation_id=" + streamlineCounts.Parcellation.Id + ... + "&type=StreamlineCounts"; + + if ~isempty(subject) + relativeLink = relativeLink + "&subject=" + subject; + end + + absoluteLink = siibra.internal.API.absoluteLinkV3(relativeLink); + end + + function downloadFeature(path, featureId) + relativeLink = "feature/" + featureId + "/download"; + absoluteLink = siibra.internal.API.absoluteLinkV3(relativeLink); + siibra.internal.API.doWebsaveWithLongTimeout(path, absoluteLink); + end + + end end diff --git a/+siibra/+items/+features/ReceptorDensity.m b/+siibra/+items/+features/ReceptorDensity.m index 7074a23..c3bb3fc 100644 --- a/+siibra/+items/+features/ReceptorDensity.m +++ b/+siibra/+items/+features/ReceptorDensity.m @@ -25,11 +25,10 @@ siibra.internal.API.tabularFeature( ... obj.Region, ... obj.Id)); - fingerprintStruct = fingerprintJson.data.fingerprints; - receptors = fieldnames(fingerprintStruct); - means = arrayfun(@(i) fingerprintStruct.(receptors{i}).mean, 1:numel(receptors)); - stds = arrayfun(@(i) fingerprintStruct.(receptors{i}).std, 1:numel(receptors)); - fingerprints = table(means.', stds.', 'VariableNames', ["Mean", "Std"], 'RowNames', receptors); + data = fingerprintJson.data.data; + column_names = fingerprintJson.data.columns; + row_names = fingerprintJson.data.index; + fingerprints = array2table(data, 'VariableNames', column_names, 'RowNames', row_names ); end end end diff --git a/+siibra/+items/+features/StreamlineCounts.m b/+siibra/+items/+features/StreamlineCounts.m index 6a53583..7c7db0b 100644 --- a/+siibra/+items/+features/StreamlineCounts.m +++ b/+siibra/+items/+features/StreamlineCounts.m @@ -6,11 +6,8 @@ Parcellation (1, :) siibra.items.Parcellation Name (1, 1) string Cohort (1, 1) string - Subject (1, 1) string - Authors (1, :) string + Subjects (1, :) string Description (1, 1) string - % Citation (1, 1) string - Matrix uint8 FeatureId (1, 1) string end @@ -21,57 +18,29 @@ obj.Parcellation = parcellation; obj.Name = featureJson.name; obj.Cohort = featureJson.cohort; - obj.Subject = featureJson.subject; - obj.Authors = featureJson.authors; + obj.Subjects = featureJson.subjects; obj.Description = featureJson.description; - % obj.Citation = featureJson.citation; - obj.FeatureId = featureJson.x_id; + obj.FeatureId = featureJson.id; end - function connectivityMatrix = get.Matrix(obj) - featureIdNormalized = obj.FeatureId.replace("/", "-"); - matrixCachePath = siibra.internal.cache(featureIdNormalized + ".mat", "parcellation_features"); - if ~isfile(matrixCachePath) - matrixJson = siibra.internal.API.doWebreadWithLongTimeout( ... - siibra.internal.API.parcellationFeature( ... - obj.Parcellation.Atlas.Id, ... - obj.Parcellation.Id, ... - obj.FeatureId) ... - ); - encodedMatrix = matrixJson.matrix.content; - dim1 = matrixJson.matrix.x_height; - dim2 = matrixJson.matrix.x_width; - decodedMatrix = matlab.net.base64decode(encodedMatrix); - - % write decoded and compressed matrix to file - compressedMatrixCachePath = siibra.internal.cache(featureIdNormalized + ".bin.gzip", "parcellation_features"); - f = fopen(compressedMatrixCachePath, "w"); - fwrite(f, decodedMatrix); - fclose(f); - - % decompress file and read it again - binaryMatrixCachePath = siibra.internal.cache(featureIdNormalized + ".bin", "parcellation_features"); - gunzip(compressedMatrixCachePath, siibra.internal.cache("", "parcellation_features")); - f = fopen(binaryMatrixCachePath, "r"); - decompressedMatrix = fread(f, matrixJson.matrix.dtype); - fclose(f); - - % delete intermediate files - delete(compressedMatrixCachePath) - delete(binaryMatrixCachePath) - - matrix = reshape(decompressedMatrix, dim1, dim2); - - connectivityMatrix = array2table(matrix); - columnNameLengths = cellfun(@(n) strlength(n), matrixJson.columns); - columnNamesToBeTrimmed = matrixJson.columns(columnNameLengths > 63); - matrixJson.columns(columnNameLengths > 63) = cellfun(@(n) n(1:63), columnNamesToBeTrimmed, 'UniformOutput',false); - connectivityMatrix.Properties.VariableNames = matrixJson.columns; - connectivityMatrix.Properties.RowNames = matrixJson.columns; - % cache matrix - save(matrixCachePath, "connectivityMatrix"); - end - connectivityMatrix = load(matrixCachePath, "connectivityMatrix").connectivityMatrix; + function connectivityMatrix = connectivityMatrixForSubject(obj, subject) + response = siibra.internal.API.doWebreadWithLongTimeout( ... + siibra.internal.API.streamlineCountsForSubject( ... + obj, subject ... + ) ... + ); + matrixStruct = getfield(response.matrices, "x" + subject); + connectivityMatrix = array2table(matrixStruct.data, "VariableNames", {matrixStruct.columns.name}, 'RowNames', {matrixStruct.index.name}); + end + function connectivityMatrix = averagedConnectivityMatrix(obj) + % leaving the subject field empty gives us the averaged matrix + response = siibra.internal.API.doWebreadWithLongTimeout( ... + siibra.internal.API.streamlineCountsForSubject( ... + obj, string.empty ... + ) ... + ); + matrixStruct = response.matrices.x_average; + connectivityMatrix = array2table(matrixStruct.data, "VariableNames", {matrixStruct.columns.name}, 'RowNames', {matrixStruct.index.name}); end end end diff --git a/+siibra/+items/Parcellation.m b/+siibra/+items/Parcellation.m index b0364af..16ba3b1 100644 --- a/+siibra/+items/Parcellation.m +++ b/+siibra/+items/Parcellation.m @@ -84,22 +84,9 @@ parentRegion = obj.RegionTree.Nodes.Region(parentId); end - function features = getAllFeatures(obj) - error("API v3 has no features on parcellation level!"); - cached_file_name = siibra.internal.cache(obj.Name + ".mat", "parcellation_features"); - if ~isfile(cached_file_name) - features = siibra.internal.API.featuresForParcellation(obj.Atlas.Id, obj.Id); - save(cached_file_name, 'features'); - else - load(cached_file_name, 'features') - end - - end - function streamlineCounts = getStreamlineCounts(obj) - allFeatures = obj.getAllFeatures(); - streamlineCountIdx = arrayfun(@(e) strcmp(e.x_type,'siibra/features/connectivity/streamlineCounts'), allFeatures); - streamlineCounts = arrayfun(@(json) siibra.items.features.StreamlineCounts(obj, json), allFeatures(streamlineCountIdx)); + streamlineCountsJson = siibra.internal.API.regionalConnectivity(obj, "StreamlineCounts"); + streamlineCounts = arrayfun(@(json) siibra.items.features.StreamlineCounts(obj, json), streamlineCountsJson); end end diff --git a/step-by-step/01_atlases_and_brain_parcellations/06_spatial_properties_of_brain_regions.mlx b/step-by-step/01_atlases_and_brain_parcellations/06_spatial_properties_of_brain_regions.mlx index 8fefb15f4c832870a509e271c5190b716df47f5b..86a33830af0adcdefd93184b73bc791a06e7de4f 100644 GIT binary patch delta 2172 zcmV-?2!r?3CcP%GKLrY8NMU9^2LJ$*F_TFJBV1@&EHO?0+fzNHNsDDz(xB#mtWIp;mV`7T7!wm3mBb5x$Q5Gp4u}c=A?{zQQQxTQU))vgD^<5>h*fR_r#z8W4 zuc&-)yO_VHe&jKG1swb~3}_^oi&qWb&^zM39x2k955e+F3*$Vt2xN{kxZi(5uHc5i z&7ISPbK=8X|9yG`qq5c;+X2Di)YigF`a+Fs^mhjF`$$#HXSbPt^XYm? zlucr(4Qc*WE50|Tq8Buprs?V^!i=}l>|a|o{2tKaEm>v+rG^~zgbCbLnVrg_sO zE8lE&-aNI?7L04RbD7~g9r^?0gi57y zfHBC$6CV4r#zs0Zz-NZxL($k{5~q+OSQHrpc^xaRrXOsbgL{8I>#^pj-|mr7oi&>t z>5n?iZqVv9{C0zQ&eFR2P7c=e>ElF9XarHu&uM8Ttph4nBd37SNp7P9bVhWDzCmYR z;5-)-HpTHwSSNRd_lm~dekkLn`BbGzbYAhXttuwm6N&Va6zU0JJq5ZMdLDAAk|-HZ zUpS9|_s-YjJrIA4$xH-Hpg<=RLC5Tg;(wIlqvJzF+6{EL|LO=e>h-<{(J9tzQi1m5 zbOOmoaPNurf1Gv5_7G7T-6v}AL9I-w$L>*toNE2D8pH@yFF{P%0h9@bVJi&EJ*YVJ zRQQtA>a{xdY2XEc*WPXQ8lBzNC?LDNAb@Y3QI9rB5cGdoV?~*p{cCxUr%NWXPC0gx(ig+vvn(8 zSd7}C^PKG(A1ahJBYDx8ji1%Oe6AyV*s{Y1OnQQ+vl95$@ccS>duSJ09^R*3$WEvV z!IJS$5^jHDjCJal0j ztLyo4*SlC4L@nmLHvaS|{Hy=fvTvDJB|?RXjJU@>aCXH+nFB4$SIHEoT5X0@8!c(0 zei#03S~S{+Q-=&G7f>`LLJJ~->N%ln0e#QRbBBKcB3sLYnyHk{=Gcytm~C$rF7rCp z#DWYQ&~GI-bJ@oibB8{mF^kTNB+X(Fnn1GA?tJ;&M1GRN+_!`exP;@>^c{`I#`zJs zC2|U$$=*;;C6+AUU?!ATKGd!WLMBQW0FS_XNd2MQXF}y~_sB}eJW%{_0tdG;H(E%p z;Xr@((c5)C0e(GYP2mmHC;wiIUn9J0Lazh+wP{0jrqT49sL|*n_nJJ=Yxw4t%_(H8-cc2inddTwo?&pb0g5UO3`);(RP0; zqHPsmY8Ui%3i`Sm!Bo4Hsa_#dy^2irHUe#@6fG$Z=%i{y?{5U&ZaLoKkWMPc^vy_N zy>h_CagJ0CbYwHKSic-_u>+H;9!xePk&!iOGE!WWk*bKlMl!Qi>Ro`#%d*CbDzs|Q zy7|avC19MZ$94bG|5p43P)h>@6aWkW00;m803iThB?TXo#|$=q>Rd?MU1)ZtiHS8D z?+88Hh=meByS=@vu661XFUkL%FNgCNtG#Z~2RN@fQ(~HC7=e*pqs+F%PxU%kV&sD` zjc7XqB|d=1XjRP$X}RniJh;w+3kp1nCgZuZCEkT#IU!!|KntHn!o+aXIW0nbx-GFn zzKJammSqc~A&5qQ1VN6%#7;(hQZ{l@+IQCuf<_W(L4ygN(3FyIR;zHZaB*S`&*%V7 z`-||9Oyu6HiR$}4?dJm*_ow9L{_b)3YNE{XRuXVEL#Q~}xpW``G$=aw*KT9-JiocE z*SKOCV@bvmx~yr=8RJ*iuLb!v|HG+cMH}^>G*4)hE^5jXcs}R(xpWl7D#@QNtJx<| zO9KRxPZAolC=RIu3S>xOWf%`lfM!ilP?n=2Ja960000{z$eN8 delta 2196 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 E0H>qxd;kCd