Skip to content
Merged
Show file tree
Hide file tree
Changes from all 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
22 changes: 19 additions & 3 deletions nmdc_server/ingest/omics_processing.py
Original file line number Diff line number Diff line change
Expand Up @@ -148,7 +148,13 @@ def get_poolable_replicate_manifest(
return omics_processing_id


def load_omics_processing(db: Session, obj: Dict[str, Any], mongodb: Database, logger, config_map):
def load_omics_processing( # noqa: C901
db: Session,
obj: Dict[str, Any],
mongodb: Database,
logger,
config_map,
):
logger = get_logger(__name__)
input_ids: list[str] = obj.pop("has_input", [""])
biosample_input_ids: set[str] = set()
Expand All @@ -172,8 +178,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