in client/client/app/components/ngbTracksView/ngbTrack/ngbTrack.events.js [28:261]
featureClick(trackInstance, data, track, event) {
const isGeneTrack = track.format.toLowerCase() === 'gene';
const blastSettings = this.projectContext.getTrackDefaultSettings('blast_settings');
const maxQueryLengthProperty = 'query_max_length';
const maxSequenceLength = blastSettings &&
blastSettings.hasOwnProperty(maxQueryLengthProperty) &&
!Number.isNaN(Number(blastSettings[maxQueryLengthProperty]))
? Number(blastSettings[maxQueryLengthProperty])
: Infinity;
if (data.feature) {
const featureSize = Math.abs((data.feature.startIndex || 0) - (data.feature.endIndex || 0));
(async () => {
let geneTracks = [];
if (!isGeneTrack) {
geneTracks = this._getGeneTracks();
} else {
geneTracks.push({
chromosomeId: trackInstance.config.chromosomeId,
id: track.id,
name: track.name,
projectId: track.project ? track.project.id : undefined,
referenceId: track.referenceId
});
}
const menuData = [];
const featureAttributes = data.feature.attributes;
if (!data.feature.grouping) {
const getChrName = (id) => {
const chrIndex = this.projectContext.chromosomes.findIndex(chr => chr.id === id);
return chrIndex > -1 &&
this.projectContext.chromosomes[chrIndex] &&
this.projectContext.chromosomes[chrIndex].name;
};
menuData.push({
events: [{
data: {
chromosomeId: trackInstance.config.chromosomeId,
seqName: data.feature.seqName || getChrName(trackInstance.config.chromosomeId),
endIndex: data.feature.endIndex,
name: data.feature.name,
properties: data.info,
projectId: track.project ? track.project.id : undefined,
referenceId: track.referenceId,
startIndex: data.feature.startIndex,
geneId: (featureAttributes && featureAttributes.gene_id) || null,
title: 'FEATURE',
fileId: track.id,
uuid: isGeneTrack ? data.feature.uid : undefined
},
name: 'feature:info:select'
}],
title: 'Show Info'
});
}
if (/^(gene|transcript|mrna|cds)$/i.test(data.feature.feature)) {
let featureType = data.feature.feature;
if (/^(transcript)$/i.test(featureType)) {
featureType = 'mRNA';
}
const blastSearchParams = {
geneId: (data.feature.attributes && data.feature.attributes.gene_id)
? data.feature.attributes.gene_id
: null,
id: track.id,
chromosomeId: trackInstance.config.chromosomeId,
referenceId: track.referenceId,
index: track.openByUrl ? track.indexPath : null,
startIndex: data.feature.startIndex,
endIndex: data.feature.endIndex,
name: data.feature.name,
file: track.openByUrl ? track.id : null,
openByUrl: track.openByUrl,
feature: featureType
};
menuData.push({
events: [{
data: {
...blastSearchParams,
tool: 'blastn',
source: 'gene'
},
name: 'read:show:blast'
}],
disabled: maxSequenceLength < featureSize,
warning: maxSequenceLength < featureSize
? `Query maximum length (${maxSequenceLength}bp) exceeded`
: undefined,
title: 'BLASTn search',
});
menuData.push({
events: [{
data: {
...blastSearchParams,
tool: 'blastp',
aminoAcid: true,
source: 'gene'
},
name: 'read:show:blast'
}],
disabled: !blastSearchParams.name,
warning: !blastSearchParams.name
? 'Feature name is missing'
: undefined,
title: 'BLASTp search',
});
} else if (
!data.feature.grouping &&
data.feature.startIndex &&
data.feature.endIndex
) {
const blastSearchParams = {
id: track.id,
chromosomeId: trackInstance.config.chromosomeId,
referenceId: track.referenceId,
index: track.openByUrl ? track.indexPath : null,
startIndex: data.feature.startIndex,
endIndex: data.feature.endIndex,
name: data.feature.name,
file: track.openByUrl ? track.id : null,
openByUrl: track.openByUrl,
feature: data.feature.feature
};
menuData.push({
title: 'BLASTn search',
disabled: maxSequenceLength < featureSize,
warning: maxSequenceLength < featureSize
? `Query maximum length (${maxSequenceLength}bp) exceeded`
: undefined,
events: [{
data: {
...blastSearchParams,
tool: 'blastn',
source: track.format
},
name: 'read:show:blast',
}]
});
}
if (geneTracks.length > 0) {
if (data.feature.attributes && data.feature.attributes.gene_id) {
const layoutChange = this.appLayout.Panels.molecularViewer;
layoutChange.displayed = true;
menuData.push({
events: [
{
name: 'miew:clear:structure'
},
{
data: {layoutChange},
name: 'layout:item:change'
},
{
data: new EventGeneInfo({
endIndex: data.feature.endIndex,
geneId: data.feature.attributes.gene_id,
geneName: data.feature.attributes.gene_name,
geneTracks,
highlight: false,
startIndex: data.feature.startIndex,
transcriptId: data.feature.attributes.transcript_id
}),
name: 'miew:show:structure'
}],
title: 'Show 3D structure'
});
}
}
if (data.feature.feature
&& data.feature.feature.toLowerCase() === 'gene'
&& data.feature.name) {
const layoutChange = this.appLayout.Panels.homologs;
layoutChange.displayed = true;
menuData.push({
events: [
{
data: {layoutChange},
name: 'layout:item:change'
},
{
data: {
search: data.feature.name,
featureId: data.feature.groupId
},
name: 'read:show:homologs'
}],
title: 'Show similar genes',
disabled: (data.feature.feature || '').toLowerCase() !== 'gene' || !data.feature.name,
warning: (data.feature.feature || '').toLowerCase() !== 'gene' || !data.feature.name
? 'Feature type is not Gene or Name is missing'
: undefined,
});
}
if (data.feature.feature && data.feature.name) {
const layoutChange = this.appLayout.Panels.pathways;
layoutChange.displayed = true;
const [reference] = this.projectContext.references.filter(ref => ref.id === track.referenceId);
const speciesList = reference && reference.species
? [reference.species.taxId]
: null;
menuData.push({
events: [
{
data: {layoutChange},
name: 'layout:item:change'
},
{
data: {
speciesList,
search: data.feature.name,
rewriteSpecies: true
},
name: 'read:show:pathways'
}],
title: 'Show pathways',
disabled: !data.feature.name,
warning: !data.feature.name
? 'Feature type is not Gene or Name is missing'
: undefined,
});
}
if (menuData.length > 0) {
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');
}
})();
}
}