/* 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; }