Nemo  2.4.0b
Simulate forward-in-time genetic evolution in a spatially explicit, individual-based stochastic simulator
TTNOhtaStats Class Reference

TTNOhtaStats. More...

#include <ttneutralgenes.h>

+ Inheritance diagram for TTNOhtaStats:
+ Collaboration diagram for TTNOhtaStats:

Public Member Functions

 TTNOhtaStats (TProtoNeutralGenes *T)
 
virtual ~TTNOhtaStats ()
 
virtual void FHwrite ()
 
virtual void FHread (string &filename)
 
- Public Member Functions inherited from TraitFileHandler< TProtoNeutralGenes >
 TraitFileHandler (TProtoNeutralGenes *trait_proto, const char *ext)
 
virtual ~TraitFileHandler ()
 
virtual void FHread (string &filename)=0
 
virtual void set (bool rpl_per, bool gen_per, int rpl_occ, int gen_occ, int rank, string path, TProtoNeutralGenes *trait_proto)
 
virtual void set_multi (bool rpl_per, bool gen_per, int rpl_occ, TMatrix *Occ, string path, TProtoNeutralGenes *trait_proto)
 
- Public Member Functions inherited from FileHandler
 FileHandler (const char *ext)
 
virtual ~FileHandler ()
 
virtual void init ()
 Called by notifier during simulation setup, performs file checking. More...
 
virtual vector< string > ifExist ()
 Checks if any file associated with the current file name already exists on disk. More...
 
virtual void set (bool rpl_per, bool gen_per, int rpl_occ, int gen_occ, int rank, string path)
 Sets the hanlder parameters. More...
 
virtual void set_multi (bool rpl_per, bool gen_per, int rpl_occ, TMatrix *Occ, string path)
 
virtual void update ()
 Updates the inner replicate and generation counters and calls FHwrite if needed by the the periodicity of the file. More...
 
Metapopget_pop_ptr ()
 Returns the pointer to the current metapop through the FileServices interface. More...
 
void set_pop_ptr (Metapop *pop_ptr)
 
FileServicesget_service ()
 Returns pointer to the FileServices. More...
 
void set_service (FileServices *srv)
 
std::string & get_path ()
 
void set_path ()
 
std::string & get_extension ()
 
void set_extension (const char *ext)
 
std::string & get_filename ()
 Builds and returns the current file name depending on the periodicity of the file. More...
 
bool get_isInputHandler ()
 
void set_isInputHandler (bool val)
 
bool get_isReplicatePeriodic ()
 
void set_isReplicatePeriodic (bool val)
 
unsigned int get_ReplicateOccurrence ()
 
void set_ReplicateOccurrence (unsigned int val)
 
bool get_isGenerationPeriodic ()
 
void set_isGenerationPeriodic (bool val)
 
unsigned int get_GenerationOccurrence ()
 
void set_GenerationOccurrence (unsigned int val)
 
unsigned int get_ExecRank ()
 unused yet... More...
 
void set_ExecRank (int val)
 
TMatrixget_OccMatrix ()
 
void set_OccMatrix (TMatrix *occ)
 
bool get_isMasterExec ()
 
void set_isMasterExec (bool is)
 
- Public Member Functions inherited from Handler
virtual ~Handler ()
 

Private Attributes

TMatrix _pairwiseCombs
 

Additional Inherited Members

- Protected Attributes inherited from TraitFileHandler< TProtoNeutralGenes >
TProtoNeutralGenes_FHLinkedTrait
 
int _FHLinkedTraitIndex
 
- Protected Attributes inherited from FileHandler
Metapop_pop
 Pointer to the current metapop, set during initialization within the init function. More...
 

Detailed Description

Constructor & Destructor Documentation

◆ TTNOhtaStats()

TTNOhtaStats::TTNOhtaStats ( TProtoNeutralGenes T)
inline

◆ ~TTNOhtaStats()

virtual TTNOhtaStats::~TTNOhtaStats ( )
inlinevirtual
308 {}

Member Function Documentation

◆ FHread()

virtual void TTNOhtaStats::FHread ( string &  filename)
inlinevirtual

Implements FileHandler.

310 {}

