00001 #ifndef MONOMER_HEADER
00002 #define MONOMER_HEADER
00003
00004
00005
00011
00012
00013
00014
00015 #include <string.h>
00016
00017 #ifdef _STANDARD_C_PLUS_PLUS
00018 #include <vector>
00019 using namespace std;
00020 #else
00021 #include <vector.h>
00022 #endif
00023
00024
00025
00026 namespace RazorBack {
00027
00033 class Monomer_
00034 {
00035
00036
00037 public:
00038
00043 class Abbrev_
00044 {
00045 friend class Monomer_;
00046
00047 private:
00048
00049 char Code1;
00050 char Code3[4];
00051
00052
00053 public:
00054
00059 explicit Abbrev_(char C='X', const char* Ccc="Xxx")
00060 {
00061 set_codes(C, Ccc);
00062 }
00063
00065 char code_1() const { return Code1; }
00066 const char* code_3() const { return Code3; }
00067
00068
00069 protected:
00070
00075 void set_codes(char C, const char* Ccc)
00076 {
00077 Code1=C;
00078 memset(Code3, 0, 4);
00079 strncpy(Code3, Ccc, 3);
00080 }
00081 };
00082
00083
00084
00085 public:
00086
00100 enum Type_ { UNKNOWN=0, USER=1, PROT=2, DNA=4, RNA=8, NUCL=12 };
00101
00102 private:
00103
00104 vector<Abbrev_> Alphabet;
00105 Type_ Mtype;
00106
00107
00108 public:
00109
00111 typedef vector<Abbrev_>::const_iterator Aciter_;
00112
00113
00114
00119 explicit Monomer_(int Mt=PROT)
00120 {
00121 if (Mt==UNKNOWN || Mt==USER)
00122 Mt=PROT;
00123 set_alphabet(Mt);
00124 }
00125
00130 explicit Monomer_(const char* Codes)
00131 {
00132 set_alphabet(Codes);
00133 }
00134
00136
00142 void set_alphabet(int Mt);
00143
00153 void set_alphabet(const char* Codes);
00154
00156 const vector<Abbrev_>& alphabet() const { return Alphabet; }
00157
00159 Type_ type() const { return Mtype; }
00160
00167 bool operator==(const Monomer_& M) const;
00168 bool operator!=(const Monomer_& M) const { return !(*this==M); }
00169
00175 bool contains(const Monomer_& M, bool Nocase) const;
00176
00185 Aciter_ find(char C, bool Nocase=false) const;
00186 Aciter_ find(const char* Ccc, bool Nocase=false) const;
00187
00193 bool is_legal(char C, bool Nocase=false) const
00194 {
00195 return (Alphabet.end()!=find(C, Nocase));
00196 }
00197 bool is_legal(const char* Ccc, bool Nocase=false) const
00198 {
00199 return (Alphabet.end()!=find(Ccc, Nocase));
00200 }
00201
00208 const char* one_2_three(char C, bool Nocase=false) const
00209 {
00210 Aciter_ Ai=find(C, Nocase);
00211 return (Ai!=Alphabet.end())? Ai->code_3(): NULL;
00212 }
00213
00219 char three_2_one(const char* Ccc, bool Nocase=false) const
00220 {
00221 Aciter_ Ai=find(Ccc, Nocase);
00222 return (Ai!=Alphabet.end())? Ai->code_1(): '\0';
00223 }
00224
00225 };
00226
00227
00228 }
00229
00230
00231
00232 #endif // MONOMER_HEADER