{"nbformat":4,"nbformat_minor":0,"metadata":{"colab":{"provenance":[]},"kernelspec":{"name":"python3","display_name":"Python 3"},"language_info":{"name":"python"}},"cells":[{"cell_type":"markdown","source":["# HyperSpy入門 RDEデータ登録デモンストレーション\n","HyperSpyに関する講義の最後に、dm3ファイルをRDEにアップロードしてデータ登録を行うデモンストレーションをご覧いただきます。"],"metadata":{"id":"Q4WWq0mcpTB4"}},{"cell_type":"markdown","source":["# ARIM事業におけるRDEとPythonの関係\n","\n","\"ARIM事業におけるRDEとPythonの関係\"\n","\n","ARIM事業の中で活用しているRDE(Research Data Express)は、材料研究のために研究現場で日々創出される材料データを効率的に収集するために、次の機能を備えたデータ収集・管理・提供システムのことです。\n","\n","* IoT データ転送機能\n","* データ構造化機能\n","* データ登録機能\n","\n","データ構造化機能は、Pythonで開発が進められています。"],"metadata":{"id":"lvypkSq6kSdC"}},{"cell_type":"markdown","source":["# 使用するデータ構造化プログラム\n","今回のデモンストレーションのため、講義でご紹介した「dm3ファイルの読み込み例」を改良した構造化プログラムを、RDE上にセットアップしてあります。"],"metadata":{"id":"ebGYg7yX4vGm"}},{"cell_type":"markdown","source":["## 講義内容のおさらい\n","「dm3ファイルの読み込み例」の内容をおさらいしておきましょう。"],"metadata":{"id":"CNrQE-5cVcud"}},{"cell_type":"markdown","source":["## 事前準備"],"metadata":{"id":"f28n3u6AVZ8x"}},{"cell_type":"code","source":["# dm3ファイルのダウンロード\n","!curl -L -o Fei_HAADF-DE_location.dm3 https://github.com/tendo-sms/python_intermediate_2023/raw/main/file_2/Fei_HAADF-DE_location.dm3\n","\n","# HyperSpyパッケージのインストール\n","!pip install HyperSpy"],"metadata":{"id":"Dc5BfJwfBID5"},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":["## プログラム\n","### メタデータの内容を表示する"],"metadata":{"id":"PEZb9RflEPjy"}},{"cell_type":"code","source":["import hyperspy.api as hs\n","\n","# dm3ファイルの読み込みとメタデータの表示\n","s = hs.load(\"Fei_HAADF-DE_location.dm3\")\n","s.metadata"],"metadata":{"id":"HeNYKQMGC-DS"},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":["### グラフを描画する"],"metadata":{"id":"qbGOoRsoaYem"}},{"cell_type":"code","source":["import hyperspy.api as hs\n","\n","# dm3ファイルの読み込みとグラフの描画\n","s = hs.load(\"Fei_HAADF-DE_location.dm3\")\n","s.plot()"],"metadata":{"id":"wkDabhUY-Nvu"},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":["## RDE上にセットアップしたプログラムについて\n","上記のプログラムをベースに、構造化プログラムをRDE上にセットアップしてあります。\n","\n","このプログラムは、次の構造化を行います。\n","\n","* metadataの内容をRDEのメタデータとして登録する\n","* グラフをPNG画像としてRDEに登録する\n","\n","講義でご紹介した「dm3ファイルの読み込み例」はごく簡単なプログラムですが、RDE上で動かすために、様々な改修をしています。\n","\n","データ登録のデモンストレーションがメインであるため、ここでは構造化のポイントとなる部分を抜粋してご紹介します。"],"metadata":{"id":"mTnoTrUn-U5u"}},{"cell_type":"markdown","source":["## metadataの内容をRDEのメタデータとして登録する\n","HyperSpyのデータから、metadataに格納されたメタデータの値を取得するには、**get_itemメソッド**を使用します。\n","\n","get_itemメソッドの引数には、メタデータの項目名を文字列で指定します。\n","\n","~~~\n","オブジェクト.get_item(項目名)\n","~~~\n","\n","metadataの内容は階層構造になっているため、項目名は、要素をピリオドで連結することで階層を表現します。(ただし、要素名が数字Nの場合は「Number_N」と指定します。)\n","\n","試しに、metadataに格納されたメタデータの値をいくつか取得してみます。取得した結果は、項目名と値をペアにした辞書に格納します。"],"metadata":{"id":"e4WJgvtpWUle"}},{"cell_type":"code","source":["import hyperspy.api as hs\n","\n","s = hs.load(\"Fei_HAADF-DE_location.dm3\")\n","\n","# メタデータ項目名のリスト\n","METTAKEY_LIST = [\n"," \"Acquisition_instrument.TEM.Stage.tilt_alpha\",\n"," \"General.FileIO.Number_0.hyperspy_version\" # 要素\"0\"を「Number_0」とする点に注意\n"," ]\n","\n","# メタデータ項目の値の取得 結果は辞書に格納する\n","data = {}\n","for metakey in METTAKEY_LIST:\n"," data[metakey] = s.metadata.get_item(metakey)\n","\n","print(data)\n","\n","# RDEに登録するときはJSONファイル(metadata.json)にしてmetaディレクトリに配置する必要がある"],"metadata":{"id":"E7-Gbx5J-RNC"},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":["\n","\n","今回、この階層の要素をピリオドで連結した項目名を、そのままRDEに登録するメタデータの項目名とします。一覧を次に示します。\n","\n","* Acquisition_instrument.TEM.Stage.tilt_alpha\n","* Acquisition_instrument.TEM.Stage.tilt_beta\n","* Acquisition_instrument.TEM.Stage.x\n","* Acquisition_instrument.TEM.Stage.y\n","* Acquisition_instrument.TEM.Stage.z\n","* Acquisition_instrument.TEM.acquisition_mode\n","* Acquisition_instrument.TEM.beam_current\n","* Acquisition_instrument.TEM.beam_energy\n","* Acquisition_instrument.TEM.camera_length\n","* Acquisition_instrument.TEM.dwell_time\n","* Acquisition_instrument.TEM.magnification\n","* General.FileIO.Number_0.hyperspy_version\n","* General.FileIO.Number_0.io_plugin\n","* General.FileIO.Number_0.operation\n","* General.FileIO.Number_0.timestamp\n","* General.date\n","* General.original_filename\n","* General.time\n","* General.title\n","* Signal.Noise_properties.Variance_linear_model.gain_factor\n","* Signal.Noise_properties.Variance_linear_model.gain_offset\n","* Signal.quantity\n","* Signal.signal_type\n","\n","辞書が完成したら、最終的に**metadata.json**という名称のJSONファイルを、metaという名前のディレクトリに格納します。\n","\n","このmetadata.jsonと、あらかじめデータセットごとにメタデータ項目のデータ型や表示名などを定義した**metadata-def.json**を使って、RDEにメタデータを登録することができます。\n","\n","今回はこれらのJSONファイルの詳細はご説明しませんが、ご参考までに本資料の末尾に掲載します。"],"metadata":{"id":"QAhvW02IXil-"}},{"cell_type":"markdown","source":["## グラフをPNG画像としてRDEに登録する\n","plot()メソッドでグラフの描画を行えますが、これを画像として保存するときは、Matplotlibのsavefig関数を使用します。\n"],"metadata":{"id":"OZi001PW_T6I"}},{"cell_type":"code","source":["import hyperspy.api as hs\n","\n","# 画像保存のためにMatplotlibを利用\n","import matplotlib.pyplot as plt\n","\n","s = hs.load(\"Fei_HAADF-DE_location.dm3\")\n","s.plot()\n","\n","# プロット結果をPNG画像で保存\n","# RDEに登録するときはmain_imageディレクトリに配置する必要がある\n","plt.savefig(\"graph.png\")"],"metadata":{"id":"chWyJAdTDBk4"},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":["作成した画像ファイルをmain_imageというディレクトリに格納することで、RDEに登録してサムネイル表示することができます。\n","\n","(上記のプログラムはサンプルであるため、カレントディレクトリの直下に保存しています。)\n","\n","【ご参考】\n","\n","昨年度のワークショップや、初級者向けセミナーでご紹介しているとおり、Matplotlibには「Axesインタフェース」と「pyplotインタフェース」という2種類のインタフェースがあり、今回は「pyplotインタフェース」を使用しています。\n","\n","可能であれば「Axesインタフェース」の方が望ましいのですが、確認した限り、HyperSpyと組み合わせる場合は「pyplotインタフェース」を使うしか手段がないようです。"],"metadata":{"id":"Z0NwsYdXiE-3"}},{"cell_type":"markdown","source":["# データ登録のデモンストレーション\n","それでは、実際にRDEに「Fei_HAADF-DE_location.dm3」をアップロードしてみます。\n","\n","講師の画面をご覧ください。"],"metadata":{"id":"Sd7KhXjVZ5a6"}},{"cell_type":"markdown","source":["# [ご参考] メタデータJSONファイル\n","前述したmetadata-jsonおよびmetadata-def.jsonを、ご参考までに掲載します。\n","\n","### metadata.json\n","https://github.com/tendo-sms/python_intermediate_2023/raw/main/file_4/metadata.json\n","\n","### metadata-def.json\n","https://github.com/tendo-sms/python_intermediate_2023/raw/main/file_4/metadata-def.json"],"metadata":{"id":"JTqf1hiff4m6"}}]}