Igorマクロの墓場†┌┘墓└┐† ~比熱の理論曲線~

泣いているマクロ

むか〜〜〜〜〜〜し作って、使わなくなったマクロの泣き声が聞こえる...😢(クスンクスン)

比熱を解析するとき、デバイモデルを実験データにフィッティングし、そこから電子比熱の寄与を引き出すことがある。6,7年前に、3つのアインシュタインモデルと、2つのデバイモデルをフィットしたいということで、そのモデルに基づいた比熱の理論曲線をつくるマクロを組んだ。この論文みたいなことをやりかった*1。ただ、低温実験をやっていると、室温から100 Kまでの温度域の比熱測定をそんな頻繁にすることがないので、1回だけ使って以来、ずっとパソコンに眠っていた。

そんな過去に葬り去ったマクロを、今日も今日とて供養供養✝️ 🙏

マクロはページの末尾に示したので、コピーして、Procedureにペーストして、コンパイルすればOK😉

コンパイルして、Macros>Debye_and_Einsterin_modelsを選択すると、図1のパネルが現れる。Igorのバージョンの違い、OSの違いによってレイアウトが崩れるらしいけど、そのときは心を研ぎ澄まして🥺

図1  パネルマクロ😊

左の欄は上からアインシュタイン温度1,2,3とデバイ温度1,2で、右の欄は左欄のモデルに対応した振動子の数だよ❗️

とりあえずContinueを押してみよっか❗️❓

...................

...................

...................

...................

...................

...................

...................

...................

...................

...................

なにも起きないね😭

じゃあ次は下の欄を見てみようか😉

Allを押してみて❗️❗️

図2 比熱のいろんなグラフ

たくさんグラフが出てきた😲🫢

左から比熱Cの温度T依存性、C/TのT依存性、一番右が格子比熱をT3で割ったもののT依存性。

あとは、適当にパラメータいじって遊んでみよっか❓❓

あまり注意点はないけど、左の欄のそれぞれのモデルの温度を0にセットすれば、そのモデルの比熱は0になるよ。

だから2つのデバイモデルだけでいいのにな〜〜〜と思ったら、アインシュタインモデルの温度は全部0を入力すれば OK

過去に葬り去られた理由

学生から、「今の時代PythonとかJuliaを使えば、ちゃんとフィットしてくれるんで、わざわざ手でぽちぽちすることないですよ」と言われて、必要性を感じなくなったからっていうのもある。

マクロ~これ以外の方法が思い浮かばないよね~

#pragma TextEncoding = "UTF-8"

#pragma rtGlobals=3 // Use modern global access method and strict wave access.

 

Menu "Macros"

"Debye_and_Einsterin_models", Folder_DandE_models()

end

 

Function  Folder_DandE_models()

if (!DataFolderExists("root:Debye_and_Einstein_models"))

String SaveDF = GetDataFolder(2)

SetDataFolder root:

NewDataFolder/O/S Debye_and_Einstein_models

Make/N=300/D Temp_K, sq_Temp_K2, cu_Temp_K3

Make/N=300/D SH_E1, SH_E1_Temp, SH_E1_Temp3

Make/N=300/D SH_E2, SH_E2_Temp, SH_E2_Temp3

Make/N=300/D SH_E3, SH_E3_Temp, SH_E3_Temp3

Make/N=300/D SH_D1, SH_D1_Temp, SH_D1_Temp3

Make/N=300/D SH_D2, SH_D2_Temp, SH_D2_Temp3

Make/N=300/D SH_total, SH_total_TempK, SH_total_Temp3

Temp_K=10^(log(0.1)+p*(log(300)-log(0.1))/299)

cu_Temp_K3=Temp_K^3

sq_Temp_K2=Temp_K^2

Make/N=100000/D D_func, thetaD_Temp

SetScale/I x 0,50,"", D_func,thetaD_Temp

D_func=x^4*exp(x)*(exp(x)-1)^(-2)

D_func[0]=0

Integrate/METH=1 D_func/D=thetaD_Temp

Variable/G gas_const=8.314462618

Variable/G ET1=30

Variable/G ET2=50

Variable/G ET3=70

Variable/G DT1=300

Variable/G DT2=150

Variable/G nE1=1

Variable/G nE2=0.5

Variable/G nE3=0.1

Variable/G nD1=4

Variable/G nD2=2

 

SetDataFolder saveDF

endif

D_and_E_fit_panel()

end

 

Function  D_and_E_fit_panel()

PauseUpdate; Silent 1 // building window...

NewPanel /K=1 /W=(1168,462,1443,709) as "D and E model"

DrawLine 6,170,269,170

SetDrawEnv fsize= 16

DrawText 95,191,"New Graph"

SetVariable ET1,pos={8.00,5.00},size={128.00,26.00},bodyWidth=98,title="\\Z16\\f02T\\f00\\BE1"

SetVariable ET1,fSize=16

SetVariable ET1,limits={0,inf,1},value= root:Debye_and_Einstein_models:ET1

SetVariable nE1,pos={141.00,5.00},size={125.00,26.00},bodyWidth=97,title="\\Z16\\f02n\\f00\\BE1"

SetVariable nE1,fSize=16

SetVariable nE1,limits={0,inf,0.1},value= root:Debye_and_Einstein_models:nE1

SetVariable ET2,pos={8.00,32.00},size={128.00,26.00},bodyWidth=98,title="\\Z16\\f02T\\f00\\BE2"

SetVariable ET2,fSize=16

SetVariable ET2,limits={0,inf,1},value= root:Debye_and_Einstein_models:ET2

SetVariable nE2,pos={141.00,32.00},size={125.00,26.00},bodyWidth=97,title="\\Z16\\f02n\\f00\\BE2"

SetVariable nE2,fSize=16

SetVariable nE2,limits={0,inf,0.1},value= root:Debye_and_Einstein_models:nE2

SetVariable ET3,pos={8.00,59.00},size={128.00,26.00},bodyWidth=98,title="\\Z16\\f02T\\f00\\BE3"

SetVariable ET3,fSize=16

SetVariable ET3,limits={0,inf,1},value= root:Debye_and_Einstein_models:ET3

SetVariable nE3,pos={141.00,59.00},size={125.00,26.00},bodyWidth=97,title="\\Z16\\f02n\\f00\\BE3"

SetVariable nE3,fSize=16

SetVariable nE3,limits={0,inf,0.1},value= root:Debye_and_Einstein_models:nE3

SetVariable DT1,pos={7.00,86.00},size={129.00,26.00},bodyWidth=98,title="\\Z16\\f02θ\\f00\\BD1"

SetVariable DT1,fSize=16,value= root:Debye_and_Einstein_models:DT1

SetVariable nD1,pos={139.00,86.00},size={127.00,26.00},bodyWidth=97,title="\\Z16\\f02n\\f00\\BD1"

SetVariable nD1,fSize=16

SetVariable nD1,limits={0,inf,0.1},value= root:Debye_and_Einstein_models:nD1

SetVariable DT2,pos={7.00,113.00},size={129.00,26.00},bodyWidth=98,title="\\Z16\\f02θ\\f00\\BD2"

SetVariable DT2,fSize=16,value= root:Debye_and_Einstein_models:DT2

SetVariable nD2,pos={139.00,113.00},size={127.00,26.00},bodyWidth=97,title="\\Z16\\f02n\\f00\\BD2"

