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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: cluster.cpp,v $
  4.  * PRODUCTION Revision 1000.2  2004/06/01 18:08:31  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.4
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: cluster.cpp,v 1000.2 2004/06/01 18:08:31 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:  Mike DiCuccio
  35.  *
  36.  * File Description:
  37.  *
  38.  */
  39. #include <ncbi_pch.hpp>
  40. #include "gene_finder.hpp"
  41. BEGIN_NCBI_SCOPE
  42. void AlignVec::Insert(IPair p)
  43. {
  44.     limits.first  = min(limits.first,p.first);
  45.     limits.second = max(limits.second,p.second);
  46.     push_back(p);
  47. }
  48. void AlignVec::Erase(int i)
  49. {
  50.     _ASSERT(i < size());
  51.     erase(begin() + i);
  52.     if ( !empty()  ) {
  53.         limits.first  = front().first;
  54.         limits.second = back().second;
  55.     }
  56. }
  57. void AlignVec::Init()
  58. {
  59.     clear();
  60.     limits.first     = numeric_limits<int>::max();
  61.     limits.second    = 0;
  62.     cds_limits.first = cds_limits.second = -1;
  63. }
  64. void AlignVec::Extend(const AlignVec& a)
  65. {
  66.     AlignVec tmp(*this);
  67.     Init();
  68.     cds_limits.first  = min(tmp.cds_limits.first,a.cds_limits.first);
  69.     cds_limits.second = max(tmp.cds_limits.second,a.cds_limits.second);
  70.     int i;
  71.     for (i = 0;  a[i].second < tmp.front().first;  ++i) {
  72.         Insert(a[i]);
  73.     }
  74.     if (i == 0) {
  75.         tmp.front().first = min(tmp.front().first,a[i].first);
  76.     }
  77.     for (i = 0;  i < tmp.size();  ++i) {
  78.         Insert(tmp[i]);
  79.     }
  80.     for (i = 0;  i < a.size();  ++i) {
  81.         if (a[i].first > tmp.back().second) {
  82.             Insert(a[i]);
  83.         }
  84.     }
  85.     if (back().second == tmp.back().second) {
  86.         back().second = max(back().second,a.back().second);
  87.     }
  88. }
  89. static CNcbiIstream& InputError(CNcbiIstream& s, CT_POS_TYPE pos)
  90. {
  91.     s.clear();
  92.     s.seekg(pos);
  93.     s.setstate(ios::failbit);
  94.     return s;
  95. }
  96. CNcbiIstream& operator>>(CNcbiIstream& s, AlignVec& a)
  97. {
  98.     CT_POS_TYPE pos = s.tellg();
  99.     string strandname;
  100.     int strand;
  101.     s >> strandname;
  102.     if (strandname == "+") {
  103.         strand = Plus;
  104.     } else if (strandname == "-") {
  105.         strand = Minus;
  106.     } else {
  107.         return InputError(s,pos);
  108.     }
  109.     char c;
  110.     s >> c >> c;
  111.     int id;
  112.     if ( !(s >> id)  ) {
  113.         return InputError(s,pos);
  114.     }
  115.     string typenm;
  116.     s >> typenm;
  117.     IPair cds_limits(-1,-1);
  118.     if (typenm == "CDS") {
  119.         if ( !(s >> cds_limits.first)  ) {
  120.             return InputError(s,pos);
  121.         }
  122.         if ( !(s >> cds_limits.second)  ) {
  123.             return InputError(s,pos);
  124.         }
  125.         s >> typenm;
  126.     }
  127.     int type;
  128.     if (typenm == "RefSeqBest") {
  129.         type = AlignVec::RefSeqBest;
  130.     } else if (typenm == "RefSeq") {
  131.         type = AlignVec::RefSeq;
  132.     } else if (typenm == "mRNA") {
  133.         type = AlignVec::mRNA;
  134.     } else if (typenm == "EST") {
  135.         type = AlignVec::EST;
  136.     } else if (typenm == "Prot") {
  137.         type = AlignVec::Prot;
  138.     } else if (typenm == "Wall") {
  139.         type = AlignVec::Wall;
  140.     } else {
  141.         return InputError(s,pos);
  142.     }
  143.     int start, stop;
  144.     s >> start >> stop;
  145.     if ( !s  ) {
  146.         return InputError(s,pos);
  147.     }
  148.     a.Init();
  149.     a.SetStrand(strand);
  150.     a.SetType(type);
  151.     a.SetID(id);
  152.     a.SetCdsLimits(cds_limits);
  153.     a.Insert(IPair(start,stop));
  154.     CT_POS_TYPE lastpos = s.tellg();
  155.     while (s >> start) {
  156.         if ( !(s >> stop)  ) {
  157.             return InputError(s,pos);
  158.         }
  159.         a.Insert(IPair(start,stop));
  160.         lastpos = s.tellg();
  161.     }
  162.     s.clear();
  163.     s.seekg(lastpos);
  164.     return s;
  165. }
  166. CNcbiOstream& operator<<(CNcbiOstream& s, const AlignVec& a)
  167. {
  168.     s << (a.Strand() == Plus ? '+' : '-') << " ID" << a.ID() << ' ';
  169.     if (a.CdsLimits().first >= 0) {
  170.         s << "CDS " << a.CdsLimits().first
  171.             << ' ' << a.CdsLimits().second << ' ';
  172.     }
  173.     switch (a.Type()) {
  174.     case AlignVec::RefSeqBest: s << "RefSeqBest ";  break;
  175.     case AlignVec::RefSeq:     s << "RefSeq ";      break;
  176.     case AlignVec::mRNA:       s << "mRNA ";        break;
  177.     case AlignVec::EST:        s << "EST ";         break;
  178.     case AlignVec::Prot:       s << "Prot ";        break;
  179.     case AlignVec::Wall:       s << "Wall ";        break;
  180.     }
  181.     for (int i = 0;  i < a.size();  ++i) {
  182.         s << a[i].first << ' ' << a[i].second << ' ';
  183.     }
  184.     s << endl;
  185.     return s;
  186. }
  187. void CCluster::Insert(const AlignVec& a)
  188. {
  189.     limits.first  = min(limits.first,a.Limits().first);
  190.     limits.second = max(limits.second,a.Limits().second);
  191.     push_back(a);
  192.     type = max(type,a.Type());
  193. }
  194. void CCluster::Insert(const CCluster& c)
  195. {
  196.     limits.first  = min(limits.first,c.Limits().first);
  197.     limits.second = max(limits.second,c.Limits().second);
  198.     insert(end(),c.begin(),c.end());
  199.     type = max(type,c.Type());
  200. }
  201. void CCluster::Init(int first, int second, int t)
  202. {
  203.     clear();
  204.     limits.first = first;
  205.     limits.second = second;
  206.     type = t;
  207. }
  208. CNcbiIstream& operator>>(CNcbiIstream& s, CCluster& c)
  209. {
  210.     CT_POS_TYPE pos = s.tellg();
  211.     string cluster;
  212.     s >> cluster;
  213.     if ( cluster != "CCluster" ) {
  214.         return InputError(s,pos);
  215.     }
  216.     int first, second, size;
  217.     string typenm;
  218.     if ( !(s >> first >> second >> size >> typenm)  ) {
  219.         return InputError(s,pos);
  220.     }
  221.     int type;
  222.     if (typenm == "RefSeqBest") {
  223.         type = AlignVec::RefSeqBest;
  224.     } else if (typenm == "RefSeq") {
  225.         type = AlignVec::RefSeq;
  226.     } else if (typenm == "mRNA") {
  227.         type = AlignVec::mRNA;
  228.     } else if (typenm == "EST") {
  229.         type = AlignVec::EST;
  230.     } else if (typenm == "Prot") {
  231.         type = AlignVec::Prot;
  232.     } else if (typenm == "Wall") {
  233.         type = AlignVec::Wall;
  234.     } else {
  235.         return InputError(s,pos);
  236.     }
  237.     c.Init(first,second,type);
  238.     for (int i = 0;  i < size;  ++i) {
  239.         AlignVec a;
  240.         if ( !(s >> a)  ) {
  241.             return InputError(s,pos);
  242.         }
  243.         c.Insert(a);
  244.     }   
  245.     return s;
  246. }
  247. CNcbiOstream& operator<<(CNcbiOstream& s, const CCluster& c)
  248. {
  249.     s << "CCluster ";
  250.     s << c.Limits().first << ' ';
  251.     s << c.Limits().second << ' ';
  252.     s << c.size() << ' ';
  253.     switch (c.Type()) {
  254.     case AlignVec::RefSeqBest:  s << "RefSeqBest "; break;
  255.     case AlignVec::RefSeq:      s << "RefSeq ";     break;
  256.     case AlignVec::mRNA:        s << "mRNA ";       break;
  257.     case AlignVec::EST:         s << "EST ";        break;
  258.     case AlignVec::Prot:        s << "Prot ";       break;
  259.     case AlignVec::Wall:        s << "Wall ";       break;
  260.     }
  261.     s << endl;
  262.     for (CCluster::ConstIt it = c.begin();  it != c.end();  ++it) {
  263.         s << *it;
  264.     }
  265.     return s;
  266. }
  267. void CClusterSet::InsertAlignment(const AlignVec& a)
  268. {
  269.     CCluster clust;
  270.     clust.Insert(a);
  271.     InsertCluster(clust);
  272. }
  273. void CClusterSet::InsertCluster(CCluster clust)
  274. {
  275.     pair<It,It> lim = equal_range(clust);
  276.     for (It it = lim.first;  it != lim.second;  ) {
  277.         clust.Insert(*it);
  278.         erase(it++);
  279.     }
  280.     insert(lim.second,clust);
  281. }
  282. void CClusterSet::Init(string cnt)
  283. {
  284.     clear();
  285.     contig = cnt;
  286. }
  287. CNcbiIstream& operator>>(CNcbiIstream& s, CClusterSet& cls)
  288. {
  289.     CT_POS_TYPE pos = s.tellg();
  290.     string contig;
  291.     s >> contig;
  292.     if ( contig != "Contig" ) {
  293.         return InputError(s,pos);
  294.     }
  295.     int num;
  296.     s >> contig >> num;
  297.     cls.Init(contig);
  298.     for (int i = 0;  i < num;  ++i) {
  299.         CCluster c;
  300.         if ( !(s >> c)  ) {
  301.             return InputError(s,pos);
  302.         }
  303.         cls.InsertCluster(c);
  304.     }
  305.     return s;
  306. }
  307. CNcbiOstream& operator<<(CNcbiOstream& s, const CClusterSet& cls)
  308. {
  309.     int num = cls.size();
  310.     if (num) {
  311.         s << "Contig " << cls.Contig() << ' ' << num << endl;
  312.     }
  313.     ITERATE (CClusterSet, it, cls) {
  314.         s << *it;
  315.     }
  316.     return s;
  317. }
  318. END_NCBI_SCOPE
  319. /*
  320.  * ===========================================================================
  321.  * $Log: cluster.cpp,v $
  322.  * Revision 1000.2  2004/06/01 18:08:31  gouriano
  323.  * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.4
  324.  *
  325.  * Revision 1.4  2004/05/21 21:41:03  gorelenk
  326.  * Added PCH ncbi_pch.hpp
  327.  *
  328.  * Revision 1.3  2003/11/06 15:02:21  ucko
  329.  * Use iostream interface from ncbistre.hpp for GCC 2.95 compatibility.
  330.  *
  331.  * Revision 1.2  2003/11/06 02:47:22  ucko
  332.  * Fix usage of iterators -- be consistent about constness.
  333.  *
  334.  * Revision 1.1  2003/10/24 15:07:25  dicuccio
  335.  * Initial revision
  336.  *
  337.  * ===========================================================================
  338.  */