|
22 | 22 | find_or_create_doi_identifier, |
23 | 23 | find_or_create_publication_identifier, |
24 | 24 | ) |
25 | | -from mavedb.lib.score_sets import create_variants_data, search_score_sets as _search_score_sets, VariantData |
| 25 | +from mavedb.lib.score_sets import ( |
| 26 | + create_variants_data, |
| 27 | + search_score_sets as _search_score_sets, |
| 28 | + VariantData, |
| 29 | + find_meta_analyses_for_score_sets, |
| 30 | +) |
26 | 31 | from mavedb.lib.urns import generate_experiment_set_urn, generate_experiment_urn, generate_score_set_urn |
27 | 32 | from mavedb.lib.validation import exceptions |
28 | 33 | from mavedb.lib.validation.constants.general import null_values_list |
@@ -100,7 +105,9 @@ def search_my_score_sets( |
100 | 105 |
|
101 | 106 |
|
102 | 107 | @router.get("/score-sets/{urn}", status_code=200, response_model=score_set.ScoreSet, responses={404: {}, 500: {}}) |
103 | | -async def show_score_set(*, urn: str, db: Session = Depends(deps.get_db), user: User = Depends(get_current_user)) -> Any: |
| 108 | +async def show_score_set( |
| 109 | + *, urn: str, db: Session = Depends(deps.get_db), user: User = Depends(get_current_user) |
| 110 | +) -> Any: |
104 | 111 | """ |
105 | 112 | Fetch a single score set by URN. |
106 | 113 | """ |
@@ -198,9 +205,30 @@ async def create_score_set( |
198 | 205 | if item_create is None: |
199 | 206 | return None |
200 | 207 |
|
201 | | - experiment = db.query(Experiment).filter(Experiment.urn == item_create.experiment_urn).one_or_none() |
202 | | - if not experiment: |
203 | | - raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail="Unknown experiment") |
| 208 | + experiment: Experiment = None |
| 209 | + if item_create.experiment_urn is not None: |
| 210 | + experiment = db.query(Experiment).filter(Experiment.urn == item_create.experiment_urn).one_or_none() |
| 211 | + if not experiment: |
| 212 | + raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail="Unknown experiment") |
| 213 | + if ( |
| 214 | + item_create.meta_analysis_source_score_set_urns is not None |
| 215 | + and len(item_create.meta_analysis_source_score_set_urns) > 0 |
| 216 | + ): |
| 217 | + # If any existing score set is a meta-analysis for the same set of score sets, use its experiment as the parent |
| 218 | + # of our new meta-analysis. Otherwise, create a new experiment. |
| 219 | + existing_meta_analyses = find_meta_analyses_for_score_sets(db, item_create.meta_analysis_source_score_set_urns) |
| 220 | + if len(existing_meta_analyses) > 0: |
| 221 | + experiment = existing_meta_analyses[0].experiment |
| 222 | + else: |
| 223 | + experiment = Experiment( |
| 224 | + title=item_create.title, |
| 225 | + short_description=item_create.short_description, |
| 226 | + abstract_text=item_create.abstract_text, |
| 227 | + method_text=item_create.method_text, |
| 228 | + extra_metadata={}, |
| 229 | + created_by=user, |
| 230 | + modified_by=user, |
| 231 | + ) |
204 | 232 |
|
205 | 233 | license_ = db.query(License).filter(License.id == item_create.license_id).one_or_none() |
206 | 234 | if not license_: |
@@ -390,7 +418,9 @@ async def upload_score_set_variant_data( |
390 | 418 | def create_variants(db, score_set: ScoreSet, variants_data: list[VariantData], batch_size=None) -> int: |
391 | 419 | num_variants = len(variants_data) |
392 | 420 | variant_urns = bulk_create_urns(num_variants, score_set, True) |
393 | | - variants = (Variant(urn=urn, score_set_id=score_set.id, **kwargs) for urn, kwargs in zip(variant_urns, variants_data)) |
| 421 | + variants = ( |
| 422 | + Variant(urn=urn, score_set_id=score_set.id, **kwargs) for urn, kwargs in zip(variant_urns, variants_data) |
| 423 | + ) |
394 | 424 | db.bulk_save_objects(variants) |
395 | 425 | db.add(score_set) |
396 | 426 | return len(score_set.variants) |
|
0 commit comments