SetVariable nD2,fSize=16

SetVariable nD2,limits={0,inf,0.1},value= root:Debye_and_Einstein_models:nD2

Button Continu,pos={86.00,143.00},size={98.00,20.00},proc=set_parameter_D_and_E_model,title="Continue"

Button Continu,fSize=16

Button All_plot,pos={32.00,192.00},size={98.00,20.00},proc=all_plot,title="All"

Button All_plot,fSize=16

Button CvsT,pos={148.00,192.00},size={98.00,20.00},proc=Plot_CvsT,title="C vs T"

Button CvsT,fSize=16

Button CT_Temp2,pos={32.00,219.00},size={98.00,20.00},proc=Plot_CTvsT2,title="C/T ve T2"

Button CT_Temp2,fSize=16

Button Clat_T3,pos={148.00,219.00},size={98.00,20.00},proc=Plot_ClatT2vsT,title="Clat/T3 vs T"

Button Clat_T3,fSize=16

end

 

Function  set_parameter_D_and_E_model(ctrlName)

String ctrlName

String sTemp_K="root:Debye_and_Einstein_models:Temp_K"

string ssq_Temp_K2="root:Debye_and_Einstein_models:sq_Temp_K2"

string scu_Temp_K3="root:Debye_and_Einstein_models:cu_Temp_K3"

string sthetaD_Temp="root:Debye_and_Einstein_models:thetaD_Temp"

String sSH_E1="root:Debye_and_Einstein_models:SH_E1"

String sSH_E2="root:Debye_and_Einstein_models:SH_E2"

String sSH_E3="root:Debye_and_Einstein_models:SH_E3"

String sSH_D1="root:Debye_and_Einstein_models:SH_D1"

String sSH_D2="root:Debye_and_Einstein_models:SH_D2"

String sSH_total="root:Debye_and_Einstein_models:SH_total"

String sSH_E1_Temp="root:Debye_and_Einstein_models:SH_E1_Temp"

String sSH_E2_Temp="root:Debye_and_Einstein_models:SH_E2_Temp"

String sSH_E3_Temp="root:Debye_and_Einstein_models:SH_E3_Temp"

String sSH_D1_Temp="root:Debye_and_Einstein_models:SH_D1_Temp"

String sSH_D2_Temp="root:Debye_and_Einstein_models:SH_D2_Temp"

String sSH_total_TempK="root:Debye_and_Einstein_models:SH_total_TempK"

String sSH_E1_Temp3="root:Debye_and_Einstein_models:SH_E1_Temp3"

String sSH_E2_Temp3="root:Debye_and_Einstein_models:SH_E2_Temp3"

String sSH_E3_Temp3="root:Debye_and_Einstein_models:SH_E3_Temp3"

String sSH_D1_Temp3="root:Debye_and_Einstein_models:SH_D1_Temp3"

String sSH_D2_Temp3="root:Debye_and_Einstein_models:SH_D2_Temp3"

String sSH_total_Temp3="root:Debye_and_Einstein_models:SH_total_Temp3"

NVAR vET1=root:Debye_and_Einstein_models:ET1

NVAR vET2=root:Debye_and_Einstein_models:ET2

NVAR vET3=root:Debye_and_Einstein_models:ET3

NVAR vDT1=root:Debye_and_Einstein_models:DT1

NVAR vDT2=root:Debye_and_Einstein_models:DT2

NVAR vnE1=root:Debye_and_Einstein_models:nE1

NVAR vnE2=root:Debye_and_Einstein_models:nE2

NVAR vnE3=root:Debye_and_Einstein_models:nE3

NVAR vnD1=root:Debye_and_Einstein_models:nD1

NVAR vnD2=root:Debye_and_Einstein_models:nD2

NVAR vgas_const=root:Debye_and_Einstein_models:gas_const

Variable gas_const=vgas_const

Variable ET1=vET1

Variable ET2=vET2

Variable ET3=vET3

Variable DT1=vDT1

Variable DT2=vDT2

Variable nE1=vnE1

Variable nE2=vnE2

Variable nE3=vnE3

Variable nD1=vnD1

Variable nD2=vnD2

Calculate_Specific_Heat(sTemp_K,sthetaD_Temp,scu_Temp_K3,sSH_E1,sSH_E2,sSH_E3,sSH_D1,sSH_D2,sSH_total,sSH_E1_Temp3,sSH_E2_Temp3,sSH_E3_Temp3,sSH_D1_Temp3,sSH_D2_Temp3,sSH_total_Temp3,ET1,ET2,ET3,DT1,DT2,nE1,nE2,nE3,nD1,nD2,gas_const,ssq_Temp_K2,sSH_E1_Temp,sSH_E2_Temp,sSH_E3_Temp,sSH_D1_Temp,sSH_D2_Temp,sSH_total_TempK)

End

 

//Calculate specific heat

Function Calculate_Specific_Heat(sTemp_K,sthetaD_Temp,scu_Temp_K3,sSH_E1,sSH_E2,sSH_E3,sSH_D1,sSH_D2,sSH_total,sSH_E1_Temp3,sSH_E2_Temp3,sSH_E3_Temp3,sSH_D1_Temp3,sSH_D2_Temp3,sSH_total_Temp3,ET1,ET2,ET3,DT1,DT2,nE1,nE2,nE3,nD1,nD2,gas_const,ssq_Temp_K2,sSH_E1_Temp,sSH_E2_Temp,sSH_E3_Temp,sSH_D1_Temp,sSH_D2_Temp,sSH_total_TempK)

Variable gas_const

Variable ET1

Variable ET2

Variable ET3

Variable DT1

Variable DT2

Variable nE1

Variable nE2

Variable nE3

Variable nD1

Variable nD2

String sTemp_K

String sthetaD_Temp

String ssq_Temp_K2

String scu_Temp_K3

String sSH_E1

String sSH_E2

String sSH_E3

String sSH_D1

String sSH_D2

String sSH_total

String sSH_E1_Temp

String sSH_E2_Temp

String sSH_E3_Temp

String sSH_D1_Temp

String sSH_D2_Temp

String sSH_total_TempK

String sSH_E1_Temp3

String sSH_E2_Temp3

String sSH_E3_Temp3

String sSH_D1_Temp3

String sSH_D2_Temp3

String sSH_total_Temp3

Wave/Z wTemp_K=$sTemp_K

Wave/Z wsq_Temp_K2=$ssq_Temp_K2

Wave/Z wcu_Temp_K3=$scu_Temp_K3

Wave/Z wthetaD_Temp=$sthetaD_Temp

Wave/Z wSH_E1=$sSH_E1

Wave/Z wSH_E2=$sSH_E2

Wave/Z wSH_E3=$sSH_E3

Wave/Z wSH_D1=$sSH_D1

Wave/Z wSH_D2=$sSH_D2

Wave/Z wSH_total=$sSH_total

Wave/Z wSH_E1_Temp=$sSH_E1_Temp

Wave/Z wSH_E2_Temp=$sSH_E2_Temp

Wave/Z wSH_E3_Temp=$sSH_E3_Temp

Wave/Z wSH_D1_Temp=$sSH_D1_Temp

Wave/Z wSH_D2_Temp=$sSH_D2_Temp

Wave/Z wSH_total_TempK=$sSH_total_TempK

