analyze_2layer_Hall_excel プログラム仕様
analyze_film_hall_excel.py
Excel にまとめた基板単体 (sub) と薄膜+基板 (tot) の Hall 測定結果から、 2層モデルで薄膜 (film) の有効 Hall 物性を計算する。
- 使い方:
python analyze_film_hall_excel.py input.xlsx python analyze_film_hall_excel.py input.xlsx -o output.xlsx python analyze_film_hall_excel.py input.xlsx --sheet Sheet1
- 標準出力:
{inputのstem}_analyzed.xlsx
- 前提:
基板、薄膜は同じ carrier type として扱う。
RH は符号なしの大きさとして扱う。 ユーザ側で n 型を正に統一した表を入力する想定。
density 計算では abs(RH_sheet) を使う。
tot の RH_total は、装置に入力した厚さ thickness_tot_cm を使って 体積 Hall 係数 [cm^3/C] に換算済みの値として扱う。 このスクリプトでは、入力表の d_film[um] を thickness_tot_cm として使う。
- 必要な列名の例:
T[K] d_sub[mm] d_film[um] G_sub[S/sq] RH_sub[cm3/C] G_tot[S/sq] RH_total[cm3/C]
- 出力シート:
analyzed_wide : 1行 = 1温度。sub/tot/film を横持ちで出力。 analyzed_long : 1行 = 1温度 x 1 layer。プロットやピボット向き。 README_Hall : 使った式と列の説明。
- 関連リンク:
- electrical.analyze_2layer_Hall_excel.analyze_two_layer_row(*, T_K: float | None, thickness_sub_cm: float, thickness_film_cm: float, G_sub: float, RH_sub_volume: float, G_tot: float, RH_tot_volume: float, source_sheet: str, source_row: int, optional_input: Dict[str, float | None] | None = None) Tuple[Dict[str, Any], List[Dict[str, Any]]][ソース]
2層ホールモデルを用いて、Excelの1行分の測定データから薄膜のホール物性を解析する。
- 概要:
基板 (sub) と薄膜+基板 (tot) のHall測定値から、 薄膜 (film) のシートコンダクタンス、シートホール係数、移動度、キャリア密度などを計算します。
- 詳細説明:
入力された体積Hall係数をシートHall係数に変換し、2層ホールモデルの式に基づいて 薄膜の物性を抽出します。計算結果は、ワイド形式 (1行にsub/tot/filmを横並び) と ロング形式 (1行に1層の物性) の2種類の辞書リストとして返されます。 G_filmが0以下の場合など、計算が困難な場合には警告が生成されます。
- 引数 (Parameters):
- param T_K:
温度 [K]。
- param thickness_sub_cm:
基板の厚さ [cm]。
- param thickness_film_cm:
薄膜の厚さ [cm]。
- param G_sub:
基板のシートコンダクタンス [S/sq]。
- param RH_sub_volume:
基板の体積Hall係数 [cm^3/C]。
- param G_tot:
全体(薄膜+基板)のシートコンダクタンス [S/sq]。
- param RH_tot_volume:
全体(薄膜+基板)の体積Hall係数 [cm^3/C]。
- param source_sheet:
元データのシート名。
- param source_row:
元データの行番号。
- param optional_input:
オプションの入力データを含む辞書。G_film_inputなどの比較用データ。
- 戻り値 (Returns):
- returns:
(wide_row, long_rows) のタプル。 wide_row: 全ての計算結果と入力値を1行にまとめた辞書。 long_rows: 各層(sub, tot, film)の計算結果をそれぞれ1行とした辞書のリスト。
- 例外:
ValueError -- thickness_sub_cm または thickness_film_cm が正でない場合。
- electrical.analyze_2layer_Hall_excel.analyze_workbook(input_path: Path, output_path: Path, sheet_name: str | None = None) Tuple[int, int][ソース]
入力Excelファイルから2層ホールデータを読み込み、解析し、結果を新しいExcelファイルに書き出す。
- 概要:
指定されたExcelファイルからホール測定データを読み込み、各行に対して2層ホールモデル解析を実行し、 解析結果をワイド形式、ロング形式、およびREADMEを含む新しいExcelファイルに出力します。
- 詳細説明:
input_path で指定されたExcelブックを読み込み、sheet_name で指定されたシート(または最初のシート)から iter_data_rows を使ってデータを抽出します。 各データ行は analyze_two_layer_row によって解析され、結果は wide_rows と long_rows に収集されます。 解析が失敗した行はスキップされ、警告メッセージが生成されます。 最終的に、output_path に指定されたExcelファイルに3つの新しいシート (analyzed_wide, analyzed_long, README_Hall) として結果が書き込まれます。既存の同名シートは上書きされます。
- 引数 (Parameters):
- param input_path:
入力Excelファイルのパスオブジェクト。
- param output_path:
出力Excelファイルのパスオブジェクト。
- param sheet_name:
解析対象のシート名(Noneの場合は最初のシートが使用されます)。
- 戻り値 (Returns):
- returns:
(解析された行数, スキップされた行数) のタプル。
- 例外:
KeyError -- 指定されたシート名が見つからない場合。
- electrical.analyze_2layer_Hall_excel.density_from_rh_sheet(rh_sheet_cm2_c: float | None) float | None[ソース]
シートホール係数からシートキャリア密度を計算する。
- 概要:
シートホール係数 RH_sheet [cm^2/C] からシートキャリア密度 n_sheet [cm^-2] を計算します。
- 詳細説明:
n_sheet = 1 / (e * |RH_sheet|) の式を使用します。ここで e は電気素量 E_CHARGE です。 rh_sheet_cm2_c がNoneまたはゼロの場合はNoneを返します。
- 引数 (Parameters):
- param rh_sheet_cm2_c:
シートホール係数 [cm^2/C]。
- 戻り値 (Returns):
- returns:
計算されたシートキャリア密度 [cm^-2]、またはNone。
- electrical.analyze_2layer_Hall_excel.find_col(header_map: Dict[str, int], candidates: Iterable[str], required: bool = True) int | None[ソース]
指定された候補リストに基づいてヘッダーマップから列インデックスを検索する。
- 概要:
与えられたヘッダーマップと列名の候補リストを使用して、 該当する列の1ベースのインデックスを検索します。
- 詳細説明:
candidates リスト内の各候補名に対し、生の小文字名と正規化された名前の両方で header_map を検索します。 required がTrueで列が見つからない場合、KeyError を発生させます。 required がFalseで列が見つからない場合はNoneを返します。
- 引数 (Parameters):
- param header_map:
make_header_map で作成されたヘッダーマッピング辞書。
- param candidates:
検索する列名の候補のリスト。
- param required:
列が必須であるかを示すブール値。Trueの場合、見つからないとKeyErrorが発生します。
- 戻り値 (Returns):
- returns:
見つかった列の1ベースのインデックス、または見つからずrequired=Falseの場合はNone。
- 例外:
KeyError -- required=Trueで列が見つからない場合。
- electrical.analyze_2layer_Hall_excel.initialize() Namespace[ソース]
コマンドライン引数を解析する。
- 概要:
スクリプトの実行に必要なコマンドライン引数を定義し、解析します。
- 詳細説明:
入力Excelファイルのパスは必須です。 出力Excelファイルのパスと解析対象のシート名はオプションです。 出力パスが指定されない場合、入力ファイル名に基づいて自動生成されます。 ヘルプメッセージはスクリプトの目的を説明します。
- 引数 (Parameters):
なし
- 戻り値 (Returns):
- returns:
解析されたコマンドライン引数を格納する argparse.Namespace オブジェクト。
- electrical.analyze_2layer_Hall_excel.iter_data_rows(ws_values) Iterable[Tuple[int, Dict[str, Any]]][ソース]
指定 worksheet からデータ行を辞書として返す。
- 概要:
OpenPyXLのワークシートオブジェクトから、ヘッダーを解釈してデータ行を辞書の形でイテレートします。
- 詳細説明:
ワークシートの最初の行をヘッダーとして読み込み、make_header_map と find_col を使用して 必要な列とオプションの列を特定します。 各データ行は辞書として抽出され、to_float 関数によって値が浮動小数点数に変換されます。 完全に空の行はスキップされます。
- 引数 (Parameters):
- param ws_values:
読み込むOpenPyXLのワークシートオブジェクト。
- 戻り値 (Returns):
- returns:
(行番号, データ辞書) のタプルのIterable。
- electrical.analyze_2layer_Hall_excel.main() None[ソース]
スクリプトのエントリーポイント。
- 概要:
コマンドライン引数の解析、入力ファイルの検証、およびホール解析ワークフロー全体を実行します。
- 詳細説明:
initialize 関数を呼び出して引数を取得し、入力ファイルの存在を確認します。 出力ファイルのパスが指定されていない場合は、入力ファイル名から自動生成します。 analyze_workbook 関数を呼び出してExcel解析を実行し、 処理された行数とスキップされた行数を標準出力に表示します。
- 引数 (Parameters):
なし
- 戻り値 (Returns):
- returns:
None
- 例外:
SystemExit -- 入力ファイルが見つからない場合。
- electrical.analyze_2layer_Hall_excel.make_header_map(header_row: Iterable[Any]) Dict[str, int][ソース]
ヘッダー行から正規化された列名と1ベースの列インデックスのマッピングを生成する。
- 概要:
Excelのヘッダー行を受け取り、各列の生の小文字名と正規化された名前をキーとして、 対応する1ベースの列インデックスを値とする辞書を作成します。
- 詳細説明:
normalize_header 関数を使用して列名を正規化し、ヘッダーマップに格納します。 同じ正規化名が存在する場合、最初に見つかった列のインデックスが採用されます。
- 引数 (Parameters):
- param header_row:
Excelのヘッダー行のセル値のIterable。
- 戻り値 (Returns):
- returns:
正規化列名または小文字列名から1ベースの列インデックスへのマッピング辞書。
- electrical.analyze_2layer_Hall_excel.normalize_header(s: Any) str[ソース]
Excelの列名を正規化し、ゆらぎを吸収する。
- 概要:
Excelの列名に含まれる可能性のある表記のゆらぎ(大文字小文字、特殊文字、スペースなど)を吸収し、 標準的な形式に正規化します。
- 詳細説明:
前後の空白を削除し、文字列を小文字に変換します。 全角/半角の「μ」「µ」を「u」に、全角/半角のハイフンを半角ハイフンに統一します。 スペース、アンダースコア、括弧、スラッシュなどの区切り文字を削除します。
- 引数 (Parameters):
- param s:
正規化する列名の文字列。
- 戻り値 (Returns):
- returns:
正規化された列名の文字列。
- electrical.analyze_2layer_Hall_excel.remove_sheet_if_exists(wb, name: str) None[ソース]
ワークブックから指定された名前のシートが存在すれば削除する。
- 概要:
OpenPyXLのワークブックから、指定された名前のシートが存在する場合に削除します。
- 詳細説明:
主に、新しい解析結果シートを書き込む前に、以前のシートをクリーンアップするために使用されます。 シートが存在しない場合は何も行いません。
- 引数 (Parameters):
- param wb:
処理対象のOpenPyXLワークブックオブジェクト。
- param name:
削除するシートの名前。
- 戻り値 (Returns):
- returns:
None
- electrical.analyze_2layer_Hall_excel.safe_div(num: float | None, den: float | None) float | None[ソース]
ゼロ除算やNone値入力を安全に処理する浮動小数点数の除算。
- 概要:
分子または分母がNoneの場合、あるいは分母がゼロの場合にNoneを返します。
- 詳細説明:
浮動小数点数の除算 num / den を行いますが、numまたはdenがNoneの場合、 あるいはdenが0の場合には ValueError や ZeroDivisionError を発生させず、 代わりにNoneを返します。
- 引数 (Parameters):
- param num:
分子となる数値。
- param den:
分母となる数値。
- 戻り値 (Returns):
- returns:
除算結果の浮動小数点数、またはNone(計算不能な場合)。
- electrical.analyze_2layer_Hall_excel.to_float(value: Any) float | None[ソース]
Excel cell value を float に変換する。#N/A, 空欄などは None。
- 概要:
Excelのセル値を安全に浮動小数点数に変換します。
- 詳細説明:
None、空文字列、"#N/A"などのエラー値、NaN、InfをNoneとして処理します。 数値形式のゆらぎ(カンマ、全角マイナスなど)も吸収します。
- 引数 (Parameters):
- param value:
変換するExcelのセル値。
- 戻り値 (Returns):
- returns:
変換された浮動小数点数、またはNone(変換不能な場合)。
- electrical.analyze_2layer_Hall_excel.write_readme(ws) None[ソース]
2層ホール解析のREADMEシートをExcelワークシートに書き込む。
- 概要:
2層ホール解析に関する前提、使用される方程式、および出力シートの説明を含むREADME情報を、 OpenPyXLワークシートに書き込みます。
- 詳細説明:
シートのタイトルとセクションタイトルにスタイルが適用され、 テキストは折り返し表示されるように設定されます。
- 引数 (Parameters):
- param ws:
書き込み先のOpenPyXLワークシートオブジェクト。
- 戻り値 (Returns):
- returns:
None
- electrical.analyze_2layer_Hall_excel.write_table(ws, rows: List[Dict[str, Any]], title: str | None = None) None[ソース]
辞書リストをExcelワークシートに書き込み、基本的なスタイルを設定する。
- 概要:
辞書のリストをOpenPyXLのワークシートにテーブル形式で書き込み、 読みやすいように基本的なスタイル(ヘッダー、数値フォーマット、列幅など)を設定します。
- 詳細説明:
辞書リストの最初の辞書のキーをヘッダーとして使用し、各辞書の値をデータ行として書き込みます。 オプションでタイトル行を追加できます。 ヘッダー行は太字、背景色付きで中央揃えに、データ行は数値に応じて適切なフォーマット(例: 科学表記)が適用されます。 フィルタ、フリーズペイン、自動列幅調整も行われます。
- 引数 (Parameters):
- param ws:
書き込み先のOpenPyXLワークシートオブジェクト。
- param rows:
書き込むデータの辞書リスト。
- param title:
テーブルのタイトルとして使用する文字列(オプション)。
- 戻り値 (Returns):
- returns:
None