int main(int argc, char **argv) { ESL_GETOPTS *go = p7_CreateDefaultApp(options, 1, argc, argv, banner, usage); ESL_STOPWATCH *w = esl_stopwatch_Create(); char *hmmfile = esl_opt_GetArg(go, 1); P7_HMMCACHE *hcache = NULL; char errbuf[eslERRBUFSIZE]; size_t tot_mem; int status; esl_stopwatch_Start(w); status = p7_hmmcache_Open(hmmfile, &hcache, errbuf); if (status == eslENOTFOUND) p7_Fail("Failed to read %s\n %s\n", hmmfile, errbuf); else if (status == eslEFORMAT) p7_Fail("Failed to parse %s\n %s\n", hmmfile, errbuf); else if (status == eslEINCOMPAT) p7_Fail("Mixed profile types in %s\n %s\n", hmmfile, errbuf); else if (status != eslOK) p7_Fail("Failed to cache %s: error code %d\n", hmmfile, status); p7_hmmcache_SetNumericNames(hcache); tot_mem = p7_hmmcache_Sizeof(hcache); esl_stopwatch_Stop(w); esl_stopwatch_Display(stdout, w, "# CPU time: "); printf("models = %d\n", hcache->n); printf("tot memory = %" PRIu64 "\n", (uint64_t) tot_mem); p7_hmmcache_Close(hcache); esl_getopts_Destroy(go); esl_stopwatch_Destroy(w); return 0; }
static void process_InitCmd(HMMD_COMMAND *cmd, WORKER_ENV *env) { char *p; int n; int status; if (env->hmm_db != NULL) p7_hmmcache_Close(env->hmm_db); if (env->seq_db != NULL) p7_seqcache_Close(env->seq_db); env->hmm_db = NULL; env->seq_db = NULL; /* load the sequence database */ if (cmd->init.db_cnt != 0) { P7_SEQCACHE *sdb = NULL; p = cmd->init.data + cmd->init.seqdb_off; status = p7_seqcache_Open(p, &sdb, NULL); if (status != eslOK) { p7_syslog(LOG_ERR,"[%s:%d] - p7_seqcache_Open %s error %d\n", __FILE__, __LINE__, p, status); LOG_FATAL_MSG("cache seqdb error", status); } /* validate the sequence database */ cmd->init.sid[MAX_INIT_DESC-1] = 0; if (strcmp (cmd->init.sid, sdb->id) != 0 || cmd->init.db_cnt != sdb->db_cnt || cmd->init.seq_cnt != sdb->count) { p7_syslog(LOG_ERR,"[%s:%d] - seq db %s: integrity error %s - %s\n", __FILE__, __LINE__, p, cmd->init.sid, sdb->id); LOG_FATAL_MSG("database integrity error", 0); } env->seq_db = sdb; } /* load the hmm database */ if (cmd->init.hmm_cnt != 0) { P7_HMMCACHE *hcache = NULL; p = cmd->init.data + cmd->init.hmmdb_off; status = p7_hmmcache_Open(p, &hcache, NULL); if (status != eslOK) { p7_syslog(LOG_ERR,"[%s:%d] - p7_hmmcache_Open %s error %d\n", __FILE__, __LINE__, p, status); LOG_FATAL_MSG("cache hmmdb error", status); } if ( (status = p7_hmmcache_SetNumericNames(hcache)) != eslOK){ p7_syslog(LOG_ERR,"[%s:%d] - p7_hmmcache_SetNumericNames %s error %d\n", __FILE__, __LINE__, p, status); LOG_FATAL_MSG("cache hmmdb error", status); } /* validate the hmm database */ cmd->init.hid[MAX_INIT_DESC-1] = 0; /* TODO: come up with a new pressed format with an id to compare - strcmp (cmd->init.hid, hdb->id) != 0 */ if (cmd->init.hmm_cnt != 1 || cmd->init.model_cnt != hcache->n) { p7_syslog(LOG_ERR,"[%s:%d] - hmm db %s: integrity error\n", __FILE__, __LINE__, p); LOG_FATAL_MSG("database integrity error", 0); } env->hmm_db = hcache; printf("Loaded profile db %s; models: %d memory: %" PRId64 "\n", p, hcache->n, (uint64_t) p7_hmmcache_Sizeof(hcache)); } /* if stdout is redirected at the commandline, it causes printf's to be buffered, * which means status logging isn't printed. This line strongly requests unbuffering, * which should be ok, given the low stdout load of hmmpgmd */ setvbuf (stdout, NULL, _IONBF, BUFSIZ); printf("Data loaded into memory. Worker is ready.\n"); setvbuf (stdout, NULL, _IOFBF, BUFSIZ); /* write back to the master that we are on line */ n = MSG_SIZE(cmd); cmd->hdr.status = eslOK; if (writen(env->fd, cmd, n) != n) { LOG_FATAL_MSG("write error", errno); } }