Pythonで膜厚フィッティング（準備編）

このページはPythonで膜厚フィッティングするための数学的準備編です。
python実装編は[こちら](https://qiita.com/utyuuseimeitai/items/ad1e7af8b7d4bbb70371)。
Pythonのコードは一切でてこないので、コードだけみたくば実装編から見ると良いと思います。
# やりたいこと
以下の図のような状況で膜厚を算出したい。
![cell_structure.png](https://qiita-image-store.s3.amazonaws.com/0/228689/534822d5-c632-23a6-385b-f20d69e56d13.png)
これから説明する膜厚フィッテイング法は容易に多重膜の場合にも拡張することができるが、
まずは厚いガラスに挟まれた単一の膜の厚みを算出することから始めよう。
ここでガラスの厚みは0.1mm<の十分な厚みをもつものとしよう。
（つまり、ガラスによって生じる干渉は無視できるものとする。理由は後述）
さらにガラスの屈折率と、Thin Filmの屈折率は既知であるとしよう。

# 測定系と記号の説明
以下のような測定系を想定する。この図は透過スペクトルを利用する場合であるが、反射スペクトルを利用することも可能だ。その場合はdetectorが光源と同じ側に来る。
![measurement_system.png](https://qiita-image-store.s3.amazonaws.com/0/228689/b94284b1-650a-e180-68bb-b50a5de193dd.png)
光源は無偏光白色光源を想定している。
ここで、
$\theta_{in}$は入射媒体から入射側ガラスへの入射角、
$\theta_0$は入射側ガラスから薄膜への入射角、
$\theta_1$は薄膜から出射側ガラスへの入射角、
$\theta_2$は出射側ガラスから出射媒体への入射角、
となっている。また、
$n_{in}$は入射媒体の屈折率、
$n_0$は入射側ガラスの屈折率、
$n_1$は薄膜の屈折率、
$n_2$は出射側ガラスの屈折率、
である。
このような測定系で光源として無偏光白色光源を使用したときに得られるスペクトルの例を示そう。
![transmittance.png](https://qiita-image-store.s3.amazonaws.com/0/228689/ed153845-079b-8df1-f629-3f856426e445.png)
これは、屈折率1.5のガラスの間に厚さ5ミクロンの空隙（つまり空気層）のあるセルを上の測定系で測定したものだ。セルは光軸に対して傾いていない。明らかに波長に対して透過率が変調しているのがわかる。また、変調の周期は波長が短くなるほど小さくなる。これが、薄膜の多重干渉の特徴だ。

# 多重干渉を考慮した透過スペクトルの導出
この節は全面的に[エクセルで多層膜干渉!!] (http://www.syoshi-lab.sakura.ne.jp/excelde/excelde.html)の計算原理を参照した。というか、このページからダウンロードできるエクセルシートでソルバーを使ってフィッティングすればいいという話だ。ただ、経験上ソルバーは多変数かつ非線形なフィッティングではかなり初期値に鋭敏で使いづらい印象があるのでpythonでやりたい。実践編で説明するけれども、今回のフィッテイング方法では膜厚の初期値の推定も行っている。そのため広い膜厚の範囲で、初期値を気にせずフィッティングすることが可能だ。
まず、透過スペクトルを記述する式の説明に入る前に、s偏光とp偏光の説明をしよう。
![sp_polarized2.png](https://qiita-image-store.s3.amazonaws.com/0/228689/7e956973-3b39-8b14-9c21-0183a3adcb36.png)
ここで、入射面とは入射光線と反射光線を含む面のことを指す。
s偏光とは、電場の振動方向が入射面に直交しているような直線偏光であり、
p偏光とは、電場の振動方向が入射面に平行であるような直線偏光である。
一般にs偏光が入射した時と、p偏光が入射した時の透過スペクトルは異なるものとなる。
(このスペクトル差を利用して、対象膜の屈折率、膜厚を同時に求める事のできる方法がエリプソメトリーである。)
さて、これらs偏光とp偏光が先程の測定系に従ってセルに入射したとき、多重干渉を考慮した透過スペクトルは以下のように表される。(式の導出を知りたくば[リンク先](http://www.syoshi-lab.sakura.ne.jp/excelde/principle.pdf)をどうぞ)
s偏光の透過率$T_s$は

```math
T_s=\left| \frac{t_{1s}t_{2s}\exp(\frac{-i\delta}{2})}{1+r_{1s}r_{2s}\exp(-i\delta)}\right|^2
```
ここで、$t_{1s}$、$t_{2s}$、$r_{1s}$、$r_{1s}$は、

```math
t_{1s}=\frac{2n_0\cos\theta_0}{n_1\cos\theta_1+n_0\cos\theta_0}\qquad\qquad
t_{2s}=\frac{2n_1\cos\theta_1}{n_2\cos\theta_2+n_1\cos\theta_1} 
```
```math
r_{1s}=\frac{n_1\cos\theta_1-n_0\cos\theta_0}{n_1\cos\theta_1+n_0\cos\theta_0}\qquad\qquad
r_{2s}=\frac{n_2\cos\theta_2-n_1\cos\theta_1}{n_2\cos\theta_2+n_1\cos\theta_1} 
```
である。また、p偏光の透過率$T_p$は、

```math
T_p=\left| \frac{t_{1p}t_{2p}\exp(\frac{-i\delta}{2})}{1+r_{1p}r_{2p}\exp(-i\delta)}\right|^2
```
ここで、$t_{1p}$、$t_{2p}$、$r_{1p}$、$r_{1p}$は、

```math
t_{1p}=\frac{2n_0\cos\theta_0}{n_1\cos\theta_0+n_0\cos\theta_1}\qquad\qquad
t_{2p}=\frac{2n_1\cos\theta_1}{n_2\cos\theta_1+n_1\cos\theta_2} 
```
```math
r_{1p}=\frac{n_0\cos\theta_1-n_1\cos\theta_0}{n_1\cos\theta_0+n_0\cos\theta_1}\qquad\qquad
r_{2p}=\frac{n_1\cos\theta_2-n_2\cos\theta_1}{n_2\cos\theta_1+n_1\cos\theta_2} 
```
である。また$\exp$の中の$\delta$は薄膜を往復したときの光の位相の遅れであり、

```math
\delta = \left(\frac{4\pi}{\lambda}\right)n_1d\cos\theta_1
```
である。$\lambda$は光の波長で、$d$が求めたい薄膜の膜厚である。
光源が無偏光な場合の時の透過率$T$は$T_s$と$T_p$の平均として

```math
T = \frac{T_s+T_p}{2}
```
で表される。
説明しておくと、$t_{1s}$はs偏光が屈折率$n_0$の物体(入射側ガラス)から、屈折率$n_1$の物体(薄膜)に入るときの振幅透過率、
$r_{1s}$はs偏光が屈折率$n_0$の物体(入射側ガラス)から、屈折率$n_1$の物体(薄膜)に入るときの振幅反射率、
$t_{2s}$はs偏光が屈折率$n_1$の物体(薄膜)から、屈折率$n_2$の物体(出射側ガラス)に入るときの振幅透過率、
$r_{2s}$はs偏光が屈折率$n_1$の物体(薄膜)から、屈折率$n_2$の物体(出射側ガラス)に入るときの振幅反射率を示し、いわゆるフレネルの式である。添字がpの時は、p偏光に関するものというだけで、内容は上と同様だ。
また、スネルの法則から$\theta_{in}$、$\theta_0$、$\theta_1$、$\theta_2$の関係を示しておこう。

```math
n_{in}\sin\theta_{in}=n_0\sin\theta_0=n_1\sin\theta_1=n_2\sin\theta_2 
```
以上が、多重干渉を考慮した透過スペクトルの算出に必要な式だ。なお、これらの式では屈折率を定数としているが、波長分散を考慮する際には$n(\lambda)$と考えてやればよい。
#　透過スペクトルのシミュレーション
これらの式を使って、いくつかの膜厚について透過スペクトルを算出してみよう。波長分散は考慮せず、屈折率は定数であるものとする。
## 1. 膜厚と透過スペクトルの関係
まず、光源はs偏光であって、セルは光軸から傾いてないとする。
つまり$\theta_{in}=\theta_0=\theta_1=\theta_2=0$としよう。
また$n_{in}=n_1=1$、$n_0=n_2=1.5$とする。
この場合において、セル厚が0.3um、3um、30um、300umの時の透過スペクトルは下のようになる。
![cell_thichness_calc.png](https://qiita-image-store.s3.amazonaws.com/0/228689/f3d9e0bf-9fcf-6fdc-8cfd-155a75483cc7.png)
このように、膜厚が大きくなるほど、透過率の変調は激しくなり、サブミリサイズになると、汎用的なdetectorの波長分解能では変調に追随できなる。その結果、波長に依らないフラットな透過率低下として見えてくるようになる。冒頭でガラスが十分な厚みをもつ時に、ガラスによる干渉は無視できると言ったのはそういうわけだ。これは透過率の（波長に依らない一様な）低下は起きるけれども、変調は見えないのでフィッティングの際は無視して良い、という意味だった。また、図から明らかなように、サブミクロンサイズになると可視域で透過率の変調が一周期もしなくなる。測りたい膜厚の吸収特性(消衰係数)が既知ならよいが、そうでない場合は吸収特性と干渉による透過率変調の区別がつかなくなるのでフィッティングは厳しくなる。
このような場合は、UV領域やIR領域などの可視外領域を利用するか、一般的なのはセルを傾けることで透過率の変調周期を長くするなどして工夫する。
## 2. s偏光とp偏光の透過スペクトルの関係
次に、s偏光とp偏光の透過スペクトルの違いを確認しよう。
屈折率は、先程と同様に$n_{in}=n_1=1$、$n_0=n_2=1.5$としよう。
さらに、セル厚は3umとしよう。
今回はセルと光軸のなす角度を色々と変えてみる。
(下の図では$\theta_{in}$ではなく$\theta_0$を変えているが、これはシミュレーションのやりやすさからそうしています。)
この場合のs偏光とp偏光の透過スペクトルはこんな感じだ。
![angle_p_s_difference_calc.png](https://qiita-image-store.s3.amazonaws.com/0/228689/46373d42-57f6-dd92-cb16-d38b74ae6b60.png)
まず、この図からわかることとしては$\theta_0=0$、つまりセルが光軸から傾いていない時、s偏光とp偏光の透過スペクトルは一致するということだ。これは、特に理由がない限り、セルを光軸から傾けない配置にしとけば、s偏光について計算するだけで透過スペクトルが求まるということだ。
しかし、$\theta$が大きくなるにつれて、s偏光とp偏光の透過スペクトルは離れていくが、変調の極大の位置と極小の位置は両者で一致する。これは、特に透過スペクトルの絶対値を問題にしないのならば、s偏光をつかってもp偏光を使ってもフィッティング可能だということだ。
さらに$\theta$が大きくなると、ある角度でp偏光による透過率変化はゼロになりそうだ。この時の角度がいわゆるブリュースター角だ。ブリュースター角より大きくなると、p偏光による透過率変化は増加していく。
また、他にわかることとして、$\theta$が大きくなるにつれて、透過率の変調周期が長くなっていくのが確認できる。
## 3. 薄膜の屈折率と透過スペクトルの関係
最後に、薄膜の屈折率が変わっていった時に、どのように透過スペクトルが変わっていくかを確認しよう。
今回は、光源はs偏光であって、セルは光軸から傾いていないとする。
薄膜以外の屈折率は、$n_0=n_2=1.5$としよう。
また薄膜の厚みは3umとしよう。
この場合の透過スペクトルは以下のようになる。（縦軸のスケールに注意）
![refractive_index_difference.png](https://qiita-image-store.s3.amazonaws.com/0/228689/68016f9d-f188-a2c3-9e22-c6f78328d68a.png)
この図からわかることとしては、薄膜の屈折率がガラスの屈折率と近くなるほど、透過率の変調の振幅は小さくなり、屈折率が一致する極限では透過率は変化しなくなる。なので見たい薄膜と薄膜と接しているガラスなり空気なりの屈折率の差が小さい場合は、フィッティングが大変になることが多い。そんな時は、セルを光軸から傾けて、変調の振幅を大きくしてやればよい。

# おわりに
以上、pythonで膜厚のフィッティングを行うための数学的準備を行った。ダラダラと長く書いてしまったが、実践時に重要なことは以下のポイントだ。

+ 厚いガラスで挟まれた薄膜では、ガラスの干渉は無視できる
+ s偏光とp偏光では透過スペクトル変調の極大と極小の位置が一致するので、どちらか一方を使えば良い。
+ なんにも工夫せずに、楽にフィッティングできる範囲は数ミクロンから数十ミクロンの間である。
+ サブミクロン領域では、薄膜の吸収特性を知っていればフィッティングできる。そうでない場合は、UV領域のスペクトルを取るなど工夫する。
+ 数百ミクロンの場合は、セル厚をかたむけて変調の周期を小さくして対応する。またはIR領域のスペクトルをとるなど工夫する。

[実践編](https://qiita.com/utyuuseimeitai/items/ad1e7af8b7d4bbb70371)ではこれらのことを踏まえてpythonで実装を行う。