-
Notifications
You must be signed in to change notification settings - Fork 0
Home
http://sauloal.github.io/cnidaria
Ubuntu >= 12+
libboost >= 1.50 gcc >= 4.8
View the Project on GitHub sauloal/cnidaria
Motivation: Identification of biological specimens is a major requirement for a range of applications. Reference-free methods analyse unprocessed sequencing data without relying on prior knowledge, but these do not scale to arbitrarily large genomes and arbitrarily large phylogenetic distances.
Results: We present Cnidaria, a practical tool for clustering genomic and transcriptomic data with no limitation on ge-nome size or phylogenetic distances. We successfully simultaneously clustered 169 genomic and transcriptomic datasets from 4 kingdoms, achieving 100% accuracy at supra-species level and 78% accuracy for species level.
Availability and Implementation: Cnidaria is written in C++ and Python and is available at http://www.ab.wur.nl/cnidaria.
Contact: Saulo Aflitos - [email protected]
Supplementary information: Supplementary data are available at Bioinformatics online.
git clone https://github.com/sauloal/cnidaria
You can find the docker recipes at src/docker.
You can download Cnidaria on docker by running:
$ docker pull sauloal/cnidaria_full
To run Cnidaria on a folder called INPUT:
docker run -it --rm -v $PWD/INPUT/:/home/cnidaria/cnidaria/data sauloal/cnidaria_full bash
To verify:
$ pwd /home/cnidaria/cnidaria $ ls data ./ ../ YOUR_DATA
Once inside the VM, as long as you save it on the data/ folder, all files (result or configuration) will be permanent.
Files created outside the data/ folder will be deleted.
To leave the VM type 'exit'.
To install new programs use 'sudo'.
Username: cnidaria Password: cnidaria
Either inside Docker or in your own installation:
make test
It will decompress 15 fungi genomes, extract their 21-mers and run cnidaria on it. The test takes approx. 30 min to run The raw data amounts to 301 Mb The Jellyfish data amounts to 2.0 Gb The Cnidaria data amounts to 1.7 Mb
The output should be: Input fasta and Jellyfish databases:
$ ls -sh1 test/data/fungi total 2.3G 4.0K Aspergillus_fumigatus_uid14003 29M Aspergillus_fumigatus_uid14003.fasta 189M Aspergillus_fumigatus_uid14003.fasta.21.jf 4.0K Aspergillus_fumigatus_uid14003.fasta.21.jf.timming 4.0K Aspergillus_fumigatus_uid14003.sh 4.0K Aspergillus_nidulans_FGSC_A4_uid13961 29M Aspergillus_nidulans_FGSC_A4_uid13961.fasta 194M Aspergillus_nidulans_FGSC_A4_uid13961.fasta.21.jf 4.0K Aspergillus_nidulans_FGSC_A4_uid13961.fasta.21.jf.timming 4.0K Aspergillus_nidulans_FGSC_A4_uid13961.sh 4.0K Aspergillus_niger_CBS_513_88_uid19263 33M Aspergillus_niger_CBS_513_88_uid19263.fasta 226M Aspergillus_niger_CBS_513_88_uid19263.fasta.21.jf 4.0K Aspergillus_niger_CBS_513_88_uid19263.fasta.21.jf.timming 4.0K Aspergillus_niger_CBS_513_88_uid19263.sh 4.0K Aspergillus_oryzae_RIB40_uid28175 36M Aspergillus_oryzae_RIB40_uid28175.fasta 246M Aspergillus_oryzae_RIB40_uid28175.fasta.21.jf 4.0K Aspergillus_oryzae_RIB40_uid28175.fasta.21.jf.timming 4.0K Aspergillus_oryzae_RIB40_uid28175.sh 4.0K Candida_dubliniensis_CD36_uid38659 15M Candida_dubliniensis_CD36_uid38659.fasta 93M Candida_dubliniensis_CD36_uid38659.fasta.21.jf 4.0K Candida_dubliniensis_CD36_uid38659.fasta.21.jf.timming 4.0K Candida_dubliniensis_CD36_uid38659.sh 4.0K Candida_glabrata 4.0K Candida_glabrata_CBS138_uid12376 12M Candida_glabrata_CBS138_uid12376.fasta 81M Candida_glabrata_CBS138_uid12376.fasta.21.jf 4.0K Candida_glabrata_CBS138_uid12376.fasta.21.jf.timming 4.0K Candida_glabrata_CBS138_uid12376.sh 12M Candida_glabrata.fasta 81M Candida_glabrata.fasta.21.jf 4.0K Candida_glabrata.fasta.21.jf.timming 4.0K Candida_glabrata.sh 4.0K Cryptococcus_gattii_WM276 18M Cryptococcus_gattii_WM276.fasta 118M Cryptococcus_gattii_WM276.fasta.21.jf 4.0K Cryptococcus_gattii_WM276.fasta.21.jf.timming 4.0K Cryptococcus_gattii_WM276.sh 4.0K Cryptococcus_neoformans_var_JEC21_uid10698 19M Cryptococcus_neoformans_var_JEC21_uid10698.fasta 122M Cryptococcus_neoformans_var_JEC21_uid10698.fasta.21.jf 4.0K Cryptococcus_neoformans_var_JEC21_uid10698.fasta.21.jf.timming 4.0K Cryptococcus_neoformans_var_JEC21_uid10698.sh 4.0K Kluyveromyces_lactis_NRRL_Y-1140_uid12377 11M Kluyveromyces_lactis_NRRL_Y-1140_uid12377.fasta 71M Kluyveromyces_lactis_NRRL_Y-1140_uid12377.fasta.21.jf 4.0K Kluyveromyces_lactis_NRRL_Y-1140_uid12377.fasta.21.jf.timming 4.0K Kluyveromyces_lactis_NRRL_Y-1140_uid12377.sh 44K Neurospora_crassa_uid132 37M Neurospora_crassa_uid132.fasta 250M Neurospora_crassa_uid132.fasta.21.jf 4.0K Neurospora_crassa_uid132.fasta.21.jf.timming 4.0K Neurospora_crassa_uid132.sh 4.0K Saccharomyces_cerevisiae_uid128 12M Saccharomyces_cerevisiae_uid128.fasta 77M Saccharomyces_cerevisiae_uid128.fasta.21.jf 4.0K Saccharomyces_cerevisiae_uid128.fasta.21.jf.timming 4.0K Saccharomyces_cerevisiae_uid128.sh 0 Schizosaccharomyces_pombe_uid127 13M Schizosaccharomyces_pombe_uid127.fasta 82M Schizosaccharomyces_pombe_uid127.fasta.21.jf 4.0K Schizosaccharomyces_pombe_uid127.fasta.21.jf.timming 4.0K Schizosaccharomyces_pombe_uid127.sh 4.0K Yarrowia_lipolytica_CLIB122_uid12414 20M Yarrowia_lipolytica_CLIB122_uid12414.fasta 134M Yarrowia_lipolytica_CLIB122_uid12414.fasta.21.jf 4.0K Yarrowia_lipolytica_CLIB122_uid12414.fasta.21.jf.timming 4.0K Yarrowia_lipolytica_CLIB122_uid12414.sh 4.0K Zygosaccharomyces_rouxii_CBS_732_uid39573 9.5M Zygosaccharomyces_rouxii_CBS_732_uid39573.fasta 65M Zygosaccharomyces_rouxii_CBS_732_uid39573.fasta.21.jf 4.0K Zygosaccharomyces_rouxii_CBS_732_uid39573.fasta.21.jf.timming 4.0K Zygosaccharomyces_rouxii_CBS_732_uid39573.sh
The output:
$ ls test/out/ Makefile test/ $ ls test/out/test/ total 1.2M 12K Makefile 28K test_0001_0001.cnm 16K test_0001_0001.json 4.0K test_0001_0001.json.count.csv 4.0K test_0001_0001.json.csv 4.0K test_0001_0001.json.no_scale.jaccard_dissimilarity.matrix 4.0K test_0001_0001.json.no_scale.jaccard_dissimilarity.nj 72K test_0001_0001.json.no_scale.jaccard_dissimilarity.nj.png 4.0K test_0001_0001.json.no_scale.jaccard_dissimilarity.nj.tree 4.0K test_0001_0001.json.no_scale.jaccard_dissimilarity_sqrt.matrix 4.0K test_0001_0001.json.no_scale.jaccard_dissimilarity_sqrt.nj 76K test_0001_0001.json.no_scale.jaccard_dissimilarity_sqrt.nj.png 4.0K test_0001_0001.json.no_scale.jaccard_dissimilarity_sqrt.nj.tree 4.0K test_0001_0001.json.no_scale.jaccard_dissimilarity_sqrt.upgma 76K test_0001_0001.json.no_scale.jaccard_dissimilarity_sqrt.upgma.png 4.0K test_0001_0001.json.no_scale.jaccard_dissimilarity_sqrt.upgma.tree 4.0K test_0001_0001.json.no_scale.jaccard_dissimilarity.upgma 76K test_0001_0001.json.no_scale.jaccard_dissimilarity.upgma.png 4.0K test_0001_0001.json.no_scale.jaccard_dissimilarity.upgma.tree 0 test_0001_0001.json.pngok 416K test_0001_0001.log 0 test_0001_0001.ok 4.0K test.all.count.csv 8.0K test.all.csv 0 test.cnm 0 test.json 4.0K test.json.count.csv 4.0K test.json.csv 4.0K test.json.no_scale.jaccard_dissimilarity.matrix 4.0K test.json.no_scale.jaccard_dissimilarity.nj 72K test.json.no_scale.jaccard_dissimilarity.nj.png 4.0K test.json.no_scale.jaccard_dissimilarity.nj.tree 4.0K test.json.no_scale.jaccard_dissimilarity_sqrt.matrix 4.0K test.json.no_scale.jaccard_dissimilarity_sqrt.nj 72K test.json.no_scale.jaccard_dissimilarity_sqrt.nj.png 4.0K test.json.no_scale.jaccard_dissimilarity_sqrt.nj.tree 4.0K test.json.no_scale.jaccard_dissimilarity_sqrt.upgma 76K test.json.no_scale.jaccard_dissimilarity_sqrt.upgma.png 4.0K test.json.no_scale.jaccard_dissimilarity_sqrt.upgma.tree 4.0K test.json.no_scale.jaccard_dissimilarity.upgma 72K test.json.no_scale.jaccard_dissimilarity.upgma.png 4.0K test.json.no_scale.jaccard_dissimilarity.upgma.tree 0 test.json.pngok 4.0K test.log 0 test.ok
The phylogenetic trees:
$ cat test.json.no_scale.jaccard_dissimilarity.nj.tree /-Cryptococcus neoformans var JEC21 uid10698 /edge.0--| | \-Cryptococcus gattii WM276 | /edge.4--| /-Aspergillus niger CBS 513 88 uid19263 | | /edge.1--| | | /edge.2--| \-Aspergillus oryzae RIB40 uid28175 | | | | | \edge.3--| \-Aspergillus fumigatus uid14003 | | | \-Aspergillus nidulans FGSC A4 uid13961 | -root----| /-Neurospora crassa uid132 |-edge.5--| | \-Yarrowia lipolytica CLIB122 uid12414 | | /-Candida dubliniensis CD36 uid38659 | /edge.9--| | | | /-Zygosaccharomyces rouxii CBS 732 uid39573 | | \edge.8--| | | | /-Kluyveromyces lactis NRRL Y-1140 uid12377 \edge.10-| \edge.7--| | | /-Candida glabrata CBS138 uid12376 | \edge.6--| | \-Saccharomyces cerevisiae uid128 | \-Schizosaccharomyces pombe uid127 $ cat test.json.no_scale.jaccard_dissimilarity.nj (((Cryptococcus_neoformans_var_JEC21_uid10698:0.0178604557174,Cryptococcus_gattii_WM276:0.0173134981567):0.4993077284,(((Aspergillus_niger_CBS_513_88_uid19263:0.345930782661,Aspergillus_oryzae_RIB40_uid28175:0.346370249728):0.034782079948,Aspergillus_fumigatus_uid14003:0.385379378235):0.0393350255391,Aspergillus_nidulans_FGSC_A4_uid13961:0.426129781102):0.0548021380182):0.0111478680149,('Neurospora crassa uid132':0.432396815528,Yarrowia_lipolytica_CLIB122_uid12414:0.44897381579):0.0177549831691,((Candida_dubliniensis_CD36_uid38659:0.416702677849,(Zygosaccharomyces_rouxii_CBS_732_uid39573:0.408443601479,(Kluyveromyces_lactis_NRRL_Y-1140_uid12377:0.395501824207,(Candida_glabrata_CBS138_uid12376:0.383440146903,Saccharomyces_cerevisiae_uid128:0.373946775161):0.0135771064445):0.0234388374394):0.0488771035835):0.0164746506052,Schizosaccharomyces_pombe_uid127:0.469881795743):0.013057881288);
from inside cnidaria folder, add scripts folder to your path:
- add script folder to your PATH by:
- type, from this folder, every time you open a new terminal
export PATH=$PWD/scripts:$PATH
- add (only once) cnidaria/scripts to your $HOME/.bashrc and restart (only once) your terminal
echo "export PATH=$PWD/scripts:$PATH" >> $HOME/.bashrc
Edit scripts/jf_opts and select k-mer size
Make sure samtools is in your PATH
samtools
- jf_from_fasta.sh converts FASTA to JF.
- jf_from_fastq.sh converts FASTA to JF.
- jf_from_cram.sh converts CRAM to JF (requires samtools >= 1.1 in PATH).
- jf_from_bam.sh converts BAM to JF (requires samtools >= 1.1 in PATH).
Run ./run.sh
It will search for all fasta/cram/bam under the current folder and convert them to JF.
Create a filelist.csv file, a tab delimited file containg the name of your JF files and their "pretty" name:
/home/user/cnidaria/data/input/spp1.fas.21.jf Species 01 /home/user/cnidaria/data/input/spp2.fas.21.jf Species 02 /home/user/cnidaria/data/input/spp3.fas.21.jf Species 03 /home/user/cnidaria/data/input/spp4.fas.21.jf Species 04 /home/user/cnidaria/data/input/spp5.fas.21.jf Species 05
Create a test_def.csv file, a tab delimited file containing the run names
test01 /home/user/cnidaria/data/input/spp1.fas.21.jf test01 /home/user/cnidaria/data/input/spp2.fas.21.jf test01 /home/user/cnidaria/data/input/spp3.fas.21.jf test01 /home/user/cnidaria/data/input/spp4.fas.21.jf test01 /home/user/cnidaria/data/input/spp5.fas.21.jf
Create a Makefile for your runs by using scripts/gen_mkfile.py.
It will create a Makefile for your analysis calling all programs in the correct order for: split, calculate, merge, generate statistics and plot graphs in one go
$ scripts/gen_mkfile.py -h #usage: gen_mkfile.py [-h] [-thr [NUM_THREADS]] [-min [MINVAL]] # [-se [SAVE_EVERY]] [-me] [-nm] [-ec] [-nem] # file_list def_file out_dir kmer_size num_pieces # ./gen_mkfile.py file_list def_file out_folder kmer_size number_of_pieces $ ./gen_mkfile.py /home/user/cnidaria/data/filelist.csv \ /home/user/cnidaria/data/test_def.csv \ /home/user/cnidaria/data/output 21 20
Go to the output folder ( /home/user/cnidaria/data/output ) and run:
$ make all
Or do a specific run:
$ make test01
the makefile contains:
# Run Cnidaria for each of the pieces ulimit -c unlimited && time /home/user/cnidaria/scripts/cnidaria.py --export-complete \ --num-pieces 20 --piece-num 1 --outfile test01 /home/user/cnidaria/data/input/spp{1,2,3,4,5}.fas.21.jf # Merge all the pieces ulimit -c unlimited && time /home/user/cnidaria/scripts/cnidaria.py --export-complete \ --num-pieces 20 --merge-only --outfile test01 /home/user/cnidaria/data/input/spp{1,2,3,4,5}.fas.21.jf # Create statistics of the results /home/user/cnidaria/scripts/cnidaria_stats.py test01_0001_0020.json /home/user/cnidaria/data/filelist.csv ... /home/user/cnidaria/scripts/cnidaria_stats.py test01_0020_0020.json /home/user/cnidaria/data/filelist.csv # Verify if the merging occured well /home/user/cnidaria/scripts/verify_csvs.py test01_00{01,02,...,19,20}_0020.json.csv test01.json.csv # Merge statistics in single files cat test*.json.csv > test01.all.csv cat test01_*_0020.json.count.csv > test01.all.count.csv # Convert trees into PNG /home/user/cnidaria/scripts/newick_to_png.py test01_00{01,02,...,19,20}_0020.json.no_scale.jaccard_dissimilarity.nj
The output files are:
# Results of individual pieces test01_0001_0020.cne test01_0001_0020.cnm test01_0001_0020.json test01_0001_0020.json.count.csv test01_0001_0020.json.csv test01_0001_0020.json.no_scale.jaccard_dissimilarity.matrix test01_0001_0020.json.no_scale.jaccard_dissimilarity.nj test01_0001_0020.json.no_scale.jaccard_dissimilarity.nj.png test01_0001_0020.json.no_scale.jaccard_dissimilarity.nj.tree # Global results test01.all.count.csv test01.all.csv test01.cne test01.cnm test01.json test01.json.count.csv test01.json.csv test01.json.no_scale.jaccard_dissimilarity.matrix test01.json.no_scale.jaccard_dissimilarity.nj test01.json.no_scale.jaccard_dissimilarity.nj.png test01.json.no_scale.jaccard_dissimilarity.nj.tree
CNE - a Cnidaria Complete Database file containing both k-mer and presence/absence list
JSON - a Cnidaria Summary Database file containing only the matrix of shared/total k-mers counts
MATRIX - a jaccard distance matrix calculated from the JSON file
NJ - a NEWICK neighbour-joining tree based in MATRIX
PNG - a tree image beased in NJ
TREE - an ASCII art tree based in NJ
$ /home/user/cnidaria/scripts/report/stats_report.py test01.json \ /home/user/cnidaria/data/filelist.csv \ test01.json.no_scale.jaccard_dissimilarity.nj #which will generate: #test01_kmer_stats_report.html
Alternatively, you can run scripts/cnidaria.py, the main program, for the analysis.
$ scripts/cnidaria.py -h #usage: cnidaria.py [-h] [-out [OUT_FILE]] [-thr [NUM_THREADS]] [-min [MINVAL]] # [-se [SAVE_EVERY]] [-np [NUM_PIECES]] [-pn [PIECE_NUM]] # [-n] [-d] [-me] [-nm] [-ec] [-nem] # infiles [infiles ...]
{ "num_infiles":3, => number of sequences "num_srcfiles":3, => number of files (might not be the same as number of sequences) "num_combinations":0, => not used "complete_registers":1406959993, => number of kmers "min_val":2, => minimum number of species having a kmer to generate the JSON report (nothing to do with the CNE report) "max_val":3, => maximum number of species having a kmer to generate the JSON report (nothing to do with the CNE report) "save_every":1, => sampling (1 = no sampliing) "num_pieces":1, => if the merging was split, what was the number of pieces "piece_num":0, => if the merging was split, what is this piece position "kmer_size":31, => kmer size in bp "kmer_bytes":8, => kmer size in bp (2 bits per bp) "data_bytes":1, => size, in bytes, of presence/absence list "block_bytes":9, => size, in bytes, of a block containing k-mer and presence/absence list "j_offset":1896, => jellyfish hashing internals "j_size":4294967296, => jellyfish hashing internals "j_matrices_size":1, => jellyfish hashing internals "j_matrices":[{ => jellyfish hashing internals "r":32, "c":62, "l":62, "columns":[4076151366,297922355,2914987773,1818276056,4017113960,2118333886,2094414662,3625528161, 961333575,2834678692,2952312046,4226838616,3262593030,3335110749,2180498335,3545008600,3886083536]}], "version":8, => cnidaria file version "filetype":"cnidaria/json_matrix", => cnidaria file type "in_filenames":[ => input k-mer files "/home/user/cnidaria/data/input/spp1.fas.21.jf", "/home/user/cnidaria/data/input/spp2.fas.21.jf", "/home/user/cnidaria/data/input/spp3.fas.21.jf", ], "src_filenames":[ => input merge files (might not be the same as k-mer input files "/home/user/cnidaria/data/input/spp1.fas.21.jf", "/home/user/cnidaria/data/input/spp2.fas.21.jf", "/home/user/cnidaria/data/input/spp3.fas.21.jf", ], "num_kmer_total_spp": => total number of k-mers per species [351226445,749965518,634623046], "num_kmer_valid_spp": => total number of valid k-mers per species ( min_val >= count >= max_val ) [324515342,326347640,4555453], "matrix": => matrix (num_infiles X num_infiles X num_infiles) of valid k-mers with subcells containing the number of species in which such combination happened [[[0,0,0], [0,322007966,2291597], [0,0,0]]]}
[JSON_POS][ [KMER_BYTES][DATA_BYTES] X complete_registers ][JSON][/EOF] JSON_POS = [INT64] coordinates, in byte, for JSON in the END of current file KMER_BYTES = obtained from JSON (for 31, 8) DATA_BYTES = obtained from JSON (for 3, 1) complete_registers = obtained from JSON JSON = JSON string until the end of file (EOF) containing all variables
srcipts cnidaria_cne_filter.py
usage: cnidaria_cne_filter.py [-h] [--dry] [--titles TITLES] [--sep SEP] [--out OUT] [--format {fasta,lst,tab}] [--print_every PRINT_EVERY] [--piece PIECE] [--pieces PIECES] [--require [REQUIRE [REQUIRE ...]]] [--requires REQUIRES] [--forbid [FORBID [FORBID ...]]] [--forbids FORBIDS] --infile INFILE Cnidaria CNE file filter optional arguments: -h, --help show this help message and exit --dry Dry run --titles TITLES Titles file --sep SEP List separator --out OUT Output basename (default: out.[format]) --format {fasta,lst,tab} Output Format (fasta, lst, tab) --print_every PRINT_EVERY Piece number --piece PIECE Piece number --pieces PIECES Number of Pieces --require [REQUIRE [REQUIRE ...]] Required sample --requires REQUIRES Required samples (comma separated) --forbid [FORBID [FORBID ...]] Forbidden sample --forbids FORBIDS Forbidden samples (comma separated) --infile INFILE Input CNE file
Example: This will generate a fasta file containing all k-mers present in species 1 and absent in species 2 and 3.
scripts/cnidaria_cne_filter.py --infile test01.cne --require "Species 01" --forbids "Species 02,Species 03" --out "test01_s1_not_s23"
sudo apt-add-repository ppa:boost-latest -y
sudo apt-add-repository ppa:mapnik/boost-backports-1-54 -y
sudo add-apt-repository ppa:ubuntu-toolchain-r/test -y
sudo apt-get clean -qq
sudo apt-get update -qq
sudo apt-get install -y libboost1.54-all-dev swig libc6-i386 lib32stdc++6 make git
sudo apt-get install -y python python-setuptools python-numpy python-pandas python-matplotlib python-cogent python-imaging python-qt4 python-pip python-lxml
sudo apt-get install g++-4.8
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.8 50
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.8 50
sudo easy_install ete2
sudo easy_install hcluster
git clone [email protected]:sauloal/cnidaria.git
cd cnidaria
sed -i 's/TIME_UTC/TIME_UTC_/' src/libs/threadpool/boost/./threadpool/./detail/../task_adaptors.hpp
Ubuntu >= 13.4
$ lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 14.04.2 LTS Release: 14.04 Codename: trusty
libboost >= 1.50
$ dpkg -s libboost-dev | grep 'Version' Version: 1.54.0.1ubuntu1 $ cat /usr/include/boost/version.hpp | grep "BOOST_LIB_VERSION" // BOOST_LIB_VERSION must be defined to be the same as BOOST_VERSION #define BOOST_LIB_VERSION "1_54"
gcc >= 4.8
$ gcc -v gcc version 4.8.2 (Ubuntu 4.8.2-19ubuntu1)
$ bash INSTALL.2.compile
$ sudo bash INSTALL.1.requirements
The compilation creates a python library called _cnidariapy.so, a shared library for python.
This project is maintained by sauloal
Hosted on GitHub Pages — Theme by orderedlist
<script type="text/javascript">var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www."); document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));</script> <script type="text/javascript">try { var pageTracker = _gat._getTracker("UA-5291039-10"); pageTracker._trackPageview(); } catch(err) {}</script>This project is maintained by sauloal
<script type="text/javascript">var gaJsHost = (("https:" == document.location.protocol) ? "https://ssl." : "http://www."); document.write(unescape("%3Cscript src='" + gaJsHost + "google-analytics.com/ga.js' type='text/javascript'%3E%3C/script%3E"));</script> <script type="text/javascript">try { var pageTracker = _gat._getTracker("UA-5291039-10"); pageTracker._trackPageview(); } catch(err) {}</script>