2009年12月3日木曜日

マイケルを知らなかった頃

「マイケル」というといまどきは「ジャクソン」と来るんでしょうが、私は「ブレッカー」です。

大学のジャズ研に入ったとき、実はマイケルのことは知りませんでした。といいながら無意識に一度ライブで聴いているはずなのですが全く記憶にも眼中にもありませんでした。横浜球場で昔やってた「Aurexジャズフェスティバル」で見て聴いているはずです。

そのときは私もまだ若く、そのとき流行の「フュージョン」を軽蔑していて、「やっぱジャズはモダンだよな」とわかったようなことを言いつつ、マイケルがせっかくすばらしい演奏をした「ストラップハンギン」も記憶にありません。

そのときは死にかけで車椅子のベニー・グッドマンを聞いて、「スウィングもいいね」などとほざいていたわけで。

あの時、マイケルをちゃんと知っていたら、「Smok'n the Pit」を生で見れたかもしれないし、深町純とのコラボも見れたかもしれないと、いまさらですが後悔しきり。

あの頃の私のアイドルはコルトレーンでした。

私が初めて買ったジャズLPがコルトレーンの「ジャイアント・ステップス」とビル・エヴァンスの「ストレート・ノー・チェイサー(Flのジェレミー・ステイグと共演)です。ジャイアント・ステップスが最初のジャズとの出会いなんてできすぎていると思いますが、ホンマです。

・・・続く

OpenBabel : AtomのIndexリストからOBMolオブジェクトを再構築する

OpenBabelでSMARTSを使ったSmilesの部分構造検索をすると、結果がMapListと呼ばれる原子のIndexのリストで帰ってきます。OpenBabelではこのIndexを使うことを推奨していません。なぜならこのIndexは分子をModify(一部構造を切り取る、原子・分子を付加するなど)するとIndexが再作成されてしまうので、永続的に保持されないからです。


といってもこの原子Indexは元の分子をいじらない限りは変更されないので、元の分子の一部分を記憶させるには使いやすいです。検索結果や部分構造を別途Indexとして持っていればいろいろ使えます。ようは元の構造を一切いじらなければOKです。


しかも、これはやってみたのですが、DeleteBondするだけではIndexは変更されずちゃんと保持されます。つまり切断Bondとしての情報をもったままの分子として原子Indexがそのまま保持されます。Separateメソッドで元の分子をばらばらにしてしまうと、各部分構造分子の原子Indexは再作成されて、1から順番に振られます。


で、元の分子をいじらずに、取得した原子Indexから部分構造を再構築したいことはよくあります。なんでお気軽関数を作りました。コードはC#です。


新しいOBMolインスタンスに元の分子から原子をAddしていくのですが、Addしてしまうと新しい分子上のAddした原子のIndexはやはり1から順番に振られてしますので、別途新しいIndexと元のIndexの対応表をHashtableで管理しています。この情報を使ってあとでOBBondをAddしていきます。







using System.Collections.Generic;
using System.Collections;


using OpenBabel;

namespace OpenHabel
{
    static class OHUtil
    {
        /// <summary>
        /// ParentのMolと原子のIndexからMolを再構築
        /// </summary>
        /// <param name="parentMol"></param>
        /// <param name="atomIndex"></param>
        /// <returns></returns>
        public static OBMol GetMol(OBMol parentMol, List<uint> atomIndex)
        {
            Hashtable atomIdxTable = new Hashtable();
            OBMol newMol = new OBMol();
            IEnumerable<OBAtom> atoms = parentMol.Atoms();

            int atomCount = 0;
            foreach (OBAtom oneAtom in atoms)
            {
                if (OHUtil.IsThereItemInList(atomIndex, oneAtom.GetIdx()))
                {
                    OBAtom newAtom = new OBAtom();
                    newAtom.Duplicate(oneAtom);
                    int idx = int.Parse(oneAtom.GetIdx().ToString());
                    atomCount += 1;
                    atomIdxTable[idx.ToString()] = atomCount;

                    newMol.AddAtom(newAtom);

                    //Console.Write(obconv.WriteString(newMol));
                }
            }
            IEnumerable<OBBond> bonds = parentMol.Bonds();
            foreach (OBBond oneBond in bonds)
            {
                if (
                 OHUtil.IsThereItemInList(atomIndex, oneBond.GetBeginAtomIdx()) &&
                 OHUtil.IsThereItemInList(atomIndex, oneBond.GetEndAtomIdx())
                )
                {
                    int startAtomKey = (int)oneBond.GetBeginAtomIdx();
                    int startAtomIdx = (int)atomIdxTable[startAtomKey.ToString()];

                    int endAtomKey = (int)oneBond.GetEndAtomIdx();
                    int endAtomIdx = (int)atomIdxTable[endAtomKey.ToString()];

                    int order = (int)oneBond.GetBondOrder();

                    newMol.AddBond(startAtomIdx, endAtomIdx, order);
                }
            }
            return newMol;
        }

