hra-api
Version:
The Human Reference Atlas (HRA) API deployed to https://apps.humanatlas.io/api/
83 lines (75 loc) • 2.7 kB
JavaScript
import frame from '../frames/tissue-blocks.jsonld';
import query from '../queries/tissue-blocks.rq';
import { executeFilteredConstructQuery } from '../utils/execute-sparql.js';
import { ensureGraphArray, normalizeJsonLd, renameField } from '../utils/jsonld-compat.js';
const ARRAY_FIELDS = new Set(['datasets', 'sections']);
const SINGLE_VALUE_FIELDS = new Set([
// Common fields for all tissue data objects (e.g., blocks, datasets, and sections)
'label',
'description',
'link',
// Tissue block-specific fields
'donor',
'rui_location',
'section_size',
// Donor-specific fields
'provider_name',
// Dataset-specific fields
'technology',
'thumbnail',
]);
const TISSUE_BLOCK_FIELDS = [
'@id',
'@type',
'link',
'label',
'description',
'section_count',
'section_size',
'section_units',
'datasets',
];
function normalizeDonor(donor) {
renameField(donor, 'provider_name', 'providerName');
return donor;
}
function normalizeSections(sections) {
sections = sections.filter((section) => typeof section === 'object');
sections.forEach((section) => {
section.sampleType = 'Tissue Section';
delete section.sample_type;
renameField(section, 'section_number', 'sectionNumber');
});
return sections;
}
function normalizeSpatialEntityId(spatialEntityId) {
if (typeof spatialEntityId === 'object') {
return spatialEntityId['@id'];
}
return spatialEntityId;
}
function normalizeBlock(block) {
const normalizedBlock = {};
TISSUE_BLOCK_FIELDS.forEach((field) => (normalizedBlock[field] = block[field]));
normalizedBlock['sampleType'] = 'Tissue Block';
normalizedBlock['donor'] = normalizeDonor(block['donor']);
normalizedBlock['sections'] = normalizeSections(block['sections']);
normalizedBlock['spatialEntityId'] = normalizeSpatialEntityId(block['rui_location']);
renameField(normalizedBlock, 'section_count', 'sectionCount');
renameField(normalizedBlock, 'section_size', 'sectionSize');
renameField(normalizedBlock, 'section_units', 'sectionUnits');
return normalizedBlock;
}
function reformatResponse(jsonld) {
const data = normalizeJsonLd(ensureGraphArray(jsonld), ARRAY_FIELDS, undefined, SINGLE_VALUE_FIELDS);
return data.filter((block) => block['donor']).map(normalizeBlock);
}
/**
* Retrieves tissue blocks
* @param {Object} filter - An object containing query filters
* @param {string} endpoint - The SPARQL endpoint to connect to
* @returns {Promise<Object>} - A promise that resolves to tissue block data
*/
export async function getTissueBlocks(filter, endpoint = 'https://lod.humanatlas.io/sparql') {
return reformatResponse(await executeFilteredConstructQuery(query, filter, frame, endpoint));
}