夢の中の出来事かな?

何と鎌倉の知り合いから、その知り合いの方が虻田で前日つり上げたというヒラメが札幌まで届きました 虻田というのは地名であり、洞爺湖や羊蹄山、そして伊達と長万部(おしゃまんべ)に挟まれた噴火湾沿いを含む広大な地域なのですが、そこで釣り上げられたヒラメを何と三尾も持参して病院まで届けていらして下さったのです

しかも、その三尾というのは 1.5Kgから3Kgある大物であり一番美味しいころです きちんと血抜きしてあり、しめられており、氷も発泡スチロールの箱に魚とは直接接しないように入れられていたのです

残念ながら写真を撮るまでには頭が回りませんでした 昨日TAVIを全例終わり、順調であることを確認してから その魚をマンションに持ち込み、早速自らさばいたのです まあこれまでの訓練の成果もあり、これぐらいの大物をさばくのも 30分ぐらいで完了しました ただ全体の量がすごいのです 身をつまんで食べてみるととてもおいしく、これで材料と時間があれば昆布で〆たりもするのですが、それは無理です

そもそもマンションの台所では洗い場も狭く十分に包丁を扱えないのです それでもテクニックでカバーしてそれぞれを五枚におろし、出汁をとれば最高ですが、時間も鍋も無いので残念でしたがアラの部分は廃棄です 結果的に (5 – 1) x 3 = 12枚のさくができあがりました このうちの五枚のさくは奇麗に皮をひきました これは刺身用です そして残りの7枚のさくはそのままタッパーに入れて冷蔵庫に

それから若手に声をかけたのです 皆仕事が忙しいのですが、5名の若手が 8:00PM頃までには集まり、部屋で宴会しました 僕はといえば前夜の睡眠不足もあり途中で意識消失してしまいました とはいっても皆が去る時には起き上がり、タッパーに入れてあった7枚のさくを真空パックに分割し、皆に持ち帰ってもらいました 「これを皮ひいて刺し身でももちろん食べれるけど、それは難しいかもしれないので、フライパンで皮目から少し炒めてもおいしいから」と料理法を伝授しました

結果的に頂いたヒラメは皆でおいしく片付けさせて頂いたのです 何だか夢の中の出来事のようでした

今日もTAVIに浸かりきり

昨夜、神奈川SHD研究会で勉強してから帰宅したのですが、会が終了したのは 9:40PM頃でしたので、結局自宅に着いたのは 11:00PM頃となっていました

何故か寝付けず、また最近の暑さのためでしょう 部屋に蚊がいて、足を刺され痒くて眠れず、結局寝入ったのは 2:00AM頃でした そして目覚まし時計で 4:05AMに起床し、シャワーを浴びたりしてから羽田空港に向かったのです

羽田空港到着は 5:30AM頃、そして6:25AM羽田発千歳行きの ANAで千歳、そして札幌東徳洲会病院に移動しました 9:00AMからのTAVIカンファランスに続いて 第一例目のS3 TAVI 順調に終了 続いて ERの Proctoring TAVIを 二例しました Proctoringは自分自身にとってもとても勉強になります 自分が何気なく体で行っている手技を自分自身で客観的に解析し、理論付け、さらにはそれを伝授する方法なりを考え、そんな色々が新しい世界なのです

二例抜群にうまく行き、これは Proctoringの勲章です

時差ボケのはてに

日曜日夜遅くシカゴから鎌倉に帰宅 翌日月曜日は過酷な外来診療、そしてPCI、そして 16:00には出発し帝国ホテルに行きました

これはTAVIに関連する座談会を行うためで、多分 10月頃には刊行される見込みのものです 林田くん、白井くん、山中くんの三名をお呼びして僕が座長としてTAVIに関連する話題について楽しくまた有意義に語り合いました

そして、その夜は大船の「北斗七星」という韓国料理の店に入り、1.5時間ぐらい過ごしたのです この店は初めて入ったのですが 仕事を終えたと思しきサラリーマンが数組おられました

火曜日は朝からTAVI二例、そしてPCIをそれに続いて二例、それから外来診療さらに、それが終了してからPCI、ようやく終えた後は治験の打ち合わせ四件あり クタクタになって帰宅

