def back_translator(): """ Back translator. """ output = Output(__file__) output.addMessage( __file__, -1, 'INFO', 'Received Back Translate request from {}'.format(request.remote_addr)) stats.increment_counter('back-translator/website') description = request.args.get('description') variants = [] if description: variants = backtranslator.backtranslate(output, description) errors, warnings, summary = output.Summary() messages = map(util.message_info, output.getMessages()) output.addMessage(__file__, -1, 'INFO', 'Finished Back Translate request') return render_template('back-translator.html', errors=errors, summary=summary, description=description or '', messages=messages, variants=variants)
def snp_converter(): """ SNP converter. Convert a dbSNP rs number to HGVS description(s) of the SNP specified on the reference sequence(s) used by dbSNP. """ # Backwards compatibility. if 'rsId' in request.args: return redirect(url_for('.snp_converter', rs_id=request.args['rsId']), code=301) rs_id = request.args.get('rs_id') if not rs_id: return render_template('snp-converter.html') output = Output(__file__) output.addMessage( __file__, -1, 'INFO', 'Received request snpConvert(%s) from %s' % (rs_id, request.remote_addr)) stats.increment_counter('snp-converter/website') descriptions = ncbi.rsid_to_descriptions(rs_id, output) messages = map(util.message_info, output.getMessages()) output.addMessage(__file__, -1, 'INFO', 'Finished request snpConvert(%s)' % rs_id) return render_template('snp-converter.html', rs_id=rs_id, descriptions=descriptions, messages=messages, summary=output.Summary()[2])
def description_extractor(): """ The Variant Description Extractor (experimental service). """ reference_sequence = request.args.get('reference_sequence') variant_sequence = request.args.get('variant_sequence') if not (reference_sequence and variant_sequence): return render_template('description-extractor.html') output = Output(__file__) output.addMessage(__file__, -1, 'INFO', 'Received Description Extract request from %s' % request.remote_addr) # Todo: Move this to the describe module. if not util.is_dna(reference_sequence): output.addMessage(__file__, 3, 'ENODNA', 'Reference sequence is not DNA.') if not util.is_dna(variant_sequence): output.addMessage(__file__, 3, 'ENODNA', 'Variant sequence is not DNA.') raw_vars = describe.describe(reference_sequence, variant_sequence) description = describe.alleleDescription(raw_vars) errors, warnings, summary = output.Summary() messages = map(util.message_info, output.getMessages()) output.addMessage(__file__, -1, 'INFO', 'Finished Description Extract request') return render_template('description-extractor.html', reference_sequence=reference_sequence, variant_sequence=variant_sequence, raw_vars=raw_vars, description=description, errors=errors, summary=summary, messages=messages)
def description_extractor_submit(): """ The Variant Description Extractor (experimental service). There multiple ways for the user to provide two sequences, corresponding to the values for the `reference_method` and `sample_method` fields, each requiring some additional fields to be defined: `raw_method` The reference and sample sequences are pasted into the form fields. - `reference_sequence`: The reference sequence. - `sample_sequence`: The sample sequence. `file_method` The reference and sample sequences are uploaded. - `reference_file`: The reference file. - `sample_file`: The sample file. `refseq_method` The reference and sample sequences are given by RefSeq accession numbers. - `reference_accession_number`: RefSeq accession number for the reference sequence. - `sample_accession_number`: RefSeq accession number for the sample sequence. """ output = Output(__file__) output.addMessage(__file__, -1, 'INFO', 'Received Description Extract request from %s' % request.remote_addr) stats.increment_counter('description-extractor/website') r = s = '' reference_method = request.form.get('reference_method') sample_method = request.form.get('sample_method') reference_sequence = request.form.get('reference_sequence') sample_sequence = request.form.get('sample_sequence') reference_file = request.files.get('reference_file') sample_file = request.files.get('sample_file') reference_filename = '' sample_filename = '' reference_accession_number = request.form.get('reference_accession_number') sample_accession_number = request.form.get('sample_accession_number') if reference_method == 'refseq_method': if reference_accession_number: retriever = Retriever.GenBankRetriever(output) genbank_record = retriever.loadrecord(reference_accession_number) if genbank_record: r = unicode(genbank_record.seq) else: output.addMessage(__file__, 3, 'EEMPTYFIELD', 'Reference accession number input fields is empty.') elif reference_method == 'file_method': if reference_file: reference_filename = reference_file.filename r = util.read_dna(reference_file) else: output.addMessage(__file__, 3, 'EEMPTYFIELD', 'No reference file provided.') else: # raw_method if reference_sequence: r = util.read_dna(StringIO.StringIO(reference_sequence)) else: output.addMessage(__file__, 3, 'EEMPTYFIELD', 'Reference sequence number input fields is empty.') if sample_method == 'refseq_method': if sample_accession_number: retriever = Retriever.GenBankRetriever(output) genbank_record = retriever.loadrecord(sample_accession_number) if genbank_record: s = unicode(genbank_record.seq) else: output.addMessage(__file__, 3, 'EEMPTYFIELD', 'Sample accession number input fields is empty.') elif sample_method == 'file_method': if sample_file: sample_filename = sample_file.filename s = util.read_dna(sample_file) else: output.addMessage(__file__, 3, 'EEMPTYFIELD', 'No sample file provided.') else: # raw_method if sample_sequence: s = util.read_dna(StringIO.StringIO(sample_sequence)) else: output.addMessage(__file__, 3, 'EEMPTYFIELD', 'Sample sequence number input fields is empty.') # Todo: Move this to the describe module. if not r or not util.is_dna(r): output.addMessage(__file__, 3, 'ENODNA', 'Reference sequence is not DNA.') if not s or not util.is_dna(s): output.addMessage(__file__, 3, 'ENODNA', 'Sample sequence is not DNA.') raw_vars = None if r and s: if (len(r) > settings.EXTRACTOR_MAX_INPUT_LENGTH or len(s) > settings.EXTRACTOR_MAX_INPUT_LENGTH): output.addMessage(__file__, 3, 'EMAXSIZE', 'Input sequences are restricted to {:,} bp.' .format(settings.EXTRACTOR_MAX_INPUT_LENGTH)) else: raw_vars = extractor.describe_dna(r, s) errors, warnings, summary = output.Summary() messages = map(util.message_info, output.getMessages()) output.addMessage(__file__, -1, 'INFO', 'Finished Description Extract request') return render_template('description-extractor.html', extractor_max_input_length=settings.EXTRACTOR_MAX_INPUT_LENGTH, reference_sequence=reference_sequence or '', sample_sequence=sample_sequence or '', reference_accession_number=reference_accession_number or '', sample_accession_number=sample_accession_number or '', reference_filename=reference_filename or '', sample_filename=sample_filename or '', raw_vars=raw_vars, errors=errors, summary=summary, messages=messages, reference_method=reference_method, sample_method=sample_method)
def name_checker(): """ Name checker. """ # For backwards compatibility with older LOVD versions, we support the # `mutationName` argument. If present, we redirect and add `standalone=1`. # # Also for backwards compatibility, we support the `name` argument as an # alias for `description`. if 'name' in request.args: return redirect(url_for('.name_checker', description=request.args['name'], standalone=request.args.get('standalone')), code=301) if 'mutationName' in request.args: return redirect(url_for('.name_checker', description=request.args['mutationName'], standalone=1), code=301) description = request.args.get('description') if not description: return render_template('name-checker.html') output = Output(__file__) output.addMessage(__file__, -1, 'INFO', 'Received variant %s from %s' % (description, request.remote_addr)) stats.increment_counter('name-checker/website') variantchecker.check_variant(description, output) errors, warnings, summary = output.Summary() parse_error = output.getOutput('parseError') record_type = output.getIndexedOutput('recordType', 0, '') reference = output.getIndexedOutput('reference', 0, '') if reference: if record_type == 'LRG': reference_filename = reference + '.xml' else : reference_filename = reference + '.gb' else: reference_filename = None genomic_dna = output.getIndexedOutput('molType', 0) != 'n' genomic_description = output.getIndexedOutput('genomicDescription', 0, '') # Create a link to the UCSC Genome Browser. browser_link = None raw_variants = output.getIndexedOutput('rawVariantsChromosomal', 0) if raw_variants: positions = [pos for descr, (first, last) in raw_variants[2] for pos in (first, last)] bed_url = url_for('.bed', description=description, _external=True) browser_link = ('http://genome.ucsc.edu/cgi-bin/hgTracks?db=hg19&' 'position={chromosome}:{start}-{stop}&hgt.customText=' '{bed_file}'.format(chromosome=raw_variants[0], start=min(positions) - 10, stop=max(positions) + 10, bed_file=urllib.quote(bed_url))) # Experimental description extractor. if (output.getIndexedOutput('original', 0) and output.getIndexedOutput('mutated', 0)): allele = extractor.describe_dna(output.getIndexedOutput('original', 0), output.getIndexedOutput('mutated', 0)) extracted = '(skipped)' if allele: extracted = unicode(allele) else: extracted = '' # Todo: Generate the fancy HTML views for the proteins here instead of in # `mutalyzer.variantchecker`. arguments = { 'description' : description, 'messages' : map(util.message_info, output.getMessages()), 'summary' : summary, 'parse_error' : parse_error, 'errors' : errors, 'genomicDescription' : genomic_description, 'chromDescription' : output.getIndexedOutput( 'genomicChromDescription', 0), 'genomicDNA' : genomic_dna, 'visualisation' : output.getOutput('visualisation'), 'descriptions' : output.getOutput('descriptions'), 'protDescriptions' : output.getOutput('protDescriptions'), 'oldProtein' : output.getOutput('oldProteinFancy'), 'altStart' : output.getIndexedOutput('altStart', 0), 'altProtein' : output.getOutput('altProteinFancy'), 'newProtein' : output.getOutput('newProteinFancy'), 'transcriptInfo' : output.getIndexedOutput('hasTranscriptInfo', 0, False), 'transcriptCoding' : output.getIndexedOutput('transcriptCoding', 0, False), 'exonInfo' : output.getOutput('exonInfo'), 'cdsStart_g' : output.getIndexedOutput('cdsStart_g', 0), 'cdsStart_c' : output.getIndexedOutput('cdsStart_c', 0), 'cdsStop_g' : output.getIndexedOutput('cdsStop_g', 0), 'cdsStop_c' : output.getIndexedOutput('cdsStop_c', 0), 'restrictionSites' : output.getOutput('restrictionSites'), 'legends' : output.getOutput('legends'), 'reference_filename' : reference_filename, # Todo: Download link is not shown... 'browserLink' : browser_link, 'extractedDescription': extracted, 'standalone' : bool(request.args.get('standalone')) } output.addMessage(__file__, -1, 'INFO', 'Finished variant %s' % description) return render_template('name-checker.html', **arguments)