static stList *readMatching(FILE *fileHandle, stList *originalEdges) { /* * Reads the matching created by Blossum. */ stHash *originalEdgesHash = putEdgesInHash(originalEdges); char *line = stFile_getLineFromFile(fileHandle); assert(line != NULL); int64_t nodeNumber, edgeNumber; int64_t i = sscanf(line, "%" PRIi64 " %" PRIi64 "\n", &nodeNumber, &edgeNumber); assert(i == 2); free(line); stList *chosenEdges = stList_construct(); for(int64_t j=0; j<edgeNumber; j++) { line = stFile_getLineFromFile(fileHandle); int64_t node1, node2; i = sscanf(line, "%" PRIi64 " %" PRIi64 "", &node1, &node2); assert(i == 2); free(line); assert(node1 >= 0); assert(node1 < nodeNumber); assert(node2 >= 0); assert(node2 < nodeNumber); stIntTuple *edge = constructEdge(node1, node2); stIntTuple *originalEdge = stHash_search(originalEdgesHash, edge); if(originalEdge != NULL) { stList_append(chosenEdges, originalEdge); } stIntTuple_destruct(edge); } stHash_destruct(originalEdgesHash); return chosenEdges; }
Hmm *hmm_loadFromFile(const char *fileName) { FILE *fH = fopen(fileName, "r"); char *string = stFile_getLineFromFile(fH); stList *tokens = stString_split(string); if (stList_length(tokens) < 2) { st_errAbort("Got an empty line in the input state machine file %s\n", fileName); } int type; int64_t j = sscanf(stList_get(tokens, 0), "%i", &type); if (j != 1) { st_errAbort("Failed to parse state number (int) from string: %s\n", string); } Hmm *hmm = hmm_constructEmpty(0.0, type); if (stList_length(tokens) != hmm->stateNumber * hmm->stateNumber + 2) { st_errAbort( "Got the wrong number of transitions in the input state machine file %s, got %" PRIi64 " instead of %" PRIi64 "\n", fileName, stList_length(tokens), hmm->stateNumber * hmm->stateNumber + 2); } for (int64_t i = 0; i < hmm->stateNumber * hmm->stateNumber; i++) { j = sscanf(stList_get(tokens, i + 1), "%lf", &(hmm->transitions[i])); if (j != 1) { st_errAbort("Failed to parse transition prob (float) from string: %s\n", string); } } j = sscanf(stList_get(tokens, stList_length(tokens) - 1), "%lf", &(hmm->likelihood)); if (j != 1) { st_errAbort("Failed to parse likelihood (float) from string: %s\n", string); } //Cleanup transitions line free(string); stList_destruct(tokens); //Now parse the emissions line string = stFile_getLineFromFile(fH); tokens = stString_split(string); if (stList_length(tokens) != hmm->stateNumber * SYMBOL_NUMBER_NO_N * SYMBOL_NUMBER_NO_N) { st_errAbort( "Got the wrong number of emissions in the input state machine file %s, got %" PRIi64 " instead of %" PRIi64 "\n", fileName, stList_length(tokens), hmm->stateNumber * SYMBOL_NUMBER_NO_N * SYMBOL_NUMBER_NO_N); } for (int64_t i = 0; i < hmm->stateNumber * SYMBOL_NUMBER_NO_N * SYMBOL_NUMBER_NO_N; i++) { j = sscanf(stList_get(tokens, i), "%lf", &(hmm->emissions[i])); if (j != 1) { st_errAbort("Failed to parse emission prob (float) from string: %s\n", string); } } //Final cleanup free(string); stList_destruct(tokens); fclose(fH); return hmm; }
stList *lineTokensFromFile(const char *filePath, int64_t getLine) { FILE *fH = fopen(filePath, "r"); int64_t lineCount = 1; stList *tokens; char *string = stFile_getLineFromFile(fH); while (string != NULL) { string = stFile_getLineFromFile(fH); if (lineCount == getLine) { tokens = stString_split(string); return tokens; } else { lineCount++; free(string); } } fclose(fH); return stList_construct3(0, &free); }
stSortedSet *loadEndAlignmentFromDisk(Flower *flower, FILE *fileHandle, End **end) { stSortedSet *endAlignment = stSortedSet_construct3((int (*)(const void *, const void *))alignedPair_cmpFn, (void (*)(void *))alignedPair_destruct); char *line = stFile_getLineFromFile(fileHandle); if(line == NULL) { *end = NULL; return NULL; } Name flowerName; int64_t lineNumber; int64_t i = sscanf(line, "%" PRIi64 " %" PRIi64 "", &flowerName, &lineNumber); if(i != 2 || lineNumber < 0) { st_errAbort("We encountered a mis-specified name in loading the first line of an end alignment from the disk: '%s'\n", line); } free(line); *end = flower_getEnd(flower, flowerName); if(*end == NULL) { st_errAbort("We encountered an end name that is not in the database: '%s'\n", line); } for(int64_t i=0; i<lineNumber; i++) { line = stFile_getLineFromFile(fileHandle); if(line == NULL) { st_errAbort("Got a null line when parsing an end alignment\n"); } int64_t sI1, sI2; int64_t p1, st1, p2, st2, score1, score2; int64_t i = sscanf(line, "%" PRIi64 " %" PRIi64 " %" PRIi64 " %" PRIi64 " %" PRIi64 " %" PRIi64 " %" PRIi64 " %" PRIi64 "", &sI1, &p1, &st1, &score1, &sI2, &p2, &st2, &score2); (void)i; if(i != 8) { st_errAbort("We encountered a mis-specified name in loading an end alignment from the disk: '%s'\n", line); } stSortedSet_insert(endAlignment, alignedPair_construct(sI1, p1, st1, sI2, p2, st2, score1, score2)); free(line); } return endAlignment; }