def check(context: click.Context, family: str):
    """Delete an analysis log from the database."""
    analysis_obj = context.obj['store'].analyses(family=family).first()
    if analysis_obj is None:
        LOG.error('no analysis found')
        context.abort()

    config_path = Path(analysis_obj.config_path)
    if not config_path.exists():
        LOG.error(f"analysis config not found: {config_path}")
        context.abort()
    config_raw = ruamel.yaml.safe_load(config_path.open())
    config_data = files.parse_config(config_raw)

    sampleinfo_raw = ruamel.yaml.safe_load(Path(config_data['sampleinfo_path']).open())
    sampleinfo_data = files.parse_sampleinfo(sampleinfo_raw)

    qcmetrics_path = Path(sampleinfo_data['qcmetrics_path'])
    if not qcmetrics_path.exists():
        LOG.error(f"qc metrics not found: {str(qcmetrics_path)}")
        context.abort()
    qcmetrics_raw = ruamel.yaml.safe_load(qcmetrics_path.open())
    qcmetrics_data = files.parse_qcmetrics(qcmetrics_raw)

    samples = {
        'sample': [],
        'type': [],
        'ped': [],
        'chanjo': [],
        'peddy': [],
        'plink': [],
        'duplicates': [],
    }
    for sample_data in config_data['samples']:
        LOG.debug(f"{sample_data['id']}: parse analysis config")
        samples['sample'].append(sample_data['id'])
        samples['type'].append(sample_data['type'])

    for sample_data in sampleinfo_data['samples']:
        LOG.debug(f"{sample_data['id']}: parse sample info")
        samples['ped'].append(sample_data['sex'])

        with Path(sample_data['chanjo_sexcheck']).open() as chanjo_handle:
            sexcheck_data = files.parse_chanjo_sexcheck(chanjo_handle)

        predicted_sex = sexcheck_data['predicted_sex']
        xy_ratio = sexcheck_data['y_coverage'] / sexcheck_data['x_coverage']
        samples['chanjo'].append(f"{predicted_sex} ({xy_ratio:.3f})")

    for sample_data in qcmetrics_data['samples']:
        LOG.debug(f"{sample_data['id']}: parse qc metrics")
        samples['plink'].append(sample_data['plink_sex'])
        duplicates_percent = sample_data['duplicates'] * 100
        samples['duplicates'].append(f"{duplicates_percent:.3f}%")

    peddy_path = Path(sampleinfo_data['peddy']['sex_check'])
    if peddy_path.exists():
        with peddy_path.open() as sexcheck_handle:
            peddy_data = files.parse_peddy_sexcheck(sexcheck_handle)

        for sample_id in samples['sample']:
            LOG.debug(f"{sample_id}: parse peddy")
            predicted_sex = peddy_data[sample_id]['predicted_sex']
            het_ratio = peddy_data[sample_id]['het_ratio']
            samples['peddy'].append(f"{predicted_sex} ({het_ratio})")
    else:
        LOG.warning(f"missing peddy output: {peddy_path}")

    print(tabulate(samples, headers='keys', tablefmt='psql'))
def check ( context : click . Context , family : str ) : analysis_obj = context . obj [ 'store' ] . analyses ( family = family ) . first ( ) if analysis_obj is None : LOG . error ( 'no analysis found' ) context . abort ( ) config_path = Path ( analysis_obj . config_path ) if not config_path . exists ( ) : LOG . error ( f"analysis config not found: {config_path}" ) context . abort ( ) config_raw = ruamel . yaml . safe_load ( config_path . open ( ) ) config_data = files . parse_config ( config_raw ) sampleinfo_raw = ruamel . yaml . safe_load ( Path ( config_data [ 'sampleinfo_path' ] ) . open ( ) ) sampleinfo_data = files . parse_sampleinfo ( sampleinfo_raw ) qcmetrics_path = Path ( sampleinfo_data [ 'qcmetrics_path' ] ) if not qcmetrics_path . exists ( ) : LOG . error ( f"qc metrics not found: {str(qcmetrics_path)}" ) context . abort ( ) qcmetrics_raw = ruamel . yaml . safe_load ( qcmetrics_path . open ( ) ) qcmetrics_data = files . parse_qcmetrics ( qcmetrics_raw ) samples = { 'sample' : [ ] , 'type' : [ ] , 'ped' : [ ] , 'chanjo' : [ ] , 'peddy' : [ ] , 'plink' : [ ] , 'duplicates' : [ ] , } for sample_data in config_data [ 'samples' ] : LOG . debug ( f"{sample_data['id']}: parse analysis config" ) samples [ 'sample' ] . append ( sample_data [ 'id' ] ) samples [ 'type' ] . append ( sample_data [ 'type' ] ) for sample_data in sampleinfo_data [ 'samples' ] : LOG . debug ( f"{sample_data['id']}: parse sample info" ) samples [ 'ped' ] . append ( sample_data [ 'sex' ] ) with Path ( sample_data [ 'chanjo_sexcheck' ] ) . open ( ) as chanjo_handle : sexcheck_data = files . parse_chanjo_sexcheck ( chanjo_handle ) predicted_sex = sexcheck_data [ 'predicted_sex' ] xy_ratio = sexcheck_data [ 'y_coverage' ] / sexcheck_data [ 'x_coverage' ] samples [ 'chanjo' ] . append ( f"{predicted_sex} ({xy_ratio:.3f})" ) for sample_data in qcmetrics_data [ 'samples' ] : LOG . debug ( f"{sample_data['id']}: parse qc metrics" ) samples [ 'plink' ] . append ( sample_data [ 'plink_sex' ] ) duplicates_percent = sample_data [ 'duplicates' ] * 100 samples [ 'duplicates' ] . append ( f"{duplicates_percent:.3f}%" ) peddy_path = Path ( sampleinfo_data [ 'peddy' ] [ 'sex_check' ] ) if peddy_path . exists ( ) : with peddy_path . open ( ) as sexcheck_handle : peddy_data = files . parse_peddy_sexcheck ( sexcheck_handle ) for sample_id in samples [ 'sample' ] : LOG . debug ( f"{sample_id}: parse peddy" ) predicted_sex = peddy_data [ sample_id ] [ 'predicted_sex' ] het_ratio = peddy_data [ sample_id ] [ 'het_ratio' ] samples [ 'peddy' ] . append ( f"{predicted_sex} ({het_ratio})" ) else : LOG . warning ( f"missing peddy output: {peddy_path}" ) print ( tabulate ( samples , headers = 'keys' , tablefmt = 'psql' ) )
Delete an analysis log from the database.