20 #include <unordered_map>
25 #include <boost/regex.hpp>
55 template<
typename TBackend>
81 f_.readStart(FASTA_file);
98 chunk_offset_ += data_fg_.size();
99 data_fg_.swap(data_bg_);
101 return !data_fg_.empty();
113 data_bg_.reserve(suggested_size);
115 for (
int i = 0; i < suggested_size; ++i)
117 std::streampos spos = f_.position();
118 if (!f_.readNext(p))
break;
119 data_bg_.push_back(std::move(p));
120 offsets_.push_back(spos);
122 return !data_bg_.empty();
128 return data_fg_.size();
140 return data_fg_[pos];
159 if (chunk_offset_ <= pos && pos < chunk_offset_ + chunkSize())
161 protein = data_fg_[pos - chunk_offset_];
165 if (pos >= offsets_.size())
169 std::streampos spos = f_.position();
170 if (!f_.setPosition(offsets_[pos]))
return false;
171 bool r = f_.readNext(protein);
172 f_.setPosition(spos);
179 return f_.atEnd() && offsets_.empty();
189 f_.readStart(filename_);
200 return offsets_.size();
246 if (!activate_count_)
285 protein = data_[pos];
292 return data_.empty();
309 const std::vector<FASTAFile::FASTAEntry>&
data_;
310 int activate_count_ = 0;
311 int cache_count_ = 0;
339 std::unordered_map<std::string, std::pair<Size, Size>>
decoy_count;
356 inline static const std::vector<std::string>
affixes = {
"decoy",
"dec",
"reverse",
"rev",
"reversed",
"__id_decoy",
"xxx",
"shuffled",
"shuffle",
"pseudo",
"random" };
359 inline static const std::string
regexstr_prefix = std::string(
"^(") + ListUtils::concatenate<std::string>(
affixes,
"_*|") +
"_*)";
360 inline static const std::string
regexstr_suffix = std::string(
"(_") + ListUtils::concatenate<std::string>(
affixes,
"*|_") +
")$";
378 OPENMS_LOG_DEBUG << a.first <<
"\t" << a.second.first <<
"\t" << a.second.second << std::endl;
385 OPENMS_LOG_ERROR <<
"Unable to determine decoy string (not enough occurrences; <40%)!" << std::endl;
386 return {
false,
"?",
true};
391 OPENMS_LOG_ERROR <<
"Unable to determine decoy string (prefix and suffix occur equally often)!" << std::endl;
392 return {
false,
"?",
true};
398 const std::string & case_insensitive_decoy_string = pair.first;
399 const std::pair<Size, Size>& prefix_suffix_counts = pair.second;
400 double freq_prefix =
static_cast<double>(prefix_suffix_counts.first) /
static_cast<double>(decoy_stats.
all_prefix_occur);
401 double freq_prefix_in_proteins =
static_cast<double>(prefix_suffix_counts.first) /
static_cast<double>(decoy_stats.
all_proteins_count);
403 if (freq_prefix >= 0.8 && freq_prefix_in_proteins >= 0.4)
407 OPENMS_LOG_WARN <<
"More than one decoy prefix observed!" << std::endl;
408 OPENMS_LOG_WARN <<
"Using most frequent decoy prefix (" << (int)(freq_prefix * 100) <<
"%)" << std::endl;
418 const std::string& case_insensitive_decoy_string = pair.first;
419 const std::pair<Size, Size>& prefix_suffix_counts = pair.second;
420 double freq_suffix =
static_cast<double>(prefix_suffix_counts.second) /
static_cast<double>(decoy_stats.
all_suffix_occur);
421 double freq_suffix_in_proteins =
static_cast<double>(prefix_suffix_counts.second) /
static_cast<double>(decoy_stats.
all_proteins_count);
423 if (freq_suffix >= 0.8 && freq_suffix_in_proteins >= 0.4)
427 OPENMS_LOG_WARN <<
"More than one decoy suffix observed!" << std::endl;
428 OPENMS_LOG_WARN <<
"Using most frequent decoy suffix (" << (int)(freq_suffix * 100) <<
"%)" << std::endl;
435 OPENMS_LOG_ERROR <<
"Unable to determine decoy string and its position. Please provide a decoy string and its position as parameters." << std::endl;
436 return {
false,
"?",
true};
457 constexpr
size_t PROTEIN_CACHE_SIZE = 4e5;
461 proteins.cacheChunk(PROTEIN_CACHE_SIZE);
462 if (!proteins.activateCache())
break;
464 auto prot_count = (
SignedSize)proteins.chunkSize();
470 String seq = proteins.chunkAt(i).identifier;
476 bool found_prefix = boost::regex_search(seq_lower, sm, pattern_prefix);
479 std::string match = sm[0];
491 bool found_suffix = boost::regex_search(seq_lower, sm, pattern_suffix);
494 std::string match = sm[0];
#define OPENMS_LOG_DEBUG
Macro for general debugging information.
Definition: LogStream.h:454
#define OPENMS_LOG_WARN
Macro if a warning, a piece of information which should be read by the user, should be logged.
Definition: LogStream.h:444
#define OPENMS_LOG_ERROR
Macro to be used if non-fatal error are reported (processing continues)
Definition: LogStream.h:439
Helper class for calculations on decoy proteins.
Definition: FASTAContainer.h:318
std::unordered_map< std::string, std::pair< Size, Size > > DecoyStringToAffixCount
Definition: FASTAContainer.h:510
std::unordered_map< std::string, std::string > CaseInsensitiveToCaseSensitiveDecoy
Definition: FASTAContainer.h:511
static Result findDecoyString(FASTAContainer< T > &proteins)
Heuristic to determine the decoy string given a set of protein names.
Definition: FASTAContainer.h:370
static const std::string regexstr_prefix
Definition: FASTAContainer.h:359
static DecoyStatistics countDecoys(FASTAContainer< T > &proteins)
Function to count the occurrences of decoy strings in a given set of protein names.
Definition: FASTAContainer.h:446
static const std::vector< std::string > affixes
Definition: FASTAContainer.h:356
static const std::string regexstr_suffix
Definition: FASTAContainer.h:360
Int overflow exception.
Definition: Exception.h:221
std::vector< FASTAFile::FASTAEntry > data_bg_
prefetched (background) data; will become the next active data
Definition: FASTAContainer.h:207
bool readAt(FASTAFile::FASTAEntry &protein, size_t pos)
Retrieve a FASTA entry at global position pos (must not be behind the currently active chunk,...
Definition: FASTAContainer.h:156
std::string filename_
FASTA file name.
Definition: FASTAContainer.h:209
size_t size() const
NOT the number of entries in the FASTA file, but merely the number of already read entries (since we ...
Definition: FASTAContainer.h:198
bool empty()
is the FASTA file empty?
Definition: FASTAContainer.h:177
std::vector< std::streampos > offsets_
internal byte offsets into FASTA file for random access reading of previous entries.
Definition: FASTAContainer.h:205
bool activateCache()
Swaps in the background cache of entries, read previously via cacheChunk()
Definition: FASTAContainer.h:96
FASTAContainer(const String &FASTA_file)
C'tor with FASTA filename.
Definition: FASTAContainer.h:73
size_t chunk_offset_
number of entries before the current chunk
Definition: FASTAContainer.h:208
bool cacheChunk(int suggested_size)
Prefetch a new cache in the background, with up to suggested_size entries (or fewer upon reaching end...
Definition: FASTAContainer.h:110
FASTAFile f_
FASTA file connection.
Definition: FASTAContainer.h:204
std::vector< FASTAFile::FASTAEntry > data_fg_
active (foreground) data
Definition: FASTAContainer.h:206
size_t chunkSize() const
number of entries in active cache
Definition: FASTAContainer.h:126
void reset()
resets reading of the FASTA file, enables fresh reading of the FASTA from the beginning
Definition: FASTAContainer.h:183
const FASTAFile::FASTAEntry & chunkAt(size_t pos) const
Retrieve a FASTA entry at cache position pos (fast)
Definition: FASTAContainer.h:138
size_t getChunkOffset() const
how many entries were read and got swapped out already
Definition: FASTAContainer.h:85
FASTAContainer(const std::vector< FASTAFile::FASTAEntry > &data)
C'tor for already existing data (by reference).
Definition: FASTAContainer.h:229
size_t size() const
calls size() on underlying vector
Definition: FASTAContainer.h:296
bool readAt(FASTAFile::FASTAEntry &protein, size_t pos) const
fast access to an entry
Definition: FASTAContainer.h:283
bool empty() const
calls empty() on underlying vector
Definition: FASTAContainer.h:290
bool cacheChunk(int)
no-op (since data is already fully available as vector)
Definition: FASTAContainer.h:257
bool activateCache()
no-op (since data is already fully available as vector)
Definition: FASTAContainer.h:244
const std::vector< FASTAFile::FASTAEntry > & data_
reference to existing data
Definition: FASTAContainer.h:309
size_t chunkSize() const
active data spans the full range, i.e. size of container
Definition: FASTAContainer.h:271
void reset()
required for template parameters!
Definition: FASTAContainer.h:302
const FASTAFile::FASTAEntry & chunkAt(size_t pos) const
fast access to chunked (i.e. all) entries
Definition: FASTAContainer.h:277
size_t getChunkOffset() const
always 0, since this specialization requires/supports no chunking
Definition: FASTAContainer.h:235
This class serves for reading in and writing FASTA files If the protein/gene sequence contains unusua...
Definition: FASTAFile.h:35
A more convenient string class.
Definition: String.h:34
String & toLower()
Converts the string to lowercase.
ptrdiff_t SignedSize
Signed Size type e.g. used as pointer difference.
Definition: Types.h:108
size_t Size
Size type e.g. used as variable which can hold result of size()
Definition: Types.h:101
static String suffix(const String &this_s, size_t length)
Definition: StringUtilsSimple.h:131
static String prefix(const String &this_s, size_t length)
Definition: StringUtilsSimple.h:122
Main OpenMS namespace.
Definition: FeatureDeconvolution.h:22
template parameter for vector-based FASTA access
Definition: FASTAContainer.h:56
struct for intermediate results needed for calculations on decoy proteins
Definition: FASTAContainer.h:338
std::unordered_map< std::string, std::pair< Size, Size > > decoy_count
map decoys to counts of occurrences as prefix/suffix
Definition: FASTAContainer.h:339
Size all_proteins_count
number of all checked proteins
Definition: FASTAContainer.h:343
Size all_suffix_occur
number of proteins with found decoy_suffix
Definition: FASTAContainer.h:342
std::unordered_map< std::string, std::string > decoy_case_sensitive
map case insensitive strings back to original case (as used in fasta)
Definition: FASTAContainer.h:340
Size all_prefix_occur
number of proteins with found decoy_prefix
Definition: FASTAContainer.h:341
bool operator==(const DecoyStatistics &rhs) const
Definition: FASTAContainer.h:345
Definition: FASTAContainer.h:321
bool operator==(const Result &rhs) const
Definition: FASTAContainer.h:326
bool is_prefix
on success, was it a prefix or suffix
Definition: FASTAContainer.h:324
bool success
did more than 40% of proteins have the *same* prefix or suffix
Definition: FASTAContainer.h:322
String name
on success, what was the decoy string?
Definition: FASTAContainer.h:323
FASTA entry type (identifier, description and sequence) The first String corresponds to the identifie...
Definition: FASTAFile.h:46