41 #include "../Likelihood/DRTreeLikelihoodTools.h" 42 #include "../Likelihood/MarginalAncestralStateReconstruction.h" 44 #include <Bpp/Text/TextTools.h> 45 #include <Bpp/App/ApplicationTools.h> 46 #include <Bpp/Numeric/Matrix/MatrixTools.h> 47 #include <Bpp/Numeric/DataTable.h> 60 const vector<int>& nodeIds,
62 bool verbose)
throw (Exception)
65 if (!drtl.isInitialized())
66 throw Exception(
"RewardMappingTools::computeRewardVectors(). Likelihood object is not initialized.");
71 const SiteContainer* sequences = drtl.getData();
72 const DiscreteDistribution* rDist = drtl.getRateDistribution();
74 size_t nbSites = sequences->getNumberOfSites();
75 size_t nbDistinctSites = drtl.getLikelihoodData()->getNumberOfDistinctSites();
76 size_t nbStates = sequences->getAlphabet()->getSize();
77 size_t nbClasses = rDist->getNumberOfCategories();
78 vector<const Node*> nodes = tree.
getNodes();
79 const vector<size_t>* rootPatternLinks
80 = &drtl.getLikelihoodData()->getRootArrayPositions();
82 size_t nbNodes = nodes.size();
89 drtl.computeLikelihoodAtNode(tree.getRootId(), lik);
90 Vdouble Lr(nbDistinctSites, 0);
91 Vdouble rcProbs = rDist->getProbabilities();
92 Vdouble rcRates = rDist->getCategories();
93 for (
size_t i = 0; i < nbDistinctSites; i++)
95 VVdouble* lik_i = &lik[i];
96 for (
size_t c = 0; c < nbClasses; c++)
98 Vdouble* lik_i_c = &(*lik_i)[c];
99 double rc = rDist->getProbability(c);
100 for (
size_t s = 0; s < nbStates; s++)
102 Lr[i] += (*lik_i_c)[s] * rc;
109 ApplicationTools::displayTask(
"Compute joint node-pairs likelihood",
true);
111 for (
size_t l = 0; l < nbNodes; ++l)
114 const Node* currentNode = nodes[l];
115 if (nodeIds.size() > 0 && !VectorTools::contains(nodeIds, currentNode->
getId()))
123 ApplicationTools::displayGauge(l, nbNodes - 1);
124 Vdouble rewardsForCurrentNode(nbDistinctSites);
127 VVVdouble likelihoodsFatherConstantPart(nbDistinctSites);
128 for (
size_t i = 0; i < nbDistinctSites; i++)
130 VVdouble* likelihoodsFatherConstantPart_i = &likelihoodsFatherConstantPart[i];
131 likelihoodsFatherConstantPart_i->resize(nbClasses);
132 for (
size_t c = 0; c < nbClasses; c++)
134 Vdouble* likelihoodsFatherConstantPart_i_c = &(*likelihoodsFatherConstantPart_i)[c];
135 likelihoodsFatherConstantPart_i_c->resize(nbStates);
136 double rc = rDist->getProbability(c);
137 for (
size_t s = 0; s < nbStates; s++)
141 (*likelihoodsFatherConstantPart_i_c)[s] = rc;
148 for (
size_t n = 0; n < nbSons; n++)
151 if (currentSon->
getId() != currentNode->
getId())
153 const VVVdouble* likelihoodsFather_son = &drtl.getLikelihoodData()->getLikelihoodArray(father->
getId(), currentSon->
getId());
156 auto_ptr<TreeLikelihood::ConstBranchModelIterator> mit(drtl.getNewBranchModelIterator(currentSon->
getId()));
164 while (sit->hasNext())
166 size_t i = sit->next();
170 pxy = drtl.getTransitionProbabilitiesPerRateClass(currentSon->
getId(), i);
173 const VVdouble* likelihoodsFather_son_i = &(*likelihoodsFather_son)[i];
174 VVdouble* likelihoodsFatherConstantPart_i = &likelihoodsFatherConstantPart[i];
175 for (
size_t c = 0; c < nbClasses; c++)
177 const Vdouble* likelihoodsFather_son_i_c = &(*likelihoodsFather_son_i)[c];
178 Vdouble* likelihoodsFatherConstantPart_i_c = &(*likelihoodsFatherConstantPart_i)[c];
179 VVdouble* pxy_c = &pxy[c];
180 for (
size_t x = 0; x < nbStates; x++)
182 Vdouble* pxy_c_x = &(*pxy_c)[x];
183 double likelihood = 0.;
184 for (
size_t y = 0; y < nbStates; y++)
186 likelihood += (*pxy_c_x)[y] * (*likelihoodsFather_son_i_c)[y];
188 (*likelihoodsFatherConstantPart_i_c)[x] *= likelihood;
198 const VVVdouble* likelihoodsFather_son = &drtl.getLikelihoodData()->getLikelihoodArray(father->
getId(), currentSon->
getId());
200 auto_ptr<TreeLikelihood::ConstBranchModelIterator> mit(drtl.getNewBranchModelIterator(father->
getId()));
208 while (sit->hasNext())
210 size_t i = sit->next();
214 pxy = drtl.getTransitionProbabilitiesPerRateClass(father->
getId(), i);
217 const VVdouble* likelihoodsFather_son_i = &(*likelihoodsFather_son)[i];
218 VVdouble* likelihoodsFatherConstantPart_i = &likelihoodsFatherConstantPart[i];
219 for (
size_t c = 0; c < nbClasses; c++)
221 const Vdouble* likelihoodsFather_son_i_c = &(*likelihoodsFather_son_i)[c];
222 Vdouble* likelihoodsFatherConstantPart_i_c = &(*likelihoodsFatherConstantPart_i)[c];
223 VVdouble* pxy_c = &pxy[c];
224 for (
size_t x = 0; x < nbStates; x++)
226 double likelihood = 0.;
227 for (
size_t y = 0; y < nbStates; y++)
229 Vdouble* pxy_c_x = &(*pxy_c)[y];
230 likelihood += (*pxy_c_x)[x] * (*likelihoodsFather_son_i_c)[y];
232 (*likelihoodsFatherConstantPart_i_c)[x] *= likelihood;
241 for (
size_t i = 0; i < nbDistinctSites; i++)
243 vector<double> freqs = drtl.getRootFrequencies(i);
244 VVdouble* likelihoodsFatherConstantPart_i = &likelihoodsFatherConstantPart[i];
245 for (
size_t c = 0; c < nbClasses; c++)
247 Vdouble* likelihoodsFatherConstantPart_i_c = &(*likelihoodsFatherConstantPart_i)[c];
248 for (
size_t x = 0; x < nbStates; x++)
250 (*likelihoodsFatherConstantPart_i_c)[x] *= freqs[x];
261 const VVVdouble* likelihoodsFather_node = &(drtl.getLikelihoodData()->getLikelihoodArray(father->
getId(), currentNode->
getId()));
262 auto_ptr<TreeLikelihood::ConstBranchModelIterator> mit(drtl.getNewBranchModelIterator(currentNode->
getId()));
268 reward.setSubstitutionModel(bmd->
getModel());
270 VVVdouble nxy(nbClasses);
271 for (
size_t c = 0; c < nbClasses; ++c)
273 VVdouble* nxy_c = &nxy[c];
274 double rc = rcRates[c];
275 Matrix<double>* nij = reward.getAllRewards(d * rc);
276 nxy_c->resize(nbStates);
277 for (
size_t x = 0; x < nbStates; ++x)
279 Vdouble* nxy_c_x = &(*nxy_c)[x];
280 nxy_c_x->resize(nbStates);
281 for (
size_t y = 0; y < nbStates; ++y)
283 (*nxy_c_x)[y] = (*nij)(x, y);
292 while (sit->hasNext())
294 size_t i = sit->next();
298 pxy = drtl.getTransitionProbabilitiesPerRateClass(currentNode->
getId(), i);
301 const VVdouble* likelihoodsFather_node_i = &(*likelihoodsFather_node)[i];
302 VVdouble* likelihoodsFatherConstantPart_i = &likelihoodsFatherConstantPart[i];
303 for (
size_t c = 0; c < nbClasses; ++c)
305 const Vdouble* likelihoodsFather_node_i_c = &(*likelihoodsFather_node_i)[c];
306 Vdouble* likelihoodsFatherConstantPart_i_c = &(*likelihoodsFatherConstantPart_i)[c];
307 const VVdouble* pxy_c = &pxy[c];
308 VVdouble* nxy_c = &nxy[c];
309 for (
size_t x = 0; x < nbStates; ++x)
311 double* likelihoodsFatherConstantPart_i_c_x = &(*likelihoodsFatherConstantPart_i_c)[x];
312 const Vdouble* pxy_c_x = &(*pxy_c)[x];
313 for (
size_t y = 0; y < nbStates; ++y)
315 double likelihood_cxy = (*likelihoodsFatherConstantPart_i_c_x)
317 * (*likelihoodsFather_node_i_c)[y];
320 rewardsForCurrentNode[i] += likelihood_cxy * (*nxy_c)[x][y];
334 for (
size_t i = 0; i < nbSites; ++i)
336 (*rewards)(l, i) = rewardsForCurrentNode[(*rootPatternLinks)[i]] / Lr[(*rootPatternLinks)[i]];
341 if (ApplicationTools::message)
342 *ApplicationTools::message <<
" ";
343 ApplicationTools::displayTaskDone();
352 const SiteContainer& sites,
357 throw IOException(
"RewardMappingTools::writeToFile. Can't write to stream.");
360 for (
size_t i = 0; i < rewards.getNumberOfSites(); i++)
362 out <<
"\tSite" << sites.getSite(i).getPosition();
366 for (
size_t j = 0; j < rewards.getNumberOfBranches(); j++)
368 out << rewards.getNode(j)->getId() <<
"\t" << rewards.getNode(j)->getDistanceToFather();
369 for (
size_t i = 0; i < rewards.getNumberOfSites(); i++)
371 out <<
"\t" << rewards(j, i);
384 DataTable* data = DataTable::read(in,
"\t",
true, -1);
385 vector<string> ids = data->getColumn(0);
386 data->deleteColumn(0);
387 data->deleteColumn(0);
389 size_t nbSites = data->getNumberOfColumns();
390 rewards.setNumberOfSites(nbSites);
391 size_t nbBranches = data->getNumberOfRows();
392 for (
size_t i = 0; i < nbBranches; i++)
394 int id = TextTools::toInt(ids[i]);
395 size_t br = rewards.getNodeIndex(
id);
396 for (
size_t j = 0; j < nbSites; j++)
398 rewards(br, j) = TextTools::toDouble((*data)(i, j));
402 for (
size_t i = 0; i < nbSites; i++)
404 string siteTxt = data->getColumnName(i);
406 if (siteTxt.substr(0, 4) ==
"Site")
407 site = TextTools::to<int>(siteTxt.substr(4));
409 site = TextTools::to<int>(siteTxt);
410 rewards.setSitePosition(i, site);
417 throw IOException(
string(
"Bad input file. ") + e.what());
427 for (
size_t i = 0; i < nbSites; ++i)
429 v += smap(branchIndex, i);
440 for (
size_t i = 0; i < nbBranches; ++i)
442 v += smap(i, siteIndex);
A pair of SubstitutionModel / SiteIterator.
virtual const SubstitutionModel * getModel() const =0
virtual SiteIterator * getNewSiteIterator() const =0
virtual const Node * getSon(size_t pos) const
The phylogenetic tree class.
General interface for storing reward mapping data.
virtual const Node * getFather() const
Get the father of this node is there is one.
virtual size_t getNumberOfBranches() const =0
virtual bool hasFather() const
Tell if this node has a father node.
virtual double getDistanceToFather() const
Get the distance to the father node is there is one, otherwise throw a NodeException.
virtual int getId() const
Get the node's id.
virtual ConstBranchModelDescription * next()=0
The phylogenetic node class.
Data storage class for probabilistic rewards mappings.
virtual size_t getNumberOfSons() const
Interface for double-recursive (DR) implementation of the likelihood computation. ...
virtual size_t getNumberOfSites() const =0
virtual bool hasNext() const =0
virtual std::vector< const N * > getNodes() const