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

生物技术

开发平台:

C/C++

  1. /*
  2.  * ===========================================================================
  3.  * PRODUCTION $Log: weight.cpp,v $
  4.  * PRODUCTION Revision 1000.3  2004/06/01 19:25:32  gouriano
  5.  * PRODUCTION PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.29
  6.  * PRODUCTION
  7.  * ===========================================================================
  8.  */
  9. /*  $Id: weight.cpp,v 1000.3 2004/06/01 19:25:32 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:  Aaron Ucko
  35. *
  36. * File Description:
  37. *   Weights for protein sequences
  38. */
  39. #include <ncbi_pch.hpp>
  40. #include <corelib/ncbistd.hpp>
  41. #include <objmgr/object_manager.hpp>
  42. #include <objmgr/bioseq_handle.hpp>
  43. #include <objmgr/feat_ci.hpp>
  44. #include <objmgr/seq_vector.hpp>
  45. #include <objmgr/seq_vector_ci.hpp>
  46. #include <objmgr/objmgr_exception.hpp>
  47. #include <objects/seq/Bioseq.hpp>
  48. #include <objects/seq/Seq_inst.hpp>
  49. #include <objects/seqfeat/Prot_ref.hpp>
  50. #include <objects/seqfeat/SeqFeatData.hpp>
  51. #include <objects/seqfeat/Seq_feat.hpp>
  52. #include <objects/seqloc/Seq_interval.hpp>
  53. #include <objects/seqloc/Seq_loc.hpp>
  54. #include <objmgr/util/weight.hpp>
  55. BEGIN_NCBI_SCOPE
  56. BEGIN_SCOPE(objects)
  57. // By NCBIstdaa:
  58. //  A  B  C  D  E  F  G  H  I  K  L  M  N  P  Q  R  S  T  V  W  X  Y  Z  U  *
  59. static const int kNumC[] =
  60. {0, 3, 4, 3, 4, 5, 9, 2, 6, 6, 6, 6, 5, 4, 5, 5, 6, 3, 4, 5,11, 0, 9, 5, 3, 0};
  61. static const int kNumH[] =
  62. {0, 5, 5, 5, 5, 7, 9, 3, 7,11,12,11, 9, 6, 7, 8,12, 5, 7, 9,10, 0, 9, 7, 5, 0};
  63. static const int kNumN[] =
  64. {0, 1, 1, 1, 1, 1, 1, 1, 3, 1, 2, 1, 1, 2, 1, 2, 4, 1, 1, 1, 2, 0, 1, 1, 1, 0};
  65. static const int kNumO[] =
  66. {0, 1, 3, 1, 3, 3, 1, 1, 1, 1, 1, 1, 1, 2, 1, 2, 1, 2, 2, 1, 1, 0, 2, 3, 1, 0};
  67. static const int kNumS[] =
  68. {0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
  69. static const int kNumSe[] =
  70. {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0};
  71. static const size_t kMaxRes = sizeof(kNumC) / sizeof(*kNumC) - 1;
  72. double GetProteinWeight(const CBioseq_Handle& handle, const CSeq_loc* location)
  73. {
  74.     CSeqVector v = (location
  75.                     ? handle.GetSequenceView(*location,
  76.                                              CBioseq_Handle::eViewConstructed)
  77.                     : handle.GetSeqVector());
  78.     v.SetCoding(CSeq_data::e_Ncbistdaa);
  79.     TSeqPos size = v.size();
  80.     // Start with water (H2O)
  81.     TSeqPos c = 0, h = 2, n = 0, o = 1, s = 0, se = 0;
  82.     for (CSeqVector_CI vit(v);  vit.GetPos() < size;  ++vit) {
  83.         CSeqVector::TResidue res = *vit;
  84.         if ( res >= kMaxRes  ||  !kNumC[res] ) {
  85.             THROW1_TRACE(CBadResidueException,
  86.                          "GetProteinWeight: bad residue");
  87.         }
  88.         c  += kNumC [res];
  89.         h  += kNumH [res];
  90.         n  += kNumN [res];
  91.         o  += kNumO [res];
  92.         s  += kNumS [res];
  93.         se += kNumSe[res];
  94.     }
  95.     return 12.01115 * c + 1.0079 * h + 14.0067 * n + 15.9994 * o + 32.064 * s
  96.         + 78.96 * se;
  97. }
  98. void GetProteinWeights(const CBioseq_Handle& handle, TWeights& weights)
  99. {
  100.     CBioseq_Handle::TBioseqCore core = handle.GetBioseqCore();
  101.     if (core->GetInst().GetMol() != CSeq_inst::eMol_aa) {
  102.         NCBI_THROW(CObjmgrUtilException, eBadSequenceType,
  103.             "GetMolecularWeights requires a protein!");
  104.     }
  105.     weights.clear();
  106.     set<CConstRef<CSeq_loc> > locations;
  107.     CSeq_loc* whole = new CSeq_loc;
  108.     whole->SetWhole().Assign(*handle.GetSeqId());
  109.     CConstRef<CSeq_loc> signal;
  110.     // Look for explicit markers: ideally cleavage products (mature
  111.     // peptides), but possibly just signal peptides
  112.     for (CFeat_CI feat(handle, 0, 0, CSeqFeatData::e_not_set,
  113.                        SAnnotSelector::eOverlap_Intervals,
  114.                        SAnnotSelector::eResolve_TSE);
  115.          feat;  ++feat) {
  116.         bool is_mature = false, is_signal = false;
  117.         const CSeqFeatData& data = feat->GetData();
  118.         switch (data.Which()) {
  119.         case CSeqFeatData::e_Prot:
  120.             switch (data.GetProt().GetProcessed()) {
  121.             case CProt_ref::eProcessed_mature:         is_mature = true; break;
  122.             case CProt_ref::eProcessed_signal_peptide: is_signal = true; break;
  123.             }
  124.             break;
  125.         case CSeqFeatData::e_Region:
  126.             if (!NStr::CompareNocase(data.GetRegion(), "mature chain")
  127.                 ||  !NStr::CompareNocase(data.GetRegion(),
  128.                                          "processed active peptide")) {
  129.                 is_mature = true;
  130.             } else if (!NStr::CompareNocase(data.GetRegion(), "signal")) {
  131.                 is_signal = true;
  132.             }
  133.             break;
  134.         case CSeqFeatData::e_Site:
  135.             if (data.GetSite() == CSeqFeatData::eSite_signal_peptide) {
  136.                 is_signal = true;
  137.             }
  138.             break;
  139.         default:
  140.             break;
  141.         }
  142.         if (is_mature) {
  143.             locations.insert(CConstRef<CSeq_loc>(&feat->GetLocation()));
  144.         } else if (is_signal  &&  signal.Empty()
  145.                    &&  !feat->GetLocation().IsWhole() ) {
  146.             signal = &feat->GetLocation();
  147.         }
  148.     }
  149.     if (locations.empty()) {
  150.         CSeqVector v = handle.GetSeqVector(CBioseq_Handle::eCoding_Iupac);
  151.         if ( signal.NotEmpty() ) {
  152.             // Expects to see at beginning; is this assumption safe?
  153.             CSeq_interval& interval = whole->SetInt();
  154.             interval.SetFrom(signal->GetTotalRange().GetTo() + 1);
  155.             interval.SetTo(v.size() - 1);
  156.             interval.SetId(*const_cast<CSeq_id*>(core->GetId().front().GetPointer()));                
  157.         } else if (v[0] == 'M') { // Treat initial methionine as start codon
  158.             CSeq_interval& interval = whole->SetInt();
  159.             interval.SetFrom(1);
  160.             interval.SetTo(v.size() - 1);
  161.             interval.SetId(*const_cast<CSeq_id*>(core->GetId().front().GetPointer()));
  162.         }
  163.         locations.insert(CConstRef<CSeq_loc>(whole));
  164.     }
  165.     ITERATE(set<CConstRef<CSeq_loc> >, it, locations) {
  166.         try {
  167.             weights[*it] = GetProteinWeight(handle, *it);
  168.         } catch (CBadResidueException) {
  169.             // Silently elide
  170.         }
  171.     }
  172. }
  173. END_SCOPE(objects)
  174. END_NCBI_SCOPE
  175. /*
  176. * ===========================================================================
  177. * $Log: weight.cpp,v $
  178. * Revision 1000.3  2004/06/01 19:25:32  gouriano
  179. * PRODUCTION: UPGRADED [GCC34_MSVC7] Dev-tree R1.29
  180. *
  181. * Revision 1.29  2004/05/25 15:38:23  ucko
  182. * Remove inappropriate THROWS declaration from GetProteinWeight.
  183. *
  184. * Revision 1.28  2004/05/21 21:42:14  gorelenk
  185. * Added PCH ncbi_pch.hpp
  186. *
  187. * Revision 1.27  2004/04/05 15:56:14  grichenk
  188. * Redesigned CAnnotTypes_CI: moved all data and data collecting
  189. * functions to CAnnotDataCollector. CAnnotTypes_CI is no more
  190. * inherited from SAnnotSelector.
  191. *
  192. * Revision 1.26  2003/11/19 22:18:06  grichenk
  193. * All exceptions are now CException-derived. Catch "exception" rather
  194. * than "runtime_error".
  195. *
  196. * Revision 1.25  2003/06/02 18:58:25  dicuccio
  197. * Fixed #include directives
  198. *
  199. * Revision 1.24  2003/06/02 18:53:32  dicuccio
  200. * Fixed bungled commit
  201. *
  202. * Revision 1.22  2003/05/27 19:44:10  grichenk
  203. * Added CSeqVector_CI class
  204. *
  205. * Revision 1.21  2003/03/18 21:48:35  grichenk
  206. * Removed obsolete class CAnnot_CI
  207. *
  208. * Revision 1.20  2003/03/11 16:00:58  kuznets
  209. * iterate -> ITERATE
  210. *
  211. * Revision 1.19  2003/02/11 20:49:39  ucko
  212. * Improve support for signal peptide features: ignore them if they have
  213. * WHOLE locations, and optimize logic to avoid GetMappedFeature (expensive).
  214. *
  215. * Revision 1.18  2003/02/10 15:54:01  grichenk
  216. * Use CFeat_CI->GetMappedFeature() and GetOriginalFeature()
  217. *
  218. * Revision 1.17  2002/12/24 16:12:00  ucko
  219. * Make handle const per recent changes to CFeat_CI.
  220. *
  221. * Revision 1.16  2002/12/06 15:36:05  grichenk
  222. * Added overlap type for annot-iterators
  223. *
  224. * Revision 1.15  2002/11/18 19:48:45  grichenk
  225. * Removed "const" from datatool-generated setters
  226. *
  227. * Revision 1.14  2002/11/08 19:43:38  grichenk
  228. * CConstRef<> constructor made explicit
  229. *
  230. * Revision 1.13  2002/11/04 21:29:19  grichenk
  231. * Fixed usage of const CRef<> and CRef<> constructor
  232. *
  233. * Revision 1.12  2002/09/03 21:27:04  grichenk
  234. * Replaced bool arguments in CSeqVector constructor and getters
  235. * with enums.
  236. *
  237. * Revision 1.11  2002/06/12 14:39:05  grichenk
  238. * Renamed enumerators
  239. *
  240. * Revision 1.10  2002/06/07 18:19:54  ucko
  241. * Reworked to take advantage of CBioseq_Handle::GetSequenceView.
  242. *
  243. * Revision 1.9  2002/06/06 18:38:11  clausen
  244. * Added include for object_manager.hpp
  245. *
  246. * Revision 1.8  2002/05/10 14:54:12  ucko
  247. * Dropped test for negative start positions, which are now impossible.
  248. *
  249. * Revision 1.7  2002/05/06 17:12:29  ucko
  250. * Take advantage of new eResolve_TSE option.
  251. *
  252. * Revision 1.6  2002/05/06 16:11:49  ucko
  253. * Update for new OM; move CVS log to end.
  254. *
  255. * Revision 1.5  2002/05/06 03:39:13  vakatov
  256. * OM/OM1 renaming
  257. *
  258. * Revision 1.4  2002/05/03 21:28:20  ucko
  259. * Introduce T(Signed)SeqPos.
  260. *
  261. * Revision 1.3  2002/04/09 20:58:09  ucko
  262. * Look for "processed active peptide" in addition to "mature chain";
  263. * SWISS-PROT changed their labels.
  264. *
  265. * Revision 1.2  2002/03/21 18:57:31  ucko
  266. * Fix check for initial Met.
  267. *
  268. * Revision 1.1  2002/03/06 22:08:40  ucko
  269. * Add code to calculate protein weights.
  270. * ===========================================================================
  271. */