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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: bl2seq.cpp,v $
  4.  * PRODUCTION Revision 1000.4  2004/06/01 18:05:35  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.53
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: bl2seq.cpp,v 1000.4 2004/06/01 18:05:35 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:  Christiam Camacho
  35.  *
  36.  * ===========================================================================
  37.  */
  38. /// @file bl2seq.cpp
  39. /// Implementation of CBl2Seq class.
  40. #include <ncbi_pch.hpp>
  41. #include <objmgr/util/sequence.hpp>
  42. #include <objects/seqloc/Seq_loc.hpp>
  43. #include <objects/seqalign/Seq_align_set.hpp>
  44. #include <objects/seqalign/Seq_align.hpp>
  45. #include <algo/blast/api/bl2seq.hpp>
  46. #include <algo/blast/api/blast_options_handle.hpp>
  47. #include <algo/blast/api/multiseq_src.hpp>
  48. #include "blast_seqalign.hpp"
  49. #include "blast_setup.hpp"
  50. // NewBlast includes
  51. #include <algo/blast/core/blast_def.h>
  52. #include <algo/blast/core/blast_util.h>
  53. #include <algo/blast/core/blast_setup.h>
  54. #include <algo/blast/core/lookup_wrap.h>
  55. #include <algo/blast/core/blast_engine.h>
  56. #include <algo/blast/core/blast_traceback.h>
  57. /** @addtogroup AlgoBlast
  58.  *
  59.  * @{
  60.  */
  61. BEGIN_NCBI_SCOPE
  62. USING_SCOPE(objects);
  63. BEGIN_SCOPE(blast)
  64. CBl2Seq::CBl2Seq(const SSeqLoc& query, const SSeqLoc& subject, EProgram p)
  65.     : mi_bQuerySetUpDone(false)
  66. {
  67.     TSeqLocVector queries;
  68.     TSeqLocVector subjects;
  69.     queries.push_back(query);
  70.     subjects.push_back(subject);
  71.     x_InitSeqs(queries, subjects);
  72.     m_OptsHandle.Reset(CBlastOptionsFactory::Create(p));
  73. }
  74. CBl2Seq::CBl2Seq(const SSeqLoc& query, const SSeqLoc& subject,
  75.                  CBlastOptionsHandle& opts)
  76.     : mi_bQuerySetUpDone(false)
  77. {
  78.     TSeqLocVector queries;
  79.     TSeqLocVector subjects;
  80.     queries.push_back(query);
  81.     subjects.push_back(subject);
  82.     x_InitSeqs(queries, subjects);
  83.     m_OptsHandle.Reset(&opts);
  84. }
  85. CBl2Seq::CBl2Seq(const SSeqLoc& query, const TSeqLocVector& subjects, 
  86.                  EProgram p)
  87.     : mi_bQuerySetUpDone(false)
  88. {
  89.     TSeqLocVector queries;
  90.     queries.push_back(query);
  91.     x_InitSeqs(queries, subjects);
  92.     m_OptsHandle.Reset(CBlastOptionsFactory::Create(p));
  93. }
  94. CBl2Seq::CBl2Seq(const SSeqLoc& query, const TSeqLocVector& subjects, 
  95.                  CBlastOptionsHandle& opts)
  96.     : mi_bQuerySetUpDone(false)
  97. {
  98.     TSeqLocVector queries;
  99.     queries.push_back(query);
  100.     x_InitSeqs(queries, subjects);
  101.     m_OptsHandle.Reset(&opts);
  102. }
  103. CBl2Seq::CBl2Seq(const TSeqLocVector& queries, const TSeqLocVector& subjects, 
  104.                  EProgram p)
  105.     : mi_bQuerySetUpDone(false)
  106. {
  107.     x_InitSeqs(queries, subjects);
  108.     m_OptsHandle.Reset(CBlastOptionsFactory::Create(p));
  109. }
  110. CBl2Seq::CBl2Seq(const TSeqLocVector& queries, const TSeqLocVector& subjects, 
  111.                  CBlastOptionsHandle& opts)
  112.     : mi_bQuerySetUpDone(false)
  113. {
  114.     x_InitSeqs(queries, subjects);
  115.     m_OptsHandle.Reset(&opts);
  116. }
  117. void CBl2Seq::x_InitSeqs(const TSeqLocVector& queries, 
  118.                          const TSeqLocVector& subjs)
  119. {
  120.     m_tQueries = queries;
  121.     m_tSubjects = subjs;
  122.     mi_pScoreBlock = NULL;
  123.     mi_pLookupTable = NULL;
  124.     mi_pLookupSegments = NULL;
  125.     mi_pResults = NULL;
  126.     mi_pDiagnostics = NULL;
  127.     mi_pSeqSrc = NULL;
  128. }
  129. CBl2Seq::~CBl2Seq()
  130.     x_ResetQueryDs();
  131.     x_ResetSubjectDs();
  132. }
  133. /// Resets query data structures
  134. void
  135. CBl2Seq::x_ResetQueryDs()
  136. {
  137.     mi_bQuerySetUpDone = false;
  138.     // should be changed if derived classes are created
  139.     mi_clsQueries.Reset(NULL);
  140.     mi_clsQueryInfo.Reset(NULL);
  141.     mi_pScoreBlock = BlastScoreBlkFree(mi_pScoreBlock);
  142.     mi_pLookupTable = LookupTableWrapFree(mi_pLookupTable);
  143.     mi_pLookupSegments = ListNodeFreeData(mi_pLookupSegments);
  144.     // TODO: should clean filtered regions?
  145. }
  146. /// Resets subject data structures
  147. void
  148. CBl2Seq::x_ResetSubjectDs()
  149. {
  150.     // Clean up structures and results from any previous search
  151.     mi_pSeqSrc = BlastSeqSrcFree(mi_pSeqSrc);
  152.     mi_pResults = Blast_HSPResultsFree(mi_pResults);
  153.     mi_pDiagnostics = Blast_DiagnosticsFree(mi_pDiagnostics);
  154.     // TODO: Should clear class wrappers for internal parameters structures?
  155.     //      -> destructors will be called for them
  156.     //m_OptsHandle->SetDbSeqNum(0);  // FIXME: Really needed?
  157.     //m_OptsHandle->SetDbLength(0);  // FIXME: Really needed?
  158. }
  159. TSeqAlignVector
  160. CBl2Seq::Run() THROWS((CBlastException))
  161. {
  162.     //m_OptsHandle->GetOptions().DebugDumpText(cerr, "m_OptsHandle", 1);
  163.     SetupSearch();
  164.     m_OptsHandle->GetOptions().Validate();  // throws an exception on failure
  165.     ScanDB();
  166.     return x_Results2SeqAlign();
  167. }
  168. void 
  169. CBl2Seq::SetupSearch()
  170. {
  171.     if ( !mi_bQuerySetUpDone ) {
  172.         x_ResetQueryDs();
  173.         SetupQueryInfo(m_tQueries, m_OptsHandle->GetOptions(), &mi_clsQueryInfo);
  174.         SetupQueries(m_tQueries, m_OptsHandle->GetOptions(), mi_clsQueryInfo, 
  175.                      &mi_clsQueries);
  176.         // FIXME
  177.         BlastMaskLoc* filter_mask = NULL;
  178.         Blast_Message* blmsg = NULL;
  179.         double scale_factor = 1.0;
  180.         short st;
  181.         st = BLAST_MainSetUp(m_OptsHandle->GetOptions().GetProgram(), 
  182.                              m_OptsHandle->GetOptions().GetQueryOpts(),
  183.                              m_OptsHandle->GetOptions().GetScoringOpts(),
  184.                              m_OptsHandle->GetOptions().GetHitSaveOpts(),
  185.                              mi_clsQueries, 
  186.                              mi_clsQueryInfo, 
  187.                              scale_factor,
  188.                              &mi_pLookupSegments, 
  189.                              &filter_mask, &mi_pScoreBlock, &blmsg);
  190.         // Convert the BlastMaskLoc* into a CSeq_loc
  191.         // TODO: Implement this! 
  192.         //mi_vFilteredRegions = BLASTBlastMaskLoc2SeqLoc(filter_mask);
  193.         BlastMaskLocFree(filter_mask); // FIXME, return seqlocs for formatter
  194.         // TODO: Check that lookup_segments are not filtering the whole 
  195.         // sequence (SSeqRange set to -1 -1)
  196.         if (st != 0) {
  197.             string msg = blmsg ? blmsg->message : "BLAST_MainSetUp failed";
  198.             Blast_MessageFree(blmsg);
  199.             NCBI_THROW(CBlastException, eInternal, msg.c_str());
  200.         }
  201.         Blast_MessageFree(blmsg);
  202.         LookupTableWrapInit(mi_clsQueries, 
  203.                             m_OptsHandle->GetOptions().GetLutOpts(),
  204.                             mi_pLookupSegments, mi_pScoreBlock, 
  205.                             &mi_pLookupTable, NULL);
  206.         mi_bQuerySetUpDone = true;
  207.     }
  208.     x_ResetSubjectDs();
  209.     mi_pSeqSrc = MultiSeqSrcInit(m_tSubjects, 
  210.                                  m_OptsHandle->GetOptions().GetProgram());
  211.     // Set the hitlist size to the total number of subject sequences, to 
  212.     // make sure that no hits are discarded.
  213.     m_OptsHandle->SetHitlistSize(m_tSubjects.size());
  214.     m_OptsHandle->SetPrelimHitlistSize(m_tSubjects.size());
  215. }
  216. void 
  217. CBl2Seq::ScanDB()
  218. {
  219.     mi_pResults = NULL;
  220.     mi_pDiagnostics = Blast_DiagnosticsInit();
  221.     Blast_HSPResultsInit(mi_clsQueryInfo->num_queries, &mi_pResults);
  222.     BLAST_SearchEngine(m_OptsHandle->GetOptions().GetProgram(),
  223.                        mi_clsQueries, mi_clsQueryInfo, 
  224.                        mi_pSeqSrc, mi_pScoreBlock, 
  225.                        m_OptsHandle->GetOptions().GetScoringOpts(),
  226.                        mi_pLookupTable,
  227.                        m_OptsHandle->GetOptions().GetInitWordOpts(),
  228.                        m_OptsHandle->GetOptions().GetExtnOpts(),
  229.                        m_OptsHandle->GetOptions().GetHitSaveOpts(),
  230.                        m_OptsHandle->GetOptions().GetEffLenOpts(),
  231.                        NULL, m_OptsHandle->GetOptions().GetDbOpts(),
  232.                        mi_pResults, mi_pDiagnostics);
  233. }
  234. /** Unlike the database search, we want to make sure that a seqalign list is   
  235.  * returned for each query/subject pair, even if it is empty. Also we don't 
  236.  * want subjects to be sorted in seqalign results. Hence we retrieve results 
  237.  * for each subject separately and append the resulting vectors of seqalign
  238.  * lists. 
  239.  */
  240. TSeqAlignVector
  241. CBl2Seq::x_Results2SeqAlign()
  242. {
  243.     TSeqAlignVector retval;
  244.     retval.reserve(m_tQueries.size());
  245.     ASSERT(mi_pResults->num_queries == (int)m_tQueries.size());
  246.     for (unsigned int index = 0; index < m_tSubjects.size(); ++index)
  247.     {
  248.         TSeqAlignVector seqalign =
  249.             BLAST_OneSubjectResults2CSeqAlign(mi_pResults,
  250.                  m_OptsHandle->GetOptions().GetProgram(),
  251.                  m_tQueries, mi_pSeqSrc, index,
  252.                  m_OptsHandle->GetOptions().GetScoringOpts(), 
  253.                  mi_pScoreBlock);
  254.         /* Merge the new vector with the current. Assume that both vectors
  255.            contain CSeq_align_sets for all queries, i.e. have the same 
  256.            size. */
  257.         ASSERT(seqalign.size() == m_tQueries.size());
  258.         if (retval.size() == 0) {
  259.             // First time around, just fill the empty vector with the 
  260.             // seqaligns from the first subject.
  261.             retval.swap(seqalign);
  262.         } else {
  263.             for (unsigned int i = 0; i < retval.size(); ++i) {
  264.                 retval[i]->Set().splice(retval[i]->Set().end(),
  265.                                        seqalign[i]->Set());
  266.             }
  267.         }
  268.     }
  269.     // Clean up structures
  270.     mi_clsInitWordParams.Reset(NULL);
  271.     mi_clsHitSavingParams.Reset(NULL);
  272.     mi_clsExtnWord.Reset(NULL);
  273.     mi_clsExtnParams.Reset(NULL);
  274.     mi_clsGapAlign.Reset(NULL);
  275.     return retval;
  276. }
  277. END_SCOPE(blast)
  278. END_NCBI_SCOPE
  279. /* @} */
  280. /*
  281.  * ===========================================================================
  282.  *
  283.  * $Log: bl2seq.cpp,v $
  284.  * Revision 1000.4  2004/06/01 18:05:35  gouriano
  285.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.53
  286.  *
  287.  * Revision 1.53  2004/05/21 21:41:02  gorelenk
  288.  * Added PCH ncbi_pch.hpp
  289.  *
  290.  * Revision 1.52  2004/05/14 17:16:12  dondosha
  291.  * BlastReturnStat structure changed to BlastDiagnostics and refactored
  292.  *
  293.  * Revision 1.51  2004/05/07 15:28:05  papadopo
  294.  * add scale factor of 1.0 to BlastMainSetup
  295.  *
  296.  * Revision 1.50  2004/05/05 15:28:56  dondosha
  297.  * Renamed functions in blast_hits.h accordance with new convention Blast_[StructName][Task]
  298.  *
  299.  * Revision 1.49  2004/04/30 16:53:06  dondosha
  300.  * Changed a number of function names to have the same conventional Blast_ prefix
  301.  *
  302.  * Revision 1.48  2004/04/05 16:09:27  camacho
  303.  * Rename DoubleInt -> SSeqRange
  304.  *
  305.  * Revision 1.47  2004/03/24 19:14:48  dondosha
  306.  * Fixed memory leaks
  307.  *
  308.  * Revision 1.46  2004/03/19 19:22:55  camacho
  309.  * Move to doxygen group AlgoBlast, add missing CVS logs at EOF
  310.  *
  311.  * Revision 1.45  2004/03/15 19:56:03  dondosha
  312.  * Use sequence source instead of accessing subjects directly
  313.  *
  314.  * Revision 1.44  2004/03/10 17:37:36  papadopo
  315.  * add (unused) RPS info pointer to LookupTableWrapInit()
  316.  *
  317.  * Revision 1.43  2004/02/24 18:16:29  dondosha
  318.  * Removed lookup options argument from call to BLAST_MainSetUp
  319.  *
  320.  * Revision 1.42  2004/02/13 21:21:30  camacho
  321.  * Add throws clause to Run method
  322.  *
  323.  * Revision 1.41  2004/02/13 19:32:55  camacho
  324.  * Removed unnecessary #defines
  325.  *
  326.  * Revision 1.40  2004/01/16 21:52:59  bealer
  327.  * - Changes for Blast4 API
  328.  *
  329.  * Revision 1.39  2004/01/02 18:53:27  camacho
  330.  * Fix assertion
  331.  *
  332.  * Revision 1.38  2003/12/03 16:43:46  dondosha
  333.  * Renamed BlastMask to BlastMaskLoc, BlastResults to BlastHSPResults
  334.  *
  335.  * Revision 1.37  2003/11/26 18:23:58  camacho
  336.  * +Blast Option Handle classes
  337.  *
  338.  * Revision 1.36  2003/11/03 15:20:39  camacho
  339.  * Make multiple query processing the default for Run().
  340.  *
  341.  * Revision 1.35  2003/10/31 00:05:15  camacho
  342.  * Changes to return discontinuous seq-aligns for each query-subject pair
  343.  *
  344.  * Revision 1.34  2003/10/30 19:34:53  dondosha
  345.  * Removed gapped_calculation from BlastHitSavingOptions structure
  346.  *
  347.  * Revision 1.33  2003/09/11 17:45:03  camacho
  348.  * Changed CBlastOption -> CBlastOptions
  349.  *
  350.  * Revision 1.32  2003/09/10 20:01:30  dondosha
  351.  * Use lookup_wrap.h
  352.  *
  353.  * Revision 1.31  2003/09/09 20:31:13  camacho
  354.  * Add const type qualifier
  355.  *
  356.  * Revision 1.30  2003/09/09 15:18:02  camacho
  357.  * Fix includes
  358.  *
  359.  * Revision 1.29  2003/09/09 12:55:09  camacho
  360.  * Moved setup member functions to blast_setup_cxx.cpp
  361.  *
  362.  * Revision 1.28  2003/09/03 19:36:58  camacho
  363.  * Fix include path for blast_setup.hpp, code clean up
  364.  *
  365.  * Revision 1.27  2003/08/28 22:42:54  camacho
  366.  * Change BLASTGetSequence signature
  367.  *
  368.  * Revision 1.26  2003/08/28 17:37:06  camacho
  369.  * Fix memory leaks, properly reset structure wrappers
  370.  *
  371.  * Revision 1.25  2003/08/28 15:48:23  madden
  372.  * Make buf one longer for sentinel byte
  373.  *
  374.  * Revision 1.24  2003/08/25 17:15:49  camacho
  375.  * Removed redundant typedef
  376.  *
  377.  * Revision 1.23  2003/08/19 22:12:47  dondosha
  378.  * Cosmetic changes
  379.  *
  380.  * Revision 1.22  2003/08/19 20:27:06  dondosha
  381.  * EProgram enum type is no longer part of CBlastOptions class
  382.  *
  383.  * Revision 1.21  2003/08/19 13:46:13  dicuccio
  384.  * Added 'USING_SCOPE(objects)' to .cpp files for ease of reading implementation.
  385.  *
  386.  * Revision 1.20  2003/08/18 22:17:36  camacho
  387.  * Renaming of SSeqLoc members
  388.  *
  389.  * Revision 1.19  2003/08/18 20:58:57  camacho
  390.  * Added blast namespace, removed *__.hpp includes
  391.  *
  392.  * Revision 1.18  2003/08/18 19:58:50  dicuccio
  393.  * Fixed compilation errors after change from pair<> to SSeqLoc
  394.  *
  395.  * Revision 1.17  2003/08/18 17:07:41  camacho
  396.  * Introduce new SSeqLoc structure (replaces pair<CSeq_loc, CScope>).
  397.  * Change in function to read seqlocs from files.
  398.  *
  399.  * Revision 1.16  2003/08/15 15:59:13  dondosha
  400.  * Changed call to BLAST_Results2CSeqAlign according to new prototype
  401.  *
  402.  * Revision 1.15  2003/08/12 19:21:08  dondosha
  403.  * Subject id argument to BLAST_Results2CppSeqAlign is now a simple pointer, allowing it to be NULL
  404.  *
  405.  * Revision 1.14  2003/08/11 19:55:55  camacho
  406.  * Early commit to support query concatenation and the use of multiple scopes.
  407.  * Compiles, but still needs work.
  408.  *
  409.  * Revision 1.13  2003/08/11 15:23:59  dondosha
  410.  * Renamed conversion functions between BlastMaskLoc and CSeqLoc; added algo/blast/core to headers from core BLAST library
  411.  *
  412.  * Revision 1.12  2003/08/11 14:00:41  dicuccio
  413.  * Indenting changes.  Fixed use of C++ namespaces (USING_SCOPE(objects) inside of
  414.  * BEGIN_NCBI_SCOPE block)
  415.  *
  416.  * Revision 1.11  2003/08/08 19:43:07  dicuccio
  417.  * Compilation fixes: #include file rearrangement; fixed use of 'list' and
  418.  * 'vector' as variable names; fixed missing ostrea<< for __int64
  419.  *
  420.  * Revision 1.10  2003/08/01 17:40:56  dondosha
  421.  * Use renamed functions and structures from local blastkar.h
  422.  *
  423.  * Revision 1.9  2003/07/31 19:45:33  camacho
  424.  * Eliminate Ptr notation
  425.  *
  426.  * Revision 1.8  2003/07/30 19:58:02  coulouri
  427.  * use ListNode
  428.  *
  429.  * Revision 1.7  2003/07/30 15:00:01  camacho
  430.  * Do not use Malloc/MemNew/MemFree
  431.  *
  432.  * Revision 1.6  2003/07/29 14:15:12  camacho
  433.  * Do not use MemFree/Malloc
  434.  *
  435.  * Revision 1.5  2003/07/28 22:20:17  camacho
  436.  * Removed unused argument
  437.  *
  438.  * Revision 1.4  2003/07/23 21:30:40  camacho
  439.  * Calls to options member functions
  440.  *
  441.  * Revision 1.3  2003/07/15 19:21:36  camacho
  442.  * Use correct strands and sequence buffer length
  443.  *
  444.  * Revision 1.2  2003/07/14 22:16:37  camacho
  445.  * Added interface to retrieve masked regions
  446.  *
  447.  * Revision 1.1  2003/07/10 18:34:19  camacho
  448.  * Initial revision
  449.  *
  450.  *
  451.  * ===========================================================================
  452.  */