def ajax_range_overlap_search(request, src, start, stop, search_idx, ajax): ''' Return count or paginated range elastic result as a JSON ''' if ajax == 'count': elastic = Search.range_overlap_query(src, start, stop, idx=search_idx) return JsonResponse(elastic.get_count()) search_from = request.POST.get("from") size = request.POST.get("size") elastic = Search.range_overlap_query(src, start, stop, search_from=search_from, size=size, idx=search_idx) return JsonResponse(elastic.get_json_response())
def gene_in_region(cls, hit, section=None, config=None, result_container={}): try: padded_region_doc = utils.Region.pad_region_doc(Document(hit)) except: logger.warn('Region padding error ') return result_container # 'build_info': {'end': 22411939, 'seqid': '1', 'build': 38, 'start': 22326008}, 'region_id': '1p36.12_008'} region_id = getattr(padded_region_doc, "region_id") region_name = getattr(padded_region_doc, "region_name") build_info = getattr(padded_region_doc, "build_info") diseases = getattr(padded_region_doc, "tags")['disease'] seqid = build_info['seqid'] start = build_info['start'] end = build_info['end'] gene_index = ElasticSettings.idx('GENE', idx_type='GENE') elastic = Search.range_overlap_query(seqid=seqid, start_range=start, end_range=end, idx=gene_index, field_list=['start', 'stop', '_id'], seqid_param="chromosome", end_param="stop", size=10000) result_docs = elastic.search().docs genes = set() for doc in result_docs: genes.add(doc.doc_id()) result_container_populated = cls.populate_container(region_id, region_name, fnotes=None, features=genes, diseases=diseases, result_container=result_container) return result_container_populated
def get_genes_for_region(seqid, start, end, must=None): coding = [] non_coding = [] gene_index = ElasticSettings.idx('GENE', idx_type='GENE') elastic = Search.range_overlap_query(seqid=seqid.lower(), start_range=start, end_range=end, idx=gene_index, field_list=['start', 'stop', '_id', 'biotype', 'symbol'], seqid_param="chromosome", end_param="stop", size=10000) for doc in elastic.search().docs: if getattr(doc, "biotype") == "protein_coding": coding.append(doc) else: non_coding.append(doc) return (coding, non_coding)
def _build_gene_query(chrom, segmin, segmax): # get genes based on this segment geneQuery = Search.range_overlap_query(seqid=chrom, start_range=segmin, end_range=segmax, search_from=0, size=2000, idx=getattr(chicp_settings, 'CP_GENE_IDX')+'/genes/', field_list=utils.geneFields) geneResult = geneQuery.get_result() genes = geneResult['data'] genes = utils.makeRelative(int(segmin), int(segmax), ['start', 'end'], genes) genes = [utils.flattenAttr(o) for o in genes] for o in genes: o.update({"bumpLevel": 0}) o.update({"length": (o['end']-o['start'])}) genes.sort(key=operator.itemgetter('length')) return genes
def range_overlap_search(request, src, start, stop, search_idx=ElasticSettings.indices_str()): ''' Renders a elastic result page based on the src, start and stop ''' elastic = Search.range_overlap_query(src, start, stop, idx=search_idx) result = elastic.search() context = {} context['diseases'] = _add_diseases() context['total'] = result.hits_total context['db'] = result.idx context['size'] = result.size context['query'] = result.query context["idxs"] = _categories(result.idx) context["chromosome"] = src context["start"] = start context["stop"] = stop return render(request, 'search/searchresults.html', context, content_type='text/html')
def filter_queryset(self, request, queryset, view): ''' Override this method to request feature locations. ''' try: filterable = getattr(view, 'filter_fields', []) filters = dict([(k, v) for k, v in request.GET.items() if k in filterable]) ftype = filters.get('ftype').upper() build = self._get_build(filters.get('build', settings.DEFAULT_BUILD)) if ftype is None or ftype == '': return [ElasticObject(initial={'error': 'No feature type provided.'})] idx = 'REGION' if ftype == 'ASSOC_SNP' else ftype idx_type = 'STUDY_HITS' if idx == 'REGION' else ftype print(idx_type) doc_class_str = ElasticSettings.get_label(idx, idx_type, label='class') doc_class = import_string(doc_class_str) if doc_class_str is not None else None if ftype == 'REGION': features = doc_class.get_overlapping_features(build, filters.get('chr').replace('chr', ''), filters.get('start'), filters.get('end')) return features if ftype == 'ASSOC_SNP': hits = doc_class.get_overlapping_hits(build, filters.get('chr').replace('chr', ''), filters.get('start'), filters.get('end')) features = Region.get_immune_snps(hits) return features sources = ['start', 'stop', 'seqid', 'chromosome', 'strand', 'biotype', 'giestain', 'name', 'symbol', 'id', 'ref', 'alt'] seqid_param = 'seqid' end_param = 'stop' start_param = 'start' if ftype == 'GENE': seqid_param = 'chromosome' elastic = Search.range_overlap_query(filters.get('chr').replace('chr', ''), filters.get('start'), filters.get('end'), idx=ElasticSettings.idx(idx, idx_type), size=10000, seqid_param=seqid_param, end_param=end_param, start_param=start_param, field_list=sources) docs = elastic.search().docs features = [] for doc in docs: if isinstance(doc, RegionDocument): doc = Region.pad_region_doc(doc) loc = doc.get_position(build=build).split(':') pos = loc[1].replace(',', '').split('-') attributes = {} feature = { 'name': doc.get_name(), 'id': doc.doc_id(), 'chr': loc[0], 'start': int(pos[0]), 'end': int(pos[1]) if len(pos) > 1 else int(pos[0]), 'strand': doc.get_strand_as_int() } if hasattr(doc, "biotype") and getattr(doc, "biotype") is not None: attributes["biotype"] = getattr(doc, "biotype") if hasattr(doc, "giestain") and getattr(doc, "giestain") is not None: attributes["stain"] = getattr(doc, "giestain") if hasattr(doc, "ref") and hasattr(doc, "alt") and getattr(doc, "ref") is not None and getattr(doc, "alt") is not None: attributes["alleles"] = getattr(doc, "ref")+"/"+getattr(doc, "alt") feature['attributes'] = attributes features.append(ElasticObject(feature)) return features except (ConnectionError) as err: logger.error(err) raise Http404
def test_range_query(self): ''' Test range overlap django-elastic function. ''' elastic = Search.range_overlap_query(seqid='chr1', start_range=1, end_range=206770620, idx=IDX['GFF_GENERIC']['indexName'], field_list=['start', 'end']) self.assertEquals(len(elastic.search().docs), 4)