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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: alnvwr.cpp,v $
  4.  * PRODUCTION Revision 1000.2  2004/06/01 19:40:58  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.22
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: alnvwr.cpp,v 1000.2 2004/06/01 19:40:58 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. *   Various alignment viewers. Demonstration of CAlnMap/CAlnVec 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. void LogTime(const string& s)
  66. {
  67.     static time_t prev_t;
  68.     time_t        t = time(0);
  69.     if (prev_t==0) {
  70.         prev_t=t;
  71.     }
  72.     
  73.     cout << s << " " << (int)(t-prev_t) << endl;
  74. }
  75. class CAlnMgrTestApp : public CNcbiApplication
  76. {
  77.     virtual void     Init(void);
  78.     virtual int      Run(void);
  79.     void             LoadDenseg(void);
  80.     void             View1();
  81.     void             View2(int screen_width);
  82.     void             View3(int screen_width);
  83.     void             View4(int screen_width);
  84.     void             View5();
  85.     void             View6();
  86.     void             View7();
  87.     void             View8(int aln_pos);
  88.     void             View9(int row0, int row1);
  89.     void             GetSeqPosFromAlnPosDemo();
  90. private:
  91.     CRef<CObjectManager> m_ObjMgr;
  92.     CRef<CScope>  m_Scope;
  93.     CRef<CAlnVec> m_AV;
  94. };
  95. void CAlnMgrTestApp::Init(void)
  96. {
  97.     // Create command-line argument descriptions class
  98.     auto_ptr<CArgDescriptions> arg_desc(new CArgDescriptions);
  99.     // Specify USAGE context
  100.     arg_desc->SetUsageContext
  101.         (GetArguments().GetProgramBasename(),
  102.          "Alignment manager demo program");
  103.     // Describe the expected command-line arguments
  104.     arg_desc->AddDefaultKey
  105.         ("in", "InputFile",
  106.          "Name of file to read the Dense-seg from (standard input by default)",
  107.          CArgDescriptions::eInputFile, "-", CArgDescriptions::fPreOpen);
  108.     arg_desc->AddOptionalKey
  109.         ("se_in", "SeqEntryInputFile",
  110.          "An optional Seq-entry file to load a local top level seq entry from.",
  111.          CArgDescriptions::eInputFile, CArgDescriptions::fPreOpen);
  112.     arg_desc->AddOptionalKey
  113.         ("log", "LogFile",
  114.          "Name of log file to write to",
  115.          CArgDescriptions::eOutputFile, CArgDescriptions::fPreOpen);
  116.     arg_desc->AddOptionalKey
  117.         ("a", "AnchorRow",
  118.          "Anchor row (zero based)",
  119.          CArgDescriptions::eInteger);
  120.     arg_desc->AddKey
  121.         ("v", "",
  122.          "View format:n"
  123.          "1. CSV tablen"
  124.          "2. Popset style using chunksn"
  125.          "3. Popset stylen"
  126.          "4. Popset style speed optimizedn"
  127.          "5. Print segmentsn"
  128.          "6. Print chunksn"
  129.          "7. Alternative ways to get sequencen"
  130.          "8. Demonstrate obtaining column vector in two alternative ways.n"
  131.          "   (Use numeric param n to choose alignment position)n"
  132.          "9. Print relative residue index mapping for two rows.n"
  133.          "   (Use row0 and row1 params to choose the rows)n",
  134.          CArgDescriptions::eInteger);
  135.     arg_desc->AddDefaultKey
  136.         ("w", "ScreenWidth",
  137.          "Screen width for some of the viewers",
  138.          CArgDescriptions::eInteger, "60");
  139.     arg_desc->AddDefaultKey
  140.         ("n", "Number",
  141.          "Generic Numeric Parameter, used by some viewers",
  142.          CArgDescriptions::eInteger, "0");
  143.     arg_desc->AddDefaultKey
  144.         ("row0", "Row0",
  145.          "Generic Row Parameter, used by some viewers",
  146.          CArgDescriptions::eInteger, "0");
  147.     arg_desc->AddDefaultKey
  148.         ("row1", "Row1",
  149.          "Generic Row Parameter, used by some viewers",
  150.          CArgDescriptions::eInteger, "1");
  151.     arg_desc->AddDefaultKey
  152.         ("cf", "GetChunkFlags",
  153.          "Flags for GetChunks (CAlnMap::TGetChunkFlags)",
  154.          CArgDescriptions::eInteger, "0");
  155.     // Setup arg.descriptions for this application
  156.     SetupArgDescriptions(arg_desc.release());
  157. }
  158. void CAlnMgrTestApp::LoadDenseg(void)
  159. {
  160.     CArgs args = GetArgs();
  161.     CNcbiIstream& is = args["in"].AsInputFile();
  162.     bool done = false;
  163.     
  164.     string asn_type;
  165.     {{
  166.         auto_ptr<CObjectIStream> in
  167.             (CObjectIStream::Open(eSerial_AsnText, is));
  168.         asn_type = in->ReadFileHeader();
  169.         in->Close();
  170.         is.seekg(0);
  171.     }}
  172.     auto_ptr<CObjectIStream> in
  173.         (CObjectIStream::Open(eSerial_AsnText, is));
  174.     
  175.     //create scope
  176.     {{
  177.         m_ObjMgr = new CObjectManager;
  178.         
  179.         m_ObjMgr->RegisterDataLoader
  180.             (*new CGBDataLoader("ID", NULL, 2),
  181.              CObjectManager::eDefault);
  182.         m_Scope = new CScope(*m_ObjMgr);
  183.         m_Scope->AddDefaults();
  184.     }}
  185.     if (asn_type == "Dense-seg") {
  186.         CRef<CDense_seg> ds(new CDense_seg);
  187.         *in >> *ds;
  188.         m_AV = new CAlnVec(*ds, *m_Scope);
  189.     } else if (asn_type == "Seq-submit") {
  190.         CRef<CSeq_submit> ss(new CSeq_submit);
  191.         *in >> *ss;
  192.         CTypesIterator i;
  193.         CType<CDense_seg>::AddTo(i);
  194.         CType<CSeq_entry>::AddTo(i);
  195.         int tse_cnt = 0;
  196.         for (i = Begin(*ss); i; ++i) {
  197.             if (CType<CDense_seg>::Match(i)) {
  198.                 m_AV = new CAlnVec(*(CType<CDense_seg>::Get(i)), *m_Scope);
  199.             } else if (CType<CSeq_entry>::Match(i)) {
  200.                 if ( !(tse_cnt++) ) {
  201.                     m_Scope->AddTopLevelSeqEntry
  202.                         (*(CType<CSeq_entry>::Get(i)));
  203.                 }
  204.             }
  205.         }
  206.     } else {
  207.         cerr << "Cannot read: " << asn_type;
  208.         return;
  209.     }
  210.     if ( args["se_in"] ) {
  211.         CNcbiIstream& se_is = args["se_in"].AsInputFile();
  212.         bool done = false;
  213.     
  214.         string se_asn_type;
  215.         {{
  216.             auto_ptr<CObjectIStream> se_in
  217.                 (CObjectIStream::Open(eSerial_AsnText, se_is));
  218.             
  219.             se_asn_type = se_in->ReadFileHeader();
  220.             se_in->Close();
  221.             se_is.seekg(0);
  222.         }}
  223.         
  224.         auto_ptr<CObjectIStream> se_in
  225.             (CObjectIStream::Open(eSerial_AsnText, se_is));
  226.         
  227.         if (se_asn_type == "Seq-entry") {
  228.             CRef<CSeq_entry> se (new CSeq_entry);
  229.             *se_in >> *se;
  230.             m_Scope->AddTopLevelSeqEntry(*se);
  231.         } else {
  232.             cerr << "se_in only accepts a Seq-entry asn text file.";
  233.             return;
  234.         }
  235.     }
  236. }
  237. void CAlnMgrTestApp::View1()
  238. {
  239.     cout << ",";
  240.     for (int seg=0; seg<m_AV->GetNumSegs(); seg++) {
  241.         cout << "," << m_AV->GetLen(seg) << ",";
  242.     }
  243.     cout << endl;
  244.     for (int row=0; row<m_AV->GetNumRows(); row++) {
  245.         cout << row << ",";
  246.         for (int seg=0; seg<m_AV->GetNumSegs(); seg++) {
  247.             cout << m_AV->GetStart(row, seg) << "," 
  248.                  << m_AV->GetStop(row, seg) << ",";
  249.         }
  250.         cout << endl;
  251.     }
  252. }
  253. void CAlnMgrTestApp::View2(int screen_width)
  254. {
  255.     int aln_pos = 0;
  256.     CAlnMap::TSignedRange rng;
  257.     do {
  258.         // create range
  259.         rng.Set(aln_pos, aln_pos + screen_width - 1);
  260.         string aln_seq_str;
  261.         aln_seq_str.reserve(screen_width + 1);
  262.         // for each sequence
  263.         for (CAlnMap::TNumrow row = 0; row < m_AV->GetNumRows(); row++) {
  264.             cout << m_AV->GetSeqId(row).AsFastaString()
  265.                  << "t" 
  266.                  << m_AV->GetSeqPosFromAlnPos(row, rng.GetFrom(),
  267.                                               CAlnMap::eLeft)
  268.                  << "t"
  269.                  << m_AV->GetAlnSeqString(aln_seq_str, row, rng)
  270.                  << "t"
  271.                  << m_AV->GetSeqPosFromAlnPos(row, rng.GetTo(),
  272.                                               CAlnMap::eLeft)
  273.                  << endl;
  274.         }
  275.         cout << endl;
  276.         aln_pos += screen_width;
  277.     } while (aln_pos < m_AV->GetAlnStop());
  278. }
  279. void CAlnMgrTestApp::View3(int screen_width)
  280. {
  281.     TSeqPos aln_len = m_AV->GetAlnStop() + 1;
  282.     const CAlnMap::TNumrow nrows = m_AV->GetNumRows();
  283.     const CAlnMap::TNumseg nsegs = m_AV->GetNumSegs();
  284.     const CDense_seg::TStarts& starts = m_AV->GetDenseg().GetStarts();
  285.     const CDense_seg::TLens& lens = m_AV->GetDenseg().GetLens();
  286.     vector<string> buffer(nrows);
  287.     for (CAlnMap::TNumrow row = 0; row < nrows; row++) {
  288.         // allocate space for the row
  289.         buffer[row].reserve(aln_len + 1);
  290.         string buff;
  291.         int seg, pos, left_seg = -1, right_seg = -1;
  292.         TSignedSeqPos start;
  293.         TSeqPos len;
  294.         // determine the ending right seg
  295.         for (seg = nsegs - 1, pos = seg * nrows + row;
  296.              seg >= 0; --seg, pos -= nrows) {
  297.             if (starts[pos] >= 0) {
  298.                 right_seg = seg;
  299.                 break;
  300.             }
  301.         }
  302.         for (seg = 0, pos = row;  seg < nsegs; ++seg, pos += nrows) {
  303.             len = lens[seg];
  304.             if ((start = starts[pos]) >= 0) {
  305.                 left_seg = seg; // ending left seg is at most here
  306.                 m_AV->GetSeqString(buff, row, start, start + len - 1);
  307.                 buffer[row] += buff;
  308.             } else {
  309.                 // add appropriate number of gap/end chars
  310.                 char* ch_buff = new char[len+1];
  311.                 char fill_ch;
  312.                 if (left_seg < 0  ||  seg > right_seg  &&  right_seg > 0) {
  313.                     fill_ch = m_AV->GetEndChar();
  314.                 } else {
  315.                     fill_ch = m_AV->GetGapChar(row);
  316.                 }
  317.                 memset(ch_buff, fill_ch, len);
  318.                 ch_buff[len] = 0;
  319.                 buffer[row] += ch_buff;
  320.                 delete[] ch_buff;
  321.             }
  322.         }
  323.     }
  324.     TSeqPos pos = 0;
  325.     do {
  326.         for (CAlnMap::TNumrow row = 0; row < nrows; row++) {
  327.             cout << m_AV->GetSeqId(row).AsFastaString()
  328.                  << "t"
  329.                  << m_AV->GetSeqPosFromAlnPos(row, pos, CAlnMap::eLeft)
  330.                  << "t"
  331.                  << buffer[row].substr(pos, screen_width)
  332.                  << "t"
  333.                  << m_AV->GetSeqPosFromAlnPos(row, pos + screen_width - 1,
  334.                                               CAlnMap::eLeft)
  335.                  << endl;
  336.         }
  337.         cout << endl;
  338.         pos += screen_width;
  339.         if (pos + screen_width > aln_len) {
  340.             screen_width = aln_len - pos;
  341.         }
  342.     } while (pos < aln_len);
  343. }
  344. void CAlnMgrTestApp::View4(int scrn_width)
  345. {
  346.     CAlnMap::TNumrow row, nrows = m_AV->GetNumRows();
  347.     vector<string> buffer(nrows);
  348.     vector<CAlnMap::TSeqPosList> insert_aln_starts(nrows);
  349.     vector<CAlnMap::TSeqPosList> insert_starts(nrows);
  350.     vector<CAlnMap::TSeqPosList> insert_lens(nrows);
  351.     vector<CAlnMap::TSeqPosList> scrn_lefts(nrows);
  352.     vector<CAlnMap::TSeqPosList> scrn_rights(nrows);
  353.     
  354.     // Fill in the vectors for each row
  355.     for (row = 0; row < nrows; row++) {
  356.         m_AV->GetWholeAlnSeqString
  357.             (row,
  358.              buffer[row],
  359.              &insert_aln_starts[row],
  360.              &insert_starts[row],
  361.              &insert_lens[row],
  362.              scrn_width,
  363.              &scrn_lefts[row],
  364.              &scrn_rights[row]);
  365.     }
  366.         
  367.     // Visualization
  368.     TSeqPos pos = 0, aln_len = m_AV->GetAlnStop() + 1;
  369.     do {
  370.         for (row = 0; row < nrows; row++) {
  371.             cout << row 
  372.                  << "t"
  373.                  << m_AV->GetSeqId(row).AsFastaString()
  374.                  << "t" 
  375.                  << scrn_lefts[row].front()
  376.                  << "t"
  377.                  << buffer[row].substr(pos, scrn_width)
  378.                  << "t"
  379.                  << scrn_rights[row].front()
  380.                  << endl;
  381.             scrn_lefts[row].pop_front();
  382.             scrn_rights[row].pop_front();
  383.         }
  384.         cout << endl;
  385.         pos += scrn_width;
  386.         if (pos + scrn_width > aln_len) {
  387.             scrn_width = aln_len - pos;
  388.         }
  389.     } while (pos < aln_len);
  390. }
  391. // print segments
  392. void CAlnMgrTestApp::View5()
  393. {
  394.     CAlnMap::TNumrow row;
  395.     for (row=0; row<m_AV->GetNumRows(); row++) {
  396.         cout << "Row: " << row << endl;
  397.         for (int seg=0; seg<m_AV->GetNumSegs(); seg++) {
  398.             
  399.             // seg
  400.             cout << "t" << seg << ": ";
  401.             // aln coords
  402.             cout << m_AV->GetAlnStart(seg) << "-"
  403.                  << m_AV->GetAlnStop(seg) << " ";
  404.             // type
  405.             CAlnMap::TSegTypeFlags type = m_AV->GetSegType(row, seg);
  406.             if (type & CAlnMap::fSeq) {
  407.                 // seq coords
  408.                 cout << m_AV->GetStart(row, seg) << "-" 
  409.                      << m_AV->GetStop(row, seg) << " (Seq)";
  410.             } else {
  411.                 cout << "(Gap)";
  412.             }
  413.             if (type & CAlnMap::fNotAlignedToSeqOnAnchor) cout << "(NotAlignedToSeqOnAnchor)";
  414.             if (CAlnMap::IsTypeInsert(type)) cout << "(Insert)";
  415.             if (type & CAlnMap::fUnalignedOnRight) cout << "(UnalignedOnRight)";
  416.             if (type & CAlnMap::fUnalignedOnLeft) cout << "(UnalignedOnLeft)";
  417.             if (type & CAlnMap::fNoSeqOnRight) cout << "(NoSeqOnRight)";
  418.             if (type & CAlnMap::fNoSeqOnLeft) cout << "(NoSeqOnLeft)";
  419.             if (type & CAlnMap::fEndOnRight) cout << "(EndOnRight)";
  420.             if (type & CAlnMap::fEndOnLeft) cout << "(EndOnLeft)";
  421.             cout << NcbiEndl;
  422.         }
  423.     }
  424.     cout << "---------" << endl;
  425. }
  426. // print chunks
  427. void CAlnMgrTestApp::View6()
  428. {
  429.     CArgs args = GetArgs();
  430.     CAlnMap::TNumrow row;
  431.     CAlnMap::TSignedRange range(-1, m_AV->GetAlnStop()+1);
  432.     for (row=0; row<m_AV->GetNumRows(); row++) {
  433.         cout << "Row: " << row << endl;
  434.         //CAlnMap::TSignedRange range(m_AV->GetSeqStart(row) -1,
  435.         //m_AV->GetSeqStop(row) + 1);
  436.         CRef<CAlnMap::CAlnChunkVec> chunk_vec = m_AV->GetAlnChunks(row, range, args["cf"].AsInteger());
  437.     
  438.         for (int i=0; i<chunk_vec->size(); i++) {
  439.             CConstRef<CAlnMap::CAlnChunk> chunk = (*chunk_vec)[i];
  440.             cout << "[row" << row << "|" << i << "]";
  441.             cout << chunk->GetAlnRange().GetFrom() << "-"
  442.                  << chunk->GetAlnRange().GetTo() << " ";
  443.             if (!chunk->IsGap()) {
  444.                 cout << chunk->GetRange().GetFrom() << "-"
  445.                     << chunk->GetRange().GetTo();
  446.             } else {
  447.                 cout << "(Gap)";
  448.             }
  449.             if (chunk->GetType() & CAlnMap::fSeq) cout << "(Seq)";
  450.             if (chunk->GetType() & CAlnMap::fNotAlignedToSeqOnAnchor) cout << "(NotAlignedToSeqOnAnchor)";
  451.             if (CAlnMap::IsTypeInsert(chunk->GetType())) cout << "(Insert)";
  452.             if (chunk->GetType() & CAlnMap::fUnalignedOnRight) cout << "(UnalignedOnRight)";
  453.             if (chunk->GetType() & CAlnMap::fUnalignedOnLeft) cout << "(UnalignedOnLeft)";
  454.             if (chunk->GetType() & CAlnMap::fNoSeqOnRight) cout << "(NoSeqOnRight)";
  455.             if (chunk->GetType() & CAlnMap::fNoSeqOnLeft) cout << "(NoSeqOnLeft)";
  456.             if (chunk->GetType() & CAlnMap::fEndOnRight) cout << "(EndOnRight)";
  457.             if (chunk->GetType() & CAlnMap::fEndOnLeft) cout << "(EndOnLeft)";
  458.             cout << NcbiEndl;
  459.         }
  460.     }
  461.     cout << "---------" << endl;
  462. }
  463. // alternative ways to get the sequence
  464. void CAlnMgrTestApp::View7()
  465. {
  466.     string buff;
  467.     CAlnMap::TNumseg seg;
  468.     CAlnMap::TNumrow row;
  469.     m_AV->SetGapChar('-');
  470.     m_AV->SetEndChar('.');
  471.     for (seg=0; seg<m_AV->GetNumSegs(); seg++) {
  472.         for (row=0; row<m_AV->GetNumRows(); row++) {
  473.             cout << "row " << row << ", seg " << seg << " ";
  474.             // if (m_AV->GetSegType(row, seg) & CAlnMap::fSeq) {
  475.                 cout << "["
  476.                     << m_AV->GetStart(row, seg)
  477.                     << "-"
  478.                     << m_AV->GetStop(row, seg) 
  479.                     << "]"
  480.                     << NcbiEndl;
  481.                 for(int i=0; i<m_AV->GetLen(seg); i++) {
  482.                     cout << m_AV->GetResidue(row, m_AV->GetAlnStart(seg)+i);
  483.                 }
  484.                 cout << NcbiEndl;
  485.                 cout << m_AV->GetSeqString(buff, row,
  486.                                            m_AV->GetStart(row, seg),
  487.                                            m_AV->GetStop(row, seg)) << NcbiEndl;
  488.                 cout << m_AV->GetSegSeqString(buff, row, seg) 
  489.                     << NcbiEndl;
  490.                 //            } else {
  491.                 //                cout << "-" << NcbiEndl;
  492.                 //            }
  493.             cout << NcbiEndl;
  494.         }
  495.     }
  496. }
  497. // Demonstrate obtaining column vector in two alternative ways.
  498. // (Use numeric param n to choose alignment position)
  499. void CAlnMgrTestApp::View8(int aln_pos)
  500. {
  501.     CAlnMap::TSignedRange rng;
  502.     rng.Set(aln_pos, aln_pos); // range covers only a single position
  503.     
  504.     string buffer;
  505.     
  506.     // obtain all individual residues
  507.     for (CAlnMap::TNumrow row=0; row<m_AV->GetNumRows(); row++) {
  508.         cout << m_AV->GetAlnSeqString(buffer, row, rng);
  509.     }
  510.     cout << NcbiEndl;
  511.     
  512.     // get the column at once
  513.     string column;
  514.     column.resize(m_AV->GetNumRows());
  515.     
  516.     cout << m_AV->GetColumnVector(column, aln_pos) << NcbiEndl;
  517.     
  518.     // %ID
  519.     cout << m_AV->CalculatePercentIdentity(aln_pos) << NcbiEndl;
  520. }
  521. void CAlnMgrTestApp::View9(int row0, int row1)
  522. {
  523.     vector<TSignedSeqPos> result;
  524.     CAlnMap::TRange aln_rng(0, m_AV->GetAlnStop()), rng0, rng1;
  525.     m_AV->GetResidueIndexMap(row0, row1, aln_rng, result, rng0, rng1);
  526.     size_t size = result.size();
  527.     cout << "(" << rng0.GetFrom() << "-" << rng0.GetTo() << ")" << endl;
  528.     cout << "(" << rng1.GetFrom() << "-" << rng1.GetTo() << ")" << endl;
  529.     for (size_t i = 0; i < size; i++) {
  530.         cout << result[i] << " ";
  531.     }
  532.     cout << endl;
  533. }
  534. //////
  535. // GetSeqPosFromAlnPos
  536. void CAlnMgrTestApp::GetSeqPosFromAlnPosDemo()
  537. {
  538.     cout << "["
  539.         << m_AV->GetSeqPosFromAlnPos(2, 1390, CAlnMap::eForward, false)
  540.         << "-" 
  541.         << m_AV->GetSeqPosFromAlnPos(2, 1390, (CAlnMap::ESearchDirection)7, false)
  542.         << "]"
  543.         << NcbiEndl;
  544. }
  545. int CAlnMgrTestApp::Run(void)
  546. {
  547.     CArgs args = GetArgs();
  548.     if ( args["log"] ) {
  549.         SetDiagStream( &args["log"].AsOutputFile() );
  550.     }
  551.     LoadDenseg();
  552.     cout << "-----" << endl;
  553.     if (args["a"]) {
  554.         m_AV->SetAnchor(args["a"].AsInteger());
  555.     }
  556.     int screen_width = args["w"].AsInteger();
  557.     int number       = args["n"].AsInteger();
  558.     int row0         = args["row0"].AsInteger();
  559.     int row1         = args["row1"].AsInteger();
  560.     m_AV->SetGapChar('-');
  561.     m_AV->SetEndChar('.');
  562.     if (args["v"]) {
  563.         switch (args["v"].AsInteger()) {
  564.         case 1: View1(); break;
  565.         case 2: View2(screen_width); break;
  566.         case 3: View3(screen_width); break;
  567.         case 4: View4(screen_width); break;
  568.         case 5: View5(); break;
  569.         case 6: View6(); break;
  570.         case 7: View7(); break;
  571.         case 8: View8(number); break;
  572.         case 9: View9(row0, row1); break;
  573.         }
  574.     }
  575.     return 0;
  576. }
  577. /////////////////////////////////////////////////////////////////////////////
  578. //  MAIN
  579. int main(int argc, const char* argv[])
  580. {
  581.     // Execute main application function
  582.     return CAlnMgrTestApp().AppMain(argc, argv, 0, eDS_Default, 0);
  583. }
  584. /*
  585. * ===========================================================================
  586. *
  587. * $Log: alnvwr.cpp,v $
  588. * Revision 1000.2  2004/06/01 19:40:58  gouriano
  589. * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.22
  590. *
  591. * Revision 1.22  2004/05/21 21:42:51  gorelenk
  592. * Added PCH ncbi_pch.hpp
  593. *
  594. * Revision 1.21  2004/03/03 19:41:59  todorov
  595. * +GetResidueIndexMap
  596. *
  597. * Revision 1.20  2004/02/12 22:51:27  todorov
  598. * +optinal seq-entry input file to read a local seq
  599. *
  600. * Revision 1.19  2004/02/03 19:52:25  todorov
  601. * m_AV declared after m_OM so that its ref to scope is distroyed first
  602. *
  603. * Revision 1.18  2004/01/16 22:11:48  ucko
  604. * Explicitly call DumpAsFasta() on Seq-ids intended to appear in FASTA format.
  605. *
  606. * Revision 1.17  2004/01/07 17:37:36  vasilche
  607. * Fixed include path to genbank loader.
  608. * Moved split_cache application.
  609. *
  610. * Revision 1.16  2003/12/19 19:37:26  todorov
  611. * +comments
  612. *
  613. * Revision 1.15  2003/12/18 20:08:53  todorov
  614. * Demo GetColumnVector & CalculatePercentIdentity
  615. *
  616. * Revision 1.14  2003/12/11 00:43:47  ucko
  617. * Fix typo in previous revision: call Close on the CObjectIStream rather
  618. * than the auto_ptr.
  619. *
  620. * Revision 1.13  2003/12/10 23:58:07  todorov
  621. * Added CObjectIStream::Close before IStream::seekg
  622. *
  623. * Revision 1.12  2003/12/09 16:13:34  todorov
  624. * code cleanup
  625. *
  626. * Revision 1.11  2003/12/08 21:28:04  todorov
  627. * Forced Translation of Nucleotide Sequences
  628. *
  629. * Revision 1.10  2003/09/26 15:30:07  todorov
  630. * +Print segments
  631. *
  632. * Revision 1.9  2003/07/23 21:01:08  ucko
  633. * Revert use of (uncommitted) BLAST DB data loader.
  634. *
  635. * Revision 1.8  2003/07/23 20:52:07  todorov
  636. * +width, +aln_starts for the inserts in GetWhole..
  637. *
  638. * Revision 1.7  2003/07/17 22:48:17  todorov
  639. * View4 implemented in CAlnVec::GetWholeAlnSeqString
  640. *
  641. * Revision 1.6  2003/07/17 21:06:44  todorov
  642. * -v is now required param
  643. *
  644. * Revision 1.5  2003/07/14 20:25:18  todorov
  645. * Added another, even faster viewer
  646. *
  647. * Revision 1.4  2003/07/08 19:27:46  todorov
  648. * Added an speed-optimized viewer
  649. *
  650. * Revision 1.3  2003/06/04 18:20:40  todorov
  651. * read seq-submit
  652. *
  653. * Revision 1.2  2003/06/02 16:06:41  dicuccio
  654. * Rearranged src/objects/ subtree.  This includes the following shifts:
  655. *     - src/objects/asn2asn --> arc/app/asn2asn
  656. *     - src/objects/testmedline --> src/objects/ncbimime/test
  657. *     - src/objects/objmgr --> src/objmgr
  658. *     - src/objects/util --> src/objmgr/util
  659. *     - src/objects/alnmgr --> src/objtools/alnmgr
  660. *     - src/objects/flat --> src/objtools/flat
  661. *     - src/objects/validator --> src/objtools/validator
  662. *     - src/objects/cddalignview --> src/objtools/cddalignview
  663. * In addition, libseq now includes six of the objects/seq... libs, and libmmdb
  664. * replaces the three libmmdb? libs.
  665. *
  666. * Revision 1.1  2003/04/03 21:17:48  todorov
  667. * Adding demo projects
  668. *
  669. *
  670. * ===========================================================================
  671. */