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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: alnmrg.cpp,v $
  4.  * PRODUCTION Revision 1000.3  2004/06/01 19:40:52  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.20
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: alnmrg.cpp,v 1000.3 2004/06/01 19:40:52 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:  Kamen Todorov, NCBI
  35. *
  36. * File Description:
  37. *   Alignment merger. Demonstration of CAlnMix usage.
  38. *
  39. * ===========================================================================
  40. */
  41. #include <ncbi_pch.hpp>
  42. #include <corelib/ncbiapp.hpp>
  43. #include <corelib/ncbiargs.hpp>
  44. #include <corelib/ncbienv.hpp>
  45. #include <serial/iterator.hpp>
  46. #include <serial/objistr.hpp>
  47. #include <serial/objostr.hpp>
  48. #include <serial/serial.hpp>
  49. #include <objects/seq/Bioseq.hpp>
  50. #include <objects/seqloc/Seq_id.hpp>
  51. #include <objects/seqloc/Textseq_id.hpp>
  52. #include <objects/seqset/Seq_entry.hpp>
  53. #include <objects/seqalign/Seq_align.hpp>
  54. #include <objects/seqalign/Seq_align_set.hpp>
  55. #include <objects/seqalign/Std_seg.hpp>
  56. #include <objects/seq/Seq_annot.hpp>
  57. #include <objects/submit/Seq_submit.hpp>
  58. #include <objtools/data_loaders/genbank/gbloader.hpp>
  59. #include <objmgr/object_manager.hpp>
  60. #include <objmgr/scope.hpp>
  61. #include <objmgr/seq_vector.hpp>
  62. #include <objtools/alnmgr/alnmix.hpp>
  63. USING_SCOPE(ncbi);
  64. USING_SCOPE(objects);
  65. class CAlnMrgApp : public CNcbiApplication
  66. {
  67.     virtual void     Init                (void);
  68.     virtual int      Run                 (void);
  69.     CScope&          GetScope            (void)             const;
  70.     void             SetOptions          (void);
  71.     void             LoadInputAlignments (void);
  72.     void             PrintMergedAlignment(void);
  73.     void             View4               (int screen_width);
  74. private:
  75.     CAlnMix::TMergeFlags         m_MergeFlags;
  76.     CAlnMix::TAddFlags           m_AddFlags;
  77.     mutable CRef<CObjectManager> m_ObjMgr;
  78.     mutable CRef<CScope>         m_Scope;
  79.     CRef<CAlnMix>                m_Mix; // must appear AFTER m_ObjMgr!
  80. };
  81. void CAlnMrgApp::Init(void)
  82. {
  83.     // Create command-line argument descriptions class
  84.     auto_ptr<CArgDescriptions> arg_desc(new CArgDescriptions);
  85.     // Specify USAGE context
  86.     arg_desc->SetUsageContext
  87.         (GetArguments().GetProgramBasename(),
  88.          "Alignment merger demo program");
  89.     // Describe the expected command-line arguments
  90.     arg_desc->AddDefaultKey
  91.         ("in", "input_file_name",
  92.          "Name of file to read from (standard input by default)",
  93.          CArgDescriptions::eInputFile, "-", CArgDescriptions::fPreOpen);
  94.     arg_desc->AddDefaultKey
  95.         ("binout", "out_file_name",
  96.          "Binary output",
  97.          CArgDescriptions::eOutputFile, "/dev/null",
  98.          CArgDescriptions::fPreOpen);
  99.     arg_desc->AddDefaultKey
  100.         ("b", "bin_obj_type",
  101.          "This forced the input file to be read in binary ASN.1 moden"
  102.          "and specifies the type of the top-level ASN.1 object.n",
  103.          CArgDescriptions::eString, "");
  104.     arg_desc->AddDefaultKey
  105.         ("log", "log_file_name",
  106.          "Name of log file to write to",
  107.          CArgDescriptions::eOutputFile, "-", CArgDescriptions::fPreOpen);
  108.     arg_desc->AddDefaultKey
  109.         ("gen2est", "bool",
  110.          "Perform Gen2EST Merge",
  111.          CArgDescriptions::eBoolean, "f");
  112.     arg_desc->AddDefaultKey
  113.         ("gapjoin", "bool",
  114.          "Consolidate segments of equal lens with a gap on the query sequence",
  115.          CArgDescriptions::eBoolean, "f");
  116.     arg_desc->AddDefaultKey
  117.         ("mingap", "bool",
  118.          "Consolidate all segments with a gap on the query sequence",
  119.          CArgDescriptions::eBoolean, "f");
  120.     arg_desc->AddDefaultKey
  121.         ("minusstrand", "bool",
  122.          "Minus strand on the refseq when merging.",
  123.          CArgDescriptions::eBoolean, "f");
  124.     arg_desc->AddDefaultKey
  125.         ("fillunaln", "bool",
  126.          "Fill unaligned regions.",
  127.          CArgDescriptions::eBoolean, "f");
  128.     arg_desc->AddDefaultKey
  129.         ("calcscore", "bool",
  130.          "Calculate each aligned seq pair score and use it when merging."
  131.          "(Don't stitch off ObjMgr for this).",
  132.          CArgDescriptions::eBoolean, "f");
  133.     arg_desc->AddDefaultKey
  134.         ("noobjmgr", "bool",
  135.         // ObjMgr is used to identify sequences and obtain a bioseqhandle.
  136.         // Also used to calc scores and determine the type of molecule
  137.          "Skip ObjMgr in identifying sequences, calculating scores, etc.",
  138.          CArgDescriptions::eBoolean, "f");
  139.     arg_desc->AddDefaultKey
  140.         ("queryseqmergeonly", "bool",
  141.          "Merge the query seq only, keep subject seqs on separate rows "
  142.          "(even if the same seq).",
  143.          CArgDescriptions::eBoolean, "f");
  144.     arg_desc->AddDefaultKey
  145.         ("truncateoverlaps", "bool",
  146.          "Truncate overlaps",
  147.          CArgDescriptions::eBoolean, "f");
  148.     arg_desc->AddDefaultKey
  149.         ("forcetranslation", "bool",
  150.          "Force translation of nucleotides",
  151.          CArgDescriptions::eBoolean, "f");
  152.     // Setup arg.descriptions for this application
  153.     SetupArgDescriptions(arg_desc.release());
  154. }
  155. CScope& CAlnMrgApp::GetScope(void) const
  156. {
  157.     if (!m_Scope) {
  158.         m_ObjMgr = new CObjectManager;
  159.         
  160.         m_ObjMgr->RegisterDataLoader
  161.             (*new CGBDataLoader("ID", NULL, 2),
  162.              CObjectManager::eDefault);
  163.         
  164.         m_Scope = new CScope(*m_ObjMgr);
  165.         m_Scope->AddDefaults();
  166.     }
  167.     return *m_Scope;
  168. }
  169. void CAlnMrgApp::LoadInputAlignments(void)
  170. {
  171.     CArgs args = GetArgs();
  172.     CNcbiIstream& is = args["in"].AsInputFile();
  173.     
  174.     // get the asn type of the top-level object
  175.     string asn_type = args["b"].AsString();
  176.     bool binary = asn_type.length();
  177.     auto_ptr<CObjectIStream> in
  178.         (CObjectIStream::Open(binary?eSerial_AsnBinary:eSerial_AsnText, is));
  179.     if ( !binary ) {
  180.         // auto-detection is possible in ASN.1 text mode
  181.         asn_type = in->ReadFileHeader();
  182.     }
  183.     
  184.     CTypesIterator i;
  185.     CType<CSeq_align>::AddTo(i);
  186.     CNcbiOstream& os = args["binout"].AsOutputFile();
  187.     auto_ptr<CObjectOStream> binout
  188.         (CObjectOStream::Open(eSerial_AsnBinary, os));
  189.     if (asn_type == "Seq-entry") {
  190.         CRef<CSeq_entry> se(new CSeq_entry);
  191.         in->Read(Begin(*se), CObjectIStream::eNoFileHeader);
  192.         *binout << *se;
  193.         GetScope().AddTopLevelSeqEntry(*se);
  194.         for (i = Begin(*se); i; ++i) {
  195.             if (CType<CSeq_align>::Match(i)) {
  196.                 m_Mix->Add(*(CType<CSeq_align>::Get(i)), m_AddFlags);
  197.             }
  198.         }
  199.     } else if (asn_type == "Seq-submit") {
  200.         CRef<CSeq_submit> ss(new CSeq_submit);
  201.         in->Read(Begin(*ss), CObjectIStream::eNoFileHeader);
  202.         *binout << *ss;
  203.         CType<CSeq_entry>::AddTo(i);
  204.         int tse_cnt = 0;
  205.         for (i = Begin(*ss); i; ++i) {
  206.             if (CType<CSeq_align>::Match(i)) {
  207.                 m_Mix->Add(*(CType<CSeq_align>::Get(i)), m_AddFlags);
  208.             } else if (CType<CSeq_entry>::Match(i)) {
  209.                 if ( !(tse_cnt++) ) {
  210.                     //GetScope().AddTopLevelSeqEntry
  211.                         (*(CType<CSeq_entry>::Get(i)));
  212.                 }
  213.             }
  214.         }
  215.     } else if (asn_type == "Seq-align") {
  216.         CRef<CSeq_align> sa(new CSeq_align);
  217.         in->Read(Begin(*sa), CObjectIStream::eNoFileHeader);
  218.         *binout << *sa;
  219.        for (i = Begin(*sa); i; ++i) {
  220.             if (CType<CSeq_align>::Match(i)) {
  221.                 m_Mix->Add(*(CType<CSeq_align>::Get(i)), m_AddFlags);
  222.             }
  223.         }
  224.     } else if (asn_type == "Seq-align-set") {
  225.         CRef<CSeq_align_set> sas(new CSeq_align_set);
  226.         in->Read(Begin(*sas), CObjectIStream::eNoFileHeader);
  227.         *binout << *sas;
  228.         for (i = Begin(*sas); i; ++i) {
  229.             if (CType<CSeq_align>::Match(i)) {
  230.                 m_Mix->Add(*(CType<CSeq_align>::Get(i)), m_AddFlags);
  231.             }
  232.         }
  233.     } else if (asn_type == "Seq-annot") {
  234.         CRef<CSeq_annot> san(new CSeq_annot);
  235.         in->Read(Begin(*san), CObjectIStream::eNoFileHeader);
  236.         *binout << *san;
  237.         for (i = Begin(*san); i; ++i) {
  238.             if (CType<CSeq_align>::Match(i)) {
  239.                 m_Mix->Add(*(CType<CSeq_align>::Get(i)), m_AddFlags);
  240.             }
  241.         }
  242.     } else if (asn_type == "Dense-seg") {
  243.         CRef<CDense_seg> ds(new CDense_seg);
  244.         in->Read(Begin(*ds), CObjectIStream::eNoFileHeader);
  245.         *binout << *ds;
  246.         m_Mix->Add(*ds, m_AddFlags);
  247.     } else {
  248.         cerr << "Cannot read: " << asn_type;
  249.         return;
  250.     }
  251. }
  252. void CAlnMrgApp::SetOptions(void)
  253. {
  254.     CArgs args = GetArgs();
  255.     if ( args["log"] ) {
  256.         SetDiagStream( &args["log"].AsOutputFile() );
  257.     }
  258.     m_MergeFlags = 0;
  259.     m_AddFlags = 0;
  260.     if (args["gapjoin"]  &&  args["gapjoin"].AsBoolean()) {
  261.         m_MergeFlags |= CAlnMix::fGapJoin;
  262.     }
  263.     if (args["mingap"]  &&  args["mingap"].AsBoolean()) {
  264.         m_MergeFlags |= CAlnMix::fMinGap;
  265.     }
  266.     if (args["gen2est"]  &&  args["gen2est"].AsBoolean()) {
  267.         m_MergeFlags |= CAlnMix::fGen2EST | CAlnMix::fTruncateOverlaps;
  268.     }
  269.     if (args["minusstrand"]  &&  args["minusstrand"].AsBoolean()) {
  270.         m_MergeFlags |= CAlnMix::fNegativeStrand;
  271.     }
  272.     if (args["queryseqmergeonly"]  &&  args["queryseqmergeonly"].AsBoolean()) {
  273.         m_MergeFlags |= CAlnMix::fQuerySeqMergeOnly;
  274.     }
  275.     if (args["fillunaln"]  &&  args["fillunaln"].AsBoolean()) {
  276.         m_MergeFlags |= CAlnMix::fFillUnalignedRegions;
  277.     }
  278.     if (args["truncateoverlaps"]  &&  args["truncateoverlaps"].AsBoolean()) {
  279.         m_MergeFlags |= CAlnMix::fTruncateOverlaps;
  280.     }
  281.     if (args["forcetranslation"]  &&  args["forcetranslation"].AsBoolean()) {
  282.         m_AddFlags |= CAlnMix::fForceTranslation;
  283.     }
  284.     if (args["calcscore"]  &&  args["calcscore"].AsBoolean()) {
  285.         m_AddFlags |= CAlnMix::fCalcScore;
  286.     }
  287.     if (args["noobjmgr"]  &&  args["noobjmgr"].AsBoolean()) {
  288.         m_AddFlags |= CAlnMix::fDontUseObjMgr;
  289.     }
  290. }
  291. void CAlnMrgApp::PrintMergedAlignment(void)
  292. {
  293.     auto_ptr<CObjectOStream> asn_out 
  294.         (CObjectOStream::Open(eSerial_AsnText, cout));
  295.     *asn_out << m_Mix->GetDenseg();
  296. }
  297. void CAlnMrgApp::View4(int scrn_width)
  298. {
  299.     CAlnVec av(m_Mix->GetDenseg(), GetScope());
  300.     CAlnMap::TNumrow row, nrows = av.GetNumRows();
  301.     vector<string> buffer(nrows);
  302.     vector<CAlnMap::TSeqPosList> insert_aln_starts(nrows);
  303.     vector<CAlnMap::TSeqPosList> insert_starts(nrows);
  304.     vector<CAlnMap::TSeqPosList> insert_lens(nrows);
  305.     vector<CAlnMap::TSeqPosList> scrn_lefts(nrows);
  306.     vector<CAlnMap::TSeqPosList> scrn_rights(nrows);
  307.     
  308.     // Fill in the vectors for each row
  309.     for (row = 0; row < nrows; row++) {
  310.         av.GetWholeAlnSeqString
  311.             (row,
  312.              buffer[row],
  313.              &insert_aln_starts[row],
  314.              &insert_starts[row],
  315.              &insert_lens[row],
  316.              scrn_width,
  317.              &scrn_lefts[row],
  318.              &scrn_rights[row]);
  319.     }
  320.         
  321.     // Visualization
  322.     TSeqPos pos = 0, aln_len = av.GetAlnStop() + 1;
  323.     do {
  324.         for (row = 0; row < nrows; row++) {
  325.             cout << av.GetSeqId(row)
  326.                  << "t" 
  327.                  << scrn_lefts[row].front()
  328.                  << "t"
  329.                  << buffer[row].substr(pos, scrn_width)
  330.                  << "t"
  331.                  << scrn_rights[row].front()
  332.                  << endl;
  333.             scrn_lefts[row].pop_front();
  334.             scrn_rights[row].pop_front();
  335.         }
  336.         cout << endl;
  337.         pos += scrn_width;
  338.         if (pos + scrn_width > aln_len) {
  339.             scrn_width = aln_len - pos;
  340.         }
  341.     } while (pos < aln_len);
  342. }
  343. int CAlnMrgApp::Run(void)
  344. {
  345.     SetOptions();
  346.     m_Mix = new CAlnMix(GetScope());
  347.     LoadInputAlignments();
  348.     m_Mix->Merge(m_MergeFlags);
  349.     PrintMergedAlignment();
  350.     return 0;
  351. }
  352. /////////////////////////////////////////////////////////////////////////////
  353. //  MAIN
  354. int main(int argc, const char* argv[])
  355. {
  356.     // Execute main application function
  357.     return CAlnMrgApp().AppMain(argc, argv, 0, eDS_Default, 0);
  358. }
  359. /*
  360. * ===========================================================================
  361. *
  362. * $Log: alnmrg.cpp,v $
  363. * Revision 1000.3  2004/06/01 19:40:52  gouriano
  364. * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.20
  365. *
  366. * Revision 1.20  2004/05/21 21:42:51  gorelenk
  367. * Added PCH ncbi_pch.hpp
  368. *
  369. * Revision 1.19  2004/01/07 17:37:35  vasilche
  370. * Fixed include path to genbank loader.
  371. * Moved split_cache application.
  372. *
  373. * Revision 1.18  2003/12/22 20:28:11  ucko
  374. * Added missing call to GetScope.
  375. *
  376. * Revision 1.17  2003/12/22 18:33:48  ucko
  377. * Simplify format autodetection behavior by means of Read(..., eNoFileHeader);
  378. * fixes problems observed with GCC 2.95.
  379. *
  380. * Revision 1.16  2003/12/20 03:39:12  ucko
  381. * Reorder data members of CAlnMrgApp: m_Mix should follow m_ObjMgr so
  382. * it's destroyed first by default, so that the scope will no longer be
  383. * live by the time m_ObjMgr is destroyed.
  384. *
  385. * Revision 1.15  2003/12/19 19:38:34  todorov
  386. * Demon creation of scope outside alnmix
  387. *
  388. * Revision 1.14  2003/12/08 21:28:04  todorov
  389. * Forced Translation of Nucleotide Sequences
  390. *
  391. * Revision 1.13  2003/11/20 23:58:07  todorov
  392. * Added CObjectIStream::Close before IStream::seekg
  393. *
  394. * Revision 1.12  2003/09/08 20:41:42  todorov
  395. * binint fixed. binout added
  396. *
  397. * Revision 1.11  2003/09/08 19:33:12  todorov
  398. * - unused var
  399. *
  400. * Revision 1.10  2003/09/08 17:05:57  todorov
  401. * ability to read binary files
  402. *
  403. * Revision 1.9  2003/09/04 19:05:46  todorov
  404. * Removed view. Should be optional
  405. *
  406. * Revision 1.8  2003/08/20 14:43:01  todorov
  407. * Support for NA2AA Densegs
  408. *
  409. * Revision 1.7  2003/07/24 16:26:09  ucko
  410. * Undouble CAlnMix:: prefix in one place.
  411. *
  412. * Revision 1.6  2003/07/23 16:14:18  todorov
  413. * +trunacteoverlaps
  414. *
  415. * Revision 1.5  2003/06/26 22:00:25  todorov
  416. * + fFillUnalignedRegions
  417. *
  418. * Revision 1.4  2003/06/24 19:23:37  todorov
  419. * objmgr usage optional
  420. *
  421. * Revision 1.3  2003/06/02 16:06:41  dicuccio
  422. * Rearranged src/objects/ subtree.  This includes the following shifts:
  423. *     - src/objects/asn2asn --> arc/app/asn2asn
  424. *     - src/objects/testmedline --> src/objects/ncbimime/test
  425. *     - src/objects/objmgr --> src/objmgr
  426. *     - src/objects/util --> src/objmgr/util
  427. *     - src/objects/alnmgr --> src/objtools/alnmgr
  428. *     - src/objects/flat --> src/objtools/flat
  429. *     - src/objects/validator --> src/objtools/validator
  430. *     - src/objects/cddalignview --> src/objtools/cddalignview
  431. * In addition, libseq now includes six of the objects/seq... libs, and libmmdb
  432. * replaces the three libmmdb? libs.
  433. *
  434. * Revision 1.2  2003/05/15 19:09:18  todorov
  435. * Optional mixing of the query sequence only
  436. *
  437. * Revision 1.1  2003/04/03 21:17:48  todorov
  438. * Adding demo projects
  439. *
  440. *
  441. * ===========================================================================
  442. */