Wave/Z wSH_E1_Temp3=$sSH_E1_Temp3

Wave/Z wSH_E2_Temp3=$sSH_E2_Temp3

Wave/Z wSH_E3_Temp3=$sSH_E3_Temp3

Wave/Z wSH_D1_Temp3=$sSH_D1_Temp3

Wave/Z wSH_D2_Temp3=$sSH_D2_Temp3

Wave/Z wSH_total_Temp3=$sSH_total_Temp3

 

if(ET1==0)

wSH_E1=0

else

wSH_E1=3*nE1*gas_const*(ET1/wTemp_K)^2*exp(ET1/wTemp_K)*(exp(ET1/wTemp_K)-1)^(-2)

wSH_E1=NumType(wSH_E1[p])== 2 ? 0:wSH_E1

endif

 

if(ET2==0)

wSH_E2=0

else

wSH_E2=3*nE2*gas_const*(ET2/wTemp_K)^2*exp(ET2/wTemp_K)*(exp(ET2/wTemp_K)-1)^(-2)

wSH_E2=NumType(wSH_E2[p])== 2 ? 0:wSH_E2

endif

 

if(ET3==0)

wSH_E3=0

else

wSH_E3=3*nE3*gas_const*(ET3/wTemp_K)^2*exp(ET3/wTemp_K)*(exp(ET3/wTemp_K)-1)^(-2)

wSH_E3[]=NumType(wSH_E3[p])== 2 ? 0:wSH_E3

endif

 

wSH_E1_Temp=wSH_E1/wTemp_K

wSH_E2_Temp=wSH_E2/wTemp_K

wSH_E3_Temp=wSH_E3/wTemp_K

wSH_E1_Temp3=wSH_E1/wcu_Temp_K3

wSH_E2_Temp3=wSH_E2/wcu_Temp_K3

wSH_E3_Temp3=wSH_E3/wcu_Temp_K3

 

variable i

Variable DT1_TempK,DT2_TempK

 

if(DT1==0)

wSH_D1=0

else

for(i=1;i<=numpnts(wTemp_K);i++)

DT1_TempK=DT1/wTemp_K[i-1]

if(DT1_TempK>50)

wSH_D1[i-1]=9*nD1*gas_const*(wTemp_K[i-1]/DT1)^3*25.97575760906469

else

wSH_D1[i-1]=9*nD1*gas_const*(wTemp_K[i-1]/DT1)^3*wthetaD_Temp(DT1_TempK)

endif

endfor

endif

 

if(DT2==0)

wSH_D2=0

else

for(i=1;i<=numpnts(wTemp_K);i++)

DT2_TempK=DT2/wTemp_K[i-1]

if(DT2_TempK>50)

wSH_D2[i-1]=9*nD2*gas_const*(wTemp_K[i-1]/DT2)^3*25.97575760906469

else

wSH_D2[i-1]=9*nD2*gas_const*(wTemp_K[i-1]/DT2)^3*wthetaD_Temp(DT2_TempK)

endif

endfor

endif

 

wSH_D1_Temp=wSH_D1/wTemp_K

wSH_D2_Temp=wSH_D2/wTemp_K

wSH_D1_Temp3=wSH_D1/wcu_Temp_K3

wSH_D2_Temp3=wSH_D2/wcu_Temp_K3

wSH_total=wSH_E1+wSH_E2+wSH_E3+wSH_D1+wSH_D2

wSH_total_TempK=wSH_total/wTemp_K

wSH_total_Temp3=wSH_total/wcu_Temp_K3

End

 

 

 

Function all_plot(ctrlName)

String ctrlName

PauseUpdate; Silent 1 // building window...

Display /W=(347,65,667,338) root:Debye_and_Einstein_models:SH_total vs root:Debye_and_Einstein_models:Temp_K as "SH_vs_Temp"

AppendToGraph root:Debye_and_Einstein_models:SH_D1 vs root:Debye_and_Einstein_models:Temp_K

AppendToGraph root:Debye_and_Einstein_models:SH_D2 vs root:Debye_and_Einstein_models:Temp_K

AppendToGraph root:Debye_and_Einstein_models:SH_E1 vs root:Debye_and_Einstein_models:Temp_K

AppendToGraph root:Debye_and_Einstein_models:SH_E2 vs root:Debye_and_Einstein_models:Temp_K

AppendToGraph root:Debye_and_Einstein_models:SH_E3 vs root:Debye_and_Einstein_models:Temp_K

ModifyGraph marker=8

ModifyGraph rgb(SH_total)=(0,0,0),rgb(SH_D2)=(65535,43690,0),rgb(SH_E1)=(16385,49025,65535)

ModifyGraph rgb(SH_E2)=(1,16019,65535),rgb(SH_E3)=(29524,1,58982)

ModifyGraph msize=3

ModifyGraph mrkThick=1

ModifyGraph opaque=1

ModifyGraph tick=2

ModifyGraph mirror=1

ModifyGraph font="Helvetica"

ModifyGraph fSize=16

ModifyGraph lblMargin(left)=18,lblMargin(bottom)=10

ModifyGraph standoff=0

ModifyGraph notation=1

Label left "\\f02C\\f00 (J/mol K)"

Label bottom "\\f02T\\f00 (K)"

Legend/C/N=text0/J/F=0/B=1/A=MC/X=-35.02/Y=28.50 "\\s(SH_total) Total\r\\s(SH_D1) D1\r\\s(SH_D2) D2\r\\s(SH_E1) E1\r\\s(SH_E2) E2\r\\s(SH_E3) E3"

 

PauseUpdate; Silent 1 // building window...

Display /W=(668,65,988,338) root:Debye_and_Einstein_models:SH_total_TempK vs root:Debye_and_Einstein_models:sq_Temp_K2 as "SH_Temp_vs_Temp"

AppendToGraph root:Debye_and_Einstein_models:SH_D1_Temp vs root:Debye_and_Einstein_models:sq_Temp_K2

AppendToGraph root:Debye_and_Einstein_models:SH_D2_Temp vs root:Debye_and_Einstein_models:sq_Temp_K2

AppendToGraph root:Debye_and_Einstein_models:SH_E1_Temp vs root:Debye_and_Einstein_models:sq_Temp_K2

AppendToGraph root:Debye_and_Einstein_models:SH_E2_Temp vs root:Debye_and_Einstein_models:sq_Temp_K2

AppendToGraph root:Debye_and_Einstein_models:SH_E3_Temp vs root:Debye_and_Einstein_models:sq_Temp_K2

ModifyGraph marker=8

ModifyGraph rgb(SH_total_TempK)=(0,0,0),rgb(SH_D2_Temp)=(65535,43690,0),rgb(SH_E1_Temp)=(16385,49025,65535)

ModifyGraph rgb(SH_E2_Temp)=(1,16019,65535),rgb(SH_E3_Temp)=(29524,1,58982)

ModifyGraph msize=3

ModifyGraph mrkThick=1

ModifyGraph opaque=1

ModifyGraph tick=2

ModifyGraph mirror=1

ModifyGraph font="Helvetica"

ModifyGraph fSize=16

ModifyGraph lblMargin(left)=18,lblMargin(bottom)=10

ModifyGraph standoff=0

ModifyGraph notation=1

Label left "\\f02C\\f00/\\f02T\\f00 (J/mol K\\S2\\M)"