そして今日水曜日も外来診療の後、危険なPCI でもうまくいって救命できたと思います そしてそれに引き続いて夕方から重症心不全を伴う緊急TAVIを行いました ものすごくうまく行きました そして今は 神奈川SHD研究会に参加するため登戸の正マリアンナ医科大学川崎市立多摩病院に向かっています

何だか慌ただしく時間が過ぎていき、記憶と実際がずれているのか正しいのか 時間の大きな波の中で翻弄されている気分です

シカゴ

まったくボケています シカゴには木曜日に羽田を出て、土曜日にシカゴを出発し、結局羽田に戻るのは日曜日の夜8:00PMでした

今回始めて TVTに参加しました TVTとは Transcatheter Valve Therapiesのことで、今回が 10回目です もともと Martin Leon先生がいち早く始められた学会であり、中身は全て Structured Heart Disease Interventionです

朝から晩まで Leon先生はずっと座長あるいは discussantあるいは演者としてずっと会場におられました すごいです

ライブは Vancouver St Paul Hospitalから、あるいは Minneapolisから、さらには Chicagoから行われ、内容は TAVI, MitraClipそして TMVR (Transcatheter Mitral Valve Replacement)さらには 三尖弁に対する治療など多岐に渡りました ライブの質は非常に高く勉強になりました

既に Rotterdamでは 90%以上の症例が意識化局所麻酔でTAVIを行っているということで、それには驚きました また会の運営は素晴らしく、2019年 7月に鎌倉が主管として JTVTを開催することになっていますが、その時に向けて参考になりました

シカゴには時々訪れることがあり今回は 2014/10月以来の訪問でした 非常に奇麗な大都会であり、道路が二層になっているのが特徴です ミシガン湖のほとりにあり高層ビルが立ち並んでいます

ミシガン湖上空よりシカゴに
トランプ・タワー

食事もとてもおいしかったのですが、今回は Catch35という seafood restautantに行きました

Catch 35
Catch 35の料理

またここの後に、ラーメン屋さんに行きましたが ここのラーメンは絶品でした これまでアメリカのラーメンは一風堂が安定していましたが、一風堂の天下もそろそろ終わりか と思わせるものがありました

拉麺さん
拉麺さんの辛味噌ラーメン

今から二泊三日でシカゴです

本日 10:50AM羽田発のANAシカゴ便でシカゴに飛びます 木曜日から TVTという TAVI関係の学会がシカゴで開催されているのです 今回この学会から初めて Facultyとして招聘され初めて参加します 何だかワクワクします

シカゴにはこれまで何回も訪れ、その全米でも一番美しい町並みと風の街として有名な雰囲気はとても好きです 私立のシカゴ大学はこれまでに大学あたり世界で一番ノーベル賞受賞者を輩出してきた名門大学として有名です

到着は木曜日の 9:00AM頃で、そのまま会場であるホテルに向かい、そうですねトイレの中でも着替えてそれから参加します

現地時刻 何と日本には土曜日の 20:00頃羽田着で戻るのです まだ戻りの便の upgradeができていません 最悪 economyで戻ることになるかも知れませんが それも仕方ありませんね。

わーあいっ 解決

これまで VisualStudio Codeのメニューが日本語であっのに、updateしてからメニューが英語になってしまいました 「どうしてだろう?」「どうやれば治るの?」とか小さな心臓で悩んでいたのです

でも本日解決策発見しました ここに書いてありました この通りしたところすぐに日本語メニューとなりました 目出度し めでたし

本日のTAVI

本日は二例のTAVI 自己拡張型で行いました 重症例でしたが非常に良好な結果でした

バルーン拡張型と自己拡張型を比べれば、多くの日本の先生方はバルーン拡張型に馴染みがあると思います それには理由があります その理由とは バルーン拡張型が日本で保険診療下で使うことが出来るようになったのは 2013年10月ですが、自己拡張型を使えるようになったのは確か 2014年の暮ぐらいからではないでしょうか

結果的に多くの医師にとって自己拡張型は馴染みが無い、それが最大の理由でしょう

