#include #include #include #include #include #include // OpenBabel #include #include #include using namespace std; using namespace OpenBabel; // 1文字を3文字に変換するための変数設定 map aa3; void init(void) { aa3['A'] = "ALA"; aa3['R'] = "ARG"; aa3['N'] = "ASN"; aa3['D'] = "ASP"; aa3['C'] = "CYS"; aa3['E'] = "GLU"; aa3['Q'] = "GLN"; aa3['G'] = "GLY"; aa3['H'] = "HIS"; aa3['I'] = "ILE"; aa3['L'] = "LEU"; aa3['K'] = "LYS"; aa3['M'] = "MET"; aa3['F'] = "PHE"; aa3['P'] = "PRO"; aa3['S'] = "SER"; aa3['T'] = "THR"; aa3['W'] = "TRP"; aa3['Y'] = "TYR"; aa3['V'] = "VAL"; aa3['-'] = "GAP"; aa3['X'] = "ANY"; } class SEQ { string name; string seq; vector > seq3l; int pos; public: SEQ() : pos(0) {} // コンストラクタ SEQ(const SEQ& Obj) { // コピーコンストラクタ name = Obj.name; seq = Obj.seq; seq3l = Obj.seq3l; pos = Obj.pos; } ~SEQ() {} // デストラクタ bool ReadFASTA(istream* ist) { bool _f = false; string line; pos = 0; name.clear(); while (getline(*ist, line)) { if (line[0] == '>') { name = line.substr(1); _f = true; break; } } if (!_f) { return false; } seq.clear(); streampos spos; while (getline(*ist, line)) { if (line[0] == '>') { break; } seq = seq + line; spos = ist->tellg(); } ist->seekg(spos); this->ToTLC(); return (true); } void ToTLC(void) { seq3l.clear(); for (int i = 0; i < seq.size(); i++) { seq3l.push_back(pair(aa3[seq[i]], i + 1)); } } string GetName(void) { return name; } void SetName(string s) { name = s; } int length(void) { return seq.size(); } void Reset(void) { pos = 0; } char GetChar(int p) { if (p > seq.size()) return '\0'; return seq[p - 1]; } string GetTLC(int p) { if (p > seq.size()) return "END"; return seq3l[p - 1].first; } pair Next(void) { if (pos >= seq.size()) return pair("END", pos); return seq3l[pos++]; } void print_seq(ostream* ost) { string x; *ost << ">" << name << endl; int i = 0; for (; i < seq.size() / 60; i++) { x = seq.substr(i * 60, 60); *ost << x << endl; } x = seq.substr(i * 60); *ost << x << endl; } }; int main(int argc, char* argv[]) { // 初期化 init(); SEQ s; ifstream ifasta("aligned.fasta"); s.ReadFASTA(&ifasta); ifasta.close(); ifstream ifs("1lke.mol2"); ofstream ofs("rev_1lke.pdb"); // フォーマット設定 OBConversion conv; conv.SetInAndOutFormats("MOL2", "PDB"); // 分子の読み込み OBMol mol; if (!conv.Read(&mol, &ifs)) { cout << "error!" << endl; exit(1); } pair tlc; s.Reset(); for (OBResidueIterator rr = mol.BeginResidues(); rr != mol.EndResidues(); rr++) { do { tlc = s.Next(); } while (tlc.first == "GAP"); if (tlc.first == "END") break; string r = (*rr)->GetName(); r=r.substr(0,3); // 最初の3文字を切り出す // アミノ酸が一致した場合に番号変更 if (r == tlc.first) { cout << (*rr)->GetName() << "\t" << (*rr)->GetNum(); cout << " -> " << tlc.second << endl; (*rr)->SetNum(tlc.second); // 番号変更 } } conv.Write(&mol, &ofs); ofs.close(); return 0; }