wbplg_splign.cpp
来自「ncbi源码」· C++ 代码 · 共 275 行
CPP
275 行
/* * =========================================================================== * PRODUCTION $Log: wbplg_splign.cpp,v $ * PRODUCTION Revision 1000.0 2004/06/01 21:26:20 gouriano * PRODUCTION PRODUCTION: IMPORTED [GCC34_MSVC7] Dev-tree R1.5 * PRODUCTION * =========================================================================== *//* $Id: wbplg_splign.cpp,v 1000.0 2004/06/01 21:26:20 gouriano Exp $ * =========================================================================== * * PUBLIC DOMAIN NOTICE * National Center for Biotechnology Information * * This software/database is a "United States Government Work" under the * terms of the United States Copyright Act. It was written as part of * the author's official duties as a United States Government employee and * thus cannot be copyrighted. This software/database is freely available * to the public for use. The National Library of Medicine and the U.S. * Government have not placed any restriction on its use or reproduction. * * Although all reasonable efforts have been taken to ensure the accuracy * and reliability of the software and data, the NLM and the U.S. * Government do not and cannot warrant the performance or results that * may be obtained by using this software or data. The NLM and the U.S. * Government disclaim all warranties, express or implied, including * warranties of performance, merchantability or fitness for any particular * purpose. * * Please cite the author in any work or product based on this material. * * =========================================================================== * * Authors: Yuri Kapustin * * File Description: * Splign Genome Workbench Plugin */#include <ncbi_pch.hpp>#include "wbplg_splign.hpp"#include <algo/align/splign/splign_simple.hpp>#include <corelib/ncbitime.hpp>#include <gui/core/doc_manager.hpp>#include <gui/core/idocument.hpp>#include <gui/core/plugin_utils.hpp>#include <gui/core/version.hpp>#include <gui/plugin/PluginArgSet.hpp>#include <gui/plugin/PluginCommandSet.hpp>#include <gui/plugin/PluginInfo.hpp>#include <gui/plugin/PluginMessage.hpp>#include <gui/plugin/PluginRequest.hpp>#include <gui/plugin/PluginValueConstraint.hpp>#include <gui/utils/message_box.hpp>#include <gui/objutils/label.hpp>#include <objects/seqalign/Dense_seg.hpp>#include <objects/seqalign/Seq_align.hpp>#include <objmgr/seq_vector.hpp>#include <objmgr/util/feature.hpp>#include <objmgr/util/sequence.hpp>//////////BEGIN_NCBI_SCOPEUSING_SCOPE(objects);const char kStrand_plus[] = "plus";const char kStrand_minus[] = "minus";// GetInfo()// static interface to retrieve plugin registration informationvoid CAlgoPlugin_Splign::GetInfo(CPluginInfo& info){ info.Reset(); // version info macro info.SetInfo(CPluginVersion::eMajor, CPluginVersion::eMinor, 0, string(__DATE__) + " " + string(__TIME__), "CAlgoPlugin_Splign", "Alignments/Spliced Alignment", "Compute cDNA-to-genomic alignments", ""); // command info CPluginCommandSet& cmds = info.SetCommands(); CPluginCommand& args = cmds.AddAlgoCommand(eAlgoCommand_run); args.AddArgument("seqs", "Sequences to align", CSeq_loc::GetTypeInfo(), CPluginArg::TData::e_Array); args.SetConstraint("seqs", (*CPluginValueConstraint::CreateSeqMol(), CSeq_inst::eMol_na, CSeq_inst::eMol_dna, CSeq_inst::eMol_rna)); args.AddDefaultArgument("strand", "cDna strand", CPluginArg::eString, kStrand_plus); args.SetConstraint("strand", (*CPluginValueConstraint::CreateSet(), kStrand_plus, kStrand_minus)); args.AddDefaultArgument("compartment_penalty", "Compartment penalty", CPluginArg::eDouble, ".75"); args.SetConstraint("compartment_penalty", *(CPluginValueConstraint::CreateRange("0", "1"))); args.AddDefaultArgument("min_idty", "Min exon identity", CPluginArg::eDouble, "0.75"); args.SetConstraint("min_idty", *(CPluginValueConstraint::CreateRange("0", "1")));}void CAlgoPlugin_Splign::RunCommand(CPluginMessage& msg){ const CPluginCommand& cmd = msg.GetRequest().GetCommand(); CPluginReply& reply = msg.SetReply(); reply.SetStatus(eMessageStatus_failed); // check to see that we were passed sequences to begin with if ( !CPluginUtils::IsValid(cmd["seqs"]) ) { reply.SetStatus(eMessageStatus_failed); return; } // make sure we have exactly two sequences plugin_args::TLocList locs; GetArgValue(cmd["seqs"], locs); if (locs.size() != 2) { reply.SetStatus(eMessageStatus_ignored); return; } // make sure that the sequences are of a known type; fetch the seqlocs CRef<CScope> new_scope; ITERATE (plugin_args::TLocList, loc_iter, locs) { const CSeq_loc& loc = *loc_iter->second; const IDocument& doc = *loc_iter->first; CScope& scope = doc.GetScope(); if ( !new_scope ) { new_scope.Reset(&scope); } if ( !sequence::IsOneBioseq(loc, &scope) ) { string msg = CPluginUtils::GetLabel(loc, &doc.GetScope()); LOG_POST(Info << "CAlgoPlugin_Splign: " "location on multiple bioseqs ignored: " << msg); continue; } } CConstRef<CSeq_loc> seqloc_cDna (locs.front().second); CConstRef<CSeq_loc> seqloc_genomic (locs.back().second); try { CSplignSimple splign_simple (*seqloc_cDna, *seqloc_genomic, *new_scope); CSplign& splign = splign_simple.SetSplignObject(); splign.SetEndGapDetection(true); splign.SetPolyaDetection(true); splign.SetStrand(cmd["strand"].AsString() == kStrand_plus); splign.SetMaxGenomicExtension(75000); splign.SetMinQueryCoverage(0.01); splign.SetCompartmentPenalty(cmd["compartment_penalty"].AsDouble()); splign.SetMinExonIdentity(cmd["min_idty"].AsDouble()); splign_simple.Run(); CRef<CSeq_align_set> seqalign_set = splign_simple.GetResultsAsAln(); // pack the alignment in a Seq-annot and label it appropriately CRef<CSeq_annot> seqannot (new CSeq_annot()); CSeq_annot::TData::TAlign& seqannot_align = seqannot->SetData().SetAlign(); ITERATE(CSeq_align_set::Tdata, align, seqalign_set->Get()) { seqannot_align.push_back(*align); } // prepare a title string str = "Spliced alignment of "; CLabel::GetLabel(*seqloc_cDna, &str, CLabel::eDefault, new_scope); str += " and "; CLabel::GetLabel(*seqloc_genomic, &str, CLabel::eDefault, new_scope); seqannot->AddTitle(str); CTime time; time.GetLocalTime(); seqannot->SetCreateDate(time); // // pass back to the system. We may use the same scope and just attach, // if that is appropriate // CConstRef<IDocument> doc_ref; ITERATE (plugin_args::TLocList, iter, locs) { if ( !doc_ref ) { doc_ref.Reset(iter->first); } else if (iter->first != doc_ref) { doc_ref.Reset(); break; } } if ( !doc_ref ) { // // query and targets come from different documents // create a new one to handle the results // CRef<CScope> new_scope(new CScope(CDocManager::GetObjectManager())); ITERATE (plugin_args::TLocList, iter, locs) { new_scope->AddScope(iter->first->GetScope()); } doc_ref.Reset(CDocManager::CreateDocument(*new_scope, *seqannot)); } else { reply.AddAction(CPluginReplyAction::e_Add_to_document); } reply.AddObject(*doc_ref, *seqannot); reply.SetStatus(eMessageStatus_success); } catch (CException& e) { NcbiMessageBox("Spliced alignment failed:\n" + e.GetMsg()); } catch(exception& e) { NcbiMessageBox(string("Spliced alignment failed:\n") + e.what()); }}END_NCBI_SCOPE/* * =========================================================================== * $Log: wbplg_splign.cpp,v $ * Revision 1000.0 2004/06/01 21:26:20 gouriano * PRODUCTION: IMPORTED [GCC34_MSVC7] Dev-tree R1.5 * * Revision 1.5 2004/05/21 22:27:46 gorelenk * Added PCH ncbi_pch.hpp * * Revision 1.4 2004/05/20 12:36:43 dicuccio * Minor code clean-up. Reordered constraints to be next to arguments. Use * CLabel for labels instead of native label functions. Use * CSeq_annot::SetCreateTime() instead of doing this manually * * Revision 1.3 2004/05/18 17:49:47 kapustin * Shorten argument descriptions to fit workbench plugin title space * * Revision 1.2 2004/05/17 20:53:03 kapustin * Fix the seqs constraint * * Revision 1.1 2004/05/17 15:11:44 kapustin * Initial revision * * ===========================================================================*/
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?