TEdb project on Starrydata

日本熱電学会の熱電特性データベースWGが主催する、学術論文からの熱電特性データベース構築プロジェクトのブログです。

Materials ProjectのAPIの使い方(pymatgenを使う方法)

pymatgenのMPResterクラスを使って、Materials Projectからデータを取得してみます。
MPResterクラスのソースコードを見ると、以下のようなメソッドがあります。
使い方も、ソースコードに書いてあります。

def get_data(self, chemsys_formula_id, data_type="vasp", prop=""):
def get_task_data(self, chemsys_formula_id, prop=""):
def get_entries(self, chemsys_formula_id_criteria, compatible_only=True,
                    inc_structure=None, property_data=None):
def get_entries_in_chemsys(self, elements, compatible_only=True,
                               inc_structure=None, property_data=None):
def query(self, criteria, properties, mp_decode=True):
def get_reaction(self, reactants, products):
def parse_criteria(criteria_string):

queryメソッド

一番使いやすそうなメソッドです。他のメソッドとの速度比較はしていません。
criteriaは、物質名の指定方法です。
mp-1234, Fe2O3, \*2O3, Li-Fe-O, \*-Fe-Oなどの書き方ができるそうです。

入力

from pymatgen.matproj.rest import MPRester
# API keyを使い、aという名のMPResterオブジェクトを作成
a = MPRester("6hel2p**********")
# As-Se-Cu系のデータを入手
data = a.query(criteria='As-Se-Cu',properties=["icsd_id", "unit_cell_formula", "pretty_formula", "e_above_hull", "formation_energy_per_atom"])
# 取得した全データ
print("################# All data #################")
print(data)
# 1データの取り出し
print("####### data No = 0, pretty_formula ########") 
print(data[0]['pretty_formula'])

print("###### data No = 0, unit_cell_formula ######") 
print(data[0]['unit_cell_formula'])

print("##### data No = 0, unit_cell_formula(Se) #####") 
print(data[0]['unit_cell_formula']['Se'])

出力

################# All data #################
[{'icsd_id': None, 'pretty_formula': 'CuAsSe2', 'e_above_hull': 0.1309248899479165, 'formation_energy_per_atom': -0.004192994296874808, 'unit_cell_formula': {'As': 2.0, 'Cu': 2.0, 'Se': 4.0}}, {'icsd_id': None, 'pretty_formula': 'Cu3AsSe4', 'e_above_hull': 0, 'formation_energy_per_atom': -0.15044875617187436, 'unit_cell_formula': {'As': 1.0, 'Cu': 3.0, 'Se': 4.0}}, {'icsd_id': 15235, 'pretty_formula': 'Cu7As6Se13', 'e_above_hull': 0.07721697639823644, 'formation_energy_per_atom': -0.060259503527643796, 'unit_cell_formula': {'As': 6.0, 'Cu': 7.0, 'Se': 13.0}}, {'icsd_id': 15548, 'pretty_formula': 'CuAsSe', 'e_above_hull': 0, 'formation_energy_per_atom': -0.12834720258680538, 'unit_cell_formula': {'As': 24.0, 'Cu': 24.0, 'Se': 24.0}}, {'icsd_id': 42884, 'pretty_formula': 'CuAsSe2', 'e_above_hull': 0.10646151369791657, 'formation_energy_per_atom': -0.028656370546874754, 'unit_cell_formula': {'As': 1.0, 'Cu': 1.0, 'Se': 2.0}}]
####### data No = 0, pretty_formula ########
CuAsSe2
###### data No = 0, unit_cell_formula ######
{'As': 2.0, 'Cu': 2.0, 'Se': 4.0}
##### data No = 0, unit_cell_formula(Se) #####
4.0

上記のAll dataの出力を整形すると以下のようになりました。
JSON Formatterには、文字列はダブルクオートでくくるようにと怒られました)

[  
  {  
    'icsd_id':None,
    'pretty_formula':'CuAsSe2',
    'e_above_hull':0.1309248899479165,
    'formation_energy_per_atom':-0.004192994296874808,
    'unit_cell_formula':{  
      'As':2.0,
      'Cu':2.0,
      'Se':4.0
    }
  },
  {  
    'icsd_id':None,
    'pretty_formula':'Cu3AsSe4',
    'e_above_hull':0,
    'formation_energy_per_atom':-0.15044875617187436,
    'unit_cell_formula':{  
      'As':1.0,
      'Cu':3.0,
      'Se':4.0
    }
  },
  {  
    'icsd_id':15235,
    'pretty_formula':'Cu7As6Se13',
    'e_above_hull':0.07721697639823644,
    'formation_energy_per_atom':-0.060259503527643796,
    'unit_cell_formula':{  
      'As':6.0,
      'Cu':7.0,
      'Se':13.0
    }
  },
  {  
    'icsd_id':15548,
    'pretty_formula':'CuAsSe',
    'e_above_hull':0,
    'formation_energy_per_atom':-0.12834720258680538,
    'unit_cell_formula':{  
      'As':24.0,
      'Cu':24.0,
      'Se':24.0
    }
  },
  {  
    'icsd_id':42884,
    'pretty_formula':'CuAsSe2',
    'e_above_hull':0.10646151369791657,
    'formation_energy_per_atom':-0.028656370546874754,
    'unit_cell_formula':{  
      'As':1.0,
      'Cu':1.0,
      'Se':2.0
    }
  }
]

get_entries_in_chemsysメソッド

1~3元系の全ての相の計算条件のデータが手に入ります。
出力はJSONではないようです。長すぎるので以下は1化合物分の抜粋です。

data = a.get_entries_in_chemsys(['As', 'Cu', 'Se'])
ComputedEntry Cu1 As1 Se2
Energy = -15.8505
Correction = 0.0000
Parameters:
run_type = GGA
is_hubbard = False
pseudo_potential = {'labels': ['Cu_pv', 'As', 'Se'], 'pot_type': 'paw', 'functional': 'pbe'}
hubbards = {}
potcar_symbols = ['pbe Cu_pv', 'pbe As', 'pbe Se']
Data: