source: branches/stable/CONSENSUS_TREE/CT_ctree.hxx

Last change on this file was 18634, checked in by westram, 3 years ago
  • Property svn:eol-style set to native
  • Property svn:keywords set to Author Date Id Revision
File size: 3.9 KB
Line 
1// ============================================================= //
2//                                                               //
3//   File      : CT_ctree.hxx                                    //
4//   Purpose   : interface to consensus tree calculation         //
5//                                                               //
6//   Institute of Microbiology (Technical University Munich)     //
7//   http://www.arb-home.de/                                     //
8//                                                               //
9// ============================================================= //
10
11#ifndef CT_CTREE_HXX
12#define CT_CTREE_HXX
13
14#ifndef CT_COMMON_HXX
15#include <CT_common.hxx>
16#endif
17#ifndef ARBTOOLS_H
18#include <arbtools.h>
19#endif
20#ifndef ARBDBT_H
21#include <arbdbt.h>
22#endif
23#ifndef _GLIBCXX_STRING
24#include <string>
25#endif
26
27struct NT_NODE;
28class  RB_INFO;
29
30// -----------------------
31//      ConsensusTree
32//
33// (Note: used directly from DIST/DI_matr.cxx)
34
35class ConsensusTree : public SpeciesSpace, public DeconstructedTree { // derived from Noncopyable
36    struct RB_INFO *rbtree(const NT_NODE *tree, TreeRoot *root);
37    SizeAwareTree  *rb_gettree(const NT_NODE *tree);
38
39public:
40    ConsensusTree(const CharPtrArray& names_);
41
42    __ATTR__USERESULT GB_ERROR insert_tree_weighted(const TreeNode *tree, int leafs, double weight, bool provideProgress);
43
44    SizeAwareTree *get_consensus_tree(GB_ERROR& error);
45};
46
47// ------------------------------
48//      ConsensusTreeBuilder
49
50class ConsensusTreeBuilder : public TreeContainer {
51    // wrapper for ConsensusTree
52    // - automatically collects species occurring in added trees (has to be done by caller of ConsensusTree)
53    // - uses much more memory than using ConsensusTree directly, since it stores all added trees
54    //
55    // Not helpful for consensing thousands of trees like bootstrapping does
56
57    typedef std::vector<double> Weights;
58
59    Weights weights;
60
61public:
62    void add(SizeAwareTree*& tree, const char *treename, double weight) {
63        tree->get_tree_root()->find_innermost_edge().set_root(); // only wanted when building consensus tree
64
65        // (currently) reordering trees before deconstructing no longer
66        // affects the resulting consense tree (as performed as unit tests).
67        //
68        // tree->reorder_tree(BIG_BRANCHES_TO_TOP);
69        // tree->reorder_tree(BIG_BRANCHES_TO_BOTTOM);
70        // tree->reorder_tree(BIG_BRANCHES_TO_EDGE);
71
72        TreeContainer::add(tree, treename);
73        weights.push_back(weight);
74    }
75
76    SizeAwareTree *get(size_t& different_species, GB_ERROR& error) {
77        arb_assert(!error);
78
79        ConstStrArray species_names;
80        get_species_names(species_names);
81
82        different_species = get_species_count();
83        ConsensusTree ctree(species_names);
84        {
85            arb_progress deconstruct("deconstructing", get_tree_count());
86
87            for (size_t i = 0; i<get_tree_count() && !error; ++i) {
88                const TreeInfo&      treeInfo = get_tree_info(i);
89                const SizeAwareTree *tree     = get_tree(i);
90
91                error = ctree.insert_tree_weighted(tree, treeInfo.species_count(), weights[i], true);
92                ++deconstruct;
93                if (error) {
94                    error = GBS_global_string("Failed to deconstruct '%s' (Reason: %s)", treeInfo.name(), error);
95                }
96                else {
97                    error = deconstruct.error_if_aborted();
98                }
99            }
100            if (error) deconstruct.done();
101        }
102
103        if (error) return NULp;
104
105#if defined(DEBUG)
106        // if class ConsensusTree does depend on any local data,
107        // instanciating another instance will interfere:
108        ConsensusTree influence(species_names);
109#endif
110
111        arb_progress reconstruct("reconstructing");
112        return ctree.get_consensus_tree(error);
113    }
114
115    char *get_tree_remark() const;
116};
117
118
119#else
120#error CT_ctree.hxx included twice
121#endif // CT_CTREE_HXX
Note: See TracBrowser for help on using the repository browser.