def test_get_label(self): ''' Test method for getting the index or type label in the settings. ''' self.assertRaises(SettingsError, ElasticSettings.get_label, 'ABC') self.assertTrue( isinstance( ElasticSettings.get_label('MARKER', idx_type='MARKER', label='description'), str)) self.assertTrue(isinstance(ElasticSettings.get_label('MARKER'), str))
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]) query_str = filters.get('feature', 'PTPN22') build = self._get_build(filters.get('build', settings.DEFAULT_BUILD)) if query_str is None or query_str == '': return [ElasticObject(initial={'error': 'No feature name provided.'})] search_fields = ['id', 'symbol', 'dbxrefs.ensembl', 'region_name'] sources = ['start', 'stop', 'seqid', 'chromosome', 'disease_loci'] idxs = ElasticSettings.getattr('IDX') MARKER_IDX = '' if build == ElasticSettings.get_label('MARKER', label='build'): MARKER_IDX = 'MARKER' if MARKER_IDX == '': for idx in idxs: if 'MARKER' in idx: if build == ElasticSettings.get_label(idx, label='build'): MARKER_IDX = idx (idx, idx_type) = ElasticSettings.idx_names(MARKER_IDX, 'MARKER') (idx_r, idx_type_r) = ElasticSettings.idx_names('REGION', 'REGION') (idx_g, idx_type_g) = ElasticSettings.idx_names('GENE', 'GENE') idx += ',' + idx_r + ',' + idx_g idx_type += ',' + idx_type_r + ',' + idx_type_g equery = BoolQuery(must_arr=Query.query_string(query_str, fields=search_fields)) elastic = Search(search_query=ElasticQuery(equery, sources), size=10, idx=idx, idx_type=idx_type) docs = elastic.search().docs locs = [] 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('-') locs.append(ElasticObject( {'feature': query_str, 'chr': loc[0], 'start': int(pos[0]), 'end': int(pos[1]) if len(pos) > 1 else int(pos[0]), 'locusString': query_str+" ("+str(loc[1])+")"})) return locs except (TypeError, ValueError, IndexError, ConnectionError): raise Http404
def _get_marker_build(idx_name): ''' Get the marker build as defined in the settings. ''' try: idx_key = ElasticSettings.get_idx_key_by_name(idx_name) return ElasticSettings.get_label(idx_key, label='build') except (KeyError, SettingsError, TypeError): logger.error('Marker build not identified from ELASTIC settings.') return ''
def factory(hit): ''' Factory method for creating specific document object based on index type of the hit. @type hit: dict @param hit: Elasticsearch hit. ''' (idx, idx_type) = ElasticSettings.get_idx_key_by_name(hit['_index'], idx_type_name=hit['_type']) if idx is None or idx_type is None: return PydginDocument(hit) doc_class = ElasticSettings.get_label(idx, idx_type, label='class') return doc_class(hit) if doc_class is not None else PydginDocument(hit)
def factory(hit): ''' Factory method for creating types of documents based on their elasticsearch index type. @type hit: dict @param hit: elasticsearch hit. ''' (idx, idx_type) = ElasticSettings.get_idx_key_by_name(hit['_index'], idx_type_name=hit['_type']) if idx is None or idx_type is None: return PydginDocument(hit) 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 return doc_class(hit) if doc_class is not None else PydginDocument(hit)
def _build_snp_query(snp_track, chrom, segmin, segmax): snps = [] snpMeta = {} maxScore = -1 if snp_track and snp_track != 'None': # get SNPs based on this segment mo = re.match(r"(.*)-(.*)", snp_track) (group, track) = mo.group(1, 2) try: snp_track_idx = ElasticSettings.idx('CP_STATS_'+group.upper(), snp_track.upper()) except SettingsError: snp_track_idx = ElasticSettings.idx('CP_STATS_'+group.upper())+"/"+track query = ElasticQuery.filtered(Query.terms("seqid", [chrom, str("chr"+chrom)]), Filter(RangeQuery("end", gte=segmin, lte=segmax)), utils.snpFields) snpQuery = Search(search_query=query, search_from=0, size=10000, idx=snp_track_idx) # snpResult = snpQuery.get_result() # snps = snpResult['data'] snpResult = snpQuery.get_json_response() snps = [] for hit in snpResult['hits']['hits']: snps.append(hit['_source']) snps = utils.makeRelative(int(segmin), int(segmax), ['start', 'end'], snps) data_type = ElasticSettings.get_label('CP_STATS_'+group.upper(), None, "data_type") snpSettings = getattr(chicp_settings, 'STUDY_DEFAULTS').get(data_type) for s in snps: if float(s['score']) > maxScore: maxScore = float(s['score']) snpSettings['max'] = maxScore snpMeta = snpSettings return snps, snpMeta
def _build_snp_query(snp_track, chrom, segmin, segmax): snps = [] snpMeta = {} maxScore = -1 if snp_track and snp_track != 'None': # get SNPs based on this segment mo = re.match(r"(.*)-(.*)", snp_track) (group, track) = mo.group(1, 2) try: snp_track_idx = ElasticSettings.idx('CP_STATS_'+group.upper(), snp_track.upper()) except SettingsError: snp_track_idx = ElasticSettings.idx('CP_STATS_'+group.upper())+"/"+track query = ElasticQuery.filtered(Query.terms("seqid", [chrom, str("chr"+chrom)]), Filter(RangeQuery("end", gte=segmin, lte=segmax)), utils.snpFields) snpQuery = Search(search_query=query, search_from=0, size=10000, idx=snp_track_idx) # snpResult = snpQuery.get_result() # snps = snpResult['data'] snpResult = snpQuery.get_json_response() snps = [] for hit in snpResult['hits']['hits']: snps.append(hit['_source']) snps = utils.makeRelative(int(segmin), int(segmax), ['start', 'end'], snps) data_type = ElasticSettings.get_label('CP_STATS_'+group.upper(), None, "data_type") snpSettings = getattr(chicp_settings, 'STUDY_DEFAULTS').get(data_type) for s in snps: if float(s['score']) > maxScore: maxScore = float(s['score']) snpSettings['max'] = maxScore snpMeta = snpSettings return snps, snpMeta
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 chicpea(request): queryDict = request.GET user = request.user context = dict() context['title'] = 'Capture HiC Plotter' context['admin_url_path'] = settings.ADMIN_URL_PATH context['RECAPTCHA_KEY'] = settings.RECAPTCHA_KEY # context['tissue'] = 'Total_CD4_Activated' context['searchTerm'] = random.choice(getattr(chicp_settings, 'DEFAULT_GENES')) if queryDict.get("term"): context['searchTerm'] = queryDict.get("term") if queryDict.get("tissue"): context['tissue'] = queryDict.get("tissue") else: context['default_target'] = getattr(chicp_settings, 'DEFAULT_TARGET') context['default_tissue'] = getattr(chicp_settings, 'DEFAULT_TISSUE') (idx_keys_auth, idx_type_keys_auth) = get_authenticated_idx_and_idx_types( user=user, idx_keys=None, idx_type_keys=None) indexes = list() tissues = list() for target in getattr(chicp_settings, 'CP_TARGET'): if 'CP_TARGET_'+target not in idx_keys_auth: continue indexes.append({"value": target, "text": ElasticSettings.get_label('CP_TARGET_'+target)}) elasticJSON = Search(idx=ElasticSettings.idx('CP_TARGET_'+target)).get_mapping(mapping_type="gene_target") tissueList = list(elasticJSON[ElasticSettings.idx('CP_TARGET_'+target)] ['mappings']['gene_target']['_meta']['tissue_type'].keys()) utils.tissues['CP_TARGET_'+target] = tissueList tissueList.sort() for t in tissueList: tissues.append({"value": t, "text": t.replace("_", " "), "class": target}) context['allIndexes'] = indexes context['allTissues'] = tissues snpTracks = OrderedDict() defaultTrack = getattr(chicp_settings, 'DEFAULT_TRACK') for group in getattr(chicp_settings, 'CP_STATS'): if 'CP_STATS_'+group not in idx_keys_auth: continue if group == 'UD': if settings.INCLUDE_USER_UPLOADS: context['allow_user_uploads'] = True else: continue snp_tracks = list() for track, details in (ElasticSettings.get_idx_types(idx_name='CP_STATS_'+group, user='******')).items(): if 'CP_STATS_'+group+'.'+track not in idx_type_keys_auth: continue snp_tracks.append({"value": track.lower(), "text": details['label']}) if defaultTrack == '': defaultTrack = track.lower() snpTracks[ElasticSettings.get_label('CP_STATS_'+group)] = sorted(snp_tracks, key=itemgetter('text')) context['snpTracks'] = snpTracks if queryDict.get("snp_track"): context['snp_track'] = queryDict.get("snp_track") else: context['snp_track'] = defaultTrack return render(request, 'chicp/index.html', context, content_type='text/html')
def chicpea(request): queryDict = request.GET user = request.user context = dict() context['title'] = 'Capture HiC Plotter' context['admin_url_path'] = settings.ADMIN_URL_PATH context['RECAPTCHA_KEY'] = settings.RECAPTCHA_KEY # context['tissue'] = 'Total_CD4_Activated' context['searchTerm'] = random.choice(getattr(chicp_settings, 'DEFAULT_GENES')) if queryDict.get("term"): context['searchTerm'] = queryDict.get("term") if queryDict.get("tissue"): context['tissue'] = queryDict.get("tissue") else: context['default_target'] = getattr(chicp_settings, 'DEFAULT_TARGET') context['default_tissue'] = getattr(chicp_settings, 'DEFAULT_TISSUE') (idx_keys_auth, idx_type_keys_auth) = get_authenticated_idx_and_idx_types( user=user, idx_keys=None, idx_type_keys=None) indexes = list() tissues = list() for target in getattr(chicp_settings, 'CP_TARGET'): if 'CP_TARGET_'+target not in idx_keys_auth: continue indexes.append({"value": target, "text": ElasticSettings.get_label('CP_TARGET_'+target)}) elasticJSON = Search(idx=ElasticSettings.idx('CP_TARGET_'+target)).get_mapping(mapping_type="gene_target") tissueList = list(elasticJSON[ElasticSettings.idx('CP_TARGET_'+target)] ['mappings']['gene_target']['_meta']['tissue_type'].keys()) utils.tissues['CP_TARGET_'+target] = tissueList tissueList.sort() for t in tissueList: tissues.append({"value": t, "text": t.replace("_", " "), "class": target}) context['allIndexes'] = indexes context['allTissues'] = tissues snpTracks = OrderedDict() defaultTrack = getattr(chicp_settings, 'DEFAULT_TRACK') for group in getattr(chicp_settings, 'CP_STATS'): if 'CP_STATS_'+group not in idx_keys_auth: continue if group == 'UD': if settings.INCLUDE_USER_UPLOADS: context['allow_user_uploads'] = True else: continue snp_tracks = list() for track, details in (ElasticSettings.get_idx_types(idx_name='CP_STATS_'+group, user='******')).items(): if 'CP_STATS_'+group+'.'+track not in idx_type_keys_auth: continue snp_tracks.append({"value": track.lower(), "text": details['label']}) if defaultTrack == '': defaultTrack = track.lower() snpTracks[ElasticSettings.get_label('CP_STATS_'+group)] = sorted(snp_tracks, key=itemgetter('text')) context['snpTracks'] = snpTracks if queryDict.get("snp_track"): context['snp_track'] = queryDict.get("snp_track") else: context['snp_track'] = defaultTrack return render(request, 'chicp/index.html', context, content_type='text/html')