in client/client/app/components/ngbTracksView/ngbTrack/ngbTrack.events.js [303:509]
async readClick(trackInstance, data, track, event) {
const hasPairRead = data.read.pnext !== undefined && data.read.pnext !== null && data.read.pnext !== 0;
let pairReadParameters = {originalRead: data.read, position: data.read.pnext};
let goToMateMenuItemEvent = null;
let chromosomeNotFoundError = null;
if (hasPairRead) {
let chr = data.chromosome;
let chromosomeChanged = false;
if (data.read.rnext !== '=') {
chr = this.projectContext.getChromosome({name: data.read.rnext});
chromosomeChanged = true;
if (!chr) {
chromosomeNotFoundError = `Chromosome ${data.read.rnext} not found`;
}
}
if (!chromosomeNotFoundError) {
pairReadParameters.endPoint = {
chromosome: chr.name,
position: data.read.pnext
};
} else {
pairReadParameters = null;
}
if (!chromosomeChanged) {
goToMateMenuItemEvent = {position: data.read.pnext};
} else if (pairReadParameters) {
goToMateMenuItemEvent = {
chromosome: {name: pairReadParameters.endPoint.chromosome},
position: data.read.pnext
};
}
}
const goToMateMenuItem = pairReadParameters ? {
state: goToMateMenuItemEvent,
title: goToMateMenuItemEvent ? 'Go to mate' : 'Chromosome not found'
} : null;
const openMateMenuItem = pairReadParameters ? {
events: [{
data: new PairReadInfo(pairReadParameters),
name: 'read:show:mate'
}],
title: 'Open mate region in split view'
} : null;
const showInfo = {
events: [
{
data: {
chromosomeId: track.instance.config.chromosomeId,
endIndex: data.read.endIndex,
properties: data.info,
read: data.read,
referenceId: track.instance.config.referenceId,
startIndex: data.read.startIndex,
geneId: null,
title: 'ALIGNMENT',
infoForRead: {
id: track.id,
projectId: track.project ? track.project.id : undefined,
chromosomeId: data.chromosome.id,
startIndex: data.read.startIndex,
endIndex: data.read.endIndex,
name: data.read.name,
openByUrl: track.openByUrl,
file: track.openByUrl ? track.id : null,
index: track.openByUrl ? track.indexPath : null
}
},
name: 'feature:info:select'
}
],
title: 'Show info'
};
const self = this;
const copyToClipboard = {
clipboard: 'Loading...',
title: 'Copy info to clipboard',
isLoading: true,
fn: async function (menuItem) {
const payload = {
id: track.id,
projectId: track.project ? track.project.id : undefined,
chromosomeId: data.chromosome.id,
startIndex: data.read.startIndex,
endIndex: data.read.endIndex,
name: data.read.name,
openByUrl: track.openByUrl,
file: track.openByUrl ? track.id : null,
index: track.openByUrl ? track.indexPath : null
};
const read = await self._bamDataService.loadRead(payload);
const generalInfo = data.info.map(line => line.join(' = ')).join('\r\n');
const tags = read.tags.map(tag => `${tag.tag} = ${tag.value}`).join('\r\n');
menuItem.clipboard = `${generalInfo}\r\n\r\n${read.sequence}\r\n\r\n${tags}`;
menuItem.isLoading = false;
self.$scope.$apply();
}
};
const copySequenceToClipboard = {
clipboard: 'Loading...',
title: 'Copy sequence to clipboard',
isLoading: true,
fn: async function (menuItem) {
const payload = {
id: track.id,
projectId: track.project ? track.project.id : undefined,
chromosomeId: data.chromosome.id,
startIndex: data.read.startIndex,
endIndex: data.read.endIndex,
name: data.read.name,
openByUrl: track.openByUrl,
file: track.openByUrl ? track.id : null,
index: track.openByUrl ? track.indexPath : null
};
const read = await self._bamDataService.loadRead(payload);
menuItem.clipboard = read.sequence;
menuItem.isLoading = false;
self.$scope.$apply();
}
};
const readInfo = {
geneId: null,
id: track.id,
referenceId: track.referenceId,
chromosomeId: data.chromosome.id,
startIndex: data.read.startIndex,
endIndex: data.read.endIndex,
name: data.read.name,
openByUrl: track.openByUrl,
file: track.openByUrl ? track.id : null,
index: track.openByUrl ? track.indexPath : null
};
const openBlatSearchMenuItem = {
title: 'BLAT Search',
events: [{
data: {...readInfo},
name: 'read:show:blat',
}],
};
const openBlastnSearchMenuItem = {
events: [{
data: {
...readInfo,
tool: 'blastn',
source: 'bam'
},
name: 'read:show:blast',
}],
title: 'BLASTn Search',
};
const openMotifsSearchMenuItem = {
events: [{
data: {
getSequence: async function () {
const payload = {
id: track.id,
projectId: track.projectIdNumber || undefined,
chromosomeId: data.chromosome.id,
startIndex: data.read.startIndex,
endIndex: data.read.endIndex,
name: data.read.name,
openByUrl: track.openByUrl,
file: track.openByUrl ? track.id : null,
index: track.openByUrl ? track.indexPath : null
};
const read = await self._bamDataService.loadRead(payload);
return read.sequence || null;
}
},
name: 'search:motifs:open',
}],
title: 'Motifs Search'
};
const menuData = [];
menuData.push(showInfo);
if (hasPairRead && !chromosomeNotFoundError) {
menuData.push(goToMateMenuItem);
menuData.push(openMateMenuItem);
}
menuData.push(openMotifsSearchMenuItem);
menuData.push(openBlatSearchMenuItem);
menuData.push(openBlastnSearchMenuItem);
menuData.push(copyToClipboard);
menuData.push(copySequenceToClipboard);
if (chromosomeNotFoundError) {
menuData.push({
title: chromosomeNotFoundError
});
}
const childScope = this.$scope.$new(false);
childScope.menuData = menuData;
const html = this.$compile('<ngb-track-menu menu-data="menuData"></ngb-track-menu>')(childScope);
trackInstance.menuElement.show(
event.position, html
);
childScope.$apply();
ngbTrackEvents.configureCopyToClipboardElements();
html.find('#hiddenMenuButton').triggerHandler('click');
}