in client/client/app/shared/services/api.service.js [82:190]
navigateToCoordinate(coordinates) {
if (!this.projectContext.tracks.length) {
return Promise.resolve({
isSuccessful: false,
message: 'No tracks selected.'
});
}
const coordinatesText = coordinates;
let chrName = null;
let start = null;
let end = null;
//1. '' - should open specified chromosome and range
if (!coordinatesText) {
if (this.projectContext.currentChromosome) {
[start, end] = [1, this.projectContext.currentChromosome.size];
return new Promise((resolve) => {
this.projectContext.changeState(
{viewport: {end, start}},
false,
() => resolve({
isSuccessful: true,
message: 'Ok',
}));
});
} else {
return Promise.resolve({
isSuccessful: false,
message: 'No coordinates provided'
});
}
}
// 'x : start-stop' - default
//'5 : 217 - 7726'.match(/(([0-9a-zA-Z]*)\D*\:)\D*(\d*)\D*\-\D*(\d*)/)
//['5 : 217 - 7726', '5 :', '5', '217', '7726']
const regexp_1 = /(([0-9a-zA-Z\D]*)\D*\:)\D*([0-9,. ]*)\D*\-\D*([0-9,. ]*)/;
//2. 'start-stop' - should open specified range on current chromosome
const regexp_2 = /^([0-9,. ]*)\D*\-\D*([0-9,. ]*)$/;
//3. 'chr:start' - should open specified chromosome and range from start-50bp to start+50bp
const regexp_3 = /^([0-9a-zA-Z\D]*)\D*\:\D*([0-9,. ]*)$/;
//4. 'start' - should open range from start-50bp to start+50bp on current chromosome
const regexp_4 = /^[0-9,. ]+$/;
//5. 'chr:' - should open specified chromosome and range from 1 to end of chromosome
const regexp_5 = /^([0-9a-zA-Z\D]*)\D*:$/;
if (regexp_1.test(coordinatesText)) {
[, , chrName, start, end] = coordinatesText.match(regexp_1);
} else if (regexp_2.test(coordinatesText)) {
[, start, end] = coordinatesText.match(regexp_2);
} else if (regexp_5.test(coordinatesText)) {
[, chrName] = coordinatesText.match(regexp_5);
} else if (regexp_3.test(coordinatesText)) {
[, chrName, start] = coordinatesText.match(regexp_3);
} else if (regexp_4.test(coordinatesText)) {
[start] = coordinatesText.match(regexp_4);
}
if (chrName) {
chrName = chrName.trim();
}
const chr = (!chrName || (this.projectContext.currentChromosome && this.projectContext.currentChromosome.name === chrName))
? this.projectContext.currentChromosome
: this.projectContext.getChromosome({name: chrName});
if (!chr) {
return Promise.resolve({
isSuccessful: false,
message: 'No chromosome found'
});
}
if (start) {
start = stringParseInt(start);
if (start < 1 || (end !== null && start > end) || start > chr.size) {
start = 1;
}
if (end) {
end = stringParseInt(end);
if (end > chr.size) {
end = chr.size;
}
}
} else {
start = 1;
end = chr.size;
}
const viewport = (start && end) ? {end, start} : null;
const position = (start && !end) ? start : null;
return new Promise((resolve) => {
this.projectContext.changeState(
{chromosome: {name: chr.name}, position, viewport},
false,
() => resolve({
isSuccessful: true,
message: 'Ok',
}));
});
}