Example #1
0
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
Example #2
0
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()