Label bottom "\\f02T\\f00\\S2\\M (K\\S2\\M)"

Legend/C/N=text0/J/F=0/B=1/A=MC/X=23.22/Y=26.37 "\\s(SH_total_TempK) Total\r\\s(SH_D1_Temp) D1\r\\s(SH_D2_Temp) D2\r\\s(SH_E1_Temp) E1\r\\s(SH_E2_Temp) E2"

AppendText "\\s(SH_E3_Temp) E3"

 

PauseUpdate; Silent 1 // building window...

Display /W=(989,65,1309,338) root:Debye_and_Einstein_models:SH_total_Temp3 vs root:Debye_and_Einstein_models:Temp_K as "Clat_T3_ve_Temp"

AppendToGraph root:Debye_and_Einstein_models:SH_D1_Temp3 vs root:Debye_and_Einstein_models:Temp_K

AppendToGraph root:Debye_and_Einstein_models:SH_D2_Temp3 vs root:Debye_and_Einstein_models:Temp_K

AppendToGraph root:Debye_and_Einstein_models:SH_E1_Temp3 vs root:Debye_and_Einstein_models:Temp_K

AppendToGraph root:Debye_and_Einstein_models:SH_E2_Temp3 vs root:Debye_and_Einstein_models:Temp_K

AppendToGraph root:Debye_and_Einstein_models:SH_E3_Temp3 vs root:Debye_and_Einstein_models:Temp_K

ModifyGraph marker=8

ModifyGraph rgb(SH_total_Temp3)=(0,0,0),rgb(SH_D2_Temp3)=(65535,43690,0),rgb(SH_E1_Temp3)=(16385,49025,65535)

ModifyGraph rgb(SH_E2_Temp3)=(1,16019,65535),rgb(SH_E3_Temp3)=(29524,1,58982)

ModifyGraph msize=3

ModifyGraph mrkThick=1

ModifyGraph opaque=1

ModifyGraph muloffset(SH_total_Temp3)={0,1000},muloffset(SH_D1_Temp3)={0,1000},muloffset(SH_D2_Temp3)={0,1000}

ModifyGraph muloffset(SH_E1_Temp3)={0,1000},muloffset(SH_E2_Temp3)={0,1000},muloffset(SH_E3_Temp3)={0,1000}

ModifyGraph log(bottom)=1

ModifyGraph tick=2

ModifyGraph mirror=1

ModifyGraph font="Helvetica"

ModifyGraph fSize=16

ModifyGraph lblMargin(left)=9,lblMargin(bottom)=10

ModifyGraph standoff=0

ModifyGraph notation=1

Label left "\\f02C\\f00\\Blat\\M/\\f02T\\f00\\S3\\M (mJ/mol K\\S4\\M)"

Label bottom "\\f02T\\f00 (K)"

Legend/C/N=text0/J/F=0/B=1/A=MC/X=27.52/Y=27.05 "\\s(SH_total_Temp3) Total\r\\s(SH_D1_Temp3) D1\r\\s(SH_D2_Temp3) D2\r\\s(SH_E1_Temp3) E1\r\\s(SH_E2_Temp3) E2"

AppendText "\\s(SH_E3_Temp3) E3"

end

 

Function Plot_CvsT(ctrlName)

String ctrlName

PauseUpdate; Silent 1 // building window...

Display /W=(347,65,667,338) root:Debye_and_Einstein_models:SH_total vs root:Debye_and_Einstein_models:Temp_K as "SH_vs_Temp"

AppendToGraph root:Debye_and_Einstein_models:SH_D1 vs root:Debye_and_Einstein_models:Temp_K

AppendToGraph root:Debye_and_Einstein_models:SH_D2 vs root:Debye_and_Einstein_models:Temp_K

AppendToGraph root:Debye_and_Einstein_models:SH_E1 vs root:Debye_and_Einstein_models:Temp_K

AppendToGraph root:Debye_and_Einstein_models:SH_E2 vs root:Debye_and_Einstein_models:Temp_K

AppendToGraph root:Debye_and_Einstein_models:SH_E3 vs root:Debye_and_Einstein_models:Temp_K

ModifyGraph marker=8

ModifyGraph rgb(SH_total)=(0,0,0),rgb(SH_D2)=(65535,43690,0),rgb(SH_E1)=(16385,49025,65535)

ModifyGraph rgb(SH_E2)=(1,16019,65535),rgb(SH_E3)=(29524,1,58982)

ModifyGraph msize=3

ModifyGraph mrkThick=1

ModifyGraph opaque=1

ModifyGraph tick=2

ModifyGraph mirror=1

ModifyGraph font="Helvetica"

ModifyGraph fSize=16

ModifyGraph lblMargin(left)=18,lblMargin(bottom)=10

ModifyGraph standoff=0

ModifyGraph notation=1

Label left "\\f02C\\f00 (J/mol K)"

Label bottom "\\f02T\\f00 (K)"

Legend/C/N=text0/J/F=0/B=1/A=MC/X=-35.02/Y=28.50 "\\s(SH_total) Total\r\\s(SH_D1) D1\r\\s(SH_D2) D2\r\\s(SH_E1) E1\r\\s(SH_E2) E2\r\\s(SH_E3) E3"

end

 

Function Plot_CTvsT2(ctrlName)

String ctrlName

PauseUpdate; Silent 1 // building window...

Display /W=(668,65,988,338) root:Debye_and_Einstein_models:SH_total_TempK vs root:Debye_and_Einstein_models:sq_Temp_K2 as "SH_Temp_vs_Temp"

AppendToGraph root:Debye_and_Einstein_models:SH_D1_Temp vs root:Debye_and_Einstein_models:sq_Temp_K2

AppendToGraph root:Debye_and_Einstein_models:SH_D2_Temp vs root:Debye_and_Einstein_models:sq_Temp_K2

AppendToGraph root:Debye_and_Einstein_models:SH_E1_Temp vs root:Debye_and_Einstein_models:sq_Temp_K2

AppendToGraph root:Debye_and_Einstein_models:SH_E2_Temp vs root:Debye_and_Einstein_models:sq_Temp_K2

AppendToGraph root:Debye_and_Einstein_models:SH_E3_Temp vs root:Debye_and_Einstein_models:sq_Temp_K2

ModifyGraph marker=8

ModifyGraph rgb(SH_total_TempK)=(0,0,0),rgb(SH_D2_Temp)=(65535,43690,0),rgb(SH_E1_Temp)=(16385,49025,65535)

ModifyGraph rgb(SH_E2_Temp)=(1,16019,65535),rgb(SH_E3_Temp)=(29524,1,58982)

ModifyGraph msize=3

ModifyGraph mrkThick=1

ModifyGraph opaque=1

ModifyGraph tick=2

ModifyGraph mirror=1

ModifyGraph font="Helvetica"

ModifyGraph fSize=16

ModifyGraph lblMargin(left)=18,lblMargin(bottom)=10

ModifyGraph standoff=0

ModifyGraph notation=1

Label left "\\f02C\\f00/\\f02T\\f00 (J/mol K\\S2\\M)"

Label bottom "\\f02T\\f00\\S2\\M (K\\S2\\M)"

Legend/C/N=text0/J/F=0/B=1/A=MC/X=23.22/Y=26.37 "\\s(SH_total_TempK) Total\r\\s(SH_D1_Temp) D1\r\\s(SH_D2_Temp) D2\r\\s(SH_E1_Temp) E1\r\\s(SH_E2_Temp) E2"

