/* * PCCP.cpp * * Created on: Oct 16, 2012 * Author: gpeng1 */ #include "PCCP.h" using namespace std; PCCP::PCCP() { m_store=false; m_error=false; m_nGene=0; m_numAllele.clear(); m_nGeno.clear(); m_nGenotype=0; m_mut=false; m_mRate.clear(); m_chromType.clear(); } PCCP::PCCP(const vector & numAllele, double mRate, bool store) { m_store=store; m_error=false; m_nGene=numAllele.size(); m_numAllele=numAllele; m_nGeno.resize(m_nGene); m_nGenotype=1; for(size_t i=0;i (m_nGene,0); init(); } PCCP::PCCP(const vector & numAllele, const vector & mRate, bool store) { m_store=store; m_error=false; m_nGene=numAllele.size(); m_numAllele=numAllele; m_nGeno.resize(m_nGene); m_nGenotype=1; for(size_t i=0;i (m_nGene,0); init(); } PCCP::PCCP(const vector & numAllele, double mRate, const vector & chromType, bool store) { m_store=store; m_error=false; m_nGene=numAllele.size(); m_numAllele=numAllele; m_nGeno.resize(m_nGene); m_nGenotype=1; for(size_t i=0;i & numAllele, const vector & mRate, const vector & chromType, bool store) { m_store=store; m_error=false; m_nGene=numAllele.size(); m_numAllele=numAllele; m_nGeno.resize(m_nGene); m_nGenotype=1; for(size_t i=0;i & geneCode) { if(geneCode.size()!=m_nGene) { return false; } unsigned int rlt=0; unsigned int base=1; for(unsigned int i=0; i< m_nGene;i++) { rlt=rlt+base*geneCode[i]; base=base*m_nGeno[i]; } return rlt; } bool PCCP::decode(unsigned int geno, vector & geneCode) { geneCode.resize(m_nGene,0); for(size_t i=0;i a2gTableTmp(m_numAllele[i],m_numAllele[i]); vector g2aTableTmp; unsigned int count=0; for(unsigned int j=0;j (m_nGenotype,m_nGene); for(unsigned int i=0;i genoCodeTmp; if(decode(i,genoCodeTmp)) { for(unsigned int j=0;j > PCCPSTmp; if(calPCCPS(i,PCCPSTmp)) { PCCPS.push_back(PCCPSTmp); } else { return false; } } return true; } bool PCCP::calPCCPS(int index, vector > & PCCPSTmp) { for(unsigned int i=0;i dmTmp(m_nGeno[index],m_nGeno[index],0); PCCPSTmp.push_back(dmTmp); } if(m_mRate[index]==0) { if(m_chromType[index]==0) { //haplotype for(unsigned int i=0;i pi(m_numAllele[index],m_mRate[index]/(2*(m_numAllele[index]-1))); vector pj(m_numAllele[index],m_mRate[index]/(2*(m_numAllele[index]-1))); //i0 and j0 pi[i0]=(1-m_mRate[index])/2; pj[j0]=(1-m_mRate[index])/2; for(unsigned int k=0;k pi(m_numAllele[index],m_mRate[index]/(m_numAllele[index]-1)); vector pj(m_numAllele[index],m_mRate[index]/(2*(m_numAllele[index]-1))); //i and j0 pi[i]=1-m_mRate[index]; pj[j0]=(1-m_mRate[index])/2; for(unsigned int k=0;k dmTmp(m_nGenotype,m_nGenotype,0); for(unsigned int j=0;j > vmTmp; for(unsigned int j=0;j mTmp; for(unsigned int k=0;k (1,1,0); } return true; } double PCCP::operator ()(unsigned int m, unsigned int n, unsigned int k) const { if(m_error) { cout<<"Error in parameters!"<::const_iterator it=spPCCP[n][k].find(m); if(it==spPCCP[n][k].end()) { return 0; } else { return it->second; } } } else { double rlt=1; for(unsigned int i=0;i