28 using coord_type = Space;
29 using individual_type = Individual;
30 using locus_ID_type =
typename individual_type::locus_ID_type;
31 using value_type =
typename individual_type::allele_type::value_type;
34 : m_loci(extract_loci(data)), m_locations(localize(data)), m_dictionnary(data)
40 void add(coord_type
const &x, Individual
const &ind)
48 assert(ind.loci() == m_loci);
50 m_dictionnary[x].push_back(ind);
51 m_locations.insert(x);
54 void add(Individual
const &ind, coord_type
const &x)
59 auto size(coord_type
const &x)
const
61 assert(m_dictionnary.count(x) > 0);
62 return m_dictionnary.at(x).size();
67 unsigned int size = 0;
68 for (
auto const &it : m_dictionnary)
69 size += it.second.size();
77 std::map<coord_type, std::vector<individual_type>> new_dico;
78 std::set<coord_type> new_sites;
80 for (
auto const &it : m_dictionnary)
82 auto x = projection.reproject_to_centroid(it.first);
83 new_dico.insert(std::make_pair(x, it.second));
87 new_dico.swap(m_dictionnary);
88 new_sites.swap(m_locations);
92 std::set<coord_type>
const &get_sampling_points()
const
97 std::set<typename individual_type::locus_ID_type>
const &loci()
const
102 std::vector<individual_type>
const &individuals_at(coord_type
const &x)
const
104 return m_dictionnary.at(x);
108 auto nb_gene_copies_discarding_NA(locus_ID_type
const &locus)
const
110 std::map<coord_type, std::map<value_type, unsigned int>> counts;
111 for (
auto const &x : get_sampling_points())
113 for (
auto const &individual : individuals_at(x))
115 auto alleles = individual.alleles(locus);
117 if (alleles.first.get_allelic_state() > 0)
119 counts[x][alleles.first.get_allelic_state()] += 1;
122 if (alleles.second.get_allelic_state() > 0)
124 counts[x][alleles.second.get_allelic_state()] += 1;
131 unsigned int allelic_richness(locus_ID_type
const &locus)
const
133 std::set<value_type> set;
134 auto freq = frequencies_discarding_NA(locus);
135 for (
auto const &it1 : freq)
137 for (
auto const &it2 : it1.second)
139 set.insert(it2.first);
145 auto frequencies_discarding_NA(locus_ID_type
const &locus)
const
148 std::map<coord_type, std::map<value_type, double>> freq;
150 auto counts = nb_gene_copies_discarding_NA(locus);
152 auto get = [](
auto const &a,
auto const &b) {
return b.second; };
154 for (
auto const &it1 : counts)
156 double sum = std::accumulate(it1.second.begin(), it1.second.end(), 0.0, get);
159 for (
auto const &it2 : it1.second)
161 freq[it1.first][it2.first] =
static_cast<double>(it2.second) / sum;
170 for (
auto const &it : dt.m_dictionnary)
172 os << it.first <<
"\t" << it.second.size() <<
"\n";
178 std::set<typename individual_type::locus_ID_type> m_loci;
179 std::set<coord_type> m_locations;
180 std::map<coord_type, std::vector<individual_type>> m_dictionnary;
182 template <
typename T> std::set<coord_type> localize(T
const &data)
const
184 std::set<coord_type> locations;
185 for (
auto const &it : data)
187 locations.insert(it.first);
192 std::set<typename individual_type::locus_ID_type> extract_loci(
193 std::map<coord_type, std::vector<individual_type>>
const &data)
const
195 std::set<typename individual_type::locus_ID_type> loci = data.cbegin()->second.front().loci();
196 assert(!loci.empty());
197 for (
auto const &it1 : data)
199 assert(!it1.second.empty());
200 for (
auto const &it2 : it1.second)
202 assert(it2.loci() == loci);