        /// <summary>
        /// atomList中に特定のatomIndexが含まれるかどうか
        /// </summary>
        /// <param name="atomList">List:uint</param>
        /// <param name="atomIndex">uint</param>
        /// <returns>見つかったらTrue</returns>
        public static bool IsThereItemInList(List<uint> atomList, uint atomIndex)
        {
            foreach (uint item in atomList)
            {
                if (item == atomIndex) { return true; }
            }
            return false;
        }
    }
}

2009年12月2日水曜日

野呂一生

BSフジで野呂さんのライブをやってたのを録画して今日見ました。

相変わらず、といえばそれまでですが、ヘタといえばヘタ、変わっていないといえば数十年前から全く変わっていない。

変わらずにいれるというのはすごいことだな。

OpenBabel : Frameworkerを作ろう

Frameworkを作るためには化合物の「Ring」と「Linker」を明確に分ける必要があります。
でも私の環境でこの「Linker」を認識するのはISIS Baseしかなく、他のシステムへの実装がちょっと難しい。

で、OpenBabel+VisualStudio2008(C#)でこの「FrameWorker」を作っています。

考え方としてはこんな感じ。


  1. 化合物をSmilesで表記する
  2. Smartsを「aA」とする
  3. 化合物をこのSmartsにかけると、Aromatic any atom - Aliphatic any atomで切れる。つまり芳香環とLinkerまたは側鎖の間が切れる
  4. 構造を完全に切ってしまうのではなく、「切れ目」の状態で化合物を保持しておく
  5. 切れ目を参考にして、化合物を「Fragment」に分ける
  6. 切れ目を参考にして、FragmentとFragmentを連続的につないでいく。このとき、Fragmentと隣り合うFragmentを管理しておくと、一つのFragmentから連続的につながった部分構造が取れる
  7. Aromatic Ringをスタートとして奇数セット(3Fragment、5Fragment・・・)とつないでいけばAromatic ~Aliphatic ~Aromatic の順で部分構造が取れる。すなわちこれがひとつの「Framework」になる
  8. 重原子の種類を無視する場合は、処理後にすべての原子をa,Aなどに置き換えれば、あとですぐSmartsに変更できる
この考え方でOpenBabelを使ったFrameworkerを作りつつあります。今のところ6.の途中までできました。明日は7.まで行って動作確認します。

でも、ちょっと問題が・・・。化合物の構造を舐めまくるのでforeachの嵐になってます。実運用したときに処理時間が結構長くなりそうで怖い。

2009年12月1日火曜日

最近はまっている仕事

OpenBabel
PerlMol


いずれもオープンソースツールで、化合物の構造をハンドリングする環境。
お金がないわけではなくて、ただでいろいろ試せるところがすごいね。




京都の秋


京都は紅葉のさかりで、各地で人だらけ。
京都に住んでいてもなかなか行けません(-.-;)

SoftBank 820T


子供に使わしている携帯:SoftBank 820T

メニュー「設定→制限機能→発信先設定」で、「電話発信」、「メール送信」が”制限なし”以外にしてあると、アドレス帳の編集ができない。


なんでやねん。めんどくさ。