Commit c9515835 authored by Li's avatar Li
Browse files

Allow gzipped barcode whitelist file.

parent 00303c67
Loading
Loading
Loading
Loading
+88 −47
Original line number Diff line number Diff line
@@ -321,6 +321,46 @@ uint32_t Chromap::SampleInputBarcodesAndExamineLength() {
void Chromap::LoadBarcodeWhitelist() {
  double real_start_time = GetRealTime();
  int num_barcodes = 0;

  if (1) {
    gzFile barcode_whitelist_file = 
      gzopen(mapping_parameters_.barcode_whitelist_file_path.c_str(), "r"); 
    char barcode[256];

    while (gzgets(barcode_whitelist_file, barcode, sizeof(barcode)) != NULL) {
      size_t barcode_length = strlen(barcode);
      if (barcode[barcode_length - 1] == '\n') {
        barcode[barcode_length - 1] = '\0';
        --barcode_length;
      }
      if (barcode_length > 32) {
        ExitWithMessage("ERROR: barcode length is greater than 32!");
      }

      if (barcode_length != barcode_length_) {
        if (num_barcodes == 0) {
          ExitWithMessage(
              "ERROR: whitelist and input barcode lengths are not equal!");
        } else {
          ExitWithMessage(
              "ERROR: barcode lengths are not equal in the whitelist!");
        }
      }
      
      uint64_t barcode_key = GenerateSeedFromSequence(
          barcode, barcode_length, 0, barcode_length);
      
      int khash_return_code;
      khiter_t barcode_whitelist_lookup_table_iterator =
        kh_put(k64_seq, barcode_whitelist_lookup_table_, barcode_key,
            &khash_return_code);
      kh_value(barcode_whitelist_lookup_table_,
          barcode_whitelist_lookup_table_iterator) = 0;
      assert(khash_return_code != -1 && khash_return_code != 0);
      ++num_barcodes;
    }
    gzclose(barcode_whitelist_file);
  } else { 
    std::ifstream barcode_whitelist_file_stream(
        mapping_parameters_.barcode_whitelist_file_path);
    std::string barcode_whitelist_file_line;
@@ -374,6 +414,7 @@ void Chromap::LoadBarcodeWhitelist() {
      ++num_barcodes;
    }
    barcode_whitelist_file_stream.close();
  }
  std::cerr << "Loaded " << num_barcodes << " barcodes in "
            << GetRealTime() - real_start_time << "s.\n";
}