NCBI C++ ToolKit
Genetic_code_table.cpp
Go to the documentation of this file.

Go to the SVN repository for this file.

1 /* $Id: Genetic_code_table.cpp 91899 2020-12-15 14:04:43Z gouriano $
2  * ===========================================================================
3  *
4  * PUBLIC DOMAIN NOTICE
5  * National Center for Biotechnology Information
6  *
7  * This software/database is a "United States Government Work" under the
8  * terms of the United States Copyright Act. It was written as part of
9  * the author's official duties as a United States Government employee and
10  * thus cannot be copyrighted. This software/database is freely available
11  * to the public for use. The National Library of Medicine and the U.S.
12  * Government have not placed any restriction on its use or reproduction.
13  *
14  * Although all reasonable efforts have been taken to ensure the accuracy
15  * and reliability of the software and data, the NLM and the U.S.
16  * Government do not and cannot warrant the performance or results that
17  * may be obtained by using this software or data. The NLM and the U.S.
18  * Government disclaim all warranties, express or implied, including
19  * warranties of performance, merchantability or fitness for any particular
20  * purpose.
21  *
22  * Please cite the author in any work or product based on this material.
23  *
24  * ===========================================================================
25  *
26  * Author: .......
27  *
28  * File Description:
29  * .......
30  *
31  * Remark:
32  * This code was originally generated by application DATATOOL
33  * using specifications from the ASN data definition file
34  * 'seqfeat.asn'.
35  */
36 
37 // standard includes
38 #include <ncbi_pch.hpp>
39 #include <corelib/ncbimtx.hpp>
40 #include <serial/serial.hpp>
41 #include <serial/objistr.hpp>
42 
43 // generated includes
45 
46 // generated classes
47 
49 
50 BEGIN_objects_SCOPE // namespace ncbi::objects::
51 
52 // destructor
54 {
55 }
56 
57 // genetic code translation tables
58 
59 // destructor
61 {
62 }
63 
64 // translation finite state machine base codes - ncbi4na
65 enum EBaseCode {
66  eBase_gap = 0,
67  eBase_A, /* A */
68  eBase_C, /* C */
69  eBase_M, /* AC */
70  eBase_G, /* G */
71  eBase_R, /* AG */
72  eBase_S, /* CG */
73  eBase_V, /* ACG */
74  eBase_T, /* T */
75  eBase_W, /* AT */
76  eBase_Y, /* CT */
77  eBase_H, /* ACT */
78  eBase_K, /* GT */
79  eBase_D, /* AGT */
80  eBase_B, /* CGT */
81  eBase_N /* ACGT */
82 };
83 
84 // static instances of single copy translation tables common to all genetic codes
88 
89 // initialize base conversion, next state, and reverse complement state tables
91 {
92  char ch;
93  int i, j, k, p, q, r, nx, st;
94  static char charToBase [17] = "-ACMGRSVTWYHKDBN";
95  static char baseToComp [17] = "-TGKCYSBAWRDMHVN";
96 
97  // illegal characters map to 0
98  for (i = 0; i < 256; i++) {
99  sm_BaseToIdx [i] = 0;
100  }
101 
102  // map iupacna alphabet to EBaseCode
103  for (i = eBase_gap; i <= eBase_N; i++) {
104  ch = charToBase [i];
105  sm_BaseToIdx [(int) ch] = i;
106  ch = (unsigned char)tolower (ch);
107  sm_BaseToIdx [(int) ch] = i;
108  }
109  sm_BaseToIdx [(int) 'U'] = eBase_T;
110  sm_BaseToIdx [(int) 'u'] = eBase_T;
111  sm_BaseToIdx [(int) 'X'] = eBase_N;
112  sm_BaseToIdx [(int) 'x'] = eBase_N;
113 
114  // also map ncbi4na alphabet to EBaseCode
115  for (i = eBase_gap; i <= eBase_N; i++) {
116  sm_BaseToIdx [(int) i] = i;
117  }
118 
119  // treat state 0 as already having seen NN,
120  // avoiding single and double letter states
121  sm_NextState [0] = 4081;
122  sm_RvCmpState [0] = 4096;
123 
124  // states 1 through 4096 are triple letter states (---, --A, ..., NNT, NNN)
125  for (i = eBase_gap, st = 1; i <= eBase_N; i++) {
126  for (j = eBase_gap, nx = 1; j <= eBase_N; j++) {
127  for (k = eBase_gap; k <= eBase_N; k++, st++, nx += 16) {
128  sm_NextState [st] = nx;
129  p = sm_BaseToIdx [(int) (Uint1) baseToComp [k]];
130  q = sm_BaseToIdx [(int) (Uint1) baseToComp [j]];
131  r = sm_BaseToIdx [(int) (Uint1) baseToComp [i]];
132  sm_RvCmpState [st] = 256 * p + 16 * q + r + 1;
133  }
134  }
135  }
136 }
137 
138 // initialize genetic code specific translation tables
139 void CTrans_table::x_InitFsaTransl (const string *ncbieaa,
140  const string *sncbieaa) const
141 {
142  char ch, aa, orf;
143  bool go_on;
144  int i, j, k, p, q, r, x, y, z, st, cd;
145  static int expansions [4] = {eBase_A, eBase_C, eBase_G, eBase_T};
146  // T = 0, C = 1, A = 2, G = 3
147  static int codonIdx [9] = {0, 2, 1, 0, 3, 0, 0, 0, 0};
148 
149  // return if unable to find ncbieaa and sncbieaa strings
150  if (ncbieaa == 0 || sncbieaa == 0) return;
151 
152  // also check length of ncbieaa and sncbieaa strings
153  if (ncbieaa->size () != 64 || sncbieaa->size () != 64) return;
154 
155  // ambiguous codons map to unknown amino acid or not start
156  for (i = 0; i <= 4096; i++) {
157  m_AminoAcid [i] = 'X';
158  m_OrfStart [i] = '-';
159  m_OrfStop [i] = '-';
160  }
161 
162  // lookup amino acid for each codon in genetic code table
163  for (i = eBase_gap, st = 1; i <= eBase_N; i++) {
164  for (j = eBase_gap; j <= eBase_N; j++) {
165  for (k = eBase_gap; k <= eBase_N; k++, st++) {
166  aa = '\0';
167  orf = '\0';
168  go_on = true;
169 
170  // expand ambiguous IJK nucleotide symbols into component bases XYZ
171  for (p = 0; p < 4 && go_on; p++) {
172  x = expansions [p];
173  if ((x & i) != 0) {
174  for (q = 0; q < 4 && go_on; q++) {
175  y = expansions [q];
176  if ((y & j) != 0) {
177  for (r = 0; r < 4 && go_on; r++) {
178  z = expansions [r];
179  if ((z & k) != 0) {
180 
181  // calculate offset in genetic code string
182 
183  // the T = 0, C = 1, A = 2, G = 3 order is
184  // necessary because the genetic code strings
185  // are presented in TCAG order in printed tables
186  // and in the genetic code strings
187  cd = 16 * codonIdx [x] + 4 * codonIdx [y] + codonIdx [z];
188 
189  // lookup amino acid for codon XYZ
190  ch = (*ncbieaa) [cd];
191  if (aa == '\0') {
192  aa = ch;
193  } else if (aa != ch) {
194  // allow Asx (Asp or Asn) and Glx (Glu or Gln)
195  if ((aa == 'B' || aa == 'D' || aa == 'N') &&
196  (ch == 'D' || ch == 'N')) {
197  aa = 'B';
198  } else if ((aa == 'Z' || aa == 'E' || aa == 'Q') &&
199  (ch == 'E' || ch == 'Q')) {
200  aa = 'Z';
201  } else if ((aa == 'J' || aa == 'I' || aa == 'L') &&
202  (ch == 'I' || ch == 'L')) {
203  aa = 'J';
204  } else {
205  aa = 'X';
206  }
207  }
208 
209  // lookup translation start flag
210  ch = (*sncbieaa) [cd];
211  if (orf == '\0') {
212  orf = ch;
213  } else if (orf != ch) {
214  orf = 'X';
215  }
216 
217  // drop out of loop as soon as answer is known
218  if (aa == 'X' && orf == 'X') {
219  go_on = false;
220  }
221  }
222  }
223  }
224  }
225  }
226  }
227 
228  // assign amino acid
229  if (aa != '\0') {
230  m_AminoAcid [st] = aa;
231  }
232  // assign orf start/stop
233  if (orf == '*') {
234  m_OrfStop [st] = orf;
235  } else if (orf != '\0') {
236  m_OrfStart [st] = orf;
237  }
238  }
239  }
240  }
241 }
242 
243 // implementation class for genetic code table and translation tables
244 
246 {
247 public:
248  // constructors (the default uses sm_GenCodeTblMemStr)
249  CGen_code_table_imp(void);
251  // destructor
252  ~CGen_code_table_imp(void);
253 
254  // return initialized translation table given genetic code
255  const CTrans_table& GetTransTable (int gc);
256  const CTrans_table& GetTransTable (const CGenetic_code& gc);
257 
258  // return single copy loaded genetic code table for iteration
259  const CGenetic_code_table& GetCodeTable (void);
260 
261  const string& GetNcbieaa(int id) const;
262  const string& GetNcbieaa(const CGenetic_code& gc) const;
263 
264  const string& GetSncbieaa(int id) const;
265  const string& GetSncbieaa(const CGenetic_code& gc) const;
266 
267 private:
268  // genetic code table data
270 
271  // typedefs
272  typedef vector< CRef< CTrans_table > > TTransTablesById;
273 
274  // translation tables
276 
277  // local copy of genetic code table ASN.1
278  static const char * const sm_GenCodeTblMemStr [];
279 };
280 
281 // single instance of implementation class is initialized before Main
283 DEFINE_STATIC_FAST_MUTEX(s_ImplementationMutex);
284 
286 {
287  CFastMutexGuard LOCK(s_ImplementationMutex);
288  if ( !sm_Implementation.get() ) {
290  }
291 }
292 
293 
294 // public access functions
295 
297 {
298  return x_GetImplementation().GetTransTable (id);
299 }
300 
301 
303 {
304  return x_GetImplementation().GetTransTable(gc);
305 }
306 
307 
309 {
311 }
312 
313 
314 const string& CGen_code_table::GetNcbieaa(int id)
315 {
316  return x_GetImplementation().GetNcbieaa(id);
317 }
318 
319 
321 {
322  return x_GetImplementation().GetNcbieaa(gc);
323 }
324 
325 
326 const string& CGen_code_table::GetSncbieaa(int id)
327 {
328  return x_GetImplementation().GetSncbieaa(id);
329 }
330 
331 
333 {
334  return x_GetImplementation().GetSncbieaa(gc);
335 }
336 
337 
339 {
340  if ( index < 0 || index > 63 ) return CNcbiEmptyString::Get();
341 
342  static char na[4] = { 'T', 'C', 'A', 'G' };
343  string codon;
344  codon.resize(3);
345  int total = index;
346  int div = 16;
347  for ( int i = 0; i < 3; ++i ) {
348  int j = total / div;
349  codon[i] = na[j];
350  total -= div * j;
351  div /= 4;
352  }
353 
354  return codon;
355 }
356 
357 
358 int CGen_code_table::CodonToIndex(char base1, char base2, char base3)
359 {
360  string codon;
361  codon.insert(codon.end(), base1);
362  codon.insert(codon.end(), base2);
363  codon.insert(codon.end(), base3);
364 
365  return CodonToIndex(codon);
366 }
367 
368 
370 {
371  CFastMutexGuard LOCK(s_ImplementationMutex);
373 }
374 
375 
376 void CGen_code_table::LoadTransTable(const string& path,
378 {
379  unique_ptr<CObjectIStream> ois(CObjectIStream::Open(path, format));
380  LoadTransTable(*ois);
381 }
382 
383 
384 static bool s_ValidCodon(const string& codon)
385 {
386  if ( codon.length() != 3 ) return false;
387 
388  for ( int i = 0; i < 3; ++i ) {
389  unsigned char ch = (unsigned char)toupper(codon[i]);
390  if ( ch != 'A' &&
391  ch != 'G' &&
392  ch != 'C' &&
393  ch != 'T' &&
394  ch != 'U' ) {
395  return false;
396  }
397  }
398  return true;
399 }
400 
401 
402 int CGen_code_table::CodonToIndex(const string& codon)
403 {
404  if ( !s_ValidCodon(codon) ) return -1;
405 
406  int weight = 0;
407  int index = 0;
408  int mul = 16;
409  for ( int i = 0; i < 3; ++i ) {
410  switch ( toupper((unsigned char) codon[i]) ) {
411  case 'A' :
412  weight = 2;
413  break;
414  case 'C' :
415  weight = 1;
416  break;
417  case 'G' :
418  weight = 3;
419  break;
420  case 'T' :
421  case 'U' :
422  weight = 0;
423  break;
424  }
425 
426  index += mul * weight;
427  mul /= 4;
428  }
429 
430  return index;
431 }
432 
433 
434 
435 // constructors
437 {
438  // initialize common CTrans_table tables
440 
441  // Compose a long-long string
442  string str;
443  for (size_t i = 0; sm_GenCodeTblMemStr [i]; i++) {
445  if (sm_GenCodeTblMemStr[i][0] == '}') {
446  break;
447  }
448  }
449 
450  // create an in memory stream on sm_GenCodeTblMemStr
451  CNcbiIstrstream is(str);
452  unique_ptr<CObjectIStream>
453  asn_codes_in(CObjectIStream::Open(eSerial_AsnText, is));
454 
455  // read single copy of genetic-code table
457  *asn_codes_in >> *m_GcTable;
458 }
459 
461 {
462  if ( !CTrans_table::sm_NextState[0] ) {
464  }
465 
466  // read single copy of genetic-code table
468  ois >> *m_GcTable;
469  // perform additional sanity checks?
470 }
471 
472 // destructor
474 {
475 }
476 
477 // constructor
479 {
480  const string * ncbieaa = 0;
481  const string * sncbieaa = 0;
482 
483  // find amino acid and orf start strings given genetic code instance
484  ITERATE (CGenetic_code::Tdata, gcd, gc.Get ()) {
485  switch ((*gcd)->Which ()) {
487  ncbieaa = & (*gcd)->GetNcbieaa ();
488  break;
490  sncbieaa = & (*gcd)->GetSncbieaa ();
491  break;
492  default:
493  break;
494  }
495  }
496 
497  // throw exception if unable to find ncbieaa and sncbieaa strings
498  if (ncbieaa == 0 || sncbieaa == 0) {
500  "Could not find ncbieaa and sncbieaa");
501  }
502 
503  // initialize translation table for this genetic code instance
504  x_InitFsaTransl (ncbieaa, sncbieaa);
505 }
506 
508 {
509  _ASSERT(id >= 0);
510 
511  // look for already created translation table
512  if ( size_t(id) < m_TransTablesById.size ()) {
514  if (tbl != 0) {
515  // already in list, already initialized, so return
516  return *tbl;
517  }
518  }
519 
520  // this mutex is automatically freed when the function exits
522  CFastMutexGuard LOCK (mtx);
523 
524  // test again within mutex lock to see if another thread was just adding it
525  if ( size_t(id) < m_TransTablesById.size ()) {
527  if (tbl != 0) {
528  // already in list, already initialized, so return
529  return *tbl;
530  }
531  }
532 
533  // now look for the genetic code and initialize the translation table
535  ITERATE (CGenetic_code::Tdata, gcd, (*gcl)->Get ()) {
536  if ((*gcd)->IsId () && (*gcd)->GetId () == id) {
537 
538  // found proper genetic code, so create new trans table
539  CRef< CTrans_table> tbl(new CTrans_table (**gcl));
540 
541  // extend size of translation table list, if necessary
542  if ( size_t(id) >= m_TransTablesById.size ()) {
543  m_TransTablesById.resize (id + 1);
544  }
545 
546  // add new table to list of translation tables
547  m_TransTablesById [id] = tbl;
548 
549  return *tbl;
550  }
551  }
552  }
553 
554  // throw exception if failure
556  "Unable to find genetic code number " +
557  NStr::IntToString (id));
558 }
559 
561 {
562  const string * ncbieaa = 0;
563  const string * sncbieaa = 0;
564 
565  ITERATE (CGenetic_code::Tdata, gcd, gc.Get ()) {
566  switch ((*gcd)->Which ()) {
568  {
569  // lookup table by ID
570  int id = (*gcd)->GetId ();
571  // code corrections: Genetic codes 7 and 8 have been removed; 0 means 1
572  // See JIRA ticket GB-3046 for details
573  if (id == 7) {
574  id = 4;
575  } else if (id == 8) {
576  id = 1;
577  } else if (id == 0) {
578  id = 1;
579  }
580  return GetTransTable (id);
581  }
583  ncbieaa = & (*gcd)->GetNcbieaa ();
584  break;
586  sncbieaa = & (*gcd)->GetSncbieaa ();
587  break;
588  default:
589  break;
590  }
591  }
592 
593  if (ncbieaa != 0 && sncbieaa != 0) {
594  // return * new CTrans_table (gc);
595 
597  "GetTransTable without ID not yet supported");
598  }
599 
601  "GetTransTable does not have sufficient information");
602 }
603 
605 {
606  return *m_GcTable;
607 }
608 
609 
610 const string& CGen_code_table_imp::GetNcbieaa(int id) const
611 {
613  if ( (*gcl)->GetId() == id ) {
614  return (*gcl)->GetNcbieaa();
615  }
616  }
617  return CNcbiEmptyString::Get();
618 }
619 
620 
621 const string& CGen_code_table_imp::GetNcbieaa(const CGenetic_code& gc) const
622 {
623  return gc.GetNcbieaa();
624 }
625 
626 
627 const string& CGen_code_table_imp::GetSncbieaa(int id) const
628 {
630  if ( (*gcl)->GetId() == id ) {
631  return (*gcl)->GetSncbieaa();
632  }
633  }
634 
635  return CNcbiEmptyString::Get();
636 }
637 
638 
639 const string& CGen_code_table_imp::GetSncbieaa(const CGenetic_code& gc) const
640 {
641  return gc.GetSncbieaa();
642 }
643 
644 
645 // standard genetic code
646 //
647 // ncbieaa "FFLLSSSSYY**CC*WLLLLPPPPHHQQRRRRIIIMTTTTNNKKSSRRVVVVAAAADDEEGGGG"
648 // sncbieaa "---M------**--*----M---------------M----------------------------"
649 //
650 // -- Base1 TTTTTTTTTTTTTTTTCCCCCCCCCCCCCCCCAAAAAAAAAAAAAAAAGGGGGGGGGGGGGGGG
651 // -- Base2 TTTTCCCCAAAAGGGGTTTTCCCCAAAAGGGGTTTTCCCCAAAAGGGGTTTTCCCCAAAAGGGG
652 // -- Base3 TCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAGTCAG
653 
654 /*
655  Second Position
656 First T C A G Third
657 -----------------------------------------------------------------
658  T TTT Phe [F] TCT Ser [S] TAT Tyr [Y] TGT Cys [C] T
659  TTC Phe [F] TCC Ser [S] TAC Tyr [Y] TGC Cys [C] C
660  TTA Leu [L] TCA Ser [S] TAA Ter [*] TGA Ter [*] A
661  TTG Leu [L] TCG Ser [S] TAG Ter [*] TGG Trp [W] G
662 -----------------------------------------------------------------
663  C CTT Leu [L] CCT Pro [P] CAT His [H] CGT Arg [R] T
664  CTC Leu [L] CCC Pro [P] CAC His [H] CGC Arg [R] C
665  CTA Leu [L] CCA Pro [P] CAA Gln [Q] CGA Arg [R] A
666  CTG Leu [L] CCG Pro [P] CAG Gln [Q] CGG Arg [R] G
667 -----------------------------------------------------------------
668  A ATT Ile [I] ACT Thr [T] AAT Asn [N] AGT Ser [S] T
669  ATC Ile [I] ACC Thr [T] AAC Asn [N] AGC Ser [S] C
670  ATA Ile [I] ACA Thr [T] AAA Lys [K] AGA Arg [R] A
671  ATG Met [M] ACG Thr [T] AAG Lys [K] AGG Arg [R] G
672 -----------------------------------------------------------------
673  G GTT Val [V] GCT Ala [A] GAT Asp [D] GGT Gly [G] T
674  GTC Val [V] GCC Ala [A] GAC Asp [D] GGC Gly [G] C
675  GTA Val [V] GCA Ala [A] GAA Glu [E] GGA Gly [G] A
676  GTG Val [V] GCG Ala [A] GAG Glu [E] GGG Gly [G] G
677 -----------------------------------------------------------------
678 */
679 
680 // local copy of gc.prt genetic code table ASN.1
681 #define static
682 #define s_GenCodeTblMemStr CGen_code_table_imp::sm_GenCodeTblMemStr
683 #include "gc.inc"
684 #undef static
685 
686 
687 END_objects_SCOPE // namespace ncbi::objects::
688 
690 
691 /* Original file checksum: lines: 64, chars: 1914, CRC32: 6d579336 */
@ eBase_gap
static bool s_ValidCodon(const string &codon)
DEFINE_STATIC_FAST_MUTEX(s_ImplementationMutex)
vector< CRef< CTrans_table > > TTransTablesById
const CTrans_table & GetTransTable(int gc)
CRef< CGenetic_code_table > m_GcTable
const string & GetNcbieaa(int id) const
static const char *const sm_GenCodeTblMemStr[]
const string & GetSncbieaa(int id) const
TTransTablesById m_TransTablesById
const CGenetic_code_table & GetCodeTable(void)
static const string & GetNcbieaa(int id)
static string IndexToCodon(int index)
static const CTrans_table & GetTransTable(int id)
static void LoadTransTable(CObjectIStream &ois)
static AutoPtr< CGen_code_table_imp > sm_Implementation
static int CodonToIndex(char base1, char base2, char base3)
static const CGenetic_code_table & GetCodeTable(void)
static CGen_code_table_imp & x_GetImplementation(void)
static void x_InitImplementation(void)
static const string & GetSncbieaa(int id)
const string & GetNcbieaa(void) const
const string & GetSncbieaa(void) const
CObjectIStream –.
Definition: objistr.hpp:93
CObject –.
Definition: ncbiobj.hpp:180
static void x_InitFsaTable(void)
CTrans_table(const CGenetic_code &)
void x_InitFsaTransl(const string *ncbieaa, const string *sncbieaa) const
static int sm_NextState[4097]
static int sm_RvCmpState[4097]
static int sm_BaseToIdx[256]
char m_AminoAcid[4097]
static Int8 gcd(Int8 x, Int8 y)
Definition: expr.cpp:293
static const char * str(char *buf, int n)
Definition: stats.c:84
static tds_mutex mtx
Definition: condition.c:43
void reset(element_type *p=0, EOwnership ownership=eTakeOwnership)
Reset will delete the old pointer (if owned), set content to the new value, and assume the ownership ...
Definition: ncbimisc.hpp:480
#define ITERATE(Type, Var, Cont)
ITERATE macro to sequence through container elements.
Definition: ncbimisc.hpp:815
element_type * get(void) const
Get pointer.
Definition: ncbimisc.hpp:469
#define NCBI_THROW(exception_class, err_code, message)
Generic macro to throw an exception, given the exception class, error code and message string.
Definition: ncbiexpt.hpp:704
ESerialDataFormat
Data file format.
Definition: serialdef.hpp:71
@ eSerial_AsnText
ASN.1 text.
Definition: serialdef.hpp:73
static CObjectIStream * Open(ESerialDataFormat format, CNcbiIstream &inStream, bool deleteInStream)
Create serial object reader and attach it to an input stream.
Definition: objistr.cpp:195
uint8_t Uint1
1-byte (8-bit) unsigned integer
Definition: ncbitype.h:99
#define END_NCBI_SCOPE
End previously defined NCBI scope.
Definition: ncbistl.hpp:103
#define BEGIN_NCBI_SCOPE
Define ncbi namespace.
Definition: ncbistl.hpp:100
static string IntToString(int value, TNumToStringFlags flags=0, int base=10)
Convert int to string.
Definition: ncbistr.hpp:5084
static const string & Get(void)
Get string.
Definition: ncbistr.hpp:75
list< CRef< CGenetic_code > > Tdata
list< CRef< C_E > > Tdata
const Tdata & Get(void) const
Get the member data.
const Tdata & Get(void) const
Get the member data.
@ e_Sncbieaa
start, indexed to IUPAC extended
@ e_Ncbieaa
indexed to IUPAC extended
unsigned int
A callback function used to compare two keys in a database.
Definition: types.hpp:1210
n font weight
int i
int tolower(Uchar c)
Definition: ncbictype.hpp:72
int toupper(Uchar c)
Definition: ncbictype.hpp:73
Multi-threading – mutexes; rw-locks; semaphore.
static Format format
Definition: njn_ioutil.cpp:53
double r(size_t dimension_, const Int4 *score_, const double *prob_, double theta_)
#define _ASSERT
Modified on Tue Apr 23 07:40:43 2024 by modify_doxy.py rev. 669887