◆ FHwrite()

void TTNOhtaStats::FHwrite ( )
virtual

Implements TraitFileHandler< TProtoNeutralGenes >.

1790 {
1791  Metapop* pop = get_pop_ptr();
1792  int patchNbr = pop->getPatchNbr();
1793  unsigned int nb_allele = _FHLinkedTrait->get_allele_num();
1794  unsigned int nb_locus = _FHLinkedTrait->get_locus_num();
1795 
1796  // Output Ohta stats :
1797  // Only if pop alive
1798  // Only for diallelic mutation models
1799  // Only for multi-population scenarios
1800  if ((!pop->isAlive()) || (nb_allele > 2) || (patchNbr < 2)) {
1801  error("TTNOhtaStats::neutral trait and population are not compatible with Ohta stats (min. 2 patches, di-allelic loci), file will not be written.\n");
1802  return;
1803  }
1804 
1805  _pairwiseCombs.copy(nChooseKVec(nb_locus, 2));
1806 
1807  unsigned int num_comb = _pairwiseCombs.nrows();
1808 
1809  ostringstream REC;
1810  Individual* ind;
1811  TTrait* trait;
1812  Patch* current_patch;
1813 
1814  vector<double> Dis(num_comb, 0.0),
1815  Dst(num_comb, 0.0),
1816  Disp(num_comb, 0.0),
1817  Dstp(num_comb, 0.0);
1818 
1819  vector< vector<double> > rSquare = vector< vector<double> > (patchNbr, vector<double>(num_comb, 0.0));
1820 
1821  vector<bool> NA(num_comb, false);
1822 
1823  int total_size = 0;
1824  int extant_patches = 0;
1825 
1826  vector<int> patchSizes(patchNbr, 0);
1827 
1828  // pre-record patch sizes and number of extant patches
1829  for(int patch = 0; patch < patchNbr; patch++) {
1830 
1831  current_patch = pop->getPatch(patch);
1832 
1833  patchSizes[patch] = 2 * (current_patch->size(FEM, ADLTx) + current_patch->size(MAL, ADLTx));
1834 
1835  if(patchSizes[patch]) ++extant_patches; // count patches with individuals
1836 
1837  total_size += patchSizes[patch];
1838  }
1839 
1840 #ifdef _DEBUG_
1841  message("TTNOhtaStats::FHwrite:: computing association stats of %i combinations\n", num_comb);
1842  fflush(stdout);
1843 #endif
1844 
1845 
1846  unsigned int a1, a2;
1847  unsigned int twoLocHapMap[2][2] = {{0,1},{2,3}}; // genot: AB, Ab, aB, ab; A = 0, a = 1, B = 2, b = 3
1848  unsigned int reverseHapMap[4][2] = {{0,2},{0,3},{1,2},{1,3}}; // AB -> {0,2} ...
1849 
1850  vector< double > meanGenoFreq(4,0.0); // allele counter at the two loci,0 = [0], 1 = [1], 0 = [2], 1 = [3]
1851  vector< double > meanHapFreq(4,0.0); // genotype counter
1852 
1853  vector< vector< double > > genoFreq = vector< vector< double > > (patchNbr, vector< double >(4,0.0));
1854  vector< vector< double > > hapFreq = vector< vector< double > > (patchNbr, vector< double >(4,0.0));
1855 
1856  // cycling through all pairwise locus combinations
1857  for (size_t pcomb = 0; pcomb < num_comb; pcomb++) {
1858 
1859  size_t loc1 = _pairwiseCombs.get(pcomb,0),
1860  loc2 = _pairwiseCombs.get(pcomb,1);
1861 
1862  unsigned int refLoc1, refLoc2;
1863 
1864  current_patch = pop->getPatch(0);
1865 
1866  ind = current_patch->get(FEM, ADLTx, 0);
1867 
1868  trait = ind->getTrait(_FHLinkedTraitIndex);
1869 
1870  // reference alleles from the first female adult of the first patch
1871  refLoc1 = trait->get_allele(loc1, 0);
1872  refLoc2 = trait->get_allele(loc2, 0);
1873 
1874  meanGenoFreq.assign(4, 0.0);
1875  meanHapFreq.assign(4,0.0);
1876 
1877  for(int patch = 0; patch < patchNbr; patch++) {
1878 
1879  current_patch = pop->getPatch(patch);
1880 
1881  genoFreq[patch].assign(4,0.0);
1882  hapFreq[patch].assign(4,0.0);
1883 
1884  if(patchSizes[patch] == 0) continue;
1885 
1886  // All adults in a patch
1887  for(unsigned int s =0; s < 2; ++s) { // two sexes
1888 
1889  for(unsigned int j = 0, size = current_patch->size(sex_t(s), ADLTx); j < size; j++) {
1890 
1891  ind = current_patch->get(sex_t(s), ADLTx, j);
1892 
1893  trait = ind->getTrait(_FHLinkedTraitIndex);
1894 
1895  // Homologous copy 1
1896  // locus 1
1897  if (trait->get_allele(loc1, 0) == refLoc1) {
1898  ++genoFreq[patch][0];
1899  a1 = 0;
1900  }
1901  else {
1902  ++genoFreq[patch][1];
1903  a1 = 1;
1904  }
1905 
1906  // locus 2
1907  if (trait->get_allele(loc2, 0) == refLoc2) {
1908  ++genoFreq[patch][2];
1909  a2 = 0;
1910  }
1911  else {
1912  ++genoFreq[patch][3];
1913  a2 = 1;
1914  }
1915 
1916  ++hapFreq[patch][twoLocHapMap[a1][a2]];
1917 
1918  // Homologous copy 2
1919  // locus 1
1920  if (trait->get_allele(loc1, 1) == refLoc1) {
1921  ++genoFreq[patch][0];
1922  a1 = 0;
1923  }
1924  else {
1925  ++genoFreq[patch][1];
1926  a1 = 1;
1927  }
1928 
1929  // locus 2
1930  if (trait->get_allele(loc2, 1) == refLoc2) {
1931  ++genoFreq[patch][2];
1932  a2 = 0;
1933  }
1934  else {
1935  ++genoFreq[patch][3];
1936  a2 = 1;
1937  }
1938 
1939  ++hapFreq[patch][twoLocHapMap[a1][a2]];
1940  } // All individuals
1941  } // two sexes
1942 
1943  for (size_t geno = 0; geno < 4; geno++) {
1944  genoFreq[patch][geno] /= patchSizes[patch];
1945  meanGenoFreq[geno] += genoFreq[patch][geno];
1946  }
1947 
1948  for (size_t hap = 0; hap < 4; hap++) {
1949  hapFreq[patch][hap] /= patchSizes[patch];
1950  meanHapFreq[hap] += hapFreq[patch][hap];
1951  }
1952  } // All patches
1953 
1954  for (size_t geno = 0; geno < 4; geno++)
1955  meanGenoFreq[geno] /= extant_patches;
1956 
1957  for (size_t hap = 0; hap < 4; hap++)
1958  meanHapFreq[hap] /= extant_patches;
1959 
1960  // eliminate pairs with fixed alleles
1961  if ( !(meanGenoFreq[0]*meanGenoFreq[1]) && !(meanGenoFreq[2] * meanGenoFreq[3]))
1962  NA[pcomb] = true;
1963 
1964  if (!NA[pcomb]) {
1965 
1966  for(int patch = 0; patch < patchNbr; patch++) {
1967 
1968  if(!patchSizes[patch]) continue;
1969 
1970  for (size_t hap = 0; hap < 4; hap++) {
1971  // Ohta (1982), Eq. 10
1972  Dis[pcomb] += pow(hapFreq[patch][hap] -
1973  (genoFreq[patch][reverseHapMap[hap][0]] * genoFreq[patch][reverseHapMap[hap][1]]), 2);
1974 
1975  // Ohta (1982), Eq. 11
1976  Dst[pcomb] += pow((genoFreq[patch][reverseHapMap[hap][0]] * genoFreq[patch][reverseHapMap[hap][1]]) -
1977  (meanGenoFreq[reverseHapMap[hap][0]] * meanGenoFreq[reverseHapMap[hap][1]]), 2);
1978 
1979  // Ohta (1982), Eq. 12
1980  Disp[pcomb] += pow(hapFreq[patch][hap] - meanHapFreq[hap], 2);
1981 
1982  // Ohta (1982), Eq. 13
1983  Dstp[pcomb] += pow(meanHapFreq[hap] -
1984  (meanGenoFreq[reverseHapMap[hap][0]] * meanGenoFreq[reverseHapMap[hap][1]]), 2);
1985  }
1986 
1987  double denom = genoFreq[patch][0] * genoFreq[patch][1] * genoFreq[patch][2] * genoFreq[patch][3];
1988 
1989  if (denom == 0.0)
1990  rSquare[patch][pcomb] = 0;
1991  else
1992  rSquare[patch][pcomb] = pow(hapFreq[patch][0] - genoFreq[patch][0]*genoFreq[patch][2], 2)
1993  / denom;
1994  }
1995 
1996  // Ohta (1982), Eq. 10-13
1997  Dis[pcomb] /= extant_patches;
1998  Dst[pcomb] /= extant_patches;
1999  Disp[pcomb] /= extant_patches;
2000  Dstp[pcomb] /= extant_patches;
2001 
2002  }
2003 
2004 // cout << "\nLocus " << loc1+1 << " and locus " << loc2+1 << endl;
2005 // cout << "\"A allele\" : " << refLoc1 << "\n\"B allele\" : " << refLoc2 << endl;
2006 // for(int patch = 0; patch < patchNbr; patch++) {
2007 // cout << "Patch " << patch+1 << endl;
2008 // for (size_t geno = 0; geno < Gtypes.size(); geno++)
2009 // cout << geno << " : " << genoFreq[patch][geno] << endl;
2010 // for (size_t hap = 0; hap < Htypes.size(); hap++)
2011 // cout << hap << " : " << hapFreq[patch][hap] << endl;
2012 // for (size_t hap = 0; hap < Htypes.size(); hap++)
2013 // cout << "Exp_" << reverseHapMap[hap][0] << reverseHapMap[hap][1] << " : " << (genoFreq[patch][reverseHapMap[hap][0]] * genoFreq[patch][reverseHapMap[hap][1]]) << endl;
2014 // }
2015 // cout << "*****************" << endl;
2016 // for (size_t geno = 0; geno < Gtypes.size(); geno++)
2017 // cout << geno << " : " << meanGenoFreq[geno] << endl;
2018 // for (size_t hap = 0; hap < Htypes.size(); hap++)
2019 // cout << hap << " : " << meanHapFreq[hap] << endl;
2020 // for (size_t hap = 0; hap < Htypes.size(); hap++)
2021 // cout << "Exp_" << reverseHapMap[hap][0] << reverseHapMap[hap][1] << " : " << (meanGenoFreq[reverseHapMap[hap][0]] * meanGenoFreq[reverseHapMap[hap][1]]) << endl;
2022 // cout << "*****************" << endl;
2023 
2024  } // All pairwise locus combinations
2025 
2026  string filename = get_filename();
2027  ofstream FILE;
2028 
2029  //open file for writing
2030  FILE.open(filename.c_str(), ios::out);
2031  std::ios_base::sync_with_stdio(false); // better for writing performances
2032 
2033  if(!FILE) fatal("Trait neutral could not open output file: \"%s\"\n",filename.c_str());
2034 
2035 #ifdef _DEBUG_
2036  message("TTNOhtaStats::FHwrite (%s)\n",filename.c_str());
2037  fflush(stdout);
2038 #endif
2039 
2040  FILE << "loc1\tloc2\tDst\tDis\tDstp\tDisp";
2041  for(int patch = 0; patch < patchNbr; patch++)
2042  FILE << "\tr_" << patch+1;
2043  FILE << endl;
2044 
2045  for (size_t pcomb = 0; pcomb < num_comb; pcomb++) {
2046  if (!NA[pcomb]) {
2047  FILE << _pairwiseCombs.get(pcomb,0)+1 << "\t" << _pairwiseCombs.get(pcomb,1)+1 << "\t"
2048  << Dst[pcomb] << "\t" << Dis[pcomb] << "\t" << Dstp[pcomb] << "\t" << Disp[pcomb];
2049  for(int patch = 0; patch < patchNbr; patch++)
2050  FILE << "\t" << rSquare[patch][pcomb];
2051  FILE << endl;
2052  }
2053  }
2054 
2055  FILE.close();
2056  std::ios_base::sync_with_stdio(true); // reset
2057 }
std::string & get_filename()
Builds and returns the current file name depending on the periodicity of the file.
Definition: filehandler.cc:151
Metapop * get_pop_ptr()
Returns the pointer to the current metapop through the FileServices interface.
Definition: filehandler.h:135
This class contains traits along with other individual information (sex, pedigree,...
Definition: individual.h:49
TTrait * getTrait(IDX T)
Trait accessor.
Definition: individual.h:277
Top class of the metapopulation structure, contains the patches.
Definition: metapop.h:80
unsigned int getPatchNbr()
Definition: metapop.h:276
bool isAlive()
Checks if the population still contains at least one individual in any sex or age class.
Definition: metapop.h:309
Patch * getPatch(unsigned int i)
Patch accessor, return the ith+1 patch in the metapop.
Definition: metapop.h:257
Second class in the metapopulation design structure, between the Metapop and Individual classes.
Definition: metapop.h:432
unsigned int size(age_t AGE)
Returns the size of the container of the appropriate age class(es) for both sexes.
Definition: metapop.h:498
Individual * get(sex_t SEX, age_idx AGE, unsigned int at)
Returns a pointer to the individual sitting at the index passed.
Definition: metapop.h:534
void assign(sex_t SEX, age_idx AGE, size_t n)
Assigns a new container of given size for the sex and age class passed, sets all values to NULL.
Definition: metapop.h:561
void copy(const TMatrix &mat)
Copy a matrix.
Definition: tmatrix.h:78
double get(unsigned int i, unsigned int j) const
Accessor to element at row i and column j.
Definition: tmatrix.h:193
unsigned int nrows() const
Definition: tmatrix.h:213
unsigned int get_locus_num()
Definition: ttneutralgenes.h:200
unsigned int get_allele_num()
Definition: ttneutralgenes.h:201
TMatrix _pairwiseCombs
Definition: ttneutralgenes.h:303
Interface for all trait types, declares all basic trait operations.
Definition: ttrait.h:46
virtual unsigned int get_allele(int loc, int all) const =0
Called to read the allele identity at a locus.
int _FHLinkedTraitIndex
Definition: filehandler.h:224
TProtoNeutralGenes * _FHLinkedTrait
Definition: filehandler.h:223
void fatal(const char *str,...)
Definition: output.cc:100
int error(const char *str,...)
Definition: output.cc:79
void message(const char *message,...)
Definition: output.cc:40
sex_t
Sex types, males are always 0 and females 1!!
Definition: types.h:36
@ FEM
Definition: types.h:37
@ MAL
Definition: types.h:37
@ ADLTx
Definition: types.h:42
TMatrix nChooseKVec(int n, int k)
Definition: utils.cc:198

References TraitFileHandler< TProtoNeutralGenes >::_FHLinkedTrait, TraitFileHandler< TProtoNeutralGenes >::_FHLinkedTraitIndex, _pairwiseCombs, ADLTx, Patch::assign(), TMatrix::copy(), error(), fatal(), FEM, Patch::get(), TMatrix::get(), TTrait::get_allele(), TProtoNeutralGenes::get_allele_num(), FileHandler::get_filename(), TProtoNeutralGenes::get_locus_num(), FileHandler::get_pop_ptr(), Metapop::getPatch(), Metapop::getPatchNbr(), Individual::getTrait(), Metapop::isAlive(), MAL, message(), nChooseKVec(), TMatrix::nrows(), and Patch::size().

Member Data Documentation

◆ _pairwiseCombs

TMatrix TTNOhtaStats::_pairwiseCombs
private

Referenced by FHwrite().


The documentation for this class was generated from the following files:

Generated for Nemo v2.4.0b by  doxygen 1.9.1 -- Nemo is hosted on  Download Nemo

Locations of visitors to this page
Catalogued on GSR