def trait_associations(trait):
    args = request.args.to_dict()
    try:
        start, size, p_lower, p_upper, pval_interval, quant_method, snp, tissue, gene, study, _ , paginate, links, qtl_group = apiu._get_basic_arguments(args)
    except ValueError as error:
        logging.error("/molecular_phenotypes/" + trait + ". " + (str(error)))
        raise BadUserRequest(str(error))

    searcher = search.Search(apiu.properties)

    try:
        datasets, index_marker, paginate = searcher.search(trait=trait, start=start, size=size, pval_interval=pval_interval, quant_method=quant_method, 
                tissue=tissue, gene=gene, study=study, snp=snp, paginate=paginate, qtl_group=qtl_group)

        data_dict = apiu._get_array_to_display(datasets=datasets, links=links)
        params = dict(molecular_trait_id=trait, p_lower=p_lower, p_upper=p_upper, quant_method=quant_method, tissue=tissue, gene_id=gene, study=study, variant_id=snp, qtl_group=qtl_group, links=links)
        response = apiu._create_response(method_name='api.get_trait_assocs', start=start, size=size,
                                         index_marker=index_marker,
                                         data_dict=data_dict, params=params)

        return simplejson.dumps(response, ignore_nan=True)

    except NotFoundError as error:
        logging.error("/molecular_phenotypes/" + trait + ". " + (str(error)))
        raise RequestedNotFound(str(error))
def trait_associations(trait):
    args = request.args.to_dict()
    try:
        start, size, p_lower, p_upper, pval_interval, reveal = apiu._get_basic_arguments(
            args)
    except ValueError as error:
        logging.error("/traits/" + trait + ". " + (str(error)))
        raise BadUserRequest(str(error))

    searcher = search.Search(apiu.properties)

    try:
        datasets, index_marker = searcher.search_trait(
            trait=trait, start=start, size=size, pval_interval=pval_interval)

        data_dict = apiu._get_array_to_display(datasets=datasets,
                                               reveal=reveal)
        params = dict(trait=trait, p_lower=p_lower, p_upper=p_upper)
        response = apiu._create_response(method_name='api.get_trait_assocs',
                                         start=start,
                                         size=size,
                                         index_marker=index_marker,
                                         data_dict=data_dict,
                                         params=params)

        return simplejson.dumps(response, ignore_nan=True)

    except NotFoundError as error:
        logging.error("/traits/" + trait + ". " + (str(error)))
        raise RequestedNotFound(str(error))
def studies_for_trait(trait):
    args = request.args.to_dict()
    try:
        start, size = apiu._get_start_size(args)
    except ValueError as error:
        logging.error("/traits/" + trait + "/studies. " + (str(error)))
        raise BadUserRequest(str(error))

    try:
        explorer = ex.Explorer(apiu.properties)
        studies = explorer.get_list_of_studies_for_trait(trait)
        study_list = apiu._create_study_info_for_trait(studies, trait)
        end = min(start + size, len(study_list))
        response = apiu._create_response(
            collection_name='studies',
            method_name='api.get_studies_for_trait',
            start=start,
            size=size,
            index_marker=size,
            data_dict=study_list[start:end],
            params=dict(trait=trait))

        return simplejson.dumps(response)
    except NotFoundError as error:
        logging.error("/traits/" + trait + "/studies. " + (str(error)))
        raise RequestedNotFound(str(error))
