def microsalt(context: click.Context, order_id): """Microbial workflow""" context.obj["db"] = Store(context.obj["database"]) hk_api = hk.HousekeeperAPI(context.obj) lims_api = lims.LimsAPI(context.obj) deliver = DeliverAPI( context.obj, hk_api=hk_api, lims_api=lims_api, case_tags=PROJECT_TAGS, sample_tags=SAMPLE_TAGS, ) context.obj["api"] = AnalysisAPI(db=context.obj["db"], hk_api=hk_api, lims_api=lims_api) context.obj["lims_microsalt_api"] = LimsMicrosaltAPI(lims=lims_api) if context.invoked_subcommand is None: if order_id is None: LOG.error("Please provide an order") context.abort() else: # execute the analysis! context.invoke(config_case, order_id=order_id) context.invoke(link, order_id=order_id) context.invoke(run, order_id=order_id)
def balsamic(context, case_id, priority, email, target_bed): """Cancer workflow """ context.obj["store_api"] = Store(context.obj["database"]) context.obj["hk_api"] = hk.HousekeeperAPI(context.obj) context.obj["fastq_handler"] = FastqHandler context.obj["gzipper"] = gzip context.obj["lims_api"] = lims.LimsAPI(context.obj) context.obj["fastq_api"] = FastqAPI context.obj["analysis_api"] = AnalysisAPI( hk_api=context.obj["hk_api"], fastq_api=context.obj["fastq_api"]) if context.invoked_subcommand is None: if case_id is None: LOG.error("provide a case") context.abort() # execute the analysis! context.invoke(link, case_id=case_id) context.invoke(config_case, case_id=case_id, target_bed=target_bed) context.invoke(run, run_analysis=True, case_id=case_id, priority=priority, email=email)
def pools(context, status): """ Update pools with received_at or delivered_at dates from LIMS. Defaults to delivered if no option is provided. """ lims_api = lims_app.LimsAPI(context.obj) transfer_api = transfer_app.TransferLims(context.obj["db"], lims_api) transfer_api.transfer_pools(transfer_app.PoolState[status.upper()])
def microbials(context, status): """ Update microbial samples with received_at, prepared_at, sequenced_at or delivered_at dates from LIMS. Defaults to delivered if no option is provided. """ lims_api = lims_app.LimsAPI(context.obj) transfer_api = transfer_app.TransferLims(context.obj["db"], lims_api) transfer_api.transfer_microbial_samples( transfer_app.MicrobialState[status.upper()])
def deliver(context): """Deliver stuff.""" context.obj["db"] = Store(context.obj["database"]) context.obj["deliver_api"] = DeliverAPI( db=context.obj["db"], hk_api=hk.HousekeeperAPI(context.obj), lims_api=lims.LimsAPI(context.obj), case_tags=CASE_TAGS, sample_tags=SAMPLE_TAGS, )
def transfer(admin, housekeeper, config_file): """Transfer stuff from external interfaces.""" config = ruamel.yaml.safe_load(config_file) admin_api = AdminDatabase(admin) # ApplicationImporter(config['database'], admin_api).process() # CustomerImporter(config['database'], admin_api).process() # UserImporter(config['database'], admin_api).process() # PanelImporter(config['database'], scoutapi.ScoutAPI(config)).process() lims_api = lims_app.LimsAPI(config) SampleImporter(config["database"], lims_api).process() FamilyImporter(config["database"], lims_api).process()
def mip_dna(context: click.Context, case_id: str, email: str, priority: str, start_with: str): """Rare disease DNA workflow""" context.obj["db"] = Store(context.obj["database"]) hk_api = hk.HousekeeperAPI(context.obj) scout_api = scoutapi.ScoutAPI(context.obj) lims_api = lims.LimsAPI(context.obj) context.obj["tb"] = tb.TrailblazerAPI(context.obj) deliver = DeliverAPI( context.obj, hk_api=hk_api, lims_api=lims_api, case_tags=CASE_TAGS, sample_tags=SAMPLE_TAGS, ) context.obj["api"] = AnalysisAPI( db=context.obj["db"], hk_api=hk_api, tb_api=context.obj["tb"], scout_api=scout_api, lims_api=lims_api, deliver_api=deliver, ) if context.invoked_subcommand is None: if case_id is None: _suggest_cases_to_analyze(context, show_as_error=True) context.abort() # check everything is ok case_obj = context.obj["db"].family(case_id) if case_obj is None: LOG.error("%s: not found", case_id) context.abort() is_ok = context.obj["api"].check(case_obj) if not is_ok: LOG.warning("%s: not ready to run", case_obj.internal_id) # commit the updates to request flowcells context.obj["db"].commit() else: # execute the analysis! context.invoke(config_case, case_id=case_id) context.invoke(link, case_id=case_id) context.invoke(panel, case_id=case_id) context.invoke( run, case_id=case_id, priority=priority, email=email, start_with=start_with, )
def analysis(context, priority, email, family_id): """Prepare and start a MIP analysis for a FAMILY_ID.""" context.obj['db'] = Store(context.obj['database']) hk_api = hk.HousekeeperAPI(context.obj) scout_api = scoutapi.ScoutAPI(context.obj) lims_api = lims.LimsAPI(context.obj) context.obj['tb'] = tb.TrailblazerAPI(context.obj) context.obj['api'] = AnalysisAPI( db=context.obj['db'], hk_api=hk_api, tb_api=context.obj['tb'], scout_api=scout_api, lims_api=lims_api, ) if context.invoked_subcommand is None: if family_id is None: LOG.error('provide a family') context.abort() # check everything is okey family_obj = context.obj['db'].family(family_id) if family_obj is None: LOG.error(f"{family_id} not found") context.abort() is_ok = context.obj['api'].check(family_obj) if not is_ok: LOG.warning(f"{family_obj.internal_id}: not ready to start") # commit the updates to request flowcells context.obj['db'].commit() else: # execute the analysis! context.invoke(config, family_id=family_id) context.invoke(link, family_id=family_id) context.invoke(panel, family_id=family_id) context.invoke(start, family_id=family_id, priority=priority, email=email)
def mip_rna(context: click.Context): """Rare disease RNA workflow""" context.obj["db"] = Store(context.obj["database"]) hk_api = hk.HousekeeperAPI(context.obj) lims_api = lims.LimsAPI(context.obj) context.obj["tb"] = tb.TrailblazerAPI(context.obj) deliver = DeliverAPI( context.obj, hk_api=hk_api, lims_api=lims_api, case_tags=CASE_TAGS, sample_tags=SAMPLE_TAGS, ) context.obj["api"] = AnalysisAPI( db=context.obj["db"], hk_api=hk_api, tb_api=context.obj["tb"], lims_api=lims_api, deliver_api=deliver, ) context.obj["rna_api"] = MipAPI(context.obj["mip-rd-rna"]["script"], context.obj["mip-rd-rna"]["pipeline"])
def lims(context, status): """Check if samples have been updated in LIMS.""" lims_api = lims_app.LimsAPI(context.obj) transfer_api = transfer_app.TransferLims(context.obj['db'], lims_api) transfer_api.transfer_samples(transfer_app.SampleState[status.upper()])
def inbox(context, dry, family, version, tag, inbox): """Link files from HK to cust inbox.""" db = Store(context.obj['database']) deliver_api = DeliverAPI(db=db, hk_api=hk.HousekeeperAPI(context.obj), lims_api=lims.LimsAPI(context.obj)) family_obj = db.family(family) if family_obj is None: LOG.error(f"Family '{family}' not found.") context.abort() family_files = deliver_api.get_post_analysis_family_files(family=family, version=version, tag=tag) if not family_files: LOG.warning(f"No family files found.") for file_obj in family_files: out_dir = Path( inbox.format(family=family_obj.name, customer=family_obj.customer.internal_id)) out_dir.mkdir(parents=True, exist_ok=True) # might be fun to name exit files according to tags instead of MIP's long name #file_name = Path('_'.join([ tag.name for tag in file_obj.tags ])) #file_ext = ''.join(Path(file_obj.path).suffixes) out_file_name = Path(file_obj.path).name.replace( family, family_obj.name) out_path = Path(f"{out_dir/ out_file_name}") in_path = Path(file_obj.full_path) if not out_path.exists(): os.link(in_path, out_path) LOG.info(f"linked file: {in_path} -> {out_path}") else: LOG.info(f"Target file exists: {out_path}") link_obj = db.family_samples(family) if not link_obj: LOG.warning(f"No sample files found.") for family_sample in link_obj: sample_obj = family_sample.sample sample_files = deliver_api.get_post_analysis_sample_files( family=family, sample=sample_obj.internal_id, version=version, tag=tag) if not sample_files: LOG.warning( f"No sample files found for '{sample_obj.internal_id}'.") for file_obj in sample_files: out_dir = Path( inbox.format(family=family_obj.name, customer=family_obj.customer.internal_id)) out_dir = out_dir.joinpath(sample_obj.name) out_dir.mkdir(parents=True, exist_ok=True) out_file_name = Path(file_obj.path).name.replace( sample_obj.internal_id, sample_obj.name) out_path = Path(f"{out_dir / out_file_name}") in_path = Path(file_obj.full_path) if not out_path.exists(): os.link(in_path, out_path) LOG.info(f"linked file: {in_path} -> {out_path}") else: LOG.info(f"Target file exists: {out_path}")
def upload(context, family_id, force_restart): """Upload results from analyses.""" click.echo(click.style("----------------- UPLOAD ----------------------")) context.obj["status"] = Store(context.obj["database"]) if family_id: family_obj = context.obj["status"].family(family_id) if not family_obj: message = f"family not found: {family_id}" click.echo(click.style(message, fg="red")) context.abort() if not family_obj.analyses: message = f"no analysis exists for family: {family_id}" click.echo(click.style(message, fg="red")) context.abort() analysis_obj = family_obj.analyses[0] if analysis_obj.uploaded_at is not None: message = f"analysis already uploaded: {analysis_obj.uploaded_at.date()}" click.echo(click.style(message, fg="red")) context.abort() if not force_restart and analysis_obj.upload_started_at is not None: if dt.datetime.now( ) - analysis_obj.upload_started_at > dt.timedelta(hours=24): raise AnalysisUploadError( f"The upload started at {analysis_obj.upload_started_at} " f"something went wrong, restart it with the --restart flag" ) message = f"analysis upload already started: {analysis_obj.upload_started_at.date()}" click.echo(click.style(message, fg="yellow")) return context.obj["housekeeper_api"] = hk.HousekeeperAPI(context.obj) context.obj["madeline_api"] = madeline.api.MadelineAPI(context.obj) context.obj["genotype_api"] = gt.GenotypeAPI(context.obj) context.obj["lims_api"] = lims.LimsAPI(context.obj) context.obj["tb_api"] = tb.TrailblazerAPI(context.obj) context.obj["chanjo_api"] = coverage_app.ChanjoAPI(context.obj) context.obj["deliver_api"] = DeliverAPI( context.obj, hk_api=context.obj["housekeeper_api"], lims_api=context.obj["lims_api"], case_tags=CASE_TAGS, sample_tags=SAMPLE_TAGS, ) context.obj["scout_api"] = scoutapi.ScoutAPI(context.obj) context.obj["analysis_api"] = AnalysisAPI( context.obj, hk_api=context.obj["housekeeper_api"], scout_api=context.obj["scout_api"], tb_api=context.obj["tb_api"], lims_api=context.obj["lims_api"], deliver_api=context.obj["deliver_api"], ) context.obj["report_api"] = ReportAPI( store=context.obj["status"], lims_api=context.obj["lims_api"], chanjo_api=context.obj["chanjo_api"], analysis_api=context.obj["analysis_api"], scout_api=context.obj["scout_api"], ) context.obj["scout_upload_api"] = UploadScoutAPI( hk_api=context.obj["housekeeper_api"], scout_api=context.obj["scout_api"], madeline_api=context.obj["madeline_api"], analysis_api=context.obj["analysis_api"], lims_api=context.obj["lims_api"], ) if context.invoked_subcommand is not None: return if not family_id: _suggest_cases_to_upload(context) context.abort() family_obj = context.obj["status"].family(family_id) analysis_obj = family_obj.analyses[0] if analysis_obj.uploaded_at is not None: message = f"analysis already uploaded: {analysis_obj.uploaded_at.date()}" click.echo(click.style(message, fg="yellow")) else: analysis_obj.upload_started_at = dt.datetime.now() context.obj["status"].commit() context.invoke(coverage, re_upload=True, family_id=family_id) context.invoke(validate, family_id=family_id) context.invoke(genotypes, re_upload=False, family_id=family_id) context.invoke(observations, case_id=family_id) context.invoke(scout, case_id=family_id) analysis_obj.uploaded_at = dt.datetime.now() context.obj["status"].commit() click.echo(click.style(f"{family_id}: analysis uploaded!", fg="green"))