19#include "genfile/bgen/View.hpp"
20#include "genfile/bgen/IndexQuery.hpp"
31using namespace genfile::bgen;
39static genfile::bgen::View::UniquePtr construct_view(
40 const string & filename) {
42 if( ! filesystem::exists( filename ) ){
43 throw runtime_error(
"File does not exist: " + filename);
46 View::UniquePtr view = genfile::bgen::View::create( filename ) ;
51static IndexQuery::UniquePtr construct_query(
const string &index_filename){
53 if( ! filesystem::exists( index_filename ) ){
54 throw runtime_error(
"File does not exist: " + index_filename);
57 IndexQuery::UniquePtr query = IndexQuery::create( index_filename ) ;
71static genfile::bgen::View::UniquePtr construct_view(
72 const string & filename,
73 const string & index_filename,
78 View::UniquePtr view = construct_view( filename );
82 IndexQuery::UniquePtr query = construct_query(index_filename);
83 for(
int i = 0; i < gr.
size(); i++ ) {
88 view->set_query( query ) ;
94static std::shared_ptr<VariantSet> getVariantSet(
95 const string & index_filename){
98 SqliteIndexQuery query(index_filename);
100 std::vector<std::string> rsid, chrom;
101 std::vector<int> position;
104 query.get_variant_info(&rsid, &chrom, &position);
110 return std::make_shared<VariantSet>(vs);
144 get_all_samples( *view, &number_of_samples, &sampleNames, &requestedSamplesByIndexInDataIndex ) ;
148 vector<string> requestedSamples;
151 requestedSamples = split_any_of(
155 get_requested_samples( *view, requestedSamples, &number_of_samples, &sampleNames, &requestedSamplesByIndexInDataIndex ) ;
170 if( vInfo !=
nullptr)
delete vInfo;
184 varIdx = vs->getIndeces( gr );
187 vector<string> variantIDs = vs->getVariantIDs(varIdx);
190 query->include_rsids( variantIDs );
191 query->initialise() ;
192 view->set_query( query ) ;
196 n_variants_total = view->number_of_variants() ;
199 variant_idx_start = 0;
205 return number_of_samples;
211 return vInfo->sampleNames;
221 return vs->getChromRanges();
227 bool ret = getNextChunk_helper();
234 arma::mat M(matDosage.data(), number_of_samples, vInfo->size(),
false,
true);
243 bool ret = getNextChunk_helper();
250 arma::mat M(matDosage.data(), number_of_samples, vInfo->size(),
false,
true);
257 #ifndef DISABLE_EIGEN
261 bool ret = getNextChunk_helper();
268 Eigen::MatrixXd M = Eigen::Map<Eigen::MatrixXd>(matDosage.data(), number_of_samples, vInfo->size());
279 bool ret = getNextChunk_helper();
286 Eigen::MatrixXd M = Eigen::Map<Eigen::MatrixXd>(matDosage.data(), number_of_samples, vInfo->size());
298 bool ret = getNextChunk_helper();
305 Rcpp::NumericMatrix M(number_of_samples, vInfo->size(), matDosage.data());
306 colnames(M) = Rcpp::wrap( vInfo->getFeatureNames() );
307 rownames(M) = Rcpp::wrap( vInfo->sampleNames );
318 bool ret = getNextChunk_helper();
331 View::UniquePtr view =
nullptr;
333 std::shared_ptr<VariantSet> vs;
334 size_t number_of_samples = 0;
335 vector<string> sampleNames;
336 map<size_t, size_t> requestedSamplesByIndexInDataIndex;
338 vector<double> probs;
339 vector<double> matDosage;
340 size_t max_entries_per_sample = 4;
341 int n_variants_total;
342 int variant_idx_start;
345 bool getNextChunk_helper(){
352 int chunkSize = min(
param.
chunkSize, n_variants_total - variant_idx_start);
353 chunkSize = max(chunkSize, 0);
356 if( chunkSize == 0)
return false;
358 vector<int> data_dimension;
359 data_dimension.push_back(chunkSize);
360 data_dimension.push_back(number_of_samples);
361 data_dimension.push_back(max_entries_per_sample);
363 vector<int> ploidy_dimension;
364 ploidy_dimension.push_back( chunkSize ) ;
365 ploidy_dimension.push_back( number_of_samples ) ;
367 vector<int> ploidy(ploidy_dimension[0]*ploidy_dimension[1], numeric_limits<int>::quiet_NaN());
368 vector<bool> phased( chunkSize, numeric_limits<bool>::quiet_NaN() ) ;
370 string SNPID, rsid, chromosome;
371 genfile::bgen::uint32_t position;
372 vector<string> alleles;
376 for(
size_t j = variant_idx_start; j < variant_idx_start + chunkSize; j++ ) {
379 view->read_variant( &SNPID, &rsid, &chromosome, &position, &alleles ) ;
382 vInfo->
addVariant(chromosome, position, rsid, alleles[0], alleles[1] );
386 &ploidy, ploidy_dimension,
387 &probs, data_dimension,
390 requestedSamplesByIndexInDataIndex
393 view->read_genotype_data_block( setter ) ;
396 variant_idx_start += chunkSize;
402 cube C(probs.data(), chunkSize, number_of_samples, max_entries_per_sample,
true,
true);
421 vec w_unph = {0,1,2};
422 vec w_ph = {0,1,0,1};
427 for(
int j=0; j<chunkSize; j++){
429 dsg = C.row_as_mat(j).t() * w_ph;
433 m = C.row_as_mat(j).t();
434 dsg = m.cols(0,2) * w_unph;
441 memcpy(matDosage.data() + number_of_samples*j, dsg.memptr(), number_of_samples*
sizeof(
double));
Definition GenomicDataStream_virtual.h:40
double getMinVariance()
Definition GenomicDataStream_virtual.h:219
double getMAF() const
Definition GenomicDataStream_virtual.h:225
Param param
Definition GenomicDataStream_virtual.h:273
GenomicDataStream()
Definition GenomicDataStream_virtual.h:187
Definition GenomicRanges.h:25
vector< size_t > get_end() const
Definition GenomicRanges.h:55
vector< string > get_chrom() const
Definition GenomicRanges.h:53
vector< size_t > get_start() const
Definition GenomicRanges.h:54
const int size() const
Definition GenomicRanges.h:61
Definition VariantInfo.h:24
void clear()
Definition VariantInfo.h:142
void addVariant(const string &chr, const int &pos, const string &id, const string &allele1, const string &allele2)
Definition VariantInfo.h:38
VariantInfo()
Definition VariantInfo.h:28
Definition VariantSet.h:45
bool getNextChunk(DataChunk< Rcpp::NumericMatrix > &chunk, const bool &useFilter=true) override
Definition bgenstream.h:295
bool getNextChunk(DataChunk< arma::mat > &chunk, const bool &useFilter=true) override
Definition bgenstream.h:224
int n_samples() override
Definition bgenstream.h:204
bool getNextChunk(DataChunk< vector< double > > &chunk, const bool &useFilter=true) override
Definition bgenstream.h:315
bgenstream()
Definition bgenstream.h:124
bool getNextChunk(DataChunk< Eigen::MatrixXd > &chunk, const bool &useFilter=true) override
Definition bgenstream.h:258
bool getNextChunk(DataChunk< Eigen::SparseMatrix< double > > &chunk, const bool &useFilter=true) override
Definition bgenstream.h:276
GenomicRanges getChromRanges() override
Definition bgenstream.h:220
string getStreamType() override
Definition bgenstream.h:216
~bgenstream()
Definition bgenstream.h:169
bool getNextChunk(DataChunk< arma::sp_mat > &chunk, const bool &useFilter=true) override
Definition bgenstream.h:240
void setRegions(const vector< string > ®ions) override
Definition bgenstream.h:175
string filenameIdxGlobal
Definition bgenstream.h:122
bgenstream(const Param ¶m)
Definition bgenstream.h:128
vector< string > getSampleNames() override
Definition bgenstream.h:210
Definition bgenstream.h:33
Definition GenomicDataStream_virtual.h:84
vector< string > regions
Definition GenomicDataStream_virtual.h:173
string samples
Definition GenomicDataStream_virtual.h:174
FileType fileType
Definition GenomicDataStream_virtual.h:178
string file
Definition GenomicDataStream_virtual.h:171
int chunkSize
Definition GenomicDataStream_virtual.h:176
bool missingToMean
Definition GenomicDataStream_virtual.h:177