bool gth_intermediate_output_is_correct(char *outputfilename, GthSACollection *orig_sa_collection, GthInput *input, GtFile **outfp, GtError *err) { SACollectionData sa_collection_data; GthSACollection *read_sa_collection; GtFileMode file_mode; bool rval; #ifndef NDEBUG GtUword numofgenomicfiles, numofreferencefiles; #endif gt_error_check(err); gt_assert(outputfilename); gt_assert(*outfp); #ifndef NDEBUG numofgenomicfiles = gth_input_num_of_gen_files(input); numofreferencefiles = gth_input_num_of_ref_files(input); #endif /* init */ read_sa_collection = gth_sa_collection_new(GTH_DC_NONE); sa_collection_data.sa_collection = read_sa_collection; sa_collection_data.sa_filter = NULL; sa_collection_data.stat = NULL; /* store file mode */ file_mode = gt_file_mode(*outfp); /* close output file */ gt_file_delete(*outfp); /* open intermediate file again for reading */ *outfp = gt_file_xopen_file_mode(file_mode, outputfilename, "r"); gt_assert(*outfp); /* read in the intermediate output */ if (gt_parse_intermediate_output(input, store_in_sa_collection, &sa_collection_data, outputfilename, *outfp, err)) { fprintf(stderr, "error: %s\n", gt_error_get(err)); exit(EXIT_FAILURE); } /* array of genomic files did not grow */ gt_assert(numofgenomicfiles == gth_input_num_of_gen_files(input)); /* array of reference files did not grow */ gt_assert(numofreferencefiles == gth_input_num_of_ref_files(input)); /* compare the trees */ rval = gth_sa_collections_are_equal(orig_sa_collection, read_sa_collection); /* free */ gth_sa_collection_delete(read_sa_collection); return rval; }
static int determine_outfp(void *data, GtError *err) { GtOutputFileInfo *ofi = (GtOutputFileInfo*) data; GtFileMode file_mode; int had_err = 0; gt_error_check(err); gt_assert(ofi); if (!gt_str_length(ofi->output_filename)) *ofi->outfp = NULL; /* no output file given -> use stdout */ else { /* outputfile given -> create generic file pointer */ gt_assert(!(ofi->gzip && ofi->bzip2)); if (ofi->gzip) file_mode = GT_FILE_MODE_GZIP; else if (ofi->bzip2) file_mode = GT_FILE_MODE_BZIP2; else file_mode = GT_FILE_MODE_UNCOMPRESSED; if (file_mode != GT_FILE_MODE_UNCOMPRESSED && strcmp(gt_str_get(ofi->output_filename) + gt_str_length(ofi->output_filename) - strlen(gt_file_mode_suffix(file_mode)), gt_file_mode_suffix(file_mode))) { gt_warning("output file '%s' doesn't have correct suffix '%s', appending " "it", gt_str_get(ofi->output_filename), gt_file_mode_suffix(file_mode)); gt_str_append_cstr(ofi->output_filename, gt_file_mode_suffix(file_mode)); } if (!ofi->force && gt_file_exists(gt_str_get(ofi->output_filename))) { gt_error_set(err, "file \"%s\" exists already, use option -%s to " "overwrite", gt_str_get(ofi->output_filename), GT_FORCE_OPT_CSTR); had_err = -1; } if (!had_err) { *ofi->outfp = gt_file_xopen_file_mode(file_mode, gt_str_get(ofi->output_filename), "w"); gt_assert(*ofi->outfp); } } return had_err; }
static int store_in_subset_file(void *data, GthSA *sa, const char *outputfilename, GtError *err) { Store_in_subset_file_data *store_in_subset_file_data = (Store_in_subset_file_data*) data; double split_determing_percentage = 0.0; unsigned long filenum; char filenamesuffix[4]; int had_err = 0; gt_error_check(err); /* filter before we do any further processing */ if (gth_sa_filter_filter_sa(store_in_subset_file_data->sa_filter, sa)) { /* and free it afterwards */ gth_sa_delete(sa); /* discard */ return 0; } /* check whether we got a new output file to process */ if (!store_in_subset_file_data->current_outputfilename) { store_in_subset_file_data->current_outputfilename = gt_cstr_dup(outputfilename); } else if (strcmp(store_in_subset_file_data->current_outputfilename, outputfilename)) { /* close current output files */ close_output_files(store_in_subset_file_data); gt_free(store_in_subset_file_data->current_outputfilename); } /* determine in which file the current sa needs to be put */ switch (store_in_subset_file_data->gthsplitinfo->splitmode) { case ALIGNMENTSCORE_SPLIT: split_determing_percentage = gth_sa_score(sa); strcpy(filenamesuffix, "scr"); break; case COVERAGE_SPLIT: split_determing_percentage = gth_sa_coverage(sa); strcpy(filenamesuffix, "cov"); break; default: gt_assert(0); } gt_assert(split_determing_percentage >= 0.0); /* XXX: change into an assertion when coverage problem is fixed */ if (split_determing_percentage > 1.0) split_determing_percentage = 1.0; if (split_determing_percentage == 1.0) filenum = store_in_subset_file_data->num_of_subset_files - 1; else { filenum = floor(split_determing_percentage * 100.0 / store_in_subset_file_data->gthsplitinfo->range); } gt_assert(filenum < store_in_subset_file_data->num_of_subset_files); /* make sure the file exists and is open */ if (!store_in_subset_file_data->subset_files[filenum]) { gt_assert(store_in_subset_file_data->subset_filenames[filenum] == NULL); store_in_subset_file_data->subset_filenames[filenum] = gt_str_new(); gt_str_append_cstr_nt(store_in_subset_file_data->subset_filenames[filenum], outputfilename, gt_file_basename_length(outputfilename)); gt_str_append_char(store_in_subset_file_data->subset_filenames[filenum], '.'); gt_str_append_cstr(store_in_subset_file_data->subset_filenames[filenum], filenamesuffix); gt_str_append_ulong(store_in_subset_file_data->subset_filenames[filenum], filenum * store_in_subset_file_data->gthsplitinfo->range); gt_str_append_char(store_in_subset_file_data->subset_filenames[filenum], '-'); gt_str_append_ulong(store_in_subset_file_data->subset_filenames[filenum], (filenum + 1) * store_in_subset_file_data->gthsplitinfo->range); gt_str_append_cstr(store_in_subset_file_data->subset_filenames[filenum], gt_file_mode_suffix(store_in_subset_file_data ->gthsplitinfo->file_mode)); /* if not disabled by -force, check if file already exists */ if (!store_in_subset_file_data->gthsplitinfo->force) { store_in_subset_file_data->subset_files[filenum] = gt_file_open(store_in_subset_file_data->gthsplitinfo->file_mode, gt_str_get(store_in_subset_file_data ->subset_filenames[filenum]), "r", NULL); if (store_in_subset_file_data->subset_files[filenum]) { gt_error_set(err, "file \"%s\" exists already. use option -%s to " "overwrite", gt_str_get(store_in_subset_file_data ->subset_filenames[filenum]), GT_FORCE_OPT_CSTR); had_err = -1; } } if (!had_err) { /* open split file for writing */ store_in_subset_file_data->subset_files[filenum] = gt_file_xopen_file_mode(store_in_subset_file_data->gthsplitinfo ->file_mode, gt_str_get(store_in_subset_file_data ->subset_filenames[filenum]), "w"); /* store XML header in file */ gth_xml_show_leader(true, store_in_subset_file_data->subset_files[filenum]); } } /* put it there */ if (!had_err) { gth_xml_inter_sa_visitor_set_outfp(store_in_subset_file_data->sa_visitor, store_in_subset_file_data ->subset_files[filenum]); gth_sa_visitor_visit_sa(store_in_subset_file_data->sa_visitor, sa); } /* adjust counter */ if (!had_err) store_in_subset_file_data->subset_file_sa_counter[filenum]++; /* and free it afterwards */ gth_sa_delete(sa); return had_err; }
GtFile* gt_file_xopen(const char *path, const char *mode) { gt_assert(mode); return gt_file_xopen_file_mode(gt_file_mode_determine(path), path, mode); }