convert_seq.cpp
上传用户:yhdzpy8989
上传日期:2007-06-13
资源大小:13604k
文件大小:12k
源码类别:

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: convert_seq.cpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 18:30:25  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.5
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: convert_seq.cpp,v 1000.1 2004/06/01 18:30:25 gouriano Exp $
  10. * ===========================================================================
  11. *
  12. *                            PUBLIC DOMAIN NOTICE
  13. *               National Center for Biotechnology Information
  14. *
  15. *  This software/database is a "United States Government Work" under the
  16. *  terms of the United States Copyright Act.  It was written as part of
  17. *  the author's official duties as a United States Government employee and
  18. *  thus cannot be copyrighted.  This software/database is freely available
  19. *  to the public for use. The National Library of Medicine and the U.S.
  20. *  Government have not placed any restriction on its use or reproduction.
  21. *
  22. *  Although all reasonable efforts have been taken to ensure the accuracy
  23. *  and reliability of the software and data, the NLM and the U.S.
  24. *  Government do not and cannot warrant the performance or results that
  25. *  may be obtained by using this software or data. The NLM and the U.S.
  26. *  Government disclaim all warranties, express or implied, including
  27. *  warranties of performance, merchantability or fitness for any particular
  28. *  purpose.
  29. *
  30. *  Please cite the author in any work or product based on this material.
  31. *
  32. * ===========================================================================
  33. *
  34. * Author:  Aaron Ucko, NCBI
  35. *
  36. * File Description:
  37. *   Program to convert biological sequences between the formats the
  38. *   C++ Toolkit supports.
  39. *
  40. * ===========================================================================
  41. */
  42. #include <ncbi_pch.hpp>
  43. #include <corelib/ncbiapp.hpp>
  44. #include <serial/iterator.hpp>
  45. #include <serial/objistr.hpp>
  46. #include <serial/objostr.hpp>
  47. #include <serial/serial.hpp>
  48. #include <objects/seq/Bioseq.hpp>
  49. #include <objects/seqset/Seq_entry.hpp>
  50. #include <objtools/data_loaders/genbank/gbloader.hpp>
  51. #include <objmgr/object_manager.hpp>
  52. #include <objmgr/scope.hpp>
  53. #include <objmgr/util/sequence.hpp>
  54. #include <objtools/flat/flat_gbseq_formatter.hpp>
  55. #include <objtools/flat/flat_gff_formatter.hpp>
  56. #include <objtools/flat/flat_table_formatter.hpp>
  57. #include <objtools/readers/fasta.hpp>
  58. #include <objtools/readers/gff_reader.hpp>
  59. #include <objtools/readers/readfeat.hpp>
  60. #include <objtools/readers/agp_read.hpp>
  61. // On Mac OS X 10.3, FixMath.h defines ff as a one-argument macro(!)
  62. #ifdef ff
  63. #  undef ff
  64. #endif
  65. USING_NCBI_SCOPE;
  66. USING_SCOPE(objects);
  67. class CConversionApp : public CNcbiApplication
  68. {
  69. public:
  70.     void Init(void);
  71.     int  Run (void);
  72. private:
  73.     static IFlatFormatter::EDatabase GetFlatFormat  (const string& name);
  74.     static ESerialDataFormat         GetSerialFormat(const string& name);
  75.     CConstRef<CSeq_entry> Read (const CArgs& args);
  76.     void                  Write(const CSeq_entry& entry, const CArgs& args);
  77.     CRef<CObjectManager> m_ObjMgr;
  78.     CRef<CScope>         m_Scope;
  79. };
  80. void CConversionApp::Init(void)
  81. {
  82.     auto_ptr<CArgDescriptions> arg_desc(new CArgDescriptions);
  83.     arg_desc->SetUsageContext(GetArguments().GetProgramBasename(),
  84.                               "Convert biological sequences between formats",
  85.                               false);
  86.     arg_desc->AddDefaultKey("type", "AsnType", "Type of object to convert",
  87.                             CArgDescriptions::eString, "Seq-entry");
  88.     arg_desc->SetConstraint("type", &(*new CArgAllow_Strings,
  89.                                       "Bioseq", "Bioseq-set", "Seq-entry"));
  90.     arg_desc->AddDefaultKey("in", "InputFile", "File to read the object from",
  91.                             CArgDescriptions::eInputFile, "-");
  92.     arg_desc->AddKey("infmt", "Format", "Input format",
  93.                      CArgDescriptions::eString);
  94.     arg_desc->SetConstraint
  95.         ("infmt", &(*new CArgAllow_Strings,
  96.                     "ID", "asn", "asnb", "xml", "fasta", "gff", "tbl", "agp"));
  97.     arg_desc->AddDefaultKey("out", "OutputFile", "File to write the object to",
  98.                             CArgDescriptions::eOutputFile, "-");
  99.     arg_desc->AddKey("outfmt", "Format", "Output format",
  100.                      CArgDescriptions::eString);
  101.     arg_desc->SetConstraint
  102.         ("outfmt", &(*new CArgAllow_Strings,
  103.                      "asn", "asnb", "xml", "ddbj", "embl", "genbank", "fasta",
  104.                      "gff", "tbl", "gbseq/xml", "gbseq/asn", "gbseq/asnb"));
  105.     SetupArgDescriptions(arg_desc.release());
  106. }
  107. int CConversionApp::Run(void)
  108. {
  109.     const CArgs& args = GetArgs();
  110.     m_ObjMgr.Reset(new CObjectManager);
  111.     m_ObjMgr->RegisterDataLoader(*new CGBDataLoader("ID"),
  112.                                  CObjectManager::eDefault);
  113.     m_Scope.Reset(new CScope(*m_ObjMgr));
  114.     m_Scope->AddDefaults();
  115.     CConstRef<CSeq_entry> entry = Read(args);
  116.     if (args["infmt"].AsString() != "ID") {
  117.         m_Scope->AddTopLevelSeqEntry(const_cast<CSeq_entry&>(*entry));
  118.     }
  119.     Write(*entry, args);
  120.     return 0;
  121. }
  122. ESerialDataFormat CConversionApp::GetSerialFormat(const string& name)
  123. {
  124.     if (name == "asn") {
  125.         return eSerial_AsnText;
  126.     } else if (name == "asnb") {
  127.         return eSerial_AsnBinary;
  128.     } else if (name == "xml") {
  129.         return eSerial_Xml;
  130.     } else {
  131.         return eSerial_None;
  132.     }
  133. }
  134. IFlatFormatter::EDatabase CConversionApp::GetFlatFormat(const string& name)
  135. {
  136.     if (name == "ddbj") {
  137.         return IFlatFormatter::eDB_DDBJ;
  138.     } else if (name == "embl") {
  139.         return IFlatFormatter::eDB_EMBL;
  140.     } else {
  141.         return IFlatFormatter::eDB_NCBI;
  142.     }
  143. }
  144. CConstRef<CSeq_entry> CConversionApp::Read(const CArgs& args)
  145. {
  146.     const string& infmt = args["infmt"].AsString();
  147.     const string& type  = args["type" ].AsString();
  148.     if (infmt == "ID") {
  149.         CSeq_id        id(args["in"].AsString());
  150.         CBioseq_Handle h = m_Scope->GetBioseqHandle(id);
  151.         return CConstRef<CSeq_entry>(&h.GetTopLevelSeqEntry());
  152.     } else if (infmt == "fasta") {
  153.         return ReadFasta(args["in"].AsInputFile());
  154.     } else if (infmt == "gff") {
  155.         return CGFFReader().Read(args["in"].AsInputFile(),
  156.                                  CGFFReader::fGBQuals);
  157.     } else if (infmt == "agp") {
  158.         CRef<CBioseq_set> bss = AgpRead(args["in"].AsInputFile());
  159.         if (bss->GetSeq_set().size() == 1) {
  160.             return bss->GetSeq_set().front();
  161.         } else {
  162.             CRef<CSeq_entry> entry(new CSeq_entry);
  163.             entry->SetSet(*bss);
  164.             return entry;
  165.         }
  166.     } else if (infmt == "tbl") {
  167.         CRef<CSeq_annot> annot = CFeature_table_reader::ReadSequinFeatureTable
  168.             (args["in"].AsInputFile());
  169.         CRef<CSeq_entry> entry(new CSeq_entry);
  170.         if (type == "Bioseq") {
  171.             CBioseq& seq = entry->SetSeq();
  172.             for (CTypeIterator<CSeq_id> it(*annot);  it;  ++it) {
  173.                 seq.SetId().push_back(CRef<CSeq_id>(&*it));
  174.                 BREAK(it);
  175.             }
  176.             seq.SetInst().SetRepr(CSeq_inst::eRepr_virtual);
  177.             seq.SetInst().SetMol(CSeq_inst::eMol_not_set);
  178.             seq.SetAnnot().push_back(annot);
  179.         } else {
  180.             entry->SetSet().SetAnnot().push_back(annot);
  181.         }
  182.         return entry;
  183.     } else {
  184.         CRef<CSeq_entry> entry(new CSeq_entry);
  185.         auto_ptr<CObjectIStream> in
  186.             (CObjectIStream::Open(GetSerialFormat(infmt),
  187.                                   args["in"].AsString(),
  188.                                   eSerial_StdWhenDash));
  189.         if (type == "Bioseq") {
  190.             *in >> entry->SetSeq();
  191.         } else if (type == "Bioseq-set") {
  192.             *in >> entry->SetSet();
  193.         } else {
  194.             *in >> *entry;
  195.         }
  196.         return entry;
  197.     }
  198. }
  199. void CConversionApp::Write(const CSeq_entry& entry, const CArgs& args)
  200. {
  201.     const string& outfmt = args["outfmt"].AsString();
  202.     const string& type   = args["type"  ].AsString();
  203.     if (outfmt == "genbank"  ||  outfmt == "embl"  ||  outfmt == "ddbj") {
  204.         CFlatTextOStream ftos(args["out"].AsOutputFile());
  205.         auto_ptr<IFlatFormatter> ff
  206.             (CFlatTextFormatter::New(ftos, *m_Scope,
  207.                                      IFlatFormatter::eMode_Entrez,
  208.                                      GetFlatFormat(outfmt)));
  209.         ff->Format(entry, *ff);
  210.     } else if (outfmt == "fasta") {
  211.         CFastaOstream out(args["out"].AsOutputFile());
  212.         for (CTypeConstIterator<CBioseq> it(entry);  it;  ++it) {
  213.             out.Write(m_Scope->GetBioseqHandle(*it));
  214.         }
  215.     } else if (outfmt == "gff") {
  216.         CFlatTextOStream ftos(args["out"].AsOutputFile());
  217.         CFlatGFFFormatter ff(ftos, *m_Scope, IFlatFormatter::eMode_Dump,
  218.                              CFlatGFFFormatter::fGTFCompat
  219.                              | CFlatGFFFormatter::fShowSeq);
  220.         ff.Format(entry, ff);
  221.     } else if (outfmt == "tbl") {
  222.         CFlatTextOStream ftos(args["out"].AsOutputFile());
  223.         CFlatTableFormatter ff(ftos, *m_Scope);
  224.         ff.Format(entry, ff);
  225.     } else if (NStr::StartsWith(outfmt, "gbseq/")) {
  226.         CFlatGBSeqFormatter ff(*m_Scope, IFlatFormatter::eMode_Entrez);
  227.         ff.Format(entry, ff);
  228.         auto_ptr<CObjectOStream> out
  229.             (CObjectOStream::Open(GetSerialFormat(outfmt.substr(6)),
  230.                                   args["out"].AsString(),
  231.                                   eSerial_StdWhenDash));
  232.         *out << ff.GetGBSet();
  233.     } else {
  234.         auto_ptr<CObjectOStream> out
  235.             (CObjectOStream::Open(GetSerialFormat(outfmt),
  236.                                   args["out"].AsString(),
  237.                                   eSerial_StdWhenDash));
  238.         if (type == "Bioseq") {
  239.             if (entry.IsSet()) {
  240.                 ERR_POST(Warning
  241.                          << "Possible truncation in conversion to Bioseq");
  242.                 *out << *entry.GetSet().GetSeq_set().front();
  243.             } else {
  244.                 *out << entry.GetSeq();
  245.             }
  246.         } else if (type == "Bioseq-set") {
  247.             if (entry.IsSet()) {
  248.                 *out << entry.GetSet();
  249.             } else {
  250.                 CBioseq_set bss;
  251.                 bss.SetSeq_set().push_back
  252.                     (CRef<CSeq_entry>(const_cast<CSeq_entry*>(&entry)));
  253.                 *out << bss;
  254.             }
  255.         } else {
  256.             *out << entry;
  257.         }
  258.     }
  259. }
  260. int main(int argc, const char* argv[])
  261. {
  262.     // Execute main application function
  263.     return CConversionApp().AppMain(argc, argv, 0, eDS_Default, 0);
  264. }
  265. /*
  266. * ===========================================================================
  267. *
  268. * $Log: convert_seq.cpp,v $
  269. * Revision 1000.1  2004/06/01 18:30:25  gouriano
  270. * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.5
  271. *
  272. * Revision 1.5  2004/05/21 21:41:40  gorelenk
  273. * Added PCH ncbi_pch.hpp
  274. *
  275. * Revision 1.4  2004/05/03 18:01:34  ucko
  276. * Kill unwanted definition of ff as a macro, if present (as on Mac OS 10.3)
  277. *
  278. * Revision 1.3  2004/02/27 20:07:10  jcherry
  279. * Added agp as input format
  280. *
  281. * Revision 1.2  2004/01/05 17:59:32  vasilche
  282. * Moved genbank loader and its readers sources to new location in objtools.
  283. * Genbank is now in library libncbi_xloader_genbank.
  284. * Id1 reader is now in library libncbi_xreader_id1.
  285. * OBJMGR_LIBS macro updated correspondingly.
  286. *
  287. * Old headers temporarily will contain redirection to new location
  288. * for compatibility:
  289. * objmgr/gbloader.hpp > objtools/data_loaders/genbank/gbloader.hpp
  290. * objmgr/reader_id1.hpp > objtools/data_loaders/genbank/readers/id1/reader_id1.hpp
  291. *
  292. * Revision 1.1  2003/12/03 20:58:40  ucko
  293. * Add new universal sequence converter app.
  294. *
  295. *
  296. * ===========================================================================
  297. */