try-bionode-esnext.js

November 30, 2015 · View on GitHub

import fs from 'fs'; import Promise from 'bluebird'; import rp from 'request-promise'; import _ from 'lodash'; import tool from 'tool-stream'; import es from 'event-stream'; import bio from 'bionode'; import dat from 'dat';

// ==== introduction to patterns ==== // Can use bionode modules in 3 different ways:

// 1. The Callback pattern /* bio.ncbi.urls('assembly', 'Acromyrmex', function(urls) { console.log(urls[0].genomic.fna) }) */ // reimplemented (quickly) with Promises+Generators=async/await: async function bioP(modules, args) { let func = bio; for (let mod of modules) { func = func[mod]; }

const ø = Object.create(null);
return new Promise( (resolve, reject) => {
    try {
        func.apply(ø, _(args).concat(resolve).value());
    } catch(e) {
        console.error(e);
    }
});

}

(async function() { let urls = await bioP(['ncbi', 'urls'], ['assembly', 'Acromyrmex']); console.log(callback: ${urls[0].genomic.fna}); })();

// 2. The event pattern // Too much data at once will crash callbacks, instead get chunks of data bio.ncbi.urls('assembly', 'Acromyrmex').on('data', (url) => { console.log(chunk: ${url.genomic.fna}); });

// 3. The pipe pattern bio.ncbi.urls('assembly', 'Acromyrmex') .pipe(tool.extractProperty('genomic.fna')) .pipe(es.through(function write(data) { this.emit('data', pipe: ${data}\n); })) .pipe(process.stdout);

// ==== bionode-fasta ===== // First, lets download and write to the filesystem a fasta file from ncbi // (not using bionode-ncbi since that returns an already parsed JSON fasta object) async function fastaDownload(pId) { let fastaFile = await rp(http://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.cgi?db=protein&id=${pId}&rettype=fasta&retmode=text) fs.writeFileSync(${__dirname}/${pId}.fasta, fastaFile); console.log(wrote ${pId}.fasta); } (async function() { const pId = '50659069' await fastaDownload(pId); // Then, lets use bionode.fasta to parsa fasta into a JSON buffer // PS, notice how we aren't inside a callback right now ;) // (though you can only await inside an async function) fs.createReadStream(${__dirname}/${pId}.fasta) .pipe(bio.fasta()) .pipe(es.through(function write(data) { this.emit('data', fasta parse: \n${data}); })) .pipe(process.stdout); })();

// ==== bionode-seq ==== (async function() { const fasta = await bioP(['ncbi', 'fetch'], ['protein', '50659069']); const threshold = 85; //default 90 const length = 1000; //default 10 0000 const type = bio.seq.checkType(fasta[0].seq, threshold, length); console.log(sequence type: ${type});

const reverse = bio.seq.reverse(fasta[0].seq);
console.log(`reversed: ${reverse}`);

const complement = bio.seq.complement(fasta[0].seq);
console.log(`complement: ${complement}`);

console.log(`transcribe bases, e.g. A -> ${bio.seq.getTranscribedBase('A')}`);

console.log(`codon -> AA, e.g. AUG -> ${bio.seq.getTranslatedAA('AUG')}`);

const seq = 'ATGACCCTGAAGGTGAATGACAG';
const exon = bio.seq.removeIntrons(seq, [[2, 9], [12, 20]]);
console.log(`remove introns [[2, 9], [12, 20]] from ${seq} -> ${exon}`);

console.log('transcribe DNA <-> RNA, e.g. ${seq} <-> ${bio.seq.transcribe(seq)}');

console.log(`translate ${seq} -> ${bio.seq.translate(seq)}`);

console.log(`reverse exons [2,8] -> [${bio.seq.reverseExons([[2,8]], 20)}]`);

console.log(`non-canonical splice sites: [${bio.seq.findNonCanonicalSplices("GGCGGCGGCGGTGAGGTGGACCTGCGCGAATACGTGGTCGCCCTGT", [[0, 10], [20, 30]])}]`);

console.log(`check canonical translation start site: ATGACCCTGAAGGT -> ${bio.seq.checkCanonicalTranslationStartSite('ATGACCCTGAAGGT')}`);

console.log(`get reading frames: [${bio.seq.getReadingFrames("ATGACCCTGAAGGTGAATGACAGGAAGCCCAAC")}]`);

console.log(`get open reading frames: [${bio.seq.getOpenReadingFrames("ATGACCCTGAAGGTGAATGACAGGAAGCCCAAC")}]`);

console.log(`get all open reading frames: [${bio.seq.getAllOpenReadingFrames("ATGACCCTGAAGGTGAATGACAGGAAGCCCAAC")}]`);

console.log(`find longest open reading frame: [${bio.seq.findLongestOpenReadingFrame("ATGACCCTGAAGGTGAATGACAGGAAGCCCAAC")}]`);

})();