Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 12 additions & 2 deletions nmdc_server/ingest/omics_processing.py
Original file line number Diff line number Diff line change
Expand Up @@ -172,8 +172,18 @@ def load_omics_processing(db: Session, obj: Dict[str, Any], mongodb: Database, l

data_objects = obj.pop("has_output", [])
obj["study_id"] = obj.pop("associated_studies", [None])[0]
obj["analyte_category"] = omics_types[obj["analyte_category"].lower()]
obj["omics_type"] = omics_types[obj["analyte_category"].lower()]
original_analyte_category = obj["analyte_category"].lower()
obj["analyte_category"] = omics_types[original_analyte_category]
obj["omics_type"] = omics_types[original_analyte_category]

# Get amplicon specific fields
if obj["omics_type"] == "Amplicon":
obj["target_gene"] = obj.pop("target_gene", None)
target_subfragment = obj.pop("target_subfragment", None)
if isinstance(target_subfragment, dict) and "has_raw_value" in target_subfragment:
obj["target_subfragment"] = target_subfragment["has_raw_value"]
else:
obj["target_subfragment"] = target_subfragment

# Get instrument name
instrument_id = obj.pop("instrument_used", [])
Expand Down
52 changes: 52 additions & 0 deletions web/src/components/AmpliconObjectDataTable.vue
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
<script lang="ts">
import { defineComponent, PropType } from '@vue/composition-api';
import { DataTableHeader } from 'vuetify';
import { OmicsProcessingResult } from '@/data/api';

const BioprojectLinkBase = 'https://bioregistry.io/';

export default defineComponent({
name: 'AmpliconObjectDataTable',
props: {
omicsProcessing: {
type: Array as PropType<OmicsProcessingResult[]>,
required: true,
},
omicsType: {
type: String,
required: true,
},
},
setup() {
const headers: DataTableHeader[] = [
{ text: 'Type', value: 'type' },
{ text: 'INSDC Expirement Identifiers', value: 'insdc_experiment_identifiers' },
{ text: 'Target Gene', value: 'target_gene' },
{ text: 'Target Subfragment', value: 'target_subfragment' },
];

return {
headers,
BioprojectLinkBase,
};
},
});

</script>
<template>
<v-data-table
:headers="headers"
:items="[omicsProcessing[0].annotations]"
>
<!-- eslint-disable-next-line -->
<template #item.insdc_experiment_identifiers="{ item }">
<a
:href="BioprojectLinkBase + item.insdc_experiment_identifiers"
target="_blank"
rel="noopener noreferrer"
>
{{ BioprojectLinkBase + item.insdc_experiment_identifiers }}
</a>
</template>
</v-data-table>
</template>
23 changes: 20 additions & 3 deletions web/src/components/SampleListExpansion.vue
Original file line number Diff line number Diff line change
Expand Up @@ -4,18 +4,21 @@ import { computed, defineComponent, PropType } from '@vue/composition-api';
import { fieldDisplayName } from '@/util';
import { BiosampleSearchResult } from '@/data/api';
import DataObjectTable from './DataObjectTable.vue';
import AmpliconObjectDataTable from './AmpliconObjectDataTable.vue';

const buttonOrder = [
'metagenome',
'metatranscriptome',
'proteomics',
'metabolomics',
'organic matter characterization',
'amplicon',
];

export default defineComponent({
components: {
DataObjectTable,
AmpliconObjectDataTable,
},

props: {
Expand All @@ -38,6 +41,11 @@ export default defineComponent({
return props.expanded.resultId === props.result.id
&& props.expanded.omicsProcessingId === omicsProcessingId;
}
function isDisabled(omicsType: string, projects: any[]) {
// TODO this is a temporary fix for the amplicon button
// until we have a proper way to handle amplicon data.
return projects[0].omics_data.length === 0 && omicsType !== 'Amplicon';
}

const filteredOmicsProcessing = computed(() => Object.entries(groupBy(
props.result.omics_processing,
Expand All @@ -47,9 +55,9 @@ export default defineComponent({
const bi = buttonOrder.indexOf(bgroup.toLowerCase());
return ai - bi;
}));

return {
isOpen,
isDisabled,
filteredOmicsProcessing,
fieldDisplayName,
};
Expand All @@ -69,7 +77,7 @@ export default defineComponent({
x-small
:outlined="!isOpen(projects[0].id)"
:color="isOpen(projects[0].id) ? 'primary' : 'default'"
:disabled="projects[0].omics_data.length == 0 ? true : false"
:disabled="isDisabled(omicsType, projects)"
class="mr-2 mt-2"

@click="() => $emit('open-details', projects[0].id)"
Expand All @@ -80,7 +88,16 @@ export default defineComponent({
</div>
<template v-for="[omicsType, projects] in filteredOmicsProcessing">
<DataObjectTable
v-if="isOpen(projects[0].id)"
v-if="isOpen(projects[0].id) && omicsType !== 'Amplicon'"
:key="projects[0].id"
class="flex-row mt-2"
:omics-processing="projects"
:omics-type="omicsType"
:logged-in-user="loggedInUser"
:biosample="result"
/>
<AmpliconObjectDataTable
v-if="isOpen(projects[0].id) && omicsType === 'Amplicon'"
:key="projects[0].id"
class="flex-row mt-2"
:omics-processing="projects"
Expand Down
Loading