def variants(variant, chromosome=None):
    args = request.args.to_dict()
    try:
        start, size, p_lower, p_upper, pval_interval, quant_method, _, tissue, gene, study, trait, paginate, links, qtl_group  = apiu._get_basic_arguments(args)
        #if study is not None:
        #    return variant_resource(variant=variant, chromosome=chromosome)
    except ValueError as error:
        logging.debug("/chromosomes/" + chromosome + "/associations/" + variant + ". " + (str(error)))
        raise BadUserRequest(str(error))

    searcher = search.Search(apiu.properties)

    try:
        datasets, index_marker, paginate = searcher.search(snp=variant, chromosome=chromosome, start=start, size=size,
                                                     pval_interval=pval_interval, study=study, quant_method=quant_method, 
                                                     tissue=tissue, gene=gene, trait=trait, paginate=paginate, qtl_group=qtl_group)

        data_dict = apiu._get_array_to_display(datasets=datasets, variant=variant, links=links)
        params = {'variant_id': variant, 'p_lower': p_lower, 'p_upper': p_upper, 'study': study, 'quant_method': quant_method, 'tissue': tissue, 'gene_id': gene, 'molecular_trait_id': trait, 'qtl_group': qtl_group, 'links': links}
        if chromosome is None:
            method_name = 'api.get_variant'
        else:
            params['chromosome'] = chromosome
            method_name = 'api.get_chromosome_variants'

        response = apiu._create_response(method_name=method_name, start=start, size=size,
                                         index_marker=index_marker,
                                         data_dict=data_dict, params=params)

        return simplejson.dumps(response, ignore_nan=True)
    except (NotFoundError, SubgroupError) as error:
        logging.debug(str(error))
        raise RequestedNotFound(str(error))
def _create_chromosome_response(search_info):
    params = dict(chromosome=search_info['chromosome'], p_lower=search_info['p_lower'], p_upper=search_info['p_upper'],
                  bp_lower=search_info['bp_lower'], bp_upper=search_info['bp_upper'],
                  study=search_info['study'], links=search_info['links'])
    response = apiu._create_response(method_name='api.get_chromosome_assocs', start=search_info['start'], size=search_info['size'],
                                     index_marker=search_info['index_marker'],
                                     data_dict=search_info['data_dict'], params=params)

    return simplejson.dumps(response, ignore_nan=True)
def variants(variant, chromosome=None):
    args = request.args.to_dict()
    try:
        start, size, p_lower, p_upper, pval_interval, reveal = apiu._get_basic_arguments(
            args)
        study = apiu._retrieve_endpoint_arguments(args, "study_accession")
        if study is not None:
            return variant_resource(variant=variant, chromosome=chromosome)
    except ValueError as error:
        logging.debug("/chromosomes/" + chromosome + "/associations/" +
                      variant + ". " + (str(error)))
        raise BadUserRequest(str(error))

    searcher = search.Search(apiu.properties)

    try:
        datasets, index_marker = searcher.search_snp(
            snp=variant,
            chromosome=chromosome,
            start=start,
            size=size,
            pval_interval=pval_interval,
            study=study)

        data_dict = apiu._get_array_to_display(datasets=datasets,
                                               variant=variant,
                                               reveal=reveal)
        params = {
            'variant_id': variant,
            'p_lower': p_lower,
            'p_upper': p_upper,
            'study_accession': study
        }
        if chromosome is None:
            method_name = 'api.get_variant'
        else:
            params['chromosome'] = chromosome
            method_name = 'api.get_chromosome_variants'

        response = apiu._create_response(method_name=method_name,
                                         start=start,
                                         size=size,
                                         index_marker=index_marker,
                                         data_dict=data_dict,
                                         params=params)

        return simplejson.dumps(response, ignore_nan=True)
    except (NotFoundError, SubgroupError) as error:
        logging.debug(str(error))
        raise RequestedNotFound(str(error))
def traits():
    args = request.args.to_dict()
    #need to add in study to url if present
    try:
        start, size = apiu._get_start_size(args)
        study = apiu._retrieve_endpoint_arguments(args, "study")
    except ValueError as error:
        logging.error("/molecular_phenotypes. " + (str(error)))
        raise BadUserRequest(str(error))
    explorer = ex.Explorer(apiu.properties)
    if study:
        traits = explorer.get_trait_of_study(study_to_find=study)
        trait_list = apiu._get_trait_list(traits=traits)

        response = apiu._create_response(collection_name='molecular_trait_id', method_name='api.get_traits', params={'study': study},
                                         start=start, size=size, index_marker=size, data_dict=trait_list)
    else:
        traits = explorer.get_list_of_traits()
        trait_list = apiu._get_trait_list(traits=traits, start=start, size=size)

        response = apiu._create_response(collection_name='molecular_trait_id', method_name='api.get_traits',
                                         start=start, size=size, index_marker=size, data_dict=trait_list)
    return simplejson.dumps(response)