僕自身はと言えば、治験段階から自己拡張型を用いていたので馴染みはあるのですが、問題は治験終了から保険診療下での使用まで数年間のブランクがあることです この間に全てそれまでに得た技術から遠のいてしまうのです それで結果的に僕自身自己拡張型に何となく抵抗感が出てきたのです でも最近はようやくその心理的バリアから脱出しつつあります

TAVIを終わってからPCIを一例自分でしました そしてその後夕方に外来診療です そしてその後院内の委員会に出席、僕は早めに帰宅しました 外は小雨が降っていましたが、自転車で戻りました

TAVIもCTOも、そしてプログラミングも僕の心にとっては同程度の心の障壁です その心の障壁を乗り越えればこれまでに鍛えてきた能力により結果は成功という型でついてくるのです

本日の Python勉強

どのようにオブジェクトを下位関数に渡すか悩みました まず JPEG Tagの定義ファイル defTag.pyです

# defTag.py

jpegTag = {
    'TAG': '0xFF',
    'DHT': '0xFFC4',
    'SOI': '0xFFD8',
    'EOI': '0xFFD9',
    'SOF': '0xFFC3',
    'SOS': '0xFFDA'

}

if __name__ == '__main__':
    print(jpegTag)
    print(jpegTag['TAG'], jpegTag['DHT'])

つぎに、これを読み込んで JPEG Tagの DHT, SOI, EOIアドレスを探すルーチンです searchJPEGTAGS.pyです

import sys
from bitstring import ConstBitStream
from defTag import jpegTag

def searchDHTs(file_obj):
    DHTs = list(file_obj.findall(jpegTag['DHT'], bytealigned=True))
    return DHTs

def searchSOIs(file_obj):
    SOIs = list(file_obj.findall(jpegTag['SOI'], bytealigned=True))
    return SOIs

def searchEOIs(file_obj):
    EOIs = list(file_obj.findall(jpegTag['EOI'], bytealigned=True))
    return EOIs

if __name__ == '__main__':
    xa = ConstBitStream(filename=sys.argv[1])
    print(searchDHTs(xa))
    print(searchSOIs(xa))
    print(searchEOIs(xa))

そして、ここに file objectを渡す上位ルーチンです ファイル名は test_searchJPEGTAGS.py です

from searchJPEGTAGS import searchDHTs, searchSOIs, searchEOIs
import sys
from bitstring import ConstBitStream

xa = ConstBitStream(filename='XA1.dcm')
print(searchDHTs(xa))
print(searchSOIs(xa))
print(searchEOIs(xa))

これを走らせると結果は 以下のようになります

[10352, 5398688, 6469600, 11807904, 17146912, 22482576, 27843824, 33224096, 38652544, 44104704, 49597104, 55103072, 60640800, 66181296, 71753056, 77315744, 82880880, 88431792, 93978432, 99509264, 105038752, 110572944, 116110208, 121646512, 127184304, 132726336, 138267056, 143811248]
[10336, 5398672, 6469584, 11807888, 17146896, 22482560, 27843808, 33224080, 38652528, 44104688, 49597088, 55103056, 60640784, 66181280, 71753040, 77315728, 82880864, 88431776, 93978416, 99509248, 105038736, 110572928, 116110192, 121646496, 127184288, 132726320, 138267040, 143811232]
[5398584, 6469504, 11807800, 17146808, 22482472, 27843728, 33224000, 38652440, 44104600, 49597008, 55102976, 60640696, 66181200, 71752952, 77315648, 82880776, 88431688, 93978328, 99509160, 105038656, 110572840, 116110104, 121646408, 127184208, 132726232, 138266952, 143811152, 149355088]

要するに XA1.dcmという DICOM XAファイルの中の JPEG Tagアドレスが検出されたのです もちろん XA fileのフレーム数分あります

Python関数引数に関する考察

どうしても訳が分からないことがありました 要するに Pythonでの関数の名前空間が分かっていなかったのです 特にリストを引数で渡す場合です ここには、「リストの場合関数内部でグローバル変数を変化させれば、関数から出てもその変化は引き継がれる」というように記載されています

