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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: run_cn3d.cpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 20:55:55  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.7
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: run_cn3d.cpp,v 1000.1 2004/06/01 20:55:55 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:  Josh Cherry
  35.  *
  36.  * File Description:  gbench plugin for invoking Cn3D
  37.  *
  38.  */
  39. #include <ncbi_pch.hpp>
  40. #include "run_cn3d.hpp"
  41. #include <gui/core/idocument.hpp>
  42. #include <gui/core/plugin_utils.hpp>
  43. #include <gui/plugin/PluginCommandSet.hpp>
  44. #include <gui/plugin/PluginValue.hpp>
  45. #include <gui/plugin/PluginInfo.hpp>
  46. #include <gui/plugin/PluginReply.hpp>
  47. #include <gui/plugin/PluginRequest.hpp>
  48. #include <gui/plugin/PluginValueConstraint.hpp>
  49. #include <gui/core/version.hpp>
  50. #include <gui/core/doc_manager.hpp>
  51. #include <gui/objutils/utils.hpp>
  52. #include <gui/utils/message_box.hpp>
  53. #include <FL/Fl_File_Chooser.H>
  54. #include <gui/utils/file_deletion.hpp>
  55. #include <corelib/ncbifile.hpp>
  56. #include <corelib/ncbiexec.hpp>
  57. #include <corelib/ncbiapp.hpp>
  58. #include <corelib/ncbireg.hpp>
  59. #include <serial/serial.hpp>
  60. #include <serial/objostr.hpp>
  61. #include <objects/seq/Bioseq.hpp>
  62. #include <objects/seqalign/Dense_seg.hpp>
  63. #include <objects/ncbimime/Ncbi_mime_asn1.hpp>
  64. #include <objects/ncbimime/Biostruc_seqs_aligns_cdd.hpp>
  65. #include <objects/ncbimime/Bundle_seqs_aligns.hpp>
  66. #include <objects/seqalign/Dense_seg.hpp>
  67. BEGIN_NCBI_SCOPE
  68. USING_SCOPE(objects);
  69. // standard info boilerplate
  70. void CAlgoPlugin_RunCn3d::GetInfo(CPluginInfo& info)
  71. {
  72.     info.Reset();
  73.     // version info macro
  74.     info.SetInfo(CPluginVersion::eMajor, CPluginVersion::eMinor, 0,
  75.                  string(__DATE__) + " " + string(__TIME__),
  76.                  "CAlgoPlugin_RunCn3d",
  77.                  "Alignments/Launch Cn3D",
  78.                  "Invoke the Cn3D program",
  79.                  "");
  80.     // command info
  81.     CPluginCommandSet& cmds = info.SetCommands();
  82.     CPluginCommand&    args = cmds.AddAlgoCommand(eAlgoCommand_run);
  83.     args.AddArgument("aligns", "Input alignment(s)",
  84.                      CSeq_align::GetTypeInfo(),
  85.                      CPluginArg::TData::e_Array);
  86. }
  87. struct SIdLess
  88. {
  89. public:
  90.     bool operator() (CRef<CSeq_id> lhs, CRef<CSeq_id> rhs) {
  91.         return *lhs < *rhs;
  92.     }
  93. };
  94. // Given a multiple alignment (Dense-seg), express as multiple pairwise
  95. // alignments, and append these to list.
  96. // The first sequence in the input alignment is the first sequence
  97. // in each of the aln.GetDim() - 1 pairwise alignments. 
  98. static void s_AsPairwise(const CSeq_align& aln,
  99.                          CSeq_annot::C_Data::TAlign& pairs)
  100. {
  101.     const CDense_seg& ds = aln.GetSegs().GetDenseg();
  102.     vector<CRef<CDense_seg> > dss(aln.GetSegs().GetDenseg().GetDim() - 1);
  103.     CDense_seg::TIds::const_iterator id = ds.GetIds().begin(); ++id;
  104.     CDense_seg::TStrands::const_iterator strand;
  105.     if (ds.IsSetStrands()) {
  106.         strand = ds.GetStrands().begin();
  107.         ++strand;
  108.     }
  109.     NON_CONST_ITERATE (vector<CRef<CDense_seg> >, iter, dss) {
  110.         *iter = new CDense_seg;
  111.         (*iter)->SetNumseg(ds.GetNumseg());
  112.         (*iter)->SetIds().push_back(ds.GetIds().front());
  113.         (*iter)->SetIds().push_back(*id);
  114.         ++id;
  115.         (*iter)->SetLens() = ds.GetLens();
  116.         if (ds.IsSetStrands()) {
  117.             (*iter)->SetStrands().push_back(ds.GetStrands().front());
  118.             (*iter)->SetStrands().push_back(*strand);
  119.             ++strand;
  120.         }
  121.     }
  122.     unsigned int i = 0;
  123.     ITERATE (CDense_seg::TStarts, iter, ds.GetStarts()) {
  124.         if (i % ds.GetDim()) {
  125.             dss[i % ds.GetDim() - 1]->SetStarts().push_back(*iter);
  126.         } else {
  127.             // start for master sequence; goes in all pairwise
  128.             for (unsigned int p = 0;  p < dss.size();  ++p) {
  129.                 dss[p]->SetStarts().push_back(*iter);
  130.             }
  131.         }
  132.         ++i;
  133.     }
  134.     // have Dense-segs; make Seq-aligns and append
  135.     for (unsigned int p = 0;  p < dss.size();  ++p) {
  136.         CRef<CSeq_align> pairwise(new CSeq_align);
  137.         pairwise->SetType(CSeq_align::eType_partial);
  138.         pairwise->SetDim(2);
  139.         pairwise->SetSegs().SetDenseg(*dss[p]);
  140.         pairs.push_back(pairwise);
  141.     }
  142. }
  143. void CAlgoPlugin_RunCn3d::RunCommand(CPluginMessage& msg)
  144. {
  145.     const CPluginCommand& args = msg.GetRequest().GetCommand();
  146.     CPluginReply& reply = msg.SetReply();
  147.     _TRACE("CAlgoPlugin_RunCn3d::Run()");
  148.     // retrieve our alignments
  149.     plugin_args::TAlignList aligns;
  150.     GetArgValue(args["aligns"], aligns);
  151.     // build a Ncbi-mime-asn1 object around alignments
  152.     CRef<CSeq_annot> annot(new CSeq_annot);
  153.     typedef map<CRef<CSeq_id>, CScope *, SIdLess> TIdScopeMap;
  154.     TIdScopeMap ids;
  155.     ITERATE (plugin_args::TAlignList, iter, aligns) {
  156.         s_AsPairwise(*iter->second, annot->SetData().SetAlign());
  157.         ITERATE (CDense_seg::TIds, id,
  158.                  iter->second->GetSegs().GetDenseg().GetIds()) {
  159.             ids.insert(make_pair(*id, &iter->first->GetScope()));
  160.         }
  161.     }
  162.     
  163.     CRef<CNcbi_mime_asn1> mime(new CNcbi_mime_asn1);
  164.     mime->SetGeneral().SetSeq_align_data().SetBundle().SetSeqaligns()
  165.         .push_back(annot);
  166.     ITERATE (TIdScopeMap, iter, ids) {
  167.         CRef<CBioseq> bs(new CBioseq);
  168.         CRef<CSeq_entry> entry(new CSeq_entry);
  169.         bs->Assign(*(iter->second)->GetBioseqHandle(*(iter->first))
  170.                       .GetCompleteBioseq());
  171.         entry->SetSeq(*bs);
  172.         mime->SetGeneral().SetSeq_align_data().SetBundle().SetSequences()
  173.             .push_back(entry);
  174.     }
  175.     // Write it to a temp file and launch the app
  176.     string fname = CFile::GetTmpName();
  177.     {{
  178.         auto_ptr<CObjectOStream>
  179.             ostr(CObjectOStream::Open(eSerial_AsnText, fname));
  180.         *ostr << *mime;
  181.     }}
  182.     CDeleteAtExit::Add(fname);
  183.     // Try to run Cn3D.  The path to the executable can
  184.     // come from the registry.  Otherwise "Cn3D" is tried.
  185.     CNcbiApplication* app = CNcbiApplication::Instance();
  186.     _ASSERT(app);
  187.     CNcbiRegistry& registry = app->GetConfig();
  188.     string path = registry.GetString("external_apps", "cn3d", "Cn3D");
  189.     bool new_path = 0;  // has a new path been set?
  190.     int phandle;
  191.     int status;
  192.     while (1) {
  193.         phandle = CExec::SpawnLP(CExec::eDetach, path.c_str(),
  194.                                  fname.c_str(), 0);
  195.         // this is a dicey way of finding out whether
  196.         // the spawn was successful
  197.         status = CExec::Wait(phandle, 1000);
  198.         if (status == -1) {
  199.             break;
  200.         }
  201.         const char *text = 
  202.             fl_file_chooser("Please locate the Cn3D application", "*", "");
  203.         if ( !text  ||  !*text ) {
  204.             break;
  205.         }
  206.         path = text;
  207.         new_path = true;
  208.     }
  209.     if (status == -1) {
  210.         reply.SetStatus(eMessageStatus_success);
  211.         if (new_path) {
  212.             registry.Set("external_apps", "cn3d", path,
  213.                          CNcbiRegistry::ePersistent);
  214.         }
  215.     }
  216. }
  217. END_NCBI_SCOPE
  218. /*
  219.  * ===========================================================================
  220.  * $Log: run_cn3d.cpp,v $
  221.  * Revision 1000.1  2004/06/01 20:55:55  gouriano
  222.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.7
  223.  *
  224.  * Revision 1.7  2004/05/21 22:27:47  gorelenk
  225.  * Added PCH ncbi_pch.hpp
  226.  *
  227.  * Revision 1.6  2004/05/20 12:37:58  dicuccio
  228.  * Added missing include for CDense_seg
  229.  *
  230.  * Revision 1.5  2004/05/15 03:17:04  ucko
  231.  * Add missing #includes (formerly indirect?)
  232.  *
  233.  * Revision 1.4  2004/05/03 13:05:42  dicuccio
  234.  * gui/utils --> gui/objutils where needed
  235.  *
  236.  * Revision 1.3  2004/04/16 17:23:06  ucko
  237.  * GetCompleteBioseq returns a CConstRef rather than a C++ reference.
  238.  *
  239.  * Revision 1.2  2004/04/16 14:43:37  dicuccio
  240.  * Use GetCompleteBioseq() instead of GetBioseq()
  241.  *
  242.  * Revision 1.1  2004/03/05 16:44:22  jcherry
  243.  * Initial version
  244.  *
  245.  * ===========================================================================
  246.  */