1797 if ((!pop->
isAlive()) || (nb_allele > 2) || (patchNbr < 2)) {
1798 error(
"TTNOhtaStats::neutral trait and population are not compatible with Ohta stats (min. 2 patches, di-allelic loci), file will not be written.\n");
1809 Patch* current_patch;
1811 vector<double> Dis(num_comb, 0.0),
1813 Disp(num_comb, 0.0),
1814 Dstp(num_comb, 0.0);
1816 vector< vector<double> > rSquare = vector< vector<double> > (patchNbr, vector<double>(num_comb, 0.0));
1818 vector<bool> NA(num_comb,
false);
1821 int extant_patches = 0;
1823 vector<int> patchSizes(patchNbr, 0);
1826 for(
int patch = 0; patch < patchNbr; patch++) {
1828 current_patch = pop->
getPatch(patch);
1832 if(patchSizes[patch]) ++extant_patches;
1834 total_size += patchSizes[patch];
1838 message(
"TTNOhtaStats::FHwrite:: computing association stats of %i combinations\n", num_comb);
1843 unsigned int a1, a2;
1844 unsigned int twoLocHapMap[2][2] = {{0,1},{2,3}};
1845 unsigned int reverseHapMap[4][2] = {{0,2},{0,3},{1,2},{1,3}};
1847 vector< double > meanGenoFreq(4,0.0);
1848 vector< double > meanHapFreq(4,0.0);
1850 vector< vector< double > > genoFreq = vector< vector< double > > (patchNbr, vector< double >(4,0.0));
1851 vector< vector< double > > hapFreq = vector< vector< double > > (patchNbr, vector< double >(4,0.0));
1854 for (
size_t pcomb = 0; pcomb < num_comb; pcomb++) {
1859 unsigned int refLoc1, refLoc2;
1871 meanGenoFreq.assign(4, 0.0);
1872 meanHapFreq.assign(4,0.0);
1874 for(
int patch = 0; patch < patchNbr; patch++) {
1876 current_patch = pop->
getPatch(patch);
1878 genoFreq[patch].
assign(4,0.0);
1879 hapFreq[patch].assign(4,0.0);
1881 if(patchSizes[patch] == 0)
continue;
1884 for(
unsigned int s =0; s < 2; ++s) {
1886 for(
unsigned int j = 0, size = current_patch->
size(
sex_t(s),
ADLTx); j < size; j++) {
1895 ++genoFreq[patch][0];
1899 ++genoFreq[patch][1];
1905 ++genoFreq[patch][2];
1909 ++genoFreq[patch][3];
1913 ++hapFreq[patch][twoLocHapMap[a1][a2]];
1918 ++genoFreq[patch][0];
1922 ++genoFreq[patch][1];
1928 ++genoFreq[patch][2];
1932 ++genoFreq[patch][3];
1936 ++hapFreq[patch][twoLocHapMap[a1][a2]];
1940 for (
size_t geno = 0; geno < 4; geno++) {
1941 genoFreq[patch][geno] /= patchSizes[patch];
1942 meanGenoFreq[geno] += genoFreq[patch][geno];
1945 for (
size_t hap = 0; hap < 4; hap++) {
1946 hapFreq[patch][hap] /= patchSizes[patch];
1947 meanHapFreq[hap] += hapFreq[patch][hap];
1951 for (
size_t geno = 0; geno < 4; geno++)
1952 meanGenoFreq[geno] /= extant_patches;
1954 for (
size_t hap = 0; hap < 4; hap++)
1955 meanHapFreq[hap] /= extant_patches;
1958 if ( !(meanGenoFreq[0]*meanGenoFreq[1]) && !(meanGenoFreq[2] * meanGenoFreq[3]))
1963 for(
int patch = 0; patch < patchNbr; patch++) {
1965 if(!patchSizes[patch])
continue;
1967 for (
size_t hap = 0; hap < 4; hap++) {
1969 Dis[pcomb] += pow(hapFreq[patch][hap] -
1970 (genoFreq[patch][reverseHapMap[hap][0]] * genoFreq[patch][reverseHapMap[hap][1]]), 2);
1973 Dst[pcomb] += pow((genoFreq[patch][reverseHapMap[hap][0]] * genoFreq[patch][reverseHapMap[hap][1]]) -
1974 (meanGenoFreq[reverseHapMap[hap][0]] * meanGenoFreq[reverseHapMap[hap][1]]), 2);
1977 Disp[pcomb] += pow(hapFreq[patch][hap] - meanHapFreq[hap], 2);
1980 Dstp[pcomb] += pow(meanHapFreq[hap] -
1981 (meanGenoFreq[reverseHapMap[hap][0]] * meanGenoFreq[reverseHapMap[hap][1]]), 2);
1984 double denom = genoFreq[patch][0] * genoFreq[patch][1] * genoFreq[patch][2] * genoFreq[patch][3];
1987 rSquare[patch][pcomb] = 0;
1989 rSquare[patch][pcomb] = pow(hapFreq[patch][0] - genoFreq[patch][0]*genoFreq[patch][2], 2)
1994 Dis[pcomb] /= extant_patches;
1995 Dst[pcomb] /= extant_patches;
1996 Disp[pcomb] /= extant_patches;
1997 Dstp[pcomb] /= extant_patches;
2027 FILE.open(filename.c_str(), ios::out);
2028 std::ios_base::sync_with_stdio(
false);
2030 if(!FILE)
fatal(
"Trait neutral could not open output file: \"%s\"\n",filename.c_str());
2033 message(
"TTNOhtaStats::FHwrite (%s)\n",filename.c_str());
2037 FILE <<
"loc1\tloc2\tDst\tDis\tDstp\tDisp";
2038 for(
int patch = 0; patch < patchNbr; patch++)
2039 FILE <<
"\tr_" << patch+1;
2042 for (
size_t pcomb = 0; pcomb < num_comb; pcomb++) {
2045 << Dst[pcomb] <<
"\t" << Dis[pcomb] <<
"\t" << Dstp[pcomb] <<
"\t" << Disp[pcomb];
2046 for(
int patch = 0; patch < patchNbr; patch++)
2047 FILE <<
"\t" << rSquare[patch][pcomb];
2053 std::ios_base::sync_with_stdio(
true);
std::string & get_filename()
Builds and returns the current file name depending on the periodicity of the file.
Definition: filehandler.cc:150
Metapop * get_pop_ptr()
Returns the pointer to the current metapop through the FileServices interface.
Definition: filehandler.h:134
This class contains traits along with other individual information (sex, pedigree,...
Definition: individual.h:48
TTrait * getTrait(IDX T)
Trait accessor.
Definition: individual.h:276
Second class in the metapopulation design structure, between the Metapop and Individual classes.
Definition: metapop.h:431
unsigned int size(age_t AGE)
Returns the size of the container of the appropriate age class(es) for both sexes.
Definition: metapop.h:497
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:533
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:560
void copy(const TMatrix &mat)
Copy a matrix.
Definition: tmatrix.h:77
double get(unsigned int i, unsigned int j) const
Accessor to element at row i and column j.
Definition: tmatrix.h:192
unsigned int nrows() const
Definition: tmatrix.h:212
unsigned int get_locus_num()
Definition: ttneutralgenes.h:199
unsigned int get_allele_num()
Definition: ttneutralgenes.h:200
TMatrix _pairwiseCombs
Definition: ttneutralgenes.h:302
Interface for all trait types, declares all basic trait operations.
Definition: ttrait.h:45
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:223
TProtoNeutralGenes * _FHLinkedTrait
Definition: filehandler.h:222
void fatal(const char *str,...)
Definition: output.cc:99
int error(const char *str,...)
Definition: output.cc:78
void message(const char *message,...)
Definition: output.cc:39
sex_t
Sex types, males are always 0 and females 1!!
Definition: types.h:35
@ FEM
Definition: types.h:36
@ MAL
Definition: types.h:36
@ ADLTx
Definition: types.h:41
TMatrix nChooseKVec(int n, int k)
Definition: utils.cc:197