/*****************************************************************************/ // Copyright (c) Illumina 2008 // Author: Richard Shaw // // This software is covered by the "Illumina Genome Analyzer Software // License Agreement" and the "Illumina Source Code License Agreement", // and certain third party copyright/licenses, and any user of this // source file is bound by the terms therein (see accompanying files // Illumina_Genome_Analyzer_Software_License_Agreement.pdf and // Illumina_Source_Code_License_Agreement.pdf and third party // copyright/license notices). /*****************************************************************************/ #include #include #include #include "common/Tile_List.h" /*****************************************************************************/ Tile_List::Tile_List(const std::string& tile_list_file_path_str) : my_tile_list_file_path_str(tile_list_file_path_str), my_list_is_loaded(false) { if (!my_list_is_loaded) { if (!load()) { std::cerr << "ERROR: Failed to read tile list from " << my_tile_list_file_path_str << "." << std::endl; } } } /*****************************************************************************/ Tile_List::~Tile_List() { ; } /*****************************************************************************/ bool insert_read_num(std::string& tile_name, const std::string& read_str) { if (read_str.empty()) { return true; } std::string::size_type pos(tile_name.find_first_of("_")); if (pos == std::string::npos) { return false; } if ((pos = tile_name.find_first_of("_", (pos + 1))) == std::string::npos) { return false; } tile_name.replace(pos, 0, std::string("_") + read_str); return true; } /*****************************************************************************/ bool Tile_List::find_tiles(const std::string& search_prefix_str, Tile_Name_List& tile_name_list, const std::string& suffix_to_append_str, const std::string& read_str, const std::string& path_to_prepend_str) { const unsigned int search_prefix_str_len(search_prefix_str.length()); tile_name_list.clear(); for (Tile_Name_List_CIter tile_name_citer(my_full_tile_name_list.begin()); tile_name_citer != my_full_tile_name_list.end(); ++tile_name_citer) { std::string tile_name(*tile_name_citer); if (tile_name.compare(0, search_prefix_str_len, search_prefix_str) == 0) { // Tile names are read in the format s_L_TTTT. // If a read number is required, the format is s_L_R_TTTT[suffix]. insert_read_num(tile_name, read_str); if (!path_to_prepend_str.empty()) { tile_name = path_to_prepend_str + "/" + tile_name; } tile_name_list.push_back(tile_name + suffix_to_append_str); } } return true; } /*****************************************************************************/ bool Tile_List::load() { FILE* file_hndl = fopen(my_tile_list_file_path_str.c_str(), "r"); if (!file_hndl) { std::cerr << "ERROR: Failed to open " << my_tile_list_file_path_str << "." << std::endl; return false; } const unsigned int max_tile_name_len(16); // 8 chars + null + wiggle room char cstr[max_tile_name_len]; int scan_ret(0); while ((scan_ret = fscanf(file_hndl, "%15s", cstr)) == 1) { my_full_tile_name_list.push_back(cstr); } if (scan_ret == EOF) { my_list_is_loaded = true; std::cerr << "INFO: Reading tile list from " << my_tile_list_file_path_str << "." << std::endl; } else { std::cerr << "ERROR: Failure while reading tile list from " << my_tile_list_file_path_str << "." << std::endl; } fclose(file_hndl); return (scan_ret == EOF); } /*****************************************************************************/