Skip to content
Commits on Source (13)
This diff is collapsed.
/* BaitFisher (version 1.2.7) a program for designing DNA target enrichment baits
* Copyright 2013-2016 by Christoph Mayer
/* BaitFisher (version 1.2.8) a program for designing DNA target enrichment baits
* BaitFilter (version 1.0.6) a program for selecting optimal bait regions
* Copyright 2013-2017 by Christoph Mayer
*
* This source file is part of the BaitFisher-package.
*
......@@ -25,16 +26,22 @@
*
*/
// Some parts of this header file could be made more efficient.
// Much of the functionalilty relys on a sorted list of Blast hits.
// Much of the functionality relies on a sorted list of Blast hits.
// The question arises whether a list is the best data structure for such
// a purpose. It could be more efficient to use a data sturcture such as
// a purpose. It could be more efficient to use a data structure such as
// a set, which is sorted automatically and which should in principle be
// more efficient.
// GI number will not be supported by NCBI in the future! So far we have not removed the code.
// This should be done soon.
#ifndef CBLASTPARSER_H
#define CBLASTPARSER_H
// The following two defines allow us to use fopen() in "CSeqNameList.h"
// without error message when using the Visual Studio 2015 compiler.
#define _CRT_SECURE_NO_DEPRECATE
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include "CFile/CFile2_1.h"
......@@ -48,6 +55,7 @@
#include "CHistogram.h"
#include "typedefs.h"
#include <climits>
class CTaxonomy;
class CBlastHit;
......@@ -63,7 +71,6 @@ bool less_than_CBlastHit_pointer_target(const CBlastHit *a, const CBlastHit *b);
signed char CB_is_gi_of_type(CTaxonomy *tax, unsigned gi, unsigned type);
//signed char
struct struct_less_than_CBlastHit_pointer_query_quality
{
......@@ -184,7 +191,7 @@ class CBlastHit
}
else
{
std::cerr << "Unrecognized line of input passed to CBlastHit constructor: " << line << std::endl;
std::cerr << "Unrecognised line of input passed to CBlastHit constructor: " << line << "\n";
}
}
......@@ -313,7 +320,7 @@ class CBlastHit
if (a.end_target != b.end_target)
return a.end_target < b.end_target;
// They should be irrelvant since we would have multiple identical hits
// They should be irrelevant since we would have multiple identical hits
// if we come here.
if (a.length != b.length)
return a.length < b.length;
......@@ -324,8 +331,8 @@ class CBlastHit
friend bool less_than_CBlastHit_query_quality(const CBlastHit &a, const CBlastHit &b)
{
// First criterion: name of query sequence: accending (smaller is "better")
// Second criterion: e_value accending (smaller is better)
// First criterion: name of query sequence: ascending (smaller is "better")
// Second criterion: e_value ascending (smaller is better)
// Third criterion: score descending (higher is better)
// Fourth criterion: perfection descending (higher is better)
// Fifth criterion: sequence positions
......@@ -365,7 +372,7 @@ class CBlastHit
if (a.end_target != b.end_target)
return a.end_target < b.end_target;
// They should be irrelvant since we would have multiple identical hits
// They should be irrelevant since we would have multiple identical hits
// if we come here.
// if (a.length != b.length) // Including this line is a bug. This was a bug.
return a.length < b.length;
......@@ -402,7 +409,7 @@ class CBlastHit
if (a.end_query != b.end_query)
return a.end_query < b.end_query;
// They should be irrelvant since we would have multiple identical hits
// They should be irrelevant since we would have multiple identical hits
// if we come here.
if (a.length != b.length)
return a.length < b.length;
......@@ -450,7 +457,7 @@ class CBlastHit
os << e_value << delim;
os << score;
os << std::endl;
os << '\n';
}
void print(std::ostream &os,
......@@ -508,7 +515,7 @@ class CBlastHit
if (pscore)
os << score;
os << std::endl;
os << '\n';
}
void print_essential_1(std::ostream &os, char delim = '\t') const
......@@ -517,7 +524,7 @@ class CBlastHit
os << "E: " << e_value << delim;
os << "len: " << length << delim;
os << "%: " << perfection << delim;
os << std::endl;
os << '\n';
}
......@@ -528,7 +535,13 @@ class CBlastHit
class CBlast_parser
{
std::list<CBlastHit*> lbh;
std::map<faststring, CBlastHit*> bh_map;
// Previous versions of this header file used a map in the declaration of bh_map.
// This map is/was only used in the get_max_hit_query_span__matching_beginning2 function.
// In a map in which elements are inserted with the insert function we only inserted the first (and best entry) for
// each query. This was fine for all cases for which we used this map so far.
// However, a multimap has the same functionality and is more secure, since it will store all entries.
std::multimap<faststring, CBlastHit*> bh_map;
// Stores coverage in bp. If query seq. length is known it can be used to determine the relative sequence length.
std::map<faststring, unsigned> total_coverage_map;
......@@ -539,7 +552,8 @@ class CBlast_parser
void add(CBlastHit* p)
{
lbh.push_back(p);
bh_map.insert(bh_map.end(), std::make_pair<faststring, CBlastHit*>(p->get_query_seq_name(), p));
faststring tmp = p->get_query_seq_name();
bh_map.insert(bh_map.end(), std::make_pair(tmp, p));
}
public:
......@@ -552,7 +566,7 @@ class CBlast_parser
f.ffopen(filename);
#ifdef FINANA
std::cerr << "We are in the FINANA mode." << std::endl;
std::cerr << "We are in the FINANA mode.\n";
#endif
f.getline(line);
......@@ -598,7 +612,7 @@ class CBlast_parser
// See also keep_only_n_top_hits
// Copy constructor that can be used to filter the n first blast hits for a query.
// Will be sorted by query name, since the source will be sorted.
CBlast_parser(CBlast_parser &b, unsigned n=-1u):query_name_quality_sorted(true)
CBlast_parser(CBlast_parser &b, unsigned n=UINT_MAX):query_name_quality_sorted(true)
{
b.sort_by_query_name_quality();
......@@ -654,8 +668,8 @@ class CBlast_parser
res = func(tax,target_gi, type);
if (res < 0)
{
std::cerr << "Warning: In CBlast_parser. res < 0.\n\n" << std::endl;
std::cerr << "GI number seems to be unknown: String: " << tmp << " unsigned: " << target_gi << std::endl;
std::cerr << "Warning: In CBlast_parser. res < 0.\n";
std::cerr << "GI number seems to be unknown: String: " << tmp << " unsigned: " << target_gi << '\n';
// exit(0);
}
......@@ -689,7 +703,7 @@ class CBlast_parser
res = func(tax,target_gi, query_strings);
if (res < 0)
{
std::cerr << "Error in CBlast_parser. res < 0.\n\n" << std::endl;
std::cerr << "Error in CBlast_parser. res < 0.\n\n";
exit(0);
}
......@@ -737,7 +751,7 @@ class CBlast_parser
// Remove *it:
delete *it;
it = lbh.erase(it);
} // it noe points to the hit behind the hit that has been removed.
} // it now points to the hit behind the hit that has been removed.
// it should not be incremented any more.
}
else
......@@ -784,7 +798,7 @@ class CBlast_parser
std::cerr << "WARNING: Number of blast hits removed since no taxid could be found for gi: "
<< count
<< std::endl;
<< '\n';
}
......@@ -825,9 +839,9 @@ class CBlast_parser
if (this_hit_e < best_e_value_this_query)
{
// Should never happen since this is sorted.
std::cerr << "Error better evalue found: ";
std::cerr << "Error better Evalue found: ";
(*it)->print(std::cerr);
std::cerr << std::endl;
std::cerr << '\n';
}
}
else // A new query sequence
......@@ -957,7 +971,7 @@ class CBlast_parser
}
}
// Calling this function is discurraged. We recommend to call:
// Calling this function is discouraged. We recommend to call:
// sort_by_query_name_quality(), since this is more efficient
// in the case of multiple calls.
void sort_query()
......@@ -1000,11 +1014,13 @@ class CBlast_parser
{
if ( orig.is_only_names() )
{
std::cerr << "Object orig was created with the opion <only_names>." << std::endl;
std::cerr << "Do not know how to proceed." << std::endl;
std::cerr << "Object orig was created with the option <only_names>." << std::endl;
std::cerr << "I do not know how to proceed." << std::endl;
exit(0);
}
if (min_query_prop_with_respect_to_all_hits_this_query)
compute_coverage_map(min_perfection, max_evalue);
......@@ -1049,6 +1065,8 @@ class CBlast_parser
// Get name of query of blast hit:
sname = tmp->get_query_seq_name();
// std::cerr << "Working on hit with sname " << sname << std::endl;
if (sname != lastname) // We never want to add the same sequence twice.
// If it has been added (see below) we won't check hits with the same query name
// If the last hit has not been added lastname
......@@ -1058,9 +1076,9 @@ class CBlast_parser
// Remember: blast tells us the short name only.
id_of_hit = orig.get_id_short_name(sname);
// std::cerr << "sname " << sname << " " << id_of_hit << std::endl;
// std::cerr << "sname " << sname << " id-of-hit " << id_of_hit << std::endl;
if (id_of_hit == -1u)
if (id_of_hit == UINT_MAX)
{
std::cerr << "Error: Could not find sequence name: "
<< tmp->get_query_seq_name()
......@@ -1070,6 +1088,9 @@ class CBlast_parser
else // Sequence of blast hit has been found
{
seq_len = orig.get_seq_length(id_of_hit);
// std::cerr << "sname " << sname << " " << id_of_hit << " " << seq_len << std::endl;
if (min_query_prop_with_respect_to_all_hits_this_query)
{
std::map<faststring, unsigned>::iterator it_find;
......@@ -1093,6 +1114,10 @@ class CBlast_parser
hit_coverage = (double)hit_len/seq_len;
//
// std::cerr << "seq-len hit_len coverage "<< sname << " " << seq_len << " " << hit_len << " " << hit_coverage << std::endl;
//
if (hit_coverage >= min_query_prop && hit_perfection >= min_perfection && hit_evalue <= max_evalue)
{
// Query test OK!!
......@@ -1115,8 +1140,8 @@ class CBlast_parser
if (accepted_hits_Log_file_name != NULL)
{
fprintf(accepted_hits_log, "Accepted hit (qT and tT passed): %s hc: %.2lf perf: %.3lf e-val: %8lf Tn: %s\n",
sname.c_str(), hit_coverage, hit_perfection, hit_evalue, target_full_name.c_str());
fprintf(accepted_hits_log, "Accepted hit (qT and tT passed):\t%s\t%s\thc:\t%.2lf\tperf:\t%.3lf\te-val:\t%8lf\n",
sname.c_str(), target_full_name.c_str(), hit_coverage, hit_perfection, hit_evalue);
}
result_with.add_non_redundant(orig,id_of_hit);
lastname = sname; // In case we add the hit, we will ignore other blast hits with the same query name.
......@@ -1127,8 +1152,8 @@ class CBlast_parser
{
if (accepted_hits_Log_file_name != NULL)
{
fprintf(accepted_hits_log, "Hit not accepted (qT OK but tT failed): %s hc: %.2lf perf: %.3lf e-val: %8lf Tn: %s\n",
sname.c_str(), hit_coverage, hit_perfection, hit_evalue, target_full_name.c_str());
fprintf(accepted_hits_log, "Hit not accepted (qT OK but tT failed): %s hc: %.2lf perf: %.3lf e-val: %8lf\n",
sname.c_str(), hit_coverage, hit_perfection, hit_evalue);
}
std::cerr << "--Hit not accepted (qery-test OK, target does not match). Target seq: " << target_full_name << " ";
......@@ -1137,20 +1162,24 @@ class CBlast_parser
}
else // Do not check target seq full name - so we have an accepted hit
{
// unsigned t_id;
faststring target_short_name = tmp->get_target_seq_name();
// This is an accepted hit:
result_with.add_non_redundant(orig, id_of_hit);
if (accepted_hits_Log_file_name != NULL)
{
fprintf(accepted_hits_log, "Accepted hit (qT OK, no tT): %s hc: %.2lf perf: %.3lf e-val: %8lf\n",
sname.c_str(), hit_coverage, hit_perfection, hit_evalue);
fprintf(accepted_hits_log, "Accepted hit (qT OK, no tT):\t%s\t%s\thc:\t%.2lf\tperf:\t%.3lf\te-val:\t%8lf\n",
// fprintf(accepted_hits_log, "Accepted hit (qT OK, no tT): %s hc: %.2lf perf: %.3lf e-val: %8lf\n",
sname.c_str(), target_short_name.c_str(), hit_coverage, hit_perfection, hit_evalue);
}
lastname = sname; // In case we add the hit, we will ignore other blast hits with the same query name.
// std::cerr << "Would add: " << id_of_hit << std::endl;
}
}
else // Does not pass the query test. coverage, perfection, evalue
else // Does not pass the query test. coverage, perfection, Evalue
{
if (accepted_hits_Log_file_name != NULL)
{
......@@ -1178,16 +1207,16 @@ class CBlast_parser
// Typical application:
// For a given query, the best hit has an evalue of e-12,
// the second best hit has an evalue of e-10.
// For a given query, the best hit has an Evalue of e-12,
// the second best hit has an Evalue of e-10.
// This indicates two independent good hits for the same query.
// These hits shall be saved in the double_hits data structure.
// Mode 0:
// First hit has fixed evalue threshold.
// Second hit has a floating threshold depending on the the evalue of the first hit.
// First hit has fixed Evalue threshold.
// Second hit has a floating threshold depending on the the Evalue of the first hit.
// Mode 1:
// First and second hits have fixed evalue thresholds.
// First and second hits have fixed Evalue thresholds.
// This mode makes more sense. Example: First hit: E=10^-90
// Second hits needs e.g. 10^-87, while 10^-10 is already more than significant.
......@@ -1210,7 +1239,7 @@ class CBlast_parser
it_end = lbh.end();
faststring last_hit_query = "";
double best_e_value_this_query = 100; // Initialized to avoid a warning. The code below should always assign a value to it before it is used.
double best_e_value_this_query = 100; // Initialised to avoid a warning. The code below should always assign a value to it before it is used.
// This should be the case, since it is only used if (this_hit_query == last_hit_query) which should only be
// the case if it has been assigned a value.
bool still_increment_it;
......@@ -1243,7 +1272,7 @@ class CBlast_parser
if (this_hit_e < best_e_value_this_query)
{
// Should never happen since this list is sorted.
std::cerr << "Error better evalue found: ";
std::cerr << "Error better Evalue found: ";
(*it)->print(std::cerr);
std::cerr << std::endl;
exit(-1);
......@@ -1287,7 +1316,7 @@ class CBlast_parser
if (this_hit_e < best_e_value_this_query)
{
// Should never happen since this list is sorted.
std::cerr << "Error better evalue found: ";
std::cerr << "Error better Evalue found: ";
(*it)->print(std::cerr);
std::cerr << std::endl;
exit(-1);
......@@ -1311,7 +1340,11 @@ class CBlast_parser
}
// The reverse mode needs to be revised. CSeqNameList does not allow to add redundant elements since
// redundant entries are not handled in a save way at the moment.
/*
void filter_CSeqNameList_with_major_reverse_blast_hit(CSeqNameList &orig, CSeqNameList &result_with,
double min_query_prop, double min_perfection, double max_evalue, bool multi=true)
// The multi paramter determines whether multiple entries are made if the target sequence has multiple hits.
......@@ -1363,7 +1396,7 @@ class CBlast_parser
// std::cerr << "sname " << sname << " " << id_of_hit << std::endl;
if (id_of_hit == -1u)
if (id_of_hit == UINT_MAX)
{
std::cerr << "Error: Could not find sequence name: "
<< sname
......@@ -1408,7 +1441,7 @@ class CBlast_parser
} // END while (it != it_end)
} // END filter_CSeqNameList_with_major_reverse_blast_hit
*/
// Input: CSeqNameList of all query names
// Putput: CSeqNameList of all query names that have a blast hit in *this.
......@@ -1451,7 +1484,7 @@ class CBlast_parser
// std::cerr << "query_name " << query_name << " " << id_of_hit << std::endl;
if (id_of_hit == -1u)
if (id_of_hit == UINT_MAX)
{
std::cerr << "Error: Could not find sequence name: "
<< query_name
......@@ -1495,7 +1528,7 @@ class CBlast_parser
}
CRangeList rl_current_query;
Crange r_all(0, -1u);
Crange r_all(0, UINT_MAX);
unsigned cov;
// Move through all hits:
......@@ -1580,7 +1613,7 @@ class CBlast_parser
// Search all blast hits that have a query name that begins identical to the query_beginning_match_str
// and determine the maximum hit length in this set.
// More formally: Search for all hits with a query that is identical to query_beginning_match_str
// when restricte to the first query_beginning_match_str.size() characters.
// when restricted to the first query_beginning_match_str.size() characters.
int get_max_hit_query_span__matching_beginning1(faststring &query_beginning_match_str)
{
int max_len;
......@@ -1642,7 +1675,7 @@ class CBlast_parser
std::cout << "Entering: get_max_hit_query_span__matching_beginning2 with " << query_beginning_match_str << std::endl;
// Find first hit which start with the search string:
std::map<faststring, CBlastHit*>::iterator it, it_end;
std::multimap<faststring, CBlastHit*>::iterator it, it_end;
it = bh_map.lower_bound(query_beginning_match_str);
it_end = bh_map.end();
......@@ -1657,7 +1690,7 @@ class CBlast_parser
}
// If there is no Blast hit for the query with this name,
// it can be but in most cases will not be equal to it_end
// the iterator it can be but in most cases will not be equal to it_end
// The definitive check is that it points to a hit that matches
if (fstrncmp(query_beginning_match_str, (it->second)->get_query_seq_name(),query_beginning_match_str.size() ) != 0)
......@@ -1750,7 +1783,7 @@ class CBlast_parser
// fill a map with the following information:
// For all gi numbers of the target sequences, the map contains the number of occurences of this target.
// For all gi numbers of the target sequences, the map contains the number of occurrences of this target.
void get_gi_occurence_map(std::map<unsigned, unsigned> &gim)
{
std::list<CBlastHit*>::iterator it, it_end;
......
/* BaitFisher (version 1.2.7) a program for designing DNA target enrichment baits
/* BaitFisher (version 1.2.8) a program for designing DNA target enrichment baits
* Copyright 2013-2016 by Christoph Mayer
*
* This source file is part of the BaitFisher-package.
......@@ -39,11 +39,11 @@
// Changes:
// 22.08.2009: Added getline function for faststring. Disadvantage: addidtional dependence on faststring.h
// 22.08.2009: Added getline function for faststring. Disadvantage: additional dependence on faststring.h
// 07.01.2011: Changed Version to CFile2_1.h
// 07.01.2011: Now uses the faststring2.h
// Idee: ios:: set Buffer size
// Idea: ios:: set Buffer size
// TODO: Old mac format not supported.
// This requires to allow two successive calls to the internal ungetchar command.
......@@ -119,7 +119,8 @@ class CFile : private std::ifstream
public:
enum {__eof_flag = 1, __good_flag = 2, __fail_flag = 4, __bad_flag = 8};
enum {__eof_flag = 1, __good_flag = 2, __fail_flag = 4, __bad_flag = 8, __fail_reason1 = 16, __fail_reason2 = 32, __fail_reason3 = 64,
__fail_reason4 = 128};
void open(const char *name)
{
......@@ -163,7 +164,7 @@ class CFile : private std::ifstream
ffclose();
}
bool exists() // -- depricated -- do not use this any more - check fail() instead !!!!!!!!
bool exists() // -- deprecated -- do not use this any more - check fail() instead !!!!!!!!
{
return !fail();
}
......@@ -193,6 +194,26 @@ class CFile : private std::ifstream
return __status;
}
bool fail_reason1()
{
return (__status & __fail_reason1);
}
bool fail_reason2()
{
return (__status & __fail_reason2);
}
bool fail_reason3()
{
return (__status & __fail_reason3);
}
bool fail_reason4()
{
return (__status & __fail_reason4);
}
void rewind()
{
clear();
......
/* BaitFisher (version 1.2.7) a program for designing DNA target enrichment baits
* Copyright 2013-2016 by Christoph Mayer
/* BaitFisher (version 1.2.8) a program for designing DNA target enrichment baits
* BaitFilter (version 1.0.6) a program for selecting optimal bait regions
* Copyright 2013-2017 by Christoph Mayer
*
* This source file is part of the BaitFisher-package.
*
......@@ -201,6 +202,8 @@ class CHistogram
{
range_mean_sd(it_beg, it_end, me, sd);
bins = 3.5*sd/pow(num_range_elements, 1./3.);
if (bins < 1)
bins = 1;
}
else if (bins_param == -2) // sqrt formula
{
......@@ -314,6 +317,11 @@ CHistogram(double a_param, double b_param, int bins_param):
init_with_range(vals.begin(), vals.end(), vals.size(), bins_param);
}
CHistogram(const std::vector<float> &vals, int bins_param=0):entries(0)
{
init_with_range(vals.begin(), vals.end(), vals.size(), bins_param);
}
CHistogram(const std::vector<unsigned> &vals, int bins_param=0):entries(0)
{
init_with_range(vals.begin(), vals.end(), vals.size(), bins_param);
......
/* BaitFisher (version 1.2.7) a program for designing DNA target enrichment baits
/* BaitFisher (version 1.2.8) a program for designing DNA target enrichment baits
* Copyright 2013-2016 by Christoph Mayer
*
* This source file is part of the BaitFisher-package.
......@@ -143,7 +143,7 @@ class CRequiredTaxa
// The dummy parameter is only used to distinguish this and the following constructor, since both have the same parameter list
// except of this dummy parameter.
/* Depricates. Required taxa have to be specified in the parameter file.
/* Deprecates. Required taxa have to be specified in the parameter file.
CRequiredTaxa(faststring infilename, CTaxonNamesDictionary &dict, int &error, int dummy):dictionary(dict),empty(false)
{
std::ifstream is(infilename.c_str());
......
/* BaitFisher (version 1.2.7) a program for designing DNA target enrichment baits
* Copyright 2013-2016 by Christoph Mayer
/* BaitFisher (version 1.2.8) a program for designing DNA target enrichment baits
* BaitFilter (version 1.0.6) a program for selecting optimal bait regions
* Copyright 2013-2017 by Christoph Mayer
*
* This source file is part of the BaitFisher-package.
*
......@@ -37,7 +38,7 @@
#include "CSequence_Mol2_1.h"
#include <iterator>
#include <algorithm>
#include <climits>
inline void set_to_short_name(faststring &str)
{
......@@ -69,7 +70,7 @@ class CSeqNameList
private:
faststring infile_name;
bool only_names; // Formerly, all vectors had been initialized to ensure that all fields are accessible.
bool only_names; // Formerly, all vectors had been initialised to ensure that all fields are accessible.
// This is not the case any more. If only_names is true, the vectors defined below can be empty.
// TODO: Check that this is handled consistently.
......@@ -80,8 +81,7 @@ class CSeqNameList
std::vector<unsigned> corrected_len_vec;
std::vector<unsigned> repeat_density_bp_mbp;
public:
void add(const faststring &full_name, unsigned sl, double CG_c, unsigned cl, unsigned rdens)
void add_unchecked(const faststring &full_name, unsigned sl, double CG_c, unsigned cl, unsigned rdens)
{
// The basic add routine creates a copy of the sequence name that shall be added.
faststring *tmp = new faststring(full_name);
......@@ -92,14 +92,14 @@ class CSeqNameList
corrected_len_vec.push_back(cl);
repeat_density_bp_mbp.push_back(rdens);
// std::cerr << "Adding new seq: Name " << *tmp << " len " << sl << " CG " << CG_c << " cl " << cl<< std::endl;
faststring::size_t pos = full_names.size()-1;
// std::cerr << "Adding new seq: Name " << *tmp << " pos " << pos << " len " << sl << " CG " << CG_c << " cl " << cl<< std::endl;
m[tmp] = pos;
}
void add_only_name(const char *full_name)
void add_only_name_unchecked(const char *full_name)
{
faststring *tmp = new faststring(full_name);
full_names.push_back(tmp);
......@@ -108,21 +108,52 @@ class CSeqNameList
m[tmp] = pos;
}
void add(const CSeqNameList &snl, unsigned id)
public:
bool add_only_name_non_redundant(const char *full_name)
{
if (get_id_short_name(*full_name) == UINT_MAX )
{
if (snl.only_names)
add_only_name( snl.full_names[id]->c_str() );
add_only_name_unchecked( full_name );
return true;
}
else
add(*(snl.full_names[id]), snl.seq_len_vec[id], snl.CG_content[id], snl.corrected_len_vec[id], snl.repeat_density_bp_mbp[id]);
{
std::cerr << "Detected previous entry of " << full_name << std::endl;
return false;
}
}
/* void add(const CSeqNameList &snl, unsigned id) */
/* { */
/* if (snl.only_names) */
/* add_only_name( snl.full_names[id]->c_str() ); */
/* else */
/* add(*(snl.full_names[id]), snl.seq_len_vec[id], snl.CG_content[id], snl.corrected_len_vec[id], snl.repeat_density_bp_mbp[id]); */
/* } */
bool add_non_redundant(const faststring &full_name, unsigned sl, double CG_c, unsigned cl, unsigned rdens)
{
if (get_id_short_name(full_name) == UINT_MAX)
{
add_unchecked(full_name, sl, CG_c, cl, rdens);
return true;
}
else
{
std::cerr << "Detected previous entry of " << full_name << ". Name has not been added again." << std::endl;
return false;
}
}
bool add_non_redundant(const CSeqNameList &snl, unsigned id)
{
if (!snl.only_names)
{
if (get_id_short_name(*(snl.full_names[id])) == -1u)
if (get_id_short_name(*(snl.full_names[id])) == UINT_MAX)
{
add(*(snl.full_names[id]), snl.seq_len_vec[id], snl.CG_content[id], snl.corrected_len_vec[id], snl.repeat_density_bp_mbp[id]);
add_unchecked(*(snl.full_names[id]), snl.seq_len_vec[id], snl.CG_content[id], snl.corrected_len_vec[id], snl.repeat_density_bp_mbp[id]);
return true;
}
else
......@@ -133,9 +164,9 @@ class CSeqNameList
}
else // only_names
{
if (get_id_short_name(*(snl.full_names[id])) == -1u)
if (get_id_short_name(*(snl.full_names[id])) == UINT_MAX)
{
add_only_name( snl.full_names[id]->c_str() );
add_only_name_unchecked( snl.full_names[id]->c_str() );
return true;
}
else
......@@ -144,7 +175,6 @@ class CSeqNameList
return false;
}
}
}
......@@ -255,16 +285,17 @@ class CSeqNameList
if ( infile.fail() && !infile.eof() )
{
std::cerr << "\n\n";
std::cerr << "Warning: A problem was detected while reading the input file \""<< fasta_file_name << "\". The file might be empty or it might not be a valid fasta file.\n";
std::cerr << "ERROR: A problem was detected while reading the input file \""<< fasta_file_name << "\". The file might be empty or it might not be a valid fasta file.\n";
std::cerr << "File position: line ";
std::cerr << faststring(infile.line()) << std::endl;
std::cerr << std::flush;
exit(-7);
}
else
{
faststring name_to_add = seq.getFullName();
// std::cerr << "Procesing sequence: " << name_to_add << std::endl;
// std::cerr << "Processing sequence: " << name_to_add << std::endl;
seq.compute_numbers_of_residues();
......@@ -275,7 +306,13 @@ class CSeqNameList
// std::cerr << "Adding 2: " << name_to_add << " slen: " << seq.length() << " CG: " << CGc << " bases: " << bases << std::endl;
add(name_to_add, seq.length(), CGc, bases, rdens);
bool non_redundant = add_non_redundant(name_to_add, seq.length(), CGc, bases, rdens);
if (!non_redundant)
{
std::cerr << "Exiting due to non unique sequence names." << std::endl;
exit(-1);
}
}
} // End while
}
......@@ -287,17 +324,24 @@ class CSeqNameList
if ( infile.fail() && !infile.eof() )
{
std::cerr << "\n\n";
std::cerr << "Warning: A problem was detected while reading the input file \""<< fasta_file_name << "\". The file might be empty or it might not be a valid fasta file.\n";
std::cerr << "ERROR: A problem was detected while reading the input file \""<< fasta_file_name << "\". The file might be empty or it might not be a valid fasta file.\n";
std::cerr << "File position: line ";
std::cerr << faststring(infile.line()) << std::endl;
std::cerr << std::flush;
break; // Stop reading this file.
exit(-7);
// break; // Stop reading this file.
}
else
{
const char * name_to_add = seq.getFullName();
// std::cerr << "Procesing sequence: " << name_to_add << std::endl;
add_only_name(name_to_add);
// std::cerr << "Processing sequence: " << name_to_add << std::endl;
bool non_redundant = add_only_name_non_redundant(name_to_add);
if (!non_redundant)
{
std::cerr << "Exiting due to non unique sequence names." << std::endl;
exit(-1);
}
}
} // End while
} // End else only_names
......@@ -327,8 +371,15 @@ class CSeqNameList
infile.getline(name_to_add);
while (!infile.eof())
{
// std::cerr << "Procesing sequence: " << name_to_add << std::endl;
add_only_name(name_to_add.c_str());
// std::cerr << "Processing sequence: " << name_to_add << std::endl;
bool non_redundant = add_only_name_non_redundant(name_to_add.c_str());
if (!non_redundant)
{
std::cerr << "Exiting due to non unique sequence names." << std::endl;
exit(-1);
}
infile.getline(name_to_add);
} // End while
......@@ -356,7 +407,7 @@ class CSeqNameList
if (only_names)
{
std::cerr << "Internal error: Reading repeat denstities for names only sequence list.\n";
std::cerr << "Internal error: Reading repeat densities for names only sequence list.\n";
exit(-22);
}
......@@ -367,7 +418,7 @@ class CSeqNameList
split(vf, line, "\t");
if (vf.size()!=2)
{
std::cerr << "Critical error when addind repeat densities. Line " << line << " not a valid input.\n";
std::cerr << "Critical error when adding repeat densities. Line " << line << " not a valid input.\n";
exit(-21);
}
sn = vf[0];
......@@ -624,13 +675,13 @@ class CSeqNameList
if (it_find != m.end())
return it_find->second;
else
return -1u;
return UINT_MAX;
}
// Search for str_in in the list of sequences. str_in can be the full name or the short name.
// The target list can contain full or short names.
unsigned get_id_short_name(faststring str) // No refernce since we change the string
unsigned get_id_short_name(faststring str) // No reference since we change the string
{
// We shorten str to the short name.
// If it is the full name and the target only contains
......@@ -641,10 +692,10 @@ class CSeqNameList
it_find = m.lower_bound(&str); // it_find points to an element that is either equal to str or the first element
// in the map that is greater than str. In case, str contains the short name of the
// target, we are looking for this element.
// The question whether the short name is unique is not adressed here. The id of the
// The question whether the short name is unique is not addressed here. The id of the
// first suitable short name is returned.
if (it_find == m.end())
return -1u;
return UINT_MAX;
// if (*(it_find->first) == str) // str is equal to the string that has been found.
// return it_find->second;
......@@ -659,16 +710,16 @@ class CSeqNameList
// The short names differ or the complete string is the short name. Since the short name should have been found above,
// we have not found the string.
if (pos1 != pos2)
return -1u;
return UINT_MAX;
// If str is longer than the target, it cannot be the short name.
// If the space is found at a position with index larger thant the size of str, it cannot be the short name of str.
// If the space is found at a position with index larger than the size of str, it cannot be the short name of str.
// It could be that this case is not possible.
// if (str.size() > it_find->first->size() || pos > str.size() )
// return -1u;
// return UINT_MAX;
if (strncmp(str.c_str(), it_find->first->c_str(), pos1) != 0)
return -1u;
return UINT_MAX;
return it_find->second;
}
......@@ -696,7 +747,7 @@ class CSeqNameList
if (find_pos != faststring::npos) // we have a match
{
id = it_beg->second;
add(a, id);
add_non_redundant(a, id);
}
++it_beg;
}
......@@ -790,7 +841,7 @@ class CSeqNameList
while (it_beg != it_end)
{
id = it_beg->second;
add(a, id);
add_non_redundant(a, id);
++it_beg;
}
......@@ -812,9 +863,9 @@ class CSeqNameList
while (it_beg != it_end)
{
id = get_id_short_name(*(it_beg->first)); // Search for sequence in this.
if (id == -1u) // Sequence is unknown in this, so we add it
if (id == UINT_MAX) // Sequence is unknown in this, so we add it
{
add(b, it_beg->second);
add_non_redundant(b, it_beg->second);
}
++it_beg;
}
......@@ -879,7 +930,7 @@ class CSeqNameList
while (it_beg != it_end)
{
id = a.get_id_short_name(*it_beg);
add(a, id);
add_non_redundant(a, id);
++it_beg;
}
......@@ -937,7 +988,7 @@ class CSeqNameList
while (it_beg != it_end)
{
id = a.get_id_short_name(*it_beg);
add(a, id);
add_non_redundant(a, id);
++it_beg;
}
......@@ -994,12 +1045,12 @@ class CSeqNameList
{
// The seq can be found either in a or in b.
id = a.get_id_short_name(*it_beg);
if (id != -1u)
add(a, id);
if (id != UINT_MAX)
add_non_redundant(a, id);
else
{
id = b.get_id_short_name(*it_beg);
add(b, id);
add_non_redundant(b, id);
}
++it_beg;
......@@ -1027,16 +1078,16 @@ class CSeqNameList
{
id = a.get_id_short_name(*(it_beg->first));
if (id != -1u)
if (id != UINT_MAX)
{
c.add(a, id);
c.add_non_redundant(a, id);
}
else
{
id = b.get_id_short_name(*(it_beg->first));
if (id != -1u)
if (id != UINT_MAX)
{
d.add(b, id);
d.add_non_redundant(b, id);
}
else
{
......@@ -1047,7 +1098,7 @@ class CSeqNameList
}
}
// All sequence names are split according to delim. The field with 1-based number field is actracted and stored in the field_set.
// All sequence names are split according to delim. The field with 1-based number field is extracted and stored in the field_set.
bool get_set_of_name_field(unsigned field, char delim, std::set<faststring> &field_set)
{
unsigned i, n=full_names.size();
......@@ -1063,7 +1114,7 @@ class CSeqNameList
if (splitter.size() < field )
{
std::cerr << "Warning: In get_set_of_name_field you tried to extract field # "
<< field << " after splitting " << full_names[i] << " with deliminator " << delim
<< field << " after splitting " << full_names[i] << " with delimiter " << delim
<< " but this field does not exist." << std::endl;
error = true;
}
......
This diff is collapsed.
This diff is collapsed.
/* BaitFisher (version 1.2.7) a program for designing DNA target enrichment baits
/* BaitFisher (version 1.2.8) a program for designing DNA target enrichment baits
* Copyright 2013-2016 by Christoph Mayer
*
* This source file is part of the BaitFisher-package.
......@@ -42,7 +42,7 @@ class CTaxonNamesDictionary
CSeqNameList *snl;
CSeqNameList all;
// Each index storen in the taxon_names_to_index map is equal to the index of the same taxon name in the taxon_names_vec.
// Each index stored in the taxon_names_to_index map is equal to the index of the same taxon name in the taxon_names_vec.
// This allows us to translate indices and names back and forth.
std::vector<faststring> taxon_names_vec;
......@@ -93,7 +93,7 @@ class CTaxonNamesDictionary
if (error_get_set_of_name_field)
{
std::cerr << "WARNING: At least one error occured when trying to read taxon names from the fasta sequence headers."
std::cerr << "WARNING: At least one error occurred when trying to read taxon names from the fasta sequence headers."
<< " Usually this error occurs, when headers are not in the proper format, when the parameter file contains a wrong"
<< " wrong sequence name field delimiter or if the taxon name field number is wrong." << std::endl;
std::cerr << "This error will influence: TODO." << std::endl;
......
/* BaitFisher (version 1.2.7) a program for designing DNA target enrichment baits
/* BaitFisher (version 1.2.8) a program for designing DNA target enrichment baits
* Copyright 2013-2016 by Christoph Mayer
*
* This source file is part of the BaitFisher-package.
......@@ -59,7 +59,7 @@ void Csequence_loci_cluster_collection::cluster_locus(faststring & region_name,
cout << "WARNING: Found 0 valid sequences in bait window in Csequence_loci_cluster_collection::cluster_locus()." << endl;
cout << " Alignment file: " << filename << endl;
cout << " Region/gene name: " << region_name << endl;
cout << " Within gene coordiantes: " << pos_start+1 << "-" << pos_end << endl;
cout << " Within gene coordinates: " << pos_start+1 << "-" << pos_end << endl;
}
}
if (number_of_valid_sequences == 1)
......@@ -70,7 +70,7 @@ void Csequence_loci_cluster_collection::cluster_locus(faststring & region_name,
cout << "Note: Found 1 valid sequence in bait window in Csequence_loci_cluster_collection::cluster_locus(). Clustering will be skipped. Bait will be constructed from single sequence." << endl;
cout << " Alignment file: " << filename << endl;
cout << " Region/gene name: " << region_name << endl;
cout << " Within gene coordiantes: " << pos_start+1 << "-" << pos_end << endl;
cout << " Within gene coordinates: " << pos_start+1 << "-" << pos_end << endl;
}
// TODO: Uncomment and adapt:
......@@ -112,7 +112,7 @@ void Csequence_loci_cluster_collection::cluster_locus(faststring & region_name,
// Create cluster object:
CDistance_Cluster cluster_object;
// We initialize the global pointer to the cluster_object.
// We initialise the global pointer to the cluster_object.
// This pointer is used by the global call_back_distance function,
// which we pass to the CSequences2 class where it is used to
// fill the cluster_object with the distances of the sequences.
......@@ -125,7 +125,7 @@ void Csequence_loci_cluster_collection::cluster_locus(faststring & region_name,
// of the new sequence number, and we have global unique numbers, sequence numbers in the exon,
// sequence numbers in the window.
// The best compromise is to add very large distances to the clustering algorithm and to remove
// the "non-present" sequences after the clusting has been done.
// the "non-present" sequences after the clustering has been done.
// Due to the large distances we assign to all sequence pairs in which one sequence is not valid, non of
// the invalid sequences will be clustered with any other sequence.
......@@ -512,7 +512,7 @@ void find_center_sequence_exhaustive(char **msa, char *consensus,
} // END else of if (pos1 == pos2)
} // END void find_center_sequence_exhaustive
// distances must be initialized by caller.
// distances must be initialised by caller.
void find_center_sequence_heuristic(char **msa, char *consensus,
char *center, char *isAmbig,
unsigned len_center,
......@@ -532,7 +532,7 @@ void find_center_sequence_heuristic(char **msa, char *consensus,
// pos_start walks through isAmbig and consensus.
// pos_start_msa walks through the msa.
// The following static variables are initialized only when calling this function for the first time.
// The following static variables are initialised only when calling this function for the first time.
static unsigned max_num_taxa = 20;
static unsigned *dist_A = new unsigned [max_num_taxa];
static unsigned *dist_C = new unsigned [max_num_taxa];
......@@ -653,7 +653,7 @@ void find_center_sequence_heuristic(char **msa, char *consensus,
while (pos_start < pos_end)
{
if (isAmbig[pos_start]) // He now search for best nulceotide in center.
if (isAmbig[pos_start]) // He now search for best nucleotide in center.
{
// Try 'A'
if (consensus[pos_start]&recode_A)
......@@ -974,7 +974,7 @@ void Csequence_cluster_and_center_sequence::compute_center(char center_computati
}
else // We have to compute a center sequence:
{
if (center_computation_mode == 0) // exhausitve
if (center_computation_mode == 0) // exhaustive
{
find_center_sequence_for_msa_exhaustive(msa, center_sequence, num_sequences, pos_start, pos_end, max_dist_bait_to_msa);
}
......@@ -1036,7 +1036,7 @@ void Csequence_cluster_and_center_sequence::compute_center(char center_computati
{
cout << "Same distance." << endl;
}
} // END else // Comparisson mode
} // END else // Comparison mode
} // END else // We have to compute a center sequence:
// cout << "LOG: pos: " << pos_start << " mis " << max_dist_bait_to_msa*120 << endl;
......
/* BaitFisher (version 1.2.7) a program for designing DNA target enrichment baits
/* BaitFisher (version 1.2.8) a program for designing DNA target enrichment baits
* Copyright 2013-2016 by Christoph Mayer
*
* This source file is part of the BaitFisher-package.
......
This diff is collapsed.
>EOG5B2RVQ|AMELL_prerelease2|Dinetus_pictus|scaffold4426-608
ATTTATACTGCATGCAAAGAAGACCGGATTCGTGGTTGAGCACGATTTCATTATGGCTACTTATTTAGCTGACCGTGTAATAGTATTCTCCGGCACACCATCTTTGTGCACGACGGCACACAGTCCTCAATCCTTGTTGAACGGTATGAACAGATTCTTGGAGCTATTGGGCATCACTTTCAGAAGAGACCCCAATAACTTCAGACCAAGAATCAACAAGAGCCAGTCTGTAAAG
>EOG5B2RVQ|AMELL_prerelease2|Alysson_spinosus|scaffold7054-608
ATTCATATTGCACGCGAAAAAAACTGGATTCGTGGTGGAGCACGATTTTATTATGGCAACGTATTTGGCTGATCGTGTCATAGTATTTTCCGGTACCCCATCACTCTCGACCGTTGCTCACAGCCCTCAATCTTTGTTGAATGGCATGAATAGATTCTTGGAGTTGCTGGGAATCACTTTCAGAAGAGACCCAAATAACTTTAGACCAAGGATCAACAAGAGTCAGTCCGTGAAG
>EOG5B2RVQ|AMELL_prerelease2|Chalybion_californicum|scaffold11527-608
GTTTATATTGCATGCAAAGAAAACTGGATTCGTGGTTGAGCACGATTTTATTATGGCAACTTATTTAGCTGATCGTGTGATTGTGTTCTCTGGTACACCGTCTCTATCGACTACAGCACATAGTCCTCAATCTCTGTTGAACGGTATGAACCGGTTTCTGGAGCTGTTGGGCATCACTTTTAGGAGAGACCCGAACAATTTCAGACCGAGAATCAACAAAAGCCAATCTGTGAAA
>EOG5B2RVQ|AMELL_prerelease2|Cerceris_arenaria|C324321-605
GTTCATATTGCACGCGAAGAAAACAGGTTTCGTGGTAGAGCACGACTTTATAATGGCAACGTATTTGGCTGATCGTGTGATAGTATTCTCTGGCACACCATCGTTATCGACTACTGCCCATAGTCCGCAATCTTTGTTAAATGGTATGAACAGATTCTTGGAATTGTTGGGCATTACTTTCAGAAGAGATCCGAATAATTTCAGACCGAGGATCAATAAGAGCCAGTCTGTCAAA
>EOG5B2RVQ|HSALT_3.3|Gorytes_laticinctus|C303653-611
GTTCATACTCCATGCGAAGAAGACGGGCTTTGTGGTAGAGCACGATTTCATAATGGCTACTTACCTGGCCGATCGTGTGATAGTATTCTCTGGTACACCATCGCTGTGCACCACTGCTCACAGCCCGCAATCTCTGCTGAACGGCATGAACAGATTCCTGGAGCTGTTGGGCATCACTTTCAGAAGAGATCCCAACAACTTCAGACCGAGGATCAACAAGAGTCAATCTGTGAAA
>EOG5B2RVQ|LHUMI|Crossocerus_quadrimaculatus|scaffold6786-610
GTTTATACTGCACGCAAAGAAAACAGGATTCGTTGTGGAGCACGACTTCATTATGGCTACATATTTGGCTGATCGTGTCATAGTATTCTCCGGTACACCATCTTTATGCACGACAGCCCACAGTCCACAATCTCTATTGAATGGCATGAATAGATTCCTGGAGCTCTTGGGTATCACTTTCAGAAGAGATCCTAATAACTTCAGGCCCAGAATTAACAAGAGCCAATCAGTAAAG
>EOG5B2RVQ|AMELL_prerelease2|Isodontia_mexicana|scaffold17238-608
GTTCATCTTGCACGCGAAGAAGACTGGATTCGTGGTCGAGCACGATTTCATCATGGCTACTTACCTCGCTGACAGAGTGATCGTCTTTTCCGGGATCCCATCGTTGACAACGACTGCCCACAGCCCCCAGTCGTTGTTAAACGGTATGAATCGGTTCCTGGAGCTACTTGGAATCACTTTCAGACGAGACCCGAACAACTTCCGACCGAGAATCAACAAGAACCAGTCCGTGAAG
>EOG5B2RVQ|AMELL_prerelease2|Prionyx_kirbii|scaffold1266-608
ATTCATCCTGCATGCGAAGAAAACTGGATTCGTGGTCGAGCACGATTTCATCATGGCCACGTACCTCGCCGACCGCGTGATCGTCTTCTCCGGGACGCCCTCGCTCTCGACGACCGCGCACAGCCCGCAATCCCTGCTGAACGGAATGAACCGGTTCCTCGAGCTCCTGGGAATCACGTTCAGAAGGGATCCCAATAATTTCCGGCCCAGGATTAACAAGAGCCAGTCCGTCAAG
>EOG5B2RVQ|AMELL_prerelease2|Oxybelus_bipunctatus|C417613-608
ATTTATATTGCATGCGAAGAAAACAGGATTCGTTGTCGAGCACGATTTTATAATGGCTACTTATTTAGCTGATCGTGTCATAGTATTCTCTGGTACACCGTCTTTATCAACAACAGCACACAGTCCTCAATCTTTGTTAAACGGCATGAACAGATTCTTGGAACGACTTGGTATCACATTTAGAAGAGATCCCAATAACTTCAGACCCAGGATAAACAAGAGTCATTCTGTTAAG
>EOG5B2RVQ|AMELL_prerelease2|Diodontus_minutus|C390388-608
GTTTATATTGCACGCTAAGAAAACAGGATTCGTGGTAGAGCACGATTTTATTATGGCTACGTACTTGGCCGATCGTGTGATAGTATTTTCTGGAACACCATCTCTATCGACCACCGCTCACAGTCCTCAATCGCTATTGAACGGCATGAACAGATTCTTAGAATTGCTAGGTATCACGTTCAGAAGAGACCCCAACAACTTCCGACCGAGAATCAATAAAAACCAGTCTGTGAAA
>EOG5B2RVQ|AMELL_prerelease2|Philanthus_triangulum|scaffold5142-608
ATTTATATTACACGCAAAGAAAACAGGTTTTGTCGTAGAACACGACTTCATAATGGCCACGTATTTAGCTGATCGTGTAGTAGTATTCTCTGGAACACCATCATTGTCGACTACTGCCCATAGCCCTCAGTCTCTTTTGAACGGTATGAACAGATTCTTAGAATTGTTGGGCATTACTTTCAGAAGAGATCCCAACAATTTCAGGCCCAGGATCAATAAGAGTCAGTCAGTAAAG
>EOG5B2RVQ|AMELL_prerelease2|Tachysphex_fulvitarsis|scaffold9250-608
GTTCATATTGCACGCAAAAAAGACTGGATTCGTGGTCGAGCACGATTTTATTATGGCAACTTATTTGGCTGACCGTGTCATAGTATTCTCCGGTACTCCGTCTCTCTCAACAACAGCGCACAGTCCGCAATCTCTCCTAAATGGCATGAATAGATTCTTGGAACTTCTTGGTATCACTTTCAGAAGAGATCCGAATAATTTCAGACCAAGGATCAATAAGAGTCAATCTGTGAAG
>EOG5B2RVQ|AMELL_prerelease2|Podalonia_hirsuta|C366127-608
GTTCATCCTACACGCGAAGAAGACTGGTTTCGTCGTGGAGCATGACTTCATTATGGCCACGTACCTGGCGGACCGCGTGATCGTCTTTTCGGGTACACCGTCGCTCTGTACGACTGCGCACAGTCCGCAGTCGCTGCTGAACGGGATGAACCGGTTCCTGGAGCTGTTGGGGATCACGTTCAGGCGGGACCCGAACAACTTCCGGCCAAGGATCAACAAGAGCCAGTCCGTGAAG
>EOG5B2RVQ|AMELL_prerelease2|Pemphredon_lugens|scaffold11705-608
GTTTATATTGCACGCTAAAAAAACAGGATTCGTAGTAGAGCACGATTTTATTATGGCCACATACTTAGCCGATCGTGTAATAGTATTTTCTGGAACACCATCTCTGTCGACCACCGCTCACAGTCCTCAATCTCTATTGAACGGTATGAACAGATTCTTAGAATTGTTGGGCATTACGTTCAGAAGAGATCCCAACAACTTCAGACCAAGGATCAATAAAAACCAATCTGTGAAA
>EOG5B2RVQ|AMELL_prerelease2|Trypoxylon_figulus|C240503-608
ATTCATACTGCACGCTAAGAAAACAGGATTTGTGGTAGAACACGACTTTATAATGGCTACTTATTTAGCTGATCGTGTAATAGTATTTTCTGGTACTCCTTCTTTGTGTACAACAGCGCACAGTCCACAATCTTTGTTAAACGGGATGAACAGATTCTTGGAATTGTTAGGTATTACCTTTAGAAGAGATCCTAACAATTTCAGACCGAGAATAAATAAGAGCCAATCGGTGAAG
>EOG5B2RVQ|AMELL_prerelease2|Sceliphron_curvatum|scaffold10018-608
ATTCATACTACATGCAAAGAAAACGGGATTTGTGGTGGAGCACGATTTTATCATGGCAACTTATTTGGCTGATCGTGTGATAGTATTCTCTGGTACTCCATCTCTATCGACTACAGCACATAGTCCTCAATCCTTGTTGAACGGCATGAATCGATTCCTGGAATTGTTGGGCATCACTTTTAGAAGAGACCCAAATAATTTTAGACCGAGAATCAATAAGAGCCAATCTGTCAAG
>EOG5B2RVQ|AMELL_prerelease2|Psenulus_fuscipennis|C386422-335
GTTCATATTGCACGCGAAAAAGACAGGATTCGTGGTGGAGCACGATTTCATCATGGCGACGTATTTAGCCGACCGTGTAATAGTATTTTCTGGAACCCCATCGTTATCGACGACAGCTCACAGCCCTCAGTCTCTATTGAACGGCATGAACAGATTCCTCGAACTGCTGGGTATCACTTTCAGAAGAGATCCGAACAACTTTAGACCGAGGATTAATAAAAGTCAATCCGTCAAA
>EOG5B2RVQ|AMELL_prerelease2|Sphex_funerarius|scaffold12137-608
GTTCATCTTGCACGCCAAGAAGACAGGATTCGTGGTGGAGCACGATTTCATCATGGCAACTTACCTGGCTGACAGGGTGATCGTATTTTCTGGGATTCCATCCTTGACAACAACGGCACACAGCCCGCAATCATTGTTAAACGGGATGAACCGGTTCCTGGAGCTCCTTGGAATCACTTTCAGACGAGACCCCAACAACTTCCGACCTAGAATTAACAAGAGCCAGTCCGTCAAG
>EOG5B2RVQ|AMELL_prerelease2|Sphecius_convallis|scaffold8236-594
GTTCATATTGCACGCGAAGAAAACTGGATTCGTAGTAGAGCACGACTTCATAATGGCTACGTATTTAGCCGATCGTGTAATTGTATTTTCCGGCACACCATCCTTGTCGACCACTGCTCACAGTCCACAGTCTTTGTTGAACGGAATGAACAGATTTTTGGAGCTGCTAGGCATCACTTTCAGAAGAGATCCCAACAACTTTAGACCGCGGATCAACAAGAGCCAATCTGTAAAA
>EOG5B2RVQ|HSALT_3.3|Nysson_niger|C278670-608
GTTTATTTTACATGCGAAGAAAACAGGATTCGTAGTTGAGCACGATTTTATAATGGCTACGTATTTGGCCGATCGAGTCATAGTATTCTCTGGTACTCCTTCTCTTTCGACTACCGCACATAGCCCGCAATCTCTACTGAATGGTATGAACAGATTCTTAGAGTTGTTGGGTATTACTTTCAGAAGAGATCCTAATAACTTTAGACCAAGAATCAATAAGAGTCAATCAGTAAAA
>EOG5B2RVQ|HSALT_3.3|Harpactus_elegans|scaffold8565-608
GTTCATACTTCACGCGAAGAAGACGGGCTTTGTGGTGGAGCACGATTTCATCATGGCTACGTACCTGGCCGATCGTGTGATAGTATTCTCTGGCGTGCCCTCGCTGTGTACCACGGCCCACAGCCCGCAATCCCTGCTGAACGGTATGAACAGATTCCTGGAGCTACTGGGCATCACCTTCAGAAGAGATCCCAACAACTTTAGACCGAGGATCAACAAGAGCCAGTCTGTGAAA
>EOG5B2RVQ|AMELL_prerelease2|Dinetus_pictus|scaffold4426-608
AAAGTATTCCTCAGTTGCATATAAGTTATAAGCCTCAAAAGATAAGTCCAAAGTCTCAAGGCATTGTTCGGCAGTTGTTGCACGAAAAGATTAGGGATGCGTATGTTCATCCACAATTCGTAACGGATGTTATGAAACCTTTGAAGATAGATGATATCATGGATCAAGAGGTGCAGAATCTTTCCGGAGGAGAATTGCAACGAGTAGCTCTGGCTTTGTGCCTCGGAAAGCCTGCCGACGTTTACTTAATTGACGAACCTTCGGCTTACCTGGATTCCGAGCAACGTTTAGTCGCCGCTAAAGTCATAAAACG
>EOG5B2RVQ|AMELL_prerelease2|Alysson_spinosus|scaffold7054-608
GAAGTATCCCTATGTTGCACATTAGTTATAAGCCGCAAAAGATAAGCCCTAAATCACAGGGTGTTGTGCGACAATTGTTGCACGAAAAAATTCGGGACGCCTATGTGCATCCTCAATTTGTCACGGACGTGATGAAGCCCTTGAAAATAGATGACATTATGGATCAGGAGGTACAGAATCTTTCTGGTGGTGAACTGCAGCGAGTTGCGTTGGCACTTTGTCTCGGAAAACCCGCGGACGTTTATCTTATTGACGAACCGTCCGCTTACTTGGACTCCGAGCAACGTTTAGTGGCAGCTAAAGTAATCAAACG
>EOG5B2RVQ|AMELL_prerelease2|Chalybion_californicum|scaffold11527-608
GAAGTATACCGCAGTTACATATTAGTTATAAACCGCAGAAGATAAGTCCGAAATCTCAAGGTATCGTAAGACAATTATTGCACGACAAAATCAGGGACGCTTACGTTCATCCTCAGTTTGTAACGGATGTAATGAAGCCTCTGAAGATTGATGATATTATGGACCAGGAAGTGCAGAATCTTTCTGGAGGAGAGTTACAAAGAGTAGCTTTGGCGCTTTGTCTCGGAAAGCCTGCAGATGTTTATCTAATTGATGAACCGTCCGCGTACTTGGATTCTGAGCAACGTTTAGTTGCCGCGAAAGTAATAAAACG
>EOG5B2RVQ|AMELL_prerelease2|Cerceris_arenaria|C324321-605
GAAGTATTCCTCTGTTGCACATTAGTTATAAGCCTCAAAAGATAAGTCCTAAGTCACAAGGTATCGTTCGACAATTGTTGCATGAAAAGATTCGGGATGCTTATGTTCACCCGCAGTTCGTAACGGATGTTATGAAGCCATTGAAGATAGATGATATTATGGATCAGGAAGTACAGAATCTTTCTGGTGGTGAATTACAACGAGTAGCGTTGGCTTTGTGTCTCGGAAAGCCTGCTGATGTTTATCTGATCGATGAACCATCTGCGTATTTAGATTCCGAGCAACGTTTAGTCGCTGCTAAAGTGATCAAACG
>EOG5B2RVQ|HSALT_3.3|Gorytes_laticinctus|C303653-611
AAAGTATTCCTCAGTTACACATCAGTTACAAGCCGCAGAAAATCAGCCCTAAGTCGCAAGGCATCGTACGGCAGCTACTCCACGAGAAGATCAGGGACGCATACGTTCATCCGCAGTTTGTCACGGACGTGATGAAGCCCCTGAAAATAGACGACATCATGGATCAGGAGGTGCAGAATCTATCTGGTGGTGAATTGCAGCGAGTCGCGTTGGCTCTCTGCCTCGGCAAGCCCGCCGACGTTTACTTAATCGACGAACCTTCCGCGTACTTGGACTCCGAGCAGCGTTTGGTAGCCGCTAAAGTTATCAAACG
>EOG5B2RVQ|LHUMI|Crossocerus_quadrimaculatus|scaffold6786-610
GAAGTATACCGCAGTTGCATATCAGTTACAAGCCCCAGAAAATAAGTCCGAAATCGCAAGGTATCGTGCGGCAACTACTGCACGAGAAGATTAGAGACGCATATGTCCATCCGCAATTCGTAACCGACGTCATGAAGCCTCTGAAGATAGATGATATTATGGATCAAGAAGTGCAGAATCTCTCGGGAGGAGAATTGCAGCGCGTAGCTTTGGCGTTGTGTCTCGGAAAACCTGCGGATGTTTACTTGATTGACGAACCTTCGGCTTATCTTGACTCTGAGCAGCGTTTGGTTGCTGCCAAAGTGATCAAACG
>EOG5B2RVQ|AMELL_prerelease2|Isodontia_mexicana|scaffold17238-608
GGAGCATCCCCCAGTTACACATAAGCTACAAGCCCCAGAAGATCAGCCCGAAGTCCCAGGGGATCGTCCGTCAGTTATTACACGAGAAGATCAGAGACGCCTACGTACATCCGCAGTTCGTCACCGATGTGATGAAACCTCTGAAGATCGACGACATTATGGACCAAGAGGTGCAGAACCTCTCCGGAGGTGAATTACAGAGGGTAGCCCTTGCCCTCTGCCTTGGGAAGCCAGCGGATGTCTACCTCATCGATGAACCATCCGCTTATTTAGACTCCGAGCAACGTCTTGTCGCTGCTAAAGTCATCAAGAG
>EOG5B2RVQ|AMELL_prerelease2|Prionyx_kirbii|scaffold1266-608
GAAGCATCCCACAGTTGCACATAAGCTACAAACCGCAGAAAATCAGCCCCAAATCGCAGGGCATCGTACGGCAGCTGCTGCACGAGAAGATCAGGGACGCGTACGTGCACCCGCAGTTCGTCACAGACGTGATGAAGCCGCTGAAAATCGACGACATTATGGACCAGGAAGTGCAGAACCTCTCCGGAGGTGAATTGCAACGAGTCGCCCTCGCCCTCTGTCTCGGGAAGCCAGCGGACGTTTACCTGATCGACGAACCGTCCGCCTACCTTGACTCCGAGCAGCGTCTTGTCGCTGCGAAAGTGATAAAACG
>EOG5B2RVQ|AMELL_prerelease2|Oxybelus_bipunctatus|C417613-608
GAAGCATCCCACAGCTACATATTAGTTACAAACCCCAAAAGATAAGTCCGAAATCTCAAGGAATCGTTCGGCAATTATTGCACGAAAAGATTCGCGATGCATACGTGCATCCACAGTTCGTTACAGATGTAATGAAACCTCTCAAGATAGATGATATCATGGACCAGGAAGTGCAGAATCTTTCAGGAGGAGAATTGCAACGTGTTGCTTTGGCTCTCTGTCTTGGAAAACCAGCAGATGTTTACTTGATAGATGAACCTTCAGCCTATTTGGACTCAGAGCAACGTTTAGTTGCAGCGAAAGTGATTAAACG
>EOG5B2RVQ|AMELL_prerelease2|Diodontus_minutus|C390388-608
GAAATATTCCCCAGCTGCACATAAGTTACAAACCTCAAAAGATCAGTCCTAAATCCCAAGGCATCGTGCGGCAATTATTGCACGAAAAAATCAGGGATGCTTATGTTCATCCTCAGTTCGTAACCGACGTTATGAAGCCATTGAAGATAGACGATATTATGGACCAAGAGGTACAGAATTTATCAGGAGGAGAATTGCAGCGAGTTGCGTTAGCTTTGTGTCTCGGAAAGCCTGCCGACGTTTATCTGATCGATGAACCGTCCGCTTACCTGGATTCTGAGCAGCGTTTGGTTGCCGCTAAAGTAATAAAACG
>EOG5B2RVQ|AMELL_prerelease2|Philanthus_triangulum|scaffold5142-608
GAAGTATCCCACAATTGCACATCAGTTATAAACCACAGAAAATAAGTCCTAAATCACAAGGTATCGTTCGGCAGTTATTGCATGAAAAAATTAGGGACGCCTATGTTCATCCACAATTCGTAACGGATGTTATGAAGCCTTTAAAGATAGATGATATTATGGATCAAGAAGTCCAGAATCTTTCTGGAGGTGAATTGCAGCGGGTTGCCTTGGCTCTATGTCTTGGAAAGCCTGCCGACGTTTACCTAATTGACGAACCATCTGCGTATTTAGATTCTGAACAACGTTTAGTGGCAGCTAAAGTAATAAAACG
>EOG5B2RVQ|AMELL_prerelease2|Tachysphex_fulvitarsis|scaffold9250-608
GAAGTATTCCGCAACTTCACATCAGTTATAAGCCGCAGAAAATAAGCCCAAAGTCTCAAGGAATTGTCCGACAACTGCTGCATGATAAGATTCGGGATGCATACGTGCATCCACAGTTCGTGACCGATGTCATGAAGCCCTTGAAGATAGATGATATTATAGAGCAAGAGGTACAGAATCTCTCTGGAGGAGAATTGCAGAGAGTAGCTTTGGCTCTGTGTCTTGGAAAACCAGCCGACGTTTACTTGATAGACGAACCGTCGGCTTACCTGGATTCCGAGCAACGTCTTGTAGCTGCCAAAGTTATAAAACG
>EOG5B2RVQ|AMELL_prerelease2|Podalonia_hirsuta|C366127-608
GCAGCATCCCCCAGCTGCACATCAGCTACAAGCCGCAGAAGATCAGCCCGAAGTCCCAGGGGATCGTCAGGCAGCTCCTCCACGAGAAGATCCGCGACGCTTACGTCCATCCCCAGTTCGTCACAGACGTGATGAAGCCGTTGAAGATCGACGACATTATGGACCAGGAGGTTCAGAATCTGTCCGGTGGTGAGCTCCAGAGGGTCGCCCTGGCCCTTTGCCTGGGCAAACCAGCGGACGTCTACCTGATCGACGAACCGTCCGCCTATTTGGACTCTGAGCAGCGTCTGGTCGCGGCTAAAGTCATCAAACG
>EOG5B2RVQ|AMELL_prerelease2|Pemphredon_lugens|scaffold11705-608
GAAATATTCCCCAACTGCACATAAGTTACAAACCTCAAAAGATAAGTCCTAAATCTCAAGGTATTGTGCGACAATTATTGCACGAGAAAATCAGGGATGCTTATGTACATCCTCAGTTCGTAACGGATGTTATGAAACCTTTGAAGATAGATGATATTATGGATCAAGAAGTACAGAATCTGTCTGGAGGAGAGTTACAGCGTGTGGCTTTAGCGCTGTGTCTTGGAAAACCTGCCGATGTTTATCTGATTGACGAACCATCTGCTTACTTGGATTCCGAGCAGCGTTTGGTTGCAGCTAAAGTGATAAAACG
>EOG5B2RVQ|AMELL_prerelease2|Trypoxylon_figulus|C240503-608
GAAGTATTCCTCAACTGCATATAAGTTACAAGCCACAGAAAATCAGTCCAAAATCTCAAGGAATCGTGCGTCATCTGCTACACGATAAGATCCGGGACGCATACGTGCATCCCCAATTCGTAACCGATGTTATGAAACCATTGAAAATCGACGATATTATGGAACAGGAAGTACAAAATTTGTCTGGAGGAGAATTACAGCGAGTAGCATTGGCCTTGTGTCTTGGGAAACCGGCTGACGTTTATTTAATCGATGAACCCTCTGCTTATTTGGATTCCGAGCAACGTTTAGTAGCCGCTAAAGTCATCAAGAG
>EOG5B2RVQ|AMELL_prerelease2|Sceliphron_curvatum|scaffold10018-608
GAAGTATTCCGCAGCTACACATCAGTTATAAACCACAAAAAATAAGCCCGAAATCTCAAGGCATGGTGCGACAATTGTTGCATGAGAAAATCAGAGACGCTTATGTGCATCCTCAGTTCGTGACGGATGTAATGAAGCCTCTGAAGATAGATGATATTATGGACCAGGAAGTGCAAAATCTTTCTGGGGGAGAATTACAAAGAGTTGCTTTGGCACTTTGTCTCGGAAAACCTGCAGATGTTTATCTGATTGATGAACCGTCAGCTTACTTGGACTCTGAACAACGTTTAGTTGCAGCTAAAGTAATAAAACG
>EOG5B2RVQ|AMELL_prerelease2|Psenulus_fuscipennis|C386422-335
GAAGTATTCCTATGTTACACATCAGTTATAAGCCGCAGAAAATCAGTCCTAAATCGCAGGGCATCGTTCGACAATTGTTGCACGAAAAAATTCGAGATGCCTATGTTCATCCTCAATTCATGACCGACGTGATGAAACCACTAAAGATCGACGACATTATGGACCAAGAGGTGCAGAATCTCTCTGGAGGAGAATTGCAACGAGTCGCTTTGGCACTATGTCTCGGAAAACCTGCCGATGTTTATCTGATCGATGAACCTTCGGCGTATTTGGATTCCGAGCAACGTTTGGTCGCCGCTAAAGTGATAAAACG
>EOG5B2RVQ|AMELL_prerelease2|Sphex_funerarius|scaffold12137-608
GAAGCATTCCTCAGCTGCACATAAGCTACAAACCACAGAAGATCAGCCCGAAGTCCCAAGGGATAGTACGTCAACTGTTGCACGAGAAGATCCGGGACGCGTACGTGCATCCTCAGTTCGTCACTGACGTGATGAAGCCGTTGAAGATCGACGACATTATGGACCAAGAGGTCCAGAATCTCTCCGGAGGAGAGCTTCAAAGGGTCGCGTTAGCCCTTTGCCTTGGAAAACCGGCCGACGTTTACCTCATCGACGAACCCTCGGCTTATCTCGACTCTGAGCAGCGTCTCGTCGCTGCCAAGGTCATCAAACG
>EOG5B2RVQ|AMELL_prerelease2|Sphecius_convallis|scaffold8236-594
GAAGTATTCCACAGTTGCACATCAGTTATAAGCCGCAGAAAATAAGTCCTAAGTCTCAGGGTATAGTGCGGCAGTTGTTGCACGAAAAGATCAGAGATGCTTATGTTCACCCGCAGTTCGTGACGGATGTAATGAAACCTCTAAAGATAGATGATATTATGGATCAGGAAGTACAGAATTTATCTGGAGGTGAACTGCAGCGTGTCGCTTTGGCTCTATGCCTCGGTAAACCCGCCGATGTATATTTAATTGATGAACCTTCCGCCTATTTGGACTCCGAGCAACGTTTAGTTGCTGCTAAAGTTATTAAACG
>EOG5B2RVQ|HSALT_3.3|Nysson_niger|C278670-608
ATAGTATACCTATGTTGCACATTAGTTACAAACCACAAAAAATCAGTCCTAAATCGCAGGGTATAGTTCGGCAGCTGTTGCATGAAAAGATTAGAGACGCATATGTTCATCCTCAGTTCGTAACAGATGTAATGAAACCACTCAAGATAGATGATATAATGGATCAGGAAGTACAGAATCTGTCAGGAGGTGAATTACAGCGAGTTGCTTTAGCTCTCTGCTTGGGTAAACCTGCCGATGTTTACCTGATCGACGAACCTTCGGCATACTTGGATTCCGAGCAACGTTTAGTTGCCGCCAAAGTGATTAAACG
>EOG5B2RVQ|HSALT_3.3|Harpactus_elegans|scaffold8565-608
AAAGTATTCCTCAGCTGCACATCAGCTACAAGCCGCAGAAGATCAGTCCGAAGTCGCAGGGCATCGTACGGCAGCTGTTGCACGAGAAGATCCGCGACGCGTACGTTCATCCGCAGTTCGTCACGGACGTGATGAAGCCGCTGAAGATCGACGACATCATGGACCAGGAGGTGCAGAACTTGTCCGGGGGTGAATTGCAGCGAGTCGCCCTGGCTCTCTGCCTTGGCAAGCCCGCCGACGTTTACTTGATCGACGAACCCTCCGCGTACCTGGACTCCGAGCAGCGTTTGGTAGCCGCCAAAGTTATCAAGCG
>EOG5B2RVQ|AMELL_prerelease2|Dinetus_pictus|scaffold4426-608
GTTTATCATAGTAGTGGAGCACGATCTGTCGGTACTGGATTACTTGTCAGACTTCATTTGCTGTCTATATGGCGTTCCTGGTGCTTATGGTGTGGTAACTATGCCTTTCTCTGTGCGGGAAGGTATTAATATTTTCCTCGATGGTTTCGTTCCCACCGAGAATTTGAGATTCCGCGAGGAATCTCTTGTCTTCAAGGTCGCGGAGAGTGCGACGGAAGAAGAAGTTAAACGTATGAATCATTATGAATACCCCGCAATGTCGAAAACAATGGGTACCTTCACACTACGTGTTGAGAAGGGCCAGTTTACTGATTCTGAAATACTCGTGCTACTGGGCGAAAACGGAACAGGAAAAACCACGTTCATTAGGATGTTGGCGGGCAATCTACCACCCGATGATGGTTCTG
>EOG5B2RVQ|AMELL_prerelease2|Alysson_spinosus|scaffold7054-608
GTTTATAATCGTGGTGGAGCACGATCTCTCGGTGCTGGATTATTTGTCTGATTTTATTTGCTGCCTGTACGGCGTGCCCGGTGCTTACGGTGTAGTAACTATGCCCTTCTCGGTGAGAGAAGGTATCAATATCTTCCTGGACGGCTTTGTACCTACCGAGAATCTACGTTTCCGTGAAGAATCGCTGGTCTTCAAAGTCGCAGAGAGCGCGACCGAGGAGGAAGTGAAGCGTATGAATCACTATGAGTATCCTGCTATGTCGAAAACAATGGGCTCGTTCACGCTGTGCGTCGAGAAGGGTCAATTCACGGACTCGGAAATACTCGTGCTACTCGGCGAGAATGGTACCGGAAAGACGACTTTCATCAGAATGTTGGCCGGCAATTTGCCGCCCGACGATGGCTCTG
>EOG5B2RVQ|AMELL_prerelease2|Chalybion_californicum|scaffold11527-608
GTTTATCATCGTAGTAGAACATGATCTATCCGTATTGGATTATTTATCCGATTTTATTTGTTGTCTCTACGGTGTTCCTGGAGCTTACGGTGTTGTAACTATGCCTTTCTCAGTAAGAGAAGGCATTAACATTTTCCTGGACGGTTTTGTGCCAACTGAGAATTTAAGATTCCGCGAGGAATCTCTCGTTTTTAAAGTAGCTGAAAGTGCAACTGAAGAAGAAGTAAAGCGTATGAATCACTACGAATATCCCGCAATGACGAAAACAATGGGATCTTTCACATTAAACGTTGAGAAAGGTCAATTTACTGATTCGGAAATTCTCGTGTTATTGGGAGAAAACGGAACAGGCAAAACAACGTTTATTAGAATGTTGGCTGGTAATTTAGCACCCGATGAAGGGTCCG
>EOG5B2RVQ|AMELL_prerelease2|Cerceris_arenaria|C324321-605
ATTCATTATAGTAGTGGAACACGATCTATCAGTTTTAGACTATTTATCTGATTTTATATGTTGCCTTTATGGTGTTCCCGGTGCTTATGGCGTCGTTACAATGCCTTTCTCCGTAAGAGAAGGCATAAACATTTTCCTCGATGGTTTCGTGCCGACAGAGAATTTAAGATTCCGCGAAGAATCTCTCGTTTTCAAAGTGGCAGAAAGCGCGACCGAGGAGGAAGTAAAACGTATGAATCACTATGAATATCCTGCGATGACAAAGACAATGGGTTCTTTTAAATTGAACGTCGAGAAAGGCCAATTCACTGATTCCGAAATTCTCGTACTACTCGGTGAAAACGGAACAGGGAAGACTACGTTTATTAGAATGTTGGCTGGTAATCTAGGACCTGATGACGGATCTG
>EOG5B2RVQ|HSALT_3.3|Gorytes_laticinctus|C303653-611
GTTCATCATCGTCGTTGAACACGACTTGTCAGTCTTGGATTATCTATCAGATTTCATCTGCTGTCTGTACGGCGTTCCCGGCGCTTACGGTGTCGTTACTATGCCTTTCTCCGTGCGAGAAGGTATCAACATTTTCCTCGATGGCTTCGTGCCAACTGAAAATCTGAGATTCCGCGAGGAATCGCTGGTTTTCAAAGTCGCCGAGAGCGCGACCGAAGAGGAAGTGAAGCGTATGAACCATTACGAGTACCCCGCGATGACGAAGACGATGGGTTCTTTCGAACTTCGCGTCGAGAAGGGTCAGTTCACCGACTCTGAAATACTCGTGCTACTGGGCGAGAACGGAACAGGCAAGACGACGTTCATTAGAATGTTGGCTGGTAACCTCCCCCCCAATGATGGATCTG
>EOG5B2RVQ|LHUMI|Crossocerus_quadrimaculatus|scaffold6786-610
GTTCATCATTGTCGTAGAGCATGACTTATCTGTGCTGGACTATTTGTCTGACTTCATTTGCTGTCTGTACGGAGTTCCCGGTGCTTATGGTGTGGTTACTATGCCCTTCTCGGTGAGAGAAGGTATTAATATTTTCCTCGATGGTTTCGTTCCGACGGAAAACTTGAGATTCCGTGAGGAGTCCCTAGTTTTTAAAGTAGCGGAGAGTGCGAACGAAGAAGAAATTAAACGTATGAATCACTATGAGTATCCATCGATGAGAAAAACCATGGGTTCCTTTACACTAAGGGTTGAGAAGGGTCAATTTACCGACTCGGAGATCCTCGTTTTACTGGGCGAGAACGGAACAGGAAAAACAACGTTTATCAGAATGCTGGCTGGAAATTTGCCAGCTGACGATGGCTCGG
>EOG5B2RVQ|AMELL_prerelease2|Isodontia_mexicana|scaffold17238-608
GTTCATAATCGTCGTCGAGCACGATCTGTCCGTGTTAGACTACCTGTCGGACTTCATCTGCTGCCTCTACGGTGTGCCAGGCGCCTACGGCGTAGTGACGATGCCGTTCTCCGTGAGGGAGGGTATAAACATCTTCCTCGACGGCTTCGTACCAACGGAGAACCTACGTTTCCGCGAGGAATCATTGGTATTCAAAGTAGCGGAGAGCGCGACCGAGGAAGAAGTGAAACGAATGAATCATTACGAGTATCCGTCGATGACGAAGACGATGGGCTCGTTCACGTTGAACGTCGAGAAGGGACAGTTCACTGACTCGGAGATACTCGTTCTGTTAGGGGAGAACGGGACTGGCAAGACTACGTTCATCCGGATGCTCGCTGGGAACCTACCGCCGGACGATGGTTCTG
>EOG5B2RVQ|AMELL_prerelease2|Prionyx_kirbii|scaffold1266-608
GTTTATAATCGTGGTCGAGCACGATCTATCCGTGCTGGATTATCTGTCGGACTTCATCTGCTGTCTCTATGGCGTTCCGGGAGCGTACGGCGTTGTCACGATGCCGTTCTCGGTCCGAGAAGGGATTAACATCTTCCTGGATGGATTTGTGCCAACGGAGAATCTCCGCTTCCGCGAGGAATCTCTGGTCTTTAAGGTAGCTGAGAGCGCGACCGAGGAGGAAGTGAAGAGGATGAATCACTACGAGTACCCGGCCATGACCAAGACGATGGGCTCGTTCACGCTGAACGTGGAGAAGGGTCAGTTCACGGACTCGGAGATTCTGGTGCTATTGGGGGAGAACGGGACTGGGAAGACGACGTTCATCAGAATGCTCGCGGGGAATCTCGCGCCGGACGATGGCTCTG
>EOG5B2RVQ|AMELL_prerelease2|Oxybelus_bipunctatus|C417613-608
GTTTATAATAGTTGTAGAACACGACTTGGCAGTACTGGACTACTTGTCTGATTTCATCTGTTGTTTATATGGAGTTCCTGGTGCTTATGGCGTAGTCACTATGCCTTTCTCTGTACGAGAAGGTATCAACATTTTCCTTGATGGTTTTGTGCCAACAGAGAACTTGAGATTCCGAGAGGAATCTCTTGTTTTTAAAGTTGCTGAGAGTGCAACCGAAGAAGAAATTAAACGTATGAATCAATACGAATATCCAGCAATGGCAAAATCAATGGGTTCGTTCACATTAAATGTCGAAAAGGGTCAATTTACTGATTCTGAGATTCTTGTATTATTGGGTGAAAATGGAACTGGAAAAACAACGTTTATCAGAATGCTTGCGGGCAATCTACCGCCGGATGATGGTTCTG
>EOG5B2RVQ|AMELL_prerelease2|Diodontus_minutus|C390388-608
ATTTATAATAGTCGTGGAGCACGATCTATCAGTTTTGGACTATCTGTCCGACTTTATCTGTTGCCTTTACGGAGTTCCTGGAGCATACGGTGTGGTTACTATGCCTTTCTCTGTAAGGGAAGGAATAAACATTTTCCTGGATGGTTTCGTTCCGACGGAAAATTTAAGATTCCGCGAGGAGTCTCTTGTTTTTAAAGTAGCTGAAAGTGCGACAGAGGAAGAGGTGAAACGCATGAATCATTATGAATATCCCTCAATGACAAAAACAATGGGTTCGTTCACGTTGCGCGTTGAGAAAGGTCAGTTCACCGATTCCGAGATTCTTGTGTTACTCGGTGAAAATGGAACAGGAAAGACAACGTTCATTAGAATGTTGGCCGGTAATTTGCCGCCCGACGACGGTTCCG
>EOG5B2RVQ|AMELL_prerelease2|Philanthus_triangulum|scaffold5142-608
ATTTATAATCGTAGTGGAGCATGATCTCTCAGTATTGGATTATTTATCCGATTTCATTTGCTGTCTCTATGGTGTTCCTGGTGCTTATGGTGTTGTTACTATGCCTTTTTCTGTAAGAGAAGGTATAAACATTTTCCTGGATGGTTTTGTTCCAACGGAAAATTTAAGATTCCGTGAGGAATCTCTTGTTTTCAAAGTAGCAGAAAGTGCTACTGAAGAAGAAGTAAAACGGATGAATCATTACGAATATCCCGCAATGGTAAAAACAATGGGATCTTTTATGTTGACCGTTGAGAGGGGTCAGTTCACGGATTCGGAAATTCTAGTTCTACTTGGTGAAAATGGAACAGGGAAAACAACATTTATTCGAATGTTGGCTGGTAATTTAGCTCCTGATGATGGCTCTG
>EOG5B2RVQ|AMELL_prerelease2|Tachysphex_fulvitarsis|scaffold9250-608
GTTTATAATTGTGGTAGAACACGACTTGTCGGTGCTAGATTATTTATCCGACTTTATTTGTTGTCTGTATGGTGTTCCTGGTGCTTATGGCGTTGTTACAATGCCCTTCTCCGTCAGGGAAGGTATTAATATCTTTCTGGACGGTTTTGTTCCAACCGAAAACTTGAGATTCCGTGAAGAATCCCTTGTCTTCAAAGTTGCGGAGAGTGCAACTGAAGAAGAAGTTAAACGCATGAACCACTACGAGTATCCCGCTATGGTAAAAACAATGGGTTCTTTCCAGCTGCATGTTGAAAAGGGCCAATTTACTGATTCCGAGATCCTTGTGCTCCTGGGTGAGAATGGCACCGGTAAAACAACATTTATTAGAATGTTGGCTGGTAACCTACCACCTGATGATGGTTCTG
>EOG5B2RVQ|AMELL_prerelease2|Podalonia_hirsuta|C366127-608
GTTCATAATCGTGGTCGAGCACGACCTCTCCGTCCTGGACTACCTCTCGGACTTCATCTGCTGCTTGTACGGTGTACCCGGTGCGTACGGTGTTGTTACAATGCCGTTCTCTGTGCGCGAGGGTATAAACATATTTCTGGACGGTTTCGTGCCCACTGAGAATCTACGATTCCGCGAGGAGTCGTTGGTGTTCAAGGTCGCGGAAAGCGCGACCGAGGAGGAGGTGAAACGGATGAACCACTACGAGTACCCGTCGATGACGAAGACGATGGGATCGTTCCTGCTGAACGTCGAGAAGGGACAGTTCACCGACTCGGAGATTTTGGTGCTATTGGGGGAGAACGGAACTGGAAAGACCACGTTCATCAGGATGCTGGCCGGGAATCTGGCACCGGACGACGGATCTG
>EOG5B2RVQ|AMELL_prerelease2|Pemphredon_lugens|scaffold11705-608
GTTCATCATAGTCGTAGAGCACGATCTATCAGTTTTGGACTATTTGTCCGATTTTATTTGTTGCCTTTACGGGGTTCCTGGAGCTTATGGTGTGGTTACTATGCCTTTTTCCGTAAGGGAAGGTATAAACATCTTCCTCGACGGTTTCGTTCCAACGGAAAATTTGAGATTCCGTGAGGAGTCCCTTGTTTTTAAAGTAGCTGAAAGTGCGACGGAGGAAGAAGTGAAACGCATGAATCATTATGAATATCCTTCAATGTCAAAAACAATGGGTTCTTTCACGTTGGTCGTTGAAAAAGGTCAGTTCACCGATTCAGAAATTCTTGTGTTACTCGGTGAAAATGGAACAGGAAAGACCACATTTATTAGAATGTTGGCTGGTAATTTGCCACCCGACGATGGGTCTG
>EOG5B2RVQ|AMELL_prerelease2|Trypoxylon_figulus|C240503-608
GTTTATAATAGTGGTAGAGCATGACTTGTCTGTCTTGGATTATTTATCCGACTTTATCTGCTGTCTCTACGGTGTTCCTGGTGCTTACGGTGTTGTGACGATGCCTTTCTCCGTCCGAGAAGGTATTAATATTTTCCTCGATGGTTTCGTGCCAACGGAAAATCTGAGATTCCGCGAGGAATCTCTTGTCTTCAAGGTTGCGGAAAGCGCAACTGAAGAAGAAGTTAAGCGTATGAATCATTACGAGTATCCGGCCATGGTCAAAACAATGGGTAACTTCCAATTGCATGTTGAAAAGGGACAGTTTACTGATTCGGAGATTTTGGTCTTACTCGGTGAAAATGGAACTGGGAAAACAACGTTCATCCGAATGCTTGCAGGCAATTTACCACCCGATGATGGTTCCG
>EOG5B2RVQ|AMELL_prerelease2|Sceliphron_curvatum|scaffold10018-608
GTTCATCATCGTCGTAGAACACGACCTGTCGGTATTGGATTATTTATCCGATTTTATCTGCTGCCTTTACGGTGTTCCTGGAGCCTACGGTGTCGTAACTATGCCTTTCTCAGTAAGGGAAGGCATTAATATTTTCCTTGACGGTTTTGTGCCAACTGAGAACTTGAGATTCCGCGAGGAATCTCTCGTTTTTAAGGTAGCTGAAAGTGCAACTGAAGAAGAGGTAAAGCGAATGAATCATTATGAGTATCCTGCGATGACGAAGGCAATGGGATGCTTTACATTGAACGTTGAGAAAGGTCAATTTACTGATTCGGAAATTCTTGTGTTATTGGGTGAAAACGGAACAGGAAAAACAACATTTATTAGAATGTTGGCTGGTAATTTAGCACCCGATGACGGATCAG
>EOG5B2RVQ|AMELL_prerelease2|Psenulus_fuscipennis|C386422-335
GTTCATCATAGTGGTGGAACACGATCTTTCGGTTCTGGACTATTTATCCGATTTTATCTGTTGCCTGTACGGTGTTCCTGGTGCTTACGGTGTCGTTACTATGCCTTTCTCCGTGAGGGAAGGTATTAACATTTTCCTAGACGGTTTCGTTCCGACGGAGAATCTGCGATTCCGCGAGGAGTCTCTCGTTTTCAAGGTAGCGGAGAGCGCGACCGAAGAAGAAGTGAAACGTATGAACCATTACGAATATCCAGCTATGGTTAAAACGATGGGTTCGTTCCAATTGAGGGTCGAGAAGGGTCAGTTTACCGATTCCGAGATTCTCGTGTTACTCGGTGAAAATGGAACCGGAAAGACAACGTTCATTAGAATGTTGGCTGGCAATTTACCGCCTGACGATGGATCTG
>EOG5B2RVQ|AMELL_prerelease2|Sphex_funerarius|scaffold12137-608
GTTCATCATCGTCGTGGAACACGACCTCTCGGTGCTCGACTACCTCTCCGATTTCATCTGTTGCCTCTACGGTGTACCCGGTGCATACGGAGTGGTCACGATGCCCTTCTCCGTGAGGGAGGGTATCAACATCTTCCTGGACGGGTTCGTGCCAACGGAGAACCTTCGGTTCCGAGAGGAGTCCCTGGTGTTCAAGGTAGCGGAGAGTGCCACCGAGGAAGAGGTGAAACGGATGAACCATTACGAGTACCCTGCCATGACCAAGACCATGGGCTCGTTCACTTTGAACGTGGAGAAGGGACAGTTCACCGACTCCGAGATACTGGTGCTCCTTGGGGAGAACGGGACCGGGAAGACAACCTTCATCAGGATGCTCGCTGGCAACCTACCCCCGGACGAAGGCTCTG
>EOG5B2RVQ|AMELL_prerelease2|Sphecius_convallis|scaffold8236-594
GTTTATAATAGTAGTAGAGCACGATCTGTCCGTGTTGGACTACCTATCTGACTTTATTTGTTGCCTGTATGGCGTACCCGGCGCTTACGGCGTCGTGACTATGCCTTTCTCTGTAAGAGAAGGTATAAACATTTTCCTGGACGGTTTTGTGCCAACGGAGAACTTGAGATTTCGCGAAGAGTCACTCGTTTTCAAAGTAGCTGAGAGTGCGACCGAAGAAGAGGTGAAGCGTATGAACCACTACGAATATCCCTCAATGACAAAAACGATGGGTTCCTTTATGCTTAATGTCGAGAAGGGTCAATTCACCGACTCTGAAATTCTCGTGTTGTTAGGCGAAAATGGAACAGGAAAAACAACTTTCATCAGAATGTTGGCCGGCAATTTACCCCCCGACGACGGTTCTG
>EOG5B2RVQ|HSALT_3.3|Nysson_niger|C278670-608
ATTTATAATAGTCGTAGAACACGATCTGTCCGTTTTGGATTATCTATCAGATTTTATTTGTTGCTTATATGGTGTTCCTGGTGCTTACGGAGTCGTAACTATGCCTTTCTCTGTAAGGGAAGGCATAAATATTTTCTTGGACGGTTTTGTTCCAACGGAAAACTTGAGATTCCGTGAAGAATCTCTCGTTTTCAAAGTAGCGGAAAGCGCTACAGAAGAGGAAGTAAAGCGTATGAATCACTACGAATATCCAGCTATGGTAAAAACCATGGGTTCTTTTAAATTAGTCGTGGAAAAGGGACAATTCACTGACTCTGAAATTCTCGTATTACTGGGCGAAAATGGAACGGGAAAGACAACGTTTATTAGAATGCTGGCCGGCAATTTGCCGCCCGACGATGGTTCTG
>EOG5B2RVQ|HSALT_3.3|Harpactus_elegans|scaffold8565-608
GTTCATCATAGTAGTGGAACACGACTTGTCTGTCCTGGATTATCTGTCCGACTTCATCTGCTGCCTGTACGGCGTTCCCGGTGCTTACGGTGTCGTCACTATGCCCTTCTCCGTGCGGGAAGGCATCAACATTTTCCTGGACGGCTTCGTGCCGACGGAAAATCTGCGGTTCCGCGAGGAATCGCTCGTCTTCAAGGTCGCAGAGAGTGCGACCGAGGAGGAAGTGAAGCGTATGAATCACTACGAGTACCCCGCGATGACGAAGACAATGGGCTCGTTCAAGCTGAACGTCGAGAAGGGTCAGTTCACCGACTCGGAAATTCTGGTCCTGCTGGGTGAGAATGGGACCGGCAAAACGACGTTCATAAGAATGCTGGCTGGTAATCTACCACCCGACGATGGATCTG
>EOG5B2RVQ|AMELL_prerelease2|Dinetus_pictus|scaffold4426-608
ATTTAATGCACATACGCGATAGAGGGATCGACGCACTTTCCGGTGGAGAACTTCAACGCTTTGCGTGCGCCATGGTGTGCATTCAAAACGGAGACATTTTTATGTTTGACGAGCCTTCGTCTTATTTAGACGTGAAACAACGCTTGAACGCGGCCGTAACGATCCGATCCCTTATTCATCCGGAC
>EOG5B2RVQ|AMELL_prerelease2|Alysson_spinosus|scaffold7054-608
ACTTGCTGCATATACGCGATCGAGGAATTGAAGCACTCTCTGGAGGAGAGCTCCAACGTTTTGCTTGTGCCATGGTGTGCATTCAGGATGGAGATATTTTTATGTTTGATGAGCCATCCTCGTATTTGGACGTCAAGCAACGCTTGAATGCGGCTGTCACAATTCGATCGCTAATTCACCCAGAC
>EOG5B2RVQ|AMELL_prerelease2|Chalybion_californicum|scaffold11527-608
ATTTAATGCACATACGCGATAGAGGTATAGAAGCACTTTCTGGTGGAGAGCTGCAACGATTTGCTTGTGCAATGGTGTGTATTCAAAATGGGGACATTTTTATGTTTGATGAACCTTCCTCGTATTTAGACGTAAAGCAACGTTTAAATGCTGCCGTAACGATCCGATCTCTTATCCATCCAGAT
>EOG5B2RVQ|AMELL_prerelease2|Cerceris_arenaria|C324321-605
ATTTGCTTCACATACGTGACAGAGGAATTGACGCATTATCTGGTGGGGAATTGCAACGTTTTGCCTGTGCTATGGTATGCATCCAAAATGGAGATATTTTCATGTTCGACGAGCCTTCGTCATATTTAGATGTGAAACAGCGCCTTAACGCTGCTGTAACTATTCGATCTCTTATTCATCCGGAC
>EOG5B2RVQ|HSALT_3.3|Gorytes_laticinctus|C303653-611
ATTTGATGCACATACGTGACCGAGCAATCGAGGCCCTTTCTGGTGGAGAGCTTCAACGTTTCGCGTGCGCTATGGTGTGCATTCAGAACGGCGATATTTTTATGTTCGACGAGCCTTCCTCGTATCTGGACGTGAAGCAACGTTTAAACGCTGCCGTAACGATCCGATCTCTTATTCATCCGGAC
>EOG5B2RVQ|LHUMI|Crossocerus_quadrimaculatus|scaffold6786-610
ATTTGTTGCATATACGCGATAGAGGCATTGAAGCATTATCTGGTGGTGAGCTTCAACGTTTTGCGTGTGCCATGGTATGCATTCAGGACGGAGACATCTTTATGTTCGACGAGCCTTCTTCGTATTTGGATGTAAAGCAGCGATTGAACGCTGCCGTAACGATTCGTTCCCTTATTCATCCCGAC
>EOG5B2RVQ|AMELL_prerelease2|Isodontia_mexicana|scaffold17238-608
ACTTAATGCACATACGCGACAGAAGCATAGAGGCCCTCTCCGGAGGAGAGCTGCAGCGGTTCGCCTGCGCCATGGTTTGCATACAGAACGGAGACATATTCATGTTCGACGAGCCGTCGTCTTATCTGGACGTTAAGCAGCGCCTTAACGCAGCCGTCACCATCAGGTCTCTCATACATCCGGAC
>EOG5B2RVQ|AMELL_prerelease2|Prionyx_kirbii|scaffold1266-608
ACCTGATGCACATACGTGACAGGGGGATTGAAGCGCTATCCGGTGGAGAGTTGCAGCGGTTCGCCTGCGCTATGGTTTGTATCCAGAACGGGGACATCTTCATGTTCGACGAGCCATCCTCCTACCTGGATGTGAAACAGCGGTTGAACGCCGCCGTCACCATCCGCTCCCTCATACATCCGGAC
>EOG5B2RVQ|AMELL_prerelease2|Oxybelus_bipunctatus|C417613-608
ATCTGATGCACATTCGGGATAGAGGTATCGAGGCACTTTCTGGCGGAGAACTTCAGCGTTTTGCATGCGCCATGGTGTGCATTCAAGACGGAGATATTTTTATGTTTGATGAGCCATCTTCGTATTTGGATGTAAAACAGCGACTTAACGCTGCTAAGACAATTCGATCACTCATTCATCCAGAC
>EOG5B2RVQ|AMELL_prerelease2|Diodontus_minutus|C390388-608
ACTTGATGCACATACGTGACAGAGGTATCGACGCACTTTCCGGTGGAGAGCTTCAACGTTTCGCCTGCGCCATGGTGTGCATTCAGAATGGAGATATTTTCATGTTCGACGAGCCTTCTTCGTATTTAGACGTTAAGCAGCGTCTAAATGCAGCCGTAACGATCCGATCTCTCATTCATCCGGAT
>EOG5B2RVQ|AMELL_prerelease2|Philanthus_triangulum|scaffold5142-608
ATTTAATGCACATACGTGACAGAGGGATTGATGCACTTTCCGGTGGAGAGCTACAACGTTTTGCTTGTGCTATGGTATGCATTCAAAACGGAGATATTTTTATGTTTGATGAGCCATCTTCATATTTGGATGTAAAACAGCGTCTTAATGCAGCTGTGACTATTCGATCTCTCATTCATCCAGAC
>EOG5B2RVQ|AMELL_prerelease2|Tachysphex_fulvitarsis|scaffold9250-608
ACTTAATGCACATACGTGATAGAGGTATCGAAGCCTTATCCGGTGGAGAGCTTCAACGGTTTGCAATTGCTATGGTGTGCATTCAAAATGGAGATATCTTCATGTTCGATGAACCATCCTCATATCTGGACGTAAAACAACGTCTGAACGCTGCCTTAACAATTCGATCTCTTATCCACCCCGAC
>EOG5B2RVQ|AMELL_prerelease2|Podalonia_hirsuta|C366127-608
ACTTGATGCACATACGTGACAGGCCAATCGAAGCGCTATCCGGTGGAGAGCTGCAGCGGTTCGCCTGTGCCATGGTCTGCATACAGAATGGTGACATATTCATGTTCGATGAGCCATCCTCCTACCTGGACGTCAAGCAGAGGTTGAATGCAGCCGTTACCATCAGATCACTGATACATCCAGAC
>EOG5B2RVQ|AMELL_prerelease2|Pemphredon_lugens|scaffold11705-608
ACTTGCTGCACATACGTGACAGAGGTATCGATGCCCTTTCTGGTGGAGAGCTTCAGCGTTTTGCATGTGCCATGGTATGCATTCAAAACGGAGATATTTTTATGTTCGACGAGCCTTCTTCTTATTTGGATGTGAAGCAACGTCTAAATGCAGCCGTAACAATTCGATCTCTTATTCACCCAGAC
>EOG5B2RVQ|AMELL_prerelease2|Trypoxylon_figulus|C240503-608
ATTTAATGCATATACGAGATAGAAGTATCGAAGCCTTGTCAGGAGGAGAACTTCAGCGTTTCGCATGTGCCATGGTCTGCATTCAAGATGGAGATATTTTTATGTTCGACGAACCATCCTCTTATTTAGATGTGAAACAGCGTCTCAACGCTGCCGTAACGATTCGATCTCTCATTCATCCAGAC
>EOG5B2RVQ|AMELL_prerelease2|Sceliphron_curvatum|scaffold10018-608
ATTTAATGCATATACGCGATAGAGGTATAGAAGCACTTTCTGGTGGAGAACTGCAACGTTTTGCCTGTGCAATGGTCTGTATTCAAAACGGAGATATTTTTATGTTTGATGAGCCTTCCTCGTATTTAGACGTAAAGCAACGTTTAAATGCTGCCGTAACAATCCGGTCTCTTATCCACCCGGAC
>EOG5B2RVQ|AMELL_prerelease2|Psenulus_fuscipennis|C386422-335
--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------AAC
>EOG5B2RVQ|AMELL_prerelease2|Sphex_funerarius|scaffold12137-608
ACTTAATGCACATACGTGACAGAAGCATAGAGGCATTATCCGGTGGGGAGCTGCAGCGGTTCGCCTGCGCCATGGTGTGCATCCAGAACGGAGACATCTTCATGTTCGACGAGCCTTCTTCTTACCTAGACGTCAAGCAGCGCTTGAACGCTGCCGTAACCATCAGGTCTCTCATCCATCCTGAC
>EOG5B2RVQ|AMELL_prerelease2|Sphecius_convallis|scaffold8236-594
ACTTGATGCACATACGTGATCGAGGAATTGAAGCGCTCTCCGGTGGAGAACTTCAACGTTTTGCATGCGCCATGGTGTGCATTCAAAATGGAGATATTTTCATGTTCGACGAGCCTTCCTCGTATTTGGACGTGAAACAACGTCTTAACGCGGCCGTAACGATTCGATCTCTCATTCATCCGGAT
>EOG5B2RVQ|HSALT_3.3|Nysson_niger|C278670-608
ATTTACTGCATATACGTGATAGAGGAATTGAAGCTCTTTCTGGTGGTGAGCTTCAACGTTTTGCATGTGCTATGGTATGCATTCAAAATGGCGATATTTTTATGTTTGACGAACCGTCATCATATTTAGACGTAAAACAACGTTTAAATGCAGCTGTAACCATCCGATCTCTAATTCATCCAGAC
>EOG5B2RVQ|HSALT_3.3|Harpactus_elegans|scaffold8565-608
ATTTGCTGCACATACGCGACAGAGGAATTGAGGCACTTTCCGGTGGAGAGCTCCAGCGTTTCGCGTGCGCTATGGTGTGCATTCAGAACGGCGATATTTTCATGTTCGACGAGCCCTCCTCGTATCTAGACGTGAAGCAACGCTTAAACGCTGCCGTGACGATCCGATCTCTTATTCATCCCGAC