void alignmentsExtract(std::vector<Chain*>& dst, Chain* query, DbAlignment** alignments, int alignments_length) { int query_len = chainGetLength(query); char* alignment_str = new char[query_len]; int query_start, length; Chain* target = nullptr; char* query_str = nullptr; char* target_str = nullptr; Alignment* alignment = nullptr; const char gap_item = '-'; for (int i = 0; i < alignments_length; ++i) { target = dbAlignmentGetTarget(alignments[i]); query_start = dbAlignmentGetQueryStart(alignments[i]); length = dbAlignmentGetPathLen(alignments[i]); alignment = dbAlignmentToAlignment(alignments[i]); aligmentStr(&query_str, &target_str, alignment, gap_item); alignmentDelete(alignment); int j = 0; for (; j < query_start; ++j) { alignment_str[j] = 'X'; } for (int k = 0; k < length; ++k) { if (query_str[k] != gap_item) { if (target_str[k] != gap_item) { alignment_str[j++] = target_str[k]; } else { alignment_str[j++] = 'X'; } } } for (; j < query_len; ++j) { alignment_str[j] = 'X'; } dst.push_back(chainCreate((char*) chainGetName(target), strlen(chainGetName(target)), alignment_str, query_len)); delete[] query_str; delete[] target_str; } delete[] alignment_str; }
static void* alignThread(void* param) { AlignContext* context = (AlignContext*) param; DbAlignment** dbAlignment = context->dbAlignment; int type = context->type; Chain* query = context->query; int queryIdx = context->queryIdx; Chain* target = context->target; int targetIdx = context->targetIdx; double value = context->value; int score = context->score; Scorer* scorer = context->scorer; int* cards = context->cards; int cardsLen = context->cardsLen; // align Alignment* alignment; alignScoredPair(&alignment, type, query, target, scorer, score, cards, cardsLen, NULL); // check scores int s1 = alignmentGetScore(alignment); int s2 = score; ASSERT(s1 == s2, "Scores don't match %d %d, (%s %s)", s1, s2, chainGetName(query), chainGetName(target)); // extract info int queryStart = alignmentGetQueryStart(alignment); int queryEnd = alignmentGetQueryEnd(alignment); int targetStart = alignmentGetTargetStart(alignment); int targetEnd = alignmentGetTargetEnd(alignment); int pathLen = alignmentGetPathLen(alignment); char* path = (char*) malloc(pathLen); alignmentCopyPath(alignment, path); alignmentDelete(alignment); // create db alignment *dbAlignment = dbAlignmentCreate(query, queryStart, queryEnd, queryIdx, target, targetStart, targetEnd, targetIdx, value, score, scorer, path, pathLen); return NULL; }