analyze_TFT_refactored.py のソースコード解析に基づき、Sphinx(MyST)でビルド可能なMarkdownドキュメントを以下に作成します。


TFT伝達特性解析スクリプト

概要

analyze_TFT_refactored.py は、TFT(薄膜トランジスタ)の伝達特性(Id-Vg特性)をExcelファイルから読み込み、解析するためのPythonスクリプトです。線形領域と飽和領域の伝達曲線データから、Vth(しきい値電圧)、移動度(mobility)、SS(サブスレッショルドスイング)、Ion(オン電流)などの主要なTFTパラメータを計算します。

スクリプトは、デフォルトで以下のファイル名と互換性を持つように設計されています。

  • 入力ファイル: IdVg-Vd0.1.xlsxIdVg-Vd10.xlsx

  • 出力ファイル: IdVg-Vd10_analyze.csvIdVg-Vd0.1_analyze.csvoutput.csvoutput_log.csvrootIdVg.pngIdVg_LIN.png

インストール

このスクリプトはPython 3で動作します。以下の非標準ライブラリが必要です。pip を使用してインストールできます。

pip install numpy pandas matplotlib scikit-learn openpyxl
  • numpy: 数値計算に使用されます。

  • pandas: データフレームの操作、Excel/CSVファイルの読み書きに使用されます。

  • matplotlib: グラフのプロットに使用されます。

  • scikit-learn: 線形回帰分析に使用されます。

  • openpyxl: pandas がExcelファイル (.xlsx) を読み書きするために内部的に必要とすることがあります。

使い方

コマンドライン引数

スクリプトは以下のコマンドライン引数をサポートしています。

  • --lin PATH: 線形領域のId-Vgデータを含むExcelファイルのパスを指定します。

    • デフォルト: IdVg-Vd0.1.xlsx

  • --sat PATH: 飽和領域のId-Vgデータを含むExcelファイルのパスを指定します。

    • デフォルト: IdVg-Vd10.xlsx

  • --outdir DIR: 出力ファイルを保存するディレクトリを指定します。

    • デフォルト: . (カレントディレクトリ)

  • --cox VALUE: 単位面積あたりのゲート容量 Cox を指定します。

    • デフォルト: 2.24e-8

  • --length VALUE: チャネル長 L を指定します。

    • デフォルト: 50.0e-6

  • --width VALUE: チャネル幅 W を指定します。

    • デフォルト: 300.0e-6

  • --target-current VALUE: SS(サブスレッショルドスイング)とVon(オン電圧)の評価に使用する目標電流を指定します。

    • デフォルト: 1.0e-10

  • --ioff-threshold VALUE: Ioff(オフ電流)の平均化に使用する上限電流しきい値を指定します。

    • デフォルト: 1.0e-14

  • --rolling-window INTEGER: 勾配平滑化のための中心移動平均ウィンドウサイズを指定します。

    • デフォルト: 7

  • --verbose: エラー発生時に詳細なトレースバックを表示します。

実行例

スクリプトを実行するには、Pythonインタープリタを使用します。

python analyze_TFT_refactored.py --lin IdVg-Vd0.1.xlsx --sat IdVg-Vd10.xlsx --outdir output_data

このコマンドは、IdVg-Vd0.1.xlsxIdVg-Vd10.xlsx を入力として使用し、結果を output_data ディレクトリに出力します。

入出力ファイル

入力ファイル

スクリプトは、以下の2つのExcelファイルを入力として期待します。

  1. 線形領域データファイル (デフォルト: IdVg-Vd0.1.xlsx--lin で指定):

    • 必須列: Vg (ゲート電圧), Vd (ドレイン電圧), Id (ドレイン電流)

    • ファイル形式: Excel (.xlsx)

  2. 飽和領域データファイル (デフォルト: IdVg-Vd10.xlsx--sat で指定):

    • 必須列: Vg (ゲート電圧), Id (ドレイン電流)

    • ファイル形式: Excel (.xlsx)

入力ファイルにこれらの必須列が含まれていない場合、ValueError が発生します。

出力ファイル

