84 #include <common/ncbi_revision.h>
87 #ifndef NCBI_SC_VERSION
88 # define FLATFILE_PARSER_ENABLED
89 #elif (NCBI_SC_VERSION == 0)
90 # define FLATFILE_PARSER_ENABLED
93 #ifdef FLATFILE_PARSER_ENABLED
112 CSeq_loc& loc = *visitor;
131 return *left < *right;
139 CBioseq_set::GetTypeInfo(),
140 CBioseq::GetTypeInfo(),
141 CSeq_entry::GetTypeInfo(),
142 CSeq_submit::GetTypeInfo(),
148 if (content_type ==
"Bioseq-set")
151 auto& bioseq_set = obj->SetSet();
156 if (content_type ==
"Seq-submit")
163 if (content_type ==
"Seq-entry")
170 if (content_type ==
"Bioseq")
198 if (sType == CBioseq_set::GetTypeInfo()->GetName()) {
203 if (sType == CSeq_submit::GetTypeInfo()->GetName()) {
213 entry = *submit->
SetData().SetEntrys().begin();
216 if (sType == CSeq_entry::GetTypeInfo()->GetName()) {
221 if (sType == CSeq_annot::GetTypeInfo()->GetName())
238 }
while (sType == CSeq_annot::GetTypeInfo()->GetName());
268 reader.
SetAllGap(args[
"aln-gapchar"].AsString());
269 reader.
SetMissing(args[
"aln-gapchar"].AsString());
270 if (args[
"aln-alphabet"].AsString() ==
"nuc") {
283 if (pSeqEntry && args[
"a"]) {
293 auto it = s_StringToClass.
find(args[
"a"].AsString());
294 if (it != s_StringToClass.
end()) {
295 pSeqEntry->SetSet().SetClass(it->second);
339 "File format not supported", 0);
350 pReader->SetGapLinkageEvidence(
417 #ifdef FLATFILE_PARSER_ENABLED
441 mAtSequenceData(
false)
496 const string sType = pObjIstrm->ReadFileHeader();
497 if (sType == CSeq_descr::GetTypeInfo()->GetName())
502 out_desc->
Set().insert(out_desc->
Set().end(), descr->
Get().begin(), descr->
Get().end());
504 else if (sType == CSeqdesc::GetTypeInfo()->GetName())
509 out_desc->
Set().push_back(desc);
511 else if (sType == CPubdesc::GetTypeInfo()->GetName())
516 out_desc->
Set().push_back(desc);
520 throw runtime_error(
"Descriptor file must contain "
521 "either Seq_descr or Seqdesc elements");
525 throw runtime_error(
"Unable to read descriptor from file:" + ex.
GetMsg());
537 string sType = pObjIstrm->ReadFileHeader();
540 if( sType == CSeq_entry::GetTypeInfo()->GetName() ) {
543 }
else if( sType == CBioseq::GetTypeInfo()->GetName() ) {
548 }
else if( sType == CSeq_submit::GetTypeInfo()->GetName() ) {
555 throw runtime_error(
"Seq-submit template must contain "
556 "exactly one Seq-entry");
558 }
else if( sType == CSubmit_block::GetTypeInfo()->GetName() ) {
574 }
else if ( sType == CSeqdesc::GetTypeInfo()->GetName()) {
578 "Submit-block. Object seems to be of type: " << sType);
594 if (ent_iter->IsSetDescr())
596 descr = &ent_iter->GetDescr();
601 tmp->SetSeq().SetInst();
605 switch ((*desc_iter)->Which())
614 desc->
Assign(**desc_iter);
615 tmp->SetSeq().SetDescr().Set().push_back(desc);
621 if (
tmp->IsSetDescr() && !
tmp->GetDescr().Get().empty())
627 if (!pObjIstrm->EndOfData())
629 if (sType != CSeqdesc::GetTypeInfo()->GetName())
630 sType = pObjIstrm->ReadFileHeader();
632 while (sType == CSeqdesc::GetTypeInfo()->GetName()) {
652 if (pObjIstrm->EndOfData())
656 sType = pObjIstrm->ReadFileHeader();
668 pub->
SetSub().
Assign(context.m_submit_template->GetSub().GetCit());
676 throw runtime_error(
"The Seq-entry must be a Bioseq not a Bioseq-set.");
690 if( args[
"output-type"].AsString() ==
"Seq-entry" ) {
699 class AllowedDuplicates:
public set<CSeqdesc_Base::E_Choice>
707 AllowedDuplicates m_allowed_duplicates;
709 template<
typename _which>
712 typename _which::E_Choice compare_to;
713 bool operator() (_which l)
const
715 return l.Which() == compare_to;
719 return l->Which() == compare_to;
734 bool duplicates = (m_allowed_duplicates.find(
source.Which()) != m_allowed_duplicates.end());
737 desc.Set(duplicates).Assign(
source);
772 bool post_process =
false;
776 "Specified GFF3 file does not include any sequence data", 0);
786 for (
auto pAnnot : annots) {
793 const string& objectType,
794 unique_ptr<istream>& pIstr,
817 "File format not recognized", 0);
861 istream.
get().open(filename);
866 if (input_sequence.
Empty())
868 "File format not recognized", 0);
871 input_sequence =
xApplyTemplate(input_sequence, merge_template_descriptors);
881 entry = submit->
SetData().SetEntrys().front();
903 CopyDescr(*seq, *entry);
904 CopyAnnot(*seq, *entry);
910 if (merge_template_descriptors) {
916 "Template file descriptors are ignored if input is ASN.1");
918 *unique_ptr<CLineError>(
962 for (
const auto& msg : readerListener) {
976 for (
auto pFeat :
ftable) {
977 if (pFeat->IsSetDbxref()) {
978 auto& dbxrefs = pFeat->SetDbxref();
979 auto it =
remove_if(dbxrefs.begin(), dbxrefs.end(),
981 return(pDbtag && pDbtag->IsSetDb() &&
982 NStr::EqualNocase(pDbtag->GetDb(),
"GenBank"));
984 dbxrefs.erase(it, dbxrefs.end());
985 if (dbxrefs.empty()) {
986 pFeat->ResetDbxref();
995 unsigned int startingLocusTagNumber = 1;
996 unsigned int startingFeatureId = 1;
997 for (
auto it = annots.begin(); it != annots.end(); ++it) {
1000 auto& data = annot.SetData();
1001 if (!data.IsFtable() || data.GetFtable().empty()) {
1007 edit::CFeatTableEdit fte(
1014 "GFF annotation requires locus tags, which are missing from one or more genes, so the command line argument -locus-tag-prefix is needed");
1016 fte.GenerateLocusTags();
1018 fte.GenerateProteinAndTranscriptIds();
1020 fte.ProcessCodonRecognized();
1021 fte.EliminateBadQualifiers();
1022 fte.SubmitFixProducts();
1024 startingLocusTagNumber = fte.PendingLocusTagNumber();
1025 startingFeatureId = fte.PendingFeatureId();
1059 "Descriptor file seems to be in an unsupported format: "
1067 unique_ptr<CObjectIStream> pObjIstrm(
1084 if (annots.empty()) {
1151 if (ext ==
".gff" || ext ==
".gff3")
1160 if (ext ==
".asn" || ext ==
".sqn" || ext ==
".sap")
1165 LOG_POST(
"Presuming annotation format by filename suffix: "
1179 string seqid_prefix;
1204 #ifdef FLATFILE_PARSER_ENABLED
1211 if (pEntry && pEntry->IsSetAnnot()) {
1212 annots = pEntry->GetAnnot();
1220 "Annotation file format not recognized. Run format validator on your annotation file", 1);
1223 if (!annots.empty()) {
1224 loader.
Init(annots);
1269 auto idString = pAnnotId->GetSeqIdString();
1271 auto it = annotMap.
find(idString);
1272 if (it == annotMap.
end()) {
1276 it->second.push_back(pAnnot);
1289 while ((pAnnot = annot_loader.
GetNextAnnot()).NotEmpty()) {
1302 auto& bioseqAnnots = bioseq.
SetAnnot();
1303 auto it = find_if(bioseqAnnots.begin(),
1307 return (pAnnot && pAnnot->IsFtable());
1309 if (it != bioseqAnnots.end()) {
1313 return pBioseqAnnot;
1322 for (
auto pAnnot : annots) {
1323 objects::edit::CFeatTableEdit featEdit(*pBioseqAnnot);
1324 featEdit.MergeFeatures(pAnnot->SetData().SetFtable());
1331 if (!pBioseqAnnot) {
1332 pBioseqAnnot = annots.front();
1333 bioseq.
SetAnnot().push_back(pBioseqAnnot);
1334 auto it =
next(annots.begin());
1335 while (it != annots.end()) {
1336 objects::edit::CFeatTableEdit featEdit(*pBioseqAnnot);
1337 featEdit.MergeFeatures((*it)->SetData().SetFtable());
1342 for (
auto pAnnot : annots) {
1343 objects::edit::CFeatTableEdit featEdit(*pBioseqAnnot);
1344 featEdit.MergeFeatures(pAnnot->SetData().SetFtable());
1350 const string& idString,
1357 matchMap.emplace(it->first, it);
1360 return !matchMap.
empty();
1365 const string& idString,
1370 if (matchVersions) {
1374 bool hasMatch =
false;
1376 shared_lock<shared_mutex> sLock{
m_Mutex};
1382 unique_lock<shared_mutex> uLock{
m_Mutex};
1383 for (
auto match : matchMap) {
1384 const auto& annotId =
match.first;
1385 auto it =
match.second;
1386 if (matchedAnnots.
insert(annotId).second) {
1388 annots.splice(annots.end(), it->second);
1398 const string& idString,
1403 shared_lock<shared_mutex> sLock{
m_Mutex};
1404 auto it = annotMap.
find(idString);
1405 if (it == annotMap.
end()) {
1408 string annotId = it->first;
1412 unique_lock<shared_mutex> uLock{
m_Mutex};
1413 if (matchedAnnots.
insert(annotId).second) {
1414 annots = move(it->second);
1429 for (
auto pSeqId : bioseq.
GetId()) {
1430 list<CRef<CSeq_annot>> annots;
1431 bool hasMatch =
false;
1432 bool matchVersions = (pSeqId->GetTextseq_Id() ==
nullptr);
1433 auto idString = pSeqId->GetSeqIdString();
1435 hasMatch =
x_HasMatch(matchVersions, idString, annotMap, matchedAnnots, annots);
1438 pSeqId->IsGeneral() &&
1439 pSeqId->GetGeneral().IsSetDb() &&
1441 pSeqId->GetGeneral().IsSetTag() && pSeqId->GetGeneral().GetTag().IsStr()) {
1442 matchVersions =
true;
1443 idString = pSeqId->GetGeneral().GetTag().GetStr();
1445 hasMatch =
x_HasMatch(matchVersions, idString, annotMap, matchedAnnots, annots);
1453 for (
auto pAnnot : annots) {
1485 #ifdef FLATFILE_PARSER_ENABLED
1488 unique_ptr<Parser> pp(
new Parser);
1509 "This flat file format is not supported: " + filename, 0);
1522 auto obj = ffparser.
Parse(*pp, filename);
1525 if (obj->GetThisTypeInfo() == CBioseq_set::GetTypeInfo())
1530 auto& annot = entry->SetAnnot();
1531 for (
auto& bioseq : bioseq_set->SetSeq_set())
1533 if (bioseq->IsSetAnnot())
1534 annot.splice(annot.end(), bioseq->SetAnnot());
1536 if (entry->IsSetAnnot())
User-defined methods of the data storage class.
User-defined methods of the data storage class.
User-defined methods of the data storage class.
User-defined methods of the data storage class.
void g_LogGeneralParsingError(EDiagSev sev, const string &idString, const string &msg, objects::ILineErrorListener &listener)
void remove_if(Container &c, Predicate *__pred)
class CAlnReader supports importing a large variety of text-based alignment formats into standard dat...
void Read(bool guess, bool generate_local_ids=false, objects::ILineErrorListener *pErrorListener=nullptr)
void SetAlphabet(const string &value)
CRef< objects::CSeq_entry > GetSeqEntry(TFastaFlags fasta_flags=objects::CFastaReader::fAddMods, objects::ILineErrorListener *pErrorListener=nullptr)
void SetMissing(const string &value)
void SetAllGap(const string &value)
Convenience function for setting beginning, middle, and end gap to the same thing.
TAnnots::iterator m_annot_iterator
CMultiReader::TAnnots TAnnots
ILineErrorListener * m_logger
CRef< CSeq_annot > GetNextAnnot()
CRef< ILineReader > m_line_reader
bool Init(const string &seqid_prefix, unique_ptr< istream > &instream, ILineErrorListener *logger)
bool Init(const TAnnots &annots)
Modification of the CFastaReader class that allows for reading a single sequence as a degenarate mult...
@ fAllIdsAsLocal
= 0x100 (Do not attempt to parse accessions)
@ fLeaveProteinIds
= 0x80 (Leave all protein_id as a qualifiers)
@ fCreateGenesFromCDSs
= 0x10 (If a CDS has a gene xref, create a gene with the same intervals if one doesn't already exist....
@ fPreferGenbankId
= 0x200 (Prefer Genbank accession ids)
CRef< CSeq_annot > ReadSequinFeatureTable(const TFlags flags=0, ITableFilter *filter=nullptr, const string &seqid_prefix=kEmptyStr)
CRef< CSerialObject > Parse(Parser &parseInfo)
void ConvertNs2Gaps(CSeq_entry &entry)
bool AtSequenceData() const
void ReadSeqAnnots(TAnnotList &, CNcbiIstream &, ILineErrorListener *=nullptr) override
Read all objects from given insput stream, returning them as a vector of Seq-annots.
shared_ptr< CGff3LocationMerger > GetLocationMerger()
static CLineError * Create(EProblem eProblem, EDiagSev eSeverity, const std::string &strSeqId, unsigned int uLine, const std::string &strFeatureName=string(""), const std::string &strQualifierName=string(""), const std::string &strQualifierValue=string(""), const std::string &strErrorMessage=string(""), const TVecOfLines &vecOfOtherLines=TVecOfLines())
Use this because the constructor is protected.
bool xGetAnnotLoader(CAnnotationLoader &loader, const string &filename)
void LoadGFF3Fasta(istream &in, TAnnots &annots)
static void GetSeqEntry(CRef< objects::CSeq_entry > &entry, CRef< objects::CSeq_submit > &submit, CRef< CSerialObject > obj)
list< CRef< CSeq_annot > > TAnnots
TAnnots xReadGFF3(CNcbiIstream &instream, bool post_process)
void MergeDescriptors(objects::CSeq_descr &dest, const objects::CSeq_descr &source) const
CMultiReader(CTable2AsnContext &context)
unique_ptr< CObjectIStream > xCreateASNStream(const string &filename) const
void LoadAnnotMap(const string &filename, TAnnotMap &annotMap)
CTable2AsnContext & m_context
void AddAnnots(TAnnotMap &annotMap, set< string > &matchedAnnots, CBioseq &bioseq) const
CRef< CSerialObject > ReadNextEntry()
bool x_HasMatch(bool matchVersions, const string &idString, TAnnotMap &annotMap, set< string > &matchedAnnots, list< CRef< CSeq_annot >> &annots) const
static const set< TTypeInfo > kSupportedTypes
CFormatGuess::EFormat xAnnotGetFormat(CNcbiIstream &) const
shared_ptr< objects::CGff3LocationMerger > m_gff3_merger
CRef< CSerialObject > xReadASN1Binary(CObjectIStream &pObjIstrm, const string &content_type) const
bool AtSeqenceData() const
CRef< CSerialObject > FetchEntry(const CFormatGuess::EFormat &format, const string &objectType, unique_ptr< CNcbiIstream > &pIstr, TAnnotMap &annotMap)
void WriteObject(const CSerialObject &, ostream &)
void LoadDescriptors(const string &ifname, CRef< objects::CSeq_descr > &out_desc) const
bool x_HasExactMatch(const string &idString, TAnnotMap &annotMap, set< string > &matchedAnnots, list< CRef< CSeq_annot >> &annots) const
TAnnots xReadGTF(CNcbiIstream &instream)
void ApplyDescriptors(objects::CSeq_entry &obj, const objects::CSeq_descr &source) const
CRef< CSerialObject > xApplyTemplate(CRef< CSerialObject > obj, bool merge_template_descriptors) const
CRef< objects::CSeq_entry > xReadFasta(CNcbiIstream &instream)
CRef< objects::CSeq_entry > ReadAlignment(CNcbiIstream &instream, const CArgs &args)
void AddAnnotToMap(CRef< CSeq_annot > pAnnot, TAnnotMap &annotMap)
CFormatGuess::EFormat OpenFile(const string &filename, CRef< CSerialObject > &input_sequence, TAnnotMap &annotMap)
CRef< objects::CSeq_entry > xReadFlatfile(CFormatGuess::EFormat format, const string &filename)
void LoadTemplate(const string &ifname)
void x_PostProcessAnnots(TAnnots &annots) const
CFormatGuess::EFormat xInputGetFormat(CNcbiIstream &, CFileContentInfo *=nullptr) const
unique_ptr< CObjectIStream > m_obj_stream
CRef< CSerialObject > xReadASN1Text(CObjectIStream &pObjIstrm) const
static CRef< CSeq_id > AsSeqId(const string &rawId, long flags=0, bool localInts=true)
Convert a raw ID string to a Seq-id, based in given customization flags.
@ fAllIdsAsLocal
all identifiers are local IDs
@Seq_descr.hpp User-defined methods of the data storage class.
const TAnnot & GetAnnot(void) const
const CSeq_descr & GetDescr(void) const
bool IsSetAnnot(void) const
void ResetParentEntry(void)
void SetDescr(CSeq_descr &value)
bool IsSetDescr(void) const
Base class for all serializable objects.
Simple implementation of ILineReader for i(o)streams.
string m_genome_center_id
bool m_binary_asn1_output
objects::ILineErrorListener * m_logger
TSeqPos m_gap_Unknown_length
objects::CGapsEditor::TEvidenceSet m_DefaultEvidence
CRef< objects::CSeq_entry > m_entry_template
CRef< objects::CSeq_submit > m_submit_template
void MergeWithTemplate(objects::CSeq_entry &entry) const
string m_locus_tag_prefix
objects::CGapsEditor::TCountToEvidenceMap m_GapsizeToEvidence
objects::CBioseq_set::TClass m_ClassValue
void MakeGenomeCenterId(objects::CSeq_entry &entry) const
Template class for iteration on objects of class C.
const_iterator end() const
const_iterator lower_bound(const key_type &key) const
const_iterator find(const key_type &key) const
iterator_bool insert(const value_type &val)
static DLIST_TYPE *DLIST_NAME() next(DLIST_LIST_TYPE *list, DLIST_TYPE *item)
#define ITERATE(Type, Var, Cont)
ITERATE macro to sequence through container elements.
@ eTakeOwnership
An object can take ownership of another.
#define LOG_POST(message)
This macro is deprecated and it's strongly recomended to move in all projects (except tests) to macro...
@ eDiag_Warning
Warning message.
#define NCBI_USER_THROW_FMT(message)
Throw a "user exception" with message processed as output to ostream.
#define NCBI_THROW(exception_class, err_code, message)
Generic macro to throw an exception, given the exception class, error code and message string.
const string & GetMsg(void) const
Get message string.
#define NCBI_THROW2(exception_class, err_code, message, extra)
Throw exception with extra parameter.
static void SplitPath(const string &path, string *dir=0, string *base=0, string *ext=0)
Split a path string into its basic components.
virtual void Assign(const CSerialObject &source, ESerialRecursionMode how=eRecursive)
Set object to copy of another one.
virtual const CTypeInfo * GetThisTypeInfo(void) const =0
ESerialDataFormat
Data file format.
@ eSerial_AsnText
ASN.1 text.
@ eSerial_AsnBinary
ASN.1 binary.
static CRef< ILineReader > New(const string &filename)
Return a new ILineReader object corresponding to the given filename, taking "-" (but not "....
virtual bool AtEOF(void) const =0
Indicates (negatively) whether there is any more input.
@ fHyphensIgnoreAndWarn
When a hyphen is encountered in seq data, ignore it but warn.
@ fLetterGaps
Parse runs of Ns when splitting data.
@ fIgnoreMods
Ignore mods entirely. Incompatible with fAddMods.
@ fNoUserObjs
Don't save raw deflines in User-objects.
@ fForceType
Force specified type regardless of accession.
@ fParseRawID
Try to identify raw accessions.
@ fNoSplit
Don't split out ambiguous sequence regions.
@ fAssumeNuc
Assume nucs unless accns indicate otherwise.
@ fParseGaps
Make a delta sequence if gaps found.
@ fValidate
Check (alphabetic) residue validity.
@ fDisableParseRange
No ranges in seq-ids. Ranges part of seq-id instead.
@ e_YES
SeqIds compared, but are different.
void Read(const CObjectInfo &object)
Read object of know type.
pair< TObjectPtr, TTypeInfo > ObjectInfo(C &obj)
virtual string ReadFileHeader(void)
Read file header.
static CObjectIStream * Open(ESerialDataFormat format, CNcbiIstream &inStream, bool deleteInStream)
Create serial object reader and attach it to an input stream.
CRef< C > Ref(C *object)
Helper functions to get CRef<> and CConstRef<> objects.
TObjectType * GetPointer(void) THROWS_NONE
Get pointer,.
void Reset(void)
Reset reference object.
bool NotEmpty(void) const THROWS_NONE
Check if CRef is not empty – pointing to an object and has a non-null value.
bool Empty(void) const THROWS_NONE
Check if CRef is empty – not pointing to any object, which means having a null value.
#define END_NCBI_SCOPE
End previously defined NCBI scope.
#define BEGIN_NCBI_SCOPE
Define ncbi namespace.
IO_PREFIX::istream CNcbiIstream
Portable alias for istream.
IO_PREFIX::ifstream CNcbiIfstream
Portable alias for ifstream.
static bool StartsWith(const CTempString str, const CTempString start, ECase use_case=eCase)
Check if a string starts with a specified prefix value.
static bool EqualNocase(const CTempString s1, SIZE_TYPE pos, SIZE_TYPE n, const char *s2)
Case-insensitive equality of a substring with another string.
static string & ToLower(string &str)
Convert string to lower case – string& version.
@ eCurrent
Use current time. See also CCurrentTime.
TData & SetData(void)
Assign a value to Data data member.
TSub & SetSub(void)
Select the variant.
TGeneral & SetGeneral(void)
Select the variant.
TLocal & SetLocal(void)
Select the variant.
TSet & SetSet(void)
Select the variant.
const TSet & GetSet(void) const
Get the variant data.
bool IsSet(void) const
Check if variant Set is selected.
const TSeq_set & GetSeq_set(void) const
Get the Seq_set member data.
TSeq & SetSeq(void)
Select the variant.
TSeq_set & SetSeq_set(void)
Assign a value to Seq_set data member.
@ eClass_pop_set
population study
@ eClass_phy_set
phylogenetic study
@ eClass_mut_set
set of mutations
@ eClass_eco_set
ecological sample study
@ eClass_genbank
converted genbank
@ eClass_small_genome_set
viral segments or mitochondrial minicircles
list< CRef< CSeqdesc > > Tdata
TId & SetId(void)
Assign a value to Id data member.
const TUser & GetUser(void) const
Get the variant data.
void SetPub(TPub &value)
Assign a value to Pub data member.
TPub & SetPub(void)
Select the variant.
bool IsSetAnnot(void) const
Check if a value has been assigned to Annot data member.
const TLocal & GetLocal(void) const
Get the variant data.
bool IsGeneral(void) const
Check if variant General is selected.
TAnnot & SetAnnot(void)
Assign a value to Annot data member.
const TId & GetId(void) const
Get the Id member data.
bool IsSetData(void) const
Check if a value has been assigned to Data data member.
const Tdata & Get(void) const
Get the member data.
void SetInst(TInst &value)
Assign a value to Inst data member.
bool IsSetId(void) const
Check if a value has been assigned to Id data member.
const TId & GetId(void) const
Get the Id member data.
TUser & SetUser(void)
Select the variant.
const TFtable & GetFtable(void) const
Get the variant data.
bool IsFtable(void) const
Check if variant Ftable is selected.
const TData & GetData(void) const
Get the Data member data.
Tdata & Set(void)
Assign a value to data member.
bool IsLocal(void) const
Check if variant Local is selected.
bool IsUser(void) const
Check if variant User is selected.
const TGeneral & GetGeneral(void) const
Get the variant data.
@ eRepr_raw
continuous sequence
@ e_User
user defined object
@ e_Pub
a reference to the publication
@ e_Source
source of materials, includes Org-ref
const TEntrys & GetEntrys(void) const
Get the variant data.
const TData & GetData(void) const
Get the Data member data.
void SetData(TData &value)
Assign a value to Data data member.
const CharType(& source)[N]
NCBI C++ stream class wrappers for triggering between "new" and "old" C++ stream libraries.
std::istream & in(std::istream &in_, double &x_)
static int match(register const pcre_uchar *eptr, register const pcre_uchar *ecode, const pcre_uchar *mstart, int offset_top, match_data *md, eptrblock *eptrb, unsigned int rdepth)
bool operator()(const CSeq_id *left, const CSeq_id *right) const
static CRef< CSeq_id > s_GetAnnotId(const CSeq_annot &annot)
static CRef< CSeq_annot > s_GetBioseqAnnot(CBioseq &bioseq)
static void s_RemoveGenBankDbxrefs(list< CRef< CSeq_feat >> &ftable)
void g_ModifySeqIds(CSeq_annot &annot, const CSeq_id &match, CRef< CSeq_id > new_id)
static bool s_HasPrefixMatch(const string &idString, CMultiReader::TAnnotMap &annotMap, map< string, CMultiReader::TAnnotMap::iterator > &matchMap)
static void s_AddAnnotsToBioseq(list< CRef< CSeq_annot >> &annots, CBioseq &bioseq, CRef< CSeq_annot > &pBioseqAnnot)
CFileContentInfoGenbank mInfoGenbank