/******************************************************************************
 * This function creates an instance of a data block reader UDT for reading
 * priors from a MEME PSP file.
 *****************************************************************************/
DATA_BLOCK_READER_T *new_prior_reader_from_psp(const char *filename) {
  PSP_DATA_BLOCK_READER_T *psp_reader = mm_malloc(sizeof(PSP_DATA_BLOCK_READER_T) * 1);
  psp_reader->at_start_of_line = TRUE;
  int filename_len = strlen(filename) + 1;
  psp_reader->filename = mm_malloc(sizeof(char)* filename_len);
  psp_reader->filename_len = filename_len;
  strncpy(psp_reader->filename, filename, filename_len);
  psp_reader->sequence_header = NULL;
  psp_reader->sequence_header_len = 0;
  psp_reader->psp_file = fopen(psp_reader->filename, "r");
  if (psp_reader->psp_file == NULL) {
    die(
      "Unable to open file: %s.\nError message: %s.\n", 
      psp_reader->filename, 
      strerror(errno)
    );
  }

  DATA_BLOCK_READER_T *reader = new_data_block_reader(
    (void *) psp_reader,
    free_prior_reader_from_psp,
    close_prior_reader_from_psp,
    reset_prior_reader_from_psp,
    get_next_data_block_from_prior_reader_from_psp,
    go_to_next_sequence_in_prior_reader_from_psp,
    get_seq_name_from_prior_reader_from_psp
  );
  return reader;
}
/******************************************************************************
 * This function creates an instance of a data block reader UDT for reading
 * priors from a wiggle file.
 *****************************************************************************/
DATA_BLOCK_READER_T *new_prior_reader_from_wig(
  const char *filename,
  double default_prior
) {

  WIGGLE_READER_T *raw_reader = new_wiggle_reader(filename);
  WIG_PRIOR_BLOCK_READER_T *wig_reader = mm_malloc(sizeof(WIG_PRIOR_BLOCK_READER_T) * 1);
  wig_reader->raw_reader = raw_reader;
  wig_reader->current_position = 0;
  wig_reader->default_prior = default_prior;
  wig_reader->sequence_name = NULL;

  // Setup "Virtual" function table
  DATA_BLOCK_READER_T *reader = new_data_block_reader(
    (void *) wig_reader,
    free_prior_reader_from_wig,
    close_prior_reader_from_wig,
    reset_prior_reader_from_wig,
    prior_reader_from_wig_is_eof,
    get_next_data_block_from_wig,
    unget_data_block_from_wig,
    go_to_next_sequence_in_wiggle_reader,
    get_seq_name_from_wig
  );

  return reader;
}
示例#3
0
/******************************************************************************
 * This function creates an instance of a data block reader UDT for reading
 * sequence segments from a FASTA file.
 *****************************************************************************/
DATA_BLOCK_READER_T *new_seq_reader_from_fasta(
  BOOLEAN_T parse_genomic_coord, 
  ALPH_T alph, 
  const char *filename
) {
  SEQ_READER_FROM_FASTA_T *fasta_reader = mm_malloc(sizeof(SEQ_READER_FROM_FASTA_T) * 1);
  fasta_reader->at_start_of_line = TRUE;
  fasta_reader->parse_genomic_coord = parse_genomic_coord;
  int filename_len = strlen(filename) + 1;
  fasta_reader->filename = mm_malloc(sizeof(char)* filename_len);
  fasta_reader->filename_len = filename_len;
  strncpy(fasta_reader->filename, filename, filename_len);
  fasta_reader->current_position = 0;
  fasta_reader->sequence_header = NULL;
  fasta_reader->sequence_header_len = 0;
  fasta_reader->sequence_name = NULL;
  fasta_reader->sequence_name_len = 0;
  fasta_reader->alphabet = alph;
  if (
    open_file(
      filename, 
      "r", 
      TRUE, 
      "FASTA", 
      "sequences", 
      &(fasta_reader->fasta_file
    )) == FALSE) {
    die("Couldn't open the file %s.\n", filename);
  }

  DATA_BLOCK_READER_T *reader = new_data_block_reader(
    (void *) fasta_reader,
    free_seq_reader_from_fasta,
    close_seq_reader_from_fasta,
    reset_seq_reader_from_fasta,
    seq_reader_from_fasta_is_eof,
    get_next_data_block_from_seq_reader_from_fasta,
    go_to_next_sequence_in_seq_reader_from_fasta,
    get_seq_name_from_seq_reader_from_fasta
  );
  return reader;
}