スクリプトは、指定された出力ディレクトリ (デフォルト: カレントディレクトリ) に以下のファイルを生成します。

  • IdVg-Vd10_analyze.csv:

    • 飽和領域の解析結果を含む詳細なCSVファイルです。元の VgId に加えて、Id_rm (負の IdNaN に置換したもの)、logIdrootId、各種勾配 (slope logId, slope rootId, slope rootId smooth)、および飽和移動度 muSAT の計算値が含まれます。

  • IdVg-Vd0.1_analyze.csv:

    • 線形領域の解析結果を含む詳細なCSVファイルです。元の VgVdId に加えて、Id_rmlogId、各種勾配 (slope Id, slope logId, slope Id smooth)、および電界効果移動度 muFE の計算値が含まれます。

  • output.csv:

    • 解析された主要なTFTパラメータをまとめたCSVファイルです。以下の列が含まれます。

      • Vth_SAT: 飽和領域のしきい値電圧

      • muSAT: 飽和移動度

      • SS_SAT: 飽和領域のサブスレッショルドスイング

      • Ion_SAT: 飽和領域のオン電流

      • Vth_LIN: 線形領域のしきい値電圧

      • muFE: 線形領域の電界効果移動度

      • SS_LIN: 線形領域のサブスレッショルドスイング

      • Ion_LIN: 線形領域のオン電流

  • output_log.csv:

    • output.csv と同じ情報を含みますが、SS_SATIon_SATSS_LINIon_LIN の値は log10 変換されたものです。

  • rootIdVg.png:

    • 飽和領域の sqrt(Id)Vg プロットです。最大勾配接線が赤線で重ねて表示されます。

  • IdVg_LIN.png:

    • 線形領域の IdVg プロットです。最大勾配接線が赤線で重ねて表示されます。

プログラムの設計

主要なデータ構造

スクリプトは、データクラス (dataclass) を利用して、解析設定と結果を構造化しています。

  • AnalysisConfig:

    • TFTパラメータ抽出に使用される設定値を保持するデータクラスです。

    • 属性:

      • cox (float): 単位面積あたりのゲート容量。

      • channel_length (float): チャネル長 L

      • channel_width (float): チャネル幅 W

      • target_current (float): SSとVonの評価に使用される電流しきい値。

      • ioff_threshold (float): Ioffの平均化に使用される上限電流しきい値。

      • rolling_window (int): 局所勾配の移動平均ウィンドウサイズ。

  • IdVgResult:

    • Id-Vg曲線から計算された要約値を保持するデータクラスです。

    • 属性:

      • dataframe (pd.DataFrame): 処理されたデータフレーム。

      • vth (float): しきい値電圧。

      • max_slope (float): 最大勾配。

      • vg_at_max_slope (float): 最大勾配時のゲート電圧。

      • mobility (float): 移動度。

      • ss (float): サブスレッショルドスイング。

      • ion (float): オン電流。

      • ioff (Optional[float]): オフ電流。計算できない場合は None

      • ion_ioff_ratio (Optional[float]): Ion/Ioff比。計算できない場合は None

      • von (float): オン電圧。

  • IdVdResult:

    • Id-Vd曲線から計算された要約値を保持するデータクラスです。この構造体は提供されていますが、現在の run() 関数では直接使用されていません。

    • 属性:

      • dataframe (pd.DataFrame): 処理されたデータフレーム。

      • mueff (float): 電界効果移動度。

主要な関数

スクリプトの主要な機能は、以下に示す関数によって実装されています。

ファイルI/Oとバリデーション

  • read_excel_file(path: str, label: str) -> pd.DataFrame:

    • 指定されたパスからExcelファイルを読み込みます。ファイルが見つからない場合や、pandas で読み込みに失敗した場合に、分かりやすいエラーメッセージを生成します。

  • validate_required_columns(df: pd.DataFrame, required_columns: list[str], label: str) -> None:

    • データフレーム df が指定された required_columns をすべて含んでいるか検証します。不足している列がある場合、ValueError を発生させます。

