Query the perovskite ion database in NOMAD
This notebook demonstrates how query NOMAD for all, as well as for specific perovskite ions. The notebook also shows how to validate the ions against the JSON Schema
Basic imports¶
In [1]:
Copied!
import json
import requests
base_url = 'http://nomad-lab.eu/prod/v1/api/v1'
import json
import requests
base_url = 'http://nomad-lab.eu/prod/v1/api/v1'
Query for an A site ion with abbreviation "MA"¶
In [2]:
Copied!
response = requests.post(
f'{base_url}/entries/archive/query',
json={
'owner': 'visible',
'query': {
'data.abbreviation#perovskite_solar_cell_database.composition.PerovskiteAIon:any': [
'MA'
]
},
'pagination': {'page_size': 1},
},
)
response_json = response.json()
ion_data = response_json['data'][0]['archive']['data']
print(json.dumps(ion_data, indent=2))
response = requests.post(
f'{base_url}/entries/archive/query',
json={
'owner': 'visible',
'query': {
'data.abbreviation#perovskite_solar_cell_database.composition.PerovskiteAIon:any': [
'MA'
]
},
'pagination': {'page_size': 1},
},
)
response_json = response.json()
ion_data = response_json['data'][0]['archive']['data']
print(json.dumps(ion_data, indent=2))
{
"m_def": "perovskite_solar_cell_database.composition.PerovskiteAIon",
"name": "MA perovskite ion",
"datetime": "2024-12-18T14:46:39.211148+00:00",
"lab_id": "perovskite_ion_MA",
"common_name": "Methylammonium",
"molecular_formula": "CH6N+",
"smiles": "C[NH3+]",
"iupac_name": "methylazanium",
"cas_number": "17000-00-9",
"abbreviation": "MA",
"source_compound_molecular_formula": "CH5N",
"source_compound_smiles": "CN",
"source_compound_iupac_name": "methanamine",
"source_compound_cas_number": "74-89-5",
"elemental_composition": [
{
"element": "C",
"atomic_fraction": 0.125,
"mass_fraction": 0.3745730552651735
},
{
"element": "H",
"atomic_fraction": 0.75,
"mass_fraction": 0.1886054095051807
},
{
"element": "N",
"atomic_fraction": 0.125,
"mass_fraction": 0.4368215352296457
}
],
"pure_substance": {
"name": "Methylammonium",
"iupac_name": "methylazanium",
"molecular_formula": "CH6N",
"molecular_mass": 32.050024196,
"molar_mass": 32.065,
"monoisotopic_mass": 32.050024196,
"inchi": "InChI=1S/CH5N/c1-2/h2H2,1H3/p+1",
"inchi_key": "BAVYZALUXZFZLV-UHFFFAOYSA-O",
"smile": "C[NH3+]",
"canonical_smile": "C[NH3+]",
"cas_number": "17000-00-9",
"pub_chem_cid": 644041,
"pub_chem_link": "https://pubchem.ncbi.nlm.nih.gov/compound/644041"
},
"source_compound": {
"name": "Methylamine",
"iupac_name": "methanamine",
"molecular_formula": "CH5N",
"molecular_mass": 31.042199164,
"molar_mass": 31.057,
"monoisotopic_mass": 31.042199164,
"inchi": "InChI=1S/CH5N/c1-2/h2H2,1H3",
"inchi_key": "BAVYZALUXZFZLV-UHFFFAOYSA-N",
"smile": "CN",
"canonical_smile": "CN",
"cas_number": "74-89-5",
"pub_chem_cid": 6329,
"pub_chem_link": "https://pubchem.ncbi.nlm.nih.gov/compound/6329"
}
}
Validate response against JSON Schema¶
In [3]:
Copied!
from jsonschema import ValidationError, validate
schema_id = (
'https://raw.githubusercontent.com/Jesperkemist/'
'Perovskite_composition/v1.0.0/ion_schema.json'
)
# Load the JSON schema from the URL
schema_response = requests.get(schema_id)
schema = schema_response.json()
# Validate ion_data against the schema
try:
validate(instance=ion_data, schema=schema)
print(f'ion_data is valid against the {schema_id} schema.')
except ValidationError as e:
print('Validation error:', e.message)
from jsonschema import ValidationError, validate
schema_id = (
'https://raw.githubusercontent.com/Jesperkemist/'
'Perovskite_composition/v1.0.0/ion_schema.json'
)
# Load the JSON schema from the URL
schema_response = requests.get(schema_id)
schema = schema_response.json()
# Validate ion_data against the schema
try:
validate(instance=ion_data, schema=schema)
print(f'ion_data is valid against the {schema_id} schema.')
except ValidationError as e:
print('Validation error:', e.message)
ion_data is valid against the https://raw.githubusercontent.com/Jesperkemist/Perovskite_composition/v1.0.0/ion_schema.json schema.
Query all ions in the database¶
In [4]:
Copied!
json_body = {
'owner': 'visible',
'query': {
'results.eln.sections:any': [
'PerovskiteAIon',
'PerovskiteBIon',
'PerovskiteXIon',
],
},
'pagination': {
'page_size': 10,
},
}
all_ion_data = {}
while len(all_ion_data) < 500:
response = requests.post(f'{base_url}/entries/archive/query', json=json_body)
response_json = response.json()
for entry in response_json['data']:
abbreviation = entry['archive']['data']['abbreviation']
if abbreviation in all_ion_data:
print(f'Duplicate entry found for abbreviation: {abbreviation}')
all_ion_data[abbreviation] = entry['archive']['data']
next_value = response_json['pagination'].get('next_page_after_value')
if not next_value:
break
json_body['pagination']['page_after_value'] = next_value
print(f'Retrieved {len(all_ion_data)} ion entries.')
json_body = {
'owner': 'visible',
'query': {
'results.eln.sections:any': [
'PerovskiteAIon',
'PerovskiteBIon',
'PerovskiteXIon',
],
},
'pagination': {
'page_size': 10,
},
}
all_ion_data = {}
while len(all_ion_data) < 500:
response = requests.post(f'{base_url}/entries/archive/query', json=json_body)
response_json = response.json()
for entry in response_json['data']:
abbreviation = entry['archive']['data']['abbreviation']
if abbreviation in all_ion_data:
print(f'Duplicate entry found for abbreviation: {abbreviation}')
all_ion_data[abbreviation] = entry['archive']['data']
next_value = response_json['pagination'].get('next_page_after_value')
if not next_value:
break
json_body['pagination']['page_after_value'] = next_value
print(f'Retrieved {len(all_ion_data)} ion entries.')
Retrieved 332 ion entries.
In [5]:
Copied!
print(json.dumps(all_ion_data['MA'], indent=2))
print(json.dumps(all_ion_data['MA'], indent=2))
{
"m_def": "perovskite_solar_cell_database.composition.PerovskiteAIon",
"name": "MA perovskite ion",
"datetime": "2024-12-18T14:46:39.211148+00:00",
"lab_id": "perovskite_ion_MA",
"common_name": "Methylammonium",
"molecular_formula": "CH6N+",
"smiles": "C[NH3+]",
"iupac_name": "methylazanium",
"cas_number": "17000-00-9",
"abbreviation": "MA",
"source_compound_molecular_formula": "CH5N",
"source_compound_smiles": "CN",
"source_compound_iupac_name": "methanamine",
"source_compound_cas_number": "74-89-5",
"elemental_composition": [
{
"element": "C",
"atomic_fraction": 0.125,
"mass_fraction": 0.3745730552651735
},
{
"element": "H",
"atomic_fraction": 0.75,
"mass_fraction": 0.1886054095051807
},
{
"element": "N",
"atomic_fraction": 0.125,
"mass_fraction": 0.4368215352296457
}
],
"pure_substance": {
"name": "Methylammonium",
"iupac_name": "methylazanium",
"molecular_formula": "CH6N",
"molecular_mass": 32.050024196,
"molar_mass": 32.065,
"monoisotopic_mass": 32.050024196,
"inchi": "InChI=1S/CH5N/c1-2/h2H2,1H3/p+1",
"inchi_key": "BAVYZALUXZFZLV-UHFFFAOYSA-O",
"smile": "C[NH3+]",
"canonical_smile": "C[NH3+]",
"cas_number": "17000-00-9",
"pub_chem_cid": 644041,
"pub_chem_link": "https://pubchem.ncbi.nlm.nih.gov/compound/644041"
},
"source_compound": {
"name": "Methylamine",
"iupac_name": "methanamine",
"molecular_formula": "CH5N",
"molecular_mass": 31.042199164,
"molar_mass": 31.057,
"monoisotopic_mass": 31.042199164,
"inchi": "InChI=1S/CH5N/c1-2/h2H2,1H3",
"inchi_key": "BAVYZALUXZFZLV-UHFFFAOYSA-N",
"smile": "CN",
"canonical_smile": "CN",
"cas_number": "74-89-5",
"pub_chem_cid": 6329,
"pub_chem_link": "https://pubchem.ncbi.nlm.nih.gov/compound/6329"
}
}