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 : 使った式と列の説明。

関連リンク:

analyze_2layer_Hall_excel.py

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_rowslong_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_mapfind_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の場合には ValueErrorZeroDivisionError を発生させず、 代わりに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