X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=uchime_src%2Fgetparents.cpp;fp=uchime_src%2Fgetparents.cpp;h=d82f9028b25f1ff9c37f8ec100970df5d687c511;hb=7dab6ac3ae5a5f1ce37dca8cfacaa719881fd5b2;hp=0000000000000000000000000000000000000000;hpb=aa23898d895a8c04cc4582a8809343df0aef6622;p=mothur.git diff --git a/uchime_src/getparents.cpp b/uchime_src/getparents.cpp new file mode 100644 index 0000000..d82f902 --- /dev/null +++ b/uchime_src/getparents.cpp @@ -0,0 +1,89 @@ +#include "myutils.h" +#include "chime.h" +#include "ultra.h" +#include + +void AddTargets(Ultra &U, const SeqData &Query, set &TargetIndexes); + +void GetChunkInfo(unsigned L, unsigned &Length, vector &Los) + { + Los.clear(); + + if (L <= opt_minchunk) + { + Length = L; + Los.push_back(0); + return; + } + + Length = (L - 1)/opt_chunks + 1; + if (Length < opt_minchunk) + Length = opt_minchunk; + + unsigned Lo = 0; + for (;;) + { + if (Lo + Length >= L) + { + Lo = L - Length - 1; + Los.push_back(Lo); + return; + } + Los.push_back(Lo); + Lo += Length; + } + } + +void GetCandidateParents(Ultra &U, const SeqData &QSD, float AbQ, + vector &Parents) + { + Parents.clear(); + + set TargetIndexes; + + unsigned QL = QSD.L; + + SeqData QuerySD = QSD; + + unsigned ChunkLength; + vector ChunkLos; + GetChunkInfo(QL, ChunkLength, ChunkLos); + unsigned ChunkCount = SIZE(ChunkLos); + for (unsigned ChunkIndex = 0; ChunkIndex < ChunkCount; ++ChunkIndex) + { + unsigned Lo = ChunkLos[ChunkIndex]; + asserta(Lo + ChunkLength <= QL); + + const byte *Chunk = QSD.Seq + Lo; + + // THIS MESSES UP --self!! + //char Prefix[32]; + //sprintf(Prefix, "%u|", Lo); + //string ChunkLabel = string(Prefix) + string(QSD.Label); + + //QuerySD.Label = ChunkLabel.c_str(); + QuerySD.Seq = Chunk; + QuerySD.L = ChunkLength; + + AddTargets(U, QuerySD, TargetIndexes); + + Lo += ChunkLength; + } + + for (set::const_iterator p = TargetIndexes.begin(); + p != TargetIndexes.end(); ++p) + { + unsigned TargetIndex = *p; + bool Accept = true; + if (AbQ > 0.0f) + { + const char *TargetLabel = U.GetSeedLabel(TargetIndex); + float AbT = GetAbFromLabel(string(TargetLabel)); + if (AbT > 0.0f && AbT < opt_abskew*AbQ) + Accept = false; + } + + if (Accept) + Parents.push_back(TargetIndex); + } + }