def custom_track_request(chromosome, startpos, endpos, request_proxy=None, *args, **kwargs): """ Needs request_proxy with hgsid or kwargs.hgsid NOTE: for whatever reason, you need to set the startpos in the submit to the startpos computed by the hgPcr tool (and referenced in sequence lookup) minus 1. I dunno. Will write unit test to check if this ever changes. """ if request_proxy: if not request_proxy.hgsid: raise ValueError, "Cannot make custom track request without hgsid in session" else: hgsid = request_proxy.hgsid else: if not kwargs.get('hgsid', None): raise ValueError, "Cannot make custom track request without hgsid in kwargs" else: hgsid = kwargs.get('hgsid') if 'chr%s' % chromosome not in CHROMOSOME_MAXES[HG19]: raise ValueError, "Invalid chromosome: %s" % chromosome if startpos < 1: startpos = 1 if endpos > CHROMOSOME_MAXES[HG19]['chr%s' % chromosome]: endpos = CHROMOSOME_MAXES[HG19]['chr%s' % chromosome] uri = 'hgCustom' defaults = {'hgsid': hgsid, 'clade': MAMMAL, 'org': HUMAN, 'db': HG19, 'hgct_customText': """track name='%s' chr%s %s %s""" % (hgsid, chromosome, startpos-1, endpos)} req = make_request_params(defaults, **kwargs) datagen, headers = poster_multipart_encode_patch(req) request = urllib2.Request(make_get_request_url(BASE_URL, uri), datagen, headers) if request_proxy is not None: response = request_proxy.request(request) else: response = urllib2.urlopen(request) response = response.read() # hack hack hack if "Unrecognized format line" in response or "Error line" in response or "Add Custom Tracks" in response: # TODO: parse the error as well? raise ValueError, "Invalid custom track specification: chr%s %s %s" % (chromosome, startpos, endpos) return response
def table_sequence_request(chromosome, startpos, endpos, request_proxy=None, *args, **kwargs): """ Make table sequence request. Actually makes two requests; the two requests are dependent (at least to generate a sequence), so they are grouped in the same method. Requires a request proxy with hgsid and hgct_table set *or* hgsid and track_id kwargs set. """ if request_proxy: if not request_proxy.hgsid or not request_proxy.track_id: raise ValueError, "Required variables (hgsid, track_id) not set in session" else: hgsid = request_proxy.hgsid track_id = request_proxy.track_id elif not kwargs.get('hgsid', None) or not kwargs.get('track_id', None): raise ValueError, "Required kwargs (hgsid, track_id) not set" else: hgsid = kwargs.get('hgsid') track_id = kwargs.get('track_id') if 'chr%s' % chromosome not in CHROMOSOME_MAXES[HG19]: raise ValueError, "Invalid chromosome: %s" % chromosome # zero based request if startpos < 0: startpos = 0 if endpos > CHROMOSOME_MAXES[HG19]["chr%s" % chromosome]: endpos = CHROMOSOME_MAXES[HG19]["chr%s" % chromosome] uri = "hgTables" defaults = {'hgsid': hgsid, 'boolshad.sendToGalaxy': 0, 'boolshad.sendToGreat': 0, 'clade': MAMMAL, 'db': HG19, 'hgta_compressType': "none", 'hgta_doTopSubmit': "get output", "hgta_outFileName": "", "hgta_outputType": "sequence", "hgta_regionType": "range", "hgta_table": "ct_%s_%s" % (hgsid, track_id), "hgta_track": "ct_%s_%s" % (hgsid, track_id), "position": "chr%s:%s-%s" % (chromosome, startpos, endpos)} req = make_request_params(defaults, **kwargs) datagen, headers = poster_multipart_encode_patch(req) request = urllib2.Request(make_get_request_url(BASE_URL, uri), datagen, headers) if request_proxy is not None: response = request_proxy.request(request) else: response = urllib2.urlopen(request) intermediate = response.read() intermediate_tree = BeautifulSoup(intermediate) # TODO is this more general? (Error case in any UCSC response) # if so, put on the request proxy if "Error" in intermediate_tree.head.title.text or len(intermediate_tree.findAll(id='warnBox')) > 0: raise ValueError, "Could not generate sequence from arguments to hgTables" defaults2 = {'hgsid': hgsid, 'boolshad.hgSeq.maskRepeats': 0, 'boolshad.hgSeq.revComp': 0, 'hgSeq.casing': "upper", 'hgSeq.cdsExon': 1, 'hgSeq.padding3': 0, # these don't seem to actually work 'hgSeq.padding5': 0, # these don't seem to actually work 'hgSeq.repMasking': 'lower', 'hgta_doGenomicDna': 'get sequence'} req = make_request_params(defaults2, **kwargs) if request_proxy is not None: response = request_proxy.request(make_get_request_url(BASE_URL, uri, req)) else: response = urllib2.urlopen(make_get_request_url(BASE_URL, uri, req)) return response.read()