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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: file_export.cpp,v $
  4.  * PRODUCTION Revision 1000.5  2004/06/01 20:57:30  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.14
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: file_export.cpp,v 1000.5 2004/06/01 20:57:30 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.  * Authors:  Mike DiCuccio
  35.  *
  36.  * File Description:
  37.  *    CDataPlugin_FileExport - load sequence information from a file.
  38.  */
  39. #include <ncbi_pch.hpp>
  40. #include "file_export.hpp"
  41. #include <gui/core/idocument.hpp>
  42. #include <gui/core/plugin_utils.hpp>
  43. #include <gui/core/version.hpp>
  44. #include <gui/plugin/PluginCommandSet.hpp>
  45. #include <gui/plugin/PluginInfo.hpp>
  46. #include <gui/plugin/PluginValueConstraint.hpp>
  47. #include <gui/utils/message_box.hpp>
  48. #include <objects/seqset/Seq_entry.hpp>
  49. #include <objmgr/util/sequence.hpp>
  50. #include <objmgr/bioseq_ci.hpp>
  51. #include <objtools/flat/flat_gbseq_formatter.hpp>
  52. #include <objtools/flat/flat_gff_formatter.hpp>
  53. #include <objtools/flat/flat_table_formatter.hpp>
  54. #include <serial/objostrasn.hpp>
  55. BEGIN_NCBI_SCOPE
  56. USING_SCOPE(objects);
  57. static const string sc_text_str  ("Text ASN.1");
  58. static const string sc_binary_str("Binary ASN.1");
  59. static const string sc_xml_str   ("full XML");
  60. static const string sc_gbseq_str ("GBSeq XML");
  61. static const string sc_fasta_str ("FastA");
  62. static const string sc_flat_str  ("GenBank/EMBL/DDBJ Flat-File");
  63. static const string sc_gff_str   ("GFF/GTF");
  64. static const string sc_table_str ("Sequin 5-column Feature Table");
  65. void CDataPlugin_FileExport::GetInfo(CPluginInfo& info)
  66. {
  67.     info.Reset();
  68.     // version info macro
  69.     info.SetInfo(CPluginVersion::eMajor, CPluginVersion::eMinor, 0,
  70.                  string(__DATE__) + " " + string(__TIME__),
  71.                  "CDataPlugin_FileExport",
  72.                  "File", "File import / export plugin", "");
  73.     // command info
  74.     CPluginCommandSet& cmds     = info.SetCommands();
  75.     CPluginCommand& save_args   = cmds.AddDataCommand(eDataCommand_save);
  76.     save_args.AddArgument("file", "File name", CPluginArg::eFile);
  77.     save_args.AddArgument("document", "Document", CPluginArg::eDocument);
  78.     save_args.AddArgument("fmt", "Format", CPluginArg::eString);
  79.     save_args.SetConstraint("fmt",
  80.                             (*CPluginValueConstraint::CreateSet(),
  81.                              sc_text_str,
  82.                              sc_binary_str,
  83.                              sc_xml_str,
  84.                              sc_gbseq_str,
  85.                              sc_fasta_str,
  86.                              sc_flat_str,
  87.                              sc_gff_str,
  88.                              sc_table_str
  89.                              ));
  90. }
  91. //
  92. // Save()
  93. // Save the information in a given document into a file
  94. //
  95. void CDataPlugin_FileExport::Save(CPluginMessage& msg)
  96. {
  97.     const CPluginCommand& args = msg.GetRequest().GetCommand();
  98.     CPluginReply& reply = msg.SetReply();
  99.     IDocument* doc = const_cast<IDocument*> (&args["document"].AsDocument());
  100.     if ( !doc ) {
  101.         reply.SetStatus(eMessageStatus_failed);
  102.         return;
  103.     }
  104.     string fname = args["file"].AsString();
  105.     try {
  106.         string fmt_str = args["fmt"].AsString();
  107.         // find out what object to serialize
  108.         // in general, we serialize precisely what the document contains
  109.         // the exception to this is that we dereference any seq-id
  110.         // to its largest component (= top-level seq-entry)
  111.         CConstRef<CSerialObject> obj
  112.             (dynamic_cast<const CSerialObject*> (doc->GetObject()));
  113.         if (obj.GetPointer()  &&
  114.             obj->GetThisTypeInfo() == CSeq_id::GetTypeInfo()) {
  115.             const CSeq_id& id =
  116.                 dynamic_cast<const CSeq_id&>(*doc->GetObject());
  117.             CBioseq_Handle handle = doc->GetScope().GetBioseqHandle(id);
  118.             obj.Reset(&handle.GetTopLevelSeqEntry());
  119.         }
  120.         //
  121.         // format handling
  122.         //
  123.         ESerialDataFormat fmt = eSerial_None;
  124.         if (fmt_str == sc_text_str) {
  125.             // ASN.1 text
  126.             fmt = eSerial_AsnText;
  127.         } else if (fmt_str == sc_binary_str) {
  128.             // ASN.1 binary
  129.             fmt = eSerial_AsnBinary;
  130.         } else if (fmt_str == sc_xml_str) {
  131.             // XML
  132.             fmt = eSerial_Xml;
  133.         } else if (fmt_str == sc_fasta_str) {
  134.             //
  135.             // FastA - alternate format
  136.             //
  137.             CScope& scope = doc->GetScope();
  138.             CNcbiOfstream ostr(fname.c_str());
  139.             CFastaOstream fasta_ostr(ostr);
  140.             CObjectConverter::TObjList objs;
  141.             CObjectConverter::Convert(scope, *obj, CSeq_entry::GetTypeInfo(),
  142.                                       objs);
  143.             ITERATE (CObjectConverter::TObjList, iter, objs) {
  144.                 const CSeq_entry& entry =
  145.                     dynamic_cast<const CSeq_entry&> (**iter);
  146.                 CBioseq_CI bioseq_iter(scope, entry);
  147.                 for ( ;  bioseq_iter;  ++bioseq_iter) {
  148.                     fasta_ostr.Write(*bioseq_iter);
  149.                 }
  150.             }
  151.         } else {
  152.             //
  153.             // Flat-File - alternate format
  154.             //
  155.             // should bring up a second dialog box rather than hardcoding
  156.             // parameters
  157.             CScope& scope = doc->GetScope();
  158.             CNcbiOfstream ostr(fname.c_str());
  159.             CFlatTextOStream ftos(ostr);
  160.             auto_ptr<CObjectOStream> oos;
  161.             auto_ptr<IFlatFormatter> ff;
  162.             IFlatFormatter::EMode mode = IFlatFormatter::eMode_GBench;
  163.             if (fmt_str == sc_flat_str) {
  164.                 ff.reset(CFlatTextFormatter::New(ftos, scope, mode,
  165.                                                  IFlatFormatter::eDB_NCBI));
  166.             } else if (fmt_str == sc_table_str) {
  167.                 ff.reset(new CFlatTableFormatter(ftos, scope));
  168.             } else if (fmt_str == sc_gff_str) {
  169.                 ff.reset(new CFlatGFFFormatter(ftos, scope, mode,
  170.                                                CFlatGFFFormatter::fGTFCompat));
  171.             } else if (fmt_str == sc_gbseq_str) {
  172.                 oos.reset(CObjectOStream::Open(eSerial_Xml, ostr));
  173.                 ff.reset(new CFlatGBSeqFormatter(*oos, scope, mode));
  174.             }
  175.             CObjectConverter::TObjList objs;
  176.             CObjectConverter::Convert(scope, *obj,
  177.                                       CSeq_entry::GetTypeInfo(), objs);
  178.             ITERATE (CObjectConverter::TObjList, iter, objs) {
  179.                 ff->Format(dynamic_cast<const CSeq_entry&>(**iter), *ff);
  180.             }
  181.         }
  182.         //
  183.         // generic handler - use object ostreams
  184.         if ( fmt != eSerial_None ) {
  185.             auto_ptr<CObjectOStream> os(CObjectOStream::Open(fmt, fname));
  186.             os->Write(obj, obj->GetThisTypeInfo());
  187.         }
  188.         reply.SetStatus(eMessageStatus_success);
  189.     }
  190.     catch (CException& e) {
  191.         string msg("Failed to save file:n");
  192.         msg += e.GetMsg();
  193.         NcbiMessageBox(msg);
  194.         reply.SetStatus(eMessageStatus_failed);
  195.     }
  196. #ifndef _DEBUG
  197.     catch (...) {
  198.         NcbiMessageBox("Failed to save file:nUnknown errorn");
  199.         reply.SetStatus(eMessageStatus_failed);
  200.     }
  201. #endif
  202. }
  203. END_NCBI_SCOPE
  204. /*
  205.  * ===========================================================================
  206.  * $Log: file_export.cpp,v $
  207.  * Revision 1000.5  2004/06/01 20:57:30  gouriano
  208.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.14
  209.  *
  210.  * Revision 1.14  2004/05/25 17:21:59  dicuccio
  211.  * Modified class names.  Fonts to 12 point
  212.  *
  213.  * Revision 1.13  2004/05/21 22:27:48  gorelenk
  214.  * Added PCH ncbi_pch.hpp
  215.  *
  216.  * Revision 1.12  2004/03/11 17:42:01  dicuccio
  217.  * Dropped unneeded #includes
  218.  *
  219.  * Revision 1.11  2004/01/27 18:45:31  dicuccio
  220.  * Added missing header files
  221.  *
  222.  * Revision 1.10  2004/01/21 12:38:19  dicuccio
  223.  * redesigned CObjectCOnverter API to eliminate temporary object creation
  224.  *
  225.  * Revision 1.9  2004/01/13 20:38:16  dicuccio
  226.  * Use the filename provided by the plugin arg dialog
  227.  *
  228.  * Revision 1.8  2003/12/31 20:29:31  dicuccio
  229.  * Turned on use of file type arguments.  Fixed issues relating to importation of
  230.  * items into scopes - can now import anything.
  231.  *
  232.  * Revision 1.7  2003/12/05 13:07:52  dicuccio
  233.  * Split management interface into a separate plugin.  Fixed linker error
  234.  * introduced with status bar
  235.  *
  236.  * Revision 1.6  2003/11/24 15:45:33  dicuccio
  237.  * Renamed CVersion to CPluginVersion
  238.  *
  239.  * Revision 1.5  2003/11/06 20:12:14  dicuccio
  240.  * Cleaned up handling of USING_SCOPE - removed from all headers
  241.  *
  242.  * Revision 1.4  2003/11/04 17:49:24  dicuccio
  243.  * Changed calling parameters for plugins - pass CPluginMessage instead of paired
  244.  * CPluginCommand/CPluginReply
  245.  *
  246.  * Revision 1.3  2003/10/09 16:11:07  ucko
  247.  * Added types mediated by the flat-file generator: GBSeq, GenBank,
  248.  * GFF/GTF, and Sequin feature table.
  249.  *
  250.  * Revision 1.2  2003/10/07 13:47:05  dicuccio
  251.  * Renamed CPluginURL* to CPluginValue*
  252.  *
  253.  * Revision 1.1  2003/09/16 14:06:48  dicuccio
  254.  * Initial revision - split from CFileLoader
  255.  *
  256.  * ===========================================================================
  257.  */