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_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_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_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
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ファイルをダウンロードして使ってみよう!
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をよく使うのだが、グラデーションが作れればなんでもよい。
図9に超適当に作ったグラデーションを示す。

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

図10 グラデーション部分だけを切り取ったpng画像
メニューバーのData>Load Imageをクリックする(図11左上)。図11の右上に示すウィンドウが開くので、先ほど用意したグラデーションのpng画像を選択する。
このときDisplay Imageにチェックを入れておく!
すると図11の下のImage Plotが開く。

図11 グラデーションのpng画像の開き方
つぎに下のサイトの一番下にあるプログラムコードをIgorに導入する。
というよりも、ここでのColor Waveの作り方はこのサイトに基づいている。
最後に図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に適用できるようになったね😉