]> git.donarmstrong.com Git - mothur.git/blob - uchime_src/getparents.cpp
changes while testing
[mothur.git] / uchime_src / getparents.cpp
1 #include "myutils.h"\r
2 #include "chime.h"\r
3 #include "ultra.h"\r
4 #include <set>\r
5 \r
6 void AddTargets(Ultra &U, const SeqData &Query, set<unsigned> &TargetIndexes);\r
7 \r
8 void GetChunkInfo(unsigned L, unsigned &Length, vector<unsigned> &Los)\r
9         {\r
10         Los.clear();\r
11 \r
12         if (L <= opt_minchunk)\r
13                 {\r
14                 Length = L;\r
15                 Los.push_back(0);\r
16                 return;\r
17                 }\r
18 \r
19         Length = (L - 1)/opt_chunks + 1;\r
20         if (Length < opt_minchunk)\r
21                 Length = opt_minchunk;\r
22 \r
23         unsigned Lo = 0;\r
24         for (;;)\r
25                 {\r
26                 if (Lo + Length >= L)\r
27                         {\r
28                         Lo = L - Length - 1;\r
29                         Los.push_back(Lo);\r
30                         return;\r
31                         }\r
32                 Los.push_back(Lo);\r
33                 Lo += Length;\r
34                 }\r
35         }\r
36 \r
37 void GetCandidateParents(Ultra &U, const SeqData &QSD, float AbQ,\r
38   vector<unsigned> &Parents)\r
39         {\r
40         Parents.clear();\r
41 \r
42         set<unsigned> TargetIndexes;\r
43 \r
44         unsigned QL = QSD.L;\r
45 \r
46         SeqData QuerySD = QSD;\r
47 \r
48         unsigned ChunkLength;\r
49         vector<unsigned> ChunkLos;\r
50         GetChunkInfo(QL, ChunkLength, ChunkLos);\r
51         unsigned ChunkCount = SIZE(ChunkLos);\r
52         for (unsigned ChunkIndex = 0; ChunkIndex < ChunkCount; ++ChunkIndex)\r
53                 {\r
54                 unsigned Lo = ChunkLos[ChunkIndex];\r
55                 asserta(Lo + ChunkLength <= QL);\r
56 \r
57                 const byte *Chunk = QSD.Seq + Lo;\r
58 \r
59         // THIS MESSES UP --self!!\r
60                 //char Prefix[32];\r
61                 //sprintf(Prefix, "%u|", Lo);\r
62                 //string ChunkLabel = string(Prefix) + string(QSD.Label);\r
63 \r
64                 //QuerySD.Label = ChunkLabel.c_str();\r
65                 QuerySD.Seq = Chunk;\r
66                 QuerySD.L = ChunkLength;\r
67 \r
68                 AddTargets(U, QuerySD, TargetIndexes);\r
69 \r
70                 Lo += ChunkLength;\r
71                 }\r
72 \r
73         for (set<unsigned>::const_iterator p = TargetIndexes.begin();\r
74           p != TargetIndexes.end(); ++p)\r
75                 {\r
76                 unsigned TargetIndex = *p;\r
77                 bool Accept = true;\r
78                 if (AbQ > 0.0f)\r
79                         {\r
80                         const char *TargetLabel = U.GetSeedLabel(TargetIndex);\r
81                         float AbT = GetAbFromLabel(string(TargetLabel));\r
82                         if (AbT > 0.0f && AbT < opt_abskew*AbQ)\r
83                                 Accept = false;\r
84                         }\r
85 \r
86                 if (Accept)\r
87                         Parents.push_back(TargetIndex);\r
88                 }\r
89         }\r