数値計算ヘルパー

  • calculate_local_slope_by_linear_fit(df: pd.DataFrame, x_series: pd.Series, y_series: pd.Series, half_window: int = 1) -> list[float]:

    • 各データ点の周囲の点(half_window で指定される範囲)を使用して、y = a*x + b の線形フィットにより局所勾配を計算します。これは、元のスクリプトの slope3dataslope7data に相当する機能です。

  • intercept_x(x: float, y: float, slope: float) -> float:

    • 与えられた点 (x, y) と勾配 slope を持つ直線のX軸切片を計算します。

  • calculate_vth_by_max_slope(vg_series: pd.Series, y_series: pd.Series, slope_series: pd.Series) -> tuple[float, float, float]:

    • 最大勾配接線法を用いてしきい値電圧 (Vth) を計算します。y_series はIdまたは sqrt(Id) のいずれかです。

  • calculate_ion_ioff(id_series: pd.Series, ioff_threshold: float) -> tuple[float, Optional[float], Optional[float]]:

    • オン電流 (Ion)、オフ電流 (Ioff)、およびIon/Ioff比を計算します。Ioff は、0 < Id < ioff_threshold の範囲の電流値の平均として推定されます。

  • first_index_at_or_above(series: pd.Series, threshold: float) -> Optional[int]:

    • 数値系列 series の値が初めて指定された threshold 以上になる最初のインデックスを返します。条件を満たす点がない場合は None を返します。

  • safe_inverse(value: float) -> float:

    • value の逆数 1/value を計算します。valueNaN または 0 の場合、NaN を返します。

TFT解析ロジック

  • analyze_idvg_sat(df: pd.DataFrame, config: AnalysisConfig) -> IdVgResult:

    • 飽和領域のId-Vgデータを解析します。負または非正の Id 値は NaN に変換され、log10(Id)sqrt(Id) が計算されます。sqrt(Id) の勾配は移動平均で平滑化され、飽和移動度、Vth、SS、Ionが計算されます。

  • analyze_idvg_lin(df: pd.DataFrame, config: AnalysisConfig) -> IdVgResult:

    • 線形領域のId-Vgデータを解析します。負または非正の Id 値は NaN に変換されます。Idlog10(Id) の勾配が計算され、Id 勾配は移動平均で平滑化されます。電界効果移動度、Vth、SS、Ionが計算されます。

  • analyze_idvd_lin(df: pd.DataFrame, vth: float, config: AnalysisConfig) -> IdVdResult:

    • 線形領域のId-Vdデータを解析します。この関数はコードには存在しますが、現在のスクリプトの主要な実行フロー (run() 関数) からは呼び出されていません。VdId の勾配を計算し、電界効果移動度 (mueff) を導出します。

プロット

  • plot_idvg_lin(df: pd.DataFrame, vth: float, max_slope: float, output_path: str) -> None:

    • 線形領域のId-Vgプロットと、最大勾配接線を含むグラフをPNG画像として保存します。

  • plot_root_idvg(df: pd.DataFrame, vth: float, max_slope: float, output_path: str) -> None:

    • 飽和領域の sqrt(Id)-Vgプロットと、最大勾配接線を含むグラフをPNG画像として保存します。

結果出力

  • output_path(output_dir: str, filename: str) -> str:

    • 指定された出力ディレクトリとファイル名から完全な出力ファイルパスを構築します。

  • write_summary_outputs(sat: IdVgResult, lin: IdVgResult, output_dir: str) -> None:

    • output.csvoutput_log.csv の2つの要約CSVファイルを出力します。output_log.csv では、特定のパラメータが log10 変換されます。元のスクリプトとの互換性を保つために、列名は変更されません。

CLI関連

  • parse_args(argv: Optional[list[str]] = None) -> argparse.Namespace:

    • コマンドライン引数を解析し、argparse.Namespace オブジェクトを返します。

  • validate_config(config: AnalysisConfig) -> None:

    • AnalysisConfig オブジェクト内の設定値 (cox, channel_width, rolling_window, target_current, ioff_threshold) が有効な値であることを検証します。無効な値の場合、ValueError を発生させます。

  • run(args: argparse.Namespace) -> None:

    • 解析ワークフロー全体を実行するメイン関数です。入力ファイルの読み込み、TFT解析関数の呼び出し、中間データと結果の保存、グラフのプロット、コンソールへの主要な結果の出力を行います。

  • main(argv: Optional[list[str]] = None) -> int:

    • スクリプトのコマンドラインエントリポイントです。引数解析、ロギング設定、run() 関数の呼び出しを処理し、エラーが発生した場合には適切な終了コードを返します。

非標準ライブラリ

このスクリプトは以下の非標準ライブラリを使用しています。

  • numpy

  • pandas

  • matplotlib

  • sklearn (scikit-learn)