AppendText "\\s(SH_E3_Temp) E3"

end

 

Function Plot_ClatT2vsT(ctrlName)

String ctrlName

PauseUpdate; Silent 1 // building window...

Display /W=(989,65,1309,338) root:Debye_and_Einstein_models:SH_total_Temp3 vs root:Debye_and_Einstein_models:Temp_K as "Clat_T3_ve_Temp"

AppendToGraph root:Debye_and_Einstein_models:SH_D1_Temp3 vs root:Debye_and_Einstein_models:Temp_K

AppendToGraph root:Debye_and_Einstein_models:SH_D2_Temp3 vs root:Debye_and_Einstein_models:Temp_K

AppendToGraph root:Debye_and_Einstein_models:SH_E1_Temp3 vs root:Debye_and_Einstein_models:Temp_K

AppendToGraph root:Debye_and_Einstein_models:SH_E2_Temp3 vs root:Debye_and_Einstein_models:Temp_K

AppendToGraph root:Debye_and_Einstein_models:SH_E3_Temp3 vs root:Debye_and_Einstein_models:Temp_K

ModifyGraph marker=8

ModifyGraph rgb(SH_total_Temp3)=(0,0,0),rgb(SH_D2_Temp3)=(65535,43690,0),rgb(SH_E1_Temp3)=(16385,49025,65535)

ModifyGraph rgb(SH_E2_Temp3)=(1,16019,65535),rgb(SH_E3_Temp3)=(29524,1,58982)

ModifyGraph msize=3

ModifyGraph mrkThick=1

ModifyGraph opaque=1

ModifyGraph muloffset(SH_total_Temp3)={0,1000},muloffset(SH_D1_Temp3)={0,1000},muloffset(SH_D2_Temp3)={0,1000}

ModifyGraph muloffset(SH_E1_Temp3)={0,1000},muloffset(SH_E2_Temp3)={0,1000},muloffset(SH_E3_Temp3)={0,1000}

ModifyGraph log(bottom)=1

ModifyGraph tick=2

ModifyGraph mirror=1

ModifyGraph font="Helvetica"

ModifyGraph fSize=16

ModifyGraph lblMargin(left)=9,lblMargin(bottom)=10

ModifyGraph standoff=0

ModifyGraph notation=1

Label left "\\f02C\\f00\\Blat\\M/\\f02T\\f00\\S3\\M (mJ/mol K\\S4\\M)"

Label bottom "\\f02T\\f00 (K)"

Legend/C/N=text0/J/F=0/B=1/A=MC/X=27.52/Y=27.05 "\\s(SH_total_Temp3) Total\r\\s(SH_D1_Temp3) D1\r\\s(SH_D2_Temp3) D2\r\\s(SH_E1_Temp3) E1\r\\s(SH_E2_Temp3) E2"

AppendText "\\s(SH_E3_Temp3) E3"

end

Igorマクロの墓場†┌┘墓└┐† ~比熱解析~

過去に忘れ去られた比熱解析マクロ

学生時代は超伝導体の比熱測定をよくやっていた。

そんな時に比熱解析をするIgorマクロを作ったが、そのマクロはいまではとんと使わなくなった。
使わなくなった理由は、一番最初に作った初期のバージョンよりも、さらに改良を重ねたので初期のマクロが不便で不要になったから...😎
でも、使われなくなったマクロ、悲しいんでるよね😭😢(クスン...)

そんな過去に葬り去ったマクロを、この記事では供養をする✝️ 🙏

マクロはページの末尾に示したので、コピーして、Procedureにペーストして、コンパイルすればOK😉

コンパイルして、Macros>Specific Heat analyzeを選択すると、図1下のパネルが現れる。Igorのバージョンの違い、OSの違いによってレイアウトが崩れるらしいけど、そのときは心を研ぎ澄まして🥺

図1 比熱解析マクロのパネル

パネルの
1番上:試料の質量
上から2番目:モル質量
を入力。
とりあえずこの記事では19.96 mgのCoZr3(分子量:332.61 g/mol)を解析してみるので、これらの数値を入力する。

TemperatureとHeat Capacityのタブから、温度と熱容量のwaveを選択する。
Heat Capacityの単位はμJ/Kにする❗️❗️❗️❗️❗️
PPMSで熱容量を測定した場合は、デフォルトの単位はμJ/Kなので、そのままでモーマンタイ。

図2 セッティング

図2みたいな感じになればいい。
あとはContinueを押すだけ😉

図3 比熱の温度依存性のグラフ

図3に示すように、比熱Cの温度Tの依存性、C/TのT2依存性がプロットされる✨
4 K付近の比熱のピークが超伝導転移!跳んでるね🫢

もう一つ、超伝導転移温度を抑制させた5 Tの熱容量のデータもあるので、同じようにすると、図4のようなグラフが現れる。

図4 5TにおけるCoZr3の比熱

C/TがT2に対して比例してるね🌟

あとは、比熱の解析でよくやる、C/T=γ+βT2でフィッティング。
aの値をγに、bの値をβに入れる。

図5 C/T vs T2を直線フィッティング

これらの値を入れたら、Constitutional atomsにユニットセルあたりの原子数を入力する。CoZr3は4なので、4を入力してContinueを押すと、デバイ温度θDが計算される(図6)。

図6 デバイ温度の計算

COZr3のデバイ温度は277 Kだって。先行研究は272 Kだからほとんど同じだね❗️*1

最後にマクロの一番下の欄は超伝導の解析でよくやつやつ。TSC超伝導転移温度を入力して、TemperatureとSpecific Heatのwaveを選択する(Heat Capacityではない❗️)。
Continueを押すと、図7のようにグラフが現れる。

図7 比熱のいろんなグラフ

左上が電子比熱の温度依存性、右上が電子比熱をγTで割った物理量の温度依存性、左下が電子比熱係数をγTSCで割った物理量のTの逆数の依存性(これはもっと低温までやらないと意味がない)。よくやるやつだね🤗

これで超伝導の比熱解析はバッチグー👍

3つ目の欄は格子比熱の解析。一時やってたのでマクロに残してる。図8に示す縦軸(C-γT)/T3、横軸Tのグラフが作られる。光学フォノンの解析に使ったりするよ🐈

図8 βの温度依存性

これで超伝導の基本的な解析はバッチリだね😉

葬り去られた理由

使ってみてわかったが、いろんな磁場で比熱を測定していると、いちいち一つずつ解析する必要があり作業がとても面倒だった😇

いまでは、PPMSで測定した比熱の生データが含まれるPCのローカルフォルダを選択すれば、勝手にいろいろやってくれるマクロを組んだので、そっちをよく使っている。ただ、生データの成形がちょっと必要なので、それはそれで面倒だけどね。

マクロ~これ以外の方法が思い浮かばなくて~

#pragma rtGlobals=3 // Use modern global access method and strict wave access.

#include <WaveSelectorWidget>

#include <PopupWaveSelector>

 

Menu "Macros"

"Specific Heat analyze", initial_set_up_specific_heat()

end

 

Function initial_set_up_specific_heat()

if (!DataFolderExists("root:Packages:SH_Analyze"))

String SaveDF = GetDataFolder(2)

SetDataFolder root:

