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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: nmer_repeats.cpp,v $
  4.  * PRODUCTION Revision 1000.1  2004/06/01 18:30:35  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.2
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: nmer_repeats.cpp,v 1000.1 2004/06/01 18:30: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.  * Authors:  Josh Cherry
  35.  *
  36.  * File Description:
  37.  *   Command-line tool for n-mer nucleotide repeat searching
  38.  *
  39.  */
  40. #include <ncbi_pch.hpp>
  41. #include <corelib/ncbiapp.hpp>
  42. #include <corelib/ncbienv.hpp>
  43. #include <corelib/ncbiargs.hpp>
  44. #include <objects/seq/Seq_data.hpp>
  45. #include <objects/seq/seqport_util.hpp>
  46. #include <objmgr/util/sequence.hpp>
  47. #include <objtools/readers/fasta.hpp>
  48. #include <serial/iterator.hpp>
  49. #include <objects/seq/Bioseq.hpp>
  50. #include <objects/seqset/Seq_entry.hpp>
  51. #include <objects/seq/Seq_inst.hpp>
  52. #include <objects/seq/IUPACna.hpp>
  53. #include <algo/sequence/find_pattern.hpp>
  54. USING_NCBI_SCOPE;
  55. USING_SCOPE(objects);
  56. /////////////////////////////////////////////////////////////////////////////
  57. //  CNmer_repeatsApplication::
  58. class CNmer_repeatsApplication : public CNcbiApplication
  59. {
  60. private:
  61.     virtual void Init(void);
  62.     virtual int  Run(void);
  63.     virtual void Exit(void);
  64. };
  65. /////////////////////////////////////////////////////////////////////////////
  66. //  Init test for all different types of arguments
  67. void CNmer_repeatsApplication::Init(void)
  68. {
  69.     HideStdArgs(fHideLogfile | fHideConffile | fHideVersion);
  70.     // Create command-line argument descriptions class
  71.     auto_ptr<CArgDescriptions> arg_desc(new CArgDescriptions);
  72.     // Specify USAGE context
  73.     arg_desc->SetUsageContext(GetArguments().GetProgramBasename(),
  74.                               "n-mer nucleotide repeat finding program");
  75.     // Describe the expected command-line arguments
  76.     arg_desc->AddPositional
  77.         ("fasta_file",
  78.          "fasta format file to read ("-" for stdin)",
  79.          CArgDescriptions::eInputFile);
  80.     arg_desc->AddDefaultKey
  81.         ("2", "dinuc_min",
  82.          "Minimum number of repeat units for a dinucleotide repeat "
  83.          "(0 to suppress dinucleotide search)",
  84.          CArgDescriptions::eInteger, "5");
  85.     arg_desc->AddDefaultKey
  86.         ("3", "trinuc_min",
  87.          "Minimum number of repeat units for a trinucleotide repeat "
  88.          "(0 to suppress trinucleotide search)",
  89.          CArgDescriptions::eInteger, "5");
  90.     arg_desc->AddDefaultKey
  91.         ("4", "tetranuc_min",
  92.          "Minimum number of repeat units for a tetranucleotide repeat "
  93.          "(0 to suppress tetranucleotide search)",
  94.          CArgDescriptions::eInteger, "5");
  95.     // Setup arg.descriptions for this application
  96.     SetupArgDescriptions(arg_desc.release());
  97. }
  98. /////////////////////////////////////////////////////////////////////////////
  99. //  Run
  100. int CNmer_repeatsApplication::Run(void)
  101. {
  102.     // Get arguments
  103.     CArgs args = GetArgs();
  104.     vector<int> minima(5);
  105.     minima[2] = args["2"].AsInteger();
  106.     minima[3] = args["3"].AsInteger();
  107.     minima[4] = args["4"].AsInteger();
  108.     CNcbiIstream& is = args["fasta_file"].AsInputFile();
  109.     // load sequences
  110.     CRef<CSeq_entry> entry = ReadFasta(is, fReadFasta_AssumeNuc);
  111.     // print the header line
  112.     cout << "idtrepeat_unittnumber_of_repeatstfromtto" << endl;
  113.     // Do search on each sequence
  114.     for (CTypeConstIterator<CBioseq> itr(ConstBegin(*entry));
  115.          itr; ++itr) {
  116.         
  117.         vector<TSeqPos> starts, ends;
  118.         CSeq_data seq_data;
  119.         string seq;
  120.         CSeqportUtil::Convert(itr->GetInst().GetSeq_data(),
  121.                               &seq_data, CSeq_data::e_Iupacna);
  122.         seq = seq_data.GetIupacna();
  123.         const string id = itr->GetFirstId()->AsFastaString();
  124.         for (unsigned int n = 2;  n <= 4;  ++n) {
  125.             if (minima[n] == 0) {
  126.                 // 0 means don't do this search
  127.                 continue;
  128.             }
  129.             starts.clear();
  130.             ends.clear();
  131.             CFindPattern::FindNucNmerRepeats(seq, n, minima[n],
  132.                                              starts, ends);
  133.             for(unsigned int k = 0;  k < starts.size();  k++) {
  134.                 string rep_unit = seq.substr(starts[k], n);
  135.                 
  136.                 if (rep_unit.find_first_not_of(rep_unit.substr(0, 1), 1)
  137.                     == string::npos) {
  138.                     // skip it if it's a monomer repeat
  139.                     continue;
  140.                 }
  141.                 
  142.                 if (n == 4) {
  143.                     // check whether it's a dimer repeat too
  144.                     if (rep_unit[2] == rep_unit[0] &&
  145.                         rep_unit[3] == rep_unit[1]) {
  146.                         // if so, skip it
  147.                         continue;
  148.                     }
  149.                 }
  150.                 
  151.                 int rep_num = (ends[k] - starts[k] + 1) / n;
  152.                 // ouput for this repeat
  153.                 cout << id << 't' << rep_unit << 't' << rep_num << 't'
  154.                      << starts[k] + 1 << 't' << ends[k] + 1 << endl;
  155.             }
  156.         }
  157.     }
  158.     return 0;
  159. }
  160. /////////////////////////////////////////////////////////////////////////////
  161. //  Cleanup
  162. void CNmer_repeatsApplication::Exit(void)
  163. {
  164.     SetDiagStream(0);
  165. }
  166. /////////////////////////////////////////////////////////////////////////////
  167. //  MAIN
  168. int main(int argc, const char* argv[])
  169. {
  170.     // Execute main application function
  171.     return CNmer_repeatsApplication().AppMain(argc, argv, 0, eDS_Default, 0);
  172. }
  173. /*
  174.  * ===========================================================================
  175.  * $Log: nmer_repeats.cpp,v $
  176.  * Revision 1000.1  2004/06/01 18:30:35  gouriano
  177.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.2
  178.  *
  179.  * Revision 1.2  2004/05/21 21:41:40  gorelenk
  180.  * Added PCH ncbi_pch.hpp
  181.  *
  182.  * Revision 1.1  2003/12/19 16:56:53  jcherry
  183.  * Initial version
  184.  *
  185.  * ===========================================================================
  186.  */