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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: wbplg_splign.cpp,v $
  4.  * PRODUCTION Revision 1000.0  2004/06/01 21:26:20  gouriano
  5.  * PRODUCTION PRODUCTION: IMPORTED [GCC34_MSVC7] Dev-tree R1.5
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: wbplg_splign.cpp,v 1000.0 2004/06/01 21:26:20 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:  Yuri Kapustin
  35.  *
  36.  * File Description:
  37.  *     Splign Genome Workbench Plugin
  38.  */
  39. #include <ncbi_pch.hpp>
  40. #include "wbplg_splign.hpp"
  41. #include <algo/align/splign/splign_simple.hpp>
  42. #include <corelib/ncbitime.hpp>
  43. #include <gui/core/doc_manager.hpp>
  44. #include <gui/core/idocument.hpp>
  45. #include <gui/core/plugin_utils.hpp>
  46. #include <gui/core/version.hpp>
  47. #include <gui/plugin/PluginArgSet.hpp>
  48. #include <gui/plugin/PluginCommandSet.hpp>
  49. #include <gui/plugin/PluginInfo.hpp>
  50. #include <gui/plugin/PluginMessage.hpp>
  51. #include <gui/plugin/PluginRequest.hpp>
  52. #include <gui/plugin/PluginValueConstraint.hpp>
  53. #include <gui/utils/message_box.hpp>
  54. #include <gui/objutils/label.hpp>
  55. #include <objects/seqalign/Dense_seg.hpp>
  56. #include <objects/seqalign/Seq_align.hpp>
  57. #include <objmgr/seq_vector.hpp>
  58. #include <objmgr/util/feature.hpp>
  59. #include <objmgr/util/sequence.hpp>
  60. //////////
  61. BEGIN_NCBI_SCOPE
  62. USING_SCOPE(objects);
  63. const char kStrand_plus[] = "plus";
  64. const char kStrand_minus[] = "minus";
  65. // GetInfo()
  66. // static interface to retrieve plugin registration information
  67. void CAlgoPlugin_Splign::GetInfo(CPluginInfo& info)
  68. {
  69.     info.Reset();
  70.     // version info macro
  71.     info.SetInfo(CPluginVersion::eMajor, CPluginVersion::eMinor, 0,
  72.                  string(__DATE__) + " " + string(__TIME__),
  73.                  "CAlgoPlugin_Splign",
  74.                  "Alignments/Spliced Alignment",
  75.                  "Compute cDNA-to-genomic alignments",
  76.                  "");
  77.     // command info
  78.     CPluginCommandSet& cmds = info.SetCommands();
  79.     CPluginCommand&    args = cmds.AddAlgoCommand(eAlgoCommand_run);
  80.     args.AddArgument("seqs", "Sequences to align",
  81.                      CSeq_loc::GetTypeInfo(),
  82.                      CPluginArg::TData::e_Array);
  83.     args.SetConstraint("seqs",
  84.                        (*CPluginValueConstraint::CreateSeqMol(),
  85.                         CSeq_inst::eMol_na,
  86.                         CSeq_inst::eMol_dna,
  87.                         CSeq_inst::eMol_rna));
  88.     args.AddDefaultArgument("strand", "cDna strand",
  89.                             CPluginArg::eString,
  90.                             kStrand_plus);
  91.     args.SetConstraint("strand", (*CPluginValueConstraint::CreateSet(),
  92.                                   kStrand_plus, kStrand_minus));
  93.     args.AddDefaultArgument("compartment_penalty",
  94.                             "Compartment penalty",
  95.                             CPluginArg::eDouble,
  96.                             ".75");
  97.     args.SetConstraint("compartment_penalty",
  98.                        *(CPluginValueConstraint::CreateRange("0", "1")));
  99.     args.AddDefaultArgument("min_idty",
  100.                             "Min exon identity",
  101.                             CPluginArg::eDouble,
  102.                             "0.75");
  103.     args.SetConstraint("min_idty",
  104.                        *(CPluginValueConstraint::CreateRange("0", "1")));
  105. }
  106. void CAlgoPlugin_Splign::RunCommand(CPluginMessage& msg)
  107. {
  108.     const CPluginCommand& cmd = msg.GetRequest().GetCommand();
  109.     CPluginReply& reply = msg.SetReply();
  110.     reply.SetStatus(eMessageStatus_failed);
  111.     // check to see that we were passed sequences to begin with
  112.     if ( !CPluginUtils::IsValid(cmd["seqs"]) ) {
  113.         reply.SetStatus(eMessageStatus_failed);
  114.         return;
  115.     }
  116.     // make sure we have exactly two sequences
  117.     plugin_args::TLocList locs;
  118.     GetArgValue(cmd["seqs"], locs);
  119.     if (locs.size() != 2) {
  120.         reply.SetStatus(eMessageStatus_ignored);
  121.         return;
  122.     }
  123.     // make sure that the sequences are of a known type; fetch the seqlocs
  124.     CRef<CScope> new_scope;
  125.     ITERATE (plugin_args::TLocList, loc_iter, locs) {
  126.         const CSeq_loc&  loc = *loc_iter->second;
  127.         const IDocument& doc = *loc_iter->first;
  128.         CScope& scope = doc.GetScope();
  129.         if ( !new_scope ) {
  130.             new_scope.Reset(&scope);
  131.         }
  132.         if ( !sequence::IsOneBioseq(loc, &scope) ) {
  133.             string msg = CPluginUtils::GetLabel(loc, &doc.GetScope());
  134.             LOG_POST(Info << "CAlgoPlugin_Splign: "
  135.                      "location on multiple bioseqs ignored: " << msg);
  136.             continue;
  137.         }
  138.     }
  139.     CConstRef<CSeq_loc> seqloc_cDna (locs.front().second);
  140.     CConstRef<CSeq_loc> seqloc_genomic (locs.back().second);
  141.     try {
  142.         CSplignSimple splign_simple (*seqloc_cDna, *seqloc_genomic,
  143.                                      *new_scope);
  144.         CSplign& splign = splign_simple.SetSplignObject();
  145.         splign.SetEndGapDetection(true);
  146.         splign.SetPolyaDetection(true);
  147.         splign.SetStrand(cmd["strand"].AsString() == kStrand_plus);
  148.         splign.SetMaxGenomicExtension(75000);
  149.         splign.SetMinQueryCoverage(0.01);
  150.         splign.SetCompartmentPenalty(cmd["compartment_penalty"].AsDouble());
  151.         splign.SetMinExonIdentity(cmd["min_idty"].AsDouble());
  152.         splign_simple.Run();
  153.         CRef<CSeq_align_set> seqalign_set = splign_simple.GetResultsAsAln();
  154.         // pack the alignment in a Seq-annot and label it appropriately
  155.         CRef<CSeq_annot> seqannot (new CSeq_annot());
  156.         CSeq_annot::TData::TAlign& seqannot_align = 
  157.             seqannot->SetData().SetAlign(); 
  158.         ITERATE(CSeq_align_set::Tdata, align, seqalign_set->Get()) {
  159.             seqannot_align.push_back(*align);
  160.         }
  161.         // prepare a title
  162.         string str = "Spliced alignment of ";
  163.         CLabel::GetLabel(*seqloc_cDna, &str,
  164.                          CLabel::eDefault, new_scope);
  165.         str += " and ";
  166.         CLabel::GetLabel(*seqloc_genomic, &str,
  167.                          CLabel::eDefault, new_scope);
  168.         
  169.         seqannot->AddTitle(str);
  170.         CTime time;
  171.         time.GetLocalTime();
  172.         seqannot->SetCreateDate(time);
  173.         //
  174.         // pass back to the system.  We may use the same scope and just attach,
  175.         // if that is appropriate
  176.         //
  177.         CConstRef<IDocument> doc_ref;
  178.         ITERATE (plugin_args::TLocList, iter, locs) {
  179.             if ( !doc_ref ) {
  180.                 doc_ref.Reset(iter->first);
  181.             } else if (iter->first != doc_ref) {
  182.                 doc_ref.Reset();
  183.                 break;
  184.             }
  185.         }
  186.         if ( !doc_ref ) {
  187.             //
  188.             // query and targets come from different documents
  189.             // create a new one to handle the results
  190.             //
  191.             CRef<CScope> new_scope(new CScope(CDocManager::GetObjectManager()));
  192.             ITERATE (plugin_args::TLocList, iter, locs) {
  193.                 new_scope->AddScope(iter->first->GetScope());
  194.             }
  195.             doc_ref.Reset(CDocManager::CreateDocument(*new_scope, *seqannot));
  196.         } else {
  197.             reply.AddAction(CPluginReplyAction::e_Add_to_document);
  198.         }
  199.         reply.AddObject(*doc_ref, *seqannot);
  200.         reply.SetStatus(eMessageStatus_success);
  201.     }
  202.     catch (CException& e) {
  203.         NcbiMessageBox("Spliced alignment failed:n" + e.GetMsg());
  204.     }
  205.     catch(exception& e) {
  206.         NcbiMessageBox(string("Spliced alignment failed:n") + e.what());
  207.     }
  208. }
  209. END_NCBI_SCOPE
  210. /*
  211.  * ===========================================================================
  212.  * $Log: wbplg_splign.cpp,v $
  213.  * Revision 1000.0  2004/06/01 21:26:20  gouriano
  214.  * PRODUCTION: IMPORTED [GCC34_MSVC7] Dev-tree R1.5
  215.  *
  216.  * Revision 1.5  2004/05/21 22:27:46  gorelenk
  217.  * Added PCH ncbi_pch.hpp
  218.  *
  219.  * Revision 1.4  2004/05/20 12:36:43  dicuccio
  220.  * Minor code clean-up.  Reordered constraints to be next to arguments.  Use
  221.  * CLabel for labels instead of native label functions.  Use
  222.  * CSeq_annot::SetCreateTime() instead of doing this manually
  223.  *
  224.  * Revision 1.3  2004/05/18 17:49:47  kapustin
  225.  * Shorten argument descriptions to fit workbench plugin title space
  226.  *
  227.  * Revision 1.2  2004/05/17 20:53:03  kapustin
  228.  * Fix the seqs constraint
  229.  *
  230.  * Revision 1.1  2004/05/17 15:11:44  kapustin
  231.  * Initial revision
  232.  *
  233.  * ===========================================================================
  234. */