[关闭]
@zhouhuibin 2021-03-17T08:08:27.000000Z 字数 4457 阅读 813

处理MPMS多数据文件的Python代码

Python


主程序

import matplotlib.pyplot as plt
import numpy as np
import os
from find_data import load_magdata
from scipy.interpolate import griddata
from pymodelfit.builtins import LinearModel

#physical constant
e = 1.6e-19 #unit is C
k = 1.38e-23

# sample information
mass = 1.37e-3 #unit is mg
m1 = 55.845
n1 = 3
m2 = 118.71
n2 = 2
molmass = m1*n1+m2*n2
mol = mass/molmass
field = 10000 #unit Oe

datafile = r'D:\Zhouhuibin\Lab\data\Fe3Sn2\S1\20181028_Fe3Sn2_MPMS\raw data\MT.dat'

# data normalization
data = np.array(load_magdata(datafile,'[Data]'))
T = data[:,1]
moment = data[:,3] # unit is emu
molmoment = moment/mol #unit is emu/mol
normmoment = molmoment/5585 # unit is \miu_B/f.u.

# resulting data output
folder = 'Norm DATA output'
subdir = r'D:\Zhouhuibin\Lab\data\Fe3Sn2\S1\20181028_Fe3Sn2_MPMS'#set os.path into the subdir before run the code
maindir = r'D:\Zhouhuibin\Lab\data\Fe3Sn2\S1\20181028_Fe3Sn2_MPMS\%s'%folder
savepath = r'D:\Zhouhuibin\Lab\data\Fe3Sn2\S1\20181028_Fe3Sn2_MPMS\figs'

#if os.path.isdir(folder): 
#    shutil.rmtree(folder) #判断目录是否存在,如果存在则删除目录及目录内部的文件.由于存在权限问题,该路径只能是本地路径
#os.mkdir(folder) # 创建目录,refer to http://www.xuebuyuan.com/2025595.html?mobile=1
os.chdir(maindir) #用于改变当前工作目录到指定的路径

momentfile='%s\MT.txt'%maindir
openmoment=open(momentfile,'w')
openmoment.write('Temperature,Moment,Molmoment,Normmoment\n K,emu,emu/mol,mu_B/formula unit\n')

openmoment=open(momentfile,'a')
for i in range(len(T)):
    openmoment.write(str(T[i])+','+str(moment[i])+','+str(molmoment[i])+','+str(normmoment[i])+'\n')# 参见python格式化输出说明文档:http://blog.csdn.net/wchoclate/article/details/42297173
openmoment.close()

# MH Series
path = r'D:\Zhouhuibin\Lab\data\Fe3Sn2\S1\20181028_Fe3Sn2_MPMS\raw data\MH series'
T_list = (['2K','10K','50K','100K','150K','200K','250K','300K'])
number = (['001','002','003','004','005','006','007','008','009','010','011','012','013'])
T_array = ([2,10,50,100,150,200,250,300])
namelist=os.listdir(path)
MH0 = []
for i in range(len(namelist)):
    print namelist[i]
    data = np.array(load_magdata(os.path.join(path,namelist[i]),'[Data]'))
    Magnetic_Field = data[:,2]
    moment = data[:,3] # unit is emu
    molmoment = moment/mol #unit is emu/mol
    massmoment = moment/mass
    normmoment = molmoment/5585 # unit is \miu_B/f.u.
    Mag_select = []
    MH_select = []

    Mag_grid = np.linspace(-60000,60000,1001)
    MH_interpolate = griddata(Magnetic_Field, moment,Mag_grid, method='linear')
    Normmoment = MH_interpolate/mol/5585

    for j in range(len(Mag_grid)):
        if Mag_grid[j] >= 20000: #select the range of Magnetic Field.
                Mag_select.append(float(Mag_grid[j]))
                MH_select.append(float(Normmoment[j]))
    Mag_select = np.array(Mag_select)
    MH_select = np.array(MH_select)

    a = LinearModel.fitBasic(Mag_select,MH_select) #原始数据中包含空字符串或None值时会导致无法拟合出结果,所以研究范围要变成(-8.9T,8.9T)
    MH_fitting = a[0][0]*Mag_grid+a[0][1]
    mh0 = a[0][1]
    print mh0
    MH0.append(mh0)

    plt.clf()
    plt.cla()
    plt.plot(Mag_grid,Normmoment,'b-',Mag_grid,MH_fitting,'r-')
    plt.savefig(os.path.join(savepath,number[i]+'_'+T_list[i]+'_HR_fitting.png'))

    # resulting data output
    MHfile = os.path.join(maindir,T_list[i]+'_MH.txt')
    #MHfile=str(T_list[i])+'%s\_MH.txt'%maindir
    openMH=open(MHfile,'w')
    openMH.write('Magnetic Field,Moment,Molmoment,massmoment,Normmoment\n Oe,emu,emu/mol,emu/g,mu_B/formula unit\n'+(str(T_list[i])+',')*5+'\n')

    openMH=open(MHfile,'a')
    for j in range(len(Magnetic_Field)):
        openMH.write(str(Magnetic_Field[j])+','+str(moment[j])+','+str(molmoment[j])+','+str(massmoment[j])+','+str(normmoment[j])+'\n')# 参见python格式化输出说明文档:http://blog.csdn.net/wchoclate/article/details/42297173
    openMH.close()

plt.cla()
plt.clf()
plt.plot(T_array,MH0,'ro')
plt.savefig(os.path.join(savepath,'MH0 vs T.png'))
plt.show()

# HR0 vs MR0
filename = os.path.join(maindir,'MH0 vs T.txt')
openfile=open(filename,'w')
openfile.write('T,MH0'+'\n'+'K,miu_B/f.u.'+'\n'+('MH0vsT,')*2+'\n')

openfile=open(filename,'a')
for k in range(len(T_array)):
    openfile.write(str(T_array[k])+','+str(MH0[k])+'\n')# 参见python格式化输出说明文档:http://blog.csdn.net/wchoclate/article/details/42297173
openfile.close()  

子程序

def load_magdata(infilename, key_word):
# infilename should be a string enclosed by ''
    ifile = open (infilename,'r')  # open datafile
    lines= ifile.readlines()  #read data
    line_no = 0  # define line number
    found_string = False
    for line in lines:  # search for starting mark of data
        if key_word in line:
        #if 'Tableau' in line:
            print ('found in line '+ str(line_no))
            found_string = True
            break
        line_no += 1
    if not found_string:
        print ('string not found');
    if found_string:
        numbers = []  # define empty data matrix
        for line in lines[line_no+2:]:  #  iterate and check line from second row after starting mark
            line = line.replace(',',' ') # replace ',' with 'tab' key
            words = line.split()
            numbers_row = []
            for i1 in range(len(words)):
                number = float(words[i1])
                numbers_row.append(number)
            numbers.append(numbers_row)
        return numbers 
    ifile.close()
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注