Playing with the C API for sqlite: inserting the hapmap data , my notebook.


In this post, I'll insert a Hapmap genotype file into a SQLite database using the C API for SQLIte. Of course, this is just a test and I would not use SQLite to store this kind of information. Moreover the speed of insertion of SQLite was deadly slow here.
The Genotype file
The first line contains the name of the individuals, the other rows of the file contain one SNP per line and the genotype for each individual:rs# alleles chrom pos strand assembly# center protLSID assayLSID panelLSID QCcode NA06984 NA06985 NA06986 NA06989 NA06991 NA06993 NA06994 NA06995 NA06997 NA07000 NA07014 NA07019 NA07022 NA07029 NA07031 NA07034 NA07037 NA07045 NA07048 NA07051 NA07055 NA07056 NA07345 NA07346 NA07347 NA07348 NA07349 NA07357 NA07435 NA10830 NA10831 NA10835 NA10836 NA10837 NA10838 NA10839 NA10840 NA10843 NA10845 NA10846 NA10847 NA10850 NA10851 NA10852 NA10853 NA10854 NA10855 NA10856 NA10857 NA10859 NA10860 NA10861 NA10863 NA10864 NA10865 NA11829 NA11830 NA11831 NA11832 NA11839 NA11840 NA11843 NA11881 NA11882 NA11891 NA11892 NA11893 NA11894 NA11917 NA11918 NA11919 NA11920 NA11930 NA11931 NA11992 NA11993 NA11994 NA11995 NA12003 NA12004 NA12005 NA12006 NA12043 NA12044 NA12045 NA12056 NA12057 NA12144 NA12145 NA12146 NA12154 NA12155 NA12156 NA12234 NA12236 NA12239 NA12248 NA12249 NA12264 NA12272 NA12273 NA12275 NA12282 NA12283 NA12286 NA12287 NA12335 NA12336 NA12340 NA12341 NA12342 NA12343 NA12344 NA12347 NA12348 NA12375 NA12376 NA12383 NA12386 NA12399 NA12400 NA12413 NA12489 NA12546 NA12707 NA12708 NA12716 NA12717 NA12718 NA12739 NA12740 NA12748 NA12749 NA12750 NA12751 NA12752 NA12753 NA12760 NA12761 NA12762 NA12763 NA12766 NA12767 NA12775 NA12776 NA12777 NA12778 NA12801 NA12802 NA12812 NA12813 NA12814 NA12815 NA12817 NA12818 NA12827 NA12828 NA12829 NA12830 NA12832 NA12842 NA12843 NA12864 NA12865 NA12872 NA12873 NA12874 NA12875 NA12877 NA12878 NA12889 NA12890 NA12891 NA12892
rs6423165 A/G chrY 109805 + ncbi_b36 broad urn:LSID:affymetrix.hapmap.org:Protocol:GenomeWideSNP_6.0:3 urn:LSID:broad.hapmap.org:Assay:SNP_A-8572888:3 urn:lsid:dcc.hapmap.org:Panel:CEPH-60-trios:3 QC+ GG AG GG AG AG AG AA AA GG AA AG NN AG AA AG NN AA AG NN GG GG GG GG AA GG GG AG AG AA AG GG AG AG AG AA AG AG AG GG GG AA AA NN GG AG NN AA AG NN GG NN GG GG GG AA AG AA AA AG GG AG AG GG AG AA AG GG AG GG GG AG GG AG GG GG AG GG GG AA NN AG GG AG GG GG GG AG GG GG AA AA GG GG GG NN AG AG AG GG AG AG AA AA GG AA GG AA AG AA AG GG AG GG GG AG AG GG GG AG AG AG NN AG AG AG AG AG NN AA AA AG AG AG AG AG AA AA AG AG AA AG GG AG GG GG AG AG AG AG AG AG AA AG AG AG AG AA AA AG GG GG GG GG AG AG GG GG AG AA GG AG AG GG AG
rs6608381 C/T chrY 109922 + ncbi_b36 broad urn:LSID:affymetrix.hapmap.org:Protocol:GenomeWideSNP_6.0:3 urn:LSID:broad.hapmap.org:Assay:SNP_A-8528859:3 urn:lsid:dcc.hapmap.org:Panel:CEPH-60-trios:3 QC+ CC CT CC CT CT CT TT TT CC TT CT NN CT TT CT NN TT CC NN CC CC CC CC TT CC CC CT CT TT CT CC CT CT CT TT CT CT CT CC CC TT TT NN CC CT NN TT CT NN CC NN CC CC CC TT CT TT TT CT CC CT CT CC CT TT CT CC CT CC CC CT CC CT CC CC CT CC CC TT NN CT CC CT CC CC CC CT CC CC TT TT CC CC CC NN CT CT CT CC CT CT TT TT CC TT CC TT CT TT CT CC CT CC CC CT CT CC CC CT CT CT NN CT CT CT CT CT NN TT TT CT CT CT CT CT TT TT CT CT TT CT CC CT CC CC CT CT CC CT CT CC TT CT CT CT CT TT TT CT CC CC CC CC CT CT CC CC CT TT CC CT CT CC CT
rs6644972 A/G chrY 118624 + ncbi_b36 sanger urn:LSID:illumina.hapmap.org:Protocol:Human_1M_BeadChip:3 urn:LSID:sanger.hapmap.org:Assay:H1Mrs6644972:3 urn:lsid:dcc.hapmap.org:Panel:CEPH-60-trios:3 QC+ GG GG AG GG AG AG AG GG AG GG AG NN GG GG AG NN GG GG NN AG AG GG GG GG GG GG GG GG GG AG AA GG GG GG AG GG GG GG GG GG GG GG NN GG AG GG GG GG NN AG NN AG AG AA GG GG GG GG GG GG GG GG GG AG GG GG AA AG GG AG GG GG GG GG GG GG GG AG AG NN AG GG AG GG GG GG AG GG GG GG GG AA AA AG NN GG GG GG GG GG GG GG AG GG GG GG GG AG GG GG AG GG GG GG GG GG GG GG GG GG GG AG GG GG GG GG GG NN GG GG AG GG GG AG GG AG GG AG AA GG GG GG GG AG GG GG GG AG GG AG GG GG GG AG GG GG AG GG AG GG GG GG GG GG GG AG GG GG GG GG GG GG GG GG
rs6655397 A/G chrY 141935 + ncbi_b36 sanger urn:LSID:illumina.hapmap.org:Protocol:Human_1M_BeadChip:3 urn:LSID:sanger.hapmap.org:Assay:H1Mrs6655397:3 urn:lsid:dcc.hapmap.org:Panel:CEPH-60-trios:3 QC+ GG GG GG GG AG AG GG GG GG GG GG NN GG GG NN NN GG GG NN GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG NN AG GG GG GG GG NN AG NN GG GG GG NN AG GG GG GG AG GG GG AG GG GG GG GG AG GG AG GG GG GG GG AG AG GG GG GG NN AG GG GG GG GG GG GG GG GG GG GG GG GG GG NN GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG NN GG GG AG GG AG NN GG GG GG GG GG GG GG GG AG GG GG AG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG AG GG GG GG GG GG GG
rs6603172 C/T chrY 142439 + ncbi_b36 broad urn:LSID:affymetrix.hapmap.org:Protocol:GenomeWideSNP_6.0:3 urn:LSID:broad.hapmap.org:Assay:SNP_A-8527413:3 urn:lsid:dcc.hapmap.org:Panel:CEPH-60-trios:3 QC+ TT TT TT TT CT CT TT TT TT TT TT NN TT TT TT NN TT TT NN TT TT TT TT TT TT TT TT TT TT TT TT TT TT TT TT TT TT TT TT TT TT TT NN CT TT TT TT TT NN CT NN TT TT TT TT CT TT TT TT CT TT TT CT TT TT TT TT CT TT CT TT TT TT TT CT CT TT TT TT NN CT TT TT TT TT TT TT TT TT TT TT TT TT TT NN TT TT TT TT TT TT TT TT TT TT TT TT TT TT TT TT TT TT TT TT TT TT TT TT TT TT TT TT TT CT TT CT NN TT TT TT TT TT TT TT TT CT TT TT CT TT TT TT TT TT TT TT TT TT TT TT TT TT TT TT TT TT TT TT TT TT TT TT TT TT TT TT CT TT TT TT TT TT TT
rs6644970 A/G chrY 142664 + ncbi_b36 broad urn:LSID:affymetrix.hapmap.org:Protocol:GenomeWideSNP_6.0:3 urn:LSID:broad.hapmap.org:Assay:SNP_A-4207883:3 urn:lsid:dcc.hapmap.org:Panel:CEPH-60-trios:3 QC+ AG AA AA AG AG GG AG AG AA AA GG NN AG AA GG NN AG AG NN AG AG AG GG AG AG AG AA AG GG GG AA AG AG AG AG AG AA AA AG GG AG GG NN GG AG NN AG AG NN AG NN AA AG AA AA AG GG GG AG AG AG AG AG AG AA AG AA AG GG GG AG AG AA GG AG GG AA AG AG NN AG AG GG AG GG GG AG GG GG AA AG AA AG GG NN GG AA GG AG AG GG GG AA GG AA AG AG GG GG AG AG GG AG AG AG GG AG AG AG AG AG NN AG GG AG AG GG NN AA AG AA AA GG AG AG AG GG AG AG AG GG AG AA AG GG AA AA AG GG AA AG AG GG AA GG AA AA AG AG AG AG AG GG AG GG GG AG AG AG AA AA GG AG AG
rs11019 A/G chrY 159978 + ncbi_B36 affymetrix urn:LSID:affymetrix.hapmap.org:Protocol:GenomeWideSNP_6.0:2 urn:LSID:affymetrix.hapmap.org:Assay:SNP_A-4207841:2 urn:lsid:dcc.hapmap.org:Panel:CEPH-30-trios:1 QC+ NN AG NN NN AG GG AA NN NN AG NN AG GG AA NN AG NN NN GG NN GG AG GG NN NN GG NN GG NN GG AG GG NN NN GG AG NN NN NN AG AG NN NN NN NN AA AG GG GG AA AG GG GG NN NN GG GG AG GG AG AG NN AA AA NN NN NN NN NN NN NN NN NN NN GG AG GG AG AG GG AG AG GG GG NN GG GG AG AG GG GG AG AG AG AG AG GG GG GG NN NN NN NN NN NN NN NN NN NN NN NN NN NN NN NN NN NN NN NN NN NN NN NN NN AG NN AA GG NN NN GG NN NN GG GG AG AA AG GG AA AA NN NN NN NN NN NN AG GG GG AG GG AG NN NN NN NN NN NN NN NN NN GG GG AG AG GG GG NN GG NN NN GG AG
rs1132353 C/T chrY 160116 + ncbi_b36 sanger urn:LSID:illumina.hapmap.org:Protocol:Human_1M_BeadChip:3 urn:LSID:sanger.hapmap.org:Assay:H1Mrs1132353:3 urn:lsid:dcc.hapmap.org:Panel:CEPH-60-trios:3 QC+ CC CT TT CT CT TT NN CT TT CT CC NN TT CC CT NN TT CT NN CT TT CT CT TT TT CC TT CT CC TT CT TT TT TT TT CT TT TT TT CT CT TT NN TT CT NN CT TT NN CC NN TT TT CC NN TT TT CT TT CT CT CC CC CC CT CT CC CT CC CT CT TT TT TT TT CT TT CT CT NN CT CT TT TT TT TT TT CC CT TT TT CT CT CT NN CT TT TT TT TT TT TT TT TT TT TT CT CT CC TT CT TT CT CT CT CT CT CC CC CC CC TT CC CT CT CT CC NN TT CT TT TT CT TT CT CT CC CT TT CC CC TT TT TT CT TT TT CT TT TT CT TT CT TT TT CT TT CT TT CT CT CT TT TT CT CT TT TT CT TT TT CC TT CT
rs35047434 C/T chrY 169118 + ncbi_b36 sanger urn:LSID:illumina.hapmap.org:Protocol:Human_1M_BeadChip:3 urn:LSID:sanger.hapmap.org:Assay:H1Mrs35047434:3 urn:lsid:dcc.hapmap.org:Panel:CEPH-60-trios:3 QC+ TT TT TT TT CT CT TT TT TT TT TT NN TT TT TT NN TT TT NN CT TT TT TT TT TT TT TT TT TT TT TT TT TT CT TT TT TT CT TT TT CT TT NN CT TT TT TT TT NN TT NN TT TT TT TT TT TT TT TT TT CT TT TT TT TT TT TT CT TT TT TT CT TT CT CT TT TT TT TT NN TT TT TT TT TT TT TT TT TT CT TT TT TT TT NN TT CT TT TT TT CT CT TT TT TT CT CT TT TT CT TT TT TT TT TT TT TT TT TT TT TT TT TT TT TT TT TT NN TT CT TT CT TT TT TT TT TT TT TT TT TT TT TT TT TT TT TT TT TT CT TT TT TT TT CT TT TT TT CT TT TT TT TT CT TT TT TT CC TT TT TT TT TT TT
(...)
rs6423165 A/G chrY 109805 + ncbi_b36 broad urn:LSID:affymetrix.hapmap.org:Protocol:GenomeWideSNP_6.0:3 urn:LSID:broad.hapmap.org:Assay:SNP_A-8572888:3 urn:lsid:dcc.hapmap.org:Panel:CEPH-60-trios:3 QC+ GG AG GG AG AG AG AA AA GG AA AG NN AG AA AG NN AA AG NN GG GG GG GG AA GG GG AG AG AA AG GG AG AG AG AA AG AG AG GG GG AA AA NN GG AG NN AA AG NN GG NN GG GG GG AA AG AA AA AG GG AG AG GG AG AA AG GG AG GG GG AG GG AG GG GG AG GG GG AA NN AG GG AG GG GG GG AG GG GG AA AA GG GG GG NN AG AG AG GG AG AG AA AA GG AA GG AA AG AA AG GG AG GG GG AG AG GG GG AG AG AG NN AG AG AG AG AG NN AA AA AG AG AG AG AG AA AA AG AG AA AG GG AG GG GG AG AG AG AG AG AG AA AG AG AG AG AA AA AG GG GG GG GG AG AG GG GG AG AA GG AG AG GG AG
rs6608381 C/T chrY 109922 + ncbi_b36 broad urn:LSID:affymetrix.hapmap.org:Protocol:GenomeWideSNP_6.0:3 urn:LSID:broad.hapmap.org:Assay:SNP_A-8528859:3 urn:lsid:dcc.hapmap.org:Panel:CEPH-60-trios:3 QC+ CC CT CC CT CT CT TT TT CC TT CT NN CT TT CT NN TT CC NN CC CC CC CC TT CC CC CT CT TT CT CC CT CT CT TT CT CT CT CC CC TT TT NN CC CT NN TT CT NN CC NN CC CC CC TT CT TT TT CT CC CT CT CC CT TT CT CC CT CC CC CT CC CT CC CC CT CC CC TT NN CT CC CT CC CC CC CT CC CC TT TT CC CC CC NN CT CT CT CC CT CT TT TT CC TT CC TT CT TT CT CC CT CC CC CT CT CC CC CT CT CT NN CT CT CT CT CT NN TT TT CT CT CT CT CT TT TT CT CT TT CT CC CT CC CC CT CT CC CT CT CC TT CT CT CT CT TT TT CT CC CC CC CC CT CT CC CC CT TT CC CT CT CC CT
rs6644972 A/G chrY 118624 + ncbi_b36 sanger urn:LSID:illumina.hapmap.org:Protocol:Human_1M_BeadChip:3 urn:LSID:sanger.hapmap.org:Assay:H1Mrs6644972:3 urn:lsid:dcc.hapmap.org:Panel:CEPH-60-trios:3 QC+ GG GG AG GG AG AG AG GG AG GG AG NN GG GG AG NN GG GG NN AG AG GG GG GG GG GG GG GG GG AG AA GG GG GG AG GG GG GG GG GG GG GG NN GG AG GG GG GG NN AG NN AG AG AA GG GG GG GG GG GG GG GG GG AG GG GG AA AG GG AG GG GG GG GG GG GG GG AG AG NN AG GG AG GG GG GG AG GG GG GG GG AA AA AG NN GG GG GG GG GG GG GG AG GG GG GG GG AG GG GG AG GG GG GG GG GG GG GG GG GG GG AG GG GG GG GG GG NN GG GG AG GG GG AG GG AG GG AG AA GG GG GG GG AG GG GG GG AG GG AG GG GG GG AG GG GG AG GG AG GG GG GG GG GG GG AG GG GG GG GG GG GG GG GG
rs6655397 A/G chrY 141935 + ncbi_b36 sanger urn:LSID:illumina.hapmap.org:Protocol:Human_1M_BeadChip:3 urn:LSID:sanger.hapmap.org:Assay:H1Mrs6655397:3 urn:lsid:dcc.hapmap.org:Panel:CEPH-60-trios:3 QC+ GG GG GG GG AG AG GG GG GG GG GG NN GG GG NN NN GG GG NN GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG NN AG GG GG GG GG NN AG NN GG GG GG NN AG GG GG GG AG GG GG AG GG GG GG GG AG GG AG GG GG GG GG AG AG GG GG GG NN AG GG GG GG GG GG GG GG GG GG GG GG GG GG NN GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG NN GG GG AG GG AG NN GG GG GG GG GG GG GG GG AG GG GG AG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG GG AG GG GG GG GG GG GG
rs6603172 C/T chrY 142439 + ncbi_b36 broad urn:LSID:affymetrix.hapmap.org:Protocol:GenomeWideSNP_6.0:3 urn:LSID:broad.hapmap.org:Assay:SNP_A-8527413:3 urn:lsid:dcc.hapmap.org:Panel:CEPH-60-trios:3 QC+ TT TT TT TT CT CT TT TT TT TT TT NN TT TT TT NN TT TT NN TT TT TT TT TT TT TT TT TT TT TT TT TT TT TT TT TT TT TT TT TT TT TT NN CT TT TT TT TT NN CT NN TT TT TT TT CT TT TT TT CT TT TT CT TT TT TT TT CT TT CT TT TT TT TT CT CT TT TT TT NN CT TT TT TT TT TT TT TT TT TT TT TT TT TT NN TT TT TT TT TT TT TT TT TT TT TT TT TT TT TT TT TT TT TT TT TT TT TT TT TT TT TT TT TT CT TT CT NN TT TT TT TT TT TT TT TT CT TT TT CT TT TT TT TT TT TT TT TT TT TT TT TT TT TT TT TT TT TT TT TT TT TT TT TT TT TT TT CT TT TT TT TT TT TT
rs6644970 A/G chrY 142664 + ncbi_b36 broad urn:LSID:affymetrix.hapmap.org:Protocol:GenomeWideSNP_6.0:3 urn:LSID:broad.hapmap.org:Assay:SNP_A-4207883:3 urn:lsid:dcc.hapmap.org:Panel:CEPH-60-trios:3 QC+ AG AA AA AG AG GG AG AG AA AA GG NN AG AA GG NN AG AG NN AG AG AG GG AG AG AG AA AG GG GG AA AG AG AG AG AG AA AA AG GG AG GG NN GG AG NN AG AG NN AG NN AA AG AA AA AG GG GG AG AG AG AG AG AG AA AG AA AG GG GG AG AG AA GG AG GG AA AG AG NN AG AG GG AG GG GG AG GG GG AA AG AA AG GG NN GG AA GG AG AG GG GG AA GG AA AG AG GG GG AG AG GG AG AG AG GG AG AG AG AG AG NN AG GG AG AG GG NN AA AG AA AA GG AG AG AG GG AG AG AG GG AG AA AG GG AA AA AG GG AA AG AG GG AA GG AA AA AG AG AG AG AG GG AG GG GG AG AG AG AA AA GG AG AG
rs11019 A/G chrY 159978 + ncbi_B36 affymetrix urn:LSID:affymetrix.hapmap.org:Protocol:GenomeWideSNP_6.0:2 urn:LSID:affymetrix.hapmap.org:Assay:SNP_A-4207841:2 urn:lsid:dcc.hapmap.org:Panel:CEPH-30-trios:1 QC+ NN AG NN NN AG GG AA NN NN AG NN AG GG AA NN AG NN NN GG NN GG AG GG NN NN GG NN GG NN GG AG GG NN NN GG AG NN NN NN AG AG NN NN NN NN AA AG GG GG AA AG GG GG NN NN GG GG AG GG AG AG NN AA AA NN NN NN NN NN NN NN NN NN NN GG AG GG AG AG GG AG AG GG GG NN GG GG AG AG GG GG AG AG AG AG AG GG GG GG NN NN NN NN NN NN NN NN NN NN NN NN NN NN NN NN NN NN NN NN NN NN NN NN NN AG NN AA GG NN NN GG NN NN GG GG AG AA AG GG AA AA NN NN NN NN NN NN AG GG GG AG GG AG NN NN NN NN NN NN NN NN NN GG GG AG AG GG GG NN GG NN NN GG AG
rs1132353 C/T chrY 160116 + ncbi_b36 sanger urn:LSID:illumina.hapmap.org:Protocol:Human_1M_BeadChip:3 urn:LSID:sanger.hapmap.org:Assay:H1Mrs1132353:3 urn:lsid:dcc.hapmap.org:Panel:CEPH-60-trios:3 QC+ CC CT TT CT CT TT NN CT TT CT CC NN TT CC CT NN TT CT NN CT TT CT CT TT TT CC TT CT CC TT CT TT TT TT TT CT TT TT TT CT CT TT NN TT CT NN CT TT NN CC NN TT TT CC NN TT TT CT TT CT CT CC CC CC CT CT CC CT CC CT CT TT TT TT TT CT TT CT CT NN CT CT TT TT TT TT TT CC CT TT TT CT CT CT NN CT TT TT TT TT TT TT TT TT TT TT CT CT CC TT CT TT CT CT CT CT CT CC CC CC CC TT CC CT CT CT CC NN TT CT TT TT CT TT CT CT CC CT TT CC CC TT TT TT CT TT TT CT TT TT CT TT CT TT TT CT TT CT TT CT CT CT TT TT CT CT TT TT CT TT TT CC TT CT
rs35047434 C/T chrY 169118 + ncbi_b36 sanger urn:LSID:illumina.hapmap.org:Protocol:Human_1M_BeadChip:3 urn:LSID:sanger.hapmap.org:Assay:H1Mrs35047434:3 urn:lsid:dcc.hapmap.org:Panel:CEPH-60-trios:3 QC+ TT TT TT TT CT CT TT TT TT TT TT NN TT TT TT NN TT TT NN CT TT TT TT TT TT TT TT TT TT TT TT TT TT CT TT TT TT CT TT TT CT TT NN CT TT TT TT TT NN TT NN TT TT TT TT TT TT TT TT TT CT TT TT TT TT TT TT CT TT TT TT CT TT CT CT TT TT TT TT NN TT TT TT TT TT TT TT TT TT CT TT TT TT TT NN TT CT TT TT TT CT CT TT TT TT CT CT TT TT CT TT TT TT TT TT TT TT TT TT TT TT TT TT TT TT TT TT NN TT CT TT CT TT TT TT TT TT TT TT TT TT TT TT TT TT TT TT TT TT CT TT TT TT TT CT TT TT TT CT TT TT TT TT CT TT TT TT CC TT TT TT TT TT TT
(...)
Opening the SQLIte Database
if(sqlite3_open(env->fileout,&(env->connection))!=SQLITE_OK)
{
fprintf(stderr,"Cannot open sqlite file %s.\n",env->fileout);
exit(EXIT_FAILURE);
}
{
fprintf(stderr,"Cannot open sqlite file %s.\n",env->fileout);
exit(EXIT_FAILURE);
}
Closing the SQLIte Database
sqlite3_close(env->connection);
Creating a table
if(sqlite3_exec(env->connection,
"create table markers(id INTEGER PRIMARY KEY,name varchar(20) unique,chrom varchar(10),position integer)",
NULL,NULL,&error
)!=SQLITE_OK)
{
fprintf(stderr,"Cannot create table markers: %s\n",error);
exit(EXIT_FAILURE);
}
"create table markers(id INTEGER PRIMARY KEY,name varchar(20) unique,chrom varchar(10),position integer)",
NULL,NULL,&error
)!=SQLITE_OK)
{
fprintf(stderr,"Cannot create table markers: %s\n",error);
exit(EXIT_FAILURE);
}
Filling a prepared statement and inserting some data
if(sqlite3_prepare(env->connection,
"insert into markers(name,chrom,position) values(?,?,?)",
-1,&pstmt_insert_marker,NULL
)!=SQLITE_OK)
{
fprintf(stderr,"Cannot compile insert into markers.\n");
exit(EXIT_FAILURE);
}
(...)
if(sqlite3_bind_text(
pstmt_insert_marker,1,
name,
strlen(name),
NULL)!=SQLITE_OK)
{
fprintf(stderr,"Cannot bind markers's name.\n");
exit(EXIT_FAILURE);
}
(
if(sqlite3_bind_text(
pstmt_insert_marker,2,
chrom,
strlen(chrom),
NULL)!=SQLITE_OK)
{
fprintf(stderr,"Cannot bind markers's chrom.\n");
exit(EXIT_FAILURE);
}
if( sqlite3_bind_int(
pstmt_insert_marker,3,
genomic_position
)!=SQLITE_OK)
{
fprintf(stderr,"Cannot bind markers's position.\n");
exit(EXIT_FAILURE);
}
if (sqlite3_step(pstmt_insert_marker) != SQLITE_DONE) {
fprintf(stderr,"Could not step insert marker.\n");
exit(EXIT_FAILURE);
}
marker_id = sqlite3_last_insert_rowid(env->connection);
sqlite3_reset(pstmt_insert_marker);
"insert into markers(name,chrom,position) values(?,?,?)",
-1,&pstmt_insert_marker,NULL
)!=SQLITE_OK)
{
fprintf(stderr,"Cannot compile insert into markers.\n");
exit(EXIT_FAILURE);
}
(...)
if(sqlite3_bind_text(
pstmt_insert_marker,1,
name,
strlen(name),
NULL)!=SQLITE_OK)
{
fprintf(stderr,"Cannot bind markers's name.\n");
exit(EXIT_FAILURE);
}
(
if(sqlite3_bind_text(
pstmt_insert_marker,2,
chrom,
strlen(chrom),
NULL)!=SQLITE_OK)
{
fprintf(stderr,"Cannot bind markers's chrom.\n");
exit(EXIT_FAILURE);
}
if( sqlite3_bind_int(
pstmt_insert_marker,3,
genomic_position
)!=SQLITE_OK)
{
fprintf(stderr,"Cannot bind markers's position.\n");
exit(EXIT_FAILURE);
}
if (sqlite3_step(pstmt_insert_marker) != SQLITE_DONE) {
fprintf(stderr,"Could not step insert marker.\n");
exit(EXIT_FAILURE);
}
marker_id = sqlite3_last_insert_rowid(env->connection);
sqlite3_reset(pstmt_insert_marker);
Creating a custom function for sqlite
Here I implemented a custom function named homozygous it returns true if a genotype is a string of two identical characters (but not 'N').void is_homozygous(
sqlite3_context* context, /* context */
int argc, /* number of arguments */
sqlite3_value** argv /* arguments */
)
{
/* one text arg */
if(argc==1 &&
sqlite3_value_type(argv[0])==SQLITE_TEXT)
{
const char *alleles=(const char*)sqlite3_value_text(argv[0]);
if( alleles!=NULL &&
strlen(alleles)==2 &&
alleles[0]==alleles[1] &&
alleles[0]!='N')
{
/* set result to TRUE */
sqlite3_result_int(context,1);
return;
}
}
/* set result to FALSE */
sqlite3_result_int(context,0);
}
sqlite3_context* context, /* context */
int argc, /* number of arguments */
sqlite3_value** argv /* arguments */
)
{
/* one text arg */
if(argc==1 &&
sqlite3_value_type(argv[0])==SQLITE_TEXT)
{
const char *alleles=(const char*)sqlite3_value_text(argv[0]);
if( alleles!=NULL &&
strlen(alleles)==2 &&
alleles[0]==alleles[1] &&
alleles[0]!='N')
{
/* set result to TRUE */
sqlite3_result_int(context,1);
return;
}
}
/* set result to FALSE */
sqlite3_result_int(context,0);
}
Telling sqlite about the new custom function
sqlite3_create_function(env->connection,
"homozygous",/* function name */
1,/* number of args */
SQLITE_UTF8,/* encoding */
NULL,
is_homozygous,/* the implementation callback */
NULL,
NULL
);
"homozygous",/* function name */
1,/* number of args */
SQLITE_UTF8,/* encoding */
NULL,
is_homozygous,/* the implementation callback */
NULL,
NULL
);
Implementing a callback for a simple 'SELECT' query
The following callback prints the results to stdout.static int callback_select_homozygous(
void* notUsed,
int argc,/* number of args */
char** argv,/* arguments as string */
char** columns /* labels for the columns */
)
{
int i;
/* prints all the columns to stdout*/
for(i=0; i<argc; i++)
{
printf( "\"%s\": \"%s\"\n",
columns[i],
argv[i]!=NULL? argv[i] : "NULL"
);
}
printf("\n");
return 0;
}
void* notUsed,
int argc,/* number of args */
char** argv,/* arguments as string */
char** columns /* labels for the columns */
)
{
int i;
/* prints all the columns to stdout*/
for(i=0; i<argc; i++)
{
printf( "\"%s\": \"%s\"\n",
columns[i],
argv[i]!=NULL? argv[i] : "NULL"
);
}
printf("\n");
return 0;
}
Executing a SELECT query
Here, we select all the homoygous genotypes:if(sqlite3_exec(
env->connection, /* An open database */
"select individuals.name,"
"markers.name,"
"markers.chrom,"
"markers.position,"
"genotypes.alleles "
"from "
"genotypes,"
"markers,"
"individuals "
"where "
"markers.id=genotypes.marker_id and "
"individuals.id=genotypes.individual_id and "
"homozygous(genotypes.alleles)=1", /* SQL to be evaluated */
callback_select_homozygous, /* Callback function */
NULL, /* 1st argument to callback */
&errormsg /* Error msg written here */
)!=SQLITE_OK)
{
fprintf(stderr,"Cannot select.\n");
exit(EXIT_FAILURE);
}
env->connection, /* An open database */
"select individuals.name,"
"markers.name,"
"markers.chrom,"
"markers.position,"
"genotypes.alleles "
"from "
"genotypes,"
"markers,"
"individuals "
"where "
"markers.id=genotypes.marker_id and "
"individuals.id=genotypes.individual_id and "
"homozygous(genotypes.alleles)=1", /* SQL to be evaluated */
callback_select_homozygous, /* Callback function */
NULL, /* 1st argument to callback */
&errormsg /* Error msg written here */
)!=SQLITE_OK)
{
fprintf(stderr,"Cannot select.\n");
exit(EXIT_FAILURE);
}
The full source code
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* A Test for the sqlite C API | |
* Pierre Lindenbaum http://plindenbaum.blogspot.com | |
* reads a HAPMAP file and put it in a relational sqlite DB | |
*/ | |
#include <stdio.h> | |
#include <stdlib.h> | |
#include <sqlite3.h> | |
#include <zutil.h> | |
/** | |
* parameters for the program | |
*/ | |
typedef struct hapMap2SQLite_t | |
{ | |
/** name of the sqlite file */ | |
char *fileout; | |
/** hapmap file in */ | |
char *filein; | |
/** input stream*/ | |
gzFile in; | |
/** connection to sqlite */ | |
sqlite3* connection; | |
}HapMap2SQLite,*HapMap2SQLitePtr; | |
/** quick'n dirty (=slow) version of readline . returns a string that should destroyed with 'free(ptr)' */ | |
static char* readline(gzFile in,int *length) | |
{ | |
int c; | |
char* p=NULL; | |
*length=0; | |
while((c=gzgetc(in))!=EOF) | |
{ | |
p=(char*)realloc(p,sizeof(char)*(*length+2)); | |
if(p==NULL) | |
{ | |
fprintf(stderr,"Out of memory\n"); | |
exit(EXIT_FAILURE); | |
} | |
if(c=='\n') | |
{ | |
p[*length]=0; | |
break; | |
} | |
p[*length]=c; | |
(*length)++; | |
p[*length]=0; | |
} | |
return p; | |
} | |
/** call back for the custom sqlite function 'homozygous' */ | |
void is_homozygous( | |
sqlite3_context* context, /* context */ | |
int argc, /* number of arguments */ | |
sqlite3_value** argv /* arguments */ | |
) | |
{ | |
/* one text arg */ | |
if(argc==1 && | |
sqlite3_value_type(argv[0])==SQLITE_TEXT) | |
{ | |
const char *alleles=(const char*)sqlite3_value_text(argv[0]); | |
if( alleles!=NULL && | |
strlen(alleles)==2 && | |
alleles[0]==alleles[1] && | |
alleles[0]!='N') | |
{ | |
/* set result to TRUE */ | |
sqlite3_result_int(context,1); | |
return; | |
} | |
} | |
/* set result to FALSE */ | |
sqlite3_result_int(context,0); | |
} | |
/** callback called by the 'select_homozygous' query */ | |
static int callback_select_homozygous( | |
void* notUsed, | |
int argc,/* number of args */ | |
char** argv,/* arguments as string */ | |
char** columns /* labels for the columns */ | |
) | |
{ | |
int i; | |
/* prints all the columns to stdout*/ | |
for(i=0; i<argc; i++) | |
{ | |
printf( "\"%s\": \"%s\"\n", | |
columns[i], | |
argv[i]!=NULL? argv[i] : "NULL" | |
); | |
} | |
printf("\n"); | |
return 0; | |
} | |
/** | |
* this is a test query. | |
* it selects all the markers/individuals /genotypes homozygous | |
*/ | |
static void select_homozygous(HapMap2SQLitePtr env) | |
{ | |
char* errormsg=NULL; | |
/* open sqlite database */ | |
if(sqlite3_open(env->fileout,&(env->connection))!=SQLITE_OK) | |
{ | |
fprintf(stderr,"Cannot open sqlite file %s.\n",env->fileout); | |
exit(EXIT_FAILURE); | |
} | |
/* create custom function homozygous */ | |
sqlite3_create_function(env->connection, | |
"homozygous",/* function name */ | |
1,/* number of args */ | |
SQLITE_UTF8,/* encoding */ | |
NULL, | |
is_homozygous,/* the implementation callback */ | |
NULL, | |
NULL | |
); | |
/* execute the select query */ | |
if(sqlite3_exec( | |
env->connection, /* An open database */ | |
"select individuals.name," | |
"markers.name," | |
"markers.chrom," | |
"markers.position," | |
"genotypes.alleles " | |
"from " | |
"genotypes," | |
"markers," | |
"individuals " | |
"where " | |
"markers.id=genotypes.marker_id and " | |
"individuals.id=genotypes.individual_id and " | |
"homozygous(genotypes.alleles)=1", /* SQL to be evaluated */ | |
callback_select_homozygous, /* Callback function */ | |
NULL, /* 1st argument to callback */ | |
&errormsg /* Error msg written here */ | |
)!=SQLITE_OK) | |
{ | |
fprintf(stderr,"Cannot select.\n"); | |
exit(EXIT_FAILURE); | |
} | |
/* close connection */ | |
sqlite3_close(env->connection); | |
} | |
/* parse an hapmap genotype file and put it in a sqlite db */ | |
static int hapmap2sqlite(HapMap2SQLitePtr env) | |
{ | |
const int MANDATORY_COLS_COUNT=11; | |
char* line; | |
int length; | |
char *error=NULL; | |
/* prepated statement for insertion */ | |
sqlite3_stmt *pstmt_insert_indi=NULL; | |
sqlite3_stmt *pstmt_insert_marker=NULL; | |
sqlite3_stmt *pstmt_insert_genotype=NULL; | |
/* current line */ | |
int nLine=0; | |
/* number of individual */ | |
int n_individuals=0; | |
/* primary key of individuals */ | |
int *individuals_id=NULL; | |
/* open (gzipped) hapmap file */ | |
if(env->filein==NULL) | |
{ | |
env->in = gzdopen(fileno(stdin),"rb"); | |
} | |
else | |
{ | |
env->in = gzopen(env->filein,"rb"); | |
} | |
if(env->in==NULL) | |
{ | |
fprintf(stderr,"Cannot open input file.\n"); | |
exit(EXIT_FAILURE); | |
} | |
/* open sqlite database */ | |
if(sqlite3_open(env->fileout,&(env->connection))!=SQLITE_OK) | |
{ | |
fprintf(stderr,"Cannot open sqlite file %s.\n",env->fileout); | |
exit(EXIT_FAILURE); | |
} | |
/* create tables for individuals */ | |
if(sqlite3_exec(env->connection, | |
"create table individuals(id INTEGER PRIMARY KEY,name varchar(15) unique)", | |
NULL,NULL,&error | |
)!=SQLITE_OK) | |
{ | |
fprintf(stderr,"Cannot create table individuals: %s\n",error); | |
exit(EXIT_FAILURE); | |
} | |
/* create tables for markers */ | |
if(sqlite3_exec(env->connection, | |
"create table markers(id INTEGER PRIMARY KEY,name varchar(20) unique,chrom varchar(10),position integer)", | |
NULL,NULL,&error | |
)!=SQLITE_OK) | |
{ | |
fprintf(stderr,"Cannot create table markers: %s\n",error); | |
exit(EXIT_FAILURE); | |
} | |
/* create tables for genotypes */ | |
if(sqlite3_exec(env->connection, | |
"create table genotypes(id INTEGER PRIMARY KEY," | |
"individual_id int references individuals(id)," | |
"marker_id int references markers(id)," | |
"alleles varchar(2) )", | |
NULL,NULL,&error | |
)!=SQLITE_OK) | |
{ | |
fprintf(stderr,"Cannot create table genotypes: %s\n",error); | |
exit(EXIT_FAILURE); | |
} | |
/* create prepared statement for individuals */ | |
if(sqlite3_prepare(env->connection, | |
"insert into individuals(name) values(?)", | |
-1,&pstmt_insert_indi,NULL | |
)!=SQLITE_OK) | |
{ | |
fprintf(stderr,"Cannot compile insert into individuals.\n"); | |
exit(EXIT_FAILURE); | |
} | |
/* create prepared statement for markers */ | |
if(sqlite3_prepare(env->connection, | |
"insert into markers(name,chrom,position) values(?,?,?)", | |
-1,&pstmt_insert_marker,NULL | |
)!=SQLITE_OK) | |
{ | |
fprintf(stderr,"Cannot compile insert into markers.\n"); | |
exit(EXIT_FAILURE); | |
} | |
/* create prepared statement and genotypes*/ | |
if(sqlite3_prepare(env->connection, | |
"insert into genotypes(individual_id,marker_id,alleles) values(?,?,?)", | |
-1,&pstmt_insert_genotype,NULL | |
)!=SQLITE_OK) | |
{ | |
fprintf(stderr,"Cannot compile insert into genotypes.\n"); | |
exit(EXIT_FAILURE); | |
} | |
/* loop over each lines */ | |
while((line=readline(env->in,&length))!=NULL) | |
{ | |
/* current marker id */ | |
int marker_id=0; | |
/* number of spaces */ | |
int n_tokens=0; | |
/* position of the spaces */ | |
int *tokens=NULL; | |
int i; | |
++nLine; | |
/* split the line. get the positions of the spaces */ | |
for(i=0;i<=length;++i) | |
{ | |
if(!(i==length || line[i]==' ')) continue; | |
tokens=(int*)realloc(tokens,sizeof(int)*(n_tokens+1)); | |
if(tokens==NULL) | |
{ | |
fprintf(stderr,"Out of memory\n"); | |
exit(EXIT_FAILURE); | |
} | |
tokens[n_tokens]=i; | |
n_tokens++; | |
} | |
if(n_tokens<=MANDATORY_COLS_COUNT) | |
{ | |
fprintf(stderr,"In %s expected at least %d columns but found %d\n", | |
line,(MANDATORY_COLS_COUNT+1),n_tokens); | |
exit(EXIT_FAILURE); | |
} | |
/* this is the header, alloc and insert the individuals */ | |
if(nLine==1) | |
{ | |
n_individuals=n_tokens-MANDATORY_COLS_COUNT; | |
individuals_id=(int*)malloc(sizeof(int)*n_individuals); | |
if(individuals_id==NULL) | |
{ | |
fprintf(stderr,"Cannot malloc individuals_id.\n"); | |
exit(EXIT_FAILURE); | |
} | |
for(i=MANDATORY_COLS_COUNT;i< n_tokens;++i) | |
{ | |
/* bind the parameters of the prepared statement */ | |
if(sqlite3_bind_text( | |
pstmt_insert_indi,1, | |
&line[tokens[i-1]+1], | |
tokens[i]-tokens[i-1]-1, | |
NULL)!=SQLITE_OK) | |
{ | |
fprintf(stderr,"Cannot bind individual's name.\n"); | |
exit(EXIT_FAILURE); | |
} | |
/* execute the prepared statement */ | |
if (sqlite3_step(pstmt_insert_indi) != SQLITE_DONE) { | |
fprintf(stderr,"Could not step (execute) stmt.\n"); | |
exit(EXIT_FAILURE); | |
} | |
/* get the last_insert_id */ | |
individuals_id[i-MANDATORY_COLS_COUNT]=sqlite3_last_insert_rowid(env->connection); | |
/* reset the prepared statement */ | |
sqlite3_reset(pstmt_insert_indi); | |
} | |
continue; | |
} | |
if(n_tokens-MANDATORY_COLS_COUNT!=n_individuals) | |
{ | |
fprintf(stderr,"expected %d genotypes but got %d.\n", | |
n_individuals,n_tokens-MANDATORY_COLS_COUNT); | |
exit(EXIT_FAILURE); | |
} | |
/* insert marker */ | |
if(sqlite3_bind_text( | |
pstmt_insert_marker,1, | |
&line[0], | |
tokens[0], | |
NULL)!=SQLITE_OK) | |
{ | |
fprintf(stderr,"Cannot bind markers's name.\n"); | |
exit(EXIT_FAILURE); | |
} | |
if(sqlite3_bind_text( | |
pstmt_insert_marker,2, | |
&line[tokens[1]+1], | |
tokens[2]-tokens[1]-1, | |
NULL)!=SQLITE_OK) | |
{ | |
fprintf(stderr,"Cannot bind markers's chrom.\n"); | |
exit(EXIT_FAILURE); | |
} | |
if( sqlite3_bind_int( | |
pstmt_insert_marker,3, | |
atoi(&line[tokens[2]+1]) | |
)!=SQLITE_OK) | |
{ | |
fprintf(stderr,"Cannot bind markers's position.\n"); | |
exit(EXIT_FAILURE); | |
} | |
if (sqlite3_step(pstmt_insert_marker) != SQLITE_DONE) { | |
fprintf(stderr,"Could not step insert marker.\n"); | |
exit(EXIT_FAILURE); | |
} | |
marker_id=sqlite3_last_insert_rowid(env->connection); | |
fprintf(stderr,"[LOG]inserted marker ID.%d\n",marker_id); | |
sqlite3_reset(pstmt_insert_marker); | |
/* loop over the genotypes */ | |
for(i=MANDATORY_COLS_COUNT;i< n_tokens;++i) | |
{ | |
/* bind individual-id */ | |
if( sqlite3_bind_int( | |
pstmt_insert_genotype,1, | |
individuals_id[i-MANDATORY_COLS_COUNT] | |
)!=SQLITE_OK) | |
{ | |
fprintf(stderr,"Cannot bind indi-id.\n"); | |
exit(EXIT_FAILURE); | |
} | |
/* bind marker-id */ | |
if( sqlite3_bind_int( | |
pstmt_insert_genotype,2, | |
marker_id | |
)!=SQLITE_OK) | |
{ | |
fprintf(stderr,"Cannot bind marker-id.\n"); | |
exit(EXIT_FAILURE); | |
} | |
/* bind alleles */ | |
if(sqlite3_bind_text( | |
pstmt_insert_genotype,3, | |
&line[tokens[i-1]+1], | |
tokens[i]-tokens[i-1]-1, | |
NULL)!=SQLITE_OK) | |
{ | |
fprintf(stderr,"Cannot bind alleles.\n"); | |
exit(EXIT_FAILURE); | |
} | |
/* insert the genotype */ | |
if (sqlite3_step(pstmt_insert_genotype) != SQLITE_DONE) { | |
fprintf(stderr,"Could not insert genotype.\n"); | |
exit(EXIT_FAILURE); | |
} | |
/* reset statement */ | |
sqlite3_reset(pstmt_insert_genotype); | |
} | |
free(tokens); | |
free(line); | |
} | |
/* cleanup */ | |
if(individuals_id!=NULL) | |
{ | |
free(individuals_id); | |
} | |
if(pstmt_insert_indi!=NULL) | |
{ | |
sqlite3_finalize(pstmt_insert_indi); | |
} | |
if(pstmt_insert_marker!=NULL) | |
{ | |
sqlite3_finalize(pstmt_insert_marker); | |
} | |
if(pstmt_insert_genotype!=NULL) | |
{ | |
sqlite3_finalize(pstmt_insert_genotype); | |
} | |
if(env->connection!=NULL) | |
{ | |
sqlite3_close(env->connection); | |
} | |
if(env->filein!=NULL && env->in!=NULL) | |
{ | |
gzclose(env->in); | |
} | |
return EXIT_SUCCESS; | |
} | |
/** main */ | |
int main(int argc, char **argv) | |
{ | |
HapMap2SQLite app; | |
app.fileout=NULL; | |
app.filein=NULL; | |
app.in=NULL; | |
app.connection=NULL; | |
int ret=0; | |
int optind=1; | |
/* loop over args */ | |
while(optind<argc) | |
{ | |
if(strcmp(argv[optind],"-h")==0) | |
{ | |
return EXIT_SUCCESS; | |
} | |
else if(strcmp(argv[optind],"-o")==0 && optind+1< argc) | |
{ | |
FILE* in; | |
app.fileout=argv[++optind]; | |
in= fopen(app.fileout,"rb"); | |
if(in!=NULL) | |
{ | |
fclose(in); | |
fprintf(stderr,"Error %s already exists.\n",app.fileout); | |
return EXIT_FAILURE; | |
} | |
} | |
else if(strcmp(argv[optind],"--")==0) | |
{ | |
optind++; | |
break; | |
} | |
else if(argv[optind][0]=='-') | |
{ | |
fprintf(stderr,"Illegal option %s.\n",argv[optind]); | |
return EXIT_FAILURE; | |
} | |
else | |
{ | |
break; | |
} | |
++optind; | |
} | |
if(app.fileout==NULL) | |
{ | |
fprintf(stderr,"Undefined file-out\n"); | |
return EXIT_FAILURE; | |
} | |
if(optind==argc) | |
{ | |
//read from stdin | |
app.filein=NULL; | |
ret=hapmap2sqlite(&app); | |
} | |
else if(optind+1!=argc) | |
{ | |
fprintf(stderr,"Illegal number of arguments.\n"); | |
return EXIT_FAILURE; | |
} | |
else | |
{ | |
//read from file | |
app.filein=argv[optind]; | |
ret=hapmap2sqlite(&app); | |
} | |
select_homozygous(&app); | |
return ret; | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
CFLAGS=-I ${SQLITE3DIR}/include -Wall | |
LDFLAGS=-L ${SQLITE3DIR}/lib | |
#export LD_LIBRARY_PATH=${SQLITE3DIR}/lib | |
test:hapmap2sqlite genotypes.txt.gz | |
rm -f database.db | |
./hapmap2sqlite -o database.db genotypes.txt.gz | |
genotypes.txt.gz: | |
wget -O $@ "http://hapmap.ncbi.nlm.nih.gov/downloads/genotypes/latest/forward/non-redundant/genotypes_chrY_CEU_r27_nr.b36_fwd.txt.gz" | |
hapmap2sqlite:hapmap2sqlite.c | |
gcc -o $@ $(CFLAGS) $(LDFLAGS) hapmap2sqlite.c -lsqlite3 -lz | |
clean: | |
rm -f hapmap2sqlite database.db *.o a.out |
Excuting the C program
[LOG]inserted marker ID.1
[LOG]inserted marker ID.2
[LOG]inserted marker ID.3
[LOG]inserted marker ID.4
[LOG]inserted marker ID.5
(... WAIT !!! )
"name": "NA12878"
"name": "rs6603251"
"chrom": "chrY"
"position": "240580"
"alleles": "CC"
"name": "NA12890"
"name": "rs6603251"
"chrom": "chrY"
"position": "240580"
"alleles": "CC"
"name": "NA12892"
"name": "rs6603251"
"chrom": "chrY"
"position": "240580"
"alleles": "CC"
[LOG]inserted marker ID.2
[LOG]inserted marker ID.3
[LOG]inserted marker ID.4
[LOG]inserted marker ID.5
(... WAIT !!! )
"name": "NA12878"
"name": "rs6603251"
"chrom": "chrY"
"position": "240580"
"alleles": "CC"
"name": "NA12890"
"name": "rs6603251"
"chrom": "chrY"
"position": "240580"
"alleles": "CC"
"name": "NA12892"
"name": "rs6603251"
"chrom": "chrY"
"position": "240580"
"alleles": "CC"
That's it
Pierre
No comments:
Post a Comment