示例#1
0
void outputSelectedAlignments(std::vector<std::vector<Chain*>>& alignment_strings,
    Chain** queries, int32_t queries_length, const std::string& out_path) {

    std::string out_extension = ".aligned.fasta";

    for (uint32_t i = 0; i < alignment_strings.size(); ++i) {

        std::ofstream out_file;
        char* out_file_name = createFileName(chainGetName(queries[i]), out_path, out_extension);

        int query_len = chainGetLength(queries[i]);

        out_file.open(out_file_name);
        out_file << ">QUERY" << std::endl;

        for (int j = 1; j < query_len + 1; ++j) {
            out_file << chainGetChar(queries[i], j - 1);
            if (j % 60 == 0) out_file << std::endl;
        }
        out_file << std::endl;

        for (uint32_t j = 0; j < alignment_strings[i].size(); ++j) {
            out_file << ">" << chainGetName(alignment_strings[i][j]) << std::endl;

            for (int k = 1; k < query_len + 1; ++k) {
                out_file << chainGetChar(alignment_strings[i][j], k - 1);
                if (k % 60 == 0) out_file << std::endl;
            }
            out_file << std::endl;
        }

        out_file.close();
        delete[] out_file_name;
    }
}
示例#2
0
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;
}
示例#3
0
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;
}
示例#4
0
static void* extractThread(void* param) {

    ExtractContext* context = (ExtractContext*) param;
    
    DbAlignmentData** dbAlignmentData = context->dbAlignmentData;
    int* dbAlignmentLen = context->dbAlignmentLen;
    Chain* query = context->query;
    Chain** database = context->database;
    int databaseLen = context->databaseLen;
    int* scores = context->scores;
    int maxAlignments = context->maxAlignments;
    ValueFunction valueFunction = context->valueFunction;
    void* valueFunctionParam = context->valueFunctionParam;
    double valueThreshold = context->valueThreshold;
    int* cards = context->cards;
    int cardsLen = context->cardsLen;

    int i;
    
    size_t packedSize = databaseLen * sizeof(DbAlignmentData);
    DbAlignmentData* packed = (DbAlignmentData*) malloc(packedSize);
    double* values = (double*) malloc(databaseLen * sizeof(double));
    
    valueFunction(values, scores, query, database, databaseLen, 
        cards, cardsLen, valueFunctionParam);

    int thresholded = 0;
    for (i = 0; i < databaseLen; ++i) {
    
        packed[i].idx = i;
        packed[i].value = values[i];
        packed[i].score = scores[i];
        packed[i].name = chainGetName(database[i]);

        if (packed[i].value <= valueThreshold) {
            thresholded++;
        }
    }
        
    int k = MIN(thresholded, maxAlignments);
    qselect((void*) packed, databaseLen, sizeof(DbAlignmentData), k, dbAlignmentDataCmp);
    qsort((void*) packed, k, sizeof(DbAlignmentData), dbAlignmentDataCmp);

    *dbAlignmentData = (DbAlignmentData*) malloc(k * sizeof(DbAlignmentData));
    *dbAlignmentLen = k;

    for (i = 0; i < k; ++i) {
        (*dbAlignmentData)[i] = packed[i];
    }

    free(packed);
    free(values);

    return NULL;
}