in client/client/dataServices/bam/bam-data-service.js [33:163]
getReads(parameters, showClipping, filter) {
const self = this;
const getReadsFn = function(singleParameters) {
const {side, ...props} = singleParameters;
let loadDataFn = null;
switch (side) {
case 'center': {
loadDataFn = ::self.getFullCenter;
}
break;
case 'left': {
loadDataFn = ::self.getFullLeft;
}
break;
case 'right': {
loadDataFn = ::self.getFullRight;
}
break;
default: {
return Promise.resolve();
}
}
if (loadDataFn) {
const resolveFn = function(resolve) {
const catchFn = function() {
resolve({});
};
const thenFn = function(data) {
resolve(data);
};
loadDataFn(props, showClipping, filter).catch(catchFn).then(thenFn);
};
return new Promise(resolveFn);
}
};
if (parameters instanceof Array) {
const promises = [];
for (let i = 0; i < parameters.length; i++) {
promises.push(getReadsFn(parameters[i]));
}
return new Promise((resolve) => {
Promise.all(promises).then(values => {
let result = {
baseCoverage: [],
blocks: [],
downsampleCoverage: [],
chromosome: null,
endIndex: null,
id: null,
minPosition: null,
referenceBuffer: null,
scaleFactor: null,
startIndex: null,
type: 'BAM'
};
for (let i = 0; i < values.length; i++) {
const localResult = values[i];
// merge info
if (!result.id) {
result.id = localResult.id;
}
if (!result.scaleFactor) {
result.scaleFactor = localResult.scaleFactor;
}
if (!result.chromosome) {
result.chromosome = localResult.chromosome;
}
if (!result.startIndex || result.startIndex < localResult.startIndex) {
result.startIndex = localResult.startIndex;
}
if (!result.endIndex || result.endIndex > localResult.endIndex) {
result.endIndex = localResult.endIndex;
}
// merge baseCoverage;
if (localResult.baseCoverage) {
for (let j = 0; j < localResult.baseCoverage.length; j++) {
result.baseCoverage.push(localResult.baseCoverage[j]);
}
}
//downsample coverage
if (localResult.downsampleCoverage) {
for (let j = 0; j < localResult.downsampleCoverage.length; j++) {
result.downsampleCoverage.push(localResult.downsampleCoverage[j]);
}
}
// merge reference buffer
if (localResult.referenceBuffer) {
if (!result.referenceBuffer) {
result.referenceBuffer = localResult.referenceBuffer;
result.minPosition = localResult.minPosition;
} else if (result.minPosition > localResult.minPosition) {
let newBuffer = localResult.referenceBuffer;
const delta = localResult.minPosition + newBuffer.length - result.minPosition;
if (delta > 0) {
newBuffer = newBuffer.slice(0, delta);
} else {
for (let b = 0; b < Math.abs(delta); b++) {
newBuffer += ' ';
}
}
result.referenceBuffer = newBuffer + result.referenceBuffer;
result.minPosition = localResult.minPosition;
} else {
let newBuffer = result.referenceBuffer;
const delta = result.minPosition + newBuffer.length - localResult.minPosition;
if (delta > 0) {
newBuffer = newBuffer.slice(0, delta);
} else {
for (let b = 0; b < Math.abs(delta); b++) {
newBuffer += ' ';
}
}
result.referenceBuffer = newBuffer + localResult.referenceBuffer;
}
}
// merge reads
if (localResult.blocks) {
for (let j = 0; j < localResult.blocks.length; j++) {
result.blocks.push(localResult.blocks[j]);
}
}
}
resolve(result);
result = null;
});
});
} else {
return getReadsFn(parameters);
}
}