Query NOMAD for perovskite compositions
This notebook demonstrates how query NOMAD for perovskite compositions. 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 a lead perovskite with band gap less than 1.65 eV¶
In [2]:
Copied!
response = requests.post(
f'{base_url}/entries/archive/query',
json={
'owner': 'visible',
'query': {
'results.eln.sections:any': ['PerovskiteComposition'],
'results.material.elements:all': ['Pb'],
'results.properties.electronic.band_gap.value': {
'lte': 2.6435914460999996e-19
},
},
'pagination': {'page_size': 1},
},
)
response_json = response.json()
composition_data = response_json['data'][0]['archive']['data']
print(json.dumps(composition_data, indent=2))
response = requests.post(
f'{base_url}/entries/archive/query',
json={
'owner': 'visible',
'query': {
'results.eln.sections:any': ['PerovskiteComposition'],
'results.material.elements:all': ['Pb'],
'results.properties.electronic.band_gap.value': {
'lte': 2.6435914460999996e-19
},
},
'pagination': {'page_size': 1},
},
)
response_json = response.json()
composition_data = response_json['data'][0]['archive']['data']
print(json.dumps(composition_data, indent=2))
{
"m_def": "perovskite_solar_cell_database.composition.PerovskiteComposition",
"short_form": "MAPbI",
"long_form": "MAPbI3",
"composition_estimate": "Estimated from precursor solutions",
"sample_type": "Polycrystalline film",
"dimensionality": "3D",
"band_gap": 1.63,
"name": "MAPI",
"datetime": "2025-03-31T09:09:48.394259+00:00",
"ions_a_site": [
{
"m_def": "perovskite_solar_cell_database.composition.PerovskiteAIonComponent",
"system": "../uploads/ztDkTFJETdiMgrnRQSgsEA/archive/ZHsLIxapQ6idJZjA25Zohc8FRZzr#/data",
"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",
"coefficient": "1"
}
],
"ions_b_site": [
{
"m_def": "perovskite_solar_cell_database.composition.PerovskiteBIonComponent",
"system": "../uploads/ztDkTFJETdiMgrnRQSgsEA/archive/CIsbAqf80HCIft4qH3pjCdKuCOUr#/data",
"common_name": "Lead",
"molecular_formula": "Pb2+",
"smiles": "[Pb+2]",
"iupac_name": "lead(2+)",
"cas_number": "14280-50-3",
"abbreviation": "Pb",
"source_compound_molecular_formula": "Pb",
"source_compound_smiles": "[Pb]",
"source_compound_iupac_name": "Lead",
"source_compound_cas_number": "7439-92-1",
"coefficient": "1"
}
],
"ions_x_site": [
{
"m_def": "perovskite_solar_cell_database.composition.PerovskiteXIonComponent",
"system": "../uploads/ztDkTFJETdiMgrnRQSgsEA/archive/EtZIjsyxaPFuo4Hod84m-EcffFNe#/data",
"common_name": "Iodide",
"molecular_formula": "I-",
"smiles": "[I-]",
"iupac_name": "Iodide",
"cas_number": "20461-54-5",
"abbreviation": "I",
"source_compound_molecular_formula": "I2",
"source_compound_smiles": "II",
"source_compound_iupac_name": "molecular iodine",
"source_compound_cas_number": "7553-56-2",
"coefficient": "3"
}
],
"elemental_composition": [
{
"element": "Pb",
"atomic_fraction": 0.08333333333333333,
"mass_fraction": 0.3342051647117734
},
{
"element": "C",
"atomic_fraction": 0.08333333333333333,
"mass_fraction": 0.019372770134187728
},
{
"element": "N",
"atomic_fraction": 0.08333333333333333,
"mass_fraction": 0.0225922368753301
},
{
"element": "H",
"atomic_fraction": 0.5,
"mass_fraction": 0.009754597115431996
},
{
"element": "I",
"atomic_fraction": 0.25,
"mass_fraction": 0.6140752311632768
}
],
"components": [
{
"m_def": "perovskite_solar_cell_database.composition.PerovskiteAIonComponent",
"system": "../uploads/ztDkTFJETdiMgrnRQSgsEA/archive/ZHsLIxapQ6idJZjA25Zohc8FRZzr#/data",
"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",
"coefficient": "1"
},
{
"m_def": "perovskite_solar_cell_database.composition.PerovskiteBIonComponent",
"system": "../uploads/ztDkTFJETdiMgrnRQSgsEA/archive/CIsbAqf80HCIft4qH3pjCdKuCOUr#/data",
"common_name": "Lead",
"molecular_formula": "Pb2+",
"smiles": "[Pb+2]",
"iupac_name": "lead(2+)",
"cas_number": "14280-50-3",
"abbreviation": "Pb",
"source_compound_molecular_formula": "Pb",
"source_compound_smiles": "[Pb]",
"source_compound_iupac_name": "Lead",
"source_compound_cas_number": "7439-92-1",
"coefficient": "1"
},
{
"m_def": "perovskite_solar_cell_database.composition.PerovskiteXIonComponent",
"system": "../uploads/ztDkTFJETdiMgrnRQSgsEA/archive/EtZIjsyxaPFuo4Hod84m-EcffFNe#/data",
"common_name": "Iodide",
"molecular_formula": "I-",
"smiles": "[I-]",
"iupac_name": "Iodide",
"cas_number": "20461-54-5",
"abbreviation": "I",
"source_compound_molecular_formula": "I2",
"source_compound_smiles": "II",
"source_compound_iupac_name": "molecular iodine",
"source_compound_cas_number": "7553-56-2",
"coefficient": "3"
}
]
}
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/perovskite_composition_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=composition_data, schema=schema)
print(f'composition_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/perovskite_composition_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=composition_data, schema=schema)
print(f'composition_data is valid against the {schema_id} schema.')
except ValidationError as e:
print('Validation error:', e.message)
composition_data is valid against the https://raw.githubusercontent.com/Jesperkemist/Perovskite_composition/v1.0.0/perovskite_composition_schema.json schema.