69 m_TranslateCds(
false),
104 const CSeq_id& current_id = loc_it.GetSeq_id();
106 pFirstId.
Reset(¤t_id);
109 if (!pFirstId->
Match(current_id)) {
123 const bool translate_cds)
132 ERR_POST(
Warning <<
"Cannot process feature that spans multiple sequences - skipping");
135 const string err_msg =
"Invalid feature location - sequence not specified";
155 string err_msg =
"Empty bioseq handle";
168 const auto strand = loc.GetStrand();
176 const bool translate_cds)
185 const bool translate_cds)
206 if (id_string.empty()) {
211 m_Out <<
">lcl|" << id_string;
223 if (frame !=2 && frame != 3) {
224 string err_msg =
"Unexpected frame value : " + to_string(frame);
229 seq_id->Assign(*loc.
GetId());
232 auto stop_trim = start_trim;
236 string err_msg =
"Expected a positive start index\n";
245 auto trim_interval =
Ref(
new CSeq_loc(*seq_id, start_trim, stop_trim, strand));
259 if (protein.
Empty()) {
260 int frame_offset = 0;
265 if (cds_length < 10) {
277 string err_msg =
"CDS translation error: ";
282 const bool translate_cds =
true;
315 m_Out << defline <<
"\n";
321 list<CRef<CSeq_id>> idList;
322 for (
auto idh : scope.
GetIds(
id)) {
324 pId->Assign(*(idh.GetSeqId()));
325 idList.push_back(pId);
328 auto FastaRank = isNa ?
336 if (pBestId->IsGeneral() && pBestId->GetGeneral().IsSetTag()) {
337 const auto&
tag = pBestId->GetGeneral().GetTag();
344 return pBestId->GetSeqIdString(
true);
393 if (pGeneFeat && pGeneFeat->IsSetData() && pGeneFeat->GetData().IsGene() &&
394 pGeneFeat->GetData().GetGene().IsSetLocus_tag()) {
395 return pGeneFeat->GetData().GetGene().GetLocus_tag();
404 const bool translate_cds)
410 idString +=
"_prot_";
417 idString += productIdOrLocusTag +
"_";
434 const auto& feat_data = feat.
GetData();
442 feat_tag =
"_region_";
448 const string underscore =
"_";
449 string key = feat_data.GetImp().GetKey();
451 feat_tag =
"_" +
key +
"_";
458 id_string += feat_tag;
489 if (
auto it = kTypeToTag.find(rna_type);
490 it != kTypeToTag.end()) {
491 rna_tag = it->second;
494 rna_tag =
"_miscrna_";
500 idString += productIdOrLocusTag +
"_";
509 const auto& src_loc =
prot.GetLocation();
512 id_string +=
"_prot_";
514 if (
prot.IsSetProduct()) {
516 if (!prod_accver.empty()) {
517 id_string += prod_accver +
"_";
530 id_string +=
"_gene_";
539 string& defline)
const
550 string& defline)
const
555 defline +=
" [" +
label +
"=true]";
561 string& defline)
const
573 if (gene_feat.Empty() ||
574 !gene_feat->IsSetData() ||
575 !gene_feat->GetData().IsGene()) {
578 gene->Assign(gene_feat->GetData().GetGene());
581 if (gene->IsSetLocus()) {
582 auto gene_locus = gene->GetLocus();
586 if (gene->IsSetLocus_tag()) {
587 auto gene_locus_tag = gene->GetLocus_tag();
596 string& defline)
const
602 bool is_pseudo =
false;
611 if (!gene_feat.Empty() &&
612 gene_feat->IsSetPseudo() &&
613 gene_feat->GetPseudo()) {
615 }
else if (!gene_feat.Empty() &&
616 gene_feat->GetData().IsGene() &&
617 gene_feat->GetData().GetGene().GetPseudo()) {
627 string& defline)
const
633 list<string> qualifiers;
634 qualifiers.push_back(
"regulatory_class");
635 qualifiers.push_back(
"recombination_class");
636 qualifiers.push_back(
"feat_class");
637 qualifiers.push_back(
"bound_moiety");
638 qualifiers.push_back(
"mobile_element_type");
639 qualifiers.push_back(
"operon");
640 qualifiers.push_back(
"site_type");
643 for (
const string& qual_name : qualifiers) {
645 if (!
value.empty()) {
653 string& defline)
const
667 string& defline)
const
674 if (pseudogene.empty()) {
679 if (gene_feat.Empty()) {
682 pseudogene = gene_feat->GetNamedQual(
"pseudogene");
691 string& defline)
const
697 const CDbtag& dbtag = *pDbtag;
699 if (!db_xref.empty()) {
702 db_xref += dbtag.
GetDb() +
":";
714 if (db_xref.empty() &&
718 if (gene_feat.Empty()) {
728 string& defline)
const
740 pProtXref->IsSetName() &&
741 !pProtXref->GetName().empty()) {
742 protein_name = pProtXref->
GetName().front();
749 if (product_handle) {
771 string& defline)
const
789 string& defline)
const
792 string partial_string;
794 partial_string +=
"5\'";
798 if (!partial_string.empty()) {
799 partial_string +=
",";
801 partial_string +=
"3\'";
810 string cb_str = (
"(pos:");
836 string err_msg =
"Negative offset not permitted";
842 switch( loc.
Which() ) {
866 cb_str += aaName +
")";
878 string& defline)
const
888 string transl_exception;
889 for (
auto && code_break : code_breaks) {
893 if (!transl_exception.empty()) {
894 transl_exception +=
",";
896 transl_exception += cb_string;
905 string& defline)
const
916 string& defline)
const
930 string& defline)
const
936 string transcript_id = feat.
GetNamedQual(
"transcript_id");
938 if (transcript_id.empty() &&
949 string& defline)
const
967 string& defline)
const
1016 string& defline)
const
1024 const auto rna_type =
rna.IsSetType() ?
1027 string product_string;
1029 if (
rna.IsSetExt() &&
rna.GetExt().IsTRNA()) {
1030 const auto& trna =
rna.GetExt().GetTRNA();
1035 if (product_string.empty() &&
1037 rna.GetExt().IsName()) {
1038 product_string =
rna.GetExt().GetName();
1041 if (product_string.empty() &&
1043 rna.GetExt().IsGen() &&
1044 rna.GetExt().GetGen().IsSetProduct()) {
1045 product_string =
rna.GetExt().GetGen().GetProduct();
1048 if (product_string.empty()) {
1057 : m_filename_without_ext(filename_without_ext),
1067 delete it->m_fasta_stream; it->m_fasta_stream =
nullptr;
1068 delete it->m_ostream; it->m_ostream =
nullptr;
1076 const char* suffix =
nullptr;
1083 suffix =
"_cds_from_genomic";
1086 suffix =
"_rna_from_genomic";
1091 filename.append(suffix);
1092 const char* ext =
nullptr;
1105 filename.append(ext);
1148 loc2.
SetWhole().Assign(*it->GetSeqId());
1168 case ncbi::objects::CSeq_inst_Base::eMol_dna:
1171 case ncbi::objects::CSeq_inst_Base::eMol_rna:
1174 case ncbi::objects::CSeq_inst_Base::eMol_aa:
1177 case ncbi::objects::CSeq_inst_Base::eMol_na:
1195 "Processing terminated by user");
1234 if (!pAnnot->IsGraph()) {
1239 if (!pGraph->GetGraph().IsByte()) {
1243 if (pGraph->IsSetLoc()) {
1245 while (current_pos < left) {
1252 const CByte_graph& byte_graph = pGraph->GetGraph().GetByte();
1254 for (
char ch : byte_graph.
GetValues()) {
1255 m_Ostr <<
" " << setw(2) <<
static_cast<int>(ch);
1264 while (current_pos < length) {
1277 const string& graph_title,
1282 string header = graph_title;
1288 header +=
"(Length: ";
1290 header +=
", Min: ";
1297 header +=
", Max: ";
1308 if (values.empty()) {
1314 for (
size_t i=1;
i<values.size(); ++
i) {
1315 const int current_value =
static_cast<int>(values[
i]);
1316 if (current_value >
max) {
1317 max = current_value;
1320 if (current_value <
min) {
1321 min = current_value;
1337 bool have_title =
false;
1338 bool has_byte_graph =
false;
1342 if (!pAnnot->IsGraph()) {
1348 pGraph->IsSetTitle()) {
1349 graph_title = pGraph->GetTitle();
1353 const auto& graph_data = pGraph->GetGraph();
1355 has_byte_graph =
true;
1356 const CByte_graph& byte_graph = graph_data.GetByte();
1362 if (local_min <
min) {
1365 if (local_max >
max) {
1373 if (!has_byte_graph) {
1380 m_FastaOstr->WriteTitle(bioseq, 0,
false, ending);
1386 if (
column == num_columns) {
User-defined methods of the data storage class.
User-defined methods of the data storage class.
@ eExtreme_Positional
numerical value
@ eExtreme_Biological
5' and 3'
User-defined methods of the data storage class.
TSeqPos GetLength(void) const
bool IsSetLength(void) const
CFastaOstreamComp(const string &dir, const string &filename_without_ext)
virtual void x_GetNewFilename(string &filename, E_FileSection sel)
vector< TStreams > m_streams
string m_filename_without_ext
void x_Write(const CBioseq_Handle &handle, const CSeq_loc *location)
virtual ~CFastaOstreamComp()
virtual CFastaOstream * x_GetFastaOstream(CNcbiOstream &ostr, E_FileSection sel)
virtual CNcbiOstream * x_GetOutputStream(const string &filename, E_FileSection sel)
void Write(const CSeq_entry_Handle &handle, const CSeq_loc *location=nullptr)
TStreams & x_GetStream(E_FileSection sel)
void x_AddPseudoAttribute(const CSeq_feat &feat, CScope &scope, string &defline) const
void x_AddProteinIdAttribute(const CSeq_feat &feat, CScope &scope, string &defline) const
void x_AddExceptionAttribute(const CSeq_feat &feat, string &defline) const
CRef< CScope > m_InternalScope
void WriteFeatureTitle(const CSeq_feat &feat, CScope &scope, bool translate_cds=false)
void x_AddncRNAClassAttribute(const CSeq_feat &feat, string &defline) const
void x_AddDeflineAttribute(const string &label, const string &value, string &defline) const
void x_AddTranslationExceptionAttribute(const CSeq_feat &feat, CScope &scope, string &defline) const
void ResetFeatureCount(void)
void WriteFeature(const CSeq_feat &feat, CScope &scope, bool translate_cds=false)
string x_GetOtherIdString(const CSeq_feat &feat, CScope &scope)
string x_GetGeneIdString(const CSeq_feat &gene, CScope &scope)
void x_AddGBkeyAttribute(const CSeq_feat &feat, string &defline) const
string x_GetProtIdString(const CSeq_feat &prot, CScope &scope)
void x_AddMiscQualifierAttributes(const CSeq_feat &feat, string &defline) const
void x_AddReadingFrameAttribute(const CSeq_feat &feat, string &defline) const
void x_AddTranscriptIdAttribute(const CSeq_feat &feat, CScope &scope, string &defline) const
string x_GetRNAIdString(const CSeq_feat &rna, CScope &scope)
CRef< CSeq_loc > x_TrimLocation(TSeqPos frame, ENa_strand strand, CScope &scope, const CSeq_loc &loc)
void x_AddProteinNameAttribute(const CSeq_feat &feat, CScope &scope, string &defline) const
void x_AddPartialAttribute(const CSeq_feat &feat, CScope &scope, string &defline) const
void x_AddRNAProductAttribute(const CSeq_feat &feat, string &defline) const
virtual bool xWriteFeature(CFeat_CI feat_it) override
void x_WriteTranslatedCds(const CSeq_feat &cds, CScope &scope)
bool xWriteFeatureTitle(const CSeq_feat &feat, CScope &scope, bool translate_cds=false)
string x_GetCDSIdString(const CSeq_feat &cds, CScope &scope, bool translate_cds=false)
CFastaOstreamEx(CNcbiOstream &out)
void x_AddGeneAttributes(const CSeq_feat &feat, CScope &scope, string &defline) const
void x_AddLocationAttribute(const CSeq_feat &feat, CScope &scope, string &defline) const
void x_AddDbxrefAttribute(const CSeq_feat &feat, CScope &scope, string &defline) const
virtual void x_WriteBuffer(const char *buf, unsigned int count) override
bool WriteFeatures(CFeat_CI feat_it, bool translate_cds)
void x_AddPseudoGeneAttribute(const CSeq_feat &feat, CScope &scope, string &defline) const
bool x_GetCodeBreak(const CSeq_feat &feat, const CCode_break &code_break, CScope &scope, string &cbstring) const
void x_WriteFeatureAttributes(const CSeq_feat &feat, CScope &scope) const
FASTA-format output; see also ReadFasta in <objtools/readers/fasta.hpp>
bool WriteFeatures(CFeat_CI &first)
const string & GetString(void) const
CQualScoreWriter(CNcbiOstream &ostr, bool enable_gi=false)
bool x_WriteHeader(const CBioseq &bioseq)
void x_Advance(int &column, const int num_columns)
unique_ptr< CFastaOstreamEx > m_FastaOstr
void Write(const CBioseq &bioseq)
string x_ComposeHeaderEnding(const string &graph_title, TSeqPos length, int max, int min)
virtual ~CQualScoreWriter(void)
bool IsLegalQualifier(EQualifier qual) const
Test wheather a certain qualifier is legal for the feature.
ESubtype GetSubtype(void) const
string GetKey(EVocabulary vocab=eVocabulary_full) const
namespace ncbi::objects::
const CProt_ref * GetProtXref(void) const
get protein (if present) from Seq-feat.xref list
const string & GetNamedQual(const CTempString &qual_name) const
Return a named qualifier.
Seq-loc iterator class – iterates all intervals from a seq-loc in the correct order.
static bool GetAaName(const CCode_break &, string &)
static bool GetTrnaProductName(const CTrna_ext &, string &)
std::ofstream out("events_result.xml")
main entry point for tests
static const string s_TrnaList[]
static bool x_GetMaxMin(const CByte_graph::TValues &values, int &max, int &min)
static string s_GetDeflineIdString(const CSeq_id &id, CScope &scope, const bool isNa=true)
static string s_GetProductIdOrLocusTag(const CSeq_feat &feat, CScope &scope)
CConstRef< CSeq_feat > s_GetBestGeneForFeat(const CSeq_feat &feat, CScope &scope)
static bool s_LocationSpansMultipleSeqs(const CSeq_loc &loc)
static const char * column
static const char location[]
unsigned int TSeqPos
Type for sequence locations and lengths.
#define NON_CONST_ITERATE(Type, Var, Cont)
Non constant version of ITERATE macro.
const TSeqPos kInvalidSeqPos
Define special value for invalid sequence position.
#define ERR_POST(message)
Error posting with file, line number information but without error codes.
#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.
void Warning(CExceptionArgs_Base &args)
static string AddTrailingPathSeparator(const string &path)
Add trailing path separator, if needed.
bool Match(const CSeq_id &sid2) const
Match() - TRUE if SeqIds are equivalent.
static int FastaNARank(const CRef< CSeq_id > &id)
static int FastaAARank(const CRef< CSeq_id > &id)
TSeqPos GetStart(ESeqLocExtremes ext) const
Return start and stop positions of the seq-loc.
const CSeq_id * GetId(void) const
Get the id of the location return NULL if has multiple ids or no id at all.
TSeqPos GetStop(ESeqLocExtremes ext) const
CMappedFeat GetBestGeneForMrna(const CMappedFeat &mrna_feat, CFeatTree *feat_tree=0, const SAnnotSelector *base_sel=0, CFeatTree::EBestGeneType lookup_type=CFeatTree::eBestGene_TreeOnly)
CMappedFeat GetBestGeneForCds(const CMappedFeat &cds_feat, CFeatTree *feat_tree=0, const SAnnotSelector *base_sel=0, CFeatTree::EBestGeneType lookup_type=CFeatTree::eBestGene_TreeOnly)
CMappedFeat GetBestOverlappingFeat(const CMappedFeat &feat, CSeqFeatData::ESubtype need_subtype, sequence::EOverlapType overlap_type, CFeatTree *feat_tree=0, const SAnnotSelector *base_sel=0)
TSeqPos GetLength(const CSeq_id &id, CScope *scope)
Get sequence length if scope not null, else return max possible TSeqPos.
TSeqPos LocationOffset(const CSeq_loc &outer, const CSeq_loc &inner, EOffsetType how=eOffset_FromStart, CScope *scope=0)
returns (TSeqPos)-1 if the locations don't overlap
int SeqLocPartialCheck(const CSeq_loc &loc, CScope *scope)
CRef< CSeq_loc > Seq_loc_Subtract(const CSeq_loc &loc1, const CSeq_loc &loc2, CSeq_loc::TOpFlags flags, CScope *scope)
Subtract the second seq-loc from the first one.
int TestForOverlap(const CSeq_loc &loc1, const CSeq_loc &loc2, EOverlapType type, TSeqPos circular_len=kInvalidSeqPos, CScope *scope=0)
Calls TestForOverlap64() and if the result is greater than kMax_Int truncates it to kMax_Int.
@ eOverlap_Simple
any overlap of extremes
@ eOverlap_Interval
at least one pair of intervals must overlap
@ eOffset_FromStart
For positive-orientation strands, start = left and end = right; for reverse-orientation strands,...
static CRef< CBioseq > TranslateToProtein(const CSeq_feat &cds, CScope &scope)
virtual void Write(const CSeq_entry_Handle &handle, const CSeq_loc *location=0)
Unspecified locations designate complete sequences; non-empty custom titles override the usual title ...
virtual void WriteSequence(const CBioseq_Handle &handle, const CSeq_loc *location=0, CSeq_loc::EOpFlags merge_flags=CSeq_loc::fMerge_AbuttingOnly)
virtual void x_WriteBuffer(const char *buf, unsigned int count)
void SetAllFlags(TFlags flags)
@ fHideGenBankPrefix
Hide gb| prefix for genbank only seq_id's.
@ fNoDupCheck
skip check for duplicate sequence IDs
@ fEnableGI
Use this flag to enable GI output in the defline.
TIds GetIds(const CSeq_id &id, TGetFlags flags=0)
Get "native" bioseq ids without filtering and matching.
CBioseq_Handle AddBioseq(CBioseq &bioseq, TPriority pri=kPriority_Default, EExist action=eExist_Throw)
Add bioseq, return bioseq handle.
CBioseq_Handle GetBioseqHandle(const CSeq_id &id)
Get bioseq handle by seq-id.
CSeq_inst::TMol GetSequenceType(const CSeq_id &id, TGetFlags flags=0)
Get molecular type of sequence (protein/dna/rna) Return CSeq_inst::eMol_not_set if sequence is not fo...
const CSeqFeatData & GetData(void) const
TInst_Mol GetInst_Mol(void) const
CScope & GetScope(void) const
Get scope this handle belongs to.
CScope & GetScope(void) const
Get scope this handle belongs to.
bool IsSetData(void) const
bool CanGetInst_Mol(void) const
SAnnotSelector & SetExcludeExternal(bool exclude=true)
External annotations for the Object Manger are annotations located in top level Seq-entry different f...
SAnnotSelector & SetSortOrder(ESortOrder sort_order)
Set sort order of annotations.
CConstRef< CSeq_feat > GetSeq_feat(void) const
Get current seq-feat.
@ eSortOrder_Normal
default - increasing start, decreasing length
bool IsNull(void) const THROWS_NONE
Check if pointer is null – same effect as Empty().
CRef< C > Ref(C *object)
Helper functions to get CRef<> and CConstRef<> objects.
void Reset(void)
Reset reference object.
TObjectType & GetObject(void)
Get object.
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::ofstream CNcbiOfstream
Portable alias for ofstream.
IO_PREFIX::ostream CNcbiOstream
Portable alias for ostream.
static bool IsBlank(const CTempString str, SIZE_TYPE pos=0)
Check if a string is blank (has no text).
static string IntToString(int value, TNumToStringFlags flags=0, int base=10)
Convert int to string.
static string & ReplaceInPlace(string &src, const string &search, const string &replace, SIZE_TYPE start_pos=0, SIZE_TYPE max_replace=0, SIZE_TYPE *num_replace=0)
Replace occurrences of a substring within a string.
C::value_type FindBestChoice(const C &container, F score_func)
Find the best choice (lowest score) for values in a container.
static const char label[]
bool IsSetDb(void) const
name of database or system Check if a value has been assigned to Db data member.
const TTag & GetTag(void) const
Get the Tag member data.
bool IsId(void) const
Check if variant Id is selected.
bool IsSetTag(void) const
appropriate tag Check if a value has been assigned to Tag data member.
const TDb & GetDb(void) const
Get the Db member data.
const TStr & GetStr(void) const
Get the variant data.
TId GetId(void) const
Get the variant data.
const TName & GetName(void) const
Get the Name member data.
bool IsSetName(void) const
protein name Check if a value has been assigned to Name data member.
bool IsSetExt(void) const
generic fields for ncRNA, tmRNA, miscRNA Check if a value has been assigned to Ext data member.
bool IsGen(void) const
Check if variant Gen is selected.
const TGen & GetGen(void) const
Get the variant data.
bool IsSetClass(void) const
for ncRNAs, the class of non-coding RNA: examples: antisense_RNA, guide_RNA, snRNA Check if a value h...
const TExt & GetExt(void) const
Get the Ext member data.
const TClass & GetClass(void) const
Get the Class member data.
@ eType_scRNA
will become ncRNA, with RNA-gen.class = scRNA
@ eType_snoRNA
will become ncRNA, with RNA-gen.class = snoRNA
@ eType_ncRNA
non-coding RNA; subsumes snRNA, scRNA, snoRNA
@ eType_snRNA
will become ncRNA, with RNA-gen.class = snRNA
bool IsSetData(void) const
the specific data Check if a value has been assigned to Data data member.
E_Choice Which(void) const
Which variant is currently selected.
bool IsProt(void) const
Check if variant Prot is selected.
bool IsCdregion(void) const
Check if variant Cdregion is selected.
const TLoc & GetLoc(void) const
Get the Loc member data.
const TLocation & GetLocation(void) const
Get the Location member data.
bool IsGene(void) const
Check if variant Gene is selected.
TFrame GetFrame(void) const
Get the Frame member data.
const TData & GetData(void) const
Get the Data member data.
const TExcept_text & GetExcept_text(void) const
Get the Except_text member data.
bool IsSetExcept_text(void) const
explain if except=TRUE Check if a value has been assigned to Except_text data member.
const TDbxref & GetDbxref(void) const
Get the Dbxref member data.
const TCdregion & GetCdregion(void) const
Get the variant data.
TPseudo GetPseudo(void) const
Get the Pseudo member data.
const TProduct & GetProduct(void) const
Get the Product member data.
bool IsSetPseudo(void) const
annotated on pseudogene? Check if a value has been assigned to Pseudo data member.
const TGene & GetGene(void) const
Get the variant data.
const TProt & GetProt(void) const
Get the variant data.
const TRna & GetRna(void) const
Get the variant data.
bool IsSetDbxref(void) const
support for xref to other databases Check if a value has been assigned to Dbxref data member.
const TCode_break & GetCode_break(void) const
Get the Code_break member data.
bool IsSetProduct(void) const
product of process Check if a value has been assigned to Product data member.
bool IsSetLoc(void) const
location of exception Check if a value has been assigned to Loc data member.
bool IsRna(void) const
Check if variant Rna is selected.
bool IsSetCode_break(void) const
individual exceptions Check if a value has been assigned to Code_break data member.
bool IsSetFrame(void) const
Check if a value has been assigned to Frame data member.
@ e_Region
named region (globin locus)
@ eFrame_three
reading frame
ENa_strand
strand of nucleic acid
TFrom GetFrom(void) const
Get the From member data.
E_Choice Which(void) const
Which variant is currently selected.
TTo GetTo(void) const
Get the To member data.
const TInt & GetInt(void) const
Get the variant data.
const TGraph & GetGraph(void) const
Get the Graph member data.
bool IsSetValues(void) const
Check if a value has been assigned to Values data member.
const TValues & GetValues(void) const
Get the Values member data.
bool IsSetAnnot(void) const
Check if a value has been assigned to Annot data member.
const TAnnot & GetAnnot(void) const
Get the Annot member data.
EMol
molecule class in living organism
const struct ncbi::grid::netcache::search::fields::KEY key
const GenericPointer< typename T::ValueType > T2 value
Defines classes: CDirEntry, CFile, CDir, CSymLink, CMemoryFile, CFileUtil, CFileLock,...
CFastaOstream * m_fasta_stream