ところがこのテストプログラムではそのようにならないのです

from bitstring import ConstBitStream
from defTag import jpegTag

DHTs = []
print("DHTs: {}".format(id(DHTs))) #A

def searchTags(DHTs):
    xa = ConstBitStream(filename='xa1.dcm') #B
    print("DHTs: {}".format(id(DHTs)))
    DHTs = list(xa.findall(jpegTag['DHT'], bytealigned=True))
    print("DHTs: {}".format(id(DHTs))) #C


if __name__ == '__main__':
    searchTags(DHTs)
    print("DHTs = {0}".format(DHTs))

この場合、出力はA, B, Cの値(アドレス)が出力され、最後に゜カラリスト[]が出力されます そして興味深いことには A == Bであるにもかかわらず B != Cなのです つまり関数内で新たに変数が作成された訳です これは意図する動作ではありません そこで調べるとここに詳細に記載がありました これによれば、関数内で変数に変更を行えば、関数内の変数とグローバル空間の変数は同じアドレスを参照するようです そこで以下のテストを書きました

from bitstring import ConstBitStream
from defTag import jpegTag

DHTs = []
print("#A: {}".format(id(DHTs))) #A

def searchTags(DHTs):
    xa = ConstBitStream(filename='xa1.dcm')
    print("#B: {}".format(id(DHTs))) #B
    DHTs.extend(list(xa.findall(jpegTag['DHT'], bytealigned=True)))
    print("#C: {}".format(id(DHTs))) #C


if __name__ == '__main__':
    searchTags(DHTs)
    print("DHTs = {0}".format(DHTs))

これで走らせてみると当方での出力は以下の通りでした

#A: 4441990408
#B: 4441990408
#C: 4441990408
DHTs = [10352, 5398688, 6469600, 11807904, 17146912, 22482576, 27843824, 33224096, 38652544, 44104704, 49597104, 55103072, 60640800, 66181296, 71753056, 77315744, 82880880, 88431792, 93978432, 99509264, 105038752, 110572944, 116110208, 121646512, 127184304, 132726336, 138267056, 143811248]

これで意図した通りとなりました 要するに関数内で値を受け渡したいリストに変更を加えることにより関数内変数とグローバル変数が同じアドレスを参照したことにより参照渡しが実現された訳です

やったあ

Pythonで DICOM XAに挑む編です

XA fileは動画シネ(シネには限らず USなんかもですが・・・)をコマ(= Frame)毎にパラパラ漫画のように連続して記録してあります

そして、それぞれの Frameは Huffman Code圧縮されていて、その圧縮のキーはそれぞれの Frame毎に設定されています これは圧縮効率を最大にするためなのです

そこで、これを解読するためには、Frame毎に設定されている Huffman定義テーブル = Define Huffman Table (DHT)を検出し、フレーム毎に分離する必要があります

このため、まず行っていることはフレーム毎に分離するため、DHTを検出することです これをやってみました

from defTag import jpegTag
from bitstring import ConstBitStream
from defTag import jpegTag
DHT_address = []

xa = ConstBitStream(filename='xa1.dcm')
print(list(xa.findall(jpegTag['DHT'], bytealigned=True)))

これで以下のようなリストが出力されました

10352, 5398688, 6469600, 11807904, 17146912, 22482576, 27843824, 33224096, 38652544, 44104704, 49597104, 55103072, 60640800, 66181296, 71753056, 77315744, 82880880, 88431792, 93978432, 99509264, 105038752, 110572944, 116110208, 121646512, 127184304, 132726336, 138267056, 143811248]

これは xa1.dcmという DICOM XA fileの中の DHTの位置を表していることになります これを用いて Frame毎にファイルを切り分けて暗号解読すれば良いということになりますね

ちなみに、defTag.pyは以下のように定義しました

jpegTag = {
    'TAG': '0xFF',
    'DHT': '0xFFC4',
    'SOI': '0xFFD8',
    'EOI': '0xFFD9',
    'SOF': '0xFFC3',
    'SOS': '0xFFDA'

}

if __name__ == '__main__':
    print(jpegTag)
    print(jpegTag['TAG'], jpegTag['DHT'])