1 | // ================================================================= // |
---|
2 | // // |
---|
3 | // File : consensus.h // |
---|
4 | // Purpose : interface for consensus calculation // |
---|
5 | // // |
---|
6 | // Coded by Ralf Westram (coder@reallysoft.de) in September 2015 // |
---|
7 | // http://www.arb-home.de/ // |
---|
8 | // // |
---|
9 | // ================================================================= // |
---|
10 | |
---|
11 | #ifndef CONSENSUS_H |
---|
12 | #define CONSENSUS_H |
---|
13 | |
---|
14 | #ifndef AW_BASE_HXX |
---|
15 | #include <aw_base.hxx> |
---|
16 | #endif |
---|
17 | #ifndef _GLIBCXX_ALGORITHM |
---|
18 | #include <algorithm> |
---|
19 | #endif |
---|
20 | |
---|
21 | #define CAS_INTERNAL -1 |
---|
22 | #define CAS_NTREE 1 |
---|
23 | #define CAS_EDIT4 2 |
---|
24 | |
---|
25 | #ifndef CONSENSUS_AWAR_SOURCE |
---|
26 | # error you need to define CONSENSUS_AWAR_SOURCE before including consensus.h (allowed values: CAS_NTREE, CAS_EDIT4) |
---|
27 | #endif |
---|
28 | |
---|
29 | struct ConsensusBuildParams { |
---|
30 | bool countgaps; // count gaps? (otherwise they are completely ignored) |
---|
31 | int gapbound; // limit in % for gaps. If more gaps occur -> '-' |
---|
32 | bool group; // whether to group characters (NUC: using ambiguous IUPAC codes; AMINO: using amino groups) |
---|
33 | int considbound; // limit in %. Bases occurring that often are used to create ambiguity codes (other bases are ignored). gaps are ignored when checking this limit. |
---|
34 | int upper; // limit in %. If explicit base (or ambiguity code) occurs that often -> use upper case character |
---|
35 | int lower; // limit in %. If explicit base (or ambiguity code) occurs that often -> use lower case character. Otherwise use '.' |
---|
36 | |
---|
37 | static void force_in_range(int low, int& val, int high) { |
---|
38 | val = std::min(std::max(low, val), high); |
---|
39 | } |
---|
40 | |
---|
41 | void make_valid() { |
---|
42 | force_in_range(0, gapbound, 100); |
---|
43 | force_in_range(0, considbound, 100); |
---|
44 | force_in_range(0, upper, 100); |
---|
45 | force_in_range(0, lower, 100); |
---|
46 | } |
---|
47 | |
---|
48 | #if (CONSENSUS_AWAR_SOURCE == CAS_NTREE) |
---|
49 | ConsensusBuildParams(AW_root *awr) |
---|
50 | : countgaps (awr->awar(AWAR_CONSENSUS_COUNTGAPS)->read_int()), |
---|
51 | gapbound (awr->awar(AWAR_CONSENSUS_GAPBOUND)->read_int()), |
---|
52 | group (awr->awar(AWAR_CONSENSUS_GROUP)->read_int()), |
---|
53 | considbound(awr->awar(AWAR_CONSENSUS_CONSIDBOUND)->read_int()), |
---|
54 | upper (awr->awar(AWAR_CONSENSUS_UPPER)->read_int()), |
---|
55 | lower (awr->awar(AWAR_CONSENSUS_LOWER)->read_int()) |
---|
56 | { |
---|
57 | make_valid(); |
---|
58 | } |
---|
59 | #else |
---|
60 | # if (CONSENSUS_AWAR_SOURCE == CAS_EDIT4) |
---|
61 | ConsensusBuildParams(AW_root *awr) |
---|
62 | : countgaps (awr->awar(ED4_AWAR_CONSENSUS_COUNTGAPS)->read_int()), |
---|
63 | gapbound (awr->awar(ED4_AWAR_CONSENSUS_GAPBOUND)->read_int()), |
---|
64 | group (awr->awar(ED4_AWAR_CONSENSUS_GROUP)->read_int()), |
---|
65 | considbound(awr->awar(ED4_AWAR_CONSENSUS_CONSIDBOUND)->read_int()), |
---|
66 | upper (awr->awar(ED4_AWAR_CONSENSUS_UPPER)->read_int()), |
---|
67 | lower (awr->awar(ED4_AWAR_CONSENSUS_LOWER)->read_int()) |
---|
68 | { |
---|
69 | make_valid(); |
---|
70 | } |
---|
71 | # else |
---|
72 | # if (CONSENSUS_AWAR_SOURCE == CAS_INTERNAL) |
---|
73 | ConsensusBuildParams(AW_root *awr); // produce link error if used |
---|
74 | # else |
---|
75 | # error CONSENSUS_AWAR_SOURCE has invalid value |
---|
76 | # endif |
---|
77 | # endif |
---|
78 | #endif |
---|
79 | |
---|
80 | #if defined(UNIT_TESTS) // UT_DIFF |
---|
81 | ConsensusBuildParams() // uses defaults of EDIT4 awars |
---|
82 | : countgaps(true), |
---|
83 | gapbound(60), |
---|
84 | group(1), |
---|
85 | considbound(30), |
---|
86 | upper(95), |
---|
87 | lower(70) |
---|
88 | { |
---|
89 | make_valid(); |
---|
90 | } |
---|
91 | #endif |
---|
92 | }; |
---|
93 | |
---|
94 | #else |
---|
95 | #error consensus.h included twice |
---|
96 | #endif // CONSENSUS_H |
---|