20#include <unordered_map>
27#include "pgen/RPgenReader.h"
55 if( genoFileType ==
PGEN ){
58 pvar->Load(fileIdx,
true,
true);
62 missingToMean = (genoFileType ==
PBED) ?
70 pg =
new RPgenReader();
71 pg->Load(
param.
file, pvar, n_samples_psam, sampleIdx1);
83 if( vInfo !=
nullptr)
delete vInfo;
96 void setRegions(
const vector<string> ®ions )
override {
105 varIdx = vs.getIndeces( gr );
109 for(
int i=0; i<dt.nrows(); i++){
115 n_requested_variants = varIdx.size();
124 return number_of_samples;
130 return vInfo->sampleNames;
140 return vs.getChromRanges();
146 bool ret = getNextChunk_helper();
153 arma::mat M(matDosage.data(), number_of_samples, vInfo->size(),
false,
true);
163 bool ret = getNextChunk_helper();
170 arma::mat M(matDosage.data(), number_of_samples, vInfo->size(),
false,
true);
177 #ifndef DISABLE_EIGEN
181 bool ret = getNextChunk_helper();
188 Eigen::MatrixXd M = Eigen::Map<Eigen::MatrixXd>(matDosage.data(), number_of_samples, vInfo->size());
198 bool ret = getNextChunk_helper();
205 Eigen::MatrixXd M = Eigen::Map<Eigen::MatrixXd>(matDosage.data(), number_of_samples, vInfo->size());
217 bool ret = getNextChunk_helper();
224 Rcpp::NumericMatrix M(number_of_samples, vInfo->size(), matDosage.data());
225 colnames(M) = Rcpp::wrap( vInfo->getFeatureNames() );
226 rownames(M) = Rcpp::wrap( vInfo->sampleNames );
237 bool ret = getNextChunk_helper();
250 size_t number_of_samples = 0;
251 int n_requested_variants = 0;
253 vector<double> matDosage;
256 RPgenReader *pg =
nullptr;
257 RPvar *pvar =
nullptr;
262 vector<int> sampleIdx1;
266 bool getNextChunk_helper (){
273 int chunkSize = min(
param.
chunkSize, n_requested_variants - currentIdx);
274 chunkSize = max(chunkSize, 0);
277 if( chunkSize == 0)
return false;
280 auto end = min( varIdx.begin() + currentIdx + chunkSize, varIdx.end());
281 vector<int> varIdx_sub = {varIdx.begin() + currentIdx, end};
286 vector<int> varIdx_sub1(varIdx_sub);
287 for(
int &i : varIdx_sub1) i++;
289 pg->ReadList( matDosage, varIdx_sub1, missingToMean);
294 vInfo->
addVariants( subset_vector(dt[
"CHROM"], varIdx_sub),
295 subset_vector(dt[
"POS"], varIdx_sub),
296 subset_vector(dt[
"ID"], varIdx_sub),
297 subset_vector(dt[
"REF"], varIdx_sub),
298 subset_vector(dt[
"ALT"], varIdx_sub));
301 currentIdx += varIdx_sub.size();
310 void process_variants(){
313 if( genoFileType ==
PGEN ){
315 fileIdx = regex_replace(
param.
file, regex(
"pgen$"),
"pvar");
323 }
else if( genoFileType ==
PBED ){
326 fileIdx = regex_replace(
param.
file, regex(
"bed$"),
"bim");
331 dt.setColNames({
"CHROM",
"ID",
"CM",
"POS",
"ALT",
"REF"});
333 throw logic_error(
"Not valid genotype file extension: " +
param.
file);
337 vs =
VariantSet(dt[
"CHROM"], stoi_vec(dt[
"POS"]));
343 void process_samples(){
354 if( genoFileType ==
PGEN ){
356 fileSamples = regex_replace(
param.
file, regex(
"pgen$"),
"psam");
357 }
else if( genoFileType ==
PBED ){
359 fileSamples = regex_replace(
param.
file, regex(
"bed$"),
"fam");
364 if( regex_search(fileSamples, regex(
"psam$")) ){
370 }
else if( regex_search(fileSamples, regex(
"fam$")) ){
377 vector<string> names = {
"FID",
"IID",
"PID",
"MID",
"SEX",
"PHENO"};
378 vector<string> names_sub(names.begin(), names.begin() + dt.ncols());
379 dt2.setColNames(names_sub);
381 throw logic_error(
"Not valid sample file extension: " + fileSamples);
385 vector<string> SamplesNames = dt2[
"IID"];
386 n_samples_psam = SamplesNames.size();
389 vector<int> sampleIdx;
396 vector<string> requestedSamples;
400 requestedSamples = split_any_of(
param.
samples,
"\t,\n");
405 unordered_map<string,int> map_sn;
406 for(
int i=0; i<SamplesNames.size(); i++){
407 map_sn.emplace(SamplesNames[i], i);
412 for(
string & name : requestedSamples){
413 if( map_sn.count(name) == 0){
414 throw logic_error(
"Sample id not found: " + name);
416 sampleIdx.push_back( map_sn[name] );
418 sort(sampleIdx.begin(), sampleIdx.end());
422 vector<string> requestedSamples_ordered;
423 for(
int i : sampleIdx){
424 requestedSamples_ordered.push_back( SamplesNames[i] );
429 vInfo =
new VariantInfo( requestedSamples_ordered );
430 number_of_samples = requestedSamples_ordered.size();
433 sampleIdx1.assign(sampleIdx.begin(), sampleIdx.end());
434 for(
int &i : sampleIdx1) i++;
437 number_of_samples = SamplesNames.size();
440 sampleIdx1.resize(number_of_samples);
441 iota(begin(sampleIdx1), end(sampleIdx1), 1);
Definition GenomicDataStream_virtual.h:40
Definition DataTable.h:28
DataTable()
Definition DataTable.h:32
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
const int size() const
Definition GenomicRanges.h:61
Definition VariantInfo.h:24
void clear()
Definition VariantInfo.h:142
VariantInfo()
Definition VariantInfo.h:28
void addVariants(const vector< string > &chr, const vector< string > &pos, const vector< string > &id, const vector< string > &allele1, const vector< string > &allele2)
Definition VariantInfo.h:54
Definition VariantSet.h:45
VariantSet()
Definition VariantSet.h:48
vector< string > getSampleNames() override
Definition pgenstream.h:129
bool getNextChunk(DataChunk< Rcpp::NumericMatrix > &chunk, const bool &useFilter=true) override
Definition pgenstream.h:214
bool getNextChunk(DataChunk< vector< double > > &chunk, const bool &useFilter=true) override
Definition pgenstream.h:234
~pgenstream()
Definition pgenstream.h:82
bool getNextChunk(DataChunk< Eigen::SparseMatrix< double > > &chunk, const bool &useFilter=true) override
Definition pgenstream.h:195
string getStreamType() override
Definition pgenstream.h:135
bool getNextChunk(DataChunk< arma::mat > &chunk, const bool &useFilter=true) override
Definition pgenstream.h:143
pgenstream(const Param ¶m)
Definition pgenstream.h:47
void setRegions(const vector< string > ®ions) override
Definition pgenstream.h:96
bool getNextChunk(DataChunk< Eigen::MatrixXd > &chunk, const bool &useFilter=true) override
Definition pgenstream.h:178
GenomicRanges getChromRanges() override
Definition pgenstream.h:139
int n_samples() override
Definition pgenstream.h:123
bool getNextChunk(DataChunk< arma::sp_mat > &chunk, const bool &useFilter=true) override
Definition pgenstream.h:160
pgenstream()
Definition pgenstream.h:43
Definition bgenstream.h:33
FileType
Definition utils.h:298
@ PBED
Definition utils.h:304
@ PGEN
Definition utils.h:303
Definition GenomicDataStream_virtual.h:84
vector< string > regions
Definition GenomicDataStream_virtual.h:173
string samples
Definition GenomicDataStream_virtual.h:174
string fileSamples
Definition GenomicDataStream_virtual.h:171
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