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.xlsx、IdVg-Vd10.xlsx出力ファイル:
IdVg-Vd10_analyze.csv、IdVg-Vd0.1_analyze.csv、output.csv、output_log.csv、rootIdVg.png、IdVg_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.xlsx と IdVg-Vd10.xlsx を入力として使用し、結果を output_data ディレクトリに出力します。
入出力ファイル
入力ファイル
スクリプトは、以下の2つのExcelファイルを入力として期待します。
線形領域データファイル (デフォルト:
IdVg-Vd0.1.xlsx、--linで指定):必須列:
Vg(ゲート電圧),Vd(ドレイン電圧),Id(ドレイン電流)ファイル形式: Excel (
.xlsx)
飽和領域データファイル (デフォルト:
IdVg-Vd10.xlsx、--satで指定):必須列:
Vg(ゲート電圧),Id(ドレイン電流)ファイル形式: Excel (
.xlsx)
入力ファイルにこれらの必須列が含まれていない場合、ValueError が発生します。
出力ファイル
スクリプトは、指定された出力ディレクトリ (デフォルト: カレントディレクトリ) に以下のファイルを生成します。
IdVg-Vd10_analyze.csv:飽和領域の解析結果を含む詳細なCSVファイルです。元の
Vg、Idに加えて、Id_rm(負のIdをNaNに置換したもの)、logId、rootId、各種勾配 (slope logId,slope rootId,slope rootId smooth)、および飽和移動度muSATの計算値が含まれます。
IdVg-Vd0.1_analyze.csv:線形領域の解析結果を含む詳細なCSVファイルです。元の
Vg、Vd、Idに加えて、Id_rm、logId、各種勾配 (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_SAT、Ion_SAT、SS_LIN、Ion_LINの値はlog10変換されたものです。
rootIdVg.png:飽和領域の
sqrt(Id)対Vgプロットです。最大勾配接線が赤線で重ねて表示されます。
IdVg_LIN.png:線形領域の
Id対Vgプロットです。最大勾配接線が赤線で重ねて表示されます。
プログラムの設計
主要なデータ構造
スクリプトは、データクラス (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の線形フィットにより局所勾配を計算します。これは、元のスクリプトのslope3dataやslope7dataに相当する機能です。
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を計算します。valueがNaNまたは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に変換されます。Idとlog10(Id)の勾配が計算され、Id勾配は移動平均で平滑化されます。電界効果移動度、Vth、SS、Ionが計算されます。
analyze_idvd_lin(df: pd.DataFrame, vth: float, config: AnalysisConfig) -> IdVdResult:線形領域のId-Vdデータを解析します。この関数はコードには存在しますが、現在のスクリプトの主要な実行フロー (
run()関数) からは呼び出されていません。VdとIdの勾配を計算し、電界効果移動度 (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.csvとoutput_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()関数の呼び出しを処理し、エラーが発生した場合には適切な終了コードを返します。
非標準ライブラリ
このスクリプトは以下の非標準ライブラリを使用しています。
numpypandasmatplotlibsklearn(scikit-learn)