/*********************************************************************** * Read and set the alphabet from a parsed XML document. ***********************************************************************/ ALPH_T read_alphabet_from_xml(xmlXPathContextPtr xpath_ctxt) { ALPH_T alph; xmlXPathObjectPtr xpathObj = NULL; xmlChar* property = NULL; xpathObj = xpath_query(xpath_ctxt, "//*/alphabet"); property = read_xml_node_property( xpathObj->nodesetval->nodeTab[0], "length" ); int alph_size = atoi((char *) property); xmlFree(property); xmlXPathFreeObject(xpathObj); xpathObj = xpath_query(xpath_ctxt, "//*/alphabet/letter"); // The stated size of the alphabet had better match the // number of letter elements in the alphabet. assert(alph_size == xpathObj->nodesetval->nodeNr); char* buffer = mm_calloc(sizeof(char), alph_size + 1); int i = 0; xmlNodePtr currLetterNode = NULL; for (i = 0; i < alph_size; i++) { currLetterNode = xpathObj->nodesetval->nodeTab[i]; if (currLetterNode == NULL) { die("Error: missing letter %d in alphabet.\n", i); } // Get the letter symbol attribute property = read_xml_node_property(currLetterNode, "symbol"); buffer[i] = *property; xmlFree(property); } buffer[i] = 0; alph = alph_type(buffer, alph_size+1); myfree(buffer); xmlXPathFreeObject(xpathObj); return alph; }
/* * plib_name name of prior library file * desired_beta > 0, scale \beta_{i,j} so * \sum_{i=0}^L \lambda_i \sum_{j=1}^20 \beta_{i,j} * has this value * == 0, don't scale prior * < 0, just get alphabet */ PriorLib *read_PriorLib(char *plib_name, double desired_beta, ALPH_T *custom_alph) { int i,j, line=0; int l; PriorLib *temp; char input[MAXS], foo[MAXS], alphabet[MAXALPH+1], checkstr[81], *token; double x; FILE *fp; ALPH_T *alph; // tlb fp = fopen(plib_name, "r"); if (!fp) { fprintf(stderr, "Can't find prior library %s\n", plib_name); exit(1); } token = "Alphabet="; line++; test_value(fscanf(fp,"%s %s\n", checkstr, alphabet) == 2); if (strcmp(checkstr, token)) { fprintf(stderr, "Line %d of prior library file \n %s \n" "should start with \"%s\" " "but it starts with \"%s\".\n", line, plib_name, token, checkstr); exit(1); } // determine alphabet if (custom_alph == NULL) { alph = alph_type(alphabet, 30); if (alph == NULL) { fprintf(stderr, "The partial alphabet specified in the prior library file" " does not match a built-in alphabet and no complete alphabet was specified.\n"); exit(1); } } else { int alen_core; alen_core = strlen(alphabet); i = 0; if (alen_core == alph_size_core(custom_alph)) { for (i = 0; i < alen_core; i++) { if (!alph_is_concrete(custom_alph, alphabet[i])) break; } } if (i == 0 || i < alen_core) { fprintf(stderr, "The partial alphabet specified in the prior library file" " does not match the complete alphabet specified.\n"); exit(1); } alph = alph_hold(custom_alph); } token = "NumDistr="; line++; test_value(fscanf(fp,"%s %d\n", checkstr, &l) == 2); if (strcmp(checkstr, token)) { fprintf(stderr, "Line %d of prior library file \n %s \n" "should start with \"%s\" " "but it starts with \"%s\"\n.", line, plib_name, token, checkstr); exit(1); } temp = alloc_PriorLib(l, alph); if (desired_beta < 0) { fclose(fp); return(temp); } for (i = 0; i < temp->L; i++) { // Get rid of number= ignore_value(fscanf(fp,"%*s %*s\n")); // Mixture ignore_value(fscanf(fp,"%*s")); test_value(fscanf(fp,"%lf\n", &x) == 1); temp->Mix[i] = x; // B (strength) ignore_value(fscanf(fp,"%*s")); test_value(fscanf(fp,"%lf\n", &x) == 1); temp->B[i] = x; // Alpha temp->Distr[i][0] = temp->B[i]; ignore_value(fscanf(fp,"%*s")); for (j = 1; j < alph_size_wild(alph); j++) { test_value(fscanf(fp,"%lg", &x) == 1); temp->Distr[i][j] = x * temp->B[i]; } // FullUpdate ignore_value(fscanf(fp,"%*s")); test_value(fscanf(fp,"%d\n", &(temp->FullUpdate[i])) == 1); // QUpdate ignore_value(fscanf(fp,"%*s")); test_value(fscanf(fp,"%d\n", &(temp->QUpdate[i])) == 1); // StructID test_value(fgets(input, MAXS, fp) != NULL); test_value(sscanf(input,"%s",foo) == 1); input[strlen(input)-1] = '\0'; strcpy( (temp->StructID[i]), (input + strlen(foo)) ); // Comments test_value(fgets(input, MAXS, fp) != NULL); test_value(sscanf(input,"%s",foo) == 1); strcpy( (temp->Comment[i]), (input + strlen(foo)) ); } // tlb; scale beta to desired value if (desired_beta > 0) { int i, j; double beta = 0; double scale; for (i=0; i<temp->L; i++) { beta += temp->Mix[i] * temp->B[i]; } /*printf("beta = %10.6f\n", beta);*/ scale = desired_beta/beta; for (i=0; i<temp->L; i++) { for (j=0; j < alph_size_wild(alph); j++) { temp->Distr[i][j] *= scale; } } } fclose(fp); alph_release(alph); return(temp); }