/* * Mendel.cpp * * Created on: Nov 6, 2012 * Author: gpeng1 */ #include "Mendel.h" using namespace std; Mendel::Mendel(const vector & mem, const vector & genoProb, const vector & numAllele, double mRate, bool store): pedigree(mem) { m_genoProb=genoProb; m_pccp=PCCP(numAllele,mRate,store); m_error=!check_nGeno(); m_chromSex=false; } Mendel::Mendel(const vector & mem, const vector & genoProb, const vector & numAllele, const vector & mRate, bool store): pedigree(mem) { m_genoProb=genoProb; m_pccp=PCCP(numAllele,mRate,store); m_error=!check_nGeno(); m_chromSex=false; } Mendel::Mendel(const vector & mem, const vector & genoProb, const vector & numAllele, double mRate, const vector & chromType, bool store): pedigree(mem) { m_genoProb=genoProb; m_error=!check_nGeno(); m_chromSex=false; for(size_t i=0;i chromTypeFemale=chromType; for(size_t i=0;i & mem, const vector & genoProb, const vector & numAllele, const vector & mRate, const vector & chromType, bool store): pedigree(mem) { m_genoProb=genoProb; m_error=!check_nGeno(); m_chromSex=false; for(size_t i=0;i chromTypeFemale=chromType; for(size_t i=0;i & genoProb) { if(genoProb.size()==m_pccp.get_nGenotype()) { m_genoProb=genoProb; m_error=false; return true; } else { return false; } } bool Mendel::set_pccp(const PCCP & pccp) { if(pccp.get_nGenotype()==m_genoProb.size()) { m_pccp=pccp; m_error=false; return true; } else { return false; } } bool Mendel::set_par(const PCCP & pccp, const vector & genoProb) { if(pccp.get_nGenotype() != genoProb.size()) { return false; } else { m_pccp=pccp; m_genoProb=genoProb; m_error=false; return true; } } dMatrix Mendel::calPostProb(const dMatrix & lk, calMethod method) { if(m_error) { cout<<"Error in parameters!"< (1,1,-1); } if(lk.get_column() != m_genoProb.size()) { cout<<"Numbers of columns in the likelihood matrix doesn't match the number of genotype."< (1,1,-1); } if(lk.get_row() != m_nInd) { cout<<"Number of rows in the likelihood matrix doesn;t match the number of samples."< (1,1,-1); } if(m_nInd==m_nIndAll) { m_lk=lk; if(method==Peeling) { return calPostProbPeeling(); } else if(method==BN) { return calPostProbBN(); } else { return calPostProbMCMC(); } } else { dMatrix lkNew(m_nIndAll,lk.get_column()); for(unsigned int i=0;i rltTmp=calPostProbPeeling(); if(rltTmp.get_column()==1){ return rltTmp; } dMatrix rlt(lk.get_row(),lk.get_column()); for(unsigned int i=0;i rltTmp=calPostProbBN(); dMatrix rlt(lk.get_row(),lk.get_column()); for(unsigned int i=0;i rltTmp=calPostProbMCMC(); dMatrix rlt(lk.get_row(),lk.get_column()); for(unsigned int i=0;i Mendel::calPostProb(const dMatrix & lk, const vector & sampleId, calMethod method) { if(m_error) { cout<<"Error in parameters!"< (1,1,-1); } if(lk.get_column() != m_genoProb.size()) { cout<<"Numbers of columns in the likelihood matrix doesn't match the number of genotype."< (1,1,-1); } if(lk.get_row() != m_nInd) { cout<<"Number of rows in the likelihood matrix doesn;t match the number of samples."< (1,1,-1); } vector sampleIndex; for(size_t i=0;i (1,1,-1); } if(m_nInd==m_nIndAll) { m_lk=lk; if(method==Peeling) { return calPostProbPeeling(sampleIndex); } else if(method==BN) { dMatrix rltTmp=calPostProbBN(); dMatrix rlt(sampleIndex.size(),lk.get_column()); for(size_t i=0;i rltTmp = calPostProbMCMC(); dMatrix rlt(sampleIndex.size(),lk.get_column()); for(size_t i=0;i lkNew(m_nIndAll,lk.get_column()); for(unsigned int i=0;i rltTmp=calPostProbBN(); dMatrix rlt(sampleIndex.size(),lk.get_column()); for(size_t i=0;i rltTmp=calPostProbMCMC(); dMatrix rlt(sampleIndex.size(),lk.get_column()); for(size_t i=0;i Mendel::calPostProbPeeling() { dMatrix antProb(m_nIndAll,m_nGenotype,-1); dMatrix checkLoop(m_nIndAll,m_nGenotype,false); m_loop=false; vector > posProb; for(unsigned int i=0;i dmTmp(m_nIndAll,m_nGenotype,-1); posProb.push_back(dmTmp); } //prepare anterior probability //set founder's anterior probability for(unsigned int i=0;i postProb(m_nIndAll,m_nGenotype); for(unsigned int i=0;i (1,1,-2); } cout<<"Error during peeling."< (1,1,-1); } for(unsigned int j=0;j (1,1,-2); } return postProb; } dMatrix Mendel::calPostProbPeeling(const vector & sampleIndex) { dMatrix antProb(m_nIndAll,m_nGenotype,-1); dMatrix checkLoop(m_nIndAll,m_nGenotype,false); m_loop=false; vector > posProb; for(unsigned int i=0;i dmTmp(m_nIndAll,m_nGenotype,-1); posProb.push_back(dmTmp); } //prepare anterior probability //set founder's anterior probability for(unsigned int i=0;i postProb(sampleIndex.size(),m_nGenotype); for(unsigned int i=0;i (1,1,-2); } cout<<"Error during peeling."< (1,1,-1); } for(unsigned int j=0;j (1,1,-2); } return postProb; } dMatrix Mendel::calPostProbBN() { dMatrix postProb(m_nIndAll,m_nGenotype,0); //initial genotype vector genotype(m_nIndAll,0); vector indProb(m_nIndAll,0); while(true) { for(unsigned int i=0;i (1,1,-1); } for(unsigned int j=0;j Mendel::calPostProbMCMC() { dMatrix postProb(m_nIndAll,m_nGenotype); return postProb; } double Mendel::calAntProb(unsigned int iInd, unsigned int iGeno, dMatrix & antProb, vector > & posProb, dMatrix & checkLoop) { if(antProb(iInd,iGeno)>=0) { return antProb(iInd,iGeno); } if(checkLoop(iInd,iGeno)){ m_loop = true; return 0; } checkLoop(iInd,iGeno) = true; unsigned int p1 = parent[iInd][0]; unsigned int p2 = parent[iInd][1]; vector otherChild; for(size_t i=0;i otherSpouse1; for(size_t i=0;i otherSpouse2; for(size_t i=0;i & antProb, vector > & posProb, dMatrix & checkLoop) { if(posProb[iInd](jInd,iGeno)>=0) { return posProb[iInd](jInd,iGeno); } //jInd's other spouse beside iInd vector otherSpouse; for(size_t i=0;i allChild; for(size_t i=0;i