NewDataFolder/O/S Packages

NewDataFolder/O/S SH_analyze

Variable/G V_Smple_Mass=10

Variable/G V_Moler_Mass=100

Variable/G V_beta=0.01

Variable/G V_Atoms=5

Variable/G V_Gamma=0.01

Variable/G V_mol=0

Variable/G V_Debye_Temp=0

Variable/G TSC=0

SetDataFolder saveDF

endif

Panel_SH()

end

 

Function  Panel_SH()

PauseUpdate; Silent 1 // building window...

NewPanel /K=1 /W=(882,80,1135,584) as "Specific Heat"

RenameWindow $S_name, SH_panel

SetDrawLayer UserBack

SetDrawEnv fsize= 16

DrawText 6,21,"Sample Data"

DrawText 212,38,"mg"

DrawText 212,55,"g/mol"

DrawText 212,74,"mol"

SetDrawEnv fsize= 16

DrawText 6,97,"Select Waves"

DrawText 32,113,"Temperature"

DrawText 24,136,"Heat Capacity"

DrawLine 6,210,249,210

SetDrawEnv fsize= 16

DrawText 7,231,"Calculate Debye Temperature"

DrawText 193,184,"J/mol K\\S4"

DrawText 195,266,"K"

DrawLine 6,297,249,297

SetDrawEnv fsize= 16

DrawText 7,324,"\\f02C\\f00\\Blat\\M / \\f02T\\f00\\S3\\M plot"

DrawText 32,342,"Temperature"

DrawText 28,364,"Specific Heat"

DrawText 193,204,"J/mol K\\S2"

SetDrawEnv fsize= 16

DrawText 8,415,"Superconducting Properties"

DrawLine 7,393,250,393

DrawText 148,431,"K"

DrawText 32,451,"Temperature"

DrawText 28,473,"Specific Heat"

SetVariable samp_mass,pos={45.00,23.00},size={167.00,16.00},bodyWidth=90,title="Sample Mass"

SetVariable samp_mass,font="Helvetica",fSize=12

SetVariable samp_mass,limits={0,inf,0},value= root:Packages:SH_analyze:V_Smple_Mass

SetVariable moler_mass,pos={56.00,41.00},size={156.00,16.00},bodyWidth=90,title="Moler Mass"

SetVariable moler_mass,font="Helvetica",fSize=12

SetVariable moler_mass,limits={0,inf,0},value= root:Packages:SH_analyze:V_Moler_Mass

ValDisplay amount_of_substance,pos={7.00,60.00},size={204.00,15.00},bodyWidth=87,title="Amount of substance"

ValDisplay amount_of_substance,font="Helvetica",fSize=12

ValDisplay amount_of_substance,limits={0,0,0},barmisc={0,1000}

ValDisplay amount_of_substance,value= #"root:Packages:SH_analyze:V_mol"

Button Temp_Wave,pos={105.00,96.00},size={130.00,20.00},title="(no selection)"

Button Temp_Wave,font="Helvetica",fSize=12

MakeButtonIntoWSPopupButton("SH_panel", "Temp_Wave","PopupWaveSelectorNotify")

Button Heat_Cap_Wave,pos={105.00,119.00},size={130.00,20.00},title="(no selection)"

Button Heat_Cap_Wave,font="Helvetica",fSize=12

MakeButtonIntoWSPopupButton("SH_panel", "Heat_Cap_Wave","PopupWaveSelectorNotify")

Button Contine1,pos={92.00,144.00},size={70.00,20.00},proc=set_para_SH,title="Continue"

Button Contine1,font="Helvetica",fSize=12

SetVariable Gamma1,pos={15.00,167.00},size={178.00,16.00},bodyWidth=90,title="Electronic SH \\f02γ\\f00"

SetVariable Gamma1,font="Helvetica",fSize=12

SetVariable Gamma1,limits={0,inf,0},value= root:Packages:SH_analyze:V_Gamma

SetVariable be_ta1,pos={32.00,190.00},size={161.00,16.00},bodyWidth=90,title="Lattice SH \\f02β\\f00"

SetVariable be_ta1,font="Helvetica",fSize=12

SetVariable be_ta1,limits={0,inf,0},value= root:Packages:SH_analyze:V_beta

SetVariable atoms,pos={37.00,230.00},size={156.00,16.00},bodyWidth=46,title="constitutional atoms"

SetVariable atoms,font="Helvetica",fSize=12

SetVariable atoms,limits={0,inf,0},value= root:Packages:SH_analyze:V_Atoms

ValDisplay Debye_Temp,pos={16.00,250.00},size={176.00,15.00},bodyWidth=88,title="Debye Temp \\f02θ\\f00\\BD"

ValDisplay Debye_Temp,font="Helvetica",fSize=12,limits={0,0,0},barmisc={0,1000}

ValDisplay Debye_Temp,value= #"root:Packages:SH_analyze:V_Debye_Temp"

Button Contine2,pos={92.00,274.00},size={70.00,20.00},proc=set_para_Calc_Debye_Temp,title="Continue"

Button Contine2,font="Helvetica",fSize=12

Button Temp_Wave1,pos={105.00,325.00},size={130.00,20.00},title="(no selection)"

Button Temp_Wave1,font="Helvetica",fSize=12

MakeButtonIntoWSPopupButton("SH_panel", "Temp_Wave1","PopupWaveSelectorNotify")

Button SH_Wave,pos={105.00,348.00},size={130.00,20.00},proc=PopupWaveSelectorButtonProc,title="(no selection)"

Button SH_Wave,font="Helvetica",fSize=12

MakeButtonIntoWSPopupButton("SH_panel", "SH_Wave","PopupWaveSelectorNotify")

Button Contine3,pos={92.00,371.00},size={70.00,20.00},proc=set_Clat,title="Continue"

Button Contine3,font="Helvetica",fSize=12

SetVariable TSC_K,pos={77.00,415.00},size={70.00,17.00},bodyWidth=46,title="\\f02T\\f00\\BSC"

SetVariable TSC_K,font="Helvetica",fSize=12

SetVariable TSC_K,limits={0,inf,0},value= root:Packages:SH_analyze:TSC

Button Temp_Wave2,pos={105.00,434.00},size={130.00,20.00},title="(no selection)"

Button Temp_Wave2,font="Helvetica",fSize=12

MakeButtonIntoWSPopupButton("SH_panel", "Temp_Wave2","PopupWaveSelectorNotify")

Button SH_Wave1,pos={105.00,457.00},size={130.00,20.00},title="(no selection)"

Button SH_Wave1,font="Helvetica",fSize=12

MakeButtonIntoWSPopupButton("SH_panel", "SH_Wave1","PopupWaveSelectorNotify")

Button Contine4,pos={92.00,478.00},size={70.00,20.00},proc=set_para_SC,title="Continue"

Button Contine4,font="Helvetica",fSize=12

SetWindow kwTopWin,hook(PopupWS_HostWindowHook)=PopupWSHostHook

EndMacro

 

Function set_para_SH(ctrName1)

String ctrName1

String Temp1 = PopupWS_GetSelectionFullPath("SH_panel", "Temp_Wave")

String Heat_cap = PopupWS_GetSelectionFullPath("SH_panel", "Heat_Cap_Wave")

NVAR V_Smple_Mass=root:Packages:SH_analyze:V_Smple_Mass