def genes():
    args = request.args.to_dict()
    try:
        start, size = apiu._get_start_size(args)
    except ValueError as error:
        logging.error("/genes. " + (str(error)))
        raise BadUserRequest(str(error))
    explorer = ex.Explorer(apiu.properties)
    genes = explorer.get_list_of_genes()
    gene_list = apiu._get_gene_list(genes=genes, start=start, size=size)

    response = apiu._create_response(collection_name='gene', method_name='api.get_genes',
                                     start=start, size=size, index_marker=size, data_dict=gene_list)
    return simplejson.dumps(response)
def qtl_groups():
    args = request.args.to_dict()
    try:
        start, size, p_lower, p_upper, pval_interval, quant_method, snp, _, gene, study, trait, paginate, links, qtl_group = apiu._get_basic_arguments(args)
    except ValueError as error:
        logging.error("/qtl_groups. " + (str(error)))
        raise BadUserRequest(str(error))

    explorer = ex.Explorer(apiu.properties)
    qtls = explorer.get_qtl_list()
    qtl_list = apiu._get_qtl_list(qtls=qtls, start=start, size=size, links=links)
    response = apiu._create_response(collection_name='qtl_groups', method_name='api.get_qtl_groups',
                                     start=start, size=size, index_marker=size, data_dict=qtl_list)

    return simplejson.dumps(response)
def study_list():
    args = request.args.to_dict()
    try:
        start, size = apiu._get_start_size(args)
    except ValueError as error:
        logging.error("/study_list. " + (str(error)))
        raise BadUserRequest(str(error))

    explorer = ex.Explorer(apiu.properties)
    studies = explorer.get_list_of_studies()

    # default size is max unless specified:
    if 'size' not in args:
        size = len(studies)

    study_list = apiu._get_study_list_no_info(studies=studies, start=start, size=size)

    response = apiu._create_response(collection_name='studies', method_name='api.get_studies',
                                     start=start, size=size, index_marker=size, data_dict=study_list)

    return simplejson.dumps(response)
def tissue_study_associations(study, tissue=None):
    args = request.args.to_dict()
    try:
        start, size, p_lower, p_upper, pval_interval, quant_method, snp, _, gene, _, trait, paginate, links, qtl_group = apiu._get_basic_arguments(args)
    except ValueError as error:
        logging.error("/studies/" + study + ". " + (str(error)))
        raise BadUserRequest(str(error))

    try:
        #trait = apiu._find_study_info(study=study, trait=trait)
        searcher = search.Search(apiu.properties)

        #datasets, index_marker = searcher.search_study(trait=trait, study=study,
        #                                               start=start, size=size, pval_interval=pval_interval)
        if tissue:
            datasets, index_marker, paginate = searcher.search(tissue=tissue, study=study, trait=trait, gene=gene, snp=snp,
                                                     start=start, size=size, pval_interval=pval_interval,
                                                     quant_method=quant_method, paginate=paginate, qtl_group=qtl_group)

            data_dict = apiu._get_array_to_display(datasets=datasets, links=links)

            params = dict(tissue=tissue, molecular_trait_id=trait,  variant_id=snp, study=study, p_lower=p_lower, p_upper=p_upper, gene_id=gene, quant_method=quant_method, qtl_group=qtl_group, links=links)
        else:
            datasets, index_marker, paginate = searcher.search(study=study, gene=gene, snp=snp, trait=trait, start=start, size=size, 
                    pval_interval=pval_interval, quant_method=quant_method, paginate=paginate, qtl_group=qtl_group)

            data_dict = apiu._get_array_to_display(datasets=datasets, links=links)

            params = dict(study=study, p_lower=p_lower, p_upper=p_upper,  variant_id=snp, gene_id=gene, molecular_trait_id=trait, quant_method=quant_method, qtl_group=qtl_group, links=links)


        response = apiu._create_response(method_name='api.get_tissue_study_assocs', start=start, size=size,
                                         index_marker=index_marker,
                                         data_dict=data_dict, params=params)

        return simplejson.dumps(response, ignore_nan=True)

    except (NotFoundError, SubgroupError) as error:
        logging.error("/studies/" + study + ". " + (str(error)))
        raise RequestedNotFound(str(error))