XRD_GUI プログラム仕様
XRD_GUI: X線回折データ可視化および解析アプリケーション
- 概要:
本アプリケーションは、X線回折 (XRD) データを読み込み、可視化、解析するためのグラフィカルユーザーインターフェースを提供します。 複数のXRDデータセットとリファレンスパターンを同時に表示し、オフセット、スケーリング、ピーク検出、GIXRD解析支援などの機能を提供します。
- 詳細説明:
本ソフトウェアは、PythonのPyQt6、Matplotlib、NumPy、SciPyなどのライブラリを組み合わせて開発されており、 研究者や学生がXRDデータを効率的に扱うことを目的としています。 セッションの保存・読み込み、グラフのエクスポート、ピークラベル付け、リファレンスフィルタリングなど、 多様なカスタマイズオプションを通じて、柔軟なデータ解析環境を提供します。
- 関連リンク:
XRD_GUI.py 技術ドキュメント プロジェクトリポジトリ: https://github.com/your_repo_link (デモ用の仮リンク)
- class XRD.XRD_GUI.XRD_GUI.GenericGraphApp
ベースクラス:
QMainWindowXRDデータの表示、解析、管理を行うメインアプリケーションクラスです。
- 概要:
PyQt6をベースとしたGUIを提供し、Matplotlibを使用してXRDデータをグラフ表示します。 データセットとリファレンスパターンの読み込み、視覚的なカスタマイズ、 ピーク解析支援、セッション管理などの機能を含みます。
- 詳細説明:
このクラスは、複数のXRDデータセットとリファレンスパターンを同時に管理し、 それらを上下二段または一段のグラフに柔軟に表示します。 ユーザーは、X線源の波長設定、Kα2除去、スムージング、Y軸スケール(線形、対数、平方根)、 オフセット、凡例、軸ラベル、フォント、グラフサイズなどの表示設定を詳細に調整できます。 また、リファレンスデータのフィルタリング機能や、ピークの自動検出および手動ラベル付け機能も提供します。 現在の作業状態をセッションファイルとして保存・読み込みすることも可能です。
- DEFAULT_X_RANGE = (0, 100)
- add_dataset(name: str, x_data: ndarray, y_data: ndarray, color: QColor = None) dict
新しいデータセットをアプリケーションに追加し、データリストウィジェットに表示します。
- 概要:
XRDデータと名前、オプションの色を受け取り、内部の`self.datasets`リストに新しいデータセットとして追加します。 新しいデータセットには自動でY軸オフセットが適用されます。
- 詳細説明:
まず _generate_unique_name を呼び出して、指定された name が既存のデータセットや リファレンスと重複しないようにユニークな名前を生成します。 color が指定されていない場合は、get_next_color を使用して次の色を割り当てます。 現在のY軸スケール(線形、対数)に基づいて、新しいデータセットに自動でY軸オフセット値を計算し、設定します。 線形スケールの場合は、既存のデータセットのY範囲を考慮したステップでオフセットを適用し、 対数スケールの場合は、10のべき乗として乗算されるオフセット指数を計算します。 作成されたデータセット辞書は self.datasets に追加され、 対応する QListWidgetItem が data_panel.list_widget_data に追加されます。
- add_manual_marker()
手動でマーカーを追加するためのダイアログを開きます。
- 概要:
ユーザーがX軸の位置を入力して、指定したデータセットに新しいマーカーを追加します。
- 詳細説明:
マーカーを追加するデータセットが1つだけ選択されていることを確認します。 QInputDialog.getDouble を使用して、ユーザーにX軸の座標を入力するよう促します。 有効なX軸値が入力された場合、新しいマーカー辞書を作成し、 選択されたデータセットの`markers`リストに追加します。 追加後、_update_marker_panel_ui を呼び出してマーカーパネルを更新し、 update_plot() でグラフを再描画します。
- 戻り値:
なし
- apply_colorscale_to_selected_items(list_widget: QListWidget, data_list: list[dict], item_type_name: str)
選択されたアイテムにカラースケールを適用する汎用メソッドです。
- 概要:
データリストまたはリファレンスリストで選択されている複数のアイテムに対して、 指定されたカラーマップと範囲に基づいてグラデーションカラーを割り当てます。
- 詳細説明:
_get_selected_items を使用して現在選択されているアイテムのリストを取得します。 data_panel.combo_colormap から選択されたカラーマップ名と、 data_panel.spinbox_cmap_min、data_panel.spinbox_cmap_max から範囲値を取得します。 範囲値が不正な場合、警告メッセージを表示します。 選択されたアイテムの数に基づいて各アイテムに正規化された位置を計算し、 それをカラーマップの範囲にマッピングして色を割り当てます。 割り当てられた色は、アイテムのデータ辞書の`"color"キーに`QColor`オブジェクトとして保存されます。 色変更をUIに反映するため、`_update_all_list_items_visuals() を呼び出して リストアイテムの見た目を更新し、update_plot() を呼び出してグラフを再描画します。
- apply_custom_size_cm()
スピンボックスで指定されたセンチメートル単位のサイズをグラフに適用します。
- 概要:
ユーザーが入力した幅と高さ(cm)に基づいて、Matplotlib Figureのサイズをインチ単位で設定します。
- 詳細説明:
spin_width_cm と spin_height_cm の値を取得し、 それをインチに変換(1インチ = 2.54 cm)して、self.canvas.fig.set_size_inches() でFigureに適用します。 適用後、縦横比コンボボックスを「カスタム」に設定し、update_plot() を呼び出してグラフを再描画します。 無効な入力があった場合はエラーメッセージを表示します。
- 戻り値:
なし
- apply_data_y_label()
QLineEditのテキストをデータY軸ラベルに適用し、グラフを更新します。
- 概要:
ユーザーが設定パネルで入力したテキストをデータプロットのY軸ラベルとして設定します。
- 詳細説明:
settings_panel.edit_data_y_label から新しいラベルテキストを取得します。 現在の self.data_y_label_text と異なる場合のみ、self.data_y_label_text を更新し、 update_plot() を呼び出してグラフを再描画します。 これにより、変更が即座にグラフに反映されます。
- 戻り値:
なし
- apply_font_to_graph(font: QFont, update_plot: bool = True)
グラフのフォント(ファミリー、サイズ)をMatplotlibに設定し、必要に応じて再描画します。
- 概要:
指定されたQFontオブジェクトに基づいて、MatplotlibのrcParamsを更新し、グラフの表示フォントを変更します。
- 詳細説明:
ユーザーが選択したフォントファミリーを最優先しつつ、Windows、macOS、Linuxといった 各プラットフォームで一般的な日本語フォントの候補リストを定義し、 Matplotlibが適切なフォントを自動選択できるように`font.family`を設定します。 また、フォントサイズも設定し、self.base_font_size を更新します。 update_plot がTrueの場合、変更を画面に反映するために update_plot() を呼び出します。
- パラメータ:
font (QFont) -- 適用するQFontオブジェクト。
update_plot (bool, optional) -- グラフを再描画するかどうか。デフォルトはTrue。
- apply_item_linewidth(list_widget: QListWidget, data_list: list[dict], spinbox: QDoubleSpinBox)
スピンボックスの値を選択されているアイテムの線幅に適用する汎用メソッドです。
- 概要:
データリストまたはリファレンスリストで選択されている1つまたは複数のアイテムの グラフ表示線幅を調整します。
- 詳細説明:
_get_selected_items を使用して現在選択されているアイテムのリストを取得します。 spinbox から新しい線幅値を取得し、選択されたすべてのアイテムの`"linewidth"キーを更新します。 線幅が実際に変更された場合のみ、`update_plot() を呼び出してグラフを再描画します。
- apply_manual_offset_from_spinbox(list_widget: QListWidget, data_list: list[dict], spinbox: QDoubleSpinBox)
スピンボックスで指定された値を、選択されているデータアイテムのY軸オフセットに適用します。
- 概要:
データリストウィジェットで選択されたデータセットのY軸オフセットを手動で調整します。
- 詳細説明:
_get_selected_items を使用して現在選択されているデータセットを取得します。 spinbox から新しいオフセット値を取得し、現在のY軸スケールに応じて y_offset_log_exponent または y_offset_linear のどちらかのキーにその値を設定します。 この操作は、選択されているすべてのデータセットに適用されます。 設定後、update_plot() を呼び出してグラフを再描画します。
- apply_manual_ref_y_zoom()
リファレンスプロットのY軸の範囲を手動で設定します。
- 概要:
ユーザーが設定パネルの入力欄に指定したリファレンスプロットのY軸の最小値と最大値に基づいて、Y軸範囲を設定します。
- 詳細説明:
settings_panel.edit_ref_y_min と settings_panel.edit_ref_y_max からY軸の範囲値を取得します。 入力がない場合は現在のY軸範囲が維持されます。 有効な数値が入力され、最小値が最大値より小さい場合、self.canvas.axes2.set_ylim でY軸範囲を設定します。 設定後、キャンバスを再描画します。 無効な入力があった場合は警告メッセージを表示します。
- 戻り値:
なし
- apply_manual_x_zoom()
X軸の範囲を手動で設定し、その範囲をロックします。
- 概要:
ユーザーが設定パネルの入力欄に指定したX軸の最小値と最大値に基づいて、グラフのX軸範囲を設定します。 この操作は、X軸の自動ズーム/パンを無効化し、指定された範囲に固定します。
- 詳細説明:
settings_panel.edit_x_min と settings_panel.edit_x_max からX軸の範囲値を取得します。 入力がない場合は現在のX軸範囲が維持されます。 有効な数値が入力され、最小値が最大値より小さい場合、self.canvas.axes.set_xlim でX軸範囲を設定します。 同時に、self.x_axis_is_locked をTrueに設定し、self.locked_x_range に設定された範囲を保存します。 これにより、update_plot が呼び出されてもこのX軸範囲が維持されるようになります。 無効な入力があった場合は警告メッセージを表示します。
- 戻り値:
なし
- apply_manual_y_zoom()
Y軸の範囲を手動で設定します。
- 概要:
ユーザーが設定パネルの入力欄に指定したY軸の最小値と最大値に基づいて、グラフのY軸範囲を設定します。
- 詳細説明:
settings_panel.edit_y_min と settings_panel.edit_y_max からY軸の範囲値を取得します。 入力がない場合は現在のY軸範囲が維持されます。 有効な数値が入力され、最小値が最大値より小さい場合、self.canvas.axes.set_ylim でY軸範囲を設定します。 設定後、キャンバスを再描画します。 無効な入力があった場合は警告メッセージを表示します。
- 戻り値:
なし
- apply_marker_offset()
選択されたマーカーのY軸オフセットをスピンボックスの値に適用します。
- 概要:
マーカーリストで選択されているマーカーが存在する場合、そのマーカー個別のオフセットを調整します。 マーカーが選択されていない場合、現在選択されているデータセット全体のデフォルトマーカーオフセットを調整します。
- 詳細説明:
データリストから選択されているデータセット(単一選択のみ)を取得します。 マーカーリストでアイテムが選択されている場合、そのマーカーオブジェクトの`offset`キーに spin_marker_offset の値を設定します。 マーカーが選択されていない場合、選択されているデータセットの`marker_offset_percent`キーを更新します。 この値は、そのデータセット内のマーカーに個別オフセットが設定されていない場合に適用されるデフォルト値です。 変更後、update_plot() を呼び出してグラフを再描画します。
- 戻り値:
なし
- apply_marker_style()
選択されたマーカーの線の太さをスピンボックスの値に適用します。
- 概要:
マーカーリストで選択されているマーカーの線幅を調整します。
- 詳細説明:
データリストから選択されているデータセット(単一選択のみ)を取得します。 マーカーリストでアイテムが選択されている場合、そのマーカーオブジェクトの`linewidth`キーに spin_marker_linewidth の値を設定します。 この操作は、選択されているすべてのマーカーに適用されます。 変更後、update_plot() を呼び出してグラフを再描画します。
- 戻り値:
なし
- apply_plot_ratio()
スピンボックスで設定された値に基づいて、上下のプロットの高さの比率を変更します。
- 概要:
2画面モードで、データプロットとリファレンスプロットの相対的な高さを調整します。
- 詳細説明:
settings_panel.spin_plot_ratio の値を取得し、 これに基づいてMatplotlibのGridSpecの`height_ratios`を設定します。 これにより、データプロットが占める垂直方向のスペースと、 リファレンスプロットが占めるスペースの比率が変更されます。 変更を反映するために、tight_layout() と subplots_adjust(hspace=0) を呼び出し、 キャンバスを再描画します。
- 戻り値:
なし
- apply_reference_filter()
リファレンスのフィルタ条件を適用し、グラフを再描画します。
- 概要:
リファレンスパネルのフィルタ入力欄に記述された条件式を評価し、 表示するリファレンスピークを動的に絞り込みます。
- 詳細説明:
ref_panel.edit_ref_filter からフィルタ条件文字列を取得します。 条件が空でない場合、_safe_evaluate_filter を呼び出して、 数式に文法エラーや実行時エラーがないかを事前にテストします。 エラーがあった場合、警告メッセージを表示してフィルタ適用を中止します。 エラーがなければ、self.current_ref_filter_condition を更新し、 update_plot() を呼び出してグラフを再描画します。 _draw_references メソッド内でこのフィルタ条件が適用されます。
- 戻り値:
なし
- apply_x_label()
QLineEditのテキストをX軸ラベルに適用し、グラフを更新します。
- 概要:
ユーザーが設定パネルで入力したテキストをグラフのX軸ラベルとして設定します。
- 詳細説明:
settings_panel.edit_x_label から新しいラベルテキストを取得します。 現在の self.x_label_text と異なる場合のみ、self.x_label_text を更新し、 update_plot() を呼び出してグラフを再描画します。 これにより、変更が即座にグラフに反映されます。
- 戻り値:
なし
- apply_x_tick_interval()
入力されたX軸の主目盛間隔を適用し、グラフを更新します。
- 概要:
ユーザーが指定した数値に基づいて、X軸の主目盛間隔を固定します。 入力が空の場合は、自動目盛設定に戻します。
- 詳細説明:
edit_x_tick_interval からテキストを取得し、数値に変換を試みます。 入力が空文字列の場合、self.x_tick_interval をNoneに設定して自動目盛に切り替えます。 有効な正の数値が入力された場合、その値を self.x_tick_interval に保存します。 数値が0以下の場合や数値変換エラーが発生した場合は、警告メッセージを表示します。 設定後、update_plot() を呼び出してグラフを再描画し、新しい目盛間隔を適用します。
- 戻り値:
なし
- closeEvent(event)
ウィンドウが閉じられるときに呼び出され、セッション保存の確認を促します。
- 概要:
アプリケーション終了前に、未保存の作業がある場合にユーザーにセッションの保存を促すダイアログを表示します。
- 詳細説明:
self.datasets または self.references にデータが存在する場合、 ユーザーに「保存」「破棄」「キャンセル」の選択肢を提示する QMessageBox を表示します。 「はい」が選択された場合、save_session() を呼び出し、保存が成功すればウィンドウを閉じます。 「いいえ」が選択された場合、保存せずにウィンドウを閉じます。 「キャンセル」が選択された場合、終了処理を中止し、ウィンドウを閉じません。 データが存在しない場合は、確認なしでウィンドウを閉じます。
- パラメータ:
event (QCloseEvent) -- ウィンドウクローズイベント。
- 戻り値:
なし
- dragEnterEvent(event)
ファイルがアプリケーションにドラッグされたときにカーソル形状を変更します。
- 概要:
ドラッグされたMIMEデータがURL(ファイル)を含んでいる場合、ドロップを受け入れる準備をします。
- 詳細説明:
Qtのドラッグ&ドロップイベントハンドラの一部です。 event.mimeData().hasUrls() でMIMEデータがURL(ファイルパス)を含んでいるか確認し、 含まれていれば event.acceptProposedAction() を呼び出してドロップを受け入れることを示します。 これにより、カーソルが「ドロップ可能」な形状に変わります。
- パラメータ:
event (QDragEnterEvent) -- ドラッグ&ドロップイベント。
- 戻り値:
なし
- dropEvent(event)
ファイルがアプリケーションにドロップされたときに読み込み処理を実行します。
- 概要:
ドラッグ&ドロップされたファイルを、ドロップされたUI要素に基づいてデータセットまたはリファレンスとして読み込みます。
- 詳細説明:
ドロップされたファイルパスのリストを取得し、ドロップされた座標が データリストウィジェットまたはリファレンスリストウィジェットのどちらの上にあるかを判定します。 判定結果に基づき、各ファイルを _load_data_file または _load_reference_file (後者は通常`load_reference_dialog`が呼ばれるが、ここでは内部ヘルパーを想定)を呼び出して読み込みます。 どちらのリストウィジェット上でもない場合は、デフォルトでデータとして読み込みます。 全てのファイルの読み込み後、グラフを更新します。
- パラメータ:
event (QDropEvent) -- ドラッグ&ドロップイベント。
- 戻り値:
なし
- edit_selected_marker_color()
選択されたすべてのマーカーの色を一括変更します。
- 概要:
マーカーリストで選択されている複数のマーカーに対して、ユーザーが選択した新しい色を適用します。
- 詳細説明:
データリストから選択されているデータセット(単一選択のみ)と、 マーカーリストで選択されているすべてのマーカーアイテムを取得します。 QColorDialog.getColor を使用してカラー選択ダイアログを表示し、ユーザーに新しい色を選択させます。 有効な色が選択された場合、選択された各マーカーアイテムに対応するマーカーデータ辞書の`color`キーを更新します。 変更後、update_plot() を呼び出してグラフを再描画します。
- 戻り値:
なし
- edit_selected_marker_symbol(symbol: str)
選択されたすべてのマーカーのシンボルを一括変更します。
- 概要:
マーカーリストで選択されている複数のマーカーに対して、指定されたシンボルを適用します。
- 詳細説明:
データリストから選択されているデータセット(単一選択のみ)と、 マーカーリストで選択されているすべてのマーカーアイテムを取得します。 選択された各マーカーアイテムに対応するマーカーデータ辞書の`symbol`キーを、 combo_marker_symbol で選択された新しいシンボル(表示テキスト)に更新します。 変更後、update_plot() を呼び出してグラフを再描画します。
- パラメータ:
symbol (str) -- 選択された新しいマーカーシンボルを表すテキスト。
- 戻り値:
なし
- get_next_color() QColor
Matplotlibのデフォルトカラーサイクルから次の色をQColorオブジェクトとして提供します。
- 概要:
データセットやリファレンスに順次異なる色を割り当てるために使用されます。
- 詳細説明:
MatplotlibのTableau Colorsに基づいた10色のサイクルを保持し、 呼び出されるたびに次の色を返します。サイクルの終わりに達すると、最初に戻ります。
- 戻り値:
次のデフォルトカラーサイクルからの色。
- 戻り値の型:
QColor
- init_ui()
アプリケーションのユーザーインターフェースを初期構築します。
- 概要:
メインウィンドウのレイアウトを定義し、各種コントロールパネル(タブ構造)、 グラフ表示エリア、およびそれらの間の信号接続を設定します。
- 詳細説明:
ファイル操作、データリスト表示、リファレンスリスト表示、グラフ設定、 X線源設定、マーカー操作、アプリケーション設定のためのパネルを作成し、 タブウィジェットに配置します。 Matplotlibのキャンバスとナビゲーションツールバーをグラフエリアに組み込みます。 各UIウィジェットとアプリケーションの内部ロジック間の信号とスロットを接続し、 折りたたみ可能なグループボックス機能も適用します。 最後に、サブプロットの初期設定とマウスイベントハンドラの接続を行います。
- load_reference_dialog()
ファイルダイアログを開き、選択されたXRDリファレンスファイルを読み込みます。
- 概要:
ユーザーがファイルシステムからリファレンスファイルを選択し、その内容をアプリケーションにロードします。
- 詳細説明:
QFileDialog.getOpenFileName を使用してファイル選択ダイアログを表示します。 選択されたファイルのパスと現在のX線波長を file_parser.parse_reference_file に渡し、 リファレンスデータを解析します。 解析が成功した場合、_generate_unique_name でユニークな名前を生成し、 リファレンスデータをアプリケーションのリファレンスリストに追加します。 その際、推定された格子定数情報も保存されます。 最後に、リファレンスリストウィジェットとグラフを更新します。
- load_session()
JSONファイルからセッションを読み込み、アプリケーションの状態を復元します。
- 概要:
以前に保存されたセッションファイルをロードし、データセット、リファレンス、UI設定を再構築します。
- 詳細説明:
現在のセッションにデータが存在する場合、ユーザーに保存の確認を促します。 QFileDialog.getOpenFileName を使用してJSON形式のファイルパスをユーザーに尋ねます。 session_manager.load_from_file を使用してセッションデータを読み込み、 self.datasets と self.references をクリアして、読み込んだデータで再構築します。 データセットとリファレンスに含まれる色情報やマーカーの色情報も正しくQColorオブジェクトに変換されます。 さらに、保存されていたUI設定(データ処理設定、グラフ表示設定、フォント設定など)を各UIウィジェットに適用し、 グラフを更新します。 読み込み成功または失敗のメッセージをユーザーに通知します。
- 戻り値:
なし
- load_xrd_data_dialog()
ファイルダイアログを開き、選択されたXRDデータファイルを読み込みます。
- 概要:
ユーザーがファイルシステムからXRDデータファイルを選択し、その内容をアプリケーションにロードします。
- 詳細説明:
QFileDialog.getOpenFileName を使用してファイル選択ダイアログを表示します。 選択されたファイルのパスを file_parser.parse_xrd_file に渡し、 XRDデータを解析します。解析が成功した場合、add_dataset メソッドを呼び出して データをアプリケーションのデータリストに追加し、グラフを更新します。 解析エラーが発生した場合は、エラーメッセージをポップアップで表示します。
- on_aspect_ratio_changed(selected_text: str)
グラフの縦横比設定が変更されたときに呼び出されます。
- 概要:
選択された縦横比または固定サイズに基づいて、グラフのMatplotlib Figureサイズを調整します。
- 詳細説明:
selected_text の値が self.fixed_paper_sizes に含まれる場合、 対応する固定サイズ(インチ単位)をFigureに直接設定します。 self.aspect_ratios に含まれる場合は、指定された比率に基づいて幅を基準とした高さを計算し、 Figureのサイズを設定します。 設定後、update_plot() を呼び出してグラフを再描画し、変更を反映させます。
- パラメータ:
selected_text (str) -- 選択された縦横比または固定サイズのテキスト。
- on_axes_limits_changed(axes: Axes)
Matplotlibの軸範囲が変更されたときに呼び出され、設定パネルの入力欄を更新します。
- 概要:
グラフのX軸またはY軸のズーム/パン操作が行われた際、その新しい範囲値をUIに反映します。
- 詳細説明:
変更されたAxesオブジェクトがデータプロット (self.canvas.axes) であるか、 リファレンスプロット (self.canvas.axes2) であるかを判定します。 それぞれのAxesから現在のX軸とY軸の制限値 (xlim, ylim) を取得し、 対応する`settings_panel`のQLineEditウィジェット (edit_x_min, edit_x_max, edit_y_min, edit_y_max, edit_ref_y_min, edit_ref_y_max) に表示します。 表示される数値は小数点以下3桁に丸められます。
- パラメータ:
axes (matplotlib.axes.Axes) -- 軸の制限が変更されたMatplotlib Axesオブジェクト。
- 戻り値:
なし
- on_data_scale_changed(new_scale: str)
データプロットのY軸スケールが変更されたときに呼び出されます。
- 概要:
Y軸スケールが変更された場合、データセットのオフセットを再計算し、グラフを更新します。
- 詳細説明:
_recompute_dataset_offsets_for_scale メソッドを呼び出し、 選択された新しいスケール(線形、対数など)に基づいて、 すべてのデータセットのY軸オフセット値を動的に調整します。 これにより、スケール変更後もデータが適切に積み重なって見えるようにします。 オフセットの再計算後、update_plot() を呼び出してグラフを再描画します。
- パラメータ:
new_scale (str) -- 選択された新しいY軸スケール名 (例: "線形", "対数")。
- 戻り値:
なし
- on_data_selection_changed()
データリストの選択が変更されたときに呼び出されます。
- 概要:
選択されたデータセットの数に応じて、UI上の関連ウィジェット(オフセット、線幅、名前変更ボタンなど)の 有効/無効状態と表示値を更新します。
- 詳細説明:
_update_selection_dependent_ui ヘルパーメソッドを呼び出して、 データリストウィジェットの状態をUIに反映させます。 特に、オフセットスピンボックスは1つのデータセットが選択されている場合のみ有効になり、 選択されたデータセットの現在のオフセット値を表示します。 また、マーカーパネルのUIも選択状態に合わせて更新されます。
- 戻り値:
なし
- on_legend_visibility_changed(state: int)
凡例の表示/非表示チェックボックスの状態が変更されたときに呼び出されます。
- 概要:
グラフの凡例の可視性を制御する設定を更新し、グラフに適用します。
- 詳細説明:
チェックボックスの新しい状態(Qt.CheckState.CheckedまたはQt.CheckState.Unchecked)を self.legend_visible に反映させます。 このフラグは _apply_data_plot_styles および _apply_ref_plot_styles メソッド内で、 凡例を表示するかどうかを決定するために使用されます。 変更後、update_plot() を呼び出してグラフを再描画します。
- パラメータ:
state (int) -- チェックボックスの新しい状態 (Qt.CheckStateの値)。
- 戻り値:
なし
- on_marker_scroll(event)
マウスホイール操作:ピーク付けモード中にグラフ上でマウスホイールを操作すると、 選択中のマーカーのオフセットを調整します。
- 概要:
ピーク付けモードが有効な場合、マウスホイールの上下スクロールによって マーカーのY軸オフセット(垂直方向の位置)を増減させます。
- 詳細説明:
イベントがピーク付けモード中であり、上のグラフ(self.canvas.axes)内で発生した場合にのみ処理を続行します。 データリストで1つのデータセットが選択されている必要があります。 マーカーリストで特定のマーカーが選択されている場合、そのマーカー個別の`offset`値を調整します。 マーカーが選択されていない場合、選択されているデータセット全体のデフォルトマーカーオフセット (marker_offset_percent) を調整します。 調整後、spin_marker_offset の値を更新し、update_plot() を呼び出してグラフを再描画します。
- パラメータ:
event (matplotlib.backend_bases.MouseEvent) -- Matplotlibのマウスイベントオブジェクト (スクロールイベント)。
- 戻り値:
なし
- on_marker_selection_changed()
マーカーリストの選択状態に応じてUIを制御します。
- 概要:
マーカーリストウィジェットで選択されているマーカーの数に基づいて、 シンボル変更、色変更、削除ボタンの有効/無効状態を切り替えます。
- 詳細説明:
list_widget_markers の選択アイテム数を取得し、 いずれかのマーカーが選択されていれば、combo_marker_symbol, btn_marker_color, btn_remove_marker を有効にします。 また、選択されているマーカーが存在する場合、その最初のマーカーのオフセット値を spin_marker_offset に表示します。選択がない場合は、これらのウィジェットを無効にします。
- 戻り値:
なし
- on_mouse_move_on_graph(event)
グラフ上でのマウス移動を検出し、リファレンスピークにマウスがオーバーした際の情報を表示します。
- 概要:
マウスカーソルがリファレンスピークに近づくと、そのH K Lインデックスと角度を注釈で表示し、 関連するX線ゴーストラインや高次反射ラインも同時に表示します。
- 詳細説明:
マウスイベントが下のグラフ(self.canvas.axes2)内で発生した場合に処理を行います。 まず、前回の注釈、指示線、ゴーストライン、高次反射ラインを非表示にします。 次に、マウスの位置から最も近いリファレンスピークを検索し、 そのピークから一定ピクセル範囲内(BAND_PICK_LIMIT)にある場合、 そのピークに関する情報を集めます。 最も近いピークを中心に、複数の関連ピークのH K Lと角度を整形して、 peak_annotation_right または peak_annotation_left を使用してグラフ上に注釈として表示します。 同時に、対応するX軸位置に垂直な指示線 (indicator_line) を表示し、 設定で有効になっている場合、Kα2、Kβなどのゴーストラインや、高次反射の線も表示します。 マウスがピークから離れるかグラフ外に出た場合、すべての注釈と線は非表示になります。
- パラメータ:
event (matplotlib.backend_bases.MouseEvent) -- Matplotlibのマウスイベントオブジェクト (モーションイベント)。
- 戻り値:
なし
- on_plot_click(event)
グラフがクリックされたときの処理です。ピークスナップ機能が含まれます。
- 概要:
ピーク付けモードが有効な場合、リファレンスピークにスナップするか、 クリックされた位置にマーカーをデータセットに追加します。
- 詳細説明:
イベントがピーク付けモード中であり、下のグラフ(self.canvas.axes2)内で発生し、 かつ左クリックであった場合にのみ処理を続行します。 単一のデータセットが選択されていない場合、警告メッセージを表示します。 マウスが既存のリファレンスピークにホバーしている場合 (self.hovered_peak_info がNoneでない場合)、 そのピークの正確な位置とH K Lラベルを使用して新しいマーカーを作成します。 ホバーしていない場合は、クリックされたX軸のデータ座標をそのままマーカーの位置とします。 新しいマーカーは選択されたデータセットの`markers`リストに追加され、 _update_marker_panel_ui と update_plot() が呼び出されてUIとグラフが更新されます。
- パラメータ:
event (matplotlib.backend_bases.MouseEvent) -- Matplotlibのマウスイベントオブジェクト。
- 戻り値:
なし
- on_ref_y_label_visibility_changed(state: int)
リファレンスプロットのY軸ラベルの表示/非表示チェックボックスの状態が変更されたときに呼び出されます。
- 概要:
リファレンスプロットのY軸ラベルの可視性を制御する設定を更新し、グラフに適用します。
- 詳細説明:
チェックボックスの新しい状態(Qt.CheckState.CheckedまたはQt.CheckState.Unchecked)を self.ref_y_label_visible に反映させます。 このフラグは _apply_ref_plot_styles メソッド内で、 リファレンスプロットのY軸ラベルを表示するかどうかを決定するために使用されます。 変更後、update_plot() を呼び出してグラフを再描画します。
- パラメータ:
state (int) -- チェックボックスの新しい状態 (Qt.CheckStateの値)。
- 戻り値:
なし
- on_ref_y_tick_visibility_changed(state: int)
リファレンスプロットのY軸数値の表示/非表示チェックボックスの状態が変更されたときに呼び出されます。
- 概要:
リファレンスプロットのY軸数値ラベルの可視性を制御する設定を更新し、グラフに適用します。
- 詳細説明:
チェックボックスの新しい状態(Qt.CheckState.CheckedまたはQt.CheckState.Unchecked)を self.ref_y_tick_labels_visible に反映させます。 このフラグは _apply_ref_plot_styles メソッド内で、 リファレンスプロットのY軸数値ラベルを表示するかどうかを決定するために使用されます。 変更後、update_plot() を呼び出してグラフを再描画します。
- パラメータ:
state (int) -- チェックボックスの新しい状態 (Qt.CheckStateの値)。
- 戻り値:
なし
- on_reference_selection_changed()
リファレンスリストの選択が変更されたときに呼び出されます。
- 概要:
選択されたリファレンスの数に応じて、リファレンスパネル内の関連UIウィジェットの有効/無効状態と 線幅スピンボックスの表示値を更新します。
- 詳細説明:
_get_selected_items を使用して現在選択されているリファレンスを取得し、 それらの数に基づいて、色設定ボタン、名前変更ボタン、削除ボタン、 カラースケール適用ボタン、線幅スピンボックスの有効/無効を切り替えます。 単一のリファレンスが選択されている場合、そのリファレンスの線幅値を 線幅スピンボックスに表示します。選択がない場合はデフォルト値が表示されます。
- 戻り値:
なし
- on_replace_non_positive_changed(state: int)
「0以下の値を1に置換」チェックボックスの状態が変更されたときに呼び出されます。
- 概要:
グラフ描画時にY軸値が0以下のデータをどのように扱うかを設定します。
- 詳細説明:
チェックボックスの新しい状態(Qt.CheckState.CheckedまたはQt.CheckState.Unchecked)を self.replace_non_positive_with_one に反映させます。 このフラグは、_draw_datasets メソッド内で、対数スケールでプロットする際や、 視覚的に見やすくするために0以下の値をスキップするロジックを制御するために使用されます。 変更後、update_plot() を呼び出してグラフを再描画します。
- パラメータ:
state (int) -- チェックボックスの新しい状態 (Qt.CheckStateの値)。
- 戻り値:
なし
- on_single_plot_mode_changed(state: int)
「1画面モード」チェックボックスの状態が変更されたときに呼び出されます。
- 概要:
グラフの表示モードを1画面または2画面で切り替え、それに伴うUIの有効/無効状態を調整します。
- 詳細説明:
チェックボックスの新しい状態(Qt.CheckState.CheckedまたはQt.CheckState.Unchecked)を self.is_single_plot_mode に反映させます。 1画面モードが選択された場合、リファレンスプロットの比率調整スピンボックス (settings_panel.spin_plot_ratio) を無効にします。 2画面モードに戻った場合は、これを有効に戻します。 変更後、update_plot() を呼び出してグラフを再描画し、新しいモードを適用します。
- パラメータ:
state (int) -- チェックボックスの新しい状態 (Qt.CheckStateの値)。
- 戻り値:
なし
- on_y_tick_visibility_changed(state: int)
データプロットのY軸の数値ラベルの表示/非表示チェックボックスの状態が変更されたときに呼び出されます。
- 概要:
Y軸の数値ラベルの可視性を制御する設定を更新し、グラフに適用します。
- 詳細説明:
チェックボックスの新しい状態(Qt.CheckState.CheckedまたはQt.CheckState.Unchecked)を self.y_tick_labels_visible に反映させます。 このフラグは _apply_data_plot_styles メソッド内で、 Y軸の数値ラベルを表示するかどうかを決定するために使用されます。 変更後、update_plot() を呼び出してグラフを再描画します。
- パラメータ:
state (int) -- チェックボックスの新しい状態 (Qt.CheckStateの値)。
- 戻り値:
なし
- remove_selected_items(list_widget: QListWidget, data_list: list[dict], item_type_name: str)
選択されたアイテムを削除する汎用メソッドです。
- 概要:
データリストまたはリファレンスリストで選択されている1つまたは複数のアイテムを、 確認ダイアログの後に削除します。
- 詳細説明:
_get_selected_items を使用して現在選択されているアイテムのリストを取得します。 選択されたアイテムがない場合は何もしません。 削除の確認ダイアログ (QMessageBox) を表示し、ユーザーが「はい」を選択した場合、 選択されたアイテムに対応するデータ辞書を`data_list` (例: self.datasets や self.references) から削除します。 同時に、QListWidget からも対応するアイテムを削除します。 削除後、update_plot() を呼び出してグラフを再描画します。
- remove_selected_marker()
選択されたすべてのマーカーを一括削除します。
- 概要:
マーカーリストで選択されている複数のマーカーを、確認ダイアログの後に削除します。
- 詳細説明:
データリストから選択されているデータセット(単一選択のみ)と、 マーカーリストで選択されているすべてのマーカーアイテムを取得します。 削除の確認ダイアログ (QMessageBox) を表示し、ユーザーが「はい」を選択した場合、 インデックスのずれを防ぐために、マーカーリストのアイテムを逆順に並べ替えて削除します。 対応するマーカーデータ辞書 (dataset["markers"]) からもマーカーを削除します。 削除後、_update_marker_panel_ui を呼び出してマーカーパネルを更新し、 update_plot() でグラフを再描画します。
- 戻り値:
なし
- rename_selected_item(list_widget: QListWidget, data_list: list[dict], item_type_name: str)
選択された単一アイテムの名前を変更する汎用メソッドです(重複チェック付き)。
- 概要:
データリストまたはリファレンスリストで選択されている1つのアイテムの名前を、 入力ダイアログでユーザーが指定した新しい名前に変更します。
- 詳細説明:
_get_selected_items を使用して現在選択されているアイテムが1つであることを確認します。 QInputDialog.getText を使用して、ユーザーに新しい名前を入力するよう促します。 入力された新しい名前が、既存のすべてのデータセットおよびリファレンスの名前と重複しないかチェックします。 重複がある場合、警告メッセージを表示して名前変更を中止します。 重複がなければ、選択されたアイテムのデータ辞書の`"name"キーと、`QListWidgetItem`のテキストを更新します。 更新された辞書全体を`QListWidgetItem`の`UserRole`に再設定します。 変更後、`update_plot() を呼び出してグラフを再描画します。
- reset_zoom()
グラフのズーム設定をリセットし、X軸のロックと目盛間隔を解除します。
- 概要:
グラフのX軸とY軸の範囲を自動調整モードに戻し、X軸の固定設定と目盛間隔をクリアします。
- 詳細説明:
self.x_axis_is_locked をFalseに、self.locked_x_range をNoneに設定してX軸のロックを解除します。 self.x_tick_interval をNoneに設定し、対応するUI入力欄をクリアして、X軸の主目盛間隔のカスタム設定を解除します。 最後に update_plot() を呼び出して、グラフを初期の自動調整状態に再描画します。
- 戻り値:
なし
- run_auto_peak_search()
選択されたデータセットに対して自動ピーク検索を実行します。
- 概要:
スムージングと閾値の設定に基づいて、データセットからピークを自動的に検出し、 それらをマーカーとして追加します。
- 詳細説明:
データリストから1つのデータセットが選択されていることを確認します。 データパネルのスムージングウィンドウサイズ (data_panel.spin_smooth_window) と、 マーカーパネルのピーク検索閾値 (spin_peak_search_threshold) を取得します。 calculations.perform_peak_search を呼び出して、指定されたデータとパラメータでピークを検出します。 ピークが見つかった場合、検出された各ピークのX座標を使用して新しいマーカー辞書を作成し、 選択されたデータセットの`markers`リストに追加します。 追加後、_update_marker_panel_ui を呼び出してマーカーパネルを更新し、 update_plot() でグラフを再描画します。 検出されたピークの数に応じて、情報メッセージを表示します。
- 戻り値:
なし
- save_graph_dialog()
現在のグラフを画像またはベクトル形式でファイルに保存するダイアログを表示します。
- 概要:
ユーザーがグラフの保存形式(PNG, JPEG, SVG, PDF)を選択し、指定したファイルパスにグラフを出力します。
- 詳細説明:
グラフデータが存在しない場合は、情報メッセージを表示して処理を中断します。 QFileDialog.getSaveFileName を使用して保存ダイアログを表示し、 ファイルパスと選択されたフィルター(ファイル形式)を取得します。 self.canvas.fig.savefig メソッドを使用して、選択された形式(PNGの場合300DPI、透明背景)でグラフを保存します。 保存成功または失敗のメッセージをユーザーに通知します。
- 戻り値:
なし
- save_session() bool
現在のセッションの状態(データセット、リファレンス、UI設定)をJSONファイルに保存します。
- 概要:
アプリケーションの現在の状態をファイルに永続化し、後で復元できるようにします。
- 詳細説明:
保存するデータが存在しない場合は、情報メッセージを表示して処理を中断します。 QFileDialog.getSaveFileName を使用して、JSON形式の保存パスをユーザーに尋ねます。 session_manager.serialize_session を使用して、データセット、リファレンス、および 現在のUI設定(Y軸スケール、スケーリングファクター、フィルタ条件、フォント情報など)を JSONシリアライズ可能な形式に変換します。 変換されたデータを session_manager.save_to_file を使用してファイルに書き込みます。 保存成功または失敗のメッセージをユーザーに通知します。
- 戻り値:
セッションが正常に保存された場合はTrue、それ以外はFalse。
- 戻り値の型:
- set_graph_font_dialog()
グラフのフォント選択ダイアログを開き、ユーザーが選択したフォントを適用します。
- 概要:
Qtの`QFontDialog`を使用して、グラフのフォントファミリーとサイズを変更するGUIを提供します。
- 詳細説明:
ダイアログでフォントが選択され、[OK]が押された場合、 self.graph_font を更新し、apply_font_to_graph メソッドを呼び出して、 Matplotlibの描画設定に新しいフォントを反映させ、グラフを再描画します。
- set_selected_item_color(list_widget: QListWidget, data_list: list[dict], item_type_name: str)
選択されたアイテムの色を変更する汎用メソッドです。
- 概要:
データリストまたはリファレンスリストで選択されている1つまたは複数のアイテムの色を、 カラーダイアログを使用して変更します。
- 詳細説明:
_get_selected_items を使用して現在選択されているアイテムのリストを取得します。 選択されたアイテムがない場合は何もしません。 QColorDialog.getColor を使用してカラー選択ダイアログを表示し、 ユーザーが有効な色を選択した場合、選択されたすべてのアイテムの`"color"キーを 新しい`QColor`オブジェクトで更新します。 色の変更をUIに反映するため、`_update_all_list_items_visuals() を呼び出して リストアイテムの見た目を更新し、update_plot() を呼び出してグラフを再描画します。
- show_ref_filter_help_popup()
リファレンスフィルタの構文と利用可能な関数についてのヘルプポップアップを表示します。
- 概要:
ユーザーがリファレンスフィルタ機能の使い方を理解できるように、詳細な説明を提供します。
- 詳細説明:
このメソッドは、QMessageBox を使用して情報ダイアログを表示します。 ダイアログには、フィルタリング条件式で使用できる基本変数 (h, k, l, i, pi)、 推定された格子変数 (a, b, c, alpha, beta, gamma)、 許可されている演算子、および数学関数の一覧が含まれます。 特に、GIXRD面外配向判定のためのカスタム関数(gixrd_oop_dist, gixrd_oop_ndist, gixrd_oop_vis_fwhm)の 使用方法と引数についても詳しく説明されます。
- 戻り値:
なし
- toggle_item_visibility(item: QListWidgetItem, data_list: list[dict], item_type_name: str)
指定されたリストウィジェットのアイテムの表示/非表示を切り替える汎用メソッドです。
- 概要:
データリストまたはリファレンスリストのアイテムをダブルクリックすることで、 そのアイテムがグラフに表示されるかどうかを切り替えます。
- 詳細説明:
ダブルクリックされた`QListWidgetItem`から対応するデータ辞書を取得します。 data_list (例: self.datasets または self.references) から 該当するデータを見つけ、その`"visible"キーのブール値を反転させます。 表示状態の変更をUIに反映するため、`_update_all_list_items_visuals() を呼び出して リストアイテムの見た目(打ち消し線、色)を更新し、 update_plot() を呼び出してグラフを再描画します。
- toggle_labeling_mode(checked: bool)
「ピーク付けモード」のON/OFFを切り替えます。
- 概要:
このモードが有効な場合、グラフをクリックすることでピークをマーカーとして追加できるようになります。
- 詳細説明:
checked パラメータがTrueの場合、is_labeling_mode をTrueに設定し、 ボタンのテキストを「ピーク付けモード終了」に変更し、カーソルを十字カーソルに設定します。 Falseの場合、is_labeling_mode をFalseに設定し、ボタンのテキストを「ピーク付けモード開始」に戻し、 カーソルを標準の矢印カーソルに戻します。 このモードを有効にするには、データリストから1つのデータセットが選択されている必要があります。 そうでない場合、警告メッセージが表示され、モードは有効になりません。
- パラメータ:
checked (bool) -- ボタンがチェックされた状態かどうか (True: ON, False: OFF)。
- 戻り値:
なし
- update_plot(process_data: bool = True)
グラフを再描画するメインロジックです。1画面/2画面モードに対応しています。
- 概要:
データセット、リファレンス、各種UI設定に基づいてMatplotlibのグラフを更新し、表示します。
- 詳細説明:
サブプロット設定: 現在の表示モード(1画面/2画面)に応じてサブプロットのレイアウトを再設定します。
X軸範囲決定: ロックされているX軸範囲があればそれを優先し、なければ全データのX軸範囲から自動調整します。
データ描画: _draw_datasets メソッドを呼び出してXRDデータセットを描画し、Y軸の最小/最大値を取得します。
リファレンス描画: 2画面モードの場合、_draw_references メソッドを呼び出してリファレンスパターンを描画し、Y軸の最小/最大値を取得します。
スタイル適用: _apply_data_plot_styles および _apply_ref_plot_styles メソッドを呼び出して、軸スケール、ラベル、目盛、線幅などのスタイルを適用します。
軸範囲設定: データ描画後に取得したY軸の最小/最大値に基づき、適切なマージンを加えてY軸範囲を設定します。対数スケールの場合は0以下の値を適切に処理します。
後処理: 高次反射の線、ゴーストライン、ピーク注釈などを初期化または更新し、レイアウト調整とキャンバスの再描画を行います。
ズーム情報の更新: 軸の制限が変更された際に設定パネルの入力欄を更新するコールバックをトリガーします。
- パラメータ:
process_data (bool, optional) -- Trueの場合、Kα2除去やスムージングなどのデータ処理を適用します。デフォルトはTrue。
- class XRD.XRD_GUI.XRD_GUI.MplCanvas(parent=None, width=5, height=4, dpi=100)
ベースクラス:
FigureCanvasQTAggMatplotlibのグラフを描画するためのキャンバスクラスです。
- 概要:
MatplotlibのFigureオブジェクトをラップし、PyQt6のUIに組み込むためのウィジェットを提供します。
- 詳細説明:
このクラスは、MatplotlibのFigureを初期化し、それを親ウィジェットに設定します。 グラフの幅、高さ、DPIをカスタマイズ可能です。
- XRD.XRD_GUI.XRD_GUI.check_dependencies()
アプリケーションの実行に必要なPythonライブラリの依存関係を確認します。
- 詳細説明:
required_libraries に定義された各ライブラリのインポートを試みます。 不足しているライブラリがあった場合、それらをリストアップし、 pip install コマンドでインストールする方法をユーザーに提示します。 不足がある場合は、ユーザーの入力待ちの後、プログラムを終了します。 すべてのライブラリが揃っている場合は、続行メッセージを表示します。
- 戻り値:
なし。不足がある場合はシステムを終了します。
- XRD.XRD_GUI.XRD_GUI.handle_exception(exc_type, exc_value, exc_traceback)
キャッチされなかった例外を処理し、エラーダイアログを表示するグローバルハンドラです。
- 概要:
Pythonアプリケーションで未処理の例外が発生した場合に呼び出され、 エラーの詳細をユーザーに分かりやすく提示します。
- 詳細説明:
発生した例外のタイプ、値、トレースバック情報を取得し、 標準出力(コンソール)にトレースバック情報を整形して出力します。 その後、QMessageBox を使用して、ユーザーフレンドリーなエラーメッセージと 詳細なトレースバック情報を表示するダイアログを生成します。 このダイアログは、ユーザーが「OK」ボタンをクリックするまでブロックされます。 この関数は sys.excepthook に設定され、アプリケーション全体の例外処理を担当します。
- XRD.XRD_GUI.XRD_GUI.main()
アプリケーションのエントリポイントです。
- 概要:
XRD_GUIアプリケーションを初期化し、実行します。
- 詳細説明:
グローバルな例外ハンドラ (handle_exception) を sys.excepthook に設定することで、 未処理の例外が発生した場合にカスタムエラーダイアログが表示されるようにします。 QApplication インスタンスを作成し、スタイルを"Fusion"に設定します。 GenericGraphApp のメインウィンドウインスタンスを作成し、表示します。 最後に app.exec() を呼び出してQtイベントループを開始し、 アプリケーションがユーザーからの入力やシステムイベントに応答できるようにします。