NVAR V_Moler_Mass=root:Packages:SH_analyze:V_Moler_Mass

SH_Analyze(Temp1,Heat_cap,V_Smple_Mass,V_Moler_Mass)

End

 

Function SH_Analyze(Temp1,Heat_cap,V_Smple_Mass,V_Moler_Mass)

String Temp1

String Heat_cap

Variable V_Smple_Mass

Variable V_Moler_Mass

Variable V_mol

V_mol=V_Smple_Mass*1e-3/V_Moler_Mass

Wave/Z wTemp1 = $Temp1

Wave/Z wHeat_cap = $Heat_cap

Variable/G root:Packages:SH_analyze:V_mol = V_mol

Make/N=(numpnts(wTemp1))/D/O SH_J_molK,Temp_sq_K2,SH_Temp_J_molK2

SH_J_molK=wHeat_cap*1e-6/V_mol

Temp_sq_K2=wTemp1^2

SH_Temp_J_molK2=SH_J_molK/wTemp1

 

Display /W=(439,65,763,335) SH_J_molK vs wTemp1

ModifyGraph mode=3

ModifyGraph marker=8

ModifyGraph msize=3

ModifyGraph mrkThick=1

ModifyGraph opaque=1

ModifyGraph tick=2

ModifyGraph mirror=1

ModifyGraph fSize=16

ModifyGraph lblMargin(left)=16,lblMargin(bottom)=13

ModifyGraph standoff=0

ModifyGraph notation=1

Label left "\\f02C\\f00 (J/mol K)"

Label bottom "\\f02T\\f00 (K)"

 

Display /W=(783,65,1107,335) SH_Temp_J_molK2 vs Temp_sq_K2

ModifyGraph mode=3

ModifyGraph marker=8

ModifyGraph msize=3

ModifyGraph mrkThick=1

ModifyGraph opaque=1

ModifyGraph tick=2

ModifyGraph mirror=1

ModifyGraph fSize=16

ModifyGraph lblMargin(left)=16,lblMargin(bottom)=13

ModifyGraph standoff=0

ModifyGraph notation=1

Label left "\\f02C\\f00/\\f02T\\f00 (J/mol K\\S2\\M)"

Label bottom "\\f02T\\S 2\\M\\f00 (K\\S2\\M)"

End

 

Function set_para_Calc_Debye_Temp(ctrName2)

String ctrName2

NVAR V_beta=root:Packages:SH_analyze:V_beta

NVAR V_atoms=root:Packages:SH_analyze:V_Atoms

Calc_Debye_Temp(V_beta,V_atoms)

End

 

Function Calc_Debye_Temp(V_beta,V_atoms)

Variable V_beta

Variable V_atoms

Variable/G root:Packages:SH_analyze:V_Debye_Temp=(12*pi^4*V_atoms*8.31446262/5/V_beta)^(1/3)

End

 

Function set_Clat(ctrName3)

String ctrName3

String Temp2 = PopupWS_GetSelectionFullPath("SH_panel", "Temp_Wave1")

String SH = PopupWS_GetSelectionFullPath("SH_panel", "SH_Wave")

NVAR V_Gamma=root:Packages:SH_analyze:V_Gamma

Clat_calc(V_Gamma,Temp2,SH)

End

 

Function Clat_calc(V_Gamma,Temp2,SH)

Variable V_Gamma

String Temp2

String SH

Wave/Z wTemp2 = $Temp2

Wave/Z wSH = $SH

Make/N=(numpnts(wTemp2))/D/O Temp_cu_K3, Clat_J_molK, Clat_Temp3_J_molK4

Temp_cu_K3=wTemp2^3

Clat_J_molK=wSH-V_Gamma*wTemp2

Clat_Temp3_J_molK4=Clat_J_molK/Temp_cu_K3

 

Display /W=(1128,65,1452,335) Clat_Temp3_J_molK4 vs wTemp2

ModifyGraph mode=3

ModifyGraph marker=8

ModifyGraph msize=3

ModifyGraph mrkThick=1

ModifyGraph opaque=1

ModifyGraph tick=2

ModifyGraph mirror=1

ModifyGraph fSize=16

ModifyGraph lblMargin(left)=17,lblMargin(bottom)=13

ModifyGraph standoff=0

ModifyGraph notation=1

Label left "(\\f02C\\f00-\\f02γT\\f00)/\\f02T\\f00\\S3\\M \\U (J/mol K\\S4\\M)"

Label bottom "\\f02T\\f00\\M (K)"

End

 

Function set_para_SC(ctrName4)

String ctrName4

String Temp_Wave2 = PopupWS_GetSelectionFullPath("SH_panel", "Temp_Wave2")

String SH_Wave1 = PopupWS_GetSelectionFullPath("SH_panel", "SH_Wave1")

NVAR TSC=root:Packages:SH_analyze:TSC

NVAR V_Gamma=root:Packages:SH_analyze:V_Gamma

NVAR V_beta=root:Packages:SH_analyze:V_beta

Calc_SC(Temp_Wave2,SH_Wave1,TSC,V_Gamma,V_beta)

End

 

Function Calc_SC(Temp_Wave2,SH_Wave1,TSC,V_Gamma,V_beta)

String Temp_Wave2

String SH_Wave1

Variable TSC

Variable V_Gamma

Variable V_beta

Wave/Z wTemp = $Temp_Wave2

Wave/Z wSH = $SH_Wave1

Make/N=(numpnts(wTemp))/D/O Cele_J_molK,Cele_Gammma,Cele_Gammma_Temp,Cele_Gammma_TSC,'TempK/TSC','TSC/TempK'

Cele_J_molK=wSH-V_beta*wTemp^3

Cele_Gammma=Cele_J_molK/V_Gamma

Cele_Gammma_Temp=Cele_J_molK/V_Gamma/wTemp

Cele_Gammma_TSC=Cele_J_molK/V_Gamma/TSC

'TempK/TSC'=wTemp/TSC

'TSC/TempK'=TSC/wTemp

 

Display /W=(440,370,760,643) Cele_J_molK vs wTemp

ModifyGraph mode=3

ModifyGraph marker=8

ModifyGraph msize=3

ModifyGraph mrkThick=1

ModifyGraph opaque=1

ModifyGraph tick=2

ModifyGraph mirror=1

ModifyGraph fSize=16

ModifyGraph lblMargin(left)=14,lblMargin(bottom)=12

ModifyGraph standoff=0

ModifyGraph notation=1

Label left "\\f02C\\f00\\Bel\\M \\U (J/mol K)"

Label bottom "\\f02T\\f00 (K)"

 

Display /W=(777,372,1097,645) Cele_Gammma_Temp vs 'TempK/TSC'

ModifyGraph mode=3

ModifyGraph marker=8

ModifyGraph msize=3

ModifyGraph mrkThick=1

ModifyGraph opaque=1

ModifyGraph tick=2

ModifyGraph mirror=1

ModifyGraph fSize=16

ModifyGraph lblMargin(left)=22,lblMargin(bottom)=9

ModifyGraph standoff=0

ModifyGraph notation=1

Label left "\\f02C\\f00\\Bel\\M /\\f02γT\\f00"

Label bottom "\\f02T\\f00/\\f02T\\f00\\BSC\\M"

SetAxis left 0,3

SetAxis bottom 0,2

 

