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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: cpgdemo.cpp,v $
  4.  * PRODUCTION Revision 1000.2  2004/06/01 18:10:59  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.5
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: cpgdemo.cpp,v 1000.2 2004/06/01 18:10:59 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: Philip Johnson
  35. *
  36. * File Description: cpgdemo -- demo program for cpg island finder
  37. *
  38. * ===========================================================================
  39. */
  40. #include <ncbi_pch.hpp>
  41. #include <algo/sequence/cpg.hpp>
  42. #include <corelib/ncbiapp.hpp>
  43. #include <corelib/ncbiargs.hpp>
  44. #include <corelib/ncbienv.hpp>
  45. #include <objmgr/object_manager.hpp>
  46. #include <objtools/data_loaders/genbank/gbloader.hpp>
  47. #include <objmgr/scope.hpp>
  48. #include <objmgr/seq_vector.hpp>
  49. USING_NCBI_SCOPE;
  50. USING_SCOPE(objects);
  51. class CCpGDemoApp : public CNcbiApplication {
  52. public:
  53.     CCpGDemoApp(void) {DisableArgDescriptions();};
  54.     virtual void Init(void);
  55.     virtual int Run(void);
  56. };
  57. /*---------------------------------------------------------------------------*/
  58. void CCpGDemoApp::Init(void)
  59. {
  60.     auto_ptr<CArgDescriptions> argDescr(new CArgDescriptions);
  61.     argDescr->AddDefaultKey("gc", "gcContent", "calibrated organism %GC "
  62.                             "content (ie. human: 0.5, rat: 0.48)",
  63.                             CArgDescriptions::eDouble, "0.5");
  64.     argDescr->AddDefaultKey("cpg", "obsexp",
  65.                             "observed / expected CpG ratio",
  66.                             CArgDescriptions::eDouble, "0.6");
  67.     argDescr->AddDefaultKey("win", "window_size",
  68.                             "width of sliding window",
  69.                             CArgDescriptions::eInteger, "200");
  70.     argDescr->AddDefaultKey("len", "min_length",
  71.                             "minimum length of an island",
  72.                             CArgDescriptions::eInteger, "500");
  73.     argDescr->AddOptionalKey("m", "merge_isles",
  74.                              "merge adjacent islands within the specified "
  75.                              "distance of each other",
  76.                              CArgDescriptions::eInteger);
  77.     argDescr->AddOptionalKey("a", "accession",
  78.                              "Single accession", CArgDescriptions::eString);
  79.     argDescr->AddOptionalKey("i", "infile",
  80.                              "List of accessions",
  81.                              CArgDescriptions::eInputFile);
  82.     argDescr->AddExtra(0,99, "fasta files", CArgDescriptions::eInputFile);
  83.     argDescr->SetUsageContext(GetArguments().GetProgramBasename(),
  84.                               "Scans sequences for CpG islands; uses algorithm based upon Takai & Jones, 2002.  Output sent to stdout.n", false);
  85.     SetupArgDescriptions(argDescr.release());
  86. }
  87. //---------------------------------------------------------------------------
  88. // PRE : open output stream, populated CpG island struct
  89. // POST: <cpg start> <cpg stop> <%G + C> <obs/exp CpG>
  90. CNcbiOstream& operator<< (CNcbiOstream& o, SCpGIsland i)
  91. {
  92.     unsigned int len = i.m_Stop - i.m_Start + 1;
  93.     o << i.m_Start << "t" << i.m_Stop << "t" <<
  94.         (double) (i.m_C + i.m_G) / len << "t" <<
  95.         (double) i.m_CG * len / (i.m_C * i.m_G);
  96.     return o;
  97. };
  98. //---------------------------------------------------------------------------
  99. // PRE : accession to scan, scope in which to resolve accession, CArgs
  100. // containing cpg island-scanning parameters
  101. // POST: 0 if successful, any islands found in the given accession according
  102. // to the arguments have been sent to cout
  103. int ScanForCpGs(const string& acc, CScope &scope, const CArgs& args)
  104. {
  105.     CSeq_id seq_id(acc);
  106.     if (seq_id.Which() == CSeq_id::e_not_set) {
  107.         cerr << "Invalid seq-id: '" << acc << "'" << endl;
  108.         return 1;
  109.     }
  110.     CBioseq_Handle bioseq_handle = scope.GetBioseqHandle(seq_id);
  111.     if (!bioseq_handle) {
  112.         cerr << "Bioseq load FAILED." << endl;
  113.         return 2;
  114.     }
  115.     CSeqVector sv =
  116.         bioseq_handle.GetSeqVector(CBioseq_Handle::eCoding_Iupac);    
  117.     string seqString;
  118.     seqString.reserve(sv.size());
  119.     sv.GetSeqData(0, sv.size(), seqString);
  120.     
  121.     CCpGIslands cpgIsles(seqString.data(), seqString.length(),
  122.                          args["win"].AsInteger(), args["len"].AsInteger(),
  123.                          args["gc"].AsDouble(), args["cpg"].AsDouble());
  124.     if (args["m"]) {
  125.         cpgIsles.MergeIslesWithin(args["m"].AsInteger());
  126.     }
  127.     
  128.     ITERATE(CCpGIslands::TIsles, i, cpgIsles.GetIsles()) {
  129.         cout << acc << "t" << *i << endl;
  130.     }
  131.     return 0;
  132. }
  133. //---------------------------------------------------------------------------
  134. // PRE : fasta file to scan, scope in which to resolve accession, CArgs
  135. // containing cpg island-scanning parameters
  136. // POST: 0 if successful, any islands found in the given accession according
  137. // to the arguments have been sent to cout
  138. int ScanForCpGs(istream &infile, const CArgs &args)
  139. {
  140.     string localID;
  141.     infile >> localID;
  142.     //skip rest of line
  143.     infile.ignore(numeric_limits<int>::max(), 'n');
  144.     while (infile) {
  145.         if (localID[0] != '>') {
  146.             ERR_POST(Critical << "FASTA file garbled around '" <<localID<<"'");
  147.             return 1;
  148.         }
  149.         
  150.         //read in nucleotides
  151.         string seqString, lineBuff;
  152.         while (!infile.eof() && infile.peek() != '>') {
  153.             getline(infile, lineBuff);
  154.             if (seqString.size() + lineBuff.size() > seqString.capacity())
  155.                 seqString.reserve(seqString.capacity() * 2);
  156.             seqString += lineBuff;
  157.         }
  158.         //scan
  159.         CCpGIslands cpgIsles(seqString.data(), seqString.length(),
  160.                              args["win"].AsInteger(), args["len"].AsInteger(),
  161.                              args["gc"].AsDouble(), args["cpg"].AsDouble());
  162.         if (args["m"]) {
  163.             cpgIsles.MergeIslesWithin(args["m"].AsInteger());
  164.         }
  165.         //output
  166.         ITERATE(CCpGIslands::TIsles, i, cpgIsles.GetIsles()) {
  167.             cout << localID << "t" << *i << endl;
  168.         }
  169.         infile >> localID;
  170.         infile.ignore(numeric_limits<int>::max(), 'n');
  171.     }
  172.     return 0;
  173. }
  174. /*---------------------------------------------------------------------------*/
  175. int CCpGDemoApp::Run(void)
  176. {
  177.     const CArgs& args = GetArgs();
  178.     CRef<CObjectManager> objMgr(new CObjectManager);
  179.     objMgr->RegisterDataLoader(*new CGBDataLoader("GENBANK"),
  180.                                CObjectManager::eDefault);
  181.     CScope scope(*objMgr);
  182.     scope.AddDefaults();
  183.     int retCode = 0;
  184.     cout.precision(2);
  185.     cout.setf(ios::fixed, ios::floatfield);
  186.     cout << "# CpG islands.  Win:" << args["win"].AsInteger()
  187.          << "; Min len:" << args["len"].AsInteger() << "; Min %GC:"
  188.          <<  args["gc"].AsDouble() << "; Min obs/exp CpG: "
  189.          << args["cpg"].AsDouble();
  190.     if (args["m"]) {
  191.         cout << "; Merge islands within: " << args["m"].AsInteger();
  192.     }
  193.     cout << endl;
  194.     cout << "# labeltisle_starttisle_stopt%GCtobs/exp CpG" << endl;
  195.     if (args["a"]) {
  196.         retCode = ScanForCpGs(args["a"].AsString(), scope, args);
  197.     }
  198.     if (args["i"]) {
  199.         istream &infile = args["i"].AsInputFile();
  200.         string acc;
  201.         infile >> acc;
  202.         while (infile.good()) {
  203.             cerr << "Processing " << acc << endl;
  204.             if (ScanForCpGs(acc, scope, args) != 0) {
  205.                 retCode = 3;
  206.             }
  207.             infile >> acc;
  208.         }
  209.     }
  210.     for (unsigned int i = 1; i <= args.GetNExtra(); ++i) {
  211.         if (!ScanForCpGs(args[i].AsInputFile(), args)) {
  212.             retCode = 3;
  213.         }
  214.     }
  215.     return retCode;
  216. }
  217. //---------------------------------------------------------------------------
  218. int main(int argc, char** argv)
  219. {
  220.     CCpGDemoApp theApp;
  221.     return theApp.AppMain(argc, argv, NULL, eDS_Default, 0);
  222. }
  223. /*
  224.  * ===========================================================================
  225.  * $Log: cpgdemo.cpp,v $
  226.  * Revision 1000.2  2004/06/01 18:10:59  gouriano
  227.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.5
  228.  *
  229.  * Revision 1.5  2004/05/21 21:41:04  gorelenk
  230.  * Added PCH ncbi_pch.hpp
  231.  *
  232.  * Revision 1.4  2004/01/07 17:39:28  vasilche
  233.  * Fixed include path to genbank loader.
  234.  *
  235.  * Revision 1.3  2003/12/12 20:06:34  johnson
  236.  * accommodate MSVC 7 refactoring; also made more features accessible from
  237.  * command line
  238.  *
  239.  * Revision 1.2  2003/06/17 15:35:12  johnson
  240.  * remove stray char
  241.  *
  242.  * Revision 1.1  2003/06/17 15:12:24  johnson
  243.  * initial revision
  244.  *
  245.  * ===========================================================================
  246.  */