11""""Provide mapping router"""
22from pathlib import Path
33
4- from cool_seq_tool .schemas import AnnotationLayer
54from fastapi import APIRouter , HTTPException
65from fastapi .responses import JSONResponse
76from requests import HTTPError
@@ -140,46 +139,60 @@ async def map_scoreset(urn: str, store_path: Path | None = None) -> ScoresetMapp
140139 error_message = "No annotated variant mappings available for this score set" ,
141140 )
142141
143- # TODO this will need to be changed to support multi-target score sets.
144- # This version works for accession based score sets.
145- # Not implementing multi-target changes because this will require corresponding changes on mavedb-api and we want to get this on staging quickly right now.
146- # For now, only accept single-target score sets so that we don't need to change structure of JSON output.
147- target_gene = list (metadata .target_genes .keys ())[0 ] # noqa: RUF015
148142 try :
149143 raw_metadata = get_raw_scoreset_metadata (urn , store_path )
150- preferred_layers = {
151- _set_scoreset_layer (urn , annotated_vrs_results [target_gene ]),
152- }
153-
154- reference_sequences = {
155- layer : {
156- "computed_reference_sequence" : None ,
157- "mapped_reference_sequence" : None ,
144+ reference_sequences : dict [str , dict ] = {}
145+ mapped_scores : list [ScoreAnnotation ] = []
146+ for target_gene in annotated_vrs_results :
147+ preferred_layers = {
148+ _set_scoreset_layer (urn , annotated_vrs_results [target_gene ]),
158149 }
159- for layer in AnnotationLayer
160- }
161- # sometimes Nonetype layers show up in preferred layers dict; remove these
162- preferred_layers .discard (None )
163- for layer in preferred_layers :
164- reference_sequences [layer ][
165- "computed_reference_sequence"
166- ] = _get_computed_reference_sequence (
167- metadata .target_genes [target_gene ], layer , transcripts [target_gene ]
168- )
169- reference_sequences [layer ][
170- "mapped_reference_sequence"
171- ] = _get_mapped_reference_sequence (
172- metadata .target_genes [target_gene ],
173- layer ,
174- transcripts [target_gene ],
175- alignment_results [target_gene ],
176- )
150+ reference_sequences [target_gene ] = {
151+ layer : {
152+ "computed_reference_sequence" : None ,
153+ "mapped_reference_sequence" : None ,
154+ }
155+ for layer in preferred_layers
156+ }
157+ # sometimes Nonetype layers show up in preferred layers dict; remove these
158+ preferred_layers .discard (None )
159+ for layer in preferred_layers :
160+ reference_sequences [target_gene ][layer ][
161+ "computed_reference_sequence"
162+ ] = _get_computed_reference_sequence (
163+ metadata .target_genes [target_gene ], layer , transcripts [target_gene ]
164+ )
165+ reference_sequences [target_gene ][layer ][
166+ "mapped_reference_sequence"
167+ ] = _get_mapped_reference_sequence (
168+ metadata .target_genes [target_gene ],
169+ layer ,
170+ transcripts [target_gene ],
171+ alignment_results [target_gene ],
172+ )
173+
174+ for m in annotated_vrs_results [target_gene ]:
175+ if m .pre_mapped is None :
176+ mapped_scores .append (ScoreAnnotation (** m .model_dump ()))
177+ elif m .annotation_layer in preferred_layers :
178+ # drop annotation layer from mapping object
179+ mapped_scores .append (ScoreAnnotation (** m .model_dump ()))
180+
181+ # drop Nonetype reference sequences
182+ for target_gene in reference_sequences :
183+ for layer in list (reference_sequences [target_gene ].keys ()):
184+ if (
185+ reference_sequences [target_gene ][layer ][
186+ "mapped_reference_sequence"
187+ ]
188+ is None
189+ and reference_sequences [target_gene ][layer ][
190+ "computed_reference_sequence"
191+ ]
192+ is None
193+ ) or layer is None :
194+ del reference_sequences [target_gene ][layer ]
177195
178- mapped_scores : list [ScoreAnnotation ] = []
179- for m in annotated_vrs_results [target_gene ]:
180- if m .annotation_layer in preferred_layers :
181- # drop annotation layer from mapping object
182- mapped_scores .append (ScoreAnnotation (** m .model_dump ()))
183196 except Exception as e :
184197 return JSONResponse (
185198 content = ScoresetMapping (
@@ -190,18 +203,7 @@ async def map_scoreset(urn: str, store_path: Path | None = None) -> ScoresetMapp
190203 return JSONResponse (
191204 content = ScoresetMapping (
192205 metadata = raw_metadata ,
193- computed_protein_reference_sequence = reference_sequences [
194- AnnotationLayer .PROTEIN
195- ]["computed_reference_sequence" ],
196- mapped_protein_reference_sequence = reference_sequences [
197- AnnotationLayer .PROTEIN
198- ]["mapped_reference_sequence" ],
199- computed_genomic_reference_sequence = reference_sequences [
200- AnnotationLayer .GENOMIC
201- ]["computed_reference_sequence" ],
202- mapped_genomic_reference_sequence = reference_sequences [
203- AnnotationLayer .GENOMIC
204- ]["mapped_reference_sequence" ],
206+ reference_sequences = reference_sequences ,
205207 mapped_scores = mapped_scores ,
206208 ).model_dump (exclude_none = True )
207209 )
0 commit comments