Display /W=(1123,371,1443,644) Cele_Gammma_TSC vs 'TSC/TempK'

ModifyGraph mode=3

ModifyGraph marker=8

ModifyGraph msize=3

ModifyGraph mrkThick=1

ModifyGraph opaque=1

ModifyGraph tick=2

ModifyGraph mirror=1

ModifyGraph fSize=16

ModifyGraph lblMargin(left)=22,lblMargin(bottom)=12

ModifyGraph standoff=0

ModifyGraph notation=1

Label left "\\f02C\\f00\\Bel\\M /\\f02γT\\f00\\BSC"

Label bottom "\\f02T\\f00\\BSC\\M /\\f02T"

SetAxis left 0,2

SetAxis bottom 1,5

End

*1:R. Kuentzler, A. Amamou, R. Clad, and P. Turek: Journal of Physics F: Metal Physics 17, 459 (1987)

たくさんのトレースがあるグラフの色の付け方

トレースがたくさんある!

実験をしていると、たくさんのトレースを一つのグラフにまとめることがある。

例えば、いろんな温度で取得したラマンスペクトル、いろんな磁場で測定した磁化率。

図1はかなり極端な例として、1つのグラフに100個のトレースを表示している。
このグラフのトレースの色を設定するとき、手で設定はしないだろう。

図1 100個のトレースが表示されたグラフ

なにか手っ取り早い設定方法がほしい🥺

たくさんのトレースの色を一括で設定するマクロ

同じ悩みを持っている人はいて、マクロを公開してくれている方がいらっしゃる😊

さっそく下のサイトからzipファイルをダウンロードして使ってみよう!

www.wavemetrics.com

zipファイルの中のipfファイルを開くだけでOK

ソースをコンパイルすると、Graphのメニューバーの中に"Color Trace by Index"というタブが現れるので、それをクリックすると図2のようになる。

図2

とりあえず"Do It"をクリックした結果が図3

図3 トレースに自動で色を割り振った結果

カラフルになった😲

右上にあるポップアップメニューを色々とイジるとグラフの色をたくさん変えらるんだね😉

図4 トレースの色をいっぱいイジってみた

CT waveにチェックを入れると、Color Table Waveから色を設定することもできる(図5)

図5 Color Table Waveによる色の設定

このプログラムをじっくり読んだわけではないので、それぞれのトレースのインデックスがどのように設定されるかはわからないが、イニシャルの状態ではインデックス番号が勝手に割り振られる。
このインデックス番号は設定ウィンドウから直接設定することも可能だが、Waveから割り振ることもできる。
とりあえず温度5Kから500Kまでなんかのデータをとったテイで、インデックスのwaveを作ってみた(図6上段)。作ったIndex waveは設定ウィンドウのFrom Waveから選択できる。選択するとインデックスが再割り当てされている。

図6 インデックスの再割り当て

 

最後にMaxとMinからカラースケールを設定すればいい感じのグラフができる。

図7 いい感じのグラフ

これでトレースがたくさんあっても色の設定で手間取らないね😊

イメージプロットのカラーの設定

Image Plotの基本的な修正方法

図1は適当につくったf(x,y)のイメージプロットである。

図1 expにノイズを加算したイメージプロット

このイメージを自分の好みにあったカラーに変更しよう。

はじめは一番基本的なImage Plotの修正方法。

図2左のように、メニューバーのImage>Modify Image Appearance(図2左)を選択する。

すると図2右のModify Image Appearanceウィンドウが現れる。この設定画面のLUTでカラーが、Color Table Rangeでカラーのスケール(というのかわからないが)を設定できる。

メニューバーからModify Image Appearanceを開かなくても、Image Plot内で右クリックすることでも、同様のウィンドウを開ける。

図2 Modify Image Appearance

Color Table Control

Modify Image Appearanceを触ってみたらわかるが、設定を変更してもすぐにImage Plotに反映されるわけではなく、いちいちDo Itを押してイメージを確認しなければならない。めっちゃ面倒😣

その時に便利なのがColor Table Control。

メニューバーのGraph>Package>Color Table Control(図3)をクリックしたら開く。

図3 Color Table Control

Color Table Controlを使ってみた様子が図4。ヌルヌル動くね😉

図4 Color Table Controlの操作画面

LUTの設定

ここからが本番である。

IgorにはLUTがあらかじめ60個用意されている。しかしこれらの中に、使用したいLUTがない場合どうすればよいのだろうか?


図5 プリセットされてるLUT

Color Table Wave

実は図5に示されているLUT以外にも、さらにほかのLUTがIgorには用意されている。

それを選択するためには、メニューバーのGraph>Package>Color Table WavesをひらけばOK。Color Table Wavesをクリックすると図6の右側のようなウィンドウが開く。

図6 Color Table Waves

ここから好きなLUTをクリックすると、Data Browserのroot>Packages>ColorTablesのフォルダが作られ、ColorTablesにはLUTのColor Table Waveが作成される。

図7Color Waveの場所とWaveの中身

Color Table Waveには、RGBに対応する色の値が割り振られている。

実際の使い方は図8の通りである。

図8 Color Waveを使ったLUTの設定

はじめにModify Image Appearanceを開き、左下のチェックボックスからColor Table Waveを選択する。DetailsのColor Table Waveのポップアップから、図7にあるColor Table Waveを選択すればよい。

数えてはいないが、Color Table Wavesにはかなりの数のLUTが用意されているので、おそらくこれで十分だろうと思われる。

Color Table Waveを自分で作る

さて、この記事で一番のメインはここである。Color Table Wavesにも好みのLUTがなければどうするのか?
答えはColor Table Waveを作るのである。望みのLUTになるように、図7の右のColor WaveのRGBを自分で設定すればよい。自分でColor Waveを作る方法はいくつか用意されているが、ここでは一番手っ取り早い方法をメモしておく。

はじめに、自分がいま欲しいとおもっているLUTのグラデーションを作成する。
私はよくCSS Gradientをよく使うのだが、グラデーションが作れればなんでもよい。

cssgradient.io

図9に超適当に作ったグラデーションを示す。


図9 グラデーションの作成

次に、グラデーション部分だけを切り取ったpng画像を用意する。図10みたいに適当にスクショとればOK。

図10 グラデーション部分だけを切り取ったpng画像

メニューバーのData>Load Imageをクリックする(図11左上)。図11の右上に示すウィンドウが開くので、先ほど用意したグラデーションのpng画像を選択する。

このときDisplay Imageにチェックを入れておく!

すると図11の下のImage Plotが開く。

図11 グラデーションのpng画像の開き方

つぎに下のサイトの一番下にあるプログラムコードをIgorに導入する。
というよりも、ここでのColor Waveの作り方はこのサイトに基づいている。

www.wavemetrics.com

最後に図12に示すように、Image>Color Table from Graphをクリックする。確認ウィンドウが現れるのでOKをクリックする。すると、図11下のpng画像のColor Table Waveが作成され(図12右上)、Color TableのImage Plotが現れる(図12右下)。

図12 png画像からColor Waveの作成

これで準備は終了で、あとは図8のやり方に従って、図12でつくったColor Waveを選択すればいい。

せっかくなので、今回つくったColor Waveを図1に適用した結果を図13に示す。ちゃんと反映されてる!

図13 お手製のColor Waveを適用したImage Plot

これで好きなLUTをImage Plotに適用できるようになったね😉