Exemplo n.º 1
0
/*
  signal handler with SA_SIGINFO - redirects to registered signals
*/
static void signal_handler_info(int signum, siginfo_t *info, void *uctx)
{
	uint32_t count = sig_count(sig_state->signal_count[signum]);
	sig_state->sig_info[signum][count] = *info;

	signal_handler(signum);

	/* handle SA_SIGINFO */
	if (count+1 == SA_INFO_QUEUE_COUNT) {
		/* we've filled the info array - block this signal until
		   these ones are delivered */
		sigset_t set;
		sigemptyset(&set);
		sigaddset(&set, signum);
		sigprocmask(SIG_BLOCK, &set, NULL);
		SIG_INCREMENT(sig_state->sig_blocked[signum]);
	}
}
int main (int argc, char *argv[])
{
  argument_read(&argc, argv, args);//reading arguments
  if (filesmt == NULL || filesig == NULL || sigfmt == NULL || region_mode == NULL) usage();

  struct chr_block *chr_block_headsmt = NULL; //for summit
  struct chr_block *chr_block_headsig = NULL; //for signal
  struct chr_block *chr_block_headsig_d = NULL; //for signal of denominator

  struct chr_block *ch; //for "for loop of chr"
  struct output *output_head = NULL; //for output

  /*path, filename, and extension*/
  char path_smt[PATH_STR_LEN] = {0};
  char fn_smt[FILE_STR_LEN] = {0};
  char ext_smt[EXT_STR_LEN] = {0};
  char path_sig[PATH_STR_LEN] = {0};
  char fn_sig[FILE_STR_LEN] = {0};
  char ext_sig[EXT_STR_LEN] = {0};
  char path_sig_d[PATH_STR_LEN] = {0};
  char fn_sig_d[FILE_STR_LEN] = {0};
  char ext_sig_d[EXT_STR_LEN] = {0};
  char output_name[PATH_STR_LEN + FILE_STR_LEN + EXT_STR_LEN] = {0}; //output file name

  time_t timer;

  if(hf) strcpy(hfs, "on\0");
  if(nf) strcpy(nfs, "on\0");
  time(&timer);
  printf("Tool:                            %s\n\n\
Input file summit:               %s\n\
Input file signal:               %s\n\
Input file signal denominator:   %s\n\
signal format:                   %s\n\
region mode:                     %s\n\
summit col of chr, start, end:   %d, %d, %d\n\
summit col of summit:            %d\n\
summit col strand?:              %d\n\
half range:                      %d\n\
header flag:                     %s\n\
norm by length flag:             %s\n\
time:                            %s\n",\
 "ga_reads_region", filesmt, filesig, filesig_d, sigfmt, region_mode, col_chr, col_st, col_ed, col_st, col_strand, hw, hfs, nfs, ctime(&timer) );

  ga_parse_file_path (filesmt, path_smt, fn_smt, ext_smt); //parsing input file name into path, file name, and extension
  ga_parse_file_path (filesig, path_sig, fn_sig, ext_sig);

  ga_parse_chr_bs(filesmt, &chr_block_headsmt, col_chr, col_st, col_ed, col_strand, hf); //parsing each binding sites for each chromosome

  // reading signal file
  if (!strcmp(sigfmt, "bedgraph")) {
    ga_parse_bedgraph (filesig, &chr_block_headsig);
  } else if (!strcmp(sigfmt, "sepwiggz")) {
    ga_parse_sepwiggz (filesig, &chr_block_headsig);
  } else if (!strcmp(sigfmt, "onewiggz")) {
    ga_parse_onewiggz (filesig, &chr_block_headsig);
  } else {
    LOG("error: invalid signal file format.");
    goto err;
  }

  // sorting summit and sig
  chr_block_headsmt = ga_mergesort_chr(chr_block_headsmt);
  chr_block_headsig = ga_mergesort_chr(chr_block_headsig);

  for (ch = chr_block_headsmt; ch; ch = ch -> next) {
    ch -> bs_list = ga_mergesort_bs(ch -> bs_list);
  }
  for (ch = chr_block_headsig; ch; ch = ch -> next) {
    ch -> sig_list = ga_mergesort_sig(ch -> sig_list);
  }

  if (filesig_d) {//if denominator
    ga_parse_file_path (filesig_d, path_sig_d, fn_sig_d, ext_sig_d);

    if (!strcmp(sigfmt, "bedgraph")) {
      ga_parse_bedgraph (filesig_d, &chr_block_headsig_d);
    } else if (!strcmp(sigfmt, "sepwiggz")) {
      ga_parse_sepwiggz (filesig_d, &chr_block_headsig_d);
    } else if (!strcmp(sigfmt, "onewiggz")) {
      ga_parse_onewiggz (filesig_d, &chr_block_headsig_d);
    } else {
      LOG("error: invalid signal file format.");
      goto err;
    }

    chr_block_headsig_d = ga_mergesort_chr(chr_block_headsig_d); //sorting chr of sig
    for (ch = chr_block_headsig_d; ch; ch = ch -> next) {
      ch -> sig_list = ga_mergesort_sig(ch -> sig_list); //sorting sig
    }
  }

  if (sig_count (chr_block_headsmt, chr_block_headsig, chr_block_headsig_d, &output_head) != 0) {
    LOG("error: in sig_count function.");
    goto err;
  }

  if (filesig_d) { //if denominator
    if (!strcmp(region_mode, "region")) sprintf(output_name, "%s%s_around_%s_mode_%s_divided_%s.txt", path_sig, fn_sig, fn_smt, region_mode, fn_sig_d);
    else sprintf(output_name, "%s%s_around_%s_halfwid%d_mode_%s_divided_%s.txt", path_sig, fn_sig, fn_smt, hw, region_mode, fn_sig_d);
  } else {
    if (!strcmp(region_mode, "region")) sprintf(output_name, "%s%s_around_%s_mode_%s.txt", path_sig, fn_sig, fn_smt, region_mode);
    else sprintf(output_name, "%s%s_around_%s_halfwid%d_mode_%s.txt", path_sig, fn_sig, fn_smt, hw, region_mode);
  }

  if (ga_header_line != NULL) { //if header line
    if (add_one_val(ga_line_out, ga_header_line, "signal_region\n") < 0) {
      LOG("error: output line was too long.");
      goto err; //adding one extra column
    }
    ga_write_lines (output_name, output_head, ga_line_out); //note that header is line_out, not ga_header_line
  }
  else ga_write_lines (output_name, output_head, ga_header_line);

  goto rtfree;

rtfree:
  MYFREE (ga_header_line);
  if (chr_block_headsmt) ga_free_chr_block(&chr_block_headsmt);
  if (chr_block_headsig) ga_free_chr_block(&chr_block_headsig);
  if (chr_block_headsig_d) ga_free_chr_block(&chr_block_headsig_d);
  if (output_head) ga_free_output(&output_head);

  return 0;

err:
  MYFREE (ga_header_line);
  if (chr_block_headsmt) ga_free_chr_block(&chr_block_headsmt);
  if (chr_block_headsig) ga_free_chr_block(&chr_block_headsig);
  if (chr_block_headsig_d) ga_free_chr_block(&chr_block_headsig_d);
  if (output_head) ga_free_output(&output_head);
  return -1;
}